openhpi-2.14.1/0000755000076400007640000000000011405006365010171 5ustar openhpi-2.14.1/Makefile.am0000644000076400007640000001520111302567132012224 0ustar # # Copyright (c) 2003, Intel Corporation # (C) Copyright IBM Corp 2003-2006 # All rights reserved. # # 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. # # Neither the name of Intel Corporation nor the names # of its contributors may be used to endorse or promote products # derived from this software without specific prior written permission. # # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS # "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT # LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS # FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT # OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, # SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED # TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, # OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY # OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING # NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS # SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. # #AUTOMAKE_OPTIONS = 1.8 TARFILE = $(PACKAGE_NAME)-$(VERSION).tar.gz DESTDIR = RPM = @RPM@ RPMFLAGS = -ba EXTRA_DIST = openhpi.spec.in \ openhpi.conf.example \ openhpiclient.conf.example \ README.daemon \ $(shell find $(srcdir)/include -name '*.h') AUTOMAKE_OPTIONS = foreign MAINTAINERCLEANFILES = Makefile.in aclocal.m4 configure config.guess config.sub \ depcomp install-sh ltmain.sh missing mkinstalldirs config.h.in \ stamp-h.in cscope.files cscope.out $(distdir).tar.gz compile MOSTLYCLEANFILES = tags SUBDIRS = utils scripts @SSLDIR@ src @SNMPDIR@ @MARSHALDIR@ plugins docs @ENABLED_DIRS@ hpi_shell DIST_SUBDIRS = utils scripts src snmp ssl marshal plugins docs openhpid clients cpp hpi_shell DISTCHECK_CONFIGURE_FLAGS = --with-initdir=prefix ALLSOURCES = \ $(shell find $(top_srcdir)/include -name .svn -o -name CVS -prune -o \ -name '*.[chS]' -print | grep -v '/t/') \ $(shell find $(top_srcdir)/src -name .svn -o -name CVS -prune -o \ -name '*.[chS]' -print | grep -v '/t/') \ $(shell find $(top_srcdir)/utils -name .svn -o -name CVS -prune -o \ -name '*.[chS]' -print | grep -v '/t/') \ $(shell find $(top_srcdir)/openhpid -name .svn -o -name CVS -prune -o \ -name '*.[chS]' -print -o '*.cpp' -print | grep -v '/t/') \ $(shell find $(top_srcdir)/plugins -name .svn -o -name CVS -prune -o \ -name '*.[chS]' -print -o '*.cpp' -print | grep -v '/t/') \ $(shell find $(top_srcdir)/snmp -name .svn -o -name CVS -prune -o \ -name '*.[chS]' -print | grep -v '/t/') \ $(shell find $(top_srcdir)/ssl -name .svn -o -name CVS -prune -o \ -name '*.[chS]' -print | grep -v '/t/') \ $(shell find $(top_srcdir)/marshal -name .svn -o -name CVS -prune -o \ -name '*.[chS]' -print | grep -v '/t/') \ $(shell find $(top_srcdir)/clients -name .svn -o -name CVS -prune -o \ -name '*.[chS]' -print | grep -v '/t/') \ $(shell find $(top_srcdir)/cpp -name .svn -o -name CVS -prune -o \ -name '*.[ch]pp' -print | grep -v '/t/') includedir=$(base_includedir)/openhpi # These are the only headers that users should have any access to include_HEADERS = $(top_srcdir)/include/SaHpi.h \ $(top_srcdir)/include/SaHpiAtca.h \ $(top_srcdir)/include/SaHpiBladeCenter.h \ $(top_srcdir)/include/oHpi.h \ $(top_srcdir)/utils/oh_utils.h \ $(top_srcdir)/utils/announcement_utils.h \ $(top_srcdir)/utils/rpt_utils.h \ $(top_srcdir)/utils/sahpi_enum_utils.h \ $(top_srcdir)/utils/sahpiatca_enum_utils.h \ $(top_srcdir)/utils/sahpi_event_encode.h \ $(top_srcdir)/utils/sahpi_event_utils.h \ $(top_srcdir)/utils/sahpi_struct_utils.h \ $(top_srcdir)/utils/sahpi_time_utils.h \ $(top_srcdir)/utils/uid_utils.h \ $(top_srcdir)/utils/epath_utils.h \ $(top_srcdir)/utils/el_utils.h docsdir=$(datadir)/doc/$(PACKAGE_NAME)-$(VERSION) docs_DATA = README README.daemon COPYING $(top_srcdir)/utils/sahpi_enum_utils.h: make -C $(top_builddir)/utils sahpi_enum_utils.h $(top_srcdir)/utils/sahpiatca_enum_utils.h: make -C $(top_builddir)/utils sahpiatca_enum_utils.h install-data-local: openhpi.pc openhpi.conf.example openhpiclient.conf.example $(mkinstalldirs) $(DESTDIR)$(libdir)/pkgconfig $(INSTALL_DATA) openhpi.pc $(DESTDIR)$(libdir)/pkgconfig $(mkinstalldirs) $(DESTDIR)$(VARPATH) chmod 777 $(DESTDIR)$(VARPATH) $(mkinstalldirs) $(DESTDIR)$(sysconfdir)/openhpi if test ! -e $(DESTDIR)$(sysconfdir)/openhpi/openhpi.conf; then \ $(INSTALL_DATA) $(top_srcdir)/openhpi.conf.example $(DESTDIR)$(sysconfdir)/openhpi/openhpi.conf; \ fi if test ! -e $(DESTDIR)$(sysconfdir)/openhpi/openhpiclient.conf; then \ $(INSTALL_DATA) $(top_srcdir)/openhpiclient.conf.example $(DESTDIR)$(sysconfdir)/openhpi/openhpiclient.conf; \ fi uninstall-local: rm -f $(DESTDIR)$(libdir)/pkgconfig/openhpi.pc if cmp $(top_srcdir)/openhpi.conf.example $(DESTDIR)$(sysconfdir)/openhpi/openhpi.conf; then \ rm -f $(DESTDIR)$(sysconfdir)/openhpi/openhpi.conf; \ fi if cmp $(top_srcdir)/openhpiclient.conf.example $(DESTDIR)$(sysconfdir)/openhpi/openhpiclient.conf; then \ rm -f $(DESTDIR)$(sysconfdir)/openhpi/openhpiclient.conf; \ fi rpm: dist rm -rf $(top_srcdir)/rpm mkdir -p $(top_srcdir)/rpm/RPMS mkdir $(top_srcdir)/rpm/SRPMS mkdir $(top_srcdir)/rpm/BUILD mkdir $(top_srcdir)/rpm/INSTALL $(RPM) $(RPMFLAGS) $(PACKAGE_NAME).spec cscope.files cscope -b .PHONY: FORCE openhpi-2.14.1/cpp/0000755000076400007640000000000011405006365010753 5ustar openhpi-2.14.1/cpp/Makefile.am0000644000076400007640000001472611302567022013017 0ustar # -*- linux-c -*- # # (C) Copyright IBM Corp. 2005 # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This # file and program are licensed under a BSD style license. See # the Copying file included with the OpenHPI distribution for # full licensing terms. # # Author(s): # W. David Ashley # SUBDIRS = t DIST_SUBDIRS = t MAINTAINERCLEANFILES = Makefile.in INCLUDES = @OPENHPI_INCLUDES@ includedir=$(base_includedir)/openhpi include_HEADERS = oSaHpiAlarm.hpp \ oSaHpiAnnouncement.hpp \ oSaHpiAnnunciatorRec.hpp \ oSaHpiCondition.hpp \ oSaHpiCtrlDefaultMode.hpp \ oSaHpiCtrlRec.hpp \ oSaHpiCtrlRecAnalog.hpp \ oSaHpiCtrlRecDigital.hpp \ oSaHpiCtrlRecDiscrete.hpp \ oSaHpiCtrlRecOem.hpp \ oSaHpiCtrlRecStream.hpp \ oSaHpiCtrlRecText.hpp \ oSaHpiCtrlState.hpp \ oSaHpiCtrlStateOem.hpp \ oSaHpiCtrlStateStream.hpp \ oSaHpiCtrlStateText.hpp \ oSaHpiDomainEvent.hpp \ oSaHpiDomainInfo.hpp \ oSaHpiDrtEntry.hpp \ oSaHpiEntity.hpp \ oSaHpiEntityPath.hpp \ oSaHpiEvent.hpp \ oSaHpiEventLogEntry.hpp \ oSaHpiEventLogInfo.hpp \ oSaHpiHotSwapEvent.hpp \ oSaHpiHpiSwEvent.hpp \ oSaHpiIdrAreaHeader.hpp \ oSaHpiIdrField.hpp \ oSaHpiIdrInfo.hpp \ oSaHpiInventoryRec.hpp \ oSaHpiName.hpp \ oSaHpiOemEvent.hpp \ oSaHpiRdr.hpp \ oSaHpiResourceEvent.hpp \ oSaHpiResourceInfo.hpp \ oSaHpiRptEntry.hpp \ oSaHpiSensorDataFormat.hpp \ oSaHpiSensorEnableChangeEvent.hpp \ oSaHpiSensorEvent.hpp \ oSaHpiSensorRange.hpp \ oSaHpiSensorReading.hpp \ oSaHpiSensorRec.hpp \ oSaHpiSensorThdDefn.hpp \ oSaHpiSensorThresholds.hpp \ oSaHpiTextBuffer.hpp \ oSaHpiTypesEnums.hpp \ oSaHpiUserEvent.hpp \ oSaHpiWatchdog.hpp \ oSaHpiWatchdogEvent.hpp \ oSaHpiWatchdogRec.hpp \ oSaHpi.hpp pkglib_LTLIBRARIES = libosahpi.la libosahpi_la_LIBADD = -luuid libosahpi_la_SOURCES = oSaHpiAlarm.cpp oSaHpiAlarm.hpp \ oSaHpiAnnouncement.cpp oSaHpiAnnouncement.hpp \ oSaHpiAnnunciatorRec.cpp oSaHpiAnnunciatorRec.hpp \ oSaHpiCondition.cpp oSaHpiCondition.hpp \ oSaHpiCtrlDefaultMode.cpp oSaHpiCtrlDefaultMode.hpp \ oSaHpiCtrlRec.cpp oSaHpiCtrlRec.hpp \ oSaHpiCtrlRecAnalog.cpp oSaHpiCtrlRecAnalog.hpp \ oSaHpiCtrlRecDigital.cpp oSaHpiCtrlRecDigital.hpp \ oSaHpiCtrlRecDiscrete.cpp oSaHpiCtrlRecDiscrete.hpp \ oSaHpiCtrlRecOem.cpp oSaHpiCtrlRecOem.hpp \ oSaHpiCtrlRecStream.cpp oSaHpiCtrlRecStream.hpp \ oSaHpiCtrlRecText.cpp oSaHpiCtrlRecText.hpp \ oSaHpiCtrlState.cpp oSaHpiCtrlState.hpp \ oSaHpiCtrlStateOem.cpp oSaHpiCtrlStateOem.hpp \ oSaHpiCtrlStateStream.cpp oSaHpiCtrlStateStream.hpp \ oSaHpiCtrlStateText.cpp oSaHpiCtrlStateText.hpp \ oSaHpiDomainEvent.cpp oSaHpiDomainEvent.hpp \ oSaHpiDomainInfo.cpp oSaHpiDomainInfo.hpp \ oSaHpiDrtEntry.cpp oSaHpiDrtEntry.hpp \ oSaHpiEntity.cpp oSaHpiEntity.hpp \ oSaHpiEntityPath.cpp oSaHpiEntityPath.hpp \ oSaHpiEvent.cpp oSaHpiEvent.hpp \ oSaHpiEventLogEntry.cpp oSaHpiEventLogEntry.hpp \ oSaHpiEventLogInfo.cpp oSaHpiEventLogInfo.hpp \ oSaHpiHotSwapEvent.cpp oSaHpiHotSwapEvent.hpp \ oSaHpiHpiSwEvent.cpp oSaHpiHpiSwEvent.hpp \ oSaHpiIdrAreaHeader.cpp oSaHpiIdrAreaHeader.hpp \ oSaHpiIdrField.cpp oSaHpiIdrField.hpp \ oSaHpiIdrInfo.cpp oSaHpiIdrInfo.hpp \ oSaHpiInventoryRec.cpp oSaHpiInventoryRec.hpp \ oSaHpiName.cpp oSaHpiName.hpp \ oSaHpiOemEvent.cpp oSaHpiOemEvent.hpp \ oSaHpiRdr.cpp oSaHpiRdr.hpp \ oSaHpiResourceEvent.cpp oSaHpiResourceEvent.hpp \ oSaHpiResourceInfo.cpp oSaHpiResourceInfo.hpp \ oSaHpiRptEntry.cpp oSaHpiRptEntry.hpp \ oSaHpiSensorDataFormat.cpp oSaHpiSensorDataFormat.hpp \ oSaHpiSensorEnableChangeEvent.cpp oSaHpiSensorEnableChangeEvent.hpp \ oSaHpiSensorEvent.cpp oSaHpiSensorEvent.hpp \ oSaHpiSensorRange.cpp oSaHpiSensorRange.hpp \ oSaHpiSensorReading.cpp oSaHpiSensorReading.hpp \ oSaHpiSensorRec.cpp oSaHpiSensorRec.hpp \ oSaHpiSensorThdDefn.cpp oSaHpiSensorThdDefn.hpp \ oSaHpiSensorThresholds.cpp oSaHpiSensorThresholds.hpp \ oSaHpiTextBuffer.cpp oSaHpiTextBuffer.hpp \ oSaHpiTypesEnums.cpp oSaHpiTypesEnums.hpp \ oSaHpiUserEvent.cpp oSaHpiUserEvent.hpp \ oSaHpiWatchdog.cpp oSaHpiWatchdog.hpp \ oSaHpiWatchdogEvent.cpp oSaHpiWatchdogEvent.hpp \ oSaHpiWatchdogRec.cpp oSaHpiWatchdogRec.hpp libosahpi_la_LDFLAGS = -version-info @HPI_LIB_VERSION@ openhpi-2.14.1/cpp/oSaHpiCtrlRecDigital.hpp0000644000076400007640000000324411302567022015425 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * W. David Ashley */ #ifndef Included_oSaHpiCtrlRecDigital #define Included_oSaHpiCtrlRecDigital #include extern "C" { #include } class oSaHpiCtrlRecDigital : public SaHpiCtrlRecDigitalT { public: // constructors oSaHpiCtrlRecDigital(); oSaHpiCtrlRecDigital(SaHpiCtrlStateDigitalT crd); // copy constructor oSaHpiCtrlRecDigital(const oSaHpiCtrlRecDigital& crd); // destructor ~oSaHpiCtrlRecDigital() { } // other methods static bool assignField(SaHpiCtrlRecDigitalT * ptr, const char *field, const char *value); inline bool assignField(const char *field, const char *value) { return assignField(this, field, value); } inline SaHpiCtrlRecDigitalT *getStruct(void) { return this; } static bool fprint(FILE *stream, const int indent, const SaHpiCtrlRecDigitalT *ent); inline bool fprint(FILE *stream, const int indent) { return fprint(stream, indent, this); } }; #endif openhpi-2.14.1/cpp/oSaHpiCtrlStateOem.hpp0000644000076400007640000000327011302567022015136 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * W. David Ashley */ #ifndef Included_oSaHpiCtrlStateOem #define Included_oSaHpiCtrlStateOem #include extern "C" { #include } class oSaHpiCtrlStateOem : public SaHpiCtrlStateOemT { public: // constructors oSaHpiCtrlStateOem(); oSaHpiCtrlStateOem(SaHpiManufacturerIdT id, const char *str); // copy constructor oSaHpiCtrlStateOem(const oSaHpiCtrlStateOem& buf); // destructor ~oSaHpiCtrlStateOem() { } // other methods static bool assignField(SaHpiCtrlStateOemT * ptr, const char *field, const char *value); inline bool assignField(const char *field, const char *value) { return assignField(this, field, value); } inline SaHpiCtrlStateOemT *getStruct(void) { return this; } static bool fprint(FILE *stream, const int indent, const SaHpiCtrlStateOemT *buffer); inline bool fprint(FILE *stream, const int indent) { return fprint(stream, indent, this); } }; #endif openhpi-2.14.1/cpp/oSaHpiDomainInfo.cpp0000644000076400007640000002103211302567022014602 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * W. David Ashley */ #include #include #include extern "C" { #include } #include "oSaHpiTypesEnums.hpp" #include "oSaHpiTextBuffer.hpp" #include "oSaHpiDomainInfo.hpp" /** * Default constructor. */ oSaHpiDomainInfo::oSaHpiDomainInfo() { int i; DomainId = 1; DomainCapabilities = (SaHpiDomainCapabilitiesT)0; IsPeer = false; DomainTag.DataType = SAHPI_TL_TYPE_TEXT; DomainTag.Language = SAHPI_LANG_ENGLISH; DomainTag.DataLength = 0; DomainTag.Data[0] = '\0'; DrtUpdateCount = 0; DrtUpdateTimestamp = 0; RptUpdateCount = 0; RptUpdateTimestamp = 0; DatUpdateCount = 0; DatUpdateTimestamp = 0; ActiveAlarms = 0; CriticalAlarms = 0; MajorAlarms = 0; MinorAlarms = 0; DatUserAlarmLimit = 0; DatOverflow = false; for (i = 0; i < 16; i++) { Guid[i] = 0; } }; /** * Constructor. * * @param buf The reference to the class to be copied. */ oSaHpiDomainInfo::oSaHpiDomainInfo(const oSaHpiDomainInfo& buf) { memcpy(this, &buf, sizeof(SaHpiDomainInfoT)); } /** * Assign a field in the SaHpiDomainInfoT struct a value. * * @param field The pointer to the struct (class). * @param field The field name as a text string (case sensitive). * @param value The character string value to be assigned to the field. This * value will be converted as necessary. * * @return True if there was an error, otherwise false. */ bool oSaHpiDomainInfo::assignField(SaHpiDomainInfoT *ptr, const char *field, const char *value) { if (ptr == NULL || field == NULL || value == NULL) { return true; } if (strcmp(field, "DomainId") == 0) { ptr->DomainId = strtoul(value, NULL, 10); return false; } else if (strcmp(field, "DomainCapabilities") == 0) { if (strcmp(value, "SAHPI_DOMAIN_CAP_AUTOINSERT_READ_ONLY") == 0) { ptr->DomainCapabilities = SAHPI_DOMAIN_CAP_AUTOINSERT_READ_ONLY; } else { ptr->DomainCapabilities = (SaHpiDomainCapabilitiesT)0; } return false; } else if (strcmp(field, "IsPeer") == 0) { ptr->IsPeer = oSaHpiTypesEnums::str2torf(value); return false; } // DomainTag else if (strcmp(field, "DrtUpdateCount") == 0) { ptr->DrtUpdateCount = strtoul(value, NULL, 10); return false; } else if (strcmp(field, "DrtUpdateTimestamp") == 0) { ptr->DrtUpdateTimestamp = strtoull(value, NULL, 10); return false; } else if (strcmp(field, "RptUpdateCount") == 0) { ptr->RptUpdateCount = strtoul(value, NULL, 10); return false; } else if (strcmp(field, "RptUpdateTimestamp") == 0) { ptr->RptUpdateTimestamp = strtoull(value, NULL, 10); return false; } else if (strcmp(field, "DatUpdateCount") == 0) { ptr->DatUpdateCount = strtoul(value, NULL, 10); return false; } else if (strcmp(field, "DatUpdateTimestamp") == 0) { ptr->DatUpdateTimestamp = strtoull(value, NULL, 10); return false; } else if (strcmp(field, "ActiveAlarms") == 0) { ptr->ActiveAlarms = strtoul(value, NULL, 10); return false; } else if (strcmp(field, "CriticalAlarms") == 0) { ptr->CriticalAlarms = strtoul(value, NULL, 10); return false; } else if (strcmp(field, "MajorAlarms") == 0) { ptr->MajorAlarms = strtoul(value, NULL, 10); return false; } else if (strcmp(field, "MinorAlarms") == 0) { ptr->MinorAlarms = strtoul(value, NULL, 10); return false; } else if (strcmp(field, "DatUserAlarmLimit") == 0) { ptr->DatUserAlarmLimit = strtoul(value, NULL, 10); return false; } else if (strcmp(field, "DatOverflow") == 0) { ptr->DatOverflow = oSaHpiTypesEnums::str2torf(value); return false; } // Guid return true; }; /** * Print the contents of the buffer. * * @param stream Target stream. * @param buffer Address of the SaHpiDomainInfoT struct. * * @return True if there was an error, otherwise false. */ bool oSaHpiDomainInfo::fprint(FILE *stream, const int indent, const SaHpiDomainInfoT *buffer) { int i, err; char indent_buf[indent + 1]; if (stream == NULL || buffer == NULL) { return true; } for (i = 0; i < indent; i++) { indent_buf[i] = ' '; } indent_buf[indent] = '\0'; err = fprintf(stream, "%s", indent_buf); if (err < 0) { return true; } err = fprintf(stream, "DomainId = %u\n", buffer->DomainId); if (err < 0) { return true; } err = fprintf(stream, "%s", indent_buf); if (err < 0) { return true; } err = fprintf(stream, "DomainCapabilities = %X\n", buffer->DomainCapabilities); if (err < 0) { return true; } err = fprintf(stream, "%s", indent_buf); if (err < 0) { return true; } err = fprintf(stream, "IsPeer = %s\n", oSaHpiTypesEnums::torf2str(buffer->IsPeer)); if (err < 0) { return true; } err = fprintf(stream, "%s", indent_buf); if (err < 0) { return true; } err = fprintf(stream, "DomainTag\n"); if (err < 0) { return true; } const SaHpiTextBufferT *tb = (const SaHpiTextBufferT *)&buffer->DomainTag; err = oSaHpiTextBuffer::fprint(stream, indent + 3, tb); if (err < 0) { return true; } err = fprintf(stream, "%s", indent_buf); if (err < 0) { return true; } err = fprintf(stream, "DrtUpdateCount = %u\n", buffer->DrtUpdateCount); if (err < 0) { return true; } err = fprintf(stream, "%s", indent_buf); if (err < 0) { return true; } err = fprintf(stream, "DrtUpdateTimestamp = %lld\n", buffer->DrtUpdateTimestamp); if (err < 0) { return true; } err = fprintf(stream, "%s", indent_buf); if (err < 0) { return true; } err = fprintf(stream, "RptUpdateCount = %u\n", buffer->RptUpdateCount); if (err < 0) { return true; } err = fprintf(stream, "%s", indent_buf); if (err < 0) { return true; } err = fprintf(stream, "RptUpdateTimestamp = %lld\n", buffer->RptUpdateTimestamp); if (err < 0) { return true; } err = fprintf(stream, "%s", indent_buf); if (err < 0) { return true; } err = fprintf(stream, "DatUpdateCount = %u\n", buffer->DatUpdateCount); if (err < 0) { return true; } err = fprintf(stream, "%s", indent_buf); if (err < 0) { return true; } err = fprintf(stream, "DatUpdateTimestamp = %lld\n", buffer->DatUpdateTimestamp); if (err < 0) { return true; } err = fprintf(stream, "%s", indent_buf); if (err < 0) { return true; } err = fprintf(stream, "ActiveAlarms = %u\n", buffer->ActiveAlarms); if (err < 0) { return true; } err = fprintf(stream, "%s", indent_buf); if (err < 0) { return true; } err = fprintf(stream, "CriticalAlarms = %u\n", buffer->CriticalAlarms); if (err < 0) { return true; } err = fprintf(stream, "%s", indent_buf); if (err < 0) { return true; } err = fprintf(stream, "MajorAlarms = %u\n", buffer->MajorAlarms); if (err < 0) { return true; } err = fprintf(stream, "%s", indent_buf); if (err < 0) { return true; } err = fprintf(stream, "MinorAlarms = %u\n", buffer->MinorAlarms); if (err < 0) { return true; } err = fprintf(stream, "%s", indent_buf); if (err < 0) { return true; } err = fprintf(stream, "DatUserAlarmLimit = %u\n", buffer->DatUserAlarmLimit); if (err < 0) { return true; } for (i = 0; i < 16; i++) { err = fprintf(stream, "%s", indent_buf); if (err < 0) { return true; } err = fprintf(stream, "Guid[%d] = %u\n", i, buffer->Guid[i]); if (err < 0) { return true; } } return false; } openhpi-2.14.1/cpp/oSaHpiEventLogEntry.hpp0000644000076400007640000000314211302567022015333 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * W. David Ashley */ #ifndef Included_oSaHpiEventLogEntry #define Included_oSaHpiEventLogEntry #include extern "C" { #include } class oSaHpiEventLogEntry : public SaHpiEventLogEntryT { public: // constructors oSaHpiEventLogEntry(); // copy constructor oSaHpiEventLogEntry(const oSaHpiEventLogEntry& buf); // destructor ~oSaHpiEventLogEntry() { } // other methods static bool assignField(SaHpiEventLogEntryT * ptr, const char *field, const char *value); inline bool assignField(const char *field, const char *value) { return assignField(this, field, value); } inline SaHpiEventLogEntryT *getStruct(void) { return this; } static bool fprint(FILE *stream, const int indent, const SaHpiEventLogEntryT *buffer); inline bool fprint(FILE *stream, const int indent) { return fprint(stream, indent, this); } }; #endif openhpi-2.14.1/cpp/oSaHpiResourceInfo.hpp0000644000076400007640000000312711302567022015174 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * W. David Ashley */ #ifndef Included_oSaHpiResourceInfo #define Included_oSaHpiResourceInfo #include extern "C" { #include } class oSaHpiResourceInfo : public SaHpiResourceInfoT { public: // constructors oSaHpiResourceInfo(); // copy constructor oSaHpiResourceInfo(const oSaHpiResourceInfo& buf); // destructor ~oSaHpiResourceInfo() { } // other methods static bool assignField(SaHpiResourceInfoT * ptr, const char *field, const char *value); inline bool assignField(const char *field, const char *value) { return assignField(this, field, value); } inline SaHpiResourceInfoT *getStruct(void) { return this; } static bool fprint(FILE *stream, const int indent, const SaHpiResourceInfoT *buffer); inline bool fprint(FILE *stream, const int indent) { return fprint(stream, indent, this); } }; #endif openhpi-2.14.1/cpp/oSaHpiIdrField.cpp0000644000076400007640000001006611302567022014246 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * W. David Ashley */ #include #include #include extern "C" { #include } #include "oSaHpiTypesEnums.hpp" #include "oSaHpiTextBuffer.hpp" #include "oSaHpiIdrField.hpp" /** * Default constructor. */ oSaHpiIdrField::oSaHpiIdrField() { AreaId = 1; FieldId = 1; Type = SAHPI_IDR_FIELDTYPE_UNSPECIFIED; ReadOnly = false; Field.DataType = SAHPI_TL_TYPE_TEXT; Field.Language = SAHPI_LANG_ENGLISH; Field.DataLength = 0; Field.Data[0] = '\0'; }; /** * Constructor. * * @param buf The reference to the class to be copied. */ oSaHpiIdrField::oSaHpiIdrField(const oSaHpiIdrField& buf) { memcpy(this, &buf, sizeof(SaHpiIdrFieldT)); } /** * Assign a field in the SaHpiIdrFieldT struct a value. * * @param field The pointer to the struct (class). * @param field The field name as a text string (case sensitive). * @param value The character string value to be assigned to the field. This * value will be converted as necessary. * * @return True if there was an error, otherwise false. */ bool oSaHpiIdrField::assignField(SaHpiIdrFieldT *ptr, const char *field, const char *value) { // note that DataLength cannot be assigned a value using this method if (ptr == NULL || field == NULL || value == NULL) { return true; } if (strcmp(field, "AreaId") == 0) { ptr->AreaId = strtoul(value, NULL, 10); return false; } else if (strcmp(field, "FieldId") == 0) { ptr->FieldId = strtoul(value, NULL, 10); return false; } else if (strcmp(field, "Type") == 0) { ptr->Type = oSaHpiTypesEnums::str2idrfieldtype(value); return false; } else if (strcmp(field, "ReadOnly") == 0) { ptr->ReadOnly = oSaHpiTypesEnums::str2torf(value); return false; } // Field return true; }; /** * Print the contents of the buffer. * * @param stream Target stream. * @param buffer Address of the SaHpiIdrFieldT struct. * * @return True if there was an error, otherwise false. */ bool oSaHpiIdrField::fprint(FILE *stream, const int indent, const SaHpiIdrFieldT *buffer) { int i, err; char indent_buf[indent + 1]; if (stream == NULL || buffer == NULL) { return true; } for (i = 0; i < indent; i++) { indent_buf[i] = ' '; } indent_buf[indent] = '\0'; err = fprintf(stream, "%s", indent_buf); if (err < 0) { return true; } err = fprintf(stream, "AreaId = %d\n", buffer->AreaId); if (err < 0) { return true; } err = fprintf(stream, "%s", indent_buf); if (err < 0) { return true; } err = fprintf(stream, "FieldId = %d\n", buffer->FieldId); if (err < 0) { return true; } err = fprintf(stream, "%s", indent_buf); if (err < 0) { return true; } err = fprintf(stream, "Type = %s\n", oSaHpiTypesEnums::idrfieldtype2str(buffer->Type)); if (err < 0) { return true; } err = fprintf(stream, "%s", indent_buf); if (err < 0) { return true; } err = fprintf(stream, "ReadOnly = %s\n", oSaHpiTypesEnums::torf2str(buffer->ReadOnly)); if (err < 0) { return true; } err = fprintf(stream, "%s", indent_buf); if (err < 0) { return true; } err = fprintf(stream, "Field\n"); const SaHpiTextBufferT *tb = (const SaHpiTextBufferT *)&buffer->Field; err = oSaHpiTextBuffer::fprint(stream, indent + 3, tb); if (err < 0) { return true; } return false; } openhpi-2.14.1/cpp/oSaHpiCtrlRecDiscrete.hpp0000644000076400007640000000326111302567022015611 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * W. David Ashley */ #ifndef Included_oSaHpiCtrlRecDiscrete #define Included_oSaHpiCtrlRecDiscrete #include extern "C" { #include } class oSaHpiCtrlRecDiscrete : public SaHpiCtrlRecDiscreteT { public: // constructors oSaHpiCtrlRecDiscrete(); oSaHpiCtrlRecDiscrete(SaHpiCtrlStateDiscreteT crd); // copy constructor oSaHpiCtrlRecDiscrete(const oSaHpiCtrlRecDiscrete& crd); // destructor ~oSaHpiCtrlRecDiscrete() { } // other methods static bool assignField(SaHpiCtrlRecDiscreteT * ptr, const char *field, const char *value); inline bool assignField(const char *field, const char *value) { return assignField(this, field, value); } inline SaHpiCtrlRecDiscreteT *getStruct(void) { return this; } static bool fprint(FILE *stream, const int indent, const SaHpiCtrlRecDiscreteT *ent); inline bool fprint(FILE *stream, const int indent) { return fprint(stream, indent, this); } }; #endif openhpi-2.14.1/cpp/oSaHpiSensorEnableChangeEvent.cpp0000644000076400007640000001377111302567022017262 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * W. David Ashley */ #include #include #include extern "C" { #include } #include "oSaHpiTypesEnums.hpp" #include "oSaHpiSensorEnableChangeEvent.hpp" /** * Default constructor. */ oSaHpiSensorEnableChangeEvent::oSaHpiSensorEnableChangeEvent() { SensorNum = 1; SensorType = SAHPI_TEMPERATURE; EventCategory = SAHPI_EC_UNSPECIFIED; SensorEnable = false; SensorEventEnable = false; AssertEventMask = SAHPI_ES_UNSPECIFIED; DeassertEventMask = SAHPI_ES_UNSPECIFIED; OptionalDataPresent = (SaHpiSensorOptionalDataT)0; CurrentState = SAHPI_ES_UNSPECIFIED; }; /** * Constructor. * * @param buf The reference to the class to be copied. */ oSaHpiSensorEnableChangeEvent::oSaHpiSensorEnableChangeEvent(const oSaHpiSensorEnableChangeEvent& range) { memcpy(this, &range, sizeof(SaHpiSensorEnableChangeEventT)); } /** * Assign a field in the SaHpiSensorEnableChangeEventT struct a value. * * @param field The pointer to the struct (class). * @param field The field name as a text string (case sensitive). * @param value The character string value to be assigned to the field. This * value will be converted as necessary. * * @return True if there was an error, otherwise false. */ bool oSaHpiSensorEnableChangeEvent::assignField(SaHpiSensorEnableChangeEventT *ptr, const char *field, const char *value) { if (ptr == NULL || field == NULL || value == NULL) { return true; } if (strcmp(field, "SensorNum") == 0) { ptr->SensorNum = strtoul(value, NULL, 10); return false; } else if (strcmp(field, "SensorType") == 0) { ptr->SensorType = oSaHpiTypesEnums::str2sensortype(value); return false; } else if (strcmp(field, "EventCategory") == 0) { ptr->EventCategory |= oSaHpiTypesEnums::str2eventcategory(value); return false; } else if (strcmp(field, "SensorEnable") == 0) { ptr->SensorEnable = oSaHpiTypesEnums::str2torf(value); return false; } else if (strcmp(field, "SensorEventEnable") == 0) { ptr->SensorEventEnable = oSaHpiTypesEnums::str2torf(value); return false; } else if (strcmp(field, "AssertEventMask") == 0) { ptr->AssertEventMask |= oSaHpiTypesEnums::str2eventstate(value); return false; } else if (strcmp(field, "DeassertEventMask") == 0) { ptr->DeassertEventMask |= oSaHpiTypesEnums::str2eventstate(value); return false; } else if (strcmp(field, "OptionalDataPresent") == 0) { ptr->OptionalDataPresent |= oSaHpiTypesEnums::str2sensoroptionaldata(value); return false; } else if (strcmp(field, "CurrentState") == 0) { ptr->CurrentState |= oSaHpiTypesEnums::str2eventstate(value); return false; } return true; }; /** * Print the contents of the entity. * * @param stream Target stream. * @param buffer Address of the SaHpiSensorEnableChangeEventT struct. * * @return True if there was an error, otherwise false. */ bool oSaHpiSensorEnableChangeEvent::fprint(FILE *stream, const int indent, const SaHpiSensorEnableChangeEventT *se) { int i, err = 0; char indent_buf[indent + 1]; if (stream == NULL || se == NULL) { return true; } for (i = 0; i < indent; i++) { indent_buf[i] = ' '; } indent_buf[indent] = '\0'; err = fprintf(stream, "%s", indent_buf); if (err < 0) { return true; } err = fprintf(stream, "SensorNum = %u\n", se->SensorNum); if (err < 0) { return true; } err = fprintf(stream, "%s", indent_buf); if (err < 0) { return true; } err = fprintf(stream, "SensorType = %s\n", oSaHpiTypesEnums::sensortype2str(se->SensorType)); if (err < 0) { return true; } err = fprintf(stream, "%s", indent_buf); if (err < 0) { return true; } err = fprintf(stream, "EventCategory = %X\n", se->EventCategory); if (err < 0) { return true; } err = fprintf(stream, "%s", indent_buf); if (err < 0) { return true; } err = fprintf(stream, "SensorEnable = %s\n", oSaHpiTypesEnums::torf2str(se->SensorEnable)); if (err < 0) { return true; } err = fprintf(stream, "%s", indent_buf); if (err < 0) { return true; } err = fprintf(stream, "SensorEventEnable = %s\n", oSaHpiTypesEnums::torf2str(se->SensorEventEnable)); if (err < 0) { return true; } err = fprintf(stream, "%s", indent_buf); if (err < 0) { return true; } err = fprintf(stream, "AssertEventMask = %X\n", se->AssertEventMask); if (err < 0) { return true; } err = fprintf(stream, "%s", indent_buf); if (err < 0) { return true; } err = fprintf(stream, "DeassertEventMask = %X\n", se->DeassertEventMask); if (err < 0) { return true; } err = fprintf(stream, "%s", indent_buf); if (err < 0) { return true; } err = fprintf(stream, "OptionalDataPresent = %X\n", se->OptionalDataPresent); if (err < 0) { return true; } if (se->OptionalDataPresent && SAHPI_SOD_CURRENT_STATE) { err = fprintf(stream, "%s", indent_buf); if (err < 0) { return true; } err = fprintf(stream, "CurrentState = %X\n", se->CurrentState); if (err < 0) { return true; } } return false; } openhpi-2.14.1/cpp/oSaHpiEntity.hpp0000644000076400007640000000317211302567022014045 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * W. David Ashley */ #ifndef Included_oSaHpiEntity #define Included_oSaHpiEntity #include extern "C" { #include } class oSaHpiEntity : public SaHpiEntityT { public: // constructors oSaHpiEntity(); oSaHpiEntity(const SaHpiEntityTypeT type, const SaHpiEntityLocationT loc); // copy constructor oSaHpiEntity(const oSaHpiEntity& ent); // destructor ~oSaHpiEntity() { } // other methods static bool assignField(SaHpiEntityT * ptr, const char *field, const char *value); inline bool assignField(const char *field, const char *value) { return assignField(this, field, value); } inline SaHpiEntityT *getStruct(void) { return this; } static bool fprint(FILE *stream, const int indent, const SaHpiEntityT *ent); inline bool fprint(FILE *stream, const int indent) { return fprint(stream, indent, this); } }; #endif openhpi-2.14.1/cpp/oSaHpiResourceEvent.hpp0000644000076400007640000000314211302567022015357 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * W. David Ashley */ #ifndef Included_oSaHpiResourceEvent #define Included_oSaHpiResourceEvent #include extern "C" { #include } class oSaHpiResourceEvent : public SaHpiResourceEventT { public: // constructors oSaHpiResourceEvent(); // copy constructor oSaHpiResourceEvent(const oSaHpiResourceEvent& buf); // destructor ~oSaHpiResourceEvent() { } // other methods static bool assignField(SaHpiResourceEventT * ptr, const char *field, const char *value); inline bool assignField(const char *field, const char *value) { return assignField(this, field, value); } inline SaHpiResourceEventT *getStruct(void) { return this; } static bool fprint(FILE *stream, const int indent, const SaHpiResourceEventT *buffer); inline bool fprint(FILE *stream, const int indent) { return fprint(stream, indent, this); } }; #endif openhpi-2.14.1/cpp/oSaHpiUserEvent.hpp0000644000076400007640000000306611302567022014513 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * W. David Ashley */ #ifndef Included_oSaHpiUserEvent #define Included_oSaHpiUserEvent #include extern "C" { #include } class oSaHpiUserEvent : public SaHpiUserEventT { public: // constructors oSaHpiUserEvent(); // copy constructor oSaHpiUserEvent(const oSaHpiUserEvent& buf); // destructor ~oSaHpiUserEvent() { } // other methods static bool assignField(SaHpiUserEventT * ptr, const char *field, const char *value); inline bool assignField(const char *field, const char *value) { return assignField(this, field, value); } inline SaHpiUserEventT *getStruct(void) { return this; } static bool fprint(FILE *stream, const int indent, const SaHpiUserEventT *buffer); inline bool fprint(FILE *stream, const int indent) { return fprint(stream, indent, this); } }; #endif openhpi-2.14.1/cpp/oSaHpiWatchdogRec.hpp0000644000076400007640000000311411302567022014757 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * W. David Ashley */ #ifndef Included_oSaHpiWatchdogRec #define Included_oSaHpiWatchdogRec #include extern "C" { #include } class oSaHpiWatchdogRec : public SaHpiWatchdogRecT { public: // constructors oSaHpiWatchdogRec(); // copy constructor oSaHpiWatchdogRec(const oSaHpiWatchdogRec& buf); // destructor ~oSaHpiWatchdogRec() { } // other methods static bool assignField(SaHpiWatchdogRecT * ptr, const char *field, const char *value); inline bool assignField(const char *field, const char *value) { return assignField(this, field, value); } inline SaHpiWatchdogRecT *getStruct(void) { return this; } static bool fprint(FILE *stream, const int indent, const SaHpiWatchdogRecT *buffer); inline bool fprint(FILE *stream, const int indent) { return fprint(stream, indent, this); } }; #endif openhpi-2.14.1/cpp/oSaHpiCtrlRecDigital.cpp0000644000076400007640000000532711302567022015424 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * W. David Ashley */ #include #include #include extern "C" { #include } #include "oSaHpiTypesEnums.hpp" #include "oSaHpiCtrlRecDigital.hpp" /** * Default constructor. */ oSaHpiCtrlRecDigital::oSaHpiCtrlRecDigital() { Default = SAHPI_CTRL_STATE_OFF; }; /** * Constructor. */ oSaHpiCtrlRecDigital::oSaHpiCtrlRecDigital(SaHpiCtrlStateDigitalT cs) { Default = cs; }; /** * Constructor. * * @param buf The reference to the class to be copied. */ oSaHpiCtrlRecDigital::oSaHpiCtrlRecDigital(const oSaHpiCtrlRecDigital& ent) { memcpy(this, &ent, sizeof(SaHpiCtrlRecDigitalT)); } /** * Assign a field in the SaHpiCtrlRecDigitalT struct a value. * * @param field The pointer to the struct (class). * @param field The field name as a text string (case sensitive). * @param value The character string value to be assigned to the field. This * value will be converted as necessary. * * @return True if there was an error, otherwise false. */ bool oSaHpiCtrlRecDigital::assignField(SaHpiCtrlRecDigitalT *ptr, const char *field, const char *value) { if (ptr == NULL || field == NULL || value == NULL) { return true; } if (strcmp(field, "Default") == 0) { ptr->Default = oSaHpiTypesEnums::str2ctrlstatedigital(value); return false; } // StateUnion return true; }; /** * Print the contents of the entity. * * @param stream Target stream. * @param buffer Address of the SaHpiCtrlRecDigitalT struct. * * @return True if there was an error, otherwise false. */ bool oSaHpiCtrlRecDigital::fprint(FILE *stream, const int indent, const SaHpiCtrlRecDigitalT *crd) { int i, err = 0; char indent_buf[indent + 1]; if (stream == NULL || crd == NULL) { return true; } for (i = 0; i < indent; i++) { indent_buf[i] = ' '; } indent_buf[indent] = '\0'; err = fprintf(stream, "%s", indent_buf); if (err < 0) { return true; } err = fprintf(stream, "Default = %s\n", oSaHpiTypesEnums::ctrlstatedigital2str(crd->Default)); if (err < 0) { return true; } return false; } openhpi-2.14.1/cpp/oSaHpiSensorRec.hpp0000644000076400007640000000306011302567022014470 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * W. David Ashley */ #ifndef Included_oSaHpiSensorRec #define Included_oSaHpiSensorRec #include extern "C" { #include } class oSaHpiSensorRec : public SaHpiSensorRecT { public: // constructors oSaHpiSensorRec(); // copy constructor oSaHpiSensorRec(const oSaHpiSensorRec& sr); // destructor ~oSaHpiSensorRec() { } // other methods static bool assignField(SaHpiSensorRecT *ptr, const char *field, const char *value); inline bool assignField(const char *field, const char *value) { return assignField(this, field, value); } inline SaHpiSensorRecT *getStruct(void) { return this; } static bool fprint(FILE *stream, const int indent, const SaHpiSensorRecT *sr); inline bool fprint(FILE *stream, const int indent) { return fprint(stream, indent, this); } }; #endif openhpi-2.14.1/cpp/oSaHpiCtrlDefaultMode.cpp0000644000076400007640000000617711302567022015612 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * W. David Ashley */ #include #include #include extern "C" { #include } #include "oSaHpiTypesEnums.hpp" #include "oSaHpiCtrlDefaultMode.hpp" /** * Default constructor. */ oSaHpiCtrlDefaultMode::oSaHpiCtrlDefaultMode() { Mode = SAHPI_CTRL_MODE_AUTO; ReadOnly = false; }; /** * Constructor. */ oSaHpiCtrlDefaultMode::oSaHpiCtrlDefaultMode(SaHpiCtrlModeT mode, SaHpiBoolT ro) { Mode = mode; ReadOnly = ro; }; /** * Constructor. * * @param buf The reference to the class to be copied. */ oSaHpiCtrlDefaultMode::oSaHpiCtrlDefaultMode(const oSaHpiCtrlDefaultMode& ent) { memcpy(this, &ent, sizeof(SaHpiCtrlDefaultModeT)); } /** * Assign a field in the SaHpiCtrlDefaultModeT struct a value. * * @param field The pointer to the struct (class). * @param field The field name as a text string (case sensitive). * @param value The character string value to be assigned to the field. This * value will be converted as necessary. * * @return True if there was an error, otherwise false. */ bool oSaHpiCtrlDefaultMode::assignField(SaHpiCtrlDefaultModeT *ptr, const char *field, const char *value) { if (ptr == NULL || field == NULL || value == NULL) { return true; } if (strcmp(field, "Mode") == 0) { ptr->Mode = oSaHpiTypesEnums::str2ctrlmode(value); return false; } else if (strcmp(field, "ReadOnly") == 0) { ptr->ReadOnly = oSaHpiTypesEnums::str2torf(value); return false; } return true; }; /** * Print the contents of the entity. * * @param stream Target stream. * @param buffer Address of the SaHpiCtrlDefaultModeT struct. * * @return True if there was an error, otherwise false. */ bool oSaHpiCtrlDefaultMode::fprint(FILE *stream, const int indent, const SaHpiCtrlDefaultModeT *cdm) { int i, err = 0; char indent_buf[indent + 1]; if (stream == NULL || cdm == NULL) { return true; } for (i = 0; i < indent; i++) { indent_buf[i] = ' '; } indent_buf[indent] = '\0'; err = fprintf(stream, "%s", indent_buf); if (err < 0) { return true; } err = fprintf(stream, "Mode = %s\n", oSaHpiTypesEnums::ctrlmode2str(cdm->Mode)); if (err < 0) { return true; } err = fprintf(stream, "%s", indent_buf); if (err < 0) { return true; } err = fprintf(stream, "ReadOnly = %s\n", oSaHpiTypesEnums::torf2str(cdm->ReadOnly)); if (err < 0) { return true; } return false; } openhpi-2.14.1/cpp/oSaHpiTypesEnums.hpp0000644000076400007640000001606011302567022014705 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * W. David Ashley */ #ifndef Included_oSaHpiTypesEnums #define Included_oSaHpiTypesEnums extern "C" { #include } class oSaHpiTypesEnums { public: // all the real methods in this class are static // so they can be used from any other class static SaHpiBoolT str2torf(const char *str); static const char * torf2str(SaHpiBoolT f); static SaHpiLanguageT str2language(const char *strtype); static const char * language2str(SaHpiLanguageT value); static SaHpiTextTypeT str2texttype(const char *type); static const char * texttype2str(SaHpiTextTypeT value); static SaHpiEntityTypeT str2entitytype(const char *strtype); static const char * entitytype2str(SaHpiEntityTypeT value); static SaHpiSensorReadingTypeT str2sensorreadingtype(const char *strtype); static const char * sensorreadingtype2str(SaHpiSensorReadingTypeT value); static SaHpiSensorUnitsT str2sensorunits(const char *strtype); static const char * sensorunits2str(SaHpiSensorUnitsT value); static SaHpiSensorModUnitUseT str2sensoruse(const char *strtype); static const char * sensoruse2str(SaHpiSensorModUnitUseT value); static SaHpiSensorThdMaskT str2sensorthdmask(const char *strtype); static const char * sensorthdmask2str(SaHpiSensorThdMaskT value); static SaHpiSensorEventCtrlT str2sensoreventctrl(const char *strtype); static const char * sensoreventctrl2str(SaHpiSensorEventCtrlT value); static SaHpiSensorTypeT str2sensortype(const char *strtype); static const char * sensortype2str(SaHpiSensorTypeT value); static SaHpiEventCategoryT str2eventcategory(const char *strtype); static const char * eventcategory2str(SaHpiEventCategoryT value); static SaHpiEventStateT str2eventstate(const char *strtype); static const char * eventstate2str(SaHpiEventStateT value); static SaHpiCtrlTypeT str2ctrltype(const char *strtype); static const char * ctrltype2str(SaHpiCtrlTypeT value); static SaHpiCtrlStateDigitalT str2ctrlstatedigital(const char *strtype); static const char * ctrlstatedigital2str(SaHpiCtrlStateDigitalT value); static SaHpiUint32T str2aggregatestatus(const char *strtype); static const char * aggregatestatus2str(SaHpiUint32T value); static SaHpiCtrlOutputTypeT str2ctrloutputtype(const char *strtype); static const char * ctrloutputtype2str(SaHpiCtrlOutputTypeT value); static SaHpiCtrlModeT str2ctrlmode(const char *strtype); static const char * ctrlmode2str(SaHpiCtrlModeT value); static SaHpiIdrAreaTypeT str2idrareatype(const char *strtype); static const char * idrareatype2str(SaHpiIdrAreaTypeT value); static SaHpiIdrFieldTypeT str2idrfieldtype(const char *strtype); static const char * idrfieldtype2str(SaHpiIdrFieldTypeT value); static SaHpiWatchdogActionT str2watchdogaction(const char *strtype); static const char * watchdogaction2str(SaHpiWatchdogActionT value); static SaHpiWatchdogActionEventT str2watchdogactionevent(const char *strtype); static const char * watchdogactionevent2str(SaHpiWatchdogActionEventT value); static SaHpiWatchdogPretimerInterruptT str2watchdogpretimerinterrupt(const char *strtype); static const char * watchdogpretimerinterrupt2str(SaHpiWatchdogPretimerInterruptT value); static SaHpiWatchdogTimerUseT str2watchdogtimeruse(const char *strtype); static const char * watchdogtimeruse2str(SaHpiWatchdogTimerUseT value); static SaHpiWatchdogExpFlagsT str2watchdogexpflags(const char *strtype); static const char * watchdogexpflags2str(SaHpiWatchdogExpFlagsT value); static SaHpiStatusCondTypeT str2statuscondtype(const char *strtype); static const char * statuscondtype2str(SaHpiStatusCondTypeT value); static SaHpiAnnunciatorModeT str2annunciatormode(const char *strtype); static const char * annunciatormode2str(SaHpiAnnunciatorModeT value); static SaHpiSeverityT str2severity(const char *strtype); static const char * severity2str(SaHpiSeverityT value); static SaHpiAnnunciatorTypeT str2annunciatortype(const char *strtype); static const char * annunciatortype2str(SaHpiAnnunciatorTypeT value); static SaHpiRdrTypeT str2rdrtype(const char *strtype); static const char * rdrtype2str(SaHpiRdrTypeT value); static SaHpiHsIndicatorStateT str2hsindicatorstate(const char *strtype); static const char * hsindicatorstate2str(SaHpiHsIndicatorStateT value); static SaHpiHsActionT str2hsaction(const char *strtype); static const char * hsaction2str(SaHpiHsActionT value); static SaHpiHsStateT str2hsstate(const char *strtype); static const char * hsstate2str(SaHpiHsStateT value); static SaHpiResourceEventTypeT str2resourceeventtype(const char *strtype); static const char * resourceeventtype2str(SaHpiResourceEventTypeT value); static SaHpiDomainEventTypeT str2domaineventtype(const char *strtype); static const char * domaineventtype2str(SaHpiDomainEventTypeT value); static SaHpiSensorOptionalDataT str2sensoroptionaldata(const char *strtype); static const char * sensoroptionaldata2str(SaHpiSensorOptionalDataT value); static SaHpiSwEventTypeT str2sweventtype(const char *strtype); static const char * sweventtype2str(SaHpiSwEventTypeT value); static SaHpiEventTypeT str2eventtype(const char *strtype); static const char * eventtype2str(SaHpiEventTypeT value); static SaHpiParmActionT str2parmaction(const char *strtype); static const char * parmaction2str(SaHpiParmActionT value); static SaHpiResetActionT str2resetaction(const char *strtype); static const char * resetaction2str(SaHpiResetActionT value); static SaHpiPowerStateT str2powerstate(const char *strtype); static const char * powerstate2str(SaHpiPowerStateT value); static SaHpiCapabilitiesT str2capabilities(const char *strtype); static const char * capabilities2str(SaHpiCapabilitiesT value); static SaHpiHsCapabilitiesT str2hscapabilities(const char *strtype); static const char * hscapabilities2str(SaHpiHsCapabilitiesT value); static SaHpiEventLogOverflowActionT str2eventlogoverflowaction(const char *strtype); static const char * eventlogoverflowaction2str(SaHpiEventLogOverflowActionT value); static SaHpiEventLogEntryIdT str2eventlogentryid(const char *strtype); static const char * eventlogentryid2str(SaHpiEventLogEntryIdT value); }; #endif openhpi-2.14.1/cpp/oSaHpiCtrlDefaultMode.hpp0000644000076400007640000000332611302567022015610 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * W. David Ashley */ #ifndef Included_oSaHpiCtrlDefaultMode #define Included_oSaHpiCtrlDefaultMode #include extern "C" { #include } class oSaHpiCtrlDefaultMode : public SaHpiCtrlDefaultModeT { public: // constructors oSaHpiCtrlDefaultMode(); oSaHpiCtrlDefaultMode(SaHpiCtrlModeT mode, SaHpiBoolT ro); // copy constructor oSaHpiCtrlDefaultMode(const oSaHpiCtrlDefaultMode& cdm); // destructor ~oSaHpiCtrlDefaultMode() { } // other methods static bool assignField(SaHpiCtrlDefaultModeT * ptr, const char *field, const char *value); inline bool assignField(const char *field, const char *value) { return assignField(this, field, value); } inline SaHpiCtrlDefaultModeT *getStruct(void) { return this; } static bool fprint(FILE *stream, const int indent, const SaHpiCtrlDefaultModeT *ent); inline bool fprint(FILE *stream, const int indent) { return fprint(stream, indent, this); } }; #endif openhpi-2.14.1/cpp/oSaHpiSensorDataFormat.hpp0000644000076400007640000000324011302567022016001 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * W. David Ashley */ #ifndef Included_oSaHpiSensorDataFormat #define Included_oSaHpiSensorDataFormat #include extern "C" { #include } #include "oSaHpiSensorRange.hpp" class oSaHpiSensorDataFormat : public SaHpiSensorDataFormatT { public: // constructors oSaHpiSensorDataFormat(); // copy constructor oSaHpiSensorDataFormat(const oSaHpiSensorDataFormat& sr); // destructor ~oSaHpiSensorDataFormat() { } // other methods static bool assignField(SaHpiSensorDataFormatT * ptr, const char *field, const char *value); inline bool assignField(const char *field, const char *value) { return assignField(this, field, value); } inline SaHpiSensorDataFormatT *getStruct(void) { return this; } static bool fprint(FILE *stream, const int indent, const SaHpiSensorDataFormatT *ent); inline bool fprint(FILE *stream, const int indent) { return fprint(stream, indent, this); } }; #endif openhpi-2.14.1/cpp/oSaHpiRdr.cpp0000644000076400007640000001416611302567022013320 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * W. David Ashley */ #include #include #include extern "C" { #include } #include "oSaHpiTypesEnums.hpp" #include "oSaHpiCtrlRec.hpp" #include "oSaHpiSensorRec.hpp" #include "oSaHpiInventoryRec.hpp" #include "oSaHpiWatchdogRec.hpp" #include "oSaHpiAnnunciatorRec.hpp" #include "oSaHpiEntityPath.hpp" #include "oSaHpiTextBuffer.hpp" #include "oSaHpiRdr.hpp" /** * Default constructor. */ oSaHpiRdr::oSaHpiRdr() { RecordId = 1; RdrType = SAHPI_NO_RECORD; Entity.Entry[0].EntityType = SAHPI_ENT_ROOT; Entity.Entry[0].EntityLocation = 0; IsFru = false; // no need to initialize the RdrTypeUnion since there is no record IdString.DataType = SAHPI_TL_TYPE_TEXT; IdString.Language = SAHPI_LANG_ENGLISH; IdString.DataLength = 0; IdString.Data[0] = '\0'; }; /** * Constructor. * * @param buf The reference to the class to be copied. */ oSaHpiRdr::oSaHpiRdr(const oSaHpiRdr& buf) { memcpy(this, &buf, sizeof(SaHpiRdrT)); } /** * Assign a field in the SaHpiRdrT struct a value. * * @param field The pointer to the struct (class). * @param field The field name as a text string (case sensitive). * @param value The character string value to be assigned to the field. This * value will be converted as necessary. * * @return True if there was an error, otherwise false. */ bool oSaHpiRdr::assignField(SaHpiRdrT *ptr, const char *field, const char *value) { if (ptr == NULL || field == NULL || value == NULL) { return true; } if (strcmp(field, "RecordId") == 0) { ptr->RecordId = strtoul(value, NULL, 10); return false; } else if (strcmp(field, "RdrType") == 0) { ptr->RdrType = oSaHpiTypesEnums::str2rdrtype(value); return false; } // Entity else if (strcmp(field, "IsFru") == 0) { ptr->IsFru = oSaHpiTypesEnums::str2torf(value); return false; } // RdrTypeUnion // IdString return true; }; /** * Print the contents of the buffer. * * @param stream Target stream. * @param buffer Address of the SaHpiRdrT struct. * * @return True if there was an error, otherwise false. */ bool oSaHpiRdr::fprint(FILE *stream, const int indent, const SaHpiRdrT *buffer) { int i, err; char indent_buf[indent + 1]; if (stream == NULL || buffer == NULL) { return true; } for (i = 0; i < indent; i++) { indent_buf[i] = ' '; } indent_buf[indent] = '\0'; err = fprintf(stream, "%s", indent_buf); if (err < 0) { return true; } err = fprintf(stream, "RecordId = %d\n", buffer->RecordId); if (err < 0) { return true; } err = fprintf(stream, "%s", indent_buf); if (err < 0) { return true; } err = fprintf(stream, "RdrType = %s\n", oSaHpiTypesEnums::rdrtype2str(buffer->RdrType)); if (err < 0) { return true; } err = fprintf(stream, "%s", indent_buf); if (err < 0) { return true; } err = fprintf(stream, "Entity\n"); if (err < 0) { return true; } const SaHpiEntityPathT *ep = (const SaHpiEntityPathT *)&buffer->Entity; err = oSaHpiEntityPath::fprint(stream, indent + 3, ep); if (err < 0) { return true; } err = fprintf(stream, "%s", indent_buf); if (err < 0) { return true; } err = fprintf(stream, "IsFru = %s\n", oSaHpiTypesEnums::torf2str(buffer->IsFru)); if (err < 0) { return true; } err = fprintf(stream, "%s", indent_buf); if (err < 0) { return true; } err = fprintf(stream, "RdrTypeUnion\n"); if (err < 0) { return true; } switch (buffer->RdrType) { case SAHPI_CTRL_RDR: { const SaHpiCtrlRecT *cr = (const SaHpiCtrlRecT *)&buffer->RdrTypeUnion.CtrlRec; err = oSaHpiCtrlRec::fprint(stream, indent + 3, cr); if (err < 0) { return true; } break; } case SAHPI_SENSOR_RDR: { const SaHpiSensorRecT *sr = (const SaHpiSensorRecT *)&buffer->RdrTypeUnion.SensorRec; err = oSaHpiSensorRec::fprint(stream, indent + 3, sr); if (err < 0) { return true; } break; } case SAHPI_INVENTORY_RDR: { const SaHpiInventoryRecT *ir = (const SaHpiInventoryRecT *)&buffer->RdrTypeUnion.InventoryRec; err = oSaHpiInventoryRec::fprint(stream, indent + 3, ir); if (err < 0) { return true; } break; } case SAHPI_WATCHDOG_RDR: { const SaHpiWatchdogRecT *wr = (const SaHpiWatchdogRecT *)&buffer->RdrTypeUnion.WatchdogRec; err = oSaHpiWatchdogRec::fprint(stream, indent + 3, wr); if (err < 0) { return true; } break; } case SAHPI_ANNUNCIATOR_RDR: { const SaHpiAnnunciatorRecT *ar = (const SaHpiAnnunciatorRecT *)&buffer->RdrTypeUnion.AnnunciatorRec; err = oSaHpiAnnunciatorRec::fprint(stream, indent + 3, ar); if (err < 0) { return true; } break; } default: err = fprintf(stream, "%s", indent_buf); if (err < 0) { return true; } err = fprintf(stream, " No Record\n"); if (err < 0) { return true; } } err = fprintf(stream, "%s", indent_buf); if (err < 0) { return true; } err = fprintf(stream, "IdString\n"); if (err < 0) { return true; } const SaHpiTextBufferT *tb = (const SaHpiTextBufferT *)&buffer->IdString; err = oSaHpiTextBuffer::fprint(stream, indent + 3, tb); if (err < 0) { return true; } return false; } openhpi-2.14.1/cpp/oSaHpiHpiSwEvent.hpp0000644000076400007640000000310111302567022014615 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * W. David Ashley */ #ifndef Included_oSaHpiHpiSwEvent #define Included_oSaHpiHpiSwEvent #include extern "C" { #include } class oSaHpiHpiSwEvent : public SaHpiHpiSwEventT { public: // constructors oSaHpiHpiSwEvent(); // copy constructor oSaHpiHpiSwEvent(const oSaHpiHpiSwEvent& buf); // destructor ~oSaHpiHpiSwEvent() { } // other methods static bool assignField(SaHpiHpiSwEventT * ptr, const char *field, const char *value); inline bool assignField(const char *field, const char *value) { return assignField(this, field, value); } inline SaHpiHpiSwEventT *getStruct(void) { return this; } static bool fprint(FILE *stream, const int indent, const SaHpiHpiSwEventT *buffer); inline bool fprint(FILE *stream, const int indent) { return fprint(stream, indent, this); } }; #endif openhpi-2.14.1/cpp/oSaHpiSensorRange.hpp0000644000076400007640000000321411302567022015014 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * W. David Ashley */ #ifndef Included_oSaHpiSensorRange #define Included_oSaHpiSensorRange #include extern "C" { #include } #include "oSaHpiSensorReading.hpp" #include "oSaHpiSensorRange.hpp" class oSaHpiSensorRange : public SaHpiSensorRangeT { public: // constructors oSaHpiSensorRange(); // copy constructor oSaHpiSensorRange(const oSaHpiSensorRange& sr); // destructor ~oSaHpiSensorRange() { } // other methods static bool assignField(SaHpiSensorRangeT * ptr, const char *field, const char *value); inline bool assignField(const char *field, const char *value) { return assignField(this, field, value); } inline SaHpiSensorRangeT *getStruct(void) { return this; } static bool fprint(FILE *stream, const int indent, const SaHpiSensorRangeT *ent); inline bool fprint(FILE *stream, const int indent) { return fprint(stream, indent, this); } }; #endif openhpi-2.14.1/cpp/oSaHpiCtrlRecAnalog.cpp0000644000076400007640000000652611302567022015252 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * W. David Ashley */ #include #include #include extern "C" { #include } #include "oSaHpiTypesEnums.hpp" #include "oSaHpiCtrlRecAnalog.hpp" /** * Default constructor. */ oSaHpiCtrlRecAnalog::oSaHpiCtrlRecAnalog() { Min = 0; Max = 0; Default = 0; }; /** * Constructor. */ oSaHpiCtrlRecAnalog::oSaHpiCtrlRecAnalog(SaHpiCtrlStateAnalogT mn, SaHpiCtrlStateAnalogT mx, SaHpiCtrlStateAnalogT def) { Min = mn; Max = mx; Default = def; }; /** * Constructor. * * @param buf The reference to the class to be copied. */ oSaHpiCtrlRecAnalog::oSaHpiCtrlRecAnalog(const oSaHpiCtrlRecAnalog& ent) { memcpy(this, &ent, sizeof(SaHpiCtrlRecAnalogT)); } /** * Assign a field in the SaHpiCtrlRecAnalogT struct a value. * * @param field The pointer to the struct (class). * @param field The field name as a text string (case sensitive). * @param value The character string value to be assigned to the field. This * value will be converted as necessary. * * @return True if there was an error, otherwise false. */ bool oSaHpiCtrlRecAnalog::assignField(SaHpiCtrlRecAnalogT *ptr, const char *field, const char *value) { if (ptr == NULL || field == NULL || value == NULL) { return true; } if (strcmp(field, "Min") == 0) { ptr->Min = atoi(value); return false; } else if (strcmp(field, "Max") == 0) { ptr->Max = atoi(value); return false; } else if (strcmp(field, "Default") == 0) { ptr->Default = atoi(value); return false; } return true; }; /** * Print the contents of the entity. * * @param stream Target stream. * @param buffer Address of the SaHpiCtrlRecAnalogT struct. * * @return True if there was an error, otherwise false. */ bool oSaHpiCtrlRecAnalog::fprint(FILE *stream, const int indent, const SaHpiCtrlRecAnalogT *cra) { int i, err = 0; char indent_buf[indent + 1]; if (stream == NULL || cra == NULL) { return true; } for (i = 0; i < indent; i++) { indent_buf[i] = ' '; } indent_buf[indent] = '\0'; err = fprintf(stream, "%s", indent_buf); if (err < 0) { return true; } err = fprintf(stream, "Min = %d\n", cra->Min); if (err < 0) { return true; } err = fprintf(stream, "%s", indent_buf); if (err < 0) { return true; } err = fprintf(stream, "Max = %d\n", cra->Max); if (err < 0) { return true; } err = fprintf(stream, "%s", indent_buf); if (err < 0) { return true; } err = fprintf(stream, "Default = %d\n", cra->Default); if (err < 0) { return true; } return false; } openhpi-2.14.1/cpp/t/0000755000076400007640000000000011405006365011216 5ustar openhpi-2.14.1/cpp/t/Makefile.am0000644000076400007640000000731111302567022013252 0ustar # (C) Copyright IBM Corp 2005 # All rights reserved. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This # file and program are licensed under a BSD style license. See # the Copying file included with the OpenHPI distribution for # full licensing terms. MOSTLYCLEANFILES = @TEST_CLEAN@ INCLUDES = @OPENHPI_INCLUDES@ -I$(top_builddir)/cpp MAINTAINERCLEANFILES = Makefile.in TDEPLIB = $(top_builddir)/cpp/libosahpi.la TESTS = tSaHpiTextBuffer \ tSaHpiEntityPath \ tSaHpiSensorReading \ tSaHpiSensorThresholds \ tSaHpiSensorRec \ tSaHpiCtrlRec \ tSaHpiIdrField \ tSaHpiIdrAreaHeader \ tSaHpiIdrInfo \ tSaHpiInventoryRec \ tSaHpiWatchdog \ tSaHpiWatchdogRec \ tSaHpiAnnouncement \ tSaHpiAnnunciatorRec \ tSaHpiRdr \ tSaHpiSensorEvent \ tSaHpiSensorEnableChangeEvent \ tSaHpiHotSwapEvent \ tSaHpiWatchdogEvent \ tSaHpiHpiSwEvent \ tSaHpiOemEvent \ tSaHpiUserEvent \ tSaHpiEvent \ tSaHpiResourceInfo \ tSaHpiRptEntry \ tSaHpiDomainInfo \ tSaHpiDrtEntry \ tSaHpiAlarm \ tSaHpiEventLogInfo \ tSaHpiEventLogEntry check_PROGRAMS = $(TESTS) tSaHpiTextBuffer_SOURCES = tSaHpiTextBuffer.cpp tSaHpiTextBuffer_LDADD = $(TDEPLIB) tSaHpiEntityPath_SOURCES = tSaHpiEntityPath.cpp tSaHpiEntityPath_LDADD = $(TDEPLIB) tSaHpiSensorReading_SOURCES = tSaHpiSensorReading.cpp tSaHpiSensorReading_LDADD = $(TDEPLIB) tSaHpiSensorThresholds_SOURCES = tSaHpiSensorThresholds.cpp tSaHpiSensorThresholds_LDADD = $(TDEPLIB) tSaHpiSensorRec_SOURCES = tSaHpiSensorRec.cpp tSaHpiSensorRec_LDADD = $(TDEPLIB) tSaHpiCtrlRec_SOURCES = tSaHpiCtrlRec.cpp tSaHpiCtrlRec_LDADD = $(TDEPLIB) tSaHpiIdrField_SOURCES = tSaHpiIdrField.cpp tSaHpiIdrField_LDADD = $(TDEPLIB) tSaHpiIdrAreaHeader_SOURCES = tSaHpiIdrAreaHeader.cpp tSaHpiIdrAreaHeader_LDADD = $(TDEPLIB) tSaHpiIdrInfo_SOURCES = tSaHpiIdrInfo.cpp tSaHpiIdrInfo_LDADD = $(TDEPLIB) tSaHpiInventoryRec_SOURCES = tSaHpiInventoryRec.cpp tSaHpiInventoryRec_LDADD = $(TDEPLIB) tSaHpiWatchdog_SOURCES = tSaHpiWatchdog.cpp tSaHpiWatchdog_LDADD = $(TDEPLIB) tSaHpiWatchdogRec_SOURCES = tSaHpiWatchdogRec.cpp tSaHpiWatchdogRec_LDADD = $(TDEPLIB) tSaHpiAnnouncement_SOURCES = tSaHpiAnnouncement.cpp tSaHpiAnnouncement_LDADD = $(TDEPLIB) tSaHpiAnnunciatorRec_SOURCES = tSaHpiAnnunciatorRec.cpp tSaHpiAnnunciatorRec_LDADD = $(TDEPLIB) tSaHpiRdr_SOURCES = tSaHpiRdr.cpp tSaHpiRdr_LDADD = $(TDEPLIB) tSaHpiSensorEvent_SOURCES = tSaHpiSensorEvent.cpp tSaHpiSensorEvent_LDADD = $(TDEPLIB) tSaHpiSensorEnableChangeEvent_SOURCES = tSaHpiSensorEnableChangeEvent.cpp tSaHpiSensorEnableChangeEvent_LDADD = $(TDEPLIB) tSaHpiHotSwapEvent_SOURCES = tSaHpiHotSwapEvent.cpp tSaHpiHotSwapEvent_LDADD = $(TDEPLIB) tSaHpiWatchdogEvent_SOURCES = tSaHpiWatchdogEvent.cpp tSaHpiWatchdogEvent_LDADD = $(TDEPLIB) tSaHpiHpiSwEvent_SOURCES = tSaHpiHpiSwEvent.cpp tSaHpiHpiSwEvent_LDADD = $(TDEPLIB) tSaHpiOemEvent_SOURCES = tSaHpiOemEvent.cpp tSaHpiOemEvent_LDADD = $(TDEPLIB) tSaHpiUserEvent_SOURCES = tSaHpiUserEvent.cpp tSaHpiUserEvent_LDADD = $(TDEPLIB) tSaHpiEvent_SOURCES = tSaHpiEvent.cpp tSaHpiEvent_LDADD = $(TDEPLIB) tSaHpiResourceInfo_SOURCES = tSaHpiResourceInfo.cpp tSaHpiResourceInfo_LDADD = $(TDEPLIB) tSaHpiRptEntry_SOURCES = tSaHpiRptEntry.cpp tSaHpiRptEntry_LDADD = $(TDEPLIB) tSaHpiDomainInfo_SOURCES = tSaHpiDomainInfo.cpp tSaHpiDomainInfo_LDADD = $(TDEPLIB) tSaHpiDrtEntry_SOURCES = tSaHpiDrtEntry.cpp tSaHpiDrtEntry_LDADD = $(TDEPLIB) tSaHpiAlarm_SOURCES = tSaHpiAlarm.cpp tSaHpiAlarm_LDADD = $(TDEPLIB) tSaHpiEventLogInfo_SOURCES = tSaHpiEventLogInfo.cpp tSaHpiEventLogInfo_LDADD = $(TDEPLIB) tSaHpiEventLogEntry_SOURCES = tSaHpiEventLogEntry.cpp tSaHpiEventLogEntry_LDADD = $(TDEPLIB) openhpi-2.14.1/cpp/t/tSaHpiRptEntry.cpp0000644000076400007640000000214011302567022014615 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * W. David Ashley */ #include #include #include extern "C" { #include } #include "oSaHpiRptEntry.hpp" int main(int argc, char *argv[]) { oSaHpiRptEntry *ptr1; // create the first rpt entry ptr1 = new oSaHpiRptEntry; if (ptr1 == NULL) { printf("Error: Unable to create a oSaHpiRptEntry.\n"); return -1; } // print the contents of the first rpt entry fprintf(stdout, "\nSaHpiRptEntry\n"); if (ptr1->fprint(stdout, 3)) { printf("Error: Unable to print the buffer.\n"); return -1; } fprintf(stdout, "\n"); printf("Success!\n"); return 0; } openhpi-2.14.1/cpp/t/tSaHpiDrtEntry.cpp0000644000076400007640000000213611302567022014606 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * W. David Ashley */ #include #include #include extern "C" { #include } #include "oSaHpiDrtEntry.hpp" int main(int argc, char *argv[]) { oSaHpiDrtEntry *ptr1; // create the first DrtEntry ptr1 = new oSaHpiDrtEntry; if (ptr1 == NULL) { printf("Error: Unable to create a oSaHpiDrtEntry.\n"); return -1; } // print the contents of the first DrtEntry fprintf(stdout, "\nSaHpiDrtEntry\n"); if (ptr1->fprint(stdout, 3)) { printf("Error: Unable to print the buffer.\n"); return -1; } fprintf(stdout, "\n"); printf("Success!\n"); return 0; } openhpi-2.14.1/cpp/t/tSaHpiOemEvent.cpp0000644000076400007640000000214011302567022014550 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * W. David Ashley */ #include #include #include extern "C" { #include } #include "oSaHpiOemEvent.hpp" int main(int argc, char *argv[]) { oSaHpiOemEvent *ptr1; // create the first oem event ptr1 = new oSaHpiOemEvent; if (ptr1 == NULL) { printf("Error: Unable to create a oSaHpiOemEvent.\n"); return -1; } // print the contents of the first oem event fprintf(stdout, "\nSaHpiOemEvent\n"); if (ptr1->fprint(stdout, 3)) { printf("Error: Unable to print the buffer.\n"); return -1; } fprintf(stdout, "\n"); printf("Success!\n"); return 0; } openhpi-2.14.1/cpp/t/tSaHpiWatchdogRec.cpp0000644000076400007640000000216511302567022015227 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * W. David Ashley */ #include #include #include extern "C" { #include } #include "oSaHpiWatchdogRec.hpp" int main(int argc, char *argv[]) { oSaHpiWatchdogRec *ptr1; // create the first watchdog rec ptr1 = new oSaHpiWatchdogRec; if (ptr1 == NULL) { printf("Error: Unable to create a oSaHpiWatchdogRec.\n"); return -1; } // print the contents of the first watchdog rec fprintf(stdout, "\nSaHpiWatchdogRec\n"); if (ptr1->fprint(stdout, 3)) { printf("Error: Unable to print the buffer.\n"); return -1; } fprintf(stdout, "\n"); printf("Success!\n"); return 0; } openhpi-2.14.1/cpp/t/tSaHpiTextBuffer.cpp0000644000076400007640000000365111302567022015114 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * W. David Ashley */ #include #include #include extern "C" { #include } #include "oSaHpiTextBuffer.hpp" int main(int argc, char *argv[]) { oSaHpiTextBuffer *tb1, *tb2; // create the first text buffer tb1 = new oSaHpiTextBuffer; if (tb1 == NULL) { printf("Error: Unable to create a oSaHpiTextBuffer.\n"); return -1; } // append a string to the first text buffer if (tb1->append("My string")) { printf("Error: Unable to append a string to the buffer.\n"); return -1; } // copy the first text buffer to the second text buffer tb2 = new oSaHpiTextBuffer(*tb1); if (tb2 == NULL) { printf("Error: Unable to copy a oSaHpiTextBuffer.\n"); return -1; } // append a string to the second text buffer if (tb2->append(", more string")) { printf("Error: Unable to append a string to the new buffer.\n"); return -1; } // print the contents of the first text buffer fprintf(stdout, "\nSaHpiTextBuffer\n"); if (tb1->fprint(stdout, 3)) { printf("Error: Unable to print the buffer.\n"); return -1; } fprintf(stdout, "\n"); // print the contents of the second text buffer fprintf(stdout, "\nSaHpiTextBuffer\n"); if (tb2->fprint(stdout, 3)) { printf("Error: Unable to print the new buffer.\n"); return -1; } fprintf(stdout, "\n"); printf("Success!\n"); return 0; } openhpi-2.14.1/cpp/t/tSaHpiRdr.cpp0000644000076400007640000000461511302567022013566 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * W. David Ashley */ #include #include #include extern "C" { #include } #include "oSaHpiRdr.hpp" int main(int argc, char *argv[]) { oSaHpiRdr *ptr1; // create the first rdr ptr1 = new oSaHpiRdr; if (ptr1 == NULL) { printf("Error: Unable to create a oSaHpiRdr.\n"); return -1; } // print the contents of the first rdr fprintf(stdout, "\nSaHpiRdr\n"); if (ptr1->fprint(stdout, 3)) { printf("Error: Unable to print the buffer.\n"); return -1; } fprintf(stdout, "\n"); // modify the rdr ptr1->RdrType = SAHPI_CTRL_RDR; ptr1->RdrTypeUnion.CtrlRec.Num = 1; ptr1->RdrTypeUnion.CtrlRec.OutputType = SAHPI_CTRL_LCD_DISPLAY; ptr1->RdrTypeUnion.CtrlRec.Type = SAHPI_CTRL_TYPE_TEXT; ptr1->RdrTypeUnion.CtrlRec.TypeUnion.Text.MaxChars = 80; ptr1->RdrTypeUnion.CtrlRec.TypeUnion.Text.MaxLines = 1; ptr1->RdrTypeUnion.CtrlRec.TypeUnion.Text.Language = SAHPI_LANG_ENGLISH; ptr1->RdrTypeUnion.CtrlRec.TypeUnion.Text.DataType = SAHPI_TL_TYPE_TEXT; ptr1->RdrTypeUnion.CtrlRec.TypeUnion.Text.Default.Line = 1; ptr1->RdrTypeUnion.CtrlRec.TypeUnion.Text.Default.Text.Language = SAHPI_LANG_ENGLISH; ptr1->RdrTypeUnion.CtrlRec.TypeUnion.Text.Default.Text.DataType = SAHPI_TL_TYPE_TEXT; strcpy((char *)ptr1->RdrTypeUnion.CtrlRec.TypeUnion.Text.Default.Text.Data, "My string"); ptr1->RdrTypeUnion.CtrlRec.TypeUnion.Text.Default.Text.DataLength = 9; ptr1->RdrTypeUnion.CtrlRec.DefaultMode.Mode = SAHPI_CTRL_MODE_AUTO; ptr1->RdrTypeUnion.CtrlRec.DefaultMode.ReadOnly = true; ptr1->RdrTypeUnion.CtrlRec.WriteOnly = false; ptr1->RdrTypeUnion.CtrlRec.Oem = 9; // print the contents of the first rdr fprintf(stdout, "\nSaHpiRdr\n"); if (ptr1->fprint(stdout, 3)) { printf("Error: Unable to print the buffer.\n"); return -1; } fprintf(stdout, "\n"); printf("Success!\n"); return 0; } openhpi-2.14.1/cpp/t/tSaHpiCtrlRec.cpp0000644000076400007640000000213111302567022014364 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * W. David Ashley */ #include #include #include extern "C" { #include } #include "oSaHpiCtrlRec.hpp" int main(int argc, char *argv[]) { oSaHpiCtrlRec *ptr1; // create the first ctrl rec ptr1 = new oSaHpiCtrlRec; if (ptr1 == NULL) { printf("Error: Unable to create a oSaHpiCtrlRec.\n"); return -1; } // print the contents of the first ctrl rec fprintf(stdout, "\nSaHpiCtrlRec\n"); if (ptr1->fprint(stdout, 3)) { printf("Error: Unable to print the buffer.\n"); return -1; } fprintf(stdout, "\n"); printf("Success!\n"); return 0; } openhpi-2.14.1/cpp/t/tSaHpiSensorThresholds.cpp0000644000076400007640000000316311302567022016345 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * W. David Ashley */ #include #include #include extern "C" { #include } #include "oSaHpiSensorReading.hpp" #include "oSaHpiSensorThresholds.hpp" int main(int argc, char *argv[]) { oSaHpiSensorThresholds *th; // create the sensor thresholds th = new oSaHpiSensorThresholds; if (th == NULL) { printf("Error: Unable to create a oSaHpiSensorThresholds.\n"); return -1; } // print the contents of the sensor thresholds fprintf(stdout, "\nSaHpiSensorThresholds\n"); if (th->fprint(stdout, 3)) { printf("Error: Unable to print the sensor thresholds.\n"); return -1; } fprintf(stdout, "\n"); // set the LowCritical sensor threshold th->LowCritical.IsSupported = true; th->LowCritical.Type = SAHPI_SENSOR_READING_TYPE_FLOAT64; th->LowCritical.Value.SensorFloat64 = -21; // print the contents of the sensor thresholds fprintf(stdout, "\nSaHpiSensorThresholds\n"); if (th->fprint(stdout, 3)) { printf("Error: Unable to print the sensor thresholds.\n"); return -1; } fprintf(stdout, "\n"); printf("Success!\n"); return 0; } openhpi-2.14.1/cpp/t/tSaHpiIdrInfo.cpp0000644000076400007640000000213111302567022014360 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * W. David Ashley */ #include #include #include extern "C" { #include } #include "oSaHpiIdrInfo.hpp" int main(int argc, char *argv[]) { oSaHpiIdrInfo *ptr1; // create the first idr info ptr1 = new oSaHpiIdrInfo; if (ptr1 == NULL) { printf("Error: Unable to create a oSaHpiIdrInfo.\n"); return -1; } // print the contents of the first idr info fprintf(stdout, "\nSaHpiIdrInfo\n"); if (ptr1->fprint(stdout, 3)) { printf("Error: Unable to print the buffer.\n"); return -1; } fprintf(stdout, "\n"); printf("Success!\n"); return 0; } openhpi-2.14.1/cpp/t/tSaHpiEvent.cpp0000644000076400007640000000211111302567022014105 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * W. David Ashley */ #include #include #include extern "C" { #include } #include "oSaHpiEvent.hpp" int main(int argc, char *argv[]) { oSaHpiEvent *ptr1; // create the first event ptr1 = new oSaHpiEvent; if (ptr1 == NULL) { printf("Error: Unable to create a oSaHpiEvent.\n"); return -1; } // print the contents of the first event fprintf(stdout, "\nSaHpiEvent\n"); if (ptr1->fprint(stdout, 3)) { printf("Error: Unable to print the buffer.\n"); return -1; } fprintf(stdout, "\n"); printf("Success!\n"); return 0; } openhpi-2.14.1/cpp/t/tSaHpiAnnunciatorRec.cpp0000644000076400007640000000221211302567022015741 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * W. David Ashley */ #include #include #include extern "C" { #include } #include "oSaHpiAnnunciatorRec.hpp" int main(int argc, char *argv[]) { oSaHpiAnnunciatorRec *ptr1; // create the first annunciator rec ptr1 = new oSaHpiAnnunciatorRec; if (ptr1 == NULL) { printf("Error: Unable to create a oSaHpiAnnunciatorRec.\n"); return -1; } // print the contents of the first annunciator rec fprintf(stdout, "\nSaHpiAnnunciatorRec\n"); if (ptr1->fprint(stdout, 3)) { printf("Error: Unable to print the buffer.\n"); return -1; } fprintf(stdout, "\n"); printf("Success!\n"); return 0; } openhpi-2.14.1/cpp/t/tSaHpiSensorEnableChangeEvent.cpp0000644000076400007640000000231511302567022017522 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * W. David Ashley */ #include #include #include extern "C" { #include } #include "oSaHpiSensorEnableChangeEvent.hpp" int main(int argc, char *argv[]) { oSaHpiSensorEnableChangeEvent *ptr1; // create the first sensor enable change event ptr1 = new oSaHpiSensorEnableChangeEvent; if (ptr1 == NULL) { printf("Error: Unable to create a oSaHpiSensorEnableChangeEvent.\n"); return -1; } // print the contents of the first sensor enable change event fprintf(stdout, "\nSaHpiSensorEnableChangeEvent\n"); if (ptr1->fprint(stdout, 3)) { printf("Error: Unable to print the buffer.\n"); return -1; } fprintf(stdout, "\n"); printf("Success!\n"); return 0; } openhpi-2.14.1/cpp/t/tSaHpiEventLogEntry.cpp0000644000076400007640000000220111302567022015571 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * W. David Ashley */ #include #include #include extern "C" { #include } #include "oSaHpiEventLogEntry.hpp" int main(int argc, char *argv[]) { oSaHpiEventLogEntry *ptr1; // create the first EventLogEntry ptr1 = new oSaHpiEventLogEntry; if (ptr1 == NULL) { printf("Error: Unable to create a oSaHpiEventLogEntry.\n"); return -1; } // print the contents of the first EventLogEntry fprintf(stdout, "\nSaHpiEventLogEntry\n"); if (ptr1->fprint(stdout, 3)) { printf("Error: Unable to print the buffer.\n"); return -1; } fprintf(stdout, "\n"); printf("Success!\n"); return 0; } openhpi-2.14.1/cpp/t/tSaHpiSensorReading.cpp0000644000076400007640000000341111302567022015573 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * W. David Ashley */ #include #include #include extern "C" { #include } #include "oSaHpiSensorReading.hpp" int main(int argc, char *argv[]) { oSaHpiSensorReading *sr1, *sr2; // create the first text buffer sr1 = new oSaHpiSensorReading; if (sr1 == NULL) { printf("Error: Unable to create a oSaHpiSensorReading.\n"); return -1; } // copy the first sensor reading to the second sensor reading sr2 = new oSaHpiSensorReading(*sr1); if (sr2 == NULL) { printf("Error: Unable to copy a oSaHpiSensorReading.\n"); return -1; } // print the contents of the first sensor reading fprintf(stdout, "\nSaHpiSensorReading\n"); if (sr1->fprint(stdout, 3)) { printf("Error: Unable to print the buffer.\n"); return -1; } fprintf(stdout, "\n"); // change the second sensor reading sr2->IsSupported = true; sr2->Type = SAHPI_SENSOR_READING_TYPE_BUFFER; strcpy((char *)sr2->Value.SensorBuffer, "My string"); // print the contents of the second text buffer fprintf(stdout, "\nSaHpiSensorReading\n"); if (sr2->fprint(stdout, 3)) { printf("Error: Unable to print the new buffer.\n"); return -1; } fprintf(stdout, "\n"); printf("Success!\n"); return 0; } openhpi-2.14.1/cpp/t/tSaHpiSensorEvent.cpp0000644000076400007640000000216511302567022015310 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * W. David Ashley */ #include #include #include extern "C" { #include } #include "oSaHpiSensorEvent.hpp" int main(int argc, char *argv[]) { oSaHpiSensorEvent *ptr1; // create the first sensor event ptr1 = new oSaHpiSensorEvent; if (ptr1 == NULL) { printf("Error: Unable to create a oSaHpiSensorEvent.\n"); return -1; } // print the contents of the first sensor event fprintf(stdout, "\nSaHpiSensorEvent\n"); if (ptr1->fprint(stdout, 3)) { printf("Error: Unable to print the buffer.\n"); return -1; } fprintf(stdout, "\n"); printf("Success!\n"); return 0; } openhpi-2.14.1/cpp/t/tSaHpiWatchdog.cpp0000644000076400007640000000213611302567022014573 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * W. David Ashley */ #include #include #include extern "C" { #include } #include "oSaHpiWatchdog.hpp" int main(int argc, char *argv[]) { oSaHpiWatchdog *ptr1; // create the first watchdog ptr1 = new oSaHpiWatchdog; if (ptr1 == NULL) { printf("Error: Unable to create a oSaHpiWatchdog.\n"); return -1; } // print the contents of the first watchdog fprintf(stdout, "\nSaHpiWatchdog\n"); if (ptr1->fprint(stdout, 3)) { printf("Error: Unable to print the buffer.\n"); return -1; } fprintf(stdout, "\n"); printf("Success!\n"); return 0; } openhpi-2.14.1/cpp/t/tSaHpiResourceInfo.cpp0000644000076400007640000000217411302567022015440 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * W. David Ashley */ #include #include #include extern "C" { #include } #include "oSaHpiResourceInfo.hpp" int main(int argc, char *argv[]) { oSaHpiResourceInfo *ptr1; // create the first resource info ptr1 = new oSaHpiResourceInfo; if (ptr1 == NULL) { printf("Error: Unable to create a oSaHpiResourceInfo.\n"); return -1; } // print the contents of the first resource info fprintf(stdout, "\nSaHpiResourceInfo\n"); if (ptr1->fprint(stdout, 3)) { printf("Error: Unable to print the buffer.\n"); return -1; } fprintf(stdout, "\n"); printf("Success!\n"); return 0; } openhpi-2.14.1/cpp/t/tSaHpiEntityPath.cpp0000644000076400007640000000450711302567022015130 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * W. David Ashley */ #include #include #include extern "C" { #include } #include "oSaHpiEntityPath.hpp" int main(int argc, char *argv[]) { oSaHpiEntityPath *ent1, *ent2; // create the first entity path ent1 = new oSaHpiEntityPath; if (ent1 == NULL) { printf("Error: Unable to create a oSaHpiEntityPath.\n"); return -1; } // set the initial entity path ent1->Entry[0].EntityType = SAHPI_ENT_SYSTEM_CHASSIS; ent1->Entry[0].EntityLocation = 1; // print the contents of the first entity path fprintf(stdout, "\nSaHpiEntityPath\n"); if (ent1->fprint(stdout, 3)) { printf("Error: Unable to print the entity path.\n"); return -1; } fprintf(stdout, "\n"); // create the second entity path ent2 = new oSaHpiEntityPath; if (ent2 == NULL) { printf("Error: Unable to create a second oSaHpiEntityPath.\n"); return -1; } // set the second initial entity path ent2->Entry[0].EntityType = SAHPI_ENT_PROCESSOR; ent2->Entry[0].EntityLocation = 1; // append the second entity pathe to the first ent1->append(ent2); // print the contents of the first appended entity path fprintf(stdout, "\nSaHpiEntityPath\n"); if (ent1->fprint(stdout, 3)) { printf("Error: Unable to print the entity path.\n"); return -1; } fprintf(stdout, "\n"); // now compare the two entity paths if (ent1->compare(ent2) == true) { printf("Error: The two entity paths should not be equal.\n"); return -1; } // copy the first to the second delete ent2; ent2 = new oSaHpiEntityPath(*ent1); // now compare the two entity paths if (ent1->compare(ent2) == false) { printf("Error: The two entity paths are not equal.\n"); return -1; } printf("Success!\n"); return 0; } openhpi-2.14.1/cpp/t/tSaHpiUserEvent.cpp0000644000076400007640000000214711302567022014755 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * W. David Ashley */ #include #include #include extern "C" { #include } #include "oSaHpiUserEvent.hpp" int main(int argc, char *argv[]) { oSaHpiUserEvent *ptr1; // create the first user event ptr1 = new oSaHpiUserEvent; if (ptr1 == NULL) { printf("Error: Unable to create a oSaHpiUserEvent.\n"); return -1; } // print the contents of the first user event fprintf(stdout, "\nSaHpiUserEvent\n"); if (ptr1->fprint(stdout, 3)) { printf("Error: Unable to print the buffer.\n"); return -1; } fprintf(stdout, "\n"); printf("Success!\n"); return 0; } openhpi-2.14.1/cpp/t/tSaHpiInventoryRec.cpp0000644000076400007640000000217411302567022015464 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * W. David Ashley */ #include #include #include extern "C" { #include } #include "oSaHpiInventoryRec.hpp" int main(int argc, char *argv[]) { oSaHpiInventoryRec *ptr1; // create the first inventory rec ptr1 = new oSaHpiInventoryRec; if (ptr1 == NULL) { printf("Error: Unable to create a oSaHpiInventoryRec.\n"); return -1; } // print the contents of the first inventory rec fprintf(stdout, "\nSaHpiInventoryRec\n"); if (ptr1->fprint(stdout, 3)) { printf("Error: Unable to print the buffer.\n"); return -1; } fprintf(stdout, "\n"); printf("Success!\n"); return 0; } openhpi-2.14.1/cpp/t/tSaHpiWatchdogEvent.cpp0000644000076400007640000000220311302567022015570 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * W. David Ashley */ #include #include #include extern "C" { #include } #include "oSaHpiWatchdogEvent.hpp" int main(int argc, char *argv[]) { oSaHpiWatchdogEvent *ptr1; // create the first watchdog event ptr1 = new oSaHpiWatchdogEvent; if (ptr1 == NULL) { printf("Error: Unable to create a oSaHpiWatchdogEvent.\n"); return -1; } // print the contents of the first watchdog event fprintf(stdout, "\nSaHpiWatchdogEvent\n"); if (ptr1->fprint(stdout, 3)) { printf("Error: Unable to print the buffer.\n"); return -1; } fprintf(stdout, "\n"); printf("Success!\n"); return 0; } openhpi-2.14.1/cpp/t/tSaHpiIdrField.cpp0000644000076400007640000000214011302567022014510 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * W. David Ashley */ #include #include #include extern "C" { #include } #include "oSaHpiIdrField.hpp" int main(int argc, char *argv[]) { oSaHpiIdrField *ptr1; // create the first idr field ptr1 = new oSaHpiIdrField; if (ptr1 == NULL) { printf("Error: Unable to create a oSaHpiIdrField.\n"); return -1; } // print the contents of the first idr field fprintf(stdout, "\nSaHpiIdrField\n"); if (ptr1->fprint(stdout, 3)) { printf("Error: Unable to print the buffer.\n"); return -1; } fprintf(stdout, "\n"); printf("Success!\n"); return 0; } openhpi-2.14.1/cpp/t/tSaHpiIdrAreaHeader.cpp0000644000076400007640000000220511302567022015450 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * W. David Ashley */ #include #include #include extern "C" { #include } #include "oSaHpiIdrAreaHeader.hpp" int main(int argc, char *argv[]) { oSaHpiIdrAreaHeader *ptr1; // create the first idr area header ptr1 = new oSaHpiIdrAreaHeader; if (ptr1 == NULL) { printf("Error: Unable to create a oSaHpiIdrAreaHeader.\n"); return -1; } // print the contents of the first idr area header fprintf(stdout, "\nSaHpiIdrAreaHeader\n"); if (ptr1->fprint(stdout, 3)) { printf("Error: Unable to print the buffer.\n"); return -1; } fprintf(stdout, "\n"); printf("Success!\n"); return 0; } openhpi-2.14.1/cpp/t/tSaHpiHpiSwEvent.cpp0000644000076400007640000000216011302567022015064 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * W. David Ashley */ #include #include #include extern "C" { #include } #include "oSaHpiHpiSwEvent.hpp" int main(int argc, char *argv[]) { oSaHpiHpiSwEvent *ptr1; // create the first hpi sw event ptr1 = new oSaHpiHpiSwEvent; if (ptr1 == NULL) { printf("Error: Unable to create a oSaHpiHpiSwEvent.\n"); return -1; } // print the contents of the first hpi sw event fprintf(stdout, "\nSaHpiHpiSwEvent\n"); if (ptr1->fprint(stdout, 3)) { printf("Error: Unable to print the buffer.\n"); return -1; } fprintf(stdout, "\n"); printf("Success!\n"); return 0; } openhpi-2.14.1/cpp/t/tSaHpiHotSwapEvent.cpp0000644000076400007640000000217611302567022015426 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * W. David Ashley */ #include #include #include extern "C" { #include } #include "oSaHpiHotSwapEvent.hpp" int main(int argc, char *argv[]) { oSaHpiHotSwapEvent *ptr1; // create the first hot swap event ptr1 = new oSaHpiHotSwapEvent; if (ptr1 == NULL) { printf("Error: Unable to create a oSaHpiHotSwapEvent.\n"); return -1; } // print the contents of the first hot swap event fprintf(stdout, "\nSaHpiHotSwapEvent\n"); if (ptr1->fprint(stdout, 3)) { printf("Error: Unable to print the buffer.\n"); return -1; } fprintf(stdout, "\n"); printf("Success!\n"); return 0; } openhpi-2.14.1/cpp/t/tSaHpiDomainInfo.cpp0000644000076400007640000000215611302567022015060 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * W. David Ashley */ #include #include #include extern "C" { #include } #include "oSaHpiDomainInfo.hpp" int main(int argc, char *argv[]) { oSaHpiDomainInfo *ptr1; // create the first domain info ptr1 = new oSaHpiDomainInfo; if (ptr1 == NULL) { printf("Error: Unable to create a oSaHpiDomainInfo.\n"); return -1; } // print the contents of the first domain info fprintf(stdout, "\nSaHpiDomainInfo\n"); if (ptr1->fprint(stdout, 3)) { printf("Error: Unable to print the buffer.\n"); return -1; } fprintf(stdout, "\n"); printf("Success!\n"); return 0; } openhpi-2.14.1/cpp/t/tSaHpiSensorRec.cpp0000644000076400007640000000214311302567022014734 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * W. David Ashley */ #include #include #include extern "C" { #include } #include "oSaHpiSensorRec.hpp" int main(int argc, char *argv[]) { oSaHpiSensorRec *sr1; // create the first sensor rec sr1 = new oSaHpiSensorRec; if (sr1 == NULL) { printf("Error: Unable to create a oSaHpiSensorRec.\n"); return -1; } // print the contents of the first sensor rec fprintf(stdout, "\nSaHpiSensorRec\n"); if (sr1->fprint(stdout, 3)) { printf("Error: Unable to print the buffer.\n"); return -1; } fprintf(stdout, "\n"); printf("Success!\n"); return 0; } openhpi-2.14.1/cpp/t/tSaHpiAnnouncement.cpp0000644000076400007640000000217211302567022015465 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * W. David Ashley */ #include #include #include extern "C" { #include } #include "oSaHpiAnnouncement.hpp" int main(int argc, char *argv[]) { oSaHpiAnnouncement *ptr1; // create the first announcement ptr1 = new oSaHpiAnnouncement; if (ptr1 == NULL) { printf("Error: Unable to create a oSaHpiAnnouncement.\n"); return -1; } // print the contents of the first announcement fprintf(stdout, "\nSaHpiAnnouncement\n"); if (ptr1->fprint(stdout, 3)) { printf("Error: Unable to print the buffer.\n"); return -1; } fprintf(stdout, "\n"); printf("Success!\n"); return 0; } openhpi-2.14.1/cpp/t/tSaHpiEventLogInfo.cpp0000644000076400007640000000217211302567022015372 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * W. David Ashley */ #include #include #include extern "C" { #include } #include "oSaHpiEventLogInfo.hpp" int main(int argc, char *argv[]) { oSaHpiEventLogInfo *ptr1; // create the first EventLogInfo ptr1 = new oSaHpiEventLogInfo; if (ptr1 == NULL) { printf("Error: Unable to create a oSaHpiEventLogInfo.\n"); return -1; } // print the contents of the first EventLogInfo fprintf(stdout, "\nSaHpiEventLogInfo\n"); if (ptr1->fprint(stdout, 3)) { printf("Error: Unable to print the buffer.\n"); return -1; } fprintf(stdout, "\n"); printf("Success!\n"); return 0; } openhpi-2.14.1/cpp/t/tSaHpiAlarm.cpp0000644000076400007640000000211111302567022014060 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * W. David Ashley */ #include #include #include extern "C" { #include } #include "oSaHpiAlarm.hpp" int main(int argc, char *argv[]) { oSaHpiAlarm *ptr1; // create the first Alarm ptr1 = new oSaHpiAlarm; if (ptr1 == NULL) { printf("Error: Unable to create a oSaHpiAlarm.\n"); return -1; } // print the contents of the first Alarm fprintf(stdout, "\nSaHpiAlarm\n"); if (ptr1->fprint(stdout, 3)) { printf("Error: Unable to print the buffer.\n"); return -1; } fprintf(stdout, "\n"); printf("Success!\n"); return 0; } openhpi-2.14.1/cpp/oSaHpiHotSwapEvent.cpp0000644000076400007640000000601511302567022015152 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * W. David Ashley */ #include #include #include extern "C" { #include } #include "oSaHpiTypesEnums.hpp" #include "oSaHpiHotSwapEvent.hpp" /** * Default constructor. */ oSaHpiHotSwapEvent::oSaHpiHotSwapEvent() { HotSwapState = SAHPI_HS_STATE_ACTIVE; PreviousHotSwapState = SAHPI_HS_STATE_NOT_PRESENT; }; /** * Constructor. * * @param buf The reference to the class to be copied. */ oSaHpiHotSwapEvent::oSaHpiHotSwapEvent(const oSaHpiHotSwapEvent& range) { memcpy(this, &range, sizeof(SaHpiHotSwapEventT)); } /** * Assign a field in the SaHpiHotSwapEventT struct a value. * * @param field The pointer to the struct (class). * @param field The field name as a text string (case sensitive). * @param value The character string value to be assigned to the field. This * value will be converted as necessary. * * @return True if there was an error, otherwise false. */ bool oSaHpiHotSwapEvent::assignField(SaHpiHotSwapEventT *ptr, const char *field, const char *value) { if (ptr == NULL || field == NULL || value == NULL) { return true; } if (strcmp(field, "HotSwapState") == 0) { ptr->HotSwapState = oSaHpiTypesEnums::str2hsstate(value); return false; } else if (strcmp(field, "PreviousHotSwapState") == 0) { ptr->PreviousHotSwapState = oSaHpiTypesEnums::str2hsstate(value); return false; } return true; }; /** * Print the contents of the entity. * * @param stream Target stream. * @param buffer Address of the SaHpiHotSwapEventT struct. * * @return True if there was an error, otherwise false. */ bool oSaHpiHotSwapEvent::fprint(FILE *stream, const int indent, const SaHpiHotSwapEventT *hse) { int i, err = 0; char indent_buf[indent + 1]; if (stream == NULL || hse == NULL) { return true; } for (i = 0; i < indent; i++) { indent_buf[i] = ' '; } indent_buf[indent] = '\0'; err = fprintf(stream, "%s", indent_buf); if (err < 0) { return true; } err = fprintf(stream, "HotSwapState = %s\n", oSaHpiTypesEnums::hsstate2str(hse->HotSwapState)); if (err < 0) { return true; } err = fprintf(stream, "%s", indent_buf); if (err < 0) { return true; } err = fprintf(stream, "PreviousHotSwapState = %s\n", oSaHpiTypesEnums::hsstate2str(hse->PreviousHotSwapState)); if (err < 0) { return true; } return false; } openhpi-2.14.1/cpp/oSaHpiTextBuffer.hpp0000644000076400007640000000470011302567022014645 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * W. David Ashley */ #ifndef Included_oSaHpiTextBuffer #define Included_oSaHpiTextBuffer #include extern "C" { #include } class oSaHpiTextBuffer : public SaHpiTextBufferT { public: // constructors oSaHpiTextBuffer(); oSaHpiTextBuffer(const SaHpiTextTypeT type, const SaHpiLanguageT lang); oSaHpiTextBuffer(const SaHpiTextTypeT type, const SaHpiLanguageT lang, const char *str); oSaHpiTextBuffer(const SaHpiTextTypeT type, const SaHpiLanguageT lang, const void *str, const SaHpiUint8T len); // copy constructor oSaHpiTextBuffer(const oSaHpiTextBuffer& buf); // destructor ~oSaHpiTextBuffer() { } // other methods bool append(SaHpiTextBufferT *ptr, const char *str); inline bool append(const char *str) { return append(this, str); } bool append(SaHpiTextBufferT *ptr, const void *str, const SaHpiUint8T len); inline bool append(const void *str, const SaHpiUint8T len) { return append(this, str, len); } static bool assignField(SaHpiTextBufferT * ptr, const char *field, const char *value); inline bool assignField(const char *field, const char *value) { return assignField(this, field, value); } inline SaHpiTextBufferT *getStruct(void) { return this; } static bool fprint(FILE *stream, const int indent, const SaHpiTextBufferT *buffer); inline bool fprint(FILE *stream, const int indent) { return fprint(stream, indent, this); } }; #endif openhpi-2.14.1/cpp/oSaHpiName.hpp0000644000076400007640000000316311302567022013451 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * W. David Ashley */ #ifndef Included_oSaHpiName #define Included_oSaHpiName #include extern "C" { #include } class oSaHpiName : public SaHpiNameT { public: // constructors oSaHpiName(); oSaHpiName(const char *str); oSaHpiName(const void *str, const SaHpiUint8T len); // copy constructor oSaHpiName(const oSaHpiName& buf); // destructor ~oSaHpiName() { } // other methods static bool assignField(SaHpiNameT * ptr, const char *field, const char *value); inline bool assignField(const char *field, const char *value) { return assignField(this, field, value); } inline SaHpiNameT *getStruct(void) { return this; } static bool fprint(FILE *stream, const int indent, const SaHpiNameT *buffer); inline bool fprint(FILE *stream, const int indent) { return fprint(stream, indent, this); } }; #endif openhpi-2.14.1/cpp/oSaHpiSensorEnableChangeEvent.hpp0000644000076400007640000000331411302567022017257 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * W. David Ashley */ #ifndef Included_oSaHpiSensorEnableChangeEvent #define Included_oSaHpiSensorEnableChangeEvent #include extern "C" { #include } class oSaHpiSensorEnableChangeEvent : public SaHpiSensorEnableChangeEventT { public: // constructors oSaHpiSensorEnableChangeEvent(); // copy constructor oSaHpiSensorEnableChangeEvent(const oSaHpiSensorEnableChangeEvent& sr); // destructor ~oSaHpiSensorEnableChangeEvent() { } // other methods static bool assignField(SaHpiSensorEnableChangeEventT * ptr, const char *field, const char *value); inline bool assignField(const char *field, const char *value) { return assignField(this, field, value); } inline SaHpiSensorEnableChangeEventT *getStruct(void) { return this; } static bool fprint(FILE *stream, const int indent, const SaHpiSensorEnableChangeEventT *ent); inline bool fprint(FILE *stream, const int indent) { return fprint(stream, indent, this); } }; #endif openhpi-2.14.1/cpp/oSaHpiAnnouncement.hpp0000644000076400007640000000312711302567022015223 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * W. David Ashley */ #ifndef Included_oSaHpiAnnouncement #define Included_oSaHpiAnnouncement #include extern "C" { #include } class oSaHpiAnnouncement : public SaHpiAnnouncementT { public: // constructors oSaHpiAnnouncement(); // copy constructor oSaHpiAnnouncement(const oSaHpiAnnouncement& buf); // destructor ~oSaHpiAnnouncement() { } // other methods static bool assignField(SaHpiAnnouncementT * ptr, const char *field, const char *value); inline bool assignField(const char *field, const char *value) { return assignField(this, field, value); } inline SaHpiAnnouncementT *getStruct(void) { return this; } static bool fprint(FILE *stream, const int indent, const SaHpiAnnouncementT *buffer); inline bool fprint(FILE *stream, const int indent) { return fprint(stream, indent, this); } }; #endif openhpi-2.14.1/cpp/oSaHpiWatchdog.hpp0000644000076400007640000000305311302567022014327 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * W. David Ashley */ #ifndef Included_oSaHpiWatchdog #define Included_oSaHpiWatchdog #include extern "C" { #include } class oSaHpiWatchdog : public SaHpiWatchdogT { public: // constructors oSaHpiWatchdog(); // copy constructor oSaHpiWatchdog(const oSaHpiWatchdog& buf); // destructor ~oSaHpiWatchdog() { } // other methods static bool assignField(SaHpiWatchdogT * ptr, const char *field, const char *value); inline bool assignField(const char *field, const char *value) { return assignField(this, field, value); } inline SaHpiWatchdogT *getStruct(void) { return this; } static bool fprint(FILE *stream, const int indent, const SaHpiWatchdogT *buffer); inline bool fprint(FILE *stream, const int indent) { return fprint(stream, indent, this); } }; #endif openhpi-2.14.1/cpp/oSaHpiEntityPath.hpp0000644000076400007640000000332511302567022014662 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * W. David Ashley */ #ifndef Included_oSaHpiEntityPath #define Included_oSaHpiEntityPath #include extern "C" { #include } class oSaHpiEntityPath : public SaHpiEntityPathT { public: // constructors oSaHpiEntityPath(); // copy constructor oSaHpiEntityPath(const oSaHpiEntityPath& entpath); // destructor ~oSaHpiEntityPath() { } // other methods inline SaHpiEntityPathT *getStruct(void) { return this; } static bool fprint(FILE *stream, const int indent, const SaHpiEntityPathT *entpath); inline bool fprint(FILE *stream, const int indent) { return fprint(stream, indent, this); } bool append(SaHpiEntityPathT *destpath, const SaHpiEntityPathT *appendpath); inline bool append(SaHpiEntityPathT *appendpath) { return append((SaHpiEntityPathT *)this, appendpath); } bool compare(const SaHpiEntityPathT *ep1, const SaHpiEntityPathT *ep2); inline bool compare(const SaHpiEntityPathT *ep2) { return compare((SaHpiEntityPathT *)this, ep2); } }; #endif openhpi-2.14.1/cpp/oSaHpiCtrlState.hpp0000644000076400007640000000306211302567022014474 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * W. David Ashley */ #ifndef Included_oSaHpiCtrlState #define Included_oSaHpiCtrlState #include extern "C" { #include } class oSaHpiCtrlState : public SaHpiCtrlStateT { public: // constructors oSaHpiCtrlState(); // copy constructor oSaHpiCtrlState(const oSaHpiCtrlState& sr); // destructor ~oSaHpiCtrlState() { } // other methods static bool assignField(SaHpiCtrlStateT * ptr, const char *field, const char *value); inline bool assignField(const char *field, const char *value) { return assignField(this, field, value); } inline SaHpiCtrlStateT *getStruct(void) { return this; } static bool fprint(FILE *stream, const int indent, const SaHpiCtrlStateT *ent); inline bool fprint(FILE *stream, const int indent) { return fprint(stream, indent, this); } }; #endif openhpi-2.14.1/cpp/oSaHpiSensorThdDefn.hpp0000644000076400007640000000313611302567022015277 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * W. David Ashley */ #ifndef Included_oSaHpiSensorThdDefn #define Included_oSaHpiSensorThdDefn #include extern "C" { #include } class oSaHpiSensorThdDefn : public SaHpiSensorThdDefnT { public: // constructors oSaHpiSensorThdDefn(); // copy constructor oSaHpiSensorThdDefn(const oSaHpiSensorThdDefn& sr); // destructor ~oSaHpiSensorThdDefn() { } // other methods static bool assignField(SaHpiSensorThdDefnT * ptr, const char *field, const char *value); inline bool assignField(const char *field, const char *value) { return assignField(this, field, value); } inline SaHpiSensorThdDefnT *getStruct(void) { return this; } static bool fprint(FILE *stream, const int indent, const SaHpiSensorThdDefnT *ent); inline bool fprint(FILE *stream, const int indent) { return fprint(stream, indent, this); } }; #endif openhpi-2.14.1/cpp/oSaHpiCtrlStateStream.cpp0000644000076400007640000001125011302567022015641 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * W. David Ashley */ #include #include #include extern "C" { #include } #include "oSaHpiTypesEnums.hpp" #include "oSaHpiCtrlStateStream.hpp" /** * Default constructor. */ oSaHpiCtrlStateStream::oSaHpiCtrlStateStream() { Repeat = false; StreamLength = 0; Stream[0] = '\0'; }; /** * Constructor. * * @param type The repeat boolean. * @param str The zero-terminated character string to be assigned to the * stream. */ oSaHpiCtrlStateStream::oSaHpiCtrlStateStream(const SaHpiBoolT rep, const char *str) { Repeat = rep; if (strlen(str) < SAHPI_CTRL_MAX_STREAM_LENGTH) { StreamLength = strlen(str); strcpy((char *)Stream, str); } else { StreamLength = SAHPI_CTRL_MAX_STREAM_LENGTH; memcpy(Stream, str, SAHPI_CTRL_MAX_STREAM_LENGTH); } }; /** * Constructor. * * @param type The repeat boolean. * @param str The data to be assigned to the stream. * @param len The length of the data to be assigned to the stream. */ oSaHpiCtrlStateStream::oSaHpiCtrlStateStream(const SaHpiBoolT rep, const void *str, const SaHpiUint8T len) { Repeat = rep; if (len <= SAHPI_CTRL_MAX_STREAM_LENGTH) { StreamLength = len; memcpy(Stream, str, len); } else { StreamLength = SAHPI_CTRL_MAX_STREAM_LENGTH; memcpy(Stream, str, SAHPI_CTRL_MAX_STREAM_LENGTH); } }; /** * Constructor. * * @param buf The reference to the class to be copied. */ oSaHpiCtrlStateStream::oSaHpiCtrlStateStream(const oSaHpiCtrlStateStream& buf) { memcpy(this, &buf, sizeof(SaHpiCtrlStateStreamT)); } /** * Assign a field in the SaHpiCtrlStateStreamT struct a value. * * @param field The pointer to the struct (class). * @param field The field name as a text string (case sensitive). * @param value The character string value to be assigned to the field. This * value will be converted as necessary. * * @return True if there was an error, otherwise false. */ bool oSaHpiCtrlStateStream::assignField(SaHpiCtrlStateStreamT *ptr, const char *field, const char *value) { // note that DataLength cannot be assigned a value using this method if (ptr == NULL || field == NULL || value == NULL) { return true; } if (strcmp(field, "Repeat") == 0) { ptr->Repeat = oSaHpiTypesEnums::str2torf(value); return false; } else if (strcmp(field, "Stream") == 0) { if (strlen(value) < SAHPI_CTRL_MAX_STREAM_LENGTH) { ptr->StreamLength = strlen(value); strcpy((char *)ptr->Stream, value); } else { ptr->StreamLength = SAHPI_CTRL_MAX_STREAM_LENGTH; memcpy(ptr->Stream, value, SAHPI_CTRL_MAX_STREAM_LENGTH); } return false; } return true; }; /** * Print the contents of the buffer. * * @param stream Target stream. * @param buffer Address of the SaHpiCtrlStateStreamT struct. * * @return True if there was an error, otherwise false. */ bool oSaHpiCtrlStateStream::fprint(FILE *stream, const int indent, const SaHpiCtrlStateStreamT *buffer) { unsigned int i; int err; char indent_buf[indent + 1]; if (stream == NULL || buffer == NULL) { return true; } for (i = 0; i < (unsigned int)indent; i++) { indent_buf[i] = ' '; } indent_buf[indent] = '\0'; err = fprintf(stream, "%s", indent_buf); if (err < 0) { return true; } err = fprintf(stream, "Repeat = %s\n", oSaHpiTypesEnums::torf2str(buffer->Repeat)); if (err < 0) { return true; } err = fprintf(stream, "%s", indent_buf); if (err < 0) { return true; } err = fprintf(stream, "Stream = "); for (i = 0; i < buffer->StreamLength; i++) { err = fprintf(stream, "%c\n", buffer->Stream[i]); if (err < 0) { return true; } } err = fprintf(stream, "\n"); if (err < 0) { return true; } return false; } openhpi-2.14.1/cpp/oSaHpiIdrField.hpp0000644000076400007640000000305311302567022014251 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * W. David Ashley */ #ifndef Included_oSaHpiIdrField #define Included_oSaHpiIdrField #include extern "C" { #include } class oSaHpiIdrField : public SaHpiIdrFieldT { public: // constructors oSaHpiIdrField(); // copy constructor oSaHpiIdrField(const oSaHpiIdrField& buf); // destructor ~oSaHpiIdrField() { } // other methods static bool assignField(SaHpiIdrFieldT * ptr, const char *field, const char *value); inline bool assignField(const char *field, const char *value) { return assignField(this, field, value); } inline SaHpiIdrFieldT *getStruct(void) { return this; } static bool fprint(FILE *stream, const int indent, const SaHpiIdrFieldT *buffer); inline bool fprint(FILE *stream, const int indent) { return fprint(stream, indent, this); } }; #endif openhpi-2.14.1/cpp/oSaHpiHotSwapEvent.hpp0000644000076400007640000000312311302567022015154 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * W. David Ashley */ #ifndef Included_oSaHpiHotSwapEvent #define Included_oSaHpiHotSwapEvent #include extern "C" { #include } class oSaHpiHotSwapEvent : public SaHpiHotSwapEventT { public: // constructors oSaHpiHotSwapEvent(); // copy constructor oSaHpiHotSwapEvent(const oSaHpiHotSwapEvent& sr); // destructor ~oSaHpiHotSwapEvent() { } // other methods static bool assignField(SaHpiHotSwapEventT * ptr, const char *field, const char *value); inline bool assignField(const char *field, const char *value) { return assignField(this, field, value); } inline SaHpiHotSwapEventT *getStruct(void) { return this; } static bool fprint(FILE *stream, const int indent, const SaHpiHotSwapEventT *ent); inline bool fprint(FILE *stream, const int indent) { return fprint(stream, indent, this); } }; #endif openhpi-2.14.1/cpp/oSaHpiSensorEvent.hpp0000644000076400007640000000315311302567022015043 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * W. David Ashley */ #ifndef Included_oSaHpiSensorEvent #define Included_oSaHpiSensorEvent #include extern "C" { #include } #include "oSaHpiSensorReading.hpp" class oSaHpiSensorEvent : public SaHpiSensorEventT { public: // constructors oSaHpiSensorEvent(); // copy constructor oSaHpiSensorEvent(const oSaHpiSensorEvent& sr); // destructor ~oSaHpiSensorEvent() { } // other methods static bool assignField(SaHpiSensorEventT * ptr, const char *field, const char *value); inline bool assignField(const char *field, const char *value) { return assignField(this, field, value); } inline SaHpiSensorEventT *getStruct(void) { return this; } static bool fprint(FILE *stream, const int indent, const SaHpiSensorEventT *ent); inline bool fprint(FILE *stream, const int indent) { return fprint(stream, indent, this); } }; #endif openhpi-2.14.1/cpp/oSaHpiIdrInfo.hpp0000644000076400007640000000304011302567022014115 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * W. David Ashley */ #ifndef Included_oSaHpiIdrInfo #define Included_oSaHpiIdrInfo #include extern "C" { #include } class oSaHpiIdrInfo : public SaHpiIdrInfoT { public: // constructors oSaHpiIdrInfo(); // copy constructor oSaHpiIdrInfo(const oSaHpiIdrInfo& buf); // destructor ~oSaHpiIdrInfo() { } // other methods static bool assignField(SaHpiIdrInfoT * ptr, const char *field, const char *value); inline bool assignField(const char *field, const char *value) { return assignField(this, field, value); } inline SaHpiIdrInfoT *getStruct(void) { return this; } static bool fprint(FILE *stream, const int indent, const SaHpiIdrInfoT *buffer); inline bool fprint(FILE *stream, const int indent) { return fprint(stream, indent, this); } }; #endif openhpi-2.14.1/cpp/oSaHpiCtrlRecAnalog.hpp0000644000076400007640000000340311302567022015246 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * W. David Ashley */ #ifndef Included_oSaHpiCtrlRecAnalog #define Included_oSaHpiCtrlRecAnalog #include extern "C" { #include } class oSaHpiCtrlRecAnalog : public SaHpiCtrlRecAnalogT { public: // constructors oSaHpiCtrlRecAnalog(); oSaHpiCtrlRecAnalog(SaHpiCtrlStateAnalogT mn, SaHpiCtrlStateAnalogT mx, SaHpiCtrlStateAnalogT def); // copy constructor oSaHpiCtrlRecAnalog(const oSaHpiCtrlRecAnalog& cra); // destructor ~oSaHpiCtrlRecAnalog() { } // other methods static bool assignField(SaHpiCtrlRecAnalogT * ptr, const char *field, const char *value); inline bool assignField(const char *field, const char *value) { return assignField(this, field, value); } inline SaHpiCtrlRecAnalogT *getStruct(void) { return this; } static bool fprint(FILE *stream, const int indent, const SaHpiCtrlRecAnalogT *ent); inline bool fprint(FILE *stream, const int indent) { return fprint(stream, indent, this); } }; #endif openhpi-2.14.1/cpp/oSaHpiAnnunciatorRec.cpp0000644000076400007640000001007311302567022015475 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * W. David Ashley */ #include #include #include extern "C" { #include } #include "oSaHpiTypesEnums.hpp" #include "oSaHpiAnnunciatorRec.hpp" /** * Default constructor. */ oSaHpiAnnunciatorRec::oSaHpiAnnunciatorRec() { AnnunciatorNum = 1; AnnunciatorType = SAHPI_ANNUNCIATOR_TYPE_LED; ModeReadOnly = false; MaxConditions = 0; Oem = 0; }; /** * Constructor. * * @param buf The reference to the class to be copied. */ oSaHpiAnnunciatorRec::oSaHpiAnnunciatorRec(const oSaHpiAnnunciatorRec& buf) { memcpy(this, &buf, sizeof(SaHpiAnnunciatorRecT)); } /** * Assign a field in the SaHpiAnnunciatorRecT struct a value. * * @param field The pointer to the struct (class). * @param field The field name as a text string (case sensitive). * @param value The character string value to be assigned to the field. This * value will be converted as necessary. * * @return True if there was an error, otherwise false. */ bool oSaHpiAnnunciatorRec::assignField(SaHpiAnnunciatorRecT *ptr, const char *field, const char *value) { if (ptr == NULL || field == NULL || value == NULL) { return true; } if (strcmp(field, "AnnunciatorNum") == 0) { ptr->AnnunciatorNum = strtoul(value, NULL, 10); return false; } else if (strcmp(field, "AnnunciatorType") == 0) { ptr->AnnunciatorType = oSaHpiTypesEnums::str2annunciatortype(value); return false; } else if (strcmp(field, "ModeReadOnly") == 0) { ptr->ModeReadOnly = oSaHpiTypesEnums::str2torf(value); return false; } else if (strcmp(field, "MaxConditions") == 0) { ptr->MaxConditions = strtoul(value, NULL, 10); return false; } else if (strcmp(field, "Oem") == 0) { ptr->Oem = strtoul(value, NULL, 10); return false; } return true; }; /** * Print the contents of the buffer. * * @param stream Target stream. * @param buffer Address of the SaHpiAnnunciatorRecT struct. * * @return True if there was an error, otherwise false. */ bool oSaHpiAnnunciatorRec::fprint(FILE *stream, const int indent, const SaHpiAnnunciatorRecT *buffer) { int i, err; char indent_buf[indent + 1]; if (stream == NULL || buffer == NULL) { return true; } for (i = 0; i < indent; i++) { indent_buf[i] = ' '; } indent_buf[indent] = '\0'; err = fprintf(stream, "%s", indent_buf); if (err < 0) { return true; } err = fprintf(stream, "AnnunciatorNum = %d\n", buffer->AnnunciatorNum); if (err < 0) { return true; } err = fprintf(stream, "%s", indent_buf); if (err < 0) { return true; } err = fprintf(stream, "AnnunciatorType = %s\n", oSaHpiTypesEnums::annunciatortype2str(buffer->AnnunciatorType)); if (err < 0) { return true; } err = fprintf(stream, "%s", indent_buf); if (err < 0) { return true; } err = fprintf(stream, "ModeReadOnly = %s\n", oSaHpiTypesEnums::torf2str(buffer->ModeReadOnly)); if (err < 0) { return true; } err = fprintf(stream, "%s", indent_buf); if (err < 0) { return true; } err = fprintf(stream, "MaxConditions = %u\n", buffer->MaxConditions); if (err < 0) { return true; } err = fprintf(stream, "%s", indent_buf); if (err < 0) { return true; } err = fprintf(stream, "Oem = %u\n", buffer->Oem); if (err < 0) { return true; } return false; } openhpi-2.14.1/cpp/oSaHpiRdr.hpp0000644000076400007640000000276411302567022013326 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * W. David Ashley */ #ifndef Included_oSaHpiRdr #define Included_oSaHpiRdr #include extern "C" { #include } class oSaHpiRdr : public SaHpiRdrT { public: // constructors oSaHpiRdr(); // copy constructor oSaHpiRdr(const oSaHpiRdr& buf); // destructor ~oSaHpiRdr() { } // other methods static bool assignField(SaHpiRdrT * ptr, const char *field, const char *value); inline bool assignField(const char *field, const char *value) { return assignField(this, field, value); } inline SaHpiRdrT *getStruct(void) { return this; } static bool fprint(FILE *stream, const int indent, const SaHpiRdrT *buffer); inline bool fprint(FILE *stream, const int indent) { return fprint(stream, indent, this); } }; #endif openhpi-2.14.1/cpp/oSaHpiResourceEvent.cpp0000644000076400007640000000517611302567022015363 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * W. David Ashley */ #include #include #include extern "C" { #include } #include "oSaHpiTypesEnums.hpp" #include "oSaHpiResourceEvent.hpp" /** * Default constructor. */ oSaHpiResourceEvent::oSaHpiResourceEvent() { ResourceEventType = SAHPI_RESE_RESOURCE_FAILURE; }; /** * Constructor. * * @param buf The reference to the class to be copied. */ oSaHpiResourceEvent::oSaHpiResourceEvent(const oSaHpiResourceEvent& buf) { memcpy(this, &buf, sizeof(SaHpiResourceEventT)); } /** * Assign a field in the SaHpiResourceEventT struct a value. * * @param field The pointer to the struct (class). * @param field The field name as a text string (case sensitive). * @param value The character string value to be assigned to the field. This * value will be converted as necessary. * * @return True if there was an error, otherwise false. */ bool oSaHpiResourceEvent::assignField(SaHpiResourceEventT *ptr, const char *field, const char *value) { if (ptr == NULL || field == NULL || value == NULL) { return true; } if (strcmp(field, "ResourceEventType") == 0) { ptr->ResourceEventType = oSaHpiTypesEnums::str2resourceeventtype(value); return false; } return true; }; /** * Print the contents of the buffer. * * @param stream Target stream. * @param buffer Address of the SaHpiResourceEventT struct. * * @return True if there was an error, otherwise false. */ bool oSaHpiResourceEvent::fprint(FILE *stream, const int indent, const SaHpiResourceEventT *buffer) { int i, err; char indent_buf[indent + 1]; if (stream == NULL || buffer == NULL) { return true; } for (i = 0; i < indent; i++) { indent_buf[i] = ' '; } indent_buf[indent] = '\0'; err = fprintf(stream, "%s", indent_buf); if (err < 0) { return true; } err = fprintf(stream, "ResourceEventType = %s\n", oSaHpiTypesEnums::resourceeventtype2str(buffer->ResourceEventType)); if (err < 0) { return true; } return false; } openhpi-2.14.1/cpp/oSaHpiDrtEntry.cpp0000644000076400007640000000615511302567022014343 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * W. David Ashley */ #include #include #include extern "C" { #include } #include "oSaHpiTypesEnums.hpp" #include "oSaHpiDrtEntry.hpp" /** * Default constructor. */ oSaHpiDrtEntry::oSaHpiDrtEntry() { EntryId = 1; DomainId = 1; IsPeer = false; }; /** * Constructor. * * @param buf The reference to the class to be copied. */ oSaHpiDrtEntry::oSaHpiDrtEntry(const oSaHpiDrtEntry& buf) { memcpy(this, &buf, sizeof(SaHpiDrtEntryT)); } /** * Assign a field in the SaHpiDrtEntryT struct a value. * * @param field The pointer to the struct (class). * @param field The field name as a text string (case sensitive). * @param value The character string value to be assigned to the field. This * value will be converted as necessary. * * @return True if there was an error, otherwise false. */ bool oSaHpiDrtEntry::assignField(SaHpiDrtEntryT *ptr, const char *field, const char *value) { if (ptr == NULL || field == NULL || value == NULL) { return true; } if (strcmp(field, "EntryId") == 0) { ptr->EntryId = strtoul(value, NULL, 10); return false; } else if (strcmp(field, "DomainId") == 0) { ptr->DomainId = strtoul(value, NULL, 10); return false; } else if (strcmp(field, "IsPeer") == 0) { ptr->IsPeer = oSaHpiTypesEnums::str2torf(value); return false; } return true; }; /** * Print the contents of the buffer. * * @param stream Target stream. * @param buffer Address of the SaHpiDrtEntryT struct. * * @return True if there was an error, otherwise false. */ bool oSaHpiDrtEntry::fprint(FILE *stream, const int indent, const SaHpiDrtEntryT *buffer) { int i, err; char indent_buf[indent + 1]; if (stream == NULL || buffer == NULL) { return true; } for (i = 0; i < indent; i++) { indent_buf[i] = ' '; } indent_buf[indent] = '\0'; err = fprintf(stream, "%s", indent_buf); if (err < 0) { return true; } err = fprintf(stream, "EntryId = %u\n", buffer->EntryId); if (err < 0) { return true; } err = fprintf(stream, "%s", indent_buf); if (err < 0) { return true; } err = fprintf(stream, "DomainId = %u\n", buffer->DomainId); if (err < 0) { return true; } err = fprintf(stream, "%s", indent_buf); if (err < 0) { return true; } err = fprintf(stream, "IsPeer = %s\n", oSaHpiTypesEnums::torf2str(buffer->IsPeer)); if (err < 0) { return true; } return false; } openhpi-2.14.1/cpp/oSaHpiResourceInfo.cpp0000644000076400007640000001275611302567022015177 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * W. David Ashley */ #include #include #include extern "C" { #include } #include "oSaHpiTypesEnums.hpp" #include "oSaHpiResourceInfo.hpp" /** * Default constructor. */ oSaHpiResourceInfo::oSaHpiResourceInfo() { int i; ResourceRev = 0; SpecificVer = 0; DeviceSupport = 0; ManufacturerId = SAHPI_MANUFACTURER_ID_UNSPECIFIED; ProductId = 0; FirmwareMajorRev = 0; FirmwareMinorRev = 0; AuxFirmwareRev = 0; for (i = 0; i < 16; i++) { Guid[i] = 0; } }; /** * Constructor. * * @param buf The reference to the class to be copied. */ oSaHpiResourceInfo::oSaHpiResourceInfo(const oSaHpiResourceInfo& buf) { memcpy(this, &buf, sizeof(SaHpiResourceInfoT)); } /** * Assign a field in the SaHpiResourceInfoT struct a value. * * @param field The pointer to the struct (class). * @param field The field name as a text string (case sensitive). * @param value The character string value to be assigned to the field. This * value will be converted as necessary. * * @return True if there was an error, otherwise false. */ bool oSaHpiResourceInfo::assignField(SaHpiResourceInfoT *ptr, const char *field, const char *value) { if (ptr == NULL || field == NULL || value == NULL) { return true; } if (strcmp(field, "ResourceRev") == 0) { ptr->ResourceRev = (SaHpiUint8T)strtoul(value, NULL, 10); return false; } else if (strcmp(field, "SpecificVer") == 0) { ptr->SpecificVer = (SaHpiUint8T)strtoul(value, NULL, 10); return false; } else if (strcmp(field, "DeviceSupport") == 0) { ptr->DeviceSupport = (SaHpiUint8T)strtoul(value, NULL, 10); return false; } else if (strcmp(field, "ManufacturerId") == 0) { ptr->ManufacturerId = strtoul(value, NULL, 10); return false; } else if (strcmp(field, "ProductId") == 0) { ptr->ProductId = (SaHpiUint8T)strtoul(value, NULL, 10); return false; } else if (strcmp(field, "FirmwareMajorRev") == 0) { ptr->FirmwareMajorRev = (SaHpiUint8T)strtoul(value, NULL, 10); return false; } else if (strcmp(field, "FirmwareMinorRev") == 0) { ptr->FirmwareMinorRev = (SaHpiUint8T)strtoul(value, NULL, 10); return false; } else if (strcmp(field, "AuxFirmwareRev") == 0) { ptr->AuxFirmwareRev = (SaHpiUint8T)strtoul(value, NULL, 10); return false; } // Guid return true; }; /** * Print the contents of the buffer. * * @param stream Target stream. * @param buffer Address of the SaHpiResourceInfoT struct. * * @return True if there was an error, otherwise false. */ bool oSaHpiResourceInfo::fprint(FILE *stream, const int indent, const SaHpiResourceInfoT *buffer) { int i, err; char indent_buf[indent + 1]; if (stream == NULL || buffer == NULL) { return true; } for (i = 0; i < indent; i++) { indent_buf[i] = ' '; } indent_buf[indent] = '\0'; err = fprintf(stream, "%s", indent_buf); if (err < 0) { return true; } err = fprintf(stream, "ResourceRev = %u\n", buffer->ResourceRev); if (err < 0) { return true; } err = fprintf(stream, "%s", indent_buf); if (err < 0) { return true; } err = fprintf(stream, "SpecificVer = %u\n", buffer->SpecificVer); if (err < 0) { return true; } err = fprintf(stream, "%s", indent_buf); if (err < 0) { return true; } err = fprintf(stream, "DeviceSupport = %u\n", buffer->DeviceSupport); if (err < 0) { return true; } err = fprintf(stream, "%s", indent_buf); if (err < 0) { return true; } err = fprintf(stream, "ManufacturerId = %u\n", buffer->ManufacturerId); if (err < 0) { return true; } err = fprintf(stream, "%s", indent_buf); if (err < 0) { return true; } err = fprintf(stream, "ProductId = %u\n", buffer->ProductId); if (err < 0) { return true; } err = fprintf(stream, "%s", indent_buf); if (err < 0) { return true; } err = fprintf(stream, "FirmwareMajorRev = %u\n", buffer->FirmwareMajorRev); if (err < 0) { return true; } err = fprintf(stream, "%s", indent_buf); if (err < 0) { return true; } err = fprintf(stream, "FirmwareMinorRev = %u\n", buffer->FirmwareMinorRev); if (err < 0) { return true; } err = fprintf(stream, "%s", indent_buf); if (err < 0) { return true; } err = fprintf(stream, "AuxFirmwareRev = %u\n", buffer->AuxFirmwareRev); if (err < 0) { return true; } for (i = 0; i < 16; i++) { err = fprintf(stream, "%s", indent_buf); if (err < 0) { return true; } err = fprintf(stream, "Guid[%d] = %u\n", i, buffer->Guid[i]); if (err < 0) { return true; } } return false; } openhpi-2.14.1/cpp/oSaHpiCtrlRecText.hpp0000644000076400007640000000345711302567022015002 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * W. David Ashley */ #ifndef Included_oSaHpiCtrlRecText #define Included_oSaHpiCtrlRecText #include extern "C" { #include } class oSaHpiCtrlRecText : public SaHpiCtrlRecTextT { public: // constructors oSaHpiCtrlRecText(); oSaHpiCtrlRecText(SaHpiUint8T maxch, SaHpiUint8T maxlin, SaHpiLanguageT lang, SaHpiTextTypeT type, const char *str); // copy constructor oSaHpiCtrlRecText(const oSaHpiCtrlRecText& crd); // destructor ~oSaHpiCtrlRecText() { } // other methods static bool assignField(SaHpiCtrlRecTextT * ptr, const char *field, const char *value); inline bool assignField(const char *field, const char *value) { return assignField(this, field, value); } inline SaHpiCtrlRecTextT *getStruct(void) { return this; } static bool fprint(FILE *stream, const int indent, const SaHpiCtrlRecTextT *ent); inline bool fprint(FILE *stream, const int indent) { return fprint(stream, indent, this); } }; #endif openhpi-2.14.1/cpp/oSaHpiRptEntry.cpp0000644000076400007640000001415411302567022014355 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * W. David Ashley */ #include #include #include extern "C" { #include } #include "oSaHpiTypesEnums.hpp" #include "oSaHpiResourceInfo.hpp" #include "oSaHpiEntityPath.hpp" #include "oSaHpiTextBuffer.hpp" #include "oSaHpiRptEntry.hpp" /** * Default constructor. */ oSaHpiRptEntry::oSaHpiRptEntry() { int i; EntryId = 1; ResourceId = 1; ResourceInfo.ResourceRev = 0; ResourceInfo.SpecificVer = 0; ResourceInfo.DeviceSupport = 0; ResourceInfo.ManufacturerId = SAHPI_MANUFACTURER_ID_UNSPECIFIED; ResourceInfo.ProductId = 0; ResourceInfo.FirmwareMajorRev = 0; ResourceInfo.FirmwareMinorRev = 0; ResourceInfo.AuxFirmwareRev = 0; for (i = 0; i < 16; i++) { ResourceInfo.Guid[i] = 0; } ResourceEntity.Entry[0].EntityType = SAHPI_ENT_ROOT; ResourceEntity.Entry[0].EntityLocation = 0; ResourceCapabilities = (SaHpiCapabilitiesT)0; HotSwapCapabilities = (SaHpiHsCapabilitiesT)0; ResourceSeverity = SAHPI_OK; ResourceFailed = false; ResourceTag.DataType = SAHPI_TL_TYPE_TEXT; ResourceTag.Language = SAHPI_LANG_ENGLISH; ResourceTag.DataLength = 0; ResourceTag.Data[0] = '\0'; }; /** * Constructor. * * @param buf The reference to the class to be copied. */ oSaHpiRptEntry::oSaHpiRptEntry(const oSaHpiRptEntry& buf) { memcpy(this, &buf, sizeof(SaHpiRptEntryT)); } /** * Assign a field in the SaHpiRptEntryT struct a value. * * @param field The pointer to the struct (class). * @param field The field name as a text string (case sensitive). * @param value The character string value to be assigned to the field. This * value will be converted as necessary. * * @return True if there was an error, otherwise false. */ bool oSaHpiRptEntry::assignField(SaHpiRptEntryT *ptr, const char *field, const char *value) { if (ptr == NULL || field == NULL || value == NULL) { return true; } if (strcmp(field, "EntryId") == 0) { ptr->EntryId = strtoul(value, NULL, 10); return false; } else if (strcmp(field, "ResourceId") == 0) { ptr->ResourceId = strtoul(value, NULL, 10); return false; } // ResourceInfo // ResourceEntity else if (strcmp(field, "ResourceCapabilities") == 0) { ptr->ResourceCapabilities |= oSaHpiTypesEnums::str2capabilities(value); return false; } else if (strcmp(field, "HotSwapCapabilities") == 0) { ptr->HotSwapCapabilities |= oSaHpiTypesEnums::str2hscapabilities(value); return false; } else if (strcmp(field, "ResourceSeverity") == 0) { ptr->ResourceSeverity = oSaHpiTypesEnums::str2severity(value); return false; } else if (strcmp(field, "ResourceFailed") == 0) { ptr->ResourceFailed = oSaHpiTypesEnums::str2torf(value); return false; } // ResourceTag return true; }; /** * Print the contents of the buffer. * * @param stream Target stream. * @param buffer Address of the SaHpiRptEntryT struct. * * @return True if there was an error, otherwise false. */ bool oSaHpiRptEntry::fprint(FILE *stream, const int indent, const SaHpiRptEntryT *buffer) { int i, err; char indent_buf[indent + 1]; if (stream == NULL || buffer == NULL) { return true; } for (i = 0; i < indent; i++) { indent_buf[i] = ' '; } indent_buf[indent] = '\0'; err = fprintf(stream, "%s", indent_buf); if (err < 0) { return true; } err = fprintf(stream, "EntryId = %d\n", buffer->EntryId); if (err < 0) { return true; } err = fprintf(stream, "%s", indent_buf); if (err < 0) { return true; } err = fprintf(stream, "ResourceId = %d\n", buffer->ResourceId); if (err < 0) { return true; } err = fprintf(stream, "%s", indent_buf); if (err < 0) { return true; } err = fprintf(stream, "ResourceInfo\n"); if (err < 0) { return true; } const SaHpiResourceInfoT *ri = (const SaHpiResourceInfoT *)&buffer->ResourceInfo; err = oSaHpiResourceInfo::fprint(stream, indent + 3, ri); if (err < 0) { return true; } err = fprintf(stream, "%s", indent_buf); if (err < 0) { return true; } err = fprintf(stream, "ResourceEntity\n"); if (err < 0) { return true; } const SaHpiEntityPathT *ep = (const SaHpiEntityPathT *)&buffer->ResourceEntity; err = oSaHpiEntityPath::fprint(stream, indent + 3, ep); if (err < 0) { return true; } err = fprintf(stream, "%s", indent_buf); if (err < 0) { return true; } err = fprintf(stream, "ResourceCapabilities = %X\n", buffer->ResourceCapabilities); if (err < 0) { return true; } err = fprintf(stream, "%s", indent_buf); if (err < 0) { return true; } err = fprintf(stream, "HotSwapCapabilities = %X\n", buffer->HotSwapCapabilities); if (err < 0) { return true; } err = fprintf(stream, "%s", indent_buf); if (err < 0) { return true; } err = fprintf(stream, "ResourceSeverity = %s\n", oSaHpiTypesEnums::severity2str(buffer->ResourceSeverity)); if (err < 0) { return true; } err = fprintf(stream, "%s", indent_buf); if (err < 0) { return true; } err = fprintf(stream, "ResourceTag\n"); if (err < 0) { return true; } const SaHpiTextBufferT *tb = (const SaHpiTextBufferT *)&buffer->ResourceTag; err = oSaHpiTextBuffer::fprint(stream, indent + 3, tb); if (err < 0) { return true; } return false; } openhpi-2.14.1/cpp/oSaHpiSensorReading.hpp0000644000076400007640000000342411302567022015334 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * W. David Ashley */ #ifndef Included_oSaHpiSensorReading #define Included_oSaHpiSensorReading #include extern "C" { #include } #define ISSUPPORTED_DEFAULT false #define SAHPISENSORREADINGTYPET_DEFAULT SAHPI_SENSOR_READING_TYPE_INT64 class oSaHpiSensorReading : public SaHpiSensorReadingT { public: // constructors oSaHpiSensorReading(); // copy constructor oSaHpiSensorReading(const oSaHpiSensorReading& sr); // destructor ~oSaHpiSensorReading() { } // other methods static bool assignField(SaHpiSensorReadingT * ptr, const char *field, const char *value); inline bool assignField(const char *field, const char *value) { return assignField(this, field, value); } inline SaHpiSensorReadingT *getStruct(void) { return this; } static bool fprint(FILE *stream, const int indent, const SaHpiSensorReadingT *ent); inline bool fprint(FILE *stream, const int indent) { return fprint(stream, indent, this); } void initSensorReading(SaHpiSensorReadingT *reading); }; #endif openhpi-2.14.1/cpp/oSaHpiWatchdogEvent.hpp0000644000076400007640000000313611302567022015333 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * W. David Ashley */ #ifndef Included_oSaHpiWatchdogEvent #define Included_oSaHpiWatchdogEvent #include extern "C" { #include } class oSaHpiWatchdogEvent : public SaHpiWatchdogEventT { public: // constructors oSaHpiWatchdogEvent(); // copy constructor oSaHpiWatchdogEvent(const oSaHpiWatchdogEvent& sr); // destructor ~oSaHpiWatchdogEvent() { } // other methods static bool assignField(SaHpiWatchdogEventT * ptr, const char *field, const char *value); inline bool assignField(const char *field, const char *value) { return assignField(this, field, value); } inline SaHpiWatchdogEventT *getStruct(void) { return this; } static bool fprint(FILE *stream, const int indent, const SaHpiWatchdogEventT *ent); inline bool fprint(FILE *stream, const int indent) { return fprint(stream, indent, this); } }; #endif openhpi-2.14.1/cpp/oSaHpiCtrlRecOem.cpp0000644000076400007640000001026111302567022014560 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * W. David Ashley */ #include #include #include extern "C" { #include } #include "oSaHpiTypesEnums.hpp" #include "oSaHpiCtrlStateOem.hpp" #include "oSaHpiCtrlRecOem.hpp" /** * Default constructor. */ oSaHpiCtrlRecOem::oSaHpiCtrlRecOem() { MId = SAHPI_MANUFACTURER_ID_UNSPECIFIED; ConfigData[0] = '\0'; Default.MId = SAHPI_MANUFACTURER_ID_UNSPECIFIED; Default.BodyLength = 0; Default.Body[0] = '\0'; }; /** * Constructor. */ oSaHpiCtrlRecOem::oSaHpiCtrlRecOem(SaHpiManufacturerIdT mid, const char *config, const char *str) { MId = mid; if (strlen(config) < SAHPI_CTRL_OEM_CONFIG_LENGTH) { strcpy((char *)ConfigData, config); } else { memcpy(ConfigData, config, SAHPI_CTRL_OEM_CONFIG_LENGTH); } Default.MId = mid; if (strlen(str) < SAHPI_CTRL_MAX_OEM_BODY_LENGTH) { Default.BodyLength = strlen(str); strcpy((char *)ConfigData, str); } else { Default.BodyLength = SAHPI_CTRL_MAX_OEM_BODY_LENGTH; memcpy(ConfigData, str, SAHPI_CTRL_MAX_OEM_BODY_LENGTH); } }; /** * Constructor. * * @param buf The reference to the class to be copied. */ oSaHpiCtrlRecOem::oSaHpiCtrlRecOem(const oSaHpiCtrlRecOem& ent) { memcpy(this, &ent, sizeof(SaHpiCtrlRecOemT)); } /** * Assign a field in the SaHpiCtrlRecOemT struct a value. * * @param field The pointer to the struct (class). * @param field The field name as a text string (case sensitive). * @param value The character string value to be assigned to the field. This * value will be converted as necessary. * * @return True if there was an error, otherwise false. */ bool oSaHpiCtrlRecOem::assignField(SaHpiCtrlRecOemT *ptr, const char *field, const char *value) { if (ptr == NULL || field == NULL || value == NULL) { return true; } if (strcmp(field, "MId") == 0) { ptr->MId = (SaHpiManufacturerIdT)atoi(value); return false; } else if (strcmp(field, "ConfigData") == 0) { if (strlen(value) < SAHPI_CTRL_OEM_CONFIG_LENGTH) { strcpy((char *)ptr->ConfigData, value); } else { memcpy(ptr->ConfigData, value, SAHPI_CTRL_OEM_CONFIG_LENGTH); } return false; } // Default return true; }; /** * Print the contents of the entity. * * @param stream Target stream. * @param buffer Address of the SaHpiCtrlRecOemT struct. * * @return True if there was an error, otherwise false. */ bool oSaHpiCtrlRecOem::fprint(FILE *stream, const int indent, const SaHpiCtrlRecOemT *oem) { int i, err = 0; char indent_buf[indent + 1]; if (stream == NULL || oem == NULL) { return true; } for (i = 0; i < indent; i++) { indent_buf[i] = ' '; } indent_buf[indent] = '\0'; err = fprintf(stream, "%s", indent_buf); if (err < 0) { return true; } err = fprintf(stream, "MId = %d\n", oem->MId); if (err < 0) { return true; } err = fprintf(stream, "%s", indent_buf); if (err < 0) { return true; } err = fprintf(stream, "ConfigData = %s\n", oem->ConfigData); if (err < 0) { return true; } err = fprintf(stream, "%s", indent_buf); if (err < 0) { return true; } err = fprintf(stream, "Default\n"); if (err < 0) { return true; } const SaHpiCtrlStateOemT *cs = (const SaHpiCtrlStateOemT *)&oem->Default; err = oSaHpiCtrlStateOem::fprint(stream, indent + 3, cs); if (err < 0) { return true; } return false; } openhpi-2.14.1/cpp/oSaHpiEntity.cpp0000644000076400007640000000632711302567022014045 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * W. David Ashley */ #include #include #include extern "C" { #include } #include "oSaHpiTypesEnums.hpp" #include "oSaHpiEntity.hpp" /** * Default constructor. */ oSaHpiEntity::oSaHpiEntity() { EntityType = SAHPI_ENT_ROOT; EntityLocation = 0; }; /** * Constructor. * * @param type The SaHpiEntityTypeT. * @param loc The SaHpiEntityLocationT. */ oSaHpiEntity::oSaHpiEntity(const SaHpiEntityTypeT type, const SaHpiEntityLocationT loc) { if (oSaHpiTypesEnums::entitytype2str(type)) { EntityType = type; } else { EntityType = SAHPI_ENT_ROOT; } EntityLocation = loc; }; /** * Constructor. * * @param buf The reference to the class to be copied. */ oSaHpiEntity::oSaHpiEntity(const oSaHpiEntity& ent) { EntityType = ent.EntityType; EntityLocation = ent.EntityLocation; } /** * Assign a field in the SaHpiEntityT struct a value. * * @param field The pointer to the struct (class). * @param field The field name as a text string (case sensitive). * @param value The character string value to be assigned to the field. This * value will be converted as necessary. * * @return True if there was an error, otherwise false. */ bool oSaHpiEntity::assignField(SaHpiEntityT *ptr, const char *field, const char *value) { if (ptr == NULL || field == NULL || value == NULL) { return true; } if (strcmp(field, "EntityType") == 0) { ptr->EntityType = oSaHpiTypesEnums::str2entitytype(value); return false; } else if (strcmp(field, "EntityLocation") == 0) { ptr->EntityLocation = strtoul(value, NULL, 10); return false; } return true; }; /** * Print the contents of the entity. * * @param stream Target stream. * @param buffer Address of the SaHpiEntityT struct. * * @return True if there was an error, otherwise false. */ bool oSaHpiEntity::fprint(FILE *stream, const int indent, const SaHpiEntityT *ent) { int i, err = 0; char indent_buf[indent + 1]; if (stream == NULL || ent == NULL) { return true; } for (i = 0; i < indent; i++) { indent_buf[i] = ' '; } indent_buf[indent] = '\0'; err = fprintf(stream, "%s", indent_buf); if (err < 0) { return true; } err = fprintf(stream, "EntityType = %s\n", oSaHpiTypesEnums::entitytype2str(ent->EntityType)); if (err < 0) { return true; } err = fprintf(stream, "%s", indent_buf); if (err < 0) { return true; } err = fprintf(stream, "EntityLocation = %u\n", ent->EntityLocation); if (err < 0) { return true; } return false; } openhpi-2.14.1/cpp/oSaHpiInventoryRec.cpp0000644000076400007640000000623011302567022015211 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * W. David Ashley */ #include #include #include extern "C" { #include } #include "oSaHpiTypesEnums.hpp" #include "oSaHpiInventoryRec.hpp" /** * Default constructor. */ oSaHpiInventoryRec::oSaHpiInventoryRec() { IdrId = 1; Persistent = false; Oem = 0; }; /** * Constructor. * * @param buf The reference to the class to be copied. */ oSaHpiInventoryRec::oSaHpiInventoryRec(const oSaHpiInventoryRec& buf) { memcpy(this, &buf, sizeof(SaHpiInventoryRecT)); } /** * Assign a field in the SaHpiInventoryRecT struct a value. * * @param field The pointer to the struct (class). * @param field The field name as a text string (case sensitive). * @param value The character string value to be assigned to the field. This * value will be converted as necessary. * * @return True if there was an error, otherwise false. */ bool oSaHpiInventoryRec::assignField(SaHpiInventoryRecT *ptr, const char *field, const char *value) { if (ptr == NULL || field == NULL || value == NULL) { return true; } if (strcmp(field, "IdrId") == 0) { ptr->IdrId = strtoul(value, NULL, 10); return false; } else if (strcmp(field, "Persistent") == 0) { ptr->Persistent = oSaHpiTypesEnums::str2torf(value); return false; } else if (strcmp(field, "Oem") == 0) { ptr->Oem = strtoul(value, NULL, 10); return false; } return true; }; /** * Print the contents of the buffer. * * @param stream Target stream. * @param buffer Address of the SaHpiInventoryRecT struct. * * @return True if there was an error, otherwise false. */ bool oSaHpiInventoryRec::fprint(FILE *stream, const int indent, const SaHpiInventoryRecT *buffer) { int i, err; char indent_buf[indent + 1]; if (stream == NULL || buffer == NULL) { return true; } for (i = 0; i < indent; i++) { indent_buf[i] = ' '; } indent_buf[indent] = '\0'; err = fprintf(stream, "%s", indent_buf); if (err < 0) { return true; } err = fprintf(stream, "IdrId = %d\n", buffer->IdrId); if (err < 0) { return true; } err = fprintf(stream, "%s", indent_buf); if (err < 0) { return true; } err = fprintf(stream, "Persistent = %s\n", oSaHpiTypesEnums::torf2str(buffer->Persistent)); if (err < 0) { return true; } err = fprintf(stream, "%s", indent_buf); if (err < 0) { return true; } err = fprintf(stream, "Oem = %u\n", buffer->Oem); if (err < 0) { return true; } return false; } openhpi-2.14.1/cpp/oSaHpiEventLogInfo.hpp0000644000076400007640000000312711302567022015130 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * W. David Ashley */ #ifndef Included_oSaHpiEventLogInfo #define Included_oSaHpiEventLogInfo #include extern "C" { #include } class oSaHpiEventLogInfo : public SaHpiEventLogInfoT { public: // constructors oSaHpiEventLogInfo(); // copy constructor oSaHpiEventLogInfo(const oSaHpiEventLogInfo& buf); // destructor ~oSaHpiEventLogInfo() { } // other methods static bool assignField(SaHpiEventLogInfoT * ptr, const char *field, const char *value); inline bool assignField(const char *field, const char *value) { return assignField(this, field, value); } inline SaHpiEventLogInfoT *getStruct(void) { return this; } static bool fprint(FILE *stream, const int indent, const SaHpiEventLogInfoT *buffer); inline bool fprint(FILE *stream, const int indent) { return fprint(stream, indent, this); } }; #endif openhpi-2.14.1/cpp/oSaHpiCtrlState.cpp0000644000076400007640000001073411302567022014473 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * W. David Ashley */ #include #include #include extern "C" { #include } #include "oSaHpiTypesEnums.hpp" #include "oSaHpiCtrlStateStream.hpp" #include "oSaHpiCtrlStateText.hpp" #include "oSaHpiCtrlStateOem.hpp" #include "oSaHpiCtrlState.hpp" /** * Default constructor. */ oSaHpiCtrlState::oSaHpiCtrlState() { Type = SAHPI_CTRL_TYPE_DIGITAL; StateUnion.Digital = SAHPI_CTRL_STATE_OFF; }; /** * Constructor. * * @param buf The reference to the class to be copied. */ oSaHpiCtrlState::oSaHpiCtrlState(const oSaHpiCtrlState& ent) { memcpy(this, &ent, sizeof(SaHpiCtrlStateT)); } /** * Assign a field in the SaHpiCtrlStateT struct a value. * * @param field The pointer to the struct (class). * @param field The field name as a text string (case sensitive). * @param value The character string value to be assigned to the field. This * value will be converted as necessary. * * @return True if there was an error, otherwise false. */ bool oSaHpiCtrlState::assignField(SaHpiCtrlStateT *ptr, const char *field, const char *value) { if (ptr == NULL || field == NULL || value == NULL) { return true; } if (strcmp(field, "Type") == 0) { ptr->Type = oSaHpiTypesEnums::str2ctrltype(value); return false; } // StateUnion return true; }; /** * Print the contents of the entity. * * @param stream Target stream. * @param buffer Address of the SaHpiCtrlStateT struct. * * @return True if there was an error, otherwise false. */ bool oSaHpiCtrlState::fprint(FILE *stream, const int indent, const SaHpiCtrlStateT *cs) { int i, err = 0; char indent_buf[indent + 1]; if (stream == NULL || cs == NULL) { return true; } for (i = 0; i < indent; i++) { indent_buf[i] = ' '; } indent_buf[indent] = '\0'; err = fprintf(stream, "%s", indent_buf); if (err < 0) { return true; } err = fprintf(stream, "Type = %s\n", oSaHpiTypesEnums::ctrltype2str(cs->Type)); if (err < 0) { return true; } err = fprintf(stream, "%s", indent_buf); if (err < 0) { return true; } switch (cs->Type) { case SAHPI_CTRL_TYPE_DIGITAL: { err = fprintf(stream, "StateUnion.Digital = %s\n", oSaHpiTypesEnums::ctrlstatedigital2str(cs->StateUnion.Digital)); if (err < 0) { return true; } break; } case SAHPI_CTRL_TYPE_DISCRETE: { err = fprintf(stream, "StateUnion.Discrete = %u\n", cs->StateUnion.Discrete); if (err < 0) { return true; } break; } case SAHPI_CTRL_TYPE_ANALOG: { err = fprintf(stream, "StateUnion.Analog = %d\n", cs->StateUnion.Analog); if (err < 0) { return true; } break; } case SAHPI_CTRL_TYPE_STREAM: { err = fprintf(stream, "StateUnion.Stream\n"); const SaHpiCtrlStateStreamT *css = (const SaHpiCtrlStateStreamT *)&cs->StateUnion.Stream; err = oSaHpiCtrlStateStream::fprint(stream, indent + 3, css); if (err < 0) { return true; } break; } case SAHPI_CTRL_TYPE_TEXT: { err = fprintf(stream, "StateUnion.Text\n"); const SaHpiCtrlStateTextT *cst = (const SaHpiCtrlStateTextT *)&cs->StateUnion.Text; err = oSaHpiCtrlStateText::fprint(stream, indent + 3, cst); if (err < 0) { return true; } break; } case SAHPI_CTRL_TYPE_OEM: { err = fprintf(stream, "StateUnion.Oem\n"); const SaHpiCtrlStateOemT *cso = (const SaHpiCtrlStateOemT *)&cs->StateUnion.Oem; err = oSaHpiCtrlStateOem::fprint(stream, indent + 3, cso); if (err < 0) { return true; } break; } default: err = fprintf(stream, "StateUnion = Unknown\n"); if (err < 0) { return true; } break; } return false; } openhpi-2.14.1/cpp/oSaHpiCondition.hpp0000644000076400007640000000306611302567022014521 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * W. David Ashley */ #ifndef Included_oSaHpiCondition #define Included_oSaHpiCondition #include extern "C" { #include } class oSaHpiCondition : public SaHpiConditionT { public: // constructors oSaHpiCondition(); // copy constructor oSaHpiCondition(const oSaHpiCondition& buf); // destructor ~oSaHpiCondition() { } // other methods static bool assignField(SaHpiConditionT * ptr, const char *field, const char *value); inline bool assignField(const char *field, const char *value) { return assignField(this, field, value); } inline SaHpiConditionT *getStruct(void) { return this; } static bool fprint(FILE *stream, const int indent, const SaHpiConditionT *buffer); inline bool fprint(FILE *stream, const int indent) { return fprint(stream, indent, this); } }; #endif openhpi-2.14.1/cpp/oSaHpiIdrAreaHeader.cpp0000644000076400007640000000726611302567022015214 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * W. David Ashley */ #include #include #include extern "C" { #include } #include "oSaHpiTypesEnums.hpp" #include "oSaHpiIdrAreaHeader.hpp" /** * Default constructor. */ oSaHpiIdrAreaHeader::oSaHpiIdrAreaHeader() { AreaId = 1; Type = SAHPI_IDR_AREATYPE_UNSPECIFIED; ReadOnly = false; NumFields = 0; }; /** * Constructor. * * @param buf The reference to the class to be copied. */ oSaHpiIdrAreaHeader::oSaHpiIdrAreaHeader(const oSaHpiIdrAreaHeader& buf) { memcpy(this, &buf, sizeof(SaHpiIdrAreaHeaderT)); } /** * Assign a field in the SaHpiIdrAreaHeaderT struct a value. * * @param field The pointer to the struct (class). * @param field The field name as a text string (case sensitive). * @param value The character string value to be assigned to the field. This * value will be converted as necessary. * * @return True if there was an error, otherwise false. */ bool oSaHpiIdrAreaHeader::assignField(SaHpiIdrAreaHeaderT *ptr, const char *field, const char *value) { // note that DataLength cannot be assigned a value using this method if (ptr == NULL || field == NULL || value == NULL) { return true; } if (strcmp(field, "AreaId") == 0) { ptr->AreaId = strtoul(value, NULL, 10); return false; } else if (strcmp(field, "Type") == 0) { ptr->Type = oSaHpiTypesEnums::str2idrareatype(value); return false; } else if (strcmp(field, "ReadOnly") == 0) { ptr->ReadOnly = oSaHpiTypesEnums::str2torf(value); return false; } else if (strcmp(field, "NumFields") == 0) { ptr->NumFields = strtoul(value, NULL, 10); return false; } // Field return true; }; /** * Print the contents of the buffer. * * @param stream Target stream. * @param buffer Address of the SaHpiIdrAreaHeaderT struct. * * @return True if there was an error, otherwise false. */ bool oSaHpiIdrAreaHeader::fprint(FILE *stream, const int indent, const SaHpiIdrAreaHeaderT *buffer) { int i, err; char indent_buf[indent + 1]; if (stream == NULL || buffer == NULL) { return true; } for (i = 0; i < indent; i++) { indent_buf[i] = ' '; } indent_buf[indent] = '\0'; err = fprintf(stream, "%s", indent_buf); if (err < 0) { return true; } err = fprintf(stream, "AreaId = %d\n", buffer->AreaId); if (err < 0) { return true; } err = fprintf(stream, "%s", indent_buf); if (err < 0) { return true; } err = fprintf(stream, "Type = %s\n", oSaHpiTypesEnums::idrareatype2str(buffer->Type)); if (err < 0) { return true; } err = fprintf(stream, "%s", indent_buf); if (err < 0) { return true; } err = fprintf(stream, "ReadOnly = %s\n", oSaHpiTypesEnums::torf2str(buffer->ReadOnly)); if (err < 0) { return true; } err = fprintf(stream, "%s", indent_buf); if (err < 0) { return true; } err = fprintf(stream, "NumFields = %d\n", buffer->NumFields); if (err < 0) { return true; } return false; } openhpi-2.14.1/cpp/oSaHpiSensorDataFormat.cpp0000644000076400007640000001353711302567022016006 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * W. David Ashley */ #include #include #include extern "C" { #include } #include "oSaHpiTypesEnums.hpp" #include "oSaHpiSensorReading.hpp" #include "oSaHpiSensorRange.hpp" #include "oSaHpiSensorDataFormat.hpp" /** * Default constructor. */ oSaHpiSensorDataFormat::oSaHpiSensorDataFormat() { oSaHpiSensorReading *sr; IsSupported = 0; ReadingType = SAHPI_SENSOR_READING_TYPE_INT64; BaseUnits = SAHPI_SU_UNSPECIFIED; ModifierUnits = SAHPI_SU_UNSPECIFIED; ModifierUse = SAHPI_SMUU_NONE; Percentage = false; Range.Flags = 0; sr = (oSaHpiSensorReading *)&Range.Max; sr->initSensorReading(sr); sr = (oSaHpiSensorReading *)&Range.Min; sr->initSensorReading(sr); sr = (oSaHpiSensorReading *)&Range.Nominal; sr->initSensorReading(sr); sr = (oSaHpiSensorReading *)&Range.NormalMax; sr->initSensorReading(sr); sr = (oSaHpiSensorReading *)&Range.NormalMin; sr->initSensorReading(sr); AccuracyFactor = 0; }; /** * Constructor. * * @param buf The reference to the class to be copied. */ oSaHpiSensorDataFormat::oSaHpiSensorDataFormat(const oSaHpiSensorDataFormat& df) { memcpy(this, &df, sizeof(SaHpiSensorDataFormatT)); } /** * Assign a field in the SaHpiSensorDataFormatT struct a value. * * @param field The pointer to the struct (class). * @param field The field name as a text string (case sensitive). * @param value The character string value to be assigned to the field. This * value will be converted as necessary. * * @return True if there was an error, otherwise false. */ bool oSaHpiSensorDataFormat::assignField(SaHpiSensorDataFormatT *ptr, const char *field, const char *value) { if (ptr == NULL || field == NULL || value == NULL) { return true; } if (strcmp(field, "IsSupported") == 0) { ptr->IsSupported = oSaHpiTypesEnums::str2torf(value); return false; } else if (strcmp(field, "ReadingType") == 0) { ptr->ReadingType = oSaHpiTypesEnums::str2sensorreadingtype(value); return false; } else if (strcmp(field, "BaseUnits") == 0) { ptr->BaseUnits = oSaHpiTypesEnums::str2sensorunits(value); return false; } else if (strcmp(field, "ModifierUnits") == 0) { ptr->ModifierUnits = oSaHpiTypesEnums::str2sensorunits(value); return false; } else if (strcmp(field, "ModifierUse") == 0) { ptr->ModifierUse = oSaHpiTypesEnums::str2sensoruse(value); return false; } else if (strcmp(field, "Percentage") == 0) { ptr->Percentage = oSaHpiTypesEnums::str2torf(value); return false; } else if (strcmp(field, "AccuracyFactor") == 0) { ptr->AccuracyFactor = (SaHpiFloat64T)atof(value); return false; } return true; }; /** * Print the contents of the entity. * * @param stream Target stream. * @param buffer Address of the SaHpiSensorReadingT struct. * * @return True if there was an error, otherwise false. */ bool oSaHpiSensorDataFormat::fprint(FILE *stream, const int indent, const SaHpiSensorDataFormatT *df) { int i, err = 0; char indent_buf[indent + 1]; if (stream == NULL || df == NULL) { return true; } for (i = 0; i < indent; i++) { indent_buf[i] = ' '; } indent_buf[indent] = '\0'; err = fprintf(stream, "%s", indent_buf); if (err < 0) { return true; } err = fprintf(stream, "IsSupported = %s\n", oSaHpiTypesEnums::torf2str(df->IsSupported)); if (err < 0) { return true; } err = fprintf(stream, "%s", indent_buf); if (err < 0) { return true; } err = fprintf(stream, "ReadingType = %s\n", oSaHpiTypesEnums::sensorreadingtype2str(df->ReadingType)); if (err < 0) { return true; } err = fprintf(stream, "%s", indent_buf); if (err < 0) { return true; } err = fprintf(stream, "BaseUnits = %s\n", oSaHpiTypesEnums::sensorunits2str(df->BaseUnits)); if (err < 0) { return true; } err = fprintf(stream, "%s", indent_buf); if (err < 0) { return true; } err = fprintf(stream, "ModifierUnits = %s\n", oSaHpiTypesEnums::sensorunits2str(df->ModifierUnits)); if (err < 0) { return true; } err = fprintf(stream, "%s", indent_buf); if (err < 0) { return true; } err = fprintf(stream, "ModifierUse = %s\n", oSaHpiTypesEnums::sensoruse2str(df->ModifierUse)); if (err < 0) { return true; } err = fprintf(stream, "%s", indent_buf); if (err < 0) { return true; } err = fprintf(stream, "Percentage = %s\n", oSaHpiTypesEnums::torf2str(df->Percentage)); if (err < 0) { return true; } err = fprintf(stream, "%s", indent_buf); if (err < 0) { return true; } err = fprintf(stream, "Range\n"); if (err < 0) { return true; } const SaHpiSensorRangeT *sr = (const SaHpiSensorRangeT *)&df->Range; err = oSaHpiSensorRange::fprint(stream, indent + 3, sr); if (err < 0) { return true; } err = fprintf(stream, "%s", indent_buf); if (err < 0) { return true; } err = fprintf(stream, "AccuracyFactor = %f\n", df->AccuracyFactor); if (err < 0) { return true; } return false; } openhpi-2.14.1/cpp/oSaHpiOemEvent.cpp0000644000076400007640000000576211302567022014315 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * W. David Ashley */ #include #include #include extern "C" { #include } #include "oSaHpiTypesEnums.hpp" #include "oSaHpiTextBuffer.hpp" #include "oSaHpiOemEvent.hpp" /** * Default constructor. */ oSaHpiOemEvent::oSaHpiOemEvent() { MId = SAHPI_MANUFACTURER_ID_UNSPECIFIED; OemEventData.DataType = SAHPI_TL_TYPE_TEXT; OemEventData.Language = SAHPI_LANG_ENGLISH; OemEventData.DataLength = 0; OemEventData.Data[0] = '\0'; }; /** * Constructor. * * @param buf The reference to the class to be copied. */ oSaHpiOemEvent::oSaHpiOemEvent(const oSaHpiOemEvent& buf) { memcpy(this, &buf, sizeof(SaHpiOemEventT)); } /** * Assign a field in the SaHpiOemEventT struct a value. * * @param field The pointer to the struct (class). * @param field The field name as a text string (case sensitive). * @param value The character string value to be assigned to the field. This * value will be converted as necessary. * * @return True if there was an error, otherwise false. */ bool oSaHpiOemEvent::assignField(SaHpiOemEventT *ptr, const char *field, const char *value) { if (ptr == NULL || field == NULL || value == NULL) { return true; } if (strcmp(field, "MId") == 0) { ptr->MId = strtoul(value, NULL, 10); return false; } // OemEventData return true; }; /** * Print the contents of the buffer. * * @param stream Target stream. * @param buffer Address of the SaHpiOemEventT struct. * * @return True if there was an error, otherwise false. */ bool oSaHpiOemEvent::fprint(FILE *stream, const int indent, const SaHpiOemEventT *buffer) { int i, err; char indent_buf[indent + 1]; if (stream == NULL || buffer == NULL) { return true; } for (i = 0; i < indent; i++) { indent_buf[i] = ' '; } indent_buf[indent] = '\0'; err = fprintf(stream, "%s", indent_buf); if (err < 0) { return true; } err = fprintf(stream, "MId = %d\n", buffer->MId); if (err < 0) { return true; } err = fprintf(stream, "%s", indent_buf); if (err < 0) { return true; } err = fprintf(stream, "OemEventData\n"); if (err < 0) { return true; } const SaHpiTextBufferT *tb = (const SaHpiTextBufferT *)&buffer->OemEventData; err = oSaHpiTextBuffer::fprint(stream, indent + 3, tb); if (err < 0) { return true; } return false; } openhpi-2.14.1/cpp/oSaHpiAnnunciatorRec.hpp0000644000076400007640000000315511302567022015505 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * W. David Ashley */ #ifndef Included_oSaHpiAnnunciatorRec #define Included_oSaHpiAnnunciatorRec #include extern "C" { #include } class oSaHpiAnnunciatorRec : public SaHpiAnnunciatorRecT { public: // constructors oSaHpiAnnunciatorRec(); // copy constructor oSaHpiAnnunciatorRec(const oSaHpiAnnunciatorRec& buf); // destructor ~oSaHpiAnnunciatorRec() { } // other methods static bool assignField(SaHpiAnnunciatorRecT * ptr, const char *field, const char *value); inline bool assignField(const char *field, const char *value) { return assignField(this, field, value); } inline SaHpiAnnunciatorRecT *getStruct(void) { return this; } static bool fprint(FILE *stream, const int indent, const SaHpiAnnunciatorRecT *buffer); inline bool fprint(FILE *stream, const int indent) { return fprint(stream, indent, this); } }; #endif openhpi-2.14.1/cpp/oSaHpiCtrlRecText.cpp0000644000076400007640000001170011302567022014763 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * W. David Ashley */ #include #include #include extern "C" { #include } #include "oSaHpiTypesEnums.hpp" #include "oSaHpiTextBuffer.hpp" #include "oSaHpiCtrlStateText.hpp" #include "oSaHpiCtrlRecText.hpp" /** * Default constructor. */ oSaHpiCtrlRecText::oSaHpiCtrlRecText() { MaxChars = SAHPI_MAX_TEXT_BUFFER_LENGTH; MaxLines = 1; Language = SAHPI_LANG_ENGLISH; DataType = SAHPI_TL_TYPE_TEXT; Default.Line = 1; Default.Text.Language = SAHPI_LANG_ENGLISH; Default.Text.DataType = SAHPI_TL_TYPE_TEXT; Default.Text.DataLength = 0; Default.Text.Data[0] = '\0'; }; /** * Constructor. */ oSaHpiCtrlRecText::oSaHpiCtrlRecText(SaHpiUint8T maxch, SaHpiUint8T maxlin, SaHpiLanguageT lang, SaHpiTextTypeT type, const char *str) { MaxChars = maxch; MaxLines = maxlin; Language = lang; DataType = type; Default.Line = 1; Default.Text.Language = lang; Default.Text.DataType = type; if (strlen(str) < MaxChars) { Default.Text.DataLength = strlen(str); strcpy((char *)Default.Text.Data, str); } else { Default.Text.DataLength = MaxChars; memcpy(Default.Text.Data, str, MaxChars); } }; /** * Constructor. * * @param buf The reference to the class to be copied. */ oSaHpiCtrlRecText::oSaHpiCtrlRecText(const oSaHpiCtrlRecText& ent) { memcpy(this, &ent, sizeof(SaHpiCtrlRecTextT)); } /** * Assign a field in the SaHpiCtrlRecTextT struct a value. * * @param field The pointer to the struct (class). * @param field The field name as a text string (case sensitive). * @param value The character string value to be assigned to the field. This * value will be converted as necessary. * * @return True if there was an error, otherwise false. */ bool oSaHpiCtrlRecText::assignField(SaHpiCtrlRecTextT *ptr, const char *field, const char *value) { if (ptr == NULL || field == NULL || value == NULL) { return true; } if (strcmp(field, "MaxChars") == 0) { ptr->MaxChars = (SaHpiUint8T)atoi(value); return false; } else if (strcmp(field, "MaxLines") == 0) { ptr->MaxLines = (SaHpiUint8T)atoi(value); return false; } else if (strcmp(field, "Language") == 0) { ptr->Language = oSaHpiTypesEnums::str2language(value); return false; } else if (strcmp(field, "DataType") == 0) { ptr->DataType = oSaHpiTypesEnums::str2texttype(value); return false; } // Default return true; }; /** * Print the contents of the entity. * * @param stream Target stream. * @param buffer Address of the SaHpiCtrlRecTextT struct. * * @return True if there was an error, otherwise false. */ bool oSaHpiCtrlRecText::fprint(FILE *stream, const int indent, const SaHpiCtrlRecTextT *txt) { int i, err = 0; char indent_buf[indent + 1]; if (stream == NULL || txt == NULL) { return true; } for (i = 0; i < indent; i++) { indent_buf[i] = ' '; } indent_buf[indent] = '\0'; err = fprintf(stream, "%s", indent_buf); if (err < 0) { return true; } err = fprintf(stream, "MaxChars = %u\n", txt->MaxChars); if (err < 0) { return true; } err = fprintf(stream, "%s", indent_buf); if (err < 0) { return true; } err = fprintf(stream, "MaxLines = %u\n", txt->MaxLines); if (err < 0) { return true; } err = fprintf(stream, "%s", indent_buf); if (err < 0) { return true; } err = fprintf(stream, "Language = %s\n", oSaHpiTypesEnums::language2str(txt->Language)); if (err < 0) { return true; } err = fprintf(stream, "%s", indent_buf); if (err < 0) { return true; } err = fprintf(stream, "DataType = %s\n", oSaHpiTypesEnums::texttype2str(txt->DataType)); if (err < 0) { return true; } err = fprintf(stream, "%s", indent_buf); if (err < 0) { return true; } err = fprintf(stream, "Default\n"); if (err < 0) { return true; } const SaHpiCtrlStateTextT *cs = (const SaHpiCtrlStateTextT *)&txt->Default; err = oSaHpiCtrlStateText::fprint(stream, indent + 3, cs); if (err < 0) { return true; } return false; } openhpi-2.14.1/cpp/oSaHpiEventLogEntry.cpp0000644000076400007640000000616311302567022015334 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * W. David Ashley */ #include #include #include extern "C" { #include } #include "oSaHpiTypesEnums.hpp" #include "oSaHpiEvent.hpp" #include "oSaHpiEventLogEntry.hpp" /** * Default constructor. */ oSaHpiEventLogEntry::oSaHpiEventLogEntry() { EntryId = 1; Timestamp = 0; }; /** * Constructor. * * @param buf The reference to the class to be copied. */ oSaHpiEventLogEntry::oSaHpiEventLogEntry(const oSaHpiEventLogEntry& buf) { memcpy(this, &buf, sizeof(SaHpiEventLogEntryT)); } /** * Assign a field in the SaHpiEventLogEntryT struct a value. * * @param field The pointer to the struct (class). * @param field The field name as a text string (case sensitive). * @param value The character string value to be assigned to the field. This * value will be converted as necessary. * * @return True if there was an error, otherwise false. */ bool oSaHpiEventLogEntry::assignField(SaHpiEventLogEntryT *ptr, const char *field, const char *value) { if (ptr == NULL || field == NULL || value == NULL) { return true; } if (strcmp(field, "EntryId") == 0) { ptr->EntryId = strtoul(value, NULL, 10); return false; } else if (strcmp(field, "Timestamp") == 0) { ptr->Timestamp = strtoull(value, NULL, 10); return false; } // Event return true; }; /** * Print the contents of the buffer. * * @param stream Target stream. * @param buffer Address of the SaHpiEventLogEntryT struct. * * @return True if there was an error, otherwise false. */ bool oSaHpiEventLogEntry::fprint(FILE *stream, const int indent, const SaHpiEventLogEntryT *buffer) { int i, err; char indent_buf[indent + 1]; if (stream == NULL || buffer == NULL) { return true; } for (i = 0; i < indent; i++) { indent_buf[i] = ' '; } indent_buf[indent] = '\0'; err = fprintf(stream, "%s", indent_buf); if (err < 0) { return true; } err = fprintf(stream, "EntryId = %u\n", buffer->EntryId); if (err < 0) { return true; } err = fprintf(stream, "%s", indent_buf); if (err < 0) { return true; } err = fprintf(stream, "Timestamp = %lld\n", buffer->Timestamp); if (err < 0) { return true; } err = fprintf(stream, "Event\n"); if (err < 0) { return true; } const SaHpiEventT *e = (const SaHpiEventT *)&buffer->Event; err = oSaHpiEvent::fprint(stream, indent + 3, e); if (err < 0) { return true; } return false; } openhpi-2.14.1/cpp/oSaHpiCtrlStateStream.hpp0000644000076400007640000000356511302567022015660 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * W. David Ashley */ #ifndef Included_oSaHpiCtrlStateStream #define Included_oSaHpiCtrlStateStream #include extern "C" { #include } class oSaHpiCtrlStateStream : public SaHpiCtrlStateStreamT { public: // constructors oSaHpiCtrlStateStream(); oSaHpiCtrlStateStream(const SaHpiBoolT rep, const char *str); oSaHpiCtrlStateStream(const SaHpiBoolT rep, const void *str, const SaHpiUint8T len); // copy constructor oSaHpiCtrlStateStream(const oSaHpiCtrlStateStream& buf); // destructor ~oSaHpiCtrlStateStream() { } // other methods static bool assignField(SaHpiCtrlStateStreamT * ptr, const char *field, const char *value); inline bool assignField(const char *field, const char *value) { return assignField(this, field, value); } inline SaHpiCtrlStateStreamT *getStruct(void) { return this; } static bool fprint(FILE *stream, const int indent, const SaHpiCtrlStateStreamT *buffer); inline bool fprint(FILE *stream, const int indent) { return fprint(stream, indent, this); } }; #endif openhpi-2.14.1/cpp/oSaHpiEvent.hpp0000644000076400007640000000301211302567022013643 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * W. David Ashley */ #ifndef Included_oSaHpiEvent #define Included_oSaHpiEvent #include extern "C" { #include } class oSaHpiEvent : public SaHpiEventT { public: // constructors oSaHpiEvent(); // copy constructor oSaHpiEvent(const oSaHpiEvent& buf); // destructor ~oSaHpiEvent() { } // other methods static bool assignField(SaHpiEventT * ptr, const char *field, const char *value); inline bool assignField(const char *field, const char *value) { return assignField(this, field, value); } inline SaHpiEventT *getStruct(void) { return this; } static bool fprint(FILE *stream, const int indent, const SaHpiEventT *buffer); inline bool fprint(FILE *stream, const int indent) { return fprint(stream, indent, this); } }; #endif openhpi-2.14.1/cpp/oSaHpiEvent.cpp0000644000076400007640000001544511302567022013653 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * W. David Ashley */ #include #include #include extern "C" { #include } #include "oSaHpiTypesEnums.hpp" #include "oSaHpiResourceEvent.hpp" #include "oSaHpiDomainEvent.hpp" #include "oSaHpiSensorEvent.hpp" #include "oSaHpiSensorEnableChangeEvent.hpp" #include "oSaHpiHotSwapEvent.hpp" #include "oSaHpiWatchdogEvent.hpp" #include "oSaHpiHpiSwEvent.hpp" #include "oSaHpiOemEvent.hpp" #include "oSaHpiUserEvent.hpp" #include "oSaHpiEvent.hpp" /** * Default constructor. */ oSaHpiEvent::oSaHpiEvent() { Source = 1; EventType = SAHPI_ET_RESOURCE; Timestamp = 0; Severity = SAHPI_OK; EventDataUnion.ResourceEvent.ResourceEventType = SAHPI_RESE_RESOURCE_ADDED; }; /** * Constructor. * * @param buf The reference to the class to be copied. */ oSaHpiEvent::oSaHpiEvent(const oSaHpiEvent& buf) { memcpy(this, &buf, sizeof(SaHpiEventT)); } /** * Assign a field in the SaHpiEventT struct a value. * * @param field The pointer to the struct (class). * @param field The field name as a text string (case sensitive). * @param value The character string value to be assigned to the field. This * value will be converted as necessary. * * @return True if there was an error, otherwise false. */ bool oSaHpiEvent::assignField(SaHpiEventT *ptr, const char *field, const char *value) { if (ptr == NULL || field == NULL || value == NULL) { return true; } if (strcmp(field, "Source") == 0) { ptr->Source = strtoul(value, NULL, 10); return false; } else if (strcmp(field, "EventType") == 0) { ptr->EventType = oSaHpiTypesEnums::str2eventtype(value); return false; } else if (strcmp(field, "Timestamp") == 0) { ptr->Timestamp = strtoull(value, NULL, 10); return false; } else if (strcmp(field, "Severity") == 0) { ptr->Severity = oSaHpiTypesEnums::str2severity(value); return false; } // Event return true; }; /** * Print the contents of the buffer. * * @param stream Target stream. * @param buffer Address of the SaHpiEventT struct. * * @return True if there was an error, otherwise false. */ bool oSaHpiEvent::fprint(FILE *stream, const int indent, const SaHpiEventT *buffer) { int i, err; char indent_buf[indent + 1]; if (stream == NULL || buffer == NULL) { return true; } for (i = 0; i < indent; i++) { indent_buf[i] = ' '; } indent_buf[indent] = '\0'; err = fprintf(stream, "%s", indent_buf); if (err < 0) { return true; } err = fprintf(stream, "Source = %u\n", buffer->Source); if (err < 0) { return true; } err = fprintf(stream, "%s", indent_buf); if (err < 0) { return true; } err = fprintf(stream, "EventType = %s\n", oSaHpiTypesEnums::eventtype2str(buffer->EventType)); if (err < 0) { return true; } err = fprintf(stream, "%s", indent_buf); if (err < 0) { return true; } err = fprintf(stream, "Timestamp = %lld\n", buffer->Timestamp); if (err < 0) { return true; } err = fprintf(stream, "%s", indent_buf); if (err < 0) { return true; } err = fprintf(stream, "Severity = %s\n", oSaHpiTypesEnums::severity2str(buffer->Severity)); if (err < 0) { return true; } err = fprintf(stream, "%s", indent_buf); if (err < 0) { return true; } err = fprintf(stream, "EventDataUnion\n"); if (err < 0) { return true; } switch (buffer->EventType) { case SAHPI_ET_RESOURCE: { const SaHpiResourceEventT *re = (const SaHpiResourceEventT *)&buffer->EventDataUnion.ResourceEvent; err = oSaHpiResourceEvent::fprint(stream, indent + 3, re); if (err < 0) { return true; } break; } case SAHPI_ET_DOMAIN: { const SaHpiDomainEventT *de = (const SaHpiDomainEventT *)&buffer->EventDataUnion.DomainEvent; err = oSaHpiDomainEvent::fprint(stream, indent + 3, de); if (err < 0) { return true; } break; } case SAHPI_ET_SENSOR: { const SaHpiSensorEventT *se = (const SaHpiSensorEventT *)&buffer->EventDataUnion.SensorEvent; err = oSaHpiSensorEvent::fprint(stream, indent + 3, se); if (err < 0) { return true; } break; } case SAHPI_ET_SENSOR_ENABLE_CHANGE: { const SaHpiSensorEnableChangeEventT *sec = (const SaHpiSensorEnableChangeEventT *)&buffer->EventDataUnion.SensorEnableChangeEvent; err = oSaHpiSensorEnableChangeEvent::fprint(stream, indent + 3, sec); if (err < 0) { return true; } break; } case SAHPI_ET_HOTSWAP: { const SaHpiHotSwapEventT *hs = (const SaHpiHotSwapEventT *)&buffer->EventDataUnion.HotSwapEvent; err = oSaHpiHotSwapEvent::fprint(stream, indent + 3, hs); if (err < 0) { return true; } break; } case SAHPI_ET_WATCHDOG: { const SaHpiWatchdogEventT *we = (const SaHpiWatchdogEventT *)&buffer->EventDataUnion.WatchdogEvent; err = oSaHpiWatchdogEvent::fprint(stream, indent + 3, we); if (err < 0) { return true; } break; } case SAHPI_ET_HPI_SW: { const SaHpiHpiSwEventT *hpise = (const SaHpiHpiSwEventT *)&buffer->EventDataUnion.HpiSwEvent; err = oSaHpiHpiSwEvent::fprint(stream, indent + 3, hpise); if (err < 0) { return true; } break; } case SAHPI_ET_OEM: { const SaHpiOemEventT *oe = (const SaHpiOemEventT *)&buffer->EventDataUnion.OemEvent; err = oSaHpiOemEvent::fprint(stream, indent + 3, oe); if (err < 0) { return true; } break; } case SAHPI_ET_USER: { const SaHpiUserEventT *ue = (const SaHpiUserEventT *)&buffer->EventDataUnion.UserEvent; err = oSaHpiUserEvent::fprint(stream, indent + 3, ue); if (err < 0) { return true; } break; } default: err = fprintf(stream, "%s", indent_buf); if (err < 0) { return true; } err = fprintf(stream, " Unknown\n"); if (err < 0) { return true; } } return false; } openhpi-2.14.1/cpp/oSaHpiDomainEvent.cpp0000644000076400007640000000557711302567022015010 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * W. David Ashley */ #include #include #include extern "C" { #include } #include "oSaHpiTypesEnums.hpp" #include "oSaHpiDomainEvent.hpp" /** * Default constructor. */ oSaHpiDomainEvent::oSaHpiDomainEvent() { Type = SAHPI_DOMAIN_REF_ADDED; DomainId = SAHPI_UNSPECIFIED_DOMAIN_ID; }; /** * Constructor. * * @param buf The reference to the class to be copied. */ oSaHpiDomainEvent::oSaHpiDomainEvent(const oSaHpiDomainEvent& buf) { memcpy(this, &buf, sizeof(SaHpiDomainEventT)); } /** * Assign a field in the SaHpiDomainEventT struct a value. * * @param field The pointer to the struct (class). * @param field The field name as a text string (case sensitive). * @param value The character string value to be assigned to the field. This * value will be converted as necessary. * * @return True if there was an error, otherwise false. */ bool oSaHpiDomainEvent::assignField(SaHpiDomainEventT *ptr, const char *field, const char *value) { if (ptr == NULL || field == NULL || value == NULL) { return true; } if (strcmp(field, "Type") == 0) { ptr->Type = oSaHpiTypesEnums::str2domaineventtype(value); return false; } if (strcmp(field, "DomainId") == 0) { ptr->DomainId = strtoul(value, NULL, 10); return false; } return true; }; /** * Print the contents of the buffer. * * @param stream Target stream. * @param buffer Address of the SaHpiDomainEventT struct. * * @return True if there was an error, otherwise false. */ bool oSaHpiDomainEvent::fprint(FILE *stream, const int indent, const SaHpiDomainEventT *buffer) { int i, err; char indent_buf[indent + 1]; if (stream == NULL || buffer == NULL) { return true; } for (i = 0; i < indent; i++) { indent_buf[i] = ' '; } indent_buf[indent] = '\0'; err = fprintf(stream, "%s", indent_buf); if (err < 0) { return true; } err = fprintf(stream, "Type = %s\n", oSaHpiTypesEnums::domaineventtype2str(buffer->Type)); if (err < 0) { return true; } err = fprintf(stream, "%s", indent_buf); if (err < 0) { return true; } err = fprintf(stream, "DomainId = %d\n", buffer->DomainId); if (err < 0) { return true; } return false; } openhpi-2.14.1/cpp/oSaHpiCtrlRec.cpp0000644000076400007640000001604511302567022014125 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * W. David Ashley */ #include #include #include extern "C" { #include } #include "oSaHpiTypesEnums.hpp" #include "oSaHpiCtrlDefaultMode.hpp" #include "oSaHpiCtrlRecDigital.hpp" #include "oSaHpiCtrlRecDiscrete.hpp" #include "oSaHpiCtrlRecAnalog.hpp" #include "oSaHpiCtrlRecStream.hpp" #include "oSaHpiCtrlRecText.hpp" #include "oSaHpiCtrlRecOem.hpp" #include "oSaHpiCtrlRec.hpp" /** * Default constructor. */ oSaHpiCtrlRec::oSaHpiCtrlRec() { Num = 1; OutputType = SAHPI_CTRL_GENERIC; Type = SAHPI_CTRL_TYPE_DIGITAL; TypeUnion.Digital.Default = SAHPI_CTRL_STATE_OFF; DefaultMode.Mode = SAHPI_CTRL_MODE_AUTO; DefaultMode.ReadOnly = false; WriteOnly = false; Oem = 0; }; /** * Constructor. * * @param buf The reference to the class to be copied. */ oSaHpiCtrlRec::oSaHpiCtrlRec(const oSaHpiCtrlRec& cr) { memcpy(this, &cr, sizeof(SaHpiCtrlRecT)); } /** * Assign a field in the SaHpiCtrlRecT struct a value. * * @param field The pointer to the struct (class). * @param field The field name as a text string (case sensitive). * @param value The character string value to be assigned to the field. This * value will be converted as necessary. * * @return True if there was an error, otherwise false. */ bool oSaHpiCtrlRec::assignField(SaHpiCtrlRecT *ptr, const char *field, const char *value) { if (ptr == NULL || field == NULL || value == NULL) { return true; } if (strcmp(field, "Num") == 0) { ptr->Num = strtoul(value, NULL, 10); return false; } else if (strcmp(field, "OutputType") == 0) { ptr->OutputType = oSaHpiTypesEnums::str2ctrloutputtype(value); return false; } else if (strcmp(field, "Type") == 0) { ptr->Type = oSaHpiTypesEnums::str2ctrltype(value); return false; } // Digital // Discrete // Analog // Stream // Text //Oem else if (strcmp(field, "WriteOnly") == 0) { ptr->WriteOnly = oSaHpiTypesEnums::str2torf(value); return false; } else if (strcmp(field, "Oem") == 0) { ptr->Oem = strtoul(value, NULL, 10); return false; } return true; }; /** * Print the contents of the entity. * * @param stream Target stream. * @param buffer Address of the SaHpiCtrlRecT struct. * * @return True if there was an error, otherwise false. */ bool oSaHpiCtrlRec::fprint(FILE *stream, const int indent, const SaHpiCtrlRecT *cr) { int i, err = 0; char indent_buf[indent + 1]; if (stream == NULL) { return true; } for (i = 0; i < indent; i++) { indent_buf[i] = ' '; } indent_buf[indent] = '\0'; err = fprintf(stream, "%s", indent_buf); if (err < 0) { return true; } err = fprintf(stream, "Num = %d\n", cr->Num); if (err < 0) { return true; } err = fprintf(stream, "%s", indent_buf); if (err < 0) { return true; } err = fprintf(stream, "OutputType = %s\n", oSaHpiTypesEnums::ctrloutputtype2str(cr->OutputType)); if (err < 0) { return true; } err = fprintf(stream, "%s", indent_buf); if (err < 0) { return true; } err = fprintf(stream, "Type = %s\n", oSaHpiTypesEnums::ctrltype2str(cr->Type)); if (err < 0) { return true; } err = fprintf(stream, "%s", indent_buf); if (err < 0) { return true; } switch (cr->Type) { case SAHPI_CTRL_TYPE_DIGITAL: { err = fprintf(stream, "TypeUnion.Digital\n"); if (err < 0) { return true; } const SaHpiCtrlRecDigitalT *crd = (const SaHpiCtrlRecDigitalT *)&cr->TypeUnion.Digital; err = oSaHpiCtrlRecDigital::fprint(stream, indent + 3, crd); if (err < 0) { return true; } break; } case SAHPI_CTRL_TYPE_DISCRETE: { err = fprintf(stream, "TypeUnion.Discrete\n"); if (err < 0) { return true; } const SaHpiCtrlRecDiscreteT *crds = (const SaHpiCtrlRecDiscreteT *)&cr->TypeUnion.Discrete; err = oSaHpiCtrlRecDiscrete::fprint(stream, indent + 3, crds); if (err < 0) { return true; } break; } case SAHPI_CTRL_TYPE_ANALOG: { err = fprintf(stream, "TypeUnion.Analog\n"); if (err < 0) { return true; } const SaHpiCtrlRecAnalogT *cra = (const SaHpiCtrlRecAnalogT *)&cr->TypeUnion.Analog; err = oSaHpiCtrlRecAnalog::fprint(stream, indent + 3, cra); if (err < 0) { return true; } break; } case SAHPI_CTRL_TYPE_STREAM: { err = fprintf(stream, "TypeUnion.Stream\n"); if (err < 0) { return true; } const SaHpiCtrlRecStreamT *crs = (const SaHpiCtrlRecStreamT *)&cr->TypeUnion.Stream; err = oSaHpiCtrlRecStream::fprint(stream, indent + 3, crs); if (err < 0) { return true; } break; } case SAHPI_CTRL_TYPE_TEXT: { err = fprintf(stream, "TypeUnion.Text\n"); if (err < 0) { return true; } const SaHpiCtrlRecTextT *crt = (const SaHpiCtrlRecTextT *)&cr->TypeUnion.Text; err = oSaHpiCtrlRecText::fprint(stream, indent + 3, crt); if (err < 0) { return true; } break; } case SAHPI_CTRL_TYPE_OEM: { err = fprintf(stream, "TypeUnion.Oem\n"); if (err < 0) { return true; } const SaHpiCtrlRecOemT *cro = (const SaHpiCtrlRecOemT *)&cr->TypeUnion.Oem; err = oSaHpiCtrlRecOem::fprint(stream, indent + 3, cro); if (err < 0) { return true; } break; } default: break; } err = fprintf(stream, "%s", indent_buf); if (err < 0) { return true; } err = fprintf(stream, "DefaultMode\n"); if (err < 0) { return true; } const SaHpiCtrlDefaultModeT *dm = (const SaHpiCtrlDefaultModeT *)&cr->DefaultMode; err = oSaHpiCtrlDefaultMode::fprint(stream, indent + 3, dm); if (err < 0) { return true; } err = fprintf(stream, "%s", indent_buf); if (err < 0) { return true; } err = fprintf(stream, "WriteOnly = %s\n", oSaHpiTypesEnums::torf2str(cr->WriteOnly)); if (err < 0) { return true; } err = fprintf(stream, "%s", indent_buf); if (err < 0) { return true; } err = fprintf(stream, "Oem = %d\n", cr->Oem); if (err < 0) { return true; } return false; } openhpi-2.14.1/cpp/oSaHpiAnnouncement.cpp0000644000076400007640000001201211302567022015207 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * W. David Ashley */ #include #include #include extern "C" { #include } #include "oSaHpiTypesEnums.hpp" #include "oSaHpiCondition.hpp" #include "oSaHpiAnnouncement.hpp" /** * Default constructor. */ oSaHpiAnnouncement::oSaHpiAnnouncement() { EntryId = 1; Timestamp = SAHPI_TIME_UNSPECIFIED; AddedByUser = false; Severity = SAHPI_OK; Acknowledged = false; StatusCond.Type = SAHPI_STATUS_COND_TYPE_SENSOR; StatusCond.Entity.Entry[0].EntityType = SAHPI_ENT_ROOT; StatusCond.Entity.Entry[0].EntityLocation = 0; StatusCond.DomainId = SAHPI_UNSPECIFIED_DOMAIN_ID; StatusCond.ResourceId = 1; StatusCond.SensorNum = 1; StatusCond.EventState = SAHPI_ES_UNSPECIFIED; StatusCond.Name.Length = 0; StatusCond.Name.Value[0] = '\0'; StatusCond.Mid = SAHPI_MANUFACTURER_ID_UNSPECIFIED; StatusCond.Data.DataType = SAHPI_TL_TYPE_TEXT; StatusCond.Data.Language = SAHPI_LANG_ENGLISH; StatusCond.Data.DataLength = 0; StatusCond.Data.Data[0] = '\0'; }; /** * Constructor. * * @param buf The reference to the class to be copied. */ oSaHpiAnnouncement::oSaHpiAnnouncement(const oSaHpiAnnouncement& buf) { memcpy(this, &buf, sizeof(SaHpiAnnouncementT)); } /** * Assign a field in the SaHpiAnnouncementT struct a value. * * @param field The pointer to the struct (class). * @param field The field name as a text string (case sensitive). * @param value The character string value to be assigned to the field. This * value will be converted as necessary. * * @return True if there was an error, otherwise false. */ bool oSaHpiAnnouncement::assignField(SaHpiAnnouncementT *ptr, const char *field, const char *value) { if (ptr == NULL || field == NULL || value == NULL) { return true; } if (strcmp(field, "EntryId") == 0) { ptr->EntryId = atoi(value); return false; } else if (strcmp(field, "Timestamp") == 0) { ptr->Timestamp = strtoll(value, NULL, 10); return false; } else if (strcmp(field, "AddedByUser") == 0) { ptr->AddedByUser = oSaHpiTypesEnums::str2torf(value); return false; } else if (strcmp(field, "Severity") == 0) { ptr->Severity = oSaHpiTypesEnums::str2severity(value); return false; } else if (strcmp(field, "Acknowledged") == 0) { ptr->Acknowledged = oSaHpiTypesEnums::str2torf(value); return false; } // StatusCond return true; }; /** * Print the contents of the buffer. * * @param stream Target stream. * @param buffer Address of the SaHpiAnnouncementT struct. * * @return True if there was an error, otherwise false. */ bool oSaHpiAnnouncement::fprint(FILE *stream, const int indent, const SaHpiAnnouncementT *buffer) { int i, err; char indent_buf[indent + 1]; if (stream == NULL || buffer == NULL) { return true; } for (i = 0; i < indent; i++) { indent_buf[i] = ' '; } indent_buf[indent] = '\0'; err = fprintf(stream, "%s", indent_buf); if (err < 0) { return true; } err = fprintf(stream, "EntryId = %d\n", buffer->EntryId); if (err < 0) { return true; } err = fprintf(stream, "%s", indent_buf); if (err < 0) { return true; } err = fprintf(stream, "Timestamp = %lld\n", buffer->Timestamp); if (err < 0) { return true; } err = fprintf(stream, "%s", indent_buf); if (err < 0) { return true; } err = fprintf(stream, "AddedByUsed = %s\n", oSaHpiTypesEnums::torf2str(buffer->AddedByUser)); if (err < 0) { return true; } err = fprintf(stream, "%s", indent_buf); if (err < 0) { return true; } err = fprintf(stream, "Severity = %s\n", oSaHpiTypesEnums::severity2str(buffer->Severity)); if (err < 0) { return true; } err = fprintf(stream, "%s", indent_buf); if (err < 0) { return true; } err = fprintf(stream, "Acknowledged = %s\n", oSaHpiTypesEnums::torf2str(buffer->Acknowledged)); if (err < 0) { return true; } err = fprintf(stream, "%s", indent_buf); if (err < 0) { return true; } err = fprintf(stream, "StatusCond\n"); if (err < 0) { return true; } const SaHpiConditionT * c = (const SaHpiConditionT *)&buffer->StatusCond; err = oSaHpiCondition::fprint(stream, indent + 3, c); if (err < 0) { return true; } return false; } openhpi-2.14.1/cpp/oSaHpiName.cpp0000644000076400007640000000670511302567022013451 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * W. David Ashley */ #include #include #include extern "C" { #include } #include "oSaHpiTypesEnums.hpp" #include "oSaHpiName.hpp" /** * Default constructor. */ oSaHpiName::oSaHpiName() { Length = 0; Value[0] = '\0'; }; /** * Constructor. * * @param str The zero-terminated character string to be assigned to the * stream. */ oSaHpiName::oSaHpiName(const char *str) { if (strlen(str) < SA_HPI_MAX_NAME_LENGTH) { Length = strlen(str); strcpy((char *)Value, str); } else { Length = SA_HPI_MAX_NAME_LENGTH; memcpy(Value, str, SA_HPI_MAX_NAME_LENGTH); } }; /** * Constructor. * * @param str The data to be assigned to the stream. * @param len The length of the data to be assigned to the stream. */ oSaHpiName::oSaHpiName(const void *str, const SaHpiUint8T len) { Length = len; memcpy(Value, str, len); }; /** * Constructor. * * @param buf The reference to the class to be copied. */ oSaHpiName::oSaHpiName(const oSaHpiName& buf) { memcpy(this, &buf, sizeof(SaHpiNameT)); } /** * Assign a field in the SaHpiNameT struct a value. * * @param field The pointer to the struct (class). * @param field The field name as a text string (case sensitive). * @param value The character string value to be assigned to the field. This * value will be converted as necessary. * * @return True if there was an error, otherwise false. */ bool oSaHpiName::assignField(SaHpiNameT *ptr, const char *field, const char *value) { if (ptr == NULL || field == NULL || value == NULL) { return true; } if (strcmp(field, "Value") == 0) { if (strlen(value) < SA_HPI_MAX_NAME_LENGTH) { ptr->Length = strlen(value); strcpy((char *)ptr->Value, value); } else { ptr->Length = SA_HPI_MAX_NAME_LENGTH; memcpy(ptr->Value, value, SA_HPI_MAX_NAME_LENGTH); } return false; } return true; }; /** * Print the contents of the buffer. * * @param stream Target stream. * @param buffer Address of the SaHpiNameT struct. * * @return True if there was an error, otherwise false. */ bool oSaHpiName::fprint(FILE *stream, const int indent, const SaHpiNameT *buffer) { int i, err; char indent_buf[indent + 1]; if (stream == NULL || buffer == NULL) { return true; } for (i = 0; i < indent; i++) { indent_buf[i] = ' '; } indent_buf[indent] = '\0'; err = fprintf(stream, "%s", indent_buf); if (err < 0) { return true; } err = fprintf(stream, "Value = "); for (i = 0; i < buffer->Length; i++) { err = fprintf(stream, "%c\n", buffer->Value[i]); if (err < 0) { return true; } } err = fprintf(stream, "\n"); if (err < 0) { return true; } return false; } openhpi-2.14.1/cpp/oSaHpiCtrlRecOem.hpp0000644000076400007640000000331011302567022014562 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * W. David Ashley */ #ifndef Included_oSaHpiCtrlRecOem #define Included_oSaHpiCtrlRecOem #include extern "C" { #include } class oSaHpiCtrlRecOem : public SaHpiCtrlRecOemT { public: // constructors oSaHpiCtrlRecOem(); oSaHpiCtrlRecOem(SaHpiManufacturerIdT id, const char *config, const char *str); // copy constructor oSaHpiCtrlRecOem(const oSaHpiCtrlRecOem& crd); // destructor ~oSaHpiCtrlRecOem() { } // other methods static bool assignField(SaHpiCtrlRecOemT * ptr, const char *field, const char *value); inline bool assignField(const char *field, const char *value) { return assignField(this, field, value); } inline SaHpiCtrlRecOemT *getStruct(void) { return this; } static bool fprint(FILE *stream, const int indent, const SaHpiCtrlRecOemT *ent); inline bool fprint(FILE *stream, const int indent) { return fprint(stream, indent, this); } }; #endif openhpi-2.14.1/cpp/oSaHpiEntityPath.cpp0000644000076400007640000001071611302567022014657 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * W. David Ashley */ #include #include #include extern "C" { #include } #include "oSaHpiEntity.hpp" #include "oSaHpiEntityPath.hpp" /** * Default constructor. */ oSaHpiEntityPath::oSaHpiEntityPath() { int i; for (i = 0; i < SAHPI_MAX_ENTITY_PATH; i ++) { Entry[i].EntityType = SAHPI_ENT_ROOT; Entry[i].EntityLocation = 0; } }; /** * Constructor. * * @param buf The reference to the class to be copied. */ oSaHpiEntityPath::oSaHpiEntityPath(const oSaHpiEntityPath& entpath) { int i; for (i = 0; i < SAHPI_MAX_ENTITY_PATH; i ++) { Entry[i].EntityType = entpath.Entry[i].EntityType; Entry[i].EntityLocation = entpath.Entry[i].EntityLocation; } } /** * Print the contents of the entity path. * * @param stream Target stream. * @param buffer Address of the SaHpiEntityPathT struct. * * @return True if there was an error, otherwise false. */ bool oSaHpiEntityPath::fprint(FILE *stream, const int indent, const SaHpiEntityPathT *entpath) { int i, err = 0; char indent_buf[indent + 1]; const SaHpiEntityT *ent; if (stream == NULL || entpath == NULL) { return true; } for (i = 0; i < indent; i++) { indent_buf[i] = ' '; } indent_buf[indent] = '\0'; for (i = 0; i < SAHPI_MAX_ENTITY_PATH; i++) { err = fprintf(stream, "%s", indent_buf); if (err < 0) { return true; } err = fprintf(stream, "Entry[%d]\n", i); if (err < 0) { return true; } ent = (const SaHpiEntityT *)&(entpath->Entry[i]); err = oSaHpiEntity::fprint(stream, indent + 3, ent); if (err < 0) { return true; } if (entpath->Entry[i].EntityType == SAHPI_ENT_ROOT) { // no need to print past the root break; } } return false; } /** * Append one entity path to another. * * @param destpath The destination entity path. * @param appendpath The entity path to be appended to the destpath. If the result * entity path is too large it will be truncated. * * @return True if there was an error, otherwise false. */ bool oSaHpiEntityPath::append(SaHpiEntityPathT *destpath, const SaHpiEntityPathT *appendpath) { int i, j; if (!destpath) { return true; } if (!appendpath) { return false; } for (i = 0; i < SAHPI_MAX_ENTITY_PATH; i++) { if (destpath->Entry[i].EntityType == SAHPI_ENT_ROOT) break; } for (j = 0; i < SAHPI_MAX_ENTITY_PATH; i++) { destpath->Entry[i].EntityLocation = appendpath->Entry[j].EntityLocation; destpath->Entry[i].EntityType = appendpath->Entry[j].EntityType; if (appendpath->Entry[j].EntityType == SAHPI_ENT_ROOT) break; j++; } return false; } /** * Compare one entity path to another. * * @param destpath The destination entity path. * @param appendpath The entity path to be appended to the destpath. If the result * entity path is too large it will be truncated. * * @return True if the two entity paths are equal, otherwise false. */ bool oSaHpiEntityPath::compare(const SaHpiEntityPathT *ep1, const SaHpiEntityPathT *ep2) { unsigned int i, j; if (!ep1 || !ep2) { return false; } for (i = 0; i < SAHPI_MAX_ENTITY_PATH; i++) { if (ep1->Entry[i].EntityType == SAHPI_ENT_ROOT) { i++; break; } } for (j = 0; j < SAHPI_MAX_ENTITY_PATH; j++) { if (ep2->Entry[j].EntityType == SAHPI_ENT_ROOT) { j++; break; } } if (i != j) return false; for (i = 0; i < j; i++) { if (ep1->Entry[i].EntityType != ep2->Entry[i].EntityType || ep1->Entry[i].EntityLocation != ep2->Entry[i].EntityLocation) { return false; } } return true; } openhpi-2.14.1/cpp/oSaHpiSensorThresholds.hpp0000644000076400007640000000253011302567022016077 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * W. David Ashley */ #ifndef Included_oSaHpiSensorThresholds #define Included_oSaHpiSensorThresholds #include extern "C" { #include } #include "oSaHpiSensorReading.hpp" class oSaHpiSensorThresholds : public SaHpiSensorThresholdsT { public: // constructors oSaHpiSensorThresholds(); // copy constructor oSaHpiSensorThresholds(const oSaHpiSensorThresholds& sr); // destructor ~oSaHpiSensorThresholds() { } // other methods inline SaHpiSensorThresholdsT *getStruct(void) { return this; } static bool fprint(FILE *stream, const int indent, const SaHpiSensorThresholdsT *ent); inline bool fprint(FILE *stream, const int indent) { return fprint(stream, indent, this); } }; #endif openhpi-2.14.1/cpp/oSaHpiCtrlRecDiscrete.cpp0000644000076400007640000000524711302567022015612 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * W. David Ashley */ #include #include #include extern "C" { #include } #include "oSaHpiTypesEnums.hpp" #include "oSaHpiCtrlRecDiscrete.hpp" /** * Default constructor. */ oSaHpiCtrlRecDiscrete::oSaHpiCtrlRecDiscrete() { Default = 0; }; /** * Constructor. */ oSaHpiCtrlRecDiscrete::oSaHpiCtrlRecDiscrete(SaHpiCtrlStateDiscreteT cs) { Default = cs; }; /** * Constructor. * * @param buf The reference to the class to be copied. */ oSaHpiCtrlRecDiscrete::oSaHpiCtrlRecDiscrete(const oSaHpiCtrlRecDiscrete& ent) { memcpy(this, &ent, sizeof(SaHpiCtrlRecDiscreteT)); } /** * Assign a field in the SaHpiCtrlRecDiscreteT struct a value. * * @param field The pointer to the struct (class). * @param field The field name as a text string (case sensitive). * @param value The character string value to be assigned to the field. This * value will be converted as necessary. * * @return True if there was an error, otherwise false. */ bool oSaHpiCtrlRecDiscrete::assignField(SaHpiCtrlRecDiscreteT *ptr, const char *field, const char *value) { if (ptr == NULL || field == NULL || value == NULL) { return true; } if (strcmp(field, "Default") == 0) { ptr->Default = (SaHpiCtrlStateDiscreteT)atoi(value); return false; } // StateUnion return true; }; /** * Print the contents of the entity. * * @param stream Target stream. * @param buffer Address of the SaHpiCtrlRecDiscreteT struct. * * @return True if there was an error, otherwise false. */ bool oSaHpiCtrlRecDiscrete::fprint(FILE *stream, const int indent, const SaHpiCtrlRecDiscreteT *crd) { int i, err = 0; char indent_buf[indent + 1]; if (stream == NULL || crd == NULL) { return true; } for (i = 0; i < indent; i++) { indent_buf[i] = ' '; } indent_buf[indent] = '\0'; err = fprintf(stream, "%s", indent_buf); if (err < 0) { return true; } err = fprintf(stream, "Default = %u\n", crd->Default); if (err < 0) { return true; } return false; } openhpi-2.14.1/cpp/oSaHpiAlarm.hpp0000644000076400007640000000301211302567022013616 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * W. David Ashley */ #ifndef Included_oSaHpiAlarm #define Included_oSaHpiAlarm #include extern "C" { #include } class oSaHpiAlarm : public SaHpiAlarmT { public: // constructors oSaHpiAlarm(); // copy constructor oSaHpiAlarm(const oSaHpiAlarm& buf); // destructor ~oSaHpiAlarm() { } // other methods static bool assignField(SaHpiAlarmT * ptr, const char *field, const char *value); inline bool assignField(const char *field, const char *value) { return assignField(this, field, value); } inline SaHpiAlarmT *getStruct(void) { return this; } static bool fprint(FILE *stream, const int indent, const SaHpiAlarmT *buffer); inline bool fprint(FILE *stream, const int indent) { return fprint(stream, indent, this); } }; #endif openhpi-2.14.1/cpp/oSaHpiDrtEntry.hpp0000644000076400007640000000305311302567022014342 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * W. David Ashley */ #ifndef Included_oSaHpiDrtEntry #define Included_oSaHpiDrtEntry #include extern "C" { #include } class oSaHpiDrtEntry : public SaHpiDrtEntryT { public: // constructors oSaHpiDrtEntry(); // copy constructor oSaHpiDrtEntry(const oSaHpiDrtEntry& buf); // destructor ~oSaHpiDrtEntry() { } // other methods static bool assignField(SaHpiDrtEntryT * ptr, const char *field, const char *value); inline bool assignField(const char *field, const char *value) { return assignField(this, field, value); } inline SaHpiDrtEntryT *getStruct(void) { return this; } static bool fprint(FILE *stream, const int indent, const SaHpiDrtEntryT *buffer); inline bool fprint(FILE *stream, const int indent) { return fprint(stream, indent, this); } }; #endif openhpi-2.14.1/cpp/oSaHpiCtrlStateOem.cpp0000644000076400007640000000761611302567022015141 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * W. David Ashley */ #include #include #include extern "C" { #include } #include "oSaHpiTypesEnums.hpp" #include "oSaHpiCtrlStateOem.hpp" /** * Default constructor. */ oSaHpiCtrlStateOem::oSaHpiCtrlStateOem() { MId = SAHPI_MANUFACTURER_ID_UNSPECIFIED; BodyLength = 0; Body[0] = '\0'; }; /** * Constructor. * * @param type The manufacturer id. * @param str The zero-terminated character string to be assigned to the * stream. */ oSaHpiCtrlStateOem::oSaHpiCtrlStateOem(const SaHpiManufacturerIdT id, const char *str) { MId = id; if (strlen(str) < SAHPI_CTRL_MAX_OEM_BODY_LENGTH) { BodyLength = strlen(str); strcpy((char *)Body, str); } else { BodyLength = SAHPI_CTRL_MAX_OEM_BODY_LENGTH; memcpy(Body, str, SAHPI_CTRL_MAX_OEM_BODY_LENGTH); } }; /** * Constructor. * * @param buf The reference to the class to be copied. */ oSaHpiCtrlStateOem::oSaHpiCtrlStateOem(const oSaHpiCtrlStateOem& buf) { memcpy(this, &buf, sizeof(SaHpiCtrlStateOemT)); } /** * Assign a field in the SaHpiCtrlStateOemT struct a value. * * @param field The pointer to the struct (class). * @param field The field name as a text string (case sensitive). * @param value The character string value to be assigned to the field. This * value will be converted as necessary. * * @return True if there was an error, otherwise false. */ bool oSaHpiCtrlStateOem::assignField(SaHpiCtrlStateOemT *ptr, const char *field, const char *value) { // note that DataLength cannot be assigned a value using this method if (ptr == NULL || field == NULL || value == NULL) { return true; } if (strcmp(field, "MId") == 0) { ptr->MId = atoi(value); return false; } else if (strcmp(field, "Body") == 0) { if (strlen(value) < SAHPI_CTRL_MAX_OEM_BODY_LENGTH) { ptr->BodyLength = strlen(value); strcpy((char *)ptr->Body, value); } else { ptr->BodyLength = SAHPI_CTRL_MAX_OEM_BODY_LENGTH; memcpy(ptr->Body, value, SAHPI_CTRL_MAX_OEM_BODY_LENGTH); } return false; } return true; }; /** * Print the contents of the buffer. * * @param stream Target stream. * @param buffer Address of the SaHpiCtrlStateOemT struct. * * @return True if there was an error, otherwise false. */ bool oSaHpiCtrlStateOem::fprint(FILE *stream, const int indent, const SaHpiCtrlStateOemT *buffer) { int i, err; char indent_buf[indent + 1]; if (stream == NULL || buffer == NULL) { return true; } for (i = 0; i < indent; i++) { indent_buf[i] = ' '; } indent_buf[indent] = '\0'; err = fprintf(stream, "%s", indent_buf); if (err < 0) { return true; } err = fprintf(stream, "MId = %d\n", buffer->MId); if (err < 0) { return true; } err = fprintf(stream, "%s", indent_buf); if (err < 0) { return true; } err = fprintf(stream, "Body = "); for (i = 0; i < buffer->BodyLength; i++) { err = fprintf(stream, "%c\n", buffer->Body[i]); if (err < 0) { return true; } } err = fprintf(stream, "\n"); if (err < 0) { return true; } return false; } openhpi-2.14.1/cpp/oSaHpiCtrlRecStream.hpp0000644000076400007640000000242711302567022015305 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * W. David Ashley */ #ifndef Included_oSaHpiCtrlRecStream #define Included_oSaHpiCtrlRecStream #include extern "C" { #include } class oSaHpiCtrlRecStream : public SaHpiCtrlRecStreamT { public: // constructors oSaHpiCtrlRecStream(); // copy constructor oSaHpiCtrlRecStream(const oSaHpiCtrlRecStream& crd); // destructor ~oSaHpiCtrlRecStream() { } // other methods inline SaHpiCtrlRecStreamT *getStruct(void) { return this; } static bool fprint(FILE *stream, const int indent, const SaHpiCtrlRecStreamT *ent); inline bool fprint(FILE *stream, const int indent) { return fprint(stream, indent, this); } }; #endif openhpi-2.14.1/cpp/oSaHpiAlarm.cpp0000644000076400007640000001072111302567022013616 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * W. David Ashley */ #include #include #include extern "C" { #include } #include "oSaHpiTypesEnums.hpp" #include "oSaHpiCondition.hpp" #include "oSaHpiAlarm.hpp" /** * Default constructor. */ oSaHpiAlarm::oSaHpiAlarm() { AlarmId = 1; Timestamp = 0; Severity = SAHPI_OK; Acknowledged = false; AlarmCond.Type = SAHPI_STATUS_COND_TYPE_SENSOR; AlarmCond.Entity.Entry[0].EntityType = SAHPI_ENT_ROOT; AlarmCond.Entity.Entry[0].EntityLocation = 0; AlarmCond.DomainId = SAHPI_UNSPECIFIED_DOMAIN_ID; AlarmCond.ResourceId = 1; AlarmCond.SensorNum = 1; AlarmCond.EventState = SAHPI_ES_UNSPECIFIED; AlarmCond.Name.Length = 0; AlarmCond.Name.Value[0] = '\0'; AlarmCond.Mid = SAHPI_MANUFACTURER_ID_UNSPECIFIED; AlarmCond.Data.DataType = SAHPI_TL_TYPE_TEXT; AlarmCond.Data.Language = SAHPI_LANG_ENGLISH; AlarmCond.Data.DataLength = 0; AlarmCond.Data.Data[0] = '\0'; }; /** * Constructor. * * @param buf The reference to the class to be copied. */ oSaHpiAlarm::oSaHpiAlarm(const oSaHpiAlarm& buf) { memcpy(this, &buf, sizeof(SaHpiAlarmT)); } /** * Assign a field in the SaHpiAlarmT struct a value. * * @param field The pointer to the struct (class). * @param field The field name as a text string (case sensitive). * @param value The character string value to be assigned to the field. This * value will be converted as necessary. * * @return True if there was an error, otherwise false. */ bool oSaHpiAlarm::assignField(SaHpiAlarmT *ptr, const char *field, const char *value) { if (ptr == NULL || field == NULL || value == NULL) { return true; } if (strcmp(field, "AlarmId") == 0) { ptr->AlarmId = strtoul(value, NULL, 10); return false; } else if (strcmp(field, "Timestamp") == 0) { ptr->Timestamp = strtoull(value, NULL, 10); return false; } else if (strcmp(field, "Severity") == 0) { ptr->Severity = oSaHpiTypesEnums::str2severity(value); return false; } else if (strcmp(field, "Acknowledged") == 0) { ptr->Acknowledged = oSaHpiTypesEnums::str2torf(value); return false; } // AlarmCond return true; }; /** * Print the contents of the buffer. * * @param stream Target stream. * @param buffer Address of the SaHpiAlarmT struct. * * @return True if there was an error, otherwise false. */ bool oSaHpiAlarm::fprint(FILE *stream, const int indent, const SaHpiAlarmT *buffer) { int i, err; char indent_buf[indent + 1]; if (stream == NULL || buffer == NULL) { return true; } for (i = 0; i < indent; i++) { indent_buf[i] = ' '; } indent_buf[indent] = '\0'; err = fprintf(stream, "%s", indent_buf); if (err < 0) { return true; } err = fprintf(stream, "AlarmId = %u\n", buffer->AlarmId); if (err < 0) { return true; } err = fprintf(stream, "%s", indent_buf); if (err < 0) { return true; } err = fprintf(stream, "Timestamp = %lld\n", buffer->Timestamp); if (err < 0) { return true; } err = fprintf(stream, "%s", indent_buf); if (err < 0) { return true; } err = fprintf(stream, "Severity = %s\n", oSaHpiTypesEnums::severity2str(buffer->Severity)); if (err < 0) { return true; } err = fprintf(stream, "%s", indent_buf); if (err < 0) { return true; } err = fprintf(stream, "Acknowledged = %s\n", oSaHpiTypesEnums::torf2str(buffer->Acknowledged)); if (err < 0) { return true; } err = fprintf(stream, "%s", indent_buf); if (err < 0) { return true; } err = fprintf(stream, "AlarmCond\n"); if (err < 0) { return true; } const SaHpiConditionT *c = &buffer->AlarmCond; err = oSaHpiCondition::fprint(stream, indent + 3, c); if (err < 0) { return true; } return false; } openhpi-2.14.1/cpp/oSaHpiIdrInfo.cpp0000644000076400007640000000670311302567022014121 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * W. David Ashley */ #include #include #include extern "C" { #include } #include "oSaHpiTypesEnums.hpp" #include "oSaHpiIdrInfo.hpp" /** * Default constructor. */ oSaHpiIdrInfo::oSaHpiIdrInfo() { IdrId = 1; UpdateCount = 0; ReadOnly = false; NumAreas = 0; }; /** * Constructor. * * @param buf The reference to the class to be copied. */ oSaHpiIdrInfo::oSaHpiIdrInfo(const oSaHpiIdrInfo& buf) { memcpy(this, &buf, sizeof(SaHpiIdrInfoT)); } /** * Assign a field in the SaHpiIdrInfoT struct a value. * * @param field The pointer to the struct (class). * @param field The field name as a text string (case sensitive). * @param value The character string value to be assigned to the field. This * value will be converted as necessary. * * @return True if there was an error, otherwise false. */ bool oSaHpiIdrInfo::assignField(SaHpiIdrInfoT *ptr, const char *field, const char *value) { if (ptr == NULL || field == NULL || value == NULL) { return true; } if (strcmp(field, "IdrId") == 0) { ptr->IdrId = strtoul(value, NULL, 10); return false; } else if (strcmp(field, "UpdateCount") == 0) { ptr->UpdateCount = strtoul(value, NULL, 10); return false; } else if (strcmp(field, "ReadOnly") == 0) { ptr->ReadOnly = oSaHpiTypesEnums::str2torf(value); return false; } else if (strcmp(field, "NumAreas") == 0) { ptr->NumAreas = strtoul(value, NULL, 10); return false; } return true; }; /** * Print the contents of the buffer. * * @param stream Target stream. * @param buffer Address of the SaHpiIdrInfoT struct. * * @return True if there was an error, otherwise false. */ bool oSaHpiIdrInfo::fprint(FILE *stream, const int indent, const SaHpiIdrInfoT *buffer) { int i, err; char indent_buf[indent + 1]; if (stream == NULL || buffer == NULL) { return true; } for (i = 0; i < indent; i++) { indent_buf[i] = ' '; } indent_buf[indent] = '\0'; err = fprintf(stream, "%s", indent_buf); if (err < 0) { return true; } err = fprintf(stream, "IdrId = %d\n", buffer->IdrId); if (err < 0) { return true; } err = fprintf(stream, "%s", indent_buf); if (err < 0) { return true; } err = fprintf(stream, "UpdateCount = %d\n", buffer->UpdateCount); if (err < 0) { return true; } err = fprintf(stream, "%s", indent_buf); if (err < 0) { return true; } err = fprintf(stream, "ReadOnly = %s\n", oSaHpiTypesEnums::torf2str(buffer->ReadOnly)); if (err < 0) { return true; } err = fprintf(stream, "%s", indent_buf); if (err < 0) { return true; } err = fprintf(stream, "NumAreas = %d\n", buffer->NumAreas); if (err < 0) { return true; } return false; } openhpi-2.14.1/cpp/oSaHpiCtrlStateText.hpp0000644000076400007640000000322011302567022015335 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * W. David Ashley */ #ifndef Included_oSaHpiCtrlStateText #define Included_oSaHpiCtrlStateText #include extern "C" { #include } class oSaHpiCtrlStateText : public SaHpiCtrlStateTextT { public: // constructors oSaHpiCtrlStateText(); oSaHpiCtrlStateText(const char *str); // copy constructor oSaHpiCtrlStateText(const oSaHpiCtrlStateText& buf); // destructor ~oSaHpiCtrlStateText() { } // other methods static bool assignField(SaHpiCtrlStateTextT * ptr, const char *field, const char *value); inline bool assignField(const char *field, const char *value) { return assignField(this, field, value); } inline SaHpiCtrlStateTextT *getStruct(void) { return this; } static bool fprint(FILE *stream, const int indent, const SaHpiCtrlStateTextT *buffer); inline bool fprint(FILE *stream, const int indent) { return fprint(stream, indent, this); } }; #endif openhpi-2.14.1/cpp/oSaHpiEventLogInfo.cpp0000644000076400007640000001304111302567022015117 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * W. David Ashley */ #include #include #include extern "C" { #include } #include "oSaHpiTypesEnums.hpp" #include "oSaHpiEventLogInfo.hpp" /** * Default constructor. */ oSaHpiEventLogInfo::oSaHpiEventLogInfo() { Entries = 0; Size = 0; UserEventMaxSize = 0; UpdateTimestamp = 0; CurrentTime = 0; Enabled = false; OverflowFlag = false; OverflowResetable = false; OverflowAction = SAHPI_EL_OVERFLOW_DROP; }; /** * Constructor. * * @param buf The reference to the class to be copied. */ oSaHpiEventLogInfo::oSaHpiEventLogInfo(const oSaHpiEventLogInfo& buf) { memcpy(this, &buf, sizeof(SaHpiEventLogInfoT)); } /** * Assign a field in the SaHpiEventLogInfoT struct a value. * * @param field The pointer to the struct (class). * @param field The field name as a text string (case sensitive). * @param value The character string value to be assigned to the field. This * value will be converted as necessary. * * @return True if there was an error, otherwise false. */ bool oSaHpiEventLogInfo::assignField(SaHpiEventLogInfoT *ptr, const char *field, const char *value) { if (ptr == NULL || field == NULL || value == NULL) { return true; } if (strcmp(field, "Entries") == 0) { ptr->Entries = strtoul(value, NULL, 10); return false; } else if (strcmp(field, "Size") == 0) { ptr->Size = strtoul(value, NULL, 10); return false; } else if (strcmp(field, "UserEventMaxSize") == 0) { ptr->UserEventMaxSize = strtoul(value, NULL, 10); return false; } else if (strcmp(field, "UpdateTimestamp") == 0) { ptr->UpdateTimestamp = strtoull(value, NULL, 10); return false; } else if (strcmp(field, "CurrentTime") == 0) { ptr->CurrentTime = strtoull(value, NULL, 10); return false; } else if (strcmp(field, "Enabled") == 0) { ptr->Enabled = oSaHpiTypesEnums::str2torf(value); return false; } else if (strcmp(field, "OverflowFlag") == 0) { ptr->OverflowFlag = oSaHpiTypesEnums::str2torf(value); return false; } else if (strcmp(field, "OverflowResetable") == 0) { ptr->OverflowResetable = oSaHpiTypesEnums::str2torf(value); return false; } else if (strcmp(field, "OverflowAction") == 0) { ptr->OverflowAction = oSaHpiTypesEnums::str2eventlogoverflowaction(value); return false; } return true; }; /** * Print the contents of the buffer. * * @param stream Target stream. * @param buffer Address of the SaHpiEventLogInfoT struct. * * @return True if there was an error, otherwise false. */ bool oSaHpiEventLogInfo::fprint(FILE *stream, const int indent, const SaHpiEventLogInfoT *buffer) { int i, err; char indent_buf[indent + 1]; if (stream == NULL || buffer == NULL) { return true; } for (i = 0; i < indent; i++) { indent_buf[i] = ' '; } indent_buf[indent] = '\0'; err = fprintf(stream, "%s", indent_buf); if (err < 0) { return true; } err = fprintf(stream, "Entries = %u\n", buffer->Entries); if (err < 0) { return true; } err = fprintf(stream, "%s", indent_buf); if (err < 0) { return true; } err = fprintf(stream, "Size = %u\n", buffer->Size); if (err < 0) { return true; } err = fprintf(stream, "%s", indent_buf); if (err < 0) { return true; } err = fprintf(stream, "UserEventMaxSize = %u\n", buffer->UserEventMaxSize); if (err < 0) { return true; } err = fprintf(stream, "%s", indent_buf); if (err < 0) { return true; } err = fprintf(stream, "UpdateTimestamp = %lld\n", buffer->UpdateTimestamp); if (err < 0) { return true; } err = fprintf(stream, "%s", indent_buf); if (err < 0) { return true; } err = fprintf(stream, "CurrentTime = %lld\n", buffer->CurrentTime); if (err < 0) { return true; } err = fprintf(stream, "%s", indent_buf); if (err < 0) { return true; } err = fprintf(stream, "Enabled = %s\n", oSaHpiTypesEnums::torf2str(buffer->Enabled)); if (err < 0) { return true; } err = fprintf(stream, "%s", indent_buf); if (err < 0) { return true; } err = fprintf(stream, "OverflowFlag = %s\n", oSaHpiTypesEnums::torf2str(buffer->OverflowFlag)); if (err < 0) { return true; } err = fprintf(stream, "%s", indent_buf); if (err < 0) { return true; } err = fprintf(stream, "OverflowResetable = %s\n", oSaHpiTypesEnums::torf2str(buffer->OverflowResetable)); if (err < 0) { return true; } err = fprintf(stream, "%s", indent_buf); if (err < 0) { return true; } err = fprintf(stream, "OverflowAction = %s\n", oSaHpiTypesEnums::eventlogoverflowaction2str(buffer->OverflowAction)); if (err < 0) { return true; } return false; } openhpi-2.14.1/cpp/oSaHpiCondition.cpp0000644000076400007640000001376011302567022014516 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * W. David Ashley */ #include #include #include extern "C" { #include } #include "oSaHpiTypesEnums.hpp" #include "oSaHpiEntityPath.hpp" #include "oSaHpiTextBuffer.hpp" #include "oSaHpiCondition.hpp" /** * Default constructor. */ oSaHpiCondition::oSaHpiCondition() { Type = SAHPI_STATUS_COND_TYPE_SENSOR; Entity.Entry[0].EntityType = SAHPI_ENT_ROOT; Entity.Entry[0].EntityLocation = 0; DomainId = SAHPI_UNSPECIFIED_DOMAIN_ID; ResourceId = 1; SensorNum = 1; EventState = SAHPI_ES_UNSPECIFIED; Name.Length = 0; Name.Value[0] = '\0'; Mid = SAHPI_MANUFACTURER_ID_UNSPECIFIED; Data.DataType = SAHPI_TL_TYPE_TEXT; Data.Language = SAHPI_LANG_ENGLISH; Data.DataLength = 0; Data.Data[0] = '\0'; }; /** * Constructor. * * @param buf The reference to the class to be copied. */ oSaHpiCondition::oSaHpiCondition(const oSaHpiCondition& buf) { memcpy(this, &buf, sizeof(SaHpiConditionT)); } /** * Assign a field in the SaHpiConditionT struct a value. * * @param field The pointer to the struct (class). * @param field The field name as a text string (case sensitive). * @param value The character string value to be assigned to the field. This * value will be converted as necessary. * * @return True if there was an error, otherwise false. */ bool oSaHpiCondition::assignField(SaHpiConditionT *ptr, const char *field, const char *value) { if (ptr == NULL || field == NULL || value == NULL) { return true; } if (strcmp(field, "Type") == 0) { ptr->Type = oSaHpiTypesEnums::str2statuscondtype(value); return false; } // Entity else if (strcmp(field, "DomainId") == 0) { if (strcmp(value, "SAHPI_UNSPECIFIED_DOMAIN_ID") == 0) { ptr->DomainId = SAHPI_UNSPECIFIED_DOMAIN_ID; } else { ptr->DomainId = strtoul(value, NULL, 10); } return false; } else if (strcmp(field, "ResourceId") == 0) { ptr->ResourceId = strtoul(value, NULL, 10); return false; } else if (strcmp(field, "SensorNum") == 0) { ptr->SensorNum = strtoul(value, NULL, 10); return false; } else if (strcmp(field, "EventState") == 0) { ptr->EventState = oSaHpiTypesEnums::str2eventstate(value); return false; } else if (strcmp(field, "Name") == 0) { if (strlen(value) < SA_HPI_MAX_NAME_LENGTH) { ptr->Name.Length = strlen(value); strcpy((char *)ptr->Name.Value, value); } else { ptr->Name.Length = SA_HPI_MAX_NAME_LENGTH; memcpy(ptr->Name.Value, value, SA_HPI_MAX_NAME_LENGTH); } return false; } else if (strcmp(field, "Mid") == 0) { ptr->Mid = atoi(value); return false; } // Data return true; }; /** * Print the contents of the buffer. * * @param stream Target stream. * @param buffer Address of the SaHpiConditionT struct. * * @return True if there was an error, otherwise false. */ bool oSaHpiCondition::fprint(FILE *stream, const int indent, const SaHpiConditionT *buffer) { int i, err; char indent_buf[indent + 1]; if (stream == NULL || buffer == NULL) { return true; } for (i = 0; i < indent; i++) { indent_buf[i] = ' '; } indent_buf[indent] = '\0'; err = fprintf(stream, "%s", indent_buf); if (err < 0) { return true; } err = fprintf(stream, "Type = %s\n", oSaHpiTypesEnums::statuscondtype2str(buffer->Type)); if (err < 0) { return true; } err = fprintf(stream, "%s", indent_buf); if (err < 0) { return true; } err = fprintf(stream, "Entity\n"); const SaHpiEntityPathT *ep = (const SaHpiEntityPathT *)&buffer->Entity; err = oSaHpiEntityPath::fprint(stream, indent + 3, ep); if (err < 0) { return true; } err = fprintf(stream, "%s", indent_buf); if (err < 0) { return true; } err = fprintf(stream, "ResourceId = %d\n", buffer->ResourceId); if (err < 0) { return true; } err = fprintf(stream, "%s", indent_buf); if (err < 0) { return true; } err = fprintf(stream, "SensorNum = %d\n", buffer->SensorNum); if (err < 0) { return true; } err = fprintf(stream, "%s", indent_buf); if (err < 0) { return true; } err = fprintf(stream, "EventState = %s\n", oSaHpiTypesEnums::eventstate2str(buffer->EventState)); if (err < 0) { return true; } err = fprintf(stream, "%s", indent_buf); if (err < 0) { return true; } err = fprintf(stream, "Name = "); for (i = 0; i < buffer->Name.Length; i++) { err = fprintf(stream, "%c\n", buffer->Name.Value[i]); if (err < 0) { return true; } } err = fprintf(stream, "\n"); if (err < 0) { return true; } err = fprintf(stream, "%s", indent_buf); if (err < 0) { return true; } err = fprintf(stream, "Mid = %d\n", buffer->Mid); if (err < 0) { return true; } err = fprintf(stream, "%s", indent_buf); if (err < 0) { return true; } err = fprintf(stream, "Data\n"); if (err < 0) { return true; } const SaHpiTextBufferT * tb = (const SaHpiTextBufferT *)&buffer->Data; err = oSaHpiTextBuffer::fprint(stream, indent + 3, tb); if (err < 0) { return true; } return false; } openhpi-2.14.1/cpp/oSaHpiDomainInfo.hpp0000644000076400007640000000310111302567022014604 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * W. David Ashley */ #ifndef Included_oSaHpiDomainInfo #define Included_oSaHpiDomainInfo #include extern "C" { #include } class oSaHpiDomainInfo : public SaHpiDomainInfoT { public: // constructors oSaHpiDomainInfo(); // copy constructor oSaHpiDomainInfo(const oSaHpiDomainInfo& buf); // destructor ~oSaHpiDomainInfo() { } // other methods static bool assignField(SaHpiDomainInfoT * ptr, const char *field, const char *value); inline bool assignField(const char *field, const char *value) { return assignField(this, field, value); } inline SaHpiDomainInfoT *getStruct(void) { return this; } static bool fprint(FILE *stream, const int indent, const SaHpiDomainInfoT *buffer); inline bool fprint(FILE *stream, const int indent) { return fprint(stream, indent, this); } }; #endif openhpi-2.14.1/cpp/oSaHpiRptEntry.hpp0000644000076400007640000000305311302567022014356 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * W. David Ashley */ #ifndef Included_oSaHpiRptEntry #define Included_oSaHpiRptEntry #include extern "C" { #include } class oSaHpiRptEntry : public SaHpiRptEntryT { public: // constructors oSaHpiRptEntry(); // copy constructor oSaHpiRptEntry(const oSaHpiRptEntry& buf); // destructor ~oSaHpiRptEntry() { } // other methods static bool assignField(SaHpiRptEntryT * ptr, const char *field, const char *value); inline bool assignField(const char *field, const char *value) { return assignField(this, field, value); } inline SaHpiRptEntryT *getStruct(void) { return this; } static bool fprint(FILE *stream, const int indent, const SaHpiRptEntryT *buffer); inline bool fprint(FILE *stream, const int indent) { return fprint(stream, indent, this); } }; #endif openhpi-2.14.1/cpp/oSaHpi.hpp0000644000076400007640000000427211302567022012652 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * W. David Ashley */ #ifndef Included_oSaHpi #define Included_oSaHpi #include extern "C" { #include } #include "oSaHpiAlarm.hpp" #include "oSaHpiAnnouncement.hpp" #include "oSaHpiAnnunciatorRec.hpp" #include "oSaHpiCondition.hpp" #include "oSaHpiCtrlDefaultMode.hpp" #include "oSaHpiCtrlRec.hpp" #include "oSaHpiCtrlRecAnalog.hpp" #include "oSaHpiCtrlRecDigital.hpp" #include "oSaHpiCtrlRecDiscrete.hpp" #include "oSaHpiCtrlRecOem.hpp" #include "oSaHpiCtrlRecStream.hpp" #include "oSaHpiCtrlRecText.hpp" #include "oSaHpiCtrlState.hpp" #include "oSaHpiCtrlStateOem.hpp" #include "oSaHpiCtrlStateStream.hpp" #include "oSaHpiCtrlStateText.hpp" #include "oSaHpiDomainEvent.hpp" #include "oSaHpiDomainInfo.hpp" #include "oSaHpiDrtEntry.hpp" #include "oSaHpiEntity.hpp" #include "oSaHpiEntityPath.hpp" #include "oSaHpiEvent.hpp" #include "oSaHpiEventLogEntry.hpp" #include "oSaHpiEventLogInfo.hpp" #include "oSaHpiHotSwapEvent.hpp" #include "oSaHpiHpiSwEvent.hpp" #include "oSaHpiIdrAreaHeader.hpp" #include "oSaHpiIdrField.hpp" #include "oSaHpiIdrInfo.hpp" #include "oSaHpiInventoryRec.hpp" #include "oSaHpiName.hpp" #include "oSaHpiOemEvent.hpp" #include "oSaHpiRdr.hpp" #include "oSaHpiResourceEvent.hpp" #include "oSaHpiResourceInfo.hpp" #include "oSaHpiRptEntry.hpp" #include "oSaHpiSensorDataFormat.hpp" #include "oSaHpiSensorEnableChangeEvent.hpp" #include "oSaHpiSensorEvent.hpp" #include "oSaHpiSensorRange.hpp" #include "oSaHpiSensorReading.hpp" #include "oSaHpiSensorRec.hpp" #include "oSaHpiSensorThdDefn.hpp" #include "oSaHpiSensorThresholds.hpp" #include "oSaHpiTextBuffer.hpp" #include "oSaHpiTypesEnums.hpp" #include "oSaHpiUserEvent.hpp" #include "oSaHpiWatchdog.hpp" #include "oSaHpiWatchdogEvent.hpp" #include "oSaHpiWatchdogRec.hpp" #endif openhpi-2.14.1/cpp/oSaHpiHpiSwEvent.cpp0000644000076400007640000000657011302567022014625 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * W. David Ashley */ #include #include #include extern "C" { #include } #include "oSaHpiTypesEnums.hpp" #include "oSaHpiTextBuffer.hpp" #include "oSaHpiHpiSwEvent.hpp" /** * Default constructor. */ oSaHpiHpiSwEvent::oSaHpiHpiSwEvent() { MId = SAHPI_MANUFACTURER_ID_UNSPECIFIED; Type = SAHPI_HPIE_AUDIT; EventData.DataType = SAHPI_TL_TYPE_TEXT; EventData.Language = SAHPI_LANG_ENGLISH; EventData.DataLength = 0; EventData.Data[0] = '\0'; }; /** * Constructor. * * @param buf The reference to the class to be copied. */ oSaHpiHpiSwEvent::oSaHpiHpiSwEvent(const oSaHpiHpiSwEvent& buf) { memcpy(this, &buf, sizeof(SaHpiHpiSwEventT)); } /** * Assign a field in the SaHpiHpiSwEventT struct a value. * * @param field The pointer to the struct (class). * @param field The field name as a text string (case sensitive). * @param value The character string value to be assigned to the field. This * value will be converted as necessary. * * @return True if there was an error, otherwise false. */ bool oSaHpiHpiSwEvent::assignField(SaHpiHpiSwEventT *ptr, const char *field, const char *value) { if (ptr == NULL || field == NULL || value == NULL) { return true; } if (strcmp(field, "MId") == 0) { ptr->MId = atoi(value); return false; } else if (strcmp(field, "Type") == 0) { ptr->Type = oSaHpiTypesEnums::str2sweventtype(value); return false; } // EventData return true; }; /** * Print the contents of the buffer. * * @param stream Target stream. * @param buffer Address of the SaHpiHpiSwEventT struct. * * @return True if there was an error, otherwise false. */ bool oSaHpiHpiSwEvent::fprint(FILE *stream, const int indent, const SaHpiHpiSwEventT *buffer) { int i, err; char indent_buf[indent + 1]; if (stream == NULL || buffer == NULL) { return true; } for (i = 0; i < indent; i++) { indent_buf[i] = ' '; } indent_buf[indent] = '\0'; err = fprintf(stream, "%s", indent_buf); if (err < 0) { return true; } err = fprintf(stream, "MId = %d\n", buffer->MId); if (err < 0) { return true; } err = fprintf(stream, "%s", indent_buf); if (err < 0) { return true; } err = fprintf(stream, "Type = %s\n", oSaHpiTypesEnums::sweventtype2str(buffer->Type)); if (err < 0) { return true; } err = fprintf(stream, "%s", indent_buf); if (err < 0) { return true; } err = fprintf(stream, "EventData\n"); if (err < 0) { return true; } const SaHpiTextBufferT *tb = (const SaHpiTextBufferT *)&buffer->EventData; err = oSaHpiTextBuffer::fprint(stream, indent + 3, tb); if (err < 0) { return true; } return false; } openhpi-2.14.1/cpp/oSaHpiIdrAreaHeader.hpp0000644000076400007640000000314211302567022015206 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * W. David Ashley */ #ifndef Included_oSaHpiIdrAreaHeader #define Included_oSaHpiIdrAreaHeader #include extern "C" { #include } class oSaHpiIdrAreaHeader : public SaHpiIdrAreaHeaderT { public: // constructors oSaHpiIdrAreaHeader(); // copy constructor oSaHpiIdrAreaHeader(const oSaHpiIdrAreaHeader& buf); // destructor ~oSaHpiIdrAreaHeader() { } // other methods static bool assignField(SaHpiIdrAreaHeaderT * ptr, const char *field, const char *value); inline bool assignField(const char *field, const char *value) { return assignField(this, field, value); } inline SaHpiIdrAreaHeaderT *getStruct(void) { return this; } static bool fprint(FILE *stream, const int indent, const SaHpiIdrAreaHeaderT *buffer); inline bool fprint(FILE *stream, const int indent) { return fprint(stream, indent, this); } }; #endif openhpi-2.14.1/cpp/oSaHpiInventoryRec.hpp0000644000076400007640000000312711302567022015220 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * W. David Ashley */ #ifndef Included_oSaHpiInventoryRec #define Included_oSaHpiInventoryRec #include extern "C" { #include } class oSaHpiInventoryRec : public SaHpiInventoryRecT { public: // constructors oSaHpiInventoryRec(); // copy constructor oSaHpiInventoryRec(const oSaHpiInventoryRec& buf); // destructor ~oSaHpiInventoryRec() { } // other methods static bool assignField(SaHpiInventoryRecT * ptr, const char *field, const char *value); inline bool assignField(const char *field, const char *value) { return assignField(this, field, value); } inline SaHpiInventoryRecT *getStruct(void) { return this; } static bool fprint(FILE *stream, const int indent, const SaHpiInventoryRecT *buffer); inline bool fprint(FILE *stream, const int indent) { return fprint(stream, indent, this); } }; #endif openhpi-2.14.1/cpp/oSaHpiOemEvent.hpp0000644000076400007640000000305311302567022014311 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * W. David Ashley */ #ifndef Included_oSaHpiOemEvent #define Included_oSaHpiOemEvent #include extern "C" { #include } class oSaHpiOemEvent : public SaHpiOemEventT { public: // constructors oSaHpiOemEvent(); // copy constructor oSaHpiOemEvent(const oSaHpiOemEvent& buf); // destructor ~oSaHpiOemEvent() { } // other methods static bool assignField(SaHpiOemEventT * ptr, const char *field, const char *value); inline bool assignField(const char *field, const char *value) { return assignField(this, field, value); } inline SaHpiOemEventT *getStruct(void) { return this; } static bool fprint(FILE *stream, const int indent, const SaHpiOemEventT *buffer); inline bool fprint(FILE *stream, const int indent) { return fprint(stream, indent, this); } }; #endif openhpi-2.14.1/cpp/oSaHpiCtrlRec.hpp0000644000076400007640000000303211302567022014122 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * W. David Ashley */ #ifndef Included_oSaHpiCtrlRec #define Included_oSaHpiCtrlRec #include extern "C" { #include } class oSaHpiCtrlRec : public SaHpiCtrlRecT { public: // constructors oSaHpiCtrlRec(); // copy constructor oSaHpiCtrlRec(const oSaHpiCtrlRec& cr); // destructor ~oSaHpiCtrlRec() { } // other methods static bool assignField(SaHpiCtrlRecT *ptr, const char *field, const char *value); inline bool assignField(const char *field, const char *value) { return assignField(this, field, value); } inline SaHpiCtrlRecT *getStruct(void) { return this; } static bool fprint(FILE *stream, const int indent, const SaHpiCtrlRecT *sr); inline bool fprint(FILE *stream, const int indent) { return fprint(stream, indent, this); } }; #endif openhpi-2.14.1/cpp/oSaHpiCtrlStateText.cpp0000644000076400007640000000710511302567022015336 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * W. David Ashley */ #include #include #include extern "C" { #include } #include "oSaHpiTypesEnums.hpp" #include "oSaHpiTextBuffer.hpp" #include "oSaHpiCtrlStateText.hpp" /** * Default constructor. */ oSaHpiCtrlStateText::oSaHpiCtrlStateText() { Line = 0; Text.DataType = SAHPI_TL_TYPE_TEXT; Text.Language = SAHPI_LANG_ENGLISH; Text.DataLength = 0; Text.Data[0] = '\0'; }; /** * Constructor. * * @param str The zero-terminated character string to be assigned to the * text filed. */ oSaHpiCtrlStateText::oSaHpiCtrlStateText(const char *str) { Line = 0; Text.DataType = SAHPI_TL_TYPE_TEXT; Text.Language = SAHPI_LANG_ENGLISH; if (strlen(str) < SAHPI_CTRL_MAX_STREAM_LENGTH) { Text.DataLength = strlen(str); strcpy((char *)Text.Data, str); } else { Text.DataLength = SAHPI_CTRL_MAX_STREAM_LENGTH; memcpy(Text.Data, str, SAHPI_CTRL_MAX_STREAM_LENGTH); } }; /** * Constructor. * * @param buf The reference to the class to be copied. */ oSaHpiCtrlStateText::oSaHpiCtrlStateText(const oSaHpiCtrlStateText& buf) { memcpy(this, &buf, sizeof(SaHpiCtrlStateTextT)); } /** * Assign a field in the SaHpiCtrlStateTextT struct a value. * * @param field The pointer to the struct (class). * @param field The field name as a text string (case sensitive). * @param value The character string value to be assigned to the field. This * value will be converted as necessary. * * @return True if there was an error, otherwise false. */ bool oSaHpiCtrlStateText::assignField(SaHpiCtrlStateTextT *ptr, const char *field, const char *value) { // note that DataLength cannot be assigned a value using this method if (ptr == NULL || field == NULL || value == NULL) { return true; } if (strcmp(field, "Line") == 0) { ptr->Line = (SaHpiUint8T)atoi(value); return false; } // Text return true; }; /** * Print the contents of the buffer. * * @param stream Target stream. * @param buffer Address of the SaHpiCtrlStateTextT struct. * * @return True if there was an error, otherwise false. */ bool oSaHpiCtrlStateText::fprint(FILE *stream, const int indent, const SaHpiCtrlStateTextT *buffer) { int i, err; char indent_buf[indent + 1]; if (stream == NULL || buffer == NULL) { return true; } for (i = 0; i < indent; i++) { indent_buf[i] = ' '; } indent_buf[indent] = '\0'; err = fprintf(stream, "%s", indent_buf); if (err < 0) { return true; } err = fprintf(stream, "Line = %d\n", buffer->Line); if (err < 0) { return true; } err = fprintf(stream, "%s", indent_buf); if (err < 0) { return true; } err = fprintf(stream, "Text\n"); const SaHpiTextBufferT *tb = (const SaHpiTextBufferT *)&buffer->Text; err = oSaHpiTextBuffer::fprint(stream, indent + 3, tb); if (err < 0) { return true; } return false; } openhpi-2.14.1/cpp/oSaHpiDomainEvent.hpp0000644000076400007640000000311411302567022014776 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * W. David Ashley */ #ifndef Included_oSaHpiDomainEvent #define Included_oSaHpiDomainEvent #include extern "C" { #include } class oSaHpiDomainEvent : public SaHpiDomainEventT { public: // constructors oSaHpiDomainEvent(); // copy constructor oSaHpiDomainEvent(const oSaHpiDomainEvent& buf); // destructor ~oSaHpiDomainEvent() { } // other methods static bool assignField(SaHpiDomainEventT * ptr, const char *field, const char *value); inline bool assignField(const char *field, const char *value) { return assignField(this, field, value); } inline SaHpiDomainEventT *getStruct(void) { return this; } static bool fprint(FILE *stream, const int indent, const SaHpiDomainEventT *buffer); inline bool fprint(FILE *stream, const int indent) { return fprint(stream, indent, this); } }; #endif openhpi-2.14.1/cpp/oSaHpiCtrlRecStream.cpp0000644000076400007640000000377311302567022015305 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * W. David Ashley */ #include #include #include extern "C" { #include } #include "oSaHpiTypesEnums.hpp" #include "oSaHpiCtrlStateStream.hpp" #include "oSaHpiCtrlRecStream.hpp" /** * Default constructor. */ oSaHpiCtrlRecStream::oSaHpiCtrlRecStream() { Default.Repeat = false; Default.StreamLength = 0; Default.Stream[0] = '\0'; }; /** * Constructor. * * @param buf The reference to the class to be copied. */ oSaHpiCtrlRecStream::oSaHpiCtrlRecStream(const oSaHpiCtrlRecStream& ent) { memcpy(this, &ent, sizeof(SaHpiCtrlRecStreamT)); } /** * Print the contents of the entity. * * @param stream Target stream. * @param buffer Address of the SaHpiCtrlRecStreamT struct. * * @return True if there was an error, otherwise false. */ bool oSaHpiCtrlRecStream::fprint(FILE *stream, const int indent, const SaHpiCtrlRecStreamT *strm) { int i, err = 0; char indent_buf[indent + 1]; if (stream == NULL || strm == NULL) { return true; } for (i = 0; i < indent; i++) { indent_buf[i] = ' '; } indent_buf[indent] = '\0'; err = fprintf(stream, "%s", indent_buf); if (err < 0) { return true; } err = fprintf(stream, "Default\n"); if (err < 0) { return true; } const SaHpiCtrlStateStreamT *css = (const SaHpiCtrlStateStreamT *)&strm->Default; err = oSaHpiCtrlStateStream::fprint(stream, indent + 3, css); if (err < 0) { return true; } return false; } openhpi-2.14.1/ssl/0000755000076400007640000000000011405006365010772 5ustar openhpi-2.14.1/ssl/Makefile.am0000644000076400007640000000120611302567131013024 0ustar # (C) Copyright IBM Corp 2003, 2004 # All rights reserved. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This # file and program are licensed under a BSD style license. See # the Copying file included with the OpenHPI distribution for # full licensing terms. MAINTAINERCLEANFILES = Makefile.in INCLUDES = @OPENHPI_INCLUDES@ lib_LTLIBRARIES = libopenhpi_ssl.la EXTRA_DIST = oh_ssl.h libopenhpi_ssl_la_SOURCES = oh_ssl.c libopenhpi_ssl_la_LDFLAGS = -version-info @HPI_LIB_VERSION@ @CRYPTO_LIB@ openhpi-2.14.1/ssl/oh_ssl.h0000644000076400007640000000615011302567131012433 0ustar /* * Copyright (C) 2007-2008, Hewlett-Packard Development Company, LLP * All rights reserved. * * 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. * * Neither the name of the Hewlett-Packard Corporation, nor the names * of its contributors may be used to endorse or promote products * derived from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * Author(s) * Bryan Sutula * Shuah Khan * Richard White * * This file defines prototype(s) for SSL initialization and support functions. * * The contents have been #ifdef'd so that it can be included by files * needing potential SSL initialization code, but during builds without * an SSL library. In other words, it should be safe to include this * file from any OpenHPI source. */ #ifndef __OH_SSL_H #define __OH_SSL_H /* Include files */ #include #ifdef HAVE_OPENSSL #include #include #include #include #include #endif /* Data types used while using these routines */ #ifdef HAVE_OPENSSL enum OH_SSL_SHUTDOWN_TYPE { /* See SSL_shutdown man page */ OH_SSL_UNI, /* Unidirectional SSL shutdown */ OH_SSL_BI /* Bidirectional SSL shutdown */ }; #endif /* * Prototypes for the SSL connection management functions that are * implemented in oh_ssl.c */ extern int oh_ssl_init(void); #ifdef HAVE_OPENSSL extern SSL_CTX *oh_ssl_ctx_init(void); extern int oh_ssl_ctx_free(SSL_CTX *ctx); extern BIO *oh_ssl_connect(char *hostname, SSL_CTX *ctx, long timeout); extern int oh_ssl_disconnect(BIO *bio, enum OH_SSL_SHUTDOWN_TYPE shutdown); extern int oh_ssl_read(BIO *bio, char *buf, int size, long timeout); extern int oh_ssl_write(BIO *bio, char *buf, int size, long timeout); #endif #endif /* __OH_SSL_H */ openhpi-2.14.1/ssl/oh_ssl.c0000644000076400007640000006667411302567131012447 0ustar /* * Copyright (C) 2007-2008, Hewlett-Packard Development Company, LLP * All rights reserved. * * 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. * * Neither the name of the Hewlett-Packard Corporation, nor the names * of its contributors may be used to endorse or promote products * derived from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * Author(s) * Bryan Sutula * Shuah Khan * Richard White * * * This file implements OpenSSL initialization and connection management * functionality such as open, close, send, and receive. * * The initialization is done here and called by the OpenHPI infrastructure, * so that individual modules and plugins don't have to worry about any * global OpenSSL initialization. Some of this initialization can only be * done once, so this is the best place for it. * * OpenSSL is a complex library, and the code to reliably communicate over * an SSL channel includes a number of subtle factors. Rather than having * each plug-in duplicate the effort to get this right, it's easier to * centralize SSL communication support in this library. * * The following functions are provided: * * oh_ssl_init() - Intializes the OpenSSL library (called by the * OpenHPI infrastructure only) * oh_ssl_ctx_init() - Creates a new SSL_CTX object * oh_ssl_ctx_free() - Free an SSL_CTX object * oh_ssl_connect() - Create and open a new ssl conection * oh_ssl_disconnect() - Close and free an SSL connection * oh_ssl_read() - Read from an SSL connection * oh_ssl_write() - Write to an SSL connection */ /* OpenSSL and other header files */ #include #include #include #include #include #include #include #include #include #include #include /* Data types used by this module */ struct CRYPTO_dynlock_value { GMutex *mutex; }; /* Global (static) data for this module */ static int oh_ssl_init_done = 0; /* Will be set true when done */ static GMutex **mutexes = NULL; /* Holds array of SSL mutexes */ static GStaticMutex ssl_mutexes = G_STATIC_MUTEX_INIT; /* Lock for above */ /* Local (static) functions, used by this module. Note that these aren't * necessary if we aren't compiling as a threaded implementation, so we * skip them in that case. */ /** * id_function * * SSL thread ID function * * Return value: a unique thread identifier, as an unsigned long **/ static unsigned long id_function(void) { return((unsigned long) g_thread_self()); } /** * lock_function * @mode: Includes the CRYPTO_LOCK bit if a lock is intended. Otherwise, * an unlock is desired. * @type: Ordinal number of the mutex being manipulated * @file: (unused) * @line: (unused) * * SSL mutex lock and unlock function. This is complicated, somewhat, * because we're trying to defer allocation of memory and mutexes until * they're actually needed. * * Note that OpenSSL defines that this function has no error return. In the * case where we can't allocate memory, we'll just have to return, pretending * that we did the lock. This will be a silent failure. The alternative * would be to allocate the array of mutex pointers during thread_setup(). * * Return value: (none) **/ static void lock_function(int mode, int type, const char * file, int line) { /* Do we have an array of mutex pointers yet? */ if (! mutexes) { /* Messing with this requires the static lock */ g_static_mutex_lock(&ssl_mutexes); if (! mutexes) { /* Need to check again */ mutexes = (GMutex **)g_malloc0(CRYPTO_num_locks() * sizeof(GMutex *)); if (! mutexes) { err("out of memory"); g_static_mutex_unlock(&ssl_mutexes); return; } } g_static_mutex_unlock(&ssl_mutexes); } /* Have we initialized this particular mutex? */ if (! mutexes[type]) { /* Same firedrill as above */ g_static_mutex_lock(&ssl_mutexes); if (! mutexes[type]) { mutexes[type] = g_mutex_new(); } g_static_mutex_unlock(&ssl_mutexes); } /* Finally, go ahead and lock or unlock it */ if (mode & CRYPTO_LOCK) { g_mutex_lock(mutexes[type]); } else { g_mutex_unlock(mutexes[type]); } } /** * dyn_create_function * @file: (unused) * @line: (unused) * * Function to create and initialize dynlock mutexes * * Return value: pointer to dynlock structure, or NULL on failure (out of mem) **/ static struct CRYPTO_dynlock_value *dyn_create_function(const char *file, int line) { struct CRYPTO_dynlock_value *value; if ((value = (struct CRYPTO_dynlock_value *) g_malloc(sizeof(struct CRYPTO_dynlock_value)))) { value->mutex = g_mutex_new(); } else { err("out of memory"); } return(value); } /** * dyn_lock_function * @mode: Includes the CRYPTO_LOCK bit if a lock is intended. Otherwise, * an unlock is desired. * @l: Pointer to dynlock structure returned by dyn_create_function() * @file: (unused) * @line: (unused) * * Function to lock and unlock dynlock mutexes * * Return value: (none) **/ static void dyn_lock_function(int mode, struct CRYPTO_dynlock_value *l, const char *file, int line) { if (mode & CRYPTO_LOCK) { g_mutex_lock(l->mutex); } else { g_mutex_unlock(l->mutex); } } /** * dyn_destroy_function * @l: Pointer to dynlock structure returned by dyn_create_function() * @file: (unused) * @line: (unused) * * Function to destroy dynlock mutexes * * Return value: (none) **/ static void dyn_destroy_function(struct CRYPTO_dynlock_value *l, const char *file, int line) { g_mutex_free(l->mutex); g_free(l); } /** * thread_setup * * Set up multi-thread protection used by the SSL library * * Return value: 0 for success, -1 for failure **/ static int thread_setup(void) { /* Register our locking functions with the SSL library */ CRYPTO_set_id_callback(id_function); CRYPTO_set_locking_callback(lock_function); CRYPTO_set_dynlock_create_callback(dyn_create_function); CRYPTO_set_dynlock_lock_callback(dyn_lock_function); CRYPTO_set_dynlock_destroy_callback(dyn_destroy_function); return(0); /* No errors */ } #if 0 /* Not used right now */ /** * thread_cleanup * * Clean up multi-thread protection used by the SSL library. * * Note that this function is not currently used because there is no shutdown * code for plugins. It is left here in case that happens in the future. * * Return value: 0 for success, -1 for failure (though it currently can't fail) **/ static int thread_cleanup(void) { int i; /* Nullify the locking functions we registered with the SSL library */ CRYPTO_set_id_callback(NULL); CRYPTO_set_locking_callback(NULL); CRYPTO_set_dynlock_create_callback(NULL); CRYPTO_set_dynlock_lock_callback(NULL); CRYPTO_set_dynlock_destroy_callback(NULL); /* Clean up and destroy mutexes, if we have any */ g_static_mutex_lock(&ssl_mutexes); if (mutexes) { for (i = 0; i < CRYPTO_num_locks(); i++) { if (mutexes[i]) { g_mutex_free(mutexes[i]); } } g_free(mutexes); mutexes = NULL; } g_static_mutex_free(&ssl_mutexes); return(0); /* No errors */ } #endif /* Not used right now */ /** * oh_ssl_init * * Intialize the OpenSSL library. Note that the calls used in this routine * set up global data and are only to be called once for an SSL-based program. * To enforce this while allowing multiple callers (plugins) to initialize * the library, we use a static global variable to mark when we've done the * initialization. * * Note that the thread-safe initialization portion requires that * g_thread_init() has already been called, so don't call this routine * before then. * * Return value: 0 for success, -1 for failure **/ int oh_ssl_init(void) { if (! oh_ssl_init_done) { /* Do this only once */ oh_ssl_init_done = 1; /* Load error strings to provide human-readable error * messages */ SSL_load_error_strings(); ERR_load_BIO_strings(); /* Initialize the SSL library */ if (! SSL_library_init()) { err("SSL_library_init() failed"); return(-1); } #ifndef NO_SSL_RAND_SEED /* In case this isn't portable */ /* Actions to seed PRNG */ RAND_load_file("/dev/urandom", 1024); #endif /* Set up multi-thread protection functions */ if (thread_setup() ) { err("SSL multi-thread protection setup call failed"); return(-1); } } return(0); /* Successful return */ } /** * oh_ssl_ctx_init * * Create a new SSL_CTX object as a framework for TLS/SSL enabled functions. * In particular: * - Creates a new CTX object with default option values * - Sets common compatibility options * - Sets the default locations for trusted CA certificates. * SSL_CTX_set_default_verify_paths() is used to add system-wide default * certificate paths to the verify CApath without having to specify a * default location. The intent is that the distribution's configured * location will be used. * * Return value: pointer to SSL_CTX or NULL for failure **/ SSL_CTX *oh_ssl_ctx_init() { SSL_CTX *ctx; ctx = SSL_CTX_new(SSLv23_client_method()); if (ctx == NULL) { err("SSL_CTX_new() failed"); return(NULL); } SSL_CTX_set_options(ctx, SSL_OP_TLS_ROLLBACK_BUG | SSL_OP_ALL); if (! SSL_CTX_set_default_verify_paths(ctx)) { err("SSL_CTX_set_default_verify_paths() failed"); return(NULL); } return(ctx); } /** * oh_ssl_ctx_free * @ctx: pointer to SSL_CTX as returned by oh_ssl_ctx_init() * * Free an SSL_CTX object * * Return value: 0 for success, -1 for failure **/ int oh_ssl_ctx_free(SSL_CTX *ctx) { if (ctx == NULL) { err("unexpected NULL ctx pointer"); return(-1); } SSL_CTX_free(ctx); return(0); } /** * oh_ssl_connect * @hostname: Name of target host. Format: * "hostname:port" or "IPaddress:port" * @ctx: pointer to SSL_CTX as returned by oh_ssl_ctx_init() * @timeout: maximum number of seconds to wait for a connection to * hostname, or zero to wait forever * * Create and open a new ssl conection to the specified host. * * Return value: pointer to BIO, or NULL for failure **/ BIO *oh_ssl_connect(char *hostname, SSL_CTX *ctx, long timeout) { BIO *bio; SSL *ssl; fd_set readfds; fd_set writefds; struct timeval tv; int fd; int err; if (hostname == NULL) { err("NULL hostname in oh_ssl_connect()"); return(NULL); } if (ctx == NULL) { err("NULL ctx in oh_ssl_connect()"); return(NULL); } if (timeout < 0) { err("inappropriate timeout in oh_ssl_connect()"); return(NULL); } /* Start with a new SSL BIO */ bio = BIO_new_ssl_connect(ctx); if (bio == NULL) { err("BIO_new_ssl_connect() failed"); return(NULL); } /* Set up connection parameters for this BIO */ BIO_set_conn_hostname(bio, hostname); BIO_set_nbio(bio, 1); /* Set underlying socket to * non-blocking mode */ /* Set up SSL session parameters */ BIO_get_ssl(bio, &ssl); if (ssl == NULL) { err("BIO_get_ssl() failed"); BIO_free_all(bio); return(NULL); } SSL_set_mode(ssl, SSL_MODE_ENABLE_PARTIAL_WRITE); /* Ready to open the connection. Note that this call will probably * take a while, so we need to retry it, watching for a timeout. */ while (1) { if (BIO_do_connect(bio) == 1) { break; /* Connection established */ } if (! BIO_should_retry(bio)) { /* Hard error? */ err("BIO_do_connect() failed"); err("SSL error: %s", ERR_reason_error_string(ERR_get_error())); BIO_free_all(bio); return(NULL); } /* Wait until there's a change in the socket's status or until * the timeout period. * * Get underlying file descriptor, needed for the select call. */ fd = BIO_get_fd(bio, NULL); if (fd == -1) { err("BIO isn't initialized in oh_ssl_connect()"); BIO_free_all(bio); return(NULL); } FD_ZERO(&readfds); FD_ZERO(&writefds); if (BIO_should_read(bio)) { FD_SET(fd, &readfds); } else if (BIO_should_write(bio)) { FD_SET(fd, &writefds); } else { /* This is BIO_should_io_special(). * Not sure what "special" needs to * wait for, but both read and write * seems to work without unnecessary * retries. */ FD_SET(fd, &readfds); FD_SET(fd, &writefds); } if (timeout) { tv.tv_sec = timeout; tv.tv_usec = 0; err = select(fd + 1, &readfds, &writefds, NULL, &tv); } else { /* No timeout */ err = select(fd + 1, &readfds, &writefds, NULL, NULL); } /* Evaluate select() return code */ if (err < 0) { err("error during select()"); BIO_free_all(bio); return(NULL); } if (err == 0) { err("connection timeout to %s", hostname); BIO_free_all(bio); return(NULL); /* Timeout */ } } /* TODO: Do I need to set the client or server mode here? I don't * think so. */ return(bio); } /** * oh_ssl_disconnect * @bio: pointer to a BIO as returned by oh_ssl_connect() * @shutdown: Selects a uni-directional or bi-directional SSL shutdown. * See the SSL_shutdown() man page. * * Close the SSL connection and free the memory associated with it. * * Return value: 0 for success, -1 for failure **/ int oh_ssl_disconnect(BIO *bio, enum OH_SSL_SHUTDOWN_TYPE shutdown) { SSL *ssl; int ret; if (bio == NULL) { err("NULL bio in oh_ssl_disconnect()"); return(-1); } /* Shut down the SSL connection. This may involve a handshake with * the server. */ BIO_get_ssl(bio, &ssl); if (ssl == NULL) { err("BIO_get_ssl() failed"); return(-1); } ret = SSL_shutdown(ssl); if (ret == -1) { err("SSL_shutdown() failed"); /* Continuing on to free BIO memory */ } else if ((ret == 0) && (shutdown == OH_SSL_BI)) { /* Still need stage 2 shutdown (see SSL_shutdown() man page) */ ret = SSL_shutdown(ssl); if (ret == -1) { err("SSL_shutdown() failed"); /* Continuing on to free BIO memory */ } else if (ret == 0) { err("stage 2 of SSL_shutdown() failed"); /* Continuing on to free BIO memory */ } } /* Free the connection */ BIO_free_all(bio); return(0); } /** * oh_ssl_read * @bio: pointer to a BIO as returned by oh_ssl_connect() * @buf: buffer for the data which is read from the connection * @size: maximum number of bytes to be read into buf * @timeout: maximum number of seconds to wait for input to be available, * or zero to wait forever * * Read from an existing SSL connection. The data and number of bytes read * are returned. * * Note that oh_ssl_read() and oh_ssl_write() have some subtle differences * in behavior. While oh_ssl_write() will try to write all the bytes, * oh_ssl_read() will return as soon as it has read some data. * * Return value: (as follows) * >0: number of bytes read * 0: nothing more to read; remote host closed the connection * -1: SSL or other error * -2: Timeout **/ int oh_ssl_read(BIO *bio, char *buf, int size, long timeout) { SSL *ssl; int bytes = 0; fd_set readfds; fd_set writefds; struct timeval tv; int read_wait; int done; int err; int fd; if (bio == NULL) { err("NULL bio in oh_ssl_read()"); return(-1); } if (buf == NULL) { err("NULL buf in oh_ssl_read()"); return(-1); } if (size <= 0) { err("inappropriate size in oh_ssl_read()"); return(-1); } if (timeout < 0) { err("inappropriate timeout in oh_ssl_read()"); return(-1); } /* Get underlying file descriptor, needed for select call */ fd = BIO_get_fd(bio, NULL); if (fd == -1) { err("BIO doesn't seem to be initialized in oh_ssl_read()"); return(-1); } /* We also need the SSL connection pointer */ BIO_get_ssl(bio, &ssl); if (ssl == NULL) { err("BIO_get_ssl() failed"); return(-1); } /* Because of SSL renegotiations, we may have to wait on a socket * write even though we're trying to do a read. The initial value * of read_wait indicates that we're trying to read, but it can be * set to 0 if we end up waiting for a socket write. */ read_wait = 1; done = 0; /* We have to loop on the read call, until we get something we * can return to the user. */ while (! done) { /* First, we need to wait until something happens on the * underlying socket. We are either waiting for a read * or a write (but not both). */ FD_ZERO(&readfds); FD_ZERO(&writefds); if (read_wait) { FD_SET(fd, &readfds); } else { FD_SET(fd, &writefds); } if (timeout) { tv.tv_sec = timeout; tv.tv_usec = 0; err = select(fd + 1, &readfds, &writefds, NULL, &tv); } else { /* No timeout */ err = select(fd + 1, &readfds, &writefds, NULL, NULL); } /* Evaluate select() return code */ if (err < 0) { err("error during select()"); return(-1); } if (err == 0) { return(-2); /* Timeout */ } /* The socket has something. Ready to try (or re-try) * the read call. */ bytes = SSL_read(ssl, buf, size); switch (SSL_get_error(ssl, bytes)) { case SSL_ERROR_NONE: /* No error */ if (bytes) { done = 1; } break; case SSL_ERROR_ZERO_RETURN: /* Connection was closed. For this case, * since it's normal for the remote host * to close when it's done, we'll not signal * any error, but will return zero bytes. */ return(0); case SSL_ERROR_WANT_READ: read_wait = 1; break; case SSL_ERROR_WANT_WRITE: read_wait = 0; break; default: /* Some other sort of error */ err("error %d from SSL_read", bytes); return(-1); } } return(bytes); } /** * oh_ssl_write * @bio: pointer to a BIO as returned by oh_ssl_connect() * @buf: buffer to write to the connection * @size: number of bytes to be written * @timeout: maximum number of seconds to wait for the remote host to * accept the data, or zero to wait forever * * Write data to an existing SSL connection. * * Note that oh_ssl_read() and oh_ssl_write() have some subtle differences * in behavior. While oh_ssl_read() returns as soon as it has data for the * caller, oh_ssl_write() does not return until all the bytes have been * written to the remote host. * * Return value: (as follows) * 0: success * -1: error * -2: timeout **/ int oh_ssl_write(BIO *bio, char *buf, int size, long timeout) { SSL *ssl; int bytes; fd_set readfds; fd_set writefds; struct timeval tv; int write_wait; int done; int err; int fd; int sent; if (bio == NULL) { err("NULL bio in oh_ssl_write()"); return(-1); } if (buf == NULL) { err("NULL buf in oh_ssl_write()"); return(-1); } if (size <= 0) { err("inappropriate size in oh_ssl_write()"); return(-1); } if (timeout < 0) { err("inappropriate timeout in oh_ssl_write()"); return(-1); } /* Get underlying file descriptor, needed for select call */ fd = BIO_get_fd(bio, NULL); if (fd == -1) { err("BIO doesn't seem to be initialized in oh_ssl_write()"); return(-1); } /* We also need the SSL connection pointer */ BIO_get_ssl(bio, &ssl); if (ssl == NULL) { err("BIO_get_ssl() failed"); return(-1); } /* Because of SSL renegotiations, we may have to wait on a socket * read even though we're trying to do a write. The initial value * of write_wait indicates that we're trying to write, but it can * be set to 0 if we end up waiting for a socket read. */ write_wait = 1; done = 0; sent = 0; /* We have to loop on the write call, until everything gets written */ while (! done) { /* First, we need to wait until something happens on the * underlying socket. We are either waiting for a read * or a write (but not both). */ FD_ZERO(&readfds); FD_ZERO(&writefds); if (write_wait) { FD_SET(fd, &writefds); } else { FD_SET(fd, &readfds); } if (timeout) { tv.tv_sec = timeout; tv.tv_usec = 0; err = select(fd + 1, &readfds, &writefds, NULL, &tv); } else { /* No timeout */ err = select(fd + 1, &readfds, &writefds, NULL, NULL); } /* Evaluate select() return code */ if (err < 0) { err("error during select()"); return(-1); } if (err == 0) { return(-2); /* Timeout */ } /* The socket is ready. Ready to try (or re-try) the write * call. */ bytes = SSL_write(ssl, buf + sent, size - sent); switch (SSL_get_error(ssl, bytes)) { case SSL_ERROR_NONE: /* No error */ sent += bytes; if (sent == size) { done = 1; } break; case SSL_ERROR_ZERO_RETURN: /* Connection was closed. Since we're trying * to write, this is an error condition. */ err("remote host unexpectedly closed" " the connection"); return(-1); case SSL_ERROR_WANT_READ: write_wait = 0; break; case SSL_ERROR_WANT_WRITE: write_wait = 1; break; default: /* Some other sort of error */ err("error %d from SSL_write", bytes); return(-1); } } return(0); } openhpi-2.14.1/COPYING0000644000076400007640000000303711302567132011227 0ustar Copyright (c) 2003, Intel Corporation (C) Copyright IBM Corp. 2003-2007 All rights reserved. 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. Neither the name of Intel Corporation, IBM Corp., nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. openhpi-2.14.1/openhpi.pc.in0000644000076400007640000000041111302567132012560 0ustar prefix=@prefix@ exec_prefix=@prefix@ libdir=@libdir@ includedir=@includedir@ Name: OpenHPI Description: Implementation of SA Forum's Hardware Platform Interface Version: @VERSION@ Requires: glib-2.0 Libs: -L${libdir} -l@HPI_PKG@ Cflags: -I${includedir}/@HPI_PKG@ openhpi-2.14.1/plugins/0000755000076400007640000000000011405006365011652 5ustar openhpi-2.14.1/plugins/Makefile.am0000644000076400007640000000342211302567001013702 0ustar # # Copyright (c) 2003, Intel Corporation # All rights reserved. # # 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. # # Neither the name of Intel Corporation nor the names # of its contributors may be used to endorse or promote products # derived from this software without specific prior written permission. # # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS # "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT # LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS # FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT # OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, # SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED # TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, # OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY # OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING # NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS # SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. # MAINTAINERCLEANFILES = Makefile.in SUBDIRS = @IPMI@ @WATCHDOG@ @SYSFS@ @SNMP_BC@ @IPMIDIRECT@ @SIMULATOR@ \ @RTAS@ @ILO2_RIBCL@ @OA_SOAP@ DIST_SUBDIRS = ipmi \ watchdog \ sysfs \ snmp_bc \ ipmidirect \ simulator \ rtas \ ilo2_ribcl \ oa_soap openhpi-2.14.1/plugins/ilo2_ribcl/0000755000076400007640000000000011405006365013672 5ustar openhpi-2.14.1/plugins/ilo2_ribcl/OpenHPI_ProLiant_DevGuide.pdf0000644000076400007640000166525411302566624021243 0ustar %PDF-1.4 %âãÏÓ 53 0 obj <> stream xÚ–KoA Çïû)æFyÄñŒ=¯+j›VT”ÀBZ)·JP! âÄ×dz¤Ûõz hoýÖãñã?ëÊå]dGÅÝ=tèú_Í܉ÙÈçK÷ºïÖçèBqýçÎø•/.e†²ëº“="†f>4sñ¼ÿ:¢” %o›yÙ MáÂP²¥_M™Z!ø`˜Ë)ã1A¨ÖÑ{eú¨ *Píj6t_ÒB\d\$ð±ÚàšY+2H̆¼REHdÝyVdJ@%r§ ÙGÎÖ]TP@ ›Ö> stream xÚ¥XÉnÜF½ó+xŒ¸Üûr5ä`€\t3àAÀ'ÿÃh4’&SÊ,üƒñ'¤šöY¬æH!¨5”ª_¿®åUQª]|l^*PƵ‹7£Oªý¿o^/šW?ë6µ‹·n~éÖ†6: Qåvñ¾ùáB)u¡L(?o˲~±øƒŒ½‚äœØ°)KW–ë²Ü—eW–OeY–å@vý_»1jv`RšAje zIø@lû={¶GGÐA¢_—UYŽDwM—90,à K~bÐà‚ôҞι,ËßtØJ–"X•ê½g–ÙC”Y‘G–tNc z^2}¤‹ ž½'öŒ©ñB–:Ú3D~uº±þ—AĶÿ ¥ ù¨§´¥ÇÃi1?~ËX3†´ZCvV@.‰Æ=ö‰zÅv[ô~»‡l¾#",ò¶D>ûg0ˈ+–Ü(3º~‹-C„{¯|C8å!é( úÈ\3KíÀ_?¬“À&AJY˜ßq=`~u.@°ñÉtc{B¡%ÏÙQnÎDÒ¥ :ÇgÔ‘Ë‚ËÿKZ¼6 ‚>“'Íò”¿úKPE–ÇlÕŒ¢®(ñ$[VÓ_O`ÑbbxY/_ԙ䒰U/×_Ìï(Á·DêåZDD—¼±âp:‘ßFÛ ©n,»“öRžqfÏì³­ÐKœ—Ü(AVÒè|]nêšQ4XY'Àd…«Ayé¡kíæ¤ÿ@—DeËCŪÛ`ÝÔH-ë…m•…õ5?¡ •Ód”ºP‡ø:O0s‡]GKzÜ&Ölx¤&ÝéHžYÊCJQ¬ ðïëíÎá@â¼êw´;ç-Xëáz²Ý¹˜Áé›ìÞóDêÙl¹f&PÎ?W=<6år]šø˜i°; |KÙÊD¢gë²4¤þV V“Í3™„d„õš—þ0³,ÏçŠ(6¯†±˜놗ÍDHQºåo9›õÌ S[öVì–÷-Ã,ŽÝÂrèC»É+5> stream xÚ­ÝÏŽlçužñ9¯‚£ ŒvU­õ®µ¾iÛÉ(°!Xr")¶Ø’Iî!$¤D‹¤Þ`.Àdן]Ý»j÷·‰Eëé:}~äáé÷ë½w>=,ÿïýí'‡Ëø‹?ûDþiÊ>ý‡O¤zÉÓå/þþõ/âü~û÷Éß,ø£ÿ}þá¯?ù÷?úäÿôðéiù‹¿ùäxy½ã§çÖŽ/vЧ?ú‡OþíO‡Cþ»ý÷û§;æSóÞ6iËÏ}|jþäüÃ>ÿðßÖÇC¼˜?籉ŽùbOÑÚD§ñr82êM€8p6àlÀÙ³gÎÎÎÎΜ8pNàœÀ9sçΜ 8à<€óèÏGF}ã éÏGF}c  ÐôÎç#£¾h€³gΜ8;pvàìÀYÀYÀYÀ9€sçÎ œ8'pNà\À¹€sçœp½óùȨo 4šÞù|dÔ7Mï|>2ê p6àlÀÙ€³gΜ8 8 8 8pàÀ9€sçÎ œÁt°ìA{ÐÁt°ìA=(°ö À؃{P` ìA=(°ö À؃{P` ìA=¨ý=ø³·Íùèü(:Øùb{°óxAÙù‡ÏÎ?|µ½BË_ŽÃž_óä÷Ó¡oï/òýý¶Ï_ÿÛ½šÍ«íÐL“Ñ%ëñÌ4QŸT›Ü~/Nï“l“ÛoÄib}}ÒëZ¯k½®õºÞëz¯ë½®z]õºêuÕëF¯½nôºÙëf¯›½nõºÕëV¯[½îèuG¯;ZÝõôešxŸ´ºëÑË4±>‰>iu×c—i¢>éu­×µ^×z]ïu½×õ^×{]õºêuÕëF¯½nôºÙëf¯›½nöºÕëV¯[½îèuG¯;ZÝõpešXŸDŸ´ºëÁÊ4QŸ´ºë©Ê4ñ>éu­×µ^×z]ëu½×õ^×{]õºêuÕëF¯½nôºÑëf¯›½nöºÕëV¯[½îèuû­æýVó~«©ßjê·šú­¦~«©ßjê·šú­¦~«©ßjê·šú­¦~«©ßjê·šú­¦~«©ßjÚÝjO%çËòüøöT#Þ&çs–“?e?œøæ~èñËû¡Çg÷ÿâW÷ÕϷ÷ ^tÜùyÚÄüîñî­<žž>ìÃöÊŸ‡³œo÷Ž ¶¯°1mnÿ`ÏM€fôÍíîy#ÐTßÜþùž7ÀÙ³€³€³€³€sçΜ8'pNà\À¹€sçÎ8àÃßFç¿c}d$  W|‰D¢óï#"žD¼ˆxñ"âEÄD|ñˤï#'¿¬ú>2‰€øeÙ÷‘HDĈ7"îD܉¸q'â"â"â"âAăˆO"žD<‰xñ"âEÄ‹ˆ">ˆøâ—ÍßGF¢ ¿ìþ>‰€øeú÷‘“ˆˆ7"nD܈¸q'âNÄEÄEÄEăˆ"D<‰xñ$âEÄ‹ˆD|ñAÄ¿œ ô‘HÄ/}ä$â—³>2‰ˆ¸q#âFĈ“Í)²9E6§ÞÙœ?¿>œäp~hñ_¿}hqœRçöö*‰ãÓ5 ËïÓ(=µîÇ¿Û>Q䟞Ÿ_|þƒñpz|‰‡;?Î0ö‘“(Atþƒ±ŒDA¢¢óŒ}$qqqñ âAăˆO"žD<‰xñ"âEÄD|ñÄ/woõ‘HÄ/÷põ‘“ˆ_.¢ê##Qˆˆ7"nD܉¸q'â"â"â"â"âAăˆO"žD<‰xñ"âEÄ‹ˆ">ˆøâ—ÃØ>rñËal‰‚D@ürÛG"7"nD܈¸q'âNĈ‹ˆ‹ˆ‹ˆ"D<‰xñ$âIÄ‹ˆ/">ˆø âˆ_cûÈH$â—ÃØ>‰€¸“Íéds:ÙœN6§“Íéds:ÙœN6§“Íéds:ÙœN6§“Íéds:ÙœN6§“Íéds:ÙœN6§“Íéds:ÙœN6§“Íéds:Ùœ"›SdsŠlN‘Í)²9E6§ÈæÙœ"›SdsŠlN‘Í)²9E6§ÈæÙœšmΧsV½3>¾ûèó[øæi<º_õÍöî´ßnŸ ½}ô"â™ï¾Þ÷§û¼¾À×ÏuÝ®ëܾÈþS çMöÍíºÎyc  ÐŒ¶Y34ošê›ã4šÞy½ÏoÞh4ÀÙ€³gΜ8;pppppàÀ9€sçÎ œ 8p.à\ÀyçœGï¼Þç7o4½ózŸß¼1Ðhzçõ>¿y#ÐgΜ 8;pvàìÀÙ³€³€³€sçΜ8'pNàœÀ¹€sçÎ8à¿yc  ÐôÎë}~óF é×ûüæƒ8p6àlÀÙ€³gΜœœœ8pàÀ9sçÎ`:؃ö ƒ=è`:؃ö À؃{P` ìA=(°ö À؃{P` ìA=(°ö ÀÔþüo÷ùß3ÎõöPçõƽo?ê¸h™—ã¢çWþ}Ž‹n¿Õ¶/²ô2kÖ£—y#ÐTßÜ~«ÍMöÍí·Ú¼1Ðh€³gΜ8;pvà,à,à,à,àÀ9€sçÎ œ8p.à\À¹€óÎ8Þy=z™7šÞy=z™7šMï¼½Ì8p6àlÀÙ³gΜœœœ8pàœÀ9sçΜ 8pÀyçÑ;¯G/óÆ@ é×£—y#ÐôÎëÑ˼qÐgΜ 8pvàìÀÙ³€³€³€sçΜ8'pNàœÀ¹€sçÎ8à ö ƒ=(°ö À؃{P` ìA=(°ö À؃{P` ìA=(°µ¿ŸŽ^–/ûOwL~³}üÐÛ'/­oæþtÏ ûÞ˽¾ùÖW÷ÿôÙýøåÃþ5:ÇñøR;éôQ‚èr³u‰‚D£.çE}$ˆŽG9‰€øåÔ¨ŒDA""nD܈¸q'âNĈ‹ˆ‹ˆ‹ˆ‹ˆ"D<‰xñ$âEÄ‹ˆ/">ˆø âˆ_ðÕFN" ~}ÀW‰‚D@üú€¯6‰ˆ¸q#âFĈ;w"îD\D\D\D<ˆxñ âIÄ“ˆ'O"^D¼ˆxñAÄ@üú€¯62‰€øõ_m$ñë¾ÚÈIDĈ7"nD܉¸q'â"â"â"âAăˆ"žD<‰xq²9lN'›ÓÉæt²9lN'›SdsŠlN‘Í)²9E6§ÈæÙœ"›SdsŠlN‘Í)²9E6§ÈæÙœ"›Sdsê͹9¥ÊçZ¾48x²Ëx6Ç-Ë*X¾Ø{×s©¼_aôåýº¢èÜÇëA÷ëï<#©m4Ù7׃î¦1ÐhFÛÜ.|j¦w¾]øÔ4šÞùváSÓh4ÀÙ€³gΜ8;pppppàÀ9€sçÎ œ 8p.à\ÀyçœGï|»ð©i4½óí§¦1ÐhzçÛ…OM#ÐgΜ 8;pvàìÀÙ³€³€³€sçΜ8'pNàœÀ¹€sçÎ8à5ƒ8p6àlÀÙ€³gΜœœœ8pàÀ9sg°ìA{ÐÁt°ìA{ÐÁ؃{P` ìA=(°ö À؃{P` ìA=(°ö À؃Ú߃>iùí|ðzûÞr¶½çì»û•J_Ýølï-ì·Ï)ŠëÓÓËÿ«8­ÛWß?À˜6·`ç&@3úæöì¼hªonÿÀÎàìÀYÀYÀYÀYÀ9€sçÎ œ8'p.à\À¹€sçœp½óz€1o4½óz€1o 4šÞy=À˜7 p6àlÀÙ€³gΜ8 8 8 8pàÀ9sçÎ œ 8p.à<€óΣw^0æ&@Ó;¯óF é׌yã Îœ 8p6àìÀÙ³gggçΜ8pNàœÀ9sçΜpÀyçÑ;¯óF é׌yã éö À؃{P` ìA=(°ö À؃Ú߃OË”;øx{€qØ)|}÷ºÍ×Ùééc?{=†ØÞÕ•/u>Ìxú©þu3–ß(ùôÉ<_ùÑ6Ëo”¾qÐdß,¿QúÆ@ }³üFéàlÀÙ³gÎÎÎÎΜ8pNàœÀ9sçΜ 8à<€óèÏ'}ã éÏ'}c  ÐôÎ烓¾h€³gΜ8;pvàìÀYÀYÀYÀ9€sçÎ œ8'pNà\À¹€sçœp½óùà¤o 4šÞù|pÒ7Mï|>8é p6àlÀÙ€³gΜ8 8 8 8pàÀ9€sçÎ œ 8p.à<€óÎ8Þù|pÒ7Mï,°ö À؃{P` ìA=(°ö À؃Ú߃?>ÿð—w-_sÞ>Ï÷ × 1Î?üâ~ñËûÁÄoïÿ·KòË퇽Æx|áËiůžOD–UjØcýåí&ÞOßó7ü—st|zƇû^ýn¶s—¯TG>¿Ê{C÷|QDé)Kwb—; ž?ÝÜ>öõ·ÛÇIøËi÷y¸_¡ðõÓ§yþ6ú8=ÿdŸÝ¾Ø~ç¹^Tµ÷³œ¶«Õ—µnû/ûíý‡ÚîÂz‰x{}¯¢/žF×ñ)ß™]]t^}ä$JçW‰‚DDçÖG"7"nD܈¸q'âNĈ‹ˆ‹ˆ‹ˆ"D<‰xñ$âIÄ‹ˆ/">ˆø âˆ_¦[‰‚D@ü2áúH$â—!×GN""nD܈¸q#âNĈ;"D<ˆxñ$âIÄ“ˆ/"^D|ñAÄ@ü2ÿúH$â—ØGN" ~™‚}d$ q#âFĈ;w"îûâûópA=èôözð¼ï/îÛí÷ç&¾7—¯6ã8ž^ïÝïˆ.³g<ÿô`(._«(mçÿ=¿'ºü#æ{¯óº?ïnÜ?-¿ŽåoÊþ¯c[._ŽH tþÝÁw?½y§;ßÑP{/‡¿Þ>ÄàüÕѰãÞ?R¯·|õô+½~ÙQ¶÷eG‰‚DD—/;ÚH$*]¾ìh#'"D<ˆxñ$âIÄ“ˆ/"^D|ñAÄ@üúeG‰D@üúeG9‰€øõËŽ62‰ˆ¸q#âFĈ;÷}ñý ²Ž‡%²·FœöŽT«–?4}'¿þ1÷ÛûŸDë× _nÏq¿Û^´å/:aôüj¯ä_^òwÛ¯Uô2ŽOµsç/jN{¯ÿzãÛ·÷OùõÖÏ÷ßÓìrgÙùkªíëíÜZÖGF¢ ÑÑåŸá6‰ D—†ÛÈIDÄEÄEÄEÄEăˆ"žD<‰xñ"âEÄ‹ˆD|ñį߮i#'¿~»¦ŒDA" ~ývM‰DD܈¸q#âNĈ;w"."."."D<ˆxñ$âIÄ“ˆ'/"^D¼ˆø ⃈ ~ývM‰‚D@üúíš6‰€øõÛ5mä$"âFĈ7"îD܉¸qqqñ âAăˆO"žD<‰xñ"âEÄD|ñįç&m$ñë¹I9‰€¸ÈæÙœ"›SdsŠlN‘Í)²9E6§ÈæÔ;›órnòã‡o×øòÇìAÞž›—´‡±ÓÔÁɲxã ½W›œäééCvNM–Ô)÷~i߉º¾üö„d¼ÄqçC±ýÖÕ/¶Ÿæë7NÞ;z¹ÞÑõð»·tÍ›ë=]Mc  ÐŒ¾¹Þ×Õ4MµÍíÖ®¦qÐôη»»šÆ@ éowx5@œ 8p6àìÀÙ³gÎÎÎΜ8pNàœÀ9sçΜ 8à<€óèo÷~5&@Ó;ßîÿj¦w¾ÝÖ4àlÀÙ€³gΜ8;ppppàÀ9€sçÎ œ8p.à\Àyçœp½óíî°¦hzçÛ bMã éo÷ˆ5&@œ 8p6àìÀÙ³ï:ïïËå÷ÇA{OY¯+;ÅvgŽ•ï|Üu¼}v¿Ví›ÙŃçggãÓ«¼s?Öù©(™»?éþ^~åîǽ_ÜGŒáÓòGG í½Úl Ÿ–¯ σüᣞ÷ðiù’M¹÷ú‡Ü>÷Ëûúa»—Æå=Œv>ÁØî½ò™å‡íõ…ßîm„í‡ìo„yc  ÐŒ¾¹m„y#ÐTßÜ6¼qÐçÎ œ8'p.à\À¹€óÎ8ÞyÝóÆ@ é×0ošÞyÝóÆAœ 8p6àlÀÙ³gÎÎÎΜ8pàœÀ9sçΜ 8à<€óΣw^7¼hzçu#ÌMï¼n„yc  ÐgΜ 8;pvàì»Îû!KO_øþ°}Ìë»9l&á/#ö^àzʯv–ðåÓ— ÇÐå*ÛOã#¯²½~“îáõvÞä¡nßm"#Qh€èömÑ&‰ D·o‹6w"."."."."D<ˆxñ$âIÄ“ˆ/"^D¼ˆø ⃈ ¾^ŠÛDN" ¾^ŠÛDF¢ _/Åm"‘ˆˆ7"nD܉¸q'âNÄEÄEÄEăˆ"žD<‰xñ$âEÄ‹ˆD|ñÄ×Kq›ÈH$â른M$ñõRÜ&rq#âFĈw"îD܉¸ˆ¸ˆ¸ˆxñ âAăˆ'O"žD¼ˆxñ"⃈">ˆøâ른M$ñõRÜ&rq‘Í)²9E6§ÈæÙœ"›SdsŠlN‘Í©w6çåä¯A–¯£ÊÉw?ßG¼žIl¯µóy†í½ÞGgoÇ—Û—ÛþB·ãËis;¾œ7šÍh›ÓíørÞ4Õ7·ãËyã éoï Ú4š p6àlÀÙ€³gΜœœœœ8pàœÀ9sçΜ 8pÀyçÑ;¯—¼ÏMï¼^ò>o 4šÞy½ä}Þ4ÀÙ€³gΜ8;pvà,à,à,àÀ9€sçÎ œ8'p.à\À¹€óÎ8Þy½œeÞh4½óz9˼hzçõr–yã Îœ 8p6àìÀÙ³gggçΜ8pNàœÀ9sg°ìA{ÐÁt°ìA=(°ö À؃{P` ìA=(°ö À؃{P`jîŸã,ÿÎ;¨ž.]ÿpï×÷âøa{psºÜ<½ÀÇÜ\ñÛ—{<¸qÐdßÜ~3ÏM€f´Íz¸3ošê›ã4šÞy=Ü™7š p6àlÀÙ€³gΜœœœœ8pàœÀ9sçΜ 8pÀyçÑ;¯‡;óÆAÓ;¯‡;óÆ@ é×Ãy#ÐgΜ 8;pvàìÀÙ³€³€³€sçΜ8'pNàœÀ¹€sçÎ8àî§õ²µíëíŠô‘“(A´^¶6ŒDA¢¢õ²µy$q'âNĈ‹ˆ‹ˆ‹ˆ‹ˆ"D<‰xñ$âEÄ‹ˆ/">ˆø âˆßo•šGN" ~¿Uj‰‚D@ü~«Ô<‰ˆ¸q#âFĈ;w"îD\D\D\D<ˆxñ âIÄ“ˆ'O"^D¼ˆxñAÄ@ü~«Ô<2‰€øýV©y$ñû­RóÈIDĈ7"nD܉¸q'â"â"â"âAăˆ"žD<‰xñ"âEÄ‹ˆ">ˆø âˆßo•šG"Ùœ"›SdsŠlN‘Í)²9E6§ÈæÙœ"›SdsŠlN½³9÷Oa–/”ÑÂl«ÉÌ6Ü?‚ñãÎÏûøŽßï¿%ñqÙ¥G=~FǾ¾ˆÞoúü¢ÇÙ^òr~'ÈãÎ/üãNpno­ùðùììû®1ÐhFßÄ 4MõMAã Îœ 8p.à<€óΣw¾Îù®qÐôÎ×-ß5šMï|Ýñ]#ÐgΜ 8;pvàìÀÙ³€³€³€sçΜ8'pNàœÀ¹€sçÎ8àóF é×û}惦w^ï÷™7š p6àlÀÙ€³gΜœœœœ8pàœÀ9sçΜ 8pÀyçÑ;¯÷ûÌMï¼Þï3o 4šÞy½ßgÞ4ÀÙ€³gΜ8;pvà,à,à,àÀ9€sçÎ œ8'p.à\À¹€óÎ8Þy½ßgÞh4½óz¿Ï¼hzçõ~Ÿyã Îœ 8p6àìÀÙ³ggg°ìA{ÐÁt°ìA{ÐÁt°ìA{ÐÁt°ìA{P` ìA=(°ö À؃{P` ìA=(°ö À؃Ú߃ϧ]yXþÌ´%:ý¾gW›ã‹Ë!¦¿ûRËÿÄú×›[~)';î|\÷V¨Ï'g×ßy¯´{Ó4£mn'1M#ÐTß\ç5ƒ&ûæú;¯i 4àlÀÙ€³gΜ8 8 8 8 8pàÀ9sçΜ 8p.à<€óΣw¾Ä4ƒ¦w¾Ä4&@Ó;ßNbšF Îœ 8pvàìÀÙ³gggçΜ8'pNàœÀ9sçΜpÀyôη“˜¦1ÐhzçÛILÓ4½óí$¦i4ÀÙ€³gΜ8;pvà,à,à,àÀ9€sçÎ œ8'p.à\À¹€óÎ`:؃ö À؃{P` ìA=(°ö À؃{P` ìA=(°µ¿/'1ÿåáº#[öÊ!ìí1ÈiïæŸãùëv;ýãÛ)-¯÷““ÏîÇ'ßm¯9Z^¥´ój¿×[L/û§ªö>§§# ÷“¾^œõðÁ{Ï?i##Qh€èv%\‰D¢ÛÅpMä$"â"â"â"â"âAăˆO"žD<‰xñ"âEÄ‹ˆ">ˆøâë SMä$âë=SMd$ ñõ¾©&‰ˆ¸q#âFĈ;w"îD\D\D\D<ˆxñ âIÄ“ˆ'O"^D¼ˆxñAÄ@|½£ª‰ŒDA" ¾ÞUÕD"_o¬j"'7"nD܈¸q'âNĈ‹ˆ‹ˆ‹ˆ"D<ˆxñ$âIÄ‹ˆ/">ˆø ⃈ ¾ÞsÕD"_o»j"'Ùœ"›SdsŠlN‘Í)²9E6§ÈæÙœzgs>Ÿ…§ËW6‡ð=ŽXþÕk“WùÍëYÈöÄä«“ëc[^jçf¡>2‰Fn&j"‘¨@t{4Q9‰€øú8Ü&2‰ˆ¸q#âFĈ;w"."."."."D<ˆxñ$âIÄ“ˆ/"^D¼ˆø ⃈ ¾>·‰œD@|}n‰‚D@|}n‰DD܈¸q#âNĈ;w"."."."D<ˆxñ$âIÄ“ˆ'/"^D¼ˆø ⃈ ¾>·‰ŒDA" ¾>·‰D" ¾>·‰œDD܈¸q#âFĈ;w"."."."D<ˆxñ âIÄ“ˆ'/"^DœlN'›ÓÉæt²9lN‘Í)²9E6§ÈæÙœ"›SdsŠlN‘Í)²9E6§ÈæÙœ"›SdsêÍùÎqÐò/ªCè8ª±÷*G»Ÿýîñ…‡|úˆÛƒ£÷Þçúv…ÚöƒwŸÓ4šÑ6ëKóF ©¾¹]¡6o4Ù7§h 4àlÀÙ€³gΜ8 8 8 8 8pàÀ9sçΜ 8p.à<€óΣw^ïXš7šÞy½ciÞh4½ózÇÒ¼h€³gΜ8;pvàìÀYÀYÀYÀ9€sçÎ œ8'pNà\À¹€sçœp½ózÇÒ¼1ÐhzçõŽ¥y#ÐôÎëKóÆAœ 8p6àlÀÙ³gÎÎÎΜ8pàœÀ9sçΜ 8ƒ=è`:؃ö À؃{P` ìA=(°ö À؃{P` ìA=(°µ¿/Ç2ÿuûÔ—Z¾è:.ÕÛ·ë9\žÜòïÇ2_oß¶ùÃãcŠÇùXæùU~ÃÓ2 ŽËgúü*×Ã÷ž>sZþ ZþO;w:ÞŸxóÝýÓÿþéΩûÅÛxçâƒyT Z/>˜GN¢ÑzñÁ<2‰ˆD|ñûÅóÈIÄïÌ##Qˆß/>˜G"7"nD܈¸q'âNĈ‹ˆ‹ˆ‹ˆ"D<‰xñ$âIÄ‹ˆ/">ˆø âˆß/>˜GF¢ ¿_|0D" ~¿ø`9‰ˆ¸q#âFĈ;w"îD\D\D\D<ˆxñ âAÄ“ˆ'O"^D¼ˆxñAÄD|ñûÅóH$â÷‹æ‘“ˆß/>˜GF¢ 7"nD܈¸q'â¾/~Y¹?ýéÓÕË×®‡È¾úàø6v^å¤í5ßn¯)øvçýq^d÷ýqšÆA“}s;Óš7šÍh›õ‡y#ÐôÎë5óÆAÓ;¯×8ÌM€8p6àlÀÙ³gÎÎÎÎΜ8pNàœÀ9sçΜ 8à<€óè×k惦w^¯q˜7šMï¼^ã0oàlÀÙ€³gΜ8;ppppàÀ9€sçÎ œ8p.à\ÀyçœGï¼^ã0o 4šÞy½ÆaÞ4½ózüqÐgΜ 8pvàìÀÙ³€³€³€sçΜ8'pNà ö ƒ=è`:؃ö ƒ=è`:؃{P` ìA=(°ö À؃{P` ìA=(°ö ÀÔþÜ9ý9?–uùÃå5yÌêçÛ÷Ëysг9ÄXjì½\ÿ„ÔÛ:?|ìî:7Íè›Û¿ æ@S}sûÔ¼qÐdßÜþ5o€óΣw^¬æ@Ó;¯VóÆAÓ;¯VóÆ@ Îœ 8pvàìÀÙ³€³€³€³€sçΜ8'pNà\À¹€sçÎ8àóÈHDÄ‹ˆ">ˆøâ÷}æ‘“ˆßoô™GF¢ ¿ßè3D""nD܈¸q'âNĈ;"D<ˆxñ$âIÄ“ˆ/"^D|ñAÄ¿ßè3ŒDA" ~¿Ñg‰D@ü~£Ïˆøâ÷}æ‘HÄï7úÌ#'¿ßè3ŒDA""nD܈¸q'âNÄ}_üy9W\¦Éáíý9ǼOܯgû´óãEŸ?]Øq9Ù~èã5Ö'Ñ'£M®}óD}Rmr=å›'Þ'Ù&£×½îèuG«{»Ücž¨OZÝÛµóÄû¤Õ½]è1O¬O¢Oz]ëu­×µ^×{]ïu½×U¯«^W½®zÝèu£×^7{Ýìu³×­^·zÝêu«×½îèuG«{»šcžxŸ´º·K9æ‰õIôI«{»Œcž¨Oz]ëu­×µ^×{]ïu½×õ^W½®z]õºÑëF¯½nöºÙëf¯›½nõºÕëV¯;zÝÑëŽV÷v±Æ<±>‰>iuojÌõI«{»JcžxŸôºÖëZ¯k½®õºÞëz¯ë½®z]õºêuû­æýVó~«y¿Õ¼ßjÞo5ï·š÷[Íû­æýVó~«y¿Õ¼ßjÞo5õ[MýVS¿ÕÔo5õ[MýVS¿ÕÔo5õ[MýVS¿ÕÔo5õ[MýVS¿Õ´»Õö/½8-ìòøÑ—^äKDí¼ =ˆZ–„ŸO¢ž_`~­Åùº’“ï|¾Öâzfùðûï ÛDA¢¢ÛUM$ˆnWm4‘“(ATD¼ˆxñ"⃈">€øzÕF9‰€øzÕF‰‚D@|½j£‰D""nD܈¸q'âNĈ;"D<ˆxñ$âIÄ“ˆ/"^D|ñAÄ_¯Úh"#Qˆ¯Wm4‘HÄ׫6šÈIDĈ7"nD܉¸q'â"â"â"âAăˆ"žD<‰xñ"âEÄ‹ˆ">ˆø ∯Wm4‘HÄ׫6šÈIÄ׫6šÈH$"âFĈw"îDÜ÷Å÷¯ÚXþÅqXúÛÞ&Ë(Y6ÇSv™Ðÿ´ðùrŠçüð|OÃò7{sï§Ö} ³]ú?<¾½ìy§?<¸däv–¶ýØý æ&@3Úf½øaÞ4Õ7·3µyã é×K æ&@œ 8p6àìÀÙ³ggggçΜ8'pNàœÀ¹€sçΜpÀyôÎëÕóÆAÓ;¯HÌM€¦w^/’˜7 p6àlÀÙ€³gΜ8 8 8 8pàÀ9sçÎ œ 8p.à<€óΣw^/Ÿ˜7šMï¼^B1ošÞy½ŠbÞ8h€³gΜ 8;pvàìÀYÀYÀYÀ9€sçΜ8'pNà\À¹€3؃ö ƒ=è`:؃{P` ìA=(°ö À؃{P` ìA=(°ö ÀÔþ¼œýüüñìgÙ…‡´·:î—Züúñp'F>~ÄñŸß¾ŸÏoî?|u+ŸËóür{x³ü ´Üùɯ§6—ó¢ßÝ_àþ˜Œã¿<ќϸ>¡ç3š> >:­G´óH$*­G´óÈI” :Hd$ q#âFĈ;w"îD\D\D\D\D<ˆxñ âIÄ“ˆ'/"^D¼ˆxñAÄ@ü~YЈøâ÷˂摑(HÄï—Í#‘ˆß/ šGN""nD܈¸q#âNĈ;"D<ˆxñ$âIÄ“ˆ/"^DœlN'›ÓÉæt²9E6§ÈæÙœ"›SdsŠlN‘Í)²9E6§ÈæÙœ"›SdsŠlN‘Í©w6çþÑÐò¥ä!ýÍéŒ6—ÙË1ü){=ýùî~ôËç;u–¿§1v~’ë;îöýýõ>»¿èÎCRÏÛÎ÷^ïzçÏå#¾Ø¾Þ‡íÈxñÓãǯ§[vØ^]tyÑíqÔiùÚ´ªÞýM/IºʧÞ”m4@t”m$U]e9‰D—AÙFF¢ ¿Ê6‰ˆ¸q#âFĈ;w"îD\D\D\D<ˆxñ âIÄ“ˆ'O"^D¼ˆxñAÄ@ü:(ÛÈH$â×AÙF"¿Ê6rq#âFĈw"îD܉¸ˆ¸ˆ¸ˆxñ âAăˆ'O"žD¼ˆxñ"⃈">ˆøâ×AÙF"¿Ê6rñë l##Qˆˆ7"nD܉¸qßߔ˟ ‡ÔÓÍýc–¯‹ídO/ð«ûÇ|¹†ßlÜy|9´÷Ó³g3œ¿ó?òùóÿÅþ=+}ƒïþrîmy}Åw÷áûÅöÛ–§—Ãäõ>Ü_àwÛef/þüQ¯õ·ÏÃ*ó½aÕFF¢ ÑÑeXµ‘HT º «6rq'âNĈ;"D<ˆxñ$âIÄ“ˆ/"^D|ñAÄ¿«62‰€øuXµ‘HįêœDD܈¸q#âFĈ;w"."."."D<ˆxñ âIÄ“ˆ'/"^D¼ˆø ⃈">€øuXµ‘HįêœD@ü:¬ÚÈH$"âFĈw"îDÜ÷ÅŸ‡U.—–òæ›^§û´ØL™óŸì:î|ÀuJ<ÜÍ/Vöö¼°–?¾t<í½ìñ¾s^‡Çë÷ñ¾¼–¿~¾Kÿv—Èö5÷ß*aÚÜî™7šì›Û]"óÆ@ m³>5`Þ4½óúÔ€yã é×§ÌM€8p6àlÀÙ³gÎÎÎÎΜ8pNàœÀ9sçΜ 8à<€óè×§ÌMï¼>5`Þh4½óúÔ€y#ÐgΜ 8;pvàìÀÙ³€³€³€sçΜ8'pNàœÀ¹€sçÎ8àîtØœþèíU݆۟Þ\Fþô òóéMÄÞ‹¿w vZþ>î:Ïç`çÆ:ާøùìt;H|(÷n3ï¢ÛAb9‰D:ÈH$ Љˆxñ$âIÄ“ˆ/"^D¼ˆø ⃈ ~½+ œD@|½x¥‰ŒDA" ¾^¼ÒD"7"nD܈¸q'âNĈ‹ˆ‹ˆ‹ˆ"D<‰xñ$âIÄ‹ˆ/">ˆø ∯¯4‘‘(HÄ׋WšH$âëÅ+Mä$"âFĈ7"îD܉¸qqqñ âAăˆO"žD<‰xñ"âEÄD|ñÄ׋WšH$âëÅ+Mä$âëÅ+Md$ q#âdsŠlN‘Í)²9õÎæÜ9KÈå‡åÏþCÖþ-àßÞü÷÷ëG>¾A`ù[¼üw^êúî‘› ãË Ën|Š?ܾ{¾eÙ¾fãéc^(¾x¼våxÔÎçóÞ‰Äqùbcù/÷0vN$–ßá¾ÿÙ|óxÃ8sZþ¨ ß æöù‡ÙýŽ|ÓTß\¿#ß4šì›ëw䛯@ }3€óΣw¾}G¾i4½óí;òMc  ÐôηïÈ7@œ 8p6àìÀÙ³gÎÎÎΜ8pNàœÀ9sçΜ 8à<€óèoß‘oM€¦w¾}G¾išÞùöù¦qÐgΜ 8pvàìÀÙ³€³€³€sçΜ8'pNàœÀ¹€sçÎ8à<€óèoß‘o¦w¾}G¾i4½óí;òMc  ÐgΜ 8;pvàì»Îï|Gþ|—xŽ?hE/_kϳòé¥öVôò…`åñ)~3·7áë¥Fí¼ö1îŸÜ/ŸîÉ8O×íGìÜ”ÑF·‡66‘‘(H4úh}£€&‰ D·‡66‘“ˆ¯oÐDF¢ 7"nD܈¸q'âNÄEÄEÄEÄEăˆ"žD<‰xñ"âEÄ‹ˆD|ñÄ×7 h"'_ß( ‰ŒDA" ¾¾Q@‰DD܈¸q#âNĈ;w"."."."D<ˆxñ$âIÄ“ˆ'/"^D¼ˆø ⃈ ¾¾Q@‰‚D@|}£€&‰€øúFMä$"âFĈ7"îD܉¸qqqñ âAăˆO"žD<‰xq²9lN'›ÓÉæt²9lN‘Í)²9E6§ÈæÙœ"›SdsŠlN‘Í)²9E6§ÈæÙœ"›SdsêÍy9{úÙãÑÓ25yêǯß^û°ü×·ÿ}´íéS¼œ/™x|±ÃëùÐ×÷‹¾|~{Êå+™cÙÎÇïœ]-_aŒãcúÎÉÕiY5òù…ß;¸:Ýžø¹ý€½Ãˆ®hªonOûœ7šì@c  ÐçΜ8'pNàœÀ¹€sçΜpÀyôÎë»IÌMï¼¾•ļ1Ðhzçõm$æ@œ 8p6àìÀÙ³gÎÎÎΜ8pNàœÀ9sçΜ 8à<€óè×7‹˜7šMï¼¾Qļhzçõ]"æƒ8p6àlÀÙ€³gΜœœœ8pàÀ9sçΜ 8pÀyçœGï¼¾ļhzçõ} 惦w^ßbÞh4ÀìA=(°ö ÀÔþ|>"8ßã±|]v¨ã|F°üm[>rçåè)Á²ÇI{/`Û÷¼\#óõã-µû“Ÿb{A†]GñÐ]^öÿ¼óK¡¶²û°Ê¦}s»jÞ4Õ7·K¡æƒ&ûæú°Ê¦ÎÎΜ8pNàœÀ9sçΜ 8à<€óè×[c惦w^o™7šMï¼Þ3oàlÀÙ€³gΜ8;ppppàÀ9€sçÎ œ8p.à\ÀyçœGï¼Þ3o 4šÞy½5fÞ4½ózk̼qÐgΜ 8pvàìÀÙ³€³€³€sçΜ8'pNàœÀ¹€sçÎ8à<€óè×[cæ@Ó;¯·ÆÌMï¼Þ3o 4à ö À؃{P`jþdïÝQŽË¿ƒuúƒÏ–/‘Íâéå¾|{5Àíµ?y¼UÆcïñõgºBÜþú õEßÉdù—ØÞëœîÇ ß¯ʼ?IÓžNA.·gXî½ÐG¾C¥^޹÷z{$}~‚Äú¬Àí¿ó¬Àyä$J­Ï œGF¢ ÑÑú¬Ày$q#âFĈ;w"îD܉¸ˆ¸ˆ¸ˆxñ âAÄ“ˆ'O"žD¼ˆxñ"⃈">€øýYóÈH$â÷gÎ#‘ˆßŸ8œDD܈¸q#âFĈ;w"."."."D<ˆxñ âIÄ“ˆ'/"^D¼ˆø ⃈">€øýYóH$â÷gÎ#'¿?+p‰‚DD܈¸q#âNĈû¾øë”;|úgËÿüí'ü§ÇOǧ?ú›7¿ùõb5>]þv Ó»ßõå ãù ¶ÙìÛ±¾|õP§§W¾ ¡_l7Ô˨ãó§p]p¿Ù>9oö =-ÿ >=~’Ç¿:'ò£Oþü“ÿùɹû‡åǧOÿþ]O‹7qXþãßݺ7ÿ§Mº~üß}òãOÿÇòºÿ urAendstream endobj 65 0 obj 15306 endobj 113 0 obj <> stream xژ͊1€ïý}t/Ù$•ÊÏUpWÅ‹ËèŠÌMØ]Äôâ;«"ø‡«ø†¾‚I˶ݓ>†©t¦¿dª¿nhªìhëçõù`§ƒ“ãAâ˜TÆËAƒ5ÉO“ÿ&±N&¤\ guáæM φۛáðÈŽ¾NÎ7íçÆÆŠ3buÜ\·¶ÖÚÃÍóù|ð¦Dé˜-<^‚ª¦äܧK&FSBÏœ,™”L)ýÞ[2¹˜èzf{°„J6R|Ÿù’qVŒìÉú~ OZx´Â&ýžwWPpFµ×:Ù:<ª€Û½V•|Cº•³Œîvk}jã—>·ðvžNGZx×ÂÕú’‰÷ìç|¿¶ðcµBKÕ˜öe müµ‚k²Ö—žRú¶"ë-tíQèIs"WóE|Z®õ¾>ë®[ë~¯!!P$Px)2€ê3 @  %Æ•Wb\‰ñHŒGb<ã‰OÄx"Æ31ž‰ñLŒgb¼ã…/À¸XG @ `\œ%(ï ¤"Æ…b\ˆñ@Œb<ãWb\‰q%Æ#1‰ñHŒ'b<ã‰OÄx&Æ31ž‰ñBŒb¼ãÁZ "€ñà<”@ÀxðŽ@@ĸãBŒ 1.Äx Æ1ˆq%Æ•Wb<ã‘Äx$Æ1žˆñDŒgb<ã™/Äx!Æ 1^€qµž@J `\#P 0®¤æTRs*©9õ?5gkI¸í¶¡v<®ßó©£Pv 5Ù"sçÁ=]õ`ìÎéVsÇ6~láºëÔrÅí.™Êó÷«–L2^ýž­í¼õÔ“øÙÂ÷¹°¿n{ÜÙ ‡WS‹ë²ÆT|ëhµw°_OìÔÓúË-~Z¡7ë/†ÓñeÝ÷Y1.endstream endobj 114 0 obj 669 endobj 119 0 obj <> stream xÚÝÝn$×u†ás^ hUÕZßÚ{Ÿ±œ‚Sv”ä €,V€ä$÷0‘FÖ’GÐÝ o!Õ?UduÕìõF0Ô3ô¼]l>Cr¸VWwÃü¿ÿúÝÃpùͯ~ù ,²ÇϤz*Óåß?¿ç7üö›O>™¯øê¿Ïÿöðׯ>øpxœæ7>y/ÇÏ­'ôøê³‡¿øx†þòÕ¿¯é…íš¿?_üúeXìÔjÝ…O/›ê§æûæW/›¦Skûwøw/›q(§÷QÙDã|¤}ó7›f*'³=Á/Îÿp¾øÛM.;…í?€ Äžßç½í Ó0_ãVŽŽ6t_ ãtýuš¶Îx*m:è§KÿÝùâÝíqþõíùâõùâç‹¶É,XÆ£÷^Ö}q¾xs¾øzsÝùv+G·Ä×k|¿åÇõÖ}~ùÓ—‡š|8Åpt¨áùCør½x³êÍúa}þü.7Gž?ʸ;òøçmTóȆ‘DN¢¢q ‘‘(HÔ@4M$‰ˆ¸q#âFĈ;w"îD\D\D\D<ˆxñ â…ˆ"^ˆx!╈W"^‰x#âˆ7 îÃ@"#Qˆû8‘H$â>$rq#âFĈw"îD܉¸ˆ¸ˆ¸ˆxñ âAăˆ"^ˆx!╈W"^‰x#âˆ7"Þ€¸†‰D"×8’ÈIÄ5 $2‰ˆ¸q#âFĈ;÷cñ§Ý¤6Or1O=ƒµ5úh7ÉÝë<´Lhó¯±èÊi²ñàz×ì2º}»^¼]Gž?ì¦ñü kÚÝÆ?o›–7çoWi#ÐÔ¼9¯JMÉ›ó7ª´1Ðç–;OÃ&wžÆ4šÜyšÐh4ÀÙ€³gΜ8;pppppàÀ9€sÎ8à\sÎ8WàÜ€sÎ-w¾ì½ÒÆA“;_–^ic  ÐäΗ…WÚ4ÀÙ€³gΜ8;pvà,à,à,àÀ9€sçœ p.À¹ç œ+p®À¹çœ[î|Yk¥&@“;_VZi#ÐäΗ}VÚ8h€³gΜ 8;pvàìÀYÀYÀYÀ9€sg0:˜̃æAó ƒyÐÁ<è`t0:˜̃æAyP`˜æAyP`˜æAyP`˜æAyP`˜u<>í–Pç%Õü³Ààkó›ýŽjtO6°°}þóÎ5ˆS¦íúº_!MC½¿Öµ¾ßíÔÚö‡ÊóíYoãåw?Ýï#¤rpóâ~Ý :Þg?­û¹7÷z¸ܨX?Š/·[½·Ûúnýƒï&®í_ôáÀÕKnóV7±<‰² ßhZÚ,Ë™~#ÐÔ¼¹}1öMÉ›i&@œ 8p6àìÀÙ³ggggçΜ8à\€sÎ8Wà\sÎ 87àÜrçe9Óo4¹ó²œé7šMî¼,gú@œ 8p6àìÀÙ³gÎÎÎΜ8p.À¹çœ p®À¹ç œpnÀ¹åÎËr¦ßh4¹ó²œé7Mî¼,gúƒ8p6àlÀÙ€³gΜœœœ8pàÀ¹çœ p®À¹ç œÁ<è`t0:˜æAyP`˜æAyP`˜æAyP`˜æAyP`Ôñ<ø´[¾œ—3óÏwƒÛ}üñ~;³MÖmÊWë)*߯o÷‹”ÐÏ'º¼ç(ïßÉÜ?EÓÑQ^lоY/^¯‡úéhÙp÷1.úM€¦åÍí“«ß45onŸ\ýÆASòFÀYÀYÀYÀ9€sçÎ8à\€sÎ8Wà\sÎ 8·ÜyY6ôMî¼,ú&@“;/ˆ~#ÐgΜ 8;pvàìÀÙ³€³€³€sçΜ p.À¹çœ+p®À¹çœpn¹ó²lè7šMî¼,ú@“;/ˆ~ã Îœ 8p6àìÀÙ³gggçΜ8p.À¹çœ+p®À¹çœpnÀ¹åÎ˲¡ß4¹ó²lè7šÜY`˜æAyP`˜æAyP`Ôñ8Êó“E.Û’íÃSüS;úbû '¯w‹‹±îpö›‹<2‰ˆ.¯{“F"QÑåuoÒÈIDÄEÄEÄEÄEăˆ"^ˆx!â…ˆW"^‰x%╈7"Þˆxâ××ZM#'¿¾Öj‰‚D@üúZ«i$q#âFĈ;w"îD܉¸ˆ¸ˆ¸ˆxñ âAÄ /D¼ñBÄ+¯D¼ñFÄo@üúZ«id$ ñëk­¦‘H᝵šFN""nD܈¸q#âNĈ;"D<ˆxñBÄ /D¼ñJÄ+oD¼ñFÄ¿¾Öj‰D@üúZ«iä$â"3§ÈÌ)2sŠÌœ"3§ÈÌ)2sŠÌœ"3§Þ3s>íLr^”ÌsÀà±Vÿº_”l‹Ÿ±(ãè(EÉöÅTËÉϯN±;€ Û]ŠŸ"åèÉZ¯ë²;ˆÃçúè7MÍ›ÛZ²ß8hJÞÜÖ’ýÆ@ Îœ 8pvàìÀÙ³€³€³€³€sçΜ p.À¹ç œ+p®À¹çœpn¹óršJ¿qÐäÎËi*ýÆ@ É—ÓTú@œ 8p6àìÀÙ³gÎÎÎΜ8p.À¹çœ p®À¹ç œpnÀ¹åÎËi*ýÆ@ É—ÓTú@“;/§©ô p6àlÀÙ€³gΜ8 8 8 8pàÀ9€sÎ8à\sÎ87àÜ€sÎ`˜æAyP`˜æAyP`˜æAyP`˜æAyPÇóàñúEó?Ѓ—mõëÝæ.;xyÐÏŸ—½eÊü}ØÌŽ÷Þ‡ãÌ?©Íßuw׀Ǚ¿&§i:z‡ÇÙŸ­ÒvDg«¤‘‘(HÔ@tÙ¦‘HTAtÙ¦‘“ˆˆ‹ˆ‹ˆ‹ˆ‹ˆ"D¼ñBÄ ¯D¼ñJÄ+oD¼ñįg«¤‘“ˆ_ÏVI##Qˆ_ÏVI#‘ˆˆ7"nD܉¸q'âNÄEÄEÄEăˆ"^ˆx!â…ˆ"^‰x%╈7"Þˆxâ׳UÒÈH$â׳UÒH$â׳UÒÈIDĈ7"nD܉¸q'â"â"â"âAăˆ"^ˆx!â…ˆW"^‰x%âˆ7"Þˆxâ׳UÒH$â׳UÒÈIÄEfN‘™Sdæ™9EfN‘™Sdæ™9EfN½gæ|Ú=Éy[2‘^·ÑÓ~[²ÍÎÛ†².¾é­+æUgÉ£¼w=b§˜oöý5賕Ô󳕼;úl%—UÓ=ËÑ)Ic  д¼¹®ô’F ©ys]é%ƒ8 8 8 8 8pàÀ¹çœ p®À¹ç œ+pnÀ¹ç–;ßNñHMî|;Å#i 4šÜùvŠGÒ4ÀÙ€³gΜ8;pvà,à,à,àÀ9€sçœ p.À¹ç œ+p®À¹çœ[î|;Å#i 4šÜùvŠGÒ4¹óí¤qÐgΜ 8pvàìÀÙ³€³€³€sçΜ8à\€sÎ8Wà\sÎ 87àÜrçÛ)I#ÐäηS<’ÆA“; ̃ó À<(0 ̃ó À<(0 ̃:žwó6xë¼ ïug±ÍÖÇǼ^wß®‹€7ÛÅxRµÝ¾Z¯óv»†øöþÑ5ó{:z÷ãú˜™ÖC]ßó­ˆu­óúù£ØNÞvŠvp,ß>LèݺÔùîîADû“ýïÎõÏšš6×3ý³ÆASòæršÖh4-o¦ 4 p6àlÀÙ€³gΜ8 8 8 8pàÀ¹çœ p.À¹ç œ+pnÀ¹ç–;_OäÏM€&w¾žÄŸ5Mî|=ƒ?k4ÀÙ€³gΜ8;pvà,à,à,àÀ9€sçÎ8à\€sÎ8WàÜ€sÎ 8·Üùzš~Ö4¹óõý¬qÐäÎ×ô³Æ@ Îœ 8pvàìÀÙ?:¼‹{þþ:hÜk¿ÝkÛl½‹ûÇõîåo·çÊ¿oœšoÚ8ùÁñ»ÕŒƒ—ܘÿÞcå/ßó„ ó—l²Ëß¾œÄnw–oïÕŸæL‡Ã[y–[7ÿç/ŸVó|Ðû;?-õ¦íS[þa¾˜þjóx…£{åîþ²ï•ë7MM›å^¹~ã )ys»W®ßh4¹ór¯\¿h€³gΜ8;pvàìÀYÀYÀYÀ9€sçÎ8à\€sÎ8Wà\sÎ 8·Üy¹W®ßh4¹ór¯\¿hrçå^¹~ã Îœ 8p6àìÀÙ³gggçΜ8p.À¹çœ+p®À¹çœpnÀ¹åÎ˽rýF É—{åúƒ&w^î•ë7š p6àlÀÙ€³gÎ~èüÑú²‰Ãã/çÿ~÷ðÁ‡ó ÷øê“çkÎß•¦éqþ;hö<"^^Šñ¯þñá?ÎÝgóeiÓãïtýWyóÆ0ÿöÓ[÷âÿÚ¤Ëõ?}xzüù¸ÿa+T3endstream endobj 120 0 obj 4981 endobj 151 0 obj <> stream xÚ3P)ç2PIî@œÎåÂ¥ïf¨`©’Æe¨`„† ¦& Fz–Ʀ !¹\1†11š!Y\®!\\…\ E¹@ÒÜÒH!‡ËÔÒDÏÜ•cdf@Õ! ¡(…éÏà WÈš endstream endobj 152 0 obj 110 endobj 155 0 obj <> stream xÚ¥YÝn\5¾?O±T\{ü‹ ©Jh.ÊR[¡ núénH#6?Ê&íÞ€ñÙ]ŸÏœÝPTõìO>Çã™ÏßxõDã¿?^vºs¸ßy7‰ÞNN:Ðx=|åƒ[½yÕ½ÀGoÊã—îë£îñžž˜09zљޞ™,$e›t_<×Z?*ƒ/~­ ”q‘Ÿ•Ç›ÀèT²™Ëc¿<Ž7ÑFe"·»GAIãäÉ¿'H”ÓyH@à•5‰úõêÉ>þ‰a*Ö6Ôq„ÎJÛTG<×Êë»ò8£Ž m ³0”כ~Dy\-¿6°úóêÕXbÃ\ÌéP-½'#FÂr—{ä¼<®©·›£ÁD•€¹_|ŠË*d`³,‚/EÏô±¸/‹ò˜±8â8eK~4cÿ¬+ ~cöA¶ ~'ïd£\°’gu;6ñq&‚´«=þ¶z…B]ÖiÝç;bÍ[œ]Ì*W‡MËã/2,f:JNÇ:ÿ½<¥3Nk¤)ý ,™œõÊótǹ¨´çUø¢®ê¶èíðWb,;…‘eÆÞÕe~Ø„{LZ—½¼ù׉•Ÿ/§‹µExZ f¾i٠䀣s=lóŒRAV6ƒOë*®jF÷œ× ¼å¼ ufÆF¼°@@já›9ºâ$sL+“,¹NÎÂP+Z}Ö~m”ØqIaÖ1;75¬÷ë5ãaˆ \DÎæ¡ñ¶xZ`iÉ3ú¾a–}ÖcöIÓPáA–Oúw”zµÃí~Öòs´t\ S‰i‘ÐÒvWóËl|Ý«ð¯4L,º|«ê 8£FŽUçOEÐ*XdžÍh Ü×4I'ÒåÜjì3&­J·!"¯jµó ŒKË…¹G9ÖÚ{Î ¡eoÊv^]™>ˆ}Y'û(ÇרEI„0 íuÙQæíÃß”ïyýxZ7ðr—mnYR¤VG"ñÑÈ8¥Êèm}·`ÜêŠ+Ï:«ŽYrA•×-n8E«â1¥t6  ­Bèà iÉ3øéˆäB÷ 8oNš*çTÜιY·¥xkv,Ù‘ÊœÏ >;9ÐiÏ×(eeÃþ$sõfnçŽ.þn—«½Š%»¥˜? Îhðœ…vEÎrTJ"1#,p†s¿!¯SÁ=î…ó{3¾©ŸØö{ *» ïâ­ÁyýƒDêº-hÑn‘V€rãÓ"Çzcl+UÀÖ›ã?¥761ô‚µm½1 –v$§wöÆ`±¹|‹-1ø¬œ¤3ÊUÃõDÀŽß1ø½¤Ähù$ðÌŽ´}¶ð½½ÝmŸõxè[;÷‡¶}{6 |¥;Ú¾ÿª>}ÂŽ(dYØ«|J ³?è:ù1£h„ÌÆÒÆ—Ç1½Àû¦<~h%YŽžÁ=%Xä-ˆ*KllæÿDå§ÆŽ2m_Áv0 cv£k‚î…`‹ÜãÞEì“•½Ûªq=vzã.óIË¡1)6°—T#œµzBdcþgŸŠn(´5;òÀ7 Õå}ýaõ)ÊA!=oYΔ–Ùlµ`/2[c µ<Þƒf×°Õ쯢„­“/O‘ZÊ]”€·B£p.H@Þ2820Éh j歹E%õ±Ìw¨ÜƒhÔ=]J–. Œ^˜bsrPYìñ7z΋Æ÷w< æ´ÍÛ¼Rw¥ëpž¦n›V4¬Œ_ £„_2ù ©yÓž-ÞzU{W7½åÿÏ×¥JÿP¯«¾=ê~ÇI¾ë°‹EÇÞt½U*4MN:ƒþºàë7¯»§ÝAùY«–zGÌÇêÍMý8ÜÀ^Vo¤Óž¹ÔzqÒ•L¬‡q¿ mÛ–>ÌwgnC,ÌÃÖô02±Üš”ûq73Ì%׫•rxY¿¥^Çï9·]òù¢QãæçÕjúõhô[Ob†ò‹fé—€~ÐýœKÜÆWºÿª{6ù íþ •лendstream endobj 156 0 obj 1728 endobj 161 0 obj <> stream xÚ­\YsW~ׯІ³/U<@( Æ$@¹¨2މ±§€¿ ÕVE’Å•ìÄxf)ºçJ3ÓË™{¥¤(Ævî×=géýô³yç/fóÎ}xàÿ¶?¼üËí·6Þ¸³ñ½[fÓ†Í;ذýµ›>m溒üæGߺkŒÉ¯Ýùãð{°]ŒQ`îÞ% Ò9'0¿ÄÇm|¼ƒ_M)rêbÉ‚äGSL ]Ì:ןàã§S°5¾ Å ø-²¡ ± Ð7È…ÎÅ"@· È»Î( w)¨vÖÈ…ù …ع ÇôcŠ® !¯x]¬]r Þ—‹•`ùÓŠæÐ)Âñ.>ÞC Ù| þÿ!È.ìT¦ŠÙÌ.uÆ—Q^ŒKøç3|áãœï^8'ÛÇÇs|ìáã>Nðq€S|\Ð%ˆ]Š’OOx>ÒwçÚ%›ÍÅ0Þ¯¹KÎ øá0ÔãáÑÿó‹aÊýxŸN™¹;oõW¿ÂÇÙÀæ)>øØ~WsoÊÕ›ÚeF{³~$/ t6rZ“…^6²À%µÿ@>ß»å)0¥«&öÌ~øøÑ£{[,±\b\rŒÆm|ñdµ²ïJÍ7Îëdxì cÜ'Ót±‹¸âŒÅé@s"v܃PÙMÿÆA&0„A"ÿ>ÈàÎ GƒÐ ë¼O-/Ø?ï¾Êlè9èº`1 Ï(PƒvÌìgª¶ËÙ]íç'Ÿ=y°ýóÏžÌí)’T“ˆ! { Kaq9®_/…‚»»â£€ïve˜àñ0·WTl—/¤²âXÀ*»’e´ ÆE &˜v ˆÎvölš‹a€ *!`íªàsµAÙ@0êÁ]*ä“í¿û×Ù½› çô‘ã>†KVÉÕÐÙP|´Ë£žŒfgÊå°†à—l^=FTÞý^JÖÚ€}ŒVçób yFh\éLr‚fgðAr“B0]Mqí æWƒxÇèpFÕØ^~¡»Âˆªv‚3åxGjäRT’íLÝÆ+¡ã® P/ê/¨zC€»Å'Ô‰“x‹+&ižQ‡ÌTÌÄŸœfŸzíSªµI[KÉ!|MA®LC9‚ ]Vf1±Ýð˜Ú+Mˆ`O¬#ÌPˆ"”P•Ä›¿ ƱT ÐgãÜüÞ‡Z»Šz³rï#X3‹ÖŒ!Ï?u0À¹"„˜\©’¯šì’tÛ ÛBp΢±UÞùÎ ° €ÿ°’ë.5ë$¢šs¾ä<,­ü›?{ïíÛ?ÿÙ{¯ßžµß „p½ QR̆E,bq‚¦ŸË!]0È!ªÈ©c19t 9Zæ—ƒ@.h(:— r…,Ù¾¤ÞÔtm‚6ÊÅðÚQ5´ÿ$|`¿S©‚Ï¡.%!؇¨OùKºþgÊk¥¬D 9{¦›ù‹×ïüX•èsW³ØzêmQü¬‡ßóðû/½m¾”¬Àþ´ìßæÊ;/ÿ´yBoÿ§è3¼¯X¿¦ðæèżðúÎgùMx#ˆyHExÁu/y ´h¥ jAHÅ ƒÆ"A¯ÈŒcÅLjäBÆõbà³VPÉL"Ð'ø‰%é’ùL)ü§Mô¶··ÏÚ;ctõîƒSh õnÇÓífZ*ÅOˆÂdˆ2ùýÁô÷ "ë ùýosS›WkC NP¬2å’0N£kƒwΑ;ÔŠ{t|3q§Ã"?§[@ƒ´bûÒÓ ¯†&–ªµ{ †`w§ðÛž|¶½Õˆ’‚…˜XîK½•ÁF& onAæÜxˆ†órÿvY(CC§ Yq4£bê‘Ï¥pe0\‰E´Ïi¦ºê­ŽTd°‚<ù"àçs2èP/ ií6¸-k"‡_ívTt5ââÔf%¢@¶a0‡ÖûdVAîóîŠSìÓÍ:š1Àf'Ç:)sRÇä;ƒ"ÅàŠzc¶Pñu°ì¦J–G4Vy>,ÞÕž9,+ ^_ „'9$} ÅE°‚-8uQr^‰\«F–1ê‘_ÆQ¿úôÁöÛ[ŸÌWÈ L-»‰ó>‘aE ý1ãÔ*‚4Ø8zu–”!¬´–Ó]ÌTë<Øq·FÒ('`ÕÓɹÐ8L…õVÁ *4±÷ùÚûÇòútC³²¡r³ A ázûõ7~úæì~¬Óu,£X'på4íÀ•#™«†ÞK+ E8QUiÈ –úä •Ñ$*??H” ¬pÐÞJ=a™„Ðä€ó9lçXüSN;(3,WTm#4'kÐ.”õõÍUÈG1Œb„çƒôžRÃú%Ϲ}‚ú:…rw(E°˜S_"Š|-e\ðÄÍëKò‚'î>Iäب‚JÓq<Á–,Æc9OaÚbп2éC?ˆñ°†Ü£)Õ25£21e’²ñ’w>GýǤx=cÅBA+vYÒ½ËRGþÖýÇ[O>ÚúìÞ“o‘³ÏA’§Øûïmß»ÁìÝ׿l"’ø5Nö8n—®åçƒÜSŸüŒGG ’+ÆÌþî›ø·ÿð´ÝÇ*Þ­wt}…’#[`ˆ‘ЕqøAÃ/W 0/àÒ²cê’ƒ•#¦FÓvµJÐ1 .©¿t}n¼Æ°kÁɹ&y_rÏáWu_æÏQjírõúÑ HdSMó+s)’Ô)\Ç—P©Á” %–²¹Ñ± Ö ¤ìŒ×¼§6ɘ’=Gߨe‹?Q¼xVª°“¤ˆ·+B)XF‘mm”)Üp>JÛåƒ}šÓèˆþÓAŸ“ÄŠÕä„’Û™È;†*àÔ9†Úת9H:G›å¤fË*ŽXLÎIxI¼‚£æð#Ò2I‘/¸çµVN—š)˜.²sм@AüÉ'§Ù¥¡ÁΕˠµìÊ9– ^Ñ¢t)@WúàÖj©é{P:M»¥†Wõ!u‰Gt±.VÛšì$Ûæ)fêš^ NS¨‰,\ÐÉ)F$ø>¦ál›!‹qxL×ý)ɬ³: +«Pïa°9(¬1ª¾à–ëŒ8HSu)@¢¹à¯qÌÃöܺóVðQÈ¥>ùæH‘ÿõ±Ѫø)•(jÕ v‹æh,vc*[8°¥"Tùî»Æz)èÙM`Z°60é‹Ã*,[ȱ͚²h!S—Œ[}W°$Ö–™%9”J $EÎò¼) Š„aæÖsŸ®°¤YÐÒÓª* 2Ñ š‹ã‰ýØÇiƧ]ª¡,fšKÄ}ÅŽEÁú€ú¨ñP‹E¼tG;3¥DEãÅh¨(Fìý•3VD›mŠ\ÏÑ‘ „/¹¹*rèšH€Ñð!~Å´ C-o³=ºT %ý÷H³9G%Ü…ðÎ%/sQ‚¯¹3ENþ@ ÑO3u®}c9ËOÏÆÇ"¿ þ&lº§ËÎÈf+l¨¬÷e,ÃíÏ8Wؤ®„,˜±Þ¡¹† ¬õº {Ó,è” à»j]‚Ð#YAç@ cöyþY!iç|” ("¸k¹F9FO úë+;BºÁ™Òîô]ZÑ3Šhʹò­ËÂÔ"ô˜å -´ØU†z‘[VhØ0(%4Ò`:}ÑŽJz‘cüŽ(͉$„¡Ÿ¥FHe ¬®OV i8“l—¬Óª'“õ Cp‚F©¨WÔ Ü£uñ#ª©ãÞÈ9êuïÁ'çÑž¤Z!8pNïŽ4n‰ëǧ H~-.æà!º©ø£á½—â°€)ù¾G¯ÁØ~½8èûT:ʈÞI àœ†MXó 7}2&ÃeÅ;A<ªúÅð +âL'Ð䢎³`¼ŠÜé÷×»[ƒ™!¦p“xÙ]*¯c[‰G κœŸÓèˆìì¦LL}°Ä9¾â+ ÇL^C+Ê”Ï ¸VŽcy3ÍÎ=6(Ä>´™|ÒßÔºšÊ“Ùl˜ !¶;qšu®1É÷”ºâ¢²ÝÞRû•;¹'¼Zˆ•ÚiÅà¤kYoSŽh¾¯5‹š¬¯ãs^ÖIEŠÎMFÆй õLâu7AÏ:¸Àðû¹ŒÁæÒ9N0¾û !ÓÖÁFN÷Š›L¬¦¡m¨%%zŽ>¥#Ù×Cо.ˆiA¦Â®FpVâ•câL‹ŸhsæhµƒR‰%2h¬X¯Cº ³a†ÈG±cîø”Ææ•8¦‚1L¹=¤W¼ÇÃЬ§f¡gƒØŸK§Ùz˜íMÑ*F ¦V®úÞ ÌÝZ:V‚Ô†åÆû¯Ò3Îvè‹·ÿjOJ÷ÃDÑ.c³ßÿô|ðû{÷ÿôƒ‡Ÿt÷?BNoÞÙø3pygÃt`ªÿ²ÑSž^óhÃAN†¼ñËwgÜߟVü±ƒ ÃÙ*êW£ÇOie Æb7;Á¥uýÔgˆA³€_û¦,âæ¨¿v4êwg=,^ÔzØÒîÌÁ©Q‹Y.Éê €é46—¸*ø¬nÈö0=+Ç»¦)IKÇ©•÷`nWä&\ÏêÐzÄù5ÏŒ|ÁKYx|Æák𔡨Xß9á‹xn¦͵]é+hê2¾àF 3Gï~íˆ×ÜUàÄÀT¿À`ë*ÃÜ<ŽÄx8¦ÄÎ…‘¶ø¾ ÄH®E6’ÍÄ’M‡s7Vœø>;ÅX$IOŠ}» ÇÐ/>˜¾ç‡cÈ» ’Å‹+C¾]Pðr‹ŸÈeHóÛ•©•­ kŽœ ZZ”:åוŧiqÅuœÛ| «}™’SYäBkö•Ÿ³±S¾ü§9W’BÙUå¢íÛ¯9õQëëF‘6V2±4®Îë­CºÏÍ Ø¶oÞP¶;RÍ~É*:´‹žÂ…–k‚ÉýA3DZÛgl©¾ÕGÊEPíÜ÷&sUg ¡_ˆ %±ÒÏh—:Wk4¹ÊeDw ªžO¬×•ÎL.{ˆ&oü>K¿Àiy*–2˜Vùª¥ZS!;¤ó>¡ª†ÂUµW@ÊI<Õú¿«%”æ£_B™sEÖ74³e€ð¾†+Éé®kú&ð†ê†œò ãRŽ<ºÉêaI#'˜5¢_±éTÂY×XÚjv%žäl¯ý]¼ÝU¤0=[%ÿÑEp’a]ùG-Ë`6œW ÝŸ+¡ d<> šV¦Þ3o•131U/Et”:`è};-=q=…[`‡—¼úš«6ˆå}S»ÓÀoä>VEð * 2¥Ÿ½¹H¦ðÅô_^PFÑ8:ô¢²ö6á=+ëÂ×´O¦ïb¾î>áIJñþFûD‰5\w£ðZv-u {äàÊ'CŽØÇ øaaUvFOTäd¾®È“rsWÎúŒV#кÐÀk—9–JýÖÖå‡8rÌfÏ´‹a´P€õ2÷u­†ƒd!xÉNFš®B4ŒþŸ!ô¢~s$' _iá}pKáe„;DŽøAÈ)Ê¢44¼`³R˜­Q‚1QÎe X Zü€¶åµNðsrº0)}ËŸ”õ]¹2O—²aÍ[ÆSš …i\‡Ò>½u‡L¹f† ,¢r5JÕ!áBs,ÝÁ¯/à3äŽÖMË ‰¶A¸'¢Y†‰—?Ð(® FQ15 ÒÏÒ_Áo‰¬ Xò þ&NÉ•ÜOAá6ë”ð[Åiƒ^é”°k;usN ûlðk{œL¹Q‡¤€ˆ®$çÖé9²S/(V+—\“öªkéVÆðÓ@œÏ5ÌaðãŠ>z˜†G³è R:cøµ¿7©ò¼v˜ñcsòµŠ‚Œ¼²ª +oÀ“تíÂMâ8+lêlíiKe ¦uÊú¯Ç™º Èíù\‡Xe‘& †òÖgÍ‘ÛÉ>o¥Ü:‚¤x)žKöÑ €µµ‚ur^¨ÙœEåÎzõáœ^Ny&s&›ú/ÄH.K=œûÖ†…è¸X•6®ÿ½Ig°G+jóH”ì)½ùT)0†¾Ý‹±jP+-¨Iaˆ—0¼ÄMþ^Ñ?Üxs øþÂó¯uendstream endobj 162 0 obj 4788 endobj 171 0 obj <> stream xÚÅ\[Çq~ß_±OF‚È;_H”ذ$Ó¢lÒ6`G¶¾v~ÃrwI1æ^²»$Íÿ‘ŸÐyð“ýªž==§ºªÏ™sDÀ4Ü­®®®î®úªª{~s`5ügc>LÖªbìáO··ø„_s ïý~¾÷Óƒ;ÿjßÿÕÁ'ðŸ®ÿíÏoøôÃ\|VÙÙÃÇ!d•l{ñh~Q”«/*ùê—/~V_§\Œkío_^àã%>žÁþ×D;',`ÉFyׄ2y˜oFxUõ‚§í§ùÝ9>ŽÛ¯'ë ÍÊÏ8±®7Ê•$ YÇyQuŒã¥&C%xÒdxA˜æ¢¬0%:òÚ(®¡yUxSTÔIš[ÓæfÖ ˆkoÿlWSOØEØ9)ɽÏzƇù3iX¬J>ÊÚ=g“`ïÍ—dUÞBi‹Ò!-ÕGÝéE•båy“ãŒo*›T´ŽµyA§ókͼÉI•Àåv‡ÖÊè)Z÷„±%–È…ßsîm„9qœÝñjÜ›§MögmË_5)oÚ_/ØðÀ|«Tëà)Uq•øõü[ëÃáÿŸ¯Ïp,°•µ_°Ñ­Ë+j£“²:²g39_>(kóœª`n}¶hô †Òº0¶ƒbaeºdùIã~ÜÔF'úfÙlh§ l¨¾æË€£ë)[йäE˜¥½–¥ËQÙÂÙ]6ýW‰ÿ«q=^ÉÖY(ð^Ús…Š…4 ZÅ<þµžNôKå³QšóW× bvôkº Ÿ3é´Jš/Ú×”œEæòÕ1?éÌḧfƒ{Ýz¿¡»ôÿ¦]ÚC¼uVû‹+Vh:ím#°8ÉÁ?¶ÀÔLÍÉ«5FÆêžÓ¤Ô›ö¸¬ò`ßX=&­½nºøà^E©ÿv“êÃá&¶`&r,iRT>†öæÑÁwÀHlR4"‰yÛ¦©[ß_µwÏ)ÝU›D.S'ÅãërÅÜT.®õ5IQñœ&¬Šw xÊi‰â¯ÛHgqL7Ûš¬xÛ4wºb?ñÛ¾ák—ñ–™¯„`A¿4îŒV!úöf¡Æ.‹ü.4N9-ÑøÒå÷®gæŒú±—³L$OÓúø#ò»ß˜Îc;k(Gžð-¶Î샘Óêņɹs4ê×c¯“j`RÝlkðD‚&ØÞ9FøÝöø”ØK«2ú–Žú{„æVâŽæ>Á€KäÝ~„)r½XÞeìámÑœèáCBå 5œê3J -n‘Þ;øcæÒ"p§ÞqN·.WˆGͰÁBACT–Ì[‚c-Ì€a¬BW;ÅË&ÃdBÄÞóÙ%^†1›å1ÐxÙ¡5±ŒòºõsÙ󿾑ce›a"©÷ÌT‹PÂónGØÐ€có…‘ï…y\Œ0dižfDI‘¤¯@N˜WK}Ëju<§†í†âÉ¢² ÃUrÔ¬ê)šŒÊ# ¨Yº3c‚8€@³!¯h°íTð‰5›É⸀°Ä¾Fhh¨))n‘¸¦Xó}|<|ˆOje‚àãxsSwéƒí"F ÊHi7 ù@’µŸ¤¼¿]Jóˤ¤´²”?k’5¿U% Lr*‡8l19Íãr¨·l\”vød峿“”ŸÇ5h1XT"n:€Óš·P&¶¶žæ“êØÀLbÔ€atR°bOþ=êñ¬‚`Q'm‚ …w,@ ÷Iœ·*8NÔA ¾Øs*¶dC±[ÄIeAzš*‡P?ò™X1|Æ àw€}‹ÅCèj/ˆÑóÙbˆc!FOyÞüñVë9€e{ò½‰ÓViAJ)[•”I¼Ûa¶*(“­0Ô=ͬ‹¥†'}óAV<¿ÒF/ïíAŸÃòRkðxï0”VÙ>€'—Zþ­Ùà `o’ ’Ð[nF°ÞÞ„¥Xw¤äÚ7ë°ÎÛl¾÷b®Û,41:Ù`½ª'®ÆÿŸðá¨9‡‰„H©'ŽÅ)K³# }èpV:¢ú8`OôføßgÆ)sòÎZ›Çmî8d0éNæ´Ùc¹ÎÄ…FXƒÛè[,3ÂÙ‰}íl…Sä|v´Â6{yÔ cÜa“L9@çnO1^;DæC£Ap¹š÷8²¨°¶:E®Õ½òÿ€ rdÓ;½·-D&ÖAøµa"̹þ¹ÒtÔ|Òi³ su5Ôª&ʨàäH[xÏsWW´¾(Ô°kÞ•úcB˜ZöPÅd)ÿÜÛcP‰7‰VlO[¢p^…ç"w„ƒÑÆì5­1|Ea¼¯™†¾Í`Œ•=“·_6ŸÑM‘šÉ®‹ˆ¨ÉÀÄa±¨6iÀÙ\µÛ ˜- g-w5`C£Àù\ÒJâñ,??4ƒH…ëîxFiÀsf°œèq˜Ë•yBsDç4ot´Áòù˜T±‘q|J1ÑM½”ÊKg4£Rô°kš 7 _o²\Õ3:ª’"#âU=c}&ÎN(íMÙ oàIíV¿‘–Mù{ŒnèÑ„ãUáaƒݬ÷yÁü©q¾$Uó—&ËKâpÍÿPs¾l0ÿK߬šM¦¨Âý´_ï·8à~kûŒ®ÐDµÃ(ß¶æ?l)•Ϩ$7B³øóö¨ï~ fêl{åÀáN‡ñ².íͪ2S×Є÷hÅÌa!Õ2×ú² ÷rpLùz °kßU¾Ž„caÒq ±ÁdczÖNjØõ‰p®à˜Ép_aç#1’Í-`EtÛqTQ=LG=[/3ØŠÌøï€h]ÔÐ2‰Jä³éR=±¿‹fÉ_Ïvqxô€†Ê”8ÖÃi>[Íæf{•uRɼh6̵ N\·/zäøº:ã†eƒçp̰5ÂÁ¶k¶13ˆ¥ ±Íu惙0Á),‹Ö¦Uvô&X ·öïéM$½QÎóVz54”.Yôx¢ el¿³s&«?ÓqŸ6qº´s`[œ–Т9þ dój{®x6~:äÇV‰sa¬„™€«apJ ç ½D°ºïeàŒÀêy»^#p]Þ‚ëÝ´Îú¬DÖ–Qð0–×ZËŽüŒ¾œAšpÖ3Ph®:›¬¼ÇK`m6™‰)Ue\Ñ„±UŠ3ÊKš‘ëSöY 8‹£¾\í4'º"ïcXbÂX s?ò¥ËIfƒš©c èG³,Û =@<[ð;wm—s/]ðn÷:šÌ3n¾f‹<*êCa¥æ¶žËÉG«¢0?R\ýЦœ£ …K5ÈPØÙ%yÏ]PÀw:`áJ²’Ï{תsµÛ&Ö”O¾ƒ7!bðÙsØèË1ÿ k³ÙcÍfÁM ¾k}º(»ºÅô¨3rý0N%Ëž†–#,9€=IÞ$€vÚ0R¤×4 I/O9h“¹P”±Çü£á ·¤RæsyLvÙ]`¡‰C,H.–`a‡…—Dç™°òn÷»ÄJ ˜ªVœå´¡Î,ó’Ê~N½/Ýp;NqÇ~%°6« #¿"9-q³` î©ö•뽊ž²söwÁâM†vñ«_ñË/ý‹;Ÿ~ðÏïûƒCD¹hÂ%©®Ved‰“OC<·ˆ·yz:aõ{¯øÔÌ[ùM_µ ‘w?¯ºOA¯’´Ï)J»  X,ŽK>GW4’¸î÷h*ަè^Ž0øúñhk=Â{Á*ƒØ‘ï{+Oã¹ÎîÝʳoãEÖÁÐq€<ëòIëv^¤'ý-²âx?ÝÞ=&8³ËI†880µÇ§4ùˆË«0Ê74ç.Óò¡¬%hÉÊ× Ø;wf±\˜:À7Br“Vž`Ð1 ï…œöØ´ãŠœÔ ÷ñü–5Ö•4ÎiÜ.5-Þ$¸A+¶t§ÈN¥%@ÂêD|Œ×œû{Ú„xÝ“+8ïü“=úŽüR(.‘|âZ´´>ö?섈»{U ^jñŒ×µp“jx‰5€•/ŒÅ ²c!û Ô0‚S.Æì5­ÞÐä† )²6o(ø^ÍsWf®ÞsrÕ]ø€Ð†;,çµÊf ð%Ië}®0Á±Q%ó1n·Fïµ9i îõň©“sò$ŽrLyš kP¨¦[¼]eùö¨¶n][¾ÆÙ.Æ»Æg‡ˆÐ$S¡QÏbàa‘ ,hO½Å Ñe¬(©çóu¯±—®Å3¶ÒA\BÙl`Þn¿¼ ÐÀR•âi“d¹(3jš5ðšºnØ,r/ÜKx—•‹\5sšó¿éæ¼Ú\’Þõ ªÁûPkU’÷æÛ$ †_ƒ)Œš&Êœò.1š÷Û¡Ñï´_kè[4;fNDÖš^h¨×k9M<¡¿ œ¨;‹ Lj„D4  TO9J´òÊ‘k¡»kû!F$¤Ú”™°eÄÅÖO€°ÙY–jC<;” :5N\*ÝEÁsOô.ÜV½Œ“ëòøºË:£ÃuÖ×ïhˆ=n>\Œ2IÔénŸM4b"Wç.g)`xµg±,€Å“E»¥ãÅHÃÞ ZÒ\‰ÛaJˆ5ìµ6…aʈ¯¸7= ñ™ë—Æ€e]aõµñ\K·0‡`Kw™ÿH¸½@õ…‘wß,‚=ì8ÏQ>ÂPô‘ïA@ô)˜žÙ’@ˆ‚“‚Ÿ>éÙì—ùÎà¬0uÌäËÊ8w!M ÀRÀGä&$¬ŸPVG¾*ÁÑ|ú³¡Çïo ™ì¦ï¾x°Û!ñ…!1©‹gR›¿¶%t!/e6±¢á®‹q*ÙþmÙõbüX“‰ax{”'Yñéz+L°þîw¾ùï_üþ‹Gr~Õj´}_]ù¿ì‡Ž¿#¢—ˆ†LÞ(ëZO/ëÉó·Ÿ~ÄÏ2¤Ћµ–NW¨Åïö”/„CZWÛ•‘°³»*­Õ£_üä??²K”Oû(¿#ÚQù´õÚ±ÿéB÷Ûöòû¢ö»Î7h¿£jM×5;ç¶^ßÓ¼~G~EÓ5sª3)'Ìê‚b”5Œáͦ| ˜Cíû4Û¢ñË ¥§á¾¿é|ê g¯I€õìXXJGLBš áDØ[ËGùª{-„ͲUéðΖÛIñxn(²Â9]¸LvŽ- HØh|2(eÂîpØsœ“»ªÆ™KÇãɇ(¯ñ;l)³œt§`„ÔãËA-rŠ®ÑLR‚ÃúRÄ#à,~ót{Æ>X*R{¿g&€ Ю×vÌÍoC~RCêÃÇðL¥~L·øú1Üõ_tý îD·öŠ®Úypÿð—À÷ÿ:½Šùendstream endobj 172 0 obj 4371 endobj 182 0 obj <> stream xÚµ=ÛnבïüŠ1¬Ý<÷ËÃ>$Ñ%r”uD]Y¢--$Ñ¡äõ.‚ü%’2Jä’´ïfý[ÕÃ鞺tÏ e[ps8ªªsNºŸ:­¿¬Ù‰?vÍ$;×Të&žvßâ~ýËš™Üú>ßz°¶~ÍN.m­Ý€?¦ýûí/Ï?l\]+@%”¦x7yºƒi²ë¾xÒQß~Ñ‚Ï~y´ö~‘JjB=ýõÉü¯uŠ9ûˆx8½µMcbÁ9öŸ~skmýJ™X;¹õE·*Öû&ä8¹õtí—w1îW·þ£ª0®I0ããnûñ®ñ1Ö¯X6€u¾q. dÀðócXW›X­€;ÂÇw2„Æfø;øø@§Üø"éîâã§âK|âcož„3¾I± gøøV‚;Ó#ÁÛ!¾ëè¤Ïºù¼"IJiª´^v´º9ï¼Zšè£ÎÎýyHoM,]vuÞåÆU ~0ÝT›¦?J‘ýÁŒ¾±%)’àÂ9²Ÿþ4ç¿›8#J蘑38î8Ñ2æ5<ÜGÝÔÞΓ.4©:­D|‚ Nl§ŸÓ~œvlB"ç&ù¥Å'ÔÐä"Á_uÛױ߸º[òIG ´T”~^Ïmm*,zFp¿ã×N7gÀé‚Y¿â™&×Úä` ™?~øøùýÏŸl~üøÉ–»·ýøóOŒ™Rà¶ÀyÓ¸âÄLvé øèlšÈCZX,Èià+±±ú"—±ãü¨£½G„Âþ“ÐcT½¤*Ô „=ç ¯‚™–#©  ”Áz]8¨=ŽvÊÊîfýÁÖ³/ùõöæ =†sïdcj=蕪8$“št6—©c™øËÕD΄Æç$hª´Ý4"D>6eŽaŸÛ·éþïuÛ–Êÿµ›Y4*“`]äÞuóè…ù¨÷T]ƒ$†¬µ¯Ã8ƒ/a­QÛBÔ–¾šµGd‚Ü€ÖZ¨NðàÇ­6k:~PÑŽSXõ¦—ƬFÉ:»zMë‘ß *.àÿΓ˜áT}êÞÑ>ídˆÌ¤‚¥kË¡Ù>KE´6b!ˆ—}é—â³XZ;ÉÒ @‡“ÄTndr;BpmšPŽs •΀˕+ï=nküþÞ;®Ž4Â…Å(èpeã êc^ÄõN¶m@Oø̓b6IŽ…ªgÔQ¾¤a%ÁNwȇù]”@Á]òý¤E#$ %Ðu|Üž„9»\àçaX~ˆ¡8ÌŸça0Î YÀ\µòÊG”'€ËÙG"—è%!|Ü"LO–CþIçˆõ® %ÏЂaN%J¾IȈᣄ¼A³œ…@ŸáãÎÔ ]…ÿ¿T,Ú¤ˆtç“3Cxž‹rÎÀö¨$îËäË£Àµö&›ÎbeAÌL’£õ–¬7Ùïb©ãËåíè>Â9Ì÷Æ‚!Iy„c§#A™¬äÄ„ìg­FwŸîÐè²¢$ù&ý"¨+„hE@R_¶'=ÄRRtukNiNÀ’eò-µd;ÝØ‡º!÷`ÈStúÊß|†`6X}#§CˆØÚˆg¿ù½!‚,dØÌIÝé­< `R“mVà§Þ O#fR~ÐÍã­•PF-0GI­5,ÙjsÎ4èìGÄFý4ˆAç«Äœ]°Â}WŽ0km“SÕ©ÿ@Åf¯ÓåSj-]ã¼$¦%j.Cøš¥öå1TV^œmL´:±=±ÎÙ è‚J,Gý©VŠ´´„˜„ä*×sÒþš‰žè¬ µ‚µ KÈu%‚Dß­WZ™BÍR —¸@2 ¦·¶ªÀcrµÞä<ÇW¨¾B{@âL„âò9ù}JêŒÕ{d°4R8™Óï•ÌRi²ÓrÊ«S 7‰rŸáÀCU—9Ø‘aP£KsU|8¤‡.)OÀ ÷ßP­;Ö e&îwqjÂÜæ‚ a·÷´ÝF"À 'èhaÆ Ý6%WâY(ìP‘´•hͦ¦à¦3ÈcêµÊÁP¥Œ CÉ(•:!_tÇ0ð…¯whBbÈ_ ¤UrZßu«}M Ý~N+!óqWL’µ•`b_Äõ+Ž×$ayhý¥XêHSÄMÂ{"øÓ9¾VЬšÝ†ðI£÷uá n±  w%[š ,~p¤—Y¸ÆÓ5_‚‚f-õR»sl¥à@ªŠ rHëäc\³˜¢€bsŽýqê´ ²„ ~8,–M_ÉWW Ë2îBŸ÷{ôÕãÙÏOFu÷½Œ‚l#˜·ï/K ;¬)'÷“0ÛšÚÄ•°/ƒ{V.°:› -4/Jü±p’‘‡ —f‰Ñƒ *¨w^¬lêÚú?¦â¶OÝæºéY:'ÖÇCÿU ¿Ñi2œ=zFt¦§\>Õ¶\ɰYdžñ´<.‚ðB²â³¾¥½Àb](´.1´\wŸ«Òˆ;bw\¹°Dïñ²‹wvÙÅ&5)K™]lšA£Û±¬»°]¶ƒ +è¬`˜ÁGË-‚Ä`ÝžVy„‘ ùàu)ͽ59ø"Ðú¨÷ÕBsJR$Øî³ú‚LÿmñmRÏé\ €¦Ð@ˆ+È*±‚¹‘¼ª€kÏrð~–‡4{7b>±ÇôTû¨“©¾{:Ÿ’±ˆ}^º´®êäÐ9ÍYsG³¶DiyèldÖ—V9•îµ!p±|‰ ä$”¢M7+ [_Z{#·ÐǦâ2RvÎEeJÖF¦5Ä:]œN¶o^|ÇëŽØØÀqzqß]¼Ù¥Ú¸ÜfSXzµË˜Ç¶ö1†*è m;¸»“_¼í®íüðÊÄWŒ¥!-ñ1:+X<—}cŠ×A! žú¥e¹ãokÊ/ÖÝ‚q­FnÊšŸ¤›ÑHO5q2J|!ÅWm”i‰Î•îMÚ Ãü޵ÈT˜ ‡ùŒÀ@à‘€)`ƒ«2½¡rìf„葃+õkÛìŒCê–Sê”ü¥ûÕ]Û^e%v«as4ºÍ[þs–›b»†"Ùeã ö€HœKï¯R½…4¯zîùR±rÙ—¨·M1eœ7­­aPrMpr æYLÊr¸ j( ˆR€nS \–[quaÙ úÞ¦Á« xÍ2F¦Ü1È;' ßtfãTöAbo]8§z—‡ ±-‰sð陕:Ûv‰qÈ „'ŸE'7T•Çã0=ÐÕz7zqI¬:GY|ZɇŠ:AÓLÜY¢J´úÖ-} I\ȃ\äâ}­wÌAô’çûà.µQ|îÓ·4Oµà·£¢ ÇS(:Þ*ðéŠ,æ4jcýC ½¾bR—êšoJÎÉ ÜѶ!ð,&D£(H( l˜€m3̦íâ8?ð>g›œR,Qç ª XU°ôh`‡œ…&$}UGT»!ÀÇ!Gu‰Û ®))›;Ø›TSÛûÁ1–¸Y€w+]Ò1i!˜­(÷è=Ê¿xžX²¾´¿|çGdŠUµðꦀާªtFs(zÑ  ¢”ޱvulT¹Ca*‚s˜]Z°ìï&’Æ?à>í ò+CeÐq-JrÑýÂ\$ׂ?*^rðãE¬…„P Îe°R °åb@Ž3¢Î6Õ±wç¯)ØTÞ›±Þ`SŲ|Å mF_ÈWlƵ%Œñ•”3X ¹º¾à-¯%cäÎÁ_*M!¨$¹€}ÅÑòpïl²v5.4±X9d²m²“’½Ø < µšØZñ";ÖêG6âï3%N…+qJ€SW¨­Éú¨ÂUP:£×I{_b€¾œïÐç"¥¾Ôj”>mØ#áKÒ!E6àl« PðØ9£?g82@Ál1BþË ™õ ®q(nbsôx ÄØÆÏáOh騿f΂gyÛÑ;ìï—»ôŠÆQ½D •!¶*nYÖc7dÒzЍɒĪ&4d¼ýUu)U, ¦0N ãB ¢•cˆ¢ºÊ´6ÂôX/ÔþÈu ¡=6µ0¼þàõ¢Ää×XN@;6Êm5”j=÷ÃÔ R/³ã)²œÊ@:†·o\ ê|Ý÷Eé´è}3~~P\”QˆÂ‰s1¹-y…ÎŽÁvQÙ‡·(‹@ ´¢iè¥â¬˜åüâ̼®«­wšä ̆²§C¬Ø‚w–C‘³üénݧsÈ=/Ø\ÎX± EÍá[7вÖŸpÚí÷Ñ€ˆ€+èREEÍQ˜b2àÃ{‹9HÈe,^€ˆZ“é!o+ÁûÑq¬ç^Ì•+=ÍÃ"Ô<Àå}-o*à‹rHA²äÃXžãCh Чkt¦†2èëØUZO´;ð}ÔžÏä%D(À6™,Y~JÎéZiX±ï³ŒìÀü5-Õ+£çZќǤÏøQ<Ø8|«Ê‹ªê3¾®§h¯& 7sð©îh© À šL¾§„ýüpÇúµ”6€Àz‹Fø„‡!Z©õmô•ÎCj _ÃýÖ}Âoð⡇dưK‡¨·g¶r¦ßó`Þ»¡…ܘƊzÊ’úà[nb{œ£JÅxÎâ-u¹“ ¨÷¥1ŠŒPŸPÖ%ÎhA,¢S–6cÛdÐsÌ~†à£Èþ@’SUå[ýžvÐX_m§¼»‚V¥"¿™±I 9šœÐ{nr/Áž¸ŠVRœ&ô=BÚ5‘©¹`¨C‘%vïe§ 4uzKIj{5‘cªNß+Æ^áxÊ Q  Hl*$ìˆõï§Z 5Úa!¦ÚÆJâ’Ù>·GKr0).Éx=ÔS±GC@/L6ð•w.G8ì¼ý˜øBeÅÓke5,ءֽB(jî¸ôì¬Î¹#j]ÛY±$Û·¼D!3n/,aºÁ¨””4ŽšàSüíxÏzÉê©vpÒ+4ñ Ô¢œ+ʽÕÙ¡- Uó*þš´^IŽYµD o*XQNGI¯1N@.4ì;}‚b¨ÌgAä=xþâ·Q_«³Ñ÷º•ˆ½h9EN—ý¼•ÁG/'zƒMD*ãV¸œè}l2¤öœÊ —ñ-#)eAâ}/'â­[êˉmGGž¿œ8ûfðr"›ÈÏs9qn^ç—‡ç5` ú™/'ö3œ]N¤3¾œÈ;¨ç–öXg£m–êZð®±;„`ŠÞÝ»û‚º<ˆ¯»rN€µ ¾!F¥¾Î_w‹œ‡Þ.i^̘¥ØžàI§³ÊÍ)< Âœ˜‘XP¯T^:cšŒY§FG¾²ÈÅéý¾GÃ@ZG££Îï·JˆÌº˜ö”ƒc›œÅÀñ¾”6¡Aaàïu¼"_ v(‡°‚ <2 id+Ü¡ Àåb‚ÎeV#‚ˆ( @yXÒÖ„ÊÀfÿƒ–ÒŽùUz–Œ‰>¸¼Ÿáºo랊 Ýü_Ù]0•ö{@ÚHÍ$>T,E§l%õ%º•ñŸ‹Zù¶O®`;­ ³Ä»ì; 3´mŒS§çî?{øds{òäñçýÛ±'eY2ÆW3Œ ü·ùìÅãÿ}o{këÅäß&üuã׿ýý½?|zûßo]¾tïæå;—7>*û€S‰Pé¼÷hëù‹g÷Ÿn"µÿjÚ?Lþeòøú§nrí“ûno>Îé?Dï«­íÏ_l#¹|GjãÚo~{}róæõÉóÍíÿ„esŠàÐf‘ÄäÙ×O?ßÜæPÎû5Эcö¹}ö'gÍà2î?þÍÖöC$7ûÜ‘›}ÁÈᛲΩým–ÑVž^à[ö"}KèóÔæF›ÜHbÌ$×ö_Á_ÀÑ_Lûo‡Láæ¾" 3üGkŸMžÝÿr#endstream endobj 183 0 obj 5279 endobj 189 0 obj <> stream xÚ­][³]·m~?¿BOmÚ¤K¼.’Žc[êx¦±,GvGSãʱ:>–#)Íô/èæèŒu9sdYÕlûœ<àÞ‹$®µydÇ[ÚÔG€$@/[]¸úç#uáê—ðñüÿ‡£__=ºø¾¾ õ…«_é þÓR¼Ü<%å.\=>úÅu¥Ôueí?\ýÑÊMÎ8{Ž/ R§ÉEIñiFâÇ üø‘Ô¬ë´"ÃOñã!~ÜËñã©ídœµ3ò±€¥¦dg„ÏJÅ3ü8)ÿð‚°ó¤R$2üAº8é3Ö¶R“Õ¥uñ}ˤcf?E“‰‹7î~yñÖw7¾ýú»›ËŸÓ—·¾ý ‰©.ega˜f/šò È1wþûÒ‘¿œÑÑ?©5Ú¾z¥§YK9TŠO„0ÄIá¤eÈWt‰Þ™bºW×\ºDûI£b1¸ÔX4‡yÔò)¥~¯˜Zý? Ü#X™!ûF¡›æMO´ˆU`Ö-Lj6³iÜ‚šœö¼Ê¶m3°Œ’–4¦í»[·ïÞ¹{{Ͳ¹ÉщeÙ|T–»ºÒI7Êâb©gNkÍÚÌóä•ãm5µa ÞB‚;î÷©õ?°#=_àgBƒ3šM€Bø5kËŠ™÷ž‡¬g( •‹·²°ð¢µq}™½£„¶#Ê•yŒq´M}¤XZ}@ðÅ`ÒŒ9;â²}7†ü@VgÈlê4žàŸîܸ½äjp ‚í7òY™ž’«…PÏZ¿Æõ»/îÜùó­ÛÿÞçêfèf”ÝÜ ­]Ä–DT¹YlyJÕø!µgSû (Ê%k‡uàè²" ëràÍ€ŽÌl‡~&­X³:ªÚˆ€,ˆzÌ'<£ÔSéÙXì¾éwP šñqŠà÷1tͶ½(¯¨I“ÁÁ¦õªànLè‹ï‰¹Õ t`ÀRG ©_âIxCTkç(€ÙÓü„¤5´Íàü¸HSè^ ?¤ Xε$÷üøˆêUÈ™S޼Fõ <2¢Ž±Ç8Ì%ê<ÛIãúÍ@ŸPPs-ÿÕXuˆ]€¥ÜÚì`ùÁ$y¾zÏz›î Kèw&YËv_¡ž¾Ÿ’•ì>7&Â ËÆ¿/[⠡߸e)êîéx°z^¯(Ò«ÕFç4!¯ö‚Fõ[ë5*€›ƒ Qí,]åÐß…¹ÃáÕö¼ŽØœ|mŸ–'fßN€ŸT/“zF dÛçý¼X±ºI0˜H÷°h{=–HgX\LÏ‹Ó÷ æ>§aw#û¼]ZN6rq¸»6ÃJÑ¡¶éÔ‚µSÁ‰j§£c{Ý ¥¥5T~BWÜêéÕU3MA}OÛZ7ûÐÜÔ¶´<‹ÚŽI‹b›t…Y¤Æ¬0à¨a¢Þnî%;ÝÐS Ë‘rIPY[‘µŸQ÷˜vU ÷”¬Äνj™€Û¨=b›š•Bvy5©Y¸ ] t³÷¤üí5MPšÉôÚ7ó4¦0ˆã^Óœè€z9Ôⱬ3ÖAHÿƒ/ì:õy¤:cµeÐ#²ÓñêC?§ß¹&ff´ Šíèã¶oÔß_Î…Æôè½ÅŽi•ÓÞC£Øb ¼zÁ¯y2·/%·Ø—p˜ÂPOV®ZfΩuŽ{.7“ ‚6ó,Ò × &µÃÚÓã%§ýäZS«ç·8ˆ%Ç‘bבá6‘!×Q°æËóËþ@£  ÿºO¶)–ÌGªúo|Õ±¶×„·)†e<–íaXlµZ ìñHÃ;5Î×ô¶¡°ÜØØÎè]TúDùÌ)‰g "ÎX$-+Þ+›@Oºg,˜Îufçè¦ÑàÂBȉ5ù ž†À¨™Ã×"‘¸ì^]ìžR£@kcįfQûqéÞÜ Iv…Ù+±3÷ý”ž„Ñù´ç.ãlú_ºAê@+bŸtm'mî7uÃ÷u?ñ‡GÐ0‹ÐûøÏß}ç·ïüúò‡—¯~öùûW>é§ýpAwFG¦‚±kÖOÆÛ5=èäA5tõ­©xåÆ[ºýåw¿øî‹ßßüææÝ›7îôÛf¼ÊÉ@ÎVž;1³Í ü–NÑ )Æ)hÙ³A;Bµ´ß™)Ó™°å5êrócim=ðK÷ÎAv*¬éÝ™×9¬æÈÇ}‡Îx»g‡bø¿²rYv!L!J±ÉuÙa®ÙII¼§¤ï@V…䤇pÔEÙ·W4wñ˜O…û&þpÂæ?& %þ†`(³>2j/6r:xØ6aÁê4™`áÇ…ùê 6ö>ÿ¤ñÀš‚ÀÈé½÷OŠš8Àèmל¨Y|ìe;¦%ƒh:cèå† ‘‰rÀ¥JaŠL»Ð#«©¶¾£¾Œ ¶Üq?rVžßEf§ìÜ$Ým9ïÃ+æõëשÉH]èßz±•àÑ[j¶@±-L4m¶Ž”÷\¼”÷ÝÛº‹‹÷ñÿ¼qûæÝÿZqïðÔš²‚ëaƒïñ´`;×DfÜÿÀµø%âáÜІs;ƒ¢¶¨{¤Îí Ÿ…Öwµ’,·A›Ïó:Π™l0}ÙÉÎ9Pãûm“¶›m>µ9zÆÓ+p帜½ažÀ Ó†w¤Î'+÷´qS/žÃ뙇άƒÈ\'Kê|üÎ¥ß^þüÝ+—¯^~÷׿˜ VïÐ&¿c›üèßÄ&‰ÛÙä÷G”›üHˆ[9Pnò§4Yö9íñÃ?Ú @=~'£µ@Ò=~pb´Dw— ò–í¿$RU¨7 D÷Üñ€rôD·ø½†šì|š”=À Ö¥e“Tü:›ùÐÓ$™ÿ ÀE úû,,ü¸œ?hpþƬ·{e`IM>mwË8;™CãƒI'Ç磕C½JÉ÷ð)‹÷Æ®aNPQy"ϸ¯¹œÒ¦¢Ã`µOÉÂë´â\‡ÁqMFs2΂Ó%Ûç4£P:<¥§ÒžÑó÷h¦à÷Ë JzËÛ·³g8ñ*kW)¢ÊÉ4†®îâýòµÞ‚¤ HÁÌ[âÓ¿²ÃƒÓ6ŠŽm^ÖÙŸ:[Y2a'4G1žwïeiT¾"°qš•X-K ˆ—c²’M 6gAºdQU9£´ŸI÷Ð@Ì æ~o:Þ¤s“Ö’÷y39˜¢4Î :Ö¶ÚOƒ²´Ÿ#\³xˆJÁR¸œÖåc"·™VñàõÏBÒúZ7pÁCmZªÅ –°SLe ÊÊå³2îgË “™~žûúvþC3u:†|mˆ“½OÕø¿­í]è«Í£^vߪHÔ„Ùcê]LNÔyÑÙÿ}N/|w.€¿ˆ§_8±Õ¼ î|â¬ø7:-c îÜ£æèü@שݵb^í)U”g+LRôGn%c ª•ëKˆf­ÊÙ:†\÷ï£ô\ÐàøT·ƒw²] ìd¿'B šëCðKbwÝKš(êl{P:/p2Ñà®éàÒv\að©ÈÎ9ã`&ñG~Xc C€S¥£¤®¨g CS¿ P÷¬Ên]’ޏÁt°dì©æ›¼BuÉÑCºúú-ìœÁÅ£Pà‡sxß½ÖV6³‰øÅ¼Äá Æ2Îý^}ÂO¼©Ž._bAŽ÷® ߢˆ`0Žá è-|Ç5}á›#ñ×–$ô]©Ó–€§¬³PY¾}ô•¨wœK,¡é*e#+Î4ÜjÉB]òG~¼æq.ñ„ºÅC\Á³’˜Û¾ð«% uÙäÇkÙ @-u}aZâÃÜð«% uÙäÇkç’H¨{xjèý cß+·ƒq÷ÞRë~í©óï…ÛA’¯û©]¸÷Ôø÷Âí /Â׌ÔXý=1öµð:´†q£“³Á­c5š“Y“‘ÌŽÌŽævd>’%ù§Ñ<ŒæF"N™Ë9ed0½È¸x4~‘^æˆ',c¬Q_Xz-n•t×+¹,ÕÒóMË”ÞHâQ¦´G2=4’Ä’éÑÑ$–L5Œ$Ddªm4!"ÃÖ‘àZ¦mFƒkj20¨I§zÀï—Ñä ß/µ_R†&£;2ß<’—û-£Yq™»ɰÊÜýh†UæÁF²u2<š­“9•‘ÌÌ)Žf~d|>’Eù©Ñ,‚ŒùÂR™ê Ke1êÈÈyt›MlÙÈÍÀÑ-™[IÿË¥Ñô¿ÌÓŽ¤’å&Åh*YæüFÒ’2á=š–”ù£‘—LžŽ¦¸dVb k"ópƒYéDâ2±ƒÜÊöñ"ïãîæ–‚vƒy{ÇYNˬëNmSnï[Šíð–S™o]Â)°Í®íÝ/±©Úr*3­K8¶e²½‡"¶æNuŽu §ÀïÛ™x±ÁÓr*³«K8–¾ÝÎçŠm‚–S™W]Â)ÐlàfvP¤š[>Ë„êQ=_ªI¤-‘ ù™¥x!чKÓ~R‡ü«ä ÑÅÞ±Uü•Š|êˆÕà?Îäð}Lãz8Eï§Âœ1Aàþq¹¨H¯s™ý‚<Ú\¼åŸÝNÙÚ=œ¶ZA ýZkhÓ L¯<Ú“ð*§é5‡þ^ÌžYûƒƒgóSiquðœ8OçÜyš«À¨˜x°¹øbÛ¬{Ý¢£kÌî5à¡ÑÅëxèùÛ¥ÉY’'ð´vø¦®œÀÕ)Ê9QOàá2ðó˜³s°fÔ‡­ô5zNovùm¾·’=nŒKé€òøQÀ9d³x÷¹Sÿ\ÏB,£bñÊPoävGe TFe TFe ”G…Þøa6|<ÃîîmÙæ¨—âÂ4Þ±8œ )¯rx£ó;‚ ©ÿ_<ÅGQ3v27ÀØ¡ÒãqÖ-ÆþÑ'7ÀØâOľùÄœ¶ù|Ö۾Ƣۑ㠓dâ6ã¬-ŒÔøkw6L®3Ë; õZØŽ þÉeÀÓâøÄ¬ŸS–ãý\c¨§Zµ5rŸò—0’š·y:m§ÙÏ<ñFVp~›§ÅƒÙ³Ùæ™Oñk3À<´iVz›'x& }½Í/Wâà ‡yüu¿y›¥–m’—3ÔîilŽë<•Òt×y(Ïì~ΨÃyì¹Áňãm°h¶møf1á[˜Å‚oaò0’_E [D ÛCÚ¬ñ·ËzŸ/,è«e7Q_lÂiÌPŸQÿÑOó,A¥¿ë#~lŠauš«huiü¡\£o"B?ñͶásäÑœ¯m¨ø[ ?£mYoXuúDâÆ“ŒÝ«üøô€suJyq“f‹kg$V>¤ýf˜Ü®ß°[üÁiü8ð0C~Xnfü3]¦ ,rx½•ó¿#­¼lGçQŒùWÙ8²sÃ"'[,ïa¤Ë»èšP°W:Ä ¼Á•‡!¯‰ÛóVŠ{–/íÈQa·çm~ú™ƒ>á¿G:JóšŸWØfvYŽmvQƒ/,Ûtýr´¾Ñ'é]+ÊEWl|MË6²§xðvf ÛsMþžÅR&í,co†\¢c{X $½Ã`Ì97ø2fx7zé?g•Ä~ì]î>Œíƒl|½hùc©½v} 0ÎÐ^z™b kî ׿{óVX|ù‡×{ºýØ|ÿ-.‹?F‚‹#öhì™uÞ»×ý7¯¨óW„”–2g¿©w"Áë=E{ã,þ¤© ½ò@ª+‚°7ë»Ã‡=g)¾SúHÄc^˜®†dŽÿMß8ÝPV˜døbñ?óZ4h ž-§u¿ó&98‹X0àêï³á»‰£¿‚?ü‘ÌÌ+žû‰°\hã™ÑŸ‹‰+§q!Ám]Xã?Êç0sâ“„¿ÉÝqÜøÉy6Aló×NñkÒ¼Vç×NñçBñÞ­ ÿF\{—v-5}­ï]=úèèÙe<†ÏòŽ´û¹ý¢rZ~‡kŠt©ÿõѵ ßÝÿõ_;Fendstream endobj 190 0 obj 6271 endobj 195 0 obj <> stream xÚÕ]ÙÎ%7¾ÿŸâ¿‚ $§½Û·($R˜d AŒÄR¡üHpÃ;  DX”¯ÅKpO$°»ÛåZÜË™ÿdrP4g¦|ÊõUUÛUå¥O¦û§¿¹›îŸþ¼|Ôÿ~ýáúw^¿ûÞÓ»—_K÷Zß?ýàNÏ­ú>M÷Ñœ½úp÷Ò³išâwžþ¢Ið¼R?^­ocYp¿yô””ñRä³Éx§£ŠÙ >_?,á4Y…)î¢mç$ÓD˜\TSŠcsß…·êÇ“úñÒ;M¥W½\™^}zW|íŒ)_¹û‡B/ÚªòýÇw:OÊËZ|´Ð·håuåiRýÑÝ¢ßÃÜ’ˆl[½áiKRů­·4é¿âñžs‹!Ò½›Ê8b Ñ 4àh¢%|«>ô¾ô1݇…NÙ`’–Yãµå±3O—²Ðć€>ÙàCÔ²ª h˜Ç‚F‰àø¤7‘†êC@C2žƒU¦T„t¦¬´ÃÞÁ ³#–˜#Ôî¾Fï50º‰¿ô†Õ §s¬‚» „ĺ!·5ÁÍ'˜®Nk8ðý*µ @0ÅcÞk¥m—UÚ¦€ˆšBÒ(m/.•4ÏÙ›uϾ(Áƒ4NÚaEÀ’SÏ| ‹‘u(yøF¢Éâ4@f×PèlÂ8ÝÁc-õ(¤4YœîXG1ˆÍ4ù>&“ãœ-[eñt¦À“¥õÙOÔÇå¬AÏUD2CŸ©"D½v¶ŒÉìL•¥ÎÙ”ËSÀqr’%ÁÉ%‚è‰à.’çÙ…¬°Ï,äòëì"@”§Ç…³\§œ«œew¦Ò•ýÙBSVć‚sdõò^-Ö)§ï¡Øó(¯ê+ÆtÿzùóaÛ¢Ìx‡Ò:½Ìã•IvÕ¾E7æúŽä¼;÷6üë=ø×°;vÙ.™É~öìðõîïážFOjŠQö|F¹¢²u¯“q‘íKS&^Rœé j²2VŠ{“ìØJsȾjŠ*;É#“ƒš²à{§~¼_?~Äwus›œý5Øÿ}ù5½ñ`§ RÐd#xù{²åy6é¸Ò¸½ò¬‚^9òÿä–¿õJë@i³Òv×èõï‰òG¿×èµÚ²Q6˜«Ù)å=ÖNø~µÏ®OqÃîæ‡õsÁªT‰ÔOø54½Iÿ2B}Ùgˆ_]ùÞ›<ôÃÐÿ±„¤`¯ç!ï±þ7†úÕjæ7´«øÛ–Äw5»„¼GÛåèóްÕTüõìò®fGdúÅÑø»¬+þ ׳KÈûºì‚ùÍùÀ%³§¯g¯÷h{ýF\»‡EÍ+ú¿•ùÓúñçúñeýøüëŸòóúñøørùŽ=®0¡ä]Îä{K}§=‹áqãÙ±Ø=á¼ç2WM.µ¼ \ÉQ®¨úê×ÌM£Ä¯Íh ä¤tt£:ÁPç¶0?…ßö'CϽғIsÐí“úñGÒÍvçG:GÀÿÛ2Ù¿–ç÷{€ü>fí¿ά©,"tºÞÌò]AL¬"FŸ‚*³újvHy·U Iý.«„þVB#? ýMYº]Ïý\Ü‹©¼*˜ë­¤¼ÛÈ«èl½ÑÄ BÊ¥‰¡™ëó„3˜kÆk®Éoøšûü8/ Â,K4Ÿ@êïa{þâóá@µ¥WœoBÞ Û¦žñz ()ïÆÂ¶Ðï°-ý5Û? ý?•B8^o¡'彘Àíj¬ˆ×[èIy·¸Ù|½ÍÀ-ƒÊsn“ðpnæÂ3Ý2‹ªeµÊu# Û›ƒ‘ª­í 1ì~éƒdŽôêA~^ßÑ»ªY¹F‘9€€¿Cq¿¤áÔˆ¥‚3×Û+ò^Lªp¡–„×ÛònkŠ3?ßæ—ƒáy§¸ ?Q›mî_ŽÕ6|ÿÓŒöÑMÐÊP>?[Ê”÷F(¹;õ Ä””öZ°Íñàô dRNð}*ŠC­'å‡3tñʼ—ðWøøLĘjΖy½M)ï… Scçõ6¤¼ ÔÏ72Ä`xîa ~Ï2¸ÙPiFú,OdûÁÄNyƶ9åßΔÀhñw0ù?ƒ*A¾Ë3|‘ÇM^M6î¾ÈÃyö_äáÜÃy8_æ´y8ßwå‹<ÖÍ;½œÓÊãæâÂd´àœO§_¦·NMõi3ηÀú'âœ]—¢“”à œ*“''#ØB™¼ÊZÚ&Å™â× >q'¡F¼IªÍî$Ô‹EûcÅ”œ]<äÊ2×H³ß#Å”ê­p ÎoKÎè†Èß§Leà™8~¤O?Þ/ЫX&xeb¿ÄZˆz‹Ç”“ŒCtA‰øqK®ýÚ+õF ïõ0·X$w½ƒÉ²rè(ðý*U ®—qM²*Æ~µÚ”™^Â&¶µ¬2Ö>˜§„iÓo6wšXX` Ènú’†j`GÝ…`°b“êΈ›*Kéúâ–E·Ö‡ò˜™§KYhlSÇjêtÙ«Æ´¡ØÔ±‡u,o6]ú…ìJ×éƒôE-«nkÊ3™~»ÓÄ&Àu@vÓ˜4T› qL Ž%àͦÂYRq·©Ð&j¬/jYu[û ›‹{u· hb`: »iLªM€Õ8@4!`Õ&ŸJC7Éç"kÛVÅ–˜#×vsI¬i( GÛ4Åt5¥¡À÷«Ô.ÁT;b$/t”ŠCi‡çȦ’ŠUV›€&6–”½Þx¤ Õ&Àj6h°‰€ÍyhŽç<‹å†ÅzI³Ì°‘áx„GIDq ³µ(œ7iœîh‡ñŸG=XA:§í0óøƒBHã4 ÆDz¬YŒ¨ƒÐħ&šý ‹Ó ê0Zð9‚¦áÇbr°s¥¬Î*¼P;[¨È }¦„ÅÔÙ"BfÏ3é]:g¼ÌlgR¯,BÎ&_‘€Ž£¬ÎåF™Îd.‘¹Ï¦.³Ï$™^Ñ5zˆök ˜ 4®ÿwœ&(mª ÅæÈªòý2­T0L³¡ØY¥¼_:‹Bêl(8GV¿î´¢®ÇH0µ†‚sdUå~™)ªmŒ“j(8GZôí¢Æ0m:„Všbû•/N1 L¤¡Ü Ë%Q5½&bŠUóÌ,#0$}ɶItÊÇ${ÒÝŽ¤UòYpÑ“T·MÝ¡¨\Ü—Ü8Iö9ì©{wÓ‘z *&/¸èÍ×ú"ä™wÍ~HÇ«œ¢à¿øª%ïÅÌozóÛÎw=êɽoþ°¤EÏsEUg•MÜôÏÖU§U(“_v;¾¢ªc™¡Cý}ßËž±é%å¬Ý[ß¹*?Òí’{°0p\(C<7?æV’—Þ•M}3Їrú>D¶%†œç¿ÁMÞPñôí‡-›çÂISI+S=ׯåDÙ£’Õ\z¢\3PmpXÄÙ¶‹8ßöaÑøÜùp unŠþ>“ë0?⡜?³cNAœÎÙ¶œÎù¶./uZ¬/S‹0‡f·Þ8{n³U_iV M–Óø%õ\p¸XO{BH»‡‹œgÿp‘s9¿=Ðßa™T0‡ {Ò:É…ù%2ÎEÏ-½Qº”\Cû)hX^áæœoòdì§-›~J3pÉùS#ÿŠÊ·éù¢/#Bºö v@Vjð}G¨”¶1-ëÛîKÔ$ µê[; †²‚´} ÈeýM:=Ì ‹]—„.‹@iß7©uÝÚZªØ¾mVé˜Çä¾ÙÜib`: »iLªM€Mt‚ÁªMõ5ß7}+í&‹õ%-³nkÌ£ rß*î4± °@Ý4& Õ&ÀŽ&º Á`5jNºé›Á•^#}iKÕ­õ¡<Ú÷-äNc›:VS§Ën[+¤¡nàâРN&àÍ&3‘‹Bƈ‡m™U[º –R2zƒŽ9€&5$Ð$7uIC5¨!5 2TµÇ&Ք̼C”—-sdM½R~«ÓÄšGÊm›g¤¡³â4[@,ØB€jÌ^b߸‚ìat1›“,†nå Q¸m¢8 H‡á™%÷@8§ì0Pòð€"Hã4 †,>QQ,€S/Fw´ÃàÁ'MŸ• œ‘€u4‰ù† ò±˜ é\V—)íLÎ5ÇÙ¤+³Í™t( ƒ³ Qf‚3©J&í³ÉJFé3iD&Ô³‰DFÑ1^溓Q^ƹã,³Ú¤†ø¸†\ˆsÆÅå^±ÉiŒÑÆþHfެÞÛ/y Œ`ú¨ÊÍ‘aûU™(N1Œ÷¡àYi´_+‰’#ÁH Α,ûŒ(äðÉŒñ¡ài%±[Yˆâ ã´Á=’zQÎÏá‰H0ëü Êâ÷³å2²nÄàëî22××1’èCïs検É:ì-Ï­veê[ÙóßÁ3Z*Nߟ,_ú±mÒ:5e)Œÿ¼ÿ~ôóZÂ+?¯Åù~^‹³¿FeË£–6¦8ÿhÝM¾l`ƒSÎ9®äþË?Û¸Õ/…<æf íÌŒìvúf€xæ†wÛ>‚‘Á¬J×=´ñ¶Sòä€úz~là½ÑxoÆzå?ݸ7©’ߨ7ßߘýò‰Ÿ?¶«rÿÓÚôWÃçTjË”ò?'ªäåÏ鲓Ig'å¥o®ó¦öþ¬qYÙ[DÇö,êãÅæ”ÏýÂcã-LJmmØúÿ]Ò7>¨’ˆž_ß›’û³­®\œ¹q/S%oÒË›IŒái7gÛ:íæ|Û§ÝøÒ XV¾6ÛTɡƋ;Â?7!ëÿæ »Ûv:ÕñÿÂçïc5¾âsT "|b§‚´eí^×wpõm~¶úýõ¸ýÉݯæûå3.¿•ŸÝü;ꘘæ]Ÿ…5ÖÖÿ£»÷îYäþ 22êendstream endobj 196 0 obj 4204 endobj 199 0 obj <> stream xÚ­\ë’µþ¿Oq~¥BU"Ôº+ÿ0¾Q1`Ìbœà E9Üð—ST^añ\YÊ^ É’¼Aºgwçu·æÌœMQŒ×Þ¯5R«ÕÝ_$»ÚÿzÏ®öïàƒþ»÷éé7®ì]Øß{õ²]AXí²ÿÂ*†UÁ”äWû_îýú¶µ6½²ÿ—ñ÷ Œ+rûvƒÉ¦T¹¹ ÉÞx/1ï7˜dd¹º‰)Þˆs}S‹)Y¾ëW›°Åäè÷ô¸Ø ]0à¦G®šek7éqMÂC1I*56˜M [´É°aKçRÁÎyºÑ€Pù^Ý¢Ç{ ²d““ìØeÑ;gÁÄRôÞÙÕüÿS´Hl6-²¢„ÃÁã¸Fs³.ÑŸßÑãQÓ¨¨ßLâ=žÑã˜OÆŸþÕ*Ù›¤ô=¾§Çz¶í ¿xÖ´Sq¤)‰vðç­bŠñPüX£s87N¶þbÏøÓñ8î§4ÚˆQH?_v86ñb㋦‰Zq±ˆ$Ѓ5>½§?Œý{0J?~ñ°i,&Cçµú=Zx©y›>_½ì™©ù’MÁƒ¯>¾ûÙWŸ›;w?9‘âèu1èý~4¼õؾ¥ÇƒÌ2§è³‰Ð1§'£>jÞ*ƒ39Ã?ó8?Õzì¸b*ôܵUMqBxéÒ"'âìroiA16§m#”¦à|2¶´ïùøîýÏïÿãÃ{÷uKð–¹èüÂf&Õˆ¿w ü—x>*þÅ8ðµE=íàªw%ŠvŽG¥Û:u ó> xGËP³©Uo\ñ_€f\eã3ýWDÝ¢÷ãÒKüW©&àÌñ&f1 @Ô_¶^Úëþ>'âA;æÊªIR_߈Eãs0É׉÷?ŸŒÝYÿÔLjÀ¬Ä§0wšBÈÆgØqšBÁ4IÈ>ûýp;j\`6á¤m<õºð#a‡´´Š4v&øSë’¾ký¥KNÈôÜ_„WŸ§Șû¢K?mçÉhÁG­ÛK&Ç,¤çéÅáTÖBúplâa›" ¡`X˜©‡ —Ï ´“S°4,ЊÊNvy@>n—”3 tw{rP- ¶¸5"„M(eB9Úá¾Ð=FÄH`«uëù- œÒ´Î~•ú\™ªïÚàòäì§6ŽQ@÷˜°¦o[°(‘‘xßo†ýl³D«Ã€R'˜C…Âß×ò"Z#‡´+ ¤:1H[ms0ãr•×ølšê,x4w['{‹þÒ ˆRdCcÒ›wY)æ¡F¢ôj²Àk@Š )—XV`ãÒ»Øx;[ l~ØÒRtI‚~þºƒZŠ©¼1%\åR±KÃ/UДŽ+LÕY“kÈŽoõ¾˜bAÀ_´³qÜæØ®‹Tú<JCž;c'£:?1œCѿ੆Ÿÿ?ˆI»q^öÛQýmø·ÞÄÜYœàÖ*/¹ôÎÌŸPZÄ™Z#9M‹hEyÎ-þ-£`lä’§Âþ4ÂþÝÆ³F9ÈJÖ!ðÇ3ݹß4 ¶(Å„ùfðK<“ص4ÆÛÙRãðéÒGrrï‚ÀìæxbÄHQÏ­ªñdœ¼½È4Wןây0·Ù øÑ¨îoôÒ“|Ù–þ­ñÊd¶–Øö¨`põeBeÇ­¶žéêk6t,c=m™ §+Z·My2÷ ÙÉŦà7.¼~¯§ˆ„à¤}åÒþ‡Wß~wÿ˯í¿ÖÉå1I‹qSH©6>e¥#±Œ]°ÈÔoæÌ›·öŠXŠä-V)Ú&®§,ÚQ´«â$²—èPé_öo’a•ˆ „ÌL†åP*ÃÜ9¦Zm,£Q†#›vž²€9eˆÒ˜{œ í+—ÞÊáõÚ’dÇR<&‘0wq¥´3·«â’»²*Þά*ähj® X—Ø•Uñv¶°*ŸfU­±*Ž™ë0©‚ª(n¦w•\b9·=r e šsB_ƒ®oÅ9¡÷M|; +”‘ÊymYE™ba<®á<¡±™, W MT-©ÇÂp¶’‡mÊ“y?•}’o§Yca!aÒB¶)uÆÛ™$bÜeb¸ãMô¹GÎ!c›2ßxóÍ-llþÖ­Ë覬;'dÉd ZÆÈpÙÛVA]JV‘iÅóFõ‰‚œŒ#'öÿÅ ¦Ú i#™™\ Gí|Ô'{½MEª+z;ì,ØìÌ`ôuØG½]]DTÆrÈ×6¦è%äv•ŽKàIõŽZNƒAÒ9ÑÄQëóŽuu{qNv@Ùç™Ã°ç…#_Œ3¿ÞûÀv[bÆV“”{Lœƒ pdïÛ®'[” ï¶/£Tƒ‰hìÑü¯²g"ºŽ†ÔO²Ó߈ƒw×Êó}#–­ìø˜ÊÖ®Ðu"ux=D±¡çG%?âÖL[mx/F™ÆÇ:íêl‘¤jÔS7ÛÉ8åÐå,šxÚ JÐ3È7®¹ÐK¾I®¤ à­™Ó¦¿â¨MT U6$èa»è1‹kh Ùß—xc[­?Õ žO˜x(SØIér>$ù Þ‹(VuŠ…ÍäHÕ­—c[¼§ Éò½Û‡gœjQÏ.hÍ'}³KÂA‘cn°3S˜L Ì›:`6YyW»Ë"˜À´5@OåN¦à/òÝññvË{éÜ—«-zÊϳ@µµÅ€«?l*mŠ ÃA79‰¶qZ÷€V_$F©,æb\’ÝR*‹Õ«´¹½²Håü ife1!’KÌ­,Ò×ü*¤Wq„óOÞÎDe‘ŠTÞ݆s$|D~jOÄ”Èë*aßIó` ¨Åª#…¿xœ]9WËki8/ÂÛÑè=íÿž«5úl„i%G£>¢ôà%|nÕ1 uØ™óˆ“Ö©‘heGú®áæA C¡´J·&&UØÑ ¢‡áS;—î•3‘OÑÞ'}¹2RáÑ<3ä‰J&m©ÙÛJy&Ü>£œIÔo&¹¸œ‰.q_¬Ê™TìÊP”3¹Ä®åLÞΖr&‡O—39Z+grLÏR,&ÀàÚÙk0ÙÈ™žj έ_Ú¾6ä¬Å⪠5ë3¡¸Â@Ûl¥Þ¶:söçrÁ¶Ð‰ó@vf²ÐiÉaNhln³Ê\çšX Ç» µ)~·`‚Ó\›£ÏèΗ6ÃÌÍíhsäмc‰³Š»ô9Æ2Ì`~‹§´þkm7|Àl·¦‰¡Ì»¢bî¥7/\ºxñÒů^zíÚþÕ±®kO5DÚóKZeýYZÝõ¹š“í¨ÕÝ€ÞƒNbs°R%\Ñ^"”wCtÈ"«hB1âDY˜|Ùº„55-!Ó9tßH_?øúã{«wÿþÕW_ücc²’hC0ØÓ©Ú*àRM P{é5pÈ’R/Œ,3»ƒz¥½íümr‡pE4!{É…«X¼\,•¥ä¨•à‚ ÛQšÍÓ }&çv´E7—IÎÍ1çæssŒÆ¹9FáÜbÇóWFÆù¶$“!àâ´Ð9£ è8®ôz|Š…vò1ÐU)yòFwvLêÁÑii©‡›-&šêôÄ8:¾ €$#wè܉Aq¤rûˆ/C" ön’‘S¥/ÄÙ[’i˜Ä‚ö é]Gt‡¼‰Ã@ÀÅáˆ@6È@=ÊÆô_WÄsþÙ‘.šáHvRüG½PîèCs‘ïYNÄÃ@y;G–¤Qt™8ZrÐlÈ[F¢rÜéPœÃÉo¦X©Ê™<ƒKMs&Ð1GEñ“éä`—»NõÀ¶“šbÛ±³Y6é"w 3È6Gn!Û>ŸlsÉ]É6og)Ùv¸0l­?Hœ—oÞå‚OIW¹dÜè9—½/4®,ÇÕ¡¦LÝ®Déôh­Ó¡A—kv¸”rÞJ  =º|n Ì‘R¬º•¶œ€¶=(VÙûÎSªQú·•rG89NÊÛ…íÀ@‘}™¢Ü´Æé;ÓmJÓé¤&og’y¢óÉ)™­ÛІ;Õ24‚SLS#™ÅTâÕKIæÙÑÞŽN2>gÖÐ…$¹ˆdÖáÆ>Þ„B23’c˜ÚCèN“ÜšÍͽ-Dh/r‹îp¸è¬hXÊè¢)´„V’É{ªì•i‚‹ÃŒ ²C(éØ"ņìÀˆÉøTú¸ &”ÉÌK_€–Ò‹>âÒý6‚Ü+ŒQ⺠‹ôx§¡Œ'Ä8°áSh^´ñ‡cÆ2ü¬Óˆ§KÕŠÀ°#ñÙ$¤|ß:Á&»¥|ßô§|PëÜ$›"º eîVd›¢˜r¢à|qé]Ø”GVËÛé²)\(I¾V°)pUoóPî­Âd…*†¾8¥ÊÅÑŠv?Ýó'ß×ã8–JËqîh†í™ÉéýxÖÞ ö3?Z‹œç ¨\j³´¿ 2ÀuŒ¯e‘¾dôí3ÙÙz¥ëq0芚d´ŸÙ… ­µE,‚‚iÌ;|²ºv«éÉú–¨cý¢'ÚO‚œ‘‹ö¾¡…p2æÝ PôI9‚ìּ˄‰öÓ1ñ© ‚hÍW©¥"2\Óç8°wW[´&»¹Ãv‰N+.öíJ÷(¶hØÞÑ›ÃöQF”ÈvVû2lÜš7Xº02ow3´Oöxînˆ¬MÞN·|늘{sCh1u8íÊ0ß(‘îŸíVk4„,4)¯Ë;¡[Пò—ü¦Zpúdë[ iEЉ ZÜÐož#ºh¬º™»¤è{—X¾À™@¾µÓÛ@Y ìgw@2d'ùõY@FkSÉœÃdÎ=p—âPJâí(y‚ñU Ï{[*’ ¨rÜÊu©nŒXr]*¥¶ô W¢5.”rð[«tΧVνîðéˆ(vøïVÉmß*í¢“¯xÉOgÒukj?6 +ò ú<Åv;¦~r3ÌU+­!ºW#nÍ+h EŸ*I²X&sØÙáŽÅZ/àK‹IÃ%Öä'Y;Ò¢)kp &Õ½¿: ß)6–jÄ Xªi ‰fÞõ0 -,ÞÈ–³í !Ý»¥ÔÑe”¤‹>ËéO"1t%rí%oåä\Îìw}À¯Î¥#ŸÅô2:UD×è!Þþwê4IEæN6ð]þèîÊ­®ÜùèþçwWo¼úöêÂÁG÷þÜ=]’=Ê–sš‚hd‘)ém¦ û<‹$œÙßb ó_¦CG5[ŒI-1t‰¹ÆÑ.|qp篛&ñúõ÷ÎŒ¡¶çƒ)ô•šÎ¨6»—ÜiÇ]{öÃ^HÀk+ðgÄøI«ëc¾Žn²“M)‹®4'>ʤ´mÅ'·öÈæÃŒÜKÆ×!«a­Áûƒ5îÒþÞ;{j›_â3cPýb®C¡æ/üì·ñO ôLþ³½÷Ww±Ýÿ´yòendstream endobj 200 0 obj 4786 endobj 203 0 obj <> stream xÚ¥Z[o\·~ׯا6A[†÷Ëc‹ÔvÚEÅN[†a)¶ ÇJå AþÂf-Ù‹è]œæ¶}N:sVâ9Ù³ÚUøÈV¾’ù|CRO6¿ÝГÍ'ð¹ žnüasãƒ;fbÌdó‹ 3ÑðŸ™d=I>)íòdóË÷¶´Ö[ÚFüù?ûïoþ£‚6Ê'Hè¸øið§ù+~¶¶ðû€È» ¢‰L~ŠŸcü¼&ðUIyépŸ¼*Þ´øátþNðÅ+SŒd€Ð­?gøy7³&¨ù*zø9;«¢æF;«2§ø9©¿» ÒÓžIϫɨôQ5èEÅuÿ÷x¨ÖÙ¨¬çk(#poU)…Á¿ÇÏa•™áç"˜¬Ò&ÉãôÛ~Ž{óoÔàÞÓ«¿Ü¿ > ŠâÐgÌÛå|¨úÂpPï•Óaî 1Á*Ÿ=Ãw Y%cæþ“Š–Ïçsü|6f­bb¸;lbcÁd¾Büüš -D£3Ëmaœ‡Epc`éi´en>ð§Ý‡ÆYTÞòÅ|ŒŸOðó'fYYe[_''93i ^S†ïªÇÇ(° èŸ@%$‚qÊ߯ð T?iðå”-“~M#oJMfT¶™ÉHIà¼Î¼™Å¼‚»xùÍ2^ù`ØS:ÊtD²Œ5Y–æ‰Ùæ¨GÐIV£|èLT½g|¦îœÊÅ,±ÜôzûÛ>ÙÕ üDÓQQÞ*[¤ž ÊA9ZR½{8¾¤n'/ëî¶y¾®€ׇ¢’0¸±W“¸úi‘ÊjŸ]5<Lˆö–¡3$tÏ"s8=¶óÌdK+ÚÏpV7í²ºåv†k¸a+¢jEƒîKÜ!­^?ÒÙ¼AÇø¯\“††ˆE®Õ[Ü(šØ\“ØŒ¶DêÕã{_=ÿh{_ìÞÝùzë½­÷Ç*¡#c€Ÿüºã¤®ÇÿýÞÎã{;·wön1 WTêµæ,R׳¸ó|çÅö`òp8x»ÈØ*£ˆŒg „lÒ¸Bãʤ%D¦g$‰™%ÃqxŸšâÁÓ‚…jï­a*–¥; ñ’5—y]Ç>kJ³<Ô¬ÄmE ›-ƒKa^7bVgú޲PXS.Lz_N;Îaö² N©àÍ 8(˜a‰mhŠ7vÐ1ø"M$ J–Béð“×DS6PÖbÂc½mœ˜Ö‡¢tŠò8„õõ«N? §³|úóA;Øa>o ˆÆØwU¢w‘£ú¹¬Ž9¯7ylF;5 Ö—ÊðŠU!øVÅ‚&üN+ƒ™ûÉp5¡àúýmÐhZë'¤¤LÎLÏhBòЗY~ØÏ·m—KôLf$æ’®ÉTüH)ï[ÊM²|¦#it1™Û³I½ïô–Q–Z€ -Û—~CûL:ãô5Ze,7ÚŠ ¤ ´x­ôH‚Ä$å’¹iñÒ‰ÀC‘>yîQßóa¡º9Á1ÆRø‘Õ¤ñã*}ZmõzÁ)šØRŒú°ýº¼Z%‘Ú¶‹ö0‹VËù‚|0Úb!»øDà»Ïm?õd÷›½ï}ý hÔö£»»_ÉôŵÞm5dÎxHJ…ÁûS™Yï¨ô`Ç©²%I§§ +—Äqbó™óˆì”‰Ücé Zd<iá=™QòE³¨ ʛȤ©ë{(qÛrJâý6=‡ä˜ÌIÍÑUÅ|É6 ­ 0·VÏòåàÅ"•›lY²Ò³ úˆž}]ÐüìU,ŽÉôî:k.8-â#®V~P©m[+=’’,˜Ò_¹?a9-ë`_F.gæÂ‹ƒ6%·RçÔXKé34$‰Õ0£½¦ä[t"dÙ–VÍÿyma½§7­Vˆ‡h†Ùa”4B ØÐ¢W>)¢=-Ô%dÖÂÈ'”ÍÌja¹ù˜©k´òøËðX¥Á’³CZZüâ¯Ïâ×Üœrj1¨^ϵ-î.Þ’óçÁ)7½-ÓAYQ‹õôîoñïó›-§nf»šå(V°ÄŒòÿ±2 56XQß-Wý;®•VÑ`q÷’@‡¥›á%)¸õ´“ïÎÒWš6ÅrwÕYÙn’Ô±´™‘!÷ùFá´“†ÂÙ=§·&áMR”ÜÖbmV³ÅâFë>B©E ŸÎÓH˜Ÿ‡zBóÝŒIeˆP>øb© fO“þÎüÒÖÊhŒ åÖ†ÃkßW3ÅÂ(NSW+@=ÃõÆé àᚢ?a”ÅZö«Ø¥p0%dhq‚¾E\ŸP¾vÈë›»Šªàz÷¦–ï´6Û‹Ò&Ž.éÛeqãÓjÛE±5<§5¡Ê G2“Jb šc…Aq¦Á NpÒð†¶ˆ§ý?éK°VÉLÁÈ+ ëðy]îº7‰6Cï´fLßÈû§#P7&ÕÄxÐöA1s•«¨dÙù`q¤8Ûì3´ŽÝýˆ¸ro2Ãð•ã,ed)Ñv,€aä…*‚/Þg>*yçS ¯fÔb˜«@{Æ@™+ãMxðaùx5)þ2x<£•qÉÁ‹ßÑH~5va뢆è¦}%±I/ˆ 6¥¯¾ö[~†7”ÌâÍKë&*ï`ÞßüÓfs.¼0¡gô5LáØã¼Ü,…Ágk´*&+¢¬¢i•Ï({8o{U<mM_&ÌlIFÎ)—Ù$ýU†,-ª–mTÅó¹ÝêeËâõ ßs~£àŠWQûU7úí®_éºw½ªÚô"ÒC-ÑJáà‡ïXàRåö驇>OZ=§ôïM}¥4—|0†lýál÷œpðÄ ÷Pksÿìik«IƒxþÞ€¤#" ÍD0 yºŒ[HÄɳ)<ä¯r½UFhïãè-š¨¤PÖVÏ´=ÄîÒPêýûˆžN §~x&el·è¼šÏhôTÊãs©½F†r¼$XYÅʼÄ,K&>eÜÏã#7ìØ+¿Ô7NÏÊÁùKHÀÕR wqó’Šcá=Z›%.²F °#Ùse<ºsØ£Ûa·±FòC’uj×Í}Øî&èr5«¦>¤'¥a“ÝŠ 4Iü ÁÜÜødãŸ]Ïñ%|S±“ªp3ò }v…üŠ@¯åŸm<œ¼½ÿ i´endstream endobj 204 0 obj 2672 endobj 208 0 obj <> stream xÚÝ=[Ï%Åqïû+¾';–È0}›žŽ"Kİ, Šaw³X¡ÛX|l¬ø?,{Á«,‹³Ðòsòª™3Õ]—93çË¡q û«Kwuݺ»NŸþìú.õg×ÿ >🻿9üÏÕ·/ýÝõK¯_Ïœ;»þëKnêuge<Ëqè†ήŸ_ú«;}ßçŸ]ÿýÝõ¾‹Y½‰oáÇ/¸Ë]ÊE_a@~è|Ò4ïô¡gp!u¹$7àÇ-ü¸FWñãvî»~ð ûæ4üx›¹+Qê'Dý}Âf|¼ ]ô”'œ_âÇ ëú%uÈ©‹ÁCdí¡Ki8ûì’¥ËãØö$˜@¨8mOìB0 •¥ýÛK¿VxçSg´SaYEGö /‚XHkæÈ æ”ú¡‹¾Î ÛCvÍœšž‘‡Ã¸ ¦R™Ûíœ*¯eN•öaļæTy5ކãóÜXL7Д°ÛÑÖŽÃÀ-DêJ5ÛÙ—eDö0RÖ†©úûj%аAÛv¥sÀ~™¶sj†Y;cZ0Z±K4‘¥ÕΣrYÆAdem˜HåB3ÙJ ²Áy„ÜyšGFB9”vÌ¢5Ã63ÃÌý0…¥Éæ@8U_ÉMGO–Ñ/iø-‹Ræ\Y¬n7F8OV·…®{iK¥5½™šlWn›ö-T»4f0ÓÍÊjÃ̸ª•V+ë/ÚÄhKï…”V]ZÕ’lö:VíQö¸<íü÷:=eøÛI{å}>Išæ¶ÇPÞr§ÓPV´Ã´•CC^Õë;Xsµ êhãÞñ@¨:§E5LÂ%‹ht<<©(ÝpªJa.™‹cÁCΆ ©ƒE´dáÈyvÒ&ULªûݯŒ6È£?{þýÍ’þ–6ûõ)Ìzå(\¦Üí§”#Þ`©Þ0t¥(èË ÒÎG,€xκӔޥ|ö&5çÜ“çäNan¦©Î;H¦5Ë«”ÿ~Ù­H§Gñº&O÷ÿû?ãÇ >9ß ÉÀrÿû?þ "òˆþï>~ÜãýfÂhùjP‚Åh ´¯ðãjŒ!¹6 ÷91­ì_N`Ø`>jÎuÜ| E¯™}9I¢…Œ°Û*Î+Èÿ qL‚{FÓ›š Ø4EC*/izIö_1ÄTÀ0õ(_§¡þu^Æã6óõËëKÌÌ33 ÿúñ•þô_|þû»_|öö'¿G ýŒ¼¢lC}³š}8(_ÔHÚ[áJ¼{4K&Û<_¸˜%-,HrY?ÙT0ÓÑÃZS‘0vã ÁµŠŒie/I;žÚÚré‚ÓØß˜J›†lC>“Jë‚·!'£~ÄÀ]p=Õm 0vQ+¨‹ÉVPбâ#£Ð*èµc š êô†æX ÿufj·h÷èŽyx`£s îW:®ÒèÆ¢p¾åzï ¢Æ#„«{á¾®æÈÙÊ$Î ~ ¾f_a>^Òr9bBB³ôÚ+Ž1±!Ë£Íi_—õ ݵ\F|g>ÖrÿÍ]2äÁ`Þ§:\šÂ3ê{ˆŒ õZÄÕÊîs ṿÌÖ •R,".”Á œŸ1çÌ«¦OÉ‚wÖæ’ݼqà(5· {’£»IBÛ1ÎAiÿ89ü±qrHç£åcì µÂS*árv§W˜Èõ!h¯X÷ø•3FÍhS÷}QJòÝGÉ « ƒ¿ âÓ²‡yâÐÊw°½‘ÐT…ñ¸öamÝ-† )ƒç08’†›Fþ÷¹°QpMg;¢wÒœ#a|E†ý„/»á¼qƒžë‰Þ=#Ûà>½ô]½1çùTe)Xü¼%AHO»a4WÔsE`:ZSAîŸ!ˆ”<¬Jï™Ê¿34Ü»Ör»Lü_Ú,L8÷÷9OíYäN°™õ%¯¨ƒŠ× "j2†Wý[éÈ\ s %¯¤ 5.( {|[ò½oòc„x6(ì?­™L¥DnÈÕ)À¯‰îƒ•ä&:Øóhĵä&Aêê´ˆÖ’p'cÒÔ§Õþžo7ÒxŸs -U_lŽßpÛÈ¢ÇöŒ©#_uŘϺ‡Œ¦„'µã>÷ÏD âùįÑ[L¹±Ö­jZObwiPÔz’À±¦bNøB“lôoºÇmFÉÔ[æôEÓ]Ù=úž,%nì!›ÇÓ yÂC€}PÄ · al!QYpc²:ñ'Ü\ÜÍøsÛŸ¸³xÆ­‡ƒô© 9*b«¡Å÷]Š£±Ð2ÊÉ¢v<´€«wÅôŽÐ2Î;)Kzk¡ÅC¢k© -«;Y0£)ÊËÜì\,_ÙÐû!JSZ=ŠÉ])Þ`ÌW2€#t°Ï‘pF|郢_B„‘f‹÷Å­œº ‚—ôØê„±ïðýè˜ß¸®/Iá<6" l­4à#>‰éã{n( ÚQ#^ÌJ3¤ŠÞÙkÅSÅÑÃÄ‚¥vCc•î6~ܹ3í¶¸y”nV„© “:øw»_ÑÞζÌ‹¢Ã¦`Hã —”¸ òñ¥qÔ-ÇúYË¢¾HÃÄ£‚¼¿vºýPæ,\®ÉÇØdò— ‡Å‚Ødç#ÂZ+ÝB„1î™s À!(ÈzB¤ëP"n¸Ü±‰Þ3]¥§S+RÑ׸¯ÆêÈBº¡ÜÅcB3Ž&Fp÷~c1â8œ¾ Äe üÑÚ¦®2Ø©GdPFËÿÚ•áÞÏ85=‘aô ²<(8#§ÄŒÁ h¼•ŠÎâíŒÂÙÒ °-“À¯nÃÓØ ûsGŽ ylKë l`\DŽùõàû.&'QîÉJyß+˜¯¹ Sß$¨¯e)ƒÔìX‘ãBá8}¯Äí3‡ß{~p¡í_„¤n¨ehÛcãðÕAe—œg" ª€¡ØŠ(ìkyAM¼ £î5ÛùNAU“š…QÇÒ»Ù£pHëN/B6R¼mò€û<÷®1åä-dôômÿ±€¿¨*»t€ãÌVø¡Übš¤¾!7y¡‡E ’ćðá)RïÑÝì?𕺠²KêgÖ­¦Ôõ‹H]8.õÛ¼ôx[ê U‡ýÇ]þ‚R—TöH]àÌG ¦®Kêº$q\ꜪëS¶~B¢!à/*uAe—Ô9ŽåšIì‚üEÄ.Hûa,æ‘ÓŽ}>?/ ÝŠ¹—çJ0> fTE¬oЭã$,®0Ïdv'i]3ß}ÁÖÑÇãï¾H w_$¸ùî‹‚½›³Þ}‘p?‘gsqt èïi”7¸DËTu*ÁoÐ÷l98y§ ‡°ù5[°«Û<‰xU‰Ì;7¿ ëë6ïÑÇ›úÄ t) Z–wêc3~ú†z¡Güô]ôˆ_–ÂTZÆ{ÆT§íÕéí„Úž¾Í/ðΡt–ÑŽøÍôàEÏ0ú†[íY¨kþÈObžO=…Q?| œwä–A,¤5ûÃCXZ;öc•ao :ÜÈõL#>à´0¾KÌBei3/’!Ñ&²žiÈÄ­Â,Ô+–ŸÄldHÔ ±ŽÜr#ˆ…t%Ò2CGšŽµô< ^2÷¹‘ïAY,8&L0•ÊÜneXy-s¯´ùð”DåÖ„È*ÊObVVêËó ¬#·Üˆ@*Œý"ÃÐód ]æG¡ù°žIœÆu}a¥¶™ ‰Íh“|XÏ$ âF0Dè0~³‘!Q_$Ä:rËm ÒD„1CFˆi G„ð«ÔndÓ=œF†1†r!µ™ ‰—¦MóÖ=ÄdHÔI†ŒŸÄ<7¨/O‘°ŽÜr[dH¤I†ŒÙSfy®¢n7w¸nKo»±¤ßl\3Q“mâ¶éË¥Giœ=‹$Ú•Û¦—“¶Ö˜3Q—mâ¶iÿR EÿL)ºä¶7„ë@²'Øé4co¸ÓNwO`Ð!yohÐjÕák¯ÕƼÇáhW¿7%Ò±yOú ·½éƒŽc{B­Nrö†Zíó÷„%ì KÚ?îqá:x6 UÏzð×Õ;RG›¿OhUã´(ŠI¸d‘åOûT¶Ýr"1 —,r¡ãÉ‘ÊIÛ‡·H9LÂ%‹Œáx ¡2·–©…IøÄ@«ò›­'«"~‘eÒÎa*é7wïøeP<7@óî°-Åή(¨kjçŽ_Í.CzY \¢ºE;åkµ©¾ŸÏÏ«ð……ã3Âz*ßç3Âó µû -‰xä -Z.7v}ÔeÏõõ˜ZbÖ¼à—ªåäg)ZŠÉ¥= Üò÷ ^¥™N[zƒÁ9Þö¿vSUž05æ›÷RâÔÓüÔzë±ìyhC£ý=´a0ÚýІÀ=á¡ ïÁq'KCOzeæ çh§à ÄzNãIœ~/è ÿsÐçn~‹=Ò¸zÑŽbi“Ôwc¬f‰¥„[+±”pë%–kRZ/±ÜAûPb©i_HOGü¾wüÿ«§?Øü^žª±îº—1¦hÝËH°õ{ ¹~/cŒø‚÷2@Õ³ K0³„¡ÖÛ׃g=*˜ùÖ£„t|ƒd·X¾^’†±ïD np²‚~ÍxŸ4uÆosÒw#$‹芼Uêz_ª¤ž 覼zêG t•ß;‡4;ž†éÛxfÎC—ÄÓ@ußæì[v½²âðùÛÆúÃ1\IS7¢‹Ø¢€õ9oñ9¿ÅòÓãzÈ,‘˜¬›ßiEð>zàšÃœuhÏx%1æXþµÍ¯ãÞ³×^{49g{GKåãA=ìü WýnP´!›ËÚ*¼€5WQÔI?lj܃¡x NåP.rí+ï½óÑ;o^ýè«o½qýö{o}ô‹+o\»öεÞù‡Ë´‡á4¦¯I'F‡×¢Þ3Þ?Ͱ§‹ ç¾á&ïqé?—o$ôc«¼y=õ H ¼VÙÊêò£ŽŽ[¡õR7®œî…Ô:¹ù VsyD-mûË %¸{hÊ Ì ³Q  Íû©‘·®ÿ˜yû/`6.ÿôÆÝ¿€6âÖ‹«1Ü–¿*3zÅùJ=dà›9?}ŸL@_5~sÆOï–IIÞá.ÖuAÃüŒÃÀ`Ts}—9ý€ÍÛâWlðQ”æ.¢”Ã÷²Œ¼ DMG^.$f KO¿ÒùÔ‘[²ø…ˆ0ˆŽÁ5|¨c!¬#'v>uŒ-áùxNtdßp"ˆ…°b}¸Áq2ó¾þ$ŔܤԈ÷àhœ  þ’Em·¢«¼ÙUÚ‹ðxޏr«0 õJ§å'1«+õE@¼eXùU˜…z¥ÓòC1üÖw½€ÄöØÇVD¬gLJľ^,Ö6#ñ¢ém뙄AÜZ˜@#ÊŒ?#ñ£éuë™ÄHüZ˜@cÉň5ß}¨b„v§×ˆˆõLâ8àp˜~‚©Tæ6#ñ¢ém뙄AÜZ˜žF”&FâGÓ'ê$"Ö3‰‘øµ0=i$?cÆ»_Åí!çVD¬gǧ…wîëUqm31/š>Ñ&±žIÄ­Â,Ô+–ŸÄlÄHÔID¬g#ñ«0 õJ§å‡b,xÑâ©2÷Å3¡=3N#ÆÒs#µ™‰—¦MS7zn$F¢Nbdü$æ¹A}¾0’=“‰‰‘¨“?ŒËsÈ9—QU5køšå-›"t­Å{‚š(·’mâ´¥cn|?—mb¶,¤¿j\"Q“mâ¶éC¥7ž‚¨É6qÛt-R»úLä¶/ÃÒá~OJ¢ò¿½9‰‹{B·Î›öo?öÄ8`ìrÚÑî :ï Ú#íñš:díK’u®¶'£TIüÞ„Rç4{2/öîͼtðß“¢èüpoŠ¢£äžX®©½±\‡“=AOgµFÂÕH´D8 )Ô1²jŒc;*ÕÁ8¬CÐ)Yn3¶6jÇ×2«ji/Y¦ã[ ºÞ1~¤–6õ’eÞº•ÉêmãGjiS/Y&x[)ŸÎ·?RK›ú鹑NL· jÕM&‚/×S¶Â¿ŒƒñA½Ig$·ôq׎šãð7€¢£‚’G0üTièú)ªs~~7¸æ~‡ôÇÎ9¯ ì‚™™ô±+c>m&Þu)G…óš¼á)CQ@?µ_ƒYÖ_ÍÇ'ŠÄów_Ó¸Oë·âë»êúvpYpÅùÔ»W}Ë"þÞ 8Y3œv÷¼ô/wµËƒDǺnñ{1¿lÝM;-w“[Ùaé¢ïú°ò¶î3þøúyü!B8qýVØÿˆ×/mܹ‡•Ú„^” -ë&k ¢ZG.#þ¤­#^Í–æ­\~鿉xÈTþHLDGƈé‡\ûÜ ÷XóÒ>¿q{pQ45@ñú‘+-\XYØ^>{=Ë>¬”~ä•­Œ¤»mjĉýDÙ7Z™ÆÐ v­Þ‚է뾓¡Eàݳµ(zß…4(ðzs÷-_d­˜oQ!AçǯC´ê©ø§:Ÿ«ûÀ¾F.ãþöK‰'”@„VWæoyߒׂ#dkSU0_MEq[QÌ6±vA@óº¶2Lß0ü—5ÖtÈ{¼¯,ù÷’›?ö9•õk¡©ë'ð!¼¨&tä‡8BRS»Ïßa{±òÖLóߣaÖfy«ÍK|—õ"µ†Âýš¿à³n¶oœãoŠXZ&~-c˜~eÖZÎÿ¤Çó›×îøcäÃŒ`5–²Õü©’£惚jA>}÷ ÿÑåOïžÿá㻟üÍÙßÎ8Yà8üù¬ŠtþñᄌËV>ôíßï~òo6oóŸw+ü<þ†mÃïÓÏ9¿Û¶=ü‚gãú¹]["†1ßOOè™Ï¬?µö«¦øxXïV)­U;áë `ªmö¨÷ø/+{7á×{A¨y¹ç­ë—Þ¿ô/S1Ç9|æ2m~Kœ~ ½môÓ†w†kºè‚ÿÛK7Ï>ºÿ?ÌÙ×endstream endobj 209 0 obj 6139 endobj 212 0 obj <> stream xÚå<ÛrÇqïøŠ}‰lÇÊjn»³Ëª<@$DÒ¢( 8"åY(˜„$$8¤‚V¹\þÚ‚lVLREØN”L>!=»;=ÓÝsÎY˜¢#ÇåòRÛèËLwO_ffª_n©jqá'ŸOÿ±{uëÝÅÖ;ï©JëjñÙ– ºêT寵³Õb¹õûJ©»ÃóÓ-þ±z]«®˜WÂãVލUSwJbî…LJáq [ûF`¿Ep¬®eÒûæ³uÓIÌÛÉ×]ã$RxÜè­©»N`¿Mqšºi@úAò¶V½œkC:S;+gÂã‚ÙûÚy9×;¨m‚n´©•‘ó¸þIÕZ·£Ó\…ÿ~¢ ~bººW.ù‰2mø÷÷áqF½@ÕÊ{Añux¼ ?àcxýðx/ÂãwÜ`}o³ýœ`6¾nm+0ŸŒ©1tmƒ:æYxü'Ò<op¨gT£àº­6Ìçk‚išÚh'0ÿXVžqLÔôß"ú0¶s|HEïkÓ ¦íø¯j':BÖwuSžÐŸpÀߤלÖZX'~ÍŸJ’–«šcXÛZP‰Ôõ+´ÙqT¯Ð‹†?|•óqª­}ß—ýòNö9¡‰©Öl²¬¡V›}ßyϲµãö–°øâçGG(ÕHÄœëúº×}Ù ^¢w>O>Lú¿'¶÷‡±ô|Çíǰ{øøÑ““û‡Ÿª{ÕâàóKÕ­“G7ŽžVWnØ®©®šjïæ%óñ'ÞôJ¿ÿAu÷‡•»û£ê‹ƒÇ ÿðá飓_V÷~~ð³£ã£Ó_æŠ ¢”­»IÔ¯v·/¿¿ÿÁ‡ß\ì\ÙßÛÙ½½³{ÉýºúÕî‡..©_3Ò¶s.§Q^ÙýÔÂäÔ½KÕõ(õíêúƒ“ëþYÆÌyyWë‰Wq:È”6®¶áöÉáÁõŸê{Õe˜ýã£ÇU€pëêf"¨ª÷ŽŒ40ÆOîŸV7–‡UAÍœvh£ÄÇÜ«öOŽŽ«›O–?;<Fi.ŒCÓ»Áç({¯úààá“ÏîŸ>9\;üòøðô´ºupÿ_Np.¾AÍ%.tðäñé£å.G7™ý÷ŽN–_œ^ª ¸ªÑy 2 &÷Hˆ×M£CPÌþÎÕ®é8ŠÌýSègx$•C&7€9J9ïû®n!ž1ä–è§iŽrÕMÎ ”d•¡ ï·BÜ.ÅékÝXŽó1Áµ­tSTÃÚÜÞX[;Õ¬Èí)ÖRa 2 ´OW C k­è)¦pN ›¶6„çˆþgšÛ!öRNšÅ3û­(©‚¯•ø-æ>š¬ (º_3´øúåÓ\ݪº‘£MµÑoSö,gµ¶mï‹—¢ì±à[g‚3šÓ¡òv]É9ÔÉ9Ùsš·ûÚv%ª™_Í8°À%¹Ë9­S^¡ÚÎ0"³¦ uÊf?êp][÷P˜½†±ÃJ3 ¨ÛB>U˜Ô7ÉÂîÚBaÌÃ8ÆxIWªMpÓf¡|o»Út­@?_iô»c‹â¥wk]÷dõ;ª³´6oøaƒï”œf2ÕS\08!ý?„X®m%‹§eÅZp8h89öWÉ=i_ðT„ë Ð Ÿ±H-Î×ÔìÏé"V^¿Nyˆ®¬Íg":5yÁAÎ$cp%Óö+ÆKóq_·Ælr%Yׇá?V×v¶o,®ío/ö·÷¯Þؾyyg$ã¹É(ˆA !¥˜lø_Ã+±»mj⣾hß`:Ò)góaw¨/ê ޹Q;!2{PgNxug±¿óÁ»;W®@Á<ê«Ú½þîåeM¹Ц²ç6 ™¡\¯ ßÊõMM;©oü0]†¿9£CGl '»@Õ-tŽ3Hé„]ˆAb”tD¡ÛòÝê™Ð¬*î¡nz2Ž÷×Sd4Ô-í°Ãç_v ã`¥AÝ”aï„våòéÉqÙ *­›N‹ § t„¤nÚšCÙ­L¿ÚBJIµ¤¼—+üŠ´Vìm_»uÃËû·vv÷wnïÜ\¬pt¨w”æê£¿Î³8ã>Óï1²[*Üù}Ø"Ó4I”ö«¨GBÇæZ+¨i… AÓöF ¥ Íí $XHí®«µÒ“í½HI—º=HmËrJ~•þê…K½ÊëNÎ)>Å Š^Êò84ò^ë¿p!­û°ÆK ÂTëÖ •í}Czý:3³Ðh‡æ´è|… ¥‡‚¦ñeôsª’WÑ æ-¬bÎÖ#“„ïUÝk©µç”Å¿‹Ñ(S’Þòg\~$W7ÐIõÎÏuŰP! hpÇ,üêÔ¥¡âî*m¦?›¸ J%ôÕ¾ÀMYNgK¦n \Ö#ØxVÐcrä§hš¯h‡úŒ4l9h_w!æ0f«V¯ZŸ‚ÚæusPTÔ¾4Ï‹4s¡Ð±’Éœ^ŽîC0 ¡ˆñù ©Ï¤èÊaÝ šHC¨<¥ˆU†Ó}í ê¡-¤a÷› V,ž]ž£ú,U^Þ¾µýîõ×?Ý¿²³½··³»Ø[QD‡}̆° ; ßÐ õ #ÕŠ­ k»‡þ†s<'…5 qÆBÑT&yI鯭—˜«v) £›¨}^x³Ð†pS¤~Q8AðÃa$G¿pT ¹•sÜU]g‡ƒ†Õ¶|Áë m½@ÿM1 †t×Vl%CþôF{wØ,–èбºVjãÇáaiñ×§ú6MI 'GüÔÇܺßYlõC3Ôª®Z ØޡƳ¶:Þ Gï02 è-Rd# ‘E|ÿbë3Nµ¬‰œo8.íZ€¢Zg‚ ÉA#[›3¶¾‡R¡c7Ì2ÊJÈ[HÂ8ár€x¼ ­£gÛIbDÖRzì¶6 çF;Á{¸G‘ìDA9Á°Fb1¾çvB9ÑNÈ7Ú)ŒŠAA††‚<’$F–섌ÑNâ¦9Œ²r‹Ã±-Æ 3;!óhvBa†Åñx13°“501h'Ê[e’(4)2 X¼Fdß3;%9“ŽßÉ 9`Px„‘1òÈ%12´Sbm@!nšÃ(+áDÞÈ&Æ “óÉ vJÂ#²NLraÁNáNUŸâ^x÷&‹{4>Qdj¸„vÂ÷ÜN('êùF+d€Qá(1"cä‘KbdÉNÈm@ nšå(+áDÞÈ&Æ 3;!óhvBaˆY'&¹°P¨~ØD_nŒW¡ö™Y$`¢@;…¬q£Ò{f§$Gðô+(h²Sb<Ù‰JbdKÉ8*·AYÑN‰÷d'*Œ. ̃zÏ¡­@a“ëh'*l¨#Æ„µE€|ÏàhTùγßÊ*…§²,U"7þŽÒ6æV€³¹ñ÷$mcFàa# KÈ¿£´qŒ;{¶˜ŽÅbâÒæUn"½o.=DU9¯ö jsòuѼì)Bìæð/2û¼ø/‚Äæ&rÓ¼ºWTF›+7Q”Ï«ÜDnß\{ˆ²r^í!²Óæì) £yÙSÄ×Íñ_¤ö¹-ƒ¬+çT¾²¯™[úÊúhN'ëó¹%œÌós*YgÎ-Ed¾š“Qe½äa÷3Ý”?S¶B@Þß­oø€HŠŽRdÜ{Ö¡¬oYD7šKB)2î=«±×Ý¢ŸÊ$%ç(2î=«×—¢#È%¡[_°ð5mïô ŸvtôªoØî½3ÜíȾîàÛŸÞŽôSzØö=ÇIûOwÄ®’éôÓÅ[th`ð“´7E ™½ƒ¿Ë¿»2Áñ¥îj­çãmÝ·b‚{bë°ÂÖîÄ)°©ºM“ õe“A|ï¬G4éLJi ´Ÿð|F—ÁÇ2xoøÉÈ ·uµµÍ‹|O¼(øŠ^¨Àq{†×äÿN—òUïÂEx1S ͶC3U Å‹Ÿr˜–}ÚÁçÑâ×B B³õo@ ¯7XE¾³Õ øjhèß­bÓZ1|vP0…¡×¦Vt¿ÝÔMÍ‚/L+œêè]ò\¨ï‡oª fåµÊbÄÐmÝtÝ_?Rr‰ßw×ýÎÔóf]÷µ‡iXF¸)‹-AmÓ¹¦4Žx‘ŽÓOÑ‘~>Ù§B?Ú€¾ÈKÜÑÏýØ}dvKôŒËT-sÆ ®"ÓÙúÿ Ý›VvÕæÿoº.@î¼ü]¥{cCsa¿ï1ó;[ o4d¾ö(#<:€Õ…ÑFo8½)ê2|¶îœ&LWšý±«u#Œ2^‚åÍŽw&î`†oÆÝ®Rߟ0§¯+¾åö†E­ Ñvæ5)Ae×_J×P8Îúk(»x …#‰\é Ç+^CáH®¡pô ×P8úœk(œF¶úºWÐêKEôòÛ¼²þ‡Ÿ•øÇr;Ý- '¶Ç£ x:HÓÇ[áÚ³/$€¾m#Ax¨“Œñ|_‡ vJ´@[›œm¸1i@q®¡œ@ÆBð¸ELÈ–ÀçŒÄv­ ØÖ$I€Œ…è ‰‘-@›3žö¡È»ÏäL[[ÈUÈÍU×_ö%ÕÁÊ ×â’ê w"É0ºÚÈ#rÕ¡¤¨:dUGaÄ( 1"cä‘KbdIuÈxRy÷™œø÷Èäb:5†èÛ£_‡÷¾ó™cSHÐt¤¡8nÀI\Æ÷ÜBIVToâ-@!AÛIZŽã¦%>I§L†JÜ£($è<ÉËqŽÉ“äÖJò¢¶÷Éàsi†ÃµD#„(å¡;*Š@• ¼Çá˜<Q&ÊC= ÷¨*ð¹´ Ãá€Z">F“®#'§pz¼^# ºŸhrœð³J]Š&øNl†²P×ÈíA ƒæQZ‰ÜŸ\§Ìl†ÜÑ2hå%œÈ=ñÉåqÊÌfÈ=Z„|. 1"ëÄ$jÕð§µx))Ü͵Mn¡d¤I63ª†2];Á÷ÜfI–äõ\‚DiÑf‰{´•Ç)—îQÏ%H”m–¸G›QyœrYà# ÀçÒâQ#²Ž6£ÂÖ£<ûf >–üÔRk ¾³õŽÌù; Û ¸Ûdžy,<“K›WB‹¢Ž•ŽÉ›yÌ«8e]2§vÒçO2só*!'!Ègn}!“O¤w ÁÌMÁ20ÏIrsÓ‡ *sŸLqóú-ÑlnOD38¯=‘åëœ"[´OsklYàÍ)Ce'0· •5МJMËs+5™¿çT²žœ[eÈÜ3'CÊZh^s.:ÆÍ½¬Ø9˜×ËÊFgN/&zí¹­˜læt+²aœÛ­ÈjyNA/{ª¹½¬ô棲í˜[ŒÊ*eN!%Kæìºz%ßšÞÉ6Ǻm¾Ã”É@,ñì=ëÌ×·ê|7&“<±È·÷¬k]߯Šm„\ú`‘qïYK·¾Ç=v. ½¯È8H#²¾3 h. ý®Èø‚õ´h›6Ý{sÎŒîß»ºuͬÝj׎G‡œFîV?‡`´Àl(RSw­dw ÷¬¯âNû0˜ŸÐïìÛ1­0êÂ'™áWk””óô7‰Úº e{i0ѯºÛZ—1?æ_ñû‚`v¹ï*ý¬ÛÖNKv!Ñúº…%ͱèDnÚSÂß5N¿rÒå#·™ü%gÐU¸Ç1ÿ¯/¾ÃU¹·ÒzŠÔÕÆÙ²®²³ vÌu÷7 W»¯¸j1°6}8§ e3Þ]з‹žH‘Þø4˜”[ÄïJCÜpõ©@0ïÒj.ü^žÓwŠŠ#8ó,Äô Ôö^ÿÝ\«þÉÍ;®Ò3ü±¥Wô·] ¿HɸÚ¼ ¢?)ª›"}ï.p ZÄ8³µøŒþ YYªîׯJ鯔¤Ü•AI¢–.£q´¿ü2Z¨ül(Á„à ·ðY€qëÝ‘â|o½Q s¦3†ÏÊ ÖK×áu(lôøéÀÎb룭n”,áéûáûH¿ÞÐ5T¬#^"¨‘þ‹­;ÕCàû¿æIŠZendstream endobj 213 0 obj 4771 endobj 216 0 obj <> stream xÚÝ\ëŽÇþ?Oqþd‹Òêºw IÙÙ³‰2òh,Y° Ak)¶啜‰‘Ð*7‘mX6ryÀݼÁ’}aÉêsúŒý#0 ·Ô¥d5‹E²Xœi7-ü÷øÝƒ¶ÿËÉ«¹ÛDß5¾ó›3xil€÷ÜÄ6oÞ?°­k’‰b$ÇH4åHj\@ÌÄezïàŠî F|c9ïl€Ð‰‘кRLܵü^ž <ëGãîCjŒ±bÄE[È›GHžšÊ“”gýHdÜC€Kb •Ò1±Öâ™2clrçJeÆÔXçJe²‘~â#U‰‰M0ÄgaÊœåMÊ$î¤L6ÒÏäÍ’G|Jy’²P&qŸTÅR)ë™ û¸Q™©m“)”‰#¾3…¢øªd¢*”™3LÀ”ʤ‘R™…¼Q 3÷IQ|U2Ë#eÎò&e2y’rVæÌ}TH¥´I™Äš”É„7I¦ƒr&É µ‡Â™ð‘^õI éÀÜù’ù­Ø$‰læ<-éÕN²2ñžÙ0iœ°X.âMËÅFz¥OÒfI#6¥4AX,ñž‹ ¤B&Æ3R”Ùà †¿ ± ßt)àò%˜¼Ç‘cNÅ Š‘³¼àšT¬ÙôвÚzܜڙŠú½p’ÃÄô{é!·F5iS³ÑNÌÄë,k—ïÈÜÈ™þ>p¯“ åÎ4k¦äbéÞgK'ÄÖcUtV¡A†¡"_Ð#ÄguSÞSzêÂ_¨‘y«}¼Úý+Ü“žÀZ5L C4å@2µb²6ÑÑQvU. Ò±µ¹€D«Â¥ÊXÖ†KíJ×x{ÓWz{¡…™hÊjléÖäŒ:gY“VéÌvmZ¥ÃúšÌC'k3šV„N­ 42- Ñ”ÆÔØÒQæ>E°1BÎQˆÊÜ~{²¯˜¤ÉFªŒs‰ïöLXDJIdUÆ9‰¬p{š¨ÒôBÒlUÆ9ñ”fkŠ£2ØRÎd5®ø>­õ„/ß}ÒïÌtÔælΪbÖgSrC?ý >ÞÇ«ðÿ»/Ÿ\¼ÚmŒÙœâ”0®›Í˜#xXöØmNϾ{§mÛô½Ó_Ä´Äw t‡ø8fp“šÎfl¨yÞig8›Öë þy˜ Ø„ý”fy“ÁCnœ³ ~?Óð䇮[ÀcÿQøx]Óä˧§}‚7J¤msc+ŠÈ dB“êú?ÆÇ›4•~¯šV,³õ®éÚPÑ·qøçÕ~vL&Ø”³Zêë }ÓF…¹Ešäè›´âçé¿:Ω·ƒžò\uy߸ÌrõéuØl;äRM>¶ƒ¯·¡«ZµÖ>uM›½¢Ñkí;˜œ5 (ÃJEÍî5ZòWgíâã?™Š³ò Aý|¸éÚÔäVËù>ßDôµÉ°µu,Á¥:’iÁ9È*‚¯å ¦Àh‚i¼Ñ4w¾ËQ¡‰]§P·9l!¸…OêçÀ÷grn¹fø¸À7)ø §uõÞ_áã"ƒ»¶ÉNßøàþ`ëÖuUl}î®Í^ök Ô%g·Ø/ø¾MB 9ƒP7Fs³jŠÛÛ†áÏÖÛÝŽã¶pIðw“F\*èŠqkF|¨®˜–[Å÷úÒXË1±1Aã>ÃÇߤ6½Âý_ðØ5ÁÄEí|…ÏéñW|üCE±P¡´ÙK|J¤_âã/%ý´†±?­á­Ú Ð7¸†ôïÏ×Êzo‹ñrM“ÀÅŠÜþÏê÷%×xÿÝ¿¯ gFþ6ò÷V~G¬í½¾ƒËè­èϽñ’=ýþáU{‚,²_²§7«úæ oPßß°^Ô<‡õéñ í®Y:g¹xzæ=ý&b´Ì³¾Š’S% <¡dùü§ëšùãl—ó ¤î¾ÓR¹/„([½ÁÝ $.*P¯õ—x†é!kÈ›ƒN‡„ Ã<¼lb;ä”…%õ+ý—~]ø”2øpW¡ ›ˆ“íðÓä.+º?QàŽ2P“­‚?e 8/{¯AŸÓVë?#ãzA-O˜IHf_pêÏ(¬|1óæÉ| ɼVPoç/x"ß6p\ß"‘<…½@²?­2g™Ñ+ù”h˜Ÿq°•uÿ„ÐÏHÌWÜ]±OpXq² RYBÞ™Àú:²øbFc]Ÿ‰Jšg<* çqñªÓ`ß7¸ —_»~t÷èÊÉÝË'‡—Oo_?¼ûòñå“+w~~õxÊÔÄÁÉã2ç4›/yÒïà åÍ3¾’_rGø©V1ÎÀ,Ëfæçàtè וðyŸÍ:ò..ûÏ|G¯‚„-‚ù?Æó+X:Éâ\6à”ïì·}Bÿ:q4ÿZ &]ÅB’m’ËÅ8¡*ЖâMHYÁUñÆÍSyNtíh礇µp|—8M€C“UÀ"*VÊ7m¯hë5¦Î˜Ï ÃzfwAˆ Ö¢æy›'ëO_:¬E»ó´2jUݹ#Ï—¾2Ç;ßc(Xçô7ÿŒfzL'v,Ñ€e€…`Épº’ 0›.`#_‡¶SŒ¤Æ´3M9>ºo2ç÷¾¨*èÎúÇx»gÛ.³‘ Ž!Òæ‘‰»–ò$åY?b÷±ËЉ4BL¬µøñ9xˆ6Í:„÷.ØR‡ÅÈ8㑦Ä@"ÖÚY‡ôÎtH²H‡Ä›tXŒŒS&i3fâ>ó)åIÊB‡Ä}Ò@’4BL¬g&¥0ÔaÄP–¨U!@ZmZ¦±ÊÈ@Sè0Úq*£éédiÞôÝ•‘I鸓™–Aùê¤M:$Ö¤C&,Ï»àLíBý^ú¨põ.­|ÑSH{Í¥yÜä;IÛ¹‡äJærᥱHikÝÞk6ªv‘k·ª6˜5F­ÝÉZw§÷Ý× òZ× mtÍ6Ò¬¸ø›­{Ú3d¡4PúîíÎ\ 0I“"«Œsn»ËS‘¦”D*¬2ÞÓ1(¼ëÅuvX“iC—ë•mס©ÚZÙ†cgoÌ‚†g+x_׿ PµleÎÕà ÚYEÃSéìá(•´ø;Õõ%#‰ºQ-Ôïø”ÖÃY7í÷)ò]<½ š „Dz’/UËý´ Îöe¦²J~ž‚…·¶ ¨HÍ/Päõ2#ÙÀíú ¢®úÔ+±„“•åÈ+‹ÎqyíRÅVV¤£¬ô*#áß:”è«Õ0xpÿÒæG8 0ÖÙ8þ âëœMçø'›k¯ýnËu˜×a¯ÙŠXÞ?ßb×a±¿À>Y¼Î.°Ú$î¥J2ƒÜWq­” ¤IYâî⌚×äñ~ôi~6˜µZDÉÔ5©U|x:µ"ø=]ôà‡•jƒ,£B$1}Bô&ûÚޢÅâ·Æ`óΨéõÛñ‡Î]ÙåXÍ‹<öÑ€o\“uà÷¢8×-„cVÊQ1Ó>5ç*Õ×QX€n½FÎÞ¤§yÎ[G¸'v`ÎpD,úïùÏ«,pÑÃgp‰AÁϱ?Í:[Yºí×µÎvà‡býã¾¢Ù>¿òÉÂ'lûâÊ}ø?kW,²Ëp¦® ÷ÐHï|V|tˆöàÇmÅÅþ°í[ÞOSñî+H‰oˆ÷>|øðƒ_¾'’[.`saÖ3œ¯ŸÓ£¸ç¥,¬ï[îçÒÊlÛÆ…!Ìœzôø·›wî}x￾ÿð£ßÊ| oåF^_?9~åðÆã“Kæ÷›O.¿òÓ»×Žßøùéá•»7Onž\ò8~||z©ý½`;wžÔ•“·|Lûö¥ÍÑ4‡ ›£ûîÿ¸fHÿ"9õe‘ÓåÇîÝ˼½yùѽÇ÷7ø.á)|³Ù\}øàýûÉ+¿zòÑ£³adsi3†{kÛvGl–­*ØzÙ¦9ÑhUÀK®/cIàu®Àü+¸7DŠéŒÂˆKÛAªÒ\‚…8ëÈÝÍ%Þ6ìÓ\¢)Ö5—HºÍ%^m.‘ çäMž³s—Èê ¶;E½w7 k_ÑH¥›¢d '×e‰ût“˜ÐŸú”†ºIЕ¦ú$÷ê&ÁÖ» •Çì(óuäR7 æ$IÓ9ºIÚ©ùºÝ$%—µÝ$’æ¼Ý$˲«Ý$þuºIª¢ÿÆ#sjîOüL·—xH㺤ç2zŸñ¤«l¥½¤8(®ì1± !Ù=&´£ÇD«=&¤{LààWÀ 5… q-wƘZW&6‡3}¼‚肦«Ã „þšZ×D*Øby›ƒbŸSh­kó; ¯uÀ¹ßÄ_cá„›*s]#pÆ þfyyA¡xhA²\üÄ?¶¨´ý1N÷”åÈp»9Ñ”#®éœ§‹Þù½¼KeM7§3ïéÖ°îgióÈÄ]Ë/ï6gyÓMæÌ}¼fãÉÒ1±ÖâÇko g~47Òa_èJ#ãŒGޱ=fæ2¼3’,Ò!ñ&#ã”IZ‰±4#Çä3’<Ò!qŸ4ÄP‡$­@Xšeâ'&¶íÜ:€ï+ïËË‘Q#M‰1° 憃ùédÑ·oÒO12j‚¤Í˜‰û̧”') ÷ICluHÒ1±ž™”Âú¨Ñ‚íÎí7˜>´ÓXed )tØåq*£éédiÞôÝ•‘I鸓™Þ²óÔ!I›tH¬I‡LXž=É™òdú½p£ÂÕ»ô‹ÞVîù\ºˆ‘›|'i;ýÜ ¹Ü<#7ùNÒvîPi'¹4+iŠRÚÚ¡ÝÔWªƒØZgª·ô·£þZÇ£ÍÍÕÎqmÔžxM°Ðazm°Ð^kcÕ!m­cÕ;|Òî¿hô™}ÃäqhÓ@™=lO'Ô“4-\•qN"Ænº*×)%Ñ’Uç$"ÑöФ2‚R-V•ñž\Å͵mRØbàâŽ6) ZÓ&%iêmRµ¦MJÒTÛ¤”øj›”DÕÛ¤v|ÊØ&µ×§ŒmR’¦Ú&%AÛÛ¤ð$û²5ihÚYzÃ:OhS…ÁÐ+ÔŸäÿ©kÓz/}[¢Ä·Š«ùi!¼iÀ¿ÆB(ëÔ–h¿•«Á¿uø™ßjE€%ù´GE]R¬«b›èÀ¬¢~±mu¾ñmP4•ÛÚúΉܿm­mœÑZ©ôÚ„ÐØ˜r±mÍõ?>,ákÛÖLãc¬,ÖŠ^‡~ÝÕhÚÖ\£Z(Ù¶fšlôj.õ»ú××nd!×IzÎךãÁ*:WŸåŽÖÛb‰nlÍyø»Ë9Þ7–ÁŸ|¡1L—a²¹öòâÞÄ>žhÂ{SRì·7%õŠnQøvp3’°r¥AWù¤½7(ÞŸC |j}¥Triƒ ô à+7($/ø;ÍôŠ­é+íú!¨ÐÖ7hÄ·‘xþ{$Ü]«@‹4׿^/¤Ç_hõœoƒÈ“­ÏrÇí/U;»vƒ–ðm­s) ð¾­sxÜÙnEïœD.6ÏIàŽî9 × ØSFêì‹ ¹I$¿rÁSùr~¾Àß}Ú’(Ñ÷†?ØÚ)ÐKòíÜÙÄ;ßb†9éIUZß:üUB ¸Øú©¬Õ3¼µ³wÏ.Ø$´‡7çlyë8ÒK^µŽ·Üx¯‘•Ž·Œ'Õ¨{u¼á ºVéx m¿%rÉÇ®ïÖ–ðu‘Ð çÊÚZíèqÃöѰð9»{Ü -ð^KÝ» +!ô«vóE=ryokvª·Ö†‘ØpEÏmhµ4Û„¨fEÚdó™Áæë±cn>ëÆæ³+G×®mÌåµÝg9¯¯^;>¹}÷ÊáÍ£WÏÑ€Ö…y^ÛûϦI.5 %OœVôŸEGè­Ýg}À4`ÅcþYþÈ’­°°K lø[gÆ©ê/v…Ç|·ÉŽwìÙºäáô„?©°ÀiiWzLOmÖdÃû)ÿnâ·0ß|‘ÁaÞoÊ_?øï>38ƒgÊ};‹,iû:ä€+†t¢ïàÖæàûÿ”¡ endstream endobj 217 0 obj 4901 endobj 221 0 obj <> stream xÚ­XMo]5Ýß_qW@7ƒ=þÞ¢Ò„©4y%)ŠØ Ñ Q$ØðéGDšDI(âÂŒý^}ïxüòhUuó^ŽÇ3ž™sÆUãâçA‹ohÉ~z²úawkød1||OÚŽ‹o]¾Õ£ñc°¢7ãâÙðÑ¡RÊÜY|Wo”Ó³Ë0 œ2óÕãgf{Žñ’Cy4ÇIšñy9˜ã’‚ˆN÷êò`ŽÖ*AL2„ÃC†B :ryù!McbùeFªq‹þ>¡ŒZÏ3ÕЃ¢íÕÕÎßórY—çy9ËËu^Nóò'w؃Ís{úo$AK›¯Ê9 NÙNÑ øE^Îóòƒ Î{/¾_2d4SЯjàu‘‘"*ªA'vO÷tUý›nñWz ÞÈË(÷pTì0xöÙ¢€—¤œ3dJ bÈbó¸.'õæOª¿gw:·hœ†h]§XÐ®ŠÆÏ?_-Ë®e….%xò6z;Ù¼Óp‚ŽA€îæå!khª,ç¤5¥Mþ÷ƒ¦±C@Ýl“4X+pò²S<ÈË}VY:‚J2*Þ²À; Úæ½Bå¡´=æ¢À'éâYÐNZºWÎ\Ý’ÝÈ>jJ~º5¦hìõ™¢=tS´ðµžÏÜG .ðwna`vÖµ0rÉ7ðN [1|ÿΤàMêdqM ç”üõ.}ì²þ¸j8±66ÄZ`X³Çø¦tÛ>æ X8á¾è£è #ÐŽõ¹Ч…lWƒÕ‘»Âm Æ›cË"­: G¼ˆ(-oRUrÚâÎp¾Hlgwf@VŠTR¡ÌWÔœ¦ÚàƒÜ&ttãÆô‘›oHcìí± 3·†dø‘›8†£7 # zí,Òà^W«Ç5úSÉ?HÌžÚÿɸ7M žI7ßÒj•<¸hççÊ››+=eW–+?jObí¸ÁùŠø´ ÇüIEMÙI'?Ž’€zÃi¤½¡Sj+µS  4'$p–=;*ÝÝÑBGE¿ŸÑ†og묰Ð/}ÉÐT)Þ¦vÎ]¡æê> stream xÚ­XYoÛF~ׯØGuè=x­ßT‰¶…H–BÑNŒX›–ÕJ”#Q Œ¤ (Š¢/mÑ¢¿µ³<–ך¶›ØÐPCÍõͱË%FÞÇFÞ5ñ¿]d_ÜÓη^çèÄF„ ï¶C’»qYº©™:CÞºÓõ1ÆÖ÷ƒü`ªéVSh ˆ#Ȥ"N,ͰxCü¬"DMM›>¦zEŽ0]%gTät¬™iÈ™2Щ ³f´Ö˜"j´×0³B¯¥Í‘ o+:ÜÔ8f 7Ñ)KRB5¦¤!Š5n6³ú.q,ãx'ãp¼VgP ­á;ä[°6\VbC¾ì*ÏY.^æYò;·4Ë(Ø»ÎmMe <”ªdÒ0lh›*oÑÂ…à¹Uج»>Dk®Z@¼U‚PáA?—/ ØZ!SO¹‚ÂCAšÌ Tx€P¸©Q©_ø˜¥Ùi’,ZŒ—­2©d;3SÏYð9[Ž^Z¯X̲[0"ni>;·—^¶ßÒ=ÕT–Š”7JvQk8KÙ[U²Ww󜆬Uç©~©È³:¦žÈ' [ïbá¥:)ëÆ¤äµ­´a[_ÖG±ä¤€¢´úüªÏŠðÑ)|ù¶ÃË»±Y’jhÔ¶Ô‹áDô!óèšWìX¤¡dJÑ™$ÉZ|QÝ—ÄJo6´og‚œV·ÛŽÚ×YÓ¸ajL¬á5ñ«Š !v¼šPaîè„©S‰- $Ñøäöú¯çãÉÅ¹ç æ3ǽtÜCã§Š£TË´-¹T }V ˜–¦çß¼zõ ½À¸ni¦4Žàïó|Žú›(ÞnVè|¿>Fäy÷á1 O‡^otˆ&ûø~gwUF™þÔèÈ€~°8FÑ2FÛ0Š—·Ëë ^n"4Z.îbäw/†ÿ]«}¸S›¤ÐÖ™ÉIäw‰p4¹½õ»Ø?P‰c[fúX´€5뻎ç<Ë€ÅdVOsÇö3lÓÍÇp‹Üp±_ñf+=¥÷Ç››G`¶-k;Xî‚ïWáM n´ùèw)|,£ÅÎï2¸wi󻺺aÚE7¨¡³ÿC ½·7Î܉J_·eŸ ÂUðp<^FZ µ.ðnƒèf³F)Pb ]x 1€c8áTæ™-;4¡)ŽôD²$4Mœ2¦º] X†y#g³0ÚA-«CpÒ;?Dý ›íƒ:U˜ËÞ›90yCï*ËÕìa‡ktD;t«ø-£1 ›­Ò–ιì¸ÉI· ÂÅ6¸Éûä$Xæ©SéÃs1k&ÇÀsÆSÇíy®ó@Ýä²ÃÔásnƒx¿ Ÿ‰ÓಽrœO c\V\LvùtòÖq糋éttõ4Ø]ìVh÷I§ïö÷÷«‡gbƒ —I 1–=P F`%°¤f€ñ¡¸¢Þ6 viÇŠ¸ÇrÕ™n7£eÅh0b0%§šß½çÌz&Œ‚*Ü©ÌÁ MoÛ ˜‹M¦mƒú4u'}g6›¸‡Dµ[1†ey^ž •Aqh+2q ¿´"ŤT ……§KöB¤T…”šDÄ×):\!J[¡R8×Û­PáPœ/s­HÇÎxâ^ÍÎå°ï¨ëJ8-qÐ×ÁKl*K1ŽÇˆôZ“–2®Щ\q^˜)SªØp¾.a² \Ö—³ö‡J‹É™nïãòâš÷è„ÔÅÓ>65Û$¥÷CéC¸‰¸’+A|_ÐËúó>‡œ†>!Bø»²°ÎtM7‘jfT^Y‰ë¯‚ü#ÈŸ‚ü+Èß‚ü’üZ1ð!°Ç,ÁW_†é\×(åM5b‰ëÏ‚ü%Éï‚ü!ÈoIdeK†ÎÅi®jˆˆC™g/ÞtÞ'ï ×@-NÅ Ü‹#`™ÁÉI/•+ݪˆæúw·(»ÿ©pÉ_endstream endobj 227 0 obj 1457 endobj 230 0 obj <> stream xÚUKOÛ@¾ûWøØª°Ù÷ãØ'  yrh¨ÂTí¥Êï¬ã]ïz7! Äâ1ß|ßÌìÌ—~þ<¸y˜ KÎ b¬¬áQјB—O‘IÛ†9xdcûeùXÜ÷\j°"¥àqÛŠvÖ6ªãìKZ È@Œö(bÄ¢K!~­CЈ p βð*mk›Füòð2àh=E¤SÚ¸íÃöv”àHC]ë¶¾JÈ®0aÕZd''RARδZø=Ð/JWrwë=óà jm¦b-±{n‰{¦ÓÙ]¯­CRG5*ûU¶'›¯Õ[}\ï›}×¶ƒúνpÁ:‡Ð–:µ=U‰g®NfεZØË{{»?ÔˆO%Gjm©Ã‡6W©e’öCLSge£~ÛÞXþµÇw8ÆðûP|[ƒ‘. )—6$Û1¤l»K¤à–uñéc¬>/vê:Á íQÙc¢Ašš}bÖHà”òSáCLóND8 íEI‚“>Ι=I°D@ße‰£•Q­Ð¹çœØcùÀ´ÁŸyã! G"ƒ¤!ˆb†(I«zÓû8n|ƒÁ½›¦ CÛ«L1 ³GM|‘*ˆàTõ* Œ4§ hí ÃaÒ±àùLNí1nƒj:!ÝpÕ2Þ„»g‡™èCàÌípD#aÂ:)š]E!yÈ+{D1„i‚Ùy~”R^é‘ 4]²Š' Ìdâ½îÊ„@RåµNSrRš~8Œ ã ¨£ŒX¾’X"ƒeãQþ‹'«H£n_ŽË—ùדóÍÅtu¹¬†›E5¿®æGâõe6]WóÍb5›MnèkŽJ)D÷j …¸ v1®&ÕÉŠAÇɽbD!ý~±lfÂh_¤¬˜PºK}¯ØÉt:9»o†ÕõÙÉŽÜ„Ð]²rÐ4ò#rùìà{«÷Éqø®àȱœ‡°·M¸0>ýêùGùë~—^»mã·I¥°„˜pcBì„“k †vUünZ §2Ôî,ÛO|hàfYmqÁ«êü‹uù ¼ÿÜ“È endstream endobj 231 0 obj 831 endobj 234 0 obj <> stream xÚ­X[oâF~çWÌ#Q³“¹x|É'A rS-EnâZ0)˜]E»ýUUU}i«Vý­=ãËØƒ’m7Q>æÜ¾s™K"ð»š6Hú0:mx.¢ÃG xÆL¤¬í¢yƒºD>h¼Ç q§ò{ÏÁŽ(ÙÇÆÃ–Êx*¿T&…p±åè¼ÃJ’÷œÒæ¶Ké8Ä\…À¡¶‰(!è/À@®Pp1R °PðÊKŽ¢´šÃÐ_åF f• Í’¿Pì!«Ž#,ìB^y~a—‰)é-—,Ý Ž ¨‚•¾ÈçtÂvRÊ”Ußb_] œç ÅsÃê93¼Å~vç+SXÔMk9¨dv®evË­9W/õu­¼/öÝö°½ªïŠE°…B•·Ý:¯ H/úÌ-j3W´Zµ—÷öööPWœ((&£’/"-䫼åÔy I½t3 £›×ÑvYoL>Hräþ¦¯'£¨$E’ìŠòî³lì@N&‹F3 „8“ï”% Ü»5¡Ž$¾$Mœ:Øe^MüLb6¤n3 ÌÒä8ÅܵLrB“³ Á­ÉÙ*С$ãz´tž!=ZÇÃÌujBo•Íž$WšÌ+¼¦3Juª’Œ2, ’Lb3ZÏêuêXÅq­â8:¡d«ÖÌr±0Àåòó$OójsLIÝë;]ÈÅ®ÅjBW*1º8Ì:–É™$§yPi'Ô×8¢¯…»§‡{ÚVP°ÙxhCáUóD]ž®VL`X+Ìõ Å„Õdv–£&ZS²•èX‘´M.ô‘ñ0ávMûªÌ›>ÛŽÙ×Yݸ°1·½šø&dìp«&Tš;:áæT{ÄN5>ŽZí··ýÁÅùÄïÜŽýÑ¥?:¤?jŽ2-Û…ʵÐ'“€í`^|õæÍôÆ-V Â8‚ŸO··¨½Œ“ÕrŽÎ7‹cDÑäù):FîiwÒê¢Á&yÚ$ù[“Qè@;7Úó; NÑEŠ“ÙÃì.LfËõfÓÇÍ‹n'8@—á|­Í&4onrM ‚& LâÄQ™Þ‹•°Æí‘?ñ_Æ%`› ¹ÕSÿÜuÛ9¶áòC´B£hº™‡Ér¥L^wr“çjü¼N¢zã5zŒÂyòˆfñ½†åÊhËò<ÕqƒïÓn?êDÓUx_ôÉI8+RgÒ—[ö^`j &~èZ“‹‘_h²i{ªÁÌøàï)Z…Éf½¦ðTw0_Æ=Up30ÕäÃÁ•?º_ ‡½›JgÁæâì…ö”6úzóô4~%68»ÿ§„„¨(‘vã÷°XQsÀäP~¢Ö* ×YÃʸ ¹GÔ¢3\-{³0NP§ÇmN)Ÿ÷¯ß9Ü&Vï&Aˆ¥;“98;ò}û¤ÜcöíO‡£AÛ;6+Ή*ÏJ#ª8Š;øf/TB+µ00¸ñ±Ï„ÊLP™MÕD|¨LPU…*Û •Á•ÃÙ •Òr‹Ý µï÷£›ÛŽÙmûæÊRUÎ8_.u™ªD§Ûï#ÚÚ‹—Ú¬’ðüê°uŠ“‡V8Â9Ô®\²³$œÓå'½‘$$ýfûØJåa¼¦O©ÖNÇ·°e#&ÿ[ ´K¡üüE’¿%ùC’$ùK’ŸÓo5CÇØ.KeðúuÓò,ÌàîZS£ŽüüI’?ùM’ß%ù5¬jIXž¼³ë†èµB —˜wÒKͨã1yo÷ò¢_eHzaÉä*¯4ÑBÿ±q…b°û/ŽìÞendstream endobj 235 0 obj 1511 endobj 238 0 obj <> stream xÚ•VÛN1}߯ðc«‚ñýÂ% D’†Ð€„¡rSÅ‚Joªhÿ½ãÍÚ»^›ˆpv6ÇçÌŒgf— Ÿ§Û‚ÔÓýÂÄ%Áœ£ ®1“µ) º/¨bX™Ø¶ÜÃ#›¸ßµÅZ¶æ]qÓÛRÍ1íPJA°Ð±­Y+ál«[ξ¤Ó€45Øš¦+"Ûâ@Ðlè æÒ<ƒ·;Q•&Š–µ #¾q™ð´"ÒAî§³¼XžŽ–ÈkÕäWKÕ&¦5œZƒlå$Ǻ”7yK%ô“ҦܟzÏ\û€›k¬yCì¯âžéu^Î×rC•RG9èdö>ÊlO6Ÿ«×ê:9ÞWë®ßlkÕ¿áõº¶2©œJÜsUÒs¾Ôºµ¼²¶ûMÝ ¡äHí=õø®-tjG‘¤õÓTY™õÛ¨ïIJ6f¿Ýò–}ø¿->Ί­=ƒ(E3ç’«Ššê k8€YU¼» „è÷³¯-D€ºI0·”nwÑÖbÃl‚>èb(1X’”ò‚0á(Ç܈NF8åÅh‚SÁω[Ng©„ºË8{«(fF' ÃÀyä–y´º•Jžì™Ö{"¤Xf¬ b„cFÓ¬žÕÂÁ³àÇÖ%½“fÜ•½Î$“r÷½Wû© ‰)IU?E è&#Xš‡ÄÄpèt"E>’·ì7NÕ•N¸rO—{‡ÛèAàÍesD-a»y¢JÖ³ŠAðWö<¨æ˜°óâq„VJyU@ž„¥®’Ó¸(&\%»çmÚâ†Xé¼ÖAJÎaB*›ÀÏ#€Vá"µt[{<ŸI¢°%ªÞ>lnn¢çéÎîáb4>=ž•ƒÅI9ý\N7è¿çQ9Oσòóp·Ü`ÿâ.¬É”ÑP“ Ù_ 4|øuýðãñé^=¡ãŸÕ6"îí<]_~ßFtÍ.o·QŽQkÌÆÁp4Bl§åËá¥Æ"x@!ªµâŒçåtqr:™ƒã¢›UbÒLÞ.–Í­Ô&d"/&Múb£ñàô¨ÌG&¡èÔJ1x›·‹e#ðT"«Ä ¶–Øîx|4<Þ÷EšMH»ºD·k–HO.¼l¬,AÈšEÒ“ã99îÞVÉqEBøåÃz¼yI¯yTÅcƃ Î¥Ÿ1ô¬^¦ÿ§â[ý4¨`Õ–¹oEý~Ô5H=闸έê÷ßsô¼ÿÄ8qendstream endobj 239 0 obj 925 endobj 242 0 obj <> stream xÚ­XYoã6~÷¯à£ƒf¢(å͵•ÄX;öúÈ ÔDqÜÚrêcÁ¶ (Š¢/mÑ¢¿µC”h1N¶Ý¡<ò73üæà‚ü®¦5’|œÖ|QÁ0çhŸ1‰(<4¯Q`×3eŸçpC&ê{_b) ñ¡v¿£²™bZ2)„‡iÊ’.”ìËÂæ®KåH 0O3ÔÇ.óÈJs¡¹…\.±Ð^2…ÕŒ†ùxh7›Õ& ?HýBvÒiv¤p°q]dñ•Â-SÊ[†,Ü Že‰T.*_äS*a7(EÈó¬ïˆ¯NP&sÐâ™aý95¼#æ~žWª°¨š6bPŠì܈ìŽ[{¬^ªëJz_¬»Ýf{UÝå/òÉæ eÙõª²6 ¼˜=·¨ô\^jåZÞ[Û»M]r¢©ØŒ*9ŸiŽ/ËŽ¬Ê“j=˜fV7¯o£ÝI¤µ1ú †[NáoZûrT;:LR4RSRCQV}Ž‹%$`´¨Õ'„y0úVC(aàÞ«€ZjÔÐ3àTbùø™b.¤jsB˜cà8ÅÜsl8aà(0F+8WO´¯†au¶*Ï2s¶ÒÇÌ“Ð[m³£†KCú• ^Ñ$:e$£P$3@ŒbF«Q½Jëy\éyP²“kæxPøÒLÊÕó$™ŸáÕ嘒ª×w&ÈÞÃ* K½N„cgr¦†ÓlRI%T׸`d®…Ïw÷­ Óö0šÂ/ljzö‰T™*s©îˆÏC• ª³Pe{©2¸sȽT)-öؽT»A·7¸¾iíf`Ï,õYéó9èRéL´ÚÝ.¢’=›‚ËJÏ.;ç8ul…Cœ¤néÚž&᤮žôZ _«áb÷ÜJÕi¼¢N©U;ÜÁŽ‹˜úw0n…êù‹þVÃjøG ©áçä[Ãäæõœ¥bîæ}ÓñÌàòZQ£R=RßzøM ¿«á×dfeKÂñÕ¥Ý4D¯’@)ÜbÞÕ¾On5 ¥ÏÔÅÜ«›~Y É%Å•^Ð\ÿ¡v‰b°û/¤~Ý÷endstream endobj 243 0 obj 1517 endobj 246 0 obj <> stream xÚ­W[O9~Ÿ_áÇ]m0¾_x£d€¨„К²BŠªmKµêP•n»Z•þ÷=žÌØã±3 ¨D8s†Ïçów.¶!ˆÀçþ¶ õÃò¤0Qư⨂gÌdmƒ>TÁ{Û–·ðÈæîïÚb-ƒù±øÐ›RÍ1í¸”‚`¡c[³@ál«ƒÏ>¥ãšlW ©ÅŠÈ !~š €Á\:@롵;*7Ž{f˳;^Û Uê:ŠA'²Ÿ¢Èöhó±z¬®“ô>ZwýfUwí‹v±í„®­Lj{Ž%î¹*é¹¶ÔºµÏܰ޿@·RÉ“9ËzN„´Ë ’uAŒpÌhÕ75±_Ç¿ŽýcJz™fœ`™‘qC(wßÇõú"V!1%)ë«$ 6‚% µL ‡N'R䕜ºá¤YT] éW®âpwïp­¹mލ%l7NTÉz¯b teóA5Ç„%˜éð­”úUy釺J®âN ˜p•Ì^‡°Å !±Òy®ÓÔ9‡RÙ~„Û†E îöy>’DaKT=ý±··‡~,^næ‹«óU9Ý\–Ë×år¢þ˜—óÅòz3-_ÏŽÊ ÿwaíL 5Ù8{@ðó°Ù ÙÝ÷÷wÿ|¾ÿÍÞÝ£óoÕ"÷ïß¿ýz€è­ÞÞ œG­1kµ^ùbP¯4¦ñ@AùGÆ- u5ž,«ŒkJ0K§”/«a¶£Åâlv~ÒViV‡³TòQ2rÏëÑeå1K‡[i:²{tÙ=–IÚéÁ€Ó ÿ)t"KgÛ`¥PËFVJ.»£R͆kÅ] åsèT–Ž3«‡òîúüa—¿æâ¢pè3¨%.Û—ºËýÓá.ôªøRß*µeîúcEýßB× õ½g‹ë¼Š íüÅÝßÿ·CÓáendstream endobj 247 0 obj 1031 endobj 250 0 obj <> stream xÚ­X[oâF~çWÌ#Q³Î\<;oœ-ÖÀ&QQ#7q-˜Ì®¢mÿ@UUU_ÚªUkÏø2öà IÚ Ê±9·ï\f<`„᳞5pzœ6<Ù̲Z­E¹ä-ÄÅò¦Êz,—­²D~ë KpÅÝ7îtù%°D~WXãܵl¡±‚*ã’õ„2·ãKZ‡¨!W…-ˆg9˜—ë@?W¨¸ãR °Pð•ø•—@i5‡ ?Ê(Ì*š$?P‘ì&«ˆà¶åBB—ybwÊ´”Œô–K–î8³DTÁJ_øåÕßMI™ð¢Ø;ìK«“ó ”XnWÝgvwØÂÍÓÉÊ–uÓZ*i]hiÝqkNÔþv®UöÙ–Û™®u\ñ ˆ´P¨òŽ[ç•éEµåî¨-Víá½=½3È ‡É¦ä‹0 ù*o‹:¯Á¨w‚nfitóòéÙ "ëŠñGIn€œÂÿ¬ñå¸qtâ"BÐX†${… ¼ïlÇ“ñ²ÑœbŒÅÁø[%B0÷nM¨#‰/É@'Âr©W?Ó„¨cq\·9ÅÔÖ䱘k›ä¸&gCwQR“sT CIFõh´!=ZáYÔ5¡·ÊfO’ M&•pVÓ Rª$%ÔâIª QbQRÏêeêXÅq©â8:!x§ÖÔv-n€1Å„ÉëIŸæÕQÃu¯ït!×rmZºP‰ÑÅaÐ1·ÍHÎ$9̓J;¡¾ºùc}|zz˜§í›‡6^5OÄeéRE¹E—±Ä#¦5™'ËQ©)9Jt¤HÚ&}d< 3§¦}QæMŸXå„Ù×YÝ8w,æx5ñ+MÈYavM¨4wtÂ̩Ďåa'Õø´Úo¯ûƒÉùØï\üà½Ú?jŽ2-Ç…ʵÐ&GX¬øâÍ›7èÆm+PaÁß×ר½Š“õjηËcDÑøñ!:FîiwÜê¢Á6yØ&ùS“Qè@'7Úó; ÎŽÑ$ž'¨{ÅÉün~&óUŒzóÙ}‚¦ÍI·3=@ïÃÅ6Ú˜MRhÞÜä ž6Éôàhpw7mâéI •é'`ÑÖ¨øcÿy\¶ œ[=õÏý Ûα W£5 ¢Ùv&«µò”=ï¯nŸ€Å]WÕ¶3ß„ß,¢Û \oõqÚ¤pÓyŒÃåüf~˜Ç³Í´ÉàÙ¤mÚ´Ð9¬Cl?tö Ë½Õ½µMV9ΉI_.ºÐh>÷籕A-K¼ë0¾]-Q”p´‰n€!8†SÎdž¹ªã@šâÈNU!KRÓÁã˜Û…Ã{Ž[ËÙ(Š7PK}NZ燨&Ñlµ~4§ »ª÷F>L^w|•çjô¸I¢%º ã ºÂEræñ­†ÕÚhËö<ÕqƒïÒn?êD³ux[ôÉI8/RgÒ—[ö^`j Æ~è­ñ$ðŸh;žê03@øˆÖa²]G/ÄÉ=Õ^Îg1OUÜŒLuùppá×£ÉpØ»zì.b/´‡´Ó7Û‡‡Åã ±ÁK°ûjˆ±êi7þ+)à€%5ŒåµÖQ¸É:VÆm°È<¬VázÕ›‡q‚:=ærtJÑèü˜N.õ0yÛ‡ÑC°Î”îLæàå‘íÛ Çå&³oƒú4 m4‡Ä´[1†Uy>S*(VÅTÜÀ7{¡bR©…A€Ây¾*5A¥Qñy RNTR¨t/T g±*!å»jßï‚«ëŽÿ¾ÛöÍ•%­¼ä|¸Ä¥ªn¿Hk/^âÐJÂM6-WœWà5–—PZÝq^Öd ÎN^+}+fûÛè »¸º¶+ g'=­p$Ûy;–‡x5Ä©Ʋwt8ÿÈ+¹’äkI¾Ú= yÆ©©"…/«Â6³-ÛATþõ³¶¼þ"Éß’ü!É?’ü%ÉÏé·š!é#OZ*c×Oñ¶g[”zu5"äõ'IþTä7I~—ä×4²ª%n{ò§Ý¹Té³á»Æ÷éYq TxTÁ½üý¤Êàô˜ÉUi¢…þ}ãÅ`÷_È -endstream endobj 251 0 obj 1556 endobj 254 0 obj <> stream xÚ¥ZKsG¾Ï¯˜£@©Þ#F#¤5¶Ð„Šà`‡íØ@vx/{ðúF± 8øƒp_œÙ=]ÕYY=l(Ôš}•Y•ïÌn9—ðó¯g²û°{såܪ$bœÁg¡ÝÜj%¤tó3åµð±ú"™aÁè>Šà°¤ïšýP-:‚{#Ô˜ª³RØP}ta32YÆùÀI|‘ÊIðã“Ð/€ÂrÁ…¤ÜN’¹,OR¨.7J¿€“d60Í$Ÿ9þ€–ú½–‚³"lC‚Sý_LatƒÜ–ÈÂÎF‡n‘—l[D/Ø#¦P~_ÔÔï‹ÝV:š´¶ZâEŸ­ê6sºHûË{D0KÂÃç%áêvà3­Œ~Á'MÖ6”¬4­®qŒC© þÝèöG¸Z'”ä\wÈI­f ƒ, ‡"mŸd/7—›ê,ÓÅ> ºÓ¾cÉ9ÃmïÄ%ÒXNÊ».(j8<œ«©Œša&Õ‘]‰Óõ¹—/•Ü¡žAËx¶ú ˆ:„>´ymrâB¤O þ Ypc¨[Û0mIJ/’ôÝŠù•k×®ÍÛ½~ãËû_mßùz±~o±{w±{ÕþþÛííƒÅ.|¿~çÖâªú:aGËÇ&¹¤õŸÀa.ÅìÆöö­­¯oÞ__Üݺ1ÅÎT«Øi0ºOa§›ìd(’j±s1–ã ;Óbç|,²j²³±ÿcØÙ&;‹¬šì -¤OaçZìlL«MÅúôi¦â›ìlZm*V§|üÅÏßÏùaŠ_;ð­m1?ö/ˆ&ˆu6{ãÄFk$a 6a¾†ø1ž…B¡Æ|K¢›ZrVë¤<°°Ng¯.lä $ÍÏÙ¡Þbpã¬íÂÛ\ÉUuÎ÷ŽËw—fȨavðr·WbŸf ³²knìˆ5]|~Š—S¼œS¡@±g"[vŽ—¼<ÂËë¼ú^Ψ  L„´P“x”áoiq¡Ôiâf‘Þmæ /O2Ÿnõs¼_´im ߀ðj²#b´Q"zÛ®’™Kw‚gxyLÖbÑÖ`…ei^ö2¯=β;É·óOÆ” ¡µ+²xN³(ˆ\A¦°+S¯UÿkØâ’ úkLÁJm_jq—EèpÑW©^Îò§?ò1‰Ä,êÜ´(+)¿&+’ƒþ@·öâðïŸ$v)0XÇÅv<(B½_+m+!›ÙTüôðs¼’FjY™82’` Þ…dQ,pÖUoMêJ#jam˜’ö/°yãyÚºHá­e oiëÕ¸åìÖ)2¿Ñ ´wq…¬ê!ê4£h‰T'´˜†~ã`µöxu‹7ŠÁ;ïxA,Äèò#ñ³Á|Ô‡z<¤b¨)¼.þOËD¶[*ôéX¯ #Œãê ­QÀwõÂ’rûù ü.ï¥hRÏ']“)õÄ›!,ôiø´Q )á°Âjœà9¥u’¿[å‚MRî’4ŠÍp>¹êÀš-¶÷‰°f¼Ò¶Y‘°f4èÞÔÀ>ª Hßj¦ýç™ÿãR7Ñ^HÇ”ÂýÉ@µlB86âµ ]e3ë5DÃа39QKE-\là5+‹-ô(&´q^ís9?¬vçp8ÏÏW*p~ tnèZ<ð­#EÕ«¼ÍöÂãèË£X*RǼÑ8JeÀ¢Ù'´id_°;‡VR‘ྨ†k¾«Êw¸PpÞ£mHF»±„–•} ª4×Å:©•}ï5Aô%mO©0]®KÇmd<&1£@”)4¶tq#†íR7%àÇù1ð¥}‹ò…>8‚¤V¯]ÙˆõÿWÛ²­[¶¶A’s­‡"›ƒªB—†(!½”<Û"Mñ%=W[)aßUù[ct£ßDSÛãF!ž„„ö±&ñæ"U(ë…†#Ö KÉÐñ~J=Ô[Óˆ#Ñ e|,™}ð‘Ž?в<€Òç45—QÈ;Zg+acj¯.¹ê Mö|˜¯•ÓŒÎZ¼6|ÐØÔwVº0œMéXÆŽŠ«î„G@¨†Š’_Ò8pJ…ñ¾.¯j¨´nϹ?y¨1¢k¬½„?Ùä¡ïâ‡(1÷ŒºnÓ0xé§ž5}„êƒÉð‡ìu”Ô øêâpú¸~TåVMæO*Cš)=,F£^3U¦G¨/4gÑéå]þôº¸RÝæâ̲^Íç©Ú@Cìø¶&ÌVC¬v&2ø •"›'ƨؚDžŠÖéA`{1hYÕãúÌjЭ<<ºÇ‡ãì¥ek蘚?9aöÐÒdÔ óëvkªU[Œµžo‡O½pL¥C^ÉOQè˜ ßwQ îëY”õŽèTKá3MNi=Ì€ÐÑ<2¤¤õ¤ìÄO¼ËN¬tFQµeÓ½Û°ØŸý:‚'àÞ»­uóïŽfRÄîÃ_øê×îe‘y÷²ˆÒAè~1lÜwŸ³¶¥çë¿Ìvà§{hÞx…cµäJÌ"“Uk¡ýs ³I'°WË0w º¥†L8!^{Í÷Ãí>be¸Æû*P:¨È‡ŸQTòv¢ÑÁp0ý­>¾—³C#1vtœÛ™Â§¸ŠË¾¸`åS²›é×p>IÆÑ®÷Šo‚À5'çëz KÖD}N'á,gG'Éhé JÔ'ÁÒ¢¶èë0™Üj}jˆU {ܤyÀ cýj}jˆÛ>ºú\9OØ$ûKt çñ_ù‚UÓÉ.,@ƒÉVµ‡“ÅC°"„‘¾IT*¨ `e½Š×‹¸Œ5ð” _F-çj7PóKU-î{»‰JK‚hë%=ú@éпçU¡Ÿµ§I:&Œ­3?£5¾„ªÆU3Ô¢W¤´£O ¾ëæÞßy=SOÜÎ&Fy`ü*Ù M¦À®¤ÖÅ lú\„¤8évŸb ´–É´c'¼x ë¤.yR $qÆ ¯Ñ=¥‘!~ŠþÌ5P~]Ú.‘ Ä®ƒàºÜ @‡/rQÜÄ$Ñäh>‰UPy£U@>‰U&Ð×@î]Þ‚’»¬&ªïi˜èîÙN†9==^Ôp¼Ð `³øB$EWñ´âµÃ×oñ¸ê%LHtß,ö®oÞÞºãúíë_lÝÚÚÿæþîboûÎîEó;2uÀ7ß[e2|Xâm¤!x'ÓÔáIãùÐVLì|j5ô”PW´€éÎÇñ-æZ+£‘ÞÊh•Ç/ǧ•§tðº1ø°”'qT~o˜DÀI%ddŠ]7p5]16ð¡1>}¤à å(¬çk,›9×V§ µ:Œ–1£ÛؽÓR0X_±|B§d'D©j 4TÆåœŠu¸:<\ö*;]û!çЙÌä€3—l÷ºûøFv/îö¸ÑW:¬ÿiv0ÿèþ VnÐ\endstream endobj 255 0 obj 3088 endobj 259 0 obj <> stream xÚÕ=Û’Erïóófv½´ê^]~ÐÂÉ!$! bqà˜ .ë@€mÂüƒÐMì0($ÁàúÝûàÌîÓÕ•—îsf´ˆÝ 8£:'o••••™]]eö¿Ù3û‡ÁÇ[ðÿ§{¿?Ü»tÅî[»øÉžÝ7ðŸÝ/ý~¹3¾ß?¼·÷ÚÆøßãß“áã7‡ÿV­]*E`ü€/ðã ~<Âg1„΄$ŸUðç•Îõ‡ó¯„Xq]ï­ v†ÇT”¡yÚb;—»è¥(ø<Ä.¯(Éü{¿ ú'‚–]gmQÐl¦==˜·¸Þä®×†ÅÅY»øñÁr¥s9 49>Ø.y)ÛýyDx,]4š¬i5ó4’ö … £Tù·U ¤ÿÁš.©€‡ƒâ¤KMR´ÓÙ( 8Xa_¤Ï«OëÇU”DŸ:E´ï«þN뿾«ÚØRˆ¦‚“ÚBe~ÝÀ¯§o;S½ïЉTð3:Cmb÷§ŽÙ?p×wÞXc™èt~.ìÂÆfF¸šÓΤÎg)È“*üOt‡Î– ÀéÔõ¶‹’$›è hœ à,/]ñÌ9ºÐw™öðÎå«·®½qùÖåß_»~íðý£+·ßE2f¤ÀÝ«ïÁôEñ¸:ØÑVˆ×%§ö#e¶ôàid7¥ç à!²+k ©ˆÄa„À¨T+ ;6ü‰Žÿú¶2<¡Îû˜Ð݉á³ÁŸÈn›;±œD”àÒXè´ä‚;±`Q!¼`³6¥.ä,Àé¤Ê¾KÆ i´=˜¿j´¶`/"!!¬öíË7.¿uðæÑÕ›‡wÞ»|kÅ‚ƒñ@Æ ‰V-§§‘]mLX¸¢\çœä³‹+ °ÚEkrEˆ¸âuáw[%Ð8aÏÙϘŒ2x;ÌÌáÛ• o}éz´#†=Èò˜zhPi/ù,„:6cLJ…ÞmFbó×zÁª&ðžèÓÆÁåRÖ{ƽ|î]ú§®¾t)拊óbañIˆ8¶ý¿6~@}]Ž „HÞ öxX£ÓÇh`y)hጮS0Ü †S&£9ðÄ~þELFßç.„¨Ñ‹U‚ïå<W[Ö¦‰k‘W4öbëT¬GêæbSæ¡ ÒÌáõ d§ÛãÉÌ›¹‚TÀŒsP¼à©ˆ­oÛ³K÷èb“»b“ óH.Kòð*dµ‘qþ3ïYÎ`¨ö™£ÄI]c ¢Ä»XâØCWÁQqb»&Žýx)Êbâh»N…ƒ?_ÉáÀ°A@"S8—C‹ìÉ‚á:[ÌF—e‘–èm`O ³àÕ½ï!Ž^èîÍ'ÁWAŠÂ!¥W÷`ÄÆöº>hò›1 :dcÄ4Ì6]IÛ­'œ&É^«» ÅäzÞRð«_~}盿ºóõ‡_¯úû(N«dg|ù,èlønj´½ïzŒ„ø»©ÑA®“ø¬ÚwÔÈnËz&zWïtȇõciY†@/{)ÌR£D—CwŽÕÀir\ï¾¥km=𠜪mµì‰›Ç±f\Ã:+ƒà`rOé :>ÌãrME» kº£Øò’ÏÂáÏqWk‰ë›nÛ´TKàæ:ÆÇo¼}óöûGoܽöÆBiÂB¬)]‹u‘Jªó¦K 1§³¶F:H½°ŠËqhÚ ©—ñhÇ5ÒÁÒâÁñ çZ#=,%I-Í‹¤ ?¤žàœ£d„‰UaèÚZ{¿'‘Tω õÁ® {A8šòX Üc„4ˆC.=Ãý/Y•g½t !5Äòïbû#¼‡X_ön©àÁAyÉ{íI&AÙg³ê-颓ª¼Oúá òEÁ ÇX‘æt”r0L-Üu¡B*¥ܤQ’®-šr·3E¦NÒ>.Qå~2}°z!,+¯£&£ýºò±>ÕÙtž½Y¨Ó¡TVU<=½§EKC)ÍÏs%rÚü)ÝîS¦ÀÊĆì'¤" ×ËáÀ ã}/„…yCqtuúãÇÍwo¿qptåòµëïÞ>XËl†èMïÄV1poßà±¶ˆÿ8¼yûàÍ9",¼°fsA¨÷ ¬u^HK÷bÐqÍËz÷N«Ýÿ¬mã‰1 Ï®_îÑÌ…ÜGAl-u²&È#8ÎÊñ™bÖ'bùq¸ËÈIbr—Ѱ- mŠA.ì2rX±Y€Ÿc; „Í]4vE9 Ûñ $E!êŽ=¤7NÐÑžãAüzRqܸ8.ŒúÏôéÆsîn•!Xد”ƒ~…øøñ~¼‡wùö_Ü‚Éq~K&.çK„EÝê€ïÒçì®ó½ÕG潊ó­Gâ~f‰s@ƒ \$Ðð‚¥“í¥œF·ñãög‹¤y½vkút²’"©G ÔwÞ]©w©«ï\Ò…ýƒè›Çê¿bÉW(õƒÃ=˜gX¤…sÿÞ2‰Ð©‚Ýÿ|ÏAÜNZãÏ#xóE‚D!&ü©ýÙÞ'ëÞðEËÄC¹â-›©=Ql‘ Eº7´sK5âËW¬[6ÀD•³m;ƒ…Jp«µ3e¬|Í!_Ì 3…±Ýt¦r™:S©nd%íܲ™B#s60öh(!…:öØÎ°6cOZÓÏ>ÿ솟gä±Ýèjæ0öt¦¹Qý¢åѸ*gC‘ª®fª£*h;·lfWÅÈK½ñð’ÒÚh‡äaÉ3Bà`ÐüÜ›ÚnzS¹L²TªaI;·l&€‰j¥Ð²Á‘‡¥@|_G7ø[7 mÛÁ§Ÿ-hÓÍ#_Û­®*‡MO+ÍIä‹–G˜ÈNZ6iÖU¥ºQiç–Í0Q­´Þd3dbµ7·|6Œ~1#€ìÜ›ÚnzS¹L²TªaI;·lf€PÅÈœ Ž|¥­yà¡™'oß6¦Cj~t³Ÿ¯ÍVKíM'r“ ÚvC½ùÙ5 jŒY=ÁMçÛfnÌ?»V5’A0Ð7SføEˆ¥Ò í Šx¿¢õã-øVÓ«V–`» ,)Þ_ßú7¡ÕË«bu v€«{PÖ‚Võ†ŸØaviºeûíÓ©«Vµ¼ÀÞò0aÁ¸å:m+½Màg…¯÷Šƒ©„_¹ ¶ ,ÅûU¦ûdä/­­Wmä‹t_jx¬Ø ž[úWn+‚í‚­Hñ~9o÷ÒªøñvŠn_ÎÛIÅœÓÛñ È0lZ ^ð…—P^¹… ¶ *ÅûU½ÙKkëïÚ›×½ò´›3]°.Ú/çÇ^R #^Lhõå|'Ç…µ”ìÄfšlÖþõÒ17Ôaí«¶SÉV·TE¼_Ó£½¼¶þ¾<šöÆ ¨#ÓÂðv-÷Õ—­ÒxU‡!o&<KÒ!¯beßõÙ ˜Û-Lo»¤Àȵð¥º^ uE¾›hñº" Ù»„_ÚNоKˆW!X¿® |DZX+€Þá'9#ŧ€/xs KüýF<õLh?þy4ñÑŒzí˜Ã‹LÐo7'·Z‡)chÊ1 ~k¨ë'ã1?½>å„ãR2øž¾B~JŸÂ)§‘Z3º‡ X?k'…ÉÙ™l±+Êè/ÉKAÅÁOªXßéw4DÓw©W]ª3÷õ±<0–†!8wjÌ*çJ±[\—¢à;âƒà³ vFÏ   Ϧ½ÀY:kÏ«î“_º…ÌB>i¢ÄïL¸>1 æ´Hñ0[KÅ=Nwn]¿ùÖÂYkx‰CoóÕË›ðel+q–î‹y8t‰ƒ+Ó <а^,kB¿ ¯\Q®_üe¯ã¯È+%ÙñòVàöÖ¾;|JÓ¢šà4ñ“ªñ^;ŽÇΑg»xZlˆì~ ›†“µ¥TKÀ g|©>¹|{<Ê)¦5U-œKˆOÕñ~xõ«?ü×Ç_|}ýËOûÁküfa¢äñ|½¥± œ%RJŒ_1 ©¼e¬X©Ág䊴ƠOÏÅ´% nhtG·oQ/±zuG‹½õøõT†ÌŠãüHýÃC~>,‚®òY8Ù‹?Ü6ÇÙ~`MÙ;¸ó‚³zÞ‰’½àbÁϾl0’;"2ïñ@^<œ@ñÃI4ÍÖ ðßÑ¥³'€þAä5x«¡ÏRÔ[õ$Œë2IÀ;E’¤Î2—l»\Š€¢™KÎÃ=Hˆf.}§#e|‡ß. ÀÐ#< j#¿Äƒt£Ú1qïÆ•v8S»^EÁ°ÊÝ+[/ÚKIîqµäûô /z`¬ Cõ›cϡޟøuWx2gs<†Ó}9Mjð6Ñ⥘Dï–[×1%5]# Ï©õ’ÛÒ‰rx£0š´ =_×@Ã%2ÞÙÅêݬ¼6P±áwW¥^²”·Oà–ï P½æ_Ë}¯ë€æ%¬ö.¬iK®~Nº]=X:Û¬¹õ‡.¥ýpÀ'&­`8&'®›Z„ù‡®‡Á<\43-×Á­-Él=¼ßâp\³øRjä0fˆ|˱é2+ÊxÒoÔÙ*÷ ß•’øŽ—\Ésæñ¶ NLÆt.úa[ÐEz+‚O¼mo=ãÄ–ý0ƽ“½~^YýJ`¡}{×<&ýFšÉÒ08^6*ÂKWAç>¸™¾×ŽÝk—‡z‡|@‹k+öwtzÎÙщr}’튓F¾zL1Hnœb¡´P‡Ûë9ÐCZ–¸Oûç—îâí™ÉhײÿwðûJâ{ZIIX3œ{E ¥$Ùce(sH‹G«Ù»ƒ×©ÿ?x©PÁVü7ÞQ0ÒÔ ·\扗ã6ö¥=9â,´s¸1˜¦®3 Iqá°rë1 +:øꉾSò °޽TíÅ#c%ô9ìÌáÕ>^öîƆÍÙ$(¬º#|I¢—Jú‘"Ê_T Û´óºnEÓŸÆõÒê–ÄÍ[70Ç|óàúÑkÿrptýÚÛ×Ö.ÂA'€U"ÕxžÒÚËr­ÇBrŠ[‰ ðÚž¼K‡€à›á¨q¬E}¤çÖ_-Ÿ·~ùÕÇ_|öÕ»¾üâ“ý•®bÍÑeÛ¢R{¢%LXÊ·‹5Y~žtå0d¶Ž?£:–vâ²éb,œÌ.wDÊò³CHÈhMyÍI%w!‡5ÕÂzÍðOéµøõ„Ïq”µó¿=ÄšÆÛeemEO y1CQ]6ã1Àûü²ÜâÂ`Ö—WNiJwL}è‰~&p(xA$‘ßNÚ!3Î/!ðSÝ{3¼i' ÖòÔúó¼o4ôžÑ¢¦f‡§Efáâ¨ä‡+7,}å(áõ7–Ã(‹^ï™"dUr¥¬oÀ÷ÄÜâéÞtÿŸö^¹ÃÒQrß?Þâ$`£R|½’}¡Åõ ÏpÆG2 M™~¼<þH¯8¦¦þB/(|P_’Êô”ßÁk‚>BÍ*[MJ¼!æ±l‡,ðÐÙø2oæás˜àqJJÅ"x3\tÅ`×Sð¾ë½@Yº25%ˆ˜ŠfñµH¼Þ ‹ =Èk‰ð>¨>öª(Où£IƒOÊwPÉÇûóh$×c1 ‹{9ì¿nNÑ}gï߇âî=øÌexi Hà o™ŽpÍWtÂÿlï½ý/€îÿ 8ˆÙendstream endobj 260 0 obj 6611 endobj 263 0 obj <> stream xÚµ]K³·qÞß_qvW”Ñà1ƒÁR)Q"S²%“´Èr©¢…*²’ò•lüh’’XæË|È%ÿÀdï,‚Æ4ú3ƒsuR*`£?àk Ð3ãåÝ?\üÓ8ë.ï~Aþ6^~˜þÿÍÅ?ß½x÷siÌåÝ//Ìå˜þ3—Ëxü<ÄÑ_Þ½ºø‡ÏÆqül4þ|þ³»ÿrÑ Ëä•ìøy„?Oàç þíEV“~ÌÿP]ÆÍÃ2jeYüåãk¦"øÁ-‹R‘ ¾`’Ë4;)É×Xý喝Í0ÙY‰?æBË0ßFÿN‹Ûi˜fß zœ×?ÃJüÌÊù˜lØÑF;ƒŸ‚’¬6É­ý+³ØaöºÌ[‚ÔK :c†ÑÅÞÆ;†h•¸ù¥N:'Û¤ŽûîNôLçÌàg^ðãOnüâæ'·>ÿÆGŸßyïÓ c<—Û»i0£Q¸ÿK+ç}ª€wín›þˆ‰'ž—F¯Ët=Î$0ñ0£ífÊG;D£ÅŸqc<Á¼lªg+_°GÚ¹!Ó¨ ëìq"XRHgÁWüyþ=SÖ vœUÁ§m“L1GׯyÊ$¡éFKæQà&9ÅÁYÓÖÉÑC²ñڒϱ|x‰n°³.S-÷@YÛši£®Ñd“ .Y{šÚ¦jŒKy,˜Ú­xÄwª…ä5¦ÛÔ?í¸ÕJ^ãèk´â½aÌ™%=5 æ04ž{kÁKyì?úøÃÏïÜøôPN=ð©Sj>ÅóƒÑìzmäý4,VôÅsÇüé}Ô6‰OÝi¶¶Ã$Ó˜É0í™D³½MÝ-¹Ìï~ÿo_õû¾øÝ×_¶é2³Iýõù¤û Vó[q^Õþ/¦iÞ¿“b˜½@Õˆ£…ùïÃÿý×oÖ¿Üþ0U:)šYߘ/g%ý„ú,üÜŸ›~ƒu^Iÿ~þ~ý­û6&Œ.yV ý=üÜæÃc= þ ü¼?庰2³ܤ«ð>”¹ÁÍF }ŒŠÅG1“ÆÈ ë!}™)MR(ȱÍD]»÷¹›“|²4I¡XÅ›;ÜѦ/:§ÎiJªc‹Û£QšÛ‡1FºÄa4zÓäƒö£f|ª¦]Z vÏ:0<ã†H¬óÍêrç39Y"kýc}¸=¦Áy¥ÚüM µNz˜Ö›côñAк% %üº:—u8TS£ÓÄ;EUZO¼vçjjK™x]zÈÌ<«2ßò‚ãvÝ”&,èÚBÙ_¸kó+bvmšäè6ºäB™cm|ÕXiBaNjtÃo¹ D;_q·Ôg_HªÞ ëý~I“2Œf¢Ì ¥}JZ®ÝÄ?ã¬ð@9sSràM£ŸÕõKs›““=% €ø÷`Úÿù­_||ûÈ,6¥ŒÁù¤Š,ƒ‘"[ ô€É©uMôׯC U‘†ßjK«'¯$ù\‰ÃÑ·ªd ð©3%ÿ¡Õ\&7ÍCH+F)÷¤ñ¼‡Ãœ#$ßâÃø”¯Jžl=‘ÉLÞ¡RöGµÄpàϺ!ÕÃú{Ý[¬Åµ×àRçmh#¾UN¼Ks×¢¯ «¥7ó¡‹·´sW2¹CɇW’d”EÞê¸ñpƒKÒìz¸÷3,SÛ„[Ký)92Ón_m?Å©#&îùªý½»Ÿß¹õëŸtëç·î¶h úÄŠŸ×-svK%Àñ½'Þ+Ó6éÒOQüáæÏÌ&ThÅ-É}[¢’Ü¥ßÅ4EG±¿ ðçuÅ~´Ãn"ø@þ:Þq×¹pÛ[ç2Ùñ~— ›#Û¬f5'î2&Š¢’21oªlVnJKtÕØŸÊõ@˜TÿN×DÊ9¾H“$ ö\&»ä÷áç_֯޹¦jm’ “fDU>O@÷ù¬b þ.¼ƒ?·ùöÃ’üCÕÄ_qÒ†..sˤ!C[ð&ü|ÈgŸñð\pÁŸ(œM.€¶sfæÓµë’4¨Ç4=–•‡Ö '¹ .ø£3s2礱­%ƒIK87ZYÆÜƒŸ_Ó5ÝÀ ã¤P:66ø>YzlÇØ¨­Ü«1*¡§|wúì²#¸î¢LáS}ƒWSža[N5ä’©U«$7rÿæá±‰²R¤Ú‚ÂÔ¶ç󆃔ŠY‹“1+¼tCS0mœ×øSç¨'»x FûÙy‰?uÁÈ7ÀÓÀ1M¦­â ¯À[½0šáؤ›:¿ÌôœZÝ ï'=¬ÓsáÄÝÀø@¼å›Þ¯7§ÆESz|âbÚ{.iäK.ž’y¿n©°)1Sò[¥ôM9NØI«Lý×ó)Ñ ~¶-¹À÷¹l~„¤ÜŒ ùõîÔ”¦ü´Ô—¥ïµo¦ìzIq=z›´´5KP’ïȽ±±þ)ZÒ$<)¡[òÄ0&/Y éç]´FÅ´SbÓøÓ\"%›^‰õiæ1š™I5:"Ý~Úv-`«ÇZ1GatwšÈ]ïâÆÝ xRJ>îUú{ê›—É1²Éyúí¬“a›‰eÌc,XFÈiÝžUL~uñ¥,t•3ªÖÃöôâxFt®âŒàšÀ€$Š]]Àq„¡Š§d¦´Tdé`+¤c¨Z.ÀÀ6šºÝ‚Œ¥d\ÂË€z®˜„Ϩᤌ!Ja ÕÆXTqˆ„Çš,˜2†H…1T¼2ÆÒ‰1Ä©ÿî׊ ‚ “‹I,=v…±” .>X4~-À$l–@ ‡$e QJkQmáƒe@Ó‡HX¬ÉB)cˆTŒŠWFX:1†8õßíZTPacfLpz¨ eNó+a„ç@ûK*³$ËÍH[MSÞ*VitÕ]xá9ÀAE«2E{ÕCñdÉJ_Õ¾òÃ3 %Šêª„‚‡°“‘–.È¡M³¯›(?,'s±–¡2!ÙrªbšqˆXØvÔü°œÌ¢U™¢½ê¡x²$ᵆXpˆh(QTW% 8ôsÊð•CˆH+gÂËÉ\¬e¸ŒÏ2UË!Í8D,l;êF~XNfѨŒÇ- ŸqˆxØ|Ô^bÀ!¢ ¿V¨*©`Àar£}úä0¥CÂ'ü°œÌÅZ†ËØ,SµÒŒCĶ£nä‡åd&ÊX¬ÑÂð‡ˆ‡ÍGí…!–"‘°k…ª’ &gÜ:[9ç|±”±f”!..™ÓV1Í8D,­ÛÝÌ9 !‡¨9dx²äUC{aˆe‡ˆ†E5rÈÀ‡v´ÙA,Úå°â•æWí+C<#qXÑP¢¨Öð…CØ·©r^&PÏŽeäê p _}?L2ö ’WÔ"w4#×´àP O}?†$ŠÚŠâ Mi‡ü»§¾ƒƲ\]`ج‡®0xNnÿZ†ËØ,SµÒŒ7ÄÂF£nä…ådÊX¬ÑÂð{ˆ‡­Gí…–"‘°k…ª’ NÉû±uÉiØš ü°œÌÅZ†Ê$)®‡iÆ!baÛQ7òÃr2ˆVeŠöª‡âÉ’„CÔ^bÀ!¢¡DQ]•P0à0$ï'ÔEl~[K×<'s±–¡2ÉA²u!RÓŒCĶ£nä‡åd&­ÊíUÅ“% ‡¨½0Ä2€CDC‰¢º*¡`ÀaLÞ­«HÇ@W<'s±–á2>ÔUIM3 ÛŽº‘–“™@4*ã]•pBì9æÔ̽êämÿPPŸÄö êsªž³4ujÙ{¤#zŽLôaU޺ï9^Ð;½›ãz‹¶gYoà÷n‚ê­¸žíB½QÛw=K]Ú¿Ö¤îŽõ]kR—nö¯©;W}×ôÝ”žë3êºRïí}£ç¦‰¾ãÓ{ÓD_y蹕¡ïÃôÞÊÐ×zn0è»#½7t(}O´¿¾gÑ©®b¨÷£»u0}_x·Ž5î ‡Váç½ÑÐ:,·'rXÇl÷FëÖž([ßÜe«Ã={"Ru,poDªì‰ÞÔq³½Ñ›:Œ°'ÒQǘöFéép±žˆ6KØѦC«z¢¿tÜ]oô—ŠKÚ˜Òj}!S:~§'ÄH…tõFÇè0žHÃÓI¢Cz¢.t¼KoÄ€>ºî9]×q ½'Ãúˆ²çUŸ_¿ñ~¥n¼¯iv¿{ë¾·¼QO0ÐûjéŒßˆÞº!-ï  ô»Z:c—†·oˋۦz\M½1ˆ›µÛWmÕ gŠ„¾VSq âþéö…Tu˜"¡—ÕTƒ¸¥¹}mSÝ–¥Hè_5Ç î2n_nTwJ)˜6Ç nüm_T7/ Rõᚊcà×䶮ͩˉ¦xo-¥1ˆ«dÛwËäu> ƒ~[So â¾Õö,uï"¡ÇÖTƒ¸•´}MIÝ£Hè«5Ç îîl_æQw¨(ziMÅ1ˆ.ÛW^ÔM#‚Tý³¦âÄ=í‹!ê>EÂÙ¦âÄm‰íëêÖ EB°©8q§`û’ºÛA‘Ðûk*ŽADÞo‡â« ý¾¦âx¸úVøºº$@`Ðãk)A„toÇx˰z ƒ‡¹M½1ˆ¸çí@hN‘Ыl*ŽADo‡ «(mŠ„þdSq "†v;¨VÅ2S$<ðm*ŽADšn‡žªˆ_êÔ¡ÏÚTƒˆÇÜÐTq±Ì},ÁMÅÁ¢·ÃUô(EB¿¸©øÄ`?c HìÛLËeä´p«{>¾’sÒëÕüdòs"Kß«ßÈ/çâoÜ;Ô^–åWm«ç*|ˆuûX¾Þj)ËÜä¯G›×=áë´×zŸß6¯Ú+_€Æ¥ü-¦~pan3÷>þí¾z]Ü¢7Þ]ëòg—¤ {O[\†Éê¦|ö3þ6?øNŠ®æ}´íü¥~‡WUï·±`ãzðzIÛ®õ»L¼ãÚŸ©€‡jL¤_#0fó=þOË›‰ÛÏL}¡Á7:>&/åÜ~ï'¼,ßÌJÛ7¼&ÏPé_x?öÃ2.²p}ŸäŸšZVÜ9ù²¿ež¤˜~Ûê¢j]?Tšý_h™`Fù¢ã9-Z0¯ø›Àé+N‰ÉÞ´­=ÃW®€›4Žìm‘¹ùëÍ÷rÇì¶j-&ð—~>à߃x&>)±Ù…<8L“=W’êNëD²ôN/Òuow#)×ìGRh»#íò•ü+«À9ÝÙ, ÔhQzϪîG, äÚBç°Àᕟõeô¯ÉKâåS›:€–E“?ýó9nLžmtGÔ;?äï“®ÎÛÏ*, lj¿ ¾-Fº¹¯>וSYÞoKßÏœþ÷”0ùÁ²´L|œ”ž—ÈîÛ2ÙwŽ|Z­tU•#]Fȵ»ŒÚî2fàçó‡á»UƒW­GØÁîÀ4Ÿë–êN{„eéGX×½m)×´‡ê±Gó¹b_]E^´'`eØÃÙÌ!ÔhQzϪîGÌ!äÚæB=æ¨//_/|Î?ÃòC§`pZÎf¡îD#ˆÒ{FPu?b!×6‚ú‘Ï„øœšwChÐS]B6SñWSaøŒƒûÕ,ñ˜¿,¿~[æa㋘i½ì—–*Ûø¸ÏcþIþ™\R“\Kÿ˜¦O^¼5J®õ}ˆ£S«Ë»gë¬\Û‰}•Þ몲âGz*kwT.³ã~yþy 9Xäm-s6þ…º JïY@Õýˆ „\µAþ0ùÂ>X¬ÛðÿeêþýpÂSOgèGê‹ËŰ6ïŒÚk¸¬²äu]V©ç.«®JÛÂR®ù”I¡»v™‚ óß˯JÀÜšµ“ß´nÏʪygÝ]Ǫ¢äµ­*ô\Ǫª*G¬*äÚVB糪˜îÃÓL-ᶦ{e¼|ãÏ5ÖJu§µ²ôÎX«ë~ÄfB®m3!t6›­ƒbßÔgóÉÛÙ6q¥ºÍ!Jï™CÕýˆ9„\ÛBhÛz c¬³ùLN…z¼³ü^qpFWèAûû¸hHØEžÏæCJu'R”Þ3¤ªûC ¹¶!…Щ†<Œüßñ,>ºž)CZx]%aÊÆ>Äø-—öÞ ]*ð}c‹½~|oÎ\鲦®í¾å‡ðQ°Ø*qÆ~ÜóÙäRÝiýS–Þ韺îíþ)åšýS í,ȃö¨LÈá†M´çtH"ÿQ;ZðyLÏ8—턺m'JïÙNÕýˆí„\ÛvBèú¶k¡mÛîÇ,pM޵:›ý¸¶ÍÇ ïYOVüˆñ¸XÛv\æú¦k`]ßrcu5-—ãñζ5!Õh;QzÏxªîG¬'äÚæB×·_ mÇ€ÿ®äƒ£G19NólÇÙBÛiÆ…wl¥*Þ6•kZJÈ\ÛP-¬m;ÙzÂöŒ.ˆvFÇÆ{¶p¡í4£‰Â;FSoMˆ5&d®m´ÖµŒ¶·£¼Ï¶ ´|Ä ïÉŠ >âbíà#.sm£µ°vŒ65¾¼ó¸% |S —´"ãÌ¿®ßýåÅæ¯ó^¥ßsà2|VÞòĘã4r$‹‰–ò_]Ü»ü:éý?÷Luµendstream endobj 264 0 obj 6406 endobj 268 0 obj <> stream xÚÅ]ÝÎ$·q½ß§ø.’ F„Qÿ³yX’0$o⽋‘ø ßäÖÖZ¼Z »R½`^!,NóÔ»›3û ‘Ѳ¾â9ìÞž.²Šéºô¿ß~ñ¬Ëÿøì“gq}˜¦K×/éß—a¦æ°,¿y6Œýeœ£6,],„a¼„ìÃ%ÌÜüõ³³³a•°Ó¸^–uÔ†8ŽÌCvÄÄdº=&C¼ôxž×Ët; ÌCíÕñMRlR{†b˘úÏB1e qn„Çp™³Ç†PšR1°Å[S(xàQ€!™L7V À›bªOù{A€¤IŠ­}jOP,5Ã2 =”.~ë <†ì„kS*–rµ€-z(]:x„Ç€‘¬’X*¦rÁÞQí¤xøïÃ60MR¬ïºd!µç~Õ-Ô‡U#K—}åÚ–º1—Ç.W\·\ÙŠvŒ^ÄÓ|¶çc}ÓG’€Ì&<ºm@W 5iØÇdXÃÔ–Aê£,ùÊ·>Ò’} Ji+ Á…k6ôQ–|Ý`cKA÷üJCðáò^RÒlð(О¾h8¦gúÒ³†É±ë{©¡²äo}¤OHÓÙ³†h+ Á •%lìSÐGòÙžBC …”4< 4ƒH2Òp^’%LÍ a•! qí =†…å+M¥^aÁEXè" Y€Â#=†E '™L7![.šÈ6‰VxÄ߇EJ&iH±0§ëŒ,YjÏé…DU õª%K—}åÚVºËc㊫–+´:ÄS|¶çc½è£ $ Ø„G· h“P‘‘†1½×t+k˜ÚüJ}”%_ùÖGZÒËOö)(¥­4®ØÐGYòuƒ-Ýó+ Á‡ËzQHHC°Á£@{úMáOo:s€†CŸÞ„º 4Ôqé#}ÒëPö)(¥-5d®¢!c µ…†ÌlìSÐGòÙž¬!£o iCÒÙàQ D’‘†isǵÃ,ŸÚ’µØúhŸaæG ·•†àµú(KVlÒg˜åƒPóÙžBC …”4›ðfù8Ôd¤áœÞ~f9¨=w2¢Ð–¬ÅÖGût‡ÜV‚ ×lè£,Y °IŸ®“Á‡æ³=…†@/ )i6áÑu2Ñd¤á’Þ~:B¨=Ì2ÆÐ–¬ÅÖGú¤Ìˆp[i.\;°¡²d%ÀÆ>q$Ÿí)4zQHHC°Á£@3ˆ$# WŠð9*ÖôzÔɈC[²[é“^:ŽJ¸­4®ØÐGY²`cŸ‚Î8’Ïö½(¤ ¤!ØàQ D’% Ç.½ u•P;Ì2*ÑÒ¢ôÑ>ÃÌQ ·¥†ÌU®±‹>ÚBJ0›ô0¢UñK ™¯\>£o iCÒلǰ ˆA˜Œ4è}ˆ_©©=wòY[²[íÓu•p[i.\;°¡²d%À&}ºNF%šÏö½(¤ ¤!Ø„G×ɨD“‘†? GZ“?ÊU˜&õgzQbáJSé6Éç!‡4äëž&õç ’‡ì#t*EÙ&•¦IþqÃãÞ‚€ô¡U®‰cjÇ(ã mÉ×¼õÑ>Sä„ÛJ+pár E”%_=ؤÏe ¢ùlO¡Ћ>Ê@êMxLQÆ šŒ4\ûdà„Úa’ï÷u õÒâØÄ1·•†àòظîªåÊ  ŸíùXA/ )i6á1lÚ4Td´>O+_Ç Ôž¢Œ/´%/Œo}„ª1¦éä„Ûj•\X¦6Öé•%¯ƒ JÝó«µzða±èeµ^h¹lEC@{ú¢aŸþÅ&-Mj—CY²[é“0q Âm¥!¸ !°¡¡²d%ÀÆ>q$Ÿí)4zÑPHC°Á£@3ˆ$# iåkâ„Ú1Îj;¦f¡>BÃd™"ÿtp[i.Í»25Ë• *>Ûó±‚^RÒlÂcŠò'E“‘†ó’ ü»Kí ~Yµ%_ùÖG[†‰cn+ Á…k6ôQ–|Ý`“–aªó+ Á‡ËzQHHC° aªÓ i-lâ„ÚS”ñ…¶äo}¤Ï”¦“cn+ Á •%lìSÐGòÙžBC …”4< 4ƒH2Ò0ŽÉÀ1ÈD‹e“Œ/´%k±õ‘>éiâ„ÛJCpáÚ }”%+6ö)èŒ#ùlO¡!ЋBÊ@‚ šA$YÒp¦µ°‰cjÇ(ã m!-Jí3EŽA¸-5d®ríŒ]ôÑR‚Ù¤Ïe ¢ùlOÖÑ7…´!iÈlÂcŠ2Ñd¤áHïC,!­•ɧ¡2d!®´ÇÀB4•z…]`¡‹4d ôäBŒb2Ý„l¸h"Û$Zá䌢!Åhåk’¥ö´Ê¤n¡>Bµ)½ ­•p[é.+®Z®lÐèOñÙžô¢2€`+€†„ŠŒ4\úÊQÉLKc£Œ8´%_ùÖG[ÂÈQ ·•†àµú(K¾n°IKëüJCðáò^RÒlð(О¾hH+_#G%ÔŽ«ŒJ´%xë£}¦•£n+ Á •%lÒgZåΈæ³=…†@/ )i6á1­rgD“QQ—Þ~VŽJ¨FqhKÎ ÚúhŸa䨄Û*›\H6²…”%gMú £ŒJ4Ÿí)’Š€^²†”ÒŠÀ&<†QF%š,çb¥·ŸQ$c¥ö´ê\+i¹fV]ûHŸô‚´Ê„¬ÒÖY…‹Ó© 6g\IË5»ª°±OAgÉg{ ŽÌ+iÈ©Y… šA$i8¥·Ÿ•£’…ÖÍFù³[³\û iýläŸbn+ Áå±qÝKaƒ†@‡†ŠÏö|¬ …”4< 44Td¤!­Ž•P;®2âЖ|å[m™VŽJ¸­4®ØÐGYòuƒMZ¦µÎ¯4.èE!e Á&<¦µN_4¤Õ±•£j‡QFÚ’G¼õÑ>ÃÈQ ·•†à‚†À††Ê’‡ 6é3Œ2*Ñ|¶§ÐèE!e Á&<†QF%š,ihul䨄ÚÓ*#m!-J¡!- ­•p[jÈ\åÚ»è£-¤³AC CCÅg{²†Œ¾)¤ ICf+*2ÒVÇøõ0ô1]®ü¹Ð–,ŵ‹tYÓù…ÛJÁ •%ËP¸Ø¥`3Œd3…|À.ò)ÉW¸àP€CRõô¿ß~±ýãšaæé²†üÄ9"†•Q<™oVMhWwK6»I´æ,î’µnš­9ß&™s i‚æ$3ÚæëŠ”àeÛ`:M!¶‰¬"Wà¶ ²ÓäZ›â)²HfÛ`;M;5œ^ ,ÓÕI6¦ÍiˆÀ²íBuš¶h“çD~Àld§ }6­Ld®4Ûf¶ÓT7›p%rº€nÛ`;M³©H"Û h¶ ¶Óô(›¤#ò€€fÛ`;M²é+"Ch¶ ¶Ó”›Ø!rG šm3Ûi²‰MyY@·m°¦a˜¼€-Ý@òß 9ÊK°›çb@¶-7 ö7ó햲ص’mƒét›Ûn¶Šý\üÒ˜6³nÛmH±Ó tÛÛé֨ݠ{€ü+iÚ`;Ý4´[Wbw h¶ ¶Óí4»©#ö€fÛ`;Ýh²ÛbGh¶ ¶Ó-» ö šm3Ûéæ„Y'çEx`›&¨NÖìíJ²X¬–mªÓÅm»Ä*VqfÛ ;]öµ‹b}h¶ ¶ÓQ»,'VþðVhÚÌvºTh¬Äš¿sš6ØNÑìRŽX-šmƒítyÉ.rˆu Ù6ØN^lø/V€fÛ`;]’°±ˆ½ šm3Ûi°nƒFŽJnšà: b·6=K7ÍùßW(Ó,Dûñݵã‡V1›ˆ£"AC[íÎ ‰]ëyù­«qn+Àuµ¡çe«®6¸­pÕR¶{º²ÚÖJE_/×RÓç«)[«ú\™Ùyœ/;l+‚óEY-…c®D¯µêÉ×Þ´ÔùÊ¬Ö !_§ÒRK㫘Z«i|MGK݉¯øi­<ñõ-5¾:¦µJÃ× ´Ô3øJ’ÖŠŸWß’ûï«.Z³ÿ}zKž¼¯PhÍ”wiÜ'‰å>¿!·Ü'=·$f»œ÷ÖÌlŸÜ’Ãì³Ç[3p}hK®ªÏnÍVõ9“-y>£¶5+ÑçÆµäïùÌÉÖ >ŸGÖ’ëæ³ [³Ý|ÎUK^˜ÏÈkÍ s©JçYT>u­-‘Ê'ö´$¹4¯ÖÌŸ¿Ñ’câ³{Z³L|®CK>†Ï„iÍÈðy-¹ >k¤5{Áï¡·ìóû ‹Ö]j¿WÚ²ŸëwÒ[wtý¾bËÞ§ßunÝýôûp …~ƒ¶q«–A¡4ŒsͶ#”Ü?çG¹óÚŽrãœÙãÎEj;²ÇŸÓrÄ;R¨õtLHËI&þ ™Ö“LÜç§øÃVÚŽÿðgQ´—áŽ'i=éÁ9Ðr*‚?¢õT_žßr‚€?»¡õ_ÊÞRmïÏ9h­¶÷eß-•éþL€ÖÊt_"ÝRÅíëç[«¸}9qKų¯5o­xö¥·-ÕÁ¾.»µ:ØU²ž”Öúêå†ÚZ_ëÙRŽêª~[«Q}YdK妯™m­:ôåo-z¾6²µBÏ—ŠµT³ù:ÂÖJ,_ÔRµäëÅZ«–|ùLK…¯­j­ðñ¥&-Õ0¾©µÆÕiœWø‚¶_ÏÐRráJ\Z«|ÚzKf½¯ihͬ÷)Þ-Yè>ÿ¿5 ݧC·dlû\ùÖŒmŸ:Ü’ÝìóÊ[3s}ŠhK«ÏnÍbõé”-Ÿ>×¶5ãÓ' 6$Hú´ÔÆIXJ…>Ò°¬5ƒŠ±ô¡³îÐÙ­­ŽX=:rÕj+8\Õ0cЇ’Rj«j˜1˜s;ò´g§ Îe¬âÆ`·<>íÒ2*™ºUc0G@Ÿ éŽâ”LÚªÀ1èsÎQt§UJš®Õ@c0g 6hÏw”4È}¬âÆ`à;>‘Ï„(™Vc0ÇÔŸ[çŽ L Vc0‡¹ŸîæÕ“L«À1˜#ÏŽÏ@sGÏI&€UàÌÁ`Ç'…¹Ú$B¿*p æø¬ãó´Ü1f’ A_8sÈÔñ©Sî°/ÁÄá^8sÓñÙLîH,É„@¯ ƒ8Îh÷l#w^”$˜ÄÔp÷ÌI?ÇGÿØ£–$º*n æ8œãóqܱD’ ù—UàÌ¡1ǧȸÃ{äÏ6BÇ*p æh•ã³VÜ7’ Ac8sÉñ‰$î É„Í*p 明ãs;Üq)’ i8s˜ÅñéîPÉ„´ ƒ9òáø wô†dB0ZŽÁŒp|R‚; B0qZŽAŸ&ptº€;ÃAÒ”´ƒ©¸?.Á·§HäzVqc0eéÇuêîxÉ„ · ƒ)Þ>®ævEô’ ám8Sâ|\óìJÍå«=Û*p ¦ø¸2Ød« ¢„´UàL¹ìqý¬+[–LÈ­Ç`ŠJ«L]q¯dBØ\ŽÁ”^×bºXÉ„€¹ ƒ)P<®Xt…¢‚‰Cå*p º–ï°¶ÏSJž#×P©]Âßâ/ÛSðmûüR óX¥i/#´ƒ¸æš>ÿ/úø×ôñIú¿/žýýóg~L%nÏiH”Ú?lÙ¬…>ëÃóÇgûy—ÞãòüßáÒwé6VçôSúøˆ>~¡ÜûpY‡èܦœzÁô˜Ÿwäüè›ÂÔŠŸãD¿žt¡ôñK||Fÿ¤zS@Ö/®÷¯ò¸éãåž~ §Îê¯èc”ž=¿Ò“Òz~ âe¬°ÿ³rJªRdþA9 éË‘Bëä¯xÇêÀ~N*Ï)a£ó¶i˜•sºÓ»¬sžýE/!yúà¯éãoü(ÒÏÅ2{`­vš—~õBþ7Á?nƒîòxèãSøðã¾3ß‹q/KõÆëGúïÇYWÉ>Žë¥½øŸ*§ôð_—P¿Ó~îÝçT[¿àsTþÖøüòžë<ôý'ÍUâ}i^%ê¥NSúâåÃôÛ×§w»Û¾xSz߈Kt½…yÚTŸt+ ½gì”SzÕÌ!ãô4{á\sß_ÖFØ>?Ó_œéš„r×õé×tI1ˆ»^ûÕ]ERå†Ë–ºr?Å¿^¸IŸ"fÛéïÜW©OZ,ô“bø«ùü'úQß]æÙô¦÷cýÄŸ’[8¸%>CGÿÀíçô,êÃNßò{—ÞÓXü¸ôôßoéã}¼Ù¾eå¡7”G¾1‡K¿x¸?ÐÇ[úxIßõ/úî.+ý"šÞFï?UïC7öQ?Óy]fç—ðÎÝÆëF].>kòõÕÒúïëÙ›ó{~•.«øÝ†¶àâ¾*¿$øóKüë•ü[n|§$ßfp¡h"=VŸh-Üm3h{ŸÌ {}­_}­×Ý3X¥;™ÁÞ£¥7«¾ßü[hûP)o|‰'SO!k¿>ÙÔ¸§Þô>›z7ö©7~;So¼îŸúÝñÔ_ßð^‚$ÿëw {}‡ñä&À^Oò‡ÏúQÞÓ= –BÒ +¶]‡çáó~¡ bx²;F£ÝxÃèÎg÷‹øÎí¢Ývîít|³\Ÿ¿ßcR³÷ï1دñ‡WÕ¯(-È…þÉ7p7*nzŸIîÆ¾£¹ñÛÝx¨ Í»÷Ѧu×s=|X»Pã´{¡Ö¯~¡ÖëîgQ•N=‹úã߇™–·S¤óD7Ÿ…»íæ³½On>?ö91~;sb¼îŸ“œ“.‡È_æêã|X§¤!Ñ.Ç0ÉÇ9ÿ´|ƒñå!½Q1­täõv0âç%ÔýFÇàkÎæð}‡EßãeY=ÿ¶½ÆWn÷·f¦£P?Õígàn¼ýLï³ÛÏ}çö3~;·Ÿñ:¹ýªÓè¿òrA'[þgÿI@ۄÓ…yîÆ©0½Ï¦Â}g*ŒßÎT¯§™Šªæ´Øž,0³p7jnzŸiîÆ¾£¹ñÛÑÜxݯùõoù×ÿOPƒ§××xA¯¾L´á2¼mû…rzÓ­fX¸•6½Ï”vcßQÚøí(m¼ÞGéík˜}~û~‡®ß×¾²Ó—;kZãe ÓØSaÔ7yÖ`ü4y{ø­súÎd~×åºíÆè_è 8Ú\\Ï¢O¹‚¢EYé#P½ß6äœ<‹ó-žªß—§ÉðA=¤+7…Jý¦°~õ›Âzµ¬sU…wÏØ—¸¾†ÿWmßÙ1'tÍõ™’èž30üÀ}í~sêBaºË[?×±bE:m¤÷²á^_äwàÓýšTâ%xÿûk/Iç†%¤wåt½÷[縮ù×Р5<,úôª>VFqÛÃ"}‹;ú2à`†½[ÏD…ú„3Upæóò•ÓxN¿¯ÓâѺÑjénh: €ŽQ]{*³êÿ…ü>zþìÓgÿ™kÓg¸žæ§\[,]®û»ú “r-ýýìWÿ‘pÿ'gAendstream endobj 269 0 obj 6593 endobj 272 0 obj <> stream xÚÅ]ÝÎÇq½çS|I#Érþ{æ6°('0`H¡cÐ]€ÈÌñMÞA ™HDE/èWHwïô©¿ÞéÚý–2­ØÍªSÓgªfú§jÔ=tñŸßù¤ËøüÓ'k÷° §®ß^Æ?Ÿ†95‡e{øÝ“¡Oã¼ÉŽ¥ÛŠëèO!K„ífjþöÉ¿i¥—¹cå°ÓЖu”Û8’t`c8YRj/cGê9ðZšû”¥vXfƈìIã/:RfÈ2„rnsÞÈV4a^dO‬q™W´ ûœ=²WFOè;?²#H֘İ_±Äá£k‰Ã¹‹$œÑ“¹Øu˜L왳̎‚¶à¶0v`ƒÑ“™€5È8žÖd½0$:‡°V$ a,qŸP]߇±=,=çGôd.v.³FË=qˆ¶à¶0v`ƒÑ“™€5’)è„ÃíiMÆ!Ð C¢#qk(ÐÂE‡nƒ¦FjÏcÈžÄEÑ‘2]–!”s›sH¶ÊØ »ð#{dËt¸¢UØç’½2|Bß’‘C²Æ$ºý‚„Œ%ÇAè’ÚaæoÙ“¹Øu¤Ì0Ók„Ú‚CØÂØ ~DOfÖ¸Ì0ó—‰´§5‡@/ ‰ŽÄ!¬1‰aæ¯i,q¸,„Þ)ñIæï Ù“¹Øu¸Ì-Ó;…Ú‚CØÂØ ~DOfÖH¦ ·§5‡@/ ‰ŽÄ!¬A¢@7–8Ü–Bï”Ôfþ¾=™‹]‡ËÌÑ2½S¨-8„-ŒØàGôd&`d :áp{Z“qôÂèHÂ$ 4pc‘Ãq˜#½SR{îø¤Þ“tˆÃÔÓuôN¡6çlYì2îzÏÙZáÐ ‡ÒžÖ|YAß’‘C²Æ$ºŽ¿S¤±Äá4Ó”þèáyÌQš·Æ´êq¥)xËøk¼#2[ ÖiL ®² ±@x;±”-à/wNʧ…s(z2»—‰Óò,SPJ[p[àØàPôd&`d :áp{Z“qô¡èHÂ$ 4pc‰Ã4œhî—ÚÛÆ_²'s±ëH™i£Wµ‡°…±üˆžÌ¬q™iãs?iOk2^‰CXcÓÆç~ÒXâp^b½wS;àÍšù=™‹]GÊ Y†PÎmÁ!laìÀ?¢'3k\fÀ­Â¾àö0| †DGâ֘İ_±Äaˆs‰æÏ©=m|n,{2»—™âí¤ù3µ‡°…±üˆžÌ¬‘LA'nOk2^‰CXƒD&n,q¸±c ·8SšÎèÉ\ì:\&Θ²LA)mÁ!laìÀ?¢'3k$SÐ ‡ÛÓšŒC †DGâÖ Q  „‹Î}šÑ$µ·¯/dOâ¢èH™i£5µ9‡d«Œ° ?²'1A̴ָñ5ˆ´§5‰CBß’‘C²Æ$¦¯A¤±Äá˜æCDá˜æKœ¯Z‡˜_§Ž…h öŠ‹ñÖ:ÄÌÀ Ž[Rj/-pá„·iÅûû?þ„™ÄØÇ92Êb{Z#¢'w×a=Sœ ­´*¡¶à ¶0h`ƒÑ“‡ k躵/؃=Œè…Ñ‘„µ"hk¾p¸ÄÙÏJ«’y‰Ó£‘¯8dO¾â]‡ËÄ ÒH«j a Šž|ɰF2p¸=­É8zaHt$a š@¸±Äág?#­JR{[ùŠCöd.v)3­´*¡¶à¶0v`ƒÑ“™€5.3­|U"íiMÆ!Ð C¢#qkLbZùªDK§À]œý¬´*Ií0ò‡ìÉǯ»Ž”FZ•P[œÃƒÓ`Ñ“OaaË #_•H{Z“ ½œ ‹Žt( kLbùªDË'éqö3Îì(=NÖYœ¥óžó¹øY‡ËÄ ÒJ«jËóôb‹Ô 6¨óžóÙx±F2p¸=­ÉÕ :ÎÕyG>X/Ö Q  „KNqö³ÒªdIûf#_qÈžÌÅ®Ãeâi¤W1µ‡°…±üˆžÌ¬‘LA'nOk2^‰CXƒD&n,q˜vÇFZ•¤ö¶ò‡ìÉ\ì:RfZiUBmÁ!laìÀ?¢'3k\fZùªDÚÓšŒC †DGâ֘ĴòU‰4–8L»c+­JR;Œ|Å!{2»Ž”FZ•P[p[;°ÁèÉLÀ—F¾*‘ö´&ãè…!Ñ‘8„5&1Œ|U"ECÚiU’ÚÓÊW²'qQt‡im¥U µ9‡d«Œ° ?²'1AÖÀ!ÐÁ¡°§5‰CBß’‘C²V848ƇiwŒ¦‡¡ßâpùëBöd*Î*\dÿ¥7 µƒÅ2=™†b‹D 6ÁpkJ‘ÑìBŸèHô[(À„ÁMõéŸß¹ÿáœíæé´†ô;'«…y¡Ì/j$s»$Ù›ÅAšÉVwMfJú¢Œ²’A§šÞü3ů ”nÃR3QK§ ±Œ$€ë6Œ5S˜t" ËÕšnÃZ3¹G§˜°,–‚¦Ûd­™ö¢“/X~ÐuÖš !:-e>M·a­™*¡ìYNÐtÖšIú(›–4Ý&kÍãuuÞ»#˜ÿFŽÎ›õ¡(;wnóÍàˇ´ú¨FI·a©y|©ÑØ9]AÓm²Ö<ØÓÇKì èº kÍ#/}ðÂÎv€¦Û°Ö< ÒGìÔhº kÍc½YÏ΀¦Û°Ö<@ÐÛØl§hº kÍ­u½ÁËö šn“µæ¦³Úÿ¤ÍU`«&L5öbõ!Û„–nSÍMK½uÆvç¦Û0ÖÜÎÓ›Jlß hº kÍ.½ÝÂvt0‹Pm²ÖÜÒl¯èº kÍͽDg»@ÓmXknèÅ+[M·a­¹ ÖË:¶ršnÃZs©©Å-aRÞ‚ú<Ïñ÷zÌg’¸%¬?ªÀ[P±9þªù˜³D+*ðÔ§^Ž¿ýb>¹Ã-aÍQÞ‚ú ÊñṘi¸%¬6ªÀ[PŸ 9þŽˆù| ·„uFx êãÇ_Û09a–(«ª ¼öŠ‹_«0_áòÆ`mA}»áøcúãÜV.UÜ-¨ñÀ|h‚[𥠼õ€ãï˜Ï10K´Z©oAËWÏ›pKX§T· JÊkÌMi?·„Jx ªðú¸ÛÀsKX›T· Ê“ë•M™8·„UIx ªˆ÷¸ª×SsKXT· J]k_MÉ1³D+‘*ðd}èQ½¨©ÊåfJfW t ª†ò¸¨R×±r3XêTq·  +MÁ'·„ENx ªï¸>Ï”ErKXÞT· ŠÖŽ«ØLñ ŸÎaaSÞ‚*í:®õ2%vbâX–4Uà-¨¨ãŠ(SˆÆ-a1SÞ‚*:®2åZÜ–1Uà-¨bšãêSÔÄ-aSÞ‚*99®A1¥?Ì-]ªÀ[Õ‡Õ¦<†Û)k–jj—åH‘çí)ضX­ØÌ2 ó²jÆ_¢/âœeöü¿ÒϿƟOã¿_>ùûçOž>[âôûyº¤”{Ö?ìylSŒ‘e}xþòÉ_Ñu]øÙó'‘)Z_ÌÏÓÏ'éçW\:ÞÖuØŒô/¸LŸ'Öò‹n˜„\Ø59q…ý0Æ7€5º¤ŸéçŸðóyúùµÐžã¾_Œöoòu§ŸO…xz_vö¢þ"ýŒBr]OqÆ`$ÿVÅÅàX±þÏRh˳v-ô\hèâêµ›ŒñÐÏÕ ûeúy*$‡ˆ9ŒFrØoÃ,„£Æ™¬žÍ ãÍŠ’Öþ2ýü•½ŠøZZf ,Øâ}éWKä¯àÿ¸_t—¯'ý|–ž>ë;c7Ÿ–ªãõcúï³Ì+·>Æ•v?Zò?“Bói]BÝÓ~iÅcÎì® ¼iîOÛ²mFG¾mB'ÍPzk±Ba9?„”Ðçàì…yn¥ îZç2p–ó9úMãK‰ÓW f¼:4BW¡TÅWÁ–:s?ÇŸ^˜ÉjÿÆDRdbI¯%("x‹OðÁ募Éçüpšg{™/poŸÉÇýÅÂ?|ÅÊÓvŠÒ¡~Õ1Ä/8nšƧï.=<­Þm)„GÈ»øÓÿIhŒc^KU4²‹ü!ý¼–w²;­Fþ}úùŸôó}úù&]Z~`½I?oÀ:ÄG©5ù´ßã']p÷Çôó!‹ˆ‡Mœ±¬Ëbp²Î[\ÏòuÖÁèd¯ÓÏWéç.ÿ,NEÂÜW¸;?s¿ØÃ,MÊ%ûë¾Úañ†¿Â%ÇÇÊõ˯qá¯Á¡¸™Å«–´¸‰ÏùC¯RB¯ªhz•–¿Á«4Ä­^¥q<^¥uåU–»+¼ªÊ¼Š_í=ù~8UËoAšËe(}Å ¡9Íç¡4˸{ûTaà#¸Ð•¯´3ú†wI!{YcÿRò·8˜‚¸ÙÃŽËÅ”Îã|Ìpw“ÕX¸“— óñKoN‡9CãI¥„¾TÑ8ô%-ƒ/iˆ[}Iãx|Ië<Ê—,wWøR•…{=±®[>Íi‡5Œ ×’BײÇ®¥äoq-q³k)—k)ǹ–áîת±pѵÎ@¯!øœå|¿-ëwbLÒ9Û“÷9´SÃÙ¤Ç٬Ʊ³)ù[œMAÜìl ÇålJçqÎf¸»ÆÙj,üTΦ_šOŸÍrßq)±*儸æžùÚ·—÷t:“û wîk8Ó+\Ö7únvóX±4,òLb:…ÞšÊ}‹áüñpuN8CcU y‚Èj\µY1,éƒC”Ù½„Më:·Ð‘a[OCoMdàÿ«Å$9U®¯Ìñßâç{üékÜr†w¸CÛ©ï&ƒüµŒÁ¸¬wÉzT)œã¨’¾Ü÷çƒ9ÑpfþÔÔÎè|´§“þÐØ†UB¯´·y¥Âqy¥Òiy¥¿Î+Í8ïæ• ùf¯T87y¥Âx´W¶NSÊsÖc¯TB¯¬hÜä•Çã•Z§á•Zü*¯´ã¼—Wjä[½RãÜâ•ãñ^©&:þ™2¾Bc7[ yüÓjÜæŸ ÇåŸJ§åŸJü:ÿ4ã¼›*ä›ýSáûç-Wo_ÏÜGˆÎºÿåÜÆ†û ÷…ÛœO¸|Oª´\OJ_çyzŒws< |³ßI˜ŸÂíªþ•³t›àJÈãaVã6S8.S:-'Sâ×y™çÝÜL!_åg—ÒîÊ=N!~,—;kf©ÿ–üÿ ÷<_ámýúœ±Ç®þ™óÕëJÈãŸVã6ÿT8.ÿT:-ÿTâ×ù§çÝüS!ßüT8×+/5¹£ñ¦UBG«hÜähÇãhZ§áhZü*G³ã¼—£iä[Mã|4G»îxgÌEFw%äñ;«q›ß)—ß)–ß)ñëüÎŒón~§oö;…óÑfz=¯øF}c8ærº¹áRÈãVã6ÿS8.ÿS:-ÿSâ×ùŸçÝüO!ßì ç'ö¿ö!Ð2žâÝ~SŽÐ(2ºq¸òpïk]* œj(oñ§opQ´7ô–]ã…“1¥˜¬=t%ä «1ÈÛ[ÜÞȱHñF5° ZçY¹Œ‚hËTQc7ô{évßé2žÁŽá¨º€'UìiÉ á9ÎÑ/:;ž?`0ÿ+Ä—ˆ¾Øëx-ckŠÙÁ£òvëOS¿Ô/¡ò@)}Qmyþ “yÃiI5P’Ö¯‡t¤<öF’žßÊ'Õ[åÏ—Ÿ jP‹%°Å°úq:?´kô¾/ž-ËTâÃnµôL{ƒÑþÈß_ÉçÒyºU{¿ kªKnlà*!GÈV4nÙ ˜'d­Úu!«õ/‡¬–l„¬o„¬¯†¬j„lõ.‡ìRͬ#b•àå€U‚W=¢»¥r°ýš@7*:Ûi^­¼öñ¥ú¼ôé‹ã”Bž´A æ A£ve*ýƒT’­Tâ­TâõTB­¬]ÂANçoª8bPI¡’¼CªAÝ/¡j”3ÔÃxŒ>;Îö†xãq8'ç8¥'­Æ#âÑ‚¹âѨ]Jÿ •d+•x+•x=•P+k—pý”¿¹äˆG%yJòñ¨u¿xì€ô¦rl!°¾– Óü¹¹áøf– LÂécZ‡A©„AYѸ=(+`ž ´j×¥Ö¿”Z²”Z¼”Z¼”Z¨”ÕK¸”ýš>O¶8‚RK^J-ùø Ôƒòl9}/7•Ä ñ;™¿óá ÁçÄjïöé3’ScKG yâÎj<"î,˜+îŒÚ•q§ôâNI¶âN‰·âN‰×ãN µâ®v q—¿}èÙÒÑ’q§$ïwjPθkMBûüÝÊÆ¾ŒòÄÕxDÜY0Wܵ+ãNéÄ’lÅoůÇjÅ]íânž˜‚'Þ†pÏXS¹)Öº@ÙðRµü»Û‹.º± £„<g5pÌpFíÊ€Sú§$[§Ä[§Äë§„ZW»„Ë·…¼diÇœ¼vJð‘§Fôg¼Ö«.}æ½kl·HÏGµŒÂíag±ýéÙcQ‚—ÃM >>ÜÔ€îxLX#ö=×ú ³ -ãòÿÿXwöÿ’~òÿ>yþä³'ÿ™¿ù2þ†ó·»·)I–7ºüdzë¢Eÿ·O~óð÷ÿxØ«endstream endobj 273 0 obj 6423 endobj 276 0 obj <> stream xÚÅZÝŽG¾ß§8€ˆ0ãéŸéž¾ òÚŠ¼^È"YʉP nx‡`/°ÂØf½Æâo@õÌtuýô™3{ìE»ËU_u×TUWÕœ~×Ãüú¤Ÿþröè$;ïRçÆqw ‹Î;ïûn0n÷í‰u¦sC”Ð'”¡™gAÁõ7'¿Ur—edØY"ŒNP’sD[¥t­?ë“’—'ùo†¡ÃØù(Ñm…¡µú¬,ÛpˆÝ8ÆjC4.R2Ê´ãE†òÄ.L<¥¬™ QڱцŒ2mµUž‚^q¨>)IlˆèÅBŒmˆÚ£@Wª,Û0 „jCXc kR² ±!PÜÄSQæ5³!êÒØxî&eÖ†6Dt´!Ó'%/èÅBŒmˆÚ‡[6´Ø)Ë6L†jCX7Pû0ÊtòE†SÌÄSQæ5³!ê³#6Ú‡Q¦s£6J1®­ŸÙõáñ½Xˆ² Qá0®­~±á`<<Ú0¯Ýè‰ 9%ï¸ÈP¯Ó£ ëšÚ°ê*6¬ØÅ†œ’·\µUž‚^q¨>)YmXÑ qذjCŽ]A¨²lÃà;Ÿª a™½Z ö‚%æ+Kf½¢EÁây[„IZ®£á¨&!v©‹Mè:­è!ÿn™É¨šl±ÑuÖ“ÁÚÌ"Œ2w‘¡Û¥‰§ ”5³êÂC#6Ú…Q¦#£¶J)èZ?³êÃÓ#z±#d¢6ä(ÐZýbÃ`,€Ô[8¯#»sÛÏnáL±ä®kjêKc— ¶)žÝ½¼ ®OJ^6Ð qذj#–ÝÂ\Y¶!ìÂ’[8¯ýHoXN™N¾ÈPJ¯¦ÞÂuÍlˆºðìˆöa”éܨ­R ºÖÏlˆúðøˆ^,ÄÙ†¨ 9 ´V_lz©7H^Gv;pÊ´ãE†óXWS`]3¢.´!b£ eÚ2j£<ÖÑDÈõIIbCD/b„lCÔF8¬£é+Ë6€ØjCX§ÑRû0Êd‹E†óø‰§¢ÌkfCÔ…gGl´£L–@m”ÇãŽF¦ŸÙõáñ½Xˆ² Qáðˆ*HU6ŒôÕÆ.šǥЧdS,"”e„?k-X×Ô‚¨©¼"ãpJ6êª,»ÂPmB°š¯b/Æá0êB†\1¨*³ËÿA§<ÿeî”ãà»1NÕuìàÏ8”¼"Ydu gÕ7¸.+–eÖÕ·»ò¹Å¼Tý´^“–uÞ˜^Ë~uoÏ/;OÒÜ"š\£¶ƒÝ°ìÉHÛ‡hrÚö‰²[! ¢É5j;ØAÉ:ž´ M®«¶ƒ½…(sk Øb‰ª”ܲ$µ&bÉuQu°6•) ˜\We«6Y;òÑ嵬gä­J.nD“kÔvð¦—÷ ¹ÒM®QÛÁ;Pæâšì ˜XV]‡î†eí@lÉ.õï3²XEûÓæ,p©¡Y*$ ö[–`…ÚvÊÜ2aÔs®-³8=Ý:Ó3¡-s+=1Ü:uѽÿ–ù„ž mP¨–ùp7¯G([SÝmiátó¼µÑeð–R]7I[‹u]2n)kuC±µ°Õ%Ö†P×Þ«@¤”(FJpC‹€ ['ûzļe ®¿?l‚ëqì–‰±žÕovê±Û–É žÉn ª™Õáiš^néÉÄ–á‰[mmüuº¥IÖ㉭M²îÖ¶4”º•ßÚPêþfCÿ¥»ÞýRJ£ %„±E`qŽãJ´´Yµ•Aý\·þýN˜¦’PšÀ)ŠZë_¹ÔÇEª SI8Eñégý[úG5a«ÔNQ| Yÿb¢>TQM˜®šÀ)ŠÏëßÔ碩&ª&pŠ|ö¾6‹W_<¨šÒNµ@SóéõµüF@Õ`&lâ¦(†¸ëS]5L'šj›ÕNQŒ:×gŸjäL5a¶m§(‚ëB5˜¥š0Ï6Sc³õ9š_RM˜a›À)ò ÓêÄIøˆL­-Ô¼.Y³ðÓµzÍ’ªnÏ8ÌeSÍöá–ÜÄܪÿ)?~Gðÿ×'?;?¹ÿpܳ;Ï[Ê œÙ-Í ] ãîüòäÇÏú¾ŸœÿYLÎfGÅô ?Nóã Æn «Ú¤Ø3&º¡×˜Ïzë¸_4¶ÅÇ÷èÁÕ½Vòã"?žâã,?~ɤã×EPÒ_NûÎGŒ=Aœ÷zS?ÈG9m:q*9ïq&¸ðÚŘÀª}¯ßÔgŒÉBôö^1é[çšûj·¾¨Ž¹ljŠ=ž9=çcœý™Æ%6Æ*Ë9•°’¨<ÞTgZ(W¼½càùjBRÒÄÓkc2à Öh=cJ~NB‚é mv¡×` WöAÉ<æãçþù¨óÚ`»à}^±o˜”1EÛ¹Ú–{€»P‰ÄôF ýD…’[„|¥Î{œ ’¸Õ§yö OõP‹z§øzòŒeeCsu‰3Ô × Km{Ûå{|²t„¼pÛûÍΙ0‹¼†‡ùO‚P2%×’˜’æMËq;ùÍu~|—¯òã–g>¸Ûm Ì£Ôóüø;K¦ïLð 1Qý»ª1?ÞÊDeõ^LÂ2EåªDr¾B5ì8.ÂEÝëóü ó/Æ>zÐû¸bL *j«[-úo–à¾õù¾mmAï¸8@HòNDö·ùñž_•Ð7å¢UpNûxÃ]j$gçsÜÂ?&\N§¸ïKyÞÛâToqðî-¢^SÊkÄ̺:—lg¬mÛ÷Í,Ö;Üÿ-â×­wŽðOt¾+Ü!3y Ìcçëµ×LÁ´!0ÇflK`j±»¦”ߘ’ó@`Jö)Ù›)™fs +ÂTDlLÁ¹˜‚óÈÀü)¼ìaÌM Qy¾¢pÉ6¼‘†è\¸¾Bo¹Æƒ}‡à¯1Šš[Îpµ`\ÜΕ'9#†¯‡æÒˆ^Ƴ%x•ÀÄ®ÂÚºRꎑËÅW—3Š[Î}(l9w;j9Ï¡ mè_‰ÙÜ~X³%fçJÌ Îãc¶ŠY~¼²Ú~Û4ó÷±ó¿‰ˆ½ÿpà%±MclþqHî ©“Ï=|µß_pCEÇ¿ášI °Z‡~1¬' δ%Sh‰HlS®PbwLB~%[ÎCéB°Ê‚½0ÓžŒQÞèG¹ ¦ãuƒƒý9?^ª­Øîíé§Sû°.¬åéÖS€µ¼NN{,tƒÛÒQvËöåG"hôá!ÿØ"ö eP>Z«ìþ{ƒq€bßÚZä_Ó@Ä|ñ› >ÄÉ3­ $‹ú’ÇàOO™AùÌÜ( ç ¾êwÅì=ÜÚ«¦k©­8>)t ¶¬U]µ_?‚¢4šmëu[Þ—¿Š+þã2Pn»Z`«¨‡¼5øÖž›ˆ2á&5Íý×[äF' HEÖŒJ¬²óRg¼>X#ÇÀ1Ź/ǥؙÆößâ‘ßð$p³·Nò'4;r_|‡YƒêŸà¹.Á.¥oöEc}ÕC×ÐZãŶ Ø—ì·˜Ðyš6±sÈ${Í6/U®ÎžrJ†¿wo¡Í±ím¿D÷æ{R÷Ê:nþö›£t/î;}ÈÑuC´+6¹VŽè!+{-R†%jskúˆí»`Rã-ßò‹ë•Òl¹Ù±Ä5æ¡ÿÎÉÚ‰2-úé; •{úéã_|öÕÙéÓÓó¯œ~úôôì¼™èó]&óÞ»LÜ"¯ù±žÓ*³yáܽŸT·Ro Ê9æRâ‚GßIæ˜+IndÏÄÙö]HCþ kœnXÏqÚSßú€µ^z©C7×¶^™v_’²: /¹ßó,ã»qlÎÅÏ®3VýfãéBNþß}_vfúÌͼq8¹QåÄ´§÷õ¦]­ï<$UG:»í¡$%%‰sD0é­´£Iò])ÿÏ!¹>žGð& „®©íµž ıljïþæÃ“©Ï£Ò…ÜÁ„äÑ. pŽqµ•=. øö¸€àúž]@h[qÖî˜öÔR-ÿ3î nHŽuŠyE¾ÚÔþ¦U¹<I mƒ?Áâ]cwó&xÅ=ô½Æîó'œ©1œhÇ7p6ܦºúÌe«FÓÕ¤rÅ!7ŽVˆš_çÇôÓó“''˜~Þq Ϙ¦Â%?ý<Œ.úé§3!1Ö"ÿÍÉ—»ßîÿíïŸñendstream endobj 277 0 obj 3286 endobj 3 0 obj <> endobj 57 0 obj <> stream xÚ•UKŽ1 Ü÷)zôŒ8NrÖˆ‘8@K ‹7HÀ‚ëSί{³`f¤N*‰rÙÎãýéØxú³ýÜdgüß|ˆFIöãeóÿö…ûfF5”GȘrû~ß¾n?Ü™åæöý/Öê§áx^‡/iÚoíûzÝab¾üñÓÞŸû(>2 §ºûàIBJû¯çM"üøBeñ@’'Eª9 äÄjðPI¬ì.‚T2ÕJ`*µ…AfÑ} pl¨V›øî7[ n‚ãJà3B&)»$² I…ŸŽ2qÚ+)ÎFJºÃ{)ðFÑÔ/»†å*û°}¾h%—ç.˜rzbL)4Ú ½R#ß@%Vð7ŠÉ&Â%ÇÖv Ç° u®Ú‚RÔ²v$«Ï1õ!…v@-¬˜b½Â„¼LÓ–±1Ÿi›[3w/#I㊕B>³wQá-yrÕ^¸ÿ«kA^‘ÖméÚÑýzo p2ºoJZz$'b”Ó‰`î•ÑaF}4X÷B©Á2{X…ÔƒUbAâ âÔÈavgÖ*˜ÉØK/{¶ •Þ ^˜ÐÂPšêîÔ#QlNä”Pl¸Ï/è ®Vo(Z[ÓãÑwµ7¢®SWÕÐK<ôÈEÊD%786a3bžèAu¾ZIWQ¡žŠ-”ºÊ‘ Ö#tÉ„Œy¢B.º’×ô¤|ü+Dì;7t°j}_ãÆÖª\‹†Ð¡x·ùË$-¾Tx¡›L)è2ê`ø;¶k{†`Ì=5xWÐá¤ä6Wz÷²›/s>ŸÖج$-pi·V„ï/ˆ[~¼F[dèxü ÈÓ‚OO> >> endobj 174 0 obj <> stream xÚ½VËŽ7 ¼ë+ú¬H¤ž×½àƒ±¾9u`ÆîÁðÁ¿Ÿ")izç± Ãð4k»EU±¨GØ>í.lŸ~¸o.nÿÞÉ#6_bÚög÷Çûǰ}ù.Ï(OüÿFò Û{=ç¾ýØþÄÿ¯.mÜ_#×?.’¯¡l±z.q{>àRë”RÔ9 ŠLíÈK™'|rϺ^$è4LY†É*:t@}yÈÉ®sX¼»ÁÀà“ôÆ—ÆÜr, ù÷3•Oî_÷ðÓ•"TµïR¦ècáŸÜã}Ùbð)Ò |¾äÙ2TZ|–)Z¦/.ùPÊÆ¾vñÜPòµÄßjGœXâDqÄ»c|•B9ëa±åÚÝD‰å7@ã«2rY,¹jmM.2âÈk‡KŸ¯²‡‹q‘W`Lª4ÂÕdÜ š¢­7æ‹ç| a -×än³LdÀÔóå Z;ä*ÆK ¯[…žÈ9/¹}*SW÷=žÜêøŒ×ZþZsŸ–Oaø .‰/Â{,eÈl'KÙw9ÜÇ![¸y:cóÔyŠ8Òð”G×ßm*Š>n b+ɧÓV†mÓ<9‚ê²{VËM®jJ~EaÉ/R>(LtP¸€(Ô=ö¨ð…@~hgÆR¸ H å$qqÙÏ/½÷7Eije0¸f’¬ Âý¼#û¢´ì]Òv]Ý\ÿ¿9`@Uæ µ}VQYQ)¤“|tÿx•­\endstream endobj 283 0 obj 934 endobj 284 0 obj <> >> endobj 257 0 obj <> stream xÚíMhW¶Ç žlù£#µ%dËùPóì¸hmF¶ÛF3i„P¬ `!›Ø‰°Â#b;(ÁØZ8~‚ÄA$Ì ð< …!A« Å´1ñRx6"k´ÈÂËyÿø¼9œÜê*µúûãÿç"ª«nݺuïïžsî­R÷¿ÿMQEQEQEQ5¨Û·o1êííÅ=úôéÓÞºÿ~ñê044„KŒöôœ‹Å]‡]YYAɶÑð1ü”RJîZ„ªʧ€!ûB‚Â/“´¿?~,{,º—@e {zÅ>xðÀ}Ž=z”±Åp-´U%°'w-šžžÖýÚ•¢|j‹öɾŒ¡•´Ç/„=Zs2¿þúëírFP­²'§„°'£ÙÐVÒhh=i±œë_<öl•˜J`OJ@Uq-~$CsŠ’­á•îxöìYHMü‚ ‘Ì[öí²'ÕÎXÏ-Ù“ ÖžÒh9÷¦V)¼7·Ìà°‡m½G5p»AØ„W@kÂ^ÆBØ»g{ÁnãDEù(1õÑÈ©´w´qgþ !‘(TËǵ ž­¤TÃFzÅÑ'yäv2Ƈˆj58töHÅœ*9î[£që’œ«ݵlhNV~lÐ޵„ ²eªm—£úQ “eó行ì1§µQ¦ã[ý'jãKë9%Ø=Ò#Z‚?ƒâç@¢ícó‡x4­ÒíßË9õÑKÛj(Ù°‡:[H$„vF®”£-é„1ŽuU'.¹ã+­£tZÏÁÃÏž”&ƒ —–dÃb£ •”A Ñ2m5¹ASWÿ° aω½u†‘RˆeÑ£ÄÚàÙ“j딊 Áî¿+-V µ´¿Óª:ÛÒç:F@oÍZf)D:ÝFø2Ö´§0ÐÈf'¤Â¶¶Œ²ço Á¨GmL%ÅŠ9ʈßþˉ:”´¨³6¸¢ +ýÔ[}*^À¶§`Äž"l¬=%|š#•·©ùí¸ÖX%Üîõþ^{NÍC°ß2Ö6â§2ö–ítÍ èúƒCô²tDFö¬‹ *Á¹#mIYå>rØÓªZÓ‘¨y´§¬CTão»ÏQ¶²\*ñÏÚ‚ØÓþ Ù°çì´èÛ´ð‰d6ñ^P d´ÀÙ/( 0ŽWE_;®A  í)äA›ëm:n%#{áÓL{×z;8ì9·ïï-+ 7{ä÷ gOVýÆÄÖ§Øì‰µÍ¥ ½ãÄoAëÛ%cOÖT‘Ç™zkàáo%é *Ò^“Ô£Éä lù\×;Æ*ã]ëÝù;4öÐ[²gòmŸ‚Z^¯ë ŸphsfÏBžÑhKsé8²¤¡SBVZ²œç:qKÆ`&œ=tä8)­³"¤P`ühÙHÉYøÒ^¶­‘˜Œwm§*ÎtVK¬KUß'ë*þ 8 5þ†›ÍÚ²ÌéGƵmÞ²§õ× ŽC…~t…ölY²§M*+Bh½YgŠf ZW´íƒTKå"¥TÝ«Òáïz5~ö°G`m g…­½¿Ò¶Öð¢|ìôÏnl[-DVg—–Æ ãŸ²9‘UÙ³ñŒ3›p AGØ•œ-Ÿd¿¾—ñ¢>Û Q·K1!å„,­Ø=þÕ g iÙ³­äpƒ¬½^ÔaÏš Œ8µp[ˆùÚ`ÏYdó·§,ùfÿ.D‰úÑŸÁÙã®úðÝyÿCbŸ×‡ÿÛz—@c65t¥WŽ…—èt•#n× §e9Å °Ñ³zEœ‚~”j ÉÖ0êEgáwí\T{ÇZu[xÆÖ¡Íâ/D‹´[ÃÒ¼Ž’ýã<ªON)²GöÈÙ«s•æ-¬ZMZOa(Š¢(Š¢(Š¢(Š¢(Š¢(Š¢(Š¢(Š¢(Š¢(Š¢(Š¢(Š¢(Š¢(Š¢(Š¢(Š¢(Š¢J££¹¹¹™™™……ÝóäÉ6•Ö××———ÁÕPÿP<·ß·Æ5õ6ö¦¼TO¤G÷t6wÚÌÉDrìݱÙÙY`¹¹¹É†¥üZ]]!à´€™¶H[W´ \ {ÃW¼+ŸzŸæ–.y—¼“ 'e¤1ÙAùM4??¼Ùìu«çÏŸ/..޶6µŽ!à´äLÚ–éºwå÷y}Ç÷Þ±ŽØäø$°g_Ô?…ÙI%S;vv7uŸõÎN{ÓÅã-$Mz“i/ ìa100ØA5)t.‚7˜ Þ…²ðd100!',µä[aè:öw só ÞJ“!&,0ËüÖª¦–7®Ý8Ør†nÊ›ªpêl‚Yþmâ‹ÃV³«ÎÖ]ýðjËÞ–¾]}å çòO°Ò°Õ°ØËËËìÓjY09úêÑô®ôMïf•Rg,vW´kdh„+„•oî0sIJ¨³éío¿ö‡×h+ÜÜÕuš<ÐV >ûø³š4wAë0¢©ñ©¾æ¾š§ÎÀ×[_ÿîÑwìúòêÜà¹þ—úëçt²áäìì,!)’ÒjIYHÞ—$uÆ‘3{Fê†5¤z9M…b/å¥fffI‘”ˆ'.{— 5Ëð“` ‘uâ"Üâàâ–ì)Øjè¬=„s/ÒT—ìU©dª ÿZ+±–csà|íŒCP±3Y ÿ”=±Š~ö첡Î&ÔÉÊY2á- ŠŒ÷ŠªÉñßþ—?ÿnüý®¼YÛ¨Rºt ,NÙÏžšMg§”omlç¹|²VT---%šyö‘<C]Î! ‡d"üÀ{ÚåÝ–S t2À;c§ÖO×ýÈçu¾È®_h)žÐ¶háÚøçǦo$}:MBªh‰¯fÜœñ(ªžn‹´ x•ÿxÊ›:±÷Äè‰&666Ø}5 õõõ±wÇÚ›Ú{"=0ƒ•!¦‰æDÇþŽ{wïÑÃÖž`I`#»"èè2þˆ¤þ”dŸ×‡ˆ®µ©Cƒ/ÖÉt­?ž›öÒ—¼Kˆ²JãU/xz{å't?šþˆ]=OŠ'Ç'“‰ddw$Ò‘£/ åèOÛ{ž¯šJ¦æææøÓá”-ÌMh|yÿË ^Cã5þö“ŽÿI HâFpÇ­{­Í,¤ê™™øzþ#•¥8xÚÚÚVŒfŒ7‚+8nÝhmf¶!•ÛÊŒ÷m—"ÌhæççÙ†Tnºr劲‡íír›J¥Ø†T>W„m²G•ÞáæàvÉU‡›ƒÛ%{TAnn—ìQ…r¸Ûu»d*”ÃÝ®Û%{Tnzòä‰.‹¹eÿÔ•ìQù ìåæµÉEö(²GQd"{Eö(²GQd"{Ù#{Ù£ÈÙ«1Ý¿hh¨4×úõ…ÊÅn³÷÷{ðà(—nß¾}äÈ‘\èéÓ§¸ÐãÇËÅ®ün?\nzzšÔ6{ ]^öp³ÎN˜¾ÒÜ>Îz.øÙ³gèqIضÞY\ …ÝmìÁ~X•GÙü(PÌ ¶‘GŒ ¶+‡=ì±#"è^ Ñ‚´É Õú&Ý c¤¡ôN¥œ ëž ‹Ö{² ¡)d b탺*=E<©ø2¡K›TÚ_ Ñ£•ÆjžÍ½È]È!¹©¡rZ|Ê]KCi‚.lÛÀ¹hÒð‹Ö{¸wzØP›€<–£%ÑVbú¤ ìGN9$¢“‹Jð¹ƒJöè}…Ü‹†’#ðè}ɵ·Œ2Ö][‚ rÑ:´{NI«JO!ƒã_ÄH>6²­­ýUiì©y·½r/ŽÍôÔêÌ\´@¸¶­¶åEÉž´ªØ:|Ú‚ÓŸ¤_*= ŒØ(õƒá÷’={ŽÇ´ 6Vbæ-/JöZðQÂ5AKdΞ?*¹—üížÐ.ëUC.JöЪh(4  •el7”5&•Ïžü[œÖ?ä^²dÏÎ\dêai”e Áß’þ‹’=÷?|´S™ õ°Û6&wØÓ½¢æ¹b÷¼—,Ù›&% JŽ]•œ¸„5t!­yÙgjþçkvñJ$i» …mÞí{!§£a^Jöp/±×åŽ{qÎõÔV†X?)Á™±‚XÿÌ ‹R%ß% ÈEöÈEö(²Gö(²G‘=²G•˜½ÙÙYù…—‹/vvvê¾ðG^¨ÜØËþçDGFFòü²\вìÁpe™yqqÑÞv›ƒ¢r`ïùóç»víÊçÇ(*7ö2º]:\*7½õÖ[ÛbÏq»t¸TÎ’‰jöù·K‡K•Œ=ÇíÒáR¥dOÝ..UböÔíÒáR%fOÝ..Uzöàvép©²°·;55ÅÖ£JÏžàÇÖ£òÑ“òï_]]]ù½ÖÖÖØ\TþHËË˰xCýCÉD)O؇£‡ãѸM‡šéÑ ;å,¤±wÇfggçÆÆ– !MH]Ñ®”—ö†/y—.{—?õ>Í2ÝônÊYHÞÀɆ“€sßž}Â$hœ››Ù¿EÕ’a6::<Ù±¤m‹±í&a4ö6ö‚ÆHc$Ö›Ÿ„gÔ¼Ö××çççSÉLPwS÷Yïìuïzñ`Û2Mz“i/ ÞÚÔŠ€áÀIJíyÕOn|ÅÛ"mÇ÷¿à](#oÓ´7€á€A‘>Æ¡G®v!¬BW«ži8sÅ»RiÈeL#ÞHËÞ–‰&`¨Ù‰U'ø/:„Uèʪ@Îö7ôÃPcÄ€°Z&÷îÞëØßÿU-†.°{€°eÄÖηx“ ÄxÄ,ÄùÆÛã|ƒº«Ç‡£‡ Ø–S£¯å‹X…]@F“ÖórJö)½+}õëd¦PBc¢IÉU– ‚¯¾DíMí\ÊË>]ö.'â ’“¿&>˜èoè'QÛJÍ|Þ‘§677[ö¶d4z?|üÒ—¯©{îDîÈÎìû§dÜÿýÄ÷R”¦¯»¿®4À‚*//?§O§ÉO>ZZZJ4'26ï/ÿúÖ®éà=ØŸeߨŸÿùsÆCØï¯LP沤ÊËr_dW„Þ|4:I„r–çyAm $©9ò³‡^SDåÐâà¢Ú •¿ÃÙ“ÓqQë÷kÙ`@JÓÚZ{t–Ü rZï/·¹eåòdueßž}áì¡ï$3Ì‚ÃöÈ!™)ˆßÄQØB/ËGõíÒãà '"ÁrZÌ´÷Q&ò€g¹–Ôù-º8WNÄu‘pH‡@ÈYr/r l+ùÙT^ÿÅ#™H’¢Ü´¾¾Þi g•8 ËžtÐlçfï9BÉâå\k`… ½–Z-›YH¶W 9ËoÃ~)!›x± "RTTö` Ô(ÙþòûMÛeÙ°‡¢Ä똯Pßɯmõ`…-ä,Ëanì]ñ®ÄcqR”ócÜ ;·dÏ BØ;cýf8{AK…Aìé¼X“ëpT!”:„œ•?{ô¹y ì=M³ìY/©;ÕëôPºO&¼…eOöèLAfµ23ņĄºjíØÞŒgåÏÞYïìèð(ÊY©d*è«{ötf¡;ÕÙ‰›sæ˜Â€ø;ÿ’ÈvÙÓkáB8*Û6°”y,kŒrV8{á•—ÔéYXX B9knn®·±7öÄ¥:;Ñ/êéð×®{X2ýËrV{NiB‹ÌaufáTÌï…œ…ýÎ%äÖ¤ªá•—„P™_%”ÖÖÖ5ÊÿA@Pa?ú±€OPZе0‚…œ~SA•Ÿô&c1ò“§Ò§ÓUú]ReL'öž¸w÷áÉS+++ñhœ8më›$¶ä‹Q"ž(ê7!ÓèQ!Q_¬%ÆW—ùÒrYtkæÖ™½gˆÖ–ÿ¥‹AÊ“,¸Nõœº¸ó" I§šNݽs—¨\›››ÇâÇjã›l‹‘vŒ¿?NNФõõõ?¾üÇÚûJÛüÓùçáHH±ç‰Î­ŸMïìyçÍ“orQ¥4ÖΗ«.’úšûÎ ž#¥ŒýñDYÁuïzW´ë³?#¥×կƣñioºÁ»ä]z¥õþäAyŸ¸½ö‡×êêë¾aîþôÒŸ’‰$é ü¯üÌA=L@F¼˜»¯¾øŠý^9Z]]Çâ=‘žZ%Ôa|¥O§iî*S ò~øC¥9?&ðÚ"m ŽßlVA`*™:Ôt(èû4ªåU¨¾]}íMícïŽñ äª[…Ý·g_Cu= ¹ì]Fðp°åàk7èa«W軉&:öwÀ žl8Y±Ñ |+": ‡Á’ˆ'<ð9E-™ÁÙÙYDƒèÜã{ŽWÈ{øòkõ‰æDdW£¡«mK8??ŽÞÙ°³»©;åýöo˜¥ü"ñKÞ%ð†ëbÞÚÚÔŠÀ`ii‰V®®„î^\\œ™™ÁÄ$Öó<0œFoÃÞ0ÊìŠvÁïã*ÉD¼áºœ·Rv‘С1Ò‰G㚀&xmµ`’z{mfï…¼ õ¡Ìååe¾QLe¯ÍÍÍ£#xmµ`¢¹¹9›™­—›þÆw5endstream endobj 286 0 obj 6001 endobj 164 0 obj <> endobj 287 0 obj <> endobj 288 0 obj <> endobj 290 0 obj <> stream xÚ|¹p&³6ÛvîØ¶mÛÎkcgÃm'Û¶mÛÙpóíó?ÏyÞꭩ꙾º§ç𫻦æ7CA¢¬Æ bîh ”ttpe`adæˆ9º9[ÌÌìŒÌÌ̈bÎ@WkGqW /@ hq³°rX8y9˜y™Y,<<Ü5Ü\L,ÿæ°±ppòظ9˜9ÿUYÜÚhæêèìÅôßÕm=|þãZX;˜[üM˜»9˜4¬¿¹eÄÿõ?1K +€™ƒüzšY˜þu u/'à?1–á&æ~>NŽN ; Ÿµðï€èãbâ¸:»ý|þÿ‘ÿé!²°Ì­Í\¦@KkÄÊË8X8X˜ÿ ÿ¡ÇÜÎ.¥Pÿ[.À_±Ìì¼æ@ D&EGWk3 €ZÌÑÉËÙÚÒÊ@mFóW/nú©ÆüeùDzþcÙþ±œÿX®,7àŸÔ¼\\ö.3Gg'Gç¿Ý0gDììªÿªìPºÝÿ¢ÿ›…¤›¢‰ý?<þüÿJ0±·¶óú¦hÿ‹¾ÐÜÚÍþG­]$­=æÊÖ®ò/ÿ –q5±³6q°´˜ÿ Òp0:ÛY;•]¬ÿ5VVVöÿS·²6³uº¸þöù_! ƒùÿ¦ü·+ÿþÏýKüUÇÜÚÁ æúwLœÍÿüV6±þ÷¬0ÿŸ2ÿø,ÿÇW0qu¶öè1ÿí(ËßÄ¿Ûþ›é¿Çñ¿Fñ?§ŠŠ:zú0pþ½'v'€›™Íï7ssv:¸þ3Hïê¿} 뿞@38fe!Óøá6û®OãärñÝN\W†ØLU]™ÝQ±Ž>WÛ”P<5ãeâ· é"Ëæ:ÙNÁr ½9"ÚÍ´M­Œ£Bç1Ñ£&Å£Ë_Õjži½H Þü¦ÍõìÆ¢ ‚ ÜžL¦ÈnnP‘tZwñöö< ¬{-4œ7æ¥èG¾V_5Â%f(Y2’¶+ì3‰¤¯ˆ¤ 'ÚAËiMßæD µvª¥@!· ~?Ÿ}Ýß 3æ:Â7$cÿ¦þŽÚP@oÈFã'Åkñ“6Š…Ö'(ÏR|´Òµ•k’í¢¹¶©·â:#§ÔF­b×ÏÂé\YN.¹hÌ›s sœû0ePœ­{ÈuÁiµá¸`ñ"TðÈšïb_öªnÊÞØi=b†g,ORÑJX\‘ï¡ßôõûpµUVQûqÝIÌÁuú"»ru>Ín4˜E*nP˜póaºjÄwEñ d&˯*ó¶Ÿy ´¦GYgšoçš1Š\6u }%N @ÎfW•Khↆ¯äX,ÕïAý[z<ÒHªØÖž ¶.ác>!-dzŒT0HGé'`‹.Pˆ L{T%cÙ€i6À¦»ö2O†kêy[“v×M}Ë*Ú+ãhŠÅ"ÏCm„ëd˜kûÙÝàP ¸@{¸l‘‘’E®˜å—B/±Å𫨳2$F™m'ç9(&KXÑ7+Ûs/¦üv‰0ÄsÁã”ÕIÄ,¬)Ç}÷%‡f¤›žWY‰þ/ÒïÞó–RbeY7ÃÏèÁÍGݪš8VÜcꑸÔD+¹žÞŽ{.$9ÉîÓHó»U!šãSÕ7Ÿ+¬”œýêÓî:+JÅÂùX¢ÉSÀ'¾î/Â߱˨ß镦Ÿ/‡-¶˜_6ÐçStÎmŸ[~˜’pÔ²¶!SqzÂÛg‚¹Ÿ– lòþLrIõPÅu  SÝ=’ü>˜²Tà è¸0$Üî!²^IU)kQlX•õñrÿÅ.j¶FWJhµÈ7úâE…Òù"q„G~ê õÍ`v±PÊã‰hŠn*ÚT+”ÂØt±(Ø´üroÅÞ¸‰ÅÎ’a œ+ÉÚY •¥Þ©Õ–â"yà‘Gø½èXÑÉ#Q:q³sØ>Ë5Aªãª^™ó“Þu›d ·‚Ñ€ ›Ï÷w8BýÎKŒòUØÌC Œ½½8LˆnôßÊáõÄÓîD‰fd‚Jv­M·Ú5Ø®˜˜(…ŒóËÖA¤§žgŸwù#‹¾hÔ”’JeÀ†ÀË\˜ÂÁ°:k’˜Íä´…ËSÂÙûk~>-+-y{Æ"Î/<‘kêäÐî5 Õÿ~bÂy©Íùr»ÖÝ“UóÂÿþ,@ä‘b’ÿèyÞÌÑR—NlfuK7kÿ.3Ä&I(ƒ¾N«Ù’+ËÜ dÿ \X}Ú]y«NŽ8ÙL7ýe‹°CXàì¬'¢ïSì\‡°»7£ó¾ÝõW*—0ã¶ ¼pÜ'v™ðƒ^Jnæ¾¶w4TU¦.¶|:> lAÞ¨†TŸÄ’ƒÿWT$£N€¼×p§ÈøWd>7‹±.¬‘!æ»§ÇJ¿“ûýÞ°o35ìöBì{Q;#’"ß|°”² ¥GúP”*ÚÄe  CµÒ7[Ó?g·Ös÷L„µJ…d¼;][‹rÁ¤ÜK} Ù[Ñ7ºŽ¢žß¤ªRõtn 4¢± z¼Ð\”éGÊ£Óûì’Ø–50féŽg&2ñÒÌ2íîq¦‡ŒaŠŸ×0ðv1ßW·;ÛÅÉ.'[î‚H °ñÖ½1ª}Þð|¥K?“ AË/­Yú?“©åhPqÛækÝ͈®s7Îú<6=ºŒK”â†/}µïœÅ³D‰,©FOh Ò¶¤Ø 7}/íñëe¥øFZ=yd;·%kÅ6gß®eô¦0”ÚleëMIñâ%=b'…“ª¥ ͲYˆ(r2Õ8HΜÞÄÃíî·þÚ)1æ‰}³®Îw¹)FroéKÍø%jßR9Q¾¥ÂþÄo¼‰XïÊòDðvZ«#áìúQ¶¶¼U/REÔŸa\Ýä¾3VÚ^¸ÆSÛ³Cúü;ÿb}M}~Q»ñ!_ íe¡Õö)Y3Eü›ªdx?:ÊÃçN¤°½úaÍ—ŠMÖ ­O ‚YÉÕ#qüú’m;s–¥H×帴ú:áˆ)AÜ 7áp¯.Ït]Q¤¤óŽ ¼Ë­©üŸ !þQÄŸvÌ…œt£‡šÕ¬»É›á CÑw¿ÀZ×LÏœ‹A6ìŽHbi|n˜ADî4d$6j±&ÁèËçvMn7§»Åèm–a$Œï±?*×ã_ÞùªZ) çGLÒ$ÿ6}F£¹#œx¼Nð›ƒÕž´u¶öjûQ‚•uºÀ¢Qözë¾z9º#cï×ߤ)3²7DÇ âRù’’]Q–Î@}•]Üæ†&{þœìÍ@Xs†ë­;¬wÁ¦ÀçȘ”Õw \´»`x–Ô»³G"°ŽršúwÇ]„n4ž9¸y•Í#µoΘÇ$ÅP¿ÄИ®tE¾cw>y5f”Þ>W¾ðû à ƒ™PØû>Æéß®÷Ò(#£_¯8#{}Lù‡¹¿þ‘¼¾ŽWÅ"¿ô?¡Õw²yQõ·³gˆeë•6éìç˜" ã±9M!—°þ‘SÌ·3ê©‹"¬}±ó#Â-至­\ø_Ä€íÓ1!ºk$þàÜ:ý8¥0ëŒ Úk€Ç…{zo$d¡£´O>z*è†Fäi‚Õ]d¨î”÷N¥`Uãa%áS6¤‰Š-—‘;Û¾Ú[§„b…yÆ©¸ca‘>Y¹{½KoÕ·.÷Ù³ ÌA?ÁÆAÊj7ë©ù_Ëb)u1=·ˆ,š £j¬ëORµï$»ç0iYŒبÏÉŸ ¦iý ½b]swnXâÎ8)Ù Wós #Ó€ùú\¥\×-óaŸŽôl(ƒO`f ŠR£WÌÊ!ë°oDz|R¶²ÝPû‡»Š+·=L=OŸí&ܯ•ôwQÄ­".šÌMMÙÕc%Š •ç:þàž~Ý!ýà‚Sªè·bÙ'Vøøø¸¸ òOwm,FÄJ”ýL1ú‚ë±×þè0ÞNEBÖâ¡\— «ñ5šRP“Ðù¤™xK ø¬/(§| Šë÷ÈI²®¾¸Tnj/k ¿‹§<‹7Éãóé"¬ËMÚ綘}ñ¨xbÉC©€Œ±kìsÍV>þ\ Ó£‚Ìä÷oÚkRoM–ÇC9‘åKDÙVIûÅhÍóHãsÏKîÉîÍ(÷)E`dŽ“»‡Õ~Ú¡ÇG̱õ> >¡ úå࣓1s˜îg|®®¹šéTx¶]×ÞEY&–$ìjwm!ÂEsjÃqˆ&XïÖŒ‹4ßè$Ù{¦`´f·øpµ4éι  ÷ñz„®†ƒí~ýÆÃYÿ6}U´Ö#…x:¨0Iªmæ3íÿáä ÁæGÍå¶1íRhBù5l­õ 7h•!´›tÚMDÁ‘Q*ž%ÕD~Ò"Mì½ß?'€SöèÓ#-{÷¿¾KšÁŽwRZ”XÖµê¸n®ÈÏòÔðá ô¸œñŽƒ0ÓR6ùè¸é÷ˆ°(ŒFj@Ÿ…- ½z¶1 ‚»A½éÄcÂô’o¼Z äÛÛŸL€¡Bã†JÊÉN˜ÅUš~;P±Î¢4ìAö†_QµlÒ&™´ìÖŽßE:^)\ˆkÛyçéS]¹Øí=ì z‡3– ™TžDfM>¶í%gXMÙø@ß_^¤×±üy›ŠŒpÕŹîðTÄH’Ke Sø—\ UzBÂÔèo ¤úCàv5í ³ªÜPÖí5ÕKBuÞžôŸæÅ‚ú.8G6§ˆƒÍF»vŸmìd¼gqµ]«'ÙxÏSÖußËàZíÛáŽMŸy± ¶êZ¦ÈÎ|Ø€ƒum½A‹‡9ä~pTU†O¬]‡Þpæíü»óL…“+ùäÕ1ΩL˜ã}¨ƒžè(o˰÷èeܰë;É­JõG¨On¼"¤9Çì{ò\¯XЯ¸aåmׯ ݾ'3pLÚˆ —Ãï|·ntÉ—¹K8u®Ö/ßž¯ÌèBàF­%5GOwúkTø¿1Œ(Âû"QýX½öSíÁV’ ºŠXçY#e-TG6‡¶Å¬1P•,¸5n‡3Ë®:þQ>³“tkøiŠû?Ó!㡲€®_ùY )”_© ¡2kšªã@Ím:¼Çʇ]ú­´/…;$¯³ ¿´/Z>2sÂÖ.bT †ó‹bÍŸ%uÉ¡§<ÇÙKÆïVʵ‹oX w^l={w䵃VJwlïèu4U½µC=ý5b;òÂY«òûõ9BAßÐô„Ëwz6(K=P? … Mâ”þJï)³xS÷]³úãÖ{¬5lÆu—P†ó2š÷'9½«‚8˜³àþ`V+4|ÅTYn¥µhß>ù]²‰\ß :Ó|oA‰ý¾ªŠ-ˆD’%ûŽ\?L“-X¬Hzó²—C!}2¿îË;³fÓøôË.íG~—ŒÙ²©ªÞvÀ3er§ y&ÙlþLˆ«ÎX?àÜ=> r6F]ÅŸYð°„Þ‘¤¹4Ó^v–¹,Œæ<°™ InVV¾¬ò’¸Â´ýµƒÃµÐ?¥ïæª]}ô†Ï´øW-fŠh®ŠYN"ežJ½)´Ø/ŽWF§ ð<Ó­"¦ÓRbüØ™e—0ÒÕ÷èòrü±g¬²9Wä!ôãÜÈâ'~9£ÇKVvÝ5ÊWüʱfÎÍHmVÏÑ*³Œ¨ìµýny»Ÿ£ xžKêwR«E‰XX-vóq 9Òýc •*)×;ãOò&~³¢×Õ>Òl_ˆz#‰€ÞtÔ¯¦¨ƒ‚õßÅþàm êpÄ‚ËD~Ú ã_äº1»>\ØFˆø•®ðh Ý{lµ«'¿®û¥¿¤C„¢HÞëOÉîñ˜td <¹-~(«‰çuÏ›g (ãAË.ðȵ˜:Öçûžõü¬§è-3-EP#ë –Oýaô»¤:ÉžI¢ÕõÞ©ÔºŽéòÁã'»ðõÄ[«#;Ã"p KþS;)°Ü†2y©‹„ˆ–VØÑ-“ºíÙ-´ÛÆË¥Sî‚>lhܧ{†\*yßZd, KrSM3z:ÒC]ƒƒ¢øÅáùì@Áš¡†wß$«ÃF t꼫åuO]0‡Þé§8]¤'ãÐyMfû©ªoè1<è5žËV7)측[×3œ„ÄI©Û¾½ÚãÄŽ¬±»ðŒ9´î C”ÕðÜ¥®ûÙli¹**Ú VâÃÀG³içì{ö©!×*97|s™¶ËŸðbBxo^Þ1ÂÊ÷t4ÙÀ q<#0¹O“t7.ì`Ä«—ÂèÀZÝBX|¬£¯ºªúvW ù £M†UZ–ñBEƒ½†›%é^P », Þ8DŽ(Ÿû.Û¡˜< d7…t¤|D~õžÐ/oKã›Îiu'G:LñŽØŒëÆÀ…ø*.…õ· Ö ^Òô³ÀùEZXg*3g}&8 òóaãÊ1yhüÂj´¦E~2½ý&ÒU/k“†Ý”JÊ×"¼²AÚ@¢ÄÝ(?Jt§µ߀¥Ó¼I>—ÈyúÕ<µ"³ŒZ A@D3Y%‰¶ñqÚÓ¼°…š¦^ÅOÑÓ™Å]ÊÀ¦ÉqDa‹?hI‹î^bdžørèo¿ée“%ˆ›{2·5˜ðÂ1û>9T~:¢¸nÓb 8é /AjýÐhˆ§ÅÇIy5žpã÷'ι b¢r!p¶2'_¤!{¤õ 7–Bñ‚gž ! 0 ²yð1ùq·>ý‰Ži¥ÐkÀ9û¸'öâŒÓ“qlLe)$¼ËTz‘7”vÑÏ‘J¼nqº¯lZb¾3ItW$j”Y­¨IDïKÕ~:uD¦€uHÏž .«¾å½œè ü@ôId+w䊥€¥x8[› ÔŸ7žŒ(F]eMx¼2Æ9\¡SæÔÛL1·¦rN½VJ¬µ.tg<¦^wá_I–ÃÎZQuïØ’•^8›Å(Ï#ZÊ„FØ€F©Ÿ—ýU pZaób:© ‡(Ä|qŒˆ"Èu!j-•lñ¥–^²’õKär§“W]›á‰£Ù23¾kº¥­øð®zŸP™Û0õEßT†¸90Òž,š/³îÿn©XóPµ"Œ ðKjNXÛF¨â‰è×É;arþoÉ-¡­î”ŒP¹DÅðÚbÚ:Y¶]U”ÓÞ[œ²0WÜ&”¿éϘäÞ˜>CÊò{à–È#®Z¡e99(°raRÔcJYŒ7D'С1™ÕÄú½€ Bkr­¨`:h™Šˆv³×.€$]8nLî@Ö癯“L{éøµj[Nߺ4wFÌ‹ÙKï¤9^ëüb1 ²Ìòür¯Wì¼O¼ŸR£@ÂݾWBÒââp±Æ¬FPa7™* žm{Zx9-¥ú½Ê uºúf*8jt°ñËP¶8P:›ñ ý%ìÒ ˜}AÃtCþwê(ºáëdØúbO—Þæpé}¶¹˜ óÀ¥Èe\9_jû6Ió‹ž©‹õó«Öá„@¬ç9‚z#¦mE$Tfn3ÆîœÑ©N%¡Î©„“ !Á)ãË8UåÃ…¬Ò5z4ºU,p†KÞœwƒ.L„:¯¡„&¤XpŸÕ«Ý‚˜¡K_yÜï± H鈄ç‚p^poCw”hÜF“È-ºí1SkW~„©¤•â·+Åô ŽtßüÍ#ŒådKƒ<œ”YA©A.o Ã‡¶½‘£Wn ¹a†{1¥þ´âf, ÊX<9ÁƒBH³ ^R¸&™h[—^bÿå«e—&ó%–&™û¡¢' ß–rϲR×È'†¾q_¸¸¡Ûÿ î©põáGй’Õ ù¦ ”ÜL&¼CÆDØáÔóäëŠT 'OMN–Èòö«Ú-<è—+±˜uïµíÌQ³‚öþ´¶ °Æ¹ºÂ™„sKÀûÑçts$1µW:ÏÂÍ¢{¡ú3Lþnt2=Óþß¡^O8QY:zõ¨dg A -º¥¼€úª?Ú©ERð—ŽE yP‡Ú—© IÜo1ÊCgõgrè=#äÖ܈nv‡öTù[k×Öhp¤4;RÍ[ 8ËœëÌ€.M¥ÔgÝ·'1R˦,LÁ¯é¦¤?Ö`?b¾áHÕú„nJÿÖ’÷©&?¿øsc¦’‘Rå¡(,„£@4¶Ry ̺ÑÖmþâʰe¼œW$Ü–üåB‰ëce†-¿H›-B5˜44Ú›àM‘!c]ÀGí'T¿•“‰T‚kïVSØ@pÜï3 í#¯²ÄZ– ¡b"؆¹“›€“¼¼ÐZWXß jäÄ$o›©õµáá¦àsߢaNêáÌóÞô Õ:†|‹åíÁÚÑíÇåæd7y‡×EUèUIðª¥W¬WLÕ¹‘ÙHºËÙ³ od ¤$ú±æ¹¦Ñ¶ˆV ª)ÏÈpOìŽÝmWX v‡Uy`]”Œ¦†(XˆÕÐ×¶ÄâëÚ²¥•ZSƒêHdOÓ/Šhˆn¬¡9‰»¨˜Üä섽]võãÒM¡"HŸ¼´¯KÓŒÝMð²WÊZs_MÓ“¼5qn$ð•¾gW÷BñÊÒfý³ZXeˆÙ¾¯5¸Ôʥșa'ð4eˆºeoß‘=ë^¤“NzcåØÊ´¿æåÃíHoEµ£8ÁH+ŸÿEðȵ²ãBG_e”Bý&¦ÇËa•_öšÕI± +óý/¸ € ‚!ÊVçÕ±ž)ýOað€M×AŠc+-> `ÇcBìHòwÅ îty ›Ç  «1§›âÛ™ìÊHú/ò–¡’©éØaÁGœŒiÒÐ4æ,í6‹qî\І=ÂâbšÂœdèF …ÄKùxˆGÒ/Ͼg3SÆ3†Gòi´+Á³?:Pi©ê§ÞJ5M"»Ýâ„÷3ÿù>Ò }ϵeY¦‡<úê0br«î<ȯ*”´NèÕÑ`^=`ë±×˜ˆ³Î•›4—_´ž¾Ä{‚6™‘ Òß½þiÂlñîA&ôž·Q ELÊ xAZ†E@‚¾Íøv$ƒ¾ ¨W>‰ñëâçÁOµ8Bø#:æ2T#£Ê¦7=Y¶ã+è›ge„H«EÀØx›7ýB)M¹ þå(-ûò†(¶ãs¦g¼|T†[‹<µMìÙ \ý8¤3zª„XbQG„äe›e¿xO†ñ"˜ëŸgž¥¬ £¸üõ0ãÀgfù/ï(iå’DS°rZo" ’ûËé""]P¢åÓ#%6iS¹@iÿ'mÒ:-ë³k£WI9³D ¢cEŒdKJIí|ÅcGÕ [úwßÑ nòÅ,XÝ/ãzVáVU•]ƒX#ÑÆ}d‰íú^ëbøŽ^ރȄ×óÍJœ‘L¢$áVZ¤´þïCCTh !OÇüÞ__š†>aÅ|®ÓêùÉ·æf úBë°pï@D½çNÜâ$Ts“iaèÑ=§Ì•àBÍMÐ]î^ùfî†AæÁ ª:YhÛ§8Å-}ä½Ò¦ëJZ#áŠÀ;!hœÛoW WW<àŸoæG/ÈÚ0×0w_5Xân=1–aÚcìCñÁ¨ ÒNg®5C¬y…[ÉXæIËúÚ ö´è58`ÝÈAh7¬2°õ:m E'nj¯CS®OýŠÅ[äF $yêRàØ†À¸¡öÈ|*ú(–PjNpød“3é÷Mq‚¤ËÎÃ]w;G±YNÐôõ8¦èóèŒøÞ$˪ ÄØŒ_ã€S_:Ñ“­ö ‰awɈýSc3ÜFØCíaÔ*p줜k¥²œŒ$p1ˆ”: :^‘Î b¥Xä˜\ /S—³á#’æ¥%rÁ[½X­YÕ߯PÁI‰Véǽ~þ‰û[ÒZ¹·Ifœ%yüœ?X·±9º¾‹?¥¾|ÁÈ8Àß!³SL(V- *5R”¶MÆÖÈ HWàüF·ž/M {ʽ²Èšq½x=ûÏ¢š˜.R© ÍÊfÁ‹¥#‰oì‘{o2n7 µ낼Dƒà]žä2fqÌÎL+ñÄ• S[ÛÅ( ·‹ÕofðédÙCãJBIà¶P’Y‰©:œ´® +fñ8„)bàXÅÖ¼¡¦¬CøJ :sNJ3Ìwå&?¦bûæò¹ux¼'†y}]¶n*"Ž,×ýÍxX2q¢‹“qTÔ‹_ùŸW³Ç÷ÊÃN}¬ÜËëi6ÎgH|9«ùQ¢àPÐÅ•À}¸DÂh(è.q·Ï¤kRý”Ö6dª¢SÒ#s'— REk^îª $Éa°Òø ¹œa¦ïpÖï)2I Õ¹äB.ö+Îî¤xÓrålœ1ø-: >î“2%r%Š»%uêEnØà»X³²m“’€·gºñ8.+tðM‘àR ]Új¿ÞTŒ™¶²Ð%Ç r&ã.úd`à|„Âs´rÝÖ-Þ9yñ.®“xçäØÌ õs6R¯h=Ò7$(‰{ÒûôG§?³â䇸҇èMmÛ°q¸§ˆêdÛqD«âZ4-z.>#Œ{·õ7¹G˜Åx< ôvcMâ­L#ù Ò\»|<\q[-¹ž²Á¸ ÇD0z$©äcâHÙÔ—¥Z–töàáÊûr^Ïbñ¯î5½··[i¾ÐcÊÔ,fÙ§‹Œ E±ÊšÖa÷’üë¢ØL©PzEÇSß=? ¢ú±Óá‚RY]A݆]yá§Ø$Äè½vxpEáÁ†0\,pç’B<›M¦î—/æ1oöÉ´ß4WÜ5Q•ª÷†¿é½Gа`lð”6>‚H¯À´²Ù­Mç›ø¥ã—‡²ksÿ²nzðJ,9¯Ý@>ªÉ™°ê5~áµÝ3õûìÝ1sW¹¢{rC¸~¬E¤î`R ’$;ú‘s¾•÷¤­U/?’Ÿ[à§ Â%Óâ"³bjf”˜ÓŠø—åð­æì„®lWOæ‹-ŠÔ ¬œ‹wßê6)õ3‹˜jžç۳نх§ª­`&R°ì‰5ÑgnõÎ턺 p-ž´Ïir‹Vá ɵCQßG+bdZØR« H‘yhMÈ.dž爹äa³:[0HGN0&f“ñhI‚ë#¿+æ(ù3½u2™Ñ~ù ¤‡V)ÂCWÑ*äà°c§J$q›ÅBw Ÿ<ÿH3‚(™Ô&©ùyà•¦µU«®ð2“Ä µÖ~*jü­yˆûvoÃV#mþi]z[‘Ujv—Oñ*XY;÷±‹GnjIÔ5Å^—¸ŽDÁyÇÉElô@J nY„S %êâ2”Ñ]‚Lð2ÅEò¢ V¹Ü­¤ìNlÄYƒÞjtDÀ|rç¸íø©ãìÏ êc1¸ƒ»Ú‡ÜFÄ=bm4j–¦@E±±U€~hGä#V>)¤T§Ô}êb±7]¸}ì0ëÑF0 J—ôÃ{‘A V(p+z¸Èš¦bWµUë9Â"‚ê¬k—Àèq©7“{—éuèíQ@—Âͤ2ã'‹t°:Áˆ—z°}íÑîЩz)}:ï Ðsßõ#£Ûfû­REŠoÃàyçVê¨Äp2jcÓŒÍÖYi}!•R‘. ë;4c¹ÛIº ù¾HGÝt,e®ÿÊI¾€d¯;×ÄR€YTÜ´ LÞ+¢Î /8zÜX ’ù]p†‘Ó˜ ä[DVi.S¯Rϸ¹X»øXñgûãpF5Å®ÒÀUi>Ö©ü;<7ˆXEèOKÁÿóçÕǦb­*êÎÇ7·|QŠ ‚Æsšÿ-¦ Ñáî!áÎE;âk##/Ë&Øîû“ØI¥TªèÚúîE£w¨Ò 2•Y&$iz&ÔNêÓÍŒÏÈÝÊß NÝ\Jy%“A>~Ó495 Åó}ö†î Ä­·(-Q°5¢VC Ÿd^µ7}¥©lœ’y®cñº½}ܶ¯ôc¾|Ô»"Ìw¢Cî®R2 ܦjhÊúM.?5´|ÈååÖ@¤ÇçÎf¼ß-ÿþí—†Æ!i÷[³yê1°*­*§ù°å¡ÕA'A1´Þ!QÜAšT••€~—Ä»Á¾<©ž!„Ñivþ~áw7p£ðÀ/e¤i†¯±múÈG_Nåd–BgK³‹$˜e ,¢Òܽ gi¾KèÈê`eº€È~H´âŸsZhETwx‹dÐçñ§TÁ¶sðßÄø0šOû#›+>r\áÿPG5EoËî ‡ÌJuŒ«RÖ¨y4«îåt¶^'îÌy`J'`Ì›¡¾ã†x¯:WTH•°êèzŒ"ÇcÔ;“rš¶‚Å̉.Ã]–Ë?l4 ”}&æ MS·LÀBºÖSÎEñÉIðs?¿ÛkÖÌ›ËwNG× fá³éöIlYÓey†@à‚RjNX䑵&!«ÒÒÅ`Ál1}WáïTëÐaÖ°(rníàÔ1/tgI4c?*¿i®<é~ßB 9ÇtE9¸é w û­Ý÷ü§d.¢ÃDxg<ívÌê<|ïÛ¸‡'¶Èt32¦Ur•äèž§‚)Ø“VväC¹Ž“¨ÄE¿mزÆò}í¬+jô–‡ —E¡ˆ0Dªd3Óƒ+‡Í;¯†èÉP‹¯ˆ1x½3X‡Ò0V—“ƒ<²WÝ}ÁÁkᾈ£ "–× Ç8U¯‚?O‡t8ÿºËDå‹dæ©Í>ƒ6É¿“*%q‚á}«ï-¢/Õ= ÂÌÙq59Öì.݉dÁ$®ZıÁÀçÙÛÌ¥a*ö8†¸N‹°‘£ Ýð¼#;¾\[ŽŽ}Yоx”bá@Ä@Aª‰iÊL•S‚à>ß¶í…ÔBÅæÙ"y(`})ØS¯º¹£ÔÄVSñm«‚ÎéÊÓmp’@b|o…™d¯ǂ!wº9%䀤šºÊVöÃ{º"ú÷ö ®«à‹;?vW~}š[¬D“·K®/Vméï^øÌÄ×׈w“²X;QxìQVjÕ'q¡õkvŒiÄé>A—ѲÛK‡`µ’~t~4Ë<Š‚”°ÁMÒó¦=Ö%¬ý¯¯è HŽå”X¥Â@Ù UÒ=ÅAKÉ µ^HÔa´HÈ•“|s$#P8$£±¿Ë F²®Ä]¨Ð3“À†ˆô‚ß å&Âë/ ßµóJ­öûŸÈ7“¡Ç‹$Lú6~U`é IvÏeÅɶߠ>¢†ndÇÃu±|X™b6“éð: y‰Êä‚¡|Yvg‡ô¹Y \w§)ÃxWˆf>Úì¡#¨2÷£vETÛ;z7ˆb±˜’pÃ1ôÝ›?ê±¶ÌÌýC-ÞÊvQH«%ó!2a«Õ&´bk±W:¯ò·x£Î×7ÌxS ¸˜ùu†Ò‘œ½íÊsspõÛ¤®ó¢'tÇÕ1÷¡ž¯WX’ÒÇZ•MžjÞ‹—Ê­lôòRaåt.±¹?’Š÷8&xs¼Ãëù¾9•L‘4¢°·6šu£×ªlH€8G“æ•ñJ],CNµŽ#ƒˆ(Ù9Àjò6¶Ò¢ñ,xŒÀ(ª…k^#[…ó+Š•¯æØÛÆ…<…œž™[Í&.0¾V¶ºüzÍø±æIë¥'\*žUS—ah 9g)g³1éÌ"Ù ¿ª|ÃA§EoǪô÷Ñ¡0åãµ™³–h%2HÛmwÙCú©’±“ëP©‚¹d®_ÞED"̶/²*BÏëÑH@uâÆpâ’y{âO ¦P°_¤‹ïW´ƒZÁÃiPuõ@Iü(l!>Q¤TØ£¼`ü!‰LŸl|÷¨ÏQ¨®GÈ´íøSGM58Ÿ¯n¹»J%Øø·Hbeúƒ” M2UÞGõËQbjPÞaDM›“Ö??{.ΛOw&¯D’ÊŸ¬¶ay‹dŠ‹#;öYð#Ð>ªI¥czÃÃ`ÿ%û)™C[¶õÓ«wòõ¾™ÍXÐïÚɪ%- 9áÚ9¶…¡EšOÏïlƒša¦~ŒŒEZàAIÛc¶Òu]Ç'sK̃XãQ—ÐO˜ üC®%v}Åõ¢H?F3ëWA¹£‘;n –^ÍStbÒ”øË;l ªVÖb}ÒC×FlŽä#íü‰ ™gF ˆr…Þ "-i…T ´ee®­+ऱ‚f=7S³ŠýÏ9™qS H“ˆY 7&U":&×é÷»=‡bÝ`“iñ•À³Y@¤¦W·[D[Šôº×7þùðR_þ¡žæAÖüV}%Z1ë×\¯üÄL(˜‘`u´î禤²š„´¥”Bÿ©\ª²‰xßO:'go×brì f¡·¬å<Ñ­'*Cû-èh-døøÿ¶I)ÞÍ(©^²|º6¢V¸Nþ/ǯ ØÕÁ"Ö6^¥þÁ}>‡§‹NsÒ~‹Vø$…[ Z½½6Ô’Fµ²ri)ODxu)Ê¥¬CÌ xî< 0xé®a>¸±åš"‰-éjGve@p­ËÎú“Ý{¯ÜàM 0L|<ÎÇBrìGж˜ª}Qr7ðt6åZÁ9©ù÷Dåó%¢Ý%¥Õžbc™¶z®ò €¡€É`á˜oeݱ¾@Ä]Ô#o‚ ¿*®Ÿ›a1ZUÒÓž»•¿¨šU`ˆó-×þ©#kî{¬ˆÔëa‹/U…®(Ùí×–)jMùðÙ²l>bew²”Fú@îÈsÚeÖ¶3£rŽ@¢B—×HÏ×ÛM/ß­sSñg²æ7s~ì‚ݳç¸ÿJ‘'gØ’c\÷Ŀ姜 zƒ\k´xÔ­`ò%eb±Ø:½yóAšvW,ÌLûÁYŠ4Ë}KªÌÙÚÍ 7ðÓž §·èå¬zòm Ðyzz.OlòwÇ.‡´8ÝA]û­äÅpždOThç0ñããw€þ‚$ DËÐFzéO%8YŠÍÁ¹Çmª–hQRº×³‹Ét"ÜðqEYû ]ºÌA)øaØ}ÛÔž-8²é=ù^ÔH¯cªÍ!%ž¸Ó¹Ï…‡Ãù{!i!6|Ó„>ñO#H›{¯¼ÑçŸ~7¨Á ÆÙüµb†ÖGËü¿¬Šû|²•1#lÉú‘Š£~¬…'ÙmÉ5þf§ÂôHÄÔR'Z*øXíª¤óc986ÝÑD˜Æ~õ\N%Lv?L¦A“¥‹9ÝDÛ ÀŒéGg”´ÛS~Í€f\UñüV‚ï‡g À5Óµ“ú}…)*yë” €æ»"¼,Õëg¬}EÈ"¼â0C*É‹ÏE( æÄ}T ýFñt„e7ïrºù32lh½VÄtôÐ,ÏÀnÐôiæáî˜ûþ Q4Ÿf“ô¬AL{gÿ§˜J·“À–‹c*s”X–Ó™ò(D€•>΄Ÿ¾ÌÁ>:JŠaãÆÎÝ­êR1|؉¤9ÂÍð%‘ãg”‘MêÓ± yG–’›¶’‚¿HÛEUü;ŠÎ/¿ç¡‡ö6‘=¶)-Rª•”È-ÉÍ YH©åù)L§Íüô[ŒuïƒÑyUÍŽ*%û‹öÚ‘s/3ç´ÉvKdÊÉûÒâŽs×ɑ׆¸fˆpC&‚+à ±z™BOðÑzbÈuèR¶FÊqëd®Ÿz†à±w¶Ë›»‚Yö®²¾%e<úñ+Ùþö\P0T‰ÿºö6ô2ÜšAÏëŒùúÇúÀ»riãÄ|W¡ÉÁš×T”Èö±Z ЦMÒ_L³§@%„ìûXËý2¿þJ3_|Ö>0ë2·4*rÏ1=r3„Ì€áuä”)œcÑ I=ÍÖ¾åW¬ÁseÉ´jò¡«A>Çøˆ€1Ì@LÍïhk³ð¯»Æ_«Jåk%÷‘Ý2^Ø\(z.tÐ]aöâãç/ UüIÅꃥA5Óö:0 ±Å²“*TŒ(B–½3Šz:¸24/,$@ƒ„™•6Ÿ¬n¦EÀ ,+%†fúÙ3",zÐN­VÃÝØVxé™îkYÚn›þæ”h£¶È¼ÄñÈB?DÎÌÈL„oqÁYúIKqx:÷¶ê³)7ûÂRž*çÜ‹¾—߆±c'cù£0qö*¶VëÇýõdÕNo€¢4$¬IÓmWš®1^ã®6Qõ¤Èùù½»Rqëlbli§#Ž~)sf²a£ˆÎü³åkn3·¿µþ¾»ÌS³‘GжŠk ÅÒbJéu³O¬ÁÌ‘òË=F¨)å‘—%^ †Ø‘xµ¿‹‡i)¤·l ¡¹Š%&¼ÅánTªÝUËYC¯d|;¿ïéÆÅø€£Ìï8N%%dGôdÙíè ‰l¨¿œãç. nèxVùøPãÖÌ$AÏ®ºÓ]_ocùˆ€‘qòmÎ6Ò\ŸµËçßõИ83”Ou ör£ô øJLö±\§Pu·±eþ•ºOèÆß-·ZÀ“)U¿{‰Žv‚¶² D£!Lé³Úaç=æ»å¯÷ϸ´ø°4<.ø·ó³6å%Òi£,Ü•ñ¡[Û}”–»U» ¤|é¿åVÖÇN»:ÛK”nL3é æ…q):>Ãàa¨A XvŽm!ì2Žö€ærè*ÉÂÕÈY@í°”ü$1gÊfÂâ,"£{$¿•è¢Å" ¥Úýè;évÓÑc߸ej3d»^þêèrÃÁ)j—«ÃMò~7z «Æ®q©$Ž[Û”˜ÏþnBD PC€´R6v¯,ÍÚcP¼ekiN ¥Œ?‹K™yªâzç8%Nw–-B¸È¦5ôbø‚Þ®¨­/†Q-åŽg†WvdwÔȤú 1„;ñf:K hŸ® µü^•Åi<îe}bqÆ‹E8Ë[d7Ì,æ/Í,E2æðÿµ?×ïpŽÇÇNLsÓNN‡é15¦Mw÷é8yšMwÛ6qº»Ù™¸1Í0ÍéÉÏ÷øþöy>ï?àõ<ïT¾pZЏk½ÿÐÁ˱<®øK¬jyº¹[mQ]Ü÷ ôßðCp}ÑÎ PBÑgr¹ö=êëv5¤¶éêgü`âe[k4)€ÃÐbÏü¢RÒ<8²–ÿÀ3þâ×£°AÊâPúS9)í =‰{±±¯ÏœíÌŒ°æH"ûXß-f…nšù'o {æ×õ‘Œû43\C£SŒ¶jÝEOYȬ–Ù¬bÖ¯–ËÅN~9 <¾-—˲HÂU`º=8ÃVñ5IÐ:,Ò{M¸ìð•Ðt½DƒVìU*}__M‰+k¾jS÷¼Žè]û6Òj ó’‚ÛÓ²·g&ZôÈ–·ý´G¾”>ÕW ì¶ …ÓÑ<ƒ‡€ãùê…Ÿhï ʾ *È…pÃkmkÓ%žÂ<0ƒ×ïSÉß.-tUí±D; W;¸„#Šhþ9 ëj¥A¬ÑÓÄ3]£,û¯E•볺ˆ#ª©²¨/rÉ”-¤5ª`ÞÌÚÐð3–îÕòé}– Ÿý„ ´X⨠*c¯†WSÙ iWè²:¶ÛLçžmûê‰ìýHï”òÄ—NÏ­ L¹Üöù4Þ«[mGÄ„ã¬øÓ¡³=òÄ2oGç9ýð_yØ­vmÿ}¨çŒ/éÁŠ™›‹e ¿{Ÿe3ËÔ<)éZ;Û¾tˇ>_5ûÍÚÀ­=XY"`ÖàH™6ë|qC þ%›0i×"¼î“žƒsƒŠ©Ý«kþH—m¼óƒItËÆF«ÌpBí·0“T³Úô»WÄG Aaðyv¥½uÓ/ÃeZû‚kÉH‘nа)¦F3êÓMÛnσìþÑ6Ëcd"e¼/šh>ÈúžYŠvãƒ;Þx÷k@ÙÝŠu¢m÷Æ×ª$õ¯m‹[‚­\H ªäE§Â®³·0àp 6êñ¯Œ"-ö/Rá5ú}xKÈì!Î øT;èù>W8'œ,sáýè®s¡¾QÎyÄwžK Çl` ÿ™Èœ}ˆÒPÍÇ¡¦éÕíML“c§èŸ…«s))Ô-}³ÊÛɽ…¿ NÉóÑ¿RÂgà¶‹¢z‹Mñ:3ýbüY_{0€ÄT¥_µã/°’ª!ô®vÙ…Ž‡ŽB —Ÿ „Û6•ªqá4“e$x%æD¬…®ÙœTTî'sŠ‘ì®Y¢O`å(4Ã'Û&ÚBºfìj7O&B­)3ÙL7'¡Êô±®Ë× :¹é»o ?@²™Üº¹ h5íWmŠ`HãBQ=Íd]Ü àË¿'=†qùH™ö‚¥¼œÂý÷þÛr½f–®íŒ[wŠÑÂ>-ïúS{Ãn]ÿnÚÌHÛLÈ”ÃG“QzÜ‹öüÕ•ŒgÔGΦ\‹Kìê›LtšGØÐÇT‹5¦AÈ~ªôÎÑPH8,°ÿ2aÃŒ )iØ9œ/ªVL0ÂÏݼ3²`’žZè{ai—܄䎗~-] P\œkÏ6l«§­áiðq° +ÅŸ6RžeÕ–±ÌÕOD³ûbá„ Ÿ¼×Éú©ß#†¿ºô/2åiXGŸLâ’/ÑàI-h5móWT1»JrË&ㆲlF]{t¿òÑà.!y^!m–-v˜0뤔›^âLïT˜ñë/»ò‰F¼àø¢eƾ)†S>•rÓÉ·ó¾5èë¸,¯À$ åcÒ¥éÝ¡ŸV! ì½îÕ¤Ó•ï&’³íõ†'àÇ5Ô·VV¬lIô[þÝÓÏÍØ5xôOwÌ ¿J:#«jëÍË=íüЉ]N¤Œ§Œn#»ùÝ:³òGß`†Œ"…:…ANIЏÚ\dP &)ºeàcEm±îäDE™'uÍÜ(\KD±M‹Jv!?ß‹>ÜUJ¡&±윮/}¨2^ÏUZ¹E:YÎ ñ|°÷%k‹<ú{8Øn(s3M~›äßÃn`«š¯J¯¾&f8’ø{šèC^zêÎãXþeâŒýáõèMr£À—曣Gk«þUK ~[œ_ôL*4›gHX‚·ãÒ¨X¤­º3&Ú®=3“­ Ñ B}/bŽbòâc¡Þ‡6³½QÔ>«öëæ-_uez}jSù×\ÃÎ ó'pXªgN Œ7"`'£êŸßð–^÷g}Ý‘ Ù^.â-ð½Ì!ÈÊxWb”F¼X%[jþÄ¥(ŽPSSÒ°$"›ë9Wü#‹û6w: ñÏk¼XÅË[ϰ* ñV*Jã¡°aW"p=ý.PdæÅ­PøÔX„ñV­0YgOŒ »p×Û~·†«7®m9”X0Heݸ Q(NèãËö ¯åaÞ{/BöS¤y ŠPï)ÑÁW# _ÞzÒþäD‚øÚ±bjŸK¼qÝ ¼ûO4Ÿ…-¶dFâqKþ[™)y­ÿL4—Íä#.ÍÑ„.û}sÈj¿z¦á-ÚJáˆSÒgþ:ÌÐëžÎ±p-àÝ@8ÍaXüLGYƒ¹¶¿Õ²ðƒ޳Õ.Á¿ VkEd5²!ªŽýî­Aâ„-áŒ$1DJq†1}S|¤_©ê,M«+;Zq†…PO¶å¥G´ "PþmH°gÙ+,«ÝßM÷ "¼€ ˜ ¾ ¬­û:ÉÌÙ=²§¨‰Ž–ÖÎjõðÍŸðSÎÍúÀÇJïÀ;ƒ÷Í`ú¸« Rõ(¢€6ú"6½, £õ~Ûö¶°.bOõ·Ë5´ þà¿EµåcÙgrxYhiýE<#Ø °\­½@Aü7`¶Gu÷GÛ‰­DÅçývÒJî$âS–*œ 1Ú.Wc*j_÷7{zgÿsŽ:PÖtHˆ;¯V!£ Z^ÜÆÕ .L.³¥"wì¢VS›–ó„QÁY4N£ÑK˜)©:sd’/MÝb0²;B”¥l’}yƾҟªñ¨…‡-±^KOO{íÜ=$×e©àî=Ë9 ‰ÍŸøÃŽ ¢ëtŒ}nÇhÁ0úIƒõïL±v ¯A¨­àzñ2¯:̃\UÿWts Øàë[@tGÇS?v›Ó  ŽAE.Ù3—5W!³VŒñÝïaYÔ µú]}ŽŒõ¤B:…z“udæ9J .‘fnßÀájáºGÇÏÖv0è/(þ©ŠÓ“ŸÁÚ9mÂyßR* È ÷SöoÊNon£æ<Æ+†M¿XI‰*f£•–Z¿=k'‘¤´ùÜ9£ÆŸ”1µµUp£w^°™0t’JEkuN—Mr£Lo±çð3(/¢™UTt9_~I‰Îïêÿ(«ºlE¼ÿGŠaá¹½ñ:!á”/?„xvÖÞþâÓøýk•ZWÌMq8Lî.¼ñ£·fajIw%<"í–¿._ÝøJÆÞM†’óTõ-b±)ݹy¯bdÑp;[wöûÎÏɱ)9qäãLU½Y¬¤v¹ÿ¥ô‡”¸:¼,twµácP®&tù¬ M‡[Ù1^ذJ¡`_"6/’uÞyåÌyÒ‚Svü–=AãbQ;)Xcû½é«†ñ#{õƒ°~ò_i„ù§='5‚Â&Q¢²eKõ„i³í”šãTŽòÙ²ØéîÉýÅ8nF`Ë@Á‘hmù¦^¾$·€V7ú'æûÒÉNC½šùw²S¹g§x»–l‹¹Ö6¬â §# ®æ;Û)×¾ô×1‘öãÆRî(®—Xr.’@MOrÅYlmm¼÷Œ´Ð–aÞÿ›ôø¿<–t/V!Ž1ñq\å¿§koAWqÓÄ¿BÔ›AÒªloÅ8L©564Þ éœ<KVQZò£óâ]ú³J@‘ÅŸIOjÐÐu&û‰£‘ÉB´Eƒø'‡ëo¹Ú¤þ‹©¥cCÜ•°–Öž—Z§ÅæÝd&òiœ5£%Þ ùù‘rUW:å×}ÏŸ 6 e„Úƒ>8,¶~pöR`–.;ñ‡ön¯#ÚYzSN)®Çya,b•|µÊ˜ô䮪FÖÈ iÔT6ª9½{þtb¯_R²¬Ä¢Oæª—ì³øo´5_ NÉT]¾7ïúAê™´å’+b¥OÒCÈó®g5¹>17|Ï2-ýÜ“ M¶ Ów™½We¬ý­P¤±¬SD!qUÇŒK¿˜›Ü*IDÏ?‡vŒgn®ŒíïÓ𦈜gœƒo÷݃œñÞÉ‹5Tüå@†®¥h€Ëb\ìö>sFôÑþbÆ:©oŸÈ/\¹pj‘À$¹ÝçUÎFcHêyP{ímâÜÙ?û^ÛäÇ; öÖÎoHº“ÍŽ¬b3Øô zµÊKÒã›;b$žSØm‚»â$&«oàfEhê› â§xÿНˆzfÿöSŠs¥ÄcE]É^‹–ëÝ,Ó†±!1Ãx/žè½Œfè@v¿Ÿâtõ"4»·w•Üå¨MË nC]ra$é<«SnöVcßJÜŒ§×Ë'$ß`5Ž0&íþøð_X9ÛX@½Ü\, N€ÿ8û.¤endstream endobj 291 0 obj 20709 endobj 292 0 obj 918 endobj 293 0 obj 19965 endobj 294 0 obj 531 endobj 289 0 obj <> stream xÚ]ÔÍŠÚ`Æñ}®âí¢0]X£ïùp@„Á2tm‡±½€˜¼±š„Þ}óä‘)t¡ù‡$úã@Îǯ‡ÅSÕÓ"~ÎÃ[ºtסL‹ý·¢Ï–û—//m3†åëЕ‡4†ºi«á~O8¦SÓf«u¨šr¼ŸÍßåùþðávÓù¥­»l» Ë·éâenáaþÇOÙòÇP¥¡iOáá×þ0®}ÿ'S;†<ÛíB•êé‡&Ë÷âœÂò©úÚ•‹éÖ~ÞúÖóùІ²«Ò¥/Ê4í)eÛ<ß…íóó.KmõßµMÎGŽuù»²í·æùt˜zÍ^£#;¢7ì ú‘ýˆ.ØúÈ>¢Kv‰®Ø:±ºf×SG" qÅ^¡é‰ðDz"> endobj 296 0 obj <> endobj 297 0 obj <> endobj 299 0 obj <> stream xÚ|¹p&³6ÛvîØ¶mÛÎkcgÃm'Û¶mÛÙpóíó?ÏyÞꭩ꙾º§ç𫻦æ7CA¢¬Æ bîh ”ttpe`adæˆ9º9[ÌÌìŒÌÌ̈bÎ@WkGqW /@ hq³°rX8y9˜y™Y,<<Ü5Ü\L,ÿæ°±ppòظ9˜9ÿUYÜÚhæêèìÅôßÕm=|þãZX;˜[üM˜»9˜4¬¿¹eÄÿõ?1K +€™ƒüzšY˜þu u/'à?1–á&æ~>NŽN ; Ÿµðï€èãbâ¸:»ý|þÿ‘ÿé!²°Ì­Í\¦@KkÄÊË8X8X˜ÿ ÿ¡ÇÜÎ.¥Pÿ[.À_±Ìì¼æ@ D&EGWk3 €ZÌÑÉËÙÚÒÊ@mFóW/nú©ÆüeùDzþcÙþ±œÿX®,7àŸÔ¼\\ö.3Gg'Gç¿Ý0gDììªÿªìPºÝÿ¢ÿ›…¤›¢‰ý?<þüÿJ0±·¶óú¦hÿ‹¾ÐÜÚÍþG­]$­=æÊÖ®ò/ÿ –q5±³6q°´˜ÿ Òp0:ÛY;•]¬ÿ5VVVöÿS·²6³uº¸þöù_! ƒùÿ¦ü·+ÿþÏýKüUÇÜÚÁ æúwLœÍÿüV6±þ÷¬0ÿŸ2ÿø,ÿÇW0qu¶öè1ÿí(ËßÄ¿Ûþ›é¿Çñ¿Fñ?§ŠŠ:zú0pþ½'v'€›™Íï7ssv:¸þ3Hïê¿} 뿞@38fe!Óøá6û®OãärñÝN\W†ØLU]™ÝQ±Ž>WÛ”P<5ãeâ· é"Ëæ:ÙNÁr ½9"ÚÍ´M­Œ£Bç1Ñ£&Å£Ë_Õjži½H Þü¦ÍõìÆ¢ ‚ ÜžL¦ÈnnP‘tZwñöö< ¬{-4œ7æ¥èG¾V_5Â%f(Y2’¶+ì3‰¤¯ˆ¤ 'ÚAËiMßæD µvª¥@!· ~?Ÿ}Ýß 3æ:Â7$cÿ¦þŽÚP@oÈFã'Åkñ“6Š…Ö'(ÏR|´Òµ•k’í¢¹¶©·â:#§ÔF­b×ÏÂé\YN.¹hÌ›s sœû0ePœ­{ÈuÁiµá¸`ñ"TðÈšïb_öªnÊÞØi=b†g,ORÑJX\‘ï¡ßôõûpµUVQûqÝIÌÁuú"»ru>Ín4˜E*nP˜póaºjÄwEñ d&˯*ó¶Ÿy ´¦GYgšoçš1Š\6u }%N @ÎfW•Khↆ¯äX,ÕïAý[z<ÒHªØÖž ¶.ác>!-dzŒT0HGé'`‹.Pˆ L{T%cÙ€i6À¦»ö2O†kêy[“v×M}Ë*Ú+ãhŠÅ"ÏCm„ëd˜kûÙÝàP ¸@{¸l‘‘’E®˜å—B/±Å𫨳2$F™m'ç9(&KXÑ7+Ûs/¦üv‰0ÄsÁã”ÕIÄ,¬)Ç}÷%‡f¤›žWY‰þ/ÒïÞó–RbeY7ÃÏèÁÍGݪš8VÜcꑸÔD+¹žÞŽ{.$9ÉîÓHó»U!šãSÕ7Ÿ+¬”œýêÓî:+JÅÂùX¢ÉSÀ'¾î/Â߱˨ß镦Ÿ/‡-¶˜_6ÐçStÎmŸ[~˜’pÔ²¶!SqzÂÛg‚¹Ÿ– lòþLrIõPÅu  SÝ=’ü>˜²Tà è¸0$Üî!²^IU)kQlX•õñrÿÅ.j¶FWJhµÈ7úâE…Òù"q„G~ê õÍ`v±PÊã‰hŠn*ÚT+”ÂØt±(Ø´üroÅÞ¸‰ÅÎ’a œ+ÉÚY •¥Þ©Õ–â"yà‘Gø½èXÑÉ#Q:q³sØ>Ë5Aªãª^™ó“Þu›d ·‚Ñ€ ›Ï÷w8BýÎKŒòUØÌC Œ½½8LˆnôßÊáõÄÓîD‰fd‚Jv­M·Ú5Ø®˜˜(…ŒóËÖA¤§žgŸwù#‹¾hÔ”’JeÀ†ÀË\˜ÂÁ°:k’˜Íä´…ËSÂÙûk~>-+-y{Æ"Î/<‘kêäÐî5 Õÿ~bÂy©Íùr»ÖÝ“UóÂÿþ,@ä‘b’ÿèyÞÌÑR—NlfuK7kÿ.3Ä&I(ƒ¾N«Ù’+ËÜ dÿ \X}Ú]y«NŽ8ÙL7ýe‹°CXàì¬'¢ïSì\‡°»7£ó¾ÝõW*—0ã¶ ¼pÜ'v™ðƒ^Jnæ¾¶w4TU¦.¶|:> lAÞ¨†TŸÄ’ƒÿWT$£N€¼×p§ÈøWd>7‹±.¬‘!æ»§ÇJ¿“ûýÞ°o35ìöBì{Q;#’"ß|°”² ¥GúP”*ÚÄe  CµÒ7[Ó?g·Ös÷L„µJ…d¼;][‹rÁ¤ÜK} Ù[Ñ7ºŽ¢žß¤ªRõtn 4¢± z¼Ð\”éGÊ£Óûì’Ø–50féŽg&2ñÒÌ2íîq¦‡ŒaŠŸ×0ðv1ßW·;ÛÅÉ.'[î‚H °ñÖ½1ª}Þð|¥K?“ AË/­Yú?“©åhPqÛækÝ͈®s7Îú<6=ºŒK”â†/}µïœÅ³D‰,©FOh Ò¶¤Ø 7}/íñëe¥øFZ=yd;·%kÅ6gß®eô¦0”ÚleëMIñâ%=b'…“ª¥ ͲYˆ(r2Õ8HΜÞÄÃíî·þÚ)1æ‰}³®Îw¹)FroéKÍø%jßR9Q¾¥ÂþÄo¼‰XïÊòDðvZ«#áìúQ¶¶¼U/REÔŸa\Ýä¾3VÚ^¸ÆSÛ³Cúü;ÿb}M}~Q»ñ!_ íe¡Õö)Y3Eü›ªdx?:ÊÃçN¤°½úaÍ—ŠMÖ ­O ‚YÉÕ#qüú’m;s–¥H×帴ú:áˆ)AÜ 7áp¯.Ït]Q¤¤óŽ ¼Ë­©üŸ !þQÄŸvÌ…œt£‡šÕ¬»É›á CÑw¿ÀZ×LÏœ‹A6ìŽHbi|n˜ADî4d$6j±&ÁèËçvMn7§»Åèm–a$Œï±?*×ã_ÞùªZ) çGLÒ$ÿ6}F£¹#œx¼Nð›ƒÕž´u¶öjûQ‚•uºÀ¢Qözë¾z9º#cï×ߤ)3²7DÇ âRù’’]Q–Î@}•]Üæ†&{þœìÍ@Xs†ë­;¬wÁ¦ÀçȘ”Õw \´»`x–Ô»³G"°ŽršúwÇ]„n4ž9¸y•Í#µoΘÇ$ÅP¿ÄИ®tE¾cw>y5f”Þ>W¾ðû à ƒ™PØû>Æéß®÷Ò(#£_¯8#{}Lù‡¹¿þ‘¼¾ŽWÅ"¿ô?¡Õw²yQõ·³gˆeë•6éìç˜" ã±9M!—°þ‘SÌ·3ê©‹"¬}±ó#Â-至­\ø_Ä€íÓ1!ºk$þàÜ:ý8¥0ëŒ Úk€Ç…{zo$d¡£´O>z*è†Fäi‚Õ]d¨î”÷N¥`Uãa%áS6¤‰Š-—‘;Û¾Ú[§„b…yÆ©¸ca‘>Y¹{½KoÕ·.÷Ù³ ÌA?ÁÆAÊj7ë©ù_Ëb)u1=·ˆ,š £j¬ëORµï$»ç0iYŒبÏÉŸ ¦iý ½b]swnXâÎ8)Ù Wós #Ó€ùú\¥\×-óaŸŽôl(ƒO`f ŠR£WÌÊ!ë°oDz|R¶²ÝPû‡»Š+·=L=OŸí&ܯ•ôwQÄ­".šÌMMÙÕc%Š •ç:þàž~Ý!ýà‚Sªè·bÙ'Vøøø¸¸ òOwm,FÄJ”ýL1ú‚ë±×þè0ÞNEBÖâ¡\— «ñ5šRP“Ðù¤™xK ø¬/(§| Šë÷ÈI²®¾¸Tnj/k ¿‹§<‹7Éãóé"¬ËMÚ綘}ñ¨xbÉC©€Œ±kìsÍV>þ\ Ó£‚Ìä÷oÚkRoM–ÇC9‘åKDÙVIûÅhÍóHãsÏKîÉîÍ(÷)E`dŽ“»‡Õ~Ú¡ÇG̱õ> >¡ úå࣓1s˜îg|®®¹šéTx¶]×ÞEY&–$ìjwm!ÂEsjÃqˆ&XïÖŒ‹4ßè$Ù{¦`´f·øpµ4éι  ÷ñz„®†ƒí~ýÆÃYÿ6}U´Ö#…x:¨0Iªmæ3íÿáä ÁæGÍå¶1íRhBù5l­õ 7h•!´›tÚMDÁ‘Q*ž%ÕD~Ò"Mì½ß?'€SöèÓ#-{÷¿¾KšÁŽwRZ”XÖµê¸n®ÈÏòÔðá ô¸œñŽƒ0ÓR6ùè¸é÷ˆ°(ŒFj@Ÿ…- ½z¶1 ‚»A½éÄcÂô’o¼Z äÛÛŸL€¡Bã†JÊÉN˜ÅUš~;P±Î¢4ìAö†_QµlÒ&™´ìÖŽßE:^)\ˆkÛyçéS]¹Øí=ì z‡3– ™TžDfM>¶í%gXMÙø@ß_^¤×±üy›ŠŒpÕŹîðTÄH’Ke Sø—\ UzBÂÔèo ¤úCàv5í ³ªÜPÖí5ÕKBuÞžôŸæÅ‚ú.8G6§ˆƒÍF»vŸmìd¼gqµ]«'ÙxÏSÖußËàZíÛáŽMŸy± ¶êZ¦ÈÎ|Ø€ƒum½A‹‡9ä~pTU†O¬]‡Þpæíü»óL…“+ùäÕ1ΩL˜ã}¨ƒžè(o˰÷èeܰë;É­JõG¨On¼"¤9Çì{ò\¯XЯ¸aåmׯ ݾ'3pLÚˆ —Ãï|·ntÉ—¹K8u®Ö/ßž¯ÌèBàF­%5GOwúkTø¿1Œ(Âû"QýX½öSíÁV’ ºŠXçY#e-TG6‡¶Å¬1P•,¸5n‡3Ë®:þQ>³“tkøiŠû?Ó!㡲€®_ùY )”_© ¡2kšªã@Ím:¼Çʇ]ú­´/…;$¯³ ¿´/Z>2sÂÖ.bT †ó‹bÍŸ%uÉ¡§<ÇÙKÆïVʵ‹oX w^l={w䵃VJwlïèu4U½µC=ý5b;òÂY«òûõ9BAßÐô„Ëwz6(K=P? … Mâ”þJï)³xS÷]³úãÖ{¬5lÆu—P†ó2š÷'9½«‚8˜³àþ`V+4|ÅTYn¥µhß>ù]²‰\ß :Ó|oA‰ý¾ªŠ-ˆD’%ûŽ\?L“-X¬Hzó²—C!}2¿îË;³fÓøôË.íG~—ŒÙ²©ªÞvÀ3er§ y&ÙlþLˆ«ÎX?àÜ=> r6F]ÅŸYð°„Þ‘¤¹4Ó^v–¹,Œæ<°™ InVV¾¬ò’¸Â´ýµƒÃµÐ?¥ïæª]}ô†Ï´øW-fŠh®ŠYN"ežJ½)´Ø/ŽWF§ ð<Ó­"¦ÓRbüØ™e—0ÒÕ÷èòrü±g¬²9Wä!ôãÜÈâ'~9£ÇKVvÝ5ÊWüʱfÎÍHmVÏÑ*³Œ¨ìµýny»Ÿ£ xžKêwR«E‰XX-vóq 9Òýc •*)×;ãOò&~³¢×Õ>Òl_ˆz#‰€ÞtÔ¯¦¨ƒ‚õßÅþàm êpÄ‚ËD~Ú ã_äº1»>\ØFˆø•®ðh Ý{lµ«'¿®û¥¿¤C„¢HÞëOÉîñ˜td <¹-~(«‰çuÏ›g (ãAË.ðȵ˜:Öçûžõü¬§è-3-EP#ë –Oýaô»¤:ÉžI¢ÕõÞ©ÔºŽéòÁã'»ðõÄ[«#;Ã"p KþS;)°Ü†2y©‹„ˆ–VØÑ-“ºíÙ-´ÛÆË¥Sî‚>lhܧ{†\*yßZd, KrSM3z:ÒC]ƒƒ¢øÅáùì@Áš¡†wß$«ÃF t꼫åuO]0‡Þé§8]¤'ãÐyMfû©ªoè1<è5žËV7)측[×3œ„ÄI©Û¾½ÚãÄŽ¬±»ðŒ9´î C”ÕðÜ¥®ûÙli¹**Ú VâÃÀG³içì{ö©!×*97|s™¶ËŸðbBxo^Þ1ÂÊ÷t4ÙÀ q<#0¹O“t7.ì`Ä«—ÂèÀZÝBX|¬£¯ºªúvW ù £M†UZ–ñBEƒ½†›%é^P », Þ8DŽ(Ÿû.Û¡˜< d7…t¤|D~õžÐ/oKã›Îiu'G:LñŽØŒëÆÀ…ø*.…õ· Ö ^Òô³ÀùEZXg*3g}&8 òóaãÊ1yhüÂj´¦E~2½ý&ÒU/k“†Ý”JÊ×"¼²AÚ@¢ÄÝ(?Jt§µ߀¥Ó¼I>—ÈyúÕ<µ"³ŒZ A@D3Y%‰¶ñqÚÓ¼°…š¦^ÅOÑÓ™Å]ÊÀ¦ÉqDa‹?hI‹î^bdžørèo¿ée“%ˆ›{2·5˜ðÂ1û>9T~:¢¸nÓb 8é /AjýÐhˆ§ÅÇIy5žpã÷'ι b¢r!p¶2'_¤!{¤õ 7–Bñ‚gž ! 0 ²yð1ùq·>ý‰Ži¥ÐkÀ9û¸'öâŒÓ“qlLe)$¼ËTz‘7”vÑÏ‘J¼nqº¯lZb¾3ItW$j”Y­¨IDïKÕ~:uD¦€uHÏž .«¾å½œè ü@ôId+w䊥€¥x8[› ÔŸ7žŒ(F]eMx¼2Æ9\¡SæÔÛL1·¦rN½VJ¬µ.tg<¦^wá_I–ÃÎZQuïØ’•^8›Å(Ï#ZÊ„FØ€F©Ÿ—ýU pZaób:© ‡(Ä|qŒˆ"Èu!j-•lñ¥–^²’õKär§“W]›á‰£Ù23¾kº¥­øð®zŸP™Û0õEßT†¸90Òž,š/³îÿn©XóPµ"Œ ðKjNXÛF¨â‰è×É;arþoÉ-¡­î”ŒP¹DÅðÚbÚ:Y¶]U”ÓÞ[œ²0WÜ&”¿éϘäÞ˜>CÊò{à–È#®Z¡e99(°raRÔcJYŒ7D'С1™ÕÄú½€ Bkr­¨`:h™Šˆv³×.€$]8nLî@Ö癯“L{éøµj[Nߺ4wFÌ‹ÙKï¤9^ëüb1 ²Ìòür¯Wì¼O¼ŸR£@ÂݾWBÒââp±Æ¬FPa7™* žm{Zx9-¥ú½Ê uºúf*8jt°ñËP¶8P:›ñ ý%ìÒ ˜}AÃtCþwê(ºáëdØúbO—Þæpé}¶¹˜ óÀ¥Èe\9_jû6Ió‹ž©‹õó«Öá„@¬ç9‚z#¦mE$Tfn3ÆîœÑ©N%¡Î©„“ !Á)ãË8UåÃ…¬Ò5z4ºU,p†KÞœwƒ.L„:¯¡„&¤XpŸÕ«Ý‚˜¡K_yÜï± H鈄ç‚p^poCw”hÜF“È-ºí1SkW~„©¤•â·+Åô ŽtßüÍ#ŒådKƒ<œ”YA©A.o Ã‡¶½‘£Wn ¹a†{1¥þ´âf, ÊX<9ÁƒBH³ ^R¸&™h[—^bÿå«e—&ó%–&™û¡¢' ß–rϲR×È'†¾q_¸¸¡Ûÿ î©põáGй’Õ ù¦ ”ÜL&¼CÆDØáÔóäëŠT 'OMN–Èòö«Ú-<è—+±˜uïµíÌQ³‚öþ´¶ °Æ¹ºÂ™„sKÀûÑçts$1µW:ÏÂÍ¢{¡ú3Lþnt2=Óþß¡^O8QY:zõ¨dg A -º¥¼€úª?Ú©ERð—ŽE yP‡Ú—© IÜo1ÊCgõgrè=#äÖ܈nv‡öTù[k×Öhp¤4;RÍ[ 8ËœëÌ€.M¥ÔgÝ·'1R˦,LÁ¯é¦¤?Ö`?b¾áHÕú„nJÿÖ’÷©&?¿øsc¦’‘Rå¡(,„£@4¶Ry ̺ÑÖmþâʰe¼œW$Ü–üåB‰ëce†-¿H›-B5˜44Ú›àM‘!c]ÀGí'T¿•“‰T‚kïVSØ@pÜï3 í#¯²ÄZ– ¡b"؆¹“›€“¼¼ÐZWXß jäÄ$o›©õµáá¦àsߢaNêáÌóÞô Õ:†|‹åíÁÚÑíÇåæd7y‡×EUèUIðª¥W¬WLÕ¹‘ÙHºËÙ³ od ¤$ú±æ¹¦Ñ¶ˆV ª)ÏÈpOìŽÝmWX v‡Uy`]”Œ¦†(XˆÕÐ×¶ÄâëÚ²¥•ZSƒêHdOÓ/Šhˆn¬¡9‰»¨˜Üä섽]võãÒM¡"HŸ¼´¯KÓŒÝMð²WÊZs_MÓ“¼5qn$ð•¾gW÷BñÊÒfý³ZXeˆÙ¾¯5¸Ôʥșa'ð4eˆºeoß‘=ë^¤“NzcåØÊ´¿æåÃíHoEµ£8ÁH+ŸÿEðȵ²ãBG_e”Bý&¦ÇËa•_öšÕI± +óý/¸ € ‚!ÊVçÕ±ž)ýOað€M×AŠc+-> `ÇcBìHòwÅ îty ›Ç  «1§›âÛ™ìÊHú/ò–¡’©éØaÁGœŒiÒÐ4æ,í6‹qî\І=ÂâbšÂœdèF …ÄKùxˆGÒ/Ͼg3SÆ3†Gòi´+Á³?:Pi©ê§ÞJ5M"»Ýâ„÷3ÿù>Ò }ϵeY¦‡<úê0br«î<ȯ*”´NèÕÑ`^=`ë±×˜ˆ³Î•›4—_´ž¾Ä{‚6™‘ Òß½þiÂlñîA&ôž·Q ELÊ xAZ†E@‚¾Íøv$ƒ¾ ¨W>‰ñëâçÁOµ8Bø#:æ2T#£Ê¦7=Y¶ã+è›ge„H«EÀØx›7ýB)M¹ þå(-ûò†(¶ãs¦g¼|T†[‹<µMìÙ \ý8¤3zª„XbQG„äe›e¿xO†ñ"˜ëŸgž¥¬ £¸üõ0ãÀgfù/ï(iå’DS°rZo" ’ûËé""]P¢åÓ#%6iS¹@iÿ'mÒ:-ë³k£WI9³D ¢cEŒdKJIí|ÅcGÕ [úwßÑ nòÅ,XÝ/ãzVáVU•]ƒX#ÑÆ}d‰íú^ëbøŽ^ރȄ×óÍJœ‘L¢$áVZ¤´þïCCTh !OÇüÞ__š†>aÅ|®ÓêùÉ·æf úBë°pï@D½çNÜâ$Ts“iaèÑ=§Ì•àBÍMÐ]î^ùfî†AæÁ ª:YhÛ§8Å-}ä½Ò¦ëJZ#áŠÀ;!hœÛoW WW<àŸoæG/ÈÚ0×0w_5Xân=1–aÚcìCñÁ¨ ÒNg®5C¬y…[ÉXæIËúÚ ö´è58`ÝÈAh7¬2°õ:m E'nj¯CS®OýŠÅ[äF $yêRàØ†À¸¡öÈ|*ú(–PjNpød“3é÷Mq‚¤ËÎÃ]w;G±YNÐôõ8¦èóèŒøÞ$˪ ÄØŒ_ã€S_:Ñ“­ö ‰awɈýSc3ÜFØCíaÔ*p줜k¥²œŒ$p1ˆ”: :^‘Î b¥Xä˜\ /S—³á#’æ¥%rÁ[½X­YÕ߯PÁI‰Véǽ~þ‰û[ÒZ¹·Ifœ%yüœ?X·±9º¾‹?¥¾|ÁÈ8Àß!³SL(V- *5R”¶MÆÖÈ HWàüF·ž/M {ʽ²Èšq½x=ûÏ¢š˜.R© ÍÊfÁ‹¥#‰oì‘{o2n7 µ낼Dƒà]žä2fqÌÎL+ñÄ• S[ÛÅ( ·‹ÕofðédÙCãJBIà¶P’Y‰©:œ´® +fñ8„)bàXÅÖ¼¡¦¬CøJ :sNJ3Ìwå&?¦bûæò¹ux¼'†y}]¶n*"Ž,×ýÍxX2q¢‹“qTÔ‹_ùŸW³Ç÷ÊÃN}¬ÜËëi6ÎgH|9«ùQ¢àPÐÅ•À}¸DÂh(è.q·Ï¤kRý”Ö6dª¢SÒ#s'— REk^îª $Éa°Òø ¹œa¦ïpÖï)2I Õ¹äB.ö+Îî¤xÓrålœ1ø-: >î“2%r%Š»%uêEnØà»X³²m“’€·gºñ8.+tðM‘àR ]Új¿ÞTŒ™¶²Ð%Ç r&ã.úd`à|„Âs´rÝÖ-Þ9yñ.®“xçäØÌ õs6R¯h=Ò7$(‰{ÒûôG§?³â䇸҇èMmÛ°q¸§ˆêdÛqD«âZ4-z.>#Œ{·õ7¹G˜Åx< ôvcMâ­L#ù Ò\»|<\q[-¹ž²Á¸ ÇD0z$©äcâHÙÔ—¥Z–töàáÊûr^Ïbñ¯î5½··[i¾ÐcÊÔ,fÙ§‹Œ E±ÊšÖa÷’üë¢ØL©PzEÇSß=? ¢ú±Óá‚RY]A݆]yá§Ø$Äè½vxpEáÁ†0\,pç’B<›M¦î—/æ1oöÉ´ß4WÜ5Q•ª÷†¿é½Gа`lð”6>‚H¯À´²Ù­Mç›ø¥ã—‡²ksÿ²nzðJ,9¯Ý@>ªÉ™°ê5~áµÝ3õûìÝ1sW¹¢{rC¸~¬E¤î`R ’$;ú‘s¾•÷¤­U/?’Ÿ[à§ Â%Óâ"³bjf”˜ÓŠø—åð­æì„®lWOæ‹-ŠÔ ¬œ‹wßê6)õ3‹˜jžç۳نх§ª­`&R°ì‰5ÑgnõÎ턺 p-ž´Ïir‹Vá ɵCQßG+bdZØR« H‘yhMÈ.dž爹äa³:[0HGN0&f“ñhI‚ë#¿+æ(ù3½u2™Ñ~ù ¤‡V)ÂCWÑ*äà°c§J$q›ÅBw Ÿ<ÿH3‚(™Ô&©ùyà•¦µU«®ð2“Ä µÖ~*jü­yˆûvoÃV#mþi]z[‘Ujv—Oñ*XY;÷±‹GnjIÔ5Å^—¸ŽDÁyÇÉElô@J nY„S %êâ2”Ñ]‚Lð2ÅEò¢ V¹Ü­¤ìNlÄYƒÞjtDÀ|rç¸íø©ãìÏ êc1¸ƒ»Ú‡ÜFÄ=bm4j–¦@E±±U€~hGä#V>)¤T§Ô}êb±7]¸}ì0ëÑF0 J—ôÃ{‘A V(p+z¸Èš¦bWµUë9Â"‚ê¬k—Àèq©7“{—éuèíQ@—Âͤ2ã'‹t°:Áˆ—z°}íÑîЩz)}:ï Ðsßõ#£Ûfû­REŠoÃàyçVê¨Äp2jcÓŒÍÖYi}!•R‘. ë;4c¹ÛIº ù¾HGÝt,e®ÿÊI¾€d¯;×ÄR€YTÜ´ LÞ+¢Î /8zÜX ’ù]p†‘Ó˜ ä[DVi.S¯Rϸ¹X»øXñgûãpF5Å®ÒÀUi>Ö©ü;<7ˆXEèOKÁÿóçÕǦb­*êÎÇ7·|QŠ ‚Æsšÿ-¦ Ñáî!áÎE;âk##/Ë&Øîû“ØI¥TªèÚúîE£w¨Ò 2•Y&$iz&ÔNêÓÍŒÏÈÝÊß NÝ\Jy%“A>~Ó495 Åó}ö†î Ä­·(-Q°5¢VC Ÿd^µ7}¥©lœ’y®cñº½}ܶ¯ôc¾|Ô»"Ìw¢Cî®R2 ܦjhÊúM.?5´|ÈååÖ@¤ÇçÎf¼ß-ÿþí—†Æ!i÷[³yê1°*­*§ù°å¡ÕA'A1´Þ!QÜAšT••€~—Ä»Á¾<©ž!„Ñivþ~áw7p£ðÀ/e¤i†¯±múÈG_Nåd–BgK³‹$˜e ,¢Òܽ gi¾KèÈê`eº€È~H´âŸsZhETwx‹dÐçñ§TÁ¶sðßÄø0šOû#›+>r\áÿPG5EoËî ‡ÌJuŒ«RÖ¨y4«îåt¶^'îÌy`J'`Ì›¡¾ã†x¯:WTH•°êèzŒ"ÇcÔ;“rš¶‚Å̉.Ã]–Ë?l4 ”}&æ MS·LÀBºÖSÎEñÉIðs?¿ÛkÖÌ›ËwNG× fá³éöIlYÓey†@à‚RjNX䑵&!«ÒÒÅ`Ál1}WáïTëÐaÖ°(rníàÔ1/tgI4c?*¿i®<é~ßB 9ÇtE9¸é w û­Ý÷ü§d.¢ÃDxg<ívÌê<|ïÛ¸‡'¶Èt32¦Ur•äèž§‚)Ø“VväC¹Ž“¨ÄE¿mزÆò}í¬+jô–‡ —E¡ˆ0Dªd3Óƒ+‡Í;¯†èÉP‹¯ˆ1x½3X‡Ò0V—“ƒ<²WÝ}ÁÁkᾈ£ "–× Ç8U¯‚?O‡t8ÿºËDå‹dæ©Í>ƒ6É¿“*%q‚á}«ï-¢/Õ= ÂÌÙq59Öì.݉dÁ$®ZıÁÀçÙÛÌ¥a*ö8†¸N‹°‘£ Ýð¼#;¾\[ŽŽ}Yоx”bá@Ä@Aª‰iÊL•S‚à>ß¶í…ÔBÅæÙ"y(`})ØS¯º¹£ÔÄVSñm«‚ÎéÊÓmp’@b|o…™d¯ǂ!wº9%䀤šºÊVöÃ{º"ú÷ö ®«à‹;?vW~}š[¬D“·K®/Vméï^øÌÄ×׈w“²X;QxìQVjÕ'q¡õkvŒiÄé>A—ѲÛK‡`µ’~t~4Ë<Š‚”°ÁMÒó¦=Ö%¬ý¯¯è HŽå”X¥Â@Ù UÒ=ÅAKÉ µ^HÔa´HÈ•“|s$#P8$£±¿Ë F²®Ä]¨Ð3“À†ˆô‚ß å&Âë/ ßµóJ­öûŸÈ7“¡Ç‹$Lú6~U`é IvÏeÅɶߠ>¢†ndÇÃu±|X™b6“éð: y‰Êä‚¡|Yvg‡ô¹Y \w§)ÃxWˆf>Úì¡#¨2÷£vETÛ;z7ˆb±˜’pÃ1ôÝ›?ê±¶ÌÌýC-ÞÊvQH«%ó!2a«Õ&´bk±W:¯ò·x£Î×7ÌxS ¸˜ùu†Ò‘œ½íÊsspõÛ¤®ó¢'tÇÕ1÷¡ž¯WX’ÒÇZ•MžjÞ‹—Ê­lôòRaåt.±¹?’Š÷8&xs¼Ãëù¾9•L‘4¢°·6šu£×ªlH€8G“æ•ñJ],CNµŽ#ƒˆ(Ù9Àjò6¶Ò¢ñ,xŒÀ(ª…k^#[…ó+Š•¯æØÛÆ…<…œž™[Í&.0¾V¶ºüzÍø±æIë¥'\*žUS—ah 9g)g³1éÌ"Ù ¿ª|ÃA§EoǪô÷Ñ¡0åãµ™³–h%2HÛmwÙCú©’±“ëP©‚¹d®_ÞED"̶/²*BÏëÑH@uâÆpâ’y{âO ¦P°_¤‹ïW´ƒZÁÃiPuõ@Iü(l!>Q¤TØ£¼`ü!‰LŸl|÷¨ÏQ¨®GÈ´íøSGM58Ÿ¯n¹»J%Øø·Hbeúƒ” M2UÞGõËQbjPÞaDM›“Ö??{.ΛOw&¯D’ÊŸ¬¶ay‹dŠ‹#;öYð#Ð>ªI¥czÃÃ`ÿ%û)™C[¶õÓ«wòõ¾™ÍXÐïÚɪ%- 9áÚ9¶…¡EšOÏïlƒša¦~ŒŒEZàAIÛc¶Òu]Ç'sK̃XãQ—ÐO˜ üC®%v}Åõ¢H?F3ëWA¹£‘;n –^ÍStbÒ”øË;l ªVÖb}ÒC×FlŽä#íü‰ ™gF ˆr…Þ "-i…T ´ee®­+ऱ‚f=7S³ŠýÏ9™qS H“ˆY 7&U":&×é÷»=‡bÝ`“iñ•À³Y@¤¦W·[D[Šôº×7þùðR_þ¡žæAÖüV}%Z1ë×\¯üÄL(˜‘`u´î禤²š„´¥”Bÿ©\ª²‰xßO:'go×brì f¡·¬å<Ñ­'*Cû-èh-døøÿ¶I)ÞÍ(©^²|º6¢V¸Nþ/ǯ ØÕÁ"Ö6^¥þÁ}>‡§‹NsÒ~‹Vø$…[ Z½½6Ô’Fµ²ri)ODxu)Ê¥¬CÌ xî< 0xé®a>¸±åš"‰-éjGve@p­ËÎú“Ý{¯ÜàM 0L|<ÎÇBrìGж˜ª}Qr7ðt6åZÁ9©ù÷Dåó%¢Ý%¥Õžbc™¶z®ò €¡€É`á˜oeݱ¾@Ä]Ô#o‚ ¿*®Ÿ›a1ZUÒÓž»•¿¨šU`ˆó-×þ©#kî{¬ˆÔëa‹/U…®(Ùí×–)jMùðÙ²l>bew²”Fú@îÈsÚeÖ¶3£rŽ@¢B—×HÏ×ÛM/ß­sSñg²æ7s~ì‚ݳç¸ÿJ‘'gØ’c\÷Ŀ姜 zƒ\k´xÔ­`ò%eb±Ø:½yóAšvW,ÌLûÁYŠ4Ë}KªÌÙÚÍ 7ðÓž §·èå¬zòm Ðyzz.OlòwÇ.‡´8ÝA]û­äÅpždOThç0ñããw€þ‚$ DËÐFzéO%8YŠÍÁ¹Çmª–hQRº×³‹Ét"ÜðqEYû ]ºÌA)øaØ}ÛÔž-8²é=ù^ÔH¯cªÍ!%ž¸Ó¹Ï…‡Ãù{!i!6|Ó„>ñO#H›{¯¼ÑçŸ~7¨Á ÆÙüµb†ÖGËü¿¬Šû|²•1#lÉú‘Š£~¬…'ÙmÉ5þf§ÂôHÄÔR'Z*øXíª¤óc986ÝÑD˜Æ~õ\N%Lv?L¦A“¥‹9ÝDÛ ÀŒéGg”´ÛS~Í€f\UñüV‚ï‡g À5Óµ“ú}…)*yë” €æ»"¼,Õëg¬}EÈ"¼â0C*É‹ÏE( æÄ}T ýFñt„e7ïrºù32lh½VÄtôÐ,ÏÀnÐôiæáî˜ûþ Q4Ÿf“ô¬AL{gÿ§˜J·“À–‹c*s”X–Ó™ò(D€•>΄Ÿ¾ÌÁ>:JŠaãÆÎÝ­êR1|؉¤9ÂÍð%‘ãg”‘MêÓ± yG–’›¶’‚¿HÛEUü;ŠÎ/¿ç¡‡ö6‘=¶)-Rª•”È-ÉÍ YH©åù)L§Íüô[ŒuïƒÑyUÍŽ*%û‹öÚ‘s/3ç´ÉvKdÊÉûÒâŽs×ɑ׆¸fˆpC&‚+à ±z™BOðÑzbÈuèR¶FÊqëd®Ÿz†à±w¶Ë›»‚Yö®²¾%e<úñ+Ùþö\P0T‰ÿºö6ô2ÜšAÏëŒùúÇúÀ»riãÄ|W¡ÉÁš×T”Èö±Z ЦMÒ_L³§@%„ìûXËý2¿þJ3_|Ö>0ë2·4*rÏ1=r3„Ì€áuä”)œcÑ I=ÍÖ¾åW¬ÁseÉ´jò¡«A>Çøˆ€1Ì@LÍïhk³ð¯»Æ_«Jåk%÷‘Ý2^Ø\(z.tÐ]aöâãç/ UüIÅꃥA5Óö:0 ±Å²“*TŒ(B–½3Šz:¸24/,$@ƒ„™•6Ÿ¬n¦EÀ ,+%†fúÙ3",zÐN­VÃÝØVxé™îkYÚn›þæ”h£¶È¼ÄñÈB?DÎÌÈL„oqÁYúIKqx:÷¶ê³)7ûÂRž*çÜ‹¾—߆±c'cù£0qö*¶VëÇýõdÕNo€¢4$¬IÓmWš®1^ã®6Qõ¤Èùù½»Rqëlbli§#Ž~)sf²a£ˆÎü³åkn3·¿µþ¾»ÌS³‘GжŠk ÅÒbJéu³O¬ÁÌ‘òË=F¨)å‘—%^ †Ø‘xµ¿‹‡i)¤·l ¡¹Š%&¼ÅánTªÝUËYC¯d|;¿ïéÆÅø€£Ìï8N%%dGôdÙíè ‰l¨¿œãç. nèxVùøPãÖÌ$AÏ®ºÓ]_ocùˆ€‘qòmÎ6Ò\ŸµËçßõИ83”Ou ör£ô øJLö±\§Pu·±eþ•ºOèÆß-·ZÀ“)U¿{‰Žv‚¶² D£!Lé³Úaç=æ»å¯÷ϸ´ø°4<.ø·ó³6å%Òi£,Ü•ñ¡[Û}”–»U» ¤|é¿åVÖÇN»:ÛK”nL3é æ…q):>Ãàa¨A XvŽm!ì2Žö€ærè*ÉÂÕÈY@í°”ü$1gÊfÂâ,"£{$¿•è¢Å" ¥Úýè;évÓÑc߸ej3d»^þêèrÃÁ)j—«ÃMò~7z «Æ®q©$Ž[Û”˜ÏþnBD PC€´R6v¯,ÍÚcP¼ekiN ¥Œ?‹K™yªâzç8%Nw–-B¸È¦5ôbø‚Þ®¨­/†Q-åŽg†WvdwÔȤú 1„;ñf:K hŸ® µü^•Åi<îe}bqÆ‹E8Ë[d7Ì,æ/Í,E2æðÿµ?×ïpŽÇÇNLsÓNN‡é15¦Mw÷é8yšMwÛ6qº»Ù™¸1Í0ÍéÉÏ÷øþöy>ï?àõ<ïT¾pZЏk½ÿÐÁ˱<®øK¬jyº¹[mQ]Ü÷ ôßðCp}ÑÎ PBÑgr¹ö=êëv5¤¶éêgü`âe[k4)€ÃÐbÏü¢RÒ<8²–ÿÀ3þâ×£°AÊâPúS9)í =‰{±±¯ÏœíÌŒ°æH"ûXß-f…nšù'o {æ×õ‘Œû43\C£SŒ¶jÝEOYȬ–Ù¬bÖ¯–ËÅN~9 <¾-—˲HÂU`º=8ÃVñ5IÐ:,Ò{M¸ìð•Ðt½DƒVìU*}__M‰+k¾jS÷¼Žè]û6Òj ó’‚ÛÓ²·g&ZôÈ–·ý´G¾”>ÕW ì¶ …ÓÑ<ƒ‡€ãùê…Ÿhï ʾ *È…pÃkmkÓ%žÂ<0ƒ×ïSÉß.-tUí±D; W;¸„#Šhþ9 ëj¥A¬ÑÓÄ3]£,û¯E•볺ˆ#ª©²¨/rÉ”-¤5ª`ÞÌÚÐð3–îÕòé}– Ÿý„ ´X⨠*c¯†WSÙ iWè²:¶ÛLçžmûê‰ìýHï”òÄ—NÏ­ L¹Üöù4Þ«[mGÄ„ã¬øÓ¡³=òÄ2oGç9ýð_yØ­vmÿ}¨çŒ/éÁŠ™›‹e ¿{Ÿe3ËÔ<)éZ;Û¾tˇ>_5ûÍÚÀ­=XY"`ÖàH™6ë|qC þ%›0i×"¼î“žƒsƒŠ©Ý«kþH—m¼óƒItËÆF«ÌpBí·0“T³Úô»WÄG Aaðyv¥½uÓ/ÃeZû‚kÉH‘nа)¦F3êÓMÛnσìþÑ6Ëcd"e¼/šh>ÈúžYŠvãƒ;Þx÷k@ÙÝŠu¢m÷Æ×ª$õ¯m‹[‚­\H ªäE§Â®³·0àp 6êñ¯Œ"-ö/Rá5ú}xKÈì!Î øT;èù>W8'œ,sáýè®s¡¾QÎyÄwžK Çl` ÿ™Èœ}ˆÒPÍÇ¡¦éÕíML“c§èŸ…«s))Ô-}³ÊÛɽ…¿ NÉóÑ¿RÂgà¶‹¢z‹Mñ:3ýbüY_{0€ÄT¥_µã/°’ª!ô®vÙ…Ž‡ŽB —Ÿ „Û6•ªqá4“e$x%æD¬…®ÙœTTî'sŠ‘ì®Y¢O`å(4Ã'Û&ÚBºfìj7O&B­)3ÙL7'¡Êô±®Ë× :¹é»o ?@²™Üº¹ h5íWmŠ`HãBQ=Íd]Ü àË¿'=†qùH™ö‚¥¼œÂý÷þÛr½f–®íŒ[wŠÑÂ>-ïúS{Ãn]ÿnÚÌHÛLÈ”ÃG“QzÜ‹öüÕ•ŒgÔGΦ\‹Kìê›LtšGØÐÇT‹5¦AÈ~ªôÎÑPH8,°ÿ2aÃŒ )iØ9œ/ªVL0ÂÏݼ3²`’žZè{ai—܄䎗~-] P\œkÏ6l«§­áiðq° +ÅŸ6RžeÕ–±ÌÕOD³ûbá„ Ÿ¼×Éú©ß#†¿ºô/2åiXGŸLâ’/ÑàI-h5móWT1»JrË&ㆲlF]{t¿òÑà.!y^!m–-v˜0뤔›^âLïT˜ñë/»ò‰F¼àø¢eƾ)†S>•rÓÉ·ó¾5èë¸,¯À$ åcÒ¥éÝ¡ŸV! ì½îÕ¤Ó•ï&’³íõ†'àÇ5Ô·VV¬lIô[þÝÓÏÍØ5xôOwÌ ¿J:#«jëÍË=íüЉ]N¤Œ§Œn#»ùÝ:³òGß`†Œ"…:…ANIЏÚ\dP &)ºeàcEm±îäDE™'uÍÜ(\KD±M‹Jv!?ß‹>ÜUJ¡&±윮/}¨2^ÏUZ¹E:YÎ ñ|°÷%k‹<ú{8Øn(s3M~›äßÃn`«š¯J¯¾&f8’ø{šèC^zêÎãXþeâŒýáõèMr£À—曣Gk«þUK ~[œ_ôL*4›gHX‚·ãÒ¨X¤­º3&Ú®=3“­ Ñ B}/bŽbòâc¡Þ‡6³½QÔ>«öëæ-_uez}jSù×\ÃÎ ó'pXªgN Œ7"`'£êŸßð–^÷g}Ý‘ Ù^.â-ð½Ì!ÈÊxWb”F¼X%[jþÄ¥(ŽPSSÒ°$"›ë9Wü#‹û6w: ñÏk¼XÅË[ϰ* ñV*Jã¡°aW"p=ý.PdæÅ­PøÔX„ñV­0YgOŒ »p×Û~·†«7®m9”X0Heݸ Q(NèãËö ¯åaÞ{/BöS¤y ŠPï)ÑÁW# _ÞzÒþäD‚øÚ±bjŸK¼qÝ ¼ûO4Ÿ…-¶dFâqKþ[™)y­ÿL4—Íä#.ÍÑ„.û}sÈj¿z¦á-ÚJáˆSÒgþ:ÌÐëžÎ±p-àÝ@8ÍaXüLGYƒ¹¶¿Õ²ðƒ޳Õ.Á¿ VkEd5²!ªŽýî­Aâ„-áŒ$1DJq†1}S|¤_©ê,M«+;Zq†…PO¶å¥G´ "PþmH°gÙ+,«ÝßM÷ "¼€ ˜ ¾ ¬­û:ÉÌÙ=²§¨‰Ž–ÖÎjõðÍŸðSÎÍúÀÇJïÀ;ƒ÷Í`ú¸« Rõ(¢€6ú"6½, £õ~Ûö¶°.bOõ·Ë5´ þà¿EµåcÙgrxYhiýE<#Ø °\­½@Aü7`¶Gu÷GÛ‰­DÅçývÒJî$âS–*œ 1Ú.Wc*j_÷7{zgÿsŽ:PÖtHˆ;¯V!£ Z^ÜÆÕ .L.³¥"wì¢VS›–ó„QÁY4N£ÑK˜)©:sd’/MÝb0²;B”¥l’}yƾҟªñ¨…‡-±^KOO{íÜ=$×e©àî=Ë9 ‰ÍŸøÃŽ ¢ëtŒ}nÇhÁ0úIƒõïL±v ¯A¨­àzñ2¯:̃\UÿWts Øàë[@tGÇS?v›Ó  ŽAE.Ù3—5W!³VŒñÝïaYÔ µú]}ŽŒõ¤B:…z“udæ9J .‘fnßÀájáºGÇÏÖv0è/(þ©ŠÓ“ŸÁÚ9mÂyßR* È ÷SöoÊNon£æ<Æ+†M¿XI‰*f£•–Z¿=k'‘¤´ùÜ9£ÆŸ”1µµUp£w^°™0t’JEkuN—Mr£Lo±çð3(/¢™UTt9_~I‰Îïêÿ(«ºlE¼ÿGŠaá¹½ñ:!á”/?„xvÖÞþâÓøýk•ZWÌMq8Lî.¼ñ£·fajIw%<"í–¿._ÝøJÆÞM†’óTõ-b±)ݹy¯bdÑp;[wöûÎÏɱ)9qäãLU½Y¬¤v¹ÿ¥ô‡”¸:¼,twµácP®&tù¬ M‡[Ù1^ذJ¡`_"6/’uÞyåÌyÒ‚Svü–=AãbQ;)Xcû½é«†ñ#{õƒ°~ò_i„ù§='5‚Â&Q¢²eKõ„i³í”šãTŽòÙ²ØéîÉýÅ8nF`Ë@Á‘hmù¦^¾$·€V7ú'æûÒÉNC½šùw²S¹g§x»–l‹¹Ö6¬â §# ®æ;Û)×¾ô×1‘öãÆRî(®—Xr.’@MOrÅYlmm¼÷Œ´Ð–aÞÿ›ôø¿<–t/V!Ž1ñq\å¿§koAWqÓÄ¿BÔ›AÒªloÅ8L©564Þ éœ<KVQZò£óâ]ú³J@‘ÅŸIOjÐÐu&û‰£‘ÉB´Eƒø'‡ëo¹Ú¤þ‹©¥cCÜ•°–Öž—Z§ÅæÝd&òiœ5£%Þ ùù‘rUW:å×}ÏŸ 6 e„Úƒ>8,¶~pöR`–.;ñ‡ön¯#ÚYzSN)®Çya,b•|µÊ˜ô䮪FÖÈ iÔT6ª9½{þtb¯_R²¬Ä¢Oæª—ì³øo´5_ NÉT]¾7ïúAê™´å’+b¥OÒCÈó®g5¹>17|Ï2-ýÜ“ M¶ Ów™½We¬ý­P¤±¬SD!qUÇŒK¿˜›Ü*IDÏ?‡vŒgn®ŒíïÓ𦈜gœƒo÷݃œñÞÉ‹5Tüå@†®¥h€Ëb\ìö>sFôÑþbÆ:©oŸÈ/\¹pj‘À$¹ÝçUÎFcHêyP{ímâÜÙ?û^ÛäÇ; öÖÎoHº“ÍŽ¬b3Øô zµÊKÒã›;b$žSØm‚»â$&«oàfEhê› â§xÿНˆzfÿöSŠs¥ÄcE]É^‹–ëÝ,Ó†±!1Ãx/žè½Œfè@v¿Ÿâtõ"4»·w•Üå¨MË nC]ra$é<«SnöVcßJÜŒ§×Ë'$ß`5Ž0&íþøð_X9ÛX@½Ü\, N€ÿ8û.¤endstream endobj 300 0 obj 20709 endobj 301 0 obj 918 endobj 302 0 obj 19965 endobj 303 0 obj 531 endobj 298 0 obj <> stream xÚ]PAjÃ0¼ëÛC!=8’«1—PÚ†¨}€-­]A-‰µ|ðï+«"…V0š™ÝÙ}|¸Êâ¬Ý€Åé(à†‹[IaѾöžñ¶{î¬ À¯ä”Ä£±š²œŒeeÚ¨QzÕœÍr[Ϋkà·H.68¤‰OŒ¿“F2v‚Ãg+#–«÷ß8£ XÓ€Æ16ŠYÞúŸõ‹SE”þ›G¨.3(§qñ½Bê턬¢úriZýËŽaT_=ee%ÊSÒæßݵïsO¡V¢0-"ìÃÅû]¼ó»+Õfrôendstream endobj 304 0 obj 232 endobj 167 0 obj <> endobj 305 0 obj <> endobj 306 0 obj <> endobj 308 0 obj <> stream xÚíºc&ݶ.Z¶moÙî²Ñeë­.Ûê²mÛ¶Ý….wÙ¶m^ß^ûœ»ö½ÿî¿73bdÌ1Ç|Æ™3#’’Té;£ˆ©1PÂÎÖ™‘ÀÌK"jçâhtdüfgmJÂÌÌ`ffF¤¤u9[ØÙŠ9yI4€¦$".?HX9IX8y9XxÙ¸HXxx¸ÿªË»8ýøÃÆÊÂÍBÂÆÃÂÂ…ø¯ôbŽ@g;G¦ÿ˜ÂÊÖÎÍÖë?mf¶¦f‡˜ºØ“0©ÙZ8¸¥ÅþúŸ¶@gvvf6  ÐÝÄœ„é_“©zØÿñ±üËndkêãeogObfdíô±0þ½ z9¹Iœ]€>^ÿWÏjˆ,,$¦&Î$ÆÀ¶ˆÿ¤—¶5³#aaþ/û¿ ú·Ïèèô$šGKò6S;[kS "“‚³… „FÔÎÞÃÑ⇹3 í_ä¸yþ…ó?’åÉöäüGrý#¹IþiÉw'g ‰´­‰£½ãߎ˜HHD¬­ITþ•Ó‰DèttýkýŸóK¸X[+ÙüSÁ?x“ü ïÿ[”‘…µÇÄýÏ àUÿÿ4ÜÂIÂÂhªdáü·ÿB÷¿ÌÒÎFÖ&"¶?¬$ÌÿeR³5:Z[Ø•ìœ,þÅ.FVVöÿáS5·0±²:9‘p°þãÚšþÏ‚ÿ¶äŸrÿ“FÿøÄÿ¢djaûƒä»ó_9šþoÃ?n%#‹³…ùÿäúGgù?º¼‘³£…;‰óßž²ü ü{þ÷É—ûoBþÿ÷Ðoßìܽ¹¹ÿ®Œ‡„“‡‹„›…Åç?Ê7qqtÚ:ÿÃ¥¿kûoÝÌâ/P@ ;ÐNO¿XìB[ÌÚ̉n­-B$â‚^5ò3`hGÌñl7 &$¡œù»$Öe`A£¾-Ö÷cÑÂ©î˜ Ç™B¾ฟT¾ÿ¥KC³•`Óø(Š—”™o:ò>l¹eƒtH ¥ëòË´Ó¹a2å{›£ä{6ÁFÜð`Œ±°ËP û»p-ô`.¯9rÿôâÈÍîÆ”Z§Å¨$'m,åf©aœž©ä•b°jRnäp\aX6ôFWl£g[euÏòÃg„|ExÈÔD&>Klß)5l¿\¨Ïð',æíŸPb”\§-fË“R–æ,óàqÈ*âvÙ4Іv¦1ÔÇd=Á”][„`´ÁpB‚7à1kïHþ°}V)GA5nèþXn‘¼}:«±Î!—7ž5h‚¥Úo³­œ°w‰¹ØõNW²ˆl¦á UÜ{§bå~Ï{WjŸ/ŽðKP±ÖM`÷#ÝóÛeï9 ~”zŒ I,ÊÙæ‚Ø•­µ½'vEšÈ~t¿Æ$ñ¨Iƒ{'"%$r ¥S‰Ç-FKcoY¿-¹‚zXÇ‘ à¾×[Ö˜ÙëËbŒÈG¿‘8%¦ Cn|'¥ZTS›Æ=]ì\Ÿúq²Ó·“÷^·kq½n顇tÉ•šÔ°UÂY‘ütwéK²Û‘ªJ'Çø®aü±!ß ïÃñ 8ÝÔÊ•ƒä(Š'¦„C¾<¸óB„îÌŸyÒS¤\'¾ÔBoÑÿõŒ?Õb‚œ4Ñ0°Ã½ª;ôt¢‡Û! ûÓ$"äÄZ47¹ =5ßNÄÙÄù¬{Í)¤ $O"…§". ]±pµ'GuLŠA„EA®ÿ‹ëů(&´˜ÃzF¤Ãƒ_ 3ÔWüÅ$Šï ¤‹éÀx{Žûö¢!ªƒ,¿PæCX‡K¤J©qÏ¿º™!|@ôcƒ ±C]ý&5Q¢´p×—Ûhi3—žHöv9íM3_ÅËÅ<ô^ bÀ¿A¥8÷g„¾ŒÆxUÇÇ$Û(ëk¬Z9øgáîsÎñ5T™­ÛS ZgĦ«¼(¾ÀÁ$¬ƒ›„1BÀ4ÇL0˜MZª€¼ÏFßa­Œ…|ýN_º‰'Ÿˆ#:qw`„]´Å¢ Ó†”ìߌÀЉ1à‘õݸ¬}âoËÀŽÏd—²“]c¿½‚ñ5høvk“KÁ»[çøÃtÉŽ`˜ÌãÐÜòÈ{V`L)çœyQH…ÖtËß:p„U·A&}´×éz <嫬„ïb«NTô7È·Ÿ|»´ 17â“Ã!ŒvºÏ=Ó09ùfË=Í" îB»ƒº¾Ud®Ô)R7t¥b‘ žÅàgÃôÏ:M¦ˆéüÄz›/Ñæ‹£_R‹Ztñöãóe&#Êó½Î©ž]¡%½BwD S|–ü]çlH u‹³§{lyØýY™J®$K2é31mœÓþ´¥ HQiæ)7¥hâw†µJÇæQÚ@ÅÁ]¦ä™®¦YSu˜{jæñ“ùÝçS8×qw1$ 3°ÕÇøõÌ/î=ŠuçéÅ`ŸÞw ±m ËŒ( Ç-îöÙõbz*ió6—áYòÙÿóÒ‹â|ÃÌú`_ïÐa43/þ÷kÄðÄ´îíUZ)ßbòSRôËïSOÆEŽ1Gxú8шÄýÃΡL!A,:LüÛTß¾]ÂÀÙ¦CØÃî…Æ3¿ó6oöǯÅÒâj÷®^œ¤$ÏñÅó§¨>˜ß,ˆ Qó*îÔÚî­[+ïöX'§BÙc’»FɧNÔÀæäKÅvþ8!&°©íì•7êì¾*ÆæD€êdIï¦U‹ÝHŠßÏI°xÕU:Tiw‘Ñv;DF…"JÍ[¯{;œ•˼îðÕñ=†ýÜ*6ÀºK •!ÌDbD öøÀÜÁu³8§|³~ ,KD˜× Çî3!¼±ŽÕ“-ø0-?î¯1É„wÂñÕéxHEÑ”ï~ˆ‘X¼ 'Û½ÏÞ–ãO$ÔL×Û¸Ÿ¼=(:+:¬òŸª‘¦ó[ÙÆ‹>;n#a„'E¸¦9¡UŸˆê¡•*§zkƒ¡¸ô~;àÅ¥„ì2¾·†Ç/_žŒÙáü’kHãè³WHÉ Xñð…è=ŒðÚ³O?’‚ýÆÊ’ˆ<Ô{¬éÐn»sPˆÑŠ1gY›~nŽ,€II%(¹µikcˆ—B/èÖU™$R—åó#Ås¯´Vl"ð¦ÖCŠžãl_éºr”ûyç ZÈ€eÒë¢Èívu^ÄQõæø…Àwd\M¦¡Íz:Xo-óSùA²†Rô~èû~–ó¯éràÛÆˆ&aŒÝÉ®½‡Hš0rÁ;?Ï%sœÉJf«ÝµcõyŽCÊKX É ~‡G¶ç[yÏM¾ž”ß,ëϬ•jÑ0M\’Жqç8îüj‹pÑ›PÐzËŸj¸V"³á¡Õ¦Gç—?ÜÝ`ëµ›A,ÐUZ„)|ç{⸓PT@½Bj±àåxM@J­¢GÌuêëšUŽG‡+˜Q:nÌ¡Êx¥'AjOþÑ,iÒŽÙjÍ/"üdÀ±5x¤ïÁ4ðËÏבòNÈi<‹iÈ+\.Y-Ì·õ×ó;°°‘Ö-CÍìímäâ:‰œrÃ?E¹ls8Ì€â#¿£N¬Z“ªø‰Ê‚­ØxôІ 9$MíùáÑdÅ^¢\v”cZ¼©ßÙ‰ñôrßžl#ÛùI)îa=†[¬ôyT‡ÛžËÊ0ä1–:–Gërp˜L]!-Ë•÷?—DÏ8º¡ŽµÂ?ƒ=#¦&¥›0sŽ9óÈS8àw‡X V‚îk¯ËÅ^¹“0õШÈÈSšwÓWWc·„x ãdf`ï–×à—g«™Ä•¹¢ßzQÆÁSGŸâÙ¦r™#¦20EÑW²4Öÿ£úº‡þô]=Î'0!ýT°he«9°ê…7 u3£#Á¶=Œ¶‡uHX7jH ÅG‹À~m‹q‹{aóØoÆ€“…­ŠÐ÷VÁêP)ƃgJG5cÜ@’·ôíÒÞbÁ=Âb­†¾‡u6/xa§Õ¿Õdͳ8ÄGéWòY§|³«U¼îór†‚ÊŠK¿HðßG4=¿¿ ôºx¡ƒÙ²!0±-ìl#eÖ2¸£„…H ˬ÷½a¤±>©Öh—¹‹¾'`åÙvùf8\èîÝ›$)+*ÞððójõA:nÝÛžb,öT+ÓRÓ¡ˆtŽÜ Û¬4Œ}ÒâÔ˜Z±ïÄ¥CDŠÂâF®¡ÚæìÈ9ê%éq.ÛEzäK ¿·ïÝóšÕùƒ"þPFz;Ò€Ûõ䦹¾–ô옲÷ÝI oœ˜oðUíÆ&Úžö®îC8ê~pPORYèÎìÄr·bÑbµ~ßz²-Ò²L+Ð<\á ^™Þ"ï«" {œ„÷;ÆEêày.R”xÀˆ¡Á\Ò> Ž~ö€J“„¸iE-!åG8µÇ}™óeõÄ{A˜üF ¦è“!«gºÀä²í§Œ•àHªg«¬~¯„ˆ‰ía·UOV£Õç–kÏ®ùC.½ïü³á$nÂòJɼ„Wzb¦$ËߘH—´ë3Ρt{²mEUæÌŒ`wÞ~ëZ i)"‡.=&ø :·™·ÿEÓ‘ùÊÌÝ‘¸NßßÎÔÆ®¢äÈ):jØ‚á6°äI!ó†xÿ,lAß›RΕ};)lGDþŒ2£’س1¿$wuÞOi‘à…¿‘KÇø»‰ ÈUB»Œˆš4Îâd–s,ñ¹t5òKpð4¸ g/B®]ÅËù\Y³´—$ÁM)YÇ"ãÍ9næýßYÏŽWŽ!tzÈn°\èèîpÕE[ ¿ÈjLkèû Â‡Bç-:ô˜¸âÒ-îŸF•÷,/1}9o¿*Ê›,(”ú!DÞ4Ü Ð>Ò¨ŒÞEÕŠ'|…ŒÈýþòìÖâ¿Bg¨…> ƒÎOj%%ž¬¢µ<§6öØÉFn¯¾Æ.äö¾òÍRä·`³á¡»EwùjˆR˜s„)<¸ig± ¾ºV’¨Ý°¡[Y$ÇhBž‚¨=»r+ß|`rašR:>â)æ¶\y7À©çÆ2‚ÿ„šÂ)"WÈIÁ:ŸÁUÈ.KÉi ÓòñjQ¸w—Tb‰GÖ¨°¹Ø”ÁÏ[KB­j¡…;¢eµm® ëçqÂxÛ¡ÐZĽáG«–—H¬Éº¤©åÐÊ\Riú=Bž…«J*ÖÜë­n.¥>¼ø`¼[î¶é0 " 3zªÀÒždW±pði­ns‚‹r*¹ô>¶~\Só ¤cIÝÑFC¹0µu¦Û±ŠWFèW*òmgSUënA m­‡<}+|Ò¾øÕf HÊ9:åSÔV£ í·²# 6)IŸ©𨫵úîÿñ0+#´ƒ[„™Õ)Aâe±ð ·þx‡NåxÁÚr'CâP,–̦𯰞-’X @_Áb„ë0÷;z«Û³Ëq7¢W[m%Äð@®Ú×TÚŠ½I*ƒƒùÛ- ÑW‹sB-?iWɹ™C„äO…Î^:˜ð!ƒ®qoGûæñƒ °©VâMÒ`ßÌI¯íYe|£Ò[ƒäô£HÙk+ŒŒ Z£a.R&,Ü÷2[ûv¶(YþY Ý-åÔE\ÓXœR+¾3S¾ÂkH —ZL'™EÙìç3æ™@TÔI ôGS Ãw¦#b@8"¤1TqL]õà҉FĈ“¨ëKA’eJ¬ÎïEãµ5ÛV•Bp&ì„c¨âਥ Äì€ipA¬¹Ä°=‚²t“ÔYC†}€ î]rd¹°í‡Œ©“¾Ž(Z'²Y‡ÈÈÉ«©Q*…zü±´^²Y¹\}Ä—ðÞµðqüj3Ð:F ·ƒ~'²è Æà°zð3à™ªhW›9‘‰PJݴض8·í‰7º¾Œci_s: ¥çOó‘‚s—üä±J™™$w(\R»ÖZi6¾ÛÖt0"ŽãÍGõÅXÕP'-^B‰'"·d¡¬,wmذ®ØyÃ+7?,È z׸õ ø¹%T ¬0·{‘¾‹æ í¦ÊÅ•AËp§`lÍ[Y òð’TÔÁù6aþ‰ËB¬YÚreô•c¦Z§7ú‚]~¸.£íªŠó®ö`¼Ý…•ëöàÂŽ #K­âcCyq* ;+vþ¼ 阗&P¿íöjXVöÑRÓæ;(û䛈h, qõ³x/%QúgûiE¾œ´xcìPP“fÚ›$•·>¹À)œ¿­Aü8ý)fwm”\è}·øÕÛÙfŒbîŽÎŸÚÈóc­îØ>ý&h‡\ù»Ÿ‹¼§DHÈ)ïkŠ{éq2Ý+8ç#{f>ѯ)îT)‰7(bŒo`‚î{Vì¯d®'{:°êS+•©IŽKÊätÊ!—…bj¿²Oa?=sQ >¯ÓÓþIQÖŸ@ê×LÓòš‘O‰r.ÐF7’XC3ÌlTÖè—<'Ór5HÿíäjoÃÈÆñã@7& õdú8õ¡nù ã ¼ Å© lM®»P” žÃùÚ{¦ww¬Âp§i¹Hq²»ÉËý·0gEK9¬ÉïÃB ßuÑÇ*„±T´·¥uõae?]´I6ZÜY]w‡Eu©ÑGf½/:FÛ%Œ§'C?p}±Ì •@`lÚѵÄVŽõà—KÛ¶2°ðŶڦ·/Ï‚ü×PVYFGêfkÖ©3e#áwXÌwm$eB\iáÌjôB‘ÏÍgûUÿ{Ó9õíÍýS&Ï™îî»ÑOYls$ éMAµL|ãñä üŸ´/Üv Ã?J” ƒàÝý¿ "ÿíüý#>ô­ˆ×¥xÞàw7øT/Ť(ω/€Þdýg„v3•“\T^"êy*Ë`‚¦QÓnÐ x÷÷µ™q)!TÖÔî@9±×vš%dpF½¦¦"¹Ü1¨YÏpµš` ›1pÞ ÉŸ¹íþ¦*[³êh#}ÃÇl‹¶p â¼T:‹ê¾ËÙ¢vñ¼ÏîJ I*¾²7j*`”íbƒ†yZ Tèwcº(`&ïߘ€MBG:²”Ÿ·Šö¬ýÁ³œbNú‡6ÔƒûJüÀ?Ú0¥ã³³}·Õã+.îC7Ïå+“íÚ'{[ þ°åÀv§Ó+6-ŠC´ ³¢žd[³&¿; }6QCõžzØÜq‘¼²Í¯¾•Ua¾†(âïE½`/îÞ @>¾„†>˃Á­WTÿc°J $;:†yãÿ¼GU¹eÁ_µ?ÃH]Ƭx±ÎÖÉÌ¡ó ŠV m}­ÉMo‰©ô/ô4”ÁÂí-”ÃIžQŸqõ—ØaÀ®VÝ‹«pÅsße+c̾`hsdÁ9#¶ÁŽSoôÔJˉŠs…b¹Ow¯ôÊÃ;Œý€¯C?.[oÁ XRx7;ü=Ðç²î5gHôCü%’Ñ—qsVC?3s`ÖqÒ¬vz“Öó쀟S}îðË ?À©’MtÙ·JþÊÆc=ÀÕƒBnsÞXê­µT ´võÍýž]Íhxði .´'ëoÆgó¥7¡eáÖÖpk†3¼ÌæAœf5oûsñ¸‘9޲:o5,´„ŒolNa Ü@&ø:¦ÊI+±. ‡µÅ¬+’ºÚÙ,iÙ#êï²òéòJ R=YdidôR=DØè;½a;)T/ß®èŒõ•Ä™ý=…K%ÐõÀ­^…ŒbïY°ª U°Ùýµù´&†”þJ¦ ïç-Þobüã_~8…Zˉ<»tXøJ®ƒGF‰ŠžÑ‰áïÛ¼C‹1›‚aÛæþ??²‘!¸¬QIål ýÞšr-!¯»6YtÌÔŠÓ¹N%H¦ÎEXàå‰&>Ljt®óìù5Œ ,%Þ¾½ „(FP¼¯|ªLjÛ+O¸LÃÄ{žÑgù=¹g Ì•ÌòÚæ^¢ò×Ñ :þË7·íoî"ƒðÃoxöÊ̳|,ÿH¾ÜSjéî,Õ‡ _úâöõ‹2£ý ±ÂŒ†‘¡ZsÕ^g6há Vºdœ¶Ky1=-H†5¹uLS=+ óÄ<éaíK̬å^ö¶fáñ*H%&u£B \n–`ZNRpmþªî/zO¹>i”˜Üœ×PÓZ'çT—Q«aÑSöü#Þ<á?õ ¶š”p§Øòá£í†£*ÜÐJ$½¾Þ™QPä_ÚÉœøÑÑ i,I›ñæÙ=óµºÎ°RÞµªe¾:mÓ&}:³SMÁ”9y.7Ź0ªwß e¶ßugæ[=Ò(š«0ƒ_i—Pïhfì y0£ÙÀGYá‹2•ZYrp›ëé¢'~ù-G.">.R G”P¹jÍKUÃPÆÁȦ*«ºåÙù‘ÏÃê<•+HNÍB‚¶9+/žÕ €VuJŽaHŠÀÍÒ?ʨ‚h%7LgcJœhh©²ù¡ÝÁñ#=„m“«6¬Š NTÒM¯ -#SW½(Ú¨q`ôvÎ5dlª8ÍTí~ęɱ÷n2Z|Ñ#ˆDðA›4j¥ŠPNuû§ e‹àG,ä8u>÷*0BDrôd­A(Aômf6¼².ö:\Iš_@_·:‹o#»”ÔIËÇ ˆaS[i‰˜yÙ/ÓÁ;i""|Šw$•ˆ¾òæÝ/×ÁfS)*§©±ßì?:Y|ßZØy{oÑG” —|ŪçGÞ0÷×…A)÷Z¨•ÀöI2ì H6`w¢½„}`Uߨ!+'Žíë4CX>}»ÚE!ÙÀm©°+«¿Â6Û=Jð„r™Ë|8¼†@²£=7ø¢FŠ%ž/ë6Bq;‚P‰+÷VÊ@ï´G»Ôx—:÷ôJžµ³/!H«÷sã Cc^D“²àâÂ&ä3yÍŸ|t9|—{<^Ïi šˆˆq¢% 3¦[=hÔ6×4Em8”&’:gÿË{¯¶áÅt‡´·#öpI_!Þ— Rk Asâ[ò²_Á½N¤¾úQ¬/ùýu!e¤[6jàðˆ6æ;]ß3O䨡[»nD²ëÍ}»³:Mü>Fy(‹bÕù¸c1_!¨/œ M™Ö›Õü‰Û#FÊÁpó<ÀJ…-ÁvqµÃøüpÈ"~­axü!ÂA tÿp'¤ ¢D:«%”KsV*EW¤ x‘ë·&ÙõòJ‰*5št­iÎ ó<±¹)81Ð丵%JѺ^xêdžE¸bˆÝh‚F¿érbʹ,, ›‰9úPê]ÒÇ,þ½È¶ºHV ;OÙ.æV*ÃWº¹  Àãe^‚.n-…¶ŽýaTÆÿ -»®Ð`sÛJ\^šLšäp-/²Û†jòZIg½&4(x˜ãukªà´åù›^˜ˆ¾q‰¸½&€ât;ܨÔR:âuÇ&0GXÜ+ÌÝÄ;½~…pã ¨¿g¼ž"16&Áxvw[ÚôFþNõ4´jÁýæF<¸ UçeµnQ_þÃÆøø°é¨ß‹Ý8hž±„ý€Ã…ÞU¿OÜW#!ýMW#\÷bDä¥J|I¨-1äû†Šõ÷M×Q³¤*Ž àjZ4Ÿ“’Ût®9¼9´ä}`o·«Žµ^ >9\Dû1Ùí.¿¸ñº(¢g‚6=n\úõ®[М6Þ¯–àUÁà7¶ÕBÉôŽN${»-›h|d€ñÍ.¬ ÊgKÑ8¸¬½L½î~^ÏA)=üo%×.E) €¡£¾=•ÀÛ=8¾››ZLæ`düSë†3ç›}vÙS_ó!Ú`EºÒ¶Ô˜£”ŽˆÚÁc›¶çßAy0Òf?w±·”ˆÐªÂ+ë¦1ß4ìi›.„íݤUg6M#w)¸Ü"YºX¿µß¹3ö†¹«†Z¦ÏR¥xÄ ,ý–xÒjC?ãl®éHïÇΊDà·ž#¼¡JQ tžÉ‘§üˆIqD­„ðp*¡#p.95‹Þ¢atiåy/Ãm†¦V_KX”¨t4´ ôŒùÝ£äª\“{Â| ‚>I ‰§¥æì11Àþ¾µ\3~‰u®my—Ž`ã>Õ‰/*4ý0K¤¢y[cånìÝíùëMÒ×Ô×*” ⇲&è¾Iî =Ë¥gÃãã~x›ˆ8ËÃÀ›éÞwÑYôõW«@KŽ˜Q^4$­ïñ°SWzè¨ ¡¥ÈuôÕa¾ÌÚø³ç¡jØ«¤7¤Ì]Õbr¡œþÜÝÞÁ>¹uvJÈS=§{¶·IÍqÓCs¸a¶æHc"èâz\æ49gê^ß%V >‰À᳊_X¤^`D2í±–4ƒ·‡ú ™¹+7ºiÄãh*¿>ûcõ¼ûæXi Q‹D`Ò~SŸ¾B-ì³]n·J] Ø¶vWÉs½~"­ˆAû‰±„VÄ?«Š˜EÆJ ’“¬ñ ó³ ãýÈt‰8åôôùâ„<ê刃òÜoó7xáO?«»©/0"uã(Fáu>ÂØ»tÕ¾t’q†«öB@aÜ©~Õn­…OEãM£ÚA—wjPvÀs$ ŸõDßËŸ]ŸP£` ïÌ2lÈùÅãwAÉp¸·æ‰*~‹}(K ‡cqó®4Õ{kw×Q€ôšXõyQØÉ¦¾õA'K»çÜTIǾÁ¤ŽÇó ž9¯ÃaM°óu€Ÿ'hÒSÒ-«·t¿ TÚ—yòi)Õê©(œ‚Wá–¿P[ð©§™0–º隈|¸0GÁݬËÉã‰Y%©Š$óW?Fè.†IË Åæ¾qÆ%É=Û‰â zÝv«Ÿv¾®jÛ1ùñ2‚Ò‰‘EO¦Š· ü õNùZÁýrÅK[£³Ÿ<Ï<»¼Î¶Ë`ýG>nd6Ä ¥¸AߟB×N;w›‹öÉ}Ÿ¶ÁãÇÀ¦MRããä{eD%¿ÑOõO´§9BL°<öÁN÷Lïmtywó^WaíHÂæ±}ÌôºG‹ÈµÑõÆh› T‹ëbøl™ãìh%†ÕÓJ(®íh:/z}íQÆŸ³!ù+eJ!>*öçMz}Œ¸Á WK‘Ç@®_(Ë«½®#+É^}‘?­‰®¬ÚUtÒ‰o½Úhf² NÕ‰†CŠ'm)jº`‚= Þ¹Hl{o=ü&Ú\âq›õ“Nmóí~Ûá{†ýƒ¬N^ÙtJÉy ȥ׉®!"3ræl*–i'uf†«_“&@joõDÇ> à8•Ôiû2eY 35ZM…õ†e§‚3øI‘Ék£TB¯¿'7ê¼úxz,¿!qs í“ßÏtAànìÏ9*p–• Ü)ÇI/[½iŒ“œ%¾‹EdÙ5'_ 7ÁªÊŒ]^Ó¸§Ihzì©Åàál#ñ.TµÀî-¼š®PáõÁKÉ'ºZâ%‚ Ü›Ï[o¢ìOìq"\·à»¼¿Ú]äzºCù7 ÃH¥Mîë"%»6Æ}'}Ñunwbã¸çIq5ÞäˆÛ ö˜*œ}]0Œ)à!üqìk'¦¡< ?.Ѫ/Â)x‘neºÔšå]6/•DzŽ,]ãxÐf™FPªEó²ä*< èÉO|o5/¤kàÄDµÁì©¡0 á´x·Ö˜Èe²Ä ‡|ðÙ^ èŽâ!ç} 9;ŠX.ʧ)]á±€1â‚ôÝî ¦§#·¬}8ªØvåõûðžIÄ‹]/÷Ä I"¼gHèü;™[å)2§â5~À€ÌÛ'W Ä[ø{12 5õÊNcºiLî»Ö8\jš4œnƒ@蜙%¼\µ-„â;Ÿ*ÆWÁ°j¬CV…õÏt&ƒÀJÉ”Ÿ>¢¹[à¹_ؼ- >Q}A©J=èuWe ¹¢NŸw+Ì𷩈(V‚Üœ<‰Òƒxˆ(—Ûòvb¼EñðPªo èÛÞ8z>´AUùÉý‚E£lì´PÛyP7{²zÔj7“kWÍà( ‹nN%D\Õ¶0>­UÄÃ+Z—¨©{Y¢’±¤œ* Y` *­Ôôuy :ñWÇWŒ½Õ!©ùÕXP˜áÔ¬B„Ñœ6p©býmõ}çuº]hë"){ý;¤ò Óéæ9™jêWÅž˜ÉÄ*$Aù¥P%~ÝS¾Nã\ šÍÄù^Ù¾8Œ·¯‡´ßxGUɲOƒEç¦tŸ`l’;Ï« >xš ˆå­V“$„øÞ0cÝÒÙÈÃëãíLH}õ¹#Ã_y/PT òå5>îý¬›0ÑóOo±N«M†Ç)ì|¤Íarâ™a<ÖZex¸¾m¶8ò1BKuÔEŽ­{Rz7ùð"@L=ûÛ£µÔN yž$ó3ïò”<¢ñ; p8”Lù”\¥ÿŽE'õ~ºwU¬Ëâ¼½²7mFJÚeL&ú–9‚¤#m·íw‰JmHöãY aè¡ «cO[' ½í¼]•æÜêÏoî*psy-áùT´wp×XSO-)Íž]ÊÄý86Ó׋¼GešŠšsJ§(ä;Þò[‹¹¥Ã‰h5Çœ¿ZbÙîPø¹ª(Ô47)c/6|asIä†N ³wlÑ’€…™“¹yžv +„Ï1غ»® 2œÊ ´;¹z(š^ÊBý»wJª—›T±±9oÉ›hÁü|­¦ÜiÎ<³Ðn¯‹´Æp¹ž)ê7_?'‰mõðà¤îàOAø$‡ŒtHºî¶ºÎMâz^Ä{unñëg+ê—9ÄùÕ3ƒÌ¤RÌy᨟OwÍ®–¥Í†Îû.H þlÎeâ(¿uÊy¹t!7êÉ_*% ¤îx”¹N ¯æ‡ÅVÕ÷ôa^²4;RÞžºùw·åúQR~cåL ææð­íì¡8x!§Àÿ ŠÕ‹u2°Å $)ï7ÃZ·âxØóX†3ÿ4týË*¼’ËyöóFùö^:Íã7z#º{.øÛS%ˆÔ@b¹8)ê[ DÛlbß‘½¤8÷EëÅÔÄ;ª|Gws°aØC´žbÚB«j ŽbƒHÛdâÆ†åA?è¯ÍÂ$QÜg9£1¸ºØÀœ€ï¢÷˜k|D5èR3ŸdNÊ8D<9•”ÍÜT®u㹊±˜K_µTK8Ñ UFK7£»tÔ“Q–Í?šV1ªµõ÷ʬˆ‰RC¾Jnœ#q;åþØH1«,@«l-fjMt)0™”ü˜"ëÑ9-9%nôÌW­3— àè=OÚ0šÝHÍÊrMÿ´Ç©(Õ°°ª7®„RÕÌûS^}‚Ï3íÛáÑ+8f§°=§á/¨˜™RÌ̹ŽÂ³°}ãÛKÇ_I\€Y™?À}ëT‘¿0¸uzÓu À \‚RPô{Û ì©ßiD±éörZg§Îºkö&G+ɂƂÍjGëâû¼ôÔ´“DSÖŸ°ž~E¢y* »5±ÿŠZWs¬"´þk슆XÀ®g~­˜‹Ýà Ì ¸’Ù$ø¹?WGf±˜öcêUæZšvYG)ƒ«â9‚Ô•|n}0‡ñ·F$§áÜIúFÖ¿d>¬² ÒæhðÇDM†¤Û(ç½öÎeúáñm^«‘CdëÚ'š…aPr'Rïõ^wª$Áò6ìU1È€E‘}k'\(ßÀXÚ»&é“è…FŒgŒøÞ²9žƒ–'§r ``ƒµ‡Ô=ö“ù)×’©tP$\¸Þ›oÁ[@Û%§ Òy(4îÊÝ˽> -³%yÃ6馨§¶ræh­'Ÿ ¦q€få÷êýÇñI K™[vd‡+ˆ°—Ûí¤‘½(Z¯ì¢_Wõóc–›};`‚•ÚMn9¶±5Ç>HUl’&íw~S“s>³ULzØò[ÐgZ?·à¯ÁJYPÅô½GULuÝŸ)dÀïÄÔÚþëyÕ1+”F)yñÈš)[¸}†i ´¸4ŒÏB’´,4™Uâ2p#‰ÍqÁb„²geS}QG@»eG².ðmȌć‰ã¼ òGSt̯"[6¤~~,ìŒòŽ+’“xùÑüµ\âíä}Ýy:ù¦e.‚DAø%a¡HÞ~"Ålœ[Ûu,vRú8[©f¤ÔQéƒUß'Óý·Lk½×*»+þ ±¼“÷êj)Õì¤^ÛËyž0bƒùLJ°‡»fÙuÆ Þ$1âîõLÉ´ü@_¨,‡[ñ |·/™HpãqT]BÈL÷ÖÙ›G~AtÃyEø…CÅôÅÔ÷ÄÐ z° ¬yÏY´u½J‰ Š¥Å#q£˜nx;Ù½0Ü" áß1½‰dÒé…NyµŒö=T\!Ë}øµS)ð"O?Æö ’‡¾8)ûÓC³$ó*ÂN2þä%…qž%ÈØ ;.…:”«qÆŠˆ³y}{\Ѧ§&C°™½ÞÛ-ÓYÆ÷¶Û€UX릨, O~`TUg8ôWOlª˜ÜSáºQù&Õ¶§wŠ“ß^>Ô8 Éó ãö˜Ÿ‹  F“©â y ©ã?¤>LL¤Öžíˆ-cóI.#T7áKûír 6Ê2T¤O¤,&ÊRé˜4ofNŽÞq¦¶µDqÊzG %áÝEÔBãD±åhÕ,«Å“æne\-ûEá@[¯dˆˆ«ÂÙ¶Ö–`#³—Y‰’Iƒdã’ƒîŒ3Ù&8kpÎ6a‡ë0Ê £Ÿò#£süŠT.<¶*y=oÞB»–T9ãO{iéÝ@ü ŒŸFqc6Ü× E3rº·YÓ¯ «=;ýâC–½wúÁx¼e-"¨«&YÕ ø@[äæÎûy Á°å­WïçZ%ÑY“Y¥rÇMýHteˆ (ý·/Æ¡ƒKµ†+ëwä™òö°o¢$ûø+oŠ_Ò‚aNˆ°£ü…×CÕ £; C¯ý4~|üµ#nºòˆ}läó÷h„k ¼µåq¨/oPNIöáÄ( /F3ÓíG²yÚky?Ô&R_@\Jru9|+±ó3ØAcþ„•«PvwÉÞðšQCš’×¥¸C+SÄí|¼xù°às5­)ú„3:;¸K¦ÄÀ†‹šIhQ‰ùA€ ¼xºŒä€%N)µá±ÆbTÖøÇ® M{ùh¥t<ÔÕ/6y;†whVæš^´‘a}?«K{ïsWnd©‡5fVáÕ±¾™.Ã<™ŽÈ4`™£IÏÊV£: ñù:PÍnÔÛǰ( hFDZF zäiÊá+ý³èà\Ü–0ä]B€6Ê—}¢Jæi3êYïM]ý8®-òõÕ&_„¨èÄÜí¾c\²‘r[Uªóvw_ɬ{XU˜FFeºÈ04  ]ëqá|ïc‹–/¦ý“rں괱ñ…bYMùxUèF©QŠÁM—_F£WZ_óúÕ“#a~ö»yÛ±}Œ1éš\oä>&úöZ|!‰éË·yì-pËÓêÁ6n¯£Ú¸ÑEéÔvƒòùMå»`.ÀP[!¿° ¯'Ý>Q}N±Žy{_c÷÷éV—ŸÄºMè¤tÍ {v¹>äRò‹¢þðý‘Ä`X]^·j¢34áGKÞÓñ´h[ÓÅ…!ÈÃ[ !®Ä£„]`͘Ê1©ø%já~s`do:[—…Ò5Ç­†þÉÓëíM¸$ñÇŽ ™¥ot„eÝG·Z÷V´jTEqÒEËAD7ælB4­>þhŸzÉ€·ê<|™£œ‘udøL½ã\Ë]ÌâŸk®ÌùÑè ¹Ü?SHE‚Ú³‹½.Þ;=ìA”ìª9írÝRÈo²Á—…yÄzµ¡wSIÀy[åší4J¸wvž ¾Î†!ž±r&+ªÂ›%ÛÒÊ‹EfÍTö¶ëˆx½¶Í³G:™A›Åª½Œ­MŽbO;KÆsºDÈçß ïÈ8jä^ë×Õ‘k#¤ô~¬÷gò’ ";ÀÂï?Óc³ù1Ý÷±L–‹žúQ—¡ú…A9{GPÕ‰ãäçOårq³¹qFú›ãà÷üˆ ØÛ+¤ÄБ4ÈÞƒ}p8Ùâo— +¢eÛÓ%{DÓM½ìÊ¡µÑ M¹Ù#ø}ôœÊ3[\ gJo9ãQJ-r؃g ¤ôûîO0 im¨_-Þç˜v‹‚ßÙõ"ð”Y:r‹ì†*Ó©X,;X2èvéB'³_I]¤ ˜Ï|Fòtu’¤lC-G;É‘•ÐÛµ 6®ˆ_*© w¤˜32–Ò\¶ŽuŽú#d"O{CÏå¤lÛŠ­À×wî¥ÈK×GCEžÛ\¼¢ˆi”ÄCpøû ‘QÌ-„ÔéÇܾö²–\E2ÊZŒx–°Û˜ÎÔI„ƒŸ†æ¼l¾vŸÿkbÏTG¦Wî]³†Ó»^½xà˜ÌnW©­:8¿ö1À1€ †z­adãwÆ¿ õñ’c¨nÎ3’£›îgªpY}˜ùz@Ë~*V+5C)]ðà%ÔîgLÛ.¡càH«~`«Ì|°»W‚üA®½ |\·Zß±Hz±ùB!½hPD^°%póM_u­]rï-‡s¿kÙ> stream xÚ]‘Ánƒ0 @ïùŠì0©;0RÚ’VBHU§j=l«Êö†4 ôпŸ£NÚü,Çáa?>œ‹hoû ¢Õ³’û«7ÞÊAćÓËɵ“ŒÏ¾7L²nõóYAÓ:±L¤mÍ4gámº¹¹¸t'W÷"Ëd|Áâ8ù›\„/>‰øÃ[ð­käâëP`^\‡á:p“T"Ï¥…/B—÷²ïíko"<úWø¼ “/ÙÁôÆ¡4àK׀ȔÊev<æœýWK·Tµù.½ÈÀ£JaÙZÆ€¼cÞ!o61ˆ,]Æ€œ0'Ä+æñšyM̽ièM™Sâ-ó–¸b®ˆ-³%f·”ÜÒš¹FÖì©ÉS³ƒ&Íš4;hrÐì€2ÿ9†–vµ¹z[› s¦ ·îËúºÂó endstream endobj 313 0 obj 327 endobj 168 0 obj <> endobj 314 0 obj <> endobj 315 0 obj <> endobj 317 0 obj <> stream xÚd»cf[³-\¶ízʶ.Û¶m]¶mÛ¶mÛê²Ñ…»ß}ÏùNÜóýɈ™‘9+bαȈ”é„LìLÅìí\è˜è¹¿ì],Mèäl,]MŒŒ¬ôŒŒŒðdd¿œL ],ííD ]L¹ê¦&!Ws3;€‰›™›™ÀÄÅÅù£š¬«³¡ù?>LLŒ¬6Vv66x&&€‰¥± ÀÈÔÜÒžá? %íÌìLŒÿ7quøo››©“ó?y”ÿ•› ðOf{;O€‰©<ƒœ½‹¥±)€ò—½ƒ§“¥¹… €Ò˜êŸäœ\´ÿ¡Àø¯dúW2ÿ+Yþ•ìÿJŽ%'à߲ʞÎ.¦¶ÎI;c{'{§J3¡„llJÿ‰ì P2u6urûýß,Ä\mlä mÿåñoËÿÕ²ÿŸ£¡­¥çÿãú¿]ÔMÿo²¦&–®¶ÿÛjé,féaj¢`éblpqúg(ÿÂ’.†6–ÆBvæ6¦ºÿ´÷? ª‰©“¥©‚½³å¦ cffý_6 Kck;Sggó¿&S;“ÿMúŸùüK™á/Ä¿fÑúebigPv1´31t2ùÿ€Í †–v.*žÿ¬Ïÿ„ûWgú]ÖÐÅÉÒ ÍøÏŒ™þó?¾ŒôL\¬,œ¢t,€Ñÿ@º€ÿfÿŸô’"VVF6Öÿ #,lïáMÇþO¬\v.'#‹ïÿSŒ±«““©Ë¿köO¥ÿ­›YþÓ8SSSca¡9=m„ó¢¬)½ºXÌtW„=—pðΘì'ç8Ÿ÷•òË«<;(ö䢕„K'›¤-¨¸'ÒvQ³nг#q—:„äB/î5 íæœ,ãPÞØPõÊ„»x»ˆùD†Hk¦Òè¥gsßvªzo×ÈÄj`ÅvŸtíoŠÉ çG©:ý½™8~lEú2Aí4hΰ¬æPòž ï?LXQ<˜‰ýó)u£“!p˜À½‰Í¤æèâÅ7»Æ\ª•aå<×>/²Á¥šd1«P3&„èF9asE‚—9§Tßõ›a7þþPJ¹"&²œOgè˜ uë2¾ÝLûMÅo¡ÒPQºøh»äʲFºÓ(Ðl”,â ;ÃÏ‚iÕçå2_ÔתàMP­b­U©ãàºS:ŸÓ‰þ–»¤²À—s¦eè“bĬ ¶ûó.—$F™¹ƒÊc¦î „¦ogD!k>E¾ö^µ#bicB–ÛLŠ@EÔ!ZÍèämq„y‘@vÌÉÒš4âùÝÉY·‚xòÈ.+†TI‚¥4g|·ªLÚ¶yŸ=Ä ÌWƒàh¾y™B\ï?2L±-œøô°«UJΟ 'ôªw•×}­Ô˜ˆ’ýu¬ï!g°Zò~üStz¹b-YÄøÐ²Öœ•*KÕ[ ?‚Cå-Y‰™Iœ´ï‘2¥¿¡Ç?{.³šÒf´ƒkâp ûÊQhÙº¦±¿¡Ã‡©Ñ‚<Óƒ<³=#?Œ4òì{òî%b¹Còãþ8Û¹›¢ÌzÙ~† ÈÇ~43èKüv(+¶®ªƒµu”%EpdcÄ&¯ŒÖ±ŸÆ¤H’ = 2^n#ññYM=Up~Åæ#j˜˜2tÑEf6r"ìË£®MEJ¢×¸ÒÝÿ¢£$‡Üã'³€tfm6ðâ] ¸°"fÕa—„Á–R,á~~ç£ô–˜3~ä6©-i¶„:A€ƒ:"•it?ºó¯wuÞ>HÀjõŽêØäê8:F:uéYÞP§ ÃдæìþŽ×‡Õ-ÖR_·(ÈÜÊc)'º²Þ®šVëU·“D¢u}žS/û%3GdÜ[©^ÅÅFlà300qÕè>TJô;Æ%ûÚ+I`¤"Ì:ß¾ñÛ¡I§ñ©uÈÇàáÑÀm ûѧÁŽ ¦–«Ã®t¬x…>I–Þö«IL «Æ õé+)%Ž©øÜ|ú*Y 0·¸Í*Q\F»í®æCQl =lj ¢^d­_/>XN«ØíÜõiÖGië󵥈öÇý¦ap^ýÜ›W@SeÅ÷ß#Eù3yaSƒ˜)0êuáAÛL(Xº]ì>ƒãì€Â§fŒWpZ™3Á˜}ÝrÿÐ!?õ7ª.ò%ܪöÌó¾ý’¹S•Öë½PqÖÀ€XCÃÛåÏ'T,»eøY;ÒSõÈeéURT>N£Áb{ô\/cCÎB;h¾ò‹÷ ßbDñ§žàž5~ûð<ƒ*>êµD ?ó ý 2ÝÇÒ úš‹.u3"Wöˆ€Ù"?Åï{–nõÖoÈœš:Y—×¶C.@¨¥OÓèB½9°¼,*r^ÎôOþÔš%Ô«Œ  ÈùÏU17ž-êÒ䈱|¡ãË[Há?`@}p×-©¡êâRvëùî’Çïs1JScTV’GÛ÷>/esFqoŸA7¢?ÁóÔ³$MZ3½×¢5tìzîö×kXód~pÈÝ+{á.iV·Ã+þ8BT‚l‡ `×[êÐÔø:$FÃA¥h4xcûô?î:çÙ-‘Ùzw™Ï…7ü­ÁÍ õ|Ï—¾Ô „< ÎìjÚ«âœK i…Ò¼—5ž²ø®*uAI;ï> š…g•‘ÇŸÂϸÅV=v™·D‰|̵@,o*Y".É`b©Û~Òj.IWªÔÌÝí©cö&ž$Gd ;FVÞ,ÞÒÎ>/›×b¸É ©uºz*bn x#!.âÒ¤u‘ê!GŸ‰·qÃÈÊ*ØêÈ!4,¤¡É/Žáð÷™”–&vö ¡Ô ,sŽ#eA’èd$ç<ˆ§A™+œøDñØ“.œn.PÞkȤ„iwõ~ï ƒÌž¯’ ‰t|ì—I×G±¬‹ø™Â‡ ÞžÖ†­3I°:à–Ò5£Ý+sùK¯)wµ5-‚…å2KJz}=D-Í£µ]:‰¨‡0H/T­d¿K}Ð×Z¦î6½¯¯…ñæRMj æÎö M!Ì7¶Ú1¬Ç©›MÑÌSLØZ~µçõnÞüÚ®Çhôg˜Q]d]t¸lîÙ€±C ëÁí„’€•ê«;52§v]ì&— Gó¢Fª†‚‰7X|Ù‰Ôüyòk®—.áÐh`Žéw¯¹:orFŠ¥DÓàOÙ]Ã!(:¢êC›~Ñ– 0q1€Ÿ!Ê(ƒ/·Ez¤ÄùØ€F—²îm÷ˆ²‘ˆg–‰…™B_Òù‘Ĺ£¼C”rØj={ƒ.ŽölzpEÆÆb6cäöq®ŽNʸù5**¨ì-–}¼ÿñ»E4/ÔxŽvÓš1Î¥ñ&”>ŠG4+£ôNYZ ë·E1ø)¦þµPˆ”Ñ.ò¨ j¼óÏ Rg…Ü ùÝŠÙ¢$×’ôÄ\M<%nÉ]u¾<öêoÖG£ÞA§–f•-Û%‹8Ü, ß .›G~9ɘKñ¦­÷8³ˆÀIÒ‡¢Y­›ž<™It3ET(±9"Áû[ýoãŠî‡Ç ¬v†¥½å©· p¥-„åvDø Z¥ã›F!ÒöŸ~g…föÂá… jØ!ÜxÃoBsVm:÷÷Ä.LªÌ|W NLi1/ÞðžDݱoÚ!šÂu£²ô4•½^içmù<¼¯MçgèŸ2Kl{ð û‘ÎDôcE>EVšÇ§˜/ÃÅ]…c&%ÚW»Â?TÇÈçB‰vdým†¼äfU=„«ØUÙY礵í ÀòÄV}ë)p5-ýŽdý&P"¶¿–qcoÁƒ£‡nx­Ÿ€ëŸÛZš@%©Ç&÷Ë}9Ð¥£O×ø˜Rš±?ªþ7-hÀµ¤’èÂì:éõ!`|kÖ}§ ‡Éë±}æhÙÃSQl{ÇÚ–£-¿š’²/ýM³“1ÍàX¨)¼ô}L$ðÀ±{® ôµ%Êt¹lÀ¼Y=û¤eäÅl–#(Âá÷™m·ŒZ$t¥fþÔŸ¿ë>ÚMúŒ8IÙçHàåÛê¿ÿö–ôpÚ“öVÅTÒèã|¸‚o§³PL…žv–ü«8âž$á5ÏÜ{qû¼cûÌyTOj‹Gua FÜ&Šzé z™Ù`ÐMù0øó-URUZâx*e±FkÉîl#_’®Xõ}&I¾tŸµ‘#YØ­0Ó°ØÞM)r˜ãÄ¿å›ÂíC,V;ö+pã§¼N /§Ü4~t žô ¿Ï5Æ[²Í(a1ŒÅ¼´™§žqèü]7A¡0Qïö q¼€•õ×P~?.Ú÷Ip´ÞÔß»š§UßaÒùÀ}•"ÁÇIèYxhº2Æ9çP´ø9´É¾§˜œqÍ×b¨Î¨ßny?jï³´Ìsp” í|§Œ’©£jgÁ`KÇ´¦ÊìÅöÖT™BñŸ›L,!T››m °\þºgïfx—Mž•‘ ZÈ”1×Èâ#_þ‚c½±÷{øŸ©„êé ï©¥ñú÷< Ö°ò{ïçX5ä ýÑKî°¢:»Ò; ûq¾å;t|aagAsMF“°S'£_P@‚Ä2_8èäjr“[)_ßÈ ¸.禦µ¹¾›¤Y9àär"¯ÙÀïª*aõqÉ/¤D¾‹vžyð6oï¬ÓÐÒÝž¸ÑãåG%>ïB“I•’Y³E-ÍD˜Ÿ@¹=7!9iŒŠšM.,Q¶ûÍò‰DAÓ©od¼Afó¤R8&1Е¡†zcCN¹ u¼ãŽÌ$uœýšº:.;7ydÄgúÆ]ÀI‡ŠëÞà"O7c~+m]HÔš:DQ;ܘ ƒ›` ‹@>Û¶óYÕR8ìlå¢Õpß[» 3!Ô.=ÄË…kÊðíx`ž°‚Ö~Z9š jÈd侤æÐ«ušÐäwÂ(;eVÓe¯?°¥Õ9'^®õÙ…iŽ+lA xv‡1 "™F\Ôt>™^Q?Þo`Äb#~×¼gÛ´¥{ON!çUõÒSë/áïŠnäýí;ê¾ñ£ûœ–|i`ÛY~òK @³"Þá®ÁK á$éŠäTêê> ™5Í‚ôNßá•f‰v«Ö;]rAR«ß7ò£ê7@Áèò(jÿE}òHyÒ{¡îRIôàL¸>}ïû»Š[ìi€?+ÒLq‡f&øKÕà׃sá¡ory„mý¦w¶¾¯WAifúæiJåj¬Ô<‰ˆ22Öð@C|2hÑ(êÜæ^®ëµxÀýÈE‰~ òΑ‘âzÏ1]Æ'ø ŠõëçWz7± .|äL™sÿ/D³û¹_ýn&ŸÝæï¿à²çªLá‘®K½Né·òíoðã«:÷¿A€*…6´Ù|3¼œîŸ‘=¢{Ÿ@°½ÍÜ„ä{³²ïIŒ+0|ašñ!¸gl'g p2éÕ±§@<¬#ËVcµ+aù‹dz­\oÊ~2=쑤C¿NhÎ.Eð_~N¬Ø=µûEo%P4DV”L`A¯¥ÿ ‘@D7atœ„›ZC‹¾Ã&åØY¬E`ë´ Õ]K ®ééݤšŠ7v^ÌúM1=¦FÒϘµïF< ‚`F.émÈ9Î@û¶ŽOÊ„fϵç#š¡}ÃpˆUø·<û%éåçÓvF>×E-®#»u¦ï4énTQT:ƒëÌÎÛÛü©iì-ÊšÉÿ - šIÁfNò¤!'Åqá {žßíq2½#Y\”Á5èÏRÛ™6PLJ?õyÿª%5R©®Þ –‡ÙKúô£I:/¹¶Ý·É”Zdá½–hu6üv|ŒW¤ž$g`.„!pŪTOUmU‡°ZùÌà`¿ð·c8ÎÞÄØ”Ÿ ÑöU8ù¡"“)lÌýudó*åpE(h‡²<$DU4Q•¢ܬW<î/qð rˆÙvàOF](‹'Îg_Ûë$ýy·óHÊ—O?;šUÉZoÀyA•RáVÑ1DTA –¹¸%ÈMšÒ´Â+—:¿áßnZ8©ˆ?šã:í;h ¹±$ëyåZôÓP‰ñâ=eܸuä6c²éÔ` Áü"Bq„;sV–BÕO+llõRÚ 'i“Þˆb¡¢ÛXÝ)ëj±þ`ì)ë®zUt-ŠÞ%„–?ô:%_ C«Çc…eÿ”Î8>àƒO•Zqð¼yÓ5­™(Ža¢:T ôâAD(“ˆa£5Ù0q‚µ@¾Ñ¤Ë!ê·¹î )ST‹ˆeA¬"2£Sëõz}¨‘÷XðFˆl JÙÁŽVì…nÅ9-ž@1ÆbˆòjfÉZvþJˆö°¾ l+ŸdγúÑFÅ0ïcÇ.ç«^ЯÎÄH`‰v±÷IÎf†ûKM²g^þrŒÅ0×czçOðíÏ%¬ñ5šHPLÅ^z«dÈdVÚT?$ßêÀÌÐõŒz*]~ëêx*P|gëäíÜJûpî.‹G~T‘iŸÆch œÙþ*•.¤èÎ9/Ô„;Æ×óœË×iørÓ²|$ŽØîßyY%Û•׈W‡&W´ïzCUÊfd¶ª«¹ð={BPêÉ4޽cM’°á„D«,—mi~d@wp"Dr¨f˜/U¨¡å°ÉðR¯MŽØ":ÄýçËbVtlE“Ír Þî0¾ <×¥èQh¸*@3iïzb¢ÅhÁSa[£?ÔÛ=^=þ<Ÿ]gƒ †@iå~uNWÁÜ´-v(ÇE8Šzf7^»-º’1ã"É.|­ýGP•_gËjäÉâ÷ õÞ8‰åÍ÷w¥™³6qÓUOJÆ[mªg‹ºå ø ’ĬŒ†€X¥)¯ÏßÞã y¾ÌÁ)ïz,)Ç6y«ß­êWã#/Ò"ÎwôüÃì+èèÀVÔ2s]AîŽï`)AÈ›O"[ømÅäž± 1»›”*›V³‹=dx3­eáÆv´ ¼ê*ÕP(®Ç¬®äŸ€nH \AÔhÑ7\]:!zK ) cUA ¬ kµœµ°øs}”¨ˆBP[Äᑆ½£_[âq^ŸÊCÝà_v™˜ð/^ñ­Â‡Õˆë»=ÜÇ(ÝSÇ8L{½[AóJà7ƒÒ_d­¯” Úê+TŸê‚:*ý‡üZÑ—6´¡%âÐècí¨Õ~AÓ¯›ô9Ø.ùz§×ç¯þñ__±/"aÒ—ÀvÏ5 Â…ï45‚£ß?„ÀÂUŸ]§0›È'ì²vc-ÌÓ)ó …ýœ“5çûšNŸ—X'l$ÜÕwÙKº!"ØÌðø“6BɱÆÙÇ,•slÊhÌCtªí¢Ñâ-ËÜ3KúOè¿å\@Ѷ•î5»¼æZ…%ð£žÁ ŒîU“Dèa :x]¤2äŠè|%eâ?ñP;N–I÷L×6p#y¸ |ŠöÚä£ÀltÀìåJªçSÚàù£½ô„ô`žÿÍàYá'ã¶* +™Ù½ï§¢¶ÎZZ2Q²j65[«õì~‚ݘîŒÂí¤ Ì“4²–5½]NZ»‡Áî†O çØsŸ ߬ è[t™¹Ys8 ¦Z~–öñ¾—Ä.¿DOC±¨Øv©˜çE¤Æ{×ÃBšÉt=f?öCÖ U5äB/‹Z,¨‹<,ÄÆ*Œa"t(¢ôÀ¡°ð!pÀ‹å™\•Ñ}.ÂSÄðÑ›Cîj°™½p"'ûââHðÔYa#(rnÛörk¸æÆ¯i×P>öT5p>à`¼‹ñ.딫?´`b›LTÉ=…^V! ×yD¾OüƒI~ÌÇ%-™¤²wSÓ†7ú²ñè1ËçPÆØÝy'è;Áõ[,<*aG5hŸžL‡®­ÆÏÊ&ŸÕÔŸ%n ôä€ùÖ_/Â;Å(âñÄVua\Žª•>;Ù²·à1'Á&ïÜ‹0 º;Ù‘j $ÂL ?B ¤hí‹¿6… 'èÒõåä;T'ÑÀŠû¥ Òhˆ ä—S&¸ÓQÉÂ-.7ãÑÐ2ErØåöBµ Ízš§ž²V•¬sërÌlm ?J« ”JHÞZ‘rPî–™éåVwq« %:#î«ú\âhô¢»ú'©ë¶€:¬º­˜>úR+A?VtpjñOÿXAâÝ$Øoª!–aþÇ_°>_Y¸ÓÿmúEo ö~{ÁLŒWK }8ËÈ<[FŠ÷;] íKz½£¢¥ æYt½&1$<Õ¡J5ϺIcçdQÇã°P"ÃüÆ•ÒdÚSZˆ”$Yõã£h¯¥ó†Ó?KÂ[rîtò£š5`\¤çÑN̶[ÏÀË{¹;ÛY¡gûóÂWýCƒhˆìfÖE‚lSÝàšPP™ô(¢ ÆW9J)äÈWHþ‡À6 ÓF­ö/¾—àçß|¦c^e+âp«.5áêä7néXM.!SÙ KßÚÖ=*ä>ìë+Õê¦ [‘Âç`D:ߨ´h‡?ÕßðÙMŸWÇ£uÑÕ…ë»îé_3 öF¯k†Ñsyª7ٖͤݫ‹l{‰E¤ƒW¢'ú’éílùü­WÛB tð%“@áñ¬vö–?(Øh5D.+% Aú=UUrF½×sp›jãp¾a¬mÏÕŽaÖwÂeè§9 [&Eý“òi¹Ñ^´¡¾‚ˆ”Ãçlt@årÍöÉ{Ę«´-¹ûè6TbÑG ð«{³T‰Ñ:BwC­¡J©“Ü`•Ûô]8õãy°øÚòZßùh¸ñe;Ï84Ä›¨DiÆf7Ë’5 [` ).µÚöÛÙƒj5ÇØ¡5Ëû2–Êó@oO%AR'†Ž9ø¤àÌÄ[_QÔÛ¦#Q{‰¨lWeÑL“‚À#yŠÑWÒ é–½C ,µJed‘jC¬åPòÑž‹›®÷Ù±– ¾…3J‹ÉF„µÍHTœªFÍ0wÑÁÅmwÒõÓcÌ>ÇbÅ›©?¹šª@í^ˆ{ÅŒô"Ë‹>¾X¿Ábh4ÛÂ÷=Ã¥ó÷ÞyJCçÃ{~›ñ¥ê‡é$y¨½Îo8­>«‹áÿÙ./Å0ù豃Ÿ½¸«Ò¶]Nvp ¯Œà®÷¯J@Nuâþºž$U+(§ý¼8u¬ÏF<úØô\V/„7ý[Óz~828B~.ÅÊèòUðz×8 À–ŒSu™þþX…O4…(+œZNí‚VÅŽg´¡j@B¶<‰ˆäŒ7ÒûÀª¢Ç³*äE& Š/{þ—~ÎꟚÀ[–âóÃU60 `M›äøâRÄ©Có8ÀÚQŒÜcN KëÈSÔŠ¢ý§Ñ÷ƒÁ+ï¡ý=ýæ†: „Cϳa+¿¢GÛdt`Ü뉔çïíϱFÓ\2 #xÌnoœ±•~8Ûm hñ±ÓFáÇ÷(nf9xp“ º§¦¥R>DõÃ>×&Ùt.ʰ‘Äç“Rg4ˆ=«¥‡ äµËZ2„SÂ3MŸƒ@zù×UÙ”tð[èM°™±æ:V[ ¾*Üýu”ZF‹e)§Àê‹ÅØB &O’ÒcUÊ„ |A?’6%ÃÓͤ‰ö²ZAòs*Þ MQ k½pZ”à U<´„Ø÷2çi-+ÑêékOÝÏ0UL·´ŸhïÁM¤)MLGš@ƒMt>îQNg*\ªä&9# †ЇBÃ4/>Ä;†g¼Öùjc÷=Ü9·ÕÖvC5¸ßÉóž7hY‘Þu3o°« `A5 E½èmó57¦’P¶wrþw~ËÐêE7S‹3)½Q¢oUØtŽfOû ½é•D±œùÜŽH‰)»4tdŠY²Ô4¶>²K†£øíu˜î›Ü¬Ï UN7ÑQv×ë NHg,'>'kfj?°šÈ{©q½Ž<¿ ¸’siè‘gD3Óó&à¹ahþbòÙÀZÙ{è xÓÔ£­SMhÅÓ¬BŠ[/HUúw¿RjO¯=)mEè:~8«Â…›cÆIê„øcÚ¤BZÈää¥ëV‡(õe¶Ãbì-!^ùÒ¹W¬JíÅRdmé‚Ö‡b`?ÅÒœ`ÃØ9Ä},»”ìÔëØàïÄC‚òT°³ úõ0’*,”@â>ÿÔc nb“Óh¶;‡‚¼%Ðì;âf³Ö쾦{àÜ'äÇ®Œ]hߢ|0ŽØÆ‡wÝI}ctG󭎳o %Š1~ëxؽçš2w¿±ÀÈeê Ó_=WNò¢µÔ™é+ ›Fê+WY‰”o²ÝöFû‘Vçî8!PBD:Ç<–¨æ™f–ÑjiM;uŸ7tùéyŒ‹[³É­¥$‚¿,™}t4J®ujà ö Áo-kJ ràkmKñlÇ®•3ÈNA­€=®—Üd¾i)Ò;‰®¶Ýá}ølâÃÞT[âŸH&íÈ™éþ†¥1Tµ,ÖfG?{ä pK~–B¥m[;Ÿ`û”éâQ²QlC²W=pYˆyÑ6Däè ž"w«ñ°*õ›Pˆ×Ý» x°â††´y P6‰³žjGGýpUÐ:!Ô©ÔnÒ5?®qÔ{Ë&–¬¹Çõ…6ï¯V’ U’ÿæ‹ügS½-­‰DCzfžhŸHæjÛh¦ÍÞç2ªóåK³çm÷WEIí³~`JA…›¡Sõ½Ä>5ZOþ3†G©Ø7Õ DtÍ!Gçw‘Åä~?ShnÍq&lP$Ë/4èziqÐ÷Ä¡&×k1àR¤çqߦø Š9 ê×*P ¨ó'ˆ ‰?¢ˆÜò¤Z“É„sXÎw’ØäÑÄê+uuågVûädªé_Îèe­ï¾®'OÀÒâM`›vÃ`#ðvnÜŒžÝSíPïp„ò¯+53ÀÀÀ í‚=ʸu ®ÈF˜î­Õ4ËŽ1`×)¤” t`|iÈÙé_rr9X~g‹±d=Þ°TÛ¡î Ù^‡ü9BêÖG@*%¼ëXØ9¡ž×J 1ÇrYdY|ø  ,VZ/cIU›utO¦œlkÅÁ ¼X)öîäšö3j ®:_°¤ïƒ¾)Ù@W§…4TWn-IàáT-®8XQs—àû*ôEH!Œ åÒæV¥wåîØÂ´àÒµˆ§µö¼‹÷w5Þjœk¦¤¢9‡AM<’AB3Ä *+ ÉvK®®2>`ù÷.™£p€sZÔÙ‹· ßvÏ7Rç(;‡(2!ãyåIXŸ'ܨN ¥ùrÊU šÖšÙž>¬Ù_QYï‰zç®8Þ¼n‘Ó}ÆŒy•&¥·Ä‚C:‡Y¨ <â]ºŒž·¨i £6k:ø¤§š‰Â‘ ïï†Qû‘ÚÙ%\¸öìTuÐMyU Ì3VŒŸI['߫һÑÕ›‡²oÁÂÀ òwQ¡Ä_©#, äbàý㵜c h%Ø2éõ5B æ"JÝÃþ•VPU¶ÎP%Á£cŽÿœQ3¾ÇïÕ$±4TlKªýª¸ kË `šÀÿ [èÿq®1 š PªÞSá_H^zø`¨}°‚"Ù|àÌÜ«E³u¤deEUܯŠŠM¹éPÍÆ}{™ ]š5óƒoÿí°¨Ä$-+œÆ}ò&ŸÀe÷Å{bð_ߢw~0²L¡ûˆ¡%Xú2‚ùk ­š.}W…Ç<ƺ[•ë øËq¢°õ7"0bt´‡Dø…¼ÓÃCïÆÌ šFá"šö>*ˆD§J¾À±n$#MÞzÍv¦ŽêªXUA ÏØXEj±(]8ÉPQnNÔ…ìvÔ[áÉýjHI•…©˜x©ºRX·$T–5ˆƒ’´ \òb:zB†¯¨tsJɳ³ÅŒC¥u)Ä’]ÿæç¾gâ[¨ŽóC§ £ì€Ý}>‰Q#S*º‰ßzBŽ|0wÁš5ÉšÀ/X Ö® L&3Ëñ·Çaf—˜¥‰d~DTÅ]¹M¸}°]Okǽâ«#|‹v죷wi©}zÀ”ú½U4Æ?…µ °Ü€cÇ8ÕŒž®”—Ç«ÖÙ>Ê7°>O½C#[»®Ãv<t¯,TÄß/@œ»Õ ~Ý qˆ‘ßA•“àA’7{R¤/´kÌô?È’½u÷ϟ컹 hze×^4) §þ"“æÝVU;•qIE›šíËKð›{p wh°¢$` ›ó:.£„'&Þˆ–Áßìâ¢2韌é!©ö§sǪBÏíLO²] áÁ÷ÏÀÃÆ\­]›pߋޮgU ágO·|®¸h)uyOÕ 9«>ÑhÔÍ¡aÝ\•#ÖY.þ¾vbåû­‘n%ju>x±#Í÷Q¼ã&pûØžaŸ¡æ=Q ù¹Uç2wïus‹‚4Í,Ôh€j–°7åÚfPôöÊ„°¸è§êID²þÄz‰DbÅú¡Z O×%F:¹’ñ̦÷< ߬R¶–Ký\¤óÎ*µæF),DÚÝ=¡!9¿L’ŽˆÆx+š[” ê== -¿ ö«$Í ƒûºŠyBéâ@ÑÁÒ¾ÚSu6]χ{“-9w®KÚwŽÓJK• H¶&+»Ä&híد)c,ÿÜéÞMŽå’o'tR²T}¬Õr—ôÃm‰JÀ“zïÕíÎܤ3aæ=ü«Ö2"AGϧ))b°l ×gþðó*¢î‡1]+ù¶ú•yÕ€–ÁÜv«0Î±è ­ÛMÎl&–‡a4‚*"þ.ÆÖ¡p"¼nB“ÜïÜâ}ìF‡'õL‡Mhè¿ ¨¸»äF#ëIÕ»¸|§Zø›ªŽA•¸®€qL¨®=Ÿèå³k¤ª„/Ô¶ýŒÞ‰œ@Á¢KÞ¥-Tâ 0ŠŒÐ£â¤Ù‡EKS”™t›šŸµÚåˆT²"ÞÁ´âé˜Í´Œ¹1b[ØhXû5¤L¾z¦ð&çVŒÚ¿ÝÜ¢ŠÖ›ˆ@¦j‘à©,&Ö®ŸòèÌgœHWë¸)z½XÑ‘˜è½~ –bqMî),¨Î×2Õ¨¸9Íãeîyk¢4U¯¡ƒW@ÀÔ•?±Äò‰T %{®Ï}o·w¦>NƒÇYô>ôŒ+CÜ«tÚëª_÷€‡ßª,Èv[ˆï¯l¢wœ…5çóÜÊcÎÆ±Ñæ÷òÇ›§o2`¾†kA²§Ÿ~=¬Ô  å [cv2C[&ᄨz‰ÚGÿ†‰e†.‘ð-ÀЄtAËvÃ…šMŸÎºÈ×T=µâ"q¨ú`s:Ží ²±ÔèjÖ8—Ä\~Â)ùè/‚T_QÓa¼‚tC„Éä\gýÀñÖŽåœÈ}}‡¡P€hìÁ\†ttuwXq‘ #¸]èeÚOüÁíÔ‡ëÄC§}¶u$F“/ü3´êgv³ºü Îǃ†½jsF w;ñþKδÅ=»” ãÏ”yu¦üï1p¤o¥œ£EsÌý:â€% Xù„-lP-‚`±^¨`ÛWo¶+«> $n)’°ÛÛºìX¶>ش컯'ä”’¼'ÚÒ.t`ò|`N&jè\B†9‘ Éryg{HÃã ˆÔÛÛÐÝ€H9CN»Q£Œ&|ÂPµnêÉYùÕ êÙKT¬´ÑXwº¶¼þe}Õº“6+IK‰±Z!zQxص2÷Ó™"™ö8j=äRyÁÌ^ªgC<ÅñÅB*Á:¡Ç{à"JþƒÒõÞ³x«]¯ÖÈÙù˜$ÃÕ‡ªS@h‘¤öã,ð‹~YÁÝrŸ¶ß½û°I˜N—{@‡T)w|wOrËëÕjS\ÖÈ„Øí늆¹Ê÷Ô…5 „£€¢ËÑ:÷8¦w"Ô¾Šá@…Är¸ªžmÓx·»Qy«‰Jn½fõSÒÔaÓ¥·g’Ä®Ïô”z–Á.v`|°8¢ËøÒïg2~u¼‘FÒ_±cƒ„ÑÃN£#Útó!ç{«J{ž=6!²¡Ðõ0î>Ò¥ÞlSón«Sƒ¤b¸%rÃ7+:iÔ€E˪u[è9wë9ˆ?ôV›s‹m$ÑDu fŒH ²Xt“ôû¢@ÕÖK[|Øm^i…P! ûvvØÝÐÜ&F`àKÍÓñ†[1¯ÿí@Ëñ~Z‘æ<±ïÔËDJ­¤âpj˜œe:¢Cp."M´Žžb©+ žf[¤ÁÝnÿ×Û_ß~n_}¶”—½t—WÉîÑ=ÊìŒ#‡×K‘PÅÚ•‡™3µ¥]Z< Ð í0æC¹éÕ!FîÒp3~µÑ:—™3•õœÞ[^¾Dª„5ͦ^EŽyûU ž…TT¡‡wd½}3¢ ±KÚÎî3ysug%Á,8³n²äßGêt8XÊóÇ=úÜÙÇ‹ˆŸ LÝM‡+ÃYލÙ^Ú׿÷ú›I12ˆmþ`ºO„ž¼lÑïÍj©çªH~¡L7zë"#«–À«’6µÔG¥MƒÕ~Ùf…0¾Ÿ}Tkõ`ði:î(èÝ_«èþ`Ç¡3˜X­{Ò7¢¨ „GnÓ\¥^³Í Ÿb‰ xqg·»óÁ¿ðéÑì­F‚,¡ß0 )Çû€…Û© 'l¿2±tŠf¸ò¢géa ¿|¹h9E35±Qƒ¯ÿH”ªÔ NßTÐ ¥v­(ÆËk6‹;JûZ™f¦ä¬\¼“#DÜÇ1·Ε¯$ÊåÇITBSgðw/ÃF*ÀÇ®¡;’vrµ­ê†Ö°ªŸl;ÁØÎs+(ƒÌvOÂ~S^¹¶ö‘*q0GÓ.IÆdK˶ÒLqä–´ÐÈš“´«<ýžñqœùóÓG™gbUïC·È¦CœRͽ±7ì—_Ä6Ç®rˆ=ŒŸÕ™í» £UmóD?Þ®o¡~&öêÏIŒÛ$SËÁÇÐn*®†çÜÀßb)þ­"6ðNDìƒ3/Q¯ ÝLÁ\Œ|ø7R)-§­8¬‹O›ïðdæ¯(¸ÐÝtmfŠñãÂüÇ@Õp|+*$ Š6Hc¾e­G— §ñŸï(×'ê|¨e•(D$75Ü  À$毞 ¼«B‚6—Áj"’—C·³/ÄC³‰dá`òçZùTiîÙÉFÇVT/i™'»È닟Né­D-÷´Æ¯_i…e÷AÆŠu*ʾ#‡)IõíøRc[å1t’–˜X/5Œ¤]Ý_?êÛÀxo´yÝñÖh êÇõ:nÏ•rÀé&2XºYÐVøüUca²Þ+P˜˜-¯¿÷A|¾~S`ä»ú °‡0-©˜>­˜Ëçmþ”F¾™t$åôÙ˜NM*Q:¢*<ÇçèTWò¢bòñ|-óûI‘—>Ñ'˜§7‘+m1ˆåÌ„BZÆÎ¾ÔvS{‚zk26}X_’È%+Ÿ¿ÀõFU<}Ï00櫞f¢ð¥vPÐÒ»ò(ÿæƒÔø’ l%ÿuy%,éõ.cd¦ÕnlFîf€¤Ò°W²#(œhᨾeﮀphü´‰“ŒêÇPÛiV`ËNU¶ ΘJ†H‚±M%ÔÏ"¯X‘.¯J‘QÒñþQfþ8;W|¸C0~,Çyb’ò‹VÂþù‡+‚‰—Q=‘|¯½ [dÌÚ°ñ¸ ²¶×䨶zû„jt{ÜlBŽÏž¥p÷-ìà+hê÷Z*n¿ÆW«|28< ëÞ¦øuWìÒ+øÀF#£Ž±Î ÿ¶7íIÁ'I–Œ£œÜADÙ5UÛiµ&6O­FØ*ù-B]™•ʈ]YödUv.dj½µöïôæäy¯O1„TóœãÄ•§Ïú]€³jÌœ½ô-ùÛz޾+Eâ‰q††#¤x‡g¿çÏI »Ÿñ¶Öq0L£[(%™û¦ý2‡êcj´¶øeËñꦆ¶~¨í¨]3R”;œšë¾”1 ߈³üÔÚ »›âD‚¦ Å8•UÙó¦îòò=Ž)µØ%¹iñ¬ø LÀ#ŠŠ‚ÅN]XöQ9±‹ŒU‹YHVÆô'ùƒ~èõ ìÐN°ã©á²—’ëƒ×ÓLX¤SQ· á ,lƉ2ç® #Âzò¼aÚC…^‹ØeR^{È®þ,ßþs=k®?¼Žífèµòº-3ɦG¨Wp H–•ÝÂ%Âúªåk m‡„¤Bx™ŠÔÊã^Ü"À=}UJsDù ‡¶#ÜÞßH…ÂßÌ8 ÷ZŠ*ƒ*Áï°£ã  5maº¾TZÔèú³Ôÿ§VL³ÝvñŒá"ºeJÂ`"ëb×E:¬òÓ–¨È–4+|T»zýjd6ÃdŽOtõçÍs<1 E¨=|rý,|Ýõ$šd§m³„ÎK1`, •ª–,$H×ê1oªy:µÖ'mJL)¯_øÔ×çæÉêqŒf¿’ö0“xÍ}‚ú™ÓÔ+½Îy:ºns+ïeS®e_ʰ¾ò¬ °ˆ¢ÄdŸŸ§mr©M½u{­ãB4‰œŽó“X‚n‚Éc}¬<=YŒeslNÁKnI=·¯ì‚R½½BU­P¨P L÷­ÆÄ§T˜çþd"1ü‚Iæ!½&Ü.’Ú)Áq¯ûq´ú…@â½:Iº;»ÓXŒŸoÞ AîpÓ”ä%vS™RwìÏs«Íçiˆq‹¦{”ȃ;6ô’ì>I:Ïת@ÑÊ‘˜mŒþM{]¥Z¶Çq„źYQÃã\¸©Ê›^ k26ƒ^ïu›·_×Z¨Í˜ M±°»DB”a]ÝjÛóHê°ÚœÀö5H(ºÃœ-û÷Ö±R/8—œÖÆ„%žN\T7†äIËS;.¼ú¤ÿì·sYcRÉ,ƒ]ƒ2v¦&WâlíB¿ª ÔX¨i DbùÙ'š®ê5! úû9ò ¿ýû)µõIb`ã;‰3îÃòÁbuu¾Ôñžþ¤¹y°M[ÅÕ¾ëñ ©=‡à°iîî7¢ç.,Éâà}Œyž¥¼˜ïG®ÆCfV_0/0SoêòŸ ‘k¤=‘ J–”Þo'Ê¡øa²êäßEY2¥‹¿{5™+ âøz¼œÆ@ð v»"pÿë7„EfBÉ ›á¨´×-¤—é•AX d¥Ä\ã$>~Àí°…3,Ú-@j:N`¼-FÛ U Bañ·è×XÃÛÆç°f#03œ‰aG4‚Z«¢ ‘ÝmjrW® Ö Aû1åôWåä ™£MÌï·0{‡üŸMv† 0‘¿àŸxH¾¢› Tk «1_$Ú‰æaÒk¡@÷ˆô뀹Þiórí_¯i´_¥H+ÉõgLÁ½ZÃ:ÁÅp ÚÊuæFp£{ÉÿtÔE>?©Kx¶Ÿ… f÷ït2c´ùÙä6 Ð/´Žz—–Ef@ïß{Ç žEäƒjaã­NFSzG²w\qž“òùßÜcã×e:¹0„ÁH¬ãW¹tg ˜‹T:AÜåí°Y|2lHþøS­‡KÈlÙ@­(R{ϑųo Aïùå|¼‚'¸n!î±"ðkÉ&‰™êÅ{PâüOç'ª†ž@2ïá—&@"1hVçÜ]ìdŠV†‡£ ¥ïºßC­Ýb#«•T7úÛ‹þHÎç2†°Õ °~çÕvº:+'VÏÜù#ÌNŽ1Oûˆžä‘Ôc×@g:R¸ÆÔeÏ =FŽqØz“ D‰úâœ%¿/ÓÈeñ•:$‚—‚ò:”;éÛ_Ϊ*u[òþ‘ÜF¡®ÙÃq9l‚´SÖˆôôÚ9‡^a¥IÛ¶mÛ¶mÛ¶mÛ¶mÛ¶íó{î$ßMf?»Éô¨M-º«’§™{Ù—eS0hÅ$b|»ÙgÍp,"?¸S2 ” KÞQãðeR ¬œ1åyåêf‚öÔ%ÛƒxC'7Ú·z€Éíˆ>…‚qÿÖ4fzº)‰= p®e‘‡%Ÿ±ö—™¡o„‰Ëúòvw{ ÚÈ¡1†«£ig²‹w3 ÌâdÞ0²›ðÎ’Ý·yöß~ÇfM8§6²äE]ÁÁ•—̨ÚSÂdà,xŽ"é23êŽxb’}.H/(Ë.¡ž¨ûÆ}s£WXô2•²È²ÞÂÒö®¨´—ìñîP6DNÆHê`+Qd¬~¯î Äâ>?¬Vwy¾¯AŒÉÆS9²SŸDIœÈôÁA%Š%9K´¡Ïh,¯7•ò»|ú~Æn„°ö²X@šO “ð”Ÿøå`kÅÿC˜ñÆZ>p‡tc˜×ryY?d²îŠ „Û[*nÂìÀxõPÑäsL'8æÏ¡k—¿U¿Äan”&®i,Ÿ$Á±×šÄrxºÒXAT.ÊiYý.BjZB!~ ÇŒ4âÒtl~¥ÃïpYôÞ# 2{\Ù¸zgr² ðëÝ >l•÷±_» ⩀ͣܿö¸P¨TfÛ˜ic±õ5£÷Ô·ÁùhEŠ] o}ýãÏÌŠ’=%~ îÅZ—仢pŒmir9tˆSX|ÐÚ›º-†w‡‚m3+\{_OõÀx‚ìiÚÏ–Ð<¸`I1 f×G ØlÏ‚ÉtW 3¸E-@fà§Û/¾ lƒ#I—܇€¢ì/cnÿ¸I YdUìùóð£ã­’‘½÷j]ô•¼à[²X@“ü>ð¤hn©sr\]zäÜ?Á¼du§I[™ö•pm‰{þ†“Ï1Zk#¶³kb¡U7D»µn{]¿C¬© ÔtìúgöÒ$Èãá%Ã]¼uä{<'†€äl{[–殦1ŽcP´0µ…“‡Mšq>;å¿>”ИR›í®SÜ`Õ§²01VFª]•ÕE÷W–ð5†\>ž%@4@­J.„¶B'dºŠÈ´V¶oÅb//žõ·8ÿKmØÂ ºÓ††-½ø½=VpÏ< Ök¡‚g!T¦yè¢æW2(#ËÜýð›o‹tuøú'iÕS8DçE¿¾m²°ƒÍ1¥(Èã;Ylø¨àÃ~áºnê;¥ªÞR¾>pÒ„I#¢8ªÇ iE¼_Ö'T§DC"¯èº:"Ü¡f5J<¦¤Ó€«¥—o­$:¬òŸ5IëT?•fH!§:H-±ŽKÉРй}ó«•)ƒˆàs½S¨tŸÒcçdèçÒ ‹†$|¼µžJ0ÆË¬Æ,°³/᩟¡tÈ"áV²;;GûKMjß:ïjûiª×—µ•,Øm¬"el­{5õpV/K©t°èåè=ks¯27ëêíÕ&]fëF0 wÐñ€<$Çœ-vÑÎG>Ä:ì±Éòs¿(àQì_#ãïO€M½NUžié„2®ýŒOWjýéô?µj ©HLñÊH‚¡mÀq%š(~?øQe…šo]øêá˜h6ì¬¦Ï K²Õ—ˆ€¨·Q3¿ 4W±þʈAjq=='…-]þ£%´À5f 7¦‰¿Âàw­«"ö"३!fÇÀOpUæS¬Y½^¯Õ!6–1¯Ö,ŸºkÈè á‡î)ÕØ½Ä~Z*rû²nô5_L´¬"ËNDÊÕ°êL fËò%šÂÁøy„NŸ,[„/ǛɈµ¤(«—f¿ÈQÁ]Æc¶[»:üÑaäìû{·¤¸é¦˜þ‘¾ÔL$öh,ëÔHùð{Cpê]f [Hg),3NlÞQ#à&–ÞõC¢]%º'‡EÖI€Ãóõn5dŠs‚ xQõ¿ƒÔ—>¿¹²¢Ïµ£!8ÌÛ8 7drý{¾lO%Ó0c*DÎÌ;¼™‡%^(nùQ óÔÎA¶Ddn yÆ­‰©A€Š®èØÍ­’TêÀÐu¡(ºÂöó/èŽÚ‚®±È×:{Ièvãê¨ê•~Ϫò†Í¿U²=õ_=áRg0„•%$BÜ}´P§&Ï\ê,§”ÀÙ甡§©Œj‹h@Ï&îÉñæ‘tÖÛQ¨ X/á€mìne×UÜC†mïD Ku® ñz†a-ˆéÍTšnsõ¿ƒh!ñ‰êýë#Y¨ÍYí¤‰»úؽô¸a’\œ%ím˜ 1 M¤û¶+†ÊâkbUƒ3Í>o˜<‹1{]Ù%î5 cJ®nkåj2+"'  W‘7ù0ú‹ÆáÔŸÆrü{ú±p‡ˆÔC`Î8 ú3ê;€È˜°-&deÌã5ÿà —Áâý¡èWK"Vô^Ÿê¼×½á¨6ÀLÇ6—ÅmjH_ä‰/ß–¸ìíeÅ%|4d,Y» Þ Bw-UÆ¡÷¿¢”4ËãnB™R-uas”]_é§›â§ÀJ2·UÉ ÙÞôdä(ìµEœ›¬Ï’Ç$²Ž²!S®k|;+…”1Ô\îÞò›”™*<þ:bðsQUÚo :47ý2E¨Š¢võ_4\Ù€æ7;FþR* н)™\¥;}hï|xÓÖ;ëÉš‹iõVÊ¿ Õ7P$pr p?÷)`¨®SîBBâè&(›Äfày¦)yµ'}&àS“£Y•-E’:ëö…7Û°lñ†`ð©‚½,–6†«ÅNNü(“Àv诺û#ž°HuÕ ³Îú^±ïùÃÕƒ¦"þúùžº†(þkè~¸–^ÎÜÂÐ Ñ·ZFCb#Fg³ó¶  >µ "ï\iT¬ôòª‚óÿ‚ʼE&m =>!xx¡/ŠÈש|@ $¾wè7UÞk¨2¢:u$©fáôV&®>ôD²çiN¤Á±ëçòjv"ß/ù#[&㆓Ñj3úû}–ÔT çG|P§ilC°†¶5€0†–w“ËP–æ)”)„ ñƇ”êܵÊA!Ç£GzÕ)5 ²ŠÞªú]åÁì{cpäët½£§ †ð»àoEÇO!K¬·×r¤’”¨ûÐ3_Ë"¬òN—%…Þƒ‡½YÖÚ‰Ýù æ_,M(H0ô²NOHZFžÿ1ª7Ò@ÓxNL£l¸`¤-2?B.ãùMf–iî 5L¼ÿPnZåyW$ô,¶>M«OD½<Ù¼´Ê‚z¥6É_l‹§TZÁª’Ú9HäUqF‰–ö Êlf”^«çyÖà¬Åé0C¦k9d¦@¤’¦OïoߊŒK}sy‹›³g—eß5¤Ybõ†¤‹hÂé£ L„h%»ÙÚùÕi•_NT"7¦‘`L¶Ãu7±ê±6ÖiãÍø“€‹UöºŒðÒ·ô¡iy¨ 3¾ÝeU›¹éò‰ ²™>rޱ™6†˜M{qñò¾·Î§Â:žy¤¤Ž­ÎäEé‹D…¸Èez¨¤—O9S ¿«Ã$eV¬3ß âjK‹ÜuA‚ƒIYÑ»PÃóˆ–ê‘Ê0ijcXâÛG¥Y“Á·¶PHV”ÏØYÌ$CÛJºà·À·#8p˜Ä·’›mÆ7p“72©¢¾uñ¶}½²/‚½Š°î>gg»Ò|Œ…ôûš[óreÖ¦óú'ÊݘêÍ侘Že¾`E&‹&Òÿ´K“j¸s¦jÓ’ KëFfÝ›Œ]ß~<êpš~g~8¢ß[Ó6nÞ#sO7¢U™î‚eg*XQ£/Ä<‰%ÿúXçï,‰`zê{÷Û‚YTÓHìâžSuÉÃù¾®–‡˜D¶Ø¥MèáhøþïÖ4ÉÌx( ŸÕÛ§¯’hÄ>"¹S‡ÎWX_žØÔnêO9:þeš„$4Üx $Û\„ß?ºs”O»cbI—RUÜ #´G á8}Šß„R*zÓsá09•„C?7F_Hõ"-•ÇþOÆ}ýôUfÃ<ç_À$3­fþeâ4_¾¡7>Î)ú4~‹qÿŸî•ØÂÓ˜NôêòÊ › ÃÕçå°› º•‘õÿ[ƒ÷>áG Äg7«©ˆ"œ+ʻإû88]ˆh"kbz5~ƒ„§tÅ|A¡±7†ªD\«J¹ùúÃ{vï>eþ½¨M±0ÿ)n?Ê—’6TAÎ^rÏ »òlýt|¢M¸@qõíEÓ'¢5€K_ÿNÒ.÷+¤®¨yÄ!·:Càe%üÛ)ŒZÈe&p76yKS5·s½¤L•?_êÃH€(©bÌ{:fñ·Ð8ã…¸| StŠë;ìºx‡±m ¥„A-as5¶nZIÁJ/QqÀÞÃ…”ñ;&Z ŸÓã3#¯çÁñD~úÙ”ëO5-wÎü²™†‘=§b‹(Y§ÊV‰¸z ID6&c¾\Iƒžý¢RŸˆ§þÝuÝ×ÄéåQÌjεIºåv„m1£ö=º¼Öu×¹šüuaÍ©t˜ÀïG$ÆØðBNAQ‹°9Í¥‹Ãíé@"?[‹¯¼[µ»©âº÷?*îôì‹Üý"tŒ(ß)º#OÜÉ~4)«´¥%ƒóÐNƒ–ÉdŒ´èÔèb‡>X·À&í6ð<õXp;ôé×CùÁú®’¸ HgÛr\hQ“Jóªf€ìÚ@º¢êi›‰E±aº¨½géšPò®3臆¥šÕ)Ò~´±Žè)Œ]m¤¸œøn\t·N- qí,^ZƒD>XÚK j†ÂÇ+¤†ÙLÌ‹œT%5²°Qâa»Ã¬ °±‰Ÿ-÷¦ñq+ž:ä§ô!¬P?Ë[K«álÈyó›) AÑ¢|Á1ª¸M›T:b€WãÊÚ%ÅgßûãG~íù’ÔD¦ÍÁkrpÊ¢7kó¼ðßd ¥îÙÁ ”õÏ"öÄW»'j!‘ŠÞÁ´8óä"Ùm KJöFür‰‡¼Õå‰û©Õ’Íê‚ ú:QÛúÆ>„’flÊ -úûÊvØÁ{‘è|ýh…š;&¢B§?… [h¤} D¯;Šw`uõ8- |€ü„å¤ÔJ1N´üUýÅ$ߙȿt›ÈH‘²6ç󋽞Å{ã2̵1ó¨ž}ß5âÚãÅŒ¥u+V\ÐjÞ¦†.¥Ý…ÜO¶î þ¾xÑÇ5ÆÁ)×3Szǃ« ñ­}±œx"G½äN¡Žžn÷ëùá Ä™nàr…d“Säk™Q‚t™…”™ ²% Ç\É$­=áyŽr­ZP¥ÕÈ2ô’V1×÷4 N@v­†Ð4þŒ8I½ýLå:¨Õ4¿o½V:â£ì2T&4ÝESlË[íý&g‘×¼ç—6hýÞ—NÄÌ÷˜‚O‹»@ fäo'¡Ù‡ûk‘ÏÄxí1¾#T,ú¸¡“Ç|ö&Ã¥¥zca?ß ö¨®º(»OK@daÛ[åzŃ>IJ«Åµhñi/³&Ú+Ó[ÉiO ž•÷7ÎÙÑjñ¥ù€6þ!|6ÞOa7^y”›Ýÿ ü·¨„àí(þÛÝ/^ôržìöÎ_õr«ã)` ë8-ãz3¨hãKÀªÅ\ÏÛÎ$IÑíhŸQßÌ_ 9À¸?¥žXàF¸FD¡xx=¡lŠ|(swF÷}MW[–Ë <é‡9·,’Ð06_Xd:jqUzëm…tÁglXâ¾–åÅgWGqÍ\‡ng˜LXẔ³š±·Z´ÎçÛåŸáÇCÏÎÁž({–芨)Ÿ‹Äòk°™>#9–ö—o"Ém°>ÈÌôtÅ&ÎMí³O™±_¼A4C›27Ų˜]H¯¬û“#úD åŸé9ºñ³ŽJXã\›&WÝü“?Vn±±äò?$Lý˜&*ed}S¢žÚ)ô 9Ãþ Ï Ü^üBEˆÖØvXׇ|X÷õ¼A&-Ô«»¤ì5Èkv½ìÚvd¤œ²†GîôƒË.š¥+´¿xÎcÒ6ߟn†Ì£ ^´O+àÄ!¹ ‰Øf®¿ÐÀ¨«M¯my×$R;ãH0P£ù^¦¬ ýÈ÷mȧMø¬Æ‚rûJ#ÜOp“2î£ &rá6t#hÍœQ9Ÿ]š CW©²Á+·úcÿ–Ìë •v—’'ÁVtæ¹pÿ¤í‚Y¾sáa'Ç®2ÁÁrÒ0¬÷¶Õ#}HÍÜû7Èqj™0ß›‰~âv›E2~cj G` Z¼ØÃ‰›Až¹²VÌü ‚²?8y&6´eNò ©ü9 Ù©GYà±6)Xßî$ãv”‰ù«š»"*5¶ã¯`v¹8ä¥ðDoÇ|ÂΘa*±lºYé“'3Öß%ή)ù@&†ü¤Ë„È…)¦˜R¢&„yí²BÁË%6úÆ8›;‚Á‰Ò ;¨ °Eωt‡¬ºï«5®T£ƒãÚ̽ÜÄnd=ÜmVêä|€}#Œê@±¿:6{ Àñ§UA‚‹2êÇ‹xH´øÎ‹Ý¾\ºîL&PâK€ÕÝr:–€‘¤ÕàF'5/–í·Šiƒ öØu¾ÃOé‘})ü0~‚èúÛ½ýèXÏûíÐL¹7* (³Ëe€´²©yÄQoW¬ÈùÆâ™õé¾?0@ó˜3cì$Ž qçïÍÐ4PŠÿ²w65«TÆšñü~åäÁñUã¾?¡t”.‚Žjá$ÕN£ñµm»‰ãD¦VâK¥H€íjh5ï÷먊†{?ªÃõ+ÚÐï…åô" :\‹bi†Ó¾=æŠE9æü4×;E¸o¢íΊ®Ñ¡6FF…‡èOñ„ÂâšÛýÏF…ŠÑ5ì›-BðtîÕîp*"Jìñ°LQz{Ťoé;–†SƒÊ³Ôø/Ôƒå]¿°\Ð åfKVW¡Ù¢8…<6tŸ¹X–Zxvò'/6–Ÿ©/N~¯œ¼üýQ§Vqò^åxñÿw¡Æ,¥Š·m˜Ö Ø‹S…/»¨`¶C›êVoþv,éµþ¤ªïgÂGï_#h·NfýÌìù‹;Ô=ñö÷kìTÙØaÿàUYv~Á_•úxGù1Ç.,z¡›lo;Æ)é/ÙSÖé<2‰ãì‰b7‘uÌÚwõ ÙmCûT{ Ipö9¿yýwø„˜…þ˜ï¢0%ǃ+l¤ÆÑÇú×ÿ4O©Êàå+æýçeúµ™$+DixÜ5>üpÉÛ¼»©CÆó­ÚI\÷™<üPÊꯣhÌÌÚÒ¯pFˆøôeVÁ6W‹ióM7o€¼g­…y±Ù+YJݤtevæ»ràbïëÏ£¿÷êŸV”Ú £· °™—#YÇX7ÒK¦Œ‡Š‡ ¨a.MùYÑXZ”Ç 2Öè‹Ý*d4rŒŸ9ö8„GO&cc„a4é²ËS‘÷²£BLì·~LB›,†í>_—w;Äeì¾! *^A%ø–Èx«O22¥¾ÒÅÀÌ}§–¢8õGý¯Hì8ˆC=¸Ìt°ðQìÍ7¼àˆý®¯ÍWêmÆ® ]’HSltñ„â3 -ôß-ŧã´ólñ¤ŠÆJ&Öàíêž x¬¤œ\¡ø3‘ÑCæË­–iÓ6 ƒø ÛI¡!º[ÒIðx¤ËëY·:û[Tu¶ÚØk¬kg4óÓ…Ý‘±Õ îi£Ü¨?& O-É]<ÌEKÞ®g°yDóWnH§Áñû_Þ<.&lêîÌSÙE~÷êÁiL”å‹v-Á‹šs ¾ua l!óyõá,<¼*‡Ð1šVÁ±MYzÖ÷|Ç¢²!¡*‚ÏsÓ!%&åW* æv®IdÏ!#EÈR­q`bä-˜©:SB®_rrC#;׋ž½z§«jfUþ¡æ0w– /3"¸5»±ER°·aTɨ†¥¼ûh êïØ¸6AßDùNŸ£GŒÏ¿æÝòïKT<ü½Âæ‚Ý€ô˜×<Ú†«¹ßl •Öß?bigêð2⎿˲%h˜"Â_ž¦º„ #u+êõ¿÷ZÕ$ôvê é:É¡/év>MŒ¥3.|ÏFºZ¸ÏOTß RÁƒ³¼wàЦÅ^­ ×óà–lò0V3¬o"òä2ð—X¿ Ó3ÏN¤CʵC`š­Ÿû2Ùbf/íH>›Âl›üÌ7¾Ó^©ÕÐÂ7ã¯@‰'f–ûŠïÞ.qǾ¸$C·íÚßîq‡ÿh0?îÞqI1šw¾}HwµæØJ„Ó†Ò¸ˆ„y¢Ónü÷b¡¬ºÞw¤\b@™‹ªßS줙Qþç)ßssÍÿÁà[('l!V²¥Ä£ÒeéA^g¦«59{Ó6¯#ñ)$ì @²VéJó5†TD, Ù¡ÇC£`¹F²”“’ðÏêO–*ž£¤û²¥Œ¥ mä‹BK¼ò¨½ù&—Уëe!GÈ8v øïÁÂò¿Ñe¤©ÇÊ µ=š-“NùE›fƒÔ7©ÝTF…m¹‰É™Ô×2kÿ=Ðmñûy¼£Y‚qví©Cž’LcT¦´Âàï{S'<ö!PzXÙ³0KLr肹lÎ"Ë>¡¥NÛZ(I ¥OZN²8ô¬ƒ'³äS|„h°šè;Õs½þ‰Š«  x'^†5%´…ò¯wZ¨§¡~;a%`¿+÷&LUWŸÊ2¸ºDR8J$|ýT`‘.×çG²°ëåžñÝnÜ•ék×cá1 ¶—üæ]‰¾BÅÙaT/p9ãª~~ª0]1¼Zåj–åíhåÐ#Öq’¡¹„\ùi€:xŸ´i&À“Eï: ¦ë,«ä…Ã1›»HN“„VÃV¯æÝ’´Ü_®} Ȳì¥,Û½ ~äáõT,%Zï¯ür¬ñ P;è‚_-ÔæÏÏw2Õ À^]oÕÛ¹Swß šþÞåÙ] b;ÊÆÚúoŸtÑ%°šL1Ι¿P3¢*ýÀú¨¥^22˜·Lω\œ ç–9Wa=J‡¶‚>Zà* ü7ëyGRÈ ,UTr`æÞî•ûxñ¹îkô'žÐ sRUÇ@ç_¾2EŠxA§½ËˆHTUâ!I‰31$=ʰ1\2èˆÛ˜ºëú=X$O"C²Œ“”ûed,0P´¼˜4ü4ã­j£ADà×9ЉO®ÐýÔèSغÂ÷ÔâüYFÈiÊ-ô?Ÿ |×éqpú|$=ÝfkW™J†*•¦=ëcôŒOÍA±“±amàÒ˜WêHrªEp–£òÇeCPJàÙÚ—É?vàšQrÇå¹ý¥û ÝQ«@/ïÌÒÚèâ âÊpêt¥ÜƒM}L p–qx —!Ÿ ¶[¯ƒo9üs]¬‘kdŸ¬ybó:Åæ•ï4Òkò¤'Nmƒd6…¿ÆQk­»ý¹[eïŽ Ý?Ñ‚ˆÍ¥—WýÙˆ…‰ÆÔ_D§ °_ze Òd»Ÿ“ú-nš2uéÚºŒŽm&`áÎ,Ëu‹ÓSÁß „¥Ž ¬*%§2]NDWÇøeŠ‚†(„CïmÆ Ûk¾@t8U'û-èW)#wY²/ÞæmìxŸ6›q²!óèãu5íwÉxÜœ»c$æör¦ùñ°(V|ö½KsºãêÎož[à0¹¢*9És‹ Øï5òkéëG"ÐažàjPó™—<‹x¼(\ 5ù;Z"-†ƒ¨†¶m_H6”¯ø³Ñ—ÐæÂVÕ(j> 8Î;li=üÍÅXï¹¢Õk11ê´b5Ù¯PÀvóú–žLL1UÞF•@jÏ3ÑšÎáBãRr;áP§´ “€ÿ“š!¾à5 ÑX}Xßv¹‡Ág¾ÜY:¿I¦È:'‘ŽþÅ%“sÂ4â«`ö· 1mÞ£C®¢j‰ó)Úüõ1ݯ³h™¬A~8ú·Û|e‡„Ý*z",ç5‘ògÉÎ7qw0P+LœâóUÿóÐh†±’H)І¿ÝòZÉë‰fÐ#úÇ­7æWAxyrS-Ò“Ï].¬@dg¢@>[‰°´¤B9%ÃJU€ Z%ß3™«MvËMd6¥íy/ YS¶>”a{Î2/ÙN;}b«“Û3á¥mMyiÇo‘ ÜÉ$£ù]¢å€y¾Œ€®Ãg4ž´°¾ç„·¥Ù2p¿¯ˆ“eŽv&Y5&#¼ÂU‚·(»á“Ú.«y±‰„ðò˜¾³Pâeìþ<¢µOÒ­vÆR;%"c——LO~À Y$fßñuñC¢g0à26HJr¾)öÉc ¨ùˆ®´Ì3:„Œn¡,QAv=0[{>‡öü©FÜÎL6…!ý\VV&¹œ‚š„ÍÓÍCê%à ê.ø÷`>©Aå•™ºº›¸D-v ­#0IúÔÓœ=s RÕ¬Žû9²áFˆàúÄÇ塌Ïp"âžœ¾‰ƒLÑÈWöđ·jï–2z‰_QÊ-ÃËÇ+|O ÛÔ-9XI’¦æÏ‹¡•å$&¦Z¼äÒóOC%u¼ó>”~ôÛÈpõHOL.¢÷¡Fk»Ä¼ËP7üšF `N;“Ö>`ý®ÆÈSrÃ0¸dí›e,  …ÚªT~ÍìAðÂÉ’®Fñ7쨆ãOž˜×W&¥?ÁUÙµ¥<½gA‡v˜ÁyÛ™þŸiÝáÙÎ`±ÝgFäAè|°Ú³Ò[îû Ù²ù#ÃkœuïÛ/¶âüf:~‘±(qVÀŒ)Ëcߘ>Îsì|¼8©‹ÎÂòr^JÂz+.Ïe|)Þ½2YH"‚•Ë€ŸDc…XPçF„l‚ÅÃTûK{-¨ qÛ‰ß;¾mýg© PfÒV*T+3v$.D3¦àŒ„€ä>†›Q+æçŸŽ PV¿/H;žF'¢ ¢6 õË+t0%ÑT$§žOø‘ åaËbŸxë“[ÙF=Ð`ÂÂ^°î@woQX¿'ø)Pƒqú ,w]UIÚ_lÊ–„K-´dgÀðž3VžsZ°R·Åͤ|Ô!Á ½·2PbÒ¶~ây?9o…‘^£¼µf=,£)}׾܆àƒ²v (PV0œId™é€4d²,¤h+ɤ ÙàMu ÊWÞA¬«C7¾+’27d¬ê8˜ckçà^†øÖ4>B~|«Ûv˜ŠGbB¢™¥= ‹… °ÀZA 0‹(t7§5š9r‡Üô%Ï«ñ_hm¶'hâà)‰…à~|~¿¢Â†ù *öw5UÇà1&æA/"×OyúcÚ«ûmP¾NÚì„û‘:ìs‚/IÍÃÒôð|ŽÈõ*ƒŽB¸x‚~"¯yÛçXE÷PœÚ¹½ü¿Ñ3E¥4g´_§™Šð±ý·ÓÇ3w`η’Œ“%6½þFÂÞ#Ø'væyäö²¶óÙà˜ÉEÝèZÌÙš³^tÅ2ò ç‹Ú®¦8qG¯·\u|°Íš¨‚`vd­±Xz°J‘·hõdîËÎF °½q±b@’ÿêÕõ9$®¾ÿq†Ñ.ÁMó¤IüêÍ}}€Ñö”¤¤‡/W\—ÇyέØZjvÌúø˜y.äIè4—"J±ep´aÄìU³Qõ Ì©•TƒPìnü^ÏŸ3¼Æ6bļZfJãœ:;?¶î‰Vx@e¬V­zááÂr™ÀÛÇÛpVô¯¤ÀPa 'á‘ãÛfùíLÌ{¯Bàà?µ`ÔF!bx6aƒ/±ŒCsîHÞ›¾SuPƬH`˜†‹oÑí-åÕDòÙÌ- —{^Ç2×#2J›G­K6¡‚[“&/8š‡kᆒð¿ª@ò% <²€1ä8ù€Ä A\¶ˆeœý™øocù¶M»ëKÕ%j)z3r‘'1|#ZÙûŒå¼Ð2–}ëŽ%â©Ü2o¨ ºu±t›YEոٱ£j°ªyZ–åèÙÅÇCò©'Õrÿº¬ öSõ³@Z‘iñ8ò®®±¶wéÌ)“©” §{·¬Ê\“ÞcsHÆ~ERCzB”uR –:éúdZ °¦‚þìS¡moßQÑû^ɨëš3KöKÔÜVÿø±Užýc:˜Y™f/=â(˜çÏ&#AÎÀ,T®kj¯u¦’>GLJç 64ëkt›ü´­®üÈ`™w§”h%Š}'0Ýq5µ–ù9ÔæUM¤SÕ;\Ð@´xY]³c{P̵2 ñô –êIx‰§&]Å›åÆ`œÛqó'üƒçpBhA—Ǽ¨íjå¦otÖtÈ&„ê½™æò„ƒ;õè ¯Ôí³Š ¼Ú$+Ñ}‚/¶9’ }OܾÜ܈qi=ÖwVN®1ø•ù× Ö]u°záýp1oÚæ!Á'ü+Ô>y̤À$’’ò Œ£wr&ñ= ˆö9xüÀqÉë:hyßgSO¶‘o>FàŒØyœTyÏ&úÉW#eØ”(ºýÍÔ Yú©´þåÔ&?x (zΦãÁ[Çè׿+ï¯Êìõ&íÕ*ÒŸ*!ؽV“68}|Ÿ®8HuýßK­qϳ§B«5ò„åÇ%=§LÏ›–‰»ãO2¾düŒðÉjà qéYPzk­9ußqë[ZV›ŸµÒÏ2!žn=1Ž*”IïMÛE Õ2x>fN"ã•[®…ÛÚ/LÇÉáÖVé?9Ém¯+ãA;\aÇÚžÕDž.Êö¶ô~7OºÑùøºýÏàgÃD6ÞŸú`¼†Úl·±ë Ž˜”ÂoÅÞ2[c©Ìºp¿ ×ò¬ˆj ñê²a|‰ƒ—aJƒZß…œ‹úg ûnÈLǦñ6jÒÒy*LšŽuæwº”=´\Ñõ)ÆÉ¯çVWJßgnd‘ásÎáÃÊDB'ø™nsDóè…›f>г63`*WJm¥.y 'çzn$kZ^¼ŠSã›Ö|ù/ÂVkv²eÓá°½ 7»Úº°v‹Vn,[ÀCƒ3.l>àtQÎ~=´U›ätÂÂÁ‹› !¾&/¦/þ:¤G+9Í!Z÷—Ö¿Q¶÷3§[ËÛ¸^äHáY)cŽÌÑÓQѲí§MKÈÞwÛßhM’=šÛb‡ X0 î¥#›\«ËBß›íU¿gåH—ˆ2cîh벺È_ÌãKFŒ½EQ¯ßðL1Ù[ù=ìdTÊyxÍ+¥U¶äypE6Vµt¬j~ö‚kÇ®È4S‘fÖŒ”j v$…!P¡Ä«èÁò|ú­ !püÄrÉþšPrc¨]­öv —tîp[k¶Xû_bÒºÔƺ\ýÈäqýZ8ñ¹K^‰ <žR·£ïšAdÛ?§ï%¦ ¶ˆS›bk„‚_¼“ -½NP@Ú&ü>1b|DGF>°Pâ»[o7*ñ  IYcƒ)GH%K6"YaBk> ÇÃï= ”¸yY’×Q«vOL•Et&ÎÃ*wÏüS+M“‡9ѨˆFNe)ŒÎY†Ü¸ð*<­yUCÌðNšÇM‹Cš3G™}6’WÈ¥½žcò Ëx¿;úÍ7qà^œ¹á¼á„°'ËX¢Ù=Åü¥X03¨¥gM…W»b¥]}eÕáìwIãccgR×i©í?G²½©Àë *®’‘Àþ`ÛYÑ ôÑÁu(Ü=BÛ}:Ç}0îJ¸<¿ðùíŸUƳqqCkǼÌË/Ú¤>Im(¡5Ð$5è%µªíS'øØLÖSñVK 6 åt¤¯Àvoý06F³r´Å™wÄ2̪ˆ&-?2+ÓL9v³à>íŽöF]Hñ5ývB÷¢PqÝ÷^æûá»4G4©eÐ&î˜eK(("çŠàwöåzüþqúg£ÈIv×ëvVdõYåÑËIeW£)móàgpåÖÔÉ¥ñ´±q¸Òs¸ß\K' ëb”ÀÀ|“d4<é­¿®*Í–-? Ô’ Î¶_‡Îî¡óÝÞÇwë(¯ÐÆd§z»gK ™EŸ?§/mªYQR¥¿ýL4ÜÈ4?CÕ•¥²ýÜ î¹â%ëË•£Q²^è~”M½°²·¦ ÿ—õÿþŸ0¶15tr±·5t²†ú_®¦ˆendstream endobj 318 0 obj 29921 endobj 319 0 obj 777 endobj 320 0 obj 29284 endobj 321 0 obj 531 endobj 316 0 obj <> stream xÚ]’ÍjÃ0 €ï~ ï0è]Ò4¶WÒQÖÃ~h¶Hm¥ ,NpÒCß~’:Ø!ñg,YŸ-ßß}TË­ëO°\?¦òc –»×zÉîð|ðí$“ÐÛ &Ù´Þ…9FžàÜz±Ê¤kí4Ïâßvsru'è¾éEQÈ䈋ã®r+>ˆä=8­?ËÅ×®Âyu†èÀO2e)4¸º¼ÕÈdë^z»Äп…Ïë2‹ó;ØÞÁ8ÔBíÏ Š4-e±ß—¼û·–m8åÔØï:ˆ"{ÂÐ4ÅyüAÎW‘q@Θ3bŬˆ9>ñ–Ù3 +ÎU”«4³&溊ê*ÎU”«¹®¦ºzͼ&ΙsbvÐä yMûhöÑä£kæšØ1;bvÓä¦æÙ¤‘q@fgCΆ 9v0ä`ØÁƒás:—áº8ÐåÏ·Lm rk«½„€¯(ö”ºÙz¸=´¡(+~¿Ø…·*endstream endobj 322 0 obj 367 endobj 56 0 obj <> endobj 324 0 obj <> stream xÚ]“ÑŠ›@†ï}ŠéÅÂö"Õ8sf6„%¥4m—uû:ŽY¡Q1æ"o_3Ÿl¡B:žÿûñ<|z)7ÏÍP‡þ’©×p®“›ÃjLÒÃñë±ïf•¾Lƒ/ìڮo¦õU‡S×'Û\5ŸWŠÿþ¼.o—9œ};$û½J_—›—yº©Ç8ñs’þšš0uýI=þ>” —×qüΡŸU–…jB»¼hÉò³:•>7ß¿Yýwãí6•GÞ’ÁM¸Œ•SÕŸB²Ï–«PûoËU$¡oþ»/9ÇêÖ¿WS|¼^ϲü©ˆä¡]¤m5Ð ޤ3H â-z}KU‘rÉl!ÎÎåÒƒ ô ´ƒ,TAÂÈ`”“Å%o!IãgðÓøü•H-„­`«I-¤Ö¤RkR ©5©…ÔšÔBjM2!™¡K/† – † – † – † – † – †^,½z±ôb˜n×éª!Z²´$´diIhÉÒ’Ð’¥%¡%GK‚‘ÃH0r F#ÁÈa$9Œ#‡‘`ä0ŒF‚‘ÛÅýÂï+p_еò×iZ6.nqÜ©û6u}øXôqï§âï/¬âendstream endobj 325 0 obj 464 endobj 323 0 obj <> /FontDescriptor 326 0 R /W [ 0[600.09765625]11[287.109375 287.109]16[208.0078125 308.105]19[616.2109375]21[616.2109375]28[616.2109375 308.105]36[699.21875 567.871 716.797 678.223 534.18 478.027 819.824 713.867 238.77]47[375.0 895.996 833.984 861.816 502.93]53[541.9921875 559.082 470.215 685.059 624.023]60[592.7734375]68[577.1484375 577.148 476.074 577.148 519.043 273.926 580.078 527.832 262.207]78[470.21484375 227.051 768.066 527.832 562.012 577.148 577.148 334.961 398.926 240.234 512.207 462.891 759.766 498.047 498.047] ] /BaseFont/GFEDCB+FuturaBk >> endobj 326 0 obj <> endobj 327 0 obj <> stream xÚí½ |ÔÕÕ7~Îo™%™$3Ùw&+ ²OH:`’aÕaQ 1 Š¨Ñªµ(.ˆÅ 5 DÀ(T! R‹¬¢"R´.H«µöI©µÖöAò›÷{ïL†¸µ}Þÿûyþïóya¾sçþîïœsÏ=çÜsî @LDÒðfŸ|QÍ´Ü' >%âxôº5¶µPYñy>Û-]¹ðÜ+÷MÁçD ¶,ZöiÜ_e¾„ë·µ´6µ¨/î™@4 ã•K›ç7·¿A”µ‡HÕÒÜÖ~dêwå|NôüüíΟmX™HtAîyqSã‚O§_v%Ñ…W þ5Ó¦VÞžùÒ“ø¼ô†,ÆûbËh¢±¯ãzêüe-5Fý¯ñùK¢€ý—7µ.?øhï_ˆjÀ/qزƫZ´<5‹è²1Þ¹¼qYSfë¢Ë5ÈsùâeíWØø5ø5·Y–ÖNÍÎû¹{ä¿ò}Œ¿„ ”qdéW®T×áö`ýY¢ŠŽöŽÖFç¸ËÞùù…u99¹½U²Bvbm…ëµ…ú&´Íë¶idjd‹©h”}ð;\²¿Ù÷f_N˜#É‘–äHZ¨Ñ¹65îÜ'Æzsð?¾h5eB–UF>ÿÃ4‚‚¨Æm·›S9ØÌVZ°ý̓y}ŽâbP:(ÞsxÂŽÀivئÍnø%C.{örš¹»ÛÄÛ”­&e.Íesºâ°‡E™Äÿã†ëð¸¡åŠ+ŒæÒw…S9U¡wF¿lÄ2ú aLÓ Ë )Ëx·=@SSÕà@U3S€FÿEYvnV6Û”¹lWÌC]¡»2´(2”Ot^+dh4J®ñ~¿ñNéËü1‡süòèw ©e¦!|‚oS–A¯Ž^%4b Ü¥:s8©0‰o3îá¥|bÆòœæ§é86²×ªÆØÈdóŽýò`Ž;ÆMnv+nÕmu¸Û¨Û”¶€¶@ÏM 7¥$§¸òó"ùéò¼œŠòܼò†ÜŠñ9¹C¡9žÓÚZÓPÐŽ¢·Ca‘Md3qh´\^°êû²Ï~f>&ì’J‰–J‰¦hŸRÜiÎ@%KIÖ’-óÓia™Qz…y¥Ò¡uXVtóVsw C¬ ]II‹—Ÿf§”drØ)?Ô3Ƕm~ýõÍ=¯l4ÞûÛ_Œ·9ã¯塪‰3ùRãnã”qÚ¹”‡wy_Mí6&½®†Ôa>QÔãŽS""-ÃCR#‡P¤¨s(qh Ù(Ú~®ïà›íg°ÊXîì3Æá3ŽPïŠÛ0Ã01ÈïŸáä,©d©Ù.³ËZT\`¯P˃Ëì[‚œnuZÎ@§Íä N sF› ò®ˆ*µ:¨ÜQV¾J]±"²;ò°v8,šÈd¾€ ÒS’Mæô¡E„+*'iuçŠÇýWî¸ý–'•GøÜ‡ï²vë'Æ”Õʲï/¹qË kO³ö·Cw3úý$×tç=m•\Óú­;Þ‘j ±[‡D¨ÃãRí1‰öбË(–Wšº°ùÏa­C‹Åó{V:Qê!‘ôpS6e›†›³-ÙÖì€áÙ¶ì ìàìÐì°ìðìˆìÈì¨ìèÑx߉×\ùõ;†eºkæ¤÷Þålã×R—Ò÷Ôw¥Ìs…DÀ#²£mj‚o”Ì“¾qÐ~8Ç]êóDx¡Ûær»#ÝQ-ÔÂ-J‹Úbm h l±µµ·„´D´D¶DEËA!n»Û¡Ïý¦·:¾×s¿íÁÊ{¹å9¹eerÝ=çˆôÕ¦|Hm¥[ÝQlÕ‡P¶5Õ¬ZÍ&]S˜,ª%¡Ã%l¾ôÜ9¬vŽ{N§)ɪSK6¥YÒ¬œ§ä¨9ZžÉe©¢ ¥Z¤5—[®¡NZÁ+”kµNí½So7µš¯´lU»-GÕ£Ú«úAÓaóaKú0ÎTÇð(µ“E·ó²ª)j’šÂêaS9üÂÑþÎ#/(G”…Ê´þžþø c¤V© ¾›f²`[p“v¹“ÕáÁ¶„¨X=!"ÄfR£#t«FJ¨U‰ Ò”HJ‚ça‚‡F xò™7Ïøí×kºIÒt“(iÀt§gs¶’­fkì0Ùl{–#%.;>;!;1sHölg…åê€vÇæÄ®ÄˆÖáÙÃÙŽ¬˜ŒØìج¸tg•¥ÂÙ¥ué]A]Á]!]‘]QG‡uFxq8;`‰ê@ƒÃµLv$åEFÀ6Y]ùÚþ‡^8Ðsó÷Þ¸¸«‹s/°=m࢓_t\ÖuwÞqÿ[Ôʯ6Ì×ö~ÿ“åÍgoØþ¹oT{Në—Á·ch†;&&(Òf·R¤jO³F¦©1ÖÔØ0ÛC¬ÜÈ¢6âšøƒàæv¦¦;\–ÂЂðMúFó£—Vl)uFtk[-ÛCÅr¥™´§ÄIyZTÄHøZ¤_Vo|´ÂxÈÉ¿á¹k™.þújã·ÆuÜÆ¡·pàÜE5|„çñ4>6ÞýâÄ™Æ:ã vÞµ3'J_Âúê)¾õ½Å®¦ÇêiX×Õª)Aj!H„#±”}çú¾‡åP¹¢¡:°¢” ËaE-QŠÍU\&öCÍ­»MUæ KE€ÏC*+y¥e«rˆ›Y"åDI)Ž|'aÿËä$íJ£Çxnm'7ò„c‚1Ãx³yïQ5Æ£¾.ºŒU&‹±L® æ¥>…yÒ8w˜úKSbÒȪ+f—mösóòúò¼3z³oЃ™ØäLldóÍD‘ä}©OûB îX¹T¼L–ÇŒáö?íç¹ <­4Õm§4‹)M‹U̬èð£ÁPò`78”0Œ(`@…Ö éBýBÓ…Vm.'9R|",ë?Õ£ë?¥$)Ÿ÷Û¥ >;4UÀãèw¼Í“@ö´ X! 3ŒЉ%Ø¢)¦ˆ-æ £Ø(ûìÏH“Ìq»Ó“m®ÐÂð⨕ÊJËŠ(ô7ë›Íݶ'B6:6F<u$:4=p„­{ç*¥‹6kÛ,=OuÅtÅvÅÁXÅòùÕœž:`¬T”Thª0–›§Œ2~ŽkÞâòËo˜jœÝhüÝxœ/fõ.µ j°q»Q«Ã üÊ#]s“q§ñ{l§÷pô› èZ’ë{ƒ;TI³˜b5²²Bfú¶‰ô¦Twé¹RèÛæD0uêN“Óì´ˆPš£ç˜rÌ9–£t›Ý–P/–â{LÀ³¶óve»u{ÀöÀ}ê>mŸ¾Ï´Ï¼Ïb› ck“Ì×£ž<÷Ûž5ñIåL¨ÉÒ‹²Ò'/×@^•ì½J,îË‹’a; íßo¡WS2¬ÐåBeŒ6ÆTd.¶LàZ®R&hWiíØZ,íÖmæm–í–mÖ—-QÃh˜âÔ3¬£¨”‹Ô|­PÏÑ]¦ÜX`ɵVQ¹R­Uè妉æ2ë*nׯ‰ëVÚ¨<¡mÕ7=n9J‡ù¨~Ä’†P‘”¢ZYM ³²é§î1tÃtÏŽ(ÕJ¹–ðõ­òëß™ò¿vhöæ÷Û0ws7Ólw¨Î&ÊÑRM±Š+ªj‘qNêøc‘uºm™Z¦^Lj1×°2÷¼iX¤ 2Tpw²r˜Žj¢Ò¶Õ›”¯§õh==õ¿¾ bŒÓÖ!Þ ÝàËí?BnŸaMóæöpLåÛ¹½û9'99YñZ“ýé«3ÄáŒtF•p±â‚ Í5TW+•z™¹,Ð86²,Jä9­2ÏYa™Në·2.êân˜Ê&í1K—µ; +°ËæÝ;7Ù7…mïŠØŒ=tíã} ìݺ/`_à>Û¾ }ÁûBöEì‹Ü5 »V€+p‚R«TjµÚx‹`=ÞþxÐcÁÝöàoDËýmýs AÁðŠ2Ãæ#ËxÂØfŒàã<‹gòëì!Üjü ‘á/ÆØÌ‚'hu<ƒ_5 |{—ºSî]a´ØiKÓÕ4{l°IuÈÍ ÙH…{#ÁÀöu>Öc!ÃåB†SøÀB:¯V:•v‹*Þ„!™0 (¥ËÞå° N&ŠÂ5x®Ø§4ÕÒs°¦æåîãÆßÆ÷ü•C9Dk¸ãúþß_s×ïõO7YÞñÉ«eJy#ézwLdàd5©öHHfÓk0E _$s©öXlM ˜YXY0!p_eí è + §âš»,ù×±ËÑÚÖ…•Üo=p4ðXdRf@‡e•Uk30°ÓHåɬfoÛyóÍ{ºÏž0†æ÷ðØ¿³úÁAíÒ[®5Ìíç†(ïö5YN}æ„Í]ê9­~[N£gÝY©)jLBŠ=Ö`NH‹ H3«1‘©é±Î Ô2‡ÙSœAЉœJL¥‹ zKo:h#rˆR™‘c àÁB¥Ë…J§ô…ªÈL­Ñªì­æÖöäŽÔníEû‘ˆc¥Ù2£³b†Ç+ u¥M4µ"Ó_a»"¨cH[Z·½'vðþÃŽƒÑGc^‹}5Mæá’ú¡E‰ U Ø:’½~”i–,a†°¦~á¡ïÿ¤`UÊ-kY÷ä±Gÿð«öc:’o˜rÅOæßmå¼áµ?­¹fIãò»n¼ì¡ú¦}ëžøõìÙËÆ”µ66\U«ýÁ{¾{Ý„õ7S‘šŽØƒÈ£#ò¼yðÜAiyÑÖ›|;Ôxs€Â$u“±®Ç¸G½Y_vv¾ìAo|ëòœÖÞ3‰Lî¨;"Äj"³ ¨Ý¢Úõ…8{_Þ—^óÂŽ~[ô–ȃ7ÇkN@a`N`Ž­$¨‚+·6ηUzO6ÓyPdüNxÁæNêäN¥Sí´uuw†tÚ;b/ݪ`7 Ú¼=d»}»ã0ŸßQ½±æpP‚/tR ç;d-YèÈ×ÞC"pQá/=»Ÿß»«Gg¼b¼É9œ«>õú«/ÿZýLêÃó•ç¤n‘{éjwˆFœ£P,69†«™ìå×—÷±H{£4%]¦çP!*…ªKËÓÇQ—+j&Ý‚2«CiSWh+õ´™7+«›µÇô—é%>¬¼¤9sqc‘R¤åhå\¡^¤µh+ô½[}J;ć0(T^J¾•uKGÿÊçøŸ0Yþó¸)÷ëfm­w “#–1âJ·Ý¬S¬bÒͪEÚ‰UÚ‰ð™‰çAðÈtÎÖ2ôbFÍ`6 ×ÒÍ9æ ³6hM¬rM¬dX“øóFz\ÛhÖVR‹é:Ë6ÚÆ›µ}›i‹Ù [åþ)µ‡ø#lßÌ+M–s¿ì­R/êoP¶ –ƒ­È<žîwGÇZÕô(k‚#&*;.×$ªÂäv–'ÓloÝSìË' Y‚g$KÀÓí•lRµ^e© -ÄžV`qkI[«°ÀÚB/ s‡‹pGþ@ínoq´DµD·Ä´Ä¶ÄµÄµLþÖ1DXJáù#ˆÈ¨Â|uá“wÝùÌŽ[×<»iSî/®zÉ0X}¥mGþ&þì¡Ý/lxøð+FïÃs9ù·pÔ¬ike½´óžcz@Î{»;:4 ó޵&` Ï‹Í#¶E†šHÎ;/Ï—M š·?ç÷VL rm„&¼˜å ¨ *S±³ NLÝÖŠ  ß±„;Ô ]¸#ÄI†;Ú㎭ˆÿ­H]>l?—ùCq/B¤­°8“é}úεO>{ûê݆qôʧs7m*ØÑú*«ü» /ì~è‘WwýÖø°qÎæέ6Ëðú˜°u%ì †V®}Ó­‘ (:²Qp°MÖ¾}¿§ö—Gy¶q4ÎÖJ­6ï6Öm锊t;ºÃ»¢º¢»b" ‚G£D]ÕñàuÛb’êʱ÷MÿÄø€‡ÿ©î§£‹ï,ßvüÄ–Éë\CSR8îÔiNp&mÏÈ:¸éþ_ŽÈôžÓI»ö­ïCƒí:./*ûÓ®#«u–-W³Ìâ]?ák,Òêï3„$ÄK­Sï4uš;-ÖNGghgXgxgDgdg”°nû?³mÇÕ¶ÕfßÜÕO°–&T=î¸àÀ83©éÑ ¡1ÑÙñ&Kp‘ÙBñrúÅžóó°wA[Ëu¿-š…%¶ž÷ÏÐÿôå+f±ÄÝ2±òGx‚éAó¡C±ûb÷Å¥§×R5W뵦Zs­¥"¸:¤6¼6¢6®;øI$©‡ƒ÷ÇŒA•åš›õ$¹‹E :jŒPÇ=|ÝÊ-!ʹ~²n¾uɺá«Ç½÷ów ۼʤ¯Z}û•í>1ujåµû‡w8Ñ8û–´í1PJ¼éidê ÜñQá&r˜ÕÄð ësnø°@Kp€‰ÈnS¢íçJEÆvPž&”öåy°Å9»«Ã8-¬0lpùðí³ëÞ-ÖíÖž(Õ7‹G~„ÈÇR óÞDD‰w ‹¬ÊÙ¿ÓW\}Gb~„)İèNcíºs'ÕÌuÜöú3f³\¿þ“¾˜œ 5Æ–›ûM±&$D¦‡†Ä§d'Ä ÍÍ M‘vìÌôÙ±üæ¢ïã>äeö3Rzyðî¾^˜m-Õr­R«ÖZkjkmµAµÁµ!µöZGmhm˜\‘ÈÚ¨ÚèÚ˜ÚØÚ¸ÚøÚ„ê!UIµ)µ©µiµéµCk3~ 0¯­Eo1ÁÏårš…ùaƒÉçmÚ4䢑#Ç9ò"u/¯ô¶.Ðñ^è8€.q‡˜Õ’«ç©`UȤU [FÞAY@É}Qß÷õG )D +æ*¾–¯QZ­OQo 8¬X!K½p>«{_6ª6näSø†ÅôÀ×Wñ6c²Ýy4dR)£WÉ]þ3[68j’£Fš£<»½q#î’÷ëëáÉô+w’#Тh‘ñÉ*ë‰Cb²ÃsC­@ØP„ƒÂRDŠ Ã¨˜`©Œލâ¨óUOŠä•B)³[x(è`¬’îtÅ}_&Pçw³u± r¸'KlÒâlIjI–u¼}Ÿc_è¾°}áÞŠ~_ôagη ê¼eEHËŠòÚ—¾~ÓÌy-k/n]ºqcÚÏλ9!ýç‹o}Pó³·1†*cîZõì~#_ÝÛY;qz]ÝôgŸð-è(ŒqGœ÷­\¿o…{õòï¹Vƒ×µþmÇòá©Û5QslÝöýN•ùm§ŠøgN¥î½ÝïS"ãûnjºÛ¡¦GXÓCÄ·S"àÒwÎwrFLøgßGu›â »óž —™Mß ˆ2øVí—ÖÝsøèÚ{Žl4Þ~ûMã]N=ù.åÓ÷:tï}¯¾zß[Æ[<ìí·9ÙøÀ›Ëö÷isü9|ìù\™l\DnÂw³Y{ß7Òqbè?Âþœ¶ÔPÍ2§[IÕÀ&òod­±ßŸµúWäßÎZû'é¯û²V±Oöùk—{ܱƒk[\\nÂw³¼ÁóvÏûç›buXUÄàíð߯X²Díó-/Åñ_-[Î=¦<ýÍMMú"üÎA—º£($Àl³°–À!Ù¹ˆHȬ¡2äzkK$"p|ï·Îß)óm.GUé‚ViòW ¾TÆï9ʶ¡¡Ã¢W®Ú¸1å¦å±¹ê‘Ç¿f\ªîݲh^¨ õœVNA¾4úOd.ICb#†ˆƒ¤ìôØ ï!²S'Å„¥{¿Ãðž!}ßùÑ€}zEþÎ Ò]™œbNIí¶¶¼l;²/ä ÝšmiÎ wq‰£8¼ ­‚«UáeiþõûFêÒò=©ËÚÂ[”-ê–€-[l[‚¶o Ù¹%jKô–˜-±[â¶ÄoIØ’²%uKÚ~:„L÷°vÈöb𱤩/¦] Ï¢Lÿê,**‘•Sûº¯}2ã¶„Å5Ó̾é†6ß³ô®á·ÄN.-Ÿ4åò‡oc妇š.i(/«sQEvÎ×ÜÑ0§®´øBWQuJþíPJ>©_(¿sh4Ä`ÊU`LºYµ‰oб‰Ý_dµþ­ïÛ߈ì|œ „µ$«xòÉû6¶µm¼OÍôf¦7× Û»uÅju¯÷Fï¹T‚8—Ê ‡[¦PP<,5û_K‰C©o–ÈÞ@ïñ¶ó‡KÇé8WŽ9n?îÁ>M:Ο*©«Ÿ=xhϦù+V4vó†OÞ~ûÅÙÿûûoýÙƒâÛä=ž·ÔM˜ƒNËÜ!šB¹œcòŸ%y¿/±,dª‡R&‹Ó¤L½„\ŠK-ÖÇQ—+ãT·Þ¡^­o£ÍÊVyr$…¢21Ð¥”s™Ö¡m¢Í¼IéVÐÞ¯ œ©›Œ"£ðy¶³MÝ{.Fý´•r³ï7Kž·ô¯ÔÏÈJ÷¹c-&E%órUÎ °ZÌ&]~¥£øEÌëËë G^⛡Üb*æB­@/µVS%—kezUØ|»¾ÂÔnnµ´[7R7oTS7k›õnÓFófËcÖ—évØtԒ⢕J§²Â´Â²™WP¿«ÝÚ£¦mtH9j SÐò­ªþ¦ðqÊp=‡´=‰Ó¼SQ¶ô7`:×*;ú'+7ʃÔSÐs 5¹£-º¢YM¹*ÉÊ-¼4›]üJè°øuÈΈï¨ÜyTÅj¹¹ÚÚJ+”vµÕ|UdÑÝ–•Ãêaý€éEËÀð6Ë&åé€ùp øGRŠ•ñ'ŸÃž:?ÙÏÆ£X9{Èxˆo0:ù ~ÙxŒç.‘|ô÷©oA>3ív;LÐ4ÇI5³®f±¿éÓsŸ0_²ïQ®»=“ÓM.ª å Ó s‹y=Λ¡½nÓVóQå¨ú²É‘Aéjš–ªg˜‹©T£ëcL£ÍniNåâ|̼’®äÊUêµZ›¾Ò´ÒÜiÞŠ(´Y„6‰¯ËÌGkª‡´ú!S†<ßK Ç{ê[ýëzÏ‹ŸábNR÷žÍQ.RoïÏQ^'ê5Éï)Ëiß¡¤U-ØážÒà|ifÒˆ¬o}tÚÍÎ4yGÐJçgrƒ§ÏÜ¡ÇïPÓ,;´´”Ó?tñôˆ¬ “œ;”—ù¨–_R†¾© hŠOèFyÙÚ£\ïö\zVm4ÔKæ®×/9«^ÕPë.P§ê$CX³FŸˆ·}ZÍ„™z͵æzmBuº>a¦:Á­U§«U•×êU†Zy­:ÞP+ µ¼L-3Ô‹žWǪûyõBC½`Ìxý‚kÕ1ãÕÒ±jñóê(C-2T—¡jÁój¾¡æUsϪ91笚=rž·}ÚHÌaäuäõÚˆ¬t}Ä\u„[ËJW‡U‡e®Ñ‡U‡íÓ23æê™kÔÌë5÷ËCÓõŒ¹j†[š®¦'ŒÕÓרixK[£¦¦¬ÑSϪ©û´Ì3ešr½–œ”®'ÏU“ÝZRºêÄ8çuÈX5­Ä5jÂX5>nV[£ÆžUc ]ÌY5z¬e¨‘†Acõˆ³j8ÞÂϪa¡ázXŠ®:칺ã¬jÏUCΪÁAáz°¡…«†pVµªe½j2TÝP5CUq³zVUð¦ÌRo|}*íá7ßÎÃÿ郆ÿ·>sP³}ßs1õøžûésúœðüÍà§r½òöà§êR_ÒÒµ»µWu›þý7úñ4%š6˜>4ßd~ßü¾¥Ìò¾Õf½ÇzF<Æ}ëùB`EàS¶,ÛÎ [ÐŽàÔàKñì ~5d^ÈköT{—#ÖqY¨3´!ô¹0SØò°Âó~|þøüñùÿϵ¤|_Ñô=%)š‚Q*iÈ‘ø’øuX‰Ÿ;Q0…Yq(…Q8EP$EQ4ÅP,Å¡2M D‚Z' q(…RQ¥ÓPÊ@ö>Œ†S ‘”M9”Ky”OTH.*¢QTL%4šJi ]@"éKãè"*£r¤ã©’ª¨š&P M¤ITK“i ÕÑTšFõ4fPͤY4›æÐ\šGÓ%ÔH—Ò|Z@M´!".¡ËèrZJËh95S ]A­ÔFíÔA+èJºŠVÒÕ´Š®¡ké:ê¤ëéú ´sÝL?¥[èg´šn¥Ûh ÝNwÐt­¥»iÝC?§õt/êÔûéz6ÐCô0=B]ô(=F ™1uÓã´…¶Ò6z‚Uz’ž¢í´ƒ~AOÓ3´“vQ/í¦=ô,=GÏÓ^ú%½@¿¢}ô"b÷:H‡è0¡—è(½L¯Ð«tŒ^£ãô: 7èMz‹Þ¦“ô½K¿¡÷è}ú€>¤Sôfu6±™þŽ+ ?cø}I_Ñ_è ú+[ØÊÈ6êç ò · ¡Ï¨;8”Ã8œ#8’£èÍ1ËqOg9y;‘'Óo9…S‘ §óPΠ?q&ãáœÅ#ècúšGr¶øb›ó p!»¸ˆþƒG!c+¡ßóh.å1||!»y,3ý‘ÇñE\Æå\Áã¹’þ“«¸š'p OäI\Ë“éw<…ëx*OãzžNgxö´™<‹gÓ'tŽç 8šÇó%ÜÈ—ò|^ÀMÔÇ y/¦Oy _&Ø¿Œ—s3·ðÜÊmÜμ‚¯ä«x%_Í«ø¾–¯ãN¾žoàŸð|=Â7óOùþ¯æ[ù6^÷ó|'ÝËwñZ¾›äu|ÿœ×ó½|ßÏðƒ¼â‡ùîâGù1ÞÈ›x3wóã¼…·ò6~‚{øI~Š·óþ?ÍÏðNÞŽ¼›÷ð³ü?Ï{ù—üÿŠ÷ñ‹¼ŸðAFÍÍGø%>Ê/ó+ü*ã×ø8¿Î'ø×ü¿ÉoñÛ|’ßáw±³¿Çïóü!Ÿâø4ÿ–Çó'ü{þ”ÿÀŸñù?¸ÿÄgøÏü9ÿÂ_ùKþÅçðòYþšÏq?ìû³¢(ª¢)ºbRÌŠE±*J bS‚”`%D±+%T S•%R‰R¢•mR}Meá’Em-ó›¬í‹—,—-sÓÀû2ï•¶…í‹W¶,nZnkij]Ò¼`~Óòö¦ÖÀùÍË–56ΟÌc›5/oºÜ…È(D6¬BÞë¾é{?ÔP+˜Êfˆ¯€I@ãyúMƒé7 Ð_â§ß<˜~Ç`úÍ~ú61|€¸­jЇŽorv`dÓ7æþ­^þ —,ÉÍÉÉ-ò·Fù[Å­¼+×ßÊó·òý­«Ðßrù[~y~y~ù~ù~ù~ù~ù~ù~ù~ù~ù~ù~~~~~~~~~~~…~*…þ; ýT ý¸ü­ÂYrÏs+ôó(ôó(<ÏÃ+Ÿ+7¿Ð/½Ë¯ËÏ×å§âòSqù©ù%(òk£ÈO¯È?"¿6Šü<Šü<Šü<Šü<ŠüÙ`zÀû¤õê^‹ß7ðÔÁêiZ­œCå¶V½ÕQ‚þ"õ˜«µt‹É†jéækQùté/zŸ €ª,ו¦|S>­Sï”r<†ŠpƒNê§£ •ÉïðRConné½8¤ôoe‘õç §Ö_!Þ_,»ù±®ÿ¤µÃ2Mr¼¯B]ÀÌ þ‡<þ·ý4¿ÿË´-íÊ2·ÿ$‘µ×XgÜmí8o9çO8Hõ¾LÓ|WãIü;âß“‰_ÿVêèÿÙ' ôßÂëþÕˆûð „è×ß8ùý·ÎA4m9Æ\mêÐìut=§q.q%7¡Ö¿[9¢U>P¯SoUרw©ª[Õê‹êkšM‹Ð²µB­V›£]¬­M¼9ñ¯NÕivZÎXg¢3Ù™îÌq–8Ëœ=I‘IÉIéÉJ²)9$949"9691yxreò%ÉMi/®}­x<Òž®§.Î`‹¿šµÜƒû;à~¸ß¡®U7ªÛÔ_¨û5Ö‚µH-GsiS´yÚ]‰7%~áT$÷0g´3Þé”Ü‹¿‡»ÜcüÜHîìñx~Ç÷ ¶¯aÇ+ ¯X¢þ÷ú|Ã{µÿq¼vžýÑGmþèÿ§›?Z×U;½ø£WO]vjå‡ë?|ìÃÛˆNýŒèÃö¯øðâ³?ÌùÍŸíÒåó­«ø'|¯çð.Rì¾W4^ÉÒJ–R¦`—Qâµ\¹Iù©ò3åVŸ¿þT¹U¹C¹›~à¡\ç}}§?ö'ì÷—°ÐOaÅwÀ~‚n¢aË¿‡u¯£3ôgXô½°ï°›?Áv·Ñé?¨Öû$lî¬UøÑ]ð¤WàK/Á û¬ð,<ë×Ò·ÃÃ>ƒG¼%íq1grüå2øÜåð·¥ð¸.øÜð:ásð:ø‚×] ¿[Ÿ»ð(üî:áy|)O†7ü•³éKΡ/8—þÆyôçÓ?¸þÎôŸì¢¯¹ˆ .!fâR:Çc¨öÅ|!«ìfDz°ÎãØ›3ó¶ðeÀ±•Þæ@.ã`Ï!ðˆ ®`—³«ØÁÕ+ å Î9‚'q$× ŸåhžÂ±<•c¸ŽãxÇs='ò Nàéìä™<„8‰gq2ÏæžÃ©<^7ÓùbÊ—ðp^@ÏsΔ8KÞ»¯ Ys!ÐNÈ}mȕӀ‰È•C(Ìó0ÜXŒôô£<€1žÀXO0ÎÓ Œ÷ Ë3¸ÛS ºáÆWÀÏ•ÀHñ›h¡  Êv©;rîI@—çwÀ"Ï`±çE`‰ÄÑA¡Ôs#p ä·C3™À™RîÙ˜»æz¶Aú0ŒwHm; í`´ç(Ðå9Üé™Üåiîö,D`GÆŽj±0 îFzŽ£<§Ñž“@1Ç0Ìñ3`<´ÍĠ°y2!Æ1 s '‡±æ"~Vnˆr:B^”ýQ£Àã$0VbœqoôäÕ›ŒM¨_B L€"(Ñó´ïðôÃ0»HP{ áY Œôìõì0ÔvcäH1÷HP{.Qê ¹b5@A' tN#<·#ÁU—Gü=§92Ö3((DB0Áó%ê2î†ÎÄ\†Ë»À¹Ø/†ƒþi ³'q6  ܇ã.Ñ®”X©†ã®ßa„Ÿ…ñE¦’+˜!1Sâ0‰Ã%fI)1[b¾ÄB‰‚WfqX ½eA~£á¿Y_ô—É‘ã%VJ¬–82g!Ç·!ZAu„Œ# ÛÀTøÚhõ ð¶BWz‰1Ç€vhi$F¦cg‰5½ ˜K‰•=]rä(ØÏHhõKàì£#±Ê}À2Ä–‘Xe5°ê‘Xå“À)ëà#±Ö¢=‰µô`3#a{³€s<Ó€—`¾Ùó$PìªÙð) ØU³e¼Ï†œw‡I̓肮²¡½@ó³¡ÃyÀ‰¥žqÀ2øN6üEP®„²á)¢§~š ßNÇ“ ÙÞ6@?ÙÐí*à,ì¿Ùp%p«çàNÏ2à.Ù¿úÉ´_ElÌ‘19GÆäH(о9Ò~r¤—åbü{@;Ö+w‰v*ì*#? +Í…ÿ Ü Ùò0~蔇‘;€# ç<íóp× `ô™‡¹ï–HÙåA7k Ih œ_Èü¾Ά6ò •h¯F>ôb| ´#ÓËGÒLô¬ ßÏÇO‡b^ù”!qä̧á²%1[brì|èAŒÏ—=…]È“ó!ó»ÀQòj ô™·K‘_åcÕVÇK¬„/çc_þ°FŽ©…çæcí®N—r΀†ó±vOgA3ù˜ 9ö_ ½£€ uQý„C`W…˜ã1 ëRL‡T…˜Ñi`î-„ü¢Ç%GA«…ùS`±l—HÕS!d~X_+„Ì¢]ÿ*„œ¢§AŽœ beî†Î]2§u‰:èÀHôü40stA’#À,ÈàÂÎ.FæÉþ‰.ä–.Y͹ ÕQ`1,Ä©ŠšÅ©>VH¬”X¯qa_øpšl‹=×%3$ÜAE°„cÀØy´tèð\Lð< L„üÈMäÕtØ^ä(V¿ж ñ¼Ï¼Š ‹P ,Ån[©Ö+àSEJ´'È{k°E2†ANqµ5EVù6`2ð"øæ¥ÀYÈ6‹ ­j«ìyÙo X K¯D»RbµÄD³RèDЩóLN•ýÓ$6xê€ÂžK±~ÜŠj®:A„%î‚•Â’ßžÛùGˆ9cäN=¾ÿ° ;æp߬ÁŽ<» ÐÃXlpt~fz8àDÏ¥ˆ™erç§#"ûqȶȯÊdn_†Ør3°Db)ví2Ìú àT‰Óå˜P+ÌފܲLîzeȵŽwÂïÊ0£CÀݰ–rYŸ–ƒ×^`â@9ìü  ØËå>XÊŸgBžrÐ|8Ú.—ž^jOwcO©òW@?×ðå ìPŸód»YA$GÜž ¬mT íZ‰õ§c7©µ[…ŒÛà(Ú;O*Àñ(²1Ák¼ÔÒx9ßñr¾ãenY‰«/íÈÔ*e–U)wêJÈp Pä«•ÐçµÀ‰BŸ•˜{p,¡²N”8IöÔJœ,qŠÄz‰B?•²v«”ù^¥ÔU¥ÔU¥ŒQ•ê(pµ#ôV‰Yìî†%TaO ­VAæ ñ³ŠÒ°¦UØÍJ,ƒÍWaÝ?VÊöXN•ôý*Y#WAZÑS+q²Ä)ëÕ« ³hO—fÀ›ª ³ 3Q¥Šf‰S›*D !ÉNÈ_iŽ»å½oCÏÕr¯†œÇ€"nWK=Tcîïç@Õ¸÷)à.ØF5î=Nän;AfÈ ÏWÀ˜×ÈМmLÀ½‡€;á5¤uMÖUƒ»žŠÚ¶;×iàxÙ®”X-±NöO“í™Ðy hŠ{Å9a ¼`p'vÏPîîFÿDIs¢¤3QR˜yÞŠ‘åȉrä$)ÿ$™½O‚<'£á­“@á°N‚T¢])±ZbìoíYÐÒ$y–; ôÍ]°ÕI Œj¥U×ʬ»VZu-Æ¿V=YrŸ,µ7YzýdÐ<œ‰ñ“¥ö&cä1 ÐÞd©½ÉR{Sä½S°º#€Ù.B$™"Wa ¨}k1E®ÅIsФ9E®ÈIsФ9EÒ¬“^V'Ïßê@sPøWô¬:éYuÒ³ê¤gÕIϪ“žU'=«NzVô¬:éYuÒ³ê¤gÕÁ¢>Îí‰3auêP¬iô¬:éYuppü¨>GS¥„S¥lSe|›*ãÛTߦJ‹*½uªôÖ©Ò[§Êø6Ô¶wÉ{…ŸN“ѵ;Ú—@ÆÔƒþ< Ú¨ÑN€<õØÑSa?õˆ<¢§™R=ìD´Ëùëa-â®ñ²§Rޝ‚UÔÃfDÏè§r .%N’=µ'Kœ"±NÒ™*iNÃ\ê¡=Ñ/|¼>lWg"ÎÔÃÇEÏlxw=ì0 ¸–\/}¼^úøtÌ딬Ê€¢Jšù;Åž`‰ÄRO ° úœŽ}¬€5NÇ\ÖIœ*û§É¶ÈܦËJa:t~ (¬kº´®éÒ7§C’uÀ]ÐütH²Ò[áa3ä>5ò¤E<Ÿ!ãù pÿX!q¼ÄJ‰Õë$Î@Å1sOÎBž3³Žî”vA33Àë Ô'!ÈN¤4€Ë ð‘9»pù X'qªì3j^Ó Ïs0£“ÀÙXÁÐÔvaŽ  ÿ$°Bó3ÁåRù½Ž èðˆ_ %@Ã3a3'©˜ÝLÌK´EN5smQ/Ï”™ÕL¬¯?1a¦œÝLÃgb^¢½SŽßß™Žv`²Yàϯ7€‰ 3 ¼öËd{¼ÄJp™ÛcDõ4 ¶'p’ì©•8EbY/ÛÓå½ à+øã5–3Kjx–Ôð,©áÙòôc¶ô—Ùrïž yNË`᳡á#ÀJÙ2Ì–g³ÁKôO“ý ðÐÙ ¼¸ >>”‚Ÿúœú— Ï©Õ9˜é`‘ì/ƒ s°¦o+d{¼ÄJ‰ÕEf2ó=œ,qŠÄ:È3«/î­—=Ó!ÏÈ#îÚ…¹ÌZ ŸÚYßz ÷TÒ6¹âÛ¤¶Á—§K$–"ß ™Gž4`ª' X„H²WOËÏwBcÀñ²])ÛÕ²=Ùs;pŠÄ:Ù?Õs'pX„*ãt,‘Xê±'‚Î!ЯÎB¥#¿)V⃘±¢šü™Üh¡, Eþn"šÓý¿“œäûu.É„u’¯­à޾¶J±°o[Ø«|m¢é_ÛDºß×6£yÔ×¶“>ôµÅ7Ά¯í 3›}íP²r°øE¦fŧ åk3…ò3¾¶BÁ|È×V©€ßðµ5 U̾¶N9JŒ¯m"»Råk›éje¦¯m!·2p¯BÕ0_ÛAÁjš¯ŠþüŒù™Î‹š[V¶.Y´¸Ý™[\\<"/'§Ð9nI{[{kSã²ìñK[5·9ËšÚ–,ZîßÚÜÑ2Ò9véR§¼«ÍÙÚÔÖÔº¢iÁHÿÿ£U×´¨cicëÀçææË³œã›š—5µ·.™ïÌËÍõ\¶pQËüöö+ F8§6µ8ósœÀå0îòóÿ5×’6g£³½µqAÓ²ÆÖËÍ ÿµÿjÀÉ{9eÐ|ÊÄ¢^$Vº’Zi‰üÁi;úrapâ9BcâYˆ¾q¸Þ.zÚJMÔHâ˜u<Þ—âÕ‚×"Ðiø2\m“´–ãÓxŒn¦Œ‰Oc1z)ÞÏój“ŸÄMx_\€‘òç/èi”œ/GºÖ„;:$·Öï\oÆórÊ’üšÐ^l—\æ£/óÉýšËäOl[0¦Ïà^ Õqu*îoÁ{>æîôéÀõ âþïRt‚£˜‘øÜ.ûÅy—I™ÅÕfpü?¡Éÿ¯þ«ú½œ´cýß|(5´ ¯iƒûx Q®Dd¡ç ö@ïûê¢k ÆßC¿ÏsN»ºô½T­/£.­‚ºÔ7¨Ët'>÷R&þ üÿÔŽºÌéÁÔCÛLŸPµfò^Ӧ㾕t©z€†è«Ð6°WðAüûØ?üЦqx­SË÷qÚP§äÒmÚÅtâ×ÉûÝÇ'è>SÝ'úµNï}âå)ºOÍ¥¡ÜG™Z Ý©î$»)œ†¨ç(¯púññããÇÇ?>þy`ϨWó]¨,úxíU"#Ïû®\F7* -ª¨+Š¢)ªÚEÊöÉ䬸{üØš±¨‘œ_+¦p#œ°ÌU2/!zäÔIìÄŸ™,ò7öô¿)1{endstream endobj 328 0 obj 16288 endobj 329 0 obj 30780 endobj 219 0 obj <> endobj 331 0 obj <> stream xÚ]‘Ýj„0…ïóÓ‹ÂöÂú³«nA„ÅRêEÛem@“Ñ 5 1^ìÛ7fd HàcæL'÷wç&8 Õa°Œà‚³Z Ç zk5 «ú¹–£…ðloÐB?Ja¶èp%‹#·ù›O›¸¹Î§ZöŠ„ל­¹ÂοøÀÂ#ÐŒr€ÝWÕ8n­pBi!be {·Èyyo'„ð$^Üè_ãóªÏ1yàJà¬[ަ•²"rUBñâªd(Å¿~‘¬ëùwküxçÆ£(9–ž8Ñ“§Cæ)ÛåD¢#QJDºŒtiL„D QOD[rÚ’Ò–<õf7W«í5Ô[|1Æ¥ä“÷9¬ ŒoŸ£•^UþüF«endstream endobj 332 0 obj 283 endobj 330 0 obj <> /FontDescriptor 333 0 R /W [ 0[600.09765625]11[287.109375 287.109]70[476.07421875 577.148 519.043]76[262.20703125]81[527.83203125 562.012]87[240.234375 512.207] ] /BaseFont/GFEDCB+FuturaBk-Italic >> endobj 333 0 obj <> endobj 334 0 obj <> stream xÚíœ |”å•ÿÏyß™Ém’Ìä~gÈ$ä~™É„`È•¹‘„Ä!@æ"‚bÔj•Š·R/µÖ¢"´@5ª¨± ŠJ³.(Rë…ºêºKÕ¥Ô¶Tgþ¿çd2€ëþ÷ÙÏî?3ÎwžyÞç=ç<ç9ç¹¼ÌGb"²’–†9õÍÇoþŒˆPk_Ñ=°–¢)ß›ñݲbÕúåþæÏbð}Q-_»bõÇÑÿò"‘ßé–µý=kkBN܉ïŸi­«ú–v‡&„ßLZCd(]Û70øÒÜw~H~-QðÓK¯´Ý;íš)DSËqÿ¯Wöt/ûøÅKŽ%“Ò_ßÜTskæË¿À÷RÈ›² ÂbB+ˆRÛp=uéêîµ o¶?…âÕD¿¿¬§ÍÈ‘—{‰ò–%Ŭî¾r­q‹a;Ѽ+ÑÞ¶¦{uÏŠàð.|¿öüfåêÁ+Ó*¿ü+QãJ"ÿU šò ïrÝNÔq í—œ2›B´uúb[ˆñWDUCƒCýݶٗÕÚÔyÿŠŠKjóóÝäšøª“?id!öxPÖh¹ûnÃrã6”ý(Îe6\L¦‹Ùߦ(ïÅc§ ÈrìÔ±SùáÖ©Ö´©Ö©Ë ôå€ÿå‡î»ýBþrºß” [FÜEÚ'¦ §›]¡N& ް{ñ5«ÓiuB’”ò]É~þÓ³‚2ÍeìÔœþ3g9­æŒ€ŒÀì  ³¡‹»¸nOpsÝžðæÅmÏPÌg0Â3Vju”¶»vî°j;·m5o Þ²5t«åë+‡,‡Ãƒº¨‹Mš‘aÑ~éZI±ÝÇí“;ž›n -.¾¥|¦%4o|«ñôkî÷gKžjÄýÖõåwpÅ“‹ŸîæNÀSЇ~ÕH¿ns…ô="Ĭ Öoê—%“3Mv¶í&#:eÔÎõÂÒ¼¸nOä7w%x7=Æ»-»­»Ãv‡›ÔáÍÒîZo»k'Ú¦Cúa¿ƒ!ðN ûM³‡…_Ä%ÅÚ4GTXd„IËÌû»Ÿ­»ã™lKhQÑ&ôP+pÿî+ωòWøC¿ä@ûCœ~ýŒ;ÜÏ¢|£ç¤îÖOÐú‰+-Œ>’ƒ“#"§Û¬L–@¢h:zêEëDGO9eùÔæ SÏw¥Ú(Ó­™ñ™SòÉTlMÖÀ¬ÐtK±6#´Š«‚êBý¾>”6é¿l“ýzظ=Aï§+ŒƒÖ+3=¿#áÐ5Œ~¹œ’lòSCUThw ”’œ®ÔNE…Qº;¾ð檟ÆiÚ“w-øñÌøÊZ_ýB7¦rÛ¯ÓïÝ‘}ðá ØèëîËÉÜ•’òáÓ¡ié'9Q’C£›<'Ѧû0¾è†+AK‰K…ºHÊÎÑáô0˜JéÊ ähx!ïÔ„ÔgR2gg†LȈ̈J.¥b.2äЬö˜¢´Jžc­Š©H“‘’•ZnøŽ¡ÞhœðˆeÂ#“a‘.nI§ôI·üp€Öó†È Q¢·…ì {0þ‘„i‡ùPÈÁˆƒ‘£F[®Dƒa¿aÿá€áÀá aópðpÈ5áWGLÜ4œ0œ8œ4eÜ6>u¬†Ã¦s1¹>lCäŽðG"¶G;~0â¥Èð.žìfÉE,Ý4qJ¸Öà?/7Ó¡ùÍWì¸w۽ƒÜÙö =X˃³û{_VèHæeµFF &bé W’Y·:1=tZ03E[BƒÍºf²†˜ŒÑ!q–cÇ·éSù©/U«ÌMJåd-ËœZÂÅš3´’+µÚÀÔH{PIdeÔy P¤ ‹t:N:Gq“Î߯WÐ<¤š‡‚‡,ÛµíúÖ€­m7?ä]•¶Z·†m ?¤¿b>¥†\O ÷% ÊE~“~0˜/ÙÖa04µ_õ`bÍÃ÷l‹v>ºæšÍmåW÷j3¢rb/zá)w‰~àÖ––;nˆÍõÍa†Ûá +¥ÐŸ\Ö˜dóÔd=Ò<=5’B“È”*Ë÷dðç»Ø(mlÓ2mf[°-Äj³Ø¬¶0[¸-Âi‹²EÛblɶ¹Ø¥¹Ì®`Wˆ+ÔeqY]a®pW„+rv”+ÚS9Å•ìJ™öM™’*nJ¥ÔI7ulŒZ;0åŠäíAÅþ"Ùo½v~˜¬‹ŽŽŸ˜®®™²·k>·-eŒÆxL3…Œ…ŽYƬ*±Æ"ÆTbEÅŒ%¥¤ÉROæÉï_MH†MÉùÌŸt=™›Ž}¡?ªó#×ÝõaŒ¦=rý–øäî7N?1=òMNþtDFTPlÜðÏÞ{ý礼»Îî3~›ËW”‘cühšàïg2ê’Ál9öš¬_–¿xª0ÿk~™œçÍâ3™'Ù¯oðßM»µÝþìÜtÐp8(3C ‚#ÅQ^¤k}Ñ÷\ÿðuÑý=£&£ƒGÙ6Ë-­vÙ×Â6ÛËíSs²¿öÕfñ³í¡†=Áëmû=ž†6C¼±}1ažæ¿Ç–ròߺx2'»®¡Í¶gIe…Wjå’ Ô5µ¡¨¾¡õ•9´_»Ö幨­wev»Îê‹ï6vâc̰¸c™qñÝúâk í…ÆŽez‡ËÐ^¨·ÕµÕ[ õ–¦BcËY½Ígõ¦B½qáEÆF·¾ð"½Á­Ïsëõu›õø3ÔÍm7ÖmÖë®5Ì­M7Îm×çº µézMõFc[¯Þ¨WÕé•n½Â­Ï©Ðg»õYOë.·~ÑÓúL·^>£ÚX¾QŸQ­—>­;ܺݭ—¸õb·^ô´^èÖ `zÁY=?g³1ÿ¬ž—›dÌ;«ç&é9›õì³úô¬ÍÆéø3d¡]Öf=ëZCfFº1³KÏt2Òõig]Ïééi›égõô1CZj—1m³žv­!5%ݘڥ§º )ézòY}jt¡qêfÝße´Õ§œÕ“P‘tVOLØlLÄǘ!—6ë ×âãÒñ]z¼Ë—®ÇžÕcÐ4æ¬]¨GÕ##f#Ïê³ôp·æÖ­Ú2£õ¬n 0ZÜzh„ìÖÍgõ ·x·îïÖýܺɭ Ƴºa£®£½~Ôù¬Nøo?/»ñVžþ4ý?ÿ/QÎ|Éßøº¾üÏñ5Zƒvfâ¥wø^ï~ä{½o¼öÛ×·¯o_ÿµ/ì-Éóg"÷ô=ú†?-Û" ­t2‘LäGþ@Ø!™)˜B(û+…át3Gv(1رÇQ<%à4—DSp²žŠy([Å4¬¦QeRM§lÊ¡\Ê£|* B*¢b*!;9¨”œTF3¨œfÒEôl&fÑlšCTIUTM5TKs©ŽêiͧÔ@ ©‘š¨™Z¨•QµS-¦Nꢋ黴„ºéZJ˨‡–Ó ZI½t)]F«h5­¡>ZK—S? Ð Ñ´Žpঠt]MéÆNç:ºÞ¹n¤ïÓMt3m¢Ð-´™nÅìz;ÝAwÒi ýˆî¢»éœ[~L÷ÑO°—ü)=@?£­ô =DÓ6z„¶Ó£ôsÚA;é1Öé´‹vÓú%=AOÒí¥QÚGûéW8Ç=Mèz–ž£1zž~M/ЋtÑKô2¦WèUzŽÐohœþŽ^§£tŒÞ 7é8½E'è·ô6ýŽÞ¡wé=zŸN²lb?ú3®ü#}FŸÓŸè }AÿB§éìÏÈAl¦¯8˜<8¹…Ò'la+‡q8Gp$Gq4ý…c8–ã8žè,'rOÁ c*'Óï9…S9ÓygÐ8“³x:gsýýs9ó¹€ ¹ˆ‹¹„íì æRvr}Ä3¸œgòEäæï0±‹gál÷O<›çpWrWs ý•ky.×q=Ïãù¼€è^ÈÜÄÍÜ­ô)/â6nç^LbíéÄÖõbþ./án¾„—ò2î¡S¼œWðJú˜{ùR¾ŒWñj^Ã}¼–/ç~àAâ+x_Éëy_ÅWóF¾†‡ùZ¾Ž¯çïñ ô3¾‘¿Ï7ñͼ‰À·ðf¾•oãÛ龃ïäÒOx ÿˆïâ»ù¾—Ì÷ñOø~þ)?À?ã­ü ?Äó6~„·ó£üsÞÁ;ù1~œÁ»x7ïá_òü$ð^å}¼ŸÅOñÓ|€Ÿágù9ãçù×ü¿Èù¿ÄØ%ó+ü*¿ÆGø7<ÎǯóßóQ>Æoð›|œßâü[~›Çïð»ü¿Ï'ù÷üÿÈñÇüü ÿÿ3Ÿâ?ð§üÎÿ§ù|†ÿÄ_ðŸù/üW>Ëã/ù+v³éÏš¦éšA3j&ÍOó×´@-H3kÁZˆªY4«¦…kZ¤¥Ek1Z¬a~K}½ÿòÞk»—ö ®ì]#%¿žÉÏÕW–®\¿veÏóÚžþÞ¾eK{Ö öô-í[½º»{©úæ7«oEßšžËüf­î^Úß·Æ4ë’þž+z‚æ,íí_:´zùªž+ s–õ š*–v«Ë«ºVúUNÜeª”Z¿JïÍ•r³¡7UŸ“à_½´gYïªU݆ju¥æÜSí`ïªe=~µ^µ"À¯vB¼Ýä}õÊ„ú ê»— öø×{¯™æËwÓ|¹ê?ß[í·À+rˆ X°ì’U ½í'Å4IuPÓyÆ5O4ižlÒ2al‹Wr‹H6¶ô÷®YÐ2)߯eÂø Eç$,ZÖÛÓß3Ð;`j_Ñß ÿ¶Ÿ§¦Cî3t ~Ý^ÙÝŽèöÊZzÞp,U¾X6ዞ ÿ÷xïê™ð’Ôãõá ¯õA+Γ±BÃÊs~½ÞÖ—Mz|•Ò²jBËDÇüWMúaÍ„×L¸gͤÇû¼VôMx¼Ïçñ~ïÇDûþI18σM'› Mx|È+yhÂãCâñ!ŸÇ‡¼^ZwžÇ×ù<¾~ÂãëÏS³aÂãT{'TôzUôN¸p©½8ß8kÕڕ݆Ù=ƒÝÆên¤Œ±¢gÕ`·_åÚÞU}k ¸ WâbóJ” µ}(Öu¯]Û]}ɲnmÞ6HkëE,ö*áZC¯Þ¸²ÏØÔ»bu·ÞÜ=ä×2!JoXÙ«ÏÁ»a ×Ø-Z/QZWˆÖe¢µÇ«uƒÒª.ŠÖ^¥õ2ѺjBëš!íÊ^ †¨Ôû¡o@é3 ôA¨òª] •KñÆWcßêžÝÆ–‚’€î5}ƒ=«zzñ=¿ÈÑcì[Ó7<éQù(Α¢Ùëùâ‡H!@ùc⺷û_ZÎk¸@)•b¨·~RI`÷9ù=çËï™”ßë“ßw¾ü¡óå÷ùä›UóIáæÚó¾„]¨ÙŠ–=ô5âk-&ôw/ïí-ÈÏ/pøJ¥¾’s²T˜ï+øJ…¾R‘¯Tì+•øJv_ɧ£Ð§£Ð§£È§£È§£È§£È§£È§£È§£È§£È§£È§£È§£Ø§£Ø§£Ø§£Ø§£Ø§£Ø§£Ø§£Ø§£Ø§£Ø§£Ä'¥ÄwG‰OJ‰Ï»¯T2iKÁ9m%>%>%çtLØg/(*ñYo÷Ýk÷éµû¤Ø}Rì>)ŸŸ7>y_?>o8|:>Ÿ‡O‡Ã§£Ô§£Ô§£Ô§£Ô§£Ô§£Ô§£Ô§£Ô§£Ô§£Ô§ÃéÓáôépút8}:œ>NŸ§O‡sR^¾R±¯tNJ©¯Îg‹sÒ–Ÿ¶‚ü_Éî+Óá³Ï7‚(ûÆèœ¾^Ú •Cý}“ òKK14þÈè˰›1b²·—í~CkzóógåN7â½ïÇ »h¦á>œ¶ñÎ {´ Ã.c =NuŒ›bòÇYd m4ùO¼pJÙb*¹äÓ}/ýÀäËtŸÖCZ¦þ ¿CC¨Ÿ¤MÚ—8·Ý©_i‰Æçéq¿¹†ºÉdÆIé/~qNº—¶ŸŸxѽ¦DœÉ"pÞZ§ß§ïÒoĉk]:©]ÿç-\–çÁ[+É^þ«ï†–ÿ‰¢ýåÜùì{·Õ«Ïç+¾_åÞòÕñ€“þ]8…š¤½÷dºŒ™—ý7ùû?2ô¿Qÿþó¶Ä•×WljF?÷#~ˆ+¾þdƒô‰·i™7®ðMÝü™øõ›œŸÿ{?ù ÿüg¼åß{ö¡Åý>û úû ž|ôµçÃ5hs-^&|^ƒÏÛèNãvp ÷àœÿCí%í°öŽ~þ}³~‡þ ¾Cߣ?¯ÿÆ`6Dò %††NÃw w&ݘôG›nó³Ø"mq¶$[²-Ý–o+³Uض=>5jjòÔôd-Ù”š–™—œ”<=¹&yIrOÚ+Ÿþ¦y<Sbmå ¶³“ëy%,8 Þ‚7À‚Ûô;õ‡õú/õ_Øbˆ2ä솅†‹ w$ÝtÚ¦‰á¶[‚Í&8¿Á+,ˆõY°L,`Çóÿ#óòù¹àÁTì¶à=ï8¢¯Þþê·àщ«_=Š÷ȹÖï¿ÿþ#ï¿åûvãûwã}åû³O®|ÿµ÷.}oý»w¿ûл·½w3Ñ»ƒï^þîwßÍ{7ÿ·ŸYþ`|îÜüMWòõü#¾›Gm¤Y¼ï¼åçwŠZ¶V¡uàs9Þk´´ïk7k?ðæï÷µh·i?¤ãO»fâý¯êã*žŸAÄ~Œ¨¾ ñüSÄå6úÄöGˆö-ô)}†¿ñþâè­ôOôÏt Ñü ÄàKˆ^•Ww ³^En½Œ¨÷FåYdÚßKdîFÆ}‚ yCâs%gr4òçRäàeÈ¿UÈÀ­ÈÁË‘…*‡…ÈA.En@^…¼ñ òPEíu| 7 ;þÈyt†óé4П¸¾à"ú —П¹˜þÊvú;ÈÍeäáL\N_òLú qÆüÖÙÅžÅ_ÄFžÍ&Äž÷²?_Ê<‡èMâ ájEvs›¹’-\ËVžËáˆÖ0®ãžÇ‘<Ÿ£xÊaŽá…ÇMËÏÍœÀ-œÄ‹8‘[ÙÆí<…Ûx*wp2/æîäTîB^Ìéü]žÆKx:/£§9Ù˜Ë+8‡—#“ß÷æñ{Èéw½ÏÐð>ESÏÐFø‰óž£íE$ÝuÁ³·_ò“Þ§køwZ(ç“|‚ßò>{[³jáüÎÏÛ.xB¦hÍ …h&Íè}Ö寅i‘Z ÿVóCîvs/U³—-s׋2‹Ä|ùkÌ”?¦¤Ï1ë};û|;û|;û|;ûü×Ì>ÞVRÁáî@“ {ØTùU}väð<:=¯ƒeÂrÏ}`-ö¦Øgf‚‹°' ÀÞÒv`€föÁµŽô¼FyNÑžƒ`œçU0ÁsLõ¼:eß\&,÷| ¶ ;äÞì…ÍØO—€º´bWl–_ƒš±“žŠkជÀ÷U`”çq0Úóëã¸×Óîó,Ç Â‚½<Θ Ãaáå9F{N‚1žã êc8úø ˜¯†Ã3±8{˜=™`¨ûhA#ÈêÞ†{¦¨–»ÕA;R®FI}´0Æýë>Æ ãÝ'Á÷)0Q®ÞàÞ†“M¨çvÐâ¹´zn#Ð&vª«QžM`´gŒÁ¸DbDT›8©W# kŸá‡HJò< ï[=£`8zi»ÀHÏòCÓ=ê$…8Œ‚´0VZª¾GAÚ«`´Dê£2bõ ’ 9ÇÁHÏ­`´à<½Ñ ZÆy:A%!¶‚‰ž38±™qo ìy ÇÅ@Î~0Ò³ŒB¯cÄõs¶»Õ ϳ ŒCc íq0ñ {^Õ8ÆBÚ8îQ¿]UÒb!mŒBb!ís0q i¯ª3£§Œ÷àí8Œæ~Лã0š£`¸gT1i×Q‡Ñtƒ1ž‹ÁXD‚úÝêêêé•mqèiN¥¡ˆÏxÈùT¾Š‡œ{Á(x8V½ÆxžcaI¼ø<rŽª-ü“_C!-}ÌÃ=oƒJZ¤í£`¤u‚1ðs¤Ý Æy®ãENz32ò7QE4¨¼”ˆ{‚qÁ$äÈœG0«¤Rr-Ú‚œ¸S)q•JYÂdq*J¹XhGî¤"W‚¥žŸƒN)— Ë1'¤’ –§R2=•*EK•”«…5ÂZÌN©4WÊuð[*Õ‹ ó„ó¥f°A¸PØ(í›Df³”[¤~‘° Q‘ŠÙï)°ÞH¥Nø-'vÕ¯%¢q“´Ü!WGàçTÌpŸ§ 3b(fƒ4øÿu0rÒàS`–0Gjò=‚˜¯ÒàU¶Ãæ4øä~°Ôó)è„ü4øD±³bü Ú·ŠœERnÃ(¤ÁÂW)³~&Ššth?#?’?  ‹…jæL‡|uµq˜ V¡_éðª*+O¦Ã“GÀùR^ l”6ÍÂV‘°HÊÊcé°áç„ÖNƒö] êû4X¦cž†WˆôfAï« #’ïðg¼§¨b; ~SWÕxeÁ†Ávô% ZN€]X/¦CþIЊ^«gtfÐíÓq—*×ëaÕtÜõZ¨öÙh¯¨v*وŠa¦0K8]˜-Ìæ ‹„%B¥+½8:á·lد8ù› ûU}…´¬Öç Ûas6v÷f̆š#³Dl; ¦"×ràÕÓÐ_Áø-mŽ€x)-_Ó±²äbLo³ ¹YUS,´KËRÄO.¼zœ‰u4£| ¬ÀÜ’‹QV¬GTçb”ƒ …Ȉ\Œµ*·Âc¹k%¿ 1“‹Øë;=Íàô7vÕªš wjUÍ“ù>vÞf …vø*Þ[ª9?>¼,–{fƒÈ<ä‹’\ä!STM=ò4[±ÂäÁ¶`ü“ß^v`ý̓…ëÁž›ÀÏjp¯Ôïƒòaí šóeNΗ99*Ú¡7_â'_²¬íß-¯ܥʩˆ«´üTQZ€üUÜÛ Ñ~'hżTˆ–{Àø¹PfûBÜõ:è€? Ñ÷`™pzW\ÖÃ’BÈT\„\(D¿Î€‹áBX¥Ê›P_ÿŸCÝg@ vzE؇œ“<[@•ûEèãëà4ô«ˆ2„Y°³ˆ¦K9[˜'ÌÇ»~P틤¦DhÇ>¹6ŸKåjüP›w‚åØ_aÔ®«…5Èå"¬Ë€õÒf2·cw9Ø*v.‚‡‹0vO€ðLz§dv"þ‹%;Š© ^W§Ÿ00qU‚>­—ÄØ0V• G'ÁlÜ[ûU]Z:àÕØü1è”r™PžJ`óQ° ¹V›U¹ùU;UM›´ì„J0²ûàs»ìiíêœZÑÒ??¦£vXò˜ ìXÙUËB©/Ú±·´ËiΫƒNDˆV)ª3‹V}V k„È;Ö…Àf)«5×.;;,ÜCDÂ0q^­žKÁDÏ`ìÇÞD®¦#ö°SQ¾ª²ó¹¯X¼˜ 8 *–cµuÀª;Á*ä”V©rÜ[±pÈâ€êj ÎŒò-`vàäæ%`v›X«¬Ú!5Ob÷ë@†n÷b6p CG±–‡Â’Ru¶­ðX©x¸¾ ÖÂ'¥Ðû8O¸QŠÝâBar¼–¨²Ú)•BûëàbŒ—¾ú4ã儮頣ã”ݲS<æ” rBïå`:2Ô ) ‹…R÷–coì$üæ„—nk„µ°Ö){Q'<³lÁø:áUîÄ*é¤%8¿9áVðIì{ˆ±ø]YX&–‰…eba™XX&–‰…eba™XX&–‰…eðÕS ²°Ll+ÛÊĶ2ŒÝ)PÙV全²°L,,ƒÇ†Á6©é9KÄ*eg™ØY&v΀U§A+FDíÖKÀtÄÞ X2f£3`ª):$o*03`‰b½°Q؉9³}4êrô]ÅŸ±T-ÓÁDô·}ïS±^”CãM`–0YPªl—»ˆÞrدþ½YSí`%,,Ç|¥Ê5¹ÂzÌfåð‰’Óèi›¤¾YØæiU<—cüÜÓ\9|‚y‘|Ü‹+G$ŸÀºŠØž ûg€VÌ93e¥ž‰Ü ¬ÀŠ9Ú÷€õX‘gBãv° ~˜‰ˆ­;áó‹ÐÓ—ÀÌaöø,ÇœY!+¯z:¢v?V)«ýU…ìí+0·Ü– ˱jW ×§Á&a«´iƒ´ ôèmPí-+dÕ«À^ë8‚¼«@‚û-•r>­„® ó@%âü4¨ÖÁJY+!ùs°öTBæ«`'¼])™^ iO€û°¦T‰ýUðÏFЊ\®Â õ1X(evU°ó"öXبÂyD•[„­XMªäìV%óv4ªòæ“*h<ŒÝ˜ÒU-^ª–þVK«eoYƒ«Ï‚ìÔjd—U#+u l¸ TûÕøs#X&Tþ¬AßOuˆ„Øvœ'œ/5 „ …¡òOœÝjd¿W#¾ª_ÕÈU«ƒ›¤ò[ z±܇H¨Åš8 E¬ÖÂæ@Њù³–Ò0¦µXÍK„ˆùZŒûÇ`”ë9µ’ûµrF®…µªf°A¸P؈Y½6«r«HX„lª…ÍJN;f•Zê€þZROmj1K(KF`-¬U÷î“{ß„ŸçÊ >vÕ¼=Wü0}?vÂsqï.p/bc.î§:Ymëd‡\{¾¡_u°áØoÔáރದN¢«N¢«w=ª³m=V®“`µ”k„s…Rß,åvø¼2Õ½ê9a=²`?8‚Õ³’GÁ}¨Ÿ'2牜y"aìyT-çIËyÒr¾Ø?_vïóaÏqp²u>$¼VÁÂù°J•k„s…Rß&åxi¾<ËùJæ^Äê|È?B $ªÈ®{Dõ´? ª¨ní â½ÉúÈülGûñ^Z•÷Ä{ â½…rïBŒnh•²3ÉB……ö9¨Æb¡ŒÅB‘¹Pd.”Y(2ŠÌ…"³Q²¬Qž¿5Bæ~PåW£dV£dV£dV£dV£dV£dV£dV£dV£dV£dV£dV£dV#"êp‘”Û„íˆÆFXõ¨Æ´Q2«Q2«ÞîE5§¨I,lÛšd~k’ù­Iæ·&‰Ø&ÉÖ&ÉÖ&ÉÖ&™ßš m'¸WîUyÚ,³k V´3 mZ ÿbÐo´@‹*'ž¬hÁTÄO fUãÀN©q¢Ê•˜ù[-ê®j©©‘öµˆŠÄŒª©ƒZ`§Ò2O8_j„ …"§Id6£/-ðžªW9Þ‚Ûäj;æ™个YŒìnANGÉ-’ã-’ã­è×{r* Õ)©öƒNÏX&,÷Ôƒðg+zô9X…hlE_…MRß,eµsk•“B+|~TÑÕ*ÑÕ*¹Ù K¶€{áùVX²Ö ÃÉ:µö¤€j>_$óù"h?V «…5¹ÂFá"œ8¡ï‰`ö9‹ÐëxpD$ì…gA×iœOB±;m“iƒ–= Ê‘6é]´|6 ›¤Fõ¨M²¦Mžç´¡GÇÁÅÁ6ÈWÒö¢mÿ,€çÛ¡åùw3hõ¨ß%ÂÃ툙ã`*z׎~©²ÚSµ£/ª¬ÎËí²³jÇøªö­˜Ú¥wí2‡·£_ª<"í÷"w: Ñ†b·Ó]Èè: &ANt+¤\-¬–Äžj£NOˆ=ÅùR³@¸PØ(-[¤Ü*÷¶A¯Ò‚w'"§C<Ü!î/–§‹%_ËÚ½ö¼V ÂÃÃ/5RV6,–g‹¡KÕ7K}2t1$÷"ÇCòaè €?;! h&žNñj'zºtH}lèĘ«¤\-¬ÎªI'úû:Ø \(l„=}uo‹Ô´ÂžNØ£îÚ‹¾tžO© –lÕ¿àtÁUN„ ]Ø{<V » Q±ój—ÄO—ìaºä)\—ìº S]݇•ôbôâ=ЉQ¾{`ÅrDã&Œq3¨VÞMr2Ú„lÚªýÞNåÒ÷ÈßV°LXŽøìÌ­ž40Õ3t`öÁÕã`æðxi¬–r”çJ¹Ás+¸PØ(õMžÛÁfdÍü£ê[±OF`î…»Àxc9¢$tÂ#°öbÚ KâA«ÇL£bÕ¨X5*VŠU£bÕ¨X5*VŠU£bÕ¨X5*VŠU£bÕ¨X5*VŠU£bÕ¨X5*VŠU£bÕ¨X5*VÒ(Æhì1ƒV·܇šƒòlù öð‡ANáÛx°LXî±€ó ç äÏ;pºaùd?ùaOcÿW˜ eÒ›ôíø¦~'Ãé¾ßKÌ÷þRW1ß&Êê÷¸‹¼e³w—·l€´k¼e#ÅÐmÞ²‰Bi»·ì§vÿÞ²?Ùè¯Þ²…8Ö[¶’‰“½å0²p†úu¦!ßîçRo™)ŒyË™ù#oY§Ù|Ú[6M+ö–”¯5{Ë&JÒnð–ýèfí!oÙŸ\z–·l¡0ýRoÙJfýjo9ŒlúÍK3msúÖ®ïï]±rÐVàt:s óóKl³{û{ºWçUw¯ê^Û½¢oÀVÑ3лb­º¿ohm®mÖªU6¹kÀÖß3ÐÓEϲÜóþßnÝ«z—N~íë»Ì6Q“m«îé[Ý3Øß»ÔVXPàkï½¼zùеKs®(Î-¶5õ¬µåÛ`Ž}¢ÝìËr.”;y›­wÀÖmìï^Ö³º»ÿ2[ßòßþ¯Á¿Ñ•I•”AK)£>G~ƒºqØ+¿ND]fõÊQO6ñ*AÝl\”ß©öSu“zòZÏUx¯Å{ä  ]®ˆ¬5øVÖ}4„¹ø6 ­Wáóœ®ù¦îèÁçà2´¬’ß ¡¦[4_†½Ð èê…Õ_¿Ú‡×e(ß&[t÷àÊjpP4.E]!úVð ò/¼{µüRw-JƒxåÀ®bõ­š m->‹à›×;ö ä)i9ÿS{¿®Í*?¨«ƒÒJýVx5>û¥m¬ùðÿÿ­„ÿ½Qùz/Épýø_üÓp.Ã;‚þ?øÓÇéFÃt“aÝxbÕÿKìÂ?ƒ“î5 ÓM_¯çSt¿!ëÊ·ßþ}û÷íß·ßþýú§­SÐ7ð8iø« ¯¹ '>µKé{Úr] 2jšfÐõ­¤ín ÛÜÉ»«gÕÏRÿÛÜ¿i¦wßçߥe.!úÙ{DZRbò—ßïÓÿÄndendstream endobj 335 0 obj 11261 endobj 336 0 obj 23348 endobj 175 0 obj <> endobj 338 0 obj <> stream xÚ]“ÁŠÛ0ïþ õ°°=¤q¤'iÁ°¤”æÐvÙl?À‘嬡±ãò÷µ5f 5$0H~†¼‡O/ÇÕsÕâÊ|ÉÕk¼v·!ÄÕþGÙgëýáë¡mFµ~ºpŒ£ª›¶–;êÏM›m´ªš0.”¾Ãeyùx¿Žñrhë.ÛíÔúu:¼ŽÃ]=¦_üœ­ Ušö¬ïo}ÿ'^b;ª<+ UÅz4¹ü,/Q­Ÿ«ï]XMWÿ¼Ýû¨tâ ¡«âµ/CÊö³]>=…Ú}›ž"‹mõß¹5¼vªÃ{9Ì×7óõ<×U‘È$29$в†d  ôYh 9¨„> /FontDescriptor 340 0 R /W [ 0[600.09765625]16[330.078125]19[578.125 578.125 578.125 578.125 578.125 578.125 578.125 578.125 578.125 578.125 289.063]36[675.78125 553.223 601.074 645.996 487.793 462.891 738.77 673.828 253.906]47[401.85546875 835.938 758.789 782.227 527.832]53[558.10546875 525.879 451.172 660.156 639.16]68[564.94140625 564.941 420.898 564.941 500.977 303.223 562.012 540.039 252.93]79[238.76953125 801.758 540.039 547.852 564.941]85[367.1875 410.156 273.926 535.156 487.793 783.203 548.828 520.02] ] /BaseFont/GFEDCB+FuturaHv >> endobj 340 0 obj <> endobj 341 0 obj <> stream xÚí½ |”ÕÙ7|ν;o™ÉÂ$d!ÙW‚ I ²ƒ!,ʲ°Š[«¶hµµÖZÛF–@ E´¶õ%€˜ZQ´¶".E+µÖòX„{Þÿ93âÒöy¾ïù¾÷÷þ^çvþsæ¾Ï}]×¹¶ss‘PBˆHø°NŸÔ0«â޲LBhÎ/mno%¢Ã÷Yøn]ºbÃ’¿fÛ€ï‹ É ,i]ºòœð—#„äïÀõï´¶µ´¾b÷g„ä¢ÏÙ«57¸ ´Šœ„H¥­«Û;ÎLû÷s„”5bú墵þ¥[Ö¶2Y‹ûZÖÒ¼ø\Âòûñ½›ño˜5³ö®ŽÏÅ÷×F-CkŽv!uŸâzò¢•Í­Óßœÿ!õà¡ûæ–¶U/Žþ:!³qÙûéÊæõ­Ò2±€U¬¿UóÊà ݃„¬Ž<«–­ìXÿÛùš5„´ßEˆvEpfNþ~ú#B6}‚þ ”2拯àv³ü Bj:;:Ûšýµkýቼ ‹¦äæ $þ*-ˆ•ÐPm,Q”–È;ÐÖ_À(Õ¥Žje» ‘œ#§Îçë©ó§Îç:l‰¶”D[â‰\nc/¿§>¨1úq›’YÆÑ.á&ánÐ(8(x‰D¨d=u„ßšK§ì7Ìš²ß8ëº)û­³®›÷k"…á G ÔVR:Ÿ‚¬pÓ•—„ÚEõP'I‘Ö²6~-`S]ºT‹Ë•CD£"Úc¸H þ“óÖ ¹g–0ZJÒfr ©Žt&Åà7 èÊØNÙob¬ \œ çƒ#Ì?Ð6^,—*¥"m®6_7É\m­wNq÷š÷Xw:wºÍ9bŽ”#ç(9šmŽ.Ç’cͱåØs9Î×xq¼®ÜTf.¶Û ã<õBµT­­×7˜&Ø&8¢9aÈX@ÐBat’àrÚ òí)V2:‰Ø¬¤ ŸˆÓ¿ÛÞ¶õž5÷Ò4õ¥KŸ©¯ÒÌK—i¶¨ýˆfª/ügõ7tì_ÕÔjú4]Mo¦O« Ï0mš¢%2™0 ©’‘#‘*ÖS—ØÊòHÎåóPÕ1K*òÅjIÎÇ ãÄJQ «Ê4 ºQ¸naÝÜ,n”úEqA:µ%:Å4õuõMô%Y  ó&J*á¯y°•‡V|‚ËmÐz –·—¸—A¦Dìj ›ìÔ›½¬ŒÉrþò‘ó¬ÐWÓ*¡Fë) Ëa˜õU6jÈ1äËiä—ßUDs…bg‰+×UâÎuÉ!(¥ T‚š 5h ÚƒŽ 3è zºè¡K×¥ï2t»L]æµ6?Ó>óFÆqÁ……ݲ‰®Z…ÍÚºµî½t—Ðã1CŸ¡Ï8Hû…CÑãˆxHì77X¾NÚ&l;´kk]î]ôQÜ´S|TÚ©Ù©ÛmÜéØîÜéÚéîAàˆxDPŽ™ÍGl/:OºŽ¹GC°tJ¯¡E…©£“Wb!œÃír ¢&QÊ»l¦ê’©‹çÏ[¬þá“? }ûÅ-ô?„—î{bæ¼æÛnú„’·ŽÝ¯žQ?x÷|üÀ¨D_‡ÜC{Ÿ;µ½ºÜÒcéÁ-»bw$?ž²;µ/µ7m€“ú=ÇŽ$Mö0œÒè¤ä¢D§» ¿fʤ¶pöÒÈ×Pn/E“@¥2õŸœUÿFã;šWµoZŸ6zÅÊ…Óç,Ô© {ãå‹w®¾í!úø+—>yy^Ëê›Û×Rý gÜl G_9óï[žrÇ¿ÎâK@$i¥Âr¶‰ \To$£4¢Þ- Z"$¢UˆÙzªâÈå \,ÌOUœÏ·!²üIBª.UŸ¯—rH&Í¡9Oeá4fÌ1†ã>’ÃÙÙÌjÆ1ê´}…®VÔõ‘>Ú'ô‰}RŸ¦OÛ§ {ô}Æ>Óq: ¼ seÐ }©P¦+×Wë&é;u;èvaŸn—þ^Ô¾ ;®·1Ú¨<óIbRp@½Yœö°zöÊ á05>,˜…{¯´U_¦ÙwJ³.+f"|9:H ÀoœÓ¡­Š^ôx]ÖÄ8½Ot¹Üq£b\Ñ«3+n§Fe=­X_½`+ópOæ“…õómO™úÑ¥º’ÜIžÔ)’w>çÜ£¸Fáˆèá¹tGZL©fœös¥½ÒQé,Š©&54@§Iušzmƒ®A?ÑTg®ŽY#l–7k;ìkã÷Êû´;í;ãûíG\£²•ÑÎ$×è˜T¯ß;^)Ô”šs-¹V‰=בëÌuåÆä{s}¹±¹qÓÈR@®Qj4UÚ€v’n¢>`˜jšbš–€5` ØŽ€s‚+3ÑðbqµñÁøÚ„`B+i§­B‡Ôjl5µš;¼­ ðñø ® L÷V’˜”šV’@¯ºmš¶™ï)GTÏ®{îúÊ5·_ûÐÞÞ»&ß5¡æá“+gò'œ¡zªâõNiåņ̟}{ËŽ¼¼L1N½¨^6èÔ?p­…­a+‰'ƒØÑå}±lþv»c\öÔ¨P=ÁÎ5eÌk­G¸yìÜ0 ~â§~!Uã×û ~£ßä7g8“büqþxSŠ;:M|Î\ Ü\ 8"æªÏtåÄó)½ÞÕ7`tõ»x†|ƒ±¦4g¦ËïɈ¯+v»êÌ5Öç$Wƒ{Šg­sk‡kgÌÎøAÓQ× ûÏÑöá„Ì£>ÅÉ&ë¢B{ M¤\kbI×’å]·/i¹ŽV_?{V=}SEg¨ët9®÷¨…ž¹é®Û[Wm½gåëêë4ù÷›hÌ zâÊϽú ËÕ5ˆq¦3…´ ¢WvS‘ DÒXO:R6=!'!ßã›XŽ¢’V •b¥T)—)•J¥¦R[©«ÔW*•®JweL¥·ÒW[W_™P9ªÒ?>±2©xteVevåØÊœÈô"Eç-ŽÏM5#¦_0.LŽšâ¯KbSL0=˜Ì f³§Œ Ž æ´“NºÖгÎÛê]3¶=‡¥·>sŸ¥×ù˜»Ï³ÝÛãÛ¿{Ô¾”¾1{Òû2öföeíÊ2ž4 ™‡,ƒ¶£Ž“®!×û¤çDÊ@êPÚИéCC™›2ãRP”9£Ê‹³7ø:ãzÌ=¶^_oÜÎÔcœ‡œG\ýž1fÐÞ&ŽhG&ŸÂâ’±(’ ò¥ð\#m¸iy×­7-ߘÝßÞØž¸ÇFõt 8¼ý±GãÒÇûÊGMÔMóÕÄâ:½=ÂÍ>ËÛ.çãÞmè¾+¾gÔ€sÈ{Ôç h¸ð‡M¶DòG"R¸¸eôi›7׬Ùbµ®½…v©¯©o©ÐIÔNÅ;:ï¤X²R¾J8ýtõ§ ®ûCE;ðÒ­Ûܦ—Âë*¶îAüy±özMn£UGÜ¢Õ¯sûE—.ÁçŒDñaÍ®„Ãe»­,Z«/z‡k;÷DŽH\m̳Œ÷Ô“:Z'U&™jc6 ë¥õÚv= ¹Ã²Ñ¶ÖµÖ³)fÙK÷*}Ê>Mv§y1ô[<'c†büI$ɘOòSmƒ±ÁTÓàm“Úµ›-íöggÌvÒ‹Ûxumï‹í'ƒtÐ5è‰Cœ¦ *ýlÕ›˜ïöØÆ²åËáâ©çššÕê*ú3:»ë™éÁg¾ª†>|qӡ鳯N¦OÒ6º>Ÿ[¬>Q3E}ÿý êŸfÌa{ð± k 4»e¯Q-F‰H:I0ÙùŠ,B1­…M½%h™jÝH7jo±1?ß#öÊÆj¡ÆPo¬µÞ"´kZõë ¬»„]â^y—²[cæN pÛ³Õ;·=|z¦¾þÍ¿ÓrµA]¯ …ôú´(ý™.©îÏê÷ÔŠVmgöE<ˆ[x”°k½ŠäÜz/ÑÉ’FD…Ä ›>?,å©ó¹ŒÁð!n¹|ITÔlú2{ƒàEõ!õoj÷›;@wèêHVÀB¼ZÅ+¹‘™ˆzî-ùVÇaµú+aúÃ>)Ÿ€OÆQOÀo²‡"z±ðI¯76ì–ñF“Wò‡¤Ä‡'†È*ò|8ŽíáÊ{¬éÈ/øE¿1Åéwû=(î¼~Ÿ?Ögò“D!ÅãžÒ}¹àû²kÇs׎Ç1¼©S(LÂz¡SÛîzŒì–•{ŒÝƦ–m®AS¿ù¸å¸uÀvÂã,¥•´ÌPfïi õb<…C½yÝ,´IòíZÛZ{»sƒgcÌ6ÄAÜ£ßfêqöºú|}±ú~ãqÓQs¿õ¸=9R^G\Zòh˜K —†fåêu@=¬^O·ÑÊgiåuç*v=îÜów=‘£þP8,JêOÔkè1^âë}`ÏÂëÕÞ{OýàžûPŒqŸ‘>à>“° ^­^qKH™ш‚ldùò7oÅå n_¾ZÃJMZ0Ò}¤Ô—¯œgë+Á‰77ñ•{…¶pÞY xŽáeò¡ZßKv »¤Ýr¯f§v»¾[¿Óh˜"…©b4M®U‚J­&¨™ÂKÓ d#íTÖj6j×Ö{…ÝRܫݦÛkè1öbùNHGS1Ñ‘ˆ]éVOß«ݯ½W=ý ]Cê¡MÒÊϾÏÞŠöò–¦ L}t‡°KéÕ ‘t‹ùÃÊ ÍfH;¤³e9B¹P¤Ù ¬Õô ½šôˆ0¨a»é”Û ?¤¾~%‹›4aˆ¦Iöφ?ûe‰ìç*ÞÈ"°‰~—ÎÞÏ•ŒŠôÅýÜ«“×Wmþêa£Ô©mÓ¯1m°w9º<½´GèwIÉ=ÊNM·f¦üú^Ã.ó.ë.§'¼¬ˆ.*,•ÖJ[xý^éÚH»Ä.i£Ü¥lÐti»t Ì]–õÖͶ.FÚÙåÚNvÑn0èÆ„°S٫٫íÖ= Ãî0t»MÛÌÝ–ÖݶŽÎn×÷.O·gH’†ä!%¬¼!ËuÈ6dr 9‡\5_Þöd ?‘Îþý豿ÿýØÑ¿ÓRuŠúkS0ÑMÂñ¤(½EãÔwßzK}—ƽ¥îR é t>ŽÔB¦_–>ï9È—ì3Š>«Û¬ˆ6>ñ™$Áâ ›~xê OóÒiž¦\[¬ß@7é78zI\Ý-ôÁÌ}šÇ´|›Gßgè³?î"CtHˆ K?d`ƒò—iÊô,wV; ›ì;„½LôÃÈ ËåD¾Ûã—„¡[Öli§%êoÔ+™È$ó¨&Iy«ÚÕŠ›×¿¦†®ìV´%ÃcÚÌÇä"¼²Ë€zÑmÔéí˜Ï]–Ý :“›%›áÙÂ5ïy”á¹…Iº}‘R®+×WÆ9Ë\•®‰:6Åwè6èùN–¦Wû¨n§£×åÊÔ¥ëspŒ1äÒÙ®|¥ÔPi(sÞ¢Û`Ý&tËÝJ¦[Û«ƒÙûœÛ\ÇœCNßÈAÒD"+ÿ„‹·ßUUõ­oÒ;Õª`”ÝT¦–ß“*Wµ¨7´\Î_©T´¿ÿí¯Yx̦…Έ—©ÔHõÆ»“­>¢ã½>”ÑåNHÓ8¬É~Ÿ×$)Ä/xi|ó$¼î*³GwjDj@öÎ 83lÉ)BºœaɰfØRb’’R“5#6ÙÓxl¥áˆÄÖ·ÇXr,I™£3R ¬y¾ÂØÜØNaƒÔ¦é´®ót&u&·&o—W¶!»í°öÚóíKîI9. J¶c®þøã C ‰c,©É)©er…¦ØVá ×ç…ÉS5Ó|˜Q•µ®[}’w+;Q özóõ&ö&íNéM=F”A[¿ý˜óXÌ@ÜÉQ£‡·ZGlU¥E½îðÄŠžÇíÁâ÷’zù“ÞK¥ÏŽztÁ 7~£çàƒT~óΫ{Íôëßã>´îùÃ…M«_™Þ2ovýú¦–ßÜ;p¾eññqÓfŽß´Öe¼ù³sÙð7 © X$âUܘÊP6QQÒZÙº–GMþpv WZ®Aæ¤ êÆ’&ûe)ZQ‰wªP_Vÿ ¶KêgBx[7­A}Za•ê‚€Ó¢SˆÆè]VÛîZI±G“bþ'aïÎ äÖÑ©JîÃZ¬ö lzïÅ´1¼CÑgí³ P{Ð+ôHÌ,|aͳ‹Ò„·¬1ÿŸ†@©Ÿ [—lÙtÛ-´D˜§žTŸ¡Aš!î¿ûƒ‡ü‘ødäkÍt¾/µ%`–Eâ¦|‰‰RR3¼ÂÄ4‚PKG̶§Ò¤,9SÉQÊÉ5ô$^¸RKêé¡F¬–¦(kÉFqƒ´^îEZ…ân9>‘Œ’¤T¨¬„cªÎ—«H-Šò²IýyÙŽqðm*•ÓU½ú UOQµíß?ÅDs‡´‰çŒèt_›Ç‘_°¼ÔùbEŸGç³¹<±™FŸ‰£B¼6=ŸÏ«ëðʉÌ—ŠÌV_æ'zË-yÞ}öín¹P(ÑWy»Ån‰¥Šn¤Šn]·µÛÖmßîèvnwu»»==^Gøù/„âC·EÈÝÆÉ=5hïw k½ô Û4±ˆm]EüI§(Q$]×_¿ù–n¸•ŽRÏfÝ=HU‡n¸7‘Ž¢×mß¶~ý£ÛÔ-íuShÖ‡Òì©5íL/KøÞÃ\/˱ŸhwèDŸOçÃ,œåËp`Áá¶+„+&??\îXRÂó2äqR}L䛌ûÂ>‡"xo\¬5)&?fŸ¹cÝ;hÖ|a+Å)°Xv±ˆ`[¦vq< Í ž¥£øpè§ë}tÝúíÛרþvZM»òðå³µSÔW /ØNeÆšøÕ‘kbŸÎíÃâ#Ãç ÿkâõ‰ÞJS¥97&×{ ]/t m–Íž½ôá¨tLÛ¯ï7XÓŒX·˜ü¦"rµ´(2GÊŠb׈}ÈèsÈ b«Ô*³T­Ú6ã:K«­ÕÞêhu¶ºö ZÜf ™‘qdŸ*²"Žè¯D¬¿¢ö2æ’œKu+Ç¥ÝR±ág?ÜX7&1%ž&ÿõÏ4=Ì(ì^û ÇFc!bó'±>ˆpˆCl–'ãŸCØæR„$¯°à¿Iù< ÄjïˆPø\˜þIôݱÝqƒvñ¸û_Äí¿â(èÄ ÿùþ£xjÄÚmf¢c͉6—+6#Ao³¢1(„ïj" Ê®>½ðê‹#RÄW.A¿´k¹/ÑVIFngçÛ*ì•1S òg²=`ßH6(]¼úD fØdl³­±w8ºbXéõ8­Ûº×¾ÛÙëéñõıÒü¸p\OHCšCÆC¦CæC–ÃXƲ±—¤Û"þh¨4Â…Ý•žðÎy—Ü¡tÖ7Û»Fí6ìµõÚ÷:zݽž^o?*ýAéyëШ¦pîp%L"ŸtK<#öM…“Ž•S§®² ©xeškã´I+cÿXñößRÿB}C§©U˜¾¨­£y^J²eẪqíëºhÚÇoÓBõ·|¾óÂ)W*°øy ÖlpY´ŠÝgH¢[É4¤f"»(Ö±lª?Þù@“%gVÙåÆdè÷ézô½N©ë¤¨Â»yÞ*<œm»áfÝ.K¸Äq}Õãý'r¼ÑÍkĈ_µÊ0>Fh+iõô’ÄTÃ*ØÑE6¾Sëq…CÓV ¬|J}»«ëÀÁ˜q1–Xw ä)Q¸¬ŠÂyš}òE¹¬H3¨ïóx¼r:27!¢Ê3Ú}ñºÔ4Ñ7Zç‹wûì–˜Ññ®´Ìtµ§zyhúÓ#¡®Þe?šà0¿Ò¾26¿ôpÞž"$¦ä9òR¤Baªmª½*E‹é<Y÷H,Ví5÷Z·9z=û¶'7ZO8{ú“ŒkS>?Óí0õغãºã»¶êöoOìNêÝÜo:as}1Š­Jbôáùxúg¶?…ȇê%šÜvÝꦯŽíõÒ…#½ÅÖÜùøÈÉŽ²=@ñ#ä=ê*·ÉªDN´f²tìGSF-ÑG–B||ùü°we¥Ú‹m­®¹åpEÕgïs˜S4£ÍŶ…y\¿MÃ×¾¶ðÈlÃsšÛ%~¤¾SÝ0ó&6—¥ÿäæî‡…émK¹ûÊeÌagêõîG0ìA­/ É 4&!“H( ©•o˜ñøX½8ü’_N´$Úø´aYc{Ô¦£á_áŒ|dð}õmšài®®nfoñýA¸ÕÌcº w@"I<(d±Sѽœ€Ñ/¯‘»e±k[!<žDz“7„ïU´ð×$r"l3h‰¸ãœIÄ,'Žòf83í:§×B¥Ð¨ËF£¹V/ó„7e.óß!@¿6¶;c-ô×»ƒnqtl²¿0¶.ž?¸ ¤]Õ÷Èf3E_Bߨ>_b_R_²#ê§£¹[Æ1ühh§²;þ°g0æ˜ïXì q'ãµiÉþä’äÜä`òã±ýž|C¸p<îx¼‘ï©\µÚUó¹¸ùg3~Ñ;]_é?þÙ°wbu CÇI´†y¾õ—€Mô¹x•˜ÃÛé·wŽtš.g+éštk–-ÛžåHwê¢[eÿ,Ã~o›ô˜v¯¾×Ôkî±î²íqô8wºMÇÍÖ£ÎA×a÷óÛˆŸtiƒº:3Û¤¿ZRí!{i·¸]Ú.ïTvh¶#íÓï5ô˜öb>ØgÝëèvíu÷xú¼Ÿß‘03³GµCÖmCöC`6ä:ér—üƒçüü¡aì‹–Þþ%7wÑ$õôÙ·ÕS4ãݳ4~º¾û'›6ÿô‘®wÕ´ð½s4G=Éõ¸äÊyiad-²,g·è<®HÉ‚ÛãÊŒ‡C|¡è¶ž¹ Œ'Õýƒ’{JnKŠÄŠî”Ýÿ¤äŽ:€]œxÛBVrß°…&|±ä^»•Ü;Öñ’ûÊEhç%wħ%ŒÃFfbˆÅ¨—4Z*ù©%CŸ‰ð7hÑÙù&ŒmÄûøý%‡ßâ·úm“Mšlþ3¤1{Þ?ÁÀ%#SiÔOE© 6Ç·¶I7fË­®|QUO›M?~Tm/¼|ç ]xŸ:µœr¥—Év·%%IÔÅ9ˆÛaI’Ë’‘ª#^£# Nå%vcjtÇdÄoÛ^°¼Ù.á7¦›hɶg;2üÒWþÎ$•ûq*ŽˆÏÈ'ºñŽñqIPš¤›jŸê˜š¸1¾W»Ï¶>}œœ ƒ¶ÄãÉ'S\U “FMòo°Ýbï&Ûµ=¶}öÇ}޽±½ñGé€ù˜cÈñbò‹)lèøÜ¦GñÈM¶çáâs@Z¿wyaEõœïYÿÒS7Ú°¢Óê•Lè(‘5¢1ò£26!UÀº¹Oô™hd'?Rh¸FŒ\#F˜rLCä|H2 ™”«¥û­WÞ=êÙ5kè¨{†Ë¤jõ—a{Þ{¾'^€ŸÝ7¼âcû!™v ›c¾r?$®—vK»ä‹n”„}ÃÚ+G~Ì' ;ÑŽcxÒxLØ'í3ôšN'¤çŒ'LÚ5ŽGi¯ð˜ÜmÚc~ÔÑOËú†ã&#߈bÚ¹…"¾÷Úû¿DGMŸœIèóŸ}ð6„Ì+—4/iê#{'âÇB–,²H2#{'¶yrêˆíêîIU:IÓ$¿4FÉQÊH±X$•Èu¤F\GÖÒÂzq½´‹ôÐ=Ânq—´G$Ç„£âQ鸗,Éír/}^–‡wHb©ø±z¿úŽzøxá²]¼p¥KØB"2)Ó “‘|ð´¢5gJ”?WÑ„Ÿ«˜ˆbŠŠ‡ œ?Y©I!~’)¤ˆ)Kö©šl]Žn´>ÓXFÂÛëã±È©ÐVè*u®$tÅ¡¤iÒt~]²ÁoH1i ¹Óð3öø„×å&ö%òûÍR±R,Ó–éë„Z1(N2 ëéZy­¶Ó0 Ñ¬~s‘”§§¯#ÕBX£4èjŒkÉ:hh­´I^¯¬×¬×nÔuè×zõÇÉ1zL‚žIÊ€æ˜ö„qÈœþµ“!¬'ü§LS¬¾»gÔõ0pßs©Lh¼Òµu[Ù›ûgèSö;LèÎ@ÓƒV$’)ÞÒ+(áÉh=rêcö°ò.pÝùÓ…«¿ £M×¥ò‰'…4­_;žÈ#´ò¥PZ1––%ºÃ>²Óp‚<'Uú5ýú£c’˜+”2¡T[Žu´F¬ÖÔ붓dž«Wå1MŸ¶W÷¢/@lÙxR:)É'”!åÍæ¶“¯{A?¤?i2D~^Ë—MFn#(,HîN²Gè•w(j{ GÉ VÇå~­aªÇ˜wbþÝ£ë5¼ õCÆ“Úp­e`;vLÕTZ©þèõWÔnz·z?mø%]¨ÞCKÔAA¡ï³§Fj ËfÌ™éб†|3`S$ÄŒG«Qd‘Ê‘´ì×p‘Ÿr²°¹~¬˜-¥+šM))¡EB±T¬Ô“*Z÷¨–jä)šr/Ù‰°Ù'õʽJ¯†¹B,óålš,&*Éšq´XÈWj Ûn¬‘Ö(ÛÉnºƒ•Š#P&¾”~å¤úÜËê7è5/ ‰þ® Ùâ+WÖ w‘ƒá§‘$ËoÝ/¤Ô-Þ¸vžÿØüÄì¬/|õ[5þýdú~ÓÿÓ¡ÐôyR¬<¿·_LÑî—RFŸýGÏfgM™>Ï¿JuU„jõÂ*œ›9Mö §q¾º*›<-ÜÕ©bíd§\«Š“b*V«â¤‰›åIª8q³8!°Už ŠIÊùr`«¸Mª¼&U®œ/V¤kRÅñªXñKqÜ/ÅòKbiI–\ªŠ%Yb±*N–‹~)NóT1Ws~)ŽÝ,f«bÖ%1󒘑¾UÎÀÇ!)}Ì9}«˜~›4&-U³@ÒRÅÔ bJòV9å’˜rHJ½@NÞ*&߯¶÷åÑ ÄÑ))ULôN·Š~|ø·Š£ð1j«˜¿UN¸$&’âãÈñ[ÅøÛ¤¸ØT9nbSEúù¶ŠÞ bŒg«XsIôlÝ—D—s‚ìº$:'ˆU´«¢M­§lUE‹S4{d“*{DÃfQ¯Š:m–¬Í57‹Š*ʪ( ²ô (’ ²xIð!4ŠôΉäiºøŽ{hæ?z‘Ìÿ^ñá¿“ô/Žz~¼Kýô¼ðq†4FzN¶*Få!嵑‡¦á¿Dû+íû:·îU½VŸÀzýû†|ÃÛÆÏ™¾iú•Ùl^ò•ÇÇ–9–óÖµ¶BÛû2ûÓö ìpQòhû\VM.Õ]åÞç¾èyEj÷×Ç×Ç×Çÿžƒáä¡^$'ÉW¼„XL¿z‰D"2jV a¿ Ñce`D•f&bEen'¬\ÄM£I2Vd©$Œ!é$ƒd’,’MÆ’’Kò–J¤‘bRBJI)'ãHO®!•(8&‰d©"Õ¤†L&µ¤yl i SÉ4$Óɵd™If‘Ùd™Kæ‘ù¤‘\GšÈr=¹,$ÍäF²ˆ,&-X³.%ËÈrr¹™¬ +É*²š´’5¤´“ÒIP6’õdÙH6‘[Èfr+é"·‘-ävò òMrù¹“ÜEî&ß&ß![É=ä^ò]r¹Ÿ||Ÿ<@~@$?$‘‘‡ÉÉ#ä'ä§äg¤›"#Ÿ‹ä/äcòWª¥:ªGEf$W¨‰„¨™ZÈÔJmÔNÔI]ÔM=äSC½ÔGci¹Dã±¶…™$‹â·éhšLSh*M£cÈÐtšA3iÍ&ï’ÏèX,ìsiͧ´ÑbZB>¤¥´Œ–“?Òq´‚ާוVRBt¥äOt"D«h5­¡“i-ù;­£õt m Sé4¤ÓÉ;ôZ:ƒÎ¤³èl:‡\ sé<:Ÿ6ÒëÈ{ä2mBÙ|=½.¤ÍôFºˆ.¦-ä<]B—Òeä]No¢7Ót%]EWÓVº†¶ÑvÚA;éZºŽ®§èFº‰ÞB7Ó[i½n¡·ÓoÐo’ŸÑ;è·èô.z7ý6ýÝJï¡÷Òï’Òûèýô{äÇôûôúú ý!}ˆþˆ>LL¡?¡?¥?£ÝôQºn§;èNÚCwÑÝ´—î¡{é>ú}œöÑýôßèôçô}’¤Oѧé/è3ô—ôWô×ôYúïô=LŸ£ÏÓ#´ŸУô¤Çé ú=I_¤Cô7ô%ú[ú2=E_¡¯ÒÓô5ú:ý}ƒþžþ¾IÏзèYú6}‡¾Kߣ¤çèûôú'ú!=Oÿƒ^ ¦Ñ¿Ðé_é'ôoô"ýOú)ý;½D?£—éªÒÂkXA$AA#h  ‚Q0 fÁ"X›`‚Sp nÁ#Ä^iÚì†í’åKÛ[›µè:–-_Å[š–áÏ•á+íK:–mh]Ö²ÊØÚÒ¶|õâE-«:ZÚ ‹V¯\Ùܼˆ}ÓLX½tõª–›5V6/j[½J™pc[ËÚäEËÛu®\²¢e½4iñê¥jQ3»\Õ¾¢¹}™¦:|—RÍÏjª#7Wó›¥jÜ`˜|•‚vò¢–ÅËW¬h–&³+µW¯(uËW,nÑÔEÔqšº0yí”áû˜ ašuv´h"×”iü»2_ÕN‹œÖ#$ƒœ¤.¸øÆáŽ3"áþ3†ÉÌä§ 3G7+ÜeÖp—ÙaagG(Ïæ”åÙmËW-Õͦ¯™Þ0÷*%ÝÜÅË[ÚZÚ—·+ó—¶5C¿óG°iä÷I£¦9B»9¬ˆæ­E#̱ˆébqX-aý·Dîj ë¿…Qj‰èpiDzÃÒ4–2;,»zB³<Òûæa¯`\V„¹„¦]1¬‡Ua ® «gÕ°ÆWG¤XÖøê¨ÆÛ"áþmÃdÚÃo¡ŠŽp—Žá.awF(w†5ÞÉ5ÞÕxgDKëFh|]TãÂß0‚ÍÆ°Æ7²1.³Xa±<¬ÂEÅ…¹ò„­Ëš¥‰-Íòäf„Œ\Õ²¢£YSÝÚ¾|ÅêUR#.ˆÕ¸8kZRÝj4§4·¶6ÃEWÞ¸¸Y˜Ú)Lëæ-‡/.gÄ…éËÅËVË3—/]Ù,ÎjîÔÌ“§/[.NÂ{zûr¹™s½‘q]ʹ.æ\["\72®ìb纜q½™s]溪SX¿Æà,Å6ðkgüŽybØvFض‚å"¼ñU^½²ei³<;??¯H×¼juGËŠ–åøž[PÒ"w¬^µºÝ4¬QþMϕÛƈBø-Â:¦ðõÈðÃ_fè¬2¦¼i‰œf¢o¾J¿e$ý–aúË£ôW¤ß9’þê(}#ë>LÜX7â‹¥óóœmèÙò¹±:¿Ð#Ì¿yÉòåy¹¹y%ÑVi´U6ÜÊ϶ò¢­üh« Ú*Œ¶Š¢­âh+Ê#?Ê#?Ê£ Ê£ Ê£ Ê£ Ê£ Ê£ Ê£ Ê£ Ê£ Ê£ Ê£0Ê£0Ê£0Ê£0Ê£0Ê£0Ê£0Ê£0Ê£0Ê£0Ê£(J¥(zGQ”JQT‚âh«hX–¼«ÜŠ¢<Š¢<Š®òËWœWP•¾8zoq”oq”Jq”Jq”JIT‚’¨6J¢ôJ¢ã(‰j£$Ê£$Ê£$Ê£$Ê£$Ê£4Ê£4Ê£4Ê£4Ê£4Ê£4Ê£4Ê£4Ê£4Ê£4Ê£,Ê£,Ê£,Ê£,Ê£,Ê£,Ê£,Ê£l˜Žh«0ÚºJ¥4z.*KÙ°,yQny¹EÑVq´u•GT¾¨ÑŽÚèªÑQGûååÊ‹Ja-‚yéb22ò|qÇb©º³mµ¦sÕòÜÜ ¹µùhšª»Dzœ,“F¥=5¦‚Ï"¡Hz\®%H»Ä–q‰ŠÕY:Q‰ªhÃÖéä=åáðAñÂðoaqë!,÷³ûåèÏ5õŠ™æhº(‘‡œÕbmt«—‡±i'ìÑûûï%?¥)4–ÐZÚ‚µû÷„£Â ðñVñÛâVñ>ñQ±WÜ/_”Œ’KÊ‘Š¤ Ô$Ý ÝŸpGÂ_ý¢_ã×ù]~Ÿ?ÁŸäOõçúËýUþíþ}‰îĤÄÔ$!II²$Ù“\I¾¤„¤Ì¤Ú¤…I-)Ç?’>B!îS\ÒMÇÐbZFè2H0 ^ƒß„÷Š÷‹ÛÅ=⿉ÏIT2Kn)W*–®•®—îKøfÂÇ~Kàð³?fáç”}…6HàJ°˜K@C¡Ð;ôG°Ì±‘±B"V­x'âí#äÊW~|9|õÊ.¼\íýÖ[oí|ëµè·;ÞzïõoM<»ò­ÎÜtfÛ¾¹íÍïræ.BÞìxsÍ›7¼™ófîïþlýùßGDázz;}€>H Úˆ`¼cðNâñ ²„*¡ŸKð^%|Sø–p—ðíHü~Kø¶p¯ð=ò^­á÷—ÎûàÌŸ =¯¾þüøåò.|ûðöïcŽú3<ü‡ð÷çáGÿkí!"’óðæÇàƒGá½,®îCd@lƒWE¼ò"í·Ü3ûq B^áþ¹Œ¦Sâç&Äà͈¿ˆÀnÄàD!‹ÁND!{]Š(܈8Ü„¼ñ(âyíz#Žèø+Í!ŸÐ\ò1Í#£ùä"- ŸÒ"òŸ´ü“Ïh Qi9 Ñq˜q+Èe:ž\ŸQZIE @z •éDÌÿ˨†.§ZzÕÓITG^¥ZEÍt2µ :L´†i5µÒ:j£õÔoµÓ)¨&¦RFÝ4Èb˜ÆÐk©Î¤^:ƒÆÒY4ŽÎ¦ t.§s¨ŸÎ§£Pm$ÒFšD¯CÒD“éDàõ4•Þ€šd!ͤ‹É/i¢q,]Š:e "ù­HŸAL¿ÙûidgŒí‹ OŒØ{žôƒÏí§ýýydÇìWô÷‚…ž¦géëôµÈ.ׂMpÐ?|nís»^‚N° ’`AŽì_i;*#=ý Aì6Ó ºˆe/ÁÍsמÅú‘/ŸC¦üyŸ|„¬÷uöù:û|}¾Î>ÿ{²OøWqÄû ¡Òµpn=¼]CœêYT²É¨_u$;ô°$tXz XzXêŽç}êP¿êPsfç¢nÕ¡Î4 ûeª3´èB%l@œŒA­k ¾ÐGüw«ö×)xÏlŽeËQ@‡ÝÕˆšÙù«PY[PÝÁuÐþFÔÒ ¸ÏB¡Nõi ‡\öãBë€BgO†ÎŸ ýTœ!=Ðzèá£ñ…¾L&ì|>ên+)ƨ­ÐÀ¯€eËC'ãBýÀŠÐfàøÐËÀëBÏ›B„ž|ŽÐi “ÇFÜ!ö»ÃHhããµòGÀ¡=À'!§ Rõ`½>lÕ€¼ç€l/ÝÙ{?úBÛ€qßQçaua = ´„ÒV޶Ð( #Ôtªl¢žºÕ‹@;‰\œ ÉÎÄrŒãbw}34–³@r(ŸÚ0:hžºBGÙÊúq&Ìךϙæ] ù0.tkºa«L  ò»Aç"ЭºAç ¶JÂHÝ ó Ð ¯sƒN0zsƒÎ³°“>æ–2 z@á0Ð ^Xeއý+, ³¦÷^Æ…žÆÃWc@Á ´aD1ÐÒY Q èlºÑ3’œåÿ¦‡µ½ jû€±<Ôv€†ôB’l  ܽ öЩžºBÝ¡×7x‹tØy_h0rzAça`ÇBŽÅˆˆdÄæÝÀRpLF„> ,‡$ɈÍÕÀɼOü'™4À’ÉTŽ3øùYçqœ¯K&›0ºd¬“ añdr7ïÓ ŸOFÌÞ|2ôSàSð±èê  >“B’¡áä8;0‹°_gƒc ÷Hû2° tR çi`|)…g·¬áÙ]M!tÐ¥²\´q,åXj©èoN—T¬ù96ÁëÒ Õ³@2L¤z–ÿ3|=ÞÙðê4Èó°vOƒ<ìj9$OCf{Xq¥AK,§<ñ@ 494/“!ÃØå`>ÇBŽÅ°øP>,ã÷–‡ÎÇñóÇó{çóv#G6êtŒg4ÐZ ´…æ“‘ÒÁå`>ÇbÈ™úŸ«G餚O‡}_á«éœµgóö~×\ÞF^ç€ !UÆ•´€{8&s,†Ý3Àå ÓO×Oäÿ.p<²A·Z·Z¬ÀÚAŽ×rœÍqtž‘~lâ4@‡™àõ1ßí±«Ð'tX›õÉ‚X© œ ÄÇð3LCY afò3Yˆ”,Øô…œ“ GYÈ…¦ãUkùùÈœ ‹0œƒ *¾Çz²øe~ dz΃-Þ¦B’<îy¼ÒËã~˜Çý02¼¿±@“ù¸ë`2o§ñÚ( vÌÇ]',Þóy¤äC‡å¼ç8~Ë$ù¤ÏG­ÈîšÂÛÓ89Nçx-Ç™gsœËq¿ë:H˜ÏÇR{ZB±Ì§‘? ¡L€/@Î;€©ðí’Í1¼?“ÉÛY¼ÃÛ¹ˆ÷Xö `?Sı˜÷)áKù™rd‰Œ«X{ÀÖ's¬åXÿ/€ÅÍ 2Fìþ]àh¦?¼¾]ˆ œ}¡Ëbô‹0–€É¸Z„QœfpÌçÈf½"Hõ°¼Š óA`9¿·V(‚Tç€5{¤ºlà÷Îàgæñ{™&‹`åg€Or^OÁÛ‹!É( ËDÅÜ[Š¡ÏW€©è_ IÞæs,äÈ´TÌ3I1äùX†1ólY̵TÌso1<üe`¢¦<´`-á ¼¾ ŒÇ\_;ž&#BKÀ÷ `Ç,بÜY»þY‚Cwü¼Ù€a«×¡` ÇZäê2…sl€Ì%° kÏàÜg‡ÎÁ,YÍtçsI96!ÒK%ßÞP;ðçÀ¾%ˆMFí)HRб¼ d•M)Æò<0ÑQÊk€R>û—ò ¤”W ¥|Ö+…'œ†ô,–ñÊëÔ~eÐÉ3@j°2èd˜Í”æÃ@–‘Ê †ù 9– öË x`ôÊ ‡G€µ¨ˆÊà™ýÀÄ~ÆÎÎφ~Êø¨Ë0Òç !UFºÈFZß`ÔžBn/‡œFxH9ä¼h…Tås ËÅÐj9ä|˜ Žå¼r+‡œ ó9ÃWË!§È$,‡„€µ°i9lô°Sòö Ø®rþ 8³@9¤}Ø)‡´{Qå–CZ†Ob6/‡´TOVðÇ×,ãM£X=ßyf!Æñ|>ÚcXýŒƒ$'€ ðçqàþ+`2XÆþ,Ðjd¯¨àµ1t /ªÀ¨&CoàÂúgpÌÂX*À…µ‹¡í ŒÝd3W8.VCçÈ!¬]Ë)Ôó6“¡z`Wgð33C€³x{ÇùœòBÎ¥7Äžýk· øç+À'õðϳ˜-à‹5.üm<_އTG¥üL¼b<Ïãy5ßÎãWañÐÃOÉ5ãÇÀlŽeˆ¾k¸GTñÕP_IWA3ç€%°T²A°®B6X¬åýçƒc(3dµ_ê"v×Ny]÷ºjP~hC VƒæO,ÇVƒÂ`#GæÕõyà“­£>‡ÚÅ‚‘Öð¨¬Á¨=À1ðÌ$£€%ˆ²Hµ8…÷iÇÌM¬ä8›ãäçÌGì®yœNd¨´È2¶ÓÀd>öÉ|Œ“!áy`#GV×Õ¢Ï>¿æmˆˆZ¾R¨Å,í² §Rí–a6©…ÞžV„–°ç{àX šŒN#ÇëjùØëølRÇWuàrh…FZG96ñ{ò>XÁx«€O¡]ÏWõàrÈê‡z>¾z^çÔóº·ž½÷zO‚f=îuBãìÞ)âl6ìÈð:Äïlx5»z‘;©>…ö^}Í´Û€eX)ÌVw+B‹5õ¾.ž^ çpdž-½l‚†çÀKÏŸ„5ç²=T Wçò¨Ÿ‹œ’ d¿˜Ë+º¹œò\hÀdò\Îe.'ÞóyÏFŽM¼Ïd习ϲÒSðëyœþ<îQóÀå°3û<Aóx̓Oïåy<çñxœÇãq>äôYU6î²Úo>¬vÈl4Öam6Gχ„§LÛó¡vf.§3÷l‚žçV%Ï—2àSlù4r.œK#´a2^œW#¼‚!ãØÈuÒÈý¡‘ûC#÷‡Fîܹ'4Bv×lÞfò4B’sÀFäÆF.O#—§‘ËÓÈå¹’|dYâ:ÈsÈòÃu?]mNæX‹¨<-=œŽˆ;Í0œÁ¯ÎäíYüêlÞžÏ?À×_ø¾Ó^@D< l¸@Ú~ŒÙIžä»èѾ h Í&c=~’ ¬Bd„<'s¬…?„<»ÓQ+„< gð«3y{¿:›·ç Þ>yÙœ~Ïé!ÏãÀ&Ø÷ Žp„TOA’< -ä>…ŒÚz&˜•Z?Ÿ;PÝ£.í‡>ﲚ¡‘r8Òöƒ~·à…6±§>B,æM ¢@âÿ¯¶ÚD#ÜŒoì9h M>~NÄQ‡oá¶€;æFÚ"réõ‘¶„>"m™ÄÛ#m…hÉѶ¹k[¤­%~r&ÒfÏ“B‘¶h¨6Ò¶µ°__IìOsWàÝŠ÷RÐiG¿*\mç´VáÛdô^M:Ñc,¾M@ïø¼Ê«cw´às-p1zÖðgÙ8ÓŒëµ8?W–â ãÖö¥ëLžµCçØŽ+œÏ"œËLjò¾‚êJþ‹ºVôéÀ‘3…lWgâþV|`ôþˆŠ?GÝÿeŠ~pdcbß;øyö»½•\ê›qn58þOèòÿ-…ÿ®†×"eœdèÿùKØú'ò’ºI:Þoà]y+xOÄ»ïšÈ¹Za:éúGôäe¡‹ÒJ²I"ér&Y"ž#›Ääù|_L6 Zö7ì#ÿ³Ë²IÙO¬ŠŸÁ»Œý]iȱ÷‘4ñâ”kÉ9žým”ÿÚKºƒ¤à½D¼ž¦Hñ +‰WêB{Y"(ìo¼…_ô²D¹‰,aç¥Ã÷q|„ûkI¼GœR-¹Q<º¨Ta\‹CŸJéÄL¾~}ýúúõõëë×ׯÿK^˜óâFzVZy²ô!j~øS¸‰œ–hEÁ AÂÝDè›NüõÃwOžÐ0ë$ÿg‚âTôam“¾Ÿ9*àÿÿÕø ù_cóâÜendstream endobj 342 0 obj 17814 endobj 343 0 obj 31828 endobj 165 0 obj <> endobj 344 0 obj <> endobj 345 0 obj <> endobj 347 0 obj <> stream xÚí{ePd[³%îîNa 4îîîîîî^¸»»»;»;4îиK7Þèô½ßÓo^L¼ˆy¿&¦*"£vfîµs­³Î©úS$Š*tB¦Æfâö®tLôŒÜ!g+#[:a[S9U#ãŸ#"…ˆ³™‘«•ƒ½¨‘«7@ÃÌ md`æ01s³qr3³˜¸¸¸þ4ªË¹¹Yüéaæbbâ°°3²±þI¨D¨"Ž^ÎV–®53ÑþYþŽìGŽ¿#çß‘  jis°wpõr4û³ÓÙÑÁùï èÁ ÙÚ”ÿ‚r(›¹˜9»›™þKá¯ùV.#€«³‘©™‘³ ÀÁüÿçlfaåâjæü‡“•=ÀõOŸš @ñO{׿ìMªÿ¥`nneböwÒÌÖÅÌÃòÏFzD&&€©•‰+Àø–="Ã_rJÙ›;˜ÿ‘7usüך»™³ËŸsTÿ".õŸŒLìm½¦fæˆ ò®@õïbQ™PÿwûûBT¼þp±sHÙ›ü É¿”ù/õúŸ•ê¿!Ó?Sýÿíñ_ZãŸw³µ•7²û£ó?Tøcö¿<ÿ¿µÙYÙzýçÆîÑ0û…ÿj¿•‹¸•§™©¢•«‰%ÀÜèÿÈK¹ÙZ™Ù[Øšÿ‘R³75s¶µ²7Stp±ú‹ €Ž‰ñŸkª–V&6öf..¶”ÌþüO#ÿñÞß3ü§[ùïšØS˜ZÙ[T\ÿ\#gÓKü]V4²²wUýKPÆÇú{Íôïk9#Wg+O€ã_æýÓøçý¯Ÿôÿ:®•“›™”(€••…õ?lvðô¦cbçÐ1ÿ™ÿ=v —ï"`âæìüÇOß6ØýëÚÜêTffžf&p ²ú…"º™¦3 ¡b^V7?’dh¯Z_Õ»Ö,>YžQ²ÅöˆÆ‡.ƒ (\Ðó]°¿ñ­Ãƒ¥ëÉ`·—[´#×1«:÷/WŒäƈ”¢á¸…¦ÓçîÆž…–§qt„­/¸‹m¿¥·„|*GÊõn×Qµư&\”[£y½Óßþ@Ú"YøVÙÜ /Õ‡²S·õ]d7m±–òØfMš.| I®WüÑê0ŒØ3¯ë†l eÓ¹ÐópX´`Ò¬òèø¬ˆe霰´HE'Dxì¶w`#E:-v, ƒÇ²+-F)o0ó¿µ™…R¦ÃCWˆ‰Ÿ6)q‡ØÄÙ À€Í TìÐ.ŸIO»`{ì có¿‡`)öô6€_z;'ƒOMF—€Ñ–;'Å” -|{H¬†œZÜRˆ Íjåä2æŒô‘p@œ°iÉÙ™8êzÌù’Ê¡õn e=HNr*{†hè¼®ª ã§ÅqbíSV‚ Üõ}lA*vd®rh½'}Ë pÁ|¦žWyÐa<^{¢¸í11‡JÙ@ÊšÈ[a«Ÿyý`  Â«hQù™ÞU«°¾íR1àQͲr‡Ó~•Ü‘ð(9Èô¶^CÍ.a­¢UéfJÉK+úA>/P£ ¢ð–k¾JüëbP½£PŸÞšº °Ð¶î)Eû¸Þ €ÍÇSeòá‘¢‹:Œg¥n»$Š© õ½é;½^&í^ 2'‘{ ·äJ„‚“Ô´ºs›KÐÏxI¬$Ó­wrf©¨ªŸ’MrÊPI­æå=1âÖ)çïÉÂVÖ1$¨/=:ë<ͧö…ƒÇ¡KïÒœé¼Y„wá«õ&-„J8g^b»:XìK1Å|¦H;Ê‹^Ñp†˜Õž)–ì[^¼_.e—ßtÄÂ#þdgvz…1ß„´hëâ 6ðj ¥—©Œàûv´Ç丿¡zí Í ôKÖ"²Y¨æ®ØñÀÿÔvu]†c".¦nͰoh)x+‹vŽfqCûjç)<8rÍ È:«ŒSêŽ)L½ŒŒÞ j=ÁìJ¨6ÂMô£´ú+’“Åq²'¡ã xžú{ôF(ýJ(’¾f9‡»šsñ=;a߈† ]²£lö2M,„Ø¢Å&Qc ìÃ懧Nÿ2%ƒà­±Hçáä{boZ ‰T6)“űa˜:eÉÇH´‹Ý€T=âÏÑZ¦¸¸ÆµÛ(%™¹“ö„Á—Ó^è½ãÀQ²!ξ‘ÉÂá@{®öªæY±ËßÿeçLå#ö¶xV…²Î hœØKB¤™ÂWnʬeñÜÛ˜›¥Øs.¦å®äDñü=smS"ÞÕ3uÂ`ÀýÃNد£)@0“ý}¬™eՃǔ]7häìu]¹¹?ÔF°?ÇeÃ|™:‘Ü® ´D"m¡A6ÉÍ?9÷žKjF!í ï§í«Îjº6'tÙjƒJj!.k¤ÜÏþ³Álº,ÌsÄ ¯È\‚6•³ Ÿ¹oAMáæK¨ký@­ÄÙÛ¸ÖíÛAÒiOG½}^@2_Ÿ7DÔ‚R™ÓÛ1pY¢ë“§!Å’/NÜÑËÖÞIÐÅãÑЊ×»´†¾€æý°ÚAϰƒU7dhŸ•`¹¼xpH[,ð ^::¾¿¯{Ä·ª]^×9Ä y}þóÆ"m"àÅšAquƒ¯žmÝ|ÿõ§ºG‚m>DA)n/XQù@Ííir,1÷œˆ‘D‘Œ/ýWú¬OF·ŠéAt“cñ%ÕúŸd4íyLß¼ãÏŠ ß àcK”Ç'ŠóÜcK‘ãkʹ ¸ðØÇ´r d ƒ—O{æE*Žóé d~©ÛU`]ócÅdK¿½4nm¯Ü—|•LO­hâó N>‰Š¿Pèzŵç”vlŽ“S߬ð˜Ì½X:,‹Í—HqXäýñy=O…ÿuÇÉëzE&5€ÚÒŠìM²¯“,¬4EüGß&FJ~›æÁ*Ÿ pÉe‰¸Ãè÷š¿Ô ‚(Ž‚°Ê‰cì'ÓÒ:ÏWI²¨1M^÷1»Nñ§étË'ŠÄª³çŒþ±l+Sw9jyÙèF¤™ 8Ä ¾„"°2½­’¾¬ §gliƒ•“ð«3N9}^Í~—BÊÐr¿þÊÁ‡*àñŠoûàbßSçåzÁ‚ŒCÊù¬ m ¡´IVñDÒ`®p%»fÅÍ +üº³å¼P§·Õv.DpÒWôé¶cxá=‚F?,±öš°ó¾ W·ûª˜ÏÚ×–9ñƒråíÖií}7è)7þF+±A¹:A;Ûm°måE9 É´µ‰=’î[slh}ø;䕿‡Ù°“ÚÕë¦etÔe{×ôö¨ˆsÐb™|-½±¯ð)‚í'äóØ¢öHÚ~¶l¯òX9µÅ^Å«ZÝâõ¸‹fÓ:væ§Ôšgí0-¹Ò­¬‘7rUx¼]Ôùü²¾]㊠͇uti ý¹¢àbî6Šý5ò@ê¹.5¢kÜgTS©šI™×·ÌÏ ˆ¤ÁûC$ıAË}7¤*ÞÙIÚ™O?,Wàhó¡_–ª® óÖà(ïÞO~ŽG’>"ÔÀvŸõì GÊgÍ;ÑNóbsÝ/!—¿Çõv›-Xõð9aÓÂme¥5„¦#á’Òóú‹x!óûÙ aùSŒ?§À®*«yñÓCTñýùD¥±’˜n´V›ÕŠ Eè6àd7K!ñA'€É#|g ȵ5©˜å|øØ³›&p1ü[¬âŽ{æ±b–Û‹BFõ[y UÙ'ý«8³JLŽ ®F¶¡üÃL°·°Ù¢kãQ8²¡©6w šãÕ‘Ûû]=dzÿHœˆÏu@rα`‚Ýΰjí©d6Ù1#Áé,5iAÅŠ!%/QúlZ¤Ç§%eCÒ‡Ní.Ä5ƉNꈔò‘'âõƒgîUެ×$zh1PžN¯ E0(eñ„Ê  ƒ,*|T…:îóBŠÜ”[â×XŠ¿\1*¶¦wÀQWÓé 6™Iîlrð1œÐ01÷€Îk¿Ï‰lxÏšÑÿ ­"MR2Óux‚ôi±áëî4Ò³&ÜNz¦¶;=ŒÂÕ4 Tœ_˜nv7'"ʺз¢ËªÛ £U ?Pâbš$Iâú2ÜT±‹FôòìB1j½ÌЉéžÐ¥#q hÄïïÌÆ²ÓgÔÜzM£b¸{#Ûª¢!SôRRy”t+Qü-Rë¿YÖßì8šù»”å2º®¦ Mµ¿°ºE?a.e[÷«ã‚©=wð´ÒõÐWW ‹ß‰Q%ð„!Q²uŒÃ­Üܤܮåõú~Î` "q Å£p ž—ñÒå)9K§ï_—v‘)@ŠLsGZ.´-èF™s\Nç^›âH‚cóï#¢¿&ÿ&îHmõl7ß¾bø[j²b<àTbS uBU}ß`sa¤ ƒO¬7x˜ÅoW2f®¬¼i’ªP %ræ Û#Èè|}hÂv–—ôq¤=$¼…-ÌŒ_æ-ãªÖô7#{çh)nÑÞÀt(Må1åN¡½Çk¼£ÄW–'*m.Å&’3(ìÏëÛ?œŸÁ®WZPL%/çŸó÷‡÷ÂD’«Å»Ib‡æœ¬sëü%©8™‘±n³,Rî Þ•••i…A£.Ú±QôQkw~÷¥#ѵP›c ýå¢ç*,Gqò{IvÂRÆ"Nf_®Ÿ¼ú‘AÉùHvb…|ޏÍùã¹æFBŽZÈ HVNÂd,޾dáÖS†£CÀ^AyáÞ(;jÕ¸ÆõtÆ–ÇÝèØá\1›8OÛâÆð [õËït!™ùÉÚnü,\¢⯟€^YO‰›yÑ¿ ÎdÖ…Eø¬ÌJc^CCJ®° ¶¸€ê<ÉŽ‘JÂ(rØÔ{ïÉø² ZemFetÇ ]üðè*«PÛqr“¨¢-@®õËkCIx˜¾I';| µû~¡ÜÅËDÄ\SG%Ýß½ˆk nñü’éô2wP,™dTêd°2 9M~‰SlŽ }Ÿú´¦Ý¥Z÷à¥[áºýë炸¬Hð³:‚¯ì¬.¼zd ›†iFge|È•ßð¡.ä >õWoÚUÃCñЉ |KD¹?áÑ ÝŸãWìÙª±¿Æ[5fÚÁúº~Í®` Ö9F†&ºÀ´|‹èäxž{jI˱‘)¨é4ð~ÇÂâ¥giIT˜Y¦CeãšïSR£å.ލˆ*¸^øº„Ï ¸ÀŸJ'ff˜ðÈ uO4¨ä9¤¾Ñ6ö¦,˜ÿÆ—Ÿ¹L‚þðK3,ÓЋ·§Š äë—.Ÿ,‡‚\Ób„i¹N2}Fns¬Æ—@*séxŒ‹gÉ›=ÝÉxq%ù‹¤u(þvÕ:áÒá°B‘ qGñk~çN¸-+èÃftcë_•—0ô k!Ç~¼¯ÖÞ¼Ž¾¯Õ—¿Í ”™Ç¡…OâáIî‰pTNðr>xçÐxÐ Í·‰Ñz¤¡mDh†·Ø ™tB 0Î@ IQ¹ª»^Ÿ@:‘Ì{ß…R)ÑšÔ‚†1wCV:|_’[ðã-ÍP¨»mY_†¡½Ô£”Õ¦¿Ê¦í q³óaµLl AutHOs>;µ8©Â¶Ø¹E®5]e“ˆ Ÿ'H ( ¤(h° CÉE› ÓËò¤]ÎŒó&t±~3á_àçÞ²/<ޮċãí{Û|ñÕ<øtOï…óÆJvëÓ­\‚çW{¾“+¾üµõ¹ñÊÜSíÁï#2¨¥?žœÁd³Eiö¿·2žQB³.yäUüÎÇwæjà£ÃÚõ>?ö8æºÀq§(È㇚‘p±Ìå™#¹÷Hyj ÷½¨³ QN(ÆßVïcÐaz^ìØ  CÕ =hÉ Ùóp$_6Äx)dèôÅÓðVY#Y–•þÎFÛŒÊNÌàœ„%Õ4=¹®-äìü°Ãâ —ÄŽ¸yã㪇“fRV’&¸=0zˆsy' l£êÔd‡l®p¢râ8ñ=C_ÑêGRêÊwÂPÐ aùÏEúsžëÍ3eFV ­¼F2§±…HeW¡Ì@Ô’‘ñZ=åxíÈeæ €Cqj8²ëUf­8.oý¾Ú¿cäq¶+!áˆõÎ}ß¿†OIÊL1)f%«) E—õŒ±¿t6"éb˜DÃg­²³q{)‡ ×%u [Kv÷”ý>«‚M0[üÒ»ž~@Wˆ‚››4‹¿èI,`t²´®HNv†·ÈѸë@Ð2õCBitHgùYîíXC1;Wå¢ÜOê’˜=65“Ÿ%#ÌÀÏ-¶ñD®3ÒvØ…M¤G´ÄJ¨þÑdM‚ž*mÙoS¹}¡RŒ8Ü],A–ôÛM½…Oˆ¯9,Å‹ùNù• ³:üô¸X†ñÂ*a,ÊÿJ2¦— ‘úMÕðex’ªÍ:oÁG3j^{C_¥ÆÊ¾úhb?æã¥ŒäAù|: GæéIPZ†Î †ºãbZ,w…•úhC"ºŸRªŠ0R-fÂ…j€'— ÊUšjt6)Èè-c@ðÞ/æEø7|ofÇom™³N€ËÍ5qR_,ÞóG)ÚЃBÀõ¡œÈ~&<·ð`:ýFXB«Òs3ÆV›nÿ:–L™•M í> ŠLõH]Ì×+.ݽ} fgüÒÄÞãWXÕÐüÐDîAJzà´&mBÐöE™n~´ø÷øSJ0ÍqñCàìÎE
  • ŒÑÒ-ö6R{C’Ž=zß9¸þ2 Tâˆ;›µúôw&Ž–,Öõ·%Ÿ =ÛÒ˨wù°ŒÚZlh÷å*²•g߈1µT\XHß¾›Û”I‚»¢IƒüUÇZ·½ìBäÄSΖ« "®×¸æ²@å·Ô¼ÀQé¾'‡ (z=û:bÏ—Ÿ¢']-ƒ€9u^LV˜R›3ô¯ñb Ænr©##WâýñœÅh`›Î:=o½ŸS¢aóËTÃí„ ÍŒêK»+tt‰Ap„hi²ð×ÓÝÇs|½#LQ¾^Ë’Þ±œ°­ìÌ2°‰ç5æ)lq#óÑB0˜zë)ŠYáŸ2–ô~C.Òu˜;×ç,!ï]8äåp¢“òN_†¹âB«SMê¿‹yøòíÌ%š‹†|LÔfè*Ži&Nˆ‡SÆq9ßéRu½L¹Á÷ulkm«Ü4wŒwÜ–‰Ýz$ѾË>OkÄø}pÂ@€ø9÷éb ›ýãÎ ²Y|yôŸùPÛûNíœÙw­vrk)ñ@û;Ó”ì£Ô¢¼§c9. o¬•ó“øx*Á Î^ýÕ<·^ ¤¤¯xV  wUý$¤@HéÒ¹™FþaU?Ü»IÔ3"<%ÿK ¾¨ž¨ö¡¶ãÒÍýýf£þ·ïøb¯DtྑÌèÞg¶jûvdóù41 ã70Qf¿ß«Š ÆÖÒçëo²U⨅ž¹›’,Ð…æ„ãe:9þÚ\/‚ß*¸Ù7Û>È­âÈ“Aº¹âû'h¬sœý!h›wÎy¼æ H¶§@;:Qdº%u·9OÖ€0dR ÷ªœ›inÙ{5ö&ÓÈÅí$Æ“šÀeÛŽ„¹:5crá×¢] ˆ ]Q¼°™¥*¶T˜có´–õ­/-( ³®@GŽÛ ÕÛ†±GÖ4ƒù"õÇø>WoÞJTD4iXÏ-®jŸz›ÌÙý¤ÐrØÓ:îúýá~ºýd¨sRɈNêÒJjø“-YÃZÚ.,‰$À–N'#ȯT;£6¡’Õî\¾.M¨3iŽT¸%öqö‚ØßþºÛFô]nðÛ^ÍèÛTšd RоëvçžËê­þ~øG_Küµä䏸CA@N5ùJOæ>›L~š_jÂ>@Þ¢OL':;à9"È*]ÓÖaxLÞxB2¬þ|£É_1ÎÉÄŸ¯É Cvm°w~Mõ½ðS¸Õ¥7‡pŽœÐnµ Yæè1+¸]Í$ñ2cLDE" ÙÔ9À²ÌòÐF=$_¹ëû—Ñã¼ ke£HS·qœ|Mš½0ú™m~w><_Óxoñy1{gBLÅbô%}Ú§/luh ˬþÙ §~Pu”æåÒ.›ºDA#¼?òÈŒaH;gEQFæ…f$oKùç¨spóÜß5è±)í—­½…½Ý ßèà'õ ÉžŸì$Ú¡SO7O˦©!ñ%È'8³ ß ïžý+¿wôà  à{ÝèÆ•^<ÎÏa;' Ïãp)"`wxLSóÏSr¯Žñä+\¼s‚C-/Ó&©"šrÓT\~TB7úBXdñêÚ4l))nœÒeb6 YãÁ½¬¶ù`ævh¹ÔO#D¶f”j5nd^²¦‚,²K‰˜®ªÀ†ÎKÅò-õ‘Äskõvü‚^~§)~|î áLÖL³ß¸§ÇYˆ§4±a0[0ß´uDø}Œ‰pO9ƒ.ï´*ð…ÕRÙéq8¨/è{á­˜ÝÓ¤¬ù^,!5ë{1ȱCç¡™9íÐQÎðc€»Û“R2æ—Í—ÈGQ]q u±9¹Ç­¼óLòmMÅ-÷”‰ÜtŽ2wv éØ ’DtråãF– ?`­WñK‚EoZÔu;D›Í,ÕiqÄ¥îÉÀ©¨k^œ÷afÅ „²¸Dêþ3ÔÔô›ÈH—¶VÔ}‡¼SC²"KÙ×o7Ýky(6§|êþÇ“®¨²,Þµè9í.È ’£U_ˆ°Þª¥¤Q-çHdmcA+ñ­9‰¾4mLe–J«ÍEµÅÓs%\„XÅ - ~c|=d{÷¸&”Š!ñVPÊ·¤.|óÉ¢dSÂ]ìýñÑÙæÖɽL4}ªlψ}Þ`³÷‘‹³Ú} 1T+z©J½W­˜$éÿ²Òï稸‚!…Þ=(|¹ÌcîmÇß#â ,©aÃ줆E•BTX•úɯӜæébë=‚À‚Ù0ú±Í€È8ò‚Æù1\´»Uo†¢rl[6 9”™” I—¾ØqHœü|'V刼߉ÓsCžaIà= 袗߿UýqÅ}Ô†|ï G²œ˜¥÷EZŸ_‚‚Ée<+;÷a꣉-”àTó2¤¡:s‘ãÚ†×÷pF@^`´Ëˆcw¢*õ ç—WzQ(!Ž ãÃ÷6iKˆÝ¸¯GÑõ #•bç–>vë AqÖ¤œÑ5´,RÛh±ó^ Ô b ¬!âeSÛbAD¨Öå^㣡XûÉži?ꜻ±íh厯×~£‡rU‰KmxW•éÚ>”üÄï&VðE>.uÆø_¨©¾‹¡ºoj?FÏqÔ&7Ðÿf¨¼`Kgˆð“ÙÏÔ?UJS4«¿¶5#…Ü×n¿ABÚ¾R zóE ágΧ¡]Ç,yUc-¦MÃ}*+¢âr[㻋Ð1;:®Orlë‚ Gàzv8»M=Ò²P²¿^hqÒ7"?ºÌzzgt o(¬ HG²ø ì&=»ÖÜÇ0 1<‚Σ*Ž“†& ] f;ÙÉ•qÕié+ÿó5€[Ö& ßC‰© 7?;ÏF.íõõP:ÞþL¾ëË“©"©{9Ÿ#F”xçÞì3 Á¡§þK‚Ù„ëv8Î(°ö»)ͼzŠÐ%Q±.ÜuƒPs•ÙÒ ï¦?_ã¡tíw›yi¼»)^@î¸ š— ŽÝ´ä$Ãpß¡c©ÞÐ>.©Æé¸²õº”?¿7¸½mG¬÷Kg²Ç{zõ‚¿õÅÕ`AG „šU©´—ú+@.2:?w2×;´NÑ”õ³Ê»c檅gŽ1ü”t+¹¡çém0½`9rM,™ü ü8Ñ€ðäǧå•иM‰W¤—ô>¶Uâ&×¼ÁëüxòÛ]£á\‹t‹ÝSûçÖ›œ•߈ØÎ.µ(Õâ$RÉTÂ&Ïȉûy”Ÿ@ãz”j™òÄÑñ ‘Âth¼õ¬Å ×ï†:bMͼUÛ­ ê;JÊ»¡`BZráM Ÿh{,þ"«EEW¾Èšu~?jë—“íª¸hݺ^s\‡¬7R;†6•ˆ™-Yp W’¾2d®ÍêÈü‚f:*RS»Ñ·Ÿsüæ%¿±›¾ÏÒð-o\«Ðj]˜·¢öÑÿÎã½^®†ºì³r2ýÀ±±ÆQ%êû:ø;nýÆæ¶âyå«ßJœåÑtyzxR¨©“Øq‹¤èQÃë67ŹCíUE/“ÇeKÜËœ5L[¢`¬ÈæiåšžædÔ§Gp·Oâ(ó@PÇ:ľ}ª_€7Ö ~é U§(ˤM?~ u«Cþª.!8Ö”žº…Øåî:Ò_0zyyO<#“ó‡€6~xÙ$§§¬IÕáÓ¸©-胟Ý_pË4<-Çço¾ψoóK•Ä)iÿ.=Ã×(Ÿ-[àòŒG²nîÈäÏÒÑTíéG¥~zr¾ŽAeö[F‡uÅC]€nz¤&ŸÇé…Ø'o ?áxü^fG”lÔÁÀÆc„ú`) ®­A^+þƒ Âêxæìjê{Êœ[͘í€S7-<¼>Ä×Ín°†dµƒ´ˆ¬$‹˜|ܱÌ-w’}º:y2ŽÊ·Ÿ_²søêgoÃŒ¼·ðïΔQ㣎9$êËX‹C>¡¾S§É_§9¦nøÂ klÃv9PЮm¡ï#rL“¾Åua·V°1PPm«ÀQùÓ„CÏTÒh/ò*n$f˺Jñ¬öúUìŒ uLXØî7”¿ù–xoÂáÔ"؈  ݱìTc=±‹66vK5ÎE’ÜùûçXõb“ýP­f S¿YZcPê»™^G;_6zÓDð5ª¯tºÀe ŠÕ´ßÀ•Y¯²{œtô[6{N‹ÏtRÓÏôyÐ’YSÊbœYQ)ämth˜ªxPbìµ3W B…’²ùÙíb¼X2FGŽGîìÎC=7W‡ÅÒìü®Æ=õ¾ýV¨ ?Î’F,ô@ÑØœ’GÃ\&ÇÍ;™„ÁŽtIf!†F·öÌ:ÉT/ß{I•js€Ülù“ܪٴ$ dMŒ“R-ŠÆÆlDü?;½À¹Œ‘½MAaÅuH„Á˜G_Zì< 4ItzYÍŽ•ŠíekžvÚó¤iamº§Œ³W¸ÇüÐù|ëV¦•xEË5ˆê†m-ØUèLaÄêZÈjúà–Å÷¨>> stream xÚ]‘Mnƒ0…÷>ÅtQ)]P ù!‘,¤ˆ*jm£Ðì!E*¶eÈ"·ïØF©ÔÌ7š÷Ìðüøpª“½2-&ËggÍÕILª·Æ²´:¾u?AzrFÖ8A×kåf ´xé5ËrP½œæ.¼å0›ëÛ8ápÔaB@z¦á8¹,ŸXúáº^_`ñUÕÔ×Wkp@=ge ;:ˆvyo„t¯^LHú7ø¼Y„<ôYÜA…£m$ºF_ ÎK‡CÉP«³l-m'¿ÇD®HÊ9&VËÀTˆ×‘מÛÈ-ñ:L…‰MÔl¼f##Kω‹¨/¼¾XE^yŽÞÂ{‹mä­ç]ä]X~ÞÒÿ†ø‹¼:G‰…[™ø4z÷‹²ÆzWx~Øz‹endstream endobj 352 0 obj 299 endobj 166 0 obj <> endobj 354 0 obj <> stream xÚ]“ÁŠÛ0E÷þ uQ˜.RÛI,Y CJim‡ñôé954¶QœEþ¾ŽN˜B6$½wž¹þøá¥]=‡ñ(«ÍçB½Êe¼F/«ýw7eùþðå0ô³Ê_âè[™U×!>Ψ£œú!+×*ô~~Pzûóãr{»Ìr> ݘív*]6/s¼©§ÔñS–ÿŒAb?œÔÓ¯}»p{¦?r–aVEÖ4*H·Z\~¸³¨ü9|ýj9úoãí6‰Z'.qðcËä¼D7œ$ÛËjÔî벚L†ðßþFsíØùß.¦ã›åxQlË&Qm m!U… ä :BÈC•ëDUm¡5„K…K‰K…KI÷Šî5Ý53Ôt×T©=D•:@T©1ÓLTc¦u"[@t°%Ä|kÍ|OÍ|OÍ|–o¦ª¡bÃìkƒµÅÚ`m±6X[¬ ÖkƒµÃÚ`í°6X;¬MÁx$à‘{€ßcç¯1.‰L)O™»§­äýG˜Æé~+=¢(×Bendstream endobj 355 0 obj 395 endobj 353 0 obj <> /FontDescriptor 356 0 R /W [ 0[751.953125]3[777.83203125]5[722.16796875 831.055 605.957]9[833.0078125 833.008 389.16]14[605.95703125 1000]18[610.3515625]20[713.8671875 610.84 666.992]25[1000.0]138[500.0 610.84 443.848 610.84 500 389.16 555.664 610.84 333.008]149[333.0078125 889.16 610.84 556.152 610.84]155[389.16015625 443.848 333.008 610.84 555.664 833.008 500 556.152] ] /BaseFont/GFEDCB+PalatinoLinotype-Bold >> endobj 356 0 obj <> endobj 357 0 obj <> stream xÚ̽ |[ŵ?>gîÕv¯–«}ñ&K–¼È¶,É–mY¶o¼;Î'dsb'±³@ÇY aI$ [ÂÖ²hk0„%PZh ´¥PÒ×¥Òh )KcÿÏ\ÉY€ö½Ïÿý?¿ÿOΙ;3w™3gùž3#…!ÄIxÌú[›š[´7?r>!p !ÜÐäÙ-óhb„Uöú|Fã”Î%Yï]Nˆ:Ïã­³ç4ÜyõÜgñ¼“£¼¢gC?Ñà±ÝŒíúléSëý Ïï&¤ýí¾þkb‘½BãýU3šf··îŒVÇYö+ìóAÿ@o¿êè‘C„\ô^î¾`ݲX|ë{„\ù*¶^ÙÛ³ü5ówr»|ÙæÞW>:vÏñz®¥݆Ï~Uu!ß³Y1¥svÛäÐySù5{^ùJ¼å1C>!¯ã˜HÞ²5=ý ßjüÏâ{ôüÞµ… ÿ턜Ä{ÐÍ “f7_<÷Æßòv's[gLŸ=WýÒ)<ŸGHþÛkz.ê׫ ß#[ŽíÞµ=kz¯ ¥xŽô¨X¶rÍÆ‹8u7˜‹c²=7}v8zÙ=²•ÀùaÿnÂh/ká'„;ð0C>¡PX.„ ,Çá,ß Obù­!@“´ptýË_ѯ¥ÿä€G9ŽpÜN߀ó„ã›ø6,·óS±<ÿ –_ã_#”ËGù£Xÿ¦*Œoò7’MdÒB¦YdYL–“ ÈÙJv«ÈwÈäVr'¹ü$á*I¦d¦¥$Œi6ÉÁ´•´¥[9<H#žU‘f<ë$K ö+$EJm5¦x$Š%ÉÀ´ï@±%=«ñê&å¬ Ï HŒ”cß –=$€9%%ølJò±âHfc:‡ÌÅ>z<ÔéÆGÙx†ˆÄŒ5>¼ß2xz¼÷’!ò yмLÞEJ6ó-|+Òr2ßÁOAŠN!yØënò!‡ÈsäEò*Räò9 <èÁ>(ƒ*hi°–ð.+áF¸€8oÁ;ð¼¯â»ä¬`;8À .pãõ Y 9à…\¼›ò AÈGÎ(‚C ”BŸ(Ä *pvð8·ï¥r.+•«¿Ÿ>"_÷í9½ò9Eš ©þ³¯}{ŸÿïjSù÷ÿWïöïóît>+¤éAOçD‘SnÙ– HöŠÞóIÞ=×ÖZ˜b@Þb5<>?y·E©™AÎý4Užüµ¶äéÒ™«æž.­FNU#¯jqŒzbJ§Ê*ï§Å#µøâ¯Õi Oƒ˜|£7ŒŸüFoÀ÷g#çP'  $Èä,ㆠ)3©.¥›fôàØW­]çmXîeŸñôgƤ) eeÙEÒô‡?JSím…jŸ*T³±÷ljžã%ݳ¦Oõ’û:guxÉŽ¹í^RGÈø81*wÀ‡â»©Ò£p¼l‘þW=X»éßôÏ܃èþ›§ðl xí7zýësß@Ï2²²§o`X·vÓ²µŸ¥Û7lêß@vmØ´t¹vêµ}äÆž 6n ·®\µa#¹“љܷaͲ~ò}%¹`ÕŠòÄrÌÈ3+Yú3¥æÅåýkW BnUžÍ)“ÇžNÍÇRMz¶Yª;«,(©¨¤z%5(iŠ &%•”Ô¬ÜÕ¤ð>+Îhr|5ûdÔ¸ ÈRäÖ”åD=z;jÑï+Vãg e5¦ò>°(Åy°+õfpmª†Rõti:ïOç÷¦ó_¥rî;©Qò3R¹Ê“ÎóRíª–T®éNÝWwY*éüP*õé<ŠýÃw± ö!#߈š]ãw DѪÄá6´ºA˜·+ù|ø®’/€;•|!Ü«ä‹à>%_¬è##Ü‘î}Wª¾¥)é‚說¾;}õýé«P&ážtßÔö§ï;tV§Ëj8ßi>Þi!táÝÙŸ mYŽJ«p Å™F©†¹°D™ Á³Î)ëE Òõæl›‘–cv%…Ë`7žÞ†Oþ[*=˜¦Ò÷Óãþazœ¥Çùhz4C¥¤{?ü5* §¯I_ýøY4xä*Lß÷‰³z<ù/¨Äô'Âñþ('8²ïâ|0Ä¢‡Õp>Úê5°ÖA?¬‡Ø€vú]&H±3wY]°–ÀÂ)XE€n襰 m}/ôÁ X «˜d}ÛUxE)ƒjH@ $¡ê d˜ ÐMÐŒ¨¡Ú &CL©ˆ!¦Ã ˜ ³`6ÌNÄ›`3\ÁØ #²¸®‚«an†½ˆ1n‚kP¢€”¡^C®%×!ªÙC®'7àŒÝDn&{É>r â—ÛPBï ß%ßC¼sÊæ=(¯ûÉCˆh>üÖÑ‚§áÇ8æ?ÀÇð |ÿü_ä2ØÛárØW :Ú »`7\ß=§Gr=Üðd$€W»…& 7!œ‚<Þ‰hx¢Ôåd%"â~²‘\D.!ÛÉ•ˆ‹¯Å·¸Ÿ ذ/óðèÃc5kñX‡ÇUx0Tö&ÇðøHAÛ@ÐúÂïñÀ:øe¥Žß‡Çmx܃ÇˆÖø'ñx û»I™†˜ —œOÖà»ì&¿!oß“äïäSøÉŸ¨™ßÇ߯ßÃðOðOò‡Ò¸åùÆñ1ÔË£¼ZPb=é7½ ýFŸ*xà||ë¿ãÛQ°]è5Lçgð3ùYül¾“ŸÃÏåÏãçñóùüB~ßÅ/æ—ðÝ|¿”_Æ/ç{ù>~¿’_ůæÏç/à×ðkùu|?¿žà7ðùMüfþ"þB~ ¿•¿„¿”¿ŒßÆoç/çwðWðWò;ù]ünþjþ*~¿†¿–¿Žÿ¿‡¿ž¿¿‰¿™ß‹c»…¿Çw;ÿ]þ{üü]üÝ8Ú{ùýü}üýü€€ÿ>ÿþ‡ü0ÿÿ0RâþQþ ÿÿxŠ&üÓüøgøó?áŸåŸãÊÿŒÿ9˜žå_à_ä_âÁÿ’ÿÿ2ÿkþþUþ7üÅè3½Ó¤Î®ÿW"“OÈ_qÆ‘oÈg8Óÿ Ÿ£‹û%ùŠü“œ"cdY€‡~Œ Ô -è@½H蜀ÏàÈ!6²ûrãÿ/2÷ÿÙý ¼ü —¾· m¹Ç~/Ž‹Ùe«b˜‘ ê¶NDݨ?Yäá"ÈD °‡ÜYJ¾r”ü{«ä×€_Éo€€’ß n¼çàÁt/°¸ÁÈÆô{àÅôðazäaz30ôs“òù§Kå¬/+)ñ¦ÇUˆ†ñùä{<‹lDälÃ÷-@ë0 mÂRå*^u§R²³û+HD.v/jcØÇœªcñŒÛ 6ñÙÁYg¥/QŽþ‘îÅÊŸÁJ ÃêVÔÒ×2^ISr®¢ÍuŠ•‡¸» i—DäÝňb pü%J¾ j)Ô)¥R…a…e 5"ŒÌ.(ÖQEÀû¦ÞÄ¡ôp¦{ðh ”¦×*ù4fâUeˆý›ËÁ¨©QJKO—ÂÒw”Ò‡%~)¬øÛüpº¤Æ94£ÜÜŠÚdQ“Rô¡X|&:¾_õšê³Ÿ”rÒŽ|² // ‰‡Æ_•×`¡\léæð®ð¾0WSÙQI/šwÕ<úÔ(ñÔzh‰³ÖI£³æ‡âBUU _gpÇãóÍ--Þþ© M…©¥ó½j­–蓉Dƒi>Ì_XŸ3£*ܤt¥±<½5ÀÈ\“?'7ëÜñɳíÙº›p"ºâVÝny†Œ 3feÞÝá†ú†= \Ãv7Hn¯[vÏp÷»¯w?çÖ¸Ý]‹–t=ÜE»Ì–êp×úÃ]]‡¼Kúýá%‹»§N]ÒQ<9ìùýáÃÑÅ]ÒѮìԅ—Œ²ëFI8œíZÅ$±ØÑ¤‹ÒÑßF£‘²®.èêè…À¦Qû}ùñŠr¿OãWÆcQ§lÔî/§å•ñJ‡Óaµùs}å±Ü¨5˜Ì9Àôûì6'»2Èz±‹¬6µ&ÈÎbŽ|µF­‰Wª^+­êŽ–•µ\V¸Ùµ¹wǦºØ½·ûÞY2~fmÈ?u8?Ÿ&ó;–ÌìtôçŒíÚ\xYKYY´»2«Û´£wók!'d[jû‘£sæ’kr8ÏŒÚv‡£¼áÀo6,k¬‚ŽÀØy>›+ðÓüÏ?–””œúÌ´zí¾cpφr‡£½vÆÌªÆeN6>S^þLcKOOϾµ«MwcÑ˜Èø£j­êEN*IõÊ—'£ð§(¸£/Ei[´Ñ¢t[6ÇvÅŽÇ81Š@AÞ+‚Î"x¿èEôªÂ _,|«ðóBÕãùð~>\m‡÷­°Ë ÏU£ÑR$RÕGc± ‹E²F£Öhĺ#Ph  YµþòP‘-*ª:—ÉI£%«¸I’¼•¤hHo ¨ ÝÚ0ç’3UÀy‡¹lKeQ!G*Agª WN¯ÜVÉ›¹J¬«b (åúã¯V© t\UU™/phüùn—'® @î¬À{¯Þ ¨ø€-peàæÀ}•O°nò œ pÁÀÜ X}GCÇC'Cܵ¡ï†èÓ!¸(¡‹B/†¸‹àó"È-n¤-bd9ZûІŠèÔ"pAM!ø ß-¤´°¡ê6Â… òe¦h8JE>õ•%Êú©¯Ú·†"S‡Ùa©v‡‘·-Îê.äöõë×waÒµ~ ø×…<^L0 ²»‹õ?«¸¸‹Ô'Gë“SO:£žΨÙY¢t"Šä¯ßm, i/•cîR mR›””Ì1WØ GÊֳDz‡)Ï_O”g¯hï5ù••(/ùùìD£F9p8ö‰¦xÜ ñÊ ÜÄœÀqŽX”ãÔZÝ–ºS'œW™9sðúi·GÞ)‚ðTEὂ¸"|¨²j¾C-9îÜ:Ý©]G_žuŶ²\^P«…zQÅåÙÛ_§të5þ †ç«u“u \F¯›rÛW¹­:½oSý©O9îž/XÜnñøªÝªÛ‰—¼)ߨÎtdÆ3[2ù]CT›Ÿg@«þä†[Ýð[4Ë*øBsU0ª! ¾Ì‚? °B€-º—ttf^‚/€îÒÁ•<Äìvj·8M^Ðy³oä¬Ä ¨Þ`M,²`h³8oyÏ¥%4$I’¨““Œ>ã:ªÉÕ\pz¦™ óL=1Ú% õ§FC‹»PI-îÂâb¦ý˜’Š”6ì¤ç_Iu®— VH•ñܨөÖhü¨špˆYBÊG+U»K_ûêÔÉçæ¿} v|ö¡Á§ÕÕœöÒ¿ü}ì/'¯øŸ}¸o#\ôÐ/¡íç/Í7 >%ˆ[Â×ýjìó±;ží[Á¬Œ<~RݦڅV¬†<-_"P˜GÑé„ßBUâƒÄç NÅð †üð¾ö…†BT]í¨¦ý i5¥.:R®!èõyy‘¼™y—çñ"W&Ž‚•/¹!Ë5”‘;œ1œÅ†â7è†5–üKId›øÙ}™Ô’uÔœ4ŸšbÒÔãžN0r?q¢þø{–©¨0}×üSH¦°ëbF?ü€„ÚX*쉕ærF«| :™Š¼ËT—S®ÛSwWªNÎÊm«kê¯Ü^II¥Té­ät•¥e-e755yx2[šMÜìö›„!N=Ì[ü…7yìC.yN¦kØÃÍ™CŒr^Q¼SveÆ·uÞÕIŸí„ÎN¢ùƒãcIë6#1BýP2Y1T5,%à¹Ä« š yC¹ÏfA9$›g¿‚x™×qèᯣƹÆ3ó•fð£]GO ^òDR:±^:•”ŽÿE±î¡´Ò"õSGG=8§FëGOœb¦žò£ÒèaÔtÒh¨«>R†2@B ¶k¾oŸÍ€S£6QE”¹´Û±T·˜“©*“òÔ4›mΘ—5ÕÓ˜ùë©Â':ÎåÞן¡&Ñ æ4BB“øÓöóæ‹Ó#W,ÒK*¡N@eÔ(xgÖ6·×«®‚¼Q%è\Bí˜Ón<Ä”›xëÀ¹¯]Wè…«¬FI³êéWTFË&Aèïê½H'liTª±W®¸ØÉkŒ¥—ˆc Ô,¦¸iüJâí$Erñ“Á÷ƒÔl Ò¦ ¼äû­¾¨KO7ëA£oÕÓèá´>>öÏ ß=yEmAcÜHŸ0‚ËÐf *¡Y va“ð™À©uТ{Bw\wRÇ«½Îì¶j5¬RoQ_­æ Õ°=Û °]±ÌÆLšéBXTª®6Uæ éEV«4Ü Y½VªµZ­&Ó€.ï &>ïRÑ=ôœël`²-±$¶.FcÅÛd"Ç'’‰uT¬ÏèÃ# »œ:¼žñÊÑ®iµˆJ±¾ë„…©Æ“ÑÕh¡ð/¥Súq ”RŠëYi%Ù5›q>׋:1ÀÔ¤#­( x9µ=¥,™9›à!d §ºM¨³iÇûdìö±fØ}lwß·{šÎc“‚V]¼zàʱ;w×Ý|û?®ØŠ&ЛñQ¼á®EO ð…hª™3û2¸ÀÏŸ›çÏ Xæ½-Ö ]É¢â±w¯|hìÃ'RÕ²u™Õ’N¨xtÙËã_ªW«® ½d¯¼°é&³9žãÑ.çò†²òäs9–š©çq‘¡ª\ùð¬8GŠbÆÝ“lÛŠüÑ{Šº‹à"0ir4T7Msw«q›<·÷Óâ=‹i>·xÅâµ´¨¯èÑD™óœŠG½~@:™D¹<eÐa¢†‰\ÃHÙiãϤ)^QÌõiÛŽõWÚÎÕ¯ØÊð°"ŠÞÊŠoo3§ï¤^-,ûÍÑÅ‚ØgÊRbcÿsFJuË_}³K”ê´tvùíB]ªfõÓצT‹BÏëo/t+§;2¡kÔ¼6«í£¿ªTMKcãÙõÔ|–Œêšu©ÚûUªû¿­þÔÇéZ¶š4süQú+ÔÖ%ÊÊ~÷S$Œ:Z¬Õ0g)õ䨷2e–ó‚ñp8XZjÌ.¹'èPßÜ&‘µÛ´eLi²iAuùi'‰Ž|"®ú©'ÄE¥Ñzdþhý7&Âüï fú+Ýòß¼º\÷5Ú½Þ}5Ç~¦À­Æo%Ç‘N[µIÁYȳh§® Q²D®T—ÀñˆL¶2ê,¥–YZƬbrôSÑNÄpÈõåÐõ5[!ÿèÔ{$5XÅ(Zÿßéüs}Z§»F_ñ¯ÏOûl•}¶Âþº¥>3éß?­—™?þ'Í!ûØ*{y»ÍN‰M²•Ùdo²æXë­Ó­¼hjÈi !•‰9â­BNÂ*™s·Ô¾YKµ0©y’ܼÃdµ™šÛLÖIµ“j/wÙl®Ú—wÁQ×q ºö¹žptñ8]PéÓéû²sÛîrA— è.àÔ&ÐiL ”˜àRÓ ¥Ïš^1ÑÓBÓù&îbÓŸMt’ÉÅÕäYm9Úù\áUJp˜Ë³L‰¡õ⪇[k¸§l/ÙèÌ·m±Ýfã ¬°Ì +Hµ“lVÞä½ÛuS¸²àž0²·æîfÓ6¹cÁ=¦Ùàf/š½–††¿M·t)zå8:3‹ =V/§µK8ifžÎú%ëˆC 7Àôùvß­Mû*Ú´¯貓ê|| àëúº,pj çæs`þŸh&&VküÛGsHÑDi±9f]÷dcùükǾL3Ò†e6ž«ŽVÞµuan­ u·}\T°>ÿðÊsšÏQBô¾±Êà߯ú/ù1åÜS“¿MÖΑÀ)ƒƒ§V@Æ®úv-”’Ň“ >EjÆ?9˜•¯a¼¢·8ãÕFØb¼ÚHÅCãoÉ:£¹­œÞG)=4þ޼ÏæBP-B´~«öÕ Õ¬?™D|Àlö;5 KÈz®]]ÈJ¨U`ñžiòÙÇ+$ÞÿOx#9üCcï?’¬ÕyìEþÞ­_e/Ðá\ê¶‹ÂÕÏ¢-{ÏÌ®¸ô—teV?ù×ï3JÆ=—ƒSïûMj–¨Vl`,Ð(ž;½Jí5méT݆þV'ôËÒâm¡ùª¯^Ÿà;àpÇ‘ZÞÑÔA;pÒfxÛÚØÜÖzýmêV¶Æ[[ZO¶ò p5 ïƒ6®Å :«Ûú[+÷…®Ò×jmÅùš2}JÇô=:ѦӉ"›þ[Esbú”RXh”$¹Ð}CSÍPSݰÌÍÎ+Ê×.´¨Å}"½ZQr¸ÛnÖÁBFºHÿ¡ƒku +ÀZÚuóut‹DÝ”é|§Am†l“ìÛ¦O†É“;I@ P]àîìmår²äžr¨éÙÎW:©©³¾s]ç¶NÞÆuÎíì§åsÊÏÑ%èÊMpÁbâë:Ñ…¼`VÔ†¢*ºB]ˆ[½‚Œq8Í£–êjüb¡Ž©ŠþPôÆúHƒ‹Œ=Ø Xe@ãSœTif©Œ+ Pñ!þGÊD :vI…=•è‡ê6A“sµ/¶Ž÷}¾ÎâÒªØÜË’¢¥Â¿5K_Û:å–Žá™k–±_G«n¿ªÄYˆÊTjWÜù`N¶r2¯íy°&S»ô/§>ûï  §Î)Ziûd sî‰×²L i^4~„¿½‰xWþîyÕ ®už#åÁý0?æ:á +̵l¶ì²pŸkàsZ(´S8o´N:0‰¶ûæûVù¸}où¨Ç ƒŽÛßwpR8É•äy‡Ìïß•i… ŸÉ”Á)Ã-2$‰=Ù™¶ììÌD2¦îÏÜžIi¦%3šÉél™y™å™œ “¦ÌÎÌ›3U™Œ?£¾`[oæ¦Ì™g>ŸùFæg™š™ïgÒöL°eCE6$²akö÷³i¶ËéiËΠص,Øgp´iµj¢—ô^}·¾_ÿœ^-èí7¨­ù26åçú‹ÁTœSLÅâØ >3Û›L´ÿ\ÉQåe¹:ã¨ë×A½nºn‰Ž{VwL÷±Ž+*2„ ¨¡ÀÍåǾw¹v?ëæÜ—É2é&ý¨ÖØ8Ò„šMר»àlff §+td1ºÄȆsŒO„Ö›««‘e«‰ûaa Pý©ÃJ<(Äê™cÓ¥ð9ÊÂzVÃâxŒ£•Ø þ1”4 x>$¸KïºX€[ qçÇ+ÐN!öÓ.O^*~}v)Íó)–Wþø‹ÏÚ¹õÁ×~¡Ï0y]=«F§äŸ_±yì³Îmƒ7ÿáõ—J¬8MÎÔYówMkŸÉÞ]íU¯ï¿l]<ÚíØpDœU‹äÒ²ÁÖ)Û+3,…u‹Ÿyëö×…ᢼp®¯µqõ†8zefÁœ6‡iÄBÔˆ%ªÝh!î~ŠãôãÃR¡üP©å/ÔÂ-Ô´ÜMÉÉÛ“\c j*jzk6Õð®0ZÞkh¿ÏqcŸqŸ‘{ß&# ¡&iäêl÷yó|êáöz Ï3ê9ê9îáç{@ëASíÑ ÝPè®vSûOî/ÜÃú¢ tó]«\Ô% †6;ââ+|9uPW7Å–ƒ#¯xÎý¶í6Ú¢„\öØ€3ÙêmTPÙl¾)Ó¦ôSßÔo®4,Qyu˜é–8QݰZ%æ¿DQ&)ŒÞ¥Z¬GÓ;‹F@«OJK agÌY½[UÚ})ê&¼ˆ­_¯ xƒò˜ïÖ*mlît=D]á.s,Ì yhâƒRZ’r §0ÉI‰B}>eæ˜,qÁoz„L‹¡2ˆÿb°¦´žæ©tj>š\¯Þ5)7¹ Js[lÛùÕVÛØWù-Å7þê³̵‚øÈ ^Ñ’]VŸ)XsYpÊæ\ë¢>pöΩiôù9öŠ·ÒódÆø£Üo¸/IXù~@5¼(7Ø´YùñÑ|iN¶Ì°P“1ÇHõ*ƒ·¨8nðê¥øfû.û>;w›ýA;5@ä†zMëŒ|ÉžÇ%£gÚÏäšÍPiÞm¾ÅÌU³àr…)ããŒñ N—‘aujÊâ9XØ&F2"¡g‰¼.3÷–Z‰U²ŽXŸ³òNÎjõéãìÆÁl|{âêß+=À¢ö*“r9ç>ŸT]mªª*òÈ’³X×M">>KÊ¢YYe¦r¨%å ”ï43Á«&ðšd}Ç&uŽ:Œ †EµÂÎÂi¬e;ƒrøÞ`Q‘\\/’=9qR¦"˜¶®hO^´®h[Ñ+E¼©h:öñF®¨¦h%5%L}ç€JÅÝT<ŒÃS#¶L&ÙŠ2óQ»¤¬M‰8*+ÏSO¤Â1¤þöQ"1õhÄÉ™74êØ×\Í“l ‡‰Š‚,‘‡×³§¥O×/A6íµV¦,³b Ö4ÑüüÊô"´ÝƬ°mH ‚qr,Ê™¹ßˆkæLÓé~æDø»îÂeçCSg¬uZIÐÓ¨îŸí¯z¾³–S aì†û7\ØkS‹*•¸ëf3Owmþî¤Öê»â¹Þ.Þ¸y«¤YÑqG°óÚð-³T|ädÞì9Wq«¾:ÄV~¼ˆ·¨^#…¤bò41”¢j•CTªŽªTÄ?Su£ XÀé¨dwµ=`Ï’fN @Zy•×éIø½Þ„¿ÌîÀD²$ d4 f jD[¢‚å¹óx¨T×Pt²aÄÉÑÑ­ÑÁ(ÏE¬„‹FJÊÿdÈ;å?35-VG›¿¿d{ -¹%(‰%%¡N_Rd4šƒÇ@%ƒ!j.º’x}Ѳ)c¿@û†Ì*j®2÷RoõŒêOª¹³cOÒÔ㣞SÉÊïà+ØË\½˜)¸]±PýÉõ‡O LCeK¯4)J Bé(œê®fˆ¿èJi)†¼4ù– _AÑ=ñJ'µÛS³¬*Wà–Æ¬`2~ËÜ@²Ç¾¨¬6Þ¼³«Äª^U&¶ ³‡†- 6ý­«xl|÷@CmÌÙqåf¹–Ö?~eui“i’Ï Ý!AÝ_àêòŸT•ë('VжzýØàË«{;ž[xì¦Vp¬`]_E Æp]ÜK$¼ðáÇ?=žÌ8ŸeË¢¦]èì ‰œA(~/pЊË+ÜÙq­7+'ž §¹Ç½0ß ÚöZî+-´iá -lå{˜ÿ1Ouª<Ùl‹çùöqÑ:Gæ>ƒdñÍÞ©&j0pDríRPÚDÕuÍ ¾¤§gäJ”4ÊæåÄôífk(N))JÅø×§¤Š r€Ñ:µg#ÎHËí™eQ†ÇÂ\WñUWûËBwËõ=˯š/€AD›ÔÚâKÌ9ïÎîöË–µ9öëó³#}…ÃŒ&ó&A˜ïŸ6vâÅ ²}CkÆÏ l”“V0¥ê߯G¾O[eÆðʤ鯠… µ¯H3~z2F¯Îâ~ ÂHéøtÅYGjÑ•–NïØ®ãóg»½m?xm¦}ÅE•e“W.0h|ÒAxîç^gÐÓ„±Mm %±ÁGOlnkm¥Àq‚F£‰lÈ®›j2}ù…uY“ç:mÅU  {Ô\Z(ø%oŽÍûñØû™f^£àÈ3s]Òw¦÷¼²¼¢¤ Ôˆ¶· mï!´½™Ê·å ÉŸ7KY^æ||"›¼¸É™ã\çÜæä*+›½,wFübï5^êõ¢jÚâ€ùŽUMMZ“ØU‚=³-*4¨8™‘³M»GKMZÐîõùýnK¿Œú}GaÎ^·d*È) öÂBâÓî´›LY9YT—u¥Œ¢[Ï‘ª1b—íÔËÙ‹ì}”„ºC´;´=DqBÒ‘³Óu´iÒ‰hÊ~±YE1R–VGÑÿdKªKºBKR‹gÊ\*{¢Øô©ý)OÑ™2RRZaI(Lve¦ÐñÊ·óï,PÏ™¿§ûJWñ?ø¯/vºÿàÒåc_=ðHâæ©µ°…FÌ>cwS÷І¬e]cçŠï¬X= ƱO:ñÔ^‰~Íÿ‚Ó«Þ$­äyÙRëÊΛ9VÕ ‹—dDvˆÆ¸-™—¤$ y\•-6ß*„§A&BŠ"‹-Ε¤òª)¨niOà@–oØk7I†­<¯&oH°í É!D u¶8ËeG¶7^†uôÐ'! µ·u·ooŸØJ¶d”’Òèa†”ʼnS °€ä¨gê©#£Òó©M8iùÆ©I/A+DÔäû4viÂ+Ì?Û-4W¤Œ€²³†­­¥ä&%:œž§9e“75 ›.0:…=S²ŒZkö‚0yõ% B·ÓF5•vºùž,•MÌÑm©Ë(ªœ^¤zéüå–èü’Ý×jÅàѱDŽE¥á„Zã5,Õëòw@ó£À¡ÿ™c,Õ›Q%Ý^•7Ôd G¦ú¾‹{1h=™F«e»Î«7$ìRfvÜéÂÄ¢ufÄU,®Ü„°Rå ¶ÁÜü¾üÍùOäæ«®BspN¾•s§ó 缮ȿP½­¢=°èNtdÑÑ0¨âÌØèÍñ½ÓîŸFûª7WÓŠxsœ.ô€hÈ0P#gÒæh§k—hù,µžM_¡Nd^§>aÒçèÃzNäõM¹8Œ°Õ’7Er"TÏEþÒ$7±IÇwe¹¬C^!M ç”ÚÜüTí!ƒojâ ý·fÈ‚¹-#Ãý}ÛÓ¶_Ø8›K4¶Ùúë¶×]_ÇÕ}@ ¥B*˜ ¡°Ð=e/—iJä$ .—K| »¥ ¿#P%ë„xÕ΀}yñ€luć׫‡V}¸ÚßW;òl²…K>.¡×—Ü]B»K äz#r¶.¹Ó!OwñB6ç%²ìõÇeÙé‰Ë»ˆLd‡+n"ˆëÉ ²š:¦;úèôç,¢¥k Ù*'‰i#,ÜvIXÀŒqwh¢+(±'W=ª ¼ ž¡]Ôé'ÖÇB ‡N¤:§´Q.IÍ1åy&a±b“•~ŠN§`RHe#¹)¬‹gåŠVaVmµz1¥Aj3f¹ßg—bQ«â¹)†‚5ñ]cO}þÊ_óù¾ˆs°€‹¹jßúô—‡×Õ["Ëô¢x³áý•½¾x}{ÑÒœÛïVfõ>84|ïS¼Ý?ñV]}ïU7>Üü»±ÞqżUm–Þµ&‘äóÌÅÓ^ßÿÂy( œ¸B(‹~t^¾ÊWÓðêåqÚûÏ·ÇÆN\“©Jç¬íÝpÓZÅã_ð‡ ´COŠI𙬠0Ö™lmÄa*®å,!.Øñf‡÷€[\Ö0—a/> ‡Šã¡ñír­Þ7VŠ·$$├^'§sîVJ;ƒ9%ûƒ$¥œv§\×r虜I+i°5ˆ¶ ÖµÝÕöJÛ±6¾ë,;~ØÃ&G:9ŠÍáãŠ!FSë&žéÅ·è„gŽþi³­ìEuõ­¡+3C°gpû„›’öRøCÂÚ)-»ËÈâò" µ9»EaÉÁÓ JC ºá§?³sÂHÃô»¦ËZ!o®Ž5áØ–ÃŸN*Ÿµù—;òuz¦š4gi&˜þÚŽ€“Ùm{>£íã±ÿ¬º9£{Ú-æ×æ2ÇE@ •”®W""‰(yRy—ÅÕ¦e ›‹ƒ˜ÓtîDKüd8×–@8ÊÌpIÙƒÁvÀ²?¿} OއrOùÊÚ˜§7µˆŸÚÇ2züð„0ât¤—ªp>\ŶB1ó«ó#l)_©ê°~m¯EùYàéLlQï/¨—,¬¯[8x6©MZ¿¾ƒ¡$»!5cï©2å… å† ¾¼ÿ,êîÝó³<›ŠrB•hn0´Þ´p>ä&Ç~£'¸?ÉÀÂ…œÑX€dÈ7žC†ã‡¥OGÉé1³@õ×Öm¿Á[à®ÿ,”÷ßpÊØØØRbó5þ…úcîu²†žÂ“OdQoi#&ɄΪ Ùâ žNf9²GC­(´'ûàÊn8Ü}¤›nÒïÔ߯\ÏÿYÿ•ž²0Ëc.èH ·¿¸ì†Z¿{€—½™*Pµhn°w8ï¡ù=é{#|î ÌÄ Æø¨Ë cRo,»eùâùÊ÷Ê ÷†×Y‹.ÁÚ?údA܇š$¾ ½¦m¾=>jò-ñ­ó!¸ñ¡kóÉ_›ÏWXWÇî—ãtǽueu´®®pA|çT¹eî~ïT0MÅ»Mý£ÅÃúTèĸçÞ ÝC,Ø`ÙY(Ê~ij…ËnÜT¸ÓeÚK6mÛôð¦7ñÞM¯n¢]g¡J aÉý|Èu\Yý”ùcŸŽz¤S‡Yø0½¡/J¹i¡3}˜f"õGŸ:ìD» I G8cΨ9S¶º(NÚvqè,½¤læCÆO¯H|M5U*¦APÚ뛑÷sdHÃt—Ãy:Тh=v‘úc!qóÅåFI'NkìXŽ^¬Ún™.ê·\rûZQ¨wY´j fc¾¿zA…[Ç󼺲Jæ-O™%ô!g?Êç¢i$nök-Ð)Û•Íâ™õæäÆ©}Æ>eCωGsÛYv03«å²ènßì„>çf'µÿ»¼ËÝ>×Ît·Ï~Ü~ÒÎÝhºÏ ç[a:˜k­•ªW˜á{fXh¾Ø|™»Ã `£²|ÁõÀ¦‡ÇôÀë¡S]žŽÖÑѯt°J\­Ô¢ jTª;T_©x^•§¢«TÐGá—ôw”rÃôÇ”ª=Jtر—wdXöŠÒ;0y@çñh22ˆí Ñ@‰Å3LWÈ$ }TM¦¦ÎÈ‚éYpfþS“…R>iÊ$ŽÖŸHù¢JTíZ’ÞÓ9ЕZ­Wj– t¥6v„Ò¡¶»›…¤Ô>n%žf–Rî)ŸûÑÆ½Çÿúá†[¡~etìÏkú_8vMÐö"|2v祵 |ç Tý~õß¾xsì¶±Øm3Æöðì×x§Þá¯DÉ©%“Á.Ç´,|SÞ´ÆRã«át¼É®ŒÊ·Ë´@[¥¥JÔZ¤ÌœÆåö$Зø…Ü,Úq¯Ý‰hÁ$ÛhvI޶YI ›Õ£ê£jN£^¡¦b–õ€Ç1ìÊ M–&_×ÔÜ o½Ux¯ô@ä¡Xœ¢z«£-Þß°½6Ü’ˆIbCFCˆxêšãñr[¹¾yg0œ±?X§„r82Iì`qÊŒ)ŸLᾶí1ƒ†L[£ªNÉ_WLQÇ'b,У¸·Êvú³œ¨žCil¿>”ZTN‡7¿}©sb—ÞÙQŸøDÌ3µ;ò¼²Ø[î¬oXV³ð¼óDµ]ê…Ý?¼ì2Aè5 ”猫9“O?E‰êû"}Ÿ/(ßPÛpñÌ…köWfÒ¦‹ûgU»ÃùÞ±«KMZ¯ê-S«œA'X§'»î ÍÂà¤Àia í¨šøÉy~{JAï˜Ôý ²Úÿ‚ËÀy‘·ž"YˆŠQe¥p,¾®âá šSõÓ+ÖUp’ç€Õ9l·ç(z¨¸´žŸÎS^Íìk`hSß-–8Âó¨…½„zI™²#àöÃ^tÚúÉvò*y+´zB*LK*¨±´Ä¬¬ŸXìmfq§W.tïï÷n÷R╼eÞnïsÞW½Ÿx59œ·ÜÛKO¯KŸdfw4t˜íˆ…Ùš ][˜+wôTh´+&¥"xQe%ûº ‰OÃüÿN…¦àŠÂ³;"Ù¼HnºáÛôfݼÂÖ"nôÑâ*CS2ÐöaûŽ€ƒ×ýk}y¸­»€Q}áø®•{TУrݪÜç£oDé»±¿Å(ƒÊØ 1ú×?]lõ³Ò~‹’ˆ¦4âa ì ÜàÌ\ ŠŠŒ„ ‡'Þ-n_EY”°Àq¢(™ìp‡óGNvÖ;©É :ï´ÛwG#¶h4bwJ9Ô †D”Eë†X-‘EXr$ (¨¢öhE´7ÊgE¡8 b´&Ú½#Ê?…§¢/E匂:âˆÐ¬G@ŒÔD:"wD~ùQDZ1’™YYQyUÑHHÚË9B{s$»ÓšRýY­Ë(•uÆø¶Ò=¥w•r¥rޝ­ôx†”ïd|’AóÈy&_Žo:‚@ÞÄùˆ•X°Å8¯•s(!¼j‰^±³~lå¬'än&’Cê —Å‘JÔñŒ>*WΨ¤ëÏÒ lgÊú<”Ø^ü£J…t"”ªÅS(HmT9ÁÂÕi·¿kâÛbŠÎ é*®©¡ô®+e÷§™­–áN¯›)ßb;½Y%R6BÍ“Ýj3ÜGaG\íCIV uòá4–…Ì‹Ã(Ž]~>Û“œÚ{3ñmƒ‰¯Žžõí­Óûn¸Ö¿¾æ.QGUBžWÍœ·z†¯÷þª9«Ö>s÷j¨«E^¨¿hÚò9ÁµÄ;!qÏóIÓ¢Øe¢Øo[3·ma¶Áî/iÚyüEq©äiAh+™1¥nv¦Þ‘jTö~üÞ®ÊCùMeýç`¶?žÁ¨““™ß”JŒG­“³½q¬“âfcá­²+0ì;òAñF”È)6DÂÊê÷H6šýì`°(‚:Ž5‰ SÙ9R”ÃÎ ò#ñ:ÌÖ{3\^C™2(t·áUoç QC/Ý»+öpŒ;½é&yxê{l=n"Œ…¾‡[zYù²k¯GÏò×!Âê\õSÇ<§Þ8Jo ^Â\êÀ„}BÂVVVø‘Ä)%‡Ô3?Z£IÅeýÌ€1[Do×äÕE¢× €Ë¨(µ–`‰SÛÑ5Ç£Wér×L«¼ª¶¼0q…ÖWU*Íô—VÎÿøKªó˜ô®LëUs–¸E¶K–kÄMÂØðþ¬¢ráH‘à#ˆ›•ßë“sdZ• —!ñ ©M²+#n,@NLP¥Ò¥vÓˆ‰öH´2Ôµ5$#é š€ð‚[ ïUxTe=”hÉ‘L­9­Ï¶rºÖVkKK]Æ~«×¿ÓJP#Ü­,Ñ«gXA£›øÆW¹¿t§\Ó¼¿®N®JÄëäÒ2Lñºöº•ÔÚfEäÐëÚïj¥ýXûYÐ=”ò攥"$ó󇯕ŽO 9R?šTbã'ê?ž@·ŽÅ&f%%i(¯ö§Ö‰R!¯G8ìéù7Á0óûòswxµÚò“&ïþ.ÏŒQ & Õ﨟VSÅQ“ëDñ'ÏÛ zµÑ5C<õŒJP©´³&çosß4h^Û>ê=c”†®ûùÕÑd]4*GôûÎ4ìûÞØèë™F^£¸C_±ßŽqÌ/æFHÊ[vúî÷=îãÊUðæ +z\CÚ'´4‡í4„=ů+抋’:{<^ÞœDÎðç®RëljµÎïõ¼» ‚Í`L:0©üo@­Ò ™EÀYÈî’g;MWm}ÜÀ4":þ,—›,¶¸ÎksÇÿ¬þ Õ[ ð¾újšPOVÓÉê­j*`2¨¾]ý¥Ze ]Šz ç÷ÛØ×¨mbG£)š¥^.ÊvBFË£«©-f[A¥ro9]R¾®œžÅJ‘gujŸÿ€ò¥å”%pÕÇNï Š9« |ã+È Žïb_>f‹Œ˜ °¯è+Ó~ØfŸ`>ýúT—V‡“qIù™z~±Pk5T>+Ly¸ªaÕäÜ # Š‹¾ýÛ÷v¶L(‚íx‹)»ÝÎ4©÷ˆ5^gN o£É”qßš{/ðÝË™tÒM¹Á;S§=vh(N+¶|âÎꃌ¥•¾%¢¾cçÒY"·Z †ÜÎåŒÝW_zØ0vlìd§¶)?Aõ³m&NTD#©3:íÁ±u$OE"n=â1-5ÅãcÜï¸WH-dûaV9¨CÂz‡XçË,> ±H¯…+3ÕæÔ†k9«­¯]M-udìú²z¹þO>Ù%)_ 1ÀTÙ£É>Lé¦Z þxT:Ž)‹>Ð=½Õœ±ñncšiYÁ„‚z˜}=‚©ÞPú'´Uìw:j¯è`õ™ß{@»<ñuke÷š™ïŒ†fgÊbs¿bËw¸,ÅŽÐÔmkrã½XYÐÔ~ÑÕW0S—ku^8õ»“UÔäë…Š@Ô{ÞÜëû² Õ‚V ÔÕž×~ÕQ*&DðÌšçïºsüN^7ææT}Ø}õtŽÓW ¼­Ê¿zåøã­VDìå>õ&ß…Ø‹ý~r¾’sM¦Û–ضÙöØx* u‡8«J[ ãv–({ /¬ÞΊ²10^]­%>øÄ>_Áx¢ÑâP¨ýg{‰½¤ä*•Ö†˜"T*.Øít°M§¢®wÜíqpzœk»C« •8µ3Û<¶rÎú¡>3µ¢ç€œ«ä²†+9&³ÇX.ß(ŽW¨@­•ds¶Ýªz@E?WFëÔ¾©å„K´àÒ²Ô‹Z^t€Açp;¨‘sút¶TN»³×¹Éy¿óq§Ú±UEjS'd¯/žP¾~•¸+ñp‚ 'Ž%h"‘©*©*p:ìZUf(T•6×›©Ù«¬êLÇ3I¦”I3Oêœ*„U¬­*YµšfÖd""ÍÀúÜŒTMû™1‡Æß­ÂJ©*w~Æ™5o$O‘Mñ|>»òÍËWû›—¯q7.ïîiñ7ù%ïHË'a|dFn®wÐ;8kž9†EvÁý@K(ÚÒœx„­_ÍÂwjfÇêùšn,ø›ð°Åz¦yñÚ³›^6Q²¦JÞU#rϹÆûHñsƒ×’ÈÒî~¹yÏ¢y#\¾Ã#„ 4¯ìÉ옱«ðÎxt¯ô2Ê5) £ƒ·y¥wÏYßnLýMŒ~çÔ/_ÙÛÍ(Ýþ&lÓ5ÎÛû\ƈóæsh¤»µn}/ƒlv­ò²ÓÁÁÝÞ‘»gÎ;»5—¥HN¾ú`³Ÿ†7k^Ý&ojJÛ—3÷xG¶/]š½žk‘â ½s¥‘–“¹Ha¤ñÄUi‚-ï^ÍÞtu]ójïà5½Ê¯UF„3îm^ÝÄv!ò™ƒW/˜×¼Òߌd¼&õ@/¸ÀׯÍÍq‡Ø…ƒƒÍìýz–ãK§Þμ<㪌àû4ŽÈJF:Òã垦ùéªt‡ì2ÖÒÝ4~®2§Ð1k^#¿§)#5ÊÓ5Ýé¬hžhdoëoÇ;Œx—yçú±kKz«Èà²*…V¹ó¯šqúªK÷à`‹ßÛ2Ø=Øsh|ûR¿Wò>ÒÑ1ØßÜíU„°þék2FZ®?"u¯„N㟖YŒä-Þ•=)ª÷çâCÌó'šgü«æAé/H3=Še†·…½)/&rLZð™sæ!/S¸MI³gã½2sóÍ«f§ßù(=çLøg¦kñ&¹¹Œû¯9$“¥x2²}æ¼Ô¹—,Íx”Èá’¿›µ<7ÑbŸÃZ¶O´œ¾¼ÛSÑ1ûß±äÙì8hö[¼ÕaårÓ’Ü8Ë óS%šÁ±i›í`^UzSgÞæÁÓÓšªAМꓮíü–>U§ÛR¥Ôo;§ÏØŽ`nKý|¼íWe;l/ªuE»ÚvýÃz÷ÛSXõ8ˆËôjmª…ªT¤¬[-„ÔÀÃŽJ üݳÊf”ŸU“yoööL’Tþ¦“¥dYG. ½d#uì¯Ì{îýxií[_´¿Ø_¶ôÑs_ÌúÑâ»wH7”í rÙxJÜ {*wcÁ±ä<Ã;¾\!•N¿'P|žˆ¹Ì¤ææð«¶}íÆÞµ½#Î2;«¬Æ¹½«f¯Z±¶ØÛ¾vYi$Va ¢µh¢ÁÛ¸nÍšÞe«z.ðÎ^×·ñž^ïŒMK/XµaeïÀo㤲l§¡:^V^V]¦|8 x)«ŒÆ*ª+ªüŸx…Ëï:{Ü "Üåב²Ë¯¦—_N~þúªÞYpsç F—ºvÎy¾iwó䚟]öÖëo¾¸}×uoéÿêøî¯Î°ðÑ=›7ÜøâóK‡’'²U›>±’ lSÜz½æ'«6\~hé´Höoþù’þÏ—^ÿìCµÎü˺_/¯ G/]¡ºðÝ=¿ùæW·¸Ÿ©{óÂËGÿ·ßûÅþ+®ù够ÖúÚچܔýç"_›ßëñgF6­¾úÞ]?^~ÑÏÿöÞ>ªb{?Sî&ÙôJH»BK›ž B6ÉBKLA@–dC"I6¤Ð, OTA@ŠŠ`{V ¨`ŸØ{CŠŠXP¢ÿ™¹³%AýúÞû}ß÷ûý¸73sfæÌ9gæœiw3÷Þ›ÚÚzoÚe²eÔ§ÃÓ»n/qQô¼³e®x'eñ Ž5VëÀ“WÎù¢yMä²Óœ­û– Ú·7;½`_멯¦ïº¦kv—Œ¿0$õóÛ´+¿”}éû?¯È®ZöMùk»ßzkߤã|Ý:ÿãú=ú|ñÝ{§W¥ Œ6´]?¾p닾¸w×3/­»é†Ý¦Ýecoö˜£]s{ŠÉÒMWY”[3åM­Í-æ1Ž–™Î¦i.úŸ£Ó$K=£§§dm½Ã\Öb¯o¬m˜j.s4ͨ­t˜KΖ”tKªŽ8¦Ø<ªÈšW4ª¨|¼ÙšŸo+)·$™ûVöËÉ2wä!­0Ë’‘’jÉRV(z¤¥¨èÿþ ü™ ¿•l>QseÒ€äkâ5´ÝëÿDhàÅ–½ßúé+iýÛÞþÉï’ôï¿\vÖ/`ßG±¶ï=úÓ Þ¶óú„¯¯Ò|ù¬W§GžyqÜOý7q?3`Jè¸kâvO¿åøqßÙ¡]›ùä-÷o=âËo/ˆhìš«{¬¯»nçˆa«/ßzOæ;¿ù xkkκsl˜ë6<(týmÈ›_ÎûõŠwþþóÓ~[yáôžOì{pq¸cáÙ¤ëÉÒ k§ì½wÞO<ñÄc×Lób{qãÝfÌÕâ4 à×i÷^éµ""ÿÄÏQ£ßõY².¤nÜYcÆêÝ ï8È×÷¿Ê¾ä¹/ü§¯½ï¥ê)y®¼%>õÖø…‹NWùöúñÍÓh¿{ÑeÒHx&tí‡ùßôøµpܵ wÞ°,áÛˆÉÿÿ3âSúXtÂÝÿ\ WMýÿ°¦ÿ’ˆoß§«¶Î/Ê ©{ëÖÍdì¦ç_O¾cÐsïwÏ{ñŽ#‹˜µþé†åÕ\2àª38w³ß1èúÉ¿®™tWí–·®hLœÒ³{ù¢GzF¾ÔB):Ù'æÒ¯›žá›øÓÒ‡[õÅ÷Žü´ùåá~·mþðÆ#—ïfGüÆŽŽ¹kØÝo\\øvöØ{ì}¾÷R_[÷ÉŽÜa_½_?lÆ‘–MÁó^›ûþWoøeeÿ”ÄÈÓ/G|óñæ/+¬…’®¶Ì÷ÝŠ®ÛF ¥!7ü8´*ê½€fxß¶<*ýhvϱ¤¥xÍîKzJ¦kvŸO.ûo"¥ÐR ºpæÌ™É3°`3L®tÖlr4:›k[œM³––XgSc²yÊls©£:9IØuò¨òaËÙ)C,ƒu:µSk[aQ9¿ÎÞÜlN30®­lr6£9ÆÚëj«ì-µÎóŒÔ‹Ÿ(o§e)á–Pñ 7^lo®Á®×âlH ±éMáSꨪw6T¥t·Ä‰é!Ÿ2:›$YW¾ÿäÿi'ºËTɆÍZ|ßÓc×|2vl”Ï„.%/Zï÷ÃémZît>|I?ã0ÓÕûî-ÿÇa{ŸlI4¼½ >¥Û)ÃøµþY—ÜþKÁC/=ðÐm¹“ûLˆ¾xD׿ì™ß>šcÖ6$¾R>8e›±-þ×—ë7–÷Åž%{¦­ßôʈwß?°|Û·q¾§fÅN´i¾æ´ÌצɖéΩ,þ æœQmƒåš[DŒðkãd6/äŠUŸ½‘¦æÖï³÷4\pÒþ•ÿ+žî:¹‡ŠÒλX",bïY¥G1ê3°ÙÅÈ ¬ˆ×Û<Ó Ç(ŠÎç=1Ù´¡ß¼>5--̓ü3Í/)»s>ÛvÍ|¶µ¼¦¶Ù\éhj©­®­´·8̵Òp…ÒÍÂz›ÕŽ&GC¥#Élo¨2×¶4›[›­ÙÜÜÒT[ÙR7ÛØÜ:årGe‹¹Å™dn©q˜=íá¦+춤É^Ù"&&œ"Zõކs_”¤ŸÅl)Éd2Ã^[gŸR'$éHÍS³½eñ*zÚ6 É ž9 hrLou4·4çvÄs6Õ…ØQ½IæÔŒœ4Ô¨g*ë &Œv¶6´ØQª±µŽ™I¨MsNº%=ÍXQfE¼ÆÙMµSkZÄd•’““Ù‰œÙl­«3— ŒfšqntT%›óm¥åÖ¢1Æ‹­¥¥Ö1åE¶2sAQYþ(kÑh[Ù:¦Àk>U4º§Ãd£ÀS4fØ sùp›¹¢Ìf..D°¨L’+*,Ê·–ÛÌ-+/-Ê/5Þ\V‘7–_n./EŒcm¥EeEÃÆxá1—”ZóË‹òmX Œ¶)G±‹¢²² äg¶V”/.EYŒ.!Ë\50.U¤d¶+)µ••™=µÂF“?ª¢@Pñ¤QîѶÒüáuÕ²¸Ô\XT>F/DØj.±¢Œù£¬¥æ’ŠÒ’â2[’drqѨQæ1ÅåÆ<›l¤Q6Y ¿xL™í¢ ¾È:* ‹Œ)*/«Ê¸„-ÆZ•𠬣­ÃleÉæ2›Í(ꉦ"iØkT¶t¾‡T™³º³-N­mÆÂQenp6³ª®uT•éÁÚ‚=cJ+v £c–—Æ=Ã^×ê07רÑœ-æ)s¥³ª${³Ù^YÙÚ¤÷ÀjgS½ì3Æú°h©B‚"k²qSæ¼ô¿ÒÍ]éuΩÎ䩵ՖL10>Ð2À’¸¡ß†>×%2H¥{dksGB•b:JI®lª³Dy7±Ü×bÀ1ÿ~g3YñÞ­{ËGüfùfëoŸ"{î¿)êç£Ó¿ÑxêÒìäÈÏ ƒ*Í{øÞPßdO¯ÞUñBÅsûž¾„ŒÞvrèú[wÕ]41ëàíå6Þ0¾ºop@ÿï’÷ÿª~îõ·[».&{ËÃuŸŒ+>4.îµC{õÙ‹æÿöî±/_;¼jbg~:¼ÿÁ9ãRæ³{-óÙ&Jˆ¥õ?0 ÿÎÒ¨Ãc“ ×´Yºº[É¥xïg\OÌ?¥Óào1y ò”0òÔ¸-)¦w^¹,Ò§0!L¿û-c½ÐR†[ 7ÄÍ‹°Cº¨…p‚òäÓª;{Ïë¥.̦Þ5ÍKu·ÌntNm²7ÖÌ6wšçù5ó–ôË4úž®o4.tõÚ+þñÊ×}L—Ì©;ýøŽ7Î=ùAɱWÍ%>¹ÿÅÇÆW>ðÊC÷ùnZ`Ø0rÓ‚}fÜõøÌÈ–¥?ïðPñÙ¡Û¶/l‹zaÂî®§S~ |öƒo®hôÉó†éÞ)§ÍŸ[Wµ/íºêvÇô†çž™·NÛ~hÖc·‡Þ9ŸìÃÞOƒRæ“g0i»Ðô5Ûþ×o©þhgØÑZÆ[¢½Åßó¬ ­¸s´”`¹ÎL±¤d¥¤¤§O8ÇVº¼þÈãÅ–W_Íwn¥=ÖÛ¹:½ ÿŽ ¾òŽ›’›vÏÝåìó³à3·÷ÚÑ÷{S@üäÏ^xeÖSszþ0y`Òw׿\fXÿTjÆgúñ¹Ï/¸¼hn¼¹Û°°uK§¿^¶õ)Ó蜌/×Mû`ó†”OkH  ¡©>»©¹}cñøØW^¿ÿwo~¤béÜsvV½ú ñ—íâ33m±qqÛÅ7gt@#†¶ØX‹5EÌEG¥¿Ì ÝA p˜°‡øçÞsðPT—¸·ßAïŠ+£b¯¸²ë¼+]IßxfÌD¯¾½:'zÓ¢b6”L›7mÙ´Gv4–6ì›F§5ÌmŠÙPýHíæêµ¼¥5"2nêåèUע稉ˆÍu5kŽ×´×ð¹5Kk68©áÁ5!Ž\G‰ƒ›Ç<Çf‡È68jLéÚ5'¿kÙèè6rç–{“L“ž"Õ@Úw’‹Û¢¢s¶K 0$gIl»·Èdõ# É âÛµ¤œ”aÿ5‘‘m "LÏkÉß`˜ÿo[º™rÌV&XÐQAߌnºeè6£C40@#úæ’+Å×ÖÐÏE7]#¹ò1¾ù‹Éü™)¥iÚÙ5'w‰o ‹Èy†4'X%7g[d—œí¤Ô·õ6!Bý–Øn9ÁÖ.¤–¢{ƒ¡è£›ë•ÚŽÎNÒ‰Þk25Z{’.(¤øÍPr!"_ˆZ¼‹£¿Ýë莣kG§IœI Ï•#láB!âööçi‹Œ”-HÚ¢ºb B[{’hÁA$ ÆbË…ªpZ[ôXÓvDÛÆšŽ?EÅ{+ɸ-¥¥¢Æã¶ ®‡6=´æéá!zxÁ9s­½È8”qJ2å ƒèŠÑM’)ÇU•铼Jp™NH7×¶Ì4o‰C ÅÁ ñM$¬@\[`0¶:ÎR`F8JºÙ„ñèN c¨fŽbslA. m¹£k\Ž8~GϬ|ÿܸ]L¹—F&s£“o'_¯6‹ÿgݲ:Μ#Þ3æ÷Ù¦»r>‹Ú$Ô™»eРœâm„äæG˜à“OèäÛfnl›9'ÇH6’Ûa&ʵžŒ…+0¼ ãõnh{+ör{[½ vû\)‹°mØÈ¬Œ7m#붬ȹkÛÊË1umîÐå¦%‹-¦Å+,¦ußõ3­YÙÃ4žÅ4ãß®0›nYÑô|˜nÆpæ}rx°éÇ{sM÷ ûÝ62` ö•¹O£8KÑQ26wà½fÓ[˜·úÖHÓWènXi1}¹2Öt+ºU+#M%+'¯¤–•¹+éÀï†~GQœ5mÝS°Í×H•–ž³¥OrN£5„ä`‹ïV/CŸ *¡).’ߟZ„­4¦mAIXÝè¶‘#¥ùÞ’“‚Ú-þÍýè(ú„(£\¸£tÜ02 ;â(ñÚ"ôÑ@'^ý7 6ˆtD]°¥wßœ$»3HÔˆº@€ d¯½f‹PNÉ3¤ï#ÃQºü¶¹ñ¨’‰h!}0!ÅÌÉhY“ÑNÅÇæï@ÿ8:Š%q ­8g âUaˆDH¥ §`X%Ê{›Ù4ŰË.nljʎTìÒfíØáíH c¤żKÔKÛ.@ë !“Ð<&aj¦NÄPØÎe*¼Da…c|2ºyè¶Ñ¥8 \ŠôE,˜ŒGÌKÑž.Í-f±Y‘Ñ™‘‘‘aé‘Ái‘©‘~)‘K$ É‘½û÷íÜ?18)18¾gP¯žÁÝMAfSppHh@@`P€ŸÑ?Ààã``ñ& 4`™‘;˜U˜°ˆ/•²pãZÀ>F^gíŒew0L†O >ÌbI·ÀhŸ˜@ÞÇÒ%0ŒG +ã…£åÄ"Ã/¶†´´æDm#ÃÚRM!ÛH!áÛˆ ¾äF¤šb/H5J5±œTd§šJÒ¥×Ö%”Ü`ÞÑ¢ž³6ç–ÎzÔh¾a[TÌz”’¼Í,®G²9l$Œ,ÏÛN0,ËÛœ–8rYVº95qäf¿’KÆ=JÈ’ñ˜º™Þ€Ó{ùf~Ã6ŠAXþ„KÆm#]Eö‚ØG5ì+°ù‚É nºi|b·ÍUâþyÝÆoNÀ²nã=/gTWsKss‹T|sôÈ’qÛúBãvФ!ýPéw‘¾?úãuüGûö¶mîo³oN²M.è@X')i·*V­-^|[¥O[[ZϹZEñVDhQRŠXb³^óQ”Q0[D››Un«‡¾”š=,~‡—çB6Í h‘,'ȶ´¶v*š]µÔq\•Ñüqã‰hÎͽP›»EÏmvµu³W;<ê'Ô\Rš7róàÒ‘›ƒK.ÙÓ#/c$#=óÀuÑÁ§EéÎp)€Ï»~ŸëÎ7@àµAW{\ð€0£Ç…ïÑ]T:@ô€˜Á×mÿy÷Ý™ÇÄgôlHÐm¢ï€Äy8@òØ 5 m=@F9@Ö(Ýeÿ`0Ò¸ð€¡h?Ö ‹(úð¼;ïλóî¼;ïλóî¼;ïλóî¼;ïλóî¼;ïÎqê×êõ#Ú&þÑ7ÖW>Õ|(õ¶"Ü2í³ëϬó_æ[x~@e ÐÞ Š´« .Õ†A7öÂ5l˜< ýíö'Üþ§g¾hÿAjÚÞ€„hjn?ª#íÑþ9üÉ¥íÖ®bwŸyYÛæJñUjá41Ái7£ó¾ªà}(ƒ®í}Ûn? í0aÒ¾±ý(½Ÿa­ µý5‘Ê?…¼ö$]Òk.’p¤|]ñƒÐ5HçïA,F7 Ý:Øó1Ü‚˜Àýð5¼ã}#Üá]N¨!ÃÁeä¼Sé•’ñ·xOÄ{7lCIËày{®¬S3Ü‚Ô'@!lÂð2HMÖþ+RÖŸQ€+ðv]å`n?D2HT¶fÃ`/“ÐÝHÇ‘Dòoo;[uöI°C @‡±hBé“¡7lnßÀßá;ù Œ×ikµÇyÃHí讽„m7k+j&ü èÊ¥ª?X°u~Ïî-„Šº€^€ô¯gô‡Dì_ú÷±-ò-Ýi¨ñ ÈÔ¿lƒà Â+ð¼Sàa¢A%1ˆÿ`‚ehŸgˆ-½Šø“´¹/Á¯Â˰›‘`"þ7…„“8…ÖEºh؃–°^#]I ‰%q¤éNLÄLzxÒ“ô" ð é Õ¤éKúÁ>´—7`*Ã>ô+Ú_&É"Ù$Þ†wá¨!ƒÐê“ É2”ä+É#ùð5) 6xŠÂçdNŠÈø Ô»¿†CŒÀv£a C ö Rì#娾cábã±­/K±OÔÂå0 ê -¯Œ"£ÉØ@Šá,)Á!ÍI."¥¤ QçMÐLÊIK.&ãÈx2~?Ÿ’ËÈDhV˜3‰ø÷=b'SH%©"RM¦’´¤ËÉ4ø”ÔÁ,ROˆ“4Âl˜ƒ}ïJ¸ŠL'M¤î$-ð(i%3ÈL2‹Ì&sà¹~#W’«ÈÕd.\#ç<¸†Ì#×`/ù¹–, בëÉ d!#‹Èð$Y GÉMd YŠcÃW°,#7“åd¹…¬$«`'&ÈArˆ&ŸOÉg8✄ïÉò99J¾ _’¯È×äù†|KŽ“ä;r’|O~ ?’ŸÈÏäù…œ&¿’ßÈr–´SG€pBx‘2ørªáHú5PêKý¨‘úÓHƒh0 ¡¡4Œ†ÓI£hM»ÒKãpäêNM+à8޵'ÀŒcȽ8ŸõÀ1o%ŽLv¸›ša9ÜJ{ÀZXCãiOXcû]´M ½iÚ—ö£ýáÿá¶Š&‚M¢`M†ká:Zh M¥i4fÀÏ8›¾¡Œ³gwx€fB<޶6Ñ,š þ8n \÷'Ããðl…ÇplÍ#λÏÃõð,쀿ã\’‡ãé ôèIãó¸G¥ qfY‹é:”æR+Í£ù´€Úh!Ž¥Cái˜D‡ÁB‡Cl¡EÀè:’Ž¢£éZLKèE´”–ÁMs㜱ÃGð1-‡°‡pˆVбôb:ŽŽÇðz)½ŒN¤“èdjÇq¸’VQ­¦Si ­¥—Ói´ŽÖÓê¤t:m¢Í´…¶Òt&EgÓ9ô z%½Š^MçÒyô:Ÿþ^KÐëèõôº.¢7ÒÅô&º„.¥ËèÍt9]Ao¡+é*ºšÞJ×еt]Oo£·Ó;èz'ÝH7Ñ»èÝôz/½þÞO Ò‡èÃôº™>JÛ躕>F§OÐmt;}’>EŸ¦ÏÐg麓>GÿAŸ§»è ôEú}™¾BwÓW麗¾F_§ûèôMú}›¾CߥïÑ÷éôCúÝO?¦èAzˆ¦ŸÐOégôýœ¥_Ð/éWôkzŒ~C¿¥Çé ú=I¿§?ÐéOôgzŠþBOÓ_éoô =KÛ0Â(cŒ3˜óe~ÌÈüY dA,˜…°Pñ¦Á"Yë¢YWÃbYëÆº33³,žõd½XÜÁz³>¬/ëÇú³D–İd6YX Kei,e°L–ŲYÄ.`ƒÙ…lÊr™•å±|VÀl¬ cÃYÁF²Ql4ÊY »ˆ•²2VÎ*ØXv1ÇÆ³ ìv)»ŒMd“ØdfgSX%«bVͦ²VË.gÓX«g ÌÉÙtÖÄšY ke3ØL6‹ÍfsØìJv»šÍeóØ5l>û»–-`×±ëÙ l![Änd‹ÙMl [Ê–±›Ùr¶‚ÝÂV²Ul5»•­Õl-[ÇÖÃ:v»ÝÁ6°;ÙF¶‰ÝÅîf÷°{Ù}ìïì~ö{=Äf°ÍìQÖÆ¶°­ì1ö8{‚mcÛÙ“ì)ö4{†=Ëv°ì9öö<ÛÅ^`/²—ØËì¶›½Êö°½ì5ö:ÛÇÞ`o²·ØÛìö.{½Ï>`²Ø~ö1;À²Cì0û„}Ê>cGØçì(û‚}ɾb_³cìö-;ÎN°ïØIö=ûýÈ~b?³SìvšýÊ~cgØYÖÎN9ÃõÆ Ü‡ûr?näþ<€ò ÌCx(ãá<‚Gò(Þ…Gó®<†Çò8Þwç&næ=x<ïÉ{ñÞ›÷á}y?ÞŸ'ò$>€'ó¸ÒIá©<§ó žÉ³x6Ïáƒø|0¿áCy.·â:)Ÿp/äÃøp^ÄGð‘|ÍÇàú«„_ÄKy/縚º˜ããù~ ¿”_Æ'òI|2·ã«’Wq¯æSy ¯å—ói¼Ž×óîä|:oâͼ…·âJl&ŸÅgó9ü ~%¿Š_Íçòyü>Ÿÿ_Ëðëøõü¾/â7òÅü&¾„/åËøÍ|9_Áoá+ù*¾šßÊ×ðµ|_Ïoã·ó;ø~'ßÈ7ñ»øÝü~/¿ÿßÏàò‡øÃü¾™?ÊÛø¾•?ÆçOðm|;’?ÅŸæÏðgù\¿=ÇÿÁŸç»ø üEþ™¿ÂwóWù¾—¿Æ_çûøüMþ×zïò÷øûüþ!ÿˆïçóü ?ÄóOp·ð?Â?çGùüKþÿšãßðoùq~‚ÇOòïùüGþÿ™Ÿâ¿ðÓüWþ?ÃÏòv 4¢Qi\Ó4ƒæ£ùj~šQó×´@-H ÖB´P-L ×"´H-Jë¢Ek]µ-V‹ÓºiÝ5“fÖzhñZO­—– õÖúh}µ~Z-QKÒhÉÚ@Í¢¥h©Zš–®eh™Z–O}mssmÃT-¹¡µ®.¤ÁÙPooš† MŽ–Ö¦ƒuJ“c†ÃhmÂ${ek‹ÃÇZo¯lr6øXS Ži>V›L÷ϯ¬mªl­¯®sÌ2æW9[ì••Ž†CA¥±1hrÚ[ 6=fÓ©ÚÜh>6EÕ¦¨¶6ÔZR Óý‡y¨ «tÖ×ÛõÆaî²þÃ=8|ø{“¡¨¥¶®Êa(Ò¹y¸).E:ÿ^ÔGzQ×Ù§eFɺŒòÊ3Œ’uP(y|’7Œ‘x†12+`Ì9¤Ò3 ÅRšÀâšVlɦÖú:{k‹O±.qs½¹F'RªVé9´22 ez“—y‰_æ…Pî-o¹$ä_>½ÕÙâu:™©¼\´V…ÞZR>­Bh:°¢ƒ”ªÙ*ôf3\¬KxñÔ&û ‡ÿÅ)ü.®ªu49šk› ãõÌñžLÃYÌ8Á£)G^³5L5 ³×µìºÒ샳+îvev‡^ûJ/ƒ«ô\•nbUºÁ9ô˜C§êð°v(ªŽ—á?Õ«M§zÜTÁÕx\hÂZ½ k%ŸZEºVYÙå^$§keYÓ°·9êì Uµ•†:Ýäê¼UXçmrù¼N˜\ƒ®„ÝL¼ÐýìÎæ–&gcC™ŸÅàÔÍÏÙA±Ne~N/ókRN·é\óË24ë höªW³·ùµxËÞâ%{foíÕª·W«nr­ÒäZ;HÖªÚ°U™ÜL]ª™ºUÍô2¹™n“›­gÎö2¹9ºÉÍéhr©9©ÌÑ0Õ8ÕÑT>¥®Œ µÒòZ‰Óhe ­®fÕÕµèêhu ˜2ƒ)´ºƒZ= ƒi´úrZ{¹Vçl˜Úl~­ÔùŠi7û¹€Z7T'Ä(̳dè¸Sô F¦ÑæF•ŸI[ZhËKµdúÙ›[± ;›ü¦¸¡J7Tå†n¨Ú MuC5n¨Ö ]¹¡:7Tï†ÜÓ 5º¡én¨É 5»¡7Ôê†f¸¡™nh–ší†æ¸ £Ý]9£Ó 9¤î]Qß9Ž&ìf¡…78dØ2SÆýZj°« È·ÚÙÚ¤µ3tœæÚY§²AB1ZJ¤†ZP€ ì¬«jn™]çðGên9¸à@ÉÅ œ<äæ.ƒÝe$WwLrvÜÝ!«¢’¶'RëiAÛë´Ý1IÛ]HÐvGíÚ†jÖÎ cí\°^;WLJà‰ î2(»Œ”À“¸ \eêVæ©0?´ÑÞ„C¤£Ú-x˜Liò®‹Žœ­ g«ÂÙ^…]l¼ »’‚$ w ”c˜Û¾ªœuuvOK‹¡¤×”ŒB_ak5µMU~ÂØЬ²2T˜©Â,f«0G…V?$!Û¦&@6²7û‹fUp€lIæ=`= Æ^W- ¼(„5 E˜ÞjGso ’t]±f‰_][ÝR#ñ%Ô¬óV¡_KlÑKj¤D:Øl©º@ºi p‰*‘TD·WL×LšM†©Õ0©2´¤äâÄPçœZ[i¯kp¶ø;¦·Öΰ׉W<øUâÙÔŠí¯!.ÎPµâÐt³£RœE÷SeplPï†Ùޱ²p4W¶V9•&]½)Dœ¯ÃùÇÝó*8 × ]Ú›fërZSUˆSom“ÝÐèhÆ\?=¤›Zkí5AØ„8ÑK³W9pžUYg¯Çñ^Õ¶ P_‚9ÄË$U­ ˆ…g“qÐ"íòp3ô³W×Öf¦¤¦gãPÞ‚ë‰G•¡¾¶ALXUgC• #;Ç00+Í0<%;#]2Rd–ft6:¦àÂÞ!'¾ÂÂÂ|]–”LcuíÔVäŒó¾¤e±`OÑ3-ªº–4¦«0C…™*ÌR¡«\Ž U´äùw^=¤¥¤jV1%kÃÄxmÌwOÕ¾j×ÊÅÚ@Ë«-O4/Eýøç{‘ÊwTÕ¢ý \ÓzÀp¯Åƒa´\;ŠåÒÁ(ù5×Ûëꌒ©ƒ=œe<ÐÅ^G”2è D¥4ô"I(ÄK.™ „“‘ ·„2ê-¦Lñ×eÕa]`ÐIŠÅ’"ÛØ’^`q§d»¡”êÎÍHÕñsRÝy)nÈ“–¦cY,Šz¦;']•×»bz¾§t†ÊqóOõ”RRÚwK;Ç™¢Ê[U˜¯‡V·ì©îú¤¹ÓÒT)«[ö4”æ†ÒÝ’Òju§¨šXmz˜ç¡å–MÉmS8…nùÓrTyw^º›Rº’2OñÊs—J÷`»¥MwK›žá†Üm™îÒ¸‡†rµPJºâ”iu§¸tíNq—ËðØ‡›c†›c†»2Ü’e( És·c¦‡FŠ›ƒ‡š‡—[‹™JnÊtóÌô´½[^—5æ¸[*ÓM+ËÍ=Kµµ»N8n¹ó\Ö¯Ú"ßÕúÙ9iF•ƒÃ«QeºFZQRÕ7ÇÃÑÝY®Zâ­x»í;+Ó-½²œ<(»s×>Ë]ç,Ī”Õ]çlwM³Ý%³ÝV”­ä´æ¹SÜrf»äLIQ-i-TZTmfSñB7·F²U›åyòÜRf»lß…ãn¥·´9ni=cG“9n)s\Rf{l>ǹÛÈ­ ¼ÝPªJsCénÈ]‹G+.‰óÜ)n{sK—’“î;ÛÞ¢?nл•=G©ÜæÇKØl5 §e¤úVÎn’óƒô}­µ'sž‡km˜' ­ÀQ×b÷±56×âƒOÀ fÃÌò„xÎÚH{c£Ý0Ê^?¥ÊNG·Ò1­t\­O±| J-©e¥5N­¬vj½•Û[}*tR¬¤¦–å£+i®5J®-Χ\d¥ê³3†9*´ª0O…ù*,P¡M……z˜­Êg«òÙª|¶*Ÿ­Êg«òÙª|¶*Ÿ§Êç©òyª|ž*Ÿ— ZÄKèU(EJQ…RT¡Å4E1ÍWøù9¾Ø¢^„RUFª"”ª¥*B©ŠPª"”ª¤OUÒç¨ò9ª|Ž*Ÿ£Êç¨ò9ª|Ž*Ÿ£Êç+ü|…ŸŸï'-% ëé…ž¦Ø¥)viªxš*ž¦Ø¥)viŠ]šbW Ê¨òª|A^€2"¯¶IWÈé 9]!§+féŠYºbV¨ð ¾-? ÂKsÁ*Ò±F 9CÍPÄ2”Ä6EÔæ"ª„°å‹ëS½u™©P3j¦BÍT¤3•¼™ŠE¦jœLÅʪÊ[Uy«*oUå­ª¼U•·ªòVU¾Pá*üÂ|Í.»øÑŧÊ.^%»¸Cuñ9¢‹‹ÌÙÅkEŸ&»xÞÅZé¬Z§®ÖTã44‹Î¢É€µ`oU}¼ûw%:ŒjNÑ2j¯d1Hâ)R 2'Åhï4è“&†Õ¹UÜâŠg¨0M…é*LUa¦ ³TçVå²l…—­Êg«òÙŠn¶*Ÿ­Êç©òyª|ž*Ÿ—æ+ÂêÂG•ÏQtsTùU>_áç+ü|…Ÿ¯ðò³üjÝ£Hí9£H–"“¥ÐÓ”iJ¬4Å6M‘OSäÓÛW9W¨è(ü‚ÔPo¦^ Y 8(ŽYÎsÆ,Õÿ²\ãBNW…Ó•xéŠ]º/]‰gSù¶ôˆÖŽCŽ>uJ h=×pTÎR=:CI¡$ÈP2”J‚ —ªa2\¡j ›Â·¹ð=›¢oË2:; jYj°Ér ^ 5SÍT¢d*Ò™J”LÅ¢P‰é •(VUÞªèY¾Uѱ*:VEߪÊ[UùB}…_¨ð ³Ô¸cU¡¾eJÓ«jI+Ta–J×»†é*´j²ötægop¶8êµveà®qAµNžŠó\C±Šª|›kºUéù*½@Å \ëÕ*ù®ù²Ð¯ªÖ^7»¥všâlS%l†MöÊšÙþâÇ™iúÏZq³©AsJ¿Bú­ÂçUΆ©UΖ)Ž:çÌJgý?ùV›J´yI“ïCò;IãŸ_é~ ˜_éõ¬&Øó«µŽYàÁô׿–0®0kôDož6¯°un[ǰy¶yZ ØÖQ€›wµm^ÕöæUÃak8ÌC2Ôû7sɰŽLB†w*î'~B× yկȫ~EëWÔ±~E^.òª_Q§úyׯȫ~!#:qÙ¹#½uç?Ê#jè¨Î¸þ£¼t>Ê»œŸøõ^áÈß@uxŒWÅÇxUfŒ‡Nè˜s$ÓA¢b/Å^WܹñŠ;6^±¿bOã…uøÇ½ÉŠë½zäñúw½›ëÝÄ¿ÔK¨R¯Ê”žS™Ò•)ó²·²ÎöVæE¨ìBeÞ„BËÏÑM¹§tˆ×ÿ(è…Ë;(«Üm™^õ¨ðjÜŠÎ[ѱq+¼·Âkì©p=aç¶s…·Vx÷Ë½ä¸ØKŽ‹;ËqqG9Æ{•ïUn|çrã;–›àUn‚§á‚'tìYÆr1+éª/Ò§‡@ùzéZ—µè¿Mè<ìõަf{C•^V5¹½N>²O±©•„M­$lj%aS+ ›ZIØÔJ¦V6µ’°©m—Mm»ljÛeSÛ.›ÚvÙԶ˦¶]6µí²©½‚Mílj¯`ËSüÕVÁ–§ø«-ƒ-OñW lê„M=€°©¶<Å_­5lj­aSk ›Z3ØÔšÄ¦ç6µ8·©Å¹-_ñW‹t[¾â¯žMØòõHÀ¦ Øòµf±©5ŒM­QljMmSkj[â¯Vã¶Å¿@ñW«w[⯞ ØÔ3›z&`+Pü µF²©5“­@ñW‹X›ZÄÚÔâÖ¦»6›â¯–å6µ8¶ÙµÃ·©¾Míðm6ÅߦøÛµ³©5­Pñ/TüÕJÔV¨ø©°­PñS)l…êç(«Ež¤ˆ „tKæ$6**!’¨¨À(€É‘ÄûJçÜ¥_ î‹@yEu¼$rœ¸"#Idd€ûé‘xa0y’¸îqæ° ¸„„¸„˜¸à¸¸,SD\HTPH1º‹+(Î캂Äç‘".Ž$$tIL-qÁî+* /“¸"HDDœû2†à%¨ ß°’`éÕ+Äh4…ñºv31j '¡Q$1¶GbPTéJzôìiìß#6((:<¥GlD@l@ïÇaiB‚¼“þàÅ^2CÏ'„’ö N%ɱÆß-—œLˆ¬D´ ?#>Åè†ûèÂ2&ü®ò/5µÁZ:Ù­wo½e¤Ê•e1)j`Td`rrd` T0!±hHÑ]ˆq@?)" ÅbL‹$ÁÁÇmƒ2”ÕÂ&@ð€>„ôöÐ#4t@Ïž= "Íh¡‰&a©!AAUppˆ°Ò­w  • (†D»ë•ìnEú0¦¹`c²Q¶›Q^–P’œlŒí-ú^ýH—.~(›‘ÄûähBz÷0 KÌŒ ˆ‰I$Ѧp‚Ø©‰$°w÷L7ÀzvÐy˜þðr‹”úןéÃl<÷úü¾F£2‘n³¢ã]Ý3uÛÛ”„¸¦È.‘áñá}Cúõ‹èh©âÒ;¾~õ—ÉäîÃA.V²š‘î‹„ã/®ððnáá}ÝW?¼"ðÂ"]ÂÿÔ ÍoÁ-*¸Ã=ÐuÄÄã]wdˆ¸M⤧öÑ™'éýþή?»Þ™~öÓûtš:„ÉÐè¹þõ0°Fƒ›04„Š7=û„_‹a7€È%X 1ºÜ Ü??yˆ7®&sÉR²œÜI6“'ȤÆÒñt9}’¾D_¡3ì­Ì…±ž¬7kesØÕl[Ìîd¯±7Ø»ìC¶Ÿ`‡Ø >‰Wòi¼•¯à·ñMü¾…?ÅÿÁßàïòø§üK~œß}A÷_L‘¦n&›i´ébÓxÓ%¦ËLW™¶šv™Þ2}d:núÁtÖìoînŽ7÷6[ÌiæAæ!æs£y‰ù.ó}æ{h=Â{DõˆïÑ»GrIñ4Þß=>1Þ?<Þïè’pg »^OøüWCûoííXWñæWQÇ ä¬ãä4–uÜN_Ä:¾ÏÀ«Ž-²Ž×b—°Ml{Ç«ŽÀ§ðËy_ÆWñ ü~þ0œ?Ç÷aßçŸð/ø·üd÷yÝ7˜Àm2›†›JT'™æ™7½hz×ô±é¤é'35‡à“€uL5ç˜Ë:¶˜7˜ï5?СŽeªŽ¡ñ]±Ž}d'ÇWÉ:ޯꪎ@‚¡”ÞEWŸ}]™ËгW´hŸ‹y#H)hÏ&½Û»‹cÆð ¦ OB¾Öþ*Œ:sŠ`8äüÑ¡Þ3ë;§|‹. ]ÈgÁŸuÈA+ýĢǧþúð›~v˜»ò8üõ¡Ó‡î=ô5ÀÁ—î:ø´H?x?º¥g¢?ñÀ?öÏÝ?s¿aùþ!´Zî'ävVÊÊÙDOÔWî¥ÒŸ€®Š-ê(7{µ·œßÂ×¢æ[Qƒ;ùn¾€ïᯡ.ßäo£>i˱¿= `P'F FC¡áaÃnÃg†o|BÐu÷ä3DÏõ¤û> >3|:œ,õiPá<ŸùèÏ—ðueò™#O §Ÿ©/ùˆ «È7ÔGœ¶£Ñd9A“ÈqÚÛs>Òu:’L’§ôv’gÈsäGŽ=œƒ†½ÚG ?0ÊSmÁ¡ö»çÏÐ>ä,ÙEƒé…°n„Åp,¥° n†å°BžÅ[«áVXka¬§áØwÂFØ„ãE? ä”þù”&ý4‘v¡Ci É¤ä š„#Êpò!Ù.Î`ÒÁl ¥~ÔFZI "ëÉrù ºã(%Îþ™¡'ô$H…yÎ6¬£Êa<Œƒ p)\Bž†ÉÐÓ¡Z`.,$¡p7Ü÷À}p/Ü£…oƒ'`;< /ÃKð ì&!ð†C8î}Ÿ’§à øNÁiø•H0ñƒìñðwè A?Ø ýáQ[!Ú ƒð8dó OC<ƒ}edÀSp<ƒá0vÁ…ð< … ^¼Š=ê5(„=Ø·^‡a°—G}`샑ð¼£ámï@1¼ ÁûP @|các¨€ýp®'A0 ŽÂep&Âç8Z•ð58ਂc0ŽC œ€ið=ÔÂwP?@=üð3´Âo0üpfÂY˜í0‡¸Šp¸†øÂ|ø1Â×ñ"íA°zÁÐ;| —ÃIA‘' i>-¢¹tOâ‰â\³p ÄF³KY#û;öOŸ¢+a58¾>Ã^dÙ¯ýü™~úŒÝ†#òoì;v–Óé´‘>Lëèô~u Qœ<|ˆ^E¯ Kè#tª:)ÎD6Óòä•êì£ëäã"z“<í(Î:zŸs§ÛÔ FqzñYºKžUÜ­Î'ºN'г‰âD¢8è}QœD|š>EÓ':GÇ^a/³½òányаó‰ËOØaö¹<3ø©<1Øùœåì{vJžü‘c‡ášíKŽŠ÷¢uùQ|KVãš" W鸞Ð×yr ¸–«‡&Ø‹3\.®æ8†óœUZBÈyKø÷-æþÏXXpÅ·Wv†ÿ–vÞþoŽ re.Þ¸„+ä¿>&`[ÿ¾%è/Àj?o â}:Bf KàuKÀ]ÁP% žã„%à,¿[-&’]– w þ¸?eáº%àî „vÁ9ùCêǸÛ4µŸ»‰`z3îÄÞa !oà®"‚ì`Q.KÀ½EW\é êl râÀµŠ¾×øW(gå~c½Üo¬Å}ǸßX®vkÄ~×i+å~c1î4VáŽc îKÄŽãûõü*ÁeÿöΪÈ€{7}Dx˜'Ïâ~î ׈@OŠ÷uàê>ÜAmÆÔ£¸‡úÞ;¿S¸÷{w[G„oq7ø!îawŒOáÎìßÚÙásÞSé&Ÿ¢XÅ“˜-æú2Î Ó½ž¢Ì%x@) € iÞùgê矩Ÿ¦~þ™úùgê矩Ÿ¦~þ™úùgê矩Ÿ¦.Ÿ©«=ÿ—RMÄúø3œS£Ú Ð>{ ý®Žmï&>áÚ>]|ôWú…O©È¥}_`íKÁ—GL_rý ¤Sƒ~4æI:AHGøE:–>G? Ë¢OŽ#Ç0rý,»ýhLÀ²[Ñ•)ŽBüôI1òŠ‚%^.so•ð:,ë%|»„7Hx£ðQNáŸþw"—œ>MB?Êô»¡¿Dú‚r4Rð:‰s»ôµh)y´”¦OGŸ£‡ÔìR³¤„¤„%¼QÀ”ˆšb™õíK)“p’°ô£%ŒzD?9ê;kñÄŽ íר¦ÖV9œMÎú`•³›ê bj“cÄÔÙ[p…&-5@_˜ê¯qG4¢-…Ñ®röÚË ßˆk·/IçjI'â€Ø*ÌYZ<Ú cÊKGš!olQ¹W€» &W” a®V—pNÎïÁã¤Sœ‚aš£©zK?Iú©Í­Sš!»¹¶¡†ˆ÷Lâšܵ îçDþGQ\<«]Q›^¸nLÇÕXj®Ä;Ÿ ¿NcCô°Ç(EË¢ÂY’ÁÕ– ÉzÈvê!À<£àyf?B=HÎk\¼‰œºÞBNFêï'ŤD¾;Üõþí2ñîp½ßnÿWè•‘ ¤Ôâý¦ðc§à%xâŠ<ÞDKa¸ò“ÿm'ž'OÀ•òv\ pµ›Œ+Ú!¸JƒëΉP ¸b¼®Ã=À*\ç߃kiÊ‚}†ãœòk WâzœÒoÛÛp-LérLŸŒé>˜>IÄ1ÛczLß…éýDÓ»c~˜v§ Ã®â{QGÇô ã0= Ó¯ÇôtŒÂô¾`z¦?‚é½EÓc°šç½³hG1‚ô âÖ‡`ÐR7CÎNc=)U| Ú †7¡¾oXdî7î‘Z“?†]p¤ˆÇýÐì;·ã>çï®wÞbÞŸµÕã¸CxWýï¢=}ßÂOp÷A$Št'½qŽÉD-’1¢M5±ðjKŒWxÚ,Áx²1>P´!ÆMž¶dY&BŒÇr‡0.èÂ8Òeá>͸ñÐÃúf{µù Œ÷ónkŒÇºÛ˜ÒzŒŠãÃTþ ¤›¨Ê‡iK$_EOÊ7@É—¬ðû*z}”¼¥JÞ2E¿BÑ{ŽN ê@<«Ðu ÿŒN±\úýÅhˆ÷^9ZPR¹½ìæ#z¸KÅó°xtýÿ2í^Šörm”LXáEr\1x¤ #YPUÈÕÈÇ ÿK®ö¥¸^ˆX~öTÎŽÛ»EÜÿ_–™ÑærÓÝpA§2[=¡œéþSõÛúçuï ·oxú?Çÿ¿¡¾Ý:Åkþk9þ“zø=ý‹¸°´¿]íæOiÖDìù£øÙ˜ä¿ôÏqþé+ÕâZ÷wõñgºFÛ{eß¶÷9Â'þz›Fœþ³øÖߥ‹‚Hú»8‘Æön‘aí[#c<íÙK¦c¨p’¤Û™ ©‘C0ü÷`Z©Kˆ;AêVµ¹·ÓÛ*rŠwô´Yä庬‘M^ü¯ô• ×b|1ò¿EÕh7nAäí2¾TÙX'þdkXþ>~é϶F>­ë*òEÞ"÷aú‡Èÿ/™®r¨2Ç:ÔkÇ~ˆåOý^¿l¯‰Ò×ÉE ŒûΨîž2"Í[ŸQ½Eû{•MFœLùSþÿ ý¼à`p5âÜ´ÿ©ù4jìרþ¯ŒÿÿqþQÿWÛÊ¿¥Ûÿ&º5QÕØnØ—ç |üÿìúO®ùÎY[lýŸíÿɵîïÙè¼þ[ÿ"÷Ég@ðU¿Nê¿Mzÿ2+¿{eÂÝRÜ—õT_¸Ó¿içù¦ÛŸ}Ñm"L‚J¨îÒ§Bç oàt}ÇÍõ½6˜åù›ë k0ÂRX'çÜ_Ã1ø¾Õ¿·G4ý{yÄÄ’¾$Q>Ùf4‰áe|<¿ŒÛånª÷ë6â‹4ú÷hÄ×eÄ·e:Gæ=þÿˆÌòÃüS~„å_ò¯ù7Ó4ÍGóÓüµ@-X‹Õºiý\¿Œà^s¼|²&ö¢òéÞ Û×crLj·†m„9! ž……ʧaxû`ÛG n$ÞâYJø¡º ·õÑüQ'±H©›ÜA'£jbâmhRÔH©øF%ê‚¢6&!N%¶¿/j`¦ˆÖ÷Ãöw¢ßˆw êa¦_­îí>é/ÄÛ[~)Jºï`ÔÀ(ï¼CQÑÿ¾…`Ô…„¢b!µÐýD’A¨ a¨ ᨬ¡ø%"P;c 5TQ¨¥ñ_Æ/ƒ.¨-;¦TòJ„«xD£æª¡+jo:â ¾Ð_ÇoC5†˜¨3ô_ä¯ æn¾1ßãïá¾ÿþúñÐÿ˜ŒþA~ýÃü0úâ ¡µyý£ü(ú_ò/Ñÿšþ7ü ¨aÔ!jYCßGóAßOóCß_óG?P D?X F?V‹ŠÐ ý~Z?@KHD?IK‚P´ˆ'£]„bë>¨,C“OÊüäwZCeN8Þº¾™Ô4—šÖ¤¦ JÓýÄ3©K SðZlD|¡3MêÌ‹ðöÅxû¼}`9Þ~p+Þ>°o#¬ÅÛ_j4Öã·ã$µ,µ¢´{Þ>p7ü-ó~xáñƒ‡à„7ÃVäòÞ>° žÆôgðögñƒxûÀKxûÁ˰ë·o?x ïpxo?8„·†#ˆÿ9Þ>pï0ø¾Bøk¼ÅYCLìñÇ;NÀwØGNÂ÷ŸÂ;~3Xê,´£å‰G>aâ\5”h‚#„­ÓmT|)3|IÒüä7.Å7 Åï,ä$t‘–M9åâ÷ñ«/à@¹ÛÀGZm /æÅËKx Äñ‹Ð‚cy9/G¸‚_‚ð¥üR„…5Çò‰|"“ø$„'óÉÐM|q ºKû6IûîÎܹÂÊ»ó©|*âÔðfäÒÂgaÙÙüZÌ]À"¼ˆoDxá‡ù£·ñÇÿ ´ûîâ¿eÖ­ÿ}þ>J«÷ù‡ë=a?ßaª?àÖ{Å!~a½o|Â?AXï!ŸñÏÖûÉçüs„õÞòÿa½Ï|Å¿BXï9Çø1„eÿáßòo>ÁO ÷“ü$ú?ð0å'þú§ø)ôOóÓèÿÆCÿ,? a¢[€ŸF5ì²Rk|d?¤šA3 ,z#Õ|5_Ä}’jF͈°è™T Ðý“jAZ¢—R-D A8Tþ¦…i8Îjáö8-B‹ÀôH G[-J‹Âô.޶Z´é]µ®Çh1˜§ÅAÖ]뎾Y3£¯Å#N/­½µÞ÷Õpì“£€Aë¯õÇþ/ƃ×X`Pc?Ú.)9ß’ñûQÜ\ôÃ\¤â;sÑò1¿@Ë9S Åx!B?ì«$—cjŸFõ!¦çbY„v–XA¥•`Z0öR.hDHº2Ž92,)‘¿Ù 5rTÒé»R´‹È‚üCˆ^® D—j'àl äu3œ(,êQž‹`˜‹BþžœQ3,iÓtŒCH[0J••+Óº"$èêi®4¬T€忿еKˆü‡Rµ@\±]{v2Q—X„YÀë g_!±¢")H(P´,¶¬ïNÑ¢¢Å-zX"Ân/`'Fý•K)(ÊR>l‹]°+ã±"e”àÑCpå{v!,$Cà7 P¶_<ùÆqûbÿÛ;¿g?×^ã*ý_Qñä·/Õyž=Õ¾Ôû¹¦×¸ðÄzóåÓų§:?“R/U”–êôpÅšúG;½¿¾Ô:–ù³².¹ÚkΕðwË(kÞr¿›×±^K]õrµ†hÎRµwSøÝ:·ÆÙke)”ïìµK Š[ઞRžºëòü^kœ+;R¨Qú:‡—’oéÙÇ;×ë¯ì´ÎÕÁÙ“ÿÊsŠ¿bÿúÓ‚Î:ù$$Š+`ÜÈoìêß×Õ¿ªëù’îzý9ßÎÕ¿’ëú>®þ\ï/Ø~A¿’ÿµ&¾IÛÎÄÿÄÊ•6‘kl"W.Tð†\ë#×VÐë<ôÐ`@®×ƒr^¾‚;ø!ÿe`Dî7ƒ¿ø_;ÄA п›Þ (Ç=Hçqº …,¸¶Gi XȃðT|§ø+úú(ú(úí´BÅ’GB 9r­EäZ‹Êµ“k-&%æRb6Ðä*$ö¡×ÐkûН £/$ö“»d]IW£|kéZL¿“Þ‰ò ¹}¥ÜAôúÂч1w3ÝŒÔÚhʽ…nAù¶Ò­JÃZ…Ñít;îRž¤ObîSt'æî¢¯aúëôuLßGßDø-úæ¾MßAø]úÂïÓ÷![äDÒƒô ¦¢‡!Š~BqE?¥GpUù9Å5­l£ú%ýáoé·ˆs‚ž@üïèwŸ¤'qÍù=ýºÒèÿHD¾?ak†Ñ_è/è‹6¡¿Ñßÿ =‹e…öð-·‰9„]É q‹øï}^Œ#]ÍMKŽ bü*ðP÷ô(Ï\Ðiür—Kaî!þÊ5Výë½ýwð%=ÏLðç|=c¿‡žœ –v¬Ç_™}Tèºuš <㶤疯 ƒ^–ÊqØ ï_ýMô¯Ï™ÿü¯›^ÔLÖÇGÆÿ‰ÿV>÷+Ú®ÿ«ü+_ÌÿaùÿâûØ×³El)»Gµ玽XÕ°NàX/„}™4¬›?°~²@ðÁzan0 Å”0†¹á,á¾XïH„£Xøaý»€?¶A4±ºbz ‹l^Ha³ ŸÊò1ëˆ~1»ý˘iV³j¤6•5"…ëÙõˆÒ/‚ ¬ÁRf7c=ÄS¨ô?Ÿe­4YWM„ô.¹…”>RJ_)¥Ÿ”Ï(´ƒ8),ýVƒ¹Ø†è/` ”4l![ˆ2ÝÈnD™nbKÜ’-cË–ò±lâÜÂnÁ”•l%«Ø*¤°š­FøVv+â¬ak0w-[‡)ëÙz„oc·!¼m@ÿNv'¦ldOa©§ÙNLyŽíÂùé\ƒ± wÄì+v ÂÅ÷¿>ÁN#Îî AânÑâ ÈûsñÿT‰<÷¹IpI¸‹¦/„„߬`?Ä¿SÁFú÷ð‡Œ{»¨± €¬¨Z²¨ S×Í¢Å9CÙ‚º¾®`©]?–°xòfŒ V0‡ä©!.þKÈ3LÁúÇŒ–°ÐKÌL£.bæJØÓbP0KÌöú9ª`Ôo÷@#îŒú힥`¤Ù}¶‚Q¿ÝïV0ê·û3 FývwÑDýšnS0ê×äÂAýšÞQ0ê7¡‚Q¿ £ŒúMxJÁ¨ßă6жJê¦`l«¤D ûczXÒe æ™ä”°xŠí›t·‚Qþ¤‡$„éÿ_{W#ÇQ…Ë»³feaáG²•B …ˆ™žÝÄvv‚@¶×ñn”µ³Ø–%TÓ]3ÓÚþKÿìx,qâ8pàÌ ‘ˆ q€"â‚”·".(ˆƒÅN øÞ«êŸÙ™àqÌ©{½=¯«_½z?ß{UÓµãùd÷}KwÄ…î#¦©º<Ó;oiÈé?Ð3ÏÓ=miø¼wÄ4ý×'z?¶4ôéý”iz&þ™Þ{–‘ÿ9âw¾`ið;Fþ9âw”¥ÁïLž0à¼mi`À1±;Oú8µ4ôqþÆô³Äßÿ¬¥Áß–é/ú7, ôï1M»¶Ùÿ¥áŸþ˜î±œw,MrÞ%z“ýßÿ»¥¡ÿ?'Þd»¶.ZšÚw‰þ8óo–¦öï2ÍqÙúµ¥1îÖ;b—wYf">ï¾äBŠm1;8÷,õ¢èV­þ¿ø©[©]Š}¡!ƒöq1Ä9…<:Kq çB¸âH„B‰ íòD¸K!}Eì ‡_üȆ&_i¼’œcœ=漃»¯×ÄëƒWqïÚHª «<æ—·ìyUܯóçLÅ+°gçüYû ‘üû h¸Šoõežš}iâñ¹×1·’ÞS¼Ÿðí…%£Ës,ù¤”SöùD²´ˆ«Gí í&ŒFÜY¼\[ &ìQÉw9—LU‹ìë¨aÏ”³€"ÿ÷ 9Sr¾SFŽòº¨*W¾Pß(s®Û“³æYÃ'ó5ù¤ºì”µÒ\Œœ2Bµ5£lʶFÐ'd91k&ž É5c¹Ü;eMs;.é[¯¹à*ØJƒ6š-0gÄÛBq¯½°MŠÿ!­jg­nÚFÕèu­*qq}Ll-«g—];ÿvÞ¨{ ™'ƒÓ˜±ØäJ8—gs÷öXO|s¸'Œ ¿òS95±cr‘âvTѱQ'<š;7‡½{ëÜœÁÊ»4·æ6 ÆÒGšòýÈ"%ƒf” 3‹¶ØŽkd4'±õß`?°U¯\NéJz7µ”ÕlÙyßç²\É”õf>ËJÍLNš¨•x)ìŒêŸ@°We¬i“Ì—[ûÇUM5u¦Œ;ý•Ç‘E¯Yø¼Öñ%Á‚]»2 À1æJ0aù‰x«Ž>b¤‰Er©QW¦ñHgxH#ÆKÕ4’Qê4.àNÏó)ÌèåNTª\8VÆPÍ OÃmR?Èj27UÑ˜Õ ü±Ê‹”ÐÉ¢TjDÝUäë¬H€¡œÓeù 7øÆ0Î'° >#Û”ÄÁÌ\íÑׯ:òv¢]Ÿt¢<2ÞAsuDç‰:QäJòÒ… |“`tè&`Ð0ƒ×ÁîùY¨܆Üœà‘™‹Áà%W¤&—U.—†}üÃû Gõ‚!)]”mDJJã¹ïG9  C$aùÑ$Fv0ž”Ì`}¯"<Ìíq|÷¢Žø±ç»ð5;ÍE1 âqæLò> endobj 361 0 obj <> stream xÚ]“ÝŠÛ0FïýêEa{‘ú'±dA0,)¥¹h»¬·àHãÔÐØFq.òöutÌjHà ÑÌùÌøã‡—fóìÇ“l¶Ÿ3õ*×ñœlßÛ)IÇ/Ç¡ŸUúF×Ȭº~ða­Q'9÷C’Ê÷n^)þ»Ëz¹¹_g¹‡nLö{•¾.‡×9ÜÕSœø)I/¡ÎêéסY¸¹MÓ¹È0«,©kå¥[-.?Ú‹¨ôÙÝf)ýwðvŸD‘sÜèå:µNB;œ%ÙgËS«ý×å©ü绌k§ÎýnC,ß.åY¶ËëHÚA¤! ¨…*èYH )Ï r¨ƒŠHeí *¡-d ¬ĬÂE“¡ÂEÓ¥r]*‘¯ÂSÓ³ê zZ¬5i-Öš´kMZ‹§&­å ja­Én±Öd·¼OCv‹µÁÚbm°¶X¬-Ök‹µÁºÅÚ`Ýâi¢g^2}'äóŠ b^+‹Œžeô,ŠõÌÇ…Z7ç±ZÅ_Ww aÙäøuÄ]}li?Èû4ÓãVüýÎ×ãMendstream endobj 362 0 obj 415 endobj 360 0 obj <> /FontDescriptor 363 0 R /W [ 0[815.4296875]3[722.16796875]6[777.83203125]8[555.6640625 722.168 777.832 333.008]14[556.15234375]16[777.83203125 777.832 610.84]20[666.9921875 555.664]23[777.83203125 657.715]138[443.84765625 462.891 406.738 500 389.16 277.832 500 500 277.832]149[277.83203125 777.832 556.152 443.848 500]155[389.16015625 389.16 333.008 556.152 500 722.168]162[500.0]344[500.0]507[333.0078125 333.008]527[500.0]556[333.0078125] ] /BaseFont/GFEDCB+PalatinoLinotype-Italic >> endobj 363 0 obj <> endobj 364 0 obj <> stream xÚ̼ xŵ6\§ªg¦gßwiöU#iFš™–4’¬–%Ë’ñ"c[xA¶ÁؼʛÍÁb³$Ø`lvlA$@b“„Ø$„% äBV |!|d@Œ¥ïTÏHØ{ÿçù¿çùÿofºªºººººëÔ{ÞsªzBÜDÀhýÔî)=ñÀÏ +aÃÓæÌí™OK¢Ša©Oú»¦Ï]R÷×{ QWá¾4uμɿ¿´ö%ÜŸKˆiþùç\´žxˆ–Ç7ñ¸åüÕ—®Øò›Eµ¸ÿ}BÞ¼býùk&Åc2!ëúñœ;ºçôM}kûŸï"äâÿ…eÞ]¿aùúÿz~LÈõ¯¢}oõºeçÀƒÇëßr?»rù9ç½rÛ´Çyð~ýe›6†¶Ï:øîcýÌ·~ÝEüµùZB¾ù:! çOŸ;§÷¯ß þ„?â5U…•Xu’îBþs#ž[¶æœõ‹^ïú÷o#$òUË7¬­º úêé„Ðõ“;çL¹|àæß±~20µÖœG}Ö<­ëß¿æœKÖëgë[ ”°M$´öœ5ËoÚ|ó ÜÇöß^¹fã%Ãæ±?XÛtÖœlã–Ç)øê%X~)áÏ^G¾? ”8 €7+$ …¤0†"¦%¸Ó·Á“˜>Lñj´® ŒžOÿ…éô¡ô3eŒ0öU¡ž€ºº…^L÷ 30=Sø¦)ü’Pá?„_aú5á5Ìÿµ*‹-ù ™ôéäL2Ÿ,&ç‘Õd¹Œ\E®%7’›Émärù&ùù.ùyŽüŒü’¼NþHþDŽ‘?“¿à¶–ô‘iJ¤ Ã(‰a8ÌÀ°‘ä ÃxŠ1¶KÎ%ó0Ž‘z’ÅÜiÅ0Mj°=˜ ’†d2†=d*–lÅsÎÀ=3,ׂçI`:„5äðH‚àó#aÁð ¼6Å+uc=nÚʆϚTãÀó4xÄŠ#ÀW‹`’ë'î÷d˜}Z åøós¿Ÿ^׿¯ùŒéo+ñ½•¸P9~Ke?Žc”S¶ìÒ «Iàü ËW‘Øês6®E¤#ÄFøÇ „jܼ~e·GÉé'§ºOIOû±¶‰Ôçg L¤.DIU£¬Šxb®„J •ö‰¸U!Š/þBžHšÀh×JÃØÇ_* Ø~Š!CL@$(ä÷"òµ‹.X»‚Ü|Îê‘ÛV^pÑFrÎ例Ö,[OF”ðÑÕœyâ<ŒÈ÷Wòð‡JÎ ç­_{>¢J«rm¦t¿:ßS+¡¦ÒÛDÁÂÏÓ:%Ô+¡A JX~ f%´(¡U©Õ¬È>;öh J| Qzꎅä\”Ö²æ¸qôDÑEküPy2€ˆ©´Î.Kl/· ¾V>Ãå|zn%^_‰¿Q‰VŽÙå»ú˱ª±·•«—cÍ%åzµ{˱îÌJüJ9ÖÇ*ñ4,ÿ¶Å†#p ò͈ìj¼Žèj( nG­›€ùp‡/€»”x!ܣċàJ|6ܧċ<2Á•ÒûÊ¥°•">IÜ]9{åìû+gᘄ•²åî­Ô;|J‰ƒi5œ…mZ€5-‚A¬=¨ËRxW¢"{G5 À¥1áó}ÊKÑT%ŸalÃcý•qÌϤðØ»·ãUuÿOéÁÊS©Ü÷7+÷ùpå>¿S¹›ÇN{JUJ?ò…§ô­ÊÙVÎ~ü”gðíÓžÒ¡J½OœRâÉÿæ)qüdð |ëÇq‚wvöÅ{0À…° uõX ë`= Á¸Þ„?ñqOìóZΆAX KàðžéCÄ[ çÀ¹° uýrXçÃJ¸€¬wž±‚ä JÐ mГ dè„ÉÐÝ0YÃTè…>˜gÀt˜bôÃl8æÀ<˜‹\âbØ›á¸.ƒË‘Ylká:¸n=È1và 8¢9Ñõäò5òud5;É.röØnr ÙCö’[‘¿ÜŽ#ôNr¹ùÎ>›p¼ÞKFFóç{·‡á»ð4ÞóÂð!œ@Ýüz'_+a+lƒ«àjdG_…í°¾7ÂΉ;Ù7ýr'€¥«P MFý=ÌD4@<[Œˆ¶1m-¢Ú&ĵ¯ ²m¯°Ä½xÍ2OÁ³§ãÖÛY¸¡€çždn×âÆ¹Ù¯q{·¿(œê`@ 0þŒ#Ç}·âö#D·½¸ÝŽÛÜÅí ÜžÄí)E‡Ÿ­ ËÉ*²ùúò ò+òrœüü~÷öµÒÐ#ô¨°W¸]8 <*íÿ¯dó>r?JÎADÐQ~Bëê[( =ñmÔ˜‘Cäqòy%ø)ÔŸß#ß'O£íumgP›>K~D~Œ–Øóhy¼H~B~Š6ÙÏÉ˨ÿ’ö*JÂk(m¯“ßߒߑߣ\¼ÖÉ[h±ý'y›¼ƒvÛ¡­òZoï“ÿ…2óòùü{¥‡|„=ýOò ù”ü‹œ Ÿ‘“d”Œ¡¨P`hߨ@ A :Уµc Ú%Çá#ø'Jˆƒìø’„Üüÿ‹„ ü_##;þ/‘‘—þ/‘Àv«PÇûðÞ¿÷Åõµ]Ñ̦q.X܃7Qx)"*÷H\UÈ v’›¡Z‰÷@P‰ï†°ßQ%¾ âJ| x±Î›Á‡áðc¸Þ Ü·pp?ÁMÀý·gE»•v$'R^–§¿ Gv²d¼>¹[À½È¨ØÞZp3É|r®r–ϺGI9yý C1€‡×Eœ“à=—ó¸ŸãvÈ_…{|ˆb‹Â¿pý³RЧ?‚O•ÎáíˆÒ_ã²Ry’ škë*†|<‡Ï® õX/Ô"»Iáý×)ñH+O£FyÅÓT¯<¬ò4rÊÓhàOƒëE;ð§¢ÃzË-q)%Ü•êÅw…á×”x¦Â «ð¬ÚÝŠæàOS£¤ÎH=Œ©•ÔŸÇSÂ|Âg*©oURjìC+Ž›ÛMÎVìn[ÑvãvÕØ§cÇÕײEŠ\Œ‚t_=þukÜšhSR£I6a˜lr7%ÕIÏM6%Ít"31þÕ4Å¥&·Ëírñ Ij’‹$5n7¢§#ߘtD#ÅB¾Q}­ ïœvÿì§ Ë5~eY0f;Sª 6Ô-l œ¿fFÄër>%Mófü³,~¿ÔéuÕ¬ÛïͪΤb³Îž½Ç°òpLçóÎHx³Ï®õýpõÉCX,‘þ&ƒ?¬±×ÓRÝS»(ÜÂÖ^ªšÝ¨õ÷»c‚¤Ðξآ‰„{-’*er&„’Å›ÔJÕ=¾Vw1ç-xœ†ØŒPÉdK…뜯É.tDGÿªOÔõÖ#Nm6>¿÷Çv«.Výû*ÏýwpT>(6Â’üËù7òìÎüCùïåÙuùßäß˳l~gžÎÊÏŠ ñb1·0z÷‡2ûãp@“7†4q•¡&Õ5DnȃzÐê-:Sï=¬ÉÃ,ȃ6ß’ïË3Öà5¤ Ì—X òñ|cü*Þ¡Ñè Fã¶PÞ å±j¦×Ä™Amp†)‹ÖÔk8™¸ÁÀÜîæ&•¶˜T5©¦ªØ“H&T.Õ2•ÅåíÅÌU¤IU8½r¯l²HÞêøH49ÝNÛ‹¹áüH‘÷\ÑV}“cÄn¶ŒØË=÷Nexóáwü˜å˜å¹ á3Ñ“|dã°k^éUߌãÏYóÙÁÁ|VéVS}yŒ—»ôÔ!ݬÛÄ6à 9(÷§$ù)ïNÞ›nwÜ­Öh¢ÉB"A]ÅÜMnM {’:ÕãóZÃt—„‹­þØJëËýˆž£óŠbB¬}{ZŸ;Ðú§óžÑÕŒþ­õ¬>uþfQ¥ýù¢e|Ò`,¼§Á |Gô ûEñ–^õÙ‡F0»~…^5º¨”qÄ´È}D—ŒýZµGu'™ …'JF¸0ÞÃc'åoo7¦ÈöÈÞ GωE·E…¤š àŽ4EhuÀ¦ vé^ßM³Ùš¦¦ödgM»ÐOÕ$“Û:ÛíÉöv´ó•Î7;Y¶:;mîûä#p8:l@l![¿m½m«íQÛ+6–ÙB[t]ºÕ`³V™“@°2u¼eXªn¥‘†s![˜UØW´¨ƒÌN0'ؘÓY¥ø1µ\uxì²wªÞ1«ífttXŽgˆÏc™Q¥b/œqì˜ÏrÜrÜÊ»!Y®ÏòoÌúŽ+˜^ŸÁ..Y~¾’ÍË7ä*c¶yp0Îù†:‰ÑbÁ‹å±ƒËÝ›L`G 8p4ߨ¤Œç,27Ž^ìpDc žçth# ¯ÛsÎ/GßÙ~Òæðï>+Ä\"ŽÅâO.øæè_ï.íùÁúû7ÄÍ¡ŽkEµ.úhqý•Aœ6ê ¢ë,3 Ö‡oÃCG`Á‡ÍÒ¯~Tûέ“¾1z˯.ùÅí-ÏΫöù=b1¨™˜ÔêM®Æ–äÞ0ŸC°}¢>ÇòUÉÿÜá;ÔpGôfá6|¢‚Û§À§S@ãp;è9àI{àX¼<zrÛs4‘“rOäØ 5À2Bšdçæ,„uÏê^siCêÚö”n¿ÝŸ6pTðÌÚ?·¸?×w »õ€¬ñ€v¾p’fg[Z@v"Ü:Düu¯ì¦›s° Ìm.‘A+#.äæÎÝÖ-;º»åñk:OznwN>+-Ï’»‹/§!™nJÓwÓ ¦áÝô'iªN»ÒˆéùémkÅdx@>,¿ 3 F&ûPž¯5ôÊgÉ«ÈYéÂYrá‹wÑ»-µP[;½¹j8ŽG"#![a¸©}¸Ô4Ri¶Y‡Mâ°Þ4¢1°ÙÃ3{‡Ï˜9rÆÈtÄšwŽqA޽sJ¤°ˆã s*êŒk’A®K8à(_=¾•¹FE©  ñr íPihhñà½ÿNÀTf¼ž†*?¥–¡!P56Ù*H¥ªˆ)Õ0u…8ÄË|­ÉŽi =-m²Û¥ÓÎVãPPÃ/à÷÷\ÚÛ¢tà^²V´³ ¶éU]ñôej•vô_lÒÚ|Ÿ­:QÝ?vö`9ÿÓ•›²Ì8‚gñ:TSçÖbZføî¬2Ê)äCGo]ÿ‡¤Í©Ï«ùâ_B@PÑ“ïuØ\ù*ý¢¿ÀrX´¯ÎáÆ3™³ôp·4ìc»é¯‘•ÙìÈKß­…÷<ðn=hêÁs‡óVçA§ “¤ZOS“ÈiØãj«xì9O­à×§DÏ%j»¶Äˆvð²\mí6EÝ^ëÉٛ힢ÇZ;¸™ýðØ'r…ÐnoAm¶¯"ÍöB¥¢¦‚ZÊFŠÃT?,ÒqDmKÇüÃØH`$‚övE´Þæ§§_§²&4ƒ§sþå4· F×h¶1Ñãüûyÿ6ŽãG?š1. .7ÆF•Vh»»æüÍØy l:Ê Ó§±ë6bª¦Ü“[²ûð³h½Í³³Žé]¡÷3Š¢âÝ¢b¢Æ©yƒë°‘¸ßªÇ©Õ‚¥zñèOGkFÿ”°ZE¦ºY%ÜØ§B1¬Hþ"»b€çÃð|^ ÿ&LˆÀ¡Ã!ªå÷+6g/i²4QC¦¦6â9¬Ðň>Èéâ|=#‘me¤±ö>y]H6”¥F–Íj$$‹ïjàTª8U¡ŠRE ©b¹s=Ô×ÇoÊ8ë(Ø|ÃnÎí _œ0*ŽGEòEÊ8N48Óx‰Ó‹ÏÙÅx'•G-öÜOÇU ò µw'±šç )4‰&^öè5g`æe^³Ê\{‰‡­_zåÞùN‹5®Íˆ ­vtßh~Ê¿ç‰|¸hu¢Ù’þëÉŽÛ¦4³¯e›¨}¡(0eqìõrì•.ø¯§2¾.{#ii« îtÂÒ) v€öÓ,¨³ gY®·µá´$ւ޹øÞcUa)_(D‚aiQæºà‘$d‚û݆âþI0i¿Ô¢ž¹Ü–SKfc©œÍ¥u=è¢ØÀa;ÏF…ó 4W(l³¹¶BÑæºÆ 7d¡' 4Ô Z’±d(q[ÜT—Íd®r»n·K/ ¢uT yé*µèP«E¬¹qĬKRw»ÜÅnµXT¹À°Ï9bÙEͼáGåY8„]S\»×ŠëÔ Q»ÕTÏÔÝêUdŠ«Ð­.ðæÚr¢^-‰ÁÆríÃ2ʉ‰2ý°É6b± Ð;Ƈve„+Q–‹„íÁ•@¼Ê`çØÿQøâøÈWô„ªbžò±>4„6J%‹‹•­b¢"7BF\¾cƒ<°¼=H††8—Ê òÀÊ2J‹*”QÄ‘Úퟋ"ê°OŸq¼Ps“EÅRÀ4Šfi¬°^'j†ùõÙþ¥5³ÏU3mß…½=:©æî´ñi ˆïSnÚÛ®aâåÞ†ÞÉ~× ]¦ãäóË’Õ¹“ 5ȪuhšŠ‚ÿNø>•ºb AC£qž{õgÓØ—Ä*§š#=Sò3î½ú®'³Ö³çNþçØÒ5U@5­ÈWr\2¶[õâ¿•D”•L¿‘·þ6 Üî…;(±iŒJúízºÝ 1Ç5zm\_ ZÖ¨Fߤ§ZŸ|æóefæ³ÔX¨®ô*SC Ÿ0Ðx‘SJÚêt5u³XÌÚ|[´ í:Á¶…ÄÉjˆŒÑ¬JvqvëºÉ(ÇÙmð&•Ñ®ú»å™ÇVŒOÅ­@°„AŽJoœJ§Á½`³!i\N ¢‘zÚ„0žoŒUÌK»dök0ù—ߺç“Ñ«~sñ«û§ü½ßáÖÂe‡V=:úÙÝôÂ÷iàF úÀæ=3úÙhÛËSîþÓûÞºì|ã勹¡û‘ѵô‰OùòBFûñ{ˆ =°QÎ…zÁÜ ï´ÃeÙë³´%Ó—¡ªÀý:·ú¼jZ¨©úµjúx’­@zñyq—O²¶W‰mn%–ÏÒ{»#s#ÔqÀÜy ôú’9/ØYjs ^/Á¥y¸Ô ×™¡”Ïo3ëf³¾¤GD "¨Ôm šƒW 2  †‚rðhðà i5¯»9“‚½ÁuÂT½¹ø®D=¼«ÿDO“ØÉSqlë]Ø× “«ÈT}A¹®‡Å“r’ŸœDüJ&Ó7‘è®èþ(‹Fsòp×È®¦Ør7UxìîOY5ücÜ åœ°1«ôéK§)‰qÇ‚2ê°-3Þòpƒ$?¡-8…;McpÕâÁ²¹²A©¡l~YŸóÑ)å]N7f’Ų“F#ŠKUù©?w ¥þvŸy`ÉÒ­éWîúÓ×—ÎÓOž¶àöùwÞйP¨²ù3fwDÏŠWkÔÚU÷lùoU½È„oo¹èï÷æ²bxÅ÷Wï¹Êæ¿áìýîÛùËî¸.å×ð"eRùP†ºaŽü𥓯›LÏR:ꨥê¤+I]2lO¢Ø^ó-+-×Z˜hƒkmŸØ¨Ú êÌö Ýîßá±ÏäEjÕ}miíV²‹¯šs„î«~Ãøø_ö3³ÿ ?5úý†¯”,9´(—æ¨9÷HîHŽårɯÈŽ—t©,XêØêØï`Ä‘sÈ$—"g:½½ŽºH$"Õò äy€j2Œ‰ü¾¨Þ`4™-V›ØØËÖ×ÕfjÒ:™±BÀ£åªD{¬ GÇUIô˜§`÷|A•x,ÏZ¸'…ÃÍÝÕs|vbܨÚ0ĉ*wˆ çâ6¸áµã–ç²(g¯o$Í(OC¤ 9 .Yó<…»;MydZ`âZO‹IšpœQš¤q¹¬G«¢&]F˜¶£íÐw¤—\Mï=ÛsóJÁãD…?óŽE»Ïl_µíÂsjùhäÞ¯×_³_+m ¿tu×âz°{Ç97þîâI†sïÅÝgÏØ}ÖŒósO¨ïü)»Ž]7GûÇv«—¡¶çk†gÀ•rØ‚½I˜Ú>#èŒ>ãõÆ;Œ‚.:§ÏI} :Œ„6o´ôNIü4¤pD®ªc]ujØSWŸíÒäÕ)r §õ@WaÖkG­ðÇCn¯dæ=° ê.…»{¾6 ]==Û4Y´@²hª‚`’ 2C5KƒÛìf‡=Xm7‹uõLÓ•íÑíIóLM¶8Ól/jfiÐpœ©)˜gšW‘™æ‚Ýg5MX—íR·«Ï¦#êÁVsxì•CUáÞšÃp©ìÒÛÛ‡K#Íùai¤™Gª=Ãþ‘ê2ð«àÎñLzNuV‚q–‰ùœBΘptó9ÓýŠæBÉšñ¹3‚(Î ;CCH¸ƒû"âã £F>’H l(.‰ -Åme*YJÓiúëKÖ(0Õí¢¡“5g¾õÐÚGϬŽ,Œ6÷ Ñ\_ê¿ Î(¸lÂ77¬Õ¥CáúË1ómk¸;â<‹ÎªófeísúN¾ô~:ÍèŸkž{ó@éè÷áý3ÃNd¢5¨Å~·ìÁÑ?^v•ä¾hõ7ÓÇR²©¹÷NÃjGrpô£™Ñ×n«Žªv+6뺱U¿BýU®'R\+€›»Í]ñis´ý^b#3íwˆ7‡mc^rGl. ÷^•ÑF“܂ӛV%IŠy¥±´—KÕr[@"^ iˆ¥á<ïFï5^¶ªîòºêX]zVú*¯Ûáõºou‚Ûéö8· Ä!Ä›ÆÊX]NYŸO²õåªIؓñ‘Hõph$Â,ÃÆ½zX;¢g_œ!ãRîÌÊ»Oó—m3Μ¿ÅÙÌPUe£!3a¿(2Y|JQ³"ªc§Ø´fÊÁf'¤XHF“§ ø¹ßàwïÐâòË/¾û¥«Š¬†¨é_Ž}yÆîë{4‚¦§nÍèM£o[úAd–'K Øb­ÀŸ9ú­“Ki5V…Ôå|T'©GO>½`4Ä-‚øØn6KP‘”òÞA+|ŠÆ^åÓFÞ!½˜x»Ô.ЙۃíÙöYíKÚ¯l?ÒþF»hgí²Ö I)OuïtÓ7M?3ýÞô™Iµ¤}–`¼8/|¤ýƒvµ)ʽ‘Oúª{ÕÆ#U7 —™j±úï™áføØ÷™`8R¸'L§„@šBóÓ ‡%S @D§74·¨ÒZ½AËm$â>Oº˜Iù|ôãÐái#ᜤKƒN“6}8C F-^/ìHké´6ŽôZ­¬ÕImÚtñ-˜µAmV»Dûˆöe­Ú¬Ñœ]ZÐjCTnxÅ «l¥¿a…YV0[÷YX™™YÛ´…rc”va{èÁ”œâÒí4˜¤T*~B\ÅH$V*FlŽ’‘£%ÞÆ“Ã6‡TDJ&½\|£øA‘™‹àdŲÙå÷{|¾Œ'£¸ª¥Œ)’øÞ!ocXým… ŒeøO‹7ËÙRê.Ålæâá»Ê=ƒ³,n`»[Æmë ø›ñVžk6¾§_þË5åpY¸•ëpGëxU àgž£fÙr®|ÊÅùä°Âíq‡(XwkÔ|¹ÔA“‹Û$†²É­.ÔMŒÃ¤‰)H(Ùš’Œõj„_No4½fõžÑ“…žÎÅ-_Ý8õ¬seKÖ{ýõ~ksßþéóûZœµýv{ì—7eg?õ¬ßð¸\Ò²ª•½úêC«ÀònßâÆXÂfÞ1²ìÂÿªIšéeQ¿eöNLk ýÈk£'nä+‡å±7ÙRÕ´ŽótêS$‡Üå‘ËØì’*¬J÷ ?X“ œb\œ"²D˜ç€Ã^èÒÃŒÐÕøj¦Õ,¬¹°f¤F=ͰÐp¡é\°·¬€/4Ž 6ùL MšFL*³š|aIZÒa–@9äKE.LžxZ û‹Ô\\R\WÜW´Z$XüðØ?e–š÷…,Î8£€ã9öɵWëtüÌ]¨’C:Èé _·U·KÇ‚:0ë–èÖéöé-Óu›âÛãtlÚâ{ÊG_ôÁ‹Í›aÐxÈèÕƒ¨Óƒ©×} ÷ù}h ÄvøœŸÏ ¾¸³àôÍÎç,ççN•Ù fæ”S™^³¸BÃQÙdíFÕ¾»£±Å›ërŪTæÁÙ¯Ly¶LÐºŠ¯˜ ¶0.Ùü)$®2"ûaÍO¬ìgS¢EYž@ñFùò¿’â+(RͽCe#J•d”É2¨ˆ}ÜŒq*èrñùnŠú¿X@_^Èr} ±²¼+¦©ZMáÛ¾ž×|° ÓèYºnÇÃýó6G{®¤•SsQ|wIÏ™ëwŸ“ÌLÞ}S·êˆ}ô™ÑÐ#;k—÷îýË}›–œ‘}V®¹â7‹ýz· D¯6p¢³cÑO`Òê5¥…/ŒþŽÛÝcd1öêT¼í#ôØl+l,Uئ-jH©›Õt¾ÌГL(óf†ñhif}fk敌ÚÄB‘ªpI^¾8Ìt¡°7šFƒ (xî—íKœ;”8CΜ³ß¹Þ¹ß©&N‹s©s«sîu¾âüЩőîŒ^-Š\Pu9É,®i€s Ã7¸Ýz[©eétâ6÷½+ëªÃRð6‹Êe±œJôyGò‰Î‰^Uz´lI >ç;þÜ`c#'ÿx¤ŒYCŠ£š  r|R+½3‰6ÊÝFýRægR}MÏ.ýéàå_©6{öšKšÎʪÍbPÏü¦ ¶,;wFÇõ—½^eX¾æö½g¿|ÇÂ|wMƒqóe¢Øå0…c5£OmÙ2TZˆh“{‡½…hS SiIžüƒ˜p‹@ôéƒå¾£}oö Æ×Û@ßíï¦f± ˜ÿ<ÌúDzÍ/÷¹ogÕ)déP$*ù*±²…ø¾ü&´Sú¦P“ÖUê4Ô³*j$?>0ɤÊ6À• ;hÃ×Ö”Zï…­^P!å$º”×SL 5î·Uð¶$Õ€jXõœJxàíàèðS`z¦òø2’›¯cn¿æ§5<¢Æí¨©qCÊÝë®)fÝp¥ûˆ›šÝû0 îýîÝÌÊðXa׸îl¹?$ É¡þЮÊÍB\N\—âí«IæÊm34ÈÊ‚©œÞ$ º²ÍÕ‰ÆJ/w¾ÑùA'3w"”tž¨råæå<‚ˆ”Ï“bS:ÙıÇšP£>–‡ef=ãê³£¬X¿¤TÝ+²Ê¬ ‹Ë'T&æQ³~>Ø“™Ð–•ÉK4‡”IL…:ñYy®V‰R w—Oâ‚­D¨RA©Ÿ;BÝjî}V4h“{BŠ¥¦¤š”­²¢µŸ‚7(Ï&A‘gÅmÆ^ðfÛ6UihUâR½Ž >–pú«“ªÕ£¿š¨ñ5Ì»ñ|©´¶ "þˆLüÞ†ÅçMš‘ìh »Ü‰ž ¨±#=7úÖÉŸíj³;rK™Û8û¢ººøž{á‰ÑÑšõ“æøÌ¹Kk¼Mø\eD:ù­ê«Ï|ï,©¦¶ûím­>J?A>ZŒ4Mj .»uê55é’`ÍÕʵÔ\›­¥–â Õ¤e!Xܤ-öëìTr…!¦v¸ Ç ‡` ¸"žjb† PDP®ž´ÊÄŠªÕªX~´*¬`Wö¡áËãÇuzÉjõp¬·ˆðŠfqŸxDdf±G7 £‡‰+ç’]ë][]»\js¹L=X-+^[V/UWûoäxÙ*.Åç‹Kq“à2)hõRf®>gg r w9 !-+/ÂSúZ)ñìâ p¡H,>…eqÙ(óªr7ÓŠ·S£LB`çÂ$ZQ*vF¿¡§?Ô¼±eΜá==Ó—žý‘¬£¿wÇÓ£<½\JÔ õêS¯y¯´oX°ü;6÷õO}ÝeIýRyá…·Øgïè‘ ¹­Ðd Fyò¶HõCR‚óäEæ¶`Û¬¶um‚¹-ÛÖÉ#mo´© Sµ iN6Omf6DµDâUñx¬ª*ì÷%|ÍÍ%QÛ¤­I%¡¹–1X…ׇ™‰…þ9—«¯ç¶Þl‘vñyÈ&»Ýjõõ&^HPÑ÷‚j™¶InÚ‘ð9 _SBëkõ%Š>Å“nç¸wTnÕ%Ì-ÄãÍу¡P• ˆ„4ß&W‰b­Ùj5ÛhUG°«\·Êæª\CLJ††ú­µ€;Ï{ ¡€üòŠÎʬr›‚|'ŸåJ§ì@8ubús#Q!Ðü\e½MÙ»é{ Óüæ*œ¥!gѨÚÄ6 ² ¾ÜŠd³Yïç!àÚ(Ukåî€h$)5UVÍ5Ù'æ´›& 8ÒyI¥Ó‘xÐ!­[§ÍÖKÒUË͆!³·¦=Ñ3iv¢¿Å]²¢a¸9Ÿ²‡ïœS#wט]®™µÒŒºÆ+;ØcG½†œÜ?ú§ß ÇÝöÅ=êæšupÞà÷@Å€6ùѶ›¢þuMšpºuÏèGTGØØ¯N>Ï>`Ï’,i#Óá1¹{y–GàÁÂSúÖï´Ò©Veƒ¥w¸ë‰.ú`ÏS=ôð/œAŸë‚窡cæ3)™i™Iµ“°y2ˆQ´í·Q©ãðØ19£5I[£°5çvÁÊv¨H{o§Ó±Õf*G·îëýH‡¡]Öù÷ûøqìû¹pÔç$%ö”X68]’ߟÐåà –û´ÑavÝÕ«“]Õ’N6›%®¶wûË XŸ’°$úLË!ÚÛ¹¡‰×bs¹%Rk©ÝUË´µªXY„·Õj4I¤]Õíôîµb“¬æüa¸\Öd¨Tæö\C7î?žö_\‚¦¾mæ¦Ý†ŽãÊTgv0ϧOòYËq2\% ¤qt(ƒGKK™Þ(2ˆÀŒ‡/àÍ—¥‘k%ÌÙo¬L² –gP[Z8Š œd”Ç-¸ŒâÝŒ+*dœ¡PIMnʼn¥¸É•YÎh…²®‘ìŽqß'ʽâË’ÊÎPXQ×>½Ú¶ùkÝßÎ7»6¶¿7Z'›_’_—ߙߗ?’ǃyŸï̾|ËžƒN™8!Èœ|`Zt&ɉ†jGÛ ÙïJpÞW–x,ǰsnIÜ—x,ÁžMÀÖÄ®ÄþKœÐ lëàgG‡Â ³l˜Üè+3ÁŽ<Ï%ãJZ™Uh_ÉpŠý9át)S¹ óŽÓ}-CC;*îåÊHT¦ø°ThÞPfˆóÉ/\EQ%|n I£MYÝP^þYÝØVYëén,ô TLe¾uoÅ$F#ˆ )tÒ-Å&¡™0zNå•|ùCy µ2‹š´•—D”É%üÄ[s›æ)ˆÎð‚©A«èš#ë tÎËa—_liMù«Úö\ñ¹â—Y·Î‹þÚ¹¢ Á!jÿÎÉŒð÷‡¢ÞØw®NYÍR–ùôÝW×'|ÁíŸü­3fNzx~ÏÊç¼¢‰¶Ã[?‹ûœ…PF¦#ô©î&zÒ@áGò¢æxÜð© zÌpV ´C¯´µÐ‡ª½ÁtfvXƒÁÄ2Äæ ñ ãFf4fªªƒÌ£ €-ð¤<§PïK‘ÿ”‰|L­vz¸ÿîa·»ô»Ôû©)ö;Ïûž¦MySTëñzè©çRt óq†º2OdžËËÎô çsÎcNöÊDÞu‚Çy‰ó]'{×ü‰No¯Óùc'=ËùO'Õ8“Î'HœÏŽTÆ‘JeœO*ŸÊ?H9µ$µ.ueêHJeg©TaÇJ1ŸZNò©B¥½Ú·  cB :x°Š¯%>*G &©ªÊg4˜6È 2Š~ƒŒê ùŽïD´þVkÔe-›Ô–²:)T”¸|v"Ý¡XÙ_Xªó¥åxCЇ¥,Â|%æéëÎÇ g•I9«âˆT(Ð`yÆ„OÚn‚Beþ%’ŠUε7u*î´`l\$Õ;,êÊEj&e£ÙÑ:víîš´3µ¦*3¤ÓÓž[:œˆ×ÖÙä6W­_¢rg×$¥y¹“Ÿ¸çÎjõ/Û;ºzZjó¤óü…hÝùï‚P1w~ö0÷˜Lûœ@-§ 7š“Ád6ùAR0'e‡»WdàfNYÄmNX‹÷¸aÀ jµKMm {‘§b2ð‡m)}4JµÑ¨ßl š¸¯Û$¸4fm)¿Íá.¥x@€´t?å¦*(Â`6µßå§N uñqêò*ÇØ•|_þ&zùÿ+½ ´×ïúa“°Wž„›6Üì‡ ~èqÃ^÷°›®‚€®ò_î¿ÁÏá;@)Øæ¿×O™t&¸¨Ñÿu?Mháv ­ÿv?õŠn;åf& uïw;8½rƒ_p»åºÉñú¤;Ý w¿ï¦¶€»Þ}ûa÷Ü*³{ûJ7ó0w½œ¸?ÄŽÉ1N»c1 £lä’ªGÌ6u'l.޾ËG²ùü© I*ëHÊ0[y9å”Y»ÅåW•GÏ„,*ѸI½¸²7±"^!OYe-©²ž¸b­“Ì`%Y¬`$·±l,Ë¡ÝÖt*¾åK^±À@†ðÚjžýmn è;cjUTLr;šÞ½';Çfrzæ8Qò~T—¬Ùs kß )WÅy‡²7iìMÕo‘OÏaÇž"hRV‡BR ¢6›äâ“hˆÏ‡) dÅÿ“fVbeKð}Ù‰`5Ô8Áç„í] í¼®“ºX€—±»JÜ¿†eyŒçFJn~ΘÍYZ Ã{2œœ Æß,«†}ó@œ¤*÷7Õª'ƒªÜ“““§Nf®þDO?#ó 7ïè<úòeîèÔ(Ý…x4º£Ôì(•š{ººV U"ìí‚ÍU;ªn­b›åïc‚>U?­ú]ýî4øÉ´ßNûó4–êƒ×û@ìMõ®ìe/ôBUW׎ÞiŽÞÞiSgŸ5›žå8ßA7;v8¨èxÁñºƒéµ*¯êSs³ÙÇu¨T4ZŠ7WMëêu¨fӹͥâÜÞiŹTU$½–Þ{Yëím¦Írg§dn†n¥7šÁÜ<«y]ó•Í4¿Ñ¬br_óÍÂ+Í`i^ßLI³ÜLµÍ„¾B)šýÊš/½©«/Ìí-Ì¥…ÿ¸¸RxTf=˜˜^¬«­?˜‘3 }B¥aÎ34Ä2©ò¤ŠlðX¶¢lI–I¡IØÖI'BòôÊQËQ<ºuú®éû§³é'<â­–©=Ðí<ÓÙèêqWÈâ±(.Üò§ÑšçŠgøÚác­œ<ùO+ Ëk|Dr­T™Á?}qxVê¶ÅçpË®àS—~QY->•}U@Bùž:ã?4±mb¥‘B¾Æ5ØÐ BÀ°n(»ù쿲i¨ A}XY\ª,L€!åm¹ÌÄÇÊÎ&•ubIYï1Îʸþ+ÇŒ–ç̾¨¹o)¬LQŠümõ*s)Ðä®65M7èØñµú–ë!vvƒ£a'LYذlzµ¥i>"TÝÝý¾êˆÖ[â0ø6ßµ¬;Q?hž5P]½áþå²i¦ÃúÊZP=(T5.ó·í}£=ûu5~ñü«Ý£7¾×šöu^clU4©Îžµni±Yå;îúóï4NTÁ¡™™Žïürôõ3øÿuL{Kp±#d2›òQsT³ÛKÃFèn…î6˜ËÛè?| Åó)Èd+)û&”«ƒ88 n ævØÙ K»!Ô-wÓÃ¥Õ0ZlŸÒN[Ü}nÚâéóPM4mŠ2¡ÝÑkgº'‚|•–}ÜjTUr‡ÛãrªºV°‰­½­Ôoó$pf}`ö‚‹µrÑnÈKJ\ŸUb¹•ºWö…%Ÿ·Ù×ÖÊŠŽdª†EBi iKšÓ鈨Õ3Ft[uÔlÖ!SÐ阷ØáÖÇ|··Ä_I£{#ÏE^‹‹{óðPä{Ê_VÆž ¿¦Åà„W„÷†y–Úž(·÷…Õá+ÂtuñŠ"õ†Óaª•ðoZT]þU„H8¼£˜w‹ù''ºãµÚÁ­¿Ùþpï|º’^BÙ°ãcÕ9àÏxM`ö[Fu ´FxX£Æh¸É;XíÊ‹]”syXŸ’Ïå©6¯€Qkê%t?=JY¨ ?oU/žP袅|¤ĸO†JøØªJn—©iã”NÕ$e’´$©–ñå¦OêMR2®Óêàlß/)Ÿi¡F&ªã'êåf~—!Ž1Í»š÷7³æU‚ÞVƒúVK'Ô#ÄTLc£åøàG—2ŒL€ˆå¹ò$5§eHQЄœöÖd&;1Mþoà£L2†íĘðó/gµ S¶µ|þâž‚x¸(ˆù ÃŒ{ex¡†?tê‹×ãÆ!GŒ²M7´a_­^¦Á1¸Ç_1à4îŠW˜}™5—K+`¡Þdì\î_lвԺÕiK•3¬«ÕL{ý˜Lô‡wèõlÒþ^O°:”ïKøcò-—Oñ þ)^ëóTìIÎb.s`z«1é¬ûjü zé7Æ«§Œ~4zWG|)ÒšÆ B™PtÏóà•‹ÖÀŽÇ ™öèù?)ŒífS•òüß1÷ÉzG$–œ<¨ækÇD¸IÜ.2­´N”FÆó§Ã’Ž¿LÑs ž«ÍÈj:4t—ˆ¬LÑ\ à!ùêf²ŽÐ#a²ì{ôU{½K7uÆÍ˜o-Omˆ¯P^ªà3áèl/ØÊ†1UÖq•ו+.v] ,yè¯ÜxÏžÑ϶̹¢ed còy Ó5g–îØ“ž÷(=õõ‡}àÑ_Ý0°¼½çï/[´¶yt'||âFBÇ>>ù<û{ŽÔ’vzŸ|îæ(ìëÒ¡¹ƒòàͦx#FžŠ‹ÑÒ«mô6>ØøTã‹*m#ÏøM œá»ÜG‰¿ßOwÆ ¯ôQôŒèªè Ñ;£E5º+@ß°¨êY‰™Ã#µTâRey ß—ÿŽ {lYìÞØ¡˜`oXÖpoáA‹Ç¦Ä˜ª!Þ0¥a^ƒ Õ¶ôµ\ÐÂ>mm©¯D?-Á1¤LÍ&úü£ZJ|6#ž‹5…š:/«©k÷ žŒÍbf¢l]o¥fë•Vª·Zź¦šlŠfDà$V‹ÍœzÇ{~å¡‹ ñ¸=ÿô0›Ï>ñ»"ïYé¡óÅ•"Ug\™ ¢ˆ‹P´-<™Ìä\üÑ#fè$* W¿‚ŽÐ’Е¡}!!âÉu¡¸£6‡ÀFB»BÔ­L0V댽!3 Òu”™éz%ÝGÐ7èTã+ÃYÖ$a¥…/¶V6ËXfC6â IÙ”áV§ÜÒÔ¤ð¡©IAd‡Wš tKÓ}M´éÖ*.â¯q¦§œ"ÔØ˜E¤R¨5_†ª—øÖç2§@‘–ÏÎc\žnä¯J|Ù §C•W%+5(fq™Á(‹c1àTdƆ\Ñ—Q&óùk1ܲWÞ×â^);r»}Ü%Tæ* YQ¸ w›øHI2µ}|¤ðy jT·N·èŒ‚ߨ²Ì¨eç<­oײºº@çÀ†}ãþ\iîš_͘¶vó¤P¢ñŠ…ˆïäó†ë®†¸÷¼¹›"†HµŒDdÖêlÓèñï=Ý0Ôuöñ7ŸSÐÛN¾g¦·æºÿòÏÁ3K“ö­Ÿ¶‰[ðű?1 {‘Äá*ùé;BP²ßa§}vPÛÁ±)´=´7ÄÌ60ÚPÝQÛ+½HáÊ$d.)'_I ÎH1B·G`AŽDàˆŽØÀ¨ò/ñ>â¥9/ä¼²—zõZ‘ Ku»tûulŸîÕé›5F£S“ÔQ¬ ¶³ÒïµRmB€ôJk…ß  µ~ŠyƒO£Qku‡@‚@­B”&¨PT„°…p äø Z(_AP”EîÒ!"|(B‡¢¨öWUy÷¸Ô·š æ$.—ÅTщüòÊ”—ÏçµÇíêÌ)ó×§Mg•—@—ImÅv.ë5E˜ =׈ò˧§‡†øËCeã™p!åM¿Ï•UEd”i†ò4—Â`7Ûz{×"c]ðãúTßàwf!¥ÌöªêDÕ¬ó ©åÓ;ð÷©u QûLÝÔX}òÞ·ò¢¾éuªþkßþå3nÞëž±_Ó§Ù󤮗7ÕpÅ’æA$˜ÛÁÒžk§‡à°ÀcÌ3}Ì ÍpkÃÁªjp6ÐÇ@•uféãYPåœ9êÌÅsçXO=´X ©{Í ä9*Ú=vjÒe|™š ZD™í.YyœÔášåZçúÀ5æR¹\d¹ñbãW̸]Êñ<Èùþü‡y–ËËùGó,ŸĆÃáua €%$°4°5ðf@ÐÔªa™ò¿5ˆ2—Š«Í.ˆ‰hJÍĨìòHë¢WFwF™9Œf£G¢BeíTµÿQv”½ÂðÓÚ*îiIíñ·¸üãz¿k1hy©1›áÂP6bX¨HC>«Ìyrí8Tžô"ƒCp|_tS™ª,øSVA—Ë+ ¢ø"üBMÊ æÚ3YÏ*ÓL|5 òOˆ|’‰¯—Wþ%ÄU‹qáªÜ¶˜·uÁÂi=éŽ+¾Ú¿i¶`UÄ –õl^¼aú…Kú»“™Y7¯ïX¾Î}ÏRQ<0#Ô´(j‹[,ÎÂ܆®5K圾”]/Š­Í3ÖLŸÔk19²gd›W-<'Väò²zì ºSå"x_nÖ-©£ýu@êru¯Ô1F¿}ZlªTª°˜ÁhwN‹-f³Y) $ŠH!> Q’áëäjѰ”ɈyÔîTŒ{¹µ³"N8Ðç´GŽy¨ÚyÌIcœžOò…zßÁù1ÐÄžŒ=ûuLX¨·4zäAžXl‡ÞéÐëgL_«wsz z‹þMý‡zÁÈôÊ4¸MⱜÑê%,SÀ«ÛƒAÿgÑp8j5™¢ÄˆßèV¡hîãMW3Åæ7cùL&yBítzÜj—›d;›òYÈSf<”·(PÚòY>™Í6ŽÏ|”Ó——¿(L8S~Bq»MxÝ2ÊŠÒüÄ2|O¶üƦòE>²Ön·fƒÞY™!÷Ÿ’µÃt̓ò_ ÉZ¯ßˆF#1OåKü§díàåLGðùõle_E1¾6O²WÞ·ó)Oå•cŒ#ÉŠ¹ÝDcz–|f^°…²ý^ WuÚë=IM}]Õ²´Î|]ÂÞ13úG·!rCVjl½íQ˜"ˆVŸóêü¶Û«ßa&ñ\ÕÉ÷—Ô‡[üüíüÙc»™°Ìÿž¾ðx>‰Iõœ2$»$}œhƒ¶ lô=Tþ:j“a»á ÓøÝ~jbg_C%ÎUâl%VŽÛœåãç*qyÝ%&\ 0…z`õ÷Öªg¬îÞºCuLÛgm#„cG'_·ü÷C>…›ÿ]ÞS’ÖwC®»¿›66äX­!°ª7bЯüb±*JdÖ: –ÀN`K?­ü=A/ÕV9<‚+U2´êu1GR×Õþ¦IHØëöÐM>S»×1ì ŸTèÑÚ*g‡£ÖápÔnjÅapPOÝúÉzªÖ'ôÃzVÅ¥þor¿Í!]gào6^W‚ëZAl}·•jß1€Æ€Ê]o0ì(µ:J¥V£ªVßj(uÕ:Š]¥Öâ¬Ú%µt}-Ú\-š µ]µR‚çÉGùª8?>*§Pñ–ºJåN_¾“ƒ9"ƒR„Î"!ŒD‚'R®æ}æGÌÌ|BrñÁFdøP†%2ȲÇåp¸&ݪvYÔe$V•4r•̧[øZ€ÆSçbNõzM µ »å2R‡ÆÒÊ‹s3>ŸnäK‡N¥‡•ÉIJkèT—µ2SSa…¤ì>›ð^Áøß|`ä‡ó³1Ñ7ë3²¶Pk\|lB¬zûØí VIW蚘22ÁªÖçåaLAEUHÕë¨h¡` 9â{$ÒëLé(Ý7Hs‹ür›N~kR²ËÑlsü¯DJoålËÊ+˜«fË/WŠ·¾W¸åí è£e“ 5RÜ •?ÔÂ}¯MKÓÈ íÊñ}†˜#:ªS÷èÌš¸8uh¯~úð˜âÑot~?ãŠUKvÇ,L/ž­J$/~­ OêÜÙù¶cÞK¸`ör ŽÖ$e¤†4V>ØÙüãõó×ᘗƒ‰:~Šì%µëSÅ ô9$»ÕÅ`™‡CUùX•‡U™X+Á©“°Ú„CbúÇðþá$,^‡C²â³ ¼³2¢“òõ#¶Ž h.„uALI ÑPM†J“¢¬¥1©p£ÈÁ!ŠÜèÜê\ª¥Òã?05ñ#QÉ6x€Ûà;ÖJ¾ÍÀß&áÑ98'm(.Wc“Úª&juÄ 91"ÏèØcÂã#" J5ô,¹—¶WV/°Õ^¢­öꕼr€ ¨@´@ƒ"ÿðñý–O‚2B—Ä Q Ÿ;„Þ2Lê$C4# P1Ø †æ†ƒR#“òD ³ŒÑŠQZ1J4Ê' bô7÷jÝ‹+­™ÌššfìeíÒ¸½—UÛKßkx/Ès/Ñ({õêSß0Š! &@b›‹ψ©[ °Þê§‹ÒI›;²¥v¿Ï+?ÛëžÀ\l°¾7;|¶¹á¦K¯mHgÓ} }opXk\–x‚Fìû¤÷¶ÐUX<,×Ͼwyù }¾­Á€eµì‹SçȾ=l<';Bœ‰Èob»´hâ¦^àëE»m¾Ÿ2ÀæO·U}3nô˜°ÍÅCW«OTë†d&'ÝðLçïÍå“£ìÅŽª¬_´Çgÿä™`nÿ»:¼…ÝøSu²¦3õ2'¾é¥M¡$B]˜£zýîÎÅ¿µN¨©›¿pæ9«qô+¼9 Úuú‹ô˜ÍâïÜàNëŽðT˜aèD¯T|éàu^9 ¯Ta6'æ¤ç ΡÚR}ééR:qðöÁ•ŠOÎaâQ’;!—˜uÙZ–‘¦Éפ 4¡,uj*IMM×ii~¤fH¾…Úúæ¿dÁ!ðŸ‡èÀú^×`jûamb±¬Ê×DåçkBû%÷#¡ É $TÑ+p ‘““8O†åtÿäZžžûZBŽô¶ fýÈ¿’â›( ôÍÒ¥w#,é=€‰ósñ„ –ßdÇWñ¯3ÈŸúJ§0àK¶+~ÈS\ÊI“ly'ˆ?Üâó‡Iªô•Á‘šºhReêS6zÊØ^©Å­Í#“˜Ââ£cKòBÕôøˆ”4ôâZsSSµ)µ¸2&{eñWß{Cш餢«s¥=H§YÚwò;¿­XÔ¸¸5cú˜¾ó?¾«2g`§}6wdqsçíýÄ͸ëïuª¤¨ú΂:>~¯½f¤V±Q<†‘¢ë<­WxPtÁzßý‘¸ vD, ¦XMuÖ0m~¿xñ%£ÕAxÃ2 ƒ¥)ÂA¨ô&PHB|x‰Iâ |¸R±Vµ3ŠDEŒFýpÖ°Aª®Õb­ÚŠÂ°*,Œ¬ÇX‹³p´¼%XF±A¯ONNJ²FÄæ'%¥îÈ"; !hG¯¸Ð0µº<¬6Œ 0]˜!Œ†…iµá!!áAh¸48‹S¶œ¬Ë𯳯úZìùtC¤÷±Tý9ⳇ„ÇÅï㈟”_Oû£ôýW¨où£€³¥­!©¿Ší[ Ww»ƒº«Nzß<(Ö(_퓦Pj‚Þ‰Iöìa;[ÕÉlî¼›6½0zë+ªÔ oØä5†œ¸¿ó‚'8XàMw4[ÞdÍ×¼ÑñÄÁ7n¼R¶2X­$bÙÏîÊ$[GP²[ -V)a¢Ó…„h#ª£&j¥ŒF p QîÅ-hø§/g}ú²îe,}u$; -GXø:ÇUŠ>$O‡Ä½% ÏSá™Ó¶àô÷5†Ožï5$‡&[‰ÇiøÛÇSÕ?töî<¼äèCÓÔQ¢.± ‹º„£bkŠ *K E¢Õút±ÒÐ%é´Ù ú Ðdø?)ƒc"¢uH:cžK`Õ‰GÏ\ßùÁÇjû¯Y+I’âÐM>è<Þûdªúsü¶Üƒcï–uAO1Ôe‚µc´5„HE…Nc”õ#Hʆumxž1šÒܹbR¼´ñ7Ë’­0‰#V¸ÛFé&:œuÕa³)²ÀÔg1 ÀûæÌAÈ:lì˜Ñ£JGŽ(dÉ?íÿ C¿¾}zä!%9)1!^œêFEF@ǪQ«B‚ƒ” èNa…½qöI o¼½Ö[’Vœ¦3xKÆ›åE‰Æ´ðœšLÅ«H÷¢ÈÑÞ¨òI»µ°Æ«Lï‘>ÎK{ëÎll¢Að²ÞðŸ6ÊQïíW1ɘ¦{+ÑŸ^$Þû$£1ÑKzÃ)$Áÿ(‡¡Þ«+‡xc¢SêEå“D··ëóBˆÔk½¨b’7n÷vûšš¡áSuè¡ã8¼F·«$Þ^ìEQ»PÉç^-")D^4ÄÛ/ÔЬâ¼(Ë‹£Îzq¤G…{ð©N^œ{¡~FšPï‚R¬¯í.Ç3r) k k*&…ç(i»K­²§ÙªÌ ´K¥P PµìÂ%ðaÐ.‚‚C¡¬"DíÑÍðZ×ÖV …)‘Ý)0â­ LB@æƒ"e{•vo$×àòZ^´Ö°+ãÀšu{uhZmº¦>­Þqå$/u€Ž»í-4Vy“F—O†(®¶Ñ Öj±ä‰ud kà^Ä­?­X¬ÛñõÎZÑpmZ1¤…Ø'­2HôF@(xÃÓ½#mÄ‚/é!Îeo׬Yeðn?)0Õ(úPÕq ú! ¤3aF‘X_Y¾ú‘l®´^¬‡ÁÛ1m†l^Žu>ã6®ÑyKΡ "|T¼ëkgˆêÎpˆYfÖ¬uJÙ\'e LÒ Ì(HŽªzò$¡1M€²\+ „L@{_Lk4zãÓEÂ5kQ?G=h.ë ÝÊ‹fŸ˜ŽA»×Z%¨J*hu×ð(Ž0Y$Sj‹kjŒr®˜dó“æ(N”sé©å1!øEmÓJƒ×Pg›V Šž³­©+”ÊÊXƒªÜOU’VR»fMIš¡dMíÇÞ®Žii]Úš]£G¯ij R«ÅÿôÚDoɺ¯®¶‚š¨¤B,òC£CnãÃÓŒ $¼Æ—\þOÉL šÊÝ)(= ô ‰†Qg±'{±qôêI`Ðu’ñIz%pMMžÖô\•<'`V¼öÅ~j<&F£ØÖîµ¢ipãí?I¾7 i‰»‘5+*¢VL9àK‰®S:|)~òÚ4¨”Ñ•ÿÎ8 sMxZ„Á’%©`ämÜ>‰&’"‰T„Téп ñƦLz‹Ù‡.l.Íp4Í«K÷*ì“$©1è¡ÿ«®2môøÉ“ yõËwaß ä/±Ë8ÿˆWõ/¨ ýiâHþe>ÌïE½a”üó‚Q‡LË¢^S† X9råï¡8ˆl[õD=N06‡™4Ê`9…(ÈT«T¥+1ÃË fÛ*L妌€˜¤»S:’Ðé¯ MCmÈšyÀ ÿL†žü˜nã…Ž½zmbÇ©åû·¾qáÞ²mËt7˜–«i~û¯®/øxc¿ãCžIxdÙŸÓu¦P¿ž˜€:s¸I«¤Õ,(2¸´Ùãlmvẕ¦h1J6ÁÙêªtMoÎ0”6× 4ç˜Ìb‚:r€/Á`wÏšål­s9š •îÏ\G«ÓPÞ>­ÉÕÖèlm3Øm¦”ØPK¾)×d1I×äØP¸1› ²sò,y–Éÿ*,ݘo¬@téuÈ´ôZ²t)zñm—³o®z¨ß+Ó⫪~¹x•0jð ‹?xûý×:V^÷æç˜ÛÍ|°ÿîõsÚ6¾öò´û‡ü˜¢h?‰š¢Æ¾³eCÐ~WÛÒ½ÓÆ™SŽýýºæ‡Ež{tψñ§ÜGêóÈ{‹¦+æ~¾þÃñïÿusü³ÃÞŸ»ôû§g?=~ðžkÖ¾a{~hêÈ‘÷ÇñÇg/ª z=þ¬·}Ƶw¯ÜW?ïÅíÙí­á;úØZÓ˜/FæÆ?U1j|\GgeæÂwÍë^vÞb³e}´nÁ·m·DoHÐ/Xk;zý £‡ s‹¶Ÿÿ~öKKã cóF=úò°ì¯{6|µðÊ~ßTX¿áǪ#ß~ûèÔÓì¶ÏȲOW÷ßõbÙ}‡g×›‡ :®?‰Š¼vϱ5ßni_Þ«·]·ú þ`儆•·iéf½)Y®²ÍTµ¶·y 㜞¹îÖ™¾:U_R§¦rBZ7¥k–ÓPéqÌjq5O7T:[ç¸êœ† ·ÛcÎ5eËØéãÊ cJmE¥cJ«j 6»](¯Š3 ýêú[ =eHVX`Ê3g› ¸Z,æì3¿ý¯ŸgÃo4œi¼:#sàÒ¤]ÊÝÛÕO†‡Nü¨òƒö/^ϰûs!Wäþò݆ÎÍÑ'?uø›s«wÝq`UïMҵ͘÷Æìè ¯L:×ÿ¡ISnb2§…OZštpöæwS'e½{(J±<ÿéÍ;öŒõÝOƒS™pËbãíM+ŒqóŒ=÷ç¿ûwHæÛ{,·]bÃL¶áAá·¯P {뻎¿¾ûà¯Ïÿ[ñ÷Cg§=˜ÞïøºH絫ðúÉ·N;¾½ã×'÷G=ylÂ-3ƒ§ ¯Ü}ßGyK©Ÿµf²•ŠíW‡ÄlвŸù=fì{A×ߦkšÔ©Ê»ùàµ[³–Û,r\ÿü·êÙ·>ðjô¢¡7nNÍÞ’zíš?ëƒ{ýöÖŸ`¿‡Áå“h´/üÖì?ÿ*™´üÚƒ%«7ôþ)ªöÿ>#~ØÜ×Ô[fœòïÕðåTý9ý¥â?wÜ—vò¦¥w\bÒk¡V‰&ýãÇ=\·aĆOö„Oq}¢Z2mƒÒ|øH×êJÞ/´ù»w”Ãïxäîy“OýñwP¶WÝl:}wþC™!Çv÷}(t|­"¯lÉ‘ª²£Of} >zÝÞ)]Otýâ¦=KRK‹tMooñâ ÷¼øæÀ­ƒ~]òÀ¤ûßOu~µî¡y·?ûሢÆ+2]€±›þ ƒžUû×-Sïu=öö–ôii)ņñ;Ó¢_õ?JÏöM¸òᕳó‚ÓÏ­ÿìÄã7}»vûè/Ú^r‡÷£µEoyÅ®é.,-6Ø›mm†C¦a¬«®ÕÝ*të1ÁÑäªwx\îfÜl³Ú"Ò+#Iu¥9Ò.ÞGª&:Ú¡éyÜÍf)L.Š  gý,ws½9Å”$ÆÐ¨ènövÐÑÝ*±õ¥«ÿ!ýß6¢{õutļu<;á–Ï'Lˆ š[þŠé³Óýýsïgž»Ü^Ñ_5B¿øèöª>qøiOºò©æäóÊš[ÕWÜùGñ“ïüì‘;¬µ}'ÇMßV8'ÿ§]ƒb[úëUCÌ{U»SÿzÍyû=§F}{èúCÓ‡7Mm}}Ô{|¶qïOIÁçç~èže ·i™b¦T2É‘Œ˜I-‚ZÆ(Ql3-Ý,Þa¶t fº…7}yÌ~¡qË/…‡šŸU/»«î?ÀŠ—]:O6ŠZ1Œ»X¬)Ê$Îâ»gé1”u (v@Q1¥ 2¢„ù6ËÀQ‰¤ËXDë·õïèÛèñ´´ ÊÊúwj/¯¼kÝ»tÝSÕèj3Ô9[=®WÃã4¸$Ã+ÝÙ&Zo«³ÁÙêl®sfÍõ—§ÍÐÞhm†6O««ÎÓ4_ÕÖ>m†³Îcð¸3 žF§¡»<ü|E»-ouÔyÄ †s–³ÙcèšôWšm"‚y  „Ìq¸šÓšDMzrë΀Áá¤ú§Œµ2gÀ3€„ÌVçìvg›§ÍÚÏݪTbÏêÍ0dçYr F0RÙæ8!b¬»½Ùã­&¸œs3 6 –\SnŽªºÒx-ó[]Ó=â`e¶Xò/bg0Øšš "Ftm06:ëìBE•­tœj¢­¢Â6®ªT¨4—VÚÇØJÇ ÅÛ¸â€ñpLéØRªDìq¥ãF 2T Õ•‚¡¬ÀÒJ‰]iI©ÝV%à¶²ª¢Ô^5¦ÆPY]4J°WªÊDÕ¡¢´²tĸüÒ²q†ò ›½ªÔ.0+Œ«µE¥••Õ Ï`«®YVº¨|JVúr`([>¦”ë,L*¯*+ ݹ‚BgS],réŽUÞc… ûH¸õ岬ÂPRZ5N$/Øf(·Žöê1¶ CyuEyY¥! ™X:fŒa\Y•ªH iŒ ØËÆU ã«AùRÛ˜ WZU:Óø”-ƒ\UŠmcm#„ʆJAP‰ùS‘x €5¦JÚî†n ªÌÝp±-NwµAá¬74»›E³jp9ë+å†`ó@˘Ö Håœô’qÏq4µ; m°ƒf·Ç0Íi¨sCR½ÄÄÑfpÔÕµ·Ê-°ÁÝ:Kj3ª9r·`©¢¥¶ª{ò;rÿgš¹/¾É=Ý=pº«Á”/v$”e™2MéÛúo뻲·È¸´A‹loëɨNŽÌëZ›L1ýM" 6)¡Ïÿ±˜¬~ËáªQ›~ÜsìóøÐŽëb~ÿföÏ£ZÎ_Y80úËí¹Š¢G·†fµ:r^ª~¹úù£Ï^ÇÞqvøí[^j?¥àøX[VAß?0D3àçî§¿ŸµdÕ§n½-¡ð±G›¾TvbRÒ‘OÃÿàæÎñËþ~ïÔwGNÞ4ŸïÜÉO^0ɼŒn7-£÷ŒMíÿú¿˜õØ6Ù¶t·)Þ_J!Ôؽ3q»ïÔæ‹:“¾›™#˜n[ÛÈŠk¼þ­ñ‰ìˆ-)=`š€®14•lKêH@åÈšÀy 5#72 "iw§þ®>½x…‹f3Ë7ÌKÕí™ßâžÞêhiœo¸hœgK;Vß±ýÊÊŽ>ç^ ^›ìœðåŽÛF¯½ù£ƒncÍ'ƒO´}{²&>¶n Ý0øŽwKª[“ôYäˆWß8{n뮽ôèÔ­!Îk]?Óm‹¿yÜ›ukHÙo§ož´ñé…ï=`þ~ÛÔ?÷4D?ùé.yê÷ónºaûÈåÏzcF,ßümë©GÏÞ?#æÐ]ËðQ˜áê.¥yÞQO‰5½tïù%Õ?­ {ZK).ÐXÔÝ{}lÅŸ¢0k¥Ùp¾Ùd.0›s &_b+qªÝûßM}Û8C»zу¬uÜ¥uª¾òõ –­SsÏo]øÄûäžM¼òŽéÛ ÷õJ]•[X2aÇ„)?N9´ä÷W=¸ïŽÝéÖˆŸÜûçf…n¸â×>½Û°zñƒÉWÅi~½Uûñ±äòo=s“^‰~ëË…ï4ÚPôKûWs#¿«êõæ©ßx÷²Œ“§¶L¾ý»ugÏ7Äï&d¾¼n‡Õ†Ñøü>Š™ 'à¸À œ‚K0 ?`æ­ÅóŒÇOÄÄ&½ó.x ¯ŽI´.ìÓÏb½ºO_‹ø¾B×Õ ©ëÂØxˆÒFZ^ì-@œ3¼Y-àéÝÃݹuî,·ÉmuOu»ÝAëÝoºO¸Ï¸Ù’¦õMDß4¼iIÕ6雲,kÚФD>×ÔÕÄšÜ"æ%ÍDßœÕ<€õÍ S3áõÍÏ53ý̬™Ãg.™)ÏÍ|sæ‰™Š™Í1‰3›—´&xÚ£¢“¦ÏOë*s¹]TïÊr wu¹˜¾Áݰ¾akÃÎ…¶AßPÖ@µ ¸Ë÷ïnÀZ@ØÐ@\@ìlŒJ,kœÚèn¤eNìv.qnm¤ÎƳ⭪¶˜öxã|p{qëîýCôâ+×”ë—_cÑo³ÅádäwÜQp'À)ÐVðw‚{Nú}月0ÄÅ#Üuà±7i–½8Áª¾!Bÿõ }õ_Ý,¯Ù½)^ÿîÀ‹­…±ú;6!ýfpÁݰɪÿ~S_ý¦‘þp[ÀÝ®|Kí––-[TóÖm;·‘,[^‡†ƒ› Ž"^‹¬à¼à(Z‚Wø¼fwL¶å©®xÍc‘Ñdsâ5HÎ ®\-¸p€‰‚@ék!#×BF®Eo‚;î4¸.pAH ¾\¸áংS@ì*ˆ]±« vÄ®‚ØZ¼ø.¾K@-^ 8‹g1à,œÅº)AâB¸$.‰ AâB¸RÊÀŸ Î n ¸õàÀe!pY\Zµí×í7í·î/ß¿a¿R|)ìɈ‹õ(r1ËÃv›ä¼ÚÚW[C²þ5Üf™jÓâ9À|0ŸÌç€*s@•9 ÊPeŽ54ØpÊtÊzjÛ)ï)…ÉfÆ5Hr˜X,~Uüaj-î¹ê¹êg¢Û6{7Ø|t3«Ýܲ¹có†ÍLû,6‚Œ{hÇ~|Ü w§ÁuI¿ÿ½üàž÷&81ˆ1@Œb Ö¶õÜÎsÏ£SϹÏ-9·þC6.G¢3€3³‚+§„¬”CVÊ­1dê!÷!‚öéö™öY÷•ïëØ·a_n/þX¯ ”öÇÌ9r¨ï%‡Ñb8ÕªI°~0ý`ýaÛÞS¡ÝäBÁˆ¿+¾›@/èe‚¢0¶]Ø ÅTŽ ³``4̪b[Ïï<ÿÜù7ϳgñ4œ†â¡¦î^‘­'v÷¦Á”ËAÙîEb+½ûp„Ý'K °ï^ZÁÐÝ×äèŸÅƒñ ÔèÍ»÷†XÓîÃF²v Á@1x§ãH8½w/φXÏîkÄ EÂv¯H@cM^øÎ›#ô¿.JÑ/·u-¾nU?ýºµT¿f­Èž5qíýÚUCô×µuQz¦Åº¼Ëñòå ÄOÇa<µF¶]ƒ¯¹fåZ¼ví5‹ð¢E‹RÅîf÷òr⬛—–ë-Í×/]2D¿dEºþËú/ÀyÁí·zÒ¯\>@¿jtO+è¯YaÖ§®0›-Ö©iàAm$DÇåGGçEGäFks¢5ÙÑ!æh¥)šfE£Ñ}újûõÕH×f¤kSÓÂz¥iSôa½Ök-­e(¶%¶#vCì¶Xo¬òDì™XrŒOÕ¥ß ®œÜp 0ÊH;-:»ž-`‚µ7Ñ]°^(¿@½\8záÄ…3&)¦öBË…Ž .l»\»‡[UX«ÈR W”) Ê#€É¨µu±2[¯Õ…k4¡aš•Z£ Ö(i_=ÂDc@Ø ²h¤ž2…¦6ª%ª#jCÓE¤ß)R¸ÍXkÖ›³ÌÃÍSÍ ­WOU“£§[é›´‹2­×NÕžÖÒDœ”IJõѺØÐ³ÇìÎÖƒÙGC¹GAÀöâHkT¶>q0¨6([O-ÙzT˜­/ÏÙEPÑîØp¼ÚàM¿&mž×Z1o—ʰz¯UÏÛEp‘—&Ø1®*òFb+‹¼9é£÷â ÞìôÑÞò+&íÂøúˆõ’Õ{1ªò²Õ{ öÉWLÚ‹ãÅ䉻½£kW\w]Mz²·^|ÆÛ‘\ãÍ É5(=ð‚%»ø×ÖÞ.¾Xˆ£ÅKL¯]ýúÞ‚Û!ÔrÀé—\£½ÆJpã'OÚµh‘à¯-®â\ÅÉí5A¢IL¼æšîÄönÏǦ=ý®6ÐÊÓÆAO»GTWÒ¶òÑ.ÝpD~ÛÖ&ç©Ýƒ.f%ãB&¼qÞ^PêR‘HñK™“XBOºá ¤ß"ÖŽ©¢h´wHÅh¯¶ü oBܼ7ùp£I+‚ú‹$¦Â«H“*'=…” í BEO!•©QQ"Þ…PŒnW jÙ…J†y­òÚ¯:Ý«BuZ><.]7ÏÉ*Œ»ê*¥Æ«„ø ´¢ä»°µÛÑÝÝN1OvA# )FHs%BaÁÝN{§ì" >r/BÑË.®B £d—ô,B)Í—Ýÿ ÎØP¯õþ ¡~ x¡Œ×Êš€PÎ0„ònïv…q <ëË\„„)²Q…Pér„Fÿ‰PÙj„ƃÝT½&»‰[.»Ëîÿ>WuÙ]vÿEÜ6„&güt“ÿÜÆËî²»ì.»Ëî²»ì.»Ëî²»ìþêø‰œ—Ó¾ ™ªò[pb°´«ùHvýëbøØ²[ßí|üÂÃ!‚g"‚BÄðb¼âbàw ºJ1|D@qh:=†4ï@z´¡®÷»Vƒ²kžxR¡ ¯"¥¼kÚµýóõ*¥Þèõ®Mr”â b½úqÞ¥ß#ºÎÀ¿¡• õèvp2\…¦¡I=ÒßEHÑ•ÞõZ×_8MFŠÎ?ºîïú‹XÈŽ®%FJ×çwx×óèI´øí@[wº8_y]ŠîAk!~º MEÕÈ ’£2TÆÀý<Ôˆ†¢  м‚Zsw×´ FY¨ À“Є^E&4å£çÐ'xVç&4†%_œü~¹$p=$…ð×Ò¯A ¨$ÙQŽO_Žxv]ø+´…¿™h Äæ ‰ãq<3Ð\Ô®‡œºà¯(6 ö®'Ñ:TC®ÜåèZ:]‰êУhYJ–¢^d<*Khí]$™LBo‘¾(¡ëk×õ-*E/ »Ð§è ŠÐ&t htj†¿›Ð´ô}à‘PNn´†l}ªÁUA¶£«P:@vTŽFC.o€²‚ÐÐó¡®o õP®¹dyÒ²Qð<÷g©µ£Ž +I~¯s3nB`º3$ÝÚuªëÔJº  þ•h XÅÇ}Pî‹ûáþ`%o£cP2;ñœŽ3Ð 8yñ@œ…MØŒ³qú碿pÎǸ[Ð;è=hYxŒ‡à¡xŽ­Ø†‹°ý€‹±€žÁ%èk<Ä¥xúË_ Ú)E£ ¦Ç ±h”~9ÔsØ`XÅ4ê©ZÞPgWmÎûmB³ðhÔŒÇà±xÚ†ËP'.‡ºvãñ¸WBÛ˜ µ×†«p5ž€'âI¸OFà+ð•ø*<yÀNæ ¹x*®Eïcž†ëp=vâ<7bžg¢/À~æáY¸»q šmy!º-³q+nCwaÚ…Ûñ<ÏÃóñô^ˆþÆWãEx1^=ÁhOKq^Š—ákðr¼¯Ä«ðj|-:…×àµèi¼}ƒ¯Ã×ãõè'ô=ºoÀ7àxÞŒoÄ7¡èy|3Þ‚oÁ·âÛðíø|'ÞŠ·á»ðÝø|/¾ß·ãðƒx~? ½Ä£x'öâ]èt'ÞÃ{ðãø ü$Þ‹ŸÂOãgð³xÞŸÃðóøü"~ ¿Œ_Á¯â×ðëø ~‡ñè…#QŠF1(ú÷xèaQ>Šá·ðÛøü.~¿?ÀâðÇøü)þ Ç'ðIü9þ‰~FgÑ/ø+ü5þ‹¿Ãßãð)ü#þ ŸÆgðÏø,þÿŠÃçðïø<þÿ‰ÿÂã ¸w$Ó€NþBѯ„ú #JD‚IQ5ÑPF´DGÂI‰$Q$šÄXGâII$IÐ¥= ƒ^ç4Ú‹ÎÀHµm‡ÑɈ6£‘ 9Ð}ÄýÜbD·¢[H*Iƒ¾ù)t/éEz“>¤/éGú“hô®JtIGA$ƒd¢d ô‚÷“,b"f’MrH.ÉC¿Ãù2 GZ”ŒRÐC$¥¢»a¤¼‡ÀØ¥†±qô"S —~Æ‘=èqô± R Ñ*´úýad)"ƒÐj2¥‘!Ðÿ¼£D( =ß´Ž #É•ØH±“b"½ü³h*¾E:2íF‘RDÉ(2šŒ!cÉ8RFÊÉxRA*¡×µ£ _ÿD£OIú }‚Ž£Ð RM&‰d©!“ÉäJr™B¦’Zâ ÓH©'NÒ@¦“Fâ"3ÈLÒDf‘fâ&-d6i%mÄCÚÉ2—Ì#óɲ\M‘Åd é€Ña¹†,'+ÈJ²Š¬&×’5d-YG®#דõd¹l$›Èfr#¹‰ÜL¶[È­ä6r;¹ƒÜI¶’mä.r7¹‡ÜKî#÷“íäò ÙA"“GÈ£d'ñ’]d7yŒì!“'È“d/yŠ$‘É'äSò9NN“äsòù’|E¾&ßoÉwä{ò9E~$?‘Óä ù™œ%¿_Éoäùœ'?É_äort’.Š(¦„Rʨ‚*i ¦!TEÕTCCiÕR §4’FÑhCÅÛ‰§ 4‘&ÑdšBõÔ@4•¦Ñ^´7ÚJûо´íOÐtšA3é@šEMÔL³iÍ¥y4ŸÐBj¡ƒè`:„¥Ãèpj¥6ZDí´˜ ´„Ž #i)EGÓ1t,GËh9O+h%­¢ÕtH'Ñ:™^A¯¤WÑ)t*­¥:ÖÑzê¤ t:m¤.:ƒÎ¤Mtm¦nÚBgÓVÚF=´Î¡sé<:Ÿ.  éÕt]L—к”.£×Ðåt]IWÑÕôZº†®¥ëèuôzºžn 7ÐtÝLo¤7Ñ›éz º™ÞJo£·£ÛèôNº•n£wÑ»é=ô^z½Ÿn§Ðéú}˜>B¥;©—éct}œ>AŸ¤{éSôiú }–î£ûésô}ž¾@_¤/Ñ—é+ôUú}¤oÐCô0=BߤGé1ú}›¾CߥïÑ÷éôCúý˜~B?¥ŸÑãô=I?§_Ð/éWôkú ý–~G¿§?ÐSôGú=MÏПéYú ý•þFÏÑßéyúý“þEÿ¦h'íbˆaFeŒ)˜’±`ÂTLÍ4,”…1-Ó±pÁ"Y‹f1,–űx–ÀYKf)LÏ ÌÈRYëÅz³>¬/ëÇú³,e°L6e13³l–ÃrYËg¬YØ 6˜ aCÙ06œY™1;+f+a#ØHVÊF±Ñl ËÆ±2VÎÆ³ VɪX5›À&²I¬†MfW°+ÙUl ›Êj™ƒMcu¬ž9Y›Î™‹Í`3Y›Åš™›µ°Ù¬•µ1kgsØ\6Íg ØBv5[ij%¬ƒ-eËØ5l9[ÁV²Ul5»–­akÙ:v»ž­gØ l#ÛÄ6³ÙMìf¶…ÝÂne·±ÛÙìN¶•mcw±»Ù=ì^v»Ÿmg°Ùö{˜=Âe;™—íb»Ùcl{œ=Ážd{ÙSìiö {–ícûÙsì{ž½À^d/±—Ù+ìUö{do°Cì0;ÂÞdGÙ1ö{›½ÃÞeï±÷ÙìCöû˜}Â>eŸ±ãì;É>g_°/ÙWìkö û–}Ǿg?°SìGö;ÍΰŸÙYö û•ýÆÎ±ßÙyöû“ýÅþfX'ëR VU0…B¡T)‚! •B­Ð(Ba ­B§WD("QŠhEŒ"V§ˆW$(IŠdEŠB¯0(ŒŠTE𢗢·¢¢¯¢Ÿ¢¿b€"]‘¡ÈT Td)L 3ÌIs¹ŠÌo_õî¦&GwI‹]I©æ¼’`ÑÖ]­õ!¢±‰@OÊãa> xXÈC m!ÀB*›FTÈ2ܦ‹•é$ùhÞ™àDÑ™Ž¦‘A¦$[JÈP›X‘™³Û`î­a_ß]›„ßàjð4JøÔ&Ëæ7j±~9,a‹­¤QÒHÛTb¬¬l™>U%$~#[€ïN®™A ³M¼`²¥Ð”Sl…¡É=ÝUçhjv{ÔÎÙí®9Ž&ñ~Hô‘­íPþ À…Ê%lmsÖ‰ç…C8 ô ‚î]9ßÙ,Î,œmuíõn^“¾Ö¤O17Áøãoyunè…g‰uéh/ëiËæ! ½®V‡²ÅÙ©!r ²nmoq9àa -ÍQï„^x^]“cô÷<·Å¡òÌ)øwÖ‡¶7 œ­NÀÑ€E:¤¨À0ÄÑàr図s ¡+÷À|Âã¬WÎr5‹C dÕÝ\ïÃ(´(GBä(Gš órå Ï,99*w‹³yLìÒÀWRRb—u1ç«\ÓÛA2Œû/“ ZŠœhâÙ5åð0—‡y<Ìça}tòh*R_<{È1g+lâ¬!ö×*»¨.æÃ¸¢Jœ(ìâ¬AQ$«€úQÛXÙõ.¨Åbß°®0yPŽ•æÊ2iê ’äµÍr45©$¡¨í–,݇úÄˈ’2()"ƒ’6"ª$Aº½¤ WNº ók(݆ª)Ũe]eXVX Ö‰Ùd2KelÊ-6ùc ýÅeûSó²e|K¶?Í쇺ãrd,“‰sÏ÷§ärz¹)æÚ»©óxŠ_~v7×RàÒMÅþ?v¾™ÓÛxh—C›_÷l~rüq9œÊæ×=§ÊñC¹~ˆki³ùcxNl‚uó.ðëÆõ8NI· ¿þ9NïOËõsÊåZqYE~ªÜnl¿¶¹~msóü¿,s}5ÞÍ£ò•9—KÊ·ùc|uPèñÓåuÛ‡_bž_bž¿òüšåq )ò—c~7³_B7·nYþZÌçuQì·¡|¿Ìüî²÷ëë³F‹¿¤òý¼ üÒ xYûóý–?Ígý¼,ì¾Ò/´ä¨x t¯*žèëiEJž_K·DYør C4—í·ï‚|¿öÜ>,E<,ævçÏ}?ÏÝs*›?Ï…þœú) ýVTÈõ´ùcüzúô4›yIÚJx-ò2ø}I·4ò2+êNókYè³}Ž¿”,~m-~m»ûžîš´øµ´ø´,ì¶yK7ä/#MÀŸÊöC9~(×ùóoꮟÆEþ¿½ùµ3[rƒç;<òvƒÜ¬üè^å‚_e ù0œ“—\7¿UD@^×Úš`0gE0GPŒpÀ ¡(v6yABK› ¦l2$P«b¥0R(F;ZZÊ1ŽYÓêdl;×N&¹‚ʤOU4“r­ht+*]Óg9h•£=¨ZfEË]Ô®¼Í¥’¤zÜÍni’e.‘Gg-<´ñ°ˆ‡vóPàa‰rúBN_Èé 9}!§/äô…œ¾Óqú"N_Äé‹8}‘]ÃK$@i3'2s"3'2s"3jæBíßn † `”Ͳ9£lÎ(›3ÊæŒ²9£l®}6×ÞÂé-œÞÂé-œÞÂé-œÞÂé-œÞÎñíßn+ZÒP#B¾Ý 99‡‹Ëáâr8y'Ïáâr¸¸..‡‹+æôÅœ¾˜Ói¸”M.GÎåȹ9— ËåÂr¹°Ž_Âñ»¦: æ´ü¦gŽò8rgšÇ™åqÎTð1åJEª²YÎéu™ÏQó9j>GÍç¬ó¹¾ù\D>/œ|.ÊÆémœÞÆémœÞÆémœÞÆémœ¾„ã—pü»Â!5ñibŸ.5ñz©‰;y_ 6q1Ñ#5q—ØÄgJM¼InâÍídž+È-W mmt+ÛÄÆmVHõ@oçm¼Úw8¸U¸Å’ák%“Rbnf€`VJ)f•ã¢N@4!4ñÆÍïM¾û<æð0—‡Ù<ÌçaoÜœ®ó)äx…œ¾Ór¾…œ¾Óqú"N_Äé‹r‚Ű¡¤ˆ3(â„Eç%½D—VÀ©Íœ›™s7séfŽgæLÍÙÁνDG,àÙœQ6g”ÍÓ³9£lœÍµÌæÙ³p: çcáxNoáôÎ×Âé-œÞÎñíßÎñíÏ^âò÷"®Kz‘Φ€£çp5r¸Z9\lgŸÃÙçp±Å>:_Èùsüâìð@¡YÌ%s‰Å÷%ýNo¾þ‡#çrâ\®^.—ËÕËåê <]ÈjïÙåÈýÐE‘šöK ‡·àÞ¢ó¸y\ƒ<.!kÇ5ÈóiÀ &Ïò8¾àÃãüÎ_(P¹/êÔ xgSàë¼8j>'ÍçªäsÖù\•|.¢„«ï ¹*6Noãül߯ùØ8çoãô6N_âãÏñK8~Iïwl<”—L9rVM9%<,àñrÓ‚0—‡6…”ûÐuâhv{œMN—ƒ¸¯_à¥SÄ»â"_WÌïKxºàny¼Çóûbß<—ŠÝ7^–„Ô»Mó=®™\²À)„båœVG]ã|µøpf¦ü8BQÖènmV¸%¿ZòÛEŸÕ»›§kêÝžiÎ&÷Ü:÷¬i!Ò~´IÓJ ’žzˆPh£Û=Ó1Í-c(mÒ’_Y$v9(–AJä`„Œ”ƒR9%£å`ŒŒ•ƒqrP&år0^*ä Rªä Z&ÈÁD9˜$5r0YÞ­°9ü+jÛtÿΊÎV×sk%ÌV¸·¢¶yü›+jùñ²¼»"=c–7gº7Ë[*ü™3¿qwo“Ù)hcï†uö‹´QÛëü:¡öº€½m÷Sk³¸S-?¿–`˜a6Ê‘2…€..¡g Œ…îÐ =ÐÙ²­ÃçpD7ËðÀgæ²=…èF^D">B—•ä¯4 ¥篴gþJj¸4 ¥å¯40¥ùÓºHBøè‹ó::°îÔcºU s1®zL@ ¤ ŸÞsé¨ Èø¸€ÌŒëæ>îÆõШ,€GY@á•]\xe= ¯,@^YwáEôxq@.²²Y›‡Ýúë^'›I™ÜLÔJUd¦â’ÌTôÈLe€½U^lo•Œ*/aTÈ(¼ê’º©ê¦Ö¼£ Wõ¨¬*¿eVä£: p«/.Üêž…[P¸Õ}Oµ¿ï‰¨¾´œ«í´:°N Ðcb€/ÖcbO=jèjèj.¦«éI79€nrwÁi'÷lYª*qT’«¾TB¥O»|Ö"?›e8fµ8[ÛÍõ2-/rG“´eoøLBà3 Ï$>“øLBà3 Ï$>“ø²KàË./»¾ìø²KàË./»¾ìøZAàk¯„".Ÿ/„".Ÿ/„".Ÿo@|Bà߀Џ|>×ø\Càs Ï>'øä\à“sOÎ;—Ï'é‚Ëç{‚Ëç[ßì\>Ÿ³|#ð9ŠÀçÔŸS Å\>Ÿ Å\~1—ÏgïB1—Ï÷¾' ð=¡˜Ë/æòùIàs&¡˜Ëç“XOb>¹ødW¸|>-øäX¸|¾Âø _à+|Aàò._àòù Làs:¡„Ë/áòùLT(áòø X(áòø6…PÂGÙLÒIŠ(Œ&ip“š¦Òˆ± G……©ñ@ÿ¥/HJò]R| Pù®ðð0éÒ‰ö_Z©Raø÷_"®.Ö©“ú Șœ×ߘ`LékŒ`0Fºº¸¨>¾Ë™)^’ù'^ýû|W´Ñ˜œ’‚Spœø“O&c„ÿŠ#D@gÌ4†ý—˜ ‘ITTTDzBDx˜6%)>45.2gŠ7¤Æ2têèÐè¸}LLF\ôCxr”:Ì Q%4†ääôøôä„,£!:FŸ”oˆMNáe? c* ‹¾TЬáé‚r‹ˆP«#¢ @Ô*Éìyá‹.µH!¢†Ê¨–¾ùŽC5*U`^Ÿp õ¦Éâ5¡Äj&Ô—~Ñõ2=¥à¥ÇcU¼êb<ÿ/^ýú©“BCC{‰°¤ XyááÇ…A4ÆPu²E˜ÂEc‰TkcqîÝ; ÷N ËÂ8£OŸ$±ÚúŠ úöí †—d 1))Æ™™}ãâ""ââ¢CC5š(£Q“’€¡q©AFCB¨>©Ÿ622ªc$t¿$±0BqïðÔPÈ4`sB(ͯü’`qw}@–|É8…›}0\ÿ¢ô¸Ë‚«7\EGE$F%ÆE%GÇEEöMíkÈIIHÀ‘™‰ªèÌè¼ÿŸ®( uT$üEI®¾ÝWÂ¥Wæ?\}5š¾:©íw·ÿgDÉy ÏIÅa‘±1qÑÚ˜„d£Õ–§KÈ ÷_ ÐWĦb=ã—&V¼b² b©=Gkµ1â•%Õ©¯¡†‡G‹ØbT„„©õ]:Qw°£P±Ç›£ÒðÀ>ÿú/)¹ç_ª!ÕVøîÿ3bcF”ïO'þI¿À¦øøÂÓd‡ª¬óñΤ (Q~ΑŸNCÒÁJDÁ˧=ÕSä0´Qµ­* ¿ „"—C˜ŒPôõ@±[S'âç¨ð¦¡Åx ^7â»°?‰Ã]$‘Ôäiò*y|J¡µÒAÓhÚNÐÅt ]Gï¢Gè1úýˆ~B?£'è6•Õ±™¬mbw°{ØCì1ö {cï±Ùì;všý’²"å}´>Y/èÇê'êkôWè¯Ò/ÒïÑ¿¤[ÿ±þ´þW}§AmH1¤úL†à Ã0C±¡Åp½á^Ƈ c¤1Ƙjìch»Z™ªMHMHMIMORG¦:RiºÞwõ~¨÷ÁÞoöþú/e×ß]]WÚ&åqÞ yüÿIâ¤<>E^<~@Q@=R—C¯§÷УôÝ€<"6Í`­l»‰mc;Ø£ì ö<; yü€}ξe?±³))ÛôH§7èGêËy§ê;ôOè_Ñ¿§ÿTVÎ@ :è•zC³ Ã)Ã6ÃvÃC=òXÉóžyì+å±6µ^ÊãžGÄóˆ°U{ÉÍorsÙÔ¹°kB¢áQ¸wâ>])âÑaô0Ä(ö=Òõsá,*E#‘åŸê^¸ýâ˜/ÁÅ€Ó}©ý2¬G Xéç&>9ýä'ß‚ð˓̗~R{Rsò‡žØ~ℎ¿zü¥ãÏŠñÇw€[|.øS>{á“%ŸÌýDùIÕ'Ã"ýÁr?ÇwvË ´ŠNáðÙ¤^)ù“ÁÕÓ5=õ¦oAímd›Ù­Pƒ²=PƒØAv!vˆº|‹½õyB±ÚÛÓ‰?ž,^J•²Dù¨ò òKåOéÀ¥ &§ ’ý æ 9A=N–5ó°#høË$xeO‚ˆ>1ãßI0þ†oÂ?’ ñ´‰Ã{ñ’O“>Ýç#}§#ñTé”Þ¼?#‘ÐÂR@«‚^"©¤Sm¡( i‘ú’ˆy^ðé‹;ñKDK†¢5h-Z‡®C×£õhºmD›¤³x7¡›Ñt º݆nO-¢­hº Ýîþ¢?AøeÐþ<þŸÄâOH:‰%ÃIÎ'¡øÉ€e$þ?%žÁ$CèNBˆ€Ûq ÷ã[ðøJ^J<ûg@i¨/Ê@ÙÈ,³-B6d‡Þ΄ªP š„&£+ÑøYT‹ZÑlÔ†èÔyÑ´ e¢=(íFÑã( = Ñ~”žEh´•çPz FÏ£!è4 ½„†¢Ñpô2²¢W€Þ€u• CжÞD#Ða‰û¢Qè(Ž¡·ÑXô‡ÞEeè=4}€*Ї¨}„& OQ5ú}†Vá04}ƒ®B_¡)èkè­¿GuèäD?¢zt MG§Q#:ƒf¢_ ýŒšÐ¯hú µ ßQ;ú͇º€æ¢N4u¡£E˜¡¥8-C×`Z5h9LÕú¡Aèê…BýÐNä@ß¡è¬È “N4–;)%V2‚e°tñ\51DÇÒ+i ½†žú_>EWN¡ÝG_¡Çé_ÿóçÏäÓgôè‘ÿ¦?ÓN¦%³I y”4‘‡È~ Q"»ÈŸänò7ôÝä>ÒEÌ"{‰‡…y€>G_’Î>O_§¯ÑÃÒ)ƒÒ)‹O\~NOÒ¯¥3ƒ_H'/>gù+ý…ž—Î þÆ Á0…tBˆçi‹`á,F:)ž¼äŒå½`ÙûÁ¶_ë>ö},µ lUÇ´—œŠì}ÑÉÑ‹Ï;^t6ôⳇ—œçìyÊÒ•ŸAÂÌ'(ÅÓ¨ÒYSfa…l¨tbòú=ý†žö4eƒÙ 6L:©b!ôOúS²PÿùÒfcVVÀbYoéªtš”å³<èõ3H&(Â@tâyq¢ JB Ã?IgÁU0ûE:Wþª|2/”Nå¯Æ×Šçîñ:\(žÐ¿äd¾t_<ƒ¯È’N¯Ÿ’N¯ÿÀFâo¤øÿêôý|?MBð+øü>~¿‹ßÄûñÛ8QúÊ‚ø…8{•üsÈò\:ðÓˆø¡áÿþc¹4cNƒ1Ø cî0ÂÞ £ëý0²>cëc0®î•FÖWal…‘ÆÕ0²~޾€‘õ<Œª0¦’hïa6óÌHB†ãý0º×â×`6 ~Ù຿uóÝ 5"~¡â0ŒÞßâs0›8µõ%~¿$€!f˜#aô‡QP²+°$Ѫð3ø(ŒßËH?üøÝ±FÁºBˆÿ„o†9EÌ,ra>!Ï#Ф9‚¹„8{hE‡a„³’‘|ŒÈçl’%è.[Âÿ¾% %ÿ9–€L0ã»fvÊÿ–qÙþ{ö ÒÌfÞâ ù¾O€²þ×– €«ë²%ˆßÓAfKV jX„ÓHÙ`uPNbaLþˆ„Pæ·_Oˆ« -¹Ö âÚáªÃÇ`U…Ÿ£1>K€µE<Ìt]l ÒÅ sy­ñ3ÌP:¥õÆíÒzãVXw¬…õÆF¾â¸E\oÀ<íFi½±V7ÁŠãX—ˆ+ŽSô¯Ë³Ÿüo¯¬zô°v“{„GÉi¼ÖsOúzrVì`]÷¬¡€”VP»` õ+Ùqi+¿ó°ö{V[={„Ÿ`5ø¬ÿ VŒÏÀÊìkecÌeKèÄý3êÃdžGP:Œ »¥”'¥†06<.í ÀذÏ?6ˆ{(ÒØ€, è9ilxQÚ?)Z:‚F‹cúпs";&•¢% PuÀØð ¿„÷5šzñØ€¾‘öQêÅù":%í§¸Ä±ý,í©$K»(6qgÍÇòŒ ³vQ–`%:†V  ¬ACIÑå=õË{ê—÷Ô/ï©_ÞS¿¼§~yOýòžúå=õË{ê—÷Ô¥=u¾Æ!Mà;±8?þ ÆÔ˜®õàÇuU/Á‰’¿µkøÛ$ÿn1†˜B´ëviW2 Ƨ%ÿ øaÀÇ~¤†ÑOìjÿn  Ú¥whVÃ8M;Ï£|ZòÏ€%é´àÇKp¢ä‹´1@U ~8pˆAkº Á_'ù×KþFÀŒA[$ø6É¿]òï”üm0GŒ>àƒ¶àŸ‘üŸ%ÿ¬è“ àZ-?4Y«ÁeÅ”bð7fœ$%¤ˆ1wJðÝ]SPœ”—8)/qÀyøgE_â/éÜÞÿzÉß(ù[$ÿ6É¿Sòï}Ш@OÑÿrÜÀnÜFä–ÜDÿz(ùD©›ßz&¢[¥Ô;%«<ž¢ÿ³#æ=x6¬gp¾ ¸‰þÉ¿Aò·Hþ­¢/•ÞmRém•4Ü*i¸M‚·IðÝïÿLטËMìòJ+jq§Ž‰µÞèhžîªwºÿG{×%GU¦ÿ®Ç¼23 ™<æ‘G%äAâLÏ$!!ƒ{ØÉ“DŒ!rW´¦»f¦žî¦»'“É*Çå¨D|帚£T\#«w³•ãaëc‚ˆ¢ ‘gz¿ÿ¿·ú1Ó“éIÂaÝíºS·þ{ë¿ÿý_÷¿·ª¦º’ñ¡™¡Ñd”fô'½Aj‰ºéVFÓÅCkÕ‚Tr¾WšNû8öˆ¾†ç¼k¶?h:1¡s¹Ð™AsÈÚ¸éí­ÙþÖ ºpÇöóZñÖfÂÕ„)+IØÒ«Jw¦\XŒ)T1è%c´Dò6ÉW¦†{S´6‰õѹüû’XëQVŠ@öþD@þ“, {É­rYšEX/ž…UØFêÁ*‘ë9`]¥ŽóïUÇE×jZú¸[(áºB/ª£yH­&œ«…·ßõÚ¯2w^è*ö+äüäÍþïÎW¿xk`›üj¸ÿËÛñ¯†kŠ7¼ú‘ 1¡ó„(^x;h¥ó%¼ nroÜ+â'úø z4±ê#ÿiÇ÷’/Á*ù;º+Ý V³çb…z!Öœ—RŰZ¼œ>‚õÿÍXãïÃ:Ú°VVÖaMkØ[+Þ„u­aÜžùÖ½†ùÔC×VõoGý.Ô¿õ >ˆú¿¢¾õ·¡~ŽŸ¶=9ÿkk#Ö¿F`êߌú­¨ïBýµ¨?õAÔ/G}?êÑÞ¼Ý⵿èA½)ìÜoΠĮ®†Ðo™»2ƒ¸ö1èëæ1þÖDæ{êHï°¦áúÇȼfÙ¸Úö@;Fàf\k8ö£¦á81a!®…®Åøù®q¾âÿÞ-ÎOWwâêà‡Xñÿ7fßÓQzŽáÚ¢>0+0/°óËXysàBÈôŒýøkV—Æ/PÞšÓaàq”!½ŠòÙÀ¿ å3rº4‡PîAù ”/@yÊ+Q£¼ º_Uiãš)Gä='§óÀã(/ËÓ5mð _džAyÊw ¼^·ßŒ~ºQ>åYöá3¨è K4K5½šÞBÍïùšßMƒ¦¿qœM°)ß§P6¥©Øíj‘/爈ôŸ1Œ€‡³KÎöãœã)ß [ˆ}yÉ´iÚ7(ÚtR°¬­[*rÜNOp4k<<óÛËéopìEXù¨cÁ@šÔ.pûî¼sW`¿ ûã)6é{I|®é‹™ýM·Ëþñ¦Ûsø>]_ã N©[Óþ‰ËMÿVZ›¢8÷ümX®éþSLïžS§‡¦#'K'³w2>ùØôˆÚ‹õ%çïÉáeëŸsîY½?qB|ÎÏ— ËÍUyð¬Ö~¬lþ ö_½ñc¬>)A¶Ç&¨ÿÓë皟S>VÜoó·–ª êòà–“š7Ó*FÉ>0Ö®%Ë6i›Ìþb¸…í2û§ÒgË¢1å¶ÉùiY3A}Ûë8¿g¼OÄçX_Éòynñ¹i öÞ3¡>·`ß®øcXŽÿ€½/'Yú¼Ùòþñôý¹jr޽8!Ÿš¸Tç¥îÞ\,où™®{ûc9üü¶-Ïœp<ÂuHæ"õk‹}Ý¥µv"¸EÖ4òÔùÂùÈÙw’Xˆ1ÒjålÙZ?5 ´¶Λ'·ûPñ1ŸYÛº°Pï­ËóeTŸ'¨¿´D¾^T~êë3Ÿ^AŸ¿[n]9ѹbõ¥À“^W>óÉ ùÜØzNẵuý¤þ9WûÔÆ"c`àÆÍ@éí²ò†TEW#UÓ5H5t-Ò4º©–®Gª£øÛ¢Ÿ€%nDj ›N§›‘¦Ó'‘éSH3èÓH3é3H³Ä³i/ñóØ[šésH-b¡V±Ð±Ð\úg¤yôEú:Æú´ãý[t'8ùWúwŒüƒtœü€~Nþ‹~‚ÞFGÐûCHô0R#=BO BðØ:ƒGú}–žC¿ÏÓ è÷Å@€‰,X¨ ÔÒ¼À¬@UóZi)ÿ§Éÿ@Ë´±ŽP¥ö’_Y¿¢ùÚW´¬<æ×Ö¯+¿yÄz°òžG­G+zÌz °ò¤ß[¿¬üéÖ+¯zÂz°ò­?Y¬<ì¨uð3Ö34ÍzÖz–XÏ[Ï#Ázù‹Ö‹È_¶^Fþªõ*òcÖ1ZÀŸêmÃ6³Ïñ‹fˆçv…]A Åÿ »Ê®Ì^hØ5v `öEîµk³Gv½]˜ýÒ°ìÀsì9ÔbϳçÑ"ñÔ {¹½œ–ˆ¿Vˆ¿.­]ṳ̂À‚åZ Ê6I¢FÁ?âˆ3Ý$5 ‰3Æ$>žÆ4ºwÀš¸ u°,CÅ󧉟‚ìD>W—É‘1@ín®™£ Z¦Î<·ê¹gP:S•V™«fÏñÖ)±‘KRû 㨪 ^ªàUÏqi¦Ü ?vD–F>ncù¥æ ÉŒH°»Vãtw§³\`[·<¬ndɶuê³Ý‘M„N‰ÆYúÝL_ô*gTMwžNPó¬á Û׎)Ú™/P“â¦3«9è–Ÿ76Y8ÎÁ‘ νnÊöÑÙ Û4év3U]€äÛÀ{©“çGmàZ±ÙßQ–Ó:Öë}dÖÞ{ß}Q:SJtïÝ÷‘æ§³“d> _àZ°¢Z™Ú6Ý¢÷Eb–Ã÷¾Ål[,±—òQ4Ü;ŠWž&GÃ|›Ë¼Î¼±sé©_GûYÁªê_ÝIÚÇWy™ì€µ]3y÷W¤| sûbO)øN ò}™;â^¤=ã¯3N\ò©eÍ\ž»ã”9,u{ŠQ›ˆ¶º'‰6ë3 |ø>’92þn–èàä{Áýa¤;SCMúxýL°Í£•SXÛf OÙJù°Ø)OÚŒ¾«¢jòk3‡ŽOçTûÛÿ"jXó|Ÿ{ì×¹¿Äÿ]‹õN cQx2€û>2Ÿ,´ˆ‘VIª@›aªD›/QÚÝAÕÆ7кí—ɺ€ÿ+Ð@{ËÀŠÚ¨3ê@¥Þ¨•£T¸ ¡X)´ªøëà òOÆ?ƒ¦iü-pª5®2®¢:ãã:ª7®7®§Óø{àÔ`Üd|}Æø M7n1n¡FãVãVš!<Íäo~Ó,c¿±Ÿfß2¾EMÆã{ÔÌßù¦ã‡Æ©Õ¸Ï¸æ÷÷Ó\þÊ7Í3~jü”æ?7~Ní›GŒ#´¿ùMgð¿‘?l¾Öõá‰õ[JÜeÒ^´·˜TÌ,œ‡|ý¨vãuÆ0ϰù6z]ÆÂ¾Ò}5Ëóáìs¼ìü:™ÿ”Æ GëLéžN›½Ç™}1Ú2ïÅšc­š×q,9¬5’Îê¨GìxGþÚu¢5µÖ¡Í¼öáÞŽýrÿ8s˜÷ìíñ×NºÍž¬ÿjo*Ã>¼9ÿYk)OâNRS‡^lѼ¢ãíðXß >Þh.Mö©I26œJÜÌåzE¹Ða½Rî)X™õø‹5ïbpnQÜÛ¸¢­0+È„•dA’*²!M U@¢iT ©ê¨ ’ÕS5¤k H8¦AÊT IgR¤Eõx6©›¨’7Óé¾…¦C­Ô-઒w"_ižƒ^Þln@/ù»M4ûÌ>Ðì7 s™9ŠVàù•æ•4R\E3!ɵ4 Ò|œfC¢¨ RÝLÍì“Ôb~òñ}ÓXÕ?‹U=ßç ˆ´…r²l¶HU!òTŠ U"CµÈP#|Oß+Жù«ΪÁÙ‡PÿaóÃà•9«3÷˜{ ÿGÍ‚oæ²Áü˜ù1ȵy5ä¿Æ¼20ß3„ï™æuæuázóú¬ Ÿ0?n4o„ 7™7Q«H5G¤šk~ÊüÍ3?m~𿋄޹×ÜK Ì[Ì[h¡y«y+a~Áü.-2ï2Áº?0¤%æCæÓ´Ô|Æ|‘Î4_2_ÍW¬:ZfÕ[‹i¡µÜZ®Þk°;écÔ@_–ÿ46¡½ Q÷Íê?æ÷ÞcñÿÊñ;dž)î¯ÞX(%† èá-6i³y±†-ê4÷j؆Œ÷j¸‚‚æc®¤;­é®"ǺGÃÕÔdýAÃ5ö%¶ßï4ZRs‰†k)VóA ×U,ª9ªáz:÷ôéþoHn<}[ö-ŽÓ§?¦aƒ*¦ÿEÃ&1ý [ÔÔ8OÃ6Õ6®ÑpÍn\¯áJzWã;5\E û5\ üC®1¾Òx¿†§Qã¬Q ×ÒÙ³®ÖpÙ0ën ×ÓüæŸò~‹µ^ßü¬†-ZÙBó;õ-+5ÌõÝW°þ[’†Î[.¸R꿦a®? p•Ô?¡a®Aàj¶oë þó.Ô0ðç%4 ûÎ{¿†ÑvÞ÷5 ûÎ{Vðïü þó×jöTð¯S¯aØ×ñû…}Pðïâ}†}—ÌÐ0ìÛ¦hòõ{}ÛN C'm˜ÿ?FÛ¶hmÛ®E}C»¡a‹ÎjŸ.p=¿›Ó¾Yõµ+Ù˜~ûn ƒ~û¥þ€†¹þg°®Ú_Ö0ô¬x&ã×høÁÏ’úæzÅ3Ó Þ©a¦£ôÜ*øÏjøÊ7æ2~ÇJ ¿ã\çK}LÃ\¯dYÄt:nÓ0Óù¶ÀË¥þ sý‹·3ÎåN‘¥JôßÙ§aàw¦¹:÷i˜ëùÝÄ@­Âÿ½†¹þyÅ.+–hvY±†6È×QJRDžÅ¦É‘gŠk‘·khµek»äw¶ºrµ\ïÐò@ƒŸêF©yô8wh#òa Ñ ‘K)@üÌ7†³ü–Û::‚rŒ"9yœ¤¤äáÈtv" æœõäÞXp#Àu¥õ(ê˜jR…ß‘>s=*Š.θà2*5qp—ìcð9¦èPα äL‘¥`¬~Ô¥5;ÐkBžes?žpÍ´BÂIJsáJ¿¹VŠbB$K ßqP89-r/1´íÐ\G´Sh׋<"úrEÃÌg›ÖF"«åZ(~{…§é!.&„o®é>SaŒóÀM/¸n‡*]„<)œ¦¤å ÁY#¿ó°šV^/v`™ãBeX¤eš,ñH3*ß&¥Ñw\têÐW²¾·Fû©ò Dó¬Û”h”9Ù ­’»Y*ù>·½Àç¶ñ¹mâaª5kd¼n¶j/äþ'Çv 𙓄Ø%š7¦¦Jåbá9¥åc:Aì«ÇÑK¥ý¸¼M<)%Þ¥ü¥_ÊiéMy‹²4{íxÆà)õçÉ=9™¶Êÿžð¯†l£Mi ò$EkKžO1ýK%Àa):VÒû#Wýß ãD¤ÕN©e¾GpÜ9Æ9-éÝiÊcyàq2"Ú`8B-&ñ$§‰°ÈÍ^“Ú˜ö›ÕÄÏID£Žh<$£KŹ˜>öåÉ3"ã" ŠK¥ÍŒ´œñ-Ç#}8ËÒã"Í:꤅óTžN £ôXµ‰’•'ÑBÑñ-”“&,^6"²ÆÀÏЉ gŽø_Xۄ骾BÒ:)œ¦u¿Ìc\k-¬a‘RyÏ»3&îÔs†+Q?§½¨ÈäÊ)%³Ñ4Ç÷®êú²½ç¢—ï×)‰˜ ÝróÍ=#G³ñÁoÑ+ž9 í¤ü4.¾˜ÅÙjùçÎ>=Œ· Dç„øF$«'†Ê÷5ÙnƒY8®çØé-T0«]yTÉŸÓü³<Û¦µ”¤CÒÓˆœiOI3 £ÚÛâº_ECysBflGRï¯mš·”X%¦vE¿¥ö=#(ßê¨ç¯ÇЧdI|çsédçç˜^ DdÎô×6~¼)e>gjL*«ùþ2¬çØÈgG¬ªs/­åïÏÆTg|»Ç‘µ÷ªJDV?ñ’h‡ôZ) Œ~‰uò¿o52›¦Ñþ¬G: 1NAá8&1,(ÜÇ7‹µå;´^¸·¤Dˆ”; â¡å8³[Ç ô3”§Ý¾ì:¥OÆ™§eÒöèQæŠ"2Vr£¿Ø*ÇF²#)7{qý8¯"_¬`•ùkFnݯ=fH¯ÌröÎyôxÞÆòQèU9¹‡ÄWíýj¼;âå;µ—ºBcTü %%œ]3æVŠŠ#¶¿›•LE‰xv„¤²¾©ÖtNå^ËJÉ<íE…êHÍ!‹”ezel JU±!1&îLd휟®+:oôX#uÌèÌœf{õJŸcQHÇU%KŸøÎДVØ*j{:F5ciRÊ œ…%¸¢“TÖ–#2âÓ:²ÇOè:`Û$×±B›üZ mÜÕ@›¬4\D3þõ’³°âY&tΕv”×bw¤¾+ÏÆèøÕ§c˜oA>÷Î1~ç‡âþçiðu5”¥,k½¸DÜÝZÒâkØñ²åôëëÐ÷ü„¶w.ºåF Ò£«ç"¾ÆRã§][e.Ê}H®%væ]?+Îü|$û™ÓDöŒ+2©uI8«ë丱<μUâØÚOŒÊ7k]kW´#[ÕÆ`WÛŠ®.»Ö:[¼HØ‹özÉ~/élL‡‡ÜTh óbκó‚κhÔQ¾u’^ÊKîôÂAgÇ€ç8áH$íF££Ž ÅÃ^Ør¥!ݰÛõœøp:Êa7í:}ñ¤“HÆÃáH¬ßIƒÄŽÑ„×熼”„¼X $ܤ'§€˜ð’éQ'Þ7 ‹Ž w€tòïùDÂ7ñRm`#Á,ÇÒ Û;êôDbñ4zЛt“£ÎyC½[ڜÉx,í\”Nº©”ç¬hsÖ¬Xµz¥³Þ ;[âC½ÃÉ~çŽÒ^HýËN$å¸ÐK$•ö’P „{üËG¥éyœ’ƒ=[/|ëŽwnÛÔ¾eSO°¶ˆ¦bÎ%n¢o<Çèžöú"±H:²ÓsbÞˆ³SK ,äšÿ<•ÕV›32 8©H,ä a/é9ÈݵºÓpSN/´>%îg$žŒ†—¦œ¡x*팰p£Î0{YÚw¼ ³®“c̉viŸ£6g[2Þç¥RÀaޤ›pÒ‰9±á!/†:ÃáÛ­BnÒ A±2ÖBÑá°µ9Þ®4¼›ÅMº±~a/éwÓÃIvS!åFõqsq/Öuj8gJ˸ـeà½ñôd‚Nã1]•ˆGGU鼤ç ‹^(Â<ñ€RÚÓî çqŒØ—UÉZºl>¢F£^" Ó¡´ôp$•ˆº£PlÄPsb8N*„Π%7œTƒÚM;EÍ>€íGáz@”’ãi+’ç‚@$–æhÃ~£MÆÄ`IˆÆz5QÌ( ÈIAþl64ŸaÙãñA¨%GBе(-„¨÷§‚étâœŽŽ‘‘‘`bA*öòª†üá„àà#ÞŸt£ÊaîŽÝðV™†Ó˜!9¹\'ñBbú\¸àl„ $C+åôÇáx1­Ä**:n?”2äÅ”/ˆ’³Ô|ZMÒ÷;ê@õ°¹Ó¯‹9îˆ;ÚÔh˜£¢DŠÆ]î îgc¤X“ˆrŽ ÷§Ñø°dùøˆÂ‚A˜^748œ€'$´ß䋬«©«Y—=JŒTA¥–-%Ì‚ÑÄpã‡g_2>T–F‰ŽÂ^ÚÀÌG’‘´Ç¬Oÿ·‰ÿÛÇÍmþÐælvw9gžÕµlÍŠ³W¶Ÿµö,笮.‘øøV¼‹¬«y§ÖÛ!OÀ\ 1òhNqDl(æZO:qÄ87&Œ¨­@Ó±4‚Cq!œHŸØ*é]6a{9¡áT:>ÙNó¢k¶7á—9då' ·¸›<ºÏV°O;D÷ÜáùÇA s3ˆñß{ÿ@$Á×Ù‰8f®“¾uƒ“ØŠ6È*KÝÛrKº#RØbPJ»é©’Û¶Ì£Vzk…þÛæá›·šß5o7¿i~ÇüF)m ðËOÉÊOÉÊOÉÊOÉÊOÉÊOÉÊOÉÊOÉÊOÉÊOÉÊOÉÊOÉÊOÉÊOÉÊOÉÊOÉÊOɦ6¶NöTþ} ¸xÚðTïeÛå®êØîÞ¯'U›·¡”.©­«®·}^JÓA~‹œF¼¯Ð [œÄ½´,<*3ÔTZ«¬¿ßh¿Š—¬ñl «ÅÚ`u[묵ÖÊRZàŸ?åû—…-NBoÎ¬ß –Òv ~<àJ”Œ•¨³Â1ý[kOTJû›pf·Ì/¥i-ÿdÇûIúË)éÿ$cDÅG2/ùo9Ú?Ê<éÃ]ÀäW¢’4ËþíB¹Ñ¸ýóVŠ:5^ö]Öoiи˜X|Iû¾ÍÑ¡¼ýÍoæ5´ØÜOÝæ:Úh­2çÒb£ëØO,Êü壋z|\†aûsá#›Ðn)p^si5ö&øQçÞ†vËà[ Õ«w™§ËZ.oÿ×6‹ÔWËÊ[y{£7ÄÝ˰Ï>…¾ýFȰ¤lÉòVÞÊ[y+oå­¼•·òVÞþÿmöÝ´‹ suà:þê…m[ò;wr|»ÑI»Œé˰lÃ6íÓz„Ì+»)w“ßW¡9™Wí^;`ÜVÕgx>ÏçÌÛìÿ~»ù?ç3 fendstream endobj 365 0 obj 44393 endobj 366 0 obj 99800 endobj 62 0 obj <> endobj 368 0 obj <> stream xÚ]”ÍŠÛ0F÷~ uQ˜.ÒX’%YÔÒY´&Ó°e) 4¶q2‹yû::b $pÐÏwϵs?~x:lý¹Ïñ2½.!n¾wsµ}xüò8ž®bû´Lá¯"Æa){D§±’J §p-”ù>¼]®ñü8¦©ÚíÄöy]¼\—7q—?UÛŸË—Óxw¿+^çùO<Çñ*êj¿CLëEk-?ºsÛûáÛ6ëÖ /os*³¤†0 ñ2w!.ÝxŒÕ®^?{±ûº~öU‡ÿÖÛ†c} ¿»%o×ëöºnä>S)È@²P9È@-d!9¨ƒZ¨‡<  ŠP€4d’5! %He25„‘ÁHbd0’Œ$F#‰‘ÁHbd0’8Zü,lY³äµøYòZü,y-~–¼?KžÇÏ’çñ³tÐãgI÷> /FontDescriptor 370 0 R /W [ 0[535.64453125]3[777.83203125 610.84 708.984 773.926 610.84 556.152 763.184 832.031 336.914 333.008 726.074 610.84 945.801 831.055 786.133 604.004]20[667.96875 524.902 612.793 777.832 722.168 1000]27[666.9921875]138[500.0 553.223 443.848 610.84 479.004 333.008 556.152 582.031 291.016 233.887 556.152 291.016 882.813 582.031 545.898 601.074 560.059 395.02 423.828 326.172 603.027 564.941 833.984 516.113 556.152 500]342[500.0 500 500 500 500 500 500 500 500 500]445[500.0]475[479.00390625]493[777.83203125]495[250.0 250 250]501[443.84765625]507[333.0078125 333.008 333.008 333.008 333.008 333.008]514[277.83203125 500 500 277.832]519[208.0078125]522[605.95703125]527[500.0]550[320.3125 605.957]553[500.0]556[333.0078125]559[1000.0] ] /BaseFont/GFEDCB+PalatinoLinotype-Roman >> endobj 370 0 obj <> endobj 371 0 obj <> stream xÚ̼ x×Õ?|Ï‘4#ÉÒh´ËZF²%/²-K²eKÆX`¼±  ,!„ņ¤Ù! µ! ¡Išâ„,…–„@Ò4´%´i’†¦„finRÞ,¥¥ÍÒlØÿsGcB–¶ßóýŸçû^[sÎ;û½gùsï Bˆ›ðÈVtŒik¥?ô!p)!|fl÷Ôö3hn!ºÇq¯O'·ŽŸzVý÷¢×3ÝÓFßsíôgqýB,ùEsW® "â,ÅíÒ¢ó.Zø²Põ[\¯#äyáŠEKýŽx#xÎÛÇtwu,{ëÓóùËBÇWô-X¡«¿ð!Ÿ ÄvÉyËÏž;$N}‹€yʲ¹K \8 ïg×ABÏœ³tÕ…c/)úˆÀÑxÿ{'u'R—=¹}/¦âþsk{#9Hõ„’0®Åp)ÃJÊÉ\,ÏÃJÎ&aùGøOÉvò–ßÇJ>‰Ø÷‡r(ÇrÔc9?Àòíð$–wÓ&t]H8ºˆ~Žå/è„Ò/9 ÀQŽ#·–¯!À'øVÂñcøN,wñ°<‘ïÅrßG(¿’ËñaùGüï°ü ÿ –Ï¿ŠåCü!ÜÿºÞÛ?IäI;O¦3Èl2ŸœGúÈÅäJr ù>¹…ÜNî![É£ä'ä)ò3²Ÿ¼H^!¯‘·ÈŸÉQ|ª¿ásÕ| 2ƒÌDš$)µm"HÛIÒi"îÑ‚W¡ÈÛqm&^eò©"ÕX›ÆsP,ás©Ç?Ò6Ü·p·Ä3°k±ãkH#ɪíÏáž1µ¢ÈY?Tœ¼òiøD@̸qpqá¢àÄã ÄDl¨IÅ$„÷‘Æ{ºîäóÞGúÉ6²‡¼DþŒ-ÜÆ·óØÆcùqüxlé3H%ÙAv“½ä×äy—'Ÿbç ìÙZ ãa*̃sáBX߇M°…Çá§°^„7à]8ŸRBZN*‘ä5êÁûªÄ'™‡ró>È`8Án<«|P ~@Bx0D J! 1(C)ª„8TA5Ô@¯ž„¤¡êQÃ^£ìü³ÀùRmݬñ‘ßX7}?úiëÇjÛwi|Ê7x¥¶ÿußâ”èY°ñk…}~z²u]w¥VûÆÉÚX;ù;Ïçøµ?ÕøÿîÍñÏ1Ì/ùUãµ_«µ=ɉj7¸³/ê;õ-XBJÏ›»jZ^BdÂþÌ*ÕãÂãõƒ¨íjÍdòõ¿1§”Ç~cÛˆ“¥¯Žš~²t.J¼e^Àg4«FÕ;Tïi‡½ÊìoÔ „§ÌÊM~koúä[{3]cOΡm!XB³Â÷3Bj­ºµôüÉsñÙ/[®LYª°¿!íoò¨ñSjk¬#Z{Qîÿ¦µÚj«}¤¶šƒÝ瘶i ™3eÒ…l:eœB®œÞ5UAA††ˆE=^ïM§=µŸ··HÿW{°íÖÿ°‡é«s WýÏWáÙƒây„oíõï·ØöÍ=›œ3waßÙ¤où²ó—’‹W0ºfåù+V’u+ÏŸ·’ܰrñ²…ä–¹ç­ZIn?gñÊUäÖÎdëÊ¥g¯ «tÇy‹Í%»æ##?=‡Ñ_¨5¿ž¿bÙ"Â|-§^›S;]­éUjÐz›Qñ”²Q¥&•šUZ¤ÒB+XU*©Ô¦žÕªÊ>;öh%J|ŽŒF™ž‚vxJkÁ]‡öøN´Æ«ÞçjËÙ\¸˜U¿XàÜ÷ OÉO.pO㥅íºö7Ì)œW¼¼À9ï.p“Yã)Üÿq¼5p! ò-ä!\³ × ¢oª!¸½z ΀;U>îRùL¸GågÂ}*Ÿ[U>[µGø¡¶÷½…½ð.lIÜ­½Y;úí(ÔIØ¢í[8ÃýÚyûOÙãÁ“e=œŽ÷4Ït&ôàÙÙ¿}b9>• J ÅžF­†ép–Ú@c§¬S¶-×ê9ä2n›¬é1;’Âå°WïÀ«ÿk+mÓZéaí¹ÕžóGÚsþD{šÇ¿ÖJh{oÿF+=¦½C;ú‰SÚàÇ_k¥Úyw²Ç“ÿ¦•˜ýä`zu†õ8|²»°?(>ƒ½þ8–Â2X+ ú`%?3½Àûê,³ fÃYð à‘>´xs`.¢†³a>,€…°ÎÅL³¾ë(ɸùÿ“'<Ú‹ØtbÝ1¤ßd2ñâ,Œæ“sY¯ «È…äR²†\øú¼‹xeÀ=0„s:. q9—e¸,Çã#ÂPÜp9ŒËßTÔ½/ü ¬ƒ÷Q÷PëøM¸ÜË\và‚h—=¸¿—Œ#, KÈR¼—õäwäUò'rŒ|H>‚?⓼Gmü&þ~ ¿ƒßÅ?ÉïÖð3ê7¨úÏÇÐ3ú*£Æú´;=O»£T<°ïúC¼; 2Y‡QÉ$~2?…ïæ§òÓøéüéüü ~&&?‹ïágógñsø¹ü<þl~>¿€_È/âÏáóçòKøóø¥ü2~9¿‚ïE,»’_ÅŸÏ_À_È¿ˆ¿˜¿”¿Œ¿œ_ͯá¯à¯ä¯â¯æ×òëøõüµü5üuüõü üü÷ù›ø üÍü­üFþ6|¶ð·ãóÝÉÿ¿‹¿›¿‡¿—ߌO{?¿•€ïçäâ·ñóð"vþ¿[âÇüOøüãü…6áŸâŸæÊ?ÃÿŒ–ßËÿœÿÿK~ÿ¿Ÿÿÿkþyþ7ü ü‹üKüoù—ùüïøK0öz#¯ƒ„Á›ÿ72¸•<€Ƀh)·¡/|£±ÇP.·còcôŒ“ä ²‹<‰’ºýäÓä§äŒÕžÅåçè5÷‘_’ç0rûÆ+Ï“ß0†û-yýüïP®¢ BÙz¼NÞ o’?¢DƸf#¼·É;ä/çýF9ïa´÷ù+JËßÈß1æùö8Ê ù{ú_äSòùœ|A¾$'È BQ À:Ѓ£#Œ`3X1N*ƒcð1ü %ÄAÖKBnùÿEB¦ÿ¯‘‘õÿKdä¥ÿ%Rxß:ôå>|öûð¹˜_¶«Ø2Œù·£m›ŠèqÚO–Á¸üˆn"·@@å·AHåwCXå×C‰Êo†¨Ê7‚Ïy øÞÅHo‚ Ò»AAz=°ŒÆÍPŠt#0ôs«ze'K,ƒq7+©yfÇuˆ†ñúän~:®­BäìÀû-Gï0}Â<õ(sÞ£–œìü*1ƒ‡‹:öÀg.Ô±¼È¾ Ëa¯³Òç¨GÿÒöbåá3µ†au;Z阬h-9]µæ¢E•"î®Å¶È»ªÅ”ãóW«ü6¨P[£Rm¸š±ªQ[#¡¶F­ÚIÖÌ/¨ÞµŠQÍܰ;q©{¸µ=xô”8U4yƒÊ'ªeojûQ=kMƒZšw²Ä²hßWKï—Ô —šwPó[SÔØ„øâ:r;Z“YjüÂ"]ƨC*"m!­¼‰oÀ+(ËÔוDôN‡+ÂbìÔrYƒKv:HI„Ô×eÒ)—Ó¡/‰Ä†Ëð¶¯e\C˼q³/ºkù޵õ±'ï/{ò­Á#¯ünð_oß}Ëïw^Þ·þ¼3FM€7ã®ê SG·.ZÓsþ=_þà‡žê=ÚU>øÙ“¯¾üoî}÷ÙÛ¯úÉ Ë§]:1Ç"Œ’¡}zQ÷2¶ˆÕsÌ—§=GNŸSQº›Óp, —¤¿HSSú…4µ›ÓL—»‹;¥ÝCï쌖嬷h¼Hãfäy IÉãakŸîÄóâÖã;Μ‰qÙž3j\Ü=ôWÆ´z½ÆugÇ囼ޜÉã÷#q¹r6v¿R9«G–sF¬GKHŠ13‚Ç¿»¹Qã¢Æ4®×8^÷Ýü§¬¢ Z)¸8u]ŠêS`¬HjL‘⤓`H‚GŸ„Ö…É£Iz~Ĥ7IåQ¸¦Î)cÉû%Ô,F*"T6…¡»IÖxÈ ë-·€X][´§ˆû^ŠÀXi…J TÁ“f¨4CÖ 3|b½y“¹ß¼Ë|Ȭ3UšgšÏ5_l¾Óü°ù)³ašié6Ó¦'L:Á¿6¾f¤ßA/€M¼ ŠhaXl 3õ 5ÌiXÑÀÕ'êL%©t¤4™Ž¦yl@§›Òéq{rNöð2kIç$'½× sœàtZa÷ÐÞÅÅ9Æó^·;· *Š<®Øƒ]ìÁÊbv° ~¤Vß[|¸˜#ÅR1-.ŽT±ÆÅ]Ï7áQ+ª */3UUQC4bMëL\ª$©Dc¹ä,¥JKM { À¹|¾êJ®¿š $#ï0 WFÓŽh4m¶Z¯ˆ¤‘Hz½¥&®»Lڇܣf€ Ïï‰Çñ¼xx¼PÒÖ{Ùºd1Dú­ôÛd-ôôöÎîaÿ¸¹Yo_o/Öa%²ž¾žžÙ'ÿûzzÙn¬ˆ…>,#‹ÿ×?WèQ¯w—Õ7Œ¤ iHƒ;ȹÝNC¬DoÀê š¡2.Ì1›T¨Ž@˜³sU¢ØUN-iÂøQðHÖ;ÊÍ Â¹ÓúûaE£å’Ï, d–ŠÂs—a¨òùµnA¨ ¨ì¼wè9O<ñ¥c]v§°NÔñH©µØU É!Ò¦x=¬Z ôL÷ÙÇ,«>ô)©n=Z£‘dùË[0³ñÎFÊ»÷ìóÐJ“ Z1Á:#Ädh—×ÉGeÎÕÚÞz´•swê¯/­¯«çÌ™úýõT_×_·«nßèñ2É‘‘ó‘’œ\‰Äîñør2“s¹ÜçÏÍh‡;ÛÁØîk¯l¿³ýáv]Q+ÏmfKÆÔRàOo… ±º}wvP¯m­ ZÏoå¢­Ðæg‡êy)ŽZÍt3®ji_/éíCÕ=©â½ª~T\SavnMYU€}½}…Í=vÔL„ 0P`rN‡…+‰”¡~ÔV®·•ÕÕpe A ¶Aï´³5¶Žl¥‚ðHOÉ?'–¬¿gÎæÇÏ»aaSù’Ûï½ÀsáZÓ˜³!'›€7H(Nµ¼|ßȵ}="pÚM÷M¸ðÕ-º6CÊ€jš¹öôå?«0Æ&]Þ=jÝÕ³+uœ „>L<–¿=¶§\2ñ'>ã7^1nq£uæ‘/Wʳá1~ðDBCoêVêî#%ð=D‡}#¢Ÿ0¡c=eA×^$ÉtÒHVeÄmî ¼€ëSÉÞÉx~¶héÜ凴¿Õßí_é¿Ê¯{à &o±·É{¦—ŠÅÖÉ c„·O€©ÂGõ™+Í93wT€mŒ3@“ÎÔ} £IÝÏu”×ÑmÕ}¤ã]9Â.qƒìÉ}ÂCÎ 4p_€f¼°Î³ÉCKÅ:qŒ¸Jä/H @0NŽîˆr@^.ý%PrUŒ!_ˆV„žÑäSr!ÁåÍ…náìK‘Û*·ÈgÉœEÖ¹n-rÜÕn®Ùä†Ü_¸©ûf·Œ¼Ã¾U²@Iˆ° a*|šÅ—©%y²î, ­ …äDÂC7.çCeñûÅ4[ÜU¼­˜+VPØÑ{sÅ*Mñeù„¬zP8$•z}©þ<Oâ¬Ù=øëõMP¥]ñƒ³™èö¥R‡K‘–¾cIÜ7»u!Û‚:ƒÂ¹¿·7•eÞ‹Ikú‡ŽFuYìÅ™y¬ëÑ;jЗ(ÄV'—¦S¼Û­7JÊʘ òÔéy&© º•±·¾üÁ`óô] üé·ÃŒ]/¯Ø6øÑÆAõó3¶.Mmëé…;aÜ;0m[c™±ñO‚ðpnÔ̓Ç~õëÁWXœúT÷Gô!1Ò/äŽ+vD“ ,tù«5ãX­ÇjfGb?O«~µšÞV ®jÐW÷Wïªæ¼Õ—å±VÌ‹sDžˆÄ"ççĬ¸œ.ÏÞ”¥G² e!UV¯ÙLÆó¥h3ë™Í¬g6³~u¾ÖŸ÷ÓZÿ?%þÉþ5~ÎÌùQ(Ÿô:ýþ%ª(Å™ õ$)žJa÷kƤKÅ ü¼øÊiùøX_¼å ’3™Çð—¬ÝsòÙGèé!j¹ S½ éØÑFS<³ƒÔB¿Ã&(³¥r½DÂÌÚ쎠ðX ü5_-šýØŸÞZ5ñµwÛÜH¥Y Í:>‹Îàf¶¹½µ5uõV‡¼ͧ0™UX£°þA`®°óØ9åiš%^R† w)c®Ù‚»•)¸O™„;”í¦¹¼±æô~ðΪ©i“Ùu(Yò,ÝJßØÇŒÝ1ÐÖ8‚—D‘Ô9¢žyýúYm2ÇÍœ9qÆŒ‘­¦­‚N?²|k4´5)m=ªi먈ÅÙ1%NOgé½#AY;ròHn$a^cÜã(­vNÄ.âR»‡Ž²‡N©1 UŠ UŠ U*Uç®Õ6ײÍ!Ü\Ë6ײ͵«óÊDŒÔ'O\3qóDÞÌMÔÄm♿7”¶‚ ‘M0îN¡|¡œìéÙïÙN9%½:â˜tL:”BcÆ`½-‹xØþx!¿œ=&=z,ŽØ^GU|^ ûúlÙ¬æÓ÷KûU¤ŽÞ\B>­D &Œ!ffŬŠÝHÚBÓXïf¶­†S°Ã¦ 峡·èS‡£ß”Ø(×%Àés±”ÎkÖ'E(j9Ü8éžãÎ;sÖ¥NÏ 5åtH ¢¸pqî{:Ýî/n+8c­ Ú Ï¾0xü¬E_jÚÄ£ëõ†9/ ‚h˜6Áo3m~ò½¹(š)K— ˆöb‡Y7uß+g›ÝîCüÐxá»Åý*çØ³5ˆÎºµä4X–wÔvÃŽnògršgrš×ä4¯Éi~7Í>ž uA×v ‹jÕ.&ª]LTËHvÖäÉ%æºÚª >Eâ`Œ§f•Dƒýჭßh0Ë%œÀäXFc(xX¦` „¬Ì4ZÙY۰ƺÅ=ndKWçØŽü¨–­£Çníè]ÛšoÓº¦uGëÞÖ­†ÖVˆÆjkª¶V´Ä`{ìÙµÆZb7Å8SÌ]ך!d<E¡&”À„Vç%7÷d÷÷÷q·Î̹§¸—Яì\ASó¡}(qhÝX(ùê®c(N2©”ôC(f(‰jØùÉ1Ü9X7Û%q,Re°§ Š=ªìód°¦ ÐH®¡Á†RV†etŸ (]L cìŸIžÍyR" ·Ë9,“ð8€Ñž9WÃÊ  Ìnv±T¨¨ÖÁCû\Œz!a éœ'§,3­®™v±§ÏŸ /¦ 1H†ZCÞ0ǰ°Ù`Æ@÷Û1cì71cÞØE1®$Æ0bŒaÄȱËò7IÀY%ćR³ô>ì)øt5‰Ð«âCµÈd}¿„R›N¤¥ƒ),ëÕ ¢Vr§ÔÈéèQ&ÿÌþ"fÔ<E_¹û¶ª&3@zf«2h‘,ˆÝ>)¥Ì©+ÃØ±†?;6dêYØÃtÁÍb%Ý|RÖ‹&ýàß¿5xç+ð:\žÃÙƒFTÇJoÛ4ýÉÁ£7Ý Ê³Ý5ŠŽIW‰bóÝgg—ÑpÐ0™—L8}¡qñC0öm˜ ·Ÿej=dέ“-Ûÿô“݃¿üI8¨Ì]>©L¢b•Huz”áôЧú Ð6.€ÛóæYT»ˆ*‹6/¢£ÚZe‹Tâí÷Îî'µ¹þ†ñÓû»ÿ@'4Ý0P?©{à4‰ÁAiVm+H­›ÑRiå´i %­Jk­jÇ6¨–ìx«hlm¥§Õ˧ÉAŽrÅÌ6¢L<‰v°qs>œb¶²+SÌV¦¶Tê'[ω¬fâæöùSÙAS 9>{nê–Yr^A£—gr–×ä,Ï6— °äWç­•Û+©«\T¹ŒJ‹Àº(±è¬EÏ.â·/K»f:Ï—ãYÚ™élg¦³ý9C9@fMžµfÖ„;h=g-œõ•õ<éÌ¿BŽÃ5ƒùu‚¶³¥Å¦æø;GþÕïÄ)¿ýè¿ ¼ÅÄ hD-œÓ€Ri¨?Õ„²zƒÁ¦ÚÒaC[ßPeÝ¿7ÀMC¡0šÒ¶q}s˜o `”3K ¨”¡È Ah1ÅJ{ýA"!eÈ`˜=Òa¡ƒ¯}ïâÁ?[ä!%4$=#O±Èºµh=S*¸N둯˜T¤nC¥)’jú‰3ÜÔ‘Îðsœ_N¥¬Éd™Þ=,Jn&Jî-ÖÚ¥ÊÊXÚbÕ¤Á:QX™4X™4XWç'•)ÛP†¢TVV·lµ.CIк]38ñ“}}·}­s ¨ì¬ž»û”^±Á)ýåš.»$ÆzDíªáf×=ÒQþ­†‡:‹n-"¯ïjd†¾Ýš§©ièÝÁ•ô´•ä¹=ÄŒšcBŸ$˜¡{•¼ÌQt¸rÎ*Ù•›T«€T¡h”ôWÆÊÎÜ”'R÷<ÿH·®¼Ü›,ŠE[Á-8E¬ –T·—¡Lþé¼D<6[Žx‚A$n·å«ÜÞœŒ¾ çVìžœ‹'#?ŒD°½›=G%$Vu¤Á““T^œ³1s6„w9j©‹'#Žr£-ãTÎW¨> œÀ;J”w8óï8t9Àª€dT »R§”ß(ôaËoÈœT$Aw@‚Ç$ÈHð Ç½¼P¦6ê (F`ªýJ§ ͼÛî´ÑsmÛ®³=e{Ãö¹Mÿ„ *mð ü þœÎ~›FíçÛévX-Á<%Oz_¢Ýìä~B9b–¾G?£ÜëYx¯Ê ð&i"KÈ„·ñºØD F¦z“òw…îQòi0)ðˆò‚ò¦Â™”¸²Dát²SŽÊmò²îFÞ•¡BÞ&SQ®Ëïɼè` ˆg׸¬qÄâbV¯rY…øX°)ÅJNb$ÄdtÈ‹ú¯x‹s'ÀRïœìñsÅãÉÙ–„—óÉŠÓ…‡"‘9èæ¬%VêÆnév…`r”P>4'´!ÄO *Á|pNpCPçåƒÐ=5|pkð`³gÓ4†da`WàP@GJ Xà‹‰º%Çd%޼cƒã¸ƒ÷;TR;tO±÷Ù)µ¶Ï³ßbÿ‰ýû?í†Kd°æ€=Ø´BÎb‹l“ù äBKÝ tç»çts¤»¶{E÷æîÝ:ÑåçyJ<ŠG%µž ùqžÍž½žãC‘'Kxx7tGrH!ÔfWã õõ¸|gë@{Yº¿²v ¦X®‘®sB2ßMmЉ¿aS2žgŠ ™yÓ%¦ZS޴´WuwU Ûê fI*6+£“Ì”$Y?±&¹%{!ŠfO”a{¢0{¢0{¢¬Î“ìäìšì‘ìñ,:îì”ìIÇ}ÒIމǵàf?óʈà0†–ÝYÕWFØ äÐ1,¨ƒkÕlpÍE(ý›ì°ÙdÙ!ÛWBŽ@ Ćׄáá5^^c¹H½làΖVSí,Y^È©÷Í+dÖ{µ‘/mˆí»ÇÔ<%;TE¥…ýñ§¡Š>•i'Ž«¿¾ÞžÂyûz†sôlÈî;Î #iCÁ<2„±€kx`Í‹Œè¾ËU5œêÓ`χo¶ÇÏt\gzÆ\5mp ysIƒÁ½ìÌkO þGW&œêôèÁ·ßì%𜘜K&~ÿÄï×{¨P)ðüô«áЫÿÅËNõ‰,r‹}Êß¶ºŽ¼žóÐ2µ¤Ì‘ =ž%*¤ûAM8q.»¯¤üãè€}V‰¬„\^&¸žÊêNïÖsU K0NöïðsþXñÏÛPDõL`õ›­…ü§æúÈ×±EÙ7±…Äœêäª5U›«ŽT¯Ò›¹ªúªSÃtÕý¡°2•^<¨¢ÇÔ~¿|rLÚg˶`ÀÂFƒUÌÈœ ½áT„ápÿ›¤ÎI§>=¥Åu/~tQ£©ĤA° ?|aðóÏ„‘æ¢awù×Ð\{ÿèÇÌnïãA(?Ú¡åcËGÂcZ/°v ½c˜§»’œÆíÁN8ÎfVDb÷ûGë`üHÞ‚†uœ„kãg€ ŠíÍŸmÍ#ùlŽèÁ(-މ^åĨ7Jűޱ¯åÄ£0+ ‚0V°Ûs]Œt2ðbc%Kà é4#qºs]Œt22^¬áÈMÐøxæ,ðú4>‘ñ@€¶ßéäJ4ÎðMþ5<_ûÄéNä–L€©`áxøbì ¿ ec¡KÂëoê}§«3ÖùI'Ÿí‚ìX¨?m£o¨üÇ߯˜À œh›7Tî B­Èé¤TŠ3¿9tj­N÷‹»¿ü„>áÕ:´É¡CzfÚiÑY%Íe™D<>ÄÅHå&¥ÑÊh:šÕ:±v4«ýϬÄ&*©Q;« A=å‡YÎe…@(—]#z™uÂu/Y+Ç:ïšüá$X“Û“²&;“˨$'‹GÄã"ê”Ø!~åa¾¦Q.±‘Ð}LzTR rVCFûâš"4ŠåÉvD™&™¼ÙLö §×átz×£â\¦ªËìÂ< ¯©ÑfþÔI>|½­î+©Fìá¶Õ}±1-á6»Ë»pL)†“£E±¹Ëi0Dóáºø‚QЯN;Ã`ô¶5 Âi›®) £;eƒãÖÔ%¯ž˜i0JõÝ‚P·ê6ƒX#€Ù?òWžN@‘œwâñ%s8}é-.5XÅv+ æÞ¨Œ[Í;xnÒ ¨ùkÊ.áQ{­vhŸÞ§{™HDaïõÒÛ°#™÷1HH8 £ ʈ•uñO°ªß [%Ø'ÃB2hzéƒÀßéÀ8TO7Q*e¬íVÊ+eªÂÍ7‚Îát,pp²Á r 5,0Ðù†­†w Ü|=,1ÂRËeбÜ< + Wn5p»ŒðñŸ"µO3Ò?xÀ陿¡c0Õqµƒ&í`³÷Ú¯°ÿØÎ·Û¡Ë~ÿ,ÿ ~ŽÚSUL±ó¢ž=€Ýö,èyȽ}hSˆ+B ¬ Ð꾕õxkz»ËNÝsXç’|ќѲ+âJ¹¸>ו®[\œëæN3˜íA52ÆtAˆ- ^¼1ÈÁê W¼Ù ƒJ‰ØÂa›ÙÝõOGö1iG'âcÒ~›dãï ßs>.¢÷¹|ø¸ßey"À|I"¬\ŠJ…åtE)Ò¥””J¥›K9»µº¥/¥-¥ÛK©µtyéM¥œ™Ãx÷mŒµÑÆ&6qÑæµ]dãJl, mcYhËBÛ.Ë[ ̰’›Èa‚—!%äd2ºoö7²Ñ³5ÞÛ÷µ=Ô*Ü ÷°iÉ#uòKh´ôcS´üÑðä»BÚY NuÆ¿¾Â„†SöSSß°ÚëäLiZ!6åK"¥1Úà]lê\_GKK"«×NJwÃ4ظð¦£÷þí秘t÷KWýðŸ—oüä¾ߥ.ýñ&àÿtÑàƒÏþyðö_/} üO^<ø?ÏÏû>ÄŸú ´o<;?û¸áï×­#-pMþ‘5Àà¯GËþg3Üæ†?»¡U¼U¤ë ð˜÷ïK^îï1/õÖzŠ;3x…=u°{r‡Àí¡Qg¢²Ý攢U9çÝŠu•Z­ñ@qyeª³x£¾¹ŸèÈÕöWTÄeÊÙm2C’¦€2àO”ecù0„)ØàÍJK 3µ5*8Ášš-³òVtOó@»<|ñ §˜=—åwa³¬Æñ,#'rÆQÆåT«GmE¿£F¿£J ™É™5}Ï`˜šÉg¾ûOZg­¦Ð³'qN!¡.=<6wô†tâl £çD<»?[ ˜\°‰0l¦‚Sfh©y25IV˜âmÐÛlÿ>uüeÛìó/ Üðä…S7ÝÙ=r¼M—¸êÞwçÒ™]¶4m­¿æ¾È„Á׿;|J—½é?ô©n"JÏ$î–=$P”UÑc/l»Â23ŒØ‘±2baD_żæïsÀ>;³¶óexÎ:ø2t°duŸËÂF +¤‡%ê6Z±d}ØŠ% t\l9§ÁiL€f£—×Éð± _T€NxâAx]ס 0#ø^ê§ð€À­µÂÖW­´Â¶Çö¼;ÃvŽºl0CZ,Ñ}VXk‡çðÇ$ÄMV°8™¼Lîθ4îÖ¸Z_“*Ô#wk¼ˆ5Äh”y Ø7(.PœlÒ§h†n> XÍ9ŠhQ9{# –zK©Xâ-¡.q¡H °Ö‚¿Û,ÏY>¶ðznC},z¢ˆ^FE‡Ì°©>)‚U&hÀâR<Øž.‡&0lÚÚ«xµtapGÂP?ú¸±.ðؾ›÷Xÿcâˆå% t÷åSï[(›óÓž—‹õèôú©/)Äõßzõú€kðÞÿ60RÝç9Ýý¤‰.Ìßל·ÈÒ áíÍ`m†\¢ùåfj^ÍH¢ùÙæÃÍü~x#¯×³‰lUÂ*cazó!ÏQÏ'n.ÐÁº,\-Á:´'Aç…C2lŠöGéEQx]†‹ì°Ð±ŠLE{7=»0{AvSöPVç/Çk¯… ’xØô$m—¦Kt‰æW£ƒžw<y8›ù|¥YÊD«ë«iE}¶ž;Ágo’Ý+uAŠÆRý)Ê¥ZSÝ)Î ”±Ø¤%ÂY#¬°<òräï‘¡ˆ!âÈ‚P‰*”³P]$R6s;ÎûO¸"'ÁÒN£àè•Â-Â}W"¤…Vnn°³I];qŸ2†Ê¢¸Ÿ®ÌYF£Ee²ê2®ùŲ?–ýµŒ+»ÙÇó%ŽúQ ”ìÓC (R‚j~-é æÍ¶Ì¤àËA¬3qÅý‚wÜErî/6jЬybö’N¾‘˜ùò{ëàxHuµuêŽÔñuqÕâLgã ª¡gýgâ—[Ý!75©3c {³܉B ö˜:©ùO¤˜ÞöJ‡atõ¯÷P/‡§ Äã-ÇÔà^vgµé¨­Ò>–ãM«Óµ)¦ñáÙñB® GÕÌÂlA–îÕ0…´7¤™æ¨óŸkhY __WŠJ¥M¨A­×;Y HÕw®ÊÊ2“„¤ ³ùƒ çn›]}Ú9‹æ÷®W ü›§¿4ÕàÒ‰u~´pÚÆñ5]s¯øñ–¹ƒüëå»ôF8CÖd[Ê'þ`öèyM›äËt_Ôöôßã•æY † GÎsËø¦3ë}voÇK_|glQ óÂeˆáØW#¸òÖÜY¹›r\(7 Ù½¹í¹Ã9½’«Í­ÈíÈíÍÈÏH.«{±¨uɆ5æ¢¢Ê ÖuÁXNMïÐ5“ ©B©àr77úÎ¥x•~æ<ñ±‡Ù|Ï)ÈL¾êõmXÜ3è·rP“ØšªMÔøØŠ=~ÌŸI“ë î3I³àŒçhÁ%& ³àÒê›b°"¶7F÷ÆÄh,v¯gÅ`—Í—?t,¥.ZÞ•´°YOª‘>Ád`®ø¤?Ž(Ä·=½àÖÏY*Ñ;¿cLÞVWÆzÑJKT»Vø'E#G“ :–yFPm؃aˆ•ê<' n›µÎ)1ú¤ñGpÜ­[+Î<"ˆ³Æ†­Æ?—œØóËÞVç7ñí>ÂgÎ…t‰{Ã/ˆ‘©#Sö¨ض‡ØQiD§3'{ävdŽu¬•2,ñR…„¡ÔÌßrˆ˜Êt?#ú|ÝëuïÕqýî]nÚ_¿«žfäv6§i§Š‹_Ëw˜,‹Ó°8 ¦Ü’Ü%¹ës¼HºÖtmîâÌ í\YI‰®RQaŒn ›Qå8Îéð„rÎ{no€{G‡µ½Ýg­îüÂèÏ–äÉ ó÷‘;ŸmϧÔt{³oMþ¬$,ON%9kòÞäö$gã’]Ée”Ý5%ºÀÚ5©ku÷_RóÍ@š'7¯iÞÜ|¤ùx³ÞÌ5w6Fÿ*+ÉfËŒºU“‘…˜®÷Xœå#|sKq2¬ÓüwÏðìô¯ÜëÉ<>³,gjöoxˆúŠE 7œÐç‚§¦ô‹âgl=gÙ³óC:{z• lœ1~³(ÎκM”óÏ]{`Å ¸4#iN”+Ò#¿ÿ‹»o]ÐUӼꙇ n"Ø*œ½*Ê[­@M®š¥ƒv½²þÌäÈ…½wÜ k4/ªÍ¿týMw?Ú=#?Aô€ÞzLz'0ÐW©?ØøtoJÀC.Øæ„)<œ€<à–®œ[qrån¸ÊͶéÝ, æß½÷hœåvÊ.5ƸGã¼æ78SƒÆ‰ÆyuÔÝËöS9Õ8hœhœg×Ãã4N5'LHŸÁï‰Ær#”`„0r{õCÕTIÖ&×$7'w$u““+’’\"9)yS’[X>xÝqЇ6 mÚ8øAÕƒUt¡s°ØK|×û¨‚Õ¡{CÛC\(ä Ya…u‹†‰²Ãe´¬l¹ Îí­rr:=)öGÃ%R‘¾¿H0•p&.AìÞ*’przt‡“Ý+ÜÔíNÖò7j¯ºÓÄ£½s8œDÿ*yî¨J$®t{n·—pÜN·ÃétŸ|Ѱƣ¡TöžaO*Ñ£¾W¨’¯fÖiÞ±÷?¼HzÕÍ ¥84àZ€¶º_Óõ%e7Ëh|MO¨¨î°.|4\,Šw,™ÿ€ \”È{! ºâs’‹âöÚ²û¡3è1øëÅUr”r]Ê b “øÁê4?3êË÷è†V¨ z-FTU8©fý 28ÄÞºv3üQw+Ésç?ÑÄ^åP_bó>4ÞÄ" ”µ&&K./ãÇóívgîûM°&#<ö@®™‘‘Œ´0’g$ÉHŠ‘4#uŒÔ3’a¤‘œšS3å*oÔxNÍz»Y½Ê5α7žË0vjò Ì1’e¤‘Ê0BÔUö–´WU•«*àôT9hœhÜÍ š(˹b3’:U!弘,¸š!;.n‚…MàmÊ6ÍhâÚrPœ…6ü5Â{p{œ‘†CiàRp‡ò™BÕ3ÎcYU. AÖ=ÅpI1¬+î/¦Ÿya¡¼ž‹<4ë†3œÐæ€Q8ƒªJ„?€ëðG˜B…F·Œž4š«®òzsÕUè««Ð!VWá©««Szæq‹Ê‹‹ß›÷¹ãzÐëéêè½QJ¢R”FÙŒ6ˆ™Ÿˆ†6XÀj ›l±Ø]jo ¥ :âóz5ýñÒþxÙ@…µß¬ë7 Æ ÎÈ54æI£Ø•#4àq‹MCÙér¦£°›º4M!…à㔄έ q”Øó®€×רJ™G­h‚¦¦Ñ£†u׿Îjî$у:ÇĘÓ9E—‘¢:ž¢ÐU ©Ô•¡€# 4å›rù+]^‡ËåmljºÂpøšFø„Ò+ì.‡Ýî:©è‚öFñzm˜ì[¯3¥XOá-c¦×hÔà³·çkñ¯^«éùæÈÁ°Úˆ‚Žã¾fôª=°Û3ö´Ê¾m œÞÀ•Ð2E¼ 8óçîT· lXÞ}¯(,¯.—îþ×ÜÙùÉÓ>xØ7>õ=Ax¸DÙ!٘ߗ[äjZ¾ðœ1ïüjI¥·Á[¸†yn£P…ÆB¬x‹Ïy¸ýÄ8ºè#0}ñ׫è´Ù¯q¸ÿª ÔV2í©Áí]‡çAæ)ºxP|wyû= ³é‡öéj³eÙwAáš¼E”‚¥9Qrxr‰, úhg0ÌæÓ¨ÜȾA€\­/|sà#í[Ý){riÍÔi¼^ã7|Ã^¨sçca›v€[€í Õ6Ó9ˆ†4sÅ ²—Óê c « Wø¦X®xRbÏÇÓÒÏåE['Ç[d›d¶p¡x¤| &75%s9/ßÉð/Â;ófd/ϯFÜžÙP– ȼêX2/d^ȼ«SR$!™èé¡B/r´¿'›õ¼$½#½Ã2'ÃpKͪ‘NKÿ?g2.gw”2)/EcCªá ^tð¼ÈÄx½pÙ¾ģ±æiz o~mÐ ! N4HewCƒ69WO-Ôùscêc,ˆrVQ„â`v飓®ª ‚4”>uxÒå*€5¬O©Ræa þ ãUZ=ó$ù!EÉ9¯çàùb†ƒ¿ŽÃ9qx ÄÔZ9è~+o$a&ÊB îõ½)V8à…©ÞùÞU^nf˜S¦~šz1ÅíJ‚˜·©Ú—Tƒ©z\õÓÕTófUJY±²tléÌÒ7Jß/5XK=‰T§n/ûFEdOä³'F¶E¨UqF^píÑÈù‘µ®>ºÈ‘ç"ùä_"GtS¤8ÒáÅåëÔGEèÌ™a. A}m ÷‡)ä0ë‡Kr¦*4>DÅ .øË mQi{pzf‚íATLRf\ñ™Åô=/|Pä½ÑKy¯Ã[ê}ÜËET<¹ƒ§&•1 û\ c w¸o€9¸˜xÁ!l¶ |È(@÷ûHTpÀ)vog37£9îbŽVrc¹s9tl>®’ãüF/Ô”{œ êTzÜ*Ò> !îù;ÑSVªoäñ ¯}t¯ãwñT…b}Æaz6E[2€°ï³c†ÜµÐb†Œ¡ÝpÈpÔ 7ÎÐß¡§:=´é×ê?Ös·òÀñWñ¿ä9/ž·õÖL"C$ÝŠ:ò‘Œ’™“ÙœáÅsx_§5Š®ÎŸNyk¹J {›y§Sô{ó9ÔˆåêKÎV"ÔLò¾@'ÉÛ]D'=h·»œ¦8̇·âP}¼?¾+¾?ÎÇâL1ÆÇã9]º q0ħ‘øß*öbZÝcK ¯äÏ%tN `¤,Ö‚{-ÐZ¹–k% W+¸Ý¹ÚM~§SôC¥ŸuzÖø]†Ôœ1'†@™ƒòXcŒšcþ Æ\¨S1¦µ^ãÇó1<_ì.TWgL§Ñèö¤¬2ä÷Êd*³×™d¦Íòn ù„±r9]M·SÎJC”šÍSÞ@P˜…Qãz„RBk±z2å#”½ùh±uRÅ[’Ò&M©ov4¢H­%FÈÏ1²O5Z­F˜d5&Œ-Æ›ŒÏuCjvÞl´×Àœ8RÞk Uƒ.,ßTr5¼é‡¯8WÃÆÑkôÕj®¶*!%¡p#–+Û•g•—>¤´(TQ`ƒ²Yap{/’:þF!êK;ªß`#{úzžÝsBMê싪 cµjú‡·íKIÏ »•Âx.Ëᩇ¶àJ ›5¡ŽÈ²q·Â7O†Çoµo™æ í‹k_Op§Ò¶tú·ÒoÑ_ᙆ§I|mèð qeöI(D cÈ (õ~-M_iîÃg‹«·§ Ÿ©O½›¯†  77|êÙ='Ǩ‡/\²†'¤ªWOÏø†‹aUaTÑ`CТÚbƒ}Š}*ª~DJoÐñÊÐ}rÜÁ2á'­¼}ŒÎæ f¡«eÄT+ÿFèÉ+›wÃW/ÏeIÀóƒï^÷õW>ì¤ýFã¥WO¿bú󃇚}"§Ë½Þ²åaw·>ÛxQĹâþÄy½wÝI¿x‘С÷‡þÌ»tÏ“2ÒÀUì!ÄEè±ÜL¨X0²ÉÈf -‰½ŒgTßÈc1÷';íZB€MgCD•÷ ðIÌ#J’Ë¡Y°ATäñ©“ŒòWa¡–! “‚¾ÕÈHBAÇšP”0´% 6Û©N„˜ bV¨NAE*Ò ä@ç¯xë¼uuÜëfxÓoá7â"½ .ðÀ´ÚÛj¨å^­…;\Û\ôç6'}»ζ­´Ñv83uIŠþÅì“S»ü¡ÎwŒ`d8êf,«ãŽHਅºZXRuIµøa™ÿrÿ÷ýܫi½ûc7å%‡T*Í—VIWKzñ6¢|¿–Žçì†æ×ƒu, […–<­ [o¹XXg¦¡+cƒð+è­X×Y9½5f¥¶|HZ&g7d7g¹#Y`3ºòå¥óp¬ÙDvRvu–/ ðA_(à+kêÙÇÁ|™t÷n7@Þª#Æèþi l¨Ù\CkXƱ(î¬Q0­ù½ÏUÏúí[½:`ˆ½š©‡YõçÕ_ZÏÕßn‘’ê ½6‹ü¯;±“ZÞùçùf4%É«WËp–¼Z>,sVùï2µZ9/ÏA«x\ÖYQ ¼,‡`EX§ÿ¾ª¦†ÐÀªè0ËÝÖW„Âbû¶W…„v¯bíMágÃtEÂhˆúT[#í—ö±ì`ô­Þ„š#Ñæˆ¨Fа6ÜPH1¶|‚[Žõªo岇Ƃшk&b8¢AÕ ×øˆ žüŽ‹6(¡ªvï¿Ñd޽óÝàÖÛœ#¹á¹à?Sã2CYFM3ÚÙÌÄ“_pщ³WÙMösFõŽì}¤»-á︾wf{_óia;ÏÌ·ÄŽ#¾¿¥uÝÔ³ kElëª3¯ìò.ªTV<}î‚]M‘ºé²ÊñE»Þ¥òÞe3$áDfðÚD )þÇmçÞ?ý|öåסn>÷ RÊ5æ%‹‚ݦH¡Ê"’ UªÓƒp‹O_„‚]dÄÈñËŽœ•é¡•Í ¶²o½•0±Öi"¢r»ú·ƒùM¨Þ&0Y¡Â ƒàRÀ«»CG½ü<½–‡›tp×ÜÛ`pÛD8ß¡¿ŽÃG:˜&‡Apç³Ù¹«‚Ôý®C.ê*†OŠá öY€ŠSÄyâ/ÄWDSbŸøO‘¿O„•Ü/À4>`²öë`‰îÝ:eíµE¶N—úî Þ»· ÕÀWUÀSÇóV”/{¦Oxcì vÊîÎõ›H²·óax èþ÷}Ÿû¸·Mšèô   ~äúƒ»Ôÿ—Ô‡íàþüy(ÈCp‘¢²:¤Ïë^×qâK<y.Ïåø±üLž“b@bÇcT¶ÆPec¡XKlRlyìpLŸˆ[OĞŵ¡˜8Â>ͶzìùââŒ=!±y3vfœèàwØ÷Ú©Õögm²ŠfØ[%…°Uý$S_ßw*8û´M„Ö×äÓ©oŽ/²÷¸ùåWÜûÇã-㟘uÚ϶Å ‘·Ü{~vmVWŸ}.K;²ÐÎvgìýØç1n†nþiïEyîÏó¾3³3{›É^gï›Íîf“M²¹nÈ’Ë$„° H¢5PðB.*ÖB+ x)œã¥Å^ EMµíVE­çW9=È©¶è)rªÖ#xáWm9Ò§Õ’üÞgvÐjÏÿóù‡Ý÷›ÍÌûÜŸçûÁ¥”’Y¥¿(%ÞRð…Àï_=tÇàX <í,sék¥ï—~XÊË¥šâÈŸª€îÊ•Ë+é;•pKŽ%@LxÉĆĶĩÄÙ„ÉjMµì À×Cehù¬òÁrê|, ‹ÐTºÀÍuÁ ÞìÅuíï"¶qUut¸ë|zrfecªo&üp&¼0fÖ²õ;3ÊÖïÌ_dôìI6f{©áˆ .¡3º›©&»SªÀo­…Úñ#å®Êsv 5û^é!îqöp Žƒ޽:/H^Ÿ»R/ªùºÁp™¸Ó·bò¥=#ÂLÄe8íž—¨"-“>¨›Jz*—º¤gH·>‡`æ³Þ5Ü5Òµ¹ë`—‰c»#];»ö°3]&Yžõ3g Î@"œD8ã]af{—Ѳβgɬééì›Bbå4ÜO1ßÅï¡ÖõøËL¿GØ ®ã,ŠVG‹A—§K3’b’– Z ùžÞ_:wpñ¿êSÛÕJögÎ`?K.$Ôbº W̨IOdrî Î̱Ñb*æÒ¡óèA[‡U½+ `R¶ÙÁEº‘ªƒÍNCö`YÛIù¦!„MŽŠaY¾¾5»ÜB¡¹ùb_Í»þå’…_öòMky"YC×}«ýËóüƒþým½£½VaÞ”0>7ºâËA‡$%e“ÉrU¹PšªË;¼wþbÍèχ¯éxsÝå%Ò¹/õô]þĪ}Çf}ýL “‡è?Ð?3ƒ{ÕÐyº» #š*ü8Ò‡Q¾.gõ†rMUpW {Ý eK8&è\Òäpç+¸®—£³#KC2Œþ šˆ4EfG¨ нÀsŽEpšDp›ÚV¼ßå'QY„aöNˆ7ƒ\3ÐΪ ³§ø˜J#ˆG¸Ü²ÅÂWŠî±,²¶P D`[‚)x-õ~ŠÜ•‚œé.YmÚhzÉôš‰g¢ËŒ dl\-n_ß?EyßøÅq?µœ`ìOôsDп1È6–üÅI?lóCJÑ ‚–ðXþ= Ú؈Tæ xT‘Zàj£µzíÑZÞ®ÔÂÏ3²Ôek¾†¯¶'¢.w™A99תfwFöGFh$¨3Jx€ÓTM×´am§¶G;ªÐd³¦Ùƒ’£"„+‚Z:“_„#Á7ƒ$ø5Þó—J¨Äo %rß­S%Äq™ë‰Ê¼Pé®LTÒtå&; ÚÕš©ºÚ!E}‰rˆ<Ïar”råEÝ©¼¨^—ÕërT¯íŒZËoGÝš¼é‡QíÌ ¹+TGvÀ~Šúõ€ã„ƒ—Ò»é½àþEz÷©5õy“Â>|šÄ}·KTJzc6Û!mB³yMD"-»£!;$ð¦Ihû/-À¼^:mÂ6¹³é¢¶}hño hªç3°ÑªgáôQNYÈ·==¦Ũ~ èXÔt¡st¬‡jPy±^séPQ2ŽŽ^`ËOí`š%pLYOOC¥I¾¨ˆ›ðH©‘²Ý #ÿ®Í ”®‹^»W¿ù?ïhl¹ó+‹o~ºZºO%&ž'?»¿ç ùs;¿Ë݆ÏßpÓVðZïËÏJ-=ñU]²¼utÿÕ‘E19T›†;©$h¶¯~ùqH|ô3£jçÏä á%n&iÀ \Ãõ,º€n’Ó(‡Ów3³9ŒÑú0ÖE‡44R™}Ä!„pKA7ÙR²T*ÒôɸRñ¡)Ãà4‡`®?¶Puˆ(4T"«ï  9Cƒ!C0.†<¡S!Ú×¶ëß|4x ± j ÂÜ»ƒÐ€]¸Õ Ïy™”v„ó©(û.q45*gnñ·T¶Ð])øF ¾”úFêŸR5d}‘Ó¿+w` í8ØF-J[GÛš¶#m¼×ã¦i§«IK×5Õ4}9Ý‹–Åu/µÑ8uÄ™Ò;+˜„£IH¾Å!ë8•OšÜ¤À´ÑŒDpÈšQ—A@ç§Ø!ó^µ8‚@ L›ÉíwƒÛQ{8sá›Jpn.ªŸ&SAz¹1’‚;åe˜æBtIŠ,š?xýVIºÒï0É_M·;ê6^Ñ]“¬ÆyÁëûd‡–¿x‘,9Ó R¥Ìó’\)‰¢³üõðE“ä3Ïj]~Í¥[†”‡åúô•#GDËb3ÀÄ ÑwS‰1­9ç~Ì_Jÿ…k⺸Kø]µU±Éc4¸Wª»¨£ È©Bì@G„:û ²ö/8³€©º›ì\@Í ð —[ËWiN-: rÚ—^’¦£>į—ÁÕ.xÀ/¸Þu‘móàÚxð"ðUÂìVØh{Èö¸2Áf¥¤DJ8|¡œ¬Å!TŒø‹sª»ì›ÎAÉÙË6ŒƒìALqhQÌ{d¬h…Õ]°2©…ËÓpy%¿vÍÇô’…Áì‹^DNõ!äÙ/õIÅ™¿¨}¨ý†ö¯·óËgÀªZ8U¯†`[^ Ã6|Õ÷‘¤}3}_õ}ÇÇ»ÜÝîîcnÞS(—Kº¸É[nø‹ ,òåò­2µÈ2Øì¨«¥÷%Ò']&³T)‡àmÂL“úðÜó<"ß󓺬d•Ff;6f‰*7Bec}Ù¬¹ñ¸ÓÅ(Fvúœ¤Ù„ú/œo;ÿà¤ûpÐyÔyÂI“ÌPœ88 †‚(:‹È³æjÉê< ƒïÌi.DçJìNÍ} ¬´¾9çË‘„”}qr“¡\îݧXàM X†-;--<¢ [¨Å¢£ÐÎ>¤ߡ“¤ ƒŽ ïÓñм¢Ãŧ•}ÆM:„ô!èÏ‹õ;êUkeÅQ”­™òŽòþr:‚H2ÑòÚòÍå¼\^÷—åÙ‰þúIm¸4ÿX?ô”ñîðîóñòQLTU½µ^Ý;ìÝìÝã=è•ìÞ¾üeùÕyú‡<ä?z: ›¢;¢»£4ZÝÈ·!Š¿ µ°xÄ6O[²¶áÂa_½ ¿äÆ'Ú>¼I„eøÚ!E|^$NN¬™=,ªâ ‘‹›E"z²ðXöÙì‹YšU‘ÃHÈa>ÌTƒRýA5Q«õêÕ{ªy­ª3P#fÔ›òa¡=vhéd[T,;†rï4:Ÿ åºÅéØè¹±–c/s§ ½ÙÐÙÑbCˆã±‚Cº5ó‚ä6”Ncžºq!:Î-šúF3IêÃÄ¥[:„ɸÓ S座Xºà+»@$ ©.È_:•·‹žvÔ ¾ü±Ñbá®h*+ÔÏ”ðæ‚£Œ/‹Õ0û:ÛÜŒb»0úz½àòœï¤1Ä ›=NòýR…ù‡ÁÎu÷-­™»xÓ‰Õ£=;&~¿ëÒ]k{<‘§.­ö}óKW÷Ü»/ÛèSç:j¯›µä ®¿üVH|³î²–oß³ê çŒÒuŽgsëœmKgdj´ª8­ÿBþÆ×Ç’}nVââÌŠ@S"Ù¸.qÿâ‹ï[Üpñ;m÷ä×Ýzí£7ýõ·Rë5úè—ßßÝ}¥ÛèP7ùgþ>f¿Ï£êqÆŠ+s&D• ‚1ăÁo ¸;+00ê[îÁs† øG=†d´L8ˆøJ¯m1šžWHëuä@r„rR9¸År,7BÁLó"ÈåàaÖ°¹l)˜ÛV)•1TŸ |V0IÌTEŸX!¾(ò/š`½ ”AoÙª2"—ãx9¯qÞòyÏœï°ÝrÐþ‹}€Br¹¯œ„e`)ƒYlzÝØ* Æ®ˆ‘Fð¶F[·íIzÝ ìe±þÔÊ€Õm%9·5a%ÄZoí²RsŸ úDø Ó:%öͯ&âp@€Ÿ¡ßl»@Úø‹xbáïæŸãÊó+䉓ça°›‡-<,à—óóOò¼_`÷A¯K9´¥Àœ‚`yU9Ť˜©C™ÏìÞùP;_ŸOFæožOoTø‚y>á×´àI¿»næx㌓Yw~üÈ\Pæ‚}.šóNŽK°'‘­H€’$ •xfò5½„=‰ÄWD3TšUê)ž" ‘ç9à8•y¿6®iÀs ßJ·à£k)*0-{ûð!ZÙfïÛÛ)ú"ø¯`|#²UåÓ¤QUI£ª’ÞÚ©«zumVQa°_ݤîV÷©ü26vÄNÕù굄cèð|ÈÌïŸOvÌß=ÿùùT™ß1Û82_p(ÐiT×g¹NÔ;ëŒvÖvtžéÊ(ž|šÝ•΋:WœGýe\Â`Pc¤í²M¿ŠŽc/3ÕçtA9º ‡wÿ–¹ƒ‹¿ŠÜ¦^Âih} ¯ütÏiä%=:vÏ]X9d WOéKF¨qtÚ51Û4UÚøˆÑ^hðiÐ-è©Ï6#— ·Ûåe|æ¼çk ÊÛ¸]¯ëã ?~úúaÓ² ïN.¬ž·£7(ÐÄ*IÚTí½Õj³Ìêê¾|©S’þe²tÛºµ·Éò•>§IF¯~xµ,=/¼ˆ¾ƒÿ™Ýít¸Ú®[¸¿ä×ËâRZ’$Ë~û†kf‹g.øçƒ”C™¦&WÔˆxlÍ"UÂhf=¥'‘˜p3gA|7h~ʆ!1øGf$ÅÕÜ3ãž„{v<§â9 ýYŒSgt?Û`úDœo„å5‰F õîÔ0³¿Ÿ’§¬6kõx-†ÃꉎcšÛª2³.iµEž¸æ5\óÚ^µ×¶Qjajö†q¿`ì£Ñ³7)¿K‹ËÞȉd‹œâêŒ7tg©ÑèEÅ…¯nÕ™¡ç’PO“ÉÆk·J ÉÓpgEÿÔ1öTDòS…5xƒD™ó¬ŽõìÐiÃö\64]”Å—Ãíxœ^ñSž»±$0 .ëdFWW¦fÖ¬Û–¿}Æ’à/_Àq“p3»¨«3“éšè´ÝþÒ[Ÿö0_HÝU€=xï_;8ŽL<÷c¸ÊxšU°ô)ŽÝ§žâ{~©©Gª<3ù“¿÷HGÙFo)´”‚ì¹ÅCzVxÖ{þäá¿î?•‚õD‰2\ˆ ”x4{I>RJ Fj6ÕŽš~6=_3Y#(5¶³¬†)ÿ%Þ|0àG+«óá´ wJekDQ•ô¸ ׇ•mª.g>óª)nWµ7îÄ?ã±G*ØcwâcwâcwnÄ¡#Þ';â°'qì°26ý¨¿` Û½€¸>Æã=>vºã\º¥å°á^(T¢Â{£¾à‘;/xäÔðºÝN§j{ÛiSIá™ÿ¾¦««†=òŸÉ?Úâ°Ðì?ßj²›e­ToÔd“H,”…›;k WûoÉÛh»ý·ÏLüË#¿þ7h±‘Äüµª =©í1;H¨-Ä&Í_Æ´…ÙÂ=î­ †rÜ8x1©Öƒ1v7.bEWQ´8—ç`qçpqŽœ?≂5dÌáâ)ÎÑâ\ZœÆ3¦8q°¸Àâ 3üÙb›Tp_¡ÃBPÂQF 곈f hŠ*z¸…1 ņ@|žOˉ³Aàà/ùYB` ƒ9æ(˜KÁ{˜]0ÈÞ²dÚð†ã´ƒÐ2pûA¸ÄI¼àðñ€Ã l{y½·ËKº4èb¶—¾Á¹ÂIì²æ<2šf?0û•ÙT(l‡a+éårÙ«†ú£Íuƒìnq“¸è‚~뀋ô¸àñ2øa ü‘ýŽœ£Ïq™c£ã%ÇkÉóñ-‘ð^—÷/ Fà„Zá¨@Ëyf- QX'Ü/<,ðÇ„? DÜÂla¡ð€ k‚"ò0ëÏî@ ÿMþ_øŸóÂïx0ž)3§CÅÙÀÿñ µçhq.-ί¤;Ù†CeƒÑ÷<8`o-ýz'çÕ=9évç¤(H1f/Çzb‡cTŒAÅ6Fý¥°Ä˜zJ—R¶W!FaÉ£QHFWFOEi2 ² Ê+Ø#a&\Î…ûÂÃBƒ9³ÞG °†´†æ¼ýAáTEÖäõz‰ó~/ˆÞ Þm^êæ¼°¾Ö;àÅ,ôƒOxƒý¥þˆ/”ï•^R¨Øï;á#>Ÿ×庣,è*s9Ê‚^OÍA=]— ZOJ' j5Y‘5+LµWº¡¿º‘!Æ¹ÊÆñ꺓f2¸Ê¼Ë‚Ï?Rf”•Å9ˆÏBzÃvDŸœµ·À3½Èˆ Ÿ¦Œ}âVŸ»÷Õ¨wïÏâ[ô9n”>©OÒhiiŽÇb‚š0êMŒR‡hÁø÷`Szvšä,}’ú‚)$Gû(iž7g­+áçºæyžoi6Ã*ØT¦g]ê¸ÆAKƒ•.>íJÇÓt¥ +UXé¡Ä]B³ÛL,Qf £‘Ÿñ™¿P)P´€«ø©Da~ž‹YéÔa1CÒgÙ õÖ¼¾¾[žQxoœ²ÂÛ(±€ÇN+xªÀ%Â)œt¾M©‹_À¿ÃÓW,ðb^´Â! ®‹àÐEÀ¾˜>Ž_ÍŠXü$j.‡YËï*'«ÙðP9½%¿=OV±aWžÒgIY •e 8ËzËV õñfÈ=l~ÒLx³ËLÌkw¬%‘µk÷­=²ö͵“kEemfí2vt÷ZÁÆ­…޵ÃkÉεû×]{f-¯®­]K¸µQ¶Me‹Äî«<*=q7uŒÏh=™s/_2tòr÷ ã#¸Š5àTkÌ­0Ìõ P*˜¹^© ޳’¾¢¨Ö>˜Û‡øú`²~ßÌ?ñ4Úà_‘ÔàTä!ˆ+=ø pO¹¹f›§( 7ïÍ´! “I¤í[³O]°/Xü­ñ‚§LŸ÷.Åý¥¸ïdûK÷®t#͸‘fÜ[l£xµaF”ê¶ ^‘Á+2[gõåÙE}y6^‘  àexÙ+õ•GWÒ¹êÊ+‰¾r€M”[©®¬]¹‡?³RôÑ•c+W Ìø‚õô2ÚGé4ÛdcÑš?uAUî;ÈÊq,Øõ±xÑ®?qLè2ïÙfÃÙió~ÚÆ/)Òôèy!PFÀtÊîè3Ÿþ›N°-°ðB†-šù£C0Tl"4 ïdx »ÞãýLëS>Õºÿ»§¦ @qŠdYÊ?Ü´üÁøÕWÕõo™oIòZtøn¶ÙÂ7ÎË.Ë8ŒÓg°£ë¶ÙQdåE­Ww(Ó'þÆh¤ÏÚº®¸4á^}éæ`¨ûÆÍ#«.ô ܼ{ÓÅé…½WÝVõûTÉ'ÙØØèƙ٭Ëïÿ´“ç Mì»>ùgþ~ÆáæÑÝz… Ny&)¿¥4å·4¼•ô³]–É)—eÁ[©N{+q è²ä‹.K£zÒp]Ú®‚ëòãnKÁp[}–‡¥|0‚b O¨^øEXo…1è­Š¦½;Ž'§}–¼ļ¦y+æ=rÏÒ&3„°- b`‰Á,6½nl•K¯(%Và­Önë“V>„9İX~j!IÁâfÌÝmIX±Ô[º,ÔÜ'BŸ?1¡'ÕSpW ÆWÄò‹ŸñÐÂoçÉE,t&½›>GJ‡•"<ÏDF7ÝBÉ èrú0}’ò¹rðëiܺ.§ý–BRÈ Ó~KûÎù{æ“£óO—š/˜§q׸×8é»Àqix,]ŒÆ &å5‡T|ÊeÿŠI†JùS\–Êg», Ö²·àª,ê}{;ÃE¦dàÒ-a (¼U¡ã²T —¥ƒýÊ&e·²Oá—±°#vªÌWþW—¥á¯tU×gÿ¿ù*ÓÇQÉxÜ'•Ó -þ[Gå|lÊM9ͧþû) ¶ô¼›ò³TSÓÿ楤ŸY-bÌj ïN,*ø)IÒðSúoF?åÒÎÆ¾+ªäÏvb1~4놮ÏöRº;[êþéï{¶0ã©{òï§ælœŸ pAò8vN8¡Û£Ñœ5¯Ñ>ÚX†º™EàD¬À  !A„Žõ"TZàf $¸I€÷œðž Þõøú´JD dÃÝ5Ÿ±Ž•ꕜRa¹î·Â VÆ1¶Z°RÁúˆ•ØEú‹ðÃ1Û;6òëGVâ¶.´’EL7ÏŠd«+Äõ"Á&ÑúÝn-YKä2?f/”@ ëá‘0=>>¦õÁ.\ê½ÆKþľ”ó/N’UaܲÅg!»äÇdòm ¾-/¸ÒK—ÐU”вé`pÍÞC‡•QÍ/o;þà 2¢óç‹äm8¬±êœã³G+F&5ƒYo`'EíQDMŒFIܪ5òW ¬ÔhðŒÅÛ{ ”s«î=nZ+¸‹N"w1ÿÈŸ§ùpþPßÀ¬]÷íº)lZE¸ðæ0™ ײ¿xgø`X@@þýì¯æU%̸S¸?¼#¼/|$,L†A GÂχ©ù%;ôÚá1û³vbÇÌ$;f&Ù­ìó혙d¿]ç ØÏB¿K1I¹·’\h°bÞîÐÕFx®xÂHž‚}<=uMÚHüÇ%£ëB’Qö` `ÈÈ(䊹Xó3::z5Ú.šV>· œÙlC=g %“ÍSIbäu_õ‡ñÿiâçÇïùÕªÿ“ÿÚò ý‹ÿ^ºéoNüÏÑw'~ùå×^¸çmÏýó+ þ3ÌÀ®âÜAþsô.Çdð¿>Ë©†»ÞÁd%Z ‡¯Ã€LÄÙè쇔°A… %p3À{Ú_4bÕƒ: vÀƒ%ð Š-Dêf)ÜÓ ¹Byšb"ÉŒ¹æ–oݸz<ž\ÞÇõú™YÃöôhu5Ø#Ò£LJ; iíÁ¾Æl¤ÛÙ ¾ E»êòâ¡ú$ïûà·½ðD/\ßý¹î¯uÿs7¸xâ­­ï´Ò¾VÄ*ðä`CîxŽhj¸4ƒ6-¤‘6í"mH£Z­Ó—çK€/YPB¬f•Ùêl•hi,J@¹Ny]áëÍÊeÊj…Î}\ù¡BD4‹º¯³ÿÔþº¾hGÔ>«`›m[h[aãÝ¢Ùc&QF]]‹äB)P£ äåò:™öH°RÚ YŸô¢ôªD±:s´\Z' æBe$=l:n:k¢îæ¿Ã?ÇÓ^tв;{O+¼'0…ä¬DÓáC½Z€‡º?ì&fã³É±}ó'ç}þðüÍóQb£À6a“ÑùÔbî€/”×<3iO»„¨9íP#µCG»ä åÛÑ+æd7èDû™vÒþ ';®´€½ÅH*f2=R1KžŒÄHö9Èìþ÷Ôjìõ=ÐóQmÖ •U†|fFJé”QRнtïÌr¼Àè%‰Ê÷f8 3Å.¨gï܆®mœ²ÁºŠ\¡«˜•Ø…\a!£Ü®-Ë>Ë U-QK­å å„Eà,¸³ÙÂË‹6…ÿLþ3·êJ¸ÌÎ T3 ã—‰fô̞̙Œà£™‹23E¦R2Ó%=ôÎC­õâaÚ#éÜp–ÉìâFµØÖmôÒb O¡ýK'Õ¨‘ú?廚v/OÎÂàAº˜ý0úi0+0dà1Ng#r:kHi—˜D“ú)~£óQ$Ït"ƒ!ÃaÌi†;¯»ý’mc]5s«{:ÚÓ±êk¯™’ÍkQ6û™l–Eo eó]5w^rå—ôîZÔ´üÒ$¡/XÇn úš¯®ÌßÿùŠŠdUÄáhzåodså[-d¢q»ÇnçsM™ÙWýŸµC{®Hä;Ó~¬Eèg¼i³o¥Ý÷b#ü0ßç 5ZZ“›Y\îBŠ[EØ_ô‰©”«@烆h'àö²÷î‚¢ˆõï­RÚáb†–é‚ÿmf•/€†ð1Ä šI:s3ñÃZqù¢¬·³?Æa} ý­ÁêV£ÔœdË¡%þJØ‡ï† ”ÒùVÅÍα9ÙL2è/ସ1ˆñK]f«à§õÊ2Öéi…Ç/õ¯³_s,ì%”½RFre¯•[œ.;WFÊjƒ‘ü¡Д~ M|- ªéHçžÎƒâd'¬é|³“+Õ“^Š:+LK4Cµöˆ!:fY1øï™Œ›"›h™—ª*7©¤:µ¤ýŠ[®‘M²¼õ>ÍFÌÝ¿,ÓtØ·®¸¢ÿ¦Ëׄߗˆ¦Ï¶ë›|ƒÆè¹VúÑSIt¬kÅ´x­(Œ!D:ñ°£U¨ÇVãAM¬ÚÊX†¡”Êìþ'Q¿µ¡4É6ª¬J…ÀÕ.fXÖàªÂáÙúë_­§ÿ!c²¯©ŽeÀ•¾ÖUKÜ¢*ÅJ”+Áó˜ÊŒ6¨0[ÁÃôà–ÌýrÈOº`›¶eÁ×¾tEš\Võ½Ö%Vâ“¡W^"“ò¸¦„Œ;óTæ… ¯y²æPÍ;5¼»-‡EÕÛª¬¦³«Vm­z êÝ*¡'½¨x1»ra%ÉÚA¬ôTn¨¤ ŸlLv'©KNÂr1v[ ”Ì]#šVÍnox¯| qÕ»ˆ“wÁ,½wƒëAi)‚*L·I¨¯2‚ÛêzÀõˆ‹>åzÁE^¬_%ÙQÑ@øzW}¼žZ\WÚEÏ´×>Ò¾³ÊíHHA¦‹2 µuM;ìk?ÒN”öŒÑ¢÷H»`®+ò#Ó(ÈäøÑ:0×9S|ܤs̤£Xº“3Ð@ô¦õ>„0ÁŒó+X9r—Hmmî!P̽Úo›À¤Æ*²&½²:k:×è s¶qÖ›KKsat¬ C$¼ŒYœ»™Í)ì ÃØ!Ne&)µ†ãQö‘b–_‡yñŸÅI—ûP£¡9~püœG#¤üE"ïï Bp¿Ì~p+~ìÇàUÄOJüu« d÷[gÌp𵲄Q}ð4:+Ì5?CzõR¥`‰«ƒA½nOÝÁº3u}Þ2}cʧ„E7ˆvüôèv¦.ð„à5ÜëF5Ï\–N÷÷-d §‹ðŀﴎ]ø€¿E¿hðz¼S ¾ÉòÚÔ˜½Ä—ëô$›ruÊ˱+׊´L¤ÈWúVoªºùšKæ¥^Ù=ë2³êR2oÏ­žÙ6ØÑËn¸ç–®wžèx®K0  )/hÍÌëOwTµ€>4cÛ7%öÔã²ÜV×RïmL¶&¤`¬~Eþ®ÃÁÛ¬HÇ £ú{äþ\<«WȘZÖÜUy±ÌSFú¶—Á®2¸¹ìÎ2Ò_¶¬lMýrZ¢`$Ø0#·¡Áä”Úg,m3s³Z4íòÆìI*ªs´Äo. ƒŽW¸:&~¢i 0±êÞKëÊâ%ƒÚk3J°›g P<Ä?DÿÌu#š0ñ>ËÔ1fç'+r|Æ•‰g(Š x-õՋÓ7Ðóײ «ÆÁë-šCË›Í~s¥™FÌÆNÖ¯7ˆä€ï¬è>ÛMîÈÂsÙŸf_ÏÒȦÿÞ ï5C6•¬ÈgSf5¯äÁÎ塞½wbc&504Ï÷4Îf¦žäט‚õTÀ¯ê㳌ô=¦j%ÆS'«NVº ·j<Èz$8#Á9 ¤$ãÅÒW|L¯òôô„gÏn)7\ (°½|oXñ3ü¼Šç#ùϳ×Þ‰: Àv so‹?¶eªhµ½(Pìxî*¶|ì[ußv·¯%J>“'jö³¯}"O7ç÷㮞Îäwæ.??“§>–Œ0cg œ@,µ¥¶eOËÁ–£-gZL>Šp*OW×ç[æ´\;}ÁÐÒŽ¿\ì9y¶˜½í·Eà èb_ÝB8tªöq¬í8Å4¶†Â›YE?äùÄnªžbtªÝd =ÐN°ÚkJ3ò]Œ6œ÷ü7‹S5Ž\˜pÂeNKùpWïÍ[ ÒÎnwZRî ÊÒ½µm²H;.ެë¹­¦.13Óáné½ÍË›Z®Ž\?­«5²Ãû•S Š”’%“´rNÝ%‘Ê9·íêÿ×ékÖ5áÉÿæ/£sut糜ŒÎ£PNz¦0›Š³Xœ…âÌgZœIq†âÌŸOèå>_΃p^ªÞ°Æè,C-u8ŠëÈ0\íFg´)ÇjáØUè‚ädµ’“i”8ÔàÀóîB—$œ}Å™;˜n̤8à{¯±]>XT·²nC• ì<¹q¸|°ùÅñxÁt² ݪÅr8táÐfhÖ¡\{qî(Î\q†âLŠ3Eû°ñ[Uö¿›q˜C 9fâЊC™QªíEO£1'_L234"1»“vÁàŠ8¬(3÷ɇ„˜Þ‡˜9xŸû#fÞ×?Ô‰ÜÖ6ømÛ_Ûˆµ~Ûþ×vbí€ßvüµƒ´´ÃŠŒtƒÒÝÑMÌ]Ð¥úƒÙÇÛàñv0uz;Ë;©I÷ê$Ù·tUÐ.yY©]k¿¶öµÃÌvØÞÌ>kƒmwµ‘mù6²¨L-ÞÒÒ g›á–$œ£GtvlaŒ$£0; ¢p bÐ$3‚Pî…rTâ4gìaÃ Ú Ñîî‘îƒÝG»Ot‹jwT׺‡Ù͸Ëu×wöt‹ÝHà^·–ÔÁ¡:Ø[u謫û)c ȸ¶ÇøÃãiˆ¦kÓ$Ç‚o®? JúHúÍôi>N(QvŒS@Vð«]Þ¼¢€•q_Œº;Y“‰‹„­µU'k**Š,q+S‹k NĸA2Åô´ÁZÛº¸6nƒ.sot¿æ¦kÜ ¸c d³ºÜÐèw¢˜þŽÍuõÍì9'Ð|}Ö% žx8Af%nO¼  èI,J<š8ž8•À%†#‰ >q±ÞòýÞGTßfñÅð,eÏ7j ÖÇ@Œˆ Ç(û[¸®p¤­5‘5Ç|g;`ylî8ØA†;F:öwÐþ^äGCCÚË/{|™¢‡!µÌTAf:m0ø—ÉÕ I#f"ò+dXŒ}/ T§ Øù޶¶;bW,¡w‡ÏíòùÜw5é"µÁÅbF³îlkëØÎ5–èèêhëºÓf׆§ª…âÕc+¨0ÈÐF‹ÕCõ^=6Í׌$ÎeCXŠS ö…$ƒÇbÆpð{&NýýLìD®À²Ó­áÿ†µy¼Ùfg¶¹™Üßò8…ŠÌ¼¤ ïÝ‘œãõ‡{LrþË{/‘M7T„†<±@Ý}MÕu—­]2·3_5,Ëëú—/–¤ly]ýÕÕsJ•¥µï ¯¹Ê ?ÿË™~³$U ‡«€™©Ë'~4wyç лþ¦ßOüׯ^xì­hÔE¥J‰ñÆ ™¸.Úð›‘^:ã6ÒväÏ@?X|ò/ô·ôG\9ª;,9\ïÁ ²Pí®&î€ÙäDH'l·úÌäkÈŽÜSˆÁî$;j ;‹•îl6g#má?؆¬,Á`² ޏáp3üj÷©jZÝ­‰Öõ­üŠ™Ð›ƒ+Z E³*ùu-[Zȳ3€½VÌ@ áµÕ·W“Ë0XÀÎ^]CU°!½-Mz}Ð;¬€DnI<– ËOHgà¤)°5ðJ€š`mñ/ñ“•~XâƒYX‹¼ˆ çó´x–x¨UszòÛ-à³TXZ,YxY†gM¯šˆÒɬ•Nf©r~›;©l$51æàpX”(»&:Ý¥j4Z«%Íâ™)»©:îÔK“YgU8œsºcã‘Hà¤Ûï”×gÝ\:Œ(Uã!¥v¼¡¡ùd“›Ž·r'ÛÝÍO5û Êœ õ0R¿³~ýÑzÞ\õŒÑCf4Ö©Ñóþlëi#3i;¼ª§Õãéôiƒæ"HI±ÊDeu¢¨ÌÌåî”D—”k‘ÄjçK³ËbiF b Þ>o´Mƒº–"Mè²>Yžª¨¬¬ÎåZf&fú}šæ‘$³I ˆ^MóWV&ÓUÕžj³,I¦\®µeF³¥Y5Ùo;Ô*±vÆLöC‡$öÏŽ›xô; šŠ§[[—ƒ¦Å,|ƒ¢ ;íç)æ-N5iš2²‡>N˜ìˆÑ¢–™2†Ç„Ž›fF!8^ k˜L^ã|R£S‘²*INdf-üæBçMå.YaT¶òÖÙwôuônÉýU’T˜Õê(iOøž¿¨4)I})ëºKW^ó½n›Ë$§$pϺöß6t)e¶ú[þcýÀ²1*LIÔ>ÿâ¼Û3ПøŸ%ŠTÁhóšÍ­Ÿø£ mõsù>f«}ÈÏôšV—/šká‡t:’ÙkÇ¡‡T±SCyqЏŠbq.-ft˜Œ9^ ÑÛ0LæNÁ ‡v:pÑò… ¨ôl¶gkq¶gÙhæb¤ügKq¶gÃ=þ~ c/˜À_)ø¢° ›Òòa؆€ *àNÜ©£Í öîì%ÑÞÞ‘Þý½'zÕ˜Îôò™Þþ^‚É¿±Ó T”£²K†‡Ja£YaIÇ*&Ò$xU³î×+õÕ:/Ïéqon†ææ¶#LG¨KqZT;¨QM‹Fàp0íC¡š¡´„ „Å 0¸Y€UoEº¡;0§gNOœ’aÄ’f¯x<Õµ ªÔ’ÏÖŸlô«ã^çI÷ÑFh4Hw£r”ÉwÜ˲=·Ò!”jÓ¥¨U¤qp`+Û5ñÝñ}ñ#ñ7ã“qqmT| ćã4ïÍ̃±‚Žm]2LÊŽ±×ùÎè¹û Á©·µÝ™Š»R©¸U’îˆG]qÉNÒ¤mP¶½´CÚñ—K2®c蜑»|=Z€²ôÂ7§Î>®!n.ì3Vt$MÿÈpÑÙÊä¡”dÖÀǺD#¨‚×ëAÚ,HË ùX«$ŠMpVÇJ´º–9«†“å»}W9Ã]’¼ö–/]$™,+|í¡ŽöXS°q0*G›+MÒ‚µ«:$)Q•º¶ñªÿ^ò…|¼ù›s'ô4Ýû»ë–Á]mo{]2#Fƒ"ÁäSKžËí¡Þõú]’’=ª(2[Â0(ÀQóÊØž{§gÏq†áiˆOþ™>CáêHÕÓ— @ƒ`5›0ˆÅy*©À @_’Xר‰ú†ÂÆ€Q#3F“’…“Œhpˆz±Qm"x-/²ù¿õ¥Œ†C”r 4ž¢€¨ïÿÆÃ·ÃðXôÅ(y,òb„ÔGºØ@»hE¾‘ïæI£Ð-%aE^ ÃVñ‘˜E¿H¬BªŸÕL hÌ8T67l \ƒÊLrÜDÝ$L^­å0=ê™É—Œ’LÅësŸ4*þÌÉê¼éÎ Xl§[Ù²÷*Ø6ŽÈ†=¯8òÑîdmiTe×F¨uHNOÑÔ3@uuS5L2Y?’†tàYØð`£‹Suu@¥Õï3ÑÚ€ G –6vŽk¸(jTƒ ɲ‰1¬joºÒ†¼õÇ—>=ª;ŒP$\ǹ´¡¡NàÀO£øèC’\-kTš8öÕí’”Ü~?8>¿MöÞ•äoø´*v:š÷É'î뢠Zäuõ’üƒaIÆ,›öÉ_ÒÂfNåÂܳúݳì–ì Ã5"¬7Á \g‡ëxÏ M[Mä]ÓŸL„—à&Ç ÍÐc†¬’ά“Üb‡EÊJå€B»èTZ'²§73@Ü»¬¾à.ÁäÛ•OÈD—‡åy¿|Tä’ík¸ù€ƒ~n ·‰£;¹ýÙÉèËàwc§~†ë8ÝqA§Ë,¦!aŒŠQì!‡[%â‚­±Îظ+¶Ço}vöŸ.ùÓ«7Œ_—þnËÖ+–ÜÔüÅoßF®þ„Þ\s×Ä[g'F&¶-ýÁïÿõG?Ù¾R¯Á"ÈO°oq£òÂÝ\7¬·íˆM —å{C9Ê4Õ?ŽÝ´#Lx˜û5ÀÜWóÝJ´?JÖD7EÉpj£;£$ŠfÓè¹Ãê¡CCê¡¡b¦HÃñ—‚”Ñ47äDå$ÞìýX6‡`´$q4•¨0gªÊ.‡Ù¼ê»üªh 5~Ádzý²î‰ÿ1I¦½v™ª¼=qu;¿Z¼ÄÚ3Oô-ž¸wûïÒãaÕFçÉböõÀbî‚X=¯VŒ:ð³ô9ás\´?Ë•0ó‡+gר`ÃÁŠCƒl! s‡¿8áÃøÐÿÌÿŒÿOOá݈p‡Áà7bøÁð£aŠ Ää,3¨Q^í‹s ôz—x‰Õ4U1ÖnÖ`ð@ˆŽçÿÈ£‚^Y^&á‡ÊOr'+5‡Ü¯@¿²ÌHÝS”¯Éß•‰üÛñ.Õg| ûÀçƒdls|Oü`ühœG‰ú¡6Ç%*ìSAe¤ÖÀ&Øσü½ì¹­¯chôðaì0Šõ§˜ÚÇ;Z:N:7ÚŠ½eŠ© ô!£èè'@™® Ù"J;Ì6g‹ÍºÙ>”b‡Ù…¦$£l¾Æ ýG6Þÿù‹o®(—+Ì^yéÞ%«¼aöÖµ?»ÜÂlHS~âxí•ϘÍ5põëg®Ýø­úö’|Ç–+žØ°øû¬ø±MŠ5ׇ,¼(°'™˜|ƒ~_ØÂeá‹zo6 •°½vÕÃ-Xe‡V¾TùZ%Ý…ÞȒȪÅ ÿñJj6[ÀfÎ@.—éË»2ðÃÌK™×2ô‹µ°%F hH¶åg—Âl¨ñºœº×—uªî¼àÝ¥²;«6&SÑ‚¥Ëâkâ›â|ÑÓâ)ŽßÌŽà‡ù~?ùFNnüUÞÁ÷BðFBÏ@â)“ü ÄõP£/ö~rSÄéV\Ðï—«ŽÔápÿ3P¦«ûÒБîO“ôŸlð ÙÓkÔºÚ:‚ùŽbô[¯®Û\G÷Õ©û ŽÖ ܰŒÛOÖ„ã©n8†zËé¡Qd2cè„e‡ÔãCõžƒ,Ã'l%0±À¶[ü*3tn#ì¸Á”F9ÃB»0Í„Ópš›½6sqM˜.諌˜°l…Lõ`6á"ÁÔîkuBÂ^6ðà¥7~¡çî[+»f[<Öoß±jö­©’„¹Zj½íøÞ7¬úÞ½¿Ó½Á»áQÅnºâfýŠo\½õ+jÐ|ƒðèèÕÛf¤bËeù×÷~ïöåã}îGÖœxÙ‹üÞÊøÙO„m\Wǽ¢ßÛc‡Š:¨ÈÀ͵ìug-¹Ëkl›l$m›k»ÜF³µÐd‡ ¬W ¡4)³•õÊVEm>ñV»kl5ÖPÍW£fYN—(ªš’t¼‚;™ÖÔ·’©±YwVC“ãÒ@ R¥ý° HAÍï.­)½»_‚5Ò&æ$U"âj`‹Íc‡—*¼ÆÛ³A5À5azØCjm=}ˆ‘ªÚÚZ|Sr£þŽÙÔ„Öžâ¨Û_yá••¹ÏƒóB©Sä W’îoöÛ^~KÉ?Á—ïõYè]se¦8˜¯ìl°úû¯”¥ý7ýxâYøŽ<<ñ+IJK¼9ú¹ž>1 =du‹õñ&NÁœ,)Ê⬑¥Ì~ÁÚø-ù·í1ô®D'_§ßÖp3¹ßé-þæ×šÉÙ&8ÛW7®m|»‘Žˆ°RÜ&‹òºBæ*—+¤¡Ê"¥Õi‚ŽÂˆ›¸3%ŒFô°Z¿³~O=­¯oH3 x¨Täd$¬Í<å ú±´øÜ^Ÿ?(xª3Ï@Ro÷ÄSØ_&V=°ÏsÄó¦‡zˆmû²,ìËÉ5[›%›³{²G³g²ü™,d…÷ÒOÈd’TŸP#¤›zlhì0ØÓ9wØð<œ>4„¨“£H7çZ¶¨ìäaƒYxãØ'ˆ ÀÙªobjO²¨ÞxbYÔ$Ò)vɕƒ·ksI™u°â/^ñµysZ2ãò¶Ê /PÛ®CåMÔ‚•~΀‰FØünÑ›œ>! tD ¾=ªœPˆ®Œ(û•£ ¯(Á»>ð@¿j=žÏN¿Ódlø¬ÐÊžÎò4ÄçëÀG„ýéD…ébÕOüŒ[äI±Ò« µŒRSKÀõ±LqB‡o˜xïGJ¬ª¥iI/ùÖ /þ×Р|ǹw[>¿°÷súÆ‹[oît×X½ßø¯—µX:ª]þý ã'¯„êßíò~Xúײ«¼ú’}W^¹ka®oie)ãOg…›¹$÷c}Þ-&Ø zK!Yš-%ÉRøJé·KÉ*’ìE¡—ÂÙ(\…2.!9ÌAo?SÃÌÃfb~È/&4I»Ðé ±g ¥×ú¾'êq' Ãpxsøh˜FÃzx8<æÃa"˜Ý¶ »ç;ÙmǬ'Ùš‡ŒãwuˆIl¾8ÊV} ö`ÚÃáÃ($pÝÃÔÂ7Œc/S$Û\^Ên*ûN¦ë{ø¢‹˜3Ò?îpÇGŸþAóÄKëDm’C®”ÁÕ ·üôŒ´óö‰ý™[B5’;ûˆƒÈ‚F³¤x:ïe<Æ‘¹Ê,ÚíRãäûç6ýL‰Kg:À“ÂF.È¥¸&BôG_uÁ+%pÜÇËᕼ‚WxຠØ*Á»L“o„gý yAÑàn ÖWº¬¨^_M^ãà2n5·‘£ÅÀò×r×:×!ÿ¢† ‘{š ׫›àOØ,Á6þƒ‡åp¬V¨°P]¡b’OTc/^P^QÈúÔÖÔ ©WRJ Çe ’“1Ìs_æpçUCc¸;Lê¬VRÝ4ÔDÌš_{H{\ãWÁ-@êS]©KRô¸V™PM|Ðû¨—\N®#wzY hŒúBÙ&*pâÀá`Ç ›mÅ9Tœt8ãR®"d³‹bf—ÇW¶K4+BÛwøZ}*s¥p”ž¡„ú°AÕìû2Z­xÚŒªŽÙÜð ¤uçˆtLjc¿ã¨ƒwTéìš*v®ìô{­ñA¿oþœ±ÓiÆTµ¦O§‘½ž+)0ÖŽÓlž¶‹¦[SÜÐØÇ[ÔOuÚ½ ®QðËLÿ€ÑÀiªŒÛÈa+N-…´poÞ8kÖ¾õ¯W?vÅõÛ׿·Ÿ¸yß;__ûÞuó¶¬Y}Ï宨óùE÷Ì~„¼0s× »^Ÿ½}ÁâoÊ3æo½ô¦×ÇíÝò|ÓªYwÌ_»í¦ë.¾é7=ß\¹cïÀÝ—lØÂ8m#³7ÿI¸ópe0SwÝB¡Ï g}pÖ’GɦœáÓ°šKò:¶m8Ëî5:F.5«ù‡dðó°Î /)¯)Ä#Ãò£ò™ÞR—G®‹Ü¡ ,Ë-‡,´2” ‘íØî‚Luñ½ë#‹|+}$á³ä—î’’—™±Ë@¡£o>€L¸d™¸[$¢è±–ÂoKÿZJJ‘÷ÛLï { ˜†!|×NuJ85ªÖªÃꈺS=¡šlŠ NUõnçÌнƼüÏLÍz6—ÿÀ ýæ5æMÆ!ÁŒ!*¦*žn0ÜêLïÄDìŸfÌd¬È¨Õ—±Nà‚£TÀȯF÷Û¨·)Î9‹ã\C½ûˆ›œ”n´»î;°ö;—€ð/ÿú»ª/ž»Õßöù…v~és7= 9uX¾÷oxĉSÿ³þ?ßúñJxÓ¥ã—ïþÆÃ?gf8†oÓ·hžqwÞO~d0ÈI€Æ…!æ,éûÅM"yf´«\-7`tf9ÊÎMïìg»g8‰@w–fAWJ²ýÃ`†S+Ú[­Š«ÿBõ-õÒ¦Òö¦oýµ•Â7ùåÈÄðÊé!Æànf«'ÀEà!ýký¥ xí&Õᵋ%aÍ&–XmšIµ˜&U2©œ ˜ÅA,‘9§×N]!êÒl¬—ði6âÌÔ嘉8™¸yN¦.¯Ý~§MsÙlš9¸““]{;CAz”Þíñù‘¹G8"¾)€ *V‹$™LœÝf–©W pöÛ°ØÐËeÄó6›W3ÈÃÌVÅCì¹Únôk°L[£íÓ¨¦GbyM#ç"%&•é¬.]¼¿QvkÜöE‘Yá¤CTI¿ºLݤîP÷©GÔ7U“º‰ÀAr”`†ƒOXœy‚‹)Ô…¼0Ãti1JP¦Œ¡×7=ÔPœ8¦U·v°7ê×*ÆaÞÃÑ€ÕÿØGk•Oü ¯jp–5Þ Ôx›ÊŒw™³Œ:Ù‰ïξ_»{·öµ¾Ý:·õ>ïýóîÓî›Ý×ýöì¡·ç½ ·mƒñ­0âøÞ:±dÛÄípÛÄí„Â8[‹WL¾.L _àfqó¹%äYý½…v¸dˆApôÀÃmð˜þy°½^Îúaeh;ÞFÜ=ô§z^ùì½ \S×ö0º§$†0Ï " @œHAAdPp¨E$8Ô¶8Ô¹V;Ù¹Eí<ÁZìm«míxmµópÛêíÜÞZíx; os6!ê½÷{ïû½ïÿÿÞ÷z`íµ§5ìµ×ÎsJ?+¥šë5ä.Í⯈U4(nV°5fê»Ô?ªi`x°%øºà½Á,5ØüI0Í ¼5DEâ´CDip©ÐTHkõ+­á ø†ð»ÃÉØl/Á‘%Ÿ•ÈD¤˜  òx9 üp½#aUù<U‰/¯Ü^IÀ—l —n n‚Ô&µ$]™DªþVEª4Á¡Óó&ãI³WÏ&s„gqW¨ cñ˜'ÇÛ§cÿIx#üOƆD.ü‚Ì,ü,t %Múyhltâô#SOL%S¿eQ5õÍõDS¯­7ÕÓúA¼Ö¡Œ*œ˜2Y£¨d– UuI"‹8ˆ×˜ÒŽÃF,E7~ÜYá­8E‹2œ½'3äz$}›©E¼mj°}0 OĽ¦˜Âe^ø/Š'ñ×ÎįÏÄ3aa5ÌÄW–.~8fa×È:‘÷ ]ü=Õ>ïeð>AÅŸ¢êòþÞkda+}&]ZCƦI/ׇeZ-í´Ó¤·@Ä+ÂÂÍIáKâ ”èh<ºzÃ"ŸÎ×oÙ³çjÒد<Ðú×wðÄÉñ)µ³¦e,X8ôaÑ­5vœÞïožÔ9iå¥íþ*™ÒµAxïcûãÒÆ*þPW/™¢ÓWâ®Çw—5OaûÚãtEyMÓänÇ÷ïìÑÎÕ–™ã5¯=ß;ôLEç†üòXŒƒù˘ÿ¤©~áx|ŽçþõAÑr5Eo›¦«©«³ýq×s'×•î¬Øò®°Ãß<ü-^>DhÊ!Ä„g ~âƒè!”B GåÈ#÷§åtßI˜Ÿ±N7,Œ(ç´ð¬šð}Ÿgb¤VªË--ý°$OWjÍÍ-IÃß½€·£s(õšæ½›zØã­ À‡V*d(P„DÎAþª g òW ߇ÍAtª€÷!á+)²J„wˆ±“ˆ¡þSJ¬ÜSÿ"˜ƒÈ°ˆW ~.^^™Ž`a~)(}„AøÅoJÅŸáE…"xª!#(P¦/ÛûHÝЩÅm®©6š˜0ôÞ±ta•-DûÀBÑh…ð«|ÑFÒ/á`+˜'JØ ùr/4ŸÜƒTaåž0_+FªÊUûN áHÑ¢^³Xö¢7Ñžgi]©`éi:nqÚWš+d啜›â5>A󆿥i²›à<.W™Î\î/MNæŒJlôÇÆü5ý%Ã_³ßù:ñ·DòSþ!ÿ Ôü-‰|-<†bO0²+#°<o÷Çóü—ø“M*lOÂv5^®Á˃°ôÊE†Ÿ‡ñ;Qj!~tïùD|H޵yXü*rÌXÆP(ŽU…â„ÐST¬!`(Š©ÎE 1pª0!½<Ý3!䮈p¢òÃSýÖ/ŠÃš8m‚¾8ªŽ;Gâˆv|ùø}Z26m "cRŽ,|Fw'é#Lº¼øáóaÒûóakÿ¡ø›™KàÜ1÷4Ê9—ùªp¿é\æQñv®qô÷ç=“çã|»ßÅwý#_ÄâÞ~…\EÒ¥ëˆÒufáFj´BíÛkëª'Ú«*®uL²&D¥fÉgöl]²ßžQÙ9mFÚ8G¡#suÓ¦ãEEs'9ºÖ™š×ÇÇk+üdÁ_V̼iQQ‡£¥¨j†:/+8bÔßz+ŒåUCé¤Qv+ EFÓ˜VŒçÈñ2üN QQä篤 ¦ QîTöÁ^8ðJ †9§Ï¨(ZŸ­/Áé Í ƒé,…ÂVN¡ Ù¯}ºæ³úõЋÛÆc‡Ò÷ãïpüç¸gáô€!Ϲ‡Þš{"0Yü è BÐäm8‰y¥èØ1¼bŒÍá©p¥ <:.?4/ º/_øåu¨ø›l}$¬Û¡ЃÐq‰ŽÒ“ªgŠ&ƦfŽMM¨Ÿ²jNURZ«cLâÜø¼¡Û,SŸÆ õµê1±Æ&¼zԘØîõC—Oœž¤žV¸zhû“ãÁóÁy¢® Day˜â„æRÁA# BVšŠ€ìˆhº2!(cÆ q‡¶‡€bÄ›ùˆ¹¿w Ö ¯í”>Ó=F<]£Öxó?YCx:Rh¸5Ò$ ANô¨5òŒ©±‹ž™Ÿ:.qŒ£5-©jΪ)õ`™± IÚumýнOOµÄšVa×êÂiê¤é—ãK×wÇÆ¤6Mš;´¡ÉXÖ˜@×ãGd7 t×ÀóXøqøYዪÂÚiZ‘[üñýäy‰Ðûé!JîF"²‹à]þ8Jüù¿äO¯óÃ(c¦`;äX>€˜\áðÓjîUìP3 |³+Žô1¼ƒÝɈ“a5Ë…Àg`&U˜å/‚=¨°1ü\Ü&Àþ’ïøôŽ„„âh¹pk(=¬ïLª-X2/aõU²¢/ûГƒ3ïD>mR¢e‡65—„ïEY|Ö414Êp+,ø¦@â'ƒñ¾¨Lá§µCüp§ß?rÊûi”uʈ̤I1ÈL1™ èé‹”Äâ]Îðô©DÚÆÌH*0Œ \ZŸ¸ú*º>º¶ûÖÆØä˜¡·ûÐð0rÑõôÐÎ@p)ÂÑã³!«)Ej"#)n í %šPm(ñ„ž•bB ~ ö Q`⬂(°p½$ ÷†ºòñB¿ø·ˆüI ÀŸàƒÀŠiŠÆ§¢q£ø­Ñ Ek¢M0Qõž„š9¸H¼ñËŠ„ ¼Âå‡.o¾Ð]¢U‡ÞÆ ¯Àª‹þµUs¢ û±'‹6=)Øôô»`UájñÓ~GŽËN¾JF¦ÃÏùžl:²¼ØŽmóÁŽCoÇÔvßb‹I‰z§OÐg5=‚sd¢@d>ÛÙ³¦ôq™Æ×Ÿ>|6˜åc'T”3èéfòÇk`‡'¬²¯,ì®#¾"ž±¨„S~Îè‘Éþ¹ã2t~S@@s®2);;1 wèv‰q#}…%ÞÙj 9©Â!*“jŠzTgUD|">R2½ dzUÂ7„ËÙ;ñ[åGC¦+a=¹v“ ¥·Ô-ÄÒ®DÚ†Hûü»m'®¹öUÛ½,yÁ=—\sâøµ ïŸìÐÐ CÃZ8»3òY³9aùtTNðë^œšŸÉ æÊ•Ű’씽†¨Ê(‡ý<%XÆdˆ ’9¦xŒ"0ÃPK†SÀi¬Ì„z0% ÓôÉä¢Éü Ó£®Xº<‰ ôÑX‘J”-òsŸ4}#ÔOùk…¿`¡àa%x7—+“3Áˆ2Êå*PŒ2áN˜+ˆ\Æ0‘êPQî‡ÿJnèˆ\™"5]MïP4œûTѬüFé/? ÞÖŸ‡S£ì=à¬3¥hdZ™I&x™GvJ¦@˜>©¾Ú‹Q'‚ePÆÄ›Ù°ÙÚ[˜ªÅÏ»dïý–.ø9~„t‘b¨×gÒ¨Ç$)´ 2)DaRt*ú'ÀJŠFÅN ¯'™ "®¨±©$5Ý€>K0A “„¡Ã²ãàïô$9C`8ªi%í¥TEq$¢Ø …AO;éNڦ¦"‹çdæð{æÝ!¯ÿÂyÓ+âfްX;‡äHÅ„ $Z‹ Þ¨Ú X”ÿ“d%‚৉DàØ_ö->¸|9L¦œò²éÓJ'M4‚ßë´9Ù²2Çg¤§MÖ¨“âãbcÀ5ÃÃBUÁA~”daOŒ¥~–‡Ž ù>ÙƒÂfÆk¬6þSËm-žqÕõÉ©!¯Ç{Ë&dyâ,õÉÉñ2þË þËmšOHä'ÇK9eTU/ÀàðÇ…R˜ÜïAÕõž$H Ÿ¥Mnh؉X[–¤Z[žXKKc£§4µ$5Dã)=›"ã““5[5[«ëCõ(TèÜK§b1BJ­÷䪅e‚NV–xLÛ!’Z:AIøh ôçU¾EÈFbáRLãð˜l´M³?ëÈÖ«CPScf`Kj‹mA½‡Ú@‡ýˆŽµ¶ÕzfT̓,à ÐØ¦,W"‚4Ö6ÍVH u!L-ìw^~K›½Q°8nL-2Ký¦ä#ñž0ÀVOh¦gT›vé§ñt«5Æ¡’[·nÒxúf×û–& !˜3TßjMiÀ̺¤˜›WêÒ²ÁÆ6gMÓ©÷lWÅE{'o ñ”þœ Pqƒµ4.4]bZg]¢ÙºÍ.¶ð*±EÐãë’BðTÔóê­m©V0ã6I ´"tì…´ÉÉžØLpëV« Ÿ­”–ô…‚Q寊ÏÄ ÅcªªMM¶’žÅ+ÌÈ„’Æ’††d±OñŒêz‹ÐžT[I¼ÔJoN#Ï ëH¡ mjpðhš5‚ç¦BÕB!°¢­Í…¢­’0PUy©JSK·n-MÕ”nmÜj^Ó”ª IݺÆŒ­ÖF8(0ä?¾-ÞSzUƒ'¤± O„Nü§´Z0y©¦Í& ¡¢ÔdÚ0R\õ†|6 „a¯)4†—0ä„Ñ2ëêÁƒ›Eoðìà/ø8mkuÔpýÁxŸ ƒ6Ï&ÉÉ‚÷o4¡&HxÖÌ®—ÒÔßÓN&˜¿Q(92RY'”¬)ñ’7¦BW̨ùO.éëŽ[CSÃ4ÆQ…d>’-õ4ž4H1O…n«I1{^}!ïD)¥±nõv«”ã!©ÎE¹Þºÿ–Cí¿àWè-ã1>'¶xŽÔBü£Ð)ïöÿŒ"ÞÄ#âuíºˆWåþã7NßøÏ ¬ }ë"CÖ_`·¦ ÖÊý¤gzÚF¹2SküºX×ûªµUÚ,Ÿœ„=IkÐdñ¯5!l'Ú‘¹¦ ZÍùüXÈà¤-Ñk÷–?°iBó“×_2»o]È5ÚuĤ]'!ô…»vÜÉɉ{xÝo‹C´A^=a‰GZ›.T«’Ó:¦÷+ëpÛ»;ìn]´6RÈR†ϱw;j‹;²4eÍÙ:½V'„)ÐXœË–Ù»›¶vM³Õ½ÂÖm×Tõ4µ;\mön—ÆbÖ&E Ú<­Q+ó¢ƒ ¡ÓäêóùÆyÿ*¬½Ó·Ý6]k·#íÚ-díZôì{5¾¾öÁqÏ7Å ÔÖ=W²ÉZ>é™+Þ}ã×lÜþnàwQ·[zFÿŽå®k_|®éžÉ§“d=gÃQ{ÄÌ7oÚ©xÊáZ;Ø4K—ôÚ/þãò‡90mö7ÎW[òÉÛ—/–­øxÇ{³ßùýÆØ'¦¾³bíó–¿ÿðäË{×oû«ùé))Ó§ßK(8ÕÝBA¯GŸðô,Ù²gã“-+Ÿ½7·§;ô4ݨ­ødz^ì¡êòÙ1k†j&¬~KwÕsö›Íæœïi¾ôK×Í‘;ãÔ—n3Ÿ¸zâ‰W óJNôüòu×ѵ±…Ñùå<75÷óäAÙ‘ëþþBá‚wÿy]aËÎÓµ¯¾üÆ'a·~DÖ}¸9cÿ³•w¿ÒÕ¢›<|è@‰ßr൭_Þ{ôÉünݾùeõË5s®ñUv¯ÚµwèÔÚD©Ë¢¼=SÛÝãrkfÙÝ+œÝKGú4à¢>ÍÒŽ— RG)Ëìš·mY§£c±¦ÆÞ½ÜÑl×T;n]ž6Wª9«RSQf..«(«mИ-kU­µ$K3®9ÃX 9_†è…Ú|]®¶€{!l]sõ:žüß¿ÿɇßÈÖœm»,kBöÚ„ýòþ{ šû~Í»=Ÿ¼¤ßÿæÏþóó~øjçà‰¿ÅÏ;ôÊ?oÞû‘Mcÿqy}ˆkÉÊ¿vEž{¾þçŒë/ÙÅÎMh ­_›ðr×õo¥Ôç¼u,Bv¥áñë80³ü«o'¥<<çæ+’okßx¤|ÚKÜcxëÿ o0Þz‘3ɇ'†Þ¶A6õõ¯Öü¾ú­û|hÕ²?n˜Ò•z渓W…Û· emÂ;æÝÒôrè½k~|쩈Ç^›sóR¿&ëó{î~?¿W–òQ÷¶QvïeþQ×EXÎþ3jæÛŠ«o i¯Ræßøò–;O²ÎÛÆ_n»úé/ºn¹ï…Ö¦â)7\Ÿ’{SÊ–­¿µøùéõßÀ_0Hôdè-ï[N'ÿ^Zå–—K7ïûmDãÿyNü.];VbœôŸÕiiÀ¿méÿ”Šÿ~â¾x’×®½ý"—Þ½°Ipém§<¼}ç´½Äñ²·i§\÷ʫÛ¯)}§lâõ_½)/ºýá=+ç}óëÍÖÊÁ€í™=†'øŸüΙþ`ÐìFY~e﫵•'Ë*~7àÄöÁK†®9ñÉ®½)eÅ!íoÜäÁsö>{<ûΉ?öÞWÏ;)öÏ®zpåmO¼7­¸mþ„ËÏ= §¾ÿ¡—5þ~ó¢»o¬îÌlJM*ÑÌÞ—ù‚›üZö}zÜ‚‡6våûeþ¼ã£SîúrÛ½3>q½8ÝÿvÏûÛÞ¼öeú™ÿØ9ò/fÝ5íî׿–¾Y8ç§äWžM›4alî«·~|Ø4íëw—M[þÙí^ÕšW{ßtE߯7Œ×eFþöbÄé=_Õ™;K'd]¡]çw ±ÂI, © ÚüSQKÔ;.ô®õÚ¨¼ÿ¦ÕݨÕë|Vw­6OgYÝ×á…ÿ˕ЕjK$¢)+V¬È^„. Ìnv.Ëé¶w:]·³{UNu•YáìîÌÖ4­ÒTÛ[³³¿Î®¨-|¹P7U;Yâ“_âXìpƒÀ²¥Ýæriôš š™Žæn§ TÕcŽ­ÝÑbs;œšå¹º­¿@/'u5ºpm¨ð Wε¹Ú`蹺m°d Eµ½e™³£E—¤MrhDä({ èèìÙŽ”ü›òÿ8ˆîR7Ói+¯ºï‰97’ßî\ìÌ^ìhÕ„‰„²ímf_F_úƱàâ‚Ùã:ŸQ³°é²›»ÛµQ>óM<óÓÊaÎÿq2Y÷ÎM¯Ô–ÿ¡=}àµ7ÁÇØõÏ/º¾+ïüeAavä§¥ªŸ«‹¹÷#´¬Û–×z´î¹º§O<1ÏÜö}Ñm7mŸ}IÁÉ;6unžŒ¾¾oràøï²œùzYï¦Û¿¹åÖ¸ÂGÚ?‘Pyª>áÕC}÷Æ¡Ùëþxû›¯^ýû®K’Ÿüùï4|„dõ§e¥Ht<ø‡ÍJÜ…/A™HuX‹æ"õð\Ø_V.TÁùýÓËĈ¶út±Xxdòdã!<O럫>cŽÞȉáiè8ÀYŠLÀPød‚­ð”i‘løìÀ½ €›|4pï¼ù‚» Ü{Å įó Ü£Í5 /K¿§¦FÌ¿§³GÀ6"Pû9à݇OßÓÀ÷4¢øÍþË àˆoô_“èµþÞlõ!ìÁ÷'©MƒøÁþ¹óEÍ€&ˆ¦bž1q¢Ñ Mxõ8 À 9‚JOœ8+æ÷á•Öã¼uXçdZ°“L8@ÏÞ„wšðQ舣àÓGÁ§B‡E2|t 7AÌád"Laʘ$ÅIÄ9FÈ1BŽL3‘MAIjÏ5G®9q ½ñ58VÈÁ½Éê;®9'š²® SŸ»!G]9k&ŸœL<“OL&“Uaêë¯Cêk¯KV_øºz× I¼‡û§¥HM-øÂpÿdÄ!Ž5ÒÖ¿Mh±„ZÁ¿êoii¾ê‡A.Eêë¥È@e¥Q¬2s&/))á%àkBÉø2Gâ¯À_ ¾ß©„°à ÀYh;„½;ñW&%E›ñ©Íg7“Sæ±xÔØ#8„‡Žœhö€÷íß~¹h÷ ðÝ’$ŠÝ@±(vÃ4»h`ýT0{þ&F1ývº_ ¡ €àCý„%âlÿúé€þ!¡÷öêÕ÷oˆ&8“jxá‰øÝÞ\õU[„I;µK ñý[âeJ(åà–\õV€AÂŒ»¡ØbÜ·áð†ãNn8³A¦Ú Þ@mÞ@îÜ€CIi~²ê bEù(}i¿Ù,ŽþRa26 «)­¢Â èø‚ÈCdd~dX^¤J˜鯋”k#iN$ÊŽÔ!Í)„RêJ[€PÆD„²ªÊÞ)Ö3CBo"4qBS@y³–—ÿ„ÿ¯Bù „fT— 4'¡ya-ø¡&èïÖ+j«@h äw®C¨ ê.ïGhõ„®Yéà_[ ¾ý#„vjºNŽÐào·MFèÎcííDèßð'üŸ÷ÎAè>˜€ññ̡߂Ð>ðuÏóõû!tà„Öþ ÿ-ðé ~ýÿqÿø¡§oBè°Á³àƒGa­.æñç·ï`½~áu ^,õ§þœý_/µœ’àåñ>ðõ(ü5ìOøþ„?áOøþ„?áOøþ„ÿÿ¥lÈ#i‹T“ò‹÷/j>œ;óE¬»åøÐ]ç ˜ï× IDD ${I /GcP“¬%"DoGj 8¢ Z…ÐðÃCxJ¨;ü!Bç^Drô?uÈ^–]Nï&…´g$ÇÃÿð‡îEO‡Uœ@%H9\1üÄðÏè7¤…¸|øÄðϤ–ôûVcéµhêð3è ô 𛎠VÀàœ‰úPz=ŠAw »¡òÔêÐRTƒÊAޥȆ֠R¨Õ‹Ú@ÚZ4½÷ÁŸIx™2âŸÑ >ÂÎÀßgè Gµè©áâóôu£N|:…v£[íÄ­(… •h3pw…¤å¢fám¶ptH$äitÝG=¨§]\’mk@‡¿Ð|šŒ¦¼EèF4­FËÐ~ø«FzhËFt5>-¼ÚPж¡Fhç È-DßCk¬ø2T‹›À‹P*Úðè¯8­G]ø{ü~DcÑô4þ¸^‰ŠÐatª¹sÐ ô&ºÝ Ü•$‘Ô+™ ´nàY‡šÐxÄHÑ2s=µ@­EÓQÚÝè}ô:ø[;jÅl’ŠV oA)ÃáPÖ-™‡²QÜðç(føËáÕ`+#P¶‰Ü‹¡¬YQØzºx8Ñd¼¬]K?„öoŠ„^º´ª«T£!èñ`ë+€ö6²‡ÜÖ¾†T \r-J‡z5h X­MBiàsðaèChz(ç]2H`¨š´KÁ¦ …´Œ¼…¾D.´M­¨Aö êÆÉx®¿4£@æ\ð,¡×o7ãg°ô]¯ð«N|Ú?Õ‘$2µ xøêÁÊŸWÖB/¡ô(B_G¡[QÑ0C¶¢« ³ÑÜŠñ£´½~}7~4?H^Å›° uàAè·2” >÷,ô×8ÚtZ{ù¬¸4 Ü÷";´î*ð­9h9ÿÙ£á6°éý¾]5Zñ>L¡µ/‚G~AÖΓñàw%x H-G› ¥Å@¿8CmðˆvT 2CÞ«òy¸|íð6|'Þ,ûnø~T;Bûè3¨iøtÛÆ®•+d/±ÃÃ߀o”?ß¶šÞ]ŠzY;»q¸SvÌcU Ïâá›Ñœáð!ð¯Aõ"ú+ZÄ~’½Î ‡ŸÅ~ôÌðf9a™r*»Nx&BœÁ´à9ÿjnÒb‚)f0Ž…O‡'ü5eAoe£ðTx‰¬• Ѕࡵ“Á£^BÃLЄÁ2ÔŒåX}ºû£sX‰†Q À8}Öý+èø2Æ*‚CqÇ艣p4ŽAÇÐqô zÇâ8p"NÂj¬ÿIÁ©x ‹>Æi`ýt<g 0‹½†£}x<ÎÄYè<yp6ÎOÒá\¬GŸâ<ô;ÎÇ\€ ±ÆçÛè-Ô†'âIx2ž‚§â"lÂf\Œ-è¸[Ñ_p)úOÃÓq.G§ÁÿÅ/LŠ=Q½P}= ú² ü¥<¼¼~xt=j€Q1-€9Ë#g)ôø2 ½†+ðL< õáJ4„«`ÙqâÙ¸FC'ê‚qíµ¸ÏÁsq=nÀóЯx>^€âK`„õ€®À‹p#zÛpŒ•lÇ­x1nü/EŸàv´/Ã؉;aì\ zºwánìB»±íÇ=x9^WâUøRô^þÀ—áËñ¸Fb/Ìèkñ¼¯Ãëñ•xÞãe3Þ‚¾Á[ñ6ô8¾ }·ã«ñô-úmÁ;ñ5øZ|¾߀wÁêñ4¾ß„oÆ·à[ñmøv|xuÞ÷à½ø.|7¾ß‹ïÃ÷ãðƒø!ü0~FŽï‡q}îÇø~ÄáA|?Žÿ‚ŸÀOâ§ða|? 3óø(~?_À/ÂÜû2þ+>†_Á¯âã(EÀŠ…¢a¥ŽEq(%àø5ü:~¿‰ßÂoãwð»ø=ü>þþˆ?Â'ñ)üwü1þоCߣðgøsüþ…¿ÆÿÀßàÓø[|ŸÅßÁLÿþÿ„ÆÿÄ¿à_ñoøwü>‡‡ð0AÂÏaaÑ~žPô#aD†~B?9Q?âO”$€’ "|Í"„„’0N"H$‰"Ñ$†Ä’8+@"ÌpjŒ®ƒr…}ÆXÕ0§^sVÚ»‰æñ›H2Ì’7“’ 3Ð!tCÆ’4’NÆ‘ ˜#Ÿ„Ù_Žv‘L¤ YdÚ@²a†º‡ä-Ñ‘\¢'y$ýv<Ï¡P¤‚NzP ÜK H! @h*¬Þ—Àzx=³ì£è(1"%’Á\¹ v‡a¦y“‰h3™„RaE[‡žY1ˆLUt+ºŠL%EÄD̤˜XH ¬y¥( fÓ'Ð"2 Vƒ2VÒR†()'3H™If‘JREf“jRƒ¶ÃLú.¬œïÁ:ð7ô!©EÁ:qÖÃS¤ŽÌ!sam óÈ|²v—E¤‘ØHi&-ÄNZÉbÒFd YJÚÉ2ÒAœ¤“t‘nâ"nÒC–“d%YE.%«Éeärré%kÈZ²Ž¬'W’ d#ÙD6“-d+ÙF®"ÛÉÕdÙI®!×’ëÈõ䲋ÜHn"7“[È­ä6r;¹ƒÜIúÈnX5÷’»ÈÝär/¹ÜO ’‡ÈÃä²xÈ~ÒOÈò(9H#ƒäyœü…]@ÒKè"ÚHm´‰6Ój§­t1m£º„.¥ítí NÚI»h7uQ7í¡Ëé º’®¢—ÒÕô2z9½‚öÒ5t-]G×Ó+麑n¢›éº•n£WÑíôjºƒî¤×ÐkéuôzzÝEo¤7Ñ›Ñôz+½ ÝJo§wÐ;aÍÞM÷нô.z7½‡ÞKï£÷Óèƒô!ú0}„ŸöÓz€>JÒÇè =D§¡OÐ'éSô0=BŸ¦ÏÐgéQú}ž¾@_¤/Ñ—é_é1ú }•§'èkôuú}“¾EߦïÐwé{ô}ú7úý~DOÒSôïôcú ý”~F?§_Ð/éWôkúú =M¿¥gèYúýžþ@¤?ÑŸé?é/ôWúýþAÏÑ! ›'†a”1&cr¦`~ÌŸ)Y dA,˜©X ea,œE°HÅ¢Y ‹eq,ž%°D–ÄÔLÃ’Y KecØX–ÆÒÙ8–ÁƳL–Å&°l–ôLÇr™žå±|f`¬ÙD6‰MfSØTVÄLÌÌŠ™…•0++eÓØtVÆÊÙ VÁf²Y¬’U±Ù¬šÕ°ZVÇæ°¹¬ž5°yl>[À²KØ"Öûè&ÖÌZ˜µ²Å¬9ضöHËXs²NÖź™‹¹Y[ÎV°•l»”­f—±ËÙ¬—­akÙ:¶ž]É6°lÛ̶°­°ÿºŠmgW³l'»†]Ë®c׳Ø.v#»‰ÝÌna·²ÛØíìv'ëc»Ù¶—ÝÅîf÷°{Ù}ì~ö{=Äf°}ÌÃö³~6À°GÙAöd‡Øãì/ì ö${ŠfGØÓìö,;ÊžcϳØ‹ì%ö2û+;Æ^a¯²ãì{½ÎÞ`o²·ØÛìö.{½ÏþÆ>`²ØIvŠý}Ì>aŸ²ÏØçì ö%ûŠ}ÍþÁ¾a§Ù·ì ;˾cß³Øì'ö3û'û…ýÊ~c¿³?Ø96ĆeH†…WʘL&“Ë2?™¿L) Ê‚dÁ2•,D* “…Ë"d‘²(Y´,F+‹“ÅËd‰²$™Z¦‘%ËRd©²1²±²4Yºlœ,C6^–)Ë’MeËrdZ™N–+ÓËòdù2ƒ¬@±Ìár9:˲;zÚÛC:œËlÝK!£Ûîîéî››ºíËíJs7dÙš{Üv…y™­¹ÛÙ¡0;;;ìKf«˜`ivt7÷,km·¯TZZœn[s³½Ã-/i¶Am@ÝN›[n•RV‰«Õ[Maå\­œkO‡C«+Í ˜6Ê5pZ³sÙ2›D œæ¥ ˜>Z‡Mo²uËËÜŽö»¼L’R6*¥ŒK)“¤”ûpŸáÃ]¯7È+ĶVø”É+Ä6ð*ŬØËg‰õä³Ä¢ÀY±ÊË—WŠÚU¶õ€%»{–µÛzÜŠJI¡€JW»ÍÕ&1©æHâU}¯|ƒ¼F2yú5>õk}õ­Ôvõ8ÝvñÇðC.«¬U'Y«NÔOV'ôtPÝyZÖq³ÕIf“Ï•4œ»¸Û¶Ü0wT ÿ¹-{·Ýåpɤ†ÑBù<‘L9o´?D=Š ¨µc±ÀÖî–Û¤N³:œK·q×°Ù¥Ö7û8\ó¨ÃµH.Ö"9œ]JÙ%®öQÑvÎÕ~žÃå,ö±éb_‡[<êpm>×&˜Ð!™Ð!JQ88k÷²%>,—^ìeKa´Ù;Úm-Žfy»ärí¾]ØîërÖ.¸\‡Ô ’›tøTè°u:]îngg›»ŸVî”ÜÏy^Ç:¹û9}ܯ›#‰o÷ÅîW wIàòi—Ë×ýܾº»}t7è™[°Wd¯ÉåzD—ë9O³nÃîr+$­VH^µÂÇåVx]n•T¸ÊÇå.•\îÒó].טKí‹•‹íÝËÀèMí5¤¬œÌî!µm¤þ—’f7im¥­­€vÒê9M€šHk 6ÒºÐRÒº„8–ÈÚ‹]r1tH¨ÝO@ÀÛå?qxcí‚¥ÅÚ|©n“„Ú$´”¸:y¹¸ÝÄ}©ÊÕ”úÛ\=0„ÝþMÞX³7ÖâÙ½±Vol±7Öæ9¼±%ÞØRo¬Ý[æuxcNo¬Óëòƺ½1—7æöÆz¼±åÞØ ol¥7¶Ê»t$¦´y§tz£Áv±ïG’~—Ú»a²[ Þa±{…˜öw·ÁPb~­Îžn)âX.Õq9VŠu\à”bÌ.Ì–b¥‡Ä(Pàìloq¹WµÛ€»7FâA¢”‘T  i4Ò¼4 ÑK#Jõ¦DÉ^"Aº7!h0ÒP‘÷hÂ1j÷H\âíM‰¼½DooBàíèh•8@ë¼qhÝH\jÝHJÔ`4xi@/¨7%jà%4IpW7s\̱%´ÓÖ S¤½Õ«x˜˜ÓíÛ©r!'.äÄ…>Ä#b|ˆG²‚EÞ1$Îa^ÿjq¶·ÛF--L%çIÕå—ú ¾ÖæènñœMˆ¸xQ>ÇŽ 8.äØÈ±ÙXˆ¶i ,Å]‚YyµÅîôº\™YX’eÓ„ùZiñ.Õ~%|—Õ {™EØ5ÈŠc±j蟋+‹½Å½è_2²¬N÷Ù<ÈgŠ{y¥¸uPŠò\ËlííJQ¨UJÓA#⥊¢RTTDŠŠÚˆQA%1⣗˜È•Á^ Åd¨¯šbN€¤«—–}¢Óju¢µy%ZoN¡7f‰åzKós¥úÆ\o™ÎÍÓKµ´ZÎÝà-ÉãôÒP̳ŒRçó¯üÜQ*®¥•K×–xK¼µ :NoæØ"a³W÷\o{ôÞ<=§2{uׯôÞXž7Ƶ4›½9¼%f«„‹Gyxuãz[yÒQ^ýõFNï-ËórÊãZsYÅ^ª¼ÑÚ^mó¼Úæå{c^[æôø(ÑØˆ…ty\’ÁìÍéƒBoŽ—.Ô?¼ó½ó½vÈ÷j–Ï=¤ØkGÃ(WÂ(·QYÞ^4ð¾(ñúÁ+Ó0j{¯¾#ÞhôZÊàåUà•^ÀmímÌ[Þ²ïç¶°ŒX¿Ð¨Wò˜^•¼pd¦(y{£½¶(i%,Ñ\¶×¿ ^í¹‹9.á~çm}·Í£s*³·Í…Þ–z) ½^TÈõ4{s¼zŽè©ÓqKšKy/r›YyºtTš·G ¹ÍŠG˼ZŽøþH¯•Œ^m^mGçžÑž4zµ4ŽhY8êóÆÑ˜×FÞž€?o,×Ó{cyÞ˜·ýÚÑ^Ѹ؛ãõ7¯v:cžß*›[ºÜ +ou#ïr«We ù2¬ÏÏõk^Õ-®BD:¯5·ÃbΊa ›fƒEBVbowÛÖN—¶lP+Ö¶AŒ•ÁJ!›aëì´É+lËšZldf™ÕCêŠJñe`¤ÊA«Ûœ²Çâe6ZkëQÔI¬hU›ƒZª\¥(ÕíìpŠ›,]©´:6rl渘c Ç%[9.•p!§/äô…œ¾ÓrúBN_Èé 9}1§/æôÅœ¾˜Ó[¹E|”Öq"'Òq"'Òq¡:.ÔÂë[Œ~`QF¹¼ —3ÊåŒr9£\Î(—3ÊåÚçríœÞÈéœÞÈéœÞÈéœÞÈé-¼¾…×·Xü…Ž5 b#W/¤b=§çâôœ\ÏÉõ\œž‹Ósqz.®„Ó—púN_RÈÈÇ6y¼r¯œÇ+çqay\XVÊë—òúVK`OÏ©xâüåóÊùœi>g–Ï5¶r¦Ö¦\ k±²r™}±o_xU¯jàU œµëkà" Ü8.ÊÌéÍœÞÌéÍœÞÌéÍœÞÌéÍœ¾”×/åõK-2›8Ä›„!¾Xâ-â·ó!~©0Ä…B·8ÄÂ_*ñviˆwô•…SêÚÝæ”»„Á­“‰ˆºaŒ÷ð1Þ ã»’2§`~®¤•‹Ìu *èäb‰Ni»`MÀZ>¸yZ;’ÎçXÏqǹ8.àƒ›Ór>…¼^!§/äô…œo!§/äôÅœ¾˜Ósúb½Ÿ€[K‹9ƒbNX\h¿h–(àÒ 8µŽsÓqî:.]Çëé8S]®Ÿý¼Y¢€W,àr9£\Î(——çrF¹#õ¸à\®e.ož‘Ó9#¯gäôFNoä|œÞÈé-¼¾…×·ðú^ÏRàïðÎ"Ž‹f‘Φ€W×s5ô\-=«çìõœ½ž‹-¡Áœ_ ¯_’ê+ÔÇ%\B —XRè¼hÞ)àã¯`dþá•ó8qW/‹Ëãêåqõ¬¼ÜšÑsþ”#ÍCdö\ì8|ðÏ5Èçäs ù\ƒ|®AþˆÜ0ù#˜ÈÊë[Gêq~VÎßZ t^0©ðɦ`dòâU œÔÀU1p֮Ћ(å*F0WÅÌéÍœŸ™×7s>fÎÇÌù›9½™Ó—ŽðçõKyýÒ>ï˜9–N™ôRSµúRŽ x¾4´çql–‰­:¯ÏümN·½Ýî°q™¸uŠùT\<2ót)/·Ž,·<ßÂóKxºddŸÀ­bY/Ký[¶öUnÇR.ÙÊ)¬%òåݶæ¶UÂÍ™¥ÒíYe›³»CæÃ:1ìBÖâìXØât7ÙÛ+šËšüÅëÑbLÜVŠ1ñ®‡ js:—ÚšœR ¹Y<å—KÈ"¡ Y%T*¡iš.¡2 •Kh†„*$4SB³$T)¡* Í–Pµ„j$T+¡: Í‘Ð\ ÕK¨ABó¤«f›÷ÂJ€y±÷ÊJˆ¹ùüK+Áæßk+f·÷âJ€t{Yºº"Þc–.ÎŒÞn–.©ð{Î<á½L¢0[y¦ÕGËh<Är6–fï K³ÏµÕè]k©fÉhÍéþµ‡f›”é+Óêcë…°žo«cë¨TÖó´ú6ÛêÓì€i>-œva §² õ½g. ™v¾éû ·Ð%Fe>í+ói_Ù…í+;¿}e>=\æÓ¾² ÚWæÛ¾2Ÿö…”_ !tÆ…íšáÛw£ª†V\X7 Â§Ï+|éü…»÷¼ŽxTŠÏòiø,ŸÆÌå:ë"f§Q¥JãU^h¼ÊóWé#¯rÔxaç=8 ™¬r™ïÅÃQýC|'†I¥4Lª}”ªöiLõE©>¯15>þVs¡¿Õø0ª¹ˆQ/£ÐÚ‹ú¦v”:Ä牸ö¼ÎªõzfO;ê|Œ[w¡qëÎ7nqë|æž:ïÜVw±ë|ý´ÎwÎõÑc®s/Ôcîùz4øÐ5øÐ5\H×p>Ý<ºy£†SÍ;d)k…UIêú2iy?µàñéÞ„$ö¬ÓÞí²u´H´Üä¶vñ’½ÎÊwV¾“°ò„•ï$¬|'aå; +ßIXùNÂÊO»¬ü´ËÊO»¬ü´ËÊO»¬ü´ËÊO»¬ü´ËÊϬü\ÁÊϬÅ\>?U°sùü”ÁZÌåó V~ÂÊ/@Xùk1—Ï÷V¾×°ò½†•ï¬|Obå›s+ßœ[ùæÜjáòù&Ýjáòùµ «…Ëç—¬ü’€ÕÂåó=‹•ïa¬|bå{j+ßS[K¸|¾·–pù%\>ß½[K¸|~MÀʯ Xù5k —_Âåó=’•%\>ßÄZù&ÖÊ7·V¾ÙµZ¹|¾-·òͱÕÊåó3|+?÷ò3|«•Ë·rùV.ŸïÀ¬|Og-åòK¹|¾µ–ry|l-åòøe k)¿eÖŠ¿¤ÈÄ843)3))'GW¨ÉLOJ›ž4)Cœ’˜ê=ôú$áÈÌÌLâGBŽxŒÓ…ô*/±8))qBr’pdd¤dd¨GŽè`8á€Z‘ )±µµfýœñF»]_k0Öff,œb+¨Í¬Õ×z4Æ,™ú…#Çxá0‘tÔÚõúèZ‘Æ6ŽG Õ§‡Mo³xAe=P%:%³@Ÿ‘•“ž;)3 r3ó2s àO—“®×kôÙc ruÙ“ôS싦KÆ–-Yd×gÚ+ÙÇe&U%èMºñ†Œ¬ñxôÈC•O.ú×G\œ¤«‹pJð„óü?8âr¢‚pd’ð)t~$ÄJ8 ãp@é jœÄ‹‚ƒ¡×E¡ ‰‹Ä±±Ú”ää°0ŒÇ&Ä™L™áx,ËŒ&‰Ã8& ¦ÈË;ÿ?3} xINZJŠY§›œ™Y+ZJ›“3!¾0U£NˆˆŸ J(IÊLÌ•Žgãú±qZ­Z“ãâsÓâÇKÕŒÉP'¥¦b:«0.6u\¨vì˜ÂB­&>^Ÿ“qtBZJRÒXhR’&#=22(3+3<\­N×ÄǪÇjÓS2Ç„d¦7èc’ÔÑùQÙcR ôѱiUãþ¯ö®0Š"k¿ª®I !áG i"’@•°‚AÃ¥迈×$™$#“™83!Æ]]Eý½@EóÁ>Ž>ûdõÉëãìSÔçœ<™—”×1¯S^ϼœ¼y£óÆå¹òÜGdäß™ÿ@þêüWóßÿ&)¼/¯&-a—ˆß‚ÇÏÅ^Ùy|J¾×Çcˆy¼<Î7î2^3ÞŒã‘T¹:OÔuêFµD-S«ÇÕÔkàq­Úª>P;ÕžœËr–äRn÷\3w\îd›Çsr/Ë}<÷…Ü·r7æîÉýÒ”fBV>x<Ê,1cCæó7æÍxœjó˜™×<öcÏÍ«d—Ù<’Í#‰Ž4EÞ-ojzÕ6—ë›. O$ _м“ÄxQ&œá½œDúÛ¼rMø¯4aÿOã¨ä@ ¯÷/n™²-GŽŒm·¥7Ë•nlá[ª·ìØò7œ·mQ‘ü-·¤mÙ±yïæßlÞA´éÅMÏozF§oZ†cÁ¦À³ßùã†K74lHÚ0mÃH"Ù–»UܫØbL3ζñ³­#.÷L†gà¨4æ4o·ñ7ho¡ºAÝ >¬…W©Õêe"õ²Z]þMýúÜìX[A”d¯MJI“ôpÒê¤mI;‰’3pä$Oiå&·`²/yVr³•¥ÉöºíäË’/¼œñ_6oSò…¼²»XüS¶ëÅ;âFñ‰LÖ«ídwñ¤Ø- Ä.錭Œ¬Žçð*½UâYññ…ì Wä€W'#J´§^ÕÖÒ©#eP&ujs½à~ÙO4‰çeG9‚æÐµ4—æÑ|Z@×ѯi!]Ïkñn¤›èfº…n¥E´X¯Z¤;h ÝIKé.Ä‹þ’ÄŸÑú¯Ä»b‹x[le7y¼ì)Ž‘Äë²eœX'žÒk0åqÆu2S¶—£E½8V¦‹Åâq›ø’rôh >ðÕ#¨ÐQTÌëlO Qt"¢Ý`šFÓéçtI3Ä3t.è| Rˆ.¥kD&ÝCwÓ½tý†–Ñðð'é zŠVÐ_èEz‰V‹ ZO[h3âÞ6zW‘G÷““¢þ´œÐ逸ôÑc4ˆ§aôCÏбô,|e%MOÓÏètý‘FÒó4‚þDÇÓŸ©”^ ÑôWxÔC/÷^¥±ô FKýè$zN¦×é :…þNéMšDoÑ©´–¦ÐÛ4•ÖÑé´‘N£ ôýJ¤Ó9´Î¢÷èlzÑú#ª ä¦O¨’>¦jÚE5´›fÒgä¡OÉKŸS-}AuôOª§}Ôˆ€?‹öS5Ѧ … K„¢_ˆvt9]!Rè*‘FWŠTq$ §UÔ— #é·ä¢é<Ú£éÉ‘¼¢qŒ5šTGy¾¬“K¯|@.³W!ꕇÉKäEr¾ü­¬¶×Eê5‘A9‹×A^l¯}Œ¬|œ#çñjG½Ö1~£^åøˆ½‚Q¯^|N>ÏkWÛë#«õÚD½"Q¯GŒ_‹¨W">#Ÿ–»ä-Ö#~%ÿоgüZÞ)÷Ê¥rbw“¼G†å½ÉZù¤ É•²AþYΖ/ËKå+ò2¹F^)ÿ&¯‘ÿ×Êõr®Ü ¯—[är›¼I¾'”ÿ”õr•¬‘¿—·Ëå…ò/ò.¹_.åuòºXt‘èñ?†uTt™HŽ_KeÜkÜc,ãõ…¿áõ…-Wa®2VÏóZÂ?/1^áU„«yaË—[-Æû¼fð]^1ØråçÆgÆW¼^ð ‡Q^!(õú@ë:©L•Å+;ëõ€­ÖXÞ Ë~¶ý"¬{3ì{,5 [ÍP[­ŠÌo±r´åzÇkC[®=lµž³ù*Ëè:T{ âqª8n¥^ÊkMU‰¦FðŠÉÆGÆvcWd¥©ú™®FòzÈÕÞØk|­’T‡èúÒ*5J•ªcU7•Ï«Py5©:F¨_ e¯Â 3ôzqéIÒJìäµà)‰}ÆëÊ_´Væ‹‹xUþÕâ½î^ÌÃô ýV+óy%¾^ƒïÄ«×?æÕë;Ô8±Wà·µúþfñ²X!Û‹ÄZññ–xS¼*žoˆlþÊ‚þÆB‘‚Î>…¬è´yãZF±oßÄ¿/çó胋ÑçÎ@{7z×{ѳއ¾õ÷èWŸäžõEô­èYѯnFϺ•ÞEÏúzUô©²+ú{Œ0H‘™"#€ž²—n´‹~n[BF¾¿%Ð¥ÿK Áñ]ƒ‘]Ò` –ð㌠<2ÇÈ[=&@Öm[‚õ‘²pÂô÷t¨X4hKPƒ,KÀ¬àø˜%@Ͻ´% —¿‡%È⋈%ðL!óƒL£³e ˜L–ÝÐ'¯“í µ‡=ŸÐ³‰Žòט3è¹Ã]F†x³Š.b¥‘±Ì-z`¤3¼¥%ðűŠ5×ø#”&žo,æùÆ­˜w\‹ùÆB{Æq‹žo`œö¿<ߘ‹™Æ˜qÜ‚y‰žq|l|“%Dìà{ϬšEÌݬˆð°Ü%žÃ|î‰HD{tDÀ¼îÌ¡îà j9fP¿Ãês¹¬uDÀÌï+ÌýþŠÙVóˆ°³Áu˜~mÌŸÆÌì{ÍìÐÇ$,!Ö7èç'Åä´û†‡h ú†GøIÊü¤¡}ÃcüåXô ÏFûý …û*iÙ7ÐJîþÄÏOÆiK 5t²îèíè“ýE?1™ª-ÖÑiq}Ã:}ÃûtN˾¶ós”J=^¤ùyŠG÷ ô)?SéÍOQFé'#Ô¨ûùô çÇ=E¹T$ÑëtMi4Bžx¦žx¦žx¦žx¦žx¦žx¦žx¦žx¦žx¦žx¦žx¦ÎÏÔí9ŽñKÀ ý­ò Чf…k»‡Gö`<;œ«ÿmyظ„áÒðl2¤Ô¸,ÏCÿk„¯ vbRډ݀頳°{x, ¦“:c—†£tÜë,?Š~Ú_8'¼p>Û5»šöîÖ%ß@oÞ=¼°Gx-`6Ã¥áÔ…s³@çÀ9á€sц,šÇp>ÃA3 ”5¾ˆáb†·3¼#|1à†KÞ¥!8ªÜÍðS´Åp«†LHLß`úÝ@´-Á\Ø?n?mÐO1•öˆ—¯ÚSéöüµ>2*^êRpϤž^WȇQc'öÞ4k°nýûøe ü« Ç%$š6ÛÏ74LÁxö›ŽéÌf:]¨©²Ñ§™tÌ”I§˜4qÚ”“M:áôñÓLŒŒ3-ƒGÙĸ²GÜÔ*§-¼ùµhq-)i¦;à#'ÆGë˃4,èñUÑHýíMŒƒ)Ê…ˆ>»ü–°k‰Í47}1–ŠjMÀZ[¨_ZçË­sáI6­Áöù¦$0å³øÜ:«¬³ê‚¼]çþ×€õ%m}Ÿ]]Œ‰|™]œl}W]L“ù{ê‘o’OÕßSÐÛ§ßüèM§R(þëéÍú]—®ý êø,ÅÀl ¿¨Ÿ±ŸÙÃS˜$aP„QþHxíDŒÅϦ*òa=[ÿ7 Ì„nG¹‡I=“ÏÇ8_ª’J0æ—FZøy̤¼én¤OBz%®/CúÈ‚ôB é¸ÎFzIñ¾c5ß¿š:¥xéCqÞ‹ô¤?‹ôa¸nBzèå!½ÒßCº×}®¹pľŠˆ×s*2„û8‚¥„Oß’NQÙ· ߀s;Žs®¿1¾‚' qµ.%nÄL`ÞhÀšRqî†Ø—‡9â|øÎíˆ)÷G¾Œ¼o“Õã˜5½€™Ð[°§÷i'}IM˜s¥‹,‘#œèw–Lj‰àéÇ«š÷¨,¯Äõô˜ E5®‹qžŽë£P. ×}b²4âz Îù¸‹û6àz8ÎÏàúgHï›<ómúb/ø“¹LÁuaœ¬ã:;*c)Çãz4ÎSq :² ×šÞ «>ñ¹c¾ŽÐ3òQ¾Ý>­«B”?Ò¦×é%-Ú{2òOµéOi¥Séç7–NéptŠûÒèhˆýŽR שñh=ÚÃu,ÕÏóp 8dÚ}mÚ mÚýXKHQã9®$ÅZ››¡#™™Öçaø^)%¶è†q…Gä/ ×ä?ÎÍô;Ñðç?ƒã…ðìü×~6Í>œºíó¼6òVÚ玫­#šwEþºÿxÝøcüRù‡_&¼8+f–ŒÉÿè{µ÷±ü=?ßFY}>LË _p€ô•ùûZÚOKü ´WÆÎñG[å¾.æ]|RoàèwýÒÊõo#m¹S…×:ÓÂk¿›ÿGélüìþ;ÐÑüVùKœYmû‡3'âwÑØ²2ÿÑx? ûNƒm|Xøbç ÍŽ~“Mã¦ØÑª®HÞ–¾âË2 í“5 ÷ڄ〼ÌkíÛŠ‘2:æ,>pû×´¦ö:£ÿ«-ÜØÇ<¹YüŠÈ‚·1ÀÚçHþK‘ûcÛÿ^ë/pž„¹ô·ôaV½MŸX´ùˆèna ŸúÄNâœÒvÌuò¯9a7ŽóâøoŒ+sž³2?ÞÓk3ýÆë?žÿHÞšØý‘ƒ¯ÇØÇzë8 ÿ œÍÂÃâÒPvX„¶ó²6óÇ8çDëþ¹¶C'KñÉ‘³óVø‰¥ëi°Ï“œK¿­ÿϱKæØm˱iͲãàšŽ@Ü}#œKç‚þbç2ÿ1(£etê!Øÿ©?âÁÚç dÜã\ƒãºð'<6Õc¶å)tù·ûÆa×ù’sm¬rnn ?8X?´ÕÏ}[_Îu® çþ‹eþ’óƒ8žw·…ÿËøãü ÇÒ-ÿýâÚ×/¥-ü_§ÿ~Y°ÿ?þ=ýŽü¯žüzúåü·²Þô÷qÛ<@úÍ?€ÿµÏ}ãÆÊW·_mç‡@ãŠØX:JcÆw›¯r»Cßñ¾ Èm5Îçþ—>ÿšgϳXcÞÿ¾£Äö#,Oÿgõøyõ†·¸¹ð!•_øÃ”ùÉØÆâØ|œeyõ¬ýîóÙC±•ñ§ŸŒÜkÅû=þm÷aƬŸšÿ‡‹¬ãËŸðÔù›Í;<{ù!Êü'õ퇳™A“Aíø]¥.”Åoçgóÿ~Ï%“úPA})Ÿœt M¤Ét*M¡ ª$7U‘—jÉOuth\B³éRºŒ~A—ÓZÄoé/¥ô1}B;…†PÂ!’D²h'Ú‹l±S|#ö󛙆tÈY¬&ª©jº:K£\üš«ÚüÍúÿ*[ÿU9ò_“õÿJÖÿ)¹åEþ‡z[­WÕ&µE½«ÞSÛÕ‡j‡úÄÑ?òV/IÍo@ ð¯ß-HÇn@HA]ÈydQdÒ’!—(•½=ä£ß\Ð1 “)€‡ƒ%’Ä2I‚Tf£ü¥G{Hd¥@*‹(’¹ƒÒ %ÔZŠ:wÐNJ…ŒÔjOéO6¥@F;©3äô uûÅ~Òo² Ê„Ì$u‚Ü àé ÎúWýæ¥,¦®ãDÊ‚,§R7Ès:u‡LÏ¢ë9Ô²uQ6ä[A½ ãJê 9WQd}>î‚tQ~‘º ðaõ;”‡tQò|A½„ò«Õ+(ÿõðÛ€ëÕzÀj#à&µ p‹Úø®zð=õàvµðCõ!àµðõ h£?µ‡F8 (š)^ý¤C'÷ÙJã7M´> Ö‡b}8XIÐÇ‘(sv Ô¡Œ–¾ƒ¥ŸDs°'Ó\ìíhöö4{ -ÄžJ7bO£›±w [°§Ó­Ø;²¶2h1öLº {'º{gÖ_Ö_WÖ_Ý…½Ý=™î¡ûѺeôð±w§‡è·À—coG¿£GÐêßÓ£À£ÇÑ’'°§Ð“Ø{ÒSسiö^ô4öÞô ö^ô,öz{/Z‰=…^ÄžÊkÈsh5½ _}»Ik°÷¡W±§òÊò´{½KïÁßÇÞ¶c?‚> €ïÀžý>?¾ {&í¦Oáó{è3àz]zgÚ‹ÝIß`ïGûh?ð& Ã:õë5NýåAàÚ‚»Â‚“( ~ÞžŽ)"…º‰T‘JýEšHÞUt%Cd‰îÔNôý`÷G‰!”)v‰]4@ì»i øT|JbØC…â ñ‰/Å—4XüSü“‰¯Å×€{Å^¤ïû¨X4‰&:нbˆTRjÊþp4ûÃ1jŠšBǪÓÕé4L©Î¤ö„áª\•ÓÏØŽcÁþ0þPƒ»<ª–Ž×±xª~¾ ¿X] jsÕ\P[¨Þ n¼K=ÊOÀ[†«gÔŸAYûÌö™‘¶Ï¬Uk)ÙöœujpË6¨ À-/zG½Üò¥Íj3pË£¶ª­À-¿Ú¦¶·¼ë}õ>pËÇ>P·<í#õpËß>Vg¯S;ÕNà»ÕnJQ{ÔÀÏÕçˆ_ª/áç_©¯÷ª½€ûÔ>À&ÕDÙýºi*ŽTEIŽ$ÀvŽv”çHq¤¦9ÒÓ逎 À^Ž^ÔÙ‘ãÈÔÞžäà@YìóIìóYìóIìóYð¼î$VÁuÔì´ŸÛÃE©~Ñ–±QÖ i:>è•e0¤´·ïÊ ñ'}IâeýªWšÆVMFzWÜ3%p~yÊvÓTV¯V“õ= 5Z¿ÏÚ^·¡TÙõèw\™~©Ý*œ3tÙRÂÝ©úîÒ ä§án}ÍÔ¬¼T. ¯Ö<¬]´¦Ìæ²”¬»Fé™|­ß{Óʬóä2䣾²R\›H'®™[UFv¥ï2u.Î]t¨õÖõ­ÒTÁë¨RKº¥“u½VIý—Ž|·¦×•ÓJ-©•êZ$â‘~3ïï¢ä‘yØO÷}×çÎÖï¶ášpn¸gxDdþžÍs¿ý¬nvìæpcxFôyë<¶I;ÑgêFµ¬‘3¥WÖÊ9ò^ýî1÷®‚{TÉ}©ä¾Tè’d l-)”x/îÐoI÷@”ÚM‚#äH#íÒ>éC¹_È_Ø÷8äµr.%Éÿ•7Q²¼GÞCíäCòa¤/—ËQæùµ—Oɧ(E®+(U¾*_þ†|øZ¹–ÒäÛruëåJ—å;ÀwÊÔQ~!¿@Éý² %Ã2 õ¡ùZCÆdcl¤÷¯áyzÆ~åý‘ñ=ô}®5ßË=µíùš¶€ˆ¥i[k–w^ëÙ^xMäýŠyËþ#Ÿ5‡þ´<æ á ôÎÙkyÌž±õ³|ýa7§òÌÀò‰ðB`kè(¾é(ŒÒíyJ΃o̰d>%õ{‹ÃW°ŸD¥ Óìó%m¶âNûüÞ…û¡ž8´ù€ |öóCñJÐt£ ¯øìiôjµV/².­Ê¨6j qž1ÓðFW•ýÊXOÏä¸ 8.MHPVd€z)ÔLÔ’NI¨© %£¶,j‡»Q{ÔÚ“RPs_”/4VU(SmÔ!÷WƯ(ÕXˆzôˆ¶ÈŠ)z55IŽ,GƒkU<†qpÝI\k²]k|}à)5F pðx•qZ`Õtq ¥××Rc®1—ÒyÆ<êhÌ7æS†qqe¿6~M¸Mëë©‹^ó x«q+à"cu5‹)˸͸ –Oƒþ3Æó ügc(o46R7ããênl26þfc3õ0¶ïROc›± éÛí€R¶ñ‘ñ1õ2v;‘²ËØ|·ñuQé*#pÁ_q~±í^ÝÛBÃÙt2ºÈ‰™Yßg¦1ÆD²¾ðL†“mÀZ‡’ÇWÇ|Îgã3N·q…2·Û¸µ¯²ñ$*0ÖÚx2=®”·#S­°qŒ Ô:OqLQ{l<•œ)e6žF¾”ól¼CÒ‘)šé423úq}æÈèjšÌN¯Û¸¤äN[mÜ ¾>´qE™;ظƒÒ:çØ8FÚØx2Íè\jãí(£ó"Ǹ¢ó6ž"ïïü„§Rç¬sm<ŽÍ Úx£KÖ2O§ÜÏi‰+ô”Öc#ãzGFOâô¯OÖé=Œ·c¼+ãíµŽzæÛ8tÔûd‡Žz×Ú8tÔû"‡ŽzÿÉÆ¡£ÞïÙ8tÔ{¿CG9ým:ÊÙdãÐQNØÆ¡£Ün6õõØ8tÔwCG}#4¡£V;S4_+OÕ¼ ô3žÆé—2žÎøµŒgh^ÞÄxgàÞÃx.óã]™ŽÅW§¿Áx¾×j6—ù„ñÞ\Æj[®Æ Ú3ÞW—/°d;€ñ#/d¼Xãí¸ýÇ3Îu°ÌÓ¬ôÿaœy)¨ ù‰E#ÈCÕTC!Œ ‹©„†ÚØ*ˆ¦–ð÷ÍJ°ÇRuºIãÈ úé—Ê §¡Ie€õTA3©–\Vƒ’>äêt£h,ñÙ‹ÝŒkI¯Ü8k:³+¹ä4äºq®ä’”tñ½HÓ4+ÀS%—6¹ÆX}=r\h£—Süh[x¤„ÎÓMªBžn ¦¨yÐ¥ª‘²Û0 µÖñ1]›Û¬iUpK‚v+\\oì.‹bóâvûAáûÉP×âýƒìV{l q_9 ‡ååbùêvØÒ¨‹Ê؇;¬ö–s›&p ~na·[§”£¼¦¢KŒEkÊÑêna=Jù™ŠISÜÒ ßYÌeŽá¯kñ‰I'°4Ï~¦RÏÜjššãZ榑õ=™9 ¡n?ËÔ¤û£–wŒm¥– žÂ’ײ ²DuKNä»ëº¢Tâ-nJ3‹›Ò†ÅMf ³îÖi-}W5xð²l^Þlq‡nMëÆçU§s:·4hs¥ï,Âqt«;[ÞWˆúý¶”[–}˜­'ÈeÙH5_‡¸.ËB,íjK­åöÏüAmøàÖ[ŽÆÓDšÄßg™L£ÁÑ8À Ø-ZãâìHÓ?XZx(º±¸EãŒöo]ÆÃwÍâTÝîœgµÐ@L mÔnö`Ê-Û }£¥¡eb25ǘ$*™om©>NõÙvr4 VÃ5Yâ¬Y+¶ùìsU? ì ^PìÇ÷Ô²¿„8'¢9íÝõÑøjå´WŒ±#Mˆ[Œ“IóÈÜRF,·ÊÍ¢ÑPŒ›J¶²æÕ‡öÔ2?·Ìdû«´u¢éZuUðÝniÈ®W·ÑoK­¥ê™KËÚtŸq—ôq gÙý„‹#}Lz^æIë¬ÞŽ˜ÍZ¥k·Òª¢µÇ"VÄ®ƒ%ëìˆëcN´û`¯Ý{Äî(gˬ±õdÙ©Ÿm1¾”¦¨µŸ7–Û醿qD®cÛðDåé•âmÇòE­·™QÜo÷«5\[E³žì|ðãâ6Ç÷c‘\ÝÆl-XœÖrM œï³-%ˆ–ioh´­Ío×kѰ¬¹Ž{i+Ž9Æ[m-°Ûd­Ä÷Î.–ï¡{{Ý X¶ïµ£^d”`µØjSàÚßJ3Ú'ûìÞßÃýdd4‰7ͽ,Ò2Ë'-­Eì¥ÞîW=-,¸2ê±VšÉåB6ÿÕјjÅ™ˆÞýØgÚÖkJ<<âñ°•x›Yp…=>ò¢D5G‚¦_GÃ1öI齈[êãØUÄ­j»Tm«»ÈÖø [º–G†\j- íØaµ¦6NªUÑ1Iû—Ûæ¡ÖÖ«Çö.óîa‰y}[#ŠÖõ X¯¥k¬F¾ñ|ÍÆS1¯ˆ껫mK©µGa1=Ç,¹uÛZ¶£¹5Åø®e5m«·üÜdëže[§‹i4²þƒI*£ãÃØ¨Ðj‘Ö»+Ê™üQÏFmÒ¿™q”ËÙ‡M\énÆIÏËTšÑ¬µc¥™rö‰™=­˜P×"ÞHÛEÔRøÕf1¡™6‚ßRÒÛ¢dL²åö¨^Ç  ;žZ¼T±íÔÖhÚŠÖn;6·å5-i5§ó ˜Urp±L‚Q]6°§‡ìˆîÿNcþÉó—advðqA«‘0\ˆbú(C1ÒéÏtŽ•B\ÃarzIœŽO±ãV•»"ÔyÓ[Ø]ÄÚ¶?·mYÕF)7¶iqVOñ¨ˆÜ-[0kcEnkVá希ös>ÖQ×zèš0¹U1¿ÒÜé~Ùõ/M½žÇx~ޏÚœ¶=vmÍ[L¾F,¿ÎÖw,ºÅ<Ð’£Ëîƒô|ÊòŸB[ëš÷ú6[_ÁsˆYqse«eØýº¥uÑódG*£²´òÝ?ßË¿Nô×5ò6‹K† )ÐhIAqI £%ÃÌqnO¥Û[îT»fY ¾bf­+XQãñ¹}樱Eæ(¯×´þ½°pÝYîÊ"sZÛ¬ôT{B.¯·Ñtû*ü•îJ³ÖÅ÷¡œ«ÒUîu›þúW'TºB.³Ê0ëþÊú ¯Ú ´Æ:w•«Â4½ž ·/®€›³P°Î5šþªƒ´Ðtù*´ ÔòTz\;X€fÔéûB [ÞhNðøü!Ô¤<à 4šckËǘeõu~_Èœ ¸‚A·Y\`S<äè£Ì\•æ8my} ÚëÔº|Eæd€ÿ!°y¿Þ1…,ÁS<Ð_2Oôêü—.b nŠ%¸)QÁMvy‘íóG[3Å]]ïuZ¥›v†9ª.àñ²ªZ•9Ý¢*³¸¨øèHf$¯pŠMޤÞgz‚¦ ©öCîv+ÝúãI‡&áVâ-š0~â¤iÓ'.7z”Ç2ò™g¸êªZsƒêµZ+ÝUŸ'ä™å6}îs–Í7!vû›Á¨œ ̆OEôø*Ü܈JwÐSí3=`»äèÁf+h–»+üµ°6X(ézüoe¿ Yë†ÌÍ\£Y¯í+1¹"s Œ&Tƒ†é–ØÆiQ99à¯rƒ(£[ÄÕT\ >ÓW_ëøë!ÎÊJÖ4q\,¸ô£iÞúJ7Äfº/Á®5»—¯š›çõT»Bõm LÊåV¥ogÃÒ²Ö×ÁŒBì1'ƒ½pÎ(÷‡jÀdê÷ÙIu~o£u56àvÏ,2§Ö¹+<ºMÚ•,é@‹!×L ýðÕ—¥–Òùõ.¯Çò1}éu‡À*­ Bê(^é Öy]t¤K@Ìuõ(c+P¤æê–;»Bf›j¯ @ú^˜ž JÖ´-’¦ödÜßã é0£íÆV™&M‚5-hSdëØfÁþ¯ä lFóî÷Ï„xJ<þJOdÍB«@<òú«ƒE5¡PÝðAƒŠª‚E•ڈcñAh‡¿:ફidÙ Ô=¨æBXÈÔrS5 ³Ê6+\0ÈÔå2ë<î V},PhРÄ®4«ý0<Ÿ§XV<4]ÕJ­ÛgÙ 9J-BÃ×]ëj4!zèܬ†ÕùLWƒ«±E½•:r(!¯ß¥+ƒ9øµ2‚Z’ˆo&.¯™þzÅïþ«d-,Ì”»*fÖ×Áêl»‰g»¨CJ‡”Q1¿˜`±l–hó䯢¡uõøvΪ€¿¶í0 ³vÚcª‰”² ±‚XF•îË5mxBnÝôFþÉ-"Ya«Ø_ þæ×æ‘CKúS|ìQ…C‡ 5‡–”0ǧÀ¶ª`]šÁ)ÓmÙi=ÄÉÏ èVÕêÂ1ÁÁ‰´¢tÛ!õ€éGŒq£«ðº!HÚBph› ÓSź ¸Ï¯÷h}™õÁ¿Ös!*‹®ÑÚ¸½º…Zøuà›Íˆ6ºLÝOA?…`Ýíª‘¯pë †^Äô_ƒ¶þO¾p™³G*u«ír=ÑM´¹X“uLBE fÎÃÐæCÞDò¦ò°ÓÇ?}¨Ò¸Õøñ¬±‡þœëƒ‰‰?%~$JüH”ø‘(ñ#QâG¢ÄD‰‰?%~$JüH”ø‘(ñ#QâG¢ÄD‰‰¾Õ¿âŸÂÄp«þ¶ò¶4+§µÿ|†ŸÐ€¦—}"îZå¨bu²«F–4«AËæ@T&Îb´ø«ËÅñØ`Jéše…¦Ð6N¤ÆÓñ‘¥I%t„z—z9¤±IÅ”|¼ÂP )›J“î£!òËÂ8^¥!ÈËOþ59“î¥â¤“h°z“ø?ç8~NÔ*UÛ©èå8^¤®íôª>wºý?9ÛnSDSTmø#cM†î§oj[ bØÇXu¥Èi4Pl ¯Âuð‚ä r"=MMeêUê¯.¢I:£’N’‹©H½Aê*ÊIzz«>Ô÷e Ž¾ I'¶Ÿˆ¿ŒÄq Ž<ù8Òp˜8Æà8G)Ž¡ Iý[tóoùÂ(bæY?ô«gZKÔèjIá=úܬžytF[÷!^7â8 Ç}8NÃÑ€c†,¡B}@.A%çåpË袨ÌÞimÈñÿm“×qéV=â…8 #x;íÖœØ[bKl‰-±%¶Ä–ØÛÇæ˜C#H׉ëÈAíÅ_²Îr0] ; %•C:ÃP›ÉøU)QçÈÝú…n*%3¼Ï±~ÿ ¹¬]•t›$îàÔmýÝ“Œÿ»» öendstream endobj 372 0 obj 65695 endobj 373 0 obj 129972 endobj 282 0 obj <> endobj 285 0 obj <> endobj 281 0 obj <> endobj 266 0 obj <> endobj 224 0 obj <> endobj 206 0 obj <> endobj 193 0 obj <> endobj 192 0 obj <> endobj 187 0 obj <> >> endobj 186 0 obj <> >> endobj 180 0 obj <> >> endobj 179 0 obj <> >> endobj 178 0 obj <> >> endobj 177 0 obj <> >> endobj 176 0 obj <> >> endobj 169 0 obj <> >> endobj 159 0 obj <> >> endobj 149 0 obj <> endobj 148 0 obj <> endobj 147 0 obj <> endobj 146 0 obj <> endobj 145 0 obj <> endobj 144 0 obj <> endobj 143 0 obj <> endobj 142 0 obj <> endobj 141 0 obj <> endobj 140 0 obj <> endobj 139 0 obj <> endobj 138 0 obj <> endobj 137 0 obj <> endobj 136 0 obj <> endobj 135 0 obj <> endobj 134 0 obj <> endobj 133 0 obj <> endobj 132 0 obj <> endobj 131 0 obj <> endobj 130 0 obj <> endobj 129 0 obj <> endobj 128 0 obj <> endobj 127 0 obj <> endobj 126 0 obj <> endobj 125 0 obj <> endobj 124 0 obj <> endobj 123 0 obj <> endobj 122 0 obj <> endobj 117 0 obj <> endobj 116 0 obj <> endobj 111 0 obj <> endobj 110 0 obj <> endobj 109 0 obj <> endobj 108 0 obj <> endobj 107 0 obj <> endobj 106 0 obj <> endobj 105 0 obj <> endobj 104 0 obj <> endobj 103 0 obj <> endobj 102 0 obj <> endobj 101 0 obj <> endobj 100 0 obj <> endobj 99 0 obj <> endobj 98 0 obj <> endobj 97 0 obj <> endobj 96 0 obj <> endobj 95 0 obj <> endobj 94 0 obj <> endobj 93 0 obj <> endobj 92 0 obj <> endobj 91 0 obj <> endobj 90 0 obj <> endobj 89 0 obj <> endobj 88 0 obj <> endobj 87 0 obj <> endobj 86 0 obj <> endobj 85 0 obj <> endobj 84 0 obj <> endobj 83 0 obj <> endobj 82 0 obj <> endobj 81 0 obj <> endobj 80 0 obj <> endobj 79 0 obj <> endobj 78 0 obj <> endobj 77 0 obj <> endobj 76 0 obj <> endobj 75 0 obj <> endobj 74 0 obj <> endobj 73 0 obj <> endobj 72 0 obj <> endobj 71 0 obj <> endobj 70 0 obj <> endobj 69 0 obj <> endobj 68 0 obj <> endobj 67 0 obj <> endobj 1 0 obj <> ] >> /PageMode /UseOutlines /OpenAction [52 0 R /XYZ 0 792 0] /Outlines 4 0 R /Names 374 0 R >> endobj 2 0 obj <> endobj 376 0 obj <> endobj 377 0 obj <> endobj 378 0 obj <> endobj 379 0 obj <> endobj 52 0 obj <> endobj 55 0 obj <> /XObject <> >> endobj 380 0 obj <> stream xÚ+ä2P0PÈå2µ4Ñ372s`LsK# ÇJgp…+äqÕ- ,endstream endobj 381 0 obj 40 endobj 58 0 obj <> endobj 61 0 obj <> >> endobj 382 0 obj <> stream xÚ+ä2P0PÈå2µ4Ñ372s`LsK# ÇJgp…+äqÕ- ,endstream endobj 383 0 obj 40 endobj 63 0 obj <> endobj 66 0 obj <> >> endobj 384 0 obj <> stream xÚ+ä2P0PÈå2µ4Ñ372s`LsK# ÇJgp…+äqÕ- ,endstream endobj 385 0 obj 40 endobj 112 0 obj <> endobj 115 0 obj <> >> endobj 386 0 obj <> stream xÚ+ä2P0PÈå2µ4Ñ372s`LsK# ÇJgp…+äqÕ- ,endstream endobj 387 0 obj 40 endobj 118 0 obj <> endobj 121 0 obj <> >> endobj 388 0 obj <> stream xÚ+ä2P0PÈå2µ4Ñ372s`LsK# ÇJgp…+äqÕ- ,endstream endobj 389 0 obj 40 endobj 150 0 obj <> endobj 153 0 obj <> >> endobj 390 0 obj <> stream xÚ+ä2P0PÈå2µ4Ñ372s`LsK# ÇJgp…+äqÕ- ,endstream endobj 391 0 obj 40 endobj 154 0 obj <> endobj 157 0 obj <> >> endobj 392 0 obj <> stream xÚ+ä2P0PÈå2µ4Ñ372s`LsK# ÇJgp…+äqÕ- ,endstream endobj 393 0 obj 40 endobj 160 0 obj <> endobj 163 0 obj <> >> endobj 394 0 obj <> stream xÚ+ä2P0PÈå2µ4Ñ372s`LsK# ÇJgp…+äqÕ- ,endstream endobj 395 0 obj 40 endobj 170 0 obj <> endobj 173 0 obj <> /XObject <> >> endobj 396 0 obj <> stream xÚ+ä2P0PÈå2µ4Ñ372s`LsK# ÇJgp…+äqÕ- ,endstream endobj 397 0 obj 40 endobj 181 0 obj <> endobj 184 0 obj <> /XObject <> >> endobj 398 0 obj <> stream xÚ+ä2P0PÈå2µ4Ñ372s`LsK# ÇJgp…+äqÕ- ,endstream endobj 399 0 obj 40 endobj 188 0 obj <> endobj 191 0 obj <> >> endobj 400 0 obj <> stream xÚ+ä2P0PÈå2µ4Ñ372s`LsK# ÇJgp…+äqÕ- ,endstream endobj 401 0 obj 40 endobj 194 0 obj <> endobj 197 0 obj <> >> endobj 402 0 obj <> stream xÚ+ä2P0PÈå2µ4Ñ372s`LsK# ÇJgp…+äqÕ- ,endstream endobj 403 0 obj 40 endobj 198 0 obj <> endobj 201 0 obj <> >> endobj 404 0 obj <> stream xÚ+ä2P0PÈå2µ4Ñ372s`LsK# ÇJgp…+äqÕ- ,endstream endobj 405 0 obj 40 endobj 202 0 obj <> endobj 205 0 obj <> >> endobj 406 0 obj <> stream xÚ+ä2P0PÈå2µ4Ñ372s`LsK# ÇJgp…+äqÕ- ,endstream endobj 407 0 obj 40 endobj 207 0 obj <> endobj 210 0 obj <> >> endobj 408 0 obj <> stream xÚ+ä2P0PÈå2µ4Ñ372s`LsK# ÇJgp…+äqÕ- ,endstream endobj 409 0 obj 40 endobj 211 0 obj <> endobj 214 0 obj <> >> endobj 410 0 obj <> stream xÚ+ä2P0PÈå2µ4Ñ372s`LsK# ÇJgp…+äqÕ- ,endstream endobj 411 0 obj 40 endobj 215 0 obj <> endobj 218 0 obj <> >> endobj 412 0 obj <> stream xÚ+ä2P0PÈå2µ4Ñ372s`LsK# ÇJgp…+äqÕ- ,endstream endobj 413 0 obj 40 endobj 220 0 obj <> endobj 223 0 obj <> >> endobj 414 0 obj <> stream xÚ+ä2P0PÈå2µ4Ñ372s`LsK# ÇJgp…+äqÕ- ,endstream endobj 415 0 obj 40 endobj 225 0 obj <> endobj 228 0 obj <> >> endobj 416 0 obj <> stream xÚ+ä2P0PÈå2µ4Ñ372s`LsK# ÇJgp…+äqÕ- ,endstream endobj 417 0 obj 40 endobj 229 0 obj <> endobj 232 0 obj <> >> endobj 418 0 obj <> stream xÚ+ä2P0PÈå2µ4Ñ372s`LsK# ÇJgp…+äqÕ- ,endstream endobj 419 0 obj 40 endobj 233 0 obj <> endobj 236 0 obj <> >> endobj 420 0 obj <> stream xÚ+ä2P0PÈå2µ4Ñ372s`LsK# ÇJgp…+äqÕ- ,endstream endobj 421 0 obj 40 endobj 237 0 obj <> endobj 240 0 obj <> >> endobj 422 0 obj <> stream xÚ+ä2P0PÈå2µ4Ñ372s`LsK# ÇJgp…+äqÕ- ,endstream endobj 423 0 obj 40 endobj 241 0 obj <> endobj 244 0 obj <> >> endobj 424 0 obj <> stream xÚ+ä2P0PÈå2µ4Ñ372s`LsK# ÇJgp…+äqÕ- ,endstream endobj 425 0 obj 40 endobj 245 0 obj <> endobj 248 0 obj <> >> endobj 426 0 obj <> stream xÚ+ä2P0PÈå2µ4Ñ372s`LsK# ÇJgp…+äqÕ- ,endstream endobj 427 0 obj 40 endobj 249 0 obj <> endobj 252 0 obj <> >> endobj 428 0 obj <> stream xÚ+ä2P0PÈå2µ4Ñ372s`LsK# ÇJgp…+äqÕ- ,endstream endobj 429 0 obj 40 endobj 253 0 obj <> endobj 256 0 obj <> /XObject <> >> endobj 430 0 obj <> stream xÚ+ä2P0PÈå2µ4Ñ372s`LsK# ÇJgp…+äqÕ- ,endstream endobj 431 0 obj 40 endobj 258 0 obj <> endobj 261 0 obj <> >> endobj 432 0 obj <> stream xÚ+ä2P0PÈå2µ4Ñ372s`LsK# ÇJgp…+äqÕ- ,endstream endobj 433 0 obj 40 endobj 262 0 obj <> endobj 265 0 obj <> >> endobj 434 0 obj <> stream xÚ+ä2P0PÈå2µ4Ñ372s`LsK# ÇJgp…+äqÕ- ,endstream endobj 435 0 obj 40 endobj 267 0 obj <> endobj 270 0 obj <> >> endobj 436 0 obj <> stream xÚ+ä2P0PÈå2µ4Ñ372s`LsK# ÇJgp…+äqÕ- ,endstream endobj 437 0 obj 40 endobj 271 0 obj <> endobj 274 0 obj <> >> endobj 438 0 obj <> stream xÚ+ä2P0PÈå2µ4Ñ372s`LsK# ÇJgp…+äqÕ- ,endstream endobj 439 0 obj 40 endobj 275 0 obj <> endobj 278 0 obj <> >> endobj 440 0 obj <> stream xÚ+ä2P0PÈå2µ4Ñ372s`LsK# ÇJgp…+äqÕ- ,endstream endobj 441 0 obj 40 endobj 4 0 obj <> endobj 31 0 obj <> endobj 32 0 obj <> endobj 34 0 obj <> endobj 35 0 obj <> endobj 33 0 obj <> endobj 36 0 obj <> endobj 44 0 obj <> endobj 43 0 obj <> endobj 42 0 obj <> endobj 41 0 obj <> endobj 39 0 obj <> endobj 40 0 obj <> endobj 37 0 obj <> endobj 38 0 obj <> endobj 22 0 obj <> endobj 30 0 obj <> endobj 29 0 obj <> endobj 28 0 obj <> endobj 27 0 obj <> endobj 26 0 obj <> endobj 25 0 obj <> endobj 24 0 obj <> endobj 23 0 obj <> endobj 19 0 obj <> endobj 21 0 obj <> endobj 20 0 obj <> endobj 50 0 obj <> endobj 51 0 obj <> endobj 16 0 obj <> endobj 18 0 obj <> endobj 17 0 obj <> endobj 47 0 obj <> endobj 49 0 obj <> endobj 48 0 obj <> endobj 45 0 obj <> endobj 46 0 obj <> endobj 12 0 obj <> endobj 15 0 obj <> endobj 14 0 obj <> endobj 13 0 obj <> endobj 7 0 obj <> endobj 11 0 obj <> endobj 10 0 obj <> endobj 9 0 obj <> endobj 8 0 obj <> endobj 6 0 obj <> endobj 5 0 obj <> endobj 374 0 obj <> endobj 375 0 obj <> endobj 504 0 obj <> endobj 505 0 obj <> endobj 506 0 obj <> endobj 507 0 obj <> endobj 469 0 obj <> endobj 478 0 obj <> endobj 443 0 obj <> endobj 479 0 obj <> endobj 464 0 obj <> endobj 482 0 obj <> endobj 449 0 obj <> endobj 497 0 obj <> endobj 490 0 obj <> endobj 446 0 obj <> endobj 493 0 obj <> endobj 471 0 obj <> endobj 465 0 obj <> endobj 448 0 obj <> endobj 445 0 obj <> endobj 496 0 obj <> endobj 492 0 obj <> endobj 447 0 obj <> endobj 476 0 obj <> endobj 475 0 obj <> endobj 452 0 obj <> endobj 457 0 obj <> endobj 466 0 obj <> endobj 501 0 obj <> endobj 451 0 obj <> endobj 502 0 obj <> endobj 442 0 obj <> endobj 484 0 obj <> endobj 458 0 obj <> endobj 444 0 obj <> endobj 494 0 obj <> endobj 477 0 obj <> endobj 459 0 obj <> endobj 481 0 obj <> endobj 489 0 obj <> endobj 460 0 obj <> endobj 499 0 obj <> endobj 454 0 obj <> endobj 473 0 obj <> endobj 472 0 obj <> endobj 461 0 obj <> endobj 500 0 obj <> endobj 498 0 obj <> endobj 480 0 obj <> endobj 468 0 obj <> endobj 462 0 obj <> endobj 491 0 obj <> endobj 450 0 obj <> endobj 456 0 obj <> endobj 495 0 obj <> endobj 474 0 obj <> endobj 487 0 obj <> endobj 463 0 obj <> endobj 455 0 obj <> endobj 503 0 obj <> endobj 470 0 obj <> endobj 485 0 obj <> endobj 467 0 obj <> endobj 483 0 obj <> endobj 488 0 obj <> endobj 486 0 obj <> endobj 453 0 obj <> endobj xref 0 508 0000000000 65535 f 0000450420 00000 n 0000450596 00000 n 0000118100 00000 n 0000465707 00000 n 0000470993 00000 n 0000470889 00000 n 0000470361 00000 n 0000470802 00000 n 0000470699 00000 n 0000470592 00000 n 0000470492 00000 n 0000469944 00000 n 0000470270 00000 n 0000470164 00000 n 0000470074 00000 n 0000469027 00000 n 0000469264 00000 n 0000469169 00000 n 0000468389 00000 n 0000468686 00000 n 0000468546 00000 n 0000467361 00000 n 0000468279 00000 n 0000468145 00000 n 0000468034 00000 n 0000467928 00000 n 0000467825 00000 n 0000467716 00000 n 0000467599 00000 n 0000467512 00000 n 0000465763 00000 n 0000465907 00000 n 0000466272 00000 n 0000466042 00000 n 0000466184 00000 n 0000466362 00000 n 0000467132 00000 n 0000467271 00000 n 0000466909 00000 n 0000467045 00000 n 0000466804 00000 n 0000466694 00000 n 0000466569 00000 n 0000466452 00000 n 0000469714 00000 n 0000469858 00000 n 0000469363 00000 n 0000469621 00000 n 0000469522 00000 n 0000468799 00000 n 0000468912 00000 n 0000451191 00000 n 0000000015 00000 n 0000000688 00000 n 0000451391 00000 n 0000220603 00000 n 0000118320 00000 n 0000451625 00000 n 0000000708 00000 n 0000001784 00000 n 0000451825 00000 n 0000373553 00000 n 0000452026 00000 n 0000001805 00000 n 0000017185 00000 n 0000452564 00000 n 0000450329 00000 n 0000450238 00000 n 0000450147 00000 n 0000450056 00000 n 0000449964 00000 n 0000449872 00000 n 0000449780 00000 n 0000449688 00000 n 0000449596 00000 n 0000449504 00000 n 0000449412 00000 n 0000449320 00000 n 0000449228 00000 n 0000449136 00000 n 0000449044 00000 n 0000448952 00000 n 0000448860 00000 n 0000448768 00000 n 0000448676 00000 n 0000448584 00000 n 0000448492 00000 n 0000448400 00000 n 0000448308 00000 n 0000448216 00000 n 0000448124 00000 n 0000448032 00000 n 0000447939 00000 n 0000447845 00000 n 0000447751 00000 n 0000447657 00000 n 0000447564 00000 n 0000447470 00000 n 0000447377 00000 n 0000447282 00000 n 0000447188 00000 n 0000447094 00000 n 0000447000 00000 n 0000446906 00000 n 0000446811 00000 n 0000446719 00000 n 0000446627 00000 n 0000446535 00000 n 0000446443 00000 n 0000446351 00000 n 0000446259 00000 n 0000452776 00000 n 0000017207 00000 n 0000017952 00000 n 0000453006 00000 n 0000446159 00000 n 0000446056 00000 n 0000453219 00000 n 0000017973 00000 n 0000023030 00000 n 0000453657 00000 n 0000445960 00000 n 0000445861 00000 n 0000445769 00000 n 0000445674 00000 n 0000445582 00000 n 0000445487 00000 n 0000445395 00000 n 0000445300 00000 n 0000445196 00000 n 0000445089 00000 n 0000444997 00000 n 0000444902 00000 n 0000444799 00000 n 0000444693 00000 n 0000444600 00000 n 0000444504 00000 n 0000444411 00000 n 0000444315 00000 n 0000444224 00000 n 0000444128 00000 n 0000444037 00000 n 0000443941 00000 n 0000443844 00000 n 0000443742 00000 n 0000443651 00000 n 0000443555 00000 n 0000443454 00000 n 0000443348 00000 n 0000453870 00000 n 0000023052 00000 n 0000023238 00000 n 0000454073 00000 n 0000454275 00000 n 0000023259 00000 n 0000025063 00000 n 0000454497 00000 n 0000327479 00000 n 0000443214 00000 n 0000454722 00000 n 0000025085 00000 n 0000029949 00000 n 0000454944 00000 n 0000126730 00000 n 0000270727 00000 n 0000285019 00000 n 0000171239 00000 n 0000189157 00000 n 0000443090 00000 n 0000455217 00000 n 0000029971 00000 n 0000034418 00000 n 0000455471 00000 n 0000119337 00000 n 0000251159 00000 n 0000442969 00000 n 0000442831 00000 n 0000442684 00000 n 0000442495 00000 n 0000442328 00000 n 0000455754 00000 n 0000034440 00000 n 0000039795 00000 n 0000455984 00000 n 0000149536 00000 n 0000442194 00000 n 0000442060 00000 n 0000456279 00000 n 0000039817 00000 n 0000046164 00000 n 0000456509 00000 n 0000441962 00000 n 0000441864 00000 n 0000456746 00000 n 0000046186 00000 n 0000050466 00000 n 0000456949 00000 n 0000457163 00000 n 0000050488 00000 n 0000055350 00000 n 0000457366 00000 n 0000457615 00000 n 0000055372 00000 n 0000058120 00000 n 0000457837 00000 n 0000441759 00000 n 0000458062 00000 n 0000058142 00000 n 0000064357 00000 n 0000458265 00000 n 0000458526 00000 n 0000064379 00000 n 0000069226 00000 n 0000458729 00000 n 0000458966 00000 n 0000069248 00000 n 0000074225 00000 n 0000459169 00000 n 0000238656 00000 n 0000459431 00000 n 0000074247 00000 n 0000075571 00000 n 0000459653 00000 n 0000441659 00000 n 0000459866 00000 n 0000075593 00000 n 0000077126 00000 n 0000460069 00000 n 0000460295 00000 n 0000077148 00000 n 0000078055 00000 n 0000460498 00000 n 0000460737 00000 n 0000078076 00000 n 0000079663 00000 n 0000460940 00000 n 0000461179 00000 n 0000079685 00000 n 0000080686 00000 n 0000461382 00000 n 0000461621 00000 n 0000080707 00000 n 0000082300 00000 n 0000461824 00000 n 0000462063 00000 n 0000082322 00000 n 0000083429 00000 n 0000462266 00000 n 0000462505 00000 n 0000083451 00000 n 0000085083 00000 n 0000462708 00000 n 0000462947 00000 n 0000085105 00000 n 0000088269 00000 n 0000463150 00000 n 0000120534 00000 n 0000463446 00000 n 0000088291 00000 n 0000094978 00000 n 0000463649 00000 n 0000463898 00000 n 0000095000 00000 n 0000101482 00000 n 0000464120 00000 n 0000441555 00000 n 0000464369 00000 n 0000101504 00000 n 0000108173 00000 n 0000464572 00000 n 0000464811 00000 n 0000108195 00000 n 0000114694 00000 n 0000465014 00000 n 0000465253 00000 n 0000114716 00000 n 0000118078 00000 n 0000465456 00000 n 0000119236 00000 n 0000119257 00000 n 0000441506 00000 n 0000441414 00000 n 0000120420 00000 n 0000120441 00000 n 0000441460 00000 n 0000126708 00000 n 0000127251 00000 n 0000127739 00000 n 0000148878 00000 n 0000127954 00000 n 0000148790 00000 n 0000148813 00000 n 0000148834 00000 n 0000148857 00000 n 0000149515 00000 n 0000149709 00000 n 0000149771 00000 n 0000170910 00000 n 0000149986 00000 n 0000170822 00000 n 0000170845 00000 n 0000170866 00000 n 0000170889 00000 n 0000171218 00000 n 0000171601 00000 n 0000171750 00000 n 0000188733 00000 n 0000171976 00000 n 0000188645 00000 n 0000188668 00000 n 0000188689 00000 n 0000188712 00000 n 0000189136 00000 n 0000189562 00000 n 0000189778 00000 n 0000220139 00000 n 0000190003 00000 n 0000220051 00000 n 0000220074 00000 n 0000220095 00000 n 0000220118 00000 n 0000220582 00000 n 0000221304 00000 n 0000220743 00000 n 0000221283 00000 n 0000221980 00000 n 0000222229 00000 n 0000238610 00000 n 0000238633 00000 n 0000239184 00000 n 0000238804 00000 n 0000239163 00000 n 0000239501 00000 n 0000239759 00000 n 0000251113 00000 n 0000251136 00000 n 0000251859 00000 n 0000251300 00000 n 0000251838 00000 n 0000252523 00000 n 0000252774 00000 n 0000270681 00000 n 0000270704 00000 n 0000271087 00000 n 0000271222 00000 n 0000284623 00000 n 0000271452 00000 n 0000284534 00000 n 0000284557 00000 n 0000284579 00000 n 0000284602 00000 n 0000284998 00000 n 0000285665 00000 n 0000285173 00000 n 0000285644 00000 n 0000286200 00000 n 0000286469 00000 n 0000327433 00000 n 0000327456 00000 n 0000328147 00000 n 0000327635 00000 n 0000328126 00000 n 0000328752 00000 n 0000329021 00000 n 0000373507 00000 n 0000373530 00000 n 0000374391 00000 n 0000373707 00000 n 0000374370 00000 n 0000375315 00000 n 0000375579 00000 n 0000441367 00000 n 0000441390 00000 n 0000471103 00000 n 0000471140 00000 n 0000450679 00000 n 0000450823 00000 n 0000450970 00000 n 0000451117 00000 n 0000451489 00000 n 0000451605 00000 n 0000451890 00000 n 0000452006 00000 n 0000452640 00000 n 0000452756 00000 n 0000453083 00000 n 0000453199 00000 n 0000453734 00000 n 0000453850 00000 n 0000454139 00000 n 0000454255 00000 n 0000454586 00000 n 0000454702 00000 n 0000455081 00000 n 0000455197 00000 n 0000455618 00000 n 0000455734 00000 n 0000456143 00000 n 0000456259 00000 n 0000456610 00000 n 0000456726 00000 n 0000457027 00000 n 0000457143 00000 n 0000457479 00000 n 0000457595 00000 n 0000457926 00000 n 0000458042 00000 n 0000458390 00000 n 0000458506 00000 n 0000458830 00000 n 0000458946 00000 n 0000459295 00000 n 0000459411 00000 n 0000459730 00000 n 0000459846 00000 n 0000460159 00000 n 0000460275 00000 n 0000460601 00000 n 0000460717 00000 n 0000461043 00000 n 0000461159 00000 n 0000461485 00000 n 0000461601 00000 n 0000461927 00000 n 0000462043 00000 n 0000462369 00000 n 0000462485 00000 n 0000462811 00000 n 0000462927 00000 n 0000463310 00000 n 0000463426 00000 n 0000463762 00000 n 0000463878 00000 n 0000464233 00000 n 0000464349 00000 n 0000464675 00000 n 0000464791 00000 n 0000465117 00000 n 0000465233 00000 n 0000465571 00000 n 0000465687 00000 n 0000473914 00000 n 0000472696 00000 n 0000474068 00000 n 0000473308 00000 n 0000473050 00000 n 0000473458 00000 n 0000473258 00000 n 0000472898 00000 n 0000474982 00000 n 0000473814 00000 n 0000473608 00000 n 0000475694 00000 n 0000474472 00000 n 0000475286 00000 n 0000475032 00000 n 0000473660 00000 n 0000474018 00000 n 0000474222 00000 n 0000474374 00000 n 0000474624 00000 n 0000474878 00000 n 0000475236 00000 n 0000472798 00000 n 0000473206 00000 n 0000473710 00000 n 0000475488 00000 n 0000474828 00000 n 0000472593 00000 n 0000475388 00000 n 0000473154 00000 n 0000474574 00000 n 0000474522 00000 n 0000475134 00000 n 0000473558 00000 n 0000473508 00000 n 0000474170 00000 n 0000472645 00000 n 0000472748 00000 n 0000474778 00000 n 0000474272 00000 n 0000472848 00000 n 0000475540 00000 n 0000473966 00000 n 0000475438 00000 n 0000475642 00000 n 0000475186 00000 n 0000475592 00000 n 0000474322 00000 n 0000472998 00000 n 0000474930 00000 n 0000473408 00000 n 0000473102 00000 n 0000474118 00000 n 0000475084 00000 n 0000473358 00000 n 0000472946 00000 n 0000474728 00000 n 0000474424 00000 n 0000474676 00000 n 0000473762 00000 n 0000473864 00000 n 0000475336 00000 n 0000471203 00000 n 0000471571 00000 n 0000471911 00000 n 0000472242 00000 n trailer <] >> startxref 475745 %%EOF openhpi-2.14.1/plugins/ilo2_ribcl/Makefile.am0000644000076400007640000000467511302566624015747 0ustar # # Copyright (C) 2007-2008, Hewlett-Packard Development Company, LLP # All rights reserved. # # 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. # # Neither the name of the Hewlett-Packard Corporation, nor the names # of its contributors may be used to endorse or promote products # derived from this software without specific prior written permission. # # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS # "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT # LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS # FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT # OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, # SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED # TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, # OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY # OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING # NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS # SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. # # Author(s) # Shuah Khan # Richard White # MAINTAINERCLEANFILES = Makefile.in INCLUDES = @OPENHPI_INCLUDES@ @XML2_INCLUDE@ @OH_SSL_INCLUDES@ pkglib_LTLIBRARIES = libilo2_ribcl.la EXTRA_DIST = \ OpenHPI_ProLiant_DevGuide.pdf libilo2_ribcl_la_SOURCES = \ ilo2_ribcl.c \ ilo2_ribcl.h \ ilo2_ribcl_discover.c \ ilo2_ribcl_discover.h \ ilo2_ribcl_idr.c \ ilo2_ribcl_idr.h \ ilo2_ribcl_reset.c \ ilo2_ribcl_power.c \ ilo2_ribcl_control.c \ ilo2_ribcl_rpt.c \ ilo2_ribcl_sensor.c \ ilo2_ribcl_sensor.h \ ilo2_ribcl_ssl.c \ ilo2_ribcl_ssl.h \ ilo2_ribcl_xml.c \ ilo2_ribcl_xml.h \ ilo2_ribcl_cmnds.h libilo2_ribcl_la_LIBADD = @SSL_LIB@ @XML2_LIB@ -luuid $(top_builddir)/utils/libopenhpiutils.la libilo2_ribcl_la_LDFLAGS = -module -version-info @HPI_LIB_VERSION@ openhpi-2.14.1/plugins/ilo2_ribcl/ilo2_ribcl_xml.h0000644000076400007640000000516011302566624016752 0ustar /* * Copyright (C) 2007-2008, Hewlett-Packard Development Company, LLP * All rights reserved. * * 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. * * Neither the name of the Hewlett-Packard Corporation, nor the names * of its contributors may be used to endorse or promote products * derived from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * Author(s) * Shuah Khan * Richard White */ #ifndef _INC_ILO2_RIBCL_XML_H_ #define _INC_ILO2_RIBCL_XML_H_ #include "ilo2_ribcl.h" #define RIBCL_SUCCESS 0 #define RIBCL_UNSUPPORTED 1 /* Unsupported RIBCL command */ extern int ir_xml_parse_status( char *, char *); extern int ir_xml_parse_emhealth( ilo2_ribcl_handler_t *, char *); extern int ir_xml_parse_hostdata( ilo2_ribcl_handler_t *, char *); extern int ir_xml_parse_host_power_status(char *, int *, char *); extern int ir_xml_parse_reset_server(char *, char *); extern int ir_xml_parse_set_host_power(char *, char *); extern int ir_xml_parse_uid_status(char *, int *, char *); extern int ir_xml_parse_power_saver_status(char *, int *, char *); extern int ir_xml_parse_auto_power_status(char *, int *, char *); extern int ir_xml_parse_discoveryinfo( ilo2_ribcl_handler_t *, char *); extern void ir_xml_free_cmdbufs( ilo2_ribcl_handler_t *); extern int ir_xml_build_cmdbufs( ilo2_ribcl_handler_t *); #endif /* _INC_ILO2_RIBCL_XML_H_ */ openhpi-2.14.1/plugins/ilo2_ribcl/ilo2_ribcl_sensor.c0000644000076400007640000011415111302566624017457 0ustar /* * Copyright (C) 2007-2008, Hewlett-Packard Development Company, LLP * All rights reserved. * * 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. * * Neither the name of the Hewlett-Packard Corporation, nor the names * of its contributors may be used to endorse or promote products * derived from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * Author(s) * Shuah Khan * Richard White */ /*************** * This source file contains Sensor HPI ABI routines iLO2 RIBCL plug-in * implements. Other source files provide support functionality for * these ABIs. ***************/ #include #include /************************************ Forward declarations for static functions in this file ************************************/ static SaErrorT ilo2_ribcl_get_sensor_allinfo( struct oh_handler_state *, SaHpiResourceIdT , SaHpiSensorNumT , struct ilo2_ribcl_sens_allinfo *); static SaErrorT ilo2_ribcl_sensor_send_event( struct oh_handler_state *, struct ilo2_ribcl_sens_allinfo *, SaHpiEventTypeT, SaHpiSeverityT, SaHpiBoolT); static void ilo2_ribcl_process_severitysensor( struct oh_handler_state *, struct ilo2_ribcl_sens_allinfo *, I2R_SensorDataT *); /** * ilo2_ribcl_get_sensor_reading: * @hdn: Pointer to the handler for this instance. * @rid: Resource ID for resource containing this sensor. * @s_num: Number of this sensor in the resource. * @s_reading: Pointer used to return sensor reading. * @s_state: Pointer used to return sensor state. * * Description: * Implements the plugin specific part of the saHpiSensorReadingGet() API. * * We make a call to ilo2_ribcl_get_sensor_allinfo() to obtain the sensor RDR, * the rpt entry for the resource containing the sensor, and the struct * ilo2_ribcl_sensinfo that contains all our sensor data. * * Since the sensors that we support all return a 64bit integer reading, * this routine assumes a 64bit integer value. If we support additional * sensor types in the future, this routine may need to change. * * Since the communication latency with iLo2 is so large (or the order of 10 * seconds), we don't read the actual sensor values from iLo2 in * this routine. Instead, we peridically poll for the sensor values and store * them in the struct ilo2_ribcl_sensinfo structures that are associated with * the sensor RDRs (done in ilo2_ribcl_process_sensors()). This routine returns * those cached sensor values. Currently, the sensor values are read during a * discovery operation - either via a client's call to saHpiDiscover() or via * the daemon's periodic discovery done in oh_discovery_thread_loop(). * * Return values: * SA_OK - Normal, successful return. * SA_ERR_HPI_CAPABILITY - Resource does not support sensors. * SA_ERR_HPI_INVALID_REQUEST - Sensor is curerntly disabled. * SA_ERR_HPI_NOT_PRESENT - The requested sensor is not present. * SA_ERR_HPI_INVALID_RESOURCE - The resource does not exist. * SA_ERR_HPI_INTERNAL_ERROR - There is no private data for this sensor. **/ SaErrorT ilo2_ribcl_get_sensor_reading(void *hnd, SaHpiResourceIdT rid, SaHpiSensorNumT s_num, SaHpiSensorReadingT *s_reading, SaHpiEventStateT *s_state) { SaErrorT ret; struct oh_handler_state *oh_handler; struct ilo2_ribcl_sens_allinfo sens_allinfo; struct ilo2_ribcl_sensinfo *sensinfo; if( !hnd){ err(" ilo2_ribcl_get_sensor_reading: invalid handle."); return( SA_ERR_HPI_INVALID_PARAMS); } oh_handler = (struct oh_handler_state *)hnd; /* Look up our sensor RDR, and it's associated data */ ret = ilo2_ribcl_get_sensor_allinfo( oh_handler, rid, s_num, &sens_allinfo); if( ret != SA_OK){ return( ret); } /* If this sensor is currently disabled, return an error */ sensinfo = sens_allinfo.sens_dat; if( !sensinfo->sens_enabled){ return( SA_ERR_HPI_INVALID_REQUEST); } if( s_reading != NULL){ s_reading->IsSupported = SAHPI_TRUE; s_reading->Type = sens_allinfo.rdr->RdrTypeUnion.SensorRec.DataFormat.ReadingType; s_reading->Value.SensorInt64 = sensinfo->sens_value; } if( s_state != NULL){ *s_state = sensinfo->sens_ev_state; } return( SA_OK); } /* end ilo2_ribcl_get_sensor_reading() */ /** * ilo2_ribcl_get_sensor_enable: * @hdn: Pointer to the handler for this instance. * @rid: Resource ID for resource containing this sensor. * @s_num: Number of this sensor in the resource. * @s_enable: pointer to return sensor enable status. * * Description: * Implements the plugin specific part of the saHpiSensorEnableGet() API. * * We make a call to ilo2_ribcl_get_sensor_allinfo() to obtain the sensor RDR, * the rpt entry for the resource containing the sensor, and the struct * ilo2_ribcl_sensinfo that contains all our sensor data. * * Return values: * SA_OK - Normal, successful return. * SA_ERR_HPI_CAPABILITY - Resource does not support sensors. * SA_ERR_HPI_INVALID_PARAMS - s_enable pointer or handler is NULL. * SA_ERR_HPI_NOT_PRESENT - The requested sensor is not present. * SA_ERR_HPI_INVALID_RESOURCE - The resource does not exist. * SA_ERR_HPI_INTERNAL_ERROR - There is no private data for this sensor. **/ SaErrorT ilo2_ribcl_get_sensor_enable(void *hnd, SaHpiResourceIdT rid, SaHpiSensorNumT s_num, SaHpiBoolT *s_enable) { SaErrorT ret; struct oh_handler_state *oh_handler; struct ilo2_ribcl_sens_allinfo sens_allinfo; if( !hnd){ err(" ilo2_ribcl_get_sensor_enable: invalid handle."); return( SA_ERR_HPI_INVALID_PARAMS); } if( !s_enable){ err(" ilo2_ribcl_get_sensor_enable: invalid enable pointer."); return( SA_ERR_HPI_INVALID_PARAMS); } oh_handler = (struct oh_handler_state *)hnd; /* Look up our sensor RDR, and it's associated data */ ret = ilo2_ribcl_get_sensor_allinfo( oh_handler, rid, s_num, &sens_allinfo); if( ret != SA_OK){ return( ret); } /* Now that we have our sensor data handy, return the enable value */ *s_enable = sens_allinfo.sens_dat->sens_enabled; return( SA_OK); } /* end ilo2_ribcl_get_sensor_enable() */ /** * ilo2_ribcl_set_sensor_enable: * @hdn: Pointer to the handler for this instance. * @rid: Resource ID for resource containing this sensor. * @s_num: Number of this sensor in the resource. * @s_enable: The new sensor enable status. * * Description: * Implements the plugin specific part of the saHpiSensorEnableSet() API. * * We make a call to ilo2_ribcl_get_sensor_allinfo() to obtain the sensor RDR, * the rpt entry for the resource containing the sensor, and the struct * ilo2_ribcl_sensinfo that contains all our sensor data. * * If the new sensor enable suppiled by the user differs from the existing * value in our sensor data structure, we call ilo2_ribcl_sensor_send_event() * to send a sensor enable change event. * * Return values: * SA_OK - Normal, successful return. * SA_ERR_HPI_CAPABILITY - Resource does not support sensors. * SA_ERR_HPI_NOT_PRESENT - The requested sensor is not present. * SA_ERR_HPI_INVALID_RESOURCE - The resource does not exist. * SA_ERR_HPI_READ_ONLY - The sensor does not support changing enable status. * SA_ERR_HPI_INTERNAL_ERROR - There is no private data for this sensor. **/ SaErrorT ilo2_ribcl_set_sensor_enable(void *hnd, SaHpiResourceIdT rid, SaHpiSensorNumT s_num, SaHpiBoolT s_enable) { SaErrorT ret = SA_OK; struct oh_handler_state *oh_handler; struct ilo2_ribcl_sens_allinfo sens_allinfo; if( !hnd){ err(" ilo2_ribcl_set_sensor_enable: invalid handle."); return( SA_ERR_HPI_INVALID_PARAMS); } oh_handler = (struct oh_handler_state *)hnd; /* Look up our sensor RDR, and it's associated data */ ret = ilo2_ribcl_get_sensor_allinfo( oh_handler, rid, s_num, &sens_allinfo); if( ret != SA_OK){ return( ret); } /* Check that this sensor supports changing the enable status. */ if( sens_allinfo.rdr->RdrTypeUnion.SensorRec.EnableCtrl != SAHPI_TRUE){ return( SA_ERR_HPI_READ_ONLY); } /* We want to send an enable change event only if the enable * value has actually been changed. */ if( s_enable != sens_allinfo.sens_dat->sens_enabled){ sens_allinfo.sens_dat->sens_enabled = s_enable; ret = ilo2_ribcl_sensor_send_event( oh_handler, &sens_allinfo, SAHPI_ET_SENSOR_ENABLE_CHANGE, SAHPI_INFORMATIONAL, SAHPI_TRUE); } return( ret); } /* end ilo2_ribcl_set_sensor_enable() */ /** * ilo2_ribcl_get_sensor_event_enable: * @hdn: Pointer to the handler for this instance. * @rid: Resource ID for resource containing this sensor. * @s_num: Number of this sensor in the resource. * @e_enables: Pointer to return the sensor event enables. * * Description: * Implements the plugin specific part of the saHpiSensorEventEnableGet() API. * * We make a call to ilo2_ribcl_get_sensor_allinfo() to obtain the sensor RDR, * the rpt entry for the resource containing the sensor, and the struct * ilo2_ribcl_sensinfo that contains all our sensor data. * * Return values: * SA_OK - Normal, successful return. * SA_ERR_HPI_CAPABILITY - Resource does not support sensors. * SA_ER_HPI_INVALID_PARAMS - e_enables parameter is NULL. * SA_ERR_HPI_NOT_PRESENT - The requested sensor is not present. * SA_ERR_HPI_INVALID_RESOURCE - The resource does not exist. * SA_ERR_HPI_INTERNAL_ERROR - There is no private data for this sensor. **/ SaErrorT ilo2_ribcl_get_sensor_event_enable(void *hnd, SaHpiResourceIdT rid, SaHpiSensorNumT s_num, SaHpiBoolT *e_enable) { SaErrorT ret; struct oh_handler_state *oh_handler; struct ilo2_ribcl_sens_allinfo sens_allinfo; if( !hnd){ err(" ilo2_ribcl_get_sensor_event_enable: invalid handle."); return( SA_ERR_HPI_INVALID_PARAMS); } if( !e_enable){ err(" ilo2_ribcl_get_sensor_event_enable: invalid enable pointer."); return( SA_ERR_HPI_INVALID_PARAMS); } oh_handler = (struct oh_handler_state *)hnd; /* Look up our sensor RDR, and it's associated data */ ret = ilo2_ribcl_get_sensor_allinfo( oh_handler, rid, s_num, &sens_allinfo); if( ret != SA_OK){ return( ret); } /* Now that we have our sensor data handy, return the event enable * status value */ *e_enable = sens_allinfo.sens_dat->sens_ev_enabled; return( SA_OK); } /* end ilo2_ribcl_get_sensor_event_enable() */ /** * ilo2_ribcl_set_sensor_event_enable: * @hdn: Pointer to the handler for this instance. * @rid: Resource ID for resource containing this sensor. * @s_num: Number of this sensor in the resource. * @e_enables: The new sensor event enables. * * Description: * Implements the plugin specific part of the saHpiSensorEventEnableSet() API. * * We make a call to ilo2_ribcl_get_sensor_allinfo() to obtain the sensor RDR, * the rpt entry for the resource containing the sensor, and the struct * ilo2_ribcl_sensinfo that contains all our sensor data. * * If the new event enable suppiled by the user differs from the existing * value in our sensor data structure, we call ilo2_ribcl_sensor_send_event() * to send a sensor enable change event. * * Return values: * SA_OK - Normal, successful return. * SA_ERR_HPI_CAPABILITY - Resource does not support sensors. * SA_ERR_HPI_NOT_PRESENT - The requested sensor is not present. * SA_ERR_HPI_INVALID_RESOURCE - The resource does not exist. * SA_ERR_HPI_READ_ONLY - The sensor does not support changing enable status. * SA_ERR_HPI_INTERNAL_ERROR - There is no private data for this sensor. * SA_ERR_HPI_OUT_OF_MEMORY - Allocation failed. **/ SaErrorT ilo2_ribcl_set_sensor_event_enable(void *hnd, SaHpiResourceIdT rid, SaHpiSensorNumT s_num, SaHpiBoolT e_enable) { SaErrorT ret = SA_OK; struct oh_handler_state *oh_handler; struct ilo2_ribcl_sens_allinfo sens_allinfo; if( !hnd){ err(" ilo2_ribcl_set_sensor_event_enable: invalid handle."); return( SA_ERR_HPI_INVALID_PARAMS); } oh_handler = (struct oh_handler_state *)hnd; /* Look up our sensor RDR, and it's associated data */ ret = ilo2_ribcl_get_sensor_allinfo( oh_handler, rid, s_num, &sens_allinfo); if( ret != SA_OK){ return( ret); } /* Check that this sensor supports changing the enable status. */ if( sens_allinfo.rdr->RdrTypeUnion.SensorRec.EnableCtrl == SAHPI_SEC_READ_ONLY){ return( SA_ERR_HPI_READ_ONLY); } /* We want to send an enable change event only if the enable * value has actually been changed. */ if( e_enable != sens_allinfo.sens_dat->sens_ev_enabled){ sens_allinfo.sens_dat->sens_ev_enabled = e_enable; ret = ilo2_ribcl_sensor_send_event( oh_handler, &sens_allinfo, SAHPI_ET_SENSOR_ENABLE_CHANGE, SAHPI_INFORMATIONAL, SAHPI_TRUE); } return( ret); } /* end ilo2_ribcl_set_sensor_event_enable() */ /** * ilo2_ribcl_get_sensor_event_masks: * @hdn: Pointer to the handler for this instance. * @rid: Resource ID for resource containing this sensor. * @s_num: Number of this sensor in the resource. * @s_assertmask: Pointer to return the sensor event assert mask. * @s_deassertmask: Pointer to return the sensor event deassert mask. * * Description: * Implements the plugin specific part of the saHpiSensorEventMasksGet() API. * * We make a call to ilo2_ribcl_get_sensor_allinfo() to obtain the sensor RDR, * the rpt entry for the resource containing the sensor, and the struct * ilo2_ribcl_sensinfo that contains all our sensor data. * * Return values: * SA_OK - Normal, successful return. * SA_ERR_HPI_CAPABILITY - Resource does not support sensors. * SA_ERR_HPI_NOT_PRESENT - The requested sensor is not present. * SA_ERR_HPI_INVALID_RESOURCE - The resource does not exist. * SA_ERR_HPI_INTERNAL_ERROR - There is no private data for this sensor. **/ SaErrorT ilo2_ribcl_get_sensor_event_masks(void *hnd, SaHpiResourceIdT rid, SaHpiSensorNumT s_num, SaHpiEventStateT *s_assertmask, SaHpiEventStateT *s_deassertmask) { SaErrorT ret; struct oh_handler_state *oh_handler; struct ilo2_ribcl_sens_allinfo sens_allinfo; if( !hnd){ err(" ilo2_ribcl_get_sensor_event_masks: invalid handle."); return( SA_ERR_HPI_INVALID_PARAMS); } oh_handler = (struct oh_handler_state *)hnd; /* Look up our sensor RDR, and it's associated data */ ret = ilo2_ribcl_get_sensor_allinfo( oh_handler, rid, s_num, &sens_allinfo); if( ret != SA_OK){ return( ret); } if( s_assertmask != NULL){ *s_assertmask = sens_allinfo.sens_dat->sens_assertmask; } if( s_deassertmask != NULL){ *s_deassertmask = sens_allinfo.sens_dat->sens_deassertmask; } return( SA_OK); } /* end ilo2_ribcl_get_sensor_event_masks() */ /** * ilo2_ribcl_set_sensor_event_masks: * @hdn: Pointer to the handler for this instance. * @rid: Resource ID for resource containing this sensor. * @s_num: Number of this sensor in the resource. * @act: Specified the masking action to perform * @s_assertmask: Pointer to return the sensor event assert mask. * @s_deassertmask: Pointer to return the sensor event deassert mask. * * Description: * Implements the plugin specific part of the saHpiSensorEventMasksSet() API. * * We make a call to ilo2_ribcl_get_sensor_allinfo() to obtain the sensor RDR, * the rpt entry for the resource containing the sensor, and the struct * ilo2_ribcl_sensinfo that contains all our sensor data. * * If the application of the new event mask(s) suppiled by the user results * in a change to the mask(s) in our sensor data structure, we call * ilo2_ribcl_sensor_send_event() to send a sensor enable change event. * * Even though none of our sensors currently set SAHPI_CAPABILITY_EVT_DEASSERTS, * this routine will set the deassert mask equal to the assert mask if * SAHPI_CAPABILITY_EVT_DEASSERTS is ever set. * * Return values: * SA_OK - Normal, successful return. * SA_ERR_HPI_CAPABILITY - Resource does not support sensors. * SA_ERR_HPI_NOT_PRESENT - The requested sensor is not present. * SA_ERR_HPI_INVALID_RESOURCE - The resource does not exist. * SA_ERR_HPI_INVALID_PARAMS- The act parameter is out of range. * SA_ERR_HPI_INVALID_DATA - * SA_ERR_HPI_READ_ONLY - The sensor does not support updating the masks. * SA_ERR_HPI_INTERNAL_ERROR - There is no private data for this sensor. **/ SaErrorT ilo2_ribcl_set_sensor_event_masks(void *hnd, SaHpiResourceIdT rid, SaHpiSensorNumT s_num, SaHpiSensorEventMaskActionT act, SaHpiEventStateT s_assertmask, SaHpiEventStateT s_deassertmask) { SaErrorT ret = SA_OK; struct oh_handler_state *oh_handler; struct ilo2_ribcl_sens_allinfo sens_allinfo; SaHpiSensorEventCtrlT event_ctl; struct ilo2_ribcl_sensinfo *sensinfo; SaHpiEventStateT supported_events; SaHpiEventStateT new_assertmask; SaHpiEventStateT new_deassertmask; if( !hnd){ err(" ilo2_ribcl_set_sensor_event_masks: invalid handle."); return( SA_ERR_HPI_INVALID_PARAMS); } oh_handler = (struct oh_handler_state *)hnd; /* Look up our sensor RDR, and it's associated data */ ret = ilo2_ribcl_get_sensor_allinfo( oh_handler, rid, s_num, &sens_allinfo); if( ret != SA_OK){ return( ret); } sensinfo = sens_allinfo.sens_dat; supported_events = sens_allinfo.rdr->RdrTypeUnion.SensorRec.Events; /* Check if the event masks can be written */ event_ctl = sens_allinfo.rdr->RdrTypeUnion.SensorRec.EventCtrl; if( (event_ctl == SAHPI_SEC_READ_ONLY_MASKS) || (event_ctl == SAHPI_SEC_READ_ONLY) ){ return( SA_ERR_HPI_READ_ONLY); } /* If SAHPI_CAPABILITY_EVT_DEASSERTS has been set in the RPT entry, * then the de-assertion mask must track the assertion mask. The * SAHPI spec does not specify an error if the user provides masks * that don't match. */ if( sens_allinfo.rpt->ResourceCapabilities & SAHPI_CAPABILITY_EVT_DEASSERTS){ s_deassertmask = s_assertmask; } /* If either of the masks is SAHPI_ALL_EVENT_STATES, then set that * mask to all the event states that this sensor supports */ supported_events = sens_allinfo.rdr->RdrTypeUnion.SensorRec.Events; if( s_assertmask == SAHPI_ALL_EVENT_STATES){ s_assertmask = supported_events; } if( s_deassertmask == SAHPI_ALL_EVENT_STATES){ s_deassertmask = supported_events; } /* Check that the masks passed as parameters don't enclude event * states that this sensor does not support */ if( act == SAHPI_SENS_ADD_EVENTS_TO_MASKS){ if( (s_assertmask | supported_events) != supported_events){ return( SA_ERR_HPI_INVALID_DATA); } if( (s_deassertmask | supported_events) != supported_events){ return( SA_ERR_HPI_INVALID_DATA); } } if( act == SAHPI_SENS_ADD_EVENTS_TO_MASKS){ new_assertmask = sensinfo->sens_assertmask | s_assertmask; new_deassertmask = sensinfo->sens_deassertmask | s_deassertmask; } else if( act == SAHPI_SENS_REMOVE_EVENTS_FROM_MASKS){ new_assertmask = sensinfo->sens_assertmask & ~s_assertmask; new_deassertmask = sensinfo->sens_deassertmask & ~s_deassertmask; } else { return( SA_ERR_HPI_INVALID_PARAMS); } /* We only want to send an event if either of the masks will actually * change after all of this. */ if( (sensinfo->sens_assertmask == new_assertmask) && (sensinfo->sens_deassertmask == new_deassertmask) ){ return( SA_OK); } sensinfo->sens_assertmask = new_assertmask; sensinfo->sens_deassertmask = new_deassertmask; ret = ilo2_ribcl_sensor_send_event( oh_handler, &sens_allinfo, SAHPI_ET_SENSOR_ENABLE_CHANGE, SAHPI_INFORMATIONAL, SAHPI_TRUE); return( ret); } /* end ilo2_ribcl_set_sensor_event_masks() */ /** * ilo2_ribcl_get_sensor_allinfo: * @oh_handler: Pointer to the handler for this instance. * @rid: Resource ID for resource containing this sensor. * @s_num: Number of this sensor in the resource. * @sens_allinfo: Pointer to structure used to return rdr and data pointers. * * This is a support routine used within our plugin. It returns a pointer to * the sensor RDR, a pointer to the rpt entry for the resource containing the * sensor, and a pointer to the struct ilo2_ribcl_sensinfo that is associated * with the sensor RDR. These pointers are returned via the sens_allinfo * parameter, which should point to a struct ilo2_ribcl_sens_allinfo that has * been allocated by our caller. * * First, we get the rpt entry with a call to oh_get_resource_by_id(). Then * we get the sensor RDR with a call to oh_get_rdr_by_type(). Finally, we get * the associated sensor data with a call to oh_get_rdr_data(). * * Return values: * SA_OK - Normal, successful return. * SA_ERR_HPI_INVALID_RESOURCE - The resource does not exist. * SA_ERR_HPI_CAPABILITY - Resource does not support sensors. * SA_ERR_HPI_NOT_PRESENT - The requested sensor is not present. * SA_ERR_HPI_INTERNAL_ERROR - There is no private data for this sensor. **/ SaErrorT ilo2_ribcl_get_sensor_allinfo( struct oh_handler_state *oh_handler, SaHpiResourceIdT rid, SaHpiSensorNumT s_num, struct ilo2_ribcl_sens_allinfo *sens_allinfo) { sens_allinfo->rpt = NULL; sens_allinfo->rdr = NULL; sens_allinfo->sens_dat = NULL; /* Check if the resource exists, and that it has sensor capability */ sens_allinfo->rpt = oh_get_resource_by_id(oh_handler->rptcache, rid); if( !sens_allinfo->rpt){ err("ilo2_ribcl_get_sensor_allinfo: no rpt entry for resource id %d.", rid); return( SA_ERR_HPI_INVALID_RESOURCE); } if( !(sens_allinfo->rpt->ResourceCapabilities & SAHPI_CAPABILITY_SENSOR)){ err("ilo2_ribcl_get_sensor_allinfo: no sensor capability for resource id %d.", rid); return( SA_ERR_HPI_CAPABILITY); } /* look up the RDR for this sensor */ sens_allinfo->rdr = oh_get_rdr_by_type(oh_handler->rptcache, rid, SAHPI_SENSOR_RDR, s_num); if( sens_allinfo->rdr == NULL){ err("ilo2_ribcl_get_sensor_allinfo: no sensor RDR for resource id %d, sennsor %d.", rid, s_num); return( SA_ERR_HPI_NOT_PRESENT); } /* Finally, get the assoicated private data for this sensor */ sens_allinfo->sens_dat = (struct ilo2_ribcl_sensinfo *)oh_get_rdr_data( oh_handler->rptcache, rid, sens_allinfo->rdr->RecordId); if( sens_allinfo->sens_dat == NULL){ err("ilo2_ribcl_get_sensor_allinfo: no private sensor data for resource id %d, sensor %d, label: %s.", rid, s_num, sens_allinfo->rdr->IdString.Data); return( SA_ERR_HPI_INTERNAL_ERROR); } return( SA_OK); } /* end ilo2_ribcl_get_sensor_allinfo( ) */ /** * ilo2_ribcl_sensor_send_event: * @oh_handler: Pointer to the handler for this instance. * @sens_allinfo: Pointer to structure used to return rdr and data pointers. * @event_type: Type of sensor event. * @event_severity: Severity of event. * @is_assertion: True if this is an assertion event, false if not. * * This routine is used by our plugin to send both sensor change and sensor * enable change events. * * Sensor change events: * The single sensor event to be asserted or de-asserted is given by * the event_sens_ev_state element of struct ilo2_ribcl_sensinfo that * has been provided by the sens_allinfo parameter. * * The optional data SAHPI_SOD_CURRENT_STATE and SAHPI_SOD_PREVIOUS_STATE * are provided in our sensor events. * * Sensor enable change events: * The optional data SAHPI_SEOD_CURRENT_STATE is provided in our sensor * enable change events. * * Return values: * SA_OK - Normal, successful return. * SA_ERR_HPI_OUT_OF_MEMORY - Allocation failed. * SA_ERR_HPI_INTERNAL_ERROR - The event type was not SAHPI_ET_SENSOR or * SAHPI_ET_SENSOR_ENABLE_CHANGE. **/ static SaErrorT ilo2_ribcl_sensor_send_event( struct oh_handler_state *oh_handler, struct ilo2_ribcl_sens_allinfo *sens_allinfo, SaHpiEventTypeT event_type, SaHpiSeverityT sens_severity, SaHpiBoolT is_assertion) { struct oh_event *ev; SaHpiRdrT *rdr; struct ilo2_ribcl_sensinfo *sensinfo; SaHpiSensorEnableChangeEventT *sen_evch; SaHpiSensorEventT *sen_ev; if( (event_type != SAHPI_ET_SENSOR) && ( event_type != SAHPI_ET_SENSOR_ENABLE_CHANGE) ){ err("ilo2_ribcl_sensor_send_event: invalid event type."); return( SA_ERR_HPI_INTERNAL_ERROR); } rdr = sens_allinfo->rdr; sensinfo = sens_allinfo->sens_dat; ev = oh_new_event(); if( ev == NULL){ err("ilo2_ribcl_undiscovered_fru(): event allocation failed."); return( SA_ERR_HPI_OUT_OF_MEMORY); } ev->resource = *(sens_allinfo->rpt); ev->hid = oh_handler->hid; ev->event.EventType = event_type; ev->event.Severity = sens_severity; ev->event.Source = ev->resource.ResourceId; if ( oh_gettimeofday(&(ev->event.Timestamp)) != SA_OK){ ev->event.Timestamp = SAHPI_TIME_UNSPECIFIED; } ev->rdrs = g_slist_append(ev->rdrs, g_memdup(sens_allinfo->rdr, sizeof(SaHpiRdrT))); /* Now, fill out the sensor specific part */ if( event_type == SAHPI_ET_SENSOR_ENABLE_CHANGE){ sen_evch = &(ev->event.EventDataUnion.SensorEnableChangeEvent); sen_evch->SensorNum = sensinfo->sens_num; sen_evch->SensorType = rdr->RdrTypeUnion.SensorRec.Type; sen_evch->EventCategory = rdr->RdrTypeUnion.SensorRec.Category; sen_evch->SensorEnable = sensinfo->sens_enabled; sen_evch->SensorEventEnable = sensinfo->sens_ev_enabled; sen_evch->AssertEventMask = sensinfo->sens_assertmask; sen_evch->DeassertEventMask = sensinfo->sens_deassertmask; /* Optional data follows */ sen_evch->OptionalDataPresent |= SAHPI_SEOD_CURRENT_STATE; sen_evch->CurrentState = sensinfo->sens_ev_state; } else { /* Otherwise, it's a regular sensor event */ sen_ev = &(ev->event.EventDataUnion.SensorEvent); sen_ev->SensorNum = sensinfo->sens_num; sen_ev->SensorType = rdr->RdrTypeUnion.SensorRec.Type; sen_ev->EventCategory = rdr->RdrTypeUnion.SensorRec.Category; sen_ev->Assertion = is_assertion; sen_ev->EventState = sensinfo->event_sens_ev_state; /* Optional data follows */ sen_ev->OptionalDataPresent = SAHPI_SOD_CURRENT_STATE | SAHPI_SOD_PREVIOUS_STATE; sen_ev->PreviousState = sensinfo->prev_sens_ev_state; sen_ev->CurrentState = sensinfo->sens_ev_state; } oh_evt_queue_push( oh_handler->eventq, ev); return( SA_OK); } /* end ilo2_ribcl_sensor_send_event() */ /** * ilo2_ribcl_process_sensors: * @oh_handler: Pointer to the handler for this instance. * * This routine is called to examine the values of the sensors retrieved * and stored in the handler's DiscoveryData during the last discovery * operation, update the sensor values in the sensor data structures * associated with the sensor RDRs, and send the appropriate events if * the sensor values have changed. * * Since the communication latency with iLo2 is so large (or the order of 10 * seconds), we don't read the actual sensor values from iLo2 in * ilo2_ribcl_get_sensor_reading(). Instead, we peridically poll for the * sensor values and store them in the struct ilo2_ribcl_sensinfo structures * that are associated with the sensor RDRs. * * Currently, the sensor values are read during a discovery operation - either * via a client's call to saHpiDiscover() or via the daemon's periodic * discovery done in oh_discovery_thread_loop(). This routine is then called * at the end of ilo2_ribcl_do_discovery(). * * Chassis sensors: * For all chassis sensor readings stored in the handler's DiscoveryData, * get the sensor's associated HPI structures, and call * ilo2_ribcl_process_severitysensor(). * * Return values: * None **/ void ilo2_ribcl_process_sensors( struct oh_handler_state *oh_handler) { SaErrorT ret; SaHpiSensorNumT sens_num; ilo2_ribcl_handler_t *ir_handler = NULL; I2R_SensorDataT *ir_sens_dat; struct ilo2_ribcl_sens_allinfo sens_allinfo; ir_handler = (ilo2_ribcl_handler_t *) oh_handler->data; /* Handle the chassis sensors */ for( sens_num = 1; sens_num < I2R_NUM_CHASSIS_SENSORS; sens_num++){ ir_sens_dat = &(ir_handler->DiscoveryData.chassis_sensors[sens_num]); /* If this sensor was not found during discovery, skip it */ if( ir_sens_dat->state == I2R_NO_EXIST){ continue; } /* Get the rpt of the sensor resource, the RDR of the sensor, * and the sensor data associated with the RDR. */ ret = ilo2_ribcl_get_sensor_allinfo( oh_handler, ir_sens_dat->rid, sens_num, &sens_allinfo); if( ret != SA_OK){ err("ilo2_ribcl_process_sensors: could not locate HPI data for chassis sensor number %d.", sens_num); continue; } /* All of our chassis sensors are the severity type */ ilo2_ribcl_process_severitysensor( oh_handler, &sens_allinfo, ir_sens_dat); } /* Processing of any future sensors will be inserted here */ } /* end ilo2_ribcl_process_sensors() */ /* This array maps the event states of ilo2_ribcl sensor severity states to * HPI event severity. */ static SaHpiSeverityT ir_state2crit[] = { /* I2R_INITIAL */ SAHPI_OK, /* I2R_OK */ SAHPI_OK, /* I2R_DEGRADED_FROM_OK */ SAHPI_MAJOR, /* I2R_DEGRADED_FROM_FAIL */ SAHPI_MAJOR, /* I2R_FAILED */ SAHPI_CRITICAL }; /* This array maps the event states of ilo2_ribcl sensor severity states to * the corresponding HPI sensor SAHPI_EC_SEVERITY event state value. */ static SaHpiEventStateT ir_state2ev_state[] = { /* I2R_INITIAL */ SAHPI_ES_OK, /* I2R_OK */ SAHPI_ES_OK, /* I2R_DEGRADED_FROM_OK */ SAHPI_ES_MAJOR_FROM_LESS, /* I2R_DEGRADED_FROM_FAIL */ SAHPI_ES_MAJOR_FROM_CRITICAL, /* I2R_FAILED */ SAHPI_ES_CRITICAL }; /** * ilo2_ribcl_process_severity_sensor: * @oh_handler: Pointer to the handler for this instance. * @sens_allinfo: Pointer to structure giving all HPI info for this sensor. * @ir_sens_dat: Pointer to iLo2 RIBCL data for this sensor. * * This routine is given the sensor data obtained from iLo2 via parameter * ir_sens_dat and converts that data into an HPI sensor value, an HPI * event state, and a HPI event severity. It also sends the appropriate sensor * de-assertion and assertion events, if required. The new sensor value is * then cached in the sensor data associated with the sensor RDR. * * The sensor viewed from iLo2 can be in one of the following states (given * in ir_sens_dat->state): * * I2R_NO_EXIST - The sensor has never been detected during discovery. * I2R_INITIAL - The sensor has never been processed. * I2R_OK - iLo2 reports the sensor status as "Ok". * I2R_DEGRADED_FROM_OK - iLo2 previously reported the sensor as "Ok", * but now reports the sensor as "Degraded". * I2R_DEGRADED_FROM_FAIL - iLo2 previously reported the sensor as * "Failed", but now reports the sensor as "Degraded". * I2R_FAILED - iLo2 reports the sensor as "Failed". This does not mean * the sensor itself has failed. It means a failure staus * of the health the sensor was monitoring. * * The iLo2 sensor state is mapped into the following HPI defined * SAHPI_EC_SEVERITY event states: * * SAHPI_ES_OK * SAHPI_ES_MAJOR_FROM_LESS * SAHPI_ES_MAJOR_FROM_CRITICAL * SAHPI_ES_CRITICAL * * A high level description of the algorithm used is: * * if( sensor is disabled){ * return; * } * if( sensor reading has not changed){ * return; * } * * Update the stored sensor value with the current sensor reading. * * Determine the new ribcl sensor state based on the new sensor reading * and the and the current iLo2 RIBCL sensor state. * * Determine the new HPI severity sensor SAHPI_EC_SEVERITY event state * from the iLo2 RIBCL sensor state. * * if( ( enables ok) && ( previously not in the initial state) ){ * Send de-assert event for the previous state. * } * * if( enables ok){ * Send assert event for the new state. * } * * Return values: * None **/ static void ilo2_ribcl_process_severitysensor( struct oh_handler_state *oh_handler, struct ilo2_ribcl_sens_allinfo *sens_allinfo, I2R_SensorDataT *ir_sens_dat) { struct ilo2_ribcl_sensinfo *sensinfo; I2R_SensorStateT old_ribcl_state; sensinfo = sens_allinfo->sens_dat; /* If the sensor is not enabled, we should not do anything */ if( sensinfo->sens_enabled != SAHPI_TRUE){ return; } /* If the sensor reading has not changed since we last examined it, * we have nothing further to do. However if we are just starting * up, we may want to send an event for our current value. */ if( (ir_sens_dat->reading.intval == sensinfo->sens_value) && (ir_sens_dat->state != I2R_INITIAL)){ return ; } old_ribcl_state = ir_sens_dat->state; /* Update our stored HPI sensor value with the current iLo2 RIBCL * sensor reading. */ sensinfo->sens_value = ir_sens_dat->reading.intval; /* Now, we determine the new iLo2 RIBCL sensor state based upon the * new sensor reading and the current iLo2 RIBCL sensor state. */ switch( ir_sens_dat->reading.intval){ case I2R_SEN_VAL_OK: ir_sens_dat->state = I2R_OK; break; case I2R_SEN_VAL_DEGRADED: if( ir_sens_dat->state == I2R_FAILED){ ir_sens_dat->state = I2R_DEGRADED_FROM_FAIL; } else { ir_sens_dat->state = I2R_DEGRADED_FROM_OK; } break; case I2R_SEN_VAL_FAILED: ir_sens_dat->state = I2R_FAILED; break; default: /* This should not be possible */ err("ilo2_ribcl_process_severitysensor: invalid value %d for sensor number %d.", ir_sens_dat->reading.intval, sensinfo->sens_num); break; } /* end switch(ir_sens_dat->reading.intval) */ /* Determine the new HPI sensor severity SAHPI_EC_SEVERITY event * state from our new iLo2 RIBCL sensor state. */ sensinfo->prev_sens_ev_state = sensinfo->sens_ev_state; sensinfo->sens_ev_state = ir_state2ev_state[ir_sens_dat->state]; /* Since the value has changed, we might have to send an event to * deassert the previous event state. If our previous ribcl state was * I2R_INITIAL, then there was no previous event state. Below, * sensinfo->event_sens_ev_state is the single state we will use * for the event. */ sensinfo->event_sens_ev_state = sensinfo->prev_sens_ev_state; if( (old_ribcl_state != I2R_INITIAL) && (sensinfo->sens_ev_enabled) && ( sensinfo->event_sens_ev_state & sensinfo->sens_deassertmask)){ ilo2_ribcl_sensor_send_event( oh_handler, sens_allinfo, SAHPI_ET_SENSOR, ir_state2crit[old_ribcl_state], SAHPI_FALSE); } /* Finally, we may have to send an event to assert the new event * state. */ if( (sensinfo->sens_ev_enabled) && ( sensinfo->sens_ev_state & sensinfo->sens_assertmask) ){ sensinfo->event_sens_ev_state = sensinfo->sens_ev_state; ilo2_ribcl_sensor_send_event( oh_handler, sens_allinfo, SAHPI_ET_SENSOR, ir_state2crit[ir_sens_dat->state], SAHPI_TRUE); } } /* end ilo2_ribcl_process_severitysensor() */ /** * ilo2_ribcl_init_sensor_data: * @ir_handler: Pointer to the private handler for this instance. * * Designed to be called at handler instance open time, this routine * initializes the sensor data structures in the instance's DiscoveryData. * * Chassis sensors: * For all sensors in the chassis_sensors[] array within this handler's * DiscoveryData structure, set the state field to I2R_NO_EXIST, and the * reading.intval element to I2R_SEN_VAL_UNINITIALIZED. * * Return values: * None **/ void ilo2_ribcl_init_sensor_data( ilo2_ribcl_handler_t *ir_handler) { int iter; for( iter = 0; iter < I2R_NUM_CHASSIS_SENSORS; iter++){ ir_handler->DiscoveryData.chassis_sensors[iter].state = I2R_NO_EXIST; ir_handler->DiscoveryData.chassis_sensors[iter].reading.intval = I2R_SEN_VAL_UNINITIALIZED; } } /* end ilo2_ribcl_init_sensor_data() */ /***************************** OpenHPI plug-in to iLO2 RIBCL plug-in ABI function mapping *****************************/ void * oh_get_sensor_reading (void *, SaHpiResourceIdT, SaHpiSensorNumT, SaHpiSensorReadingT *, SaHpiEventStateT *) __attribute__ ((weak, alias("ilo2_ribcl_get_sensor_reading"))); void * oh_get_sensor_enable (void *, SaHpiResourceIdT, SaHpiSensorNumT, SaHpiBoolT *) __attribute__ ((weak, alias("ilo2_ribcl_get_sensor_enable"))); void * oh_set_sensor_enable (void *, SaHpiResourceIdT, SaHpiSensorNumT, SaHpiBoolT ) __attribute__ ((weak, alias("ilo2_ribcl_set_sensor_enable"))); void * oh_get_sensor_event_enables (void *, SaHpiResourceIdT, SaHpiSensorNumT, SaHpiBoolT *) __attribute__ ((weak, alias("ilo2_ribcl_get_sensor_event_enable"))); void * oh_set_sensor_event_enables (void *, SaHpiResourceIdT, SaHpiSensorNumT, SaHpiBoolT ) __attribute__ ((weak, alias("ilo2_ribcl_set_sensor_event_enable"))); void * oh_get_sensor_event_masks (void *, SaHpiResourceIdT, SaHpiSensorNumT, SaHpiEventStateT *, SaHpiEventStateT *) __attribute__ ((weak, alias("ilo2_ribcl_get_sensor_event_masks"))); void * oh_set_sensor_event_masks (void *, SaHpiResourceIdT, SaHpiSensorNumT, SaHpiSensorEventMaskActionT, SaHpiEventStateT , SaHpiEventStateT ) __attribute__ ((weak, alias("ilo2_ribcl_set_sensor_event_masks"))); openhpi-2.14.1/plugins/ilo2_ribcl/ilo2_ribcl_discover.c0000644000076400007640000021255211302566624017770 0ustar /* * Copyright (C) 2007-2008, Hewlett-Packard Development Company, LLP * All rights reserved. * * 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. * * Neither the name of the Hewlett-Packard Corporation, nor the names * of its contributors may be used to endorse or promote products * derived from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * Author(s) * Shuah Khan * Richard White */ #include #include #include #include #include #include #ifdef ILO2_RIBCL_SIMULATE_iLO2_RESPONSE #include /* For test routine ilo2_ribcl_getfile() */ #include /* For test routine ilo2_ribcl_getfile() */ #endif /* ILO2_RIBCL_SIMULATE_iLO2_RESPONSE */ /* Foreward decls: */ static SaErrorT ilo2_ribcl_do_discovery( ilo2_ribcl_handler_t *ir_handler); static SaErrorT ilo2_ribcl_discover_chassis( struct oh_handler_state *, SaHpiEntityPathT *); static SaErrorT ilo2_ribcl_discover_cpu( struct oh_handler_state *, SaHpiEntityPathT *); static SaErrorT ilo2_ribcl_discover_memory( struct oh_handler_state *, SaHpiEntityPathT *); static SaErrorT ilo2_ribcl_discover_powersupplies( struct oh_handler_state *, SaHpiEntityPathT *); static SaErrorT ilo2_ribcl_discover_vrm( struct oh_handler_state *, SaHpiEntityPathT *); static SaErrorT ilo2_ribcl_discover_fans( struct oh_handler_state *, SaHpiEntityPathT *); static SaErrorT ilo2_ribcl_discovered_fru( struct oh_handler_state *, SaHpiEntityPathT *, enum ir_discoverstate *, int, char *, struct ilo2_ribcl_idr_info *); static SaErrorT ilo2_ribcl_resource_set_failstatus( struct oh_handler_state *, SaHpiEntityPathT *, SaHpiBoolT); static SaErrorT ilo2_ribcl_undiscovered_fru( struct oh_handler_state *, SaHpiEntityPathT *, enum ir_discoverstate *, int, char *); static void ilo2_ribcl_clear_discoveryflags( ilo2_ribcl_handler_t *); static SaErrorT ilo2_ribcl_controls(struct oh_handler_state *, int, struct oh_event *, char *); static SaErrorT ilo2_ribcl_add_severity_sensor( struct oh_handler_state *, struct oh_event *, int, SaHpiSensorTypeT, SaHpiEventStateT, struct ilo2_ribcl_sensinfo *, char *); static void ilo2_ribcl_discover_chassis_sensors( struct oh_handler_state *, struct oh_event *); void ilo2_ribcl_add_resource_capability( struct oh_handler_state *, struct oh_event *, SaHpiCapabilitiesT); #ifdef ILO2_RIBCL_SIMULATE_iLO2_RESPONSE static int ilo2_ribcl_getfile( char *, char *, int); #endif /* ILO2_RIBCL_SIMULATE_iLO2_RESPONSE */ /** * ilo2_ribcl_discover_resources: Discovers resources for this instance * of the iLO2 RIBCL plug-in * @handler: Handler data pointer. * * This function discovers resources for this instance of the iLO2 * RIBCL plugin. * Detailed description: * * - Reset the discovery flags for each resource in DiscoveryData * via a call to ilo2_ribcl_clear_discoveryflags(). This allows us * to detect removed resources. * - Call ilo2_ribcl_do_discovery(), which will open an SSL connection * to iLO2 using the hostname and port saved in the ilo2_ribcl_handler * send the ILO2_RIBCL_GET_SERVER_DATA xml commands, and parse the * results into information stored in the DiscoveryData structure * within our private handler. * - Finally, call a series of discovery routines that examine * DiscoveryData and generate rpt entries and events for * resources that have been added, removed, or failed. * * Return values: * Builds/updates internal RPT cache - normal operation. * Returns SA_OK for success * SA_ERR_HPI_OUT_OF_MEMORY - Cannot allocate space for internal memory * SA_ERR_HPI_INTERNAL_ERROR - SSL and XML errors * SA_ERR_HPI_INVALID_PARAMS - if plungin handler or private handler is null * **/ SaErrorT ilo2_ribcl_discover_resources(void *handler) { struct oh_handler_state *oh_handler = (struct oh_handler_state *) handler; ilo2_ribcl_handler_t *ilo2_ribcl_handler; SaErrorT ret; SaHpiEntityPathT ep_root; if (!handler) { err("ilo2_ribcl_discover_resources(): Invalid handler parameter."); return(SA_ERR_HPI_INVALID_PARAMS); } ilo2_ribcl_handler = (ilo2_ribcl_handler_t *) oh_handler->data; if(! ilo2_ribcl_handler) { err("ilo2_ribcl_discover_resources(): Invalid private handler parameter."); return(SA_ERR_HPI_INVALID_PARAMS); } if( ilo2_ribcl_handler->entity_root == NULL){ err("ilo2_ribcl_discover_resources(): entity_root is NULL."); return(SA_ERR_HPI_INTERNAL_ERROR); } /* If our plugin becomes multhithreaded, lock here? */ ret = oh_encode_entitypath(ilo2_ribcl_handler->entity_root, &ep_root); if( ret != SA_OK){ err("ilo2_ribcl_discover_resources(): Cannot convert entity path."); return(SA_ERR_HPI_INTERNAL_ERROR); } ilo2_ribcl_clear_discoveryflags( ilo2_ribcl_handler); /* Send the RIBCL commands to iLO2 for discovery. The results * will have been written to DiscoveryData in the private handler * when ilo2_ribcl_do_discovery() returns. */ ret = ilo2_ribcl_do_discovery( ilo2_ribcl_handler); if( ret != SA_OK){ err("ilo2_ribcl_discover_resources(): discovery failed."); return( ret); } /* Now, we examine DiscoveryData and create resource events. Creating events is done in other functions called from this routine */ /* set first_discovery_done. */ if( !ilo2_ribcl_handler->first_discovery_done){ /* We only need to create a resource for the chassis once */ ret = ilo2_ribcl_discover_chassis( oh_handler, &ep_root); if( ret != SA_OK){ err("ilo2_ribcl_discover_resources(): chassis discovery failed."); return( ret); } ilo2_ribcl_handler->first_discovery_done = 1; } else { /* Even though the chassis itself is not an FRU, its * firmware can be updated, which can change its inventory * data. So, check for inventory updates. */ ilo2_ribcl_update_chassis_idr( oh_handler, &ep_root); } ret = ilo2_ribcl_discover_cpu( oh_handler, &ep_root); if( ret != SA_OK){ err("ilo2_ribcl_discover_resources(): cpu discovery failed."); return( ret); } ret = ilo2_ribcl_discover_memory( oh_handler, &ep_root); if( ret != SA_OK){ err("ilo2_ribcl_discover_resources(): memory discovery failed."); return( ret); } ret = ilo2_ribcl_discover_powersupplies( oh_handler, &ep_root); if( ret != SA_OK){ err("ilo2_ribcl_discover_resources(): power supply discovery failed."); return( ret); } ret = ilo2_ribcl_discover_vrm( oh_handler, &ep_root); if( ret != SA_OK){ err("ilo2_ribcl_discover_resources(): VRM discovery failed."); return( ret); } ret = ilo2_ribcl_discover_fans( oh_handler, &ep_root); if( ret != SA_OK){ err("ilo2_ribcl_discover_resources(): fan discovery failed."); return( ret); } /* Since we do not have a polling thread for sensors (yet), we process * any changed sensor values as part of a discovery operation, since * the openhpid should be regularly calling us. */ ilo2_ribcl_process_sensors( oh_handler); return(SA_OK); } /** * ilo2_ribcl_do_discovery * @ir_handler: The private handler for this plugin instance. * * This routine sends the ILO2_RIBCL_GET_SERVER_DATA xml commands * to an iLO2 via a SSL connection, receive the resulting output * from iLO2, parses that output, and adds information about discovered * resources into the private handler's DiscoveryData structure. * * Detailed description: * * - Allocate a temporary buffer to receive the response from iLO2. * - Retrieve the xml code for the ILO2_RIBCL_GET_SERVER_DATA commands * that have already been customized with the login and password of * the target iLO2. * - Call ilo2_ribcl_ssl_send_command() to make a SSL connection with * the iLO2 addressed in the configuration file, send the xml commands, * and retrieve the response in our temporary buffer. * - Call ir_xml_parse_discoveryinfo() to parse the iLO2 response and * enter data about the resources into the DiscoveryData structure * located in out private handler. * - Free the temporary response buffer. * * Return values: * SA_OK for success. * SA_ERR_HPI_OUT_OF_MEMORY if allocation fails * SA_ERR_HPI_INTERNAL_ERROR if our customized command is null or * if response parsing fails. * **/ static SaErrorT ilo2_ribcl_do_discovery( ilo2_ribcl_handler_t *ir_handler) { char *discover_cmd; char *d_response; /* command response buffer */ int ret; /* Allocate a temporary response buffer. Since the discover * command should be infrequently run, we dynamically allocate * instead of keeping a buffer around all the time. */ d_response = malloc(ILO2_RIBCL_DISCOVER_RESP_MAX); if( d_response == NULL){ err("ilo2_ribcl_do_discovery(): failed to allocate resp buffer."); return( SA_ERR_HPI_OUT_OF_MEMORY); } /* Retrieve our customized command buffer */ discover_cmd = ir_handler->ribcl_xml_cmd[IR_CMD_GET_SERVER_DATA]; if( discover_cmd == NULL){ err("ilo2_ribcl_do_discovery(): null customized command."); free( d_response); return( SA_ERR_HPI_INTERNAL_ERROR); } #ifdef ILO2_RIBCL_SIMULATE_iLO2_RESPONSE if( ir_handler->discovery_responsefile){ /* If we have specified a discovery_responsefile in our * config file, read the iLO2 response from this file * rather that communicating with an actual iLO2. This is * used for automated testing of this plugin. */ err("ilo2_ribcl_do_discovery(): Using contents of %s instead of iLO2 communication.", ir_handler->discovery_responsefile); ret = ilo2_ribcl_getfile( ir_handler->discovery_responsefile, d_response, ILO2_RIBCL_DISCOVER_RESP_MAX); } else { /* Send the command to iLO2 and get the response. */ ret = ilo2_ribcl_ssl_send_command( ir_handler, discover_cmd, d_response, ILO2_RIBCL_DISCOVER_RESP_MAX); } #else /* ILO2_RIBCL_SIMULATE_iLO2_RESPONSE not defined. This the the normal use, non-testing case. */ /* Send the command to iLO2 and get the response. */ ret = ilo2_ribcl_ssl_send_command( ir_handler, discover_cmd, d_response, ILO2_RIBCL_DISCOVER_RESP_MAX); #endif /* ILO2_RIBCL_SIMULATE_iLO2_RESPONSE */ if( ret != 0){ err("ilo2_ribcl_do_discovery(): command send failed."); free( d_response); return( SA_ERR_HPI_INTERNAL_ERROR); } /* Now, parse the response. The information we extract will be * written into the DiscoveryData element in our private handler */ ret = ir_xml_parse_discoveryinfo( ir_handler, d_response); if( ret != RIBCL_SUCCESS){ err("ilo2_ribcl_do_discovery(): response parse failed."); free( d_response); return( SA_ERR_HPI_INTERNAL_ERROR); } /* We're finished. Free up the temporary response buffer */ free( d_response); return( SA_OK); } /* end ilo2_ribcl_do_discovery() */ /** * ilo2_ribcl_clear_discoveryflags * @ir_handler: Pointer to the plugin private handler. * * This routine clears the IR_DISCOVERED bit in the flags element * for all discoverable resources that can be removed. * * Return values: None **/ void ilo2_ribcl_clear_discoveryflags( ilo2_ribcl_handler_t *ir_handler){ ilo2_ribcl_DiscoveryData_t *ddata; int idex; ddata = & (ir_handler->DiscoveryData); /* Clear the CPU flags */ for( idex = 1; idex <= ILO2_RIBCL_DISCOVER_CPU_MAX; idex++){ ddata->cpudata[idex].cpuflags &= ~IR_DISCOVERED; } /* Clear the memory flags */ for( idex = 1; idex <= ILO2_RIBCL_DISCOVER_MEM_MAX; idex++){ ddata->memdata[idex].memflags &= ~IR_DISCOVERED; } /* Clear the fan flags */ for( idex = 1; idex <= ILO2_RIBCL_DISCOVER_FAN_MAX; idex++){ ddata->fandata[idex].fanflags &= ~IR_DISCOVERED; } /* Clear the power supply flags */ for( idex = 1; idex <= ILO2_RIBCL_DISCOVER_PSU_MAX; idex++){ ddata->psudata[idex].psuflags &= ~IR_DISCOVERED; } /* Clear the VRM flags */ for( idex = 1; idex <= ILO2_RIBCL_DISCOVER_PSU_MAX; idex++){ ddata->vrmdata[idex].vrmflags &= ~IR_DISCOVERED; } } /* end ilo2_ribcl_clear_discoveryflags() */ /** * ilo2_ribcl_discover_chassis * @oh_handler: Handler data pointer. * * This function creates the rpt entry for our root resource, which * is the rack-mount server itself. After adding the resource to the handler's * rpt cache, we send a SAHPI_RESE_RESOURCE_ADDED event. * * Detailed description: * * - First, we build a resource tag from the product name, the * serial number, and the EntityLocation. * - Then we allocate a new event, with the resource entry specifying * ResourceCapabilities of SAHPI_CAPABILITY_RESOURCE and * SAHPI_CAPABILITY_RESET, no HotSwapCapabilities and a * ResourceSeverity of SAHPI_CRITICAL. * - Call oh_add_resource() to add the resource to the handler's rpt * cache. * - Call oh_evt_queue_push() to send a SAHPI_RESE_RESOURCE_ADDED * resource event. * * Return values: * SA_OK if success * SA_ERR_HPI_OUT_OF_MEMORY if allocation fails * **/ static SaErrorT ilo2_ribcl_discover_chassis( struct oh_handler_state *oh_handler, SaHpiEntityPathT *ep_root) { struct oh_event *ev = NULL; ilo2_ribcl_handler_t *ir_handler = NULL; ilo2_ribcl_resource_info_t *res_info = NULL; char *tmptag = NULL; size_t tagsize; SaErrorT ret; ir_handler = (ilo2_ribcl_handler_t *) oh_handler->data; if( (ir_handler->DiscoveryData.product_name) && (ir_handler->DiscoveryData.serial_number) ){ /* We build the tag from the product name, serial number, and * EntityLocation. Add 6 additional bytes for " SN: " notation */ tagsize = strlen( ir_handler->DiscoveryData.product_name) + strlen( ir_handler->DiscoveryData.serial_number) + OH_MAX_LOCATION_DIGITS + 8; tmptag = malloc( tagsize); if( tmptag == NULL){ err("ilo2_ribcl_discover_chassis(): tag message allocation failed."); return( SA_ERR_HPI_OUT_OF_MEMORY); } snprintf( tmptag, tagsize, "%s SN:%s (%2d)", ir_handler->DiscoveryData.product_name, ir_handler->DiscoveryData.serial_number, ep_root->Entry[0].EntityLocation); } else { /* If we didn't get a product name and a serial number, * use the default of "HP Rackmount Server". */ tagsize = OH_MAX_LOCATION_DIGITS + 19 + 3; /* String plus " ()" */ tmptag = malloc( tagsize); if( tmptag == NULL){ err("ilo2_ribcl_discover_chassis(): tag message allocation failed."); return( SA_ERR_HPI_OUT_OF_MEMORY); } snprintf( tmptag, tagsize, "%s (%2d)", "HP Rackmount Server", ep_root->Entry[0].EntityLocation); } /* Create a resource event for the box itself */ ev = oh_new_event(); if( ev == NULL){ err("ilo2_ribcl_discover_chassis(): event allocation failed."); free( tmptag); return( SA_ERR_HPI_OUT_OF_MEMORY); } /* Fill in the resource part of the event */ /* Plugin doesn't set EntryID */ ev->resource.ResourceEntity = *ep_root; ev->resource.ResourceId = oh_uid_from_entity_path(&(ev->resource.ResourceEntity)); ev->resource.ResourceInfo.ManufacturerId = HP_MANUFACTURING_ID; ev->resource.ResourceInfo.FirmwareMajorRev = ir_handler->DiscoveryData.fwdata.FirmwareMajorRev; ev->resource.ResourceInfo.FirmwareMinorRev = ir_handler->DiscoveryData.fwdata.FirmwareMinorRev; ev->resource.ResourceCapabilities = (SAHPI_CAPABILITY_RESOURCE | SAHPI_CAPABILITY_RESET | SAHPI_CAPABILITY_POWER | SAHPI_CAPABILITY_RDR); ev->resource.HotSwapCapabilities = ILO2_RIBCL_MANAGED_HOTSWAP_CAP_FALSE; ev->resource.ResourceSeverity = SAHPI_CRITICAL; ev->resource.ResourceFailed = SAHPI_FALSE; oh_init_textbuffer(&(ev->resource.ResourceTag)); oh_append_textbuffer( &(ev->resource.ResourceTag), tmptag); /* Allocate and populate iLO2 RIBCL private data area to be added to the resource rpt cache */ res_info = (ilo2_ribcl_resource_info_t *) g_malloc0(sizeof(ilo2_ribcl_resource_info_t)); if(res_info == NULL) { err("ilo2_ribcl_discover_chassis(): out of memory"); oh_event_free( ev, 0); free( tmptag); return( SA_ERR_HPI_OUT_OF_MEMORY); } res_info->rid = ev->resource.ResourceId; /* Safe to mark it active. This state is not applicable to non-FRU resources and will not be used as SAHPI_CAPABILITY_FRU is not set for this resource. */ res_info->fru_cur_state = SAHPI_HS_STATE_ACTIVE; res_info->disc_data_idx = ILO2_RIBCL_CHASSIS_INDEX; res_info->power_cur_state = ILO2_RIBCL_POWER_STATUS_UNKNOWN; /* Add the resource to this instance's rpt cache */ ret = oh_add_resource( oh_handler->rptcache, &(ev->resource), res_info, 0); if( ret != SA_OK){ err("ilo2_ribcl_discover_chassis(): cannot add resource to rptcache."); oh_event_free( ev, 0); free( tmptag); return( ret); } /* * Add control RDRs. ProLiant Rack Mounts have allow Unit ID (UID) * Light on the server to be turned off or on. There are power * saver, and Server Auto Power controls avalable as well. Add one * RDR each for UID, Power Saver conrol, and Auto Power Control. */ if(ilo2_ribcl_controls(oh_handler, ILO2_RIBCL_CTL_UID, ev, "Unit Identification Light (UID) Values: On(1)/Off(0)") == SA_OK) { /* UID control RDR has beeen added successfully. Set RDR and CONTROL capability flags. Please note that failing to add control rdr is not treated as a critical error that requires to fail plug-in initilization */ ilo2_ribcl_add_resource_capability( oh_handler, ev, (SAHPI_CAPABILITY_RDR | SAHPI_CAPABILITY_CONTROL)); } else { err("iLO2 RIBCL: Failed to setup UID Control RDR. Plug-in will run without this control feature"); } if(ilo2_ribcl_controls(oh_handler, ILO2_RIBCL_CTL_POWER_SAVER, ev, "Power Regulator Control Power Modes: Disabled(1)/Low(2)/DynamicSavings(3)/High(4)") == SA_OK) { /* Power Saver control RDR has beeen added successfully. Set RDR and CONTROL capability flags. Please note that failing to add control rdr is not treated as a critical error that requires to fail plug-in initilization */ ilo2_ribcl_add_resource_capability( oh_handler, ev, (SAHPI_CAPABILITY_RDR | SAHPI_CAPABILITY_CONTROL)); } else { err("iLO2 RIBCL: Failed to setup Power Saver Control RDR. Plug-in will run without this control feature"); } if(ilo2_ribcl_controls(oh_handler, ILO2_RIBCL_CTL_AUTO_POWER, ev, "Auto Power Control Delay:Min.(1)/Disabled(2)/random (3)/15 sec (15)/30 sec (30)/45 sec(45)/60 sec(60)") == SA_OK) { /* Auto Power control RDR has beeen added successfully. Set RDR and CONTROL capability flags. Please note that failing to add control rdr is not treated as a critical error that requires to fail plug-in initilization */ ilo2_ribcl_add_resource_capability( oh_handler, ev, (SAHPI_CAPABILITY_RDR | SAHPI_CAPABILITY_CONTROL)); } else { err("iLO2 RIBCL: Failed to setup Auto Power Control RDR. Plug-in will run without this control feature"); } /* Add sensor RDRs. We use three general system health sensors. */ ilo2_ribcl_discover_chassis_sensors( oh_handler, ev); /* Add an inventory RDR */ ilo2_ribcl_discover_chassis_idr( oh_handler, ev, tmptag); free( tmptag); /* Now, fill out the rest of the event structure and push it * onto the event queue. */ ev->hid = oh_handler->hid; ev->event.EventType = SAHPI_ET_RESOURCE; ev->event.Severity = ev->resource.ResourceSeverity; ev->event.Source = ev->resource.ResourceId; if ( oh_gettimeofday(&(ev->event.Timestamp)) != SA_OK){ ev->event.Timestamp = SAHPI_TIME_UNSPECIFIED; } ev->event.EventDataUnion.ResourceEvent.ResourceEventType = SAHPI_RESE_RESOURCE_ADDED; oh_evt_queue_push(oh_handler->eventq, ev); return( SA_OK); } /* end ilo2_ribcl_discover_chassis() */ /** * ilo2_ribcl_discover_cpu * @oh_handler: Handler data pointer. * @ep_root: pointer to the root path for this instance. * * This function creates the rpt entry for our CPU resources. After adding * the CPU resource to the handler's rpt cache, we send a * SAHPI_RESE_RESOURCE_ADDED event. * * Detailed description: * * For all CPUs found in DiscoveryData * - Use the CPU label from iLO2 as the resource tag. * - Build an EntityPath for this resource with an EntityType of * SAHPI_ENT_PROCESSOR and an EntityLocation set to the index * of this processor given by iLO2 in its label. * - If the IR_DISCOVERED flag is set for this dimm, call * ilo2_ribcl_discovered_fru(), otherwise call * ilo2_ribcl_undiscovered_fru(). * End for all CPUs * * Return values: * SA_OK if success * SA_ERR_HPI_OUT_OF_MEMORY if allocation fails **/ static SaErrorT ilo2_ribcl_discover_cpu( struct oh_handler_state *oh_handler, SaHpiEntityPathT *ep_root) { ilo2_ribcl_handler_t *ir_handler; ir_cpudata_t *cpudata; SaHpiEntityPathT cpu_ep; int idex; SaErrorT ret; ir_handler = (ilo2_ribcl_handler_t *) oh_handler->data; for( idex = 1; idex <= ILO2_RIBCL_DISCOVER_CPU_MAX; idex++){ cpudata = &(ir_handler->DiscoveryData.cpudata[idex]); if( cpudata->label == NULL){ continue; } /* * Build the entity path for this CPU. Please note that * cpu_ep.Entry[1].EntityLocation = 0 is necessary to * indicate path termination to oh_ConCat_Ep and other * OpenHPI utilities */ cpu_ep.Entry[0].EntityType = SAHPI_ENT_PROCESSOR; cpu_ep.Entry[0].EntityLocation = idex; cpu_ep.Entry[1].EntityType = SAHPI_ENT_ROOT; cpu_ep.Entry[1].EntityLocation = 0; oh_concat_ep(&cpu_ep, ep_root); if( cpudata->cpuflags & IR_DISCOVERED ){ /* Build the cpu IDR from DiscoveryData. * Use the temporary ilo2_ribcl_idr_info structure in * our private handler to collect the IDR information. * We use this buffer in the handler because it's too * large to put on the stack as a local valiable, and * we don't want to be allocating/deallocating it * frequently. */ ilo2_ribcl_build_cpu_idr( ir_handler, &(ir_handler->tmp_idr)); ret = ilo2_ribcl_discovered_fru( oh_handler, &cpu_ep, &(cpudata->dstate), 0, cpudata->label, &(ir_handler->tmp_idr)); /* Update the IDR data if it has changed */ ilo2_ribcl_update_fru_idr( oh_handler, &cpu_ep, &(ir_handler->tmp_idr)); } else { /* We didn't find it on the last iLO2 poll */ ret = ilo2_ribcl_undiscovered_fru( oh_handler, &cpu_ep, &(cpudata->dstate), 0, cpudata->label); } /* If there's an error, abort the rest of the recovery */ if( ret != SA_OK){ return( ret); } } /* end for idex */ return( SA_OK); } /* end ilo2_ribcl_discover_cpu() */ /** * ilo2_ribcl_discover_memory * @oh_handler: Handler data pointer. * @ep_root: pointer to the root path for this instance. * * This function handles the insertion and deletion of memory DIMM resources * detected during discovery. * * Detailed description: * * For all Memory DIMMS found in DiscoveryData * - Use the DIMM label from iLO2 as the resource tag. * - Build an EntityPath for this resource with an EntityType of * SAHPI_ENT_MEMORY_DEVICE and an EntityLocation set to the index * of this DIMM given by iLO2 in its label. * - If the IR_DISCOVERED flag is set for this dimm, call * ilo2_ribcl_discovered_fru(), otherwise call * ilo2_ribcl_undiscovered_fru(). * End for all DIMMS * * Return values: * SA_OK if success * SA_ERR_HPI_OUT_OF_MEMORY if allocation fails **/ static SaErrorT ilo2_ribcl_discover_memory( struct oh_handler_state *oh_handler, SaHpiEntityPathT *ep_root) { ilo2_ribcl_handler_t *ir_handler; ir_memdata_t *memdata; SaHpiEntityPathT mem_ep; int idex; SaErrorT ret; ir_handler = (ilo2_ribcl_handler_t *) oh_handler->data; for( idex = 1; idex <= ILO2_RIBCL_DISCOVER_MEM_MAX; idex++){ memdata = &(ir_handler->DiscoveryData.memdata[idex]); if( memdata->label == NULL){ /* If we have ever obtained data on this resource, * the memory label will be non-NULL. */ continue; } /* Build the entity path for this memory DIMM */ mem_ep.Entry[0].EntityType = SAHPI_ENT_MEMORY_DEVICE; mem_ep.Entry[0].EntityLocation = idex; mem_ep.Entry[1].EntityType = SAHPI_ENT_ROOT; mem_ep.Entry[1].EntityLocation = 0; oh_concat_ep(&mem_ep, ep_root); /* iLO2 response for Memory components doesn't contain RIBCL status. */ if( memdata->memflags & IR_DISCOVERED ){ /* Build the memory IDR from DiscoveryData. * Use the temporary ilo2_ribcl_idr_info structure in * our private handler to collect the IDR information. * We use this buffer in the handler because it's too * large to put on the stack as a local valiable, and * we don't want to be allocating/deallocating it * frequently. */ ilo2_ribcl_build_memory_idr( memdata, &(ir_handler->tmp_idr)); ret = ilo2_ribcl_discovered_fru( oh_handler, &mem_ep, &(memdata->dstate), 0, memdata->label, &(ir_handler->tmp_idr)); /* Update the IDR data if it has changed */ ilo2_ribcl_update_fru_idr( oh_handler, &mem_ep, &(ir_handler->tmp_idr)); } else { /* We didn't find it on the last iLO2 poll */ ret = ilo2_ribcl_undiscovered_fru( oh_handler, &mem_ep, &(memdata->dstate), 0, memdata->label); } /* If there's an error, abort the rest of the recovery */ if( ret != SA_OK){ return( ret); } } /* end for idex */ return( SA_OK); } /* end ilo2_ribcl_discover_memory() */ /** * ilo2_ribcl_discover_fans * @oh_handler: Handler data pointer. * @ep_root: pointer to the root path for this instance. * * This function handles the insertion and deletion of fan resources * detected during discovery. * * Detailed description: * * For all fans found in DiscoveryData * - Use the fan label and fan zone from iLO2 as the resource tag. * - Build an EntityPath for this resource with an EntityType of * SAHPI_ENT_COOLING_DEVICE and an EntityLocation set to the * index of this fan given by iLO2 in its label. * - If the IR_DISCOVERED flag is set for this fan, call * ilo2_ribcl_discovered_fru(), otherwise call * ilo2_ribcl_undiscovered_fru(). * End for all fans * * Return values: * SA_OK if success * SA_ERR_HPI_OUT_OF_MEMORY if allocation fails **/ static SaErrorT ilo2_ribcl_discover_fans( struct oh_handler_state *oh_handler, SaHpiEntityPathT *ep_root) { ilo2_ribcl_handler_t *ir_handler; char *fanstatus; ir_fandata_t *fandata; char *fantag; size_t tagsize; SaHpiEntityPathT fan_ep; int idex; int failed; SaErrorT ret; ir_handler = (ilo2_ribcl_handler_t *) oh_handler->data; for( idex = 1; idex <= ILO2_RIBCL_DISCOVER_FAN_MAX; idex++){ fandata = &(ir_handler->DiscoveryData.fandata[idex]); if( fandata->label == NULL){ /* If we have ever obtained data on this resource, * the fan label will be non-NULL. */ continue; } /* Build the entity path for this fan */ fan_ep.Entry[0].EntityType = SAHPI_ENT_COOLING_DEVICE; fan_ep.Entry[0].EntityLocation = idex; fan_ep.Entry[1].EntityType = SAHPI_ENT_ROOT; fan_ep.Entry[1].EntityLocation = 0; oh_concat_ep(&fan_ep, ep_root); /* Check if the discovery reported a failed fan */ failed = SAHPI_FALSE; fanstatus = fandata->status; if( (fanstatus != NULL) && !strcmp( fanstatus, "Failed")){ failed = SAHPI_TRUE; } /* include the fan location in the text tag */ tagsize = strlen( fandata->label) + strlen( fandata->zone) + 11; fantag = malloc( tagsize); if( fantag == NULL){ err("ilo2_ribcl_discover_fans(): malloc of %zd failed", tagsize); return( SA_ERR_HPI_OUT_OF_MEMORY); } snprintf( fantag, tagsize, "%s Location %s", fandata->label, fandata->zone); if( fandata->fanflags & IR_DISCOVERED ){ ret = ilo2_ribcl_discovered_fru( oh_handler, &fan_ep, &(fandata->dstate), failed, fantag, NULL); } else { /* We didn't find it on the last iLO2 poll */ ret = ilo2_ribcl_undiscovered_fru( oh_handler, &fan_ep, &(fandata->dstate), failed, fantag); } free( fantag); /* If there's an error, abort the rest of the recovery */ if( ret != SA_OK){ return( ret); } } /* end for idex */ return( SA_OK); } /* end ilo2_ribcl_discover_fans() */ /** * ilo2_ribcl_discover_powersupplies * @oh_handler: Handler data pointer. * @ep_root: pointer to the root path for this instance. * * This function handles the insertion and deletion of power supply resources * detected during discovery. * * Detailed description: * * For all power supplies found in DiscoveryData * - Use the power supply label from iLO2 as the resource tag. * - Build an EntityPath for this resource with an EntityType of * SAHPI_ENT_POWER_SUPPLY and an EntityLocation set to the * index of this power supply given by iLO2 in its label. * - If the IR_DISCOVERED flag is set for this power supply, call * ilo2_ribcl_discovered_fru(), otherwise call * ilo2_ribcl_undiscovered_fru(). * End for all power supplies * * Return values: * SA_OK if success * SA_ERR_HPI_OUT_OF_MEMORY if allocation fails **/ static SaErrorT ilo2_ribcl_discover_powersupplies( struct oh_handler_state *oh_handler, SaHpiEntityPathT *ep_root) { ilo2_ribcl_handler_t *ir_handler; char *psustatus; ir_psudata_t *psudata; SaHpiEntityPathT psu_ep; int idex; int failed; SaErrorT ret; ir_handler = (ilo2_ribcl_handler_t *) oh_handler->data; for( idex = 1; idex <= ILO2_RIBCL_DISCOVER_PSU_MAX; idex++){ psudata = &(ir_handler->DiscoveryData.psudata[idex]); if( psudata->label == NULL){ /* If we have ever obtained data on this resource, * the power supply label will be non-NULL. */ continue; } /* Build the entity path for this psu */ psu_ep.Entry[0].EntityType = SAHPI_ENT_POWER_SUPPLY; psu_ep.Entry[0].EntityLocation = idex; psu_ep.Entry[1].EntityType = SAHPI_ENT_ROOT; psu_ep.Entry[1].EntityLocation = 0; oh_concat_ep(&psu_ep, ep_root); /* Check if the discovery reported a failed power supply */ failed = SAHPI_FALSE; psustatus = psudata->status; if( (psustatus != NULL) && !strcmp( psustatus, "Failed")){ failed = SAHPI_TRUE; } if( psudata->psuflags & IR_DISCOVERED ){ ret = ilo2_ribcl_discovered_fru( oh_handler, &psu_ep, &(psudata->dstate), failed, psudata->label, NULL); } else { /* We didn't find it on the last iLO2 poll */ ret = ilo2_ribcl_undiscovered_fru( oh_handler, &psu_ep, &(psudata->dstate), failed, psudata->label); } /* If there's an error, abort the rest of the recovery */ if( ret != SA_OK){ return( ret); } } /* end for idex */ return( SA_OK); } /* end ilo2_ribcl_discover_powersupplies() */ /** * ilo2_ribcl_discover_vrm * @oh_handler: Handler data pointer. * @ep_root: pointer to the root path for this instance. * * This function handles the insertion and deletion of voltage regulator module * resources detected during discovery. * * Detailed description: * * For all VRMs found in DiscoveryData * - Use the VRM label from iLO2 as the resource tag. * - Build an EntityPath for this resource with an EntityType of * SAHPI_ENT_POWER_MODULE and an EntityLocation set to the * index of this VRM given by iLO2 in its label. * - If the IR_DISCOVERED flag is set for this VRM, call * ilo2_ribcl_discovered_fru(), otherwise call * ilo2_ribcl_undiscovered_fru(). * End for all VRMs * * Return values: * SA_OK if success * SA_ERR_HPI_OUT_OF_MEMORY if allocation fails **/ static SaErrorT ilo2_ribcl_discover_vrm( struct oh_handler_state *oh_handler, SaHpiEntityPathT *ep_root) { ilo2_ribcl_handler_t *ir_handler; char *vrmstatus; ir_vrmdata_t *vrmdata; SaHpiEntityPathT vrm_ep; int idex; int failed; SaErrorT ret; ir_handler = (ilo2_ribcl_handler_t *) oh_handler->data; for( idex = 1; idex <= ILO2_RIBCL_DISCOVER_VRM_MAX; idex++){ vrmdata = &(ir_handler->DiscoveryData.vrmdata[idex]); if( vrmdata->label == NULL){ /* If we have ever obtained data on this resource, * the power supply label will be non-NULL. */ continue; } /* Build the entity path for this vrm */ vrm_ep.Entry[0].EntityType = SAHPI_ENT_POWER_MODULE; vrm_ep.Entry[0].EntityLocation = idex; vrm_ep.Entry[1].EntityType = SAHPI_ENT_ROOT; vrm_ep.Entry[1].EntityLocation = 0; oh_concat_ep(&vrm_ep, ep_root); /* Check if the discovery reported a failed vrm */ failed = SAHPI_FALSE; vrmstatus = vrmdata->status; if( (vrmstatus != NULL) && !strcmp( vrmstatus, "Failed")){ failed = SAHPI_TRUE; } if( vrmdata->vrmflags & IR_DISCOVERED ){ ret = ilo2_ribcl_discovered_fru( oh_handler, &vrm_ep, &(vrmdata->dstate), failed, vrmdata->label, NULL); } else { /* We didn't find it on the last iLO2 poll */ ret = ilo2_ribcl_undiscovered_fru( oh_handler, &vrm_ep, &(vrmdata->dstate), failed, vrmdata->label); } /* If there's an error, abort the rest of the recovery */ if( ret != SA_OK){ return( ret); } } /* end for idex */ return( SA_OK); } /* end ilo2_ribcl_discover_vrm()*/ /** * ilo2_ribcl_discovered_fru * @oh_handler: Handler data pointer. * @resource_ep: pointer to the entity path for this resource. * @d_state: The current discovery state of the resource. * @isfailed: Indicates if the resource is currently detected as failed. * @tag: Characer string used for resource tag if rpt entry is created. * @idr_info: Pointer to IDR information if this resource should have an IDR, * Null otherwise. * * This function is called for removable resources whose presence have * been detected during a discovery operation. The action taken depends * upon the current resource state passed as parameter d_state, and whether * the resource is currently detected to be in a failed condition. The value of * d_state can be modified by this routine. * * Detailed description: * * These are the actions taken for each value of d_state: * * BLANK: This is the initial state for a resource. In this state, a resource * has never been detected before. * - Allocate a new resource event. * - Set ResourceCapabilities to SAHPI_CAPABILITY_RESOURCE, * HotSwapCapabilities to 0, ResourceSeverity to SAHPI_CRITICAL, * and use the tag parameter for the ResourceTag. * - Add the resource to the handler's rpt cache with a call to * oh_add_resource(). * - If this resource has an Inventory Data Repository, the idr_info * parameter will be non-null. In this case, call ilo2_ribcl_add_idr() * to add the IDR to this resource. * - Call oh_evt_queue_push() to send a SAHPI_RESE_RESOURCE_ADDED * resource event. * - Set d_state to OK * - Fall through to the OK state. * * OK: This is the state for a resource that has been previously discovered * and had not been detected as failing during the previous discovery. * In this state, we check for failure. * If the isfailed parameter is non-zero * - Look up the existing rpt entry from the resource_ep * entity path parameter. * - Set ResourceFailed to SAHPI_TRUE in that rpt entry. * - Call oh_evt_queue_push() to send a SAHPI_RESE_RESOURCE_FAILURE * resource event. * - Set d_state to FAILED. * End isfailed parameter is non-zero * * FAILED: This is the state for a resource that has been previously discovered * and has been detected as failing during the previous discovery. * In this state, we check if the resource is no longer failing. * If the isfailed parameter is zero * - Look up the existing rpt entry from the resource_ep * entity path parameter. * - Set ResourceFailed to SAHPI_FALSE in that rpt entry. * - Call oh_evt_queue_push() to send a * SAHPI_RESE_RESOURCE_RESTORED resource event. * - Set d_state to OK. * End isfailed parameter is non-zero * * REMOVED: This is the state for a resource that has been previously * discovered and has been detected as missing during the previous * discovery operation. We now need to re-add this device. * * Return values: * SA_OK if success * SA_ERR_HPI_OUT_OF_MEMORY if allocation fails * SA_ERR_HPI_NOT_PRESENT if a rpt entry for a resource isn't found. * SA_ERR_HPI_INTERNAL_ERROR id d_state is unknown. **/ static SaErrorT ilo2_ribcl_discovered_fru( struct oh_handler_state *oh_handler, SaHpiEntityPathT *resource_ep, enum ir_discoverstate *d_state, int isfailed, char *tag, struct ilo2_ribcl_idr_info *idr_info ) { struct oh_event *ev; SaHpiRptEntryT *rpt; SaErrorT ret; SaHpiBoolT resource_wasfailed; ilo2_ribcl_resource_info_t *res_info = NULL; switch( *d_state){ case BLANK: /* Do our initial rpt creation and addition */ /* Create a resource event */ ev = oh_new_event(); if( ev == NULL){ err("ilo2_ribcl_discovered_fru(): event allocation failed."); return( SA_ERR_HPI_OUT_OF_MEMORY); } /* Fill in the resource part of the event */ ev->resource.ResourceEntity = *resource_ep; /* Plugin doesn't set EntryID */ ev->resource.ResourceId = oh_uid_from_entity_path( &(ev->resource.ResourceEntity)); ev->resource.ResourceInfo.ManufacturerId = HP_MANUFACTURING_ID; ev->resource.ResourceCapabilities = (SAHPI_CAPABILITY_RESOURCE | SAHPI_CAPABILITY_FRU); ev->resource.HotSwapCapabilities = 0; ev->resource.ResourceSeverity = SAHPI_CRITICAL; ev->resource.ResourceFailed = isfailed; oh_init_textbuffer(&(ev->resource.ResourceTag)); oh_append_textbuffer( &(ev->resource.ResourceTag), tag); /* Allocate and populate iLO2 RIBCL private data area to be added to the resource rpt cache */ res_info = (ilo2_ribcl_resource_info_t *) g_malloc0(sizeof(ilo2_ribcl_resource_info_t)); if(res_info == NULL) { err("ilo2_ribcl_discovered_fru(): out of memory"); oh_event_free( ev, 0); return( SA_ERR_HPI_OUT_OF_MEMORY); } res_info->rid = ev->resource.ResourceId; res_info->fru_cur_state = SAHPI_HS_STATE_ACTIVE; res_info->disc_data_idx = resource_ep->Entry[0].EntityLocation; /* Add the resource to this instance's rpt cache */ ret = oh_add_resource( oh_handler->rptcache, &(ev->resource), res_info, 0); if( ret != SA_OK){ err("ilo2_ribcl_discovered_fru(): cannot add resource to rptcache."); oh_event_free( ev, 0); return( ret); } /* If this this resource has an associated Inventory Data * Repository, the IDR data will be passed in via the * idr_info parameter. */ if( idr_info != NULL){ ret = ilo2_ribcl_add_idr( oh_handler, ev, SAHPI_DEFAULT_INVENTORY_ID, idr_info, tag); if( ret != SA_OK){ err("ilo2_ribcl_discovered_fru: could not add IDR to resource id %d.", ev->resource.ResourceId); } } /* Now, fill out the rest of the event structure and push it * onto the event queue. */ ev->hid = oh_handler->hid; ev->event.EventType = SAHPI_ET_HOTSWAP; ev->event.Severity = ev->resource.ResourceSeverity; ev->event.Source = ev->resource.ResourceId; if ( oh_gettimeofday(&(ev->event.Timestamp)) != SA_OK){ ev->event.Timestamp = SAHPI_TIME_UNSPECIFIED; } ev->event.EventDataUnion.HotSwapEvent.HotSwapState = SAHPI_HS_STATE_ACTIVE; ev->event.EventDataUnion.HotSwapEvent.PreviousHotSwapState = SAHPI_HS_STATE_NOT_PRESENT; ev->event.EventDataUnion.HotSwapEvent.CauseOfStateChange = SAHPI_HS_CAUSE_UNKNOWN; oh_evt_queue_push(oh_handler->eventq, ev); *d_state = OK; /* Fall through to OK state */ case OK: /* Check to see if we have failed. If so, update the rpt * entry for this resource, and send a * SAHPI_RESE_RESOURCE_FAILURE event. */ if( isfailed){ ret = ilo2_ribcl_resource_set_failstatus( oh_handler, resource_ep, SAHPI_TRUE); /* If we were out of memory, stay in state OK * and try again next time. */ if( ret != SA_ERR_HPI_OUT_OF_MEMORY){ *d_state = FAILED; } if( ret != SA_OK){ return( ret); } } break; case FAILED: /* Check to see if we are no longer failed. If so, * update the rpt entry for this resource, and send a * SAHPI_RESE_RESOURCE_RESTORED event */ if( !isfailed){ ret = ilo2_ribcl_resource_set_failstatus( oh_handler, resource_ep, SAHPI_FALSE); /* If we were out of memory, stay in state FAILED * and try again next time. */ if( ret != SA_ERR_HPI_OUT_OF_MEMORY){ *d_state = OK; } if( ret != SA_OK){ return( ret); } } break; case REMOVED: /* We have been rediscovered after being removed */ /* - get our rpt entry from our entity path with a call to * oh_get_resource_by_ep(). * - send a hotswap event putting us into SAHPI_HS_STATE_ACTIVE * - check for failure. If previously failed, and not failed * now, send a SAHPI_RESE_RESOURCE_RESTORED resource event. * if failed now, send a SAHPI_RESE_RESOURCE_FAILURE resource * event. * - set d_state based on failure status */ rpt = oh_get_resource_by_ep( oh_handler->rptcache, resource_ep); if( rpt == NULL){ /* This should never happen */ err("ilo2_ribcl_discovered_fru(): Null rpt entry for removed resource"); *d_state = OK; return( SA_ERR_HPI_NOT_PRESENT); } res_info = (ilo2_ribcl_resource_info_t *)oh_get_resource_data( oh_handler->rptcache, rpt->ResourceId); if (!res_info) { /* This should never happen */ err("ilo2_ribcl_discovered_fru(): No resource information for a removed resource."); return( SA_ERR_HPI_NOT_PRESENT); } resource_wasfailed = rpt->ResourceFailed; ev = oh_new_event(); if( ev == NULL){ err("ilo2_ribcl_discovered_fru(): event allocation failed."); return( SA_ERR_HPI_OUT_OF_MEMORY); } /* Copy the rpt information from our handler's rptcache */ ev->resource = *rpt; /* If this this resource has an associated Inventory Data * Repository, the IDR data will be passed in via the * idr_info parameter. When we sent the * SAHPI_HS_STATE_NOT_PRESENT event previously for this * resource, the daemon removed the rpt entry and all of * its rdrs from the domain table. So, we need to add the * rdrs back via this event's rdrs list. */ if( idr_info != NULL){ ret = ilo2_ribcl_add_idr( oh_handler, ev, SAHPI_DEFAULT_INVENTORY_ID, idr_info, tag); if( ret != SA_OK){ err("ilo2_ribcl_discovered_fru: could not add IDR to resource id %d.", ev->resource.ResourceId); } } ev->hid = oh_handler->hid; ev->event.EventType = SAHPI_ET_HOTSWAP; ev->event.Severity = ev->resource.ResourceSeverity; ev->event.Source = ev->resource.ResourceId; if ( oh_gettimeofday(&(ev->event.Timestamp)) != SA_OK){ ev->event.Timestamp = SAHPI_TIME_UNSPECIFIED; } ev->event.EventDataUnion.HotSwapEvent.HotSwapState = SAHPI_HS_STATE_ACTIVE; ev->event.EventDataUnion.HotSwapEvent.PreviousHotSwapState = SAHPI_HS_STATE_NOT_PRESENT; ev->event.EventDataUnion.HotSwapEvent.CauseOfStateChange = SAHPI_HS_CAUSE_UNKNOWN; /* update resource private data with the new state */ res_info->fru_cur_state = ev->event.EventDataUnion.HotSwapEvent.HotSwapState; oh_evt_queue_push(oh_handler->eventq, ev); ret = SA_OK; *d_state = OK; /* Now handle the resource failure condition. */ if( isfailed){ ret = ilo2_ribcl_resource_set_failstatus( oh_handler, resource_ep, SAHPI_TRUE); /* If we were out of memory, stay in state OK * and try again next time. */ if( ret != SA_ERR_HPI_OUT_OF_MEMORY){ *d_state = FAILED; } if( ret != SA_OK){ return( ret); } } else { /* If the resource was failed before removal, * and now is no longer failed, send a * SAHPI_RESE_RESOURCE_RESTORED resource event */ if( resource_wasfailed){ ret = ilo2_ribcl_resource_set_failstatus( oh_handler, resource_ep, SAHPI_FALSE); /* If we were out of memory, stay in state * FAILED and try again next time. */ if( ret != SA_ERR_HPI_OUT_OF_MEMORY){ *d_state = FAILED; } if( ret != SA_OK){ return( ret); } } } break; default: err("ilo2_ribcl_discovered_fru(): invalid d_state"); return( SA_ERR_HPI_INTERNAL_ERROR); break; } /* end switch d_state */ return( SA_OK); } /* end ilo2_ribcl_discovered_fru() */ /** * ilo2_ribcl_resource_set_failstatus * @oh_handler: Handler data pointer. * @resource_ep: pointer to the entity path for this resource. * @resource_failed: SAHPI_TRUE if resource has failed, SAHPI_FALSE otherwise. * * Detailed description: * - Look up the existing rpt entry from the resource_ep entity * path parameter. * - Set ResourceFailed to the value of parameter resource_failed * in that rpt entry. * - Call oh_evt_queue_push() to send a SAHPI_RESE_RESOURCE_FAILURE * resource event if the resource has failed, or a * SAHPI_RESE_RESOURCE_RESTORED resource event if the device is no * longer failed. * * Return values: * SA_OK if success * SA_ERR_HPI_OUT_OF_MEMORY if allocation fails. * SA_ERR_HPI_NOT_PRESENT if the rpt entry for resource_ep is not found. **/ static SaErrorT ilo2_ribcl_resource_set_failstatus( struct oh_handler_state *oh_handler, SaHpiEntityPathT *resource_ep, SaHpiBoolT resource_failed ) { struct oh_event *ev; SaHpiRptEntryT *rpt; rpt = oh_get_resource_by_ep( oh_handler->rptcache, resource_ep); if( rpt == NULL){ /* This should never happen */ err("ilo2_ribcl_resource_set_failstatus(): Null rpt entry for failed resource"); return( SA_ERR_HPI_NOT_PRESENT); } rpt->ResourceFailed = resource_failed; /* Generate a RESOURCE_FAILURE event */ ev = oh_new_event(); if( ev == NULL){ err("ilo2_ribcl_resource_set_failstatus(): event allocation failed."); return( SA_ERR_HPI_OUT_OF_MEMORY); } ev->resource = *rpt; ev->hid = oh_handler->hid; ev->event.EventType = SAHPI_ET_RESOURCE; ev->event.Severity = ev->resource.ResourceSeverity; ev->event.Source = ev->resource.ResourceId; if ( oh_gettimeofday(&(ev->event.Timestamp)) != SA_OK){ ev->event.Timestamp = SAHPI_TIME_UNSPECIFIED; } if( resource_failed == SAHPI_FALSE){ ev->event.EventDataUnion.ResourceEvent.ResourceEventType = SAHPI_RESE_RESOURCE_RESTORED; } else { ev->event.EventDataUnion.ResourceEvent.ResourceEventType = SAHPI_RESE_RESOURCE_FAILURE; } oh_evt_queue_push(oh_handler->eventq, ev); return( SA_OK); } /* end ilo2_ribcl_resource_fail() */ /** * ilo2_ribcl_undiscovered_fru * @oh_handler: Handler data pointer. * @resource_ep: pointer to the entity path for this resource. * @d_state: The current discovery state of the resource. * @isfailed: Indicates if the resource is currently detected as failed. * @tag: Characer string used for resource tag if rpt entry is created. * * This function is called for removable resources whose presence have * not been detected during a discovery operation. The action taken depends * upon the current resource state passed as parameter d_state, and whether * the resource is currently detected to be in a failed condition. The value of * d_state can be modified by this routine. * * Detailed description: * * These are the actions taken for each value of d_state: * * BLANK: This is the initial state for a resource. In this state, a resource * has never been detected before. For this state, we do nothing. * OK: This is the state for a resource that has been previously discovered * and had not been detected as failing during the previous discovery. * Since this resource is now missing, we should indicate it has been * removed. * * FAILED: This is the state for a resource that has been previously discovered * and has been detected as failing during the previous discovery. * Since this resource is now missing, we should indicate it has been * removed. * * REMOVED: This is the state for a resource that has been previously * discovered and has been detected as missing during the previous * discovery operation. Since it's still missing now, we do nothing. * * Return values: * SA_OK if success * SA_ERR_HPI_INTERNAL_ERROR id d_state is unknown. **/ static SaErrorT ilo2_ribcl_undiscovered_fru( struct oh_handler_state *oh_handler, SaHpiEntityPathT *resource_ep, enum ir_discoverstate *d_state, int isfailed, char *tag ) { struct oh_event *ev; SaHpiRptEntryT *rpt; ilo2_ribcl_resource_info_t *res_info = NULL; switch( *d_state){ case BLANK: case REMOVED: /* nothing to do for these two states */ return( SA_OK); break; case OK: case FAILED: /* remove this resource */ /* Use the resource_ep to locate the rpt entry. Then * send a hotswap event putting this resource into a * SAHPI_HS_STATE_NOT_PRESENT state */ rpt = oh_get_resource_by_ep( oh_handler->rptcache, resource_ep); if( rpt == NULL){ /* This should never happen */ err("ilo2_ribcl_undiscovered_fru(): Null rpt entry for removed resource"); *d_state = OK; return( SA_ERR_HPI_NOT_PRESENT); } ev = oh_new_event(); if( ev == NULL){ err("ilo2_ribcl_undiscovered_fru(): event allocation failed."); return( SA_ERR_HPI_OUT_OF_MEMORY); } ev->resource = *rpt; ev->hid = oh_handler->hid; ev->event.EventType = SAHPI_ET_HOTSWAP; ev->event.Severity = ev->resource.ResourceSeverity; ev->event.Source = ev->resource.ResourceId; if ( oh_gettimeofday(&(ev->event.Timestamp)) != SA_OK){ ev->event.Timestamp = SAHPI_TIME_UNSPECIFIED; } ev->event.EventDataUnion.HotSwapEvent.HotSwapState = SAHPI_HS_STATE_NOT_PRESENT; ev->event.EventDataUnion.HotSwapEvent.PreviousHotSwapState = SAHPI_HS_STATE_ACTIVE; ev->event.EventDataUnion.HotSwapEvent.CauseOfStateChange = SAHPI_HS_CAUSE_UNKNOWN; res_info = (ilo2_ribcl_resource_info_t *)oh_get_resource_data( oh_handler->rptcache, rpt->ResourceId); if (!res_info) { /* This should never happen */ err("ilo2_ribcl_discovered_fru(): No resource information for a removed resource."); return( SA_ERR_HPI_NOT_PRESENT); } res_info->fru_cur_state = ev->event.EventDataUnion.HotSwapEvent.HotSwapState; oh_evt_queue_push(oh_handler->eventq, ev); *d_state = REMOVED; break; default: err("ilo2_ribcl_undiscovered_fru(): invalid d_state"); return( SA_ERR_HPI_INTERNAL_ERROR); break; } /* end switch d_state */ return( SA_OK); } /* end ilo2_ribcl_undiscovered_fru() */ /** * ilo2_ribcl_free_discoverydata * @ir_handler: The private handler for this plugin instance. * * This function, intended to be called at plugin close time, will free any * dynamically allocated data in the handler DiscoveryData structure. * * Return values: None. **/ void ilo2_ribcl_free_discoverydata( ilo2_ribcl_handler_t *ir_handle) { int idex; ilo2_ribcl_DiscoveryData_t *ddata; ddata = &(ir_handle->DiscoveryData); if( ddata->product_name != NULL){ free( ddata->product_name); } if( ddata->serial_number != NULL){ free( ddata->serial_number); } if( ddata->fwdata.version_string != NULL){ free( ddata->fwdata.version_string); } if( ddata->serial_number != NULL){ free( ddata->system_cpu_speed); } /* Free the CPU data */ for( idex = 1; idex <= ILO2_RIBCL_DISCOVER_CPU_MAX; idex++){ if( ddata->cpudata[idex].label){ free( ddata->cpudata[idex].label); } } /* Free the memory data */ for( idex = 1; idex <= ILO2_RIBCL_DISCOVER_MEM_MAX; idex++){ if( ddata->memdata[idex].label){ free( ddata->memdata[idex].label); } if( ddata->memdata[idex].memsize){ free( ddata->memdata[idex].memsize); } if( ddata->memdata[idex].speed){ free( ddata->memdata[idex].speed); } } /* Free the fan data */ for( idex = 1; idex <= ILO2_RIBCL_DISCOVER_FAN_MAX; idex++){ if( ddata->fandata[idex].label){ free( ddata->fandata[idex].label); } if( ddata->fandata[idex].zone){ free( ddata->fandata[idex].zone); } if( ddata->fandata[idex].status){ free( ddata->fandata[idex].status); } if( ddata->fandata[idex].speedunit){ free( ddata->fandata[idex].speedunit); } } /* Free the power supply data */ for( idex = 1; idex <= ILO2_RIBCL_DISCOVER_PSU_MAX; idex++){ if( ddata->psudata[idex].label){ free( ddata->psudata[idex].label); } if( ddata->psudata[idex].status){ free( ddata->psudata[idex].status); } } /* Free the VRM data */ for( idex = 1; idex <= ILO2_RIBCL_DISCOVER_PSU_MAX; idex++){ if( ddata->vrmdata[idex].label){ free( ddata->vrmdata[idex].label); } if( ddata->vrmdata[idex].status){ free( ddata->vrmdata[idex].status); } } /* Temperature data not yet implemented */ } /** * ilo2_ribcl_controls * @oh_handler: Handler data pointer. * @ctl_type: iLO2 RIBCL control type. * @event: Pointer to event structure. * @desc * * This function is called from chassis discovery routine to add control * RDR for a given control. This routine validates control type. * * Return values: * SA_OK if success * SA_ERR_HPI_INVALID_PARAMS * SA_ERR_HPI_INTERNAL_ERROR * SA_ERR_HPI_OUT_OF_MEMORY **/ static SaErrorT ilo2_ribcl_controls(struct oh_handler_state *oh_handler, int ctl_type, struct oh_event *event, char *desc) { SaErrorT err; SaHpiRdrT *rdrptr; ilo2_ribcl_cinfo_t cinfo, *cinfo_ptr = NULL; if(oh_handler == NULL) { err("ilo2_ribcl_controls(): Null handler"); return(SA_ERR_HPI_INVALID_PARAMS); } if(event == NULL) { err("ilo2_ribcl_controls(): Null event"); return(SA_ERR_HPI_INVALID_PARAMS); } if(desc == NULL) { err("ilo2_ribcl_controls(): Null Control Description String"); return(SA_ERR_HPI_INVALID_PARAMS); } if((ctl_type != ILO2_RIBCL_CTL_UID) && (ctl_type != ILO2_RIBCL_CTL_POWER_SAVER) && (ctl_type != ILO2_RIBCL_CTL_AUTO_POWER)) { err("ilo2_ribcl_controls(): Invalid iLO2 RIBCL control type"); return(SA_ERR_HPI_INTERNAL_ERROR); } rdrptr = (SaHpiRdrT *)g_malloc0(sizeof(SaHpiRdrT)); if (rdrptr == NULL) { err("ilo2_ribcl_controls(): Out of memory."); return(SA_ERR_HPI_OUT_OF_MEMORY); } rdrptr->RdrType = SAHPI_CTRL_RDR; rdrptr->Entity = event->resource.ResourceEntity; switch(ctl_type) { case ILO2_RIBCL_CTL_UID: { rdrptr->RdrTypeUnion.CtrlRec.Num = ILO2_RIBCL_CONTROL_1; rdrptr->RdrTypeUnion.CtrlRec.OutputType = SAHPI_CTRL_LED; rdrptr->RdrTypeUnion.CtrlRec.Type = SAHPI_CTRL_TYPE_DIGITAL; rdrptr->RdrTypeUnion.CtrlRec.TypeUnion.Digital.Default = SAHPI_CTRL_STATE_OFF; rdrptr->RdrTypeUnion.CtrlRec.DefaultMode.Mode = SAHPI_CTRL_MODE_MANUAL; rdrptr->RdrTypeUnion.CtrlRec.DefaultMode.ReadOnly = SAHPI_FALSE; rdrptr->RdrTypeUnion.CtrlRec.WriteOnly = SAHPI_FALSE; rdrptr->RdrTypeUnion.CtrlRec.Oem = 0; cinfo.ctl_type = ctl_type; cinfo.cur_mode = rdrptr->RdrTypeUnion.CtrlRec.DefaultMode.Mode; cinfo.cur_state.Digital = rdrptr->RdrTypeUnion.CtrlRec.TypeUnion.Digital.Default; } break; case ILO2_RIBCL_CTL_POWER_SAVER: { /* The following outlines the Power Regulator feature: The values are 1 = OS Control Mode (Disabled Mode for iLO) 2 = HP Static Low Power Mode 3 = HP Dynamic Power Savings Mode 4 = HP Static High Performance Mode Note: Value 4 is availble only for iLO 2 firmware version 1.20 and later. */ rdrptr->RdrTypeUnion.CtrlRec.Num = ILO2_RIBCL_CONTROL_2; rdrptr->RdrTypeUnion.CtrlRec.OutputType = SAHPI_CTRL_GENERIC; rdrptr->RdrTypeUnion.CtrlRec.Type = SAHPI_CTRL_TYPE_DISCRETE; rdrptr->RdrTypeUnion.CtrlRec.TypeUnion.Discrete.Default = ILO2_RIBCL_MANUAL_OS_CONTROL_MODE; rdrptr->RdrTypeUnion.CtrlRec.DefaultMode.Mode = SAHPI_CTRL_MODE_MANUAL; rdrptr->RdrTypeUnion.CtrlRec.DefaultMode.ReadOnly = SAHPI_FALSE; rdrptr->RdrTypeUnion.CtrlRec.WriteOnly = SAHPI_FALSE; rdrptr->RdrTypeUnion.CtrlRec.Oem = 0; cinfo.ctl_type = ctl_type; cinfo.cur_mode = rdrptr->RdrTypeUnion.CtrlRec.DefaultMode.Mode; cinfo.cur_state.Discrete = rdrptr->RdrTypeUnion.CtrlRec.TypeUnion.Discrete.Default; } break; case ILO2_RIBCL_CTL_AUTO_POWER: { /* The following outlines the Auto Power feature: The Auto Power Control allows user to change the automatic power on and power on delay settings of the server. The values are Yes = Enable automatic power on with a minimum delay. No = Disable automatic power on. 15 = Enable automatic power on with 15 seconds delay. 30 = Enable automatic power on with 30 seconds delay. 45 = Enable automatic power on with 45 seconds delay. 60 = Enable automatic power on with 60 seconds delay. Random = Enable automatic power on with random delay up to 60 seconds. */ rdrptr->RdrTypeUnion.CtrlRec.Num = ILO2_RIBCL_CONTROL_3; rdrptr->RdrTypeUnion.CtrlRec.OutputType = SAHPI_CTRL_GENERIC; rdrptr->RdrTypeUnion.CtrlRec.Type = SAHPI_CTRL_TYPE_DISCRETE; rdrptr->RdrTypeUnion.CtrlRec.TypeUnion.Discrete.Default = ILO2_RIBCL_AUTO_POWER_DISABLED; rdrptr->RdrTypeUnion.CtrlRec.DefaultMode.Mode = SAHPI_CTRL_MODE_MANUAL; rdrptr->RdrTypeUnion.CtrlRec.DefaultMode.ReadOnly = SAHPI_FALSE; rdrptr->RdrTypeUnion.CtrlRec.WriteOnly = SAHPI_FALSE; rdrptr->RdrTypeUnion.CtrlRec.Oem = 0; cinfo.ctl_type = ctl_type; cinfo.cur_mode = rdrptr->RdrTypeUnion.CtrlRec.DefaultMode.Mode; cinfo.cur_state.Discrete = rdrptr->RdrTypeUnion.CtrlRec.TypeUnion.Discrete.Default; } break; default: { err("ilo2_ribcl_controls(): Invalid iLO2 RIBCL control type"); g_free(rdrptr); return(SA_ERR_HPI_INTERNAL_ERROR); } } oh_init_textbuffer(&(rdrptr->IdString)); oh_append_textbuffer(&(rdrptr->IdString), desc); /* Allocate memory to save internal control type in private RDR area This saved value will be used by the control API to determine the the type of the control and send appropriate command down to RIBCL */ cinfo_ptr = g_memdup(&cinfo, sizeof(cinfo)); if(cinfo_ptr == NULL) { err("ilo2_ribcl_controls(): Out of memory."); g_free(rdrptr); return(SA_ERR_HPI_OUT_OF_MEMORY); } err = oh_add_rdr(oh_handler->rptcache, event->resource.ResourceId, rdrptr, cinfo_ptr, 0); if (err) { err("Could not add RDR. Error=%s.", oh_lookup_error(err)); g_free(rdrptr); g_free(cinfo_ptr); return(SA_ERR_HPI_INTERNAL_ERROR); } else { event->rdrs = g_slist_append(event->rdrs, rdrptr); } return(SA_OK); } /** * ilo2_ribcl_add_severity_sensor: * @oh_handler: Handler data pointer. * @event: Pointer to event structure for sensor parent resource event. * @sens_num: Sensor number for new sensor. * @sens_type: HPI type of new sensor. * @supported_states: Mask of all the EV states this sensor can support. * @sens_info: Private sensor info associated with RDR. * @description: Character string description of this sensor. * * This routine creates a new sensor of category SAHPI_EC_SEVERITY, using * the data given by the parameters. The new sensor RDR is added to * the parent resource given in the oh_event structure paramenter. * * The following fields in the SensorRec of the RDR will be set to fixed * values: * EnableCtrl = SAHPI_TRUE; * EventCtrl = SAHPI_SEC_PER_EVENT; * DataFormat.IsSupported = SAHPI_TRUE * DataFormat.ReadingType = SAHPI_SENSOR_READING_TYPE_UINT64 * DataFormat.BaseUnits = SAHPI_SU_UNSPECIFIED * DataFormat.ModifierUse = SAHPI_SMUU_NONE * DataFormat.Percentage = SAHPI_FALSE * ThresholdDefn.IsAccessible = SAHPI_FALSE * * Return values: * SA_ERR_HPI_OUT_OF_MEMORY - memory allocation failed. * SA_ERR_HPI_INTERNAL_ERROR - could not add sensor RDR **/ static SaErrorT ilo2_ribcl_add_severity_sensor( struct oh_handler_state *oh_handler, struct oh_event *event, int sens_num, SaHpiSensorTypeT sens_type, SaHpiEventStateT supported_states, struct ilo2_ribcl_sensinfo *sens_info, char *description) { SaErrorT ret = SA_OK; SaHpiRdrT *rdr; SaHpiSensorRecT *sensor_rec; struct ilo2_ribcl_sensinfo *si; rdr = (SaHpiRdrT *)g_malloc0(sizeof(SaHpiRdrT)); if( rdr == NULL){ err("ilo2_ribcl_add_severity_sensor: Memory allocation failed."); return(SA_ERR_HPI_OUT_OF_MEMORY); } /* Fill in generic RDR stuff */ rdr->RdrType = SAHPI_SENSOR_RDR; rdr->Entity = event->resource.ResourceEntity; rdr->IsFru = SAHPI_FALSE; /* Fill in sensor specific info */ sensor_rec = &(rdr->RdrTypeUnion.SensorRec); sensor_rec->Num = sens_num; sensor_rec->Type = sens_type; sensor_rec->Category = SAHPI_EC_SEVERITY; sensor_rec->EnableCtrl = SAHPI_TRUE; sensor_rec->EventCtrl = SAHPI_SEC_PER_EVENT; sensor_rec->Events = supported_states; sensor_rec->DataFormat.IsSupported = SAHPI_TRUE; sensor_rec->DataFormat.ReadingType = SAHPI_SENSOR_READING_TYPE_UINT64; sensor_rec->DataFormat.BaseUnits = SAHPI_SU_UNSPECIFIED; sensor_rec->DataFormat.ModifierUse = SAHPI_SMUU_NONE; sensor_rec->DataFormat.Percentage = SAHPI_FALSE; /* Range and AccuracyFactor have been cleared by g_malloc0() */ sensor_rec->ThresholdDefn.IsAccessible = SAHPI_FALSE; oh_init_textbuffer(&(rdr->IdString)); oh_append_textbuffer(&(rdr->IdString), description); /* Copy the private sensor data initial values into a new allocation * to be associated with this RDR. */ si = g_memdup(sens_info, sizeof(struct ilo2_ribcl_sensinfo)); if( si == NULL){ g_free( rdr); err("ilo2_ribcl_add_severity_sensor: Memory allocation failed."); return(SA_ERR_HPI_OUT_OF_MEMORY); } ret = oh_add_rdr(oh_handler->rptcache, event->resource.ResourceId, rdr, si, 0); if( ret != SA_OK){ err("ilo2_ribcl_add_severity_sensor: could not add RDR. Error = %s.", oh_lookup_error(ret)); g_free( si); g_free( rdr); return( SA_ERR_HPI_INTERNAL_ERROR); } else { event->rdrs = g_slist_append(event->rdrs, rdr); } return( SA_OK); } /* end ilo2_ribcl_add_severity_sensor() */ /** * ilo2_ribcl_discover_chassis_sensors: * @oh_handler: Handler data pointer. * @event: Pointer to event structure for chassis resource event. * * This routine will create RDRs on the chassis rpt entry for the following * three sensors, if they have been detected during a discovery operation. * These sensors correspond to the system's general health, and are created * from information given in the HEALTH_AT_AT_GLANCE stanza returned by the * GET_EMBEDDED_HEALTH RIBCL command. * * Sensor 1: System Fan Health * This sensor is of type SAHPI_FAN. * This sensor is of class SAHPI_EC_SEVERITY, and supports the severity * states SAHPI_ES_OK, SAHPI_ES_MAJOR_FROM_LESS, * SAHPI_ES_MAJOR_FROM_CRITICAL, and SAHPI_ES_CRITICAL. * Its reading values (int64) are: * I2R_SEN_VAL_OK (0) - RIBCL reports "Ok" * I2R_SEN_VAL_DEGRADED (1) - RIBCL reports "Degraded" * I2R_SEN_VAL_FAILED (2) - RIBCL reports "Failed" * * Sensor 2: System Temperature Health. * This sensor is of type SAHPI_TEMPERATURE. * This sensor is of class SAHPI_EC_SEVERITY, and supports the severity * states SAHPI_ES_OK, and SAHPI_ES_CRITICAL. * Its reading values (int64) are: * I2R_SEN_VAL_OK (0) - RIBCL reports "Ok" * I2R_SEN_VAL_FAILED (2) - RIBCL reports "Failed" * * Sensor 3: System Power Supply Health * This sensor is of type SAHPI_POWER_SUPPLY. * This sensor is of class SAHPI_EC_SEVERITY, and supports the severity * states SAHPI_ES_OK, SAHPI_ES_MAJOR_FROM_LESS, * SAHPI_ES_MAJOR_FROM_CRITICAL, and SAHPI_ES_CRITICAL. * Its reading values (int64) are: * I2R_SEN_VAL_OK (0) - RIBCL reports "Ok" * I2R_SEN_VAL_DEGRADED (1) - RIBCL reports "Degraded" * I2R_SEN_VAL_FAILED (2) - RIBCL reports "Failed" * * Return values: * None **/ static void ilo2_ribcl_discover_chassis_sensors( struct oh_handler_state *oh_handler, struct oh_event *event) { SaErrorT ret = SA_OK; ilo2_ribcl_handler_t *ir_handler = NULL; struct ilo2_ribcl_sensinfo si_initial; I2R_SensorDataT *sensordat; ir_handler = (ilo2_ribcl_handler_t *) oh_handler->data; /* Look for the system fan health intication from the RIBCL * HEALTH_AT_A_GLANCE stanza from GET_EMBEDDED_HEALTH */ sensordat = &(ir_handler->DiscoveryData.chassis_sensors[I2R_SEN_FANHEALTH]); if( sensordat->reading.intval != I2R_SEN_VAL_UNINITIALIZED){ si_initial.sens_num = I2R_SEN_FANHEALTH; si_initial.sens_ev_state = SAHPI_ES_OK; si_initial.sens_enabled = SAHPI_TRUE; si_initial.sens_ev_enabled = SAHPI_TRUE; si_initial.sens_assertmask = I2R_SEVERITY_THREESTATE_EV; si_initial.sens_deassertmask = I2R_SEVERITY_THREESTATE_EV; si_initial.sens_value = I2R_SEN_VAL_UNINITIALIZED; ret = ilo2_ribcl_add_severity_sensor( oh_handler, event, I2R_SEN_FANHEALTH, SAHPI_FAN, I2R_SEVERITY_THREESTATE_EV, &si_initial, I2R_SEN_FANHEALTH_DESCRIPTION); if( ret == SA_OK){ sensordat->state = I2R_INITIAL; sensordat->rid = event->resource.ResourceId; ilo2_ribcl_add_resource_capability( oh_handler, event, (SAHPI_CAPABILITY_RDR | SAHPI_CAPABILITY_SENSOR)); } else { err("ilo2_ribcl_discover_chassis_sensors: Failed to set up fan health sensor."); } } /* Look for the system temperature health intication from the RIBCL * HEALTH_AT_A_GLANCE stanza from GET_EMBEDDED_HEALTH */ sensordat = &(ir_handler->DiscoveryData.chassis_sensors[I2R_SEN_TEMPHEALTH]); if( sensordat->reading.intval != I2R_SEN_VAL_UNINITIALIZED){ si_initial.sens_num = I2R_SEN_TEMPHEALTH; si_initial.sens_ev_state = SAHPI_ES_OK; si_initial.sens_enabled = SAHPI_TRUE; si_initial.sens_ev_enabled = SAHPI_TRUE; si_initial.sens_assertmask = I2R_SEVERITY_TWOSTATE_EV; si_initial.sens_deassertmask = I2R_SEVERITY_TWOSTATE_EV; si_initial.sens_value = I2R_SEN_VAL_UNINITIALIZED; ret = ilo2_ribcl_add_severity_sensor( oh_handler, event, I2R_SEN_TEMPHEALTH, SAHPI_TEMPERATURE, I2R_SEVERITY_TWOSTATE_EV, &si_initial, I2R_SEN_TEMPHEALTH_DESCRIPTION); if( ret == SA_OK){ sensordat->state = I2R_INITIAL; sensordat->rid = event->resource.ResourceId; ilo2_ribcl_add_resource_capability( oh_handler, event, (SAHPI_CAPABILITY_RDR | SAHPI_CAPABILITY_SENSOR)); } else { err("ilo2_ribcl_discover_chassis_sensors: Failed to set up temperature health sensor."); } } /* Look for the system power supply health intication from the RIBCL * HEALTH_AT_A_GLANCE stanza from GET_EMBEDDED_HEALTH */ sensordat = &(ir_handler->DiscoveryData.chassis_sensors[I2R_SEN_POWERHEALTH]); if( sensordat->reading.intval != I2R_SEN_VAL_UNINITIALIZED){ si_initial.sens_num = I2R_SEN_POWERHEALTH; si_initial.sens_ev_state = SAHPI_ES_OK; si_initial.sens_enabled = SAHPI_TRUE; si_initial.sens_ev_enabled = SAHPI_TRUE; si_initial.sens_assertmask = I2R_SEVERITY_THREESTATE_EV; si_initial.sens_deassertmask = I2R_SEVERITY_THREESTATE_EV; si_initial.sens_value = I2R_SEN_VAL_UNINITIALIZED; ret = ilo2_ribcl_add_severity_sensor( oh_handler, event, I2R_SEN_POWERHEALTH, SAHPI_POWER_SUPPLY, I2R_SEVERITY_THREESTATE_EV, &si_initial, I2R_SEN_POWERHEALTH_DESCRIPTION); if( ret == SA_OK){ sensordat->state = I2R_INITIAL; sensordat->rid = event->resource.ResourceId; ilo2_ribcl_add_resource_capability( oh_handler, event, (SAHPI_CAPABILITY_RDR | SAHPI_CAPABILITY_SENSOR)); } else { err("ilo2_ribcl_discover_chassis_sensors: Failed to set up power supply health sensor."); } } } /* end ilo2_ribcl_discover_chassis_sensors() */ /** * ilo2_ribcl_add_resource_capability: * @oh_handler: Handler data pointer. * @event: Pointer to event structure for the resource event. * @capability: Capabilitiy (or capabilities) to add to this resource. * * Add the new resource capability (or capabilities) given in the 'capability' * parameter to the resource in the event structure, which is presumably a * resource event. Also, look up the rpt entry already in our handler's * rptcache, and if it exists, add the resource capability there also. * * Return values: * None **/ void ilo2_ribcl_add_resource_capability( struct oh_handler_state *oh_handler, struct oh_event *event, SaHpiCapabilitiesT capability) { SaHpiRptEntryT *rpt; /* Set the capabilities of the resource in this event structure */ event->resource.ResourceCapabilities |= capability; /* Now, just in case we've already performed a oh_add_resource() * call to place this resource into our handler's rptcache, look * it up using the entity path, and add the capability there, too. */ rpt = oh_get_resource_by_ep( oh_handler->rptcache, &(event->resource.ResourceEntity)); if( rpt != NULL){ rpt->ResourceCapabilities |= capability; } } /* end ilo2_ribcl_add_resource_capability() */ #ifdef ILO2_RIBCL_SIMULATE_iLO2_RESPONSE /** * ilo2_ribcl_getfile * @fname: The file name. * @buffer: Ptr for the destination buffer. * @bufsize: Size of the destination buffer. * * This function, intended for testing, will read the contents of file * 'fname' into the buffer pointed to by 'buffer'. * * Return values: 0 if Success, 1 otherwise. **/ static int ilo2_ribcl_getfile( char *fname, char *buffer, int bufsize) { int fd; struct stat stbuf; int i; int rcount; if( (fd = open( fname, O_RDONLY)) == -1){ err("ilo2_ribcl_getfile(): Open failed for file %s", fname); return( 1); } if( fstat( fd, &stbuf) != 0){ err("ilo2_ribcl_getfile: Stat failed for file %s", fname); close(fd); return( 1); } if( (stbuf.st_size + 1) > bufsize){ err("ilo2_ribcl_getfile(): File exceeds buffer by %ld bytes.", (stbuf.st_size + 1) - bufsize); close(fd); return( 1); } i = 0; while( (rcount = read( fd, &buffer[i], 1)) != 0){ if( rcount == -1){ err("ilo2_ribcl_getfile(): Read error at byte %d", i); close(fd); return( 1); } i++; /* If someone is writing to the file after we did the above * fstat, we could overflow the buffer. */ if( i >= (bufsize -1)){ break; } } buffer[i] = 0; /* Null terminate */ close(fd); return( 0); /* Success */ } /* end ilo2_ribcl_getfile() */ #endif /* ILO2_RIBCL_SIMULATE_iLO2_RESPONSE */ /***************************** OpenHPI plug-in to iLO2 RIBCL plug-in ABI function mapping *****************************/ void * oh_discover_resources (void *) __attribute__ ((weak, alias("ilo2_ribcl_discover_resources"))); openhpi-2.14.1/plugins/ilo2_ribcl/ilo2_ribcl_control.c0000644000076400007640000006267411302566624017642 0ustar /* * Copyright (C) 2007-2008, Hewlett-Packard Development Company, LLP * All rights reserved. * * 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. * * Neither the name of the Hewlett-Packard Corporation, nor the names * of its contributors may be used to endorse or promote products * derived from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * Author(s) * Shuah Khan * Richard White */ /*************** * This source file contains Control HPI ABI routines iLO2 RIBCL plug-in * implements. Other source files provide support functionality for * these ABIs. ***************/ #include #include #include /************************************ Forward declarations for static functions in this file ************************************/ static SaErrorT ilo2_ribcl_get_uid_status(ilo2_ribcl_handler_t *, SaHpiCtrlStateDigitalT *); static SaErrorT ilo2_ribcl_set_uid_status(ilo2_ribcl_handler_t *, SaHpiCtrlStateDigitalT ); static SaErrorT ilo2_ribcl_get_power_saver_status(ilo2_ribcl_handler_t *, SaHpiCtrlStateDiscreteT *); static SaErrorT ilo2_ribcl_set_power_saver_status(ilo2_ribcl_handler_t *, SaHpiCtrlStateDiscreteT ); static SaErrorT ilo2_ribcl_get_auto_power_status(ilo2_ribcl_handler_t *, SaHpiCtrlStateDiscreteT *); static SaErrorT ilo2_ribcl_set_auto_power_status(ilo2_ribcl_handler_t *, SaHpiCtrlStateDiscreteT); /***************************** iLO2 RIBCL plug-in Control ABI Interface functions *****************************/ /** * ilo2_ribcl_get_control_state: * @hnd: Handler data pointer. * @rid: Resource ID. * @cid: Control ID. * @mode: Location to store control's operational mode. * @state: Location to store control's state. * * Retrieves a control's operational mode and/or state. Both @mode and @state * may be NULL (e.g. check for presence). * * Return values: * SA_OK - Normal case. * SA_ERR_HPI_CAPABILITY - Resource doesn't have SAHPI_CAPABILITY_CONTROL. * SA_ERR_HPI_INVALID_CMD - Control is write-only. * SA_ERR_HPI_INVALID_DATA - @state contain invalid text line number. * SA_ERR_HPI_INVALID_RESOURCE - Resource doesn't exist. * SA_ERR_HPI_NOT_PRESENT - Control doesn't exist. **/ SaErrorT ilo2_ribcl_get_control_state(void *hnd, SaHpiResourceIdT rid, SaHpiCtrlNumT cid, SaHpiCtrlModeT *mode, SaHpiCtrlStateT *state) { struct oh_handler_state *handle = NULL; ilo2_ribcl_handler_t *ilo2_ribcl_handler = NULL; SaHpiRptEntryT *rpt = NULL; SaHpiRdrT *rdr = NULL; ilo2_ribcl_cinfo_t *cinfo_ptr = NULL; SaHpiCtrlStateDiscreteT status; if (!hnd || !state) { err("ilo2_ribcl_get_control_state(): Invalid parameter."); return(SA_ERR_HPI_INVALID_PARAMS); } handle = (struct oh_handler_state *)hnd; ilo2_ribcl_handler = (ilo2_ribcl_handler_t *)handle->data; if (!ilo2_ribcl_handler) { err("ilo2_ribcl_get_control_state(): Invalid parameter."); return(SA_ERR_HPI_INVALID_PARAMS); } /* Check if resource exists and has control capabilities */ rpt = oh_get_resource_by_id(handle->rptcache, rid); if (!rpt) { err("ilo2_ribcl_get_control_state(): Invalid resource."); return(SA_ERR_HPI_INVALID_RESOURCE); } if (!(rpt->ResourceCapabilities & SAHPI_CAPABILITY_CONTROL)) { err("ilo2_ribcl_get_control_state(): Resource doesn't have control capability."); return(SA_ERR_HPI_CAPABILITY); } /* Find control and its mapping data - see if it accessable */ rdr = oh_get_rdr_by_type(handle->rptcache, rid, SAHPI_CTRL_RDR, cid); if (rdr == NULL) { err("ilo2_ribcl_get_control_state(): Control RDR is not present."); return(SA_ERR_HPI_NOT_PRESENT); } /* Fetch RDR data to determine the control type */ cinfo_ptr = (ilo2_ribcl_cinfo_t *) oh_get_rdr_data(handle->rptcache, rid, rdr->RecordId); if(cinfo_ptr == NULL) { err("ilo2_ribcl_get_control_state(): No control data. Control=%s", rdr->IdString.Data); return(SA_ERR_HPI_INTERNAL_ERROR); } /* check if this control has WriteOnly flag set. If so return SA_ERR_HPI_INVALID_CMD. Please see the OpenHPI Spec for details */ if (rdr->RdrTypeUnion.CtrlRec.WriteOnly) { err("ilo2_ribcl_get_control_state(): WriteOnly Control=%s", rdr->IdString.Data); return(SA_ERR_HPI_INVALID_CMD); } /* if mode and state are null return SA_OK. Spec allows these out parms to be null and allows this call to return without setting mode and/or state respectively */ if(!mode && !state) { return(SA_OK); } switch(cinfo_ptr->ctl_type) { case ILO2_RIBCL_CTL_UID: { if(mode) { *mode = cinfo_ptr->cur_mode; } if(state) { SaErrorT ret = SA_OK; /* send GET_UID_STATUS to iLO to get the current status of the UID */ if((ret = ilo2_ribcl_get_uid_status( ilo2_ribcl_handler, &status)) != SA_OK) { err("ilo2_ribcl_get_control_state(): Get Uid Status failed for Control=%s", rdr->IdString.Data); return(ret); } state->Type = rdr->RdrTypeUnion.CtrlRec.Type; state->StateUnion.Digital = status; /* update private data current state */ cinfo_ptr->cur_state.Digital = status; } } break; case ILO2_RIBCL_CTL_POWER_SAVER: { if(mode) { *mode = cinfo_ptr->cur_mode; } if(state) { SaErrorT ret = SA_OK; /* send GET_HOST_POWER_SAVER_STATUS to iLO to get the current Power Regulator setting */ if((ret = ilo2_ribcl_get_power_saver_status( ilo2_ribcl_handler, &status)) != SA_OK) { err("ilo2_ribcl_get_control_state(): Get Uid Status failed for Control=%s", rdr->IdString.Data); return(ret); } state->Type = rdr->RdrTypeUnion.CtrlRec.Type; state->StateUnion.Discrete = status; /* update private data current state */ cinfo_ptr->cur_state.Discrete = status; } } break; case ILO2_RIBCL_CTL_AUTO_POWER: { if(mode) { *mode = cinfo_ptr->cur_mode; } if(state) { SaErrorT ret = SA_OK; /* send GET_SERVER_AUTO_PWR to iLO to get the current Auto Power Status */ if((ret = ilo2_ribcl_get_auto_power_status( ilo2_ribcl_handler, &status)) != SA_OK) { err("ilo2_ribcl_get_control_state(): Get Uid Status failed for Control=%s", rdr->IdString.Data); return(ret); } state->Type = rdr->RdrTypeUnion.CtrlRec.Type; state->StateUnion.Discrete = status; /* update private data current state */ cinfo_ptr->cur_state.Discrete = status; } } break; default: { err("ilo2_ribcl_get_control_state(): Invalid internal control type for Control=%s", rdr->IdString.Data); return(SA_ERR_HPI_INTERNAL_ERROR); } } return(SA_OK); } /** * ilo2_ribcl_set_control_state: * @hnd: Handler data pointer. * @rid: Resource ID. * @cid: Control ID. * @mode: Control's operational mode to set. * @state: Pointer to control's state to set. * * Sets a control's operational mode and/or state. * * Return values: * SA_OK - Normal case. * SA_ERR_HPI_CAPABILITY - Resource doesn't have SAHPI_CAPABILITY_CONTROL. * SA_ERR_HPI_INVALID_REQUEST - @state contains bad text control data. * SA_ERR_HPI_INVALID_RESOURCE - Resource doesn't exist. * SA_ERR_HPI_NOT_PRESENT - Control doesn't exist. * SA_ERR_HPI_READ_ONLY - Change mode of a read-only mode control. * Note this is only returned if the specified mode * is different than the control's default mode. **/ SaErrorT ilo2_ribcl_set_control_state(void *hnd, SaHpiResourceIdT rid, SaHpiCtrlNumT cid, SaHpiCtrlModeT mode, SaHpiCtrlStateT *state) { struct oh_handler_state *handle = NULL; ilo2_ribcl_handler_t *ilo2_ribcl_handler = NULL; SaHpiRptEntryT *rpt = NULL; SaHpiRdrT *rdr = NULL; ilo2_ribcl_cinfo_t *cinfo_ptr = NULL; SaErrorT ret; if (!hnd || !state) { err("ilo2_ribcl_get_control_state(): Invalid parameter."); return(SA_ERR_HPI_INVALID_PARAMS); } handle = (struct oh_handler_state *)hnd; ilo2_ribcl_handler = (ilo2_ribcl_handler_t *)handle->data; if (!ilo2_ribcl_handler) { err("ilo2_ribcl_get_control_state(): Invalid parameter."); return(SA_ERR_HPI_INVALID_PARAMS); } /* Check if resource exists and has control capabilities */ rpt = oh_get_resource_by_id(handle->rptcache, rid); if (!rpt) { err("ilo2_ribcl_get_control_state(): Invalid resource."); return(SA_ERR_HPI_INVALID_RESOURCE); } if (!(rpt->ResourceCapabilities & SAHPI_CAPABILITY_CONTROL)) { err("ilo2_ribcl_get_control_state(): Resource doesn't have control capability."); return(SA_ERR_HPI_CAPABILITY); } /* Find control and its mapping data - see if it accessable */ rdr = oh_get_rdr_by_type(handle->rptcache, rid, SAHPI_CTRL_RDR, cid); if (rdr == NULL) { err("ilo2_ribcl_get_control_state(): Control RDR is not present."); return(SA_ERR_HPI_NOT_PRESENT); } /* Fetch RDR data to determine the control type */ cinfo_ptr = (ilo2_ribcl_cinfo_t *) oh_get_rdr_data(handle->rptcache, rid, rdr->RecordId); if(cinfo_ptr == NULL) { err("ilo2_ribcl_get_control_state(): No control data. Control=%s", rdr->IdString.Data); return(SA_ERR_HPI_INTERNAL_ERROR); } /* validate static control state and mode data */ ret = oh_valid_ctrl_state_mode(&(rdr->RdrTypeUnion.CtrlRec), mode, state); if(ret) { return(ret); } /* send appropriate RIBCL command to iLO2 to set the new control state */ if(mode != SAHPI_CTRL_MODE_AUTO && state) { switch(cinfo_ptr->ctl_type) { case ILO2_RIBCL_CTL_UID: { /* Requested state is same as the current. return SA_OK */ if(cinfo_ptr->cur_state.Digital == state->StateUnion.Digital) { return(SA_OK); } if((ret = ilo2_ribcl_set_uid_status( ilo2_ribcl_handler, state->StateUnion.Digital)) != SA_OK) { return(ret); } /* control has been changed to the requested status value, now update the private status info. */ cinfo_ptr->cur_state.Digital = state->StateUnion.Digital; } break; case ILO2_RIBCL_CTL_POWER_SAVER: { /* Requested state is same as the current. return SA_OK */ if(cinfo_ptr->cur_state.Discrete == state->StateUnion.Discrete) { return(SA_OK); } if((ret = ilo2_ribcl_set_power_saver_status( ilo2_ribcl_handler, state->StateUnion.Discrete)) != SA_OK) { return(ret); } /* control has been changed to the requested status value, now update the private status info. */ cinfo_ptr->cur_state.Discrete = state->StateUnion.Discrete; } break; case ILO2_RIBCL_CTL_AUTO_POWER: { /* Requested state is same as the current. return SA_OK */ if(cinfo_ptr->cur_state.Discrete == state->StateUnion.Discrete) { return(SA_OK); } if((ret = ilo2_ribcl_set_auto_power_status( ilo2_ribcl_handler, state->StateUnion.Discrete)) != SA_OK) { return(ret); } /* control has been changed to the requested status value, now update the private status info. */ cinfo_ptr->cur_state.Discrete = state->StateUnion.Discrete; } break; default: { err("ilo2_ribcl_set_control_state(): Invalid internal control type for Control=%s", rdr->IdString.Data); return(SA_ERR_HPI_INTERNAL_ERROR); } } } return(SA_OK); } /** * ilo2_ribcl_get_uid_status: * @hnd: Private Handler data pointer. * @status: Location to store control's state. * * This routine send GET_UID_STATUS RIBCL command to iLO and gets back * the current UID status. This status then gets mapped to HPI status * before returning. * Return values: * SA_OK * SA_ERR_HPI_OUT_OF_MEMORY * SA_ERR_HPI_INTERNAL_ERROR **/ static SaErrorT ilo2_ribcl_get_uid_status(ilo2_ribcl_handler_t *hnd, SaHpiCtrlStateDigitalT *status) { char *uid_cmd; char *response; /* command response buffer */ int ret; int uid_status = -1; /* Allocate a temporary response buffer. */ response = malloc(ILO2_RIBCL_BUFFER_LEN); if( response == NULL){ err("ilo2_ribcl_get_uid_status: Out of memory."); return(SA_ERR_HPI_OUT_OF_MEMORY); } /* Retrieve our customized command buffer */ uid_cmd = hnd->ribcl_xml_cmd[IR_CMD_GET_UID_STATUS]; if( uid_cmd == NULL){ err("ilo2_ribcl_get_uid_status: null customized command."); free( response); return( SA_ERR_HPI_INTERNAL_ERROR); } /* Send the command to iLO2 and get the response. */ ret = ilo2_ribcl_ssl_send_command( hnd, uid_cmd, response, ILO2_RIBCL_BUFFER_LEN); if( ret != 0){ err("ilo2_ribcl_get_uid_status: command send failed."); free( response); return( SA_ERR_HPI_INTERNAL_ERROR); } /* Now, parse the response. */ ret = ir_xml_parse_uid_status(response, &uid_status, hnd->ilo2_hostport); if( ret != RIBCL_SUCCESS){ err("ilo2_ribcl_get_uid_status: response parse failed."); free( response); return( SA_ERR_HPI_INTERNAL_ERROR); } /* We're finished. Free up the temporary response buffer */ free( response); if(uid_status == ILO2_RIBCL_UID_ON) { *status = SAHPI_CTRL_STATE_ON; } else if (uid_status == ILO2_RIBCL_UID_OFF) { *status = SAHPI_CTRL_STATE_OFF; } else { return( SA_ERR_HPI_INTERNAL_ERROR); } return(SA_OK); } /** * ilo2_ribcl_set_uid_status: * @hnd: Private Handler data pointer. * @status: Location to store control's state. * * This routine send UID_CONTROL RIBCL command to iLO to change the * current UID status. This routine maps the passed in HPI status to * RIBCL status before sending the command. * Return values: * SA_OK * SA_ERR_HPI_OUT_OF_MEMORY * SA_ERR_HPI_INTERNAL_ERROR * SA_ERR_HPI_INVALID_PARAMS **/ static SaErrorT ilo2_ribcl_set_uid_status(ilo2_ribcl_handler_t *hnd, SaHpiCtrlStateDigitalT status) { char *uid_cmd; char *response; /* command response buffer */ int ret; if((status != SAHPI_CTRL_STATE_OFF) && (status != SAHPI_CTRL_STATE_ON)) { return(SA_ERR_HPI_INVALID_PARAMS); } /* Allocate a temporary response buffer. */ response = malloc(ILO2_RIBCL_BUFFER_LEN); if( response == NULL){ err("ilo2_ribcl_set_uid_status: Out of memory."); return(SA_ERR_HPI_OUT_OF_MEMORY); } /* Retrieve our customized command buffer */ if(status == SAHPI_CTRL_STATE_OFF) { uid_cmd = hnd->ribcl_xml_cmd[IR_CMD_UID_CONTROL_OFF]; } else { uid_cmd = hnd->ribcl_xml_cmd[IR_CMD_UID_CONTROL_ON]; } if( uid_cmd == NULL){ err("ilo2_ribcl_set_uid_status: null customized command."); free( response); return( SA_ERR_HPI_INTERNAL_ERROR); } /* Send the command to iLO2 and get the response. */ ret = ilo2_ribcl_ssl_send_command( hnd, uid_cmd, response, ILO2_RIBCL_BUFFER_LEN); if( ret != 0){ err("ilo2_ribcl_set_uid_status: command send failed."); free( response); return( SA_ERR_HPI_INTERNAL_ERROR); } /* Now, parse the response. */ ret = ir_xml_parse_status(response, hnd->ilo2_hostport); if( ret != RIBCL_SUCCESS){ err("ilo2_ribcl_set_uid_status: response parse failed."); free( response); return( SA_ERR_HPI_INTERNAL_ERROR); } /* We're finished. Free up the temporary response buffer */ free( response); return(SA_OK); } /** * ilo2_ribcl_get_power_saver_status: * @hnd: Private Handler data pointer. * @status: Location to store control's state. * * This routine send GET_HOST_POWER_SAVER_STATUS RIBCL command to iLO * and gets back the current Power Regulator status. This status then * gets mapped to HPI status before returning. * Return values: * SA_OK * SA_ERR_HPI_OUT_OF_MEMORY * SA_ERR_HPI_INTERNAL_ERROR **/ static SaErrorT ilo2_ribcl_get_power_saver_status(ilo2_ribcl_handler_t *hnd, SaHpiCtrlStateDiscreteT *status) { char *ps_cmd; char *response; /* command response buffer */ int ret; int ps_status = -1; /* Allocate a temporary response buffer. */ response = malloc(ILO2_RIBCL_BUFFER_LEN); if( response == NULL){ err("ilo2_ribcl_get_power_saver_status: Out of memory."); return(SA_ERR_HPI_OUT_OF_MEMORY); } /* Retrieve our customized command buffer */ ps_cmd = hnd->ribcl_xml_cmd[IR_CMD_GET_HOST_POWER_SAVER_STATUS]; if( ps_cmd == NULL){ err("ilo2_ribcl_get_power_saver_status: null customized command."); free( response); return( SA_ERR_HPI_INTERNAL_ERROR); } /* Send the command to iLO2 and get the response. */ ret = ilo2_ribcl_ssl_send_command( hnd, ps_cmd, response, ILO2_RIBCL_BUFFER_LEN); if( ret != 0){ err("ilo2_ribcl_get_power_saver_status: command send failed."); free( response); return( SA_ERR_HPI_INTERNAL_ERROR); } /* Now, parse the response. */ ret = ir_xml_parse_power_saver_status(response, &ps_status, hnd->ilo2_hostport); if( ret != RIBCL_SUCCESS) { err("ilo2_ribcl_get_power_saver_status: response parse failed."); free( response); return( SA_ERR_HPI_INTERNAL_ERROR); } /* We're finished. Free up the temporary response buffer */ free( response); if (ps_status >= ILO2_RIBCL_MANUAL_OS_CONTROL_MODE && ps_status <= ILO2_RIBCL_MANUAL_HIGH_PERF_MODE) { *status = ps_status; } else { return( SA_ERR_HPI_INTERNAL_ERROR); } return(SA_OK); } /** * ilo2_ribcl_set_power_saver_status: * @hnd: Private Handler data pointer. * @status: Location to store control's state. * * This routine send SET_HOST_POWER_SAVER RIBCL command to iLO to change the * current Power Saver status. This routine maps the passed in HPI status to * RIBCL status before sending the command. * Return values: * SA_OK * SA_ERR_HPI_OUT_OF_MEMORY * SA_ERR_HPI_INTERNAL_ERROR * SA_ERR_HPI_INVALID_PARAMS **/ static SaErrorT ilo2_ribcl_set_power_saver_status(ilo2_ribcl_handler_t *hnd, SaHpiCtrlStateDiscreteT status) { char *ps_cmd; char *response; /* command response buffer */ int ret; if((status < ILO2_RIBCL_MANUAL_OS_CONTROL_MODE) || (status > ILO2_RIBCL_MANUAL_HIGH_PERF_MODE)) { return(SA_ERR_HPI_INVALID_PARAMS); } /* Allocate a temporary response buffer. */ response = malloc(ILO2_RIBCL_BUFFER_LEN); if( response == NULL){ err("ilo2_ribcl_set_power_saver_status: Out of memory."); return(SA_ERR_HPI_OUT_OF_MEMORY); } /* Retrieve our customized command buffer */ if(status == ILO2_RIBCL_MANUAL_OS_CONTROL_MODE) { ps_cmd = hnd->ribcl_xml_cmd[IR_CMD_SET_HOST_POWER_SAVER_1]; } else if(status == ILO2_RIBCL_MANUAL_LOW_POWER_MODE) { ps_cmd = hnd->ribcl_xml_cmd[IR_CMD_SET_HOST_POWER_SAVER_2]; } else if(status == ILO2_RIBCL_AUTO_POWER_SAVE_MODE) { ps_cmd = hnd->ribcl_xml_cmd[IR_CMD_SET_HOST_POWER_SAVER_3]; } else if(status == ILO2_RIBCL_MANUAL_HIGH_PERF_MODE) { ps_cmd = hnd->ribcl_xml_cmd[IR_CMD_SET_HOST_POWER_SAVER_4]; } else { free( response); return(SA_ERR_HPI_INVALID_PARAMS); } if( ps_cmd == NULL){ err("ilo2_ribcl_set_power_saver_status: null customized command."); free( response); return( SA_ERR_HPI_INTERNAL_ERROR); } /* Send the command to iLO2 and get the response. */ ret = ilo2_ribcl_ssl_send_command( hnd, ps_cmd, response, ILO2_RIBCL_BUFFER_LEN); if( ret != 0){ err("ilo2_ribcl_set_power_saver_status: command send failed."); free( response); return( SA_ERR_HPI_INTERNAL_ERROR); } /* Now, parse the response. */ ret = ir_xml_parse_status(response, hnd->ilo2_hostport); if( ret != RIBCL_SUCCESS){ err("ilo2_ribcl_set_power_saver_status: response parse failed."); free( response); /* DL365 G1 doesn't support Power Saver Feature and DL385 G2 supports just the ILO2_RIBCL_MANUAL_LOW_POWER_MODE */ if(ret == RIBCL_UNSUPPORTED) { return(SA_ERR_HPI_UNSUPPORTED_API); } return( SA_ERR_HPI_INTERNAL_ERROR); } /* We're finished. Free up the temporary response buffer */ free( response); return(SA_OK); } /** * ilo2_ribcl_get_auto_power_status: * @hnd: Private Handler data pointer. * @status: Location to store control's state. * * This routine send GET_SERVER_AUTO_PWR RIBCL command to iLO * and gets back the current Auto Power status. This status then * gets mapped to HPI status before returning. * Return values: * SA_OK * SA_ERR_HPI_OUT_OF_MEMORY * SA_ERR_HPI_INTERNAL_ERROR **/ static SaErrorT ilo2_ribcl_get_auto_power_status(ilo2_ribcl_handler_t *hnd, SaHpiCtrlStateDiscreteT *status) { char *ps_cmd; char *response; /* command response buffer */ int ret; int ps_status = -1; /* Allocate a temporary response buffer. */ response = malloc(ILO2_RIBCL_BUFFER_LEN); if( response == NULL){ err("ilo2_ribcl_get_auto_power_status: Out of memory."); return(SA_ERR_HPI_OUT_OF_MEMORY); } /* Retrieve our customized command buffer */ ps_cmd = hnd->ribcl_xml_cmd[IR_CMD_GET_SERVER_AUTO_PWR]; if( ps_cmd == NULL){ err("ilo2_ribcl_get_auto_power_status: null customized command."); free( response); return( SA_ERR_HPI_INTERNAL_ERROR); } /* Send the command to iLO2 and get the response. */ ret = ilo2_ribcl_ssl_send_command( hnd, ps_cmd, response, ILO2_RIBCL_BUFFER_LEN); if( ret != 0){ err("ilo2_ribcl_get_auto_power_status: command send failed."); free( response); return( SA_ERR_HPI_INTERNAL_ERROR); } /* Now, parse the response. */ ret = ir_xml_parse_auto_power_status(response, &ps_status, hnd->ilo2_hostport); if( ret != RIBCL_SUCCESS) { err("ilo2_ribcl_get_auto_power_status: response parse failed."); free( response); return( SA_ERR_HPI_INTERNAL_ERROR); } /* We're finished. Free up the temporary response buffer */ free( response); if (ps_status >= ILO2_RIBCL_AUTO_POWER_ENABLED && ps_status <= ILO2_RIBCL_AUTO_POWER_DELAY_60) { *status = ps_status; } else { return( SA_ERR_HPI_INTERNAL_ERROR); } return(SA_OK); } /** * ilo2_ribcl_set_auto_power_status: * @hnd: Private Handler data pointer. * @status: Location to store control's state. * * This routine send SERVER_AUTO_PWR RIBCL command to iLO to change the * current Auto Power setting/status. This routine maps the passed in * HPI status to RIBCL status before sending the command. * Return values: * SA_OK * SA_ERR_HPI_OUT_OF_MEMORY * SA_ERR_HPI_INTERNAL_ERROR * SA_ERR_HPI_INVALID_PARAMS **/ static SaErrorT ilo2_ribcl_set_auto_power_status(ilo2_ribcl_handler_t *hnd, SaHpiCtrlStateDiscreteT status) { char *ps_cmd; char *response; /* command response buffer */ int ret; if((status != ILO2_RIBCL_AUTO_POWER_ENABLED) && (status != ILO2_RIBCL_AUTO_POWER_DISABLED) && (status != ILO2_RIBCL_AUTO_POWER_DELAY_RANDOM) && (status != ILO2_RIBCL_AUTO_POWER_DELAY_15) && (status != ILO2_RIBCL_AUTO_POWER_DELAY_30) && (status != ILO2_RIBCL_AUTO_POWER_DELAY_45) && (status != ILO2_RIBCL_AUTO_POWER_DELAY_60)) { return(SA_ERR_HPI_INVALID_PARAMS); } /* Allocate a temporary response buffer. */ response = malloc(ILO2_RIBCL_BUFFER_LEN); if( response == NULL){ err("ilo2_ribcl_set_auto_power_status: Out of memory."); return(SA_ERR_HPI_OUT_OF_MEMORY); } /* Retrieve our customized command buffer */ if(status == ILO2_RIBCL_AUTO_POWER_ENABLED) { ps_cmd = hnd->ribcl_xml_cmd[IR_CMD_SERVER_AUTO_PWR_YES]; } else if(status == ILO2_RIBCL_AUTO_POWER_DISABLED) { ps_cmd = hnd->ribcl_xml_cmd[IR_CMD_SERVER_AUTO_PWR_NO]; } else if(status == ILO2_RIBCL_AUTO_POWER_DELAY_RANDOM) { ps_cmd = hnd->ribcl_xml_cmd[IR_CMD_SERVER_AUTO_PWR_RANDOM]; } else if(status == ILO2_RIBCL_AUTO_POWER_DELAY_15) { ps_cmd = hnd->ribcl_xml_cmd[IR_CMD_SERVER_AUTO_PWR_15]; } else if(status == ILO2_RIBCL_AUTO_POWER_DELAY_30) { ps_cmd = hnd->ribcl_xml_cmd[IR_CMD_SERVER_AUTO_PWR_30]; } else if(status == ILO2_RIBCL_AUTO_POWER_DELAY_45) { ps_cmd = hnd->ribcl_xml_cmd[IR_CMD_SERVER_AUTO_PWR_45]; } else if(status == ILO2_RIBCL_AUTO_POWER_DELAY_60) { ps_cmd = hnd->ribcl_xml_cmd[IR_CMD_SERVER_AUTO_PWR_60]; } else { free( response); return(SA_ERR_HPI_INVALID_PARAMS); } if( ps_cmd == NULL){ err("ilo2_ribcl_set_auto_power_status: null customized command."); free( response); return( SA_ERR_HPI_INTERNAL_ERROR); } /* Send the command to iLO2 and get the response. */ ret = ilo2_ribcl_ssl_send_command( hnd, ps_cmd, response, ILO2_RIBCL_BUFFER_LEN); if( ret != 0){ err("ilo2_ribcl_set_auto_power_status: command send failed."); free( response); return( SA_ERR_HPI_INTERNAL_ERROR); } /* Now, parse the response. */ ret = ir_xml_parse_status(response, hnd->ilo2_hostport); if( ret != RIBCL_SUCCESS){ err("ilo2_ribcl_set_auto_power_status: response parse failed."); free( response); return( SA_ERR_HPI_INTERNAL_ERROR); } /* We're finished. Free up the temporary response buffer */ free( response); return(SA_OK); } /***************************** OpenHPI plug-in to iLO2 RIBCL plug-in ABI function mapping *****************************/ void * oh_get_control_state (void *, SaHpiResourceIdT, SaHpiCtrlNumT, SaHpiCtrlModeT *, SaHpiCtrlStateT *) __attribute__ ((weak, alias("ilo2_ribcl_get_control_state"))); void * oh_set_control_state (void *, SaHpiResourceIdT,SaHpiCtrlNumT, SaHpiCtrlModeT, SaHpiCtrlStateT *) __attribute__ ((weak, alias("ilo2_ribcl_set_control_state"))); openhpi-2.14.1/plugins/ilo2_ribcl/ilo2_ribcl.c0000644000076400007640000003053111302566624016065 0ustar /* * Copyright (C) 2007-2008, Hewlett-Packard Development Company, LLP * All rights reserved. * * 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. * * Neither the name of the Hewlett-Packard Corporation, nor the names * of its contributors may be used to endorse or promote products * derived from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * Author(s) * Shuah Khan * Richard White */ /*************** * This source file contains open, close, get_event, and discover_resources * HPI ABI routines iLO2 RIBCL plug-in implements. Other source files will * provide support functionality for these ABIs. ***************/ #include #include #include #include #include #include static SaHpiEntityPathT g_epbase; /* root entity path (from config) */ /***************************** iLO2 RIBCL plug-in ABI Interface functions *****************************/ /** * ilo2_ribcl_open: open (initiate) instance of the iLO2 RIBCL plug-in * @handler_config: Pointer to openhpi config file. * * This function opens an instance of the iLO2 RIBCL plugin. * Detailed description: * - Reads iLO2 IP address and hostname from the configfile hash * - Reads iLO2 user name and password from the configfile hash. * - Intializes plugin internal data structures. Allocates memory * for RIBCL send/receive buffers. * - Initilaizes iLO2 RIBCL SSL module to communicate with iLO2. * - Error handling: Frees allocated memory (if any) before returning. * * Return values: * Plugin handle - normal operation. * NULL - on error. **/ void *ilo2_ribcl_open(GHashTable *handler_config, unsigned int hid, oh_evt_queue *eventq) { struct oh_handler_state *oh_handler = NULL; ilo2_ribcl_handler_t *ilo2_ribcl_handler = NULL; char *ilo2_hostname = NULL; char *ilo2_port_str = NULL; char *ilo2_user_name = NULL; char *ilo2_password = NULL; char *entity_root = NULL; int host_len = 0; int port_len = 0; int temp_len = 0; #ifdef ILO2_RIBCL_SIMULATE_iLO2_RESPONSE char *d_responsefile; size_t fnamesize; #endif /* #ifdef ILO2_RIBCL_SIMULATE_iLO2_RESPONSE */ /* check input parameters */ if (!handler_config) { err("ilo2_ribcl Open:No config file provided."); return(NULL); } else if (!hid) { err("ilo2 ribcl Open:Bad handler id passed."); return NULL; } else if (!eventq) { err("ilo2 ribcl Open:No event queue was passed."); return NULL; } /* set up entity root in g_epbase */ entity_root = (char *)g_hash_table_lookup(handler_config, "entity_root"); if(!entity_root) { err("ilo2 ribcl Open:entity root is not present"); return(NULL); } oh_encode_entitypath(entity_root, &g_epbase); /* read hostname, port string user_name, and password from the config file */ ilo2_hostname = (char *)g_hash_table_lookup(handler_config, "ilo2_ribcl_hostname"); if(!ilo2_hostname) { err("ilo2 ribcl Open:ilo2_ribcl_hostname is not specified in the config file"); return(NULL); } host_len = strlen(ilo2_hostname); if((host_len < ILO2_HOST_NAME_MIN_LEN) || (host_len > ILO2_HOST_NAME_MAX_LEN)) { err("ilo2 ribcl Open: Invalid iLO2 IP address"); return(NULL); } ilo2_port_str = (char *)g_hash_table_lookup(handler_config, "ilo2_ribcl_portstr"); if(!ilo2_port_str) { err("ilo2 ribcl Open:ilo2_ribcl_port_str is not specified in the config file"); return(NULL); } else if((port_len = strlen(ilo2_port_str)) < ILO2_MIN_PORT_STR_LEN) { err("ilo2 ribcl Open:Invalid iLO2 port"); return(NULL); } ilo2_user_name = (char *)g_hash_table_lookup(handler_config, "ilo2_ribcl_username"); if(!ilo2_user_name) { err("ilo2 ribcl Open:ilo2_ribcl_username is not specified in the config file"); return(NULL); } temp_len = strlen(ilo2_user_name); if(temp_len > ILO2_RIBCL_USER_NAME_MAX_LEN) { err("ilo2 ribcl Open:Invalid ilo2_ribcl_username - too long"); return(NULL); } else if(temp_len < ILO2_RIBCL_USER_NAME_MIN_LEN) { err("ilo2 ribcl Open:Invalid ilo2_ribcl_username - too short"); return(NULL); } ilo2_password = (char *)g_hash_table_lookup(handler_config, "ilo2_ribcl_password"); if(!ilo2_password) { err("ilo2 ribcl Open:ilo2_ribcl_password is not specified in the config file"); return(NULL); } temp_len = strlen(ilo2_password); if(temp_len > ILO2_RIBCL_PASSWORD_MAX_LEN) { err("ilo2 ribcl Open:Invalid ilo2_ribcl_password - too long"); return(NULL); } else if(temp_len < ILO2_RIBCL_PASSWORD_MIN_LEN) { err("ilo2 ribcl Open:Invalid ilo2_ribcl_password - too short"); return(NULL); } /* allocate main handler and initialize it */ oh_handler = malloc(sizeof(*oh_handler)); if(!oh_handler) { err("ilo2 ribcl Open:unable to allocate main handler"); return(NULL); } memset(oh_handler, '\0', sizeof(*oh_handler)); /* assign config to handler_config and initialize rptcache */ oh_handler->config = handler_config; oh_handler->rptcache = (RPTable *)g_malloc0(sizeof(RPTable)); if(!oh_handler->rptcache) { err("ilo2 ribcl Open:unable to allocate RPT cache"); free(oh_handler); return(NULL); } oh_handler->hid = hid; oh_handler->eventq = eventq; /* allocate memory for ilo2 ribcl private handler */ ilo2_ribcl_handler = malloc(sizeof(*ilo2_ribcl_handler)); if(!ilo2_ribcl_handler) { err("ilo2 ribcl Open:unable to allocate main handler"); free(oh_handler->rptcache); free(oh_handler); return(NULL); } memset(ilo2_ribcl_handler, '\0', sizeof(*ilo2_ribcl_handler)); oh_handler->data = ilo2_ribcl_handler; /* Save configuration in the handler */ ilo2_ribcl_handler->entity_root = entity_root; /* build complete hostname with port string appended */ /* add one extra byte to account for : in the middle of hostname:port string example: 10.100.1.1:443 */ ilo2_ribcl_handler->ilo2_hostport = g_malloc(host_len+port_len+2); if(ilo2_ribcl_handler->ilo2_hostport == NULL) { err("ilo2 ribcl Open:unable to allocate memory"); free(ilo2_ribcl_handler); free(oh_handler->rptcache); free(oh_handler); return(NULL); } snprintf(ilo2_ribcl_handler->ilo2_hostport, (host_len+port_len+2), "%s:%s", ilo2_hostname, ilo2_port_str); ilo2_ribcl_handler->user_name = ilo2_user_name; ilo2_ribcl_handler->password = ilo2_password; /* Build the customized RIBCL command strings containing the * login and password for this ilo2 host */ if (ir_xml_build_cmdbufs( ilo2_ribcl_handler) != RIBCL_SUCCESS){ err("ilo2_ribcl_open(): ir_xml_build_cmdbufs failed to build buffers."); free(ilo2_ribcl_handler->ilo2_hostport); free(ilo2_ribcl_handler); free(oh_handler->rptcache); free(oh_handler); return(NULL); } #ifdef ILO2_RIBCL_SIMULATE_iLO2_RESPONSE /* Check if a iLO2 response file should be used for discovery testing. * We will use the contents of this file as the command response, * rather than communucating with an actual iLO2. */ d_responsefile = (char *)g_hash_table_lookup(handler_config, "discovery_responsefile"); if( d_responsefile){ fnamesize = strlen( d_responsefile) + 1; ilo2_ribcl_handler->discovery_responsefile = malloc( fnamesize); if( ilo2_ribcl_handler->discovery_responsefile == NULL){ err("ilo2_ribcl_open(): allocation for discovery_responsefile failed."); } else { strncpy( ilo2_ribcl_handler->discovery_responsefile, d_responsefile, fnamesize); } } #endif /* ILO2_RIBCL_SIMULATE_iLO2_RESPONSE */ /* initialize SSL */ ilo2_ribcl_handler->ssl_ctx = oh_ssl_ctx_init(); if(ilo2_ribcl_handler->ssl_ctx == NULL) { err("ilo2_ribcl_open(): failed to initialize ssl connection to %s", ilo2_ribcl_handler->ilo2_hostport); free(ilo2_ribcl_handler->ilo2_hostport); free(ilo2_ribcl_handler); free(oh_handler->rptcache); free(oh_handler); return(NULL); } /* Initialize sensor data */ ilo2_ribcl_init_sensor_data( ilo2_ribcl_handler); return((void *)oh_handler); } /** * ilo2_ribcl_close: * @oh_handler: Handler data pointer. * * This function closes the instance of the iLO2 RIBCL plugin specified * by the oh_handler input parameter. * Detailed description: * - Free allocated memory * - Assumption: RIBCL connection is closed after each transaction. * If this assumption is incorrect, close open SSL connections to * iLO2. * Return values: * Void **/ void ilo2_ribcl_close(void *handler) { struct oh_handler_state *oh_handler = (struct oh_handler_state *) handler; ilo2_ribcl_handler_t *ilo2_ribcl_handler; if(oh_handler == NULL) { return; } ilo2_ribcl_handler = (ilo2_ribcl_handler_t *) oh_handler->data; if(ilo2_ribcl_handler == NULL) { free(oh_handler); return; } /* Free SSL infrastructure */ oh_ssl_ctx_free(ilo2_ribcl_handler->ssl_ctx); /* Free the RIBCL command strings in the ilo2_ribcl_handler */ ir_xml_free_cmdbufs( ilo2_ribcl_handler); /* Free any allocated discovery data in the ilo2_ribcl_handler */ ilo2_ribcl_free_discoverydata( ilo2_ribcl_handler); #ifdef ILO2_RIBCL_SIMULATE_iLO2_RESPONSE /* If we specified a response file for discovery testing, * free the space we used for its namestring. */ if( ilo2_ribcl_handler->discovery_responsefile){ free( ilo2_ribcl_handler->discovery_responsefile); } #endif /* ILO2_RIBCL_SIMULATE_iLO2_RESPONSE */ oh_flush_rpt(oh_handler->rptcache); free(ilo2_ribcl_handler->ilo2_hostport); free(ilo2_ribcl_handler); free(oh_handler->rptcache); free(oh_handler); return; } /** * ilo2_ribcl_get_event: * @hnd: Handler data pointer. * @event: Infra-structure event pointer. * * Passes plugin events up to the infra-structure for processing. * * Return values: * 1 - events to be processed. * SA_OK - No events to be processed. * SA_ERR_HPI_INVALID_PARAMS - @event is NULL. **/ SaErrorT ilo2_ribcl_get_event(void *handler) { struct oh_handler_state *oh_handler = (struct oh_handler_state *) handler; ilo2_ribcl_handler_t *ilo2_ribcl_handler; if (!handler) { err("ilo2 ribcl get event: Invalid parameter"); return(SA_ERR_HPI_INVALID_PARAMS); } ilo2_ribcl_handler = (ilo2_ribcl_handler_t *) oh_handler->data; if(! ilo2_ribcl_handler) { err("ilo2 ribcl get event: Invalid parameter."); return(SA_ERR_HPI_INVALID_PARAMS); } if (g_slist_length(ilo2_ribcl_handler->eventq) > 0) { struct oh_event *e = ilo2_ribcl_handler->eventq->data; e->hid = oh_handler->hid; oh_evt_queue_push(oh_handler->eventq, e); ilo2_ribcl_handler->eventq = g_slist_remove_link(ilo2_ribcl_handler->eventq, ilo2_ribcl_handler->eventq); return(ILO2_RIBCL_EVENTS_PENDING); } /* No events for infrastructure to process */ return(SA_OK); } /***************************** OpenHPI plug-in to iLO2 RIBCL plug-in ABI function mapping *****************************/ void * oh_open (GHashTable *, unsigned int, oh_evt_queue *) __attribute__ ((weak, alias("ilo2_ribcl_open"))); void * oh_close (void *) __attribute__ ((weak, alias("ilo2_ribcl_close"))); void * oh_get_event (void *) __attribute__ ((weak, alias("ilo2_ribcl_get_event"))); openhpi-2.14.1/plugins/ilo2_ribcl/ilo2_ribcl_idr.c0000644000076400007640000010551011302566624016723 0ustar /* * Copyright (C) 2007-2008, Hewlett-Packard Development Company, LLP * All rights reserved. * * 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. * * Neither the name of the Hewlett-Packard Corporation, nor the names * of its contributors may be used to endorse or promote products * derived from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * Author(s) * Shuah Khan * Richard White */ /*************** * This source file contains IDR HPI ABI routines iLO2 RIBCL plug-in * implements. Other source files provide support functionality for * these ABIs. ***************/ #include #include #include /************************************ Forward declarations for static functions in this file ************************************/ static SaErrorT ilo2_ribcl_get_idr_allinfo_by_ep( struct oh_handler_state *, SaHpiEntityPathT *, SaHpiIdrIdT , struct ilo2_ribcl_idr_allinfo *); static SaErrorT ilo2_ribcl_get_idr_allinfo( struct oh_handler_state *, SaHpiResourceIdT, SaHpiIdrIdT, struct ilo2_ribcl_idr_allinfo *); static void ilo2_ribcl_field_catstring( I2R_FieldT *field, char *str); static int ilo2_ribcl_update_idr( struct ilo2_ribcl_idr_info *, struct ilo2_ribcl_idr_info *); /** * ilo2_ribcl_get_idr_info: * @hnd: Pointer to the handler for this instance. * @rid: Resource ID for resource containing this IDR. * @IdrId: IDR id number. * @IdrInfo: Pointer used to return IDR information. * * Description: * Implements the plugin specific part of the saHpiIdrInfoGet() API. * * We make a call to ilo2_ribcl_get_idr_allinfo() to obtain the inventory RDR, * the rpt entry for the resource containing the IDR, and the struct * ilo2_ribcl_idr_info that contains all our IDR data. * * All IDRs, Areas, and Fields are read-only in this plugin. * * Return values: * SA_OK - Normal, successful return. * SA_ERR_HPI_CAPABILITY - Resource does not support IDRs. * SA_ERR_HPI_INVALID_PARAMS - IdrInfo pointer or handler is NULL. * SA_ERR_HPI_NOT_PRESENT - The requested IDR is not present. * SA_ERR_HPI_INVALID_RESOURCE - The resource does not exist. * **/ SaErrorT ilo2_ribcl_get_idr_info(void *hnd, SaHpiResourceIdT rid, SaHpiIdrIdT IdrId, SaHpiIdrInfoT *IdrInfo) { SaErrorT ret; struct oh_handler_state *oh_handler; struct ilo2_ribcl_idr_allinfo idr_allinfo; if( !hnd){ err(" ilo2_ribcl_get_idr_info: invalid handle."); return( SA_ERR_HPI_INVALID_PARAMS); } if( !IdrInfo){ err(" ilo2_ribcl_get_idr_info: invalid IDR info pointer."); return( SA_ERR_HPI_INVALID_PARAMS); } oh_handler = (struct oh_handler_state *)hnd; /* Look up our IDR RDR, and get the IDR information */ ret = ilo2_ribcl_get_idr_allinfo( oh_handler, rid, IdrId, &idr_allinfo); if( ret != SA_OK){ return( ret); } IdrInfo->IdrId = IdrId; IdrInfo->ReadOnly = SAHPI_TRUE; IdrInfo->NumAreas = idr_allinfo.idrinfo->num_areas; IdrInfo->UpdateCount = idr_allinfo.idrinfo->update_count; return( SA_OK); } /* end ilo2_ribcl_get_idr_info() */ /** * lo2_ribcl_get_idr_area_header: * @hnd: Pointer to the handler for this instance. * @rid: Resource ID for resource containing this IDR. * @IdrId: IDR id number. * @AreaType: Type of area to search for. * @AreaId: Id of area to search for. * @NextAreaId: Pointer to return Id of next area (if it exists) * @Header: Pointer to return area header data. * * Description: * Implements the plugin specific part of the saHpiIdrAreaHeaderGet() API. * * We make a call to ilo2_ribcl_get_idr_allinfo() to obtain the inventory RDR, * the rpt entry for the resource containing the IDR, and the struct * ilo2_ribcl_idr_info that contains all our IDR data. * * All IDRs, Areas, and Fields are read-only in this plugin. * * Currently, we only have one Area in all of our IDRs, but this code should * handle multiple Areas if we ever implement them. * * Return values: * SA_OK - Normal, successful return. * SA_ERR_HPI_CAPABILITY - Resource does not support IDRs. * SA_ERR_HPI_INVALID_PARAMS - Handler parameter is NULL. * - AreaId is an invalid reserved value. * - NextAreaId or Header parameters are NULL. * SA_ERR_HPI_NOT_PRESENT - The requested IDR is not present. * - AreaType is SAHPI_IDR_AREATYPE_UNSPECIFIED and * the area specified by AreaId does not exist. * - AreaType and AreaId are both set, but a matching * area cannot be found. * SA_ERR_HPI_INVALID_RESOURCE - The resource does not exist. **/ SaErrorT ilo2_ribcl_get_idr_area_header(void *hnd, SaHpiResourceIdT rid, SaHpiIdrIdT IdrId, SaHpiIdrAreaTypeT AreaType, SaHpiEntryIdT AreaId, SaHpiEntryIdT *NextAreaId, SaHpiIdrAreaHeaderT *Header) { SaErrorT ret; int adx; struct oh_handler_state *oh_handler; struct ilo2_ribcl_idr_allinfo idr_allinfo; struct ilo2_ribcl_idr_info *idrinfo; I2R_AreaT *ir_area; SaHpiBoolT area_found = SAHPI_FALSE; /* Note: AreaType, AreaId, NextAreaId, and Header are checked * for spec compliance in our caller (saHpiIdrAreaHeaderGet) */ if( !hnd || !NextAreaId || !Header){ err(" ilo2_ribcl_get_idr_area_header: invalid pointer."); return( SA_ERR_HPI_INVALID_PARAMS); } oh_handler = (struct oh_handler_state *)hnd; /* Look up our IDR RDR, and get the IDR information */ ret = ilo2_ribcl_get_idr_allinfo( oh_handler, rid, IdrId, &idr_allinfo); if( ret != SA_OK){ return( ret); } /* Note that HPI AreaId values begin with one, but our data structures * begin at zero, so we need to translate the AreaId parameter. */ if( AreaId == SAHPI_FIRST_ENTRY){ AreaId = 0; } else { AreaId--; } idrinfo = idr_allinfo.idrinfo; ret = SA_ERR_HPI_NOT_PRESENT; for( adx = 0; adx < idrinfo->num_areas; adx++){ ir_area = &(idrinfo->idr_areas[adx]); if( (AreaType == ir_area->area_type) || (AreaType == SAHPI_IDR_AREATYPE_UNSPECIFIED) ){ if( AreaId == adx){ /* we have a match */ Header->AreaId = adx+1; Header->Type = ir_area->area_type; Header->ReadOnly = SAHPI_TRUE; Header->NumFields = ir_area->num_fields; area_found = SAHPI_TRUE; ret = SA_OK; *NextAreaId = SAHPI_LAST_ENTRY; } else { if( area_found){ /* Now, we have found the next match */ if( adx < idrinfo->num_areas){ *NextAreaId = adx+1; break; } } } } } /* end for adx */ return( ret); } /* end ilo2_ribcl_get_idr_area_header() */ /** * ilo2_ribcl_get_idr_field: * @hnd: Pointer to the handler for this instance. * @rid: Resource ID for resource containing this IDR. * @IdrId: IDR id number. * @AreaId: Id of area to search for. * @FieldType: Type of field to search for. * @FieldId: Id of field to search for. * @NextFieldId: Pointer to return Id of next area (if it exists) * @Field: Pointer to return field data. * * Description: * Implements the plugin specific part of the saHpiIdrFieldGet() API. * * We make a call to ilo2_ribcl_get_idr_allinfo() to obtain the inventory RDR, * the rpt entry for the resource containing the IDR, and the struct * ilo2_ribcl_idr_info that contains all our IDR data. * * All IDRs, Areas, and Fields are read-only in this plugin. * * Return values: * SA_OK - Normal, successful return. * SA_ERR_HPI_CAPABILITY - Resource does not support IDRs. * SA_ERR_HPI_INVALID_PARAMS - Handler parameter is NULL. * - AreaId or FieldId is an invalid reserved value. * - NextField or Field parameters are NULL. * SA_ERR_HPI_NOT_PRESENT - The requested IDR is not present. * - Area identified by AreaId is not present. * - FieldType is SAHPI_IDR_FIELDTYPE_UNSPECIFIED and * the field specified by FieldId does not exist. * - FieldType and FieldId are both set, but a matching * field can not be found. * SA_ERR_HPI_INVALID_RESOURCE - The resource does not exist. * **/ SaErrorT ilo2_ribcl_get_idr_field(void *hnd, SaHpiResourceIdT rid, SaHpiIdrIdT IdrId, SaHpiEntryIdT AreaId, SaHpiIdrFieldTypeT FieldType, SaHpiEntryIdT FieldId, SaHpiEntryIdT *NextFieldId, SaHpiIdrFieldT *Field) { SaErrorT ret; int fdx; SaHpiEntryIdT match_id; struct oh_handler_state *oh_handler; struct ilo2_ribcl_idr_allinfo idr_allinfo; struct ilo2_ribcl_idr_info *idrinfo; I2R_AreaT *ir_area; I2R_FieldT *ir_field; SaHpiBoolT field_found = SAHPI_FALSE; /* Note: FieldType, AreaId, FieldId, NextFieldId, and Field are checked * for spec compliance in our caller (saHpiIdrFieldGet) */ if( !hnd || !NextFieldId || !Field){ err(" ilo2_ribcl_get_idr_field: invalid pointer parameter."); return( SA_ERR_HPI_INVALID_PARAMS); } oh_handler = (struct oh_handler_state *)hnd; /* Look up our IDR RDR, and get the IDR information */ ret = ilo2_ribcl_get_idr_allinfo( oh_handler, rid, IdrId, &idr_allinfo); if( ret != SA_OK){ return( ret); } /* Note that HPI AreaId and FieldId values begin with one, * but our data structures begin at zero, so we need to translate the * AreaId and FieldId parameters. */ if( AreaId == SAHPI_FIRST_ENTRY){ AreaId = 0; } else { AreaId--; } if( FieldId == SAHPI_FIRST_ENTRY){ match_id = 0; } else { match_id = FieldId -1; } idrinfo = idr_allinfo.idrinfo; ret = SA_ERR_HPI_NOT_PRESENT; /* Find the correct area */ if( AreaId >= idrinfo->num_areas){ /* AreaId is too large */ return( SA_ERR_HPI_NOT_PRESENT); } ir_area = &(idrinfo->idr_areas[AreaId]); /* Now, search for the matching field */ for( fdx = 0; fdx < ir_area->num_fields; fdx++){ ir_field = &(ir_area->area_fields[fdx]); if( (FieldType == ir_field->field_type) || (FieldType == SAHPI_IDR_FIELDTYPE_UNSPECIFIED) ){ if( field_found){ /* Now, we have found the next match */ if( fdx < ir_area->num_fields){ *NextFieldId = fdx+1; break; } } else if( (match_id == fdx) || (FieldId == SAHPI_FIRST_ENTRY)){ /* we have found the matching entry */ Field->AreaId = AreaId+1; Field->FieldId = fdx+1; Field->Type = ir_field->field_type; Field->ReadOnly = SAHPI_TRUE; oh_init_textbuffer(&(Field->Field)); oh_append_textbuffer(&(Field->Field), ir_field->field_string); field_found = SAHPI_TRUE; ret = SA_OK; *NextFieldId = SAHPI_LAST_ENTRY; } } /* end if FieldType matched */ } /* end for fdx */ return( ret); } /* end ilo2_ribcl_get_idr_field() */ /** * ilo2_ribcl_add_idr_area: * @hnd: Pointer to handler's data * @ResourceId: Resource identifier for this operation * @IdrId: Identifier for the Inventory Data Repository * @AreaType: Type of Inventory Data Area * @AreaId: Pointer to store the identifier of the newly allocated * Inventory Area * * This function is not suported/implemented for the ilo2_ribcl plugin. * All IDRs, Areas, and Fields are read-only in this plugin. * * Return value: * SA_ERR_HPI_READ_ONLY - Normal - ilo2_ribcl only supports "read only" IDRs. **/ SaErrorT ilo2_ribcl_add_idr_area( void *hnd, SaHpiResourceIdT ResourceId, SaHpiIdrIdT IdrId, SaHpiIdrAreaTypeT AreaType, SaHpiEntryIdT *AreaId) { return SA_ERR_HPI_READ_ONLY; } /** * ilo2_ribcl_del_idr_area: * @hnd: Pointer to handler's data * @ResourceId: Resource identifier for this operation * @IdrId: Identifier for the Inventory Data Repository * @AreaId: Identifier of Area entry to delete from the IDR * * This function is not suported/implemented for the ilo2_ribcl plugin. * All IDRs, Areas, and Fields are read-only in this plugin. * * Return value: * SA_ERR_HPI_READ_ONLY - Normal - ilo2_ribcl only supports "read only" IDRs. **/ SaErrorT ilo2_ribcl_del_idr_area( void *hnd, SaHpiResourceIdT ResourceId, SaHpiIdrIdT IdrId, SaHpiEntryIdT AreaId) { return SA_ERR_HPI_READ_ONLY; } /** * ilo2_ribcl_add_idr_field: * @hnd: Pointer to handler's data * @ResourceId: Resource identifier for this operation * @IdrId: Identifier for the Inventory Data Repository * @Field: Pointer to Inventory Data Field which contains field * information to be added. * * This function is not suported/implemented for the ilo2_ribcl plugin. * All IDRs, Areas, and Fields are read-only in this plugin. * * Return value: * SA_ERR_HPI_READ_ONLY - Normal - ilo2_ribcl only supports "read only" IDRs. **/ SaErrorT ilo2_ribcl_add_idr_field( void *hnd, SaHpiResourceIdT ResourceId, SaHpiIdrIdT IdrId, SaHpiIdrFieldT *Field) { return SA_ERR_HPI_READ_ONLY; } /** * ilo2_ribcl_set_idr_field: * @hnd: Pointer to handler's data * @ResourceId: Resource identifier for this operation * @IdrId: Identifier for the Inventory Data Repository * @Field: Pointer to Inventory Data Field which contains field * information to be updated. * * This function is not suported/implemented for the ilo2_ribcl plugin. * All IDRs, Areas, and Fields are read-only in this plugin. * * Return value: * SA_ERR_HPI_READ_ONLY - Normal - ilo2_ribcl only supports "read only" IDRs. **/ SaErrorT ilo2_ribcl_set_idr_field( void *hnd, SaHpiResourceIdT ResourceId, SaHpiIdrIdT IdrId, SaHpiIdrFieldT *Field) { return SA_ERR_HPI_READ_ONLY; } /** * ilo2_ribcl_del_idr_field: * @hnd: Pointer to handler's data * @ResourceId: Resource identifier for this operation * @IdrId: Identifier for the Inventory Data Repository * @AreaId: Identifier of Inventory Area whose field is to bo deleted * @FieldId: Identifier of field to be deleted * * This function is not suported/implemented for the ilo2_ribcl plugin. * All IDRs, Areas, and Fields are read-only in this plugin. * * Return value: * SA_ERR_HPI_READ_ONLY - Normal - ilo2_ribcl only supports "read only" IDRs. **/ SaErrorT ilo2_ribcl_del_idr_field( void *hnd, SaHpiResourceIdT ResourceId, SaHpiIdrIdT IdrId, SaHpiEntryIdT AreaId, SaHpiEntryIdT FieldId) { return SA_ERR_HPI_READ_ONLY; } /** * ilo2_ribcl_add_idr: * @oh_handler: Pointer to the handler for this instance. * @event: Pointer to event structure for this resource's add event. * @idrid: Index of this IDR. * @new_idr: Pointer to structure containing all initial IDR data. * @description: String describing the resource containing this IDR. * * This routine will create a new inventory RDR, associated with the IDR * contents passed via parameter new_idr. The information is copied from * new_idr, so the caller is free to free or change the information later. * * The new inventory RDR will be added to the resource contained within the * 'event' parameter. The following inventory RDR elements will be at these * fixed values: * IsFru = SAHPI_FALSE * InventoryRec.Persistent = SAHPI_FALSE * * The IdString for the new IDR will be constructed by appending the string * " Inventory" to the string passed in parameter 'description'. * * Return values: * SA_OK - Normal, successful return. * SA_ERR_HPI_OUT_OF_MEMORY - Memory allocation failed. * SA_ERR_HPI_INTERNAL_ERROR - could not add inventory RDR **/ SaErrorT ilo2_ribcl_add_idr( struct oh_handler_state *oh_handler, struct oh_event *event, SaHpiIdrIdT idrid, struct ilo2_ribcl_idr_info *new_idr, char *description) { SaErrorT ret = SA_OK; SaHpiRdrT *rdr; struct ilo2_ribcl_idr_info *idr; rdr = (SaHpiRdrT *)g_malloc0(sizeof(SaHpiRdrT)); if( rdr == NULL){ err("ilo2_ribcl_add_idr: Memory allocation failed."); return(SA_ERR_HPI_OUT_OF_MEMORY); } /* fill in generic RDR stuff */ rdr->RdrType = SAHPI_INVENTORY_RDR; rdr->Entity = event->resource.ResourceEntity; rdr->IsFru = SAHPI_FALSE; oh_init_textbuffer(&(rdr->IdString)); oh_append_textbuffer(&(rdr->IdString), description); oh_append_textbuffer(&(rdr->IdString), " Inventory"); /* Fill in the IDR sepcific stuff */ rdr->RdrTypeUnion.InventoryRec.IdrId = idrid; rdr->RdrTypeUnion.InventoryRec.Persistent = SAHPI_FALSE; /* Copy the IDR information into a new allocation to be associated * with this RDR */ idr = g_memdup(new_idr, sizeof(struct ilo2_ribcl_idr_info)); if( idr == NULL){ g_free( rdr); err("ilo2_ribcl_add_idr: Memory allocation failed."); return(SA_ERR_HPI_OUT_OF_MEMORY); } ret = oh_add_rdr(oh_handler->rptcache, event->resource.ResourceId, rdr, idr, 0); if( ret != SA_OK){ err("ilo2_ribcl_add_idr: could not add RDR. Error = %s.", oh_lookup_error(ret)); g_free( idr); g_free( rdr); return( SA_ERR_HPI_INTERNAL_ERROR); } else { event->rdrs = g_slist_append(event->rdrs, rdr); } ilo2_ribcl_add_resource_capability( oh_handler, event, (SAHPI_CAPABILITY_RDR | SAHPI_CAPABILITY_INVENTORY_DATA)); return( SA_OK); } /* end ilo2_ribcl_add_idr() */ /** * ilo2_ribcl_discover_chassis_idr: * @oh_handler: Pointer to the handler for this instance. * @chassis_ep: Entity path for the chassis. * * This routine builds the IDR for the system chassis, and adds an inventory * RDR to the chassis resource associated with that IDR. * * Return values: * None **/ void ilo2_ribcl_discover_chassis_idr( struct oh_handler_state *oh_handler, struct oh_event *event, char *description) { ilo2_ribcl_handler_t *ir_handler = NULL; ilo2_ribcl_DiscoveryData_t *ddata; ir_handler = (ilo2_ribcl_handler_t *) oh_handler->data; ddata = &(ir_handler->DiscoveryData); /* Use the temporary ilo2_ribcl_idr_info structure in our * private handler to collect the IDR information. We use * this buffer in the handler because it's too large to put * on the stack as a local valiable, and we don't want to be * allocating/deallocating it frequently. */ ilo2_ribcl_build_chassis_idr( ir_handler, &(ir_handler->tmp_idr)); if( ilo2_ribcl_add_idr( oh_handler, event, SAHPI_DEFAULT_INVENTORY_ID, &(ir_handler->tmp_idr), description) != SA_OK){ err("ilo2_ribcl_discover_chassis_idr: could not add IDR for chassis."); return; } ilo2_ribcl_add_resource_capability( oh_handler, event, (SAHPI_CAPABILITY_RDR | SAHPI_CAPABILITY_INVENTORY_DATA)); } /* end ilo2_ribcl_discover_chassis_idr() */ /** * ilo2_ribcl_update_chassis_idr: * @oh_handler: Pointer to the handler for this instance. * @chassis_ep: Entity path for the chassis. * * This routine updates the information in the system chassis IDR with * any differing information obtained during a discovery operation. * * We make a call to ilo2_ribcl_get_idr_allinfo_by_ep() to obtain the * inventory RDR, the rpt entry for the resource containing the IDR, and * the struct ilo2_ribcl_idr_info that contains all our IDR data. * * Return values: * None **/ void ilo2_ribcl_update_chassis_idr( struct oh_handler_state *oh_handler, SaHpiEntityPathT *ep_root) { struct ilo2_ribcl_idr_allinfo idr_allinfo; ilo2_ribcl_handler_t *ir_handler; ir_handler = (ilo2_ribcl_handler_t *)oh_handler->data; /* Look up our chassis IDR. */ if( ilo2_ribcl_get_idr_allinfo_by_ep( oh_handler, ep_root, SAHPI_DEFAULT_INVENTORY_ID, &idr_allinfo) != SA_OK){ err("ilo2_ribcl_update_chassis_idr: unable to locate chassis IDR."); return; } ilo2_ribcl_build_chassis_idr( ir_handler, &(ir_handler->tmp_idr)); ilo2_ribcl_update_idr( &(ir_handler->tmp_idr), idr_allinfo.idrinfo); } /* ilo2_ribcl_update_chassis_idr() */ /** * ilo2_ribcl_update_fru_idr: * @oh_handler: Pointer to the handler for this instance. * @fru_ep: Entity path for the fru resource. * @idr_info: (Potentially) updated information for the resource IDR. * * This routine updates the information in an IDR of a FRU with any differing * information obtained during a discovery operation. * * We make a call to ilo2_ribcl_get_idr_allinfo_by_ep() to obtain the * inventory RDR, the rpt entry for the resource containing the IDR, and * the struct ilo2_ribcl_idr_info that contains all our IDR data. * * Return values: * None **/ void ilo2_ribcl_update_fru_idr( struct oh_handler_state *oh_handler, SaHpiEntityPathT *fru_ep, struct ilo2_ribcl_idr_info * idr_info) { struct ilo2_ribcl_idr_allinfo idr_allinfo; /* First, find the IDR for this resource, using the entity path */ if( ilo2_ribcl_get_idr_allinfo_by_ep( oh_handler, fru_ep, SAHPI_DEFAULT_INVENTORY_ID, &idr_allinfo) != SA_OK){ err("ilo2_ribcl_update_fru_idr: unable to locate IDR for FRU."); return; } ilo2_ribcl_update_idr( idr_info, idr_allinfo.idrinfo); } /* end ilo2_ribcl_update_fru_idr() */ /** * ilo2_ribcl_get_idr_allinfo_by_ep: * @oh_handler: Pointer to the handler for this instance. * @ep: Entity path for resource containing this IDR. * @irid: Index of this IDR. * @idr_allinfo: Pointer to structure used to return other pointers. * * This is a support routine used within our plugin. It returns a pointer to * the inventory RDR, a pointer to the rpt entry for the resource containing * the IDR, and a pointer to the struct ilo2_ribcl_idr_info that is associated * with the inventory RDR. These pointers are returned via the idr_allinfo * parameter, which should point to a struct ilo2_ribcl_idr_allinfo that has * been allocated by our caller. * * Return values: * SA_OK - Normal, successful return. * SA_ERR_HPI_INVALID_RESOURCE - Could not locate rpt entry. * SA_ERR_HPI_CAPABILITY - Resource does not have inventory capability. * SA_ERR_HPI_INTERNAL_ERROR - No IDR data exists in the RDR. * SA_ERR_HPI_NOT_PRESENT - The requested IDR can not be found. * **/ static SaErrorT ilo2_ribcl_get_idr_allinfo_by_ep( struct oh_handler_state *oh_handler, SaHpiEntityPathT *ep, SaHpiIdrIdT irid, struct ilo2_ribcl_idr_allinfo *idr_allinfo) { SaHpiResourceIdT rid; idr_allinfo->rpt = NULL; idr_allinfo->rdr = NULL; idr_allinfo->idrinfo = NULL; /* Check that the resource exists, and that it has IDR capability */ idr_allinfo->rpt = oh_get_resource_by_ep(oh_handler->rptcache, ep); if( !idr_allinfo->rpt){ err("ilo2_ribcl_get_idr_allinfo_by_ep: no rpt entry."); return( SA_ERR_HPI_INVALID_RESOURCE); } rid = idr_allinfo->rpt->ResourceId; if( !(idr_allinfo->rpt->ResourceCapabilities & SAHPI_CAPABILITY_INVENTORY_DATA)){ err("ilo2_ribcl_get_idr_allinfo_by_ep: no inventory capability for resource id %d.", rid); return( SA_ERR_HPI_CAPABILITY); } /* Get the RDR for the inventory */ idr_allinfo->rdr = oh_get_rdr_by_type(oh_handler->rptcache, rid, SAHPI_INVENTORY_RDR, irid); if( idr_allinfo->rdr == NULL){ err("ilo2_ribcl_get_idr_allinfo_by_ep: no inventory RDR for resource id %d, IDR %d.", rid, irid); return( SA_ERR_HPI_NOT_PRESENT); } /* Finally, get the assoicated data for this IDR */ idr_allinfo->idrinfo = (struct ilo2_ribcl_idr_info *)oh_get_rdr_data( oh_handler->rptcache, rid, idr_allinfo->rdr->RecordId); if( idr_allinfo->idrinfo == NULL){ err("ilo2_ribcl_get_idr_allinfo_by_ep: no inventory data found for resource id %d, IDR %d, label %s.", rid, irid, idr_allinfo->rdr->IdString.Data); return( SA_ERR_HPI_INTERNAL_ERROR); } return( SA_OK); } /* end ilo2_ribcl_get_idr_allinfo_by_ep() */ /** * ilo2_ribcl_get_idr_allinfo: * @oh_handler: Pointer to the handler for this instance. * @rid: Resource ID for resource containing this IDR. * @irid: Index of this IDR. * @idr_allinfo: Pointer to structure used to return other pointers. * * This is a support routine used within our plugin. It returns a pointer to * the inventory RDR, a pointer to the rpt entry for the resource containing * the IDR, and a pointer to the struct ilo2_ribcl_idr_info that is associated * with the inventory RDR. These pointers are returned via the idr_allinfo * parameter, which should point to a struct ilo2_ribcl_idr_allinfo that has * been allocated by our caller. * * This routine is similar to ilo2_ribcl_get_idr_allinfo_by_ep(), however here * we search by resource ID rather than by entity path. * * Return values: * SA_OK - Normal, successful return. * SA_ERR_HPI_INVALID_RESOURCE - Could not locate rpt entry. * SA_ERR_HPI_CAPABILITY - Resource does not have inventory capability. * SA_ERR_HPI_INTERNAL_ERROR - No IDR data exists in the RDR. * SA_ERR_HPI_NOT_PRESENT - The requested IDR can not be found. **/ static SaErrorT ilo2_ribcl_get_idr_allinfo( struct oh_handler_state *oh_handler, SaHpiResourceIdT rid, SaHpiIdrIdT irid, struct ilo2_ribcl_idr_allinfo *idr_allinfo) { idr_allinfo->rpt = NULL; idr_allinfo->rdr = NULL; idr_allinfo->idrinfo = NULL; /* Check that the resource exists, and that it has IDR capability */ idr_allinfo->rpt = oh_get_resource_by_id(oh_handler->rptcache, rid); if( !idr_allinfo->rpt){ err("ilo2_ribcl_get_idr_allinfo: no rpt entry for resource id %d.", rid); return( SA_ERR_HPI_INVALID_RESOURCE); } if( !(idr_allinfo->rpt->ResourceCapabilities & SAHPI_CAPABILITY_INVENTORY_DATA)){ err("ilo2_ribcl_get_idr_allinfo: no inventory capability for resource id %d.", rid); return( SA_ERR_HPI_CAPABILITY); } /* Get the RDR for the inventory */ idr_allinfo->rdr = oh_get_rdr_by_type(oh_handler->rptcache, rid, SAHPI_INVENTORY_RDR, irid); if( idr_allinfo->rdr == NULL){ err("ilo2_ribcl_get_idr_allinfo: no inventory RDR for resource id %d, IDR %d.", rid, irid); return( SA_ERR_HPI_NOT_PRESENT); } /* Finally, get the assoicated data for this IDR */ idr_allinfo->idrinfo = (struct ilo2_ribcl_idr_info *)oh_get_rdr_data( oh_handler->rptcache, rid, idr_allinfo->rdr->RecordId); if( idr_allinfo->idrinfo == NULL){ err("ilo2_ribcl_get_idr_allinfo: no inventory data found for resource id %d, IDR %d, label %s.", rid, irid, idr_allinfo->rdr->IdString.Data); return( SA_ERR_HPI_INTERNAL_ERROR); } return( SA_OK); } /* end ilo2_ribcl_get_idr_allinfo() */ /** * ilo2_ribcl_field_catstring: * @field: Pointer to I2R_FieldT whoose string should be modified. * @str: String to concat to the field string. * * Concats the string str onto the end of the fieldstring of the field * specified by the "field" parameter. If str is null, the string * "Unknown" will be added instead. The total length of the field string * will be limited to I2R_MAX_FIELDCHARS characters. * * Return values: * None **/ static void ilo2_ribcl_field_catstring( I2R_FieldT *field, char *str) { char *tmpstr; int exist_len; exist_len = strlen( field->field_string) +1; /* account for the null */ if( str){ tmpstr = str; } else { tmpstr = "Unknown"; } strncat( field->field_string, tmpstr, (I2R_MAX_FIELDCHARS - exist_len)); } /** * ilo2_ribcl_build_chassis_idr: * @ir_handler: Pointer to plugin private handler. * @idr_info: Pointer to structure that receives the IDR data/ * * This routine reads information obtained during the prevoius discovery * operation, and fills in the IDR for a the system chassis. The idr_info * parameter must point to a struct ilo2_ribcl_idr_info that has been * allocated by our caller. * * The system chassis IDR has one Area of type SAHPI_IDR_AREATYPE_CHASSIS_INFO, * containing the following four fields: * Field 1: SAHPI_IDR_FIELDTYPE_PRODUCT_NAME "" * Field 2: SAHPI_IDR_FIELDTYPE_SERIAL_NUMBER "" * Field 3: SAHPI_IDR_FIELDTYPE_MANUFACTURER "Hewlett Packard" * Field 4: SAHPI_IDR_FIELDTYPE_CUSTOM "iLo2_Firmware: " * * Return values: * None **/ void ilo2_ribcl_build_chassis_idr( ilo2_ribcl_handler_t *ir_handler, struct ilo2_ribcl_idr_info *idr_info) { I2R_FieldT *field; ilo2_ribcl_DiscoveryData_t *ddata; memset( idr_info, 0, sizeof( struct ilo2_ribcl_idr_info)); ddata = &(ir_handler->DiscoveryData); idr_info->num_areas = 1; idr_info->idr_areas[0].area_type = SAHPI_IDR_AREATYPE_CHASSIS_INFO; idr_info->idr_areas[0].num_fields = 4; field = &(idr_info->idr_areas[0].area_fields[I2R_CHASSIS_IF_PRODNAME]); field->field_type = SAHPI_IDR_FIELDTYPE_PRODUCT_NAME; ilo2_ribcl_field_catstring( field, ddata->product_name); field = &(idr_info->idr_areas[0].area_fields[I2R_CHASSIS_IF_SERNUM]); field->field_type = SAHPI_IDR_FIELDTYPE_SERIAL_NUMBER; ilo2_ribcl_field_catstring( field, ddata->serial_number); field = &(idr_info->idr_areas[0].area_fields[I2R_CHASSIS_IF_MANUFACT]); field->field_type = SAHPI_IDR_FIELDTYPE_MANUFACTURER; ilo2_ribcl_field_catstring( field, "Hewlett Packard"); field = &(idr_info->idr_areas[0].area_fields[I2R_CHASSIS_IF_ILO2VERS]); field->field_type = SAHPI_IDR_FIELDTYPE_CUSTOM; ilo2_ribcl_field_catstring( field, "iLo2_Firmware: "); ilo2_ribcl_field_catstring( field, ddata->fwdata.version_string); } /* end ilo2_ribcl_build_chassis_idr() */ /** * ilo2_ribcl_build_cpu_idr: * @ir_handler: Pointer to plugin private handler. * @idr_info: Pointer to structure that receives the IDR data/ * * This routine reads information obtained during the prevoius discovery * operation, and fills in the IDR for a system processor. The idr_info * parameter must point to a struct ilo2_ribcl_idr_info that has been * allocated by our caller. * * The cpu IDR has one Area of type SAHPI_IDR_AREATYPE_BOARD_INFO, * containing the following field: * Field 1: SAHPI_IDR_FIELDTYPE_CUSTOM "Speed: " * * Return values: * None **/ void ilo2_ribcl_build_cpu_idr(ilo2_ribcl_handler_t *ir_handler, struct ilo2_ribcl_idr_info *idr_info) { I2R_FieldT *field; memset( idr_info, 0, sizeof( struct ilo2_ribcl_idr_info)); idr_info->num_areas = 1; idr_info->idr_areas[0].area_type = SAHPI_IDR_AREATYPE_BOARD_INFO; idr_info->idr_areas[0].num_fields = 1; field = &(idr_info->idr_areas[0].area_fields[I2R_CPU_IF_SPEED]); field->field_type = SAHPI_IDR_FIELDTYPE_CUSTOM; ilo2_ribcl_field_catstring( field, "Speed: "); ilo2_ribcl_field_catstring( field, ir_handler->DiscoveryData.system_cpu_speed); } /* end ilo2_ribcl_build_cpu_idr() */ /** * ilo2_ribcl_build_memory_idr: * @mem_data: Pointer to ir_memdata_t info in DiscoveryData * @idr_info: Pointer to structure that receives the IDR data/ * * This routine reads information obtained during the prevoius discovery * operation, and fills in the IDR for a memory DIMM. The idr_info * parameter must point to a struct ilo2_ribcl_idr_info that has been * allocated by our caller. * * The memory IDR has one Area of type SAHPI_IDR_AREATYPE_BOARD_INFO, * containing the following two fields: * Field 1: SAHPI_IDR_FIELDTYPE_CUSTOM "Size: " * Field 2: SAHPI_IDR_FIELDTYPE_CUSTOM "Speed: " * * Return values: * None **/ void ilo2_ribcl_build_memory_idr( ir_memdata_t *mem_data, struct ilo2_ribcl_idr_info *idr_info) { I2R_FieldT *field; memset( idr_info, 0, sizeof( struct ilo2_ribcl_idr_info)); idr_info->num_areas = 1; idr_info->idr_areas[0].area_type = SAHPI_IDR_AREATYPE_BOARD_INFO; idr_info->idr_areas[0].num_fields = 2; field = &(idr_info->idr_areas[0].area_fields[I2R_MEM_IF_SIZE]); field->field_type = SAHPI_IDR_FIELDTYPE_CUSTOM; ilo2_ribcl_field_catstring( field, "Size: "); ilo2_ribcl_field_catstring( field, mem_data->memsize); field = &(idr_info->idr_areas[0].area_fields[I2R_MEM_IF_SPEED]); field->field_type = SAHPI_IDR_FIELDTYPE_CUSTOM; ilo2_ribcl_field_catstring( field, "Speed: "); ilo2_ribcl_field_catstring( field, mem_data->speed); } /* end ilo2_ribcl_build_memory_idr() */ /** * ilo2_ribcl_update_idr: * @new_info: Ptr to structure containing (potentially) new IDR information * @exist_info: Ptr to IDR info stored in a resource's RDR. * * This routine is given pointers to a new IDR and an existing IDR. It will * update the information in the existing IDR with any differing information * in the new IDR. If any of the information is actually updated, the update * count in the existing IDR wil be incremented. * * Currently, we only have one Area in all of our IDRs, but this code should * handle multiple Areas if we ever implement them. * * Return values: * Number of updates made to the existing IDR. * **/ static int ilo2_ribcl_update_idr( struct ilo2_ribcl_idr_info *new_info, struct ilo2_ribcl_idr_info *exist_info) { I2R_AreaT *n_area; I2R_AreaT *e_area; I2R_FieldT *n_field; I2R_FieldT *e_field; int adx; int fdx; int updates = 0; for( adx = 0; adx < new_info->num_areas; adx++){ n_area = &(new_info->idr_areas[adx]); e_area = &(exist_info->idr_areas[adx]); for( fdx = 0; fdx < n_area->num_fields; fdx++){ n_field = &(n_area->area_fields[fdx]); e_field = &(e_area->area_fields[fdx]); if( strcmp( n_field->field_string, e_field->field_string)){ strcpy( e_field->field_string, n_field->field_string); updates++; exist_info->update_count++; } } } return( updates); } /* end ilo2_ribcl_update_idr() */ /***************************** OpenHPI plug-in to iLO2 RIBCL plug-in ABI function mapping *****************************/ void * oh_get_idr_info (void *hnd, SaHpiResourceIdT, SaHpiIdrIdT, SaHpiIdrInfoT *) __attribute__ ((weak, alias("ilo2_ribcl_get_idr_info"))); void * oh_get_idr_area_header (void *, SaHpiResourceIdT, SaHpiIdrIdT, SaHpiIdrAreaTypeT, SaHpiEntryIdT, SaHpiEntryIdT *, SaHpiIdrAreaHeaderT *) __attribute__ ((weak, alias("ilo2_ribcl_get_idr_area_header"))); void * oh_get_idr_field (void *, SaHpiResourceIdT, SaHpiIdrIdT, SaHpiEntryIdT, SaHpiIdrFieldTypeT, SaHpiEntryIdT, SaHpiEntryIdT *, SaHpiIdrFieldT *) __attribute__ ((weak, alias("ilo2_ribcl_get_idr_field"))); /* The following are just stubbs, since our IDRs are read only */ void * oh_add_idr_area (void *, SaHpiResourceIdT, SaHpiIdrIdT, SaHpiIdrAreaTypeT, SaHpiEntryIdT) __attribute__ ((weak, alias("ilo2_ribcl_add_idr_area"))); void * oh_del_idr_area (void *, SaHpiResourceIdT, SaHpiIdrIdT, SaHpiEntryIdT) __attribute__ ((weak, alias("ilo2_ribcl_del_idr_area"))); void * oh_add_idr_field (void *, SaHpiResourceIdT, SaHpiIdrIdT, SaHpiIdrFieldT) __attribute__ ((weak, alias("ilo2_ribcl_add_idr_field"))); void * oh_set_idr_field (void *, SaHpiResourceIdT, SaHpiIdrIdT, SaHpiIdrFieldT) __attribute__ ((weak, alias("ilo2_ribcl_set_idr_field"))); void * oh_del_idr_field (void *, SaHpiResourceIdT, SaHpiIdrIdT, SaHpiEntryIdT, SaHpiEntryIdT) __attribute__ ((weak, alias("ilo2_ribcl_del_idr_field"))); openhpi-2.14.1/plugins/ilo2_ribcl/ilo2_ribcl_cmnds.h0000644000076400007640000002310211302566624017252 0ustar /* * Copyright (C) 2007-2008, Hewlett-Packard Development Company, LLP * All rights reserved. * * 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. * * Neither the name of the Hewlett-Packard Corporation, nor the names * of its contributors may be used to endorse or promote products * derived from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * Author(s) * Shuah Khan * Richard White */ #ifndef _INC_ILO2_RIBCL_CMNDS_H_ #define _INC_ILO2_RIBCL_CMNDS_H_ /*************** * This header file contains all of the iLO2 RIBLC command denfinitions. ***************/ /* * XML header definition. iLO2 requires that this header be sent at the * start of every RIBCL transation. The XML header ensures the connection * is an XML connection, not an HTTP connection. */ #define ILO2_RIBCL_XML_HDR "\r\n" /* Here are all the RIBCL xml templates for the commands. For each command, * we have a format specification string that allows us to insert the * login and password strings for individual systems. Also, each command * has an assocoated macro value that gives its unique index for use in * command arrays. When you add a template, make sure to increment * IR_NUM_COMMANDS and add code to ir_xml_build_cmdbufs() in file * ilo2_ribcl_xml.c. */ #define IR_NUM_COMMANDS 22 /* * GET_SERVER_DATA command. * This is a combination of the RIBCL GET_HOST_DATA, GET_EMBEDDED_HEALTH, * and GET_FW_VERSION commands. * These three commands are sent in one single transation to get * complete server information including fans, temp sensors, cpus, dimms, * power supplies, VRMs, and I/O slots. The following define combines and * embedds the GET_HOST_DATA, GET_EMBEDDED_HEALTH and GET_FW_VERSION commands * within a single LOGIN block. */ #define IR_CMD_GET_SERVER_DATA 0 #define ILO2_RIBCL_GET_SERVER_DATA " \r\n" /* * GET_HOST_POWER_STATUS command */ #define IR_CMD_GET_HOST_POWER_STATUS 1 #define ILO2_RIBCL_GET_HOST_POWER_STATUS " \r\n" /* * SET_HOST_POWER commands */ #define IR_CMD_SET_HOST_POWER_ON 2 #define ILO2_RIBCL_SET_HOST_POWER_ON " \r\n" #define IR_CMD_SET_HOST_POWER_OFF 3 #define ILO2_RIBCL_SET_HOST_POWER_OFF " \r\n" /* * RESET_SERVER command */ #define IR_CMD_RESET_SERVER 4 #define ILO2_RIBCL_RESET_SERVER " \r\n" /* * COLD_BOOT_SERVER command */ #define IR_CMD_COLD_BOOT_SERVER 5 #define ILO2_RIBCL_COLD_BOOT_SERVER " \r\n" /* * GET_UID_STATUS command */ #define IR_CMD_GET_UID_STATUS 6 #define ILO2_RIBCL_GET_UID_STATUS " \r\n" /* * UID_CONTROL commands */ #define IR_CMD_UID_CONTROL_OFF 7 #define ILO2_RIBCL_UID_CONTROL_OFF " \r\n" #define IR_CMD_UID_CONTROL_ON 8 #define ILO2_RIBCL_UID_CONTROL_ON " \r\n" /* * GET_HOST_POWER_SAVER_STATUS command */ #define IR_CMD_GET_HOST_POWER_SAVER_STATUS 9 #define ILO2_RIBCL_GET_HOST_POWER_SAVER_STATUS " \r\n" /* * SET_HOST_POWER_SAVER commands */ #define IR_CMD_SET_HOST_POWER_SAVER_1 10 #define ILO2_RIBCL_SET_HOST_POWER_SAVER_1 " \r\n" #define IR_CMD_SET_HOST_POWER_SAVER_2 11 #define ILO2_RIBCL_SET_HOST_POWER_SAVER_2 " \r\n" #define IR_CMD_SET_HOST_POWER_SAVER_3 12 #define ILO2_RIBCL_SET_HOST_POWER_SAVER_3 " \r\n" #define IR_CMD_SET_HOST_POWER_SAVER_4 13 #define ILO2_RIBCL_SET_HOST_POWER_SAVER_4 " \r\n" #define IR_CMD_GET_SERVER_AUTO_PWR 14 #define ILO2_RIBCL_GET_SERVER_AUTO_PWR " \r\n" /* Enable automatic power on with a minimum delay. */ #define IR_CMD_SERVER_AUTO_PWR_YES 15 #define ILO2_RIBCL_SERVER_AUTO_PWR_YES " \r\n" /* Disable automatic power on. */ #define IR_CMD_SERVER_AUTO_PWR_NO 16 #define ILO2_RIBCL_SERVER_AUTO_PWR_NO " \r\n" /* Enable automatic power on with 15 seconds delay. */ #define IR_CMD_SERVER_AUTO_PWR_15 17 #define ILO2_RIBCL_SERVER_AUTO_PWR_15 " \r\n" /* Enable automatic power on with 30 seconds delay. */ #define IR_CMD_SERVER_AUTO_PWR_30 18 #define ILO2_RIBCL_SERVER_AUTO_PWR_30 " \r\n" /* Enable automatic power on with 45 seconds delay. */ #define IR_CMD_SERVER_AUTO_PWR_45 19 #define ILO2_RIBCL_SERVER_AUTO_PWR_45 " \r\n" /* Enable automatic power on with 60 seconds delay. */ #define IR_CMD_SERVER_AUTO_PWR_60 20 #define ILO2_RIBCL_SERVER_AUTO_PWR_60 " \r\n" /* Enable automatic power on with random delay up to 60 seconds. */ #define IR_CMD_SERVER_AUTO_PWR_RANDOM 21 #define ILO2_RIBCL_SERVER_AUTO_PWR_RANDOM " \r\n" #endif /*_INC_ILO2_RIBCL_CMNDS_H_*/ openhpi-2.14.1/plugins/ilo2_ribcl/ilo2_ribcl_reset.c0000644000076400007640000001737211302566624017277 0ustar /* * Copyright (C) 2007-2008, Hewlett-Packard Development Company, LLP * All rights reserved. * * 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. * * Neither the name of the Hewlett-Packard Corporation, nor the names * of its contributors may be used to endorse or promote products * derived from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * Author(s) * Shuah Khan * Richard White */ /*************** * This source file contains Reset HPI ABI routines iLO2 RIBCL plug-in * implements. Other source files provide support functionality for * these ABIs. ***************/ #include #include #include /***************************** iLO2 RIBCL plug-in Reset ABI Interface functions *****************************/ /** * ilo2_ribcl_get_reset_state: * @hnd: Handler data pointer. * @rid: Resource ID. * @act: Location to store resource's reset action state. * * Retrieves a resource's reset action state. If the resource has * SAHPI_CAPABILITY_RESET, then returns SAHPI_RESET_DEASSERT as * ProLiant Rack Mount Server doesn't support hold in reset. * ProLiant Rack Mount Server doesn't support pulsed reset. Devices * that supprt pulsed reset can be held in reset for a specified * perid of time using SAHPI_RESET_ASSERT followed by a * SAHPI_RESET_DEASSERT. * * Return values: * SA_OK - Normal case. * SA_ERR_HPI_CAPABILITY - Resource doesn't have SAHPI_CAPABILITY_RESET. * SA_ERR_HPI_INVALID_RESOURCE - Resource doesn't exist. * SA_ERR_HPI_INVALID_PARAMS - Pointer parameter(s) are NULL. **/ SaErrorT ilo2_ribcl_get_reset_state(void *hnd, SaHpiResourceIdT rid, SaHpiResetActionT *act) { struct oh_handler_state *handle; ilo2_ribcl_handler_t *ilo2_ribcl_handler = NULL; SaHpiRptEntryT *rpt; if (!hnd || !act) { err("ilo2_ribcl_get_reset_state(): Invalid parameter."); return(SA_ERR_HPI_INVALID_PARAMS); } handle = (struct oh_handler_state *)hnd; ilo2_ribcl_handler = (ilo2_ribcl_handler_t *)handle->data; if (!ilo2_ribcl_handler) { err("ilo2_ribcl_get_reset_state(): Invalid parameter."); return(SA_ERR_HPI_INVALID_PARAMS); } /* Check if resource exists and has reset capabilities */ rpt = oh_get_resource_by_id(handle->rptcache, rid); if (!rpt) { return(SA_ERR_HPI_INVALID_RESOURCE); } if (!(rpt->ResourceCapabilities & SAHPI_CAPABILITY_RESET)) { return(SA_ERR_HPI_CAPABILITY); } /* ProLiant Rack Mount Server doesn't support holding in reset Return SAHPI_RESET_DEASSERT */ *act = SAHPI_RESET_DEASSERT; return(SA_OK); } /** * ilo2_ribcl_set_reset_state: * @hnd: Handler data pointer. * @rid: Resource ID. * @act: Reset action state to set. * * Sets a resource's reset action state. * Retrieves a resource's reset action state. If the resource has * SAHPI_CAPABILITY_RESET then sends RESET_SERVER RIBCL command to iLO2 * to do a warm reset the system and a COLD_BOOT_SERVER commad to do a * cold reset. Please note that this command doesn't bring the system and * (OS running on it down gracefully. * * Return values: * SA_OK - Normal case. * SA_ERR_HPI_CAPABILITY - Resource doesn't have SAHPI_CAPABILITY_RESET. * SA_ERR_HPI_INVALID_CMD - Resource doesn't support SAHPI_RESET_ASSERT. * SA_ERR_HPI_INVALID_CMD - Resource doesn't support SAHPI_RESET_DEASSERT. * SA_ERR_HPI_INVALID_RESOURCE - Resource doesn't exist. * SA_ERR_HPI_INVALID_PARAMS - Pointer parameter(s) are NULL; @act invalid. **/ SaErrorT ilo2_ribcl_set_reset_state(void *hnd, SaHpiResourceIdT rid, SaHpiResetActionT act) { struct oh_handler_state *handle; ilo2_ribcl_handler_t *ilo2_ribcl_handler = NULL; SaHpiRptEntryT *rpt; char *srs_cmd; char *response; /* command response buffer */ int ret; if (!hnd || NULL == oh_lookup_resetaction(act)){ err("ilo2_ribcl_set_reset_state(): Invalid parameter."); return(SA_ERR_HPI_INVALID_PARAMS); } /* ProLiant Rack Mount Server doesn't support pulsed reset. Devices that supprt pulsed reset can be held in reset for a specified perid of time using SAHPI_RESET_ASSERT followed by a SAHPI_RESET_DEASSERT. Both cold and warm reset actions initiare an ungraceful shutdown and will bring the server down even without notifying the OS. */ if (act == SAHPI_RESET_ASSERT || act == SAHPI_RESET_DEASSERT) { return(SA_ERR_HPI_INVALID_CMD); } if (act != SAHPI_COLD_RESET && act != SAHPI_WARM_RESET) { return(SA_ERR_HPI_INVALID_CMD); } handle = (struct oh_handler_state *)hnd; ilo2_ribcl_handler = (ilo2_ribcl_handler_t *)handle->data; if (!ilo2_ribcl_handler) { err("ilo2_ribcl_set_reset_state(): Invalid parameter."); return(SA_ERR_HPI_INVALID_PARAMS); } /* Check if resource exists and has reset capabilities */ rpt = oh_get_resource_by_id(handle->rptcache, rid); if (!rpt) { return(SA_ERR_HPI_INVALID_RESOURCE); } if (!(rpt->ResourceCapabilities & SAHPI_CAPABILITY_RESET)) { return(SA_ERR_HPI_CAPABILITY); } /* Allocate a temporary response buffer. */ response = malloc(ILO2_RIBCL_BUFFER_LEN); if( response == NULL){ err("ilo2_ribcl_set_reset_state: failed to allocate resp buffer."); return( SA_ERR_HPI_OUT_OF_MEMORY); } /* Retrieve our customized command buffer */ if(act == SAHPI_COLD_RESET) { srs_cmd = ilo2_ribcl_handler->ribcl_xml_cmd[ IR_CMD_COLD_BOOT_SERVER]; } else { srs_cmd = ilo2_ribcl_handler->ribcl_xml_cmd [IR_CMD_RESET_SERVER]; } if( srs_cmd == NULL){ err("ilo2_ribcl_set_reset_state: null customized command."); free( response); return( SA_ERR_HPI_INTERNAL_ERROR); } /* Send the command to iLO2 and get the response. */ ret = ilo2_ribcl_ssl_send_command( ilo2_ribcl_handler, srs_cmd, response, ILO2_RIBCL_BUFFER_LEN); if( ret != 0){ err("ilo2_ribcl_set_reset_state: command send failed."); free( response); return( SA_ERR_HPI_INTERNAL_ERROR); } /* Now, parse the response. */ ret = ir_xml_parse_reset_server(response, ilo2_ribcl_handler->ilo2_hostport); free( response); if(ret == -1) { err("ilo2_ribcl_set_reset_state: iLO2 returned error."); return( SA_ERR_HPI_INTERNAL_ERROR); } return(SA_OK); } /***************************** OpenHPI plug-in to iLO2 RIBCL plug-in ABI function mapping *****************************/ void * oh_get_reset_state (void *, SaHpiResourceIdT, SaHpiResetActionT *) __attribute__ ((weak, alias("ilo2_ribcl_get_reset_state"))); void * oh_set_reset_state (void *, SaHpiResourceIdT, SaHpiResetActionT) __attribute__ ((weak, alias("ilo2_ribcl_set_reset_state"))); openhpi-2.14.1/plugins/ilo2_ribcl/ilo2_ribcl_sensor.h0000644000076400007640000000375411302566624017472 0ustar /* * Copyright (C) 2007-2008, Hewlett-Packard Development Company, LLP * All rights reserved. * * 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. * * Neither the name of the Hewlett-Packard Corporation, nor the names * of its contributors may be used to endorse or promote products * derived from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * Author(s) * Shuah Khan * Richard White */ #ifndef _INC_ILO2_RIBCL_SENSOR_H_ #define _INC_ILO2_RIBCL_SENSOR_H_ /* Other support functions exported by ilo2_ribcl_sensor.c */ extern void ilo2_ribcl_process_sensors( struct oh_handler_state *); extern void ilo2_ribcl_init_sensor_data( ilo2_ribcl_handler_t *); #endif /* _INC_ILO2_RIBCL_SENSOR_H_ */ openhpi-2.14.1/plugins/ilo2_ribcl/ilo2_ribcl_rpt.c0000644000076400007640000001701311302566624016752 0ustar /* * Copyright (C) 2007-2008, Hewlett-Packard Development Company, LLP * All rights reserved. * * 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. * * Neither the name of the Hewlett-Packard Corporation, nor the names * of its contributors may be used to endorse or promote products * derived from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * Author(s) * Shuah Khan * Richard White */ /*************** * This source file contains Resource Presence Table (RPT) HPI ABI routines * iLO2 RIBCL plug-in implements. Other source files provide support * functionality for these ABIs. ***************/ #include #include #include /***************************** iLO2 RIBCL plug-in Resource Presence Table (RPT) ABI Interface functions. *****************************/ /** * ilo2_ribcl_set_resource_severity: * @hnd: Handler data pointer. * @rid: Resource ID. * @tag: Resource's severity. * * Sets severity of events when resource unexpectedly becomes unavailable. * * Return values: * SA_OK - Normal case. * SA_ERR_HPI_INVALID_PARAMS - @sev is invalid. * SA_ERR_HPI_OUT_OF_MEMORY - No memory to allocate event. **/ SaErrorT ilo2_ribcl_set_resource_severity(void *hnd, SaHpiResourceIdT rid, SaHpiSeverityT sev) { SaHpiRptEntryT *rpt; struct oh_handler_state *handle; ilo2_ribcl_handler_t *ilo2_ribcl_handler = NULL; ilo2_ribcl_resource_info_t *res_info = NULL; struct oh_event *e; if (oh_lookup_severity(sev) == NULL) { err("ilo2_ribcl_set_resource_severity(): Invalid parameter"); return(SA_ERR_HPI_INVALID_PARAMS); } handle = (struct oh_handler_state *)hnd; ilo2_ribcl_handler = (ilo2_ribcl_handler_t *)handle->data; if (!ilo2_ribcl_handler) { err("ilo2_ribcl_set_resource_severity(): Invalid parameter."); return(SA_ERR_HPI_INVALID_PARAMS); } rpt = oh_get_resource_by_id(handle->rptcache, rid); if (!rpt) { err("ilo2_ribcl_set_resource_severity(): No RID."); return(SA_ERR_HPI_INVALID_RESOURCE); } rpt->ResourceSeverity = sev; res_info = (ilo2_ribcl_resource_info_t *)oh_get_resource_data( handle->rptcache, rpt->ResourceId); if (!res_info) { err("ilo2_ribcl_set_resource_severity(): no resource info."); return(SA_ERR_HPI_INVALID_RESOURCE); } /* Add changed resource to event queue */ e = oh_new_event(); if (e == NULL) { err("ilo2_ribcl_set_resource_severity(): Out of memory."); return(SA_ERR_HPI_OUT_OF_MEMORY); } e->resource = *rpt; /* Construct .event of struct oh_event */ e->event.Severity = e->resource.ResourceSeverity; e->event.Source = e->resource.ResourceId; if (oh_gettimeofday(&e->event.Timestamp) != SA_OK) { e->event.Timestamp = SAHPI_TIME_UNSPECIFIED; } if (e->resource.ResourceCapabilities & SAHPI_CAPABILITY_FRU) { e->event.EventType = SAHPI_ET_HOTSWAP; e->event.EventDataUnion.HotSwapEvent.HotSwapState = e->event.EventDataUnion.HotSwapEvent.HotSwapState = res_info->fru_cur_state; } else { e->event.EventType = SAHPI_ET_RESOURCE; e->event.EventDataUnion.ResourceEvent.ResourceEventType = SAHPI_RESE_RESOURCE_ADDED; } /* Prime event to evenq */ e->hid = handle->hid; oh_evt_queue_push(handle->eventq, e); return(SA_OK); } /** * ilo2_ribcl_set_resource_tag: * @hnd: Handler data pointer. * @rid: Resource ID. * @tag: Pointer to SaHpiTextBufferT. * * Sets resource's tag. * * Return values: * SA_OK - Normal case. * SA_ERR_HPI_INVALID_PARAMS - @tag is NULL or invalid. * SA_ERR_HPI_OUT_OF_MEMORY - No memory to allocate event. **/ SaErrorT ilo2_ribcl_set_resource_tag(void *hnd, SaHpiResourceIdT rid, SaHpiTextBufferT *tag) { SaErrorT err; SaHpiRptEntryT *rpt; struct oh_event *e; ilo2_ribcl_handler_t *ilo2_ribcl_handler = NULL; ilo2_ribcl_resource_info_t *res_info = NULL; struct oh_handler_state *handle; if (!oh_valid_textbuffer(tag) || !hnd) { err("ilo2_ribcl_set_resource_tag((): Invalid parameter"); return(SA_ERR_HPI_INVALID_PARAMS); } handle = (struct oh_handler_state *)hnd; ilo2_ribcl_handler = (ilo2_ribcl_handler_t *)handle->data; if (!ilo2_ribcl_handler) { err("ilo2_ribcl_set_resource_tag(): Invalid parameter."); return(SA_ERR_HPI_INVALID_PARAMS); } rpt = oh_get_resource_by_id(handle->rptcache, rid); if (!rpt) { err("ilo2_ribcl_set_resource_tag(): No RID."); return(SA_ERR_HPI_INVALID_RESOURCE); } err = oh_copy_textbuffer(&(rpt->ResourceTag), tag); if (err) { err("ilo2_ribcl_set_resource_tag(): Cannot copy textbuffer"); return(err); } res_info = (ilo2_ribcl_resource_info_t *)oh_get_resource_data( handle->rptcache, rpt->ResourceId); if (!res_info) { err("ilo2_ribcl_set_resource_severity(): no resource info."); return(SA_ERR_HPI_INVALID_RESOURCE); } /* Add changed resource to event queue */ e = oh_new_event(); if (e == NULL) { err("ilo2_ribcl_set_resource_tag(): Out of memory."); return(SA_ERR_HPI_OUT_OF_MEMORY); } e->resource = *rpt; /* Construct .event of struct oh_event */ e->event.Severity = e->resource.ResourceSeverity; e->event.Source = e->resource.ResourceId; if (oh_gettimeofday(&e->event.Timestamp) != SA_OK) { e->event.Timestamp = SAHPI_TIME_UNSPECIFIED; } if (e->resource.ResourceCapabilities & SAHPI_CAPABILITY_FRU) { e->event.EventType = SAHPI_ET_HOTSWAP; e->event.EventDataUnion.HotSwapEvent.HotSwapState = e->event.EventDataUnion.HotSwapEvent.HotSwapState = res_info->fru_cur_state; } else { e->event.EventType = SAHPI_ET_RESOURCE; e->event.EventDataUnion.ResourceEvent.ResourceEventType = SAHPI_RESE_RESOURCE_ADDED; } /* Prime event to evenq */ e->hid = handle->hid; oh_evt_queue_push(handle->eventq, e); return(SA_OK); } /***************************** OpenHPI plug-in to iLO2 RIBCL plug-in ABI function mapping *****************************/ void *oh_set_resource_tag (void *, SaHpiResourceIdT, SaHpiTextBufferT *) __attribute__ ((weak, alias("ilo2_ribcl_set_resource_tag"))); void *oh_set_resource_severity (void *, SaHpiResourceIdT, SaHpiSeverityT) __attribute__ ((weak, alias("ilo2_ribcl_set_resource_severity"))); openhpi-2.14.1/plugins/ilo2_ribcl/ilo2_ribcl_ssl.h0000644000076400007640000000403311302566624016751 0ustar /* * Copyright (C) 2007-2008, Hewlett-Packard Development Company, LLP * All rights reserved. * * 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. * * Neither the name of the Hewlett-Packard Corporation, nor the names * of its contributors may be used to endorse or promote products * derived from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * Author(s) * Shuah Khan * Richard White */ #ifndef _INC_ILO2_RIBCL_SSL_H_ #define _INC_ILO2_RIBCL_SSL_H_ #include /* * This file defines prototypes for the iLO2 RIBCL plug-in iLO2 SSL connection * management functions implemented in ilo2_ribcl_ssl.c */ extern int ilo2_ribcl_ssl_send_command(ilo2_ribcl_handler_t *, char *, char *, int); #endif /* _INC_ILO2_RIBCL_SSL_H_ */ openhpi-2.14.1/plugins/ilo2_ribcl/ilo2_ribcl_idr.h0000644000076400007640000000550211302566624016730 0ustar /* * Copyright (C) 2007-2008, Hewlett-Packard Development Company, LLP * All rights reserved. * * 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. * * Neither the name of the Hewlett-Packard Corporation, nor the names * of its contributors may be used to endorse or promote products * derived from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * Author(s) * Shuah Khan * Richard White */ #ifndef _INC_ILO2_RIBCL_IDR_H_ #define _INC_ILO2_RIBCL_IDR_H_ /* These are the functions exported by ilo2_ribcl_idr.c for other modules * to use. */ extern SaErrorT ilo2_ribcl_add_idr( struct oh_handler_state *, struct oh_event *, SaHpiIdrIdT, struct ilo2_ribcl_idr_info *, char *); extern void ilo2_ribcl_discover_chassis_idr( struct oh_handler_state *, struct oh_event *, char *); extern void ilo2_ribcl_update_fru_idr( struct oh_handler_state *, SaHpiEntityPathT *, struct ilo2_ribcl_idr_info *); extern void ilo2_ribcl_update_chassis_idr( struct oh_handler_state *, SaHpiEntityPathT *); extern void ilo2_ribcl_build_chassis_idr( ilo2_ribcl_handler_t *, struct ilo2_ribcl_idr_info *); extern void ilo2_ribcl_build_cpu_idr( ilo2_ribcl_handler_t *ir_handler, struct ilo2_ribcl_idr_info *); extern void ilo2_ribcl_build_memory_idr( ir_memdata_t *, struct ilo2_ribcl_idr_info *); #endif /* _INC_ILO2_RIBCL_IDR_H_ */ openhpi-2.14.1/plugins/ilo2_ribcl/ilo2_ribcl_ssl.c0000644000076400007640000001034111302566624016743 0ustar /* * Copyright (C) 2007-2008, Hewlett-Packard Development Company, LLP * All rights reserved. * * 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. * * Neither the name of the Hewlett-Packard Corporation, nor the names * of its contributors may be used to endorse or promote products * derived from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * Author(s) * Shuah Khan * Richard White */ /***************************** * This file implements the iLO2 RIBCL plug-in iLO2 SSL connection * management functionality that is not part of the infrastructure. * It supports the following function: * * ilo2_ribcl_ssl_send_command - Send a command, reading the response *****************************/ /* TODO: Evaluate whether a shorter timeout value should be used. This * affects calls to oh_ssl_connect(), oh_ssl_read(), and oh_ssl_write(). */ /* Header files */ #include #include #include /** * ilo2_ribcl_ssl_send_command * @ir_handler: Ptr to this instance's private handler. * @cmnd_buf: Ptr to buffer containing the RIBCL command(s) to send. * @resp_buf: Ptr to buffer into which the response will be written. * @resp_buf_size: Size (in bytes) of the response buffer. * * This routine will send the contents of the RIBCL command buffer cmnd_buf * to the iLO2 addressed by the plugin private handler ir_handler. The response * from iLO2 will be stored in the null terminated character buffer pointed * to by resp_buf. * * Return values: * 0 success. * -1 failure. **/ int ilo2_ribcl_ssl_send_command( ilo2_ribcl_handler_t *ir_handler, char *cmnd_buf, char *resp_buf, int resp_size) { void *ssl_handler = NULL; int in_index; int ret; /* Zero out the response buffer */ memset( resp_buf, 0, resp_size); ssl_handler = oh_ssl_connect( ir_handler->ilo2_hostport, ir_handler->ssl_ctx, 0); if( ssl_handler == NULL){ err("ilo2_ribcl_ssl_send_command(): " "oh_ssl_connect returned NULL."); return( -1); } /* Send the XML header. iLO2 requires the header to be sent ahead separately from the buffer containing the command. */ ret = oh_ssl_write(ssl_handler, ILO2_RIBCL_XML_HDR, sizeof(ILO2_RIBCL_XML_HDR), 0); if( ret < 0){ err("ilo2_ribcl_ssl_send_command(): " "write of xml header to socket failed."); oh_ssl_disconnect(ssl_handler, OH_SSL_BI); return( -1); } /* Send the command buffer. */ ret = oh_ssl_write(ssl_handler, cmnd_buf, strlen(cmnd_buf), 0); if( ret < 0){ err("ilo2_ribcl_ssl_send_command(): " "write of xml command to socket failed."); oh_ssl_disconnect(ssl_handler, OH_SSL_BI); return( -1); } ret = 0; in_index = 0; while( 1){ ret = oh_ssl_read( ssl_handler, &(resp_buf[in_index]), (resp_size - in_index), 0); if( ret <= 0){ break; } in_index = in_index + ret; } resp_buf[in_index] = '\0'; /* cleanup */ oh_ssl_disconnect(ssl_handler, OH_SSL_BI); return( 0); } /* end ilo2_ribcl_ssl_send_command */ openhpi-2.14.1/plugins/ilo2_ribcl/ilo2_ribcl.h0000644000076400007640000004665511302566624016110 0ustar /* * Copyright (C) 2007-2008, Hewlett-Packard Development Company, LLP * All rights reserved. * * 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. * * Neither the name of the Hewlett-Packard Corporation, nor the names * of its contributors may be used to endorse or promote products * derived from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * Author(s) * Shuah Khan * Richard White */ #ifndef _INC_ILO2_RIBCL_H_ #define _INC_ILO2_RIBCL_H_ /*************** * This header file contains all of the iLO2 RIBCL internal data structure * definitions. This file is intended to be included in all of the iLO2 RIBCL * source files. ***************/ #include #include #include #include #include #include #include #include #include #include "ilo2_ribcl_cmnds.h" /* The macro ILO2_RIBCL_SIMULATE_iLO2_RESPONSE is used to conditionally * compile code which reads a simulated iLO2 response from a local * file rather than communicating with an actual iLO2. This is used for * testing when specific responses are needed, or in an environment where * an iLO2 is not available. The filename for the response for each command * is specified in the openhpi.conf configuration file. The currently supported * names are: * "discovery_responsefile" - file used by ilo2_ribcl_do_discovery(). */ /* #define ILO2_RIBCL_SIMULATE_iLO2_RESPONSE */ /* * ILO2 RIBCL User name * Maximum length - 39 * any combination of printable characters * case sensitive * must not be blank */ #define ILO2_RIBCL_USER_NAME_MAX_LEN 39 #define ILO2_RIBCL_USER_NAME_MIN_LEN 1 /* * ILO2 RIBCL password * Maximum length - 39 * any combination of printable characters * case sensitive * Minimum length - 0 * Minimum default length - 8 */ #define ILO2_RIBCL_PASSWORD_MAX_LEN 39 #define ILO2_RIBCL_PASSWORD_MIN_LEN 1 /* * ILO2 RIBCL Hostname Length defines */ #define ILO2_HOST_NAME_MAX_LEN 256 /* A valid IP addr will have a min. len of 7 4 digts + 3 decimal points */ #define ILO2_HOST_NAME_MIN_LEN 7 /* Minimum length port string */ #define ILO2_MIN_PORT_STR_LEN 1 /* * RIBCL command and response buffer length - static for now. * Change to dynamic if need be. */ #define ILO2_RIBCL_BUFFER_LEN 4096 /* * Power and reset status definitions */ #define ILO2_RIBCL_POWER_OFF 0 #define ILO2_RIBCL_POWER_ON 1 #define ILO2_RIBCL_RESET_SUCCESS 1 #define ILO2_RIBCL_RESET_FAILED 0 /* * For a oh_set_power_state() call with a state parameter of * SAHPI_POWER_CYCLE, we must wait until the server actually powers off * before powering it back on again. * The total turnaround time for a RIBCL command is around 10 seconds, * so the total time spent waiting for the system to power off (in seconds) * will be ((ILO2_POWER_POLL_SLEEP_SECONDS + 10) * ILO2_MAX_POWER_POLLS) * The default timing below will wait a maximum of 200 seconds. */ #define ILO2_MAX_POWER_POLLS 10 #define ILO2_POWER_POLL_SLEEP_SECONDS 10 /* * get_event return value when there are events pending to be processed. * OpenHPI framework doesn't provide mnemonic for this return value. */ #define ILO2_RIBCL_EVENTS_PENDING 1 /* * Resource doesn't support managed hot swap. OpenHPI fails to define * mnemonic for this value */ #define ILO2_RIBCL_MANAGED_HOTSWAP_CAP_FALSE 0 /****************************************************************************** * The following data structures and macros are used for our implementation * of Inventory Data Repositories. * * Currently, we only have one area in out IDRs. The plugin has been * written to easily add more areas in the future. */ #define I2R_MAX_AREA 1 #define I2R_MAX_FIELDS 4 #define I2R_MAX_FIELDCHARS 32 /* These are the index values for fields in the chassis IDR */ #define I2R_CHASSIS_IF_PRODNAME 0 #define I2R_CHASSIS_IF_SERNUM 1 #define I2R_CHASSIS_IF_MANUFACT 2 #define I2R_CHASSIS_IF_ILO2VERS 3 /* These are the index values for fields in the memory DIMM IDR */ #define I2R_MEM_IF_SIZE 0 #define I2R_MEM_IF_SPEED 1 /* These are the index values for fields in the cpu IDR */ #define I2R_CPU_IF_SPEED 0 typedef struct { SaHpiIdrFieldTypeT field_type; char field_string[I2R_MAX_FIELDCHARS]; } I2R_FieldT; typedef struct { SaHpiIdrAreaTypeT area_type; SaHpiUint32T num_fields; /* Number of used fields */ I2R_FieldT area_fields[I2R_MAX_FIELDS]; } I2R_AreaT; struct ilo2_ribcl_idr_info { SaHpiUint32T update_count; SaHpiUint32T num_areas; I2R_AreaT idr_areas[I2R_MAX_AREA]; }; /* The structure passed as a parameter to ilo2_ribcl_get_idr_allinfo() and * ilo2_ribcl_get_idr_allinfo_by_ep(), which collects all the associated * HPI data for an IDR */ struct ilo2_ribcl_idr_allinfo { SaHpiRptEntryT *rpt; SaHpiRdrT *rdr; struct ilo2_ribcl_idr_info *idrinfo; }; /****************************************************************************** * The following data structures and macros are used for our implementation * of Sensors. * * Currently, we only implement chassis sensors of event category * SAHPI_EC_SEVERITY. The plugin has been written to add more sensor * categories in the future. */ /* These are the values for our severity level sensors */ #define I2R_SEN_VAL_OK 0 #define I2R_SEN_VAL_DEGRADED 1 #define I2R_SEN_VAL_FAILED 2 #define I2R_SEN_VAL_UNINITIALIZED -1 /* The number of chassis sensors for our data structures. Note that * sensor numbers begin with 1, so this number may be one greater than * you would think. */ #define I2R_NUM_CHASSIS_SENSORS 4 /* These are the sensor numbers for the sensors on our chassis */ #define I2R_SEN_FANHEALTH 1 #define I2R_SEN_TEMPHEALTH 2 #define I2R_SEN_POWERHEALTH 3 /* These are the descriptions for the chassis sensors */ #define I2R_SEN_FANHEALTH_DESCRIPTION "System fans health indicator: Ok(0)/Degraded(1)/Failed(2)" #define I2R_SEN_TEMPHEALTH_DESCRIPTION "System temperature health indicator: Ok(0)/Failed(2)" #define I2R_SEN_POWERHEALTH_DESCRIPTION "System power supply health indicator: Ok(0)/Degraded(1)/Failed(2)" /* The three state severity model (OK, Degraded, Fail) used for iLo2 RIBCL * sensors will support these sensor event states */ #define I2R_SEVERITY_THREESTATE_EV (SAHPI_ES_OK | \ SAHPI_ES_MAJOR_FROM_LESS | \ SAHPI_ES_MAJOR_FROM_CRITICAL | \ SAHPI_ES_CRITICAL) /* The two state severity model (OK, Failed) used for iLo2 RIBCL sensors will * support these HPI sensor event states */ #define I2R_SEVERITY_TWOSTATE_EV (SAHPI_ES_OK | SAHPI_ES_CRITICAL) /* The private data for our sensor, associated with it's RDR. */ struct ilo2_ribcl_sensinfo { SaHpiSensorNumT sens_num; /* Sensor number */ SaHpiEventStateT sens_ev_state; /* Current sensor event state */ SaHpiEventStateT prev_sens_ev_state; /* Previous sensor event state */ SaHpiEventStateT event_sens_ev_state; /* ev state to send with event */ SaHpiBoolT sens_enabled; /* Sensor enable */ SaHpiBoolT sens_ev_enabled; /* Sensor event enable */ SaHpiEventStateT sens_assertmask; SaHpiEventStateT sens_deassertmask; int sens_value; }; /* Structure used by ilo2_ribcl_get_sensor_rdr_data() to return a pointer to * the sensor RDR and it's associated private data. */ struct ilo2_ribcl_sens_allinfo { SaHpiRptEntryT *rpt; SaHpiRdrT *rdr; struct ilo2_ribcl_sensinfo *sens_dat; }; /* These are the state for software state machines that process the iLo2 * sensors. We currently only support Severity sensors, but more states * can be added later. */ typedef enum { I2R_INITIAL = 0, I2R_OK = 1, I2R_DEGRADED_FROM_OK = 2, I2R_DEGRADED_FROM_FAIL = 3, I2R_FAILED = 4, I2R_NO_EXIST = 0xFFFF } I2R_SensorStateT; /* All the types of sensor readings that we hande will be contained in this * union. */ typedef union { int intval; } I2R_ReadingUnionT; /* Structure to store a sensor's dynamic reading in our private handler */ typedef struct { SaHpiResourceIdT rid; /* So we can locate other HPI info from here */ I2R_SensorStateT state; I2R_ReadingUnionT reading; } I2R_SensorDataT; /****************************************************************************** * The following data structures are used to save the discovery data. * This data cache will be used to implement APIs that require state * information and additional information on components such as speed, * and control capabilities. The index into this field, rid, and hotswap * state of each component will be added to the RPT private data cache * via oh_add_resource() when each component is discovered. */ /* Discover states for a resource */ enum ir_discoverstate { BLANK=0, OK=1, FAILED=2, REMOVED=3}; /* Values for flags fields in DiscoveryData structures */ #define IR_DISCOVERED 0x01 #define IR_EXISTED 0x02 #define IR_FAILED 0x04 #define IR_SPEED_UPDATED 0x08 typedef struct ir_cpudata { unsigned int cpuflags; enum ir_discoverstate dstate; char *label; } ir_cpudata_t; typedef struct ir_memdata { unsigned int memflags; enum ir_discoverstate dstate; char *label; char *memsize; char *speed; } ir_memdata_t; typedef struct ir_fandata{ unsigned int fanflags; enum ir_discoverstate dstate; char *label; char *zone; char *status; int speed; char *speedunit; } ir_fandata_t; typedef struct ir_psudata{ unsigned int psuflags; enum ir_discoverstate dstate; char *label; char *status; } ir_psudata_t; typedef struct ir_vrmdata{ unsigned int vrmflags; enum ir_discoverstate dstate; char *label; char *status; } ir_vrmdata_t; typedef struct ir_tsdata{ unsigned int tsflags; char *label; char *location; char *status; char *reading; char *readingunits; } ir_tsdata_t; /* Firmware Revision Information */ typedef struct ir_fwdata{ char *version_string; SaHpiUint8T FirmwareMajorRev; SaHpiUint8T FirmwareMinorRev; } ir_fwdata_t; #define ILO2_RIBCL_DISCOVER_CPU_MAX 16 #define ILO2_RIBCL_DISCOVER_MEM_MAX 32 #define ILO2_RIBCL_DISCOVER_FAN_MAX 16 #define ILO2_RIBCL_DISCOVER_PSU_MAX 8 #define ILO2_RIBCL_DISCOVER_VRM_MAX 8 #define ILO2_RIBCL_DISCOVER_TS_MAX 48 #define ILO2_RIBCL_CHASSIS_INDEX -1; /* Index is not aplicable to chassis */ typedef struct ilo2_ribcl_DiscoveryData { char *product_name; char *serial_number; char *system_cpu_speed; ir_cpudata_t cpudata[ ILO2_RIBCL_DISCOVER_CPU_MAX+1]; ir_memdata_t memdata[ ILO2_RIBCL_DISCOVER_MEM_MAX+1]; ir_fandata_t fandata[ ILO2_RIBCL_DISCOVER_FAN_MAX+1]; ir_psudata_t psudata[ ILO2_RIBCL_DISCOVER_PSU_MAX+1]; ir_vrmdata_t vrmdata[ ILO2_RIBCL_DISCOVER_VRM_MAX+1]; ir_tsdata_t tsdata[ ILO2_RIBCL_DISCOVER_TS_MAX+1]; I2R_SensorDataT chassis_sensors[I2R_NUM_CHASSIS_SENSORS]; ir_fwdata_t fwdata; } ilo2_ribcl_DiscoveryData_t; /* iLO2 RIBCL plug-in handler structure */ typedef struct ilo2_ribcl_handler { char *entity_root; int first_discovery_done; /* Storehouse for data obtained during discovery */ ilo2_ribcl_DiscoveryData_t DiscoveryData; /* RIBCL data */ char *user_name; char *password; /* iLO2 hostname and port number information */ char *ilo2_hostport; #ifdef ILO2_RIBCL_SIMULATE_iLO2_RESPONSE /* Discovery response file for testing */ char *discovery_responsefile; #endif /* ILO2_RIBCL_SIMULATE_iLO2_RESPONSE */ /* SSL connection status */ SSL_CTX *ssl_ctx; /* SSL connection handler pointer */ BIO *ssl_handler; /* Commands customized with the login and password for this system */ char *ribcl_xml_cmd[ IR_NUM_COMMANDS]; GSList *eventq; /* Event queue cache */ /* During discovery, soem routines need a temporary buffer for * struct ilo2_ribcl_idr_info. It's a bit too large to use as * as local variable on the stack, and allocating/deallocating * it frequently could fragment memory. So, we keep it here * in our private handler for all routines to use. */ struct ilo2_ribcl_idr_info tmp_idr; } ilo2_ribcl_handler_t; /* Define for uninitialized power_cur_state value. Power status is not queried during discovery and power_cur_state field will be initialized to reflect an uninitialized state. */ #define ILO2_RIBCL_POWER_STATUS_UNKNOWN -1 /* iLO2 RIBCL private resource data */ typedef struct ilo2_ribcl_resource_info { SaHpiResourceIdT rid; SaHpiHsStateT fru_cur_state; /* current simple hotswap state of FRU resources */ int disc_data_idx; /* resource index into the Discovery Data Cache */ SaHpiPowerStateT power_cur_state; /* current power state */ } ilo2_ribcl_resource_info_t; /* iLO2 RIBCL control type and index definitions. */ #define ILO2_RIBCL_CTL_UID 1 #define ILO2_RIBCL_CONTROL_1 1 #define ILO2_RIBCL_CTL_POWER_SAVER 2 #define ILO2_RIBCL_CONTROL_2 2 #define ILO2_RIBCL_CTL_AUTO_POWER 3 #define ILO2_RIBCL_CONTROL_3 3 /* * UID Control status definitions */ #define ILO2_RIBCL_UID_OFF 0 #define ILO2_RIBCL_UID_ON 1 #define ILO2_RIBCL_UID_SET_SUCCESS 1 #define ILO2_RIBCL_UID_SET_FAILED 0 /* Power Saver Control defines */ /* The following outlines the Power Regulator feature: The values are 1 = OS Control Mode (Disabled Mode for iLO) 2 = HP Static Low Power Mode 3 = HP Dynamic Power Savings Mode 4 = HP Static High Performance Mode Note: Value 4 is availble only for iLO 2 firmware version 1.20 and later. */ /* OS Control Mode (Disabled Mode for iLO) */ #define ILO2_RIBCL_MANUAL_OS_CONTROL_MODE 1 /* HP Static Low Power Mode */ #define ILO2_RIBCL_MANUAL_LOW_POWER_MODE 2 /* HP Dynamic Power Savings Mode. */ #define ILO2_RIBCL_AUTO_POWER_SAVE_MODE 3 /* HP Static High Performance Mode */ #define ILO2_RIBCL_MANUAL_HIGH_PERF_MODE 4 /* The following outlines the Auto Power feature: The Auto Power Control allows user to change the automatic power on and power on delay settings of the server. The values are Yes = Enable automatic power on with a minimum delay. No = Disable automatic power on. 15 = Enable automatic power on with 15 seconds delay. 30 = Enable automatic power on with 30 seconds delay. 45 = Enable automatic power on with 45 seconds delay. 60 = Enable automatic power on with 60 seconds delay. Random = Enable automatic power on with random delay up to 60 seconds. */ #define ILO2_RIBCL_AUTO_POWER_ENABLED 1 #define ILO2_RIBCL_AUTO_POWER_DISABLED 2 #define ILO2_RIBCL_AUTO_POWER_DELAY_RANDOM 3 #define ILO2_RIBCL_AUTO_POWER_DELAY_15 15 #define ILO2_RIBCL_AUTO_POWER_DELAY_30 30 #define ILO2_RIBCL_AUTO_POWER_DELAY_45 45 #define ILO2_RIBCL_AUTO_POWER_DELAY_60 60 /* iLO2 RIBCL plug-in intenal data structure to save plug-in private control data. This structure is used to save the current mode and current state information of a control. */ typedef struct ilo2_ribcl_cinfo { int ctl_type; /* internal control type */ SaHpiCtrlModeT cur_mode; SaHpiCtrlStateUnionT cur_state; } ilo2_ribcl_cinfo_t; /***************************** Prototypes for iLO2 RIBCL plug-in ABI functions *****************************/ /* The following fucntions are defined in ilo2_ribcl.c */ extern void *ilo2_ribcl_open(GHashTable *, unsigned int , oh_evt_queue *); extern void ilo2_ribcl_close(void *); extern SaErrorT ilo2_ribcl_get_event(void *); /* The following fucntions are defined in ilo2_ribcl_discover.c */ extern SaErrorT ilo2_ribcl_discover_resources(void *); /* The following functions are defined in ilo2_ribcl_reset.c */ extern SaErrorT ilo2_ribcl_get_reset_state(void *, SaHpiResourceIdT, SaHpiResetActionT *); extern SaErrorT ilo2_ribcl_set_reset_state(void *hnd, SaHpiResourceIdT rid, SaHpiResetActionT act); /* The following functions are defined in ilo2_ribcl_reset.c */ extern SaErrorT ilo2_ribcl_get_power_state(void *hnd, SaHpiResourceIdT rid, SaHpiPowerStateT *state); extern SaErrorT ilo2_ribcl_set_power_state(void *hnd, SaHpiResourceIdT rid, SaHpiPowerStateT state); /* The following functions are defined in ilo2_ribcl_rpt.c */ extern SaErrorT ilo2_ribcl_set_resource_severity(void *, SaHpiResourceIdT, SaHpiSeverityT); extern SaErrorT ilo2_ribcl_set_resource_tag(void *, SaHpiResourceIdT, SaHpiTextBufferT *); /* The following functions are defined in ilo2_ribcl_control.c */ extern SaErrorT ilo2_ribcl_get_control_state(void *, SaHpiResourceIdT , SaHpiCtrlNumT , SaHpiCtrlModeT *, SaHpiCtrlStateT *); extern SaErrorT ilo2_ribcl_set_control_state(void *, SaHpiResourceIdT , SaHpiCtrlNumT , SaHpiCtrlModeT , SaHpiCtrlStateT *); /* The following functions are defined in ilo2_ribcl_idr.c */ extern SaErrorT ilo2_ribcl_get_idr_info(void *, SaHpiResourceIdT, SaHpiIdrIdT, SaHpiIdrInfoT *); extern SaErrorT ilo2_ribcl_get_idr_area_header(void *, SaHpiResourceIdT, SaHpiIdrIdT, SaHpiIdrAreaTypeT, SaHpiEntryIdT, SaHpiEntryIdT *, SaHpiIdrAreaHeaderT *); extern SaErrorT ilo2_ribcl_get_idr_field(void *, SaHpiResourceIdT, SaHpiIdrIdT, SaHpiEntryIdT, SaHpiIdrFieldTypeT, SaHpiEntryIdT, SaHpiEntryIdT *, SaHpiIdrFieldT *); extern SaErrorT ilo2_ribcl_add_idr_area( void *, SaHpiResourceIdT, SaHpiIdrIdT, SaHpiIdrAreaTypeT, SaHpiEntryIdT *); extern SaErrorT ilo2_ribcl_del_idr_area( void *, SaHpiResourceIdT, SaHpiIdrIdT, SaHpiEntryIdT); extern SaErrorT ilo2_ribcl_add_idr_field( void *, SaHpiResourceIdT, SaHpiIdrIdT, SaHpiIdrFieldT *); extern SaErrorT ilo2_ribcl_set_idr_field( void *, SaHpiResourceIdT, SaHpiIdrIdT, SaHpiIdrFieldT *); extern SaErrorT ilo2_ribcl_del_idr_field( void *, SaHpiResourceIdT, SaHpiIdrIdT, SaHpiEntryIdT, SaHpiEntryIdT); extern SaErrorT ilo2_ribcl_add_idr( struct oh_handler_state *, struct oh_event *, SaHpiIdrIdT, struct ilo2_ribcl_idr_info *, char *); /* The following functions are defined in ilo2_ribcl_idr.c */ extern SaErrorT ilo2_ribcl_get_sensor_reading(void *, SaHpiResourceIdT, SaHpiSensorNumT, SaHpiSensorReadingT *, SaHpiEventStateT *); extern SaErrorT ilo2_ribcl_get_sensor_enable(void *hnd, SaHpiResourceIdT, SaHpiSensorNumT, SaHpiBoolT *); extern SaErrorT ilo2_ribcl_set_sensor_enable(void *, SaHpiResourceIdT, SaHpiSensorNumT, SaHpiBoolT); extern SaErrorT ilo2_ribcl_get_sensor_event_enable(void *, SaHpiResourceIdT, SaHpiSensorNumT, SaHpiBoolT *); extern SaErrorT ilo2_ribcl_set_sensor_event_enable(void *, SaHpiResourceIdT, SaHpiSensorNumT, SaHpiBoolT); extern SaErrorT ilo2_ribcl_get_sensor_event_masks(void *, SaHpiResourceIdT, SaHpiSensorNumT, SaHpiEventStateT *, SaHpiEventStateT *); extern SaErrorT ilo2_ribcl_set_sensor_event_masks(void *, SaHpiResourceIdT, SaHpiSensorNumT, SaHpiSensorEventMaskActionT, SaHpiEventStateT, SaHpiEventStateT); #endif /* _INC_ILO2_RIBCL_H_ */ openhpi-2.14.1/plugins/ilo2_ribcl/ilo2_ribcl_xml.c0000644000076400007640000023112211302566624016744 0ustar /* * Copyright (C) 2007-2008, Hewlett-Packard Development Company, LLP * All rights reserved. * * 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. * * Neither the name of the Hewlett-Packard Corporation, nor the names * of its contributors may be used to endorse or promote products * derived from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * Author(s) * Shuah Khan * Richard White */ /***************************** * This file implements the iLO2 RIBCL plug-in XML functionality and provides * functions to parse XML responses from RIBCL. Uses libxml2 * *****************************/ #include #include #include #include #include #include #include #include #include #include #include /* forward declarations */ static xmlNodePtr ir_xml_find_node( xmlNodePtr, char *); static int ir_xml_checkresults_doc( xmlDocPtr, char *); static int ir_xml_scan_response( xmlNodePtr, char *); static char *ir_xml_convert_buffer( char*, int *); static xmlDocPtr ir_xml_doparse( char *); static int ir_xml_scan_fans( ilo2_ribcl_handler_t *, xmlNodePtr); static int ir_xml_record_fandata( ilo2_ribcl_handler_t *, char *, char *, char *, char *, char *); static void ir_xml_scan_temperature( ilo2_ribcl_handler_t *, xmlNodePtr); static void ir_xml_scan_firmware_revision(ilo2_ribcl_handler_t *, xmlNodePtr); static int ir_xml_scan_vrm( ilo2_ribcl_handler_t *, xmlNodePtr); static int ir_xml_record_vrmdata( ilo2_ribcl_handler_t *, char *, char *); static int ir_xml_scan_power( ilo2_ribcl_handler_t *, xmlNodePtr); static int ir_xml_record_psdata( ilo2_ribcl_handler_t *, char *, char *); static int ir_xml_scan_health_at_a_glance( ilo2_ribcl_handler_t *, xmlNodePtr); static int ir_xml_stat_to_reading( char *); static int ir_xml_scan_smbios_1( ilo2_ribcl_handler_t *, xmlNodePtr); static int ir_xml_scan_smbios_4( ilo2_ribcl_handler_t *, xmlNodePtr); static int ir_xml_scan_smbios_17( ilo2_ribcl_handler_t *, xmlNodePtr, int *); static int ir_xml_record_memdata( ilo2_ribcl_handler_t *, int *, char *, char *, char *); static xmlChar *ir_xml_smb_get_value( char *, xmlNodePtr); static int ir_xml_insert_logininfo( char *, int, char *, char *, char *); static int ir_xml_extract_index( char *, char *, int); static int ir_xml_replacestr( char **, char *); /* Error return values for ir_xml_extract_index */ #define IR_NO_PREFIX -1 #define IR_NO_INDEX -2 /* array containing all the RIBCL xml command templates */ char *ir_xml_cmd_templates[] = { [IR_CMD_GET_SERVER_DATA] ILO2_RIBCL_GET_SERVER_DATA, [IR_CMD_GET_HOST_POWER_STATUS] ILO2_RIBCL_GET_HOST_POWER_STATUS, [IR_CMD_SET_HOST_POWER_ON] ILO2_RIBCL_SET_HOST_POWER_ON, [IR_CMD_SET_HOST_POWER_OFF] ILO2_RIBCL_SET_HOST_POWER_OFF, [IR_CMD_RESET_SERVER] ILO2_RIBCL_RESET_SERVER, [IR_CMD_COLD_BOOT_SERVER] ILO2_RIBCL_COLD_BOOT_SERVER, [IR_CMD_GET_UID_STATUS] ILO2_RIBCL_GET_UID_STATUS, [IR_CMD_UID_CONTROL_OFF] ILO2_RIBCL_UID_CONTROL_OFF, [IR_CMD_UID_CONTROL_ON] ILO2_RIBCL_UID_CONTROL_ON, [IR_CMD_GET_HOST_POWER_SAVER_STATUS] ILO2_RIBCL_GET_HOST_POWER_SAVER_STATUS, [IR_CMD_SET_HOST_POWER_SAVER_1] ILO2_RIBCL_SET_HOST_POWER_SAVER_1, [IR_CMD_SET_HOST_POWER_SAVER_2] ILO2_RIBCL_SET_HOST_POWER_SAVER_2, [IR_CMD_SET_HOST_POWER_SAVER_3] ILO2_RIBCL_SET_HOST_POWER_SAVER_3, [IR_CMD_SET_HOST_POWER_SAVER_4] ILO2_RIBCL_SET_HOST_POWER_SAVER_4, [IR_CMD_GET_SERVER_AUTO_PWR] ILO2_RIBCL_GET_SERVER_AUTO_PWR, [IR_CMD_SERVER_AUTO_PWR_YES] ILO2_RIBCL_SERVER_AUTO_PWR_YES, [IR_CMD_SERVER_AUTO_PWR_NO] ILO2_RIBCL_SERVER_AUTO_PWR_NO, [IR_CMD_SERVER_AUTO_PWR_15] ILO2_RIBCL_SERVER_AUTO_PWR_15, [IR_CMD_SERVER_AUTO_PWR_30] ILO2_RIBCL_SERVER_AUTO_PWR_30, [IR_CMD_SERVER_AUTO_PWR_45] ILO2_RIBCL_SERVER_AUTO_PWR_45, [IR_CMD_SERVER_AUTO_PWR_60] ILO2_RIBCL_SERVER_AUTO_PWR_60, [IR_CMD_SERVER_AUTO_PWR_RANDOM] ILO2_RIBCL_SERVER_AUTO_PWR_RANDOM }; /** * ir_xml_parse_status * @ribcl_outbuf: Ptr to a buffer containing the raw output from any RIBCL cmd. * @ilostr: String to identify a particular iLO2 in error messages. * * Parses the output of any RIBCL command and examines the STATUS attributes * of all RIBCL sections. This is the routine to call if the RIBCL command * you're using returns no other data that you want to collect and you are * only interested in the command's status. * * Return value: RIBCL_SUCCESS if all STATUS attributes in the document * have a value of zero, otherwise the first non zero value * encountered or -1 if the document has no STATUS attributes. **/ int ir_xml_parse_status( char *ribcl_outbuf, char *ilostr) { xmlDocPtr doc; int status; doc = ir_xml_doparse( ribcl_outbuf); if( doc == NULL){ return( -1); } status = ir_xml_checkresults_doc( doc, ilostr); if( status != RIBCL_SUCCESS){ err("ir_xml_parse_status(): Unsuccessful RIBCL status."); } xmlFreeDoc( doc); return( status); } /* end ir_xml_parse_status() */ /** * ir_xml_parse_emhealth * @ir_handler: Ptr to this instance's custom handler. * @ribcl_outbuf: Ptr to the raw RIBCL output from the GET_EMBEDDED_HEALTH cmd * * Parses the output of the RIBCL GET_EMBEDDED_HEALTH command, and enters * data about the discovered resources into the DiscoveryData structure * within our private handler. The following resources are detected: * Fans * Temperature Sensors * Voltage Regulator Modules * Power Supplies. * * Return value: RIBCL_SUCCESS on success, -1 if error. **/ int ir_xml_parse_emhealth( ilo2_ribcl_handler_t *ir_handler, char *ribcl_outbuf) { xmlDocPtr doc; xmlNodePtr eh_data_node; /* Convert the RIBCL command output into a single XML document, * and the use the libxml2 parser to create an XML doc tree. */ doc = ir_xml_doparse( ribcl_outbuf); if( doc == NULL){ return( -1); } /* Check all RESULTS sections in the output for a status value * of zero, which indicates success. */ if( ir_xml_checkresults_doc( doc, ir_handler->ilo2_hostport) != RIBCL_SUCCESS){ err("ir_xml_parse_emhealth(): Unsuccessful RIBCL status."); xmlFreeDoc( doc); return( -1); } /* Locate the GET_EMBEDDED_HEALTH_DATA subtree. It will contain * the useful results of the command. */ eh_data_node = ir_xml_find_node( xmlDocGetRootElement(doc), "GET_EMBEDDED_HEALTH_DATA"); if( eh_data_node == NULL){ err("ir_xml_parse_emhealth(): GET_EMBEDDED_HEALTH_DATA element not found."); xmlFreeDoc( doc); return( -1); } /* Extract data for fans */ if( ir_xml_scan_fans( ir_handler, eh_data_node) != RIBCL_SUCCESS){ xmlFreeDoc( doc); return( -1); } /* extract data for voltage reg modules */ if( ir_xml_scan_vrm( ir_handler, eh_data_node) != RIBCL_SUCCESS){ xmlFreeDoc( doc); return( -1); } /* extract data for power supplies */ if( ir_xml_scan_power( ir_handler, eh_data_node) != RIBCL_SUCCESS){ xmlFreeDoc( doc); return( -1); } /* Extract data for temp sensors */ ir_xml_scan_temperature( ir_handler, eh_data_node); xmlFreeDoc( doc); return( RIBCL_SUCCESS); } /* end ir_xml_parse_emhealth() */ /** * ir_xml_parse_discoveryinfo * @ir_handler: Ptr to this instance's custom handler. * @ribcl_outbuf: Ptr to a buffer containing raw RIBCL output from the cmds * * Parses the combined output of the RIBCL GET_EMBEDDED_HEALTH * and GET_HOST_DATA commands. When you have a single buffer containing output * from both commands, this routine is more efficient than calling * ir_xml_parse_emhealth() and ir_xml_parse_hostdata() separately. Here, the * xml parser is only invoked once. * * Data about the discovered resources are entered into the DiscoveryData * structure within our private handler. The following resources are detected: * Product name and serial number * Memory Modules * CPUs * Fans * Temperature Sensors * Voltage Regulator Modules * Power Supplies. * * Return value: RIBCL_SUCCESS on success, -1 if error. **/ int ir_xml_parse_discoveryinfo( ilo2_ribcl_handler_t *ir_handler, char *ribcl_outbuf) { xmlDocPtr doc; xmlNodePtr h_node; xmlChar *typ; int mem_slotindex; int ret; /* Convert the RIBCL command output into a single XML document, * and the use the libxml2 parser to create an XML doc tree. */ doc = ir_xml_doparse( ribcl_outbuf); if( doc == NULL){ return( -1); } /* Check all RESULTS sections in the output for a status value * of zero, which indicates success. */ if( ir_xml_checkresults_doc( doc, ir_handler->ilo2_hostport) != RIBCL_SUCCESS){ err("ir_xml_parse_discoveryinfo(): Unsuccessful RIBCL status."); xmlFreeDoc( doc); return( -1); } /* First, we parse the output from the GET_HOST_DATA * RIBCL command */ h_node = ir_xml_find_node( xmlDocGetRootElement(doc), "GET_HOST_DATA"); if( h_node == NULL){ err("ir_xml_parse_discoveryinfo(): GET_HOST_DATA element not found."); xmlFreeDoc( doc); return( -1); } /* Since we can have multiple processors and memory modules, * each within their own SMBIOS_RECORD, we must iterate over * all of them, rather that calling ir_xml_find_node() */ h_node = h_node->xmlChildrenNode; mem_slotindex = 1; while( h_node != NULL){ if(!xmlStrcmp( h_node->name, (const xmlChar *)"SMBIOS_RECORD")){ ret = RIBCL_SUCCESS; typ = xmlGetProp( h_node, (const xmlChar *)"TYPE"); if( !xmlStrcmp( typ, (const xmlChar *)"1")){ /* Scan type 1 node for product name */ ret = ir_xml_scan_smbios_1( ir_handler, h_node); } else if( !xmlStrcmp( typ, (const xmlChar *)"4")){ /* Scan type 4 node for processor info */ ret = ir_xml_scan_smbios_4( ir_handler, h_node); } else if( !xmlStrcmp( typ, (const xmlChar *)"17")){ /* Scan type 17 node for memory */ ret = ir_xml_scan_smbios_17( ir_handler, h_node, &mem_slotindex); } if( ret != RIBCL_SUCCESS){ xmlFreeDoc( doc); return( -1); } } /* end if name == "SMBIOS_RECORD" */ h_node = h_node->next; } /* end while h_node != NULL */ /* Now we parse the output from the GET_EMBEDDED_HEALTH_DATA * RIBCL command */ h_node = ir_xml_find_node( xmlDocGetRootElement(doc), "GET_EMBEDDED_HEALTH_DATA"); if( h_node == NULL){ err("ir_xml_parse_discoveryinfo(): GET_EMBEDDED_HEALTH_DATA element not found."); xmlFreeDoc( doc); return( -1); } /* Extract data for fans */ if( ir_xml_scan_fans( ir_handler, h_node) != RIBCL_SUCCESS){ xmlFreeDoc( doc); return( -1); } /* Extract data for voltage reg modules */ if( ir_xml_scan_vrm( ir_handler, h_node) != RIBCL_SUCCESS){ xmlFreeDoc( doc); return( -1); } /* Extract data for power supplies */ if( ir_xml_scan_power( ir_handler, h_node) != RIBCL_SUCCESS){ xmlFreeDoc( doc); return( -1); } /* Extract data for health_at_a_glance sensors */ if( ir_xml_scan_health_at_a_glance( ir_handler, h_node) != RIBCL_SUCCESS){ xmlFreeDoc( doc); return( -1); } /* Extract data for temp sensors */ ir_xml_scan_temperature( ir_handler, h_node); /* Extract firmware revision information */ /* Now we parse the output from the GET_FW_VERSION RIBCL command */ h_node = ir_xml_find_node( xmlDocGetRootElement(doc), "GET_FW_VERSION"); if( h_node == NULL){ err("ir_xml_parse_discoveryinfo(): GET_FW_VERSION element not found."); xmlFreeDoc( doc); return( -1); } ir_xml_scan_firmware_revision( ir_handler, h_node); xmlFreeDoc( doc); return( RIBCL_SUCCESS); } /* end ir_xml_parse_discoveryinfo() */ /** * ir_xml_parse_hostdata * @ir_handler: Ptr to this instance's custom handler. * @ribcl_outbuf: Ptr to the raw RIBCL output from the GET_EMBEDDED_HEALTH cmd * * Parses the output of the RIBCL GET_EMBEDDED_HEALTH command, and enters * data about the discovered resources into the DiscoveryData structure * within our private handler. The following resources are detected: * Product name and serial number * Memory Modules * CPUs * * Return value: RIBCL_SUCCESS on success, -1 if error. **/ int ir_xml_parse_hostdata( ilo2_ribcl_handler_t *ir_handler, char *ribcl_outbuf) { xmlDocPtr doc; xmlNodePtr hd_node; xmlChar *typ; int mem_slotindex; int ret; /* Convert the RIBCL command output into a single XML document, * and the use the libxml2 parser to create an XML doc tree. */ doc = ir_xml_doparse( ribcl_outbuf); if( doc == NULL){ return( -1); } /* Check all RESULTS sections in the output for a status value * of zero, which indicates success. */ if( ir_xml_checkresults_doc( doc, ir_handler->ilo2_hostport) != RIBCL_SUCCESS){ err("ir_xml_parse_hostdata(): Unsuccessful RIBCL status."); xmlFreeDoc( doc); return( -1); } /* Locate the GET_HOST_DATA subtree. It will contain * the useful results of the command. */ hd_node = ir_xml_find_node( xmlDocGetRootElement(doc), "GET_HOST_DATA"); if( hd_node == NULL){ err("ir_xml_parse_hostdata(): GET_HOST_DATA element not found."); xmlFreeDoc( doc); return( -1); } /* Since we can have multiple processors and memory modules, * each within their own SMBIOS_RECORD, we must iterate over * all of them, rather that calling ir_xml_find_node() */ hd_node = hd_node->xmlChildrenNode; mem_slotindex = 1; while( hd_node != NULL){ if(!xmlStrcmp( hd_node->name, (const xmlChar *)"SMBIOS_RECORD")){ ret = RIBCL_SUCCESS; typ = xmlGetProp( hd_node, (const xmlChar *)"TYPE"); if( !xmlStrcmp( typ, (const xmlChar *)"1")){ /* Scan type 1 node for product name */ ret = ir_xml_scan_smbios_1( ir_handler, hd_node); } else if( !xmlStrcmp( typ, (const xmlChar *)"4")){ /* Scan type 4 node for processor info */ ret = ir_xml_scan_smbios_4( ir_handler, hd_node); } else if( !xmlStrcmp( typ, (const xmlChar *)"17")){ /* Scan type 17 node for memory */ ret = ir_xml_scan_smbios_17( ir_handler, hd_node, &mem_slotindex); } if( ret != RIBCL_SUCCESS){ xmlFreeDoc( doc); return( -1); } } /* end if name == "SMBIOS_RECORD" */ hd_node = hd_node->next; } /* end while hd_node != NULL */ xmlFreeDoc( doc); return( RIBCL_SUCCESS); } /* end ir_xml_parse_hostdata() */ /** * ir_xml_parse_host_power_status * @ribcl_outbuf: Ptr to the raw RIBCL output from the GET_HOST_POWER_STATUS * cmd * @power_status: pointer to int to return the parsed power status. * @ilostr: String to identify a particular iLO2 in error messages. * * Parses the output of the RIBCL GET_HOST_POWER_STATUS command, and returns * current power status of the server. * * Return value: RIBCL_SUCCESS on success, -1 if error. **/ int ir_xml_parse_host_power_status(char *ribcl_outbuf, int *power_status, char *ilostr) { xmlDocPtr doc; xmlNodePtr data_node; xmlChar *status = NULL; /* Convert the RIBCL command output into a single XML document, * and the use the libxml2 parser to create an XML doc tree. */ doc = ir_xml_doparse( ribcl_outbuf); if( doc == NULL){ err("ir_xml_parse_host_power_status(): Null doc returned."); return( -1); } /* Check all RESULTS sections in the output for a status value * of zero, which indicates success. */ if( ir_xml_checkresults_doc( doc, ilostr) != RIBCL_SUCCESS){ err("ir_xml_parse_host_power_status(): Unsuccessful RIBCL status."); xmlFreeDoc( doc); return( -1); } /* Locate the GET_HOST_POWER_STATUS subtree. It will contain * the useful results of the command. */ data_node = ir_xml_find_node( xmlDocGetRootElement(doc), "GET_HOST_POWER"); if( data_node == NULL){ err("ir_xml_parse_host_power_status(): GET_HOST_POWER element not found."); xmlFreeDoc( doc); return( -1); } status = xmlGetProp( data_node, (const xmlChar *)"HOST_POWER"); if(status == NULL) { err("ir_xml_parse_host_power_status(): HOST_POWER not found."); xmlFreeDoc( doc); return(-1); } if(xmlStrcmp(status, (const xmlChar *)"ON") == 0) { *power_status = ILO2_RIBCL_POWER_ON; } else if(xmlStrcmp(status, (const xmlChar *)"OFF") == 0) { *power_status = ILO2_RIBCL_POWER_OFF; } else { xmlFree( status); xmlFreeDoc( doc); err("ir_xml_parse_host_power_status(): Unkown power status."); return(-1); } xmlFree( status); xmlFreeDoc( doc); return( RIBCL_SUCCESS); } /* end ir_xml_parse_host_power_status() */ /** * ir_xml_parse_uid_status * @ribcl_outbuf: Ptr to the raw RIBCL output from the GET_UID_STATUS cmd * @uid_status: pointer to int to return the parsed uid status. * @ilostr: String to identify a particular iLO2 in error messages. * * Parses the output of the RIBCL GET_UID_STATUS command, and returns * current UID status. * * Return value: RIBCL_SUCCESS on success, -1 if error. **/ int ir_xml_parse_uid_status(char *ribcl_outbuf, int *uid_status, char *ilostr) { xmlDocPtr doc; xmlNodePtr data_node; xmlChar *status = NULL; /* Convert the RIBCL command output into a single XML document, * and the use the libxml2 parser to create an XML doc tree. */ doc = ir_xml_doparse( ribcl_outbuf); if( doc == NULL){ err("ir_xml_parse_uid_status(): Null doc returned."); return( -1); } /* Check all RESULTS sections in the output for a status value * of zero, which indicates success. */ if( ir_xml_checkresults_doc( doc, ilostr) != RIBCL_SUCCESS){ err("ir_xml_parse_uid_status(): Unsuccessful RIBCL status."); xmlFreeDoc( doc); return( -1); } /* Locate the GET_UID_STATUS subtree. It will contain * the useful results of the command. */ data_node = ir_xml_find_node( xmlDocGetRootElement(doc), "GET_UID_STATUS"); if( data_node == NULL){ err("ir_xml_parse_uid_status(): GET_UID_STATUS element not found."); xmlFreeDoc( doc); return( -1); } status = xmlGetProp( data_node, (const xmlChar *)"UID"); if(status == NULL) { err("ir_xml_parse_uid_status(): UID not found."); xmlFreeDoc( doc); return(-1); } if(xmlStrcmp(status, (const xmlChar *)"ON") == 0) { *uid_status = ILO2_RIBCL_UID_ON; } else if(xmlStrcmp(status, (const xmlChar *)"OFF") == 0) { *uid_status = ILO2_RIBCL_UID_OFF; } else { xmlFree( status); xmlFreeDoc( doc); err("ir_xml_parse_uid_status(): Unknown UID status : %s", (char *)status); return(-1); } xmlFree( status); xmlFreeDoc( doc); return( RIBCL_SUCCESS); } /* end ir_xml_parse_uid_status() */ /** * ir_xml_parse_power_saver_status * @ribcl_outbuf: Ptr to the raw RIBCL output from the * GET_HOST_POWER_SAVER_STATUS cmd * @ps_status: pointer to int to return the parsed power saver status. * @ilostr: String to identify a particular iLO2 in error messages. * * Parses the output of the RIBCL GET_HOST_POWER_SAVER_STATUS command, * and returns current power saver status of the server. * * Return value: RIBCL_SUCCESS on success, -1 if error. **/ int ir_xml_parse_power_saver_status(char *ribcl_outbuf, int *ps_status, char *ilostr) { xmlDocPtr doc; xmlNodePtr data_node; xmlChar *status = NULL; /* Convert the RIBCL command output into a single XML document, * and the use the libxml2 parser to create an XML doc tree. */ doc = ir_xml_doparse( ribcl_outbuf); if( doc == NULL){ err("ir_xml_parse_power_saver_status(): Null doc returned."); return( -1); } /* Check all RESULTS sections in the output for a status value * of zero, which indicates success. */ if( ir_xml_checkresults_doc( doc, ilostr) != RIBCL_SUCCESS){ err("ir_xml_parse_power_saver_status(): Unsuccessful RIBCL status."); xmlFreeDoc( doc); return( -1); } /* Locate the GET_HOST_POWER_SAVER subtree. It will contain * the useful results of the command. */ data_node = ir_xml_find_node( xmlDocGetRootElement(doc), "GET_HOST_POWER_SAVER"); if( data_node == NULL){ err("ir_xml_parse_power_saver_status(): GET_HOST_POWER_SAVER element not found."); xmlFreeDoc( doc); return( -1); } status = xmlGetProp( data_node, (const xmlChar *)"HOST_POWER_SAVER"); if(status == NULL) { err("ir_xml_parse_power_saver_status(): HOST_POWER_SAVER not found."); xmlFreeDoc( doc); return(-1); } if(xmlStrcmp(status, (const xmlChar *)"MIN") == 0) { *ps_status = ILO2_RIBCL_MANUAL_LOW_POWER_MODE; } else if(xmlStrcmp(status, (const xmlChar *)"OFF") == 0) { *ps_status = ILO2_RIBCL_MANUAL_OS_CONTROL_MODE; } else if(xmlStrcmp(status, (const xmlChar *)"AUTO") == 0) { *ps_status = ILO2_RIBCL_AUTO_POWER_SAVE_MODE; } else if(xmlStrcmp(status, (const xmlChar *)"MAX") == 0) { *ps_status = ILO2_RIBCL_MANUAL_HIGH_PERF_MODE; } else { xmlFree( status); xmlFreeDoc( doc); err("ir_xml_parse_power_saver_status(): Unkown Power Saver status."); return(-1); } xmlFree( status); xmlFreeDoc( doc); return( RIBCL_SUCCESS); } /* end ir_xml_parse_power_saver_status() */ /** * ir_xml_parse_auto_power_status * @ribcl_outbuf: Ptr to the raw RIBCL output from the * GET_SERVER_AUTO_PWR cmd * @ps_status: pointer to int to return the parsed power saver status. * @ilostr: String to identify a particular iLO2 in error messages. * * Parses the output of the RIBCL GET_SERVER_AUTO_PWR command, and returns * current Auto Power status of the server. * * Return value: RIBCL_SUCCESS on success, -1 if error. **/ int ir_xml_parse_auto_power_status(char *ribcl_outbuf, int *ps_status, char *ilostr) { xmlDocPtr doc; xmlNodePtr data_node; xmlChar *status = NULL; /* Convert the RIBCL command output into a single XML document, * and the use the libxml2 parser to create an XML doc tree. */ doc = ir_xml_doparse( ribcl_outbuf); if( doc == NULL){ err("ir_xml_parse_auto_power_status(): Null doc returned."); return( -1); } /* Check all RESULTS sections in the output for a status value * of zero, which indicates success. */ if( ir_xml_checkresults_doc( doc, ilostr) != RIBCL_SUCCESS){ err("ir_xml_parse_auto_power_status(): Unsuccessful RIBCL status."); xmlFreeDoc( doc); return( -1); } /* Locate the GET_SERVER_AUTO_PWR subtree. It will contain * the useful results of the command. */ data_node = ir_xml_find_node( xmlDocGetRootElement(doc), "SERVER_AUTO_PWR"); if( data_node == NULL){ err("ir_xml_parse_auto_power_status(): SERVER_AUTO_PWR element not found."); xmlFreeDoc( doc); return( -1); } status = xmlGetProp( data_node, (const xmlChar *)"VALUE"); if(status == NULL) { err("ir_xml_parse_auto_power_status(): VALUE not found."); xmlFreeDoc( doc); return(-1); } if(xmlStrcmp(status, (const xmlChar *)"No") == 0) { *ps_status = ILO2_RIBCL_AUTO_POWER_DISABLED; } else if(xmlStrcmp(status, (const xmlChar *)"Yes") == 0) { *ps_status = ILO2_RIBCL_AUTO_POWER_ENABLED; } else if(xmlStrcmp(status, (const xmlChar *)"15") == 0) { *ps_status = ILO2_RIBCL_AUTO_POWER_DELAY_15; } else if(xmlStrcmp(status, (const xmlChar *)"30") == 0) { *ps_status = ILO2_RIBCL_AUTO_POWER_DELAY_30; } else if(xmlStrcmp(status, (const xmlChar *)"45") == 0) { *ps_status = ILO2_RIBCL_AUTO_POWER_DELAY_45; } else if(xmlStrcmp(status, (const xmlChar *)"60") == 0) { *ps_status = ILO2_RIBCL_AUTO_POWER_DELAY_60; } else if(xmlStrcmp(status, (const xmlChar *)"RANDOM") == 0) { *ps_status = ILO2_RIBCL_AUTO_POWER_DELAY_RANDOM; } else { xmlFree( status); xmlFreeDoc( doc); err("ir_xml_parse_auto_power_status(): Unkown Power Saver status."); return(-1); } xmlFree( status); xmlFreeDoc( doc); return( RIBCL_SUCCESS); } /** * ir_xml_parse_reset_server * @ribcl_outbuf: Ptr to the raw RIBCL output from the RESET_SERVER or * COLD_BOOT_SERVER command. It just looks for error conditions and nothing * specific about either command output. * cmd * @ilostr: String to identify a particular iLO2 in error messages. * * Parses the output of the RIBCL RESET_SERVER or COLD_BOOT_SERVER command. * * Return value: RIBCL_SUCCESS on success, -1 if error. **/ int ir_xml_parse_reset_server(char *ribcl_outbuf, char *ilostr) { xmlDocPtr doc; /* Convert the RIBCL command output into a single XML document, * and the use the libxml2 parser to create an XML doc tree. */ doc = ir_xml_doparse( ribcl_outbuf); if( doc == NULL){ return( -1); } /* Check all RESULTS sections in the output for a status value * of zero, which indicates success. */ if( ir_xml_checkresults_doc( doc, ilostr) != RIBCL_SUCCESS){ err("ir_xml_parse_reset_server(): Unsuccessful RIBCL status."); xmlFreeDoc( doc); return( -1); } xmlFreeDoc( doc); return( RIBCL_SUCCESS); } /* end ir_xml_parse_reset_server() */ /** * ir_xml_parse_set_host_power * @ribcl_outbuf: Ptr to the raw RIBCL output from the SET_HOST_POWER * cmd * @ilostr: String to identify a particular iLO2 in error messages. * * Parses the output of the RIBCL SET_HOST_POWER command. * * Return value: RIBCL_SUCCESS on success, -1 if error. **/ int ir_xml_parse_set_host_power(char *ribcl_outbuf, char *ilostr) { xmlDocPtr doc; /* Convert the RIBCL command output into a single XML document, * and the use the libxml2 parser to create an XML doc tree. */ doc = ir_xml_doparse( ribcl_outbuf); if( doc == NULL){ return( -1); } /* Check all RESULTS sections in the output for a status value * of zero, which indicates success. */ if( ir_xml_checkresults_doc( doc, ilostr) != RIBCL_SUCCESS){ err("ir_xml_parse_set_host_power(): Unsuccessful RIBCL status."); xmlFreeDoc( doc); return( -1); } xmlFreeDoc( doc); return( RIBCL_SUCCESS); } /* end ir_xml_parse_set_host_power() */ /** * ir_xml_build_cmdbufs * @handler: ptr to the ilo2_ribcl plugin handler. * * This routine is designed to be called at ilo2_ribcl plugin open time. * Iterate through the global RIBCL command template array * ir_xml_cmd_templates[]. For each command template string in that array, * allocate a buffer and fill it with a customized XML command string for * that host, containing the user_name and password that have been previously * read from the config file and saved in our private handler. * * Note that the command templates in ir_xml_cmd_templates[] have been * created as *printf format strings with "%s" where the login and password * should be substituted to assign the LOGIN and PASSWORD attributes. * * These customized xml command strings are then stored in the ribcl_xml_cmd[] * array in the handler for this plugin instance. * * Note: you must free these allocated buffers at close time with a call to * ir_xml_free_cmdbufs(). * * Return value: RIBCL_SUCCESS if success, -1 if failure. **/ int ir_xml_build_cmdbufs( ilo2_ribcl_handler_t *handler) { int i; int cmdsize; int logpasslen; char *login; char *password; for( i =0; i < IR_NUM_COMMANDS; i++){ handler->ribcl_xml_cmd[i] = NULL; } login = handler->user_name; password = handler->password; logpasslen = strlen( login) + strlen( password); for( i =0; i < IR_NUM_COMMANDS; i++){ cmdsize = strlen( ir_xml_cmd_templates[i]) - 3 + logpasslen; handler->ribcl_xml_cmd[i] = malloc( cmdsize); if( handler->ribcl_xml_cmd[i] == NULL){ err("ir_xml_build_cmdbufs(): malloc of command buffer %d failed.", i); while( --i >=0){ free( handler->ribcl_xml_cmd[i]); } return( -1); } /* Note, since the OpenHPI makefiles set the GCC options * -Werror and -Wformat-nonliteral, we can't use anything * except a string literal as the third "format" parameter * to snprintf() without generating errors at compile time. * So, we must use our own stripped down version of snprintf() * instead. */ ir_xml_insert_logininfo( handler->ribcl_xml_cmd[i], cmdsize, ir_xml_cmd_templates[i], login, password); } return( RIBCL_SUCCESS); } /* end ir_xml_build_cmdbufs() */ /** * ir_xml_insert_logininfo * @dest - ptr to destination buffer for the customized RIBCL command string. * @dsize - size of the dest buffer, including the terminating null. * @format - A *printf format string containing at least two %s substitutions. * @login - the login string for this host. * @passwd - the password string for this host. * * This is a stripped down version of the standard snprintf() routine. * It is designed to insert the login and password strings into a RIBCL * command template given by the 'format' parameter. The resulting customized * command string is written to the null terminated buffer 'dest'. * * Return value: The number of characters written to the dest buffer, not * including the terminating null (just like snprintf()) if * success, -1 if failure. **/ static int ir_xml_insert_logininfo( char *dest, int dsize, char *format, char *login, char *passwd) { enum istates { COPY, INSERT_LOGIN, INSERT_PASSWD, COPY_POST }; int dcount = 0; enum istates state; char ch; int login_entered = 0; state = COPY; while( dcount < dsize){ switch( state){ case COPY: if( (*format == '%') && ( (*(format +1)) == 's')){ format += 2; if( login_entered){ state = INSERT_PASSWD; } else { state = INSERT_LOGIN; } } else { /* Copy from format to dest */ ch = *dest++ = *format++; if( ch == '\0'){ /* We're done */ return( dcount); } dcount++; } break; case INSERT_LOGIN: login_entered = 1; if( *login != '\0'){ *dest++ = *login++; dcount++; } else { state = COPY; } break; case INSERT_PASSWD: if( *passwd != '\0'){ *dest++ = *passwd++; dcount++; } else { state = COPY_POST; } break; case COPY_POST: /* Copy from format to dest */ ch = *dest++ = *format++; if( ch == '\0'){ /* We're done */ return( dcount); } dcount++; break; default: err("ir_xml_insert_logininfo(): Illegal state."); return ( -1); break; } /* end switch state */ } /* end while dcount < dsize */ /* If we make it here, then we've run out of destination buffer space, * so force a null termination to the destination buffer and return the * number of non-null chars. */ *(dest -1) = '\0'; return( dcount - 1); } /* end ir_xml_insert_logininfo() */ /** * ir_xml_free_cmdbufs * @handler: ptr to the ilo2_ribcl plugin private handler. * * This routine is desigend to be called at ilo2_ribcl plugin close time. * Iterate through the ribcl_xml_cmd[] array in the ilo2_ribcl plugin * handler passed as a parameter, and free all of the customized RIBCL * command strings. * * Return value: None. **/ void ir_xml_free_cmdbufs( ilo2_ribcl_handler_t *handler) { int i; for( i =0; i < IR_NUM_COMMANDS; i++){ if( handler->ribcl_xml_cmd[i] != NULL){ free( handler->ribcl_xml_cmd[i]); handler->ribcl_xml_cmd[i] = NULL; } } return; } /** * ir_xml_find_node * @s_node: Starting XML tree node for the search. * @s_name: Name of the node to search for. * * Search the XML doc subtree pointed to by s_node, searching for a node * with the name s_name. * * Return value: Ptr to a XML doc tree node on success, NULL on failure. **/ static xmlNodePtr ir_xml_find_node( xmlNodePtr s_node, char *s_name) { xmlNodePtr c_node; while( s_node != NULL){ if((!xmlStrcmp( s_node->name, (const xmlChar *)s_name))){ return( s_node); } else { c_node = ir_xml_find_node( s_node->xmlChildrenNode, s_name); if( c_node != NULL){ return( c_node); } } s_node = s_node->next; } return( NULL); } /* End ir_xml_find_node( ) */ /** * ir_xml_scan_fans * @ir_handler: Ptr to this instance's custom handler. * @eh_data_node: Points to GET_EMBEDDED_HEALTH subtree in the output xml * * Examines all the FAN subtrees of the FANS tree, and extracts the fan label, * zone, status, speed, and speed units for all fans in the system. * * The fan XML section should look something like: * * * * * * * * * * * * * * * * Return value: RIBCL_SUCCESS if success, -1 if failure. **/ static int ir_xml_scan_fans( ilo2_ribcl_handler_t *ir_handler, xmlNodePtr eh_data_node) { xmlNodePtr fan_node; xmlNodePtr n; xmlChar *lbl = NULL; xmlChar *zone = NULL; xmlChar *stat = NULL; xmlChar *speed = NULL; xmlChar *unit = NULL; int ret; fan_node = ir_xml_find_node( eh_data_node, "FANS"); fan_node = fan_node->xmlChildrenNode; while( fan_node != NULL){ if((!xmlStrcmp( fan_node->name, (const xmlChar *)"FAN"))){ n = ir_xml_find_node(fan_node, "LABEL"); if( n != NULL){ lbl = xmlGetProp( n, (const xmlChar *)"VALUE"); } n = ir_xml_find_node(fan_node, "ZONE"); if( n != NULL){ zone = xmlGetProp( n, (const xmlChar *)"VALUE"); } n = ir_xml_find_node(fan_node, "STATUS"); if( n != NULL){ stat = xmlGetProp( n, (const xmlChar *)"VALUE"); } n = ir_xml_find_node(fan_node, "SPEED"); if( n != NULL){ speed = xmlGetProp( n, (const xmlChar *)"VALUE"); unit = xmlGetProp( n, (const xmlChar *)"UNIT"); } ret = ir_xml_record_fandata( ir_handler, (char *)lbl, (char *)zone, (char *)stat, (char *)speed, (char *)unit); if( lbl){ xmlFree( lbl); } if( zone){ xmlFree( zone); } if( stat){ xmlFree( stat); } if( speed){ xmlFree( speed); } if( unit){ xmlFree( unit); } if( ret != RIBCL_SUCCESS){ return( -1); } } /* end if name == "FAN" */ fan_node = fan_node->next; } /* end while fan_node != NULL */ return( RIBCL_SUCCESS); } /* end ir_xml_scan_fans() */ /** * ir_xml_record_fandata * @ir_handler: ptr to the ilo2_ribcl plugin private handler. * @fanlabel: string label for the fan from iLO2. * @fanzone: string location zone for the fan from iLO2. * @fanstat: string status for the fan from iLO2. * @fanspeed: string speed for the fan from iLO2. * @speedunits: string units for the fan speed. * * This routine records the data for a fan reported by iLO2 into the * DiscoveryData structure within the plugin's private handler. * * Detailed description: * * - Extract an index for this fan from the fan label provided by iLO2. * - Use this index to access the DiscoveryData.fandata[] array. * - Set the IR_DISCOVERED bit in fanflags. * - if the fan speed differs from our previous reading, set the * IR_SPEED_UPDATED flag in fanflags. * - Store updated values for the speed, label, zone, status, and * speedunit for this fan. * * Return value: RIBCL_SUCCESS if success, -1 if failure. **/ static int ir_xml_record_fandata( ilo2_ribcl_handler_t *ir_handler, char *fanlabel, char *fanzone, char *fanstat, char *fanspeed, char *speedunits) { int fanindex = 0; int speedval; struct ir_fandata *fandat; /* Find the index of this fan. The parameter 'fanlabel' should be of the * form 'Fan N', where N ranges from 1 to ILO2_RIBCL_DISCOVER_FAN_MAX. */ fanindex = ir_xml_extract_index("Fan", (char *)fanlabel, 1); if( fanindex == IR_NO_PREFIX){ /* We didn't parse the fanlabel string prefix correctly */ err("ir_xml_record_fandata: incorrect fan label string: %s", fanlabel); return( -1); } if( fanindex == IR_NO_INDEX){ /* We didn't parse the fanlabel string index correctly */ err("ir_xml_record_fandata: could not extract index from fan label string: %s", fanlabel); return( -1); } /* The index of this fan should be between 1 and * ILO2_RIBCL_DISCOVER_FAN_MAX. */ if( (fanindex < 1) || (fanindex > ILO2_RIBCL_DISCOVER_FAN_MAX) ){ err("ir_xml_record_fandata: Fan index out of range: %d.", fanindex); return( -1); } /* Now, if this information is different than what's already in * DiscoveryData, update DiscoveryData with the latest info */ fandat = &(ir_handler->DiscoveryData.fandata[fanindex]); fandat->fanflags |= IR_DISCOVERED; speedval = atoi(fanspeed); if( fandat->speed != speedval){ fandat->fanflags != IR_SPEED_UPDATED; fandat->speed = speedval; } if( ir_xml_replacestr( &(fandat->label), fanlabel) != RIBCL_SUCCESS){ return( -1); } if( ir_xml_replacestr( &(fandat->zone), fanzone) != RIBCL_SUCCESS){ return( -1); } if( ir_xml_replacestr( &(fandat->status), fanstat) != RIBCL_SUCCESS){ return( -1); } if( ir_xml_replacestr( &(fandat->speedunit), speedunits) != RIBCL_SUCCESS){ return( -1); } return( RIBCL_SUCCESS); } /* end ir_xml_record_fandata() */ /** * ir_xml_scan_temperature * @ir_handler: Ptr to this instance's custom handler. * @eh_data_node: Points to GET_EMBEDDED_HEALTH subtree in the output xml * * Examines all the TEMP subtrees of the TEMPERATURE tree, and extracts the * label, location, status, current reading, and temperature units for all * temperature sensors in the system. * * The temperature XML section should look something like: * * * * * * * * * * * * * * * * Return value: None **/ static void ir_xml_scan_temperature( ilo2_ribcl_handler_t *ir_handler, xmlNodePtr eh_data_node) { xmlNodePtr t_node; xmlNodePtr n; xmlChar *lbl = NULL; xmlChar *loc = NULL; xmlChar *stat = NULL; xmlChar *cur_reading = NULL; xmlChar *unit = NULL; t_node = ir_xml_find_node( eh_data_node, "TEMPERATURE"); t_node = t_node->xmlChildrenNode; while( t_node != NULL){ if((!xmlStrcmp( t_node->name, (const xmlChar *)"TEMP"))){ n = ir_xml_find_node( t_node, "LABEL"); if( n != NULL){ lbl = xmlGetProp( n, (const xmlChar *)"VALUE"); } n = ir_xml_find_node( t_node, "LOCATION"); if( n != NULL){ loc = xmlGetProp( n, (const xmlChar *)"VALUE"); } n = ir_xml_find_node( t_node, "STATUS"); if( n != NULL){ stat = xmlGetProp( n, (const xmlChar *)"VALUE"); } n = ir_xml_find_node( t_node, "CURRENTREADING"); if( n != NULL){ cur_reading = xmlGetProp( n, (const xmlChar *)"VALUE"); unit = xmlGetProp( n, (const xmlChar *)"UNIT"); } /* Extract Caution value here, if needed */ /* Call to process temperature data goes here, when * we add support to this plugin for sensors. */ if( lbl){ xmlFree( lbl); } if( loc){ xmlFree( loc); } if( stat){ xmlFree( stat); } if( cur_reading){ xmlFree( cur_reading); } if( unit){ xmlFree( unit); } } /* end if name == "TEMP" */ t_node = t_node->next; } /* end while t_node != NULL */ } /* end ir_xml_scan_temperature() */ /** * ir_xml_firmaware_revision * @ir_handler: Ptr to this instance's custom handler. * @eh_data_node: Points to GET_FW_VERSION subtree in the output xml * This routine parses the firmware information and saves major and minor * revision numbers in the handler DiscoverData structure. * The response for GET_FW_VERSION RIBCL command should look something like: * * * Return value: None **/ static void ir_xml_scan_firmware_revision( ilo2_ribcl_handler_t *ir_handler, xmlNodePtr eh_data_node) { xmlChar *fw_ver = NULL; char *result = NULL; SaHpiUint8T FirmwareMajorRev = 0; SaHpiUint8T FirmwareMinorRev = 0; fw_ver = xmlGetProp(eh_data_node, (const xmlChar *)"FIRMWARE_VERSION"); if(fw_ver == NULL) { err("ir_xml_scan_firmware_revision(): FIRMWARE_VERSION not found."); return; } /* Save a copy of the raw version string */ ir_xml_replacestr( &(ir_handler->DiscoveryData.fwdata.version_string), (char *)fw_ver); /* extract manjor and minor revision numbers and save them in the handler discovery data structure */ FirmwareMajorRev = atoi((char *) fw_ver); result = strchr((char *)fw_ver, '.'); if(result != NULL) { FirmwareMinorRev = atoi(++result); } if(ir_handler->DiscoveryData.fwdata.FirmwareMajorRev != FirmwareMajorRev) { ir_handler->DiscoveryData.fwdata.FirmwareMajorRev = FirmwareMajorRev; } if(ir_handler->DiscoveryData.fwdata.FirmwareMinorRev != FirmwareMinorRev) { ir_handler->DiscoveryData.fwdata.FirmwareMinorRev = FirmwareMinorRev; } return; } /** * ir_xml_scan_vrm * @eh_data_node: Points to GET_EMBEDDED_HEALTH subtree in the output xml * @ir_handler: Ptr to this instance's custom handler. * * Examines all the MODULE subtrees of the VRM tree, and extracts the * label and status, for all voltage regulator modules in the system. * * The VRM XML section should look something like: * * * * * * * * Return value: RIBCL_SUCCESS if success, -1 if failure. **/ static int ir_xml_scan_vrm( ilo2_ribcl_handler_t *ir_handler, xmlNodePtr eh_data_node) { xmlNodePtr v_node; xmlNodePtr n; int ret; xmlChar *lbl = NULL; xmlChar *stat = NULL; v_node = ir_xml_find_node( eh_data_node, "VRM"); v_node = v_node->xmlChildrenNode; while( v_node != NULL){ if((!xmlStrcmp( v_node->name, (const xmlChar *)"MODULE"))){ ret = RIBCL_SUCCESS; n = ir_xml_find_node( v_node, "LABEL"); if( n != NULL){ lbl = xmlGetProp( n, (const xmlChar *)"VALUE"); } n = ir_xml_find_node( v_node, "STATUS"); if( n != NULL){ stat = xmlGetProp( n, (const xmlChar *)"VALUE"); } if( xmlStrcmp(stat, (xmlChar *)"Not Installed") != 0 ){ ret = ir_xml_record_vrmdata( ir_handler, (char *)lbl, (char *)stat); } if( lbl){ xmlFree( lbl); } if( stat){ xmlFree( stat); } if( ret != RIBCL_SUCCESS){ return( -1); } } /* end if name == "MODULE" */ v_node = v_node->next; } /* end while v_node != NULL */ return( RIBCL_SUCCESS); } /* end ir_xml_scan_vrm() */ /** * ir_xml_record_vrmdata * @ir_handler: ptr to the ilo2_ribcl plugin private handler. * @label: string VRM label from iLO2. * @psstat: string VRM status from iLO2. * * This routine records the data for a voltage regulator module reported by * iLO2 into the DiscoveryData structure within the plugin's private handler. * * Detailed description: * * - Extract an index for this VRM from the VRM label provided by iLO2. * - Use this index to access the DiscoveryData.vrmdata[] array. * - Set the IR_DISCOVERED bit in vrmflags. * - Store updated values for the label and status for this VRM. * * Return value: RIBCL_SUCCESS if success, -1 if failure. **/ static int ir_xml_record_vrmdata( ilo2_ribcl_handler_t *ir_handler, char *vrmlabel, char *vrmstat) { int vrmindex = 0; int ret; ir_vrmdata_t *vrmdat; /* The format of the VRM label is 'VRM n' where n is an integer * value beginning with 1. We use this value as an index for * the VRM. */ ret = sscanf( (char *)vrmlabel, "VRM %d", &vrmindex); if( ret != 1){ /* We didn't parse the VRM label correctly */ err("ir_xml_record_vrmdata: incorrect VRM label string: %s", vrmlabel); return( -1); } /* The index for this VRM should be between 1 and * ILO2_RIBCL_DISCOVER_VRM_MAX. */ if( (vrmindex < 1) || (vrmindex > ILO2_RIBCL_DISCOVER_PSU_MAX) ){ err("ir_xml_record_vrmdata: VRM index out of range: %d", vrmindex); return( -1); } /* Now, if this information is different than what's already in DiscoveryData, update DiscoveryData with the latest info */ vrmdat = &(ir_handler->DiscoveryData.vrmdata[vrmindex]); vrmdat->vrmflags |= IR_DISCOVERED; if( ir_xml_replacestr( &(vrmdat->label), vrmlabel) != RIBCL_SUCCESS){ return( -1); } if( ir_xml_replacestr( &(vrmdat->status), vrmstat) != RIBCL_SUCCESS){ return( -1); } return( RIBCL_SUCCESS); } /* end ir_xml_record_vrmdata() */ /** * ir_xml_scan_power * @ir_handler: Ptr to this instance's custom handler. * @eh_data_node: Points to GET_EMBEDDED_HEALTH subtree in the output xml * * Examines all the SUPPLY subtrees of the POWER_SUPPLIES tree, and extracts * the label and status, for all power supplies in the system. * * The XML data for POWER_SUPPLIES should look something like: * * * * * * * * Return value: RIBCL_SUCCESS if success, -1 if failure. **/ static int ir_xml_scan_power( ilo2_ribcl_handler_t *ir_handler, xmlNodePtr eh_data_node) { xmlNodePtr p_node; xmlNodePtr n; int ret; xmlChar *lbl = NULL; xmlChar *stat = NULL; p_node = ir_xml_find_node( eh_data_node, "POWER_SUPPLIES"); p_node = p_node->xmlChildrenNode; while( p_node != NULL){ if((!xmlStrcmp( p_node->name, (const xmlChar *)"SUPPLY"))){ ret = RIBCL_SUCCESS; n = ir_xml_find_node( p_node, "LABEL"); if( n != NULL){ lbl = xmlGetProp( n, (const xmlChar *)"VALUE"); } n = ir_xml_find_node( p_node, "STATUS"); if( n != NULL){ stat = xmlGetProp( n, (const xmlChar *)"VALUE"); } /* XXX REVISIT - confirm that "Not Installed" is the * correct string when the power supply is removed. */ if( xmlStrcmp( stat, (xmlChar *)"Not Installed") != 0 ){ ret = ir_xml_record_psdata( ir_handler, (char *)lbl, (char *)stat); } if( lbl){ xmlFree( lbl); } if( stat){ xmlFree( stat); } if( ret != RIBCL_SUCCESS){ return( -1); } } /* end if name == "SUPPLY" */ p_node = p_node->next; } /* end while p_node != NULL */ return( RIBCL_SUCCESS); } /* end ir_xml_scan_power() */ /** * ir_xml_record_psdata * @ir_handler: ptr to the ilo2_ribcl plugin private handler. * @label: string power supply label from iLO2. * @psstat: string power supply status from iLO2. * * This routine records the data for a power supply reported by * iLO2 into the DiscoveryData structure within the plugin's private handler. * * Detailed description: * * - Extract an index for this power supply from the power supply label * provided by iLO2. * - Use this index to access the DiscoveryData.psudata[] array. * - Set the IR_DISCOVERED bit in psuflags. * - Store updated values for the label,and status for this power supply. * * Return value: RIBCL_SUCCESS if success, -1 if failure. **/ static int ir_xml_record_psdata( ilo2_ribcl_handler_t *ir_handler, char *pslabel, char *psstat) { int psindex = 0; int ret; ir_psudata_t *psudat; /* The format of a the power supply label is 'Power Supply n' where * n is an integer value beginning with 1. We use this value as * an index for the power supply. */ ret = sscanf( (char *)pslabel, "Power Supply %d", &psindex); if( ret != 1){ /* We didn't parse the power supply label correctly */ err("ir_xml_record_psdata: incorrect PSU label string: %s", pslabel); return( -1); } /* The index for this power supply should be between 1 and * ILO2_RIBCL_DISCOVER_PSU_MAX. */ if( (psindex < 1) || (psindex > ILO2_RIBCL_DISCOVER_PSU_MAX) ){ err("ir_xml_record_psdata: PSU index out of range: %d.", psindex); return( -1); } /* Now, if this information is different than what's already in * DiscoveryData, update DiscoveryData with the latest info */ psudat = &(ir_handler->DiscoveryData.psudata[psindex]); psudat->psuflags |= IR_DISCOVERED; if( ir_xml_replacestr( &(psudat->label), pslabel) != RIBCL_SUCCESS){ return( -1); } if( ir_xml_replacestr( &(psudat->status), psstat) != RIBCL_SUCCESS){ return( -1); } return( RIBCL_SUCCESS); } /* end ir_xml_record_psdata() */ /** * ir_xml_scan_health_at_a_glance * @ir_handler: Ptr to this instance's custom handler. * @eh_data_node: Points to GET_EMBEDDED_HEALTH subtree in the output xml * * Examines the HEALTH_AT_A_GLANCE subtree within GET_EMBEDDED_HEALTH, * and extracts the status for fans, temperature, and power supply. * The status string values are then parsed into numeric values and * stored in the chassis_sensors[] element within the DiscoveryData element * located within the plugin's private handler. * * The XML data for HEALTH_AT_A_GLANCE should look something like: * * * * * * * * * * Return value: RIBCL_SUCCESS if success, -1 if failure. **/ static int ir_xml_scan_health_at_a_glance( ilo2_ribcl_handler_t *ir_handler, xmlNodePtr eh_data_node) { xmlNodePtr p_node; int sens_reading; xmlChar *ts; xmlChar *fstat = NULL; xmlChar *pstat = NULL; xmlChar *tstat = NULL; ilo2_ribcl_DiscoveryData_t *ddata; I2R_SensorDataT *sens_dat; p_node = ir_xml_find_node( eh_data_node, "HEALTH_AT_A_GLANCE"); if( p_node == NULL){ return( RIBCL_SUCCESS); /* Not supported */ } /* Note, we assume the properties that we are looking for can occur * in any order, and inbetween properties that we are not looking for. * So, we use the temporary pointer 'ts' to capture them. */ p_node = p_node->xmlChildrenNode; while( p_node != NULL){ if((!xmlStrcmp( p_node->name, (const xmlChar *)"FANS"))){ ts = xmlGetProp( p_node, (const xmlChar *)"STATUS"); if( ts != NULL){ fstat = ts; } } if((!xmlStrcmp( p_node->name, (const xmlChar *)"TEMPERATURE"))){ ts = xmlGetProp( p_node, (const xmlChar *)"STATUS"); if( ts != NULL){ tstat = ts; } } if((!xmlStrcmp( p_node->name, (const xmlChar *)"POWER_SUPPLIES"))){ ts = xmlGetProp( p_node, (const xmlChar *)"STATUS"); if( ts != NULL){ pstat = ts; } } p_node = p_node->next; } ddata = &(ir_handler->DiscoveryData); if( fstat){ sens_dat = &(ddata->chassis_sensors[I2R_SEN_FANHEALTH]); sens_reading = ir_xml_stat_to_reading( (char *)fstat); if( sens_reading == -1){ err("ir_xml_scan_health_at_a_glance: Unrecognized status value \"%s\" for fan health.", fstat); } else { sens_dat->reading.intval = sens_reading; } xmlFree( fstat); } if( tstat){ sens_dat = &(ddata->chassis_sensors[I2R_SEN_TEMPHEALTH]); sens_reading = ir_xml_stat_to_reading( (char *)tstat); if( (sens_reading == -1) || (sens_reading == I2R_SEN_VAL_DEGRADED) ){ err("ir_xml_scan_health_at_a_glance: Unrecognized status value \"%s\" for temperature health.", tstat); } else { sens_dat->reading.intval = sens_reading; } xmlFree( tstat); } if( pstat){ sens_dat = &(ddata->chassis_sensors[I2R_SEN_POWERHEALTH]); sens_reading = ir_xml_stat_to_reading( (char *)pstat); if( sens_reading == -1){ err("ir_xml_scan_health_at_a_glance: Unrecognized status value \"%s\" for power supply health.", pstat); } else { sens_dat->reading.intval = sens_reading; } xmlFree( pstat); } return( RIBCL_SUCCESS); } /* end ir_xml_scan_health_at_a_glance() */ /** * ir_xml_stat_to_reading * @statstr: Ptr to a status string * * Performs a case insentive comparison of the input status string * with known possible values, and returns a numeric representation. * The value -1 is returned if there is no match for the string. * * Return values: * I2R_SEN_VAL_OK - status string was "Ok" * I2R_SEN_VAL_DEGRADED - status string was "Degraded" * I2R_SEN_VAL_FAILED - status string was "Failed" * -1 - The string was not recognized. **/ static int ir_xml_stat_to_reading( char *statstr) { if( !strcasecmp( statstr, "Ok")){ return( I2R_SEN_VAL_OK); } else if( !strcasecmp( statstr, "Degraded")){ return( I2R_SEN_VAL_DEGRADED); } else if( !strcasecmp( statstr, "Failed")){ return( I2R_SEN_VAL_FAILED); } else { return( -1); } } /* end ir_xml_stat_to_reading() */ /** * ir_xml_scan_smbios_1 * @ir_handler: ptr to the ilo2_ribcl plugin private handler. * @b_node: porinter to an SMBIOS_RECORD node of type 1. * * This routine will parse a SMBIOS_RECORD type 1 node, which should contain * the system product name and serial number. If these values differ from the * product_name and serial_number recorded in the DiscoveryData structure * within the plugin's private handler, then update the DiscoveryData values. * * A type 1 SMBIOS_RECORD should look something like: * * * * * * * * Return value: RIBCL_SUCCESS if success, -1 if failure. **/ static int ir_xml_scan_smbios_1( ilo2_ribcl_handler_t *ir_handler, xmlNodePtr b_node) { xmlChar *prod = NULL; xmlChar *sernum = NULL; int ret; /* We need to search this node's children for FIELD nodes * containing name and value pairs for the system product name and * the serial number. */ b_node = b_node->xmlChildrenNode; prod = ir_xml_smb_get_value( "Product Name", b_node); sernum = ir_xml_smb_get_value( "Serial Number", b_node); /* If it's different than information already in the DiscoveryData of * our handler, then replace it. */ ret = ir_xml_replacestr( &(ir_handler->DiscoveryData.product_name), (char *)prod); if( ret == RIBCL_SUCCESS){ ret = ir_xml_replacestr( &(ir_handler->DiscoveryData.serial_number), (char *)sernum); } if( prod){ xmlFree( prod); } if( sernum){ xmlFree( sernum); } return( ret); } /* end ir_xml_scan_smbios_1() */ /** * ir_xml_scan_smbios_4 * @ir_handler: Ptr to this instance's custom handler. * @b_node: porinter to an SMBIOS_RECORD node of type 4. * * This routine will parse a SMBIOS_RECORD type 4 node, which should contain * CPU information. We currently extract only the label information. * * A type 4 SMBIOS_RECORD for processor 1 should look something like: * * * * * * * * * A type 4 SMBIOS_RECORD for subsequent processors should look something like: * * * * * * Detailed description: * * - Extract an index for this CPU from the CPU label provided by iLO2. * - Use this index to access the DiscoveryData.cpudata[] array. * - Set the IR_DISCOVERED bit in cpuflags. * - Store updated values for the label for this CPU. * * Return value: RIBCL_SUCCESS if success, -1 if failure. **/ static int ir_xml_scan_smbios_4( ilo2_ribcl_handler_t *ir_handler, xmlNodePtr b_node) { xmlChar *cpu = NULL; xmlChar *cpu_speed = NULL; int ret; int procnum = 0; /* We need to search this node's children for FIELD nodes * containing name and value pairs for the CPUs */ b_node = b_node->xmlChildrenNode; cpu = ir_xml_smb_get_value( "Label", b_node); /* Can also get the speed, execution technology, and memory * technology for the CPU. However, this data is only provided * for processor 1. */ cpu_speed = ir_xml_smb_get_value( "Speed", b_node); /* Find the index of this processor. The label returned in string * 'cpu' above should be of the form 'Proc N'. */ ret = sscanf( (char *)cpu, "Proc %d", &procnum); if( ret != 1){ /* We didn't parse the cpu string correctly */ err("ir_xml_scan_smbios_4: incorrect CPU string: %s", cpu); return( -1); } /* The index of this processor should be between 1 and * ILO2_RIBCL_DISCOVER_CPU_MAX. */ if( (procnum < 1) || (procnum > ILO2_RIBCL_DISCOVER_CPU_MAX) ){ err("ir_xml_scan_smbios_4: Proc index out of range: %d.", procnum); return( -1); } ir_handler->DiscoveryData.cpudata[ procnum].cpuflags |= IR_DISCOVERED; /* Now, if this information is different than what's already in * DiscoveryData, update DiscoveryData with the latest info */ ret = ir_xml_replacestr( &(ir_handler->DiscoveryData.cpudata[ procnum].label), (char *)cpu); /* Since we only have cpu speed reported for processor one, we make * the assumption that all processors are of the same rated speed. * Probably a safe assumption, since we are talking about Symetric * Multi-Processing here after all. */ if( (ret == RIBCL_SUCCESS) && ( cpu_speed != NULL)){ ret = ir_xml_replacestr( &(ir_handler->DiscoveryData.system_cpu_speed), (char *)cpu_speed); } if( cpu){ xmlFree(cpu); } if( cpu_speed){ xmlFree(cpu_speed); } return( ret); } /* end ir_xml_scan_smbios_4() */ /** * ir_xml_scan_smbios_17 * @ir_handler: Ptr to this instance's custom handler. * @b_node: porinter to an SMBIOS_RECORD node of type 17. * @mem_slotindex: pointer to an integer value for the current slot index. * * This routine will parse a SMBIOS_RECORD type 17 node, which should contain * memory DIMM information. We currently extract the label, size and speed. * Then, a call is made to ir_xml_record_memdata() to enter this data into * the DiscoveryData structure within the plugin's private handler. * * A type 17 SMBIOS_RECORD should look something like: * * * * * * * * Return value: RIBCL_SUCCESS if success, -1 if failure. **/ static int ir_xml_scan_smbios_17( ilo2_ribcl_handler_t *ir_handler, xmlNodePtr b_node, int *mem_slotindex) { xmlChar *mem_label = NULL; xmlChar *mem_size = NULL; xmlChar *mem_speed = NULL; int ret = RIBCL_SUCCESS; b_node = b_node->xmlChildrenNode; mem_label = ir_xml_smb_get_value( "Label", b_node); mem_size = ir_xml_smb_get_value( "Size", b_node); mem_speed = ir_xml_smb_get_value( "Speed", b_node); if( xmlStrcmp( mem_size, (xmlChar *)"not installed") != 0 ){ /* Record data for a populated DIMM slot */ ret = ir_xml_record_memdata( ir_handler, mem_slotindex, (char *)mem_label, (char *)mem_size, (char *) mem_speed); } /* Increment the slot index for both populated and unpopulated slots */ (*mem_slotindex)++; if( mem_label){ xmlFree( mem_label); } if( mem_size){ xmlFree( mem_size); } if( mem_speed){ xmlFree( mem_speed); } return( ret); } /* end ir_xml_scan_smbios_17() */ /** * ir_xml_record_memdata * @ir_handler: ptr to the ilo2_ribcl plugin private handler. * @memcount: ptr to an int that contains a mem slot count. * @memlabel: string memory DIMM label from iLO2. * @memsize: string memory DIMM size from iLO2. * @memspeed: string memory DIMM speed from iLO2. * * This routine records the data for a memory DIMM reported by * iLO2 into the DiscoveryData structure within the plugin's private handler. * * Detailed description: * * - Extract an index for this DIMM from the DIMM label provided by iLO2. * - Use this index to access the DiscoveryData.memdata[] array. * - Set the IR_DISCOVERED bit in memflags. * - Store updated values for the label, size, and speed for this DIMM. * * Return value: RIBCL_SUCCESS if success, -1 if failure. **/ static int ir_xml_record_memdata( ilo2_ribcl_handler_t *ir_handler, int *memcount, char *memlabel, char *memsize, char *memspeed) { int dimmindex = 0; int procindex = 0; int ret; ir_memdata_t *dimmdat; /* The format of a the memory label is 'DIMM nX' where n is an * integer and X is a capital letter. The integer value is * unique and begins at one, so we use this value as an index * for the DIMM. */ ret = sscanf( (char *)memlabel, "DIMM %d", &dimmindex); if( ret != 1){ /* Try for an alternate format. We will also accept a label * of the format 'PROC k DIMM nX' where k and n are integers * and X is a capital letter. Since n may not be unique across * all DIMMS, we will use the memcount parameter as the index * for the DIMM. */ ret = sscanf( (char*)memlabel, "PROC %d DIMM %d", &procindex, &dimmindex); /* In this case, we use the memory slot count passed to us via * parameter memcount as the memory index. */ dimmindex = *memcount; if( ret != 2){ /* We didn't parse the DIMM label correctly */ err("ir_xml_record_memdata: incorrect DIMM label string: %s", memlabel); return( -1); } } /* The index for this DIMM should be between 1 and * ILO2_RIBCL_DISCOVER_MEM_MAX. */ if( (dimmindex < 1) || (dimmindex > ILO2_RIBCL_DISCOVER_MEM_MAX) ){ err("ir_xml_record_memdata: DIMM index out of range: %d.", dimmindex); return( -1); } /* Now, if this information is different than what's already in * DiscoveryData, update DiscoveryData with the latest info */ dimmdat = &(ir_handler->DiscoveryData.memdata[dimmindex]); dimmdat->memflags |= IR_DISCOVERED; if( ir_xml_replacestr( &(dimmdat->label), memlabel) != RIBCL_SUCCESS){ return( -1); } if( ir_xml_replacestr( &(dimmdat->memsize), memsize) != RIBCL_SUCCESS){ return( -1); } if( ir_xml_replacestr( &(dimmdat->speed), memspeed) != RIBCL_SUCCESS){ return( -1); } return( RIBCL_SUCCESS); } /* end ir_xml_record_memdata() */ /** * ir_xml_smb_get_value * @name - name property string to match * @fld_node - doc subtree node containing one or more FIELD nodes * * This routine will scan all node siblings starting with fld_node, * Looking for FIELD nodes. If we find an atrirbute NAME on the FIELD * node with a value that matches the 'name' parameter, we return the * string value of the VALUE attribute for that node. Since this paragraph * doesn't make much sense, here's an example: * * * * * * * * * * * Using the above XML with a name parameter of "Curly" would return the * string "Stooge 3". * * Return value: * String value of the VALUE attribute if the NAME attrubute is matched, * NULL if no matches found. **/ static xmlChar *ir_xml_smb_get_value( char *name, xmlNodePtr fld_node) { xmlChar *smbnam = NULL; while( fld_node != NULL){ if((!xmlStrcmp( fld_node->name, (const xmlChar *)"FIELD"))){ smbnam = xmlGetProp( fld_node, (const xmlChar *)"NAME"); if( smbnam){ if(!xmlStrcmp( smbnam, (xmlChar *)name)){ xmlFree( smbnam); return( xmlGetProp( fld_node, (const xmlChar *)"VALUE")); } xmlFree( smbnam); } /* end if smbnam */ } /* end if name == "FIELD" */ fld_node = fld_node->next; } /* end while fld_node != NULL */ return( NULL); } /* end ir_xml_smb_get_value() */ /** * ir_xml_checkresults_doc * @doc: Ptr to XML tree results obtained from a RIBCL command output. * @ilostr: String to identify a particular iLO2 in error messages. * * Scans the XML tree for all occurences of a RIBCL node, and for each, * examines the STATUS attribute of the RESULTS. * * Return value: RIBCL_SUCCESS if all STATUS attributes in the document * have a value of zero, otherwise the first non zero value * encountered or -1 if the document has no STATUS attributes. **/ int ir_xml_checkresults_doc( xmlDocPtr doc, char *ilostr){ xmlNodePtr cur_node; int ribcl_status; int successful; cur_node = xmlDocGetRootElement(doc); if( cur_node == NULL){ err("ir_xml_checkresults_doc(): XML document has no root."); return( -1); } successful = 0; /* Get the list of childern nodes from the root */ cur_node = cur_node->xmlChildrenNode; while( cur_node != NULL){ if((!xmlStrcmp( cur_node->name, (const xmlChar *)"RIBCL"))){ ribcl_status = ir_xml_scan_response( cur_node, ilostr); if( ribcl_status != RIBCL_SUCCESS){ return( ribcl_status); } else { successful = 1; } } cur_node = cur_node->next; } if( successful){ return( RIBCL_SUCCESS); } else { return( -1); } } /* end ir_xml_checkresults_doc() */ /** * ir_xml_scan_response * @RIBCLnode * ilostring * * Examines the RIBCL node for a RESPONSE section, and then returns the value * of the STATUS propery. * * If the STATUS property in the RESPONSE section is not equal to the value * zero (RIBCL_SUCCESS), then log any text in the MESSAGE property as an * error message. The string passed in parameter 'ilostring' will be * incorporated into the error message so each iLO2's messages can be * identified if multiple instances are in use. * * Return value: Integer value of the STATUS property on success, -1 on failure. **/ static int ir_xml_scan_response( xmlNodePtr RIBCLnode, char *ilostring) { xmlNodePtr resp_node; xmlChar *statprop; xmlChar *errmes; int ret_stat = RIBCL_SUCCESS; /* Parameter RIBCLnode should point to a RIBCL node in the RIBCL xml * output document. */ resp_node = RIBCLnode->xmlChildrenNode; while( resp_node != NULL){ if((!xmlStrcmp( resp_node->name, (const xmlChar *)"RESPONSE"))){ statprop = xmlGetProp( resp_node, (const xmlChar *)"STATUS"); if( statprop != NULL){ ret_stat = (int)( strtol( (char *)statprop, NULL, 0)); xmlFree( statprop); } /* Log the error message from iLO2 */ if( ret_stat != RIBCL_SUCCESS){ errmes = xmlGetProp( resp_node, (const xmlChar *)"MESSAGE"); if( errmes){ /* this condition indicates the requested setting is not supported on the platform. For example SET_HOST_POWER_SAVER HOST_POWER_SAVER="4" is not a supported value on a DL385 G2. Return RIBCL_UNSUPPORTED to the calling routine. */ if(xmlStrcmp(errmes, (const xmlChar *)"The value specified is invalid.") == 0) { ret_stat = RIBCL_UNSUPPORTED; } err("Error from iLO2 at %s : %s.", ilostring, (char *)errmes); xmlFree( errmes); } } return( ret_stat); } resp_node = resp_node->next; } return( -1); } /* end ir_xml_scan_response() */ /** * ir_xml_convert_buffer * @oldbuffer: Ptr to memory buffer containing the raw RIBCL output. * @ret_size: Ptr to an integer used to return the size of the new buffer. * * Converts a buffer containing the raw output from a RIBCL command * that may contain multiple XML documents into a new buffer containing * that output massaged into a single XML document. This is done by adding * an outer enclosing tag called RIBCL_RESPONSE_OUTPUT. * * The libxml2 parser also doesn't like multiple occurences of the XML * header , so we filter those out as we encounter * them during the buffer copy. * * The DL380 G6 also has a section that causes errors with the * libxml2 parser. Since we don't use this information, we filter this out * during the buffer copy as well. * * Return value: Ptr to the new buffer on success, or NULL if failure. **/ static char *ir_xml_convert_buffer( char* oldbuffer, int *ret_size) { int newsize; static char declmatch[] = ""; static char drives_end[] =""; static char prefix[] = ""; static char suffix[] = ""; int prefix_len = (int)strlen( prefix); int suffix_len = (int)strlen( suffix); int matchlen = (int)strlen( declmatch); int drives_startlen = (int)(strlen(drives_start)); int drives_endlen = (int)(strlen(drives_end)); char *newbuffer; char *retbuffer; *ret_size = 0; /* Allocate a buffer large enough to hold the original buffer * contents, along with our added enclosing tag */ newsize = (int)strlen( oldbuffer) + prefix_len + suffix_len + 1; if( (newbuffer = malloc( newsize)) == NULL){ return( NULL); } retbuffer = newbuffer; /* Add the prefix to the new buffer */ strcpy( newbuffer, prefix); newbuffer += prefix_len; while( *oldbuffer != '\0'){ if( *oldbuffer == '<'){ /* Filter out embedded XML headers */ if( strncmp( oldbuffer, declmatch, matchlen) == 0){ while( *oldbuffer != '>'){ /* Unclosed XML decl - Error */ if( *oldbuffer == '\0'){ free( newbuffer); return( NULL); } oldbuffer++; } oldbuffer++; /* Skip trailing '>' */ continue; } /* Filter out ... section */ else if( strncmp( oldbuffer, drives_start, drives_startlen) == 0){ while( strncmp( oldbuffer, drives_end, drives_endlen)){ /* Unclosed XML decl - Error */ if( *oldbuffer == '\0'){ free( newbuffer); return( NULL); } oldbuffer++; } oldbuffer += drives_endlen; continue; } } /* end if *oldbuffer == '<' */ *newbuffer++ = *oldbuffer++; } /* Add the suffix to the new buffer */ strcpy( newbuffer, suffix); newbuffer += suffix_len; *newbuffer = '\0'; *ret_size = (int)strlen( retbuffer); #ifdef IR_XML_DEBUG printf("Size of converted buffer is %d\n", *ret_size); #endif /* IR_XML_DEBUG */ return( retbuffer); } /* end ir_xml_convert_buffer() */ /** * ir_xml_doparse * @raw_ribcl_outbuf : ptr to a buffer containing RIBCL command output * * Fix up the raw RIBCL output and then use the libxml2 parser to * translate it into a xmlDoc tree. * * Return value: pointer to an XML doc tree on success, NULL on failure. **/ static xmlDocPtr ir_xml_doparse( char *raw_ribcl_outbuf) { xmlDocPtr doc; char *ribcl_xml_buf; int xml_buf_size; ribcl_xml_buf = ir_xml_convert_buffer( raw_ribcl_outbuf, &xml_buf_size); if( ribcl_xml_buf == NULL){ err("ir_xml_doparse(): Error converting XML output buffer."); return( NULL); } doc = xmlParseMemory( ribcl_xml_buf, xml_buf_size); if( doc == NULL){ err("ir_xml_doparse(): XML parsing failed."); } free( ribcl_xml_buf); return( doc); } /* end ir_xml_doparse() */ /** * ir_xml_extract_index * @prefix: String prefix for match * @sourcestr: Source string containing resource label * @inexact: Flag to specify inexact matching between prefix and index. * * This routine is used to parse an index number from a resource label * given by iLO2 in a RIBCL command response. The label consists of an * alpha prefix string followed by one or more numeric characters. An example * of a label would be "Fan 4". The index value of a label must be greater * than zero. * * Parameter 'prefix' gives a string prefix which must match the beginning * of the label passed with parameter 'sourcestr'. If sourcestr does not * begin with prefix, IR_NO_PREFIX is returned. * * If parameter 'inexact' is non-zero, there can be an arbitrary sequence * fo non-numeric characters between the prefix and the numeric value. As * an example, if prefix is "Fan", the lable string "Fan Unit 4" would result * in a return value of 4 from this function when inexact is non-zero, and * a return of IR_NO_INDEX when inexact is zero. * * Return value: * The resource index extracted from the label if success. * IR_NO_PREFIX if the prefix does not match the beginning of sourcestr. * IR_NO_INDEX if there was a problem extracting a numeric index. **/ static int ir_xml_extract_index( char *prefix, char *sourcestr, int inexact) { size_t p_len; int retval; /* First, check that the prefix matches the beginning of the * source string */ p_len = strlen( prefix); if( strncmp( prefix, sourcestr, p_len) ){ /* prefix didn't match */ return( IR_NO_PREFIX); } sourcestr = &sourcestr[p_len]; /* skip past the prefix */ /* If the inexact parameter is non zero, allow any number of * non-numeric characters between the prefix and the digits * of the index */ if( inexact){ while( *sourcestr != '\0'){ if( isdigit( *sourcestr)){ break; } sourcestr++; } } /* If we are at the end of the string now, return an error */ if( *sourcestr == '\0'){ return( IR_NO_INDEX); } /* Try to extract the index. We use strtol() here because it checks * for errors, while atoi() does not. */ errno = 0; retval = (int)strtol( sourcestr, (char **)NULL, 10); if( errno){ return( IR_NO_INDEX); } /* If strtol() couldn't find a number to convert, it returns zero. * Fortunately for us, zero is an illegal index value, so we can * detect it and return an error */ if( retval == 0){ retval = IR_NO_INDEX; } return( retval); } /*end ir_xml_extract_index() */ /** * ir_xml_replacestr * @ostring: pointer to the char pointer of oldstring. * @nstring: pointer to the new string. * * This routine will update the oldstring with the new string if they * differ, using this algorithm: * * If the new string is null{ * Don't modify the old string * } Else { * If the old string in non-null and the new string is different than * the old string { * Replace the old string with the new string * } * } * * Return value: * RIBCL_SUCCESS if success * -1 if failure **/ static int ir_xml_replacestr( char **ostring, char *nstring) { size_t len; /* If the new string is NULL, return success, leaving the * old string unchanged. */ if( nstring == NULL){ return( RIBCL_SUCCESS); } /* If the old string is non null, and the new string is * different than the old string, free the old string * and replace it with the new string. */ if( (*ostring != NULL) && (strcmp( *ostring, nstring)) ){ free( *ostring); *ostring = NULL; } if( *ostring == NULL){ len = strlen( nstring); *ostring = malloc( len+1); if( *ostring == NULL){ return( -1); } strncpy( *ostring, nstring, len+1); } return( RIBCL_SUCCESS); } /* end ir_xml_replacestr() */ #ifdef ILO2_RIBCL_DEBUG_SENSORS static char *ilo2_ribcl_sval2string[] = { "I2R_SEN_VAL_OK", "I2R_SEN_VAL_DEGRADED", "I2R_SEN_VAL_FAILED" }; static char *ilo2_ribcl_sstate2string[] = { "I2R_INITIAL", "I2R_OK", "I2R_DEGRADED_FROM_OK", "I2R_DEGRADED_FROM_FAIL", "I2R_FAILED" }; static char *ilo2_ribcl_snum2string[] = { "INVALID NUMBER", "I2R_SEN_FANHEALTH", "I2R_SEN_TEMPHEALTH", "I2R_SEN_POWERHEALTH" }; void dump_chassis_sensors( ilo2_ribcl_handler_t *ir_handler) { int iter; int val; ilo2_ribcl_DiscoveryData_t *ddata; char *s1; char *s2; char *s3; ddata = &(ir_handler->DiscoveryData); for( iter = 1; iter < I2R_NUM_CHASSIS_SENSORS; iter++){ s1 = ilo2_ribcl_snum2string[ iter]; val = ddata->chassis_sensors[ iter].state; if( val == 0xFFFF){ s2 = "I2R_NO_EXIST"; } else { s2 = ilo2_ribcl_sstate2string[ val]; } val = ddata->chassis_sensors[ iter].reading.intval; if( val == -1){ s3 = "I2R_SEN_VAL_UNINITIALIZED"; } else { s3 = ilo2_ribcl_sval2string[val]; } err("Sensor %s state %s value %s.", s1, s2, s3); } } /* end dump_chassis_sensors() */ #endif /* ILO2_RIBCL_DEBUG_SENSORS */ openhpi-2.14.1/plugins/ilo2_ribcl/ilo2_ribcl_power.c0000644000076400007640000002742611302566624017312 0ustar /* * Copyright (C) 2007-2008, Hewlett-Packard Development Company, LLP * All rights reserved. * * 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. * * Neither the name of the Hewlett-Packard Corporation, nor the names * of its contributors may be used to endorse or promote products * derived from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * Author(s) * Shuah Khan * Richard White */ /*************** * This source file contains Power HPI ABI routines iLO2 RIBCL plug-in * implements. Other source files provide support functionality for * these ABIs. ***************/ #include #include #include /***************************** iLO2 RIBCL plug-in Power ABI Interface functions *****************************/ /** * ilo2_ribcl_get_power_state: * @hnd: Handler data pointer. * @rid: Resource ID. * @act: Location to store resource's power state. * * Retrieves a resource's power state. If the resource has * SAHPI_CAPABILITY_POWER, then finds the current power state from * iLO2 by sending a GET_HOST_POWER_STATUS RIBCL command to it. * * Return values: * SA_OK - Normal case. * SA_ERR_HPI_CAPABILITY - Resource doesn't have SAHPI_CAPABILITY_POWER. * SA_ERR_HPI_INVALID_RESOURCE - Resource doesn't exist. * SA_ERR_HPI_INVALID_PARAMS - Pointer parameter(s) are NULL. **/ SaErrorT ilo2_ribcl_get_power_state(void *hnd, SaHpiResourceIdT rid, SaHpiPowerStateT *state) { struct oh_handler_state *handle; ilo2_ribcl_handler_t *ilo2_ribcl_handler = NULL; SaHpiRptEntryT *rpt; char *grs_cmd; char *response; /* command response buffer */ int ret; int power_status = -1; ilo2_ribcl_resource_info_t *res_info = NULL; if (!hnd || !state) { err("ilo2_ribcl_get_power_state(): Invalid parameter."); return(SA_ERR_HPI_INVALID_PARAMS); } handle = (struct oh_handler_state *)hnd; ilo2_ribcl_handler = (ilo2_ribcl_handler_t *)handle->data; if (!ilo2_ribcl_handler) { err("ilo2_ribcl_get_power_state(): Invalid parameter."); return(SA_ERR_HPI_INVALID_PARAMS); } /* Check if resource exists and has power capabilities */ rpt = oh_get_resource_by_id(handle->rptcache, rid); if (!rpt) { return(SA_ERR_HPI_INVALID_RESOURCE); } if (!(rpt->ResourceCapabilities & SAHPI_CAPABILITY_POWER)) { return(SA_ERR_HPI_CAPABILITY); } res_info = (ilo2_ribcl_resource_info_t *)oh_get_resource_data( handle->rptcache, rpt->ResourceId); if (!res_info) { err("ilo2_ribcl_get_power_state(): no resource info."); return(SA_ERR_HPI_INVALID_RESOURCE); } /* Allocate a temporary response buffer. */ response = malloc(ILO2_RIBCL_BUFFER_LEN); if( response == NULL){ err("ilo2_ribcl_get_power_state: failed to allocate resp buffer."); return( SA_ERR_HPI_OUT_OF_MEMORY); } /* Retrieve our customized command buffer */ grs_cmd = ilo2_ribcl_handler->ribcl_xml_cmd[IR_CMD_GET_HOST_POWER_STATUS]; if( grs_cmd == NULL){ err("ilo2_ribcl_get_power_state: null customized command."); free( response); return( SA_ERR_HPI_INTERNAL_ERROR); } /* Send the command to iLO2 and get the response. */ ret = ilo2_ribcl_ssl_send_command( ilo2_ribcl_handler, grs_cmd, response, ILO2_RIBCL_BUFFER_LEN); if( ret != 0){ err("ilo2_ribcl_get_power_state: command send failed."); free( response); return( SA_ERR_HPI_INTERNAL_ERROR); } /* Now, parse the response. */ ret = ir_xml_parse_host_power_status(response, &power_status, ilo2_ribcl_handler->ilo2_hostport); if( ret != RIBCL_SUCCESS){ err("ilo2_ribcl_get_power_state: response parse failed."); free( response); return( SA_ERR_HPI_INTERNAL_ERROR); } /* We're finished. Free up the temporary response buffer */ free( response); if(power_status == ILO2_RIBCL_POWER_ON) { *state = SAHPI_POWER_ON; res_info->power_cur_state = *state; } else if (power_status == ILO2_RIBCL_POWER_OFF) { *state = SAHPI_POWER_OFF; res_info->power_cur_state = *state; } else { return( SA_ERR_HPI_INTERNAL_ERROR); } return(SA_OK); } /** * ilo2_ribcl_set_power_state: * @hnd: Handler data pointer. * @rid: Resource ID. * @state: Resources's power state to set. * * Sets a resource's power state. * Retrieves a resource's power state. If the resource has * SAHPI_CAPABILITY_POWER, sends SET_HOST_POWER command to turn power on * or off based on the requtested power state. * If state == SAHPI_POWER_OFF, sends SET_HOST_POWER_OFF command to * turn power off. * If state == SAHPI_POWER_ON sends SET_HOST_POWER_ON command. * If state == SAHPI_POWER_CYCLE sends SET_HOST_POWER_OFF followed * by SET_HOST_POWER_ON command. * * Return values: * SA_OK - Normal case. * SA_ERR_HPI_CAPABILITY - Resource doesn't have SAHPI_CAPABILITY_POWER. * SA_ERR_HPI_INVALID_CMD - Resource doesn't support SAHPI_RESET_ASSERT. * SA_ERR_HPI_INVALID_RESOURCE - Resource doesn't exist. * SA_ERR_HPI_INVALID_PARAMS - Pointer parameter(s) are NULL; @state invalid. **/ SaErrorT ilo2_ribcl_set_power_state(void *hnd, SaHpiResourceIdT rid, SaHpiPowerStateT state) { struct oh_handler_state *handle; ilo2_ribcl_handler_t *ilo2_ribcl_handler = NULL; SaHpiRptEntryT *rpt; char *sps_cmd; char *response; /* command response buffer */ int ret; ilo2_ribcl_resource_info_t *res_info = NULL; if (!hnd || NULL == oh_lookup_powerstate(state)){ err("ilo2_ribcl_set_power_state(): Invalid parameter."); return(SA_ERR_HPI_INVALID_PARAMS); } handle = (struct oh_handler_state *)hnd; ilo2_ribcl_handler = (ilo2_ribcl_handler_t *)handle->data; if (!ilo2_ribcl_handler) { err("ilo2_ribcl_set_power_state(): Invalid parameter."); return(SA_ERR_HPI_INVALID_PARAMS); } /* Check if resource exists and has power capabilities */ rpt = oh_get_resource_by_id(handle->rptcache, rid); if (!rpt) { return(SA_ERR_HPI_INVALID_RESOURCE); } if (!(rpt->ResourceCapabilities & SAHPI_CAPABILITY_POWER)) { return(SA_ERR_HPI_CAPABILITY); } res_info = (ilo2_ribcl_resource_info_t *)oh_get_resource_data( handle->rptcache, rpt->ResourceId); if (!res_info) { err("ilo2_ribcl_get_power_state(): no resource info."); return(SA_ERR_HPI_INVALID_RESOURCE); } /* Note that we don't check our cached power state, since the resource * power state could have been changed via a local power button. */ /* Allocate a temporary response buffer. */ response = malloc(ILO2_RIBCL_BUFFER_LEN); if( response == NULL){ err("ilo2_ribcl_set_power_state: failed to allocate resp buffer."); return( SA_ERR_HPI_OUT_OF_MEMORY); } /* Retrieve our customized command buffer */ if(state == SAHPI_POWER_OFF) { sps_cmd = ilo2_ribcl_handler->ribcl_xml_cmd[IR_CMD_SET_HOST_POWER_OFF]; } else if(state == SAHPI_POWER_ON) { sps_cmd = ilo2_ribcl_handler->ribcl_xml_cmd[IR_CMD_SET_HOST_POWER_ON]; } else if(state == SAHPI_POWER_CYCLE) { /* first send power off command */ sps_cmd = ilo2_ribcl_handler->ribcl_xml_cmd[IR_CMD_SET_HOST_POWER_OFF]; } else { /* we should never get here as oh_lookup_powerstate() should have returned a null string back. */ err("ilo2_ribcl_set_power_state(): Invalid parameter."); return(SA_ERR_HPI_INVALID_PARAMS); } if( sps_cmd == NULL){ err("ilo2_ribcl_set_power_state: null customized command."); free( response); return( SA_ERR_HPI_INTERNAL_ERROR); } /* Send the command to iLO2 and get the response. */ ret = ilo2_ribcl_ssl_send_command( ilo2_ribcl_handler, sps_cmd, response, ILO2_RIBCL_BUFFER_LEN); if( ret != 0){ err("ilo2_ribcl_set_power_state: command send failed."); free( response); return( SA_ERR_HPI_INTERNAL_ERROR); } /* Now, parse the response. */ ret = ir_xml_parse_set_host_power(response, ilo2_ribcl_handler->ilo2_hostport); if(ret == -1) { err("ilo2_ribcl_set_power_state: iLO2 returned error."); free( response); return( SA_ERR_HPI_INTERNAL_ERROR); } /* If the requested state is SAHPI_POWER_CYCLE, turn the power on */ if(state == SAHPI_POWER_CYCLE) { SaHpiPowerStateT temp_state; int polls; /* First, wait for the power to go off. An orderly shutdown * is being performed, so we might have to wait for * an OS running on that resource to fully shut down. * Unfortunately, the iLo2 will not queue the power commands. * If we send a "power on" command before the system actually * powers off, the "power on" command will be dropped, as the * iLo2 will detect that the system is already (still) on. */ temp_state = SAHPI_POWER_ON; for( polls=0; polls < ILO2_MAX_POWER_POLLS; polls++){ dbg("Obtaining current power state from iLo2 at %s, try %d", ilo2_ribcl_handler->ilo2_hostport, polls); ilo2_ribcl_get_power_state(hnd, rid, &temp_state); if(temp_state == SAHPI_POWER_OFF){ break; } /* iLo2 commands take around 10 seconds round trip, * so sleep for a while before retrying. */ sleep( ILO2_POWER_POLL_SLEEP_SECONDS); } /* end for polls */ if( polls == ILO2_MAX_POWER_POLLS){ err("Maximum tries exceeded ( %d) checking power off for system at address %s", ILO2_MAX_POWER_POLLS, ilo2_ribcl_handler->ilo2_hostport); return( SA_ERR_HPI_INTERNAL_ERROR); } /* Power is off now. update res_info power status */ res_info->power_cur_state = SAHPI_POWER_OFF; /* Now, try sending the power on command */ sps_cmd = ilo2_ribcl_handler->ribcl_xml_cmd[IR_CMD_SET_HOST_POWER_ON]; if( sps_cmd == NULL){ err("ilo2_ribcl_set_power_state: null customized command."); free( response); return( SA_ERR_HPI_INTERNAL_ERROR); } /* Send the command to iLO2 and get the response. */ ret = ilo2_ribcl_ssl_send_command( ilo2_ribcl_handler, sps_cmd, response, ILO2_RIBCL_BUFFER_LEN); if( ret != 0){ err("ilo2_ribcl_set_power_state: command send failed."); free( response); return( SA_ERR_HPI_INTERNAL_ERROR); } /* Now, parse the response. */ ret = ir_xml_parse_set_host_power(response, ilo2_ribcl_handler->ilo2_hostport); free( response); if(ret == -1) { err("ilo2_ribcl_set_power_state: iLO2 returned error."); return( SA_ERR_HPI_INTERNAL_ERROR); } /* Power is on, update res_info power status */ res_info->power_cur_state = SAHPI_POWER_ON; } else { /* Save current value in res_info */ res_info->power_cur_state = state; } return(SA_OK); } /***************************** OpenHPI plug-in to iLO2 RIBCL plug-in ABI function mapping *****************************/ void * oh_get_power_state (void *, SaHpiResourceIdT, SaHpiResetActionT *) __attribute__ ((weak, alias("ilo2_ribcl_get_power_state"))); void * oh_set_power_state (void *, SaHpiResourceIdT, SaHpiResetActionT) __attribute__ ((weak, alias("ilo2_ribcl_set_power_state"))); openhpi-2.14.1/plugins/ilo2_ribcl/ilo2_ribcl_discover.h0000644000076400007640000000510311302566624017765 0ustar /* * Copyright (C) 2007-2008, Hewlett-Packard Development Company, LLP * All rights reserved. * * 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. * * Neither the name of the Hewlett-Packard Corporation, nor the names * of its contributors may be used to endorse or promote products * derived from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * Author(s) * Shuah Khan * Richard White */ #ifndef _INC_ILO2_RIBCL_DISCOVER_H_ #define _INC_ILO2_RIBCL_DISCOVER_H_ extern void ilo2_ribcl_free_discoverydata( ilo2_ribcl_handler_t *); /* The size used for the temporary buffer to contain the response * of the IR_CMD_GET_SERVER_DATA command. The current return size is * a little over 24K, so we use 48K to give us some margin for the * future. */ #define ILO2_RIBCL_DISCOVER_RESP_MAX 1024*48 /* This define is the IANA-assigned private enterprise number for Hewlett-Packard. A complete list of IANA numbers can be found at http://www.iana.org/assignments/enterprise-numbers */ #define HP_MANUFACTURING_ID 11 /* Prototypes for functions within ilo2_ribcl_discovery.c that can be * called from within other modules */ extern void ilo2_ribcl_add_resource_capability( struct oh_handler_state *, struct oh_event *, SaHpiCapabilitiesT); #endif /* _INC_ILO2_RIBCL_DISCOVER_H_ */ openhpi-2.14.1/plugins/oa_soap/0000755000076400007640000000000011405006365013273 5ustar openhpi-2.14.1/plugins/oa_soap/oa_soap_enclosure_event.c0000644000076400007640000000737611302566663020365 0ustar /* * Copyright (C) 2008, Hewlett-Packard Development Company, LLP * All rights reserved. * * 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. * * Neither the name of the Hewlett-Packard Corporation, nor the names * of its contributors may be used to endorse or promote products * derived from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * Author(s) * Raghavendra M.S. * Raghavendra P.G. * * This file has the enclosure related events handling * * oa_soap_proc_enc_status() - Processes the enclosure status event * */ #include "oa_soap_enclosure_event.h" /** * oa_soap_proc_enc_status * @oh_handler: Pointer to openhpi handler structure * @con: Pointer to soap client con object * @event: Pointer to the openhpi event structure * * Purpose: * * * Detailed Description: NA * * Return values: * NONE **/ void oa_soap_proc_enc_status(struct oh_handler_state *oh_handler, struct enclosureStatus *status) { SaErrorT rv = SA_OK; SaHpiResourceIdT resource_id; struct oa_soap_handler *oa_handler; enum diagnosticStatus diag_ex_status[OA_SOAP_MAX_DIAG_EX]; if (oh_handler == NULL || status == NULL) { err("wrong parameters passed"); return; } oa_handler = (struct oa_soap_handler *) oh_handler->data; resource_id = oa_handler->oa_soap_resources.enclosure_rid; /* Process the operational status sensor */ OA_SOAP_PROCESS_SENSOR_EVENT(OA_SOAP_SEN_OPER_STATUS, status->operationalStatus, 0, 0) /* Process the predictive failure status sensor */ OA_SOAP_PROCESS_SENSOR_EVENT(OA_SOAP_SEN_PRED_FAIL, status->operationalStatus, 0, 0) /* Process the internal data error sensor */ OA_SOAP_PROCESS_SENSOR_EVENT(OA_SOAP_SEN_INT_DATA_ERR, status->diagnosticChecks.internalDataError, 0, 0) /* Process the device failure sensor */ OA_SOAP_PROCESS_SENSOR_EVENT(OA_SOAP_SEN_DEV_FAIL, status->diagnosticChecks.deviceFailure, 0, 0) /* Process the device degraded sensor */ OA_SOAP_PROCESS_SENSOR_EVENT(OA_SOAP_SEN_DEV_DEGRAD, status->diagnosticChecks.deviceDegraded, 0, 0) /* Process the redundancy error sensor */ OA_SOAP_PROCESS_SENSOR_EVENT(OA_SOAP_SEN_REDUND_ERR, status->diagnosticChecks.redundancy, 0, 0) oa_soap_parse_diag_ex(status->diagnosticChecksEx, diag_ex_status); /* Build device not supported sensor rdr */ OA_SOAP_PROCESS_SENSOR_EVENT(OA_SOAP_SEN_DEV_NOT_SUPPORT, diag_ex_status[DIAG_EX_DEV_NOT_SUPPORT], 0, 0) return; } openhpi-2.14.1/plugins/oa_soap/Makefile.am0000644000076400007640000001071311302566664015342 0ustar # Copyright (C) 2007-2008, Hewlett-Packard Development Company, LLP # All rights reserved. # # 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. # # Neither the name of the Hewlett-Packard Corporation, nor the names # of its contributors may be used to endorse or promote products # derived from this software without specific prior written permission. # # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS # "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT # LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS # FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT # OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, # SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED # TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, # OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY # OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING # NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS # SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. MAINTAINERCLEANFILES = Makefile.in INCLUDES = @OPENHPI_INCLUDES@ @XML2_INCLUDE@ @OH_SSL_INCLUDES@ pkglib_LTLIBRARIES = liboa_soap.la EXTRA_DIST = \ OpenHPI_Blade_DevGuide.pdf liboa_soap_la_SOURCES = oa_soap.h \ oa_soap.c \ oa_soap_power.h \ oa_soap_power.c \ oa_soap_reset.h \ oa_soap_reset.c \ oa_soap_hotswap.h \ oa_soap_hotswap.c \ oa_soap_utils.h \ oa_soap_utils.c \ oa_soap_resources.h \ oa_soap_resources.c \ oa_soap_discover.h \ oa_soap_discover.c \ oa_soap_re_discover.h \ oa_soap_re_discover.c \ oa_soap_event.h \ oa_soap_event.c \ oa_soap_enclosure_event.h \ oa_soap_enclosure_event.c \ oa_soap_oa_event.h \ oa_soap_oa_event.c \ oa_soap_ps_event.h \ oa_soap_ps_event.c \ oa_soap_fan_event.h \ oa_soap_fan_event.c \ oa_soap_lcd_event.h \ oa_soap_lcd_event.c \ oa_soap_server_event.h \ oa_soap_server_event.c \ oa_soap_interconnect_event.h \ oa_soap_interconnect_event.c \ oa_soap_control.h \ oa_soap_control.c \ oa_soap_sensor.h \ oa_soap_sensor.c \ oa_soap_inventory.h \ oa_soap_inventory.c \ oa_soap_watchdog.h \ oa_soap_watchdog.c \ oa_soap_sel.h \ oa_soap_sel.c \ oa_soap_annunciator.h \ oa_soap_annunciator.c \ oa_soap_dimi.h \ oa_soap_dimi.c \ oa_soap_fumi.h \ oa_soap_fumi.c \ oa_soap_load_id.h \ oa_soap_load_id.c \ oa_soap_calls.h \ oa_soap_calls.c \ oa_soap_callsupport.h \ oa_soap_callsupport.c # TODO: What about -luuid in the ilo2_ribcl? liboa_soap_la_LIBADD = @SSL_LIB@ @XML2_LIB@ \ $(top_builddir)/utils/libopenhpiutils.la liboa_soap_la_LDFLAGS = -module -version-info @HPI_LIB_VERSION@ openhpi-2.14.1/plugins/oa_soap/oa_soap_re_discover.h0000644000076400007640000001051011302566663017456 0ustar /* * Copyright (C) 2007-2009, Hewlett-Packard Development Company, LLP * All rights reserved. * * 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. * * Neither the name of the Hewlett-Packard Corporation, nor the names * of its contributors may be used to endorse or promote products * derived from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * Author(s) * Raghavendra P.G. * Mohan Devarajulu */ #ifndef _OA_SOAP_RE_DISCOVER_H #define _OA_SOAP_RE_DISCOVER_H /* Include files */ #include "oa_soap_discover.h" #include "oa_soap_server_event.h" #include "oa_soap_interconnect_event.h" #include "oa_soap_fan_event.h" #include "oa_soap_ps_event.h" #include "oa_soap_enclosure_event.h" #include "oa_soap_lcd_event.h" SaErrorT oa_soap_re_discover_resources(struct oh_handler_state *oh_handler, struct oa_info *oa, int oa_switched); SaErrorT re_discover_oa(struct oh_handler_state *oh_handler, SOAP_CON *con); SaErrorT remove_oa(struct oh_handler_state *oh_handler, SaHpiInt32T bay_number); SaErrorT add_oa(struct oh_handler_state *oh_handler, SOAP_CON *con, SaHpiInt32T bay_number); SaErrorT re_discover_blade(struct oh_handler_state *oh_handler, SOAP_CON *con); SaErrorT update_server_hotswap_state(struct oh_handler_state *oh_handler, SOAP_CON *con, SaHpiInt32T bay_number); SaErrorT remove_server_blade(struct oh_handler_state *oh_handler, SaHpiInt32T bay_number); SaErrorT add_server_blade(struct oh_handler_state *oh_handler, SOAP_CON *con, struct bladeInfo *info); SaErrorT re_discover_interconnect(struct oh_handler_state *oh_handler, SOAP_CON *con); SaErrorT update_interconnect_hotswap_state(struct oh_handler_state *oh_handler, SOAP_CON *con, SaHpiInt32T bay_number); SaErrorT remove_interconnect(struct oh_handler_state *oh_handler, SaHpiInt32T bay_number); SaErrorT add_interconnect(struct oh_handler_state *oh_handler, SOAP_CON *con, SaHpiInt32T bay_number); SaErrorT re_discover_fan(struct oh_handler_state *oh_handler, SOAP_CON *con); SaErrorT remove_fan(struct oh_handler_state *oh_handler, SaHpiInt32T bay_number); SaErrorT add_fan(struct oh_handler_state *oh_handler, SOAP_CON *con, struct fanInfo *info); SaErrorT re_discover_ps_unit(struct oh_handler_state *oh_handler, SOAP_CON *con); SaErrorT remove_ps_unit(struct oh_handler_state *oh_handler, SaHpiInt32T bay_number); SaErrorT add_ps_unit(struct oh_handler_state *oh_handler, SOAP_CON *con, struct powerSupplyInfo *info); #endif openhpi-2.14.1/plugins/oa_soap/oa_soap_utils.h0000644000076400007640000001050411302566663016315 0ustar /* * Copyright (C) 2007-2008, Hewlett-Packard Development Company, LLP * All rights reserved. * * 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. * * Neither the name of the Hewlett-Packard Corporation, nor the names * of its contributors may be used to endorse or promote products * derived from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * Author(s) * Raghavendra P.G. * Vivek Kumar * Shuah Khan */ #ifndef _OA_SOAP_UTILS_H #define _OA_SOAP_UTILS_H /* Include files */ #include #include #include "oa_soap_calls.h" #include "oa_soap.h" #include "oa_soap_inventory.h" /* OA takes around 90 seconds to stabilize */ #define OA_STABILIZE_MAX_TIME 90 /* Max timeout value for checking the availability of OA */ #define MAX_TIMEOUT 300 /* Function prototypes */ SaErrorT get_oa_soap_info(struct oh_handler_state *oh_handler); SaErrorT get_oa_state(struct oh_handler_state *oh_handler, char *ip); void update_hotswap_event(struct oh_handler_state *oh_handler, struct oh_event *event); struct oh_event *copy_oa_soap_event(struct oh_event *event); SaErrorT del_rdr_from_event(struct oh_event *event); SaErrorT check_oa_status(struct oa_soap_handler *oa_handler, struct oa_info *oa, SOAP_CON *con); SaErrorT check_oa_user_permissions(struct oa_soap_handler *oa_handler, SOAP_CON *con, char *user_name); SaErrorT check_discovery_failure(struct oh_handler_state *oh_handler); SaErrorT lock_oa_soap_handler(struct oa_soap_handler *oa_handler); SaErrorT check_config_parameters(GHashTable *handler_config); SaErrorT create_event_session(struct oa_info *oa); void create_oa_connection(struct oa_soap_handler *oa_handler, struct oa_info *oa, char *user_name, char *password); SaErrorT initialize_oa_con(struct oa_info *oa, char *user_name, char *password); SaErrorT delete_all_inventory_info(struct oh_handler_state *oh_handler); void cleanup_plugin_rptable(struct oh_handler_state *oh_handler); void release_oa_soap_resources(struct oa_soap_handler * oa_handler); SaHpiFloat64T get_oa_fw_version(struct oh_handler_state *oh_handler); SaErrorT update_oa_info(struct oh_handler_state *oh_handler, struct oaInfo *response, SaHpiResourceIdT resource_id); SaErrorT convert_lower_to_upper(char *src, SaHpiInt32T src_len, char *dest, SaHpiInt32T dest_len); void oa_soap_update_resource_status(resource_status_t *res_status, SaHpiInt32T index, char *serial_number, SaHpiResourceIdT resource_id, resource_presence_status_t presence); #endif openhpi-2.14.1/plugins/oa_soap/oa_soap_sel.c0000644000076400007640000001772511302566664015750 0ustar /* * Copyright (C) 2007-2008, Hewlett-Packard Development Company, LLP * All rights reserved. * * 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. * * Neither the name of the Hewlett-Packard Corporation, nor the names * of its contributors may be used to endorse or promote products * derived from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * Author(s) * Raghavendra M.S. **/ #include "oa_soap_sel.h" /** * oa_soap_get_sel_info: * @oh_handler: Handler data pointer. * @resource_id: Resource ID. * @info: Sensor rdr number. * * Purpose: * Gets current number of entries in the event log. * * Detailed Description: NA * * Return values: * SA_ERR_HPI_UNSUPPORTED_API - current oa soap implementation * does not support this API. **/ SaErrorT oa_soap_get_sel_info(void *oh_handler, SaHpiResourceIdT resource_id, SaHpiEventLogInfoT *info) { err("Get Event Log info is not supported"); return SA_ERR_HPI_UNSUPPORTED_API; } /** * oa_soap_set_sel_time: * @oh_handler: Handler data pointer. * @resource_id: Resource ID. * @time: Time to be set for event log. * * Purpose: * Sets the event log's clock. * * Detailed Description: NA * * Return values: * SA_ERR_HPI_UNSUPPORTED_API - current oa soap implementation * does not support this API. **/ SaErrorT oa_soap_set_sel_time(void *oh_handler, SaHpiResourceIdT resource_id, SaHpiTimeT time) { err("Set Event log time is not supported"); return SA_ERR_HPI_UNSUPPORTED_API; } /** * oa_soap_add_sel_entry. * @oh_handler: Handler data pointer. * @resource_id: Resource ID. * @Event: Event entry. * * Purpose: * Adds the event entries to event log. * * Detailed Description: NA * * Return values: * SA_ERR_HPI_UNSUPPORTED_API - current oa soap implementation * does not support this API. **/ SaErrorT oa_soap_add_sel_entry(void *oh_handler, SaHpiResourceIdT resource_id, const SaHpiEventT *Event) { err("Adding entries to Event log is not supported"); return SA_ERR_HPI_UNSUPPORTED_API; } /** * oa_soap_clear_sel. * @oh_handler: Handler data pointer. * @resource_id: Resource ID. * * Purpose: * Clears all entries from Event log. * * Detailed Description: NA * * Return values: * SA_ERR_HPI_UNSUPPORTED_API - current oa soap implementation * does not support this API. **/ SaErrorT oa_soap_clear_sel(void *oh_handler, SaHpiResourceIdT resource_id) { err("Clearing entries from Event log is not supported"); return SA_ERR_HPI_UNSUPPORTED_API; } /** * oa_soap_reset_sel_overflow. * @oh_handler: Handler data pointer. * @resource_id: Resource ID. * * Purpose: * Resets the overflow flag in the event log. * * Detailed Description: NA * * Return values: * SA_ERR_HPI_UNSUPPORTED_API - current oa soap implementation * does not support this API. **/ SaErrorT oa_soap_reset_sel_overflow(void *oh_handler, SaHpiResourceIdT resource_id) { err("Reset overflow of Event log is not supported"); return SA_ERR_HPI_UNSUPPORTED_API; } /** * oa_soap_get_sel_entry: * @oh_handler: Handler data pointer. * @resource_id: Resource ID. * @current: Current event's ID. * @prev: Location to store previous event's ID. * @next: Location to store next event's ID. * @entry: Location to store retrieved event. * @rdr: Rdr structure. * @rpt: Rpt entry. * * Purpose: * Gets the event log entry. * * Detailed Description: NA * * Return values: * SA_ERR_HPI_UNSUPPORTED_API - current oa soap implementation * does not support this API. **/ SaErrorT oa_soap_get_sel_entry(void *oh_handler, SaHpiResourceIdT resource_id, SaHpiEventLogEntryIdT current, SaHpiEventLogEntryIdT *prev, SaHpiEventLogEntryIdT *next, SaHpiEventLogEntryT *entry, SaHpiRdrT *rdr, SaHpiRptEntryT *rpt) { err("Get Event log entry is not supported"); return SA_ERR_HPI_UNSUPPORTED_API; } /** * oa_soap_sel_set_state: * @oh_handler: Handler data pointer. * @id: Resource ID. * @enable: SEL state. * * Purpose: * Sets the event log state to enabled or disabled. * * Detailed Description: NA * * Return values: * SA_ERR_HPI_UNSUPPORTED_API - current oa soap implementation * does not support this API. **/ SaErrorT oa_soap_sel_state_set(void *oh_handler, SaHpiResourceIdT resource_id, SaHpiBoolT enable) { err("Set Event log state is not supported"); return SA_ERR_HPI_UNSUPPORTED_API; } void * oh_get_el_info (void *, SaHpiResourceIdT, SaHpiEventLogInfoT *) __attribute__ ((weak, alias("oa_soap_get_sel_info"))); void * oh_set_el_time (void *, SaHpiResourceIdT, const SaHpiEventT *) __attribute__ ((weak, alias("oa_soap_set_sel_time"))); void * oh_add_el_entry (void *, SaHpiResourceIdT, const SaHpiEventT *) __attribute__ ((weak, alias("oa_soap_add_sel_entry"))); void * oh_get_el_entry (void *, SaHpiResourceIdT, SaHpiEventLogEntryIdT, SaHpiEventLogEntryIdT *, SaHpiEventLogEntryIdT *, SaHpiEventLogEntryT *, SaHpiRdrT *, SaHpiRptEntryT *) __attribute__ ((weak, alias("oa_soap_get_sel_entry"))); void * oh_clear_el (void *, SaHpiResourceIdT) __attribute__ ((weak, alias("oa_soap_clear_sel"))); void * oh_reset_el_overflow (void *, SaHpiResourceIdT) __attribute__ ((weak, alias("oa_soap_reset_sel_overflow"))); void * oh_set_el_state(void *, SaHpiResourceIdT, SaHpiBoolT) __attribute__ ((weak, alias("oa_soap_sel_state_set"))); openhpi-2.14.1/plugins/oa_soap/oa_soap_interconnect_event.c0000644000076400007640000007430411302566664021055 0ustar /* * Copyright (C) 2007-2008, Hewlett-Packard Development Company, LLP * All rights reserved. * * 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. * * Neither the name of the Hewlett-Packard Corporation, nor the names * of its contributors may be used to endorse or promote products * derived from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * Author(s) * Raghavendra P.G. * Shuah Khan * Raghavendra M.S. * * This file has the interconnect blade related events handling * * process_interconnect_reset_event() - Process the interconeect * reset event * * process_interconnect_power_event() - Process the interconeect * power event * * process_interconnect_insertion_event() - Process the interconeect * insertion event * * process_interconnect_extraction_event() - Process the interconeect * extraction event * * process_interconnect_status_event() - Process the interconeect * status event * * process_interconnect_thermal_event() - Process the interconeect * thermal event * */ #include "oa_soap_interconnect_event.h" /** * process_interconnect_reset_event * @oh_handler: Pointer to openhpi handler structure * @oa_event: Pointer to OA event structure * * Purpose: * Creates the interconnect reset hpi hotswap event * * Detailed Description: NA * * Return values: * SA_OK - success. * SA_ERR_HPI_INVALID_PARAMS - on wrong parameters. * SA_ERR_HPI_INTERNAL_ERROR - on failure **/ SaErrorT process_interconnect_reset_event(struct oh_handler_state *oh_handler, struct eventInfo *oa_event) { struct oa_soap_hotswap_state *hotswap_state = NULL; struct oh_event event; SaHpiRptEntryT *rpt = NULL; SaHpiResourceIdT resource_id; struct oa_soap_handler *oa_handler = NULL; SaHpiInt32T bay_number; if (oh_handler == NULL || oa_event == NULL) { err("Invalid parameters"); return SA_ERR_HPI_INVALID_PARAMS; } update_hotswap_event(oh_handler, &event); oa_handler = (struct oa_soap_handler *) oh_handler->data; bay_number = oa_event->eventData.interconnectTrayStatus.bayNumber; resource_id = oa_handler-> oa_soap_resources.interconnect.resource_id[bay_number - 1]; /* Get the rpt entry of the resource */ rpt = oh_get_resource_by_id(oh_handler->rptcache, resource_id); if (rpt == NULL) { err("resource RPT is NULL"); return SA_ERR_HPI_INTERNAL_ERROR; } memcpy(&(event.resource), rpt, sizeof(SaHpiRptEntryT)); event.event.Source = event.resource.ResourceId; hotswap_state = (struct oa_soap_hotswap_state *) oh_get_resource_data(oh_handler->rptcache, event.resource.ResourceId); if (hotswap_state == NULL) { err("blade private info is NULL"); return SA_ERR_HPI_INTERNAL_ERROR; } hotswap_state->currentHsState = SAHPI_HS_STATE_ACTIVE; event.resource.ResourceSeverity = SAHPI_OK; /* On reset of interconnect, it has powered off and powered on * Raise 2 hoswap events for power off * ACTIVE -> EXTRACTION_PENDING and EXTRACTION_PENDING -> INACTIVE * Then, raise 2 hoswap events for power on * INACTIVE -> INSERTION_PENDING and INSERTION_PENDING -> ACTIVE */ event.rdrs = NULL; event.event.EventDataUnion.HotSwapEvent.PreviousHotSwapState = SAHPI_HS_STATE_ACTIVE; event.event.EventDataUnion.HotSwapEvent.HotSwapState = SAHPI_HS_STATE_EXTRACTION_PENDING; /* ACTIVE to EXTRACTION_PENDING state change happened due power off * event. The deactivation can not be stopped. */ event.event.EventDataUnion.HotSwapEvent.CauseOfStateChange = SAHPI_HS_CAUSE_UNEXPECTED_DEACTIVATION; oh_evt_queue_push(oh_handler->eventq, copy_oa_soap_event(&event)); event.rdrs = NULL; event.event.EventDataUnion.HotSwapEvent.PreviousHotSwapState = SAHPI_HS_STATE_EXTRACTION_PENDING; event.event.EventDataUnion.HotSwapEvent.HotSwapState = SAHPI_HS_STATE_INACTIVE; /* EXTRACTION_PENDING to INACTIVE state change happened due * to Auto policy of the server blade */ event.event.EventDataUnion.HotSwapEvent.CauseOfStateChange = SAHPI_HS_CAUSE_AUTO_POLICY; oh_evt_queue_push(oh_handler->eventq, copy_oa_soap_event(&event)); event.rdrs = NULL; event.event.EventDataUnion.HotSwapEvent.PreviousHotSwapState = SAHPI_HS_STATE_INACTIVE; event.event.EventDataUnion.HotSwapEvent.HotSwapState = SAHPI_HS_STATE_INSERTION_PENDING; /* The cause of the state change is unknown */ event.event.EventDataUnion.HotSwapEvent.CauseOfStateChange = SAHPI_HS_CAUSE_UNKNOWN; oh_evt_queue_push(oh_handler->eventq, copy_oa_soap_event(&event)); event.rdrs = NULL; event.event.EventDataUnion.HotSwapEvent.PreviousHotSwapState = SAHPI_HS_STATE_INSERTION_PENDING; event.event.EventDataUnion.HotSwapEvent.HotSwapState = SAHPI_HS_STATE_ACTIVE; /* INSERTION_PENDING to ACTIVE state change happened due * to auto policy of server blade */ event.event.EventDataUnion.HotSwapEvent.CauseOfStateChange = SAHPI_HS_CAUSE_AUTO_POLICY; oh_evt_queue_push(oh_handler->eventq, copy_oa_soap_event(&event)); return SA_OK; } /** * process_interconnect_power_event * @oh_handler: Pointer to openhpi handler structure * @oa_event: Pointer to OA event structure * * Purpose: * Creates the interconnect power hpi hotswap event * * Detailed Description: NA * * Return values: * SA_OK - success. * SA_ERR_HPI_INVALID_PARAMS - on wrong parameters. * SA_ERR_HPI_INTERNAL_ERROR - on failure **/ SaErrorT process_interconnect_power_event(struct oh_handler_state *oh_handler, struct eventInfo *oa_event) { struct oa_soap_hotswap_state *hotswap_state = NULL; SaErrorT rv = SA_OK; SaHpiRptEntryT *rpt = NULL; struct oh_event event; struct oa_soap_sensor_info *sensor_info=NULL; SaHpiRdrT *rdr = NULL; SaHpiIdrIdT sen_rdr_num = OA_SOAP_SEN_TEMP_STATUS; SaHpiResourceIdT resource_id; struct oa_soap_handler *oa_handler = NULL; SaHpiInt32T bay_number; if (oh_handler == NULL || oa_event == NULL) { err("Invalid parameters"); return SA_ERR_HPI_INVALID_PARAMS; } update_hotswap_event(oh_handler, &event); oa_handler = (struct oa_soap_handler *) oh_handler->data; bay_number = oa_event->eventData.interconnectTrayStatus.bayNumber; resource_id = oa_handler-> oa_soap_resources.interconnect.resource_id[bay_number - 1]; /* Get the rpt entry of the server */ rpt = oh_get_resource_by_id(oh_handler->rptcache, resource_id); if (rpt == NULL) { err("resource RPT is NULL"); return SA_ERR_HPI_INTERNAL_ERROR; } memcpy(&(event.resource), rpt, sizeof(SaHpiRptEntryT)); event.event.Source = event.resource.ResourceId; hotswap_state = (struct oa_soap_hotswap_state *) oh_get_resource_data(oh_handler->rptcache, event.resource.ResourceId); if (hotswap_state == NULL) { err("blade private info is NULL"); return SA_ERR_HPI_INTERNAL_ERROR; } switch (oa_event->eventData.interconnectTrayStatus.powered) { case (POWER_OFF): event.resource.ResourceSeverity = SAHPI_CRITICAL; /* Update the current hotswap state to INACTIVE */ hotswap_state->currentHsState = SAHPI_HS_STATE_INACTIVE; if (rv != SA_OK) { err("add rpt entry failed"); return rv; } /* Raise the power off hotswap event*/ event.rdrs = NULL; event.event.EventDataUnion.HotSwapEvent. PreviousHotSwapState = SAHPI_HS_STATE_ACTIVE; event.event.EventDataUnion.HotSwapEvent.HotSwapState = SAHPI_HS_STATE_EXTRACTION_PENDING; /* ACTIVE to EXTRACTION_PENDING state change happened * due power off event. The deactivation can not be * stopped. */ event.event.EventDataUnion.HotSwapEvent. CauseOfStateChange = SAHPI_HS_CAUSE_UNEXPECTED_DEACTIVATION; oh_evt_queue_push(oh_handler->eventq, copy_oa_soap_event(&event)); event.rdrs = NULL; event.event.EventDataUnion.HotSwapEvent. PreviousHotSwapState = SAHPI_HS_STATE_EXTRACTION_PENDING; event.event.EventDataUnion.HotSwapEvent.HotSwapState = SAHPI_HS_STATE_INACTIVE; /* EXTRACTION_PENDING to INACTIVE state change happens * due to auto policy of server blade */ event.event.EventDataUnion.HotSwapEvent. CauseOfStateChange = SAHPI_HS_CAUSE_AUTO_POLICY; oh_evt_queue_push(oh_handler->eventq, copy_oa_soap_event(&event)); break; case (POWER_ON): event.resource.ResourceSeverity = SAHPI_OK; /* Update the current hot swap state to ACTIVE */ hotswap_state->currentHsState = SAHPI_HS_STATE_ACTIVE; rdr = oh_get_rdr_by_type(oh_handler->rptcache, event.resource.ResourceId, SAHPI_SENSOR_RDR, sen_rdr_num); if (rdr == NULL) { err("RDR not present"); return SA_ERR_HPI_NOT_PRESENT; } /* Get the thermal sensor information of the server */ sensor_info = (struct oa_soap_sensor_info*) oh_get_rdr_data(oh_handler->rptcache, event.resource.ResourceId, rdr->RecordId); if (sensor_info == NULL) { err("No sensor data. Sensor=%s", rdr->IdString.Data); return SA_ERR_HPI_INTERNAL_ERROR; } /* Check for any thermal sensor state * and raise the deassert events */ rv = check_and_deassert_event(oh_handler, event.resource.ResourceId, rdr, sensor_info); if (rv != SA_OK) { err("Deassert of sensor events failed"); } /* Since the interconnect got powered off, there will * not be any active thermal events. Clear the thermal * sensor states */ sensor_info->current_state = SAHPI_ES_UNSPECIFIED; sensor_info->previous_state = SAHPI_ES_UNSPECIFIED; /* Raise the power on hotswap event*/ event.rdrs = NULL; event.event.EventDataUnion.HotSwapEvent. PreviousHotSwapState = SAHPI_HS_STATE_INACTIVE; event.event.EventDataUnion.HotSwapEvent.HotSwapState = SAHPI_HS_STATE_INSERTION_PENDING; /* The cause of the state change is unknown */ event.event.EventDataUnion.HotSwapEvent. CauseOfStateChange = SAHPI_HS_CAUSE_UNKNOWN; oh_evt_queue_push(oh_handler->eventq, copy_oa_soap_event(&event)); event.rdrs = NULL; event.event.EventDataUnion.HotSwapEvent. PreviousHotSwapState = SAHPI_HS_STATE_INSERTION_PENDING; event.event.EventDataUnion.HotSwapEvent.HotSwapState = SAHPI_HS_STATE_ACTIVE; /* INSERTION_PENDING to ACTIVE state change happened * to Auto policy of server blade */ event.event.EventDataUnion.HotSwapEvent. CauseOfStateChange = SAHPI_HS_CAUSE_AUTO_POLICY; oh_evt_queue_push(oh_handler->eventq, copy_oa_soap_event(&event)); break; default: err("Wrong power state %d", oa_event->eventData.bladeStatus.powered); return SA_ERR_HPI_INTERNAL_ERROR; } return SA_OK; } /** * process_interconnect_insertion_event * @oh_handler: Pointer to openhpi handler structure * @con: Pointer to the SOAP_CON structure * @oa_event: Pointer to OA event structure * * Purpose: * Creates the interconnect insertion hpi hotswap event * * Detailed Description: NA * * Return values: * SA_OK - success. * SA_ERR_HPI_INVALID_PARAMS - on wrong parameters. * SA_ERR_HPI_INTERNAL_ERROR - on failure **/ SaErrorT process_interconnect_insertion_event(struct oh_handler_state *oh_handler, SOAP_CON *con, struct eventInfo *oa_event) { SaErrorT rv = SA_OK; struct oa_soap_handler *oa_handler = NULL; struct getInterconnectTrayInfo info; struct interconnectTrayInfo response; struct oh_event event; SaHpiInt32T bay_number; SaHpiResourceIdT resource_id; GSList *asserted_sensors = NULL; SaHpiRptEntryT *rpt; if (oh_handler == NULL || oa_event == NULL || con == NULL) { err("Invalid parameters"); return SA_ERR_HPI_INVALID_PARAMS; } oa_handler = (struct oa_soap_handler *) oh_handler->data; bay_number = oa_event->eventData.interconnectTrayStatus.bayNumber; update_hotswap_event(oh_handler, &event); info.bayNumber = bay_number; rv = soap_getInterconnectTrayInfo(con, &info, &response); if (rv != SOAP_OK) { err("Get interconnect tray info failed"); return SA_ERR_HPI_INTERNAL_ERROR; } /* Build the inserted interconnect RPT entry */ rv = build_interconnect_rpt(oh_handler, con, response.name, bay_number, &resource_id, TRUE); if (rv != SA_OK) { err("Failed to build the interconnect RPT"); return rv; } /* Update resource_status structure with resource_id, * serial_number, and presence status */ oa_soap_update_resource_status( &oa_handler->oa_soap_resources.interconnect, bay_number, response.serialNumber, resource_id, RES_PRESENT); /* Build the inserted interconnect RDRs */ rv = build_interconnect_rdr(oh_handler, con, bay_number, resource_id); if (rv != SA_OK) { err("Failed to build the interconnect RDR"); rv = oh_remove_resource(oh_handler->rptcache, event.resource.ResourceId); /* reset resource_status structure to default values */ oa_soap_update_resource_status( &oa_handler->oa_soap_resources.interconnect, bay_number, "", SAHPI_UNSPECIFIED_RESOURCE_ID, RES_ABSENT); return rv; } rv = oa_soap_populate_event(oh_handler, resource_id, &event, &asserted_sensors); if (rv != SA_OK) { err("Creating hotswap event failed"); return rv; } event.event.EventType = SAHPI_ET_HOTSWAP; event.event.EventDataUnion.HotSwapEvent.PreviousHotSwapState = SAHPI_HS_STATE_NOT_PRESENT; event.event.EventDataUnion.HotSwapEvent.HotSwapState = SAHPI_HS_STATE_INSERTION_PENDING; /* NOT_PRESENT to INSERTION_PENDING state change happened due * to operator action */ event.event.EventDataUnion.HotSwapEvent.CauseOfStateChange = SAHPI_HS_CAUSE_OPERATOR_INIT; oh_evt_queue_push(oh_handler->eventq, copy_oa_soap_event(&event)); /* Raise the assert sensor events */ if (asserted_sensors) { rpt = oh_get_resource_by_id(oh_handler->rptcache, resource_id); oa_soap_assert_sen_evt(oh_handler, rpt, asserted_sensors); } return SA_OK; } /** * process_interconnect_extraction_event * @oh_handler: Pointer to openhpi handler structure * @oa_event: Pointer to OA event structure * * Purpose: * Creates the interconnect extraction hpi hotswap event * * Detailed Description: NA * * Return values: * SA_OK - success. * SA_ERR_HPI_INVALID_PARAMS - on wrong parameters. * SA_ERR_HPI_INTERNAL_ERROR - on failure **/ SaErrorT process_interconnect_extraction_event(struct oh_handler_state *oh_handler, struct eventInfo *oa_event) { SaErrorT rv = SA_OK; if (oh_handler == NULL || oa_event == NULL) { err("Invalid parameters"); return SA_ERR_HPI_INVALID_PARAMS; } rv = remove_interconnect(oh_handler, oa_event->eventData.interconnectTrayStatus.bayNumber); if (rv != SA_OK) { err("Encoding entity path failed"); return SA_ERR_HPI_INTERNAL_ERROR; } return SA_OK; } /** * process_interconnect_status_event * @oh_handler: Pointer to openhpi handler structure * @oa_event: Pointer to OA event structure * * Purpose: * Creates the interconnect insertion pending to active hpi hotswap event * Processes the interconnect status event and generates the sensor event * * Detailed Description: * - The interconnect takes nearly 3 seconds to power on * The interconnect status event which follows the insertion event * indicates the power on of interconnect * - Create the interconnect insertion pending to active hpi hotswap event * - Processes the interconnect status event and generates the sensor event * * Return values: * SA_OK - success. * SA_ERR_HPI_INVALID_PARAMS - on wrong parameters. * SA_ERR_HPI_INTERNAL_ERROR - on failure **/ void oa_soap_proc_interconnect_status(struct oh_handler_state *oh_handler, struct interconnectTrayStatus *status) { struct oa_soap_hotswap_state *hotswap_state; SaHpiRptEntryT *rpt = NULL; struct oh_event event; SaHpiResourceIdT resource_id; struct oa_soap_handler *oa_handler = NULL; enum oa_soap_extra_data_health health_status; SaErrorT rv; enum diagnosticStatus diag_ex_status[OA_SOAP_MAX_DIAG_EX]; if (oh_handler == NULL || status == NULL) { err("Invalid parameters"); return; } oa_handler = (struct oa_soap_handler *) oh_handler->data; resource_id = oa_handler->oa_soap_resources.interconnect. resource_id[status->bayNumber - 1]; /* Get the rpt entry of the server */ rpt = oh_get_resource_by_id(oh_handler->rptcache, resource_id); if (rpt == NULL) { err("resource RPT is NULL"); return; } hotswap_state = (struct oa_soap_hotswap_state *) oh_get_resource_data(oh_handler->rptcache, resource_id); if (hotswap_state == NULL) { err("Failed to get hotswap state of server blade"); return; } /* Check whether blade is in the insertion pending state and it is * powered on */ if (hotswap_state->currentHsState == SAHPI_HS_STATE_INSERTION_PENDING && status->powered == POWER_ON) { hotswap_state->currentHsState = SAHPI_HS_STATE_ACTIVE; update_hotswap_event(oh_handler, &event); memcpy(&(event.resource), rpt, sizeof(SaHpiRptEntryT)); event.event.Source = event.resource.ResourceId; event.event.EventDataUnion.HotSwapEvent.PreviousHotSwapState = SAHPI_HS_STATE_INSERTION_PENDING; event.event.EventDataUnion.HotSwapEvent.HotSwapState = SAHPI_HS_STATE_ACTIVE; /* INSERTION_PENDING to ACTIVE state change happened de * to Auto policy of server blade */ event.event.EventDataUnion.HotSwapEvent.CauseOfStateChange = SAHPI_HS_CAUSE_AUTO_POLICY; oh_evt_queue_push(oh_handler->eventq, copy_oa_soap_event(&event)); } /* Build operational status sensor rdr */ OA_SOAP_PROCESS_SENSOR_EVENT(OA_SOAP_SEN_OPER_STATUS, status->operationalStatus, 0, 0) /* Build predictive failure sensor rdr */ OA_SOAP_PROCESS_SENSOR_EVENT(OA_SOAP_SEN_PRED_FAIL, status->operationalStatus, 0, 0) /* Build interconnect CPU fault sensor rdr */ OA_SOAP_PROCESS_SENSOR_EVENT(OA_SOAP_SEN_CPU_FAULT, status->cpuFault, 0, 0) /* Build interconnect health LED sensor rdr */ OA_SOAP_PROCESS_SENSOR_EVENT(OA_SOAP_SEN_HEALTH_LED, status->healthLed, 0, 0) /* Build internal data error sensor rdr */ OA_SOAP_PROCESS_SENSOR_EVENT(OA_SOAP_SEN_INT_DATA_ERR, status->diagnosticChecks.internalDataError, 0, 0) /* Build management processor error sensor rdr */ OA_SOAP_PROCESS_SENSOR_EVENT(OA_SOAP_SEN_MP_ERR, status->diagnosticChecks. managementProcessorError, 0, 0) /* Build thermal waring sensor rdr */ OA_SOAP_PROCESS_SENSOR_EVENT(OA_SOAP_SEN_THERM_WARN, status->diagnosticChecks.thermalWarning, 0, 0) /* Build thermal danger sensor rdr */ OA_SOAP_PROCESS_SENSOR_EVENT(OA_SOAP_SEN_THERM_DANGER, status->diagnosticChecks.thermalDanger, 0, 0) /* Build IO configuration error sensor rdr */ OA_SOAP_PROCESS_SENSOR_EVENT(OA_SOAP_SEN_IO_CONFIG_ERR, status->diagnosticChecks. ioConfigurationError, 0, 0) /* Build device power request error sensor rdr */ OA_SOAP_PROCESS_SENSOR_EVENT(OA_SOAP_SEN_DEV_PWR_REQ, status->diagnosticChecks. devicePowerRequestError, 0, 0) /* Build device failure error sensor rdr */ OA_SOAP_PROCESS_SENSOR_EVENT(OA_SOAP_SEN_DEV_FAIL, status->diagnosticChecks.deviceFailure, 0, 0) /* Build device degraded error sensor rdr */ OA_SOAP_PROCESS_SENSOR_EVENT(OA_SOAP_SEN_DEV_DEGRAD, status->diagnosticChecks.deviceDegraded, 0, 0) oa_soap_parse_diag_ex(status->diagnosticChecksEx, diag_ex_status); /* Process device not supported sensor rdr */ OA_SOAP_PROCESS_SENSOR_EVENT(OA_SOAP_SEN_DEV_NOT_SUPPORT, diag_ex_status[DIAG_EX_DEV_NOT_SUPPORT], 0, 0) /* Process Device informational sensor */ OA_SOAP_PROCESS_SENSOR_EVENT(OA_SOAP_SEN_DEV_INFO, diag_ex_status[DIAG_EX_DEV_INFO], 0, 0) /* Process Storage device missing sensor */ OA_SOAP_PROCESS_SENSOR_EVENT(OA_SOAP_SEN_STORAGE_DEV_MISS, diag_ex_status[DIAG_EX_STORAGE_DEV_MISS], 0, 0) /* Process Duplicate management IP address sensor */ OA_SOAP_PROCESS_SENSOR_EVENT(OA_SOAP_SEN_DUP_MGMT_IP_ADDR, diag_ex_status[DIAG_EX_DUP_MGMT_IP_ADDR], 0, 0) /* Get the healthStatus enum from extraData structure */ oa_soap_get_health_val(status->extraData, &health_status); /* Build health status operational sensor */ OA_SOAP_PROCESS_SENSOR_EVENT(OA_SOAP_SEN_HEALTH_OPER, health_status, 0, 0) /* Build health status predictive failure sensor */ OA_SOAP_PROCESS_SENSOR_EVENT(OA_SOAP_SEN_HEALTH_PRED_FAIL, health_status, 0, 0) return; } /** * process_interconnect_thermal_event * @oh_handler: Pointer to openhpi handler structure * @oa_event: Pointer to the OA event structure * * Purpose: * Processes and creates interconnect sensor thermal events * * Detailed Description: NA * * Return values: * SA_OK - success. * SA_ERR_HPI_INVALID_PARAMS - on wrong parameters. * SA_ERR_HPI_INTERNAL_ERROR - on failure **/ void oa_soap_proc_interconnect_thermal(struct oh_handler_state *oh_handler, SOAP_CON *con, struct interconnectTrayStatus *response) { SaErrorT rv = SA_OK; SaHpiResourceIdT resource_id; struct oa_soap_handler *oa_handler = NULL; SaHpiInt32T bay_number; SaHpiFloat64T trigger_reading; SaHpiFloat64T trigger_threshold; struct getThermalInfo thermal_request; struct thermalInfo thermal_response; struct oa_soap_sensor_info *sensor_info; SaHpiRdrT *rdr; if (oh_handler == NULL || con== NULL || response == NULL) { err("Invalid parameters"); return; } oa_handler = (struct oa_soap_handler *) oh_handler->data; bay_number = response->bayNumber; resource_id = oa_handler-> oa_soap_resources.interconnect.resource_id[bay_number - 1]; rdr = oh_get_rdr_by_type(oh_handler->rptcache, resource_id, SAHPI_SENSOR_RDR, OA_SOAP_SEN_TEMP_STATUS); sensor_info = (struct oa_soap_sensor_info *) oh_get_rdr_data(oh_handler->rptcache, resource_id, rdr->RecordId); /* The payload of the thermal event received from OA contains * sensor status. Based on the sensor status, * determine the threshold which triggered the thermal event from OA. * Event with SENSOR_STATUS_CAUTION or SENSOR_STATUS_OK is * generated only if CAUTION threshold is crossed. * Event with SENSOR_STATUS_CRITICAL is generated only when CRITICAL * threshold is crossed. * Sensor current reading and trigger threshold are required for event * generation. Sensor current reading is not provided by the event, * hence make soap call to get the reading */ thermal_request.bayNumber = bay_number; thermal_request.sensorType = SENSOR_TYPE_INTERCONNECT; rv = soap_getThermalInfo(con, &thermal_request, &thermal_response); if (rv != SOAP_OK) { err("soap_getThermalInfo soap call returns error"); return; } trigger_reading = (SaHpiInt32T)thermal_response.temperatureC; if ((response->thermal == SENSOR_STATUS_CAUTION && sensor_info->current_state != SAHPI_ES_UPPER_MAJOR) || (response->thermal == SENSOR_STATUS_OK && sensor_info->current_state != SAHPI_ES_UNSPECIFIED)) { /* Trigger for this event is caution threshold */ trigger_threshold = thermal_response.cautionThreshold; } else if (response->thermal == SENSOR_STATUS_CRITICAL && sensor_info->current_state != SAHPI_ES_UPPER_CRIT) { /* Trigger for this event is critical threshold */ trigger_threshold = thermal_response.criticalThreshold; } else { dbg("Ignore the event. There is no change in the sensor state"); return; } /* Process the thermal event from OA and generate appropriate HPI event */ OA_SOAP_PROCESS_SENSOR_EVENT(OA_SOAP_SEN_TEMP_STATUS, response->thermal, trigger_reading,trigger_threshold) return; } openhpi-2.14.1/plugins/oa_soap/oa_soap_resources.c0000644000076400007640000066243311302566663017200 0ustar /* * Copyright (C) 2008, Hewlett-Packard Development Company, LLP * All rights reserved. * * 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. * * Neither the name of the Hewlett-Packard Corporation, nor the names * of its contributors may be used to endorse or promote products * derived from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * Author(s) * Raghavendra P.G. * Raghavendra M.S. * **/ #include "oa_soap_resources.h" /* Array for mapping the OA enums to HPI values. -1 is assigned if the OA is not * supporting the enum value. * * Please modify the array on adding new sensor class and/or changing the * sensor enum values defined in oa_soap_resources.h */ const SaHpiInt32T oa_soap_sen_val_map_arr[OA_SOAP_MAX_SEN_CLASS] [OA_SOAP_MAX_ENUM] = { /* OA_SOAP_OPER_CLASS. This uses the enum opStatus values as index */ { SAHPI_ES_DISABLED, /* OP_STATUS_UNKNOWN */ SAHPI_ES_DISABLED, /* OP_STATUS_OTHER */ SAHPI_ES_ENABLED, /* OP_STATUS_OK */ SAHPI_ES_ENABLED, /* OP_STATUS_DEGRADED */ -1, /* OP_STATUS_STRESSED - not supported by OA */ -1, /* OP_STATUS_PREDICTIVE_FAILURE - not supported by OA */ -1, /* OP_STATUS_ERROR - not supported by OA */ SAHPI_ES_DISABLED, /* OP_STATUS_NON_RECOVERABLE_ERROR */ -1, /* OP_STATUS_STARTING - not supported by OA */ -1, /* OP_STATUS_STOPPING - not supported by OA */ -1, /* OP_STATUS_STOPPED - not supported by OA */ -1, /* OP_STATUS_IN_SERVICE - not supported by OA */ -1, /* OP_STATUS_NO_CONTACT - not supported by OA */ -1, /* OP_STATUS_LOST_COMMUNICATION - not supported by OA */ -1, /* OP_STATUS_ABORTED - not supported by OA */ -1, /* OP_STATUS_DORMANT - not supported by OA */ -1, /* OP_STATUS_SUPPORTING_ENTITY_IN_ERROR - not supported * by OA */ -1, /* OP_STATUS_COMPLETED - not supported by OA */ -1, /* OP_STATUS_POWER_MODE - not supported by OA */ -1, /* OP_STATUS_DMTF_RESERVED - not supported by OA */ -1, /* OP_STATUS_VENDER_RESERVED - not supported by OA */ }, /* OA_SOAP_PRED_FAIL_CLASS. This uses the enum opStatus values * as index */ { SAHPI_ES_PRED_FAILURE_ASSERT, /* OP_STATUS_UNKNOWN */ SAHPI_ES_PRED_FAILURE_ASSERT, /* OP_STATUS_OTHER */ SAHPI_ES_PRED_FAILURE_DEASSERT, /* OP_STATUS_OK */ SAHPI_ES_PRED_FAILURE_ASSERT, /* OP_STATUS_DEGRADED */ -1, /* OP_STATUS_STRESSED - not supported by OA */ -1, /* OP_STATUS_PREDICTIVE_FAILURE - not supported by OA */ -1, /* OP_STATUS_ERROR - not supported by OA */ SAHPI_ES_PRED_FAILURE_ASSERT, /* OP_STATUS_NON_RECOVERABLE_ERROR */ -1, /* OP_STATUS_STARTING - not supported by OA */ -1, /* OP_STATUS_STOPPING - not supported by OA */ -1, /* OP_STATUS_STOPPED - not supported by OA */ -1, /* OP_STATUS_IN_SERVICE - not supported by OA */ -1, /* OP_STATUS_NO_CONTACT - not supported by OA */ -1, /* OP_STATUS_LOST_COMMUNICATION - not supported by OA */ -1, /* OP_STATUS_ABORTED - not supported by OA */ -1, /* OP_STATUS_DORMANT - not supported by OA */ -1, /* OP_STATUS_SUPPORTING_ENTITY_IN_ERROR - not supported * by OA */ -1, /* OP_STATUS_COMPLETED - not supported by OA */ -1, /* OP_STATUS_POWER_MODE - not supported by OA */ -1, /* OP_STATUS_DMTF_RESERVED - not supported by OA */ -1, /* OP_STATUS_VENDER_RESERVED - not supported by OA */ }, /* OA_SOAP_REDUND_CLASS. This uses the enum redundancy values * as index */ { -1, /* REDUNDANCY_NO_OP - This state is returned if the * device is not present. Ideally, this should never * get executed. */ SAHPI_ES_REDUNDANCY_LOST, /* REDUNDANCY_UNKNOWN */ SAHPI_ES_REDUNDANCY_LOST, /* NOT_REDUNDANT */ SAHPI_ES_FULLY_REDUNDANT, /* REDUNDANT */ /* dummy value to fill up array */ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, }, /* OA_SOAP_DIAG_CLASS. This uses the enum diagnosticStatus * values as index */ { -1, /* NOT_RELEVANT - this means that sensor is not * supported. Ideally, this will never be returned. * Not supported sensors will not be modelled for * the resources in OA SOAP plugin */ SAHPI_ES_ENABLED, /* DIAGNOSTIC_CHECK_NOT_PERFORMED */ SAHPI_ES_ENABLED, /* NO_ERROR */ SAHPI_ES_DISABLED, /* ERROR */ /* dummy value to fill up array */ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, }, /* OA_SOAP_TEMP_CLASS sensor class. set the array contents to -1, * as thermal class sensors do not utilize this mapping entry */ { -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, }, /* OA_SOAP_PWR_STATUS_CLASS sensor class. set the array contents to * -1, as power status class sensors do not utilize this mapping entry */ { -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, }, /* OA_SOAP_FAN_SPEED_CLASS sensor class. set the array contents to * -1, as fan speed class sensors do not utilize this mapping entry */ { -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, }, /* OA_SOAP_PWR_SUBSYS_CLASS sensor class. set the array contents to * -1, as power subsystem class sensors do not utilize this mapping * entry */ { -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, }, /* OA_SOAP_ENC_AGR_OPER_CLASS sensor class. This uses the enum * lcdSetupHealth values as index */ { SAHPI_ES_DISABLED, /* LCD_SETUP_HEALTH_UNKNOWN */ SAHPI_ES_ENABLED, /* LCD_SETUP_HEALTH_OK */ SAHPI_ES_ENABLED, /* LCD_SETUP_HEALTH_INFORMATIONAL */ SAHPI_ES_ENABLED, /* LCD_SETUP_HEALTH_DEGRADED */ SAHPI_ES_DISABLED, /* LCD_SETUP_HEALTH_FAILED */ /* dummy value to fill up array */ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, }, /* OA_SOAP_ENC_AGR_PRED_FAIL_CLASS sensor class. This uses the enum * lcdSetupHealth values as index */ { SAHPI_ES_DISABLED, /* LCD_SETUP_HEALTH_UNKNOWN */ SAHPI_ES_ENABLED, /* LCD_SETUP_HEALTH_OK */ SAHPI_ES_DISABLED, /* LCD_SETUP_HEALTH_INFORMATIONAL */ SAHPI_ES_DISABLED, /* LCD_SETUP_HEALTH_DEGRADED */ SAHPI_ES_DISABLED, /* LCD_SETUP_HEALTH_FAILED */ /* dummy value to fill up array */ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, }, /* OA_SOAP_BOOL_CLASS sensor class. This uses the enum * hpoa_boolean values as index. This class is used for OA link status. * The sensor value 'true' means sensor state is enabled. */ { SAHPI_ES_DISABLED, /* false */ SAHPI_ES_ENABLED, /* true */ /* dummy value to fill up array */ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, }, /* OA_SOAP_BOOL_RVRS_CLASS sensor class. This uses the enum * hpoa_boolean values as index. This class is used for interconnect CPU * fault and health LED. Then sensor value 'false' means sensor state * is enabled. */ { SAHPI_ES_ENABLED, /* false */ SAHPI_ES_DISABLED, /* true */ /* dummy value to fill up array */ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, }, /* OA_SOAP_HEALTH_OPER_CLASS sensor class. This uses the enum * oa_soap_extra_data_health values as index */ { SAHPI_ES_DISABLED, /* HEALTH_UNKNOWN */ SAHPI_ES_DISABLED, /* HEALTH_OTHER */ SAHPI_ES_ENABLED, /* HEALTH_OK */ SAHPI_ES_ENABLED, /* HEALTH_DEGRAD */ SAHPI_ES_ENABLED, /* HEALTH_STRESSED */ SAHPI_ES_ENABLED, /* HEALTH_PRED_FAIL */ SAHPI_ES_DISABLED, /* HEALTH_ERROR */ SAHPI_ES_DISABLED, /* HEALTH_NRE */ /* dummy value to fill up array */ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, }, /* OA_SOAP_HEALTH_PRED_FAIL_CLASS sensor class. This uses the * enum oa_soap_extra_data_health values as index */ { SAHPI_ES_DISABLED, /* HEALTH_UNKNOWN */ SAHPI_ES_DISABLED, /* HEALTH_OTHER */ SAHPI_ES_ENABLED, /* HEALTH_OK */ SAHPI_ES_DISABLED, /* HEALTH_DEGRAD */ SAHPI_ES_DISABLED, /* HEALTH_STRESSED */ SAHPI_ES_DISABLED, /* HEALTH_PRED_FAIL */ SAHPI_ES_DISABLED, /* HEALTH_ERROR */ SAHPI_ES_DISABLED, /* HEALTH_NRE */ /* dummy value to fill up array */ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, }, }; /* Array for mapping the OA enums to OA SOAP plugin sensor assert states. * -1 is assigned, if the OA is not supporting the enum value. * * Please modify the array on adding new sensor class and/or changing the * sensor enum values defined in oa_soap_resources.h */ const SaHpiInt32T oa_soap_sen_assert_map_arr[OA_SOAP_MAX_SEN_CLASS] [OA_SOAP_MAX_ENUM] = { /* OA_SOAP_OPER_CLASS. This uses the enum opStatus values * as index */ { /* uses the enum opStatus values as index */ OA_SOAP_SEN_ASSERT_TRUE, /* OP_STATUS_UNKNOWN */ OA_SOAP_SEN_ASSERT_TRUE, /* OP_STATUS_OTHER */ OA_SOAP_SEN_ASSERT_FALSE, /* OP_STATUS_OK */ OA_SOAP_SEN_ASSERT_FALSE, /* OP_STATUS_DEGRADED */ -1, /* OP_STATUS_STRESSED - not supported by OA */ -1, /* OP_STATUS_PREDICTIVE_FAILURE - not supported by OA */ -1, /* OP_STATUS_ERROR - not supported by OA */ OA_SOAP_SEN_ASSERT_TRUE, /* OP_STATUS_NON_RECOVERABLE_ERROR */ -1, /* OP_STATUS_STARTING - not supported by OA */ -1, /* OP_STATUS_STOPPING - not supported by OA */ -1, /* OP_STATUS_STOPPED - not supported by OA */ -1, /* OP_STATUS_IN_SERVICE - not supported by OA */ -1, /* OP_STATUS_NO_CONTACT - not supported by OA */ -1, /* OP_STATUS_LOST_COMMUNICATION - not supported by OA */ -1, /* OP_STATUS_ABORTED - not supported by OA */ -1, /* OP_STATUS_DORMANT - not supported by OA */ -1, /* OP_STATUS_SUPPORTING_ENTITY_IN_ERROR - not supported * by OA */ -1, /* OP_STATUS_COMPLETED - not supported by OA */ -1, /* OP_STATUS_POWER_MODE - not supported by OA */ -1, /* OP_STATUS_DMTF_RESERVED - not supported by OA */ -1, /* OP_STATUS_VENDER_RESERVED - not supported by OA */ }, /* OA_SOAP_PRED_FAIL_CLASS. This uses the enum opStatus values * as index */ { /* uses the enum opStatus values as index */ OA_SOAP_SEN_ASSERT_TRUE, /* OP_STATUS_UNKNOWN */ OA_SOAP_SEN_ASSERT_TRUE, /* OP_STATUS_OTHER */ OA_SOAP_SEN_ASSERT_FALSE, /* OP_STATUS_OK */ OA_SOAP_SEN_ASSERT_TRUE, /* OP_STATUS_DEGRADED */ -1, /* OP_STATUS_STRESSED - not supported by OA */ -1, /* OP_STATUS_PREDICTIVE_FAILURE - not supported * by OA */ -1, /* OP_STATUS_ERROR - not supported by OA */ OA_SOAP_SEN_ASSERT_TRUE, /* OP_STATUS_NON_RECOVERABLE_ERROR */ -1, /* OP_STATUS_STARTING - not supported by OA */ -1, /* OP_STATUS_STOPPING - not supported by OA */ -1, /* OP_STATUS_STOPPED - not supported by OA */ -1, /* OP_STATUS_IN_SERVICE - not supported by OA */ -1, /* OP_STATUS_NO_CONTACT - not supported by OA */ -1, /* OP_STATUS_LOST_COMMUNICATION - not supported * by OA */ -1, /* OP_STATUS_ABORTED - not supported by OA */ -1, /* OP_STATUS_DORMANT - not supported by OA */ -1, /* OP_STATUS_SUPPORTING_ENTITY_IN_ERROR - not * supported by OA */ -1, /* OP_STATUS_COMPLETED - not supported by OA */ -1, /* OP_STATUS_POWER_MODE - not supported by OA */ -1, /* OP_STATUS_DMTF_RESERVED - not supported by OA */ -1, /* OP_STATUS_VENDER_RESERVED - not supported * by OA */ }, /* OA_SOAP_REDUND_CLASS. This uses the enum redundancy values * as index */ { /* uses the enum opStatus values as index */ -1, /* REDUNDANCY_NO_OP - This state is returned if the * device is not present. Ideally, this should never * get executed. */ OA_SOAP_SEN_ASSERT_TRUE, /* REDUNDANCY_UNKNOWN */ OA_SOAP_SEN_ASSERT_TRUE, /* NOT_REDUNDANT */ OA_SOAP_SEN_ASSERT_FALSE, /* REDUNDANT */ /* dummy value to fill up array */ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, }, /* OA_SOAP_DIAG_CLASS. This uses the enum diagnosticStatus * values as index */ { /* uses the enum opStatus values as index */ -1, /* NOT_RELEVANT - this means that sensor is not * supported. Ideally, this will never be returned. * Not supported sensors will not be modelled for * the resources in OA SOAP plugin */ OA_SOAP_SEN_ASSERT_FALSE, /* DIAGNOSTIC_CHECK_NOT_PERFORMED */ OA_SOAP_SEN_ASSERT_FALSE, /* NO_ERROR */ OA_SOAP_SEN_ASSERT_TRUE, /* ERROR */ /* dummy value to fill up array */ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, }, /* OA_SOAP_TEMP_CLASS sensor class. set the array contents to -1, * as thermal class sensors do not utilize this mapping entry */ { -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, }, /* OA_SOAP_PWR_STATUS_CLASS sensor class. set the array contents to * -1, as power status class sensors do not utilize this mapping entry */ { -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, }, /* OA_SOAP_FAN_SPEED_CLASS sensor class. set the array contents to * -1, as fan speed class sensors do not utilize this mapping entry */ { -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, }, /* OA_SOAP_PWR_SUBSYS_CLASS sensor class. set the array contents to * -1, as power subsystem class sensors do not utilize this mapping * entry */ { -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, }, /* OA_SOAP_ENC_AGR_OPER_CLASS sensor class. This uses the enum * lcdSetupHealth values as index */ { OA_SOAP_SEN_ASSERT_TRUE, /* LCD_SETUP_HEALTH_UNKNOWN */ OA_SOAP_SEN_ASSERT_FALSE, /* LCD_SETUP_HEALTH_OK */ OA_SOAP_SEN_ASSERT_FALSE, /* LCD_SETUP_HEALTH_INFORMATIONAL */ OA_SOAP_SEN_ASSERT_FALSE, /* LCD_SETUP_HEALTH_DEGRADED */ OA_SOAP_SEN_ASSERT_TRUE, /* LCD_SETUP_HEALTH_FAILED */ /* dummy value to fill up array */ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, }, /* OA_SOAP_ENC_AGR_PRED_FAIL_CLASS sensor class. This uses the enum * lcdSetupHealth values as index */ { OA_SOAP_SEN_ASSERT_TRUE, /* LCD_SETUP_HEALTH_UNKNOWN */ OA_SOAP_SEN_ASSERT_FALSE, /* LCD_SETUP_HEALTH_OK */ OA_SOAP_SEN_ASSERT_TRUE, /* LCD_SETUP_HEALTH_INFORMATIONAL */ OA_SOAP_SEN_ASSERT_TRUE, /* LCD_SETUP_HEALTH_DEGRADED */ OA_SOAP_SEN_ASSERT_TRUE, /* LCD_SETUP_HEALTH_FAILED */ /* dummy value to fill up array */ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, }, /* OA_SOAP_BOOL_CLASS sensor class. This uses the enum * hpoa_boolean values as index. This class is used for OA link status. * The sensor values 'false' means sensor state is asserted. */ { OA_SOAP_SEN_ASSERT_TRUE, /* false */ OA_SOAP_SEN_ASSERT_FALSE, /* true */ /* dummy value to fill up array */ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, }, /* OA_SOAP_BOOL_RVRS_CLASS sensor class. This uses the enum * hpoa_boolean values as index. This class is used for interconnect CPU * fault and health LED. The sensor value 'true' means sensor state * is asserted */ { OA_SOAP_SEN_ASSERT_FALSE, /* false */ OA_SOAP_SEN_ASSERT_TRUE, /* true */ /* dummy value to fill up array */ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, }, /* OA_SOAP_HEALTH_OPER_CLASS sensor class. This uses the enum * oa_soap_extra_data_health values as index */ { OA_SOAP_SEN_ASSERT_TRUE, /* HEALTH_UNKNOWN */ OA_SOAP_SEN_ASSERT_TRUE, /* HEALTH_OTHER */ OA_SOAP_SEN_ASSERT_FALSE, /* HEALTH_OK */ OA_SOAP_SEN_ASSERT_FALSE, /* HEALTH_DEGRAD */ OA_SOAP_SEN_ASSERT_FALSE, /* HEALTH_STRESSED */ OA_SOAP_SEN_ASSERT_FALSE, /* HEALTH_PRED_FAIL */ OA_SOAP_SEN_ASSERT_TRUE, /* HEALTH_ERROR */ OA_SOAP_SEN_ASSERT_TRUE, /* HEALTH_NRE */ /* dummy value to fill up array */ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, }, /* OA_SOAP_HEALTH_PRED_FAIL_CLASS sensor class. This uses the * enum oa_soap_extra_data_health values as index */ { OA_SOAP_SEN_ASSERT_TRUE, /* HEALTH_UNKNOWN */ OA_SOAP_SEN_ASSERT_TRUE, /* HEALTH_OTHER */ OA_SOAP_SEN_ASSERT_FALSE, /* HEALTH_OK */ OA_SOAP_SEN_ASSERT_TRUE, /* HEALTH_DEGRAD */ OA_SOAP_SEN_ASSERT_TRUE, /* HEALTH_STRESSED */ OA_SOAP_SEN_ASSERT_TRUE, /* HEALTH_PRED_FAIL */ OA_SOAP_SEN_ASSERT_TRUE, /* HEALTH_ERROR */ OA_SOAP_SEN_ASSERT_TRUE, /* HEALTH_NRE */ /* dummy value to fill up array */ -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, }, }; /* Array for creating the sensor RDRs * * Please add new entries to the array on adding a new sensor */ const struct oa_soap_sensor oa_soap_sen_arr[] = { /* operational status sensor */ { .sensor = { .Num = OA_SOAP_SEN_OPER_STATUS, .Type = SAHPI_OPERATIONAL, .Category = SAHPI_EC_ENABLE, .EnableCtrl = SAHPI_TRUE, .EventCtrl = SAHPI_SEC_PER_EVENT, .Events = SAHPI_ES_ENABLED | SAHPI_ES_DISABLED, .DataFormat = { .IsSupported = SAHPI_FALSE, }, .ThresholdDefn = { .IsAccessible = SAHPI_FALSE, }, .Oem = 0, }, .sensor_info = { .current_state = SAHPI_ES_ENABLED, .sensor_enable = SAHPI_TRUE, .event_enable = SAHPI_TRUE, .assert_mask = SAHPI_ES_DISABLED, .deassert_mask = SAHPI_ES_ENABLED, }, .sensor_class = OA_SOAP_OPER_CLASS, .sen_evt = { /* Assert event */ { .EventType = SAHPI_ET_SENSOR, .Severity = SAHPI_CRITICAL, .EventDataUnion.SensorEvent = { .SensorNum = OA_SOAP_SEN_OPER_STATUS, .SensorType = SAHPI_OPERATIONAL, .EventCategory = SAHPI_EC_ENABLE, .Assertion = SAHPI_TRUE, .EventState = SAHPI_ES_DISABLED, .OptionalDataPresent = SAHPI_SOD_CURRENT_STATE | SAHPI_SOD_PREVIOUS_STATE, .TriggerReading = { .IsSupported = SAHPI_FALSE, }, .TriggerThreshold = { .IsSupported = SAHPI_FALSE, }, .PreviousState = SAHPI_ES_ENABLED, .CurrentState = SAHPI_ES_DISABLED, .Oem = 0, .SensorSpecific = 0, }, }, /* Deassert event */ { .EventType = SAHPI_ET_SENSOR, .Severity = SAHPI_CRITICAL, .EventDataUnion.SensorEvent = { .SensorNum = OA_SOAP_SEN_OPER_STATUS, .SensorType = SAHPI_OPERATIONAL, .EventCategory = SAHPI_EC_ENABLE, .Assertion = SAHPI_FALSE, .EventState = SAHPI_ES_ENABLED, .OptionalDataPresent = SAHPI_SOD_CURRENT_STATE | SAHPI_SOD_PREVIOUS_STATE, .TriggerReading = { .IsSupported = SAHPI_FALSE, }, .TriggerThreshold = { .IsSupported = SAHPI_FALSE, }, .PreviousState = SAHPI_ES_DISABLED, .CurrentState = SAHPI_ES_ENABLED, .Oem = 0, .SensorSpecific = 0, }, }, {}, {}, }, .comment = "Operational status", }, /* predictive failure status sensor */ { .sensor = { .Num = OA_SOAP_SEN_PRED_FAIL, .Type = SAHPI_OPERATIONAL, .Category = SAHPI_EC_PRED_FAIL, .EnableCtrl = SAHPI_TRUE, .EventCtrl = SAHPI_SEC_PER_EVENT, .Events = SAHPI_ES_PRED_FAILURE_DEASSERT | SAHPI_ES_PRED_FAILURE_ASSERT, .DataFormat = { .IsSupported = SAHPI_FALSE, }, .ThresholdDefn = { .IsAccessible = SAHPI_FALSE, }, .Oem = 0, }, .sensor_info = { .current_state = SAHPI_ES_PRED_FAILURE_DEASSERT, .sensor_enable = SAHPI_TRUE, .event_enable = SAHPI_TRUE, .assert_mask = SAHPI_ES_PRED_FAILURE_ASSERT, .deassert_mask = SAHPI_ES_PRED_FAILURE_DEASSERT, }, .sensor_class = OA_SOAP_PRED_FAIL_CLASS, .sen_evt = { /* Assert event */ { .EventType = SAHPI_ET_SENSOR, .Severity = SAHPI_MAJOR, .EventDataUnion.SensorEvent = { .SensorNum = OA_SOAP_SEN_PRED_FAIL, .SensorType = SAHPI_OPERATIONAL, .EventCategory = SAHPI_EC_PRED_FAIL, .Assertion = SAHPI_TRUE, .EventState = SAHPI_ES_PRED_FAILURE_ASSERT, .OptionalDataPresent = SAHPI_SOD_CURRENT_STATE | SAHPI_SOD_PREVIOUS_STATE, .TriggerReading = { .IsSupported = SAHPI_FALSE, }, .TriggerThreshold = { .IsSupported = SAHPI_FALSE, }, .PreviousState = SAHPI_ES_PRED_FAILURE_DEASSERT, .CurrentState = SAHPI_ES_PRED_FAILURE_ASSERT, .Oem = 0, .SensorSpecific = 0, }, }, /* Deassert event */ { .EventType = SAHPI_ET_SENSOR, .Severity = SAHPI_MAJOR, .EventDataUnion.SensorEvent = { .SensorNum = OA_SOAP_SEN_PRED_FAIL, .SensorType = SAHPI_OPERATIONAL, .EventCategory = SAHPI_EC_PRED_FAIL, .Assertion = SAHPI_FALSE, .EventState = SAHPI_ES_PRED_FAILURE_DEASSERT, .OptionalDataPresent = SAHPI_SOD_CURRENT_STATE | SAHPI_SOD_PREVIOUS_STATE, .TriggerReading = { .IsSupported = SAHPI_FALSE, }, .TriggerThreshold = { .IsSupported = SAHPI_FALSE, }, .PreviousState = SAHPI_ES_PRED_FAILURE_ASSERT, .CurrentState = SAHPI_ES_PRED_FAILURE_DEASSERT, .Oem = 0, .SensorSpecific = 0, }, }, {}, {}, }, .comment = "Predictive failure", }, /* Thermal status sensor */ { .sensor = { .Num = OA_SOAP_SEN_TEMP_STATUS, .Type = SAHPI_TEMPERATURE, .Category = SAHPI_EC_THRESHOLD, .EnableCtrl = SAHPI_TRUE, .EventCtrl = SAHPI_SEC_READ_ONLY, .Events = SAHPI_ES_UNSPECIFIED, .DataFormat = { .IsSupported = SAHPI_TRUE, .ReadingType = SAHPI_SENSOR_READING_TYPE_FLOAT64, .BaseUnits = SAHPI_SU_DEGREES_C, .ModifierUnits = SAHPI_SU_UNSPECIFIED, .ModifierUse = SAHPI_SMUU_NONE, .Percentage = SAHPI_FALSE, .Range.Flags = SAHPI_SRF_MAX | SAHPI_SRF_NORMAL_MAX, .Range.Max.IsSupported = SAHPI_TRUE, .Range.Max.Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, /* This default Max value should be replaced * with Max value retrieved from OA */ .Range.Max.Value.SensorFloat64 = 43, .Range.NormalMax.IsSupported = SAHPI_TRUE, .Range.NormalMax.Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, /* This default Normal Max value should be * replaced with Normal Max value retrieved * from OA */ .Range.NormalMax.Value.SensorFloat64 = 38, .AccuracyFactor = 0, }, .ThresholdDefn = { .IsAccessible = SAHPI_TRUE, .ReadThold = SAHPI_ES_UPPER_CRIT | SAHPI_ES_UPPER_MAJOR, .WriteThold = 0x0, }, .Oem = 0, }, .sensor_info = { .current_state = SAHPI_ES_UNSPECIFIED, .sensor_enable = SAHPI_TRUE, /* For the resource supporting events, * update the event enable to TRUE and * set the masks accordingly to the support provided by * the resource. Default values below highlight * no-event support */ .event_enable = SAHPI_FALSE, .assert_mask = OA_SOAP_STM_UNSPECIFED, .deassert_mask = OA_SOAP_STM_UNSPECIFED, .sensor_reading = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, /* Update the value with current reading */ .Value.SensorFloat64 = 0x0, }, .threshold = { .UpCritical.IsSupported = SAHPI_TRUE, .UpCritical.Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, /* Update the value with critical threshold * reading */ .UpCritical.Value.SensorFloat64 = 43, .UpMajor.IsSupported = SAHPI_TRUE, .UpMajor.Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, /* Update the value with major threshold * reading */ .UpMajor.Value.SensorFloat64 = 38, }, }, .sensor_class = OA_SOAP_TEMP_CLASS, .sen_evt = { /* Assert an event for crossing CAUTION threshold * from OK condition */ { .EventType = SAHPI_ET_SENSOR, .Severity = SAHPI_MAJOR, .EventDataUnion.SensorEvent = { .SensorNum = OA_SOAP_SEN_TEMP_STATUS, .SensorType = SAHPI_TEMPERATURE, .EventCategory = SAHPI_EC_THRESHOLD, .Assertion = SAHPI_TRUE, .EventState = SAHPI_ES_UPPER_MAJOR, .OptionalDataPresent = SAHPI_SOD_TRIGGER_READING | SAHPI_SOD_TRIGGER_THRESHOLD | SAHPI_SOD_PREVIOUS_STATE | SAHPI_SOD_CURRENT_STATE, .TriggerReading = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, /* Trigger reading value is * initialized to "0". * Replace this value with * current sensor reading * value retrieved from OA */ .Value.SensorFloat64 = 0, }, .TriggerThreshold = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, /* This default Normal Max * value should be replaced * with Normal Max value * retrieved from OA */ .Value.SensorFloat64 = 38, }, .PreviousState = SAHPI_ES_UNSPECIFIED, .CurrentState = SAHPI_ES_UPPER_MAJOR, .Oem = 0, .SensorSpecific = 0, }, }, /* De assert an event for crossing CAUTION threshold * to OK condition */ { .EventType = SAHPI_ET_SENSOR, .Severity = SAHPI_MAJOR, .EventDataUnion.SensorEvent = { .SensorNum = OA_SOAP_SEN_TEMP_STATUS, .SensorType = SAHPI_TEMPERATURE, .EventCategory = SAHPI_EC_THRESHOLD, .Assertion = SAHPI_FALSE, .EventState = SAHPI_ES_UPPER_MAJOR, .OptionalDataPresent = SAHPI_SOD_TRIGGER_READING | SAHPI_SOD_TRIGGER_THRESHOLD | SAHPI_SOD_PREVIOUS_STATE | SAHPI_SOD_CURRENT_STATE, .TriggerReading = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, /* Trigger reading value is * initialized to "0". * Replace this value with * current sensor reading value * retrieved from OA */ .Value.SensorFloat64 = 0 }, .TriggerThreshold = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, /* This default Normal Max * value should be replaced * with Normal Max value * retrieved from OA */ .Value.SensorFloat64 = 38 }, .PreviousState = SAHPI_ES_UPPER_MAJOR, .CurrentState = SAHPI_ES_UNSPECIFIED, .Oem = 0, .SensorSpecific = 0, }, }, /* Assert an event for crossing CRITICAL threshold * from CAUTION condition */ { .EventType = SAHPI_ET_SENSOR, .Severity = SAHPI_CRITICAL, .EventDataUnion.SensorEvent = { .SensorNum = OA_SOAP_SEN_TEMP_STATUS, .SensorType = SAHPI_TEMPERATURE, .EventCategory = SAHPI_EC_THRESHOLD, .Assertion = SAHPI_TRUE, .EventState = SAHPI_ES_UPPER_CRIT, .OptionalDataPresent = SAHPI_SOD_TRIGGER_READING | SAHPI_SOD_TRIGGER_THRESHOLD | SAHPI_SOD_PREVIOUS_STATE | SAHPI_SOD_CURRENT_STATE, .TriggerReading = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, /* Trigger reading value is * initialized to "0". * Replace this value with * current sensor reading value * retrieved from OA */ .Value.SensorFloat64 = 0 }, .TriggerThreshold = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, /* This default Normal Max value * should be replaced with * Normal Max value retrieved * from OA */ .Value.SensorFloat64 = 43 }, .PreviousState = SAHPI_ES_UPPER_MAJOR, .CurrentState = SAHPI_ES_UPPER_CRIT, .Oem = 0, .SensorSpecific = 0, }, }, /* Deassert an event for crossing CRITICAL threshold * to CAUTION condition */ { .EventType = SAHPI_ET_SENSOR, .Severity = SAHPI_CRITICAL, .EventDataUnion.SensorEvent = { .SensorNum = OA_SOAP_SEN_TEMP_STATUS, .SensorType = SAHPI_TEMPERATURE, .EventCategory = SAHPI_EC_THRESHOLD, .Assertion = SAHPI_FALSE, .EventState = SAHPI_ES_UPPER_CRIT, .OptionalDataPresent = SAHPI_SOD_TRIGGER_READING | SAHPI_SOD_TRIGGER_THRESHOLD | SAHPI_SOD_PREVIOUS_STATE | SAHPI_SOD_CURRENT_STATE, .TriggerReading = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, /* Trigger reading value is * initialized to "0". * Replace this value with * current sensor reading value * retrieved from OA */ .Value.SensorFloat64 = 0 }, .TriggerThreshold = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, /* This default Normal Max value * should be replaced with * Normal Max value retrieved * from OA */ .Value.SensorFloat64 = 43 }, .PreviousState = SAHPI_ES_UPPER_CRIT, .CurrentState = SAHPI_ES_UPPER_MAJOR, .Oem = 0, .SensorSpecific = 0, }, }, }, .comment = "Ambient Zone Thermal Status", }, /* Redundancy status sensor */ { .sensor = { .Num = OA_SOAP_SEN_REDUND, .Type = SAHPI_OPERATIONAL, .Category = SAHPI_EC_REDUNDANCY, .EnableCtrl = SAHPI_TRUE, .EventCtrl = SAHPI_SEC_PER_EVENT, .Events = SAHPI_ES_FULLY_REDUNDANT | SAHPI_ES_REDUNDANCY_LOST, .DataFormat = { .IsSupported = SAHPI_FALSE, }, .ThresholdDefn = { .IsAccessible = SAHPI_FALSE, }, .Oem = 0, }, .sensor_info = { .current_state = SAHPI_ES_FULLY_REDUNDANT, .sensor_enable = SAHPI_TRUE, .event_enable = SAHPI_TRUE, .assert_mask = SAHPI_ES_REDUNDANCY_LOST, .deassert_mask = SAHPI_ES_FULLY_REDUNDANT, }, .sensor_class = OA_SOAP_REDUND_CLASS, .sen_evt = { /* Assert event */ { .EventType = SAHPI_ET_SENSOR, .Severity = SAHPI_MAJOR, .EventDataUnion.SensorEvent = { .SensorNum = OA_SOAP_SEN_REDUND, .SensorType = SAHPI_OPERATIONAL, .EventCategory = SAHPI_EC_REDUNDANCY, .Assertion = SAHPI_TRUE, .EventState = SAHPI_ES_REDUNDANCY_LOST, .OptionalDataPresent = SAHPI_SOD_CURRENT_STATE | SAHPI_SOD_PREVIOUS_STATE, .TriggerReading = { .IsSupported = SAHPI_FALSE, }, .TriggerThreshold = { .IsSupported = SAHPI_FALSE, }, .PreviousState = SAHPI_ES_FULLY_REDUNDANT, .CurrentState = SAHPI_ES_REDUNDANCY_LOST, .Oem = 0, .SensorSpecific = 0, }, }, /* Deassert event */ { .EventType = SAHPI_ET_SENSOR, .Severity = SAHPI_MAJOR, .EventDataUnion.SensorEvent = { .SensorNum = OA_SOAP_SEN_REDUND, .SensorType = SAHPI_OPERATIONAL, .EventCategory = SAHPI_EC_REDUNDANCY, .Assertion = SAHPI_FALSE, .EventState = SAHPI_ES_FULLY_REDUNDANT, .OptionalDataPresent = SAHPI_SOD_CURRENT_STATE | SAHPI_SOD_PREVIOUS_STATE, .TriggerReading = { .IsSupported = SAHPI_FALSE, }, .TriggerThreshold = { .IsSupported = SAHPI_FALSE, }, .PreviousState = SAHPI_ES_REDUNDANCY_LOST, .CurrentState = SAHPI_ES_FULLY_REDUNDANT, .Oem = 0, .SensorSpecific = 0, }, }, {}, {}, }, .comment = "Redundancy status", }, /* Fan Speed Sensor */ { .sensor = { .Num = OA_SOAP_SEN_FAN_SPEED, .Type = SAHPI_COOLING_DEVICE, .Category = SAHPI_EC_THRESHOLD, .EnableCtrl = SAHPI_TRUE, .EventCtrl = SAHPI_SEC_READ_ONLY, .Events = SAHPI_ES_UNSPECIFIED, .DataFormat = { .IsSupported = SAHPI_TRUE, .ReadingType = SAHPI_SENSOR_READING_TYPE_FLOAT64, .BaseUnits = SAHPI_SU_RPM, .ModifierUnits = SAHPI_SU_UNSPECIFIED, .ModifierUse = SAHPI_SMUU_NONE, .Percentage = SAHPI_FALSE, .Range.Flags = SAHPI_SRF_MAX | SAHPI_SRF_MIN, .Range.Max.IsSupported = SAHPI_TRUE, .Range.Max.Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, /* This default Max value should be replaced * with Max value retrieved from OA */ .Range.Max.Value.SensorFloat64 = 18000, .Range.Min.IsSupported = SAHPI_TRUE, .Range.Min.Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, /* This default Min value should be * replaced with Min value retrieved * from OA */ .Range.Min.Value.SensorFloat64 = 10, .AccuracyFactor = 0, }, .ThresholdDefn = { .IsAccessible = SAHPI_TRUE, .ReadThold = SAHPI_ES_UPPER_CRIT | SAHPI_ES_LOWER_CRIT, .WriteThold = 0x0, }, .Oem = 0, }, .sensor_info = { .current_state = SAHPI_ES_UNSPECIFIED, .sensor_enable = SAHPI_TRUE, .event_enable = SAHPI_FALSE, .assert_mask = OA_SOAP_STM_UNSPECIFED, .deassert_mask = OA_SOAP_STM_UNSPECIFED, .threshold = { .UpCritical.IsSupported = SAHPI_TRUE, .UpCritical.Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, /* Update the value with critical threshold * reading */ .UpCritical.Value.SensorFloat64 = 18000, .LowCritical.IsSupported = SAHPI_TRUE, .LowCritical.Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, /* Update the value with major threshold * reading */ .LowCritical.Value.SensorFloat64 = 10, }, }, .sensor_class = OA_SOAP_FAN_SPEED_CLASS, .comment = "Fan speed", }, /* Power status sensor */ { .sensor = { .Num = OA_SOAP_SEN_PWR_STATUS, .Type = SAHPI_POWER_SUPPLY, .Category = SAHPI_EC_UNSPECIFIED, .EnableCtrl = SAHPI_TRUE, .EventCtrl = SAHPI_SEC_READ_ONLY, .Events = SAHPI_ES_UNSPECIFIED, .DataFormat = { .IsSupported = SAHPI_TRUE, .ReadingType = SAHPI_SENSOR_READING_TYPE_FLOAT64, .BaseUnits = SAHPI_SU_WATTS, .ModifierUnits = SAHPI_SU_UNSPECIFIED, .ModifierUse = SAHPI_SMUU_NONE, .Percentage = SAHPI_FALSE, .Range.Flags = 0, .AccuracyFactor = 0, }, .ThresholdDefn = { .IsAccessible = SAHPI_FALSE, }, .Oem = 0, }, .sensor_info = { .current_state = SAHPI_ES_UNSPECIFIED, .sensor_enable = SAHPI_TRUE, .event_enable = SAHPI_FALSE, .assert_mask = OA_SOAP_STM_UNSPECIFED, .deassert_mask = OA_SOAP_STM_UNSPECIFED, }, .sensor_class = OA_SOAP_PWR_STATUS_CLASS, .comment = "Power status", }, /* Diagnostic internal data error sensor */ { .sensor = { .Num = OA_SOAP_SEN_INT_DATA_ERR, .Type = SAHPI_OPERATIONAL, .Category = SAHPI_EC_ENABLE, .EnableCtrl = SAHPI_TRUE, .EventCtrl = SAHPI_SEC_PER_EVENT, .Events = SAHPI_ES_ENABLED | SAHPI_ES_DISABLED, .DataFormat = { .IsSupported = SAHPI_FALSE, }, .ThresholdDefn = { .IsAccessible = SAHPI_FALSE, }, .Oem = 0, }, .sensor_info = { .current_state = SAHPI_ES_ENABLED, .sensor_enable = SAHPI_TRUE, .event_enable = SAHPI_TRUE, .assert_mask = SAHPI_ES_DISABLED, .deassert_mask = SAHPI_ES_ENABLED, }, .sensor_class = OA_SOAP_DIAG_CLASS, .sen_evt = { /* Assert event */ { .EventType = SAHPI_ET_SENSOR, .Severity = SAHPI_MAJOR, .EventDataUnion.SensorEvent = { .SensorNum = OA_SOAP_SEN_INT_DATA_ERR, .SensorType = SAHPI_OPERATIONAL, .EventCategory = SAHPI_EC_ENABLE, .Assertion = SAHPI_TRUE, .EventState = SAHPI_ES_DISABLED, .OptionalDataPresent = SAHPI_SOD_CURRENT_STATE | SAHPI_SOD_PREVIOUS_STATE, .TriggerReading = { .IsSupported = SAHPI_FALSE, }, .TriggerThreshold = { .IsSupported = SAHPI_FALSE, }, .PreviousState = SAHPI_ES_ENABLED, .CurrentState = SAHPI_ES_DISABLED, .Oem = 0, .SensorSpecific = 0, }, }, /* Deassert event */ { .EventType = SAHPI_ET_SENSOR, .Severity = SAHPI_MAJOR, .EventDataUnion.SensorEvent = { .SensorNum = OA_SOAP_SEN_INT_DATA_ERR, .SensorType = SAHPI_OPERATIONAL, .EventCategory = SAHPI_EC_ENABLE, .Assertion = SAHPI_FALSE, .EventState = SAHPI_ES_ENABLED, .OptionalDataPresent = SAHPI_SOD_CURRENT_STATE | SAHPI_SOD_PREVIOUS_STATE, .TriggerReading = { .IsSupported = SAHPI_FALSE, }, .TriggerThreshold = { .IsSupported = SAHPI_FALSE, }, .PreviousState = SAHPI_ES_DISABLED, .CurrentState = SAHPI_ES_ENABLED, .Oem = 0, .SensorSpecific = 0, }, }, {}, {}, }, .comment = "Internal Data error", }, /* Diagnostic management processor error sensor */ { .sensor = { .Num = OA_SOAP_SEN_MP_ERR, .Type = SAHPI_OPERATIONAL, .Category = SAHPI_EC_ENABLE, .EnableCtrl = SAHPI_TRUE, .EventCtrl = SAHPI_SEC_PER_EVENT, .Events = SAHPI_ES_ENABLED | SAHPI_ES_DISABLED, .DataFormat = { .IsSupported = SAHPI_FALSE, }, .ThresholdDefn = { .IsAccessible = SAHPI_FALSE, }, .Oem = 0, }, .sensor_info = { .current_state = SAHPI_ES_ENABLED, .sensor_enable = SAHPI_TRUE, .event_enable = SAHPI_TRUE, .assert_mask = SAHPI_ES_DISABLED, .deassert_mask = SAHPI_ES_ENABLED, }, .sensor_class = OA_SOAP_DIAG_CLASS, .sen_evt = { /* Assert event */ { .EventType = SAHPI_ET_SENSOR, .Severity = SAHPI_MAJOR, .EventDataUnion.SensorEvent = { .SensorNum = OA_SOAP_SEN_MP_ERR, .SensorType = SAHPI_OPERATIONAL, .EventCategory = SAHPI_EC_ENABLE, .Assertion = SAHPI_TRUE, .EventState = SAHPI_ES_DISABLED, .OptionalDataPresent = SAHPI_SOD_CURRENT_STATE | SAHPI_SOD_PREVIOUS_STATE, .TriggerReading = { .IsSupported = SAHPI_FALSE, }, .TriggerThreshold = { .IsSupported = SAHPI_FALSE, }, .PreviousState = SAHPI_ES_ENABLED, .CurrentState = SAHPI_ES_DISABLED, .Oem = 0, .SensorSpecific = 0, }, }, /* Deassert event */ { .EventType = SAHPI_ET_SENSOR, .Severity = SAHPI_MAJOR, .EventDataUnion.SensorEvent = { .SensorNum = OA_SOAP_SEN_MP_ERR, .SensorType = SAHPI_OPERATIONAL, .EventCategory = SAHPI_EC_ENABLE, .Assertion = SAHPI_FALSE, .EventState = SAHPI_ES_ENABLED, .OptionalDataPresent = SAHPI_SOD_CURRENT_STATE | SAHPI_SOD_PREVIOUS_STATE, .TriggerReading = { .IsSupported = SAHPI_FALSE, }, .TriggerThreshold = { .IsSupported = SAHPI_FALSE, }, .PreviousState = SAHPI_ES_DISABLED, .CurrentState = SAHPI_ES_ENABLED, .Oem = 0, .SensorSpecific = 0, }, }, {}, {}, }, .comment = "Management processor error", }, /* Power Supply Subsystem Power input Sensor */ { .sensor = { .Num = OA_SOAP_SEN_IN_PWR, .Type = SAHPI_POWER_SUPPLY, .Category = SAHPI_EC_UNSPECIFIED, .EnableCtrl = SAHPI_TRUE, .EventCtrl = SAHPI_SEC_READ_ONLY, .Events = SAHPI_ES_UNSPECIFIED, .DataFormat = { .IsSupported = SAHPI_TRUE, .ReadingType = SAHPI_SENSOR_READING_TYPE_FLOAT64, .BaseUnits = SAHPI_SU_WATTS, .ModifierUnits = SAHPI_SU_UNSPECIFIED, .ModifierUse = SAHPI_SMUU_NONE, .Percentage = SAHPI_FALSE, .Range.Flags = 0, .AccuracyFactor = 0, }, .ThresholdDefn = { .IsAccessible = SAHPI_FALSE, }, .Oem = 0, }, .sensor_info = { .current_state = SAHPI_ES_UNSPECIFIED, .sensor_enable = SAHPI_TRUE, .event_enable = SAHPI_FALSE, .assert_mask = OA_SOAP_STM_UNSPECIFED, .deassert_mask = OA_SOAP_STM_UNSPECIFED, }, .sensor_class = OA_SOAP_PWR_SUBSYS_CLASS, .comment = "Power Input sensor", }, /* Power Supply Subsystem Power output Sensor */ { .sensor = { .Num = OA_SOAP_SEN_OUT_PWR, .Type = SAHPI_POWER_SUPPLY, .Category = SAHPI_EC_UNSPECIFIED, .EnableCtrl = SAHPI_TRUE, .EventCtrl = SAHPI_SEC_READ_ONLY, .Events = SAHPI_ES_UNSPECIFIED, .DataFormat = { .IsSupported = SAHPI_TRUE, .ReadingType = SAHPI_SENSOR_READING_TYPE_FLOAT64, .BaseUnits = SAHPI_SU_WATTS, .ModifierUnits = SAHPI_SU_UNSPECIFIED, .ModifierUse = SAHPI_SMUU_NONE, .Percentage = SAHPI_FALSE, .Range.Flags = 0, .AccuracyFactor = 0, }, .ThresholdDefn = { .IsAccessible = SAHPI_FALSE, }, .Oem = 0, }, .sensor_info = { .current_state = SAHPI_ES_UNSPECIFIED, .sensor_enable = SAHPI_TRUE, .event_enable = SAHPI_FALSE, .assert_mask = OA_SOAP_STM_UNSPECIFED, .deassert_mask = OA_SOAP_STM_UNSPECIFED, }, .sensor_class = OA_SOAP_PWR_SUBSYS_CLASS, .comment = "Power Output sensor", }, /* Power Supply Subsystem Power capacity Sensor */ { .sensor = { .Num = OA_SOAP_SEN_PWR_CAPACITY, .Type = SAHPI_POWER_SUPPLY, .Category = SAHPI_EC_UNSPECIFIED, .EnableCtrl = SAHPI_TRUE, .EventCtrl = SAHPI_SEC_READ_ONLY, .Events = SAHPI_ES_UNSPECIFIED, .DataFormat = { .IsSupported = SAHPI_TRUE, .ReadingType = SAHPI_SENSOR_READING_TYPE_FLOAT64, .BaseUnits = SAHPI_SU_WATTS, .ModifierUnits = SAHPI_SU_UNSPECIFIED, .ModifierUse = SAHPI_SMUU_NONE, .Percentage = SAHPI_FALSE, .Range.Flags = 0, .AccuracyFactor = 0, }, .ThresholdDefn = { .IsAccessible = SAHPI_FALSE, }, .Oem = 0, }, .sensor_info = { .current_state = SAHPI_ES_UNSPECIFIED, .sensor_enable = SAHPI_TRUE, .event_enable = SAHPI_FALSE, .assert_mask = OA_SOAP_STM_UNSPECIFED, .deassert_mask = OA_SOAP_STM_UNSPECIFED, }, .sensor_class = OA_SOAP_PWR_SUBSYS_CLASS, .comment = "Power Capacity sensor", }, /* Diagnostic thermal warning sensor */ { .sensor = { .Num = OA_SOAP_SEN_THERM_WARN, .Type = SAHPI_OPERATIONAL, .Category = SAHPI_EC_ENABLE, .EnableCtrl = SAHPI_TRUE, .EventCtrl = SAHPI_SEC_PER_EVENT, .Events = SAHPI_ES_ENABLED | SAHPI_ES_DISABLED, .DataFormat = { .IsSupported = SAHPI_FALSE, }, .ThresholdDefn = { .IsAccessible = SAHPI_FALSE, }, .Oem = 0, }, .sensor_info = { .current_state = SAHPI_ES_ENABLED, .sensor_enable = SAHPI_TRUE, .event_enable = SAHPI_TRUE, .assert_mask = SAHPI_ES_DISABLED, .deassert_mask = SAHPI_ES_ENABLED, }, .sensor_class = OA_SOAP_DIAG_CLASS, .sen_evt = { /* Assert event */ { .EventType = SAHPI_ET_SENSOR, .Severity = SAHPI_MINOR, .EventDataUnion.SensorEvent = { .SensorNum = OA_SOAP_SEN_THERM_WARN, .SensorType = SAHPI_OPERATIONAL, .EventCategory = SAHPI_EC_ENABLE, .Assertion = SAHPI_TRUE, .EventState = SAHPI_ES_DISABLED, .OptionalDataPresent = SAHPI_SOD_CURRENT_STATE | SAHPI_SOD_PREVIOUS_STATE, .TriggerReading = { .IsSupported = SAHPI_FALSE, }, .TriggerThreshold = { .IsSupported = SAHPI_FALSE, }, .PreviousState = SAHPI_ES_ENABLED, .CurrentState = SAHPI_ES_DISABLED, .Oem = 0, .SensorSpecific = 0, }, }, /* Deassert event */ { .EventType = SAHPI_ET_SENSOR, .Severity = SAHPI_MINOR, .EventDataUnion.SensorEvent = { .SensorNum = OA_SOAP_SEN_THERM_WARN, .SensorType = SAHPI_OPERATIONAL, .EventCategory = SAHPI_EC_ENABLE, .Assertion = SAHPI_FALSE, .EventState = SAHPI_ES_ENABLED, .OptionalDataPresent = SAHPI_SOD_CURRENT_STATE | SAHPI_SOD_PREVIOUS_STATE, .TriggerReading = { .IsSupported = SAHPI_FALSE, }, .TriggerThreshold = { .IsSupported = SAHPI_FALSE, }, .PreviousState = SAHPI_ES_DISABLED, .CurrentState = SAHPI_ES_ENABLED, .Oem = 0, .SensorSpecific = 0, }, }, {}, {}, }, .comment = "Thermal warning", }, /* Diagnostic thermal danger sensor */ { .sensor = { .Num = OA_SOAP_SEN_THERM_DANGER, .Type = SAHPI_OPERATIONAL, .Category = SAHPI_EC_ENABLE, .EnableCtrl = SAHPI_TRUE, .EventCtrl = SAHPI_SEC_PER_EVENT, .Events = SAHPI_ES_ENABLED | SAHPI_ES_DISABLED, .DataFormat = { .IsSupported = SAHPI_FALSE, }, .ThresholdDefn = { .IsAccessible = SAHPI_FALSE, }, .Oem = 0, }, .sensor_info = { .current_state = SAHPI_ES_ENABLED, .sensor_enable = SAHPI_TRUE, .event_enable = SAHPI_TRUE, .assert_mask = SAHPI_ES_DISABLED, .deassert_mask = SAHPI_ES_ENABLED, }, .sensor_class = OA_SOAP_DIAG_CLASS, .sen_evt = { /* Assert event */ { .EventType = SAHPI_ET_SENSOR, .Severity = SAHPI_MAJOR, .EventDataUnion.SensorEvent = { .SensorNum = OA_SOAP_SEN_THERM_DANGER, .SensorType = SAHPI_OPERATIONAL, .EventCategory = SAHPI_EC_ENABLE, .Assertion = SAHPI_TRUE, .EventState = SAHPI_ES_DISABLED, .OptionalDataPresent = SAHPI_SOD_CURRENT_STATE | SAHPI_SOD_PREVIOUS_STATE, .TriggerReading = { .IsSupported = SAHPI_FALSE, }, .TriggerThreshold = { .IsSupported = SAHPI_FALSE, }, .PreviousState = SAHPI_ES_ENABLED, .CurrentState = SAHPI_ES_DISABLED, .Oem = 0, .SensorSpecific = 0, }, }, /* Deassert event */ { .EventType = SAHPI_ET_SENSOR, .Severity = SAHPI_MAJOR, .EventDataUnion.SensorEvent = { .SensorNum = OA_SOAP_SEN_THERM_DANGER, .SensorType = SAHPI_OPERATIONAL, .EventCategory = SAHPI_EC_ENABLE, .Assertion = SAHPI_FALSE, .EventState = SAHPI_ES_ENABLED, .OptionalDataPresent = SAHPI_SOD_CURRENT_STATE | SAHPI_SOD_PREVIOUS_STATE, .TriggerReading = { .IsSupported = SAHPI_FALSE, }, .TriggerThreshold = { .IsSupported = SAHPI_FALSE, }, .PreviousState = SAHPI_ES_DISABLED, .CurrentState = SAHPI_ES_ENABLED, .Oem = 0, .SensorSpecific = 0, }, }, {}, {}, }, .comment = "Thermal danger", }, /* Diagnostic IO configuration error sensor */ { .sensor = { .Num = OA_SOAP_SEN_IO_CONFIG_ERR, .Type = SAHPI_OPERATIONAL, .Category = SAHPI_EC_ENABLE, .EnableCtrl = SAHPI_TRUE, .EventCtrl = SAHPI_SEC_PER_EVENT, .Events = SAHPI_ES_ENABLED | SAHPI_ES_DISABLED, .DataFormat = { .IsSupported = SAHPI_FALSE, }, .ThresholdDefn = { .IsAccessible = SAHPI_FALSE, }, .Oem = 0, }, .sensor_info = { .current_state = SAHPI_ES_ENABLED, .sensor_enable = SAHPI_TRUE, .event_enable = SAHPI_TRUE, .assert_mask = SAHPI_ES_DISABLED, .deassert_mask = SAHPI_ES_ENABLED, }, .sensor_class = OA_SOAP_DIAG_CLASS, .sen_evt = { /* Assert event */ { .EventType = SAHPI_ET_SENSOR, .Severity = SAHPI_MAJOR, .EventDataUnion.SensorEvent = { .SensorNum = OA_SOAP_SEN_IO_CONFIG_ERR, .SensorType = SAHPI_OPERATIONAL, .EventCategory = SAHPI_EC_ENABLE, .Assertion = SAHPI_TRUE, .EventState = SAHPI_ES_DISABLED, .OptionalDataPresent = SAHPI_SOD_CURRENT_STATE | SAHPI_SOD_PREVIOUS_STATE, .TriggerReading = { .IsSupported = SAHPI_FALSE, }, .TriggerThreshold = { .IsSupported = SAHPI_FALSE, }, .PreviousState = SAHPI_ES_ENABLED, .CurrentState = SAHPI_ES_DISABLED, .Oem = 0, .SensorSpecific = 0, }, }, /* Deassert event */ { .EventType = SAHPI_ET_SENSOR, .Severity = SAHPI_MAJOR, .EventDataUnion.SensorEvent = { .SensorNum = OA_SOAP_SEN_IO_CONFIG_ERR, .SensorType = SAHPI_OPERATIONAL, .EventCategory = SAHPI_EC_ENABLE, .Assertion = SAHPI_FALSE, .EventState = SAHPI_ES_ENABLED, .OptionalDataPresent = SAHPI_SOD_CURRENT_STATE | SAHPI_SOD_PREVIOUS_STATE, .TriggerReading = { .IsSupported = SAHPI_FALSE, }, .TriggerThreshold = { .IsSupported = SAHPI_FALSE, }, .PreviousState = SAHPI_ES_DISABLED, .CurrentState = SAHPI_ES_ENABLED, .Oem = 0, .SensorSpecific = 0, }, }, {}, {}, }, .comment = "IO configuration error", }, /* Diagnostic device power request error sensor */ { .sensor = { .Num = OA_SOAP_SEN_DEV_PWR_REQ, .Type = SAHPI_OPERATIONAL, .Category = SAHPI_EC_ENABLE, .EnableCtrl = SAHPI_TRUE, .EventCtrl = SAHPI_SEC_PER_EVENT, .Events = SAHPI_ES_ENABLED | SAHPI_ES_DISABLED, .DataFormat = { .IsSupported = SAHPI_FALSE, }, .ThresholdDefn = { .IsAccessible = SAHPI_FALSE, }, .Oem = 0, }, .sensor_info = { .current_state = SAHPI_ES_ENABLED, .sensor_enable = SAHPI_TRUE, .event_enable = SAHPI_TRUE, .assert_mask = SAHPI_ES_DISABLED, .deassert_mask = SAHPI_ES_ENABLED, }, .sensor_class = OA_SOAP_DIAG_CLASS, .sen_evt = { /* Assert event */ { .EventType = SAHPI_ET_SENSOR, .Severity = SAHPI_MAJOR, .EventDataUnion.SensorEvent = { .SensorNum = OA_SOAP_SEN_DEV_PWR_REQ, .SensorType = SAHPI_OPERATIONAL, .EventCategory = SAHPI_EC_ENABLE, .Assertion = SAHPI_TRUE, .EventState = SAHPI_ES_DISABLED, .OptionalDataPresent = SAHPI_SOD_CURRENT_STATE | SAHPI_SOD_PREVIOUS_STATE, .TriggerReading = { .IsSupported = SAHPI_FALSE, }, .TriggerThreshold = { .IsSupported = SAHPI_FALSE, }, .PreviousState = SAHPI_ES_ENABLED, .CurrentState = SAHPI_ES_DISABLED, .Oem = 0, .SensorSpecific = 0, }, }, /* Deassert event */ { .EventType = SAHPI_ET_SENSOR, .Severity = SAHPI_MAJOR, .EventDataUnion.SensorEvent = { .SensorNum = OA_SOAP_SEN_DEV_PWR_REQ, .SensorType = SAHPI_OPERATIONAL, .EventCategory = SAHPI_EC_ENABLE, .Assertion = SAHPI_FALSE, .EventState = SAHPI_ES_ENABLED, .OptionalDataPresent = SAHPI_SOD_CURRENT_STATE | SAHPI_SOD_PREVIOUS_STATE, .TriggerReading = { .IsSupported = SAHPI_FALSE, }, .TriggerThreshold = { .IsSupported = SAHPI_FALSE, }, .PreviousState = SAHPI_ES_DISABLED, .CurrentState = SAHPI_ES_ENABLED, .Oem = 0, .SensorSpecific = 0, }, }, {}, {}, }, .comment = "Device power request error", }, /* Diagnostic insufficient cooling sensor */ { .sensor = { .Num = OA_SOAP_SEN_INSUF_COOL, .Type = SAHPI_OPERATIONAL, .Category = SAHPI_EC_ENABLE, .EnableCtrl = SAHPI_TRUE, .EventCtrl = SAHPI_SEC_PER_EVENT, .Events = SAHPI_ES_ENABLED | SAHPI_ES_DISABLED, .DataFormat = { .IsSupported = SAHPI_FALSE, }, .ThresholdDefn = { .IsAccessible = SAHPI_FALSE, }, .Oem = 0, }, .sensor_info = { .current_state = SAHPI_ES_ENABLED, .sensor_enable = SAHPI_TRUE, .event_enable = SAHPI_TRUE, .assert_mask = SAHPI_ES_DISABLED, .deassert_mask = SAHPI_ES_ENABLED, }, .sensor_class = OA_SOAP_DIAG_CLASS, .sen_evt = { /* Assert event */ { .EventType = SAHPI_ET_SENSOR, .Severity = SAHPI_MAJOR, .EventDataUnion.SensorEvent = { .SensorNum = OA_SOAP_SEN_INSUF_COOL, .SensorType = SAHPI_OPERATIONAL, .EventCategory = SAHPI_EC_ENABLE, .Assertion = SAHPI_TRUE, .EventState = SAHPI_ES_DISABLED, .OptionalDataPresent = SAHPI_SOD_CURRENT_STATE | SAHPI_SOD_PREVIOUS_STATE, .TriggerReading = { .IsSupported = SAHPI_FALSE, }, .TriggerThreshold = { .IsSupported = SAHPI_FALSE, }, .PreviousState = SAHPI_ES_ENABLED, .CurrentState = SAHPI_ES_DISABLED, .Oem = 0, .SensorSpecific = 0, }, }, /* Deassert event */ { .EventType = SAHPI_ET_SENSOR, .Severity = SAHPI_MAJOR, .EventDataUnion.SensorEvent = { .SensorNum = OA_SOAP_SEN_INSUF_COOL, .SensorType = SAHPI_OPERATIONAL, .EventCategory = SAHPI_EC_ENABLE, .Assertion = SAHPI_FALSE, .EventState = SAHPI_ES_ENABLED, .OptionalDataPresent = SAHPI_SOD_CURRENT_STATE | SAHPI_SOD_PREVIOUS_STATE, .TriggerReading = { .IsSupported = SAHPI_FALSE, }, .TriggerThreshold = { .IsSupported = SAHPI_FALSE, }, .PreviousState = SAHPI_ES_DISABLED, .CurrentState = SAHPI_ES_ENABLED, .Oem = 0, .SensorSpecific = 0, }, }, {}, {}, }, .comment = "Insufficient cooling", }, /* Diagnostic device location error sensor */ { .sensor = { .Num = OA_SOAP_SEN_DEV_LOC_ERR, .Type = SAHPI_OPERATIONAL, .Category = SAHPI_EC_ENABLE, .EnableCtrl = SAHPI_TRUE, .EventCtrl = SAHPI_SEC_PER_EVENT, .Events = SAHPI_ES_ENABLED | SAHPI_ES_DISABLED, .DataFormat = { .IsSupported = SAHPI_FALSE, }, .ThresholdDefn = { .IsAccessible = SAHPI_FALSE, }, .Oem = 0, }, .sensor_info = { .current_state = SAHPI_ES_ENABLED, .sensor_enable = SAHPI_TRUE, .event_enable = SAHPI_TRUE, .assert_mask = SAHPI_ES_DISABLED, .deassert_mask = SAHPI_ES_ENABLED, }, .sensor_class = OA_SOAP_DIAG_CLASS, .sen_evt = { /* Assert event */ { .EventType = SAHPI_ET_SENSOR, .Severity = SAHPI_MAJOR, .EventDataUnion.SensorEvent = { .SensorNum = OA_SOAP_SEN_DEV_LOC_ERR, .SensorType = SAHPI_OPERATIONAL, .EventCategory = SAHPI_EC_ENABLE, .Assertion = SAHPI_TRUE, .EventState = SAHPI_ES_DISABLED, .OptionalDataPresent = SAHPI_SOD_CURRENT_STATE | SAHPI_SOD_PREVIOUS_STATE, .TriggerReading = { .IsSupported = SAHPI_FALSE, }, .TriggerThreshold = { .IsSupported = SAHPI_FALSE, }, .PreviousState = SAHPI_ES_ENABLED, .CurrentState = SAHPI_ES_DISABLED, .Oem = 0, .SensorSpecific = 0, }, }, /* Deassert event */ { .EventType = SAHPI_ET_SENSOR, .Severity = SAHPI_MAJOR, .EventDataUnion.SensorEvent = { .SensorNum = OA_SOAP_SEN_DEV_LOC_ERR, .SensorType = SAHPI_OPERATIONAL, .EventCategory = SAHPI_EC_ENABLE, .Assertion = SAHPI_FALSE, .EventState = SAHPI_ES_ENABLED, .OptionalDataPresent = SAHPI_SOD_CURRENT_STATE | SAHPI_SOD_PREVIOUS_STATE, .TriggerReading = { .IsSupported = SAHPI_FALSE, }, .TriggerThreshold = { .IsSupported = SAHPI_FALSE, }, .PreviousState = SAHPI_ES_DISABLED, .CurrentState = SAHPI_ES_ENABLED, .Oem = 0, .SensorSpecific = 0, }, }, {}, {}, }, .comment = "Device location error", }, /* Diagnostic device failure sensor */ { .sensor = { .Num = OA_SOAP_SEN_DEV_FAIL, .Type = SAHPI_OPERATIONAL, .Category = SAHPI_EC_ENABLE, .EnableCtrl = SAHPI_TRUE, .EventCtrl = SAHPI_SEC_PER_EVENT, .Events = SAHPI_ES_ENABLED | SAHPI_ES_DISABLED, .DataFormat = { .IsSupported = SAHPI_FALSE, }, .ThresholdDefn = { .IsAccessible = SAHPI_FALSE, }, .Oem = 0, }, .sensor_info = { .current_state = SAHPI_ES_ENABLED, .sensor_enable = SAHPI_TRUE, .event_enable = SAHPI_TRUE, .assert_mask = SAHPI_ES_DISABLED, .deassert_mask = SAHPI_ES_ENABLED, }, .sensor_class = OA_SOAP_DIAG_CLASS, .sen_evt = { /* Assert event */ { .EventType = SAHPI_ET_SENSOR, .Severity = SAHPI_MAJOR, .EventDataUnion.SensorEvent = { .SensorNum = OA_SOAP_SEN_DEV_FAIL, .SensorType = SAHPI_OPERATIONAL, .EventCategory = SAHPI_EC_ENABLE, .Assertion = SAHPI_TRUE, .EventState = SAHPI_ES_DISABLED, .OptionalDataPresent = SAHPI_SOD_CURRENT_STATE | SAHPI_SOD_PREVIOUS_STATE, .TriggerReading = { .IsSupported = SAHPI_FALSE, }, .TriggerThreshold = { .IsSupported = SAHPI_FALSE, }, .PreviousState = SAHPI_ES_ENABLED, .CurrentState = SAHPI_ES_DISABLED, .Oem = 0, .SensorSpecific = 0, }, }, /* Deassert event */ { .EventType = SAHPI_ET_SENSOR, .Severity = SAHPI_MAJOR, .EventDataUnion.SensorEvent = { .SensorNum = OA_SOAP_SEN_DEV_FAIL, .SensorType = SAHPI_OPERATIONAL, .EventCategory = SAHPI_EC_ENABLE, .Assertion = SAHPI_FALSE, .EventState = SAHPI_ES_ENABLED, .OptionalDataPresent = SAHPI_SOD_CURRENT_STATE | SAHPI_SOD_PREVIOUS_STATE, .TriggerReading = { .IsSupported = SAHPI_FALSE, }, .TriggerThreshold = { .IsSupported = SAHPI_FALSE, }, .PreviousState = SAHPI_ES_DISABLED, .CurrentState = SAHPI_ES_ENABLED, .Oem = 0, .SensorSpecific = 0, }, }, {}, {}, }, .comment = "Device failure", }, /* Diagnostic device degraded sensor */ { .sensor = { .Num = OA_SOAP_SEN_DEV_DEGRAD, .Type = SAHPI_OPERATIONAL, .Category = SAHPI_EC_ENABLE, .EnableCtrl = SAHPI_TRUE, .EventCtrl = SAHPI_SEC_PER_EVENT, .Events = SAHPI_ES_ENABLED | SAHPI_ES_DISABLED, .DataFormat = { .IsSupported = SAHPI_FALSE, }, .ThresholdDefn = { .IsAccessible = SAHPI_FALSE, }, .Oem = 0, }, .sensor_info = { .current_state = SAHPI_ES_ENABLED, .sensor_enable = SAHPI_TRUE, .event_enable = SAHPI_TRUE, .assert_mask = SAHPI_ES_DISABLED, .deassert_mask = SAHPI_ES_ENABLED, }, .sensor_class = OA_SOAP_DIAG_CLASS, .sen_evt = { /* Assert event */ { .EventType = SAHPI_ET_SENSOR, .Severity = SAHPI_MINOR, .EventDataUnion.SensorEvent = { .SensorNum = OA_SOAP_SEN_DEV_DEGRAD, .SensorType = SAHPI_OPERATIONAL, .EventCategory = SAHPI_EC_ENABLE, .Assertion = SAHPI_TRUE, .EventState = SAHPI_ES_DISABLED, .OptionalDataPresent = SAHPI_SOD_CURRENT_STATE | SAHPI_SOD_PREVIOUS_STATE, .TriggerReading = { .IsSupported = SAHPI_FALSE, }, .TriggerThreshold = { .IsSupported = SAHPI_FALSE, }, .PreviousState = SAHPI_ES_ENABLED, .CurrentState = SAHPI_ES_DISABLED, .Oem = 0, .SensorSpecific = 0, }, }, /* Deassert event */ { .EventType = SAHPI_ET_SENSOR, .Severity = SAHPI_MINOR, .EventDataUnion.SensorEvent = { .SensorNum = OA_SOAP_SEN_DEV_DEGRAD, .SensorType = SAHPI_OPERATIONAL, .EventCategory = SAHPI_EC_ENABLE, .Assertion = SAHPI_FALSE, .EventState = SAHPI_ES_ENABLED, .OptionalDataPresent = SAHPI_SOD_CURRENT_STATE | SAHPI_SOD_PREVIOUS_STATE, .TriggerReading = { .IsSupported = SAHPI_FALSE, }, .TriggerThreshold = { .IsSupported = SAHPI_FALSE, }, .PreviousState = SAHPI_ES_DISABLED, .CurrentState = SAHPI_ES_ENABLED, .Oem = 0, .SensorSpecific = 0, }, }, {}, {}, }, .comment = "Device degraded", }, /* Diagnostic AC failure sensor */ { .sensor = { .Num = OA_SOAP_SEN_AC_FAIL, .Type = SAHPI_OPERATIONAL, .Category = SAHPI_EC_ENABLE, .EnableCtrl = SAHPI_TRUE, .EventCtrl = SAHPI_SEC_PER_EVENT, .Events = SAHPI_ES_ENABLED | SAHPI_ES_DISABLED, .DataFormat = { .IsSupported = SAHPI_FALSE, }, .ThresholdDefn = { .IsAccessible = SAHPI_FALSE, }, .Oem = 0, }, .sensor_info = { .current_state = SAHPI_ES_ENABLED, .sensor_enable = SAHPI_TRUE, .event_enable = SAHPI_TRUE, .assert_mask = SAHPI_ES_DISABLED, .deassert_mask = SAHPI_ES_ENABLED, }, .sensor_class = OA_SOAP_DIAG_CLASS, .sen_evt = { /* Assert event */ { .EventType = SAHPI_ET_SENSOR, .Severity = SAHPI_MAJOR, .EventDataUnion.SensorEvent = { .SensorNum = OA_SOAP_SEN_AC_FAIL, .SensorType = SAHPI_OPERATIONAL, .EventCategory = SAHPI_EC_ENABLE, .Assertion = SAHPI_TRUE, .EventState = SAHPI_ES_DISABLED, .OptionalDataPresent = SAHPI_SOD_CURRENT_STATE | SAHPI_SOD_PREVIOUS_STATE, .TriggerReading = { .IsSupported = SAHPI_FALSE, }, .TriggerThreshold = { .IsSupported = SAHPI_FALSE, }, .PreviousState = SAHPI_ES_ENABLED, .CurrentState = SAHPI_ES_DISABLED, .Oem = 0, .SensorSpecific = 0, }, }, /* Deassert event */ { .EventType = SAHPI_ET_SENSOR, .Severity = SAHPI_MAJOR, .EventDataUnion.SensorEvent = { .SensorNum = OA_SOAP_SEN_AC_FAIL, .SensorType = SAHPI_OPERATIONAL, .EventCategory = SAHPI_EC_ENABLE, .Assertion = SAHPI_FALSE, .EventState = SAHPI_ES_ENABLED, .OptionalDataPresent = SAHPI_SOD_CURRENT_STATE | SAHPI_SOD_PREVIOUS_STATE, .TriggerReading = { .IsSupported = SAHPI_FALSE, }, .TriggerThreshold = { .IsSupported = SAHPI_FALSE, }, .PreviousState = SAHPI_ES_DISABLED, .CurrentState = SAHPI_ES_ENABLED, .Oem = 0, .SensorSpecific = 0, }, }, {}, {}, }, .comment = "AC failure", }, /* Diagnostic i2c buses sensor */ { .sensor = { .Num = OA_SOAP_SEN_I2C_BUS, .Type = SAHPI_OPERATIONAL, .Category = SAHPI_EC_ENABLE, .EnableCtrl = SAHPI_TRUE, .EventCtrl = SAHPI_SEC_PER_EVENT, .Events = SAHPI_ES_ENABLED | SAHPI_ES_DISABLED, .DataFormat = { .IsSupported = SAHPI_FALSE, }, .ThresholdDefn = { .IsAccessible = SAHPI_FALSE, }, .Oem = 0, }, .sensor_info = { .current_state = SAHPI_ES_ENABLED, .sensor_enable = SAHPI_TRUE, .event_enable = SAHPI_TRUE, .assert_mask = SAHPI_ES_DISABLED, .deassert_mask = SAHPI_ES_ENABLED, }, .sensor_class = OA_SOAP_DIAG_CLASS, .sen_evt = { /* Assert event */ { .EventType = SAHPI_ET_SENSOR, .Severity = SAHPI_MAJOR, .EventDataUnion.SensorEvent = { .SensorNum = OA_SOAP_SEN_I2C_BUS, .SensorType = SAHPI_OPERATIONAL, .EventCategory = SAHPI_EC_ENABLE, .Assertion = SAHPI_TRUE, .EventState = SAHPI_ES_DISABLED, .OptionalDataPresent = SAHPI_SOD_CURRENT_STATE | SAHPI_SOD_PREVIOUS_STATE, .TriggerReading = { .IsSupported = SAHPI_FALSE, }, .TriggerThreshold = { .IsSupported = SAHPI_FALSE, }, .PreviousState = SAHPI_ES_ENABLED, .CurrentState = SAHPI_ES_DISABLED, .Oem = 0, .SensorSpecific = 0, }, }, /* Deassert event */ { .EventType = SAHPI_ET_SENSOR, .Severity = SAHPI_MAJOR, .EventDataUnion.SensorEvent = { .SensorNum = OA_SOAP_SEN_I2C_BUS, .SensorType = SAHPI_OPERATIONAL, .EventCategory = SAHPI_EC_ENABLE, .Assertion = SAHPI_FALSE, .EventState = SAHPI_ES_ENABLED, .OptionalDataPresent = SAHPI_SOD_CURRENT_STATE | SAHPI_SOD_PREVIOUS_STATE, .TriggerReading = { .IsSupported = SAHPI_FALSE, }, .TriggerThreshold = { .IsSupported = SAHPI_FALSE, }, .PreviousState = SAHPI_ES_DISABLED, .CurrentState = SAHPI_ES_ENABLED, .Oem = 0, .SensorSpecific = 0, }, }, {}, {}, }, .comment = "i2c buses", }, /* Diagnostic redundancy error sensor */ { .sensor = { .Num = OA_SOAP_SEN_REDUND_ERR, .Type = SAHPI_OPERATIONAL, .Category = SAHPI_EC_ENABLE, .EnableCtrl = SAHPI_TRUE, .EventCtrl = SAHPI_SEC_PER_EVENT, .Events = SAHPI_ES_ENABLED | SAHPI_ES_DISABLED, .DataFormat = { .IsSupported = SAHPI_FALSE, }, .ThresholdDefn = { .IsAccessible = SAHPI_FALSE, }, .Oem = 0, }, .sensor_info = { .current_state = SAHPI_ES_ENABLED, .sensor_enable = SAHPI_TRUE, .event_enable = SAHPI_TRUE, .assert_mask = SAHPI_ES_DISABLED, .deassert_mask = SAHPI_ES_ENABLED, }, .sensor_class = OA_SOAP_DIAG_CLASS, .sen_evt = { /* Assert event */ { .EventType = SAHPI_ET_SENSOR, .Severity = SAHPI_MINOR, .EventDataUnion.SensorEvent = { .SensorNum = OA_SOAP_SEN_REDUND_ERR, .SensorType = SAHPI_OPERATIONAL, .EventCategory = SAHPI_EC_ENABLE, .Assertion = SAHPI_TRUE, .EventState = SAHPI_ES_DISABLED, .OptionalDataPresent = SAHPI_SOD_CURRENT_STATE | SAHPI_SOD_PREVIOUS_STATE, .TriggerReading = { .IsSupported = SAHPI_FALSE, }, .TriggerThreshold = { .IsSupported = SAHPI_FALSE, }, .PreviousState = SAHPI_ES_ENABLED, .CurrentState = SAHPI_ES_DISABLED, .Oem = 0, .SensorSpecific = 0, }, }, /* Deassert event */ { .EventType = SAHPI_ET_SENSOR, .Severity = SAHPI_MINOR, .EventDataUnion.SensorEvent = { .SensorNum = OA_SOAP_SEN_REDUND_ERR, .SensorType = SAHPI_OPERATIONAL, .EventCategory = SAHPI_EC_ENABLE, .Assertion = SAHPI_FALSE, .EventState = SAHPI_ES_ENABLED, .OptionalDataPresent = SAHPI_SOD_CURRENT_STATE | SAHPI_SOD_PREVIOUS_STATE, .TriggerReading = { .IsSupported = SAHPI_FALSE, }, .TriggerThreshold = { .IsSupported = SAHPI_FALSE, }, .PreviousState = SAHPI_ES_DISABLED, .CurrentState = SAHPI_ES_ENABLED, .Oem = 0, .SensorSpecific = 0, }, }, {}, {}, }, .comment = "redundancy error", }, /* Enclosure aggregate operational status sensor */ { .sensor = { .Num = OA_SOAP_SEN_ENC_AGR_OPER, .Type = SAHPI_OPERATIONAL, .Category = SAHPI_EC_ENABLE, .EnableCtrl = SAHPI_TRUE, .EventCtrl = SAHPI_SEC_PER_EVENT, .Events = SAHPI_ES_ENABLED | SAHPI_ES_DISABLED, .DataFormat = { .IsSupported = SAHPI_FALSE, }, .ThresholdDefn = { .IsAccessible = SAHPI_FALSE, }, .Oem = 0, }, .sensor_info = { .current_state = SAHPI_ES_ENABLED, .sensor_enable = SAHPI_TRUE, .event_enable = SAHPI_TRUE, .assert_mask = SAHPI_ES_DISABLED, .deassert_mask = SAHPI_ES_ENABLED, }, .sensor_class = OA_SOAP_ENC_AGR_OPER_CLASS, .sen_evt = { /* Assert event */ { .EventType = SAHPI_ET_SENSOR, .Severity = SAHPI_CRITICAL, .EventDataUnion.SensorEvent = { .SensorNum = OA_SOAP_SEN_ENC_AGR_OPER, .SensorType = SAHPI_OPERATIONAL, .EventCategory = SAHPI_EC_ENABLE, .Assertion = SAHPI_TRUE, .EventState = SAHPI_ES_DISABLED, .OptionalDataPresent = SAHPI_SOD_CURRENT_STATE | SAHPI_SOD_PREVIOUS_STATE, .TriggerReading = { .IsSupported = SAHPI_FALSE, }, .TriggerThreshold = { .IsSupported = SAHPI_FALSE, }, .PreviousState = SAHPI_ES_ENABLED, .CurrentState = SAHPI_ES_DISABLED, .Oem = 0, .SensorSpecific = 0, }, }, /* Deassert event */ { .EventType = SAHPI_ET_SENSOR, .Severity = SAHPI_CRITICAL, .EventDataUnion.SensorEvent = { .SensorNum = OA_SOAP_SEN_ENC_AGR_OPER, .SensorType = SAHPI_OPERATIONAL, .EventCategory = SAHPI_EC_ENABLE, .Assertion = SAHPI_FALSE, .EventState = SAHPI_ES_ENABLED, .OptionalDataPresent = SAHPI_SOD_CURRENT_STATE | SAHPI_SOD_PREVIOUS_STATE, .TriggerReading = { .IsSupported = SAHPI_FALSE, }, .TriggerThreshold = { .IsSupported = SAHPI_FALSE, }, .PreviousState = SAHPI_ES_DISABLED, .CurrentState = SAHPI_ES_ENABLED, .Oem = 0, .SensorSpecific = 0, }, }, {}, {}, }, .comment = "Enclosure aggregate operational status", }, /* Enclosure aggregate predictive failure sensor */ { .sensor = { .Num = OA_SOAP_SEN_ENC_AGR_PRED_FAIL, .Type = SAHPI_OPERATIONAL, .Category = SAHPI_EC_ENABLE, .EnableCtrl = SAHPI_TRUE, .EventCtrl = SAHPI_SEC_PER_EVENT, .Events = SAHPI_ES_ENABLED | SAHPI_ES_DISABLED, .DataFormat = { .IsSupported = SAHPI_FALSE, }, .ThresholdDefn = { .IsAccessible = SAHPI_FALSE, }, .Oem = 0, }, .sensor_info = { .current_state = SAHPI_ES_ENABLED, .sensor_enable = SAHPI_TRUE, .event_enable = SAHPI_TRUE, .assert_mask = SAHPI_ES_DISABLED, .deassert_mask = SAHPI_ES_ENABLED, }, .sensor_class = OA_SOAP_ENC_AGR_PRED_FAIL_CLASS, .sen_evt = { /* Assert event */ { .EventType = SAHPI_ET_SENSOR, .Severity = SAHPI_MAJOR, .EventDataUnion.SensorEvent = { .SensorNum = OA_SOAP_SEN_ENC_AGR_PRED_FAIL, .SensorType = SAHPI_OPERATIONAL, .EventCategory = SAHPI_EC_ENABLE, .Assertion = SAHPI_TRUE, .EventState = SAHPI_ES_DISABLED, .OptionalDataPresent = SAHPI_SOD_CURRENT_STATE | SAHPI_SOD_PREVIOUS_STATE, .TriggerReading = { .IsSupported = SAHPI_FALSE, }, .TriggerThreshold = { .IsSupported = SAHPI_FALSE, }, .PreviousState = SAHPI_ES_ENABLED, .CurrentState = SAHPI_ES_DISABLED, .Oem = 0, .SensorSpecific = 0, }, }, /* Deassert event */ { .EventType = SAHPI_ET_SENSOR, .Severity = SAHPI_MAJOR, .EventDataUnion.SensorEvent = { .SensorNum = OA_SOAP_SEN_ENC_AGR_PRED_FAIL, .SensorType = SAHPI_OPERATIONAL, .EventCategory = SAHPI_EC_ENABLE, .Assertion = SAHPI_FALSE, .EventState = SAHPI_ES_ENABLED, .OptionalDataPresent = SAHPI_SOD_CURRENT_STATE | SAHPI_SOD_PREVIOUS_STATE, .TriggerReading = { .IsSupported = SAHPI_FALSE, }, .TriggerThreshold = { .IsSupported = SAHPI_FALSE, }, .PreviousState = SAHPI_ES_DISABLED, .CurrentState = SAHPI_ES_ENABLED, .Oem = 0, .SensorSpecific = 0, }, }, {}, {}, }, .comment = "Enclosure aggregate predictive failure", }, /* OA redundancy sensor */ { .sensor = { .Num = OA_SOAP_SEN_OA_REDUND, .Type = SAHPI_OPERATIONAL, .Category = SAHPI_EC_ENABLE, .EnableCtrl = SAHPI_TRUE, .EventCtrl = SAHPI_SEC_PER_EVENT, .Events = SAHPI_ES_ENABLED | SAHPI_ES_DISABLED, .DataFormat = { .IsSupported = SAHPI_FALSE, }, .ThresholdDefn = { .IsAccessible = SAHPI_FALSE, }, .Oem = 0, }, .sensor_info = { .current_state = SAHPI_ES_ENABLED, .sensor_enable = SAHPI_TRUE, .event_enable = SAHPI_TRUE, .assert_mask = SAHPI_ES_DISABLED, .deassert_mask = SAHPI_ES_ENABLED, }, .sensor_class = OA_SOAP_BOOL_CLASS, .sen_evt = { /* Assert event */ { .EventType = SAHPI_ET_SENSOR, .Severity = SAHPI_MAJOR, .EventDataUnion.SensorEvent = { .SensorNum = OA_SOAP_SEN_OA_REDUND, .SensorType = SAHPI_OPERATIONAL, .EventCategory = SAHPI_EC_ENABLE, .Assertion = SAHPI_TRUE, .EventState = SAHPI_ES_DISABLED, .OptionalDataPresent = SAHPI_SOD_CURRENT_STATE | SAHPI_SOD_PREVIOUS_STATE, .TriggerReading = { .IsSupported = SAHPI_FALSE, }, .TriggerThreshold = { .IsSupported = SAHPI_FALSE, }, .PreviousState = SAHPI_ES_ENABLED, .CurrentState = SAHPI_ES_DISABLED, .Oem = 0, .SensorSpecific = 0, }, }, /* Deassert event */ { .EventType = SAHPI_ET_SENSOR, .Severity = SAHPI_MAJOR, .EventDataUnion.SensorEvent = { .SensorNum = OA_SOAP_SEN_OA_REDUND, .SensorType = SAHPI_OPERATIONAL, .EventCategory = SAHPI_EC_ENABLE, .Assertion = SAHPI_FALSE, .EventState = SAHPI_ES_ENABLED, .OptionalDataPresent = SAHPI_SOD_CURRENT_STATE | SAHPI_SOD_PREVIOUS_STATE, .TriggerReading = { .IsSupported = SAHPI_FALSE, }, .TriggerThreshold = { .IsSupported = SAHPI_FALSE, }, .PreviousState = SAHPI_ES_DISABLED, .CurrentState = SAHPI_ES_ENABLED, .Oem = 0, .SensorSpecific = 0, }, }, {}, {}, }, .comment = "OA Redundancy", }, /* OA link status sensor */ { .sensor = { .Num = OA_SOAP_SEN_OA_LINK_STATUS, .Type = SAHPI_OPERATIONAL, .Category = SAHPI_EC_ENABLE, .EnableCtrl = SAHPI_TRUE, .EventCtrl = SAHPI_SEC_PER_EVENT, .Events = SAHPI_ES_ENABLED | SAHPI_ES_DISABLED, .DataFormat = { .IsSupported = SAHPI_FALSE, }, .ThresholdDefn = { .IsAccessible = SAHPI_FALSE, }, .Oem = 0, }, .sensor_info = { .current_state = SAHPI_ES_ENABLED, .sensor_enable = SAHPI_TRUE, .event_enable = SAHPI_TRUE, .assert_mask = SAHPI_ES_DISABLED, .deassert_mask = SAHPI_ES_ENABLED, }, .sensor_class = OA_SOAP_BOOL_CLASS, .sen_evt = { /* Assert event */ { .EventType = SAHPI_ET_SENSOR, .Severity = SAHPI_CRITICAL, .EventDataUnion.SensorEvent = { .SensorNum = OA_SOAP_SEN_OA_LINK_STATUS, .SensorType = SAHPI_OPERATIONAL, .EventCategory = SAHPI_EC_ENABLE, .Assertion = SAHPI_TRUE, .EventState = SAHPI_ES_DISABLED, .OptionalDataPresent = SAHPI_SOD_CURRENT_STATE | SAHPI_SOD_PREVIOUS_STATE, .TriggerReading = { .IsSupported = SAHPI_FALSE, }, .TriggerThreshold = { .IsSupported = SAHPI_FALSE, }, .PreviousState = SAHPI_ES_ENABLED, .CurrentState = SAHPI_ES_DISABLED, .Oem = 0, .SensorSpecific = 0, }, }, /* Deassert event */ { .EventType = SAHPI_ET_SENSOR, .Severity = SAHPI_CRITICAL, .EventDataUnion.SensorEvent = { .SensorNum = OA_SOAP_SEN_OA_LINK_STATUS, .SensorType = SAHPI_OPERATIONAL, .EventCategory = SAHPI_EC_ENABLE, .Assertion = SAHPI_FALSE, .EventState = SAHPI_ES_ENABLED, .OptionalDataPresent = SAHPI_SOD_CURRENT_STATE | SAHPI_SOD_PREVIOUS_STATE, .TriggerReading = { .IsSupported = SAHPI_FALSE, }, .TriggerThreshold = { .IsSupported = SAHPI_FALSE, }, .PreviousState = SAHPI_ES_DISABLED, .CurrentState = SAHPI_ES_ENABLED, .Oem = 0, .SensorSpecific = 0, }, }, {}, {}, }, .comment = "OA link status", }, /* Interconnect CPU fault sensor */ { .sensor = { .Num = OA_SOAP_SEN_CPU_FAULT, .Type = SAHPI_OPERATIONAL, .Category = SAHPI_EC_ENABLE, .EnableCtrl = SAHPI_TRUE, .EventCtrl = SAHPI_SEC_PER_EVENT, .Events = SAHPI_ES_ENABLED | SAHPI_ES_DISABLED, .DataFormat = { .IsSupported = SAHPI_FALSE, }, .ThresholdDefn = { .IsAccessible = SAHPI_FALSE, }, .Oem = 0, }, .sensor_info = { .current_state = SAHPI_ES_ENABLED, .sensor_enable = SAHPI_TRUE, .event_enable = SAHPI_TRUE, .assert_mask = SAHPI_ES_DISABLED, .deassert_mask = SAHPI_ES_ENABLED, }, .sensor_class = OA_SOAP_BOOL_RVRS_CLASS, .sen_evt = { /* Assert event */ { .EventType = SAHPI_ET_SENSOR, .Severity = SAHPI_CRITICAL, .EventDataUnion.SensorEvent = { .SensorNum = OA_SOAP_SEN_CPU_FAULT, .SensorType = SAHPI_OPERATIONAL, .EventCategory = SAHPI_EC_ENABLE, .Assertion = SAHPI_TRUE, .EventState = SAHPI_ES_DISABLED, .OptionalDataPresent = SAHPI_SOD_CURRENT_STATE | SAHPI_SOD_PREVIOUS_STATE, .TriggerReading = { .IsSupported = SAHPI_FALSE, }, .TriggerThreshold = { .IsSupported = SAHPI_FALSE, }, .PreviousState = SAHPI_ES_ENABLED, .CurrentState = SAHPI_ES_DISABLED, .Oem = 0, .SensorSpecific = 0, }, }, /* Deassert event */ { .EventType = SAHPI_ET_SENSOR, .Severity = SAHPI_CRITICAL, .EventDataUnion.SensorEvent = { .SensorNum = OA_SOAP_SEN_CPU_FAULT, .SensorType = SAHPI_OPERATIONAL, .EventCategory = SAHPI_EC_ENABLE, .Assertion = SAHPI_FALSE, .EventState = SAHPI_ES_ENABLED, .OptionalDataPresent = SAHPI_SOD_CURRENT_STATE | SAHPI_SOD_PREVIOUS_STATE, .TriggerReading = { .IsSupported = SAHPI_FALSE, }, .TriggerThreshold = { .IsSupported = SAHPI_FALSE, }, .PreviousState = SAHPI_ES_DISABLED, .CurrentState = SAHPI_ES_ENABLED, .Oem = 0, .SensorSpecific = 0, }, }, {}, {}, }, .comment = "Interconnect CPU Fault", }, /* Interconnect health LED sensor */ { .sensor = { .Num = OA_SOAP_SEN_HEALTH_LED, .Type = SAHPI_OPERATIONAL, .Category = SAHPI_EC_ENABLE, .EnableCtrl = SAHPI_TRUE, .EventCtrl = SAHPI_SEC_PER_EVENT, .Events = SAHPI_ES_ENABLED | SAHPI_ES_DISABLED, .DataFormat = { .IsSupported = SAHPI_FALSE, }, .ThresholdDefn = { .IsAccessible = SAHPI_FALSE, }, .Oem = 0, }, .sensor_info = { .current_state = SAHPI_ES_ENABLED, .sensor_enable = SAHPI_TRUE, .event_enable = SAHPI_TRUE, .assert_mask = SAHPI_ES_DISABLED, .deassert_mask = SAHPI_ES_ENABLED, }, .sensor_class = OA_SOAP_BOOL_RVRS_CLASS, .sen_evt = { /* Assert event */ { .EventType = SAHPI_ET_SENSOR, .Severity = SAHPI_MINOR, .EventDataUnion.SensorEvent = { .SensorNum = OA_SOAP_SEN_HEALTH_LED, .SensorType = SAHPI_OPERATIONAL, .EventCategory = SAHPI_EC_ENABLE, .Assertion = SAHPI_TRUE, .EventState = SAHPI_ES_DISABLED, .OptionalDataPresent = SAHPI_SOD_CURRENT_STATE | SAHPI_SOD_PREVIOUS_STATE, .TriggerReading = { .IsSupported = SAHPI_FALSE, }, .TriggerThreshold = { .IsSupported = SAHPI_FALSE, }, .PreviousState = SAHPI_ES_ENABLED, .CurrentState = SAHPI_ES_DISABLED, .Oem = 0, .SensorSpecific = 0, }, }, /* Deassert event */ { .EventType = SAHPI_ET_SENSOR, .Severity = SAHPI_MINOR, .EventDataUnion.SensorEvent = { .SensorNum = OA_SOAP_SEN_HEALTH_LED, .SensorType = SAHPI_OPERATIONAL, .EventCategory = SAHPI_EC_ENABLE, .Assertion = SAHPI_FALSE, .EventState = SAHPI_ES_ENABLED, .OptionalDataPresent = SAHPI_SOD_CURRENT_STATE | SAHPI_SOD_PREVIOUS_STATE, .TriggerReading = { .IsSupported = SAHPI_FALSE, }, .TriggerThreshold = { .IsSupported = SAHPI_FALSE, }, .PreviousState = SAHPI_ES_DISABLED, .CurrentState = SAHPI_ES_ENABLED, .Oem = 0, .SensorSpecific = 0, }, }, {}, {}, }, .comment = "Interconnect health LED", }, /* Health status operational sensor */ { .sensor = { .Num = OA_SOAP_SEN_HEALTH_OPER, .Type = SAHPI_OPERATIONAL, .Category = SAHPI_EC_ENABLE, .EnableCtrl = SAHPI_TRUE, .EventCtrl = SAHPI_SEC_PER_EVENT, .Events = SAHPI_ES_ENABLED | SAHPI_ES_DISABLED, .DataFormat = { .IsSupported = SAHPI_FALSE, }, .ThresholdDefn = { .IsAccessible = SAHPI_FALSE, }, .Oem = 0, }, .sensor_info = { .current_state = SAHPI_ES_ENABLED, .sensor_enable = SAHPI_TRUE, .event_enable = SAHPI_TRUE, .assert_mask = SAHPI_ES_DISABLED, .deassert_mask = SAHPI_ES_ENABLED, }, .sensor_class = OA_SOAP_HEALTH_OPER_CLASS, .sen_evt = { /* Assert event */ { .EventType = SAHPI_ET_SENSOR, .Severity = SAHPI_CRITICAL, .EventDataUnion.SensorEvent = { .SensorNum = OA_SOAP_SEN_HEALTH_OPER, .SensorType = SAHPI_OPERATIONAL, .EventCategory = SAHPI_EC_ENABLE, .Assertion = SAHPI_TRUE, .EventState = SAHPI_ES_DISABLED, .OptionalDataPresent = SAHPI_SOD_CURRENT_STATE | SAHPI_SOD_PREVIOUS_STATE, .TriggerReading = { .IsSupported = SAHPI_FALSE, }, .TriggerThreshold = { .IsSupported = SAHPI_FALSE, }, .PreviousState = SAHPI_ES_ENABLED, .CurrentState = SAHPI_ES_DISABLED, .Oem = 0, .SensorSpecific = 0, }, }, /* Deassert event */ { .EventType = SAHPI_ET_SENSOR, .Severity = SAHPI_CRITICAL, .EventDataUnion.SensorEvent = { .SensorNum = OA_SOAP_SEN_HEALTH_OPER, .SensorType = SAHPI_OPERATIONAL, .EventCategory = SAHPI_EC_ENABLE, .Assertion = SAHPI_FALSE, .EventState = SAHPI_ES_ENABLED, .OptionalDataPresent = SAHPI_SOD_CURRENT_STATE | SAHPI_SOD_PREVIOUS_STATE, .TriggerReading = { .IsSupported = SAHPI_FALSE, }, .TriggerThreshold = { .IsSupported = SAHPI_FALSE, }, .PreviousState = SAHPI_ES_DISABLED, .CurrentState = SAHPI_ES_ENABLED, .Oem = 0, .SensorSpecific = 0, }, }, {}, {}, }, .comment = "Health status operational", }, /* Health status predictive failure sensor */ { .sensor = { .Num = OA_SOAP_SEN_HEALTH_PRED_FAIL, .Type = SAHPI_OPERATIONAL, .Category = SAHPI_EC_ENABLE, .EnableCtrl = SAHPI_TRUE, .EventCtrl = SAHPI_SEC_PER_EVENT, .Events = SAHPI_ES_ENABLED | SAHPI_ES_DISABLED, .DataFormat = { .IsSupported = SAHPI_FALSE, }, .ThresholdDefn = { .IsAccessible = SAHPI_FALSE, }, .Oem = 0, }, .sensor_info = { .current_state = SAHPI_ES_ENABLED, .sensor_enable = SAHPI_TRUE, .event_enable = SAHPI_TRUE, .assert_mask = SAHPI_ES_DISABLED, .deassert_mask = SAHPI_ES_ENABLED, }, .sensor_class = OA_SOAP_HEALTH_PRED_FAIL_CLASS, .sen_evt = { /* Assert event */ { .EventType = SAHPI_ET_SENSOR, .Severity = SAHPI_MAJOR, .EventDataUnion.SensorEvent = { .SensorNum = OA_SOAP_SEN_HEALTH_PRED_FAIL, .SensorType = SAHPI_OPERATIONAL, .EventCategory = SAHPI_EC_ENABLE, .Assertion = SAHPI_TRUE, .EventState = SAHPI_ES_DISABLED, .OptionalDataPresent = SAHPI_SOD_CURRENT_STATE | SAHPI_SOD_PREVIOUS_STATE, .TriggerReading = { .IsSupported = SAHPI_FALSE, }, .TriggerThreshold = { .IsSupported = SAHPI_FALSE, }, .PreviousState = SAHPI_ES_ENABLED, .CurrentState = SAHPI_ES_DISABLED, .Oem = 0, .SensorSpecific = 0, }, }, /* Deassert event */ { .EventType = SAHPI_ET_SENSOR, .Severity = SAHPI_MAJOR, .EventDataUnion.SensorEvent = { .SensorNum = OA_SOAP_SEN_HEALTH_PRED_FAIL, .SensorType = SAHPI_OPERATIONAL, .EventCategory = SAHPI_EC_ENABLE, .Assertion = SAHPI_FALSE, .EventState = SAHPI_ES_ENABLED, .OptionalDataPresent = SAHPI_SOD_CURRENT_STATE | SAHPI_SOD_PREVIOUS_STATE, .TriggerReading = { .IsSupported = SAHPI_FALSE, }, .TriggerThreshold = { .IsSupported = SAHPI_FALSE, }, .PreviousState = SAHPI_ES_DISABLED, .CurrentState = SAHPI_ES_ENABLED, .Oem = 0, .SensorSpecific = 0, }, }, {}, {}, }, .comment = "Health status predictive failure", }, /* DiagnosticChecksEx Device missing sensor */ { .sensor = { .Num = OA_SOAP_SEN_DEV_MISS, .Type = SAHPI_OPERATIONAL, .Category = SAHPI_EC_ENABLE, .EnableCtrl = SAHPI_TRUE, .EventCtrl = SAHPI_SEC_PER_EVENT, .Events = SAHPI_ES_ENABLED | SAHPI_ES_DISABLED, .DataFormat = { .IsSupported = SAHPI_FALSE, }, .ThresholdDefn = { .IsAccessible = SAHPI_FALSE, }, .Oem = 0, }, .sensor_info = { .current_state = SAHPI_ES_ENABLED, .sensor_enable = SAHPI_TRUE, .event_enable = SAHPI_TRUE, .assert_mask = SAHPI_ES_DISABLED, .deassert_mask = SAHPI_ES_ENABLED, }, .sensor_class = OA_SOAP_DIAG_CLASS, .sen_evt = { /* Assert event */ { .EventType = SAHPI_ET_SENSOR, .Severity = SAHPI_MAJOR, .EventDataUnion.SensorEvent = { .SensorNum = OA_SOAP_SEN_DEV_MISS, .SensorType = SAHPI_OPERATIONAL, .EventCategory = SAHPI_EC_ENABLE, .Assertion = SAHPI_TRUE, .EventState = SAHPI_ES_DISABLED, .OptionalDataPresent = SAHPI_SOD_CURRENT_STATE | SAHPI_SOD_PREVIOUS_STATE, .TriggerReading = { .IsSupported = SAHPI_FALSE, }, .TriggerThreshold = { .IsSupported = SAHPI_FALSE, }, .PreviousState = SAHPI_ES_ENABLED, .CurrentState = SAHPI_ES_DISABLED, .Oem = 0, .SensorSpecific = 0, }, }, /* Deassert event */ { .EventType = SAHPI_ET_SENSOR, .Severity = SAHPI_MAJOR, .EventDataUnion.SensorEvent = { .SensorNum = OA_SOAP_SEN_DEV_MISS, .SensorType = SAHPI_OPERATIONAL, .EventCategory = SAHPI_EC_ENABLE, .Assertion = SAHPI_FALSE, .EventState = SAHPI_ES_ENABLED, .OptionalDataPresent = SAHPI_SOD_CURRENT_STATE | SAHPI_SOD_PREVIOUS_STATE, .TriggerReading = { .IsSupported = SAHPI_FALSE, }, .TriggerThreshold = { .IsSupported = SAHPI_FALSE, }, .PreviousState = SAHPI_ES_DISABLED, .CurrentState = SAHPI_ES_ENABLED, .Oem = 0, .SensorSpecific = 0, }, }, {}, {}, }, .comment = "Device missing", }, /* DiagnosticChecksEx Device power sequence sensor */ { .sensor = { .Num = OA_SOAP_SEN_DEV_PWR_SEQ, .Type = SAHPI_OPERATIONAL, .Category = SAHPI_EC_ENABLE, .EnableCtrl = SAHPI_TRUE, .EventCtrl = SAHPI_SEC_PER_EVENT, .Events = SAHPI_ES_ENABLED | SAHPI_ES_DISABLED, .DataFormat = { .IsSupported = SAHPI_FALSE, }, .ThresholdDefn = { .IsAccessible = SAHPI_FALSE, }, .Oem = 0, }, .sensor_info = { .current_state = SAHPI_ES_ENABLED, .sensor_enable = SAHPI_TRUE, .event_enable = SAHPI_TRUE, .assert_mask = SAHPI_ES_DISABLED, .deassert_mask = SAHPI_ES_ENABLED, }, .sensor_class = OA_SOAP_DIAG_CLASS, .sen_evt = { /* Assert event */ { .EventType = SAHPI_ET_SENSOR, .Severity = SAHPI_MAJOR, .EventDataUnion.SensorEvent = { .SensorNum = OA_SOAP_SEN_DEV_PWR_SEQ, .SensorType = SAHPI_OPERATIONAL, .EventCategory = SAHPI_EC_ENABLE, .Assertion = SAHPI_TRUE, .EventState = SAHPI_ES_DISABLED, .OptionalDataPresent = SAHPI_SOD_CURRENT_STATE | SAHPI_SOD_PREVIOUS_STATE, .TriggerReading = { .IsSupported = SAHPI_FALSE, }, .TriggerThreshold = { .IsSupported = SAHPI_FALSE, }, .PreviousState = SAHPI_ES_ENABLED, .CurrentState = SAHPI_ES_DISABLED, .Oem = 0, .SensorSpecific = 0, }, }, /* Deassert event */ { .EventType = SAHPI_ET_SENSOR, .Severity = SAHPI_MAJOR, .EventDataUnion.SensorEvent = { .SensorNum = OA_SOAP_SEN_DEV_PWR_SEQ, .SensorType = SAHPI_OPERATIONAL, .EventCategory = SAHPI_EC_ENABLE, .Assertion = SAHPI_FALSE, .EventState = SAHPI_ES_ENABLED, .OptionalDataPresent = SAHPI_SOD_CURRENT_STATE | SAHPI_SOD_PREVIOUS_STATE, .TriggerReading = { .IsSupported = SAHPI_FALSE, }, .TriggerThreshold = { .IsSupported = SAHPI_FALSE, }, .PreviousState = SAHPI_ES_DISABLED, .CurrentState = SAHPI_ES_ENABLED, .Oem = 0, .SensorSpecific = 0, }, }, {}, {}, }, .comment = "Device power sequence", }, /* DiagnosticChecksEx Device bonding sensor */ { .sensor = { .Num = OA_SOAP_SEN_DEV_BOND, .Type = SAHPI_OPERATIONAL, .Category = SAHPI_EC_ENABLE, .EnableCtrl = SAHPI_TRUE, .EventCtrl = SAHPI_SEC_PER_EVENT, .Events = SAHPI_ES_ENABLED | SAHPI_ES_DISABLED, .DataFormat = { .IsSupported = SAHPI_FALSE, }, .ThresholdDefn = { .IsAccessible = SAHPI_FALSE, }, .Oem = 0, }, .sensor_info = { .current_state = SAHPI_ES_ENABLED, .sensor_enable = SAHPI_TRUE, .event_enable = SAHPI_TRUE, .assert_mask = SAHPI_ES_DISABLED, .deassert_mask = SAHPI_ES_ENABLED, }, .sensor_class = OA_SOAP_DIAG_CLASS, .sen_evt = { /* Assert event */ { .EventType = SAHPI_ET_SENSOR, .Severity = SAHPI_MAJOR, .EventDataUnion.SensorEvent = { .SensorNum = OA_SOAP_SEN_DEV_BOND, .SensorType = SAHPI_OPERATIONAL, .EventCategory = SAHPI_EC_ENABLE, .Assertion = SAHPI_TRUE, .EventState = SAHPI_ES_DISABLED, .OptionalDataPresent = SAHPI_SOD_CURRENT_STATE | SAHPI_SOD_PREVIOUS_STATE, .TriggerReading = { .IsSupported = SAHPI_FALSE, }, .TriggerThreshold = { .IsSupported = SAHPI_FALSE, }, .PreviousState = SAHPI_ES_ENABLED, .CurrentState = SAHPI_ES_DISABLED, .Oem = 0, .SensorSpecific = 0, }, }, /* Deassert event */ { .EventType = SAHPI_ET_SENSOR, .Severity = SAHPI_MAJOR, .EventDataUnion.SensorEvent = { .SensorNum = OA_SOAP_SEN_DEV_BOND, .SensorType = SAHPI_OPERATIONAL, .EventCategory = SAHPI_EC_ENABLE, .Assertion = SAHPI_FALSE, .EventState = SAHPI_ES_ENABLED, .OptionalDataPresent = SAHPI_SOD_CURRENT_STATE | SAHPI_SOD_PREVIOUS_STATE, .TriggerReading = { .IsSupported = SAHPI_FALSE, }, .TriggerThreshold = { .IsSupported = SAHPI_FALSE, }, .PreviousState = SAHPI_ES_DISABLED, .CurrentState = SAHPI_ES_ENABLED, .Oem = 0, .SensorSpecific = 0, }, }, {}, {}, }, .comment = "Device bonding", }, /* DiagnosticChecksEx network configuration sensor */ { .sensor = { .Num = OA_SOAP_SEN_NET_CONFIG, .Type = SAHPI_OPERATIONAL, .Category = SAHPI_EC_ENABLE, .EnableCtrl = SAHPI_TRUE, .EventCtrl = SAHPI_SEC_PER_EVENT, .Events = SAHPI_ES_ENABLED | SAHPI_ES_DISABLED, .DataFormat = { .IsSupported = SAHPI_FALSE, }, .ThresholdDefn = { .IsAccessible = SAHPI_FALSE, }, .Oem = 0, }, .sensor_info = { .current_state = SAHPI_ES_ENABLED, .sensor_enable = SAHPI_TRUE, .event_enable = SAHPI_TRUE, .assert_mask = SAHPI_ES_DISABLED, .deassert_mask = SAHPI_ES_ENABLED, }, .sensor_class = OA_SOAP_DIAG_CLASS, .sen_evt = { /* Assert event */ { .EventType = SAHPI_ET_SENSOR, .Severity = SAHPI_MAJOR, .EventDataUnion.SensorEvent = { .SensorNum = OA_SOAP_SEN_NET_CONFIG, .SensorType = SAHPI_OPERATIONAL, .EventCategory = SAHPI_EC_ENABLE, .Assertion = SAHPI_TRUE, .EventState = SAHPI_ES_DISABLED, .OptionalDataPresent = SAHPI_SOD_CURRENT_STATE | SAHPI_SOD_PREVIOUS_STATE, .TriggerReading = { .IsSupported = SAHPI_FALSE, }, .TriggerThreshold = { .IsSupported = SAHPI_FALSE, }, .PreviousState = SAHPI_ES_ENABLED, .CurrentState = SAHPI_ES_DISABLED, .Oem = 0, .SensorSpecific = 0, }, }, /* Deassert event */ { .EventType = SAHPI_ET_SENSOR, .Severity = SAHPI_MAJOR, .EventDataUnion.SensorEvent = { .SensorNum = OA_SOAP_SEN_NET_CONFIG, .SensorType = SAHPI_OPERATIONAL, .EventCategory = SAHPI_EC_ENABLE, .Assertion = SAHPI_FALSE, .EventState = SAHPI_ES_ENABLED, .OptionalDataPresent = SAHPI_SOD_CURRENT_STATE | SAHPI_SOD_PREVIOUS_STATE, .TriggerReading = { .IsSupported = SAHPI_FALSE, }, .TriggerThreshold = { .IsSupported = SAHPI_FALSE, }, .PreviousState = SAHPI_ES_DISABLED, .CurrentState = SAHPI_ES_ENABLED, .Oem = 0, .SensorSpecific = 0, }, }, {}, {}, }, .comment = "Network configuration", }, /* DiagnosticChecksEx firmware mismatch sensor */ { .sensor = { .Num = OA_SOAP_SEN_FW_MISMATCH, .Type = SAHPI_OPERATIONAL, .Category = SAHPI_EC_ENABLE, .EnableCtrl = SAHPI_TRUE, .EventCtrl = SAHPI_SEC_PER_EVENT, .Events = SAHPI_ES_ENABLED | SAHPI_ES_DISABLED, .DataFormat = { .IsSupported = SAHPI_FALSE, }, .ThresholdDefn = { .IsAccessible = SAHPI_FALSE, }, .Oem = 0, }, .sensor_info = { .current_state = SAHPI_ES_ENABLED, .sensor_enable = SAHPI_TRUE, .event_enable = SAHPI_TRUE, .assert_mask = SAHPI_ES_DISABLED, .deassert_mask = SAHPI_ES_ENABLED, }, .sensor_class = OA_SOAP_DIAG_CLASS, .sen_evt = { /* Assert event */ { .EventType = SAHPI_ET_SENSOR, .Severity = SAHPI_MAJOR, .EventDataUnion.SensorEvent = { .SensorNum = OA_SOAP_SEN_FW_MISMATCH, .SensorType = SAHPI_OPERATIONAL, .EventCategory = SAHPI_EC_ENABLE, .Assertion = SAHPI_TRUE, .EventState = SAHPI_ES_DISABLED, .OptionalDataPresent = SAHPI_SOD_CURRENT_STATE | SAHPI_SOD_PREVIOUS_STATE, .TriggerReading = { .IsSupported = SAHPI_FALSE, }, .TriggerThreshold = { .IsSupported = SAHPI_FALSE, }, .PreviousState = SAHPI_ES_ENABLED, .CurrentState = SAHPI_ES_DISABLED, .Oem = 0, .SensorSpecific = 0, }, }, /* Deassert event */ { .EventType = SAHPI_ET_SENSOR, .Severity = SAHPI_MAJOR, .EventDataUnion.SensorEvent = { .SensorNum = OA_SOAP_SEN_FW_MISMATCH, .SensorType = SAHPI_OPERATIONAL, .EventCategory = SAHPI_EC_ENABLE, .Assertion = SAHPI_FALSE, .EventState = SAHPI_ES_ENABLED, .OptionalDataPresent = SAHPI_SOD_CURRENT_STATE | SAHPI_SOD_PREVIOUS_STATE, .TriggerReading = { .IsSupported = SAHPI_FALSE, }, .TriggerThreshold = { .IsSupported = SAHPI_FALSE, }, .PreviousState = SAHPI_ES_DISABLED, .CurrentState = SAHPI_ES_ENABLED, .Oem = 0, .SensorSpecific = 0, }, }, {}, {}, }, .comment = "Firmwre mismatch", }, /* DiagnosticChecksEx Profile unassigned error sensor */ { .sensor = { .Num = OA_SOAP_SEN_PROF_UNASSIGN_ERR, .Type = SAHPI_OPERATIONAL, .Category = SAHPI_EC_ENABLE, .EnableCtrl = SAHPI_TRUE, .EventCtrl = SAHPI_SEC_PER_EVENT, .Events = SAHPI_ES_ENABLED | SAHPI_ES_DISABLED, .DataFormat = { .IsSupported = SAHPI_FALSE, }, .ThresholdDefn = { .IsAccessible = SAHPI_FALSE, }, .Oem = 0, }, .sensor_info = { .current_state = SAHPI_ES_ENABLED, .sensor_enable = SAHPI_TRUE, .event_enable = SAHPI_TRUE, .assert_mask = SAHPI_ES_DISABLED, .deassert_mask = SAHPI_ES_ENABLED, }, .sensor_class = OA_SOAP_DIAG_CLASS, .sen_evt = { /* Assert event */ { .EventType = SAHPI_ET_SENSOR, .Severity = SAHPI_MAJOR, .EventDataUnion.SensorEvent = { .SensorNum = OA_SOAP_SEN_PROF_UNASSIGN_ERR, .SensorType = SAHPI_OPERATIONAL, .EventCategory = SAHPI_EC_ENABLE, .Assertion = SAHPI_TRUE, .EventState = SAHPI_ES_DISABLED, .OptionalDataPresent = SAHPI_SOD_CURRENT_STATE | SAHPI_SOD_PREVIOUS_STATE, .TriggerReading = { .IsSupported = SAHPI_FALSE, }, .TriggerThreshold = { .IsSupported = SAHPI_FALSE, }, .PreviousState = SAHPI_ES_ENABLED, .CurrentState = SAHPI_ES_DISABLED, .Oem = 0, .SensorSpecific = 0, }, }, /* Deassert event */ { .EventType = SAHPI_ET_SENSOR, .Severity = SAHPI_MAJOR, .EventDataUnion.SensorEvent = { .SensorNum = OA_SOAP_SEN_PROF_UNASSIGN_ERR, .SensorType = SAHPI_OPERATIONAL, .EventCategory = SAHPI_EC_ENABLE, .Assertion = SAHPI_FALSE, .EventState = SAHPI_ES_ENABLED, .OptionalDataPresent = SAHPI_SOD_CURRENT_STATE | SAHPI_SOD_PREVIOUS_STATE, .TriggerReading = { .IsSupported = SAHPI_FALSE, }, .TriggerThreshold = { .IsSupported = SAHPI_FALSE, }, .PreviousState = SAHPI_ES_DISABLED, .CurrentState = SAHPI_ES_ENABLED, .Oem = 0, .SensorSpecific = 0, }, }, {}, {}, }, .comment = "Profile unassigned error", }, /* DiagnosticChecksEx Device not supported sensor */ { .sensor = { .Num = OA_SOAP_SEN_DEV_NOT_SUPPORT, .Type = SAHPI_OPERATIONAL, .Category = SAHPI_EC_ENABLE, .EnableCtrl = SAHPI_TRUE, .EventCtrl = SAHPI_SEC_PER_EVENT, .Events = SAHPI_ES_ENABLED | SAHPI_ES_DISABLED, .DataFormat = { .IsSupported = SAHPI_FALSE, }, .ThresholdDefn = { .IsAccessible = SAHPI_FALSE, }, .Oem = 0, }, .sensor_info = { .current_state = SAHPI_ES_ENABLED, .sensor_enable = SAHPI_TRUE, .event_enable = SAHPI_TRUE, .assert_mask = SAHPI_ES_DISABLED, .deassert_mask = SAHPI_ES_ENABLED, }, .sensor_class = OA_SOAP_DIAG_CLASS, .sen_evt = { /* Assert event */ { .EventType = SAHPI_ET_SENSOR, .Severity = SAHPI_MAJOR, .EventDataUnion.SensorEvent = { .SensorNum = OA_SOAP_SEN_DEV_NOT_SUPPORT, .SensorType = SAHPI_OPERATIONAL, .EventCategory = SAHPI_EC_ENABLE, .Assertion = SAHPI_TRUE, .EventState = SAHPI_ES_DISABLED, .OptionalDataPresent = SAHPI_SOD_CURRENT_STATE | SAHPI_SOD_PREVIOUS_STATE, .TriggerReading = { .IsSupported = SAHPI_FALSE, }, .TriggerThreshold = { .IsSupported = SAHPI_FALSE, }, .PreviousState = SAHPI_ES_ENABLED, .CurrentState = SAHPI_ES_DISABLED, .Oem = 0, .SensorSpecific = 0, }, }, /* Deassert event */ { .EventType = SAHPI_ET_SENSOR, .Severity = SAHPI_MAJOR, .EventDataUnion.SensorEvent = { .SensorNum = OA_SOAP_SEN_DEV_NOT_SUPPORT, .SensorType = SAHPI_OPERATIONAL, .EventCategory = SAHPI_EC_ENABLE, .Assertion = SAHPI_FALSE, .EventState = SAHPI_ES_ENABLED, .OptionalDataPresent = SAHPI_SOD_CURRENT_STATE | SAHPI_SOD_PREVIOUS_STATE, .TriggerReading = { .IsSupported = SAHPI_FALSE, }, .TriggerThreshold = { .IsSupported = SAHPI_FALSE, }, .PreviousState = SAHPI_ES_DISABLED, .CurrentState = SAHPI_ES_ENABLED, .Oem = 0, .SensorSpecific = 0, }, }, {}, {}, }, .comment = "Device not supported", }, /* DiagnosticChecksEx Too low power request sensor */ { .sensor = { .Num = OA_SOAP_SEN_TOO_LOW_PWR_REQ, .Type = SAHPI_OPERATIONAL, .Category = SAHPI_EC_ENABLE, .EnableCtrl = SAHPI_TRUE, .EventCtrl = SAHPI_SEC_PER_EVENT, .Events = SAHPI_ES_ENABLED | SAHPI_ES_DISABLED, .DataFormat = { .IsSupported = SAHPI_FALSE, }, .ThresholdDefn = { .IsAccessible = SAHPI_FALSE, }, .Oem = 0, }, .sensor_info = { .current_state = SAHPI_ES_ENABLED, .sensor_enable = SAHPI_TRUE, .event_enable = SAHPI_TRUE, .assert_mask = SAHPI_ES_DISABLED, .deassert_mask = SAHPI_ES_ENABLED, }, .sensor_class = OA_SOAP_DIAG_CLASS, .sen_evt = { /* Assert event */ { .EventType = SAHPI_ET_SENSOR, .Severity = SAHPI_MAJOR, .EventDataUnion.SensorEvent = { .SensorNum = OA_SOAP_SEN_TOO_LOW_PWR_REQ, .SensorType = SAHPI_OPERATIONAL, .EventCategory = SAHPI_EC_ENABLE, .Assertion = SAHPI_TRUE, .EventState = SAHPI_ES_DISABLED, .OptionalDataPresent = SAHPI_SOD_CURRENT_STATE | SAHPI_SOD_PREVIOUS_STATE, .TriggerReading = { .IsSupported = SAHPI_FALSE, }, .TriggerThreshold = { .IsSupported = SAHPI_FALSE, }, .PreviousState = SAHPI_ES_ENABLED, .CurrentState = SAHPI_ES_DISABLED, .Oem = 0, .SensorSpecific = 0, }, }, /* Deassert event */ { .EventType = SAHPI_ET_SENSOR, .Severity = SAHPI_MAJOR, .EventDataUnion.SensorEvent = { .SensorNum = OA_SOAP_SEN_TOO_LOW_PWR_REQ, .SensorType = SAHPI_OPERATIONAL, .EventCategory = SAHPI_EC_ENABLE, .Assertion = SAHPI_FALSE, .EventState = SAHPI_ES_ENABLED, .OptionalDataPresent = SAHPI_SOD_CURRENT_STATE | SAHPI_SOD_PREVIOUS_STATE, .TriggerReading = { .IsSupported = SAHPI_FALSE, }, .TriggerThreshold = { .IsSupported = SAHPI_FALSE, }, .PreviousState = SAHPI_ES_DISABLED, .CurrentState = SAHPI_ES_ENABLED, .Oem = 0, .SensorSpecific = 0, }, }, {}, {}, }, .comment = "Too low power request", }, /* DiagnosticChecksEx Call HP sensor */ { .sensor = { .Num = OA_SOAP_SEN_CALL_HP, .Type = SAHPI_OPERATIONAL, .Category = SAHPI_EC_ENABLE, .EnableCtrl = SAHPI_TRUE, .EventCtrl = SAHPI_SEC_PER_EVENT, .Events = SAHPI_ES_ENABLED | SAHPI_ES_DISABLED, .DataFormat = { .IsSupported = SAHPI_FALSE, }, .ThresholdDefn = { .IsAccessible = SAHPI_FALSE, }, .Oem = 0, }, .sensor_info = { .current_state = SAHPI_ES_ENABLED, .sensor_enable = SAHPI_TRUE, .event_enable = SAHPI_TRUE, .assert_mask = SAHPI_ES_DISABLED, .deassert_mask = SAHPI_ES_ENABLED, }, .sensor_class = OA_SOAP_DIAG_CLASS, .sen_evt = { /* Assert event */ { .EventType = SAHPI_ET_SENSOR, .Severity = SAHPI_INFORMATIONAL, .EventDataUnion.SensorEvent = { .SensorNum = OA_SOAP_SEN_CALL_HP, .SensorType = SAHPI_OPERATIONAL, .EventCategory = SAHPI_EC_ENABLE, .Assertion = SAHPI_TRUE, .EventState = SAHPI_ES_DISABLED, .OptionalDataPresent = SAHPI_SOD_CURRENT_STATE | SAHPI_SOD_PREVIOUS_STATE, .TriggerReading = { .IsSupported = SAHPI_FALSE, }, .TriggerThreshold = { .IsSupported = SAHPI_FALSE, }, .PreviousState = SAHPI_ES_ENABLED, .CurrentState = SAHPI_ES_DISABLED, .Oem = 0, .SensorSpecific = 0, }, }, /* Deassert event */ { .EventType = SAHPI_ET_SENSOR, .Severity = SAHPI_INFORMATIONAL, .EventDataUnion.SensorEvent = { .SensorNum = OA_SOAP_SEN_CALL_HP, .SensorType = SAHPI_OPERATIONAL, .EventCategory = SAHPI_EC_ENABLE, .Assertion = SAHPI_FALSE, .EventState = SAHPI_ES_ENABLED, .OptionalDataPresent = SAHPI_SOD_CURRENT_STATE | SAHPI_SOD_PREVIOUS_STATE, .TriggerReading = { .IsSupported = SAHPI_FALSE, }, .TriggerThreshold = { .IsSupported = SAHPI_FALSE, }, .PreviousState = SAHPI_ES_DISABLED, .CurrentState = SAHPI_ES_ENABLED, .Oem = 0, .SensorSpecific = 0, }, }, {}, {}, }, .comment = "Call HP", }, /* DiagnosticChecksEx Device informational sensor */ { .sensor = { .Num = OA_SOAP_SEN_DEV_INFO, .Type = SAHPI_OPERATIONAL, .Category = SAHPI_EC_ENABLE, .EnableCtrl = SAHPI_TRUE, .EventCtrl = SAHPI_SEC_PER_EVENT, .Events = SAHPI_ES_ENABLED | SAHPI_ES_DISABLED, .DataFormat = { .IsSupported = SAHPI_FALSE, }, .ThresholdDefn = { .IsAccessible = SAHPI_FALSE, }, .Oem = 0, }, .sensor_info = { .current_state = SAHPI_ES_ENABLED, .sensor_enable = SAHPI_TRUE, .event_enable = SAHPI_TRUE, .assert_mask = SAHPI_ES_DISABLED, .deassert_mask = SAHPI_ES_ENABLED, }, .sensor_class = OA_SOAP_DIAG_CLASS, .sen_evt = { /* Assert event */ { .EventType = SAHPI_ET_SENSOR, .Severity = SAHPI_INFORMATIONAL, .EventDataUnion.SensorEvent = { .SensorNum = OA_SOAP_SEN_DEV_INFO, .SensorType = SAHPI_OPERATIONAL, .EventCategory = SAHPI_EC_ENABLE, .Assertion = SAHPI_TRUE, .EventState = SAHPI_ES_DISABLED, .OptionalDataPresent = SAHPI_SOD_CURRENT_STATE | SAHPI_SOD_PREVIOUS_STATE, .TriggerReading = { .IsSupported = SAHPI_FALSE, }, .TriggerThreshold = { .IsSupported = SAHPI_FALSE, }, .PreviousState = SAHPI_ES_ENABLED, .CurrentState = SAHPI_ES_DISABLED, .Oem = 0, .SensorSpecific = 0, }, }, /* Deassert event */ { .EventType = SAHPI_ET_SENSOR, .Severity = SAHPI_INFORMATIONAL, .EventDataUnion.SensorEvent = { .SensorNum = OA_SOAP_SEN_DEV_INFO, .SensorType = SAHPI_OPERATIONAL, .EventCategory = SAHPI_EC_ENABLE, .Assertion = SAHPI_FALSE, .EventState = SAHPI_ES_ENABLED, .OptionalDataPresent = SAHPI_SOD_CURRENT_STATE | SAHPI_SOD_PREVIOUS_STATE, .TriggerReading = { .IsSupported = SAHPI_FALSE, }, .TriggerThreshold = { .IsSupported = SAHPI_FALSE, }, .PreviousState = SAHPI_ES_DISABLED, .CurrentState = SAHPI_ES_ENABLED, .Oem = 0, .SensorSpecific = 0, }, }, {}, {}, }, .comment = "Device informational", }, /* DiagnosticChecksEx Storage device missing sensor */ { .sensor = { .Num = OA_SOAP_SEN_STORAGE_DEV_MISS, .Type = SAHPI_OPERATIONAL, .Category = SAHPI_EC_ENABLE, .EnableCtrl = SAHPI_TRUE, .EventCtrl = SAHPI_SEC_PER_EVENT, .Events = SAHPI_ES_ENABLED | SAHPI_ES_DISABLED, .DataFormat = { .IsSupported = SAHPI_FALSE, }, .ThresholdDefn = { .IsAccessible = SAHPI_FALSE, }, .Oem = 0, }, .sensor_info = { .current_state = SAHPI_ES_ENABLED, .sensor_enable = SAHPI_TRUE, .event_enable = SAHPI_TRUE, .assert_mask = SAHPI_ES_DISABLED, .deassert_mask = SAHPI_ES_ENABLED, }, .sensor_class = OA_SOAP_DIAG_CLASS, .sen_evt = { /* Assert event */ { .EventType = SAHPI_ET_SENSOR, .Severity = SAHPI_MAJOR, .EventDataUnion.SensorEvent = { .SensorNum = OA_SOAP_SEN_STORAGE_DEV_MISS, .SensorType = SAHPI_OPERATIONAL, .EventCategory = SAHPI_EC_ENABLE, .Assertion = SAHPI_TRUE, .EventState = SAHPI_ES_DISABLED, .OptionalDataPresent = SAHPI_SOD_CURRENT_STATE | SAHPI_SOD_PREVIOUS_STATE, .TriggerReading = { .IsSupported = SAHPI_FALSE, }, .TriggerThreshold = { .IsSupported = SAHPI_FALSE, }, .PreviousState = SAHPI_ES_ENABLED, .CurrentState = SAHPI_ES_DISABLED, .Oem = 0, .SensorSpecific = 0, }, }, /* Deassert event */ { .EventType = SAHPI_ET_SENSOR, .Severity = SAHPI_MAJOR, .EventDataUnion.SensorEvent = { .SensorNum = OA_SOAP_SEN_STORAGE_DEV_MISS, .SensorType = SAHPI_OPERATIONAL, .EventCategory = SAHPI_EC_ENABLE, .Assertion = SAHPI_FALSE, .EventState = SAHPI_ES_ENABLED, .OptionalDataPresent = SAHPI_SOD_CURRENT_STATE | SAHPI_SOD_PREVIOUS_STATE, .TriggerReading = { .IsSupported = SAHPI_FALSE, }, .TriggerThreshold = { .IsSupported = SAHPI_FALSE, }, .PreviousState = SAHPI_ES_DISABLED, .CurrentState = SAHPI_ES_ENABLED, .Oem = 0, .SensorSpecific = 0, }, }, {}, {}, }, .comment = "Storage device missing", }, /* DiagnosticChecksEx Enclosure ID mismatch sensor */ { .sensor = { .Num = OA_SOAP_SEN_ENC_ID_MISMATCH, .Type = SAHPI_OPERATIONAL, .Category = SAHPI_EC_ENABLE, .EnableCtrl = SAHPI_TRUE, .EventCtrl = SAHPI_SEC_PER_EVENT, .Events = SAHPI_ES_ENABLED | SAHPI_ES_DISABLED, .DataFormat = { .IsSupported = SAHPI_FALSE, }, .ThresholdDefn = { .IsAccessible = SAHPI_FALSE, }, .Oem = 0, }, .sensor_info = { .current_state = SAHPI_ES_ENABLED, .sensor_enable = SAHPI_TRUE, .event_enable = SAHPI_TRUE, .assert_mask = SAHPI_ES_DISABLED, .deassert_mask = SAHPI_ES_ENABLED, }, .sensor_class = OA_SOAP_DIAG_CLASS, .sen_evt = { /* Assert event */ { .EventType = SAHPI_ET_SENSOR, .Severity = SAHPI_MINOR, .EventDataUnion.SensorEvent = { .SensorNum = OA_SOAP_SEN_ENC_ID_MISMATCH, .SensorType = SAHPI_OPERATIONAL, .EventCategory = SAHPI_EC_ENABLE, .Assertion = SAHPI_TRUE, .EventState = SAHPI_ES_DISABLED, .OptionalDataPresent = SAHPI_SOD_CURRENT_STATE | SAHPI_SOD_PREVIOUS_STATE, .TriggerReading = { .IsSupported = SAHPI_FALSE, }, .TriggerThreshold = { .IsSupported = SAHPI_FALSE, }, .PreviousState = SAHPI_ES_ENABLED, .CurrentState = SAHPI_ES_DISABLED, .Oem = 0, .SensorSpecific = 0, }, }, /* Deassert event */ { .EventType = SAHPI_ET_SENSOR, .Severity = SAHPI_MINOR, .EventDataUnion.SensorEvent = { .SensorNum = OA_SOAP_SEN_ENC_ID_MISMATCH, .SensorType = SAHPI_OPERATIONAL, .EventCategory = SAHPI_EC_ENABLE, .Assertion = SAHPI_FALSE, .EventState = SAHPI_ES_ENABLED, .OptionalDataPresent = SAHPI_SOD_CURRENT_STATE | SAHPI_SOD_PREVIOUS_STATE, .TriggerReading = { .IsSupported = SAHPI_FALSE, }, .TriggerThreshold = { .IsSupported = SAHPI_FALSE, }, .PreviousState = SAHPI_ES_DISABLED, .CurrentState = SAHPI_ES_ENABLED, .Oem = 0, .SensorSpecific = 0, }, }, {}, {}, }, .comment = "Enclosure ID mismatch", }, /* DiagnosticChecksEx Device mix match sensor */ { .sensor = { .Num = OA_SOAP_SEN_DEV_MIX_MATCH, .Type = SAHPI_OPERATIONAL, .Category = SAHPI_EC_ENABLE, .EnableCtrl = SAHPI_TRUE, .EventCtrl = SAHPI_SEC_PER_EVENT, .Events = SAHPI_ES_ENABLED | SAHPI_ES_DISABLED, .DataFormat = { .IsSupported = SAHPI_FALSE, }, .ThresholdDefn = { .IsAccessible = SAHPI_FALSE, }, .Oem = 0, }, .sensor_info = { .current_state = SAHPI_ES_ENABLED, .sensor_enable = SAHPI_TRUE, .event_enable = SAHPI_TRUE, .assert_mask = SAHPI_ES_DISABLED, .deassert_mask = SAHPI_ES_ENABLED, }, .sensor_class = OA_SOAP_DIAG_CLASS, .sen_evt = { /* Assert event */ { .EventType = SAHPI_ET_SENSOR, .Severity = SAHPI_MINOR, .EventDataUnion.SensorEvent = { .SensorNum = OA_SOAP_SEN_DEV_MIX_MATCH, .SensorType = SAHPI_OPERATIONAL, .EventCategory = SAHPI_EC_ENABLE, .Assertion = SAHPI_TRUE, .EventState = SAHPI_ES_DISABLED, .OptionalDataPresent = SAHPI_SOD_CURRENT_STATE | SAHPI_SOD_PREVIOUS_STATE, .TriggerReading = { .IsSupported = SAHPI_FALSE, }, .TriggerThreshold = { .IsSupported = SAHPI_FALSE, }, .PreviousState = SAHPI_ES_ENABLED, .CurrentState = SAHPI_ES_DISABLED, .Oem = 0, .SensorSpecific = 0, }, }, /* Deassert event */ { .EventType = SAHPI_ET_SENSOR, .Severity = SAHPI_MINOR, .EventDataUnion.SensorEvent = { .SensorNum = OA_SOAP_SEN_DEV_MIX_MATCH, .SensorType = SAHPI_OPERATIONAL, .EventCategory = SAHPI_EC_ENABLE, .Assertion = SAHPI_FALSE, .EventState = SAHPI_ES_ENABLED, .OptionalDataPresent = SAHPI_SOD_CURRENT_STATE | SAHPI_SOD_PREVIOUS_STATE, .TriggerReading = { .IsSupported = SAHPI_FALSE, }, .TriggerThreshold = { .IsSupported = SAHPI_FALSE, }, .PreviousState = SAHPI_ES_DISABLED, .CurrentState = SAHPI_ES_ENABLED, .Oem = 0, .SensorSpecific = 0, }, }, {}, {}, }, .comment = "Device mix match", }, /* DiagnosticChecksEx Power capping error sensor */ { .sensor = { .Num = OA_SOAP_SEN_GRPCAP_ERR, .Type = SAHPI_OPERATIONAL, .Category = SAHPI_EC_ENABLE, .EnableCtrl = SAHPI_TRUE, .EventCtrl = SAHPI_SEC_PER_EVENT, .Events = SAHPI_ES_ENABLED | SAHPI_ES_DISABLED, .DataFormat = { .IsSupported = SAHPI_FALSE, }, .ThresholdDefn = { .IsAccessible = SAHPI_FALSE, }, .Oem = 0, }, .sensor_info = { .current_state = SAHPI_ES_ENABLED, .sensor_enable = SAHPI_TRUE, .event_enable = SAHPI_TRUE, .assert_mask = SAHPI_ES_DISABLED, .deassert_mask = SAHPI_ES_ENABLED, }, .sensor_class = OA_SOAP_DIAG_CLASS, .sen_evt = { /* Assert event */ { .EventType = SAHPI_ET_SENSOR, .Severity = SAHPI_MAJOR, .EventDataUnion.SensorEvent = { .SensorNum = OA_SOAP_SEN_GRPCAP_ERR, .SensorType = SAHPI_OPERATIONAL, .EventCategory = SAHPI_EC_ENABLE, .Assertion = SAHPI_TRUE, .EventState = SAHPI_ES_DISABLED, .OptionalDataPresent = SAHPI_SOD_CURRENT_STATE | SAHPI_SOD_PREVIOUS_STATE, .TriggerReading = { .IsSupported = SAHPI_FALSE, }, .TriggerThreshold = { .IsSupported = SAHPI_FALSE, }, .PreviousState = SAHPI_ES_ENABLED, .CurrentState = SAHPI_ES_DISABLED, .Oem = 0, .SensorSpecific = 0, }, }, /* Deassert event */ { .EventType = SAHPI_ET_SENSOR, .Severity = SAHPI_MAJOR, .EventDataUnion.SensorEvent = { .SensorNum = OA_SOAP_SEN_GRPCAP_ERR, .SensorType = SAHPI_OPERATIONAL, .EventCategory = SAHPI_EC_ENABLE, .Assertion = SAHPI_FALSE, .EventState = SAHPI_ES_ENABLED, .OptionalDataPresent = SAHPI_SOD_CURRENT_STATE | SAHPI_SOD_PREVIOUS_STATE, .TriggerReading = { .IsSupported = SAHPI_FALSE, }, .TriggerThreshold = { .IsSupported = SAHPI_FALSE, }, .PreviousState = SAHPI_ES_DISABLED, .CurrentState = SAHPI_ES_ENABLED, .Oem = 0, .SensorSpecific = 0, }, }, {}, {}, }, .comment = "Power capping error", }, /* DiagnosticChecksEx IML recorded errors sensor */ { .sensor = { .Num = OA_SOAP_SEN_IML_ERR, .Type = SAHPI_OPERATIONAL, .Category = SAHPI_EC_ENABLE, .EnableCtrl = SAHPI_TRUE, .EventCtrl = SAHPI_SEC_PER_EVENT, .Events = SAHPI_ES_ENABLED | SAHPI_ES_DISABLED, .DataFormat = { .IsSupported = SAHPI_FALSE, }, .ThresholdDefn = { .IsAccessible = SAHPI_FALSE, }, .Oem = 0, }, .sensor_info = { .current_state = SAHPI_ES_ENABLED, .sensor_enable = SAHPI_TRUE, .event_enable = SAHPI_TRUE, .assert_mask = SAHPI_ES_DISABLED, .deassert_mask = SAHPI_ES_ENABLED, }, .sensor_class = OA_SOAP_DIAG_CLASS, .sen_evt = { /* Assert event */ { .EventType = SAHPI_ET_SENSOR, .Severity = SAHPI_INFORMATIONAL, .EventDataUnion.SensorEvent = { .SensorNum = OA_SOAP_SEN_IML_ERR, .SensorType = SAHPI_OPERATIONAL, .EventCategory = SAHPI_EC_ENABLE, .Assertion = SAHPI_TRUE, .EventState = SAHPI_ES_DISABLED, .OptionalDataPresent = SAHPI_SOD_CURRENT_STATE | SAHPI_SOD_PREVIOUS_STATE, .TriggerReading = { .IsSupported = SAHPI_FALSE, }, .TriggerThreshold = { .IsSupported = SAHPI_FALSE, }, .PreviousState = SAHPI_ES_ENABLED, .CurrentState = SAHPI_ES_DISABLED, .Oem = 0, .SensorSpecific = 0, }, }, /* Deassert event */ { .EventType = SAHPI_ET_SENSOR, .Severity = SAHPI_INFORMATIONAL, .EventDataUnion.SensorEvent = { .SensorNum = OA_SOAP_SEN_IML_ERR, .SensorType = SAHPI_OPERATIONAL, .EventCategory = SAHPI_EC_ENABLE, .Assertion = SAHPI_FALSE, .EventState = SAHPI_ES_ENABLED, .OptionalDataPresent = SAHPI_SOD_CURRENT_STATE | SAHPI_SOD_PREVIOUS_STATE, .TriggerReading = { .IsSupported = SAHPI_FALSE, }, .TriggerThreshold = { .IsSupported = SAHPI_FALSE, }, .PreviousState = SAHPI_ES_DISABLED, .CurrentState = SAHPI_ES_ENABLED, .Oem = 0, .SensorSpecific = 0, }, }, {}, {}, }, .comment = "IML recorded errors", }, /* DiagnosticChecksEx Duplicate management IP address sensor */ { .sensor = { .Num = OA_SOAP_SEN_DUP_MGMT_IP_ADDR, .Type = SAHPI_OPERATIONAL, .Category = SAHPI_EC_ENABLE, .EnableCtrl = SAHPI_TRUE, .EventCtrl = SAHPI_SEC_PER_EVENT, .Events = SAHPI_ES_ENABLED | SAHPI_ES_DISABLED, .DataFormat = { .IsSupported = SAHPI_FALSE, }, .ThresholdDefn = { .IsAccessible = SAHPI_FALSE, }, .Oem = 0, }, .sensor_info = { .current_state = SAHPI_ES_ENABLED, .sensor_enable = SAHPI_TRUE, .event_enable = SAHPI_TRUE, .assert_mask = SAHPI_ES_DISABLED, .deassert_mask = SAHPI_ES_ENABLED, }, .sensor_class = OA_SOAP_DIAG_CLASS, .sen_evt = { /* Assert event */ { .EventType = SAHPI_ET_SENSOR, .Severity = SAHPI_MAJOR, .EventDataUnion.SensorEvent = { .SensorNum = OA_SOAP_SEN_DUP_MGMT_IP_ADDR, .SensorType = SAHPI_OPERATIONAL, .EventCategory = SAHPI_EC_ENABLE, .Assertion = SAHPI_TRUE, .EventState = SAHPI_ES_DISABLED, .OptionalDataPresent = SAHPI_SOD_CURRENT_STATE | SAHPI_SOD_PREVIOUS_STATE, .TriggerReading = { .IsSupported = SAHPI_FALSE, }, .TriggerThreshold = { .IsSupported = SAHPI_FALSE, }, .PreviousState = SAHPI_ES_ENABLED, .CurrentState = SAHPI_ES_DISABLED, .Oem = 0, .SensorSpecific = 0, }, }, /* Deassert event */ { .EventType = SAHPI_ET_SENSOR, .Severity = SAHPI_MAJOR, .EventDataUnion.SensorEvent = { .SensorNum = OA_SOAP_SEN_DUP_MGMT_IP_ADDR, .SensorType = SAHPI_OPERATIONAL, .EventCategory = SAHPI_EC_ENABLE, .Assertion = SAHPI_FALSE, .EventState = SAHPI_ES_ENABLED, .OptionalDataPresent = SAHPI_SOD_CURRENT_STATE | SAHPI_SOD_PREVIOUS_STATE, .TriggerReading = { .IsSupported = SAHPI_FALSE, }, .TriggerThreshold = { .IsSupported = SAHPI_FALSE, }, .PreviousState = SAHPI_ES_DISABLED, .CurrentState = SAHPI_ES_ENABLED, .Oem = 0, .SensorSpecific = 0, }, }, {}, {}, }, .comment = "Duplicate management IP address", }, /* System zone1 sensor */ { .sensor = { .Num = OA_SOAP_SEN_BLADE_SYSTEM_ZONE1, .Type = SAHPI_TEMPERATURE, .Category = SAHPI_EC_THRESHOLD, .EnableCtrl = SAHPI_TRUE, .EventCtrl = SAHPI_SEC_READ_ONLY, .Events = SAHPI_ES_UNSPECIFIED, .DataFormat = { .IsSupported = SAHPI_TRUE, .ReadingType = SAHPI_SENSOR_READING_TYPE_FLOAT64, .BaseUnits = SAHPI_SU_DEGREES_C, .ModifierUnits = SAHPI_SU_UNSPECIFIED, .ModifierUse = SAHPI_SMUU_NONE, .Percentage = SAHPI_FALSE, .Range.Flags = SAHPI_SRF_MAX | SAHPI_SRF_NORMAL_MAX, .Range.Max.IsSupported = SAHPI_TRUE, .Range.Max.Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, /* This default Max value should be replaced * with Max value retrieved from OA */ .Range.Max.Value.SensorFloat64 = 85, .Range.NormalMax.IsSupported = SAHPI_TRUE, .Range.NormalMax.Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, /* This default Normal Max value should be * replaced with Normal Max value retrieved * from OA */ .Range.NormalMax.Value.SensorFloat64 = 80, .AccuracyFactor = 0, }, .ThresholdDefn = { .IsAccessible = SAHPI_TRUE, .ReadThold = SAHPI_ES_UPPER_CRIT | SAHPI_ES_UPPER_MAJOR, .WriteThold = 0x0, }, .Oem = 0, }, .sensor_info = { .current_state = SAHPI_ES_UNSPECIFIED, .sensor_enable = SAHPI_TRUE, .event_enable = SAHPI_FALSE, .assert_mask = OA_SOAP_STM_UNSPECIFED, .deassert_mask = OA_SOAP_STM_UNSPECIFED, .sensor_reading = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, /* Update the value with current reading */ .Value.SensorFloat64 = 0x0, }, .threshold = { .UpCritical.IsSupported = SAHPI_TRUE, .UpCritical.Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, /* Update the value with critical threshold * reading */ .UpCritical.Value.SensorFloat64 = 85, .UpMajor.IsSupported = SAHPI_TRUE, .UpMajor.Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, /* Update the value with major threshold * reading */ .UpMajor.Value.SensorFloat64 = 80, }, }, .sensor_class = OA_SOAP_BLADE_THERMAL_CLASS, .comment = "System Zone thermal status", }, /* System zone2 sensor */ { .sensor = { .Num = OA_SOAP_SEN_BLADE_SYSTEM_ZONE2, .Type = SAHPI_TEMPERATURE, .Category = SAHPI_EC_THRESHOLD, .EnableCtrl = SAHPI_TRUE, .EventCtrl = SAHPI_SEC_READ_ONLY, .Events = SAHPI_ES_UNSPECIFIED, .DataFormat = { .IsSupported = SAHPI_TRUE, .ReadingType = SAHPI_SENSOR_READING_TYPE_FLOAT64, .BaseUnits = SAHPI_SU_DEGREES_C, .ModifierUnits = SAHPI_SU_UNSPECIFIED, .ModifierUse = SAHPI_SMUU_NONE, .Percentage = SAHPI_FALSE, .Range.Flags = SAHPI_SRF_MAX | SAHPI_SRF_NORMAL_MAX, .Range.Max.IsSupported = SAHPI_TRUE, .Range.Max.Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, /* This default Max value should be replaced * with Max value retrieved from OA */ .Range.Max.Value.SensorFloat64 = 85, .Range.NormalMax.IsSupported = SAHPI_TRUE, .Range.NormalMax.Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, /* This default Normal Max value should be * replaced with Normal Max value retrieved * from OA */ .Range.NormalMax.Value.SensorFloat64 = 80, .AccuracyFactor = 0, }, .ThresholdDefn = { .IsAccessible = SAHPI_TRUE, .ReadThold = SAHPI_ES_UPPER_CRIT | SAHPI_ES_UPPER_MAJOR, .WriteThold = 0x0, }, .Oem = 0, }, .sensor_info = { .current_state = SAHPI_ES_UNSPECIFIED, .sensor_enable = SAHPI_TRUE, .event_enable = SAHPI_FALSE, .assert_mask = OA_SOAP_STM_UNSPECIFED, .deassert_mask = OA_SOAP_STM_UNSPECIFED, .sensor_reading = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, /* Update the value with current reading */ .Value.SensorFloat64 = 0x0, }, .threshold = { .UpCritical.IsSupported = SAHPI_TRUE, .UpCritical.Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, /* Update the value with critical threshold * reading */ .UpCritical.Value.SensorFloat64 = 85, .UpMajor.IsSupported = SAHPI_TRUE, .UpMajor.Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, /* Update the value with major threshold * reading */ .UpMajor.Value.SensorFloat64 = 80, }, }, .sensor_class = OA_SOAP_BLADE_THERMAL_CLASS, .comment = "System Zone thermal status", }, /* System zone3 sensor */ { .sensor = { .Num = OA_SOAP_SEN_BLADE_SYSTEM_ZONE3, .Type = SAHPI_TEMPERATURE, .Category = SAHPI_EC_THRESHOLD, .EnableCtrl = SAHPI_TRUE, .EventCtrl = SAHPI_SEC_READ_ONLY, .Events = SAHPI_ES_UNSPECIFIED, .DataFormat = { .IsSupported = SAHPI_TRUE, .ReadingType = SAHPI_SENSOR_READING_TYPE_FLOAT64, .BaseUnits = SAHPI_SU_DEGREES_C, .ModifierUnits = SAHPI_SU_UNSPECIFIED, .ModifierUse = SAHPI_SMUU_NONE, .Percentage = SAHPI_FALSE, .Range.Flags = SAHPI_SRF_MAX | SAHPI_SRF_NORMAL_MAX, .Range.Max.IsSupported = SAHPI_TRUE, .Range.Max.Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, /* This default Max value should be replaced * with Max value retrieved from OA */ .Range.Max.Value.SensorFloat64 = 85, .Range.NormalMax.IsSupported = SAHPI_TRUE, .Range.NormalMax.Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, /* This default Normal Max value should be * replaced with Normal Max value retrieved * from OA */ .Range.NormalMax.Value.SensorFloat64 = 80, .AccuracyFactor = 0, }, .ThresholdDefn = { .IsAccessible = SAHPI_TRUE, .ReadThold = SAHPI_ES_UPPER_CRIT | SAHPI_ES_UPPER_MAJOR, .WriteThold = 0x0, }, .Oem = 0, }, .sensor_info = { .current_state = SAHPI_ES_UNSPECIFIED, .sensor_enable = SAHPI_TRUE, .event_enable = SAHPI_FALSE, .assert_mask = OA_SOAP_STM_UNSPECIFED, .deassert_mask = OA_SOAP_STM_UNSPECIFED, .sensor_reading = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, /* Update the value with current reading */ .Value.SensorFloat64 = 0x0, }, .threshold = { .UpCritical.IsSupported = SAHPI_TRUE, .UpCritical.Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, /* Update the value with critical threshold * reading */ .UpCritical.Value.SensorFloat64 = 85, .UpMajor.IsSupported = SAHPI_TRUE, .UpMajor.Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, /* Update the value with major threshold * reading */ .UpMajor.Value.SensorFloat64 = 80, }, }, .sensor_class = OA_SOAP_BLADE_THERMAL_CLASS, .comment = "System Zone thermal status", }, /* System zone4 sensor */ { .sensor = { .Num = OA_SOAP_SEN_BLADE_SYSTEM_ZONE4, .Type = SAHPI_TEMPERATURE, .Category = SAHPI_EC_THRESHOLD, .EnableCtrl = SAHPI_TRUE, .EventCtrl = SAHPI_SEC_READ_ONLY, .Events = SAHPI_ES_UNSPECIFIED, .DataFormat = { .IsSupported = SAHPI_TRUE, .ReadingType = SAHPI_SENSOR_READING_TYPE_FLOAT64, .BaseUnits = SAHPI_SU_DEGREES_C, .ModifierUnits = SAHPI_SU_UNSPECIFIED, .ModifierUse = SAHPI_SMUU_NONE, .Percentage = SAHPI_FALSE, .Range.Flags = SAHPI_SRF_MAX | SAHPI_SRF_NORMAL_MAX, .Range.Max.IsSupported = SAHPI_TRUE, .Range.Max.Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, /* This default Max value should be replaced * with Max value retrieved from OA */ .Range.Max.Value.SensorFloat64 = 85, .Range.NormalMax.IsSupported = SAHPI_TRUE, .Range.NormalMax.Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, /* This default Normal Max value should be * replaced with Normal Max value retrieved * from OA */ .Range.NormalMax.Value.SensorFloat64 = 80, .AccuracyFactor = 0, }, .ThresholdDefn = { .IsAccessible = SAHPI_TRUE, .ReadThold = SAHPI_ES_UPPER_CRIT | SAHPI_ES_UPPER_MAJOR, .WriteThold = 0x0, }, .Oem = 0, }, .sensor_info = { .current_state = SAHPI_ES_UNSPECIFIED, .sensor_enable = SAHPI_TRUE, .event_enable = SAHPI_FALSE, .assert_mask = OA_SOAP_STM_UNSPECIFED, .deassert_mask = OA_SOAP_STM_UNSPECIFED, .sensor_reading = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, /* Update the value with current reading */ .Value.SensorFloat64 = 0x0, }, .threshold = { .UpCritical.IsSupported = SAHPI_TRUE, .UpCritical.Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, /* Update the value with critical threshold * reading */ .UpCritical.Value.SensorFloat64 = 85, .UpMajor.IsSupported = SAHPI_TRUE, .UpMajor.Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, /* Update the value with major threshold * reading */ .UpMajor.Value.SensorFloat64 = 80, }, }, .sensor_class = OA_SOAP_BLADE_THERMAL_CLASS, .comment = "System Zone thermal status", }, /* CPU zone1 sensor */ { .sensor = { .Num = OA_SOAP_SEN_BLADE_CPU_ZONE1, .Type = SAHPI_TEMPERATURE, .Category = SAHPI_EC_THRESHOLD, .EnableCtrl = SAHPI_TRUE, .EventCtrl = SAHPI_SEC_READ_ONLY, .Events = SAHPI_ES_UNSPECIFIED, .DataFormat = { .IsSupported = SAHPI_TRUE, .ReadingType = SAHPI_SENSOR_READING_TYPE_FLOAT64, .BaseUnits = SAHPI_SU_DEGREES_C, .ModifierUnits = SAHPI_SU_UNSPECIFIED, .ModifierUse = SAHPI_SMUU_NONE, .Percentage = SAHPI_FALSE, .Range.Flags = SAHPI_SRF_MAX | SAHPI_SRF_NORMAL_MAX, .Range.Max.IsSupported = SAHPI_TRUE, .Range.Max.Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, /* This default Max value should be replaced * with Max value retrieved from OA */ .Range.Max.Value.SensorFloat64 = 70, .Range.NormalMax.IsSupported = SAHPI_TRUE, .Range.NormalMax.Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, /* This default Normal Max value should be * replaced with Normal Max value retrieved * from OA */ .Range.NormalMax.Value.SensorFloat64 = 65, .AccuracyFactor = 0, }, .ThresholdDefn = { .IsAccessible = SAHPI_TRUE, .ReadThold = SAHPI_ES_UPPER_CRIT | SAHPI_ES_UPPER_MAJOR, .WriteThold = 0x0, }, .Oem = 0, }, .sensor_info = { .current_state = SAHPI_ES_UNSPECIFIED, .sensor_enable = SAHPI_TRUE, .event_enable = SAHPI_FALSE, .assert_mask = OA_SOAP_STM_UNSPECIFED, .deassert_mask = OA_SOAP_STM_UNSPECIFED, .sensor_reading = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, /* Update the value with current reading */ .Value.SensorFloat64 = 0x0, }, .threshold = { .UpCritical.IsSupported = SAHPI_TRUE, .UpCritical.Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, /* Update the value with critical threshold * reading */ .UpCritical.Value.SensorFloat64 = 70, .UpMajor.IsSupported = SAHPI_TRUE, .UpMajor.Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, /* Update the value with major threshold * reading */ .UpMajor.Value.SensorFloat64 = 65, }, }, .sensor_class = OA_SOAP_BLADE_THERMAL_CLASS, .comment = "CPU Zone thermal status", }, /* CPU zone2 sensor */ { .sensor = { .Num = OA_SOAP_SEN_BLADE_CPU_ZONE2, .Type = SAHPI_TEMPERATURE, .Category = SAHPI_EC_THRESHOLD, .EnableCtrl = SAHPI_TRUE, .EventCtrl = SAHPI_SEC_READ_ONLY, .Events = SAHPI_ES_UNSPECIFIED, .DataFormat = { .IsSupported = SAHPI_TRUE, .ReadingType = SAHPI_SENSOR_READING_TYPE_FLOAT64, .BaseUnits = SAHPI_SU_DEGREES_C, .ModifierUnits = SAHPI_SU_UNSPECIFIED, .ModifierUse = SAHPI_SMUU_NONE, .Percentage = SAHPI_FALSE, .Range.Flags = SAHPI_SRF_MAX | SAHPI_SRF_NORMAL_MAX, .Range.Max.IsSupported = SAHPI_TRUE, .Range.Max.Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, /* This default Max value should be replaced * with Max value retrieved from OA */ .Range.Max.Value.SensorFloat64 = 70, .Range.NormalMax.IsSupported = SAHPI_TRUE, .Range.NormalMax.Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, /* This default Normal Max value should be * replaced with Normal Max value retrieved * from OA */ .Range.NormalMax.Value.SensorFloat64 = 65, .AccuracyFactor = 0, }, .ThresholdDefn = { .IsAccessible = SAHPI_TRUE, .ReadThold = SAHPI_ES_UPPER_CRIT | SAHPI_ES_UPPER_MAJOR, .WriteThold = 0x0, }, .Oem = 0, }, .sensor_info = { .current_state = SAHPI_ES_UNSPECIFIED, .sensor_enable = SAHPI_TRUE, .event_enable = SAHPI_FALSE, .assert_mask = OA_SOAP_STM_UNSPECIFED, .deassert_mask = OA_SOAP_STM_UNSPECIFED, .sensor_reading = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, /* Update the value with current reading */ .Value.SensorFloat64 = 0x0, }, .threshold = { .UpCritical.IsSupported = SAHPI_TRUE, .UpCritical.Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, /* Update the value with critical threshold * reading */ .UpCritical.Value.SensorFloat64 = 70, .UpMajor.IsSupported = SAHPI_TRUE, .UpMajor.Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, /* Update the value with major threshold * reading */ .UpMajor.Value.SensorFloat64 = 65, }, }, .sensor_class = OA_SOAP_BLADE_THERMAL_CLASS, .comment = "CPU Zone thermal status", }, /* CPU zone3 sensor */ { .sensor = { .Num = OA_SOAP_SEN_BLADE_CPU_ZONE3, .Type = SAHPI_TEMPERATURE, .Category = SAHPI_EC_THRESHOLD, .EnableCtrl = SAHPI_TRUE, .EventCtrl = SAHPI_SEC_READ_ONLY, .Events = SAHPI_ES_UNSPECIFIED, .DataFormat = { .IsSupported = SAHPI_TRUE, .ReadingType = SAHPI_SENSOR_READING_TYPE_FLOAT64, .BaseUnits = SAHPI_SU_DEGREES_C, .ModifierUnits = SAHPI_SU_UNSPECIFIED, .ModifierUse = SAHPI_SMUU_NONE, .Percentage = SAHPI_FALSE, .Range.Flags = SAHPI_SRF_MAX | SAHPI_SRF_NORMAL_MAX, .Range.Max.IsSupported = SAHPI_TRUE, .Range.Max.Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, /* This default Max value should be replaced * with Max value retrieved from OA */ .Range.Max.Value.SensorFloat64 = 70, .Range.NormalMax.IsSupported = SAHPI_TRUE, .Range.NormalMax.Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, /* This default Normal Max value should be * replaced with Normal Max value retrieved * from OA */ .Range.NormalMax.Value.SensorFloat64 = 65, .AccuracyFactor = 0, }, .ThresholdDefn = { .IsAccessible = SAHPI_TRUE, .ReadThold = SAHPI_ES_UPPER_CRIT | SAHPI_ES_UPPER_MAJOR, .WriteThold = 0x0, }, .Oem = 0, }, .sensor_info = { .current_state = SAHPI_ES_UNSPECIFIED, .sensor_enable = SAHPI_TRUE, .event_enable = SAHPI_FALSE, .assert_mask = OA_SOAP_STM_UNSPECIFED, .deassert_mask = OA_SOAP_STM_UNSPECIFED, .sensor_reading = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, /* Update the value with current reading */ .Value.SensorFloat64 = 0x0, }, .threshold = { .UpCritical.IsSupported = SAHPI_TRUE, .UpCritical.Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, /* Update the value with critical threshold * reading */ .UpCritical.Value.SensorFloat64 = 70, .UpMajor.IsSupported = SAHPI_TRUE, .UpMajor.Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, /* Update the value with major threshold * reading */ .UpMajor.Value.SensorFloat64 = 65, }, }, .sensor_class = OA_SOAP_BLADE_THERMAL_CLASS, .comment = "CPU Zone thermal status", }, /* CPU zone4 sensor */ { .sensor = { .Num = OA_SOAP_SEN_BLADE_CPU_ZONE4, .Type = SAHPI_TEMPERATURE, .Category = SAHPI_EC_THRESHOLD, .EnableCtrl = SAHPI_TRUE, .EventCtrl = SAHPI_SEC_READ_ONLY, .Events = SAHPI_ES_UNSPECIFIED, .DataFormat = { .IsSupported = SAHPI_TRUE, .ReadingType = SAHPI_SENSOR_READING_TYPE_FLOAT64, .BaseUnits = SAHPI_SU_DEGREES_C, .ModifierUnits = SAHPI_SU_UNSPECIFIED, .ModifierUse = SAHPI_SMUU_NONE, .Percentage = SAHPI_FALSE, .Range.Flags = SAHPI_SRF_MAX | SAHPI_SRF_NORMAL_MAX, .Range.Max.IsSupported = SAHPI_TRUE, .Range.Max.Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, /* This default Max value should be replaced * with Max value retrieved from OA */ .Range.Max.Value.SensorFloat64 = 70, .Range.NormalMax.IsSupported = SAHPI_TRUE, .Range.NormalMax.Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, /* This default Normal Max value should be * replaced with Normal Max value retrieved * from OA */ .Range.NormalMax.Value.SensorFloat64 = 65, .AccuracyFactor = 0, }, .ThresholdDefn = { .IsAccessible = SAHPI_TRUE, .ReadThold = SAHPI_ES_UPPER_CRIT | SAHPI_ES_UPPER_MAJOR, .WriteThold = 0x0, }, .Oem = 0, }, .sensor_info = { .current_state = SAHPI_ES_UNSPECIFIED, .sensor_enable = SAHPI_TRUE, .event_enable = SAHPI_FALSE, .assert_mask = OA_SOAP_STM_UNSPECIFED, .deassert_mask = OA_SOAP_STM_UNSPECIFED, .sensor_reading = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, /* Update the value with current reading */ .Value.SensorFloat64 = 0x0, }, .threshold = { .UpCritical.IsSupported = SAHPI_TRUE, .UpCritical.Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, /* Update the value with critical threshold * reading */ .UpCritical.Value.SensorFloat64 = 70, .UpMajor.IsSupported = SAHPI_TRUE, .UpMajor.Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, /* Update the value with major threshold * reading */ .UpMajor.Value.SensorFloat64 = 65, }, }, .sensor_class = OA_SOAP_BLADE_THERMAL_CLASS, .comment = "CPU Zone thermal status", }, /* Memory zone1 sensor */ { .sensor = { .Num = OA_SOAP_SEN_BLADE_MEM_ZONE1, .Type = SAHPI_TEMPERATURE, .Category = SAHPI_EC_THRESHOLD, .EnableCtrl = SAHPI_TRUE, .EventCtrl = SAHPI_SEC_READ_ONLY, .Events = SAHPI_ES_UNSPECIFIED, .DataFormat = { .IsSupported = SAHPI_TRUE, .ReadingType = SAHPI_SENSOR_READING_TYPE_FLOAT64, .BaseUnits = SAHPI_SU_DEGREES_C, .ModifierUnits = SAHPI_SU_UNSPECIFIED, .ModifierUse = SAHPI_SMUU_NONE, .Percentage = SAHPI_FALSE, .Range.Flags = SAHPI_SRF_MAX | SAHPI_SRF_NORMAL_MAX, .Range.Max.IsSupported = SAHPI_TRUE, .Range.Max.Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, /* This default Max value should be replaced * with Max value retrieved from OA */ .Range.Max.Value.SensorFloat64 = 100, .Range.NormalMax.IsSupported = SAHPI_TRUE, .Range.NormalMax.Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, /* This default Normal Max value should be * replaced with Normal Max value retrieved * from OA */ .Range.NormalMax.Value.SensorFloat64 = 85, .AccuracyFactor = 0, }, .ThresholdDefn = { .IsAccessible = SAHPI_TRUE, .ReadThold = SAHPI_ES_UPPER_CRIT | SAHPI_ES_UPPER_MAJOR, .WriteThold = 0x0, }, .Oem = 0, }, .sensor_info = { .current_state = SAHPI_ES_UNSPECIFIED, .sensor_enable = SAHPI_TRUE, .event_enable = SAHPI_FALSE, .assert_mask = OA_SOAP_STM_UNSPECIFED, .deassert_mask = OA_SOAP_STM_UNSPECIFED, .sensor_reading = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, /* Update the value with current reading */ .Value.SensorFloat64 = 0x0, }, .threshold = { .UpCritical.IsSupported = SAHPI_TRUE, .UpCritical.Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, /* Update the value with critical threshold * reading */ .UpCritical.Value.SensorFloat64 = 100, .UpMajor.IsSupported = SAHPI_TRUE, .UpMajor.Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, /* Update the value with major threshold * reading */ .UpMajor.Value.SensorFloat64 = 85, }, }, .sensor_class = OA_SOAP_BLADE_THERMAL_CLASS, .comment = "Memory Zone thermal status", }, /* Memory zone2 sensor */ { .sensor = { .Num = OA_SOAP_SEN_BLADE_MEM_ZONE2, .Type = SAHPI_TEMPERATURE, .Category = SAHPI_EC_THRESHOLD, .EnableCtrl = SAHPI_TRUE, .EventCtrl = SAHPI_SEC_READ_ONLY, .Events = SAHPI_ES_UNSPECIFIED, .DataFormat = { .IsSupported = SAHPI_TRUE, .ReadingType = SAHPI_SENSOR_READING_TYPE_FLOAT64, .BaseUnits = SAHPI_SU_DEGREES_C, .ModifierUnits = SAHPI_SU_UNSPECIFIED, .ModifierUse = SAHPI_SMUU_NONE, .Percentage = SAHPI_FALSE, .Range.Flags = SAHPI_SRF_MAX | SAHPI_SRF_NORMAL_MAX, .Range.Max.IsSupported = SAHPI_TRUE, .Range.Max.Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, /* This default Max value should be replaced * with Max value retrieved from OA */ .Range.Max.Value.SensorFloat64 = 100, .Range.NormalMax.IsSupported = SAHPI_TRUE, .Range.NormalMax.Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, /* This default Normal Max value should be * replaced with Normal Max value retrieved * from OA */ .Range.NormalMax.Value.SensorFloat64 = 85, .AccuracyFactor = 0, }, .ThresholdDefn = { .IsAccessible = SAHPI_TRUE, .ReadThold = SAHPI_ES_UPPER_CRIT | SAHPI_ES_UPPER_MAJOR, .WriteThold = 0x0, }, .Oem = 0, }, .sensor_info = { .current_state = SAHPI_ES_UNSPECIFIED, .sensor_enable = SAHPI_TRUE, .event_enable = SAHPI_FALSE, .assert_mask = OA_SOAP_STM_UNSPECIFED, .deassert_mask = OA_SOAP_STM_UNSPECIFED, .sensor_reading = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, /* Update the value with current reading */ .Value.SensorFloat64 = 0x0, }, .threshold = { .UpCritical.IsSupported = SAHPI_TRUE, .UpCritical.Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, /* Update the value with critical threshold * reading */ .UpCritical.Value.SensorFloat64 = 100, .UpMajor.IsSupported = SAHPI_TRUE, .UpMajor.Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, /* Update the value with major threshold * reading */ .UpMajor.Value.SensorFloat64 = 85, }, }, .sensor_class = OA_SOAP_BLADE_THERMAL_CLASS, .comment = "Memory Zone thermal status", }, /* Memory zone3 sensor */ { .sensor = { .Num = OA_SOAP_SEN_BLADE_MEM_ZONE3, .Type = SAHPI_TEMPERATURE, .Category = SAHPI_EC_THRESHOLD, .EnableCtrl = SAHPI_TRUE, .EventCtrl = SAHPI_SEC_READ_ONLY, .Events = SAHPI_ES_UNSPECIFIED, .DataFormat = { .IsSupported = SAHPI_TRUE, .ReadingType = SAHPI_SENSOR_READING_TYPE_FLOAT64, .BaseUnits = SAHPI_SU_DEGREES_C, .ModifierUnits = SAHPI_SU_UNSPECIFIED, .ModifierUse = SAHPI_SMUU_NONE, .Percentage = SAHPI_FALSE, .Range.Flags = SAHPI_SRF_MAX | SAHPI_SRF_NORMAL_MAX, .Range.Max.IsSupported = SAHPI_TRUE, .Range.Max.Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, /* This default Max value should be replaced * with Max value retrieved from OA */ .Range.Max.Value.SensorFloat64 = 100, .Range.NormalMax.IsSupported = SAHPI_TRUE, .Range.NormalMax.Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, /* This default Normal Max value should be * replaced with Normal Max value retrieved * from OA */ .Range.NormalMax.Value.SensorFloat64 = 85, .AccuracyFactor = 0, }, .ThresholdDefn = { .IsAccessible = SAHPI_TRUE, .ReadThold = SAHPI_ES_UPPER_CRIT | SAHPI_ES_UPPER_MAJOR, .WriteThold = 0x0, }, .Oem = 0, }, .sensor_info = { .current_state = SAHPI_ES_UNSPECIFIED, .sensor_enable = SAHPI_TRUE, .event_enable = SAHPI_FALSE, .assert_mask = OA_SOAP_STM_UNSPECIFED, .deassert_mask = OA_SOAP_STM_UNSPECIFED, .sensor_reading = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, /* Update the value with current reading */ .Value.SensorFloat64 = 0x0, }, .threshold = { .UpCritical.IsSupported = SAHPI_TRUE, .UpCritical.Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, /* Update the value with critical threshold * reading */ .UpCritical.Value.SensorFloat64 = 100, .UpMajor.IsSupported = SAHPI_TRUE, .UpMajor.Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, /* Update the value with major threshold * reading */ .UpMajor.Value.SensorFloat64 = 85, }, }, .sensor_class = OA_SOAP_BLADE_THERMAL_CLASS, .comment = "Memory Zone thermal status", }, /* Memory zone4 sensor */ { .sensor = { .Num = OA_SOAP_SEN_BLADE_MEM_ZONE4, .Type = SAHPI_TEMPERATURE, .Category = SAHPI_EC_THRESHOLD, .EnableCtrl = SAHPI_TRUE, .EventCtrl = SAHPI_SEC_READ_ONLY, .Events = SAHPI_ES_UNSPECIFIED, .DataFormat = { .IsSupported = SAHPI_TRUE, .ReadingType = SAHPI_SENSOR_READING_TYPE_FLOAT64, .BaseUnits = SAHPI_SU_DEGREES_C, .ModifierUnits = SAHPI_SU_UNSPECIFIED, .ModifierUse = SAHPI_SMUU_NONE, .Percentage = SAHPI_FALSE, .Range.Flags = SAHPI_SRF_MAX | SAHPI_SRF_NORMAL_MAX, .Range.Max.IsSupported = SAHPI_TRUE, .Range.Max.Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, /* This default Max value should be replaced * with Max value retrieved from OA */ .Range.Max.Value.SensorFloat64 = 100, .Range.NormalMax.IsSupported = SAHPI_TRUE, .Range.NormalMax.Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, /* This default Normal Max value should be * replaced with Normal Max value retrieved * from OA */ .Range.NormalMax.Value.SensorFloat64 = 85, .AccuracyFactor = 0, }, .ThresholdDefn = { .IsAccessible = SAHPI_TRUE, .ReadThold = SAHPI_ES_UPPER_CRIT | SAHPI_ES_UPPER_MAJOR, .WriteThold = 0x0, }, .Oem = 0, }, .sensor_info = { .current_state = SAHPI_ES_UNSPECIFIED, .sensor_enable = SAHPI_TRUE, .event_enable = SAHPI_FALSE, .assert_mask = OA_SOAP_STM_UNSPECIFED, .deassert_mask = OA_SOAP_STM_UNSPECIFED, .sensor_reading = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, /* Update the value with current reading */ .Value.SensorFloat64 = 0x0, }, .threshold = { .UpCritical.IsSupported = SAHPI_TRUE, .UpCritical.Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, /* Update the value with critical threshold * reading */ .UpCritical.Value.SensorFloat64 = 100, .UpMajor.IsSupported = SAHPI_TRUE, .UpMajor.Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, /* Update the value with major threshold * reading */ .UpMajor.Value.SensorFloat64 = 85, }, }, .sensor_class = OA_SOAP_BLADE_THERMAL_CLASS, .comment = "Memory Zone thermal status", }, /* Disk zone1 sensor */ { .sensor = { .Num = OA_SOAP_SEN_BLADE_DISK_ZONE1, .Type = SAHPI_TEMPERATURE, .Category = SAHPI_EC_THRESHOLD, .EnableCtrl = SAHPI_TRUE, .EventCtrl = SAHPI_SEC_READ_ONLY, .Events = SAHPI_ES_UNSPECIFIED, .DataFormat = { .IsSupported = SAHPI_TRUE, .ReadingType = SAHPI_SENSOR_READING_TYPE_FLOAT64, .BaseUnits = SAHPI_SU_DEGREES_C, .ModifierUnits = SAHPI_SU_UNSPECIFIED, .ModifierUse = SAHPI_SMUU_NONE, .Percentage = SAHPI_FALSE, .Range.Flags = SAHPI_SRF_MAX | SAHPI_SRF_NORMAL_MAX, .Range.Max.IsSupported = SAHPI_TRUE, .Range.Max.Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, /* This default Max value should be replaced * with Max value retrieved from OA */ .Range.Max.Value.SensorFloat64 = 100, .Range.NormalMax.IsSupported = SAHPI_TRUE, .Range.NormalMax.Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, /* This default Normal Max value should be * replaced with Normal Max value retrieved * from OA */ .Range.NormalMax.Value.SensorFloat64 = 85, .AccuracyFactor = 0, }, .ThresholdDefn = { .IsAccessible = SAHPI_TRUE, .ReadThold = SAHPI_ES_UPPER_CRIT | SAHPI_ES_UPPER_MAJOR, .WriteThold = 0x0, }, .Oem = 0, }, .sensor_info = { .current_state = SAHPI_ES_UNSPECIFIED, .sensor_enable = SAHPI_TRUE, .event_enable = SAHPI_FALSE, .assert_mask = OA_SOAP_STM_UNSPECIFED, .deassert_mask = OA_SOAP_STM_UNSPECIFED, .sensor_reading = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, /* Update the value with current reading */ .Value.SensorFloat64 = 0x0, }, .threshold = { .UpCritical.IsSupported = SAHPI_TRUE, .UpCritical.Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, /* Update the value with critical threshold * reading */ .UpCritical.Value.SensorFloat64 = 100, .UpMajor.IsSupported = SAHPI_TRUE, .UpMajor.Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, /* Update the value with major threshold * reading */ .UpMajor.Value.SensorFloat64 = 85, }, }, .sensor_class = OA_SOAP_BLADE_THERMAL_CLASS, .comment = "Disk Zone thermal status", }, /* Disk zone2 sensor */ { .sensor = { .Num = OA_SOAP_SEN_BLADE_DISK_ZONE2, .Type = SAHPI_TEMPERATURE, .Category = SAHPI_EC_THRESHOLD, .EnableCtrl = SAHPI_TRUE, .EventCtrl = SAHPI_SEC_READ_ONLY, .Events = SAHPI_ES_UNSPECIFIED, .DataFormat = { .IsSupported = SAHPI_TRUE, .ReadingType = SAHPI_SENSOR_READING_TYPE_FLOAT64, .BaseUnits = SAHPI_SU_DEGREES_C, .ModifierUnits = SAHPI_SU_UNSPECIFIED, .ModifierUse = SAHPI_SMUU_NONE, .Percentage = SAHPI_FALSE, .Range.Flags = SAHPI_SRF_MAX | SAHPI_SRF_NORMAL_MAX, .Range.Max.IsSupported = SAHPI_TRUE, .Range.Max.Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, /* This default Max value should be replaced * with Max value retrieved from OA */ .Range.Max.Value.SensorFloat64 = 100, .Range.NormalMax.IsSupported = SAHPI_TRUE, .Range.NormalMax.Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, /* This default Normal Max value should be * replaced with Normal Max value retrieved * from OA */ .Range.NormalMax.Value.SensorFloat64 = 85, .AccuracyFactor = 0, }, .ThresholdDefn = { .IsAccessible = SAHPI_TRUE, .ReadThold = SAHPI_ES_UPPER_CRIT | SAHPI_ES_UPPER_MAJOR, .WriteThold = 0x0, }, .Oem = 0, }, .sensor_info = { .current_state = SAHPI_ES_UNSPECIFIED, .sensor_enable = SAHPI_TRUE, .event_enable = SAHPI_FALSE, .assert_mask = OA_SOAP_STM_UNSPECIFED, .deassert_mask = OA_SOAP_STM_UNSPECIFED, .sensor_reading = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, /* Update the value with current reading */ .Value.SensorFloat64 = 0x0, }, .threshold = { .UpCritical.IsSupported = SAHPI_TRUE, .UpCritical.Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, /* Update the value with critical threshold * reading */ .UpCritical.Value.SensorFloat64 = 100, .UpMajor.IsSupported = SAHPI_TRUE, .UpMajor.Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, /* Update the value with major threshold * reading */ .UpMajor.Value.SensorFloat64 = 85, }, }, .sensor_class = OA_SOAP_BLADE_THERMAL_CLASS, .comment = "Disk Zone thermal status", }, /* Disk zone3 sensor */ { .sensor = { .Num = OA_SOAP_SEN_BLADE_DISK_ZONE3, .Type = SAHPI_TEMPERATURE, .Category = SAHPI_EC_THRESHOLD, .EnableCtrl = SAHPI_TRUE, .EventCtrl = SAHPI_SEC_READ_ONLY, .Events = SAHPI_ES_UNSPECIFIED, .DataFormat = { .IsSupported = SAHPI_TRUE, .ReadingType = SAHPI_SENSOR_READING_TYPE_FLOAT64, .BaseUnits = SAHPI_SU_DEGREES_C, .ModifierUnits = SAHPI_SU_UNSPECIFIED, .ModifierUse = SAHPI_SMUU_NONE, .Percentage = SAHPI_FALSE, .Range.Flags = SAHPI_SRF_MAX | SAHPI_SRF_NORMAL_MAX, .Range.Max.IsSupported = SAHPI_TRUE, .Range.Max.Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, /* This default Max value should be replaced * with Max value retrieved from OA */ .Range.Max.Value.SensorFloat64 = 100, .Range.NormalMax.IsSupported = SAHPI_TRUE, .Range.NormalMax.Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, /* This default Normal Max value should be * replaced with Normal Max value retrieved * from OA */ .Range.NormalMax.Value.SensorFloat64 = 85, .AccuracyFactor = 0, }, .ThresholdDefn = { .IsAccessible = SAHPI_TRUE, .ReadThold = SAHPI_ES_UPPER_CRIT | SAHPI_ES_UPPER_MAJOR, .WriteThold = 0x0, }, .Oem = 0, }, .sensor_info = { .current_state = SAHPI_ES_UNSPECIFIED, .sensor_enable = SAHPI_TRUE, .event_enable = SAHPI_FALSE, .assert_mask = OA_SOAP_STM_UNSPECIFED, .deassert_mask = OA_SOAP_STM_UNSPECIFED, .sensor_reading = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, /* Update the value with current reading */ .Value.SensorFloat64 = 0x0, }, .threshold = { .UpCritical.IsSupported = SAHPI_TRUE, .UpCritical.Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, /* Update the value with critical threshold * reading */ .UpCritical.Value.SensorFloat64 = 100, .UpMajor.IsSupported = SAHPI_TRUE, .UpMajor.Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, /* Update the value with major threshold * reading */ .UpMajor.Value.SensorFloat64 = 85, }, }, .sensor_class = OA_SOAP_BLADE_THERMAL_CLASS, .comment = "Disk Zone thermal status", }, /* Disk zone4 sensor */ { .sensor = { .Num = OA_SOAP_SEN_BLADE_DISK_ZONE4, .Type = SAHPI_TEMPERATURE, .Category = SAHPI_EC_THRESHOLD, .EnableCtrl = SAHPI_TRUE, .EventCtrl = SAHPI_SEC_READ_ONLY, .Events = SAHPI_ES_UNSPECIFIED, .DataFormat = { .IsSupported = SAHPI_TRUE, .ReadingType = SAHPI_SENSOR_READING_TYPE_FLOAT64, .BaseUnits = SAHPI_SU_DEGREES_C, .ModifierUnits = SAHPI_SU_UNSPECIFIED, .ModifierUse = SAHPI_SMUU_NONE, .Percentage = SAHPI_FALSE, .Range.Flags = SAHPI_SRF_MAX | SAHPI_SRF_NORMAL_MAX, .Range.Max.IsSupported = SAHPI_TRUE, .Range.Max.Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, /* This default Max value should be replaced * with Max value retrieved from OA */ .Range.Max.Value.SensorFloat64 = 100, .Range.NormalMax.IsSupported = SAHPI_TRUE, .Range.NormalMax.Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, /* This default Normal Max value should be * replaced with Normal Max value retrieved * from OA */ .Range.NormalMax.Value.SensorFloat64 = 85, .AccuracyFactor = 0, }, .ThresholdDefn = { .IsAccessible = SAHPI_TRUE, .ReadThold = SAHPI_ES_UPPER_CRIT | SAHPI_ES_UPPER_MAJOR, .WriteThold = 0x0, }, .Oem = 0, }, .sensor_info = { .current_state = SAHPI_ES_UNSPECIFIED, .sensor_enable = SAHPI_TRUE, .event_enable = SAHPI_FALSE, .assert_mask = OA_SOAP_STM_UNSPECIFED, .deassert_mask = OA_SOAP_STM_UNSPECIFED, .sensor_reading = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, /* Update the value with current reading */ .Value.SensorFloat64 = 0x0, }, .threshold = { .UpCritical.IsSupported = SAHPI_TRUE, .UpCritical.Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, /* Update the value with critical threshold * reading */ .UpCritical.Value.SensorFloat64 = 100, .UpMajor.IsSupported = SAHPI_TRUE, .UpMajor.Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, /* Update the value with major threshold * reading */ .UpMajor.Value.SensorFloat64 = 85, }, }, .sensor_class = OA_SOAP_BLADE_THERMAL_CLASS, .comment = "Disk Zone thermal status", }, /* CPU 1 sensor */ { .sensor = { .Num = OA_SOAP_SEN_BLADE_CPU1_1, .Type = SAHPI_TEMPERATURE, .Category = SAHPI_EC_THRESHOLD, .EnableCtrl = SAHPI_TRUE, .EventCtrl = SAHPI_SEC_READ_ONLY, .Events = SAHPI_ES_UNSPECIFIED, .DataFormat = { .IsSupported = SAHPI_TRUE, .ReadingType = SAHPI_SENSOR_READING_TYPE_FLOAT64, .BaseUnits = SAHPI_SU_DEGREES_C, .ModifierUnits = SAHPI_SU_UNSPECIFIED, .ModifierUse = SAHPI_SMUU_NONE, .Percentage = SAHPI_FALSE, .Range.Flags = SAHPI_SRF_MAX | SAHPI_SRF_NORMAL_MAX, .Range.Max.IsSupported = SAHPI_TRUE, .Range.Max.Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, /* This default Max value should be replaced * with Max value retrieved from OA */ .Range.Max.Value.SensorFloat64 = 100, .Range.NormalMax.IsSupported = SAHPI_TRUE, .Range.NormalMax.Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, /* This default Normal Max value should be * replaced with Normal Max value retrieved * from OA */ .Range.NormalMax.Value.SensorFloat64 = 95, .AccuracyFactor = 0, }, .ThresholdDefn = { .IsAccessible = SAHPI_TRUE, .ReadThold = SAHPI_ES_UPPER_CRIT | SAHPI_ES_UPPER_MAJOR, .WriteThold = 0x0, }, .Oem = 0, }, .sensor_info = { .current_state = SAHPI_ES_UNSPECIFIED, .sensor_enable = SAHPI_TRUE, .event_enable = SAHPI_FALSE, .assert_mask = OA_SOAP_STM_UNSPECIFED, .deassert_mask = OA_SOAP_STM_UNSPECIFED, .sensor_reading = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, /* Update the value with current reading */ .Value.SensorFloat64 = 0x0, }, .threshold = { .UpCritical.IsSupported = SAHPI_TRUE, .UpCritical.Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, /* Update the value with critical threshold * reading */ .UpCritical.Value.SensorFloat64 = 100, .UpMajor.IsSupported = SAHPI_TRUE, .UpMajor.Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, /* Update the value with major threshold * reading */ .UpMajor.Value.SensorFloat64 = 95, }, }, .sensor_class = OA_SOAP_BLADE_THERMAL_CLASS, .comment = "CPU 1 thermal status", }, /* CPU 1 sensor */ { .sensor = { .Num = OA_SOAP_SEN_BLADE_CPU1_2, .Type = SAHPI_TEMPERATURE, .Category = SAHPI_EC_THRESHOLD, .EnableCtrl = SAHPI_TRUE, .EventCtrl = SAHPI_SEC_READ_ONLY, .Events = SAHPI_ES_UNSPECIFIED, .DataFormat = { .IsSupported = SAHPI_TRUE, .ReadingType = SAHPI_SENSOR_READING_TYPE_FLOAT64, .BaseUnits = SAHPI_SU_DEGREES_C, .ModifierUnits = SAHPI_SU_UNSPECIFIED, .ModifierUse = SAHPI_SMUU_NONE, .Percentage = SAHPI_FALSE, .Range.Flags = SAHPI_SRF_MAX | SAHPI_SRF_NORMAL_MAX, .Range.Max.IsSupported = SAHPI_TRUE, .Range.Max.Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, /* This default Max value should be replaced * with Max value retrieved from OA */ .Range.Max.Value.SensorFloat64 = 100, .Range.NormalMax.IsSupported = SAHPI_TRUE, .Range.NormalMax.Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, /* This default Normal Max value should be * replaced with Normal Max value retrieved * from OA */ .Range.NormalMax.Value.SensorFloat64 = 95, .AccuracyFactor = 0, }, .ThresholdDefn = { .IsAccessible = SAHPI_TRUE, .ReadThold = SAHPI_ES_UPPER_CRIT | SAHPI_ES_UPPER_MAJOR, .WriteThold = 0x0, }, .Oem = 0, }, .sensor_info = { .current_state = SAHPI_ES_UNSPECIFIED, .sensor_enable = SAHPI_TRUE, .event_enable = SAHPI_FALSE, .assert_mask = OA_SOAP_STM_UNSPECIFED, .deassert_mask = OA_SOAP_STM_UNSPECIFED, .sensor_reading = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, /* Update the value with current reading */ .Value.SensorFloat64 = 0x0, }, .threshold = { .UpCritical.IsSupported = SAHPI_TRUE, .UpCritical.Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, /* Update the value with critical threshold * reading */ .UpCritical.Value.SensorFloat64 = 100, .UpMajor.IsSupported = SAHPI_TRUE, .UpMajor.Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, /* Update the value with major threshold * reading */ .UpMajor.Value.SensorFloat64 = 95, }, }, .sensor_class = OA_SOAP_BLADE_THERMAL_CLASS, .comment = "CPU 1 thermal status", }, /* CPU 1 sensor */ { .sensor = { .Num = OA_SOAP_SEN_BLADE_CPU1_3, .Type = SAHPI_TEMPERATURE, .Category = SAHPI_EC_THRESHOLD, .EnableCtrl = SAHPI_TRUE, .EventCtrl = SAHPI_SEC_READ_ONLY, .Events = SAHPI_ES_UNSPECIFIED, .DataFormat = { .IsSupported = SAHPI_TRUE, .ReadingType = SAHPI_SENSOR_READING_TYPE_FLOAT64, .BaseUnits = SAHPI_SU_DEGREES_C, .ModifierUnits = SAHPI_SU_UNSPECIFIED, .ModifierUse = SAHPI_SMUU_NONE, .Percentage = SAHPI_FALSE, .Range.Flags = SAHPI_SRF_MAX | SAHPI_SRF_NORMAL_MAX, .Range.Max.IsSupported = SAHPI_TRUE, .Range.Max.Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, /* This default Max value should be replaced * with Max value retrieved from OA */ .Range.Max.Value.SensorFloat64 = 100, .Range.NormalMax.IsSupported = SAHPI_TRUE, .Range.NormalMax.Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, /* This default Normal Max value should be * replaced with Normal Max value retrieved * from OA */ .Range.NormalMax.Value.SensorFloat64 = 95, .AccuracyFactor = 0, }, .ThresholdDefn = { .IsAccessible = SAHPI_TRUE, .ReadThold = SAHPI_ES_UPPER_CRIT | SAHPI_ES_UPPER_MAJOR, .WriteThold = 0x0, }, .Oem = 0, }, .sensor_info = { .current_state = SAHPI_ES_UNSPECIFIED, .sensor_enable = SAHPI_TRUE, .event_enable = SAHPI_FALSE, .assert_mask = OA_SOAP_STM_UNSPECIFED, .deassert_mask = OA_SOAP_STM_UNSPECIFED, .sensor_reading = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, /* Update the value with current reading */ .Value.SensorFloat64 = 0x0, }, .threshold = { .UpCritical.IsSupported = SAHPI_TRUE, .UpCritical.Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, /* Update the value with critical threshold * reading */ .UpCritical.Value.SensorFloat64 = 100, .UpMajor.IsSupported = SAHPI_TRUE, .UpMajor.Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, /* Update the value with major threshold * reading */ .UpMajor.Value.SensorFloat64 = 95, }, }, .sensor_class = OA_SOAP_BLADE_THERMAL_CLASS, .comment = "CPU 1 thermal status", }, /* CPU 1 sensor */ { .sensor = { .Num = OA_SOAP_SEN_BLADE_CPU1_4, .Type = SAHPI_TEMPERATURE, .Category = SAHPI_EC_THRESHOLD, .EnableCtrl = SAHPI_TRUE, .EventCtrl = SAHPI_SEC_READ_ONLY, .Events = SAHPI_ES_UNSPECIFIED, .DataFormat = { .IsSupported = SAHPI_TRUE, .ReadingType = SAHPI_SENSOR_READING_TYPE_FLOAT64, .BaseUnits = SAHPI_SU_DEGREES_C, .ModifierUnits = SAHPI_SU_UNSPECIFIED, .ModifierUse = SAHPI_SMUU_NONE, .Percentage = SAHPI_FALSE, .Range.Flags = SAHPI_SRF_MAX | SAHPI_SRF_NORMAL_MAX, .Range.Max.IsSupported = SAHPI_TRUE, .Range.Max.Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, /* This default Max value should be replaced * with Max value retrieved from OA */ .Range.Max.Value.SensorFloat64 = 100, .Range.NormalMax.IsSupported = SAHPI_TRUE, .Range.NormalMax.Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, /* This default Normal Max value should be * replaced with Normal Max value retrieved * from OA */ .Range.NormalMax.Value.SensorFloat64 = 95, .AccuracyFactor = 0, }, .ThresholdDefn = { .IsAccessible = SAHPI_TRUE, .ReadThold = SAHPI_ES_UPPER_CRIT | SAHPI_ES_UPPER_MAJOR, .WriteThold = 0x0, }, .Oem = 0, }, .sensor_info = { .current_state = SAHPI_ES_UNSPECIFIED, .sensor_enable = SAHPI_TRUE, .event_enable = SAHPI_FALSE, .assert_mask = OA_SOAP_STM_UNSPECIFED, .deassert_mask = OA_SOAP_STM_UNSPECIFED, .sensor_reading = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, /* Update the value with current reading */ .Value.SensorFloat64 = 0x0, }, .threshold = { .UpCritical.IsSupported = SAHPI_TRUE, .UpCritical.Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, /* Update the value with critical threshold * reading */ .UpCritical.Value.SensorFloat64 = 100, .UpMajor.IsSupported = SAHPI_TRUE, .UpMajor.Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, /* Update the value with major threshold * reading */ .UpMajor.Value.SensorFloat64 = 95, }, }, .sensor_class = OA_SOAP_BLADE_THERMAL_CLASS, .comment = "CPU 1 thermal status", }, /* CPU 2 sensor */ { .sensor = { .Num = OA_SOAP_SEN_BLADE_CPU2_1, .Type = SAHPI_TEMPERATURE, .Category = SAHPI_EC_THRESHOLD, .EnableCtrl = SAHPI_TRUE, .EventCtrl = SAHPI_SEC_READ_ONLY, .Events = SAHPI_ES_UNSPECIFIED, .DataFormat = { .IsSupported = SAHPI_TRUE, .ReadingType = SAHPI_SENSOR_READING_TYPE_FLOAT64, .BaseUnits = SAHPI_SU_DEGREES_C, .ModifierUnits = SAHPI_SU_UNSPECIFIED, .ModifierUse = SAHPI_SMUU_NONE, .Percentage = SAHPI_FALSE, .Range.Flags = SAHPI_SRF_MAX | SAHPI_SRF_NORMAL_MAX, .Range.Max.IsSupported = SAHPI_TRUE, .Range.Max.Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, /* This default Max value should be replaced * with Max value retrieved from OA */ .Range.Max.Value.SensorFloat64 = 100, .Range.NormalMax.IsSupported = SAHPI_TRUE, .Range.NormalMax.Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, /* This default Normal Max value should be * replaced with Normal Max value retrieved * from OA */ .Range.NormalMax.Value.SensorFloat64 = 95, .AccuracyFactor = 0, }, .ThresholdDefn = { .IsAccessible = SAHPI_TRUE, .ReadThold = SAHPI_ES_UPPER_CRIT | SAHPI_ES_UPPER_MAJOR, .WriteThold = 0x0, }, .Oem = 0, }, .sensor_info = { .current_state = SAHPI_ES_UNSPECIFIED, .sensor_enable = SAHPI_TRUE, .event_enable = SAHPI_FALSE, .assert_mask = OA_SOAP_STM_UNSPECIFED, .deassert_mask = OA_SOAP_STM_UNSPECIFED, .sensor_reading = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, /* Update the value with current reading */ .Value.SensorFloat64 = 0x0, }, .threshold = { .UpCritical.IsSupported = SAHPI_TRUE, .UpCritical.Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, /* Update the value with critical threshold * reading */ .UpCritical.Value.SensorFloat64 = 100, .UpMajor.IsSupported = SAHPI_TRUE, .UpMajor.Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, /* Update the value with major threshold * reading */ .UpMajor.Value.SensorFloat64 = 95, }, }, .sensor_class = OA_SOAP_BLADE_THERMAL_CLASS, .comment = "CPU 2 thermal status", }, /* CPU 2 sensor */ { .sensor = { .Num = OA_SOAP_SEN_BLADE_CPU2_2, .Type = SAHPI_TEMPERATURE, .Category = SAHPI_EC_THRESHOLD, .EnableCtrl = SAHPI_TRUE, .EventCtrl = SAHPI_SEC_READ_ONLY, .Events = SAHPI_ES_UNSPECIFIED, .DataFormat = { .IsSupported = SAHPI_TRUE, .ReadingType = SAHPI_SENSOR_READING_TYPE_FLOAT64, .BaseUnits = SAHPI_SU_DEGREES_C, .ModifierUnits = SAHPI_SU_UNSPECIFIED, .ModifierUse = SAHPI_SMUU_NONE, .Percentage = SAHPI_FALSE, .Range.Flags = SAHPI_SRF_MAX | SAHPI_SRF_NORMAL_MAX, .Range.Max.IsSupported = SAHPI_TRUE, .Range.Max.Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, /* This default Max value should be replaced * with Max value retrieved from OA */ .Range.Max.Value.SensorFloat64 = 100, .Range.NormalMax.IsSupported = SAHPI_TRUE, .Range.NormalMax.Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, /* This default Normal Max value should be * replaced with Normal Max value retrieved * from OA */ .Range.NormalMax.Value.SensorFloat64 = 95, .AccuracyFactor = 0, }, .ThresholdDefn = { .IsAccessible = SAHPI_TRUE, .ReadThold = SAHPI_ES_UPPER_CRIT | SAHPI_ES_UPPER_MAJOR, .WriteThold = 0x0, }, .Oem = 0, }, .sensor_info = { .current_state = SAHPI_ES_UNSPECIFIED, .sensor_enable = SAHPI_TRUE, .event_enable = SAHPI_FALSE, .assert_mask = OA_SOAP_STM_UNSPECIFED, .deassert_mask = OA_SOAP_STM_UNSPECIFED, .sensor_reading = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, /* Update the value with current reading */ .Value.SensorFloat64 = 0x0, }, .threshold = { .UpCritical.IsSupported = SAHPI_TRUE, .UpCritical.Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, /* Update the value with critical threshold * reading */ .UpCritical.Value.SensorFloat64 = 100, .UpMajor.IsSupported = SAHPI_TRUE, .UpMajor.Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, /* Update the value with major threshold * reading */ .UpMajor.Value.SensorFloat64 = 95, }, }, .sensor_class = OA_SOAP_BLADE_THERMAL_CLASS, .comment = "CPU 2 thermal status", }, /* CPU 2 sensor */ { .sensor = { .Num = OA_SOAP_SEN_BLADE_CPU2_3, .Type = SAHPI_TEMPERATURE, .Category = SAHPI_EC_THRESHOLD, .EnableCtrl = SAHPI_TRUE, .EventCtrl = SAHPI_SEC_READ_ONLY, .Events = SAHPI_ES_UNSPECIFIED, .DataFormat = { .IsSupported = SAHPI_TRUE, .ReadingType = SAHPI_SENSOR_READING_TYPE_FLOAT64, .BaseUnits = SAHPI_SU_DEGREES_C, .ModifierUnits = SAHPI_SU_UNSPECIFIED, .ModifierUse = SAHPI_SMUU_NONE, .Percentage = SAHPI_FALSE, .Range.Flags = SAHPI_SRF_MAX | SAHPI_SRF_NORMAL_MAX, .Range.Max.IsSupported = SAHPI_TRUE, .Range.Max.Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, /* This default Max value should be replaced * with Max value retrieved from OA */ .Range.Max.Value.SensorFloat64 = 100, .Range.NormalMax.IsSupported = SAHPI_TRUE, .Range.NormalMax.Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, /* This default Normal Max value should be * replaced with Normal Max value retrieved * from OA */ .Range.NormalMax.Value.SensorFloat64 = 95, .AccuracyFactor = 0, }, .ThresholdDefn = { .IsAccessible = SAHPI_TRUE, .ReadThold = SAHPI_ES_UPPER_CRIT | SAHPI_ES_UPPER_MAJOR, .WriteThold = 0x0, }, .Oem = 0, }, .sensor_info = { .current_state = SAHPI_ES_UNSPECIFIED, .sensor_enable = SAHPI_TRUE, .event_enable = SAHPI_FALSE, .assert_mask = OA_SOAP_STM_UNSPECIFED, .deassert_mask = OA_SOAP_STM_UNSPECIFED, .sensor_reading = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, /* Update the value with current reading */ .Value.SensorFloat64 = 0x0, }, .threshold = { .UpCritical.IsSupported = SAHPI_TRUE, .UpCritical.Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, /* Update the value with critical threshold * reading */ .UpCritical.Value.SensorFloat64 = 100, .UpMajor.IsSupported = SAHPI_TRUE, .UpMajor.Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, /* Update the value with major threshold * reading */ .UpMajor.Value.SensorFloat64 = 95, }, }, .sensor_class = OA_SOAP_BLADE_THERMAL_CLASS, .comment = "CPU 2 thermal status", }, /* CPU 2 sensor */ { .sensor = { .Num = OA_SOAP_SEN_BLADE_CPU2_4, .Type = SAHPI_TEMPERATURE, .Category = SAHPI_EC_THRESHOLD, .EnableCtrl = SAHPI_TRUE, .EventCtrl = SAHPI_SEC_READ_ONLY, .Events = SAHPI_ES_UNSPECIFIED, .DataFormat = { .IsSupported = SAHPI_TRUE, .ReadingType = SAHPI_SENSOR_READING_TYPE_FLOAT64, .BaseUnits = SAHPI_SU_DEGREES_C, .ModifierUnits = SAHPI_SU_UNSPECIFIED, .ModifierUse = SAHPI_SMUU_NONE, .Percentage = SAHPI_FALSE, .Range.Flags = SAHPI_SRF_MAX | SAHPI_SRF_NORMAL_MAX, .Range.Max.IsSupported = SAHPI_TRUE, .Range.Max.Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, /* This default Max value should be replaced * with Max value retrieved from OA */ .Range.Max.Value.SensorFloat64 = 100, .Range.NormalMax.IsSupported = SAHPI_TRUE, .Range.NormalMax.Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, /* This default Normal Max value should be * replaced with Normal Max value retrieved * from OA */ .Range.NormalMax.Value.SensorFloat64 = 95, .AccuracyFactor = 0, }, .ThresholdDefn = { .IsAccessible = SAHPI_TRUE, .ReadThold = SAHPI_ES_UPPER_CRIT | SAHPI_ES_UPPER_MAJOR, .WriteThold = 0x0, }, .Oem = 0, }, .sensor_info = { .current_state = SAHPI_ES_UNSPECIFIED, .sensor_enable = SAHPI_TRUE, .event_enable = SAHPI_FALSE, .assert_mask = OA_SOAP_STM_UNSPECIFED, .deassert_mask = OA_SOAP_STM_UNSPECIFED, .sensor_reading = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, /* Update the value with current reading */ .Value.SensorFloat64 = 0x0, }, .threshold = { .UpCritical.IsSupported = SAHPI_TRUE, .UpCritical.Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, /* Update the value with critical threshold * reading */ .UpCritical.Value.SensorFloat64 = 100, .UpMajor.IsSupported = SAHPI_TRUE, .UpMajor.Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, /* Update the value with major threshold * reading */ .UpMajor.Value.SensorFloat64 = 95, }, }, .sensor_class = OA_SOAP_BLADE_THERMAL_CLASS, .comment = "CPU 2 thermal status", }, /* CPU 3 sensor */ { .sensor = { .Num = OA_SOAP_SEN_BLADE_CPU3_1, .Type = SAHPI_TEMPERATURE, .Category = SAHPI_EC_THRESHOLD, .EnableCtrl = SAHPI_TRUE, .EventCtrl = SAHPI_SEC_READ_ONLY, .Events = SAHPI_ES_UNSPECIFIED, .DataFormat = { .IsSupported = SAHPI_TRUE, .ReadingType = SAHPI_SENSOR_READING_TYPE_FLOAT64, .BaseUnits = SAHPI_SU_DEGREES_C, .ModifierUnits = SAHPI_SU_UNSPECIFIED, .ModifierUse = SAHPI_SMUU_NONE, .Percentage = SAHPI_FALSE, .Range.Flags = SAHPI_SRF_MAX | SAHPI_SRF_NORMAL_MAX, .Range.Max.IsSupported = SAHPI_TRUE, .Range.Max.Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, /* This default Max value should be replaced * with Max value retrieved from OA */ .Range.Max.Value.SensorFloat64 = 100, .Range.NormalMax.IsSupported = SAHPI_TRUE, .Range.NormalMax.Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, /* This default Normal Max value should be * replaced with Normal Max value retrieved * from OA */ .Range.NormalMax.Value.SensorFloat64 = 95, .AccuracyFactor = 0, }, .ThresholdDefn = { .IsAccessible = SAHPI_TRUE, .ReadThold = SAHPI_ES_UPPER_CRIT | SAHPI_ES_UPPER_MAJOR, .WriteThold = 0x0, }, .Oem = 0, }, .sensor_info = { .current_state = SAHPI_ES_UNSPECIFIED, .sensor_enable = SAHPI_TRUE, .event_enable = SAHPI_FALSE, .assert_mask = OA_SOAP_STM_UNSPECIFED, .deassert_mask = OA_SOAP_STM_UNSPECIFED, .sensor_reading = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, /* Update the value with current reading */ .Value.SensorFloat64 = 0x0, }, .threshold = { .UpCritical.IsSupported = SAHPI_TRUE, .UpCritical.Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, /* Update the value with critical threshold * reading */ .UpCritical.Value.SensorFloat64 = 100, .UpMajor.IsSupported = SAHPI_TRUE, .UpMajor.Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, /* Update the value with major threshold * reading */ .UpMajor.Value.SensorFloat64 = 95, }, }, .sensor_class = OA_SOAP_BLADE_THERMAL_CLASS, .comment = "CPU 3 thermal status", }, /* CPU 3 sensor */ { .sensor = { .Num = OA_SOAP_SEN_BLADE_CPU3_2, .Type = SAHPI_TEMPERATURE, .Category = SAHPI_EC_THRESHOLD, .EnableCtrl = SAHPI_TRUE, .EventCtrl = SAHPI_SEC_READ_ONLY, .Events = SAHPI_ES_UNSPECIFIED, .DataFormat = { .IsSupported = SAHPI_TRUE, .ReadingType = SAHPI_SENSOR_READING_TYPE_FLOAT64, .BaseUnits = SAHPI_SU_DEGREES_C, .ModifierUnits = SAHPI_SU_UNSPECIFIED, .ModifierUse = SAHPI_SMUU_NONE, .Percentage = SAHPI_FALSE, .Range.Flags = SAHPI_SRF_MAX | SAHPI_SRF_NORMAL_MAX, .Range.Max.IsSupported = SAHPI_TRUE, .Range.Max.Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, /* This default Max value should be replaced * with Max value retrieved from OA */ .Range.Max.Value.SensorFloat64 = 100, .Range.NormalMax.IsSupported = SAHPI_TRUE, .Range.NormalMax.Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, /* This default Normal Max value should be * replaced with Normal Max value retrieved * from OA */ .Range.NormalMax.Value.SensorFloat64 = 95, .AccuracyFactor = 0, }, .ThresholdDefn = { .IsAccessible = SAHPI_TRUE, .ReadThold = SAHPI_ES_UPPER_CRIT | SAHPI_ES_UPPER_MAJOR, .WriteThold = 0x0, }, .Oem = 0, }, .sensor_info = { .current_state = SAHPI_ES_UNSPECIFIED, .sensor_enable = SAHPI_TRUE, .event_enable = SAHPI_FALSE, .assert_mask = OA_SOAP_STM_UNSPECIFED, .deassert_mask = OA_SOAP_STM_UNSPECIFED, .sensor_reading = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, /* Update the value with current reading */ .Value.SensorFloat64 = 0x0, }, .threshold = { .UpCritical.IsSupported = SAHPI_TRUE, .UpCritical.Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, /* Update the value with critical threshold * reading */ .UpCritical.Value.SensorFloat64 = 100, .UpMajor.IsSupported = SAHPI_TRUE, .UpMajor.Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, /* Update the value with major threshold * reading */ .UpMajor.Value.SensorFloat64 = 95, }, }, .sensor_class = OA_SOAP_BLADE_THERMAL_CLASS, .comment = "CPU 3 thermal status", }, /* CPU 3 sensor */ { .sensor = { .Num = OA_SOAP_SEN_BLADE_CPU3_3, .Type = SAHPI_TEMPERATURE, .Category = SAHPI_EC_THRESHOLD, .EnableCtrl = SAHPI_TRUE, .EventCtrl = SAHPI_SEC_READ_ONLY, .Events = SAHPI_ES_UNSPECIFIED, .DataFormat = { .IsSupported = SAHPI_TRUE, .ReadingType = SAHPI_SENSOR_READING_TYPE_FLOAT64, .BaseUnits = SAHPI_SU_DEGREES_C, .ModifierUnits = SAHPI_SU_UNSPECIFIED, .ModifierUse = SAHPI_SMUU_NONE, .Percentage = SAHPI_FALSE, .Range.Flags = SAHPI_SRF_MAX | SAHPI_SRF_NORMAL_MAX, .Range.Max.IsSupported = SAHPI_TRUE, .Range.Max.Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, /* This default Max value should be replaced * with Max value retrieved from OA */ .Range.Max.Value.SensorFloat64 = 100, .Range.NormalMax.IsSupported = SAHPI_TRUE, .Range.NormalMax.Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, /* This default Normal Max value should be * replaced with Normal Max value retrieved * from OA */ .Range.NormalMax.Value.SensorFloat64 = 95, .AccuracyFactor = 0, }, .ThresholdDefn = { .IsAccessible = SAHPI_TRUE, .ReadThold = SAHPI_ES_UPPER_CRIT | SAHPI_ES_UPPER_MAJOR, .WriteThold = 0x0, }, .Oem = 0, }, .sensor_info = { .current_state = SAHPI_ES_UNSPECIFIED, .sensor_enable = SAHPI_TRUE, .event_enable = SAHPI_FALSE, .assert_mask = OA_SOAP_STM_UNSPECIFED, .deassert_mask = OA_SOAP_STM_UNSPECIFED, .sensor_reading = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, /* Update the value with current reading */ .Value.SensorFloat64 = 0x0, }, .threshold = { .UpCritical.IsSupported = SAHPI_TRUE, .UpCritical.Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, /* Update the value with critical threshold * reading */ .UpCritical.Value.SensorFloat64 = 100, .UpMajor.IsSupported = SAHPI_TRUE, .UpMajor.Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, /* Update the value with major threshold * reading */ .UpMajor.Value.SensorFloat64 = 95, }, }, .sensor_class = OA_SOAP_BLADE_THERMAL_CLASS, .comment = "CPU 3 thermal status", }, /* CPU 3 sensor */ { .sensor = { .Num = OA_SOAP_SEN_BLADE_CPU3_4, .Type = SAHPI_TEMPERATURE, .Category = SAHPI_EC_THRESHOLD, .EnableCtrl = SAHPI_TRUE, .EventCtrl = SAHPI_SEC_READ_ONLY, .Events = SAHPI_ES_UNSPECIFIED, .DataFormat = { .IsSupported = SAHPI_TRUE, .ReadingType = SAHPI_SENSOR_READING_TYPE_FLOAT64, .BaseUnits = SAHPI_SU_DEGREES_C, .ModifierUnits = SAHPI_SU_UNSPECIFIED, .ModifierUse = SAHPI_SMUU_NONE, .Percentage = SAHPI_FALSE, .Range.Flags = SAHPI_SRF_MAX | SAHPI_SRF_NORMAL_MAX, .Range.Max.IsSupported = SAHPI_TRUE, .Range.Max.Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, /* This default Max value should be replaced * with Max value retrieved from OA */ .Range.Max.Value.SensorFloat64 = 100, .Range.NormalMax.IsSupported = SAHPI_TRUE, .Range.NormalMax.Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, /* This default Normal Max value should be * replaced with Normal Max value retrieved * from OA */ .Range.NormalMax.Value.SensorFloat64 = 95, .AccuracyFactor = 0, }, .ThresholdDefn = { .IsAccessible = SAHPI_TRUE, .ReadThold = SAHPI_ES_UPPER_CRIT | SAHPI_ES_UPPER_MAJOR, .WriteThold = 0x0, }, .Oem = 0, }, .sensor_info = { .current_state = SAHPI_ES_UNSPECIFIED, .sensor_enable = SAHPI_TRUE, .event_enable = SAHPI_FALSE, .assert_mask = OA_SOAP_STM_UNSPECIFED, .deassert_mask = OA_SOAP_STM_UNSPECIFED, .sensor_reading = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, /* Update the value with current reading */ .Value.SensorFloat64 = 0x0, }, .threshold = { .UpCritical.IsSupported = SAHPI_TRUE, .UpCritical.Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, /* Update the value with critical threshold * reading */ .UpCritical.Value.SensorFloat64 = 100, .UpMajor.IsSupported = SAHPI_TRUE, .UpMajor.Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, /* Update the value with major threshold * reading */ .UpMajor.Value.SensorFloat64 = 95, }, }, .sensor_class = OA_SOAP_BLADE_THERMAL_CLASS, .comment = "CPU 3 thermal status", }, /* CPU 4 sensor */ { .sensor = { .Num = OA_SOAP_SEN_BLADE_CPU4_1, .Type = SAHPI_TEMPERATURE, .Category = SAHPI_EC_THRESHOLD, .EnableCtrl = SAHPI_TRUE, .EventCtrl = SAHPI_SEC_READ_ONLY, .Events = SAHPI_ES_UNSPECIFIED, .DataFormat = { .IsSupported = SAHPI_TRUE, .ReadingType = SAHPI_SENSOR_READING_TYPE_FLOAT64, .BaseUnits = SAHPI_SU_DEGREES_C, .ModifierUnits = SAHPI_SU_UNSPECIFIED, .ModifierUse = SAHPI_SMUU_NONE, .Percentage = SAHPI_FALSE, .Range.Flags = SAHPI_SRF_MAX | SAHPI_SRF_NORMAL_MAX, .Range.Max.IsSupported = SAHPI_TRUE, .Range.Max.Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, /* This default Max value should be replaced * with Max value retrieved from OA */ .Range.Max.Value.SensorFloat64 = 100, .Range.NormalMax.IsSupported = SAHPI_TRUE, .Range.NormalMax.Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, /* This default Normal Max value should be * replaced with Normal Max value retrieved * from OA */ .Range.NormalMax.Value.SensorFloat64 = 95, .AccuracyFactor = 0, }, .ThresholdDefn = { .IsAccessible = SAHPI_TRUE, .ReadThold = SAHPI_ES_UPPER_CRIT | SAHPI_ES_UPPER_MAJOR, .WriteThold = 0x0, }, .Oem = 0, }, .sensor_info = { .current_state = SAHPI_ES_UNSPECIFIED, .sensor_enable = SAHPI_TRUE, .event_enable = SAHPI_FALSE, .assert_mask = OA_SOAP_STM_UNSPECIFED, .deassert_mask = OA_SOAP_STM_UNSPECIFED, .sensor_reading = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, /* Update the value with current reading */ .Value.SensorFloat64 = 0x0, }, .threshold = { .UpCritical.IsSupported = SAHPI_TRUE, .UpCritical.Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, /* Update the value with critical threshold * reading */ .UpCritical.Value.SensorFloat64 = 100, .UpMajor.IsSupported = SAHPI_TRUE, .UpMajor.Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, /* Update the value with major threshold * reading */ .UpMajor.Value.SensorFloat64 = 95, }, }, .sensor_class = OA_SOAP_BLADE_THERMAL_CLASS, .comment = "CPU 4 thermal status", }, /* CPU 4 sensor */ { .sensor = { .Num = OA_SOAP_SEN_BLADE_CPU4_2, .Type = SAHPI_TEMPERATURE, .Category = SAHPI_EC_THRESHOLD, .EnableCtrl = SAHPI_TRUE, .EventCtrl = SAHPI_SEC_READ_ONLY, .Events = SAHPI_ES_UNSPECIFIED, .DataFormat = { .IsSupported = SAHPI_TRUE, .ReadingType = SAHPI_SENSOR_READING_TYPE_FLOAT64, .BaseUnits = SAHPI_SU_DEGREES_C, .ModifierUnits = SAHPI_SU_UNSPECIFIED, .ModifierUse = SAHPI_SMUU_NONE, .Percentage = SAHPI_FALSE, .Range.Flags = SAHPI_SRF_MAX | SAHPI_SRF_NORMAL_MAX, .Range.Max.IsSupported = SAHPI_TRUE, .Range.Max.Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, /* This default Max value should be replaced * with Max value retrieved from OA */ .Range.Max.Value.SensorFloat64 = 100, .Range.NormalMax.IsSupported = SAHPI_TRUE, .Range.NormalMax.Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, /* This default Normal Max value should be * replaced with Normal Max value retrieved * from OA */ .Range.NormalMax.Value.SensorFloat64 = 95, .AccuracyFactor = 0, }, .ThresholdDefn = { .IsAccessible = SAHPI_TRUE, .ReadThold = SAHPI_ES_UPPER_CRIT | SAHPI_ES_UPPER_MAJOR, .WriteThold = 0x0, }, .Oem = 0, }, .sensor_info = { .current_state = SAHPI_ES_UNSPECIFIED, .sensor_enable = SAHPI_TRUE, .event_enable = SAHPI_FALSE, .assert_mask = OA_SOAP_STM_UNSPECIFED, .deassert_mask = OA_SOAP_STM_UNSPECIFED, .sensor_reading = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, /* Update the value with current reading */ .Value.SensorFloat64 = 0x0, }, .threshold = { .UpCritical.IsSupported = SAHPI_TRUE, .UpCritical.Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, /* Update the value with critical threshold * reading */ .UpCritical.Value.SensorFloat64 = 100, .UpMajor.IsSupported = SAHPI_TRUE, .UpMajor.Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, /* Update the value with major threshold * reading */ .UpMajor.Value.SensorFloat64 = 95, }, }, .sensor_class = OA_SOAP_BLADE_THERMAL_CLASS, .comment = "CPU 4 thermal status", }, /* CPU 4 sensor */ { .sensor = { .Num = OA_SOAP_SEN_BLADE_CPU4_3, .Type = SAHPI_TEMPERATURE, .Category = SAHPI_EC_THRESHOLD, .EnableCtrl = SAHPI_TRUE, .EventCtrl = SAHPI_SEC_READ_ONLY, .Events = SAHPI_ES_UNSPECIFIED, .DataFormat = { .IsSupported = SAHPI_TRUE, .ReadingType = SAHPI_SENSOR_READING_TYPE_FLOAT64, .BaseUnits = SAHPI_SU_DEGREES_C, .ModifierUnits = SAHPI_SU_UNSPECIFIED, .ModifierUse = SAHPI_SMUU_NONE, .Percentage = SAHPI_FALSE, .Range.Flags = SAHPI_SRF_MAX | SAHPI_SRF_NORMAL_MAX, .Range.Max.IsSupported = SAHPI_TRUE, .Range.Max.Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, /* This default Max value should be replaced * with Max value retrieved from OA */ .Range.Max.Value.SensorFloat64 = 100, .Range.NormalMax.IsSupported = SAHPI_TRUE, .Range.NormalMax.Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, /* This default Normal Max value should be * replaced with Normal Max value retrieved * from OA */ .Range.NormalMax.Value.SensorFloat64 = 95, .AccuracyFactor = 0, }, .ThresholdDefn = { .IsAccessible = SAHPI_TRUE, .ReadThold = SAHPI_ES_UPPER_CRIT | SAHPI_ES_UPPER_MAJOR, .WriteThold = 0x0, }, .Oem = 0, }, .sensor_info = { .current_state = SAHPI_ES_UNSPECIFIED, .sensor_enable = SAHPI_TRUE, .event_enable = SAHPI_FALSE, .assert_mask = OA_SOAP_STM_UNSPECIFED, .deassert_mask = OA_SOAP_STM_UNSPECIFED, .sensor_reading = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, /* Update the value with current reading */ .Value.SensorFloat64 = 0x0, }, .threshold = { .UpCritical.IsSupported = SAHPI_TRUE, .UpCritical.Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, /* Update the value with critical threshold * reading */ .UpCritical.Value.SensorFloat64 = 100, .UpMajor.IsSupported = SAHPI_TRUE, .UpMajor.Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, /* Update the value with major threshold * reading */ .UpMajor.Value.SensorFloat64 = 95, }, }, .sensor_class = OA_SOAP_BLADE_THERMAL_CLASS, .comment = "CPU 4 thermal status", }, /* CPU 4 sensor */ { .sensor = { .Num = OA_SOAP_SEN_BLADE_CPU4_4, .Type = SAHPI_TEMPERATURE, .Category = SAHPI_EC_THRESHOLD, .EnableCtrl = SAHPI_TRUE, .EventCtrl = SAHPI_SEC_READ_ONLY, .Events = SAHPI_ES_UNSPECIFIED, .DataFormat = { .IsSupported = SAHPI_TRUE, .ReadingType = SAHPI_SENSOR_READING_TYPE_FLOAT64, .BaseUnits = SAHPI_SU_DEGREES_C, .ModifierUnits = SAHPI_SU_UNSPECIFIED, .ModifierUse = SAHPI_SMUU_NONE, .Percentage = SAHPI_FALSE, .Range.Flags = SAHPI_SRF_MAX | SAHPI_SRF_NORMAL_MAX, .Range.Max.IsSupported = SAHPI_TRUE, .Range.Max.Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, /* This default Max value should be replaced * with Max value retrieved from OA */ .Range.Max.Value.SensorFloat64 = 100, .Range.NormalMax.IsSupported = SAHPI_TRUE, .Range.NormalMax.Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, /* This default Normal Max value should be * replaced with Normal Max value retrieved * from OA */ .Range.NormalMax.Value.SensorFloat64 = 95, .AccuracyFactor = 0, }, .ThresholdDefn = { .IsAccessible = SAHPI_TRUE, .ReadThold = SAHPI_ES_UPPER_CRIT | SAHPI_ES_UPPER_MAJOR, .WriteThold = 0x0, }, .Oem = 0, }, .sensor_info = { .current_state = SAHPI_ES_UNSPECIFIED, .sensor_enable = SAHPI_TRUE, .event_enable = SAHPI_FALSE, .assert_mask = OA_SOAP_STM_UNSPECIFED, .deassert_mask = OA_SOAP_STM_UNSPECIFED, .sensor_reading = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, /* Update the value with current reading */ .Value.SensorFloat64 = 0x0, }, .threshold = { .UpCritical.IsSupported = SAHPI_TRUE, .UpCritical.Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, /* Update the value with critical threshold * reading */ .UpCritical.Value.SensorFloat64 = 100, .UpMajor.IsSupported = SAHPI_TRUE, .UpMajor.Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, /* Update the value with major threshold * reading */ .UpMajor.Value.SensorFloat64 = 95, }, }, .sensor_class = OA_SOAP_BLADE_THERMAL_CLASS, .comment = "CPU 4 thermal status", }, /* NULL element to end the array */ {} }; /* Global array containing the details of all control rdr structure details * * Please add new entries to the array on supporting new control in OA SOAP */ const struct oa_soap_control oa_soap_cntrl_arr[] = { /* UID status */ { .control = { .Num = OA_SOAP_UID_CNTRL, .OutputType = SAHPI_CTRL_LED, .Type = SAHPI_CTRL_TYPE_DIGITAL, .TypeUnion.Digital.Default = SAHPI_CTRL_STATE_OFF, .DefaultMode = { .Mode = SAHPI_CTRL_MODE_MANUAL, .ReadOnly = SAHPI_TRUE, }, .WriteOnly = SAHPI_FALSE, .Oem = 0, }, .comment = "UID LED state", }, /* Power status */ { .control = { .Num = OA_SOAP_PWR_CNTRL, .OutputType = SAHPI_CTRL_POWER_STATE, .Type = SAHPI_CTRL_TYPE_DIGITAL, .TypeUnion.Digital.Default = SAHPI_CTRL_STATE_ON, .DefaultMode = { .Mode = SAHPI_CTRL_MODE_MANUAL, .ReadOnly = SAHPI_TRUE, }, .WriteOnly = SAHPI_FALSE, .Oem = 0, }, .comment = "power state", }, /* LCD button lock */ { .control = { .Num = OA_SOAP_LCD_BUTN_LCK_CNTRL, .OutputType = SAHPI_CTRL_FRONT_PANEL_LOCKOUT, .Type = SAHPI_CTRL_TYPE_DIGITAL, .TypeUnion.Digital.Default = SAHPI_CTRL_STATE_OFF, .DefaultMode = { .Mode = SAHPI_CTRL_MODE_MANUAL, .ReadOnly = SAHPI_TRUE, }, .WriteOnly = SAHPI_FALSE, .Oem = 0, }, .comment = "LCD button lock", }, {} /* Terminate array with a null element */ }; /* Array for constructing the RPT entry. The EntiyLocation from 0 to proper * value except for SAHPI_ENT_ROOT * * Please add items to the array on adding a new resource */ const SaHpiRptEntryT oa_soap_rpt_arr[] = { /* OA_SOAP_ENT_ENC */ { .ResourceInfo = { .ManufacturerId = HP_MANUFACTURING_ID, }, .ResourceEntity = { .Entry[0] = { .EntityType = SAHPI_ENT_ROOT, .EntityLocation = 0, }, }, .ResourceCapabilities = SAHPI_CAPABILITY_RDR | SAHPI_CAPABILITY_RESOURCE | SAHPI_CAPABILITY_SENSOR | SAHPI_CAPABILITY_INVENTORY_DATA, .ResourceSeverity = SAHPI_OK, .ResourceFailed = SAHPI_FALSE, .HotSwapCapabilities = 0x0, .ResourceTag.DataType = SAHPI_TL_TYPE_TEXT, .ResourceTag.Language = SAHPI_LANG_ENGLISH, .ResourceTag.DataLength = 9, .ResourceTag.Data = "Enclosure", }, /* OA_SOAP_ENT_SERVER */ { .ResourceInfo = { .ManufacturerId = HP_MANUFACTURING_ID, }, .ResourceEntity = { .Entry[0] = { .EntityType = SAHPI_ENT_SYSTEM_BLADE, .EntityLocation = 0, }, { .EntityType = SAHPI_ENT_ROOT, .EntityLocation = 0, }, }, .ResourceCapabilities = SAHPI_CAPABILITY_RDR | SAHPI_CAPABILITY_RESOURCE | SAHPI_CAPABILITY_SENSOR | SAHPI_CAPABILITY_RESET | SAHPI_CAPABILITY_POWER | SAHPI_CAPABILITY_FRU | SAHPI_CAPABILITY_MANAGED_HOTSWAP | SAHPI_CAPABILITY_CONTROL | SAHPI_CAPABILITY_INVENTORY_DATA, .ResourceSeverity = SAHPI_OK, .ResourceFailed = SAHPI_FALSE, .HotSwapCapabilities = 0x0, .ResourceTag.DataType = SAHPI_TL_TYPE_TEXT, .ResourceTag.Language = SAHPI_LANG_ENGLISH, .ResourceTag.DataLength = 12, .ResourceTag.Data = "Server Blade", }, /* OA_SOAP_ENT_IO */ { .ResourceInfo = { .ManufacturerId = HP_MANUFACTURING_ID, }, .ResourceEntity = { .Entry[0] = { .EntityType = SAHPI_ENT_IO_BLADE, .EntityLocation = 0, }, { .EntityType = SAHPI_ENT_ROOT, .EntityLocation = 0, }, }, .ResourceCapabilities = SAHPI_CAPABILITY_RDR | SAHPI_CAPABILITY_RESOURCE | SAHPI_CAPABILITY_SENSOR | SAHPI_CAPABILITY_FRU | SAHPI_CAPABILITY_INVENTORY_DATA, .ResourceSeverity = SAHPI_OK, .ResourceFailed = SAHPI_FALSE, .HotSwapCapabilities = 0x0, .ResourceTag.DataType = SAHPI_TL_TYPE_TEXT, .ResourceTag.Language = SAHPI_LANG_ENGLISH, .ResourceTag.DataLength = 8, .ResourceTag.Data = "IO Blade", }, /* OA_SOAP_ENT_STORAGE */ { .ResourceInfo = { .ManufacturerId = HP_MANUFACTURING_ID, }, .ResourceEntity = { .Entry[0] = { .EntityType = SAHPI_ENT_DISK_BLADE, .EntityLocation = 0, }, { .EntityType = SAHPI_ENT_ROOT, .EntityLocation = 0, }, }, .ResourceCapabilities = SAHPI_CAPABILITY_RDR | SAHPI_CAPABILITY_RESOURCE | SAHPI_CAPABILITY_SENSOR | SAHPI_CAPABILITY_FRU | SAHPI_CAPABILITY_INVENTORY_DATA, .ResourceSeverity = SAHPI_OK, .ResourceFailed = SAHPI_FALSE, .HotSwapCapabilities = 0x0, .ResourceTag.DataType = SAHPI_TL_TYPE_TEXT, .ResourceTag.Language = SAHPI_LANG_ENGLISH, .ResourceTag.DataLength = 13, .ResourceTag.Data = "Storage Blade", }, /* OA_SOAP_ENT_SWITCH */ { .ResourceInfo = { /* Change the manufacture ID, if the switch is belongs * to Cisco Systems */ .ManufacturerId = HP_MANUFACTURING_ID, }, .ResourceEntity = { .Entry[0] = { .EntityType = SAHPI_ENT_SWITCH_BLADE, .EntityLocation = 0, }, { .EntityType = SAHPI_ENT_ROOT, .EntityLocation = 0, }, }, .ResourceCapabilities = SAHPI_CAPABILITY_RDR | SAHPI_CAPABILITY_RESOURCE | SAHPI_CAPABILITY_SENSOR | SAHPI_CAPABILITY_RESET | SAHPI_CAPABILITY_POWER | SAHPI_CAPABILITY_FRU | SAHPI_CAPABILITY_MANAGED_HOTSWAP | SAHPI_CAPABILITY_CONTROL | SAHPI_CAPABILITY_INVENTORY_DATA, .ResourceSeverity = SAHPI_OK, .ResourceFailed = SAHPI_FALSE, .HotSwapCapabilities = 0x0, .ResourceTag.DataType = SAHPI_TL_TYPE_TEXT, .ResourceTag.Language = SAHPI_LANG_ENGLISH, .ResourceTag.DataLength = 12, .ResourceTag.Data = "Switch Blade", }, /* OA_SOAP_ENT_OA */ { .ResourceInfo = { .ManufacturerId = HP_MANUFACTURING_ID, }, .ResourceEntity = { .Entry[0] = { .EntityType = SAHPI_ENT_SYS_MGMNT_MODULE, .EntityLocation = 0, }, { .EntityType = SAHPI_ENT_ROOT, .EntityLocation = 0, }, }, .ResourceCapabilities = SAHPI_CAPABILITY_RDR | SAHPI_CAPABILITY_RESOURCE | SAHPI_CAPABILITY_SENSOR | SAHPI_CAPABILITY_FRU | SAHPI_CAPABILITY_INVENTORY_DATA, .ResourceSeverity = SAHPI_OK, .ResourceFailed = SAHPI_FALSE, .HotSwapCapabilities = 0x0, .ResourceTag.DataType = SAHPI_TL_TYPE_TEXT, .ResourceTag.Language = SAHPI_LANG_ENGLISH, .ResourceTag.DataLength = 22, .ResourceTag.Data = "Onboard Administrator", }, /* OA_SOAP_ENT_PS_SUBSYS */ { .ResourceInfo = { .ManufacturerId = HP_MANUFACTURING_ID, }, .ResourceEntity = { .Entry[0] = { .EntityType = SAHPI_ENT_POWER_MGMNT, .EntityLocation = 1, }, { .EntityType = SAHPI_ENT_ROOT, .EntityLocation = 0, }, }, .ResourceCapabilities = SAHPI_CAPABILITY_RDR | SAHPI_CAPABILITY_RESOURCE | SAHPI_CAPABILITY_SENSOR, .ResourceSeverity = SAHPI_OK, .ResourceFailed = SAHPI_FALSE, .HotSwapCapabilities = 0x0, .ResourceTag.DataType = SAHPI_TL_TYPE_TEXT, .ResourceTag.Language = SAHPI_LANG_ENGLISH, .ResourceTag.DataLength = 15, .ResourceTag.Data = "Power subsystem", }, /* OA_SOAP_ENT_PS */ { .ResourceInfo = { .ManufacturerId = HP_MANUFACTURING_ID, }, .ResourceEntity = { .Entry[0] = { .EntityType = SAHPI_ENT_POWER_SUPPLY, .EntityLocation = 0, }, { .EntityType = SAHPI_ENT_POWER_MGMNT, .EntityLocation = 1, }, { .EntityType = SAHPI_ENT_ROOT, .EntityLocation = 0, }, }, .ResourceCapabilities = SAHPI_CAPABILITY_RDR | SAHPI_CAPABILITY_RESOURCE | SAHPI_CAPABILITY_SENSOR | SAHPI_CAPABILITY_FRU | SAHPI_CAPABILITY_INVENTORY_DATA, .ResourceSeverity = SAHPI_OK, .ResourceFailed = SAHPI_FALSE, .HotSwapCapabilities = 0x0, .ResourceTag.DataType = SAHPI_TL_TYPE_TEXT, .ResourceTag.Language = SAHPI_LANG_ENGLISH, .ResourceTag.DataLength = 12, .ResourceTag.Data = "Power supply", }, /* OA_SOAP_ENT_THERM_SUBSYS */ { .ResourceInfo = { .ManufacturerId = HP_MANUFACTURING_ID, }, .ResourceEntity = { .Entry[0] = { .EntityType = SAHPI_ENT_COOLING_UNIT, .EntityLocation = 1, }, { .EntityType = SAHPI_ENT_ROOT, .EntityLocation = 0, }, }, .ResourceCapabilities = SAHPI_CAPABILITY_RDR | SAHPI_CAPABILITY_RESOURCE | SAHPI_CAPABILITY_SENSOR, .ResourceSeverity = SAHPI_OK, .ResourceFailed = SAHPI_FALSE, .HotSwapCapabilities = 0x0, .ResourceTag.DataType = SAHPI_TL_TYPE_TEXT, .ResourceTag.Language = SAHPI_LANG_ENGLISH, .ResourceTag.DataLength = 18, .ResourceTag.Data = "Thermal Subsystem", }, /* OA_SOAP_ENT_FZ */ { .ResourceInfo = { .ManufacturerId = HP_MANUFACTURING_ID, }, .ResourceEntity = { .Entry[0] = { .EntityType = SAHPI_ENT_COOLING_DEVICE, .EntityLocation = 0, }, { .EntityType = SAHPI_ENT_COOLING_UNIT, .EntityLocation = 1, }, { .EntityType = SAHPI_ENT_ROOT, .EntityLocation = 0, }, }, .ResourceCapabilities = SAHPI_CAPABILITY_RDR | SAHPI_CAPABILITY_RESOURCE | SAHPI_CAPABILITY_SENSOR | SAHPI_CAPABILITY_INVENTORY_DATA, .ResourceSeverity = SAHPI_OK, .ResourceFailed = SAHPI_FALSE, .HotSwapCapabilities = 0x0, .ResourceTag.DataType = SAHPI_TL_TYPE_TEXT, .ResourceTag.Language = SAHPI_LANG_ENGLISH, .ResourceTag.DataLength = 8, .ResourceTag.Data = "Fan Zone", }, /* OA_SOAP_ENT_FAN */ { .ResourceInfo = { .ManufacturerId = HP_MANUFACTURING_ID, }, .ResourceEntity = { .Entry[0] = { .EntityType = SAHPI_ENT_FAN, .EntityLocation = 0, }, { .EntityType = SAHPI_ENT_COOLING_DEVICE, .EntityLocation = 0, }, { .EntityType = SAHPI_ENT_COOLING_UNIT, .EntityLocation = 1, }, { .EntityType = SAHPI_ENT_ROOT, .EntityLocation = 0, }, }, .ResourceCapabilities = SAHPI_CAPABILITY_RDR | SAHPI_CAPABILITY_RESOURCE | SAHPI_CAPABILITY_SENSOR | SAHPI_CAPABILITY_FRU | SAHPI_CAPABILITY_INVENTORY_DATA, .ResourceSeverity = SAHPI_OK, .ResourceFailed = SAHPI_FALSE, .HotSwapCapabilities = 0x0, .ResourceTag.DataType = SAHPI_TL_TYPE_TEXT, .ResourceTag.Language = SAHPI_LANG_ENGLISH, .ResourceTag.DataLength = 3, .ResourceTag.Data = "Fan", }, /* OA_SOAP_ENT_LCD */ { .ResourceInfo = { .ManufacturerId = HP_MANUFACTURING_ID, }, .ResourceEntity = { .Entry[0] = { .EntityType = SAHPI_ENT_DISPLAY_PANEL, .EntityLocation = 1, }, { .EntityType = SAHPI_ENT_ROOT, .EntityLocation = 0, }, }, .ResourceCapabilities = SAHPI_CAPABILITY_RDR | SAHPI_CAPABILITY_INVENTORY_DATA | SAHPI_CAPABILITY_CONTROL | SAHPI_CAPABILITY_RESOURCE | SAHPI_CAPABILITY_SENSOR, .ResourceSeverity = SAHPI_OK, .ResourceFailed = SAHPI_FALSE, .HotSwapCapabilities = 0x0, .ResourceTag.DataType = SAHPI_TL_TYPE_TEXT, .ResourceTag.Language = SAHPI_LANG_ENGLISH, .ResourceTag.DataLength = 3, .ResourceTag.Data = "LCD", }, /* NULL element to end the array */ {} }; /* Array for constructing the inventory RDR. * * Please add items to the array on adding a new resource or on adding area or * field */ const struct oa_soap_inv_rdr oa_soap_inv_arr[] = { /* OA_SOAP_ENT_ENC */ { .rdr = { .RecordId = 0, .RdrType = SAHPI_INVENTORY_RDR, .RdrTypeUnion.InventoryRec.IdrId = SAHPI_DEFAULT_INVENTORY_ID, .IdString.DataType = SAHPI_TL_TYPE_TEXT, .IdString.Language = SAHPI_LANG_ENGLISH, .IdString.DataLength = 9, .IdString.Data = "Enclosure", }, }, /* OA_SOAP_ENT_SERVER */ { .rdr = { .RecordId = 0, .RdrType = SAHPI_INVENTORY_RDR, .RdrTypeUnion.InventoryRec.IdrId = SAHPI_DEFAULT_INVENTORY_ID, .IdString.DataType = SAHPI_TL_TYPE_TEXT, .IdString.Language = SAHPI_LANG_ENGLISH, .IdString.DataLength = 12, .IdString.Data = "Server Blade", }, }, /* OA_SOAP_ENT_IO */ { .rdr = { .RecordId = 0, .RdrType = SAHPI_INVENTORY_RDR, .RdrTypeUnion.InventoryRec.IdrId = SAHPI_DEFAULT_INVENTORY_ID, .IdString.DataType = SAHPI_TL_TYPE_TEXT, .IdString.Language = SAHPI_LANG_ENGLISH, .IdString.DataLength = 8, .IdString.Data = "IO Blade", }, }, /* OA_SOAP_ENT_STORAGE */ { .rdr = { .RecordId = 0, .RdrType = SAHPI_INVENTORY_RDR, .RdrTypeUnion.InventoryRec.IdrId = SAHPI_DEFAULT_INVENTORY_ID, .IdString.DataType = SAHPI_TL_TYPE_TEXT, .IdString.Language = SAHPI_LANG_ENGLISH, .IdString.DataLength = 13, .IdString.Data = "Storage Blade", }, }, /* OA_SOAP_ENT_SWITCH */ { .rdr = { .RecordId = 0, .RdrType = SAHPI_INVENTORY_RDR, .RdrTypeUnion.InventoryRec.IdrId = SAHPI_DEFAULT_INVENTORY_ID, .IdString.DataType = SAHPI_TL_TYPE_TEXT, .IdString.Language = SAHPI_LANG_ENGLISH, .IdString.DataLength = 12, .IdString.Data = "Switch Blade", }, }, /* OA_SOAP_ENT_OA */ { .rdr = { .RecordId = 0, .RdrType = SAHPI_INVENTORY_RDR, .RdrTypeUnion.InventoryRec.IdrId = SAHPI_DEFAULT_INVENTORY_ID, .IdString.DataType = SAHPI_TL_TYPE_TEXT, .IdString.Language = SAHPI_LANG_ENGLISH, .IdString.DataLength = 22, .IdString.Data = "Onboard Administrator", }, }, /* OA_SOAP_ENT_PS_SUBSYS */ { .rdr = { .RecordId = 0, .RdrType = SAHPI_INVENTORY_RDR, .RdrTypeUnion.InventoryRec.IdrId = SAHPI_DEFAULT_INVENTORY_ID, .IdString.DataType = SAHPI_TL_TYPE_TEXT, .IdString.Language = SAHPI_LANG_ENGLISH, .IdString.DataLength = 15, .IdString.Data = "Power Subsystem", }, }, /* OA_SOAP_ENT_PS */ { .rdr = { .RecordId = 0, .RdrType = SAHPI_INVENTORY_RDR, .RdrTypeUnion.InventoryRec.IdrId = SAHPI_DEFAULT_INVENTORY_ID, .IdString.DataType = SAHPI_TL_TYPE_TEXT, .IdString.Language = SAHPI_LANG_ENGLISH, .IdString.DataLength = 12, .IdString.Data = "Power Supply", }, }, /* OA_SOAP_ENT_THERM_SUBSYS */ { .rdr = { .RecordId = 0, .RdrType = SAHPI_INVENTORY_RDR, .RdrTypeUnion.InventoryRec.IdrId = SAHPI_DEFAULT_INVENTORY_ID, .IdString.DataType = SAHPI_TL_TYPE_TEXT, .IdString.Language = SAHPI_LANG_ENGLISH, .IdString.DataLength = 17, .IdString.Data = "Thermal Subsystem", }, }, /* OA_SOAP_ENT_FZ */ { .rdr = { .RecordId = 0, .RdrType = SAHPI_INVENTORY_RDR, .RdrTypeUnion.InventoryRec.IdrId = SAHPI_DEFAULT_INVENTORY_ID, .IdString.DataType = SAHPI_TL_TYPE_TEXT, .IdString.Language = SAHPI_LANG_ENGLISH, .IdString.DataLength = 8, .IdString.Data = "Fan Zone", }, .inventory = { .inv_rec = { .IdrId = SAHPI_DEFAULT_INVENTORY_ID, .Persistent = SAHPI_FALSE, .Oem = 0, }, .info = { .idr_info = { .IdrId = SAHPI_DEFAULT_INVENTORY_ID, .UpdateCount = 1, .ReadOnly = SAHPI_FALSE, .NumAreas = 1, }, .area_list = NULL, }, }, .area_array = { { .area = { .idr_area_head = { .AreaId = 1, .Type = SAHPI_IDR_AREATYPE_OEM, .ReadOnly = SAHPI_FALSE, .NumFields = 2, }, .next_area = NULL, }, .field_array = { { /* Field for storing the device * bays for this Fan Zone */ .field = { .AreaId = 1, .FieldId = 1, .Type = OA_SOAP_INV_FZ_DEV_BAY, .ReadOnly = SAHPI_FALSE, .Field.DataType = SAHPI_TL_TYPE_TEXT, .Field.Language = SAHPI_LANG_ENGLISH, }, .next_field = NULL, }, { /* Field for storing the fan * bays for this Fan Zone */ .field = { .AreaId = 1, .FieldId = 2, .Type = OA_SOAP_INV_FZ_FAN_BAY, .ReadOnly = SAHPI_FALSE, .Field.DataType = SAHPI_TL_TYPE_TEXT, .Field.Language = SAHPI_LANG_ENGLISH, }, .next_field = NULL, }, }, }, }, }, /* OA_SOAP_ENT_FAN */ { .rdr = { .RecordId = 0, .RdrType = SAHPI_INVENTORY_RDR, .RdrTypeUnion.InventoryRec.IdrId = SAHPI_DEFAULT_INVENTORY_ID, .IdString.DataType = SAHPI_TL_TYPE_TEXT, .IdString.Language = SAHPI_LANG_ENGLISH, .IdString.DataLength = 3, .IdString.Data = "Fan", }, .inventory = { .inv_rec = { .IdrId = SAHPI_DEFAULT_INVENTORY_ID, .Persistent = SAHPI_FALSE, .Oem = 0, }, .info = { .idr_info = { .IdrId = SAHPI_DEFAULT_INVENTORY_ID, .UpdateCount = 1, .ReadOnly = SAHPI_FALSE, .NumAreas = 3, }, .area_list = NULL, }, }, .area_array = { { .area = { .idr_area_head = { .AreaId = 1, .Type = SAHPI_IDR_AREATYPE_PRODUCT_INFO, .ReadOnly = SAHPI_FALSE, .NumFields = 1, }, .next_area = NULL, }, .field_array = { { .field = { .AreaId = 1, .FieldId = 1, .Type = SAHPI_IDR_FIELDTYPE_PRODUCT_NAME, .ReadOnly = SAHPI_FALSE, .Field.DataType = SAHPI_TL_TYPE_TEXT, .Field.Language = SAHPI_LANG_ENGLISH, }, .next_field = NULL, }, }, }, { .area = { .idr_area_head = { .AreaId = 2, .Type = SAHPI_IDR_AREATYPE_BOARD_INFO, .ReadOnly = SAHPI_FALSE, .NumFields = 2, }, .next_area = NULL, }, .field_array = { { .field = { .AreaId = 2, .FieldId = 1, .Type = SAHPI_IDR_FIELDTYPE_PART_NUMBER, .ReadOnly = SAHPI_FALSE, .Field.DataType = SAHPI_TL_TYPE_TEXT, .Field.Language = SAHPI_LANG_ENGLISH, }, .next_field = NULL, }, { .field = { .AreaId = 2, .FieldId = 2, .Type = SAHPI_IDR_FIELDTYPE_SERIAL_NUMBER, .ReadOnly = SAHPI_FALSE, .Field.DataType = SAHPI_TL_TYPE_TEXT, .Field.Language = SAHPI_LANG_ENGLISH, }, .next_field = NULL, }, }, }, { .area = { .idr_area_head = { .AreaId = 3, .Type = SAHPI_IDR_AREATYPE_OEM, .ReadOnly = SAHPI_FALSE, .NumFields = 2, }, .next_area = NULL, }, .field_array = { { /* This field indicates whether * this fan is shared or not */ .field = { .AreaId = 3, .FieldId = 1, .Type = OA_SOAP_INV_FAN_SHARED, .ReadOnly = SAHPI_FALSE, .Field.DataType = SAHPI_TL_TYPE_TEXT, .Field.Language = SAHPI_LANG_ENGLISH, }, .next_field = NULL, }, { /* Field for storing the fan * Fan Zone(s) to which this fan * belongs */ .field = { .AreaId = 3, .FieldId = 2, .Type = OA_SOAP_INV_FZ_NUM, .ReadOnly = SAHPI_FALSE, .Field.DataType = SAHPI_TL_TYPE_TEXT, .Field.Language = SAHPI_LANG_ENGLISH, }, .next_field = NULL, }, }, }, }, }, /* OA_SOAP_ENT_LCD */ { .rdr = { .RecordId = 0, .RdrType = SAHPI_INVENTORY_RDR, .RdrTypeUnion.InventoryRec.IdrId = SAHPI_DEFAULT_INVENTORY_ID, .IdString.DataType = SAHPI_TL_TYPE_TEXT, .IdString.Language = SAHPI_LANG_ENGLISH, .IdString.DataLength = 3, .IdString.Data = "LCD", }, .inventory = { .inv_rec = { .IdrId = SAHPI_DEFAULT_INVENTORY_ID, .Persistent = SAHPI_FALSE, .Oem = 0, }, .info = { .idr_info = { .IdrId = SAHPI_DEFAULT_INVENTORY_ID, .UpdateCount = 1, .ReadOnly = SAHPI_FALSE, .NumAreas = 2, }, .area_list = NULL, }, }, .area_array = { { .area = { .idr_area_head = { .AreaId = 1, .Type = SAHPI_IDR_AREATYPE_PRODUCT_INFO, .ReadOnly = SAHPI_FALSE, .NumFields = 3, }, .next_area = NULL, }, .field_array = { { .field = { .AreaId = 1, .FieldId = 1, .Type = SAHPI_IDR_FIELDTYPE_PRODUCT_NAME, .ReadOnly = SAHPI_FALSE, .Field.DataType = SAHPI_TL_TYPE_TEXT, .Field.Language = SAHPI_LANG_ENGLISH, }, .next_field = NULL, }, { .field = { .AreaId = 1, .FieldId = 2, .Type = SAHPI_IDR_FIELDTYPE_MANUFACTURER, .ReadOnly = SAHPI_FALSE, .Field.DataType = SAHPI_TL_TYPE_TEXT, .Field.Language = SAHPI_LANG_ENGLISH, }, .next_field = NULL, }, { .field = { .AreaId = 1, .FieldId = 3, .Type = SAHPI_IDR_FIELDTYPE_PRODUCT_VERSION, .ReadOnly = SAHPI_FALSE, .Field.DataType = SAHPI_TL_TYPE_TEXT, .Field.Language = SAHPI_LANG_ENGLISH, }, .next_field = NULL, }, }, }, { .area = { .idr_area_head = { .AreaId = 2, .Type = SAHPI_IDR_AREATYPE_BOARD_INFO, .ReadOnly = SAHPI_FALSE, .NumFields = 1, }, .next_area = NULL, }, .field_array = { { .field = { .AreaId = 2, .FieldId = 1, .Type = SAHPI_IDR_FIELDTYPE_PART_NUMBER, .ReadOnly = SAHPI_FALSE, .Field.DataType = SAHPI_TL_TYPE_TEXT, .Field.Language = SAHPI_LANG_ENGLISH, }, .next_field = NULL, }, }, }, }, }, /* NULL element to end the array */ {} }; /* Array for mapping the fans to fan zones * * Please add entries to the array on supporting new enclosure type or on change * in the max fans number defined in oa_soap_inventory.h */ const struct oa_soap_fz_map oa_soap_fz_map_arr[][OA_SOAP_MAX_FAN] = { /* OA_SOAP_ENC_C7000 */ { /* Fan slot 1 */ { .zone = 2, .secondary_zone = 0, .shared = SAHPI_FALSE, }, /* Fan slot 2 */ { .zone = 2, .secondary_zone = 0, .shared = SAHPI_FALSE, }, /* Fan slot 3 */ { .zone = 1, .secondary_zone = 2, .shared = SAHPI_TRUE, }, /* Fan slot 4 */ { .zone = 1, .secondary_zone = 0, .shared = SAHPI_FALSE, }, /* Fan slot 5 */ { .zone = 1, .secondary_zone = 0, .shared = SAHPI_FALSE, }, /* Fan slot 6 */ { .zone = 4, .secondary_zone = 0, .shared = SAHPI_FALSE, }, /* Fan slot 7 */ { .zone = 4, .secondary_zone = 0, .shared = SAHPI_FALSE, }, /* Fan slot 8 */ { .zone = 3, .secondary_zone = 4, .shared = SAHPI_TRUE, }, /* Fan slot 9 */ { .zone = 3, .secondary_zone = 0, .shared = SAHPI_FALSE, }, /* Fan slot 10 */ { .zone = 3, .secondary_zone = 0, .shared = SAHPI_FALSE, }, }, /* OA_SOAP_ENC_C3000 */ { /* Fan slot 1 */ { .zone = 1, .secondary_zone = 0, .shared = SAHPI_FALSE, }, /* Fan slot 2 */ { .zone = 1, .secondary_zone = 0, .shared = SAHPI_FALSE, }, /* Fan slot 3 */ { .zone = 1, .secondary_zone = 0, .shared = SAHPI_FALSE, }, /* Fan slot 4 */ { .zone = 1, .secondary_zone = 0, .shared = SAHPI_FALSE, }, /* Fan slot 5 */ { .zone = 1, .secondary_zone = 0, .shared = SAHPI_FALSE, }, /* Fan slot 6 */ { .zone = 1, .secondary_zone = 0, .shared = SAHPI_FALSE, }, /* Fan slot 7 */ { .zone = -1, .secondary_zone = 0, .shared = SAHPI_FALSE, }, /* Fan slot 8 */ { .zone = -1, .secondary_zone = 0, .shared = SAHPI_FALSE, }, /* Fan slot 9 */ { .zone = -1, .secondary_zone = 0, .shared = SAHPI_FALSE, }, /* Fan slot 10 */ { .zone = -1, .secondary_zone = 0, .shared = SAHPI_FALSE, }, }, /* NULL element to end the array */ {} }; /* Array to hold the values of healthStatus field in extraData structure. * This array is indexed on enum oa_soap_extra_data_health */ const char *oa_soap_health_arr[] = { "UNKNOWN", "OTHER", "OK", "DEGRADED", "STRESSED", "PREDICTIVE_FAILURE", "ERROR", "NONRECOVERABLE_ERROR" }; /* Array to hold the supported fields of diagnosticChecksEx structure. This * array is indexed on enum oa_soap_diag_ex * * When a new field is added to diagnosticChecksEx structure, please update the * enum oa_soap_diag_ex and OA_SOAP_MAX_DIAG_EX in oa_soap_sensor.h */ const char *oa_soap_diag_ex_arr[] = { /* Missing Hardware (such as partner device) */ "deviceMissing", /* Sequencing Error (some hardware was introduced in the wrong order) */ "devicePowerSequence", /* Bonding Error (some hardware was bonded that should not) */ "deviceBonding", /* VCM personality issue */ "profileUnassignedError", /* A device failed lagacy list match and FRU "Manufactured For" * check */ "deviceNotSupported", /* Network Configuration issue. It is likely that iLO is unable to ARP * it's default gateway. */ "networkConfiguration", /* server requested too little power - hardware issue */ "tooLowPowerRequest", /* some hardware warrants a HP call by the customer */ "callHP", /* Generic informational message in syslog */ "deviceInformational", /* IOM storage is missing */ "storageDeviceMissing", /* OA Firmware out of sync */ "firmwareMismatch", /* Enclosure ID mismatch */ "enclosureIdMismatch", /* PowerDelay is in use. 'Power delay in use' is not used as sensor. * 'Power delay in use' does not indicates any failure */ "powerdelayInUse", /* Device mix-and-match alert */ "deviceMixMatch", /* Power capping alert */ "grpcapError", /* IML recorded errors */ "imlRecordedErrors", /* Duplicate Management IP address */ "duplicateMgmtIpAddress" }; /* Array containing the possible sensor description string provided by * getBladeThermalInfoArray soap call */ const char *oa_soap_thermal_sensor_string[] = { "System", "CPU Zone", "CPU 1", "CPU 2", "CPU 3", "CPU 4", "Disk", "Memory", "Ambient" }; /* Array containing the name strings of the possible blade types * which can be accomodated in HP cClass BladeSystem chassis */ const char *oa_soap_bld_type_str[] = { "BL260C", "BL2x220C", "BL460C", "BL465C", "BL480C", "BL495C", "BL680C", "BL685C", "BL860C", "BL870C", "NB50000C", "AMC", "STORAGE", "TAPE", "SAN" }; /* Array containing static thermal sensor configuration for different type of * blade resources in the hardware portfolio supported by HP cClass BladeSystem * This static configuration for each blade type is based on the generalized * information available from BladeThermalInfo response from the blades. * TODO: If a particular version of a blade supports more sensors than the * statically modeled sensors when powered on, then those sensors cannot be * monitored. When the plug-in migrates to HPI-B.03.01 specification, then * condition can be overcome. * * Please modify the array on adding new blade type in oa_soap_resources.h */ const struct oa_soap_static_thermal_sensor_info oa_soap_static_thrm_sen_config[OA_SOAP_MAX_BLD_TYPE] [OA_SOAP_MAX_THRM_SEN] = { /* BL260c blade type */ { {OA_SOAP_SEN_BLADE_SYSTEM_ZONE1, SYSTEM_ZONE, 1}, {OA_SOAP_SEN_BLADE_CPU_ZONE1, CPU_ZONE, 1}, {OA_SOAP_SEN_BLADE_CPU1_1, CPU_1, 1}, {OA_SOAP_SEN_BLADE_CPU2_1, CPU_2, 1}, {OA_SOAP_SEN_BLADE_CPU3_1, CPU_3, 0}, {OA_SOAP_SEN_BLADE_CPU4_1, CPU_4, 0}, {OA_SOAP_SEN_BLADE_DISK_ZONE1, DISK_ZONE, 0}, {OA_SOAP_SEN_BLADE_MEM_ZONE1, MEMORY_ZONE, 1}, {OA_SOAP_SEN_TEMP_STATUS, AMBIENT_ZONE, 1} }, /* BL2x220c blade type */ { {OA_SOAP_SEN_BLADE_SYSTEM_ZONE1, SYSTEM_ZONE, 1}, {OA_SOAP_SEN_BLADE_CPU_ZONE1, CPU_ZONE, 1}, {OA_SOAP_SEN_BLADE_CPU1_1, CPU_1, 1}, {OA_SOAP_SEN_BLADE_CPU2_1, CPU_2, 1}, {OA_SOAP_SEN_BLADE_CPU3_1, CPU_3, 0}, {OA_SOAP_SEN_BLADE_CPU4_1, CPU_4, 0}, {OA_SOAP_SEN_BLADE_DISK_ZONE1, DISK_ZONE, 0}, {OA_SOAP_SEN_BLADE_MEM_ZONE1, MEMORY_ZONE, 1}, {OA_SOAP_SEN_TEMP_STATUS, AMBIENT_ZONE, 1} }, /* BL460c blade type */ { {OA_SOAP_SEN_BLADE_SYSTEM_ZONE1, SYSTEM_ZONE, 1}, {OA_SOAP_SEN_BLADE_CPU_ZONE1, CPU_ZONE, 2}, {OA_SOAP_SEN_BLADE_CPU1_1, CPU_1, 2}, {OA_SOAP_SEN_BLADE_CPU2_1, CPU_2, 2}, {OA_SOAP_SEN_BLADE_CPU3_1, CPU_3, 0}, {OA_SOAP_SEN_BLADE_CPU4_1, CPU_4, 0}, {OA_SOAP_SEN_BLADE_DISK_ZONE1, DISK_ZONE, 0}, {OA_SOAP_SEN_BLADE_MEM_ZONE1, MEMORY_ZONE, 1}, {OA_SOAP_SEN_TEMP_STATUS, AMBIENT_ZONE, 1} }, /* BL465c blade type */ { {OA_SOAP_SEN_BLADE_SYSTEM_ZONE1, SYSTEM_ZONE, 1}, {OA_SOAP_SEN_BLADE_CPU_ZONE1, CPU_ZONE, 1}, {OA_SOAP_SEN_BLADE_CPU1_1, CPU_1, 1}, {OA_SOAP_SEN_BLADE_CPU2_1, CPU_2, 1}, {OA_SOAP_SEN_BLADE_CPU3_1, CPU_3, 0}, {OA_SOAP_SEN_BLADE_CPU4_1, CPU_4, 0}, {OA_SOAP_SEN_BLADE_DISK_ZONE1, DISK_ZONE, 0}, {OA_SOAP_SEN_BLADE_MEM_ZONE1, MEMORY_ZONE, 2}, {OA_SOAP_SEN_TEMP_STATUS, AMBIENT_ZONE, 1} }, /* BL480c blade type */ { {OA_SOAP_SEN_BLADE_SYSTEM_ZONE1, SYSTEM_ZONE, 4}, {OA_SOAP_SEN_BLADE_CPU_ZONE1, CPU_ZONE, 1}, {OA_SOAP_SEN_BLADE_CPU1_1, CPU_1, 1}, {OA_SOAP_SEN_BLADE_CPU2_1, CPU_2, 1}, {OA_SOAP_SEN_BLADE_CPU3_1, CPU_3, 0}, {OA_SOAP_SEN_BLADE_CPU4_1, CPU_4, 0}, {OA_SOAP_SEN_BLADE_DISK_ZONE1, DISK_ZONE, 0}, {OA_SOAP_SEN_BLADE_MEM_ZONE1, MEMORY_ZONE, 1}, {OA_SOAP_SEN_TEMP_STATUS, AMBIENT_ZONE, 1} }, /* BL495c blade type */ { {OA_SOAP_SEN_BLADE_SYSTEM_ZONE1, SYSTEM_ZONE, 0}, {OA_SOAP_SEN_BLADE_CPU_ZONE1, CPU_ZONE, 1}, {OA_SOAP_SEN_BLADE_CPU1_1, CPU_1, 2}, {OA_SOAP_SEN_BLADE_CPU2_1, CPU_2, 2}, {OA_SOAP_SEN_BLADE_CPU3_1, CPU_3, 0}, {OA_SOAP_SEN_BLADE_CPU4_1, CPU_4, 0}, {OA_SOAP_SEN_BLADE_DISK_ZONE1, DISK_ZONE, 0}, {OA_SOAP_SEN_BLADE_MEM_ZONE1, MEMORY_ZONE, 1}, {OA_SOAP_SEN_TEMP_STATUS, AMBIENT_ZONE, 1} }, /* BL680 blade type */ { {OA_SOAP_SEN_BLADE_SYSTEM_ZONE1, SYSTEM_ZONE, 0}, {OA_SOAP_SEN_BLADE_CPU_ZONE1, CPU_ZONE, 1}, {OA_SOAP_SEN_BLADE_CPU1_1, CPU_1, 2}, {OA_SOAP_SEN_BLADE_CPU2_1, CPU_2, 2}, {OA_SOAP_SEN_BLADE_CPU3_1, CPU_3, 0}, {OA_SOAP_SEN_BLADE_CPU4_1, CPU_4, 0}, {OA_SOAP_SEN_BLADE_DISK_ZONE1, DISK_ZONE, 0}, {OA_SOAP_SEN_BLADE_MEM_ZONE1, MEMORY_ZONE, 1}, {OA_SOAP_SEN_TEMP_STATUS, AMBIENT_ZONE, 1} }, /* BL685 blade type */ { {OA_SOAP_SEN_BLADE_SYSTEM_ZONE1, SYSTEM_ZONE, 2}, {OA_SOAP_SEN_BLADE_CPU_ZONE1, CPU_ZONE, 2}, {OA_SOAP_SEN_BLADE_CPU1_1, CPU_1, 1}, {OA_SOAP_SEN_BLADE_CPU2_1, CPU_2, 1}, {OA_SOAP_SEN_BLADE_CPU3_1, CPU_3, 1}, {OA_SOAP_SEN_BLADE_CPU4_1, CPU_4, 1}, {OA_SOAP_SEN_BLADE_DISK_ZONE1, DISK_ZONE, 0}, {OA_SOAP_SEN_BLADE_MEM_ZONE1, MEMORY_ZONE, 0}, {OA_SOAP_SEN_TEMP_STATUS, AMBIENT_ZONE, 1} }, /* BL860c blade type */ { {OA_SOAP_SEN_BLADE_SYSTEM_ZONE1, SYSTEM_ZONE, 4}, {OA_SOAP_SEN_BLADE_CPU_ZONE1, CPU_ZONE, 0}, {OA_SOAP_SEN_BLADE_CPU1_1, CPU_1, 1}, {OA_SOAP_SEN_BLADE_CPU2_1, CPU_2, 1}, {OA_SOAP_SEN_BLADE_CPU3_1, CPU_3, 0}, {OA_SOAP_SEN_BLADE_CPU4_1, CPU_4, 0}, {OA_SOAP_SEN_BLADE_DISK_ZONE1, DISK_ZONE, 0}, {OA_SOAP_SEN_BLADE_MEM_ZONE1, MEMORY_ZONE, 0}, {OA_SOAP_SEN_TEMP_STATUS, AMBIENT_ZONE, 1} }, /* BL870c blade type */ { {OA_SOAP_SEN_BLADE_SYSTEM_ZONE1, SYSTEM_ZONE, 4}, {OA_SOAP_SEN_BLADE_CPU_ZONE1, CPU_ZONE, 0}, {OA_SOAP_SEN_BLADE_CPU1_1, CPU_1, 1}, {OA_SOAP_SEN_BLADE_CPU2_1, CPU_2, 1}, {OA_SOAP_SEN_BLADE_CPU3_1, CPU_3, 1}, {OA_SOAP_SEN_BLADE_CPU4_1, CPU_4, 1}, {OA_SOAP_SEN_BLADE_DISK_ZONE1, DISK_ZONE, 0}, {OA_SOAP_SEN_BLADE_MEM_ZONE1, MEMORY_ZONE, 0}, {OA_SOAP_SEN_TEMP_STATUS, AMBIENT_ZONE, 1} }, /* NB50000c blade type */ { {OA_SOAP_SEN_BLADE_SYSTEM_ZONE1, SYSTEM_ZONE, 4}, {OA_SOAP_SEN_BLADE_CPU_ZONE1, CPU_ZONE, 0}, {OA_SOAP_SEN_BLADE_CPU1_1, CPU_1, 4}, {OA_SOAP_SEN_BLADE_CPU2_1, CPU_2, 4}, {OA_SOAP_SEN_BLADE_CPU3_1, CPU_3, 4}, {OA_SOAP_SEN_BLADE_CPU4_1, CPU_4, 4}, {OA_SOAP_SEN_BLADE_DISK_ZONE1, DISK_ZONE, 0}, {OA_SOAP_SEN_BLADE_MEM_ZONE1, MEMORY_ZONE, 0}, {OA_SOAP_SEN_TEMP_STATUS, AMBIENT_ZONE, 1} }, /* AMC Expansion IO blade type */ { {OA_SOAP_SEN_BLADE_SYSTEM_ZONE1, SYSTEM_ZONE, 1}, {OA_SOAP_SEN_BLADE_CPU_ZONE1, CPU_ZONE, 0}, {OA_SOAP_SEN_BLADE_CPU1_1, CPU_1, 0}, {OA_SOAP_SEN_BLADE_CPU2_1, CPU_2, 0}, {OA_SOAP_SEN_BLADE_CPU3_1, CPU_3, 0}, {OA_SOAP_SEN_BLADE_CPU4_1, CPU_4, 0}, {OA_SOAP_SEN_BLADE_DISK_ZONE1, DISK_ZONE, 0}, {OA_SOAP_SEN_BLADE_MEM_ZONE1, MEMORY_ZONE, 0}, {OA_SOAP_SEN_TEMP_STATUS, AMBIENT_ZONE, 1} }, /* Storage blade type */ { {OA_SOAP_SEN_BLADE_SYSTEM_ZONE1, SYSTEM_ZONE, 0}, {OA_SOAP_SEN_BLADE_CPU_ZONE1, CPU_ZONE, 0}, {OA_SOAP_SEN_BLADE_CPU1_1, CPU_1, 0}, {OA_SOAP_SEN_BLADE_CPU2_1, CPU_2, 0}, {OA_SOAP_SEN_BLADE_CPU3_1, CPU_3, 0}, {OA_SOAP_SEN_BLADE_CPU4_1, CPU_4, 0}, {OA_SOAP_SEN_BLADE_DISK_ZONE1, DISK_ZONE, 1}, {OA_SOAP_SEN_BLADE_MEM_ZONE1, MEMORY_ZONE, 0}, {OA_SOAP_SEN_TEMP_STATUS, AMBIENT_ZONE, 1} }, /* Tape blade type */ { {OA_SOAP_SEN_BLADE_SYSTEM_ZONE1, SYSTEM_ZONE, 0}, {OA_SOAP_SEN_BLADE_CPU_ZONE1, CPU_ZONE, 0}, {OA_SOAP_SEN_BLADE_CPU1_1, CPU_1, 0}, {OA_SOAP_SEN_BLADE_CPU2_1, CPU_2, 0}, {OA_SOAP_SEN_BLADE_CPU3_1, CPU_3, 0}, {OA_SOAP_SEN_BLADE_CPU4_1, CPU_4, 0}, {OA_SOAP_SEN_BLADE_DISK_ZONE1, DISK_ZONE, 1}, {OA_SOAP_SEN_BLADE_MEM_ZONE1, MEMORY_ZONE, 0}, {OA_SOAP_SEN_TEMP_STATUS, AMBIENT_ZONE, 1} }, /* SAN blade type */ { {OA_SOAP_SEN_BLADE_SYSTEM_ZONE1, SYSTEM_ZONE, 0}, {OA_SOAP_SEN_BLADE_CPU_ZONE1, CPU_ZONE, 0}, {OA_SOAP_SEN_BLADE_CPU1_1, CPU_1, 0}, {OA_SOAP_SEN_BLADE_CPU2_1, CPU_2, 0}, {OA_SOAP_SEN_BLADE_CPU3_1, CPU_3, 0}, {OA_SOAP_SEN_BLADE_CPU4_1, CPU_4, 0}, {OA_SOAP_SEN_BLADE_DISK_ZONE1, DISK_ZONE, 1}, {OA_SOAP_SEN_BLADE_MEM_ZONE1, MEMORY_ZONE, 0}, {OA_SOAP_SEN_TEMP_STATUS, AMBIENT_ZONE, 1} }, /* OTHER blade type */ { {OA_SOAP_SEN_BLADE_SYSTEM_ZONE1, SYSTEM_ZONE, 2}, {OA_SOAP_SEN_BLADE_CPU_ZONE1, CPU_ZONE, 2}, {OA_SOAP_SEN_BLADE_CPU1_1, CPU_1, 1}, {OA_SOAP_SEN_BLADE_CPU2_1, CPU_2, 1}, {OA_SOAP_SEN_BLADE_CPU3_1, CPU_3, 1}, {OA_SOAP_SEN_BLADE_CPU4_1, CPU_4, 1}, {OA_SOAP_SEN_BLADE_DISK_ZONE1, DISK_ZONE, 0}, {OA_SOAP_SEN_BLADE_MEM_ZONE1, MEMORY_ZONE, 1}, {OA_SOAP_SEN_TEMP_STATUS, AMBIENT_ZONE, 1} }, }; /* Array containing the sensor base number of the thermal sensor types. * These base number for sensor are required during sensor read operation */ const SaHpiInt32T oa_soap_bld_thrm_sen_base_arr[] = { OA_SOAP_SEN_BLADE_SYSTEM_ZONE1, OA_SOAP_SEN_BLADE_SYSTEM_ZONE1, OA_SOAP_SEN_BLADE_SYSTEM_ZONE1, OA_SOAP_SEN_BLADE_SYSTEM_ZONE1, OA_SOAP_SEN_BLADE_CPU_ZONE1, OA_SOAP_SEN_BLADE_CPU_ZONE1, OA_SOAP_SEN_BLADE_CPU_ZONE1, OA_SOAP_SEN_BLADE_CPU_ZONE1, OA_SOAP_SEN_BLADE_MEM_ZONE1, OA_SOAP_SEN_BLADE_MEM_ZONE1, OA_SOAP_SEN_BLADE_MEM_ZONE1, OA_SOAP_SEN_BLADE_MEM_ZONE1, OA_SOAP_SEN_BLADE_DISK_ZONE1, OA_SOAP_SEN_BLADE_DISK_ZONE1, OA_SOAP_SEN_BLADE_DISK_ZONE1, OA_SOAP_SEN_BLADE_DISK_ZONE1, OA_SOAP_SEN_BLADE_CPU1_1, OA_SOAP_SEN_BLADE_CPU1_1, OA_SOAP_SEN_BLADE_CPU1_1, OA_SOAP_SEN_BLADE_CPU1_1, OA_SOAP_SEN_BLADE_CPU2_1, OA_SOAP_SEN_BLADE_CPU2_1, OA_SOAP_SEN_BLADE_CPU2_1, OA_SOAP_SEN_BLADE_CPU2_1, OA_SOAP_SEN_BLADE_CPU3_1, OA_SOAP_SEN_BLADE_CPU3_1, OA_SOAP_SEN_BLADE_CPU3_1, OA_SOAP_SEN_BLADE_CPU3_1, OA_SOAP_SEN_BLADE_CPU4_1, OA_SOAP_SEN_BLADE_CPU4_1, OA_SOAP_SEN_BLADE_CPU4_1, OA_SOAP_SEN_BLADE_CPU4_1, }; /* Array which indicates the power status of the blade in different slots */ SaHpiPowerStateT oa_soap_bay_pwr_status[OA_SOAP_C7000_MAX_BLADE] = { SAHPI_POWER_OFF, SAHPI_POWER_OFF, SAHPI_POWER_OFF, SAHPI_POWER_OFF, SAHPI_POWER_OFF, SAHPI_POWER_OFF, SAHPI_POWER_OFF, SAHPI_POWER_OFF, SAHPI_POWER_OFF, SAHPI_POWER_OFF, SAHPI_POWER_OFF, SAHPI_POWER_OFF, SAHPI_POWER_OFF, SAHPI_POWER_OFF, SAHPI_POWER_OFF, SAHPI_POWER_OFF }; openhpi-2.14.1/plugins/oa_soap/oa_soap_callsupport.h0000644000076400007640000002236211302566663017532 0ustar /* * Copyright (C) 2007-2008, Hewlett-Packard Development Company, LLP * All rights reserved. * * 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. * * Neither the name of the Hewlett-Packard Corporation, nor the names * of its contributors may be used to endorse or promote products * derived from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * Author(s) * Bryan Sutula * * * This file implements support functions that are used to perform SOAP * calls. See also oa_soap_callsupport.c for further details. */ #ifndef _INC_OA_SOAP_CALLSUPPORT_H_ #define _INC_OA_SOAP_CALLSUPPORT_H_ /* Include files */ #include #include #include /* Size limits */ /* TODO: Is there a way to check all of these, to make sure they are big * enough, but not too big? */ #define OA_SOAP_SERVER_SIZE 160 #define OA_SOAP_USER_SIZE 80 #define OA_SOAP_HEADER_SIZE (200+OA_SOAP_SERVER_SIZE) #define OA_SOAP_LOGIN_SIZE 2000 /* Careful...needs to be big enough * for failed login attempts */ #define OA_SOAP_REQ_BUFFER_SIZE 2000 #define OA_SOAP_RESP_BUFFER_SIZE 4000 /* 8000 seems to be the maximum * usable size, based on the * choices made by the SSL library */ /* These need to match up */ #define OA_SOAP_SESSIONKEY_SIZE 16 #define OA_SOAP_SESS_KEY_LABEL "0123456_hi_there" /* Macros available for callers of these routines */ /** * soap_request * @connection: OA SOAP connection provided by soap_open() * @fmt: printf-style format string, used to build the SOAP command * @...: printf-style variable arguments, used with "fmt" * * This is the main function used by most of the individual SOAP routines. * It creates the SOAP request string and uses soap_call() to do the real * work. * * Return value: 0 for successful SOAP call, various negative values for * errors. (See soap_call() for details on various error return values.) **/ #define soap_request(connection, fmt, ...) \ ( \ snprintf(connection->req_buf, OA_SOAP_REQ_BUFFER_SIZE, \ OA_XML_REQUEST fmt OA_XML_TAIL, ## __VA_ARGS__), \ soap_call(connection) \ ) /** * soap_ignore_errors * @connection: OA SOAP connection provided by soap_open() * @boolean: True if errors are not to be printed, false (0) if errors * are to be reported through the normal OpenHPI err() macro * * Generally, OpenHPI error macros are used to report any errors that * occur. Some of this error reporting can be masked, so that the user * isn't bothered by errors that may be expected. This routines enables * and disables this error reporting. * * Return value: (none) **/ #define soap_ignore_errors(connection, boolean) \ connection->ignore_errors = boolean /** * soap_timeout * @connection: OA SOAP connection provided by soap_open() * * Gives read and write access to the connection timeout value. Can be used * on either left-hand or right-hand side of an assignment. Value read from * or written to this macro should be an integer, and is interpreted as the * timeout in seconds. * * Return value: (none) **/ #define soap_timeout(connection) \ (connection->timeout) /** * soap_error_number and soap_error_string * @connection: OA SOAP connection provided by soap_open() * * Related to soap_ignore_errors() above, it is sometimes useful to retrieve * the error number or string from the most recent OA SOAP call. These macros * provide this. The number values are as documented for soap_call(), and the * error string comes from either the OA's SOAP server engine or is generated * by the OA as a result of a failed SOAP call. Note that the string is not * valid when the error is a general error (-1) or a timeout (-2). * * Return values: * soap_error_number() returns an integer number * soap_error_string() returns a string pointer * Both values are valid until the next OA SOAP call. **/ #define soap_error_number(connection) \ (connection->last_error_number) #define soap_error_string(connection) \ (connection->last_error_string) /* Error codes returned by OA on event session failure */ #define ERR_EVENT_PIPE 201 #define ERR_EVENT_DAEMON_KILLED 204 /* Define the enum strings only in the oa_soap_calls.c file */ #ifdef OA_SOAP_CALLS_FILE #define OA_SOAP_ENUM_STRING(name, ...) \ const char name##_S[] = #__VA_ARGS__; #else #define OA_SOAP_ENUM_STRING(name, ...) #endif #define OA_SOAP_ENUM(name, ...) \ enum name { __VA_ARGS__ }; \ OA_SOAP_ENUM_STRING(name, __VA_ARGS__) /* Data structures */ struct soap_con { SSL_CTX *ctx; BIO *bio; long timeout; /* Timeout value, or zero for none */ char server[OA_SOAP_SERVER_SIZE + 1]; char username[OA_SOAP_USER_SIZE + 1]; char password[OA_SOAP_USER_SIZE + 1]; char session_id[OA_SOAP_SESSIONKEY_SIZE + 1]; xmlDocPtr doc; /* We keep this here so that memory can * be freed during the next call */ char req_buf[OA_SOAP_REQ_BUFFER_SIZE]; int req_high_water; int ignore_errors; int last_error_number; char *last_error_string; }; typedef struct soap_con SOAP_CON; /* Function prototypes */ SOAP_CON *soap_open(char *server, char *username, char *password, long timeout); void soap_close(SOAP_CON *connection); int soap_call(SOAP_CON *connection); xmlNode *soap_find_node(xmlNode *node, char *findstring); xmlNode *soap_walk_tree(xmlNode *node, char *colonstring); xmlNode *soap_walk_doc(xmlDocPtr doc, char *colonstring); char *soap_value(xmlNode *node); char *soap_tree_value(xmlNode *node, char *colonstring); xmlNode *soap_next_node(xmlNode *node); int soap_enum(const char *enums, char *value); int soap_inv_enum(char *result, const char *enums, int value); /* Various strings that are used to communicate with the OA */ #define OA_XML_HEADER \ "POST /hpoa HTTP/1.1\n" \ "Host: %s\n" \ "Content-Type: application/soap+xml; charset=\"utf-8\"\n" \ "Content-Length: %d\n\n" #define OA_XML_VERSION \ "\n" #define OA_XML_ENVELOPE \ "\n" #define OA_XML_SECURITY \ "" \ "\n" \ "\n" \ "" OA_SOAP_SESS_KEY_LABEL "\n" \ "\n" \ "\n" \ "\n" #define OA_XML_TAIL \ "\n" \ "\n" #define OA_XML_LOGIN \ OA_XML_VERSION \ OA_XML_ENVELOPE \ "\n" \ "\n" \ "%s\n" \ "%s\n" \ "\n" \ OA_XML_TAIL #define OA_XML_REQUEST \ OA_XML_VERSION \ OA_XML_ENVELOPE \ OA_XML_SECURITY \ "\n" #endif /* _INC_OASOAP_CALLSUPPORT_H_ */ openhpi-2.14.1/plugins/oa_soap/oa_soap_control.h0000644000076400007640000000556411302566663016647 0ustar /* * Copyright (C) 2007-2008, Hewlett-Packard Development Company, LLP * All rights reserved. * * 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. * * Neither the name of the Hewlett-Packard Corporation, nor the names * of its contributors may be used to endorse or promote products * derived from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * Author(s) * Raghavendra M.S. * Shuah Khan */ #ifndef _OA_SOAP_CONTROL_H #define _OA_SOAP_CONTROL_H /* Include files */ #include #include "oa_soap.h" #include "oa_soap_power.h" #include "oa_soap_resources.h" /* Tag for the control rdr */ #define SERVER_CONTROL_STRING "Server Power Control" #define INTERCONNECT_CONTROL_STRING "Interconnect Power Control" /* Declaration of the functions related to control functionality */ SaErrorT oa_soap_get_control_state(void *oh_handler, SaHpiResourceIdT rid, SaHpiCtrlNumT rdr_num, SaHpiCtrlModeT *mode, SaHpiCtrlStateT *state); SaErrorT oa_soap_set_control_state(void *oh_handler, SaHpiResourceIdT rid, SaHpiCtrlNumT rdr_num, SaHpiCtrlModeT mode, SaHpiCtrlStateT *state); SaErrorT oa_soap_build_control_rdr(struct oh_handler_state *oh_handler, SaHpiRdrT *rdr, SaHpiResourceIdT resource_id, SaHpiCtrlNumT control_num); #endif openhpi-2.14.1/plugins/oa_soap/oa_soap_power.c0000644000076400007640000005061711302566664016316 0ustar /* * Copyright (C) 2007-2008, Hewlett-Packard Development Company, LLP * All rights reserved. * * 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. * * Neither the name of the Hewlett-Packard Corporation, nor the names * of its contributors may be used to endorse or promote products * derived from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * Author(s) * Raghavendra P.G. * Raghavendra M.S. * Shuah Khan * * This file handles all the power related queries * * oa_soap_get_power_state() - gets the power state * * oa_soap_set_power_state() - sets the power state of the resource * * get_server_power_state() - gets the server blade resource power * state * * get_interconnect_power_state() - gets the inter connect resource power * state * * set_server_power_state() - sets the server blade resource power * state * **/ #include "oa_soap_power.h" /** * oa_soap_get_power_state * @oh_handler: Pointer to openhpi handler * @resource_id: Resource id * @state: Pointer to power state * * Purpose: * Gets the power state of the resource. * * Detailed Description: NA * * Return values: * SA_OK - on success. * SA_ERR_HPI_INVALID_PARAMS - on wrong parameters * SA_ERR_HPI_CAPABILITY - on power capability is not set for * the given resource * SA_ERR_HPI_INVALID_RESOURCE - on not able to find the resource * SA_ERR_HPI_INTERNAL_ERROR - on failure. **/ SaErrorT oa_soap_get_power_state(void *oh_handler, SaHpiResourceIdT resource_id, SaHpiPowerStateT *state) { SaErrorT rv = SA_OK; SaHpiRptEntryT *rpt; struct oa_soap_handler *oa_handler = NULL; SaHpiInt32T bay_number; struct oh_handler_state *handler; if (oh_handler == NULL || state == NULL) { err("Invalid parameters"); return SA_ERR_HPI_INVALID_PARAMS; } handler = (struct oh_handler_state *) oh_handler; oa_handler = (struct oa_soap_handler *) handler->data; /* Check whether the oa_handler mutex has been locked or not */ rv = lock_oa_soap_handler(oa_handler); if (rv != SA_OK) { err("OA SOAP handler is locked"); return rv; } rpt = oh_get_resource_by_id(handler->rptcache, resource_id); if (rpt == NULL) { err("INVALID RESOURCE"); return SA_ERR_HPI_INVALID_RESOURCE; } /* Check the resource has power capability */ if (! (rpt->ResourceCapabilities & SAHPI_CAPABILITY_POWER)) { err("INVALID RESOURCE CAPABILITY"); return SA_ERR_HPI_CAPABILITY; } bay_number = rpt->ResourceEntity.Entry[0].EntityLocation; /* Check resource type and query server or interconnect power state*/ switch (rpt->ResourceEntity.Entry[0].EntityType) { case (SAHPI_ENT_SYSTEM_BLADE): case (SAHPI_ENT_IO_BLADE): case (SAHPI_ENT_DISK_BLADE): rv = get_server_power_state(oa_handler->active_con, bay_number, state); break; case (SAHPI_ENT_SWITCH_BLADE): rv = get_interconnect_power_state( oa_handler->active_con, bay_number, state); break; default: err("Invalid Resource Type"); rv = SA_ERR_HPI_INTERNAL_ERROR; } return rv; } /** * oa_soap_set_power_state * @oh_handler: Pointer to openhpi handler structure * @resource_id: Resource id * @state: Power state * * Purpose: * Sets the power state of the resource * * Detailed Description: NA * * Return values: * SA_OK - on success. * SA_ERR_HPI_INVALID_PARAMS - on wrong parameters * SA_ERR_HPI_INTERNAL_ERROR - on failure. **/ SaErrorT oa_soap_set_power_state(void *oh_handler, SaHpiResourceIdT resource_id, SaHpiPowerStateT state) { SaErrorT rv = SA_OK; SaHpiRptEntryT *rpt = NULL; struct oa_soap_handler *oa_handler = NULL; SaHpiInt32T bay_number; struct oh_handler_state *handler = NULL; if (oh_handler == NULL) { err("Invalid parameters"); return SA_ERR_HPI_INVALID_PARAMS; } handler = (struct oh_handler_state *) oh_handler; oa_handler = (struct oa_soap_handler *) handler->data; /* Check whether the oa_handler mutex has been locked or not */ rv = lock_oa_soap_handler(oa_handler); if (rv != SA_OK) { err("OA SOAP handler is locked"); return rv; } rpt = oh_get_resource_by_id(handler->rptcache, resource_id); if (rpt == NULL) { err(" INVALID RESOURCE"); return SA_ERR_HPI_INVALID_RESOURCE; } /* Check the resource has power capability */ if (! (rpt->ResourceCapabilities & SAHPI_CAPABILITY_POWER)) { err(" INVALID RESOURCE CAPABILITY"); return SA_ERR_HPI_CAPABILITY; } bay_number = rpt->ResourceEntity.Entry[0].EntityLocation; /* Check resource type and set the server or interconnect power state*/ switch (rpt->ResourceEntity.Entry[0].EntityType) { case (SAHPI_ENT_SYSTEM_BLADE): rv = set_server_power_state(oa_handler->active_con, bay_number, state); break; case (SAHPI_ENT_IO_BLADE): case (SAHPI_ENT_DISK_BLADE): return(SA_ERR_HPI_UNSUPPORTED_API); case (SAHPI_ENT_SWITCH_BLADE): rv = set_interconnect_power_state( oa_handler->active_con, bay_number, state); break; default: err("Invalid Resource Type"); return SA_ERR_HPI_UNKNOWN; } return rv; } /** * get_server_power_state * @con: Pointer to the soap client handler * @bay_number: Bay number of the server balde * @state: Pointer to power state of the server blade * * Purpose: * Gets the server blade power state. * * Detailed Description: NA * * Return values: * SA_OK - on success. * SA_ERR_HPI_INVALID_PARAMS - on wrong parameters * SA_ERR_HPI_INTERNAL_ERROR - on failure. **/ SaErrorT get_server_power_state(SOAP_CON *con, SaHpiInt32T bay_number, SaHpiPowerStateT *state) { SaErrorT rv = SA_OK; struct getBladeStatus request; struct bladeStatus response; if (con == NULL || state == NULL) { err("Invalid parameters"); return SA_ERR_HPI_INVALID_PARAMS; } request.bayNumber = bay_number; rv = soap_getBladeStatus(con, &request, &response); if (rv != SOAP_OK) { err("Get blade status failed"); return SA_ERR_HPI_INTERNAL_ERROR; } switch (response.powered) { case (POWER_ON): *state = SAHPI_POWER_ON; break; case (POWER_OFF): *state = SAHPI_POWER_OFF; break; case (POWER_REBOOT): err("Wrong Power State (REBOOT) detected"); return SA_ERR_HPI_INTERNAL_ERROR; break; default: err("Unknown Power State detected"); return SA_ERR_HPI_INTERNAL_ERROR; } return SA_OK; } /** * get_interconnect_power_state * @con: Pointer to the soap client handler * @bay_number: Bay number of the interconnect balde * @state: Pointer to power state of the interconnect blade * * Purpose: * Gets the interconnect power state. * * Detailed Description: NA * * Return values: * SA_OK - on success. * SA_ERR_HPI_INVALID_PARAMS - on wrong parameters * SA_ERR_HPI_INTERNAL_ERROR - on failure. **/ SaErrorT get_interconnect_power_state(SOAP_CON *con, SaHpiInt32T bay_number, SaHpiPowerStateT *state) { SaErrorT rv = SA_OK; struct getInterconnectTrayStatus request; struct interconnectTrayStatus response; if (con == NULL || state == NULL) { err("Invalid parameters"); return SA_ERR_HPI_INVALID_PARAMS; } request.bayNumber = bay_number; rv = soap_getInterconnectTrayStatus(con, &request, &response); if (rv != SOAP_OK) { err("Get interconnect tray status failed"); return SA_ERR_HPI_INTERNAL_ERROR; } switch (response.powered) { case (POWER_ON): *state = SAHPI_POWER_ON; break; case (POWER_OFF): *state = SAHPI_POWER_OFF; break; case (POWER_REBOOT): err("Wrong (REBOOT) Power State detected"); return SA_ERR_HPI_INTERNAL_ERROR; break; default: err("Unknown Power State detected"); return SA_ERR_HPI_INTERNAL_ERROR; } return SA_OK; } /** * set_server_power_state * @con: Pointer to the soap client handler * @bay_namber: Bay number of the server blade * @state: Power state of the server blade * * Purpose: * Sets the power state of the server blade, * if the current state is not same as requested state. * * Detailed Description: NA * * Return values: * SA_OK - on success. * SA_ERR_HPI_INVALID_PARAMS - on wrong parameters * SA_ERR_HPI_INTERNAL_ERROR - on failure. **/ SaErrorT set_server_power_state(SOAP_CON *con, SaHpiInt32T bay_number, SaHpiPowerStateT state) { SaErrorT rv = SA_OK; SaHpiPowerStateT tmp; struct setBladePower blade_power; SaHpiInt32T pwroff_poll = 0; if (con == NULL) { err("Invalid parameters"); return SA_ERR_HPI_INVALID_PARAMS; } rv = get_server_power_state(con, bay_number, &tmp); if (rv != SA_OK) { err("get server power state failed"); return rv; } /* Check whether the current server blade power state is same * as requested by user. If yes, ignore the user request */ if (state == tmp) { err("Nothing to be done. Blade is in the requested state"); return SA_OK; } blade_power.bayNumber = bay_number; switch (state) { case (SAHPI_POWER_ON): blade_power.power = MOMENTARY_PRESS; rv = soap_setBladePower(con, &blade_power); if (rv != SOAP_OK) { err("Set blade power to power on failed"); return SA_ERR_HPI_INTERNAL_ERROR; } break; case (SAHPI_POWER_OFF): blade_power.power = PRESS_AND_HOLD; rv = soap_setBladePower(con, &blade_power); if (rv != SOAP_OK) { err("Set blade power to power off failed"); return SA_ERR_HPI_INTERNAL_ERROR; } break; case (SAHPI_POWER_CYCLE): /* Power cycle requires the server to be * power off and then power on * Check whether the current server power state is off * If yes, power on the server * Else, power off and then power on */ if (tmp != SAHPI_POWER_OFF) { blade_power.power = PRESS_AND_HOLD; rv = soap_setBladePower(con, &blade_power); if (rv != SOAP_OK) { err("Set blade power to power off " "failed"); return SA_ERR_HPI_INTERNAL_ERROR; } /* Check whether the power state is OFF for * every OA_POWEROFF_POLL_INTERVAL seconds. * Server blades take a few seconds (around 4 * secs) to power off if no operating system is * running there. Otherwise, an orderly shutdown * is performed, which could take a while. */ while (pwroff_poll < OA_MAX_POWEROFF_POLLS) { rv = get_server_power_state(con, bay_number, &tmp); if (rv != SA_OK) { err("get_server_power_state failed"); return(SA_ERR_HPI_INTERNAL_ERROR); } if ( tmp == SAHPI_POWER_OFF) break; sleep(OA_POWEROFF_POLL_INTERVAL); pwroff_poll++; } if( pwroff_poll >= OA_MAX_POWEROFF_POLLS){ err("Max poweroff polls exceeded (%d)", OA_MAX_POWEROFF_POLLS); return( SA_ERR_HPI_INTERNAL_ERROR); } /* There is a race condition if a "power on" * command is sent immediately after a * "power off" command, and we may hit this * even if we have polled for the current * power state, unless we wait a bit first. */ sleep(OA_SERVER_POWER_OFF_WAIT_PERIOD); } /* end if tmp != SAHPI_POWER_OFF */ /* Now, turn the blade back on */ blade_power.power = MOMENTARY_PRESS; rv = soap_setBladePower(con, &blade_power); if (rv != SOAP_OK) { err("Set blade power to power on failed"); return SA_ERR_HPI_INTERNAL_ERROR; } break; default: err("Invalid power state"); return SA_ERR_HPI_INVALID_PARAMS; } return SA_OK; } /** * set_interconnect_power_state * @con: Pointer to the soap client handler * @bay_namber: Bay number of the interconnect blade * @state: Power state of the interconnect blade * * Purpose: * Sets the power state of the interconnect blade, * * Detailed Description: NA * * Return values: * SA_OK - on success. * SA_ERR_HPI_INVALID_PARAMS - on wrong parameters * SA_ERR_HPI_INTERNAL_ERROR - on failure. **/ SaErrorT set_interconnect_power_state(SOAP_CON *con, SaHpiInt32T bay_number, SaHpiPowerStateT state) { SaErrorT rv = SA_OK; SaHpiPowerStateT tmp; struct setInterconnectTrayPower interconnect_power; if (con == NULL) { err("Invalid parameter"); return SA_ERR_HPI_INVALID_PARAMS; } interconnect_power.bayNumber = bay_number; switch (state) { case (SAHPI_POWER_ON): interconnect_power.on = HPOA_TRUE; rv = soap_setInterconnectTrayPower(con, &interconnect_power); if (rv != SOAP_OK) { err("Set interconnect power to power on " "failed"); return SA_ERR_HPI_INTERNAL_ERROR; } break; case (SAHPI_POWER_OFF): interconnect_power.on = HPOA_FALSE; rv = soap_setInterconnectTrayPower(con, &interconnect_power); if (rv != SOAP_OK) { err("Set interconnect power to power off " "failed"); return SA_ERR_HPI_INTERNAL_ERROR; } break; case (SAHPI_POWER_CYCLE): /* Get the current power state of the interconnect */ rv = get_interconnect_power_state(con, bay_number, &tmp); if (rv != SA_OK ) { err("get interconnect power state failed"); return rv; } /* Power cycle requires the server to be * power off and then power on * Check whether the current server power state is off * If yes, power on the server * Else, power off and then power on */ if (tmp != SAHPI_POWER_OFF) { interconnect_power.on = HPOA_FALSE; rv = soap_setInterconnectTrayPower( con, &interconnect_power); if (rv != SOAP_OK) { err("Set interconnect power to " "power on failed"); return SA_ERR_HPI_INTERNAL_ERROR; } } interconnect_power.on = HPOA_TRUE; rv = soap_setInterconnectTrayPower(con, &interconnect_power); if (rv != SOAP_OK) { err("Set interconnect power to power on " "failed"); return SA_ERR_HPI_INTERNAL_ERROR; } break; default: err("Invalid power state"); return SA_ERR_HPI_INVALID_PARAMS; } return SA_OK; } void * oh_get_power_state (void *, SaHpiResourceIdT, SaHpiPowerStateT *) __attribute__ ((weak, alias("oa_soap_get_power_state"))); void * oh_set_power_state (void *, SaHpiResourceIdT, SaHpiPowerStateT) __attribute__ ((weak, alias("oa_soap_set_power_state"))); openhpi-2.14.1/plugins/oa_soap/oa_soap_watchdog.c0000644000076400007640000001112711302566663016752 0ustar /* * Copyright (C) 2007-2008, Hewlett-Packard Development Company, LLP * All rights reserved. * * 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. * * Neither the name of the Hewlett-Packard Corporation, nor the names * of its contributors may be used to endorse or promote products * derived from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * Author(s) * Raghavendra M.S. **/ #include "oa_soap_watchdog.h" /** * oa_soap_get_watchdog_info * @oh_handler: Handler data pointer * @resource_id: Resource ID * @num: Watchdog rdr number * @wdt: Watchdog structure * * Purpose: * Gets watchdog information of the resource * * Detailed Description: NA * * Return values: * SA_ERR_HPI_UNSUPPORTED_API - current oa_soap implementation does not * support this API **/ SaErrorT oa_soap_get_watchdog_info(void *oh_handler, SaHpiResourceIdT resource_id, SaHpiWatchdogNumT num, SaHpiWatchdogT *wdt) { err("oa_soap_get_watchdog_info not implemented"); return SA_ERR_HPI_UNSUPPORTED_API; } /** * oa_soap_set_watchdog_info * @oh_handler: Handler data pointer * @resource_id: Resource ID * @num: Watchdog rdr number * @wdt: Watchdog structure * * Purpose: * Sets watchdog information of the resource * * Detailed Description: NA * * Return values: * SA_ERR_HPI_UNSUPPORTED_API - current oa_soap implementation does not * support this API **/ SaErrorT oa_soap_set_watchdog_info(void *oh_handler, SaHpiResourceIdT resource_id, SaHpiWatchdogNumT num, SaHpiWatchdogT *wdt) { err("oa_soap_set_watchdog_info not implemented"); return SA_ERR_HPI_UNSUPPORTED_API; } /** * oa_soap_reset_watchdog * @oh_handler: Handler data pointer * @resource_id: Resource ID * @num: Watchdog rdr number * * Purpose: * Starts/Restarts the watchdog timer from initial count down * * Detailed Description: NA * * Return values: * SA_ERR_HPI_UNSUPPORTED_API - current oa_soap implementation does not * support this API **/ SaErrorT oa_soap_reset_watchdog(void *oh_handler, SaHpiResourceIdT resource_id, SaHpiWatchdogNumT num) { err("oa_soap_reset_watchdog not implemented"); return SA_ERR_HPI_UNSUPPORTED_API; } void * oh_get_watchdog_info (void *, SaHpiResourceIdT, SaHpiWatchdogNumT, SaHpiWatchdogT *) __attribute__ ((weak, alias("oa_soap_get_watchdog_info"))); void * oh_set_watchdog_info (void *, SaHpiResourceIdT, SaHpiWatchdogNumT, SaHpiWatchdogT *) __attribute__ ((weak, alias("oa_soap_set_watchdog_info"))); void * oh_reset_watchdog (void *, SaHpiResourceIdT, SaHpiWatchdogNumT) __attribute__ ((weak, alias("oa_soap_reset_watchdog"))); openhpi-2.14.1/plugins/oa_soap/oa_soap_annunciator.h0000644000076400007640000000721311302566664017502 0ustar /* * Copyright (C) 2007-2008, Hewlett-Packard Development Company, LLP * All rights reserved. * * 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. * * Neither the name of the Hewlett-Packard Corporation, nor the names * of its contributors may be used to endorse or promote products * derived from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * Author(s) * Raghavendra M.S. */ #ifndef _OA_SOAP_ANNUCIATOR_H #define _OA_SOAP_ANNUCIATOR_H /* Include files */ #include #include SaErrorT oa_soap_get_next_announce(void *oh_handler, SaHpiResourceIdT resource_id, SaHpiAnnunciatorNumT num, SaHpiSeverityT severity, SaHpiBoolT unacknowledged_only, SaHpiAnnouncementT *announcement); SaErrorT oa_soap_get_announce(void *oh_handler, SaHpiResourceIdT resource_id, SaHpiAnnunciatorNumT num, SaHpiEntryIdT entry, SaHpiAnnouncementT *announcement); SaErrorT oa_soap_ack_announce(void *oh_handler, SaHpiResourceIdT resource_id, SaHpiAnnunciatorNumT num, SaHpiEntryIdT entry, SaHpiSeverityT severity); SaErrorT oa_soap_get_annunc_mode(void *oh_handler, SaHpiResourceIdT resource_id, SaHpiAnnunciatorNumT num, SaHpiAnnunciatorModeT *mode); SaErrorT oa_soap_set_annunc_mode(void *oh_handler, SaHpiResourceIdT resource_id, SaHpiAnnunciatorNumT num, SaHpiAnnunciatorModeT mode); SaErrorT oa_soap_del_announce(void *oh_handler, SaHpiResourceIdT resource_id, SaHpiAnnunciatorNumT num, SaHpiEntryIdT entry, SaHpiSeverityT severity); SaErrorT oa_soap_add_announce(void *oh_handler, SaHpiResourceIdT resource_id, SaHpiAnnunciatorNumT num, SaHpiAnnouncementT *announcement); #endif openhpi-2.14.1/plugins/oa_soap/oa_soap_event.h0000644000076400007640000000470611302566664016306 0ustar /* * Copyright (C) 2007-2008, Hewlett-Packard Development Company, LLP * All rights reserved. * * 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. * * Neither the name of the Hewlett-Packard Corporation, nor the names * of its contributors may be used to endorse or promote products * derived from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * Author(s) * Raghavendra P.G. */ #ifndef _OA_SOAP_EVENT_H #define _OA_SOAP_EVENT_H /* Include files */ #include "oa_soap_oa_event.h" #include "oa_soap_server_event.h" #include "oa_soap_interconnect_event.h" #include "oa_soap_fan_event.h" #include "oa_soap_ps_event.h" #include "oa_soap_enclosure_event.h" #include "oa_soap_lcd_event.h" int oa_soap_get_event(void *oh_handler); gpointer oa_soap_event_thread(gpointer oa_pointer); void oa_soap_error_handling(struct oh_handler_state *oh_handler, struct oa_info *oa); void process_oa_out_of_access(struct oh_handler_state *oh_handler, struct oa_info *oa); void process_oa_events(struct oh_handler_state *oh_handler, struct oa_info *oa, struct getAllEventsResponse *oa_event); #endif openhpi-2.14.1/plugins/oa_soap/oa_soap_hotswap.h0000644000076400007640000000717511302566664016655 0ustar /* * Copyright (C) 2007-2008, Hewlett-Packard Development Company, LLP * All rights reserved. * * 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. * * Neither the name of the Hewlett-Packard Corporation, nor the names * of its contributors may be used to endorse or promote products * derived from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * Author(s) * Raghavendra P.G. * Raja Kumar Thatte */ #ifndef _OA_SOAP_HOTSWAP_H #define _OA_SOAP_HOTSWAP_H /* Include files */ #include "oa_soap_utils.h" #include "oa_soap_power.h" SaErrorT oa_soap_get_hotswap_state(void *oh_handler, SaHpiResourceIdT resource_id, SaHpiHsStateT *state); SaErrorT oa_soap_set_hotswap_state(void *oh_handler, SaHpiResourceIdT resource_id, SaHpiHsStateT state); SaErrorT oa_soap_get_indicator_state(void *oh_handler, SaHpiResourceIdT resource_id, SaHpiHsIndicatorStateT *state); SaErrorT oa_soap_set_indicator_state(void *oh_handler, SaHpiResourceIdT resource_id, SaHpiHsIndicatorStateT state); SaErrorT oa_soap_request_hotswap_action(void *oh_handler, SaHpiResourceIdT resource_id, SaHpiHsActionT action); SaErrorT oa_soap_hotswap_policy_cancel(void *oh_handler, SaHpiResourceIdT resource_id, SaHpiTimeoutT timeout); SaErrorT oa_soap_get_autoinsert_timeout(void *oh_handler, SaHpiResourceIdT resource_id, SaHpiTimeoutT timeout); SaErrorT oa_soap_set_autoinsert_timeout(void *oh_handler, SaHpiTimeoutT timeout); SaErrorT oa_soap_get_autoextract_timeout(void *oh_handler, SaHpiResourceIdT resource_id, SaHpiTimeoutT *timeout); SaErrorT oa_soap_set_autoextract_timeout(void *oh_handler, SaHpiResourceIdT resource_id, SaHpiTimeoutT timeout); #endif openhpi-2.14.1/plugins/oa_soap/oa_soap_control.c0000644000076400007640000007503611302566663016643 0ustar /* * Copyright (C) 2007-2008, Hewlett-Packard Development Company, LLP * All rights reserved. * * 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. * * Neither the name of the Hewlett-Packard Corporation, nor the names * of its contributors may be used to endorse or promote products * derived from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * Author(s) * Raghavendra M.S. * Shuah Khan * Raghavendra P.G. * * This file handles all the control functionality related apis. * * oa_soap_get_control_state - Control ABI to return the control * state and mode of the resource * * oa_soap_set_control_state - Control ABI to set the control * state the resource * * oa_soap_build_control_rdr - Creates and adds the control rdr * * oa_soap_set_lcd_butn_lck_cntrl()- Sets the LCD button lock control * * oa_soap_get_lcd_butn_lck_cntrl()- Gets the LCD button lock control * * oa_soap_set_pwr_cntrl() - Sets the power control * * oa_soap_get_pwr_cntrl() - Gets the power control * * oa_soap_set_uid_cntrl() - Sets the UID control * * oa_soap_get_uid_cntrl() - Gets the UID control * */ #include "oa_soap_control.h" /* Forward declaraction for static functions */ static SaErrorT oa_soap_set_lcd_butn_lck_cntrl(struct oh_handler_state *oh_handler, SaHpiRptEntryT *rpt, SaHpiCtrlStateDigitalT control_state); static SaErrorT oa_soap_get_lcd_butn_lck_cntrl(struct oh_handler_state *oh_handler, SaHpiRptEntryT *rpt, SaHpiCtrlStateDigitalT *control_state); static SaErrorT oa_soap_set_pwr_cntrl(struct oh_handler_state *oh_handler, SaHpiResourceIdT resource_id, SaHpiCtrlStateDigitalT control_state); static SaErrorT oa_soap_get_pwr_cntrl(struct oh_handler_state *oh_handler, SaHpiResourceIdT resource_id, SaHpiCtrlStateDigitalT *control_state); static SaErrorT oa_soap_set_uid_cntrl(struct oh_handler_state *oh_handler, SaHpiRptEntryT *rpt, SaHpiCtrlStateDigitalT control_state); static SaErrorT oa_soap_get_uid_cntrl(struct oh_handler_state *oh_handler, SaHpiRptEntryT *rpt, SaHpiCtrlStateDigitalT *control_state); /** * oa_soap_get_control_state * @oh_handler: Handler data pointer * @resource_id: Resource ID * @rdr_num: Control rdr number * @mode: Mode of the control * @state: State of the control * * Purpose: * Gets the current state and the mode of the control object * * Detailed Description: * - Gets the current state and the default mode of control object * of either server blade or interconnect * - To determine the control state, power state of the resource is * retrieved and is appropriately mapped to control state * - Plug-in does not support changing the control mode * * Return values: * SA_OK - Normal case. * SA_ERR_HPI_CAPABILITY - Resource doesn't have SAHPI_CAPABILITY_CONTROL * SA_ERR_HPI_INVALID_PARAMS - On wrong parameter * SA_ERR_HPI_INVALID_RESOURCE - Resource does not exist * SA_ERR_HPI_NOT_PRESENT - Control not present * SA_ERR_HPI_INTERNAL_ERROR - Internal error encountered **/ SaErrorT oa_soap_get_control_state(void *oh_handler, SaHpiResourceIdT resource_id, SaHpiCtrlNumT rdr_num, SaHpiCtrlModeT *mode, SaHpiCtrlStateT *state) { SaErrorT rv = SA_OK; struct oh_handler_state *handler = NULL; SaHpiRptEntryT *rpt = NULL; SaHpiRdrT *rdr = NULL; SaHpiCtrlTypeT type; SaHpiCtrlModeT ctrl_mode; SaHpiCtrlStateT ctrl_state; SaHpiCtrlRecDigitalT *digital = NULL; SaHpiCtrlRecT *ctrl = NULL; SaHpiCtrlStateDigitalT control_digital_state; if (oh_handler == NULL || mode == NULL || state == NULL) { err("Invalid parameter."); return (SA_ERR_HPI_INVALID_PARAMS); } handler = (struct oh_handler_state *) oh_handler; rpt = oh_get_resource_by_id (handler->rptcache, resource_id); if (rpt == NULL) { err("INVALID RESOURCE"); return SA_ERR_HPI_INVALID_RESOURCE; } if (! (rpt->ResourceCapabilities & SAHPI_CAPABILITY_CONTROL)) { err("INVALID RESOURCE CAPABILITY"); return SA_ERR_HPI_CAPABILITY; } rdr = oh_get_rdr_by_type(handler->rptcache, resource_id, SAHPI_CTRL_RDR, rdr_num); if (rdr == NULL) { err("INVALID RDR NUMBER"); return (SA_ERR_HPI_NOT_PRESENT); } ctrl = &(rdr->RdrTypeUnion.CtrlRec); ctrl_mode = ctrl->DefaultMode.Mode; /* Set control mode of return parameter to Manual mode * Manual mode is the only mode supported by plug-in */ *mode = ctrl_mode; type = ctrl->Type; ctrl_state.Type = type; digital = &(ctrl->TypeUnion.Digital); switch (rdr_num){ case OA_SOAP_PWR_CNTRL: rv = oa_soap_get_pwr_cntrl(handler, resource_id, &control_digital_state); if (rv != SA_OK) { err("Failed to get the power state RDR"); return rv; } break; case OA_SOAP_UID_CNTRL: rv = oa_soap_get_uid_cntrl(handler, rpt, &control_digital_state); if (rv != SA_OK) { err("Failed to get the uid status"); return rv; } break; case OA_SOAP_LCD_BUTN_LCK_CNTRL: rv = oa_soap_get_lcd_butn_lck_cntrl(handler, rpt, &control_digital_state); if (rv != SA_OK) { err("Failed to get the LCD button lock status"); return rv; } break; default: err("Invalid control rdr num"); return SA_ERR_HPI_INTERNAL_ERROR; } ctrl_state.StateUnion.Digital = control_digital_state; /* Return the appropriately mapped control state */ *state = ctrl_state; return rv; } /** * oa_soap_set_control_state: * @oh_handler: Handler data pointer * @resource_id: Resource ID * @rdr_num: Control rdr number * @mode: Mode of the control * @state: State of the control * * Purpose: * Sets the current state of the control object. Mode setting is not * allowed * * Detailed Description: * - Validates the state parameter and sets the control state of resource * to the specified value * - the current state and the default mode of control object * of either server blade or interconnect * - To determine the control state, power state of the resource is * retrieved and is appropriately mapped to control state * - Plug-in does not support changing the control mode * * Return values: * SA_OK - Normal case. * SA_ERR_HPI_CAPABILITY - Resource doesn't have SAHPI_CAPABILITY_CONTROL * SA_ERR_HPI_INVALID_PARAMS - On wrong parameter * SA_ERR_HPI_INVALID_RESOURCE - Resource does not exist * SA_ERR_HPI_NOT_PRESENT - Control not present * SA_ERR_HPI_INTERNAL_ERROR - Internal error encountered * SA_ERR_HPI_INVALID_DATA - Invalid Control Mode/State specified * SA_ERR_HPI_UNSUPPORTED_PARAMS - Setting the control mode * to AUTO mode is not supported **/ SaErrorT oa_soap_set_control_state(void *oh_handler, SaHpiResourceIdT resource_id, SaHpiCtrlNumT rdr_num, SaHpiCtrlModeT mode, SaHpiCtrlStateT *state) { SaErrorT rv = SA_OK; struct oh_handler_state *handler = NULL; struct oa_soap_handler *oa_handler = NULL; SaHpiRptEntryT *rpt = NULL; SaHpiRdrT *rdr = NULL; SaHpiCtrlRecT *ctrl = NULL; if (oh_handler == NULL || state == NULL) { err("Invalid parameter."); return (SA_ERR_HPI_INVALID_PARAMS); } handler = (struct oh_handler_state *) oh_handler; oa_handler = (struct oa_soap_handler *) handler->data; rpt = oh_get_resource_by_id (handler->rptcache, resource_id); if (rpt == NULL) { err("INVALID RESOURCE"); return SA_ERR_HPI_INVALID_RESOURCE; } if (! (rpt->ResourceCapabilities & SAHPI_CAPABILITY_CONTROL)) { err("INVALID RESOURCE CAPABILITY"); return SA_ERR_HPI_CAPABILITY; } rdr = oh_get_rdr_by_type (handler->rptcache, resource_id, SAHPI_CTRL_RDR, rdr_num); if (rdr == NULL) { err("INVALID RDR NUMBER"); return (SA_ERR_HPI_NOT_PRESENT); } ctrl = &(rdr->RdrTypeUnion.CtrlRec); /* Validate the state specified in the parameter list */ rv = oh_valid_ctrl_state_mode ((ctrl), mode, state); if (rv != SA_OK) { err("Control state specified is invalid"); return (rv); } /* Auto mode is not supported */ if (mode == SAHPI_CTRL_MODE_AUTO) { err( "AUTO CONTROL MODE is not supported"); return SA_ERR_HPI_UNSUPPORTED_PARAMS; } /* Return error for Non digital type control request */ if (state->Type != SAHPI_CTRL_TYPE_DIGITAL) { err("Control type not supported"); return SA_ERR_HPI_INTERNAL_ERROR; } /* If control mode is MANUAL and specified state is of digital type, * then the control state is updated with specified state value */ ctrl->TypeUnion.Digital.Default = state->StateUnion.Digital; switch (rdr_num) { case OA_SOAP_PWR_CNTRL: rv = oa_soap_set_pwr_cntrl(handler, resource_id, state->StateUnion.Digital); if (rv != SA_OK) { err("Set power state failed"); return rv; } break; case OA_SOAP_UID_CNTRL: rv = oa_soap_set_uid_cntrl(handler, rpt, state->StateUnion.Digital); if (rv != SA_OK) { err("Set uid state failed"); return rv; } break; case OA_SOAP_LCD_BUTN_LCK_CNTRL: rv = oa_soap_set_lcd_butn_lck_cntrl(handler, rpt, state->StateUnion.Digital); if (rv != SA_OK) { err("Failed to set the LCD button lock status"); return rv; } break; default: err("Invalid control rdr num"); return SA_ERR_HPI_INTERNAL_ERROR; } return SA_OK; } /** * oa_soap_build_control_rdr: * @oh_handler: Handler data pointer * @rdr: Pointer to the rdr structure * @resource_id: Resource ID * @control_num: Control rdr number * * Purpose: * Builds the control rdr. * * Detailed Description: * - Retrieves and populates the control rdr contents from global controls * array based in control num. * * Return values: * SA_OK - Normal case. * SA_ERR_HPI_INVALID_PARAMS - On wrong parameter * SA_ERR_HPI_INTERNAL_ERROR - Internal error encountered **/ SaErrorT oa_soap_build_control_rdr(struct oh_handler_state *oh_handler, SaHpiRdrT *rdr, SaHpiResourceIdT resource_id, SaHpiCtrlNumT control_num) { SaHpiRptEntryT *rpt = NULL; if (oh_handler == NULL || rdr == NULL) { err("Invalid parameters"); return SA_ERR_HPI_INVALID_PARAMS; } rpt = oh_get_resource_by_id(oh_handler->rptcache, resource_id); if (!rpt) { err("Could not find blade resource rpt"); return(SA_ERR_HPI_INTERNAL_ERROR); } /* Set the control rdr with default values */ rdr->Entity = rpt->ResourceEntity; rdr->RdrType = SAHPI_CTRL_RDR; rdr->RdrTypeUnion.CtrlRec = oa_soap_cntrl_arr[control_num].control; oh_init_textbuffer(&(rdr->IdString)); oh_append_textbuffer(&(rdr->IdString), oa_soap_cntrl_arr[control_num].comment); return SA_OK; } /** * oa_soap_get_uid_cntrl * @oh_handler: Handler data pointer * @rpt: Pointer to the rpt structure * @control_state: Pointer to digital control state * * Purpose: * Retrieves the UID status of the resource * * Detailed Description: * - Retrieves the UID status of different resources based on entity type. * * Return values: * SA_OK - Normal case. * SA_ERR_HPI_INVALID_PARAMS - On wrong parameter * SA_ERR_HPI_INTERNAL_ERROR - Internal error encountered **/ static SaErrorT oa_soap_get_uid_cntrl(struct oh_handler_state *oh_handler, SaHpiRptEntryT *rpt, SaHpiCtrlStateDigitalT *control_state) { SaErrorT rv = SA_OK; SaHpiInt32T bay_number; struct oa_soap_handler *oa_handler = NULL; struct enclosureStatus enclosure_status_response; struct getOaStatus oa_status_request; struct oaStatus oa_status_response; struct getBladeStatus server_status_request; struct bladeStatus server_status_response; struct getInterconnectTrayStatus interconnect_status_request; struct interconnectTrayStatus interconnect_status_response; enum uidStatus uid_status; if (oh_handler == NULL || rpt == NULL || control_state == NULL) { err("Invalid parameters"); return SA_ERR_HPI_INVALID_PARAMS; } oa_handler = (struct oa_soap_handler *) oh_handler->data; /* Check whether the re-discovery is started by trying to lock the * oa_handler mutex */ rv = lock_oa_soap_handler(oa_handler); if (rv != SA_OK) { err("OA SOAP handler is locked"); return rv; } bay_number = rpt->ResourceEntity.Entry[0].EntityLocation; switch (rpt->ResourceEntity.Entry[0].EntityType) { case (SAHPI_ENT_SYSTEM_CHASSIS): /* Make a soap call to get the enclosure UID status */ rv = soap_getEnclosureStatus(oa_handler->active_con, &enclosure_status_response); if (rv != SOAP_OK) { err("Get enclosure status failed"); return SA_ERR_HPI_INTERNAL_ERROR; } uid_status = enclosure_status_response.uid; break; case (SAHPI_ENT_SYS_MGMNT_MODULE): /* Make a soap call to get the OA UID status */ oa_status_request.bayNumber = bay_number; rv = soap_getOaStatus(oa_handler->active_con, &oa_status_request, &oa_status_response); if (rv != SOAP_OK) { err("Get OA status failed"); return SA_ERR_HPI_INTERNAL_ERROR; } uid_status = oa_status_response.uid; break; case (SAHPI_ENT_SYSTEM_BLADE): case (SAHPI_ENT_IO_BLADE): case (SAHPI_ENT_DISK_BLADE): /* Make a soap call to get the Blade UID status */ server_status_request.bayNumber = bay_number; rv = soap_getBladeStatus(oa_handler->active_con, &server_status_request, &server_status_response); if (rv != SOAP_OK) { err("Get Blade status failed"); return SA_ERR_HPI_INTERNAL_ERROR; } uid_status = server_status_response.uid; break; case (SAHPI_ENT_SWITCH_BLADE): /* Make a soap call to get the Interconnect * UID status */ interconnect_status_request.bayNumber = bay_number; rv = soap_getInterconnectTrayStatus( oa_handler->active_con, &interconnect_status_request, &interconnect_status_response); if (rv != SOAP_OK) { err("Get Interconnect status failed"); return SA_ERR_HPI_INTERNAL_ERROR; } uid_status = interconnect_status_response.uid; break; default: err("Invalid Resource Type"); return (SA_ERR_HPI_INTERNAL_ERROR); } switch (uid_status) { case UID_ON: *control_state = SAHPI_CTRL_STATE_ON; break; case UID_OFF: case UID_NO_OP: *control_state = SAHPI_CTRL_STATE_OFF; break; default: err("Invalid uid status"); return SA_ERR_HPI_INTERNAL_ERROR; } return SA_OK; } /** * oa_soap_set_uid_cntrl * @oh_handler: Handler data pointer * @rpt: Pointer to the rpt structure * @control_state: Digital control state * * Purpose: * Sets the UID status of the resource * * Detailed Description: * - Sets the UID status of different resources based on entity type. * * Return values: * SA_OK - Normal case. * SA_ERR_HPI_INVALID_PARAMS - On wrong parameter * SA_ERR_HPI_INTERNAL_ERROR - Internal error encountered **/ static SaErrorT oa_soap_set_uid_cntrl(struct oh_handler_state *oh_handler, SaHpiRptEntryT *rpt, SaHpiCtrlStateDigitalT control_state) { SaErrorT rv = SA_OK; SaHpiInt32T bay_number; struct oa_soap_handler *oa_handler = NULL; struct setEnclosureUid enclosure_uid; struct setOaUid oa_uid; struct setBladeUid blade_uid; struct setInterconnectTrayUid interconnect_uid; enum uidStatus uid_status; if (oh_handler == NULL || rpt == NULL) { err("Invalid parameters"); return SA_ERR_HPI_INVALID_PARAMS; } oa_handler = (struct oa_soap_handler *) oh_handler->data; /* Check whether the re-discovery is started by trying to lock the * oa_handler mutex */ rv = lock_oa_soap_handler(oa_handler); if (rv != SA_OK) { err("OA SOAP handler is locked"); return rv; } /* Return error if the control state is PULSE_ON or PULSE_OFF */ if ((control_state == SAHPI_CTRL_STATE_PULSE_ON) || (control_state == SAHPI_CTRL_STATE_PULSE_OFF)) { err("Setting the control state to PULSE ON/OFF not supported"); return SA_ERR_HPI_INVALID_DATA; } /* Map the control state to uid status */ if (control_state == SAHPI_CTRL_STATE_ON) { uid_status = UID_CMD_ON; } else { uid_status = UID_CMD_OFF; } /* Get the bay_number of the resource */ bay_number = rpt->ResourceEntity.Entry[0].EntityLocation; switch (rpt->ResourceEntity.Entry[0].EntityType) { case (SAHPI_ENT_SYSTEM_CHASSIS): /* Make a soap call to set Enclosure UID */ enclosure_uid.uid = uid_status; rv = soap_setEnclosureUid(oa_handler->active_con, &enclosure_uid); if (rv != SOAP_OK) { err("Set enclosure UID failed"); return SA_ERR_HPI_INTERNAL_ERROR; } break; case (SAHPI_ENT_SYS_MGMNT_MODULE): /* Make a soap call to set OA UID */ oa_uid.uid = uid_status; oa_uid.bayNumber = bay_number; rv = soap_setOaUid(oa_handler->active_con, &oa_uid); if (rv != SOAP_OK) { err("Set OA UID failed"); return SA_ERR_HPI_INTERNAL_ERROR; } break; case (SAHPI_ENT_SYSTEM_BLADE): case (SAHPI_ENT_IO_BLADE): case (SAHPI_ENT_DISK_BLADE): /* Make a soap call to set Blade UID */ blade_uid.uid = uid_status; blade_uid.bayNumber = bay_number; rv = soap_setBladeUid(oa_handler->active_con, &blade_uid); if (rv != SOAP_OK) { err("Set Blade UID failed"); return SA_ERR_HPI_INTERNAL_ERROR; } break; case (SAHPI_ENT_SWITCH_BLADE): /* Make a soap call to set Interconnect UID */ interconnect_uid.uid = uid_status; interconnect_uid.bayNumber = bay_number; rv = soap_setInterconnectTrayUid(oa_handler->active_con, &interconnect_uid); if (rv != SOAP_OK) { err("Set Interconnect UID failed"); return SA_ERR_HPI_INTERNAL_ERROR; } break; default: err("Invalid Resource Type"); return (SA_ERR_HPI_INTERNAL_ERROR); } return SA_OK; } /** * oa_soap_get_pwr_cntrl: * @oh_handler: Handler data pointer * @resource_id: Resource id * @control state: Pointer to digital control state * * Purpose: * Gets the control state of power controls on resource * * Detailed Description: * - Gets the power state of resource and maps it to control state * * Return values: * SA_OK - Normal case. * SA_ERR_HPI_INVALID_PARAMS - On wrong parameter * SA_ERR_HPI_INTERNAL_ERROR - Internal error encountered **/ static SaErrorT oa_soap_get_pwr_cntrl(struct oh_handler_state *oh_handler, SaHpiResourceIdT resource_id, SaHpiCtrlStateDigitalT *control_state) { SaErrorT rv = SA_OK; SaHpiPowerStateT power_state; if (oh_handler == NULL || control_state == NULL) { err("Invalid parameters"); return SA_ERR_HPI_INVALID_PARAMS; } rv = oa_soap_get_power_state(oh_handler, resource_id, &power_state); if (rv != SA_OK) { err("Failed to get the power state RDR"); return rv; } switch (power_state) { case SAHPI_POWER_ON: *control_state = SAHPI_CTRL_STATE_ON; break; case SAHPI_POWER_OFF: *control_state = SAHPI_CTRL_STATE_OFF; break; default: err("Invalid power state"); return SA_ERR_HPI_INTERNAL_ERROR; } return SA_OK; } /** * oa_soap_set_pwr_cntrl: * @oh_handler: Handler data pointer * @resource_id: Resource id * @control state: Digital control state * * Purpose: * Sets the control state of power controls on resource * * Detailed Description: * - Sets the power state of resource after mapping the control state * appropriate power state * * Return values: * SA_OK - Normal case. * SA_ERR_HPI_INVALID_PARAMS - On wrong parameter * SA_ERR_HPI_INTERNAL_ERROR - Internal error encountered **/ static SaErrorT oa_soap_set_pwr_cntrl(struct oh_handler_state *oh_handler, SaHpiResourceIdT resource_id, SaHpiCtrlStateDigitalT control_state) { SaErrorT rv = SA_OK; SaHpiPowerStateT power_state; if (oh_handler == NULL) { err("Invalid parameters"); return SA_ERR_HPI_INVALID_PARAMS; } /* Return error if the control state is PULSE_ON or PULSE_OFF */ if ((control_state == SAHPI_CTRL_STATE_PULSE_ON) || (control_state == SAHPI_CTRL_STATE_PULSE_OFF)) { err("Setting the control state to PULSE ON/OFF not supported"); return SA_ERR_HPI_INVALID_DATA; } if (control_state == SAHPI_CTRL_STATE_ON) { power_state = SAHPI_POWER_ON; } else { power_state = SAHPI_POWER_OFF; } rv = oa_soap_set_power_state(oh_handler, resource_id, power_state); if (rv != SA_OK) { err("Failed to set the power state of resource"); return rv; } return SA_OK; } /** * oa_soap_get_lcd_butn_lck_cntrl_state * @oh_handler: Handler data pointer * @rpt: Pointer to the rpt structure * @control_state: Pointer to digital control state * * Purpose: * Retrieves the LCD button lock state * * Detailed Description: * NA * * Return values: * SA_OK - Normal case. * SA_ERR_HPI_INVALID_PARAMS - On wrong parameter * SA_ERR_HPI_INTERNAL_ERROR - Internal error encountered **/ static SaErrorT oa_soap_get_lcd_butn_lck_cntrl(struct oh_handler_state *oh_handler, SaHpiRptEntryT *rpt, SaHpiCtrlStateDigitalT *control_state) { SaErrorT rv = SA_OK; struct oa_soap_handler *oa_handler = NULL; struct lcdStatus status; if (oh_handler == NULL || rpt == NULL || control_state == NULL) { err("Invalid parameters"); return SA_ERR_HPI_INVALID_PARAMS; } oa_handler = (struct oa_soap_handler *) oh_handler->data; if (rpt->ResourceEntity.Entry[0].EntityType != SAHPI_ENT_DISPLAY_PANEL) { err("LCD button lock is supported only on LCD"); err("Requested on wrong resource type %d", rpt->ResourceEntity.Entry[0].EntityType); return SA_ERR_HPI_INVALID_PARAMS; } /* Check whether the re-discovery is started by trying to lock the * oa_handler mutex */ rv = lock_oa_soap_handler(oa_handler); if (rv != SA_OK) { err("OA SOAP handler is locked"); return rv; } /* Make a soap call to set Enclosure UID */ rv = soap_getLcdStatus(oa_handler->active_con, &status); if (rv != SOAP_OK) { err("Get LCD status SOAP call failed"); return SA_ERR_HPI_INTERNAL_ERROR; } switch (status.buttonLock) { case HPOA_TRUE: *control_state = SAHPI_CTRL_STATE_ON; break; case HPOA_FALSE: *control_state = SAHPI_CTRL_STATE_OFF; break; default: err("Invalid LCD button lock state"); return SA_ERR_HPI_INTERNAL_ERROR; } return SA_OK; } /** * oa_soap_set_lcd_butn_lck_cntrl_state * @oh_handler: Handler data pointer * @rpt: Pointer to the rpt structure * @control_state: Digital control state * * Purpose: * Sets the LCD button lock state * * Detailed Description: * - The LCD button lock control is supported only for LCD resource * - PULSE_ON and PULSE_OFF control states are not supported. If requested * by the user, then error message is returned * - Sets the LCD button lock control to requested state * * Return values: * SA_OK - Normal case. * SA_ERR_HPI_INVALID_PARAMS - On wrong parameter * SA_ERR_HPI_INTERNAL_ERROR - Internal error encountered **/ static SaErrorT oa_soap_set_lcd_butn_lck_cntrl(struct oh_handler_state *oh_handler, SaHpiRptEntryT *rpt, SaHpiCtrlStateDigitalT control_state) { SaErrorT rv = SA_OK; struct oa_soap_handler *oa_handler = NULL; enum hpoa_boolean lcd_button_lock; if (oh_handler == NULL || rpt == NULL) { err("Invalid parameters"); return SA_ERR_HPI_INVALID_PARAMS; } oa_handler = (struct oa_soap_handler *) oh_handler->data; if (rpt->ResourceEntity.Entry[0].EntityType != SAHPI_ENT_DISPLAY_PANEL) { err("LCD button lock is supported only on LCD"); err("Requested on wrong resource type %d", rpt->ResourceEntity.Entry[0].EntityType); return SA_ERR_HPI_INVALID_PARAMS; } /* Return error if the control state is PULSE_ON or PULSE_OFF */ if ((control_state == SAHPI_CTRL_STATE_PULSE_ON) || (control_state == SAHPI_CTRL_STATE_PULSE_OFF)) { err("Setting the control state to PULSE ON/OFF not supported"); return SA_ERR_HPI_INVALID_DATA; } /* Map the control state to LCD button lock state */ if (control_state == SAHPI_CTRL_STATE_ON) { lcd_button_lock = HPOA_TRUE; } else { lcd_button_lock = HPOA_FALSE; } /* Check whether the re-discovery is started by trying to lock the * oa_handler mutex */ rv = lock_oa_soap_handler(oa_handler); if (rv != SA_OK) { err("OA SOAP handler is locked"); return rv; } rv = soap_setLcdButtonLock(oa_handler->active_con, lcd_button_lock); if (rv != SOAP_OK) { err("Set LCD button lock SOAP call failed"); return SA_ERR_HPI_INTERNAL_ERROR; } return SA_OK; } void *oh_get_control_state (void *, SaHpiResourceIdT, SaHpiCtrlNumT, SaHpiCtrlModeT *, SaHpiCtrlStateT *) __attribute__ ((weak, alias ("oa_soap_get_control_state"))); void *oh_set_control_state (void *, SaHpiResourceIdT, SaHpiCtrlNumT, SaHpiCtrlModeT, SaHpiCtrlStateT *) __attribute__ ((weak, alias ("oa_soap_set_control_state"))); openhpi-2.14.1/plugins/oa_soap/oa_soap_interconnect_event.h0000644000076400007640000000555511302566663021063 0ustar /* * Copyright (C) 2007-2008, Hewlett-Packard Development Company, LLP * All rights reserved. * * 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. * * Neither the name of the Hewlett-Packard Corporation, nor the names * of its contributors may be used to endorse or promote products * derived from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * Author(s) * Raghavendra P.G. * Shuah Khan */ #ifndef _OA_SOAP_INTERCONNECT_EVENT_H #define _OA_SOAP_INTERCONNECT_EVENT_H /* Include files */ #include "oa_soap_re_discover.h" SaErrorT process_interconnect_reset_event(struct oh_handler_state *oh_handler, struct eventInfo *oa_event); SaErrorT process_interconnect_power_event(struct oh_handler_state *oh_handler, struct eventInfo *oa_event); SaErrorT process_interconnect_insertion_event(struct oh_handler_state *oh_handler, SOAP_CON *con, struct eventInfo *oa_event); SaErrorT process_interconnect_extraction_event(struct oh_handler_state *oh_handler, struct eventInfo *oa_event); void oa_soap_proc_interconnect_status(struct oh_handler_state *oh_handler, struct interconnectTrayStatus *status); void oa_soap_proc_interconnect_thermal(struct oh_handler_state *oh_handler, SOAP_CON *con, struct interconnectTrayStatus *response); #endif openhpi-2.14.1/plugins/oa_soap/oa_soap_lcd_event.h0000644000076400007640000000361011302566663017120 0ustar /* * Copyright (C) 2008, Hewlett-Packard Development Company, LLP * All rights reserved. * * 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. * * Neither the name of the Hewlett-Packard Corporation, nor the names * of its contributors may be used to endorse or promote products * derived from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * Author(s) * Raghavendra P.G. */ #ifndef _OA_SOAP_LCD_EVENT_H #define _OA_SOAP_LCD_EVENT_H /* Include files */ #include "oa_soap_sensor.h" #include void oa_soap_proc_lcd_status(struct oh_handler_state *oh_handler, struct lcdStatus *status); #endif openhpi-2.14.1/plugins/oa_soap/oa_soap_load_id.h0000644000076400007640000000412611302566663016553 0ustar /* * Copyright (C) 2007-2008, Hewlett-Packard Development Company, LLP * All rights reserved. * * 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. * * Neither the name of the Hewlett-Packard Corporation, nor the names * of its contributors may be used to endorse or promote products * derived from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * Author(s) * Raghavendra P.G. */ #ifndef _OA_SOAP_LOAD_ID_H #define _OA_SOAP_LOAD_ID_H /* Include files */ #include #include SaErrorT oa_soap_load_id_get(void *oh_handler, SaHpiResourceIdT resource_id, SaHpiLoadIdT load_id); SaErrorT oa_soap_load_id_set(void *oh_handler, SaHpiResourceIdT resource_id, SaHpiLoadIdT *load_id); #endif openhpi-2.14.1/plugins/oa_soap/oa_soap_dimi.h0000644000076400007640000000745011302566664016106 0ustar /* * Copyright (C) 2007-2008, Hewlett-Packard Development Company, LLP * All rights reserved. * * 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. * * Neither the name of the Hewlett-Packard Corporation, nor the names * of its contributors may be used to endorse or promote products * derived from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * Author(s) * Anand S */ #ifndef _OA_SOAP_DIMI_H #define _OA_SOAP_DIMI_H /* Include files */ #include #include SaErrorT oa_soap_get_dimi_info( void *oh_handler, SaHpiSessionIdT session_id, SaHpiResourceIdT resource_id, SaHpiDimiNumT dimi_num, SaHpiDimiInfoT *dimi_info); SaErrorT oa_soap_get_dimi_test( void *oh_handler, SaHpiSessionIdT session_id, SaHpiResourceIdT resource_id, SaHpiDimiNumT dimi_num, SaHpiDimiTestNumT dimi_testnum, SaHpiDimiTestT *dimi_test); SaErrorT oa_soap_get_dimi_test_ready( void *oh_handler, SaHpiSessionIdT session_id, SaHpiResourceIdT resource_id, SaHpiDimiNumT dimi_num, SaHpiDimiTestNumT dimi_testnum, SaHpiDimiReadyT *dimi_test_ready); SaErrorT oa_soap_start_dimi_test( void *oh_handler, SaHpiSessionIdT session_id, SaHpiResourceIdT resource_id, SaHpiDimiNumT dimi_num, SaHpiDimiTestNumT dimi_testnum, SaHpiUint8T params, SaHpiDimiTestVariableParamsT *param_list); SaErrorT oa_soap_cancel_dimi_test( void *oh_handler, SaHpiSessionIdT session_id, SaHpiResourceIdT resource_id, SaHpiDimiNumT dimi_num, SaHpiDimiTestNumT dimi_testnum); SaErrorT oa_soap_get_dimi_test_status( void *oh_handler, SaHpiSessionIdT session_id, SaHpiResourceIdT resource_id, SaHpiDimiNumT dimi_num, SaHpiDimiTestNumT dimi_testnum, SaHpiDimiTestPercentCompletedT* complete, SaHpiDimiTestRunStatusT *status); SaErrorT oa_soap_get_dimi_test_result( void *oh_handler, SaHpiSessionIdT session_id, SaHpiResourceIdT resource_id, SaHpiDimiNumT dimi_num, SaHpiDimiTestNumT dimi_testnum, SaHpiDimiTestResultsT *test_result); #endif openhpi-2.14.1/plugins/oa_soap/oa_soap_reset.c0000644000076400007640000002642211302566663016300 0ustar /* * Copyright (C) 2007-2008, Hewlett-Packard Development Company, LLP * All rights reserved. * * 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. * * Neither the name of the Hewlett-Packard Corporation, nor the names * of its contributors may be used to endorse or promote products * derived from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * Author(s) * Raghavendra P.G. * Shuah Khan * * * This file handles all the resource reset states related apis. * * oa_soap_get_reset_state() - API to return the reset state of chassis * components * * oa_soap_set_reset_state() - API to set the reset state for all the * chassis components **/ #include "oa_soap_reset.h" /** * oa_soap_get_reset_state * @oh_handler: Pointer to openhpi handler * @resource_id: Resource id * @action: Pointer to reset action * * Purpose: * gets the reset state of the chassis resource * * Detailed Description: NA * * Return values: * SA_OK - on success. * SA_ERR_HPI_INVALID_PARAMS - on wrong parameters * SA_ERR_HPI_INTERNAL_ERROR - on failure. **/ SaErrorT oa_soap_get_reset_state(void *oh_handler, SaHpiResourceIdT resource_id, SaHpiResetActionT *action) { SaErrorT rv = SA_OK; SaHpiPowerStateT state; struct oh_handler_state *handler = NULL; if (oh_handler == NULL || action == NULL) { err("Invalid parameters"); return SA_ERR_HPI_INVALID_PARAMS; } handler = (struct oh_handler_state *) oh_handler; /* Get the current power state of the resource */ rv = oa_soap_get_power_state(oh_handler, resource_id, &state); if (rv != SA_OK) { err("Get server power state failed"); return rv; } switch (state) { case (SAHPI_POWER_ON): *action = SAHPI_RESET_DEASSERT; break; case (SAHPI_POWER_OFF): *action = SAHPI_RESET_ASSERT; break; /* Power cycle is a momentary state * Hence, resource should never give the 'power cycle' as * its current power state */ case (SAHPI_POWER_CYCLE): err("Wrong reset state (Power cycle) detected"); return SA_ERR_HPI_INTERNAL_ERROR; break; default: err("Wrong reset state"); return SA_ERR_HPI_INTERNAL_ERROR; } return SA_OK; } /** * oa_soap_set_reset_state * @oh_handler: Pointer to openhpi handler * @resource_id: Resource id * @action: Reset action * * Purpose: * sets the reset state of the resource in the chassis * * Detailed Description: * - Resource capability will be checked based on the resource id * - and then based on the action and type of the entity, different * interface api is used for resetting the resource component. * * Return values: * SA_OK - on success. * SA_ERR_HPI_INVALID_PARAMS - on wrong parameters * SA_ERR_HPI_INVALID_REQUEST - on request to reset a resource * which is powered off. * Or on wrong reset request * SA_ERR_HPI_INTERNAL_ERROR - on failure. **/ SaErrorT oa_soap_set_reset_state(void *oh_handler, SaHpiResourceIdT resource_id, SaHpiResetActionT action) { SaErrorT rv = SA_OK; SaHpiPowerStateT tmp; SaHpiRptEntryT *rpt = NULL; SaHpiInt32T bay_number; struct setBladePower server_request; struct resetInterconnectTray interconnect_request; struct oh_handler_state *handler = NULL; struct oa_soap_handler *oa_handler = NULL; if (oh_handler == NULL) { err("invalid parameters"); return SA_ERR_HPI_INVALID_PARAMS; } handler = (struct oh_handler_state *) oh_handler; oa_handler = (struct oa_soap_handler *) handler->data; rpt = oh_get_resource_by_id(handler->rptcache, resource_id); if (rpt == NULL) { err("INVALID RESOURCE"); return SA_ERR_HPI_INVALID_RESOURCE; } /* Check whether resource has reset capability */ if (! (rpt->ResourceCapabilities & SAHPI_CAPABILITY_RESET)) { err("INVALID RESOURCE CAPABILITY"); return SA_ERR_HPI_CAPABILITY; } switch (action) { case SAHPI_RESET_DEASSERT: /* RESET_DEASSERT is equivalent to power on * Call the set power state function with power on */ rv = oa_soap_set_power_state(oh_handler, resource_id, SAHPI_POWER_ON); if (rv != SA_OK) err("Set power ON failed"); return rv; break; case SAHPI_RESET_ASSERT: /* RESET_ASSERT is equivalent to power off * Call the set power state function with power off */ rv = oa_soap_set_power_state(oh_handler, resource_id, SAHPI_POWER_OFF); if (rv != SA_OK) err("Set power OFF failed"); return rv; break; case SAHPI_COLD_RESET: case SAHPI_WARM_RESET: /* Get the current power state */ rv = oa_soap_get_power_state(oh_handler, resource_id, &tmp); if (rv != SA_OK) { err("Get power state failed"); return rv; } /* Reset can not be done when resource is in power * off state */ if (tmp == SAHPI_POWER_OFF) { return SA_ERR_HPI_INVALID_REQUEST; } /* Check whether oa_handler mutex is locked or not */ rv = lock_oa_soap_handler(oa_handler); if (rv != SA_OK) { err("OA SOAP handler is locked"); return rv; } bay_number = rpt->ResourceEntity.Entry[0].EntityLocation; /* Check the resource entity type */ switch (rpt->ResourceEntity.Entry[0].EntityType) { case SAHPI_ENT_SYSTEM_BLADE: /* Resource type is server blade. * Reset the server blade */ server_request.bayNumber = bay_number; server_request.power = RESET; rv = soap_setBladePower( oa_handler->active_con, &server_request); if (rv != SOAP_OK) { err("Set blade power to power " "reset failed"); return SA_ERR_HPI_INTERNAL_ERROR; } return SA_OK; break; case SAHPI_ENT_IO_BLADE: case SAHPI_ENT_DISK_BLADE: return(SA_ERR_HPI_UNSUPPORTED_API); case SAHPI_ENT_SWITCH_BLADE: /* Resource type is interconnect blade. * Reset the interconnect blade */ interconnect_request.bayNumber = bay_number; rv = soap_resetInterconnectTray( oa_handler->active_con, &interconnect_request); if (rv != SOAP_OK) { err("Reset interconnect reset " "failed"); return SA_ERR_HPI_INTERNAL_ERROR; } return SA_OK; break; default: err("Invalid Resource Type"); return SA_ERR_HPI_INTERNAL_ERROR; } break; default: err("Invalid reset state requested"); return SA_ERR_HPI_INVALID_REQUEST; } return SA_OK; } void * oh_get_reset_state (void *, SaHpiResourceIdT, SaHpiResetActionT *) __attribute__ ((weak, alias("oa_soap_get_reset_state"))); void * oh_set_reset_state (void *, SaHpiResourceIdT, SaHpiResetActionT) __attribute__ ((weak, alias("oa_soap_set_reset_state"))); openhpi-2.14.1/plugins/oa_soap/oa_soap_oa_event.h0000644000076400007640000000463611302566663016766 0ustar /* * Copyright (C) 2007-2008, Hewlett-Packard Development Company, LLP * All rights reserved. * * 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. * * Neither the name of the Hewlett-Packard Corporation, nor the names * of its contributors may be used to endorse or promote products * derived from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * Author(s) * Raghavendra P.G. */ #ifndef _OA_SOAP_OA_EVENT_H #define _OA_SOAP_OA_EVENT_H /* Include files */ #include "oa_soap_re_discover.h" SaErrorT process_oa_extraction_event(struct oh_handler_state *oh_handler, struct eventInfo *oa_event); SaErrorT process_oa_failover_event(struct oh_handler_state *oh_handler, struct oa_info *oa); SaErrorT process_oa_info_event(struct oh_handler_state *oh_handler, SOAP_CON *con, struct eventInfo *oa_event); void oa_soap_proc_oa_status(struct oh_handler_state *oh_handler, struct oaStatus *status); void oa_soap_proc_oa_network_info(struct oh_handler_state *oh_handler, struct oaNetworkInfo *nw_info); #endif openhpi-2.14.1/plugins/oa_soap/oa_soap_annunciator.c0000644000076400007640000002465711302566663017507 0ustar /* * Copyright (C) 2007-2008, Hewlett-Packard Development Company, LLP * All rights reserved. * * 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. * * Neither the name of the Hewlett-Packard Corporation, nor the names * of its contributors may be used to endorse or promote products * derived from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * Author(s) * Raghavendra M.S. */ #include "oa_soap_annunciator.h" /** * oa_soap_get_next_announce: * @oh_handler: Pointer to openhpi handler. * @resource_id: Resource Id. * @num: Annuciator number. * @severity: Annuciator severity * @unacknowledged_only: True indicates only unacknowledged announcements * should be returned. False indicates either an * acknowledged or unacknowledged announcement may * be returned. * @announcement: Pointer to hold the returned announcement. * * Purpose: * Retrieve an announcement from the current set of announcements * held in the Annunciator. * * Detailed Description: NA * * Return values: * SA_ERR_HPI_UNSUPPORTED_API - current OA SOAP plugin implementation * does not support this API. **/ SaErrorT oa_soap_get_next_announce(void *oh_handler, SaHpiResourceIdT resource_id, SaHpiAnnunciatorNumT num, SaHpiSeverityT severity, SaHpiBoolT unacknowledged_only, SaHpiAnnouncementT *announcement) { err("OA SOAP get next announce not implemented"); return SA_ERR_HPI_UNSUPPORTED_API; } /** * oa_soap_get_announce: * @oh_handler: Pointer to openhpi handler. * @resource_id: Resource Id. * @num: Annuciator number. * @entry: Identifier of the announcement to retrieve from the * Annunciator. * @announcement: Pointer to hold the returned announcement. * * Purpose: * Retrieve of a specific announcement from the current set of * announcements held in the Annunciator. * * Detailed Description: NA * * Return values: * SA_ERR_HPI_UNSUPPORTED_API - current OA SOAP plugin implementation * does not support this API. **/ SaErrorT oa_soap_get_announce(void *oh_handler, SaHpiResourceIdT resource_id, SaHpiAnnunciatorNumT num, SaHpiEntryIdT entry, SaHpiAnnouncementT *announcement) { err("OA SOAP get announce not implemented "); return SA_ERR_HPI_UNSUPPORTED_API; } /** * oa_soap_ack_announce: * @oh_handler: Pointer to openhpi handler. * @resource_id: Resource Id. * @num: Annuciator number. * @entry: Identifier of the announcement to retrieve from the * Annunciator. * @severity: Severity level of announcements to acknowledge. * * Purpose: * acknowledge a single announcement or a group of announcements by * severity. * * Detailed Description: NA * * Return values: * SA_ERR_HPI_UNSUPPORTED_API - current OA SOAP plugin implementation * does not support this API. **/ SaErrorT oa_soap_ack_announce(void *oh_handler, SaHpiResourceIdT resource_id, SaHpiAnnunciatorNumT num, SaHpiEntryIdT entry, SaHpiSeverityT severity) { err("OA SOAP ack announce not implemented "); return SA_ERR_HPI_UNSUPPORTED_API; } /** * oa_soap_get_annunc_mode: * @oh_handler: Pointer to openhpi handler. * @resource_id: Resource Id. * @num: Annuciator number. * @mode: Pointer to store the current operating mode of the * Annunciator. * * Purpose: * Retrieve the current operating mode of an Annunciator. * * Detailed Description: NA * * Return values: * SA_ERR_HPI_UNSUPPORTED_API - current OA SOAP plugin implementation * does not support this API. **/ SaErrorT oa_soap_get_annunc_mode(void *oh_handler, SaHpiResourceIdT resource_id, SaHpiAnnunciatorNumT num, SaHpiAnnunciatorModeT *mode) { err("OA SOAP get annunc mode not implemented "); return SA_ERR_HPI_UNSUPPORTED_API; } /** * oa_soap_set_annunc_mode: * @oh_handler: Pointer to openhpi handler. * @resource_id: Resource Id. * @num: Annuciator number. * @mode: Mode set for the Annunciator. * * Purpose: * Change the current operating mode of an Annunciator. * * Detailed Description: NA * * Return values: * SA_ERR_HPI_UNSUPPORTED_API - current OA SOAP plugin implementation * does not support this API. **/ SaErrorT oa_soap_set_annunc_mode(void *oh_handler, SaHpiResourceIdT resource_id, SaHpiAnnunciatorNumT num, SaHpiAnnunciatorModeT mode) { err("OA SOAP set annunc mode not implemented "); return SA_ERR_HPI_UNSUPPORTED_API; } /** * oa_soap_del_announce: * @oh_handler: Pointer to openhpi handler. * @resource_id: Resource Id. * @num: Annuciator number. * @entry: Entry identifier of the announcement to delete * @severity: Severity level of announcements to delete. * * Purpose: * Delete a single announcement or a group of announcements from the * current set of an Annunciator * * Detailed Description: NA * * Return values: * SA_ERR_HPI_UNSUPPORTED_API - current OA SOAP plugin implementation * does not support this API. **/ SaErrorT oa_soap_del_announce(void *oh_handler, SaHpiResourceIdT resource_id, SaHpiAnnunciatorNumT num, SaHpiEntryIdT entry, SaHpiSeverityT severity) { err("OA SOAP del announce not implemented "); return SA_ERR_HPI_UNSUPPORTED_API; } /** * oa_soap_add_announce: * @oh_handler: Pointer to openhpi handler. * @resource_id: Resource Id. * @num: Annuciator number. * @annoucement: Pointer to structure that contains the new announcement * to add to the set. * * Purpose: * add an announcement to the set of items held by an Annunciator * management instrument. * * Detailed Description: NA * * Return values: * SA_ERR_HPI_UNSUPPORTED_API - current OA SOAP plugin implementation * does not support this API. **/ SaErrorT oa_soap_add_announce(void *oh_handler, SaHpiResourceIdT resource_id, SaHpiAnnunciatorNumT num, SaHpiAnnouncementT *announcement) { err("OA SOAP add announce not implemented "); return SA_ERR_HPI_UNSUPPORTED_API; } void * oh_get_next_announce (void *, SaHpiResourceIdT, SaHpiAnnunciatorNumT, SaHpiSeverityT, SaHpiBoolT, SaHpiAnnouncementT) __attribute__ ((weak, alias("oa_soap_get_next_announce"))); void * oh_get_announce (void *, SaHpiResourceIdT, SaHpiAnnunciatorNumT, SaHpiEntryIdT, SaHpiAnnouncementT *) __attribute__ ((weak, alias("oa_soap_get_announce"))); void * oh_ack_announce (void *, SaHpiResourceIdT, SaHpiAnnunciatorNumT, SaHpiEntryIdT, SaHpiSeverityT) __attribute__ ((weak, alias("oa_soap_ack_announce"))); void * oh_add_announce (void *, SaHpiResourceIdT, SaHpiAnnunciatorNumT, SaHpiAnnouncementT *) __attribute__ ((weak, alias("oa_soap_add_announce"))); void * oh_del_announce (void *, SaHpiResourceIdT, SaHpiAnnunciatorNumT, SaHpiEntryIdT, SaHpiSeverityT) __attribute__ ((weak, alias("oa_soap_del_announce"))); void * oh_get_annunc_mode (void *, SaHpiResourceIdT, SaHpiAnnunciatorNumT, SaHpiAnnunciatorModeT *) __attribute__ ((weak, alias("oa_soap_get_annunc_mode"))); void * oh_set_annunc_mode (void *, SaHpiResourceIdT, SaHpiAnnunciatorNumT, SaHpiAnnunciatorModeT) __attribute__ ((weak, alias("oa_soap_set_annunc_mode"))); openhpi-2.14.1/plugins/oa_soap/oa_soap_callsupport.c0000644000076400007640000012301211302566663017517 0ustar /* * Copyright (C) 2007-2009, Hewlett-Packard Development Company, LLP * All rights reserved. * * 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. * * Neither the name of the Hewlett-Packard Corporation, nor the names * of its contributors may be used to endorse or promote products * derived from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * Author(s) * Bryan Sutula * Mohan Devarajulu * * * This file implements support functions that are used to perform SOAP * calls. There are four general classes of functions implemented in this * file: session management, soap call requests, XML response tree parsing, * and general utility calls. (Note that some of these are implemented as * macros, in the oa_soap_callsupport.h include file.) The specific calls * are as follows: * * Session Management: * soap_open() - Opens a connection to an OA using the * SOAP/XML protocol * soap_close() - Close a connection opened with soap_open() * * Soap Call Requests: * soap_request() - Main XML/SOAP request function, used by the * individual SOAP client call functions to * communicate with the OA * * XML Response Tree Parsing: * soap_find_node() - Recursively searches an XML tree, starting * with a specified node, looking for the * specified named node * soap_walk_tree() - Beginning with the specified node, walk an * XML tree to find the destination node, * based on a pattern of named nodes * soap_walk_doc() - Same as soap_walk_tree() but begins at the * root of the XML document * soap_value() - Returns the value at this part of the XML * tree, in particular, the node's child's * content field * soap_tree_value() - A convenience combination of soap_walk_tree() * and soap_value, heavily used in response * parameter parsing * soap_next_node() - When walking a list (array) of soap call * response values, this function gets you to * the next response node * soap_enum() - Performs enum string matching, which would * otherwise require a large amount of parameter * parsing code * soap_inv_enum() - Performs the inverse of soap_enum() * * General Utility: * soap_ignore_errors() - Used when a SOAP call error is expected, and * does not necessarily indicate a problem. * soap_error_number() - Returns the last SOAP call error number; * perhaps used when soap_ignore_errors() has * disabled error reporting. * soap_error_string() - Returns the last SOAP call error string. * soap_timeout() - Reads or writes the current connection * timeout value, in seconds */ /* Include files */ #include #include #include #include #include "oa_soap_callsupport.h" /* Include file check */ #ifndef LIBXML_PUSH_ENABLED #error This source file requires LIBXML_PUSH_ENABLED functionality in libxml2 #endif /* Local data types */ enum soap_error_enum { SOAP_NO_ERROR, SOAP_ERROR, SOAP_INVALID_SESSION }; /* Forward declarations of static functions */ static int soap_login(SOAP_CON *connection); static int soap_logout(SOAP_CON *connection); /** * soap_find_node * @node: pointer to an XML subtree * @s_name: string that is being searched * * Searches an XML subtree, looking for a named node. * * Return value: the XML node, if found, or NULL. **/ xmlNode *soap_find_node(xmlNode *node, char *s_name) { xmlNode *c_node; while (node != NULL){ if (!xmlStrcmp(node->name, (const xmlChar *)s_name)){ return(node); } c_node = soap_find_node(node->xmlChildrenNode, s_name); if (c_node != NULL){ return(c_node); } node = node->next; } return(NULL); } /** * soap_walk_tree * @node: pointer to an XML subtree * @colonstring: node name strings that are being searched; for example, to * search for nodes "a", then "b", then "c", pass "a:b:c" * * Searches an XML subtree, looking for a named node. Very similar to * soap_find_node() above, but uses an entirely different algorithm, both for * efficiency and to make response parsing more pedantic. * * The passed colonstring is a list of tree node names separated by ':'. At * each level of the tree, the corresponding name must match. This means that * the whole XML tree doesn't need to be searched, and that you know you've * found the right node, not one that is similarly-named but is in a different * part of the XML tree. * * Return value: the XML node, if found, or NULL. **/ xmlNode *soap_walk_tree(xmlNode *node, char *colonstring) { char *next; char *c; int len; /* Length of node name string */ if ((! node) || (! colonstring) || (! *colonstring) || (*colonstring == ':')) { return(NULL); } /* Break string at ':' */ c = strchr(colonstring, ':'); if (c) { len = c - colonstring; next = c + 1; } else { len = strlen(colonstring); next = colonstring + len; } /* Look for this in the node tree's children */ node = node->children; while (node) { if ((! xmlStrncmp(node->name, (const xmlChar *)colonstring, len)) && (xmlStrlen(node->name) == len)) { if (*next) { return(soap_walk_tree(node, next)); } else { /* Done searching */ return(node); } } node = node->next; } return(NULL); } /** * soap_walk_doc * @doc: pointer to an XML document * @colonstring: node name strings that are being searched; for example, to * search for nodes "a", then "b", then "c", pass "a:b:c" * * Same as soap_walk_tree(), but first obtains the root XML node from an XML * document. * * Note: This could be a #define, but is generally called only once for each * OA SOAP call. Having it as a function makes it easier to interpret any * compiler errors or warnings regarding parameter mismatches. * * Return value: the XML node, if found, or NULL. **/ xmlNode *soap_walk_doc(xmlDocPtr doc, char *colonstring) { /* Null doc pointer passes through without error, apparently */ return(soap_walk_tree(xmlDocGetRootElement(doc), colonstring)); } /** * soap_value * @node: pointer to an XML subtree * * Returns the value at this part of the XML tree. The value is the node's * child's content field. * * Return value: a string pointer to the XLM content field. NULL is returned * if there is any sort of problem accessing the value. **/ char *soap_value(xmlNode *node) { if ((node) && (node->children) && (node->children->content)) { return((char *)(node->children->content)); } return(NULL); } /** * soap_tree_value * @node: pointer to an XML subtree * @colonstring: node name strings that are being searched; for example, to * search for nodes "a", then "b", then "c", pass "a:b:c" * * soap_tree_value() is a heavily-used combination of soap_walk_tree() and * soap_value(), both described above. Generally used to locate specific * response parameters and obtain their values. NULL is returned if anything * goes wrong with the response, so callers must be prepared for that value. * * Return value: a string pointer to the XLM content field. NULL is returned * if there is any sort of problem accessing the value. **/ char *soap_tree_value(xmlNode *node, char *colonstring) { return(soap_value(soap_walk_tree(node, colonstring))); } /** * soap_next_node * @node: pointer to an XML subtree * * When walking a list (array) of soap call response values, it is necessary * to have a function that moves to the next response value. This is that * function. Think of it as the function used in place of "node = node->next", * for XML response trees. * * Extra work is required because the XML response tree can contain essentially * empty nodes. For example, newlines and other formatting characters occupy * XML nodes, even though they don't contain useful response content. * * Return value: If there are more values in this response array, the next * array node is returned. Otherwise, the return value is NULL. **/ xmlNode *soap_next_node(xmlNode *node) { if (! node) { return(NULL); } node = node->next; while (node) { if ((node->children) && (node->children->content)) { return(node); } node = node->next; } return(NULL); } /** * soap_enum * @enums: Combined enum value string, as generated by the OA_SOAP_ENUM() * macro. Generally, this is the type name of the enum followed * by "_S". * @value: The string that should match one of the enum value names * * Performs enum string matching, which would otherwise require a large amount * of parameter parsing code. * * The general problem is that the OA returnes a large number of enum values. * These come across as strings, and need to be matched back to enum values. * There would be a large amount of string matching code to do this job. * * Instead, during the definition of each enum, a single string is also created * containing the string values that need to be matched. A single call to * strstr() will locate the enum value in the string, and then it's position in * the combined enum string determines the enum value to be returned. * * Return value: The enum value (a non-negative integer) if a match is found. * If there is no successful match, the value -1 is returned. **/ int soap_enum(const char *enums, char *value) { char *found; const char *start = enums; int n = 0; int len; if (! value) { /* Can't proceed without a string */ err("could not find enum (NULL value) in \"%s\"", enums); return(-1); } len = strlen(value); /* We have to search repeatedly, in case the match is just a substring * of an enum value. */ while (start) { found = strstr(start, value); /* To match, a value must be found, it must either be at the * start of the string or be preceeded by a space, and must * be at the end of the string or be followed by a ',' */ if ((found) && ((found == start) || (*(found - 1) == ' ')) && ((*(found + len) == ',') || (*(found + len) == '\0'))) { /* Having found a match, count backwards to see which * enum value should be returned. */ while (--found >= enums) { if (*found == ',') n++; } return(n); } if (found) { /* We found something but it was a substring. We need * to search again, but starting further along in the * enums string. */ start = found + len; } else { start = NULL; /* We won't search any more */ } } err("could not find enum value \"%s\" in \"%s\"", value, enums); return(-1); } /** * soap_inv_enum * @result: A string buffer big enough to hold any of the enum names. * This is the ASCII string that can be sent to the OA. * @enums: Combined enum value string, as generated by the OA_SOAP_ENUM() * macro. Generally, this is the type name of the enum followed * by "_S". * @value: The enum value that is to be converted to an ASCII string * * Performs roughly the inverse of soap_enum(), for very similar reasons. * * In this case, the user provides an enum value, and we need to send an ASCII * string to the OA. Instead of a case statement, this function uses the same * combined enum value string to produce the string that needs to go to across * the wire. * * The process is to count the enum value separators (the ',') placed by the * OA_SOAP_ENUM() macro and find the right enum name string. It is necessary * to copy this string to a temporary buffer, because the string will become * an argument to sprintf(), and needs to be null-terminated. Therefore, the * caller must provide a buffer big enough for the resulting string. * * Note that there are no error checks on the buffer size, so please ensure * that "result" is big enough for any of the enum names. * * Return value: If "value" refers to a valid enum, soap_inv_enum() returns 0 * and "result" will contain the desired ASCII string. If there is no enum * string for the passed value, -1 is returned. **/ int soap_inv_enum(char *result, const char *enums, int value) { char *found; int len; if (value < 0) { /* Error check */ err("inappropriate value"); return(-1); } while (value && enums) { enums = strchr(enums, ',') + 1; value--; } if (! enums) { err("can't find enum"); return(-1); } if (*enums == ' ') enums++; found = strchr(enums, ','); if (found) len = found - enums; else len = strlen(enums); strncpy(result, enums, len); result[len] = '\0'; return(0); } /** * soap_open * @server: String containing a server and port, such as "ccc2:443" or * "192.168.1.123:443". This string is passed, unchanged, to * BIO_set_conn_hostname(), so refer to that man page for details * on what types of strings can be used. * @username: Username to be used when performing OA SOAP calls. Generally, * this needs to be configured on the OA before the OA SOAP call * library can be used. * @password: Password for the above "username" * @timeout: OA SOAP response timeout, in seconds. If zero, SOAP requests * will wait forever. * * Opens a session to an OA using the SOAP/XML protocol. The rest of the SOAP * support calls use this session to perform SOAP requests. Note that this * call performs the initial OA login, so that a caller can be assured that the * complete connection to the OA is available. * * SOAP sessions encapsulate the following functionality: * - Maintain the SSL information necessary to talk to the OA * - Keep the username and password used when performing SOAP requests * - Take care of any necessary login calls * - Implement optional timeouts while reading SOAP response values * - Manage request and response buffers needed by the OA SOAP protocol * - Perform basic error checking during SOAP requests * * Note that while thread-safe calls are used (depending on compile options), * the semantics of the SOAP support calls require that each thread maintain * it's own SOAP session. So a threaded application will need to use * soap_open() in each thread. * * Return value: The new SOAP_CON connection structure if successful, or NULL * on failure. **/ SOAP_CON *soap_open(char *server, char *username, char *password, long timeout) { SOAP_CON *connection; /* Basic pass parameter checking */ if ((server == NULL) || (*server == '\0')) { err("missing remote server"); return(NULL); } if ((username == NULL) || (*username == '\0')) { err("missing OA username"); return(NULL); } if ((password == NULL) || (*password == '\0')) { err("missing OA password"); return(NULL); } if (timeout < 0) { err("inappropriate timeout value"); return(NULL); } /* This will check for potential ABI mismatches between the compiled * version and the installed library. If there are mismatches, I'm * afraid the calling program will die here, but that may be better * than allowing the situation to continue. */ LIBXML_TEST_VERSION /* Get a new OA SOAP connection structure and initialize it */ connection = g_malloc(sizeof(SOAP_CON)); /* New connection */ if (! connection) { err("out of memory"); return(NULL); } strncpy(connection->server, server, OA_SOAP_SERVER_SIZE); strncpy(connection->username, username, OA_SOAP_USER_SIZE); strncpy(connection->password, password, OA_SOAP_USER_SIZE); connection->timeout = timeout; connection->session_id[0] = '\0'; connection->doc = NULL; connection->req_buf[0] = '\0'; connection->req_high_water = 0; soap_ignore_errors(connection, 0); connection->last_error_number = 0; connection->last_error_string = NULL; /* Create and initialize a new SSL_CTX structure */ if (! (connection->ctx = oh_ssl_ctx_init())) { err("oh_ssl_ctx_init() failed"); free(connection); return(NULL); } /* Login to the OA, saving session information */ if (soap_login(connection)) { err("OA login failed for server %s", connection->server); if (oh_ssl_ctx_free(connection->ctx)) { err("oh_ssl_ctx_free() failed"); } if (connection->doc) { xmlFreeDoc(connection->doc); } free(connection); return(NULL); } return(connection); /* Successful soap_open() */ } /** * soap_close * @connection: OA SOAP connection provided by soap_open() * * Closes a session previously opened with soap_open(), freeing any resources * allocated for this session. After making this call, the SOAP_CON structure * pointer can no longer be used. * * Return value: (none) **/ void soap_close(SOAP_CON *connection) { /* Error checking */ if (! connection) { err("NULL connection pointer in soap_close()"); return; } /* Log out of the current OA session */ if (connection->session_id[0] != '\0') { if (soap_logout(connection)) { err("OA logout failed"); /* Continuing to try to free remaining resources */ } } /* Free the SSL_CTX structure */ if (oh_ssl_ctx_free(connection->ctx)) { err("oh_ssl_ctx_free() failed"); } /* Free our OA SOAP connection data structure */ if (connection->doc) { xmlFreeDoc(connection->doc); } /* Buffer size debug information */ dbg("Request buffer used %d out of %d", connection->req_high_water, OA_SOAP_REQ_BUFFER_SIZE); g_free(connection); /* Note that soap_open() initialized the SSL library, but * soap_close() does nothing to clean up and free SSL objects. * This is because the SSL library may still be in use by other * SOAP connections, or even other plugins. There is probably * no way to provide workable clean-up code for SSL in this * environment, so it won't get released completely until the * application (the OpenHPI daemon) exits. */ } /** * soap_message * @connection: OA SOAP connection provided by soap_open() * @request: Request SOAP command, NULL-terminated * @doc: The address of an XML document pointer (filled in by this call) * * Used internally to communicate with the OA. Request buffer is provided by * the caller. The OA's response is parsed into an XML document, which is * then pointed to by @doc. * * This call includes creating the SOAP request header, sending it to the * server, sending the SOAP request, and reading the SOAP response. * * Return value: 0 for a successful SOAP call, -1 for a variety of errors, * and -2 for a response timeout. **/ static int soap_message(SOAP_CON *connection, char *request, xmlDocPtr *doc) { int nbytes; int ret; char header[OA_SOAP_HEADER_SIZE + 1]; char response[OA_SOAP_RESP_BUFFER_SIZE]; xmlParserCtxtPtr parse; /* Error checking */ if (! connection) { err("NULL connection pointer in soap_message()"); return(-1); } if (! request) { err("NULL request buffer in soap_message()"); return(-1); } /* Start SSL connection */ connection->bio = oh_ssl_connect(connection->server, connection->ctx, connection->timeout); if (! connection->bio) { err("oh_ssl_connect() failed"); return(-1); } /* Develop header string */ nbytes = strlen(request); if (connection->req_high_water < nbytes) connection->req_high_water = nbytes; snprintf(header, OA_SOAP_HEADER_SIZE, OA_XML_HEADER, connection->server, nbytes); /* TODO: On that last line, I think server includes port...fix that, * though it doesn't seem to be causing any problems. */ /* Write header to server */ dbg("OA request(1):\n%s\n", header); if (oh_ssl_write(connection->bio, header, strlen(header), connection->timeout)) { (void) oh_ssl_disconnect(connection->bio, OH_SSL_BI); err("oh_ssl_write() failed"); return(-1); } /* Write request to server */ dbg("OA request(2):\n%s\n", request); if (oh_ssl_write(connection->bio, request, nbytes, connection->timeout)) { (void) oh_ssl_disconnect(connection->bio, OH_SSL_BI); err("oh_ssl_write() failed"); return(-1); } /* Read response from server using oh_ssl_read() * * Note that the response seems to come back in two pieces. The * first is the http header. The second is the XML document that * I generally want. For now, I'm throwing away the first part. * * TODO: Need to check to see if this is always the case. */ nbytes = oh_ssl_read(connection->bio, response, OA_SOAP_RESP_BUFFER_SIZE - 1, connection->timeout); if (nbytes <= 0) { (void) oh_ssl_disconnect(connection->bio, OH_SSL_UNI); if (nbytes != -2) { err("oh_ssl_read() part 1 failed"); return(-1); } return(-2); /* Timeout */ } response[nbytes] = '\0'; dbg("OA response(0):\n%s\n", response); /* OK...here's the plan: * * There's an XML parsing function that parses in chunks. We'll get * the first buffer chunk and parse it. If it's the last, we're done. * Otherwise, get more chunks and parse them until something complains. */ nbytes = oh_ssl_read(connection->bio, response, OA_SOAP_RESP_BUFFER_SIZE - 1, connection->timeout); if (nbytes <= 0) { (void) oh_ssl_disconnect(connection->bio, OH_SSL_UNI); if (nbytes != -2) { err("oh_ssl_read() first chunk failed"); return(-1); } return(-2); /* Timeout */ } response[nbytes] = '\0'; dbg("OA response(1):\n%s\n", response); parse = xmlCreatePushParserCtxt(NULL, NULL, response, nbytes, NULL); if (! parse) { (void) oh_ssl_disconnect(connection->bio, OH_SSL_BI); err("failed to create XML push parser context"); return(-1); } /* Remaining chunks */ while ((nbytes = oh_ssl_read(connection->bio, response, OA_SOAP_RESP_BUFFER_SIZE - 1, connection->timeout)) > 0) { if (nbytes < 0) { (void) oh_ssl_disconnect(connection->bio, OH_SSL_UNI); xmlFreeParserCtxt(parse); if (nbytes == -1) { err("oh_ssl_read() other chunks failed"); } return(nbytes); } else { response[nbytes] = '\0'; dbg("OA response(2):\n%s\n", response); ret = xmlParseChunk(parse, response, nbytes, 0); if (ret) { /* Parse error */ err("xmlParseChunk() failed with error %d", ret); (void) oh_ssl_disconnect(connection->bio, OH_SSL_BI); xmlFreeParserCtxt(parse); return(-1); } } } /* We're done with the SSL connection. Close it first. */ if (oh_ssl_disconnect(connection->bio, OH_SSL_BI)) { err("oh_ssl_disconnect() failed"); return(-1); } connection->bio = NULL; /* Finish up the XML parsing */ xmlParseChunk(parse, response, 0, 1); *doc = parse->myDoc; if ((! doc) || (! parse->wellFormed)) { err("failed to parse XML response from OA"); xmlFreeParserCtxt(parse); return(-1); } xmlFreeParserCtxt(parse); return(0); } /** * soap_login * @connection: OA SOAP connection provided by soap_open() * * Used internally to login to the OA. This is executed when we don't have a * valid session ID, or the OA says the session ID is (no longer) valid. * * Internal buffers are used, so that the contents of the main SOAP command * buffer is not disturbed, in case the login needs to be done during a SOAP * call. * * Note that short timeout periods may cause a timeout error, but this * condition will not be separately reported. * * Return value: 0 for a successful SOAP call, and -1 for a variety of errors. **/ static int soap_login(SOAP_CON *connection) { char buf[OA_SOAP_LOGIN_SIZE]; xmlDocPtr doc; xmlNode *login_element; xmlNode *fault; xmlNode *oa_err; char *sess_id; /* Error checking */ if (! connection) { err("NULL connection pointer in soap_login()"); return(-1); } if (connection->session_id[0] != '\0') { err("already have a session ID in soap_login()"); /* Continuing for now */ connection->session_id[0] = '\0'; /* in case of error later */ } /* Generate login request */ snprintf(buf, OA_SOAP_LOGIN_SIZE, OA_XML_LOGIN, connection->username, connection->password); /* Perform login request */ if (soap_message(connection, buf, &doc)) { err("failed to communicate with OA during login"); return(-1); } /* Parse looking for session ID. * * Note that we don't want to use use the connection's doc pointer * because it will complicate the soap_call() logic. */ login_element = soap_walk_doc(doc, "Body:userLogInResponse:" "HpOaSessionKeyToken:oaSessionKey"); if ((sess_id = soap_value(login_element))) { strncpy(connection->session_id, sess_id, OA_SOAP_SESSIONKEY_SIZE); dbg("Opened session ID %s", connection->session_id); /* Free the XML document */ xmlFreeDoc(doc); return(0); /* Normal, successful return */ } /* Below this point, we have some sort of error. All this is * to provide diagnostics for the user. */ if ((fault = soap_walk_doc(doc, "Body:Fault"))) { if ((oa_err = soap_walk_tree(fault, "Detail:faultInfo"))) { err("login failure: %s", soap_tree_value(oa_err, "errorText")); } else { /* Assuming SOAP protocol error */ err("login failure: %s", soap_tree_value(fault, "Reason:Text")); } } else { err("failed to find session ID during OA login"); } xmlFreeDoc(doc); return(-1); } /** * soap_logout * @connection: OA SOAP connection provided by soap_open() * * Used internally to log out of the OA. This is executed only while closing * the connection. * * Note that short timeout periods may cause a timeout error, but this * condition will not be separately reported. * * Return value: 0 for a successful SOAP call, and -1 for a variety of errors. **/ static int soap_logout(SOAP_CON *connection) { /* Error checking */ if (! connection) { err("NULL connection pointer in soap_logout()"); return(-1); } if (connection->session_id[0] == '\0') { err("missing session ID in soap_logout()"); return(-1); } /* Perform logout request */ if (soap_request(connection, "\n")) { err("failed to communicate with OA during logout"); /* Clearing session ID since there was something wrong with * our current session. */ connection->session_id[0] = '\0'; return(-1); } /* Clear session ID, since we're (probably) logged out */ connection->session_id[0] = '\0'; /* Parse looking for OK response */ if (! soap_walk_doc(connection->doc, "Body:userLogOutResponse:returnCodeOk")) { err("failed to logout of the OA session"); return(-1); } return(0); } /** * soap_error_enum * @connection: OA SOAP connection provided by soap_open() * * Used internally to check for SOAP response errors. This code is a bit * messy, and so has been pulled out of soap_call() to make the overall * structure easier to follow. * * Return value: see the soap_call() description for details on error number * return values. **/ static enum soap_error_enum soap_error_check(SOAP_CON *connection) { xmlNode *fault; xmlNode *oa_err; if ((fault = soap_walk_doc(connection->doc, "Body:Fault"))) { /* This can be a generic SOAP protocol error, an invalid * session key, or an error that is generated by the OA. * Only the latter comes with OA error numbers and OA error * strings. * * Try for the invalid login error first. */ if ((oa_err = soap_walk_tree(fault, "Code:Subcode:Value"))) { if (strcmp(soap_value(oa_err), "wsse:FailedAuthentication") == 0) { /* This is an invalid session key */ connection->last_error_number = -4; connection->last_error_string = soap_tree_value(fault, "Reason:Text"); return SOAP_INVALID_SESSION; } } /* OA errors have a "Detail:faultInfo" tree structure */ if ((oa_err = soap_walk_tree(fault, "Detail:faultInfo"))) { connection->last_error_number = atoi(soap_tree_value(oa_err, "errorCode")); connection->last_error_string = soap_tree_value(oa_err, "errorText"); } else { /* Assuming SOAP protocol error */ connection->last_error_number = -3; connection->last_error_string = soap_tree_value(fault, "Reason:Text"); } if (! connection->ignore_errors) { err("OA SOAP error %d: %s", connection->last_error_number, connection->last_error_string); } return SOAP_ERROR; } else { /* Node "Body:Fault" is not found */ connection->last_error_number = 0; connection->last_error_string = NULL; return SOAP_NO_ERROR; } } /** * soap_call * @connection: OA SOAP connection provided by soap_open() * * Perform an entire OA SOAP call, including login (if necessary), sending the * request, reading the response, XML parsing, and checking for SOAP errors. * * Though this is the main public call, SOAP client functions will generally * use the soap_request() macro instead of calling this function directly. * * Functional notes: * This routine is a bit complicated because we need to auto-login if * we have a stale session_id, yet we don't want to continue to try to * login forever. We also don't know that the session_id is stale until * we try to use it. * * The overall structure of this routine is as follows: * * Locate the session key position for later use * Loop, up to two tries { * If I have a session_id { * Substitute the session key * Perform SOAP request: * Free previously-used XML memory * Perform the SOAP call * Check for error (using soap_error_check() above): * Successful call --> Return good status * Other error --> Return error information * Invalid session error --> Clear session_id and drop through * } * If I don't have a session_id { * Try to log in: * Successful call --> Update session_id * Error --> Return error information * } * } * * Return value: 0 for a successful SOAP call and negative numbers for a * variety of errors: * -1 Some general error * -2 Timeout * -3 SOAP protocol error * -4 Invalid session ID (not seen unless really we can't login) **/ int soap_call(SOAP_CON *connection) { char *session_pos; /* Position of session key */ int i; /* Overall loop variable */ int err; /* Error checking */ if (! connection) { err("NULL connection pointer in soap_call()"); return(-1); } if (! connection->req_buf[0]) { err("missing command buffer in soap_call()"); return(-1); } /* Locate the session key. * * TODO: Is there a better way? I've also considered putting a * "%s" in the request string, and using an sprintf() to place the * key at the %s, but it involves a second buffer and wastes an * extra string copy. The main problem with the current approach * is that it assumes a session key size, which could change in a * future version of the OA. */ session_pos = strstr(connection->req_buf, OA_SOAP_SESS_KEY_LABEL); if (! session_pos) { err("failed to find session key location in passed message"); return(-1); } /* Overall loop, up to two tries */ for (i = 0; i < 2; i++) { /* We only try the SOAP request if we have a session_id */ if (connection->session_id[0]) { /* First, we need to free any previously-used XML * memory */ if (connection->doc) { xmlFreeDoc(connection->doc); connection->doc = NULL; } /* Substitute the current session key */ strncpy(session_pos, connection->session_id, OA_SOAP_SESSIONKEY_SIZE); /* Perform SOAP call */ err = soap_message(connection, connection->req_buf, &(connection->doc)); if (err) { if (err == -2) { return(-2); /* Timeout */ } err("failed to communicate with OA " "during soap_call()"); connection->req_buf[0] = '\0'; return(-1); } /* Test for successful call */ switch (soap_error_check(connection)) { case SOAP_NO_ERROR: connection->req_buf[0] = '\0'; return(0); case SOAP_ERROR: connection->req_buf[0] = '\0'; return(-1); case SOAP_INVALID_SESSION: connection->session_id[0] = '\0'; dbg("had an invalid session ID"); break; default: err("internal error"); return(-1); } } /* If we have a session key already */ /* If we didn't (or no longer) have a valid session key, * get one */ if (! connection->session_id[0]) { if (soap_login(connection)) { err("OA login failed in soap call"); return(-1); } } /* If we don't have a session key */ } /* Overall loop, up to two tries */ /* If we fell through, we didn't succeed with the call. The last * error information we have should already be stored in the connection * structure. */ connection->req_buf[0] = '\0'; /* For safety */ return(-1); } openhpi-2.14.1/plugins/oa_soap/oa_soap_inventory.c0000644000076400007640000050622611302566663017220 0ustar /* * Copyright (C) 2007-2008, Hewlett-Packard Development Company, LLP * All rights reserved. * * 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. * * Neither the name of the Hewlett-Packard Corporation, nor the names * of its contributors may be used to endorse or promote products * derived from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * Author(s) * Raghavendra M.S. * Bhaskara Bhatt * Shuah Khan * Raghavendra P.G. * * This file supports the functions related to HPI Inventory Data repositories. * The file covers three general classes of function: IDR ABI functions, * Build functions for creating IDRs for resources and IDR utility functions to * perform different operations (such as addition, deletion, modification) of * IDR areas and IDR fields. * * Data structure usage in Inventory: * - For each resource, one IDR header structure is created and associated in * the private data area of the Inventory RDR. * - Area list is implemented using linked list datastructure. * - Each area in list will contain an area header and field list. * - Field list is also implemented using linked list datastructure. * * IDR ABI functions: * * oa_soap_get_idr_info() - Gets the Inventory Data * Repository(IDR) information * * oa_soap_get_idr_area_header() - Gets the Inventory Data * Repository(IDR) area header * information for a specific area * * oa_soap_add_idr_area() - Creates the Inventory Data * Repository(IDR) area of requested type * * oa_soap_add_idr_area_by_id() - Creates the Inventory Data * Repository(IDR) area of requested type * with specified id * * oa_soap_delete_idr_area() - Deletes the Inventory Data * Repository(IDR) area of specified id * * oa_soap_get_idr_field() - Gets Inventory Data Repository(IDR) * field from a particular IDR area * * oa_soap_add_idr_field() - Adds an IDR field to the specified * Inventory Data Repository(IDR) Area * * oa_soap_add_idr_field_by_id() - Add a field to a specified Inventory * Data Repository(IDR) Area with the * specified field id * * oa_soap_set_idr_field() - Updates the specified Inventory Data * Repository(IDR) field * * oa_soap_del_idr_field() - Deletes the Inventory Data Repository * (IDR) field with specific identifier * in IDR area * Build functions: * * build_enclosure_inv_rdr() - Creates an inventory rdr for enclosure * * build_oa_inv_rdr() - Creates an inventory rdr for OA * * build_server_inv_rdr() - Creates an inventory rdr for server * * build_interconnect_inv_rdr() - Creates an inventory rdr for * interconnect * * build_fan_inv_rdr() - Creates an inventory rdr for fan * * build_power_inv_rdr() - Creates an inventory rdr for power * supply * * oa_soap_build_fan_zone_inventory_rdr() - Creates inventory rdr for Fan * Zone * * IDR Utility functions: * * add_product_area(), * add_chassis_area(), * add_board_area(), * add_internal_area() - IDR utility functions to add IDR areas * * idr_area_add() - Adds an IDR area to Inventory * repository * * idr_area_add_by_id() - Adds an IDR area to Inventory * repository with the specified area id * * fetch_idr_area_header() - Gets an Inventory Data Repository(IDR) * area header from Inventory Data * Repository(IDR) * * idr_area_delete() - Deletes an IDR area from Inventory * Data Repository(IDR) * * idr_field_add() - Adds an IDR field to an IDR area * * idr_field_add_by_id() - Adds an IDR field to an IDR area with * the specified field id * * idr_field_delete() - Deletes an IDR field from an IDR area * * idr_field_update() - Updates an IDR field of an IDR area * * fetch_idr_field() - Gets an IDR field from IDR area in * Inventory repository * * oa_soap_inv_set_field() - Sets the field during discovery * * oa_soap_add_inv_fields() - Adds the fields to area during * discovery * * oa_soap_add_inv_areas() - Adds the area to area_list during * discovery * * oa_soap_build_inventory_rdr() - Creates the inventory RDR * */ #include "oa_soap_inventory.h" /* Array defined in oa_soap_resources.c */ extern const struct oa_soap_inv_rdr oa_soap_inv_arr[]; extern const struct oa_soap_fz_map oa_soap_fz_map_arr[][OA_SOAP_MAX_FAN]; /* Forward declarations for static functions */ static void oa_soap_inv_set_field(struct oa_soap_area *area_list, SaHpiIdrAreaTypeT area_type, SaHpiIdrFieldTypeT field_type, const char *data); static void oa_soap_add_inv_fields(struct oa_soap_area *area, const struct oa_soap_field *field_list); static void oa_soap_add_inv_areas(struct oa_soap_inventory *inventory, SaHpiInt32T resource_type); static SaErrorT oa_soap_build_inv(struct oh_handler_state *oh_handler, SaHpiInt32T resource_type, SaHpiResourceIdT resource_id, struct oa_soap_inventory **inventory); /** * oa_soap_get_idr_info * @oh_handler: Handler data pointer * @resource_id: Resource ID * @idr: IDR ID * @idr_info: Structure for receiving idr information * * Purpose: * Gets the Inventory Data Repository(IDR) information * * Detailed Description: * - Fetches idr info structure from the private data area of * inventory rdr of the specified resource_id * * Return values: * SA_OK - Normal case. * SA_ERR_HPI_CAPABILITY - Resource doesn't have SAHPI_CAPABILITY_INVENTORY * SA_ERR_HPI_INVALID_PARAMS - On wrong parameters * SA_ERR_HPI_INVALID_RESOURCE - Invalid resource id specified * SA_ERR_HPI_NOT_PRESENT - Requested object not present **/ SaErrorT oa_soap_get_idr_info(void *oh_handler, SaHpiResourceIdT resource_id, SaHpiIdrIdT idr, SaHpiIdrInfoT *idr_info) { struct oh_handler_state *handler; SaHpiRptEntryT *rpt = NULL; SaHpiRdrT *rdr = NULL; struct oa_soap_inventory *inventory = NULL; if (oh_handler == NULL || idr_info == NULL) { err("Invalid parameter."); return SA_ERR_HPI_INVALID_PARAMS; } handler = (struct oh_handler_state *)oh_handler; rpt = oh_get_resource_by_id(handler->rptcache, resource_id); if (!rpt) { err("INVALID RESOURCE"); return SA_ERR_HPI_INVALID_RESOURCE; } if (! (rpt->ResourceCapabilities & SAHPI_CAPABILITY_INVENTORY_DATA)) { err("INVALID RESOURCE CAPABILITY"); return SA_ERR_HPI_CAPABILITY; } rdr = oh_get_rdr_by_type(handler->rptcache, resource_id, SAHPI_INVENTORY_RDR, idr); if (rdr == NULL) { err("INVALID RDR NUMBER"); return SA_ERR_HPI_NOT_PRESENT; } inventory = (struct oa_soap_inventory *) oh_get_rdr_data(handler->rptcache, resource_id, rdr->RecordId); if (inventory == NULL) { err("No inventory data. idr=%s", rdr->IdString.Data); return SA_ERR_HPI_NOT_PRESENT; } memcpy(idr_info, &inventory->info.idr_info, sizeof(SaHpiIdrInfoT)); return SA_OK; } /** * oa_soap_get_idr_area_header * @oh_handler: Handler data pointer * @resource_id: Resource ID * @idr: IDR ID * @area_type: Type of the inventory data area * @area_id: Identifier of the area entry * @next_area_id: Structure for receiving the next area of the requested * type * @header: Structure for receiving idr information * * Purpose: * Gets the Inventory Data Repository(IDR) area header information * for a specific area * * Detailed Description: * - This function gets the inventory data area header information * of a particular area associated with IDR of resource_id * * Return values: * SA_OK - Normal case. * SA_ERR_HPI_CAPABILITY - Resource doesn't have SAHPI_CAPABILITY_INVENTORY * SA_ERR_HPI_INVALID_PARAMS - On wrong parameters * SA_ERR_HPI_INVALID_RESOURCE - Invalid resource id specified * SA_ERR_HPI_NOT_PRESENT - Requested object not present **/ SaErrorT oa_soap_get_idr_area_header(void *oh_handler, SaHpiResourceIdT resource_id, SaHpiIdrIdT idr, SaHpiIdrAreaTypeT area_type, SaHpiEntryIdT area_id, SaHpiEntryIdT *next_area_id, SaHpiIdrAreaHeaderT *header) { SaErrorT rv = SA_OK; struct oh_handler_state *handler; SaHpiRptEntryT *rpt = NULL; SaHpiRdrT *rdr = NULL; struct oa_soap_inventory *inventory = NULL; char *type; if (oh_handler == NULL || next_area_id == NULL || header == NULL) { err("Invalid parameter."); return SA_ERR_HPI_INVALID_PARAMS; } /* Check whether area_type supplied is in list of * valid area types specified by the framework */ type = oh_lookup_idrareatype(area_type); if (type == NULL) { err("Invalid area type."); return SA_ERR_HPI_INVALID_PARAMS; } if (area_id == SAHPI_LAST_ENTRY) { err("Invalid area id."); return SA_ERR_HPI_INVALID_PARAMS; } handler = (struct oh_handler_state *)oh_handler; rpt = oh_get_resource_by_id(handler->rptcache, resource_id); if (!rpt) { err("INVALID RESOURCE"); return SA_ERR_HPI_INVALID_RESOURCE; } if (! (rpt->ResourceCapabilities & SAHPI_CAPABILITY_INVENTORY_DATA)) { err("INVALID RESOURCE CAPABILITY"); return SA_ERR_HPI_CAPABILITY; } rdr = oh_get_rdr_by_type(handler->rptcache, resource_id, SAHPI_INVENTORY_RDR, idr); if (rdr == NULL) { err("INVALID RDR NUMBER"); return SA_ERR_HPI_NOT_PRESENT; } inventory = (struct oa_soap_inventory *) oh_get_rdr_data(handler->rptcache, resource_id, rdr->RecordId); if (inventory == NULL) { err("No inventory data. idr=%s", rdr->IdString.Data); return SA_ERR_HPI_NOT_PRESENT; } /* Check whether the area list of the resource IDR is empty */ if (inventory->info.idr_info.NumAreas == 0) { err("IDR Area not present"); return SA_ERR_HPI_NOT_PRESENT; } /* Fetch the area header of IDR area of the specified area_id. * Next area shall contain reference to next area of * the same area type if existing, else it will be set to NULL */ rv = fetch_idr_area_header(&(inventory->info), area_id, area_type, header, next_area_id); if (rv != SA_OK) { err("IDR Area not present"); return SA_ERR_HPI_NOT_PRESENT; } return rv; } /** * oa_soap_add_idr_area * @oh_handler: Handler data pointer. * @resource_id: Resource ID. * @idr: IDR ID. * @area_type: Type of the inventory data area. * @area_id: Area id of the newly created area. * * Purpose: * Creates the Inventory Data Repository(IDR) area of requested type * * Detailed Description: * - Creates an IDR area of the specified area type and adds it to end of * area list of the resource IDR * * Return values: * SA_OK - Normal case * SA_ERR_HPI_CAPABILITY - Resource doesn't have SAHPI_CAPABILITY_INVENTORY * SA_ERR_HPI_INVALID_PARAMS - On wrong parameters * SA_ERR_HPI_INVALID_DATA - On Invalid area type * SA_ERR_HPI_INVALID_RESOURCE - Invalid resource id specified * SA_ERR_HPI_NOT_PRESENT - Requested object not present * SA_ERR_HPI_READ_ONLY - The data to be operated upon is read only * SA_ERR_HPI_OUT_OF_SPACE - Request failed due to insufficient memory **/ SaErrorT oa_soap_add_idr_area(void *oh_handler, SaHpiResourceIdT resource_id, SaHpiIdrIdT idr, SaHpiIdrAreaTypeT area_type, SaHpiEntryIdT *area_id) { SaErrorT rv = SA_OK; struct oh_handler_state *handler; SaHpiRptEntryT *rpt = NULL; SaHpiRdrT *rdr = NULL; struct oa_soap_area *local_area = NULL; struct oa_soap_inventory *inventory = NULL; char *type; if (oh_handler == NULL || area_id == NULL) { err("Invalid parameter."); return SA_ERR_HPI_INVALID_PARAMS; } /* Check whether area_type supplied is in list of * valid area types specified by the framework */ type = oh_lookup_idrareatype(area_type); if (type == NULL) { err("Invalid area_type."); return SA_ERR_HPI_INVALID_PARAMS; } /* It is not valid to create the area of UNSPECIFIED type */ if (area_type == SAHPI_IDR_AREATYPE_UNSPECIFIED) { err("Invalid area_type."); return SA_ERR_HPI_INVALID_DATA; } handler = (struct oh_handler_state *)oh_handler; rpt = oh_get_resource_by_id(handler->rptcache, resource_id); if (!rpt) { err("INVALID RESOURCE"); return SA_ERR_HPI_INVALID_RESOURCE; } if (! (rpt->ResourceCapabilities & SAHPI_CAPABILITY_INVENTORY_DATA)) { err("INVALID RESOURCE CAPABILITY"); return SA_ERR_HPI_CAPABILITY; } rdr = oh_get_rdr_by_type(handler->rptcache, resource_id, SAHPI_INVENTORY_RDR, idr); if (rdr == NULL) { err("INVALID RDR NUMBER"); return SA_ERR_HPI_NOT_PRESENT; } inventory = (struct oa_soap_inventory *) oh_get_rdr_data(handler->rptcache, resource_id, rdr->RecordId); if (inventory == NULL) { err("No inventory data. idr=%s", rdr->IdString.Data); return SA_ERR_HPI_NOT_PRESENT; } /* Check whether the resource IDR is read only */ if (inventory->info.idr_info.ReadOnly == SAHPI_TRUE) { err("IDR is read only"); return SA_ERR_HPI_READ_ONLY; } /* Create and add the new area to the end of resource IDR area list */ rv = idr_area_add(&(inventory->info.area_list), area_type, &local_area); if (rv != SA_OK) { err("Addition of IDR area failed"); if (rv == SA_ERR_HPI_OUT_OF_MEMORY) { return SA_ERR_HPI_OUT_OF_SPACE; } return rv; } /* Increment area count in resource IDR */ inventory->info.idr_info.NumAreas++; /* Increment modification count of resource IDR */ inventory->info.idr_info.UpdateCount++; *area_id = local_area->idr_area_head.AreaId; return SA_OK; } /** * oa_soap_add_idr_area_by_id: * @oh_handler: Handler data pointer. * @resource_id: Resource ID. * @idr: IDR ID. * @area_type: Type of the inventory data area. * @area_id: Area id of the newly created area. * * Purpose: * Creates the Inventory Data Repository(IDR) area of requested type * * Detailed Description: * - Creates an IDR area of the specified area type and area id and adds * to area list of the resource IDR * * Return values: * SA_OK - Normal case * SA_ERR_HPI_CAPABILITY - Resource don't have SAHPI_CAPABILITY_INVENTORY * SA_ERR_HPI_INVALID_PARAMS - On wrong parameters * SA_ERR_HPI_INVALID_RESOURCE - Invalid resource id specified * SA_ERR_HPI_NOT_PRESENT - Requested object not present * SA_ERR_HPI_READ_ONLY - The data to be operated upon is read only * SA_ERR_HPI_DUPLICATE - Area ID already exists * SA_ERR_HPI_OUT_OF_SPACE - Request failed due to insufficient memory **/ SaErrorT oa_soap_add_idr_area_by_id (void *oh_handler, SaHpiResourceIdT resource_id, SaHpiIdrIdT idr, SaHpiIdrAreaTypeT area_type, SaHpiEntryIdT area_id) { SaErrorT rv = SA_OK; struct oh_handler_state *handler; SaHpiRptEntryT *rpt = NULL; SaHpiRdrT *rdr = NULL; struct oa_soap_inventory *inventory = NULL; SaHpiEntryIdT *next_area = NULL; SaHpiIdrAreaHeaderT *area_header = NULL; char *type; if (oh_handler == NULL || area_id == SAHPI_LAST_ENTRY) { err("Invalid parameter."); return SA_ERR_HPI_INVALID_PARAMS; } /* Check whether supplied area_type is in list of * valid area types specified by the framework */ type = oh_lookup_idrareatype(area_type); if (type == NULL) { err("Invalid area_type."); return SA_ERR_HPI_INVALID_PARAMS; } /* It is not valid to create the area of UNSPECIFIED type */ if (area_type == SAHPI_IDR_AREATYPE_UNSPECIFIED) { err("Invalid area_type."); return SA_ERR_HPI_INVALID_DATA; } handler = (struct oh_handler_state *)oh_handler; rpt = oh_get_resource_by_id(handler->rptcache, resource_id); if (!rpt) { err("INVALID RESOURCE"); return SA_ERR_HPI_INVALID_RESOURCE; } if (!(rpt->ResourceCapabilities & SAHPI_CAPABILITY_INVENTORY_DATA)) { err("INVALID RESOURCE CAPABILITY"); return SA_ERR_HPI_CAPABILITY; } rdr = oh_get_rdr_by_type(handler->rptcache, resource_id, SAHPI_INVENTORY_RDR, idr); if (rdr == NULL) { err("INVALID RDR NUMBER"); return SA_ERR_HPI_NOT_PRESENT; } inventory = (struct oa_soap_inventory *) oh_get_rdr_data(handler->rptcache, resource_id, rdr->RecordId); if (inventory == NULL) { err("No inventory data. idr=%s", rdr->IdString.Data); return SA_ERR_HPI_NOT_PRESENT; } /* Check whether the resource IDR is read only */ if (inventory->info.idr_info.ReadOnly == SAHPI_TRUE) { err("IDR is read only"); return SA_ERR_HPI_READ_ONLY; } /* Check if the Area ID already exists */ rv = fetch_idr_area_header(&(inventory->info), area_id,area_type, area_header, next_area); if (rv == SA_OK) { err("AreaId already exists in the IDR"); return SA_ERR_HPI_DUPLICATE; } /* Create and add the new area to the resource IDR area list */ rv = idr_area_add_by_id(&(inventory->info.area_list), area_type, area_id); if (rv != SA_OK) { err("Addition of IDR area failed"); if (rv == SA_ERR_HPI_OUT_OF_MEMORY) { return SA_ERR_HPI_OUT_OF_SPACE; } return rv; } /* Increment area count in resource IDR */ inventory->info.idr_info.NumAreas++; /* Increment modification count of resource IDR */ inventory->info.idr_info.UpdateCount++; return SA_OK; } /** * oa_soap_del_idr_area * @oh_handler: Handler data pointer * @resource_id: Resource ID * @idr: IDR ID * @area_id: Area id of the newly created area * * Purpose: * Deletes the Inventory Data Repository(IDR) area with specific identifier * * Detailed Description: * - Check whether the IDR area of specified area id exists * - If specified IDR area does not exist, then it is deleted from * the area list else an appropriate error is returned * * Return values: * SA_OK - Normal case * SA_ERR_HPI_CAPABILITY - Resource doesn't have SAHPI_CAPABILITY_INVENTORY * SA_ERR_HPI_INVALID_PARAMS - On wrong parameters * SA_ERR_HPI_INVALID_RESOURCE - Invalid resource id specified * SA_ERR_HPI_NOT_PRESENT - Requested object not present * SA_ERR_HPI_READ_ONLY - The data to be operated upon is read only **/ SaErrorT oa_soap_del_idr_area(void *oh_handler, SaHpiResourceIdT resource_id, SaHpiIdrIdT idr, SaHpiEntryIdT area_id) { SaErrorT rv = SA_OK; struct oh_handler_state *handler; SaHpiRptEntryT *rpt = NULL; SaHpiRdrT *rdr = NULL; struct oa_soap_inventory *inventory = NULL; if (oh_handler == NULL) { err("Invalid parameter."); return SA_ERR_HPI_INVALID_PARAMS; } handler = (struct oh_handler_state *)oh_handler; if (area_id == SAHPI_LAST_ENTRY) { err("Invalid area id."); return SA_ERR_HPI_INVALID_PARAMS; } rpt = oh_get_resource_by_id(handler->rptcache, resource_id); if (!rpt) { err("INVALID RESOURCE"); return SA_ERR_HPI_INVALID_RESOURCE; } if (! (rpt->ResourceCapabilities & SAHPI_CAPABILITY_INVENTORY_DATA)) { err("INVALID RESOURCE CAPABILITY"); return SA_ERR_HPI_CAPABILITY; } rdr = oh_get_rdr_by_type(handler->rptcache, resource_id, SAHPI_INVENTORY_RDR, idr); if (rdr == NULL) { err("INVALID RDR NUMBER"); return SA_ERR_HPI_NOT_PRESENT; } inventory = (struct oa_soap_inventory *) oh_get_rdr_data(handler->rptcache, resource_id, rdr->RecordId); if (inventory == NULL) { err("No inventory data. IdrId=%s", rdr->IdString.Data); return SA_ERR_HPI_NOT_PRESENT; } /* Check whether the resource IDR is read only */ if (inventory->info.idr_info.ReadOnly == SAHPI_TRUE) { err("IDR is read only"); return SA_ERR_HPI_READ_ONLY; } /* Delete the specified area if it exists, else return an error */ rv = idr_area_delete(&(inventory->info.area_list), area_id); if (rv != SA_OK) { err("IDR Area not found"); return rv; } /* Decrement area count in resource IDR */ inventory->info.idr_info.NumAreas--; /* Increment modification count of resource IDR */ inventory->info.idr_info.UpdateCount++; return SA_OK; } /** * oa_soap_get_idr_field * @oh_handler: Handler data pointer * @resource_id: Resource ID * @idr: IDR ID * @area_id: Area id * @field_type: Type of the IDR field * @field_id: Identifier of the field to be retrieved * @next_field_id: Identifier of the next field of the requested type * @field: Structure to retrieve the field contents * * Purpose: * Gets Inventory Data Repository(IDR) field from a particular IDR area * * Detailed Description: * - Check whether the IDR field of the specified field id exists * - If specified IDR field exists, then field structure is returned * * Return values: * SA_OK - Normal case * SA_ERR_HPI_CAPABILITY - Resource doesn't have SAHPI_CAPABILITY_INVENTORY * SA_ERR_HPI_INVALID_PARAMS - On wrong parameters * SA_ERR_HPI_INVALID_RESOURCE - Invalid resource id specified * SA_ERR_HPI_NOT_PRESENT - Requested object not present * SA_ERR_HPI_READ_ONLY - The data to be operated upon is read only **/ SaErrorT oa_soap_get_idr_field(void *oh_handler, SaHpiResourceIdT resource_id, SaHpiIdrIdT idr, SaHpiEntryIdT area_id, SaHpiIdrFieldTypeT field_type, SaHpiEntryIdT field_id, SaHpiEntryIdT *next_field_id, SaHpiIdrFieldT *field) { SaErrorT rv = SA_OK; struct oh_handler_state *handler; SaHpiRptEntryT *rpt = NULL; SaHpiRdrT *rdr = NULL; struct oa_soap_inventory *inventory = NULL; char *type; if (oh_handler == NULL || next_field_id == NULL || field == NULL) { err("Invalid parameter."); return SA_ERR_HPI_INVALID_PARAMS; } if ((area_id == SAHPI_LAST_ENTRY) || (field_id == SAHPI_LAST_ENTRY)) { return SA_ERR_HPI_INVALID_PARAMS; } /* Check whether field_type supplied is in list of * valid field types specified by the framework */ type = oh_lookup_idrfieldtype(field_type); if (type == NULL) { err("Invalid field type."); return SA_ERR_HPI_INVALID_PARAMS; } handler = (struct oh_handler_state *)oh_handler; rpt = oh_get_resource_by_id(handler->rptcache, resource_id); if (!rpt) { err("INVALID RESOURCE"); return SA_ERR_HPI_INVALID_RESOURCE; } if (! (rpt->ResourceCapabilities & SAHPI_CAPABILITY_INVENTORY_DATA)) { err("INVALID RESOURCE CAPABILITY"); return SA_ERR_HPI_CAPABILITY; } rdr = oh_get_rdr_by_type(handler->rptcache, resource_id, SAHPI_INVENTORY_RDR, idr); if (rdr == NULL) { err("INVALID RDR NUMBER"); return SA_ERR_HPI_NOT_PRESENT; } inventory = (struct oa_soap_inventory *) oh_get_rdr_data(handler->rptcache, resource_id, rdr->RecordId); if (inventory == NULL) { err("No inventory data. idr=%s", rdr->IdString.Data); return SA_ERR_HPI_NOT_PRESENT; } /* Check whether the area list of the resource IDR is empty */ if (inventory->info.idr_info.NumAreas == 0) { err("IDR Area not present"); return SA_ERR_HPI_NOT_PRESENT; } /* Fetch the IDR field of the specified field_id. * next_field shall contain reference to next field of * the same field type if is exists, else it will be set to NULL */ rv = fetch_idr_field(&(inventory->info), area_id, field_type, field_id, next_field_id, field); if (rv != SA_OK) { err("IDR Field not present"); return rv; } return SA_OK; } /** * oa_soap_add_idr_field * @oh_handler: Handler data pointer * @resource_id: Resource ID * @idr: IDR ID * @field: structure containing the new field information * * Purpose: * Add a field to a specified Inventory Data Repository(IDR) Area * * Detailed Description: * - Creates an IDR field of the specified field type and adds to end of * field list of the specified IDR area id in resource IDR * * Return values: * SA_OK - Normal case * SA_ERR_HPI_CAPABILITY - Resource doesn't have SAHPI_CAPABILITY_INVENTORY * SA_ERR_HPI_INVALID_PARAMS - On wrong parameters * SA_ERR_HPI_INVALID_DATA - On Invalid field type * SA_ERR_HPI_INVALID_RESOURCE - Invalid resource id specified * SA_ERR_HPI_NOT_PRESENT - Requested object not present * SA_ERR_HPI_READ_ONLY - The data to be operated upon is read only * SA_ERR_HPI_OUT_OF_SPACE - Request failed due to insufficient memory **/ SaErrorT oa_soap_add_idr_field(void *oh_handler, SaHpiResourceIdT resource_id, SaHpiIdrIdT idr, SaHpiIdrFieldT *field) { SaErrorT rv = SA_OK; struct oh_handler_state *handler; SaHpiRptEntryT *rpt = NULL; SaHpiRdrT *rdr = NULL; struct oa_soap_inventory *inventory = NULL; struct oa_soap_area *local_area = NULL; char *type; if (oh_handler == NULL || field == NULL) { err("Invalid parameter."); return SA_ERR_HPI_INVALID_PARAMS; } type = oh_lookup_idrfieldtype(field->Type); if (type == NULL) { err("Invalid field type."); return SA_ERR_HPI_INVALID_PARAMS; } /* It is not valid to create the field of UNSPECIFIED type */ if (field->Type == SAHPI_IDR_FIELDTYPE_UNSPECIFIED) { err("Invalid field type."); return SA_ERR_HPI_INVALID_DATA; } handler = (struct oh_handler_state *)oh_handler; rpt = oh_get_resource_by_id(handler->rptcache, resource_id); if (!rpt) { err("INVALID RESOURCE"); return SA_ERR_HPI_INVALID_RESOURCE; } if (! (rpt->ResourceCapabilities & SAHPI_CAPABILITY_INVENTORY_DATA)) { err("INVALID RESOURCE CAPABILITY"); return SA_ERR_HPI_CAPABILITY; } rdr = oh_get_rdr_by_type(handler->rptcache, resource_id, SAHPI_INVENTORY_RDR, idr); if (rdr == NULL) { err("INVALID RDR NUMBER"); return SA_ERR_HPI_NOT_PRESENT; } inventory = (struct oa_soap_inventory *) oh_get_rdr_data(handler->rptcache, resource_id, rdr->RecordId); if (inventory == NULL) { err("No inventory data. idr=%s", rdr->IdString.Data); return SA_ERR_HPI_NOT_PRESENT; } if (inventory->info.idr_info.NumAreas == 0) { err("No areas in the specified IDR"); return SA_ERR_HPI_NOT_PRESENT; } /* Start traversing the area list of resource IDR from the * head node */ local_area = inventory->info.area_list; while (local_area != NULL) { if ((field->AreaId == local_area->idr_area_head.AreaId)) { break; } local_area = local_area->next_area; } /* If the area id specified in field structure does exist, then * local_area will point to that area, else it is NULL */ if (!local_area) { return SA_ERR_HPI_NOT_PRESENT; } /* Check whether the specified IDR area is read only */ if (local_area->idr_area_head.ReadOnly == SAHPI_TRUE) { err("IDR Area is read only"); return SA_ERR_HPI_READ_ONLY; } /* Create and add the new field to end of filed list in IDR area */ rv = idr_field_add(&(local_area->field_list), field); if (rv != SA_OK) { err("IDR field add failed"); if (rv == SA_ERR_HPI_OUT_OF_MEMORY) { return SA_ERR_HPI_OUT_OF_SPACE; } return rv; } /* Increment the field count in IDR area */ local_area->idr_area_head.NumFields++; /* Increment the update cound of resource IDR */ inventory->info.idr_info.UpdateCount++; return SA_OK; } /** * oa_soap_add_idr_field_by_id: * @oh_handler: Handler data pointer * @resource_id: Resource ID * @idr: IDR ID * @field: structure containing the new field information * * Purpose: * Add a field to a specified Inventory Data Repository(IDR) * Area with the specified field id * * Detailed Description: * - Creates an IDR field of the specified field type and adds to * field list of the specified IDR area id in resource IDR * * Return values: * SA_OK - Normal case * SA_ERR_HPI_CAPABILITY - Resource doesn't have SAHPI_CAPABILITY_INVENTORY * SA_ERR_HPI_INVALID_PARAMS - On wrong parameters * SA_ERR_HPI_INVALID_RESOURCE - Invalid resource id specified * SA_ERR_HPI_NOT_PRESENT - Requested object not present * SA_ERR_HPI_READ_ONLY - The data to be operated upon is read only * SA_ERR_HPI_OUT_OF_SPACE - Request failed due to insufficient memory **/ SaErrorT oa_soap_add_idr_field_by_id(void *oh_handler, SaHpiResourceIdT resource_id, SaHpiIdrIdT idr_id, SaHpiIdrFieldT *field) { SaErrorT rv = SA_OK; struct oh_handler_state *handler; SaHpiRptEntryT *rpt = NULL; SaHpiRdrT *rdr = NULL; struct oa_soap_inventory *inventory = NULL; struct oa_soap_area *local_area = NULL; char *type; if (oh_handler == NULL || field == NULL || field->AreaId == SAHPI_LAST_ENTRY || field->FieldId == SAHPI_LAST_ENTRY) { err("Invalid parameter."); return SA_ERR_HPI_INVALID_PARAMS; } type = oh_lookup_idrfieldtype(field->Type); if (type == NULL) { err("Invalid field type."); return SA_ERR_HPI_INVALID_PARAMS; } /* It is not valid to create the field of UNSPECIFIED type */ if (field->Type == SAHPI_IDR_FIELDTYPE_UNSPECIFIED) { err("Invalid field type."); return SA_ERR_HPI_INVALID_PARAMS; } handler = (struct oh_handler_state *)oh_handler; rpt = oh_get_resource_by_id(handler->rptcache, resource_id); if (!rpt) { err("INVALID RESOURCE"); return SA_ERR_HPI_INVALID_RESOURCE; } if (!(rpt->ResourceCapabilities & SAHPI_CAPABILITY_INVENTORY_DATA)) { err("INVALID RESOURCE CAPABILITY"); return SA_ERR_HPI_CAPABILITY; } rdr = oh_get_rdr_by_type(handler->rptcache, resource_id, SAHPI_INVENTORY_RDR, idr_id); if (rdr == NULL) { err("INVALID RDR NUMBER"); return SA_ERR_HPI_NOT_PRESENT; } inventory = (struct oa_soap_inventory *) oh_get_rdr_data(handler->rptcache, resource_id, rdr->RecordId); if (inventory == NULL) { err("No inventory data. idr=%s", rdr->IdString.Data); return SA_ERR_HPI_NOT_PRESENT; } if (inventory->info.idr_info.NumAreas == 0) { err("No areas in the specified IDR"); return SA_ERR_HPI_NOT_PRESENT; } /* Start traversing the area list of resource IDR from the * head node of the area linked list */ local_area = inventory->info.area_list; while (local_area != NULL) { if ((field->AreaId == local_area->idr_area_head.AreaId)) { break; } local_area = local_area->next_area; } /* If the area id specified in field structure is existing, then * local_area will point to that area, else it is NULL */ if (!local_area) { return SA_ERR_HPI_NOT_PRESENT; } /* Check whether the specified IDR area is read only */ if (local_area->idr_area_head.ReadOnly == SAHPI_TRUE) { err("IDR Area is read only"); } /* Create and add the new field to field list in IDR area */ rv = idr_field_add_by_id(&(local_area->field_list), field->AreaId, field->Type, (char *)field->Field.Data, field->FieldId); if (rv != SA_OK) { err("IDR field add failed"); if (rv == SA_ERR_HPI_OUT_OF_MEMORY) { return SA_ERR_HPI_OUT_OF_SPACE; } return rv; } /* Increment the field count in IDR area */ local_area->idr_area_head.NumFields++; /* Increment the update cound of resource IDR */ inventory->info.idr_info.UpdateCount++; return SA_OK; } /** * oa_soap_set_idr_field * @oh_handler: Handler data pointer * @resource_id: Resource ID * @idr: IDR ID * @field: Structure containing the modification field information * * Purpose: * Updates the specified Inventory Data Repository(IDR) field * * Detailed Description: * - Updates the field contents of the IDR field of specified * field id from field list of the specified IDR area id in * resource IDR * - If the specified field does not exist, then an appropriate error is * returned * * Return values: * SA_OK - Normal case * SA_ERR_HPI_CAPABILITY - Resource doesn't have SAHPI_CAPABILITY_INVENTORY * SA_ERR_HPI_INVALID_PARAMS - On wrong parameters * SA_ERR_HPI_INVALID_RESOURCE - Invalid resource id specified * SA_ERR_HPI_NOT_PRESENT - Requested object not present * SA_ERR_HPI_READ_ONLY - The data to be operated upon is read only **/ SaErrorT oa_soap_set_idr_field(void *oh_handler, SaHpiResourceIdT resource_id, SaHpiIdrIdT idr, SaHpiIdrFieldT *field) { SaErrorT rv = SA_OK; struct oh_handler_state *handler; SaHpiRptEntryT *rpt = NULL; SaHpiRdrT *rdr = NULL; struct oa_soap_inventory *inventory = NULL; struct oa_soap_area *local_area = NULL; char *type; if (oh_handler == NULL || field == NULL) { err("Invalid parameter."); return SA_ERR_HPI_INVALID_PARAMS; } /* Check whether the specified field type is in valid list * of field types */ type = oh_lookup_idrfieldtype(field->Type); if (type == NULL) { err("Invalid field type."); return SA_ERR_HPI_INVALID_PARAMS; } /* It is invalid to specify the field type as * SAHPI_IDR_FIELDTYPE_UNSPECIFIED */ if (field->Type == SAHPI_IDR_FIELDTYPE_UNSPECIFIED) { err("Invalid field type."); return SA_ERR_HPI_INVALID_PARAMS; } handler = (struct oh_handler_state *)oh_handler; rpt = oh_get_resource_by_id(handler->rptcache, resource_id); if (!rpt) { err("INVALID RESOURCE"); return SA_ERR_HPI_INVALID_RESOURCE; } if (! (rpt->ResourceCapabilities & SAHPI_CAPABILITY_INVENTORY_DATA)) { err("INVALID RESOURCE CAPABILITY"); return SA_ERR_HPI_CAPABILITY; } rdr = oh_get_rdr_by_type(handler->rptcache, resource_id, SAHPI_INVENTORY_RDR, idr); if (rdr == NULL) { err("INVALID RDR NUMBER"); return SA_ERR_HPI_NOT_PRESENT; } inventory = (struct oa_soap_inventory *) oh_get_rdr_data(handler->rptcache, resource_id, rdr->RecordId); if (inventory == NULL) { err("No inventory data. idr=%s", rdr->IdString.Data); return SA_ERR_HPI_NOT_PRESENT; } if (inventory->info.idr_info.NumAreas == 0) { err("No areas in the specified IDR"); return SA_ERR_HPI_NOT_PRESENT; } /* Start traversing the area list of resource IDR from the * head node of the area linked list */ local_area = inventory->info.area_list; while (local_area != NULL) { if ((field->AreaId == local_area->idr_area_head.AreaId)) { break; } local_area = local_area->next_area; } /* If the area id specified in field structure exists, then * local_area will point to that area, else it is NULL */ if (!local_area) { err("IDR area not present"); return SA_ERR_HPI_NOT_PRESENT; } /* Update the specified field with latest data */ rv = idr_field_update(local_area->field_list, field); if (rv != SA_OK) { err("IDR field update failed"); return rv; } inventory->info.idr_info.UpdateCount++; return SA_OK; } /** * oa_soap_del_idr_field * @oh_handler: Handler data pointer * @resource_id: Resource ID * @idr: IDR ID * @area_id: Area id * @field_id: Identifier of the field to be deleted * * Purpose: * Deletes the Inventory Data Repository(IDR) field with * specific identifier from IDR area * * Detailed Description: * - Deletes an IDR field of the specified field id from field list * of the specified IDR area id in resource IDR * - If the specified field does not exist, then an appropriate error is * returned * * Return values: * SA_OK - Normal case * SA_ERR_HPI_CAPABILITY - Resource doesn't have SAHPI_CAPABILITY_INVENTORY * SA_ERR_HPI_INVALID_PARAMS - On wrong parameters * SA_ERR_HPI_INVALID_RESOURCE - Invalid resource id specified * SA_ERR_HPI_NOT_PRESENT - Requested object not present * SA_ERR_HPI_READ_ONLY - The data to be operated upon is read only **/ SaErrorT oa_soap_del_idr_field(void *oh_handler, SaHpiResourceIdT resource_id, SaHpiIdrIdT idr, SaHpiEntryIdT area_id, SaHpiEntryIdT field_id) { SaErrorT rv = SA_OK; struct oh_handler_state *handler; SaHpiRptEntryT *rpt = NULL; SaHpiRdrT *rdr = NULL; struct oa_soap_inventory *inventory = NULL; struct oa_soap_area *local_area = NULL; if (oh_handler == NULL) { err("Invalid parameter."); return SA_ERR_HPI_INVALID_PARAMS; } if ((area_id == SAHPI_LAST_ENTRY) || (field_id == SAHPI_LAST_ENTRY)) { return SA_ERR_HPI_INVALID_PARAMS; } handler = (struct oh_handler_state *)oh_handler; rpt = oh_get_resource_by_id(handler->rptcache, resource_id); if (!rpt) { err("INVALID RESOURCE"); return SA_ERR_HPI_INVALID_RESOURCE; } if (! (rpt->ResourceCapabilities & SAHPI_CAPABILITY_INVENTORY_DATA)) { err("INVALID RESOURCE CAPABILITY"); return SA_ERR_HPI_CAPABILITY; } rdr = oh_get_rdr_by_type(handler->rptcache, resource_id, SAHPI_INVENTORY_RDR, idr); if (rdr == NULL) { err("INVALID RDR NUMBER"); return SA_ERR_HPI_NOT_PRESENT; } inventory = (struct oa_soap_inventory *) oh_get_rdr_data(handler->rptcache, resource_id, rdr->RecordId); if (inventory == NULL) { err("No inventory data. idr=%s", rdr->IdString.Data); return SA_ERR_HPI_NOT_PRESENT; } if (inventory->info.idr_info.NumAreas == 0) { err("No areas in the specified IDR"); return SA_ERR_HPI_NOT_PRESENT; } /* Start traversing the area list of resource IDR from the * head node of the area linked list */ local_area = inventory->info.area_list; while (local_area != NULL) { if ((area_id == local_area->idr_area_head.AreaId)) { break; } local_area = local_area->next_area; } if (!local_area) { err("IDR Area not present"); return SA_ERR_HPI_NOT_PRESENT; } /* Check whether the specified IDR area is read only */ if (local_area->idr_area_head.ReadOnly == SAHPI_TRUE) { err("IDR area is read only"); return SA_ERR_HPI_READ_ONLY; } /* Delete the specified field from the field list*/ rv = idr_field_delete(&(local_area->field_list), field_id); if (rv != SA_OK) { return rv; } /* Decrement the field count in IDR area */ local_area->idr_area_head.NumFields--; inventory->info.idr_info.UpdateCount++; return SA_OK; } /** * build_enclosure_inv_rdr * @oh_handler: Handler data pointer * @response: Pointer to get enclosure info response data structure * @rdr: Rdr Structure for inventory data * @inventory: Rdr private data structure * * Purpose: * Creates an inventory rdr for enclosure * * Detailed Description: * - Populates the enclosure inventory rdr with default values * - Inventory data repository is created and associated in the private * data area of the Inventory RDR * * Return values: * SA_OK - Normal case * SA_ERR_HPI_INVALID_PARAMS - On wrong parameters * SA_ERR_HPI_INTERNAL_ERROR - oa_soap plugin has encountered an internal * error * SA_ERR_HPI_OUT_OF_MEMORY - Request failed due to insufficient memory **/ SaErrorT build_enclosure_inv_rdr(struct oh_handler_state *oh_handler, struct enclosureInfo *response, SaHpiRdrT *rdr, struct oa_soap_inventory **inventory) { SaErrorT rv = SA_OK; SaHpiIdrFieldT hpi_field; char enclosure_inv_str[] = ENCLOSURE_INVENTORY_STRING; struct oa_soap_inventory *local_inventory = NULL; struct oa_soap_area *head_area = NULL; SaHpiInt32T add_success_flag = 0; SaHpiInt32T product_area_success_flag = 0; SaHpiInt32T area_count = 0; struct oa_soap_handler *oa_handler = NULL; SaHpiResourceIdT resource_id; SaHpiRptEntryT *rpt = NULL; if (oh_handler == NULL || response == NULL || rdr == NULL || inventory == NULL) { err("Invalid parameter."); return SA_ERR_HPI_INVALID_PARAMS; } oa_handler = (struct oa_soap_handler *) oh_handler->data; resource_id = oa_handler->oa_soap_resources.enclosure_rid; /* Get the rpt entry of the resource */ rpt = oh_get_resource_by_id(oh_handler->rptcache, resource_id); if (rpt == NULL) { err("resource RPT is NULL"); return SA_ERR_HPI_INTERNAL_ERROR; } /* Populating the inventory rdr with default values and resource name */ rdr->Entity = rpt->ResourceEntity; rdr->RecordId = 0; rdr->RdrType = SAHPI_INVENTORY_RDR; rdr->RdrTypeUnion.InventoryRec.IdrId = SAHPI_DEFAULT_INVENTORY_ID; rdr->IdString.DataType = SAHPI_TL_TYPE_TEXT; rdr->IdString.Language = SAHPI_LANG_ENGLISH; rdr->IdString.DataLength = strlen(response->name) + 1; snprintf((char *)rdr->IdString.Data, strlen(response->name) + 1, "%s", response->name); /* Create inventory IDR and populate the IDR header */ local_inventory = (struct oa_soap_inventory*) g_malloc0(sizeof(struct oa_soap_inventory)); if (!local_inventory) { err("OA SOAP out of memory"); return SA_ERR_HPI_OUT_OF_MEMORY; } local_inventory->inv_rec.IdrId = rdr->RdrTypeUnion.InventoryRec.IdrId; local_inventory->info.idr_info.IdrId = rdr->RdrTypeUnion.InventoryRec.IdrId; local_inventory->info.idr_info.UpdateCount = 1; local_inventory->info.idr_info.ReadOnly = SAHPI_FALSE; local_inventory->info.idr_info.NumAreas = 0; local_inventory->info.area_list = NULL; local_inventory->comment = (char *)g_malloc0(strlen(enclosure_inv_str) + 1); snprintf(local_inventory->comment, strlen(enclosure_inv_str) + 1, "%s", enclosure_inv_str); /* Create and add product area if resource name and/or manufacturer * information exist */ rv = add_product_area(&local_inventory->info.area_list, response->name, response->manufacturer, &add_success_flag); if (rv != SA_OK) { err("Add product area failed"); return rv; } /* add_success_flag will be true if product area is added, * if this is the first successful creation of IDR area, then have * area pointer stored as the head node for area list */ if (add_success_flag != SAHPI_FALSE) { product_area_success_flag = SAHPI_TRUE; (local_inventory->info.idr_info.NumAreas)++; if (area_count == 0) { head_area = local_inventory->info.area_list; } ++area_count; } /* Create and add chassis area if resource part number and/or * serial number exist */ rv = add_chassis_area(&local_inventory->info.area_list, response->partNumber, response->serialNumber, &add_success_flag); if (rv != SA_OK) { err("Add chassis area failed"); return rv; } if (add_success_flag != SAHPI_FALSE) { (local_inventory->info.idr_info.NumAreas)++; if (area_count == 0) { head_area = local_inventory->info.area_list; } ++area_count; } /* Create and add internal area if all/atleast one of required * information of resource for internal is available */ rv = add_internal_area(&local_inventory->info.area_list, response->interposerManufacturer, response->interposerName, response->interposerPartNumber, response->interposerSerialNumber, &add_success_flag); if (rv != SA_OK) { err("Add internal area failed"); return rv; } if (add_success_flag != SAHPI_FALSE) { (local_inventory->info.idr_info.NumAreas)++; if (area_count == 0) { head_area = local_inventory->info.area_list; } ++area_count; } local_inventory->info.area_list = head_area; *inventory = local_inventory; /* Adding the product version in IDR product area. It is added at * the end of the field list. */ if (product_area_success_flag == SAHPI_TRUE) { /* Add the product version field if the enclosure hardware info * is available */ if (response->hwVersion != NULL) { memset(&hpi_field, 0, sizeof(SaHpiIdrFieldT)); hpi_field.AreaId = local_inventory->info.area_list-> idr_area_head.AreaId; hpi_field.Type = SAHPI_IDR_FIELDTYPE_PRODUCT_VERSION; strcpy ((char *)hpi_field.Field.Data, response->hwVersion); rv = idr_field_add(&(local_inventory->info.area_list ->field_list), &hpi_field); if (rv != SA_OK) { err("Add idr field failed"); return rv; } /* Increment the field counter */ local_inventory->info.area_list->idr_area_head. NumFields++; } } return SA_OK; } /** * build_oa_inv_rdr * @oh_handler: Handler data pointer * @response: Handler data pointer * @rdr: Rdr Structure for inventory data * @inventory: Rdr private data structure * * Purpose: * Creates an inventory rdr for Onboard Administator * * Detailed Description: * - Populates the OA inventory rdr with default values * - Inventory data repository is created and associated in the private * data area of the Inventory RDR * * Return values: * SA_OK - Normal case * SA_ERR_HPI_INVALID_PARAMS - On wrong parameters * SA_ERR_HPI_INTERNAL_ERROR - oa_soap plugin has encountered an internal * error * SA_ERR_HPI_OUT_OF_MEMORY - Request failed due to insufficient memory **/ SaErrorT build_oa_inv_rdr(struct oh_handler_state *oh_handler, struct oaInfo *response, SaHpiRdrT *rdr, struct oa_soap_inventory **inventory) { SaErrorT rv = SA_OK; SaHpiIdrFieldT hpi_field; char oa_inv_str[] = OA_INVENTORY_STRING; struct oa_soap_inventory *local_inventory = NULL; struct oa_soap_area *head_area = NULL; SaHpiInt32T add_success_flag = 0; SaHpiInt32T product_area_success_flag = 0; SaHpiInt32T area_count = 0; struct oa_soap_handler *oa_handler = NULL; SaHpiResourceIdT resource_id; SaHpiRptEntryT *rpt = NULL; if (oh_handler == NULL || response == NULL || rdr == NULL || inventory == NULL) { err("Invalid parameter."); return SA_ERR_HPI_INVALID_PARAMS; } oa_handler = (struct oa_soap_handler *) oh_handler->data; resource_id = oa_handler-> oa_soap_resources.oa.resource_id[response->bayNumber - 1]; /* Get the rpt entry of the resource */ rpt = oh_get_resource_by_id(oh_handler->rptcache, resource_id); if (rpt == NULL) { err("resource RPT is NULL"); return SA_ERR_HPI_INTERNAL_ERROR; } /* Populating the inventory rdr with default values and resource name */ rdr->Entity = rpt->ResourceEntity; rdr->RecordId = 0; rdr->RdrType = SAHPI_INVENTORY_RDR; rdr->RdrTypeUnion.InventoryRec.IdrId = SAHPI_DEFAULT_INVENTORY_ID; rdr->IdString.DataType = SAHPI_TL_TYPE_TEXT; rdr->IdString.Language = SAHPI_LANG_ENGLISH; rdr->IdString.DataLength = strlen(response->name) + 1; snprintf((char *)rdr->IdString.Data, strlen(response->name)+ 1,"%s", response->name ); /* Create inventory IDR and populate the IDR header */ local_inventory = (struct oa_soap_inventory*) g_malloc0(sizeof(struct oa_soap_inventory)); if (!local_inventory) { err("OA SOAP out of memory"); return SA_ERR_HPI_OUT_OF_MEMORY; } local_inventory->inv_rec.IdrId = rdr->RdrTypeUnion.InventoryRec.IdrId; local_inventory->info.idr_info.IdrId = rdr->RdrTypeUnion.InventoryRec.IdrId; local_inventory->info.idr_info.UpdateCount = 1; local_inventory->info.idr_info.ReadOnly = SAHPI_FALSE; local_inventory->info.idr_info.NumAreas = 0; local_inventory->info.area_list = NULL; local_inventory->comment = (char *)g_malloc0(strlen(oa_inv_str) + 1); snprintf(local_inventory->comment, strlen(oa_inv_str) + 1, "%s", oa_inv_str); /* Create and add product area if resource name and/or manufacturer * information exist */ rv = add_product_area(&local_inventory->info.area_list, response->name, response->manufacturer, &add_success_flag); if (rv != SA_OK) { err("Add product area failed"); return rv; } /* add_success_flag will be true if product area is added, * if this is the first successful creation of IDR area, then have * area pointer stored as the head node for area list */ if (add_success_flag != SAHPI_FALSE) { product_area_success_flag = SAHPI_TRUE; (local_inventory->info.idr_info.NumAreas)++; if (area_count == 0) { head_area = local_inventory->info.area_list; } ++area_count; } /* Create and add board area if resource part number and/or * serial number exist */ rv = add_board_area(&local_inventory->info.area_list, response->partNumber, response->serialNumber, &add_success_flag); if (rv != SA_OK) { err("Add board area failed"); return rv; } if (add_success_flag != SAHPI_FALSE) { (local_inventory->info.idr_info.NumAreas)++; if (area_count == 0) { head_area = local_inventory->info.area_list; } ++area_count; } local_inventory->info.area_list = head_area; *inventory = local_inventory; /* Adding the product version in IDR product area. It is added at * the end of the field list. */ if (product_area_success_flag == SAHPI_TRUE) { /* Add the product version field if the firmware info * is available */ if (response->fwVersion != NULL) { memset(&hpi_field, 0, sizeof(SaHpiIdrFieldT)); hpi_field.AreaId = local_inventory->info.area_list-> idr_area_head.AreaId; hpi_field.Type = SAHPI_IDR_FIELDTYPE_PRODUCT_VERSION; strcpy ((char *)hpi_field.Field.Data, response->fwVersion); rv = idr_field_add(&(local_inventory->info.area_list ->field_list), &hpi_field); if (rv != SA_OK) { err("Add idr field failed"); return rv; } /* Increment the field counter */ local_inventory->info.area_list->idr_area_head. NumFields++; } } return SA_OK; } /** * build_server_inv_rdr * @oh_handler: Handler data pointer * @con: Pointer to the SOAP_CON * @bay_number: Bay number of the server * @rdr: Rdr Structure for inventory data * @inventory: Rdr private data structure * * Purpose: * Creates an inventory rdr for server blade * * Detailed Description: * - Populates the server inventory rdr with default values * - Inventory data repository is created and associated in the private * data area of the Inventory RDR * * Return values: * SA_OK - Normal case * SA_ERR_HPI_INVALID_PARAMS - On wrong parameters * SA_ERR_HPI_INTERNAL_ERROR - oa_soap plugin has encountered an internal * error * SA_ERR_HPI_OUT_OF_MEMORY - Request failed due to insufficient memory **/ SaErrorT build_server_inv_rdr(struct oh_handler_state *oh_handler, SOAP_CON *con, SaHpiInt32T bay_number, SaHpiRdrT *rdr, struct oa_soap_inventory **inventory) { SaErrorT rv = SA_OK; SaHpiIdrFieldT hpi_field; char server_inv_str[] = SERVER_INVENTORY_STRING; struct oa_soap_inventory *local_inventory = NULL; struct oa_soap_area *head_area = NULL; SaHpiInt32T add_success_flag = 0; SaHpiInt32T product_area_success_flag = 0; SaHpiInt32T area_count = 0; struct getBladeInfo request; struct bladeInfo response; struct getBladeMpInfo blade_mp_request; struct bladeMpInfo blade_mp_response; struct oa_soap_handler *oa_handler = NULL; SaHpiResourceIdT resource_id; SaHpiRptEntryT *rpt = NULL; if (oh_handler == NULL || con == NULL || rdr == NULL || inventory == NULL) { err("Invalid parameter."); return SA_ERR_HPI_INVALID_PARAMS; } oa_handler = (struct oa_soap_handler *) oh_handler->data; resource_id = oa_handler->oa_soap_resources.server.resource_id[bay_number - 1]; rpt = oh_get_resource_by_id(oh_handler->rptcache, resource_id); if (!rpt) { err("Could not find blade resource rpt"); return(SA_ERR_HPI_INTERNAL_ERROR); } rdr->Entity = rpt->ResourceEntity; request.bayNumber = bay_number; rv = soap_getBladeInfo(con, &request, &response); if (rv != SOAP_OK) { err("Get blade info failed"); return rv; } /* Populating the inventory rdr with rpt values for the resource */ rdr->RecordId = 0; rdr->RdrType = SAHPI_INVENTORY_RDR; rdr->RdrTypeUnion.InventoryRec.IdrId = SAHPI_DEFAULT_INVENTORY_ID; rdr->IdString.DataType = SAHPI_TL_TYPE_TEXT; rdr->IdString.Language = SAHPI_LANG_ENGLISH; rdr->IdString.DataLength = strlen(response.name) + 1; snprintf((char *)rdr->IdString.Data, strlen(response.name) + 1,"%s", response.name ); /* Create inventory IDR and populate the IDR header */ local_inventory = (struct oa_soap_inventory*) g_malloc0(sizeof(struct oa_soap_inventory)); if (!local_inventory) { err("OA SOAP out of memory"); return SA_ERR_HPI_OUT_OF_MEMORY; } local_inventory->inv_rec.IdrId = rdr->RdrTypeUnion.InventoryRec.IdrId; local_inventory->info.idr_info.IdrId = rdr->RdrTypeUnion.InventoryRec.IdrId; local_inventory->info.idr_info.UpdateCount = 1; local_inventory->info.idr_info.ReadOnly = SAHPI_FALSE; local_inventory->info.idr_info.NumAreas = 0; local_inventory->info.area_list = NULL; local_inventory->comment = (char *)g_malloc0(strlen(server_inv_str) + 1); snprintf(local_inventory->comment, strlen(server_inv_str) + 1, "%s", server_inv_str); /* Create and add product area if resource name and/or manufacturer * information exist */ rv = add_product_area(&local_inventory->info.area_list, response.name, response.manufacturer, &add_success_flag); if (rv != SA_OK) { err("Add product area failed"); return rv; } /* add_success_flag will be true if product area is added, * if this is the first successful creation of IDR area, then have * area pointer stored as the head node for area list */ if (add_success_flag != SAHPI_FALSE) { product_area_success_flag = SAHPI_TRUE; (local_inventory->info.idr_info.NumAreas)++; if (area_count == 0) { head_area = local_inventory->info.area_list; } ++area_count; } /* Create and add board area if resource part number and/or * serial number exist */ rv = add_board_area(&local_inventory->info.area_list, response.partNumber, response.serialNumber, &add_success_flag); if (rv != SA_OK) { err("Add board area failed"); return rv; } if (add_success_flag != SAHPI_FALSE) { (local_inventory->info.idr_info.NumAreas)++; if (area_count == 0) { head_area = local_inventory->info.area_list; } ++area_count; } local_inventory->info.area_list = head_area; *inventory = local_inventory; /* Adding the product version in IDR product area. It is added at * the end of the field list. */ if (product_area_success_flag == SAHPI_TRUE) { /* Making getBladeMpInfo soap call for getting the * product version */ blade_mp_request.bayNumber = bay_number; rv = soap_getBladeMpInfo(con, &blade_mp_request, &blade_mp_response); if (rv != SOAP_OK) { err("Get blade mp info failed"); return rv; } /* Add the product version field if the firmware info * is available */ if (blade_mp_response.fwVersion != NULL) { memset(&hpi_field, 0, sizeof(SaHpiIdrFieldT)); hpi_field.AreaId = local_inventory->info.area_list-> idr_area_head.AreaId; hpi_field.Type = SAHPI_IDR_FIELDTYPE_PRODUCT_VERSION; strcpy ((char *)hpi_field.Field.Data, blade_mp_response.fwVersion); rv = idr_field_add(&(local_inventory->info.area_list ->field_list), &hpi_field); if (rv != SA_OK) { err("Add idr field failed"); return rv; } /* Increment the field counter */ local_inventory->info.area_list->idr_area_head. NumFields++; } } return SA_OK; } /** * build_inserted_server_inv_rdr * @oh_handler: Handler data pointer * @bay_number: Bay number of the inserted server * @rdr: Rdr Structure for inventory data * @inventory: Rdr private data structure * * Purpose: * Creates an basic inventory rdr without area information for server * blade when it is inserted * * Detailed Description: * - Populates the server inventory rdr with default values when server is * inserted * - When the server blade is inserted, inventory information is not * available until it stabilizes, a seperate event is sent by OA when * the server stabilizes * Hence, the inventory IDR creation is done in two stages: * Stage 1: Create the IDR header when the server is inserted and * keep area list empty. This stage1 functionality is achieved by this * module * Stage 2: When OA intimates that the server is stable, then retrieve * inventory information and create appropriate area list and attach it * to the IDR created in stage 1. This stage 2 functionality is achieved * by "build_server_inventory_area" module * * Return values: * SA_OK - Normal case * SA_ERR_HPI_INVALID_PARAMS - On wrong parameters * SA_ERR_HPI_INTERNAL_ERROR - oa_soap plugin has encountered an internal * error * SA_ERR_HPI_OUT_OF_MEMORY - Request failed due to insufficient memory **/ SaErrorT build_inserted_server_inv_rdr(struct oh_handler_state *oh_handler, SaHpiInt32T bay_number, SaHpiRdrT *rdr, struct oa_soap_inventory **inventory) { char server_inv_str[] = SERVER_INVENTORY_STRING; struct oa_soap_inventory *local_inventory = NULL; struct oa_soap_handler *oa_handler = NULL; SaHpiResourceIdT resource_id; SaHpiRptEntryT *rpt = NULL; if (oh_handler == NULL || rdr == NULL || inventory == NULL) { err("Invalid parameter."); return SA_ERR_HPI_INVALID_PARAMS; } oa_handler = (struct oa_soap_handler *) oh_handler->data; resource_id = oa_handler->oa_soap_resources.server.resource_id[bay_number - 1]; rpt = oh_get_resource_by_id(oh_handler->rptcache, resource_id); if (!rpt) { err("Could not find blade resource rpt"); return(SA_ERR_HPI_INTERNAL_ERROR); } rdr->Entity = rpt->ResourceEntity; /* Populating the inventory rdr with default values and resource name */ rdr->RecordId = 0; rdr->RdrType = SAHPI_INVENTORY_RDR; rdr->RdrTypeUnion.InventoryRec.IdrId = SAHPI_DEFAULT_INVENTORY_ID; rdr->IdString.DataType = SAHPI_TL_TYPE_TEXT; rdr->IdString.Language = SAHPI_LANG_ENGLISH; rdr->IdString.DataLength = strlen(server_inv_str) + 1; snprintf((char *)rdr->IdString.Data, strlen(server_inv_str) + 1,"%s", server_inv_str); /* Create inventory IDR and populate the IDR header and keep * area list as empty */ local_inventory = (struct oa_soap_inventory*) g_malloc0(sizeof(struct oa_soap_inventory)); if (!local_inventory) { err("OA SOAP out of memory"); return SA_ERR_HPI_OUT_OF_MEMORY; } local_inventory->inv_rec.IdrId = rdr->RdrTypeUnion.InventoryRec.IdrId; local_inventory->info.idr_info.IdrId = rdr->RdrTypeUnion.InventoryRec.IdrId; local_inventory->info.idr_info.UpdateCount = 1; local_inventory->info.idr_info.ReadOnly = SAHPI_FALSE; local_inventory->info.idr_info.NumAreas = 0; local_inventory->info.area_list = NULL; local_inventory->comment = (char *)g_malloc0(strlen(server_inv_str) + 1); snprintf(local_inventory->comment, strlen(server_inv_str) + 1, "%s", server_inv_str); *inventory = local_inventory; return SA_OK; } /** * build_server_inventory_area * @con: Pointer to the SOAP_CON * @response: Handler data pointer * @rdr: Rdr Structure for inventory data * @inventory: Rdr private data structure * * Purpose: * Builds the server IDR areas and attaches these area to already created * inventory rdr of server * * Detailed Description: * - Populates the server inventory rdr's IDR with available inventory * information * - When the server blade is inserted, inventory information is not * available until it stabilizes, a seperate event is sent by OA when * the server stabilizes * Hence, the inventory IDR creation is done in two stages: * Stage 1: Create the IDR header when the server is inserted and * keep area list empty, this functionality is achieved by * "build_inserted_server_inv_rdr" module * Stage 2: When OA intimates that the server is stable, then retrieve * inventory information and create appropriate area list and attach it * to the IDR created in stage 1. This stage 2 functionality is achieved * by this module * * Return values: * SA_OK - Normal case * SA_ERR_HPI_INVALID_PARAMS - On wrong parameters * SA_ERR_HPI_INTERNAL_ERROR - oa_soap plugin has encountered an internal * error * SA_ERR_HPI_OUT_OF_MEMORY - Request failed due to insufficient memory **/ SaErrorT build_server_inventory_area(SOAP_CON *con, struct bladeInfo *response, SaHpiRdrT *rdr, struct oa_soap_inventory **inventory) { SaErrorT rv = SA_OK; SaHpiIdrFieldT hpi_field; struct oa_soap_inventory *local_inventory = *inventory; struct oa_soap_area *head_area = NULL; SaHpiInt32T product_area_success_flag = 0; SaHpiInt32T add_success_flag = 0; SaHpiInt32T area_count = 0; struct getBladeMpInfo blade_mp_request; struct bladeMpInfo blade_mp_response; if (response == NULL || rdr == NULL || inventory == NULL) { err("Invalid parameter."); return SA_ERR_HPI_INVALID_PARAMS; } /* Create and add product area if resource name and/or manufacturer * information exist */ rv = add_product_area(&local_inventory->info.area_list, response->name, response->manufacturer, &add_success_flag); if (rv != SA_OK) { err("Add product area failed"); return rv; } /* add_success_flag will be true if product area is added, * if this is the first successful creation of IDR area, then have * area pointer stored as the head node for area list */ if (add_success_flag != SAHPI_FALSE) { product_area_success_flag = SAHPI_TRUE; (local_inventory->info.idr_info.NumAreas)++; if (area_count == 0) { head_area = local_inventory->info.area_list; } ++area_count; } /* Create and add board area if resource's part number and/or * serial number exist */ rv = add_board_area(&local_inventory->info.area_list, response->partNumber, response->serialNumber, &add_success_flag); if (rv != SA_OK) { err("Add board area failed"); return rv; } if (add_success_flag != SAHPI_FALSE) { (local_inventory->info.idr_info.NumAreas)++; if (area_count == 0) { head_area = local_inventory->info.area_list; } ++area_count; } local_inventory->info.area_list = head_area; *inventory = local_inventory; /* Adding the product version in IDR product area. It is added at * the end of the field list. */ if (product_area_success_flag == SAHPI_TRUE) { /* Making getBladeMpInfo soap call for getting the * product version */ blade_mp_request.bayNumber = response->bayNumber; rv = soap_getBladeMpInfo(con, &blade_mp_request, &blade_mp_response); if (rv != SOAP_OK) { err("Get blade mp info failed"); return rv; } /* Add the product version field if the firmware info * is available */ if (blade_mp_response.fwVersion != NULL) { memset(&hpi_field, 0, sizeof(SaHpiIdrFieldT)); hpi_field.AreaId = local_inventory->info.area_list-> idr_area_head.AreaId; hpi_field.Type = SAHPI_IDR_FIELDTYPE_PRODUCT_VERSION; strcpy ((char *)hpi_field.Field.Data, blade_mp_response.fwVersion); rv = idr_field_add(&(local_inventory->info.area_list ->field_list), &hpi_field); if (rv != SA_OK) { err("Add idr field failed"); return rv; } /* Increment the field counter */ local_inventory->info.area_list->idr_area_head. NumFields++; } } return SA_OK; } /** * build_interconnect_inv_rdr * @oh_handler: Handler data pointer * @con: Pointer to the SOAP_CON * @bay_number: Bay number of the server * @rdr: Rdr Structure for inventory data * @inventory: Rdr private data structure * * Purpose: * Creates an inventory rdr for interconnect blade * * Detailed Description: * - Populates the interconnect inventory rdr with default values * - Inventory data repository is created and associated as part of the * private data area of the Inventory RDR * * Return values: * SA_OK - Normal case * SA_ERR_HPI_INVALID_PARAMS - On wrong parameters * SA_ERR_HPI_INTERNAL_ERROR - oa_soap plugin has encountered an internal * error * SA_ERR_HPI_OUT_OF_MEMORY - Request failed due to insufficient memory **/ SaErrorT build_interconnect_inv_rdr(struct oh_handler_state *oh_handler, SOAP_CON *con, SaHpiInt32T bay_number, SaHpiRdrT *rdr, struct oa_soap_inventory **inventory) { SaErrorT rv = SA_OK; char interconnect_inv_str[] = INTERCONNECT_INVENTORY_STRING; struct oa_soap_inventory *local_inventory = NULL; struct oa_soap_area *head_area = NULL; SaHpiInt32T add_success_flag = 0; SaHpiInt32T area_count = 0; struct getInterconnectTrayInfo request; struct interconnectTrayInfo response; struct oa_soap_handler *oa_handler = NULL; SaHpiResourceIdT resource_id; SaHpiRptEntryT *rpt = NULL; if (oh_handler == NULL || con == NULL || rdr == NULL || inventory == NULL) { err("Invalid parameter."); return SA_ERR_HPI_INVALID_PARAMS; } oa_handler = (struct oa_soap_handler *) oh_handler->data; resource_id = oa_handler-> oa_soap_resources.interconnect.resource_id[bay_number - 1]; /* Get the rpt entry of the resource */ rpt = oh_get_resource_by_id(oh_handler->rptcache, resource_id); if (rpt == NULL) { err("resource RPT is NULL"); return SA_ERR_HPI_INTERNAL_ERROR; } request.bayNumber = bay_number; rv = soap_getInterconnectTrayInfo(con, &request, &response); if (rv != SOAP_OK) { err("Get Interconnect tray info failed"); return SA_ERR_HPI_INTERNAL_ERROR; } /* Populating the inventory rdr with rpt values for the resource */ rdr->Entity = rpt->ResourceEntity; rdr->RecordId = 0; rdr->RdrType = SAHPI_INVENTORY_RDR; rdr->RdrTypeUnion.InventoryRec.IdrId = SAHPI_DEFAULT_INVENTORY_ID; rdr->IdString.DataType = SAHPI_TL_TYPE_TEXT; rdr->IdString.Language = SAHPI_LANG_ENGLISH; rdr->IdString.DataLength = strlen(response.name) + 1; snprintf((char *)rdr->IdString.Data, strlen(response.name)+ 1, "%s",response.name ); /* Create inventory IDR and populate the IDR header */ local_inventory = (struct oa_soap_inventory*) g_malloc0(sizeof(struct oa_soap_inventory)); if (!local_inventory) { err("OA SOAP out of memory"); return SA_ERR_HPI_OUT_OF_MEMORY; } local_inventory->inv_rec.IdrId = rdr->RdrTypeUnion.InventoryRec.IdrId; local_inventory->info.idr_info.IdrId = rdr->RdrTypeUnion.InventoryRec.IdrId; local_inventory->info.idr_info.UpdateCount = 1; local_inventory->info.idr_info.ReadOnly = SAHPI_FALSE; local_inventory->info.idr_info.NumAreas = 0; local_inventory->info.area_list = NULL; local_inventory->comment = (char *)g_malloc0(strlen(interconnect_inv_str) + 1); snprintf(local_inventory->comment, strlen(interconnect_inv_str) + 1, "%s", interconnect_inv_str); /* Create and add product area if resource name and/or manufacturer * information exist */ rv = add_product_area(&local_inventory->info.area_list, response.name, response.manufacturer, &add_success_flag); if (rv != SA_OK) { err("Add product area failed"); return rv; } /* add_success_flag will be true if product area is added, * if this is the first successful creation of IDR area, then have * area pointer stored as the head node for area list */ if (add_success_flag != SAHPI_FALSE) { (local_inventory->info.idr_info.NumAreas)++; if (area_count == 0) { head_area = local_inventory->info.area_list; } ++area_count; } /* Create and add board area if resource part number and/or * serial number exist */ rv = add_board_area(&local_inventory->info.area_list, response.partNumber, response.serialNumber, &add_success_flag); if (rv != SA_OK) { err("Add board area failed"); return rv; } if (add_success_flag != SAHPI_FALSE) { (local_inventory->info.idr_info.NumAreas)++; if (area_count == 0) { head_area = local_inventory->info.area_list; } ++area_count; } local_inventory->info.area_list = head_area; *inventory = local_inventory; return SA_OK; } /** * build_fan_inv_rdr * @oh_handler: Handler data pointer * @response: Pointer to the fan info response * @rdr: Rdr Structure for inventory data * @inventory: Rdr private data structure * * Purpose: * Creates an inventory rdr for fan * * Detailed Description: * - Populates the fan inventory rdr with default values * - Inventory data repository is created and associated as part of the * private data area of the Inventory RDR * * Return values: * SA_OK - Normal case * SA_ERR_HPI_INVALID_PARAMS - On wrong parameters * SA_ERR_HPI_INTERNAL_ERROR - oa_soap plugin has encountered an internal * error * SA_ERR_HPI_OUT_OF_MEMORY - Request failed due to insufficient memory **/ SaErrorT build_fan_inv_rdr(struct oh_handler_state *oh_handler, struct fanInfo *response, SaHpiRdrT *rdr, struct oa_soap_inventory **inventory) { SaErrorT rv = SA_OK; char fan_inv_str[] = FAN_INVENTORY_STRING; struct oa_soap_inventory *local_inventory = NULL; struct oa_soap_area *head_area = NULL; SaHpiInt32T add_success_flag = 0; SaHpiInt32T area_count = 0; struct oa_soap_handler *oa_handler = NULL; SaHpiResourceIdT resource_id; SaHpiRptEntryT *rpt = NULL; if (oh_handler == NULL || response == NULL || rdr == NULL || inventory == NULL) { err("Invalid parameter."); return SA_ERR_HPI_INVALID_PARAMS; } oa_handler = (struct oa_soap_handler *) oh_handler->data; resource_id = oa_handler-> oa_soap_resources.fan.resource_id[response->bayNumber - 1]; /* Get the rpt entry of the resource */ rpt = oh_get_resource_by_id(oh_handler->rptcache, resource_id); if (rpt == NULL) { err("resource RPT is NULL"); return SA_ERR_HPI_INTERNAL_ERROR; } /* Populating the inventory rdr with default values and resource name */ rdr->RdrType = SAHPI_INVENTORY_RDR; rdr->Entity = rpt->ResourceEntity; rdr->RecordId = 0; rdr->RdrTypeUnion.InventoryRec.IdrId = SAHPI_DEFAULT_INVENTORY_ID; rdr->IdString.DataType = SAHPI_TL_TYPE_TEXT; rdr->IdString.Language = SAHPI_LANG_ENGLISH; rdr->IdString.DataLength = strlen(response->name) + 1; snprintf((char *)rdr->IdString.Data, strlen(response->name)+ 1, "%s", response->name ); /* Create inventory IDR and populate the IDR header */ local_inventory = (struct oa_soap_inventory*) g_malloc0(sizeof(struct oa_soap_inventory)); if (!local_inventory) { return SA_ERR_HPI_OUT_OF_MEMORY; } local_inventory->inv_rec.IdrId = rdr->RdrTypeUnion.InventoryRec.IdrId; local_inventory->info.idr_info.IdrId = rdr->RdrTypeUnion.InventoryRec.IdrId; local_inventory->info.idr_info.UpdateCount = 1; local_inventory->info.idr_info.ReadOnly = SAHPI_FALSE; local_inventory->info.idr_info.NumAreas = 0; local_inventory->info.area_list = NULL; local_inventory->comment = (char *)g_malloc0(strlen(fan_inv_str) + 1); snprintf(local_inventory->comment, strlen(fan_inv_str) + 1, "%s", fan_inv_str); /* Create and add product area if resource name and/or manufacturer * information exist */ rv = add_product_area(&local_inventory->info.area_list, response->name, NULL, &add_success_flag); if (rv != SA_OK) { err("Add product area failed"); return rv; } /* add_success_flag will be true if product area is added, * if this is the first successful creation of IDR area, then have * area pointer stored as the head node for area list */ if (add_success_flag != SAHPI_FALSE) { (local_inventory->info.idr_info.NumAreas)++; if (area_count == 0) { head_area = local_inventory->info.area_list; } ++area_count; } /* Create and add board area if resource part number and/or * serial number exist */ rv = add_board_area(&local_inventory->info.area_list, response->partNumber, response->serialNumber, &add_success_flag); if (rv != SA_OK) { err("Add board area failed"); return rv; } if (add_success_flag != SAHPI_FALSE) { (local_inventory->info.idr_info.NumAreas)++; if (area_count == 0) { head_area = local_inventory->info.area_list; } ++area_count; } local_inventory->info.area_list = head_area; *inventory = local_inventory; return SA_OK; } /** * build_power_inv_rdr * @oh_handler: Handler data pointer * @response: Pointer to the power sypply info response * @rdr: Rdr Structure for inventory data * @inventory: Rdr private data structure * * Purpose: * Creates an inventory rdr for power supply * * Detailed Description: * - Populates the power supply inventory rdr with default values * - Inventory data repository is created and associated as part of the * private data area of the Inventory RDR * * Return values: * SA_OK - Normal case * SA_ERR_HPI_INVALID_PARAMS - On wrong parameters * SA_ERR_HPI_INTERNAL_ERROR - oa_soap plugin has encountered an internal * error * SA_ERR_HPI_OUT_OF_MEMORY - Request failed due to insufficient memory **/ SaErrorT build_power_inv_rdr(struct oh_handler_state *oh_handler, struct powerSupplyInfo *response, SaHpiRdrT *rdr, struct oa_soap_inventory **inventory) { SaErrorT rv = SA_OK; char *power_rdr_str = POWER_SUPPLY_RDR_STRING; char power_inv_str[] = POWER_SUPPLY_INVENTORY_STRING; struct oa_soap_inventory *local_inventory = NULL; struct oa_soap_area *head_area = NULL; SaHpiInt32T add_success_flag = 0; SaHpiInt32T area_count = 0; struct oa_soap_handler *oa_handler = NULL; SaHpiResourceIdT resource_id; SaHpiRptEntryT *rpt = NULL; if (oh_handler == NULL || response == NULL || rdr == NULL || inventory == NULL) { err("Invalid parameter."); return SA_ERR_HPI_INVALID_PARAMS; } oa_handler = (struct oa_soap_handler *) oh_handler->data; resource_id = oa_handler->oa_soap_resources.ps_unit.resource_id[response->bayNumber - 1]; /* Get the rpt entry of the resource */ rpt = oh_get_resource_by_id(oh_handler->rptcache, resource_id); if (rpt == NULL) { err("resource RPT is NULL"); return SA_ERR_HPI_INTERNAL_ERROR; } /* Populating the inventory rdr with default values and resource name */ rdr->Entity = rpt->ResourceEntity; rdr->RecordId = 0; rdr->RdrType = SAHPI_INVENTORY_RDR; rdr->RdrTypeUnion.InventoryRec.IdrId = SAHPI_DEFAULT_INVENTORY_ID; rdr->IdString.DataType = SAHPI_TL_TYPE_TEXT; rdr->IdString.Language = SAHPI_LANG_ENGLISH; rdr->IdString.DataLength = strlen(power_rdr_str) + 1; snprintf((char *)rdr->IdString.Data, strlen(power_rdr_str)+ 1, "%s", power_rdr_str); /* Create inventory IDR and populate the IDR header */ local_inventory = (struct oa_soap_inventory*) g_malloc0(sizeof(struct oa_soap_inventory)); if (!local_inventory) { err("OA SOAP out of memory"); return SA_ERR_HPI_OUT_OF_MEMORY; } local_inventory->inv_rec.IdrId = rdr->RdrTypeUnion.InventoryRec.IdrId; local_inventory->info.idr_info.IdrId = rdr->RdrTypeUnion.InventoryRec.IdrId; local_inventory->info.idr_info.UpdateCount = 1; local_inventory->info.idr_info.ReadOnly = SAHPI_FALSE; local_inventory->info.idr_info.NumAreas = 0; local_inventory->info.area_list = NULL; local_inventory->comment = (char *)g_malloc0(strlen(power_inv_str) + 1); snprintf(local_inventory->comment, strlen(power_inv_str) + 1, "%s", power_inv_str); /* Create and add board area if resource part number and/or * serial number exist */ rv = add_board_area(&local_inventory->info.area_list, response->modelNumber, response->serialNumber, &add_success_flag); if (rv != SA_OK) { err("Add board area failed"); return rv; } if (add_success_flag != SAHPI_FALSE) { (local_inventory->info.idr_info.NumAreas)++; if (area_count == 0) { head_area = local_inventory->info.area_list; } ++area_count; } local_inventory->info.area_list = head_area; *inventory = local_inventory; return SA_OK; } /** * add_product_area * @area: IDR area pointer * @name: Resource name * @manufacturer: Resource manufacturer * @success_flag: Flag for checking area creation * * Purpose: * Creates an IDR product area with required fields * * Detailed Description: * - Checks whether the name and manufacturer details are available for * the resource which has called this module * - If either or both of these information is available then IDR area * of Product info type is created and these informations are added as * individual IDR fields in the newly create product area * * Return values: * SA_OK - Normal case * SA_ERR_HPI_INVALID_PARAMS - On wrong parameters * SA_ERR_HPI_OUT_OF_MEMORY - Request failed due to insufficient memory **/ SaErrorT add_product_area(struct oa_soap_area **area, char *name, char *manufacturer, SaHpiInt32T *success_flag) { SaErrorT rv = SA_OK; SaHpiIdrFieldT hpi_field; struct oa_soap_area *local_area = NULL; struct oa_soap_field *field = NULL; struct oa_soap_field *head_field = NULL; SaHpiInt32T field_count = 0; if (area == NULL || success_flag == NULL) { err("Invalid Parameters"); return SA_ERR_HPI_INVALID_PARAMS; } /* If both name and manufacturer information is NULL * then product area is not created */ if (name == NULL && manufacturer == NULL) { err("Product Area:Required information not available"); err("Product area not created"); *success_flag = SAHPI_FALSE; return SA_OK; } /* Create area of type PRODUCT INFO */ rv = idr_area_add(area, SAHPI_IDR_AREATYPE_PRODUCT_INFO, &local_area); if (rv != SA_OK) { err("Add idr area failed"); return rv; } *success_flag = SAHPI_TRUE; /* Add the fields to the newly created product area */ field = local_area->field_list; if (name != NULL) { /* Add product name field to the IDR product area */ memset(&hpi_field, 0, sizeof(SaHpiIdrFieldT)); hpi_field.AreaId = local_area->idr_area_head.AreaId; hpi_field.Type = SAHPI_IDR_FIELDTYPE_PRODUCT_NAME; strcpy ((char *)hpi_field.Field.Data, name); rv = idr_field_add(&(local_area->field_list), &hpi_field); if (rv != SA_OK) { err("Add idr field failed"); return rv; } ++field_count; /* if this is the first successful creation of IDR field in * the IDR area, then have field pointer stored as the head * node for field list */ if (field_count == 1) { head_field = field = local_area->field_list; } local_area->idr_area_head.NumFields++; } if (manufacturer != NULL) { /* Add manufacturer field to the IDR product area */ memset(&hpi_field, 0, sizeof(SaHpiIdrFieldT)); hpi_field.AreaId = local_area->idr_area_head.AreaId; hpi_field.Type = SAHPI_IDR_FIELDTYPE_MANUFACTURER; strcpy ((char *)hpi_field.Field.Data, manufacturer); rv = idr_field_add(&(local_area->field_list), &hpi_field); if (rv != SA_OK) { err("Add idr field failed"); return rv; } ++field_count; if (field_count == 1) { head_field = field = local_area->field_list; } local_area->idr_area_head.NumFields++; } local_area->field_list = head_field; return SA_OK; } /** * add_chassis_area * @area: IDR area pointer * @part_number: Resource part number * @serial_number: Resource serial_number * @success_flag: Flag for checking area creation * * Purpose: * Creates an IDR chassis area with required fields * * Detailed Description: * - Checks whether the part number and serial number details are * available for the resource which has called this module * - If either or both of these information is available then IDR area * of Chassis info type is created and these informations are added as * individual IDR fields in the newly create chassis area * * Return values: * SA_OK - Normal case * SA_ERR_HPI_INVALID_PARAMS - On wrong parameters * SA_ERR_HPI_OUT_OF_MEMORY - Request failed due to insufficient memory **/ SaErrorT add_chassis_area(struct oa_soap_area **area, char *part_number, char *serial_number, SaHpiInt32T *success_flag) { SaErrorT rv = SA_OK; SaHpiIdrFieldT hpi_field; struct oa_soap_area *local_area = NULL; struct oa_soap_field *field = NULL; struct oa_soap_field *head_field = NULL; SaHpiInt32T field_count = 0; if (area == NULL || success_flag == NULL) { err("Invalid Parameters"); return SA_ERR_HPI_INVALID_PARAMS; } /* If both part number and serial number information is NULL * then chassis area is not created */ if (part_number == NULL && serial_number == NULL) { err("Chassis Area:Required information not available"); err("Chassis area not created"); *success_flag = SAHPI_FALSE; return SA_OK; } rv = idr_area_add(area, SAHPI_IDR_AREATYPE_CHASSIS_INFO, &local_area); if (rv != SA_OK) { err("Add idr area failed"); return rv; } field_count = 0; *success_flag = SAHPI_TRUE; /* Add the fields to the newly created chassis area */ field = local_area->field_list; if (part_number != NULL) { memset(&hpi_field, 0, sizeof(SaHpiIdrFieldT)); hpi_field.AreaId = local_area->idr_area_head.AreaId; hpi_field.Type = SAHPI_IDR_FIELDTYPE_PART_NUMBER; strcpy ((char *)hpi_field.Field.Data, part_number); rv = idr_field_add(&(local_area->field_list), &hpi_field); if (rv != SA_OK) { err("Add idr field failed"); return rv; } ++field_count; if (field_count == 1) { head_field = field = local_area->field_list; } local_area->idr_area_head.NumFields++; } if (serial_number != NULL) { memset(&hpi_field, 0, sizeof(SaHpiIdrFieldT)); hpi_field.AreaId = local_area->idr_area_head.AreaId; hpi_field.Type = SAHPI_IDR_FIELDTYPE_SERIAL_NUMBER; strcpy ((char *)hpi_field.Field.Data, serial_number); rv = idr_field_add(&(local_area->field_list), &hpi_field); if (rv != SA_OK) { err("Add idr field failed"); return rv; } ++field_count; if (field_count == 1) { head_field = field = local_area->field_list; } local_area->idr_area_head.NumFields++; } local_area->field_list = head_field; return SA_OK; } /** * add_board_area * @area: IDR area pointer * @part_number: Resource part number * @serial_number: Resource serial_number * @success_flag: Flag for checking area creation * * Purpose: * Creates an IDR board area with required fields * * Detailed Description: * - Checks whether the part number and serial number details are * available for the resource which has called this module * - If either or both of these information is available then IDR area * of board info type is created and these informations are added as * individual IDR fields in the newly create broad area * * Return values: * SA_OK - Normal case * SA_ERR_HPI_INVALID_PARAMS - On wrong parameters * SA_ERR_HPI_OUT_OF_MEMORY - Request failed due to insufficient memory **/ SaErrorT add_board_area(struct oa_soap_area **area, char *part_number, char *serial_number, SaHpiInt32T *success_flag) { SaErrorT rv = SA_OK; SaHpiIdrFieldT hpi_field; struct oa_soap_area *local_area = NULL; struct oa_soap_field *field = NULL; struct oa_soap_field *head_field = NULL; SaHpiInt32T field_count = 0; if (area == NULL || success_flag == NULL) { err("Invalid Parameters"); return SA_ERR_HPI_INVALID_PARAMS; } /* If both part number and serial number information is NULL * then board area is not created */ if (part_number == NULL && serial_number == NULL) { err("Board Area:Required information not available"); err("Board area not created"); *success_flag = SAHPI_FALSE; return SA_OK; } rv = idr_area_add(area, SAHPI_IDR_AREATYPE_BOARD_INFO, &local_area); if (rv != SA_OK) { err("Add idr area failed"); return rv; } *success_flag = SAHPI_TRUE; field_count = 0; /* Add the fields to the newly created product area */ field = local_area->field_list; if (part_number != NULL) { memset(&hpi_field, 0, sizeof(SaHpiIdrFieldT)); hpi_field.AreaId = local_area->idr_area_head.AreaId; hpi_field.Type = SAHPI_IDR_FIELDTYPE_PART_NUMBER; strcpy ((char *)hpi_field.Field.Data, part_number); rv = idr_field_add(&(local_area->field_list), &hpi_field); if (rv != SA_OK) { err("Add idr field failed"); return rv; } ++field_count; if (field_count == 1) { head_field = field = local_area->field_list; } local_area->idr_area_head.NumFields++; } if (serial_number != NULL) { memset(&hpi_field, 0, sizeof(SaHpiIdrFieldT)); hpi_field.AreaId = local_area->idr_area_head.AreaId; hpi_field.Type = SAHPI_IDR_FIELDTYPE_SERIAL_NUMBER; strcpy ((char *)hpi_field.Field.Data, serial_number); rv = idr_field_add(&(local_area->field_list), &hpi_field); if (rv != SA_OK) { err("Add idr field failed"); return rv; } ++field_count; if (field_count == 1) { head_field = field = local_area->field_list; } local_area->idr_area_head.NumFields++; } local_area->field_list = head_field; return SA_OK; } /** * add_internal_area * @area: IDR area pointer * @manufacturer: Resource manufacturer * @name: Resource name * @part_number: Resource part number * @serial_number: Resource serial_number * @success_flag: Flag for checking area creation * * Purpose: * Creates an IDR internal area with required fields * * Detailed Description: * - Checks whether the required details for internal area are * available for the enclosure resource which has called this module * - If any of these information is available then IDR area * of INTERNAL USE type is created and available informations are added * as individual IDR fields in the newly create chassis area * * Return values: * SA_OK - Normal case * SA_ERR_HPI_INVALID_PARAMS - On wrong parameters * SA_ERR_HPI_OUT_OF_MEMORY - Request failed due to insufficient memory **/ SaErrorT add_internal_area(struct oa_soap_area **area, char *manufacturer, char *name, char *part_number, char *serial_number, SaHpiInt32T *success_flag) { SaErrorT rv = SA_OK; SaHpiIdrFieldT hpi_field; struct oa_soap_area *local_area = NULL; struct oa_soap_field *field = NULL; struct oa_soap_field *head_field = NULL; SaHpiInt32T field_count = 0; if (area == NULL || success_flag == NULL) { err("Invalid Parameters"); return SA_ERR_HPI_INVALID_PARAMS; } /* If none of the required inventory info is availble, then INTERNAL * area is not created */ if (manufacturer == NULL && name == NULL && part_number == NULL && serial_number == NULL) { err("Internal Area:Required information not available"); err("Internal area not created"); *success_flag = SAHPI_FALSE; return SA_OK; } /* Create IDR area of INTERNAL USE type */ rv = idr_area_add(area, (SaHpiIdrAreaTypeT)SAHPI_IDR_AREATYPE_INTERNAL_USE, &local_area); if (rv != SA_OK) { err("Add idr area failed"); return rv; } *success_flag = SAHPI_TRUE; field_count = 0; /* Add the fields to the newly created internal use area */ field = local_area->field_list; if (manufacturer != NULL) { memset(&hpi_field, 0, sizeof(SaHpiIdrFieldT)); hpi_field.AreaId = local_area->idr_area_head.AreaId; hpi_field.Type = SAHPI_IDR_FIELDTYPE_MANUFACTURER; strcpy ((char *)hpi_field.Field.Data, manufacturer); rv = idr_field_add(&(local_area->field_list), &hpi_field); if (rv != SA_OK) { err("Add idr field failed"); return rv; } ++field_count; if (field_count == 1) { head_field = field = local_area->field_list; } local_area->idr_area_head.NumFields++; } if (name != NULL) { memset(&hpi_field, 0, sizeof(SaHpiIdrFieldT)); hpi_field.AreaId = local_area->idr_area_head.AreaId; hpi_field.Type = SAHPI_IDR_FIELDTYPE_PRODUCT_NAME; strcpy ((char *)hpi_field.Field.Data, name); rv = idr_field_add(&(local_area->field_list), &hpi_field); if (rv != SA_OK) { err("Add idr field failed"); return rv; } ++field_count; if (field_count == 1) { head_field = field = local_area->field_list; } local_area->idr_area_head.NumFields++; } if (part_number != NULL) { memset(&hpi_field, 0, sizeof(SaHpiIdrFieldT)); hpi_field.AreaId = local_area->idr_area_head.AreaId; hpi_field.Type = SAHPI_IDR_FIELDTYPE_PART_NUMBER; strcpy ((char *)hpi_field.Field.Data, part_number); rv = idr_field_add(&(local_area->field_list), &hpi_field); if (rv != SA_OK) { err("Add idr field failed"); return rv; } ++field_count; if (field_count == 1) { head_field = field = local_area->field_list; head_field = local_area->field_list = field; } local_area->idr_area_head.NumFields++; } if (serial_number != NULL) { memset(&hpi_field, 0, sizeof(SaHpiIdrFieldT)); hpi_field.AreaId = local_area->idr_area_head.AreaId; hpi_field.Type = SAHPI_IDR_FIELDTYPE_SERIAL_NUMBER; strcpy ((char *)hpi_field.Field.Data, serial_number); rv = idr_field_add(&(local_area->field_list), &hpi_field); if (rv != SA_OK) { err("Add idr field failed"); return rv; } ++field_count; if (field_count == 1) { head_field = field = local_area->field_list; } local_area->idr_area_head.NumFields++; } local_area->field_list = head_field; return SA_OK; } /** * idr_area_add * @head_area: Pointer to IDR area * @area_type: Type of IDR area * @area: Pointer to new allocated area * * Purpose: * Adds an Inventory Data Repository(IDR) area to Inventory data repository * and returns the area pointer * * Detailed Description: * - Creates an IDR area of the specified type * If the area list for the resource IDR exists, then the * newly created area will be added to end of area list * If the area list is empty then the created area will become head node * (first area) for the area list * - Area id is will start from 0 and will increment for every new area * added * * Return values: * SA_OK - Normal case * SA_ERR_HPI_INVALID_PARAMS - On wrong parameters * SA_ERR_HPI_OUT_OF_MEMORY - Request failed due to insufficient memory **/ SaErrorT idr_area_add(struct oa_soap_area **head_area, SaHpiIdrAreaTypeT area_type, struct oa_soap_area **area) { struct oa_soap_area *local_area = NULL; SaHpiEntryIdT local_area_id; if (head_area == NULL || area == NULL) { err("Invalid parameter."); return SA_ERR_HPI_INVALID_PARAMS; } local_area = *head_area; /* Check whether the area list is empty */ if (local_area == NULL) { local_area = (struct oa_soap_area*) g_malloc0(sizeof(struct oa_soap_area)); if (!local_area) { err("OA SOAP out of memory"); return SA_ERR_HPI_OUT_OF_MEMORY; } /* Create the area and make it as head node(first area) in * the area list */ *head_area = local_area; local_area_id = 0; } else { /* Area list is not empty, traverse to the end of the list * and add the IDR area */ while (local_area->next_area != NULL) { local_area = local_area->next_area; } local_area->next_area = (struct oa_soap_area*) g_malloc0(sizeof(struct oa_soap_area)); if (!local_area->next_area) { err("OA SOAP out of memory"); return SA_ERR_HPI_OUT_OF_MEMORY; } local_area_id = local_area->idr_area_head.AreaId + 1; local_area = local_area->next_area; } /* Initialize the area with specified area type and generated area id */ local_area->idr_area_head.AreaId = local_area_id; local_area->idr_area_head.Type = area_type; local_area->idr_area_head.ReadOnly = SAHPI_FALSE; local_area->idr_area_head.NumFields = 0; local_area->field_list = NULL; local_area->next_area = NULL; *area = local_area; return SA_OK; } /** * idr_area_add_by_id: * @head_area: Pointer to IDR area * @area_type: Type of IDR area * @area_id: area id to be added * * Purpose: * Adds an Inventory Data Repository(IDR) area to Inventory data repository * with the specified area id * * Detailed Description: * - Creates an IDR area of a specified type with specified id and adds it * to Inventory Data Repository(IDR). * If the area list is empty then the created area will become head node * (first area) for the area list. * * Return values: * SA_OK - Normal case * SA_ERR_HPI_INVALID_PARAMS - Input parameters are not valid * SA_ERR_HPI_NOT_PRESENT - Requested object not present * SA_ERR_HPI_OUT_OF_MEMORY - Request failed due to insufficient memory **/ SaErrorT idr_area_add_by_id(struct oa_soap_area **head_area, SaHpiIdrAreaTypeT area_type, SaHpiEntryIdT area_id) { struct oa_soap_area *local_area = NULL; struct oa_soap_area *temp_area = NULL; if (head_area == NULL || area_id == SAHPI_LAST_ENTRY) { err("Invalid parameter."); return SA_ERR_HPI_INVALID_PARAMS; } temp_area = *head_area; local_area = (struct oa_soap_area*)g_malloc0( sizeof(struct oa_soap_area)); if (!local_area) { err("OA SOAP out of memory"); return SA_ERR_HPI_OUT_OF_MEMORY; } /* Initialize the area with specified area type and ID */ local_area->idr_area_head.AreaId = area_id; local_area->idr_area_head.Type = area_type; local_area->idr_area_head.ReadOnly = SAHPI_FALSE; local_area->idr_area_head.NumFields = 0; local_area->field_list = NULL; /* Check whether the area list is empty or if the new area * is to be inserted before first area */ if (*head_area == NULL || (*head_area)->idr_area_head.AreaId > area_id) { *head_area = local_area; (*head_area)->next_area = temp_area; } else { /* Traverse through the area list and insert the area * at appropriate place */ while (temp_area != NULL) { if ((temp_area->idr_area_head.AreaId < area_id) && ((temp_area->next_area == NULL) || (temp_area->next_area->idr_area_head.AreaId > area_id))) { local_area->next_area = temp_area->next_area; temp_area->next_area = local_area; break; } temp_area = temp_area->next_area; } } return SA_OK; } /** * idr_area_delete * @head_area: Pointer to IDR area * @area_id: Identifier of the area to be deleted * * Purpose: * Deletes an Inventory Data Repository(IDR) area from Inventory data * repository * * Detailed Description: * - Deleted an IDR area of a specified id if it exists in the area * list else an appropriate error will be returned * - If the specified area id exists, then all the IDR fields in IDR * area is deleted first and then the IDR area is deleted * * Return values: * SA_OK - Normal case * SA_ERR_HPI_INVALID_PARAMS - On wrong parameters * SA_ERR_HPI_NOT_PRESENT - Requested object not present **/ SaErrorT idr_area_delete(struct oa_soap_area **head_area, SaHpiEntryIdT area_id) { SaErrorT rv = SA_OK; struct oa_soap_area *local_area = NULL; struct oa_soap_area *tmp_area = NULL; struct oa_soap_area *next_area = NULL; SaHpiInt32T count = -1; if (head_area == NULL) { err("Invalid parameter."); return SA_ERR_HPI_INVALID_PARAMS; } local_area = *head_area; /* If area list is empty, then return error */ if (local_area == NULL) { return SA_ERR_HPI_NOT_PRESENT; } else { /* Check whether specified area id matches with first area id */ if (area_id == local_area->idr_area_head.AreaId) { /* If the specified IDR area is read only, then delete * will be failed and READ ONLY error will be returned */ if (local_area->idr_area_head.ReadOnly == SAHPI_TRUE) { return SA_ERR_HPI_READ_ONLY; } tmp_area = local_area; /* If the specified area id is found, * then traverse the IDR field list of this area and * delete the fields */ for (count = 0; count < local_area->idr_area_head.NumFields; count++) { rv = idr_field_delete(&(local_area->field_list), local_area->field_list-> field.FieldId); if (rv != SA_OK) { return rv; } } tmp_area = local_area; local_area = local_area->next_area; *head_area = local_area; g_free(tmp_area); return SA_OK; } /* Traverse the area list to find the specified IDR area */ while (local_area->next_area) { next_area = local_area->next_area; if (area_id == next_area->idr_area_head.AreaId) { if (next_area->idr_area_head.ReadOnly == SAHPI_TRUE) { return SA_ERR_HPI_READ_ONLY; } /* If the specified area id is found, then * traverse the IDR field list of this area and * delete the fields */ for (count = 0; count < next_area->idr_area_head.NumFields; count++) { rv = idr_field_delete( &(next_area->field_list), next_area->field_list-> field.FieldId); if (rv != SA_OK) { return rv; } } local_area->next_area = next_area->next_area; g_free(next_area); return SA_OK; } else { local_area = local_area->next_area; } } } return SA_ERR_HPI_NOT_PRESENT; } /** * fetch_idr_area_header * @inventory_info: Pointer to rdr private data * @area_id: Identifier of the area to be deleted * @area_type: Type of IDR area * @area_header: Structure to receive area header information * @next_area_id: Next area Id of requested type * * Purpose: * Gets an Inventory Data Repository(IDR) area header from Inventory data * repository * * Detailed Description: * - This function allows retrieval of an IDR Area Header by one of * two ways: by AreaId regardless of type or by AreaType and AreaId * - All areas within an IDR can be retrieved by setting area type as * SAHPI_IDR_AREATYPE_UNSPECIFIED, area id set to SAHPI_FIRST_ENTRY for * the first call. For each subsequent call, the area id will be set to * the value returned in the Next area id parameter, * this will work until next area id becomes SAHPI_LAST_ENTRY * - To retrieve all areas of specific type, the above step is repeated * with the specified area type * * Return values: * SA_OK - Normal case * SA_ERR_HPI_INVALID_PARAMS - On wrong parameters * SA_ERR_HPI_NOT_PRESENT - Requested object not present **/ SaErrorT fetch_idr_area_header(struct oa_soap_inventory_info *inventory_info, SaHpiEntryIdT area_id, SaHpiIdrAreaTypeT area_type, SaHpiIdrAreaHeaderT *area_header, SaHpiEntryIdT *next_area_id) { SaHpiInt32T i; struct oa_soap_area *local_area = NULL; SaHpiInt32T found = SAHPI_FALSE; SaHpiInt32T area_found = SAHPI_FALSE; if (inventory_info == NULL) { return SA_ERR_HPI_ERROR; } if ((area_header == NULL) && (next_area_id == NULL)) { err("Invalid parameter."); return SA_ERR_HPI_INVALID_PARAMS; } local_area = inventory_info->area_list; /* Check whether area id is set to return all areas * (of a particular type if specified) */ if (area_id == SAHPI_FIRST_ENTRY) { i = 1; /* Traversing the IDR area list to find the area and next area * of specified area type */ while ((i <= inventory_info->idr_info.NumAreas) && (local_area != NULL)) { if (area_type == SAHPI_IDR_AREATYPE_UNSPECIFIED || area_type == local_area->idr_area_head.Type) { area_found = SAHPI_TRUE; memcpy(area_header, &local_area->idr_area_head, sizeof(SaHpiIdrAreaHeaderT)); local_area = local_area->next_area; *next_area_id = SAHPI_LAST_ENTRY; while (local_area) { if (area_type == SAHPI_IDR_AREATYPE_UNSPECIFIED || area_type == local_area->idr_area_head.Type) { *next_area_id = local_area-> idr_area_head.AreaId; found = SAHPI_TRUE; break; } local_area = local_area->next_area; } break; } else { local_area = local_area->next_area; } i++; } } else { /* Traverse the area list to find area of specified id and * type */ while (local_area != NULL) { if (found == SAHPI_TRUE) { break; } /* If specified area is present then retrive area header * along with next area of same type */ if ((area_id == local_area->idr_area_head.AreaId)) { if (area_type == SAHPI_IDR_AREATYPE_UNSPECIFIED || area_type == local_area->idr_area_head.Type) { area_found = SAHPI_TRUE; memcpy(area_header, &local_area->idr_area_head, sizeof(SaHpiIdrAreaHeaderT)); *next_area_id = SAHPI_LAST_ENTRY; while (local_area->next_area != NULL) { local_area = local_area->next_area; if (area_type == SAHPI_IDR_AREATYPE_UNSPECIFIED || area_type == local_area-> idr_area_head.Type) { *next_area_id = local_area-> idr_area_head. AreaId; found = SAHPI_TRUE; break; } } break; } else { break; } } local_area = local_area->next_area; } } if (!area_found) { return SA_ERR_HPI_NOT_PRESENT; } return SA_OK; } /** * idr_field_add * @oa_field: Pointer to field structure * @area_id: Identifier of the area to be deleted * @field_type: Type of IDR field * @str: Field text content * @hpi_field: Pointer to hpi field structure * * Purpose: * Adds an Inventory Data Repository(IDR) field to Inventory data * repository Area * * Detailed Description: * - Creates an IDR field of a specified type in an IDR area * If the field list in the IDR area exists, then the * newly created field will be added to end of field list. * If the field list is empty then the created field will become head * node (first field) of the field list * - Field id is will start from 0 and will increment for every new field * added * * Return values: * SA_OK - Normal case * SA_ERR_HPI_INVALID_PARAMS - On wrong parameters * SA_ERR_HPI_NOT_PRESENT - Requested object not present * SA_ERR_HPI_OUT_OF_MEMORY - Request failed due to insufficient memory **/ SaErrorT idr_field_add(struct oa_soap_field **oa_field, SaHpiIdrFieldT *hpi_field) { SaHpiEntryIdT field_id; struct oa_soap_field *field = NULL; if (oa_field == NULL || hpi_field == NULL) { err("Invalid parameter."); return SA_ERR_HPI_INVALID_PARAMS; } field = *oa_field; /* Check whether the field list is empty */ if (field == NULL) { /* Create the area and make it as head node(first area) in * the area list */ field = (struct oa_soap_field*) g_malloc0(sizeof(struct oa_soap_field)); if (! (field)) { err("OA SOAP out of memory"); return SA_ERR_HPI_OUT_OF_MEMORY; } *oa_field = field; field_id = 0; } else { /* Field list is not empty, traverse to the end of the list * and add the IDR field */ while (field->next_field != NULL) { field = field->next_field; } field->next_field = (struct oa_soap_field*) g_malloc0(sizeof(struct oa_soap_field)); if (!(field->next_field)) { return SA_ERR_HPI_OUT_OF_MEMORY; } field_id = field->field.FieldId + 1; field = field->next_field; } /* Initialize the field of specified field type and generated * field id */ field->field.AreaId = hpi_field->AreaId; field->field.FieldId = field_id; field->field.Type = hpi_field->Type; field->field.ReadOnly = SAHPI_FALSE; hpi_field->ReadOnly = SAHPI_FALSE; field->field.Field.DataType = SAHPI_TL_TYPE_TEXT; field->field.Field.Language = SAHPI_LANG_ENGLISH; field->field.Field.DataLength = strlen ((char *)hpi_field->Field.Data) + 1; snprintf((char *)field->field.Field.Data, field->field.Field.DataLength, "%s", hpi_field->Field.Data); field->next_field = NULL; hpi_field->FieldId = field_id; return SA_OK; } /** * idr_field_add_by_id: * @oa_field: Pointer to field structure * @area_id: Identifier of the area to be added * @field_type: Type of IDR field * @field_data: pointer to field text content * @fied_id: field id to be added * * Purpose: * Adds an Inventory Data Repository(IDR) field with specified id to * Inventory data repository Area * * Detailed Description: * - Creates an IDR field of a specified type in an IDR area * Newly created field will be inserted at the proper position * If the field list is empty then the created field will become head * node (first field) for the field list * * Return values: * SA_OK - Normal case * SA_ERR_HPI_INVALID_PARAMS - Input parameters are not valid * SA_ERR_HPI_OUT_OF_MEMORY - Request failed due to insufficient memory **/ SaErrorT idr_field_add_by_id(struct oa_soap_field **head_field, SaHpiEntryIdT area_id, SaHpiIdrFieldTypeT field_type, char *field_data, SaHpiEntryIdT field_id) { struct oa_soap_field *field = NULL; struct oa_soap_field *temp_field = NULL; if (head_field == NULL || field_data == NULL || area_id == SAHPI_LAST_ENTRY || field_id == SAHPI_LAST_ENTRY) { err("Invalid parameter."); return SA_ERR_HPI_INVALID_PARAMS; } temp_field = *head_field; field = (struct oa_soap_field*)g_malloc0(sizeof(struct oa_soap_field)); if (!(field)) { err("OA SOAP out of memory"); return SA_ERR_HPI_OUT_OF_MEMORY; } /* Initialize the field with specified field type and ID */ field->field.AreaId = area_id; field->field.FieldId = field_id; field->field.Type = field_type; field->field.ReadOnly = SAHPI_FALSE; field->field.Field.DataType = SAHPI_TL_TYPE_TEXT; field->field.Field.Language = SAHPI_LANG_ENGLISH; field->field.Field.DataLength = strlen (field_data) + 1; snprintf((char *)field->field.Field.Data, field->field.Field.DataLength, "%s", field_data); /* Check whether the field list is empty or if the new field is * to be inserted before first field */ if (*head_field == NULL || (*head_field)->field.FieldId > field_id) { *head_field = field; (*head_field)->next_field = temp_field; } else { while (temp_field != NULL) { if ((temp_field->field.FieldId < field_id) && ((temp_field->next_field == NULL) || (temp_field->next_field->field.FieldId > field_id))) { field->next_field = temp_field->next_field; temp_field->next_field = field; break; } temp_field = temp_field->next_field; } } return SA_OK; } /** * idr_field_delete * @oa_field: Pointer to field structure * @field_id: Identifier of the IDR field * * Purpose: * Deletes an Inventory Data Repository(IDR) field from Inventory data * repository Area * * Detailed Description: * - Deleted an IDR field of a specified id if it exists in the area * list else an appropriate error will be returned * * Return values: * SA_OK - Normal case * SA_ERR_HPI_INVALID_PARAMS - On wrong parameters * SA_ERR_HPI_NOT_PRESENT - Requested object not present **/ SaErrorT idr_field_delete(struct oa_soap_field **oa_field, SaHpiEntryIdT field_id) { struct oa_soap_field *field = NULL, *tmp_field = NULL; if (oa_field == NULL) { err("Invalid parameter."); return SA_ERR_HPI_INVALID_PARAMS; } field = *oa_field; /* If field list is empty, then return an error */ if (field == NULL) { return SA_ERR_HPI_NOT_PRESENT; } else { /* Check whether specified field id matches with first field id */ if (field_id == field->field.FieldId) { tmp_field = field; /* If the specified IDR field is read only, then delete * will be failed and READ ONLY error will be returned */ if (field->field.ReadOnly == SAHPI_TRUE) { return SA_ERR_HPI_READ_ONLY; } field = field->next_field; *oa_field = field; g_free(tmp_field); return SA_OK; } /* Traverse the field list to find the specified IDR field */ while (field->next_field) { tmp_field = field->next_field; if (field_id == tmp_field->field.FieldId) { if (tmp_field->field.ReadOnly == SAHPI_TRUE) { return SA_ERR_HPI_READ_ONLY; } field->next_field = tmp_field->next_field; g_free(tmp_field); return SA_OK; } else { field = field->next_field; } } } return SA_ERR_HPI_NOT_PRESENT; } /** * idr_field_update * @oa_field: Pointer to field structure * @field: Field structure containing modification information * * Purpose: * Modifies an Inventory data repository field in Inventory data repository * Area * * Detailed Description: * - Sets an IDR field of a specified field contents if it exists * else an appropriate error will be returned * - Validation of the field content is not handled in OA SOAP plug-in * * Return values: * SA_OK - Normal case * SA_ERR_HPI_INVALID_PARAMS - On wrong parameters * SA_ERR_HPI_NOT_PRESENT - Requested object not present **/ SaErrorT idr_field_update(struct oa_soap_field *oa_field, SaHpiIdrFieldT *field) { if (oa_field == NULL) { return SA_ERR_HPI_NOT_PRESENT; } if (field == NULL) { err("Invalid parameter."); return SA_ERR_HPI_INVALID_PARAMS; } /* Traverse the field list to find the IDR field with specified id */ while (oa_field) { if (field->FieldId == oa_field->field.FieldId) { /* If the specified IDR field is read only, then delete * will be failed and READ ONLY error will be returned */ if (oa_field->field.ReadOnly == SAHPI_TRUE) { return SA_ERR_HPI_READ_ONLY; } /* Update the field contents with the new data */ oa_field->field.Type = field->Type; oa_field->field.Field.DataType = field->Field.DataType; oa_field->field.Field.Language = field->Field.Language; oa_field->field.Field.DataLength = field->Field.DataLength; memset (oa_field->field.Field.Data, 0, SAHPI_MAX_TEXT_BUFFER_LENGTH); snprintf((char *)oa_field->field.Field.Data, oa_field->field.Field.DataLength, "%s", field->Field.Data); return SA_OK; } else { oa_field = oa_field->next_field; } } return SA_ERR_HPI_NOT_PRESENT; } /** * fetch_idr_field * @inventory_info: Pointer to rdr private data * @area_id: Identifier of the area to be deleted * @field_type: Type of IDR field * @field_id: Identifier of the IDR field * @next_field_id: Identifier of the next IDR field of the requested type * @field: Pointer to field structure * * Purpose: * Gets an Inventory Data Repository(IDR) field from Inventory data * repository area * * Detailed Description: * - This function allows retrieval of an IDR field by one of * two ways: by field id regardless of type or by field type and id * - All fields within an IDR area can be retrieved by setting area type * as SAHPI_IDR_FIELDTYPE_UNSPECIFIED, field id set to SAHPI_FIRST_ENTRY * for the first call. For each subsequent call, the field id will be set * to the value returned in the next field id parameter, * this will work until next field id becomes SAHPI_LAST_ENTRY * - To retrieve all field of specific type, the above step is repeated * with the specified field type * * Return values: * SA_OK - Normal case * SA_ERR_HPI_INVALID_PARAMS - On wrong parameters * SA_ERR_HPI_NOT_PRESENT - Requested object not present **/ SaErrorT fetch_idr_field(struct oa_soap_inventory_info *inventory_info, SaHpiEntryIdT area_id, SaHpiIdrFieldTypeT field_type, SaHpiEntryIdT field_id, SaHpiEntryIdT *next_field_id, SaHpiIdrFieldT *field) { SaHpiInt32T i; struct oa_soap_area *local_area = NULL; struct oa_soap_field *local_field = NULL; SaHpiInt32T found = SAHPI_FALSE; SaHpiInt32T fieldFound = SAHPI_FALSE; if (inventory_info == NULL) { err("IDR not present"); return SA_ERR_HPI_NOT_PRESENT; } if (field == NULL || next_field_id == NULL) { err("Invalid parameter."); return SA_ERR_HPI_INVALID_PARAMS; } local_area = inventory_info->area_list; while (local_area != NULL) { if ((area_id == local_area->idr_area_head.AreaId)) { break; } local_area = local_area->next_area; } if (!local_area) { return SA_ERR_HPI_NOT_PRESENT; } local_field = local_area->field_list; /* Check whether field id is set to return all fields * (of a particular type if specified) */ if (field_id == SAHPI_FIRST_ENTRY) { i = 1; while ((i <= local_area->idr_area_head.NumFields) && (local_field != NULL)) { if (found == SAHPI_TRUE) { break; } if (field_type == SAHPI_IDR_FIELDTYPE_UNSPECIFIED || field_type == local_field->field.Type) { fieldFound = SAHPI_TRUE; memcpy(field, &local_field->field, sizeof(SaHpiIdrFieldT)); *next_field_id = SAHPI_LAST_ENTRY; while (local_field->next_field != NULL) { local_field = local_field->next_field; if (field_type == SAHPI_IDR_FIELDTYPE_UNSPECIFIED || field_type == local_field->field.Type) { *next_field_id = local_field-> field.FieldId; found = SAHPI_TRUE; break; } } break; } else { local_field = local_field->next_field; } i++; } } else { while (local_field != NULL) { if (found == SAHPI_TRUE) { break; } if ((field_id == local_field->field.FieldId)) { if (field_type == SAHPI_IDR_FIELDTYPE_UNSPECIFIED || field_type == local_field->field.Type) { fieldFound = SAHPI_TRUE; memcpy(field, &local_field->field, sizeof(SaHpiIdrFieldT)); *next_field_id = SAHPI_LAST_ENTRY; while (local_field->next_field != NULL) { local_field = local_field->next_field; if (field_type == SAHPI_IDR_FIELDTYPE_UNSPECIFIED || field_type == local_field->field.Type) { *next_field_id = local_field-> field.FieldId; found = SAHPI_TRUE; break; } } break; } else { break; } } local_field = local_field->next_field; } } if (fieldFound == SAHPI_FALSE) { return SA_ERR_HPI_NOT_PRESENT; } return SA_OK; } /* * free_inventory_info * @handler: Handler data pointer * @resource_id: Resource ID * * Purpose: * To delete the Areas and Fields present in * Inventory Data Repository(IDR) * * Detailed Description: * Get the IDR and traverse through each area and deletes the area. * If any error occours while deleting appropriate error is returned * * Return values: * SA_OK - Normal case * SA_ERR_HPI_INVALID_PARAMS - On wrong parameters * SA_ERR_HPI_NOT_PRESENT - Requested object not present */ SaErrorT free_inventory_info(struct oh_handler_state *handler, SaHpiResourceIdT resource_id) { SaErrorT rv = SA_OK; struct oa_soap_inventory *inventory; SaHpiEntryIdT area_id; SaHpiRdrT *rdr = NULL; if (handler == NULL) { err("Invalid parameter."); return SA_ERR_HPI_INVALID_PARAMS; } /* Get the inventory RDR */ rdr = oh_get_rdr_by_type(handler->rptcache, resource_id, SAHPI_INVENTORY_RDR, SAHPI_DEFAULT_INVENTORY_ID); if (rdr == NULL) { err("Inventory RDR is not found"); return SA_ERR_HPI_NOT_PRESENT; } inventory = (struct oa_soap_inventory *) oh_get_rdr_data(handler->rptcache, resource_id, rdr->RecordId); if (inventory == NULL) { err("No inventory data. IdrId=%s", rdr->IdString.Data); return SA_ERR_HPI_NOT_PRESENT; } /*Traverse through area list and delete the area*/ while (inventory->info.area_list) { area_id = inventory->info.area_list->idr_area_head.AreaId; rv = idr_area_delete(&(inventory->info.area_list), area_id); if (rv != SA_OK) { err("IDR Area delete failed"); return rv; } } return SA_OK; } /* * oa_soap_inv_set_field * @area : Pointer to the area list * @area_type : Type of the area * @field_type : Type of the field * @comment : Pointer to the data * * Purpose: * Generic function to set field data * * Detailed Description: * - Searches the field based on area type and field type. * - Assigns the field data with inventory information. * * Return values: * NONE */ static void oa_soap_inv_set_field(struct oa_soap_area *area_list, SaHpiIdrAreaTypeT area_type, SaHpiIdrFieldTypeT field_type, const char *data) { struct oa_soap_area *area; struct oa_soap_field *field; if (area_list == NULL) { err("Invalid parameter"); return; } /* Data can be NULL if the device is faulty */ if (data == NULL) { dbg("Can not set the field data for the field type %d", field_type); dbg("Data passed is NULL"); return; } area = area_list; /* Traverse the areas till we get area_type */ while (area) { if (area->idr_area_head.Type == area_type) { field = area->field_list; /* Traverse the fields till we get field_type */ while (field) { if (field->field.Type == field_type) { field->field.Field.DataLength = strlen(data) + 1; strcpy((char *) field->field.Field.Data, data); return; } field = field->next_field; } } area = area->next_area; } err("Failed to find the field type %d in area %d", field_type, area_type); return; } /* * oa_soap_add_inv_fields * @area : Pointer to the area * @field_list : Pointer to the field list in the global array * * Purpose: * Generic function add the fields to the area * * Detailed Description: * - Gets the number of fields from the area * - Allocates the memory for the field and constructs the field list * * Return values: * NONE */ static void oa_soap_add_inv_fields(struct oa_soap_area *area, const struct oa_soap_field field_array[]) { struct oa_soap_field **field; SaHpiInt32T i; if (area == NULL || field_array == NULL) { err("Invalid parameters"); return; } field = &(area->field_list); for (i = 0; i < area->idr_area_head.NumFields; i++) { *field = g_memdup(&(field_array[i].field), sizeof(struct oa_soap_field)); field = &((*field)->next_field); } return; } /* * oa_soap_add_inv_areas * @area : Pointer to the inventory structure * @resource_type : Resource type * * Purpose: * To add the areas to the area_list * * Detailed Description: * - Gets the number of areas from the IDR header * - Allocates the memory for the areas and constructs the area list * * Return values: * NONE */ static void oa_soap_add_inv_areas(struct oa_soap_inventory *inventory, SaHpiInt32T resource_type) { struct oa_soap_area **area; SaHpiInt32T i, num_areas; if (inventory == NULL) { err("Invalid parameter"); return; } /* Point to the location of the area_list pointer of inventory */ area = &(inventory->info.area_list); /* Get the number of areas supported for the resource type */ num_areas = oa_soap_inv_arr[resource_type].inventory.info.idr_info.NumAreas; for (i = 0; i < num_areas; i++) { *area = g_memdup(&(oa_soap_inv_arr[resource_type].area_array[i]. area), sizeof(struct oa_soap_area)); /* Add the fields to the newly added area */ oa_soap_add_inv_fields(*area, oa_soap_inv_arr[resource_type]. area_array[i].field_array); /* Point to the location of the next area pointer */ area = &((*area)->next_area); } return; } /* * oa_soap_build_inv * @oh_handler : Pointer to the handler * @resource_type : Resource type * @resource_id : Resource Id * @rdr : Pointer to the rdr structure * * Purpose: * Generic function to build the inventory RDR * * Detailed Description: * - Allocates the memory for inventory info * - Builds the area and field list from global inventory array * - Copies the inventory RDR information from global inventory array * - Pushes the inventory RDR to plugin rptcache * * Return values: * SA_OK - On success * SA_ERR_HPI_INVALID_PARAMS - On wrong parameters * SA_ERR_HPI_OUT_OF_MEMORY - On memory allocatin failure * SA_ERR_HPI_NOT_PRESENT - On wrong resource id */ static SaErrorT oa_soap_build_inv(struct oh_handler_state *oh_handler, SaHpiInt32T resource_type, SaHpiResourceIdT resource_id, struct oa_soap_inventory **inventory) { SaHpiRdrT rdr; SaHpiRptEntryT *rpt; SaErrorT rv; if (oh_handler == NULL || inventory == NULL) { err("Invalid parameters"); return SA_ERR_HPI_INVALID_PARAMS; } /* Get the rpt entry of the resource */ rpt = oh_get_resource_by_id(oh_handler->rptcache, resource_id); if (rpt == NULL) { err("resource RPT is NULL"); return SA_ERR_HPI_NOT_PRESENT; } /* Get the inventory from the global array */ *inventory = g_memdup(&(oa_soap_inv_arr[resource_type].inventory), sizeof(struct oa_soap_inventory)); if (*inventory == NULL) { err("Out of memory"); return SA_ERR_HPI_OUT_OF_MEMORY; } rdr = oa_soap_inv_arr[resource_type].rdr; rdr.Entity = rpt->ResourceEntity; /* Populate the areas */ oa_soap_add_inv_areas(*inventory, resource_type); rv = oh_add_rdr(oh_handler->rptcache, resource_id, &rdr, *inventory, 0); if (rv != SA_OK) { err("Failed to add rdr"); return rv; } return SA_OK; } /* * oa_soap_build_fz_inv * @oh_handler : Pointer to the handler * @resource_id : Resource Id * @fanZone : Pointer to structure fanZone * * Purpose: * Builds the inventory RDR for fan zone * * Detailed Description: * - Gets the fan inventory information * - Builds the inventory RDR * - Populates the device bays and fan bays * * Return values: * SA_OK - On success * SA_ERR_HPI_INVALID_PARAMS - On wrong parameters * SA_ERR_HPI_INERNAL_ERROR - On soap call failure */ SaErrorT oa_soap_build_fz_inv(struct oh_handler_state *oh_handler, SaHpiResourceIdT resource_id, struct fanZone *fan_zone) { SaErrorT rv; struct oa_soap_handler *oa_handler; struct oa_soap_inventory *inventory = NULL; char *temp, field_data[MAX_BUF_SIZE]; SaHpiInt32T len, write_size = OA_SOAP_MAX_FZ_NUM_SIZE + 1; struct fanInfo info; byte bay; if (oh_handler == NULL || fan_zone == NULL) { err("Invalid Parameters"); return SA_ERR_HPI_INVALID_PARAMS; } rv = oa_soap_build_inv(oh_handler, OA_SOAP_ENT_FZ, resource_id, &inventory); if (rv != SA_OK) { err("Building inventory RDR for Fan Zone failed"); return rv; } oa_handler = (struct oa_soap_handler *) oh_handler->data; /* Construct the device bays field data*/ /* Set the field_data to 0. This helps the strlen (5 lines down) to get * correct string length */ memset(field_data, 0, OA_SOAP_MAX_FZ_INV_SIZE); temp = field_data; while (fan_zone->deviceBayArray) { soap_deviceBayArray(fan_zone->deviceBayArray, &bay); /* Check whether we have reached the end of field_data array */ if ((strlen(field_data) + write_size) >= OA_SOAP_MAX_FZ_INV_SIZE) { err("The field_data size smaller, it may lead to " "potential memory overflow problem"); return SA_ERR_HPI_INTERNAL_ERROR; } snprintf(temp, write_size, "%d,", bay); /* Point the temp to end of data */ temp += strlen(temp); fan_zone->deviceBayArray = soap_next_node(fan_zone->deviceBayArray); } /* Remove the last ',' from data */ len = strlen(field_data); field_data[len - 1] = '\0'; /* Set the device bays field data */ oa_soap_inv_set_field(inventory->info.area_list, SAHPI_IDR_AREATYPE_OEM, OA_SOAP_INV_FZ_DEV_BAY, field_data); /* Construct the fan bays field data*/ /* Set the field_data to 0. This helps the strlen (5 lines down) to get * correct string length */ memset(field_data, 0, OA_SOAP_MAX_FZ_INV_SIZE); temp = field_data; while (fan_zone->fanInfoArray) { soap_fanInfo(fan_zone->fanInfoArray, &info); /* Check whether we have reached the end of field_data array */ if ((strlen(field_data) + write_size) >= OA_SOAP_MAX_FZ_INV_SIZE) { err("The field_data size smaller, it may lead to " "potential memory overflow problem"); return SA_ERR_HPI_INTERNAL_ERROR; } snprintf(temp, write_size, "%d,", info.bayNumber); /* Point the temp to end of data */ temp += strlen(temp); fan_zone->fanInfoArray = soap_next_node(fan_zone->fanInfoArray); } /* Remove the last ',' from data */ len = strlen(field_data); field_data[len - 1] = '\0'; /* Set the fan bays field data */ oa_soap_inv_set_field(inventory->info.area_list, SAHPI_IDR_AREATYPE_OEM, OA_SOAP_INV_FZ_FAN_BAY, field_data); return SA_OK; } /* * oa_soap_build_fan_inv * @oh_handler : Pointer to the handler * @resource_id : Resource Id * @fan_info : Pointer to fanInfo structure * * Purpose: * Builds the inventory RDR for fan * * Detailed Description: * - Gets the fan inventory information * - Builds the inventory RDR * - Populates the inventory info with product name, part number, serial * number, primary fan zone, secondary fan zone and shared status * * Return values: * SA_OK - On success * SA_ERR_HPI_INVALID_PARAMS - On wrong parameters * SA_ERR_HPI_INERNAL_ERROR - On soap call failure */ SaErrorT oa_soap_build_fan_inv(struct oh_handler_state *oh_handler, SaHpiResourceIdT resource_id, struct fanInfo *fan_info) { SaErrorT rv; struct oa_soap_handler *oa_handler; struct oa_soap_inventory *inventory = NULL; char field_data[OA_SOAP_MAX_FZ_INV_SIZE]; SaHpiInt32T slot; if (oh_handler == NULL || fan_info == NULL) { err("Invalid Parameters"); return SA_ERR_HPI_INVALID_PARAMS; } oa_handler = (struct oa_soap_handler *) oh_handler->data; rv = oa_soap_build_inv(oh_handler, OA_SOAP_ENT_FAN, resource_id, &inventory); if (rv != SA_OK) { err("Building inventory RDR for Fan failed"); return rv; } /* Set the product name */ oa_soap_inv_set_field(inventory->info.area_list, SAHPI_IDR_AREATYPE_PRODUCT_INFO, SAHPI_IDR_FIELDTYPE_PRODUCT_NAME, fan_info->name); /* Set the part number */ oa_soap_inv_set_field(inventory->info.area_list, SAHPI_IDR_AREATYPE_BOARD_INFO, SAHPI_IDR_FIELDTYPE_PART_NUMBER, fan_info->partNumber); /* Set the serial number */ oa_soap_inv_set_field(inventory->info.area_list, SAHPI_IDR_AREATYPE_PRODUCT_INFO, SAHPI_IDR_FIELDTYPE_SERIAL_NUMBER, fan_info->serialNumber); memset(field_data, 0, OA_SOAP_MAX_FZ_INV_SIZE); slot = fan_info->bayNumber; /* Construct the fan shared field data */ if (oa_soap_fz_map_arr[oa_handler->enc_type][slot].shared == SAHPI_TRUE) strcpy(field_data, "Shared=TRUE"); else strcpy(field_data, "Shared=FALSE"); /* Set the fan shared field */ oa_soap_inv_set_field(inventory->info.area_list, SAHPI_IDR_AREATYPE_OEM, OA_SOAP_INV_FAN_SHARED, field_data); /* Construct the fan zone number field data */ memset(field_data, 0, OA_SOAP_MAX_FZ_INV_SIZE); if (oa_soap_fz_map_arr[oa_handler->enc_type][slot].secondary_zone) { snprintf(field_data, 13, "Fan Zone=%d,%d", oa_soap_fz_map_arr[oa_handler->enc_type][slot].zone, oa_soap_fz_map_arr[oa_handler->enc_type][slot]. secondary_zone); } else { snprintf(field_data, 11, "Fan Zone=%d", oa_soap_fz_map_arr[oa_handler->enc_type][slot].zone); } /* Set the shared field */ oa_soap_inv_set_field(inventory->info.area_list, SAHPI_IDR_AREATYPE_OEM, OA_SOAP_INV_FZ_NUM, field_data); return SA_OK; } /* * oa_soap_build_lcd_inv * @oh_handler : Pointer to the handler * @resource_id : Resource Id * * Purpose: * Builds the inventory RDR for LCD * * Detailed Description: * - Gets the LCD inventory information * - Builds the inventory RDR * - Populates the inventory info with product name, manufacturer name, * part number and firmware version * * Return values: * SA_OK - On success * SA_ERR_HPI_INVALID_PARAMS - On wrong parameters * SA_ERR_HPI_INERNAL_ERROR - On soap call failure */ SaErrorT oa_soap_build_lcd_inv(struct oh_handler_state *oh_handler, SaHpiResourceIdT resource_id) { SaErrorT rv; struct oa_soap_handler *oa_handler; struct oa_soap_inventory *inventory = NULL; struct lcdInfo info; if (oh_handler == NULL) { err("Invalid Parameters"); return SA_ERR_HPI_INVALID_PARAMS; } rv = oa_soap_build_inv(oh_handler, OA_SOAP_ENT_LCD, resource_id, &inventory); if (rv != SA_OK) { err("Building inventory RDR for LCD failed"); return rv; } oa_handler = (struct oa_soap_handler *) oh_handler->data; /* Get the LCD info */ rv = soap_getLcdInfo(oa_handler->active_con, &info); if (rv != SOAP_OK) { err("Get LCD Info SOAP call has failed"); return SA_ERR_HPI_INTERNAL_ERROR; } /* Set the product name */ oa_soap_inv_set_field(inventory->info.area_list, SAHPI_IDR_AREATYPE_PRODUCT_INFO, SAHPI_IDR_FIELDTYPE_PRODUCT_NAME, info.name); /* Set the manufacturer name */ oa_soap_inv_set_field(inventory->info.area_list, SAHPI_IDR_AREATYPE_PRODUCT_INFO, SAHPI_IDR_FIELDTYPE_MANUFACTURER, info.manufacturer); /* Set the part number */ oa_soap_inv_set_field(inventory->info.area_list, SAHPI_IDR_AREATYPE_BOARD_INFO, SAHPI_IDR_FIELDTYPE_PART_NUMBER, info.partNumber); /* Set the firmware version */ oa_soap_inv_set_field(inventory->info.area_list, SAHPI_IDR_AREATYPE_PRODUCT_INFO, SAHPI_IDR_FIELDTYPE_PRODUCT_VERSION, info.fwVersion); return SA_OK; } void * oh_get_idr_info(void *, SaHpiResourceIdT, SaHpiIdrIdT, SaHpiIdrInfoT) __attribute__ ((weak, alias("oa_soap_get_idr_info"))); void * oh_get_idr_area_header(void *, SaHpiResourceIdT, SaHpiIdrIdT, SaHpiIdrAreaTypeT, SaHpiEntryIdT, SaHpiEntryIdT, SaHpiIdrAreaHeaderT) __attribute__ ((weak, alias("oa_soap_get_idr_area_header"))); void * oh_add_idr_area(void *, SaHpiResourceIdT, SaHpiIdrIdT, SaHpiIdrAreaTypeT, SaHpiEntryIdT) __attribute__ ((weak, alias("oa_soap_add_idr_area"))); void * oh_add_idr_area_id(void *, SaHpiResourceIdT, SaHpiIdrIdT, SaHpiIdrAreaTypeT, SaHpiEntryIdT) __attribute__ ((weak, alias("oa_soap_add_idr_area_by_id"))); void * oh_del_idr_area(void *, SaHpiResourceIdT, SaHpiIdrIdT, SaHpiEntryIdT) __attribute__ ((weak, alias("oa_soap_del_idr_area"))); void * oh_get_idr_field(void *, SaHpiResourceIdT, SaHpiIdrIdT, SaHpiEntryIdT, SaHpiIdrFieldTypeT, SaHpiEntryIdT, SaHpiEntryIdT, SaHpiIdrFieldT) __attribute__ ((weak, alias("oa_soap_get_idr_field"))); void * oh_add_idr_field(void *, SaHpiResourceIdT, SaHpiIdrIdT, SaHpiIdrFieldT) __attribute__ ((weak, alias("oa_soap_add_idr_field"))); void * oh_add_idr_field_id(void *, SaHpiResourceIdT, SaHpiIdrIdT, SaHpiIdrFieldT) __attribute__ ((weak, alias("oa_soap_add_idr_field_by_id"))); void * oh_set_idr_field(void *, SaHpiResourceIdT, SaHpiIdrIdT, SaHpiIdrFieldT) __attribute__ ((weak, alias("oa_soap_set_idr_field"))); void * oh_del_idr_field(void *, SaHpiResourceIdT, SaHpiIdrIdT, SaHpiEntryIdT, SaHpiEntryIdT) __attribute__ ((weak, alias("oa_soap_del_idr_field"))); openhpi-2.14.1/plugins/oa_soap/oa_soap_lcd_event.c0000644000076400007640000000706411302566663017122 0ustar /* * Copyright (C) 2008, Hewlett-Packard Development Company, LLP * All rights reserved. * * 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. * * Neither the name of the Hewlett-Packard Corporation, nor the names * of its contributors may be used to endorse or promote products * derived from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * Author(s) * Raghavendra P.G. * * This file has the LCD related events handling * * oa_soap_proc_lcd_status() - Processes the LCD status event * */ #include "oa_soap_lcd_event.h" /** * oa_soap_proc_lcd_status * @oh_handler: Pointer to openhpi handler structure * @con: Pointer to soap client con object * @event: Pointer to the openhpi event structure * * Purpose: * Processes the LCD status event * * Detailed Description: NA * * Return values: * NONE **/ void oa_soap_proc_lcd_status(struct oh_handler_state *oh_handler, struct lcdStatus *status) { SaErrorT rv = SA_OK; SaHpiResourceIdT resource_id; struct oa_soap_handler *oa_handler; if (oh_handler == NULL || status == NULL) { err("wrong parameters passed"); return; } oa_handler = (struct oa_soap_handler *) oh_handler->data; resource_id = oa_handler->oa_soap_resources.lcd_rid; /* Process the operational status sensor */ OA_SOAP_PROCESS_SENSOR_EVENT(OA_SOAP_SEN_OPER_STATUS, status->status, 0, 0) /* Process the predictive failure status sensor */ OA_SOAP_PROCESS_SENSOR_EVENT(OA_SOAP_SEN_PRED_FAIL, status->status, 0, 0) /* Process the internal data error sensor */ OA_SOAP_PROCESS_SENSOR_EVENT(OA_SOAP_SEN_INT_DATA_ERR, status->diagnosticChecks.internalDataError, 0, 0) /* Process the device failure sensor */ OA_SOAP_PROCESS_SENSOR_EVENT(OA_SOAP_SEN_DEV_FAIL, status->diagnosticChecks.deviceFailure, 0, 0) /* Process the device degraded sensor */ OA_SOAP_PROCESS_SENSOR_EVENT(OA_SOAP_SEN_DEV_DEGRAD, status->diagnosticChecks.deviceDegraded, 0, 0) /* Process the enclosure overall operational status sensor */ OA_SOAP_PROCESS_SENSOR_EVENT(OA_SOAP_SEN_ENC_AGR_OPER, status->lcdSetupHealth, 0, 0) /* Process enclosure overall predictive failure sensor */ OA_SOAP_PROCESS_SENSOR_EVENT(OA_SOAP_SEN_ENC_AGR_PRED_FAIL, status->lcdSetupHealth, 0, 0) return; } openhpi-2.14.1/plugins/oa_soap/oa_soap_enclosure_event.h0000644000076400007640000000363411302566663020363 0ustar /* * Copyright (C) 2008, Hewlett-Packard Development Company, LLP * All rights reserved. * * 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. * * Neither the name of the Hewlett-Packard Corporation, nor the names * of its contributors may be used to endorse or promote products * derived from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * Author(s) * Raghavendra P.G. */ #ifndef _OA_SOAP_ENCLOSURE_EVENT_H #define _OA_SOAP_ENCLOSURE_EVENT_H /* Include files */ #include "oa_soap_discover.h" #include void oa_soap_proc_enc_status(struct oh_handler_state *oh_handler, struct enclosureStatus *status); #endif openhpi-2.14.1/plugins/oa_soap/oa_soap_reset.h0000644000076400007640000000417611302566664016310 0ustar /* * Copyright (C) 2007-2008, Hewlett-Packard Development Company, LLP * All rights reserved. * * 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. * * Neither the name of the Hewlett-Packard Corporation, nor the names * of its contributors may be used to endorse or promote products * derived from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * Author(s) * Raghavendra P.G. */ #ifndef _OA_SOAP_RESET_H #define _OA_SOAP_RESET_H /* Include files */ #include "oa_soap_utils.h" #include "oa_soap_power.h" SaErrorT oa_soap_get_reset_state(void *oh_handler, SaHpiResourceIdT resource_id, SaHpiResetActionT *action); SaErrorT oa_soap_set_reset_state(void *oh_handler, SaHpiResourceIdT resource_id, SaHpiResetActionT action); #endif openhpi-2.14.1/plugins/oa_soap/oa_soap_sensor.c0000644000076400007640000030443311302566663016470 0ustar /* * Copyright (C) 2007-2008, Hewlett-Packard Development Company, LLP * All rights reserved. * * 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. * * Neither the name of the Hewlett-Packard Corporation, nor the names * of its contributors may be used to endorse or promote products * derived from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * Author(s) * Raghavendra M.S. * Shuah Khan * Raghavendra P.G. * * This file supports the functions related to HPI Sensor. * The file covers three general classes of function: Sensor ABI functions, * Build functions for creating sensor RDRs for resources and sensor specific * functions for generating sensor enable and thermal events * * Sensor ABI functions: * * oa_soap_get_sensor_reading() - Gets the sensor reading of resource * * oa_soap_get_sensor_thresholds() - Retreives sensor's threshold values, * if defined * * oa_soap_get_sensor_enable() - Retrieves sensor's boolean enablement * status * * oa_soap_set_sensor_enable() - Sets sensor's boolean enablement * status * * oa_soap_get_sensor_event_enable()- Retrieves sensor's boolean event * enablement status * * oa_soap_set_sensor_event_enable()- Sets sensor's boolean event * enablement status * * oa_soap_get_sensor_event_masks()- Retrieves sensor's assert and * deassert event masks * * oa_soap_set_sensor_event_masks()- Sets sensor's assert and deassert * event masks * Build functions: * update_sensor_rdr() - Returns current status of the sensor * RDR from resource * * generate_sensor_assert_thermal_event()- Builds and generates the sensor * assert thermal event * * generate_sensor_deassert_thermal_event()- Builds and generates the * sensor deassert thermal event * * check_and_deassert_event() - Checks and deasserts the pending * events on resource * * oa_soap_build_sen_rdr() - Builds the sensor * * oa_soap_map_sen_value() - Maps the OA sensor value to HPI sensor * value * * oa_soap_gen_sen_evt() - Generates the HPI sensor event * * oa_soap_gen_res_evt() - Generates the HPI resource event * * oa_soap_proc_sen_evt() - Processes the sensor event * * oa_soap_map_thresh_resp() - Maps the OA threshold sensor value to * HPI sensor states * * oa_soap_assert_sen_evt() - Generates the assert sensor event * * oa_soap_get_bld_thrm_sen_data - Retrieves the matching * bladeThermalInfo structure instance * from bladeThermalInfoArrayResponse * response */ #include "oa_soap_sensor.h" #include "oa_soap_resources.h" /* Forward declarations of static functions */ static SaErrorT oa_soap_gen_sen_evt(struct oh_handler_state *oh_handler, SaHpiRptEntryT *rpt, SaHpiRdrT *rdr, SaHpiInt32T sensor_status, SaHpiFloat64T trigger_reading, SaHpiFloat64T trigger_threshold); static void oa_soap_gen_res_evt(struct oh_handler_state *oh_handler, SaHpiRptEntryT *rpt, SaHpiInt32T sensor_status); /** * oa_soap_get_sensor_reading * @oh_handler: Handler data pointer * @resource_id: Resource ID * @rdr_num: Sensor rdr number * @data: Structure for receiving sensor reading values * @state: Structure for receiving sensor event states * * Purpose: * Gets the sensor reading * * Detailed Description: * - Fetches sensor info structure from the private data area of * sensor rdr of specified rdr number * - If the sensor is enabled for reading, then current reading is * retrieved from the resource directly through soap call * * Return values: * SA_OK - Normal case * SA_ERR_HPI_INVALID_PARAMS - On wrong parameters * SA_ERR_HPI_INVALID_RESOURCE - Invalid resource id specified * SA_ERR_HPI_CAPABILITY - Resource doesn't have SAHPI_CAPABILITY_SENSOR * SA_ERR_HPI_NOT_PRESENT - RDR is not present * SA_ERR_HPI_INTERNAL_ERROR - oa_soap plugin has encountered an internal * error * SA_ERR_HPI_INVALID_REQUEST - Resource has the sensor disabled * SA_ERR_HPI_UNKNOWN - Invalid entity type. **/ SaErrorT oa_soap_get_sensor_reading(void *oh_handler, SaHpiResourceIdT resource_id, SaHpiSensorNumT rdr_num, SaHpiSensorReadingT *data, SaHpiEventStateT *state) { SaErrorT rv = SA_OK; struct oh_handler_state *handler = NULL; struct oa_soap_handler *oa_handler = NULL; struct oa_soap_sensor_reading_data sensor_data; struct oa_soap_sensor_info *sensor_info = NULL; SaHpiRptEntryT *rpt = NULL; SaHpiRdrT *rdr = NULL; if (oh_handler == NULL || state == NULL || data == NULL) { err("Invalid paramters"); return SA_ERR_HPI_INVALID_PARAMS; } handler = (struct oh_handler_state *) oh_handler; oa_handler = (struct oa_soap_handler *) handler->data; rv = lock_oa_soap_handler(oa_handler); if (rv != SA_OK) { err("OA SOAP handler is locked"); return rv; } rpt = oh_get_resource_by_id(handler->rptcache, resource_id); if (rpt == NULL) { err("INVALID RESOURCE"); return SA_ERR_HPI_INVALID_RESOURCE; } if (! (rpt->ResourceCapabilities & SAHPI_CAPABILITY_SENSOR)) { err("INVALID RESOURCE CAPABILITY"); return SA_ERR_HPI_CAPABILITY; } /* Retrieve sensor rdr from framework of specified rdr number */ rdr = oh_get_rdr_by_type(handler->rptcache, resource_id, SAHPI_SENSOR_RDR, rdr_num); if (rdr == NULL) { err("RDR not present"); return SA_ERR_HPI_NOT_PRESENT; } /* Retrieve sensor_info structure from the private area of rdr */ sensor_info = (struct oa_soap_sensor_info*) oh_get_rdr_data(handler->rptcache, resource_id, rdr->RecordId); if (sensor_info == NULL) { err("No sensor data. Sensor=%s", rdr->IdString.Data); return SA_ERR_HPI_INTERNAL_ERROR; } /* Check whether sensor is enabled */ if (sensor_info->sensor_enable == SAHPI_FALSE) { err("Sensor not enabled"); return(SA_ERR_HPI_INVALID_REQUEST); } /* Check whether the reading is supported or not */ if (rdr->RdrTypeUnion.SensorRec.DataFormat.IsSupported == SAHPI_FALSE) { data->IsSupported = SAHPI_FALSE; *state = sensor_info->current_state; dbg("sensor reading is not supported"); return SA_OK; } /* Fetch current reading of the sensor from the resource */ rv = update_sensor_rdr(handler, resource_id, rdr_num, rpt, &sensor_data); if (rv != SA_OK) { return rv; } /* Populate the return data with current sensor reading */ data->IsSupported = sensor_data.data.IsSupported; data->Type = sensor_data.data.Type; data->Value = sensor_data.data.Value; *state = sensor_info->current_state; return SA_OK; } /** * oa_soap_get_sensor_thresholds * @oh_handler: Handler data pointer * @resource_id: Resource ID * @rdr_num: Sensor rdr number * @threshold: Location to store sensor's threshold values * * Purpose: * Retrieves sensor's threshold values, if defined * * Detailed Description: * - Fetches sensor info structure from the private data area of * sensor rdr of specified rdr number * - Threshold details are returned if the event category of the sensor * is set to threshold type * * Return values: * SA_OK - Normal case * SA_ERR_HPI_INVALID_PARAMS - On wrong parameters * SA_ERR_HPI_INVALID_RESOURCE - Invalid resource id specified * SA_ERR_HPI_CAPABILITY - Resource doesn't have SAHPI_CAPABILITY_SENSOR * SA_ERR_HPI_NOT_PRESENT - RDR is not present * SA_ERR_HPI_INTERNAL_ERROR - oa_soap plugin has encountered an internal * error. * SA_ERR_HPI_INVALID_CMD - Sensor not of threshold type, or is not enabled * for reading **/ SaErrorT oa_soap_get_sensor_thresholds(void *oh_handler, SaHpiResourceIdT resource_id, SaHpiSensorNumT rdr_num, SaHpiSensorThresholdsT *threshold) { struct oh_handler_state *handler = NULL; SaHpiRptEntryT *rpt = NULL; SaHpiRdrT *rdr = NULL; struct oa_soap_sensor_info *sensor_info=NULL; if (oh_handler == NULL || threshold == NULL) { err("Invalid paramters"); return SA_ERR_HPI_INVALID_PARAMS; } handler = (struct oh_handler_state *) oh_handler; rpt = oh_get_resource_by_id(handler->rptcache, resource_id); if (rpt == NULL) { err("INVALID RESOURCE"); return SA_ERR_HPI_INVALID_RESOURCE; } if (! (rpt->ResourceCapabilities & SAHPI_CAPABILITY_SENSOR)) { err("INVALID RESOURCE CAPABILITY"); return SA_ERR_HPI_CAPABILITY; } /* Retrieve sensor rdr from framework of specified rdr number */ rdr = oh_get_rdr_by_type(handler->rptcache, resource_id, SAHPI_SENSOR_RDR, rdr_num); if (rdr == NULL) { err("RDR not present"); return SA_ERR_HPI_NOT_PRESENT; } /* Retrieve sensor_info structure from the private area of rdr */ sensor_info = (struct oa_soap_sensor_info*) oh_get_rdr_data(handler->rptcache, resource_id, rdr->RecordId); if (sensor_info == NULL) { err("No sensor data. Sensor=%s", rdr->IdString.Data); return SA_ERR_HPI_INTERNAL_ERROR; } /* Sensor supporting threshold shall have their event category set to * threshold type. Threshold of a sensor is fetched only if the * sensor event category value = SAHPI_EC_THRESHOLD */ if (rdr->RdrTypeUnion.SensorRec.Category != SAHPI_EC_THRESHOLD || rdr->RdrTypeUnion.SensorRec.ThresholdDefn.IsAccessible == SAHPI_FALSE || rdr->RdrTypeUnion.SensorRec.ThresholdDefn.ReadThold == 0) { err("Invalid command"); return SA_ERR_HPI_INVALID_CMD; } /* setting the return value with the threshold value from the * sensor info strucutre */ *threshold = sensor_info->threshold; return SA_OK; } /** * oa_soap_set_sensor_thresholds * @oh_handler: Handler data pointer * @resource_id: Resource ID * @rdr_num: Sensor rdr number * @threshold: Location to store sensor's threshold values * * Purpose: * Sets sensor's threshold values * * Detailed Description: * - The threshold values supported by HP BladeSystem cClass for different * resource such as thermal limits, fan speed limits are not enabled for * modifications * * Return values: * SA_ERR_HPI_UNSUPPORTED_API - oa_soap plugin does not support this API **/ SaErrorT oa_soap_set_sensor_thresholds(void *oh_handler, SaHpiResourceIdT resource_id, SaHpiSensorNumT rdr_num, const SaHpiSensorThresholdsT *threshold) { err("oa_soap set sensor thresholds not supported"); return SA_ERR_HPI_UNSUPPORTED_API; } /** * oa_soap_get_sensor_enable * @oh_handler: Handler data pointer * @resource_id: Resource ID * @rdr_num: Sensor rdr number * @enable: Location to store sensor's enablement boolean * * Purpose: * Retrieves a sensor's boolean enablement status * * Detailed Description: * * - Fetches sensor info structure from the private data area of * sensor rdr of specified rdr number * - Sensor enable status is returned from sensor info structure * Sensor enable status determines whether the sensor is enabled for * reading is retrieved from the sensor info structure * * Return values: * SA_OK - Normal case. * SA_ERR_HPI_INVALID_PARAMS - On wrong parameters * SA_ERR_HPI_INVALID_RESOURCE - Invalid resource id specified * SA_ERR_HPI_CAPABILITY - Resource doesn't have SAHPI_CAPABILITY_SENSOR * SA_ERR_HPI_NOT_PRESENT - RDR is not present * SA_ERR_HPI_INTERNAL_ERROR - oa_soap plugin has encountered an internal * error. **/ SaErrorT oa_soap_get_sensor_enable(void *oh_handler, SaHpiResourceIdT resource_id, SaHpiSensorNumT rdr_num, SaHpiBoolT *enable) { struct oh_handler_state *handler = NULL; SaHpiRptEntryT *rpt = NULL; SaHpiRdrT *rdr = NULL; struct oa_soap_sensor_info *sensor_info=NULL; if (oh_handler == NULL || enable == NULL) { err("Invalid paramters"); return SA_ERR_HPI_INVALID_PARAMS; } handler = (struct oh_handler_state *) oh_handler; rpt = oh_get_resource_by_id(handler->rptcache, resource_id); if (rpt == NULL) { err("INVALID RESOURCE"); return SA_ERR_HPI_INVALID_RESOURCE; } if (! (rpt->ResourceCapabilities & SAHPI_CAPABILITY_SENSOR)) { err("INVALID RESOURCE CAPABILITY"); return SA_ERR_HPI_CAPABILITY; } /* Retrieve sensor rdr from framework of specified rdr number */ rdr = oh_get_rdr_by_type(handler->rptcache, resource_id, SAHPI_SENSOR_RDR, rdr_num); if (rdr == NULL) { err("RDR not present"); return SA_ERR_HPI_NOT_PRESENT; } /* Retrieve sensor_info structure from the private area of rdr */ sensor_info = (struct oa_soap_sensor_info*) oh_get_rdr_data(handler->rptcache, resource_id, rdr->RecordId); if (sensor_info == NULL) { err("No sensor data. Sensor=%s", rdr->IdString.Data); return SA_ERR_HPI_INTERNAL_ERROR; } /* setting the return value with the sensor enable status * from the sensor info strucutre */ *enable = sensor_info->sensor_enable; return SA_OK; } /** * oa_soap_set_sensor_enable * @oh_handler: Handler data pointer * @resource_id: Resource ID * @rdr_num: Sensor rdr number * @enable: Location to store sensor's enablement boolean * * Purpose: * Sets a sensor's boolean enablement status * * Detailed Description: * - Fetches sensor info structure from the private data area of * sensor rdr of specified rdr number * - Sensor enable status in sensor info structure is updated * with enable parameter value if it is different. * Sensor enable status determines whether the sensor is enabled for * reading * - If there is a change in sensor enable status value, then * "Sensor enable change" event is generated to report the change to * framework * * Return values: * SA_OK - Normal case * SA_ERR_HPI_INVALID_PARAMS - On wrong parameters * SA_ERR_HPI_INVALID_RESOURCE - Invalid resource id specified * SA_ERR_HPI_CAPABILITY - Resource doesn't have SAHPI_CAPABILITY_SENSOR * SA_ERR_HPI_NOT_PRESENT - RDR is not present * SA_ERR_HPI_INTERNAL_ERROR - oa_soap plugin has encountered an internal * error * SA_ERR_HPI_INVALID_STATE - The blade is in invalid state **/ SaErrorT oa_soap_set_sensor_enable(void *oh_handler, SaHpiResourceIdT resource_id, SaHpiSensorNumT rdr_num, SaHpiBoolT enable) { SaErrorT rv = SA_OK; struct oh_handler_state *handler = NULL; SaHpiRptEntryT *rpt = NULL; SaHpiRdrT *rdr = NULL; struct oa_soap_sensor_info *sensor_info=NULL; if (oh_handler == NULL) { err("Invalid paramters"); return SA_ERR_HPI_INVALID_PARAMS; } handler = (struct oh_handler_state *) oh_handler; rpt = oh_get_resource_by_id(handler->rptcache, resource_id); if (rpt == NULL) { err("INVALID RESOURCE"); return SA_ERR_HPI_INVALID_RESOURCE; } if (! (rpt->ResourceCapabilities & SAHPI_CAPABILITY_SENSOR)) { err("INVALID RESOURCE CAPABILITY"); return SA_ERR_HPI_CAPABILITY; } /* Retrieve sensor rdr from framework of specified rdr number */ rdr = oh_get_rdr_by_type(handler->rptcache, resource_id, SAHPI_SENSOR_RDR, rdr_num); if (rdr == NULL) { err("RDR not present"); return SA_ERR_HPI_NOT_PRESENT; } if (rdr->RdrTypeUnion.SensorRec.EnableCtrl == SAHPI_TRUE) { /* Retrieve sensor_info structure from the private area * of rdr */ sensor_info = (struct oa_soap_sensor_info*) oh_get_rdr_data(handler->rptcache, resource_id, rdr->RecordId); if (sensor_info == NULL) { err("No sensor data. Sensor=%s", rdr->IdString.Data); return SA_ERR_HPI_INTERNAL_ERROR; } /* The thermal sensors of the blade resource should not be * enabled if the resource is in power off/degraded state. * TODO: Since the "EnableCtrl" field in rdr cannot be changed * after the discovery of the blade, provided below is * workaround logic until OpenHPI migrates to HPI-B.03.01 * specification */ if ((rdr->Entity.Entry[0].EntityType == SAHPI_ENT_SYSTEM_BLADE) || (rdr->Entity.Entry[0].EntityType == SAHPI_ENT_IO_BLADE) || (rdr->Entity.Entry[0].EntityType == SAHPI_ENT_DISK_BLADE)) { if ((rdr_num == OA_SOAP_SEN_TEMP_STATUS) || ((rdr_num >= OA_SOAP_BLD_THRM_SEN_START) && (rdr_num <= OA_SOAP_BLD_THRM_SEN_END))) { if (oa_soap_bay_pwr_status[ rpt->ResourceEntity.Entry[0]. EntityLocation -1] != SAHPI_POWER_ON) { err("Sensor enable operation cannot" " be performed"); return SA_ERR_HPI_INVALID_STATE; } } } if (sensor_info->sensor_enable != enable) { /* Update the sensor enable status with new value and * report the change to the framework through the * sensor enable event */ sensor_info->sensor_enable = enable; rv = generate_sensor_enable_event(oh_handler, rdr_num, rpt, rdr, sensor_info); if (rv != SA_OK) { err("Event generation failed"); return rv; } } } else { err("Sensor does not support changing the enable status"); return SA_ERR_HPI_READ_ONLY; } return SA_OK; } /** * oa_soap_get_sensor_event_enable * @oh_handler: Handler data pointer * @resource_id: Resource ID * @rdr_num: Sensor rdr number * @enable: Location to store sensor's enablement boolean * * Purpose: * Retrieves a sensor's boolean event enablement status * * Detailed Description: * - Fetches sensor info structure from the private data area of * sensor rdr of specified rdr number * - Sensor event enable status is returned from sensor info structure. * Sensor event enable status determines whether the sensor is enabled * for raising events is retrieved from sensor info structure * * Return values: * SA_OK - Normal case * SA_ERR_HPI_INVALID_PARAMS - On wrong parameters * SA_ERR_HPI_INVALID_RESOURCE - Invalid resource id specified * SA_ERR_HPI_CAPABILITY - Resource doesn't have SAHPI_CAPABILITY_SENSOR * SA_ERR_HPI_NOT_PRESENT - RDR is not present * SA_ERR_HPI_INTERNAL_ERROR - oa_soap plugin has encountered an internal * error **/ SaErrorT oa_soap_get_sensor_event_enable(void *oh_handler, SaHpiResourceIdT resource_id, SaHpiSensorNumT rdr_num, SaHpiBoolT *enable) { struct oh_handler_state *handler = NULL; SaHpiRptEntryT *rpt = NULL; SaHpiRdrT *rdr = NULL; struct oa_soap_sensor_info *sensor_info=NULL; if (oh_handler == NULL || enable == NULL) { err("Invalid paramters"); return SA_ERR_HPI_INVALID_PARAMS; } handler = (struct oh_handler_state *) oh_handler; rpt = oh_get_resource_by_id(handler->rptcache, resource_id); if (rpt == NULL) { err("INVALID RESOURCE"); return SA_ERR_HPI_INVALID_RESOURCE; } if (! (rpt->ResourceCapabilities & SAHPI_CAPABILITY_SENSOR)) { err("INVALID RESOURCE CAPABILITY"); return SA_ERR_HPI_CAPABILITY; } /* Retrieve sensor rdr from framework of specified rdr number */ rdr = oh_get_rdr_by_type(handler->rptcache, resource_id, SAHPI_SENSOR_RDR, rdr_num); if (rdr == NULL) { err("RDR not present"); return SA_ERR_HPI_NOT_PRESENT; } /* Retrieve sensor_info structure from the private area of rdr */ sensor_info = (struct oa_soap_sensor_info*) oh_get_rdr_data(handler->rptcache, resource_id, rdr->RecordId); if (sensor_info == NULL) { err("No sensor data. Sensor=%s", rdr->IdString.Data); return SA_ERR_HPI_INTERNAL_ERROR; } *enable = sensor_info->event_enable; return SA_OK; } /** * oa_soap_set_sensor_event_enable * @oh_handler: Handler data pointer * @resource_id: Resource ID * @rdr_num: Sensor rdr number * @enable: Location to store sensor's enablement boolean * * Purpose: * Sets a sensor's boolean event enablement status * * Detailed Description: * - Fetches sensor info structure from the private data area of * sensor rdr of specified rdr number * - Sensor event enable status in sensor info structure is updated * with enable parameter value if it is different * - Sensor event enable status determines whether the sensor is enabled * for raising events * - If there is a change in sensor event enable status value, then * "Sensor enable change" event is generated to report the change to * framework * * Return values: * SA_OK - Normal case * SA_ERR_HPI_INVALID_PARAMS - On wrong parameters * SA_ERR_HPI_INVALID_RESOURCE - Invalid resource id specified * SA_ERR_HPI_CAPABILITY - Resource doesn't have SAHPI_CAPABILITY_SENSOR * SA_ERR_HPI_NOT_PRESENT - RDR is not present * SA_ERR_HPI_INTERNAL_ERROR - oa_soap plugin has encountered an internal * error * SA_ERR_HPI_READ_ONLY - The data to be operated upon is read only **/ SaErrorT oa_soap_set_sensor_event_enable(void *oh_handler, SaHpiResourceIdT resource_id, SaHpiSensorNumT rdr_num, const SaHpiBoolT enable) { SaErrorT rv = SA_OK; struct oh_handler_state *handler = NULL; SaHpiRptEntryT *rpt = NULL; SaHpiRdrT *rdr = NULL; struct oa_soap_sensor_info *sensor_info=NULL; if (oh_handler == NULL) { err("Invalid paramters"); return SA_ERR_HPI_INVALID_PARAMS; } handler = (struct oh_handler_state *) oh_handler; rpt = oh_get_resource_by_id(handler->rptcache, resource_id); if (rpt == NULL) { err("INVALID RESOURCE"); return SA_ERR_HPI_INVALID_RESOURCE; } if (! (rpt->ResourceCapabilities & SAHPI_CAPABILITY_SENSOR)) { err("INVALID RESOURCE CAPABILITY"); return SA_ERR_HPI_CAPABILITY; } /* Retrieve sensor rdr from framework of specified rdr number */ rdr = oh_get_rdr_by_type(handler->rptcache, resource_id, SAHPI_SENSOR_RDR, rdr_num); if (rdr == NULL) { err("RDR not present"); return SA_ERR_HPI_NOT_PRESENT; } if (rdr->RdrTypeUnion.SensorRec.EventCtrl == SAHPI_SEC_READ_ONLY) { err("Sensor does not support changing the event enable status"); return SA_ERR_HPI_READ_ONLY; } /* Retrieve sensor_info structure from the private area of rdr */ sensor_info = (struct oa_soap_sensor_info*) oh_get_rdr_data(handler->rptcache, resource_id, rdr->RecordId); if (sensor_info == NULL) { err("No sensor data. Sensor=%s", rdr->IdString.Data); return SA_ERR_HPI_INTERNAL_ERROR; } if (sensor_info->event_enable != enable) { /* Update the sensor event enable status with new value * and report the change to the framework through the * sensor enable event */ sensor_info->event_enable = enable; rv = generate_sensor_enable_event(oh_handler, rdr_num, rpt, rdr, sensor_info); if (rv != SA_OK) { err("Event generation failed"); return rv; } } return SA_OK; } /** * oa_soap_get_sensor_event_masks * @oh_handler: Handler data pointer. * @resource_id: Resource id * @sid: Sensor rdr number * @assert: Location to store sensor's assert event mask. * @deassert: Location to store sensor's deassert event mask. * * Purpose: * Retrieves a sensor's assert and deassert event masks. * * Detailed Description: * - Fetches sensor info structure from the private data area of * sensor rdr of specified rdr number * - Sensor event mask value is returned from sensor info structure. * sensor event mask determines whether the sensor is enabled for * raising events if the threshold values are crossed. * * Return values: * SA_OK - Normal case * SA_ERR_HPI_INVALID_PARAMS - On wrong parameters * SA_ERR_HPI_INVALID_RESOURCE - Invalid resource id specified * SA_ERR_HPI_CAPABILITY - Resource doesn't have SAHPI_CAPABILITY_SENSOR * SA_ERR_HPI_NOT_PRESENT - RDR is not present * SA_ERR_HPI_INTERNAL_ERROR - oa_soap plugin has encountered an internal * error **/ SaErrorT oa_soap_get_sensor_event_masks(void *oh_handler, SaHpiResourceIdT resource_id, SaHpiSensorNumT rdr_num, SaHpiEventStateT *assert, SaHpiEventStateT *deassert) { struct oh_handler_state *handler = NULL; SaHpiRptEntryT *rpt = NULL; SaHpiRdrT *rdr = NULL; struct oa_soap_sensor_info *sensor_info=NULL; if (oh_handler == NULL || assert == NULL || deassert == NULL) { err("Invalid paramters"); return SA_ERR_HPI_INVALID_PARAMS; } handler = (struct oh_handler_state *) oh_handler; rpt = oh_get_resource_by_id(handler->rptcache, resource_id); if (rpt == NULL) { err("INVALID RESOURCE"); return SA_ERR_HPI_INVALID_RESOURCE; } if (! (rpt->ResourceCapabilities & SAHPI_CAPABILITY_SENSOR)) { err("INVALID RESOURCE CAPABILITY"); return SA_ERR_HPI_CAPABILITY; } /* Retrieve sensor rdr from framework of specified rdr number */ rdr = oh_get_rdr_by_type(handler->rptcache, resource_id, SAHPI_SENSOR_RDR, rdr_num); if (rdr == NULL) { err("RDR not present"); return SA_ERR_HPI_NOT_PRESENT; } /* Retrieve sensor_info structure from the private area of rdr */ sensor_info = (struct oa_soap_sensor_info*) oh_get_rdr_data(handler->rptcache, resource_id, rdr->RecordId); if (sensor_info == NULL) { err("No sensor data. Sensor=%s", rdr->IdString.Data); return SA_ERR_HPI_INTERNAL_ERROR; } *assert = sensor_info->assert_mask; if (rpt->ResourceCapabilities & SAHPI_CAPABILITY_EVT_DEASSERTS) { *deassert = sensor_info->assert_mask; } else { *deassert = sensor_info->deassert_mask; } return SA_OK; } /** * oa_soap_set_sensor_event_masks * @oh_handler: Handler data pointer * @resource_id: Resource id * @sid: Sensor rdr number * @assert: Location to store sensor's assert event mask * @deassert: Location to store sensor's deassert event mask * * Purpose: * Sets a sensor's assert and deassert event masks * * Detailed Description: * - Fetches sensor info structure from the private data area of * sensor rdr of specified rdr number * - Sensor event mask value in sensor info structure is updated * with assert/deassert parameter values if it is different * - Sensor event mask determines whether the sensor is enabled for * raising events if the threshold values are crossed * - If there is a change in sensor event mask values, then * "Sensor enable change" event is generated to report the change to * framework * * Return values: * SA_OK - Normal case * SA_ERR_HPI_INVALID_PARAMS - On wrong parameters * SA_ERR_HPI_INVALID_RESOURCE - Invalid resource id specified * SA_ERR_HPI_CAPABILITY - Resource doesn't have SAHPI_CAPABILITY_SENSOR * SA_ERR_HPI_NOT_PRESENT - RDR is not present * SA_ERR_HPI_INTERNAL_ERROR - oa_soap plugin has encountered an internal * error * SA_ERR_HPI_INVALID_DATA - Invalid assert/deassert mask * SA_ERR_HPI_READ_ONLY - The data to be operated upon is read only **/ SaErrorT oa_soap_set_sensor_event_masks(void *oh_handler, SaHpiResourceIdT resource_id, SaHpiSensorNumT rdr_num, SaHpiSensorEventMaskActionT action, SaHpiEventStateT assert, SaHpiEventStateT deassert) { SaErrorT rv = SA_OK; struct oh_handler_state *handler = NULL; SaHpiRptEntryT *rpt = NULL; SaHpiRdrT *rdr = NULL; struct oa_soap_sensor_info *sensor_info=NULL; SaHpiEventStateT orig_assert_mask = 0; SaHpiEventStateT orig_deassert_mask = 0; SaHpiEventStateT check_mask; if (oh_handler == NULL) { err("Invalid paramters"); return SA_ERR_HPI_INVALID_PARAMS; } if ((assert == 0) && (deassert == 0)) { err("Invalid masks"); return SA_ERR_HPI_INVALID_PARAMS; } if (oh_lookup_sensoreventmaskaction(action) == NULL) { err("Invalid action"); return SA_ERR_HPI_INVALID_PARAMS; } handler = (struct oh_handler_state *) oh_handler; rpt = oh_get_resource_by_id(handler->rptcache, resource_id); if (rpt == NULL) { err("INVALID RESOURCE"); return SA_ERR_HPI_INVALID_RESOURCE; } if (! (rpt->ResourceCapabilities & SAHPI_CAPABILITY_SENSOR)) { err("INVALID RESOURCE CAPABILITY"); return SA_ERR_HPI_CAPABILITY; } /* Retrieve sensor rdr from framework of specified rdr number */ rdr = oh_get_rdr_by_type(handler->rptcache, resource_id, SAHPI_SENSOR_RDR, rdr_num); if (rdr == NULL) { err("RDR not present"); return SA_ERR_HPI_NOT_PRESENT; } if (rdr->RdrTypeUnion.SensorRec.EventCtrl != SAHPI_SEC_PER_EVENT) { err("Sensor do no support setting event masks"); return SA_ERR_HPI_READ_ONLY; } /* On adding new sensors with different event category or on supporting * new masks for the existing sensors, update below swtich statement */ switch (rdr->RdrTypeUnion.SensorRec.Category) { case SAHPI_EC_THRESHOLD: check_mask = OA_SOAP_STM_VALID_MASK; break; case SAHPI_EC_PRED_FAIL: check_mask = SAHPI_ES_PRED_FAILURE_DEASSERT | SAHPI_ES_PRED_FAILURE_ASSERT; break; case SAHPI_EC_ENABLE: check_mask = SAHPI_ES_DISABLED | SAHPI_ES_ENABLED; break; case SAHPI_EC_REDUNDANCY: check_mask = SAHPI_ES_FULLY_REDUNDANT | SAHPI_ES_REDUNDANCY_LOST; break; default : err("Un-supported event category %d detected ", rdr->RdrTypeUnion.SensorRec.Category); return SA_ERR_HPI_INTERNAL_ERROR; } if (assert !=0 && (assert & ~(check_mask))) { err("Assert mask is not valid"); return SA_ERR_HPI_INVALID_DATA; } if (deassert != 0 && (deassert & ~(check_mask))) { err("Deassert mask is not valid"); return SA_ERR_HPI_INVALID_DATA; } /* Retrieve sensor_info structure from the private area of rdr */ sensor_info = (struct oa_soap_sensor_info*) oh_get_rdr_data(handler->rptcache, resource_id, rdr->RecordId); if (sensor_info == NULL) { err("No sensor data. Sensor=%s", rdr->IdString.Data); return SA_ERR_HPI_INTERNAL_ERROR; } orig_assert_mask = sensor_info->assert_mask; orig_deassert_mask = sensor_info->deassert_mask; /* Based on the action type, the bits in assert/deassert mask are set * or cleared */ if (action == SAHPI_SENS_ADD_EVENTS_TO_MASKS) { sensor_info->assert_mask = sensor_info->assert_mask | assert; if (rpt->ResourceCapabilities & SAHPI_CAPABILITY_EVT_DEASSERTS) { sensor_info->deassert_mask = sensor_info->assert_mask; } else { sensor_info->deassert_mask = sensor_info->deassert_mask | deassert; } } else if (assert != 0 && action == SAHPI_SENS_REMOVE_EVENTS_FROM_MASKS) { sensor_info->assert_mask = sensor_info->assert_mask & ~(assert); if (rpt->ResourceCapabilities & SAHPI_CAPABILITY_EVT_DEASSERTS) { sensor_info->deassert_mask = sensor_info->assert_mask; } else if (deassert != 0) { sensor_info->deassert_mask = sensor_info->deassert_mask & ~(deassert); } } if ((sensor_info->assert_mask != orig_assert_mask) || (! (rpt->ResourceCapabilities & SAHPI_CAPABILITY_EVT_DEASSERTS) && sensor_info->deassert_mask != orig_deassert_mask)) { /* If the assert or deassert mask has change, raise a * "sensor enable event" */ rv = generate_sensor_enable_event(oh_handler, rdr_num, rpt, rdr, sensor_info); if (rv != SA_OK) { err("Event generation failed"); return rv; } } return SA_OK; } /** * update_sensor_rdr * @oh_handler: Handler data pointer * @resource_id: Resource ID * @rdr_num: Sensor rdr number * @rpt: Pointer to rpt Structure * @sensor_data: Pointer to sensor reading data * * Purpose: * Returns current status of the sensor RDR from resource * * Detailed Description: * - Fetches current reading of the sensor from the resource * by soap call and returns reading in sensor data * * Return values: * SA_OK - Normal case * SA_ERR_HPI_INVALID_PARAMS - On wrong parameters * SA_ERR_HPI_INTERNAL_ERROR - oa_soap plugin has encountered an internal * error * SA_ERR_HPI_UNKNOWN - Invalid entity type **/ SaErrorT update_sensor_rdr(struct oh_handler_state *oh_handler, SaHpiResourceIdT resource_id, SaHpiSensorNumT rdr_num, SaHpiRptEntryT *rpt, struct oa_soap_sensor_reading_data *sensor_data) { SaErrorT rv = SA_OK; struct oh_handler_state *handler = NULL; struct oa_soap_handler *oa_handler = NULL; struct getThermalInfo thermal_request; struct thermalInfo thermal_response; struct getBladeThermalInfoArray blade_thermal_request; struct bladeThermalInfoArrayResponse blade_thermal_response; struct bladeThermalInfo blade_thermal_info; struct getBladeStatus server_status_request; struct bladeStatus server_status_response; struct getFanInfo fan_request; struct fanInfo fan_response; struct getPowerSupplyInfo power_supply_request; struct powerSupplyInfo power_supply_response; struct powerSubsystemInfo ps_response; SaHpiInt32T location = -1; if (oh_handler == NULL || rpt == NULL || sensor_data == NULL) { err("Invalid parameters"); return SA_ERR_HPI_INVALID_PARAMS; } handler = (struct oh_handler_state *) oh_handler; oa_handler = (struct oa_soap_handler *) handler->data; location = rpt->ResourceEntity.Entry[0].EntityLocation; thermal_request.bayNumber = server_status_request.bayNumber = fan_request.bayNumber = power_supply_request.bayNumber = blade_thermal_request.bayNumber = location; /* Getting the current reading of the sensor directly from resource * using a soap call */ switch (rpt->ResourceEntity.Entry[0].EntityType) { case (SAHPI_ENT_SYSTEM_BLADE): case (SAHPI_ENT_IO_BLADE): case (SAHPI_ENT_DISK_BLADE): if ((rdr_num == OA_SOAP_SEN_TEMP_STATUS) || ((rdr_num >= OA_SOAP_BLD_THRM_SEN_START) && (rdr_num <= OA_SOAP_BLD_THRM_SEN_END))){ /* Fetching current thermal reading of the * server blade in the specified bay number * NOTE: If the blade is in POWER OFF state or * in unstable state, the control should not * reach this place */ rv = soap_getBladeThermalInfoArray( oa_handler->active_con, &blade_thermal_request, &blade_thermal_response); if (rv != SOAP_OK) { err("Get blade's thermal info failed"); return SA_ERR_HPI_INTERNAL_ERROR; } /* Traverse the soap response and fetch the * current sensor reading */ rv = oa_soap_get_bld_thrm_sen_data(rdr_num, blade_thermal_response, &blade_thermal_info); if (rv != SA_OK) { err("Could not find the matching" " sensors info from blade"); return rv; } sensor_data->data.IsSupported = SAHPI_TRUE; sensor_data->data.Type = SAHPI_SENSOR_READING_TYPE_FLOAT64; sensor_data->data.Value.SensorFloat64 = blade_thermal_info.temperatureC; } else if (rdr_num == OA_SOAP_SEN_PWR_STATUS) { /* Fetching current power status of the * server blade in the specified bay number */ rv = soap_getBladeStatus( oa_handler->active_con, &server_status_request, &server_status_response); if (rv != SOAP_OK) { return SA_ERR_HPI_INTERNAL_ERROR; } sensor_data->data.IsSupported = SAHPI_TRUE; sensor_data->data.Type = SAHPI_SENSOR_READING_TYPE_FLOAT64; sensor_data->data.Value.SensorFloat64 = server_status_response.powerConsumed; } break; case (SAHPI_ENT_SWITCH_BLADE): thermal_request.sensorType = SENSOR_TYPE_INTERCONNECT; /* Fetching current thermal reading of the switch blade * in the specified bay number */ rv = soap_getThermalInfo(oa_handler->active_con, &thermal_request, &thermal_response); if (rv != SOAP_OK) { return SA_ERR_HPI_INTERNAL_ERROR; } sensor_data->data.IsSupported = SAHPI_TRUE; sensor_data->data.Type = SAHPI_SENSOR_READING_TYPE_FLOAT64; sensor_data->data.Value.SensorFloat64 = thermal_response.temperatureC; break; case (SAHPI_ENT_SYS_MGMNT_MODULE): thermal_request.sensorType = SENSOR_TYPE_OA; /* Fetching current thermal readng of the OA * in the specified bay number */ rv = soap_getThermalInfo(oa_handler->active_con, &thermal_request, &thermal_response); if (rv != SOAP_OK) { return SA_ERR_HPI_INTERNAL_ERROR; } sensor_data->data.IsSupported = SAHPI_TRUE; sensor_data->data.Type = SAHPI_SENSOR_READING_TYPE_FLOAT64; sensor_data->data.Value.SensorFloat64 = thermal_response.temperatureC; break; case (SAHPI_ENT_SYSTEM_CHASSIS): thermal_request.sensorType = SENSOR_TYPE_ENC; /* Fetching current thermal readng of the Enclosure * in the specified bay number */ rv = soap_getThermalInfo(oa_handler->active_con, &thermal_request, &thermal_response); if (rv != SOAP_OK) { return SA_ERR_HPI_INTERNAL_ERROR; } sensor_data->data.IsSupported = SAHPI_TRUE; sensor_data->data.Type = SAHPI_SENSOR_READING_TYPE_FLOAT64; sensor_data->data.Value.SensorFloat64 = thermal_response.temperatureC; break; case (SAHPI_ENT_FAN): /* Fetching current speed and power consumption info * of fan in the specified bay number */ rv = soap_getFanInfo(oa_handler->active_con, &fan_request, &fan_response); if (rv != SOAP_OK) { return SA_ERR_HPI_INTERNAL_ERROR; } sensor_data->data.IsSupported = SAHPI_TRUE; sensor_data->data.Type = SAHPI_SENSOR_READING_TYPE_FLOAT64; if (rdr_num == OA_SOAP_SEN_FAN_SPEED) { sensor_data->data.Value.SensorFloat64 = fan_response.maxFanSpeed; } else if (rdr_num == OA_SOAP_SEN_PWR_STATUS) { sensor_data->data.Value.SensorFloat64 = fan_response.powerConsumed; } break; case (SAHPI_ENT_POWER_MGMNT): /* Fetching current power info of power subsystem */ rv = soap_getPowerSubsystemInfo(oa_handler->active_con, &ps_response); if (rv != SOAP_OK) { return SA_ERR_HPI_INTERNAL_ERROR; } sensor_data->data.IsSupported = SAHPI_TRUE; sensor_data->data.Type = SAHPI_SENSOR_READING_TYPE_FLOAT64; if (rdr_num == OA_SOAP_SEN_IN_PWR) { sensor_data->data.Value.SensorFloat64 = ps_response.inputPowerVa; } if (rdr_num == OA_SOAP_SEN_OUT_PWR) { sensor_data->data.Value.SensorFloat64 = ps_response.outputPower; } if (rdr_num == OA_SOAP_SEN_PWR_STATUS) { sensor_data->data.Value.SensorFloat64 = ps_response.powerConsumed; } if (rdr_num == OA_SOAP_SEN_PWR_CAPACITY) { sensor_data->data.Value.SensorFloat64 = ps_response.capacity; } break; case (SAHPI_ENT_POWER_SUPPLY): /* Fetching current actual power output info of * power supply in the specified bay number */ rv = soap_getPowerSupplyInfo(oa_handler->active_con, &power_supply_request, &power_supply_response); if (rv != SOAP_OK) { return SA_ERR_HPI_INTERNAL_ERROR; } sensor_data->data.IsSupported = SAHPI_TRUE; sensor_data->data.Type = SAHPI_SENSOR_READING_TYPE_FLOAT64; sensor_data->data.Value.SensorFloat64 = power_supply_response.actualOutput; break; default: err("Wrong resource type"); return SA_ERR_HPI_UNKNOWN; } return SA_OK; } /** * generate_sensor_enable_event * @oh_handler: Handler data pointer. * @rdr_num: Sensor rdr number. * @rpt: Pointer to rpt structure. * @rdr: Pointer to rdr structure. * @sensor_info: Pointer to sensor information structure * * Purpose: * Builds and generates the sensor enable event * * Detailed Description: NA * * Return values: * SA_OK - on success. * SA_ERR_HPI_INVALID_PARAMS - On wrong parameters. **/ SaErrorT generate_sensor_enable_event(void *oh_handler, SaHpiSensorNumT rdr_num, SaHpiRptEntryT *rpt, SaHpiRdrT *rdr, struct oa_soap_sensor_info *sensor_info) { struct oh_handler_state *handler = NULL; struct oh_event event; if (oh_handler == NULL || sensor_info == NULL) { err("Invalid parameters"); return SA_ERR_HPI_INVALID_PARAMS; } handler = (struct oh_handler_state *) oh_handler; memset(&event, 0, sizeof(struct oh_event)); event.hid = handler->hid; event.event.EventType = SAHPI_ET_SENSOR_ENABLE_CHANGE; /* TODO: map the timestamp of the OA generated event */ oh_gettimeofday(&(event.event.Timestamp)); event.event.Severity = SAHPI_INFORMATIONAL; memcpy(&event.resource, rpt, sizeof(SaHpiRptEntryT)); event.event.Source = rpt->ResourceId; event.event.EventDataUnion.SensorEnableChangeEvent.SensorNum = rdr_num; event.event.EventDataUnion.SensorEnableChangeEvent.SensorType = rdr->RdrTypeUnion.SensorRec.Type; event.event.EventDataUnion.SensorEnableChangeEvent.EventCategory = rdr->RdrTypeUnion.SensorRec.Category; event.event.EventDataUnion.SensorEnableChangeEvent.SensorEnable = sensor_info->sensor_enable; event.event.EventDataUnion.SensorEnableChangeEvent.SensorEventEnable = sensor_info->event_enable; event.event.EventDataUnion.SensorEnableChangeEvent.AssertEventMask = sensor_info->assert_mask; event.event.EventDataUnion.SensorEnableChangeEvent.DeassertEventMask = sensor_info->deassert_mask; event.rdrs = g_slist_append(event.rdrs, g_memdup(rdr, sizeof(SaHpiRdrT))); event.event.EventDataUnion.SensorEnableChangeEvent.OptionalDataPresent = SAHPI_SEOD_CURRENT_STATE; /* If the current state is SAHPI_ES_UPPER_CRIT then the current * asserted event states are SAHPI_ES_UPPER_CRIT and * SAHPI_ES_UPPER_MAJOR. */ if (rdr->RdrTypeUnion.SensorRec.Category == SAHPI_EC_THRESHOLD && sensor_info->current_state == SAHPI_ES_UPPER_CRIT) { event.event.EventDataUnion.SensorEnableChangeEvent. CurrentState = SAHPI_ES_UPPER_CRIT | SAHPI_ES_UPPER_MAJOR; } else { event.event.EventDataUnion.SensorEnableChangeEvent. CurrentState = sensor_info->current_state; } oh_evt_queue_push(handler->eventq, copy_oa_soap_event(&event)); return SA_OK; } /** * generate_sensor_assert_thermal_event * @oh_handler: Handler data pointer * @rdr_num: Sensor rdr number * @rpt: Pointer to rpt structure * @rdr: Pointer to rdr structure * @current_reading: Current reading of sensor * @event_severity: Severity of thermal event * @sensor_info: Pointer to sensor information structure * * Purpose: * Builds and generates the sensor assert thermal event * * Detailed Description: NA * * Return values: * SA_OK - on success. * SA_ERR_HPI_INVALID_PARAMS - On wrong parameters. * SA_ERR_HPI_INTERNAL_ERROR - oa_soap plugin has encountered an internal * error. **/ SaErrorT generate_sensor_assert_thermal_event(void *oh_handler, SaHpiSensorNumT rdr_num, SaHpiRptEntryT *rpt, SaHpiRdrT *rdr, SaHpiSensorReadingT current_reading, SaHpiSeverityT event_severity, struct oa_soap_sensor_info *sensor_info) { struct oh_handler_state *handler = NULL; struct oh_event event; if (oh_handler == NULL || sensor_info == NULL) { err("Invalid parameters"); return SA_ERR_HPI_INVALID_PARAMS; } handler = (struct oh_handler_state *) oh_handler; memset(&event, 0, sizeof(struct oh_event)); /* Update the event data structure with default values and current * state of the thermal reading */ event.hid = handler->hid; event.event.EventType = SAHPI_ET_SENSOR; oh_gettimeofday(&(event.event.Timestamp)); event.event.Severity = event_severity; memcpy(&event.resource, rpt, sizeof(SaHpiRptEntryT)); event.event.Source = rpt->ResourceId; event.event.EventDataUnion.SensorEvent.SensorNum = rdr_num; event.event.EventDataUnion.SensorEvent.SensorType = SAHPI_TEMPERATURE; event.event.EventDataUnion.SensorEvent.EventCategory = SAHPI_EC_THRESHOLD; event.event.EventDataUnion.SensorEvent.Assertion = SAHPI_TRUE; event.event.EventDataUnion.SensorEvent.EventState = sensor_info->current_state; if (current_reading.IsSupported == SAHPI_TRUE) { event.event.EventDataUnion.SensorEvent.OptionalDataPresent = SAHPI_SOD_TRIGGER_READING | SAHPI_SOD_TRIGGER_THRESHOLD | SAHPI_SOD_PREVIOUS_STATE | SAHPI_SOD_CURRENT_STATE; event.event.EventDataUnion.SensorEvent.TriggerReading = current_reading; } else { event.event.EventDataUnion.SensorEvent.OptionalDataPresent = SAHPI_SOD_TRIGGER_THRESHOLD | SAHPI_SOD_PREVIOUS_STATE | SAHPI_SOD_CURRENT_STATE; } switch (sensor_info->current_state) { case (SAHPI_ES_UNSPECIFIED): err("There is no event to assert"); return SA_OK; case (SAHPI_ES_UPPER_MAJOR): /* Raise an assert event if the thermal reading crosses * the major threshold and assert mask for event is * enabled */ if (! (sensor_info->assert_mask & SAHPI_STM_UP_MAJOR)) { err("Assert mask for major threshold is " "not set"); return SA_OK; } if (sensor_info->previous_state == SAHPI_ES_UNSPECIFIED) { event.event.EventDataUnion.SensorEvent. TriggerThreshold = sensor_info->threshold.UpMajor; } else { err("There is no event to assert"); return SA_OK; } break; case (SAHPI_ES_UPPER_CRIT): /* Raise an assert event if the thermal reading crosses * the critical threshold and assert mask for event is * enabled */ if (! (sensor_info->assert_mask & SAHPI_STM_UP_CRIT)) { err("Assert mask for critical threshold is " "not set"); return SA_OK; } event.event.EventDataUnion.SensorEvent. TriggerThreshold = sensor_info->threshold.UpCritical; break; default: err("Invalid current state for asserting the event"); return SA_ERR_HPI_INTERNAL_ERROR; } /* Update the event structure with previous and current state after * a threshold has been crossed */ event.event.EventDataUnion.SensorEvent.PreviousState = sensor_info->previous_state; /* If the current state is SAHPI_ES_UPPER_CRIT the current asserted * event states are SAHPI_ES_UPPER_CRIT and SAHPI_ES_UPPER_MAJOR */ if (sensor_info->current_state == SAHPI_ES_UPPER_CRIT) { event.event.EventDataUnion.SensorEvent.CurrentState = SAHPI_ES_UPPER_CRIT | SAHPI_ES_UPPER_MAJOR; } else { event.event.EventDataUnion.SensorEvent.CurrentState = sensor_info->current_state; } event.rdrs = g_slist_append(event.rdrs, g_memdup(rdr, sizeof(SaHpiRdrT))); oh_evt_queue_push(handler->eventq, copy_oa_soap_event(&event)); return SA_OK; } /** * generate_sensor_deassert_thermal_event * @oh_handler: Handler data pointer. * @rdr_num: Sensor rdr number. * @rpt: Pointer to rpt structure. * @rdr: Pointer to rdr structure * @current_reading: Current reading of sensor * @sensor_info: Pointer to sensor information structure * * Purpose: * Builds and generates the sensor deassert thermal event * * Detailed Description: NA * * Return values: * SA_OK - on success. * SA_ERR_HPI_INVALID_PARAMS - On wrong parameters. * SA_ERR_HPI_INTERNAL_ERROR - oa_soap plugin has encountered an internal * error. **/ SaErrorT generate_sensor_deassert_thermal_event(void *oh_handler, SaHpiSensorNumT rdr_num, SaHpiRptEntryT *rpt, SaHpiRdrT *rdr, SaHpiSensorReadingT current_reading, SaHpiSeverityT event_severity, struct oa_soap_sensor_info *sensor_info) { struct oh_handler_state *handler = NULL; struct oh_event event; if (oh_handler == NULL || sensor_info == NULL) { err("Invalid parameters"); return SA_ERR_HPI_INVALID_PARAMS; } handler = (struct oh_handler_state *) oh_handler; memset(&event, 0, sizeof(struct oh_event)); /* Update the event data structure with default values and current * state of the thermal reading */ event.hid = handler->hid; event.event.EventType = SAHPI_ET_SENSOR; oh_gettimeofday(&(event.event.Timestamp)); event.event.Severity = event_severity; memcpy(&event.resource, rpt, sizeof(SaHpiRptEntryT)); event.event.Source = rpt->ResourceId; event.event.EventDataUnion.SensorEvent.SensorNum = rdr_num; event.event.EventDataUnion.SensorEvent.SensorType = SAHPI_TEMPERATURE; event.event.EventDataUnion.SensorEvent.EventCategory = SAHPI_EC_THRESHOLD; event.event.EventDataUnion.SensorEvent.Assertion = SAHPI_FALSE; event.event.EventDataUnion.SensorEvent.EventState = sensor_info->previous_state; if (current_reading.IsSupported == SAHPI_TRUE) { event.event.EventDataUnion.SensorEvent.OptionalDataPresent = SAHPI_SOD_TRIGGER_READING | SAHPI_SOD_TRIGGER_THRESHOLD | SAHPI_SOD_PREVIOUS_STATE | SAHPI_SOD_CURRENT_STATE; event.event.EventDataUnion.SensorEvent.TriggerReading = current_reading; } else { event.event.EventDataUnion.SensorEvent.OptionalDataPresent = SAHPI_SOD_TRIGGER_THRESHOLD | SAHPI_SOD_PREVIOUS_STATE | SAHPI_SOD_CURRENT_STATE; } switch (sensor_info->current_state) { case (SAHPI_ES_UNSPECIFIED): /* Raise an deassert event if the thermal reading drops * below the major threshold and deassert mask for event * is enabled */ if (! (sensor_info->deassert_mask & SAHPI_STM_UP_MAJOR)) { err("Event deassert mask for major threshold " "is not set"); return SA_OK; } if (sensor_info->previous_state == SAHPI_STM_UP_MAJOR) { event.event.EventDataUnion.SensorEvent. TriggerThreshold = sensor_info->threshold.UpMajor; } else { err("There is no event to deassert"); return SA_OK; } break; case (SAHPI_ES_UPPER_MAJOR): /* Raise an deassert event if the thermal reading drops * below the critical threshold and deassert mask for * event is enabled */ if (sensor_info->previous_state == SAHPI_ES_UPPER_CRIT) { if (! (sensor_info->deassert_mask & SAHPI_STM_UP_CRIT)) { err("Event deassert mask for critical " "threshold is not set"); return SA_OK; } event.event.EventDataUnion.SensorEvent. TriggerThreshold = sensor_info->threshold.UpCritical; } else { err("There is no event to deassert"); return SA_OK; } break; case (SAHPI_ES_UPPER_CRIT): err("There is no event to deassert"); return SA_OK; break; default: err("Invalid current state"); return SA_ERR_HPI_INTERNAL_ERROR; } /* Update the event structure with previous and current state after * a threshold has been crossed. * If the previous state is SAHPI_ES_UPPER_CRIT the previous asserted * event states are SAHPI_ES_UPPER_CRIT and SAHPI_ES_UPPER_MAJOR */ if (sensor_info->previous_state == SAHPI_ES_UPPER_CRIT) { event.event.EventDataUnion.SensorEvent.PreviousState = SAHPI_ES_UPPER_CRIT | SAHPI_ES_UPPER_MAJOR; } else { event.event.EventDataUnion.SensorEvent.PreviousState = sensor_info->previous_state; } event.event.EventDataUnion.SensorEvent.CurrentState = sensor_info->current_state; event.rdrs = g_slist_append(event.rdrs, g_memdup(rdr, sizeof(SaHpiRdrT))); oh_evt_queue_push(handler->eventq, copy_oa_soap_event(&event)); return SA_OK; } /** * check_and_deassert_event * @oh_handler: Pointer to openhpi handler * @resource_id: Resource id * @rdr: Pointer to rdr structure * @sensor_info: Pointer to the sensor information * * Purpose: * Check and deassert the pending events on resource * * Detailed Description: * - This is the module is called to check what thermal event to deassert * based on the current state * * Return values: * SA_OK - on success. * SA_ERR_HPI_INVALID_PARAMS - on wrong parameters * SA_ERR_HPI_INTERNAL_ERROR - oa_soap plugin has encountered an internal * error. **/ SaErrorT check_and_deassert_event(struct oh_handler_state *oh_handler, SaHpiResourceIdT resource_id, SaHpiRdrT *rdr, struct oa_soap_sensor_info *sensor_info) { SaErrorT rv = SA_OK; SaHpiSeverityT event_severity; SaHpiSensorReadingT current_reading; SaHpiRptEntryT *rpt = NULL; current_reading.IsSupported = SAHPI_FALSE; rpt = oh_get_resource_by_id(oh_handler->rptcache, resource_id); if (rpt == NULL) { err("INVALID RESOURCE"); return SA_ERR_HPI_INVALID_RESOURCE; } if (sensor_info->current_state == SAHPI_ES_UPPER_CRIT) { /* if the current state is CRITICAL, then this module would * have been called when the thermal reading would have dropped * below critical threshold. * Hence thermal event raised for crossing critical threshold * will be deasserted */ sensor_info->previous_state = SAHPI_ES_UPPER_CRIT; sensor_info->current_state = SAHPI_ES_UPPER_MAJOR; event_severity = SAHPI_CRITICAL; rv = generate_sensor_deassert_thermal_event(oh_handler, OA_SOAP_SEN_TEMP_STATUS, rpt, rdr, current_reading, event_severity, sensor_info); if (rv != SA_OK) { err("Raising critical deassert thermal event failed"); } } if (sensor_info->current_state == SAHPI_ES_UPPER_MAJOR) { /* if the current state is MAJOR, then this module would * have been called when the thermal reading would have dropped * below major threshold. * Hence thermal event raised for crossing major threshold * will be deasserted */ sensor_info->previous_state = SAHPI_ES_UPPER_MAJOR; sensor_info->current_state = SAHPI_ES_UNSPECIFIED; event_severity = SAHPI_MAJOR; rv = generate_sensor_deassert_thermal_event(oh_handler, OA_SOAP_SEN_TEMP_STATUS, rpt, rdr, current_reading, event_severity, sensor_info); if (rv != SA_OK) { err("Raising major deassert thermal event failed"); } } return SA_OK; } /** * oa_soap_build_sen_rdr * @oh_handler: Pointer to openhpi handler * @resource_id: Resource id * @rdr: Pointer to rdr structure * @sensor_info: Pointer to the sensor information * @sensor_num: Sensor number * * Purpose: * Build the sensor RDR * * Detailed Description: * - Allocates the memory for sensor info * - Copies the sensor RDR from the global sensor array * * Return values: * SA_OK - on success. * SA_ERR_HPI_INVALID_PARAMS - on wrong parameters * SA_ERR_HPI_INTERNAL_ERROR - oa_soap plugin has encountered an internal * error. **/ SaErrorT oa_soap_build_sen_rdr(struct oh_handler_state *oh_handler, SaHpiResourceIdT resource_id, SaHpiRdrT *rdr, struct oa_soap_sensor_info **sensor_info, SaHpiSensorNumT sensor_num) { SaHpiRptEntryT *rpt = NULL; if (oh_handler == NULL || rdr == NULL || sensor_info == NULL) { err("Invalid parameters"); return SA_ERR_HPI_INVALID_PARAMS; } /* Get the rpt entry of the resource */ rpt = oh_get_resource_by_id(oh_handler->rptcache, resource_id); if (rpt == NULL) { err("resource RPT is NULL"); return SA_ERR_HPI_INTERNAL_ERROR; } /* Sensor specific information is stored in this structure */ *sensor_info = g_memdup(&(oa_soap_sen_arr[sensor_num].sensor_info), sizeof(struct oa_soap_sensor_info)); if (*sensor_info == NULL) { err("oa_soap out of memory"); return SA_ERR_HPI_OUT_OF_MEMORY; } /* Populate the sensor rdr with default value */ rdr->Entity = rpt->ResourceEntity; rdr->RdrType = SAHPI_SENSOR_RDR; rdr->RdrTypeUnion.SensorRec = oa_soap_sen_arr[sensor_num].sensor; oh_init_textbuffer(&(rdr->IdString)); oh_append_textbuffer(&(rdr->IdString), oa_soap_sen_arr[sensor_num].comment); return SA_OK; } /** * oa_soap_map_sen_val * @sensor_info: Pointer to the sensor information structure * @sensor_num: Sensor number * @sensor_value: Value of the sensor * @sensor_status: Pointer to the sensor status * * Purpose: * Maps the sensor value got from SOAP call to HPI sensor state, if it is * changed * * Detailed Description: * NA * * Return values: * SA_OK - Normal case. * SA_ERR_HPI_INVALID_PARAMS - On wrong parameters. * SA_ERR_HPI_INTERNAL_ERROR - One seeing the unsupported sensor value **/ SaErrorT oa_soap_map_sen_val(struct oa_soap_sensor_info *sensor_info, SaHpiSensorNumT sensor_num, SaHpiInt32T sensor_value, SaHpiInt32T *sensor_status) { SaHpiInt32T sensor_class; if (sensor_info == NULL || sensor_status == NULL) { err("Invalid parameter."); return SA_ERR_HPI_INVALID_PARAMS; } /* Get the sensor value */ sensor_class = oa_soap_sen_arr[sensor_num].sensor_class; /* Check whether the sensor value is supported or not */ if (oa_soap_sen_val_map_arr[sensor_class][sensor_value] == -1) { err("Not supported sensor value %d detected.", sensor_value); return SA_ERR_HPI_INTERNAL_ERROR; } /* Check whether HPI sensor value has changed or not*/ if (sensor_info->current_state != oa_soap_sen_val_map_arr[sensor_class][sensor_value]) { /* Update the current sensor state */ sensor_info->current_state = oa_soap_sen_val_map_arr[sensor_class][sensor_value]; /* Get the assert state of the sensor */ *sensor_status = oa_soap_sen_assert_map_arr[sensor_class][sensor_value]; } else { /* Sensor value has not changed */ *sensor_status = OA_SOAP_SEN_NO_CHANGE; } return SA_OK; } /** * oa_soap_gen_res_evt * @oh_handler: Pointer to openhpi handler * @rpt: Pointer to the rpt structure * @sensor_status: sensor status * * Purpose: * Generates the HPI reource event * changed * * Detailed Description: * - If the operational status sensor state is asserted, then resource * event type is set to FAILURE and ResourceFailed field is set to TRUE. * - If the operational status sensor state is deasserted, then resource * event type is set to RESTORED and ResourceFailed field is set to * FALSE. * - Pushes the modified RPT entry to plugin rptcache. * - Raises the HPI resource event. * * Return values: * SA_OK - Normal case. * SA_ERR_HPI_INVALID_PARAMS - On wrong parameters. * SA_ERR_HPI_INTERNAL_ERROR - One seeing the unsupported sensor value **/ static void oa_soap_gen_res_evt(struct oh_handler_state *oh_handler, SaHpiRptEntryT *rpt, SaHpiInt32T sensor_status) { SaErrorT rv; struct oh_event event; struct oa_soap_hotswap_state *hotswap_state = NULL; if (oh_handler == NULL || rpt == NULL) { err("Invalid parameters"); return; } memset(&event, 0, sizeof(struct oh_event)); if (sensor_status == OA_SOAP_SEN_ASSERT_TRUE && rpt->ResourceFailed != SAHPI_TRUE) { /* Resource failed */ event.event.EventDataUnion.ResourceEvent. ResourceEventType = SAHPI_RESE_RESOURCE_FAILURE; rpt->ResourceFailed = SAHPI_TRUE; } else if (sensor_status == OA_SOAP_SEN_ASSERT_FALSE && rpt->ResourceFailed != SAHPI_FALSE) { /* Resource restored */ event.event.EventDataUnion.ResourceEvent. ResourceEventType = SAHPI_RESE_RESOURCE_RESTORED; rpt->ResourceFailed = SAHPI_FALSE; } else { /* Do not generate resource event as there is no change */ return; } /* Update the event structure */ event.hid = oh_handler->hid; oh_gettimeofday(&(event.event.Timestamp)); event.event.Severity = SAHPI_CRITICAL; event.event.Source = rpt->ResourceId; event.event.EventType = SAHPI_ET_RESOURCE; /* Get the hotswap structure */ if (rpt->ResourceCapabilities & SAHPI_CAPABILITY_MANAGED_HOTSWAP) { hotswap_state = (struct oa_soap_hotswap_state *) oh_get_resource_data(oh_handler->rptcache, rpt->ResourceId); } /* Update the RPT entry */ rv = oh_add_resource(oh_handler->rptcache, rpt, hotswap_state, 0); if (rv != SA_OK) { err("Adding resource failed"); return; } memcpy(&(event.resource), rpt, sizeof(SaHpiRptEntryT)); oh_evt_queue_push(oh_handler->eventq, copy_oa_soap_event(&event)); } /** * oa_soap_gen_sen_evt * @oh_handler: Pointer to openhpi handler * @rpt: Pointer to the rpt structure * @rdr: Pointer to rdr structure * @sensor_status: Status of the sensor * * Purpose: * Generates the HPI sensor event * * Detailed Description: * - Obtains the sensor event structure from the global sensor array * - If the trigger reading is greater than zero, then sets the trigger * reading value in the sensor event structure. * - If the trigger threshold is greater than zero, then sets the trigger * threshold value in the sensor event structure. * - Appends the sensor RDR to the event structure * - Raises the HPI sensor event * * Return values: * SA_OK - Normal case. * SA_ERR_HPI_INVALID_PARAMS - On wrong parameters. **/ static SaErrorT oa_soap_gen_sen_evt(struct oh_handler_state *oh_handler, SaHpiRptEntryT *rpt, SaHpiRdrT *rdr, SaHpiInt32T sensor_status, SaHpiFloat64T trigger_reading, SaHpiFloat64T trigger_threshold) { struct oh_event event; SaHpiSensorNumT sensor_num; if (oh_handler == NULL || rpt == NULL || rdr == NULL) { err("Invalid parameter."); return SA_ERR_HPI_INVALID_PARAMS; } sensor_num = rdr->RdrTypeUnion.SensorRec.Num; /* Update the event structure */ memset(&event, 0, sizeof(struct oh_event)); /* Get the event structure from gloabl array */ event.event = oa_soap_sen_arr[sensor_num].sen_evt[sensor_status]; if (trigger_reading > 0) { event.event.EventDataUnion.SensorEvent.TriggerReading.Value. SensorFloat64 = trigger_reading; } if (trigger_threshold > 0) { event.event.EventDataUnion.SensorEvent.TriggerThreshold.Value. SensorFloat64 = trigger_threshold; } memcpy(&(event.resource), rpt, sizeof(SaHpiRptEntryT)); event.event.Source = event.resource.ResourceId; event.hid = oh_handler->hid; oh_gettimeofday(&(event.event.Timestamp)); event.rdrs = g_slist_append(event.rdrs, g_memdup(rdr, sizeof(SaHpiRdrT))); /* Raise the HPI sensor event */ oh_evt_queue_push(oh_handler->eventq, copy_oa_soap_event(&event)); return SA_OK; } /** * oa_soap_proc_sen_evt * @oh_handler: Pointer to openhpi handler * @resource_id: Resource Id * @sensor_num: Sensor number * @sensor_value: Sensor value * * Purpose: * Processes and raises the sensor event * * Detailed Description: * - Raises the sensor event on changes in the state of the sensors with * sensor class OPER, PRED_FAIL, REDUND, DIAG, ENC_AGR_OPER, * ENC_AGR_PRED_FAIL, BOOL, BOOL_RVRS, HEALTH_OPER, HEALTH_PRED_FAIL. * - Raises the resource failed or restored event if there is a change in * the operational status sensor state. * - Raises the sensor event on changes in the state of the sensors with * sensor class TEMP * * Return values: * SA_OK - on success. * SA_ERR_HPI_INVALID_PARAMS - on wrong parameters * SA_ERR_HPI_INTERNAL_ERROR - oa_soap plugin has encountered an internal * error. **/ SaErrorT oa_soap_proc_sen_evt(struct oh_handler_state *oh_handler, SaHpiResourceIdT resource_id, SaHpiSensorNumT sensor_num, SaHpiInt32T sensor_value, SaHpiFloat64T trigger_reading, SaHpiFloat64T trigger_threshold) { SaErrorT rv = SA_OK; SaHpiInt32T sensor_status; SaHpiInt32T sensor_class; SaHpiRptEntryT *rpt = NULL; SaHpiRdrT *rdr = NULL; struct oa_soap_sensor_info *sensor_info; SaHpiInt32T event_index = -1; if (oh_handler == NULL) { err("wrong parameters passed"); return SA_ERR_HPI_INVALID_PARAMS; } /* Get the rpt entry of the resource */ rpt = oh_get_resource_by_id(oh_handler->rptcache, resource_id); if (rpt == NULL) { err("resource RPT is NULL"); return SA_ERR_HPI_INTERNAL_ERROR; } /* Get the enable sensor RDR */ rdr = oh_get_rdr_by_type(oh_handler->rptcache, rpt->ResourceId, SAHPI_SENSOR_RDR, sensor_num); if (rdr == NULL) { err("RDR not present"); return SA_ERR_HPI_NOT_PRESENT; } /* Get the sensor information */ sensor_info = (struct oa_soap_sensor_info*) oh_get_rdr_data(oh_handler->rptcache, rpt->ResourceId, rdr->RecordId); if (sensor_info == NULL) { err("No sensor data. Sensor=%s", rdr->IdString.Data); return SA_ERR_HPI_INTERNAL_ERROR; } sensor_class = oa_soap_sen_arr[sensor_num].sensor_class; switch (sensor_class) { case OA_SOAP_OPER_CLASS: case OA_SOAP_PRED_FAIL_CLASS: case OA_SOAP_REDUND_CLASS: case OA_SOAP_DIAG_CLASS: case OA_SOAP_ENC_AGR_OPER_CLASS: case OA_SOAP_ENC_AGR_PRED_FAIL_CLASS: case OA_SOAP_BOOL_CLASS: case OA_SOAP_BOOL_RVRS_CLASS: case OA_SOAP_HEALTH_OPER_CLASS: case OA_SOAP_HEALTH_PRED_FAIL_CLASS: rv = oa_soap_map_sen_val(sensor_info, sensor_num, sensor_value, &sensor_status); if (rv != SA_OK) { err("Setting sensor value has failed"); return rv; } /* If there is no change in the sensor value, ignore the * OA event */ if (sensor_status == OA_SOAP_SEN_NO_CHANGE) return SA_OK; /* Ignore the sensor event if the sensor is disabled or * sensor event is disabled */ if (sensor_info->sensor_enable == SAHPI_FALSE || sensor_info->event_enable == SAHPI_FALSE) { dbg ("Sensor is disabled or sensor event is " "disabled"); } else { /* Generate the sensor event */ oa_soap_gen_sen_evt(oh_handler, rpt, rdr, sensor_status, 0, 0); } /* Generate resource failed/restored event based on the * operational status sensor state */ if (sensor_num == OA_SOAP_SEN_OPER_STATUS) { oa_soap_gen_res_evt(oh_handler, rpt, sensor_status); } break; case OA_SOAP_TEMP_CLASS: /* If the thermal sensor is enabled and sensor * event is enabled * Then raise the thermal sensor events, * Else, ignore the thermal event from OA */ if (sensor_info->sensor_enable == SAHPI_FALSE || sensor_info->event_enable == SAHPI_FALSE) { dbg ("Sensor or sensor event is disabled"); return SA_OK; } /* Check the current state of the sensor and determine * the index of event in event array of the sensor * required for raising the event */ switch (sensor_value) { case SENSOR_STATUS_OK: /* Sensor has changed the state from * CAUTION to OK. * Update the event structure. */ sensor_info->previous_state = SAHPI_ES_UPPER_MAJOR; sensor_info->current_state = SAHPI_ES_UNSPECIFIED; event_index = OA_SOAP_TEMP_CAUT_OK; break; case SENSOR_STATUS_CAUTION: /* Sensor has changed the state to * CAUTION from CRITICAL or OK. * Update the event structure. */ sensor_info->previous_state = sensor_info->current_state; sensor_info->current_state = SAHPI_ES_UPPER_MAJOR; if (sensor_info->previous_state == SAHPI_ES_UNSPECIFIED) { event_index = OA_SOAP_TEMP_OK_CAUT; } else { event_index = OA_SOAP_TEMP_CRIT_CAUT; } break; case SENSOR_STATUS_CRITICAL: /* Sensor has changed the state from * CAUTION to CRITICAL. * Update the event structure. */ sensor_info->previous_state = SAHPI_ES_UPPER_MAJOR; sensor_info->current_state = SAHPI_ES_UPPER_CRIT; event_index = OA_SOAP_TEMP_CAUT_CRIT; break; default: err("Event not supported for the \ specified sensor status"); return SA_ERR_HPI_INTERNAL_ERROR; } /* Raise the event */ rv = oa_soap_gen_sen_evt(oh_handler, rpt, rdr, event_index, trigger_reading, trigger_threshold); if (rv != SA_OK) { err("Error in generating sensor event"); return rv; } break; default: err("No event support for specified class"); } return SA_OK; } /** * oa_soap_map_thresh_resp * @rdr: Pointer to the sensor rdr * @oa_soap_threshold_sensor: Structure containing the threshold reading * @sensor_info: Pointer to the sensor information structure * * Purpose: * Updates the rdr structure with the threshold values retrieved from OA * For Thermal sensors, current state in sensor_info is updated based on * current reading * * Detailed Description: * NA * * Return values: * SA_OK - Normal case. * SA_ERR_HPI_INVALID_PARAMS - On wrong parameters. * SA_ERR_HPI_INTERNAL_ERROR - One seeing the unsupported sensor value **/ SaErrorT oa_soap_map_thresh_resp(SaHpiRdrT *rdr, void *response, SaHpiBoolT event_support, struct oa_soap_sensor_info *sensor_info) { SaHpiSensorRecT *sensor = NULL; SaHpiUint32T current_reading = 0; SaHpiInt32T sensor_class; struct thermalInfo *thermal_response; struct bladeThermalInfo *blade_thermal_response; struct fanInfo *fan_info; if (rdr == NULL || sensor_info == NULL) { err("Invalid parameter."); return SA_ERR_HPI_INVALID_PARAMS; } sensor = &(rdr->RdrTypeUnion.SensorRec); sensor_class = oa_soap_sen_arr[sensor->Num].sensor_class; switch (sensor_class) { case OA_SOAP_TEMP_CLASS: case OA_SOAP_BLADE_THERMAL_CLASS: /* Ambient Zone thermal sensor is present for most of * resource. Ambient Zone threshold info for Blade is * available from bladeThermalInfo response, where as * for other resources it is available it is available * from thermalInfo response. * Hence for Blade Ambient zone threshold info * set sensor class as OA_SOAP_BLADE_THERMAL_CLASS to * retrieve threshold values from correct response. */ if ((rdr->Entity.Entry[0].EntityType == SAHPI_ENT_SYSTEM_BLADE) || (rdr->Entity.Entry[0].EntityType == SAHPI_ENT_IO_BLADE) || (rdr->Entity.Entry[0].EntityType == SAHPI_ENT_DISK_BLADE)) { sensor_class = OA_SOAP_BLADE_THERMAL_CLASS; } if (sensor_class == OA_SOAP_TEMP_CLASS) { /* Cast the response structure to thermal info * response */ thermal_response = (struct thermalInfo *)response; /* Updating the rdr with actual upper critical * threshold value provided by OA */ sensor->DataFormat.Range.Max.Value. SensorFloat64 = sensor_info->threshold.UpCritical.Value. SensorFloat64 = thermal_response->criticalThreshold; sensor->DataFormat.Range.NormalMax.Value. SensorFloat64 = sensor_info->threshold.UpMajor.Value. SensorFloat64 = thermal_response->cautionThreshold; current_reading = (SaHpiUint32T)thermal_response->temperatureC; } else if (sensor_class == OA_SOAP_BLADE_THERMAL_CLASS) { /* Cast the response structure to blade thermal * info response */ blade_thermal_response = (struct bladeThermalInfo *)response; /* Updating the rdr with actual upper critical * threshold value provided by OA */ sensor->DataFormat.Range.Max.Value. SensorFloat64 = sensor_info->threshold.UpCritical.Value. SensorFloat64 = blade_thermal_response->criticalThreshold; sensor->DataFormat.Range.NormalMax.Value. SensorFloat64 = sensor_info->threshold.UpMajor.Value. SensorFloat64 = blade_thermal_response->cautionThreshold; current_reading = (SaHpiUint32T)blade_thermal_response-> temperatureC; } /* Update the sensor info with current reading, this * reading will be utilized sensor event assetion post * discovery. */ if ((current_reading >= sensor->DataFormat.Range.NormalMax.Value. SensorFloat64) && (current_reading < sensor->DataFormat.Range.Max.Value. SensorFloat64)) { sensor_info->current_state = SAHPI_ES_UPPER_MAJOR; } else if (current_reading > sensor->DataFormat.Range.Max.Value. SensorFloat64) { sensor_info->current_state = SAHPI_ES_UPPER_CRIT; } /* Update the sensor info with current reading, this * reading will be utilized for sensor event assertion * post discovery. */ sensor_info->sensor_reading.Value.SensorFloat64 = current_reading; if (event_support == SAHPI_TRUE) { /* Set the event support to TRUE. * By default, RDR will have event support set * to FALSE */ sensor->EventCtrl = SAHPI_SEC_PER_EVENT; sensor->Events = SAHPI_ES_UPPER_CRIT | SAHPI_ES_UPPER_MAJOR; sensor_info->event_enable = SAHPI_TRUE; /* Thermal events are supported by OA only for * crossing CAUTION threshold and CRITICAL * THRESHOLD. * Hence appropriate bit masks needs to set for * assert and deassert mask */ sensor_info->assert_mask = SAHPI_ES_UPPER_CRIT | SAHPI_ES_UPPER_MAJOR; sensor_info->deassert_mask = SAHPI_ES_UPPER_CRIT | SAHPI_ES_UPPER_MAJOR; } break; case OA_SOAP_FAN_SPEED_CLASS: /* Cast the response structure to fan info response */ fan_info = (struct fanInfo*) response; /* Updating the rdr with actual critical threshold * value provided by OA */ sensor->DataFormat.Range.Max.Value.SensorFloat64 = fan_info->maxFanSpeed; /* Updating the rdr with actual critical threshold * value provided by OA */ sensor->DataFormat.Range.Max.Value.SensorFloat64 = fan_info->lowLimitFanSpeed; /* Currently OA does not have event support for SPEED * sensor, hence ignoring the event_support flag */ break; default: err("Sensor class not supported"); return SA_ERR_HPI_INTERNAL_ERROR; } return SA_OK; } /** * oa_soap_assert_sen_evt * @oh_handler : Pointer to openhpi handler * @rpt : Pointer to the RPT entry * @assert_sensor_list : Pointer to the assert sensor list * * Purpose: * Generates the sensor events for asserted sensors. * * Detailed Description: * - Extracts the sensor RDR from the assert sensor list * - Obtains the sensor number and sensor class. * - Gets the appropriate sensor assert event structure from the global * sensor array * - Raises the sensor assert event * - If the operational status of the resource has asserted, then raises * the resource failed event * * Return values: * SA_OK - Normal case. * SA_ERR_HPI_INVALID_PARAMS - On wrong parameters. **/ SaErrorT oa_soap_assert_sen_evt(struct oh_handler_state *oh_handler, SaHpiRptEntryT *rpt, GSList *assert_sensor_list) { GSList *node = NULL; SaHpiRdrT *rdr; SaHpiSensorNumT sensor_num; SaHpiInt32T sensor_class, assert_state; struct oa_soap_sensor_info *sensor_info; SaHpiFloat64T trigger_reading, trigger_threshold; if (oh_handler == NULL || rpt == NULL || assert_sensor_list == NULL) { err("Invalid parameters"); return SA_ERR_HPI_INVALID_PARAMS; } for (node = assert_sensor_list; node; node = node->next) { rdr = (SaHpiRdrT *)node->data; sensor_num = rdr->RdrTypeUnion.SensorRec.Num; /* Get the sensor information */ sensor_info = (struct oa_soap_sensor_info*) oh_get_rdr_data(oh_handler->rptcache, rpt->ResourceId, rdr->RecordId); sensor_class = oa_soap_sen_arr[sensor_num].sensor_class; switch (sensor_class) { case OA_SOAP_OPER_CLASS: case OA_SOAP_PRED_FAIL_CLASS: case OA_SOAP_REDUND_CLASS: case OA_SOAP_DIAG_CLASS: case OA_SOAP_ENC_AGR_OPER_CLASS: case OA_SOAP_ENC_AGR_PRED_FAIL_CLASS: case OA_SOAP_BOOL_CLASS: case OA_SOAP_BOOL_RVRS_CLASS: case OA_SOAP_HEALTH_OPER_CLASS: case OA_SOAP_HEALTH_PRED_FAIL_CLASS: trigger_reading = 0; trigger_threshold = 0; assert_state = OA_SOAP_SEN_ASSERT_TRUE; /* If the blade type is IO_BLADE or DISK BLADE * and if predictive failure sensor is * asserted, then change the power state of * partner blade in oa_soap_bay_pwr_status * to SAHPI_POWER_OFF */ if ((rpt->ResourceEntity.Entry[0].EntityType == SAHPI_ENT_IO_BLADE) || (rpt->ResourceEntity.Entry[0].EntityType == SAHPI_ENT_DISK_BLADE)) { if (sensor_num == OA_SOAP_SEN_PRED_FAIL) { oa_soap_bay_pwr_status[rpt-> ResourceEntity.Entry[0]. EntityLocation -1] = SAHPI_POWER_OFF; } } break; case OA_SOAP_TEMP_CLASS: trigger_reading = sensor_info->sensor_reading.Value. SensorFloat64; trigger_threshold = sensor_info->threshold.UpMajor.Value. SensorFloat64; assert_state = OA_SOAP_TEMP_OK_CAUT; if (sensor_info->current_state == SAHPI_ES_UPPER_CRIT) { /* Generate OK to CAUTION thermal * event */ oa_soap_gen_sen_evt(oh_handler, rpt, rdr, assert_state, trigger_reading, trigger_threshold); /* Update the assert state and trigger * threshold values */ assert_state = OA_SOAP_TEMP_CAUT_CRIT; trigger_threshold = sensor_info->threshold.UpMajor. Value.SensorFloat64; } break; default: err("Unrecognized sensor class %d " "is detected", sensor_class); /* Release the node->data */ g_free(node->data); continue; } /* Generate the sensor event */ oa_soap_gen_sen_evt(oh_handler, rpt, rdr, assert_state, trigger_reading, trigger_threshold); /* If the operational status has failed, raise the resource * failed event */ if (sensor_num == OA_SOAP_SEN_OPER_STATUS) oa_soap_gen_res_evt(oh_handler, rpt, OA_SOAP_SEN_ASSERT_TRUE); /* Release the node->data */ g_free(node->data); } /* End of while loop */ /* Release the assert_sensor_list */ g_slist_free(assert_sensor_list); return SA_OK; } /** * oa_soap_get_bld_thrm_sen_data * @oh_handler : Pointer to openhpi handler * @response : bladeThermalInfoArrayResponse response * @bld_thrm_info : pointer to the bladeThermalInfo * * Purpose: * Retrieve the correct instance of bladeThermalInfo structure instance * from bladeThermalInfoArrayResponse response * * Detailed Description: * NA * * Return values: * SA_OK - Normal case. * SA_ERR_HPI_INVALID_PARAMS - On wrong parameters. **/ SaErrorT oa_soap_get_bld_thrm_sen_data(SaHpiSensorNumT sen_num, struct bladeThermalInfoArrayResponse response, struct bladeThermalInfo *bld_thrm_info) { SaHpiInt32T sen_delta_num = 0; struct bladeThermalInfo blade_thermal_info; SaHpiInt32T index = -1, i; if (bld_thrm_info == NULL) { err("Invalid parameters"); return SA_ERR_HPI_INVALID_PARAMS; } /* "getBladeThermalInfoArray" response contains multiple instances * of bladeThermalInfo. It is required to map the correct instance * of the getBladeThermalInfo structure to the sensor number whose * reading is requested. * This mapping is achieved as follows: * Based on the sensor number, sensor base number and difference of the * sensor number w.r.t. sensor base number is determined(sen_delta_num). * This sen_delta_num helps determine the location of bladeThermalInfo * structure instance in the response required for sensor data. */ if (sen_num != OA_SOAP_SEN_TEMP_STATUS) { sen_delta_num = sen_num - oa_soap_bld_thrm_sen_base_arr [sen_num - OA_SOAP_BLD_THRM_SEN_START]; } /* As per discovery, mapping between the bladeThermalInfo response and * the sensor number can be be achieved based on the description string * in response and comment field in the sensor rdr. * Sometimes the comment field in sensor rdr may not have matching * substring in soap response. * Hence map the sensor rdr comment field to the standard string listed * in oa_soap_thermal_sensor_string array. as it is assumed that the * strings list in this array will match the description in response * For example: * The comment field of the system zone sensor * is "System Zone thermal status" and if the description field of * bladeThermalInfo structure is "System Zone", then it is possible to * achieve mapping between the response and sensor rdr. * But if the description field of bladeThermalInfo contains * "System Chassis", then it is difficult to achieve the mapping * between bladeThermalInfo structure instance to any particular sensor. */ for (i = 0; i * Raghavendra M.S. * Mohan Devarajulu */ #ifndef _OA_SOAP_SERVER_EVENT_H #define _OA_SOAP_SERVER_EVENT_H /* Include files */ #include "oa_soap_re_discover.h" SaErrorT process_server_power_off_event(struct oh_handler_state *oh_handler, struct oh_event *event); SaErrorT process_server_power_on_event(struct oh_handler_state *oh_handler, SOAP_CON *con, struct oh_event *event, int bay_number); SaErrorT process_server_power_event(struct oh_handler_state *oh_handler, SOAP_CON *con, struct eventInfo *oa_event); SaErrorT process_server_insertion_event(struct oh_handler_state *oh_handler, SOAP_CON *con, struct eventInfo *oa_event, SaHpiInt32T loc); SaErrorT process_server_extraction_event(struct oh_handler_state *oh_handler, struct eventInfo *oa_event); SaErrorT build_inserted_server_rpt(struct oh_handler_state *oh_handler, struct bladeInfo *response, SaHpiRptEntryT *rpt); void oa_soap_proc_server_status(struct oh_handler_state *oh_handler, SOAP_CON *con, struct bladeStatus *status); void oa_soap_serv_post_comp(struct oh_handler_state *oh_handler, SOAP_CON *con, SaHpiInt32T bay_number); SaErrorT oa_soap_set_thermal_sensor(struct oh_handler_state *oh_handler, SaHpiRptEntryT *rpt, struct bladeThermalInfoArrayResponse *thermal_response, SaHpiBoolT enable_flag); #endif openhpi-2.14.1/plugins/oa_soap/oa_soap_sel.h0000644000076400007640000000604111302566664015742 0ustar /* * Copyright (C) 2007-2008, Hewlett-Packard Development Company, LLP * All rights reserved. * * 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. * * Neither the name of the Hewlett-Packard Corporation, nor the names * of its contributors may be used to endorse or promote products * derived from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * Author(s) * Raghavendra M.S. */ #ifndef _OA_SOAP_SEL_H #define _OA_SOAP_SEL_H /* Include files */ #include #include SaErrorT oa_soap_get_sel_info(void *oh_handler, SaHpiResourceIdT resource_id, SaHpiEventLogInfoT *info); SaErrorT oa_soap_set_sel_time(void *oh_handler, SaHpiResourceIdT resource_id, SaHpiTimeT time); SaErrorT oa_soap_add_sel_entry(void *oh_handler, SaHpiResourceIdT resource_id, const SaHpiEventT *Event); SaErrorT oa_soap_clear_sel(void *oh_handler, SaHpiResourceIdT id); SaErrorT oa_soap_reset_sel_overflow(void *oh_handler, SaHpiResourceIdT resource_id); SaErrorT oa_soap_get_sel_entry(void *oh_handler, SaHpiResourceIdT resource_id, SaHpiEventLogEntryIdT current, SaHpiEventLogEntryIdT *prev, SaHpiEventLogEntryIdT *next, SaHpiEventLogEntryT *entry, SaHpiRdrT *rdr, SaHpiRptEntryT *rpt); SaErrorT oa_soap_sel_state_set(void *oh_handler, SaHpiResourceIdT id, SaHpiBoolT enable); #endif openhpi-2.14.1/plugins/oa_soap/oa_soap_calls.h0000644000076400007640000016524711302566663016272 0ustar /* * Copyright (C) 2007-2008, Hewlett-Packard Development Company, LLP * All rights reserved. * * 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. * * Neither the name of the Hewlett-Packard Corporation, nor the names * of its contributors may be used to endorse or promote products * derived from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * Author(s) * Bryan Sutula * Raghavendra PG * Raghavendra MS * Anand S */ #ifndef _INC_OA_SOAP_CALLS_H_ #define _INC_OA_SOAP_CALLS_H_ /* Include files */ #include "oa_soap_callsupport.h" /* Data types used to help us be more consistent with the WSDL description */ typedef unsigned char byte; /* These define the SOAP commands used to talk to the OA */ #define GET_BLADE_INFO \ "" \ "%d" \ "\n" #define SUBSCRIBE_FOR_EVENTS \ "" \ "\n" #define UN_SUBSCRIBE_FOR_EVENTS \ "" \ "%d" \ "\n" #define GET_EVENT \ "" \ "%d" \ "" \ "%d" \ "%d" \ "\n" #define GET_ALL_EVENTS \ "" \ "%d" \ "" \ "%d" \ "%d" \ "\n" #define SET_BLADE_POWER \ "" \ "%d" \ "%s" \ "\n" #define SET_INTERCONNECT_TRAY_POWER \ "" \ "%d" \ "%d" \ "\n" #define RESET_INTERCONNECT_TRAY \ "" \ "%d" \ "\n" #define GET_ENCLOSURE_INFO \ "" \ "\n" #define GET_OA_STATUS \ "" \ "%d" \ "\n" #define GET_OA_INFO \ "" \ "%d" \ "\n" #define GET_INTERCONNECT_TRAY_STATUS \ "" \ "%d" \ "\n" #define GET_INTERCONNECT_TRAY_INFO \ "" \ "%d" \ "\n" #define GET_FAN_INFO \ "" \ "%d" \ "\n" #define GET_POWER_SUBSYSTEM_INFO \ "" \ "\n" #define GET_POWER_SUPPLY_INFO \ "" \ "%d" \ "\n" #define GET_OA_NETWORK_INFO \ "" \ "%d" \ "\n" #define GET_BLADE_STATUS \ "" \ "%d" \ "\n" #define GET_THERMAL_INFO \ "" \ "%s" \ "%d" \ "\n" #define GET_USER_INFO \ "" \ "%s" \ "\n" #define IS_VALID_SESSION \ "" \ "\n" #define GET_RACK_TOPOLOGY2 \ "" \ "\n" #define GET_BLADE_MP_INFO \ "" \ "%d" \ "\n" #define GET_THERMAL_SUBSYSTEM_INFO \ "" \ "\n" #define GET_FAN_ZONE_ARRAY \ "" \ "%s" \ "\n" #define BAY "%d" #define GET_ENCLOSURE_STATUS \ "" \ "\n" #define GET_POWER_SUPPLY_STATUS \ "" \ "%d" \ "\n" #define GET_LCD_INFO \ "" \ "\n" #define GET_LCD_STATUS \ "" \ "\n" #define GET_BLADE_THERMAL_INFO_ARRAY \ "" \ "%d" \ "\n" #define SET_ENCLOSURE_UID \ "" \ "%s" \ "\n" #define SET_OA_UID \ "" \ "%d" \ "%s" \ "\n" #define SET_BLADE_UID \ "" \ "%d" \ "%s" \ "\n" #define SET_INTERCONNECT_TRAY_UID \ "" \ "%d" \ "%s" \ "\n" #define SET_LCD_BUTTON_LOCK \ "" \ "%d" \ "\n" /* Enumerated types used for specific SOAP commands */ OA_SOAP_ENUM(hpoa_boolean, HPOA_FALSE, HPOA_TRUE) OA_SOAP_ENUM(presence, PRESENCE_NO_OP, PRESENCE_UNKNOWN, ABSENT, PRESENT, SUBSUMED) OA_SOAP_ENUM(bladeType, BLADE_TYPE_NO_OP, BLADE_TYPE_UNKNOWN, BLADE_TYPE_SERVER, BLADE_TYPE_STORAGE, BLADE_TYPE_WORKSTATION, BLADE_TYPE_IO) OA_SOAP_ENUM(power, POWER_NO_OP, POWER_UNKNOWN, POWER_ON, POWER_OFF, POWER_STAGED_OFF, POWER_REBOOT) OA_SOAP_ENUM(powerState, PS_NO_OP, PS_UNKNOWN, PS_OFF, PS_LOW, PS_AUTOMATIC, PS_MAXIMUM) OA_SOAP_ENUM(shutdown, SHUTDOWN_NO_OP, SHUTDOWN_UNKNOWN, SHUTDOWN_OK, SHUTDOWN_SHUTDOWN, SHUTDOWN_THERMAL, SHUTDOWN_FAN, SHUTDOWN_RESTART) OA_SOAP_ENUM(uidStatus, UID_NO_OP, UID_UNKNOWN, UID_ON, UID_OFF, UID_BLINK, UID_DEMONSTRATION) /* Thank-you, OA team! One of the enum names here includes a '-' character, * which is illegal in an enum name. We need to keep the enum name legal in * C, yet parse a '-' character in the ASCII representations of opStatus. * If any changes are made to these values, make sure to keep both version * the same! */ enum opStatus { OP_STATUS_UNKNOWN, OP_STATUS_OTHER, OP_STATUS_OK, OP_STATUS_DEGRADED, OP_STATUS_STRESSED, OP_STATUS_PREDICTIVE_FAILURE, OP_STATUS_ERROR, OP_STATUS_NON_RECOVERABLE_ERROR, OP_STATUS_STARTING, OP_STATUS_STOPPING, OP_STATUS_STOPPED, OP_STATUS_IN_SERVICE, OP_STATUS_NO_CONTACT, OP_STATUS_LOST_COMMUNICATION, OP_STATUS_ABORTED, OP_STATUS_DORMANT, OP_STATUS_SUPPORTING_ENTITY_IN_ERROR, OP_STATUS_COMPLETED, OP_STATUS_POWER_MODE, OP_STATUS_DMTF_RESERVED, OP_STATUS_VENDER_RESERVED}; OA_SOAP_ENUM_STRING(opStatus, OP_STATUS_UNKNOWN, OP_STATUS_OTHER, OP_STATUS_OK, OP_STATUS_DEGRADED, OP_STATUS_STRESSED, OP_STATUS_PREDICTIVE_FAILURE, OP_STATUS_ERROR, OP_STATUS_NON-RECOVERABLE_ERROR, OP_STATUS_STARTING, OP_STATUS_STOPPING, OP_STATUS_STOPPED, OP_STATUS_IN_SERVICE, OP_STATUS_NO_CONTACT, OP_STATUS_LOST_COMMUNICATION, OP_STATUS_ABORTED, OP_STATUS_DORMANT, OP_STATUS_SUPPORTING_ENTITY_IN_ERROR, OP_STATUS_COMPLETED, OP_STATUS_POWER_MODE, OP_STATUS_DMTF_RESERVED, OP_STATUS_VENDER_RESERVED) OA_SOAP_ENUM(sensorStatus, SENSOR_STATUS_NO_OP, SENSOR_STATUS_UNKNOWN, SENSOR_STATUS_OK, SENSOR_STATUS_WARM, SENSOR_STATUS_CAUTION, SENSOR_STATUS_CRITICAL) OA_SOAP_ENUM(diagnosticStatus, NOT_RELEVANT, DIAGNOSTIC_CHECK_NOT_PERFORMED, NO_ERROR, ERROR) OA_SOAP_ENUM(oaRole, OA_ABSENT, STANDBY, TRANSITION, ACTIVE) OA_SOAP_ENUM(wizardStatus, WIZARD_NOT_COMPLETED, LCD_WIZARD_COMPLETE, WIZARD_SETUP_COMPLETE) OA_SOAP_ENUM(portMapStatus, UNKNOWN, OK, MISMATCH) OA_SOAP_ENUM(bladeSizeType, BLADE_SIZE_TYPE_MT, BLADE_SIZE_TYPE_1X1, BLADE_SIZE_TYPE_1X2) OA_SOAP_ENUM(bladeMezzSlotType, MEZZ_SLOT_TYPE_MT, MEZZ_SLOT_TYPE_ONE, MEZZ_SLOT_TYPE_TWO, MEZZ_SLOT_TYPE_FIXED) OA_SOAP_ENUM(bladeMezzDevType, MEZZ_DEV_TYPE_MT, MEZZ_DEV_TYPE_ONE, MEZZ_DEV_TYPE_TWO, MEZZ_DEV_TYPE_FIXED) OA_SOAP_ENUM(bladeMezzDevStatus, MEZZ_DEV_STATUS_UNKNOWN, MEZZ_DEV_STATUS_OK, MEZZ_DEV_STATUS_MISMATCH) OA_SOAP_ENUM(fabricType, FABRIC_TYPE_MT, FABRIC_TYPE_ETH, FABRIC_TYPE_FIB, FABRIC_TYPE_10GETH, FABRIC_TYPE_IFB, FABRIC_TYPE_PCI, FABRIC_TYPE_SAS, FABRIC_TYPE_MAX) OA_SOAP_ENUM(fabricStatus, FABRIC_STATUS_UNKNOWN, FABRIC_STATUS_OK, FABRIC_STATUS_MISMATCH) OA_SOAP_ENUM(interconnectTrayType, INTERCONNECT_TRAY_TYPE_NO_CONNECTION, INTERCONNECT_TRAY_TYPE_NIC, INTERCONNECT_TRAY_TYPE_FC, INTERCONNECT_TRAY_TYPE_10GETH, INTERCONNECT_TRAY_TYPE_IB, INTERCONNECT_TRAY_TYPE_PCIE, INTERCONNECT_TRAY_TYPE_SAS, INTERCONNECT_TRAY_TYPE_MAX) OA_SOAP_ENUM(interconnectTraySizeType, INTERCONNECT_TRAY_SIZE_TYPE_MT, INTERCONNECT_TRAY_SIZE_TYPE_1X1, INTERCONNECT_TRAY_SIZE_TYPE_2x1) OA_SOAP_ENUM(interconnectTrayPassThroughEnabled, INTERCONNECT_TRAY_PASSTHROUGH_UNKNOWN, INTERCONNECT_TRAY_PASSTHROUGH_DISABLED, INTERCONNECT_TRAY_PASSTHROUGH_ENABLED) OA_SOAP_ENUM(interconnectTrayPortStatus, INTERCONNECT_TRAY_PORT_STATUS_UNKNOWN, INTERCONNECT_TRAY_PORT_STATUS_OK, INTERCONNECT_TRAY_PORT_STATUS_MISMATCH) OA_SOAP_ENUM(interconnectTrayPortEnabled, INTERCONNECT_TRAY_PORT_ENABLED_UNKNOWN, INTERCONNECT_TRAY_PORT_DISABLED, INTERCONNECT_TRAY_PORT_ENABLED) OA_SOAP_ENUM(interconnectTrayPortUidStatus, INTERCONNECT_TRAY_UID_UNKNOWN, INTERCONNECT_TRAY_UID_OFF, INTERCONNECT_TRAY_UID_ON) OA_SOAP_ENUM(interconnectTrayPortLinkLedStatus, INTERCONNECT_TRAY_LINK_LED_UNKNOWN, INTERCONNECT_TRAY_LINK_LED_OFF, INTERCONNECT_TRAY_LINK_LED_ON) OA_SOAP_ENUM(powerSystemType, SUBSYSTEM_NO_OP, SUBSYSTEM_UNKNOWN, INTERNAL_AC, INTERNAL_DC, EXTERNAL_DC) OA_SOAP_ENUM(redundancy, REDUNDANCY_NO_OP, REDUNDANCY_UNKNOWN, NOT_REDUNDANT, REDUNDANT) OA_SOAP_ENUM(powerRedundancy, REDUNDANT_UNKNOWN, NON_REDUNDANT, AC_REDUNDANT, POWER_SUPPLY_REDUNDANT, AC_REDUNDANT_WITH_POWER_CEILING, POWER_SUPPLY_REDUNDANT_WITH_POWER_CEILING, NON_REDUNDANT_WITH_POWER_CEILING) #define SENSOR_TYPE_LENGTH 25 /* Max length of these enums + 1 */ OA_SOAP_ENUM(sensorType, SENSOR_TYPE_BLADE, SENSOR_TYPE_INTERCONNECT, SENSOR_TYPE_OA, SENSOR_TYPE_ENC) OA_SOAP_ENUM(userAcl, ADMINISTRATOR, OPERATOR, USER, ANONYMOUS) OA_SOAP_ENUM(lcdButton, LCD_OK, LCD_UP, LCD_DOWN, LCD_RIGHT, LCD_LEFT, LCD_USERNOTES) OA_SOAP_ENUM(lcdButtonState, CLICKED, PRESSED, RELEASED) OA_SOAP_ENUM(lcdSetupHealth, LCD_SETUP_HEALTH_UNKNOWN, LCD_SETUP_HEALTH_OK, LCD_SETUP_HEALTH_INFORMATIONAL, LCD_SETUP_HEALTH_DEGRADED, LCD_SETUP_HEALTH_FAILED) OA_SOAP_ENUM(lcdChatMessageType, STATEMENT, QUESTION, ANSWER, QUESTION_DISMISSED) OA_SOAP_ENUM(hpSimTrustMode, HPSIM_DISABLED, TRUST_BY_NAME, TRUST_BY_CERTIFICATE, TRUST_ALL) OA_SOAP_ENUM(iplDevice, IPL_NO_OP, CD, FLOPPY, HDD, USB, PXE_NIC1, PXE_NIC2, PXE_NIC3, PXE_NIC4) OA_SOAP_ENUM(oneTimeBootDevice, ONE_TIME_BOOT_NO_CHANGE, ONE_TIME_BOOT_FLOPPY, ONE_TIME_BOOT_CD, ONE_TIME_BOOT_HARD_DRIVE, ONE_TIME_BOOT_TAPE) OA_SOAP_ENUM(oneTimeBootAgent, NORMAL_BOOT_OS, SYS_PART, QUICK_DIAGS, RBSU, PXE) OA_SOAP_ENUM(powerReductionState, SPRS_NO_OP, SPRS_UNKNOWN, SPRS_FIRED, SPRS_RESTORED) OA_SOAP_ENUM(powerReductionArmedState, SPRAS_NO_OP, SPRAS_UNKNOWN, SPRAS_DISARMED, SPRAS_ARMED) OA_SOAP_ENUM(virtualMediaSupport, VM_SUPPORT_UNKNOWN, VM_DEV_ABSENT, VM_BAY_SUBSUMED, VM_SUPPORTED, VM_NOT_SUPPORTED, VM_FIRMWARE_UPDATE_NEEDED) OA_SOAP_ENUM(virtualMediaDeviceStatus, VM_DEV_STATUS_UNKNOWN, VM_DEV_STATUS_DISCONNECTED, VM_DEV_STATUS_CONNECTED, VM_DEV_STATUS_DISCONNECTING, VM_DEV_STATUS_CONNECTING) #define POWER_CONTROL_LENGTH 16 /* Max length of these enums + 1 */ OA_SOAP_ENUM(powerControl, MOMENTARY_PRESS, PRESS_AND_HOLD, COLD_BOOT, RESET) #define UID_CONTROL_LENGTH 15 /* Max length of these enums + 1 */ OA_SOAP_ENUM(uidControl, UID_CMD_TOGGLE, UID_CMD_ON, UID_CMD_OFF, UID_CMD_BLINK) OA_SOAP_ENUM(eventType, EVENT_HEARTBEAT, EVENT_ENC_STATUS, EVENT_ENC_UID, EVENT_ENC_SHUTDOWN, EVENT_ENC_INFO, EVENT_ENC_NAMES, EVENT_USER_PERMISSION, EVENT_ADMIN_RIGHTS_CHANGED, EVENT_ENC_SHUTDOWN_PENDING, EVENT_ENC_TOPOLOGY, EVENT_FAN_STATUS, EVENT_FAN_INSERTED, EVENT_FAN_REMOVED, EVENT_FAN_GROUP_STATUS, EVENT_THERMAL_STATUS, EVENT_COOLING_STATUS, EVENT_FAN_ZONE_STATUS, EVENT_PS_STATUS, EVENT_PS_INSERTED, EVENT_PS_REMOVED, EVENT_PS_REDUNDANT, EVENT_PS_OVERLOAD, EVENT_AC_FAILURE, EVENT_PS_INFO, EVENT_PS_SUBSYSTEM_STATUS, EVENT_SERVER_POWER_REDUCTION_STATUS, EVENT_INTERCONNECT_STATUS, EVENT_INTERCONNECT_RESET, EVENT_INTERCONNECT_UID, EVENT_INTERCONNECT_INSERTED, EVENT_INTERCONNECT_REMOVED, EVENT_INTERCONNECT_INFO, EVENT_INTERCONNECT_HEALTH_LED, EVENT_INTERCONNECT_THERMAL, EVENT_INTERCONNECT_CPUFAULT, EVENT_INTERCONNECT_POWER, EVENT_INTERCONNECT_PORTMAP, EVENT_BLADE_PORTMAP, EVENT_INTERCONNECT_VENDOR_BLOCK, EVENT_INTERCONNECT_HEALTH_STATE, EVENT_DEMO_MODE, EVENT_BLADE_STATUS, EVENT_BLADE_INSERTED, EVENT_BLADE_REMOVED, EVENT_BLADE_POWER_STATE, EVENT_BLADE_POWER_MGMT, EVENT_BLADE_UID, EVENT_BLADE_SHUTDOWN, EVENT_BLADE_FAULT, EVENT_BLADE_THERMAL, EVENT_BLADE_INFO, EVENT_BLADE_MP_INFO, EVENT_ILO_READY, EVENT_LCD_BUTTON, EVENT_KEYING_ERROR, EVENT_ILO_HAS_IPADDRESS, EVENT_POWER_INFO, EVENT_LCD_STATUS, EVENT_LCD_INFO, EVENT_REDUNDANCY, EVENT_ILO_DEAD, EVENT_RACK_SERVICE_STARTED, EVENT_LCD_SCREEN_REFRESH, EVENT_ILO_ALIVE, EVENT_PERSONALITY_CHECK, EVENT_BLADE_POST_COMPLETE, EVENT_BLADE_SIGNATURE_CHANGED, EVENT_BLADE_PERSONALITY_CHANGED, EVENT_BLADE_TOO_LOW_POWER, EVENT_VIRTUAL_MEDIA_STATUS, EVENT_MEDIA_DRIVE_INSERTED, EVENT_MEDIA_DRIVE_REMOVED, EVENT_MEDIA_INSERTED, EVENT_MEDIA_REMOVED, EVENT_OA_NAMES, EVENT_OA_STATUS, EVENT_OA_UID, EVENT_OA_INSERTED, EVENT_OA_REMOVED, EVENT_OA_INFO, EVENT_OA_FAILOVER, EVENT_OA_TRANSITION_COMPLETE, EVENT_OA_VCM, EVENT_NETWORK_INFO_CHANGED, EVENT_SNMP_INFO_CHANGED, EVENT_SYSLOG_CLEARED, EVENT_SESSION_CLEARED, EVENT_TIME_CHANGE, EVENT_SESSION_STARTED, EVENT_BLADE_CONNECT, EVENT_BLADE_DISCONNECT, EVENT_SWITCH_CONNECT, EVENT_SWITCH_DISCONNECT, EVENT_BLADE_CLEARED, EVENT_SWITCH_CLEARED, EVENT_ALERTMAIL_INFO_CHANGED, EVENT_LDAP_INFO_CHANGED, EVENT_EBIPA_INFO_CHANGED, EVENT_HPSIM_TRUST_MODE_CHANGED, EVENT_HPSIM_CERTIFICATE_ADDED, EVENT_HPSIM_CERTIFICATE_REMOVED, EVENT_USER_INFO_CHANGED, EVENT_BAY_CHANGED, EVENT_GROUP_CHANGED, EVENT_OA_REBOOT, EVENT_OA_LOGOFF_REQUEST, EVENT_USER_ADDED, EVENT_USER_DELETED, EVENT_USER_ENABLED, EVENT_USER_DISABLED, EVENT_GROUP_ADDED, EVENT_GROUP_DELETED, EVENT_LDAPGROUP_ADDED, EVENT_LDAPGROUP_DELETED, EVENT_LDAPGROUP_ADMIN_RIGHTS_CHANGED, EVENT_LDAPGROUP_INFO_CHANGED, EVENT_LDAPGROUP_PERMISSION, EVENT_LCDPIN, EVENT_LCD_USER_NOTES_CHANGED, EVENT_LCD_BUTTONS_LOCKED, EVENT_LCD_SCREEN_CHAT_REQUESTED, EVENT_LCD_SCREEN_CHAT_WITHDRAWN, EVENT_LCD_SCREEN_CHAT_ANSWERED, EVENT_LCD_USER_NOTES_IMAGE_CHANGED, EVENT_ENC_WIZARD_STATUS, EVENT_SSHKEYS_INSTALLED, EVENT_SSHKEYS_CLEARED, EVENT_LDAP_DIRECTORY_SERVER_CERTIFICATE_ADDED, EVENT_LDAP_DIRECTORY_SERVER_CERTIFICATE_REMOVED, EVENT_BLADE_BOOT_CONFIG, EVENT_OA_NETWORK_CONFIG_CHANGED, EVENT_HPSIM_XENAME_ADDED, EVENT_HPSIM_XENAME_REMOVED, EVENT_FLASH_PENDING, EVENT_FLASH_STARTED, EVENT_FLASH_PROGRESS, EVENT_FLASH_COMPLETE, EVENT_STANDBY_FLASH_STARTED, EVENT_STANDBY_FLASH_PROGRESS, EVENT_STANDBY_FLASH_COMPLETE, EVENT_STANDBY_FLASH_BOOTING, EVENT_STANDBY_FLASH_BOOTED, EVENT_STANDBY_FLASH_FAILED, EVENT_FLASHSYNC_BUILD, EVENT_FLASHSYNC_BUILDDONE, EVENT_FLASHSYNC_FAILED, EVENT_FLASHSYNC_STANDBY_BUILD, EVENT_FLASHSYNC_STANDBY_BUILDDONE, EVENT_FLASHSYNC_STANDBY_FAILED, EVENT_NONILO_EBIPA, EVENT_FACTORY_RESET, EVENT_BLADE_INSERT_COMPLETED, EVENT_EBIPA_INFO_CHANGED_EX, EVENT_BLADE_ESI_CHANGED, EVENT_ENC_TOPOLOGY_2, EVENT_TFA_CA_CERT_ADDED, EVENT_TFA_CA_CERT_REMOVED, EVENT_USER_CERT_ADDED, EVENT_USER_CERT_REMOVED, EVENT_PW_SETTINGS_CHANGED, EVENT_SYSLOG_SETTINGS_CHANGED, EVENT_POWERDELAY_SETTINGS_CHANGED, EVENT_USB_OA_FW_FILES, EVENT_USB_OA_CONFIG_SCRIPTS, EVENT_MEDIA_DRIVE_INSERTED2, EVENT_MEDIA_DRIVE_REMOVED2, EVENT_MEDIA_INSERTED2, EVENT_MEDIA_REMOVED2) /* This is not part of the SOAP response data from the OA, but is useful * for identifying the type of data that comes back from getAllEvents(). */ OA_SOAP_ENUM(enum_eventInfo, SYSLOG, RACKTOPOLOGY, ENCLOSURESTATUS, ENCLOSUREINFO, OASTATUS, OAINFO, BLADEINFO, BLADEMPINFO, BLADESTATUS, BLADEPORTMAP, FANINFO, INTERCONNECTTRAYSTATUS, INTERCONNECTTRAYINFO, INTERCONNECTTRAYPORTMAP, POWERSUPPLYINFO, POWERSUPPLYSTATUS, POWERSUBSYSTEMINFO, POWERCONFIGINFO, THERMALINFO, USERINFOARRAY, USERINFO, LDAPINFO, LDAPGROUPINFO, SNMPINFO, ENCLOSURENETWORKINFO, OANETWORKINFO, ENCLOSURETIME, ALERTMAILINFO, PASSWORDSETTINGS, EBIPAINFO, LCDCHATMESSAGE, LCDUSERNOTES, LCDBUTTONEVENT, LCDSTATUS, LCDINFO, HPSIMINFO, THERMALSUBSYSTEMINFO, BLADEBOOTINFO, OAVCMMODE, POWERREDUCTIONSTATUS, VIRTUALMEDIASTATUS, OAMEDIADEVICE, FANZONE, EBIPAINFOEX, CACERTSINFO, RACKTOPOLOGY2, USERCERTIFICATEINFO, SYSLOGSETTINGS, POWERDELAYSETTINGS, USBMEDIAFIRMWAREIMAGES, CONFIGSCRIPTS, NUMVALUE, STRING, MESSAGE, NOPAYLOAD) OA_SOAP_ENUM(enum_usbMode, USB_KVM_ENABLED, USB_DVD_ENABLED) OA_SOAP_ENUM(enum_networkProtocol, NET_PROTO_SNMP, NET_PROTO_SSH, NET_PROTO_TELNET, NET_PROTO_HTTP, NET_PROTO_NTP, NET_PROTO_IPSECURITY, NET_PROTO_ALERTMAIL, NET_PROTO_EBIPA_SVB, NET_PROTO_EBIPA_SWM, NET_PROTO_XMLREPLY, NET_PROTO_DYNDNS, NET_PROTO_LLF, NET_PROTO_IPSWAP) OA_SOAP_ENUM(enum_nicSpeed, NIC_SPEED_10, NIC_SPEED_100, NIC_SPEED_1000, NIC_SPEED_10000) OA_SOAP_ENUM(enum_nicDuplex, NIC_DUPLEX_HALF, NIC_DUPLEX_FULL) OA_SOAP_ENUM(enum_fileType, FIRMWARE_IMAGE, LCD_IMAGE, CONFIG_SCRIPT, SSH_KEYS_FILE, SSL_CERTIFICATE, LDAP_DIRECTORY_SERVER_CERTIFICATE, HPSIM_CERTIFICATE, FIRMWARE_INTERNAL_IMAGE, PROLIANT_MP_IMAGE) /* Structures that return information from OA SOAP calls */ struct bladeCpuInfo { char *cpuType; int cpuSpeed; }; struct bladeNicInfo { char *port; char *macAddress; }; struct extraDataInfo { char *name; char *value; }; struct bladeInfo { byte bayNumber; enum presence presence; enum bladeType bladeType; byte width; byte height; char *name; char *manufacturer; char *partNumber; char *sparePartNumber; char *serialNumber; char *serverName; char *uuid; char *rbsuOsName; char *assetTag; char *romVersion; byte numberOfCpus; xmlNode *cpus; int memory; byte numberOfNics; xmlNode *nics; short mmHeight; short mmWidth; short mmDepth; int deviceId; int productId; xmlNode *extraData; /* Items are struct extraDataInfo */ }; /* Structures that supply information to OA SOAP calls */ struct getBladeInfo { int bayNumber; }; struct diagnosticChecks { enum diagnosticStatus internalDataError; enum diagnosticStatus managementProcessorError; enum diagnosticStatus thermalWarning; enum diagnosticStatus thermalDanger; enum diagnosticStatus ioConfigurationError; enum diagnosticStatus devicePowerRequestError; enum diagnosticStatus insufficientCooling; enum diagnosticStatus deviceLocationError; enum diagnosticStatus deviceFailure; enum diagnosticStatus deviceDegraded; enum diagnosticStatus acFailure; enum diagnosticStatus i2cBuses; enum diagnosticStatus redundancy; }; struct diagnosticData { enum diagnosticStatus value; char *name; }; struct bladeStatus { byte bayNumber; enum presence presence; enum opStatus operationalStatus; enum sensorStatus thermal; enum power powered; enum powerState powerState; enum shutdown shutdown; enum uidStatus uid; int powerConsumed; struct diagnosticChecks diagnosticChecks; xmlNode *diagnosticChecksEx; /* Items are struct diagnosticData */ xmlNode *extraData; /* Items are struct extraDataInfo */ }; struct getBladeStatus { int bayNumber; }; struct syslog { byte bayNumber; int syslogStrlen; char *logContents; xmlNode *extraData; /* Items are struct extraDataInfo */ }; struct encLink { byte enclosureNumber; char *oaName; char *uuid; char *rackName; char *enclosureName; char *url; enum hpoa_boolean local; xmlNode *extraData; /* Items are struct extraDataInfo */ }; struct rackTopology { char *ruid; xmlNode *enclosures; /* Items are struct encLink */ xmlNode *extraData; /* Items are struct extraDataInfo */ }; struct enclosureStatus { enum opStatus operationalStatus; enum uidStatus uid; enum wizardStatus wizardStatus; struct diagnosticChecks diagnosticChecks; xmlNode *diagnosticChecksEx; /* Items are struct diagnosticData */ xmlNode *extraData; /* Items are struct extraDataInfo */ }; struct enclosureInfo { char *rackName; char *enclosureName; char *hwVersion; byte bladeBays; byte fanBays; byte powerSupplyBays; byte thermalSensors; byte interconnectTrayBays; byte oaBays; char *name; char *partNumber; char *serialNumber; char *uuid; char *assetTag; char *manufacturer; char *chassisSparePartNumber; char *interposerManufacturer; char *interposerName; char *interposerPartNumber; char *interposerSerialNumber; char *pduType; short mmHeight; short mmWidth; short mmDepth; char *pduPartNumber; char *pduSparePartNumber; xmlNode *extraData; /* Items are struct extraDataInfo */ }; struct oaStatus { byte bayNumber; char *oaName; enum oaRole oaRole; enum opStatus operationalStatus; enum uidStatus uid; byte restartCause; enum hpoa_boolean oaRedundancy; struct diagnosticChecks diagnosticChecks; xmlNode *diagnosticChecksEx; /* Items are struct diagnosticData */ xmlNode *extraData; /* Items are struct extraDataInfo */ }; struct getOaStatus { int bayNumber; }; struct oaInfo { byte bayNumber; enum hpoa_boolean youAreHere; char *name; char *partNumber; char *sparePartNumber; char *serialNumber; char *uuid; char *assetTag; char *manufacturer; char *hwVersion; char *fwVersion; short mmHeight; short mmWidth; short mmDepth; xmlNode *extraData; /* Items are struct extraDataInfo */ }; struct getOaInfo { int bayNumber; }; struct getBladeMpInfo { int bayNumber; }; struct bladeMpInfo { byte bayNumber; char *ipAddress; char *macAddress; char *dnsName; char *modelName; char *fwVersion; char *remoteConsoleUrl; char *webUrl; char *ircUrl; char *loginUrl; char *ircFullUrl; char *remoteSerialUrl; xmlNode *extraData; /* Items are struct extraDataInfo */ }; struct bladeMezzSlotPort { byte slotNumber; byte interconnectTrayBayNumber; byte interconnectTrayPortNumber; xmlNode *extraData; /* Items are struct extraDataInfo */ }; struct bladeMezzSlotInfo { enum bladeMezzSlotType type; int sizeslot; struct bladeMezzSlotPort slot; xmlNode *extraData; /* Items are struct extraDataInfo */ }; struct bladeMezzDevPort { byte portNumber; char *wwpn; enum fabricType fabric; enum fabricStatus status; xmlNode *extraData; /* Items are struct extraDataInfo */ }; struct bladeMezzDevInfo { char *name; enum bladeMezzDevType type; enum bladeMezzDevStatus status; int sizeport; struct bladeMezzDevPort port; xmlNode *extraData; /* Items are struct extraDataInfo */ }; struct bladeMezzInfo { byte mezzNumber; struct bladeMezzSlotInfo mezzSlots; struct bladeMezzDevInfo mezzDevices; xmlNode *extraData; /* Items are struct extraDataInfo */ }; struct bladePortMap { byte bladeBayNumber; enum portMapStatus status; enum bladeSizeType bladeSizeType; byte numberOfMezzes; int sizemezz; struct bladeMezzInfo mezz; xmlNode *extraData; /* Items are struct extraDataInfo */ }; struct fanInfo { byte bayNumber; enum presence presence; char *name; char *partNumber; char *sparePartNumber; char *serialNumber; int powerConsumed; int fanSpeed; int maxFanSpeed; int lowLimitFanSpeed; enum opStatus operationalStatus; struct diagnosticChecks diagnosticChecks; xmlNode *diagnosticChecksEx; /* Items are struct diagnosticData */ xmlNode *extraData; /* Items are struct extraDataInfo */ }; struct getFanInfo { int bayNumber; }; struct portEnabled { byte portNumber; enum hpoa_boolean enabled; }; struct interconnectTrayStatus { byte bayNumber; enum opStatus operationalStatus; enum presence presence; enum sensorStatus thermal; enum hpoa_boolean cpuFault; enum hpoa_boolean healthLed; enum uidStatus uid; enum power powered; xmlNode *ports; /* Items are struct portEnabled */ struct diagnosticChecks diagnosticChecks; xmlNode *diagnosticChecksEx; /* Items are struct diagnosticData */ xmlNode *extraData; /* Items are struct extraDataInfo */ }; struct getInterconnectTrayStatus { int bayNumber; }; struct interconnectTrayInfo { byte bayNumber; enum interconnectTrayType interconnectTrayType; enum hpoa_boolean passThroughSupport; enum hpoa_boolean portDisableSupport; enum hpoa_boolean temperatureSensorSupport; byte width; char *manufacturer; char *name; char *partNumber; char *serialNumber; char *sparePartNumber; enum hpoa_boolean rs232PortRoute; enum hpoa_boolean ethernetPortRoute; char *userAssignedName; char *inBandIpAddress; char *urlToMgmt; int powerOnWatts; int powerOffWatts; xmlNode *extraData; /* Items are struct extraDataInfo */ }; struct getInterconnectTrayInfo { int bayNumber; }; struct interconnectTrayPortInfo { byte interconnectTraySlotPortNumber; byte bladeBayNumber; byte bladeMezzNumber; byte bladeMezzPortNumber; enum interconnectTrayPortStatus portStatus; enum interconnectTrayPortEnabled portEnabled; enum interconnectTrayPortUidStatus portUidStatus; enum interconnectTrayPortLinkLedStatus portLinkLedStatus; xmlNode *extraData; /* Items are struct extraDataInfo */ }; struct interconnectTraySlotInfo { byte interconnectTraySlotNumber; enum interconnectTrayType type; int sizeport; struct interconnectTrayPortInfo port; xmlNode *extraData; /* Items are struct extraDataInfo */ }; struct interconnectTrayPortMap { byte interconnectTrayBayNumber; enum portMapStatus status; enum interconnectTraySizeType sizeType; enum interconnectTrayPassThroughEnabled passThroughModeEnabled; byte numberOfSlots; int sizeslot; struct interconnectTraySlotInfo slot; xmlNode *extraData; /* Items are struct extraDataInfo */ }; struct powerSupplyInfo { byte bayNumber; enum presence presence; char *modelNumber; char *sparePartNumber; char *serialNumber; int capacity; int actualOutput; xmlNode *extraData; /* Items are struct extraDataInfo */ }; struct getPowerSupplyInfo { int bayNumber; }; struct getPowerSupplyStatus { int bayNumber; }; struct powerSupplyStatus { byte bayNumber; enum presence presence; enum opStatus operationalStatus; enum opStatus inputStatus; struct diagnosticChecks diagnosticChecks; xmlNode *diagnosticChecksEx; /* Items are struct diagnosticData */ xmlNode *extraData; /* Items are struct extraDataInfo */ }; struct powerSubsystemInfo { enum powerSystemType subsystemType; enum opStatus operationalStatus; enum redundancy redundancy; enum powerRedundancy redundancyMode; int capacity; int redundantCapacity; int outputPower; int powerConsumed; float inputPowerVa; float inputPowerCapacityVa; float inputPower; float inputPowerCapacity; byte goodPowerSupplies; byte wantedPowerSupplies; byte neededPowerSupplies; xmlNode *extraData; /* Items are struct extraDataInfo */ }; struct powerConfigInfo { int powerCeiling; enum powerRedundancy redundancyMode; enum hpoa_boolean dynamicPowerSaverEnabled; xmlNode *extraData; /* Items are struct extraDataInfo */ }; struct thermalInfo { enum sensorType sensorType; byte bayNumber; enum sensorStatus sensorStatus; enum opStatus operationalStatus; byte temperatureC; byte cautionThreshold; byte criticalThreshold; xmlNode *extraData; /* Items are struct extraDataInfo */ }; struct getThermalInfo { enum sensorType sensorType; int bayNumber; }; struct bayAccess { byte bayNumber; enum hpoa_boolean access; }; struct enclosureBaysSelection { enum hpoa_boolean oaAccess; xmlNode *bladeBays; /* Items are struct bayAccess */ xmlNode *interconnectTrayBays; /* Items are struct bayAccess */ xmlNode *extraData; /* Items are struct extraDataInfo */ }; struct userInfo { char *username; char *fullname; char *contactInfo; enum hpoa_boolean isEnabled; enum userAcl acl; struct enclosureBaysSelection bayPermissions; xmlNode *extraData; /* Items are struct extraDataInfo */ }; struct getUserInfo { char *username; }; struct x509CertificateInfo { byte certificateVersion; char *issuerOrganization; char *issuerOrganizationalUnit; char *issuerCommonName; char *subjectOrganization; char *subjectOrganizationalUnit; char *subjectCommonName; time_t validFrom; time_t validTo; char *serialNumber; int extensionCount; char *md5Fingerprint; char *sha1Fingerprint; xmlNode *extraData; /* Items are struct extraDataInfo */ }; struct certificates { int numberOfCertificates; int sizecertificate; xmlNode *certificate; /* Items are struct x509CertificateInfo */ xmlNode *extraData; /* Items are struct extraDataInfo */ }; struct ldapInfo { enum hpoa_boolean ldapEnabled; enum hpoa_boolean localUsersEnabled; char *directoryServerAddress; short directoryServerSslPort; char *searchContext1; char *searchContext2; char *searchContext3; enum hpoa_boolean userNtAccountNameMapping; struct certificates certificates; xmlNode *extraData; /* Items are struct extraDataInfo */ }; struct ldapGroupInfo { char *ldapGroupName; char *description; enum userAcl acl; struct enclosureBaysSelection bayPermissions; xmlNode *extraData; /* Items are struct extraDataInfo */ }; struct trapInfo { char *ipAddress; char *community; xmlNode *extraData; /* Items are struct extraDataInfo */ }; struct snmpInfo { char *sysName; char *sysLocation; char *sysContact; char *roCommunity; char *rwCommunity; int numTraps; xmlNode *traps; /* Items are struct trapInfo */ xmlNode *extraData; /* Items are struct extraDataInfo */ }; struct enclosureNetworkInfo { xmlNode *ntpServers; /* Items are char *ipAddress */ int ntpPoll; xmlNode *ipAllow; /* Items are char *ipAddress */ enum hpoa_boolean httpsEnabled; enum hpoa_boolean snmpEnabled; enum hpoa_boolean sshEnabled; enum hpoa_boolean telnetEnabled; enum hpoa_boolean ntpEnabled; enum hpoa_boolean ipSecurityEnabled; enum hpoa_boolean alertmailEnabled; enum hpoa_boolean ebipaSvbEnabled; enum hpoa_boolean ebipaSwmEnabled; enum hpoa_boolean xmlReplyEnabled; xmlNode *extraData; /* Items are struct extraDataInfo */ }; struct oaNetworkInfo { byte bayNumber; enum hpoa_boolean dhcpEnabled; enum hpoa_boolean dynDnsEnabled; char *macAddress; char *ipAddress; char *netmask; char *gateway; xmlNode *dns; /* Items are char *ipAddress */ char *elinkIpAddress; enum hpoa_boolean linkActive; xmlNode *extraData; /* Items are struct extraDataInfo */ }; struct getOaNetworkInfo { int bayNumber; }; struct enclosureTime { time_t dateTime; char *timeZone; time_t universalDateTime; xmlNode *extraData; /* Items are struct extraDataInfo */ }; struct alertmailInfo { char *server; char *receiver; char *domain; xmlNode *extraData; /* Items are struct extraDataInfo */ }; struct ebipaInfo { char *svbIpAddress; char *svbNetmask; char *svbGateway; char *svbDomain; xmlNode *svbDns; /* Items are char *ipAddress */ xmlNode *svbNtpServer; /* Items are char *ipAddress */ char *swmIpAddress; char *swmNetmask; char *swmGateway; char *swmDomain; xmlNode *swmDns; /* Items are char *ipAddress */ xmlNode *swmNtpServer; /* Items are char *ipAddress */ enum hpoa_boolean isConfiguredSvb; enum hpoa_boolean isConfiguredSwm; xmlNode *extraData; /* Items are struct extraDataInfo */ }; struct lcdChatMessage { enum lcdChatMessageType lcdChatMessageType; char *screenName; char *questionText; char *answerChoiceList; char *selectedAnswerText; char *customAnswerText; xmlNode *extraData; /* Items are struct extraDataInfo */ }; struct lcdUserNotes { char *lcdUserNotesLine1; char *lcdUserNotesLine2; char *lcdUserNotesLine3; char *lcdUserNotesLine4; char *lcdUserNotesLine5; char *lcdUserNotesLine6; xmlNode *extraData; /* Items are struct extraDataInfo */ }; struct lcdButtonEvent { enum lcdButton button; enum lcdButtonState buttonState; xmlNode *extraData; /* Items are struct extraDataInfo */ }; struct lcdStatus { enum opStatus status; enum uidStatus display; enum hpoa_boolean lcdPin; enum hpoa_boolean buttonLock; enum lcdSetupHealth lcdSetupHealth; struct diagnosticChecks diagnosticChecks; xmlNode *diagnosticChecksEx; /* Items are struct diagnosticData */ xmlNode *extraData; /* Items are struct extraDataInfo */ }; struct lcdInfo { char *name; char *partNumber; char *manufacturer; char *fwVersion; xmlNode *extraData; /* Items are struct extraDataInfo */ }; struct hpSimInfo { enum hpSimTrustMode trustMode; struct certificates certificates; xmlNode *xeNameList; /* Items are char *xeName */ xmlNode *extraData; /* Items are struct extraDataInfo */ }; struct thermalSubsystemInfo { enum opStatus operationalStatus; enum redundancy redundancy; byte goodFans; byte wantedFans; byte neededFans; xmlNode *extraData; /* Items are struct extraDataInfo */ }; struct bladeIpl { enum iplDevice iplDevice; byte bootPriority; }; struct bladeBootInfo { byte numberOfIpls; xmlNode *ipls; /* Items are struct bladeIpl */ byte lastIplDeviceBooted; enum oneTimeBootDevice oneTimeBootDevice; enum oneTimeBootAgent oneTimeBootAgent; enum hpoa_boolean oneTimeBypassF1F2Messages; xmlNode *extraData; /* Items are struct extraDataInfo */ }; struct oaVcmMode { enum hpoa_boolean isVcmMode; char *vcmUrl; char *vcmDomainId; char *vcmDomainName; xmlNode *extraData; /* Items are struct extraDataInfo */ }; struct powerReductionStatus { enum powerReductionState powerReductionState; enum powerReductionArmedState powerReductionArmedState; enum powerReductionState powerReductionFiredState; xmlNode *extraData; /* Items are struct extraDataInfo */ }; struct virtualMediaStatus { byte bayNumber; enum virtualMediaSupport support; enum virtualMediaDeviceStatus cdromStatus; char *cdromUrl; enum virtualMediaDeviceStatus floppyStatus; char *floppyUrl; xmlNode *extraData; /* Items are struct extraDataInfo */ }; struct fanZone { byte zoneNumber; enum redundancy redundant; enum opStatus operationalStatus; int targetRpm; int targetPwm; xmlNode *deviceBayArray; /* Items are byte bay */ xmlNode *fanInfoArray; /* Items are struct fanInfo */ xmlNode *extraData; /* Items are struct extraDataInfo */ }; struct deviceBayArray { xmlNode *bay; /* Items are byte (bay) */ }; struct fanInfoArray{ xmlNode *fanInfo; /* Items are struct fanInfo */ }; struct ebipaBay { int bayNumber; enum hpoa_boolean enabled; char *ipAddress; }; struct ebipaInfoEx { struct ebipaInfo info; xmlNode *deviceBays; /* Items are struct ebipaBay */ xmlNode *interconnectBays; /* Items are struct ebipaBay */ }; struct eventPid { int pid; }; struct unSubscribeForEvents { int pid; }; struct syslogSettings { char *syslogServer; int syslogPort; enum hpoa_boolean remoteEnabled; }; struct encLinkOa { enum hpoa_boolean activeOa; int bayNumber; char *oaName; char *ipAddress; char *macAddress; char *fwVersion; xmlNode *extraData; /* Items are struct extraDataInfo */ }; struct encLink2 { int enclosureNumber; int productId; int mfgId; char *enclosureUuid; char *enclosureSerialNumber; char *enclosureName; char *enclosureProductName; enum opStatus enclosureStatus; char *enclosureRackIpAddress; char *enclosureUrl; char *rackName; enum hpoa_boolean primaryEnclosure; xmlNode *encLinkOa; /* Items are struct encLinkOa */ xmlNode *extraData; /* Items are struct extraDataInfo */ }; struct rackTopology2 { char *ruid; xmlNode *enclosures; /* Items are struct encLink2 */ xmlNode *extraData; /* Items are struct extraDataInfo */ }; struct passwordSettings { enum hpoa_boolean strictPasswordsEnabled; int minPasswordLength; }; struct oaMediaDevice { int bayNumber; int deviceIndex; int deviceType; enum presence devicePresence; enum presence mediaPresence; char *volumeLabel; xmlNode *extraData; /* Items are struct extraDataInfo */ }; struct firmwareImage { char *fileName; char *fwVersion; }; struct usbMediaFirmwareImages { xmlNode *image; /* Items are struct firmwareImage */ xmlNode *extraData; /* Items are struct extraDataInfo */ }; struct usbMediaConfigScript { char *fileName; }; struct usbMediaConfigScripts { xmlNode *usbMediaConfigScript; /* Items are * struct usbMediaConfigScript */ xmlNode *extraData; /* Items are struct extraDataInfo */ }; struct tfaSettings { enum hpoa_boolean enableTwoFactor; enum hpoa_boolean enableCrl; enum hpoa_boolean subjectAltName; xmlNode *extraData; /* Items are struct extraDataInfo */ }; struct userCertificateInfo { char *fingerprint; }; struct caCertsInfo { xmlNode *certificates; }; struct powerdelayBay { int bayNumber; int delay; xmlNode *extraData; /* Items are struct extraDataInfo */ }; struct powerdelaySettings { enum hpoa_boolean isPowerdelayInProgress; xmlNode *interconnects; /* Items are struct powerdelayBay */ xmlNode *servers; /* Items are struct powerdelayBay */ xmlNode *extraData; /* Items are struct extraDataInfo */ }; struct getFanZoneArrayResponse { xmlNode *fanZoneArray; /* Items are struct fanZone */ }; struct bayArray { int size; /* Size of array */ byte *array; /* Actual array */ }; struct getFanZoneArray { struct bayArray bayArray; }; struct getEvent { int pid; enum hpoa_boolean waitTilEventHappens; enum hpoa_boolean lcdEvents; }; struct getAllEvents { int pid; enum hpoa_boolean waitTilEventHappens; enum hpoa_boolean lcdEvents; }; union _hpoa__data { struct syslog syslog; struct rackTopology rackTopology; struct enclosureStatus enclosureStatus; struct enclosureInfo enclosureInfo; struct oaStatus oaStatus; struct oaInfo oaInfo; struct bladeInfo bladeInfo; struct bladeMpInfo bladeMpInfo; struct bladeStatus bladeStatus; struct bladePortMap bladePortMap; struct fanInfo fanInfo; struct interconnectTrayStatus interconnectTrayStatus; struct interconnectTrayInfo interconnectTrayInfo; struct interconnectTrayPortMap interconnectTrayPortMap; struct powerSupplyInfo powerSupplyInfo; struct powerSupplyStatus powerSupplyStatus; struct powerSubsystemInfo powerSubsystemInfo; struct powerConfigInfo powerConfigInfo; struct thermalInfo thermalInfo; xmlNode *userInfoArray; /* Items are struct userInfo */ struct userInfo userInfo; struct ldapInfo ldapInfo; struct ldapGroupInfo ldapGroupInfo; struct snmpInfo snmpInfo; struct enclosureNetworkInfo enclosureNetworkInfo; struct oaNetworkInfo oaNetworkInfo; struct enclosureTime enclosureTime; struct alertmailInfo alertmailInfo; struct passwordSettings passwordSettings; struct ebipaInfo ebipaInfo; struct lcdChatMessage lcdChatMessage; struct lcdUserNotes lcdUserNotes; struct lcdButtonEvent lcdButtonEvent; struct lcdStatus lcdStatus; struct lcdInfo lcdInfo; struct hpSimInfo hpSimInfo; struct thermalSubsystemInfo thermalSubsystemInfo; struct bladeBootInfo bladeBootInfo; struct oaVcmMode oaVcmMode; struct powerReductionStatus powerReductionStatus; struct virtualMediaStatus virtualMediaStatus; struct oaMediaDevice oaMediaDevice; struct fanZone fanZone; struct ebipaInfoEx ebipaInfoEx; struct caCertsInfo caCertsInfo; struct rackTopology2 rackTopology2; struct userCertificateInfo userCertificateInfo; struct syslogSettings syslogSettings; struct powerdelaySettings powerdelaySettings; struct usbMediaFirmwareImages usbMediaFirmwareImages; struct usbMediaConfigScripts configScripts; int numValue; char *string; char *message; char *noPayload; }; struct eventInfo { enum eventType event; time_t eventTimeStamp; int queueSize; int numValue; union _hpoa__data eventData; enum enum_eventInfo enum_eventInfo; xmlNode *extraData; /* Items are struct extraDataInfo */ }; struct getAllEventsResponse { xmlNode *eventInfoArray; }; struct getBladeThermalInfoArray { int bayNumber; }; struct bladeThermalInfoArrayResponse { xmlNode *bladeThermalInfoArray; /* Items are struct bladeThermalInfo */ }; struct bladeThermalInfo { byte sensorNumber; byte sensorType; byte entityId; byte entityInstance; byte criticalThreshold; byte cautionThreshold; byte temperatureC; byte oem; char *description; xmlNode *extraData; /* Items are struct extraDataInfo */ }; struct setBladePower { int bayNumber; enum powerControl power; }; struct setInterconnectTrayPower { int bayNumber; enum hpoa_boolean on; }; struct resetInterconnectTray { int bayNumber; }; struct setEnclosureUid { enum uidControl uid; }; struct setOaUid { int bayNumber; enum uidControl uid; }; struct setBladeUid { int bayNumber; enum uidControl uid; }; struct setInterconnectTrayUid { int bayNumber; enum uidControl uid; }; /* Main OA SOAP Function prototypes */ int soap_subscribeForEvents(SOAP_CON *connection, struct eventPid *response); int soap_unSubscribeForEvents(SOAP_CON *connection, const struct unSubscribeForEvents *request); int soap_getEvent(SOAP_CON *connection, const struct getEvent *request, struct eventInfo *response); int soap_getAllEvents(SOAP_CON *connection, const struct getAllEvents *request, struct getAllEventsResponse *response); int soap_getBladeInfo(SOAP_CON *connection, const struct getBladeInfo *request, struct bladeInfo *response); int soap_getBladeMpInfo(SOAP_CON *connection, const struct getBladeMpInfo *request, struct bladeMpInfo *response); int soap_getEnclosureInfo(SOAP_CON *connection, struct enclosureInfo *response); int soap_getOaStatus(SOAP_CON *connection, const struct getOaStatus *request, struct oaStatus *response); int soap_getOaInfo(SOAP_CON *connection, const struct getOaInfo *request, struct oaInfo *response); int soap_getInterconnectTrayStatus(SOAP_CON *connection, const struct getInterconnectTrayStatus *request, struct interconnectTrayStatus *response); int soap_getInterconnectTrayInfo(SOAP_CON *connection, const struct getInterconnectTrayInfo *request, struct interconnectTrayInfo *response); int soap_getFanInfo(SOAP_CON *connection, const struct getFanInfo *request, struct fanInfo *response); int soap_getPowerSubsystemInfo(SOAP_CON *connection, struct powerSubsystemInfo *response); int soap_getPowerSupplyInfo(SOAP_CON *connection, const struct getPowerSupplyInfo *request, struct powerSupplyInfo *response); int soap_getOaNetworkInfo(SOAP_CON *connection, const struct getOaNetworkInfo *request, struct oaNetworkInfo *response); int soap_getBladeStatus(SOAP_CON *connection, const struct getBladeStatus *request, struct bladeStatus *response); int soap_setBladePower(SOAP_CON *connection, const struct setBladePower *request); int soap_setInterconnectTrayPower(SOAP_CON *connection, const struct setInterconnectTrayPower *request); int soap_resetInterconnectTray(SOAP_CON *connection, const struct resetInterconnectTray *request); int soap_getThermalInfo(SOAP_CON *connection, const struct getThermalInfo *request, struct thermalInfo *response); int soap_getUserInfo(SOAP_CON *connection, const struct getUserInfo *request, struct userInfo *response); int soap_isValidSession(SOAP_CON *connection); int soap_getRackTopology2(SOAP_CON *con, struct rackTopology2 *response); int soap_getThermalSubsystemInfo(SOAP_CON *con, struct thermalSubsystemInfo *response); int soap_getFanZoneArray(SOAP_CON *con, const struct getFanZoneArray *request, struct getFanZoneArrayResponse *response); int soap_getEnclosureStatus(SOAP_CON *con, struct enclosureStatus *response); int soap_getLcdInfo(SOAP_CON *con, struct lcdInfo *response); int soap_getLcdStatus(SOAP_CON *con, struct lcdStatus *response); int soap_getPowerSupplyStatus(SOAP_CON *con, const struct getPowerSupplyStatus *request, struct powerSupplyStatus *response); int soap_setEnclosureUid(SOAP_CON *con, const struct setEnclosureUid *request); int soap_setOaUid(SOAP_CON *con, const struct setOaUid *request); int soap_setBladeUid(SOAP_CON *connection, const struct setBladeUid *request); int soap_setInterconnectTrayUid(SOAP_CON *con, const struct setInterconnectTrayUid *request); int soap_setLcdButtonLock(SOAP_CON *con, enum hpoa_boolean buttonLock); int soap_getBladeThermalInfoArray(SOAP_CON *con, struct getBladeThermalInfoArray *request, struct bladeThermalInfoArrayResponse *response); /* Function prototypes for OA SOAP helper functions */ void soap_getExtraData(xmlNode *extraData, struct extraDataInfo *result); void soap_getDiagnosticChecksEx(xmlNode *diag, struct diagnosticData *result); void soap_getBladeCpuInfo(xmlNode *cpus, struct bladeCpuInfo *result); void soap_getBladeNicInfo(xmlNode *nics, struct bladeNicInfo *result); void soap_getDiagnosticData(xmlNode *data, struct diagnosticData *result); void soap_getBayAccess(xmlNode *bay, struct bayAccess *result); void soap_getEncLink(xmlNode *data, struct encLink *result); void soap_getPortEnabled(xmlNode *data, struct portEnabled *result); void soap_getIpAddress(xmlNode *ips, char **result); void soap_getEventInfo(xmlNode *events, struct eventInfo *result); void soap_getEncLinkOa(xmlNode *data, struct encLinkOa *result); void soap_getEncLink2(xmlNode *data, struct encLink2 *result); void soap_fanZone(xmlNode *fanZone, struct fanZone *result); void soap_fanInfo(xmlNode *fanZone, struct fanInfo *result); void soap_deviceBayArray(xmlNode *node, byte *bay); void soap_bladeThermalInfo(xmlNode *node, struct bladeThermalInfo *result); #endif /* _INC_OASOAP_CALLS_H_ */ openhpi-2.14.1/plugins/oa_soap/oa_soap_calls.c0000644000076400007640000021366411302566663016262 0ustar /* * Copyright (C) 2007-2008, Hewlett-Packard Development Company, LLP * All rights reserved. * * 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. * * Neither the name of the Hewlett-Packard Corporation, nor the names * of its contributors may be used to endorse or promote products * derived from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * Author(s) * Bryan Sutula * Raghavendra PG * Raghavendra MS * Anand S */ #include #include #include #define OA_SOAP_CALLS_FILE /* Defines ENUM strings in this file */ #include "oa_soap_calls.h" /* Macros used in this file, to simplify common code */ #define SOAP_PARM_CHECK \ int ret; \ if ((con == NULL) || (request == NULL) || (response == NULL)) { \ err("NULL parameter"); \ return -1; \ } #define SOAP_PARM_CHECK_NRQ \ int ret; \ if ((con == NULL) || (response == NULL)) { \ err("NULL parameter"); \ return -1; \ } #define SOAP_PARM_CHECK_NRS \ if ((con == NULL) || (request == NULL)) { \ err("NULL parameter"); \ return -1; \ } /* Helper functions used by the main OA SOAP calls for code reuse. They are * not intended to be called by users. * * Please note that the function comment block format has not been followed * for these. The functions are very repetitive, and their parameters are * all predefined structures, well-documented in external documents. Trying * to document that here would duplicate that information, leading to future * maintainability problems. */ /* This tries to locate a string of diagnosticChecksEx notes within the * current XML response tree. If one is found, it's node is returned. If * not, returns NULL. */ static xmlNode *locate_diagnosticChecksEx(xmlNode *node) { xmlNode *diag; /* DiagnosticChecksEx node */ /* First, is there a diagnosticChecksEx node? */ diag = soap_walk_tree(node, "diagnosticChecksEx"); if (diag && diag->children) { /* Real responses have children */ diag = diag->children; if (! diag->properties) /* Skip formatting (empty) nodes */ diag = soap_next_node(diag); } else diag = NULL; /* No children */ return(diag); } /* parse_xsdBoolean - Parses xsdBoolean strings, returning an hpoa_boolean */ static enum hpoa_boolean parse_xsdBoolean(char *str) { if ((! strcmp(str, "true")) || (! strcmp(str, "1"))) return(HPOA_TRUE); return(HPOA_FALSE); } /* parse_eventPid - Parses an eventPid response structure */ static void parse_eventPid(xmlNode *node, struct eventPid *response) { response->pid = atoi(soap_tree_value(node, "pid")); } /* parse_bladeInfo - Parses a bladeInfo response structure */ static void parse_bladeInfo(xmlNode *node, struct bladeInfo *response) { response->bayNumber = atoi(soap_tree_value(node, "bayNumber")); response->presence = soap_enum(presence_S, soap_tree_value(node, "presence")); response->bladeType = soap_enum(bladeType_S, soap_tree_value(node, "bladeType")); response->width = atoi(soap_tree_value(node, "width")); response->height = atoi(soap_tree_value(node, "height")); response->name = soap_tree_value(node, "name"); response->manufacturer = soap_tree_value(node, "manufacturer"); response->partNumber = soap_tree_value(node, "partNumber"); response->sparePartNumber = soap_tree_value(node, "sparePartNumber"); response->serialNumber = soap_tree_value(node, "serialNumber"); response->serverName = soap_tree_value(node, "serverName"); response->uuid = soap_tree_value(node, "uuid"); response->rbsuOsName = soap_tree_value(node, "rbsuOsName"); response->assetTag = soap_tree_value(node, "assetTag"); response->romVersion = soap_tree_value(node, "romVersion"); response->numberOfCpus = atoi(soap_tree_value(node, "numberOfCpus")); response->cpus = soap_walk_tree(node, "cpus:bladeCpuInfo"); response->memory = atoi(soap_tree_value(node, "memory")); response->numberOfNics = atoi(soap_tree_value(node, "numberOfNics")); response->nics = soap_walk_tree(node, "nics:bladeNicInfo"); response->mmHeight = atoi(soap_tree_value(node, "mmHeight")); response->mmWidth = atoi(soap_tree_value(node, "mmWidth")); response->mmDepth = atoi(soap_tree_value(node, "mmDepth")); response->deviceId = atoi(soap_tree_value(node, "deviceId")); response->productId = atoi(soap_tree_value(node, "productId")); response->extraData = soap_walk_tree(node, "extraData"); } /* parse_bladeMpInfo - Parses a bladeMpInfo response structure */ static void parse_bladeMpInfo(xmlNode *node, struct bladeMpInfo *response) { response->bayNumber = atoi(soap_tree_value(node, "bayNumber")); response->ipAddress = soap_tree_value(node, "ipAddress"); response->macAddress = soap_tree_value(node, "macAddress"); response->dnsName = soap_tree_value(node, "dnsName"); response->modelName = soap_tree_value(node, "modelName"); response->fwVersion = soap_tree_value(node, "fwVersion"); response->remoteConsoleUrl = soap_tree_value(node, "remoteConsoleUrl"); response->webUrl = soap_tree_value(node, "webUrl"); response->ircUrl = soap_tree_value(node, "ircUrl"); response->loginUrl = soap_tree_value(node, "loginUrl"); response->ircFullUrl = soap_tree_value(node, "ircFullUrl"); response->remoteSerialUrl = soap_tree_value(node, "remoteSerialUrl"); response->extraData = soap_walk_tree(node, "extraData"); } /* parse_diagnosticChecks - Parses a diagnosticChecks response structure */ static void parse_diagnosticChecks(xmlNode *node, struct diagnosticChecks *response) { response->internalDataError = soap_enum(diagnosticStatus_S, soap_tree_value(node, "internalDataError")); response->managementProcessorError = soap_enum(diagnosticStatus_S, soap_tree_value(node, "managementProcessorError")); response->thermalWarning = soap_enum(diagnosticStatus_S, soap_tree_value(node, "thermalWarning")); response->thermalDanger = soap_enum(diagnosticStatus_S, soap_tree_value(node, "thermalDanger")); response->ioConfigurationError = soap_enum(diagnosticStatus_S, soap_tree_value(node, "ioConfigurationError")); response->devicePowerRequestError = soap_enum(diagnosticStatus_S, soap_tree_value(node, "devicePowerRequestError")); response->insufficientCooling = soap_enum(diagnosticStatus_S, soap_tree_value(node, "insufficientCooling")); response->deviceLocationError = soap_enum(diagnosticStatus_S, soap_tree_value(node, "deviceLocationError")); response->deviceFailure = soap_enum(diagnosticStatus_S, soap_tree_value(node, "deviceFailure")); response->deviceDegraded = soap_enum(diagnosticStatus_S, soap_tree_value(node, "deviceDegraded")); response->acFailure = soap_enum(diagnosticStatus_S, soap_tree_value(node, "acFailure")); response->i2cBuses = soap_enum(diagnosticStatus_S, soap_tree_value(node, "i2cBuses")); response->redundancy = soap_enum(diagnosticStatus_S, soap_tree_value(node, "redundancy")); } /* parse_syslog - Parses a syslog response structure */ static void parse_syslog(xmlNode *node, struct syslog *response) { char *str; if ((str = soap_tree_value(node, "bayNumber"))) response->bayNumber = atoi(str); else response->bayNumber = -1; if ((str = soap_tree_value(node, "syslogStrlen"))) response->syslogStrlen = atoi(str); else response->syslogStrlen = -1; response->logContents = soap_tree_value(node, "logContents"); /* May be * NULL */ response->extraData = soap_walk_tree(node, "extraData"); } /* parse_rackTopology - Parses a rackTopology response structure */ static void parse_rackTopology(xmlNode *node, struct rackTopology *response) { response->ruid = soap_tree_value(node, "ruid"); /* May be NULL */ response->enclosures = soap_walk_tree(node, "enclosures:enclosure"); response->extraData = soap_walk_tree(node, "extraData"); } /* parse_rackTopology2 - Parses rackTopology2 response structure */ static void parse_rackTopology2(xmlNode *node, struct rackTopology2 *response) { response->ruid = soap_tree_value(node, "ruid"); response->enclosures = soap_walk_tree(node, "enclosures:enclosure"); response->extraData = soap_walk_tree(node, "extraData"); } /* parse_enclosureInfo - Parses a enclosureInfo response structure */ static void parse_enclosureInfo(xmlNode *node, struct enclosureInfo *response) { response->rackName = soap_tree_value(node, "rackName"); response->enclosureName = soap_tree_value(node, "enclosureName"); response->hwVersion = soap_tree_value(node, "hwVersion"); response->bladeBays = atoi(soap_tree_value(node, "bladeBays")); response->fanBays = atoi(soap_tree_value(node, "fanBays")); response->powerSupplyBays = atoi(soap_tree_value(node, "powerSupplyBays")); response->thermalSensors = atoi(soap_tree_value(node, "thermalSensors")); response->interconnectTrayBays = atoi(soap_tree_value(node, "interconnectTrayBays")); response->oaBays = atoi(soap_tree_value(node, "oaBays")); response->name = soap_tree_value(node, "name"); response->partNumber = soap_tree_value(node, "partNumber"); response->serialNumber = soap_tree_value(node, "serialNumber"); response->uuid = soap_tree_value(node, "uuid"); response->assetTag = soap_tree_value(node, "assetTag"); response->manufacturer = soap_tree_value(node, "manufacturer"); response->chassisSparePartNumber = soap_tree_value(node, "chassisSparePartNumber"); response->interposerManufacturer = soap_tree_value(node, "interposerManufacturer"); response->interposerName = soap_tree_value(node, "interposerName"); response->interposerPartNumber = soap_tree_value(node, "interposerPartNumber"); response->interposerSerialNumber = soap_tree_value(node, "interposerSerialNumber"); response->pduType = soap_tree_value(node, "pduType"); response->mmHeight = atoi(soap_tree_value(node, "mmHeight")); response->mmWidth = atoi(soap_tree_value(node, "mmWidth")); response->mmDepth = atoi(soap_tree_value(node, "mmDepth")); response->pduPartNumber = soap_tree_value(node, "pduPartNumber"); response->pduSparePartNumber = soap_tree_value(node, "pduSparePartNumber"); response->extraData = soap_walk_tree(node, "extraData"); } /* parse_oaStatus - Parses an oaStatus response structure */ static void parse_oaStatus(xmlNode *node, struct oaStatus *response) { response->bayNumber = atoi(soap_tree_value(node, "bayNumber")); response->oaName = soap_tree_value(node, "oaName"); response->oaRole = soap_enum(oaRole_S, soap_tree_value(node, "oaRole")); response->operationalStatus = soap_enum(opStatus_S, soap_tree_value(node, "operationalStatus")); response->uid = soap_enum(uidStatus_S, soap_tree_value(node, "uid")); response->restartCause = atoi(soap_tree_value(node, "restartCause")); response->oaRedundancy = parse_xsdBoolean(soap_tree_value(node, "oaRedundancy")); parse_diagnosticChecks(soap_walk_tree(node, "diagnosticChecks"), & (response->diagnosticChecks)); response->diagnosticChecksEx = locate_diagnosticChecksEx(node); response->extraData = soap_walk_tree(node, "extraData"); } /* parse_oaInfo - Parses an oaInfo response structure */ static void parse_oaInfo(xmlNode *node, struct oaInfo *response) { response->bayNumber = atoi(soap_tree_value(node, "bayNumber")); response->youAreHere = parse_xsdBoolean(soap_tree_value(node, "youAreHere")); response->name = soap_tree_value(node, "name"); response->partNumber = soap_tree_value(node, "partNumber"); response->sparePartNumber = soap_tree_value(node, "sparePartNumber"); response->serialNumber = soap_tree_value(node, "serialNumber"); response->uuid = soap_tree_value(node, "uuid"); response->assetTag = soap_tree_value(node, "assetTag"); response->manufacturer = soap_tree_value(node, "manufacturer"); response->hwVersion = soap_tree_value(node, "hwVersion"); response->fwVersion = soap_tree_value(node, "fwVersion"); response->mmHeight = atoi(soap_tree_value(node, "mmHeight")); response->mmWidth = atoi(soap_tree_value(node, "mmWidth")); response->mmDepth = atoi(soap_tree_value(node, "mmDepth")); response->extraData = soap_walk_tree(node, "extraData"); } /* parse_bladeStatus - Parses a bladeStatus response structure */ static void parse_bladeStatus(xmlNode *node, struct bladeStatus *response) { response->bayNumber = atoi(soap_tree_value(node, "bayNumber")); response->presence = soap_enum(presence_S, soap_tree_value(node, "presence")); response->operationalStatus = soap_enum(opStatus_S, soap_tree_value(node, "operationalStatus")); response->thermal = soap_enum(sensorStatus_S, soap_tree_value(node, "thermal")); response->powered = soap_enum(power_S, soap_tree_value(node, "powered")); response->powerState = soap_enum(powerState_S, soap_tree_value(node, "powerState")); response->shutdown = soap_enum(shutdown_S, soap_tree_value(node, "shutdown")); response->uid = soap_enum(uidStatus_S, soap_tree_value(node, "uid")); response->powerConsumed = atoi(soap_tree_value(node, "powerConsumed")); parse_diagnosticChecks(soap_walk_tree(node, "diagnosticChecks"), & (response->diagnosticChecks)); response->diagnosticChecksEx = locate_diagnosticChecksEx(node); response->extraData = soap_walk_tree(node, "extraData"); } /* parse_interconnectTrayStatus - Parses an interconnectTrayStatus * response structure */ static void parse_interconnectTrayStatus(xmlNode *node, struct interconnectTrayStatus *response) { response->bayNumber = atoi(soap_tree_value(node, "bayNumber")); response->operationalStatus = soap_enum(opStatus_S, soap_tree_value(node, "operationalStatus")); response->presence = soap_enum(presence_S, soap_tree_value(node, "presence")); response->thermal = soap_enum(sensorStatus_S, soap_tree_value(node, "thermal")); response->cpuFault = parse_xsdBoolean(soap_tree_value(node, "cpuFault")); response->healthLed = parse_xsdBoolean(soap_tree_value(node, "healthLed")); response->uid = soap_enum(uidStatus_S, soap_tree_value(node, "uid")); response->powered = soap_enum(power_S, soap_tree_value(node, "powered")); response->ports = soap_walk_tree(node, "ports:port"); parse_diagnosticChecks(soap_walk_tree(node, "diagnosticChecks"), & (response->diagnosticChecks)); response->diagnosticChecksEx = locate_diagnosticChecksEx(node); response->extraData = soap_walk_tree(node, "extraData"); } /* parse_interconnectTrayInfo - Parses an interconnectTrayInfo * response structure */ static void parse_interconnectTrayInfo(xmlNode *node, struct interconnectTrayInfo *response) { response->bayNumber = atoi(soap_tree_value(node, "bayNumber")); response->interconnectTrayType = soap_enum(interconnectTrayType_S, soap_tree_value(node, "interconnectTrayType")); response->passThroughSupport = parse_xsdBoolean(soap_tree_value(node, "passThroughSupport")); response->portDisableSupport = parse_xsdBoolean(soap_tree_value(node, "portDisableSupport")); response->temperatureSensorSupport = parse_xsdBoolean(soap_tree_value(node, "temperatureSensorSupport")); response->width = atoi(soap_tree_value(node, "width")); response->manufacturer = soap_tree_value(node, "manufacturer"); response->name = soap_tree_value(node, "name"); response->partNumber = soap_tree_value(node, "partNumber"); response->serialNumber = soap_tree_value(node, "serialNumber"); response->sparePartNumber = soap_tree_value(node, "sparePartNumber"); response->rs232PortRoute = parse_xsdBoolean(soap_tree_value(node, "rs232PortRoute")); response->ethernetPortRoute = parse_xsdBoolean(soap_tree_value(node, "ethernetPortRoute")); response->userAssignedName = soap_tree_value(node, "userAssignedName"); response->inBandIpAddress = soap_tree_value(node, "inBandIpAddress"); response->urlToMgmt = soap_tree_value(node, "urlToMgmt"); response->powerOnWatts = atoi(soap_tree_value(node, "powerOnWatts")); response->powerOffWatts = atoi(soap_tree_value(node, "powerOffWatts")); response->extraData = soap_walk_tree(node, "extraData"); } /* parse_powerSupplyInfo - Parses a powerSupplyInfo response structure */ static void parse_powerSupplyInfo(xmlNode *node, struct powerSupplyInfo *response) { response->bayNumber = atoi(soap_tree_value(node, "bayNumber")); response->presence = soap_enum(presence_S, soap_tree_value(node, "presence")); response->modelNumber = soap_tree_value(node, "modelNumber"); response->sparePartNumber = soap_tree_value(node, "sparePartNumber"); response->serialNumber = soap_tree_value(node, "serialNumber"); response->capacity = atoi(soap_tree_value(node, "capacity")); response->actualOutput = atoi(soap_tree_value(node, "actualOutput")); response->extraData = soap_walk_tree(node, "extraData"); } /* parse_powerSupplyStatus - Parses a powerSupplyStatus response structure */ static void parse_powerSupplyStatus(xmlNode *node, struct powerSupplyStatus *response) { response->bayNumber = atoi(soap_tree_value(node, "bayNumber")); response->presence = soap_enum(presence_S, soap_tree_value(node, "presence")); response->operationalStatus = soap_enum(opStatus_S, soap_tree_value(node, "operationalStatus")); response->inputStatus = soap_enum(opStatus_S, soap_tree_value(node, "inputStatus")); parse_diagnosticChecks(soap_walk_tree(node, "diagnosticChecks"), & (response->diagnosticChecks)); response->diagnosticChecksEx = locate_diagnosticChecksEx(node); response->extraData = soap_walk_tree(node, "extraData"); } /* parse_powerSubsystemInfo - Parses a powerSubsystemInfo response structure */ static void parse_powerSubsystemInfo(xmlNode *node, struct powerSubsystemInfo *response) { char *str; response->subsystemType = soap_enum(powerSystemType_S, soap_tree_value(node, "subsystemType")); response->operationalStatus = soap_enum(opStatus_S, soap_tree_value(node, "operationalStatus")); response->redundancy = soap_enum(redundancy_S, soap_tree_value(node, "redundancy")); response->redundancyMode = soap_enum(powerRedundancy_S, soap_tree_value(node, "redundancyMode")); response->capacity = atoi(soap_tree_value(node, "capacity")); response->redundantCapacity = atoi(soap_tree_value(node, "redundantCapacity")); response->outputPower = atoi(soap_tree_value(node, "outputPower")); response->powerConsumed = atoi(soap_tree_value(node, "powerConsumed")); response->inputPowerVa = atof(soap_tree_value(node, "inputPowerVa")); response->inputPowerCapacityVa = atof(soap_tree_value(node, "inputPowerCapacityVa")); if ((str = soap_tree_value(node, "inputPower"))) response->inputPower = atof(str); else response->inputPower = -1.0; if ((str = soap_tree_value(node, "inputPowerCapacity"))) response->inputPowerCapacity = atof(str); else response->inputPowerCapacity = -1.0; response->goodPowerSupplies = atoi(soap_tree_value(node, "goodPowerSupplies")); response->wantedPowerSupplies = atoi(soap_tree_value(node, "wantedPowerSupplies")); response->neededPowerSupplies = atoi(soap_tree_value(node, "neededPowerSupplies")); response->extraData = soap_walk_tree(node, "extraData"); } /* parse_thermalInfo - Parses a thermalInfo response structure */ static void parse_thermalInfo(xmlNode *node, struct thermalInfo *response) { response->sensorType = soap_enum(sensorType_S, soap_tree_value(node, "sensorType")); response->bayNumber = atoi(soap_tree_value(node, "bayNumber")); response->sensorStatus = soap_enum(sensorStatus_S, soap_tree_value(node, "sensorStatus")); response->operationalStatus = soap_enum(opStatus_S, soap_tree_value(node, "operationalStatus")); response->temperatureC = atoi(soap_tree_value(node, "temperatureC")); response->cautionThreshold = atoi(soap_tree_value(node, "cautionThreshold")); response->criticalThreshold = atoi(soap_tree_value(node, "criticalThreshold")); response->extraData = soap_walk_tree(node, "extraData"); } /* parse_enclosureBaysSelection - Parses an enclosureBaysSelection response * structure */ static void parse_enclosureBaysSelection(xmlNode *node, struct enclosureBaysSelection *response) { char *str; if ((str = soap_tree_value(node, "oaAccess"))) response->oaAccess = parse_xsdBoolean(str); else response->oaAccess = HPOA_FALSE; /* Default */ response->bladeBays = soap_walk_tree(node, "bladeBays:blade"); response->interconnectTrayBays = soap_walk_tree(node, "interconnectTrayBays:interconnectTray"); response->extraData = soap_walk_tree(node, "extraData"); } /* parse_userInfo - Parses a userInfo response structure */ static void parse_userInfo(xmlNode *node, struct userInfo *response) { response->username = soap_tree_value(node, "username"); response->fullname = soap_tree_value(node, "fullname"); response->contactInfo = soap_tree_value(node, "contactInfo"); response->isEnabled = parse_xsdBoolean(soap_tree_value(node, "isEnabled")); response->acl = soap_enum(userAcl_S, soap_tree_value(node, "acl")); parse_enclosureBaysSelection(soap_walk_tree(node, "bayPermissions"), &(response->bayPermissions)); response->extraData = soap_walk_tree(node, "extraData"); } /* parse_oaNetworkInfo - Parses a oaNetworkInfo response structure */ static void parse_oaNetworkInfo(xmlNode *node, struct oaNetworkInfo *response) { response->bayNumber = atoi(soap_tree_value(node, "bayNumber")); response->dhcpEnabled = parse_xsdBoolean(soap_tree_value(node, "dhcpEnabled")); response->dynDnsEnabled = parse_xsdBoolean(soap_tree_value(node, "dynDnsEnabled")); response->macAddress = soap_tree_value(node, "macAddress"); response->ipAddress = soap_tree_value(node, "ipAddress"); response->netmask = soap_tree_value(node, "netmask"); response->gateway = soap_tree_value(node, "gateway"); response->dns = soap_walk_tree(node, "dns:ipAddress"); response->elinkIpAddress = soap_tree_value(node, "elinkIpAddress"); response->linkActive = parse_xsdBoolean(soap_tree_value(node, "linkActive")); response->extraData = soap_walk_tree(node, "extraData"); } /* parse_thermalSubsystemInfo - Parses a thermalSubsystemInfo response * structure */ static void parse_thermalSubsystemInfo(xmlNode *node, struct thermalSubsystemInfo *response) { response->operationalStatus = soap_enum(opStatus_S, soap_tree_value(node, "operationalStatus")); response->redundancy = soap_enum(redundancy_S, soap_tree_value(node, "redundancy")); response->goodFans = atoi(soap_tree_value(node, "goodFans")); response->wantedFans = atoi(soap_tree_value(node, "wantedFans")); response->neededFans = atoi(soap_tree_value(node, "neededFans")); response->extraData = soap_walk_tree(node, "extraData"); } /* parse_fanZoneArray - Parses a fanZoneArray structure */ static void parse_fanZoneArray(xmlNode *node, struct getFanZoneArrayResponse *response) { response->fanZoneArray = soap_walk_tree(node, "fanZoneArray:fanZone"); } /* parse_enclosureStatus - Parses a enclosureStatus structure */ static void parse_enclosureStatus(xmlNode *node, struct enclosureStatus *response) { response->operationalStatus = soap_enum(opStatus_S, soap_tree_value(node, "operationalStatus")); response->uid = soap_enum(uidStatus_S, soap_tree_value(node, "uid")); response->wizardStatus = soap_enum(wizardStatus_S, soap_tree_value(node, "wizardStatus")); parse_diagnosticChecks(soap_walk_tree(node, "diagnosticChecks"), & (response->diagnosticChecks)); response->diagnosticChecksEx = locate_diagnosticChecksEx(node); response->extraData = soap_walk_tree(node, "extraData"); } /* parse_lcdInfo - Parses a lcdInfo structure */ static void parse_lcdInfo(xmlNode *node, struct lcdInfo *response) { response->name = soap_tree_value(node, "name"); response->partNumber = soap_tree_value(node, "partNumber"); response->manufacturer = soap_tree_value(node, "manufacturer"); response->fwVersion = soap_tree_value(node, "fwVersion"); response->extraData = soap_walk_tree(node, "extraData"); } /* parse_lcdStatus - Parses a lcdStatus structure */ static void parse_lcdStatus(xmlNode *node, struct lcdStatus *response) { response->status = soap_enum(opStatus_S, soap_tree_value(node, "status")); response->display = soap_enum(uidStatus_S, soap_tree_value(node, "display")); response->lcdPin = parse_xsdBoolean(soap_tree_value(node, "lcdPin")); response->buttonLock = parse_xsdBoolean(soap_tree_value(node, "buttonLock")); response->lcdSetupHealth = soap_enum(lcdSetupHealth_S, soap_tree_value(node, "lcdSetupHealth")); parse_diagnosticChecks(soap_walk_tree(node, "diagnosticChecks"), & (response->diagnosticChecks)); response->diagnosticChecksEx = locate_diagnosticChecksEx(node); response->extraData = soap_walk_tree(node, "extraData"); } /* parse_getBladeThermalInfoArray - Parses a bladeThermalInfoArrayResponse * structure */ static void parse_getBladeThermalInfoArray(xmlNode *node, struct bladeThermalInfoArrayResponse *response) { response->bladeThermalInfoArray = soap_walk_tree(node, "bladeThermalInfoArray:bladeThermalInfo"); } /* parse_getAllEvents - Parses a getAllEventsResponse structure */ static void parse_getAllEvents(xmlNode *node, struct getAllEventsResponse *response) { response->eventInfoArray = soap_walk_tree(node, "eventInfoArray:eventInfo"); } /* User-callable functions that are used to walk the lists of response * parameters. Please note that there are many structures involved, which * are derived from the SOAP/XML interface specification. Instead of trying * to document each fully in the comments, please refer to the oa_soap_calls.h * file which contains structure definitions, and to the OA SOAP interface * documentation (HP Onboard Administrator SOAP Interface Guide). */ /* soap_getExtraData - Walks list of extraData nodes, providing the name and * value for each. Used after any SOAP call that returns an extraData * xmlNode pointer. * * Outputs: * name: String containing the extra data name * value: String containing the value for this name */ void soap_getExtraData(xmlNode *extraData, struct extraDataInfo *result) { if ((extraData) && (extraData->properties) && (extraData->properties->children)) result->name = (char *)(extraData->properties->children->content); else result->name = NULL; result->value = soap_value(extraData); } /* soap_getDiagnosticChecksEx - Walks list of diagnosticChecksEx nodes, * providing the name and value for each. Used after any SOAP call * that returns a diagnosticChecksEx xmlNode pointer. * * Outputs: * name: String containing the diagnosticChecksEx node name * value: diagnosticStatus enum value */ void soap_getDiagnosticChecksEx(xmlNode *diag, struct diagnosticData *result) { if ((diag) && (diag->properties) && (diag->properties->children)) result->name = (char *)(diag->properties->children->content); else result->name = NULL; result->value = soap_enum(diagnosticStatus_S, soap_value(diag)); } /* soap_getBladeCpuInfo - Walks list of bladeCpuInfo nodes, providing details * on each CPU. Used after calling soap_getBladeInfo(). * * Outputs: * cpuType: String describing CPU * cpuSpeed: CPU speed in MHz */ void soap_getBladeCpuInfo(xmlNode *cpus, struct bladeCpuInfo *result) { result->cpuType = soap_tree_value(cpus, "cpuType"); result->cpuSpeed = atoi(soap_tree_value(cpus, "cpuSpeed")); } /* soap_getBladeNicInfo - Walks list of bladeNicInfo nodes, providing details * on each NIC. Used after calling soap_getBladeInfo(). * * Outputs: * port: String describing NIC port * macAddress: String containing the NIC's MAC address */ void soap_getBladeNicInfo(xmlNode *nics, struct bladeNicInfo *result) { result->port = soap_tree_value(nics, "port"); result->macAddress = soap_tree_value(nics, "macAddress"); } #if 0 /* TODO: Not sure the following call * will work...perhaps same problem * as extraData */ /* soap_getDiagnosticData - Gets information from diagnosticData nodes, * providing details on each diagnostic event. Used after calling * soap_getEventInfo(). * * Outputs: * item: diagnosticStatus enum * name: String containing name of diagnostic item */ void soap_getDiagnosticData(xmlNode *data, struct diagnosticData *result) { result->item = soap_enum(diagnosticStatus_S, soap_tree_value(data, "item")); result->name = soap_tree_value(data, "name"); } #endif /* soap_getBayAccess - Gets information from bayAccess nodes. * * Outputs: * bayNumber: Bay number * access: True if user can access the bay */ void soap_getBayAccess(xmlNode *bay, struct bayAccess *result) { result->bayNumber = atoi(soap_tree_value(bay, "bayNumber")); result->access = parse_xsdBoolean(soap_tree_value(bay, "access")); } /* soap_getEncLink - Gets information from encLink nodes, providing enclosure * information. * * Outputs: * enclosureNumber: Which enclosure is this? * oaName: Name assigned to the OA * uuid: UUID * rackName: Name assigned to the rack * enclosureName: Name assigned to the enclosure * url: URL * local: Local or remote */ void soap_getEncLink(xmlNode *data, struct encLink *result) { result->enclosureNumber = atoi(soap_tree_value(data, "enclosureNumber")); result->oaName = soap_tree_value(data, "oaName"); /* May be NULL */ result->uuid = soap_tree_value(data, "uuid"); /* May be NULL */ result->rackName = soap_tree_value(data, "rackName"); /* May be NULL */ result->enclosureName = soap_tree_value(data, "enclosureName"); /* May be NULL */ result->url = soap_tree_value(data, "url"); result->local = parse_xsdBoolean(soap_tree_value(data, "local")); result->extraData = soap_walk_tree(data, "extraData"); } /* soap_getEncLink2 - Gets information from encLink2 nodes, * providing enclosure information. * * Outputs: * enclosureNumber: Which enclosure is this? * productId: Product ID * mfgId: Manufacturer ID * enclosureUuid: Enclosure Universal Unique ID * encloseSerialNumber: Serial number from enclosure * enclosureName: Enclosure name * enclosureProductName: Enclosure product name including mfg name * enclosureStatus: Enclosure status * enclosureRackIpAddress: Rack IP address * enclosureUrl: URL for the enclosure * rackName: Rack name assigned by user * primaryEnclosure: Flag for identifying primary * encLinkOaArray: encLinkOa array structure */ void soap_getEncLink2(xmlNode *data, struct encLink2 *result) { result->enclosureNumber = atoi(soap_tree_value(data, "enclosureNumber")); result->productId = atoi(soap_tree_value(data, "productId")); result->mfgId = atoi(soap_tree_value(data, "mfgId")); result->enclosureUuid = soap_tree_value(data, "enclosureUuid"); result->enclosureSerialNumber = soap_tree_value(data, "enclosureSerialNumber"); result->enclosureName = soap_tree_value(data, "enclosureName"); result->enclosureProductName = soap_tree_value(data, "enclosureProductName"); result->enclosureStatus = soap_enum(opStatus_S, soap_tree_value(data, "enclosureStatus")); result->enclosureRackIpAddress = soap_tree_value(data, "enclosureRackIpAddress"); result->enclosureUrl = soap_tree_value(data, "enclosureUrl"); result->rackName = soap_tree_value(data, "rackName"); result->primaryEnclosure = parse_xsdBoolean(soap_tree_value(data, "primaryEnclosure")); result->encLinkOa = soap_walk_tree(data, "encLinkOaArray:encLinkOa"); result->extraData = soap_walk_tree(data, "extraData"); } /* soap_getEncLinkOa - Gets information from encLinkOa nodes, * providing enclosure information. * * Outputs: * activeOa: Active OA flag indicator * bayNumber: Bay number of the OA * oaName: OA name assigned by the user * ipAddress: IP address for OA ENC Link * macAddress: MAC address for OA ENC Link * fwVersion: OA firmware version */ void soap_getEncLinkOa (xmlNode *data, struct encLinkOa *result) { result->activeOa = parse_xsdBoolean(soap_tree_value(data, "activeOa")); result->bayNumber = atoi(soap_tree_value(data, "bayNumber")); result->oaName = soap_tree_value(data, "oaName"); result->ipAddress = soap_tree_value(data, "ipAddress"); result->macAddress = soap_tree_value(data, "macAddress"); result->fwVersion = soap_tree_value(data, "fwVersion"); result->extraData = soap_walk_tree(data, "extraData"); } /* soap_getPortEnabled - Gets information from portEnabled nodes * * Outputs: * portNumber: Port number * enabled: Is it enabled? */ void soap_getPortEnabled(xmlNode *data, struct portEnabled *result) { result->portNumber = atoi(soap_tree_value(data, "portNumber")); result->enabled = parse_xsdBoolean(soap_tree_value(data, "enabled")); } /* soap_getIpAddress - Gets information from ipAddress nodes * * Outputs: * result: String containing IP address */ void soap_getIpAddress(xmlNode *ips, char **result) { *result = soap_value(ips); } /* soap_fanZone - Gets information from fanZone nodes * * Outputs: * zoneNumber: Zone number * operationalStatus: Operational status of the fan zone * redundant: Redundant status of the fan zone * targetRpm: Target RPM of the fan zone * targetPwm: Target PWM of the fan zone * deviceBayArray: Device bays of the fan zone * fanInfoArray: Fan info of the fan zone */ void soap_fanZone(xmlNode *node, struct fanZone *result) { result->zoneNumber = atoi(soap_tree_value(node, "zoneNumber")); result->redundant = soap_enum(redundancy_S, soap_tree_value(node, "redundant")); result->operationalStatus = soap_enum(opStatus_S, soap_tree_value(node, "operationalStatus")); result->targetRpm = atoi(soap_tree_value(node, "targetRpm")); result->targetPwm = atoi(soap_tree_value(node, "targetPwm")); result->deviceBayArray = soap_walk_tree(node, "deviceBayArray:bay"); result->fanInfoArray = soap_walk_tree(node, "fanInfoArray:fanInfo"); result->extraData = soap_walk_tree(node, "extraData"); } /* soap_deviceBayArray - Gets information from fanZone nodes * * Outputs: * bay: bay number */ void soap_deviceBayArray(xmlNode *node, byte *bay) { *bay = atoi(soap_value(node)); } /* soap_fanInfo - Gets information from fanInfo nodes * * Outputs: * bayNumber: Bay number * presence: Presence status of the fan * name: Name of the fan * partNumber: Part number of the fan * sparePartNumber: Spare part number of the fan * serialNumber: Serial number of the fan * powerConsumed: Power consumed by the fan * fanSpeed: current fan speed * maxFanSpeed: Maximum fan speed * lowLimitFanSpeed: Low limit fan speed * operationalStatus: Operational status of the fan * diagnosticChecks: Diagnostic checks of the fan */ void soap_fanInfo(xmlNode *node, struct fanInfo *result) { result->bayNumber = atoi(soap_tree_value(node, "bayNumber")); result->presence = soap_enum(presence_S, soap_tree_value(node, "presence")); result->name = soap_tree_value(node, "name"); result->partNumber = soap_tree_value(node, "partNumber"); result->sparePartNumber = soap_tree_value(node, "sparePartNumber"); result->serialNumber = soap_tree_value(node, "serialNumber"); result->powerConsumed = atoi(soap_tree_value(node, "powerConsumed")); result->fanSpeed = atoi(soap_tree_value(node, "fanSpeed")); result->maxFanSpeed = atoi(soap_tree_value(node, "maxFanSpeed")); result->lowLimitFanSpeed = atoi(soap_tree_value(node, "lowLimitFanSpeed")); result->operationalStatus = soap_enum(opStatus_S, soap_tree_value(node, "operationalStatus")); parse_diagnosticChecks(soap_walk_tree(node, "diagnosticChecks"), & (result->diagnosticChecks)); result->diagnosticChecksEx = locate_diagnosticChecksEx(node); result->extraData = soap_walk_tree(node, "extraData"); } void soap_bladeThermalInfo(xmlNode *node, struct bladeThermalInfo * result) { result->sensorNumber = atoi(soap_tree_value(node, "sensorNumber")); result->sensorType = atoi(soap_tree_value(node, "sensorType")); result->entityId = atoi(soap_tree_value(node, "entityId")); result->entityInstance = atoi(soap_tree_value(node, "entityInstance")); result->criticalThreshold = atoi(soap_tree_value(node, "criticalThreshold")); result->cautionThreshold = atoi(soap_tree_value(node, "cautionThreshold")); result->temperatureC = atoi(soap_tree_value(node, "temperatureC")); result->oem = atoi(soap_tree_value(node, "oem")); result->description = soap_tree_value(node, "description"); result->extraData = soap_walk_tree(node, "extraData"); } /* soap_getEventInfo - Walks list of eventInfo nodes, providing details * on each event. Used after calling soap_getAllEvents(). * * Outputs: * event: indicates the type of event * eventTimeStamp: the time this event happened * queueSize: size of event queue, or -1 for not present * eventData: the event information for each type of event */ void soap_getEventInfo(xmlNode *events, struct eventInfo *result) { char *str; xmlNode *node; result->event = soap_enum(eventType_S, soap_tree_value(events, "event")); result->eventTimeStamp = atoi(soap_tree_value(events, "eventTimeStamp")); if ((str = soap_tree_value(events, "queueSize"))) result->queueSize = atoi(str); else result->queueSize = -1; if ((str = soap_tree_value(events, "numValue"))) { result->numValue = atoi(str); } result->extraData = soap_walk_tree(events, "extraData"); /* The remainder depends on what sort of data is returned by the OA. * The current documentation says that only one of these can be * returned, and indeed, since we have a union, we can handle only * one. Therefore, we will quit and return early when we get a * match. * * As of this writing, not all events have been handled. Those that * are not handled yet are noted by comments left in the code. Please * note that because some are unimplemented, these events will drop * through and be returned as "NOPAYLOAD", an answer that is not * correct. */ if ((node = soap_walk_tree(events, "syslog"))) { result->enum_eventInfo = SYSLOG; parse_syslog(node, &(result->eventData.syslog)); return; } if ((node = soap_walk_tree(events, "rackTopology"))) { result->enum_eventInfo = RACKTOPOLOGY; parse_rackTopology(node, &(result->eventData.rackTopology)); return; } if ((node = soap_walk_tree(events, "enclosureStatus"))) { result->enum_eventInfo = ENCLOSURESTATUS; parse_enclosureStatus(node, &(result->eventData.enclosureStatus)); return; } if ((node = soap_walk_tree(events, "enclosureInfo"))) { result->enum_eventInfo = ENCLOSUREINFO; parse_enclosureInfo(node, &(result->eventData.enclosureInfo)); return; } if ((node = soap_walk_tree(events, "oaStatus"))) { result->enum_eventInfo = OASTATUS; parse_oaStatus(node, &(result->eventData.oaStatus)); return; } if ((node = soap_walk_tree(events, "oaInfo"))) { result->enum_eventInfo = OAINFO; parse_oaInfo(node, &(result->eventData.oaInfo)); return; } if ((node = soap_walk_tree(events, "bladeInfo"))) { result->enum_eventInfo = BLADEINFO; parse_bladeInfo(node, &(result->eventData.bladeInfo)); return; } if ((node = soap_walk_tree(events, "bladeMpInfo"))) { result->enum_eventInfo = BLADEMPINFO; parse_bladeMpInfo(node, &(result->eventData.bladeMpInfo)); return; } if ((node = soap_walk_tree(events, "bladeStatus"))) { result->enum_eventInfo = BLADESTATUS; parse_bladeStatus(node, &(result->eventData.bladeStatus)); return; } /* BLADEPORTMAP */ if ((node = soap_walk_tree(events, "fanInfo"))) { result->enum_eventInfo = FANINFO; soap_fanInfo(node, &(result->eventData.fanInfo)); return; } if ((node = soap_walk_tree(events, "interconnectTrayStatus"))) { result->enum_eventInfo = INTERCONNECTTRAYSTATUS; parse_interconnectTrayStatus(node, &(result->eventData.interconnectTrayStatus)); return; } if ((node = soap_walk_tree(events, "interconnectTrayInfo"))) { result->enum_eventInfo = INTERCONNECTTRAYINFO; parse_interconnectTrayInfo(node, &(result->eventData.interconnectTrayInfo)); return; } /* INTERCONNECTTRAYPORTMAP */ if ((node = soap_walk_tree(events, "powerSupplyInfo"))) { result->enum_eventInfo = POWERSUPPLYINFO; parse_powerSupplyInfo(node, &(result->eventData.powerSupplyInfo)); return; } if ((node = soap_walk_tree(events, "powerSupplyStatus"))) { result->enum_eventInfo = POWERSUPPLYSTATUS; parse_powerSupplyStatus(node, &(result->eventData.powerSupplyStatus)); return; } if ((node = soap_walk_tree(events, "powerSubsystemInfo"))) { result->enum_eventInfo = POWERSUBSYSTEMINFO; parse_powerSubsystemInfo(node, &(result->eventData.powerSubsystemInfo)); return; } /* POWERCONFIGINFO */ if ((node = soap_walk_tree(events, "thermalInfo"))) { result->enum_eventInfo = THERMALINFO; parse_thermalInfo(node, &(result->eventData.thermalInfo)); return; } /* USERINFOARRAY */ if ((node = soap_walk_tree(events, "userInfo"))) { result->enum_eventInfo = USERINFO; parse_userInfo(node, &(result->eventData.userInfo)); return; } /* LDAPINFO */ /* LDAPGROUPINFO */ /* SNMPINFO */ /* ENCLOSURENETWORKINFO */ if ((node = soap_walk_tree(events, "oaNetworkInfo"))) { result->enum_eventInfo = OANETWORKINFO; parse_oaNetworkInfo(node, &(result->eventData.oaNetworkInfo)); return; } /* ENCLOSURETIME */ /* ALERTMAILINFO */ /* PASSWORDSETTINGS */ /* EBIPAINFO */ /* LCDCHATMESSAGE */ /* LCDUSERNOTES */ /* LCDBUTTONEVENT */ if ((node = soap_walk_tree(events, "lcdStatus"))) { result->enum_eventInfo = LCDSTATUS; parse_lcdStatus(node, &(result->eventData.lcdStatus)); return; } if ((node = soap_walk_tree(events, "lcdInfo"))) { result->enum_eventInfo = LCDINFO; parse_lcdInfo(node, &(result->eventData.lcdInfo)); return; } /* HPSIMINFO */ if ((node = soap_walk_tree(events, "thermalSubsystemInfo"))) { result->enum_eventInfo = THERMALSUBSYSTEMINFO; parse_thermalSubsystemInfo(node, &(result->eventData.thermalSubsystemInfo)); return; } /* BLADEBOOTINFO */ /* OAVCMMODE */ /* POWERREDUCTIONSTATUS */ /* VIRTUALMEDIASTATUS */ /* OAMEDIADEVICE */ if ((node = soap_walk_tree(events, "fanZone"))) { result->enum_eventInfo = FANZONE; soap_fanZone(node, &(result->eventData.fanZone)); return; } /* EBIPAINFOEX */ /* CACERTSINFO */ if ((node = soap_walk_tree (events, "rackTopology2"))) { result->enum_eventInfo = RACKTOPOLOGY2; parse_rackTopology2(node, &(result->eventData.rackTopology2)); return; } /* USERCERTIFICATEINFO */ /* SYSLOGSETTINGS */ /* POWERDELAYSETTINGS */ /* USBMEDIAFIRMWAREIMAGES */ /* CONFIGSCRIPTS */ /* NUMVALUE */ /* STRING */ if ((result->eventData.message = soap_tree_value(events, "message"))) { result->enum_eventInfo = MESSAGE; return; } result->enum_eventInfo = NOPAYLOAD; /* If we get here, we got nothing */ } /* Finally, the main body of OA SOAP call functions. These are the ones that * a user would expect to call for most things. Please refer to the associated * .h file for parameter details, and to the HP Onboard Administrator SOAP * Interface Guide for further call details. */ int soap_subscribeForEvents(SOAP_CON *con, struct eventPid *response) { SOAP_PARM_CHECK_NRQ if (! (ret = soap_request(con, SUBSCRIBE_FOR_EVENTS))) { parse_eventPid(soap_walk_doc(con->doc, "Body:eventPid"), response); } return(ret); } int soap_unSubscribeForEvents(SOAP_CON *con, const struct unSubscribeForEvents *request) { SOAP_PARM_CHECK_NRS return(soap_request(con, UN_SUBSCRIBE_FOR_EVENTS, request->pid)); } int soap_getEvent(SOAP_CON *con, const struct getEvent *request, struct eventInfo *response) { SOAP_PARM_CHECK if (! (ret = soap_request(con, GET_EVENT, request->pid, request->waitTilEventHappens, /* xsd:boolean */ request->lcdEvents))) { /* xsd:boolean */ soap_getEventInfo(soap_walk_doc(con->doc, "Body:" "getEventResponse:" "eventInfo"), response); } return(ret); } int soap_getAllEvents(SOAP_CON *con, const struct getAllEvents *request, struct getAllEventsResponse *response) { SOAP_PARM_CHECK if (! (ret = soap_request(con, GET_ALL_EVENTS, request->pid, request->waitTilEventHappens, /* xsd:boolean */ request->lcdEvents))) { /* xsd:boolean */ parse_getAllEvents(soap_walk_doc(con->doc, "Body:" "getAllEventsResponse"), response); } return(ret); } int soap_getBladeInfo(SOAP_CON *con, const struct getBladeInfo *request, struct bladeInfo *response) { SOAP_PARM_CHECK if (! (ret = soap_request(con, GET_BLADE_INFO, request->bayNumber))) { parse_bladeInfo(soap_walk_doc(con->doc, "Body:" "getBladeInfoResponse:" "bladeInfo"), response); } return(ret); } int soap_getBladeMpInfo(SOAP_CON *con, const struct getBladeMpInfo *request, struct bladeMpInfo *response) { SOAP_PARM_CHECK if (! (ret = soap_request(con, GET_BLADE_MP_INFO, request->bayNumber))) { parse_bladeMpInfo(soap_walk_doc(con->doc, "Body:" "getBladeMpInfoResponse:" "bladeMpInfo"), response); } return(ret); } int soap_getEnclosureInfo(SOAP_CON *con, struct enclosureInfo *response) { SOAP_PARM_CHECK_NRQ if (! (ret = soap_request(con, GET_ENCLOSURE_INFO))) { parse_enclosureInfo(soap_walk_doc(con->doc, "Body:" "getEnclosureInfoResponse:" "enclosureInfo"), response); } return(ret); } int soap_getOaStatus(SOAP_CON *con, const struct getOaStatus *request, struct oaStatus *response) { SOAP_PARM_CHECK if (! (ret = soap_request(con, GET_OA_STATUS, request->bayNumber))) { parse_oaStatus(soap_walk_doc(con->doc, "Body:" "getOaStatusResponse:" "oaStatus"), response); } return(ret); } int soap_getOaInfo(SOAP_CON *con, const struct getOaInfo *request, struct oaInfo *response) { SOAP_PARM_CHECK if (! (ret = soap_request(con, GET_OA_INFO, request->bayNumber))) { parse_oaInfo(soap_walk_doc(con->doc, "Body:" "getOaInfoResponse:" "oaInfo"), response); } return(ret); } int soap_getInterconnectTrayStatus(SOAP_CON *con, const struct getInterconnectTrayStatus *request, struct interconnectTrayStatus *response) { SOAP_PARM_CHECK if (! (ret = soap_request(con, GET_INTERCONNECT_TRAY_STATUS, request->bayNumber))) { parse_interconnectTrayStatus( soap_walk_doc(con->doc, "Body:" "getInterconnectTrayStatusResponse:" "interconnectTrayStatus"), response); } return(ret); } int soap_getInterconnectTrayInfo(SOAP_CON *con, const struct getInterconnectTrayInfo *request, struct interconnectTrayInfo *response) { SOAP_PARM_CHECK if (! (ret = soap_request(con, GET_INTERCONNECT_TRAY_INFO, request->bayNumber))) { parse_interconnectTrayInfo( soap_walk_doc(con->doc, "Body:" "getInterconnectTrayInfoResponse:" "interconnectTrayInfo"), response); } return(ret); } int soap_getFanInfo(SOAP_CON *con, const struct getFanInfo *request, struct fanInfo *response) { SOAP_PARM_CHECK if (! (ret = soap_request(con, GET_FAN_INFO, request->bayNumber))) { soap_fanInfo(soap_walk_doc(con->doc, "Body:" "getFanInfoResponse:" "fanInfo"), response); } return(ret); } int soap_getPowerSubsystemInfo(SOAP_CON *con, struct powerSubsystemInfo *response) { SOAP_PARM_CHECK_NRQ if (! (ret = soap_request(con, GET_POWER_SUBSYSTEM_INFO))) { parse_powerSubsystemInfo( soap_walk_doc(con->doc, "Body:" "getPowerSubsystemInfoResponse:" "powerSubsystemInfo"), response); } return(ret); } int soap_getPowerSupplyInfo(SOAP_CON *con, const struct getPowerSupplyInfo *request, struct powerSupplyInfo *response) { SOAP_PARM_CHECK if (! (ret = soap_request(con, GET_POWER_SUPPLY_INFO, request->bayNumber))) { parse_powerSupplyInfo( soap_walk_doc(con->doc, "Body:" "getPowerSupplyInfoResponse:" "powerSupplyInfo"), response); } return(ret); } int soap_getOaNetworkInfo(SOAP_CON *con, const struct getOaNetworkInfo *request, struct oaNetworkInfo *response) { SOAP_PARM_CHECK if (! (ret = soap_request(con, GET_OA_NETWORK_INFO, request->bayNumber))) { parse_oaNetworkInfo( soap_walk_doc(con->doc, "Body:" "getOaNetworkInfoResponse:" "oaNetworkInfo"), response); } return(ret); } int soap_getBladeStatus(SOAP_CON *con, const struct getBladeStatus *request, struct bladeStatus *response) { SOAP_PARM_CHECK if (! (ret = soap_request(con, GET_BLADE_STATUS, request->bayNumber))) { parse_bladeStatus(soap_walk_doc(con->doc, "Body:" "getBladeStatusResponse:" "bladeStatus"), response); } return(ret); } int soap_setBladePower(SOAP_CON *con, const struct setBladePower *request) { char power[POWER_CONTROL_LENGTH]; SOAP_PARM_CHECK_NRS if (soap_inv_enum(power, powerControl_S, request->power)) { err("invalid power parameter"); return(-1); } return(soap_request(con, SET_BLADE_POWER, request->bayNumber, power)); } int soap_setInterconnectTrayPower(SOAP_CON *con, const struct setInterconnectTrayPower *request) { SOAP_PARM_CHECK_NRS return(soap_request(con, SET_INTERCONNECT_TRAY_POWER, request->bayNumber, request->on)); } int soap_resetInterconnectTray(SOAP_CON *con, const struct resetInterconnectTray *request) { SOAP_PARM_CHECK_NRS return(soap_request(con, RESET_INTERCONNECT_TRAY, request->bayNumber)); } int soap_getThermalInfo(SOAP_CON *con, const struct getThermalInfo *request, struct thermalInfo *response) { char sensor[SENSOR_TYPE_LENGTH]; SOAP_PARM_CHECK if (soap_inv_enum(sensor, sensorType_S, request->sensorType)) { err("invalid sensorType parameter"); return(-1); } if (! (ret = soap_request(con, GET_THERMAL_INFO, sensor, request->bayNumber))) { parse_thermalInfo(soap_walk_doc(con->doc, "Body:" "getThermalInfoResponse:" "thermalInfo"), response); } return(ret); } int soap_getUserInfo(SOAP_CON *con, const struct getUserInfo *request, struct userInfo *response) { /* On this one, are there some special rules that have to be followed * while sending usernames over XML/SOAP? I could imagine that a user * name could contain characters that need to be escaped in XML. * * TODO: This needs to be checked. */ SOAP_PARM_CHECK if (! (ret = soap_request(con, GET_USER_INFO, request->username))) { parse_userInfo(soap_walk_doc(con->doc, "Body:" "getUserInfoResponse:" "userInfo"), response); } return(ret); } int soap_getRackTopology2(SOAP_CON *con, struct rackTopology2 *response) { SOAP_PARM_CHECK_NRQ if (! (ret = soap_request(con, GET_RACK_TOPOLOGY2))) { parse_rackTopology2(soap_walk_doc(con->doc, "Body:" "getRackTopology2Response:" "rackTopology2"), response); } return(ret); } int soap_isValidSession(SOAP_CON *con) { if (con == NULL) { err("NULL parameter"); return -1; } return(soap_request(con, IS_VALID_SESSION)); } int soap_getThermalSubsystemInfo(SOAP_CON *con, struct thermalSubsystemInfo *response) { SOAP_PARM_CHECK_NRQ if (! (ret = soap_request(con, GET_THERMAL_SUBSYSTEM_INFO))) { parse_thermalSubsystemInfo(soap_walk_doc(con->doc, "Body:" "getThermalSubsystemInfoResponse:" "thermalSubsystemInfo"), response); } return(ret); } int soap_getFanZoneArray(SOAP_CON *con, const struct getFanZoneArray *request, struct getFanZoneArrayResponse *response) { /* TODO: There is messy code below. It should be encapsulated, * either in a routine or macro. Holding off doing this for now, * until we're sure how array input parameters will be used. */ char bay_array[(sizeof(BAY) + 1) * request->bayArray.size]; byte *p; SOAP_PARM_CHECK /* Generate the fan zone array necessary for this request */ bay_array[0] = 0; for (p = request->bayArray.array; p - request->bayArray.array < request->bayArray.size; p++) { snprintf(bay_array + strlen(bay_array), sizeof(BAY), BAY, *p); } if (! (ret = soap_request(con, GET_FAN_ZONE_ARRAY, bay_array))) { parse_fanZoneArray(soap_walk_doc(con->doc, "Body:" "getFanZoneArrayResponse"), response); } return(ret); } int soap_getEnclosureStatus(SOAP_CON *con, struct enclosureStatus *response) { SOAP_PARM_CHECK_NRQ if (! (ret = soap_request(con, GET_ENCLOSURE_STATUS))) { parse_enclosureStatus(soap_walk_doc(con->doc, "Body:" "getEnclosureStatusResponse:" "enclosureStatus"), response); } return(ret); } int soap_getLcdInfo(SOAP_CON *con, struct lcdInfo *response) { SOAP_PARM_CHECK_NRQ if (! (ret = soap_request(con, GET_LCD_INFO))) { parse_lcdInfo(soap_walk_doc(con->doc, "Body:" "getLcdInfoResponse:" "lcdInfo"), response); } return(ret); } int soap_getLcdStatus(SOAP_CON *con, struct lcdStatus *response) { SOAP_PARM_CHECK_NRQ if (! (ret = soap_request(con, GET_LCD_STATUS))) { parse_lcdStatus(soap_walk_doc(con->doc, "Body:" "getLcdStatusResponse:" "lcdStatus"), response); } return(ret); } int soap_getPowerSupplyStatus(SOAP_CON *con, const struct getPowerSupplyStatus *request, struct powerSupplyStatus *response) { SOAP_PARM_CHECK if (! (ret = soap_request(con, GET_POWER_SUPPLY_STATUS, request->bayNumber))) { parse_powerSupplyStatus(soap_walk_doc(con->doc, "Body:" "getPowerSupplyStatusResponse:" "powerSupplyStatus"), response); } return(ret); } int soap_setEnclosureUid(SOAP_CON *con, const struct setEnclosureUid *request) { char uid[UID_CONTROL_LENGTH]; SOAP_PARM_CHECK_NRS if (soap_inv_enum(uid, uidControl_S, request->uid)) { err("invalid UID parameter"); return(-1); } return(soap_request(con, SET_ENCLOSURE_UID, uid)); } int soap_setOaUid(SOAP_CON *con, const struct setOaUid *request) { char uid[UID_CONTROL_LENGTH]; SOAP_PARM_CHECK_NRS if (soap_inv_enum(uid, uidControl_S, request->uid)) { err("invalid UID parameter"); return(-1); } return(soap_request(con, SET_OA_UID, request->bayNumber, uid)); } int soap_setBladeUid(SOAP_CON *con, const struct setBladeUid *request) { char uid[UID_CONTROL_LENGTH]; SOAP_PARM_CHECK_NRS if (soap_inv_enum(uid, uidControl_S, request->uid)) { err("invalid UID parameter"); return(-1); } return(soap_request(con, SET_BLADE_UID, request->bayNumber, uid)); } int soap_setInterconnectTrayUid(SOAP_CON *con, const struct setInterconnectTrayUid *request) { char uid[UID_CONTROL_LENGTH]; SOAP_PARM_CHECK_NRS if (soap_inv_enum(uid, uidControl_S, request->uid)) { err("invalid UID parameter"); return(-1); } return(soap_request(con, SET_INTERCONNECT_TRAY_UID, request->bayNumber, uid)); } int soap_setLcdButtonLock(SOAP_CON *con, enum hpoa_boolean buttonLock) { return(soap_request(con, SET_LCD_BUTTON_LOCK, buttonLock)); } int soap_getBladeThermalInfoArray(SOAP_CON *con, struct getBladeThermalInfoArray *request, struct bladeThermalInfoArrayResponse *response) { SOAP_PARM_CHECK if (! (ret = soap_request(con, GET_BLADE_THERMAL_INFO_ARRAY, request->bayNumber))) { parse_getBladeThermalInfoArray(soap_walk_doc(con->doc, "Body:" "getBladeThermalInfoArrayResponse"), response); } return(ret); } openhpi-2.14.1/plugins/oa_soap/oa_soap_load_id.c0000644000076400007640000000637211302566663016553 0ustar /* * Copyright (C) 2007-2008, Hewlett-Packard Development Company, LLP * All rights reserved. * * 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. * * Neither the name of the Hewlett-Packard Corporation, nor the names * of its contributors may be used to endorse or promote products * derived from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * Author(s) * Raghavendra P.G. **/ #include "oa_soap_load_id.h" /** * oa_soap_load_id_get * @oh_handler: Handler data pointer * @resource_id: Resource ID * @load_id: Load Id * * Purpose: * Retrieves the load id * * Detailed Description: NA * * Return values: * SA_ERR_HPI_UNSUPPORTED_API - current oa_soap implementation does not * support this API **/ SaErrorT oa_soap_load_id_get(void *oh_handler, SaHpiResourceIdT resource_id, SaHpiLoadIdT load_id) { err("oa_soap_load_id_get not implemented"); return SA_ERR_HPI_UNSUPPORTED_API; } /** * oa_soap_load_id_set * @oh_handler: Handler data pointer * @resource_id: Resource ID * @load_id: Load Id * * Purpose: * Sets Load Id * * Detailed Description: NA * * Return values: * SA_ERR_HPI_UNSUPPORTED_API - current oa_soap implementation does not * support this API **/ SaErrorT oa_soap_load_id_set(void *oh_handler, SaHpiResourceIdT resource_id, SaHpiLoadIdT *load_id) { err("oa_soap_load_id_set not implemented"); return SA_ERR_HPI_UNSUPPORTED_API; } void * oh_load_id_get (void *, SaHpiResourceIdT, SaHpiLoadIdT) __attribute__ ((weak, alias("oa_soap_load_id_get"))); void * oh_load_id_set (void *, SaHpiResourceIdT, SaHpiLoadIdT *) __attribute__ ((weak, alias("oa_soap_load_id_set"))); openhpi-2.14.1/plugins/oa_soap/oa_soap_sensor.h0000644000076400007640000003401311302566663016467 0ustar /* * Copyright (C) 2007-2008, Hewlett-Packard Development Company, LLP * All rights reserved. * * 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. * * Neither the name of the Hewlett-Packard Corporation, nor the names * of its contributors may be used to endorse or promote products * derived from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * Author(s) * Raghavendra M.S. * Shuah Khan * Raghavendra P.G. */ #ifndef _OA_SOAP_SENSOR_H #define _OA_SOAP_SENSOR_H /* Include files */ #include "oa_soap_utils.h" /* OA_SOAP_STM_VALID_MASK represents masks for "up critical" * and "up major" thresholds */ #define OA_SOAP_STM_VALID_MASK (SaHpiSensorThdMaskT)0x30 #define OA_SOAP_STM_UNSPECIFED (SaHpiSensorThdMaskT)0x00 /* Sensor classes of OA SOAP plugin * * On adding a new sesor class, please update the maximum sensor class value in * oa_soap_resources.h. Accordingly, add items to sensor enum mapping and * event assert mapping arrays in oa_soap_resources.c */ #define OA_SOAP_OPER_CLASS 0 #define OA_SOAP_PRED_FAIL_CLASS 1 #define OA_SOAP_REDUND_CLASS 2 #define OA_SOAP_DIAG_CLASS 3 #define OA_SOAP_TEMP_CLASS 4 #define OA_SOAP_PWR_STATUS_CLASS 5 #define OA_SOAP_FAN_SPEED_CLASS 6 #define OA_SOAP_PWR_SUBSYS_CLASS 7 #define OA_SOAP_ENC_AGR_OPER_CLASS 8 #define OA_SOAP_ENC_AGR_PRED_FAIL_CLASS 9 #define OA_SOAP_BOOL_CLASS 10 /* For some of the sensors like CPU fault, boolean false indicates sensor * state as enabled. BOOLEAN_REVERSE_CLASS represents the sensors whose sensor * value indicates reverse meaning */ #define OA_SOAP_BOOL_RVRS_CLASS 11 #define OA_SOAP_HEALTH_OPER_CLASS 12 #define OA_SOAP_HEALTH_PRED_FAIL_CLASS 13 #define OA_SOAP_BLADE_THERMAL_CLASS 14 /* Sensor assert states of OA SOAP plugin * * On adding new sensor event assert state, please update the maximum sensor * event array size value in oa_soap_resources.h. Accordingly, add items to * sensor event array in global sensor array in oa_soap_resources.c */ #define OA_SOAP_SEN_ASSERT_TRUE 0 #define OA_SOAP_SEN_ASSERT_FALSE 1 #define OA_SOAP_SEN_NO_CHANGE 2 /* Index of different thermal events event in event array. * These index will be used during the event generation */ /* OK to CAUTION */ #define OA_SOAP_TEMP_OK_CAUT 0 /* CAUTION to OK */ #define OA_SOAP_TEMP_CAUT_OK 1 /* CAUTION to CRITICAL */ #define OA_SOAP_TEMP_CAUT_CRIT 2 /* CRITICAL to CAUTION */ #define OA_SOAP_TEMP_CRIT_CAUT 3 /* The below code reduces the code size and eases code maintenance */ #define OA_SOAP_PROCESS_SENSOR_EVENT(sensor_num, sensor_value, reading, \ threshold) \ { \ rv = oa_soap_proc_sen_evt(oh_handler, resource_id, sensor_num, \ (SaHpiInt32T) sensor_value, reading, \ threshold); \ if (rv != SA_OK) { \ err("processing the sensor event for sensor %x has failed", \ sensor_num); \ return; \ } \ } /* Maximum number of enum values for healthStatus field in extraData structure */ #define OA_SOAP_MAX_HEALTH_ENUM 8 /* healthStatus string. This is used for parsing the healthStatus field in * extraData structure */ #define OA_SOAP_HEALTH_STATUS_STR "healthStatus" /* Different values supported by helthStatus structure in extraData */ enum oa_soap_extra_data_health { /* extraData healthStatus UNKNOWN */ HEALTH_UNKNOWN, /* extraData healthStatus OTHER */ HEALTH_OTHER, /* extraData healthStatus OK */ HEALTH_OK, /* extraData healthStatus DEGRADED */ HEALTH_DEGRAD, /* extraData healthStatus STRESSED */ HEALTH_STRESSED, /* extraData healthStatus PREDICTIVE_FAILURE */ HEALTH_PRED_FAIL, /* extraData healthStatus ERROR */ HEALTH_ERROR, /* extraData healthStatus NON_RECOVERABLERROR */ HEALTH_NRE }; /* Maximum number of supported fields in diagnosticChecksEx structure * * When a new field is added to diagnosticChecksEx structure, please update the * #define and enum oa_soap_diag_ex in oa_soap_sensor.h, also update * oa_soap_diag_ex_arr in oa_soap_resources.c */ #define OA_SOAP_MAX_DIAG_EX 17 /* Possible fields supported by diagnosticChecksEx structure * * When a new field is added to diagnosticChecksEx structure, please update the * #define and enum oa_soap_diag_ex in oa_soap_sensor.h, also update * oa_soap_diag_ex_arr in oa_soap_resources.c */ enum oa_soap_diag_ex { /* diagnosticChecksEx deviceMissing */ DIAG_EX_DEV_MISS, /* diagnosticChecksEx devicePowerSequence */ DIAG_EX_DEV_PWR_SEQ, /* diagnosticChecksEx deviceBonding */ DIAG_EX_DEV_BOND, /* diagnosticChecksEx profileUnassignedError */ DIAG_EX_PROF_UNASSIGN_ERR, /* diagnosticChecksEx deviceNotSupported */ DIAG_EX_DEV_NOT_SUPPORT, /* diagnosticChecksEx networkConfiguration */ DIAG_EX_NET_CONFIG, /* diagnosticChecksEx tooLowPowerRequest */ DIAG_EX_TOO_LOW_PWR_REQ, /* diagnosticChecksEx callHP */ DIAG_EX_CALL_HP, /* diagnosticChecksEx deviceInformational */ DIAG_EX_DEV_INFO, /* diagnosticChecksEx storageDeviceMissing */ DIAG_EX_STORAGE_DEV_MISS, /* diagnosticChecksEx firmwareMismatch */ DIAG_EX_FW_MISMATCH, /* diagnosticChecksEx enclosureIdMismatch */ DIAG_EX_ENC_ID_MISMATCH, /* POWERDELAY_IN_USE is not used as sensor. 'Power delay in use' does * not indicates any failure. */ DIAG_EX_POWERDELAY_IN_USE, /* diagnosticChecksEx deviceMixMatch */ DIAG_EX_DEV_MIX_MATCH, /* diagnosticChecksEx gprcapError */ DIAG_EX_GRPCAP_ERR, /* diagnosticChecksEx imlRecordedError */ DIAG_EX_IML_ERR, /* diagnosticChecksEx duplicateManagementIpAddress */ DIAG_EX_DUP_MGMT_IP_ADDR }; /* Maximum number of possible sensor strings provided * by getBladeThermalInfoArray soap call */ #define OA_SOAP_MAX_THRM_SEN 9 /* Enum values for the sensor description strings provide by * getBladeThermalInfoArray soap call */ enum oa_soap_thermal_sen { SYSTEM_ZONE, CPU_ZONE, CPU_1, CPU_2, CPU_3, CPU_4, DISK_ZONE, MEMORY_ZONE, AMBIENT_ZONE }; /* Define the sensor number range for blade extra thermal sensors */ #define OA_SOAP_BLD_THRM_SEN_START 0x02e #define OA_SOAP_BLD_THRM_SEN_END 0x04d /* Structure required for building thermal sensor when server blade is off */ struct oa_soap_static_thermal_sensor_info { SaHpiSensorNumT base_sen_num; /* Base sensor number for sensor type */ enum oa_soap_thermal_sen sensor; /* thermal sensor type */ SaHpiInt32T sensor_count; /* Number of sensor to be created of * above thermal sensor type */ }; /* Structure containing thermal sensor information data*/ struct oa_soap_thrm_sen_data { SaHpiRdrT rdr_num; SaHpiSensorNumT sen_delta; /* Delta difference of the sensor rdr number * from the base sensor number of particular * sensor type */ }; /* Structure for sensor reading */ struct oa_soap_sensor_reading_data { SaHpiSensorReadingT data; SaHpiEventStateT event; }; /* Declaration of sensor specific information structure */ struct oa_soap_sensor_info { SaHpiEventStateT current_state; SaHpiEventStateT previous_state; SaHpiBoolT sensor_enable; SaHpiBoolT event_enable; SaHpiEventStateT assert_mask; SaHpiEventStateT deassert_mask; SaHpiSensorReadingT sensor_reading; SaHpiSensorThresholdsT threshold; }; /* Declaration of the functions related to sensor */ SaErrorT oa_soap_get_sensor_reading(void *oh_handler, SaHpiResourceIdT resource_id, SaHpiSensorNumT num, SaHpiSensorReadingT *data, SaHpiEventStateT *state); SaErrorT oa_soap_get_sensor_thresholds(void *oh_handler, SaHpiResourceIdT resource_id, SaHpiSensorNumT num, SaHpiSensorThresholdsT *thres); SaErrorT oa_soap_set_sensor_thresholds(void *oh_handler, SaHpiResourceIdT resource_id, SaHpiSensorNumT num, const SaHpiSensorThresholdsT *thres); SaErrorT oa_soap_get_sensor_event_enable(void *oh_handler, SaHpiResourceIdT resource_id, SaHpiSensorNumT num, SaHpiBoolT *enable); SaErrorT oa_soap_set_sensor_event_enable(void *oh_handler, SaHpiResourceIdT resource_id, SaHpiSensorNumT num, const SaHpiBoolT enable); SaErrorT oa_soap_get_sensor_enable(void *oh_handler, SaHpiResourceIdT resource_id, SaHpiSensorNumT num, SaHpiBoolT *enable); SaErrorT oa_soap_set_sensor_enable(void *oh_handler, SaHpiResourceIdT resource_id, SaHpiSensorNumT num, SaHpiBoolT enable); SaErrorT oa_soap_get_sensor_event_masks(void *oh_handler, SaHpiResourceIdT resource_id, SaHpiSensorNumT num, SaHpiEventStateT *assert, SaHpiEventStateT *deassert); SaErrorT oa_soap_set_sensor_event_masks(void *oh_handler, SaHpiResourceIdT resource_id, SaHpiSensorNumT num, SaHpiSensorEventMaskActionT act, SaHpiEventStateT assert, SaHpiEventStateT deassert); SaErrorT update_sensor_rdr(struct oh_handler_state *oh_handler, SaHpiResourceIdT resource_id, SaHpiSensorNumT num, SaHpiRptEntryT *rpt, struct oa_soap_sensor_reading_data *data); SaErrorT generate_sensor_enable_event(void *oh_handler, SaHpiSensorNumT rdr_num, SaHpiRptEntryT *rpt, SaHpiRdrT *rdr, struct oa_soap_sensor_info *sensor_info); SaErrorT generate_sensor_assert_thermal_event(void *oh_handler, SaHpiSensorNumT rdr_num, SaHpiRptEntryT *rpt, SaHpiRdrT *rdr, SaHpiSensorReadingT current_reading, SaHpiSeverityT event_severity, struct oa_soap_sensor_info *sensor_info); SaErrorT generate_sensor_deassert_thermal_event(void *oh_handler, SaHpiSensorNumT rdr_num, SaHpiRptEntryT *rpt, SaHpiRdrT *rdr, SaHpiSensorReadingT current_reading, SaHpiSeverityT event_severity, struct oa_soap_sensor_info *sensor_info); SaErrorT check_and_deassert_event(struct oh_handler_state *oh_handler, SaHpiResourceIdT resource_id, SaHpiRdrT *rdr, struct oa_soap_sensor_info *sensor_info); SaErrorT oa_soap_build_sen_rdr(struct oh_handler_state *oh_handler, SaHpiResourceIdT resource_id, SaHpiRdrT *rdr, struct oa_soap_sensor_info **sensor_info, SaHpiSensorNumT sensor_num); SaErrorT oa_soap_map_sen_val(struct oa_soap_sensor_info *sensor_info, SaHpiSensorNumT sensor_num, SaHpiInt32T sensor_value, SaHpiInt32T *sensor_status); SaErrorT oa_soap_proc_sen_evt(struct oh_handler_state *oh_handler, SaHpiResourceIdT resource_id, SaHpiSensorNumT sen_num, SaHpiInt32T sensor_value, SaHpiFloat64T trigger_reading, SaHpiFloat64T trigger_threshold); SaErrorT oa_soap_map_thresh_resp(SaHpiRdrT *rdr, void *response, SaHpiBoolT event_support, struct oa_soap_sensor_info *sensor_info); SaErrorT oa_soap_assert_sen_evt(struct oh_handler_state *oh_handler, SaHpiRptEntryT *rpt, GSList *assert_sensor_list); SaErrorT oa_soap_get_bld_thrm_sen_data(SaHpiSensorNumT sen_num, struct bladeThermalInfoArrayResponse response, struct bladeThermalInfo *bld_thrm_info); #endif openhpi-2.14.1/plugins/oa_soap/oa_soap_fumi.c0000644000076400007640000003655611302566663016127 0ustar /* * Copyright (C) 2007-2008, Hewlett-Packard Development Company, LLP * All rights reserved. * * 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. * * Neither the name of the Hewlett-Packard Corporation, nor the names * of its contributors may be used to endorse or promote products * derived from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * Author(s) * Raja Kumar Thatte **/ #include "oa_soap_fumi.h" /** * oa_soap_set_fumi_source * @oh_handler: Handler data pointer * @resource_id: Resource ID * @num: FUMI number * @banknum: Bank number * @sourceuri: Text buffer containing URI of the source * * Purpose: * Set new source image URI information to the given bank * of the given FUMI. * * Detailed Description: NA * * Return values: * SA_ERR_HPI_UNSUPPORTED_API - current oa_soap implementation does not * support this API **/ SaErrorT oa_soap_set_fumi_source(void *oh_handler, SaHpiResourceIdT resource_id, SaHpiFumiNumT num, SaHpiBankNumT banknum, SaHpiTextBufferT *sourceuri) { err("oa_soap_set_fumi_source not implemented"); return SA_ERR_HPI_UNSUPPORTED_API; } /** * oa_soap_validate_fumi_source * @oh_handler: Handler data pointer * @resource_id: Resource ID * @num: FUMI number * @banknum: Bank number * * Purpose: * Validate the integrity of the source image associated with * the given bank. * * Detailed Description: NA * * Return values: * SA_ERR_HPI_UNSUPPORTED_API - current oa_soap implementation does not * support this API **/ SaErrorT oa_soap_validate_fumi_source(void *oh_handler, SaHpiResourceIdT resource_id, SaHpiFumiNumT num, SaHpiBankNumT banknum) { err("oa_soap_validate_fumi_source not implemented"); return SA_ERR_HPI_UNSUPPORTED_API; } /** * oa_soap_get_fumi_source * @oh_handler: Handler data pointer * @resource_id: Resource ID * @num: FUMI number * @banknum: Bank number * @sourceuri: Source Image URI * * Purpose: * Get the source image URI information assigned to the given bank. * * Detailed Description: NA * * Return values: * SA_ERR_HPI_UNSUPPORTED_API - current oa_soap implementation does not * support this API **/ SaErrorT oa_soap_get_fumi_source(void *oh_handler, SaHpiResourceIdT resource_id, SaHpiFumiNumT num, SaHpiBankNumT banknum, SaHpiFumiSourceInfoT *sourceinfo) { err("oa_soap_get_fumi_source not implemented"); return SA_ERR_HPI_UNSUPPORTED_API; } /** * oa_soap_get_fumi_target * @oh_handler: Handler data pointer * @resource_id: Resource ID * @num: FUMI number * @banknum: Bank number * @bankinfo: Current Image details of the give bank * * Purpose: * Get current image information on the target. * * Detailed Description: NA * * Return values: * SA_ERR_HPI_UNSUPPORTED_API - current oa_soap implementation does not * support this API **/ SaErrorT oa_soap_get_fumi_target(void *oh_handler, SaHpiResourceIdT resource_id, SaHpiFumiNumT num, SaHpiBankNumT banknum, SaHpiFumiBankInfoT *bankinfo) { err("oa_soap_get_fumi_target not implemented"); return SA_ERR_HPI_UNSUPPORTED_API; } /** * oa_soap_start_fumi_backup * @oh_handler: Handler data pointer * @resource_id: Resource ID * @num: FUMI number * * Purpose: * Take the backup of the currently active bank image. * * Detailed Description: NA * * Return values: * SA_ERR_HPI_UNSUPPORTED_API - current oa_soap implementation does not * support this API **/ SaErrorT oa_soap_start_fumi_backup(void *oh_handler, SaHpiResourceIdT resource_id, SaHpiFumiNumT num) { err("oa_soap_start_fumi_backup not implemented"); return SA_ERR_HPI_UNSUPPORTED_API; } /** * oa_soap_set_fumi_bank_order * @oh_handler: Handler data pointer * @resource_id: Resource ID * @num: FUMI number * @banknum: Bank number * @position: bank position in boot order * * Purpose: * Set the bank position in boot order . * * Detailed Description: NA * * Return values: * SA_ERR_HPI_UNSUPPORTED_API - current oa_soap implementation does not * support this API **/ SaErrorT oa_soap_set_fumi_bank_order(void *oh_handler, SaHpiResourceIdT resource_id, SaHpiFumiNumT num, SaHpiBankNumT banknum, SaHpiUint32T position) { err("oa_soap_set_fumi_bank_order not implemented"); return SA_ERR_HPI_UNSUPPORTED_API; } /** * oa_soap_start_fumi_bank_copy * @oh_handler: Handler data pointer * @resource_id: Resource ID * @num: FUMI number * @sourcebanknum: Bank number * @targetbanknum: Text buffer containing URI of the source * * Purpose: * Copy the image from source bank to target bank. * * Detailed Description: NA * * Return values: * SA_ERR_HPI_UNSUPPORTED_API - current oa_soap implementation does not * support this API **/ SaErrorT oa_soap_start_fumi_bank_copy(void *oh_handler, SaHpiResourceIdT resource_id, SaHpiFumiNumT num, SaHpiBankNumT sourcebanknum, SaHpiBankNumT targetbanknum) { err("oa_soap_start_fumi_bank_copy not implemented"); return SA_ERR_HPI_UNSUPPORTED_API; } /** * oa_soap_start_fumi_install * @oh_handler: Handler data pointer * @resource_id: Resource ID * @num: FUMI number * @banknum: Bank number * * Purpose: * To install the image in the given bank. * * Detailed Description: NA * * Return values: * SA_ERR_HPI_UNSUPPORTED_API - current oa_soap implementation does not * support this API **/ SaErrorT oa_soap_start_fumi_install(void *oh_handler, SaHpiResourceIdT resource_id, SaHpiFumiNumT num, SaHpiBankNumT banknum) { err("oa_soap_start_fumi_install not implemented"); return SA_ERR_HPI_UNSUPPORTED_API; } /** * oa_soap_get_fumi_status * @oh_handler: Handler data pointer * @resource_id: Resource ID * @num: FUMI number * @banknum: Bank number * @status: Image Upgrade status * * Purpose: * To know the image upgrade progress status.. * * Detailed Description: NA * * Return values: * SA_ERR_HPI_UNSUPPORTED_API - current oa_soap implementation does not * support this API **/ SaErrorT oa_soap_get_fumi_status(void *oh_handler, SaHpiResourceIdT resource_id, SaHpiFumiNumT num, SaHpiBankNumT banknum, SaHpiFumiUpgradeStatusT *status) { err("oa_soap_get_fumi_status not implemented"); return SA_ERR_HPI_UNSUPPORTED_API; } /** * oa_soap_start_fumi_verify * @oh_handler: Handler data pointer * @resource_id: Resource ID * @num: FUMI number * @banknum: Bank number * * Purpose: * To validate the upgraded image. * * Detailed Description: NA * * Return values: * SA_ERR_HPI_UNSUPPORTED_API - current oa_soap implementation does not * support this API **/ SaErrorT oa_soap_start_fumi_verify(void *oh_handler, SaHpiResourceIdT resource_id, SaHpiFumiNumT num, SaHpiBankNumT banknum) { err("oa_soap_start_fumi_verify not implemented"); return SA_ERR_HPI_UNSUPPORTED_API; } /** * oa_soap_cancel_fumi_upgrade * @oh_handler: Handler data pointer * @resource_id: Resource ID * @num: FUMI number * @banknum: Bank number * * Purpose: * To stop the image upgrade process. * * Detailed Description: NA * * Return values: * SA_ERR_HPI_UNSUPPORTED_API - current oa_soap implementation does not * support this API **/ SaErrorT oa_soap_cancel_fumi_upgrade(void *oh_handler, SaHpiResourceIdT resource_id, SaHpiFumiNumT num, SaHpiBankNumT banknum) { err("oa_soap_cancel_fumi_upgrade not implemented"); return SA_ERR_HPI_UNSUPPORTED_API; } /** * oa_soap_start_fumi_rollback * @oh_handler: Handler data pointer * @resource_id: Resource ID * @num: FUMI number * * Purpose: * To rollback the image * (Stop the image upgrade process and restore the backup image). * * Detailed Description: NA * * Return values: * SA_ERR_HPI_UNSUPPORTED_API - current oa_soap implementation does not * support this API **/ SaErrorT oa_soap_start_fumi_rollback(void *oh_handler, SaHpiResourceIdT resource_id, SaHpiFumiNumT num) { err("oa_soap_start_fumi_rollback not implemented"); return SA_ERR_HPI_UNSUPPORTED_API; } /** * oa_soap_activate_fumi * @oh_handler: Handler data pointer * @resource_id: Resource ID * @num: FUMI number * * Purpose: * To start the newly upgraded image. * * Detailed Description: NA * * Return values: * SA_ERR_HPI_UNSUPPORTED_API - current oa_soap implementation does not * support this API **/ SaErrorT oa_soap_activate_fumi(void *oh_handler, SaHpiResourceIdT resource_id, SaHpiFumiNumT num) { err("oa_soap_activate_fumi not implemented"); return SA_ERR_HPI_UNSUPPORTED_API; } void * oh_set_fumi_source (void *, SaHpiResourceIdT, SaHpiFumiNumT, SaHpiBankNumT, SaHpiTextBufferT *) __attribute__ ((weak, alias("oa_soap_set_fumi_source"))); void * oh_validate_fumi_source (void *, SaHpiResourceIdT, SaHpiFumiNumT, SaHpiBankNumT) __attribute__ ((weak, alias("oa_soap_validate_fumi_source"))); void * oh_get_fumi_source (void *, SaHpiResourceIdT, SaHpiFumiNumT, SaHpiBankNumT, SaHpiFumiSourceInfoT *) __attribute__ ((weak, alias("oa_soap_get_fumi_source"))); void * oh_get_fumi_target (void *, SaHpiResourceIdT, SaHpiFumiNumT, SaHpiBankNumT, SaHpiFumiBankInfoT *) __attribute__ ((weak, alias("oa_soap_get_fumi_target"))); void * oh_start_fumi_backup (void *, SaHpiResourceIdT, SaHpiFumiNumT) __attribute__ ((weak, alias("oa_soap_start_fumi_backup"))); void * oh_set_fumi_bank_order (void *, SaHpiResourceIdT, SaHpiFumiNumT, SaHpiBankNumT, SaHpiUint32T) __attribute__ ((weak, alias("oa_soap_set_fumi_bank_order"))); void * oh_start_fumi_bank_copy (void *, SaHpiResourceIdT, SaHpiFumiNumT, SaHpiBankNumT, SaHpiBankNumT) __attribute__ ((weak, alias("oa_soap_start_fumi_bank_copy"))); void * oh_start_fumi_install (void *, SaHpiResourceIdT, SaHpiFumiNumT, SaHpiBankNumT) __attribute__ ((weak, alias("oa_soap_start_fumi_install"))); void * oh_get_fumi_status (void *, SaHpiResourceIdT, SaHpiFumiNumT, SaHpiBankNumT, SaHpiFumiUpgradeStatusT *) __attribute__ ((weak, alias("oa_soap_get_fumi_status"))); void * oh_start_fumi_verify (void *, SaHpiResourceIdT, SaHpiFumiNumT, SaHpiBankNumT) __attribute__ ((weak, alias("oa_soap_start_fumi_verify"))); void * oh_cancel_fumi_upgrade (void *, SaHpiResourceIdT, SaHpiFumiNumT, SaHpiBankNumT) __attribute__ ((weak, alias("oa_soap_cancel_fumi_upgrade"))); void * oh_start_fumi_rollback (void *, SaHpiResourceIdT, SaHpiFumiNumT) __attribute__ ((weak, alias("oa_soap_start_fumi_rollback"))); void * oh_activate_fumi (void *, SaHpiResourceIdT, SaHpiFumiNumT) __attribute__ ((weak, alias("oa_soap_activate_fumi"))); openhpi-2.14.1/plugins/oa_soap/oa_soap_dimi.c0000644000076400007640000002514311302566663016077 0ustar /* * Copyright (C) 2007-2008, Hewlett-Packard Development Company, LLP * All rights reserved. * * 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. * * Neither the name of the Hewlett-Packard Corporation, nor the names * of its contributors may be used to endorse or promote products * derived from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * Author(s) * Anand S **/ #include "oa_soap_dimi.h" /** * oa_soap_get_dimi_info: * @oh_handler : Handler data pointer * @session_id : Session ID * @resource_id : Resource ID * @dimi_num : Dimi Number * @dimi_info : Dimi Information Holder * * Purpose: * This function gets information about the DIMI. * * Description: * NA * * Returns: * SA_ERR_HPI_UNSUPPORTED_API - current oa_soap implementation does not * support this API **/ SaErrorT oa_soap_get_dimi_info(void *oh_handler, SaHpiSessionIdT session_id, SaHpiResourceIdT resource_id, SaHpiDimiNumT dimi_num, SaHpiDimiInfoT *dimi_info) { err("oa_soap_get_dimi_info not implemented"); return SA_ERR_HPI_UNSUPPORTED_API; } /** * oa_soap_get_dimi_test: * @oh_handler : Handler data pointer * @session_id : Session ID * @resource_id : Resource ID * @dimi_num : Dimi Number * @dimi_testnum : Dimi Test Number * @dimi_test : Dimi Test Information Holder * * Purpose: * This function gets information about a particular Test * Description: * NA * * Returns: * SA_ERR_HPI_UNSUPPORTED_API - current oa_soap implementation does not * support this API **/ SaErrorT oa_soap_get_dimi_test(void *oh_handler, SaHpiSessionIdT session_id, SaHpiResourceIdT resource_id, SaHpiDimiNumT dimi_num, SaHpiDimiTestNumT dimi_testnum, SaHpiDimiTestT *dimi_test) { err("oa_soap_get_dimi_info not implemented"); return SA_ERR_HPI_UNSUPPORTED_API; } /** * oa_soap_get_dimi_test_ready: * @oh_handler : Handler data pointer * @session_id : Session ID * @resource_id : Resource ID * @dimi_num : Dimi Number * @dimi_testnum : Dimi Test Number * @dimi_test_ready : Dimi Test readiness Information Holder * * Purpose: * This function provides the readiness of a DIMI to run a test * Description: * NA * * Returns: * SA_ERR_HPI_UNSUPPORTED_API - current oa_soap implementation does not * support this API **/ SaErrorT oa_soap_get_dimi_test_ready(void *oh_handler, SaHpiSessionIdT session_id, SaHpiResourceIdT resource_id, SaHpiDimiNumT dimi_num, SaHpiDimiTestNumT dimi_testnum, SaHpiDimiReadyT *dimi_test_ready) { err("oa_soap_get_dimi_info not implemented"); return SA_ERR_HPI_UNSUPPORTED_API; } /** * oa_soap_start_dimi_test: * @oh_handler : Handler data pointer * @session_id : Session ID * @resource_id : Resource ID * @dimi_num : Dimi Number * @dimi_testnum : Dimi Test Number * @params : Number of Parameters * @param_list : Parameters List * * Purpose: * This function starts execution of a test on DIMI. * Description: * NA * * Returns: * SA_ERR_HPI_UNSUPPORTED_API - current oa_soap implementation does not * support this API **/ SaErrorT oa_soap_start_dimi_test(void *oh_handler, SaHpiSessionIdT session_id, SaHpiResourceIdT resource_id, SaHpiDimiNumT dimi_num, SaHpiDimiTestNumT dimi_testnum, SaHpiUint8T params, SaHpiDimiTestVariableParamsT *param_list) { err("oa_soap_get_dimi_info not implemented"); return SA_ERR_HPI_UNSUPPORTED_API; } /** * oa_soap_cancel_dimi_test: * @oh_handler : Handler data pointer * @session_id : Session ID * @resource_id : Resource ID * @dimi_num : Dimi Number * @dimi_testnum : Dimi Test Number * @params : Number of Parameters * @param_list : Parameters List * * Purpose: * This function starts execution of a test on DIMI. * Description: * NA * * Returns: * SA_ERR_HPI_UNSUPPORTED_API - current oa_soap implementation does not * support this API **/ SaErrorT oa_soap_cancel_dimi_test(void *oh_handler, SaHpiSessionIdT session_id, SaHpiResourceIdT resource_id, SaHpiDimiNumT dimi_num, SaHpiDimiTestNumT dimi_testnum) { err("oa_soap_get_dimi_info not implemented"); return SA_ERR_HPI_UNSUPPORTED_API; } /** * oa_soap_get_dimi_test_status: * @oh_handler : Handler data pointer * @session_id : Session ID * @resource_id : Resource ID * @dimi_num : Dimi Number * @dimi_testnum : Dimi Test Number * @complete : Percentage of Test run completed * @status : Test Run Status * * Purpose: * This function returns the status of a particular DIMI test * Description: * NA * * Returns: * SA_ERR_HPI_UNSUPPORTED_API - current oa_soap implementation does not * support this API **/ SaErrorT oa_soap_get_dimi_test_status(void *oh_handler, SaHpiSessionIdT session_id, SaHpiResourceIdT resource_id, SaHpiDimiNumT dimi_num, SaHpiDimiTestNumT dimi_testnum, SaHpiDimiTestPercentCompletedT *complete, SaHpiDimiTestRunStatusT *status) { err("oa_soap_get_dimi_info not implemented"); return SA_ERR_HPI_UNSUPPORTED_API; } /** * oa_soap_get_dimi_test_retult: * @oh_handler : Handler data pointer * @session_id : Session ID * @resource_id : Resource ID * @dimi_num : Dimi Number * @dimi_testnum : Dimi Test Number * @test_result : Dimi Test Result Information Holder * * Purpose: * This function retrieves the results from the last run of test in DIMI * Description: * NA * * Returns: * SA_ERR_HPI_UNSUPPORTED_API - current oa_soap implementation does not * support this API **/ SaErrorT oa_soap_get_dimi_test_result(void *oh_handler, SaHpiSessionIdT session_id, SaHpiResourceIdT resource_id, SaHpiDimiNumT dimi_num, SaHpiDimiTestNumT dimi_testnum, SaHpiDimiTestResultsT *test_result) { err("oa_soap_get_dimi_info not implemented"); return SA_ERR_HPI_UNSUPPORTED_API; } /** * * Mapping of the ABIs with local function pointers * **/ void * oh_get_dimi_info (void*, SaHpiSessionIdT, SaHpiResourceIdT, SaHpiDimiNumT, SaHpiDimiInfoT*) __attribute__ ((weak, alias ("oa_soap_get_dimi_info"))); void * oh_get_dimi_test (void*, SaHpiSessionIdT, SaHpiResourceIdT, SaHpiDimiNumT, SaHpiDimiTestNumT, SaHpiDimiTestT*) __attribute__ ((weak, alias ("oa_soap_get_dimi_test"))); void * oh_get_dimi_test_ready (void*, SaHpiSessionIdT, SaHpiResourceIdT, SaHpiDimiNumT, SaHpiDimiTestNumT, SaHpiDimiReadyT*) __attribute__ ((weak, alias ("oa_soap_get_dimi_test_ready"))); void * oh_start_dimi_test (void*, SaHpiSessionIdT, SaHpiResourceIdT, SaHpiDimiNumT, SaHpiDimiTestNumT, SaHpiUint8T, SaHpiDimiTestVariableParamsT*) __attribute__ ((weak, alias ("oa_soap_start_dimi_test"))); void * oh_cancel_dimi_test (void*, SaHpiSessionIdT, SaHpiResourceIdT, SaHpiDimiNumT, SaHpiDimiTestNumT) __attribute__ ((weak, alias ("oa_soap_cancel_dimi_test"))); void * oh_get_dimi_test_status (void*, SaHpiSessionIdT, SaHpiResourceIdT, SaHpiDimiNumT, SaHpiDimiTestNumT, SaHpiDimiTestPercentCompletedT*, SaHpiDimiTestRunStatusT*) __attribute__ ((weak, alias ("oa_soap_get_dimi_test_status"))); void * oh_get_dimi_test_result (void*, SaHpiSessionIdT, SaHpiResourceIdT, SaHpiDimiNumT, SaHpiDimiTestNumT, SaHpiDimiTestResultsT*) __attribute__ ((weak, alias ("oa_soap_get_dimi_test_result"))); openhpi-2.14.1/plugins/oa_soap/oa_soap_inventory.h0000644000076400007640000003067411302566663017224 0ustar /* * Copyright (C) 2007-2008, Hewlett-Packard Development Company, LLP * All rights reserved. * * 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. * * Neither the name of the Hewlett-Packard Corporation, nor the names * of its contributors may be used to endorse or promote products * derived from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * Author(s) * Raghavendra M.S. * Shuah Khan * Raghavendra P.G. */ #ifndef _OA_SOAP_INVENTORY_H #define _OA_SOAP_INVENTORY_H /* Include files */ #include "oa_soap.h" #include /* cClass resource inventory string */ #define ENCLOSURE_INVENTORY_STRING "Enclosure Inventory" #define OA_INVENTORY_STRING "OA Inventory" #define SERVER_INVENTORY_STRING "Server Inventory" #define INTERCONNECT_INVENTORY_STRING "Interconnect Inventory" #define FAN_INVENTORY_STRING "Fan Inventory" #define POWER_SUPPLY_INVENTORY_STRING "Power Supply Inventory" #define POWER_SUPPLY_RDR_STRING "Power Supply" /* Inventory data field structure */ struct oa_soap_field { SaHpiIdrFieldT field; struct oa_soap_field *next_field; }; /* Inventory data area structure */ struct oa_soap_area { SaHpiIdrAreaHeaderT idr_area_head; struct oa_soap_field *field_list; struct oa_soap_area *next_area; }; struct oa_soap_inventory_info { SaHpiIdrInfoT idr_info; struct oa_soap_area *area_list; }; /* Inventory data respository header structure */ struct oa_soap_inventory { SaHpiInventoryRecT inv_rec; struct oa_soap_inventory_info info; char *comment; }; /* Maximum areas for a resource in OA SOAP * * If a new area is added for a resource, then change the maximum inventory * area value. Accordingly, add dummy elements into global inventory RDR array * in oa_soap_resources.c */ #define OA_SOAP_MAX_INV_AREAS 3 /* Maximum fields in an area in OA SOAP * * If a new field in an area for a resource, then change the maximum inventory * fields value. Accordingly, add dummy elements into global inventory RDR array * in oa_soap_resources.c */ #define OA_SOAP_MAX_INV_FIELDS 3 struct oa_soap_inv_area { struct oa_soap_area area; struct oa_soap_field field_array[OA_SOAP_MAX_INV_FIELDS]; }; struct oa_soap_inv_rdr { SaHpiRdrT rdr; struct oa_soap_inventory inventory; struct oa_soap_inv_area area_array[OA_SOAP_MAX_INV_AREAS]; }; /* The maximum size of the fan zone inventory field data. * In c3000, it can have the data "1,2,3,4,5,6,7,8" for device bays. * 3 bytes of char array is enough to accomodate above information. * * On supporting new enclosure type, change the below #define value as * appropriate */ #define OA_SOAP_MAX_FZ_INV_SIZE 31 /* Maximum size of fan zone number digits. In c7000, 4 fan zones are supported. * 1 digit is required to represent the fan zone number. * * On supporting new enclosure type, change the below #define value as * appropriate */ #define OA_SOAP_MAX_FZ_NUM_SIZE 1 /* Structure for mapping the Fans to Fan zones with shared status information. * This will be used to construct the inventory data field for Fan */ struct oa_soap_fz_map { SaHpiInt32T zone; SaHpiInt32T secondary_zone; SaHpiBoolT shared; }; /* Inventory function declarations */ SaErrorT oa_soap_get_idr_info(void *oh_handler, SaHpiResourceIdT resource_id, SaHpiIdrIdT idr_id, SaHpiIdrInfoT *idr_info); SaErrorT oa_soap_get_idr_area_header(void *oh_handler, SaHpiResourceIdT resource_id, SaHpiIdrIdT idr_id, SaHpiIdrAreaTypeT area_type, SaHpiEntryIdT area_id, SaHpiEntryIdT *next_area_id, SaHpiIdrAreaHeaderT *area_header); SaErrorT oa_soap_add_idr_area(void *oh_handler, SaHpiResourceIdT resource_id, SaHpiIdrIdT idr_id, SaHpiIdrAreaTypeT area_type, SaHpiEntryIdT *area_id); SaErrorT oa_soap_add_idr_area_by_id(void *oh_handler, SaHpiResourceIdT resource_id, SaHpiIdrIdT idr, SaHpiIdrAreaTypeT area_type, SaHpiEntryIdT area_id); SaErrorT oa_soap_del_idr_area(void *oh_handler, SaHpiResourceIdT resource_id, SaHpiIdrIdT idr_id, SaHpiEntryIdT area_id); SaErrorT oa_soap_get_idr_field(void *oh_handler, SaHpiResourceIdT resource_id, SaHpiIdrIdT idr_id, SaHpiEntryIdT area_id, SaHpiIdrFieldTypeT field_type, SaHpiEntryIdT field_id, SaHpiEntryIdT *next_field_id, SaHpiIdrFieldT *field); SaErrorT oa_soap_add_idr_field(void *oh_handler, SaHpiResourceIdT resource_id, SaHpiIdrIdT idr_id, SaHpiIdrFieldT *field); SaErrorT oa_soap_add_idr_field_by_id(void *oh_handler, SaHpiResourceIdT resource_id, SaHpiIdrIdT idr_id, SaHpiIdrFieldT *field); SaErrorT oa_soap_set_idr_field(void *oh_handler, SaHpiResourceIdT resource_id, SaHpiIdrIdT idr_id, SaHpiIdrFieldT *field); SaErrorT oa_soap_del_idr_field(void *oh_handler, SaHpiResourceIdT resource_id, SaHpiIdrIdT idr_id, SaHpiEntryIdT area_id, SaHpiEntryIdT field_id); SaErrorT build_enclosure_inv_rdr(struct oh_handler_state *oh_handler, struct enclosureInfo *response, SaHpiRdrT *rdr, struct oa_soap_inventory **pinv); SaErrorT build_oa_inv_rdr(struct oh_handler_state *oh_handler, struct oaInfo *response, SaHpiRdrT *rdr, struct oa_soap_inventory **pinv); SaErrorT build_server_inv_rdr(struct oh_handler_state *oh_handler, SOAP_CON *con, SaHpiInt32T bay_number, SaHpiRdrT *rdr, struct oa_soap_inventory **pinv); SaErrorT build_inserted_server_inv_rdr(struct oh_handler_state *oh_handler, SaHpiInt32T bay_number, SaHpiRdrT *rdr, struct oa_soap_inventory **inventory); SaErrorT build_server_inventory(struct bladeInfo *response, SaHpiRdrT *rdr, struct oa_soap_inventory **inventory); SaErrorT build_interconnect_inv_rdr(struct oh_handler_state *oh_handler, SOAP_CON *con, SaHpiInt32T bay_number, SaHpiRdrT *rdr, struct oa_soap_inventory **pinv); SaErrorT build_fan_inv_rdr(struct oh_handler_state *oh_handler, struct fanInfo *response, SaHpiRdrT *rdr, struct oa_soap_inventory **pinv); SaErrorT build_power_inv_rdr(struct oh_handler_state *oh_handler, struct powerSupplyInfo *response, SaHpiRdrT *rdr, struct oa_soap_inventory **pinv); SaErrorT build_server_inventory_area(SOAP_CON *con, struct bladeInfo *response, SaHpiRdrT *rdr, struct oa_soap_inventory **inventory); SaErrorT add_product_area(struct oa_soap_area **parea, char *name, char *manufacturer, SaHpiInt32T *success_flag); SaErrorT add_chassis_area(struct oa_soap_area **parea, char *part_number, char *serial_number, SaHpiInt32T *success_flag); SaErrorT add_board_area(struct oa_soap_area **parea, char *part_number, char *serial_number, SaHpiInt32T *success_flag); SaErrorT add_internal_area(struct oa_soap_area **parea, char *manufacturer, char *name, char *part_number, char *serial_number, SaHpiInt32T *success_flag); SaErrorT idr_area_add(struct oa_soap_area **area_ptr, SaHpiIdrAreaTypeT area_type, struct oa_soap_area **return_area); SaErrorT idr_area_add_by_id(struct oa_soap_area **head_area, SaHpiIdrAreaTypeT area_type, SaHpiEntryIdT area_id); SaErrorT idr_area_delete(struct oa_soap_area **area_ptr, SaHpiEntryIdT area_id); SaErrorT fetch_idr_area_header(struct oa_soap_inventory_info *inv_ptr, SaHpiEntryIdT area_id, SaHpiIdrAreaTypeT area_type, SaHpiIdrAreaHeaderT *area_header, SaHpiEntryIdT *next_area_id); SaErrorT idr_field_add(struct oa_soap_field **field_ptr, SaHpiIdrFieldT *field); SaErrorT idr_field_add_by_id(struct oa_soap_field **head_field, SaHpiEntryIdT area_id, SaHpiIdrFieldTypeT field_type, char *field_data, SaHpiEntryIdT field_id); SaErrorT idr_field_delete(struct oa_soap_field **field_ptr, SaHpiEntryIdT field_id); SaErrorT idr_field_update(struct oa_soap_field *field_ptr, SaHpiIdrFieldT *field); SaErrorT fetch_idr_field(struct oa_soap_inventory_info *inv_ptr, SaHpiEntryIdT area_id, SaHpiIdrFieldTypeT field_type, SaHpiEntryIdT field_id, SaHpiEntryIdT *next_field_id, SaHpiIdrFieldT *field); SaErrorT free_inventory_info(struct oh_handler_state *handler, SaHpiResourceIdT resource_id); SaErrorT oa_soap_build_fz_inv(struct oh_handler_state *oh_handler, SaHpiResourceIdT resource_id, struct fanZone *fan_zone); SaErrorT oa_soap_build_fan_inv(struct oh_handler_state *oh_handler, SaHpiResourceIdT resource_id, struct fanInfo *fan_info); SaErrorT oa_soap_build_lcd_inv(struct oh_handler_state *oh_handler, SaHpiResourceIdT resource_id); #endif openhpi-2.14.1/plugins/oa_soap/oa_soap_watchdog.h0000644000076400007640000000461511302566663016763 0ustar /* * Copyright (C) 2007-2008, Hewlett-Packard Development Company, LLP * All rights reserved. * * 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. * * Neither the name of the Hewlett-Packard Corporation, nor the names * of its contributors may be used to endorse or promote products * derived from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * Author(s) * Raghavendra M.S. */ #ifndef _OA_SOAP_WATCHDOG_H #define _OA_SOAP_WATCHDOG_H /* Include files */ #include #include SaErrorT oa_soap_get_watchdog_info(void *oh_handler, SaHpiResourceIdT resource_id, SaHpiWatchdogNumT num, SaHpiWatchdogT *wdt); SaErrorT oa_soap_set_watchdog_info(void *oh_handler, SaHpiResourceIdT resource_id, SaHpiWatchdogNumT num, SaHpiWatchdogT *wdt); SaErrorT oa_soap_reset_watchdog(void *oh_handler, SaHpiResourceIdT resource_id, SaHpiWatchdogNumT num); #endif openhpi-2.14.1/plugins/oa_soap/oa_soap_resources.h0000644000076400007640000001045111302566663017170 0ustar /* * Copyright (C) 2008, Hewlett-Packard Development Company, LLP * All rights reserved. * * 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. * * Neither the name of the Hewlett-Packard Corporation, nor the names * of its contributors may be used to endorse or promote products * derived from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * Author(s) * Raghavendra P.G. * Raghavendra M.S. */ #ifndef _OA_SOAP_RESOURCES_H #define _OA_SOAP_RESOURCES_H /* Include files */ #include #include "oa_soap_sensor.h" /* Maximum sensor classes in OA SOAP * * On adding a new sensor class in oa_soap_sensor.h, please change the maximum * sensor class value. Accordingly, add new sensor class support in global * sensor enum value mapping array and global sensor event assert state mapping * array in oa_soap_resources.c */ #define OA_SOAP_MAX_SEN_CLASS 14 /* Maximum sensor enum values in OA SOAP * * If a new sensor added in include/SaHpiOaSoap.h has more enum values, then * change the maximum enum. Accordingly, add new sensor enum values to global * sensor enum value mapping array and global sensor event assert state mapping * array in oa_soap_resources.c */ #define OA_SOAP_MAX_ENUM 21 /* Maximum sensor event array size * * Increase the event array size if a new sensor supports more number of sensor * event payload. Accordingly, increase the sensor_event arry in global sensor * array in oa_soap_resources.c */ #define OA_SOAP_MAX_SEN_EVT 4 /* Structure for storing the sensor RDR and event information */ struct oa_soap_sensor { SaHpiSensorRecT sensor; struct oa_soap_sensor_info sensor_info; SaHpiInt32T sensor_class; SaHpiEventT sen_evt[OA_SOAP_MAX_SEN_EVT]; const char *comment; }; /* Structure for storing the control RDR */ struct oa_soap_control { SaHpiCtrlRecT control; const char *comment; }; #define OA_SOAP_MAX_BLD_TYPE 16 /* Enum for possible cclass blade types */ enum oa_soap_blade_type { BL260C, BL2x220C, BL460C, BL465C, BL480C, BL495C, BL680C, BL685C, BL860C, BL870C, NB50000C, AMC, STORAGE, TAPE, SAN, OTHER_BLADE_TYPE, }; extern const SaHpiInt32T oa_soap_sen_val_map_arr[OA_SOAP_MAX_SEN_CLASS] [OA_SOAP_MAX_ENUM]; extern const SaHpiInt32T oa_soap_sen_assert_map_arr[OA_SOAP_MAX_SEN_CLASS] [OA_SOAP_MAX_ENUM]; extern const struct oa_soap_sensor oa_soap_sen_arr[]; extern const struct oa_soap_control oa_soap_cntrl_arr[]; extern const SaHpiRptEntryT oa_soap_rpt_arr[]; extern const struct oa_soap_inv_rdr oa_soap_inv_arr[]; extern const struct oa_soap_fz_map oa_soap_fz_map_arr[][OA_SOAP_MAX_FAN]; extern const char *oa_soap_health_arr[]; extern const char *oa_soap_diag_ex_arr[]; extern const char *oa_soap_thermal_sensor_string[]; extern const struct oa_soap_static_thermal_sensor_info oa_soap_static_thrm_sen_config[OA_SOAP_MAX_BLD_TYPE] [OA_SOAP_MAX_THRM_SEN]; extern const char *oa_soap_bld_type_str[]; extern const SaHpiInt32T oa_soap_bld_thrm_sen_base_arr[]; extern SaHpiPowerStateT oa_soap_bay_pwr_status[OA_SOAP_C7000_MAX_BLADE]; #endif openhpi-2.14.1/plugins/oa_soap/oa_soap.c0000644000076400007640000004734411302566663015104 0ustar /* * Copyright (C) 2007-2009, Hewlett-Packard Development Company, LLP * All rights reserved. * * 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. * * Neither the name of the Hewlett-Packard Corporation, nor the names * of its contributors may be used to endorse or promote products * derived from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * Author(s) * Raghavendra P.G. * Raghavendra M.S. * Raja Kumar Thatte * Sudesh Acharya * Vivek Kumar * Mohan Devarajulu * * This file implements the entry point of the oa soap plug-in. This handles * customer handler for oa soap interface for handling the any request for soap * interface. This APIs uses soap_open and soap_close APIs from soap interface * for initiating and closing the communication with SOAP interface / oa * * build_oa_soap_custom_handler() - Builds the OA SOAP custom handler * * oa_soap_open() - Opens the oa soap interface connection * for initiating communication with OA. * * oa_soap_close() - Closes the communication with OA. * * oa_soap_set_resource_tag() - Handles setting the tags to resources * * oa_soap_set_resource_severity() - Sets the resource's severity. * * oa_soap_control_parm() - Handles the control parameter handling * for setting and reading config data * from OA **/ #include "oa_soap.h" #include "oa_soap_utils.h" /* For maintaining the patch versions */ static char const rcsid[] __attribute__ ((used)) = "$Version: oa_soap plugin for openhpi-2.11.2, patch level 12. " "Created on May 16, 2008 $"; /** * build_oa_soap_custom_handler: * @oh_handler: Pointer to OpenHPI handler. * * Purpose: * Builds and initializes the OA SOAP custom handler. * * Detailed Description: * - If the plugin initialization fails, then this method will be called * more than once, until the plugin intialization succeeds. * - If the data field in the oh_handler is not NULL then we assume that * this call is done because of some issues with OA / switchover case * This case, we just re-assign the data into oa_handler * - In case of the data field in oh_handler is null, we are filling the * oa_handler information * - Using get_oa_info, we will get the OA information to initialize * SOAP_CON objects. * - Based on the OA info, active OA will be identified, even if user * specifies the same in the configuration file. * * Return values: * SA_OK - on sucess. * SA_ERR_HPI_INVALID_PARAMS - parameter(s) are NULL. * SA_ERR_HPI_OUT_OF_MEMORY - not enough memory to allocate. * SA_ERR_HPI_INTERNAL_ERROR - on failure **/ SaErrorT build_oa_soap_custom_handler(struct oh_handler_state *oh_handler) { SaErrorT rv = SA_OK; struct oa_soap_handler *oa_handler = NULL; if (oh_handler == NULL) { err("Invalid parmaters"); return SA_ERR_HPI_INVALID_PARAMS; } /* Check whether oa_soap_handler is initialized or not. * If the plugin initialization fails, then this method will be * called more than once. * * The below if statement is to avoid multiple initialization * of the oa_soap_handler. */ if (oh_handler->data == NULL) { /* Initialize the oa_soap_handler */ oa_handler = (struct oa_soap_handler *) g_malloc0(sizeof(struct oa_soap_handler)); if (oa_handler == NULL) { err("out of memory"); return SA_ERR_HPI_OUT_OF_MEMORY; } oa_handler->status = PRE_DISCOVERY; oa_handler->active_con = NULL; oa_handler->mutex = g_mutex_new(); oa_handler->oa_1 = NULL; oa_handler->oa_2 = NULL; oa_handler->oa_switching=SAHPI_FALSE; oa_handler->shutdown_event_thread = SAHPI_FALSE; /* Initialize the oa_info structure */ oa_handler->oa_1 = (struct oa_info *) g_malloc0(sizeof(struct oa_info)); if (oa_handler->oa_1 == NULL) { err("Out of memory"); g_free(oa_handler); return SA_ERR_HPI_OUT_OF_MEMORY; } oa_handler->oa_2 = (struct oa_info *) g_malloc0(sizeof(struct oa_info)); if (oa_handler->oa_2 == NULL) { err("Out of memory"); g_free(oa_handler->oa_1); g_free(oa_handler); return SA_ERR_HPI_OUT_OF_MEMORY; } /* Initialize the oa_1 structure */ oa_handler->oa_1->oa_status = OA_ABSENT; oa_handler->oa_1->hpi_con = NULL; oa_handler->oa_1->event_con = NULL; oa_handler->oa_1->event_con2 = NULL; oa_handler->oa_1->thread_handler = NULL; oa_handler->oa_1->mutex = g_mutex_new(); memset(oa_handler->oa_1->server, 0, MAX_URL_LEN); oa_handler->oa_1->oh_handler = oh_handler; /* Initialize the oa_2 structure */ oa_handler->oa_2->oa_status = OA_ABSENT; oa_handler->oa_2->hpi_con = NULL; oa_handler->oa_2->event_con = NULL; oa_handler->oa_2->event_con2 = NULL; oa_handler->oa_2->thread_handler = NULL; oa_handler->oa_2->mutex = g_mutex_new(); memset(oa_handler->oa_1->server, 0, MAX_URL_LEN); oa_handler->oa_2->oh_handler = oh_handler; /* Put the oa_handler in oh_handler */ oh_handler->data = oa_handler; } else { /* oa_soap_handler is already initialized * Get the oa_handler from oh_handler */ oa_handler = (struct oa_soap_handler *) oh_handler->data; } /* Get the OA information and intialize SOAP_CON structures */ rv = get_oa_soap_info(oh_handler); if (rv != SA_OK) { oa_handler->status = PLUGIN_NOT_INITIALIZED; err("Get OA SOAP info failed"); return rv; } /* Point the active_con to active OA's hpi_con object */ if (oa_handler->oa_1->oa_status == ACTIVE) oa_handler->active_con = oa_handler->oa_1->hpi_con; else if (oa_handler->oa_2->oa_status == ACTIVE) oa_handler->active_con = oa_handler->oa_2->hpi_con; else { /* Active OA is not accessible */ oa_handler->status = PLUGIN_NOT_INITIALIZED; err("Active OA is not reachable"); return SA_ERR_HPI_INTERNAL_ERROR; } return SA_OK; } /** * oa_soap_open: * @handler_config: Handler data pointer. * @handler_id: Id for the handler * @eventq: Pointer to the infrstructure event queue. * * Purpose: * This function opens OA SOAP plugin handler instance. * * Detailed Description: * - This function will be the entry point for the oa soap plug-in. * - We will check all configuration parameters. We won't validate the * content of the variables. We will check whether the parameters are * assigned or not. User can assign even the empty string into the * configuration file. * - Will assign handler_config, handler id and allocate memory for the RPT * table and cache. * - "build_oa_soap_custom_handler" will be called for initializing the * customer handler address into framework. * * Return values: * Plugin handle - on success. * NULL - on error. **/ void *oa_soap_open(GHashTable *handler_config, unsigned int handler_id, oh_evt_queue *eventq) { SaErrorT rv = SA_OK; struct oh_handler_state *handler = NULL; if (handler_config == NULL || handler_id == 0 || eventq == NULL) { err("Invalid parameters"); return NULL; } /* Check whether all the parameters are provided or not */ rv = check_config_parameters(handler_config); if (rv != SA_OK) { err("config file has some missing parameters"); return NULL; } /* Initialize the handler */ handler = (struct oh_handler_state *) g_malloc0(sizeof(struct oh_handler_state)); if (handler == NULL) { err("Out of memory"); return NULL; } handler->config = handler_config; handler->hid = handler_id; handler->eventq = eventq; handler->rptcache = (RPTable *) g_malloc0(sizeof(RPTable)); if (handler->rptcache == NULL) { g_free(handler); err("Out of memory"); return NULL; } rv = oh_init_rpt(handler->rptcache); if (rv != SA_OK) { err("Initializing rptcache failed"); g_free(handler->rptcache); g_free(handler); return NULL; } handler->data = NULL; /* Build the custom handler for OA SOAP plugin */ rv = build_oa_soap_custom_handler(handler); if (rv != SA_OK) { err("Build OA SOAP custom handler failed"); /* If the failure due to out of memory, return NULL * Else, try to build the oa_soap_handler during discovery call */ if (rv == SA_ERR_HPI_OUT_OF_MEMORY) { g_free(handler->rptcache); g_free(handler); return NULL; } } return ((void *)handler); } /** * oa_soap_close: * @oh_handler: Handler data pointer. * * Purpose: * This function closes OA SOAP plugin handler instance. * * Detailed Description: * - Releases all the memory allocated by OA SOAP plugin handler * - As per current framework implementation, this api won't be called * during process shutdown as there is no graceful shutdown implemented * as part of the openhpi framework. * * Return values: * NONE **/ void oa_soap_close(void *oh_handler) { struct oh_handler_state *handler = NULL; struct oa_soap_handler *oa_handler = NULL; if (oh_handler == NULL) { err("Invalid parameter"); return; } dbg("Shutting down the OA SOAP plugin"); handler = (struct oh_handler_state *) oh_handler; oa_handler = (struct oa_soap_handler *) handler->data; /* Check whether oa_handler is initialized or not */ if (oa_handler == NULL) return; /* Check whether the oa_1 or oa_2 is NULL * Ideally, if oa_handler is not NULL, oa_1 and oa_2 will not be NULL */ if (oa_handler->oa_1 == NULL || oa_handler->oa_2 == NULL) return; /* Set the event thread shutdown status to TRUE */ oa_handler->shutdown_event_thread = SAHPI_TRUE; /* Wait for the event threads to exit */ if (oa_handler->oa_1->thread_handler != NULL) g_thread_join(oa_handler->oa_1->thread_handler); if (oa_handler->oa_2->thread_handler != NULL) g_thread_join(oa_handler->oa_2->thread_handler); dbg("Stopped the OA SOAP event threads"); /* Cleanup the RPTable */ cleanup_plugin_rptable(handler); g_free(handler->rptcache); dbg("Cleaned the OA SOAP RPTable"); /* Release the mutexes. Check whether the mutex is unlocked or not. If * mutex is not unlocked by the event thread, then g_mutex_free will * crash */ if (oa_handler->mutex != NULL) { if (g_mutex_trylock(oa_handler->mutex) == FALSE) { err("Mutex in OA handler is not unlocked by the event" " thread"); err("Mutex in OA handler is not released"); } else { g_mutex_unlock(oa_handler->mutex); g_mutex_free(oa_handler->mutex); } } if (oa_handler->oa_1->mutex != NULL) { if (g_mutex_trylock(oa_handler->oa_1->mutex) == FALSE) { err("Mutex in oa_1 is not unlocked by the event" " thread"); err("Mutex in oa_1 is not released"); } else { g_mutex_unlock(oa_handler->oa_1->mutex); g_mutex_free(oa_handler->oa_1->mutex); } } if (oa_handler->oa_2->mutex != NULL) { if (g_mutex_trylock(oa_handler->oa_2->mutex) == FALSE) { err("Mutex in oa_2 is not unlocked by the event" " thread"); err("Mutex in oa_2 is not released"); } else { g_mutex_unlock(oa_handler->oa_2->mutex); g_mutex_free(oa_handler->oa_2->mutex); } } dbg("Released the OA SOAP handler mutexes"); /* Cleanup the SOAP_CON */ if (oa_handler->oa_1->hpi_con != NULL) soap_close(oa_handler->oa_1->hpi_con); if (oa_handler->oa_1->event_con != NULL) soap_close(oa_handler->oa_1->event_con); if (oa_handler->oa_1->event_con2 != NULL) soap_close(oa_handler->oa_1->event_con2); if (oa_handler->oa_2->hpi_con != NULL) soap_close(oa_handler->oa_2->hpi_con); if (oa_handler->oa_2->event_con != NULL) soap_close(oa_handler->oa_2->event_con); if (oa_handler->oa_2->event_con2 != NULL) soap_close(oa_handler->oa_2->event_con2); dbg("Released the SOAP CON structures from handler"); /* Release the oa info structure */ g_free(oa_handler->oa_1); g_free(oa_handler->oa_2); dbg("Released the oa_info structures from handler"); /* Release the oa handler structure */ g_free(oa_handler); g_free(handler); dbg("Released the OA SOAP handler"); return; } /** * oa_soap_set_resource_tag: * @oh_handler: Pointer to openhpi handler. * @resource_id: Resource Id. * @tag: Pointer to new tag. * * Purpose: * Sets resource's tag. * * Detailed Description: NA * * Return values: * SA_OK - on success. * SA_ERR_HPI_INVALID_PARAMS - parameter(s) are NULL @tag is invalid. * SA_ERR_HPI_NOT_PRESENT - resource does not exist. **/ SaErrorT oa_soap_set_resource_tag(void *oh_handler, SaHpiResourceIdT resource_id, SaHpiTextBufferT *tag) { SaErrorT rv = SA_OK; struct oh_handler_state *handler; SaHpiRptEntryT *rpt = NULL; SaHpiBoolT valid_tag = SAHPI_TRUE; if (tag == NULL || oh_handler == NULL) { err("Invalid parameters"); return SA_ERR_HPI_INVALID_PARAMS; } /* Validate the tag */ valid_tag = oh_valid_textbuffer(tag); if (valid_tag == SAHPI_FALSE) { err("The tag is not correct format"); return SA_ERR_HPI_INVALID_PARAMS; } handler =(struct oh_handler_state *) oh_handler; rpt = oh_get_resource_by_id(handler->rptcache, resource_id); if (rpt == NULL) { err("Invalid resource id"); return SA_ERR_HPI_NOT_PRESENT; } /* Copy the tag to the resource tag */ rv = oh_copy_textbuffer(&(rpt->ResourceTag), tag); if (rv != SA_OK) { err("Copying textbuffer failed"); return rv; } return SA_OK; } /** * oa_soap_set_resource_severity: * @oh_handler: Handler data pointer. * @id: Resource Id. * @severity: Resource severity. * * Purpose: * Sets severity of the resource. * * Detailed Description: NA * * Return values: * SA_OK - on success. * SA_ERR_HPI_INVALID_PARAMS - on invalid parameters. * SA_ERR_HPI_NOT_PRESENT - resource does not exist. **/ SaErrorT oa_soap_set_resource_severity(void *oh_handler, SaHpiResourceIdT resource_id, SaHpiSeverityT severity) { struct oh_handler_state *handler; SaHpiRptEntryT *rpt = NULL; if (oh_handler == NULL) { err("Invalid parameters"); return SA_ERR_HPI_INVALID_PARAMS; } /* Validate the severity */ if (oh_lookup_severity(severity) == NULL) { err("Invalid parameter"); return SA_ERR_HPI_INVALID_PARAMS; } handler = (struct oh_handler_state *) oh_handler; rpt = oh_get_resource_by_id(handler->rptcache, resource_id); if (rpt == NULL) { err("Not able to find the resource. Invalid resource id"); return SA_ERR_HPI_NOT_PRESENT; } rpt->ResourceSeverity = severity; return SA_OK; } /** * oa_soap_control_parm: * @oh_handler: Pointer to openhpi handler. * @resource_id: Resource Id. * @action: Configuration action. * * Purpose: * Save and restore saved configuration parameters. * * Detailed Description: NA * * Return values: * SA_ERR_HPI_UNSUPPORTED_API - current oa_soap implementation does not * support this API. **/ SaErrorT oa_soap_control_parm(void *oh_handler, SaHpiResourceIdT resource_id, SaHpiParmActionT action) { err("oa_soap control parm is not supported"); return SA_ERR_HPI_UNSUPPORTED_API; } void * oh_open (GHashTable *, unsigned int, oh_evt_queue *) __attribute__ ((weak, alias("oa_soap_open"))); void * oh_close (void *) __attribute__ ((weak, alias("oa_soap_close"))); void * oh_set_resource_tag (void *, SaHpiResourceIdT, SaHpiTextBufferT *) __attribute__ ((weak, alias("oa_soap_set_resource_tag"))); void * oh_set_resource_severity (void *, SaHpiResourceIdT, SaHpiSeverityT) __attribute__ ((weak, alias("oa_soap_set_resource_severity"))); void * oh_control_parm (void *, SaHpiResourceIdT, SaHpiParmActionT) __attribute__ ((weak, alias("oa_soap_control_parm"))); openhpi-2.14.1/plugins/oa_soap/oa_soap_oa_event.c0000644000076400007640000004450111302566663016754 0ustar /* * Copyright (C) 2007-2009, Hewlett-Packard Development Company, LLP * All rights reserved. * * 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. * * Neither the name of the Hewlett-Packard Corporation, nor the names * of its contributors may be used to endorse or promote products * derived from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * Author(s) * Raghavendra P.G. * Mohan Devarajulu * * This file has the OA related events handling * * process_oa_extraction_event() - Processes the OA extraction event * * process_oa_failover_event() - Processes the OA failover event * points the active_con filed of * oa_handler to currently active OA * Starts the re-discovery to sync up * with current status of the system * * process_oa_info_event() - Processes the OA info event * If OA info event is just after OA * insertion event, then it processed. * Else, it is ignored * * oa_soap_proc_oa_status() - Porcesses the OA status event * * oa_soap_proc_oa_network_info() - Processes the OA network info event * */ #include "oa_soap_oa_event.h" /** * process_oa_extraction_event * @oh_handler: Pointer to openhpi handler structure * @oa_event: Pointer to oa event response structure * * Purpose: * Gets the OA extraction event. * Removes OA information from RPT and RDR table * Creates the hot swap event * * Detailed Description: NA * * Return values: * SA_OK - on success. * SA_ERR_HPI_INVALID_PARAMS - on wrong parameters. * SA_ERR_HPI_INTERNAL_ERROR - on failure **/ SaErrorT process_oa_extraction_event(struct oh_handler_state *oh_handler, struct eventInfo *oa_event) { SaErrorT rv = SA_OK; SaHpiInt32T bay_number; if (oh_handler == NULL || oa_event == NULL) { err("Invalid parameters"); return SA_ERR_HPI_INVALID_PARAMS; } /* The OA is sending the wrong bay_number for the removed OA * Hence if the bay number in the oa_event is 1, * process the event for bay number 2, or vice versa * TODO: Remove this workaround when the fix is made to OA firmware */ switch (oa_event->eventData.oaStatus.bayNumber) { case 1: bay_number = 2; break; case 2: bay_number = 1; break; default: err("Wrong OA bay number %d detected", oa_event->eventData.oaStatus.bayNumber); return SA_ERR_HPI_INTERNAL_ERROR; } rv = remove_oa(oh_handler, bay_number); if (rv != SA_OK) { err("Remove OA has failed"); return rv; } return SA_OK; } /** * process_oa_failover_event * @oh_handler: Pointer to openhpi handler structure * @oa: Pointer to the OA structure * * Purpose: * Gets the OA Failover event. * Waits till the OA Transition Complete event is recieved from OA * Gets the OA status of the other OA and updates the other OA data * structure * * Detailed Description: * - If the OA failover event is recieved just after the discovery on * active OA, then the OA failoer event will be ignored * - The active_con field of oa_handler is pointed to current active OA * - Till OA_TRANSITION_COMPLETE event is recieved or maximum 90 seconds, * all the events are ignored * - OA needs some time to stabilize, after getting the OA failover event, * plug-in starts checking for events after 90 seconds * - Since there are high chances for missing the information of changes * in the resources, re-discovery will be done before start listening * for events. * * Return values: * SA_OK - on success. * SA_ERR_HPI_INVALID_PARAMS - on wrong parameters. * SA_ERR_HPI_INTERNAL_ERROR - on failure **/ SaErrorT process_oa_failover_event(struct oh_handler_state *oh_handler, struct oa_info *oa) { SaErrorT rv = SA_OK; SaHpiBoolT is_transition_complete = SAHPI_FALSE; SaHpiInt32T sleep_time = 0; struct oa_soap_handler *oa_handler = NULL; struct getAllEvents request; struct getAllEventsResponse response; struct eventInfo event; GTimer *timer = NULL; gulong micro_seconds; gdouble time_elapsed = 0; int is_switchover = SAHPI_TRUE; if (oh_handler == NULL || oa == NULL) { err("Invalid parameters"); return SA_ERR_HPI_INVALID_PARAMS; } /* If the switchover happens during discovery, * then, we will get failover event on Active OA * Discovery error recovery mechanism has handled the switchover. * Hence, ignore the failover event */ if (oa->oa_status == ACTIVE) { dbg("OA failover event is recieved in active OA"); dbg("Ignoring the OA failover event"); return SA_OK; } err("OA switching started"); oa_handler = (struct oa_soap_handler *) oh_handler->data; oa_handler->oa_switching=SAHPI_TRUE; /* Always lock the oa_handler mutex and then oa_info mutex * This is to avoid the deadlock */ g_mutex_lock(oa_handler->mutex); g_mutex_lock(oa->mutex); /* Point the active_con to the current active OA's hpi_con */ oa_handler->active_con = oa->hpi_con; /* This OA has become ACTIVE from STANDBY */ oa->oa_status = ACTIVE; g_mutex_unlock(oa->mutex); /* Set the other OA status as STANDBY. If the other OA is extracted, * then the other OA status will be set to ABSENT during re-discovery. */ if (oa_handler->oa_1 == oa) { g_mutex_lock(oa_handler->oa_2->mutex); oa_handler->oa_2->oa_status = STANDBY; g_mutex_unlock(oa_handler->oa_2->mutex); } else { g_mutex_lock(oa_handler->oa_1->mutex); oa_handler->oa_1->oa_status = STANDBY; g_mutex_unlock(oa_handler->oa_1->mutex); } request.pid = oa->event_pid; request.waitTilEventHappens = HPOA_TRUE; request.lcdEvents = HPOA_FALSE; /* Start the timer */ timer = g_timer_new(); /* Loop through till the TRANSITION_COMPLETE event is recieved * Or OA stabilization (90 seconds) time has reached */ while (is_transition_complete != SAHPI_TRUE && time_elapsed < OA_STABILIZE_MAX_TIME) { OA_SOAP_CHEK_SHUTDOWN_REQ(oa_handler, oa_handler->mutex, NULL, timer); g_mutex_lock(oa->mutex); rv = soap_getAllEvents(oa->event_con, &request, &response); g_mutex_unlock(oa->mutex); if (rv != SOAP_OK) { err("Get all events failed during OA switchover" "processing for OA %s", oa->server); /* Unlock the oa_handler mutex*/ g_mutex_unlock(oa_handler->mutex); /* Cleanup the timer */ g_timer_destroy(timer); /* May be OA is out of network or * consecutive switch over has happened * Try to recover from the problem */ oa_soap_error_handling(oh_handler, oa); /* Re-discovery is done in error handling * hence return success */ return SA_OK; } /* OA returns empty event response payload for LCD status * change events. Ignore empty event response. */ if (response.eventInfoArray == NULL) { dbg("Ignoring empty event response"); time_elapsed = g_timer_elapsed(timer, µ_seconds); continue; } /* Check for transition complete event */ while (response.eventInfoArray) { OA_SOAP_CHEK_SHUTDOWN_REQ(oa_handler, oa_handler->mutex, NULL, timer); soap_getEventInfo(response.eventInfoArray, &event); if (event.event == EVENT_OA_TRANSITION_COMPLETE) { is_transition_complete = SAHPI_TRUE; break; } response.eventInfoArray = soap_next_node(response.eventInfoArray); } /* Get the time (in seconds) since the timer has been started */ time_elapsed = g_timer_elapsed(timer, µ_seconds); } /* Unlock the oa_handler mutex */ g_mutex_unlock(oa_handler->mutex); /* Get the time (in seconds) since the timer has been started */ time_elapsed = g_timer_elapsed(timer, µ_seconds); g_timer_destroy(timer); /* OA requires some time to Stabilize. Wait for max 90 seconds */ sleep_time = OA_STABILIZE_MAX_TIME - time_elapsed; dbg("Sleeping for %d seconds", sleep_time); if (sleep_time > 0) { sleep(sleep_time); } OA_SOAP_CHEK_SHUTDOWN_REQ(oa_handler, NULL, NULL, NULL); /* Check the OA staus there may be change in OA state */ rv = check_oa_status(oa_handler, oa, oa->event_con); if (rv != SA_OK) { err("Check OA staus failed for OA %s", oa->server); oa_soap_error_handling(oh_handler, oa); /* Re-discovery is done in error handling hence * return success */ return SA_OK; } /* Check the OA status, if it is not ACTIVE (switchover might have * happened while waiting for OA stabilization) * Return without doing re-discovery */ g_mutex_lock(oa->mutex); if (oa->oa_status != ACTIVE) { g_mutex_unlock(oa->mutex); oa_handler->oa_switching=SAHPI_FALSE; err("OA status already changed. OA switching completed"); return SA_OK; } g_mutex_unlock(oa->mutex); g_mutex_lock(oa_handler->mutex); g_mutex_lock(oa->mutex); /* Call getAllEvents to flush the OA event queue * Any resource state change will be handled as part of the re-discovery */ rv = soap_getAllEvents(oa->event_con, &request, &response); /* Re-discover the resources as there is a high chances * that we might have missed some events */ OA_SOAP_CHEK_SHUTDOWN_REQ(oa_handler, oa_handler->mutex, oa->mutex, NULL); rv = oa_soap_re_discover_resources(oh_handler, oa, is_switchover); g_mutex_unlock(oa->mutex); g_mutex_unlock(oa_handler->mutex); /* At this point assume that switchover is complete */ oa_handler->oa_switching=SAHPI_FALSE; err("OA switching completed"); if (rv != SA_OK) { err("Re-discovery failed for OA %s", oa->server); oa_soap_error_handling(oh_handler, oa); } return SA_OK; } /** * process_oa_info_event * @oh_handler: Pointer to openhpi handler structure * @con: Pointer to SOAP_CON structure * @oa_event: Pointer to the OA event structure * * Purpose: * Gets the OA Info event. * Adds the newly inserted OA information into RPT and RDR table * Creates the hot swap event * * Detailed Description: * - If the OA_INFO event is recived after the OA insertion event, * then it is processed, else it is ignored * - The OA_INFO event (after the OA insertion event) indicates * the stabilization of OA. * - When OA insertion event recieved, OA will not be stabilized * On recieving this event, ACTIVE hot swap event will be generated * * Return values: * SA_OK - on success. * SA_ERR_HPI_INVALID_PARAMS - on wrong parameters. * SA_ERR_HPI_INTERNAL_ERROR - on failure **/ SaErrorT process_oa_info_event(struct oh_handler_state *oh_handler, SOAP_CON *con, struct eventInfo *oa_event) { SaErrorT rv = SA_OK; SaHpiInt32T bay_number; struct oa_soap_handler *oa_handler = NULL; if (oh_handler == NULL || con == NULL || oa_event == NULL) { err("Invalid parameters"); return SA_ERR_HPI_INVALID_PARAMS; } oa_handler = (struct oa_soap_handler *) oh_handler->data; bay_number = oa_event->eventData.oaInfo.bayNumber; if (oa_handler->oa_soap_resources.oa.presence[bay_number - 1] == RES_PRESENT) { dbg("OA is present. Ignore event"); return SA_OK; } rv = add_oa(oh_handler, con, bay_number); if (rv != SA_OK) { err("Failed to add the newly-discovered OA"); } return rv; } /** * oa_soap_proc_oa_status * @oh_handler : Pointer to openhpi handler structure * @status : Pointer to the OA status structure * * Purpose: * Processes the OA status event and generates the HPI sensor event. * * Detailed Description: * NA * * Return values: * NONE **/ void oa_soap_proc_oa_status(struct oh_handler_state *oh_handler, struct oaStatus *status) { SaErrorT rv = SA_OK; SaHpiInt32T bay_number; struct oa_soap_handler *oa_handler = NULL; SaHpiResourceIdT resource_id; enum diagnosticStatus diag_ex_status[OA_SOAP_MAX_DIAG_EX]; if (oh_handler == NULL || status == NULL) { err("Invalid parameters"); return; } oa_handler = (struct oa_soap_handler *) oh_handler->data; bay_number = status->bayNumber; resource_id = oa_handler->oa_soap_resources.oa.resource_id[bay_number - 1]; /* Process the operational status sensor */ OA_SOAP_PROCESS_SENSOR_EVENT(OA_SOAP_SEN_OPER_STATUS, status->operationalStatus, 0, 0) /* Process the predictive failure status sensor */ OA_SOAP_PROCESS_SENSOR_EVENT(OA_SOAP_SEN_PRED_FAIL, status->operationalStatus, 0, 0) /* Process the OA redundancy sensor */ OA_SOAP_PROCESS_SENSOR_EVENT(OA_SOAP_SEN_OA_REDUND, status->oaRedundancy, 0, 0) /* Process the internal data error sensor */ OA_SOAP_PROCESS_SENSOR_EVENT(OA_SOAP_SEN_INT_DATA_ERR, status->diagnosticChecks.internalDataError, 0, 0) /* Process the management processor error sensor */ OA_SOAP_PROCESS_SENSOR_EVENT(OA_SOAP_SEN_MP_ERR, status->diagnosticChecks. managementProcessorError, 0, 0) /* Process the device failure sensor */ OA_SOAP_PROCESS_SENSOR_EVENT(OA_SOAP_SEN_DEV_FAIL, status->diagnosticChecks.deviceFailure, 0, 0) /* Process the device degraded sensor */ OA_SOAP_PROCESS_SENSOR_EVENT(OA_SOAP_SEN_DEV_DEGRAD, status->diagnosticChecks.deviceDegraded, 0, 0) /* Process the redundancy error sensor */ OA_SOAP_PROCESS_SENSOR_EVENT(OA_SOAP_SEN_REDUND_ERR, status->diagnosticChecks.redundancy, 0, 0) oa_soap_parse_diag_ex(status->diagnosticChecksEx, diag_ex_status); /* Process the firmware mismatch sensor */ OA_SOAP_PROCESS_SENSOR_EVENT(OA_SOAP_SEN_FW_MISMATCH, diag_ex_status[DIAG_EX_FW_MISMATCH], 0, 0); /* Process the device not supported sensor */ OA_SOAP_PROCESS_SENSOR_EVENT(OA_SOAP_SEN_DEV_NOT_SUPPORT, diag_ex_status[DIAG_EX_DEV_NOT_SUPPORT], 0, 0); return; } /** * oa_soap_proc_oa_network_info * @oh_handler : Pointer to openhpi handler structure * @nw_info : Pointer to the OA network info structure * * Purpose: * Processes the OA network info event and generates the HPI sensor event. * * Detailed Description: * NA * * Return values: * NONE **/ void oa_soap_proc_oa_network_info(struct oh_handler_state *oh_handler, struct oaNetworkInfo *nw_info) { SaErrorT rv = SA_OK; SaHpiInt32T bay_number; struct oa_soap_handler *oa_handler = NULL; SaHpiResourceIdT resource_id; if (oh_handler == NULL || nw_info == NULL) { err("Invalid parameters"); return; } oa_handler = (struct oa_soap_handler *) oh_handler->data; bay_number = nw_info->bayNumber; resource_id = oa_handler->oa_soap_resources.oa.resource_id[bay_number - 1]; /* Process the OA link status sensor */ OA_SOAP_PROCESS_SENSOR_EVENT(OA_SOAP_SEN_OA_LINK_STATUS, nw_info->linkActive, 0, 0) return; } openhpi-2.14.1/plugins/oa_soap/oa_soap_fan_event.h0000644000076400007640000000463611302566663017133 0ustar /* * Copyright (C) 2007-2008, Hewlett-Packard Development Company, LLP * All rights reserved. * * 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. * * Neither the name of the Hewlett-Packard Corporation, nor the names * of its contributors may be used to endorse or promote products * derived from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * Author(s) * Raghavendra P.G. */ #ifndef _OA_SOAP_FAN_EVENT_H #define _OA_SOAP_FAN_EVENT_H /* Include files */ #include "oa_soap_re_discover.h" SaErrorT process_fan_insertion_event(struct oh_handler_state *oh_handler, SOAP_CON *con, struct eventInfo *oa_event); SaErrorT process_fan_extraction_event(struct oh_handler_state *oh_handler, struct eventInfo *oa_event); void oa_soap_proc_therm_subsys_info(struct oh_handler_state *oh_handler, struct thermalSubsystemInfo *info); void oa_soap_proc_fz_status(struct oh_handler_state *oh_handler, struct fanZone *fanZone); void oa_soap_proc_fan_status(struct oh_handler_state *oh_handler, struct fanInfo *info); #endif openhpi-2.14.1/plugins/oa_soap/oa_soap_utils.c0000644000076400007640000015345311302566663016323 0ustar /* * Copyright (C) 2007-2009, Hewlett-Packard Development Company, LLP * All rights reserved. * * 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. * * Neither the name of the Hewlett-Packard Corporation, nor the names * of its contributors may be used to endorse or promote products * derived from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * Author(s) * Raghavendra P.G. * Vivek Kumar * Shuah Khan * Mohan Devarajulu * * This file implements all the utility functions which will be useful of oa * soap functioning. Majority of the functions are helper functions for * different modules. * * get_oa_soap_info() - Get active and stand by oa information * including IP address * * get_oa_state() - Get the both oa states and initializes * the SOAP_CON objects * * update_hotswap_event() - Updates the Hotswap event structure * * copy_oa_soap_event() - Copies the event data from the event * received from oa into the * allocated event structure * * push_event_to_queue() - Pushes events into the infrastructure * event queue * * del_rdr_from_event() - Delete RDRs from rdrlist of the * event structure * * check_oa_status() - Check the oa status and update the oa * handler with active OA SOAP_CON * * check_oa_user_permissions() - Check the OA with user permissions * level and makes sure plug-in can * access all the resources using the * supplied user credentials in the * conf file * * check_discovery_failure() - Checks reason for discovery failure * If the failure is due to 'insufficient * priveleges' then creates the fresh * oa session * * lock_oa_soap_handler() - Tries to lock the oa_handler mutex. * If mutex is already locked earlier, * returns error * * check_config_parameters() - Checks whether all the parameters are * present in the config file * * create_event_session() - Creates a event session with OA * * create_oa_connection() - Create OA connection after closing the * earlier soap_con structures * * initialize_oa_con() - Initialize the hpi_con and event_con * * delete_all_inventory_info() - Frees the memory allocated for * inventory areas for all the resources * * cleanup_plugin_rptable() - Frees the memory allocated for * plugin RPTable * * release_oa_soap_resources() - Frees the memory allocated for * resources presence matrix and serial * number array * * get_oa_fw_version() - Gets the Active OA firmware version * * update_oa_info() - Updates the RPT entry with OA * firmware version. Updates the serial * number array with OA serial number. * * convert_lower_to_upper - Converts the lower case to upper case * **/ #include "oa_soap_utils.h" /** * get_oa_soap_info * @oh_handler: Pointer to the openhpi handler * * Purpose: * Gets the Active/standby OA hostname/IP address from the config file * and calls the get_oa_info fucntion * * Detailed Description: * - Will take the active oa ip from configuration file and will check the * oa state. If active oa is not accessible, we would try the standby oa * - Same above operation will be repeated for the standby oa. If standby * oa is also not accessible, then return error * - Checks whether OA hostname/IP address is not empty string * * Return values: * SA_OK - on success. * SA_ERR_HPI_INVALID_PARAMS - if wrong parameters passed * SA_ERR_HPI_INTERNAL_ERROR - on failure. **/ SaErrorT get_oa_soap_info(struct oh_handler_state *oh_handler) { SaErrorT rv = SA_OK; SaHpiInt32T len = 0; char *server = NULL; if (oh_handler == NULL) { err("Invalid parameters"); return SA_ERR_HPI_INVALID_PARAMS; } /* Get the Active OA hostname/IP address and check whether it is NULL */ server = (char *) g_hash_table_lookup(oh_handler->config, "ACTIVE_OA"); /* Check whether server string is not empty */ len = strlen(server); if (len != 0) { /* Get the OA states and initialize the SOAP_CON structures */ rv = get_oa_state(oh_handler, server); if (rv == SA_OK) return SA_OK; } else { err("ACTIVE_OA is not provided by the user"); } /* May be user has supplied wrong hostname/IP address * or OA is not reachable. Ignore and try with standby OA * Get the Standby OA hostname/IP address and check whether it is NULL */ server = (char *) g_hash_table_lookup(oh_handler->config, "STANDBY_OA"); if (server == NULL) { err("STANDBY_OA entry is not present in conf file"); return SA_ERR_HPI_INTERNAL_ERROR; } /* Check whether server string is not empty */ len = strlen(server); if (len == 0) { err("STANDBY_OA is not provided by the user"); return SA_ERR_HPI_INTERNAL_ERROR; } /* Get the OA states and initialize the SOAP_CON structures */ rv = get_oa_state(oh_handler, server); if (rv != SA_OK) { err("Standby OA - %s may not be accessible", server); return SA_ERR_HPI_INTERNAL_ERROR; } return SA_OK; } /** * get_oa_state * @oa_handler: Pointer to OA SOAP handler structure * @server: Pointer to hostname/IP address of the OA * * Purpose: * Gets the details of active and standby OA * * Detailed Description: * - Initializes the SOAP_CON structures * - Using the supplied user credentials from config file, soap connection * is made using soap_open api for both hpi and events receiving * - Will check the user permission on OA using check_user_permission api * - Will get the oa information. Using these info, this api will decide * which oa is active and which one is standby * * Return values: * SA_OK - on success. * SA_ERR_HPI_INVALID_PARAMS - on wrong parameters * SA_ERR_HPI_INTERNAL_ERROR - on failure. **/ SaErrorT get_oa_state(struct oh_handler_state *oh_handler, char *server) { SaErrorT rv = SA_OK; struct oa_soap_handler *oa_handler = NULL; struct getOaStatus status; struct oaStatus status_response; struct getOaInfo info; struct oaInfo info_response; struct getOaNetworkInfo network_info; struct oaNetworkInfo network_info_response; enum oaRole oa_role; char active_ip[MAX_URL_LEN], standby_ip[MAX_URL_LEN], url[MAX_URL_LEN]; char active_fm[MAX_BUF_SIZE], standby_fm[MAX_BUF_SIZE]; char firmware[MAX_BUF_SIZE]; char *user_name = NULL, *password = NULL; SaHpiInt32T i, bay = 0, active_bay = 0, standby_bay = 0; SOAP_CON *hpi_con = NULL, *event_con = NULL; struct oa_info *this_oa = NULL, *other_oa = NULL; if (oh_handler == NULL|| server == NULL) { err("Invalid parameters"); return SA_ERR_HPI_INVALID_PARAMS; } oa_handler = (struct oa_soap_handler *) oh_handler->data; /* Create the OA URL */ memset(url, 0, MAX_URL_LEN); snprintf(url, strlen(server) + strlen(PORT) + 1, "%s" PORT, server); /* Get the user_name and password from config file */ user_name = (char *) g_hash_table_lookup(oh_handler->config, "OA_User_Name"); password = (char *) g_hash_table_lookup(oh_handler->config, "OA_Password"); /* Estabish the connection with OA */ hpi_con = soap_open(url, user_name, password, HPI_CALL_TIMEOUT); if (hpi_con == NULL) { err("hpi_con intialization for OA - %s has failed", server); return SA_ERR_HPI_INTERNAL_ERROR; } event_con = soap_open(url, user_name, password, EVENT_CALL_TIMEOUT); if (event_con == NULL) { err("event_con intialization for OA - %s has failed", server); soap_close(hpi_con); return SA_ERR_HPI_INTERNAL_ERROR; } /* Check whether user_name has admin rights */ rv = check_oa_user_permissions(oa_handler, hpi_con, user_name); if (rv != SA_OK) { soap_close(hpi_con); soap_close(event_con); return rv; } /* Get the 2 OAs information */ for (i = 1; i <= MAX_OA_BAYS; i++) { status.bayNumber = i; rv = soap_getOaStatus(hpi_con, &status, &status_response); if (rv != SOAP_OK) { err("Get OA status failed"); soap_close(hpi_con); soap_close(event_con); return SA_ERR_HPI_INTERNAL_ERROR; } oa_role = status_response.oaRole; /* Sometimes, if the OA is absent, then OA status is shown as * STANDBY in getOaStatus response. As workaround, if OA * status is STANDBY and oaRedudancy state is set to false, * then, it is considered as ABSENT. * * But, if the OA is recently inserted, then oaRedudancy state * will be set to false. In this scenario, the OA state will * be wrongly considered as ABSENT. This is a known limitation. * TODO: Remove this workaround once the fix is available in * OA firmware. */ if ((oa_role == OA_ABSENT) || (oa_role == STANDBY && status_response.oaRedundancy == HPOA_FALSE)) continue; info.bayNumber = i; rv = soap_getOaInfo(hpi_con, &info, &info_response); if (rv != SOAP_OK) { err("Get OA info failed"); soap_close(hpi_con); soap_close(event_con); return SA_ERR_HPI_INTERNAL_ERROR; } /* 'youAreHere' true indicates that we are talking to this OA. * This helps to find the bay number of the active and standby * OA. */ if (info_response.youAreHere == HPOA_TRUE) { bay = i; /* Find the oa_info structure for this OA (to which we * are talking to) and the other OA. */ switch (bay) { case 1: this_oa = oa_handler->oa_1; other_oa = oa_handler->oa_2; break; case 2: this_oa = oa_handler->oa_2; other_oa = oa_handler->oa_1; break; } } /* Store the firmware version. * Firmware version is not used. * We may require when we support multiple OA firmwares. */ memset(firmware, 0, MAX_BUF_SIZE); strncpy(firmware, info_response.fwVersion, strlen(info_response.fwVersion)); network_info.bayNumber = i; rv = soap_getOaNetworkInfo(hpi_con, &network_info, &network_info_response); if (rv != SOAP_OK) { err("Get OA network info failed"); soap_close(hpi_con); soap_close(event_con); return SA_ERR_HPI_INTERNAL_ERROR; } /* Find the active and standby bay number, IP address * and firmware version */ switch (oa_role) { case ACTIVE: active_bay = i; memset(active_ip, 0, MAX_URL_LEN); strncpy(active_ip, network_info_response.ipAddress, strlen(network_info_response. ipAddress)); memset(active_fm, 0, MAX_BUF_SIZE); strncpy(active_fm, firmware, strlen(firmware)); break; case STANDBY: standby_bay = i; memset(standby_ip, 0, MAX_URL_LEN); strncpy(standby_ip, network_info_response.ipAddress, strlen(network_info_response. ipAddress)); memset(standby_fm, 0, MAX_BUF_SIZE); strncpy(standby_fm, firmware, strlen(firmware)); break; default: err("wrong oa state detected for bay %d", i); soap_close(hpi_con); soap_close(event_con); return SA_ERR_HPI_INTERNAL_ERROR; } } if (active_bay != 0) { dbg("\tActive OA bay number - %d", active_bay); dbg("\tActive OA ip address - %s", active_ip); dbg("\tActive OA firmware version - %s", active_fm); } if (standby_bay != 0) { dbg("\tStandby OA bay number - %d", standby_bay); dbg("\tStandby OA ip address - %s", standby_ip); dbg("\tStandby OA firmware version - %s", standby_fm); } /* Get the status and firmware version of the OA which we are * talking to */ if (bay == active_bay) { this_oa->oa_status = ACTIVE; this_oa->fm_version = atof(active_fm); } else { /* bay == standby_bay */ this_oa->oa_status = STANDBY; this_oa->fm_version = atof(standby_fm); } /* Initialize the hpi_con and event_con structures */ this_oa->hpi_con = hpi_con; this_oa->event_con = event_con; memset(this_oa->server, 0, MAX_URL_LEN); strncpy(this_oa->server, server, strlen(server)); /* Check whether 2 OAs are present or not */ if (active_bay == 0 || standby_bay == 0) return SA_OK; memset(url, 0, MAX_URL_LEN); memset(other_oa->server, 0, MAX_URL_LEN); /* Construct the other OA url and copy the IP address to oa_info * structure */ if (bay == standby_bay) { other_oa->oa_status = ACTIVE; other_oa->fm_version = atof(active_fm); strncpy(other_oa->server, active_ip, strlen(active_ip)); snprintf(url, strlen(active_ip) + strlen(PORT) + 1, "%s" PORT, active_ip); } else { other_oa->oa_status = STANDBY; other_oa->fm_version = atof(standby_fm); strncpy(other_oa->server, standby_ip, strlen(standby_ip)); snprintf(url, strlen(standby_ip) + strlen(PORT) + 1, "%s" PORT, standby_ip); } /* Initialize the soap_con for hpi and event thread */ other_oa->hpi_con = soap_open(url, user_name, password, HPI_CALL_TIMEOUT); if (other_oa->hpi_con == NULL) { err("Initializing the hpi_con for OA %s failed", url); /* If this OA status is ACTIVE, then return error, else ignore * If standby OA is not accessible, then the recovery from * this problem will be done by the event thread. * Since we have access to Active OA, we should ignore this * for time being */ if (other_oa->oa_status == ACTIVE) { soap_close(this_oa->hpi_con); soap_close(this_oa->event_con); this_oa->hpi_con = NULL; this_oa->event_con = NULL; err("Active OA - %s may not be accessible", other_oa->server); return SA_ERR_HPI_INTERNAL_ERROR; } else return SA_OK; } other_oa->event_con = soap_open(url, user_name, password, EVENT_CALL_TIMEOUT); if (other_oa->event_con == NULL) { err("Initializing the event_con for OA %s failed", url); /* If this OA status is ACTIVE, then return error, else * ignore */ if (other_oa->oa_status != ACTIVE) { soap_close(this_oa->hpi_con); soap_close(this_oa->event_con); this_oa->hpi_con = NULL; this_oa->event_con = NULL; soap_close(other_oa->hpi_con); other_oa->hpi_con = NULL; err("Active OA - %s may not be accessible", other_oa->server); return SA_ERR_HPI_INTERNAL_ERROR; } else { soap_close(other_oa->hpi_con); other_oa->hpi_con = NULL; return SA_OK; } } return SA_OK; } /** * update_hotswap_event * @event: Pointer to openhpi event structure * @oh_handler: Pointer to the openhpi handler * * Purpose: * this api updates the event structure with hotswap details * * Detailed Description: NA * * Return values: * NONE **/ void update_hotswap_event(struct oh_handler_state *oh_handler, struct oh_event *event) { if (oh_handler == NULL || event == NULL) { err("Invalid parameters"); return; } memset(event, 0, sizeof(struct oh_event)); event->hid = oh_handler->hid; event->event.EventType = SAHPI_ET_HOTSWAP; /* TODO: map the timestamp of the OA generated event */ oh_gettimeofday(&(event->event.Timestamp)); event->event.Severity = SAHPI_CRITICAL; } /** * copy_oa_soap_event * @event: Pointer to the openhpi event structure * * Purpose: * makes a copy of the received event * * Detailed Description: * - Allocates the memory to new event structure. * - Copies the hpi event to the newly created event structure * - Returns the newly created event structure * * Return values: * Pointer to copied oh_event structure - on success * NULL - if wrong parameters passed * - if the memory allocation failed. **/ struct oh_event *copy_oa_soap_event(struct oh_event *event) { struct oh_event *e; if (event == NULL) { err("Invalid parameter"); return NULL; } e = (struct oh_event *)g_malloc0(sizeof(struct oh_event)); if (e == NULL) { err("Out of memory!"); return NULL; } memcpy(e, event, sizeof(struct oh_event)); return e; } /** * del_rdr_from_event * @event: Pointer to the openhpi event structure * * Purpose: * deletes the RDR from the event. * * Detailed Description: * - traverse the event.rdrs list and delete the RDRs one by one. * - This function will be called if the discovery fails for a resource * * Return values: * SA_OK - on success. * SA_ERR_HPI_INVALID_PARAMS - if wrong parameters passed * SA_ERR_HPI_INTERNAL_ERROR - on failure. **/ SaErrorT del_rdr_from_event(struct oh_event *event) { GSList *node = NULL; SaHpiRdrT *rdr = NULL; if (event == NULL) { err("Invalid parameter"); return SA_ERR_HPI_INVALID_PARAMS; } if (event->rdrs == NULL) return SA_OK; /* Traverse the RDRs list and delete the RDR */ node = event->rdrs; do { rdr = NULL; rdr = (SaHpiRdrT *)node->data; if (rdr == NULL) { err("Wrong node detected in the GSList"); return SA_ERR_HPI_INTERNAL_ERROR; } /* Pop out the RDR from the RDRs list */ event->rdrs = g_slist_remove(event->rdrs, (gpointer)rdr); g_free(rdr); /* Get the next RDR */ node = event->rdrs; } while (node != NULL); return SA_OK; } /** * check_oa_status * @oa_handler: Pointer to the OA SOAP plug-in handler * @oa: Pointer to the OA data structure * @con: Pointer to the SOAP_CON structure * * Purpose: * checks the status of the oa * * Detailed Description: * - gets the status of the OA * - Updates the OA handler with active OA * * Return values: * SA_OK - on success. * SA_ERR_HPI_INVALID_PARAMS - if wrong parameters passed * SA_ERR_HPI_INTERNAL_ERROR - on failure. **/ SaErrorT check_oa_status(struct oa_soap_handler *oa_handler, struct oa_info *oa, SOAP_CON *con) { SaErrorT rv = SA_OK; struct getOaStatus status; struct oaStatus status_response; if (oa_handler == NULL || oa == NULL || con == NULL) { err("Invalid parameters"); return SA_ERR_HPI_INVALID_PARAMS; } /* Get the bay number of the OA */ if (oa == oa_handler->oa_1) status.bayNumber = 1; else status.bayNumber = 2; g_mutex_lock(oa->mutex); rv = soap_getOaStatus(con, &status, &status_response); if (rv != SOAP_OK) { err("Get OA status call failed"); g_mutex_unlock(oa->mutex); return SA_ERR_HPI_INTERNAL_ERROR; } if (status_response.oaRole == TRANSITION) { /* OA is in transitioning state to become active. * This is a very rare scenario. * * Wait till it it becomes Active */ err("OA is in transition state"); sleep(OA_STABILIZE_MAX_TIME); rv = soap_getOaStatus(con, &status, &status_response); if (rv != SOAP_OK) { err("Get OA status call failed"); g_mutex_unlock(oa->mutex); return SA_ERR_HPI_INTERNAL_ERROR; } /* Check OA is still in TRANSITION state * Ideally, OA should be out of TRANSITION state */ if (status_response.oaRole == TRANSITION) { err("OA is in TRANSITION for a long time"); err("Please correct the OA"); g_mutex_unlock(oa->mutex); return SA_ERR_HPI_INTERNAL_ERROR; } } oa->oa_status = status_response.oaRole; if (oa->oa_status == ACTIVE) { g_mutex_unlock(oa->mutex); /* Always lock the oa_handler mutex and then oa_info mutex * This is to avoid the deadlock */ g_mutex_lock(oa_handler->mutex); g_mutex_lock(oa->mutex); /* Point the active_con to Active OA's hpi_con */ if (oa_handler->active_con != oa->hpi_con) { oa_handler->active_con = oa->hpi_con; err("OA %s has become Active", oa->server); } g_mutex_unlock(oa->mutex); g_mutex_unlock(oa_handler->mutex); } else g_mutex_unlock(oa->mutex); return SA_OK; } /** * check_oa_user_permissions * @oa_handler: Pointer to the oa_handler structure * @con: Pointer to the SOAP CON * @user_name: Pointer to the user name string * * Purpose: * check oa user permissions, even for the oa administrator. * * Detailed Description: * - checks whether OA user has the ADMINISTRATOR permission * and can access all the resources in HP BladeSystem c-Class * * Return values: * SA_OK - on success. * SA_ERR_HPI_INVALID_PARAMS - if wrong parameters passed * SA_ERR_HPI_INTERNAL_ERROR - on failure. **/ SaErrorT check_oa_user_permissions(struct oa_soap_handler *oa_handler, SOAP_CON *con, char *user_name) { SaErrorT rv = SA_OK; struct getUserInfo request; struct userInfo response; struct bayAccess bay_access; if (oa_handler == NULL || con == NULL || user_name == NULL) { err("Invalid Parameters"); return SA_ERR_HPI_INVALID_PARAMS; } memset(&request, 0, sizeof(struct getUserInfo)); request.username = user_name; rv = soap_getUserInfo(con, &request, &response); if (rv != SOAP_OK) { err("Get user info call failed"); return SA_ERR_HPI_INTERNAL_ERROR; } /* Check user name is enabled or not * This should ideally never fail. * We can not have a user name which is disabled and session is created */ if (response.isEnabled != HPOA_TRUE) { err("User - %s is not enabled for OA %s", user_name, con->server); err("Please give full permissions to user - %s", user_name); oa_handler->status = PLUGIN_NOT_INITIALIZED; return SA_ERR_HPI_INTERNAL_ERROR; } /* Check for the ADMINISTRATOR rights */ if (response.acl != ADMINISTRATOR) { err("User - %s does not have Administrator rights for OA %s", user_name, con->server); err("Please give full permissions to user - %s", user_name); return SA_ERR_HPI_INTERNAL_ERROR; } /* Check the permissions for accessing OA */ if (response.bayPermissions.oaAccess != HPOA_TRUE) { err("User - %s does not have access rights to OA bay(s) " "for OA %s", user_name, con->server); err("Please give full permissions to user - %s", user_name); return SA_ERR_HPI_INTERNAL_ERROR; } /* Check the permissions for accessing server lades */ while (response.bayPermissions.bladeBays) { soap_getBayAccess(response.bayPermissions.bladeBays, &bay_access); if (bay_access.access != HPOA_TRUE) { err("User - %s does not have access rights to " "server bay(s) for OA - %s", user_name, con->server); err("Please give full permissions to user - %s", user_name); return SA_ERR_HPI_INTERNAL_ERROR; } response.bayPermissions.bladeBays = soap_next_node(response.bayPermissions.bladeBays); } /* Check the permissions for accessing interconnect */ while (response.bayPermissions.interconnectTrayBays) { soap_getBayAccess(response.bayPermissions.interconnectTrayBays, &bay_access); if (bay_access.access != HPOA_TRUE) { err("User - %s does not have access rights to " "interconnect bay(s) for OA %s", user_name, con->server); err("Please give full permissions to user - %s", user_name); return SA_ERR_HPI_INTERNAL_ERROR; } response.bayPermissions.interconnectTrayBays = soap_next_node(response.bayPermissions. interconnectTrayBays); } return SA_OK; } /** * check_discovery_failure * @oh_handler: Pointer to the openhpi handler * * Purpose: * checks the oa status after the discovery failure. * * Detailed Description: * - this api will be called only during the discovery failure. * - checks the reason for discovery failure. * - if the failure is due to 'insufficient priveleges', * then creates the fresh oa session * * Return values: * SA_OK - on success. * SA_ERR_HPI_INVALID_PARAMS - if wrong parameters passed * SA_ERR_HPI_INTERNAL_ERROR - on failure. **/ SaErrorT check_discovery_failure(struct oh_handler_state *oh_handler) { SaErrorT oa1_rv, oa2_rv; struct oa_soap_handler *oa_handler = NULL; if (oh_handler == NULL) { err("Invalid parameters"); return SA_ERR_HPI_INVALID_PARAMS; } oa_handler = (struct oa_soap_handler *) oh_handler->data; /* Initialize the return values with failure case */ oa1_rv = SA_ERR_HPI_INTERNAL_ERROR; oa2_rv = SA_ERR_HPI_INTERNAL_ERROR; /* If the hpi_con is NULL, then OA is not reachable */ if (oa_handler->oa_1->hpi_con != NULL) { /* Get the status of the OA in slot 1 */ oa1_rv = check_oa_status(oa_handler, oa_handler->oa_1, oa_handler->oa_1->hpi_con); if (oa1_rv != SA_OK) err("check oa_status has failed for - %s", oa_handler->oa_1->server); } if (oa_handler->oa_2->hpi_con != NULL) { /* Get the status of the OA in slot 2 */ oa2_rv = check_oa_status(oa_handler, oa_handler->oa_2, oa_handler->oa_2->hpi_con); if (oa2_rv != SA_OK) err("check oa_status has failed for OA - %s", oa_handler->oa_2->server); } /* If the OA is reachable (check_oa_status call succeeded) * and OA STATUS is ACTIVE, then return sucess, else return failure. */ if (oa1_rv == SA_OK && oa_handler->oa_1->oa_status == ACTIVE) return SA_OK; else if (oa2_rv == SA_OK && oa_handler->oa_2->oa_status == ACTIVE) return SA_OK; else return SA_ERR_HPI_INTERNAL_ERROR; } /** * lock_oa_soap_handler * @oa_handler: Pointer to the oa_handler * * Purpose: * Tries to lock the oa_handler mutex. If mutex is already locked earlier, * returns error * * Detailed Description: NA * * Return values: * SA_OK - on success. * SA_ERR_HPI_INVALID_PARAMS - on invalid parameters. * SA_ERR_HPI_INTERNAL_ERROR - on failure. **/ SaErrorT lock_oa_soap_handler(struct oa_soap_handler *oa_handler) { gboolean lock_state = TRUE; if (oa_handler == NULL) { err("Invalid parameters"); return SA_ERR_HPI_INVALID_PARAMS; } /* Try to lock the oa_handler mutex */ lock_state = g_mutex_trylock(oa_handler->mutex); if (lock_state == FALSE) { err("OA SOAP Handler is locked."); err("No operation is allowed in this state"); err("Please try after some time"); return SA_ERR_HPI_INTERNAL_ERROR; } /* Unlock the oa_handler mutex */ g_mutex_unlock(oa_handler->mutex); return SA_OK; } /** * check_config_parameters * @handler_config: Pointer to the config handler * * Purpose: * Checks whether all the parameters are present in the config file * * Detailed Description: NA * * Return values: * SA_OK - on success. * SA_ERR_HPI_INVALID_PARAMS - on invalid parameters. * SA_ERR_HPI_INTERNAL_ERROR - on failure. **/ SaErrorT check_config_parameters(GHashTable *handler_config) { char *temp = NULL; if (handler_config == NULL) { err("Invalid parameters"); return SA_ERR_HPI_INVALID_PARAMS; } /* Check for entity_root entry */ temp = (char *)g_hash_table_lookup(handler_config, "entity_root"); if (temp == NULL) { err("entity_root is missing in the config file."); return SA_ERR_HPI_INTERNAL_ERROR; } /* Check for OA user name entry */ temp = (char *) g_hash_table_lookup(handler_config, "OA_User_Name"); if (temp == NULL) { err("Failed to find attribute OA_User_Name in openhpi.conf "); return SA_ERR_HPI_INTERNAL_ERROR; } /* Check for OA_Password entry */ temp = (char *) g_hash_table_lookup(handler_config, "OA_Password"); if (temp == NULL) { err("Failed to find attribute OA_Password in openhpi.conf "); return SA_ERR_HPI_INTERNAL_ERROR; } /* Check for Active OA hostname/IP address entry * STANDBY_OA is an optional parameter and hence not checked */ temp = (char *) g_hash_table_lookup(handler_config, "ACTIVE_OA"); if (temp == NULL) { err("Failed to find attribute ACTIVE_OA in openhpi.conf "); return SA_ERR_HPI_INTERNAL_ERROR; } return SA_OK; } /** * create_event_session * @oa: Pointer to the oa info structure * * Purpose: * creates the fresh event session with OA * * Detailed Descrption: NA * * Return values: * SA_OK - on success. * SA_ERR_HPI_INVALID_PARAMS - on wrong parameters * SA_ERR_HPI_INTERNAL_ERROR - on unsupported oa events. **/ SaErrorT create_event_session(struct oa_info *oa) { SaErrorT rv = SOAP_OK; struct eventPid pid; if (oa == NULL) { err("Invalid parameters"); return SA_ERR_HPI_INVALID_PARAMS; } g_mutex_lock(oa->mutex); if (oa->event_con == NULL) { dbg("OA may not be accessible"); g_mutex_unlock(oa->mutex); return SA_ERR_HPI_INTERNAL_ERROR; } rv = soap_subscribeForEvents(oa->event_con, &pid); g_mutex_unlock(oa->mutex); if (rv != SOAP_OK) { err("Subscribe for events failed"); return SA_ERR_HPI_INTERNAL_ERROR; } /* Store the event pid in oa_info structure */ oa->event_pid=pid.pid; return SA_OK; } /** * create_oa_connection * @oa: Pointer to the oa info structure * @user_name: Pointer the to the OA user name * @password: Pointer the to the OA password * * Purpose: * Creates the connection with the OA * This function will not return until the connection is established * * Detailed Descrption: NA * * Return values: * NONE **/ void create_oa_connection(struct oa_soap_handler *oa_handler, struct oa_info *oa, char *user_name, char *password) { SaErrorT rv = SA_OK; SaHpiBoolT is_oa_present = SAHPI_FALSE; SaHpiBoolT is_oa_accessible = SAHPI_FALSE; if (oa == NULL || user_name == NULL || password == NULL) { err("Invalid parameters"); return; } while (is_oa_accessible == SAHPI_FALSE) { OA_SOAP_CHEK_SHUTDOWN_REQ(oa_handler, NULL, NULL, NULL); /* Check whether the OA is present. * If not, wait till the OA is inserted */ is_oa_present = SAHPI_FALSE; while (is_oa_present == SAHPI_FALSE) { OA_SOAP_CHEK_SHUTDOWN_REQ(oa_handler, NULL, NULL, NULL); g_mutex_lock(oa->mutex); if (oa->oa_status != OA_ABSENT) { g_mutex_unlock(oa->mutex); is_oa_present = SAHPI_TRUE; } else { g_mutex_unlock(oa->mutex); /* OA is not present, * wait for 30 seconds and check again */ sleep(30); } } g_mutex_lock(oa->mutex); /* Close the soap_con strctures */ if (oa->hpi_con != NULL) { soap_close(oa->hpi_con); oa->hpi_con = NULL; } if (oa->event_con != NULL) { soap_close(oa->event_con); oa->event_con = NULL; } g_mutex_unlock(oa->mutex); rv = initialize_oa_con(oa, user_name, password); if ((rv != SA_OK) && (oa->oa_status != OA_ABSENT)) { /* OA may not be reachable * wait for 2 seconds and check again */ sleep(2); continue; } /* hpi_con and event_con successfully created */ is_oa_accessible = SAHPI_TRUE; } return; } /** * initialize_oa_con * @oa: Pointer to the oa info structure * @user_name: Pointer the to the OA user name * @password: Pointer the to the OA password * * Purpose: * Initializes the hpi_con and event_con * * Detailed Descrption: NA * * Return values: * SA_OK - on success. * SA_ERR_HPI_INVALID_PARAMS - on wrong parameters * SA_ERR_HPI_INTERNAL_ERROR - on failure * NONE **/ SaErrorT initialize_oa_con(struct oa_info *oa, char *user_name, char *password) { char url[MAX_URL_LEN]; if (oa == NULL || user_name == NULL || password == NULL) { err("Invalid parameters"); return SA_ERR_HPI_INVALID_PARAMS; } g_mutex_lock(oa->mutex); memset(url, 0, MAX_URL_LEN); snprintf(url, strlen(oa->server) + strlen(PORT) + 1, "%s" PORT, oa->server); oa->hpi_con = soap_open(url, user_name, password, HPI_CALL_TIMEOUT); if (oa->hpi_con == NULL) { /* OA may not be reachable */ g_mutex_unlock(oa->mutex); return SA_ERR_HPI_INTERNAL_ERROR; } /* Try to create event_con connection * Ideally, this call should not fail */ oa->event_con = soap_open(url, user_name, password, EVENT_CALL_TIMEOUT); if (oa->event_con == NULL) { /* OA may not be reachable */ g_mutex_unlock(oa->mutex); soap_close(oa->hpi_con); oa->hpi_con = NULL; return SA_ERR_HPI_INTERNAL_ERROR; } g_mutex_unlock(oa->mutex); return SA_OK; } /** * delete_all_inventory_info * @oh_handler: Pointer to the plugin handler * * Purpose: * Traverses through all resources and extracts the inventory RDR * Frees up the memory allocated for inventory information * * Detailed Descrption: NA * * Return values: * SA_OK - on success. * SA_ERR_HPI_INVALID_PARAMS - on wrong parameters **/ SaErrorT delete_all_inventory_info(struct oh_handler_state *oh_handler) { SaErrorT rv = SA_OK; SaHpiRptEntryT *rpt = NULL; if (oh_handler == NULL) { err("Invalid parameter"); return SA_ERR_HPI_INVALID_PARAMS; } rpt = oh_get_resource_next(oh_handler->rptcache, SAHPI_FIRST_ENTRY); while (rpt) { if (rpt->ResourceCapabilities & SAHPI_CAPABILITY_INVENTORY_DATA) { /* Free the inventory info from inventory RDR */ rv = free_inventory_info(oh_handler, rpt->ResourceId); if (rv != SA_OK) err("Inventory cleanup failed for resource %d", rpt->ResourceId); } /* Get the next resource */ rpt = oh_get_resource_next(oh_handler->rptcache, rpt->ResourceId); } return SA_OK; } /** * cleanup_plugin_rptable * @oh_handler: Pointer to the plugin handler * * Purpose: * Frees up the memory allocated for RPT and RDR entries * * Detailed Descrption: NA * * Return values: * NONE **/ void cleanup_plugin_rptable(struct oh_handler_state *oh_handler) { SaErrorT rv = SA_OK; struct oa_soap_handler *oa_handler = NULL; if (oh_handler == NULL) { err("Invalid parameter"); return; } oa_handler = (struct oa_soap_handler *) oh_handler->data; if(oa_handler == NULL) { err("Invalid parameter"); return; } rv = delete_all_inventory_info(oh_handler); if (rv != SA_OK) { err("Deleting all inventory information failed"); } release_oa_soap_resources(oa_handler); rv = oh_flush_rpt(oh_handler->rptcache); if (rv != SA_OK) { err("Plugin RPTable flush failed"); } return; } /** * release_oa_soap_resources * @oa_handler: Pointer to oa soap handler * * Purpose: * To free the memory allocated for resource presence and serial number * for OA, interconnect, server, fan and power supply * * Detailed Description: NA * * Return values: * None **/ void release_oa_soap_resources(struct oa_soap_handler *oa_handler) { SaHpiInt32T i; /* Release memory of blade presence, resource id and blade * serial number arrays */ if (oa_handler->oa_soap_resources.server.presence != NULL) { g_free(oa_handler->oa_soap_resources.server.presence); } if (oa_handler->oa_soap_resources.server.resource_id != NULL) { g_free(oa_handler->oa_soap_resources.server.resource_id); } if(oa_handler->oa_soap_resources.server.serial_number != NULL) { for (i = 0; i < oa_handler->oa_soap_resources.server.max_bays; i++) { if (oa_handler->oa_soap_resources.server.serial_number[i] != NULL) { g_free(oa_handler->oa_soap_resources.server. serial_number[i]); } } g_free(oa_handler->oa_soap_resources.server.serial_number); } /* Release memory of interconnect presence and serial number array */ if (oa_handler->oa_soap_resources.interconnect.presence != NULL) { g_free(oa_handler->oa_soap_resources.interconnect.presence); } if (oa_handler->oa_soap_resources.interconnect.resource_id != NULL) { g_free(oa_handler->oa_soap_resources.interconnect.resource_id); } if(oa_handler->oa_soap_resources.interconnect.serial_number != NULL) { for (i = 0; i < oa_handler->oa_soap_resources.interconnect.max_bays; i++) { if (oa_handler->oa_soap_resources.interconnect. serial_number[i] != NULL) { g_free(oa_handler->oa_soap_resources.interconnect. serial_number[i]); } } g_free(oa_handler->oa_soap_resources.interconnect.serial_number); } /* Release memory of OA presence and serial number array */ if (oa_handler->oa_soap_resources.oa.presence != NULL) { g_free(oa_handler->oa_soap_resources.oa.presence); } if (oa_handler->oa_soap_resources.oa.resource_id != NULL) { g_free(oa_handler->oa_soap_resources.oa.resource_id); } if(oa_handler->oa_soap_resources.oa.serial_number != NULL) { for (i = 0; i < oa_handler->oa_soap_resources.oa.max_bays; i++) { if (oa_handler->oa_soap_resources.oa.serial_number[i] != NULL) { g_free(oa_handler->oa_soap_resources.oa. serial_number[i]); } } g_free(oa_handler->oa_soap_resources.oa.serial_number); } /* Release memory of fan presence. Since fans do not have serial * numbers, a serial numbers array does not need to be released. */ if (oa_handler->oa_soap_resources.fan.presence != NULL) { g_free(oa_handler->oa_soap_resources.fan.presence); } if (oa_handler->oa_soap_resources.fan.resource_id != NULL) { g_free(oa_handler->oa_soap_resources.fan.resource_id); } /* Release memory of fan zone resource id */ if (oa_handler->oa_soap_resources.fan_zone.resource_id != NULL) { g_free(oa_handler->oa_soap_resources.fan_zone.resource_id); } /* Release memory of power supply presence and serial number array */ if (oa_handler->oa_soap_resources.ps_unit.presence !=NULL) { g_free(oa_handler->oa_soap_resources.ps_unit.presence); } if (oa_handler->oa_soap_resources.ps_unit.resource_id !=NULL) { g_free(oa_handler->oa_soap_resources.ps_unit.resource_id); } if(oa_handler->oa_soap_resources.ps_unit.serial_number != NULL) { for (i = 0; i < oa_handler->oa_soap_resources.ps_unit.max_bays; i++) { if (oa_handler->oa_soap_resources.ps_unit.serial_number[i] != NULL) { g_free(oa_handler->oa_soap_resources. ps_unit.serial_number[i]); } } g_free(oa_handler->oa_soap_resources.ps_unit.serial_number); } } /** * get_oa_fw_version * @oh_handler: Pointer to the plugin handler * * Purpose: * Returns the OA firmware version of the active OA * * Detailed Descrption: NA * * Return values: * Active OA firmware version - on success * 0.0 - on failure **/ SaHpiFloat64T get_oa_fw_version(struct oh_handler_state *oh_handler) { struct oa_soap_handler *oa_handler; if (oh_handler == NULL) { err("Invalid parameter"); return 0.0; } oa_handler = (struct oa_soap_handler *) oh_handler->data; if (oa_handler->active_con == oa_handler->oa_1->hpi_con) return oa_handler->oa_1->fm_version; else if (oa_handler->active_con == oa_handler->oa_2->hpi_con) return oa_handler->oa_2->fm_version; else return 0.0; } /** * update_oa_info * @oh_handler: Pointer to the plugin handler * @response: Pointer to the oaInfo structure * @resource_id: Resource Id * * Purpose: * Returns the OA firmware version of the active OA * * Detailed Descrption: NA * * Return values: * SA_HPI_ERR_INAVLID_PARAMS - on invalid parametersfailure * SA_HPI_ERR_INTERNAL_ERROR - on failure * SA_OK - on success **/ SaErrorT update_oa_info(struct oh_handler_state *oh_handler, struct oaInfo *response, SaHpiResourceIdT resource_id) { SaHpiRptEntryT *rpt = NULL; SaHpiFloat64T fm_version; SaHpiInt32T major; if (oh_handler == NULL || response == NULL) { err("Invalid parameter"); return SA_ERR_HPI_INVALID_PARAMS; } rpt = oh_get_resource_by_id(oh_handler->rptcache, resource_id); if (rpt == NULL) { err("OA rpt is not present"); return SA_ERR_HPI_INTERNAL_ERROR; } if (strlen(response->fwVersion) == 0) { err("Firmware version is null string"); return SA_ERR_HPI_INTERNAL_ERROR; } /* Firmware version is in the format of x.yy. 'x' is the major version * 'yy' is the minor version */ fm_version = atof(response->fwVersion); rpt->ResourceInfo.FirmwareMajorRev = major = rintf(fm_version); rpt->ResourceInfo.FirmwareMinorRev = rintf((fm_version - major) * 100); return SA_OK; } /** * convert_lower_to_upper * @src: Pointer to the source string handler * @src_len: String length of the source string * @dest: Pointer to destination string * @dest_len: Length of the destination string * * Purpose: * Converts the lower case characters to upper case * * Detailed Descrption: NA * * Return values: * SA_HPI_ERR_INAVLID_PARAMS - on invalid parametersfailure * SA_HPI_ERR_INTERNAL_ERROR - on failure * SA_OK - on success **/ SaErrorT convert_lower_to_upper(char *src, SaHpiInt32T src_len, char *dest, SaHpiInt32T dest_len) { SaHpiInt32T i; if (src == NULL || dest == NULL) { dbg("Invalid parameters"); return SA_ERR_HPI_INVALID_PARAMS; } if (dest_len < src_len) { err("Source string is longer than destination string"); return SA_ERR_HPI_INTERNAL_ERROR; } memset(dest, 0, dest_len); for (i = 0; i < src_len; i++) dest[i] = toupper(src[i]); return SA_OK; } /** * update_reseource_status() * @res_status pointer to resource_status_t * @index index into the resource info fields in res_status * @serial_number serial_number string to be copied into res_status * @resource_id resource id to be updated to res_status * @presence presence status * * Description: * This routine updates the resource status entry with passed in * serial_number, resource_id, and presence. This routine should be * called to set and reset the resource status fields that change * when a a resource gets added and removed. * * Return value: none **/ void oa_soap_update_resource_status(resource_status_t *res_status, SaHpiInt32T index, char *serial_number, SaHpiResourceIdT resource_id, resource_presence_status_t presence) { if (index <= 0) { err("Invalid index value %d - returning without update\n", index); return; } if (serial_number != NULL) { size_t len; len = strlen(serial_number); strncpy(res_status->serial_number[index-1], serial_number, len); res_status->serial_number[index-1][len] = '\0'; } res_status->resource_id[index-1] = resource_id; res_status->presence[index-1] = presence; return; } openhpi-2.14.1/plugins/oa_soap/oa_soap_fumi.h0000644000076400007640000001147311302566663016123 0ustar /* * Copyright (C) 2007-2008, Hewlett-Packard Development Company, LLP * All rights reserved. * * 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. * * Neither the name of the Hewlett-Packard Corporation, nor the names * of its contributors may be used to endorse or promote products * derived from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * Author(s) * Raja Kumar Thatte */ #ifndef _OA_SOAP_FUMI_H #define _OA_SOAP_FUMI_H /* Include files */ #include #include SaErrorT oa_soap_set_fumi_source(void *oh_handler, SaHpiResourceIdT resource_id, SaHpiFumiNumT num, SaHpiBankNumT banknum, SaHpiTextBufferT *sourceuri); SaErrorT oa_soap_validate_fumi_source(void *oh_handler, SaHpiResourceIdT resource_id, SaHpiFumiNumT num, SaHpiBankNumT banknum); SaErrorT oa_soap_get_fumi_source(void *oh_handler, SaHpiResourceIdT resource_id, SaHpiFumiNumT num, SaHpiBankNumT banknum, SaHpiFumiSourceInfoT *sourceinfo); SaErrorT oa_soap_get_fumi_target(void *oh_handler, SaHpiResourceIdT resource_id, SaHpiFumiNumT num, SaHpiBankNumT banknum, SaHpiFumiBankInfoT *bankinfo); SaErrorT oa_soap_start_fumi_backup(void *oh_handler, SaHpiResourceIdT resource_id, SaHpiFumiNumT num); SaErrorT oa_soap_set_fumi_bank_order(void *oh_handler, SaHpiResourceIdT resource_id, SaHpiFumiNumT num, SaHpiBankNumT banknum, SaHpiUint32T position); SaErrorT oa_soap_start_fumi_bank_copy(void *oh_handler, SaHpiResourceIdT resource_id, SaHpiFumiNumT num, SaHpiBankNumT sourcebanknum, SaHpiBankNumT targetbanknum); SaErrorT oa_soap_start_fumi_install(void *oh_handler, SaHpiResourceIdT resource_id, SaHpiFumiNumT num, SaHpiBankNumT banknum); SaErrorT oa_soap_get_fumi_status(void *oh_handler, SaHpiResourceIdT resource_id, SaHpiFumiNumT num, SaHpiBankNumT banknum, SaHpiFumiUpgradeStatusT *status); SaErrorT oa_soap_start_fumi_verify(void *oh_handler, SaHpiResourceIdT resource_id, SaHpiFumiNumT num, SaHpiBankNumT banknum); SaErrorT oa_soap_cancel_fumi_upgrade(void *oh_handler, SaHpiResourceIdT resource_id, SaHpiFumiNumT num, SaHpiBankNumT banknum); SaErrorT oa_soap_start_fumi_rollback(void *oh_handler, SaHpiResourceIdT resource_id, SaHpiFumiNumT num); SaErrorT oa_soap_activate_fumi(void *oh_handler, SaHpiResourceIdT resource_id, SaHpiFumiNumT num); #endif openhpi-2.14.1/plugins/oa_soap/oa_soap_server_event.c0000644000076400007640000011576311302566663017674 0ustar /* * Copyright (C) 2007-2009, Hewlett-Packard Development Company, LLP * All rights reserved. * * 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. * * Neither the name of the Hewlett-Packard Corporation, nor the names * of its contributors may be used to endorse or promote products * derived from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * Author(s) * Raghavendra P.G. * Shuah Khan * Raghavendra M.S. * Mohan Devarajulu * * This file has the server blade related events handling * * process_server_power_off_event() - Processes the server power off event * * process_server_power_on_event() - Processes the server power on event * * process_server_power_event() - Processes the server power event * * process_server_insertion_event() - Processes the server insertion event * * process_server_extraction_event() - Processes the server extraction * event * * build_inserted_server_rpt() - Builds the rpt entry for inserted * server * * oa_soap_proc_server_status() - Processes the server status event * * oa_soap_serv_post_comp () - Processes the blade post complete * event * * oa_soap_set_thermal_sensor () - Enables or Disables the thermal * sensors associated with blade */ #include "oa_soap_server_event.h" #include "oa_soap_discover.h" /* for build_server_rpt() prototype */ /** * process_server_power_off_event * @oh_handler: Pointer to openhpi handler structure * @event: Pointer to the openhpi event structure * * Purpose: * Creates the server power off hotswap event * * Detailed Description: NA * * Return values: * SA_OK - success. * SA_ERR_HPI_INVALID_PARAMS - on wrong parameters. * SA_ERR_HPI_INTERNAL_ERROR - on failure **/ SaErrorT process_server_power_off_event(struct oh_handler_state *oh_handler, struct oh_event *event) { struct oa_soap_hotswap_state *hotswap_state = NULL; if (oh_handler == NULL || event == NULL) { err("wrong parameters passed"); return SA_ERR_HPI_INVALID_PARAMS; } hotswap_state = (struct oa_soap_hotswap_state *) oh_get_resource_data(oh_handler->rptcache, event->resource.ResourceId); if (hotswap_state == NULL) { err("Failed to get server hotswap state"); return SA_ERR_HPI_INTERNAL_ERROR; } /* Sometimes OA sends duplicate power off event * Check whether hotswap state is not in ACTIVE * If yes, then ignore power off event */ if (hotswap_state->currentHsState != SAHPI_HS_STATE_ACTIVE) { dbg("blade is not in proper state"); dbg("ignoring the power off event"); return SA_ERR_HPI_INTERNAL_ERROR; } /* Raise the server power off hotswap event */ event->rdrs = NULL; event->event.EventDataUnion.HotSwapEvent.PreviousHotSwapState = SAHPI_HS_STATE_ACTIVE; event->event.EventDataUnion.HotSwapEvent.HotSwapState = SAHPI_HS_STATE_EXTRACTION_PENDING; /* ACTIVE to EXTRACTION_PENDING state change can not be stopped. * Hence, this is unexpected deactivation */ event->event.EventDataUnion.HotSwapEvent.CauseOfStateChange = SAHPI_HS_CAUSE_UNEXPECTED_DEACTIVATION; oh_evt_queue_push(oh_handler->eventq, copy_oa_soap_event(event)); event->rdrs = NULL; event->event.EventDataUnion.HotSwapEvent.PreviousHotSwapState = SAHPI_HS_STATE_EXTRACTION_PENDING; event->event.EventDataUnion.HotSwapEvent.HotSwapState = SAHPI_HS_STATE_INACTIVE; /* EXTRACTION_PENDING to INACTIVE state change happens due to auto * policy of server blade */ event->event.EventDataUnion.HotSwapEvent.CauseOfStateChange = SAHPI_HS_CAUSE_AUTO_POLICY; oh_evt_queue_push(oh_handler->eventq, copy_oa_soap_event(event)); event->resource.ResourceSeverity = SAHPI_CRITICAL; hotswap_state->currentHsState = SAHPI_HS_STATE_INACTIVE; return SA_OK; } /** * process_server_power_on_event * @oh_handler: Pointer to openhpi handler structure * @con: Pointer to SOAP_CON structure * @bay_number: Bay number of the server blade * @event: Pointer to the openhpi event structure * * Purpose: * Creates the server power on hotswap event. If the sever blade * was powered on after insertion, then the INSERTION_PENDING to * ACTIVE hot swap event is generated. * * Detailed Description: NA * * Return values: * SA_OK - success. * SA_ERR_HPI_INVALID_PARAMS - on wrong parameters. * SA_ERR_HPI_INTERNAL_ERROR - on failure **/ SaErrorT process_server_power_on_event(struct oh_handler_state *oh_handler, SOAP_CON *con, struct oh_event *event, SaHpiInt32T bay_number) { SaErrorT rv = SA_OK; struct oa_soap_handler *oa_handler; struct oa_soap_hotswap_state *hotswap_state = NULL; struct oa_soap_sensor_info *sensor_info=NULL; SaHpiRdrT *rdr = NULL; SaHpiIdrIdT sen_rdr_num = OA_SOAP_SEN_TEMP_STATUS; if (oh_handler == NULL || con == NULL || event == NULL) { err("Invalid parameters"); return SA_ERR_HPI_INVALID_PARAMS; } oa_handler = (struct oa_soap_handler *) oh_handler->data; hotswap_state = (struct oa_soap_hotswap_state *) oh_get_resource_data(oh_handler->rptcache, event->resource.ResourceId); if (hotswap_state == NULL) { err("Failed to get hotswap state of server blade"); return SA_ERR_HPI_INTERNAL_ERROR; } event->event.EventDataUnion.HotSwapEvent.PreviousHotSwapState = hotswap_state->currentHsState; /* Check whether blade is inserted and then powered on */ switch (hotswap_state->currentHsState) { case (SAHPI_HS_STATE_INSERTION_PENDING): hotswap_state->currentHsState = SAHPI_HS_STATE_ACTIVE; event->event.EventDataUnion.HotSwapEvent.HotSwapState = SAHPI_HS_STATE_ACTIVE; /* INSERTION_PENDING to ACTIVE state change happens due * to auto policy of server blade */ event->event.EventDataUnion.HotSwapEvent. CauseOfStateChange = SAHPI_HS_CAUSE_AUTO_POLICY; oh_evt_queue_push(oh_handler->eventq, copy_oa_soap_event(event)); break; case (SAHPI_HS_STATE_INACTIVE): event->resource.ResourceSeverity = SAHPI_OK; /* The previous state of the server was power off * Update the current hotswap state to ACTIVE */ hotswap_state->currentHsState = SAHPI_HS_STATE_ACTIVE; if (rv != SA_OK) { err("Failed to add hot swap state"); } rdr = oh_get_rdr_by_type(oh_handler->rptcache, event->resource.ResourceId, SAHPI_SENSOR_RDR, sen_rdr_num); if (rdr == NULL) { err("RDR not present"); return SA_ERR_HPI_NOT_PRESENT; } /* Get the thermal sensor information of the server */ sensor_info = (struct oa_soap_sensor_info*) oh_get_rdr_data(oh_handler->rptcache, event->resource.ResourceId, rdr->RecordId); if (sensor_info == NULL) { err("No sensor data. Sensor=%s", rdr->IdString.Data); return SA_ERR_HPI_INTERNAL_ERROR; } /* Since the server got powered off * Clear the thermal sensor states */ sensor_info->current_state = SAHPI_ES_UNSPECIFIED; sensor_info->previous_state = SAHPI_ES_UNSPECIFIED; /* Raise the server power on hotswap event */ event->rdrs = NULL; event->event.EventDataUnion.HotSwapEvent.HotSwapState = SAHPI_HS_STATE_INSERTION_PENDING; /* The cause of the state change is unknown */ event->event.EventDataUnion.HotSwapEvent. CauseOfStateChange = SAHPI_HS_CAUSE_UNKNOWN; oh_evt_queue_push(oh_handler->eventq, copy_oa_soap_event(event)); event->rdrs = NULL; event->event.EventDataUnion.HotSwapEvent. PreviousHotSwapState = SAHPI_HS_STATE_INSERTION_PENDING; event->event.EventDataUnion.HotSwapEvent.HotSwapState = SAHPI_HS_STATE_ACTIVE; /* INSERTION_PENDING to ACTIVE state change happens due * to Auto policy of server blade */ event->event.EventDataUnion.HotSwapEvent. CauseOfStateChange = SAHPI_HS_CAUSE_AUTO_POLICY; oh_evt_queue_push(oh_handler->eventq, copy_oa_soap_event(event)); break; default: err("wrong state detected"); return SA_ERR_HPI_INTERNAL_ERROR; } return SA_OK; } /** * process_server_power_event * @oh_handler: Pointer to openhpi handler structure * @con: Pointer to SOAP_CON structure * @oa_event: Pointer to OA event structure * * Purpose: * Creates the server power hpi hotswap event * * Detailed Description: NA * * Return values: * SA_OK - success. * SA_ERR_HPI_INVALID_PARAMS - on wrong parameters. * SA_ERR_HPI_INTERNAL_ERROR - on failure **/ SaErrorT process_server_power_event(struct oh_handler_state *oh_handler, SOAP_CON *con, struct eventInfo *oa_event) { SaErrorT rv = SA_OK; SaHpiRptEntryT *rpt = NULL; struct oa_soap_handler *oa_handler = NULL; struct oa_soap_hotswap_state hotswap_state; SaHpiInt32T bay_number, loc=1; struct oh_event event; SaHpiResourceIdT resource_id; if (oh_handler == NULL || con == NULL || oa_event == NULL) { err("Invalid parameters"); return SA_ERR_HPI_INVALID_PARAMS; } update_hotswap_event(oh_handler, &event); bay_number = oa_event->eventData.bladeStatus.bayNumber; oa_handler = (struct oa_soap_handler *) oh_handler->data; resource_id = oa_handler->oa_soap_resources.server.resource_id[bay_number - 1]; /* Get the rpt entry of the resource */ rpt = oh_get_resource_by_id(oh_handler->rptcache, resource_id); if (rpt == NULL) { /* rpt does not exist When EVENT_BLADE_POWER_STATE comes before EVENT_BLADE_INSERT_COMPLETED event. But some times (<5%) OA sends these two events out of order. EVENT_BLADE_INSERT_COMPLETED creates the rpt entry. EVENT_BLADE_POWER_STATE with POWER_ON comes only if the "Automatically power on server" is set to yes for that blade in the iLO, otherwise it does not. This workaround fixes the problem by doing opposite of what OA is doing, when it sends the events out of order. a. When the EVENT_BLADE_POWER_STATE comes when the RPT is empty for that blade, then assume that we missed the EVENT_BLADE_INSERT_COMPLETED event and execute that code. b. Avoid calling EVENT_BLADE_POWER_STATE code by knowing where it is called from and whether the POWER_ON state is set or not. POWER_ON is set in EVENT_BLADE_INSERT_COMPLETED event, if it arrives later. c. When the EVENT_BLADE_INSERT_COMPLETED eventually comes with the POWER_ON state call the EVENT_BLADE_POWER_STATE code to set the active state. d. When OA fixes their code, this workaround code will not get executed at all. */ dbg("resource RPT is NULL, starting Workaround"); rv = process_server_insertion_event(oh_handler, con, oa_event, loc); return rv; } /* For blades that do not support managed hotswap, ignore power event */ if (!(rpt->ResourceCapabilities & SAHPI_CAPABILITY_MANAGED_HOTSWAP)) { dbg("Ignoring the power event for blade %d", bay_number); return SA_OK; } memcpy(&(event.resource), rpt, sizeof(SaHpiRptEntryT)); event.event.Source = event.resource.ResourceId; switch (oa_event->eventData.bladeStatus.powered) { case (POWER_OFF): rv = process_server_power_off_event(oh_handler, &event); /* Walk through the rdr list of the resource and * disables thermal sensors associated with server, as it * cannot perform the sensor monitoring * For disabling the thermal sensor, * Response structure pointer is passed as NULL, since * it not utilized for disable operation. */ rv = oa_soap_set_thermal_sensor (oh_handler, rpt, NULL, SAHPI_FALSE); if (rv != SA_OK) { err("Failure in disabling thermal sensors"); oa_soap_bay_pwr_status[bay_number -1] = SAHPI_POWER_OFF; return rv; } oa_soap_bay_pwr_status[bay_number -1] = SAHPI_POWER_OFF; break; case (POWER_ON): oa_soap_bay_pwr_status[bay_number -1] = SAHPI_POWER_ON; rv = process_server_power_on_event(oh_handler, con, &event, bay_number); break; /* Currently, OA is not sending the REBOOT event*/ case (POWER_REBOOT): hotswap_state.currentHsState = SAHPI_HS_STATE_ACTIVE; event.event.EventDataUnion.HotSwapEvent. PreviousHotSwapState = SAHPI_HS_STATE_INSERTION_PENDING; event.event.EventDataUnion.HotSwapEvent.HotSwapState = SAHPI_HS_STATE_ACTIVE; /* INSERTION_PENDING to ACTIVE state change happens due * to Auto policy of server blade */ event.event.EventDataUnion.HotSwapEvent. CauseOfStateChange = SAHPI_HS_CAUSE_AUTO_POLICY; oh_evt_queue_push(oh_handler->eventq, copy_oa_soap_event(&event)); break; default: err("Wrong power state"); return SA_ERR_HPI_INTERNAL_ERROR; } return SA_OK; } /** * process_server_insertion_event * @oh_handler: Pointer to openhpi handler structure * @con: Pointer to SOAP_CON structure * @oa_event: Pointer to the OA event structure * @loc: Location, 0 default, 1 Workaround * * Purpose: * Creates the server insertion hpi hotswap event * * Detailed Description: * - The inserted server blade will not have all the * information with the insertion event. * Build the bare minimum inventory RDR * - Raise the NOT_PRESENT to INSERTION_PENDING hotswap event * * Return values: * SA_OK - success. * SA_ERR_HPI_INVALID_PARAMS - on wrong parameters. * SA_ERR_HPI_INTERNAL_ERROR - on failure **/ SaErrorT process_server_insertion_event(struct oh_handler_state *oh_handler, SOAP_CON *con, struct eventInfo *oa_event, SaHpiInt32T loc) { SaErrorT rv = SA_OK; struct getBladeInfo info; struct bladeInfo response; struct oa_soap_handler *oa_handler = NULL; SaHpiInt32T bay_number; struct oh_event event; SaHpiRptEntryT rpt; GSList *asserted_sensors = NULL; char blade_name[MAX_NAME_LEN]; if (oh_handler == NULL || con == NULL || oa_event == NULL) { err("Invalid parameters"); return SA_ERR_HPI_INVALID_PARAMS; } oa_handler = (struct oa_soap_handler *) oh_handler->data; update_hotswap_event(oh_handler, &event); bay_number = oa_event->eventData.bladeStatus.bayNumber; if ((oa_event->eventData.bladeStatus.powered == POWER_ON) && (loc == 0)) { /* Usually power ON event comes after insertion complete, but 5% of the time it comes first. So out of order events are processed out of order. The power_on event code calls this function with loc=1 to avoid recursion */ rv = process_server_power_event(oh_handler, con, oa_event); return rv; } info.bayNumber = bay_number; rv = soap_getBladeInfo(con, &info, &response); if (rv != SOAP_OK) { err("Get blade info failed"); return SA_ERR_HPI_INTERNAL_ERROR; } /* Copy the blade name from response for future processing */ convert_lower_to_upper(response.name, strlen(response.name), blade_name, MAX_NAME_LEN); /* Build the server RPT entry */ rv = build_inserted_server_rpt(oh_handler, &response, &rpt); if (rv != SA_OK) { err("build inserted server rpt failed"); return rv; } /* Update resource_status structure with resource_id, serial_number, * and presence status */ oa_soap_update_resource_status( &oa_handler->oa_soap_resources.server, bay_number, response.serialNumber, rpt.ResourceId, RES_PRESENT); /* Build the server RDR */ rv = build_server_rdr(oh_handler, con, bay_number, rpt.ResourceId, blade_name); if (rv != SA_OK) { err("build inserted server RDR failed"); /* Free the inventory info from inventory RDR */ rv = free_inventory_info(oh_handler, rpt.ResourceId); if (rv != SA_OK) { err("Inventory cleanup failed for resource id %d", rpt.ResourceId); } oh_remove_resource(oh_handler->rptcache, rpt.ResourceId); /* reset resource_status structure to default values */ oa_soap_update_resource_status( &oa_handler->oa_soap_resources.server, bay_number, "", SAHPI_UNSPECIFIED_RESOURCE_ID, RES_ABSENT); return rv; } rv = oa_soap_populate_event(oh_handler, rpt.ResourceId, &event, &asserted_sensors); if (rv != SA_OK) { err("Populating event struct failed"); return SA_ERR_HPI_INTERNAL_ERROR; } event.event.EventType = SAHPI_ET_HOTSWAP; event.event.EventDataUnion.HotSwapEvent.PreviousHotSwapState = SAHPI_HS_STATE_NOT_PRESENT; /* For blades that do not support managed hotswap, current hotswap state * is ACTIVE */ if (!(rpt.ResourceCapabilities & SAHPI_CAPABILITY_MANAGED_HOTSWAP)) { event.event.EventDataUnion.HotSwapEvent.HotSwapState = SAHPI_HS_STATE_ACTIVE; } else { event.event.EventDataUnion.HotSwapEvent.HotSwapState = SAHPI_HS_STATE_INSERTION_PENDING; } /* NOT_PRESENT to INSERTION_PENDING/ACTIVE state change happened due * to operator action of blade insertion */ event.event.EventDataUnion.HotSwapEvent.CauseOfStateChange = SAHPI_HS_CAUSE_OPERATOR_INIT; /* Raise the hotswap event for the inserted server blade */ oh_evt_queue_push(oh_handler->eventq, copy_oa_soap_event(&event)); /* Raise the assert sensor events */ if (asserted_sensors) oa_soap_assert_sen_evt(oh_handler, &rpt, asserted_sensors); return SA_OK; } /** * process_server_extraction_event * @oh_handler: Pointer to openhpi handler structure * @oa_event: Pointer to the OA event structure * * Purpose: * Creates the server extraction hpi hotswap event * * Detailed Description: NA * * Return values: * SA_OK - success. * SA_ERR_HPI_INVALID_PARAMS - on wrong parameters. * SA_ERR_HPI_INTERNAL_ERROR - on failure **/ SaErrorT process_server_extraction_event(struct oh_handler_state *oh_handler, struct eventInfo *oa_event) { SaErrorT rv = SA_OK; if (oh_handler == NULL || oa_event == NULL) { err("Invalid parameters"); return SA_ERR_HPI_INVALID_PARAMS; } rv = remove_server_blade(oh_handler, oa_event->eventData.bladeStatus.bayNumber); if (rv != SA_OK) { err("Removing server blade failed"); return SA_ERR_HPI_INTERNAL_ERROR; } return SA_OK; } /** * build_inserted_server_rpt * @oh_handler: Pointer to openhpi handler * @response: Pointer to the bladeInfo structure * @rpt: Pointer to the rpt entry * * Purpose: * Populate the server blade RPT with aid of build_server_rpt() and add * hotswap state information to the returned rpt. * Pushes the RPT entry to infrastructure. * * Detailed Description: NA * * Return values: * SA_OK - on success * SA_ERR_HPI_INVALID_PARAMS - on wrong parameters * SA_ERR_HPI_OUT_OF_MEMORY - on malloc failure * SA_ERR_HPI_INTERNAL_ERROR - on failure **/ SaErrorT build_inserted_server_rpt(struct oh_handler_state *oh_handler, struct bladeInfo *response, SaHpiRptEntryT *rpt) { SaErrorT rv = SA_OK; struct oa_soap_hotswap_state *hotswap_state = NULL; if (oh_handler == NULL || response == NULL || rpt == NULL) { err("invalid parameters"); return SA_ERR_HPI_INVALID_PARAMS; } if (build_server_rpt(oh_handler, response, rpt) != SA_OK) { err("Building Server RPT failed for an inserted blade"); return SA_ERR_HPI_INTERNAL_ERROR; } if (rpt->ResourceCapabilities & SAHPI_CAPABILITY_MANAGED_HOTSWAP) { hotswap_state = (struct oa_soap_hotswap_state *) g_malloc0(sizeof(struct oa_soap_hotswap_state)); if (hotswap_state == NULL) { err("Out of memory"); return SA_ERR_HPI_OUT_OF_MEMORY; } /* Inserted server needs some time to stabilize. Put the * server hotswap state to INSERTION_PENDING. Once the * server stabilizes, put the hotswap state to ACTIVE * (handled in power on event). */ hotswap_state->currentHsState = SAHPI_HS_STATE_INSERTION_PENDING; } rv = oh_add_resource(oh_handler->rptcache, rpt, hotswap_state, 0); if (rv != SA_OK) { err("Failed to add Server rpt"); if (hotswap_state != NULL) g_free(hotswap_state); return rv; } return SA_OK; } /** * oa_soap_proc_server_status * @oh_handler : Pointer to openhpi handler structure * @con : Pointer to soap con * @status : Pointer to blade status structure * * Purpose: * Processes the server status event * * Detailed Description: NA * * Return values: * NONE **/ void oa_soap_proc_server_status(struct oh_handler_state *oh_handler, SOAP_CON *con, struct bladeStatus *status) { SaErrorT rv = SA_OK; SaHpiRptEntryT *rpt = NULL; struct oa_soap_handler *oa_handler = NULL; SaHpiResourceIdT resource_id; enum diagnosticStatus diag_ex_status[OA_SOAP_MAX_DIAG_EX]; struct getBladeThermalInfoArray thermal_request; struct bladeThermalInfoArrayResponse thermal_response; if (oh_handler == NULL || status == NULL) { err("Invalid parameters"); return; } oa_handler = (struct oa_soap_handler *) oh_handler->data; resource_id = oa_handler->oa_soap_resources.server. resource_id[status->bayNumber - 1]; /* Get the rpt entry of the resource */ rpt = oh_get_resource_by_id(oh_handler->rptcache, resource_id); if (rpt == NULL) { err("resource RPT is NULL"); return; } /* Process operational status sensor */ OA_SOAP_PROCESS_SENSOR_EVENT(OA_SOAP_SEN_OPER_STATUS, status->operationalStatus, 0, 0) /* Process predictive failure sensor */ OA_SOAP_PROCESS_SENSOR_EVENT(OA_SOAP_SEN_PRED_FAIL, status->operationalStatus, 0, 0) /* Process internal data error sensor */ OA_SOAP_PROCESS_SENSOR_EVENT(OA_SOAP_SEN_INT_DATA_ERR, status->diagnosticChecks.internalDataError, 0, 0) /* Process management processor error sensor */ OA_SOAP_PROCESS_SENSOR_EVENT(OA_SOAP_SEN_MP_ERR, status->diagnosticChecks. managementProcessorError, 0, 0) /* Process thermal waring sensor */ OA_SOAP_PROCESS_SENSOR_EVENT(OA_SOAP_SEN_THERM_WARN, status->diagnosticChecks.thermalWarning, 0, 0) /* Process thermal danger sensor */ OA_SOAP_PROCESS_SENSOR_EVENT(OA_SOAP_SEN_THERM_DANGER, status->diagnosticChecks.thermalDanger, 0, 0) /* Process IO configuration error sensor */ OA_SOAP_PROCESS_SENSOR_EVENT(OA_SOAP_SEN_IO_CONFIG_ERR, status->diagnosticChecks. ioConfigurationError, 0, 0) /* Process device power request error sensor */ OA_SOAP_PROCESS_SENSOR_EVENT(OA_SOAP_SEN_DEV_PWR_REQ, status->diagnosticChecks. devicePowerRequestError, 0, 0) /* Process insufficient coolling sensor */ OA_SOAP_PROCESS_SENSOR_EVENT(OA_SOAP_SEN_INSUF_COOL, status->diagnosticChecks. insufficientCooling, 0, 0) /* Process device location error sensor */ OA_SOAP_PROCESS_SENSOR_EVENT(OA_SOAP_SEN_DEV_LOC_ERR, status->diagnosticChecks. deviceLocationError, 0, 0) /* Process device failure error sensor */ OA_SOAP_PROCESS_SENSOR_EVENT(OA_SOAP_SEN_DEV_FAIL, status->diagnosticChecks.deviceFailure, 0, 0) /* Process device degraded error sensor */ OA_SOAP_PROCESS_SENSOR_EVENT(OA_SOAP_SEN_DEV_DEGRAD, status->diagnosticChecks.deviceDegraded, 0, 0) oa_soap_parse_diag_ex(status->diagnosticChecksEx, diag_ex_status); /* Process device missing sensor */ OA_SOAP_PROCESS_SENSOR_EVENT(OA_SOAP_SEN_DEV_MISS, diag_ex_status[DIAG_EX_DEV_MISS], 0, 0) /* Process device bonding sensor */ OA_SOAP_PROCESS_SENSOR_EVENT(OA_SOAP_SEN_DEV_BOND, diag_ex_status[DIAG_EX_DEV_BOND], 0, 0) /* Process device power sequence sensor */ OA_SOAP_PROCESS_SENSOR_EVENT(OA_SOAP_SEN_DEV_PWR_SEQ, diag_ex_status[DIAG_EX_DEV_PWR_SEQ], 0, 0) /* Process network configuration sensor */ OA_SOAP_PROCESS_SENSOR_EVENT(OA_SOAP_SEN_NET_CONFIG, diag_ex_status[DIAG_EX_NET_CONFIG], 0, 0) /* Process profile unassigned error sensor */ OA_SOAP_PROCESS_SENSOR_EVENT(OA_SOAP_SEN_PROF_UNASSIGN_ERR, diag_ex_status[DIAG_EX_PROF_UNASSIGN_ERR], 0, 0) /* Process Device not supported sensor */ OA_SOAP_PROCESS_SENSOR_EVENT(OA_SOAP_SEN_DEV_NOT_SUPPORT, diag_ex_status[DIAG_EX_DEV_NOT_SUPPORT], 0, 0) /* Process Too low power request sensor */ OA_SOAP_PROCESS_SENSOR_EVENT(OA_SOAP_SEN_TOO_LOW_PWR_REQ, diag_ex_status[DIAG_EX_TOO_LOW_PWR_REQ], 0, 0) /* Process Call HP sensor */ OA_SOAP_PROCESS_SENSOR_EVENT(OA_SOAP_SEN_CALL_HP, diag_ex_status[DIAG_EX_CALL_HP], 0, 0) /* Process Storage device missing sensor */ OA_SOAP_PROCESS_SENSOR_EVENT(OA_SOAP_SEN_STORAGE_DEV_MISS, diag_ex_status[DIAG_EX_STORAGE_DEV_MISS], 0, 0) /* Process Power capping error sensor */ OA_SOAP_PROCESS_SENSOR_EVENT(OA_SOAP_SEN_GRPCAP_ERR, diag_ex_status[DIAG_EX_GRPCAP_ERR], 0, 0) /* Process IML recorded errors sensor */ OA_SOAP_PROCESS_SENSOR_EVENT(OA_SOAP_SEN_IML_ERR, diag_ex_status[DIAG_EX_IML_ERR], 0, 0) /* Process Duplicate management IP address sensor */ OA_SOAP_PROCESS_SENSOR_EVENT(OA_SOAP_SEN_DUP_MGMT_IP_ADDR, diag_ex_status[DIAG_EX_DUP_MGMT_IP_ADDR], 0, 0) /* Partner blades such as IO BLADE or STORAGE BLADE raises a * blade status event when it recovers from degraded state. * The received event is checked for the power status of the blade. * If the power status is "POWER_ON", * then the sensors associated with blade is enabled based on * getBladeThermalInfoArray thermal response from the blade. */ if ((rpt->ResourceEntity.Entry[0].EntityType == SAHPI_ENT_IO_BLADE) || (rpt->ResourceEntity.Entry[0].EntityType == SAHPI_ENT_DISK_BLADE)) { /* Sometimes the DISK_BLADE does the power toggle upon the * reset of adjacent SYSTEM_BLADE. In effect to this, blade * status event is raised. Ignore the event, as the partner * blade is expected to get back to POWER ON state immediately */ if (oa_soap_bay_pwr_status[rpt->ResourceEntity.Entry[0]. EntityLocation -1] == SAHPI_POWER_ON) { dbg("Ignore the blade status event from the partner" " blade %d which is in POWER ON state", status->bayNumber); return; } if (status->powered == POWER_ON) { dbg("The blade has deasserted degraded state," " enable thermal sensors"); /* Make getBladeThermalInfoArray soap call */ thermal_request.bayNumber = status->bayNumber; rv = soap_getBladeThermalInfoArray(con, &thermal_request, &thermal_response); /* In addition to verifying return value from the soap * call, check whether the thermal response is NULL, * partner blade resource might have transitioned to * degraded state */ if ((rv != SA_OK) || (thermal_response.bladeThermalInfoArray == NULL)) { err("getBladeThermalInfo failed for blade or" "the blade %d is not in stable state", status->bayNumber); return; } /* Walk through the rdr list of the resource and enable * only those sensor which have the "SensorPresent" * value as "true" in getBladeThermalInfoArray response. * Rest of the statically modeled sensors remain in * disabled state. */ rv = oa_soap_set_thermal_sensor(oh_handler, rpt, &thermal_response, SAHPI_TRUE); if (rv != SA_OK) { err("Failed to enable the thermal sensor"); return;; } /* Set the power status of the partner blade as * POWER ON since the partner blade has recovered from * degraded state. After this event, the partner blade * power status should never change in * oa_soap_bay_pwr_status array */ oa_soap_bay_pwr_status[rpt->ResourceEntity.Entry[0]. EntityLocation -1] == SAHPI_POWER_ON; } else if (status->powered == POWER_OFF) { dbg("thermal sensors of blade already in disable state," " no action required"); } } return; } /** * oa_soap_serv_post_comp * @oh_handler : Pointer to openhpi handler structure * @con : Pointer to soap con structure * @bay_number : Bay number of the resource * * Purpose: * Processes the blade post complete event * * Detailed Description: NA * * Return values: * NONE **/ void oa_soap_serv_post_comp(struct oh_handler_state *oh_handler, SOAP_CON *con, SaHpiInt32T bay_number) { SaErrorT rv = SA_OK; SaHpiRptEntryT *rpt = NULL; struct getBladeThermalInfoArray thermal_request; struct bladeThermalInfoArrayResponse thermal_response; struct oa_soap_handler *oa_handler = NULL; SaHpiResourceIdT resource_id = -1; if (oh_handler == NULL) { err("Invalid parameters"); return; } oa_handler = (struct oa_soap_handler *) oh_handler->data; resource_id = oa_handler->oa_soap_resources.server.resource_id[bay_number -1]; rpt = oh_get_resource_by_id(oh_handler->rptcache, resource_id); if (rpt == NULL) { err("resource RPT is NULL"); return; } /* Make getBladeThermalInfoArray soap call */ thermal_request.bayNumber = bay_number; rv = soap_getBladeThermalInfoArray(con, &thermal_request, &thermal_response); /* In addition to verifying return value from the soap call, * Check whether the thermal response is NULL, * blade resource might have transitioned to POWER-OFF state * during the processing of this event hence resulting in * a NULL response */ if ((rv != SA_OK) || (thermal_response.bladeThermalInfoArray == NULL)) { err("getBladeThermalInfo failed for blade or" "the blade is not in stable state"); return; } /* Walk through the rdr list of the resource and enable only those * sensor which have the "SensorPresent" value as "true" in * getBladeThermalInfoArray response. Rest of the statically modeled * sensors remain in disabled state. */ rv = oa_soap_set_thermal_sensor(oh_handler, rpt, &thermal_response, SAHPI_TRUE); if (rv != SA_OK) { err("Failed to enable the thermal sensor"); return; } return; } /** * oa_soap_set_thermal_sensor * @oh_handler : Pointer to openhpi handler structure * @rpt : Pointer to rpt structure * @thermal_response: Pointer to bladeThermalInfoArray response structure * @enable_flag : Sensor Enable Flag * * Purpose: * Enables or Disables the thermal sensors associated with server blade * * Detailed Description: * - For Disable request of thermal sensor, the function walks through * the rdr list of the blade resource and disables only the thermal * sensors * - Also disable the user control to enable the thermal sensor. * - For Enable request of thermal sensors, following steps are done: * 1. Make soap getBladeThermalInfoArray soap call to the * blade resource. * 2. Walk through the rdr list of the resource and enable * only those thermal sensor which have the "SensorPresent" value * as "true" in getBladeThermalInfoArray response. * * Return values: * SA_OK - success. * SA_ERR_HPI_INTERNAL_ERROR - on failure **/ SaErrorT oa_soap_set_thermal_sensor(struct oh_handler_state *oh_handler, SaHpiRptEntryT *rpt, struct bladeThermalInfoArrayResponse *thermal_response, SaHpiBoolT enable_flag) { SaErrorT rv = SA_OK; SaHpiRdrT *rdr = NULL; struct bladeThermalInfo bld_thrm_info; struct extraDataInfo extra_data; if (oh_handler == NULL || rpt == NULL) { err("Invalid parameters"); return SA_ERR_HPI_INVALID_PARAMS; } rdr = oh_get_rdr_next(oh_handler->rptcache, rpt->ResourceId, SAHPI_FIRST_ENTRY); while (rdr) { if (rdr->RdrType == SAHPI_SENSOR_RDR) { if ((rdr->RdrTypeUnion.SensorRec.Num == OA_SOAP_SEN_TEMP_STATUS) || ((rdr->RdrTypeUnion.SensorRec.Num >= OA_SOAP_BLD_THRM_SEN_START) && (rdr->RdrTypeUnion.SensorRec.Num <= OA_SOAP_BLD_THRM_SEN_END))) { if (enable_flag == SAHPI_TRUE) { /* Verify with of the thermal * response to enable the sensor */ if (thermal_response == NULL) { err ("Valid thermal response" " required for processing" " sensor enable operation"); return SA_ERR_HPI_INTERNAL_ERROR; } /* Fetch the mapping bladeThermalInfo * structure instance from response for * for thermal sensor number to * whether the sensor can be enabled */ rv = oa_soap_get_bld_thrm_sen_data( rdr->RdrTypeUnion.SensorRec.Num, *thermal_response, &bld_thrm_info); if (rv != SA_OK) { err("Could not find the" " matching sensor"); return SA_ERR_HPI_INTERNAL_ERROR; } soap_getExtraData(bld_thrm_info. extraData, &extra_data); if ((extra_data.value != NULL) && (!(strcasecmp(extra_data.value, "false")))) { dbg("sensor can not be enabled"); rdr = oh_get_rdr_next( oh_handler->rptcache, rpt->ResourceId, rdr->RecordId); continue; } } rv = oa_soap_set_sensor_enable(oh_handler, rpt->ResourceId, rdr->RdrTypeUnion.SensorRec.Num, enable_flag); if (rv != SA_OK) { err("Sensor set failed"); return rv; } } } rdr = oh_get_rdr_next(oh_handler->rptcache, rpt->ResourceId, rdr->RecordId); } return SA_OK; } openhpi-2.14.1/plugins/oa_soap/oa_soap_event.c0000644000076400007640000016152011302566663016276 0ustar /* * Copyright (C) 2007-2009, Hewlett-Packard Development Company, LLP * All rights reserved. * * 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. * * Neither the name of the Hewlett-Packard Corporation, nor the names * of its contributors may be used to endorse or promote products * derived from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * Author(s) * Raghavendra P.G. * Mohan Devarajulu * * This file is having the code for handling the events which * are coming from OA. * * oa_soap_get_event() - this is not required in case of oa. it * is always "PULL" method used for * handling any type of signals from oa * * oa_soap_event_thread() - handles the oa events and pushes the * same into the framework queue * * oa_soap_error_handling() - handles the oa events based error * handling scenario. * * process_oa_out_of_access() - handles the oa, which went out of * access * * process_oa_events() - handles the oa events and calls * correct handler function for * different events **/ #include "oa_soap_event.h" /** * oa_soap_get_event * @oh_handler: Pointer to openhpi handler structure * * Purpose: * Gets the event from the plugin event queue. * Pushes the event to infrastructure * * Detailed Description: NA * * Return values: * 1 - on pushing the event to infrastructure. * 0 - if there are no events in the plugin to push thru this function. **/ int oa_soap_get_event(void *oh_handler) { /* Since OA sends the events on any changes to resources * Using this function, OA need not to be polled for resource state * changes. This method always returns 0 * * No events for infra-structure to process */ return 0; } /** * event_thread * @oa_pointer: Pointer to the oa_info structure for this thread. * * Purpose: * Gets the event from the OA. * Processes the OA event and pushes the event to infrastructure * * Detailed Description: NA * * Return values: * (gpointer *) SA_OK - on success. * (gpointer *) SA_ERR_HPI_INVALID_PARAMS - on wrong parameters * (gpointer *) SA_ERR_HPI_INTERNAL_ERROR - on failure. **/ gpointer oa_soap_event_thread(gpointer oa_pointer) { SaErrorT rv = SA_OK; struct getAllEvents request; struct getAllEventsResponse response; struct oh_handler_state *handler = NULL; struct oa_info *oa = NULL; int ret_code = SA_ERR_HPI_INVALID_PARAMS; int retry_on_switchover = 0; struct oa_soap_handler *oa_handler = NULL; SaHpiBoolT is_plugin_initialized = SAHPI_FALSE; SaHpiBoolT is_discovery_completed = SAHPI_FALSE; SaHpiBoolT listen_for_events = SAHPI_TRUE; char *user_name, *password, url[MAX_URL_LEN]; if (oa_pointer == NULL) { err("Invalid parameter"); g_thread_exit(&ret_code); } /* Extract the oh_handler and oa_info structure from oa_pointer */ oa = (struct oa_info *)oa_pointer; handler = oa->oh_handler; oa_handler = handler->data; dbg("OA SOAP event thread started for OA %s", oa->server); /* Check whether the plugin is initialized. * If not, wait till plugin gets initialized */ while (is_plugin_initialized == SAHPI_FALSE) { OA_SOAP_CHEK_SHUTDOWN_REQ(oa_handler, NULL, NULL, NULL); g_mutex_lock(oa_handler->mutex); if (oa_handler->status == PRE_DISCOVERY || oa_handler->status == DISCOVERY_COMPLETED) { g_mutex_unlock(oa_handler->mutex); is_plugin_initialized = SAHPI_TRUE; } else { g_mutex_unlock(oa_handler->mutex); dbg("Waiting for the plugin initialization " "to complete."); sleep(2); } } /* Check whether the discovery is over. * If not, wait till discovery gets completed */ while (is_discovery_completed == SAHPI_FALSE) { OA_SOAP_CHEK_SHUTDOWN_REQ(oa_handler, NULL, NULL, NULL); g_mutex_lock(oa_handler->mutex); if (oa_handler->status == DISCOVERY_COMPLETED) { g_mutex_unlock(oa_handler->mutex); is_discovery_completed = SAHPI_TRUE; } else { g_mutex_unlock(oa_handler->mutex); dbg("Waiting for the discovery to complete."); sleep(2); } } /* If the OA server is NULL, do not even try to open the connection just get out */ if (!strcmp(oa->server,"")) { err("oa->server is NULL. Exiting the thread"); g_thread_exit((gpointer *)NULL); } /* The following is an workaround for an OA bug, where the IP is returned as 0.0.0.0 Just quit in that case also */ if (!strcmp(oa->server,"0.0.0.0")) { err("OA returned IP is 0.0.0.0."); g_thread_exit((gpointer *)NULL); } /* Check whether OA Status is ABSENT * If yes, wait till the OA status becomes ACTIVE or STANDBY */ g_mutex_lock(oa->mutex); if (oa->oa_status != OA_ABSENT) { g_mutex_unlock(oa->mutex); } else { g_mutex_unlock(oa->mutex); process_oa_out_of_access(handler, oa); } /* Get the user_name and password from config file */ user_name = (char *) g_hash_table_lookup(handler->config, "OA_User_Name"); password = (char *) g_hash_table_lookup(handler->config, "OA_Password"); /* Check whether the OA is accessible or not * If the OA is not accessible or OA is not present, * then SOAP_CON will be NULL, try to create the OA connection */ if (oa->event_con == NULL) { /* This call will not return until the OA connection is * established */ create_oa_connection(oa_handler, oa, user_name, password); rv = create_event_session(oa); /* Sleep for a second, let OA stabilize * TODO: Remove this workaround, when OA has the fix */ sleep(1); } /* Ideally, the soap_open should pass in 1st try. * If not, try until soap_open succeeds */ memset(url, 0, MAX_URL_LEN); snprintf(url, strlen(oa->server) + strlen(PORT) + 1, "%s" PORT, oa->server); while (oa->event_con2 == NULL) { OA_SOAP_CHEK_SHUTDOWN_REQ(oa_handler, NULL, NULL, NULL); oa->event_con2 = soap_open(url, user_name, password, HPI_CALL_TIMEOUT); if (oa->event_con2 == NULL) sleep(2); } /* Intialize the event request structure */ request.pid = oa->event_pid; request.waitTilEventHappens = HPOA_TRUE; request.lcdEvents = HPOA_FALSE; /* Listen for the events from OA */ while (listen_for_events == SAHPI_TRUE) { OA_SOAP_CHEK_SHUTDOWN_REQ(oa_handler, NULL, NULL, NULL); rv = soap_getAllEvents(oa->event_con, &request, &response); if (rv == SOAP_OK) { retry_on_switchover = 0; /* OA returns empty event response payload for LCD * status change events. Ignore empty event response. */ if (response.eventInfoArray == NULL) { dbg("Ignoring empty event response"); } else process_oa_events(handler, oa, &response); } else { /* On switchover, the standby-turned-active OA stops * responding to SOAP calls to avoid the network loop. * This change is applicable from OA firmware version * 2.21. Re-try the getAllEvents SOAP XML call skipping * the error handling. */ if (oa->oa_status == STANDBY && get_oa_fw_version(handler) >= OA_2_21 && retry_on_switchover < MAX_RETRY_ON_SWITCHOVER) { sleep(WAIT_ON_SWITCHOVER); dbg("getAllEvents call failed, may be due to " "OA switchover"); dbg("Re-try the getAllEvents SOAP call"); retry_on_switchover++; } else { /* Try to recover from the error */ err("OA %s may not be accessible", oa->server); oa_soap_error_handling(handler, oa); request.pid = oa->event_pid; /* Re-initialize the con */ if (oa->event_con2 != NULL) { soap_close(oa->event_con2); oa->event_con2 = NULL; } memset(url, 0, MAX_URL_LEN); snprintf(url, strlen(oa->server) + strlen(PORT) + 1, "%s" PORT, oa->server); /* Ideally, the soap_open should pass in * 1st try. If not, try until soap_open succeeds */ while (oa->event_con2 == NULL) { OA_SOAP_CHEK_SHUTDOWN_REQ(oa_handler, NULL, NULL, NULL); oa->event_con2 = soap_open(url, user_name, password, HPI_CALL_TIMEOUT); if (oa->event_con2 == NULL) { if (oa->oa_status == OA_ABSENT) sleep(60); else sleep(5); err("soap_open for oa->event_con2 failed\n"); } } } /* end of else (non-switchover error handling) */ } /* end of else (SOAP call failure handling) */ } /* end of 'while(listen_for_events == SAHPI_TRUE)' loop */ return (gpointer *) SA_OK; } /** * oa_soap_error_handling * @oa_handler: Pointer to the OA SOAP handler structure * @oa: Pointer to the oa info structure * * Purpose: * Process the OA error and establishes the connection with OA * Calls the re-discovery if the OA status is ACTIVE * * Detailed Description: NA * * Return values: * NONE - void return, as it is comes out only on recovering from the * problem. **/ void oa_soap_error_handling(struct oh_handler_state *oh_handler, struct oa_info *oa) { SaErrorT rv = SA_OK; int is_switchover = SAHPI_FALSE; SaHpiBoolT is_oa_accessible = SAHPI_FALSE; struct oa_soap_handler *oa_handler = NULL; SaHpiInt32T error_code; char *user_name = NULL, *password = NULL; if (oh_handler == NULL || oa == NULL) { err("Invalid parameters"); return; } oa_handler = (struct oa_soap_handler *) oh_handler->data; /* If the OA is not PRESENT, then do not even try. Just get out */ if ( oa->oa_status == OA_ABSENT ) return; /* Check whether OA was present. If not, event_con will be NULL */ g_mutex_lock(oa->mutex); if (oa->event_con == NULL) { g_mutex_unlock(oa->mutex); /* Get the user_name and password from config file */ user_name = (char *) g_hash_table_lookup(oh_handler->config, "OA_User_Name"); password = (char *) g_hash_table_lookup(oh_handler->config, "OA_Password"); /* Create the OA connection */ create_oa_connection(oa_handler, oa, user_name, password); /* OA session is established. Set the error_code to SOAP_OK * to skip the processing for OA out of access */ error_code = SOAP_OK; } else { error_code = soap_error_number(oa->event_con); g_mutex_unlock(oa->mutex); } /* This loop ends when the OA is accessible */ while (is_oa_accessible == SAHPI_FALSE) { OA_SOAP_CHEK_SHUTDOWN_REQ(oa_handler, NULL, NULL, NULL); /* Check whether the failure is not due to OA event session * expiry */ if (error_code != SOAP_OK || error_code != ERR_EVENT_PIPE || error_code != ERR_EVENT_DAEMON_KILLED) { /* OA may not be reachable, try to establish the * connection */ process_oa_out_of_access(oh_handler, oa); } /* Create a fresh event session */ rv = create_event_session(oa); if (rv != SA_OK) { /* Set the error code to -1 to make sure * recovery for OA out of access is recovery is done */ error_code = -1; continue; } /* Sleep for a second, let OA stabilize * TODO: Remove this workaround, when OA has the fix */ sleep(1); is_oa_accessible = SAHPI_TRUE; if (oa->oa_status == ACTIVE) { /* Always lock the oa_handler mutex and then oa_info * mutex. This is to avoid the deadlock. */ g_mutex_lock(oa_handler->mutex); g_mutex_lock(oa->mutex); /* Re-discover the resources as there is a high chances * that we might have missed some events */ OA_SOAP_CHEK_SHUTDOWN_REQ(oa_handler, oa_handler->mutex, oa->mutex, NULL); rv = oa_soap_re_discover_resources(oh_handler, oa, is_switchover); g_mutex_unlock(oa->mutex); g_mutex_unlock(oa_handler->mutex); if (rv != SA_OK) { is_oa_accessible = SAHPI_FALSE; err("Re-discovery failed for OA %s", oa->server); /* Set the error code to -1 to make sure * recovery for OA out of access is recovery * is done */ error_code = -1; } } } err("OA %s is accessible", oa->server); return; } /** * process_oa_out_of_access * @oa_handler: Pointer to the OA SOAP handler structure * @oa: Pointer to the oa info structure * * Purpose: * Try to establish the connection with OA * * Detailed Description: NA * * Return values: * NONE - void return, as this function only on OA is reachable **/ void process_oa_out_of_access(struct oh_handler_state *oh_handler, struct oa_info *oa) { SaErrorT rv = SA_OK; struct oa_soap_handler *oa_handler = NULL; GTimer *timer = NULL; gulong micro_seconds; gdouble time_elapsed = 0.0, timeout = 2.0; SaHpiBoolT is_oa_reachable = SAHPI_FALSE; SaHpiBoolT is_oa_present = SAHPI_FALSE; SaHpiBoolT oa_was_removed = SAHPI_FALSE; char *user_name = NULL, *password = NULL; if (oh_handler == NULL || oa == NULL) { err("Invalid parameters"); return; } /* Get the user_name and password from config file */ user_name = (char *) g_hash_table_lookup(oh_handler->config, "OA_User_Name"); password = (char *) g_hash_table_lookup(oh_handler->config, "OA_Password"); oa_handler = (struct oa_soap_handler *) oh_handler->data; /* Start a timer */ timer = g_timer_new(); /* This loop ends after OA is accessible */ while (is_oa_reachable == SAHPI_FALSE) { OA_SOAP_CHEK_SHUTDOWN_REQ(oa_handler, NULL, NULL, timer); /* Check whether the OA is present. * If not, wait till the OA is inserted */ is_oa_present = SAHPI_FALSE; while (is_oa_present == SAHPI_FALSE) { OA_SOAP_CHEK_SHUTDOWN_REQ(oa_handler, NULL, NULL, timer); g_mutex_lock(oa->mutex); if (oa->oa_status != OA_ABSENT) { g_mutex_unlock(oa->mutex); is_oa_present = SAHPI_TRUE; time_elapsed = 0.0; } else { g_mutex_unlock(oa->mutex); time_elapsed = g_timer_elapsed(timer, µ_seconds); /* Break the loop on reaching timeout value */ if (time_elapsed >= timeout) break; oa_was_removed = SAHPI_TRUE; /* OA is not present, * wait for 30 seconds and check again */ sleep(30); } } /* The re-establishing oa connection on timeout for the extracted * OA is done for handling the below scenario * * Say, Active OA is in slot 1 and standby OA is in slot 2. * 1. Remove the active OA (slot 1) which results in * switchover. OA in slot status is set to ABSENT. * 2. After sometime (atleast 10 mins) current Active OA (slot 2) * is extracted. At this stage, there is no OA in the * c-Class enclosure. * 3. OA in slot 1 is inserted back. * This leads to a hang situation as the event thread for slot 1 * is not aware of the OA insertion. * * But, if the OA in slot 1 is put into a different enclosure * (with the same IP, user name and password) * then OA SOAP plugin becomes unstable and may lead to crash. */ if (time_elapsed >= timeout) { if (oa->event_con == NULL) { rv = initialize_oa_con(oa, user_name, password); if (rv != SA_OK) { /* OA is not accessible. * Restart the timer */ g_timer_start(timer); /* Double the timeout value until it * reaches MAX_TIMEOUT */ if (timeout < MAX_TIMEOUT) { timeout = timeout * 2; if (timeout > MAX_TIMEOUT) timeout = MAX_TIMEOUT; } continue; } } /* Since the OA connection is re-establised, change the * state of oa_was_removed to false */ oa_was_removed = SAHPI_FALSE; } /* Check whether OA got removed and inserted back. * If yes, re-initialize the soap_con structures. * This creates soap_con structure with the * inserted OA IP address */ if (oa_was_removed == SAHPI_TRUE) { /* Cleanup the timer */ g_timer_destroy(timer); /* Create the OA connection */ create_oa_connection(oa_handler, oa, user_name, password); /* OA connection is established. Hence break the loop * and return to the calling function */ return; } else { rv = check_oa_status(oa_handler, oa, oa->event_con); if (rv == SA_OK) { is_oa_reachable = SAHPI_TRUE; } else { /* If switchover is in progress, then sleep longer */ if (( oa_handler->oa_switching == SAHPI_TRUE ) || ( oa->oa_status == OA_ABSENT )) sleep(30); else sleep(2); dbg("check_oa_status failed, oa_status is %d\n",oa->oa_status); /* OA is not accessible. Restart the timer */ g_timer_start(timer); /* Double the timeout value until it reaches * MAX_TIMEOUT */ if (time_elapsed >= timeout && timeout < MAX_TIMEOUT) { timeout = timeout * 2; if (timeout > MAX_TIMEOUT) timeout = MAX_TIMEOUT; } } } } /* Cleanup the timer */ g_timer_destroy(timer); return; } /** * process_oa_events * @oh_handler: Pointer to the openhpi handler structure * @oa: Pointer to the oa_info structure * @con: Pointer to the SOAP_CON structure * @response: Pointer to the oa event response * * Purpose: * Process the oa event and creates the hpi event structure. * * Detailed Description: NA * * Return values: * NONE - void return, as this function processes the events **/ void process_oa_events(struct oh_handler_state *oh_handler, struct oa_info *oa, struct getAllEventsResponse *response) { SaErrorT rv; SaHpiInt32T loc=0; struct eventInfo event; struct oa_soap_handler *oa_handler = NULL; if (response == NULL || oa == NULL || oh_handler == NULL) { err("Invalid parameter"); return; } oa_handler = (struct oa_soap_handler *) oh_handler->data; /* Extract the events from eventInfoArray */ while (response->eventInfoArray) { OA_SOAP_CHEK_SHUTDOWN_REQ(oa_handler, NULL, NULL, NULL); /* Get the event from eventInfoArray */ soap_getEventInfo(response->eventInfoArray, &event); switch (event.event) { case EVENT_HEARTBEAT: dbg("HEART BEAT EVENT"); break; case EVENT_ENC_STATUS: dbg("EVENT_ENC_STATUS"); oa_soap_proc_enc_status(oh_handler, &(event.eventData.enclosureStatus)); break; case EVENT_ENC_UID: dbg("EVENT_ENC_UID -- Not processed"); break; case EVENT_ENC_SHUTDOWN: dbg("EVENT_ENC_SHUTDOWN"); oa_soap_proc_enc_status(oh_handler, &(event.eventData.enclosureStatus)); break; case EVENT_ENC_INFO: dbg("EVENT_ENC_INFO -- Not processed"); break; case EVENT_ENC_NAMES: dbg("EVENT_ENC_NAMES -- Not processed"); break; case EVENT_USER_PERMISSION: dbg("EVENT_USER_PERMISSION -- Not processed"); break; case EVENT_ADMIN_RIGHTS_CHANGED: dbg("EVENT_ADMIN_RIGHTS_CHANGED " "-- Not processed"); break; case EVENT_ENC_SHUTDOWN_PENDING: dbg("EVENT_ENC_SHUTDOWN_PENDING"); oa_soap_proc_enc_status(oh_handler, &(event.eventData.enclosureStatus)); break; case EVENT_ENC_TOPOLOGY: dbg("EVENT_ENC_TOPOLOGY -- Not processed"); break; case EVENT_FAN_STATUS: dbg("EVENT_FAN_STATUS"); oa_soap_proc_fan_status(oh_handler, &(event.eventData.fanInfo)); break; case EVENT_FAN_INSERTED: dbg("EVENT_FAN_INSERTED"); rv = process_fan_insertion_event(oh_handler, oa->event_con2, &event); break; case EVENT_FAN_REMOVED: dbg("EVENT_FAN_REMOVED"); rv = process_fan_extraction_event(oh_handler, &event); break; case EVENT_FAN_GROUP_STATUS: dbg("EVENT_FAN_GROUP_STATUS -- Not processed"); break; case EVENT_THERMAL_STATUS: dbg("EVENT_THERMAL_STATUS -- Not processed"); break; case EVENT_COOLING_STATUS: dbg("EVENT_COOLING_STATUS"); oa_soap_proc_therm_subsys_info(oh_handler, &(event.eventData.thermalSubsystemInfo)); break; case EVENT_FAN_ZONE_STATUS: dbg("EVENT_FAN_ZONE_STATUS"); oa_soap_proc_fz_status(oh_handler, &(event.eventData.fanZone)); break; case EVENT_PS_STATUS: dbg("EVENT_PS_STATUS"); oa_soap_proc_ps_status(oh_handler, &(event.eventData.powerSupplyStatus)); break; case EVENT_PS_INSERTED: dbg("EVENT_PS_INSERTED"); rv = process_ps_insertion_event(oh_handler, oa->event_con2, &event); break; case EVENT_PS_REMOVED: dbg("EVENT_PS_REMOVED"); rv = process_ps_extraction_event(oh_handler, &event); break; case EVENT_PS_REDUNDANT: dbg("EVENT_PS_REDUNDANT"); oa_soap_proc_ps_subsys_info(oh_handler, &(event.eventData.powerSubsystemInfo)); break; case EVENT_PS_OVERLOAD: dbg("EVENT_PS_OVERLOAD"); oa_soap_proc_ps_subsys_info(oh_handler, &(event.eventData.powerSubsystemInfo)); break; case EVENT_AC_FAILURE: dbg("EVENT_AC_FAILURE -- Not processed"); break; case EVENT_PS_INFO: dbg("EVENT_PS_INFO -- Not processed"); break; case EVENT_PS_SUBSYSTEM_STATUS: dbg("EVENT_PS_SUBSYSTEM_STATUS"); oa_soap_proc_ps_subsys_info(oh_handler, &(event.eventData.powerSubsystemInfo)); break; case EVENT_SERVER_POWER_REDUCTION_STATUS: dbg("EVENT_SERVER_POWER_REDUCTION_STATUS " "-- Not processed"); break; case EVENT_INTERCONNECT_STATUS: dbg("EVENT_INTERCONNECT_STATUS"); oa_soap_proc_interconnect_status(oh_handler, &(event.eventData.interconnectTrayStatus)); break; case EVENT_INTERCONNECT_RESET: dbg("EVENT_INTERCONNECT_RESET"); rv = process_interconnect_reset_event( oh_handler, &event); break; case EVENT_INTERCONNECT_UID: dbg("EVENT_INTERCONNECT_UID -- Not processed"); break; case EVENT_INTERCONNECT_INSERTED: dbg("EVENT_INTERCONNECT_INSERTED"); rv = process_interconnect_insertion_event( oh_handler, oa->event_con2, &event); break; case EVENT_INTERCONNECT_REMOVED: dbg("EVENT_INTERCONNECT_REMOVED"); rv = process_interconnect_extraction_event( oh_handler, &event); break; case EVENT_INTERCONNECT_INFO: dbg("EVENT_INTERCONNECT_INFO -- Not processed"); break; case EVENT_INTERCONNECT_HEALTH_LED: dbg("EVENT_INTERCONNECT_HEALTH_LED " "-- Not processed"); break; case EVENT_INTERCONNECT_THERMAL: dbg("EVENT_INTERCONNECT_THERMAL"); oa_soap_proc_interconnect_thermal(oh_handler, oa->event_con2, &(event.eventData. interconnectTrayStatus)); break; case EVENT_INTERCONNECT_CPUFAULT: dbg("EVENT_INTERCONNECT_CPUFAULT " "-- Not processed"); break; case EVENT_INTERCONNECT_POWER: dbg("EVENT_INTERCONNECT_POWER"); rv = process_interconnect_power_event( oh_handler, &event); break; case EVENT_INTERCONNECT_PORTMAP: dbg("EVENT_INTERCONNECT_PORTMAP " "-- Not processed"); break; case EVENT_BLADE_PORTMAP: dbg("EVENT_BLADE_PORTMAP -- Not processed"); break; case EVENT_INTERCONNECT_VENDOR_BLOCK: dbg("EVENT_INTERCONNECT_VENDOR_BLOCK " "-- Not processed"); break; case EVENT_INTERCONNECT_HEALTH_STATE: dbg("EVENT_INTERCONNECT_HEALTH_STATE"); oa_soap_proc_interconnect_status(oh_handler, &(event.eventData.interconnectTrayStatus)); break; case EVENT_DEMO_MODE: dbg("EVENT_DEMO_MODE -- Not processed"); break; case EVENT_BLADE_STATUS: dbg("EVENT_BLADE_STATUS"); oa_soap_proc_server_status(oh_handler, oa->event_con2, &(event.eventData.bladeStatus)); break; case EVENT_BLADE_INSERTED: dbg("EVENT_BLADE_INSERTED -- Not processed"); break; case EVENT_BLADE_REMOVED: dbg("EVENT_BLADE_REMOVED"); rv = process_server_extraction_event(oh_handler, &event); break; case EVENT_BLADE_POWER_STATE: dbg("EVENT_BLADE_POWER_STATE"); process_server_power_event(oh_handler, oa->event_con2, &event); break; case EVENT_BLADE_POWER_MGMT: dbg("EVENT_BLADE_POWER_MGMT -- Not processed"); break; case EVENT_BLADE_UID: dbg("EVENT_BLADE_UID -- Not processed"); break; case EVENT_BLADE_SHUTDOWN: dbg("EVENT_BLADE_SHUTDOWN"); oa_soap_proc_server_status(oh_handler, oa->event_con2, &(event.eventData.bladeStatus)); break; case EVENT_BLADE_FAULT: dbg("EVENT_BLADE_FAULT"); oa_soap_proc_server_status(oh_handler, oa->event_con2, &(event.eventData.bladeStatus)); break; case EVENT_BLADE_INFO: dbg("EVENT_BLADE_INFO -- Not processed"); break; case EVENT_BLADE_MP_INFO: dbg("EVENT_BLADE_MP_INFO -- Not processed"); break; case EVENT_ILO_READY: dbg("EVENT_ILO_READY -- Not processed"); break; case EVENT_LCD_BUTTON: dbg("EVENT_LCD_BUTTON -- Not processed"); break; case EVENT_KEYING_ERROR: dbg("EVENT_KEYING_ERROR -- Not processed"); break; case EVENT_ILO_HAS_IPADDRESS: dbg("EVENT_ILO_HAS_IPADDRESS -- Not processed"); break; case EVENT_POWER_INFO: dbg("EVENT_POWER_INFO -- Not processed"); break; case EVENT_LCD_STATUS: dbg("EVENT_LCD_STATUS"); oa_soap_proc_lcd_status(oh_handler, &(event.eventData.lcdStatus)); break; case EVENT_LCD_INFO: dbg("EVENT_LCD_INFO -- Not processed"); break; case EVENT_REDUNDANCY: dbg("EVENT_REDUNDANCY -- Not processed"); break; case EVENT_ILO_DEAD: dbg("EVENT_ILO_DEAD"); oa_soap_proc_server_status(oh_handler, oa->event_con2, &(event.eventData.bladeStatus)); break; case EVENT_RACK_SERVICE_STARTED: dbg("EVENT_RACK_SERVICE_STARTED " "-- Not processed"); break; case EVENT_LCD_SCREEN_REFRESH: dbg("EVENT_LCD_SCREEN_REFRESH " "-- Not processed"); break; case EVENT_ILO_ALIVE: dbg("EVENT_ILO_ALIVE"); oa_soap_proc_server_status(oh_handler, oa->event_con2, &(event.eventData.bladeStatus)); break; case EVENT_PERSONALITY_CHECK: dbg("EVENT_PERSONALITY_CHECK -- Not processed"); break; case EVENT_BLADE_POST_COMPLETE: dbg("EVENT_BLADE_POST_COMPLETE"); oa_soap_serv_post_comp(oh_handler, oa->event_con2, event.numValue); break; case EVENT_BLADE_SIGNATURE_CHANGED: dbg("EVENT_BLADE_SIGNATURE_CHANGED " "-- Not processed"); break; case EVENT_BLADE_PERSONALITY_CHANGED: dbg("EVENT_BLADE_PERSONALITY_CHANGED " "-- Not processed"); break; case EVENT_BLADE_TOO_LOW_POWER: dbg("EVENT_BLADE_TOO_LOW_POWER " "-- Not processed"); break; case EVENT_VIRTUAL_MEDIA_STATUS: dbg("EVENT_VIRTUAL_MEDIA_STATUS " "-- Not processed"); break; case EVENT_MEDIA_DRIVE_INSERTED: dbg("EVENT_MEDIA_DRIVE_INSERTED " "-- Not processed"); break; case EVENT_MEDIA_DRIVE_REMOVED: dbg("EVENT_MEDIA_DRIVE_REMOVED " "-- Not processed"); break; case EVENT_MEDIA_INSERTED: /* EVENT_OA_INFO that arrives later is processed */ dbg("EVENT_MEDIA_INSERTED -- Not processed"); break; case EVENT_MEDIA_REMOVED: dbg("EVENT_MEDIA_REMOVED -- Not processed"); break; case EVENT_OA_NAMES: dbg("EVENT_OA_NAMES -- Not processed"); break; case EVENT_OA_STATUS: dbg("EVENT_OA_STATUS"); oa_soap_proc_oa_status(oh_handler, &(event.eventData.oaStatus)); break; case EVENT_OA_UID: dbg("EVENT_OA_UID -- Not processed"); break; case EVENT_OA_INSERTED: dbg("EVENT_OA_INSERTED -- Not processed"); break; case EVENT_OA_REMOVED: dbg("EVENT_OA_REMOVED"); rv = process_oa_extraction_event(oh_handler, &event); break; case EVENT_OA_INFO: dbg("EVENT_OA_INFO"); rv = process_oa_info_event(oh_handler, oa->event_con2, &event); break; case EVENT_OA_FAILOVER: dbg("EVENT_OA_FAILOVER"); rv = process_oa_failover_event(oh_handler, oa); /* We have done the re-discovery as part of * FAILOVER event processing. Ignore the * events that are recived along with FAILOVER. */ return; break; case EVENT_OA_TRANSITION_COMPLETE: dbg("EVENT_OA_TRANSITION_COMPLETE " "-- Not processed"); break; case EVENT_OA_VCM: dbg("EVENT_OA_VCM -- Not processed"); break; case EVENT_NETWORK_INFO_CHANGED: dbg("EVENT_NETWORK_INFO_CHANGED " "-- Not processed"); break; case EVENT_SNMP_INFO_CHANGED: dbg("EVENT_SNMP_INFO_CHANGED -- Not processed"); break; case EVENT_SYSLOG_CLEARED: dbg("EVENT_SYSLOG_CLEARED -- Not processed"); break; case EVENT_SESSION_CLEARED: dbg("EVENT_SESSION_CLEARED -- Not processed"); break; case EVENT_TIME_CHANGE: dbg("EVENT_TIME_CHANGE -- Not processed"); break; case EVENT_SESSION_STARTED: dbg("EVENT_SESSION_STARTED -- Not processed"); break; case EVENT_BLADE_CONNECT: dbg("EVENT_BLADE_CONNECT -- Not processed"); break; case EVENT_BLADE_DISCONNECT: dbg("EVENT_BLADE_DISCONNECT -- Not processed"); break; case EVENT_SWITCH_CONNECT: dbg("EVENT_SWITCH_CONNECT -- Not processed"); break; case EVENT_SWITCH_DISCONNECT: dbg("EVENT_SWITCH_DISCONNECT -- Not processed"); break; case EVENT_BLADE_CLEARED: dbg("EVENT_BLADE_CLEARED -- Not processed"); break; case EVENT_SWITCH_CLEARED: dbg("EVENT_SWITCH_CLEARED -- Not processed"); break; case EVENT_ALERTMAIL_INFO_CHANGED: dbg("EVENT_ALERTMAIL_INFO_CHANGED " "-- Not processed"); break; case EVENT_LDAP_INFO_CHANGED: dbg("EVENT_LDAP_INFO_CHANGED -- Not processed"); break; case EVENT_EBIPA_INFO_CHANGED: dbg("EVENT_EBIPA_INFO_CHANGED " "-- Not processed"); break; case EVENT_HPSIM_TRUST_MODE_CHANGED: dbg("EVENT_HPSIM_TRUST_MODE_CHANGED " "-- Not processed"); break; case EVENT_HPSIM_CERTIFICATE_ADDED: dbg("EVENT_HPSIM_CERTIFICATE_ADDED " "-- Not processed"); break; case EVENT_HPSIM_CERTIFICATE_REMOVED: dbg("EVENT_HPSIM_CERTIFICATE_REMOVED " "-- Not processed"); break; case EVENT_USER_INFO_CHANGED: dbg("EVENT_USER_INFO_CHANGED -- Not processed"); break; case EVENT_BAY_CHANGED: dbg("EVENT_BAY_CHANGED -- Not processed"); break; case EVENT_GROUP_CHANGED: dbg("EVENT_GROUP_CHANGED -- Not processed"); break; case EVENT_OA_REBOOT: dbg("EVENT_OA_REBOOT -- Not processed"); break; case EVENT_OA_LOGOFF_REQUEST: dbg("EVENT_OA_LOGOFF_REQUEST -- Not processed"); break; case EVENT_USER_ADDED: dbg("EVENT_USER_ADDED -- Not processed"); break; case EVENT_USER_DELETED: dbg("EVENT_USER_DELETED -- Not processed"); break; case EVENT_USER_ENABLED: dbg("EVENT_USER_ENABLED -- Not processed"); break; case EVENT_USER_DISABLED: dbg("EVENT_USER_DISABLED -- Not processed"); break; case EVENT_GROUP_ADDED: dbg("EVENT_GROUP_ADDED -- Not processed"); break; case EVENT_GROUP_DELETED: dbg("EVENT_GROUP_DELETED -- Not processed"); break; case EVENT_LDAPGROUP_ADDED: dbg("EVENT_LDAPGROUP_ADDED -- Not processed"); break; case EVENT_LDAPGROUP_DELETED: dbg("EVENT_LDAPGROUP_DELETED -- Not processed"); break; case EVENT_LDAPGROUP_ADMIN_RIGHTS_CHANGED: dbg("EVENT_LDAPGROUP_ADMIN_RIGHTS_CHANGED " "-- Not processed"); break; case EVENT_LDAPGROUP_INFO_CHANGED: dbg("EVENT_LDAPGROUP_INFO_CHANGED " "-- Not processed"); break; case EVENT_LDAPGROUP_PERMISSION: dbg("EVENT_LDAPGROUP_PERMISSION " "-- Not processed"); break; case EVENT_LCDPIN: dbg("EVENT_LCDPIN -- Not processed"); break; case EVENT_LCD_USER_NOTES_CHANGED: dbg("EVENT_LCD_USER_NOTES_CHANGED " "-- Not processed"); break; case EVENT_LCD_BUTTONS_LOCKED: dbg("EVENT_LCD_BUTTONS_LOCKED " "-- Not processed"); break; case EVENT_LCD_SCREEN_CHAT_REQUESTED: dbg("EVENT_LCD_SCREEN_CHAT_REQUESTED " "-- Not processed"); break; case EVENT_LCD_SCREEN_CHAT_WITHDRAWN: dbg("EVENT_LCD_SCREEN_CHAT_WITHDRAWN " "-- Not processed"); break; case EVENT_LCD_SCREEN_CHAT_ANSWERED: dbg("EVENT_LCD_SCREEN_CHAT_ANSWERED " "-- Not processed"); break; case EVENT_LCD_USER_NOTES_IMAGE_CHANGED: dbg("EVENT_LCD_USER_NOTES_IMAGE_CHANGED " "-- Not processed"); break; case EVENT_ENC_WIZARD_STATUS: dbg("EVENT_ENC_WIZARD_STATUS -- Not processed"); break; case EVENT_SSHKEYS_INSTALLED: dbg("EVENT_SSHKEYS_INSTALLED -- Not processed"); break; case EVENT_SSHKEYS_CLEARED: dbg("EVENT_SSHKEYS_CLEARED -- Not processed"); break; case EVENT_LDAP_DIRECTORY_SERVER_CERTIFICATE_ADDED: dbg("EVENT_LDAP_DIRECTORY_SERVER_CERTIFICATE_" "ADDED -- Not processed"); break; case EVENT_LDAP_DIRECTORY_SERVER_CERTIFICATE_REMOVED: dbg("EVENT_LDAP_DIRECTORY_SERVER_CERTIFICATE_" "REMOVED -- Not processed"); break; case EVENT_BLADE_BOOT_CONFIG: dbg("EVENT_BLADE_BOOT_CONFIG -- Not processed"); break; case EVENT_OA_NETWORK_CONFIG_CHANGED: dbg("EVENT_OA_NETWORK_CONFIG_CHANGED"); oa_soap_proc_oa_network_info(oh_handler, &(event.eventData.oaNetworkInfo)); break; case EVENT_HPSIM_XENAME_ADDED: dbg("EVENT_HPSIM_XENAME_ADDED " "-- Not processed"); break; case EVENT_HPSIM_XENAME_REMOVED: dbg("EVENT_HPSIM_XENAME_REMOVED " "-- Not processed"); break; case EVENT_FLASH_PENDING: dbg("EVENT_FLASH_PENDING -- Not processed"); break; case EVENT_FLASH_STARTED: dbg("EVENT_FLASH_STARTED -- Not processed"); break; case EVENT_FLASH_PROGRESS: dbg("EVENT_FLASH_PROGRESS -- Not processed"); break; case EVENT_FLASH_COMPLETE: dbg("EVENT_FLASH_COMPLETE -- Not processed"); break; case EVENT_STANDBY_FLASH_STARTED: dbg("EVENT_STANDBY_FLASH_STARTED " "-- Not processed"); break; case EVENT_STANDBY_FLASH_PROGRESS: dbg("EVENT_STANDBY_FLASH_PROGRESS " "-- Not processed"); break; case EVENT_STANDBY_FLASH_COMPLETE: dbg("EVENT_STANDBY_FLASH_COMPLETE " "-- Not processed"); break; case EVENT_STANDBY_FLASH_BOOTING: dbg("EVENT_STANDBY_FLASH_BOOTING " "-- Not processed"); break; case EVENT_STANDBY_FLASH_BOOTED: dbg("EVENT_STANDBY_FLASH_BOOTED " "-- Not processed"); break; case EVENT_STANDBY_FLASH_FAILED: dbg("EVENT_STANDBY_FLASH_FAILED " "-- Not processed"); break; case EVENT_FLASHSYNC_BUILD: dbg("EVENT_FLASHSYNC_BUILD -- Not processed"); break; case EVENT_FLASHSYNC_BUILDDONE: dbg("EVENT_FLASHSYNC_BUILDDONE " "-- Not processed"); break; case EVENT_FLASHSYNC_FAILED: dbg("EVENT_FLASHSYNC_FAILED -- Not processed"); break; case EVENT_FLASHSYNC_STANDBY_BUILD: dbg("EVENT_FLASHSYNC_STANDBY_BUILD " "-- Not processed"); break; case EVENT_FLASHSYNC_STANDBY_BUILDDONE: dbg("EVENT_FLASHSYNC_STANDBY_BUILDDONE " "-- Not processed"); break; case EVENT_FLASHSYNC_STANDBY_FAILED: dbg("EVENT_FLASHSYNC_STANDBY_FAILED " "-- Not processed"); break; case EVENT_NONILO_EBIPA: dbg("EVENT_NONILO_EBIPA -- Not processed"); break; case EVENT_FACTORY_RESET: dbg("EVENT_FACTORY_RESET -- Not processed"); break; case EVENT_BLADE_INSERT_COMPLETED: dbg("EVENT_BLADE_INSERT_COMPLETED"); rv = process_server_insertion_event(oh_handler, oa->event_con2, &event, loc); break; case EVENT_EBIPA_INFO_CHANGED_EX: dbg("EVENT_EBIPA_INFO_CHANGED_EX " "-- Not processed"); break; default: dbg("EVENT NOT REGISTERED, Event id %d", event.event); } /* Get the next event from the eventInfoArray */ response->eventInfoArray = soap_next_node(response->eventInfoArray); } return; } void * oh_get_event (void *) __attribute__ ((weak, alias("oa_soap_get_event"))); openhpi-2.14.1/plugins/oa_soap/OpenHPI_Blade_DevGuide.pdf0000644000076400007640000326004311302566664020114 0ustar %PDF-1.4 %âãÏÓ 569 0 obj <> endobj xref 569 62 0000000016 00000 n 0000002866 00000 n 0000003047 00000 n 0000003083 00000 n 0000003272 00000 n 0000003363 00000 n 0000003497 00000 n 0000004042 00000 n 0000004077 00000 n 0000004100 00000 n 0000020999 00000 n 0000021233 00000 n 0000021872 00000 n 0000021919 00000 n 0000021963 00000 n 0000022073 00000 n 0000022720 00000 n 0000022794 00000 n 0000023701 00000 n 0000023759 00000 n 0000023882 00000 n 0000023966 00000 n 0000024063 00000 n 0000024200 00000 n 0000024338 00000 n 0000024428 00000 n 0000024540 00000 n 0000024692 00000 n 0000024774 00000 n 0000024892 00000 n 0000025029 00000 n 0000025150 00000 n 0000025268 00000 n 0000025381 00000 n 0000025512 00000 n 0000025599 00000 n 0000025697 00000 n 0000025802 00000 n 0000025908 00000 n 0000026011 00000 n 0000026119 00000 n 0000026199 00000 n 0000026301 00000 n 0000026406 00000 n 0000026504 00000 n 0000026606 00000 n 0000026722 00000 n 0000026813 00000 n 0000026914 00000 n 0000027015 00000 n 0000027115 00000 n 0000027213 00000 n 0000027353 00000 n 0000027449 00000 n 0000027543 00000 n 0000027677 00000 n 0000027814 00000 n 0000027911 00000 n 0000028011 00000 n 0000028123 00000 n 0000028216 00000 n 0000001536 00000 n trailer <<8AD7E198E0B2994CBE9AE860FA17B8B9>]>> startxref 0 %%EOF 630 0 obj <>stream xÚ¼U}leîc½víÊÝÕNÜJÙ& -+e[àç܉LûG…ºÁœH´Ã4pWt0t¢ÅQ<Æ6'™ÁáA³l€NüÀQcŒÁçv­m þ뛼½ç}Þßûû=ïó<×€$ÃI`È`ƒØ°½4ÓÔtá\ÈPž !ƒEÃ{n±¤|îØ!Xg}-ƒ‰øA™ä1?Ö)¨v'ý½¸¼&ÍKe‰süŒ¤¼§>ôF’O=Ú–ú4ÙÛ¾äõ”ÊïM³–Ògá´ÀqVÇÜ;Br»|YM&¡_­¼l ÓýÙÔY¨2¸ª +ÏŒ­¤÷­sî[—síÅj¾ÔÙ~¨v—ç»W§ Ç!Ë«Q‚äZMÎoÍ)Qø#x£EaÏuš&-8è 5§GÏcX'"Ã:¹‡›Ý@t EœÍ{gÔ|-I9!I™43ê¥ÇÝ;[g®Í[ÌÒØ÷îd߬…_̯x¶íxyPaå>ÁsÌÑ5T¦Öâ^æKöÜŒyÛ¦<Þ€ÔÙ¿,+ÌcÓÉì2u½±ü¸Ä„ìÆ´¿ýÚ(áò—R§ú´PïÀÁÛζÛFN¾™ë×8ƒúJÓ×,Ó÷HJ(¦",5^Ìöê@A}ŽÏ“¹9Ì/ÙST¼Èžû÷C ÑäXû>ØbÞFG2¡+ +vëÕîÈñ†¬Â°µ‡ÛaÇKøWAºQgLm5ú¯Ò»³Ê›[»Ís^øó:³ºŠEÎÌ¢Ásqwh©êÁ ìÖózê4êT§±+ßg/)ÒŽ7î6›·bHMó¤Öqâš©íÛŰk[YÇÈ-ã\^ßLŒ%t?ªS{vß,¦¾làYebé.gέPÇà‡¨Îö9?jÊè­¤ŸT·³ék^uH)Gz¡ÿ„íùþ³uÏd”N½Î[ĆKÃc»c™hÆsb#ŸšUÞúÇ[û1ˆ¹¤K‡,ê?»_°Å•ذx…I»&²ˆëÓ¦’šzä¸^¿Úâü žä’OÆ-¿ºˆ²bX|n`¼$^ºñÊ™UÑò­K^Œå?Œz|^Pá‡<7飔U(E!{ný•“½ÞôBTØÚ¼3x_‰u|¾/Vðû]^½³âºY‚# ]\sE; H‘nņƽÑÖpVï<ˆÅé ýñµÅÎúI_i]p9ÿúê¢P çV"g¤š‡q‚ö ;îmTTT‡#C{çŽã9áØÐ_F"Õ{—‰-5@œí–¤„½¨î¿Ün·n8¢F"\áxç#÷"å8‡».!2‚wdÇ9‹˜xˆÂq6÷ôŠ»ïcŒØõ’Tr·ñ°7ÑÐðIq 2ÜÓ¢ø'5MªNŒ%>SR4OÕ ÄtF¸_ŽÓÿÓÿ5–7˜2Ê0gÙH„©À#O£Ê°¬<@Ͻ +å½2%²ÇÔ+©ZbŽ<^]°;Xèù ÃZD“—éÚÄ}ÄDÛQ1 %,«?k"‚Z«á=õ¶éÈp€@H·€H®ÁÕ—Ä!M]NmgXÛé1«ˆ7$Ì2+n–Ê&Mƒaè‡Mf»ÊÊqB 1ê'ªÐ˜Œ qU>…âg\?Þ‹ûH™â‹ÈûØH”ª endstream endobj 570 0 obj <>]>>>> endobj 571 0 obj <> endobj 572 0 obj <> endobj 573 0 obj <>/Font<>/ProcSet[/PDF/ImageC/Text]>> endobj 574 0 obj <> endobj 575 0 obj <>stream xÚ]”ËŠÛ0†÷~ u10]¤¾HGš@0 )¥Y´&Ópd9chlã8‹¼}}a 58ð!Yÿ<|zÙ¯žÛñVúK¡^Ãy¼Ì>¬¶?š)Ë·»¯»¡_Tþ2~ÕõC;ß÷¨C8öCVVªíýr§ôëO÷÷×óN»¡³ÍFå¯qñ¼ÌWõ˜?gù¯¹ s?Õãïí>òþ2MÂ) ‹*²ºVmèâAÑËÏæTþÜ~ý*ný·ðv‚ª—xðcÎSãÃÜ ÇmŠøÔjó->u†ö¿u1|vèü{3§í‡¸½(ª§:‘‡ÖPùDeµP H'Ò$PYHC(hÊjU&‘)!N1œRqŠá”ÊAz‚ZCj ‘ֶ‹ÁKŒ’è‘Ý]“Ý=KÔAd²k\ ®5®×ׂkkÁµÆ§àSãLp¦iIhÉÐ’¥%ƒžEÏ gÑ3èYô z=CK–– êuCK–– ^,^ -YZ2´diIhÉÒ’pC,7DèÌҙЙ£3!ƒ#ƒÁ‘AÈàÈ dpd282„ Ž B·NCq¿ý·ñ¸ ïÇÈùË<ÇiLžæí6iý>þ¦qº}•Þ¿ k M endstream endobj 576 0 obj [583 0 R 584 0 R] endobj 577 0 obj 31276 endobj 578 0 obj <>stream xÚí½ |”U²7\õ,½díξÓYIH ³vHÚ@’„-lj„°(KÌ‚"jtÔQ—A0Æ€ãEAPtEfÆq¼7ÃuÇ;ÉÓßÿœî4èà̽ßû~÷û½¿×nûß§Ïsžª:uªêTn"1ÙIÛmê„Úy/~JÄ èu-ilm¦h²âó |¶-Y¾fñú×ýŸ¸fqó’ŸÆÿ¹(/º¿¹¥©Y}mß$¢œ©DÊ¢å«6¾õܱ}D£vi®æU­mîrÌ'Ê þéÂÕmŽ{7¯I"rwâþcK›ýaƸƒDã– þµ3¦W=ÅÝø¼ô’–b€m©¥”h‚à—¶pEcó¤‡ë¿Âç?¼¾©eeß3½&š‚{’F¬h¼©YËSsˆ–¿ñŽ•+šŠÖ]ãÁç¿Ažë—®h»éÍeçß"ºó±,­›îÌÿ±{3ä_ó&Æ_CPÊx² *7ªq{ˆþ2Qe{[{K£cüõïƒ|‚¢úÜ\ƒÜÞ*YH!±Çƒ¶B‹MÚb}+ÚfŠsidjd‹¥häì{g lï ¼3nO¶§'Û“kt¡U¿ð‰±Éò·/ZLYe­QÀ3¤`ªuÛ,Äæ413‚•b{§/À^RJ}â=—'í œ1iWÐŒy ¿ ÈÅÀÏÑöâÑsöv™x§²Ã¤, lÎPì¶°âh“xã¿Ýqw4ßpƒ±ªì}Eá4NSèý1ÇŒãOÆ€!,ƒid9)e™è¶hj`š¨jf Ðè¿)Ëîmʶ eÛópW˜Ý¦ /Ž ã“· š!’güfÐx¿ìÿž#8œlÌû†Ô2Ó•Æü} ½æ»ƒHU4V5•IÑ ƒà>{IXI®Û6‚²”VZÍÛ”cd:F¼€¤óðp~Éø¢éðÎÁϳ”<ÐÆ'ù~eèÙ{• Òˆ%¹<¹œ\”Ì÷ðr>¹c{΂÷ ,À¨^«D¦ ïØ/ûrݱnr³[q«n«;ÀØJ­Üª´´o„)5%£¨ÐUÅ/UäçVVäåW4äUNÌÍ«¬Ä¼šï9«m0 íhjvÛÕìHkvhldZ Q‰Ãb¤¹€ÕÀ—¶s—èwÒ®`©ä©äŠñ)Ù™èTr”-Å2"ИnOÏŠ®Ô+Ík”v­Ý²& ‹w˜»íÂ"lJjŠ0†‚ü°p¥¦ÝFù¤ž;¾sÛ[omë~c‹qú¯6ÞãÌ¿ü…‡«&ÎâkgŒ³Ðεœm´ÈEåd­þB±büÆ]Üó‚ò4_øèÖîûÄø£²NY±û7ËîÜþꆳ¬ýõðƒÆ_Aã ×V7`MÇB™ìNͰe‡Åf'8²Mj¬#-+Ü–a"{j%™9Ñ”cÂ"Ûν×ïSV»oÀÖîs>…@ YR Y”5¤†!™¡ÎÐ,›Óæ´;ÜáÎg¤3-3Ý™ž™áÌpwfŽ^i©Ê¸ÅÔš°5á™Ä±Õ¡9t‡ÉavX„’²‚G„dˆÃæ°;ÂáŽXGœ#Þ‘àHt$9†9YéYó2KB*-5k´5úša«“ÛSÚÓVgö„õ„÷DôDöDõD÷ÄôÄöÄõÄ÷$ô$ö$õ ëqô$÷¤ô¤ö¤õ¤÷dUŽ?š9V˜[„w^Äù.(;›‹¼ ©õ+Ða2'±6ÖCgÞùÂÜezò®G·íx² ïáo¸ñ†‡ìO†ýaßoïkûÁS¼ë¯?á(Ö› =dïëz#Ñ!T+•…C‡<œCþ\T(ýùÝ“?Þtâ—>z¢«y“ñô-|S윌_ó¨ùڰ'Þ?õ“ÇNþò'k¾~ß°ÌRâl1œ|úv¿’1JÆ?õ£®r‡F"F:c‚(Ì„øTÖ—ïµX[®»Ì  ÝAî`wˆ;ÊÝLÍܬ4«ÍÖæ€æÀæ æàææÐæÈæ¨æè9(ÔmsÛõߌ˜öËFÏoGQåt^Een^y¹ð=ÅsH_g*€ÔVºÏÍV}9­ifÕj6éšÂd P-b·ˆq§ìÂ…±kÌOçt%Þ‘bJ·¤[ 9_ÉUsµ|“ËRM•J:Eg®°ÜBØYV+·jÚ-z‡Þfj1ßhÙ¡vYŽªGµ7õ>S¿¹ß’1‚³Ô±Uã<úë2 Ë¸ÓXk²+äš`^ꋘW w‡[ ¿t%. ¬ºbVq9Èv¡/? ß;£w.Ùç1“ 9“ òÍD™ì}©/^øB |J¹V¼L–gìg_òó\žVšî¶QºÅ”®Å)fVtøQ€`(ù ±»4”1Œ(`H…Ö+éJýJÓ•Vm'ÛS}"¬<Ó­<£$+ŸÚ¤ >;4UÂãéwB-86‘léÁ°Bf˜G°ES‚Üàû mí}ç¤IæºÝ)A®°¢ˆ’è5ÊËêhô·éÛÌ]Aχn±o‰|>úHLXFàÈ Rä/k•NÚ¦í´t¼ÜÛ× cËç7VsFÚ±Rqr‘©ÒXal3^4Êù®}—+®¿cºq~‹ñÆs|5«Ÿp™ÍHTCŒŒJXí|nà7žÞ¼ä–»Œ‡Œ? ¥y„cÞyzH×z´\ß;ÜaJº%À§‘•2«ÐwˆAïHu—](ƒ¾Ýé—¦"”æê¹¦\s®eÈ(Ýf·% ‹¥¸Œ ¸c{¨‡{”kO@Oàõ€v@?`:`>` ZckS,У_¸ðÛîn5éåÜ`˜É2x²Æ'/×B^•l½J|¹›b²œß$è7xÞ5½ÝÈJ}îh‹¦`ïLSsu²Z̺¦*l!“ØA½èï‡t †¶Ë{ÕÍ#”Lë4V¹R‹Ì¸Ø,QULÒnÒÚÌBKmÖæ–ËNë1Kô¡8ôLëh*ãbµ@+Òsu—)7Zò¬ÕT¡Ôh•z…i²¹Üº–Ûô[@¢Ýºƒ¶(Ïk;ôçLÏYŽR?ÕXÒ¥^U+«©áV6½ýâ#†n˜Ùõ7¥F©Ð¿Þ§U}ý;SÁ×víßeþ }z³¯ûõXz¤5Ý[Á‘•o×cîWäàÆnMñ—ŽPG¤#ÊW\¾È\KÕ˜oR¥—›ËÝã¢Ê£E^Ô"ó¢Õf‘µ|+3ê¤NîÂ2mÕžµtZ»:;ƒ¼{íVÛÖðm‘Û°ç |@X<t ø@ÈБ¢DOÁ.à œ¤Ô)UZ6Ñ"XO´=ülH—-ä‘CÆ~[ÿEÞŸQä=‹ÂÎŽLrU·‘cT a¡2äBePÆÐBUf¥ÕjÕ¶ójkÊÅ.í5Û‘È×â§eÅäÄfÇeÇ—†¹Ò'›ZP¬º!¸}Xkz—­;î`ÈÁÐ~{_ÌÑØ_ƽ™u±f,ª‡boEmFZ&Kža¬©_xè£Ç?)\›ú|óú§7¾pü™?þKÛ®±í)wL»á då]¼ù—Z˲ƕßyÝ“3›l|þWóæ­[ÞÒØpSöGW‡Á^·býÍT솅f˜âV]µ Ø]è“Ö™?é¼1ß"'‹ñMÜ›3%«[ÝÆ#êÝúŠóõ?ñÅmÏYí´Id~GÝ‘¡V™ƒ°ÚÌqa¡ Y }oê'tÿ¥×¼!|³bw^º™æZsŠssƒJƒ+¹Rqkã}[«÷4*)#Pœ m²—1^q„¹ƒ:¸CéP;‚:‚;B:B;lv±÷îP°û÷„ô„öØzìý|qöÆšþàD_îè X.°ËÚ³È^ FâpQáÏÝ{¾O·2ÞxÃx‡s9Oí¿ýÖ›Ç~¥~&õáùÊsÊrXî3ï¹c,&EÕ(Nå\s6“.7-ÀÖ'7šßçËÆ½]DÜ,5CËÐÓ¡“lk •ðhgKÌe–RëxšÈJ¥V ¢5Ûx+êOjgXšr³z›Ö¡ßdj7¯Æžs£õYÚÎ;Ô°iôè;L]ÖNë1z_WލýÚëúÓQK1¬Z+â±J‘êÒ\¦B 6-u¼Ò–ÕÜ®7ë7‚X»¥SÙ¦î4m·F0>¢3½nIUŸV`U-‡ÛŒT#ypÍ+|œÏòi>i²üç mÿ×妼¯W‰wmƒ´dÄŸ§dü¹Ñm3맘t³j‘6h•6(üQVùÐDT;µL½„Q¿˜MÙZ†9×\iÖ.Yo«\o+Y‡Ö;¡Ý¼…žÓ¶˜µ5ÔlºÍ²“vò6­[‡èf+VÓ*2.°²ö”‘Ðm„à»yÉráƒc”Ãê„Áe»×O´ÒOšÜ¡z:Åqºª3ìWÑ„«ˆ“Ø¡ÒæKì¤4âJªäñ¦ñæV¾MßI;¸[éV»µíPþó1:ÆojGôØjÞF;´>±…k&¡FFÎÉEÚŠ ¿T•¯«‰(wþ‰gõÅÏŠ¸=~ Ï'èqwLHœU͈¶&Úc£ñyAqÁò(5"QnÝù²ñÖ„%¾¼šJôÀÄñt{55¥F¯¶T‡UDÁ® -nm‚ô«J <+lB¸;b|¤;ê;Î5lÍöæèæ˜æØæ¸æøæ„£¶£Q)ß:¢ O-ºx<]T .~áá‡~¶ë¾õ/oÝš÷Ó›^7 VßhÝU°•?{rï«›ŸêÃè}j~#§üöCŽž;cƒÌU6bÞóMOÈy÷¸c¢1ï8k"Ò•ü8g8qPT˜‰ä¼óó½¹ï¥óöç°Þj2QÚJ¢Ð„Ws]ÕÁñ*²˜€K“v·µ2¸ÒwdãsCîHqÊãŽqǺã*¾C+Rý!ý¶þø¬¿;°"ã#Eò+NIí}é¡ /¼üÀº]]†qôÆ—ò¶n-ÜÕò&«ü»Í¯î}òé7ú;k|Ô8ÿ)Ó6̘kx㉰u ì –Ö\z.aJDAæD1ÆAò\` ï2çãó)?h<j¡– ï–Ýeé¼$íê²wEtFwÆtÆF†Œ +ŒS2)¬1>äì?ÕÿpLÉC;OœÜ>u£kxj*ÇŸ9ˉŽäžÌœ¾­ÿbd–7•ví[ß'/µëøühçÿK»ŽªÑYZ´\Ír‹wý„ï³Hß/gÉØ5;LæK‡µÃÞÖÞÑÙÕ-¬ÛölÛþßµmu•oîê'XKªënw|Hh`¼™ÔŒ˜ÀİØg‚ÉJd¶Pd‚œ~I‰¯¸Æüßé÷.hK…î·E³°Ä–‹þ6䟾ÜÌ,–¸K&‘ÞÂú@aÖg>z8î@ÜøŒŒ:ªá½ÎTg®³T†Ô„ÖEÔEÖÅw…¼€„¼?ä`l_|˜ˆ½rÍÍz²ÌXŠ£/9†TÇ?uÛší¡Ê…A²n»oÙÆìuãOÿø}Ãö#o2)%k×=pcÛOžŸ>½êÖŽûãûœdœWÚöX(%Áôª’Eî„èÙÍjRD°uX¨9/bD %$ÀDd RblÊDvÚ'0 VïW,ö’ܽ5áœ^®\²A|û»•ÞíÖkw´ê›E¤½ Räž©EvoÒ¥$ØGDUç<¸õ†n~0© Òj Xò±aã…SjÖFn}ëgf³\¿ÁS¾˜œ‰l'-6(1,.ö›jMLŒÊ MHu&ÆÏË ˈ•vìÈòÙ±üfmà÷ÈAmç¤ôò‹!÷íÂl먎ë”:µÎZPXT\RZg«³×…Յˉª‹®‹©‹­‹«‹¯K¨K¬V\—Z—V—^—Q7¼.ó;ÂSÔêKBvsbsjsZszsFóðæÌ£)c«“*RoR~ÑÎm¦‹ßfŒåïŒçÿú××>‰Úi[Ós?úë¿ÓC_u=:uÚS/|ü͵y 9éNÄ€pêrGY”àpÒ“lÎÀ|«øÎ:Hœ[ø*(yàá|öÑÇ}ìÍ7{×x—G¼÷§zsÙÁm¾?‡»˜Ë"“ÌKüûlÖ6ðtG|›è?’ýŽœ¶ÌPÕ2§[IõÐ&ò_ÈZã.ŸµúW俜µNÑßòe­ÒaƒvºÖM¡æ k‰ê ȃwb/µ†Éðã­û°)ŠÝÐ~Ùo§ÿ®¼ré<&¸ZŸ¼&X“¿òmë~+Rv³fí–-©w­ŒËS<xâ—ÆµêþíK® µáž³ÊÈ—Nÿ‰]|èiX\TÀ0q€ä̈ ö!SsPlx†÷»ïÙÑåΆÖÊ+òß=œÅ©æÔ´.[¿åXP_èÐ>›ÕieΉpq©½$¢0½’kìÕåéþûÆ6Þ|™m|;ªüíÊvu{ÀöÀíAÛƒ·‡lݵ=z{ÌöØíqÛã·'lOÜžº=m{úA:Œ¬¯_;ôZÈñäCi¯¥_!Ï Lÿì *:‰•3ºn}!óþÄ¥µ3Í»ëŽ;¶=²üáì{⦖UL™výS÷³rדM×4T”WŽPéÌ}°ñ–æ×—•\é*®I-x@þ¸ƒø”~¥üÍ®Ñ0K€)O0éf5H|ÓŽÀ,vB‘áù·os²û9z6ÉÊPâ†'ŸzlKkë–ÇÔ,o–v§q«°½‡c¯S÷{¿‰ôžG%Šó¨¼°Pq¨e óˆ‹ÇQóþÙq”8Œúf¹è zþptñPéàʉ¡'l'ì#Ù§é"ûÅÓ$uÝË}‡÷m]¸zucoþä½÷>Qƒxü¾{"¾ÕAàyWÝŠ9è´Âª)”ǹ&]SY#ÅäûŽÂö{y\R3œ²8]ÉP³ôRr).µDO•\¡ŒWÝz»z³¾“¶);tqtXy]‹ÎÂ@—RÁåZ»¶•¶ñV¥K=DGø "¾t³*VV·ÅFÑÏÙÆAêþ ±ê§ƒk•»½û÷0Ï»úWêgd¥ÇÜqâl‹Ì#5ÊS97à§[C"æä„‰ó­Åâ|K(Wœki…z™µ†ª¸B+×kÅI·é«MmæK›u uñåYu›¶Mï2m1o³õ°vH?lÊ”go©áâèM}wpcïycéϸ„“Õýçs• ꃹÊ[D½&ùýå8l»”ôêE»ÜÓ¯ÏI™ó­›Ù±‹¦î ^ãØçñLmÐâõ9»ô„]jºe—–žzö».ž™3ijƒc×¢ŠrÕŠkÊÑ7½Mñ Ýè¯(Iû”ÛÝžkÏ«†zÍ‚Mú5çÕ«G.Я^¯^u^]°I^3NŸ·IÛ°IŸ{^³ImؤÎ>¯ÎÚ¤ÎLY Ï\¯ÎÀÛ C^…>ÝPë¯P§êC\»^ŸŒ·Zí¤9zízµövmRM†>iŽ:É­Õd¨ÕU·êÕ†Zu«:ÑP+ µ¢\-7Ô ?WǪûçꕆzÅØ‰ú·ªc'ªeãÔ’Ÿ«£ µØP]†Zd¨…?W 5ÿ¼šw^Í…ˆ¹çUç¨õºo´Q˜Ã¨õê¨Ûµ‘9úÈêH·–“¡fSGd­×GœWGв2èYëÕ¬Û5÷±Ìázæ5Ó­ ÏP3ÇéëÕt¼¥¯WÓR×ëiçÕ´Z*智^M½]KIÎÐS¨)n-9Cu`œc½:lœš„VÒz5qœš¿^O8¯Æ¯WãΫ±.ö¼3N6Ô(C¤qzäy5oçÕð°=>•öñ¢»àìø ìÿÑbê—Ë=—R·|¾CÿÊ1xÞη+ŠÒwñ©^§¸ô©9´—t›~‹Þ«eZnê3½ozßœo¾Öü±ùcË-Y>²VZ?  ذ)0 Ï–ÀW.}¹‚^ ÎÞ’rWhfèæÐ_‡þÚ–f+·½g¯´o‹ÁsixRø¬ð}ZÄòˆý‘¹ß?¿~ÿüÿã)ëIù0¾¢;é2™:*¥’†Ì‰/‰_‘øiz0…P(Ù‡Q8 üHŠBýC±Gñ¨N)‰†¡ÖIFJ¥4TF4œ2‘½ lÊ¡‘4Šœ”Ky”OTHEä¢bM%TJc¨ŒÆÒt%’Žq4ž&P9U Õ˜HUTM54‰ji2M¡:šJÓ¨ž¦Ó šI³h65КKóh>- «èjº†éZZH‹¨‰ÓDÄet]OËi­¤UÔL7P µRµÓjº‘n¢5t3­¥[èVº:èvºƒ~íÜEwÓ麗ÖÑ}t?­§èAzˆ¦ ô#ÚHÐi=Š:õqz‚~B›éIzŠž¦Nz†ž¥-„̘ºè9ÚN;h'=Ï*½@/Rí¢ŸÒKô3ÚM{¨—öÒ>z™^¡ŸÓ~ú½JÿBè5:H‡¨S?¡×é(£7èM:N¿¤ô¤·ßߥ÷è½OЯé4ý†>¤è }LgYcMl¦ÿÀ•?Ò¿ÓçôWú’¾¢?Óô¶°•8ƒhƒÉƒÜ6”>C¢nç0çŽä(ަ¿aïˆå8Žç:ωœÄÃØ,8…~Ë©œ†l8ƒ‡s&ý‰³xgs¤ßÓ×<Šâ mÎG‚ZÈEìâbú7Œ­”þÀc¸ŒÇòdð•LìæqÌØ§Æó.ç ®ä‰\EÿÉÕ\Ó¸–'ó®ã©ô;žÆõ™Ç­Z²jeÓõæq+¶¬ZiwmKÓê¦À —µ,l_±xyÓMÚ„E«ÚLå ÅåòÖå­KÍÞ»L²×\ỹBÞ¬Uà†À‰)X&.lZ´lùòFm¢¸RuñŠ©ºmÙòEMæjjIÀ\í%o™4t_­¡Ö+BmãÂö¶&K­ïšiŠülš"¯Z¦øºÍu>’u’¤µnѵ˽ë}oÞñõCd¦ËîÀé—7Ã;dÆÐ™^agú(Ï””õ™-ËV.±Î¢ožé>pöEJÖÙ‹–5µ4µ.k5ÍYÒÒýι„Í\yŸ6s47úh7zÑ裵ð’åX(t±È«‹&¯þ›|w5yõß$(5ùt¸Ä'}à’Kh,ë°ôb‡y™oôõC_.¸,÷rñN̲|H+½\éUÏÊ!¯òI±Ê«ñU~·øÞ¼ã[†È´z5Þz‰*Ú¼CÚ††´{5Þî£ÜîÕx»Ôx»_ãí>-Ýx‰Æoôk|Wãk.as³Wã7‹9.ó²Xæc±Ì«Â…®Â\}Üòæ¥Úø¦¶F}b#\F/oZÞÖh®hn]¶|ÕJm..¨¸8c)ZZõ*4'5677ÂDW\»¨Q™Ü®LiW–Á— âÊÔejýÒUúôeKV4ª3ÛÍ3½¤Ô©K—©ðšÚºLo”\¯\—H®‹$×&×›Wq±Mr]&¸^/¹.÷r]ٮܴ ‹!Yª-à×*ø™$æ©m`ÛîcÛ – ñÂG}ÕŠ¦%úÌüü¼"kãÊUmMË›–ásnAq“Þ¶jåªÖà!ÊOR9²äSˆü`BdÃ*ôá½î›¾÷ÃÌKÔ ¦²êëbÐx‘~Ó¥ô›†è/óÓ_u)ýöKé¯òÓLjU_ò!´ý›œíÙô¹F|k„—ãâeËòrsóŠý­ÑþVÉP+?×ßÊó·òý­«Ðß*ò·\þ–ŸG¾ŸG¾ŸGŸGŸGŸGŸGŸGŸGŸGŸGŸGŸG¡ŸG¡ŸG¡ŸG¡ŸG¡ŸG¡ŸG¡ŸG¡ŸG¡ŸG¡ŸG‘ŸJ‘ÿŽ"?•"¿.«hH–¼‹ÜŠü<Šü<Š.òðÊçÊ+(òKïòßëòóuù©¸üT\~*Å~ ŠýÚ(öÓ+öϣدb?b?b?b?b?Ñ~£ýˆ~õó?|ëüCÓVbÌ-ЦÍÞF·s:çq1Wqjü)G”£Ê‡êmê}êzõaõu‡ºK}Mý¥¤EjN­H«ÓækWk’îNú‹Cu˜VG¤#ΑäHqd8r¥ŽrÇGwrTrJrFŠ’bJ M K‰L‰KIJÉN©J¹&¥)ýØçÚ׊Ç#íévêäLvq ×òRpï÷÷Áý.pPÝ nQwª?Uj¬…hQZ®æÒ¦iWi'Ý•ô…C‘ÜÃ1އCr/¹ w;¸Çú¹/’ÜÙãñü޹Ôþ=¿† ¯d¼à ƒ§ |Û{uð9¼v_ýñÇoûø}ÿ§»?Þ„×M?»ôã7Ï\wfÍG›>zö£û‰ÎÜKôQÛG7|tõGÎrýï¶?éÿâó­›øüoâÝð.Rl¾W ^)ÒJŽR®`—QãµR¹Kù¡r¯rŸÏ_¨Ü§<¨üˆ¾ã¡Üæ}ýÝ£ö'ì÷°ÐOaÅÂ~Ÿ„n¥ßÖÿëÞHçèßaѾÁnþÛÝIÿJÿF°Þ`sG`­Â†'½_zVxÂg…çáY¿’–Øû ñ®´Ç¥œÅÑð—ëàs×Ãß–Ãã:ás7Àë„ϵÃëàs<^w3ün-|îxÀ3ð»Û„çñµ<ÞðvÒ—œK_pý•óé+. ¿qýÒ²‹¾æb2¸”<<†‰Ëè¥AØ󕬲›5Ç _Á:glÎÌËØÂ×qO`+½Ç\Î!<‘CáÁ\ÉA\Á6®f;×p8¬4Œ'qOæHžÂQ\'|–cxÇñtŽåzŽçœÀ39‰gs"ÏbÏáaÜÀÉ<—Sx§ò|Nãðº«8ƒ¯æá| gó"ú9çÀGñÉ‹á¹ûüö |ø#ß™ÙS¾S3qf¶›_ºäÜl,éÇß8kû)ÿÌwš¶Ÿ£„ò)>Ëðû¾°ÓŠ] ç¿q¾ö1ŪØM QLŠî;Û²(aJ¤À¿VÌðÙFÁ E´R¢e¬ê“Që0âãADÆÇéô9¢Ü÷Ñæûhó}´ù>ÚüÏD_•”A¬k0îS òÔã!dªiòïÔDni¥bÏKÀÏI`©Ä2ÏÀjd Vd“YÀÙÈ<­È mÀ¹Ès­È#CíFxDÎé9Œò ˆßÈzã–Èì¸Tb™çSà‰så½»‘ñ!k.Úè  ¹oråt`råP ÷< Œ0Ö£<ÝÀhÏ!`¬g70ÎÓŒ÷t<û%îñŒîõÔ€n„ñ0Òs#0JüîZ(ƲMêĆœ{ Ðåù°ØsXây X*qŒGP(óÜ  ùmÐLpŽ”{æn£ž>ãíRÛvH{ã9 tyNw{¦÷x€{=‹Q'ر£Z@, ‡„»QžãÀhÏY`ŒçPÌ1sü ˜­†C3±¨0‚ãAç3 ÐU<è<Œ‚†ã!Õ‡ÀÏ+ÀXH/u:o‹ºúI€®¾†‚Zæè†{NµP{ù@m>0zNµ À8ÏZ`¼¤“€Y£†ÿ& ‹ -%âÞ·qXÁ$øÈ—¨w#ª¤‘¾–îom¨«Ó(v•F#$Ž„§Q¾lJtÁwÒà¿K£=Û%²]*± 1!Ü<ÊáéiT!¹TÊöD‰U«Ò¨F¶'AoiT+e˜,qŠì©“8Uâ4‰õrütIs†lÏ”ý³%6À*Òý^Î…6Òh>ô–†º\ÌëÉq¹C^Ý =§!V÷z*C Ò¡ÿ“À4ÐI‡6€#$Ž”=¹žO€yˆWéÐŒh» s:t²8ÚsXúéЉÀ2DÅtèAŒŸ%éÌ–í¬B:$|ƒ2õ³€¡èÉ÷/åÎÏó%J‘3ôÅÕ2Øa4ü)°óÊ€VE[h2š<œ"Ûuëå˜gI ³e[h,2l'DtH;Ü_й‹¿ËÌ@Žgˆ,=E]à;ºêŽ–WK»†CWÇ@óÃ1»ûåòj•ÄÉðëLi«™sІx’ i7Ó ÕLhì0p„Ä|‰…]ˆ™àx8ÚÎÇsÀR‰c ŸLp< +Ç”ÃC3±^§€•²=Qb•ĉµÐO&¤XÏ„MŠñ3äÕY’Zf” kü8ë• = \‡‘Øù¡‡,!³0£T±×ɶݓ LÃΕ…¹|Ì—èÂL³0‹/e9 ^&°ܳ ÛKÀZDø,¬ø>`=Ö1 Þ!Ú³°:YXñ`ƒì™¹gÁ#hlö ^нc¸oæ‚ïð}XŒí},>G@{…m€ÞÄU±^# çÀ9˜Ëpù¸ûE6èŸÚ1kqt{6îí*‰µ*wý#ÄøŒ(2•XÀL‰YGHÌ–˜#q”D§Ä‰E¯Ìâ°zËüÇÀs ¿è/—#'J¬’X#qdÎAŽ„hhÕ‘2JŒ„loÓàk#¡Õ/ÀÛ ]AèmÆÚ ¥Qy˜eÖô~`,aVVôJtÉ‘£a?£ Õ/c±ŽÂ*Ë[Fa•ÖªGa•O§I¬‡GŒÂZ‹ö,hlÖZÐo€ÍŒ‚íÍÎ÷Ì^ƒù:!ç) ØUðE ØU2Þ;!çCÀó%º +'´·(b¾:¼ X*±Ì3XßqÂ_å*hÀ O=µðS'$|8 ;Œ²}l€~œÐíZà\ì¿NH¸¸Ãsp·gpìß ýäBÚ¯€"6æÊ˜œ+cr.$èß\i?¹ÒËò0þ4ІõÊÃ]¢»ÊÃÈO€ÂJóà¿w@¶|Œß ´#.åcä.àHè9_Fû|ÜuX }æcîû¥Ç`vùÐÀÀZH’šgÃò1¯/ó |H%ÚëÐ_ýŸ†_mÈô ‡ “<Â÷ 0Ç“Àá˜WeJ9 ([¶s$:%æ"Ç.€ÄøÙS$Ñ…<¹2-¯–By'° ùUVm-p¢Ä*øröåßkå˜:xnÖîà,)çlh¸k÷p.4S€Ù šóaÿ…Ò; ©ZÕO0vU„9Ú±.E°±aÀ HU„æàÞ"È/z\rd1´Z™?–Èv©DQ=Aæ·•ðµ"È,Úµð¯"È)zäÈùÐ@VöYà^èÜ%sZ—¨3€vŒtAÏ/30G$9Ì .ììbd¾ì/”èBné’Õœ R–ÀB\J ¨Y\ês`¥Ä*‰õðö…ßgȶØs]23qAÂ]T K8 …CKG€vÏuÀDÏSÀ$ÈÜD^Í€íCNbõ‹!¡h»Ï‹ñŒÅ«±°• À2ì¶Åj°>U ©D{’¼·kQ,cH1äWg¢¦(Æ*ßl@^ ß¼8Ùf1¤Rí=?Cö[ Ý ÜƒhP íÅ^ IF‹Úh‡ÆFK †„§ÕÐÉhðý8Ybvɺõ[ ´1 ø3ä½%°±è]HX*%,•–J K¥„¥RÂR)a©”°TJX*%,•–BW¯…„¥R¶R)[©”­k7²•B{¢-$,•–BcÀÙ3_Ò¹FJ%ä,•r–J9Ç@ª/€v¬ˆÈÖ‹€°½1ä0³yDO¡Äbé7åX‹1D`­Äz‰ó3Ë0÷WAª sögƒ-•K60ó-ÃÜWÓ°_”ã=Àsàeà(Ú.yW1¬· òÆ‹oåà5eà>X ˯D»JbÄZD³2èDЩ÷LN—ý3$6xêž˰~Üj® :A„%î•Á’?À¾ Û ùÇíˆ9cåN=¾ÿ °;æXp߬Ŏ<»€ ÐÃXXl%p>t~fz8à DÏeˆ™årç§#"û±Ë¶È¯Êen_ŽØr7°TbvírÌú àt‰³ä˜P+ÇŒNEnY.w½räZÇ»áwå˜Ñaà^XK…¬O+Àk?°q vþPìƒr¬åÏs Oh¾œmWHO¯µ—€{±§TJù+¡Ÿ[vør%v¨Où²]Œ¬ ’#îÀb?ÖÂ6*QˆvÄ™ga7©”µ[¥ŒÛ•à(Ú»O*Áñ(²1Ák¢ÔÒD9߉r¾enY…«¯mÈÔªd–U%wê*ÈpPä«UÐç­ÀR‰BŸU˜ûp,¡ ²N–8EöÔIœ*qšÄ™…~ªdíV%ó½*©«*©«*£ª ÕQà:9Fè­ ³ØÜ K¨Æž8  [­†Ì@;âg5¥cM«±› ,’X›¯Æº ¬’íI°œjéûÕ²F®†´¢§NâT‰Ó$Ö#ªWCfÑž%)̆7UCfAg¢J5Íÿj§6ÕˆB’ݿҊ{÷Ê{߃žkä^9EÜ®‘z¨ÁÜ?·jpï‹À=°Ü{‚&ÉÝv’Ì'Až¯€³1¯Ia8Ú˜„{wÃk&Iëš$­«w½µm-v®³À‰²]%±Fb½ìŸ!Ûs óZÐ÷ŠsÂZxÁ>ànìžµ Ü Ü‹þÉ’ædIg²¤0òœŠ‘“åÈÉrä)ÿ™½O<§€cà­S@á°NT¢]%±Fb½ìoí¹ÐÒy–;ôÍ=°Õ) œê¤U×ɬ»NZuÆ¿ V=UrŸ*µ7UzýTÐ<œƒñS¥ö¦bäq ÐÞT©½©R{Óä½Ó°º#vÙ.F$™&Wa¨}k1M®Å4Isš¤9M®È4Isš¤9MÒ¬—^V/ÏßêAsPøW½ô¬zéYõÒ³ê¥gÕKϪ—žU/=«^zV½ô¬zéYõÒ³ê¥gÕâ>Ζí‰s`õêP¬i½ô¬zéYõp3pü¨¾BÓ¥„Ó¥lÓe|›.ãÛtߦK‹.½uºôÖéÒ[§Ëø6Ôv÷È{…ŸÎÑu&v´/A3ô¯Ú ™à"Ú‰g&v´ÃÀ4ØÏLDÑSŒLi&ìD´+ùgÂZÄ]eO•_ «˜ ›=“ Ÿ™Sp™,qŠì©“8Uâ4‰õ’ÎtIsæ2ÚýÂÇgÂÇc òêÄ™™ðqÑ3Þ=v˜ Ü Kž)}|¦ôñY˜×Y•E•4 òwK<íÀR‰ežZ`9ô9 3úX kœ…¹¬—8]öÏm‘¹Í’•Â,èü8PX×,i]³¤o΂${ ùYd¤·ÂÃfË}j6äIŠx>[ÆóÙàþ%°RâD‰Uk$ÖKœŠc6æžœ‹Œ|þ(°UÆaè6X*±ÌcNà_œ‹JG~S¬Ä!1cE5ùÿâr£Mü…²ˆù»‰ÎðÿNrŠï×¹$ÿ0ê_[Á³}m•â`Þ¶†17ùÚ:Å,ô¸¯mF=òŒ¯m!}äk‹oœ _ÛNf6ûÚadåñ‹LÍŠO›9Ú×f ãŸùÚ …ða_[¥B~Û×Ö(L1ûÚ:å*±¾¶‰lJµ¯m¦›•9¾¶…ÜÊн6 SÃ}m;…¨é¾vú 2f9&¬j^Ó²lÉÒ6G^IIÉÈüÜÜ"Çøem­m-M+œ—767.YÕê(oj]¶d¥cb˪öæQŽqË—;ä]­Ž–¦Ö¦–ÕM‹FùÿßiõMKÚ—7¶ }^µêúÇĦU+šÚZ–-täçåùG®X¼¤ya[ÛÈÕ…£ 5í+yÅ!wÀøë/þïØ–µ:m-‹šV4¶\ïXµøŸ ùÏ|—¼×S&-¤,,êù³Ò5ÔBËäNÛЗƒÏ‘âÏ"ôÇõ6ùÓÓj¢FǬñ¾¯f¼–€N+Æ•ãj«¤µŸ&bô*jLjQø4£—ãý"¯VùIÜÑ„÷ÕÀEY)þÒŽžFÉùz¤kM¸£]rkù»ë«ð¼žr$¿&´WÛ$—…èËÇ|ò.Cs…ü‰m3Æ´á9Ü Å¡:®Ö`ÜJ©‡by¿W—R÷ÿ=E8ЉÏm²_üw…”Y\]Žÿ;4ù¿Já¿«ßëI;Ñÿ‹¥–Öâ5ÃÿùFº’wÒ0¼–¡çö@ïû:¼6\Žú ¿ÜCÌsA»Ÿ:õýT£¯ N­’:Õ·©Óô>÷R'&þæ=èüýDæläX"¼}B5šÉwmî[Cת‡h˜¾ÖÛgyû¥¸ö*%k»Ä߃¾üC{ŠÆãµQ=!ßÇkÃi¼’Gcµ­h—Ðcˆ_›eÈ=DñIzÌ”N‰~­Ã{ŸÔË‹ô˜šGÃy€²´XzHÝM6S S/P"^ôýãûÇ÷ïß?¾ü_ðÀþÝKŠz3?Œ À¢OÔÞ$2ò½ïÊut§²Ø¢*º¢(š¢ª¤ôL%GÍÐÝÇÕŽC}äøZ1Eü„e’u ÑÓgNòg&‹ü}=ý?év endstream endobj 579 0 obj <> endobj 580 0 obj <>/Type/Font>> endobj 581 0 obj <> endobj 582 0 obj <> endobj 583 0 obj <>stream xÚ+ä2P0PÈå2µ4Ñ372s`LsK# ÇJgp…+äqÕ- , endstream endobj 584 0 obj <>stream xÚ•MoA †ïû+æ´@]=_{EmS($,M‘öV *DAœøûx¶év¼¥ZÅ›DÏ|Ù¯ßñåñ.ÇÅ]ßvè†?5\KXÉç[÷fèŽÏÐQqÃ×Îïø#_\ʈ²n»ƒ_ÕÀ‡Ã÷™¢)>«áC '5¬j8oÇõ ˜í©e>>> endobj 586 0 obj <>stream xÚ•UKŽ1 Ü÷)zôŒ8NrÖˆ‘8@K ‹7HÀ‚ëSί{³`f¤N*‰rÙÎãýéØxú³ýÜdgüß|ˆFIöãeóÿö…ûfF5”GȘrû~ß¾n?Ü™åæöý/Öê§áx^‡/iÚoíûzÝab¾üñÓÞŸû(>2 §ºûàIBJû¯çM"üøBeñ@’'Eª9 äÄjðPI¬ì.‚T2ÕJ`*µ…AfÑ} pl¨V›øî7[ n‚ãJà3B&)»$² I…ŸŽ2qÚ+)ÎFJºÃ{)ðFÑÔ/»†å*û°}¾h%—ç.˜rzbL)4Ú ½R#ß@%Vð7ŠÉ&Â%ÇÖv Ç° u®Ú‚RÔ²v$«Ï1õ!…v@-¬˜b½Â„¼LÓ–±1Ÿi›[3w/#I㊕B>³wQá-yrÕ^¸ÿ«kA^‘ÖméÚÑýzo p2ºoJZz$'b”Ó‰`î•ÑaF}4X÷B©Á2{X…ÔƒUbAâ âÔÈavgÖ*˜ÉØK/{¶ •Þ ^˜ÐÂPšêîÔ#QlNä”Pl¸Ï/è ®Vo(Z[ÓãÑwµ7¢®SWÕÐK<ôÈEÊD%786a3bžèAu¾ZIWQ¡žŠ-”ºÊ‘ Ö#tÉ„Œy¢B.º’×ô¤|ü+Dì;7t°j}_ãÆÖª\‹†Ð¡x·ùË$-¾Tx¡›L)è2ê`ø;¶k{†`Ì=5xWÐá¤ä6Wz÷²›/s>ŸÖج$-pi·V„ï/ˆ[~¼F[dèxü ÈÓ‚OO> endobj 588 0 obj <> endobj 589 0 obj <> endobj 590 0 obj <> endobj 591 0 obj <> endobj 592 0 obj <> endobj 593 0 obj <> endobj 594 0 obj <> endobj 595 0 obj <> endobj 596 0 obj <> endobj 597 0 obj <> endobj 598 0 obj <> endobj 599 0 obj <> endobj 600 0 obj <> endobj 601 0 obj <> endobj 602 0 obj <> endobj 603 0 obj <> endobj 604 0 obj <> endobj 605 0 obj <> endobj 606 0 obj <> endobj 607 0 obj <> endobj 608 0 obj <> endobj 609 0 obj <> endobj 610 0 obj <> endobj 611 0 obj <> endobj 612 0 obj <> endobj 613 0 obj <> endobj 614 0 obj <> endobj 615 0 obj <> endobj 616 0 obj <> endobj 617 0 obj <> endobj 618 0 obj <> endobj 619 0 obj <> endobj 620 0 obj <> endobj 621 0 obj <> endobj 622 0 obj <> endobj 623 0 obj <> endobj 624 0 obj <> endobj 625 0 obj <> endobj 626 0 obj <> endobj 627 0 obj <> endobj 628 0 obj <> endobj 629 0 obj <> endobj 1 0 obj <> endobj 2 0 obj <>/ProcSet[/PDF/Text]>> endobj 3 0 obj [4 0 R 5 0 R] endobj 4 0 obj <>stream xÚ+ä2P0PÈå2µ4Ñ372s`LsK# ÇJgp…+äqÕ- , endstream endobj 5 0 obj <>stream xÚ¥XÉnÜF½ó+xŒ¸Üûr5ä`€\t3àAÀ'ÿÃh4’&SÊ,üƒñ'¤šöY¬æH!¨5”ª_¿®åUQª]|l^*PƵ‹7£Oªý¿o^/šW?ë6µ‹·n~éÖ†6: Qåvñ¾ùáB)u¡L(?o˲~±øƒŒ½‚äœØ°)KW–ë²Ü—eW–OeY–å@vý_»1jv`RšAje zIø@lû={¶GGÐA¢_—UYŽDwM—90,à K~bÐà‚ôҞι,ËßtØJ–"X•ê½g–ÙC”Y‘G–tNc z^2}¤‹ ž½'öŒ©ñB–:Ú3D~uº±þ—AĶÿ ¥ ù¨§´¥ÇÃi1?~ËX3†´ZCvV@.‰Æ=ö‰zÅv[ô~»‡l¾#",ò¶D>ûg0ˈ+–Ü(3º~‹-C„{¯|C8å!é( úÈ\3KíÀ_?¬“À&AJY˜ßq=`~u.@°ñÉtc{B¡%ÏÙQnÎDÒ¥ :ÇgÔ‘Ë‚ËÿKZ¼6 ‚>“'Íò”¿úKPE–ÇlÕŒ¢®(ñ$[VÓ_O`ÑbbxY/_ԙ䒰U/×_Ìï(Á·DêåZDD—¼±âp:‘ßFÛ ©n,»“öRžqfÏì³­ÐKœ—Ü(AVÒè|]nêšQ4XY'Àd…«Ayé¡kíæ¤ÿ@—DeËCŪÛ`ÝÔH-ë…m•…õ5?¡ •Ód”ºP‡ø:O0s‡]GKzÜ&Ölx¤&ÝéHžYÊCJQ¬ ðïëíÎá@â¼êw´;ç-Xëáz²Ý¹˜Áé›ìÞóDêÙl¹f&PÎ?W=<6år]šø˜i°; |KÙÊD¢gë²4¤þV V“Í3™„d„õš—þ0³,ÏçŠ(6¯†±˜놗ÍDHQºåo9›õÌ S[öVì–÷-Ã,ŽÝÂrèC»É+5> endobj 7 0 obj <> endobj 8 0 obj <> endobj 9 0 obj <> endobj 10 0 obj <> endobj 11 0 obj <> endobj 12 0 obj <> endobj 13 0 obj <> endobj 14 0 obj <> endobj 15 0 obj <> endobj 16 0 obj <> endobj 17 0 obj <> endobj 18 0 obj <> endobj 19 0 obj <> endobj 20 0 obj <> endobj 21 0 obj <> endobj 22 0 obj <> endobj 23 0 obj <> endobj 24 0 obj <> endobj 25 0 obj <> endobj 26 0 obj <> endobj 27 0 obj <> endobj 28 0 obj <> endobj 29 0 obj <> endobj 30 0 obj <> endobj 31 0 obj <> endobj 32 0 obj <> endobj 33 0 obj <> endobj 34 0 obj <> endobj 35 0 obj <> endobj 36 0 obj <> endobj 37 0 obj <> endobj 38 0 obj <> endobj 39 0 obj <> endobj 40 0 obj <> endobj 41 0 obj <> endobj 42 0 obj <> endobj 43 0 obj <> endobj 44 0 obj <> endobj 45 0 obj <> endobj 46 0 obj <> endobj 47 0 obj <>/ProcSet[/PDF/Text]>> endobj 48 0 obj [49 0 R 50 0 R] endobj 49 0 obj <>stream xÚ+ä2P0PÈå2µ4Ñ372s`LsK# ÇJgp…+äqÕ- , endstream endobj 50 0 obj <>stream xÚ¥ÝA$Ùužá}ÿŠ^6 3óœïÜ{¶†%Ù+C€"¥1´ †hÀÞø?4gš#Âä ÁRæ´öö™QÑ÷¼$a¹5£y+«çééêünEF^Þ_¦ÿ÷?þáÝåþùçïäï›ìýOÞIý¥ÝîóO¯óßøòÿøîï§üâÎ?üÝ»ÿÅ»üÙåýmú›¿w½?ÞõýÜÚõÅ.zÿÅOÞýÛ//—Kûw_ü×íŸÇíÅ®íÐü‡·M³és_ÍŸÎ?üçù‡ÿø¶¾^âÅü˜ÿå.º¶ëqˆþÓ.ºåËårŒþÍ.r›"/>üåêÇÍ¿ØEá/:6µoòå6ýŠ[Ï—T?ÝüÃçòòrµ>ÿÂþàÏf°·¿ªí2ý^.ó?_>îËËÕæÿýíüÃ÷ó¿žønþáëù‡ßÌ?|µýÓŸoÿôÛû'›?Ñös³É´?ŠëÿÙýü-@“uã7Ð4½ntƒ¦ÕM\@œ8pnÀ¹çœ;pîÀ¹çÎ œ8gí|»Ü@#ÐÔηë4šÚùv»€Æ@ Îœ 8pvàìÀÙ³€³€³€³€sçΜpnÀ¹çœ;pîÀ¹çÎ œ³v¶Ë4šÚÙ®Ðh4µ³Ýn h€³gΜ8;pvàìÀYÀYÀYÀ9€sçÎ 87àÜ€sÎ8wàÜsçÎY;ûåM€¦vöë 4Míì·+h4ÀÙ€3؃ö ƒ=è`:؃ö ƒ=è`:؃ö ƒ=è`:؃ö ƒ=è`:؃ö ƒ=è`:؃ö ƒ=(°ö À؃{P` ìA=(°ö À؃{P` ìA=¨ÁÜN_ãSð¿=œðõxóà° ~Üþöëío¿ÞŸïùËô¼üä¡.¶9~½6¾>Þýòãó‘ÑíöüHÇ#£ºiu3}‰¨M€&Ëf>2ª¦×Íõ Mí<Õ&@œ 8p6àìÀÙ³ggggçΜ87àÜ€sÎ8wàÜsÎ œ8gí<Õƒ¦vžŒêÆ@ ©ç#£ºh€³gΜ8;pvàìÀYÀYÀYÀ9€sçÎ 87àÜ€sÎ8wàÜsçÎY;ÏGFuc  ÐÔÎó‘QÝ4µó|dT7àlÀÙ€³gΜ8;ppppàÀ9€sçœpnÀìA{ÐÁt°ìA{ÐÁ؃{P` ìA=(°ö À؃{P` ìA=(°ö À؃:߃û¶™‰æï@ùá`çëýÁÎóeóæ~±¿BË_®iÇǼùv:ôi{ßl—°}õúOÏNhvv~@3L²JÖã™a¢:ée²ü^&^'­L–߈ÃÄê$ê¤ÖµZ×j]«u½ÖõZ×k]ÕºªuUëªÖZ7jݨu[­ÛjÝVëöZ·×º½ÖíµnÖºYëf©»ž¾ ¯“Rw=z&V'Q'¥îzì2LT'µ®ÕºVëZ­ëµ®×º^ëz­«ZWµ®jݨu£ÖZ·Õº­Ömµn«u{­ÛkÝ^ëf­›µn–ºëáÊ0±:‰:)u׃•a¢:)u×S•aâuRëZ­kµ®ÕºVëz­ëµ®×ºªuUëªÖZ7jݨu£Ömµn«u[­ÛkÝ^ëöZ7kÝz«y½Õ¼Þjª·šê­¦z«©Þjª·šê­¦z«©Þjª·šê­¦z«©Þjª·šê­¦z«©Þjª·šN·Úá d¾,ϯoO5âm2Ÿ³ÜüýnþáWÛ¡Ç7ۡLJíüóv¸òÕþ5hör¹ž|Þ‹ö1¿}~iâíz;|ØÇý•?Og9Ÿž ÚáŽge3ý‡]7šMÖÍôwÝ4½n¦ÿ¾ë8;pppppàÀ9€sÎ 87àÜsÎ8wàœÀ9sÖÎóùDÝ8hjçùˆ¢n 4šÚy>¦¨8p6àlÀÙ³gΜœœœ8pàÜ€sÎ 87àÜsÎ8'pNàœµó|€Q7šMí<bÔ@S;Ïçuã Îœ 8p6àìÀÙ³gggçΜ8pnÀ¹çœ;pîÀ¹çÎ œ8gí<qÔ@S;ϧuã ©ö À؃{P` ìA=(°ö Î÷à|O¡ëŸO,濽}ýÏm9¹¸íï礗ë¥ô—¶AÏÓu¶“‹7¦'Oyõ“5ÛŸW\_Ìú¡{ó©öWs\_b>¬9þ\_OE~¹ýðtêñé0¿¯ùüP'û»Œæ^GF¢ Q‚háu$uÍ;¼Žˆx#âˆw"Þ‰x'âIÄ“ˆ'¿/ò:rñû(¯##Qˆß‡y‰DD܈¸q#âNĈ;w"."."."D<ˆxñFÄoD¼ñNÄ;ïD<‰xñâ÷É^GF¢ ¿Ïö:‰€ø}¹×‘“ˆˆ7"nD܈¸q'âNÄEÄEÄEăˆ"D¼ñFÄïD¼ñNÄ“ˆ'O"ž@ü>êëH$â÷]_GN" ~Ÿöud$ q#âFĈ;'›SŸÙœÇ‘ß.ïc¾+œÛÛË®óÿþé6z?lßïÿvÿWßìoÅ|»ß¥øùñ¾ß®PØßÍc~rjŸýìóËHö§×—K^Ïz=ÜéÅô›u>Ñ8~øýDãÛaÁ|qû“×ϳkör~À¸hzÝ,gBãÆAÓêf¹F`Üh4À9€sçÎ 87àÜ€sÎ8wàÜsçÎY;¯×ŒMí¼^#0n 4šÚy½F`Ü4ÀÙ€³gΜ8;pvà,à,à,àÀ9€sçœpnÀ¹çœ;pîÀ9sç¬×kÆ&@S;¯×Œ¦v^¯7àlÀÙ€³gΜ8;ppppàÀ9€sçœpnÀ¹çœ;pNàœÀ9sÖÎë5ãF ©×kƃ¦v^¯7š p{P` ìA=(°u¾ÏæHûîþ¾éŸoÛúëÑÉÁôÇS·vx¨ÏÌÏLÕN>óãàWûïÛ¿½ha½‰éó-C»Ÿ=š>{§‰Ã æÃ–ýœ¼’¡ŽŒDA¢Ñz¼5ŽD¢¢õxk9‰ˆ¸ˆ¸ˆ¸ˆ¸ˆxñ âAÄoD¼ñNÄ;ïD¼ñ$âIĈo—TŒ#'ß.©GF¢ ß.©G"7"nD܈¸q'âNĈ‹ˆ‹ˆ‹ˆ"D¼ñFÄoD¼ñNÄ;O"žD<øvIÅ82‰€øvIÅ8‰€øvIÅ8rq#âFĈw"îD܉¸ˆ¸ˆ¸ˆxñ âAăˆ7"Þˆx#âˆw"Þ‰xñ$âIĈo—TŒ#‘ˆo—TŒ#'Ùœ"›SdsŠlN‘Í)²9E6§ÈæÙœúÌædÿêyÈN3à2-À?ö[ìÓóí¸Ågîp±ÿ|áÁMg=»ØúÔívöñ¿ÏÕþÓå=ûÉ£à5ÿáìv‰Ï+2ízò9®—ýóìðS;›geÔ@tŸged$ %ˆîó¬ŒD¢"#âFĈ;w"îD܉¸ˆ¸ˆ¸ˆxñ âAÄoD¼ñFÄ;ïD¼ñ$âIĈ?æY‰‚D@ü1ÏÊH$âyVFN""nD܈¸q#âNĈ;"D<ˆxñFÄoD¼ñNÄ;O"žD<‰xñÇ<+#‘ˆ?æY9‰€øcž•‘‘(HDĈ7"îD܉¸Ÿ‹ŸÎ3Mª_¼•÷gëùrU?É—jÿb›*_o»nZ¿Û?ïþÏ~¹ÿV£üÕ¶ªÖ­ôú)>¼Kßí%ÒN~zØ»þ-¯Š~z¸ÓWEM«›Ç«¢‹Æ@ Éºy¼*ºhš^7 87àÜ€sÎ8wàÜsçÎY;/¯Š.Mí¼¼*ºh 4šÚyyUtÑ4ÀÙ€³gΜ8;pvà,à,à,àÀ9€sçœpnÀ¹çœ;pîÀ9s笗WE&@S;/¯Š.¦v^^]4àlÀÙ€³gΜ8;ppppàÀ9€sçœpnÀ¹çœ;pNàœÀ9sÖÎË«¢‹F ©—WEƒ¦v^^]4š p6àlÀÙ€3؃{Pç{ð¾ÌôtçtM¿/Þ[öõ;¤û÷~»N¦õî'wmû÷zûÕè*áå«ßþAžÞÍ~ùê7l–¯~ãÆ@ ÉºY¾ú¦×ÍòÕoÜçœ8'pNàœµóír@S;ß®WÐ8hjçå}‹Æ@ Îœ 8pvàìÀÙ³€³€³€³€sçΜpnÀ¹çœ;pîÀ¹çÎ œ³v^OÃÆƒ¦v^OÃÆ&@S;¯§aãF Îœ 8pvàìÀÙ³gggçΜ87àÜ€sÎ 8wàÜsÎ œ8gí¼ž†M€¦v^OÃÆ@S;¯§aãÆAœ 8p6àlÀÙ³gÎÎ`:؃ö ƒ=è`:؃ö ƒ=è`:؃ö ƒ=è`:؃ö ƒ=(°ö À؃{P` ìA=(°ö À؃{P` ìAïÁóÓ°i‡]±—cMO"ìv}~àßïY·ùÙ·üäÚvÒöÕößmñúʬýdLϳzÏãÃ?“õ>„û=¿ á¸iu³Ü„pÜh4Y7Ë Ç@ÓëÆ€³gΜ8;pvà,à,à,àÀ9€sçœpnÀ¹çœ;pîÀ9sç¬×Û ŽM€¦v^o18nšÚy½¿à¸qÐgΜ 8pvàìÀÙ³€³€³€sçΜ87àÜ€sÎ8wàÜsçÎ œ³v^o"8nšÚy½ƒà¸qÐÔÎëíÇ&@œ 8p6àìÀÙ³Ÿ:ß7Ðß6Ðôö¢k}›¿ }ÞǼ×åPhÿ±Ï/uqдºY…Æ&@“u³ ¦×MÎ8wàœÀ9sç¬×‹Æ@S;¯ ŒMí¼^$0n 4àlÀÙ€³gΜ8 8 8 8 8pàÀ¹çœpîÀ¹çœ;pNàœÀ9kçõ"q㠩׋Æ&@S;¯ Œ8p6àlÀÙ³gΜœœœ8pàÜ€sÎ 87àÜsÎ8'pNàœµóz‘À¸1Ðhjçõ"q#ÐÔÎëEãÆAœ 8p6àlÀÙ³gÎ`:؃ö ƒ=è`:؃ö ƒ=è`:؃ö ƒ=è`:؃ö ƒ=è` ìA=(°ö À؃{P` ìA=(°ö À؃{Pç{ð~@öå—‡²Ió¢Ûá->nßAÿíóA™¥öñðvŠ×éó_oדOðÙ ®ÿú|þdó÷þû÷wü_ÇŸ \úác?lW |½?ªÈ·3Œëú®×ý¼÷—>¿šèˆWŸÞ·ïõðÁ'ã·Ž:ˆîïXYFN¢¢û;V–‘‘(H” J"žD<øãJ‘2rñÇÅ"ed$ ñÇ#e$q#âFĈ;w"îD܉¸ˆ¸ˆ¸ˆxñ âAÄoD¼ñFÄ;ïD¼ñ$âIĈ?.%)##Qˆ?.')#‘ˆ?®()#'7"nD܈¸q'âNĈ‹ˆ‹ˆ‹ˆ"D<ˆx#âˆ7"Þ‰x'âˆ'O"žD<øãb“2‰€øãz“2rñÇ%'ed$ q#âFĈ;w"îçâ÷mý_Ózzb~‘Öä·û‹æ_ß@äõm¿Ýþéý|¿ßź_«rxtr­ÊrFµÿØókÆM–Íz͸hzÝ,gTãÆAÓêf9£7š p6àlÀÙ€³gΜœœœœ8pàÜ€sÎ 8wàÜsÎ8'pNàœµóz͸qÐÔÎë5 ãÆ@ ©×kÆ@œ 8p6àìÀÙ³gÎÎÎΜ8pnÀ¹çœpîÀ¹çœ8'pÎÚy½faÜh4µóz͸hjçõš…qã Îœ 8p6àìÀÙ³gggçΜ8pnÀ¹çœ;pîÀ¹çÎ`:؃ö À؃{P` ìA=(°ö À؃{P` ìA=(°u¾4ÿðÃçsŸþмÈßž«\^¿¹¿¿Záö’ê'a¾?pù¸%Îe>a9~9ay|xúØÓW²ƒ¦ÕÍã«@Ñh4Y6Ë©PÑ4µór*T4šÚy9*M€8p6àlÀÙ³gÎÎÎÎΜ8pnÀ¹çœ;pîÀ¹çœ8'pÎÚy9*Mí¼œ &@S;/§BE#ÐgΜ 8;pvàìÀÙ³€³€³€sçΜpnÀ¹çœ;pîÀ¹çÎ œ³v^N…ŠÆ@ ©—S¡¢hjçåT¨h4ÀÙ€³gΜ8;pvà,à,à,àÀ9€sçÎ 87à ö ƒ=è`:؃ö ƒ=è`:؃{P` ìA=(°ö À؃{P` ìA=(°ö ÀÔùüÑá]î§BÓo‹v7uÜßçrúd‡î~ô/ϯq¹EÊó׸„tö¹µÝ†ò§¿Ç-3óv¿?åÉãו,7zúà“#ˆ: %ˆ– ‘HÔA´Üc¨ˆœD D"â"â"â"âAăˆoD¼ñFÄ;ïD¼ñNÄ“ˆ'O ¾Þ‡¶ˆœD@|½m‰‚D@|½m‰DD܈¸q#âNĈ;w"."."."D<ˆxñFÄoD¼ñNÄ;ïD<‰xñâëj‹ÈH$âëÍj‹H$âëýj‹ÈIDĈ7"nD܉¸q'â"â"â"âAăˆ"Þˆx#âˆw"Þ‰x'âIÄ“ˆ'O ¾ÞʶˆD" ¾ÞͶˆœD@\dsŠlN‘Í)²9E6§ÈæÙœ"›Sdsê3›ó~ÞñãÃyÇ´¼.Šú¼ã©œw<•çç~mgŸûõ¼ãõÝpï·øøÝþê¿_Ysüxp¾±œî?öüÊ‘qÓëf9)7šV7ËIá¸1Ðh²n 8p6àìÀÙ³ggggçΜ87àÜ€sÎ8wàÜsÎ œ8gí¼^92n4µózåȸ1ÐhjçõÊ‘q#ÐgΜ 8;pvàìÀÙ³€³€³€sçΜpnÀ¹çœ;pîÀ¹çÎ œ³v^¯7šMí¼^92nšÚy½rdÜ8h€³gΜ 8;pvàìÀYÀYÀYÀ9€sçΜpnÀ¹çœ;pîÀ9sçÎY; ìA=(°ö À؃{P` ìA=(°ö À؃{Pç{ðG§o”êÓ¡‹ÚÛ×ÅÛ÷'O%öç%y?Ä8|z³ ÇOlÿ±§oòS4šMÖÍòmÜ4½n–/hãÆAœ8'pNàœµózÀ5nšÚy=à7šÚy=à7š p6àlÀÙ€³gΜœœœœ8pàÜ€sÎ 8wàÜsÎ8'pNàœµózÀ5n4µózÀ5n 4šÚy=à7 p6àlÀÙ€³gΜ8 8 8 8pàÀ¹çœpnÀ¹çœ;pNàœÀ9kçõ€kÜh4µózÀ5nšÚy=à7àlÀÙ€³gΜ8;ppp{ÐÁt°ìA{ÐÁt°ìA{ÐÁt°ìA{ÐÁt°ö À؃{P` ìA=(°ö À؃{P` ìA=¨ó=ø£Ã»`·ËýkÞEýíùÖm½bh½/ñÛ™þWØÉ‡]ìùÃŽç[ÓŸ?׿'|z…ÐwÛ ¿?œ€ÍWBíå䬎‚D ¢õÒÉq$u­—NŽ#'QQñ$âIĈß.7‰D@üv½’ÈIÄ·—ë##Qˆˆ7"nD܉¸q'â"â"â"â"âAăˆoD¼ñFÄ;ïD¼ñNÄ“ˆ'O ¾½\o9‰€øör½qd$ ñíåzãH$"âFĈw"îD܉¸qqqñ âAăˆ7"Þˆx#âˆw"Þ‰x'âIÄ“ˆ'ß^®7ŽŒDA" ¾½\o‰D@|{¹Þ8rq#âFĈw"îD܉¸ˆ¸ˆ¸ˆ8ÙœN6§“Íéds:ÙœN6§“Íéds:ÙœN6§“Íéds:ÙœN6§ÈæÙœ"›SdsŠlN‘Í)²9E6§ÈæÙœ"›SdsŠlN‘Í)²9õ™Íù£ãm÷˜¾ÂÞ¦*W‹}Üî ôÝv>öúŽ`ûÛRÏÞOêù ±_ßMlÿæÝÓDÌ<|üë»ýîì2«}}~™Õ°YŽÕÇ&@“e³^f5nš^7˱ú¸qÐÔÎëeVãÆ@ Îœ 8pvàìÀÙ³€³€³€³€sçΜpnÀ¹çœ;pîÀ¹çÎ œ³v^/³7šÚy½ÌjÜh4µóz™Õ¸h€³gΜ8;pvàìÀYÀYÀYÀ9€sçÎ 87àÜ€sÎ8wàÜsçÎY;¯—YM€¦v^/³7Mí¼^f5n4ÀÙ€³gΜ8;pvà,à,à,àÀ9€sçÎ 87àÜ€sÎ`:؃ö ƒ=è`:؃{P` ìA=(°ö À؃{P` ìA=(°ö ÀÔù|sÄsy¹öÛû/þnwÖ3=˽ïŽôq{·±OûkŸîWP]Þ>Èuú³ÃæKïéé¬cú³£l¦?;êÆ@ Éº™þ쨦×ÍôgGÝgçΜ8pnÀ¹çœ;pîÀ¹çÎ œ8gí<Ÿ%Ö@S;Ïg‰uã ©ç³Äº1Ðh€³gΜ8;pvà,à,à,à,àÀ9€sçœpnÀ¹çœ;pîÀ9sç¬ç³ÄºqÐÔÎóYbÝh4µó|–X7 p6àlÀÙ€³gΜ8 8 8 8pàÀ¹çœpnÀ¹çœ;pNàœÀ9kçù,±n 4šÚy>K¬¦vžÏëÆAœÁt°ìA{ÐÁt°ìA{ÐÁt°ìA{ÐÁt°ìA{ÐÁt°ìA{ÐÁt°ìA{P` ìA=(°ö À؃{P` ìA=(°ö ÀÔ`Nu> w‡Š·¦çCÅé¶K\ß^õ¥íñÛíMå~½ýß~ñ™£Åé€kèùñŽg‚ %ˆ¦?@$uM€ÈIÔ@D<ˆxñ âˆ7"Þˆx'âˆw"žD<‰xñâóQ!ˆD" >Ÿ‚ÈIÄçC‰‚DD܈¸q#âNĈ;"D<ˆx#âˆ7"Þ‰x'âˆw"žD<‰xñù,DN" >'‚ÈH$âó‘"ˆD""nD܈¸q'âNĈ;"D<ˆx#âˆ7"Þˆx'âˆw"žD<‰xñù°DF¢ ŸA$ñùÌDN""N6§“Íéds:ÙœN6§“Íéds:ÙœN6§“Íéds:ÙœN6§“Íéds:ÙœN6§“Íéds:ÙœN6§“Íéds:Ùœ"›SdsŠlN‘Í)²9E6§ÈæÙœ"›SdsŠlN‘Í)²9E6§F›ópԨόÏßÏ(lj=¦?tm*ooï/gÛ¡äoŸÞmáåzÕá#>îÏ0¿ûÌ Rç'°ívòù¯ý°=À‡ç“µ¸èäÃÞ¼÷õntŸ¶—Ò>ý\~þúrÝ“—T>=úéK*‹&ëæq mÑ4½n—Ѓ¦ÕÍã%•Eœœœ8pàÜ€sÎ 8wàÜsÎ8'pNàœµóò’Ê¢qÐÔÎËK*‹Æ@ ©——T@œ 8p6àìÀÙ³gÎÎÎΜ8pnÀ¹çœpîÀ¹çœ8'pÎÚyyIeÑh4µóò’Ê¢hjçå%•Eã Îœ 8p6àìÀÙ³gggçΜ8pnÀ¹çœ;pîÀ¹çÎ œ8gí¼¼¤²hšÚyyIeÑ8hjçå%•Ec  Ðg°ö À؃{Pç{ðõxáíÉ´W.ao&»]wwª—ÛívÈ^î7Âúçù‡¯·1ÿÍþL¡¿ôk?ùL·×{jýr—¬O'oŽøôñ§oŽX4½n–/)ãÆAÓêfù’2n 4š,›å®]E#ÐÔÎË]»ŠÆAS;/wí*M€8p6àlÀÙ³gÎÎÎÎΜ8pnÀ¹çœ;pîÀ¹çœ8'pÎÚy=b7šÚy=b7šMí¼18p6àlÀÙ³gΜœœœ8pàÜ€sÎ 87àÜsÎ8'pNàœµózÄ4n 4šÚy=b7Mí¼1 p6àlÀÙ€³gΜ8 8 8 8pàÀ9€3؃ö ƒ=è`:؃ö ƒ=è`:؃ö À؃{P` ìA=(°ö À؃{P` ìA=(°u¾ß\ÁòrÕóëëæ')—ðÃÛ~»ýð›í¯¾Úކ>œ\(ròš»ùeřϟãä>Se4¿°¸ŽŒDA¢Ñüââ:‰:ˆæ××ïD<‰xñ$â Äï·ª#‘ˆßïÕÛõ÷ëÙãµíc¿Ýÿt?î¯"{¼Òm¿ˆõÒæ×¨~’Ÿö7ùúMõ ÷c\nÏzý¿oa×ϰþô—¿¿þ¿ã;“÷Ã#¼3yÝß™¼ŒD¢¢û;“—‘“¨èþÎäed$"âˆw"Þ‰x'âIÄ“ˆ'¼3y‰‚D@üñÎäe$ñÇ;“—‘“ˆˆ7"nD܈¸q'âNÄEÄEÄEăˆ"D¼ñFÄïD¼ñNÄ“ˆ'O"ž@üñÎäe$ñÇ;“—‘“ˆ?Þ™¼ŒŒDA""nD܈¸q'âNÄý\üü5Ó§½ÄÛw«º^¶'¿ޞcþËî9ðôçÒÍn‡ý°}ÌÇçÅFogŸê{ >==Üñ |2»ÜnãŸãïý üâ/a‡ñõøúËË­gàóïã#¯C­£ Q‚èþ\¾ŒD¢¢ûsù2r55"Þˆx#âˆw"Þ‰x'âIÄ“ˆ'<—/##Qˆ?žË—‘HÄÏåËÈIDĈ7"nD܉¸q'â"â"â"âAăˆ"Þˆx#âˆw"Þ‰x'âIÄ“ˆ'O þx._F"<—/#'<—/##Qˆˆ7"nD܉¸q??.ëSÔÞ>y½mO¡¿ß߉mú·Ðõä#ïU»º?ߣÛ!¾?½þÕó»=èz;{Øëv›µ×WRØ?ç}+‹Og/3Þ?æùËŒÇM–Íú2ãq#ÐôºY.+7šV7ËeåãÆ@ Îœ 8pvàìÀÙ³€³€³€³€sçΜpnÀ¹çœ;pîÀ¹çÎ œ³v^_fLóà}w¼{Ìô¤ýÇüx|Ìé—ø~6tøÔÔÙÐÃeÿ˜çç>Ãfù}>n 4š,›õÜgÜ4½n–ßçãÆAS;¯ç>ãÆ@ Îœ 8pvàìÀÙ³€³€³€³€sçΜpnÀ¹çœ;pîÀ¹çÎ œ³v^Ï}ƃ¦v^Ï}Æ&@S;¯ç>ãF Îœ 8pvàìÀÙ³gggçΜ87àÜ€sÎ 8wàÜsÎ œ8gí¼žûŒM€¦v^Ï}Æ@S;¯ç>ãÆAœ 8p6àlÀÙ³gÎÎÎΜ8pàÜ€sÎ 8wà ö ƒ=è`:؃ö ƒ=(°ö À؃{P` ìA=(°ö À؃{P` ìAïÁósŸé9à¥ùÛ{Ùýf½Û¹Ë¯·#—ùŸë¿îpæ÷u¶³G¹áüvOO%Ý훃œÏ|’éKÓõªÃ¾ž}}8Ýñû9ݦ§Ó—µÑOj¢1ý*úõä±ß¼ î›ý6Ÿ¹ÚÙGüá‡\÷uíÏz²¢ÊhžQud$ %ˆæ)UG"QѼ¦êˆˆw"îD܉¸qqqñ âAăˆ7"Þˆx#âˆw"Þ‰x'âIÄ“ˆ'¿¬:2‰€ø}hÕ‘HÄï[«ŽœDD܈¸q#âFĈ;w"."."."D<ˆxñ âˆ7"Þˆx'âˆw"žD<‰xñâ÷VG"¿/±:rñû«##Qˆˆ7"nD܉¸q??βvy›þd¸4½ývüõþö+ûU°¾ãËüÝúåïmÿò‹|¹yûìÃÍko×O_×oqÚëùãή¸¶ëKÌ— ?þ¶­Ê߬Cçö'Û o¿Ý¯¬ËËôéäQ+ëçÛ>úù6Oo {ß“Ïß-LÃ#fJÞæ{úô³«¶x\qø—°é?ækœ}¨m¯—ù´q|<üTϤ¿gϤËÈIÔ@t&]FF¢ Q‚èþLºŒD""žD<‰xñÇ3é22‰€øã™t‰D@üñLºŒœDD܈¸q#âFĈ;w"."."."D<ˆxñ âˆ7"Þˆx'âˆw"žD<‰xñâgÒe$ñÇ3é2rñÇ3é22‰ˆ¸q#âFĈ;÷sñógÒÓ/ô¥Åá¿:y:ýõöüñï¿Ëq{¹6;}¨ý³çÇ÷®öÙÓµžË÷¼ÇM€&ëfùž÷¸hzÝ,ßó7šV7œ8pàÜ€sÎ 8wàÜsÎ œ8'pÎÚy½zÜ4µóz ô¸qÐÔÎë5ÐãÆ@ Îœ 8pvàìÀÙ³€³€³€³€sçΜpnÀ¹çœ;pîÀ¹çÎ œ³v^¯7šÚy½zÜh4µóz ô¸h€³gΜ8;pvàìÀYÀYÀYÀ9€sçÎ 87àÜ€sÎ8wàÜsçÎY;¯×@M€¦v^¯7Mí¼^=n4ÀìA{ÐÁt°ìA{ÐÁt°ìA{ÐÁt°ìA{ÐÁt°ìA{ÐÁt°ìA{ÐÁt°ö À؃{P` ìA=(°ö À؃{P` ìA=¨ó=x?"üò˧3ÂëôÄþÒÚwFè/—ëÙ#ùÉáSvzDX4š¬›Ç E#Ðôºyü‘P4šV7œ8pàÜ€sÎ 8wàÜsÎ œ8'pÎÚy9",¦v^Ž‹ÆAS;/G„Ec  ÐgΜ 8;pvàìÀYÀYÀYÀYÀ9€sçÎ 87àÜ€sÎ8wàÜsçÎY;/G„Eã ©—#¢1Ðhjç到hàlÀÙ€³gΜ8;ppppàÀ9€sÎ 87àÜ€sÎ8wàœÀ9sÖÎËaÑh4µórDX4Mí¼ƒ8ƒ=è`:؃ö ƒ=è`:؃ö ƒ=è`:؃ö ƒ=è`:؃ö ƒ=è`:؃ö ƒ=è`:؃ö À؃{P` ìA=(°ö À؃{P` ìA=(°u¾ïG„ûxóÛ?Ÿþÿ?¼ûÁŸ]ßçû/þþÍïp½XÏ÷Ó/BÚîU.±ÿÍyy¹Î‡ûìþb“Ÿn/‡ù¸ÿ=Ö_úíðÈ÷טülÿÉ~=þ.Ú¿þåû³{,ì¦/±·çŸäõÇsò§_¼û‹wÿýÝÜýdú±åíý?½Óã)Æîo.Ó_þãÒ½ù?íÒõãÿñÝ_½ÿoÓãþºl endstream endobj 51 0 obj <> endobj 52 0 obj <>/ProcSet[/PDF/Text]>> endobj 53 0 obj [54 0 R 55 0 R] endobj 54 0 obj <>stream xÚ+ä2P0PÈå2µ4Ñ372s`LsK# ÇJgp…+äqÕ- , endstream endobj 55 0 obj <>stream xÚ3P)ç2PIî@œÎåÂ¥ïf¨`©’Æe¨`„† ¦& Fz–Ʀ !¹\1†Qš!Y\®!\\…\ 5¹@ÒÜÒH!‡ËÔÒDÏÜ•cdf@Õ! ¡(…éÏà WÈš Q˜¨ endstream endobj 56 0 obj <> endobj 57 0 obj <> endobj 58 0 obj <> endobj 59 0 obj <> endobj 60 0 obj <> endobj 61 0 obj <> endobj 62 0 obj <> endobj 63 0 obj <>/ProcSet[/PDF/Text]>> endobj 64 0 obj [65 0 R 66 0 R] endobj 65 0 obj <>stream xÚ+ä2P0PÈå2µ4Ñ372s`LsK# ÇJgp…+äqÕ- , endstream endobj 66 0 obj <>stream xÚÚÁŽ5ÀñûmlFB¢D" >mlFJ" >mlF‘DD\ˆ¸q!âBÄ#D<q%âJÄ•ˆ'"žˆx"≈g"ž‰x&â…ˆ"^ˆ¸q#âFÄ ˆOÛ›‘’ˆOÛ›Q$Ÿ¶6#!Q"".Dœ¬9•¬9•¬9õž5ç×ãátû`˜D¸xh–»MPרõÝ*÷{=üsú^d‘Ó+¶o"ïDz[^tÚ¸›×ûwËS‡™jˆg†sßÞð6õåÞoÕn= M þ´]î<øaù5î<,F±½ñ°a¶àíÂmÿº\kö/ËÕFAS¶›ýkrµ‰ ÉÛÍ~dµÐgÎ 8'àœ€sÎ8gà\€sÎ8àlÀÙ€³m;Ï{«MͶó¼á±Úhh¶çÍŽÕFAœ8 pàsÎ8Gà¬ÀY³çœpNÀ9ç œ3pÎÀ¹çœ p6àlÀÙ¶ç-ÕF@“@³íuGÔ¤ûó_tW»‡ëþR,× endstream endobj 67 0 obj <> endobj 68 0 obj <>/ProcSet[/PDF/Text]>> endobj 69 0 obj [70 0 R 71 0 R] endobj 70 0 obj <>stream xÚ+ä2P0PÈå2µ4Ñ372s`LsK# ÇJgp…+äqÕ- , endstream endobj 71 0 obj <>stream xÚ3P)ç2PIî@œÎåÂ¥ïf¨`©’Æe¨`„† ¦& Fz–Ʀ !¹\1†11š!Y\®!\\…\ E¹@ÒÜÒH!‡ËÔÒDÏÜ•cdf@Õ! ¡(…éÏà WÈš  endstream endobj 72 0 obj <> endobj 73 0 obj <> endobj 74 0 obj <> endobj 75 0 obj <> endobj 76 0 obj <> endobj 77 0 obj <> endobj 78 0 obj <> endobj 79 0 obj <> endobj 80 0 obj <> endobj 81 0 obj <> endobj 82 0 obj <> endobj 83 0 obj <> endobj 84 0 obj <> endobj 85 0 obj <> endobj 86 0 obj <> endobj 87 0 obj <> endobj 88 0 obj <> endobj 89 0 obj <> endobj 90 0 obj <> endobj 91 0 obj <> endobj 92 0 obj <> endobj 93 0 obj <> endobj 94 0 obj <> endobj 95 0 obj <> endobj 96 0 obj <> endobj 97 0 obj <> endobj 98 0 obj <> endobj 99 0 obj <> endobj 100 0 obj <> endobj 101 0 obj <> endobj 102 0 obj <> endobj 103 0 obj <> endobj 104 0 obj <> endobj 105 0 obj <> endobj 106 0 obj <> endobj 107 0 obj <> endobj 108 0 obj <> endobj 109 0 obj <> endobj 110 0 obj <> endobj 111 0 obj <> endobj 112 0 obj <> endobj 113 0 obj <> endobj 114 0 obj <> endobj 115 0 obj <> endobj 116 0 obj <> endobj 117 0 obj <> endobj 118 0 obj <> endobj 119 0 obj <> endobj 120 0 obj <> endobj 121 0 obj <> endobj 122 0 obj <> endobj 123 0 obj <> endobj 124 0 obj <> endobj 125 0 obj <> endobj 126 0 obj <> endobj 127 0 obj <> endobj 128 0 obj <> endobj 129 0 obj <> endobj 130 0 obj <> endobj 131 0 obj <> endobj 132 0 obj <> endobj 133 0 obj <> endobj 134 0 obj <> endobj 135 0 obj <> endobj 136 0 obj <> endobj 137 0 obj <> endobj 138 0 obj <> endobj 139 0 obj <> endobj 140 0 obj <> endobj 141 0 obj <> endobj 142 0 obj <> endobj 143 0 obj <> endobj 144 0 obj <> endobj 145 0 obj <> endobj 146 0 obj <> endobj 147 0 obj <> endobj 148 0 obj <> endobj 149 0 obj <> endobj 150 0 obj <> endobj 151 0 obj <> endobj 152 0 obj <> endobj 153 0 obj <> endobj 154 0 obj <> endobj 155 0 obj <> endobj 156 0 obj <> endobj 157 0 obj <> endobj 158 0 obj <> endobj 159 0 obj <> endobj 160 0 obj <> endobj 161 0 obj <> endobj 162 0 obj <> endobj 163 0 obj <> endobj 164 0 obj <> endobj 165 0 obj <>/ProcSet[/PDF/Text]>> endobj 166 0 obj [167 0 R 168 0 R] endobj 167 0 obj <>stream xÚ+ä2P0PÈå2µ4Ñ372s`LsK# ÇJgp…+äqÕ- , endstream endobj 168 0 obj <>stream xÚ­ÝÛ®+Ùu˜áû~о ÀX*rœoƒØN€AÁÝj.ØF`Hnò²Ô–…èu˶^Py„Y¬Ú»XÅ9þ½ ^êîý³Èõ­Ã®1ëÀéóiþ¿ÿý7ŸM÷øoù™éçaòùßf–oq½ÿËß}ø¿ý‹>þáo?ûëùßý?·ÿý³ÿÝϾóÓç×ù_þú³Ë}{—Ïo­\Þd²Ï¿û÷ŸýÛLÓô÷Ýÿ±ý¹OoårhþóíÃ_}†¼Uæ!üâã&õ­ôØü·›²·ªãþ§›Ëo~9F±‹.ó–ŽÍØ5×x9üùíù}ø»ÜäÍåø Ü!¾ó·ç|¶ìmšñ(/;Žº¾Ùs1ý`º^nÿûÛÛ‡¯o~½üçËõñÇÿ½Èî¥éõí:]^nnþÿ}ï×7Ó§·çÇ­Ï»{üüu2‹³Çß_ß/o~ûðóùÃõÏnÿô‹ûgóñV®¢o^y²•éþ*~³}þÿ¸màçÛ–wûð“Û‡o·?ýÍá9dò·œüì9|3þvÛÔ/¶WÿÍn+:½Å¥_Ð?î#!‘“¨@dW‰D~!‘’(@D<ˆxñ âIÄ“ˆ'/"^D¼€¸N‰„DN" ®—+‰ŒD@\¯)‰ˆ¸q!âBÄ…ˆ+W"®D܈¸q#âNĈ;w"D<ˆxñ$âIÄ“ˆ/"^D¼€¸MW‰€¸].$Rq»N$9‰ˆ¸q!âBÄ•ˆ+×sñ/»óóî¾Ï»ô“Ô}yØÝ*nû˺í…~³íÁ~Ø¿ýéýOw»ÞóoñL=ÙÔ%¶ÝØßn~±íCÿ|·•ÛøõðŠÿ¸o¢on?Þm# qÐTÛ\o?Úmc É¾¹ý\·‚¦w¾^'Ðh4ÀY€³gÎ œ8+p6àlÀÙ€³gΜ8pàÀ9sçÎ œ 8p®ÞY¦ h4½³\&Ðh4½³\¯ 1ÐgΜ8+pVà¬ÀY³gΜ8;pvàÀ9€sçÎ œ8'p.à\À¹zçûbPÛh4½ó}!¨m 4½ó}¨m4ÀY€³gΜ8+pVàlÀÙ€³gΜ8;pàÀ9€sg0*˜̃ æAó ‚yÐÀÜíÃáêßí÷ð§ùÓò³ €]üÛñ€ËáÁ'úHI ºßø¬„DN¢ÑýÆgmd$"âNĈ;"D<ˆxñ$âIÄ“ˆ/"^@|¹ñY ‰œD@|¹ñY‰€ørã³6Rq!âBÄ…ˆ W"®D\‰¸q#âFĈ;w"îD<ˆxñ âIÄ“ˆ'/"^D¼ˆxñåÆgmd$âËÏÚHIÄ—Ÿµ‘ÈIDÄ…ˆ "®D\‰¸ž‹Ÿó/ýI?œ úÃã̱/†3Ç5Nò?ÑÌ×ë}ÇÌ1]ëì%¾{æ˜RÏ„dÛÞ?ïÏ»¼]êø ¾Þ„øÍö|ØŸádˈrx>2¢¬{úO_ðó=ýqT Z÷ôÇ‘‘(A´îé#%Q€hÝÓGD<ˆxñ$âIÄ“ˆ/"^@|ÛÓGB"'ßöôÇ‘‘ˆo{úãHIDÄ…ˆ ".D\‰¸q%âFĈw"îD܉¸ñ âAăˆ'O"žD¼ˆxñ"âÄ·=ýqd$âÛžþ8RñmO ‰œDD\ˆ¸q!âJÄ•ˆë¹øÇ÷]ýÛî¯no~rùÑqW_¼~’ù/>‹8ëÙbûe~áy;Ÿæ¸~Oöò¸¡úó糿ZëqCõqô¸¡z)‰Dª7‘ÈIT}t}ÜP½‰ŒD@üz¹HIį׉DB"'".D\ˆ¸q%âJĈ7"nD܉¸q'âAăˆO"žD<‰xñ"âEÄ ˆß/ië#%¿_ÕÖGB"'¿_ÙÖGF"".D\ˆ¸q%âJÄ•ˆ+7"nD܈¸q'âNăˆ"D<‰xñ$âEÄ‹ˆ_ßÄ«‰„DN" ¾¾‰W‰€øú&^M¤$"âBÄ…ˆ "®D\‰¸q#âFĈ;w"îD܉xq2s*™9•ÌœJfN%3§’™SÉÌ©dæT2s™9ÌœFfN#3§‘™ÓÈÌidæ42s™9ÌœFfN#3§‘™ÓÈÌidæ´3ç‹®y˜Ô·êÇÇ®}1Xá’·¼­púW‡v/óסêzx;´{q[ÄŽ¯,ˆ­?¾OŸþù’Ñ8ª>Ú–ŒÆ‘‘(A´þøŽ#%Q€hýñGB"'".D\ˆ¸q%âJĈ7"nD܉¸q'âAăˆO"žD<‰xñ"âEÄ ˆoKFãHIÄ·%£q$$rñmÉh‰ˆ¸q!âBÄ•ˆ+W"®D܈¸q#âNĈ;"D<ˆxñ$âIÄ“ˆ/"^@|[2GB"'ß–ŒÆ‘‘ˆoKFãHIDÄ…ˆ ".D\‰¸q%âFĈw"îD܉¸ñ âAăˆ'O"žD¼ˆ8™9•ÌœJfN#3§‘™ÓÈÌidæ42s™9ÌœFfN#3§‘™ÓÈÌidæ42s™9Ìœöbæüâpyƒéç6ÿ­>i죿:,=eû~w\ º­Õña_O„º¹åyòçWMì;ïN—8{ì'ÜÙè2OK™g¯¬<-K‡Ÿ-qtÑýÛ­ŒD ¢û·[)‰D÷%Ž6q#âNĈ;"D<ˆxñ$âIÄ“ˆ/"^@|Yâh#%_–8ÚHHä$âËG‰ˆ¸q!âBÄ•ˆ+W"®D܈¸q#âNĈ;"D<ˆxñ$âIÄ“ˆ/"^@|Yâh#!‘“ˆ/Kmd$âËG)‰ˆ¸q!âBÄ…ˆ+W"®D܈¸q#âNĈ;w"D<ˆxñ$âIÄ“ˆ/"^D¼€ø²ÄÑFF" ¾,q´‘’ˆ/Km$$rq2s™9ÌœFfN#3§½˜9Ï—8æÒIs}q\âØgÛÜÿ‹í2®ÿ»_☟úz|ØO¶E‡Ÿ=¿û—g<Ër>Íí<œýÚÆíÖ röªúu‘y_Ç®§ŸÑ'¬‹\¯Ë9Ç­u‘ÇÙ Ïö§g+4Qèq¶B‰D³šHI zœ­ÐDD<‰xñ"âEÄ ˆ¯g+4‘’ˆ¯g+4‘ÈIÄ׳šÈHDÄ…ˆ "®D\‰¸q%âFĈw"îD܉xñ âAăˆ'O"žD¼ˆxñâëÙ M$$rñõl…&2ñõl…&Rq!âBÄ…ˆ W"®D\‰¸q#âFĈ;w"îD<ˆxñ âIÄ“ˆ'/"^D¼ˆxñõl…&2ñõl…&Rñõl…&9‰ˆ¸q!âBÄ•ˆ+×sñóQ~žó&­}ôåq”ßgøl…§‡­àó'Oðò—ÿ·¿Ìez›§ð³ ?ôÕ¨3ÿM^®Ç'z=éèÕéçµtì­Ä_=ÓÉ ïç_¸“]N±ûûÝOË;¿¾ðMw/‡ï “#3Ms?0Ó5MõÍý L×h²oîGdº8;pàÀ9€sçÎ œ8p.à\½ór¦k4šÞy9Ó5šÞy9úÒ5 à,ÀY€³gÎ œ8+p6àlÀÙ€³gΜ8pàÀ9sçΜ 8p®Þy9ÄÒ5šÞy9¾Ò5 šÞy9¸Ò5 pà,ÀY€³gÎzêüåáÚÎÛ„1ÿ~½í îFŒ¯Ž#Æ>Ûïñ~»Ÿ6~º?Éð×ÛŸÞÿàÛýˆ0ïáúådóä4Çx«‹ž=ö“NsÌeH9læø8~÷„x~ã0ZÏ`GF¢Ñzã8RˆÖ3Ç‘ˆˆ'/"^D¼€øvã8Rñí Æq$$rñí Æqd$"âBÄ…ˆ W"®D\‰¸q#âFĈ;w"îD<ˆxñ âAÄ“ˆ'O"^D¼ˆxñí Æq$$rñí Æqd$âÛŒãHIDÄ…ˆ ".D\‰¸q%âFĈw"îD܉¸ñ âAăˆ'O"žD¼ˆxñ"âÄ·3Ç‘‘ˆog0Ž#%ßÎ`GB"'".D\ˆ¸q%âz.~>nϨ“]ïI½ŒÛûìO9nëmØ=lžÛ·›-JOñ›÷þóô¹Ñ ýø†}â;½Er9‰ DëÈ>ŽŒD ¢udGJ¢Qñ$âIÄ“ˆ/"^@|ÙÇ‘’ˆo#û89‰€ø6²##".D\ˆ¸q%âJÄ•ˆ7"nD܉¸q'âAăˆ"žD<‰xñ"âEÄ ˆo#û89‰€ø6²##ßFöq¤$"âBÄ…ˆ "®D\‰¸q#âFĈ;w"îD܉xñ âAÄ“ˆ'O"^D¼ˆxñâÛÈ>ŽŒD@|ÙÇ‘’ˆo#û89‰ˆ¸q!âBÄ•ˆ+×sñó‘}Þ/ŸLFo½µÌìûîO9³»Œ·¾?¿÷ö›G¯‡szG•Û”~x:2¥?δ~;Þ¸kgZMôM Ð8hªoü àìÀ9€sçÎ œ8'pNà\À¹€sõÎ÷…„¶QÐôÎ÷U„¶Ð8hzçõÊÛqc Îœ8 pVà¬ÀY³gΜ 8;pvàìÀ9€sçΜ8'pNà\À¹€sõÎë•·ãF@ã é×+oǦw^¯¼7 à,ÀY€³gÎ œ8+p6àlÀÙ€³gΜ8pàÀ9sçΜ 8p®Þy½òvÜhzçõÊÛq£ é×+oÇ€ÆAœ8ƒyÐÀ»úž>Ü êpk+9{„èþˆûþÔöùwøEõäapn¾ÌsßíÜö“ €¹ùqJʳÆ~¬zœ’2ާ¤4‘’(@ô8%¥‰„DN¢Ñã””&"âBÄ•ˆ+W"nD܈¸q#âNĈ;"D<ˆxñ$âIÄ“ˆ/"^@|½ ¢‰”D@|½ ¢‰„DN" ¾^ÑDF"".D\ˆ¸q%âJÄ•ˆ+7"nD܈¸q'âNăˆ"D<‰xñ$âEÄ‹ˆ_/ƒh"!‘“ˆ¯—A4‘‘ˆ¯—A4‘’ˆˆ ".D\ˆ¸q%âJĈ7"îD܉¸q'âAăˆO"žD<‰xñ"âEÄ ˆ¯—A4‘‘ˆ™9ÌœFfN#3§‘™ÓÈÌidæ42s™9ÌœFfN#3§½˜9¿<¼­Òm±f¼&óýbÍ‹5û¬Y¬‰ézòˆf±æò–‘gOôꂈù—g•Á.ˆ¸ÌŸÖmiçðtdig9iç™î¸@Ò6šê›å¤¦1Ðdß,'í4‚&úÆ€³gΜ8;pvàÀ9€sçÎ œ8'p.à\À¹zçÇEM£ éq4€ÆAÓ;?.âh pà,ÀY€³gÎ œ8p6àlÀÙ³gΜ8pàœÀ9sçΜ«w~\ÄÑ4Mïü¸ˆ£i 4½óã"ަQÐgΜ8 pVà¬ÀY³gΜ8;pvàìÀ9€sçÎ œ8'p.à\À¹€sõ΋8šÆ@Ó;?.âhMïl`40˜ ̃æAó yÐÀ{¹Î𔠞ʳ•+¿ž=5_jÐ ­¿0Æ‘ÈIT}´-R##Q‚èr!‘’ˆo‹TãHHä$"âBÄ…ˆ W"®D\‰¸q#âFĈ;w"îD<ˆxñ âIÄ“ˆ'O"^D¼ˆxñm‘j)‰€ø¶H5Ž„DN" ¾-R##".D\ˆ¸q%âJÄ•ˆ7"nD܉¸q'âAăˆ"žD<‰xñ"âEÄ ˆo‹TãHHä$âÛ"Õ82ñm‘j)‰ˆ¸q!âBÄ…ˆ+W"®D܈¸q#âNĈ;w"D<ˆxq2s*™9•ÌœJfN%3§’™SÉÌidæ42s™9ÌœFfN#3§‘™ÓÈÌidæ42s™9ÌœFfN#3§‘™Ó^Ìœç‹TóŽÍäº~x\£Úghêš—³Ç½|k"}“òÃ#è[岤ux>ôÞDï™'‹ó•¡Q´­ ##Q‚hý)GJ¢ÑúS:Ž„DN"".D\ˆ¸q%âJÄ•ˆ7"nD܈¸q'âNăˆ"žD<‰xñ$âEÄ‹ˆßV†Æ‘’ˆo+CãHHä$âÛÊÐ82q!âBÄ…ˆ+W"®D\‰¸q#âFĈ;w"D<ˆxñ âIÄ“ˆ'/"^D¼€ø¶24Ž„DN" ¾­ ##ßV†Æ‘’ˆˆ ".D\ˆ¸q%âJĈ7"îD܉¸q'âAăˆO"žD<‰xñ"âdæT2s™9ÌœFfN#3§‘™ÓÈÌidæ42s™9ÌœFfN#3§‘™ÓÈÌidæ´3çÉ™I·¥¡ùÕ䶯~t\ÚgãÓæ×?ûx!æëí.5?Ù¿ÑÏv‹/óþÓ%Ožj’õ¾;¯.½óôógsöÎÓMSmóxçé¦1Ðdß,W¦6‚&úf¹2µi4à,ÀY€³gÎ œ8p6àlÀÙ€³gΜ8pàœÀ9sçΜ 8Wïü¸SQÓ(hzçÇŠšF@ã éw*j pà,ÀY€³gÎ œ8p6àlÀÙ³gΜ8pàœÀ9sçΜ«w~Ü©¨i4šÞùq§¢¦1ÐôÎ;5‚8 pà,ÀY€³gÎ œ 8p6àìÀÙ³gΜ8pNàœÀ9sg0*˜̃æAó yÐÀâëí„ _l/ï‡u‰“Þó_ïWüMSÞ¯xa«ôdS>¡ëýwÞåüúpÂÓ7ÇêÇo‡“êm$$rˆîÔÛÈH” ºPo#%W"®D\‰¸q#âFĈ;w"îD<ˆxñ âAÄ“ˆ'O"^D¼ˆxñå€z ‰œD@|9 ÞFF" ¾Po#%".D\ˆ¸q%âJÄ•ˆ7"nD܉¸q'âNăˆ"žD<‰xñ"âEÄ‹ˆ_¨·‘‘ˆ/ÔÛHIÄ—êm$$rq!âBÄ…ˆ+W"®çâÇ«(n3ÜmÆòØ¢ïÝ>üÕq†Ûgà¶±ï>¨.÷ƒêÇç#Õ—ÁýéS:=`>jÖæãÆ@“}óX 7 šè›ÇɸÐ8h€³gΜ8+pVàlÀÙ€³gΜ8;pàÀ9€sçÎ œ8p.à\½ózÀ|Ü(hzçõ€ù¸Ð8hzçõ€ù¸1ÐgΜ8+pVà¬ÀY³gΜ8;pvàÀ9€sçÎ œ8'p.à\À¹zçõ€ù¸Ð8hzçõ€ù¸1ÐôÎëóq£ Îœ8 pà¬ÀY³gΜ 8;pvàìÀÙsçΜ8'pNà\À¹€3˜̃æAó yÐÀZ¦y¾ìaþ ò°Öy~»=ï7û£à¯Þ‘wþkîyöZúuŸå†‡ŸÝ œD¢û ÚÈH” ºß ”D¢$âIÄ“ˆ'/"^D¼€ørC‚6Rñåü‰69‰€ørþD‰ˆ¸q!âBÄ•ˆ+W"®D܈¸q#âNĈ;"D<ˆxñ$âIÄ“ˆ/"^@|9¢„DN" ¾œ?ÑFF" ¾œ?ÑFJ"".D\ˆ¸q!âJÄ•ˆ+7"nD܈¸q'âNĈ"D<‰xñ$âEÄ‹ˆ/ ¾œ?ÑFF" ¾œ?ÑFJ" ¾œ?ÑFB"'".D\ˆ¸q%âz.~>ÓÏßW“× Zfú}v›c¯Û8üíþ&•ö6E'XÎ÷þ—ýòõV·—úßG÷ßî‡}›òz²Ù“³À/óÎaNuˆGg_Ö;£<üñô}ZÆ‘’(@´Þe ‰œDÕGÛÝ8Ç‘‘ˆowãGJ" ¾Ýs ‰œDD\ˆ¸q!âJÄ•ˆ+7"nD܈¸q'âNĈ"D<‰xñ$âIÄ‹ˆ/ ¾Ýs)‰€øv7Îq$$rñínœãÈHDÄ…ˆ "®D\‰¸q%âFĈw"îD܉xñ âAăˆ'O"žD¼ˆxñâÛÝ8Ç‘ÈIÄ·»qŽ##ßîÆ9Ž”DD\ˆ¸q!âBÄ•ˆ+W"nD܈¸q'âNĈ;"DœÌœJfN%3§’™SÉÌ©dæT2s*™9ÌœFfN#3§‘™ÓÈÌidæ42s™9ÌœFfN#3§‘™ÓÈÌidæ42sÚ‹™ó¾®õÕÓâ×m4™žNzùÞaík_ݲüÓþF ¿ÚÖ­~¹Ëkldx?Ï絩x›2_mä÷Û+¿ÝoäÅ5J×Û¾øá%ýÃñ¤–Ùòâñþô£K£–«¨>\õÍñä–ù7“‡_û¤û‡þìüëÄóôµ:x†ÍcÞ7šì›Ç°3n4Ñ7IgÜh€³gΜ 8;pvàìÀ9€sçΜ8'pNà\À¹€sõÎëT3n4šÞyhƦw^Ç™q£ Îœ8 pà¬ÀY³gΜ 8;pvàìÀÙsçΜ8'pNà\À¹€sçê×™eÜhzçu`7 šÞyVÆ€ÆAœ8 pà¬ÀY³ž:ïpÿ¹ÛŒ2ï/Lq 2˲ÏÞ1¥húÙV>iL™·2]_nåÓç”ù[Í/‡íM*ó¸Î&ýè5×ûÞïqežyéUyq·½Ûá¡ ô”Ó¿nOþåùs‹É<%éË­õcÒ}WïðrÎöõºè¾³×FJ¢è£e¯„DN¢Ñ}Ÿ¯ŒD@|Ùík#%".D\ˆ¸q%âJÄ•ˆ7"nD܉¸q'âNăˆ"žD<‰xñ"âEÄ‹ˆ_öÛÈHÄ—Â6Rñe¿°„DN"".D\ˆ¸q%âJÄõ\ü|qþÅ1Åu}ÿ¸‡¸ÏÞ³‡x[ >nå÷ÅõåVÞµ‡8·÷bñ¶Ë}xæýîÚWÝ¢\óåFž÷ÒÎ.€{þj^×DN¢Ñã¸&2%ˆÀ5‘’(@¤D\‰¸q%âFĈw"îD܉xñ âAăˆ'O"žD¼ˆxñâëpM$$rñõ¸&2ñõ¸&Rq!âBÄ…ˆ W"®D\‰¸q#âFĈ;w"îD<ˆxñ âIÄ“ˆ'/"^D¼ˆxñõ¸&2ñõ¸&Rñõ¸&9‰ˆ¸q!âBÄ•ˆ+×sñ¯÷¾MO6͑짧ý[Å,ãÓ¾{ïøtÜÊ{Ƨ[y÷øô´½Áøtxæ—ãÓ÷_O/6‚Ƨ§/×ùø4ŽœD¢u|GF¢Ñ:>#%Q€H‰¸q%âJĈ7"îD܉¸ñ âAăˆO"žD<‰xñ"âÄ·ñi ‰œD@|ŸÆ‘‘ˆoãÓ8Rq!âBÄ…ˆ W"®D\‰¸q#âFĈ;w"îD<ˆxñ âIÄ“ˆ'/"^D¼ˆxñm|GF" ¾OãHIÄ·ñi ‰œDD\ˆ¸q!âJÄ•ˆë¹øùø4ïJN¡ûñé‡ÇéiŸ½wz:nå=ÓÓ‹­¼{zzÚÞ`z:<óÉôô£æØÓ‹m áéé‹u><#'QhžÆ‘‘(A´OãHI R"®D\‰¸q#âFĈ;w"îD<ˆxñ âAÄ“ˆ'O"^D¼ˆxñmxGB"'߆§qd$âÛð4Ž”DD\ˆ¸q!âBÄ•ˆ+W"nD܈¸q'âNĈ;"D<ˆxñ$âIÄ‹ˆ/"^@|žÆ‘‘ˆoÃÓ8RñmxGB"'".D\ˆ¸q%âz.~><Í3LaûáéGÇáiŸ½wx:nå=ÃÓ‹­¼{xzÚÞ`x:<óÉðôãæÈÓ‹m áéé‹u><#'QhžÆ‘‘(A´OãHI R"®D\‰¸q#âFĈ;w"îD<ˆxñ âAÄ“ˆ'O"^D¼ˆxñmxGB"'߆§qd$âÛð4Ž”DD\ˆ¸q!âBÄ•ˆ+W"nD܈¸q'âNĈ;"D<ˆxñ$âIÄ‹ˆ/"^@|žÆ‘‘ˆoÃÓ8RñmxGB"'".D\ˆ¸q%âz.þÕáænÃÓü…žÂ×F-ÃÓ>{ïðtÜÊ{†§[y÷ðô´½Áðtxæý𴜲×zz±4==}µÎ§§qä$*­ÓÓ82%ˆÖéi)‰DJÄ•ˆ+W"nD܈¸q'âNĈ"D<ˆxñ$âIÄ‹ˆ/ ¾MOãHHä$âÛô4ŽŒD@|›žÆ‘’ˆˆ ".D\ˆ¸q%âJĈ7"îD܉¸q'âAăˆO"žD<‰xñ"âEÄ ˆoÓÓ82ñmzGJ" ¾MOãHHä$"âBÄ…ˆ W"®D\ÏÅO§§KåÅàøÔ}zzÊÞ1=yÖa+ß|Êèdo^qöBÞ=:]íø’ÎG§ùçøä™_ŽN¯<ÅËô£Óá±g£S9‰ D×+‰ŒD "¹HI R"®D\‰¸q#âFĈ;w"îD<ˆxñ âAÄ“ˆ'O"^D¼ˆxñõ~{M$$rñõ~{Md$âëýöšHIDÄ…ˆ ".D\‰¸q%âFĈw"îD܉¸ñ âAăˆ'O"žD¼ˆxñ"âÄ×ûí5‘‘ˆ¯÷Ûk"%_ï·×DB"'".D\ˆ¸q%âz.~>:ÍõO‘ƒhöÙ;úê8<ì³Ûî®o{åÿ¸íóþ~Ûþv?=\Þrª“­|Ò 2ÿÚ¨‹žmå†ëü—ii½ÜÊ'O!óŽ›Þ®åyÚÞÉ2ï.Yž=ñeÛþG‡ã%yê÷WùÏûü|»Äñµ<Í?vzúuîÇšù×ð”ç_Ý}o—‹º?lØ_¾ZËMOöÚ(AtßCj#%Q€è¾“ÔFB"'QH‰¸q%âFĈw"îD܉¸ñ âAăˆ'O"žD¼ˆxñ"âÄ—§62ñeÿ©”D@|Ù…j#!‘“ˆˆ ".D\‰¸q=?ß™šUOùôÖ’ß?îLí³w,Åæí·òIk±ñ6ùõåVÞ³v9lïl5ö¶p¦0Éã,–xü»íw´æW|9{Ø=ÿ×íµþdð‹íõÿúyU®§/£ßã¹/{¶zØFJ¢Ñ}±„DN¢Ñ}±ŒDD¼ˆxñâËRb ‰œD@|Ù_n##_ö—ÛHIDÄ…ˆ ".D\‰¸q%âFĈw"îD܉¸ñ âAăˆ'O"žD¼ˆxñ"âÄ—ýå62ñe¹”D@|Ù_n#!‘“ˆˆ ".D\‰¸q=?ž”pÛ_žå§|z/Á“wYêÞs¿¡ÛÍ}ž¶ò©÷’8{!ï>çûâÇ—t~Î÷¼Cöò™¿Ý?ßý³ÿùú¤×óqúaû~ÞÃö‡ûEºù¯ýk_ÙO>,Ò=¯0zœÁœïEdï»­×ÃwÂq¯µm4Õ7·]Ö¶1ÐdßÜöWÛFAmsßYmƒ¦w¾ï¨¶¦w¾ï¥¶‚8 pà,ÀY€³gÎ œ 8p6àìÀÙ³gΜ8pNàœÀ9sçΜ«w¾ïж¦w¾ï‡¶‚¦w¾ï„¶€ÆAœ8 pà¬ÀY³ž:Øõœ>ÿËùÿÿæ³ïüżcùùwÿúÃ#çßJ×ëçóK>¼ÁÀý «ÿü»Ÿý×Ïþ×g·îïçQ×Ïÿî3[þVÞýË4ÿãß>ºþÓ.]ÿ·Ÿ}ñùÿœ·ûÿ°¶Ô endstream endobj 169 0 obj <> endobj 170 0 obj <>/ProcSet[/PDF/Text]>> endobj 171 0 obj [172 0 R 173 0 R] endobj 172 0 obj <>stream xÚ+ä2P0PÈå2µ4Ñ372s`LsK# ÇJgp…+äqÕ- , endstream endobj 173 0 obj <>stream xÚ3P)ç2PIî@œÎåÂ¥ïf¨`©’Æe¨`„† ¦& Fz–Ʀ !¹\1†qš!Y\®!\\…\ 5¹@ÒÜÒH!‡ËÔÒDÏÜ•cdf@Õ! ¡(…éÏà WÈš S ¬ endstream endobj 174 0 obj <> endobj 175 0 obj <>/Border[0 0 0]>> endobj 176 0 obj <>/ProcSet[/PDF/Text]>> endobj 177 0 obj [178 0 R 179 0 R] endobj 178 0 obj <>stream xÚ+ä2P0PÈå2µ4Ñ372s`LsK# ÇJgp…+äqÕ- , endstream endobj 179 0 obj <>stream xÚµ\I\·¾÷¯˜C$€Cs_®A"A€@²û`ÀpØN ÅYþ­Y¤5 f‘¢?èäRõzæ½®…¯O`èMw»X$‹µ|U$Ÿ=°ðß?¾ZØáÃÓÇ‹J /)USüðåùô%ã—x÷áëÅ—ÐðÙ·øøÓâ—Ï>².<ûrá~îi}5!ƃg/?ûÌZû>žüüÙ_F¢œ‹E~‚߯–hjh‚ð)>ããÓujgqEò}D‰ªÉ.êÿ–Pºl¢•”O ‘O&¸*ˆ†ùÚƒÇðï+r[Sƒ¶êØâ3ëüê¯÷|)f…ÞFüûK|áãøŽG¿ïñq›ñÿæÕ™R$óCxøîºI´›ßõ:睊©.¯§6„§÷’X}šx“¡0蠟ոY C9'­[ý‘¢Öëb2Údr”z³$D.˜ª(×»QŒãb“†1›\dÃI–ïy±Æ+Køf$KÈk4%vþ†P¶dZ–”§Br 9x9„kºúd ¬4Û¬ãjd˜[¢Æ†0jÇ5ˆ›ñ·ÛQmnƯW÷½¸ï‰ù˜ï ì×½½—m9²:¢ækÒ•\l5ñŒNáTørR§r>~z5y¿KŽÎš˜u†£ o;”¬IÙÏ ~);,Þx/5íJqkî„[A“½¾ÛMý+&L¸l+p´‰Œ[Ç,Aþ€!‹ñÞ/b1&“bŽ.Fk–LxeQðšTðˆR¶Mþ]¢ãà¨\ˆœú¥4ŒB*—#ÛSªXG4„“Á•²Æ\‰H“ê Š]0õ~$:Ûñv“×™âY°Šñ©Ó޲fRs™ él”Ë›ñ·bó& }?¢â|#š%oKU椊ßÝrÿÆÆ¿€6®!¤^·4 6ºi1(ˆÍC<åDS€8§ 5šœ£ d}B(8k+_ÒÅ]s £0–"–;iÑÉn§Ø3™Õ1Éd§à¡\Õ'ªW&·ù5Õƒk *³KRô3vàk‚Ï¢Ídiš ^ $HÆ4ŸõÐJƒŸ3µ}¡& ývSü0þå-HMÚØ’þ‡h€Þø§«/á.D¸r÷7Ó¸éL+IW’sªqW£­.GŸyÌÑ£ E0;ÑAM‚€_¬T—.„˜õj•ß1›?j’lˆ£­-‚¼MC4 ÒrIÿá´5Sªd¾9žŽ: þËŠ`²ˆ(Ó ù’úõ9ß}'zî"ègK‚Ý®zîø¢ær½& %2Ê 6zêwÇ£`m®i2{¥k­ÏÁ”,[káJ±¼ŸŽR(=H éó:¡p  *—pµVkiˆˆL¡BVf‹.g‰0©õ™¤¶xªs7ÌŽ…"càVS<öó%z’çüî3©¶"óI]›”ø­5œÒ<ûHõ,­“À÷Ô©@AHÀ(ïÁZFLkÔ5A“Ö .4üÆ1ɶ]FKò‚ˆ¨å8¡SŠÊnÄ$=Àá½2¬u§vçqq¢ ~½Éµ£æ—œôA*iq1x)° ó_ÒÌâJ–V!é«NŠò˜"‘S=Õ 9A@ba¸ _“DÔm¾¥®˜¦Hû˜ÖÑhUëÞ‰6S\‹Ý+ÌÕ3¾äWY°Ö÷¿fR›X 8¿Ü±Zª<:z.±l²Ü*¿}àªuÀ)\ð&9Ùú†&cÇ"ÃDkµˆ†Þ;cz¬,²õ„)i-ïš®A_P€yç½å[jؿ֪æŠBÃ[9˜ÑÍ[Ì{º–4jÙUvÈÚ)¸Ò%S’ßFÏb1 Cwwb²´š”*êdY×ÉÜËÈdñAk±WÒ’qk¢ÏN )Í…¾›`S=ÔæŠh¿Á½ $Q³8¦YðKšˆPj8k§Ìb^ZÁcå\Jk—@‘Ýœ8‹NÞ ’¥ÙqRäT­“ô~Ç ½H滕³!¯,3«·¡ž­¥Ð†Š\Ô66B`¨´ØÏ†@ꀷzì¤ ùv&äpOZv·“ å¡VÏYlÐcÅŸ:XÌþÌoï›­rq¯è£ºÄ™ iÈX ÖÖuUžÛoã,ˆBócLg÷¾Ê8e–ËQà“¶¾“ «m¥®ÊnZ4 ¢“:´ Šd¯&¹|S:I÷Î<¬vñ‚üBÙeÃ*cÑgz.r\4:È®ml4Ûçn†ø!@Pæ ×`$+QÔLFSc­¥ã„ ›R;”·“:ÏtæƒXž‹¾ô¾™ÔäÌzΗǴ´¶3ÎYfÖ®‚¹äÒñ„f¥Å†@ƒ)N.ÿ’úŽ7´~³±ðñXT”‹6%¤tçË'ãL0òŽD,«Ä¢«Ä¹¬ªARVrØB×bÁ-Ú ûBÏ9ц›‹›ìà†šß¡ŽgÐar6Íí—á‘+{…_Mt‰Sï! ¢â.7 Æ$_ò-1f32Ö|—ø¨8BâÌ8(„Õšjõ®–,˦xô Ç•¬s6³»Ú@kS×}nW;”`jÈ; GF5˜' 6PŽ•¸(t*è[Z c~C9U‚N:ï$º |æ¶¥% mAÆnÓæNBɘ™0zÅQEÑcÎ}µ˜/)ä€ëqãÚ'˜ïxL%6Ó²œÑ~çT IpV ò–†lYäxjNN¥{,+›Õõ}€ÝbpðÑ˱l½[,Â{LtÕÑv¢{,€ «ãž  W/XÑ ÞdÉô#ž{SÖcš´c®åÖûÒœ|Ó¾´¤À}iÎ|G¯Ts\6»!XeŒ¬a¯Ø ùˆ& v’O-c*Û@©BÕûVR:È;ËÜË­àê†S>¼Í%Ýç¾Uv`• !˜«*Z°ª‰06[%»#:Ž%…}i•y³6»ÌÝtž¡¥MaËBˆj‹ý !ÙxŸºìd!´Çkä[BòJñYû !–0s*éÌ:ÑdZžZÄVöep¥È^û`X[™ß…jŠD6—­sƒ|äÙm4ôpXÖ[çóÍŸÿó›/þ¶jÀ¯¯¡«ÂMbÞq/Sõtv›EðÅÊ]Ñ#SÇô7VÅ9âw,j–C•'¨bÅÓ[ë8‚Žª(åT~ÇC+^¸âä‰'p'úˆ‹94Ùñ¸ÿÁÌqv¸“¢OÅA\¶C@ç”äèpO®}t³Xw0JóÛ|oÊ–"ZÌíQ#®²ñyözµ[.ÛE||=$g»¤¯¸•·ß$åízç1Rª½RF»¼±ÏT(c}È`ñ-e1/æxËêtP-iÞ>w (-m’ä‡S¹=„è éî{Ñ’ÓÄ÷ã/ÖÐcŠ?rÑŠ Œ—þ/‹‹7‹jÒúð…½„Ÿ³m0'ÙÌM'ëØ¹%é!ÍTˆ”Œ CÞ oöà]M#£fÚðNÞµÂb‚‚ü„Þ g'èzÛ»œ˜s‚Ù;~v»U9ÀãQ®å­$÷Ÿ»ði\ý›oÑÝRò„ÔuÍq¨z‘ÚoÆÇåÀù~Ëxµoünz`—¿~¶ø;tò›d‘1|»¸b>›^,\ Ô4þò|ññâ ¾Îj:wO@â¾Gs9~¥Ç-V£Ñ^A#†ÄGñbá!š„äû㚨€hÚ´ÃËž'¸VGÃû†ÑdÜÒäRºœÃË¿`µˆ«8£x€#¤™ ˜WÊ5°ÃM.¼ fPæîó»Ù<æcaÜöÝÖóEjqx…Ùú;¼ÄlE·ö!½oÿõⓃ¿ßÿóÕJ endstream endobj 180 0 obj <> endobj 181 0 obj <>/Border[0 0 0]>> endobj 182 0 obj <>/Border[0 0 0]>> endobj 183 0 obj <>/ProcSet[/PDF/Text]>> endobj 184 0 obj [185 0 R 186 0 R] endobj 185 0 obj <>stream xÚ+ä2P0PÈå2µ4Ñ372s`LsK# ÇJgp…+äqÕ- , endstream endobj 186 0 obj <>stream xÚ­­æš’üêݧ+?y`ŒÉ?½ûoÝïƒmbŒæÁTçÌoñs?Ÿãç«!FNM,Y ürSB³NõWøùbloBñü²¡ ±   ‹EÝ!@Þ5FºMjcdÌ¿ äœ>%@Ñ5!äÃÅÚä Yp_2+ûÓ‚æÐ(Âq?÷Ь~ÿÿd ;”©bV³Kñ¥—ãþù ?‡ø9ç»—œ£íáç?»øyŸcüìãç?”±IQÒiÏ;D:v®M²Ià\tóÝ'à57Éy~ÐMõ¨û´?¾í–ÜÎ÷å˜ ¹ñVú~Î:2/ñ3ÃÏv÷‹ž›»CªÞÔ&(+Ú툵3yCp@ ³‘Ë0º¬',µÿ‰t~~Ë)R`JSMl‰ýËæÓ§7Ïa¹Ä¸ä˜/ÌÛø:ã ·²oJÍ®_×q÷Ùîæ¸G–éb‘ãŒÄI‡s,v܃PÙN;âŒ@&0„ABþµ“ÁíN6;¡9ìø¼G-/Ø?ï>dµôt]è…§¨N;&ö3UPÓì®öóÙw/Ö¶¾üîÅÔž"J5‰²§À²Ìåp-?~ îJlŠ|¯·+ݺµ½£"`›42 •ŸÀV¹#IF j\äˆ ¢ ¢g;{ÖIÍE7Á•°vUйÚÀ l`.Mp— ùbkýÆŸ'÷n=¥î/Ýt —\ E€÷v¹×“ÞììR¹ìx~ÉæÅsDå Ù¿× „×ìc´:×Î+‚ãJc’8Û’›‚ijŠKïTȰ¾Ä½ÃéUc·üBw…Uì'ÖËñ¶Ôȹ¨¤Ø˜Ü»wBÇ]@­¨¿¦êÆ ÈcêÄɼEŽIœWÔ!3Õ3ñ'ÇÙ£^û„jmRç6¦ä¾¦ 93¢Á„&+«èØN‡xDí•&D°'Öb(D#"”P•ÄÈoi„q$UôÙ87½÷¡Ö¦¢Þ,ÜûÖÌ¢5cgŸÚïà\‘@‘M®TÉNº¡»$Ý6èvœ“Ù*ï|c° €ÿ°’ê5ë$¢šr¾@®†¹•¿ùë{ŸÝùò×÷>¾3i¿"ßçz¢Ä˜ ‹,XÄâN»–Ê0È!ªÛRÇ crè"do™ßt9£¡èTZ€Ê²$û†zSÓx´ Ú,gݰ½.vjhÿ‹Ðl8•*èèR@Ü!Ô—üåÿ™2¬”•h!gÏt3óñÝOuQ‰>75‹­§ÞÅ|C…ôê÷ÿ{émó¥dö§e?›+ï<ÿÓæ¾ý?EŸa¼bý’›£ÓÂëŸå(šðFó á×¼¤¹ß Ðl,m€TÛD*V4 4ðŠ,Á8R| ¸õ*Õ׋ŽÎ¬ã ’™DˆûŒtKÚ$FÉ|¦”áÞÓ&:ÄÚÖÖÆæ¤½ƒõ,oiêÝ!¦  %Ô{<žŽy‡4WŠ_…É+dòûµáï1‘r…üþ?¦–6\¬ 18±È”WHÂ8Ž® Ü9‡Ü¦VÜ£ãã0wÚ1ù”n ÒŠmKOtx-05Áª±Ý X0»;¿³öâ»­‘()Xˆ‰åN°Ô[602Y¸¹™óÈ8æ¼Ü¿ÊÐÐ)CVœN¯Øzäs)\ Wbí)ÍôBS½Õ!¬ O¾ðó)tôÒ œ±Ý·eMäàW»]GR­DÈö! æ`½õ>žTP…ú´»â{t³' 0F ÙɹÊœÔ1ùÆ H1pE½1[PñuÙ4¦J’‡4V9í˜wAu…†g`ä³\Í[ãM“CÒ×0S\”+8N]”‡œWB.U#KŠ˜ÁÈù·t¾z¾¶õÙÆ³é "„¡e7qºÂ' ¬h¡?f”ÆJ  6½8KÊVÂÞÅDµÎƒðwk(#å¬z:¹Ç€©°Þª+xM…&¶>_¿/¯74+ Dœ™‡ p}öñ/¾¸9¹ŸÖé:–€a,¸rœñÀ•C2W 9¼—@¬€ÚáDUeDV°Ô''©ˆ&PùéI¢L`m„í.Ô–™AmA8ƒÎvöÅ?å´ƒÃrE@AÕ6Bs²tÁ—åõÍU0$F1ÄóNzO¨aýçÜ>}B9Ì;”"HL©¯‘NEK G}ˆ#R¼ž²b&ƒ»,é>`©ˆ£¿þÉ£ÍO6¾{øâÉæ9û,%yûèÛ‡[A0ûà§“6Pü'{n‡òò/ÜQŸüŠGG “+JÌþ7|Ü?àßþ‡§í>V1¶"ÜѵJ9V†©ue |Ä/W `^€KËŽ©KVΘMÛÔ*ŽXpIý¥ksã%¦€] N®­7É{’zÆ¿ªû2}ŽRk“«×wˆ`@"›jšæÌ\$±zíÃu| •L¹@b™÷:vÁú”Ñš¶³rã4޲Ϧdϡ߫e‹?Q <)UØIRÄèŠPA –«ß)S¸á|”¶ Ê!A( c 9#½ÓÙ‰ã)I¬XML²-Yˆ¼c¨œ:ÇPÛZ5’ÎŦD¹¨ÉòŠ3(ƒs^¯à¨9ø!i¤ÈÜóZ+—KÍ,Ù9д@AüÉ'ÇÙ¡¡Áö•Ë µìÊ9–À^Тt)@©’[ª¥¦íU@é`8ã-5ÔÀ€¸*°¨K<¤ÌºXlkœ$;zŠ™¦W§)Ô@.èâ#|Óp²ŠMˆÅ8xDùþ’ÇdÖY‡•U¨÷0Ø–˜U[pËuB¤©º XØkó°ý·î¼tr©M¾9¤Èÿ0Vâ@g´*~B%ŠZ5ˆÝ"„9*‰íΘÊl©UŽýÀX/å=»É˜l L:sXeÀƒe ²o3¤¦,ZÈÔ%á±¾+`‰µe‚%ç=C©BBPä*ÏGD‘°.1,ç>])`I³À9 §UÇTAd¢8Æû-°1Žãô-N;TCYÌ4•ˆûŠ‹‚ô>õQý¡‹xÁ D;±¥DEãÅp¨(Fìý•+VD£P$?{GvÜ!¾áæªÈ©k"áÀɆøi†Zhy±]ʪ™’þö‚ˆ{¤Ùœ¢îfpCÉ È©(Á×ܘ"¿¯„è'™:×ξ±å‡gãý!o€¿‰›îÛ)Úd%Ð µƒõ¾ôe¸½ ç ›Ô”1Ö;4Õ0µ^H ‰Ý‘Ó,è” ÀwÔ6º„¡ƒd}%ŒÙãùg…¤ÓQ*4 ˆà®uÈY7Ë>zšÑß¾±#¦ŒØ íNß¡=£ˆ†Áàsª|ër„0µÈ z̲?*´ºùÐՋܼBC§Á`PB#Ý ¦ÓãQ ЧwHqŽ%"ä¸J‘ÊX]Ÿ¬€¤áL²M²èˆV=™¬W˜‚8JE½¢VÀ]Z?¤šÚ1£^Çñ ÌIîíù?â‡TËbn ó€ú ·Äu˜s åkq1ÑM€¿ì®ñÐ{) ˜’î=z ƶüâ@ÿDJA™¢wR¸H.Ã&¬ ÈuЛ>“á²`Lªý¦ûŽ8SÀÀ hrQÇY0^EîôýåîÖ Î` 7ˆ—Ý¥ò:¶•xÊÁY—ó)ŽhÀÎnÊÄÔKœâ;ÎyH(8Ì`ZQv |^€kå8–7ÓìÜcƒBœ C›ÉýMcWs@Ùc’3› s!DÂv'޳Ì5&ÙážRS\T¶Û[j¿r#÷dŸW ±öG‚bpÒµ,·)‡4ßךŠEŽYçã)/ë¤"EçŒ&#}èT„zâpäën‚žup5€é1òSƒÍ¥q¡{D¦ ®6r¼wÜ”`bÅ`F´ µ¤DÏ¡OèLöô¢m  b$d©°«É:1dŸ8Óâ'ZÆœ9´ÚA©Ä4Vðë€2däl؃!òQ0²Ï_2Ã8z%ކ©` SŸÒŒ« ÞãaЬ§f¦gƒXÏ#¬Ól =Ìö¦èF£W+Ø#ôS·–Ž” uÄrãý× é'ÛõÅÛ¿OJ÷§çì<6{¼ùèùï×ÖóðÑ¿ÿó·ÏšG›O‘ÒÍ»+*Ÿ¯˜Lõ÷+-Vnë5OWäÔ¡ûy}å·+·;gÜÞŸVü±+Ƭ¢~Õ{œþ”V–`,Öy³TÆ®Ÿú 1hà×¾) )¤ú°½QéqwÖó’À©‡ÍíÎ85j1‚"K–, ˜Ncs‰«‚Îâ†l˳r¾Kš’4÷x[ ŠÜ„ëYZÏ‚8¿æ‰™Ïx) Ï8ø’&e(ŽðwJø°•Á*ÂGsmWÚ šÊÆ×Ì(¡srŽÞýÚµ®@‰Sý€­« æýãHŒ‡cJœàTi‹o J åZQäH²™X²éXA×WÚDâf›Œ g”ðòcÐmVøE—uöûœZ8HƒØ÷»—hNÙ^DÉrj4ÃþÓ"€~ÄŸ9pVÀ$þÌ^yœ Ûù%ÌDfî°éÂÉ€ÀâG9¯/»Töóá™/ºüq2+tŠÃÿK­± ^^ðZs&ù¦& >r<-…±ÚÇ+8þuhåÜÏôâ­&º H(Ç´X`„üS…÷ÈÒe0â9Сq±iò87Ϩ†“õ«`¿ÝP±7"H¶rjƒ*ûÔ¹r(í³ Û~ÝÕ´ïwŸù4Ù,í¥?>öØA˜1 rߎ”‚⌷„cÅ,é¢K!&Dïæ™þ^›À¡8E,ϕŠìLD¥5¥m£ZP_¯ EÐ;J0‰­oY@ò{Íô}{B0uÅ»œâÔ ¡Ãë–EÎb춈sívþž›â²mR’äÞÒÓ(0û[ÏYùšW»[ਃž:¿À.ïå–v8]ÖÓ@ÄïáWƒ½ôçäŸÀ³ÊV”DO¡¾uHöâüíº˜ñ‡³xðd¤ =¯L-MS!d` _w½uöŸLDMxz±˜É¹¶XÉ ]÷`Ö§Ü!gHômý´Á–y9ŽAÿŒúgÇ ‘a04Ò‚Ô\‚Ü¡†â,PKk_Q“ašb ¼Õ-u2TÔšíåC%ŽÑ œ»ºÉ|NåðŒ–8À*CBÈ©\'*®,ZK¸ ðB6>jÁd¹ÌC¢amˆÐ-¸oÚé£*a˜ë?dÕÞ óÑ=SnƦTÉ£þÁ…~=âùžPtÄw¼&ïªÜIvwo»ñHy‹„ÁTÄk¥íŠö¶ù ²ôƆ˜Û7K‰× ¦f~)ï±POÝàMVXØe|ˆ`³R« Ã¯qZ—Û7‡;å9f„ô‘±Û1ü28 Œ|ûP'1úld†Ù ð…¬CSå0#çs㟚•~GÔ¥Ø^;V·i\[Gú¢±IÑJb½‹ÞãoÏ•â–e¥‡Ü¿”ªS?SdëL¹â/£ºÐNZ²Ž•~”qå-áµd}×ú䇵­Z<9VEr¡]hR!Ç^’…¨#Ïtíe.>Ã÷O’,¡ðãs4¸r76]CCmÅKˆœÈDaݦ,À¯éêñ1Él•k8=‡|CoÄH¨–¢ãš|BcÞáƒTL‡H7n<~òüá7ëk76þîùæÃgú•-`|I€>€ïÀ*Nd”ï ´Ùrè =,>[ §yMp¾}ÛŠQx¿=(<Û'ë›îw[O¾y´~ÙAh°Eñ‘¾ "gªaâ5kðá\Ë±Æø—þ0þ1|g—Ñ Vm)MÅ'ì(ôõÏy0¸U,c÷E‹°aIÌ|¦¼x8…°>Œs_én…¹Ç’lØ Ld3¾ï,å ¾1,PØ|¶¶ñüùúÇkZ[¿ìBü^{oÄÇömÐ齚›Õc&+^òÍŸŸ®;6¸p P\QúäûþäÉÆ$ˆùð‹‘ÉÚ—£ãÐìRÓ…òš’R+ƒ¿Uiñº´ÉbŠƒç+FnƒCULVy¢’Ìâ<\_‚Äc¥•á±û˜Š·\›yoÊ;¼çiÖåä±5‰Ãt„ŽôlâÕôêU®h¥J“tÅJpâ^é÷JÞÁNVenß8s¯8YTÑî+õTŽGz¨jž_€¥´´+ì¨^•ò™¶7îŠÿmiÿÞeìv[%3«Oá›AÎÖW"6’8úƒ¿~{ 7ø'z…ÿíÊýÕ  ûÿ‚l(Q endstream endobj 187 0 obj 1207 endobj 188 0 obj 12222 endobj 189 0 obj 531 endobj 190 0 obj <>stream xÚí{ePd[³%îîNa 4îîîîîî^¸»»»;»;4îиK7Þèô½ßÓo^L¼ˆy¿&¦*"£vfîµs­³Î©úS$Š*tB¦Æfâö®tLôŒÜ!g+#[:a[S9U#ãŸ#"…ˆ³™‘«•ƒ½¨‘«7@ÃÌ md`æ01s³qr3³˜¸¸¸þ4ªË¹¹Yüéaæbbâ°°3²±þI¨D¨"Ž^ÎV–®53ÑþYþŽìGŽ¿#çß‘  jis°wpõr4û³ÓÙÑÁùï èÁ ÙÚ”ÿ‚r(›¹˜9»›™þKá¯ùV.#€«³‘©™‘³ ÀÁüÿçlfaåâjæü‡“•=ÀõOŸš @ñO{׿ìMªÿ¥`nneböwÒÌÖÅÌÃòÏFzD&&€©•‰+Àø–="Ã_rJÙ›;˜ÿ‘7usüך»™³ËŸsTÿ".õŸŒLìm½¦fæˆ ò®@õïbQ™PÿwûûBT¼þp±sHÙ›ü É¿”ù/õúŸ•ê¿!Ó?Sýÿíñ_ZãŸw³µ•7²û£ó?Tøcö¿<ÿ¿µÙYÙzýçÆîÑ0û…ÿj¿•‹¸•§™©¢•«‰%ÀÜèÿÈK¹ÙZ™Ù[Øšÿ‘R³75s¶µ²7Stp±ú‹ €Ž‰ñŸkª–V&6öf..¶”ÌþüO#ÿñÞß3ü§[ùïšØS˜ZÙ[T\ÿ\#gÓKü]V4²²wUýKPÆÇú{Íôïk9#Wg+O€ã_æýÓøçý¯Ÿôÿ:®•“›™”(€••…õ?lvðô¦cbçÐ1ÿ™ÿ=v —ï"`âæìüÇOß6ØýëÚÜêTffžf&p ²ú…"º™¦3 ¡b^V7?’dh¯Z_Õ»Ö,>YžQ²ÅöˆÆ‡.ƒ (\Ðó]°¿ñ­Ãƒ¥ëÉ`·—[´#×1«:÷/WŒäƈ”¢á¸…¦ÓçîÆž…–§qt„­/¸‹m¿¥·„|*GÊõn×Qµư&\”[£y½Óßþ@Ú"YøVÙÜ /Õ‡²S·õ]d7m±–òØfMš.| I®WüÑê0ŒØ3¯ë†l eÓ¹ÐópX´`Ò¬òèø¬ˆe霰´HE'Dxì¶w`#E:-v, ƒÇ²+-F)o0ó¿µ™…R¦ÃCWˆ‰Ÿ6)q‡ØÄÙ À€Í TìÐ.ŸIO»`{ì có¿‡`)öô6€_z;'ƒOMF—€Ñ–;'Å” -|{H¬†œZÜRˆ Íjåä2æŒô‘p@œ°iÉÙ™8êzÌù’Ê¡õn e=HNr*{†hè¼®ª ã§ÅqbíSV‚ Üõ}lA*vd®rh½'}Ë pÁ|¦žWyÐa<^{¢¸í11‡JÙ@ÊšÈ[a«Ÿyý`  Â«hQù™ÞU«°¾íR1àQͲr‡Ó~•Ü‘ð(9Èô¶^CÍ.a­¢UéfJÉK+úA>/P£ ¢ð–k¾JüëbP½£PŸÞšº °Ð¶î)Eû¸Þ €ÍÇSeòá‘¢‹:Œg¥n»$Š© õ½é;½^&í^ 2'‘{ ·äJ„‚“Ô´ºs›KÐÏxI¬$Ó­wrf©¨ªŸ’MrÊPI­æå=1âÖ)çïÉÂVÖ1$¨/=:ë<ͧö…ƒÇ¡KïÒœé¼Y„wá«õ&-„J8g^b»:XìK1Å|¦H;Ê‹^Ñp†˜Õž)–ì[^¼_.e—ßtÄÂ#þdgvz…1ß„´hëâ 6ðj ¥—©Œàûv´Ç丿¡zí Í ôKÖ"²Y¨æ®ØñÀÿÔvu]†c".¦nͰoh)x+‹vŽfqCûjç)<8rÍ È:«ŒSêŽ)L½ŒŒÞ j=ÁìJ¨6ÂMô£´ú+’“Åq²'¡ã xžú{ôF(ýJ(’¾f9‡»šsñ=;a߈† ]²£lö2M,„Ø¢Å&Qc ìÃ懧Nÿ2%ƒà­±Hçáä{boZ ‰T6)“űa˜:eÉÇH´‹Ý€T=âÏÑZ¦¸¸ÆµÛ(%™¹“ö„Á—Ó^è½ãÀQ²!ξ‘ÉÂá@{®öªæY±ËßÿeçLå#ö¶xV…²Î hœØKB¤™ÂWnʬeñÜÛ˜›¥Øs.¦å®äDñü=smS"ÞÕ3uÂ`ÀýÃNد£)@0“ý}¬™eՃǔ]7häìu]¹¹?ÔF°?ÇeÃ|™:‘Ü® ´D"m¡A6ÉÍ?9÷žKjF!í ï§í«Îjº6'tÙjƒJj!.k¤ÜÏþ³Álº,ÌsÄ ¯È\‚6•³ Ÿ¹oAMáæK¨ký@­ÄÙÛ¸ÖíÛAÒiOG½}^@2_Ÿ7DÔ‚R™ÓÛ1pY¢ë“§!Å’/NÜÑËÖÞIÐÅãÑЊ×»´†¾€æý°ÚAϰƒU7dhŸ•`¹¼xpH[,ð ^::¾¿¯{Ä·ª]^×9Ä y}þóÆ"m"àÅšAquƒ¯žmÝ|ÿõ§ºG‚m>DA)n/XQù@Ííir,1÷œˆ‘D‘Œ/ýWú¬OF·ŠéAt“cñ%ÕúŸd4íyLß¼ãÏŠ ß àcK”Ç'ŠóÜcK‘ãkʹ ¸ðØÇ´r d ƒ—O{æE*Žóé d~©ÛU`]ócÅdK¿½4nm¯Ü—|•LO­hâó N>‰Š¿Pèzŵç”vlŽ“S߬ð˜Ì½X:,‹Í—HqXäýñy=O…ÿuÇÉëzE&5€ÚÒŠìM²¯“,¬4EüGß&FJ~›æÁ*Ÿ pÉe‰¸Ãè÷š¿Ô ‚(Ž‚°Ê‰cì'ÓÒ:ÏWI²¨1M^÷1»Nñ§étË'ŠÄª³çŒþ±l+Sw9jyÙèF¤™ 8Ä ¾„"°2½­’¾¬ §gliƒ•“ð«3N9}^Í~—BÊÐr¿þÊÁ‡*àñŠoûàbßSçåzÁ‚ŒCÊù¬ m ¡´IVñDÒ`®p%»fÅÍ +üº³å¼P§·Õv.DpÒWôé¶cxá=‚F?,±öš°ó¾ W·ûª˜ÏÚ×–9ñƒråíÖií}7è)7þF+±A¹:A;Ûm°måE9 É´µ‰=’î[slh}ø;䕿‡Ù°“ÚÕë¦etÔe{×ôö¨ˆsÐb™|-½±¯ð)‚í'äóØ¢öHÚ~¶l¯òX9µÅ^Å«ZÝâõ¸‹fÓ:væ§Ôšgí0-¹Ò­¬‘7rUx¼]Ôùü²¾]㊠͇uti ý¹¢àbî6Šý5ò@ê¹.5¢kÜgTS©šI™×·ÌÏ ˆ¤ÁûC$ıAË}7¤*ÞÙIÚ™O?,Wàhó¡_–ª® óÖà(ïÞO~ŽG’>"ÔÀvŸõì GÊgÍ;ÑNóbsÝ/!—¿Çõv›-Xõð9aÓÂme¥5„¦#á’Òóú‹x!óûÙ aùSŒ?§À®*«yñÓCTñýùD¥±’˜n´V›ÕŠ Eè6àd7K!ñA'€É#|g ȵ5©˜å|øØ³›&p1ü[¬âŽ{æ±b–Û‹BFõ[y UÙ'ý«8³JLŽ ®F¶¡üÃL°·°Ù¢kãQ8²¡©6w šãÕ‘Ûû]=dzÿHœˆÏu@rα`‚Ýΰjí©d6Ù1#Áé,5iAÅŠ!%/QúlZ¤Ç§%eCÒ‡Ní.Ä5ƉNꈔò‘'âõƒgîUެ×$zh1PžN¯ E0(eñ„Ê  ƒ,*|T…:îóBŠÜ”[â×XŠ¿\1*¶¦wÀQWÓé 6™Iîlrð1œÐ01÷€Îk¿Ï‰lxÏšÑÿ ­"MR2Óux‚ôi±áëî4Ò³&ÜNz¦¶;=ŒÂÕ4 Tœ_˜nv7'"ʺз¢ËªÛ £U ?Pâbš$Iâú2ÜT±‹FôòìB1j½ÌЉéžÐ¥#q hÄïïÌÆ²ÓgÔÜzM£b¸{#Ûª¢!SôRRy”t+Qü-Rë¿YÖßì8šù»”å2º®¦ Mµ¿°ºE?a.e[÷«ã‚©=wð´ÒõÐWW ‹ß‰Q%ð„!Q²uŒÃ­Üܤܮåõú~Î` "q Å£p ž—ñÒå)9K§ï_—v‘)@ŠLsGZ.´-èF™s\Nç^›âH‚cóï#¢¿&ÿ&îHmõl7ß¾bø[j²b<àTbS uBU}ß`sa¤ ƒO¬7x˜ÅoW2f®¬¼i’ªP %ræ Û#Èè|}hÂv–—ôq¤=$¼…-ÌŒ_æ-ãªÖô7#{çh)nÑÞÀt(Må1åN¡½Çk¼£ÄW–'*m.Å&’3(ìÏëÛ?œŸÁ®WZPL%/çŸó÷‡÷ÂD’«Å»Ib‡æœ¬sëü%©8™‘±n³,Rî Þ•••i…A£.Ú±QôQkw~÷¥#ѵP›c ýå¢ç*,Gqò{IvÂRÆ"Nf_®Ÿ¼ú‘AÉùHvb…|ޏÍùã¹æFBŽZÈ HVNÂd,޾dáÖS†£CÀ^AyáÞ(;jÕ¸ÆõtÆ–ÇÝèØá\1›8OÛâÆð [õËït!™ùÉÚnü,\¢⯟€^YO‰›yÑ¿ ÎdÖ…Eø¬ÌJc^CCJ®° ¶¸€ê<ÉŽ‘JÂ(rØÔ{ïÉø² ZemFetÇ ]üðè*«PÛqr“¨¢-@®õËkCIx˜¾I';| µû~¡ÜÅËDÄ\SG%Ýß½ˆk nñü’éô2wP,™dTêd°2 9M~‰SlŽ }Ÿú´¦Ý¥Z÷à¥[áºýë炸¬Hð³:‚¯ì¬.¼zd ›†iFge|È•ßð¡.ä >õWoÚUÃCñЉ |KD¹?áÑ ÝŸãWìÙª±¿Æ[5fÚÁúº~Í®` Ö9F†&ºÀ´|‹èäxž{jI˱‘)¨é4ð~ÇÂâ¥giIT˜Y¦CeãšïSR£å.ލˆ*¸^øº„Ï ¸ÀŸJ'ff˜ðÈ uO4¨ä9¤¾Ñ6ö¦,˜ÿÆ—Ÿ¹L‚þðK3,ÓЋ·§Š äë—.Ÿ,‡‚\Ób„i¹N2}Fns¬Æ—@*séxŒ‹gÉ›=ÝÉxq%ù‹¤u(þvÕ:áÒá°B‘ qGñk~çN¸-+èÃftcë_•—0ô k!Ç~¼¯ÖÞ¼Ž¾¯Õ—¿Í ”™Ç¡…OâáIî‰pTNðr>xçÐxÐ Í·‰Ñz¤¡mDh†·Ø ™tB 0Î@ IQ¹ª»^Ÿ@:‘Ì{ß…R)ÑšÔ‚†1wCV:|_’[ðã-ÍP¨»mY_†¡½Ô£”Õ¦¿Ê¦í q³óaµLl AutHOs>;µ8©Â¶Ø¹E®5]e“ˆ Ÿ'H ( ¤(h° CÉE› ÓËò¤]ÎŒó&t±~3á_àçÞ²/<ޮċãí{Û|ñÕ<øtOï…óÆJvëÓ­\‚çW{¾“+¾üµõ¹ñÊÜSíÁï#2¨¥?žœÁd³Eiö¿·2žQB³.yäUüÎÇwæjà£ÃÚõ>?ö8æºÀq§(È㇚‘p±Ìå™#¹÷Hyj ÷½¨³ QN(ÆßVïcÐaz^ìØ  CÕ =hÉ Ùóp$_6Äx)dèôÅÓðVY#Y–•þÎFÛŒÊNÌàœ„%Õ4=¹®-äìü°Ãâ —ÄŽ¸yã㪇“fRV’&¸=0zˆsy' l£êÔd‡l®p¢râ8ñ=C_ÑêGRêÊwÂPÐ aùÏEúsžëÍ3eFV ­¼F2§±…HeW¡Ì@Ô’‘ñZ=åxíÈeæ €Cqj8²ëUf­8.oý¾Ú¿cäq¶+!áˆõÎ}ß¿†OIÊL1)f%«) E—õŒ±¿t6"éb˜DÃg­²³q{)‡ ×%u [Kv÷”ý>«‚M0[üÒ»ž~@Wˆ‚››4‹¿èI,`t²´®HNv†·ÈѸë@Ð2õCBitHgùYîíXC1;Wå¢ÜOê’˜=65“Ÿ%#ÌÀÏ-¶ñD®3ÒvØ…M¤G´ÄJ¨þÑdM‚ž*mÙoS¹}¡RŒ8Ü],A–ôÛM½…Oˆ¯9,Å‹ùNù• ³:üô¸X†ñÂ*a,ÊÿJ2¦— ‘úMÕðex’ªÍ:oÁG3j^{C_¥ÆÊ¾úhb?æã¥ŒäAù|: GæéIPZ†Î †ºãbZ,w…•úhC"ºŸRªŠ0R-fÂ…j€'— ÊUšjt6)Èè-c@ðÞ/æEø7|ofÇom™³N€ËÍ5qR_,ÞóG)ÚЃBÀõ¡œÈ~&<·ð`:ýFXB«Òs3ÆV›nÿ:–L™•M í> ŠLõH]Ì×+.ݽ} fgüÒÄÞãWXÕÐüÐDîAJzà´&mBÐöE™n~´ø÷øSJ0ÍqñCàìÎE
  • ŒÑÒ-ö6R{C’Ž=zß9¸þ2 Tâˆ;›µúôw&Ž–,Öõ·%Ÿ =ÛÒ˨wù°ŒÚZlh÷å*²•g߈1µT\XHß¾›Û”I‚»¢IƒüUÇZ·½ìBäÄSΖ« "®×¸æ²@å·Ô¼ÀQé¾'‡ (z=û:bÏ—Ÿ¢']-ƒ€9u^LV˜R›3ô¯ñb Ænr©##WâýñœÅh`›Î:=o½ŸS¢aóËTÃí„ ÍŒêK»+tt‰Ap„hi²ð×ÓÝÇs|½#LQ¾^Ë’Þ±œ°­ìÌ2°‰ç5æ)lq#óÑB0˜zë)ŠYáŸ2–ô~C.Òu˜;×ç,!ï]8äåp¢“òN_†¹âB«SMê¿‹yøòíÌ%š‹†|LÔfè*Ži&Nˆ‡SÆq9ßéRu½L¹Á÷ulkm«Ü4wŒwÜ–‰Ýz$ѾË>OkÄø}pÂ@€ø9÷éb ›ýãÎ ²Y|yôŸùPÛûNíœÙw­vrk)ñ@û;Ó”ì£Ô¢¼§c9. o¬•ó“øx*Á Î^ýÕ<·^ ¤¤¯xV  wUý$¤@HéÒ¹™FþaU?Ü»IÔ3"<%ÿK ¾¨ž¨ö¡¶ãÒÍýýf£þ·ïøb¯DtྑÌèÞg¶jûvdóù41 ã70Qf¿ß«Š ÆÖÒçëo²U⨅ž¹›’,Ð…æ„ãe:9þÚ\/‚ß*¸Ù7Û>È­âÈ“Aº¹âû'h¬sœý!h›wÎy¼æ H¶§@;:Qdº%u·9OÖ€0dR ÷ªœ›inÙ{5ö&ÓÈÅí$Æ“šÀeÛŽ„¹:5crá×¢] ˆ ]Q¼°™¥*¶T˜có´–õ­/-( ³®@GŽÛ ÕÛ†±GÖ4ƒù"õÇø>WoÞJTD4iXÏ-®jŸz›ÌÙý¤ÐrØÓ:îúýá~ºýd¨sRɈNêÒJjø“-YÃZÚ.,‰$À–N'#ȯT;£6¡’Õî\¾.M¨3iŽT¸%öqö‚ØßþºÛFô]nðÛ^ÍèÛTšd RоëvçžËê­þ~øG_Küµä䏸CA@N5ùJOæ>›L~š_jÂ>@Þ¢OL':;à9"È*]ÓÖaxLÞxB2¬þ|£É_1ÎÉÄŸ¯É Cvm°w~Mõ½ðS¸Õ¥7‡pŽœÐnµ Yæè1+¸]Í$ñ2cLDE" ÙÔ9À²ÌòÐF=$_¹ëû—Ñã¼ ke£HS·qœ|Mš½0ú™m~w><_Óxoñy1{gBLÅbô%}Ú§/luh ˬþÙ §~Pu”æåÒ.›ºDA#¼?òÈŒaH;gEQFæ…f$oKùç¨spóÜß5è±)í—­½…½Ý ßèà'õ ÉžŸì$Ú¡SO7O˦©!ñ%È'8³ ß ïžý+¿wôà  à{ÝèÆ•^<ÎÏa;' Ïãp)"`wxLSóÏSr¯Žñä+\¼s‚C-/Ó&©"šrÓT\~TB7úBXdñêÚ4l))nœÒeb6 YãÁ½¬¶ù`ævh¹ÔO#D¶f”j5nd^²¦‚,²K‰˜®ªÀ†ÎKÅò-õ‘Äskõvü‚^~§)~|î áLÖL³ß¸§ÇYˆ§4±a0[0ß´uDø}Œ‰pO9ƒ.ï´*ð…ÕRÙéq8¨/è{á­˜ÝÓ¤¬ù^,!5ë{1ȱCç¡™9íÐQÎðc€»Û“R2æ—Í—ÈGQ]q u±9¹Ç­¼óLòmMÅ-÷”‰ÜtŽ2wv éØ ’DtråãF– ?`­WñK‚EoZÔu;D›Í,ÕiqÄ¥îÉÀ©¨k^œ÷afÅ „²¸Dêþ3ÔÔô›ÈH—¶VÔ}‡¼SC²"KÙ×o7Ýky(6§|êþÇ“®¨²,Þµè9í.È ’£U_ˆ°Þª¥¤Q-çHdmcA+ñ­9‰¾4mLe–J«ÍEµÅÓs%\„XÅ - ~c|=d{÷¸&”Š!ñVPÊ·¤.|óÉ¢dSÂ]ìýñÑÙæÖɽL4}ªlψ}Þ`³÷‘‹³Ú} 1T+z©J½W­˜$éÿ²Òï稸‚!…Þ=(|¹ÌcîmÇß#â ,©aÃ줆E•BTX•úɯӜæébë=‚À‚Ù0ú±Í€È8ò‚Æù1\´»Uo†¢rl[6 9”™” I—¾ØqHœü|'V刼߉ÓsCžaIà= 袗߿UýqÅ}Ô†|ï G²œ˜¥÷EZŸ_‚‚Ée<+;÷a꣉-”àTó2¤¡:s‘ãÚ†×÷pF@^`´Ëˆcw¢*õ ç—WzQ(!Ž ãÃ÷6iKˆÝ¸¯GÑõ #•bç–>vë AqÖ¤œÑ5´,RÛh±ó^ Ô b ¬!âeSÛbAD¨Öå^㣡XûÉži?ꜻ±íh厯×~£‡rU‰KmxW•éÚ>”üÄï&VðE>.uÆø_¨©¾‹¡ºoj?FÏqÔ&7Ðÿf¨¼`Kgˆð“ÙÏÔ?UJS4«¿¶5#…Ü×n¿ABÚ¾R zóE ágΧ¡]Ç,yUc-¦MÃ}*+¢âr[㻋Ð1;:®Orlë‚ Gàzv8»M=Ò²P²¿^hqÒ7"?ºÌzzgt o(¬ HG²ø ì&=»ÖÜÇ0 1<‚Σ*Ž“†& ] f;ÙÉ•qÕié+ÿó5€[Ö& ßC‰© 7?;ÏF.íõõP:ÞþL¾ëË“©"©{9Ÿ#F”xçÞì3 Á¡§þK‚Ù„ëv8Î(°ö»)ͼzŠÐ%Q±.ÜuƒPs•ÙÒ ï¦?_ã¡tíw›yi¼»)^@î¸ š— ŽÝ´ä$Ãpß¡c©ÞÐ>.©Æé¸²õº”?¿7¸½mG¬÷Kg²Ç{zõ‚¿õÅÕ`AG „šU©´—ú+@.2:?w2×;´NÑ”õ³Ê»c檅gŽ1ü”t+¹¡çém0½`9rM,™ü ü8Ñ€ðäǧå•иM‰W¤—ô>¶Uâ&×¼ÁëüxòÛ]£á\‹t‹ÝSûçÖ›œ•߈ØÎ.µ(Õâ$RÉTÂ&Ïȉûy”Ÿ@ãz”j™òÄÑñ ‘Âth¼õ¬Å ×ï†:bMͼUÛ­ ê;JÊ»¡`BZráM Ÿh{,þ"«EEW¾Èšu~?jë—“íª¸hݺ^s\‡¬7R;†6•ˆ™-Yp W’¾2d®ÍêÈü‚f:*RS»Ñ·Ÿsüæ%¿±›¾ÏÒð-o\«Ðj]˜·¢öÑÿÎã½^®†ºì³r2ýÀ±±ÆQ%êû:ø;nýÆæ¶âyå«ßJœåÑtyzxR¨©“Øq‹¤èQÃë67ŹCíUE/“ÇeKÜËœ5L[¢`¬ÈæiåšžædÔ§Gp·Oâ(ó@PÇ:ľ}ª_€7Ö ~é U§(ˤM?~ u«Cþª.!8Ö”žº…Øåî:Ò_0zyyO<#“ó‡€6~xÙ$§§¬IÕáÓ¸©-胟Ý_pË4<-Çço¾ψoóK•Ä)iÿ.=Ã×(Ÿ-[àòŒG²nîÈäÏÒÑTíéG¥~zr¾ŽAeö[F‡uÅC]€nz¤&ŸÇé…Ø'o ?áxü^fG”lÔÁÀÆc„ú`) ®­A^+þƒ Âêxæìjê{Êœ[͘í€S7-<¼>Ä×Ín°†dµƒ´ˆ¬$‹˜|ܱÌ-w’}º:y2ŽÊ·Ÿ_²søêgoÃŒ¼·ðïΔQ㣎9$êËX‹C>¡¾S§É_§9¦nøÂ klÃv9PЮm¡ï#rL“¾Åua·V°1PPm«ÀQùÓ„CÏTÒh/ò*n$f˺Jñ¬öúUìŒ uLXØî7”¿ù–xoÂáÔ"؈  ݱìTc=±‹66vK5ÎE’ÜùûçXõb“ýP­f S¿YZcPê»™^G;_6zÓDð5ª¯tºÀe ŠÕ´ßÀ•Y¯²{œtô[6{N‹ÏtRÓÏôyÐ’YSÊbœYQ)ämth˜ªxPbìµ3W B…’²ùÙíb¼X2FGŽGîìÎC=7W‡ÅÒìü®Æ=õ¾ýV¨ ?Î’F,ô@ÑØœ’GÃ\&ÇÍ;™„ÁŽtIf!†F·öÌ:ÉT/ß{I•js€Ülù“ܪٴ$ dMŒ“R-ŠÆÆlDü?;½À¹Œ‘½MAaÅuH„Á˜G_Zì< 4ItzYÍŽ•ŠíekžvÚó¤iamº§Œ³W¸ÇüÐù|ëV¦•xEË5ˆê†m-ØUèLaÄêZÈjúà–Å÷¨>> endobj 192 0 obj <>stream xÚ]‘Mnƒ0…÷>ÅtQ)]P ù!‘,¤ˆ*jm£Ðì!E*¶eÈ"·ïØF©ÔÌ7š÷Ìðüøpª“½2-&ËggÍÕILª·Æ²´:¾u?AzrFÖ8A×kåf ´xé5ËrP½œæ.¼å0›ëÛ8ápÔaB@z¦á8¹,ŸXúáº^_`ñUÕÔ×Wkp@=ge ;:ˆvyo„t¯^LHú7ø¼Y„<ôYÜA…£m$ºF_ ÎK‡CÉP«³l-m'¿ÇD®HÊ9&VËÀTˆ×‘מÛÈ-ñ:L…‰MÔl¼f##Kω‹¨/¼¾XE^yŽÞÂ{‹mä­ç]ä]X~ÞÒÿ†ø‹¼:G‰…[™ø4z÷‹²ÆzWx~Øz‹ endstream endobj 193 0 obj <> endobj 194 0 obj <> endobj 195 0 obj <> endobj 196 0 obj <>/ProcSet[/PDF/Text]>> endobj 197 0 obj [198 0 R 199 0 R] endobj 198 0 obj <>stream xÚ+ä2P0PÈå2µ4Ñ372s`LsK# ÇJgp…+äqÕ- , endstream endobj 199 0 obj <>stream xÚ­=ÙŽÇ‘ïóó hm¬¶˜÷ñ¸)É2¶¸#Ñ 6 B—-ÊçbÿaHÎ̵sˆöÊ~ö>lDöLUÇ‘ÕÕCÂPyº‘•wDf›Ý½ÿÙ1»{Oáñü÷ÕÎOövî}hw­ÝÝûrÇîøŸÝ­e7‡<_v÷žíüè‰1æ çø8ÀÇ)>.ÇÇ1<Üø×ËäûïývÑÆ4„àŰ ò˜@¦<¤$!épÙ©è£]Œ³:'~ºŽìL\Û~Žðñëñ¯_!ö>ÁöiˆA`›ý‘,/ xÌC5Y€|Ž¿âãäöì/7ÑÓÛ4Ø%äô.>ÎSÓ{?ø”ïHNŸâP‹äüåHÄ'OÆ?Û—ÿÕ>’1jÑÆ0OŒu«ÿwn>Ø[¹9š«±Ï\ ¤À?Vz-Ig;7äڈý§¿ÿîËo¾úï?}Á9 -äX„zö›ß}¡«I @¤à6³"ƒ¬è“@GÔýŸ$òXºòè*€ZãCt¹ÒÙOüz䰗Їò’{Iyãõ2XÚPÅpÓ<¨N£qF…˜ÇKìN¤àÁ§  198‹.Æ!&c} K™‚'G¤Î—CòÂ}á4`uB»Å€êàs”œ&œ_ÔýÁJÈ׺kH:§ôøž9£j––0‚ ¿” "Äb%vöcN3¢Ü{T~©ÿÏÁï¤-*%0¸|°ÍJqNÚŠcTt»ß|÷ç¿üæÛoÞ4¨?}uóÇ£`ÀJë#ùb7ÆN:úýõ9Ô-Yóh&ƒÓ 6‡ù?]l~Ž€ÉÞ€¹ò…Ÿà#bó×¼µÊw?'ð ÷µylü1>~†ù†a”ÉÁÝ8úƒF |Üssm_ØQë‘F’@ï €Ás’#áãt½í¯Ïi Ž}Õ×L'\ ȳ¤N[Úcª-&̳…wfp^.í³o®rjªQŽÂk×L’÷Ô(ƒÄ×38©*1p*Æ È“ÑXjQ{,R›á\N®5e?ø"'³2Å<ÂòY.oŸº¼¶¢wÙñô`;œ6ð¨]^ÐèèTæ¢J#HïÙA,à@yqÈžW î œØÑ•“q:Úê3j«©¹w à‹UF1~ô1N¨æÕ¢õ}Ñcf€†Fl£ýçúto^hÿ`:LDHŠtò„Ù)ìu@wì5ÁÉ`²þNʯ€MHI£W ©˜)\„1bóI(ÝVN3ž1¢ÍqÄ€­R°ð_¤o¸FÞ‚ù3¸›l”Él¿ 6õ’FõÔ@c‚'ËÁæó_«¤6Ç¡™#°,u ’:S_ w‡A¾á©ðÌ~OÃMÑWuFÅ1·L‡dNÄ>qºXB´‡qòe215%Á1ú°Æ(&>¼BK™pD7<;æœÚZëã ¡;‚EÝuÊSwÖc¤?ÇJÌc.-¯ÎÁ©Ï%Bÿ"&É9ãò®„*Àyˆòµû¨¨ü3‰û4ËëQØ®¸˜ƒ¦ŠÖ/2AÖÙ!E21߉݈VË œŽ·o³k©;~ÎT=á3ÄiS^ʤ‹Ø,qÞŒ¼p¤kjLºøTâ‹ie4é’Áìþ\É\Zðt“€y½¬.8טâˆ4vïwŠI„$Ë5nV.˜·Cÿƒ!Î*—”†°ç‚jgÅÏCÑiyF Y¦å6QýÞ‡žE_ô¸Q{®¦÷E}Ñ;q5}Í XY|›è!x¬i3|gÁV·CÒÞáòŒÑŒ®‚'\4b[Z^x¹¶e<`Ž1Un¨ºDPœÑÆþÝm¹‘cÌ:ÁœKœ-bP¬ec^“Ñ+ªQ®«‰‚Od³ý|dÓë[õ²Še”Ø7¦!G'†PòÙÃéºxn¥¶Âš²EºCmêP‚~.­á}†õË êd=p•©r­ÔHDËê›® Ö™i¬·òж¹H:É^ž1q›ôÝ^œ›VÌ6 —µ¢*°È:—Ð.pPZBh‹mDA†ø_@¨}<Á©_n`«ÀYež ˜aà=F´±ãZHëé'Ân¶ê(fA´µ\(MàáÈUÐë[®ž-ìt(9DZ×Z³Z+Öç<øVp4]UÌ­„ÔúˆXG ¸ýI¬|Å• ü!—¡8OÓ×ÿ)²ÝŒ:/¡[Vù_ñáyæE‘ƒÀ£Â3àbÅÄÞã]RÂx”87‚'·áu‹µr¤÷ä+мcIëž&´Ü<úùX°øäF€Ì”¨§ŒšÊ ü÷yg¤Sfòˆ»•Öy}Ê[§ÐiãyæûÒ8P§ƒ­S5J:Ük iT | ªovEÞ°¢ržŸÒ.œq¥zòcjÎ0Ù wýá¸Wo,K„X[~¹¥`lá¸bù)– ŒòîS7*øo„qIB^Ɍؔ"§I³‹S,‘­4ç‘ÒC‰UxÉÜke –Ä©EçÁ0Ê•0v ”6âx˜·­ªk¯=Ö¦IÁ´ ã qˆQwó}óãf‹±uyâù,¼)+Z(oà„„ PL°ŽQHÐÆü_š«9§Ýs´é®€"‡™+øxðü½B¡}*ó¡5ês KÙ«˜8ØÜVûÞÀ¼c<©šç6Zª °í°à´g@± ¦Ø¸5Ábsœ‡TVX¨ÇXXá5OëuG2óÃàœÏlˆséø/—IWseCX*]hc£½“t¡ªpXÝ^®P ßJÑåÖY,?¸­P¡ OQLwN¨€¢ïJ1®”²=0,°–à膔jI½Êê`îÑ÷PfÑ tŽ‹2Ý4¢VÀ, ú·k§6Ì„9 ¨ç7m²OVIžÍBç«Ç]耷Í:#(Ò)"7¨fJ†ÒŠ;ým.¸[^mÙL›ó*?¢ Ú•Ò+ºìà‚,uéÜÊZòw±Ì%Ö$\R×|ÍõƒÉ­c‚X›×4ͯŒðÀ9(õ »—’!…*À{EÆF„$À—ð›­y(rY¼m3ûr|=CŠm‚6ý3ŠcpÆ û¯ˆ¬[J&KÏY#ÓFË€çd±GW!A\ª¡ÿ`ƒ:J¯í¨Tðܶ6Ø8i~o¸Õx^yéÞ†®‡Â0`)$?+7X6{ ^°6êÆìÚ\¯Æ ÙIŠ úD0ÙÙK¡TŠ–½¨2ÃÐÿf<òót]Uø𦓧´X÷;+G¤¡—rì™`¢Ú Àçôés¡L›;á½6Š.á`e‘tþZsÀ©ãìãóÒÕ9<‰æ#| /éÝHýœçw“²3GÚé ¥±í€;Ø-É“A86 „ìt†øïŒYn>Ó‡×ìT•ì²3¦ùp|œsj£Žgv vip îT 46\ §Ši% ±(·vƒ9UK—àª*HÞ2S/¾ÆP[×§ÊZ«ì9zlŒr~&$k‡8ÁÍàÝz#ö8Ô(àçã™r)DEŽ£ô5”ÒJíòŒö5\“"£l&ÌΊ!zr|ëUh²Wè€M\J‹‰ëͪʤnÛ5-"œÐÂÂ5{Iô@õ½xAßHÙAHÑþBZ¶ÞŸ,ÅVàûÀ,5ˆ5ÏÒXkÆÁ¨(º°E-IÁ¸Ë9M n&2zà ‰þoL$á£抄9ÄxÌ”ãoÕv¨A Áκ³Cû4WÑk#ô:[­o©-¹æ1k0ƒuV಄ú¾¦wÚSÇà÷ö¶`±BÀT™ ³[¯k0<ê‹d‚ç´ ¡4ëB4棤†rÇ@¬Æ|‚ØÅ0n}n`_»½ƒŠMRrâ[Ü·àŒ]ùolˆÞmH¯ck8gGÉ/: ±o$ ì®w·¯0¶r®ß¬ª›|ØÙ6ž?ݦrà4#ç½Hôмx+pY‰wò(ãÏ¥hÑ0¯ -tBX3“©#ÐuÕ­Ê$T´0å_fWBSÇXµ:?má:Età£]°äÌ ¹t¯©5Žc À†˜i/-0ð-ôÞkbClcg(ö¸xÒØûc£œô¶{â*„ÜAŽ£õ“¹–sæ=Óƒ „¸zÉŠLýFð”i½¥jÉ[s:¨erËâ}ÁîÑXäÄ'ñ~Ã6ÌÜqð%J ûšÉ·ŽæwñƇ¤¼`ƒ— Þ²¯~/Sb¼•—Ù®ëeJøí¼L†/“ ¡ƒÁË uï~HÑc„ˆVI{÷)OŸX#ß}µé 1,)ÅuÄßÿá‹ï¾þÃ7Þ¢£Ÿ-@¹1INlî"1Lìrœcjæî¦A[e¼_@&>%mOÜ?ƒL×Pî}ñ—§÷nÈq¯s§Þ^בî|q˜sÀ@¨ÈXTz6† Q®qÁÙ$¦œRŽy0%pÀî¹Dpw1 @/ápÎÜ%êS<Õ{²S¡©%ÃÖó$ç.Mó˜7C­ÄiÚñ˜Àíó))à‹tæ2ê$о…JÂfUWÅžu¯•:eŠÑR6“еïSÉ”Æäƒgëò"CkÁaÀJ$ÇÙX3ÅÓÀxGÜ@.ÙSP±›\Ž£(|ƒGçåT7ªÌçá™ûuÄͪûxj‘;”GP„džmëÊv\Áx;Þ®gÇø­ì8Ç¿ƒçC,‘~ò¢È•¿³Œ‚ÏfÕéKݧãœ(È…’-íŽ]>bçL ^DRŠÜ«c¥\ËìàqîÔ!óÍé”Ázp‹ *1{sN…|õè#RÓ@‹£±:u |ë/TÙ¹YÏG»(ÄÈ>^oùŸ%XT¸{â¦HÏoÀ’àíä2½½B°,îJýœJtne0Noªrµ•9P/ðSšM=08ÇÏÚ ³:14w$¨€ /rðûšžŸve#s1 ÷ø™0/a¿IÙ¡sœ2my /qIEçy;˜C)d@Ëe¼ŠP¾åýñ®1åDX=ðÙÎù;xwZI:>±)'n@Šˆÿ22Èãqœé|M;9÷`o§–ÆÒ¬Ê³Õ,°•Ýowð¶’ì´/Vàk_€+^¢áß~øzçKü/Lu,?»ýP@ÓŒ¸ê¾ö…iÚß®ðo?ÜŽV ºÕèà´˜º>˜øâ|í‹róþ6ØíüÎ@Ù­ÜçðhÕ|nE)Isz2Ñ×Ö²ÍÁ?ä…F‡Ê€}ÆSTMß2 ‡£J˜c•Æ& “]å†aŽœè}åª??DWuÈ_ð~õ’ä˜k~<ŽŽ½*@Ö½§ÍcÓIüXIÇܪ1÷”ÆZPËÒ®åùx3÷ñš¸v2èJ–Z öHì¹û<ñVÕâ債~ÑÜz .ÅCjý—‚uX#±Ï)Á_Ë3ˆØKrÊö¼ç`üཽãDöÅ»q¢Ô ƒ¨@`ôΖÅÕ 5 ÉŽµé”ä~²Ûì_è9åPA7õhÑÉcaj]ªrÝÁü5í£¼.’Q VüÆsâí[ýJ)Ð\l¼ Üì&ãƒÉN%´¾6D}’/µ[ÑùM†Ý&<¢LÀÀÏ•+dÚÿz{Ó Ñn(U.ÊÕõYýI;9n³ÌÄ`e©Èå35#,æWŠé,üŒª,5.%ôÂ;49x7yÔ»÷>õFÏe€²Î¨áN+Mz‰˜ÐœNn·”ñq”4)˜ÂTðVê°!o?ï\ùtI;§“c‚Û¬ÙF©v9Í‚7¦éçMœ6®›¤c§<ÏèÏÈJ:Œãv»41FHÊ«:Ý£o­ÃÏݵƒE<¯LéT& ˜Etèojdðê}1Üp¬œðØß6-õ´ÀèîsœŽåóíþ IUÖšöºÇWš¼+…Å`ZlÊß2[YL¦WŸÛïy¹Ð0©‹ŒÝžGµ‘GIQ.›bÿl”Ûû²‚ ‹én²Âp7ÉŠxÕYaðoiöÜ#†Ç.iûAü‚…Ó¨ ‰JhWr`MT|;iÉ!çE%´Sá§'*˜·ª’¨ïXT@;T''5+*‡”g·{ƒ¨(˜ª¨8!*NãÆóòˆc¾›|0ÜMò!^µ¹¯Àl1t÷€;®ÙxåávU°¶t5›EÙ,Ggnñ…ò 83,СÅíÍ·ÁÝ4'ohr ·çÊ8™±e­àÛ™>íýó|âðdÊÝø„ánâñª-D›caŠ6P‡V?1¤¬±Ãü7 ¿”#ÖUb®Ú{×"{Eû–Ð’"mqÉ…GûA’J9äé±ÉKîÎô3¡ÊÏÆM…Ù9Yèì·ø#k†”´m«pææsZç l6˜•‰¸º€AW• ß~‹ÔC2TO<™¸°¬Ö3GCWkùÀ3§Rr[]+šs;&&×òî®Å‰{ƒ}<–®ìí|ºóÇV‹zÏ\æ™Q§;úÁ´ ó ní+z‹ÿõÎãÝï`Üÿsá endstream endobj 200 0 obj <> endobj 201 0 obj <> endobj 202 0 obj <>/Font<>/ProcSet[/PDF/ImageC/Text]>> endobj 203 0 obj [204 0 R 205 0 R] endobj 204 0 obj <>stream xÚ+ä2P0PÈå2µ4Ñ372s`LsK# ÇJgp…+äqÕ- , endstream endobj 205 0 obj <>stream xÚµ[KÇ ¾ï¯˜K‚qJÅz×5%Ù0`KÙÈF äbÀ6)sÉX=lm,i­'0É9>„¬ž©n’Õ3³’A½;½d=X||dq¾9ۉv“3Üæ‹ý-=ñã7'vsúWüýô‹“kÂæúŸOnã?Ûþþ—¯¶¿Ü¹yRp”PLñnóà$k²ë/îÏ/ªñíE#ß}øúäËö¼ñ)-ø·/î/_”öbK>} ~ZæI[æ¯OO®Ý(€Íé—};Dï½ 9nNœüâžµèáÞ;ýc'ªÉDça¦Ç½öë=ë#q\»bpÁ@-ŠùžO?¿]N>o³"~M§ôxÂÈ£3‚"¿¤Ç?ûoû =ž3îR ^q_Ðã=žµq–<e lk;k32rïL·g ¶½qn$+ÓOK2ƒ3¦Mu°Ofm¶%·U옯Ýðâ0=ä˃¶…Ñϸ]pZ2ª‡eóGkR®£qH©òåÝÆ_Fu¯n8ÿXý|ŠV‘—ýÀ^õßžwaÍój9} õL0Ö·§ý`èºó˜qÓâmTÜ•à‚MhÙe_y[Û#zœ7#ê¿=QÓ6PME±íÆ9ëêÇ(ÁnÏ)òƒjÈàSUŒx|]¸™ƒ’ô;5rvûy«F6lÕÈïS(Þ$:ŸÁ¸+Þ©â‰F¯8ÞH=\ÈÆé±žõÃX|*Ææ?N£¼ÅÕ׬¸µF‘ᆪOèQŸâ9ßâ ¾O>m.&G=í¼Tb„M"GŽÄ,2mzÞ ï—ôð˺§T$ÝÏèñ =®Óã&=n±8UÑ\¼dãªgsó ‚æÞ=FÑø Öy—Ñ801Ió§ÁqÐ5 š[Ü0¢„,i>åq=GR»Ái2j²ZóΔ~Îh3˜šÔº&Ñrƒ &{·_ÕšÂ^gqŠ$òÈjQq¯¬jqv¦B¼Q£Zò–'„$h>§Ço¹E'ÄJîzaÉ5×>Z˜ÝÜÄÿ_ œzæ„1!ذ<®´‚uÐ9z ÍnËé¸W“Ðâ5ýäKŸu¿ö¸[ùÎ_PÈNNîĽ¿Dó4—!º¶ ™ýÏ£>ÂEá‡î”¹#E•ÃõÀïéqw~p Æ:?d\ ´×}³g[ñ=q‰jœàŠQ·SäßöiŸñ­ÿÈçþŽ¡@1f}Oy kÇü#c ÞT«¥v6qH€^¨(òWýÐ.yxÕ%Ùÿ ÿ™LBfIK“@l=ìÝÒŽfƒp’¶+ð“>ýß¹?Ƽ©FŦC9øˆ!®&X·ÚŸ3ÜÏ&Œîj™ð=DÈAÏQ†;šÌû¬Ïú-÷ˆÁX:“«¬“{8LE)ˆ.4ºÁã¯QQ¸Zã,Œ¶a9yÆØª3ãóë^{Fdû\d H®¨ag3;®9ƒ¨ôJs‡É™ ¶íQ®TEùpÅíL™ë~· „Šr«¿² Š~1v°œ«˜H¶_ Îá¯ú¼^˜ØÈix„†Ñ`-“´ ³‹çÉÖ{PÙVÕ;;[Œ ë;—÷—¥Õ¢ä$€ ”¬’üŽcËèè&·2£Ý‡GˆËçŒ:[—G]þ¿Ê+$LßµF• ‚W”g¼t‰B½Ã7DNíâbiB±f·îNäØhfI)¡Óq†‹3Ž‚Oœ´í_ðÉ GGèê=èA¦Šèã.¹YhçÔØI€¬0c:rX.ÐM™;Btyh}z+È@ê‚>¥}HSVÌñ²äµ(½óA)áH˜Ô»#¤Dõ´28~-%O˜ÝåýRzÉÁö9¯9|pzòͲI â¡[ÌÑß®I ¢P:æ~É¿{qù"·[òéöI€VhlÁ¿}qù"·[òéñ¯µ ¾6åˆÎAw¥ÆÁ»§Ž©š V à ±0i™$õoç0ô85öËß)á0Éïªpí¿Êáε²lâ¸ÁâÀñRàR^éå÷%­”`¥Ç!Ø€Is’Ô‡‹Õ>›Ôé¯ÕªÑR¥MPYªÞáBÚÈhñI_X3ùÖh(¸ Ò³ANù‡S”m}ÿà×Î/hâ íæÏ«aÄòjÓÅ]RŒ+TUÜ—žç1¿ŸoIž ŠÍ¤(z â]DÛ 8|äÚ2)UœÏØ7P½9—0:Ï·w>bÊzð×Q Óç±Bãö¤4C÷ŽxÃæ"¯|5ŽS²WDÓã£ñ})X*Ï-y»p{jvDîüQÕµ(:Ý.ó䘥làá!˜?°Ò ˜üGE”ä%OḐ¶#îw\óÎ’ênkh3«kŒþÆ-¨ÛÀÊUÝl¥êåO^# 0X~{ÞV}.¢Üª>•Oô-{¢;ÑñŽWí¹˜”òþqh!Ô˜¡T‚whWi’躚“úgJÖsÞäqÝdÖ:ÍËDüá˜)9Œ´å‡Ñ¨ù½‹²jOHV¤Z"|D¤UôîŒO§ÚâÂPíæÑ FgBùGD·‡¸áflè¿0ì}»ö‡A(´ßˆæÚ‡n’$Å¡ƒèÂ-£ Ì"QÎ Rk£¢Ë¬½Z›¥ ±ªý¥ Æ é~Ó,âg4¡,é>îôÑÁ> ®⸊±ŽU¸»ÌˆIÃh(7À>"¨ð¡²Ã­Œ†®¯˜ô”g¢Ê SDÁ³«@¹°\ó6€Ÿd9Ÿ]9ëó>õœ¿­´L³¡þ9ĈTh¯’rí*ÍVTÑ!ŒañRäï‡T ¡Æ¾Z’üt¡/Gy£&ò(±êÁŽî avŽðÀç4>™ Ñ Ê#¼D¬ˆÜ0©–ÔËÓÛÕß¹é¡BU|o´/@÷kÑÈÁt"(΄VR¾Q›0•¤Ê`°óE-Þð1p³Ýâ/Ù«EͰݙWÈ’û‡aÌz-ó½>3ç¢$4U‡eÖæÐ—ii^ &ÂçÆ±Qr@*iZäÿ #Ñ¡sUÔƒ $AD†Ïµ.´Ž@IljÐ~qïzFÝÇ2:E¹‚q`Åè,Éus$)´½N+CIlæúq11O(-ëx0} ²WË^ƒùâEF„W§ÂØüa[XƒDµ»ÑSi·3¯~1‘/^¤íü÷aúnΤ«Ûò[]ê]kÌŠ¨*ÞrJ{²'H))ß×`<("Þƒ‹'…Iieq™² =ÜŠ²Êóz\­+űášL° Gã™(Îh‹"÷CcÉAÏ©ã]ÕZ z¥weï75WJ¢½9ið Ò+ùs¢ÜÚH$Q’ߌ²AÏ.’Òˆ©kÖ’Ü—”ž<5xìU$j2¨ƒo »ÇÊÑŠd}«­¬k};elH>-ÑùüÝïåwU–eØíæâ;'»¯8í0•üQ4Oõ8[©:_ÒÕЗý`_W+¯Ë šò›Ð‘À‚é?Þ}™§ v@ßoX·‚w»¿÷ƒX ^ãUîܶÕ2ÚéÛ]ºË~Eï’œ£§;ì{}?í=Z[ÿä;Pà äëÅ—­Vå½²„µvkôÁÑFÉ5¸¼¥J¸=üzÞª”PÞ%xÕ§³4Çíçø®¤¢¦œ¦m‹^ Y …ë¾úÞé[! û7ßÕ^Õ;ÖÙ;ʯ[på~ÉñR7<¬6F*Ü F;ÜvJy¢©^ôྑ·[uÊ"Ƴúv‚·Ú«—lƒmÝâ#Ýñ}òÙæO8îÿ#Ë ? endstream endobj 206 0 obj <>/Height 484/Type/XObject>>stream x^ì|UGÓÆƒ»»»»[àîîî’HˆÜ)Pêîîîî-¥--¥x½ÅÝòýÏ}`z¾‹¼i œó —s÷îY™gfvvOŠÄÄÄïò(àQÀ£€GÉ œwyð(àQÀ£€GäG€ä×%¯G< xð(àQÀñPzTð(àQÀ£€GÉ’Â%Ëaõ:åQÀ£€Gž çñ€G< $S x6\2X¯[< x¸î)à!ÜuÏ< xð(L)p5"ܾ}û öÑ£GEó#GŽðyòäI><¨ÄX⯿þj££g÷ïßo9¹'åĉÇŽ³ÒÜ%»‹=ë(ó,é<®>¬¯j’¥¨5[ÍPuÖ‘³n…(_wîÜyÖœH™\4X-5Ž?®^(E_¡ª»_ÊiO‰¤öˆ:.²Xž½{÷’~q] ‘j†®={ö\t—“êA?Öµfˆ]ÅH\çg‰Ûx› *ß zZEüñ‡ò¿-ÿ¬ù)Ù8z5Iõy®Ë~…‘ÜŒgS€D›kÿ³‘êµ>ýþçS˜At“èࢅª‚–kðUU{×UN«áÄIb2ñ“î5C¸çI°þõ×_"ñîÝ»ucœ‡¸1¡¼k×.+ÁæŒkkœÎœ<‡²Ìˆræ$åP©;](\"Û¦ÊYk¡ŠË+òά…òz!7Å$—ÿüóO>Õ`šD¿~þùgåäq–!d÷£Œd]>¿˜;-]`|‰…üÏZ®P5[œ­ ,Ô&QÄŒ’æn ¿,-ñ+–Ý:‡ÚcjÍe©Q…H ¡|Þùûů6G¤9éqäq{–¾˜*pfSM2\¼ŒÝç»Uj÷¤– ¡©º9O#/o“¼Ò.…W™…¤^‰ÛÄL~Æ„ulª™bhh'ÓÍd:ÙŒƒÍȳZÎCGØZ…Hþò)¥X—ßdS; Õ4ÎuÙb†ÿý÷ßzÖ|)C«g"ôÔo6R¾ºO/ °OBk¿J˜J·«© Ÿ±*.œ(Í-ýhxétøoJtv³–qˆ»ƒn;øÒfJ±gZÏ6—‘©h³¸‚κ1àÀÏ'Ÿ|‚:’3gÎ&MšÐf·€»Ÿ˜<ºÖ;Œ^yýM’G`!·ÃÐCöqãÆU¨PÁTKqÈØ Jc,`oò‹¥ˆHFKú+Å~r…Ÿ'Z!ÃFĈTÎóxíÜSFníM›6ÑÂçŸ^-—çæz/lÍX=‚¶1114æÒ{ä.AÚ³Yo âªU«–¦ùm·ÝæÙp——æW¨´«álžÀî0SÁ‚ýV€2f̸`Á„ >†ˆfÎÊ•+S§N tI¯”·¾D.좰´¸qO-&ÉùáMF ^ÊæÍ››±Á <.5V¦˜ß²Ÿ;ô¬CHï€g¼"üj 6ÿséî¹Á=Kyjûöí@WõêÕ¹G™ÀJC< ùèÈ“O>™2eJË#wîÜŒ-p6hÐ`ðàÁ gžyF° 5¾Þy碹VY.¼ygÍI¥("x)ÃÂÂ.±¨ÿìq †‚% ªûõë‡ó€6(ÅÆ÷ò‚\©R¥"""(_”—,†íѺ¬û—Ý=P»víeË–Áó«V­‚ÜÀsšÓ ³Ï~øá„Œ>F¢óó¿ô'ãL&uýúõ/×@CCFçÖ[o• çÞ•o#HT¯/W¥^9WŽWï Áj±±±•+WÖº—yÍ|FkƒÉðà …µ–~ï½÷¦I“†Ð ÉeR0ÉY'ù°6€LÒ7n܈Xà$Ö•ßHl·D¶ÊÁE s+ò£G¨‘¨z*B– ãA›¢J±òÝ›ó {pô¡«4Óñå§U] ãŽ{4 ±I¨ZÜk!4Þ²‰€jÌÌ—^zI_AVA$2$zX¡„¼·ÜrK† ð#Y v3àGšŠ©ç®äkÓ¦Ÿ¢  ÇÒÝQ£üäÑtÇò¨ÁÐ SØl8µ–OÑÓL!ºYè¾Z]îvªƒÒÇe.µ­1¶Eåè’ÔS±j€ÖÜF§™­æ§Õøº¹Hµk¼„vzÊ–l­Fã Óոɍ¤€&k„²KÒÅ{ .d eû-«…*Ù„â6³ô«R ›­æZ ¹ýmÉJþXã|£«ÇÕ ¹d¸A‘J•*ÕsÏ=g?Ydä¹£<ôå'¨%´ŸfÔ©SG_yÄ| ~“Î8Aí4 h‚¯¤K˜ÐN,`f´ùl!w‹´.z ç–nTæÞ½¦RÈ›·fà B:µŸÄhBŠõH$µ nÓœ^—Wm²¾Öo®:„JvÌž=›Y Èi5ˆ+GŽ|jy[´ã櫯¾jÔ¨î Æ–-[øó‘ „±† ÆtBm$oéO<ñ÷Ÿ}öf%¥[·nøåXÒ }Û¶m8ß0ûHÇÆjÖ¬YÕªUÅa¸+‘þX‡ÔþꫯªRd1mÃkúÔSO)'Ïbnr›WjŒ<ø Z0àur éS;9û÷ïϯÔKuëÖ­C¸àð$…©%  8³*Æ èNLÚZ ¦ ™3g.T¨¢ßd.„Å—Û¸qcR40ˆµ¨i!ÑØj¬#By~2æ¦ñÔE›‘J<Þ¾}{ý‘™oÁÁÁxùj~0nh4°;Ðt^2°VJÈÙÑPBaÁü„B"¤àéL¿0С•„ ª Ýá'ä~TÕŽ³T4:t(_7lØÀ=ÎgÁ†øDö:½æsÀ€…®§Ê”)ƒéONÉe¸…<»ôWæ;Cɸ“Ⱥ—¸ËVŒî»ï>úˆ·œñ¢ï½{÷F…Òò-œ£Ö¢I@@Š…V†©S§RšvQQQ*R²dÉ®]»’‡Dõ:S¦L(j'ÎvTÒiºÌCGèµ™G=ô>yê‚øh3cÇŽ%'Ì@«Þ}÷]†·³H ²ƳL¾ÒZ>µåË—3¡4/!‰oÊ×ĤƒzÊß|óÍÜCLzGŠœxä|ùå—‹)BH>|¸).b>UŠ):CÃz,Í´¢…ŽÁå'20§¤Œ2L¥eË–zö`"3štžR—Tñ!Ÿï¼óùÉI™;v„ p5ƒ‹ë˜iŽsžÞñ ô!3lŒ'†œ\%J” ƒ<¨^›^Åb?UÓ*¦*^J‘K|‚R¨Ì-xS8óˆgÃO*ú¯x;P—”.]ºˆ!éÂ?þH6C`xªÃ }à.Š’¯…~ÀFGkIM¹Ä%p•ü®«áŒÄŒ³iâ¤DÔ2äÑÑÑ *6“8ƒkäÈ‘¸(MÅ–Ìâ+?1«ù„ŸPôd‚ˆð1œÖFù\à\Èr9±ùXŸG¾€ ù%|I¡R„;+t¢-˜*øýľT‡5CN Wâ’yB!’àÌ.&0ígýÑO°ùæ›o2'™~01ÒÐ2zŠÔÑfú®Ö’N!ˆlÊ&»\n— ÍF kö’Ÿ  m¤L„¿þúë"25J–i†«Íèæh€þaÑPdÝŽgiŒ ¤XÌ4RFîb“û %—öãö¤Zûé iXá#qÊ”)5bÄä#"‰7oÞ,³ˆ@HwÏ=÷p<å©yóæ}úé§ÜðùØc!},xºƒˆ1„Ã×$„CÒIó¼ñ÷Ø=ÜÛr¬T+ s_y 5½@ôpÏÀ!’ÀQ”šŠê s_’‹êÙ³'7ª‘X;îIAc€†È#àÏn¿ýv2HjÓ`ÆÑ ú “^’ÞS©T"X4dì ´BK`,Aa’d¥äPÔýŒµ£‡¾ËP±bE´:ÈÅ×1cÆðÉÔ 1ZØž6m‰0÷´Ÿy!NP­Pô<-þ1È_fé8]¨”†Œ0-ó¦bÝ ž…åfÚ~ýõ× ÎÃ?Lâ!CxpòäÉ_&&’Öb6èL¢·qϸÐ0€Ñ$Љ§¨OºƒSè5TB“@€¶… “؉5u >4²mÛ¶ø‰ röÞ}÷Ý=ò‹ãaŽo¼‘f œÄܦ|Œ<¦S ¡ Gš™ðB …„„0m˜{¨iÒÐ(((1Ѝei%1)åöV!ay–3-“™¢?øàõ8„tŒF¿ñŠ ¼E4±ªP*rÁ±4½Gyà1ÉÝa"+‘ -Þ #ŠAªØOîE_/°ÓÈâ¾¹êŽÆ1¯äFCø2{9c58©„À‚U€ùÝ+:îMâüCàò`\&_a}ØB¢ð®»îâF"Rü!=Ùûº9 ›†é„ª+¿%â^Ÿˆ ÈPÍœZÌgM-”>]3Ÿù€Ýƒà`¢â‚ÀÃ#Öò5ê¹TT]rÅ ùâ«äæÁ$'F5"¨ ùb1l6¢À°¡¯î%(¾"wÐ…©]­ÕLxpaqc¾2&?h©ÔÖÈ€îIó(åMÓ .Q ù…œÂr¥ 87NàA›)4G™©‹bqá¢ç©dÚt\'ÆI/Õ¡7ho´GóÚ«”ÃýlmRÝt¼ÚÌè OÈÜ¢èH)„ÁhƒÎÄgÔ,èÔ"Mh›tGMKæ2½fDÔ…ÌP£\8î‹<’<n„R8à˜“{†^È'Œ†Ä€B[·ËøZc˜8dÀÕO¢íʪ|·GG)Þu5"œ ¼kÚ–%j÷_aæ¤ÒA>á"÷ð.sC:‘I7Œ!æŒçá@“ gê0Nò#ÊæùAÅC'";’tDŒ*ÕL£"ª@Z Yä@×ÓWt=ª@‰Æïaú>éøëPQ?áN™ÃªеràWª yx¥À'¾bj½Gݧ™ŸLo5À@™:OŠ&-µ0Ãå]”Ž©O@!øEU©€ ц¼C¦ 4y $R^æBŸÞzë-=‚-E“jh¶,r¥XÃäž~RZ\@ÃPVðÒ ;¨ÍÝbÍÕ6|ƒ0²€_QS¬SÈ8É;ÀƒÂˆEÙ*Õ{l%ÊIó€iÇæS•¡`ˆ]ZÈ‚‡ZÈ#3«&Ö5(CÃÌ SSÕ69÷3;Ñ ,:²È„?Ö%H1fÀb´\'KÎb a ızª‹~IÞá©S“è "R«_nü  *¦e_©í¥‘ÉE yœaâbŠa²€µÌé¸ PžŒÍad—†‰¶ÉGEÀ„\ÀN@{ ôQkE*MO)#KÇÅð˜h…ªBV&@¥X ¼ÄÈ£ ü ¦(è†(àžf@dõ]ZÂt~S™4CS›Ÿ˜Œ©z!jh»F¡<Œ©–HÕ`;ŸŒ{|³¨M´ •¢ÂLx•’-@`ãvÌJéQÔ·~’<¡ J¡Ç `ϼPËi¦'fÑ"…h¨_!#]¶¯Jô.7®F„c>0lð‰ü5ÆÕÂâ.‡9˜H,ó^ÚÀ»­uéDê0Š3ŠY÷ñÇ£`"£¹xXlG CcB Á|ˆu¸Ÿ)Ê4P(3â õ ?!婟»V€Xž'(­™6³BC¥x8áZÍ ¦¥d4ýÂ.䫜¨ÒrŒL˜˜dÒ²@B§ÀWd%òW N¨ºä•¹gºÊ†Ã³é§ ,ZNKX~ 3B"ä÷ØLH¤³Haw¬±!ž0ÂxEGF5–Ö)oÛ‡~È&b1§9f)~zaÊSPO¦¤f©\Ü s!¦ð†OÍdEšˆª\@]&¿°Ô/™ù ©`h„FÈ_´ZÆ‹‘ÅçLKˆg#¦0}DàYHJ›¡ÖÐxÉq,`š‡ùE"Dƒª £Ž³öVœ~ÜKIýGNQãÈ=E/@8J`Ü1°H„'µ*ùÅ á *•Àæ8…P<+jÀrÚûEí”)ß”šŸ)x^nmâkø‰î gávª†æŒAúóàÙßtPA4Úã–tHRÒe‰Âf0³ŒN¾â#¥ƒ°¿ÒY†’5QÜøPƒÝœŒ žCî±èŒåªà@~2ãéÖŠœÒ€Ê†ƒp7Rq j§/ÊÎ#‡°èŒ#‰†PÏÖ9ü@Ša6ÏVÉê–{VïXÉæÆ–âdŸÁÌ@ݤäÔ.#(‰Ÿ” ˆ ;!Xdòb™Ù²±uÊ‚°¨ÂN!àA2ˆžé`šó,‚…D˜–¦×Ìkz-Ð2ý”BhP¦x/4|ÎÌ"b ïªð‰¶!–‰,PÄi¸K;-ðG}w+Ðï‚W#™¶Žœ‚uh¥&ªÒ…~Eáå†Y'6âÓrJZ¡ÇÁOòøáa@LÀ|r 8¸Ÿ°ÏP‘ȃ‹Ì X•†R‰Ä$'ó __™ä5VÑð,´Dþ1.VŒúÅ…9¢Vñ #" é…†’Q•“µÜÍz ¿R8Ê,?Q/sR‘„:ú–Ó}„²í¼FŽÈÀ…³bˆÌ›S]®~ xwõÑ%µÐf£0`×®]{÷¯Ž‡±Þ¤A£M[‹<úêœäÙ Ó¢<¨{O¯ºúGÚC¸«Œ.©…øîô¼[úËi™ .:… GGè‘ê’A×¼.\mЬÁnS)ÙÌ£«Ô—±=Â]Fb^¥EáWÑœD÷äó’¸Û3Ý®RÎKFÍ’¦È§˜9õçŸ&£þ%Û®x—l‡Ö:†CO!É,cÏž=2àèW2Àìäψ×xYî5ˆºâÙpWÿzwõÑ%µÐÖá6oÞLA|ü&ê%Ut³¦h• ê’ÇcÒQÔ«ùœ@²ßp„0Pª’Sdrr{á’ëÈþÓ¯¿ÿþ[_p­äË—¯yóæÉ¦Ïˆ-Z4  [·ntʳä’ÍÈ^m‘sò矖vؾ}û9r$3§ÈÕFóËÒžd‹pgU¯$ÝŒ¢¡Ä©Š§ß¹s§²Ù62Ú­ÄÉ0’=¤ŠvïÞ-ÑL Ý<¤ØB‘*l*ŠÌÊON?ׇµVKÜVV )j?…¸#˜IT6žµ åÌ–-[Û¶mÕ#Ud»|Ü~2r(‚QuYOmž[ dQe—ú«U@{Ö]ˆ;óÞÓ˜áÇgÏž}ûöí/=ˆ7Ií§.Zb„Õ¯nšóÖíç4JÚž n’‡Õ{„ugƒ2Œ `£¬qûYNÑJ¤Ö§1À™†5êA¬pe“#´….M3³üd³Ñ1æ´ŠwkƒEfe£ bÍe£SzD“×&µ~U,®ÄøV™A8OPÉ6sU…µÁ=U9Õ#wNã7•SŸ*ÍVþÜ Ï64—Ø)*ÙŒv O?ùC6wT—Í/ÍXB7&Hõ«„À¼×"Ù"œx”Q·)JŠdŸ¨ÿË/¿´lÙ2cÆŒX)S¦äSW–,YR¥J•&Mô5 ×ܹsk×®­ Ø@;vì NFŽºZ´hÁ³dÀªˆ‰‰á)Åf)_çÏŸ_¬X12äÊ•«C‡_ýµ•`b¼k(e7j‰¦ _øï¯¿þ2ö2vÔ{ô ÇäTu’)n»‡¯ÆäwO$æ¤ô VÝhçæcÝS 0å@“Pó‡ÒM~Pj¿À› *”+WŽÎJîP {w„˜ù•.˜4¤%´JµûÍRzm€‡ºãééÆ]ÆÆfÐð×_ˆˆÐ<Ê!ŸÌ1¹æËš5kŒcßxãÖ­[“È«\¹ò£>ÊO&ã®eË–éÁÌ™33Fµk|u½òÊ+5jÔ –L™2qóøãèº!Öò«|Ã3îݳò̽¡¦ŠõUê¬52((¡aU“¸Kƒy Ýýj¡1çwrúMLã[*²Æ«a4É4€‹ØçjsmÃ=ßÏ%è‘¡—[‰WKܺ…ýªéénçÎîË’-Ù"Ü™+·¹% -÷Vhx0Ãÿ0cÆ YÌ^²d rôèÑäg€›5kÆÔÚ´i“„&ƒÏj7þæ›oHɘœ Ǩ%ÑÑÑLÚ… ’øã?¶jÕ RjÕ67‹ð~¥ Ê q̳6glJüíBwßõ«0†Ò¦MÛ©S'Ýë)•/Ô1Y <¨-º‘âÖìø•†¹ekRIJŸÆôÐ\÷Òj/E4™«W¯^­Z5uÁo~Zð›nL ¨›~“S¤09¢Ì/¼ðBfÍš%âHÆ©®ëê‚VÇ-=Ýh!^‘E@Yß~û-Óï±qì³Ï>ËèÒ¥‹¨7nÜ8pqñâÅfpÀ)R䡇¢ÀÏ>û¬V­Z(…ʯŸyæŠíÝ»·rèС|½ñÆ•Ç=Ç•ÚÍMÂWÔA¦ºÃ¯ÆØbW›¤K.‹uÝSN£_Ì_Uj*TÉ~¨At.¹1ô,Q~Ê'_©‹¾ºg®Å„ä$µê¢=0ÛTíá2™sVù£<î‰@¯iÌ™òV9Ï´ØÄNVÝ•¾I¶'‰oÄ…pŒéz¤èÞíá+½D‰yóæå^œ÷å—_2-gΜɽ©ü¥J•¤³9ß¿D¡t+ÍÃ[o½•§|ðAUñÑG¡ÞFEEY{H/_¾|ñâÅÅOšuæppÏ(µ_†š1·zç–ézœÍÃ`ýuóÐÛ¹sg?®âMo·’îöÊH»ƒD7˺ÍHd&¯;<„z/…×)xc,LQ¬w’­¦<Ò R¬æ®4 Kfk3sýúõ âäÉ“­@ÃE?&ã¯î.C[†ÏR •¸W2NDÐ3ÜtíÚêAC¹ï`˜Â… cÀñO‰@;æ…œo”æ=üðÃ|Ë}þùçøE°k™P¹sçF•tûÀ©(EŠ?ýô“ÆZÍ ³ßìÀgc-4wœ1ŒÛ/G7ý|ìzЭÃáI:µÕ_n¬v"ˆHäÇ<¿ýö›Û_¢*ÜÍpOF7ÍÝSF® òt[ºΓš¤²áÔÁ§Q’·ü>ä”êÎF9n &¯ˆ#0†ÿ},X²E8hm ÄŒ2yíæ3I[ > çœ9s˜–«V­2ÖGIdR‰«B=ta ¡“2Šßÿ=ÄÅÅ –Œ/5U,*'ù%|MžÞrË-<øúë¯kzè'åw›~“M PN1´{^Ù½ŒK•öûï¿«ñ|i‚úé.ß-ßÉàg©À f¦î™R¬á.å›ÿ„§ ÛÔ$‘ÅæH!ÑFæ‹°T >ª†º©6HG•Üú#Ô°Z¤&‹tr¹½@F+\jÜÕ«W«›ÿñúuêj¸1©ê–Ý~ÒJŽÖ"»øáx{ðàÁbH·råJÓùÔ#Š"¾—D¼&|åÙ’%KV¬XQÍUÚˆ#È£G-ZÄýÛo¿-¶¾nذDLmøa ~T•ï6CCH—p‹Úü‡È䂌¸éׯ_Μ9mjØSªB|.Tpk«LÃõˆlMÎj*¸×ÆüØOÊ«[Ui~ ®Äó_öˆÛ½omãÆOþ¸«0mR7[ÖŒ «Úo‚ÿ—S)Ù"œ qãSâ ;‰6T6NL<xØÉ &ƒ“0z|hHÀ³¸(mfâÏ,X°àwß}g ÝrÁ5 [±$?h7lØ0›´b_&°42üæ2O˜SBàÄ%¸$¨kú¨0]5cå 1Æò›$|eñ ]»vÊ J `Ì;AâY \?Ð:¥QÏVÂô,Í£@Ѳ·mnËÅÙF”€S«R¥JR'Ýf¥(ãÆQ£‰¨Ä³~Ö‰2˜äY$)ä°PÉtÿL™â.6YÞD©wæl€z&ÍÝ”‡ì|E·c‚Èç¦løö)ó+p#b²’Ú¦M¸Ï$Ü~ûíªE\Ä(Ü|óͤ¿ûî»Ì— °ÀOÆŠâº*Uª4lØÐ«ñ$£¬¶[D˜ºã–¼ZâÒ¤o[”Ь&=¢Í,i+]ËTaÆ_ÝB߯G´ßíTf7*œiAò«9$T©Ê'Ý–áíÆZ{!7î•iåÔ÷3å„•ß2¡´uß Aƒ14kÉE`ð…ôâžzõÕWÍŸÈW<}útîáC˜Ê|Œ6_Ü«bnR›ƒ'¦¥Œrº¸2Gh xâÞ²eËr£ås›èÄô‹hõW]fVRE`` _5#T#LŽ„íéA4¯½öš-«ïª«cÇŽ#7ÝtSúôé ¦TQ8S•ŸMš4aRC œ.]ºx€tصnݺ¬;RìMH‰f#ºã þ¿1¸8™¨ˆò5Oñ^PÂYåé Ë—/ÏŸ??™iÂîPå¨j¶Që)‡UU”’'žxÂå6jÿU;/.s²E8È!Ý!iÚ´)"µ1¾Âv÷Þ{ïwÜa@"¿¶ìEt¥òˆšï¿ÿ>C:2<†OÒn¯U«Vå‘ÊscÆ2 åÉd ±`ÓŸ6Ìz`Æ¢~ÚÈ©^ }¢Q˜HM|e´$66V`ŒFLá0–¬:íYŠxä‘GÈÌüdÕélÀÌšÿ”)SÈF«ÈÖ³gOUtÛm·Qí4óËòÊPîYf “<`>S…Ö6¨A@~ ‚{ˆ%JÕZ³dmŒÎRÎ^òÆXÆL23—(ŸüÒ75mÑ † fÍš&7¡ ¢ ¥Á’LD4ФîÝ»‹Èà4 ¨«R$¿’2iÒ$¾nܸ‘YJx÷”ùá‡R`dd¤Hç6ŽmÈ’ý{-<<œ± V¯Á -±`VF™J1BÞ1.J‡ë©©S§2Ì1í'Ÿ|âö}É\#z <à «Ì×­¹ÀH………‘‡øíLžOÖ¼i-™ßyçóÓÐ )µîÔ3SfÐ~Xä+ùÑ).˜QŽà¦FùêÔ©CL/ /¾BŒ0³˜_ÜKÁ•*€ §%©E ôSLùI "@ ³Rc £‚¯X±~^»v-AåUÛ$X¡4J’îçÆ¸pæÄqYÔS¶ßœKþP&7tÎ!”ª`Ž‹G{¸Œ&ÛxzKðÝÒ¥K¥!iÄ/Îasá}ñË™œNsT€ô/¿ü² ÂüRäM_“;ÚHpÃ"z=\ã*§™ç¬I2o¥yÁ^æ‰æ¼!@¸O?ý”BÄ‹jƒ1²/5ƒÖÚú†•y~2c” lá(KôtêÍ7ßdZ z™D{RÁÓü$ùn’ h& ê!?]èkÈ 7Û! ‚ì!À$i]-QHW;! Ö0ݤwÜ¿÷Þ{˜;+&#¿Âç^&¶(PU¤¤\‹î!ÐSÂQQ‰ 4Ïž=Ó±ŒPž!©Ç4CJJ–qmݺUá|úUíGdÐGì<Æ yG_0 $˜¨š3ùG¿a–’S«;Ê ’¯ŸK]f,äEDÄkèÝ ¢¨¡ "«ˆÌzʆ†Pˆ“”0# œ@~„&tææƒ>pã¥t%:ás ÈÜh*Ÿ<((çB8˜®Àl!àÎ;ï$3|K×T)*¬á4AÎØaˈ3™†¶«D³@œ@_`cõB] cÈ6räHê#™¤BMÒj¯¢d®ÐÓ&)Þæ¿ÒeÊç)/ÕA>au«QõNœ8‘u[ÕFXn¨‹–èR:)Pk§ºƒ ȤÀ(4ÿð¹äóÑAfhGŠEÇ¥ÁAˆô€Œ`³»=IrŸlÎÔ¦¦½¹­Ee7³â;‚ d³aƒÏp¼ð8“DO¹½”VÌf&ÚCëŽ`TfÉÊuëÖ±D'eÍ·mO ŽAE—¹/Xc‚ÉÌôžiú±A98HAj£î¹%sCÐÕ£G<ÜùÜjŒH±`9èŽÅFiq&˜;‚ Ö¤dø¡€šFº5c-Ú‘û%T@^@:y)OšÌV •¼Ð¥Æ`R´î.#Èym¶«Iîe¾’Gã¨O23í1‚ù*ÁHÂËOÒQ“"ýs­T?±z'Ç#ƒX¡×HRPJøŠVäþÕ ÙÝòdoÊV&¾ä¤0W¡(`†86týúõuDœi$Üð,&‚eÓ\@v#a'FPÀ“S…dº"DØ6*d¥%xÿàOq‘FS~¼â»ïŠb^ÈMââ…±qM“ßR8î³ 1;ðÒ¦\JÉê[š“‚@z™Ø kAÑà„”4¡/4àî»ïæW¼Üç4U»Ýu·ô‘ Ú vò‰ÒÀ Q 5‡Í<¢µª(B¢‘_mf]PÄ1{‹¯@òÅž¥v‚Ül °z1¯Á]7„ó4„°øO˜ÐMÒSr“ŸHÑ:{<vè4• ÿ} ³‘1Éoàyd:,GKäü—…-î²æÉ[¨E#qˆÚâ^Ã]A9rcŒ¡‘È{)sŸÕk=+`¬A> iCâ dN©vñŒj‡Îi‡hú¸/&V ÊíLSÝD‡£djämWwó§ZE6xÃÜ'Zݰ‹ÆËôDÈ=jÖ'õÒTéODÐȆ5(ÍR¼ãAÐ _¡¸ÅûòUb‘I…kEº’Xͦ(ã‡~gƒ­2aAÖÏÏ3k¯W¯^:šü†šJ–I¡X<~¨`HO+™tD3—yJ•SUpÃOÌL;gØŽi£-q+þ´„F¢ˆ‘`S¶ˆŠR¡™`Ìa±>¦™M ª z F åW€ ©$*i †%h‚*j>Fº£}NLWr")˜ö,3.Á?~%ÞR-Ñ´D¬ÀÜ1&nÉž3ϘõBó‘JØ 5ª§¸• ‰Ä‡ýôÓ¢*r<‚ ·îi7#ؽ‡Éf&cê^Q`ÚãÉ”“„ ¤´ÑD'@&bCKµDÓóœÙÇ4ÏS]´Ò‚¹D«³Ü‹U.î´kƵ{c”‡>H1$¾ÆŽ ñUa;5á ÖêÄM¯A ô´#u´4Àä"ƒy/`?\&°"Õ±,Ä:+Ú§›z¨ª j–ñÌ3×LлźÚÓ"»‰›Ð\cáK3X£å«"9奤 4žéÀd×Ìe9ç*0‹L|¥I¬„ÉKãeꩃ 7³€¥5Íe|˜üÊWîé/-$™{A¯è\.ZEgñ–ó”O¡nOUÊI\d ¿bo\€%ÁØHcN1¹› ŸûxL[5”."š¨"=~.ùCk¥b|Ãê/;¦”€ZLc˜Œ¬#*Â<ɯd‹pš3[ŒŽˆ+öb¸Ñ,eø%f‘{Ž™¨5ã†QDuÕ–).V•5[ÄXÊÈéà2€¦r¯ó“ÛL!²? ¤‡ÂššHfš¥^•‰å‡G¦¨^´B; šÇ™Qæ ýÈ[ à+’-L¥:Ú¬©ÈSÌaƒpÀy¢E2üæX™bYšÀôfr"†˜Š éŠ|A¦§àOp´S|,À`-Úœ"2 Â+â`5’A—ò®9&Iʧ&Dðsê¢[¸aFScš´3ש‚©¥Æð¸”œEÍÐÖM­dŒNÑHÌùÐ=å¶B@8` ëפ$Ÿ½ÿYÌck R3¦’ÚT ^ˆ>Æ]¦Áð¸,$¸†áqÄ7¼ ˜ÛMåÀ`Ta;å@vç‘"…Ί„…9i®±%ƒ¨vºUFîaâJÄ~|¢¡ÊÐäb ³ƒ%@}¥"|øÒØäÛg}]Aºph"€[Ú3Cùš¿&LÀ)¢–cßÈ«¡ð$ƒf1쇎K¢ŒyÇÄä0•_Ý!Çz;y$¸áN¦ãÚG÷Á•ú«À]¤p¹êâa+Írr}pººå‰~=ü2 =s™– =S¦ ü uG.(@§®†ù’l*»M1` €Û£(†0ÏÆ^ξJ»§¤°\an^×õϪ@ÍO>uf¦´ŠíT‹[ù¢ñnya‘în*én“E?Á²òƨmV—вCÔA7;šL‡P–®lT¡ýÎP°lÿIxwÕËï®×”V÷Ò ›,©ÛÂOö«ºlI7ÅÜÕiä°2⻇Æí7v÷ñº5ãDc`£é‚Æišq6mŽ éc3t+ÄÔ˜ÇfÛƒ-{Å]ˆ•f%È¿ªÚÝÏÒ0ØCùݬ®Ý0é†~UKT%›Ü°Õ ݨRe–[Å*òstóÕ䌞¥LkªÁî9bÚ˜{T]FÛ[±ÜØ Õn“‘¯’4ÕO”Kþœ9:6gi¤Ú&5Ý=io’3Â%-e½Ú= xð(àQ i)à!\ÒÒ߫ݣ€G®<„»R”õÊõ(àQÀ£€G¤¥€‡pIK¯v< x¸RðîJQÖ+×£€G’–Â%-ý½Ú= xð(àQàJQÀC¸+EY¯\< xHZ x—´ô÷j÷(àQÀ£€G+Eá®e½r= xð(àQ i)à!\ÒÒ߫ݣ€G®<„»R”õÊõ(àQÀ£€G¤¥€‡pIK¯v< x¸RðîJQÖ+×£€G’–Â%-ý½Ú= xð(àQàJQÀC¸+EY¯\< xHZ x—´ô÷j÷(àQÀ£€G+E¤D8½oÐ^÷Ç»õì ¢¤ó~?½sR/ÓÓëþìÒkEõU/ôS6{'¡~ÕûúìÞzC¼žr¿«Ðýö?•C«ì]…*ß^nܸ9r¼õÖ[ö,ʲўj™5k–ŸÁjj[w¾Œ¤ðŠò( Àù;wît3ç™”Û?ݳ€Yo‚âj£'ýB¼ØôanšBiº¸ îòúŠ®6:\Þö$ÂÑ d¢Œ0$uáÂ…k×®ÍÃŒq•*UŠ-*H3D‘IˆO•*U¡B…¸Ÿ9s&÷ˆ]÷À#Ç3gÎ,JQ¦á¼î†ÌªU«,X TNXJÎ@¡EŸ>}(Ùðà<ÞHY™—w`èµ[!…EŠI‘"MJ—.]ÅŠ©Î4;Aó!kÖ¬ÀMçòäÉ£ÎÚ oÙ²%oܸ‘wáº7C¹wïÞd{ôÑG)Ç­dgµÒÔò3ý[žyá„M2„3ÜÂàà>{öì•*UŠ0Ø•+Wƌнœf„Á£ü°ÁÊ7Ï?ÿ¼u˜œHXÉw=.ŠQ„^J´µ"!“|¡4C Dá¡®]»"Ê?øà®ÇK”(A"ûÞeG8U*ÈÒ€^)S¦¤v.šA eøÚàs6cÆŒ¤™{û‰Ç¡Lß¾}yöÛo¿5rQ¾$‚¼»çræ@Cy;¡íôéÓ)$,,Ì&ÀF{@_jaÝó…ó¢—Ó£À…P@*”8ö¬óNSÃ])Ê©§~ùåûõ*A8f“QË"ŠH°Zk%Ü.„D^£@’!œt *7Y²dá$CùÄ æ¹Q¢ §`ÅŠãkhh(÷æ›orò™ùŽçfù?ÝKMü*ÐâBûs/Sk2´mÛDÁYG“ly³’QÝn!Ðe\„S«Ô f¡×B/¿K½=q«BZÂM† ”Ó‚tÚ·o8½óÎ;JwÏ"5ž.÷Š=5$Sø')dÍš5¢˜>5j$àw{„Îlª—âQà)£‚^p¸Ú×TbéAƒáÉxã7PUug!%ØÌºÄ&]–ÇÏj–‘X¿~ýR¥J½öÚkîZüÂÄ.K’k!I†pnÉ k‚%Mš4¥äFÀ#—&Mn>üðC’HO,*–òçÏO"‚ž”ŋˠ §M›¦’&C®\¹úõëǯ¥µ´;2I©U«Ö»ï¾K ¶ bº1[êÖ­ 6€"¬Ì‘jÊK9cÆ >)íî»ï9r$– GkyÊtB¸ËkÆ3~Z… g n×® Ób$?q1ÛY}”{V7’¦ÏvëÖ ¯ì€h?$¥øõ“O>É™3':Ÿ””V­ZÉx¥ƒS§NÅäk¯^½øŒŒŒŒ…À?‹P#88_1?1:2¹’ë„ñúu5PF…ýບ5k.\¸Ðš$œ‡?ôÐCvšZwW”Š£&9ßÚ*»­ŽwéÒmõÕW_uGØ] Cp­´!)ÎqJÁ¯¬0 ´„LHjPÇeÄðþŽŽŽV:‰ÈY·#óE?iŒ=ú‘GAþÊËÇ'& xÀ¯èzØ©S'Ò…ªîã?fÕʼ‚¤Ð’o¼ÑZ‚åF ËŽp´Ê ™R4DQ“ðâ r´6 ˜‰2dP˜\ܘA†%P”~ÀÅbk@£ˆÏ³PÀk֬Ϣ,X°@9Ej ‹‹ã^#E:h‡ßèÕ!f·{eîZ™^;¯ B¬‹-µ÷j%BŒg.³ÞÜK~Uœ€ávèûI‹p£FB›”ÞÉÜW³;wîL¥£[×’¶× «¨I‰p'øx?LøJž"4_|ñEnð€1Þëׯó´8ÇO°5jëpdxï½÷>ûì3q<ÏÞyçB©W^yåý÷ßç†õ§=zpÃêcŠqà 7 ëÈk —£ ^½zü  æÎ ÐbØaåð+ÐB¢-b_ÑÁv#(´‚û…"\DªGÌmHG ‰  @O"wHdC1²C(ÌH„›‘É“7o^hÈtâ׎;òìœ9s ÃÀ;tè@"§³Ðç™gžá×)S¦ˆQQQÜ ;“ˆ@u¯¿þzõêÕi›íL8s=ÿŠÊ+üº¢€–“Q¿øð*+î7ß|³(`>vÓm“Rx¤|ùòø´èn|-T+ƒte·¿Ýv”úÅvé«V$ÍÜZ©Ÿ†lnåO‹ î 5¦³ ü6'$å37i-âˆòÕBk˜jÔ¢­Ö‹îí¼¢€zjF…Šº"V’ á4ØÚÈ ))Š3¥K—&–ò±Çƒ•‘ËŒå÷߯Å9‚ãñj‘‰¸vxâË/¿ÉÅ’þ÷ÝwgW‘Ò´iÓI“&qÃdàS9#""¨‚{*•»ò›o¾á‘Ö­[ó+Ëo@x  yÌa! ã×ÿ€3l¦ÑwÑŠžÒH›Bø iÉSO=¹è,îGØšúNfu“ù¹Æ®²>A:ѪÀ6.G~’ÉËD¢¿xxÚ´ióè D·2.?ü0ùQ €L’ f"¥‘8yòdù裠èHȉ-mj¦y—GËKäûý÷ß ïQòðáÃa]t,…ÚKúËÍþé§Ÿ2—ádXš¯p2JNM.@NaSð?"Ya–¡·‚8x(SåÃùL ¼ h‡dæBAœ7os“ºÐÎåP¡Uk×®E 1Pø“\­Z5æã®»îâ)R˜wLÚ‰^Ί‰Ü!K—.5 rI-à”";dÈ²Ñ @"‡êÔ©ƒ;‡MA„/0q½"ÜXhxöÙgêWLL v!Ú-÷¬É4`»NöØ%ÂAh[Ê‚Ö0M54wä¯$5‚[ìƒò)–B“mâĉ$²VG¢˜[±|ü*#oëÖ­p\‚ñÁS°…[q#l3‘Až:Rô §Ú<¡@ÚF"ϲêKÛO}ygÁ¬4O¼H½4Ry€y&˜<–¢ „êÇöcqÒqóf#Y'çË/¿Ì$$ú‘ÉÏ#ÕAA=Ô…y§€”uëÖic—*¢dq̘1 Ú’%KÐ¥7|õÕW~‹ô¹úw×^éóÊ¿BÐ grõïßßôįÌ\f+Kérñ‰uùdEÙ²eÜcÌ-shõ¬%ÖžÍM$¨É.9íõ•G´µ´{÷î|Z”Ä¢rœ [¤L3„Š(Õñ -aêI˜(<›O©˜<òÀõè þùcåܺçž{Z´hA!‚..n^zé¥Õ«WsÏ”µ(þõ×_ÓMˆ@iÀ­ÊÔ–-C^¡1ºªŠMJ„¡EYQÜH8"1e‚`Ià?œð˜Lj¨…3Ðe`D~EÚ’òöÛosïö¶[¬<ª £Ž¹C†[o½FD*S¦ ~r bÉýH]Í›7‡5áH–£h⻤\¹r4  dûüà~§3@(-Išð£…bq´N…œ‡6“‡…FUYÈ€J ÇË*E‡@{…ÑXÉŒÒÊôÀÂâ6_¡‚KjCd¹vÑ W®\É º$µHUD.à´dšÉ€ó½®ªžüƒ“®ÓJ3Ð…~†ƒGòZÎF"ªÈðùçŸ3ñ™ò„Gñ³^ʼʯLy~‚Ï¥9L îDÁ?þˆÇl]´$ÁO 4àA¼ˆ|]¾|9÷ƒf-ƒrX =˜É‚懧ýÁd6‘7`˜’-ZÄ”$hŽºnºé&~ÀT>$ !xÓ Ò}à.²ý”œ±4xĈÌq&/Ù ò娸Á°êX!…lÈRº€(Ðê ¨;:ý:™§I†p¦AH)sÇ%ڜԺŽìK´ú3uÆ[BîµÕß-¯¹GdŸu½G9݈Yc_íHSU„@YqèD+ÍîÉ'Ÿ´cOi ØH'²†©„+zùmB?œý>§cOܦ­EOù%Z7Í®²]ön=N¤Æ!B–3' û%GŒæ ‚ÕEº¾ª:/–òŠrÅu^8(×`ðà*‡÷Îi‚Šôgþ²áU^JМP$+d–ÜV¬X¡Æ=ËÕ¢0D{ á†ÙÇ ì3€„…pòà~$!*H Œ'íÕuÀNš„` $êÂ-)thi3s %’`.9KZEÁÜ{ï½”`gPÈ¥¤íL\˜qµyóæ† R2Q Ñv„ð°¤BrXê£I¤Súuy·ð^l™dç'‰W¥0~’Å’’nECTìq ’™~f–(´©a7g£6ǨR?»Í¯ ÿ™ÿÍ Hî6[ºÁš«–®ŽÈ«bÝ@ršIç&”v‘»¬ ´ÜÆ«á–B„,X™ò¥PÂezuN$¯UÿÄc¶Œä'Il{€_{`Z·#ÄÕ¸ZSC³À­[¨—ñ¹[&˜úkÓGùn¿ˆ»dµJzªîmí:Ð\v«ªzD³Ìo¦kj[guè¼­·‘Ù½  2­ïÿ™4ûÏxãÌŠ’ áà·5Ÿ‰'ldž~µq5†6Ž” b帇Y"[½uËewÿÝ2]†ˆ·XMBÜÐWåsè«8F÷—]lEMí1r¹oü¬XSÌuy.zš' 3cÑÝ/÷,éÜ€gvg;ó=s<¥ö_^ÃîÌY*µ×¯Í4ÒR¤´Z³Ý„<~npë¬:.AyŒ¤*𨳢ž¾úõWÕéÓÔ½ŸÈ6A¦ÒÎ7{÷×'4ñÅŠZ€àF‘¢,.¸O“¿>éc½N2„S ˜Ì&-³Òô+3ß-29M~“Î&Y$ÈüöBZŒU§D’|îöÚ3bßq|.hä°ýÝ6…ß~ûí80q#¨UÈ;óÑÉ6ºì’È´-œ¨~0&ä£^ë/}7MÃÔO×3éGO¾ŠÄU31ð‡˜–D"²ðưH®(MuÜn  ™iƒºxœ ý µý¼f_F%À ÆfÐ[S©ÚîÍ~5Õ¢ ð ¶Úi†©—rÄ«*ÐÏ.h·`ÑA%˜B­-ÖI]p¡ sñ•Z¼—íÙôônü( i(V„«qQâ% FÙL÷òól]WdL2„3óHÃcšiïw.8)&4Ýo$¬1Gœ‰W³ÊÝr–0w¤0»âLÜó §YʵM±~±—´ÁGij[“œœëA-& %°”í\‹‚ÍL&­Á :3FÔ$ !· 8ÉñsÑÓšì§w© Ù*úãÙ'‘Ã9­ªÝí7ÖÌaEE/wN†U«#jƒèàŽ¹hÊèAóó0 hÜîVJ##ŒMñô‘JÕ6BÉi±vV¾é@x’)A#Å Æ79‡ fl/Z¹W/‘\ÞãÉŒöª·ÇË}uVâK>°dÖý ïN’!sXžC.BZ%S´oCžCf;VØØAœ«ÎeF„q:}Ó{sØÞÈÉR:Y‡ýœ#…°@e&ú–™Ù˜‚Ý&!‚Å\#jG;å;‚38 Ž{ WÀpé¤ 'Q§RøKÐ<â^6éÅ1œo™æ¿p¢_HN Ñ)vtÓú°MG‡¹àk…z¬)ÒSG®–ëõÄFsO016 Ÿç¢'ñÖ2eà P3ˆüXcœ˜§ã` 8y8 ™3 ?§EP)Åò,tÓæð°¢t|3}é@#Ž†Ñæ93G./ÂQ²¢·i ì9ÔÂ~©áŸ3ׯüŒ0[˜D2[ÍÔ·†¤!“CXÈGùÚIÂ=;®h¼g.òÀœx`'a$?¹cRT ?i_0sd†U¦‚Ü+Â6^žë‡î$¸ÑŒ˜{óE]?9kO“ áx'³µmZ ˆK½çŒtä8ö–ÎÑ@Ðó•M*È ŽÞ!'‡¿!mq£i«‡½^‡¶„OzA /„SŸrEéb÷ ûHÀW^~ÆW°D r:\Ž’9û€óudöéÈD6O‘¤Ùt ŸÚ#7×™ñRx‹ ªô`Óy zÑ]DÇ·|Õt,"1#~úé'úES‰¬Ñ;ÊÏEOhk12¼1ÇJI)MaØñ†;šO¤fÁ‰cmõºŸTͱÎGk;*{}ظ#9nëd—B÷³r{r\“l8P†a Ù¥¤Ã!ÔƒÚÎÏiF2ÁÁlœ‡Ld 3ú ùem<§"Šâ}K¯Ž%”¦’ÙÎw™k¼iEѹõh˜ÅtKf| M¡«A%ëM"Gc”ùʹ½Ð=O`zÔ£IlL#Õåë9Ràr1L2+VGós ä܆3# ’þgw’ áh™ÞhŠÜa`…HO6ùs\$0ÃI3ÌvÄ^Ô‚8F ͱ`½ƒ¢Yuˆ*äâX»ý1-¬N7€(¢„sqH?üðCêT)råÌ>gv¯£™Ø„óxÒ¼ðÂKä$Ö–œÑ±1µêÔN™:gu“¨#ãh*§½q£ÍžÚk‰ÓXê2FRpáhs|ƒœ7FEXN¸%9O".Í$b*É æ!d=è}´w•sÇÏEO·E…?º8©ÒA£ã'ñòñ’ž÷ß{‡Ï.]:%Ì™" >>_o»íÙgsçÏ#qöÜ9L!Þ½G]ø3õæIŦ"µ¹‡8îe'·Öù?Yó”p·ÿF_ä‘ü9ÃzÑüï¿÷êß; U@ŠT)ccãå$ëÍ öÒAT(öÀ c  2À`:lWH ÿ°{WgàêY~E½à $¾êôw(ÔYû¡¿¢r¸ìð'P)m@rñ8þ©^©P\P¡H´ø1”PÏ‹¥< «(èB>/Ï®µln³÷üb‚_v¯ÉµF$§½I†pD š,¾5I%;ÛãDA è…¸kž{î9Ä„N“ÃQ)Ï¥W›ò ‡~¨b ‰G`[ù@ð‘¡_ÿGN$þ¸qS¶ŒéòeÏ8NTêt¡Óê5nœ6]ægŸy‰93iÂdd÷ÌØ˜: ¤LõÂK/R*?µ€B8{3*mqm©é"üÝ€¢_l½±ç÷€:œ`=¥jYQ¼€C§C@-òIc ÝÇzØDœsÑÓj¡v&džÀÊ9|䨡c'4 Ä[÷Ù©S4o¸pùb:7âÜ~ë]ÓgjÙºU¼{)æÍ?|ôˆÞH‰ª et„Ä=¯ÚÑ4;kxÅÿœ0H0–¿|oÁ¢Ù¸§¸S»NžøóÏí'N<üão›«×æ4NcZõCí<¤3vaÚ #ž3p‡Ê L…þ«Óåñ¬"/Ø‚m˜ eðáž…€ ¯/¼Ú.¢£Q¿¤Ðð,N]º¬£Ã¡'ŠEÉéyÓ4!"Äi¼$‚p:¨žA¤N‹gÔêÍH„h0’N)¤¡üOÂþ÷ÜÎj‹,õÔ­.‹[,jLôä“GNÑ8ýwxÿcGŽòõèá#‰ÇO?zÌ~ÒÍÉãÿlOT±*Y «Ö$³„dÑeCzhFk %L¬mî­Ÿê‘Zh¸¢erìo‹ÒRO­:[BÓzJ0â'LÜ[]Õ7€Ñk˜éÙo¬ÝÆî1yÜн;\ν¬®–_„|ûï9ͯÆ$C8Ú ~þùçñe!D8( ª±yLl®B$…N áHxÓ÷ .Ab¬è<Ž«J¿Â%z™?ùI%±•)3g¸¥É’9n¬ðI£§‡MH•&`Þ’!Z¤É™-ª€4™ÒfÌž#×¼E #cbâ —Öº@8$‚9¨&YÞ¥¼M‹7Æs0.ppb)êSøryå)=nX±5½Ó Ç!‘ø’Ä28ƒœÒô8TÏCO˜^Q œÑ' Ì‘Ç9œ3uÇ–Í?|ãEŒŽ¾ý»¼úö멯ošérgË›* e·î=?ûêËiÒB,'Y?˜›€¢S[QËÔÖä÷Ûò?¹Ÿgè­ïL0Âù$"‡¿cGŽÝ»ûè]Mš×Þ¾gÇŸ‡w6Jæ«/Öb¹Ò¼•‹^~SÀ-·ÜBÛ`|‰4XÇéê([™‚‰ÀVdy †!o$‰¬ÚÚ;Ætð<Àt­;z7 %óLˆ^ÂWxu·90†ÝÆ¢/#’g±#±tÉîòît4 Ù°áŒB† rör‹d¸Œ¾ÿIó+—Á=G$O%1á Ú‚zbÁ_µT¬VaÎZûwï9yôØ‘c»þüK7'@»cÇù•û{ö:‰'Ní÷Т”é V „Uì`?k‰™Î4U˨jƒ"‰,JH¿ê'CPÝë7Ïdª/zÊ/Û _éŠÖ¶ÚÏ4Ë(Go!p»² DItÃ’ ·&© áºûX k’mÓ²¯{\¡’“ áØPŒÈ–݆ÜÊ(qÄnhÝk€}‹z4Â:’‹¦ Àh8±ü8 ñA9Àž ò‹à~ÍM$ð)Æz^ãÆMS¦H›* u¯ŽO]µlr=*f&!rzLê€4éÒìÝ?E@J"8¨`JH0&5"+ñ±Gi,Ÿð0HáärkÞ¹¬±óžæžz¤xÖ&H¿XGá?­'éE6·Ýva8d bP´H-mÊÙH9¬Éé@g¥§ûÝz—:ÄϛؖÔAÍ?ïýo?ÿ$]Ê€¶mšïÞ»kùŠ•yrÈš.Û°>CrgÍY¯N}ªX¶byöœ9 Œe‚Pè§Ób”ËšD:K Ggn㻆FÔ!~ùñÿm8RŽî?œxìDãZ5ß_ª€\ùs§ Hݨj½};÷êe~à+J€YÛä"Ÿ³t ;Z Î H¸´¼Š‘ó(Å`; ;%R³…hÓˆcÙ­,#›°ª—’ó|ÍE©’A2|¡ªÑÄAŠ1%m—ýűӅö¿Ï#ö>ÒÔ^ûBÇuŠž>n„’ïÿ¼Äf}ðaº4i;3‹}ÖÛßàÓXöÜi#ϱê|%XQÈn+ŠÆ0§1§^£Á z6Ü«G,ºXÜtSƒ)‹\4ÞN³L}7Ø |.MVŽûø.÷Ñ([0±oà“ž¢Ría…UT© ‹OÃ3ƒ^mÐäÓ´¶ J¶³‡7nd,X‰PÉL^)ÐÜ_‹î„$C8éÆF¦t@tS1,:ÈüŠ^¹¥ÝÏqOÔµ4#T3;ÌÂt"§4²ÃÃGì;”x"ñèAÚà;Ò‰±ïèñ½Ge(8iÒ }o'p3Ú˜Õn,(ß=.ðÞ¦´ò›§Â&߆_ºæ·Âìvƒ¸ßÎJßÏEO*bÆj½š{™¼G=µÌu<ñðÞý‰'!Ä)ú¾ç×]qŽùÐEBĵOŽ{9CL{å†ÂÍþà§‹sŒ#ä œ÷™q>/¥Ï[é¦ýG¹~=z¤Ë¥¤JÒ_¼ôí•[±ˆÄ¡Ù€mhB2˜ð¦ò+Á5Ü#€p6*?º‘Îp!Cxµ¢F0-8‡~C"æ²0 ű‰ ÐxÑG‚Q©‡º3‚nØ ‡#ÌÚñÍqºÜ£ (:üƒVx¡uD=æ/Žz휣=èO”Fð*NQøÙmÄ\ G]…Ùı | ÔYq„Œ¡]ÑG(Ì‚Í8sÜ9£}ÚØ€½þêkè¦];wq&é1[¸PíðÁC|•Ó„‰{9“§9ÅÈÍ:·[vÃzÕ°m{¥Í¶uD´UÛ •H!:|€{9a‰2H^¡J2îÜ(¶ÑZ“6š˜<«88y¬,´Ã™(—Úaâ>R@_U#9—Èô$”I,ªJÕ<ÒIÄÁF9nar-ÂÝI2„AÝj‘vÔÚÀ—Ø~8#±¼îXp?±{–2ÿÁÄ5쇬<‘x`ÿQLJq2qç_>ÁíØ 'œ›ƒÀ“¿þþý§üòîVéÞO¿¾ìê¶àO±^·?Dmа¾–¢™`SË=댞zÐÌG§FèÆí>*Œ‡>Ç9þÀÃ{ÝsÐ*@ŸCCGEHD1t&!ãhµ»Ñ—0ÿäElô!Ü GÑÀ9Á%>xã:t2q—xòHâþ¸§8ßß©Ÿ}YNo’˜³Ãú$žlæóUÚ10‡*@Z`CŸõã(÷Ñ” -ꨳnP× ŠÏm-ĆOŒd¡Þæï¢m²•’<¼”ê5+âš‹$ÅÍ ØìVgíDóŠæÎÒÚÉÄ/?ÿ"UŠ”AM›íõù$õ·ï>¾ÚjÜ)äûÿ–¹ÃzÍ“aΪ`C-TkÕ6ÝÛð™-¥ÁuZåRµ-Q[BÅ„nÇ QH¨5~OÙ‹-©‘{ñ÷TªMMnW¥±ú@#A8Ӄݘ*Xu÷ÔŒ< Ô”7¦²ådj„Úà=‹: Ç®«›ºŸMÚû$C80™iýâlñºËí%°˜ p€òKR Œ½"8Ayàäž_÷G¹ó>/†ÏöJ<êC8ž8äTAlÓ×ÄÇšÔâæ-RÜÞ‰‹TWT½ß³67„v•`HØiÔÆî碧仛’ކl{Á´Ä£Çúì;î#ÆaÀðÓ±“Gv‚€ŽàÓS¡ÏîÝÎj3“Y­‚2V²M~‘è_Qæx≉Çàu!œÏ™ëSSœ<áƒ6ÆÑiŸÇ@8ØÖáý–âϬZmó£$öëp\Z_$œ’°É)ñ˜¤ƒžµAwœ9 Ü5ªUH YîÑÜÏ<²D>¥E¥k"3äµ ©}Öf›S‡_ÅùHuJ_9qá2¤KߥSgaÛÁý6mB¸Ý;wÉŒ³é£’5Ë4”¦á™S„us™šäö£˜ËÎtÉøMnySìüæ—0’w–âš6~8“tY¿’™2Y‡b„Žk •µE8d œ´ÖÇ*ÙÖóÔ;ã.37mÚ¤œ¢ ¢d\—fv“èº&øÍ™dg/IÁ'ëFÖ,÷âç™á ²f`™8nýÚÔ+÷bé?:5¸u4ñàî£Hw8ñçc‰;}ŸÉ‚nxâèc>Q.‡Ø $üᣧŽp7Ã-ƒ.‹<’ äÒªƒÙmbJQÃ$£ÝÚ½ŸÁø<ôt‰A´SRÞgÃØumùïÄÄ­‡q¯@ŸC{ö9ô9æ³í€ ïD"”>PIsCsÛ¼"~Z­ZòoTÃjÛ„s|§Çö ©`ÛÖý‰ëwg@Oì¡M>eå´S¥ô”ºuCb~•µ¸~‚s—¤K.J»LfÉ‘àðÎi@rKºFŸ~K8~zŒ9ÁÉ3ßÝž¢kK¸øµV½#.ŒmXÆ8{µë†Ý;Äñ²|‹åt!ÞʳÙTRX„pÞbL“N<³6oh§`©·€²tÍ‹F­RÆWkÕ¼˜”1R$‘Þ©­7±±GûFàU‘ø‰Dà}é¯bô˧ÉÅÒ)2úRn#Æ…’Z’çD¦'Û"q?%@™”lÊ <€×š¢(56¢^”Šs[/º#eìo¾ùŸ_YéçWb‘p•ã§µtÿ¹vOâ?Ô³Ü똂žtöNW¹ßuD- ÀéM“ä{×$ÈE:´b ,O±Ì¯¶c˜ž¢Þ©b 4 uüQ`òè'ªc‡ æAd°ž‰ì%b‹­\rÑ_0^uA§žzJéŠ)Ó–c*ô mÇ‚ò¬/ò,¨LºÃWÅ MROÕ`¸_¨a{C)ä¢E\2a’!\ÒôÙçD$q2±Fð¬6Ñ«ç?ñö'ë·| aíüÉýæÈQ¬—޵rý\£> }ÞÛŸXú‚æ3–ÏzèÕ7?û6éèƒ#Ôç=½zêC8°ö°ãOML$Ø£Aø¢¦³WM~ð©‡^˵wýŒÙ5ÓS€Džilø!îʃ·¹ì|ÅF*‚¡ý‹ì)Bþ‚pÚkˆ·ÈÆæB ×ûè±QtÎ1Äc#» â“@YD6ÇÍ`óaî ôIˆ°å“xN !4š@ —%cÏa«)¼Pà!µ ˆ¥|Z"ê+Ι`fšðˆ-”ðëO<Á¯¼Ú†ò9 °…ò9ÆAh$$–eÆñ€4-'N]öþêds²±±‡ ´J9uÆ…¬1~Eo Q‡`¼Ò;‰±óø ø;i'

    bi™IskŠºñ¡göÙp‰DFd0:%‘-0ÓE9@‚Œ*©*\Ó ™Î> ×~GvÙ-x#¹PÉ£øx€DªÖQvÚ`Šp'¼1X XÊçÉ6'\ÙdÓþ€DÐZ ‡ƒZÇ–Q¤ÐqDÀ>ñÇ á+¥%ì¡¢ s$b¿’€[í€ÝFí<ŽíH§I£:ƒIä®™|÷ÝwsPé¸|ùĤãSxÆJžvË“:ß•ºDdZBkuþ€¨ª ðêä®ó´êúC¸Ä¸¨‡>ùZþ™7”_]lÀôg>ú %§ýÎßéØôS‡0õý¸æÆø_5OžÉ÷< }Š†Þ·ûä_ÿ$éèã ‘$žD±-§ŽeÀ}¸~pN.Û°'gز¬ÓçŽ »çνŽWÓ»®^ `ÃvPBç^\¤3‰´›QÎJ’l8`I!?§¶¦JÙ¾c‡ ä(†n=º?üè#ÜtïÙÃç9¹gß^Çßp‚H²S!–”I¸&c&RV'!€ òd¨xÿ¸Ñ¤\!ð€÷’D ˆ6€OÜ ‡äpVÄÛ ´ÍQ;±Æ°Ö¤Ýk ˜h*_Ý$ƒŽ&°cuuô¶JÓÉ®\Ø”:hÞíŒe·®6¿²Z†Ñ žgñˆêt\÷[GðÖb·Q,tà'zGch<=’%ʱY`gÅéâ†eEw ÃÕË[çhÙu‡p,íÀµß–jê’ü·Õ¿qË!-)í9¸çÂù"MpZr¢ã¯/™Éº#ô©/ xIÖðÛÅß:štô9pŒÊqgh|·‹?|—D—TŽº=`üŠLQ·›÷‘Bκ©w]¥pÎÜòEÖØî7 ¨6´D'Ô§XÉ.A:;gǤJ9pð ̬4NFµû]{vÛý‘cG}Üâ\ò.j—¡PÊöÕðÕog˜ÝU+È‚rNmËóáº7}Ó`UÄZEÒ*ê[µ“¨NQšm¤s›zrÞºC¢ÎK ¥ñû‰§¸ „Ô0wH³;@]MÒ@¨©j­uïWÇÍ~õ;zâ*å³ÿ߬ëá^X¿1wÄ’´sîO=åÖþ÷|ÂÁºÇÿ>âüù¶^c謅ã¢Üw½!'ˆ½øýOYCçDßž&ø¶6Ë^üÕ§³&}@8&ª³‘‘Ý >„cx±¿1»7žH¬qgöé÷e˜vkù˜5Ȇ#'ÿj×Äô»~é>%ÎV³üÎñÛxƒÌN0#‘êU·)B§… ÆþÞµÓ Ž>ÈÍSŸoÜìÞ»£Ld´íǰðc£¼Iå–ì,­)Æ^4Ê=È'XضÓÉÙ:—CÏ…HÉzPÜ¡Ñ?>A(¦ˆ_©TÁ'醈n+Í]¯cq=ªËNÐ=+ËQ ÍPÕԹ܇ˆ’~í:*¯?„;y<êö{ÒN™vîÃoMød¿£.:š×ßq'®Äg68žOtˆ×ëˆ;yâØìûɾ(Íœ‡2L»/ô•N¤|’ÑçÂ1IYZѶ…Swâè£m(9aUÎÐÒOº¹ýšçwò+û;Lo¿~ÐãÚé©Þ¨Ý&Ùm£…ƒŸ +ÓŠÌ„NØ+Z´jé³çÙ+rÄ·sõ¤¾êoÿáCû$pL_ݼàÆY-î &Á$¢è™ûñyÄ 5Ãcúb÷²Ø*@_­4ò¸7_ >UÅš`¯™”ÁtævéÌ8³ ~{uxöL «ãzÜâZi°»§VŽíËT#9ëäÚa´Zš ÎÙÿk¾TÎXåHC4¤3'ý8¯#ѱÍú-XzÚ¼TsîÌ2eÕGœ”“ÎT{8Ê!Œ/¬Âùc·±ƒu×:Â"Žï.çʈ8>´8ý'BùÌ׋oJ±( æ¦ìS×<°UÖ,>+H·ê}ú^-¤^ßÚ(+p>η£›ã*ö063ï{!ÏØåÙ§Ý[0ôÎÈ×1xG"®¯Ø×kEèØvl2Ô,*[ÜòëRÞ`ÀAßyûdN‘+oé3ï¾GÞú~\zðØß²9ç7p Žs´Ã?Û´ÍrpÈ!Ê%ÍÍSƒ@íî7rh¥å±àI÷Î?uÇ}ä•~ílƒ¯ÓÞÓ&Ÿuk… „OîsÂÜNµYg•QŽó“s‹{EßxrÏq^ÉàŠÀ9É9´§^Ú gé¾jnU‹µÜ}0µÂrj絎pˆ3!øþàºÄcûíM<ÆiO{íqÎUd‰’#ìf›³xSx\BʸũVŠ˜Ë~a‡»œ];?ß™§u?Ä«ïŒkø:M6IøˆÃŽhÂ6|…ðyø8§:Òë#œÅÅ!øCw°5'dQ@Ôüts—” Žæ«CG¶\&úÁ|—›K ?À´Ö'­8ŒÄw:69ØiÎ!*4•å¶cGY*©½$WÜíiÃÖ»àÓƒlNß,q—½+yRÀyC޳‡/ŸãªŒº)÷¸¹E&Ín0-–¯ÇœcæÀŽT÷í-qXÈ÷õú¹|*Àž?™Îub'RÐQÛL<ñ-笞~MsÈÙUºŸ3_}ÑÉÉúJÇ 9èåüù÷žÄc;rÇàc‰låâØ’#ªxÁ~igbŽÉËâ¥Oˆo»` ®-g2d·HÒ 4ñaƒƒš×ô ñY±>ìÇÉ ވe·Ÿsþ‡Eœ ÎÇA{õïÄ\Á+–¤Š‰j5w¡Chrés¼ù"XOÙß§Î9Ô™šÎ *‹sxØ„k‡ÏMscÆè[*›¿éÀIüËÙ©ï]É”¾SÜ0.x}â—&ŸvKÆÈ»2‡ÞÐçÞ§ÑxŽ9« ,+ø&°ÃèeÉÀóoÆÒ'ÁN²{ôº CŒ÷¶ÿÜiάÐgŸ]ýÁçÛþpˆã³îx³ Gš{÷oÈ›4y%þdƒùt}˜š¥µýÎ.*ÂïN86çì­ûïgÌykK®àe)ãfˆ yÊY¼9Î)õ€œ á()™ œÛýçë¢èçï;ŽmëÀÉá„¢ùä䉿O&ÎcKŽÉK2.¸! 4úHyêí£W€>~ÎIÏæA5Ÿ*‚Êw üi/%ï„8™øìö]ù&ǧŒ\=æÎVÑwlç`öIFسá’f"þµÂ‡`¿î|÷Ç–䈽/kð’ßýìLäÄ]Çœàg³áäâ¾ÖWþ]· ùúüÇŸ»ø+V¾ýv¾AJNœ4#öÓïÿ<~×|+|×´ú~A”¹Öm¸Ó†—Ïì3c‚³sе•·S[Úvž<†Ï­ß-/ ÁÓÏZ’aúŒ¶þì„™ø¬O!œOÔŸF8ŸõsM[ñ‚Ÿaj;`Y-ší?1§›ã¸zÜô|Î)K³-X•bJð½›¶írœWŠ>ÿOQÚGïSk„j*‚ 0Á‹yô$C<÷OóM—.úÖôÁ«ÃYK;µ™Ã]oí‚fyrÉzaÃ9k扉ãn|<ë„Å™#nɲø•Δ'„sVN­5\Ç9±¾…v(†‰Ûö&¹íÎòQQÙG­$8½â”ŒN g¾î 3  +]»OöH{K®%Ð'ç´ÈNœ¦[¸4úø¡Ú?SKšÄŸ9µÓY0'Ö“Wú%&ö¾é|Ó—d¿+`ØÜg·$² Š#¡å×ä>c“±0úŸ]ó1í ”WLõ¦3百*]ðÒZq·}%¯dâ¾#¾ƒ÷E×au¼Ù}.úëåò­SÛsl§Èãç`ÖlfY=tFΑfÄ´[rÓ/¬KòÂ)ü—Gû,’ÿ¹»Éáàf‰@ŸÇ4àÿƒÂÓ^¹cGN"ù˜ï>Z&ta–‰ósFΫ6)€÷—Œ<™N$¡OûsKðdàâªi±K>ÊÓ‘ÔV9váPA¸‰‰eƒ䚺4sX|ÍE+84Ä÷>42¡ð]úœáüœ•ÿÿ+ï¡¥9Ã9ÖÌkÎ\˜+|QŽ˜[³ŒYH;Ù…ËY‹uÞKî]É“RwàÉÏö'–Ÿ_0îæLÁ‹‡ÜórÜw~,¯–8 þ:·Áy{/Q¸×?øÖ)Hgø!ßÝ™˜eBhúˆèÜñá/ì(ô:Îâ8ñb°äîîµp†¾eÓÓ"Ðgmœ ‡”\dî€óŠ–jÖ|ùEþIñy×å™6gäÓ¯WéD9£j-Ê 2áO»ç®}aa¾J!œÎxÄCáìpnw(ì3gûö‡"âóL[šurÌàGŸ‡>¾½£ñ´pÉô‘:5p*Ü÷f>·—øÿ™›4;ÏXhÄÅ ¢:'š|²÷xɘÌ! 9"n¨5÷>ÚÉZªƒÕZ¯ó®dJ1ªØšÏ6™ŸcúÒ+–|ø£³ZìL^Bœý"§V(XgâäŽäø:Ùs /d¯cÈ:G&n?”óâ§9"æfŸ·,ËÔ˜ûwt¦³,ÇÂ;|Ð9Ô"™k×<ÂÉvj¹F²ûÔé…>ߣïeG÷9o„Áöäã¹&Æ›usá© «¾ÙBгÁÄ™7§6ÌúfA ×øð›9äL ‰7ȱ­ÈG«?8NˆÏÇ¢x$ï„Ø|‘+òOŽMx÷Ëè》‡Nãx€OÑ¿¦jÂ?猜àÍg=Ÿùç[OpнÜÎÞ&gq|ëãü°½Ä´¸ Sbr…/èsï+?*€ÒÉ|ÈC¸1×ZVG9ᨪã}5ðìÔccËÅ®|â§¿Oüy‚( 6 9Fž/Ü‚i®×Ë…ÖzÈÙùÄÆšD–Ù!TûÅ÷eˆ˜ŸsJÜÇÎê»ï hÄÆ¹D”G4ÃdNŸká»»ùt–“ÇŽìbÇ8+1mSÝsБ|¾?$#Š^ë8 ”„l¡ +„Íûàã·$ßQÇíÛ~’‡DðEHð«m&ùüòìêäVÝdæ;Kp¾ÀSÄ‚Ï+ ~?r¤oü¼¢Óçeº LpÂk‡>8ï‡õ‰ËAŸs#œ#‰Žß,W(öšoõÔZ¨£Œ¯o:¦ÚŽ£‰“ïy²ÄÌÙ¹#ç˜6kùwÛ "„nÿÞ}>k/™ÏØ«ÇþËöÀ£‡âÕpÎMéÇÆˆXV&lk Îlgè;3Y.wŸÆÂ]_6½oG/a§^Çfßr¡‹R…Ïϳ¤ÃÍOB(gQ_Œç‰£w=„û/ø_×C#þ÷‚H5Ÿopú_{w2ÈŽNÝv;¢|÷‘ÄGÖŸž)$:ë´ùµÂæ3Þ¸;´yê6ŒO‚[X¥/Y6Å5|i‡,ï½sYU>vèðþ}œñpÂÙ)àl ÞX»€á![ÉÚ…GeŽÉ>}aµàÙ›¯}ÌŒüǽìØp¾}‡8”œP¹ãÎ$teà\Aßìs¢†?vðÈñœVÄIMàn÷E·e8#WdBîqÁ/<æÛ*Àäöõõ²k˜Û®|Óa óû{N–š±8ýÄ„’Ñ7 ¼óIßèû¸È÷ê$42@Ι×0Ï)Ï•oÙÕQƒs¢!2K|zËÑâáKÒE.É6wúó_8¾\D¢ðßñÚ€ÿPëÚqÿ“ð×¼ Gôð/{ws’ŽîÙëÈ«%¥Szœï ‰ýóDâK›w9.ÛÌyâV Xö ãýó¾Ä¿ÙÎ¥éAœÞ)µè–Ží<ò'1fGï9¸Û·Ûì”·rßQD.¨ñõß+}ÆèÓyÖ-h ¿8M',í2Ðç|‡£_¨OóÞ¹ÇÙÀÀÀü±ÓYQ@ïð£æèã»:§Ò6={H|ñyËKL[GÀØqV´­@¦Ÿw%O À°åò÷×åž—5lI©i‹nüâ'R¿Ž£ÒQ|+M>ëÍ÷õzºN8gA‡ƒÎdšôðÛy#–fŽ^–mò¬§6p Îáf>Çé\';ê?–¼¯kád£°dªð „ÜÆ?CXcžãÊ@Ùÿõ³#dgbâvP½öA‘à©"geŸ}óû›ô*¸SJÞi„“`u&Å©‰qm‹Kß)”¸n#|Û`Ø{d׉“Šœ„D[Ž'þt"q+‹[‰‰7½óUùñ32FÎÉ:cî¬'>„>û|Á–¾eNßîpÇÑyIôñG8©Ù²áNžØ»›£/^gg“OMá=n›O0¦¤ü~4ñÕß ŒŒÏº ÌâŽ+ofdÿð…À“yÍŸA“¼¥Í¥öù Ó¿ëÉl!‹s͸±äø„W?ø·A{Ðw4ÏýŽ·ÒaVß•×Ýu™£,C Ø&&Ö™uc晋3G/)µü'í¢ðíðùo à:qÂñÿ's]ó·kÿnWÜ·w7'ùì>zóØÌ,~äðþGœ3š½+¹RÏZZ,º%sȲœÓV7œ¾rý1 ÖŠ}‹ñ\ÚSrR§°^oNÊSž§cÎÒuâöc‰¹Ãf§Š]>rN;Ÿd¡ú”õv’iÍv8ßš·ö'ëëÚF¸SCãsGð¾ÿܺïOm83º~ìœêañ-âVN}âƒ5¼Î¢ëâ»&D¤XxC®ØEh‚D¡óoqÈY½;å…Knç@Šo5Ë·ýú<ýÙº^‘³êŒžT/$ª^ļZ3öðå›~K|+1±bÜÍé'ŧœ³ úðTǸBÕÃçã,n]úøGšœZ*q\LGŽ8N”]‡ŽJ@;¿Øö÷ÄÙË›Žž^}òœJQËJDÅöyè±Ç6ìçÚ¯|+í˜UfÞ•=|ÙËûKÁ‡©Ê"ãõç•JÖÂéŒÎa—|pèdõè%©'-ɼrÒ½o2úûÁî¨HL`g-Þ9mUAf¾ ßëë:ÂyEÇŸÿaWºðø€„i#âæ}ú½³ÃjÄq(CÀñ¡ƒN´åu¡\ã焟ÚãÅ-þ8êùò[%‚§å7µÄô¹eÃ^”Ê’‚±·„.J»ôŽ€Y +¬¾Û‘ྠìõCìîwv8á|Ω§4!ç¿k^¿Ám³“Xg¢ÿ¹ë(žIöJßùù†“fR"lv¾©s²ÏÍ1}yѹw§ ^’wáÝ‘³Ë¬¸}“ã©wès€×pñÎã¬s]úœᨌ¹‰]¾cãù{kãouÇÌÈ5&>gìªÔqÙ§Ç”ß0ì¶ì#Öä‰}6 üî ÷¼{ÔYAôm„;|êh¯k~Ì®/qü¯z‹êsã§k‹‡&¤ Y™cêê{Ö?;nÿÎÄ_ö:~x¼9›J‰‰ìS}®¯Ëy“¢oOÅÌGÞ˜°paºÈØgÚ‚$øFN²¡bÿžÄƒLï,È_ë”×>Â)ÂÀ%CX…çmä#Ïž0£ÌÌÅù'ÏË:q~¾¸;ÆÏ˜sOÀ¬›æ­Nµ¸uô­SæÞ¿êÉw>ùy'j Ê|Ìg¯ˆoRœŠ÷»¦'ˆãˆpN0s 2Âm;x€s’C«†&“#xnæð¥™¢o ˜´0ÛâÇÂWÌ¿9uÔ’VQ·ŽO¸ç¶?yëÇ_m0âOôqDÉéqÿ–<¢êiR¸›ó‡Úyè˜`°#¼žÝº»@È<‚ÁÂc²Ç-.1uyÑËó…?–&ìÑŒ ÏŒ^ÒtÖ=âVÎüùW7lÆ.ßå{œBTèÿÛZîßP…]Ûë¬ÿ–øÊ/â_à§×…jg{à<…üóžÂÓWjï‘Óçøê&î|Ï£Ù&ÇåŽXS:lÍû¿'þvG¹Ý Â9ûZdÃá¡dûP²°áþ™,n"žK6ù^ùFÇñç·™ÚjŠù‹ó̈&Ë·ñÆ{O‚pl Ç}u6¥_-ÿŸÃþ53üN3‘ûÿEÄÅñø?O]c§7Þê ŠÎ YX%(H1TؾÞHdÖÞ,»½ÚÔ„#f–H¸+ÍÌ›Â×Ì}0`æ­óî H¸+}Ä­ùÃo*¾²äÄ95ƒçôœscì}Ͻ¸n³ÐΑãG>É[&EGïðåÓnNIŠÓ)úÕ¨Ìî‹_õZB{É¡RÎÌyþ‡þ½ªú¬O9ͧ¬Jø|•|cú˜°cnz0ÿ€‰¥¦/Ë~CŠ7Ìy þÞ€˜;î ˆ¾#ýŒÛóGÜVhêò‚câ+OJh¹,êÞçžÿz & ï½ hÊxF½j1·ï²—Cºû~šÿAq¶4¼€¾÷Ù¹"æ§ Ž.8ïÖÔcç§Ÿ|cæ§ {$EØ#iBïËzGþikò/Ê<»ðÌe æ­šùÀcO~øáÆÝ{˜Ã¾ÌÓZü?óÆ©ÑÙ ¨¿“Îû¦Ï:^î¹eü5 úÕ=¸Æ—:A/öy5@oÈ´†íܹóÍ·Þyë½÷?øðÓ>ùôÃ>{ï£ßÿà}~øégŸ}¾ö£Ï>çWî¿ùö‡[¶¯ÿqÓ¯îäóÛ6üþÇÎÍ[¶mÛþóŽŸå“¿íÛ·oݺ•7wsq³cÛöm7ý¼yë¯[·ïØÂüÛºmÇö­?ïøá§?mÝÂߦ-›·mÛö믿þ¼}ÇÆ6m߸qÛ÷Û7ýøû¦mmýýílÞþËz²ýºmë/[vlÙüç¶íýòÇÆ·¬Û¸õ“Ç›Þùx–¨e¹Ç'N]ì°âA¶»Øö×öoÙøõ¦ 7nú}ËÏmÙA}Û6nù}ÇoÔ²eË–M¾k#õmØðÓO?ÑlÌçÏ?ÿLcÈÀ'‰¼ÉZ}áR>yDyÜýݱcÇo¿ýÆ+¹ùÉéûŽd ?‰Ü“Èç/¿üB"S,)|¥pnôˆÊ'›ª³KœfC«_~Þ´m«Ó€?ýòÓ¨óç–¿oqè yÂ7o¢Êùñ‡ ?oÞüÓºµ?ýö׋{8¬kNš+ &Ü8à–;wð•CoûákÆ`ÇŸ6îØµaë¯Û~ÛôÓÖu[·ob€(ÆlÛ²uÛ¦ÍÛ7oájüaý÷¿ÿêtÒýúûo?nÞ´…Œ¿þòË¿ÿòƒìÔNÛbnÝf"¦®M›·nÿõ7§Ôí;øÜ°ió6}öÕZxï>|çÝß~ÿƒ÷Þÿ˜ûwßûè>~ûýÞýð“>ûòý?ùò«o¾ørí¾ýwîrbÐ.TÇúÿSæšA8a›ûŸ§Þþà„áùÞpæ{T@8}÷ÍáÄ3—]˜~l|а±wÌy0`Õóˆï€Ù÷L_0v^Šñóó†,-;uq©óª »é·~ÜÁddoÎzìe½üß•—ƒÚmæODîÜö³V–ž27çTö„® ¿ öî€ÅOÌy$`î#1w„¬L9ey7VˆXUmÊüJB‚W?øÚ÷;~?á œHtÈYð8ßu‰¥><‘ÈÛ¿ÊÅ,K;:*óŒUé"nÍÿpª¨SG>”"ìÞ”!w¤Ÿv[Æé7¥_‘nÚâüa Õ† Y¶â…¯Öþrì¤Âe;¹o¯ï¬“S³ÄцÀ6_”éEž­~®~{n½ç²2ѦJ¥Pc¸ùã¯?ß~çäÈûöÁ'ŸóùÞGŸêþãÏ¿úðÓ/øŠ|!åÓ/¿^ûí÷ßmøéÇ-;~ùs×÷7oØ´õ—?þÞ´íg ȧN!ÁŒûe˶Ÿ7nÞüÛܸ)¹eË?m\·þ»o¾_ÿÓö­;~û‰àvÃò›7ýòã¦ßÿ²iã?nùkã/¿oþmóŽ_7ü²cýŽŸ¶ýNe›~ÙøÓ`ÝæŸ¿Ú¼ãµ‡2G.È·ªbø’q7<Ä&Wá_|óÕOlÿá·­`Àñë¦í¿ý¸í×7ïøqÍÛ€¿þúëÏ?ÿ¤Ñl§µÛɮƠ̊‚:ƒ=¹.ôü¡Â) ãÎ}ÿý÷¤Kôó`#e‚¯*VÇO‚–ó Ü÷›Í€þøåWàNýüÃOà÷Ÿ?ÿJ ÏnÜô“¥;~~Û¶mï¯Û?ÝðÓüu¿eš¾Šù›gÒœ›?ø” °Ñfûöõ~Ú±yÛïعþ‡Ÿ7íønöÏ7mݰy«Ó_ZåTõÓ&à1Þ²aão”¹i³ºÆoëÜ@c6úîùôqÒUAÇÓÿ@õ¶­p¨úãæm|þðÓþP›à+XNÌÆ7ö÷Ñçk?ùrÝçk¿êÈóÅ×ß:Zïicþ‚XÿE85[8g¯“w&¯ïŒìG?Ì8:«ãæ:î¨ÿN¬=}!fJÁY·ó"±€É‹"×Dß”j檬q·”Yt_…„[‹Œ‹«’0êÆ?ÝsEŠ?¡ñ¾—_;Þ|ö£ë:Óä’ìЯ´M/¶?ë%_T޾ª„3¯sYrî­UÖ†3ªv6ÂûYן#÷úØ©&®ML¬49¾lä ycn˜~CúEDÝusÀÔei#VOñ¨ÕyFEaÃõYxç‡;·tÔòÆé·§Òƒ#ê¸ß¥ÁB#‘Áíßw.úœ5· ¾J,òV1+ŠMŒÉ:? d~@ôê€ÈU³îJW¶˜Û²‡Þ}Ô¬|#¢«‡.éIt— BøÔŽ“ÌA-šµjÙ´…óTó&M[6mݨi›Àfmš5mØ"¨9-lÜ´ U7oÔ¤a£ FºµkS«m§2Sçf¸1[ä-¹ÆÅ½ñÇß?øsèˆî;6kÞªc‹Öýš5éÙ´i‡–m6kY«YP#õÑiV“¦”ÓÊ7pT×µs—íÚ3‚7îÒ­k`³¦­Úµmݾê4¬…C(ÈB;É ð»ÈÓ©s÷–m;´íØ%¨UÛFM›7j SuíÙ®ãϘ¥L›:}&_áÀ„y xäñÝ{öñ6×äoÃ{–kO•o7Œï_D"X»âØôw¡aåbWçŠXž:lqÞùw¥™_bÖÊBœd3`råøð§ß~k÷I wˆoÇOØù‘ý‰¼Üqéöí¿¦¯Ók]ÿŸ>À9ôyyObÎ~“ NŸmÚbè² ýÔùEâVŽX”ihX™É±SŸ|û}NN<û:îÇA~¶Çr%B°ÿ±”%¥„ _忦£omæ¯ý‰ëö&Í\P<rDÿø8xЈQ#ÇOœÀßaC»÷éÑwxŸA#ú:hìÀ¡£úÖØ á£Ó{Ø€¡£†Œ<`DÿAÆŒì;ll‰¡æ.Mž%î†Rc?ß—¸“9z,qåÒÆŒÕoø ¾# :lÈ ¡#úáoøÀÁ´aĈ4oذaÜðI;‡ 2räHîi9÷  …ÜèžOÒù•îγúªGø•ŠR±ÊC™<È×Q£FÑßîÝ»ó+?©^~íï»ø:zôhòséWJÓW«]<¥ r‘¹oï>úô¥Gc†á(`À@•Ư´pðÀA£‡?z …4ì3 dèÜ,ÓW¤¼¨dØB&ïÁÄ£ã'9’6Œ6µdèì¬ãffQ5j~‰1Sj‡ÅÌyãC~•ìÆ«é³K¸äÖc[\±ûо?lÛ¿ÛéĽpJºTûs…g]ï9Sâ¹-¼óËÃS+öŠªÐþ§cF¶ò‚ÄÄÄ»ø¥^A Âæ S)r^‘ÑSêΘ=÷ÏØ'G°JŠ>¾§¾Â© }œÃÒÎvÉZ•%'*éë¹lS#Ëÿƒg3Gâ®­8?üë@Ù SKÆÎ˜–5~n¶ðèJÑó'<üÜ[?Õœm>ÇwýÇz;½ÿtL‰ÏoçB8ç§=O“ÎüI½Ðe|(ü–)(óN.‚=.º9e¸½”FvüQˆ MÖ›ndÃMž: YƒdY²bÕòUk.]A" 3kfÜì©áSBÃK”)Ÿ.SÖÌY²¥KŸ1 eŠ”©Óø®T©R¥H‘"ÀwåÌž#cú ©S¦J“*5)RpŸÞw¥L™ÒÉ‘" uÚ4©Ò¥M‘&u@êýeL“2kÊ´Ò¤ Hë|dpþHéü˜& EÊ”ReÈS4]›®yâ—¤ Udd8û }«ñ‰y²å¢îTéS¤ H:mÖ Y²¥Í”–Û”©2eɬVQ5 H—.7\©O_§šÄã®.Ÿ¯zŒz=KIɘ1#‰d#ûL™2)EO¥MKëJ•9C† V‚Å'Ѹ¡(]ª…‹Dçr>ušLéÒó—!MZúU©"W®\§J£ÁS§Í”)K@º é«Ô*Ÿ=ò†"q·~ôM¦ðW?®ƒ˜¾šiaöTÙÓdâk é#”6]†téÝCIÒ¤KËÏ)S§â3cæL|=Õq]tÚW÷M*†˜âÓfèÝ0GÁH¨P¦Lå+¼†IÓ’šE Èß‚%ËI'Ï]÷=xøû€Øµ”Ü×Ḽ¸ð§ïÙ³øîÝ»wîÞÅš§³òùÛ¯ýõÇž¿ÿÚ·k''ðB‘Ç;âˆfç´ŽÏÖ—:¡QìâJ“§O¼÷g·lç ŒMœèqÒqfîBë?zlïÁ{÷îÞ·óƒ»~?~àoŽsÎÿ:ypßÞ¶ ¶ú.nøº×wáv#ÑF 7\jä™™ø.nx–ÆÓ nΕÿ\éªBÑÅ×sÕ{ðð!¡æ›C‡=èü>xˆ$âüãXâæ£‰¼\íÎu›rwÔù†; 7üæ;\ÿ#ûjùûzÏþûÿzäØïûîÞ€6ïþë÷½ÿ~dï_‰G ÑÇØ£~ù]Hy*ÀZHO‘Eû|Ý?ëÅãü*ªªïyÿÞ-¼:°ï$A@Omý¹È¨‘5çÏ+5³Å­·Íúü«}:ÊœÆûçž]¿í:¼—×%ø¢iýãï½þµg‡÷:´÷àñƒ‡™(Ç ÄáƒØèŽžúóQæ|—ˆl½³.@ Öuè#k$|–¤ìÚµ‹Ðƒ¿ÿþ›IZ/¥Ò°V ÂÅÄ& MÇ͞LJ?|’ÛüÅËP®A;tgÀ 1„Bíä™=?nβq_¨XÉTé2æÈ™;{Ž\yóÈ_ PAß•?þ¼¾+_¾|ÅŠË“+78W´p‘**Ö¨RµvõõjÕÆ«Ö¨^ýšÕk”+W®`áBÙråÌž;WÞÂù³Èž§`®b ”Ê_¸Tþ¢EòÎS¨@Î"ù²Ì™>cš ©RåË™7W¾â9‹¤«Ù¨Â”ˆÌá â—¾óiÆ}÷¾ÄŸÖmÌ’:]Ųe ÊO‹Š*V¥\¥Õë4¨U¯vÝ:µë׫Z½Zùòå‹/N;sæÌ™9sæ¬Y³‚ | Γ'ŸÜs“-[6¤<¸Wxª°ï*T¨ò“HI'…«dÉ’5jÔ§®fÍšò¾Ö­[—{~Ê‘#eòTÑ¢E)„g)D%ð,7Y|Wîܹ)PMââ×SWÞ|9²d-”'_ɢŊ.’Ï×(Š­\µ nŪU«Ö«S·Aº%Š-U¬xöÜù²æÌÔ®pèì4¼+tñòo~Ýr"ñî‡îÎ_0KÑ¢y³gË—&EÎé Ì^(žÌ… gÍŸ;G¡|ù ,T¤PaµÆäÌ+O¾¼¹òäÎ7Oé²e*V¬Hu¸OëÕ«× ^ýúuëÕªQ“q¤ Pªòˆ¨qæ•:M”œa£ÆÂfËVÞˆ|îÂ%Ü`â=° Æãž”¨ø9Ó"c`EмÿáÇ®Ž)ŠøC¦|ýõ×ß~ûíǼnݺµë¾^»~ý—ß®ûú¾­[ûùgŸøáÚO?ýþ›o¿ÿ~ÃÛ|üî×ß¾þí·¿ñþü§_ì7ù=_~óâß¿¼î«>û䯿úlÆ×~õÞG®]ûåÚÏ?Y÷Å'ë¿ü쇯?[ÿÕ'_}üö'ï¾úÞ›/þÙ'ß|ó 5~ùå—_|ñ…SËÚµ}ô÷¤pO{¸¾úê+¾~þù礟õâ'2_?ýôSÚÿÉ'Ÿ|öÙg¤œõ:W9ÊLQv)åì•~ùÅ'_Ñ™/>wÚþôùú3çoíç_|öÙë¾ÿñÏ¿zí›ïýlŠÞ'Gœ7c±úüiÉퟃÍNY·Xɾ“þO>yh×á}®žÓKùÞ{ïA(öÁ@CúKÇÝ-÷»‡D„Dg,×­sèùñ'¿òæ¶o7:1W_­{oÛŽ¯¼Ö1*fùÛï?½iû󶼸ný+Ÿ}ñá—k¿]ÿ͆õpÁ—CÔ¯Ö­ýú»¯×~·níwß~õÍWŸ~ÉZöºÏ¿üú þç|¶öSþ¾\{vú3¦4^¤†tj›o¼ ß ãùõ×0Æz>aþ¸ù⋯>úèn~ÿýOl×Ëe]t9Š:¶‹Ðl8”e!Ÿ pnRH؆ AñGºDÏô¨8$â,\¼T¶\yË•¯È_¡Â@X±"EŠHôs ²gÏÎ}ÕÊUXÈiԂŰþÝz×£}§ž»ê×äpÇcÙ¤yPñ²¥³_Åó(š„+] HéBÅ‹-Q°xѼ% å)œ'cætØ}¹³åÉ]¸\êâ•37ëT>,>kX\®ÐØeŸl€E ~ó¹×J,RºXá&MYl׬U§æíq|†Mž:zì˜Ý: 1Z·nÝX4xÊ–- sÑlZ+\ᆎ€C VÀØHçâŒJq•(Q‰Ïz+g`7x 'OžÜ»wï=zà¦ëÚµ+νvíÚsdV9ª×ªæ†Z@\.U©.ªÓ‚…Jä/T²@á2ÅJT®X©~ýúÎêW›Ö­Û¶ ‹‰Š†ž8''׳k7þj6Í[§aéÁãrÇfŸ¶ pè¼7Ž9±åc&Ž.Zu®ü™Š”Ì[¼XÁÜeJå+Z o±B…7êr”èQ¨`"…såË[®RÅÒÇvmÚ²æÝ¡M[¤Ž´_ÿî]»‘X£Zu:è«hþtÁúãÊ›¯7pèÔ&¸ˆOy#a6x T“£RGÊÂe+a9P&„ï¼÷çü•ëÁ†CÅn#hõ¥—^zá…î¿ÿþ§Ÿ~úɧŸzþÕWŸ|þùGžxüž{î¹aé’YQQñ3"æÇÆEOŸ>oÎÜ9 FÌž;!:vLl|ôÍ·M˜3w|äôØ…³£ç&L6-2<&&*>:rvlTôŒi1áaÑÓ¦ò73Üù‹ Oˆ›9{öì9sæÄÄÄDGGÏš5+666<<<...>>ž¯\ÜðëÌ™3#""ø<ëÅSdKHHà“rÈÅS¤Ÿõ"ÏY/ê%?ÚÅWÏZidÔ̈ØXþ"¶GÇEÍŒŸ93!Òù›·p>1s¡Ïä¸Y,_aﲩ÷-  Ý9ê¼ÎùÃôqœ·¼¬Á9 ’ÏÃΟíC<›F¶.X°Ò-\¸pÆŒ¢Û¼yóD±3/(£®ñÙ”3Ú‘ÇÑ‘3"âfÏ™138vVèÜ…!³NŽ3/2~AtãÂs1 ³c¢ã¦…MŸùô£>þꫯFwŸiR_~kŸ„wiâø‚|ê³ä.üiñ_a418‰ƒ¬aí$wþBx)‹-^ `ábÅK:ÅNâq TªR¹k÷n ܹó¦O™4lÔÒØÙ¯<úTBXÄ„!#öèD Ÿ2-¬ÿˆ¡m»u,R®Xá…°°ã¥‹–,U¢dÑÒÅ •)ìåÌ•5sÚô9²æÉ[ºZ֚ͲwÀK FÎÍ=aÚ3¿€]q~‡OiV¯~çv­c¢g.˜37!}˜ŒO<ñR`ciв‰'Ripp0à‡y²RµP,åP&E(²áWRt Éìä/R´BÑ’e ­^±r¯=áÕ¹ L˜4‘À–W^xñ‘û9`ð ž}Æ9jØp¦Éˆ°†Ã'Ö‰˜›uBTñøŠLˆå4¾ß'–Êògá *‘-C¾b9KU(\¶Dá¼¥Kæ-S¼Hé¢Å±¤BE *V´xéR¥Ë—#2hòÔù ÌŠ‹Žˆ ;á­ç_7xø€î½X ?12|zÄ´ð1£FwîܹQãÀ¢Åyò„Çâôýq áFŒSa™á¥kñ ûá<€µ°çà= ”¹‹–MJͺ÷ÁG®a–f žs§XX†kH"Bª(¶?üðÃ3Ï<óÀÜ{ï½wÜqÇó/¾pów>ôÄ·ÞyÇ­·ß¶léâ £F ìÙ}ÜÁΚÇ8ù^ù†¤Ù}ôo²öJ8‘â¾Q¾â°M-ÎŽ:ßûáØ6zz±Jm³9nXøe’0azöì9vìØqãÆ¡µ‘"¶f¥–{­B³.mKÓZÈåY Âj0J%€™ 5mÊ!?+ƬT«já†Z&L˜ Çµ0®rðèq†2rü¨“‡öåߤ¡]Œè9`üÃè3¨Gïá={ï=hÈÀÞ=û 2|ÜȱC Ü·ÿ¸£øœ<~B›ÍÇŽ5nÜ–é‡2vÒ¸>û²`Þ¯_?-õ3 ´„ÚI†4‰}Ò~zÁˆN1räè±cÇOŸqã7=ðÀCü=øàÃ| ðn¿ýN@ /iÑÍÂ>Õ ¦û¬7ÀŒ>ú(Êõêի׬Y³ü†<öÈ¢ËVß|ÓíwÞ1gö¬Æõê…M?¢__d- ·ó—§Ï›Òx-¶by}ü4˜m¤ìDa wöYÄHwÞ¨³æÎo!þÑК{‰rA‹‚¯øTŒ–‚Íž…ã¹!ÔŠ{w1+x„ž Þø•{>y–¯<®l*J±[’ÂLZ¾2Óh?ñɼ¼q£À(²ý† êÙ¿ïàáÃú è?nìè¡ä2xÕ¯ßx¢z÷>¨ÿàA|ïü7jÄ`Æàþ}Æ/F”ó–¸!ƒ‡™6 Ÿé ¨4bähär_ vB¿FŒ`EJä‚õi!=«€jý – h*_Õ#A JÀS °¦ña 9K};}ãÁØh/·ëê{Ëï q^rpâSa°io÷ç¤J_4&g¨³@K÷‡j7hÀh3tÐÈq£ø¤Œ‚¢Úø„¼j¡"ÄøÊ½Bé4v /Ñs!$$„»ï¾n»íŽ›nºåŽ;îºõÖÛzè¨ûøãO}¸’d0w~„CvÈG$Q‚*-„æÉ?‰ Bô€pŽwÉ·… @‘ây ÁtÃ?™%köÒeÊÉÁ*jРfî½÷߇:_¼d Í£BÇwë3¾×À•³n˜—06dÁÔÈøÉaw¬\EDGÍZ4BXHd\TL\4[ ‚5fA(O¾Ü•ëVÍ]4OÁ"¹sfÍ”. Uþü%S¨P«e®q3ò†Ï.3èöÅWüoí}åé瀦ê•+€p=;tN˜±`ÒÌY£§®‰›?mô„Eô GΜ9[x°Åe­sà³~ÀÐì*ù YU"‚µ(YQ2Lexqq³jÕª‡~o!«P:uÂŒS(#Ü»lÙ2X>—m‡ÉȬ80æÏŸA ŸW®\ -bA:ü¢À6_)Ì““lx8[4möØÝ÷Ï  ¬[— ,JG7hXôøàÈVL[;wVx$‡›ªÇò{òMŒçØ—ü“£o\»™(„U7ß^Ó°(>ä‚E‹”Ìš>gÞ ¹*Åxc51'þá"¹ó•/]„ Œ¸ç¡ZuhW­VMö ôíÙkÊȱ3ÆLš>|Üœ a1#'Í ™?-bõÂ¥³ µ4„£³q³â©PƒYde½°dñʔŌc„<|”˜ 6Cm‚µÄo€Ú€gçÀ[‚£ñÓµp]Íêš[ pìbw ×믿ÎOXx,õ öØ2‰ã &{óÍ7ïºë®›o½å®ûî}ûÃwo¼¼[=eòÄú5k¶oÞ¬~Õ*ÎÉ=û÷Õ¯[—z5«µiѬG—ŽÕ+WjÛ²E»V-[·lÕ¦UküËüqÓ²eë¶í:°u£U»ŽìÛhÛ©[ûî½ÚtéÞ©{/t#0Œ-„K`3êØa´mŽUe¾¢Ä‘Ž‡Û§<7°>÷,Ìò+¶b‘2ÜÎv泋êÔ©C:nn&élIqvµkÇO|U]|%7|âܧp~eRpË>”,@É|EI¤I|e šl$¶i×–MHM[µjߺmÛÖ={tëÔ¦M÷öm»µiÝ«];þ‚êÕmذ}«æGîcO!NÈZÕª6 ä³Q½ºýzõ$F™N::;›Ú´ëÜ¥[“ælojÓ¡k†M[°µ¥IÓ *™0I™P€‘ÒN8œ9ÌRm™âžÒ/zeè7ô—öÓTHJ×è2étŠöÓYóÚïyˆWÙݯx*`ÃÙâ3Âu`›ïyN—?H| ìä(+¾mŽ‹õ—mLsç¦nZåË•)W®Lzµ+T*_¹j¥rÊ"7èR—ZµjaCð•DÇáV©Ë-úÊOô…¤~½ÀÚµê÷ë;hÑÂe7­¹má‚¥8EWÞ°fù²U(Z æ/¹qõ-ï¿÷1Nv$Ä áœ_˜‰üBg"œR´Î$BÜNIN$Q©r §,S¶<Ε*]Ñ,ÇR­¿Y󠋆O íдÅÈ.½G¶ë>¦M÷æ,ŸÙÔ¦í‹gÈ1+tƫϿˆû+4*bùÍ7.[½26>îÆ«{uë^¨@Á²åËä+‘¿X¹Â%JÌ=KæTéËW¬›ºXõlíæš:›ÓmÊN}ö ÂŽÐpž~ò¹IcÆtéÜ~ò”ñ ³âz¶ë4¨U÷Q-zŒkÑýÙnïR§IïÖíŠ(s67ß|3E °ÁsÎ'ŒGËYCÂ…H¸Ó±Ã¸Ã ܃mŠ(‘ø©^½:¬W00ÎPzÀB­œÁ'K—.…Å·ƒ÷ˆ$À•Jåçž BNÜ’ävR#%%P¼ÇE „¡U*UŽ ›0|T·N'M˜È_Ƕí«×Ž9!aÄä=‡ŽiÝ­NÁRM«Öž—0{Å-k¦®º±õ’»sNž—ebLɰ¸Ž8ç’÷ìÞ§|Ñb%Šcz—([®RÜ… g˱V¤p¾B…óV*Së„£ã°tèÒyÚ̈Æ-‚zõé/5e@û®Í*ÔÛ¾ç’qÓ&uêÛ³q«²y êÖë®Õ7߸ü|˜\‹–,ž¿xѬ¹sXûd³#À†·¹\©ÒE 2¤EA¸!#F‹åà+m@‹2ÞÃi©õ`ÇO>k®Ü4{žáxo̵KÉ ´epÀCòÙgŸeÔ‘}Š–”tbÞ¢†£ _åã?Ž:Ã0ÔmToá²EËV,]°`Þ€þ} °,7o åNìcOÛ±gzø©‡xâþž~øÁ%óæ5mРsû¬‘ò‡!Õ©SDk—.ÝÀ;¤v»N][µïÔ¬U;° „kÕ©k›Ž]ª×¨ãª%„‡«O>ù$1k4 ÒMŸ6# %©ù21Hä'à‡üÈnæ‚þî»ïfÕpùòå/¾ø"S°D•Y G+MûI)\¤Llôef2£ðý÷ß§4Ô¨|P¸H TuìÊíеcÛNíÚ¶oÃvÕöô¬C{ ëßµ[ïŽÕ¨Ù°fõ6Mšê}Qü½òÜs¯½ôb¯n]A8hÕ±}‡Æ¡U‡ŽQú¡ÚwîÖµW_væ²s³}‡Nô—Åvü<Ò|E+ðé7ÞÀ¥LüÁB Ð;>uH&úÐfnÈFEtDDMvòÈñ‚y åÌ’;Áã)R§Ï’=k.Ü69³dÉ– Yæl9ÓeÊ)k\¹rçÊ‘%gÖìyr–.]'|„«\=0UÉÚLÉ1cQöÈ…å&Ìxû÷}»|ŠÍ¬¸„ž]»FÔš¨ÂÊ5ËUéߤãèÆ]Æ7êôñ-Li×sl—^m›6³á`™„[²d h„ÉÅâsJ‘–Ìq:ÈÂ)v†scjë7Éœàm¡ ýP& S›Œ_QŒ`iü“·Ür “_1"Y4FúÙ°á˜Î‚I¿P5ÏÒ*З€z5j ë;øjÚŒÔ.-Ûv l®ÐoÌØí&uíU»iÇMÙzØ}ØÀÎÓ#*L_š?rMÞióš,\CÄø®ã‰š·)•¯@ñbE /V®|åBŠËY BâKòÖC?Ë)^¹|…h–®X¾×€~, Z©®lÁ¢]Q]Tïñ½Fö®Ò¨oãÖ+Vïß¡ë¤á£Ç ÒµoZ»ô†@ݨ1£‘x)Ñ-NáR¦Á†Ó†n1•Nƒ÷¸‰ådÃ%„“Ò.ì3.·]D Í·l-³~ýúiÓ¦aÀAVÂÛXÝ]ÿÃw Í}üÉGbãfNž4}!Å Â*wöF?ñé;ï?ùðÃï½ñÖ›/¿¼xî|ÂjÙ±°@;uiÚŒ-ü-؆ڵg¯Öí;téÕ«3°”ôÄ_Çn=±¼°ÜQåh$-ùî»ïzè!,HBì`_€X‚Aƒ|ç0·±ÕdŽà¸ÀkA$8°D Ÿd`¹4&‰”yê©§Ð%ae€ 7+§xV& ÷L*@BÆ" Ä$ÄÄïFB„矞00 Q!ePòl«6-»õÀôBùk‰¹Ú¿e¯žÝ@ʾý÷êݬ^C¬^N 8u¶ç‰Ä»n»ýùgŸc:5jаgwǺrŽxh…•ëd€#¢Aã&ºuoÞ ˜JÑ$ZN0iYÑ>E(ôB h‘‡^£ÀÒ6„ _IÓN=NEà:÷4ë¥8Œ¹ñ¹ ¥f[T@Êlyòä(œ?CÎl™rd+Yº¨–1ujà­|éRòç%0»T™’ΟiÒ¦(S®dƒ†urçÍ‘'O®}ÃŽÀˆ2åJó+àGb•*•rårV\h¦MNT AHa k„Ð4kdÚ·£×ç+œ&u†Œ²5k53TÞæÎYÈg¬y|F̈ž?÷Ã>uÂt’î:?ÂI}–/môÒž\!œX:Q—³ç³G:÷DšäÌ[ŽHÂËùsÄbåÊ ¼§ÍÝð ºe£&¬ºMé9hd“HÆûÃçÎì0`T£vÁ]ú/ Ù£M‡êU«q¾IÔÖZæ°r¹bÙ Ë–,]¸xXU¨LÁâå •.]0Gæôlk+Zºf@‰Ú…GLO;mAÆ jLŒBóý™Eã‰cG=fxéªejÖnФáÀ}F†Æt5¥~§5ƒC¦vÑGE§Å‹7„íżÀœzä‘G€74Ë›nº >dX*¬´ÁØs`›g˜hŒ¾ìT Ddö‘™tL:p_7ˆÇ’ljÌ› #Ú<Ã,Æž#h€ên½õVœ–ˆ(Æ¥Ñ¥È °)$•O„mÚ¸Iôôˆ½û"¸‚7á°˜È Á³GOï4`õЩ㪷˜T·]\ï‘ Âœ8³ÖýzéÒ•;óFÞ’/tþ„gßä,ò·ü2uÄø µ±«œ |æÌÃjj©óÌEŒOáüùÊ—,]³j5ZN€IçžÝÃ"g4lÒË2¨~#Þ–L9­ËÀˆvý÷»hÀ„Éû…5}ôDVÑzwïÁbÄM·Ü¼lå «o½yùª•ѱ1pzPá¼ùëÔ¨)/%ëpÚ|)ÆÃ% h^ á¤l‚F•Öál·6K!r0€{`ø$ÌÄv×bƱº¼1Ø+¡F° –Aò„j‡„NžÒ¥k‡aC”?o>\ÀŽoëDâ[¯¾yÛš[_{ñÕ§{Š}@ëâo`ý@Á`9òä-R¢dçî=Z´iã¬uÇö-ðZvìЭWÏNݺMÄ'üŠÓß)MYqœ>Æ{Ê6l€Ñ¾LmvÑ4` *2àf˜‘-  ŽÁÇ$AžÞwß}·ÝvÇEw`tݵ†‹åÒDããFÀÉì¢dá1ÍÌ"|ýì[ ¸”&qEÌ=.­Zc‚ ÇëÔ«Ù¶}«ŽÚv"à¬U‹^=»³FÒ©]{ü½»õ ¬×¨VÕšM4>ÉÞjVtyóõ7>|ÿƒ~}ú‚¸¨«7ê5ºtlß±]ç®zõéÉIK½{÷ä$#ÜžØ]TJó€sŒ!Ö0˜öб ŠsOˆ64¡ýäAËi?MáBqRäS¥w2èø:œLlZ»aãšõKstêêukW­W³XùR¥+•nX¥rùâ…òתR¥UP3l5B¹6mT´x¡"Å –.[¢Výš­Ú4¯X­BÞüy8„…õ¹ÆM9/ª^¾lrÊß A=ŒmöqÑ,tÆÌÈØ?úÜA¸$sRžÚñm3È"MðRJ|°"W$ Ÿn„3O&‡Z‹„c«@æì¹˜;lÀïU¶\ø‰ x°¦{Ãÿ¬Ä°`xŸê7éß°Õ ZA}ËןT¿ýÄzí&7íÒ¡ïè=DÆŽ1²NƒúÍ›…L g9óæ5·Ü°|®³ÌÊS,7W¦ ¶{.G¾2éª4+11!`Ú‚L‘Kú.¹µúßvaŽ“>`ïÀvMûÔ¾kÇŽ-Úv¯4¦V»õ»GvjÚmRóŽ„chq× ÐèÓÏ÷¬å£"ã·Ä!ÄB2#ÎfÊ0Üè4¨;Ü+r’‚7R(Ñ~àí`ö‘"§…vÂ¡é‚ \dF;Ûþ ¥(œe<–è²8*Yd!ÐEg)D±-NP ÞÂÓ!”<È=ÅrÈÖ[`ýhœÃ nÙ q»ºƒ¶žÚ´ë”ê­¢tß~H|÷᣻ôéÛ¿_ïI£š„…s yÆ©«³Mˆ»mÓ ÜË/½qc‚iÃÇÖ¨V3Ñ¢¹ó;b!Öl¥ ÈW8o±²ÅÐ+–.[¤@AäRמ=X¶ïÒ«CƒØ­WÛZ G4ïÔ³|½iMºEvR¾Ñ𠎣»õ 6†—!½ûµnÞ‚Ž³Ì¿rÍkn¿„[²l)Æ1ç~•(T„H™½zãKÑ`a‚8J«ÏˆðÀ6H­5W”±;iÌS¨`±ÙóæÎU °QÐÄ !3¦G‡‡‡N15dzÄŒ˜à)Ó¦L øèÃÏ—”]}G,%Ê2¢DQòǽ‚¶µ…@Î"©ØNìÉœxØŸÄ×< çÈ“% »âà[8&WxDC|· jÞ°jMB(ǵí1­]ߨö#ƒzÎî44¤I—Y}GnÖ¾o›NÛ¶;q*K£¦Í 8vÖm·Ü:kvüŒØéÇô+P"g¤nެ™SfL—µhþ ^å×L[˜5vÅÒ7¿rÞúvÒY„ëѽkÇníCf©Z:°U³öA­5êÓfðì¦"«· ¯ÑzJãvsÂ"ai&#£) ‹Ù‡ócÖ0@-€ÁÃÉCÊ€3cŽÃÌn4TE¦p‘Ÿ§0ôáXÊÔA—°±¶Ü1É #ÁÛ|¢ÒáÅ|dÊ#C(UÌSfNm)“½+¢·‚7y⤩Á!XK¬ÀíÖozçkµ^ÑnXlÎÁ•[¬65vl0+îÍõ¬4jtþé«Ó†¬.¾è͉¿œH|àîo›³diD\çŽ]JW®ÊújhÁì9Êb Ë_¼bIæ/6\Þœ¹˜q‡éЭKËömC§‡ØÒ‰31«Ô‰ê;rB£!uÛϨÝaq·QS;÷Ÿ1l\ìÄ©;uïÔ²ÍÀ¾ý ,R”ˆæùK¯ºÉ‰þã¢ÍuªÕÈŸ›óñR²bÁcb*íTÂÁ{l!Ð=ÜMd“ƒï¸ç~…À]{ëpRóMÀû&€% # GÅ•èä—8¾ØoË)×ÄAÌȆ$üvÈ÷ÈÈãÇ8q¹˜L0íà!<¢fÍÚ4€=© Ög•‚C_is‰X ˺uvhߥi“õê6jÒ¸¹È…ç$Ú!)D(X¸n½Š•+T©V¹\ùRÍ[4ážfMåË›3_®ì…òå®YµRÃú pï±j@áß#„ÓÀA ¢"¡‚>r¼(,äç€@à\‹^Z>dÝ 5YKqÎП8‰†µÖÒ:th׳w7ÚP¥jù† jwíÐf`Ïn=:´ëÚ¡mÏžÝë5jXºJŦm[uîÑ¥m§6=ûß=Yƒ¬Ý NÖ\ÙØÁ;Vú è‹»µG¯îr)wîØ‰]´=zàwjܧO? Ž I)´Jv3-Ô +ÍÃ@¯òå-„ —=[ž:µŒ=qzøLª…Nš8u[¾ÆOœL ^J^µL”nR]牥DYF” 8³æÏŸŽ <á´ ‡Ë/¥ÜJù eÀ¼”ÅK”ªX© <¯¥)T.„2 ãKïØiì aӆިfxÍæ‘M{„×ëR³ÍÜ.ÃûUo²8$’qí[³¼yïþýÐ24 ¼óŽ{W®¸qõòUóçÏ9wF@bóæÍÁzi¶€ô tQ2ry@ðœ‘K^Ù±w/ÇóIŒšÕ¢i“¸YÑͺ¶î4¸çà1ÃGr’e³nSêw™Z¹õÂfýbêv mÂ^­ àÉSˆÞìÑ­;²˜Q†™V8Q`‰î}8“U1ð†6ÛëM™€è p³- fÆÂcfé† ‚Oø„ Káä—E7dÓ™ D‡­\¹’±ä@VJ F DùÓ®sùr@Dž‚Ù458t̘q=:wï×µ×Ð^Æõ0´^«ˆfÝfTo½´Eÿ°j-cÚ ˜ÒuH÷}ûÍŠ*1abîðe9Ão¬·àÎUÿíXâýwÞ»,jÖœi38®³rÚÙòçK•.}άÙXÊÉ[(ç ”.YÊ9z¦Zuº"UJvâ³ Ž-ù "1œÃ;ô˜Ð¦VxL‹>1õ»N«×‘ÅÔNu›Lì7„m]Xëißíí;w*[±ñ±,ÈásgÏa7:«øî \ª´CGŽ‘—R*”œáB5xeK‡›À» Èé(/ØïÚF8M~<èPèYe~.¡ðÃÜO ËäIS‘#!ÁÓ&M A¸8€1aRpðT"-8'Wî¼%J–æ;¾/g’އ3„¿ö»0Œ)9k.cj‚ R§åð!bØØDfL»Ã¬ð% CË•'çñ“'8mÔèñƒ‡Œœ49tÆŒ¸AƒFåË_„ÝRrÄ^:N¦á·xó(îäâÁŠ+s&8«}ì"R£_ÿÇÞ¤y‹‘£Æ3¶ß ¡4 ݇Þ4Ò§Ïœ)C¦Œ™³fáпŒ™²r,zP‹Úµë‚jÓÊ•ª7jØ´AýƵj7€©8í _kï>ý8wrðþˆbosŽó H™%kÎÌYrrª_¥ŠÕEб~ý†•+WŠ?ܨ`sïÞ}6 ;[´hÅ)›…C«†xG™™¤À¢b†CR(BѤšÕkÕ¯Û€¿ÆA„]€ÎE‹gý‹õ: lÚ4 †’50渧1à8#ʼn@ÐÖ­O4hÄ9 „æ”,YºZµ´ÈñÙî'[·lÃÒ©âP°Yå0¤1l€ÅÝÊ'ÇŸóSó­8MªK×î(³Û¾cÎ}èÔ¥sµÕ³çÌ!f SÔË'õêÕ‡Ú!B×.=;±âÚ£/_‰Ÿa+Ë´´5‚Í ÖnÞ¢O©‘c EÇe M(8mþ”çÞc'Ü»ßüˆÃ|Qü,þBCCj4¬—»xÑzAÍ +W,[ŽH4x¤ž[ºƒ™“çÍŸnÇÕ6aòàN=êä+1¼n«™Í{aÃá¨daµs½¦åóéÐ¬åø±ã8`¥B•Ê,ëðŠJXuÃJ¶‡¯\¶£Å‚ùÂîq<Ûœi‚fƒÁf"WÜ•r$€vÎ~ðˆèðHq&(ÂHyMz)!‰Hå .¼[¼Q‰¯~‡ ùAÝúõ?løaâxsÊä0ÜD“'…rãûÚ±C×¼rçB¸q“&Ž7ŠÉ”i¡,­Á4ÎikyòeÏî„ä±²‚P#–ŠPx¤3¢0@Ø!àa„r0räÊÂA艓BÆOމ™»hÑê~ýF”/_‡2eÎŽle/%KïØð¨¢E|Aò¬0õB³bѽG/œå¼…¤Nƒ@4šq“‚GŒUµvÍ<òçÌ›'S¶¬YrdÏ–='Ûi}Û°î:·i›¬K³¦-;°ÔС[``ËnÝû¤J¾r•lJ6|ä¤)“9ù›kötcž¢_#‰²çÈ“=GÌnÚ¤e­šõ ‹hÛ¦cëVí[µ$?ˆðQ€#˜‰Ä6bCøD¦cÆ1ëàN´KÞ¡+ƒY³f/UªLº´™ 2…6j‚tëڛςŠÕ¬Q·Dñ2)S¤mÙ¢­VE-Ú)Œ@d`Ÿ¡gÈ)[¶˜MŒ‚Cœvì—pÈÎЂµŠèD-]|ìqœ_?ŠâWòÉ´\ä+ª )ü Éö`ŒÏZ”,†,Çæ‰‘ø•a%²UEñàÚ©cwö€m´k×–UÏö´”íÙ³·eå±dòûVæœc9Ý6Œ?TsT®Él œÀ'÷Ÿè ®•«á¢Xçð¹€ÌE©C¼i"„“—òÔ’Éœ…Ó#c,\ Âå/P¤|…*lYfÖà @ýbIÚÔNä*ë.óæã _4zÀ•¨GÛŽí+Ö‰n? ¬b‹u»ÏªÛ5¡í@B+yK޳o¤k™ðx—®\¢NÓº¥KWž=sñŠˆe·Ì_59|W¼tÖøRæÌ]¿kæ Ñ£yUïÂÞw<ÎQ&¬Vlÿ~cË: 9ݲxÁš6 lÅ›{Zt j=´a›ð¦ÝÃk¶‹¬Ý1¡y_â#º5lÎ cˆ‰¨^¹J׎°80¶'©ÄiοáÆ«†)CŒ;P„Eá|‚@€JÞYÎ Â,^`;„qcÆrr%€ô¥p•*T¬V¥*ŸÜsŠNQ¬–9XPGí#ñëèlOª8a/& µƒ7UjÔ H•ºt¹Ê]·Õm`c&]‹6]j7˜Ù¹×ô-ç·î9¡rãˆýG4ìß¹û¤Œ}‡§™Q0jAîÑa÷üô'[d欺õλî[0-xRxxXÓV-œ}jÕªå.\!Y¾dÙRìú(Qœ·ó6iŒ÷’ð~§^šA×kЮaÓ>­:–¬>½Y*-#uá–ª4º×âPP°Þš·mÍ1(:udg@ðÄI³¢bfÇ҇Mƒø¥Š/1kŽC†ƒp°ð¦=*†p°™Þ3×9/ˆŽäô¶Ûw {)‘;ì݆¥$ƒÜÅúÁ‚3¿_¿qÜØIèÎ|â?n Ÿ€œ!%„Ã…âl>z`  ç¸ ™>­qP³*UqÖÂhà¯V­:˜#z›HFþ0kPð%y™ÀøÁË”+›3÷)#„=fâôé,.ìÛw(ÞŽÚuÖ®Ó Q`“:õêbõìÝC‡DF’vëÆŽì ö‡Ã×#mÏ€øˆ†ŒÂ*ZXXí†õ«Ô¨ŽŸƒbkÖ­JÑH,?Šul‹vùç:wêÁJp£À âü9Ï´ZõÚÀÛð£ÆMÏ óÌeOw­Úu«VÃåP»îתµ6b{R›J«ƒmÒ½[o„¸xz"ú „I„=†˜ÊÄÖĺæ¹/‚¦4‡êaùéÓe)1z|xЫ{·> DñbeØÂ96\‹¶fÃAI“¤¢‡íógVE”Ð*TÜðIèèÃÙpˆ.Ǻòåä“A jΡ‘B6Ž÷‘‡ÐnŠưÿ(M`F~O¼Ä#àƒKºÀ’9JC£ Ê@¶à%ÄáWòÏB^MÎïì’õA8PmÒ¤)à¨fÇWî¯f„Ó™îön›_¤É?; f/à|%{'Ä»p‘¹ó1ëØ0¾ó7Š`úpÎ2’ž#Œ™Wºà|«Y»V³â•”o0»anq³þa :u¬\¯~åêøëÊT(›×Àä-š«ÿ°~ÊWÐ}ļ°y‹b ›0tà„¾5k–Eb¤È™¿ÕÀŒÁ±é¢åš:÷†µÛ8Êäèñc¾öVÇÆÍ³§Nß,°q­õ*Ô¬†ÿ¹n¹ÊËÖV±ñ¼ýçõ›^·cd›¾mª×/_¬d÷v9bƒè*4p…à©ReJs6çòa‹„†Le¿yŽlÙS¥H‰¯£ ìÁÍH'ñCà0t#œæÌì,”)KH'& % Ö|6±o|ò¨V±|G¡8‡Ð'Œ§(›G9ýZé`~.-jP ìÅÄ|äªT­j@ÚÔå*Wk[¿yÍ¢ztîY»RÕÞõ©RwN‹.óZtŸ\£ÅÔ >MŠ–ªÖ®xXl¶˜9Å¢T˜–ð¥ï­ 5š´ŒŽŽ½aÁ„™Ó¦vìÞ„KŸ;w6¢­ò¨Xº<úaCí:uDçÇ#Š;$onŽ[Îíl7jß¡~ÍÚí5kX¬ü¸¦B©®?Öy@`™*µKU7tØO@l÷¾½‘]xMІuëÝ{ûQ3ð Ìœ>-‡ »R§ÏÄK—ðF‚[†p¶_ö“#ALH"MäÒ y·€ÁÛÅ©‹Iùöö·!wZB u0ÿ¹ü“¤Ÿ á0ãøðp!vóä.3W!ÜÑc'8þnJèTάb}=fö¬º ð+ûðOÊ›‡´B2W4$ ¢_‡(ħçïeJÂMšxkÓ¡³D,N›9srØTö à¢ÄÙI!ÿGÞ}€Ùq]w‚#@DΩsN@'tF#5ÐÈ9çØÈ9D A€$H‚9I¢•©dK²,Û’mÙ²ä4;í±=ʉÄþêê-F2µ;ö~+kù¾úª«ëÕ»uëÖ½çòQRDƒ ”ÐRV׌š3{D™7wQJ’K|jj§MŸ“F8壶nß²aãú}öN™6Ù|U·D+t§Iá‘Nw4ÔÎÍ)‚Ióç-¶×š§³!îPaÖ@²eŸNµÅïkÓ¦MLhÄ;zE*A¬ž+@´‚pÄÁéÓfϘ>6´Ošn“ìnäˆN†t§.ýÉ@RE7²BEi匌‘)˜Â%è’%¹ Âá ¢Ç.0ŒúìßB r¶DVc93Ô°¾Ev’˜ôé3ýV³p3p~ ់ýVSDI8=ª¶Éà,\°tÁü%ôÀzÞ€\ gB8£ä”.•†~‰6ŽÐ&ƒ—{hÜf„Kç¥ ú¢ .áiÑáè-O݇.=ÇOãÇ︳«q&jÓuƒ:Ñ6D%ù¹y´^Ü Ñ²ËÙ%3—SÉŠÒæ+“W.i»·zÚÞ¦¼++r cç´©rá/^4¯hd~UCe}íèü!%Ï\yaˆm÷nÜ´ý¤1õ}{ôét[¿¬…[º:wûÑûl9þ‘ø±Ìàôé'.ËÊ™_Lá™WR4iÖô¤’@^1nYî¨GfulÊnàjxföšI#ë p-5u+t®`ÙKê9®>ò°cŠ¢!ǵ•Uܰ;ßq'Õ¤ ãƒ7¡™ ¿Êp3‰èìÄã?¿`ûÖmÇ8¨?ací£“$±Å>d8ûÚêg@È£>JE¶sË”ò‹¦áвÖ,§•Y™Hd@V”×2~|ciÕÒI³*‹ÊÇÔÔ·VÜ¿`Í¡Ú »JšÏµ/ß?eíè }‹Çf>{ۮý7˜õð‹xãÆŸ|ïFßaÙ¹Ùy—älݳ[$«§|Ë uí-ê{xiÀà Žwø~hJì¦5òñ»dV½efËìÕZUÓÌ‚šCn˜¹«º}{ûü 嵓F5‹¢c;`aá‚N,'SÕ*îóÜõ§vnÝõ÷ìÚçÆuº½óœ‹M-ö¶˜céì91Ç¢’öˆ»‹Þ£25«(”úôtO÷>cZÛŠ ËCFIÁ’кÅ:±äË$n‚1bVá¨VQÆ*Kšûײ;ïd.Öü°?ÁH­éÏäö3¦Ïm›0eÈàÌÕƒƒp˜ñ½¯T ǵàS;øâf5ì Âp ‰ÈÁ'· !ô-èŠv`’ ¼#WÚ³œ¹ì‘ä`•G0ÂØ·DC v¿õ6µ2á„ ±’8¨åE‹–€7ò+‡S`*GŽ2ÂK—¬´gòÔ öÝÈe .XµžÑ#L}*ÍÅÐ@8¨Ò8ÄíÞþ3#œhÈø6ÿÈ øs2\ZK™¸½>3ÂÝÙùnðFE‰ÿÃX`Ûéâ¨æUáVGÇe:ñS|Í—4OÜ>zƾ“ÎÖÍæú± QQ5'3AÆÐŠ.x%mSÇÞÖå–ù3ôî<àïþøÆMÛvݽzÓ²EÓ§öéÖ·Ó]ƒ3×ìérâ­GÏŒ8xñkßO2ƒ÷Ç?œÚ6 ‚®˜»!0§´hñºU@kךŽ1C nͰš'foÚ_5ùÀ„„KL\žW¨vOs}Cx~Y­85Ï^|ù%i Uû¤”“ìÑÚ£tõ‰D6 cÔ fžF8°¹Kœ¤$º]¼ uàå.^âdOb#·‘Ø€l³¯®$gÖãôV4-„£Ûr°„ÞÞh˜R‰=,„@mà€Pö/ø±ýÞƒeµU"¯'jžÐвmùªÅ5Í»'«m?Q7õ`óüUs'YZ·tÏíkwõ¸÷üÐ͇Î}öþòÆüÎ7ªëGK]-eÛÚ5›7¬W¶t`V&µg—ž½y äzwªÀ'ƯJŸñ(žWÉ!ø* ¼¦¨¬cú‚Y…µ‚=`ì¨iß0fzIß¡kf/Ò»_‚…ÍM‡]Û±¡K×»DZõ¸»Ûª%ËN½7Ô¶’¾¢*.Í[´4Ššši¡¥ l M¸óáT™h/S:LSô©ç^$¨üZj)Cb­L†H'îJ§ZþEœ{+ncÇ6ºÊõ먊v0¢ôí30d¸HôB9¹jÝÚ-;¶_»þÄÏ>-'MCc3Y$•ý#QdÙ$Ò5QOÂó¨?"è˜k¸¯ø[’á~òúOô“oݶC™ÈÇŸxúC~ ÂM•ÜkÊ PÈXÌ„[éŠì·!^hÓ]8ŒPZ@8Ž!M­cFß!ÿÎö›vì¸ü¨`•s‚ðêšÅc3&I¶ZÇ6·´ H×rC} 8![@&ZJSSóعóu¹ëÉV¢Òîî½»víÙùá~Èž½WbÀ¶‰ícÇM;N Ü’ßȵ¤[ú7í â)å¤ì.r^FxáDeD‚Z”=œHS¥»…ñ M¿«Ë=,‚žÄJ2\lÙY<3C†£w§pYнÂ*ê`! ®š"§PIN+Éf”°p¼v"”Ñ çãéã /½xA®ô1"þ¡¶¾‚X¡„”:Ò>Ô˜¨0ËY˜ã4r‹Õojþ¼%åeUàM.bƒ¢·æ²h“g ¥á â2é´õœ|ÑëåÈ~S€K#Ü¿ƒåüë'oåi¢Æw¸´¥“R½•§‰z&îÜ}Ép´”L¼>¥ÔÉ[h Õ&Oj§”kŸÐ&EFâ`)-ÀضŠ^C:ê&¨œ|_Óü‹ã—îl˜Ö4¼pÕüŦ–Xñ­cê'e6eÊœöÙwuêvúä¥ Ûwnسiæü©ëæ-Ø{x§%ý6ìítôômGN¯zú8Öû?üóoΙ1³²¨tÞÔd£–‰ã‹kFšö“ê[Æ-ZœUýðôõÊ'>4míʲ– %Õ•5d¸}úŠ-3¥EyS–Xèö?úÈ–m[—,ZL¿ªu{ºC8³4¼ŽMZ¯È…€•Žó€ 0ä9ÎoðúãO<ÿìsöŒ‹j§‘ÛਃpþÕÉ(«ê œIå¼­;·ÀüÁ9 FP¬õÁ34ê×,Þ¸Z’ä#;vUeæ·jÊïÕIUÓ†²Æó-³OÕÍØR9eCûša¹-£wÞwÇÆƒ÷?V¼óÔ«ùÏjýþXðîwtÙ±víî 6%Is×ÏÉ'ÀÝÕ½„K"ƒ³ÂXÍpjUwO<ŸkªYâûõê­4DÅÀÌ-ms¶6LÙ_7[,®.«hDFÞòy -ÂCßÁ.…W»u½[îì>÷ô¸võa:[`oedeçKB”¶ÃEú·´† pÔ’!à ¾L#œË®?óO“$ÈÔiLƒ›·o“çð ¥mŽbð­ w‘ázõëËÍ„K¤lX2‘È$§)ˆ¢` •cë˜ ³ç,¸åÖ;™ë8¤‘á¶ïÜÖ±iÝ—ïŽm¾&e)‡ ó˜Ú"ÉM?¹¾®…ÈE‘ˆˆ/_¶}§'ü7Ž4²ÄZ„XÝHO®ÂÑ’àÁwt] KË–®ÒÃÝü¼Hœ1œ/Öí´©ÞcÈLV” Z2µŠ(h*¥öI|I`µl´!¬2à4ZŒ!<ûÁÂyNœ<£Z$Ÿ9þ–ÞŸ{‰®ñ¾ôl}E{ ç´é]G™qÜŒ_iÙ5ä-=!.\°¬¬´Ò°x(„Ó``­+á= ‡xò®%ZJt ¶4¹ipæŒ-ìp¿ÂÏ[!.BnÓI)ñËŽYûÃå$Lt¡&Jœ¹Ï]Äyó4pøñâ’ Â7„¢1È\ûôêÍÍ„0§ œjœ”º 9³fÌÔ½÷¸Â‘»ÇϽԾr{Nó¶ÂÖûæ¬[Õ6#oh†úh·jÃõŸ»`:¤i®lèÛ¥ÿŠ5[VnÙ²|óêKç­™½8sxéÕm½wétôDç#§®}ùOÁÛß}÷O¼ðìâù jËFŒ­2>†Š²÷°A ô–óG4o®œp±mùÂî'šçi_¼bÂt¶+‘[U¡áIíiZM®ËT”xD®"níÊUTމcHE`#N¹˜ 6¸_D¸ÈlBD“}ø¥^|ï»ßóâó/¬_»Œi°¹Û ‹=Ô‡srõÑ‘°ø˜ZZHd¦òr· ¡ÐLcc'Ž«o]Ù\³aÙòÑ¥#Úë›Z ÊV×ÝQ;áHÙ¸]ù­{G/:¶ùtfíôÒ­§ú½|çÖ{kvùÍÿöæŸ ãrs ûªæÍÛ²råZ™âW¬–w­°l$ÈÉÈÉ¥ŠpSsànFKá%z}¤ðö)“y x¹²ô–õ>«¤î융Ë3kŒž½iü¬‹W·”U-œ1›NU’£Ö¶ñÞ -%æ@lOÏ®Ý.¿@†K\̧¯E‡díRžâf.fZá¢ÜnRéûDR^ ­*‡pd¸_K-¥ÅžùΦ”Zoð« ]Ù¿ùA¤’‚“ô§À¬C*ºu›ˆn’ œmÝZþÛ)ÐÈpÔtò•Ä ¬ß´‘ N€¯êŸÔø<Îq§Dæˆ Èåd˜v8™ç\¤–w-e¯>½£5bÓ®Ý{!cTÃÍßÝ­»z¸xùwïÙƒ’÷<[Z‰h²¢Qœ’¨èå#ÃÕ!Ç´F¸^¼ïìêŽõe%Ô‡ _JjOØÉn·xÉ2ñÅkVo'À’>­Ž¦¢mò¬ÙóYù£èxÛ³oçúŽ5;vme6’PøžÝõŠË¨ºÝ{ôadj=èáÈ(@Ý'A˜‘–á‚ z#°àEp±°éORŸ[©*EàQlÒR²ÃiDƒŽ› ‘ùJÚrç‘Àˆ5ìp0C:YÂÓ^k<3ABIêÒ£ r€ÜŠà"&ù2ΕÆ{!:æ1W‚+2QÌ•4Š®ñ¾œD=Œ—H÷+?÷ºS•ÞðŠ©1CT â—,^I†[¹b­öÖh)¡&úÔ¨¡#•6„N{š¤ιãÏ!Üç?ÿ…ÿœ'â¤á£C)T&¼"©Räñ²ƒ³ç`=¹pÿƒŽö»¡q4ÞÂy}†á&ÀÉ,•ù®mÛ±í QÔ¹L2›Zw/\%wâ¡Úig›æ³¦k¬¨<­¶oL,å´ö6†¿Ö1KÖ.œºðÌÅ+«¶oŸ·ZXÍ¢ESçg4ô™¾²ÿ‘û:?Ýýðñÿå?›2/ì;vDu¥æäEL²Í™1kÙ"F¦IM­cgìkžy¬~Ö™æy'[æ‘<„HÂõËVʲ¸qÝz³1q¤Z¸wˆþJ1µc×N°Ä×_^;B ÷–H˜ÀãÝÇÖDî®›òEÖ’HŽ|úä©w¾ü޼ÿÕw¼ô²zi° R¹@8FJg£ËrÂÌIoÜLp~‚¬…ž°¸W„œ‹5’çÅ »õ†-“Ïœ±d–BWãGÖÚ°¹­¤rפ¹÷ŽŸóàè…Zo5»½yÞ¸÷ÝtoöýÏußvzùÕ—TyTxaÊì…žKú{wï\µ`>ÅÅ’EKIT-ãîéÕ7Éë4dð ]Ý(N:D·¤ÄÕì9<Øàé™iƒˆ¶ãêš¶,X¾~ìtÚæ3“—ó¨\Ý2YÄ÷Œ–ñ÷;éE³™8Ÿ«Ò¬Ÿ“­åSÐxJ•É{ŒË·LoÎSª"˜§ôLK#\¸òÚGõh»'Ÿ}!vùßÇ1þÊìpfT”Ê™¦hbª4Ê[SDŠ/å×¾úuÚHD?r›äÈp)‘nòÊá"î;ßý>Ž-`@q‡CÇï•&ÉB™r¥KoI*¡p «&Ž~ábѤÑB1}5²ªfá @Š(iÑÏÞw†rcÁ"²ÇêK…ô&4øQÓ57]»fãâE+€á©®¾Y¤9ð#“·Öñã6mS·}ùÚ•÷=paË®¢º8OC_ž$«CX¼ts žEKäù]B\¶:\Ñ‹.Yºò¶Û烙Á ó¢\³nåÆÍë•û\²l¡è;ÙXÄ$Í%ÐÍ[¤Ü #%-%E8]H*: '¨ïhÕ°¨I¶ž™3Ó¯ÏÀ9ª€œ`„ ûÈpòÂ~¯\±¼¹Âåê±há¼Fï‹ ÕgÐætZJ:M‰P“ºŒ?QÀ>üG@„0@(%Óß`*CI½—3¸B†ƒ[®xNº Àh ªÅeNB/¯Ø•¤®èü#£'…s–­p½÷ ðÈ«®ª÷8’»ñ~î¦Ú„Ðd¸H0Æ:‚8R愎®Ò†Iˆn´‡v‰it}Çç>÷›¿B.½”nVŠX\ñ—ߢ¥¼YG•¨. o‘r"WRQ*3 9› ž-6†@o½Ø'É£êrä 7ç^¢·Ñß61HÆÌÚÑ+«Ç‰K;Q?ëð¨éÛ,=I*Ô„ð¨Ø´~Cnæ°s—NíØ¹qý‚å[Wn:ûÀCH¬Øm4w\ã¤;ú [¿¿û¡sxð[½¼š ÉÍ"9±eŒÜª¤ŸÆ¶±ù•å”üª„Ï.o83}Õ–ÂÑ÷µ.<3~ñ¢¢z­$ÉtSŽ0´” ‹7£"TÀô¹øÀ%ªhªEäX©z6±}xº¨eCghu„Þ5Ѭ¦P-‚áÌ@˜Ï—œ9uú©ëO>÷̳•páfb( Ž1rÄ#f*£$߇4æƒ7M _JZJ~ŒGAâè!%¡–«XEŸIã¬]’Q’µq媚¼Â…ã&—ô°oæ’ #ÇÜ×0÷PÅ´µµ³—/Þ™1w}¿'|ÀÎó×>ÿDz ¾ëCŸ^²|Í¡ƒûçM›|lïîE3¦aë¤èãð|w·^8Ñ$Z ¸hààØwä ¾9=g5'¿J. üüÛ\=ª¹°böȦcfhžu¼}©ð}+6Tf°nê°„Ë,èɰyž}ëÆMNHœÔöÄbþv0õŽ»º‰"¥…z<´âÁc9ä‹9™«œ:wâìJ…°³ÃÑÆýºÖø"ܺµoŠqp ˜ò6Ú·…/e XÂjx#®q%ô"G²“iÄõo…¼•F8g¼>ÿ’ØaÀ2ÎÇûu_Ïç¼Ö¼_¶:8mˆ`¶ ÈUUŽÒ¬ö!¸ÂnûD.Œ@8ö§_k„ƒUa„K{µ¡#4H‘2r— :aAqÎ_|ˆ)Ž–R©J¾”Žì‹Úc5x¢Ê—8xà ù/ï•K—QR9F÷™ ÏšÛœS*Ûò½£çŠN;9fÁºÊq³ëƬ[±J¨ÀÈšjÑiuÕU»nŸ2}ƒÇÏ®lz䉧g/_>yætšüêºñwæêÝq°Ç±Kw<=íÙw&Ž×¯ßøô—¾XÓÒ¸lÑb µ}ýF3ªuÊÄþÙÃEeqÄ;¼xCåxØö`û*‰TÎ.ØP> £®¢RgÊ‹KdÙ %ùí¦Oc"´Ï¿øy%ªh)õIï!Z€cT8î£û`ÆÛð¸@¸ˆZsÉàß°ÃIªùÈÕ‡}øn™PùÍFbi˜PGãg¬lr©;£ ΉïÝF˜ýÈp´$i)c¾É³zàÔáÂÊâõ+W¿§OÇœÅÕƒ²G/Ú;vÖñêé§llY4wÑö!Ë·õ;x¾÷þ«}×ÿä_~ûÛ?½ñò{?"Áî’Åó§·Û¹I-àe’Í«zU^Rywמòò "}…ðJñ4ª¾Î‘)gL›Nwê_–˜ kå‚Å˧̚˜?²£iÊ©ÉË6ÕLÜÔ6[´@kEÍêEKIœk6¬’•Áì‚aØ2×._Iš5aHy'Ðlßzç]k;6C,Q˜f_˜Ü"làf„ Í$™1?×òíˆp Ф°-‘áˆti„1-o^ho =x³©]töâÊzžŠwߨw&°¢8zTÝDe•D@Q@ZJ¡,2’hŠ·pñ‚Í[;.\<÷®÷¼4ᜬœáÝ{ÞÝ¥kç½zÞÙ%Élà \Kó„õë¶.]²jÕÊõ )vø}¶˜âÀ[’}Õ2 ·tÍÒcgNð¥,­ѵû=tÙáNÙ½‡°œÞ‘¥ ¿–СÙs\llhÔ> ò¹ØD\º| ²¿iˆÕë–?ýÜ+×,Õ¥{zt“•â 9HT”Ü)[~^±A3Pä!S–~[N¼„o–á$¤P!ˆqÔôµÞXæñ¬ôŠ(;d oIý¡ötÜ)áÂÓ$-ѽ’=pàrHI¢ñ‚Æ«p†Æ^XD¨0‚ƘhG™â \ä4p^È‘À`8W!-Á!ç d8'½>ÿrH }cá¼_òüÓ ÖüJ#kVwÐý®^µÞ9P­üo‰hQK–G@¤ ý7.lo¿v2\$O §5Ç“;*0N&ÁI Tž»¸gÿQ«n÷óm-î¬ÆÅ\T"~pï>š@”v‹û;Åàü¦ ˫Ǟn[r~ÂR8wnÁÁ Ypm˜=^yaqkSãìÅ3Z'´jöå)›'®š4¯cÐÆ=ýO>Øcç%».ÿù“ZÁó-gh\²x^mUé©ãÇ6׫K0µmrQn‰ ÕÄm`Xû‹n¥Ò§¹©¾Lš!ñmôL\l0SZ—4¶Ÿ»FÒ5·qÂ,kç,-à)\ÙÐÚâbѼKT²U¯c<“º-Æ‹‡ãK¹nã–°˜riwÊP='™¨(Ï$Þ(®ÄrÉi‚’s6 ãßñùõÓR²·¡Gˆ5M ]e œx82\¯žý „÷#• '3}ñ¦Ûxpíܵħ‡B ±Û»w?rÆfƒ>B;}Dpqñ³S­½NEI%¸M^¾`朩míc—­X `ŽÜ{”Ï1ý§‚µÛ¦B¸ ë·-_¶õÝ$Ì{B;•£˜R<³/_³‚¯ÌâU‹wÜ5{áÜ™óçÒ¦Êvª“ìsëÖsBßJ͸’…©t$ÁB÷‰_ŽCNö¹N·Þ¯~Þ‚Ù»ölß³Ǽ…³¦Î˜4wA"Ïé~Ž={÷½÷8…@òIÁR’Z“2îép‘#T")•`bŠÃZÊö‰¡‹}–ZÆOÖRjMˆ½a§8Õ+Þö¿ˆpßûÞhA @Òš`‡ñÅQƒ {At±&p›wlØAm´ºß΋Åcøåæ@hp>6 è«@8ïÎku’¸æIAfá"•I@ ùÕ4‚OÂ7¬]ÓÆ]ÕMýÖMµIýÈ^âc%3–ð¾EÑÒ2\Ü4•1—~-´”{ö ¨M|µÑ” 4`ìÌù‹é]Qs Œ%®‘µk÷¾Ã"¾1Þ½e¥’è?¬8‡õlXudk O Î#Ä ÿ¢˜r^,7eÓ˜g§¬xbÑvYð77M=¼vËø–V–añpd ÇW·TÍ]4[›eÓÜsG2¥}jsÛ”®¥µƒ–l¼cÛ‰îG/Útì3ÿzãŸ~bþäà±Ã¬>"¸—Μ+ð@¨õ]}{*ÖÚÞVÁ™6§\…—‡ætÜ?uÕé)ËÍ”õuF[s+wJJQj8²/@É}öT8ä)ä4éݳ×·Ýo"ór¸~àÿHraƒp‘O2d¸⊊™»tCb1(ä6¨ƒ‡pa„sAŸ˜K”ŸÌoÜŒ9æä´é¾‘9Ý|³*M%e²ÙóûÈ–5oÒ¬¢~™óFOY=eÞÁ9«Ïµ-¿¾dßöZç­°ó`Ï“—úï¼¼ê©Ïüó_ÿÆ·èÔÝZwðð…ªZ›ëÛ8vø Ì»ï¼§ûÝÊ lWXVDKinƒdŽ!üûéä¥iΠcd 똵˚'훺øè¤Å­ÛwzåAôª¼¼Â]ï"sKÙ¬ðé}ûE|¿ë…—à¾ÇSChŠ)™—/_ÅÆê¨k¡‘1nËŽÝ!±9NÊŸž9Û"®€î|üÞ†‡Á„ƒsa‡£@K#Á–·2¬_·çÀ~éÑ/^¹ÌÜÅSQh—/r‰08d§‹DôWȲ…àZÆ0 bD%¿DÑÿôÏÿHE)…ÅÅï»tùÜ–íë›F× 60)Hvë-ÂAhG™¾&¶MÝß×2~ì]÷tëÖ³G§ÛoãcF€ãµBP“²¤¼¬œ£¿ÔhÄA¶4…Èe_¼£ó’U-X4—‰j÷¾í S<|íòªµËT¹£³˜ï[ù‰‰C¿ãÎ.²j‰‡ƒ‘ü_¨:ÙáÐbOÊè%ãé·„ÒGM¦Kæ%¹ y°0â(Ðýð%áËjüÉpžN¯dã`9lhÖm·v;\ +o ûÖ€ìDp”Š2ª"¿¨=Y=‰È?C‘tµï+?OY»|á\“ÒGWa³…I dz.áâH\ }#„ ó®Ÿh6b×¼Ù$éÔ´¦-nÊq)á“ð~«}m¦òk'ãù—áäV-Ž) +` u%ާ‰¥V ?”û.>èØùËWãlB 'H†k®6æ Ã8E.±qœ“ÃBøðêå+Ø¥D•!”# KšóË/®ÙyaÆš§–l×Cëö´–T"‚»öíÅû«’:{ú47{Ѭ²ìü#›÷Ξ8mÔÈšiãÛËêZ:•UÙ~èöýçï>p©rûýõÆ}ãoÿðŸ›Æ43oXºòøÎ}Í•µœ*ædÜ3tÀ‚•ËF–”µV>¾éÐ…YkÏO_}mõžÃ³WŽ)­b‡£moªN'yøòóYÍÙ×)¹©+¡(KùÙ9…˜u¡¦é¤3D:8JQíÃ9óÍ’”ùÅ2ä¤&'íÐ~Cdz~îÊËÇV6]ÜzäÁ9[ž^sl÷âVmxøøí‡NØ|é‘ßúF¸~èc,;önQ[üðÔ7UÍš=•éÈÒÊÌAYõÕýzÂô³¥¢zÓÔùo?zqÁÆ“3V¼­bTCQÅùã§ŒƒdLs/¬¨ª${ØÙÓgœ¾÷¸jsJ.ØyùÅòRnÞ¾Ë첿tÙÄ3µ WL6H&ÇSÌF'OÝw1ìp¡ÆäK)!ð¯e^Ê·§ Ž BY½jx³!RþE¡xy@¸°Ã… 7cÎlžó-·ûà~†.Áüì(råÜrËm6äÉ'rwñ@!+ VAã¨.a€P6 2œîé³&oßµ¼-Y>oXæ€;ºh£Ó]wwr2&/]¶jÒÄ­-í›6î\½j#IN¸ÿ~‘mìpÖxS Gò{ ·mïÖ³—ήڰFN0)N@# Îuº•ÔÆdU–јJÂÙÏ™½PLÛ,89o.Õ¨ð»qZ§Noß²½c×ÞmÒÄÏ™?£¨$_ IßJ+ ä8Ý®(*$§•ˆôŒžŠÈŒŸ¥¹á€½-eT9ðmÄö²»À9zHg´a_0©Ô”<5ˆ>¿ˆpä0v8–Kˆ5Î’¦çA#6#UG¡<K‘O<ˆ¥q Ì ™›Nœ#½¯Tùô‘.Ëæ'Ž#!ü>€Sˆk„Â4¹….…ØçÍz"`ZšÇyœH‡‡Ð öµ™ºcòm†«kIß,Ù*¡&u£_„㉲DLRºL×ý^ÁM_¼|õÒCûÖþòÃ×?9MÔ²ë‘GŸÀËKÉ7•)N”aïQVÎúB¢’Á}ç­·9ÃÇéT®CIè/®ßýĪ=ϯ9puá–‡;öO¯oíX»N=á1[ÖwT–—µÍnkjkž.бÅQÝCP*Ÿf+÷#E%y7 Ë=Ýz :$CJ ¯åX¡†ý7î;ßùÞ¡CG>õ©OQTZÀIÌ\éýúÉi"N#”ÀhEx‹gà©A!>…àåÊÀ×x5ú‘i„f…ì½/¿ Ì#¢ÁHð2¥Ÿ@¸È9ÝÝæÑµJNmòD:o¥á|ëŽÜÞ|p†ÈþßD¸à~]îÞc§"¾{Û®½’£rcsŒúÐU>xõÑ+>ŽúØ;F6lÞ¶~ã¶•k:¤H7<#GÀ€8 gï 0} ¼í!Ü€~ýÅ 0»&éüÇ´ŸXÒñÞ=çÞ·ýô»wœ¾Ŷ%mÓ(›ÙØášêFA¸†¶¦më:fio¯ii«in*­Í«n¼sÖÜ»»ãôµ{._ÿôßþð ÷ú#Ï?”™—ÁÌS:,ûžNÆVÕIšGK¹bÛÆì²"„µr`ÖCö~êÜãïÝwþú–#;ö@¸Ü!ÃK²ó¤\‘—’Ì$÷1Ê‹3ácRVQN˜ƒ@ȱhåîÝîÔl˜âHoæmbÿ¬,ÆH¢[5åÃÂ-%ôbv¢§5G€ù@…X©D‹»z À‹rZÿLPêvªÄãü‡6=:LìÔô)³ïéÜ«Ûí=Ú&-‘]Ñ\7ú©‹>»åäK;.œÜ~jê¶½ŽÝ{Çñs#=õG?¸ñÏ?¾¡“K—/ž?dYÇÂúñÕåµE%åô%ù¥9Csû÷ÐónYºúâ3r‹òHl“¸©%-jÀO­ïÀtè°Í#kvÎ_ñôÞSïØs楽g.mÙïµNo7¨gÜ0ƒN„`΄åëV­.Í/$¦Ãx1•=ûª€*â{Ó¶ö¶Uë:L<ÓìÑ'žzè‘Ǹò?Þ(±kNnÛ½ßqWŽ–’ ÷kñýG8Z2ðf#Æ GvÇ6O}8U¿ÿCo‹ÄMxbè:|ì^h7fìøTüe#0T.*ˆ#—Eª3H™H›Õ¶˜Îq|ÛÏd¸o÷;d¸½º1¿y Œ Ϫ­¯¬¬á‰RÚÔÒH -¬[jfZÁ1­“¶lÞ-•Š`†E —ÓOH¾œD)Ìž¥˜xNa.å@˸ыW,Úä€`††–Ñ P]Vù½ä@Є‰Z‰]EväCX¿a3ú¢pÏ‚…ËÆŸù¤ñî|× Mõ™Ù}û÷jŸ:aû®ÍR]ꛤõuĻں]RÀsñ$Šc#É­Z˜ „“{|©PhüÓåFã°™?xéŒ9 /I9ƒÖC\¬¹LÐpŠ'çæ-;Âj%0NpžŒ ""x÷H† ÒZÊcÇN¨‡Içɨ€àIQQ5uU#«gNORP’“¶lÝqôžK¯l²q†3ŽÉaÒ5ÛwìêØ¸Y-1fHÑi„#iA8û$TnîüÍRgA¸í;C!9~ì„ÁýÝP8áõ3§ÌX0ïM„ÓšM™1Sù@jä ^ÖmÆÙ­á´ åä8a%ÿr„ —Î_ -% BP:¶lgAn¸q‡ì=üØõÇŸzÖþ±'ŸAwXæ$[‚püÎŒPˆnBGz‘Ðy9¹t’ˆ8Ï] APv®Iðƒvzþ´™E½_Ú°çÕ×޿ïü+»Ï¾ëØ¥ü^ë¥;ol”!gbÎôsóG×·.HfT}iͤ‘cŠ««s+úWõ^·ù–Ç»œ¼ÖwןùÖ Ii~xãõµ;W>HÍ—–ÊÚw÷¸kü¸1wt¿« º¬mÆä‰ã$ç¨|hëÁw¸ïù]'Ÿßwîäª-#3ó ²rjq”ƒ±¨Ø«dà ‰u„m´yd2BâNôô,X1¹"MTÚÂ(v8ú|àáci€¨Prð4!¯Øô?!Â…P“H”ävQ£yBñnçöüï5âŽÔžd8šI¬€;¹¨ ä¢>Ñ]î¹»{aVa]ù¨½Ò1.Ÿ¿ª¡²yÉüe:óî÷¿ëàCGöÜ_·ñЭõ¸ÿêÌKïRxá÷ÿäoÔ¶nåÄTÌ“÷® Tâ®gŸ{~÷©œyøäÚmåƒ2uí!ZgÃ]eb{›%5Â0dþ”­¡®±´X1güÀCÛn\¶ª¬´Øµáç"” ãE€ucô¥„ظi‹ø£d‚ö’ª  À¨6úÖeÕ5¬×4Šxãø ÏÖÂEËwìÜWרº®cëÆ-;9ƒÎY¸tBûT ²“ÁëD¬FVkÞ‚l"A°TVµg¶Y'kÖ®'³ò[ÁVJ÷l†mܺ̈́“?lÓ¶íIêËÆf"JB…SlÒü™³ÙŠ!:’`÷-dlIyÓtªi¬¿ãî»Ôà6wß¡ƒÌBÔ._ZZSYÛÔ +OØálF Nœ>{æu9_4’d6étk怡³¦Ìhjhfã*nóžÝí*Ï™-¹°$]1‹þôǯ'¾”S&KFÃavý–M+Ö­A=%©á»%î ~Ü¥å-,dã®íɶ]†—¹Ü—çLž–E†ûÑ7~|C­¹S¦+ÌÈÿQ }øÖù«–íÀ°ÿÞ|[m£2ÂSc¨!œkh,¥_êÙwGeª~¦by1ìÀ€øùI /Ê›2w–5ÒPQÅêvmÿÉO_{ñ÷=ú›O¼óÜúf.ÄÇI×Û8yšҚ勛žËßxpõÃÏüáÿø~R5à7¾ö'ÿðÂïÿ—{¶ë´ëô={˜ýôkb½!Üï}íw ”˜I’qˆ=åC_^=bpÖ`z˪Nž0®¥qúè±;ý¹«Ÿxìåß|ò}ϸ\]Tf[Š`S¸oø¤E…{ ±á4©„ìI–HZ<ÛâÖšØ;Ž‘ÍPy^ ¤™”{Ìê ®A ¸ÃðÛduãÛâã·©ñùcN+d8wÑ+JQ:I·ós'}`’U\-×RCkÞ Aù¥ÃÇL=aæTDiù¬Å¯=öÒg/>þìñG–¼ž¹ïñN'Ÿb°üíÿö/7~òcÌ>æ[H«îQr&xSF⬄ßÄnûTuÃnxM€$ÍûЃ(YõD'Šc„£¼M*!‹‚¯kR(‡áíO>õÅ'ùèõÏì¹wú¸)ïé£&QiN~Ö!5#Ë÷íÝ1Þ¬þzKhinà„ò¸i–Wgå« ߥÛ=à o ÛV¯ç$´JVÞ‡yô]ï}ß;ßóÞ§ž{þÀP"Gë6nR¸eûž¸.¢6‹œ÷vA8K÷Ïþì/þüÏþŠlD¯(nIáJ9c-_†4m&9É’%Ôƒ_»)¦—ðÁ5­±QpÎ8cK;¶î ,ãØ¥hÛ¸øÐŒiüW'2\*®ŽÀÀe‘†ÂY ¦¸ŒbZƒg^|dãå€`¯Ma+ŽM)zîÜ9ü;W8þÙsÑ ÚG`¢m“UYqŽ0ÏIT$¡5«ÖÏ™5Á¼ÅRî|T¬\ •-[¾ZÚ?Ä… ›ZIMð)3fÓãy"–Ð$Žå Ð¥Ò%ËiçÎÄ€$v⺠“3šò“–Ͻn¨6®KðøÿrëH!ÜãWù/þÖÉ{Q¿°²HE–ÔŽêÙ#3?—½'’‰ÿàî½{PŠ$'ôŠå#GÕ4´4Ko…pñTÎÉg;í½Òýà%£tãû?P]Ò `‚S!êyf,!„‹¢w¦I ¼aÃõë¯6¬Å|Ôöcʱ „÷àqEÊ‹Ê^7{á»~òƒ×žýÐãÏ_¿ÿ‘«÷]^;릚Â×­æÀW]U¡1 D¢‰þƒ‡UTÕæ—Tä–fçõê×#»{?‹ŒLÎëÜácÇ_|ç»^yßû!Üs/½ Þî=)üæ+¿nÓ¶5„ÙN—ÀV‡’¼-|)QÍ/}éË¿ýåߣ֫(¯â"xøÐñãÇÎÐö‘{¸"Q(`†#ó ŽHŒˆcð–XR¥"¤éÖ+1~Ún¿­‹ðþËVm°zÙš¥ –mcîÙ¶{׎½2úËÙÌs.ˆÔ‘#Gp‚ <3/Ehšäx#+•½¹N;¶ídÎaÈ‘ ƒÿf¹²Yê ,åöð#ר+Ic$9ŽE¥½zô½«s7Á˜\§ˆ¡žbÑâåð•ÑšÎÁ¦ÍÛ/YADUá™åJ¥ ë#+‘¸kQé’"3:[H$”Ä©Ñ8ïÝwÀ>)¾m‡Z;ìX°-•µ«M„ÙÍ2ܱÃêÉaË¢k°ÆŒ†NàÕUr ’Ãø¹$2Ж-r•Še«VZ˜\³dZI#\’¨ºcƒ¼ÆC$7"„@ê«FÕŽ¨ž=mVu¥(܆Ý{ö©%´º£cʬYÓçÎU¾ˆU’âÔcR™úðctG&Ì%ËŒå2âšQ,šË֬⩼jÃ:‚T+,/žG÷«{:f@˜ïr´†C<åËÎR²zå*#†Ð%yc seU#€j®Øs±M„6Ï5€Š2É?9I„F=+c ß$9¨F†óº#»æþý=ƲhH vøÀ‡~%Àö+Ã>rœ—š¸Œ˜¼po O÷žW?ôÑO|úÝïÿàG>þ©—_yï#?Y”À›¯ØTr KxT78ÇòŠb†K½0U¨‘Í–ÄÉ¢iôºùK;uáãϼóÓÏ¿ûמ}éòµí+×Ѽ%U¾§µWOS4uzÉÆã·^èqè»\¼{שþ»ÎÛõP¯Mz~ìÎ=;öØCñ?ÿ‹,í7nü·ü§}ü£§/>PÕÒ: +gXAa6‘17[.V*ú™SÛ3˜Ü:æÏ¿ã•kO½ûá§?þÌ{ÞýÅÕK—÷ìÙ°rA銤bEG·}l–7ˆb@8hæ|”6r¸ƒ?q@l¥¡)ñÁ\šÒ¾r’‹_çÍ÷rà¦fšI哆I—¹ühÜ ‘öàOTúÖ·°ÿ%Uè²²ÅQŒ(Ì?±©i"Ke%×¹c§ÿþG¾ðއžºöÜ{‡¯Ü×yû}½N?³ôÃ_ù—7þøw~Wî4÷ŠöÁªF /ˆ¥Œu8uؽܬf‘‡Sœ]­>?ñì1Ľ Ê À-hú„Ië,ýÌ{>ø¥÷ìýOpòì¹³îöÅ—^ýðGÞóêlïx÷{ªÝ©úùÉQmݵoÇÞƒQã;¼QÞ.géþýßÿ-¥,û²?òðãûè§¾ù'ßúÖ_ü-‡o1 Î Æâì‡ b)o?úÑO¾øÅ/"gäDnŽA š2sNmCs}s«¤‘¤¥ƒûŒ‘gkùº‹WîØ¼ÂíÞ¹8á()ëM‹¨õ#/¸Bn°â€ ‡nÐd2ׯ8ÙOž4eúÔ»·íÚÆz¶kïŠe+yUêgV:h÷c_çTÂ' œ³ñd"±ä/F”§@ãJöm¢ÜË‘¡‘g ÃM)ôÒ‡‹/]f9⣅¤V”.á4ÍrJTJ3m EÄ †‰Ÿá–íIðßÔÆ_?*É¡…ÉkKÇÆUË–ïß½‡‘<±/v¾S"vÀvëwÐ`(©…Qð¢;yC ÄuÂ03›  Ò2(rÌŸ¢J=§ˆˆ^½:ßzç >fMÙ 6z}SR[xú®Ý3æÌ=×zc®‡‰þÆ(ŒbŠHµPQèeùa¾Û&·“Þà.pø84;m÷3EŠK?ª¬ò.X6Ôüà˜k¸Å±Í·RÄrúâ\çY4…!4ðírFåhŸ¥À É%‰ÍjkèZ5NN¥ùa¥‡p¼“Øá€4Ï‹O|âS¿÷{_ûæ7ÿì•WÞ£ç¼sÉp&LºÜùÿ÷h÷V2œòO“ÄQ ªñÕæ¢ÍWÛ1`røÈkÔ•$9›3ï~õÃÏà·ßûês/½“ »k÷^˜tñ3T”ôí(rR4•é#PêÙ½µEsæm_ÛqxËÎóî}âÜ¥÷\nÓòÕÇ÷’Ök˜¼reE•ó£×7Þ÷bѪ“Vì|òá.çŸétøÚíûžè~/¸Ó¾‡;m9wöñÕ¯|üá/ý«?øÉÿ¡¢dª€ÎŸþýÿxí7ëêSÏ´OŸ¥ª]3rÄò… ÷lÜ*= ½w>þôÙý÷žØwD¦Ê 2SdÛú«¿ú+Y»Â!úQC RpáÙáè $e‡rºNà-Í'”–u€ÍŠcl¦Ì°ÖLNËß½hP"—i@‹:ÏïyÏ{üDkQU•à›¤û*+ÓDt Â…–2)h‘Yœ•ÏeàÞyeÙí³§9||×Òï¸òÜÅ {ñ½ÎÞ¶çì­ë_ùÆÿø—ŸÜøì‡_ŒñÏÿüÏ’§‡Š5bìÜ3S³Ø_Æ?+1ÁÔƒr3³Lu>“!Ôr­äÎmžWÖÖÐ^YA;6m‘ ëê¹û½Çç®\{øüƒk¯Ø¼zCÖÀ!9Æ ìÝû‹ŸûO½ö‘ÜœŒÒ²Bf?<ƒ '#ªkX +ªªϸ­sV7“è¥w½òÂ;Þùò+ïþè'>ùá×>äÞÿ¡“äqœ<'©ÀÇN-€©ŠxMvbn½IœªÚÿÏsšÈ‘¡¶Àï|åkð@½Í~à£üÀÇNŸ:ÿäõçì?ºwÏA±Ì"šyŽÉiÎCK‰~EÞE0@ƒGŒ˜(ƒî¬¹\68’ùfNŸ³wǾªòê«7®YºfÇÆĸÝÛöP6Ô5'ñp)ש(\Gj+Xˆ¢M0Ò!ÀCô€:•‚Ñî9Ógïݾ{kÇ8§bÅœYsÁÉÂù‹’zß)™‰#Ÿv8å¿&¥_ÏIå¶Å+À´vÆÁÎí`fìv\ÍÎý;·ì"eΞ©¶°åyœøÝÎBÒ0±ÞtÌc%£KXW–!îˆ\ HÛ¾u‡ŽMœ0I'áÀŒŽ¥I0ñåúµÇøR 2ã“u>|O¥ `ÌÖÃãÞC‡wmÙ¶lÁ"š_˘øÈ5 ÞŒpPá̹³-­£eqål‚=¤ëÏÊn’3oæÜꊪ溦Žõ‰.—w1¡èÎqâ¦ñÆ ‘Lue#…kh5²Š‹9ä(,‰¥Hü¶GÈeQÌ™Q¶C¾|-U£ê‹+¸pù ¨COQTô¿ ¨c¹º5²¿—”ËC_“_µØ¹|ÕTŒ¬«¬–êЯ–Íž//þˆ¼¢)c'T1cH^QXD" -%jƒèÙãúÉpàròþÏï`†|ð¡¿ú«¿a……|j Ä üU}Þ áä4p(HÄÛ Kbƒv\×('9g3ÅaœIož î™®\»N{IŒ84CŽÁÄRa.LG@.òƒ:’bÊ/Qxuqn¾·6Ûb7qTùÈ cÆòk0æ.\0~Ú䊆ږ‰Sû™Ù8øæ£Ý_ìtðr§OßvúÝ¿Ði×µN;.w=ût·cW†»<`ë‘’½'KÖí¸ï•=ó¡O|õoþ©î[÷ßýÑëÿßÿ¶¿Ò¯G©¤ÈŽòÏœAÖš'Ù/ÜÂ1 "#úÖbŠcº£a¡É¤–´šäüÄ(¹£{QºÀ›€7zK¡¥tMâ¬84³zDÅÀA½òK³óJ  \5´´eĘºÉs‡-^ÑíðÉ—ïÛqü·pãÛß¿qxûnnbn´oîöíÛÂ9H>äy@1„"Ë‹: Ίs(ËÎÏë7d´&„9:!uD:ªU4¥u¼ûÒœB¥Æ‹³r妙‰ÚÌž½v劉ãZ!\QanFÆ0¹–À$i~xvÖÈšÚC†vºåVúÉÇŸzú‰§Ÿ±=öäSöO>û œ=úI²Ý¹û%¸ßŒr/sÒžO¯•û¶Èi‚RüÖoýö×ÿðO˜~ª«ê®=zý÷¿öÇ÷»„ò¥- &ZÄ·Ì˸lå:ƒ² ôÄD¹‡Ha÷Þ}îìÖÍ '¾nÐoàŽÍÛÛÇM\«Äó¬ù«Á̼Ek–­âYÞXÛ°kÇîˆúŒÒð•'¡‚°˜M—Hm•ødÜr‹bÁsÄÜMž¾qåºEspÇž?kž¦¦M™¾~í†E ’RŸIfÅ…Ju7’áïʶIðX‚îyÑ%ÎN·ßz\ܾi[]Õ¨Õ¼–¯^½tåÒù‹ò8–„@;8á@¥¥ODžY3Ñ%맦ŠHóî{<Îây‹:Ölؾqë¤qe·Ý´n#*ÐÜØòfŠ¬Ôˆ=|åêý›¿=w欈ü–YÂÈaÐ&‰‘l$Ï]'0pÚ,Ž’J€ ‚‘Ã+̪Îx?}ê¿ý÷¿’C!e’§—-\:½}ÚÖ ››jÆ4Ž^¹d…^-˜=lë8éšl|àë’HO.þ %#FåèÜ5³gŸªÜ‚¢ÁÃæLl¯¯Q’“9xpîðáyY™‚’&·Od6¯1²6«PPÔˆ!Ùõ…åÜùšGÕ÷ëÓWU &ÝF²ø†gçöT5<¯vh^cné¸ÊºŠœ‚œ¾ƒly}ÖVÓ8º¼:£{ßYùbй¤çedɈÁ ¬ÊY¥4š÷G†ÓáO~òÓ|Ø~ã7>û_þËøôü“`ïWX@ç—T@¥“”0a{ëñp¾²ìE®ªÌ(Çÿ²©ÈOAtãM@ŒCâ þÀ Ü(L‘UÔkUb¨só¸0:pðoþê¯I6¬;gï;÷¥¯ü¶C%#+˜ë’ØðÁ™ŽCÚf Û~ø®ƒ—:í»Úiÿ<Õé¾W:{ê–sŒL÷wÚqßm;/ 8òXÎÞûG­Þ5{Óž¹;Ÿyõµÿöí>põqùò³2²½#¼ !BzÉûÏ_øÒ—¾$?_ãèV‘ÿøÇ?ð°ŸDL)T¡°¹·INÂ5ÓAYyÂÈ 4À’ ¼ x …"¿ ³\8ׄ¹Ž<äâÇ{ŒäD»@{ÿ /PQZ¶pŒt%!„à•#ƒ³3މЇóƒm>!Ã…àŸÌáY¢Ñ‡ í?tX¿ì‚œ¡ƒ‡µŒÔ;ûƒö·žxªÓñv}ê±à:þ?n©¨“Ô—}SfÍ9R­»¦ƒú°l™™Ãﺫ³$aîEß>ŒK,>eðïKgôJÞ ìl~iq÷¾½…ç9–9O²ýë?ý‘“ÇOR½íóŸúW^|È Ð?'cxÿÞ½h) r²s†YJol+,.À*D‡Ø2¿ÝwQ“DEI!yô„t”çBi Ø œ“!ÆA8©)M¶˜~po‹hýW¾ò»úÍoÑ×9ÚŧŸzáÊC×vï: 0îâý—¹SŠ‡ë‘ˆàýh°Q´ÿþßÿñĉ‘S,¡×8‹ í“GŽ%€ P^*|²éÀ®}ù%s&Ë_7vòè cå~7it}óˆârþãV,†.H$DdÜ–´”šÅ.a -ìÈÙÁµÁo'4´ÎmŸ1º¶qb˸±M­ãšÇÈê½vÅšImí ¤1 Š{ã`)¶Œ€.Ë´^ˆ&@4‰: ç,e%’é˜^µªP]¯,aÄ&ø tu‰„hça1’¡qùRj L––êIÃÈÚ MÉ^›€ÜcŽnh½‰J-U3V­¯$úlCÁF&™a¥kéÜÙ²§*”B"IUW×HÊ™Ü2¶½y [tõˆ‘ÊK ©Ñ+ý!0·oÿ{bÌøåóF‘™šŠRUÞÚ£kw¾”úc„Û['L=Þ3ÖTT«‰cÛZšFs)c#“Á¬–ñOž:ÿâý½üà#/^º:LÛLãYSwåÔÙOyÇõ§ùü‰½çO™Ñ0²Z^(L4þ‰¿µ·FúŒ1dý‡ºúÈ#×d‘¦ ædô©OýÆNNe2S\Hr(´‹,Ji`ƒg¾ >²Â…sаL'l£«$É•÷A÷´:Œ@¤¿ÊÉuŒ2Zq\~8 ±ÔNš>U:ʬ¼\!ªÊÌáƒú·–æ@"º`…0w½vËÉç:ºÓéç;}ì¶Ot>öX—½Wú}º÷žÇ¬?³ôÂ/î+¯~é¦-_? «8#·xà€a%ùÅù™¹Ò€Ñ¶U¦_±õcÇŒŸ6•R!н¡éá“••Õød $ý–ÌY<¿ ˜‘ ÄhÞu@Nø}ø„r2¼ùÉ@ŽC’KiÿWR˜öÄ5«×ÞÒ‹LÊðISdGDœl ¥ß2m¸†,¥c„*ûp3IëEß”Œ“ô1}+Ê‹‡ @rÕW1¬,¯°¾i߉>v:qìŽ#ÇÏ~ò÷”ÎûÊçÿ ³ÏÐÒ‚nP×ÉÅ sró2kjGÊhR’߯/"N*»!¼$Ã1ÂætÀCÑLÒ!Îäì%²a =ø±cÇŒÙä íF£M‘VÔ‹öóaƒ–“ ËJ Ý¢¼¢ØHç ¦´ô®á8wé¡+s/?ÄÁÄy{çÁÞ™óî»ô„39ÍFÌ–©øvA8ìpT@MÛ¥RµiæìÜÁ"t„§ Øc<#Ã!@ ÈH¶Ÿôè{®=ýþ‡®¿zñ±có×Î)kØ2}á¹-{_ºpõùÓ¼çÇ.n;°iò¼IÅÕ{¬zÿÃO½ó¡Ç_~è±k§/,Ÿ6GSðR¥Z„–GÂäÙLR9¦¥:ÛqðàaQqŽÉpºÿ+¹·’áxš€4è}{ðÁ1ñ¡4GBŒê]¦’M‹àöÊl\xÞܲ³¼/çq$PP¼ï·(/Ÿ_M".—ÅEÕU#‡  ‰IŠÃ3YRU]ž“—IäiÂI†%f6Éé/^:q†”†…ºrο{d8ñpæx³œ&o‹¬]èÅW¿úûŸû칇°WñœrÓ­˜:{ɤéãªë³ aüÈ2L²g*ÊÝx]ø¯}>Š”“x[ŠéûÜ ÒŽG•WyÀŽ%«O™½iÉêm+ÖW”WWH³FŠå’“è…òÓ¥ãÚغïäªM6ï¾ËžŽÉ³—›<±¼úúé WwÙ°eײիgÌY;wÁ¨‚âõ3æ]Þ´ÿôâŽ# ×Zº~eû¬Ùc& ˜}ã{?|ã;?˜Ø8úè–]÷nØ./Û÷oŸ0gz^•Ê »ç­8¶jóÅ-ûïëØ}dÉú¥ms*›wÏYNÎÛ·dí±uÛö¯ìX0¶}lEM¼Ã½’ÒðôÞ øîÈr Û._¾òÀ—Ïž½«*ïžÏ~öó¿* \Ü÷—#\4’A¸PKFž@.pœàßÅËlNônqùHYñ~ Â7pÁa'Áƒ”QGV§Ü²â¬â‚Ì¢|1'¨'O„Ä¢ 0¿$7³bðÀ’ý²‡ô.(í?fÖÐU;{ï;ÓõȹÎûNôÛºpï™[yÏo¾ïëÿzôú§;g¶ ¬ÓuxQçA9ƒ Fä•×dç•*|H“˜š‚¢œìŒ¼UR‡äå/, /KE¼% Õð(IåL·m#Š) r\\’SRšx]0‡¡õ–6¼:7áýq3ÂÈÎ… 2‚’ !„ÄŒŒÐdþâ¿èö' +T#é"?‡p‰Ž2+“¿hÊ×pÆP¨›ã1‹{–´ Ü|ô–ý§n=}¶ÿÑ#ð/?Ð`ùì•Eà *ËÄ•W¤g°y.AíEÅÙÕ5eÃ3Qð÷îÝ3¨ žbDh)„“u4…pÞšw$§—aŒ5{|aŽó •fbdÍ/`À.-,¢ìñ*³2‡<0A¸’ü¬ì¡¥eœ(³ /·¶c#<l í+WœaH»ÿÁË¢âL‚s÷?ø6E8ìð׿þÇd¸HûK')Y1Nþeɱü áøhð¥$Ãáb‚}¾ÿþûQjð†òÒ+Ò™Ð2wéÞ-4o(²Œ>»7meA>¶í]O<óÅ~ò³øè'ßóCÛvñDؼr-&Åt ª!RŠÞœÃ瘼pâÀesgή|Ç£Oê½þì^{ד/¬^°ŒÆ±¢qñàrrøðQÚÈ@8‘d¹xrÓ€– 0v½³s¯»ï¡ý[1wáî ›?ý¾}áCÿü>öÁg^Ú°p™ì±ðUd„Û±cçGIΜMœ{0hPö/xyæÐñ½ò½úø+xæò5¼gÃ6òecM=-eÀUlDððU±°9z;«Ppgçn]îbmîÝùîm+Ö~èÙ—磟þä‹ïyïcÏÐ Ù™1~RÁð,×à'BKùÝÿ7¿Xa™¯1¤úb´µ#Suïž}Øÿ”[WnxùÚÓ/^½þÚ‹ï}áÊ*`1'iÓg2\ªèûñeUG–­Ù;é¶YóWŽ›Ôœ]0:·¨9·p§\RÓfî&9-^:oìø¹ Ë Ï\=eÖþù«öÎXºwîŠís—MÕÒ\Z)½Sä4¡SÝ(@}âôUm3 ÙööùËÚ–nï˜6_ÆÞ³—nŸµdÕ˜©3*¦•ÕÍ®lÞ·põÚöÙ‡WmÚ¶`Å´:9Þ«ZGÖöëÙ׃pÞ dT­#Ã9x¼|X¹É°Ì%"èåö¯äóVw„2èìù@¸àâ8»P ÅA£8Øê°ù ÷ÎÈɧ¥”Ó$e¾ù_d¸7…›ŒLð&MF’œ£° 7µ1¹‘äÌs*™¤œç”ŸC°ëW‘;´¦¢¸¢&¯ zPióÀñ³†nØš}ähïõm—zò«üü~oÝ‘Ó=‡åß}Ïàþónë1¤çð‚¡ä¾¼ÒÃrÉ> Ø$¸Âj–D/¤´rqCórYÌžÛ"î-$­°ŽQ¦‘ÞP|>1à-70PNö;hC¢ ¿ð ʹpåO`›Ó`yIÞ á¬Ʋ@oé2l±E€ùÍ÷¦).…prR½ægg”ågæ†äUtÕ>`û™;ÞßùЉ–+« ûíüvñðâÒì²’Bb"†²5¦dÓ!„¾Ââa…Åe¹™»Þ}G¯^=Ð.‚\¢M ppÁÀ7÷ôÉÞRê_ÞfâiY(1?¥âÅ¡ÈjSálòt–ØçåRçTWç甚¾õÎδ”!±Á0±Þ`î½dO-IW)ZÚ½ r©ùöà·— ‡XüÁ|ý¾þͨÅLŒ[¶tµ¬6v8'e9!Þu¿§7%’—áø÷ó 7z<'é†P*¡©IToûdùaïݽ¿<;|M'žÄöÌ…§.^Ùº|Mu^ñêKHâi„“)°mj ÎQW) É(ìs;¶lÑ:qáøi×N]|äôÅkgxôÜ3ÇMSÛ´bþ¾'ìLü*!>K.J —„žŒiÕž‡‰ÃžSm“fNœÌcÚ˜ «f/xôÌý—èÈ©§î{pî¸vi¨[n±H$"ÆQEê ÷˜>úæŽ!z¥5®.e¹E+$Y¾î¡“çŸèñû¼zò‚·‡·ì¦S…„ª7¯×ßÞLÚ*^!©J1CX5åÒ¥” ¢M?q`·žË¦Î¾|øäÃGÏÜ¿óÐó÷_Ó2¡&·xvÛ伡¬tÔ¶* X®TögÃz¦îŽHÛBBnä¥Ô+2ܦek¯_¸òà¡S×NÞ/q›Ö2a|c¢8S˜4ò£Ïhj½´çÀ3g/¼xÿƒ?µyÞÂ9£ÇLYõà‘{/:òÔ±ÊÇ×Ï_0{ì¸Ò¡Ã·MzìèÙ'ï½Oꦋ{Î×ÎQ¥×îzó½øgþ“?sý¾ž8uÿµ#g6´Ï—W±|âŒK×^× O>ºfËê‰3ÇäWœÜ°ã‘C§.ì8xõÈé {0N”þ¬t$K>x3ÇØá x£“d³ÅAè-¿øÅßúÏ©¥„pü°#/WÀ[Èm?‡piC„³¹LpR>ý‰qp ¼©1–ÒR†Jíçd$>Q”!‡”l ¾ ¼o–U 1Š—cFAQ‚¢a#j+ŠFUdWUW·6Ï]\¥ÚÆš%yKtÐ_ÙŽNwvî“ѳ_¼¡ò‡J6|pV‘­ÿþê¼€› âLä8îE¥pîÚRèÜ›\FæàÚQ+VÍŸ4ytqiVIYvï>w‡V¤Ba \ZWy³ÄØ–†´¤ÔÀÏêÆ½•–2¢ÅñÜøQ?ÄrU œ‹;¦­qqGÕrr ©ay§”çùgø€’ÊžæõÚ~¾Ï±Ç{l?Úñž÷+¼ð‡_ýü¡yåù#s³” O’ñ2†pEÃ[Z«V¬šÛ>E€ÍàìÜ$?Q·n]-mŒZ á’U)kW Ü›l HKÔ¯ xÛûØk3F/.m´”6©ÑXëèQE´Ïš5qÉ’#+â°ƒú‹å À%$kïf]å™þm„£3€p¦_LË·—–Rm¾”R~3Éò£ª€ Ÿ©BqIòeyôi)Óž&HÌÃ?çƒøryWMûîÝïV­[7©Ð÷í/̈ÜÂIõ-Û–­Ù·nóª™ó·.^¹pâ´I£š÷nÜJ „óµR2¿óêêH”àCf²'î,˜3wí¼¥‹ÛfœÝuxË’5¶c;öS~NQe{γæµIÖÖ~ï½Ç-w²¥l#,ðôÝ¢ÍÌ+bmS{mÓäúÑBÇgNhSS_<$“ %‘t.i¿ºAÆ©&,é¬Ú¼S¢¹¼Ê3V–¦ípŽ; ÏI‘Ž Ž®’r’w¥cžDþðGùFý'ÌK){£ù,(HÉþM-e"ç·K‰0'8IÖ.ñp´”¼%ûŸåà„ •]Ho8§Øü_ÜÕ«UQynYSnACIÿ¢¦Ü‘;7t<ñÜ»8^>sl¯ÂìÛúôéÒÀ-=ï¹gxßîCºæftØýV¸ÊðfCúµMªÈÍÏ‘A8•W23'/;9W’FIiq"ÐÄá"ú-‘á ²¥Ä¬]·ì•÷œEs ²²ÊsTæÚ«ª¦×œU}w^é·ïÚ°u‡ßù'ßúo|÷ê#¤f.Îk•©çÅ_ð1ɨ­+Ûw`óÇ?ùÞ£Çv’ä øm·wêÜå6<š « •É/P<ÑÄÏp3"xò8tÌ'”¯Zbk4ÜIPøLØŠ°•–$x——Ÿ²ßedO›<î‰Ç.>÷Ì•9³¤N†ƒpQ†NÂñ4qðVZJ“Í” „3ëÞF'xößøæ_üù_ó4¡¥„sK¯TÂÉÚEuIŒƒp|)1^áKIŒ{â‰'ÌÂÿ‚Ð#GTVϾI¶SÅ|ï¸åV•5$»†p‹ÛgœÞ}ð¥+=zê<ωjZ•Æž5ºÙDК€³ÂiJƒÆL¥ÐÐR’‘ûî»MGnôSÇ-?íÉs—Ÿ8ûàÓ®>óÀ£s'LeØ[4}.Ž¡˜¶+—¯’ḺH|,Ž˜Û’z"´”p«óm·w½ýÎwÞµváÒi-ãÖÌœÏÍÀtýÄ…÷=üÔ‚ñ“'ŒÃˆïÓ9Mh±©@y@œ£ÉjÙè…zÏÝÝ(!GÔNn`ãŽ'ï{èþýÇ_ºüøÕ{ÏA¸½k·°B¸©“§)¤‚—X%¾!ÒcÓ…¾ºU§^õìÜU’ºwuß¼pùû®=óáÇŸêØyÓG®Í)š?qjþŒ.·ÞáxšhG’Á9KÍ^8¿qtK ~ë­wwîBáÉü‰mäJÃwfûòõ¯<òô;.=öÁÇ^xùâµ9Mmã*ꦙ$ÜB–èÒ¨ÚêÆÚª\•õo¨©lÓR_S)^û„±eEùúôÌÍVYV<¦¹!?kxuEiMEEöÐá$NÞꂾEÈIÿ¯ÿü/<.¦› AnàԲⰞ¼Ê°.då´·ŽãNRYP‚½¨)*ˬIF[ãhYøxægfó¥îv8G†‹2å¸HSÉ‘’$'ràW¢œLßô­´”‚káB ¨É[Ùá•ÑÏN6¦Û»Ü-#%;\ä_¾á’ø­0ƒ¡vÙ©¹l…4’ÔSeE‚íE­%®(‰Þ-‘ð ‹Ê ‹K +‡-+=°sÕóï|àÈ…£ÆUxͽîL²ü¨}×°¾ûÝ™5ô®œ~] ‡ÏÄÏ=Kã 1rà°ò‡zy¹RÝK»•[Ì%"§ $Ëû+ËËI’r½)B&·$Ùås,äWRX”µvý’_¾~ä^‘ R´gôêÓEÞ7ð&-Æ…‹ãÍb\àY"Üü‚º2¤··B8áˆTó;Ù—-´›.ð&rRg ÏQ|ÑÜ+—2sð=õuWo¼ïzÏuÔn¹OÒοýîßM›;¾¤¸"'³¤´DbèpRC«jŠ·ï\û¾WŸ?xxkFVŸ¼‚¡´”·ß‘ä^€¤Ü)=™ÛÅ{Œòx Â¥|vâõ9KÈykõò `Rl( ¯(ñùÒOø+ˆ‡«(-˜5}Âã×îî™Ëóç++Ï0¨/-%.‰8¯öéý^}¼½Âà 1.=?ßF'GÉ×¾ö¿÷»@? Þ‚!ÀÙ˜âäè§·$É›æKiZ`>Â÷â‹/’"cE’G®¡^¢ U¿©“„-óžØ¼zšê@oÉä™g÷o’é=÷ÀÃç/S^½gÝ&.Cpèýú˜tjÂDfªisfq§Þ»™LJ‘õ+WoX¾Š/þĺæ-‹V­"·xÉäÙçw9¼bó‰u;Ú{b∆–â*]厬Æúw~ô£ïüèåUeõ-4š¥¹ÃJFUŽQ6¢hTCUùHNÅ¥…Í­õMÍJg6p ý©d¤â°Ô`Ô¿ªú(¢¦±òÇ?UÞ¯XÝKéÇä–­kjÓÊDÔÜ6®ª©^ŽJ>¦·ÄáS1­¼‚$6¼|„ƒÑMJ @G>¥©ä¼½8›H5ÌðÏ`[lp±ÌA¸~ô59 ÉûUáÜ/A8&ÂàØì;x+;\b„»˜¸œá†dP6ÜÞúQ§¡rrß$ÃA8/šßä2||X¨ÉÏk«È-´•åX áRrFéÁ…ù9L`e½jZûOZX4nJvEQ¯¼;îÌêtϰ®Ão½¥W§Þý» è]–98¿{·ì}’àÅCEC2Hܹj‹å5eùÇJ¾ŸÁ)¼ñŽ.Í(,Ï)á$¯ãÏ$9·L4wv.yùÛZª-™Ù:VþŽ!E%Ãz÷½+òƒ‡Ž$—Ö¦…ª´>6œMÂÁäfEå[é'ã|„6]-nAD¤K‡Ä…â7Ž€¥¬cÆðÜ¡CÒ7èž1£ÅÚû䀵WÖ_xåWÿ櫹#‡‰VÌÍ®àØƒú%[›†ÑL6µŒX°¸}\[ÍÀÁÝíÕ¹ ½ï­ަ=7Úæ!ÿ Âñ·I<6S<Ÿ×ÞÞ܃ºDó[’­÷M…¥ì\¼5¸¼Ì’ÂŒ)íͳg*M>(3«Ï !ýoïrWÈp°±Ã…Õíß´Ã MÁQ½¥ ¥äiBVãWá`#œz7 rNB8å§Ùá0&&?DôùrèôÂF’äßVàpÌ Þ_ÆBñ,+VïÛoTIÅ©ӹd÷é¿iÉÊÑ#ª†ÞÓ{ÓŠ5¸˜4ÂÑy2z‘á Š¦bŽjÊtLÒ˜fdH™3oÒŒéÍ掛ÒTVÝ:²nÖø)µE#Іçrý§¥”‘ wýúSÌ’w$ÅêêëpJ½ôéÞó>NýûõA9X–ÏYäX[ʪêòJó˶/^%p“a¦2·Ü*f.­¥œ>W°ûô©³¦ñ½PÙgÁü¹’`1°qÇàKIKY‘]Ô^×Z›UÜT0bvs[uf‘Ó%îb*B¦Ì+Í«iªnÛPßZ7mîÔ)³'—U–äç€:ÈW×\;nÒ%Œ«êFædJÂ;vÒøšÆQIPá˜fPW9ªªwÿ~?½ñ:…§ztÂÎ(’0qZ»l–ÅUå•Í£æ ›:ofay±ª†„k†QÀ»œ–U}ö/lújò ë*âvïÑKH%iW6m‘û65‰" ›Êì*Ø}òS¿ñïÎ3ôÿ (þ’ÌËplq€ 0ÎéÒÈ—¾ ÎO œ¼”·ÜÑ…~2ĸŸC¸Äh”1\5T!Ãq´IQ”™c/ËIR4,¥¢L†E،ڊ²Ê²¢ÌÜüžCKnÏqGqùÝU…}Ç ÏÞ©kNÝ︥÷=ƒ3»öí—կ߰»ºfôè?xh1!C˜ùp†¥Œ¡YCú ìr†%Ç4—[(ò¤$³°<·´´ ±Ã…).p(NVKZʜܡ\þ2³ñ4áˆÑížÄq,ršXõp(|Ò.'éÏ;'7KuiûÜÏíXà´ì€ö%RȆ¼˜ú„KÇ!ùCòÜçÒ/¶¬0'£oNfç‰í.ôÝõXÁŽë¾ç+JŸâËË(ÈåR|6IŽÌªWÂàÈ©@Ž1Œx:<³ONž ýþ»ÜÊ—r"ë†?IØ„›Ž2#‘Þ ïð ûm´óÈ%PšT Æqd¥!ÿñ4©U%Ô¢0oh¾—4øž$ï}æ0î늄–2d¸€7^”ÒRœœSî'Ið%„‹yøë­¥Œe¼{÷î?ÿó?Œ!söV_þÉŸüéïí˜Üáà„£¢äfb#ÕQTNßÞ§÷¼‰wœ’º^õÕW‘é0›qPi º÷èšX3Ó¦ˆ=ݶusÖ°Á­M_ƒúõ­Q&IIeyÉ”‰m³¦MMa³²Ô‚Ñ lQŠ^ËnË5×Ã"mIKÔ‹¨YÃADIE^f®pôzdé±Þ:ápúïÿh)Àɼ‚\¹¨zö¾‡ûrF&tS}°o¿¾½W-[ÚP[SY.D§°ÏÞ² Ðó(lJíÆ«…fC ±Ox 2BÎS­Y:fÁØST"МåÔç2#ðEÌ2 ÞÂOI©ôWÒà’N`2þ© RòÊáI4tøU’wW,[Žâ+©¬–ºÂMceME~ÑèúF¦)üi*î¼ã¶¦¦&/ÕbEŒoÃY´¶´6Ι;cÞüY‹—Ìß°!IdœèñV¬ö„¾E"fáÞò›TBç’ ùVä7ᑘ å¯WVU_]RVÈÊR3ªrôªæ2±Xu 5&ŽXªÆz%‰®ª¼>ÉtYëJ—•–—Ø«">eÚ¤aCßH•@ml®S½|D‰6[Ç6‹°w #A¦"È#ªJ«kG SÕšrŽ„‡A¼k9VXÝp$#*ûr×=Ý…ø••/[%ÕŒÄ5+-[î`%«Î*UŒWÚâ7>ó£×“¸À_2½ÿ8Èý’úp°Š á™Íšâ 9ƒÔ èÔoh¥Ûzï»ÜÿнW}íþ»¢'<~ï!]¥æ<Þ8IÜì.Hœ3‚îêzZ—•Í•DÕ§î=zУ$˜êŽînïvÞˆOÜ4 ô‡€¾Á"Ámᇒx]¦F/ìv?ç^NF@½¡Ao< ìk<ÅÑa&ð‚ôÌr|˘ Åe)ôf”ÿJ²B›IøÀÕk@.ÍiÉ$—NÙõï[Jþãké?ÒÂÿ.Â}í«_ÿˆp|/âW¾òy§lDœQÚÛ'"…MÍu+V.Y»nåºõ«ÚÛ·_Ïæ–z¤ º¡±vÁÂ9œ‰]6yò$œ¦÷ÒK/!y! †Ë"$ˆœåFèu%O`áёȗÿ¦âŽq22_](ߨ°£¥D1‰ƒK–.ÝÚ :RÌéì9ŠÆÍ[µZ®G‰Å*ä477RrÚ$¢E>e2ý¡è7¹‚8¿8`‡Ó+R5‘6*+“˜6Ζ\Q¼0¾PcjD·MG/ô̓à(µ†FûHfŸÊG^ ;µÉx R§D¥+kÕí­ c‹|¨«·‰SGr??¡uÌØfãÙ:†DT=~Âhcî¦J.ð6¤‘VFä{drax‹,ÆÂÞ Žœý1¯ð›ÂT1%ªOµŽiêØ¸vÏÞ»÷¨ ¾Ú@mNª–nØ´yýÎ][á¨3={u<¤¿ë¥oðCéa¼ÜïÿàÛÿò¯ÿè|žww»l„½ú­I-‰M«V/Þ´YkÆ‚Uj 8¹|Åbɺ“Ì´©eáI÷ŠJäÙëÒ½{¯Ô`^¶fÒ©KV­Z´b…ýŠuëü»xåJûæ3T¾ÿ NÄ7Ê‚¾³HÓeï )-.’ÒUtT×1ä¶_Ž/%©,À ¶¡)þ•éf„ ue˜Ë<Ž­Ç6ŽÀêéާp|QqiR>¾¡ÁÂ?™™&R°P|˜„>x)s&ª©9ðoðU~å¤÷ kŒn§‚¸¬Aßbæ´¦™ÆFqBå£FYh#èFä"±<ý‹[0aœ¯#mžùi apNŠC%e|ÆM0Ç|¥M3ÓÇãØ¬Ö œœƒP‹“濽ãÐd8v`eEz<ç­Žp4‹ó.K¿µ@¹â ¶5òù¸&n·ómèHR¬v{hJ(ßF•g4åÀž‹œdxó'L›?yú”™í£&µ–Œ›0¨}^î‘+N\Ï>þä˜S×ÿûõ_ÿë¨q£&Í™0‰å¤®‘µØj6’.évŒ¶“Ñ[ÍFL‘3n£]ÕÏàƒ=]ô3¥ÀH>Þ]|å­yƒ^®OFp¼åHƒîzÄLðÕè1­ê©¤£Z¶É|3ë"Ûd \HrGOœ6 CÈc¦ãl’v€‚pršà—ÿÝ:ÿ_îçŽkIáè*Å0ÎIÉOKIsÎÖŠ8ã¾ùÍo’Há"ÃÖùóçØgmx/lÉ|Ž–/_J»€üY6h è+ #>‘õˆ:‚`N¾¡Dü­àÄ,AÖ}#tÌTÀÁasúØ(A¯) üË= Gófáñ/—Ò ÂYDšª®±oÿγçN<üȃd”±ãZ’€•{ºXˆubÏ˱|ð_ù×7¾òû¿_ÝV7~ö¸IãZåš1%)ì죟€Ï î®}-‡'þîú‰ëLM}"EF–à¢ÛÓ‘­Ð1D ŽÁ'TGAc£ú¹“rÒâ¨Ô 4L'Ó ªÑà¨Ì±›Î$ôoD§Dú~{Ép¢¾ú{H†Shæ­Ž/e œ ,×â?üÃ??‚-ò:Ñë'žxìÊ•ËÛ¶mñ¦pWB·U”!Ì‘ÈsæÌŽ1$ÒIô¸eË&Ê·tÄ÷k¯½ábºxÁO?ý4©œÄ´ð•Q`ŒrR ™’lr[˜Ø¸HÅ!ªm’ œâJŽWM‰/4™-\gßñΞyö:…ŽHó ëÝ z§€“øEÐшg± h L ~ðƒJÄ÷g†‘ÉÿÄ'>!ŸºcÚÉ¢iÂÑ£ê¡cS™ÏgRÛ°¬L´x°iÚŒukå{rsTƒ×¯_Ç;Þ¡©X¨øo<¸‘´wR›tŒ¤1‹Pz¤Lzp¯ëÿ„¶1K—-|îù§>öÚ‡Î_8¢¬.A–ñß(¥"î¤#g¡«$  xež&A>RéþØ< ε‰Vkœ#j/X0ïàÁý„Ü9dÕ`˜ álÞ£3)Êøº“¾x-¬^½’8hÌܳwßNúÏcÇ“êH„{÷î^¿~-ŽCîTxlý”/û×áh)¡—´&6Ü4rƒô @¡DBeBts2ì%=úDø¶@›ó‘'0¬#éÏÏáÄMß¼yx³•=Ð%1áfÿýï'ø(’žE7¡Z‚mßýÞ¿R€Ëò³íÍ[üÙŸýYýð‡ vþßš@J±«q&°-T÷±:nêÛ›?Â¥á0®¼téÒ§?ýi ó½ï}ïûßÿ~~>üû¾÷½ÏÁÇ>ö1e™?ó™Ï|ä#ùèG?jÿòË/;é‚w¾óö~ë'þð‡üà«øÔG_û×>ñêûÞÿ¡Oæê‡?=ÿá熟¼ÒeÛé¼íÞùÇÿôO?¾ñ‰ßüü«_~íC_üÈÙ÷ ÎtâèÑ£r91Ò_»v}!‘¥FÆ"‡:9 ËI ÙèCdö¾õ¯}Hf8]?tàdü‹n8«‡v\¥ô­ót´”Xa LE†åLÛØb^Â…8d8I½í|¥…ÌËQûà½.âá ’@8.”i1.d8µá"ÎOþþïÿž7 ú›./€x=ôЃ÷Ýw¿"± µe¦~êÔÉ‘nœnŠ“Ä@CB2@àh “õòÆæ®÷ Q´föïßÿÈ#À9 çíz£jA!СŸDú)')^èßd‚FÄ™šØáä0T¬Ü€0ÅÁ;}æø¹ûN]{ì*ÑÂÛˆ¾a‡ƒ"¦”¥Ô _é‚púq­¨÷öŒ€GÎ|PG¦&k0 }#Ë‘.*ùbÄLJ)´Ž©áJäÔà+aé… ®\¹" ú×ϤCoc=[ŠïÔ1NL¤‘OÉpˆ×O¾÷½ïàÚ&Že\¼ïüé'Ÿzìð‘ý®CFQIÀ5V`”à}’!ò˜†+¨HÊÐõî»ïâ÷ç p92ý$xƒF„­E‹ØTÄó jÌé ")ËÂÝÖ©õèÛßþWV†TéG)‹i¡)H)# fØ›;o&;(äó¬:OŒ…ʧ˜’0„û®¥ü÷ÙÆßŠæþo+îÐáĪ/ϲâpèH”ˆCe¢ÚBƒ¡>aqàkluØç‚T¶-Yº|×î½,KÀ”3[솱DÿæÇ·\‘Ÿ}öÙ«W¯:ö+:v ógŸ}þÂ…‹¼‹%ö|ì±'´pþüy×X¤Ô-¬ôøV–¢ƒqÒ0>þøãžÚSáõí£>êØ@áY}ø‘Î?øè3ïÜýø‹-§®ô9t¾ÿáKëî çï{èó/=ÚqlûÚ¥‹ed9êŒvhw*°D b‡æABתÿ8]âÙ=HX^j§0ø¡ÿqTIî·”CSÂ0¥Ê0…sSZWÅxUk:tì”èÌÈá2ýZf^ŽåúÿÜÓäçN5¸4±Æñ®0ázõìwsN“¿üË¿Œ´¿F_™w|øða0@°óæ°ØsB)ÍWQ$T‚ËœFÓ#x%೟ý¬©Q¼`¿¢ŸäÊÁ»ÄkŽ8k7B¯±D|’éµgºJ€G¦DÁgÍšäžWÈIRKJ^¶ÚNžº—ˆÃÆjMÁ —É¢ÀUÓ>Ü/M,€”"¸£pyVK¸™˜yú|^H~ÎEÊL`Ï}ƒlˆËf쌕¯AË,ŽÝ%áÉ1­Ã‰Æsa¡`’4yùr ä¨ICMOÉ©{€ÑÇR*:F†ýPx¦>¯³4ŠDn |CØ·< ÁQG.ÕŸ±Jj• ÏésaxÌ$§ÉO^ÿîw¿ʼnÂ=,bÝäë§wGÂóÊœØôÆ^Y$˜ðUX"õÇ«‰Y‡Ö¤ëãu[·D:fcÎ,UÆ+ˆjŸö•xm&À6gMž°1$•P½»[wîò¢VÊÔµrõò«Dد^³Î¿bì?õéÏDaâ_Õç—h)$Ô…úèf„ êcKÔ˜÷?xéJâŠBEyõÚö‰ròõÞ579˜_W†[³b‘ áÞBÁd-¯)²;àͶfíz"ÝÚu}ÛìµOü»×äÿ+b_yLVáJ­µšÍ„ÅÄ·¡ü çRW:Ä5»bL ½3X+ËÍøXS8ÇÌêÒZ,Ù°lÑêãFϬ³¤`Ý‘AûîëuäìÀ-û_ûæc–ôRf-_иxÊè“—Ï›?c´²Æ+¢,s$PZžŒ8•ÛuìIÁ¶!5ž1`ÏúÄWP߀®¤W }ÁˆŒˆ´,Æ6FÆe!‡¹ÎcF…eú6yL0ûˆK uwzáøRƬKbT.?œ <ðPøž<ñôs¡3øw¯¦_'„û£?úÆï|åk¤·¹sRKFaÀ9–¹4Â…§ · Sîßø$¤ÕXªàÅâã…A5óA'— âVcëÐÁÅ̈é áPÀ°¾ºRS˜D • ΉG£a <  Gm‚|#å+¨e>ýéÏ ›°Á<0u(Ã鱩ȺtIô×Ñ _¹€HD¡7vL›ú®*'h-ÖO^û~ËÏ…ý#|Ÿw ±°˜£?.XIj$÷M¢¯[ÇÊ;mNŠ=7i_Á’ЩiÄzvÖ¸A5:OšXGŒ³$ppn„ßÄf ‡«ÈÊÌkiûsGl dÂeïÛ·çС,^[·n–uzëV†ËÞQôÄÈ€X gC`^”^ „ 73ìÉ—î«{ZöÖB¥£ŽÁ¼—Î/I¶èTv{£á|8ø*J@8Р_¡D^“„ZÈ(é–"Þox”¹EÜ9@;$¬’`B~}Ñ߀~rÑâ¥6PðHróæ/\µzí‡>üQZÊÄ€ð+úü›÷­¿úË4Â}3ÂEü@œ 0KˆŽà$Dç꣮ äFf’ÚQõá\€,F&ÿ¢q‘Î*«ƒ•tœV;@ ¼·º2?1£Àã(§Yªc¸¥è¶¨aa©Bh’Zš¹Ãm*\øwê´I‚ËÍ+ºJÀaŽy_X:ï‹u€jC‰«+/KÔò/”Õ+¡|óñ+½ÒùÈ!©'T ½¸8rS¥PÄeñ˜- |ûUp“1àhBð^iu_h;CAêÙ€Bg@ ¢Â\hSCß&€âŠ’AyCòGT—´*ŸV°ý¾‡ì¾çxáÞ£*æð}‘®oÖÀAU…ƒKrʤ2¼¥¡1ž%T ¡Cv£à? ”g‰¢éä™q»Tbå$™óœ ~ÅWѦáÒÉÀoTÑOê2Xn(ÐXüGHl@ÆÒRš6!¢k³+/,s´”q&™o[„#dÂA22œ¬]!ÀENž&d;H ó2Ž,$’¯ýë^$ºï5„  {Âבþu#Óª\Ô&ÒÒì¹ %‹„”ã=agÂcЧžËt‰àèl¸‡/†K•–lÚ¡Í>„m²{Á<ºÁü“úÀ±"Ī<ˆb2‘<]DV ºášöIÓÀ9éMé»ùóC8L!:á̧áÂeRWèßÈ7í£'BŽ&·O—ðFjD~jBauU1l¨oijl5niÉdM¯pK1•"+–:`0£hìѬÔy?C¸Û6¥e¸¨qeº{.Ç Ü? £Í®xž×« ÷(ZJÀÒ§aô ^+± DOÇ~K m°¦´ìL¼D£°Š`òàx|å…º˜Z ‚úA4¼JÃË÷f›9#‘#ÝeÔ+-‡îÚ›Ö²—E8ðXæq‹€ÿÀ4Ø„hÔŸÒÔ¾)Îþs7ÛáÒwO#²’&4 °ÿÂõyíz„žÆ¼@8¹œl–Ši- £aã ?g1¬6›Tö¬Ätjz ˜Q7”¨C“!õ†Ä ’N‰ì8¨ÜZòúôí×C¥›aÃÊûö"Ã=·X¶Q¿ @"„­Ú[•# I£ÖÊò- d7‰¤K¨ëÁ1ä*óU”'kœ ¯Bk3<Ch c¬ÜXqž.†ãe:Yeþ›íy1‘x(~~‘Ìù4.ÆÉä¹ÊŠ3‹3 ªFæ—Ž¿5sìàÍç{î»Ôsë‘U/¾ç_DÂ}ë¯ûê—UžWÒT=Ln4Šúì5»µx¬·©±ÍÑxxÀR<¯¸Pã܆Æ"Ö¾ã°ä7oáF™þE|4?I7Šèx¡.󀴔ǎŸ6‘Ì·H_áL$ÿ¦ÑÎÔ¢*¿y¾ ÁL1S¡o#Î*¥¥üÝßù}>“Ž ·xQR"néù­ÔH´”­£ÇËKIù±bUÿîïþ.B‚Ñ›” o?«æ$4¥•ƒ*¹½ %ž=2‡°òz@—24~½ˆuØ™IágeƘñ¡ÝBñ5«qÄ}DpÑS·@ ÑMø„"£ƒÈŸuhc»"Z®a]ûY¬I+>Ô¡ìĶ)‰„Šþ‚%{¿‚^NOxL È Ž0jëEòh¸}"ße¥#!œÁ™7w"îX›5Õõ®^Ôöì ˆÖ)j <š§6bÚŒnGe¡5B¡»GªOf-Ã¥‡Š,k\~[r,„ {â®Ø:Ü5>!4'Y7û÷—Þ ,si@Œ¶ ãæy±Î 2òpFÏÐ ï ºÆ`¢\Þ£óþ5Ôñ¾¼÷tøAŒ¿_Y˜ï´ƒãñ­i„Ì áB¶V^Ân›a18ðæC@/ õµ=Å«|¤cW=1ÃQ.Çæ‰báxŠzÅ|Öå÷s±b7#\›€1ÇÒ–&@qÄH¸7­T)œ¼Ãƒ¦ªºV†²Ü2[¼ÙÈZBV=òzøXwH¤¤Ü¤rY¤§‚‘àJÉ^b™ËyÌÊJÛ䣑•FÅAƒûʯاo÷ú†ÊAƒ{ •ADˆÐF·ý³ifþZ¼V³‹ çÀfÁZžA zã„„Ø\]CÊiyDÈsÁ–æT•:!Êø-RXAp´ƒŸ¦`Œ\VápaíD}¬@*åq?gŒ†kÜÚM›_ä‹rtÉ5½ºËhÒK¾¬âñýšWe~ªï½u[»ëêï~ýüäWßó®Ì‚ŒžCúÜѳ«ò[}{öPCÂ-¦MÞ1:J{°ä$D@x",»ÀÅ!ÑÔ#DÞûÀû#áBhŒt£!æÂiž&´”áÊt3ÂÅÄ 6Ë܃p驈 bš½NNµdíBñ!Ü‚ùpN¡¸Uìpˆµ89ò;œ„=D³ QûÍßüMº5DÙ'{„"µÔ_ ⚈¶"‹¶@8hd*§£X ³Us³w‰¾{ë¦i¤ atÍœ¡“ Í5 ’Kß"‚¯¾úA²EÊõ¿‘"Z˜=ä ’BQ&´/Š Ë€÷”É3=æ˜Ö6¢õ&Y*âáôGæe?¼ &œ•¬)°¤)ÝÖ7C†#º”"߯MƒD7)$$‚‘N¢nT“kÀ›ÊÜH 5œµL§>#lÓž&èšo©1Á`ÈÏ+Ñ·‚üÒ7ޏ›Òα·EÒ‡‡˜~ê?€!7““Ð#£ÄäfÎ¥*r¹Á4†~ΖŽuÈrd8oÐÅ!ð¹À†RÁì >D·x#. Çã0mêì¶ S”aš3›0·Ò'QZ2B7  VÀ¹8<‚ )àžÇ át^'£&<¶×¦ CLòøá” ÷³¨âÿïE¸7³¼ÞŒpTµñ—ß ËÈdHLÀcI3×"ÑIÂh§rš¸Þ¿¡k ïm„ã ª-Ü'èrÈý–0 jY[Ñz¤ÐÉpå€p‰©¦sNž¸±½ût6|ÐÀA}%Q$½õîsOÿ2€öÌ/PDf@Aafÿ=d\s™ë“B¦y|*Œ »#¬ÁÓ ¹”ÅEåx)‹ÝÝÃñ-NûL†¦1”«¡Y Jíbÿz¨OÃI?CÇ"š3.s“I¾éa4«9ñŽ5kª3]»ÌyXåIÞâ2¶ŒÈhg¯ÈH¤Pð•ý$Ò`öÐ÷ž>wõÉÈè_:¾dÙÉŸìqà‘¾kö|îÛ?3¸|ùüÜòœ;zu–ÓØIÔ9 oO94} L ‰SŸu,ò4Y•Î8ö8!O»>ÐÚ5þ ŸÒÁ£ZP8^:ö·L—9ï'1˜!ÄG¨îf;œI/f}Ø€9=…HÕ¥¹4Ì“¸ˆ4ÂQÕ†ø2ØfpãdØ ¯%é·`† áR$)'AP{Ë.ð+¯˜FC;iâ4•vfΘÞfLŸ[9r©®*qj©÷aÊ(ËûTä~=†˜?£¥Ô 6:rðàaÛ‘#÷îÞ½wÿþƒLûöŸüä§ p¿Âptb‘4º:óçßú‹@8Xû€±G2I ˜B¾4_!7L#A\æ d8qÒÐ_Ì¥B/rnæèÍÉ ‘>!:„‹ÜR˜©Rû¥"G°‚/#+ËxK²À¥òâgÈf7dhÿ²òü♽—”ªë–]V® ÃX‰=Nò€©n!¸%jy{A8W¤ Ô9`ÆMášÞ"‘ûœÄêŽB9áiŽ‚‘.çê¿ÕOá„Iìƒî‡6PIÓô„Ê1¼êFèú’* ……!8FYøýbIý ½n¨.æBm}9%c¿ªiÅëï¿}ÓåN[Î×ÜûÐßܸñ/?þ>΂ª¼9ƒjFVÖ”R~f+·çWñ¼ÄÈkAð,ZWÉQgh&àœÃÒÃgÂbéCí …‘ W”HBm¬\ãz—iǘ„xê"ɵGˆ—¢€ ß]3 ü“)8÷VZJ 7#­øÛÂÓÅ-ð'ßøóc÷ž:|èØñc§Ý{úÜÙ‹'ŽŸ=}꼓6пß_^¿R&'kƒ‚:›OV#*‰¦SÍøxÚȼÉ7ü(Ò/¡Kî…E<œàM†äaíÞLÓðå ûT:œ6NyÒ+Ûß@8mE‘Ñ\´õå—ßIϦ'Hm@/@r`E ú¬¨§þ0¿P¼mÚì-›wΟÇÓd¶ž§4rcùRBýá(  Ù+HI$à±ÀôĘT”W¯^µ¡ºª^UôéÓ”ÇYÜP?ÚFö­Ui¦– 7žÔÞl)‡Ï¶ÐËã7#=AXœPÊÃ&~Ì+W곋u¯¨°|ÜXÃõ¿ \ˆƒ‰7yªŸö !7{A|)Œ‡…".³O$ª†¿AÚÍ„ ˜7ô‡Œ+Ä,¡NÞ ¡‘d´§Œõ6É÷6¸ë ²bBwSBF(øÂ³©Þ¯>“eqÎL2«¼¬fÊdóƒã)4Ky‹é½P<õ‚Ä]ˆâWc¼˜xMIáðIŒ›ûÉ“§Oœ8%lùøqñµ§>zìØ î²©ú_ôvó-o–áߌpAwÒ~á‚ÅWÈœ&áHÉáÛ™@8é]ÈpH[ºÂ~ ÐÁˆ+EÇÓðS‘Èõè ™îæè Ž~RjƯìœáD48ɲ%"UWÙÜRÛ¯÷ìÕV{à«}øG¸I…áCµ˜Zœ¡pxG/#Õ³GR¨–0®Ñ¥È†ŒFCûXÝáK©‘p+sePóàí ¸[ø×'î-áÂ)ÃA¼lWÂíCáI}\¨ìŒHƒõÄù(³à¾2J пÎkAûÉÃæ ¾K=îÚYt?ðÌ]{îxå³ßâað­?0èîa%C{ éÝ8¢zTñH.Y…Yê… â9ì^0)¤-œ€¬ßPPy(3Ç){yòÑH ‹3Z ±ÏX^'u5‚+¼G?42úï'ÕŒ ·öUÿx6…~;"š›Æ9B›IYN‚µ „ ÷ËáÀ[L¹ßbúuò¥üÃ?ü#ÕsHo[6ïØ´qÛZéà7nW8³sÇ^òJ䥤¥4$ÔDäÐRÒ•‘RÔ¿”ÝHÁŽÛoK’šÛúõD¦ AGN+BàèC…Óǯ®Kˉ ã&i3î¾;Òu›Ó©P¹±Õ5£Øö8Ô‘á¦MçrÙ8}9`¢rbÈýŒ™³Ÿ~úYék#xÀÇl0cLŽ[nI2w[G¢C20} }¼Ò(;Ьx§?#€/rké€E¾”)¦¬7%ý¡±ÊÌÈãzª0zdž­€­©q ðV7ª¹uô›v8’\ÊRÕŽ"hÍÌœ­6A8ß²cm§[£ìd02kŒ¡Ò7 A"à ÀIrðk¯}‚o˯ßRЇtáNœL4BaW³ZóèO…vh#oF¸‡JÐ7?DGЮ ‚Ü(ç4~#Ú%5 ¿è  ƒLÓmø×œDÁA£‰;vì l™WáO;yˆ$aéŒÄÙ N¾·mÛ7Êk=b¤TË#ø˜¨p+w¨@¡ä*Ì«T`ì¤cŠ=R#M¨ó0SÌ‹hð{„¡2±|t›èñ[ñmXàÂ4å“(@fR ?‘ðŠ4 oÿ†Äò–´^ò…ïh€œ›šù¡ó·”Ü7±üªÙºeÓÉ“ÇaLAQaRÄ;+“ºFj”jJûäÌáɨº;>ÒeófOÉ‘á}îÆ^kOw?ôt¯=?óõTRà™w¾[<¼¬aDkÛØó‡N\8x‚¼;ª¦VéêÊ*%áËV’ ,^¸¹_ºx™:¥£“„Y@n2sw¡â]")jdí$á¦K&"¤OY•Fz:{Ü€G#ϵ4³QÍ56´ úÏð¥$Ѩ4ÅÕºytKum ëWKM-ͧLîÒõ® í“”H]¼|Ùªuk§Íš °É£d5@>3>i’*Ø Õ¨4ß þ­¬ª¯®Q2rÍòµ…ù%@qÕêõ*k,[µ¶mò´Ñã”™›Èi¥~TÓ’ùK#ï $X/n/SÉjĬ0ÇÚð˜á øêM¡}Ò@,Ž^—è #ŠÃÚ —»>…jÕ¦P*Âr5]®—NÛièHðh´ùªÃëS±9¬<äÆÁ0âFÆQœM)í+©ÝÁK/½#¥Ùþ•aÜ¿©¥d‡ ŠFŽ +igîàµC›ó\&ðöùw¼› ç Z’v1 nšmŽ 3Ô<}j"ècè!‡ò* †%ÚI`;•ªÞ™$v~ÈàÐRšc³ç/Úø^ÜÁEÂÝ,ÃkÅÍÄñsÀÚÀd{[h)é|ùô§>Ç;À†=ŸÜÎnfû$ž³HfÎ`á#â+¤EÄX*Wdb‡ 7bPIñb½Ý¤9ÀƒÌ5«;bÓ8ü#0™÷¸3ÞÀ¢SÃS‘Dˆc'1{B ᣆ£êëZÆŽYÛj¯\¹vhíqÛZSâÃÜ… ƶM€p=y½¶¡’Š4ÕPWÏRµsó9H ¡<~ì¸5«V+Oºrùеj˜¯\5wö' ppî.„Ȳ(“q`¾…mºœb <,ýdMuƒ=¨#º1›ÑL¦nü¸ö4Â¥1ÚŠK©{Êá™B·ÜvëmwÜÎY˳ÜuO7EÉ×oÚ¸yû¶yKA8ì'^Uª^¥΂DŽ6"oD òŽ‘`²çÝ=†¶~Õ†ª‘µàdѲ•’ŒÊ¹æ¶N˜¤>Kë˜ nñ¼%© ò7š[½ØF™ì€ôF>ÃÊÐRÂ6˜dC×Èdpû–híá$ƒp83Áü!1S!ç Ù ÂM˜ˆ§Áëh9Žª:lD“ž™µ<Uîæ†Ý3†ÎF±tûhÜ"‘ deð{â‰'I±x¬_Äýr„K[ú ò•[È»RVø~ì“(άy W­ëÿ7çÛßù;\Ræ[­ï7Kè%i@£\|¾j±p) U˜3;œx"(¤94kà€¤8‘×[¨ “Šœ¦Jô%f²Ä46°´Kù¤ðÈíEû°õõí3P˜Ð=ÝzõìÑïÎ;îî×wpŸÞïêÒ}È`EJ“buaUŠ¢kQ».zÿ¦Dέ¨— ÉÐà¹8lráâ“Ù³›Ø!4Ÿ‘{Ú¿¾µcdà_`FdIœAzÜ“=Xo»zâî}{ö6°gÿ¾‡1£ùÛ0ßš¾=Œ^ÿ¤2èÀ¡ýŠ+zlÛÓõ앞‡.ÙñÐ7þ¤¸B¾ºöï=ÀŸòžAÙ=úeï•Sпg¯»ÝÈésXuê%!¼[õ0”O¡°1¿ù}…VÖ'†(F)Æ$^¨ãxÑaÚŒÁ4,ž4œ‰4H<-«h¦Ïžg¥k6ÝìiÎ&p~o/„ÃìcÿÄǃc ES`G8h”F¸¨ñ! -åsÏ=+ â‚mÏÉ.èÒ™÷ã›ZJ¢ÈD.YzÕ‰F°')Òu(–bЩ(7îã”WIüo¿~lTáRï#‚u õcÇëØ´qõÚ5ë6¬gõšØ>i|›üT“OP7|Îì+_%‘’¯©SIoå¥eݻݣ·M‰ouuÇŒn…j•#F®Z±RéphçYÜ=N¨…l‹¤,Ž©dÿ#b§jv1VØÛÍ›¶Sây4IíI;G}çyá„ñ„¿i„¹¬W’‚ë0´P䉛›„«38G†#½o1öbô<„Ó+ìáÍg¸øÝDî†(³Îl9²b„Šç¥%Ë-Ãæ©‹½º£cåúõÜ=ظ‰“ÆŒßPרz \kË8BUDƒ8Ð[òºð óÀ¦ôhüN ÷` ¼Ùó4f¬epæC$Nƒ„€Ã§•c]Yo[7o›;{ÞÞÝûÄK(¡©zͪ øŠ"oLhŸ5æuœä÷ÃÚ÷uAxr†  kü뎎 ÷+TQ¦=Ñþb´„K»´¡ -\NHÂåÄ1%íê#ÙÄK¯¼Oâ®u·0Å9I°ûÎw¿ŠÊ´ Ö](9|Ò¥d~±0327êRº²Ú›©†"†R—#‚PŵŸE¬«Y“h«øC¿5!ÞüWIÅ+RÏ÷æ'Ñö?ü¨—¤Íùg$ãÁ¬nç8zû¨µâB‹ò1[¢Ü]úßøI:SLü%u<—Æ}å_%>ÿùÏêSŸ’¥ÝG&[ÿŠYú¾ðÅ/~ñK_øâï}á·~çó_üÊ—û7¿ø…ÏùK¿ýµßûÄo|úK_þ­/á‹¿û›_ú½ÏÉ·_þü¾ø›_pÁg¿øå/}õOO¾ëµ®;Žt:x_Ÿ}—^ú/?UOào¿ñ·¿ý•/~áw?÷‘ßøø'>ùé¯}þw~ûÓŸ;vrÿ¬>Ûvl>}ú44¦MU,½Èä…Ò•NA7œñ-î32ÿEv¤$‹`Ês-]y 2jFQ‘°‰8N’!¥ÚÅë"Eà)Àô³Ã±ûzÍ[´”¢û¹—Þ ºÌ%f¦Ýl‡ 97[ø^¾½ÎÄûÄ'>õ©O~½¶%gcŠãˆX#|D±DeÑ·?ë@LS™î¢ÄBLkçMá¸Èkç½ £×±a º‰‹'8üV‘:‹¢†ÅDgHä–‘wXkVt&±ˆ—LjЦd8ÇG’iŽ D˜ã qòô)êœac‡›0n|mµ"Çõuµ£šyÔ7¨O·nÍZ–9ÜÜæ›:ÖoX´`ᤶ¤^¢Ç1Ì9å{hõÇ3ÚC_E>@.²Ï`ØÆŽ­ÎyÀíÛvBÂ…wbád¢3n,¬Š‘#z÷íCK[ÏÞ½ Üï„»öìö€À#‰ di3ôïzeö§ +n1¼L!.2¢ý¸ÒðsƒÒ>)"ºn㦠[·Ú! Þn›N( ÁÕþU}Þ áΞ» OÄ¡¥ Âña‹D'¯}úsB”(“©˜\à|ÄÃÙ'Ißÿ­ˆ?'Ãu>#À#jªÅ˜@DçðýŸ°þ†:7óÿW ãuá^CúlIxø“„Èÿäû?øvêLòUêš7 ËÝÌXÜqhôsÎ¥?×ÿt±Ó_|k?çPÏãzµºÄ§*ˆÃ| \N|ÇárXñ¯=òèõG§~cñäUW¹~ÍÂe×yª^yäÉ+WŸºúð“W~ü×_}ðñë§eþ…gºî9y׉{n?õ‰ïÜøÑ7ÞõäKW.»výÒ\zâÉÇ_|ü™«.­êXÙ'£Ïî2äR|Â) ÃŠaöâAQª@8‘*“ù&²c§3g¦¾D²®H!††PÎG€+#Ïu:<²L 6.†y‘3âƒ)·TÏ‘µËDÂ-Y±:L¹P ód¦™uáåD¤óoh¸™Âø½ìp©à¶OÿƧ?^s‡FD7ðfãIž&è5-%ž ÙäæÌ¦S”¢ˆäoçÁ—ò¶[9Á'ZJˆè·»HÛ¶mÝeOž#Ã!XáÙ3XÖàD†7Ž6#<Äh®9.z—È7Å`R>´±lÞºe}LJœ2B†³OüJ&¶Q÷Ý{ü-%xK4-³fó.!Îô¸§;îg€Ò æÁ6ç6ul$Æ-œ¿Âá¼Ü%âÒ¸™0"Jä݈”+´¦ Ñ%±DþáRîéÈ:ÃÂ¥³vd ƒÕ"å>ÏL¨“@Ú¦Û´¬ ÎÓíܽkÇ®¨¿q ™Eúc–¿4ÂÅú§Ñ+ˆKt —”:hö„¶I{÷¨®«¯¨ª†pë6o^»iuY§LUS.A¸‹˜—} 4)M·a˜fE¯‰RÚ“<‘=ðö­÷á^àM(¹ ’ÑK§AVÃ8=FºN6W¾AÞ¾¦€¨©åbÓ5ÄP™ØBigv±ÑRF®QÑu‘“%²|ñmÁæ"&?~=E¬U÷–2ܹû.¢#hG Yú üMBiž&öîåw¿­íØÌîú3ÏS7íØ¹»ëÝ÷ð*ºýŽÎá4Ÿ¦†f‚9`Ó©ô#¹~¢£9Ò„A1Cz0ùJvqTòƒAó:R¥Ý’‹#C±à±Tü˜TJ* £zŽäËŠÅ76×ÔÌG—çž*NE¤N¼Ì¯’à‘¸o¤êãD–©ˆˆHíp²°·ÃðgŽx†ˆr ß±´ þ8\3Â_&üÓn1Áx;†(KÀÒó+ŽT iIDYâêÆÚŠZ–fIapx£[)H’ÔÐÔZSßZ];¶®~\CãèFå‡ê+GOè_?£xËÙgí|ø¾¢“ÿéÿô¯?ÜÐ\W‘ßÜ2¢´2¿¶¾RìÊò²1SÆ•ÕhŸžÔQè€aŒp…ðyñÔJÏ#ÐÛzŒønÇ]~%iï‡ðVPî¶WÚ‡‡jÚ¹42#òÕ§oÿ~êÙi¼p!Üác'Ÿ|ö…HÐ2\j¦VZ7.>È9éšÐ%XCo‹h¤‚/åg?ó4ˆÏø¿ …æbÌ\ìh)ùDT¥CíNÔˆÔ‘M Í…ùE™\¥2²íeóW©¦´¸lͪµ ç/âžmËv{¥Í|5oÎ|Í™¸¡¾€(‘žƒÇ3µ'ÝûfÎe9§4‡ÜŬ²€±Nò@D”=²û•߆C?m§yï9XºxImC˜ù̇Ç{Êâ%Þx5—/_IU䘌5ÍL*ÕhÍkµjÕ;U@G¦©Ó&:¼wÖ쩪 ŒŸ0zì8«gTUuEËèe„Å’©4À3%ü'#— Šáç^ŸEçÓ^Žág˜öZ–‚ Ã'0ÂÝÂÁ2íléd=\:ášÆÂÅÈ}à_º¦hHH‘áO9©ÆÚæúêFS®¾¡¥¸¼Bí»sçïó [×®ë`•[º|ÛêµLj7t`‘oÛ;nïå¬Þ²ãÔ=GÏoûìWÿêÆßû½?Y<±}ż)ÖΙ=âŠÕ ÏŸ##Á¼•‹&¶rgCB¢ò.Ðã©ÛÁSÇ#8Öm6¹Œ»ùã1ÃÅÔ8øqó«p³ŒZBŽc4Â5‰ H¹ÔFÂO·¿ÊÄË&•Ó$t —®€põd8*©HCálp©ÄK1øæiðƒ¾À+Ê „%ˆ¬)>yÒ”ñc'Ìœ>‹ >lcb┯pô¢‹ïضsûÖsfÍ­Qeq…_l´q[>¹i³¥jnÐÛYºn䎇íüŽ]çºï;õØßü„{çKïW1bêèÚ¹Ó[ê›J&´7Žר°ù´…sG45Còñ0ÕƒdüDˆ¤áýè)<‘ 0e.ˆØöð0üÀ0`N­-¢„s©“!‰ÚËÈÏI&ÿHcæ2¯ÒÃ"Ú§ID¡Ì_¼Œ–ò…w¼È@/çÍ4A)¡0OfæÛáÐ ÷ÉO|Œ¡e\"D7pŽHdzŽW„C€å9å>oC –ÙéÕÖÕÖ4´ó]nAk;ÝÚ¯ON £jêÖ­Y Pÿ];vC7²¢Âas¼Ñ ‘’&€Éˆ ð1¡½Ú0/Y Þ=³¤QvR x3·p©L€Î[c¨`¨L<¦Zg .ŽòE„Àí·Þvk§[è*o»åVn‡Ìoöà ÈA2Üô© Xzw´„ÂiJƒnjª™^¡g×ËÛbN’{Õ7YWʃÛC8>cÚ̉&yFj“êÊh—öèÓ¯¯èœÜü¼Ââ¢ÎwuIŒp©àq]Æ}zõ¦VÝ·k·mãºõðØÇZ‚Ö¦;í„ù–]¬£dº›ýú“¤GIÅÜÝ£»0A19ù;÷î!5î9°Ÿ W„6ÁQŨÆ€Þ~øÓŸP3Â3ÊUºD¯˜_%xc(%rѾB&Dn|)$ŸàÀ”rÌ+’]V—~ðƒE™uºÇØÄ•‡ áÂGSì|ú–’¼a#ðáû— ’è¨oÔ ºñ[ x‹8”-©üIÝ2òVx+ñX‰,_FYI)ï 'xÏî=„ €:Ñ„= Ù|E³Eúf^„½‡ §©@8èHs@æ ‹{¡Q‚9|)E|ÛÈpWæ‡Çå×á• ;?‡pÈŠ3p.ø%GEIQ‰‚£tá†`ú…p㥇æ#ŸñqÆ:Š”„:­¸ Of±d8f3øè²P‹¥”~ò+*#3r¦d]âá²²‡Ýdd–ë$#spi™`ï<à'ÒY¾æ¨Ðé˜#If`ŒåˆJËhÜÝ#X;LqA÷QêHÄ¥…@ÇÈYìYbM¹ÀW€0²MÔü °ã¦>¡äLÃdÜ4É'’™“=4?7«8/·¸©yÌàá>÷:p@UqI]ňò¼ÂìaY9¹…= î™Ó©°:c×÷oy°ëöSc}ŠîÏþå_+ŠJ‹ŠFæågôšÑ}hN¯Ìüù%¹9¥%ƒ•ÐÉHŠxdËM'Á›[C©¨'¡Wô°æs w¼²À¿ˆþŽä&Ñÿ8ð8?‹²Oh‹ ÂÁaç‹ÚCá™b’90|„W° Â9~*p +8ª´ Jò@¸P-`¼|û6B¸Ï~ö󴔜#¸Nàëåæˆq)¨[…ÞñJˆx8ùpÐßùÎ÷>ŒøâZ¼ÔÅ µOh›Ö>yÅ’¥K,œ>y YDêÒÍ:Í›¿‡þmÓæc‡ ãõ5µôÍl"QPm:«¡ÐëHP >±`(8 ½¢ÀµûöïݽgÏ®ÝÌlî8kÆLŠGJH¸Å…\áE'Nh£·ÑOÎWŠ`Î\û%‹;hŸ8Iþ?ç]ZJǾÒNønD´c†›RZz:@âŒií1}ô-z•€bëÏÕ8ªnûæ-žîÀž½Ë/ñàógÏi®#FNŸdíJeÉz#1¼-ZØ8º…ŒR1 úN}î¼ýHܧGÏå ïçjB Zß±lÁ"çÖ:`B“áô!­"‹(=«áºtí,LC·Ææ:¥Ã‡Hb´cûÖeKÏœA2›.dóè&~Â7ûÆ `ØøîÞµŸÐæ¼T¬Èl°äd„úæHö¼CIo`Ξ4-@óCVˆÄZìpÜ,©·mÝ-iýdx™].`Ããà2²x •¤GšùRà 5&Hs;b\„(D}8v8_‘áÀêNO“À6tÇ¡q€”poC†ÒKNn7Ëpq=-¥”]à–kâ½£` •µ^xd„™*bP!깄‹îÞõˆc¢Y+b'lR\ª¨™”¤ SV*§q"$3ÚHY+œÌ& ë@5Ç’5§RGå©®An w|žWÀ§ b±Dö¬¨,j®:–£È‘ZÖ¯,êð6tÒ"Šp®ðšñUCþuÒ±½g »@`¡g±â …ž;oU†ëßÐ÷„i*'+7{Xî°Y];w Ì;c8d×ó>½»».{èpðòg -ªè[T>lÊâ^›.ö:òlÖñ+>÷[î¥|ð®N·åôé_JÍ”‘Ówh^ï!9}g Ìú>,S¾ÐÈ]bäÃÁ;@.­7¶BC,&\ÃL¥pà“×Džú *©ñLªë:g„Å'Qq±wà‡Á¾„¶6±Õefð¥ü%‚exZKùØSÏ….T pœwoŽNùÿ­ w3‘ØxÁÁ68—:X‹ü¥«çDm2œÕ&hØÌàœc‰¡† x{§[î¼õ¶®wvîß»ÏÜ™³€ÙÖ›P|{r p²®º¢HiN8ÓÃ!LSD )²u¤œàocgJÖIu ]"KÕ²ÄÖmôx †Á66QnÈd„3¶7Hæ_ XTPØ»g¯ÎwÜù²wpzœ×½øefË3¬`µÌZЮ–wµZ1333K[²-333CâØá”Ò†“¶iÒ¦tÛÞ6m“´ÇN¢ÿwÞc¿w¯»÷¶ÍÓþç3ÍÎûÌ3ÏÌcÖt>rù¹Ö¬VÄvëúõ¬X¼c§OžTW+ëX!„ãøbZH&éè¶­»àWì]ƒ·ÐRîÚ¹,ñÇ ´¼CÉmÐË Ìlùýãx"ЊÕß##Ʊö ܦەþ!½éȉqt¤iÔ•ÄÖTÓΣÆ.øª!\díB@³¹Á/@Ž&=4ƒ‹h-¶uD8N’A Õ¥5¼QØÞÞ‹p;vî–Í„„‘‰€z,^n¨èÆC—åxä¿ "‹'Q,Ðg¢¥™€èû‰c3f§h»gyÀ„3eQYHÙó/8[fåu`[ÙÈ"B…ŸG¨·0¤¶R¢6Eé"Ò‹D­œÐR^¸F˜Üì8=ªùDÁ"â'€‘NÙê»PfT‡¢Ñúú¢óÄÓO?Hlï$&ŽÔ!‰…o`F÷Ëzè=èÒ‹/?÷¼ .ºäÂŒÌÁ#+J:_vQ¯n]»]&I¯ž}ž{yÏÎYzê3~A¯·_¾ïÞËWí¾ý›ßú{Éßï¹=£w¿A—÷Ô½ïp9³o—^,íÄÅg\tñ¥ò–‘ÓÜÈñ´Ýµ/׋ˆÚ iiÌHܯ‡Ñ1–𸉧Â\<®ø5Ô˜é6Ôˆ6‘¢,„]GBí™úRúáä4‰à“9 w”áÌÀà¨áBs`á½B¸Ð¢ÿ·C8ZJñpIÞ÷œB'›pÀS ?ò ÇG["NøÓ'%¹ûõêÍt+¡dúä)!ß øàÍVNqcÚŠòò @8ȰáÚ\óõƒdG²è‘^oK9çž›°•U´y ‰\äØ&mkƒ4ˆ%A áŽK\â ©NZžÒ¡ râää1±…jô“zÓ­Æ‘£ –6Ú±H(À{%jŸ&4 ›¼Á0ª§Z”zþì9öǶ´´“_Ó÷‹Ÿýœ l¬ìS&3l èÞ¾sÁÖ‚F xÞgÍà£8gþÒYóÖ/Y1­}¹hT¾,¼Q‡Å—/ FÈï†0lA"ÅíæÍ¯’¢¼Ü‹Íž4yÉì9cjëfŒŸÀáµ¹¾®¨0Ÿ]9*G ÉÒ%C†ƒpd;i¸ýʇÎÑU:¸e˶;vÉ}̹Œ‰û6"4-<åJ†a@.ìp7l“À,ìpNª—@8®°>™ Çs‡¸LXO¥ûK-Æñ“Þ \˜³ùÙéXþ—òÉp|)ƒ§Žm@„ãBb°:L‡$p¢¿£ýÎ]{zõîKäh B2 su ’ô.¤7€¯· ªDX¨1QÏDM2oú3ñöT#…Ph S~—‡ ÜTV•IPÉ…ÄAÛìlIÑ1Õ‰ «Á8ÊÑZrZ´^20/ËEu… ‰ Ù »Q$f„Uö½ÎȪ°jxI^üTIÐÁ†CŠ Q5|î£j($="¾þ£€@ZÝ—6q½m¢Ë/Øgu@¿ìÜÊØ 6ºwÐ`I#e`7ï¬ü‹ûëUXuQnYβí=vÞ~Á–nØû»o¾õÏ‚gZêaÛˆ¾ÃŠG”–edì>¨s¯!]zìÊ¢/ãk¯I×µuQšô*©1‡=Å{q§~ |rkIÉTu¡0=’Eâ±PÞêPËx&á«5 ‡;‘ô2ŒvQøRò4W¦VG„ãÖd.Ge+@ðU‰:ᾇ8›Ä´üï…páKÉÓ„¥¡nòÃ6¾pL)(SM œµÐ5´Ç ö.#äÀeõšÊ*T¾¾f4lCñ³† Ÿ)cH]½ƒ¶t˜¤œ¼¬l`Þ„ÎÂbNB*÷Íø¼‰,‘ÀÆ" „IÄ/Fýh‡š‘6’ŠÒ–†#€+†sˆ%¥„&ŽÀ?m€ŸöN$ØYÌ›O12­ûcîˆ WÐ\æÏÈJ` &âÐC—B ª%[°0wDVí¨j«´upÒ¸ñ´”\­;Êpô“McÇðf,()NÊ~} —ÖÂܼ†Ñµ|+ÛšÛëš*òŠª JŠFä`@, À‡•Ç=¨È3᱇áÛw5l1í=dÖ°¡ Ó“Ç´UäÔ””–åä6ªn“•²¶¶¬Èû]˜ÊdñÅÈ]âGÍ[ö6 'l,q< „( áÂÝØPo‚ZÊ´/¥®(*Y×"`ÂA2§ÌBD”c’t5C1Á•0ãfcp%p#ñ 5A  Ñd† §Cœ+²üE<܇á@úÛ0ʼn@t!ûÁ\G°í{ÎO»vï…pP€›~wÝÿ0S\šñúo¤¥ìèK ¨”α®æf¸vsx"“ŠßRm&±Eyͨ¿ GÒâ(A?™Dzó~<ólôºW—níÍ­ý{ö./*a´Î<¤$¯ ('O&µøäñè½E]¥¨í ìŒÙårBÈK0ªÕX|H ‹ØDà 5I9™#F*`_EH‡Ít’• ~$'hzé…ÑLòŸLKov¤ìò%€4ZM½qE!ðÁ*_E’ß+ö@p4ƒÉP-² ¤Õ’±S–,hù#²gNžš=t¸[Ë0˜¹{À¨²ò cÆV¬¨*ÙÖØ|š”cýÅi¹¡yíW®),-¡³òŸ¤ªíÕ­ûœ3»^Ò¹03»2¿8k@FVÿÁ•…%}á áèè#¥…'fœô{¶Ü"Ö^=»Îž>eè þyÆ´ÕŽÎ:¤,++)ì]\T’5¢qTey }Þ›?ýÑ[o¾A <“p9iò*ò¢ [ÐξÀ8l;|BÚd+å!BŠrâÊOÙ1„|¼W ]"¥%I ~+®BɉyTd;&œT­ð$/_øÇFÖ®¨-`ŽqTÑ’WK ×Ri†'L…p²v¥Ùÿ+“Áf㈇û¥ÇÎÅOi„£> N´U „Ü °¦ý$ñ[t$Ôø\#ýᛃ) 1 •·œiH ª÷y} -±_z¤çwA¸oàÕÈÍ’RYÃ9Z4Þ’8@ŒœžÃ J éKWL€wAï+á²Â].ï)ÛøÐ!Yªý }¿ˆ@xX„ãÒ&mXÃy$D=¤9DÌÐO&¡µ}ú@²Ð»ZÂçÂYèIød:èÖ1CB•gÚˈ¢‰tYÖÄeÈБ…ÅË.¦Sq_]ºu†pB¶ë«+G”Ÿ½dÔèùe}Kj:6y^öÚýÝwÝvùöëv½þ9UO_û¯[¹xÞäÙÃûæŒ\’Ÿ_54oDqmþìå“gÎ_QPœ—‘Ý¿W¢fôœÃ¯ÄŽ{O;÷ÇCK‰/…dZQ>Ÿo»}¦P9¤Õ¶Z:b.´ dø°Ø—²²}Ï“.ÎÔú¥—@Ú; á˜âbúé¿Â¥e8¾”‘€ŠÀúuœÅ7aÃC‹Å‰IŽJÒŽÂ[]cjI¢Hõ%èoH„Žzöè§VÔða9ªç¤”ŸI=îE\7\ùAã¡”sEG‚Rh´ _‰ˆ° †ª¿À3ìcü䔀ÚøgÈZVwšöÌLœ îÑåòAâÍû÷ïÙUòXµ Ìè+ª¯OÏ.¹#2 ¢Ü@Üòsò*G,Û8tëáž»oì²áÈóOŒp;öíª(̧¢,É,Øsxæðüî}{vpYÁH>;‰ÏwVŸ9‰e¯á…{jx „œŠã¤ ²ÕR3‹{ =¤%¶v¡Úõ¸8ë‚$x§»ÙàZâ!$vÙAÕ”7£Þ‹pÐ+8*[‰rB`úÝýÀ#p~ÿÑüÄ'>EK ápë„¶°ñÛ¼yÓð¶eó2œO%è,© õ‡ISÔ¡àI-ñל ÇOš:fÜòsuî¾júÜgï¸ÿSO¾ðñÇžýØÃOm[¸¢:3ZóØ}’·25ò“Ffþ‘QÛ¢s?-Ÿ·°>»xuûôÏ=òÜo=ñâ§yö£>±tҌ摣ÀçÔñéHQ̤Niiɬys¥ðP g‡U®¬$ews `ƒ²-åÕ‹'ÍØº`ùk=õåW>ù¹Ç_øíÇ^X=eNÓ¨ÑxC2’¡Ÿð.‰ÁX ÑÈìž$ÿnË).ÎiŸtdÓŽÏ=ñâï>ýÊËw>ôØõ··”TÂ*ð zi,Ó!'"¾¥„–¯‹€Ï`w%<ºtíßÛ79ÐåŒó¬ÞôÜ-÷~òþ'?zÛƒŸ~äÙ9mkŠGŽkl‘1”HêîxûÅÏ­‘¨Ì89Y/ï|™U8 yý¨š¼ÁCö®Ùôè ·~ì¾Ç_¹óßzò¥9mueM2{–”Í;û'*sŸ>=ª¸|TNÙОƒÊFÌ*nÝÚ\¥lSqfAÁ°¼†—å†ÊoªiêÝ¥wmYMÙð¼ì¾ƒÈ—¥Yyî®¶rÔÀ½OÿøÍÓ?=Ó£íˆÂÑ™ÕÃòj³…e5”TÌ™8ux¿þCGÈ™4¬ÏgMkßHK[Xê¹ ¡dWfb¯É&dää*}ÙדÖÂETk8gRoÂ92"²{ÿýþ¸°ƒ†º8-:¢>„ »H莀YBVî(RHe‰ŸxrÓR>þÌ j ¨áǯÒñ‡J<œœ&ݺ÷¼<‰ LYA‘KHuX,A+#ŠÆb?bŠ‘?,]Äb;*EäR~Â¥¡žºE(ÃK% ÈNªeYzJqÊÁÄ64Š‘ú\¾S€wÁ¹Ð ð.8Ÿ—J2HëD3„>¢ž.0‘¦<`,]ý'î"¢¡ãñŽáí1µ¡Ê‹ÂÙŽà5µÑ? ¡Ë9ªè'Œâ,ˆýûõìzé…½z+‹sñ¹ ¢®ìÒùœ•ݽ۰ó/tYŸ3:÷ë4¤èÒU[»ì¿²÷ŽcÖíúòéÓK)Ò4~Xï!ýÎï6P¡ .S™´WÏ.j]tí|nÏ Ï.<ä2í!¸ÛP™„iÀ­Ev’D·žŠãŽê6vâϸ ƒÚF·"lÜc(ãQhjɤpNª+?é§ê¡½ã ¯3h ;Ü=ošÚí_þå_"C•/3eOêFW¯3v|¨cjÆd—.«÷ô‰›:rí}‡®¾ïصs[Æ·Ž¬žÔ4 Ž®…¥•K:æ®Þ»öSİÏa~G Ô¯?_©!=ûŽ­¬]2~ÚꉳîÜwü®½ÇoܼïñÃ×-iD.d`3Ÿ°ÀáW&·P>„&0¦fêÛêÆÍ„^qÑÄéVn|èØuºº}בûŽžj)ª˜Ñ:ŽŒX'0Â¥ryšøP•õQUTù—JQ·K.¸°ÛE—BÄ]eO¬Ùvïþ·m½âÚ »'j(Ï)0ªÌƒ/>÷|zÔ„¼¹Ó§ ‚‚Þä˜&øöìޣ˥©:õ–9d(¹¹tDîÚY NnÙsýöwì=vjãîI#k'Œªo¯m¤È•x$J«M®shõŽ›öß¼ïäá5;Ñ^V_=¢äð†Ý'w>±óбíW,š4gþø™yý3g¶L8¾y×±M;nݽsíÆÉ-c›«k‘’$%ý§'—×\»ýæ­§¶î[:a:ŸÑiõÍÛ—,;ºyû¡u›­[,\ÝX94gþØIû×m¹rÇŽ^½cíæñMm £øôé• œßÿõ.¸Ø¦N^Êkn¸eÉŠÕÜ&?Ùw„Ó,Ep‘~´áaä'GœhlŽØwÐbÀ26Ûi&œxüøqçZ$;¶€K]á\mô¦ÅޏOËÞ½»÷íݱuãº+¶í:±ÿØ»:|å‘k®Þ{hÿÉÃûný‡ßË$=´ýÐuNœÚðä¶m^³iëšCWî?p`Ƕu«¯Þ½û–cÇݧÔÏÊ ¶AëÚ1‰÷ŒÄŽJöd`q#Fë¾Ü©}·éÄuÄOn*òW8¨­'gii?ÞŽE'Þx¼\KR©gÑÂ÷C¸Pt´ÃÂñ¥d‡‹yáìüwG8bŽ«wZ†Ã©¤ípf?ŽéOŒggt’PCÏ .º©e„Þwà„Ú¦¾^¶dâôí‹V‚å“fà  Ø›?ajïî ›Œ°O”šÏ‚Ó$Eé0Ê*#£Ù¨â²ö¢ª9UÍ'VmÝ>géæ™‹ö¯Ø0¥¶¹½º¾¶´bÚ„I<Á-ÅÌœì’Êòs.ºàÌóÏ=ë‚óÎeë5$¥/ºø² /îzþÅ5ù%«fÔ¶^±|ÃÞE«·N_xbå–qÅ£l^3¡¥‚CV‹@Le$\ŽZ˜ôX †gF—Mœq`éºÝs—_±xíµÛö7•O3®0;—ÁLÂì§O‚IwûXéEÔLãDOµx`ÏÞÕç-RC?†´eÚ‚-“uØPPV’™C©;¬ß@ž– X&Á_@8Æ<%¡ùtÂö°uã¦{ÐÞ‚üG"\9~Ʋ±S®ÙÚ>²¦¾p$N1"ÍßÔÉ›oÍmšðÌÕw¼tÃ}/^ïcÇnZ3væâú  «ï;têÉkï´>tòæms–¯™4wÔàÜÕçªdãË/¿üÈ#H~ÿðÃ;îÈ3Ï<ã$;/¼ð‚z /¾ø¢ý8ËÖUœbÿ¡‡xå•—ž~æq~cÜqwíÚqèÐQ,F 2+,Q›29©aT^Mžæ1„ôП³Š!Q†CV„ÙDŒ—?#ß^dŠ ØÇ( ;K笨àA_‚­  ²’¡‚*ÆùÊ+¯¸#;nÇbÇ“‰'ðüsϼôÜó¯¾ð±<ÿñÇžøÈ£/}üµoüá7ÿå{Ÿþú_ÿ­Ï<ûôsO?÷ꩇ_<ðÒçzl¼âòlÛ~ü÷?ÿ§§Oÿþß}÷±g?òâ3/½þüËÏ=öÈ+¯¾ðÌÇžyás¯ÜûÊ#¿öìËŸú膭ëÉ]pËKwÝu—g›iP({ Ýpv<wäÞ;цÏZ<œ+ÔÌÁt¹œ¨•¥sâÚ>Û°•D¤]8”býÅóÿŸ \h)CQv¸ð¢4-í$ìrŠ8ýûŒÚ¿I9M~© á„4ñó2%Õ;\:Z€‡¶ h)MY¥¥”ù*|&©[ÇLlk§^[4mVF×^SÆÜpðøõûÜuÕõÖ¹ã&7–V¶n ¥ „ÇHÓ=ê(FKȤ÷¾Ξ[3¢`~Cû݇¯¾ÿä ÷œ¸î–Ã'¦·´sLl]/ÝoI“©”­ÊZms#×|+o Åt’eÜøIJA¶c0›Ò8FyÄÛŸ¼÷ÊënÛüöýǧնÐà™Côoë²~q:*ÐRJ8"Ãpä$c`Ыéù:mZ¸üÉ[îþìS/}â¡§?ýÄ •Ù,|[Ú† ¬)Q]ýô­7MG!’Z˜ê†Z#¼i0¸±öÅY¹;W­ñ¾Gž¸ù.½=zÃísÇL¨È-¬)}|ý19ð§ÇVÞ»ëØ k÷\µlóÛ,®i[Ý ÈDÙ„˜ŸHO®[B„?£Ñ:m"ÄHølQ¢æ¶þœ¶yÓéE^u2aÎà ØÇC°ã¾ûÝÅSO<ûÔ#/<üÐ w=üʭϾöÔ×þø+§ñç§O«ÝmýÎ[§?úçßÝüäë—/ÙÞgË«×=û÷÷W§O?÷»ðÂË{â¡Ç^|ü‰žxô™çŸ¸ç©{o~ê®[ž¹ïÁמyäcϯ߳5cÄðû|ÀCvõO~ò“ÊÔ8q"Š·E{yÀ¶¯Þ~$ÎŽØíû´ùëÇMŸ7ªeJQõ¢ê1»f.YÝ:}Û´ÅÛg.9ªujeKcAU¿òqô¸ä’ÎH'Jðö‡páÛ9Ì2„ ådl!®A82Ü©o]¸tyN{v8Õsο€0æe—w5Ù ¢–N¸Ôð½ ê©eä(ð  (YØÌ^œ¢f©‹VúZ#qd êìû’…¹°0Öìi&8§J•œ¢™%åÒ’É_„/ˆ 첸‰=àêè[@…ã‹k_Úý=| ããMGyû5ü$Óñaá:a›| ï¤m4ÿ¾tžt›ü;H6•<[Û9j 3ðµ›@КÖçhH>àPKÆ’ÖUÚ!Š™Ücš8RŽ)U—SÜ^1šY.gÐPá H‰ô%KV,O’@ªDyú4z¢T\¿žü‡ ‘*}*Áç? ã™BÌÊèÙw`·^­Õu¼9à±þY×ø©ªKÏ :UÝ©Zç¡ØîÃ#²ÏÁQu‚¸qRoæ –Û?ÃCãÞÉê ÂÑ‚‰S§¨nIl­uýžý7í;|÷ñ“÷Ÿ¼nÝŒÙó[ÆÕæäÝ~èÊÛŽ»~ïÁk÷î_9eæÜ1cszõ›×:'ö®Ú¾ïàæ"+qeLª¥`¹Òì?dŠ%P'އ¥=¥@‹䦖ÊVÎ¥IóEoàœÙpÂOŽÇ¬ 5‰Ùâ'.]ºXô÷É«Ž)C}ðà’Á#$0_{›L4 “?Š-Ì.ì,h}¸>†3[5ß¡ðuD»ÃU$ð Y"6@Í­ÏqÂ¥u¢ç 3¿™c¦„3Ódý6ÃïéÞ‡ƒp¡ŸLËpÿ­µ”ŽS¥€_'ª ±ˆEõ§¶€)HÖrÄÆOdš‡!jKK)²›ûþÜé39 "¬ƒû€|=ÝæÊïÍ™Þ\䥌hPL›Í>tòôiFó³Ó?¯U1µ}LeQÁÈüœ¢¬Ì¢¬á£G–6Ž®ª«YUVTQR8¶µatåÈ–ÆÑûöš¦ liUkVɘ’ª‰uÍDgJ†®/tR}KUNaÉЬÖQµU5Ì)JMΚ6=Ô³W}EåØºz*å¶šzb½6yƒ2+òJÚêšKó‹Õ®¬¯n³»#·ß,„»úšÄæÄ6­ ¯¶ŽGƒD3ùÈ“Ïò4Q[Ú9âñpƒ3†Ê(ò3ŠæW"«aP|s;ô.R#ZLd‘NÅtÅBùpTÁŸ1Å™º÷ÝwŸ/È‘p6Ãá–#¨°-” þôÿ˜1-ǯûîÈ;rïÎW¿ðí”öò/|úïþéçôíßýóï~ésðôC^±wÏÄIíÊÍž5mÒ¸ö¹Ó§kIòÙR$_u\K8˜€^7åÓ1ž ÒaÀ‘”Ä­E‹»³¸}•~JÇÒ…ƒ¨ƒSèD?…O&*á×Ðvs ’ÈHñÁ‡Ùc2Æ™x¡Q ÃuÔRþÿž&‰ ÷^„[Ã'/åUW]e¶AŽHç5¦&= 0îŽJP„ŠÔ\‚©%ñV(š½¡D½PYAsÈbç=ùP"Ñ"?"žÏ ˜8o×6 ݧ P€6ÕK…¤Ø5;ðRØ8„ƒ[Èßý˜ pÈpp:¡ˆN’K‘´ƒ3ä11*yL„šEf M¨LÍ]ÌcáÄjvì'íWÉe”ÁO5CÆ. ó NðBúÝ]Qy‡—åkW«SC`rLn"Ð ‚Q¸<º3:]xñET‹Œj2U=å®TÊ\9FM%&ÀÝùεÇn «ˆˆït ¼Þ@cRv\µ¹‹/ÊÌËQ(‡#±f׌&JŠ#¤&/ú0ä¼)3¦ÿäçoýôô[¥#‹JË 2†ô·-.Ékl" —Y[Ç4(žÒ³W—œüLiæë›jºuï\[^ÖV8²¢ÏÐ’~Cë‹Ë¤ë“°þó·’h?'°lxNö€ ±"d r²™ÞGdSjeÑ´)µ^ZX@²dìÄXÿzwë¥^n?^QUXT–S€tþF¸êl)ˆá^øÈk™µíä¬[ð«ó¥:ý}5¾œ˜•ßøYâ®ü÷ÿüWÚ7²¼#XUVܯg7ù!C¯ë½D%mC'K~s†”¦`~r›1‹!¹j:Ë=¢‡®2Þx$¯!Dºg]T³Þ}û¼™H° ™Tï‡pÚD´À›o%)jÿ“=M"’&(;T:°†ÃEЯÿøÇñ+Uˆ8o«§R8~?ã'g¥÷£Ãø“ÏÏŸýÙŸEìNlßoñ#;œ¼”âáäØñÁpái¹çID\$Û=yò¤Äw…û‚KŠˆŒ”!¬@)ßgè©'O‚|«ÞÂU]…—C2X’"»Q¹k.³>tœªÓB:é˜Ic¨+ß[UQõŒÑºèÜA|kdmæïdrH¸!Þ%à$z³ Ãê^[úæ;7p‹šAGq€¥– H'Ñ%2­¨ÍÁøœU—ð’%¥“Ç´‹]Û²r-[—³ê››2 óFÖV¯ßº9)ÆöFbùŠ\É.D­äÑE¤³?çΟØx¢ð†€ò2ݪÖ͘,MŠ–îˆ ÆçÛËõ*-FåDƒ×•Û±/ÒŽúQ63¦@UmºÃ¤o{Hâät£™!‘á ‹óFUTlè° ÍZPH$ ê²²‡ÖŒ®€Ee¥•U¥C2ú7T”7Ž((í6°.«¨:¯xtY… mB&~ú“7(*h©ÀðÒ G×*5oMu•¾¾Ê¼Üìâü< Ã`ÑΉ¥+Ê%§HQˆ –feç 4‡’bÐ%®äKÅ "îÛVF’„ˆoÓïæó¯ú§÷‹‡»æTbó@\Âm$„9T†/¥mˆwއ37¹í‰g_t3$ƒôÖTñkØŒ#È ÝŒðˆVA*òÓGðu„¬ F"õlu‰/AxQÕ(Õ¦Œ ©D(oviIEì ÅØê*’’h‘¦øKMqÊ: CTØœÜNœeÌ0#b¨MTÛS Þ°)0ãW°›o'É<0¿ï°Òý‡õ>bHQiåå}3Ïì_œ9cÓ°-ל³þD§½7w:zo§=·uÚsg§ƒtÚ{Ïùïè´éxçm'†ì9•¹n_Õ–+ö>úÜ«ßúÓ?ú×ÜÿÑÆ-šÙ?oHßÌþ½÷è7°^Z¼ ÎÀý@ Ï0B%›˜ùS/%d5*žO 2p+ð>î4ÞQõ;Zæ´Ô•…è7Ö¸4Ô¹4ÚT4­ÌË¡*Pã[Ö.SHä%…Azš™ur¢FÌ\¢ºLÙáì‡=›õ«ò¥K]?úÑâk¤wJï°ùŠÐ}KœóÀÛ¿þë¿Úùá ç4X–þ¼ÿã'kW ê„®$9M„yRM„Îáp1àÁãö² Ý …$ƒ/yó5)ç6a¼økÔ¶¬|dNA¾ÄvÜܳòr3†ãQ«Ð¬zH¹~àœsM àau¢ï5©Ó–*®V:²Ìª[ 7;òdañØ´pðàAíUñ&Z‘ù’D_©IZ'}V”;½ ˆ6¨8z³ošùUˆ‚« g¡ð PÓñX¢BÕÛj¢BC).¯EÎã‚Äóé瑟™¤é”5¿s¯s.½ì¬Ý»÷ƒK.ÑÐmâúŒ½wœàîN;oétõSŽ>ÜiËm?Üißmg¾ýò÷vÛýåkö \½­tãÎÊÕkËfÏX]Þ+ohŸì]t»¬×%=z_ÚµÛŘ€›=lG0ÈŽÛŒ:Pn„Ó˜¿k?…åÅ¥òˆâ ĉ¶ö«ÏQu›aX îÈa„|yƤ)ï×7ΚF8¼„ÃE…# Ì{?„ W”_ \…¨®à\G-ÈY"üïËßþ­0üäB¼‹?-.ˆ®cþ…wuåÏ÷“á¤]&É)FŒ‹œ&áKùã'ã¡Ù':x¦ ƒÇå—\zÙÅ—Xùõ‘x|–+o z³šú:Y[ƶ¡³¢žIáibÌd/ßm„‘á|~„-[ªy;¡šŸ4e²œ)Vò q½nmƒdCAS Î<8zø}c”Ì¾è‚ )y¾Øê“F;œVTuz”M2i57’ª|êFÎVA€3É¢ž“#8/–2Ï G–ŽŸ:ÙÄ!HªÂã|k¤7° Ó¦j«W¬YÍûñ-‚Î/;\Ǥ_äË$sæ™g¢Aê—JåµtõʹË/]·zÆâùãfN¾`®¢vs/¤ U5]ãxwû?þ¦ó%—&‰@ÏL©:C|N­‚îç-Z(XbÙ*Ù³×èsÁ²%þœ³`¾ð;šO$åUÒËÏ>*'w¢Ö¹ùµY9MâœFd[K ªž5²ÿ ±E¥õ#rê3³Û ŠKûô¯ÍÈ—SZÖ}PÍÜÑy%Â$˜-=Ì„ÓúùiŽ?µ…e•#ò“Ì)%•ƒ† Z=,gdÿÁS ýÐì…Mí£‡d·å——öÎhÊ*žYÓR5$¯µ¤:§ç >lå™Ô”ÅÝ:'I)E HÍ%H òuÈýFÈp§®M¬úˆ òZG¢2¯BFÔ!ºÉ tñÅ&uPËȯA¯·+pº„ȮÏÃiGŠQ€GS ýÊ·@ßP»9Ã9ý'¡$rSÅmâvBL1#q_»!ýhaäöÁ¡ ¢’û2ùéT<få ïqùE=ϸ´Ç]ºŸÝ³ë…ÌáyYåçuq~ÞØa+¯ìºó¶N›¯ïtüáNGì´ù†Nûîî´û¶3öÞtÑÞ›.ßqU¿-G²6ï8kñ™ùEggdtºô⮃zÍʸìr&ÇóõïÖ£ëÅ9ÙIUÒÐ’‹|]1ÚXv8ńĢXlCíCh‹#!Õ9Å‚ï·jÛ8Ågòkè0Ý/nÂ3«œ&!ÃA8NLN"æh“v=&` |LÂåWñýÿÈçíETJøpÜœ³ýÆ7¾A€p/#ö"ÝøþÏÿIPûüç?ξôÒKŽÿà?øö·¿í‰ˆzù§ú§tK˜!0þOÿôOÛþ}™—C† _JÈ+Ž«Ü~ûíg„‚ÆžwÖÙi¥#B¾$<åרˆ#Ôn¬Sèñhd,V"sZ³€j Èpþ4k«Ò;zÅP-šß®% ¼$9«lA¨s a‹pCz¸ñúøS(&¨LeÈ<ó,k’ùŒ3"”ģР- oxŽ`£Â/XÒRJÁ€Ä@¸ää÷, §÷Àþõ­ÍP\å)ã&Zà÷¨ @Òù˜&1ž&ËW¯JVJÕ ƒ™MX³ ¹½¨„À=G­nZLc€´pÕò¹Js¯_½híÊÅkV.Y»jÀÐ ÏwùÊo¿ß_œv=°>†?€\¸x‘|.¾-;¶/”žR?Ë—ÈÉ3§¯\¿Lò½$)†ÏN2ž7~ZÒgÀ¤¢‘í¹EmÙí9…-ÃsÆçÛ™RP6.«`FIeÛðܱÃrgUŒËÌŸ’WÖžYTÓ„(º1å5ÜXØ2}‡ÉÞü٠sŠ*†å4æ—M¬ª/œÙ˜[Ü:¢pbnIóàœi…UmCògU· )lÏ,iÝ–UZÕoD[AUÅàœ²AY#3ò€Üå«U–ÄÃA8.”€Í6.¶¡¥¼ãŽ»"3ê¯ky?-eáä)u<$†–ÒN¨Œ:"_JÇÁ^ \×n=è*Í=´ $@ÛÈ Á=’ãùP@´/¤™ð …JhÃâ ¸a¾òêÙ4•ÔÀñÐg¦Ð…$—Õ£gi‹Å ÈÙ#x€œ8èÓãÛ|þ>#B¶:ìÈ4pz£NψÈ8V]7”‡öµBýˆÜGê) <lˆ„U¾qŸ'FúB©€aÇ81ÁÕͺ©°†:D'ÆŸ3dð°žC²{å **È(ÍÍÂ6È,ïWØÖ£yi¯ÕWvÞuK§m×uÅÝO<Ôyÿí=÷ÝÞ{÷ƒv]ßgÕ¾sÆÌ>cdÓ…ÅU—æÕ5f%‰=Gdgf 5°afFnæý“rE¡¥ô$)ÿ™Ü…«§SvE’IŠŸ¤Hi‰™<"*äþ Ê AÄdaóuvJx éÍ cr$S÷RâàÂ|墑¬Ò©Hoçxýµ×QNÂŒ~}úrB±ŽÀ¦2 úðô¦ÿ(Ag‰Ò¦:I´&!«zðä]Z>™rB«™2ç¿{a!+*+7i¢qåà:‘ îè:U Üi]K„S¼G|^*¡I➉)H‘$§p–±*0ÄéòqÝ„Oó/šµ`ÑmÊüÙ‹×­š¿jÙÂ5+€\¿ŒA.d¸”gÇÏ8¦ò‘!/Z>£ª’s U°V=\ż%‹Û²õkVmÞ0uöL+dçSã¢Éx~üÓc®Y»å=vÍÇOÝ·ïÈ#O²ÿø“¯z`ç¡ûw|⊓í;þøÏž¸é‰“7K¼yhËN#r³Y¾ÿÏßcÓãfró¡+ïsò–‡Ÿzøør¦Ü°çè¸òºªáE8ð.—ÈC˜Èp´”‘Lʶ…$gKâæ{ñ¡E¸k¯KüÖ׿Ô4Atü‘þ ñ.p+Ö¬‡pÂõéÛŸö\3YG#½²¯#²P†Ê‘ψ_D%Öƒ Æ—‚’†”.ì0 ²Íi©YxåE¬±€4—І¦«ñ-]"yŽ®RáÈnÆRIÁIvìn½©sH :4ýÂÉCþÓ`á°ùÃ3>´ô®¥€©F|z*çôÈâïvè{BÖÑUHØØr¤¢"»qqÖÀÌ^C2{õéuq¿.——åì3¸ä’¬ÚSÖdî¼¶ïžk»n»²çÆ#]î¹åª“×\X1ñœüº‹rGõ)Ý/»ä²î}ûtï-S¿‹;gvë5¦¢²+x÷žü‘WôÌCN!UG†Ìð{4ȹ"~ RÆkŠaG6N¿ºG$ÈzôÀ 8ÝA½EýoM3äÈé^·Ýf¸™$Âw áÌ¢¶@ ÉÌÓ)æ^ \ð[2Ÿ9?§õ+ô¥Lk sÄ2ZJâŠJy ÷\äLä¼}ùÙüð¦ñg?ûYíE×6üÕ_ý•6òñØ^ œÌfd¸°ÞÅöý–÷ÓR&z®Õå #Ƶ4úppç7Þöm® ÍMy»$—§œwœZ¹ê›¿ø¹59ü‹_¼ñ㟹ÿ…Ù_¼Çˆ”<†N?@ ü˜@¶¡¾ÇE æˆý‚pI ïÆF-ýdV‘fh±o¿õ6ž Ó¦$B’œ#VPÖtj’è9J¶ÚJbKæ‹hY?‘Û-·Ü"È`|]oŸüNr“·Ñq\;—Ðrý¨×XS«T-÷Qb%On#£›Ïšð§ÿÅÞð‹ÒœgÖ’/©UBWŠAJIÒX’šhÃzÚEî—s–.š½lÑÌ¥ g-[4oåR96ù̈~K^å›oýë÷¾ïN=Ð5ñy ¥/ÁWäŠT£+×®!ÃM™;kÆÂyä9ayK–%y …" êÓïôO.]2ïÿ³^ºúÊUŽ­Xw`þ²cËÖžX¾îÈ¢•Ç­:±tíÕK×]µdí‰E«Í_qdîŠK6\´vï²uëæ/á<íN™ ;Ü~(îŠ5›¬Þrpù†#Ë7î¿òäš-W.]jÕ¦£óV^»jëÁ9ËO­ÜrdáÚ+WlÞ?Õú)sw/Y·gÅÆÃ›wWå•–ç–0¬{ÂÇ÷""pjPL Žèö›‚p×]ŸXõQÔÄ6 •Á,§î¡Çž rážzþe9M œˆï I¢ œ<ªC‡%ŽÈ0ïLKRV2¼-pñ>¿šºHm˜âർˆaºFpÑD“YTvÍw„˜:h†¤bV0™ç;ÑO3gN_¾|i–dØY ÂUcH'(ËÚEK‰Eº6x”äÄh â*»Ä %%iéБ8ƒ­ô'ÉùØcX!¹Ó€p?Áã@‚è'0Ìí‡sf(ôâkõí»‹Ä£gÿúºõ 7à3[ ÊÎï_’›1µmÌ’Ek'.ÜзyúÅ­3‡¯Ý3tݞ û—ßüpÓâ­…ÓzeWôÎ.m?cÃö½ ‡ñ„Ú«Ïèü‚¢Õ¹›—¯V”¸ ;q=jÁÆ–¿S1¡ø Ýi(f¡~° _›ªCcK<ŠÐFji_ئ§DK{P¶n\›H±-p œ™#-„3©"í²#féd²ñ=1߬ Î=ò +&ä¯Ê—"ÃÞ„D]}õÕvØánºé&ð[ß’4ÚÌEÜ–f¡À$¢ÑRÂö4Â}ç;ß!ç™Ç!ÒE·ö!æáÈppLq †©|Œ[ªÿä*Õ5 Î¥ì'?ú1ñÔu¥|ö: ¤sbl7¼w%m¸“`lÃÉ\…¶CnƒCr3ª!@G'ØŽ8B" jOÒøñɤʈwÎM/NÑ:jÆJGGÊ _o ø‰W½#¾Ô°.JmEÚ0K¤Ô‹:É2¦•S¨Õg¦vŽ–’y0OU%‡I%áÜJàလê9 Q€ Ýô-D$jˆÀ…cä¹5š~LN ×¾ÝPÛ¦Ö‰ƒ MÏá^‹XÆÑLJé–_ ök_ï(ŽJE R66ÒU‚b‰A®PÙÁêß"x9ܵ¡$ÌiAÄýŃ^ÇO¡lôS8s†ý) laÄÒ> ÚÑ•D´xÍš[سtLÑ„²²ÚžCû_6䲞C/>´{Yþp1¯#rË.Ï-ïRÕ”=wIß±S.È)ÍYÛÕegª -Ü숬¡EùYCû÷Þ¿—Š‘CûõÅ[5º¶ ªú²Œ¡=<‘¤äPâ☈Œ©Â7D·PÇ€íB?¾0QN X ‰3°-ž@ 0s;Î ·Í<Û¸ÍèPãÀBšªO²ÿÀasÌtJ#\dÏ „Ã]™{0ÏŸÁoA8kðXDN“_I´@àPÚ+ä{ßû„“r-ŽÈŸáHé¾› (<-AãþäOþDƒ×^{ÍX2œLtiÿ)§>_ÊtÔápWrL(€)×8غu;ƒ‰}вvõºûöoÝœäÒ–S›kƒ<{ª mÙº=•k|Ûþ½û¶nزe݆½[vn߸yßžý©¬ç+NªéŒÓÔ3ë7q[íôŽ»ô–*¶v׎Ý[7oÙ¹eGB[W®Ý´acÙ°nãÍ7Þ4gÖ\åÖ¸$pƒLU]IFE l«·ÛwÇæ¯wÝÛ¶Û×Ï®­;·oݶq͆åK—¹: ÔÉÓbSù¼3¦Ro6žT:ðí\x¶mÛ±uÛŽm»v/]¹*ɾqÓª¥+·mØ´gÇÎÛw¸åm»v&¾«V*ÿö“ýaê?ýYÕ”Å4IÖ• ¥T'PtJÚÊ¥ËæÍ™ á/Y¶hÙòéÂç.X¸z•"Üó–/œ9¬ÓgR3&SB¨ÆOß$§Z듾4Uü+ÍBò¸\Î_¸`éÊV ÇÞ§Q¹Ç+öîÛ²z]‚¸oÞ¸lÕá]»w®Û´sýÙÔöoÞJý¸kõ:IInÚºsÅ:[Y(·/Y±oõÆ£wÈ }|ãÎ#[víÙ¸uÅ’¥»v$ „ò KVܸýàÚ-Òa\±Q‰TË-‡6o³Þ²ýÀ†ÍûÖo’Ðr×úÍ;7l>°k϶«oã߱}öÂ…ý(•ÙŸKY!p€-m“ãôaF¸ëoH¬ú`¶!Ìý›·rí2\0Ý!ÃÅŠ´…€ðEÊ0ØDÄz‡Òï99‚&1©½z…ä$54~9x¡¨íÍ‚ »„Ù˜ê¼Ïå].¡¥ lógªb\~ UÿI´”¸l.xs܉`UŸ![„ýXæÐU¢Ýáa#di¥eh&#¡p”ΊŠ"aÏ#€8W Œq0L€ øedguÉïuö@…á†ôÏÔkX·˜2z÷îÆ®Ë%ý_:,ç¼!™]r úåvéÙW¼JÿnÝ{\~iFÿÞCÕØk°Äq=.>°wfÆ€ÁýûôìÝãò¾}:*{æd_Ü¥Kai§Ö@W®"ršß`xñ´cÌ–@â€ÆÐOjà/—„=‡üõ¶IK¸óD¡"?í?pV™`ó/ ÂÁ-sÉA‡êˆprè@8…—öùE` z¨ë®»oŸì€4 Ì`iç¨æœ ¿ò•¯ð¡’_5Nÿû¿ÿ{–IÙÄÓ¬k@XHŠ g½þú'^ýèÇ%TUã›ÐöN<ÜæÕ«Ö“Ü%îâi"ŽÇ-·¡¾¥zT#T¶ˆŽ?E©Õ×5“"ìsäÀå¡S:”cc¿XÑ‘2µVU——U敬®ªÑfâÄÉY#òdÖVŒç® Ž^I^×ÊÑzæñΠ[¢’™T[UµE#K+e†³¥7ÐÞµlñû¶Üœ¥½-ÑF5W#tœ¾³¦ZöÒ‘¶zÐOb$®i°­,¯N„ ÒJÛì¬|žÌ|*“¤éåRÄ6Úº žcFX\4ÒØÜ‘«k#ppc]“6Éh+¸¼W kv©„µëÕ»#‚¤cÃk&íD“ò¥<ÿüså9ë¼jÅê¥K—+i²dñŠU«×/YºrÒäé Èü€-^. øÒÎ]QùÑÞvÄjè-gÂ?3ú}&º£6`†”K–.Ÿ7ን«×oØ4uÚ H,gîì™sæÏ]“~ôýŽilUĵ²´‚êR‘RÛ†šzQnÜ÷%yUV™ÄTÏ^^T&;š²®¹C†ó¢TiVÄ=³"¡6qýýÅéG%#­+¯âS*É‹B JŸOŸ8Yè¯6g©êÎ|èŠDgáöUÐ\’º—LmljA:QHzÏ?ª{ÓRb€l“Š-«Ö47·zMd8*„ÕÙ~Õ2Û»ûÿ?”ᇠ„i$ÀÏAÔçÑ'Ÿ ;-¥ê9öyâiÇÓjþw…¯F$â`‰ŠÁq$}ÜÊ Þ5â= ®:Øß`—ãFÞ Ãýù¿þð{o¾…È$ìÏÏ~Ž O·ME$¥¶ÿ«ÛX r|ö¼ƒ4ý‰a§[ÆíÄ‘Ž~éX:t¸#Í|ïµ’žC_ÄðóÓÿú“ ÷|ãçF•b夯¢–¼~þ‹§öUˆG¥”d1[¾÷ýQk §øècOÜpãÍ÷Þ÷Àƒ=òÐÃÚyø‘Çn¼éZ“‡‡pfZêBKù«ÊÚ{âåýó?ÿ³0¶Åí…w¥ÚÿÞïý^ú)8ÝáyŸ~Äïzèï}Žîc¯~±†p"¾SA›˜ßpOÖ®ñã&'Y».ëNP'xà¼s‘׳%8¸èÂÎ~…(À Ñ`ŒÈëßO Zæ°¡Y‘À?YíPÔ)¬Ù®ûèäœÛùÒ®_zI—$õåå=œ¢ DÐ?£_ßA†ä,8+Iˆ'PVþÐ!#¬vb>m¶Œ±éÇŽÑ•‹:—÷—uå  ÌŸ®sÜà iÁü%T²ŒŽŽœÞÅnÐ-»hß> ª±ãy¹E:tÑaC³SÅŽUÎq.ÌðPˆÂ<ܨ@ZÊôüŽJ@¶‘µÈrÞyœŒÎÄ“‰§N™9o.Oÿ¥“'M_´pùVe¾×o¥(^±|ÁŸ{Î…3gÌ (£'ž‰Áï4í«–Jãy!^æÌÙóç/–ÄY’±°=kÖÒ0äõÿå_Ç%Kz'b¨}bQü/~íøÅÅ~:AAÄ´˜Æ>Kß-–32®EàNdM¤¿l9X´¨â™P8S”%õh››YPÒ‘³)¿wÚ—Ò°äöo"«÷"\ü7î'o$å#:.̤%ISÀ4t¥ hGíNêµ&ݧ›±NQyQ- ¦è'o¾L6á¶ÈëÏðƒïyãïFhŒâÒ ¾õ–É€wÝBGôÕU2ƒÜ§&v2½caìxzü`ÜÝc?®˜ÆèÁñ4;Cý`¤ ¨{g}Ëxã§?üù/ôöæôýŸý,CP×w>äI¦½<‡Žq­4ŠÇ—ò¿¿ØÿõWGÈLwîÜw 8.,ÅwÿñŸäV®Z³wß'ž|úÔµ×ß|Ëmà ¶Ýwÿƒ<úx„{ø‡-åÿ#„3>€o¬ñ°@”ð²p÷wK¨ƒ#„0[ñRø‡s(»=ñÑÄóø5q¯­Õ›g¤ÃxˆôGÄ ý,þîïþîýžlÂ7¡° ÂYÕ‡“Óö¹Gå‰AwÜ~Ïõ×Ý|ݵ7ÝzË;¶ï!‘ÄÍM™<ƒ`Ç÷rÚÔYÖÖ–v€áO=øÕŸö¥Žš4qÚìYóí“aêc>µmë.½=óô •5 ­Îõ+ûŸÆ¶NDúµŽèjâ“3ýéWG®‚R'®¼æ–›ï€wÞqïüy‹ÔÌ¥! ,:ŒÁ(¸sÄÚÔ8†¥O7i¸ÿ‘›oº}û¶ÝÇŽž4ªki¬Ýj¯Î¶ÕÝéÊON§FäÊ…™ŽòY‡p1Gm™ôb¡uò). ðbg̘EAê¹Í™½À£†s¢ãæÌ^8kæüÙ³,]²¾ÂZDZ}4¤RêknB"¶”—~Hiº‚ ¢EáÜ´iHçû“$¤ì¥ƒDRÖ¬ˆhL}~ÁÅ¿íˆÄ½7=OLsí±ÓQèHìÌ=¨Fµ³Ã¡.T4”6i³ŠÊ0Lgeb›½Ô/ÞÁ°=¤TOÌ!}Å7ƒHm¸™„$÷$Ã…–ŒÅ‚Æÿ8çàÈp´OלºŽeý©Ô¢.ŒmÔÇy× ”Á û‰CõÇ>ö1Nθd‹ú;bŠ—Qð…ÊÇñW_}U›(®UÖ>ò‘ØW†æÅŸäÑ^zùÙŠÊRF€ëo¸æÙçžTRÇñ»ï¾³¹¹Ñ¼ô˜Ü"ЧBeY‰Z9‘$:¼47–p©§?³¢RŒƒZF>‡H Œû‰üdv¨FmMPNPʙᾦz1QêÃE‘ ¤ Ü;‹?•ø±ýèG?Ê|ãiØq³ÚpeëQXÒµåœûë¿þk!o×}þÎï(øð¿ù¹‡|ìÆn‘ø 9W3éfLŸ£7ý@)ÛØ ôr¡sξÄB8jÛ‡züó¿÷ÅO|ü3~uË~5¸H Õ&ŒŸ ‡Ü—ëº5C’™A¢‡yóHýŸk:]²7ë-À·c´‰™"¶Ï<—Bå~¬íèÓxHQœD;ÅAûÑü¸b’-ºS'æ„(3d߇§£Lýùg‘'wNÒ1NØæ¬Ð©"aDÏв†ÿt¸ °Ãyè$„ûM”áBÖ‘Ø „ ´ È¿‰pž¶:x‚H ù$»ÈÂKä Ž%²VŽm¹D%Iò&OfÆóŽü¤1ÉQË6|#·aôŒª"2Š~«]) iQ±xsF…";‘£Rµo8"žM(Œgý‡£DØ–¼Í°EÎ0 ÂçÂò®„úÁôDÊ•t‘蔚]&I$e6ΈGõíhYŠ"ÁÅ~Ü‹[vïn9BÎ_Ô8µ‰˜¿H'àaêtìd+ÐÆ‰Ô—HO4Î2¿úI³xVáAO)íin8Ž„Ý.ìyáVêíG˜¢…\XéöìÝÿ–÷ôé¹óìÛÅãOµôÜøŸ|óÏžîå{î~àÑGžt]êÍè!´ gy^æðÜæ¦±N!ÕÒ GU®µ¡qôØöf8'þ-^J¤Q™ÒI1Ò*‡ƒŒÁû“ĉ!pƒá{iq§áW¬@ §P÷Ï*øc±Î5v\.B Ãçø•'CK¹hñÒ#G3¶¼êšPN¶|ø±ÇŸ „sÂ=ôèS=þôcO=k†sï¯Ê—Ö% ¥Ã:*ŽÓ˜öBKkx;f° ’Ç€(85ó'òèŠÍŽÙ¼ÒÙq§#Â#ph+ G¤Cd‘~0ÃäFä„!ÈG2ƒ1]0)°Mq "Â*'"ýðºèâl!{…Õ 2ùI%qˆE–¢Z´ãaäÓOù h\.Ô›]ÙvüÄŸEC6F®ÝB\ÈQéiM°jŒ$„B+`-Ú[‰¡ô^¨Cé-õF€c{»äâËõm­2 Oš8Ý´„¾†AZ‚mcÇŽƒ+Á*úºâ-Û¢#>‰D™8k–ü)´”€ÍJX9|ø¨ñ¸dõ<)'©(­cZÇ6碆9¯é]Âé‘ ÐWŠWµïÒÒã% Ï)Ó€ý„ è£â£½t5 €IN:\u˜ 8ÂÅ(ÙLŠâ€Í–ÂÎ áÌoHLd”ˆò>¿5"þɂ䡤Ð.ô-á/î³Dk|¨Úkì`8žE›ð Þà´A†–Ò-„~ò7BK—³ØÁ2Âaœ¡Ýÿ ©â—ÏHîÐãyb{ˆ i™#d—HóáyŠ'À¡ã ëž{îâŽøèc?öôÃO<óÿáP½t @lBŒ{¯A2jiœPWFûwXû·]}D+{úi‡á:º÷¼ä Üë¯}*d8·bùÚ%‹V%nÈ.œ#î$9MºõFè‰JÈññcW‘œnºñ6F¸+!H±N+ ÷ð†† Rè?9NCŠG½¡×7ǧ0›Ýpý-d¯}{ªc¥jôNqº- ˆ:¨ûñì´ºØ3ÇõÌg0GœØ¹c¯«"õï,§Ø1 ê‡Hj$¡ ÍQå8„ÖníàGÝ襤… ÐRFcꤦºa\{"’áÜ,‡Ox{€­`(Ü Ó¡7¶¼a‚2¿S˜®Â¿piÄ&HÌŽè §„à À'7–Þ½¸-¥ƒ˜ŽènúÀ!§ }Ø»w7nFÿÆiVåQ"GÄä¡ÂA|c„(!ÛàÐAã‰Â¡¦(”Ÿ¡†5¯"ðÙM…HdÀ qï†mìQ0R!åD*2í£Š?};å~ÃnúAÇ8‹t0 †0&ÂÄFV]îQÐUŠ‚çXìg£+íC¬øòYè*"ƃXAÆbY< ÷BjD;ÄEý”ì´Ô,ò'…`âZ(Z=“`h4súUWŸJËp®8D-yëmwÜu÷½pD:çˆ?­=öø#?áú¹P¡ÿ e8C´J; Þ¤oÒðÕ". Nid^ÚI7’¡¤ëà2ÂÔPúÞTÎïE8Õs êá¨Ë¨(Ù`Û¢…ËÈ &… %jËÙ„¸¢´DýÉLD°$¤.khó˜ÙPrì‹ÜÃ@Â'? v8hªC’Sh‰S!~éjB@ÂQž-R €!„'’àÙ¨ˆh JŸZ:ý‚ó/[iñËx¬Q*ˆG¥•H ¢ô¬uæ Æàüˆƒ8ûªäç•8ËÀÜ—k©ÒÁ‰m¸âÓbú»T”ôçž›¸ø$ äAÁN. .á²³ ~ÉÅ]<+=•!¥_PÄÜQQ&9Mmg²èŠæÒÄ "5£JñH' 9Hl”°ŠÆ’ÜFhƒ^äN ö:€°8á4ÓÞ`:dK0 @=}r,Þh ÚÞBº/ |“áS ÕÝÈŽíû¤é‘2 ì9¡As=úRã4Ú C‰n!ÌýFÈpÿY7<3 ÈEF«°Ö vÁ죉Aß“FÉs H ˆcw-Qۈ׎¼wA:Ó,ñÌ#:Í%øþ¨•Òê““›Ùµ[çž½ºª&ZÊ»5—¤*IÕà’3`†~Ò¹ÁÌsÚ%B>‹(®À°XÂ\gɫ⠒Ÿë6„S\nÞˆ‘åEìp$«°ç%!A#G{gœ®ÁmFkzÛÆ‹‹ŸBëêqãaoäF-ð§Ù߈™‹0G§§³W»e<ŠŸ´ç‘'Z@¾7BÛ=÷ÞOho° Âñ®|Â)ºûÿá~©ªðß<HÍÒy¼ìBù¸]ýõaÃKÛí>X€ÓòÓŸþ,Oº8¤ŸÞ–Â.+Ôpa‡ƒpIžá9Ä&X Eƒýû]yüjx€Fpv/â"üNÚƒ4"—}X]§~Ps(ý¹ˆ_ºQÎÕCZí©[°§%0ÓÕ¢ñÐFkÀd8°„O ùÏÀŒy÷®ý| !ëlUg_ +;aEKbøFŽ 'O½Îô C£šù•î1\l lÏîžâÔ0¢“ÄMä¬óKŠ+ %êM$!ð$Pd #"BïË ¢ý—0ÅBuiÁhkÆ. L €Ñ'qÍmå'é°µeœœ î ÂáÈ©éâ*ðIW Tà %ŒÞhGi)}€L-ü9Éj‰o§dµpâ ± .*ŸÃ9 LÒ›![uØžQÙ·C„vXÈ„ÅU•;õ'ܲ A.rJÙÆÁhR|±.IO‹îÔ9®Ÿ.ÚÞ¸Àà ÈpR™x8n*àzÉ]¤ãá>°âá¿ù%ý‡Ä·–þãåþéwþLN“´Š %¹ ³L¶£ Gí0õ'UO~üÆÛîR[àðñ“O?ÿÒSϽÁI"ߥ¬ðÄDÄáCX¹ k¨s˜d‚n2F¼…ë‡> Û.‚/£¶@zýw|IÖüÿ”…³eÇ2§ï¹ˆ1pP–HB-¹Â§qÝ´ôö^Ó]Ç1í¼öÚÇyŽÐ³¡òä¡ð4‰`¸$yå:œ–ÒJxdš$'ôVð)4:| Qd² <§„,Ô}$RiüÈ[l]p–ب8EË𜌠ˆ‘û¤6Uʹ_~âKârš€°Ñs0/ØÃÂëÒÀÜ—1@û°Ð–™P?®¢# ÉÒÄðÂéö¯:y­Û ç”p¼´ºÁéÓæŒÈÌ36=ju*8›™èønaOáB©ÎfÁ ùŠcH¸‡ªÁ,[ºš%#„Ãs„ çŠé·æ«ôMšè: }Ž^$TDt¤ìP tYí@ЋфaT$)”öÉpÔªÄ;ÊRß] 8q–Ÿ`O“xw ¥,¨ò´g>{-ä4ŽP9;¾O€á|êQL ‰ô=#‘v™)'d8¨'°Ð •ÄO·Ý&Tô?åÃúwvò~Ç—ÖF>ñÌó`,P-* eéˆp>õÜ©oñ­ª_!j…âHÙÅÇŠ† ‡Lƒj#m` ]†LÞ5Æ~Ô¨ w ÔÖ~d9AÓ‰I–Ï”²®½®P|Ú‰¤r›ž#Q2—þ#¦Òò^ïÊøê”Èub‰èË`0ß[a®ãÇ^°Ã}ô#¯‡7|Š|Ï™8a’ nò:K£ÈÅ‘#¥Èk ¤Á‹ýŒÜCIÈE³héOx`xè$9¢¨õàM´‡[º _y êÄüAG§“­0€Á§áüàÍgŒÓ5l,gÀ‰mªKA©Éa¶0ÉÜ&Ä2°¸G½¹;ÎCHÁ¼LÈIWG_©§wÕùRovØáábTe 9)X¶·‹±¥ÞBT sIE½¤”9ãY+àŠëê È¥œE§ EPxnHÆñô p1-ÃLUŠ®ü_/ÿi2 â ù.È4€ù•Aîþá8 Gúæ$Oû^¦ |À|æ3Ÿûô§~+\EhÛê[ËGV¶ÂC„øÂ¡C0¼¡dHB`)RV ; !4`0£¥DŽiÕ` TƒUà!¢ªC]ÉÚJIE0Z<†.+]‰³æØÒôC¨¾”¡ðDëžA\€g„Û Ä%é9ÄJ£.f€TJµØqTÐιˆ\)„s®ý‡`i<òü6*]ñ7xnœ†Ó`Â:¨Ï²ÒªœìBwä"ê<%äLå‹át ÎZéÇN‘ˆ •­Ø›²¥f$ V¨!ý§[Þ{ûX"¯(‹‰C‡dÁ]®+Ó”=°ŽN\Ž2nCpÅAƒ•.P-liaic»Iò“¬pEáz”:`Õ¯" į ‘D݈#zcëqzˆ†4®wÈ—n%¤Ä'ú(á_”uŽ˜!mç· |‘Ì]‹Xu¢bxFDx,x#uÀ9€4Iú¤V Ðõ'4ªçÜsÏ}ÿ×ßâê ï‡p7Þt[8ª!èHá".d¸æüyÍõ7½òÚ'_yõÂ¥+$€ðCh¤‘ÊQ¯=¿0­‚CÖQa4~ Ä¡ôC¬ B‰£GòÌ·°t}wÄYÁphàG2=!…˜®ëðt§ƒ¤œÌÒà ¾ªÄ "&õï¤ÀA“+—kãB2ŠÝ ì!ú„Õ~ˆ Fè*i{Rˆ,Æ*V[wAôÔÅHÐñâîâ®Ã™ÞOŽûÓ ÷]7D?0À¥aa¸i„¾1üJòcÜ{4Ž"éa¡„"ž•sîÐun*2ÂQj†ØJgËöÖØT+Z€–Ò3q0€9Lz` ·6<ܪÇޣ޸Bn YÍŽ …*Õ‚ ¯Ë¸M;ÚDѸÍýªûQ‘'LŒî1´ÓÞB*=Br[€“}!ñºñ7gO>õŒ G¤£«ô'„{ìÉçÂÓÄ,µåõ«Šø|ná˜n)iÉL•lÎ5×\=wÌõ’ÎŽóÞŒ;DÃÓŸüä§Å5ó¶Hò.JÌ8ª¾´¤’J`ä1‹/°GÂ*òU”ÿo·ßvw„D€ZñÝ,j@1m & 0Ä5v8Ðåôа„ªSžAßOH3¦ O·Â3¢ë ¦Õ€!¨– rpËÈcT¸{ïy_e‚:©_#*@‡‘ÅE#Žà­á“‘;]H£[É\ˆq>ð¨‚çȫ⺩ ,ãlbHŽkïHJ’ áh)#4§#ÂÅt7eÉ^Â×A+‚ÎÖ>*n|æ q“!œÄ`x‹ˆp‰È­õ÷ÿ]ª<Ò›N|-ñmè/%rÌüj$‘Ðâ„®’dI}J"®9ˆ}¯j– o¨l°Â9§A%ó!&ÐŽX Z@†C"G_ÛD/Â…ÒgÌÐ ˜çO`¦=¦­uÐ,Õ ¹Ñ°Ô¼Y<+Çä ÞØ x Å)9ù°#Þwßÿ‘/è?~îû!ÜÍ·Üv¤ór±½ºáí—’xGbK#NÂÜ€=G®÷aÃG¨€J6" Óè;17‚QlÉʨž 72çD<Ø R²ž6*ÉÆ#çÖ*ä63Àsö´½oPËpdp¡`S§MäRQRZ@^áo’sÙk¿³Î:CØ€i–Î KXxs@Ùp•´ëƒ ògº\Ë…üiá'L!û!¬„ûLøF†»|œ‚”S}‡c‹; ßBwL•¹§Ã(°àÉpß—ÝÓpDW>Šðf¢X£õLQÍp`æ­±ùIÌ"F‘%ç§…9Í-õ+W-]°pNÙÈBÏ„˜ É ” 95ž@*¤Œ…ÏŸ>¿=«0†ˆCçÏ*œf #¢òµŒ˜œøÕ%Ò:×Uà¥KCµÀÄÑ縖@82< „ƒmÎ%>þ„h9MLHS&5spT¿~ŽÌ¢bjúû ›l&b9=‚ßýÝßõ'yî]&·´>󃳣ò¥”L„ÄC­gK:áFžô‚ÌÈFBÄŠ _JÈ-þ˜ãÐA( ‰e‘³Ñ(Â9ˆ`dXάáXOû*D'†–’¥ È g½s:¦D4}º(\ÎMG³…TÂÓÄ%üJK©7îͪÉ-u‰(u¥CxFþ gÝFÌxx‹è–á"½1_}ÕunÄ€41«Þ&Oš‘—[ì¾tå$¢ê¸ (2,â uÚçí`]aR¤$ˆ…‡ o"RNvÔO 7e£ðÓÖñ‚ÊÝ Áû•Wg:½0‹~¸Pê“¢2ú}&ˆà…V@òY уvF!ÞI$ŸÑ:|Ì]øù“¨H`›ƒ@ކ< ³i)E‰(B“’x“&¹A¼6꡹+"ˆ}¨¨ óÑ:èDæË¤œ„Ž~Õ#~"LD [6ŽŠäÓÖ'TKù¬%*\ò%‚ঠòÎ;ïþ5º™„Úßö½ž&ù@8¢>¤9å¸Âë¶…SÖ®>ò-%Ž×IØá‚âde甤·eZx‹ ¬áˆO ½VÚmGŽ'ÈkháœÒ%ršè MÔ,b³B( Ê"m$çÉþzÑUÂ6¹<¸œ ÏRùÃ9Î,tniÅcøºh„»…¾Ô[Ñ$¤–Žž“0ÒØ4‹–!¥…1ÔtÑ>XÂÚäŽÀOj8•„>П!Q92œa8%²[±\:èÞCy—“žU8˜¶Æ1ÈÐX¦¤ˆÐ$Âd#=Š!CØ‚3âfÚ©5|>Cwž>öCõBœÖ¦ÆK ©×`BÅï7TŽñÎÒ›«Ä ÝffÆûUŸa^=xè„ãÄÓÂIÍv¸€4ÂÙÒ[Šø¾ÿ¡Çï~ ‰×4MB³48ª_?½‹ë„m2­;v uó"o¼ñFGþæoþ&Ä»hûãê:~ïec?ûÙß’é*âÆHuµ(~B^õÀƒO<„#E&eB êH«øRZ_ÊHAB ²r|G”¡NXªH?0ŒxçHŒC‹HV°K€¥|’œ;"7 M`D Р¸‡ˆ\` è–,¨ge ”“ºÈ^dÇÈ' #ÅŒ‡¤½‘ØÀ°(< Ì Rš~4Ö«èÄ XBS7.’ÝÝ…/%ÿLŠ\Qküb PÈ^l`D T˜ª0$ä>ýäéâ‚ñŒ6¤¢02é3Rtº4#(“0%kD¾yà~%ÃEæeºÊ¤NBM PÁ‰‡÷š˜¥¬e3ðˆ@>Ñ‚&ujø¼UÚB IÅ 2p$NBvƯsÁ™­~xí ᤈK›Ð[XõV”¨…XW‹*9ñXØg;Ä8$5)ÁZ_o'©´xqÈpT—¦’”]¬z&¤FØFKiÇ ÞA;d¸ÈýëZÞán¹õN&¾› ¼ñU‹$Ëi-eXøƒ}>tì„u±Ÿ-[A¼ë®{œH0Üç ……C °®¾Yµš©ÓfYÁ±‰ˆ©7ýÛO®kjùÊóÁ“Œñºënànî\û¶d”p׌’:~N´ã\*ÊHª Gþ|êÀíܹûäÉ«!… c³ê‡ÿ眹‹JJ+UºÉË/^±rí´éÒü,©USRZ±fíúÚº†šÑuÒ $:RÊ”ÈD¨8´ÉŸ‚Õ xþ|×/²´¸_CÞ`ØÀÈ[FeH‘Ù{&å$ÃS‘p¾1Ýú"/%¤'«1‚zzž*ÀKªU'&Ì$`ä(@èNi†´tG.'°Ú{áŠi_KoÄ»ðê=7q~²ûs ¥ç4òñÎh!"Ìc:1’ÐÍze2‚Ø@¬_aXxN× ´ âE¤Dˆƒ`4:HÎÐbå“çª+ ù2\cì•÷øüó/z¿Æ"¨€pá„}ËwÇ6¢¼ `#¨’1òï½â°ˆïn½sæÜ›·ï¢Ét<æISs«YDPöôðIQ8£c¨õèÖñ§¶”ÀxGðO81Ͱ÷A·Y_/Ùºµ¡©^@w[ûI&ñÎâà3yâ¤q²Q©ZÔÐØÞÊÁxl{{›,ã'´InBA—d«›Ÿ2i²²Ã“Ú'¶µŽMrŒimÓ¬Ü/9sCó좶 ´^¥ë:¡“qĨ,†­±ŸB¸÷§Ÿ,ÚÑb ·ÛpÁ~ìà8`?lÀvL›¸\x0…•×â¾L0—Õƒ ãWœ\*–fge?²ÙŽ»2uâ”8=TëÚk÷B ƒ\xšø‰C/x»õ®û¢2jáä‡N†ëTô–ÐNq,ð7¿ùÍ´ò$­“Œ¤'œ”;ü•¯|í‹_øj$¯JÕpI. ÷Ny% 1ÜÙ‘€DŸÌûÀ EnøpC”]»öðç&UжiƒÈâ<8âR¿;—Ï^D\!Xh®™‡%'@8—|€÷A y^ \'öîÝðàAD-%ø'©(æ¼§L>š¤U^=wÁÒi3ç-X¸lÂÄiåÕŠšA‘™³æè–(ƒtÊç²aún¸NÀg0¤? …u‡”`„h=i’ø¥HÔÉGY¼*Ê“T,ðä °(²9´d ê¿zÏž]òÔ’Rz ù’Ðïó/¸dA0¯xÜÄi¹¥ —¬œ>kþ@;v|yU-㊲Êj:¨Ÿâ³~~ZA”³Ï9/­¢Äö¦“¨âàhöa^Ê”%¡—/h¾O‘ßGèé1¸\úzãµbe"y’N0°QsΰŠÜìvÜœ0!w”&W—JÂÒ–ÊC]ç{¿”®uõ-s•_´\Eº¹ó晳æc#» —®" /[•«šÒªuCF´Ë—-_½pѲÖ1ãh’¦§[ï¡™í$Éq“'M˜ºrù\ø‡‹¼fLJFôBðŸX@Ð6Nª·ã'TùóU§\ÔäsJªìRó";2Rš-1m<½y2ØŽ^x)ì‘¿®å|)¡TäYŽŠÞH‰(·@¯€·°‚h#BàÕO|æèÉS¸µƒG¯ÔøÅ|ì‡?R¶æçsi“Ä¿UðåíÇÐÑÅ:eÂÐI÷†ì?=ý#ûož–ãIMÅÒ~öÖ›o$…ÔX=H?ûù›ßÿAR\-õP5øá åÛõáo„Ô®*‡?IF¦ôÚOO¿ùÏo|ïÍŸ½]’ÆPcfÆ“I)¥KÖ9ø.+I¤Ï o¸wŽñS,+ÑÄ‘0Ätt)p×éL e`þÞ.â"~‡­ãIYA£Oµ @Z(0£‚}|¯¿B¸¯ÇSN_=rqÄàÓ±Èé íc`éf!¥¤‹`Ç)ïNœÑÌézUï›î~ü¦:m íØ³h…n@lå3/¼lšÙš‡¡7÷ÀÛmwßž½¦JÎ5Â¥Õ’ìpHÞoÿöo{|QçÐ3ú7½ãùzò_ýê×!Áù³M!ÜÂD©˜Â$Œ9ü€[¨Ģ΂Xd#¯ý$>éé§ŸE¦ø¾§ ;$y:¬\ÌýŠL#ðø8)D Ái(2º‘<¥¢9Š_¾öÚkÕ¼›v?Q;„{=I…®¹¥mOÏ¥â .³…sDºæ–±„t‡µ°mÇŽm‹—Ìß·×=÷ÞÁ\¬Ü-È;•B“ùJ(ÎIdÁü¥VX>aütQ FNÚH {Ó†={ÕòÞ¨ŒÈ¸ñcxÓÕø•ñŒúô̳ÎËÌ.(­¬á’[T6U­Òe«¬j*ŒªkbÂ;ç×ùKV¤ˆCB% ‹JÂM^ ƒ¼?)ô0ælø^Ÿ[@úà #8A €µhºñºE=B‹È¯AØó™i’Z¬Åt­“Ä0•oܰÍÝ'„| `£v¦Vå@4cú\/¥kh3ÁÒÅKV®Y»ÉN™8÷9 Ó6ì­^³qÙò5Ô ¡†mŸ´dùše+×iß6v¢´¥£k{vë;,#«­e|û˜‰Ú§,_²zþœwÓÍ·£2˜e%Š  #¨LÄÀ…/¥-n¹óÞ«¯¿yÛ®½¼Nè6_ûäg‚ÖÄš6¨eü`œK×?Ó2(/Ð1ï Ü;« Iêyþ4A¸(j ô~ü£Óo&÷‹þ(™ 0 $ô )æïŸ¾¡<}ª`¨Î’ÊqêÅýâ?þ—ïþä»o$=¿Ígă”Íq¨çÕÑ'.<àÒ9 í€û[-tرpkú”8ø¿ç;ÏÎ]¼ùÓ_Xæ.±ãcí°/^ÇQï€M{–±Ø"S.írï}Ü>€oBüwõÛó4¢œiH—éødÒ°š>˜œõÓ7~òÆÏ°Îßû×›B·î0ñ¬&¦ÊëˆpáåtσZÃ6éRM……§Iúe¿k'žµ@ï˜4ŸùÌgèšÓÅÁC¼{çµ}Ï÷¥/~ ª!ý© ÷ Â%ÎCm“Â+4Qá熒’càÕrC˜;v,Q-¦DDHVÊ« #áÇ1Šp2ë „cq%]¡à’æ!v(øW\¡œ•ý÷¡O‡L¶”Î*V×6¶”U^°xÅ ²æâeã'O«¬Mæà,«†uxå­Y³jÛ¶-d†C‡®Ø½{'Ÿ(úmÖc‚`JéŸx¢C2·É/œK¿uj*+’ü™ÔƒçœsÅ/ݹmÉÒsæÎ¸ÿ»'M'¹g(=¸}ª×‹/¹¼¹mܨچÅËW喨ǽtåûuM­£šW®Ý@†YUãø;Ň“"tápž÷®A=‚Ä;HÏN/éÞ#÷9Mô"˜Fl¯ãé¯ ÂèD}ú D:Ú`1ahSIZ^"»#û%¤À:Ï”lá²›šÛñ‰ÏþóŸúÔ§”Äú¥‹b_þò—¿õ­oýÕ_ý׳o|ãû·«$òçïw¾ú•/}åË_üâÿàk_ûÚ—¿ú•?ÀÆ~ýk_øÒï÷?ÿÕ¯}ã+_ùÊýÑ7ÿìÛúµ¯|õ_ûúW¿ðµo~ýÿìO¿õ­oÿÑ'?óê]wßüЃ÷|ù~ÿï¾ó×ÿøÿðŸúƒ×_þø–M[-YØ0¶vòì ­m‰2Í8MBj³Ñ—kÇ˾²óÓk8›ç‘ïѰLå-¦´%öŒºôxúÄ$…CE¢_}~¥ ÄóÉ`7UÀ‹mÞw­ž‚ögú—*„üá7þDé;ßþÖŸÿé·ÿ"½þÃ?üã?ýÓ÷¾þõ?Œõk_ûÆŸüÉ·­ú§ßùÖ·ø§ç/ÿò¯ÿê¯þÇŸÿù_~ç;aÿüÿá¨|þçþíoÛV1ê?ù“?qä;ßùÎÿñ{øžµÒtJÍýþïÿ¾#ž0[’?UôŒd˜‹[C댜vÂCó #Úǃr0Ü•i,=ÕHôlë9ÄíÇsC¸º:|ÜìúØ'>m.™<€ Û„Ç¢·ÃL-0G{òYÑñ§™÷aô4yÎu´Òù¨ƒ^Çâ¶ïÇ>¤ûpÞî—¿ôut?Lq)É&A»ðJT`)4HЋê {¢X\غXªÒ4àɉ Ù{"ç!A(l*h˜Sôcë8•¦ŸÂ›Ë»ä§ äøïòlV}Â+‘×'^êò«`Fu}óŠÕ€jK6ocÚÆ éŸ4yªö&<èë×+ ½ìøñ£ Ž~[µÅT²Ù¤Þ´K³3q ¡€eM¤R#‹¹©Sf‘rÈvÐ=U)f´éµ`Á<¥ ×­_µqÓZB!wjýð} ƒJhYTj´_æ8Ñíœ&ü¥µ”Qï*<*™Ž}ù¤U_©ùOä 1•Ý;€Ç øªƒ‰£¾pJœÎ¤ül-"ÿXIÝ $+#ý$¼áÈG¨b`c‡‹Z}™#r[ǰ‘¯Ý¸ÅNృÀŒ–Õ-xÈn Ô ÉÌnŸ8eÅšõ{ö—¯Xázôì›1$3 vœ8²ÒO†{އÓ>nÂÒe+˜I!™¤8°mdE9¨Zaެ]¿Î?I›&Ê]5ÛF8¢¿yˆÙ2>ö±×?œÇÓÅm/¼ò* ‚”XŸ{é#g?”E±Ê<ÿÊǸSÒ,Y!œcY¹äÒ˘oå4 ßz¤Í¬’öž÷.&¶OÆ„1CàA˜Æ´´¶Ô7OÁNœ:iÂäé©Zæm?vpüä)“¦MoŸ8©elû¸I“'L™,ƒÍÂ9 ¦ŽŸ¬²ÔôiçÍŸ>aRóø -Ë–.œ9eƪūæÏX0}ÒÌæÆŒÙ”éãÆŽob©‚1a[ ¥BÄAÖòÃùÓOv®c`€ˆo´ÏÖ»W¾6‘2Ú|pÖ. „ûêWþ0U]:ñT¤kJk)±ÏÈ 7¶”{”HR>ÇC¼h3€îÈíÙ³Ú™.xpþ\<&Î;ïºJ"¹-ÜÓMðF棷t.¿8JNðÆåÛHÕ­õcr¾R u'ªÍ³ˆ‘ }‡a®¦¡‘eÜB|§ÎœSß`"#Mž’dÇ0íL,“Éâ3€A8Æ*0Bþ”øÊ ›g&rÌŸÎA8J¼ðXÑÆ·ªZ4·|Å⃇öÍž3Ïô9ç(ÃvAX¼ºvëUQYáÀ$ƒ06‚ÝúÍÛBÂÃi„ó #–^ÂßÒ”µ58_‹'àÃ/ Ï¥ÀÄA8†7$ ô?pÎÍú"ƒŸÑFÚ:þ;Œ³ ðf ãĈ$8›ˆ&L©1Ë5@† Ìæö úÈ-_—UÕ̆pc˜Õ&³Í9¸|Íúü’‘«7lš•;nÒT·vÝ&>5ð ÎÕÔ7uéÑ{@Æ0f¹1ã&ŽŸ0%¬t«×lHÉpã0%£jª!™*°á¢ôOØäD¶|8Ž áj/}ô5„±u$e‰„IaŠs„# ¶:Ž„fië¶çžwâpd8/ÅD"q<¦bñˆï]Ð>špR0µb:­[³~|Ë„3/™»tÁìEK,_2ټًÈ7Œ¬„õYóæs«³`åŠ}W9|âøáý‡Žì¿bßÎm{v•M«Ö,œ1sâ´éàT:uΔIÓW,[¹háüå˘3f¶´$²—_iYÌÞt©B6ªß]øPÔÂ$>Lôݽø¾|õ@É"ž6ûáuÂ$âÄ 8Gˆ*Êj«DÍsêÔ)· MÝ)ðS"‡°«gÌ&•Ÿ6]ƒ:'gD,²×šðQx9j/û3ÑdÌž»oßöÆ’ÂE%P-ª&%±`©}³ÎêN]%´ënuSnñͲ³lÙ²§[m`˜6ZãÖÜE`[Üoø¤0XDø¼§‡aEî<:”*<“ažÓ¤‹ÆKG=Ï<‰²8À|{ýSŸ¥ ¶@î½g^Y¦ê„ ëCñý.NRJô®£j˜ÈŒ5èXU'm}?m'„K„ô¯þQø:zý.åo’(ÃÀ¢ ´ŒPä3+èÂþò¨(xà!\W@Â1ÎÊ´dŠp'‰¸c å¾Ì'çûðz©@œd54Úû»òÊ+éZMï82÷D)"®L;Mälã` ä&L™^]SÛÒÚF†ƒp&‘TV„ЗpçwúŠ"n&R‘ÀLkn h3P ‡õãQ_×âÆ¡;ŸŽH&¤”ײ±í-ìpê‰zUÿ—üÊ—= „K'Å)ÅZokHó-EëýÉ;Ôæ&M›GøÂÄ… ‹Çâk7éÍl¿‡¢ù$ˆáÂÜGgší#`À¼·Ã³Ì÷ì rR³ÞUV ,x{ –e„€-e†ÛºpÙJi·ç,\’Š}Ÿ¥ž.(-·3,;ÏÓ]ëÖoæ–2qÒ48×ðP·LªÓ@aÞ(Ú—”?ž =c ½ãÈs”“„6Â܆MÑ€è ©­àÇÐR¢2hPhäßùp";\Èpxê@8táÞaÿØ <£ÍDtyqкmûΞ½úŒÄ $1'ÅæFºƒ½û¥‹f/¿ü2»5¦­¤ °5cv]UÓôñsæM[8 ×7uÁÜióa3&Ï76IäÆtÍÍhÒŒi³—,Üz`Ïêë½òÁ»ï}ðž;Ù·vïž±'·Ì@TgLŸ<Æ~e™3sŽšU³¦Nl¬ÕÜÔàK!f¹Ü;dh%:…'”ÏÙ€}˦n(-D옴¾ÍÈñøì‡ÿ$¨ö¡M3“ß¡þpðGëY¢ž†Î]eÇŽ1²Y#û„mDµ‚4…5pQ9YãÚ†¦ñˆZÄvDšÂ6Ì쬨ŸHbgHÞBªc’ÍĽ@2ƒ!e*6K”•Ï]Î'Å¡ Þͺ/§hì'LDZ XyŽéYFŠ·Ÿ]§Nœˆª—G—³(œlÉp[¶î {›iªʃÈZJ³‘„—F8*ñá:"\Ú.ù~èðÇÿÓ²v}À5ÞU= ´XæÁ3Ï<“vzoµ¹wu÷õ¯ýq îfÞÜÄ£2éRÙ.МNZ†ƒ^ÜÁ‰hÐ °áƒŽ9F,ãÉÒFJƒáfIµÌ&bz¦;\’Ð]E|D>!69Dß1òPF{£ÁÀb‘Ì?2ŠþnÚ¶“0±zýLh똱°½‡îzűaÕ–-ÛÌKƒçCý¹cÇ.s×ÕÃ%/*0Á9ß)¸w"¸M…¬öç3½lù¢;ïºuÊT(2iµú+V¹/™Sœ¸~Ã&¾ÖJWŒªÍ‚²lùÊЗÖÕ7­my…z’íé “ðŸ´Øñqv¨zÓ 93Å}Øà†÷…˜Í(ÅISŒs7»ô;Ž3H·é#"¾Ý`èŠ=íP GзÕ#òš¼Ð$YIv. Õ"Ñ5kÖoݪ kÅèÑ|ŠZ0™S¦,]½ÚA·Z8räº-[2óò&Næ’¼uëi¯^³ntCcמ½x—j?qúty#ÖlÚÄAeÓ¶ítÒfíšÑuµÌ0“™„r’Õ­¢ªrãæMŽ@>éJeü7Î ¥¹1‘|ìŸûÜo§#ßÿŸåü”øÊ~iÄwÈpi„ .$6ûAkbu\æåK¢Â8‡<­]·Ã­ÌËùE^=jqñècêµüòååb Úo‹I^Q6zrûÌÙS)gÌâ9?qæ4ÌËØñ“‰,“&Μ1ž-M-©¦±-2+‹6º²¦´°`dIþÄñõóçOž5gâÄéímò—O¢og˜6eúì©ÓWr£'§y·€¦›ºð5-ÆÙµÆ'$>pË]HJ—c6Ú¡êdzxDÔTý ê>•ÛÆ§ˆGi¹PŸ¦ºË)~‰ñPà Lª¦*›Gb#.¾<‡ã[r‘À6½B¾ôj hçê .ð= 4äê|–Äa¨Däý‰`[³†Ä`l¥”|‰pAeôʼ%šÍ”Þ/ÌØü„ª.úÕ+#í97ýñ`{qîÈ pºË‡æÙ)W€D„¯îäU×~üÓŸ Ƀp&UX _á‚… äLk);ºàü;¾‹_9Â…WnÔõNƒ ¨wGÒâÝD|C¸o|ã çÉȶ—ð>sæ…}D=ÃSƒ‡PB8©@Î3 LV*JsB`…¬ L$9 L”€=8g~C¸Í›·Fù+ºJlZ0,fâNÿ@ÞòîC~ÙL®lmW× „%N^ƒ¦æ:¸yóg‘丙„ž3´”I ‚òJ0¶ióÖÒ²rØ䬴s"á¶lÝ^YU]PX̦býä RÜi"& \«‘¡.°ÒGÅ\7‰Ñ \ÒµŒYÝÐ (˜~Ë‘.6’&D¢¼TƇ oÄ»àìŠ Ä¾}rsáHÞpž„3nüÖ®cÜX¶jµB& —.“|»SÁÞ†- Â,‡p#ró ÖÆõ›8lX·‘ëž›\Q"AìÏ ø¬Y«7nL\0·n „SšÂA²ŽG-I˜Û´esª‚÷Üô™3“–á°M˜¤¨ŠðÛ¿ý»N„c‡CnÞ…pޤ¹f`ìspÙO¿ð ŠC³át›ª|õèÙÛ¼2£ð^=ªdÐÄpUxï‚äqg0I|)ÿ„`#³âa„ÁLevjŸÌÀ6­}ÂÄæ– MÍÓmmÛÜ0cŠ2­eÉÊ¥£jëJ˪F–%•ÜkªË§Möµ6µŒª¬-[¿uã˜Éj8EÏš‹ašØÖ>®¡~Ö„ñcš#®ËldˆT1½}×ú‰|cV²K*[72ývÁ 3•½Ö8hÞÚ‚v¬d#_´­ùO¡G6ânÍ -€!GƒMŽÎ#òßFºZÞUö£X‡X#k`$EJ rS¦]yåIPèCT‹&òĆ&ªÇ~x|„oˆOü¸)¯)]¼ S¡~¡ž5*7îõ=z©U#~12’l7å+ŽB‘ÞÓçL 7R“L†tŇ©v ÈÓcĈºPQ†Õ-Ѥ¼œÈpi;»/Ó,&dh)?™—ÿoјy¦ü|ùÒáÐî]v¸·åú¹ ÈQFãw˜¥¦ãEœ—Ì)tG8kõ£YKP€j° a„ = Lluhn\¿†§‰÷ê¥F¶Vo‘ø(3çÖÛoË-,"g§‚Š'®ߨ0±©ÂzƘÖÉ-Mò kmÛÖ êš«jÊëZ«›ÇQV×7Ö••åÕÖ–M›Ñ^ÛPYÝ2ººµ±º¥utc ɘ†¦ÉÍ­j=4²]75¡àzïÇOÚ2tòlÏ &¡-ºšäjS>¨¨µëå1I’ŒO¹Ðl0‹¸O_ O4*Ê(ÿë¸0Ãüàœ…5“³4IñÕéèí£äVzõg˜¥Q J&IàR•=’l ®{ã7Œ«cÙÝ‹O^ã0 D2L÷…JDí771øáúhÎ{&¶žƒ/=KTˆbiÎ\ solÃÜÍ«´.™/}”ÚóíC”yùÿV†ƒpBd`CX Ûþ—ÄÆÍAgg+o=ãR+¢w¬\?üh@—Ybšz;B¼ÓáÞ<ãµt¢YBŤ׊÷×éˆçDrß$Û›)"è Aåä;¶Ô•‰£¹Ø©É•´Y­øÌ¦³æÍåÎÀ'TÔq„:*ݤjâÀªÅò:Ê\¬X´–‘š2Ô§ áOdÒòñMRvÑÓ¹ Ê;YÄ· FÄ8Ž” ‹(«‘Ê•³KJ)GeJÓ2š>‰Ãvt “ìè…Â@‡¢ØK ËA˜âÂPzZR1iìDܨ% òi„ó«ÙŸŽ bF?̬¹ XÚ}} LÙ©2â‰z$ÜÍß;ê7‹v%Œ ç'¦òùsçÒµ«×$T²=%¡ -*(ä¨&6báÜy›—¯¾bÓök6,š9gçÖmÀI•¼Ìœl&þ9 æ#©›·nf›7nªU ÿ7®]çô-6®[³Öþ¨ÊªÍë73¿¼mÔ»›·L7~ÕŠ•²FæË…/RÍ‘Þ`ùlSîö;îÁ “á^ùØÇÉBwÔá‚é´Cn¬p!Ø… ÇG7iø½¯Ì4³o'½8X^´ƒhŸN µvrbeEÞÈ¢’š²Ššò‘•Å奕¥ù£Ë‹jËKG•QGÒ$UVgUÔdŽjÈn›;vJÙÌÅÙc§©ª+oh¡I®«®,/Î/Y4rTyiMUéèšÒêÑ¥¿•Êw^›ÊËe~-FKÇ?ýjœq )F9o^ŽŽœ~ÅÛpë<дò0”ŠÖÄT–8LòÝànÝ~d&#÷è'°ÁÇùÀ¨"i€Ïß¹âð¸.įØSyä+]1½FÌœ_=Q¦ @vëÐáÃ3\ ƒF«Aœ²Ú L’ „$[AK®hx¡g´>¬_hQ|ß Å3ˆ{äȡںQ3fNY¸h.-¥‰*âkm¦Ÿ•yIIåR‘eSh#5"WìÄk"~Å÷Ú|§1°>Z¨ÐéEÚF"lLtz'§·@JÛ4O—þø#@GˆB!îKWn0ðP]ùHâOÆ *À6u⤕ËWL›4ytuÍÊ¥Ëðõhƴ鳦M·Íž¹fÕ꼬ì Ícf¶Œ[¡âzëø¶šú• ij&•6” ‡%MÉÓ¦L•B-gXæ´ “6®^[•³”§µ|•óTHÕ¶b7‡¢œ<–·YS¦9>º¢JÛÂܼݤÁM’ÍÊéaŒÒšÉß-%„cK£‚pd¶ ›€±ØyÒ^ü­Q´éˆpI¨@Ê5h|Þšm$¯‰Å>‡mAûl½\ôÑq³œ e.*/)RYv¤Ç™WT˜SZ”[VœWRœnûyhIEßÒÊž• }›'Ÿ±$oñ†²5»ò殺(·,·¶¹´bTI^A‚…eŨ*(¨¬*¨¬°#õAEa~yA^iIR‹ÇØ:.A‘cñ«ÿKD³ÀçÌÐúâ:ÚÉ ]^T.Œ<À(…—ý`Ú" ͇æW?E)c§ÛàHrd8W À‹«ÊJ(dE.rk@lC¯¢fSpöãÏ”ñ¥:²4¢'fËwd,/¾ū >C³6Í¢p?íh9ˆe±ÓÕâ¹ÅOÉ£K-ÑÌmäiá̱0¿…¿‰?Þüé Ÿ¨"ƒ£Jæv*…pÁ{E<Üo@Ä÷{qŽÜÆßƒØB€è˜Eæ—ââûÙáÒ´÷MKßòRR, ª°ë©ÂDºÇnˆÚ”×4`БáROà$‘áÌ'£1úiwßdŠ*c– ÙvüÉašÓ×ê k–­^N†ãëÇkÞüÅ&´¼vÍ&mRÊÁÌS$¡ªReð6ùøräKD7 LÏŒTÂÃ×­[#•+¢o`Ô›\QÀFÊý©]Ò/ZJ)h­ê@ÒDzûDõÑ€‹œl¨LJFV%’œ_iÇ֭ѵ&‘¡#58I.¼ÝBö¢·´¸SháC ßQ°ñO1âáÈg®•F¸Ø"ñ¼%À˺&¨ APoŒaáíxôq99YÙeEÅùÙ9y™Yб¶Ö7Úfç–U–”Ùæ1gÆL¿6VT×fµWU Ë-ž;¹elƒ)qÉ¥x'ŽE¦~ÔgÓ躬AC¦´›5qÊ€î½Fææd +Ë-ÈèÝÏÁƪšìÁC«KF:RUTê§ã'Õ•W¹\¯½Å.òb#$ÃÂaž~Sd¸;î¼Âa¨?òÚ'‚Є‡d¸JïLwìÓYã§ŽÇ ˆ~ÛóôX¢¸v¤g{/È!š^7Ì‹›à¢’â²RQÅð(¨dMd‰â¢¼â²¼Q£3FÕõ¬nêÚ8±ëä½o°îàÍÇr¶±tóÔý'û—Õ–VÔ—ä–´T¶WY6²¤¼¢¸ªš ŠˆîÊQ„:ÈWU™È‘éxžÞ,¡“´¤ÕªA÷JªnI?¾ +µ!@ŠmŸí‹ÏÓÖ>e»OL'0ÌÇ®‰QGÐÇ¢gN>&&AxÓF¦p Hcœ Kr¢<óLœ§É˜ñm䇥«–Íš?[muBÁ›Ü3fΕØ ÆN›:[êE‡­BÜzî9’I&*J«ÚoVwd¦QJ)*b20`„æ="kª™Ý‰¡¡º|ÕêeœM œ*Tʈĭ)Ä£YÊ­f4¢7ƒX2qŸèf®ûMô´ñ,Šh@µfl³0³™Ðî×·¡‹'e} òòC‡–="‹ÀçÄŠ‚âáäÕ“šÛJ³òJFäfRœ™cg|CK{]S^ÆðòÜB­#úFCG—”FyYÉXT®ˆz ê˜{¿)wç]÷ñ1Á;ËNdÅ–Þ2lþaÿ¦;Žå?1þ§P°#Âá:¢Ó,„€Ž²QZi‚‚ÎCÍL•Ö9À½%ûMuÙȪŠQyÕõY mƒZ&÷š4¿×¢½7î±ûÚËöÜxéÎS}¶ë»tË'~pzxã䊺ö¦šæq5M­5 Õ‰ÃÇ7ºµ‰U«©‘çFx¸ âáj9Jì„åé=K‚dáýa3 Œ¥Ö4ñì·ú5Hð)±Ï%Þ˜®bꢦ®m(ðõï{ñ­ùõm;1í3™v˜d™{[íùNœ@ºˆ1• #`ÆNrш[@ÓRÕ¦ZÃ’mqÑ)Øx>.Ÿ‹â¶á0â A-„6T"©Á‘ÈŽKÜEx£„«Ž«„ÃN `(l‚]kœ áŽ;i"™Qp§"ÒJh ͤ<â<ÂDä•£Ý(>0@»wû /âñÛÐÖ0uÖ4ßXkûØz_Xc3O“ÉSfXÅf;SXÒaÑ>cÛ&·’UÔµK¯K.îrþy—t¾´›š2ʼ™Öl–˜CfŽÌ^#Ë‹ƒ‡Ã–vwg^¦ØÆqU£FN›Î‘bûò¼+£xBªjÝ™>¤‡èFŽ1##–3ÌÅ&·­[óñ§ã4"ž!+ Wštå÷èCõSš'õ©xDU”¡J#~%•ˆr¦ñ‡¨gËìj$àOH\^¤Šï-¾"l<®‚´ê휲r&µŽêÓnl!“‘«@0³ïø”ÖvBX]Y%$ËèÙ·©¬jnýØucç5´/h›ÔR6ª¦xd_9n†¼]OYõ•ñmɉ€­¹²¦xxvEnáøúæquMZÆŽn°–çŒÌÎoª¨ž=~òô¶ñSZÆú©$3§,+¯ûÅË ;È™W‘ï;j ü¦ Ü]wßO?™F¸€±Ð[¦­A}íáâ§ï¸ü°Ãåäæ3’…Ž+ËæRÚö“›Âg1I"6Ü|@ßaÿ«ê«FWR´ËÙ,MöÈQõeµcŠÛ&çNš7lΪ+võÚzü²ý7ŸwèŽNïê´÷æ‹·_ÕgíOüøôü§j[§M3u|u‹(qü2šZFKé0vLÃxy¶[Æ´)ìŠ ]¢lÇ'l aûeKâ¾ï#e#WûÐjÇŸ 4.Vf%…eˆµÚI¼üÇ%ÓˆƒÅôæ=÷|j‘„SÊG‰7¿Zþàþ+/?äýá·"ÿä·þä;éU.JÇ¥¦L¯Ñì›ü§_úÒWþâ/þJþIÉ'%›ÄåË?)nJRÊo~ó[üÇbkÿÛßþ3«Î .çB®þúë¯ò“Ÿ”íS"Ê_|ñ¦›n°!ƒè#<«€S ×VaàÌ+)(˜_ëÓŽHƒˆOïD ›­ñ ó,öÓ€h2Ð]³ÃÂ1ØLR0OpúINÔ8’€ÜOxFKI¶ 4]Éâƒs“¿Ÿ–2©Ð6O¦Ä$Ã2óèJÉTg#= i ‚ˆÊk2,„Öáºuó¶²ÂÒ±McŠs Ë J¬µU£Gá%ó‹ œ‰/>`¾ ,Xð ŒÆ^¡÷jr{µ#igÙ²%-ÍTê%ôë¹#2¹0ðMÀõ×ÖÔ!…ØCJÈăáò¼ü’‰“¦«­ÃJ]-³qŒ¤\d;ŸlM ­³H“§gf /+(Ê‘=ª¬<{èÐúQ5õMî‹p·˜ÁL­¢¢ðnM¶ÁEæ:Ÿ˜)+)¥ÄÜ@My¥®†Ê‘1”¢oõÊU*oo›¶ÃõéÕ»{×n|&MwKÇJÐýÂó/ Y\x ŒüÔXŸšpìpi-e¸E–‹Þ¢¸¥£ì$¤É„:ÃGpó®,,)ÎÍ×auEeÝèZÒ€‡,ß±¥(/Þ¤ißvÏ“wÜ÷ü}&Vòù⮜ŠK4:Q Žó—¬] ä#ùÈg?ûÙçž{îé§Ÿ–²ë¡‡zíµ×^~ù#¯¼ü±~äõ½ú‰×>öIÛW_}Íú±½nýW?úqk4xýµO%eŸ?õ™'žxê•W>ªºƒŸøÄ§äõŽöv>êðÇ`Ù'¬¯½öq&w u‡Œ$מ}öùk®¹ö÷~ï÷ÿðÿX{ ž{îNž÷Ýw]-‹7J×bp[ÄŒGr²01Fl€ýHt™½95y!{¿øWN^ÇŽ_eætD¸˜céƒæ^G„û¯-$•FìtHÜ/5¿¥ba°6$ÉÜ8ÝRñÑà¹`¢Ÿ8‘O˜Äɼ‘Ò8¼‘á:þ¾ø;Plj\%¶ ³R‘“çžÛ·g¯Í«ÖŽè7¨rxî̆¶éu­ã*kO™ÙTYƒKpG(¤’ÇŸ—fÇ»ôŽÍ鈃IU>÷ŒT‚â…sg£ÆÏÊY5}öøªÑãkê–Μ3pHшN ógñ8Ÿee#:"G)郫jú röùuöù©²ãgŸ{Æy}.ë5}씦òºÑù3[&´—ׯ¨_6qVñà¬úQµ®6ðÅ\öMDBA(ôìØ±(7j²F&‘‘Iˆl¹ÛÉî;hõŒy“«Ç–U/Ÿ2Ë-/3tUb-À¾©†G¢^<=¨_Ï$cÐ`=ô®={÷º¬Ëå½ûöáqÃϵ¹jôD†çÖåO®k)Í/diÓ Îçl¥ÅAS\a”9-§£ÊÌ1dp¬÷…G Ïk/­®Q8:«°–oAN¢„ÌÊ! iÒ´©Bo!º÷àUwì=vbÍ6ÛÕíÓÖ·7 /¼eç¡¶î?µq÷u›÷.mž¸bÌ”ºŒÜ fß¾óð©ÕÛoÚ²_û²F”îq—¼CšGŽWÓpݾÃG7î¸jÓîk7íÙ9sÉ´ÒÚ5c§ï™³ü¦íW¸ÊUwZ¹iͤ٭…f/:¶e×ÞUNî:pÃá+§«3ÔØÚùÜ ÎN„Pï¾çO|æ·PœHÜí¬ŒpáàH ;ILÒK¯>üÄsO¿ðQm_x9ñÀtpÏÞýr ãœŸŽ”T <›xoYC-™6̤…¹ðîKûæ…¿Ÿfõµu%YEõù 5¥{—Nì1cs¯½7ž½íšWÜ}é–›/ÞpSמ¹ÿÞNÛnétüñN;oë´õÚ¾»oÌ\sô«?>WÒÞ<²½½°vbiÍÄQ5¢ ꪫšFU4TUòÃgER9õ3R8»§k—V²…û{Ê(&Ö/jRŸ7‹ŒD²cl1Æ~zõg„WG€,µ¨0ÕB}K :ê‘Êf’„¾ÙIÅÛ% ±é$8€$mzÄ TÕ%žœ©<±„¢5öÕ?”®¡0 GÿTWØyÛ÷$¼Q¬ì‹â&Àv„+„Ïø9 qÀ–Ì6¬-J‡3¦†ô–ZE¨fé.ñCÙ›ÖX¦Ì%‰cZܵ›B”袇ȼâàQߨЄ¯¢·cQ•ÃùQUe"ÏÙJ/ KœfÁiºáfÖ¬{ÔÀ­ÿs„C/ÔŒ ¶{IÜ1P2îËeµsÇÞˆÇDhP"ZÊAËÃB¤dø;yÓ̰°Š².1žÑé¬sÎFÁ‡¼~ÉŠÁ—õX;mÞó·Üû…g_ýìã/|âÉç·¯^_U:rÓ†\{÷êoŠHê&ú ^Ƭò}¢é]tÉÞè»t½t᜙³›[WO˜ú‰ŸøÔ£OêÉç^üéã§Ž©®›5~òéÒÇðl}à —UßÒ&:µyìøy…»öP­T$øygžéy—ö½¼÷B5{ÇÍØ¾xÝ«>û…?õûÏ~üÓ¿¸aö'üÌ@,dº£BDeB€•†"QÀÞB}Êû£¡®­[´ìÚ½‡>r÷#¯ßÿ„õ‘kom*©Ü¾fCS]òÁ0bþô-–¸7ßú雤½™S§-Y°0²Ì©†>Smºe’Ηï‰oé̹ÞtÇË÷<òÚ}äÇ…Ö‚UŸŸkù¼í¤óE-%Ÿî$a±K2‘Ï›+£üÊy‹êóKO¬ßñ¹‡žýâ3¯~ùåOèjR}KIv^yÙÈ$EÖT HaQÕãÊj®^»cûôEK'¬?kJqͼêÖ9UÍ»g/;´xÕ¯Pj~͘Æ!ùË›&˜³bûäù®Ù=wùÔʆæÂòþ^V8pÉo¨ú#¶o™µxË´;g,^Ñ0aìðâeuã¶O[¸wÎrl¾Rέk›Qݼ¨mòÕ›ÖÌœ¿jæü•³æ— ÏpL€äû˜oVáÞ‘.®cÜ0â~h«çð4APŽ}È.Kç•W_‹ DdRDÚvD¸g_’câUÁŸüÌï@¸§ž{þªk®æÆDÏÒ…¤†- Ie©iš$¸£é+öÿ7+NkKUãhYºZj&TÖήZ}lðÞ[:í¾®ÓÑ{:­½ú¬­wœ¹úÆ‹vÞÛiï}=Ôißý •ÞÔ2”¶qãzåÙíÛ=¥¶~AsÛÃWßp߉kï¿úúû®»ûß2ªvÉle[çˉ2žºöú‚’ÒÖqk›Züöö™sçÉ0"ö|û¦m+/_0}ÎBˆ0vòúÙKzõÍÏßõ M |÷åÃhW¬tâ"Ó›ÆÞwâzüâ]Ùn·lüÈÑÕÃòî8|ÕG®¶Þràøî%kæ4¶7å•Ío÷ÄÉ›ïÚ{\·×m?°¨}ŠÛìwI"ÃÕ—SdÝ}õ ]{ËC'o|èØuW,\3wTËŒŠ†“v>qím]s ææÚmûgÕ·ÁÅí“ï8q-]èó<úÄ÷1ȱÌqiQçE–p0 '^óÍ ÄT!ÖÈ-@ôÃ&ùê~]Ëûå¥|ð¡Ç”é’ƒ{ÏC¶ò÷«@„Åîˆpu!Ã=÷òkîéç>òÒG^×RRbL~ažà«Ò‘|¸–$¦¸T””„o»Ø…ê2íw—6¼… eÛ–7ŒîW•߯¦T§É[¯Èßzøì5»:í8Òéè­¾gà©g/ßwÿ;ïî´ãösŽ>Öií}ôÌ£÷vÚ|¼Ë†c«ûäK_þ›òêI åÍj[S­uUµuUD#&Œß¨¹D&©xÞ/Ò’G0©!‹¤%¡Ða†­ÎÁ0 ‡á0d²–,a|ŠýÈ:é¼ÌáèqÑ-õ+5€A»R˜hÐÛ.¤Uùb¶ñë6Û'%Q³ .'Î$¶aü¶ ÓuúÏ€œ8™MÂvpö !€† JûŠ<¦r²(uR+ퟛЋ€:·žh)Ñ0ñÏ4·“•gAƒèï$ÿKš}±“Ž—g“1í$YcÆ)wuËw‡.Ôã¸ÞÌ1;Ô ¦Üîý§Ïž·~ËåšMË›n»úIMùßÈœ&ÿ>„ûÂ|?âÅ–IOÇ/QŠúð(‰œ:˜³'²´1}ÝrËmá€ä{à´”ŒC´‹7M uÜòy  ›PYw|ÝvJªM³SL-œ6‹{ºh_ðÖ§÷çª~àÀÁTlJâ, WXžzêɽþÛž½º®Y¾dzCÓÌú¦+7íØ»bíîknÚ*0‹fo¦òW“§ŒkMvõ5×J¢¨iyu­àñk½û`Û`à¹ìÒËôê7bàÐí“ÇŒj˜TÛºwå¦]K×íX¸ú؆]“ª›Û›p…%€i±Š4Ÿbˆ•a9#ž Ú‚R5œ{+*—Ìœ»xÒŒ£ë·ïZ°rß’µÇ6í¬-,[¿leUJo¤¨ÙÛ÷‹Ó½»÷o}{÷‰º÷ìqÁ%ƒ%]×錹§^±nËöE+uµ{źñ­mGÏ$òR"p‚@<*~O›ÄiTiµ§úÓg•dŒX9~ã5v[»mÿšM „„šDž€·é³g%^þ5õ-ŸÕ6ê¯À=rtAéØQuÎiŸ´FbÒ±§5m¯®/šÅ¨¶}î²íÓH䫦Îo¼+{^ÔyXŸ£ K« JVÏY¸hâtêèeã§O)¯«–ÏVO›»tÂôõcVN™=«¹½©¨¼±¸büèÆuó—´×6N3nÅœέÌ+0ÐÞ6ì%¢¶1ÈE¬='?ìE¢æò¯ky?„»ÿGNžº~æÜD·ƒG¯Üºs:×Ýtë».Ì$èŽDïL#à7<;‡òãü Ï“<Õ}:.(å0K“‘hn­˜ŒQ$ °„;®Ž„þœ’—vA³Äösî™.;ëÜÜÁE“'Í_ÔsÁ²ûŽö»áÎN;ž³åäYëNž·õú3¶ÝÔiçÍÝßiû_ùx§C·Ÿuõ]l;ž±ñÈÇÿþg.ìÛ¥ÛàóϺà¢óÎ?‡±à¬Nçœwîç]xþçŸÝéì³ÎHŒ` ápÛ°ýðïM/þŒP™`Îâ##¹?£‡ô j¦“ß OSÔ,,Ùv¢ç81•N_±gxÉEÎètÆ™ÎöðRûV:!ô;.ß‘î2iô¯·8É¢g·K$®Œ§.¦È“vÅЫNjˆ¤êé2 gžÕéÜóäÔ•ÕÁ™òÙ&=ë“CuêÙWÜÑÛ–Ä;Ü -%Jñå/«ýûÇ„ëì¬|1+ö¹óŽ{eÐÇ9òø§B æµ çaa ´Ã}hÆ87 _R•ûâK/¹ðâ‹æÃ3Åãñç¶Œ¿ÿä ÏßñÀ}WÝÀaùœ9¹‚‘!çF=0ʪN€[Ťà\bz¹®]/ïÒå2_88èÖý²å‹æ¯½tâ䇯»ù©Ûï~òÎ{î½îÆc'ðè›,Õ‰°mþMºþ†› …]¬#«Få<ä²Túps{`ïþ¹CF,™9Jó¸ÅSfßwí­ÏÜñàã7ÝýÈõw,?Ç>Îäà “Õ¨5ì`âðMì¢,}lQkÔGB®JB;óòMŸÍã™Ûï#½Yo¾âxu^ñ†å«jkû?„{+q IrSjgOŸ±x¡4T‰ÖEá´y”ÂË–&üé¤ÉhuëÍGNÞõú¹éàqÎ/…á|á´äÚQwˆéMŽÞÏÌùó ´g^8xøŠ‰3oÞ}ø†W0Œ=píÍ<ò·QºbÙáfΞŕT0œKpá&ÃÝÆ–l][9JÀ@¯.Ý6p°èlñm|&'4¶6äÒî…ý‡ŒÊ-*‘Ë÷²÷e]…´Ô5ˆÆjðŠÞ³_ÛÈêÖâJksiUM~Ié°lÛÊìúäÆòQð¬hx6pÍì7¨"¯húØ õ«r ‰˜Ó§&9Nq<8rHFD|Ih»ýö;=¹Žæ3Ÿûua[\÷ýNõê ”h„T DJOGJÞÏ—Rq¸—?ö ’ç_~%cø°s.<·gï½út†ñW^[àƒ¿óÿs;œj[_üâ—}çŽÈ{Å#_ÿÚ7ÕzW1Y‰Ð7:k´†œNz#ƒKPò裋¶±:H•LG²kÇN˜ˆ>2lQå­X¶üøÁÜA&qŸ[µñÊ-»9ݾgÞÔTdIÐqvSœK<óÌsž"m&4šOOMK¹y³q%Y6Lž2~ïÎmÍåå•W¬Ûthó¶c;vRO§®I@±ì[\7i·€¥4Á*Ÿ©µ-]ºr2#ˬ¸ïŽ«–®\2oÑüi³'6=nêU{ݺwçŠ ‡Öï+¸|t^ꃤPzQšEGš"ÊjXeº*îW“—“K+HGGöºzÇþ;]³sÙÔͲ|)$ ¥•Š’Ñù¼s’"^>EµTÃfióɼà¬sVÌ]xã‘7^qì¦Çn8xä°Ã3_&..´”éê9¾®àû°¤ç\p¾H €”Ùw áéöWR?|ê–Û¯<…ÈÏÍ“œ¨E…Γ'©8¦uVkY0,‘GÆÌ£;~,ÏÄ)]Åæªò‹9×€7G8Î :Lð8æ†mÕAè5¹¹­NÚ©œ>/âí@ ÿÒ¡’ð;<àÔ’BX¤9põúè' †gÑ÷N™”äÇ¡- ½Ñ M1»XÝx©}úÓŸ}ä‘ÇÄcqxÃ0|=MøRâ¦1ȶlW¼=qõ/‡‹h$ îG_{á¾”/gåg÷Ïè—•3¼ßÀ^}ú÷˜ÑwxæàÌùü*½'U^Å5¡?ŠTØ…ìŽd[ìX`¡7R˜ÍËWçkï¾çïOŸþóÓ§_ùîû«ïϺã™Ü}7¹ö`§=×tÚwªÓΫ.>ñàWÜÞéÐ ŽÞpÆÞ«ºn=²üñWŸýæÿì‘_•SQ74·`XVö5FdfÈÉž—?8'kÀð!LÏŒ¸n o,‘K=tÐèH/gkØ%̱¸C}×í¸Á¸Ç$2);[{—Ðy$jq$®e±ˆRªIq.ëÚ­ó¥/¸èâ³{ôì¹¹¹¡´´¡ddÞà!eY9íõ wMi9{Õ„±ímB»¦N¿ãŽ»ÌV× ¿ BåFdg]zYg2å%]Ì¿óE÷¼¼«TN$@ƶE:Þ²ºÂчO‡¬¯ÌxXIh=V1”!¡‘ *!-‹ÇÔñiÛ(Ë2FÔæóé(–ńاÁ¢%‹Sl²^Þù²sÏ>ç‚óÞÎ! ÛBy’(<+«.=ÿ±µl‹ o((›9f8bÍž—¾óÏÝòG]Ô;##§xXvþðì¼Y9Y™¹9Csreç 1lÐÐ Ái`ëH…MQ„8$ÐàÑÎ-üÐÄJÓô4lw¼Ç$Ï^ ðÜTȬÚˆZÒ"Q \¿~Dr!côeç_p–ÏáÒÎç Ö§K·  ê>tXÿ€œÜ¼2Å$IÓKú‘ÆN]â]ËÅeþuã­vp]47Ür{:)å¿ïcú‘á°ÃôGß$±ñ£•õÁýÒ¿~èà±|ÿGä1n&4“(lƒF„9dHü€ðÇ^ÊR‚ך֣KW ð$sÇ¥— ߨ­°°Ü!Ãé¦X_ÄTeöê/ŸâÈ*áðDD~!ß2\ªŸÄxä"Z .¡ágtRËJé'EÄ«1ýÏlU’’æÏžÃSiì˜v”ñþû$îM’ ¢m2ó:uKÐ÷¼³ÎfT#±¹ºV¶Ñ rmä6µµ½2¿‘“4&±:uŠŒ¬G@’­y™²ˆ¼mí°C "tÒãU•ÌÌm«=¢gÿe³æé™*6H(!Pým„{ëg0•/-.‰„L2²Šs»‰íãHalQ@—1¬rD¾ hqu¾jr¤§áÒÐ7(:„3B2V:]“6C²ÊÎÏ“a’Ðo)©,ÏȪÎ)âÊQ^TâÙbÕIáÞɺž”r(óåÊRÂ0†ë$¥IùH|$oi>M¹.Ù&5Ã(xòX ÛÒÚÞ¦â9oˆ²Ëºu:"“êQþe¾««FÍ›3`õ0²ºj΢ùÅE›·o“2Ê娠Ý;ŸOž¨­M²|5ÖÖàJ ’ò¦™ ®Lx&L8¤n¸‰$÷½ïýÀô£3ÃôëA¶w®ú~§>eHCP°ÒôEøè4½©«CN“§9y¿ yà+ÿÌ'úg ¸øò sò3«kGnؼjú¬‰•Eä!CB¸¬ìa¶i‰-v BbKKoAms -¸¼oÝ œÌn½vï!mÍ%ç_Úóòþ‹—í|øµ¯þÁ[§{¬Ü×eçÉKw_]|ÛSƒ7_3lÇ gn>zþÞS—o?–µëdéÆ+ûÒŸÏßythqÍÀC}¼ÙèuÞˆá9™#²Z3‡M*¦¨ÿÛúÒÐï…˰ÓücÅ0…H¶#Ø5ÿ?öÞº²ôºó½Å*IUbfffffffff(©TU*©TÌ\]ÕTn·ÝiÛÛ“¼ 8v’y“8ÎÌ'“Œc;v·¬÷ûînk:‰=ëÅ3kÅíö]g]8ø}û¿÷“TÚÜ“ø\Û`ž˜8²-¦ª˜YbÖhÍ){À>Y¡ ±1§LÍ @¸5æ–ǃ=Ü=íªk‹††» 3¹“nîNÀ–ñžM,‡Þ³y_LºŸZobN9ƒmÔHÞ\—Bco0“¦fÇ”ÃO!Ü1'óðHŸŽ®ú–Özj!±'НmÒ!R. ìÆncÍÂQè}Enï%p.(.œº·V–Ç L@8\¿R@çíw¾&CîãzZ¢*’OÁ9t¯»ž¥.%°GN CôS\yYfâÿ–’/ƒpDšHº%yg7Ï?|ðääúºcKŸh lc‘®ßd z`“@8RvpÄFÇ?âîì¢äWvGX òll)à„'†%ÈÍ‹ÃÁþ ä,ÏŽz EÆ”c"7ŒaF Ô(ÏKÙØP“˜ŸáîçO¢ Oj—“lj=óÌøR•“HëŠx©ÚÇá0#@cà3ìH|N˜#Š §¸ÑêHgb8ÁBNãÖ­[´ÙåLÀdÔš3@w'qÍßÙÂaÞþ¤[0Ù8$Åž ',¥pöÀ§ì òô÷oÀ!7[¢]€IRëtTUÃt…EE‚Cd)ý Q,‘Ìg)Š¢ãeCÊCK&È*qzvöBc²+ÇÕ™ZZ8"çü|¨ìË¡AYšzÀ0ƒÙ ðòsÃb³Š¡„3Ós³¹2Z¦Šþ“æÊ€ññ5±ÿí†î†ŠÔ†q7JÛ0%!±ÏŸ¿ˆëWªœ¼ýö—•Uü‹©ÿ7°ñç!Ü¥Ë×÷ J®D”ˆ ÷¯îùWhAðÊ›oÁÙÃ嘱^p˜iEþƒgnAa––幸Úúù£ÎÙ —)‘ÊK4ºPj"ˆEîóâNd¨‹ƒ£­l‡½•±…‘µ9%ÖlŒ¬ÍM\5ÆžE6ֽ͓K®Ãk¿õßþpw÷Á·¾›}é»Ñuÿ©3}‹aÍcí'.¿ñÿüg{ïp[¿ÀhgG'w´7oG'?Ožü'm=òPÚ=‚:ÊÔ05E.K]ð@ m<Ù¢¢^BWrÎŒ F—®lˆrÞdƒðw`ÛÄpCGv«¬7Sc3܃憺z‡@8Ss½€ w¨‡3gWþßÿü]M°A‘!`%õ£÷´™2„ûûÌžYó¦q{l8¢œÝp›q9êeEô˜¾ ܾ`ªž‹›%ÝR7N/þÇßùzGg ˜ÅsÃ†Ó’ŽŽr½‰óŠËŒ ©}Ål!Ž7pÈl‰ˆ$>ç&%9À(Gœm` òÒ ¸âø9âWã’½©KÓö4aÄãñ ‰Ç.!É WSrx4 ×YÛˆSMÕ‰N§¦D ¶ËÇ÷ÁG¸]¼î*·YKÆáŒ ¿cGu wÄII kÜ(p‚#b®1²Q÷Ê£°Ã½Ì<öƒ‚¬Ür˜ª÷31BpPgDOF'ÀLJ#Ê=GGÄØ‚–TÑ¡™Y°…ZZ÷Á>¬[®»³µ¹g*}ݰÃh)ÐÒÔ\UQ9Ð×_Y^ÑܨıHQ'£ë\G_ ÆÌÆÊ?4XúamïÓè0ñ fѰÑ[ûºû&GËj;‡úÉðïë©kjléh'¸› WEXLLìÛÏãp´w¨,¯ؤÆ)z»ÈÈna˜nä{0êP¶ Ç9{|ÿoî_Ô¥-á>÷…7Ýœô u=¼]°áfæÇ–§pçÀ}A©AQRÁøI+G¤¤ðiBý1&o„®D2»º»™;YØ[;bmibmhtªì žÛq\ukŸýØý»ÝÝ¿øh÷[»»oþ`÷ä¯xf+¶f yâä—~çÛ.>á!ñ––ŽÎ.ž¡aQÎ.n®^4ƒ”/Nû{N|EÀ¯!ÀŠrwF—Ȥ¬îvÂêÁ3ÞÛÄJã´91qØfÍøçÒØ'8' ©â!û¤‰#h*4‹ ë°4á€S}/GÊ.µwÖmž]ËÈLïÀ @d¯ 7VÀL©›¾¾ŸT„Õb°6œ³“‡ €§!FÆR«çÃa…ÕqWw›¸„жŽÚ­íS$* ¾8–XrÒ/‚“×Z¨–>ÄAx¢ëu{·ô“ªÜUA8 ?‘íØqãGt‰ÚÝ«ž#~¸OÖ¨Æ$1î3pbÃÁR’GöbgGïÌôâòÒÚÆÉM¤ ~ñ·±H­R„þ9Rè°ç0•à”0º0¡¦FÆVæHÉÄV°F¯ru.­¬P¶¼©5æ©mhmdJÐï˜X˜ç9:¹›„uHœË«¯¾LJ6LJŽ­­­’§‰îƒtèð>Ú&ÄGÛY™ÛYYZ˜›²616$Ì áŽÑ Í¡+[åvØ5ËñÙ€jm;;ÛgΜbƒòêÄ;ÁyÒÞÁÞÖÏ×ÛâÞÌ”š&Çííl0ÑÀ3L~øÌ3ÏàŠƒýã|¤P:¡•?&‹@Rpïa¸xúú€y¤@uRnkéðþL9â>œtùQ‡ÝõÑ.ü¤Ð°{=ŸÀ0 Ò5A(ýòrqã^Q¨ö›‰‘-õ©ÁB@ØÕ×(ÉÆ‚»Èî•´§BiHÉÍÂZ²4:vœ ~,flA½±)™¨0Š¡!ðü è"¿†%zIkcÓÜÔ4ÝsÚššéè¶²°Û99:Fü'V/UWV!qâ0àbì0È€4{€3.)*’å¦xˆFI£“õ­Íí½#Sy%E+ëk¤·•wvw¡£‚\ââ1^1j)½ÛRæ$$K‰8”éÉ¿ŒÀ­­sTE"cÂN3ý?øá¿cÂÀ¿Õ†ûyU»Ð©Ÿª,ÝW^}ãs´x227tvup÷rvõpŒŽ ',"(ØqŒ|Äl“ˆãA¤¤2üö¸;±fÄÀpf,y¸»X8™Y»ÚXÙ[7³9dçu4¥À´}ÔeñœÅàbíí—¾½»û_>ܽñÊ—¾þ?øÎG»ÿí£ÝØÝýí?ù»‹¿þ;ÒÞ=ææàGnï@{,CWo8_?K[\°ò6‚ A¸½àC¡+%&©$0÷îz®Ðâ¢@±áx±ÁÀ6v+æ”ØX\»tZØãñäèMÊžQaáˆ4áŽêî73?Ž;ÓÃÓÑÓË)8ÄÏÍÝŠ’DCʮء4'ªÙ?¼orΟ¼/Ø„hÁÆؤ — œ•€Ô¨‘ñ1´p=ýÃæFXÞĶ„GðÑNðùqDN\"„8[!`)ä‹N‘qÁਬV–=V¢(+ ýû±áˆ1ge©«g 9xNÚçî5ï–•R@*’÷¥ óg׆CnRQí¿ÿ‡Zë­‰ÖØ]ýÝ]ýl¨~Öe•(ÑlÂi„ŸüÁ| oœ$}3—–ϞʦS¯í¿"ÃàMMèPCe´ +3Œ$ðØÌÊ2žÔÒ´Tl8Jˆ©GfÑ×9 ÈõÑ¡¼³‹Æ¤«‹KwoÞjª«?¿µ=64 øÝ¸r“Ž`cS¨Í=]Ö4¤eš…GG±MÞ:¡.¬­ìlkê{ûûÀ¹ÙÅ…™¥ ”ÎÞž7ã­ž¾ÞñÉ ÊÑr!ªqëþÄþzƒ]KÒh‡ 'ÕÜ…'¸ 5…¾{öÿá´²Ó=n´²~Š!$½rö ŸþáþÙô†ó!NjšrÔ öŒ4U’ÊIèÔHœÿÈ4kd ÚÔÞ†D„Ãâ^YZ]ž¿~ñòÄØ8ÝÂ`-b[»; 2ÆÀ‚$¨9B ¨çîë]ÕPçîáCf ä'»Â«Ç®$~ТV÷©S'Ïž=SYI7T_{kzm§¦'ѯ†Rv´$LLN "&ÒÉÔ!‰ˆùÚo~˜—ÄxJ%§Ò«z{kóÊå‹Οëéé‚ö¤“u"ÿô ð¥ôAEUyp(áaÔ( Á‡Éàâ8 ê…Ó”U|QPðþÙ³g©ñ ‘ÁpÇç”[\Èe£AÛOÂßU4|’jäЯmná¢âæÈ„S6ÜûâlVU½“ˆ•Ÿf¦7&v>BJ'w¶¶Ñ}”ã2Ó@2Æ4¸Ëžå±½ûî»L*©èÊž`)ñj¨üVÝ#:& )ÉDyÐ_´º¨´,—r@ª'Qnaop Œ"fçO/oü^8À¨¥ÂšþxïèƒZ_[GŽŸÖTU³ 3Y˜_{  ]©|!^°-aâ‡# …øo:12ÁWå"Ò~DZ$-©~pÔ”´=ÂçÚÔÒŒóƒ˜ë‚ Åýælïà…¬C[Û€¯`|mu¬€Xo 9Â&Q§„gƒ¤*ur©iBàÉ/ŽQÿg¿üîgö qéÕÏ¿õÂKªŸV)q4quw!lËÕé5G,»Ø.`{¶ŽìÎITñïŠ-¥ lj\,wg;•Áfgãéàˆ6yÄÞ]™b<½rpåŒfdÞuã"ÊÂÝݽÿö†NV¾¡ôâðððñëèzü«ýßÿñÝ÷>‚‰?®o ‹CkV¨ ¯?ï@_¦€Ð‰bôìq•à–Ö¸!¸QŸ $#ÙÁÖcÒèG E\nŒD¬Ë6kÜàºÔç_v(t¥ÀÏÞë§9‚p•*³ £ KsM¡ãŒ¢âÏ6„¿ÅŒÑØ!‡ã€4¶ âɤˆ¥€+ÇåÜöÀ„ã¾Eœ&àı§¸Ù{8É¥ã iÅÇ9¢—ƒvˆò/n>-L’þAZžÊ„ao\¾T +´²º!Ba$âÂ,9'ÿ†@wåÊN†9Æl8%òá Oq!(Úð¨ND\Œ3±0ÑŠuÄö²6Wɱjú¹»¥æecN*³ós¾ÿ°”  Œ‚|Ú¨¾ÞØ€F‚<‰Ááþà,Ä-Gêœ-Ú¹Íá8+±áäTP(½ƒ7Ég`‡”šÌ+/‰NS ݈<„ž8ä@n…ÒíèÏá?d¾ž^P£Úʇªšû¡”+—,!'Ò•‘Ë—î\¬•pqwƘólóC¦+Jì+§ K c’í9~HzA^>õ©3ÒÒñVB¢ß`ãBI²9 ¡4@;í¸|:EïºÃx`D± TIõ?L74-i£ÃÙÿgõúë+Â}²êÿê÷òç^zý‹¯~þmªvQ5—rá¶ŠïîBl]7ÐýÑÆ¸¥Z#C&pÏ¹É !””ÃÙÉšòxl ýH1 D¸˜GvŽ‚p(Dubif¯ç¬›[}|ñ´fnãÈìfÏW¾I{­îî¶÷´zzÚF†ºXÛi9m\ä˜-ÑñI +kTÃBùè¤#<‡îíïIÏͤ3É$ Á9 ‹øD臲¨$o BàŒF5ß÷›0„Èn~Έ’ÖÚtØn©ÉŒcê1éç|!*ékŸ 9‘h~¢‰Í&ñ]Œ9Ì&X[4(¨B¢ö9Aî$GQ°G½~¢Í°ÕpûQä Ÿenz¦…‰)‘5 /ç Ö"U‰…AIBEŠQ 'äv›¤ÃUÂ(  á„ûþ÷ÿéÿ©~Ñßÿ[ŽÈl‘8H¢=уéFcJS>ûÂkÔ¨tv÷2µ´ÒFŒ«0r2¥}2”ÿS’3˜kÔJÅ…‰ÄßØØ¸{÷.Œ4i-¨,€ÀÄQ|5ÝhÉ3#2‚þ²Z€ékãfmêlâŸ`×8ttúÔ¾ùm›¹K_ü>Ãi÷ûßú«‡(“`G[wOŠqP²s¨·wxplffiyõ¥ŸÞ¿}ûÚ•«Ï>û¸ª¾º¼¦‚if+¨#|©s"‘…´DKº7#a#!QÂ:"¾âvÁ7#âíÍ®¸º………ÙÙY.«£= øýäÉ“‹/¢B©Y–ž.ñ̬Õ5º~œ'‡ºLä®}˜EX )‡„±'¾|É=ÀÑFd‰¿xîQ(0 ¤qiăë;I‹\-QðF’…P x€ðÈÉ¢Ò¬ìMMàFmõt t'¾Žôm±êáá²bˆu@ç€vŽr8rm–67·(ÉKLÃû‘«RÍÃs”rmÈåÿJ¥gê‰%§œâ‡Ûˆ"¨ë²ÂI\%F›´¸zóŽ$Æí±âŸÅXJjšàTçÊrWÕcÉÑe­©±4rëA5ä4Ê5ÎXJÚf ÂÑÎTU[MÍ "‘rhëPç´´¨³¿— ;­Î¨ó0Tª‹n^>´Ke}=ó˜ ŒÌ¢³Å1FŒ*‰P×– ¸æ¯½Ó’Âc" ܈R)./STórÁ T0öKÆ›¯¾ó5./'?>6!4$¨¼¬(>.ÆßÏ‹]abìÅÄP+²’Ì“–¶f:2Rò”–ªª´wYô©Øpˆ‰=„“²°Œ-N‰c6uX<š*8£‰P1r 8TUÀóóB##Š8PjRpd8·gÃ)Šòˆ*Ö§’ü4û -!*¡+©ÈŒ96à#`SF[½Û…y Ü3¬ùÓ™L2‘&86$8m¯^ŸŠ¥<|𘹠a Lì$Z°`#¢ª UK@ð'(Î./.!v15=ÍËÏ×ÜÚ]`hXPX¨­‹3Ù}¸Ó¨ÍDå§üâ7/Oü I‰eˆ*#Sê3`(cºQ¢Pep»¨ºš^ÞH4[Ä>QPàå‹qæhãžQ/)"$42$‚2(ÔWÀ39nlxÜ 1&¤ô÷òƒÂa\I ½xÂÉÂû²Áø¡k×/ŠMÿw~÷oE8²‘DâHDjûékÏ<ÿʳO_òü«”¦Ä†36·–Ï Æœ„Tà§AiÞ´Aô¯¯¯Ÿ¿xa{çÜÌÔ4xCl×…Óg‡{ûyÐÆñ”êMKåI¡„ñC'wo{´šUyÙº™Z¸ëGå: ­i†×lÏÜ ›½B¡“Ýww_=u-ÖÀ8ËÝ9ÈÁ&ØÇ-2,°±©fzajjafaeùÜùÒÄM õ\<³yöäI:sªrĪüʨR°´4©@šrY608Ä›…—œ¬= ždx°!P‡ºF :B— ãÂÛMg5° 8ÅŒ»qão2øáTRfVGdƒßŠÛl/#[ð+ ìᘠœ„xð-áEÑ 0àÈ&B›§RàôôôÒÊ2·„#„x «g~lòÎÅ«ÐQÌ ¬I €Õ*ÐâçBTªô8Gu Œ9 GMWdà‡øÕ0ã@V-5MBmÔäqEoœ>µqê =Uf§çp??¸}¿¥®©¬ H%2¥gHkIRQÉ(E㑜H欘q( œžÁDZ”¢<±½lŒ.6¤k<%»øWðï3iò³: Ò‡¢IµùFa«ª—T9Ѧ1æðxÑèÊ« X’Ìh‚â0ËÅ?„Àµ±³-.)³wp‘üˆlx|ú¤¥gûøV×4D„ì†ËúÆ7¾Ad•ýðbÂ`—Ào0L¥fûd|§¥g…áWÊ¥¯e¼ Š˜üì„k+Ð'SëòK_ú?iÐ+91ré v0ë÷€}‚ˆZ:.­¤”“ÉÌË/$‰¹¨¸”KÀdbðCB]vvvØ'ð¦Jò§¤ˆvŒçI*«Rw5!1• !Mžª.4’."\&¶YUu-¸Îe )HâÉG?5'ÆÕ‰F iÁùã8„”È•n9ÙÙYù¸BÑ I'Å“²±÷½RU¯ !¾höéÁÞü¸3LÂÂü¢’¢Rª„HVwÌÁÑY%D„Gªæ¢ÕuÌÏè˜8î@~AIAa1w€ûÀí°Ù¦_wJj&¿JMËâW®n^ˆ¡";Ð…w–;O?Î\e9¹ Ó-ŒÇʯ’¸aÙ9%ÕdÒS8­¬¼’ èYX‚¹Š£åŠøû!„„q째PÑË1Qñ”‹c°áÖ¶ )c:Ahs4-n kiVòå/}U:îý{½~Â]¹z“†pˆ6DF¾ìI‘;¢hcÆ±æ £0cŽ`´I ؃>z1‘ymŒš&’Ç)ã=LxW,'^—.]¿WVV8.HÀëì™Í›×o<óðѳŸp¦&&óáa´D7üJñ.¨GûÜ(r+µ%$ISû8ßœIÊ!˜e /± ''æ23²‡"JÜÒÉé©•3#³SÄ@]Ü:GQÙ/?|ñ…­«¯Ü|ðàêM,<”i"Ãa#Tý.7”‰†~)nBÂD9$GÔZÆÅ466%`äSTª·š wjgjlüÊ…‹ßø½ßç ¢ €FÑÒÒÒúÊê‹?¸xÁêlíÌIN#ð ADˆ29¦~k¼<ð=d×@®Zªol¨ohB¶Àüò ô'ɹ’@ÂLxSl8?õÑ˯Ó"N¶ùT2¾?ùpHŠŸp5ÿá9òä¾õ­oA!' nÐÒÜtÁEDX˜†tFô#ÑRHmÄ7@ä1 ƃ¯ýÞïý'5Eû“PC04Âæ`·”¾‚4=@Ò¢ à_. Îa\òeúA8~‹áÅ,b|3²¥‡¡PíJ4§e`!‘䀴EÈBÆrVÙYìÔu¾ÆÄ€—€BÕ’*bh  ˆìŠö¢tÅâ4¢£TçC¹.KÙ QðcmpÎÜNr´‹œÃ]B~™ZwUYñI¸Qù–ƒ+"̇SÊÍ)ÊÏ£r‰½KDx ÜËýGøHŽŽ[';5%Ž!ÂÞMà– ÖÒzJ*‹r‹ XÀQÂy¸WØåê 4’ÍWØ–S±•Å›D™””VòfeUø‡”$*¹RéîÈGYQjòÚÙœÑü<£mXRZfíJŠËܼýR³rs‹J¥F(=iY@A/oÿܼ" RrǸ‡ôñÃÓN+¥p@Ú§á`„ÄÏ/I‚pbÃI>øÂÑÝ~’þ•dÄ¡CXXÚb÷ªØq'²£l­m迱²´Œ¹öüã'¯¿ü R¾nýô)F’‘r£o^øùË÷hWtyí n]oGÓ`OÛ`/ÄojLbXpt™Ÿ7yq¶VN®/ã‘UÝ•+Ç·½§Ïÿ9,û[_óõ UÁÍÙÑMˆr²XŠ×¯_GúŸ:¹Aà¥e{[ï^¼zb|†ÖN`ê“k÷Ï\ É{gsëÚÚšxÑ¥U/"¦ÛŒIÖR5XÊCQ2þ ÌSa&á!ŬyñŹ:,¹ .pЕ×D“ê +®‚§Ê+àð¹ }zjàB¨¹‚*€ë“À™`‡“¾÷àâ¹ë—¯œ;wŽ7©œ€À^ž˜ù­×¿øâ…›oß~¸¦ek~Õ꘡gH˜3Û[8;ð¨àRO*¾R‘‰}H飼“ ~+ÛSgÏ1Ø„9xÕJ:Ëc¨ ¤©á÷ôÕÇ 6-[Χ$ƒSþ³ÒõßdÃa0~ó7St7^’ˆŠ©ÄàÆŸ,Åëz²=D¢¡#"ߤcS`Šd;æ3¸ˆIô•¯|ò‘-UÄÌ Q%óµ`0 ¬cc±á@8`€]!d‘æ^|qÊÑQ'ñ£EKì„qƬƒèWÀ*'·È­(¯9²2óI¡öð¨ KÉùàî–¾ŽXo쓽¡ RÓKˆSHEÚ ùúa‹ÐÆ^º/´ì QŽ_á²– 6^Ò ç%=´Ž§º)æ¸ Çu‘³A¤§”–šmgëL¥P3S+>År’ý€sXih©ìÔäþ°+¦Ä)„[ꀭ†J.‡À¥A!:±Q;ðrqÐĤ4°).©Þ2³òx‡ô<àÁ¼òŠXÇä” ò|% œ{¥5yóQ 81A8J]ðC° „cÁ’Ãz ÊÊ/JÉÌÉÎ/*,­(*«Ä¼cÏ¡˜ƒ…Êt–½q]\8!÷‡«MVù_Ç;Ÿ–ò2M´]•ÏØÊh·”t%¡’ŸùìS¢(_xñ‚¹“âéÁ{…‘±²±~áY÷øÁCeš3=±ÞVWWBºˆ[Æ)౉cD•·ðO“¸B˜Mm\>Ö öhG* L@;j½bú%•M$Wy!í´©*xc2ž8q‚y „ãÞ£X§alcI1=<,´=9Û7ù›—½½uûs·æ{†hЈw“H^ŽS"  ¦ q8‰þà2% P0U¥@xyfåå‚‚ÜwnÝž›¸sí‘“—μ0#»!¿”þÃo\¾÷úÅ;t¡¶-‰;ã(„dçÐʰ'\ïµêPfiahnjíâhëèb`bN,¥Øp¢B±0ÞxGpŽFÞªzŽö ÷?ï™çx_Ô, zAQþá~K ñ½ùæ›ØpÜ}F$•DÖ2|µ&N$0K‰%6X‚ðb Âyzøp°1õüü7~ã7 @J™$¸yÀLv"Åë£s‚I‚pLà%&”ŠáŒ£Õ=ÊÁðøÏ¤˜${ â‘s•¨¸vRB„ÁÃç"ˆ’’œ |‚ÌXƒÙÅÀ%À~ø—I]JéžÌ¥]L öƒÉÜ" ±ÐDI-AÝ_!"Þÿ}A& n^œ$ÉNÀ6XM.75pnþ§Ò’ªÔ”,Ž:x8Ʊá@8@eIà‡üœýp‹$&M›¦ê »! ¡=p[8ÎxÃtã¬ø„ãMÒúxºÊÊ«Ál5JOCTr°”p•àœ¹ùÂRr˜\ª?rnB@¨sÁ1þ0Ñ€7ŒutBrXt6y> XÉA¢b9;ÄvdÿÜ7=;„¥Ä™Çµ ÂósXùÂZŽª]RЖ…Š·±ç€º=„pA}¼<ûTuú~é5JÁùM3¤1“‚'H”y¥×¯^C8Þ¿{È Â“|Ý= :e|×?éxazåÅç_;qñ7¯=žoé¥k’™‰™£m}s“¥±ÙQ½æêв¢|o73wÿ£i…VÃËGúÖœf/gÌ]ý+m’Àµ;—\½I3wÏÊ(YÚ9w‰æP¸ÄþÄ‹ …ÑMÅý”£Ò 6´=³sõ•+w¡FžØÎ Šòsõ`f1È!âòÌܼƒ§h:m25š¢ULTU ›dð3¡8¨†ï LE¡äà yÂDkoog`ƒjœ†éFí28I‰pñÓ‚pô@v Sp~ PØYÛl3ÉÂEþņ#ÒŠ’²]XÉ”ŠÞ “ê¤I—?=9…3 GY0Zt±ÐÙ{%*$,?.e©¥kãéìæÓÅí¹ºÎXåò2 Å¡ûÓݱoz<).º0¯ü­¯EûØ‘Á•ã#[¶]ëW?ÿ‡ïîîþࣦäÇ…ÆúùùuwM¬­\:±z D9þŒ0kSsjÑÑíÇÛË×î[¸³xúΩÏ Ê‚bÈI¦ k( À ƒ'IJa HP%cu–/ ­Âö3/ 1ñºáó6". æÿBÍIi7"5,9 þ%5…ª=P”¼Ãû40«xGÁ•¶¯©¶|—J!;’#"dqï‘_~ƒvx.ð®ñÃGS~ ˉÙn}en륩3ÏÌœšnìªÎ/ƈ„ÅŠ e™hH<¼!b§J¥fޏÊÔ–®gAéÝÕ“ëããJSÙ8±†ÖÒÐH3 *<°M«,Ú­´ç”>ZÜüÊν{ã'VÛ+Òs+r j+«}øáÃC5ö#ÄÈ% öõÇÇ9L³iüp4áˆ4Ãö"MÄË+n`¶¡"à£ñò;WnÞ¥cÿ2&¥ Üg¥Ç÷¿‰¥ÄG¤ E á•öi e¼S \<žÔÚàÁóMœRPˆ¨¥âSÁtƒtwóAraF0ôÁ³Ï}îsh:ØF’|Va91¤Ï'3ªŠKÁä)Ùº?¦  Çþ1¿8hÓ„“˜Il8†»àÔ¢¾þq „ƒœØqÃéi91Ñ úb‚IåeºˆQf4‹é†“ƒéÇ®ÐÔ$–’ý`ÄP͈“ “0?¢º9%à ¯!pÈ™øòÞ{”@R/î*žê^hb"zŸ¶Å”÷þ—;Ãù`»T”×âŠäè®Â‹ ÂQNZ(JÖà+s *FIî•¶–5’è€wL2=p ‚pÚ~|’õÁAh”€d­m]@˜aA9‚yÍ-¼éRßЂ ‡§ «‹{%±! –„ã',ÂFÒù¯›µè’Iá€½Ššz3 $cŽ}²!j ؆¦‚uΆ ÖýçÇ>EwáâUQ–ņc½ÇOJ¡÷=~RdÐÝOî?zŽPAl8A8ž‰É57·pbeuuyeóôj—Óz£$ 9äPšéÐHýDëÀýÁ¥FׯuL^èŸñ¶qDâA-'së??(~[‹Ž®qŸ³Ñ“:³çMÆvüzOÿÍF»o½óš…›¾k€}bVêìü&·²|òñ£gf˜Mä­H»å1#ÚÖŦÜ;yîòÄòµñåk£K N>!ž*_›9‹ž*%¦€:È拤'óŽx|Ê\fÌK!cüvÀ/‚ ¡¤쟨ȢM2s• œ~ié U~@\à cŽ ì"P0Ý ¼a™íiQ» Œ‰³M|rðvõÖ½=„ƒ¢|÷½÷µÍ+‘ׯl¤ ! °”Ć@02xÞ eF$±–à©BÙáñÄ9†<ÅŒCx!­‘èì ú;fš µ¢0æy*Õ,'Ë‘¤šºQÀP‹(Ä”£ïƒpìPÁð¤@pc oLIáKA8ˆ /v"9›(¤ wN‰!¨««Ï‚”ǾÁ†#Ù –À"\l‡~{Á¬cÌ7^¼Éæ„Ù{Ãüˆ¡¸2µªИ¤œ…:A\Ì8A8¾Ov'E¶dø“`0ê*´'¸ŽÏO²›%„ã|è^„ GxgfF65Èòÿpû Âië ËõªT<*¤aþrQ’•ï3§5g¢ÂñcâÀon8ö%EçÀ\P°”SPQYÛÒÚ‰Qåí-IS‚JøÛÿ\PpxSs;T$)X]í=àÇ6:î|„ {ÂAQ6´´³ö MJÏBÀ˜ðÊ«ëÈð Ø€OŽƒò¹iÜ:ž#`‰þ+€pØg`¡%²¬A•†bA ÐUù•ë,l+úÚm:ƒã‡CQ01µd<óÔ†H&ïü¹âþ)™Fâ<ýóp Q¢²¥²¶:%g»{âVÛäÃŽÙ{]³«Õ ¹Å„P’¶ÏH8ªÙOx_UY®ÑñʦaÏÒ>ãÙ ûg/è¶­öß}û'ÔøÞ»'7§\ƒ-ŽÑbrzchpùâ…k}=½Hgt"£+—ú¥ÖªûU[yÍTkÏBkßõéz¦.õN—ǦeX¨¤p$Ì8s0Œ™K›Ê]ù©‰ƒzŠ(`Ö0£‘þ|™u4?à Ç,¥ÄaâKjT‚ê0°€®¶–V¬X@–Ð%7»èyÏÃÍ„>¼¶­µ¬{έnÒpþªîòMýÆÙ·ÿz÷½Ü…œ22ÑÚH΋£xìàèâÌÜ™ù¹`ƒ¡*0ÎA8"MÈ£]}1¤÷¤åmÏ®Ö÷¬T´Ÿ®ééË(ö¦ G”î6ŒjîÈT.ñ2°F)”²ÁGÌ,8Cl8B7™³¼Lj³WUéæûÇÛ1±t´ n;%R)qG¾3>9ð“®sBTB$*ÒR›r.õ01ª˜¼Ó_8Ž=Vü8ü˜ãP©|™”¤‰™)V}¦Š‚b× šï4ŒÝªÚ®è^ièI Ѝ¯¬&ÿÚÆØ¬¡¼ ?—EÉÏÙ!wIêLŠÿOKŽŽ´!ÖŸ:ãóËK•g··°;‡úú©QG¯æøÈh7ʼ¢é޾ÂàØÎøÜ»½óת8bsRniJVci%Ú ·”ú Ì~#3S0’lt J’"È7±²pð¤ãNPT\b{wßùËצæ×Nmž<³Å0[:q’B'TdƼ۾pYl;„òôÕgžI‚-yó×~8Éøþ~8ŒŽÑ‰ gˆàe(kû×d ýÍ iŽ:ƒ¸ïðaX`š€˜&Øp˜(Y n óU(b¢ÐLŒuÉÑV!ðZ‚ŒDßÇaF; AÀ o VŠÖ ©äçÌ.ØN„ã|سê £[öF å±c f%‘&`òš½Á ÿ‚|aô3QA&Ø 1W„v‰: ¯ÂóSÔCm¤þaJÛpÃCãHg¤?òÙ–üL„ä„0ÁÞ…ö¥Ê!ö`¥áâèé몮j(È/¥þ57ê_#®8XJàV2"dG(’ª&˜6ÿôe;[Z†JY5O~&‘ô ö`® ÂX°”P—|u ÚsvÜ(mÍÒ¬p€«×ØÄï?ÙC8@ÎË?(!5£ª¾‰œ¬:@®º¾)(,’]ñMŒEà“›Ï®0 Z!Þ…ãWáD ±l¿tfû<‡°·Ó[;›ç.P-„ÞVÖNožÝ¹ÃØpŒgôœÜKK+„' ‘Âø¢ðAn¨«Oø>ÖÛ²K–ÊZ/Uô^/ë»RÕ?–V–“E8"b^q¢¨¼²¬~p8 ¸Ý¹eéØôe³åÛi§~ã»* î•Û× 4ž&¥Õ…=ÝÝýSãÓ'ÚZ»`í$pŒ§€¨™ÓŽHÌš©nÛlZ.n¾Ð0Ô•Q˜¤¢çÁ'!” 3,ÁãŬáM9æšD6JJ“sƒÀ!°á€ 8&—”ªbW(…¢P2טƒä-‰YIUD<暘`ÉÁIJÅp¶%À#O¬+Á9UÜÎŽÐevˆ–É\Æ÷†Íé±s^ ¬RàY™Xе9E=%ói•êÇ7Rjv*z:’òA8âwWº%£[P–‰‡õÆ%ÃÜj©ášÊJ÷mö ÂÁRŽMMžÞ:[^Y¡Êbh˱R[ÇG úœÄÔOÿÞüÊÚÀ„¥ÌšgÛçÖs;Ò‹8`wo 4(âÔζ°œ4¥ê^œ›–ƒ©J“a‚?-ìÌ,qÅ¡VÒæx»tí&cŒmòÀ96øWNØò'/¾"'þà_#ÜÏE8(Aæ!Ñ (‚Ò‡xe$1LQå¤#Ü1ãŒG¤*j)‡í8±FŽ (æ¡0 Ø `‰tAûc|CÊ3¾ R A\MhXA‚{º€If#t , ÂqtvÛ ª±+æィTRÉM["ÏÜÈÈ9‚ XBŠeYYQ–ü{ˆ£C¡àEg×’lj1¤æx°–0>üýB6âæÁoD6·…CTŠ íÙp ÓË¥•ódÍJ.6°Dó°_. Ý¢ª’¤ˆ ü|ì?0°gÃq,]© ‹paÏ&ö#ùìà9¢(«Æš£`ì~á€=l8üp Åeà!1ã–ÄÆÌh†ÚÑÙËGâ‡çðÃñìrÖœ'P™A¯ñ}U¥°¤ª®±¾¹`KLˬilñ knïbg€\hd »‚í$%®­½›ûÆMƒzESÁx?ܧچ;á ²HÈI<²”/Bolƒv(ÝÃãSC£SÝ‹K'6NõiÙÌ0 2 ‡dÇ4! ŸSUY¹ƒmjb½%§òESJÞPrñFfýÉÄÊÕÄŠ•¦¾âš%1øQ)µÜßÕWTS[Ð;ìU7â6¼m2yéhÇÊé¯üéß3†>ÚÍOб0Ó õhj¬¥!_CG÷àäLu =¦jÅñŒ\îˆcÚÖwWÔÕ$fõf–.–¶,å7¬å5fØxWfQQÈ—!ͼÀê‚dL2à‘þŒm¤?vðR‚7ð’£®ðâË •Ž¥A³LPG"å9962J¾7d’Ù‰ °±¡ª¡úù Ô!ôy“RæØ=Òy£ 4…Û`ž" ˜È€ææéÓ§99oBª‘—'f–Ò!R²Šý£;¼âï׌ìd7ow´%ä6da7C–9ÜBZ¸:R’ø-‚ *ßR ± ­‰’ˆg‘–%Åd‹C*kJɺÆÚ:,NHì¹Ô¨¸ŠÔ캄¬ÑÌŠé¤Ò‹‹ÉÝY¥m¥ÕIaQ„°b9€p}#C=ý 2VlX@ÐÈÀ pN‰il; G»#zÇé×?<†­ÖÖÕÛÑÓÏ÷xîâT(Ö@Ú•ð *å…—=§t/†å^,å¯3¾† ¨@Çá"f@crpØ%ŒHF9ä†tædšÁ^B-ÂR"O»Ènl8A87Fn!&ß'ßF^~Îô@EbPa<1:‘ÚZã½0ZÄÐÓy @8"Á6I¶QÄA »ÈÀ•:­}°Jª•£“24ÁZ@›FrØ »b„@8è>ö€Sšq)‘&ìAÆ6§ÊuIëˆ>@š O„À]JSú$ÂqþÂR"XÀNŒ?mj6sök–±Q©÷Cô¿¾ž!‰Ü×vækƒ¢„¨A £ÿ$±'zÇàä<¥±ä]I *GÇ÷‰®¯o€ûÂáï¼Ycá K)K ärà ´!Aÿ„–`ÃBüÛÕÝìÜÏ69@æÿrŒ-  ÀA/H'ÕÅ©¼œÂâ„U…DE(51:±*$±Ç/ùDLéVZýXxFjоON¢åT){*Ï™s—2»\ Ô*’;è"((w£½³ƒb`\ l3§ÝÊyb˜4„W?\¤µëTAÝz~Ó\DW™æêM¶ uD€äzgæçR#´8¿èí‹ ˆºKIsiXJZçi;"ó ²„œ1† Ũ䨯'¹pŸU#Sz±áÈøþ5Âý „®ð‡ã³e@ó8A8ž7ã†Ñƒµ„ÌÅ«ÌÃlK©°”{ÈÁJI"à‡µ,pØp¬IA8p‹Q ’Á.ŠXBeމ@´HÜW`âž C±á,kª²{6§4@+I~Œl©¡ÎPæ„9müËab@@ ÁQ"ÝŤ]'| J06¥ôòVñÀ Âq?áŽÕ#ˆ?œ .~8¸Sb)áˆC $[€?ÑF»(÷›°ì„#…œ†éa‡°”j’uta@s‹xŸD8èÌ5ÐKÌ5‚MHƒÃñ‹\aÕpàŸDšÂñì€ñ€bÌá<ƒX£I|J %†¿cØHú®kn#Ò¤µ³‡w˜{áÑqŽo²OuDm{&œ‹÷ðÓnÃÛ¹„ìì7€ „“Äè#°ô8B:8Kºû‡Pº{Fë›ÚGÁ{ªv‘zõ&gFGDZ²@,’ò EI xƒí‚UçãèZ‘4]=ž*¾r<0³#0ÅíˆQMa)p2⟓[T50m[Ðh=¼f4tʹo³åÒë”Z&êéô•-}ócô…r÷/O/ª+­*©+œ¤E"‰Þˆ~ ‹P!ŸæEØIäŒ4ìàV›Þ—ZÜ›»šS?•¾;y ñABK`J˜tLIÑAÀ+H1?¤¿L@¾˜DH~$Få~$k `²Â1õØk憋ªvõÚ¥ ÉÄbHç@81àXƒp˜xËÀZÌ)i®Æ±˜@ЉŒ¶Šb ‰ s0Í­-4º£ =]¥8óä ˆŽ”‚¹„Ò3É5'¢J†C2#Òœ Ì0§pE°^¨D ¤P¹ìWéhƒº)Õ¥‘<¨Â0±ôfþq\’Ó¹pë]™Ú’Õ†‡tà‡K9Nún »øI†Oµ¡(ôf‹Âêb!–„ãd¸´æ¦ˆJšO’Šð¯ŽhI¤€$ù‰tàJ ˜D÷E« ÒßAçœ6·Nn‘  „Ìð‡ ˜áu#’xà 3‹÷{z$¨K¶á1ñ€Êê'"M$\F)¯ÆÀ3–À°Èôœüú–v6˜x˜qÀhDL<Çb?ì³³«…€›¶sDpæ¯@¤ §*Gh3j(ØmüËBØ$‚F’ÁA8`¢î±O’HÑNClV¦1»‚ŸÄÆØ8±Ñ‘I„> ¾‡pœ ßÜC8 ¤ÄöŠ’mŠRBT2{"M0bÆÇ¦ ]¡uðF¼ åˆþpßûÞ 6¹ubÝv¼¦£S'…x<à›¿—E€a÷I„ÌŸ‡Hžñ&ØX€ï÷Œ`Ø‘ ÍGRÙD< 0Ædc Žˆ¦ IS{ùp½(˜À(í4Ù-ßdŸÀ'j Ö*ÉpðÕÚ ŸŸznûÜE°MªP"AnÝ{( h‡dá#¶‰4Áw‚ÏxÆÞ&&g7™Y,p•°pc4"ñ+9>` º!bZ!û²â“Û2Ššƒ“ç# OD-EÕ¹F4&ç¾c)&!³&6%'§wÁxCvÛpn'~äâw¾»ûÞû»oÿ‡w’=Ò¢Ü]ƒâ<â;ò[JRs2CÊÛs]=Tž™±¡‚;08ˆ¶ìÀ† s‰è*¯íÌ,éJțˬžˆÊ ÊœI¯L Ž„ý“Šä{j¥”å$±Ò˜Î‚7(—bWñ> À $Ó\¼nl3ˤó†€ÐŽ÷òÓ—ž<óšxÏ$ººÀÃtØ“œ•Ù–™)E)9.G”â Çá8(òDôWÀËŒ\zXz†Ðí „ÛhêôŠïwŽ]/œO(íJ̯Ë.$Ä#*.–&SÄFJ!uÉF,H±i)ïŽ=‡Èbr/}ì¤ÓŸ }NõÈ¡ÃÜ[®‘ä:X‘þ‘[_š ì4†´ª¦Äœú¼’Œ˜ˆhnÕL8Cüp(ÙÕdàˆ%òHõÓqs¡.epx”»·ƒ˜\ä›B  \£ÀHÑ8ÆöÇP”ª]w)‚aOñú5ÂýìXJi‡ ÇâYò\¥X8Ç)ùpÒðì!§—B¸®´'¸+ vÈ}…pÖ”ù9ù¹ÇR’f ©Çôô™<ô™Ã–’¯Áñàfãnwtb"ôQK5Â))¥·ŽòÃU×ÕUÖÒHÐ ÛC8BKˆ"!MSrhpŒ“ÁnFŸà4à–•õÜÞ‰†' ®C‡R0ª™ÍäϵÀÊtõµw÷TB@æ[xt Oœs@ŽÓ—:Ž=С}ýƒì9α°)éXû+i²‡p¸=öÃ)BÖí^ñeÉRâæ´wÑ”¦ñ|fód *úÅ2;;Ô&‚!M •••áäâXTVJ˽²¨´žˆ¼3I KÁÓQE¸ÇÂ<Ó“¡°Ù3ê!·‘o¢Æöö÷õµôvT—Çd¤d—¹øÓ㻩™~(®Vɉi »Øph X¢Ä64Pooío¬iÊJÎêlê /Ì)êëé'Ь£­“y œq\ßý”.t¥Å%t¤CYÀŠå)cG2ÃC¸µ®ŽnÞçyqVØ”Ì$ MwgÏÐÀ`fzw,'=;&*Žå À“ª+Xí¬UD6>HÒøxçË_~G »ü{½~^8€ŠøI)k"a&l£J£SÀ&ý—_ùÜ›ôî’Ëù¥µó—®?~òÂsÏ¿„§Ê—Ç&«Ìe¢/bÀÁÈ!"ÃC⣣ò³3\\Ò‹óM,¬S=¢úÃKÖ‚*ÏDׯ—õU›fägÐ>¬²¸Øü˜aIÇ MïÒ±©óÖ ç­»¦_ûÓ¿áþöoþÞÆÚÒÙ×uŸþaÍþýá'Ó 09=35©·§°§Öö6=}J¨@ýËG«z’Ž·„¶¸…Ì¥VÌÅfLF”xEä‘¶Áœ%" |B 3òA,ÞáYó ±o$ú½}—53Z’±‰ƒ? ‘ŒF2”-Š úú‘ÚÌB!ÊÃ’ÿCe/4W$ c¥ˆÈ}Ré3‘êãhO³ :cÒѤFúÑý´MÎÌÊÁ… €3465pñ²ÓÕÐ6$Ø‚˜"fµ:§ÐiŸþ|VM‡{ìDxîéÒŽ\ÏÐ̰bôÁ›ì¤TS½ã*ý¼­ ë ÂI«LIA&ð¯ÔÓª˜ª# „SAæÅ%¤3ê#Mñ‚åÇ— Œ,NÉLò,÷>SÖ9–;S˜ëŽYL±ÊÐÀ nnB¢`êšUUÞæ?/"P˜æØñ×vöñ$[@³ïàÌÂ2ƒ G/8‡­Æ0cùâ—Þ‘†;—®2& wë¾–Ò^@XÊÏDå埇pe;`Iì!œH!R ˜7^¨Ê—’ššžÇ`Å|¡ùgx4Ý´«! úºº ·%S•€ÉþÑáüêrs§„Âl[GÕW‰Yí õ$©ä3vˆ(¹Þü Þ°ê‘OÇÑéÉáÑ‘~Lƒ¾~TN^ DYMUxBld|,ô:&?-3)2†êœ¾YI’£ý1:è‚ÿhiÅŽ/›:ÚJ++T3ß„€y‹ZÊ$”Zy’Ê‹OóTúNbBzQž[_[OߟŸè#úª– œí,D\ É?øHaGѪçÁŸà$ E/uùY(Àƒ¯›tuŽPŒ8þ D? ,þHN›Øj&·EÔ-@ÕÕÔЈÞÙ¤‘ŠbaefŽùKÏ壎‰xp6 Œ w –7×§•ä×Uº#CüTDVKEM¸O@vf"Ì!f¶<­ª3QvÁvd[ÏHÿh\xÜÔðT°OpuY;TÈÔÝ &á­Q³÷¸¬b‚w׿¡À,ñž#Îv¶ h6¸”z»{¸|D…56¸F¶¹LvCáA†Í'£Ÿh¦OÂmm_'²K0Ãh“î”ÒOG NyGî?¦Íáž}î©äÃá‚ö –QF±]ƒcljª Ó¹µ±ÉÑÖ&-16)9ÎÖdz²¦±9¹b ¸ädPÍœOÑ@biQ|*m†ƒbB4$õª¾¶Á&*Å|üŒfü¬éà‰‚swÿÜîîÕ«×±rÜ\ÒþÈ!¤$ ÅÀð éÓÇâ¡E‹…ª!ÃQŒœ|=Q±É‘™3±E“™þÍ&•¥ÙzW婤7‰¹`†ÂâlÃ’CI•’u¨YÀcX0ÞoJM>$‰ÌDŽ€j’Ѐj4ÿáˆê@ü^TIÆ‹j%Ù_RKÙ`€:3™œâëìâå`ïîdçälmd¡§9¢1w´ ‹‰Þ¨A… ÄzdXŒŸÍ¡ä¬ˆ°`?ZÒpÚp†誋ˬr ?_Ú5WRçÕš’_š”AEJJ$—eååш#3 (¤™àœ€8h€Xé‡'T6+×+•ßüÌ‹ƒš}A!Ô¢DoP…¤ƒ‚ rµwÌŠN¨ŒK¯Nªw‹ä–nä4RÁ‹Ìúøàp{k\3P£ i)Ô_æf’¶Á©R¯="Zz Ð:‡š&cS³ *0&홄Œ.Ñ¢ˆ¨NR%z¿ø Á&Ò×—0ðöÝüþg׆3náTé÷êZL(JÌ8¬.$¾(2€.ÐÄèX{KëÃÕÓ¥R€™•%Vdl`¨4¿p¤o`bd”4‘ªr¯° ÜÊR'7U˜•ßbûCXÃ`€" }^Ìt"^Xo˜MÌ 50,-?+ ¦©®ž$Z}#"á'IŒJNHÊHÃpa¶d&§’ª‰¾Ãôcî1µ„ódÍÞ8m¾FÈ"ôzcsMfh5#×"ÙøÌáӑżɋŸ´Ì(ðIªˆ1U‚c"Cb£¨>‡ºÝÕÒÖÛÒŽ»‰:~œ¼6ep3ss~ü¶·ÀG?Á”„Â6åuèÈaJ¾î;tPsð€žÁqo?ýãÇÖŒ~üÒýÝ=x›ÑaÙ3"ºE „{ÿ½;ØÙ Ç›{ \%ÿ ¤0ï°êâ"¢°)±ž çÈ-.D3À’ó `ÂEåy…$±Bж*Ÿû@s{ë¨èØÖ6jQª°úÿa¥E‡OMxûWWRÇ¢—F‘}ýPL¨íÌpüêÈnŒ.J ÑØâÃÇ3‹ŸçˆIGÄj/OÛN3ÄèèøŸòÂWçƒrR¼‡pŒ±O)Â!S¤ Ô·ÀC¿ó$¢~ÒáBœÛµ›÷nÝ}tûΚƒSÛš|8’GaõÉÀdŠü÷À‡ƒ£*8 ££Í38ˆ2ªÑ~Ã!Å÷ò‡çýòó Âc<¨ å0:<’˜šý’Ð?i1±©?}Þ }zû?þéßh› ÀŸû{z:ÙYÓ—PÏÈÀÐÊœ0' tPô?¦mfjƒG‰Ô`—æ¾.ˆÊx¯À¶°´“YõóáùC>)ó)bXè`N¡ÊÈIKéaà `HyàIo)!í¿¦Àb¦0¼±S9±Û||ÉOð÷ôf­ZcOM!P¦$RÖ84’&mÒ‡§Á²µ°ÁQ‘kfmbjo¢9HÏW'ÔhÕ'+9+&<®½©ÃÈðxRr¬OKP˜ÇÈ@/°ÊÞ BÂÝ|ò«:ƒR'#òVÊ—³jë£Ó}‚ÝíiRŠã3Ê? ä*SŒy®ŽYÀo9 až-Ìkf +‘_$?yäÀAŸ·«»Vó¨cÃ-Ñ7'Èѱ¬ÊëÍcc'2j³½BüC}]¡‚°wñÑ÷Ƥ†µ4· åœÂÍØÖÅK©òáö$Œ‹±ÄxÀC¯bt‘!À†`Z§/ 1)Jɰd!Ez|¦YJÉ;†¹Â†£Þ®*ý^U_DXÞ&tp©¶ 0j‘›p¶æ–ÚJ$Дûé¶ÎèGÚwõæ§d4–UaâPd-> 2,·¬—)x­øÃ†SZ6÷Sê®îez±?gL¡ƒ„xpë¡檤œ::'Šy<ØLq)I,Ð,`j>àâ°ð87l `I £À’ëêE?%L‹5BÛÎMª»JJ€°”Ì(ðF |U,¥¾*/ÉÎÅ Û þ²ž0¶æòꞆ–¼T:3¦—–ÂÑ@{á óU I!è±Ó3á‡ÒSS,\: ¡ÉÕ¥åu„Ý—VT–€âÌ ¦=xÆÙï!£&V1´… sâöÓ©¯GU‘¼Ää$ä…^V=5éù4=;‹^Sèì„ ×ÔÕbÆ!¶ðÌÕ·¶ML@OÄ&&u¹…E¸Êzû€Ça(Ǥ„dÈÉÐà0ÕØÓY‹pì&Ïñ˜Áq:fðÚeå|OAA \žÛ\: `—‰ÅLE&OŒó&‰³=ƒ]áùçÂR‚pl‹ ‡Rõia)ÇÆ§Á0TiñóÌÆ"ÅM$ÌáÂ;¤å"’.]½uýÖý;w²ñM›YBd!*‰‰ç$Ç™ìFÜ7ÔÔ¦§Á †ÅÃÁ‡Ä”$†žŒ¨8^2—WìàÄ㦽”[p´kFž[K¿ÉðIûåkî#ëï¼»ûw»»¿óGß¶³±§gaafacMñ'’Ã"„뮪«¥·*ªUˆ_ÄôC|v:éÐÑÉ~¡%.!‹ e§Sj¦Cs‡Â³K}¢²ã“™àÌ_)&ÂÔ œ’)¤¡#бÃÏ¿˜8`Ú*ï@x`ÇŠÌ5 ÕR¿ë xƒw!¨”>AlƒØy¢!s/`Âq, + „ã¢ðµ²¶÷ô ÅØÆÜÐÚèˆ‘Ž£‡#d Ur3ò#c*‹ªÊ Kü²²S}}Ü逬"ø)\™›‡ñ”æä7[8œ=–ט†.ÄÞ-5&ë^ d°áKC8pþ€ËD† â2Yㇿ1à¸FÎ ÂPUAIÉÜ[ .sW™wDEr¥e¹e¡æŽU~±¾‰çrZ ~Ë‚âè6—ĬG·ö"1%˜]!PA}Bdqé‘ñMM“cæ”o·ÆG]J 5©}*U¿ùW 3Æ<Ö 9¥ric)¥«þ9>"î3‘÷óXÊŸ‡pèרù8™Å—$ üÌŠ%®,ž¤D¼\(ò çæŠ„Š’3Šè sÈÃø¡ü ‡N¤ˆ¯òr6¤. ÎjÖb?ñ&ˆ!Î6â›±œÀP»¨$3— Z8}· ˆ0ÈFUÖ¡´Œ´JÔIEKJJCjC Æ’°4ü ¤ÐƆGÒߤDŸ¢ù„;¢„cí!œòðÅÓ»€¾3ê%\¥Ä}©ý¸X,TH?Ž•ÙPXVœ”Qš–’íÙpŠ¥DWúð#©D®ª Oãâ¼·0c)«wD§§TN}²KR³`E°´¸{06x˜ì;@1‹= Ù‡^ÌÞÀoj“"C~¨‡7Û uˆ·_œqY|L›+,lP„ c˜ýêú:ЈR %˜èuÀy|ØpT\nhiÍÎ/(.)S7D,e;èI@,ž3ÕØ}d˜ü²|@¸ÎÞPóè1}Jíü @†É˜ñè‰Oã_˜®–ŽvâžyÓm`h8„Á ù ‡€§!¯¨0,‚G\ÂihQ{à}ZŽä êŸ-¥–Y“* vø‡_µšUiæûé-@%šÉD@këûs·q¾2a}é%†“A‹¡sKVWîæ×_´–^¿U¸ž=“Ù—œÓ“]áâ[XX[?µjZXi;8m6´f7rªáÞë¶»û?ww'f—= Ѱµ#ÜÐÝÝÕÎÉÑÑÝF„ƒ=‹Š gî„FF Ð!cðüñ¤*šë=ƒücãêÒóû¢sÆÃrfBr Ô&ãŠòÝB¨/Å<Åv§ bSÞñL¶Å!'À‹3—ˆJ0‰ŠÐZP4®N™n–Úª^.n@N\¨tM€“)ÞÕUð’ýK7^ÉÇieïêàéçæ`î`}ÔD×ÝßÅÉ•tl‚S<“ãR³“óÂ{Z{¼üÉ¡·UŒ¹¥ Kü^õ9Eä³¥ÏeŸN¨ZN©l‰Îœnë öò%%3Ž 6"  ^%·`›óˆÈÅ/(>¤Ç‚s–<üpˆ¨`IÛÇ£†À߯i¬¢i¶°a%³vÔ?}=«¾+­ˆš&. . L ˜d¼rÈ ¸|@4C`€p ö·³»ˆV °c£  ΀7{Rå„¡xöüåÓÛŸ±$à™²^ÿø½üðGïýš¥üØ·ÇR"†´ hšxÆ8‡$£3 ÚkCui‚!÷ô à®ÃÉÒ&Κþ¡hIQžþÔ)U¾%$ ?d>°²UT€r` £ÌCd‡Hp†ŽtSdb Ða*ѪÊÏÙ=Æ7ˆ]ÊE¦þ6  „KÍÎÄïURQÎ~˜¥ôRRE¿ÌLQ0UÃ*;{|W¸¬èèÈXKèßèëäF¯Š0/?úIRx–z˜ŒKà àä¦Ì^T6©è*Ô?çébŠ¡Re%¦9{¤ºëKÞ¨§­#&Nà4„#’œƒ‡±Þð /tCÔ:Ã#º`6Y2‰a ´JµwE-ðrt¡®9õÝA8 Yî½½ËÍQ)Þ?å(!<ëëjökô €v/{ç0gÏ4ÿðWßX?{—P•bèáŽY‰Ï²¸²5°¸¼‚ËRšÛPV­¤,!1¹ªº– K.)YØO  Ö6œ—o~nSÕ›'%]j±A±áÀxBY‘†pÅÊ’£ÂP}=¼ ßÁzÃ#KGl1ÞDû¡‘1ÙÑi^HC D¡+#Âm  @ņƒ3ø!±¾ôÆ#T˜51ܤÀ³¨$-Îé±ÀGd öF¶bŠ’åæ­{7nÞ¥¦‰¡©¶^©;6–”5 *°rP +*«›*ëò#’JÝÂ&¢sÏfTÍEe.e&çTø†7¤– ¯fôϹL,ž·?eß>ÿàÛÿð—»»ñOzx¨úŠ˜ŠfføöLÍ,]ÝÌ­mˆÍ#þLk ÑTÀ¶*:^£s+VNƒ„ÄÆ¬¢Ø¼™èÂ…ˆl¸©Ä’æØ,üpØp‰Ò`jNšÎóp™àÌlæ³FzEñÀàÇûJy‰…ÔáÒTú¶›;vŒ ´OÃÁŒ'ÇžJLN»M;8m& tÓ–FÔÖ±wó³sõuòò±´·> ³ÏÍÓÁØDÏÓÃEåÌ9y䤸»UÕ–ä–Ø[ÚÒTVó(|è»%‰éx§¢ Î¥5ÌfãŠkŽLÏ ©,.e”.ÍÍ£d s0¶ ‡æ4P¾b‘NÒ»JÊ=sl "@t‚0™Œ`´7'ÄN55ØÂ#pØ´vV¦åDÙ¸-”4Fd÷ºÇ½Y•Z’œIÁÎn–j&<Dq|TW QmñµÛ:;RÓ„@J‚M(ÿ˜iP‘€ÙòÚ†ô±bMÁç Eº3&‹Ê«KèJQßÄ $»}kÏ€ûÅ·>5Ýsþ­‘&Äèã*@½BOaX3ò¤b ‘Íxƒ”›jŸ 5¤S´›©EíÓÒs«RsFuù%X< Ö˜”óØaL ƇÁ ¨­Ó¡ð˜9*æ*8,14²&·¨6« :-—}&G°7øFåEËHOUP‡u‚ö‡—_g¢â'µe?87âÄð¡)›&6QÌÊꬂšìBrW9R€[ΟÑ)L©Tg“ùi-•ÍÆ‰qɨœ`ONBJ¼_HaLrYb‰±iá1±!áÄŽ`‰þÅY K Â)Û4?O|~XT•— 74}nz¦á¡£Àá[%ñiõ©yÉY©aÑžvN°p¶²ÕÑìßC8@N*(åÕ´øÈÍÈËaWR„?]16Ž`[aX|ydrcZ>»Å¡J`ð‰¿,ª­Ì­(!Yµ,Á»€;\DUgƒÀtÔg¶‘kün¤©¦:-!‰ª p¿88ÑyQ3É 'pF a—ÒÜ@N’R~x˜ÏŠU<[B"ïcy3É«kÙðwóäSÌS>"¬€A‚mMÍx0õ“Gc ¤ü´ØpTõÏD Pi"3· -+AÃ6kÞDܰF¸€pÈ£Û÷žaÙc)q\KëZ²õIg$V¾½£­é†xÅ)M{©ÜüÚ‚òs#sW9vûFÍ'eõD´ûGœ®ì˜¨î÷ ÉŠî[6œÓ,åÏË@×&é Ý„RQ:ŸA1£m±ÇÄFˆ†=ÑYQ÷èÜ•/>xþÍϽñèy aûCi¢[a«"Äåc‰­=H;SÁ†Ô„$ƒb¯o>RûùüÝ'Ÿ»û¸2#/1, Öwެ‘á9Ι sÔÞê;–•âÓF“*/,Ž  $tWǦ_¾©ööèùç.÷Ô6©¸8F*v§ÁÔ‚KáèÚ¢ÆêÅd–ª+3“ŠïÞN® .ƒõ‹^xíæÃ·žyñÞ¹ËIx,(dpCT’ð.YHÚXJ,cSŒQ+k’y©4H¦ ûÁM?×;ÌE½óøå߸÷Ü7åÆ$AYRíÂÚ„£ 5s%–’ŽËÄÄ‚þlv¦Ö–8TŽ™Ñ2ÊÔÒ™~•k½co^}ðöÍÇ_¹ûüÛ^¨Ë-w=á±Ñùô «,µsw]س»C^rz¨—æu:ݺƒÃ)àëaë˜ïbiË¿Å9*¤é?帇ØÁæVD…Ac[»XÛ¸zò¸ s·°ÅPœ•kmd eÊ%„yû˜P‘™‡ºì≦âlnÍ›˜Ñ¤[áí€É©ªøt#ÉìHä x†šÌ‚Ý&–Ú4 ï`Æñ…ža8%‰4¹{ï])¡è耊`c±Fú ±áª¦0ñô¡2ÐhèXÛXPAñ‹‘”¢Éä‚éäœÑ¸”…ô¼vÿ¨¶à”ò袘œV¿þÕã+4£+îË«/õ¯µeNi¦¡¥¡‡=ƒMÿˆuP‰Þ„܃-‡Êóõ÷röt¥Æ Zð%Y9ÙÅdgÔ×âí­kM-Å;5>–=_P•Z”ž­“µ/fî^p"Oì Hµ¤!î•ëZ_LBúƒHmlÕzÍË_4 =B Á` Ôy:»"Íùˆù¶¡Ša¨±Öàkä‡fÿµòqßÜ]|ݼ°Ïœ­¬Ýí,éYjomäè`migåèéíêäààî—DôœÊà @àç—3—'Ú{'‹zý’·RêV#‹ûR)Q†®‰n»@ö:"EÚ1r™QlSi—ÃõŠ–îËI óÄ]…†ÊRÆ\Pð0^€èXúæÐ«¡½®‘ÞhäíåTM%—‘¢°”^Ý’œGïäðh†#‘&Øpd! ±ã p¥ú39ø8,ìlˆ49fdJ¤ …(qîbÆaÀs´Î‘ñ†Ñ†¾%CQpe•ù%˜q”üÃìû§¾ûÞ?øÕg)±0þðÿø[ßüO{ùpDQRPƒ0“†úVJ‡ÀOD΢ yTVf‚ ËqŒz%ùpÊñë¤HÕ'É ÂßÝGELkQbúÅÅõgÏ_ñòí3S Ã4ЉO&å”ñÁ…Ö`? ãž±çCf2ÈpAã#|Cõ•HH»szçÆ‰Ík+§ïŸ¹Ð”_šŸœ©ÂÙ€žá ˜opbÊA…ëÚË“3aœÑ@§1a/åÙù}õ-WOž}tþêÕÕÓ@&¦‘2`6ŠZ!xƼbCæ×Èt‚‘Ø{èŒ5£À23o¨¾õî©Çç®>{ñÆ¥§1+9[¾Oœ,¿d idb¬{üŒâ»¨"r¨Öª<Ò/ˆœÓÙ®öscç…­«Ïl^Ê‹M¦xiob¡à0:à.ûzÿÌAf¸fÿ>µ< 9°ïÀÑ#XÐì Ç×…;ÛÔýʹ/¹òèÄö½õm ™eæ(v%+£°¦¢ ¦ÂÙÓ=Â7üûc&¾6N¤š†8{bÑzZØa’ò/±^î¾,¨6º†©!QÔy™Úx[¥q#<(apàˆ‹… =C<|è°e«gäflIûé@g¾“›ÄùûÚ9›ì׉põŽõ È ‰&>ÍÇÜ./2ÁA×(Î;£Ä„bbÀ%E¥äÀáâ…™$˜‘YÊÃ’£Ž(o¢ZaÏ}éK_ÙË|ÿwI‰ûðCåX•õÞë;ÿåÏA8 »M€ $ƒä¶Ñšy“ºJ¨Òl“¥K\À…Ë7nÜ~@VÁ­Û÷iûE+"Ä4D¥¹¹%MÇ0#8–£ÁSE”\^9ÓŸ=Jäè´î˜¤ÅⲩÔ쟈¶ÈÜÁúñøÊ!ïÑM YÞËšGÿówÿâƒÝ?úËÿáî㯠5˜ræV¦Çõu ,-l­¬m‚üí<¼\‚œÝÝg€šÃFW]Ó’Iï™S¼Bp&µ÷†¤¥•2ÀhÖCþ3…¡Ž(`¢2Ƙ°2…±ØÄA…e5"°$•*%Èž«ÃÊÇ ‡‡Õ¶ÙZZaÃÁ°aokƒÂŒcJÇp~+Á& /1V|¤<XMVÎn–Ζvîæ¶ÇõŒtöèXØš[¸»wv2òò± 3óðr )AH0¹°öÎNô`ûAî ùpCyUí> ›iuÓÁÙ³ñ%ÉŒd¼ìT/“l(‚ªIKnR‹ó‘0Q©×%½ÐA;.ý•Xr^v,0¦9 ǽ…,A¥ÁÝ Z³KjÃSúâòfKIÅ#])ß]Oøj7’GLR¹Llö >v-®ø¸Z+gé-013ß ¼áúŹ;21éž 7¼±fÔ±ä—+‡y}cðà ¶}¦®¤¸R uõÔU"ÝœCèçFª‘K8Ï0¿0áyÌâæääéCݺ֒ª©æîáš\ÓKƒãbVŠ D¿JÖ^„ ’@š nfœ”$_`)Dä?ÑÓìk.(ãÒNôŒžî›XêÌåîC¶&æG´Y5ªN*eœ?üHÚK² œôO:XL1V¼kP‚8ÞšÒ ÎöMnv­µ ^_O‰‚ãÅÉ]Ê.)Ì«,å4˜ÕÖ/]½ûÊõûè…•¥qiøÞ¼÷ì—ž}™å™ ×ú«[ ËA¬¶ÂŠW®Ü}óÖ3_¸óäáÙKpΪ¦Ž`‘^þ<t…×n?b‡_¼ûì@i]ITrqBÚ|ßÈ—_xõó÷Ÿýò“—¹®î‚Êܠ赞Ñ7n<|óöã§Wî`ÜãÀõˆ{5/3f’”gé~ª‘öþiA¸?ûóïЙYüm¬!$çD¡fá_Ö|48:Tºxå&Á&**àþ34±°¤ÇŽ^¢áý) JŒ „0qRâ@8 EVW ÔQ\ÓŸ]>”QÒ›Þ›–ýÖÅ+“9Å5ÑéUy™õŽ™MæÝË:«74Ãë ýåûª™ÀêÖy [;[k{+s­Ò[ÇÝÁ]÷¾ƒ³â)œ],í,\¼ÜˆWbT£2p¸æW”fåc¾Œ5w¤—ŽÄn•wõFeÓF§1§¸škÌÈ@ÖKÛ & SY/m¯¥1Ò_ZÄoÌhÙþØ5Nè¿«•>–@ã½Μ¸*’ްçxÐQ¼zÒÙxcø,s"JÇ‘ÓäÄýÆK‚EILâÚø9:2ÏB\þHh\Œà%ŽB%+ò‹`#q´¥ §—]lçFËW†'qÆ#ë¸:<e%Drqùø ùá{6v¶ØpfXûÎÆæVøá¤Þ©€éq 34Y,l@Qf”‹Îšî3ÁR"±áþuMmºw#†fnJ))Ä‚¢ Âis˜Êð ñì %Àùƒ‡MM6CùÎ…Ñ¢­ßíSç@‘k'ÎÜß¾Ô^Q —EISZ;!“p~‡%G‚tSdCÅŒWª`wÅgiýŽPf¶.aëÜÚØÆð:fä¡òùÀœ${–“Ž8F0n?¸™àְဥ¡æŽ›gvØÛ¥•'®c©Pù ~’yÈ´‘ÀI† )¬4uãŹñ’mvˆ]UšÙYUÏ)½týÞõµÍ­ùUØTDãR¥$%)5_ËRêèqY°´`,YÐ ŽÕu¶µ'Îå¨f_Ou#åÝõíû'Ï]œ_£f°Ëçdc‡ûÓc;2{ezµ#£8'0ª>«¼ßžYÆæ>=8µÜÚߘ˜S™Òž^tmúĉޡë‹;3+íE•IáL윪hb½‰­Æ"ÅM~Ùl8)4ú/l8.bV«2cºQâmÚ ¡2³ð/Š3ú5ÿ"•/Øp yâ mö@8++\q,lodÂïÕã“pÙÌ’Ṵ̈[$#‡Úf¹Ô&¤¾}ûAmDBSél…&Ž!ž £6c›ûFÏo?úýÿJÍüÂ"Œ-Lè3cnl€çåââ¢s@×ÃÕ‡Œ2kkKOWrÈlœì§è[ø}ñ¤ªÀ抎 žgåF­çë=3݉ùµIÙŒ1b°¥¤·2]²¡y± ¶1D%ú‰/ «Ø[¬±rÀ*.PúšuÌb<»L6po#ÍMŒTmv.Å-…>Õ`V ÄŠâ#dÖÂÌÒËÁÃÞØÖò˜™£…-ñ“0“úN®¢´¢ãMò‹ÍK*½›Z#Z;Žxyy¸³²€E$Zª¶¹bÁP³¯#&{6­òJÃp¥WT^Hlo“ª`B83xUÐ68(‡Þ8 ÌPèV"ã°ySú r]ÊÜt¡3 P„1§ ¯˜[€ÜH5³\aáZ’ÃÇÏ1¹”ÿ죟`J–7 ±”ª.¥6uº>¾.îX¯Eåìdcxzkl~mh’Xì6d § Âq™{•ÀiÀ±Œƒ‘J·8m¢æÞQüó~Nn-ùegGçÀÖ¸ ñ,ãà#ê¹ç¹OXvWiÕɾÑɺÖÅŽ¾ñº–ò¸”šäÌܰ˜É¦ŽÕ¾‘ÁšÆ…î–ü’ªÔ¬HÏʤŒÑùõŽáõ®‘©†Îò„ L4ë£Öz†™Qñ°Ó}óc5­›SÍuÉ9pȸ`ëZºKjÚú‰nKã)ÆNUµÞY<Ý_XŠƒ§,9ÎM…²)do¨Pp’ÛÞÆ/K)·WP[ˆJ±á¨œ„à@Ü tp`¨± wˆÕf›JÉÆÝ>åê»ôø&–28$‚v²Ø<ØpØUs}œ.ÀÓŠ€*ƒÏ3<6’ò%´?- KZlëªm9929×ÜSžZ˜[XPØàÖ7k7»c6{ݺïôï÷'ìî~ùk¿uÔà˜¹™¿‡©‰»³"O'¯Ã]7GÈ=@ÇÝËÙÚÁ?섃1*%<81'ƒÊDxaËÂ×j»çK›c3{«HÙ$þBúŠ€m(©ÔÖ{˜>cÈ!$ýbå0þ%s@^| ÀÕâVÀ»¥æ#¡†€W`Æ«øõAMâÑ8 3N*BíPqâùçŸ'‰H¦$j™¹6Ü2ÀÞÙGÏÒQcé ñ =”mÞØã44ë22ï3:çÝÒmŸläãkïåãæî P‘=» mµ >•:­ai›õýøäÊS²pÛ£æ¢à†ãQ¾uã&/޾‡dl€y"ýXƒv˜qK-'G/U"9ÀŒ š[X`À–(V/qXŒy"Ôh 1[Þ²Þ20TÞ—‚\*Î/àæºº¾IxÿyUÀÅÅN‰¯Ÿ²”Ô4¡±À^,¥$YB<?"öÚk†¢dËÁœ9wqýÌ6Ù›ÀÙP”¸â~õî_ÄRb±m$ñ”•VÓØ~–’ $õaC“däñ¼Q[DÚªto­Ø¦Ê ãXŠòHô ¡x+)  ñý”Àêg\‚p8“éº$å%/û“/è{éŒîC,fÞœC„æçDƳgH<ŒzbIÍKO¡7:®‹½3ÁY–¨nYÍ>êñ×—¤b%R2pá€cƒÙÅt…“ášÂŒ“>UüTz°ý‹î=”5 ÇàL¼­h`H{'Bó ,§#££Ð•‚ôÁG¬ucoG˜ <ЬƒzÙ;à]~ˆ%ù`*ºMÒz1-4šýà™`n ¸/Ü1Éøþ?~wˆR!®vH×(K¾†„‚áÄwãîÇ &»ÐÅ`¦Á ã8Áà¦öC´‡ÏÚÀx6ÕÜynz±>+?Ù/¸&=§¯º~y`d¬­sed¼žÈãÄ”(o¿Î²ª•®á±ê°j¼©XÂñfc`BtI-fKnáÊèÔòÀX_eÃD];œÉžAÜØÎÚÆéžÁ Kë ÝC¼ŸécçQžˆP&f¶£{n…Q.œ³Œ4úÅ«ièO@6à WÜ/› ÷óêRÒ{#™p¤%pþ¥©·Äs³"E‰&¨³‹+ ܹ W/\¼zùÊ â¨iB¶€B 5 ‡*|ÅNήNÁÞÖNÖ~öNñA‘Îþ±>a©¡ñ Å5~6¾ºnþ™Es§(e¢ÛrbúÍ?ù«Ôx!…ÑÈÜÐÌÆÈÙÓÞšª"Šä2Ô3>¬9jmfkeAéHl67‚ìÇÔΠT± W{kKWG¨6J{Ĺø?YšXŸ’ ¥ÌØcvÀÞK¬rKÿä¼$ oXrHj™æL+æ²(‹òRãÖÞ¡–C×j„ÝF’1ñDd€â×gç2n¥áGä·T9A·Fþ ^óG1·µ5tv7òò3ò <è䥱óÒÄ·X¬˜Nœ1˜Ü4›>ë4}ƪ®;²sXÇÍÏÅ?ÔÖÚ,-_/BÀ K°¢šâ²b2RÝ©-ÂéQ%YY¢Vvã=”BŸ0+9I M—£K,¥ty“ŽùH˜ U(‰æwMì ˜­*°8Âc:ƒÃ%3‰ÈêÉò ‹¶ugÊàí÷öç>0£I$¥{nŽÅ]‚¹µ³²fƒ=càS0ZßБ†RŨ#Ø„®Lt`t¡Q Â1êo‚phT¥¼yï#“w°ä@¸wß{ÿ³‚pßüæî±”{ÎኣaŠ›×KU!‚„P0‰{á`Ã+F9Ø@üU¦@,~‰lià-QQ%xR+–¶þÒꂇÍpNØ™R¸ôÄŒ®òrÇRÅ$†5º³ þ ›o\€£äÔ `€0™TœÆ­-”J¡AhªZyUûC‰†’Þðé¤c«^‚‘1üd"˜‹‡}ú»xàà*À3Ʊ¶‹w•Ԣ䷼8Oåßûé‹Ý2ø°ÒÈL÷ äº8+õ5D:Pp„¹Ç§l(1ó>ìâ.WA °±°¡²µ/f2ëQÍ‚JÈÔ&Öƒl6â!‰§—v!Rµ —ÎEÑæ{çâ5eÆ]»Å—(}DGC„HpŽY¦èäšç0nH•vòs±t°#îÜÞÃÝÜÉÕÒµ£®óÆ…Ûu=éùUÑm=Û— †¦÷·ŒNß~á?Eù_¾óçž4uñr6¶>fëjeëdMQ+ñŽéè8ncjkcnMO3óã.˜ŽÎö¨_tOµçA8:«2>ænŽ"Èâ [—dWÿkÛO¯Ýe¦à† ÿòåËÔô˜¶¼°`‡â0cCJ0ÂA8´CôW%¬µoò±á¸LrN°á‰G·gâ)ÈN!7ŽTP“tòÍÍMv3 ÙC¥J¬7é• òq,iAwÌÂò¸_€ÆËWãæs ,Ѻ¬ÍkhÝaê¼Þè¹C³×4Ãç4c笮ØwÍל½{È)ÀØÖ=Ð'J–Çä–A'¢F Õš÷ù›p3“£r@iªb¢ £¹Ùc¨I4:ªÍ;8ptÐNb)ÑÅyGY¨övø]]ÀHº”Ìe®> ŽÑ7˜¶$AŠÎ56C}ãÎãÆô‚pfÖòøô¹Í³H$QŸ…`iåÑÛ,¬¨WÉí’Hl8sŽAÅB¥¢(-pJ: ’ñÆxcM_TÀQ o ON]ÊÏKI¥vî¾ñGK žÕ×µot)áè‚M·))ÎMÛO•ö¦Q·i“(ÁôŒf”‚MŽëê‘…†FÅÀĘG h”‡Nô]uA ü˜B¬¼\ñÖ21CÄã!è€ `©"]¹y‡f"»RÍ}| jÏŒM$´âÜÀ фˠ!Pp|zŠ’PõÇKW_Rø«Ô¶®.§Gùc@ްI"š¨f’GW­Ü¤4„,$€ÊTd^ÁºH©L®m‹—Ä¼ì½Ø-“1•jéëY RRŽ$;!^·Ÿ V¬B¸wßá`iT9J-E)ߊZ¤&™þ1T<‚›¹Q¹‰©ÄÓgG%PÓAÒ9”á>øñû¬)¯€U··Þ€=a7SlýÀÒØ4ÄÓ7;&‘€œŽ$±íìŠ;Lî ôHgC³—SrHx4µ'||býýÃh3]žà_˜žèO—ɘð¨Ð œŒT ÃtrÚÂb€^òêUfzD4Þ 3¥­«ò۴Ɖ‰Ãvô¶w&»ŸÀ¾L0Áxk`xHÂë@H'f%Ì ™‘p¢`\R«E[^w:E)î7 8\q¿l'´ä'YJ¶A¸šÚF´f4è¹¥U¸JÄ òEjJ5Ö|ÊÂ;È>¤·Òˆ¤ï¡áql8(JŽ÷˜´®F}A¨áÅ±Ä äbeãlL«k;WoG/Ú¿d¦G„$e¦—¦U4÷ö»Ì̯̚êöÏl¾F’Àww/loYY›òmCK={w+k'+ÎÞÖÉÜÈòFÇÑÒÅÁÚÞ‰7ìÌœ\m@8d±«½¡©…‘ ¶‚“Ÿ—K°Ÿ‰­'cuXßßÔí¤·®™§¾ñšC1O±Øø:.Oi‚¬—R#Ž!¥¶@8iî!À ]C9\ø~!AÁÈ •ÁâäLñ?HKˆ  þ½™æÆŒmv…ÁÄ`æ¸à Ûl0å­½½™·‡Ò2lkÛÜz&œ×lÆÏÌÞÜ?O³ðH3sO3yÃ`î–ÓàÙò^‰ÇL]MôM©GA‡k7'B©ÃçïìNÀ0ip$Ú’£©ê.¹:3ÁIÚñ´RÅÍUN‰$.@ä×(öè^ï½XJx¥(¨ëµw¥ø&ˆCEî*j.Ÿ)³E¹kÒ(‚'#åЭ1õ”sÝÚJ9GPt´¾In×^,%%»@83†ŒQ Î …ñ¾´vН1JqÅ18Ñ–?[G§u2EhôUWßR[×ÜÔÜAÒÝUJ˪9ˆJàD(ÒœLúà -.iÚà‡²û¨HÕÚó u)%ðŒp ò?g„`LŒa‹ È@î£1+0ÔNŸ>MÑ^ñíñ²¡"3T,eb"âI$–‰Üm >boèbiY™”ôe²y¬{øˆJ×f{£<ÊÞP²(Lóvi€åD&á'tÇ ‘­z|ëõ¡ÎYœÞL*Í!º³A¼jsÚI!׾س‹·KTb”»§ 1’éIñ±¡Áíõµl¸:ÚeeÓäÂ92:,¿0ŽòÇ?ü§ÝÞ'm’Dä/ðý @߀@Üúhíîa¡t<àô°;©'”‘˜—’ŒmʦŒž…¹)Њ\¢ÒßË/„R°!LÔÞ ?_¦!9Dž~^\‚«£ƒò5RS=*6'- >ŸB‚p5åmµ ^ŽN!þ>)ñ1>î.–&†ÞnÎÁ~Á~ÞI±QvVæVfÆ$(øå’"œ‘žlgbjkhEx/øÄÓ«œ7¤·!›P8È™£¼Æ((¼é<Œö`¢£È‘û L†8º“ÒÊòL‘jé  ‹E¿¤£à•ð“lP“õ/' W¹‡v ReY‚(A¾ðâ Q–Ü¥MÓ œ¯íœ¿rùÊÍSgI‰Ã†#Ôl'b ¡ˆ‡¢D¨±­2 ­ÍmíqV©Ò'â› daƒó¡€2žB &žšt11Q¤ëQfŒô@ssSøN ‰éqsW_KgW=3 =O_ËÊf“®qËÑ%³ñ5ƒÉÓúÓ÷_Õ \ÕL?Ѭ½®™{V3qðçT@ßšuxŽ¥½¯­…=ú7×Àéehäø Ì¬P ñ­¨D¦°jÏ*ÆÕÒÆBß”RJç"’â-¢ 5€'Ès43·dj0AèU¬“ZŸ¢’wp‹Ò¡û İ#Ь­ªÎÅÔÊÇÖ‰$QÊa˪2æf<”@òsEQ’ÛamÇ&‘±¦ÖÖÔ¥á0Ü9:7ÉcÈsÂ3ê€1¶ùrsçÒòúiüp|D|¯Ô4!éûWÙ'×FtÞ7¿õGßøƒ?"Ê ='dmCkUmSCs}:°gy/:8G—NiÚYV^yõêUŽÀBXDt,w^0Œ'ô2$£„QÁòe°‰ ‘’"ÕT° ¼6<„T6ÂUTÜŠ h…bËб!ØØš0g'W{[5}q–©VjQ1ÄrNLLyyùÐÆÓ‚Œaó(²E¯ t—΄ÁУ†_ÛsC­Qœ]Ý k@ºck KHœé¬iM‹NÄ@t t·t±õupôvpó$#G9lì¼\lœ-lôíM\Ý-í-m³›ëP¼<65Â?Ü«º¹ìýݾ·ûÃ÷?ú~d¨OtˆW\¨O|¸O|¤oL”odt@XLPxR”oT0jhgîê«sì°¹¹¾¯§ƒ›•«¥uˆ—±.Ö^|Rä?!2NÅ­„ú…&D&¦Å§ÅEÆÆÅF§f$…úED…ùfggP€ÕjkcÁÌPéÙcmcnjjäèßPO-”*G'[_÷ ÈÀਠïO?O*0D„øxºÐU$8ÀÛÝÅ>!>ŠÝºy»XØš…F)ÒWuƒËÉ‚F·uó÷1¶³Â‹Hƒ:Ï BCW¢Ç SSN`L•Xó Âë Œ 5Þ'(ÒÅ›–cXu¨)0EÔöE¢ÑÁZrŽgŠ7´ƒ®Þr¯?Ü3ñï’ § ŒÕû“6ï|û;F¸ÚöÅ+HBÚ)§ÏlCBž:½°Ñeyeõä…óWà$7NnÒ.õâ…k›gv.]¼våò ˜²Ó˜YDÈêèèj[õªê/àÁ ÌŽ›˜0Tê2$ê"Ãò˜¾FßÀ­sÆtüœfê’ÑØæ¿»ûá»o}á7@&ºÊSK‹^ «–òh¢À Ú}Ñ¥9<Šêm†Þ¦=ä!òjX”g¼pC]½c*óæÀ‘£ŽèÒ×Õ9¦ÃßÃê$Ä<8ö ŠöaLj’ʶtRçT_F­–©èŠãÇ%1ŽÓЖ.ÚÇÂõ¢4Sc…§¯w”c#–ƒªpÐcø=cµ62Ô78®‹n©£OïcÎQžÆÀLcåh™Ü2lÚ³qdòšfîœæäEÍÄÊ‘µ«‡/L>stüé¾ÉW4#÷÷¯<«é[ó›9Ù¼ºÉä* ½ºGuõsÃi=rD—Û¢«£§sø(º:¢€åÀN’sãB@8iZÉ%@5‘’ÀóbMÍ”ýû¹."ê=N6=;çêè²Â—ùÔ7Amèér1D°fRsxTÃ9éë=´o?Ad(ÒÜR*îÛ¾­Çr:#cv{ü˜1©úÔàXèÌL/P•!Ĉ‚ À­»¼²Îxƒ®$ü2cîôöù¹åk§·0ãð£r‘Q€Ž…äÿÏø$ÂýÞ7 žÕ4¶VÖ5•U×SÇL"žÑOY¸ëP¢S^QuéÒ%H²¼Ô4Š«O“SˆX¡6Ê>#CŸðÈÉþ©öÒÆÂ„,²_£³£ ’ó“’3)4ž›’^”[LXiF&½#ã2só Ó ¨ü‘Ÿ’G,~Znq&¥ B"ƒ<<ª«>Øý€…±¤s@£¿ß±ýýÝ*]ëð¨±)žáþ±± ™iTäEûú9¹@›d$Ä9ØZ9ªI͈%qüÝ÷~°ûá®áQ£#ÖÇÃ@=¬wpŸ]½Ã‰IT¡õ‰Š‹OˆÒèHEwÉȨP_˜Ø¶kë*«ªË`¿’Râ¡iÓ3’’“bsÒ“Ëò²ó’£üªòsY R“ëK‹óÒ’£Iv° ð%㉛¨ªÌdeb4뢊’€þ¡î^|ÔqCn1‰>øÏ‹"a¸6'"=ü^½Iñ”úârÈÉ¢ØuUÉÙ”»%„_ú’(‰pTOhIpN’á0æþ5ÂÁ«ÿr"ܹKW‘,² A£Yƒgˆ6¶·.кé4%¤…úÒ≑áÉÁ±ñ±éɉY¼Ý´\gÐÒ-Þ¤œ2‰˜#Ì)T f •Ù “‹ª ªóÊ‹¢²âé…”E¥êŠ„ìôœúÊÀŠZÇî‹™Ûš¾Ò›"&$`Þ¹}“=` Ž(Eyx±[æ#³Œ90TèàSÞ!<),¹:qð),= ø”èã aH¾DŽ–Î©Æ+¯í4¢f=ã—LvH$É?Ìk")ª.µN8´ôõ–ª@ü‹«›'‹Ãüå(ªì­6õ–àíÆ†6|%T¾mm#–›Â¦Å¥E¹•e…uµ•eõÍME5µ E%ÙÍíy݃q ñ­}ƒ+6#—÷\Ñ,_Ñœ½ªYßÒŒŸÐôœ2›x`<öÒñÙ74“5«5c}%«•=¥µ(Pª2d8ÝzU¼nm=ÕÆkx”¨©-«¢M% \YšµçŒúE—•*Ö¨bmmñ‹‡{Ò×;Ä…äç•p-¨h|™ûÀ—Ùàžðsnkî•]¹ó¼Ï­æ_nwžï ñsç¹cˆ-n‹(yˆ2Ò|òr‹x%—F!ùÄWççN ³fhŒNöÐ5ktaq•,üsÐ p(^èT'7ÏrŒLt¯_#œB¸òš†Òª:Žì IØs@.L~üð}ìn;K="ÀUI"ÂÀØ2µ2¶±³$#4#ƒfߤñe²Ðq/559!!Žw(­Ë¿‘‘áO®¬,÷÷öp21 ¶wŒróˆprurOvó޶sö=fdleína—êá›äêíàêgléàR‘˜înd`í„e†)FxŽ“¹5¡:¡ž¾^–ö+‰uö‰µ÷Ìñ‹6u 9fgçIpZ •æÀîá‹aGHm€¥c¢{@˜k¼G@¨‹éÿpÅú<)tU §dbÓè +yßbÃII_Úß(‚;—¯áQÖÛÖ, ùs›gÎcH"”î…ù•Å…Õ¹ÙåÅ…Ú%Öëkp›§ÏžÝ^]]›ŸŸÇ?·w¯ÍÓg·Nnm®mx¼vz}cçÜäòÒÆÎÖÚÅö•¥šíKVCëÖKw¶o\ý¯ïÿãîîßÿí_Ý»{›®+W®°ß­­-6˜³¬¯_¿ÎÆÎÎÅ$Ïž=K”?áČӱ½½Í;÷ïß',ž/¬¯o\¼xùÊ•k—.]¹xá*‹Xœ—/Ý`ãÌ™³è¦üêÚµk>äW÷îÝcãÑ£Gœù­[·îܹÃNNž<ù /ð&Ç%¾Ÿï|æ™GÏ=ûäÅGŸ}üÌóO¿x÷ÎÃÛ·o_½zùþ½;Ï>yøêÓçYž}ôðüÎöõ›7ÞøÒWÞøÚ×~þ­ë¯½yéµ·N<óRÂÀœwßIùkº#kš¡9ÍØ¼ÙÅ{æ'︬;üðèÌSÍÄ]ÍÂ탛wôfO…Ì¿ûøîK¯¾úíg_xøèñçÞxó™ÇÏÞ½÷àÍ/¼õÚëo¼þ¹ÏËÂ^zùÕç_xÊ×8ùg8ÍG¸œW^y…õãÇϲܿÿðí·¿üê+opæœöóϽôÆçÞâZž}–_<Ï÷Ÿ}öYÖwïÞ媹½Ü"ÖÜa:˜s7¸KÜ >•/œ;wŽ[ʽâýë×o"иE´®½sûÁëwÎï\†X;qz{ë"= ÍéäúÞ?µq`[?y†.NÓ3 47fŠ ·ÅP`ëîqqãüx}aHZYR^XxŒwh¸w@HDPLvXf^XNJPF„w|tpRfrnQVynjAfbí9²“ Òãs£ÉÙÉ% -!§³¹lSNÿw³R«³Rk²“+²“J³‹2â ÒârSârRòËŠ“ãÙÎÊIÍ͈M¦Í‰ä™é9á1\.õ&éHÎHÄ|÷Ýwa)3’rŠs+W4;Ì)úWR¹¨¤þ@ÜaÖXì1š©Š2ˆ íW®Z£/¢HbÓ WÔ^š|výì“Õ3·§—oO,ÞŸY}0{âÞäòãù“¬YΜx4»vwbéñâÆå‘…KãK/n_;34‰fÔÐNÇ`Ë ŠÂ\Ûž»02©oæùåí»ÃËOWvîÍŸº½túæÊ™í©¥ó‹k—O^^=uŽ­nž_¸±têÒì ²hï@®râ$^IMH“®¬9 ;Ö¿äÿÂm8?$† „ƒ/áÀ9 Û‰Õ‘á‰ÿw7Úx¸ûÐøÈÓÃ7(0Œ¼/Z©£ÃA KŽ3ŠÙ¤õýCé33>ÛØÖéB#w7§ûŒœÀÑÞ³¹+k¾¹«ê˜üîïý6 pñI3 ù-8ðÈ™°sss„AJM&,“ÿªª{(£È_¬˜|Î ‚Ä×'‡/íÖüC9ÿk×n šgff¤— 2vË©Jp?ÿ2üÙ‘ñ&—Ã9ˆdÀãÎ6G¤øßÖÖ9æ/ÍÍC‚#ÂB£Èrf ÷òôÃû€5óìã'wïÜêéh á3<ñÌzŸÀ¿ÏˆX—È8¯äŒ‰ 7N=ýüÓ?û‡‰W¾JF`ÀÆÝ©ÕË›šž•ý£—Ü8»º9\ӓ埔““]T“_’‘žœŸœPš•T•š^—šQɳ³Ró³9@bFjBn•¬RR“bK sxÇÑÆ,ØÏ£»­a÷'T^~ï½wœž•”Ç™“–ž­hà&%)-)^~žš›™P^˜šž“šŸ’ž’[”H1'{Í! ž°ï~OñOßÿîR“²)½•–œ—œD3€t‹aû¸ÜXìWô ®H[W3–[Æâ‰p¶Ú.ê±ÈfÖ±ý‡2—+š® L]˜:ÛÚ¦¹w§sørßÄåÞñëƒÓ—»FÏ6ö\j¾ÐÜ¿ÓØ»Ó:pc|e¡¾ëtÏøÖÐ Ýöái±Ð¦úCElÚ¥±Å ƒ³§›®ôάWvžk=Õ:tqlñdßøÎäùpççOP“Œt:rƧkÛÏNŸžöH†£|31J niy*,%‹xãöNé+_ùMmÊõ¿ÛëçæÃÕÔÃRJ8HÂö™mýH&ѵ H†PÂbƒË28ŽFAE1ØäÐÁ£¬%PtGžB„ìµ³PôˆR4ø‰ì ­›‡¨7rð¸¡f?‘úzi…ÆÝ“ºÓg Ç7—Þü&¾ûþ‡Ož{T[[-eð„VQ¡?mÜ×WÆæ ¼¿×ÍC|f| bÃŽ±Äùð\Ôr@GNõð!½#‡õ°8±)¹'¹nÊYhh(GÁá$N8,fÛªMÔO³]å Z·œáÌÌœ©©9æ;—Ç»Áþ÷+Ú.ï?zpï> eL =ðúʉxPgßa]Í#=Üúæ¿ü`÷´-þÇîî7þi÷Ä—~×{í¼fhéÈê•#KWMîêŽ]69óD³tY3wV³°­™ØJ¿ò‚ÆÀ‚Ø3ãÇ©ªùàñ“ÇÏ¿±£|oÚ§ Då<€{òÈêê*°$'ÏõªÒ}:ºlâ‡ã›ô4ÀÆå¶¨ç¤}ÒÑ~I½øïüùóèCü‘8hx_îÃÞá}lwyZ/¬¢ ~z2ìö ¨×íáî«<õt ŽêàC=¸ŸD_u܃¤k--¯MMÏ7¶v€du¬Omí`ÃÑޤoBQœ{÷+Kùÿdžç±7¶¸=¹Ý„ 56µ`e+Ÿý_²²T§¥Ÿ¶ÃV(zh_ÒüB+d•õÀ¿ló¤ù|{$܈ÂZ×oßZ=¹Nü6ð†Å%©ª›‹ç@ ŽÊ 'ð&Ø& eÂÑú!-A¸ùùET*¾I·³Œœ\lFàË6؆lã›»ÙÆí¥ÒGdR¼W¨¿‘­% 5V§—ÇÛ‡*“ÊjKZƒÒ ÊëB[zÂz Z‚Óë}óÊš}óŠýóó|²s½³³üssCŠŠ‚ ýs³=ÓSY,Bƒ}³ÒZg¿ýã2ýþ–]»»ÿM»¦_Áܳ»ûßµÓ’ ¾ÀÂüäYxÿ¯>RÊøßýøÃüðC­¨äúßýíÿà/Dh*ŽAUS¬˜F”°£Á7W'·‹K˜ÂÁ~ÞÁ§ÃÂæÂ‘(æÌ¡Âàè†èäΔœîŒ|µdv¤ç5%g6ħµ$fð~[\úxny_rnoRNOR^srÀÖž[ÖYçàxÌÄòžù!=úqùZØSˆ²:6 ª‚mb^GR~^eWNYkV1%¾H0ªË,ÀýÖ’UÜžYÜWPÕœš_’CV:ª­ ²ï ÖŠx±ÂqE8K¤ÐÉ/-¡BÁIÒ1&`&pG°”x˜`#ÑÁwÎ]ÂmCqsÚw`Ø‘¥S[ÓHÍ ñ ¡¥Ñ`]U¿+-•`L™zòwº*š;kkr*Ÿ»òüäØbuC[eKGJ[ÀÌiã©3ÇW.[Mžyë/þ‰`¤ÿôgvþâL®/~Ž'Œ{ØRXíxœ:;yþa Èá*cÍ;’!ƒ©AÂø÷ôéS~400ÄxímÝ,DİîìèC΂p¨¹HmüL4ãfüŠŸÓ13œÃa#BÓQ™<6útshöŒÇ½¯¯\äÅžüò«±cc þàÀhß0ËÐàø@ÿèüÂ*I_xóíž{ñüÙ 4˜ŸŸ\_^ëlïQÞ¦Õ“S3ýC_ýã?ùê7¿õÁîGßS‡š_çvÛ¾g¼uW3³e6sAS7®?vJgiG³z^³qmÿòíÐí'Õ ë]ÃC‹''ççßþêW¿ø•¯œÞÚ™˜œšžœš!fmblrr|j– ô YxóÏcør»XCÿÒ¤txx´§§[´²r‚è¡×^ý|ScÛèÈäôÔtô-ƒ‡‡Ç´/.–œ 8hIˆbž.In8ï³CvÅíâñâŽq¸“¼Oóahy¸úþþAt#î9»}pÿqsS 9†EsuœúYEYÙù`73»ØÜÞ˜á‡Sù—›Û“;—á~mÃ}i‚ ‡7?S—r±À>ªÀ±U¤¢BD q9)]äùþA"*¡;TTê˜[[KF$ÁÄ’æ)k zŽMŒÓC~’1éT«*/•Vɯ¤l«ô‚úi ?§‰B®DÙ³Œw‚$YƒRÔ«åS”_²e!ˆÂtv÷ I¢“›;Ù,˜ù,^|ßת„–‹ô ð…âMx j"û‡WÖW7w´ Y¢ãý\|í |­’rLÊk-ûFgýûfýz¦]†§ìÇm&ΘŒœ6:e6¶i5±m9¾e=¾e3qÖjìŒÕØ)ó¡µã]óú³Ž3Ûvc§­&Ï>¥?ºÉb0vÖpô¬áði“¡S¦ƒ'¬ÇNZ®9LŸ1^>Ð9­3´ª;µi9²70ýW?ÙýÞî.©»ïýä'ï½ÿc)öÞ÷?ŒŽH¦ R€=Ç“üƒQ €¡€ZçAË‹µ€öP‚-a#2"– xŒÄ„TÖpbÆú†ÄîG8{P‘+‚Rxž>áÞ¾!^„·ôÍ¿Q^¾!Ž®iÜ+‡` û@+’ÐÉ‘ôð&˜é]ƒýX¢v“¢K½j'ëîCªeYü,ÂmÝ¢½Èc%‘–j/xï(°Bç ǯ`*8D8{áœ#}Pº¹Šfhh A§â´Ž7 å9¸‡pØvï¼óÕ_N2sç¢xò… "’› nå„;»ª!pÂAQâ2‰ŽŠ'Ï‚ÂPLö´Ý¦’Ê„#¸Ɇ'¥ëü¬U™GK'][7SGSÇ‹+×+rë\]Í<ýƤÚÎli7ŽLœN¿ú䯴EPß~ûm¼cˆK†7£Ti`>±æc(óþÂÂRWWÓÉÊGL"Ž%¥y1£q5¡ñM~Κ2|®.žª,ð« 3m LE(;N]Ò7áEy1Í¡ÚØ ÀÆ%HbDœJ{Ðoä;°pøù8 Ž}Ò„£`£¸‘ÄçäýÊËo@Ê…oxXZ~Þ Ÿ{ýùW^¡Ç½; jt³òöõò GÁËÛÍË×ÝÛ_5ò»wç.4 Å* Èn¯ˆ ð°h1,%WaanË,CÂHp¸¼œÁ!‡NtIs;îk D—ÊDЕø\qâðĵ¢ê’^+^H<<íÖVö™¹…^wÚ$'G7 sÆ•¥F¤³‹GCc+á”ÝýCŒ@ÚÅ Â8…Š…1w^4°_ûáT¤‰„SbÀm8áÚ»û°ˆ¢ìéíg-u­Ð ÑÝ$„„á* 1Bƒ“`-ÞD+äÑJô/ÞáStF^øY¨€ö'a]”’Bå]ø2!F|™÷Qv$ÖˆïKj‚5%wttª¯o€5’†ÓÓ³'OžâMô¯…E-|Ñ…K—¯Þº}‡ðÓ§/¿öÊëŸ{ùõ¯åko¿õ¥/¾ù.îË—¯nmïð­í OmŸ}øì£›7®mnœ<±²úøÑs·nÎn\­Ø¼¼~æøÌü‘Ñ)Û9çÑE“©‰yýéó‡F.½¨?}ýØôõCÃç;6yÅ`抦wãèð–ÁäEËÅ›z#Û‡ûOëŒnëL_Ô™¹¤3sEgæšÎÔÕ£WtÇÏëíNž×t,Ù<¶tíðò-ÍÊ=ÍâýƒÓW<Ú'0æ0ì°äT§–Ÿìþð»ßÛ¥ÔໃÝãÓã«õõÝ••ÍùEåðŸ1ØgIéÀxæˆC#ìŠÔFìÖ¢è±A âµ¥¹ƒX¾ÒⲆšÚöÆÆÔîzJ‡ð€*p{567twwÖÕñpª žëok¯)*n©¨êjlª­®iik­ol îM•ò«*oìj'œj2Äv ‡þNÍköÔÕÖÞR]×WÛÜ_ÓDã…þ†ÖÖÊZŠ©St»¯º‘jŠTª¤ô…³'zéÛGAáæÎööŽ.ò,Ñ|±[XxÊh¯@Ú§áà9à‚ˆÆ&ØDo×ÖOH‰¸9»užXž a“¸âæç–‰)‡h:°_‘~Â/±+…! œ#:¥ý¯¼`uôîç‡5÷é_ßz&?¡’OcheVÖ¤;qV3uÁfõêÉßû†ÊO~ôƒÓ0ŒKËí]ì š ªM˜.BU±’ ça›„‰,$$l¡ö ¿à …ÇÔ@vï±dð`Pˆrªœ6íC˜kĘ0ù™Ð¡Â¹ ÃÆ9CŠm#— k>’$W-{hiiñ Ý'T‡`}ä°> ”ª……ÃÃÏÞ¸~·¾ªÑ@–òŽºz¤K=H®:™#:º#ãtp…–p´0õ]¹ü´þÎLÇ·öOl.ž½ô—ß{çÃÝK¿û‡ñ ',†¦,fÏšO]ué߬š^á htŽ ‚pϼôG†fŸb&U¡?Z¸ßGöÒÙøÈþÃÛg·@ O^¦Ü¹¥h*Dßp>¤ …(·t/Çî xǬ“[±—§KÊïH˜·]ØiÞÜ»ùø§¡=ù ÀyúÔÆO¡nù?—ƒ:©iY“SssóËøá3ŒOðŒa Èá„ûLGšüþ·þXȨ¦³Cm#9lÔ!£´í?šÚ:A8jI†+!T•N÷Z¯AË 4’ÐaáXøW‹LUò¦Àžló&­oé …L$猘ýæÆ&ÖÔ”*+)EJ²QUÛ¦˜ÔFW¼pÊ|ïí$C b³ðÆÇáE¦aöÑOá ¦gææ–N»LŸ’+7n]½ùÌ݇¯¾ðò;o}ùåçž>yðø>5¹/\:³¹;±¾¹I|ÚÊúÚêâ©ÕÕÍM¢;Ï^¿8súzÝÕv3+: 'öÏ9M­ÛôMY/.ŒMY÷-¸ ®»¬YµÎxžôX·k›ó9íܽè1pÂkpÍ­w™Å£Õs`Å£Ñm`ÖgbÕ¶kʺcÆsô´}×¢sׂßàŠ{×´{ÏŒ×øÉãmìùòþ‘sš‘ËÆ ·¢§N•L.µÎ­/œèêîë:157Ý3¼1·>Ø9Ö×5Ñß?]]ÝšWʰÆ# ÂoY™y9Ù Ų4)RÓØÐ ÂAk@…±Á;•ÕôŠªm®/¯­Ì.É/o¨NÉÏ,©¯,ª-/¨,)¤WRUYrFJ}KëEEå•ee5U$3¤åçªNûœŠ’òæú‚úªêöfÚñÐXµ ²Œ~’ H¸sMqYe^=VÈ©¯(*©.-/ÍÊë <§ˆ…ŽÚ¡EØñÔ°ççÄgæ¢Ä`‘ó”6È1)MÉ£óöòáÈøwóÂýü|8‚%RP*BN‚m«'6vÎ_^Y^‡Š$þH„:‡ºÅ¥ÕÄ|«ÇQ^Ö+|û‰ëŒm™Vh(yL¢¢Ò¼êæ¼ê–âÆÖ¾é‰33½+ý=‹)]ãn#‹‡f/h&ÏKù{»»?ØýèÛôÏŸÞ¸/ps ãîIN!* ÿJðÄ#ˆB`61É Úà̈́ä„ôá—³³óð‡Â÷ö Â"²@'ötB‹Ý¸q Ã[ñ ʯ × UÑh…‡doÏ=÷î+>å_Ö˜•– p‘O™³wîÜä˜Î{,„¼CÇõöÀXÂíÍ­¬œ¾{çñ3^¼|îúÂôRgS×Üøü`×àäÐ$te?}öú‡f¦¦‰9<µ±>5>059>1·Y7sѽç”éÈÖ¾•ØÏÿÑîîüèC ;ôÅ—ÿúïó¶nGL] h[j[ܘ™šcÊŸÝ|üòKO^yoÜèäR…«›A%™^в”/<÷<šŒ"Á5-9´áü‘<ÏDšpò°¸£#S*|`ˆ¯a±q 6×ÖÖ’$’àR¬ál¹-ܾÃÝãÅûDTò>¤¥¶ãJ=v6zžb—ÛºQL'Æg._ºÞ×;ÜÒÜÉDF[%@—‘Eɧ2êðÈ~_޼LªV²Æ·vú, Äž08òD H©mUò«Û[à“~¸=„#¢DN–úf2îi0Q øyÑ+‰ÔÞ ¤äTÜc8á´A ɪlS|¼4Åæ%9pò/<«ò/ÚßáÖY™T§rUaIAV LS‰Q}uCÃhHš¸îÄ±Ç R²°Kœá’î& ÛÚy…ùE%ùÅjÉ+*Ë-ª,(m*¯í¨mhí.2r*Ë«(©™Y‰éé ™ù•U¹@hNnE^.…<H)È*K.h í1ìÓŒÎ9Ÿ»ñºÅîî~~w÷·vwÿxw÷ϵËw(¨]Ø–½eテŽE~"ïÿWíoñÉáœSópw÷µÝ]çÕÛÇ.]´­éó/mˆ(¨JÉ/ÍHÎ,HL«LÉ.ˆN©Ê(ÉŠËÊ$ì%1' ÊÏ/,4$­Ÿ5ü$ôT K\lœdJrï°f;*2Ž÷Y󵏸D¯àŸðÀ è°Øˆ¤ì4Ö8ÅÈkKÏÉÈ.Èa€¯¯„Ã&EÆEÅ%ÇW–SÛš„Дܬ¨ä„È”„ø¬4ÖÑiIAÑ4vPŸ’œFdK¦ JNAƒÑÆv&óH(EOºCÐj‡Âíô… ^”Õ8c2R"S}TÜ_0ODô$2â +÷KK)‡ ·—§ÜogwlSÁ&;—É„ *ÏœÞ&.1!-)‘"6é<6ތꑑ1.yoi£‡âHdÌÈŠ‰I N˺q²°ö1“ÞYÍÄöñÅk­Ï}…áôÞî#w/_:·vjcõ$nfæ Sƒ=3YxG¦AŒŒø³¹½øh™hK²WIn{ýõ×¹á0Æ;¼S³RS29O´¨ÌŒ<üˆ¤ÐOö‚TïÃ4aC¼Øf޳@GñäéK$Ú*Ûè¾â¤gçä oh6ì…ˆDmÀrà¿„Ü»òúϽþÏ=ûÊÌäRj|fMimIn)KnZnEaE5¼py5=7^}ùø<úY¥•©õQKf ^Ëw¬GÏ´¿òÎÚUTÿßÿ´û!‘ZL·wþfwõÑ— [ºë:Úã2ÒñƽóÿŸGÏ??8:VÓЈÏ )/EÕ.//*£‘( O_xÄâ*$ø€käÆræÜOnTO÷yÒGS›¯V¢ÍkÊ—A¦¸õÚk¯á‡ƒ×å·ì]ñ¨/¶¹íÈI¾ŒY,ñ ¼Ïx@H337!>Hƒ ¤bz•AK’¨ú—ÌÔF¯e¾S¸±© jvn ôÛðÃ±Æ K‰GoŽñùYG8Éø®ªo&[€*ÔØv’ñMÃ&òÂ,­l(C( ¤b“ñ¨à÷L7ÈFá$å#¡y`bØ}üÃ’R:}&¥S×ìÂÔL*(Ò‰†¥0;—dfœ|ŸiX¡2,«%¹UWâ'Ù%k .g**©r¬7‚Lèk[]PVšAZ@vEfAMv1ëܸTOJ;¹çfä`(’°V×dUTæ’ŒUXTKPhqñœÅe9…­Aµž#kdž–œ'NãÄþ«íF×t§v u'8³Ú16ß3µÜ=¹Äv×ôÇK÷ìZçôZËØRãð|ÓÈBÃÐ\mßXóàPÓÀ@mÿpUïHQËPU×dysnY}z^IveMZ]Ó}´K¨·e÷²ÁÈy‹Ñó!ë1M½1EµÉYE”oÍ+£mJCRN]ZqefIqvEB\&—\ŠqV^Å'¡ö,rg˜‡’´+á'_£¦quU~qÖ8¿¡~fZBR-mã“©ˆV’™K%3UÏ,=ƒ}xp´”—ðPÈ"dCÙi¥¥#OûºÓ‘uÍà)‡¥k¯þíû¿»ûí¿ýާ§íÅÓ§Î.¯ÑH˘ñ[EýÉ!dF•¬Ò–ÞPe8´tåÁ½â#ÔÔÀ>Cáà}òJa2÷ö ,%AƒäÃ!ޱ6 Ô„{Üã9÷â6‰¥ž÷XJù‚r¼(‚„ŸOQ©?½Ú"œ’5Þ¦û÷?¸ÿ¤±®ýèa½C4Gj¨½©w@÷ÐQnËØÐ0^vž‘戱Æ!ÐxÃaxÛª÷TÐĹohy~¢Hî]¿ø£ø[¬•ïýp÷¿ÿP1ÿÿãGæ•—iŽŽŒ¼õàß!î>R]/©¢„Ÿ¤åÕ!ÍÁs[ÛDpÚ\¯TÍU‘–Zb™/ÃR’¢¸FE'ªˆPa)%ê’ ]²Á~)…§Ý»c²ÁýÇäå}ˆbí¯þWT'»åÎØÙ:-/­QîéMçGöRžÅ»¡söŽÂ: k(ÊÕ3’ñMt%J¡DB}m8Éï&Æx«oéÀ†Ãt꓆èd|sÓ 3!i-G%)q b‰x”ò!’À†Xo|GòáÄŒCáû”wªÎ* )6þ˜ñ–®‘ÆöÞš¦®ê"ëèFHäQðÈSö@¼ YqÀûF£A:‹fŠjƒ4D‡»MÂ%ÌRÅI¦gGù‡Öä–Œ¶ôŒ5uÕµ7uÔwt–Ö&dø;¸{Ø»$ÅŠŸ—L§ÓÌŒ„œœ˜ì¼¸ ZȤ—¤¥eª¤ð”¼¤¼Ì¬:çÌ:ïþó%û¶™ÏøîndTNkßøÊÚiB `½ úšš]š]X›œ[™Z<9½tz|áäÐÔjÿøRÿärÏØBÇàDïðp[OOûÀhsïx^y[s×TSË@eYíÿÇÞYVqtmø¶Hqwww B  w'$ÄÝ]ˆCpw Ip)uwÜÝÝÝîÿÌž°ÍG[jô¯n‡ídïÞݽ3;óα÷À ~Ô51Áò ÑXÉ!¸¨{r1—øÚ|jöPß¼[ëÖÝGÚœèk3,xð8—~£ëßc@ÃzÍË•­JðMçözvíÑÉ’P %àÒøšÓ©’~•¸¬$ZE£…Þ«„–ôƒ"ËèÑ(@È]XUÿlDPþŒ¶—9ŽFxw 5:™µƒÚ•?¶k·>]»³ïÙ± ¥‡eç.æím»#w% ÂÖº70 );{Äq";ÈIÛÚÒÂ*ÒvæJºom;¥¿ýNjuï 0|Ø£¦65k5¯!ÀLä6ñ4áFŽÍâæ¯p*«dBrhdŒLqÌ5¸™€p8Uúù¡JBõÍ åãÀ¢»£¥•Vºv‚:TŠÆ×ãïˆV çdŒ.£¿XéÓMhzéMëaƒíƒÆ{‡7²_d˜{9¿”üÎS,’V5ïóW/<Ì&1*bZt\ˆ¨¦KþtîK-(…â)b= Þ –¡Ü‹›¢l$0 [/ò#é Õ7 p¾ÞÍ ‚^8‰¹ÌÆ*‡Œ‹ZN¥Î–¹¬nñ­@§Çe…ñ„= §èè4#ýH á¨Ou—ö³CSÛA ‡R³ñ‚ùD’¯ ŠäzXÙØwh3tÄ 1#‡Œ¶íÕoíàñ£ÆM‰Œòðñ·é`1É·ª½o߸“BK ±Ÿ¿%é§FbûœÆ׿×ôˆÈ ‡Ïà®uû¾²hïܿߢsgWoï·ß{ÅšÔÐȨcÆ¢À'JØã(C!¢Ìz…Ì“h¿,§ ‡:ˆ …<&tAø˜@¬ŒÊI;Ól&xš-(µ<Ü}µâCA¶Ã +²··/¬pšàaN c6-ôZQÑá¾~ž^.1KæOìž\dbX1çIJö‘QîÇÈ„£ü° #€×93¦§$$%'¦pYÌ~p^ Ò@Y # æœys·—ÎNîøj…„„a. ÁÙK#àH$$Y ñ|I‰)R¦&+Š“E‹–À–‚Çž¯ |°Kˆà üI¸šLŽsÚaW–ÎŒ‹KÀÿ Î>Gâš\\8S ð˜GðÔikV¥¦¥®[0irҬȈø¥‹×NKš;ÎÒ…ó–OKš9-yƬ³7®ß0kþÒà™«6|Ò,e~N÷€|ö~M<â>=õ”6ùà“ow¼û"é˼·&ueʬÍé[vï>|éòõ‹W¯elÜ´:-B“U«SqI›;oÁÚ´Œ5©i+W­ëdé²èQ—/_¹bŪ-[¶ADñ‹øÕHcø¯aŒ„ók"HÌóCk™7w±j®¤©ÞhI¤aБ:n&þ&ÐgÁF+D0ÁGÈÁû"o…ö¡ãèMhMˆ§œž2ÇÝ͇ ¯{Ö((v“Ypƒppšài«Hì¯"*Ê ð¨Ð¨X˜—EªÃµ‚¨¸ Âá‚ó2v¸¬‡¢1„#rg01æeˆ¯úƽž¦$—A&cÞD>c>EPãOIíÆG"±IÀó¬Øê4ÙBi#í¬¬ OJŸµ*zÚª))Kc¦†8¸5ªXZúª¥Ê‘ Ž$ê:Ú † &Âf”)&ÀŒ:Ç¥¨©à3·èˆªˆæ ®«¦ÌHŸ½4,iiDòò¨i@…EfuKVªV²BÃÚõjd8‹nVÍÚw0±ìnÒªƒeÖ›4ƒ"«¹…‰¹Y{ÓÖ%:ÚVšì[&pJm—P˜vÛØ¢J}R0øzû}üÉg[¶îøð“/7lݱíýOÓ7¿»,}ë’Œm‹Ò·Ï^½eê² ÉK6$/Û·p]èÌU!³V¹',tK\é–j=!r }L½fÝê50Ãï™Læµ›5b½‰m¯n@laß©%|’ëÛùnÜ®IÛî=;ô^·.8.Ã'òíèiiI ÃㆎoZ¯iÅòUjT«©Ò÷4oÞ!ÓJs´©K¥´1§-Ìø± ØÆA¼ˆünÛÎLB챆’–¶I»‘­»¬ðŠÚ>ý˜9ï%,X’¸4,¡GKó&5êÀš “Ç!ÌÜ´5]þ³E8PƒÀdëæ&¨Éøƒbi®9ÒE;–—˜T9Í$‚íÚ¸™k£S(k¦L‡ñÄcì$x™IMBP-j+d8–®p’XkœTXÿ•¿ÔAhXñÈJ9HËÙÂ1ã!ª11O1[áù®¸fôKQ7á•Gá7˜‹±DkÚ¼|Pg7(”§aþ3bJöµ.=Ù½œïŒ"“âêNŠÜùȈ…iÇgåÌ—«Q“†Ñ‘|%" iqåÙQgáú(j@ -G{‰Ûòœh)‹.Á3àˆfŒûqŒ7?àÄà"ºà…+æ÷ÚTTˆ\ñ 7"Ð×IÐ7J…‹pöäÒ˜P¾qޮɒ O b¸µ8Ròx… Ñ’ ŠÙJË/Y´˜ oìOòÍ——Ÿ“;_B'sg3x›sÄ£ÒÏÇ¿As3Cþª…» 7Lr4ø—ô ë?mùü‘ÍÌ:/]½Ú€2ï C‰œ9U€4qÝ9Þ‚Gk¨äIöÍ@^²t94~Š\>‹n0ScIÆ”œ¹`Pcñ(êÄ FÕEÂM+ šZ|)UŸ*OKÕ ’:ŽiP´”ȸ„Æ‹ò™M:Z.KüvMŽà›ª%¦¡{. ˜¯ßÊG'MKÝ:hüù s 3cîKë‘€ -%ë*Þ7\ßyûp‘ám š+©s‚£Eª“ˆï)¡–DzE%ZJ|¼q6Á2I£äͧôõ¼pÛÐO€–d£'˜ƒx¨³Iv B=TZN-¬#|ÊiüI,"ƧÚyÍpˆà=Ñ-ÆÑËiàÈV5ëCÔ[©xi(牵bx*Gª¤ UTâc8¼Ù« ȈÁ3AE¿•#Û –±B’P*ªQ©Z?ó®ÞƒÇ§¸ÏpMœìG™ê˜äؽ‰Yâ¤ô(ÂñCê4mRºzÕÜÅJ”!®tͺ…ËÕ.Z¢x¥"…«–„©l“–oXX•ðô7xûpp½Èšð¡þ¢IXÿÞ¹óäܹ—®Þ;vêê¹+¿¾ç赯\ú|ßÅ÷vžÝòʼn ŸXÿùÉ5ïY°moÊú>svLˆ^?1f‹õ¤Ù6¦æ+aZ¼d£¦Z“ü3_ñbgŸ+-e-ψü®±ÙG6w ËSÇÄ´]/(wi¥…v^óÇ8-µ÷„p$ÙÕwTïMk7®Y¥V½šuÉhƒ©ºz5ò”+[®dé2ÅÙ—+_ŠB…”$P0×oP›?I2ÀŸTH§X 4ÉTŠvS¥dÙÎõ[ iÑ!i”Ëü‰¾Kƒ8¿5Õ=4o¤\ ˜ †e°n#ÑÒä%KÓ!¤ô( iA7oV´d ôd´$Íc©reáÌäzŸ‹Eݪy÷þ#“í½§Ñï¾s\‚’œ|]ŒìؤeÅbd,Ãb‘ „Ó=f%Ü•*£¿  ¼±RFG„ù€€ÀPO/?d)Ü‘¥€7Ä5¦' Þ‹‡€œ sˆŽ®"«…F¹•r¼e(Q"¥üyrøÏŒ.0Ä:‡ƒS¹à\fLœ¹SDa ‘y ¤c‚§ÄÆcö+^¬ŒXûÀ¤Ü¹ p;ì7üY¨`q¢ªÉþ˜Û•ö§†*ה̶d@ìà1˜Áy*EñªŽhF8¦Û$;¶ì@çPx*e… iaÖÙ½\q› ù¢" ÑÁù\Ü<óø¡ñí¥ï–.]5qþüUËå(’—GTa €gN+äM¢ß6oÞúñÇŸB„„‚*áÞÄÒ—ƒÄ$X Uó*¼bÕJÜo@‘ö ÞäÉ…Ó;ßÒ>BUC»eíDÖýHoxš “dÐ頚Ț¦Å'v>UÉ–‹+-Ra±l™JyrsÓÌ ÝŽ›/aÛ~ƒ„ÓdìD{[^~¼¨(É-@€|@h$˜ò!®àëûïB¸]»• GÀ GÞœ¡#ÆŽ=:B€*yãòkq3àìŽmD,ŠyYï-=ê…7€y~Òßl±¬J” ¡ ¤Mki6`üÔ‰žñc]cƹ„ušÐ£_§†&&5êU(R¢z¹Š,üÉ3G …e”ÙÃÛ\i/Byþ‡h‡™?{î^¦º÷î3Æ5f¤3%z´KøhçÍ*å-V"w!“ÆÍ!¥„C®P™Ò†\y oä©áM•Jû5äÊÅ å«^ÛP¶z l!Q%B1•¡¿/R¬°Í€>,”`¸¿pùÎéó·ö½|öÊ“'n¾ðxÿ¹§»O?ùìÈýw÷ÜܾëæÖï®g|vaé»§¦o9ë4íÓÞkønèå¸|¨û²",kÖ²¬PªF¾·ò³¬d~Èh,>Ɔ²þÓkŽñ0­T¿™e“Î1#&'ÓV¶£¦ ;rRøxÇ]mêU¯W¹\•Êå*‘˜¦c32æäΓCMPZbUÕfTà8zÓP±RYX 1škhÇÅ æ2äRÄÖŒH‹š41ê5"ÂzÔ´¡N1ý'D ±‹çlÙÔ”Z*\¸ZeÌi䘭Y¿.ó¤dëû7 È~Ó@2-Üò+¬ZO‘]çÌ$%2Šç+ضa3ÈMÜúí?Ü1q¤sâ8·¨1Nö=´¯Û´RáÙ´ñ ˜I”7J`Ì3› P÷×—á"µäÝÀ›_P(+e° „SÜ”VÖä_D§OŠA>R.'¡´Pß Æ.†J*<’:ÿ€ ˜Ø)1SâPQñ“â“ꆖqÎ4ÓäØ"¡‘oÙGUuH|ûðý+Œ—?ˆ˜ƒÎœ¤<ÅÇM5s>äÎ1Ñ ñÓ"#b9B² †…FCÝ‹20*2nö¬aèÖ“¦ÇÀ~îüyøI¢C9¹`Á"ȧNM!Ø Å&{ÎDK‰k(¼”ð B¸8%$GؘÆ5âæiÔ—.]ŽÔq0â —Z°h!¿Ää¤ 6!3¡ßƒÑ˜sR¦Ï\¶tÕòk02-\´lñ¢Ī.Y<ÁÂÙ+W¯@m¸võºÔ¥é‹g¯Øºñù V.KݘºnËâe«—.Z¹bñJxOf,K Jý¤iðLƒ‹{ÎÐÀò+?[ÿÉêÕë—mÚ8uõÒ™kÐ9.wëö5éiĤoظpÑ)×®M‡Z…ýªUkÖoØ”‘±>=c}Z:!E«Ö¦aŸ[²jÕâå+8²jÍjX˜!aæWs2‰¢&{ž%èWS׬cϯÖ8¦qÒLåš'µRQr2¢--ƧDÍ#+ÓÚ˜è8¢‘bÏ¡%éq­2‹ÆçS‚šˆ3AF\²xEDxÌÌóèGv›—ŒZï\ôáž¾¸ïfE8øXxƒ#¢A8àÍðË‚p‘†êï-y Òî¡C‡4›ŸÙ`ˆØ³gߞ݀7콌CrŸ>†B*T2 rD¢vPY0±¡[ ú }#FTlobWƒÎKyŒã¬Yø Ä 'ô£Õû°ý('”VmG¶îÖwT°ÍˆÄ1ÎÞ½†yõ““e¦õJU®]®jÓ: Ûµ6G'iÚªMæ-ê7&Lk¹D#*‘ Ü “2ìi›JÈÛ°!§á˜)”Cw[¿~£CŒ ï§JH¿±üÙ©V³*ùK”/Tž‚6­Ûµ³ìÜ¢•¤ ­š·1m‚â׺&-šàÿQ¿I½F;•ï>¢Ä¸àœ^‰å‚Ž©¶|‚IiÔˆÑîÞ~WoÝ»pýþ¹w¿|ê–ñÐå§û.Ý0nüúü§Çž¦~!%}çÜÍ’S¿[þÁÕ¹;Å®»7(ð£~;l\SûMž_´RûršÖªTêájµj²ƒ/e%G¿¢þS ¸D7r -ÖÒ²Kï;÷ê;6Ñft°EïØ>#Â÷6¾wGëšÕê–+]©FåZm¶Äaž~=­Žv uR P‡YcŒU¹ƒÍÌZ£ÕmfÚ¼j£Ú Û4‡S·ií:½[¶í]·Eˆõ°äv=†E÷>pœ‡í°>­-j”+_¬háJU*â–‚{$.¦P§@N‹ÅKu)ÓÀ#ŠÅ”:ŠeRF …ñºQƒ†dñƆ×Óܲ{s3(»ûae?ÊÙ§×°ÀÁãGw´îܨeÙ|…qZC‚Ì6$9 ÷ÆüÈi´£)h/wìxWKÏös¯õöùOñR¢ÉÿlÖÎbÿPËçˆh7/_^Ž£q£Ê*:$"Dóò÷  §„{ED‹\3Ž‚€™âŸ2=9vvhH²Kò¢ ~a9½BK¸Dw žså‰ñéSã·‡÷O™“>eÊ´©s¦X±s“â½·ðpa*„CþLˆŸ*v5·| ÷ ® –À» )e:)Ç($·›;oQfTäócº›5sƒŸÎ#À¢eì¡–ž1s6ùÉÀ­•«ÖΚ=—O¡êç–-ÎK,\:o‘0Îb¿`ÉrR¿¾´_¼dÅÂ¥+Øså+—,]µxQêÊūצ/]¿iñæ­ 7¯_¶yéÚK¶lž·v5ºÇíë6oX™‘Õì­v™»±PÀ,Ãxïòž!áï~ÞÅ+wßÙüNzÆFÒ¬Þ¾eQzúÆm;2ÖmBØÚ¸q3蕚±.mý²€p€.ÙoÙ»Övê*¥@ßÞ”±y3Œ'ë7oÙ¸uÛºM[.]¶q¹Rùlõšt€yMj¡ )2Ò7RøSÒ ¬Z¹ÿHA>±Ÿ3C\¼«€´Ù³æc†ä`F#´0æ7Z˜?9N‘NTK„iôE…êÆ`hNd&^¸ðÚå}ÃÀÆËà Æ[†gG¨°çÝ£üP†á0Qý-ãážl eØP˜æÆÃ§—áŠ)†7³8L —€ 'Ä]è!ùSyˆÔ©# À<æYpŽOUªnÖ}˜FïÚ±Ï$óîöz»÷:°uGóê —¯Q±HéºUjâÍO$à­JÍ:°RÁ¦Ãõáâ²\Pø¹©È]„GêÍBkð'MA£Ñถ¯¼0ÕªW·z“ºõLÃeÖ°z ®GÍ&öm¬M»vèaÑÛ¥“ÏÀQæµ4¬TµB©ReË–fÁzŒ„xI(šdáÂõÕkÕbÁAïS§¯9ˆs N˜$yÇ8‡ n™d†›l3âÊIí{¹víï`ÙǽïpX›[ר_ s „ÞÐOêÁp›àÜ_áP‰öKÎQÀªÑãí\<¼QQ|ߢÂBC£ÃÃb"£Â)p$†ÇDZâÆù q«ñ-VåœS‚ýB¦DOóŸ=œ½ìí”…_¬\÷þâÕþ£í»6kmѨE­ò•kW­‰Ãù rçGK M2öÊEØÐŽB,„:›¶ßÕ¨IQaÁg¡³U¬«÷¦éó·O_øî´…_-Hýjqƶ™Kà®^¬Lùb¥«@jW»A­Úõó,#а1`ÐE¿î q¨ÜK×­o¨`Ruâ”ìΉ¹ìýÙ¾ÿèfñ‚EÆMfY~êÒ•ÝGNî=~á˃gNÜ4î½ô„C-ùîþ‡oï{#V…&î_œ¾kƲ]óV혹xåÔÙ.“\L[™ÃÝWµRM“zͬÌ;’#XtÂÒúFË€7ØAi4é¥.F¯¨âŽÔYh)ÍjÕg5°!:eïò ŸÏ\þÁÔ…ïÏ\òÎüå=Zš5­V³zÅŠ5ªWE(GøF€ÆæJ³ëªi¹ Á•ƒT0$pçAªqâcnÊfR¯ž&!œ?]¾nÇÌ¥ïÏ^ñÞœ[g/ ¶s±25¯P´$QG"Ãox[è‡0'Gå/-ÃÙ”ˆ‰=_—áÐ 1ép…?>ÜL=ðMÀ‚SœÆOpuœhïþ4 Êóü(8D¤‰hCÚY£VMJóÒÔ´’pIK/P†øŽé¡´¦k8AµªVäë48E:ˆÂ×9.iyTnh`Xæ‘è5\ÙSÛhUš‘WŽï!‚r€úîï*Ã=Ega4BsøðaEg¨¥CØûÑÏEK©#Á(À› Cë%„ç`ÐÀ=ɉA ˆÿ$‚È'ÉqðBŒÃ§N*Zê–VœÌ©bûõßÝfYXÜâÐ)3¼ƒç…DÏŠp<ªMÝÆµÊUÂ×°Nƒ–Dx@º¨òÈ Ç²×ᚪ͌ÀBI8ÂÝù“MBÀ]ž„´oVmÛ¹7# l^`ä<ïÐ…>á³=Bbì=,¶(–+_™b¥ `&‘Í ÁÃ;uî;@S $?ô£EgB‘Ú£élŽ W¡Óðê“â úÍ©:Ud¸æ ›NcûÀ±sv>±ïÄÅ/œEEùõɇŸx²m×å·íTüš} ©£—íõœúQÄŠ£áé—ÜWœîä½ÞÒcMûÉsºNJÌ_¹UÙ*Mê×j€–žhWâiRyrP1Ÿ©ù\¦´ NÌÕ²½¹íˆ¡ƒÆ’k&5 j™‹ï7¿%!ÑÉ¡#‡ŒjаiÙr•«T®Ñ¦iË>]{B#½@›¨€ ­µiþ$øF2ùI’öh›·5mŒ¹™Iƒ†}ÚwѹGä8Çyž$Š ¡­èš9A‘][´ª^ºlåR¥ëÕª‰¾Q¾‹0‡˜È•³v=Ç„.ïÂ=/1©X¸¶æÈ—„““ãÛkì¤ÙQs|#Ç.‹Ÿí4|l›ÆÍ ç/@€­Žpàæ7I2Ô ¼ýÅ®Mt’YN™@^èˆX\™0 ¥jL8©ÂÂPN†FGû…„H…Ù–IjôŠbô×RLš8^16 :¡ïç¶Žþì½KùM)í5`Z*A(šv~± …gtÊ”ˆ©x„ÇÄ…O óŽ?ÆARÈT+ ôL‘L”̧̒Կ?;å\ޝ>Y¡UꟄäi)³ð>g‡4Ž3¡¤‚XKˆ»(à™€ó;ðFâM¦{ qanþ‚%Èmh&© Ʊׅ64“RPHRô uä9)ؽ._:ÅÒ¹+—/Z¾:uñÚu‹Òҧ¼dýÚÙk– ­]™ºfIÚªô·£Önê–0»kLÕ)ËËÙ‡¦]xŒŠrÿ™« -_…¤µfõ²5kVoÜ´$-c5)OÓ7lݲÙÈ?8µ0Â4"% ß  EV%($(84$4<04ŒäÄÌÍœ·0mÃfD· [¶#Ã!É¡¢LHœFðžÞt€IT2[œøñ'âOq,b/ŸJÌò™Êïªâü”$‡Zq ]0R5¬“;>·ìÛd/ÐÈËÀ¢j.´ÙÈm)+* Û*JXŽ#rüŸƒp¨(A2Ÿo¿…©.Û^p{÷îß»çàK7rÄ8@„#ÌPd¸Â…ñÖ}(Â΄‘KèÏרp•Ä‘½%â‚h/ùgKÔe(µÄå’ '3ñݱI‹Þ-ÛôicÞÍÄÔ¼^£N-LûvìR¿j5ØëkU«Þ ^Cüþ[µ6«V«vñ²eK”)[©Je¤aÝæjèßåŽä"O¹ OU³z ʺ£¥mÇNýÚu°51ïÓ¬M“¶6mÚwnѦhžüeJ•­#~s“v–ËW¨„q-eE²*–.Y®xJ•j‘Ó RéZ­ÚäjÔµäÐÀ7ã‹xDWûøÙÝ*å*A äãtâÂåÝGNï:véý'¿=yÿãCw?9fLÿêvÄ’oÓ¥l8ç6í3û)-Ø¿þjÜ»½3.µ÷^gî¶Ülò¬ÎIªµ)[­i­u+–-W¾r•™RÌ;¥€kBÑNòK++RH’`‹vÛ»v¶êÖµ{—N]!OP©(!I àÔ’Ð#ôîM7áJ²&}ý \LÖoáÖ¦­Gâ··³èHSÛ%Í›ÉÁ¦Õ ä§­„íŒxyØb:P „C9IA9‰ ΢|Ê9|…¦N,Ú\'KëLjIíRçeÃI8¾ysÐU %uö"Æ!º¡¥„£þÏA8‘ሬ|ûí·ÂÁKÏD†ËŠp*yÕ€¡‚pd9aÏ"]×RŠbJÜ…Åa’‰©ö%~tÑr&kÿ¾½¬{ÂOÙ¬¹-ü={v&¦J-óû6kÐÊ®reÊbq#£›EÇNEJ¨D…9óäÍ–CycŠžMBv¸…¨=y-|Dq–³A T´haäFÓæMZ5jؾY³.M[2}wmfÚì 4QP§nS“–mÚYà#úVŽ\yßÈ ä8¸¢®äÇä+˜«vk3CÑzõ\¦a‡+ä† ÷Ìø @®|N½ýBž»úÍSß¾üîwg¾=ûô«³ÆÝ×+>¾99þ=¯YßF§žûéĸ¯¢×\ Yuyê§FßÍ·Ûùnjé¼¼ù„ãòV5+[Ó„DÏ9qM~3>ßGŒÆª“C ¹&ñœZÙ5ØP½Q•ν·íÔ¶©i¯¦Öõt«[¯»I‹>à0´àù9²5¨Wß¼u›âE‹IÆÅ¬úCislf`®Z”s ʯ~i6Å<ߤvní{š·ïÖºm/3 [lf–­ë6c; Qµ‹—¨S­š©IKÖ4ØÞ„u)k›K`Óч'äAK‰ÞWóçÌ“//ß…ttä€Á][™íÞgŒ•m,‡¹†°9å‡ù_T'IP!F' ÂI¢8áÞyç=Þê?‘|ù§kvJdRDprTxRܬäÙý»õ·4ïU)y”°1“8f©K…=ÞBœ@Ú¸ *”]Èpø› ÃaŠ£‚N…ë›Y4n¢’nŒEÆöd_â $¯©­’N5‘Ò¤©I[ó¤(C¶@zÃ[TÃF…G’•,6¶ÕKW®‘‚Yë‡F8Ž/Y¹fѪ5‹Ö¤.ÕV¥­]™–ºZÁÛ²ôå+7®\¶zIúÒ•›VmZ—þñÔô{ÌZQØ9¸ºJéqA³ö_ñuï…{«×m[¼p¹D¶mÙŽcHÚ†-©·¬ßþNúÆ-X× ÊÀÇ/«V½úµëã(Ðû>érÐëHÞeÖ'9«èæ-Ú´oߥgOÜW®Åî¶•gfŸš‹Ê¦ö:›·c3Õ›—–Lè¡ÙU²o-ƒª!ð Ǥ1loHoR@;Ü#YpÀËW$—·¤¸¢©¥ÎžkJtú‹¥I¯Þ¶ˆÎp ¿$NR€ï˜è'y÷þ'â¡*ÄÏ Â1&_a‡ã‘át„3z"ð&‡¢Ì„ÃÇDÅÃ,L&3,úF1}I®™Ý$q-b+}I,ØCJúZ< ÌÚ´‚ù§c;³.ÚuhÛºm+“æ°ˆjPŸŒ» K—-E®¸NV]A¸ÂÅKàùNH '×'(RdI¹+ÏÀ]dSé?JíÒ£k·]zöèjÛ£Û++„¹îfíHæMptîÜoU©Aº*—5omÞŽø‡<¹òæ{“hïUžü9‘á ùª×šœˆ.ÇDoîîƒë9 Ù&utñÝuâò»N~zèòö?;ù|ÇÁgï7fì2F­9´âtìÆÛak®OÙðpÖ{Æ€Õ·œ–]»ð¬©Ûf—´¦ãæ´›˜«bÛ²5Z5¨gýüŠWP!\0Ùã {&Vt3T¨U¼]׆¬XWŽék;¶G·æ½ÍÍúv'‹z;bÔÊV®Hž(–ݬº E±z AøùìÙôäˈÑ,d"L4û¥2×åÎE¸±¡yãF=ºvéˆJMf«Ö,Úû÷èÙ¥­y¯N«ðV¨HÊUÀGK‰Ü,鉹‚örY àÅÚÇ­é n­…p)+ÁT¹ ä)X¬Pk³V8½¶iiÒºIÓP²µm׳c'ó¶m:wïBÈz¡²¬c2NQ%ißYIŽ‚ ÷—E¸žÖ6•`›D ˆ× u™ƒ00õHHxPh”HTpT¼oP|¸œ@\"ˆæhwY䡯 1,é «WªV­Jõª5–©cQ¾÷¸‚á‘ÙÂÃK{„»­þš®çw)13¼|b§D„N š=sêÂ9‹†öÜÕÒŠ9‘¼næMB’){Ž02u2o2ÿ2½vïѽž&ø› loÈpÈa JÓf-¹‚$‡£È×ÞpB¦4jܼUksd¸‡¢½Ä‘µ$2Þ’”8h.\šUhËêrò£È·tU꼫(*$`Ù*&3Ü8¦.^˜¶hášyƒd,X–¾dÝÒÕº/ØR;bfNÇâãý;F|óÌxð‘ñí¯÷NÊ–õ›×®Ñ)é›Ò6oá6o»ï€þTê7mŠu€ü‘ä bÉ‹a¾fõZP(°Ç›­~ƒF|Ü`ö‚ƒ„ÃÙ.}ÃæÕië@¸´ô 4ŽYÛöØ 0­-k±¨YKµ¥N݆´!pÈ2.¿ˆQ¿kÅ\rèz®²nà:²’àRÔç´œ|uè, “>EŒÃ­ „C“ŒV™7Š bï¯ ÇKøOF83b-‰G;œ€Ü+œ*÷í;°oï¡_ˆp"Ãak!Z€©“)Ï=œèÄ•‘:Þz¸Ø¡“°ñ±dŠ^Q0Ö­«%%€gÊ^_J³–p&[thÛ¡c{-­iÍŠ•+Ô¨S: TˆÄ  ¨$O&ÙÈ+ÈÕ$MWÿIöY})ML[˜X˜šwµ°ìdaÖ¦¥…© ¦6«væ-LÚ´6Í7WÞä:µ ]E A‚ÇúµêµjÔ’0sÞ(V«-5jZ¿~Í:U›wîZØ´—ÇsºîKI8¹Ýxg]ÛñÝÉ\Ïøò\ú×דÖ _}`Râ'Ž3vKøfHÔ¶AŸô ùbpäN+¯Ì]>èø]ãI›Úºmo5i¹ùØéo•o_®Zëúu[V,S©lÅ*Øá@¸*“Hm•×5¶¢G´¡±Yýáš÷X¿¹I«æM:·lÚÓ¬…E‹F=ºX¶·4¯Ý°n¥Õ@80§Ñ梄”¡5h%q=ÅG7ÑnZÚIµ)¿JÆqÍê­[µ¬Vµ2´^:Y"õÂxÒѲ}[3èþÛ÷²²êdÖOËje”)-%=Î¥¸×çâ\„~§[Å–E·ÓïR¯nmÂ7 Ø¨^§F…j•,­:Ñ¿VV]ºwélݵ«EëÖT Vi×Õ²bƒš…+”d#2œŽpàúI„9·¿)Â!Àaxö°Ã¡>ÎÇ?Ä; ,(2Á'0<2&7ñ± ¶Q®&ù€ÉÞ[­f Nª×oY¡eïrC] Á_¿J¡ëŽÜzòÔxëă‘¶ÃaJIŽKšœí‘7uPÏÝ;÷`6d–”I`“Y’i”=ŸoÈhÒ˜1Ñk‘Á•ù-%i3™=A&8åiܰ)s.E&\AMà­^ýÆuë5¨ ­ºY8Ë Ž%•àœLâˆtØá^²À‰áM¬qºND:lo V®]´2mùò4œ—¯^³$uÅ‚uK®[D¸é«6-M]»tÓœµŸ Ÿ‘QÌ?9—{LmçèõŸ“¦ãøCã²õÛ´¶o}'cMúºô7lK[·5mðÆ~óÖwß%%!ÇäU±jµJÕÈSŠ]¢JÕÊL ¤%­‡ôL@TÓf-6jÂA{Dn |\ñ¥D¾ÜñþG<áÚuS×®ce€äJûoä Š´ ®Jø‘}mYÐ>¬ð¢]²t%mK›ÐJ¬ð•EöE†£yIg*xF¯q)=•qÃ*¿1E6c˜Ã†f%ÁB„ž„C˜ã5›œÈp_Ê𧉀ÙÙ³g™ÎÕîÜQü5¯ð4á¾ûv–gLqX2‘á&N˜Á_ôüÒÊû³6“>êì½»¥ýû&6µw\_¯{xѽ*V³¨S£yžùáN?x ÂÕr )á˜Ç5š4ߥǺV:¡BG«V={tëÕ½~­*ã†öímÕ¾‡UÖÌ]¥*”ƒí¥I³Æ ¶.!’Ð})EÞ¥ÁA#¬qâwª;[Š~R$-rÃÒÜ¢µ sú“1®{WP0ënVØ#Ë)Š®¥ DTŒ£"©‹<­_“ÆG5-jjÑ£T–såL™'‡i{³ö],a„nܨicôµQ&¦®›¶mYˤQAU­áMÔ’ØáÄÁ7B•kÜáîB]I`Üöí;PQ>yò§ĽBKÉ"ôÒ¥7‘ç8"äI¸‚v€s?äáñÞþ!á±!‘Øâ@8Üxå-ÛY 1ÏV(W‘‰²b¥êý›¾tóôuõ½“ ^þ†ààaId!¢ù•o;q åéT($“"§FFÍJЉÖwˆeûÎ ™0n0ibì!Hµ¾cÈm̘ä˜4±ú`oÃGn„”Ys™7gÌ™?uÆl|FPÁ!y´0iͬ͜˥¸&JÌH|ŠG ó;I[Pöc«³A20„¸c-TN¹™ À‰ÆßàMw6´ËêZ¢Ç ˆH·xÅšE«ÓA8’íX®b®®]>wÝbnmƲe ç¦-"Èzcʆ¯ÌCæær‹/ä“\e„ç®ûF|L¶}µoíæw€ŸÛßY¿vÝúŒMéiSS7®ÍزqÛ;k×oJß´aðÈáà*d8ØDГ.}mÆÔ¤i#†Tœ·hM[ƒpý‡%5F@hDƦ­ÈpbŠCQ‰ ‡ý$¯Ë[@þ ë×mÆúHk€p,h%¤4¸‘£ÆÑ>¸`í£DÛ¹ ±\bÑD†£³ÈP¸Pq°Å;Bë°Ò‘‘G×O¢XV á†RñÝd}‹'«eŒ¸œð≖R|LxÉ +$;—ŸÌÁQÅñQú»ÆÃñòß»w²jÜ)oÞD6xÕ†R„ûö›Ýt ñp¨%‰?ÎkŸ+`ONìp,´ñ4ÁIo=tŠ4/o^<ȉ`C…å{øÌ¹€ñ#@oÉžÓØƒŽdÂjܲq‡–‡Ï¹g¼?Ö~lëö­{õïU±FEà­Xéâ˜ã˜m1÷Bû”;oænî°q;*\GB¯¨-Z 6nÄG̹<n½Û4oß²i«&Ì0_þI¿Þ=;Z´íÔÑ¢¹I³"¥ˆ(_¡f•¦*Uš²`Λ¿xÞ¢e‹—,T¼`µ+HXÞoUmnb¨Ø²ÛôÜ)yÅ—²PžlG8øÄ|røÆšŽ¬øðXú× á¢S÷-߸òhКÓ~«Î:Í?ê·ê²óüSc“÷ÛÏ<31åêØÄ«V^ßšÛmë`—Þ~ø¬ õ”¯ÜÖ¤y¾Xó‹ Wt¸Ã[öAeÂæ–pŸRÑ)¸¾£o…6 ¬ºµébùôÙ½…ó¦u0oѶm‹®VA¸²ø‘T©ÌêšcÜ=øùl´°Þ 4M‡<ÂÑ>´{ 4‚ë”ÂÀ{ÁüHZ (”ñ#Ç>yþôÜÅóÑñ"ruïÖµzåJÅ ¨X¶ ޏÅ"7K³q/úšN¡BG#¯£)¥£å`Ù2ð´•,U¦$­¯x!“öÊ{³y«¤»tñüõkWÈ*c´E÷N Ü[Å`uQ‹ A8Ô•âiÔ|o¿ýK¸Wª$^ý¾ÿÞO±ŽV[@03 .òø¹ýá‚C"±Ä„¡¨ …ÒÓÌ´UjÕÑ+TGQ¯qÅjuê46­Ó®§‰]x%·øl¹ý‚c¿=zkûcc¸S Ë8»ØÈ°ä„x-°ÃEÏLBÛ9´ßPÖDXƒ '±ë09â*‚ÃÓ%nL©à®(Ø ÆŒH‡Ž`8Ä8Ü)ᘠQ²Éu˜vż„³“;!º! ‚£‚ž–™c„6&ñ߉p‹Wp Üò© W¯™—¶rnÆÒŀݢµ+—e¬Ý¸lý‡“f§UuŽ*è;#¿c̘© þ‰;Ï×ðùš ›aR&v{íš´õé›3Ö¢«Üœ‘±}ÓÖ÷^ ÜP_дe* ç¯…õS³&Íñ1±îÑ«UËÖ8ÙÃkfŽ©ß!0C^Œ '§E{oÁÓxÃY…$.j´ðÆ 1‹Ež8`?ÍB²ç4id8€%M¤âß,ïw2À!#´rôÉup`!€¸±ˆ +B–ñn} Ṭ‡ô±j­¸¢‘Ë‚p¤‹ùÛ#ãì   â`ùSÛþýw~·Wd8A¸qc'!À Â!ÑO–‚~’9ZH|Ñ%€=8Š+Ò= ÅB‰þ¯q²cˆC9êJ%´iÉtØpè'ñ„uïžm»˜›v4¾pÆü• ZY¶®oÒ [ŸnML› G)_¥\㦘aûõë‹Ë9Qòq¨"ݺq/ñY—d\ÇBg>’»S±Ð®IÛ&Í[5:lÀ²ÅóÚ›™vjOjÐML,Q°x…Ò \ÛæÌ³„ÿ¥cëV–&;tQ¡èèZ·5é3f\žã‰‡Ëç=³„OÌžÇ@83“Ö#‡Mïúá,pV|lÎæ=1«>÷žó¾Ç¬ÆÇmwóõ ÍV®«l6÷öYßÑaeÿ€÷:M|ÛjòÇÞo;*­™Í´öJTìRºDã–õ[7¯£4þ ÌËÕKúO}Ã!²´wr)‡j½ë™ÔÐÆ¦m¯´­éÎ.vffÍ[š4A©ˆJwЊ•ª4iÚG0’tHªXš…dF´{LÂsƒ®¡Ñ8AOcÔ£»•ʤޯ¯"h¶hKNRr’õ{eÚê¨0••ƒíÛÁ~[²D1âáP ð]"=XÙÐÂú]DuÉÆ …®mn áI›Ö&:¶³èbÑÜÜÄvÄ«¾Ý;Xu01m659~ÁüÙV];¢kµìÙ©i;“e‹¢‡9U‚„ŽRN’S‹ ‰/埸ýB„cZ«›Äè‡'2\Pød¸Ðˆ¸Ð(Öéa‘ÑádD%µ/ÁŒÆ-ZUªÝ¨V“Öu[Z”kÓ­üpï²î |"Ëz‡~öÄxù‰ñäÁ ŒrÂ…&j–3=™Xà!GôêiÃlˆáM|ÄÇ4ŠÜÆÔÉtɼ)ÉWIõ2xÈVýdÿAt„O‘<051óŠÆ „ã‚8;0q3ƒ3qã¥Bá´±ãì À@Â~ °tUúMK¹tEÚ‚Õ©˜,H[±4mùêe‹ÓI°nëÌ­µ L,2!°”ÿœ’öÑß ëÛׇϬڸuõú+Ö¬†§$-»™B¸´Ô- ÜÆ-ï‚p›×3¼‡MïmÚ lÅ•Â%ôúÉžaÞV´”,âA8Ü)Û¶ï0ÆÎŽ5?aë·lÇüF„CLáÀ-t¹âZž¢þ´FðmÕÖ²K7âÌ;t‚×—(ºIŽ.€ˆ°ènE®å}À„I×ÐM`Ò6ÄŠ„õÎ),AD™L…^ã  Iœ ¢•²Êp‚p\JBV@8D7V-ü)Î&‚pÔyA¸'èBž*xx•ë§GšáO„âlrúôi&5yŒWÓw:td÷®ýÄ[¤mÈp€ŠJ´”âlB)Q¢”¦‚Ê yS'Ð%îy(¦X×£‘ÆUq*Á&„$‡Ä ~º$â%ÚªN=:švhÙ£O›A}zô% 7iJ;˜¶mY£nõ2åJ"U0½2—(^4WηpÌõ×ç¦ÜƒÊä=®\ÜLÄí¥xÉb–ÈlÝÚ‘¨IãzãG ëܾ­µUgëžV Õ-T²P¥Uê4ª§ì@íÚ/X8_¶œ³çÉÿVn¥¥„žòÍ7‰ÂÆÿ£I +™‡® k¨ÈpÄÒ 8f„ǖϾ·ûLÚGã—¿2w‹{r†kÒ†!þ â6Z5*42ÐgY7ûY]ÆÍî4riçÑ©Ýí2¬&¬le3Åjpdù*íkU5mX¥^áêG]zª|)«8ñMÊë3½¤÷ôcük8†´vj9r´ù Û†æÍ-­Ú‘»®y+¤+,›XÈË•¯ˆ–ŸDwÈO45- šCi+þ¤ w ç ¨K+q )œæÙr¼Ù´yÒy#Q!7ƒm}úÛÚ»½¥‹ŒZµ0QT¨Q£šdþc)#Â4WQs§ÎGê1²¿™'§b¦Ì™+Û¹÷eÓ¶-Úw·ìnÓ,Óýûõ2À€0°oG+˺-,S µ&Œá`"‡ô&ºJöù‹#Ü‚j¢¥Ô½Ná˜Y0tQGŒÓÎÇjfÅWBr()§DF&ÂqD‡ ØW6«Ñ´u“=jšv¬ÙsxU§˜ %&‡ ˜·öÐs• .)>Åyœ»Ã$.>!.§ˆØL£Ö5¦Z &M¼%™Ehé ÉOtœ×‘6ÚØuð»áÝp6AW Îp¨(Q ñ‚!X ¢;ä"ˆnLâ@ ³<ç°ÇÈ„/v‰‡á„Ö-¥RZþ-%ŠJ‚À6œ›·&mÞÚµ‹Ö®!¸mÝr7}í¯Õëjz‡‘¶¤K’EÄ2¸ë÷Û>üliZzê¦õx_BH²~=Z›Ö¥mK_»}]úöÍ›ßÅ~¶nˆ¡ãFZtîX§Q#ìp€œäÞBtáãÚ´2S9&»“q­§yKÖù„ä-Â!ÀqBð7á0­ÑD´p Øš·¢}À~ÚFÀ.Ý­Û¶ïØ¬eëŽ]»CüK\6K|yh ¢#Øãt8A…L“¢”¦‘ÅÇ•«‰S ùý¿)`žš“ÇÙýáP‰K`êqŽ7U GDŒ#·^"ÏýíNÇ3˜¿×­[÷³X{ðàa7VÀLG8@NËœzp¢¥„0 ‰ ødÞcØP‚±G÷%áhè'‰ŽbÊccæÕ£¦ðï'ŽŠ/¢¥ÄBÖÙÚ2aFìŒySn$dïÖ«k3“F5já¾W¼a£ºh‘3ÐΟ¯Ha–(Ù¸7E'Æõ‘ˆ»B-ÆqîÎqôcLµüIšCû5hV§§uç~6Ýã#B{wídѦ¥UWKdˆ¢eŠ–©\¦JMåaѹ“eÍ ‰,«Vºb%Ü‹,Vºñ}UÊ•+R¼@ã ÕÛÖvLÊÊÚU¾dYr02ÖÕ?r‚[ÐX× ö}FÕjݽpÖEj™¯Û¡HË|ÕÚ–lØ­XíNù*·-ÓÐ*Oó*ÍF•¨3$oU›üÕz¯Ý³F³Þ U«]±NÛ+ÂÚXæe®²chÏi9ã.lÜ…M:— =KH¨¢Š“+^”/U*WºJÕ å*—-\¶h+ ¡•µµVíj+—.Z³|I{³V;µïÙ«©øpEyCÓR ‰Ėáþú2¦,ÑIÊ#Ú Âq£Ÿ ©ÀðÐ(ªøÑ‘,2<"*,46*ŸXdbBµj5iÖµß0·ˆÄÉaI¦½†µïUÊmJa×øãC7»ýÍGÆÁC†¹Lžäá<)6:$.!&6).&>!>izTÜÔ¡£&ôµ’!R€aB_‚A™e1ŘyPÛ0ib–#‚˜áp¡Ná 'nLܤ'%–™ˆæA‡!ÿax8hxƆböZÈMP-F8áp¬ø ‡ƒ 8]åìÔŒ9k×-[±veúú¥ëV¬X7eÝF›YsJûñŠ,9:ÌÛ½Gû¶zõèaÕѤeSS_ý†uºtî͇TNy 9óåÌE,F¢¥ÌÛᛆ*ÍZ*·‚yN‰‡áòæÈmÓµ÷ø‘#áþsvšLH²)*ÖA'W/¿’å*uïmëìáƒâòf-M1˜šmÙ­·§‡>«5mÙÔ8l ëÔ¨\$o«eÉדóMVd¸"Ãý³Ož^"rC!×y†Ú=rös®1Ñ»ÙDÇNvœ' ?/mÛ«oÝdÏ©Z¹BMÓ–í¬{ö%O•ðsJÜ·(uEuŒ/¥FJl"¦\•ë¢VÞ0 |ØÐÁýúôf% ƒ!b62ªËÊ5«)_²FÃ:}úÚ˜9Åc3+õ%uDgâèn!¥äòeŠ)œ/WÉo•Ã`bѲ‹ug›~ÖCödÛÛÛÑaÌ Ý--¬:··îÙµXñBšh6ñ+ÌÈž7 QT‚vüɧ丿5þ+æ°ˆµƒ)L˜Ý9ÐŽéFŽ©£°§#þ‚p$w¦ÍÂü£"C­ºu2rh·¾6¦­ê˜Y6èÔ§¦eŸý'´t*à›XÜ+%aÍîç×n}ÂÂ]ƒ<]œ|<'k7%.)9)v*)"ã§ŸàØ[£É_a6Z àMÄ8êȬ\I2Ž‹?O´ZJ 7w«2º™ÄE¼@EIÈd6ç8‡ùOÑO"ÆAÜåêæ…'…HoYNaÞ¯ÑRj·z%Ö8Œp«ÖÏJÝ0oÍæUË·¬_²uÃÂËS·œ7¯l€w6?Ï\®þ.«¿-áÔ…¤yƒÐ?}ÛºåV¯Ü”ºvëú•ë2RÓ7#½­O{GŽ$8¶o3y2\§îÝMÍÚšÀ-‡rÁ²SŸ^6xQ²·êÒE*Ê>6¶¶ÁÚ5vÒ$_J,pJz[eó"¾Ú(CØ¢eXO ¨ÄZ†t‹XÖ¥G/+ë>}8Œ|-vŽnžÎÞÙÌš¿ˆ Øœ…KfÌ]@È?BmH ƒjÂ>Ã5ÁK$oV!:Nü!`ÿ"Tª0MáÀ68A8Þ·¬Ç+G·òúñ6ºyû;¹{óNòòlo„Ó9ºÈ-pñâE$ª#G˜<r;|øè‡Ì…MçFC¹ÁBOM4ÙM°#%›D|Ã*„LÆj]ô`è…ÀI´…¨(Q‚¡Bä ¦8 oè9‚j‘=Z,Öû6}­»ZYö±éÑ«w·Þ}ºx¨%Û[˜Õ¯W«\©âM6èiÕu m_ÂyJ)\¦DñR%”BLnÇu„…’à²âQɧ¢¨ä¾ØúÙöîÓ»{¿Þ=ÐOZwì0¢__B¿ûÛô²hoV¼dtU«W!ö‹w§v¥Ê¥ -]¬l©’åˆM.Ö³`nW¼lÉöƒ†j¶-;*¨„ïŒJ~S`F¾ûü"æ`›ÞŽãÇ`ÿ€“RGËvñ$9‰±íß—Ÿ?~üØ`r~ûmß¶©YÓµªWêÐÞ,<&bæ¢ù¬»UmXwÖò Óü}œ[Ô«Ú¾qírsƒ Ÿ*æåªn ù½fœRŠ ¨lÑ·Â`§žaõÆÙ™9¹¶< 5ǧ¦kç¡}m¡7«\‘XžzmZwèѽþ`4-@S€7´¼Þ H](*E¥,-V¨HáÅ -W²TåJä«mݦmoë>S`²°´4ÂÒfP§A#{Œ›ÔܺW¹æ W)G>ü#(u¹ õRJ”RJc4ÄeK—Ã>_¤R#³/V„eJéâ0Ò)U¦x©ò%­z[!Ì1oô²î6À¦×Èý­;wØ·7r)eË”ÐbriXà@5Þ:ggW©Úñ'8÷á‡ÿîØ L) v¦ êtOáÐS‰ ¦ÈÅÀ  b_tD0.²£'ŽíÔËÚvô¸Ã&tdo1½³ob‰ÑîÅ›?D¨=xø<Ùæ@ÆÔMKÒV¦n[¿áÝí¸œ€pø˜rØá@82ælضi¼ÃÄ(6 îÕ·ÿƒhtãC6døpšhÄh8!5òe— ö8tЧL¶9®¼(qWÙ´¨ë;` êYEÄ3`èàÆÑ2\jÈHxyF3rì¼KÆLrfÁ1ŽeDdœKtÂäÈøàYËü„$/Jž»rÆüå`çÀ¡Ã!G¤€p´3ââ2íŒèF k6O…,N` ýV½áÀ6VZp@FV^Hô伓ž¾~ rl\ÂßX†»{;´Ú${ÎG}?~\w9¯_Çîc|ôèûƒ’ˆ*KOOo?¿77´Òê&öÂ…ÁìÉÕpÏCa…† ¨ƒF?Ñ=þè†ò &J-Îä¾…bMÚ€ýllzóRàÍH3Þ¬#†µhAB& ½¬Ý«§uÛ~CÁæ„ÓßåF|å6l—B”TºKíâDÇiÜ‘­?_F³®”œêÝ4€‚ø½%ÊøÐ£Û5b$¶}Lî½úï5p„Í€Á6¶}mú@‹ÓÏzØÈNœ+°oìTÜ.°¶{È  ŸÜêÕ¿s¿¾]'DÂ#è8ÙŽ òÝ»ÏÕkTƇigËæõ¼¿ãÃÞÁc°v­jòçfAÙÅÆºµU{_7ë!¶¸_U­RÉ¢µ™)ÉéÚvF@Ük4–s Éí•78¡¸wt•q®Ý†Žï2p„™`y;—úcÚñïdKæõAãõ6mX£A£†•ª×6okik3€ŸN dÝh6Z .M'*ÎÇ¡C êßw MïAý{ ÖcF‚‘¶}‡ îÕo`/ÛþƒÇuäÐd„Oý‰áõB«Œ˜Tвí[µ*víÑ}˜m¿}é +›Öý‡õã ø¬ªtn}ì;x ûAýmy’¾ýú÷Äê¶¿-ÊéÞ|£5†=nAŠçP^º¨ôm=Z¶lÁÊG¼–<==I‹Á«èååÅ+ÇŸ~~~...ì©“êÕ ÷'n?îKyì†ß@X’ìÝ]ɧrº„¯ sŽÌÎ>|¸ §ÉEtXå:²½tw¾¥ob”’°e~Z;x±Ž1ë”Òƒ÷ÒÅv(+q[›¾èë@¸®ƒF¶aßpœOÍI!ÆùUãŒuêÝ¡G·¶#†5l(gâFˆY©\Ùj•*â÷CÕ9ŽçÓ°AáJ2iÚr}²ÊY˜[SªjÅú¦Í+Õ«U¥V­âÅJ[¶íbaÝqWEˆŽ–rŒS>ÏÀ·<üKyÔ5E÷ÖK8xÖ˜0¥þ@¿¶½†Œ%‚½Wûz•Š4lÜ L•ê8³<`ñ }AãÐÒ&B€Ð,O{Ò’Ê„9°ÿ°Þ ÕeàèN$†í;´«­¥M¿£'·° ªèTÔqzi# õ¶y£Vuröê=x€ ²°í`ë~Ãlp‚µÄígÛ«¿žƒûõHŦ7îî= Hgù¢?¡w'Bú—åÀE…e“D‹»ºº’$cóõõ%Ü% M;{^E޼ûÏ^¡uÿãõí§Ÿ0ŒY}@2æ<êL@`žL7pà{ \PhLD@tLè”è˜XòkGøzxxØy¸Ø¹{;yF{yÍà³ w‚Á1°GXúWxIÎ<0º†D»„»{I†0HаäÄ©qq *ÍéÔ± ÓBpyðÈ0fFæÄœDƒƒ"¨Ô›"†GRBC¢HNÖo2ƒoÓSæÌ›»˜}Dø…ËWädòƒ«ŒváS@ÄЈ)ði„GÅEDÇS g‰š’8sÎB ° ÈÍ_´<³Àlò¿ð¤I`[¶:m99Eפ¯H]¿fÝ; –mX‘¶uÁªÕóÖ.NÛ´lÃâÙø/NMÇfþ&ƒ÷ÌÍšˆl4þ}5‚\Lˆ«µê`U¡d…ÚUjW-WµAÍ5*Ö¨Y©fµòÕš7hÞ¨v#“F&劗+_¢|ÙÂ¥«¯T»l­r%+Ô¨Y¯l¥ªÐt™¶l[»r=³ÆæÝÛõ53íuj4Öµó«”PÂ-¨œ«_]ØdPè÷`êê^ß?ª…ïܦ#C,ûŽ&‡•M·¶5+ͤHÉ2E —À<ŽbD_ÖÒlüvqb£Ùó{÷±kÝ{LoÛ#­†·kßnòds·É-½]+8º”ôŠÊá5Ãà<+ŸÇüŠ^3KõŸ˜³V“&&fä<„eÝÕ•*˜ÐÊB0¨ÿ°!ýF é7b¸9pð€A¶dh†æ¥×¤ã4Áº?ýÈžîãaÄ9ŽÂŦ˜W~¼~¼„ÑÑÑÊ@Å@ŽŽ&» o#/'ÔŸþù/£?äÄŸB8ô]~„!‚ ”Z²GQ‰6‰ :L”Eì•ñ_£]Vl&ÁQaÑ‘Qê×Å„‡D††E“ 5hJR`Â;ÿ9휓ÊÍ \ý‘Žß]¸ƒÇà‹7ý"ãfÌ_1JP8M¢îxÅkGD[Šä/%3¸d:•§dô&y)…Š^Ÿš¬ò€Ki='ªžœO9“l/RfÎ`ÒW¹§%W'êG)’@€"‰OᣢHfp*’(ïAl{É0 çÈšUO2“é,Y½hIÆ’`6™º`άe³V­]°rÞ¬eË×x.\_Å-Ö`+tq‰ña;Ÿ‘ÿÕøñŽmiiiŽýRA°Û´mÇæíï(ßõ›È}ßë!¨ù´|Ü”t¢®]}%Eþ”B}]Æ&JÖ¯Û¢ÂÆS7.[™Ž¸ è.KÏX‘‘¹ ÞÞ¼}sÆFè¡—/[³|U˜Ää-_·aÙ† Ò?\üÞȸզÞÓJ9gŸì÷–甼ÞÓŠ8άæ0Ýnæ¶)‹×Ï^4{Þ¼¤ 2³¨“?–<¨ºF/ô=¨²¡&L¶eI|ªe„Q ˆ Ðht„ U^6Nã8jIÖ‹¼$¨F˜#™íu˜ømãäÏD8ž8ëÓ£«äOÜOnܸ±fÍ–ÏØñgΜ¹lÙ2ÎÆQQÂ~2}útt)))ì§NÅex:{Nã8‡ '‰41ðàEN ’'LQ9idNÔt#lÐÒOÖÿ”oñ'4Ÿ0"#  bß"¸˜éO²Ðétˆ’ŽOù"˜Íuä"\ð‘øHRs}CbÂLd8XQ$›H Z˜6lÖy˼yÓ-[`odÚ¶¼iǪ6ëÙG•\rDÐn£‘RάWU³î&½‡5³Tµm×üµšVjÝ©TÓ¶%›˜•ma!•Ûm`Z¼Qk*Ŷ*ZÛ¤t ÓU[P©ØºSþ†-sÖj\©MçbuMk˜t-YÛ¼Z›~9¡¥,;1(Û8_80‹Mp)×»¿™…e«¶æe»Y—2¡Êø°Zƒ½*40ƒk¬IXbKù@Ð7¾üDð(&=m£ä·ëÍBóò{ÙK…ãÍ-Ú7lÚ¶q«F­,«YZ—í3°äðaÅ&Ž*àb—ÓÇÇkð›kðZø¦÷’^óÊŽð/Ù®OÙª Z6%еe³æZ˜6jÞºqó–áÿÄܤYk“ffZ¡Ù[67iÒ´%·SÙÆ%Sþäô'”çáE"’!.*àʃ¤¤¤iÓ¦%&&ÊHEþdÿÙgŸñ>¿"Ôo®¿ü[?ñÉŠt”b~.Ja3Á"y½±‚`¥Ã|"ÙL¨È þAþhLÂý"ÉVæ€5Ë5(Ú1z¦•[L•1Å<ã OŠÞô!ð†R)fÆ‚I.\/,€ çüðàŒyÌ_lÁáÌqÊ;¯}’“‘±L èzÁõ\ " )…«±WäaZ…Âq˜’HE/úÉTH† åCˆ¦ÀiãŒIJN‰Šy•Uam\³0¤§HÚœ(úŸú¼'ââR¢#S“çGϘQKì´È„ĨèȘ°i‹ÆÌ[WÈ.¬Hð¼^ÉÎ[¿…ˆrÿñ“‘aÌÝrñ— —žHVb>…Å:GÁ{ãyêrj³&æùíRø“ƒˆ¶èo‘㨘1+vÚôØää„Ädº 62.>šÔÛ‰1 )S¦Ï K™ë•4Ý>~Ƹą#cVö\ÜÌeFy‡ø|.QÙ½c ‰9ÃæätK)é”Ü{ʇ¸™ÑAÓ’ÃÆiü¬EZ›pI)ô Ÿr„Žã ÁyIÞ1ኇ&öüÉ«¥’WhÇ%“_Pp``02ºðX\²ddæÿ= ÷'#¨NG©Ó.ó{˜€:t’7nüàƒ8§çÏŸ?zô(éæÍ›ì-Y²„¼7£«åȬY³|ZD$!$Äô%Ò˜j?ºéÂKx‘Éä_d¯¯îå Ja¨I{hÕXàSGzã4êt _¤‚Ê™’Þ A”ZÔ1Y›p!•^d–1T0›ß²ht°Ëø]Û¶mÛºu+ÌÔóçÏgÆ„ù…}r2‹ÜéI±É)³ÇDÎMˆž>5>2%ÅuæüÁ³WïW5rQ‘€ÙoŒ*09¢Nð´2NÁÅBÊûÅp,æ^Ò#ª”gt®ñÞR)ëËÁBŽÁ|ZÎ7®b@be¿„ “«8F—p.ãUÒ7&¯“_'ÿ¢ŽÅíjø$µ /à—ÓkªÁv¶”4CÐÔÚ¡ñV¾A.>~è/†„„wŒiäoâå”èêìªÝd¨(úcÞTÀ/œÁ àOV0HHÒM´${–vi[:S³íÀQÝOh=©Þ8·J$Õt÷+êïŸ78ô°XCÈTCÈbCØCȪ\>óK8Å4ïÓuà¸Ñ#ÇÑ_˜Öê;d8vzD:gðÀÃÁ0t÷lKAnÿ¡@Ï“ˆà.Áò0¢M•· Q†—·nÅŠ‹/ædmNŠôà7ß|#®ÂÖöS‡K=á½HrÖ6ý¨tîÖgñnÖ}`µ`•Φÿ >êÚ£Á¿¸’s²•mo+›žÝ{÷€‹ ¯u÷A½z±î×£sïvÝYŒóhîUÕ'®¢ÿôš®1žÇGºÝþÃÆŒ;±_8ª‡ `â±Þ§7–c œÄËLéf݋ԾâzGÁmA/ÂÀ§ý¸ø¤°Ç`ÍÞº§ úç¬ß•¯àr"…WH/ªß_#6ù`ñ3$‚‚=ΖüIËd-˜¤èõ#ÊRÐwH¿Xz‡wÜÇjxÏ~ƒÈˆÖ£‡íˆö£<+;D{vO¨â•ð…ÑxÙh$È´/† ÿaÁMqàÐìñ×§` Ž3!?ë;>ŠüL~¸^”×É‘Y8~éݧ^¶Ö}ôëç0뾤ߠÍ{6föû^»v·íÐk@û~C[VwÀ°šžå‚JOŒ)>>¡ÈÄigæõŸ™;b¶Á/Á4Íà‘DìGc·È–CÇ¶îØª‡UkŒÓ’ÂE)E´þÒ» Ï E¢Ú¡ay…h+^-Þ·î½l¨ðÊñ¾A¡Âž7sÞ´NV=HÒ‚m«˜üX€¯fù‹j)u#Üu¬˜Å÷„½œ&NÀÜÉ“'Á<æ‘Õ«WËž?ÓÓÓÁbÆcÔ¨QLCh™d2RY¼4-“T8ø£[VmaÖº(-áä‹T¸¸(¯äSô“Ê-BóOáO>bN$ºËÑÑ‘äÇ`ÔDµó'°Èក©FŽ 5:.‚9sæ09®]»–ß²}ûv¬’0ú,\¸D7ËBŒUXBĔĤÀ¤0?<°â§ØOO0wYI·ÐìnQÿ©ùb|rù'\ >‰ÙÃç¼âsDÌ5ø&e ›mðŒS{ï„7BfòÑ›¡³øŠ!`眢ˆ¨+4/›G§eœefð’'rVî éרlÞ)oøÍ1ÌUÅ{º!pz©É¾}üC'û`F áÔÅ'´ª½#‡{ßĉãœGMeç2Ö¦/óP/’7ŽÓ¡ƒ¢ÎáxÅê&N74éÈ‘#ÙËÂBÔ†}‡Ž²šàÚf’C‡°*NÅÝ¢òxEæô‹2Æ"R Á”…†¨U†¥¯i<ãšøD[·1bC‹(¸~ý{Üoà¦C[:_£}Ia*8ßè¼[D¥,8'/Œh,©Ë³QçÙ€^y‘¨ …°(ÒÖ¯_ÏžMiŸÖ¬IÕ6Ö%ûöíûp –E8´ ¸Ó0•(ÜêeчðYP€4ŽK…ƒ-Û˜wèl5pð0ÈvðÀ^ÃX·µi±Íà~6ÃûÃëo3ºï·æãÜŠ:yåœì´Oû ¨Ç‰øY¿í=›~ƒ=¬{÷è õÐþ pp¤bI¡¬8c©¿áéžuâþÙºd9fb¥7™d1ãªÎŸ €00æž„U kÓŸ˜IˆÌ«BùçØƒñY‹@`óÃÂjit¿ñû ·Ô£ûhkÛþݱÂ÷íV½¿Ke¿YeB”tˆ<7 «ÁþK×àáE#y, ˆ-=z÷¥S0”‚<€Z…ô¢Á3¡Z`›ŸÏïï|ý÷~ßhü¢Ãl é=p°Íࡨ%‹-ÞVû ²µÆkkHŸ£»g9r|Û±vÝJú…½å—Ãcú[nór¹-Îé¾Ðà9Ãà™hatO5x%õO©2)ÀÜÎyÀèÁöhð>úíôF¦³ÂpÖ¾ ay†AÃFêü:› Ø&ï?™Ÿ)oŸ’k“…¯Øã1Ì3¯"½0Ž~ÏPúÓd8:k®0 <ÓÑN>aŽŠ`ÚË'N Ò1ï#ß°g*á˜Y¨ h,‘~ôk±èHœµRþÔÆ9²é'ɤ|Wÿ:G¸&ׯD˜ãˆ˜Üd¥Ï§ÌŒ x†ô†† 'bœÁ/†ƒsÀD€£Ê.@Ù”“ŸÃà!Ãñ»âãã9Ú¤¨Ð˜Ø˜DìöAþqA^¡>¾1¡öSãǯ\]`âä7ý ÞQ†dƒWÔñ¹Âg¼0Ýà;ƒò†ÿ,ƒG²Áof¶À9êˆwŠ*>Ó .ñÀ•\a ó‡.zËez>·¼ñ×xž` Ÿ_RŽ™Ù|’sûN/4ÿ-o¾>÷Ͱ¥ÈO9|SªÙûLž:Ë) ßùaNnCB¦Ôq jê1Ü1ÊÅ9x$îΓGvïѹW÷®æf*•³ÊJ ×pgÅ ÞƒFÛ°Drü㈬ZtµÆƒ¦¼CT ǸB®É¹=¦f÷™ö†Š!p†ßå?SmÐ\ƒÿtƒw\.ïÈ*Áu{ôïÑwQVˆ6}z°íeÓ«[_¢Â{ô„Ù¡[O&wB•¡oîÖËŠBßJKS‘w€þ•À|Ab=rœ?A>ºÎb!ÂÛ¸eËX¼‡¼„¼–;vìøä“OP§³ û«i)A¸‘£Há×è0‚¢' O€a£F>bÔ¡Ãq]˜JeÀÀÁÁ áëo¾;{úÌÉs§\9yðêÉSOž?wò™ӗOœ»ºï•÷\5º®{·RòÔ·Â*9GÌúì<&¡£¼ÂP=uùâ•W®^>áòÙ³OŸ>úå칓”SçOž¾pêÌųgΞ?›¥œ;wAÊ… —~´?~òôé³gΜ;uêÌÉ“§ÙKåüù‹zÑ/’õ:/^–réÒŠ|—ëèwW×<ÍÏ='…zÖÂsþ°œ;sñÆ©›çO]Øyiÿþ‡ŽÛwæüµO/Ç®ø"›}L>÷äòcýS_¢Mç¿Ù³‹'=áÒ–sç/ž=wr'¼|•rñÒêüù]TxT’ŸÏ“ËAšHÿ]Ô¹òÉsO\¸tüüÅc§Ï;ušŸÀC^8yáØþãgŽ]¸råÞ©+w×±ËyÚl g÷ʎΆÀ CX¼!x®!xEöàô·‚Öæ XœÃo¶!`†Á/Åà•R"pn¸¨ì:zœî»x^uþ<òHÒŒò¨Y{?Oœ<}ôØ Œ&=xè¿èØñ“kRÓx YÜ«>løHVQêìYA"0‡³²d.EA‚÷{ÆÑŸ†pâ)â'?@é®Å&' 'Ú0üC¥Iã„rMÛÈHÀÁK—.áŠrù2¯¯Úä#¼Täñ@ã•+Wø“Š|úÃ+p¦l|ÊŸì©s 6¾Ë€–+È-¸>×äIx$*?wî{NãO‰?‘8ñŽa²C¹ŠŒ¾1ÑèW¶ùSÎ¥“(·ã:dâv¨gùˆÓÔ•Žœ:yììŧ/?zñȾÓGö>u軋§×Ÿ<ÞÀŵ¦OÞ…Ý˸Gås*å9¥œWRþ‰!å=“ŠLŽ,å[Ü9¦FÐìBöáeÜâ©WðJ.á2¥’Ï4>EËWdBhÅISÊOŒ®å7³¢wR>û¢Ñ%¼c ;…³ªäSÖ!¼‚cLiǘ"ö‘%=’KO níè·a÷¾çÎ;sæÄ¥+<ß-af¥Q.«Þ9xääÝoOžÜ}æÐûΜ<òÝ7;Ož8ËO AØh™—6æ~/ BÓñÂпÐzÊ8ÆwI*è‘’Ë{V6$Hloþ‘s ¡ ! þ3Aß ™–; ¡ød¿Œƒg_¼uñÖýË×oܼqíöµK×.ž½~éüõ«×®^»qéú-UnܸtãÊå—®^¿týºêw:Nßä  èePŠ ½@ŸRá8ýBðòFQ‘Îb/§ñVüãÁï×mþ” 7zÌ8& ÷qÀLÍ)C‡l@]¯Þ6ýúò4B…Môê3%ŽðÓó§Ïœ8{rß•ãû¯?}õÔ¥‹g.;{ùøÅ»Çï\<ñø‹sO¬¦-2øù|ýë»Eí¼id<_¹ÂÀ¹yêÄI&éã‡\¿x‘ È]+Ïž·Ïä}!iÒ“‡Æ§÷Ï8ð„™…ÈA∠@ðŠÇ6R¤òKöŒFÖ›*\ó8n“*üÉEÐAIáýâœO(+­óàáS¼ Â?þªŽ½OøÂw°Ç@ñÅþÞÃƧ÷àYyú? ó#?=«Osí=sÙoÍ;5&•Prrt¥ðEoùÌ0-4-2D­4xM7„Ì7¢}MÉé7=»GRyÏ„¨-Ÿñ<Üô¾°‘?b|öøé<ã/’¦dÿTýÉÓh1Jÿ¦-³U¤m~®¨†!ñÙMããëÆ‡Ô«÷X5ÍF6©ûƯËLöÎbðñ²_õö¥çªmÿ纜¬Ê3ãs­¨ÏUáħÆÇOU寵ýl›d=Aý4Þ§ûnïÒ>´ïžÏ–½Å&'æ$†yf¿~å±zÙ?¹C3>~®^Â_U~Uëpe¦ˆÌ&Öêjã!_eFÄ Çôoî> Ù°¥‹{e¿À·\ öaù£×ü–<•N\opš¢,˜-‚fܧ–v›Ú>`6ßB:ÿµýõ«~쯽ø/iœ,ÂIÒpÝÚÏBà—¬©³WÐõ¨Èš‚7rÁŸÏà4®_ÒÄþ’ïJ·Éô.”;ò,a¶ÎœG@ @îÉ}µ¦Þ>õŠë¯9cO&ð_õ–iS’¨ B5T)O›³2OcÀPxPNxþø 7gßúžÃ‚œ}dðxÚ§JIsÿÕ' %½&¿šúÕ@ëožì;e:µÄÿ>Ó cÂóNÉ0xÍ7„,38'ŸGb£ðÙ__{ªýÂ'ÏŸ¨QK»üò‹Ë™¿j“¡/pÆ>óë2Z¢zf¼óT-…UŽ:Íãzú'ß ›±²1ºÑ‘†IÉÙü5>„ëòÞ=T÷¢Ÿp~0·RûLýùεk&®þm&„~A%ø$bÆ;üþä¨ÍºþÐ[˜z׈\øŒ¥ñI£qÇÍ'>ïî©è5;ç¤ÃøäÒQ ø-Êç3ï-ïù9ƒW¼Wåñ_UË1üó›‘2UpG¦ez„yF[>ë§Í­ÿF„û%oÝ÷ç¼è²»ÆÇ·”Œ‚`¬!Üã£ÇJUÐÂ+>ï$Ï!Á âh!_Ú¬ªÖ™+ ¬—9gÓ”LœûuÏóÎþUS쯾þ3ãCÆÝ“{Ï¡®6–º’o”wQÏ„Â!î[¿8§-Uƒ<ÓšîWÈÏœËD8éÁ½gÆO—Ÿ/jO˰â¡.ž~ºéГñéû ¹Í,µÜà“3,Ùàš=n†!r¦Á1âÉSš…/I|çè‰;/fž_ÝPÚþ±G‹¾ä®ý³.§bœ~ˆaÕU“ùS=¦W ‡¯_ñH:Fò+¸T¦p©ÍÑ"Q©M½Ë,!k`£ÉIk°Þ2§3 Ô;­MH Ü/ÛËâZSâeÎA/–Û¢R2±»Ÿ1p@8†úáO?}þϱnaqÆ…¬;ŒjˈvæžñÖã­ç á²./„ÈF“ QdÝyd¼vÇxÏ9£ñÛgÆW•œç6™²¥œ×¢*>ós‹Ì嘘7‘¹Ì`?£äX¿èmŸ0ù²RŒäC—nÎmç[.(±¦kèÆ³·U¶õ ^ž?cìþ¿üÞÿÕÚd éY€0B¥7ÕèÀlq“¡‹šå–êÍ­w…]’ ÍyÃ-"_dvÏ€l>!0ä¹®±Eí"zǬà+ß«•þðž{=7ø'#œŽX¯–½tz0ÎÓà̰ 7&›ÒϺ®ê^3ò-2õ@€ÜzEêF8]#Š ˆ CæWôq«-Ο=0>¾g|x×xÿ¶ñ>“Ñ=ããšN_Í ¸üì^GPuæ‹»(ðÊ¢ß×u ò9xˆˆ§]ýþ³ç÷™é¯®;!<éÓ‹J†{Îø¹ñÀx¦L—¯XèmBß©yzÿ‰ñêƒgد>1Þ½ðä1FÁøOΖUeâÔ\=]F-y¯uÈÌÊÎQEݳû.)´´–w|À­oÝ}¤Á4÷HC85ÇP2ñ—¢ŒCÿm?Ñ‚p,y”¢@!b=²lÀ ;hFjAÇÀâ~áµ½ƒ6\¼Î,yç.’ŠZi:aÕ°ª·5å¹ì3¥8u·šî?ºíÿX„ãÝG?Ák¦téžWóOÈçRÊ;hÈŒ,³xùùÍXøÑ ¼}ôŠJĵÆíæ/Ú™•î:gÐt«¢äàCì„·Åš×¶}ù]c ¦Ê®Oê‹©óëFr ¨1³rجҎµ'uOûÖßjû'#¡ûá8½„=Y{J>på‡i겑Ó^q4&g=B¤&³^ígíyBW&›†¬¼žh<(™æ ÞÔÂê®ñÙmãì%h“nß5bö25ò‚s?[˜™t«›‚7Qnhê{µZÍâ©ñ½¢_!È3L]Ö±4¼´Ìüì»JcCÆ/ù„:gÞ6Þ¹g¼¡ù¼jû’È«d8Iè)¯=‚eí>ºG(7kŒªç>³çÌ®S–4ß¿õ0êOúL[\ÕsjQ»¨Òã¼* ›øÙ§¬0Œ1=ƒph7áÔ°§yhÊ÷Š ‹~M€zçrj‘ÂÏ_Ü6Vw -WÈ3È&i.K å…òU¶ˆþJ¸×WT/¡L–þñË‹?áø¥Œ7”Vã®ñÁ3£ÝÚÏ ¸G¼áæYÚÓcé7»”p§ÁÉý'JˆSðÆ:áã¤Å_hJ´ª,84-N¦ ãÉã»÷ïܺýࡦp¾§”ËûŒÆRÁ¥"çäõ‰¯2õýçÊ(°õôí±ó×Õr Í9pR‘±îõÝCW:ýÛ)ÿ$\ü'#œh…dúYŽ PGUB¶ñ×AEÇH/¢ àm‚®â•éòÂS.¥{©» ›å·ß~+JÈW<×!ŽÛ''s‘kW/+ÁL• §ˆ&ŒVhš ¤ ¬ïWs™!]5ôSƃ6´MÓäe^šiN†8³d]Œ3€=V#˜óUV绨=Þ»r·ìø`‹Ðe§n+Ï—›ÆÛwA8¾ùÓ÷ãJ]4œç¯©o=}vûÉc”$[î‹Ù‡dXÔ%ÌaÇG»Ïi ÷öþ áéŸ4v ­6Á58cûiÔ“ü Õ:4Yí‡ëåOÌáö'ù_q[A8mùÂòDG8Ô]᛾*aï_84>¿‹ßœ/ÓþÚkƒ¾.SË-k Ùë%‹ ÷?ݯx¤_{ê‰p´É}ã µp»gDcÃ[¾$uO¹q¥ƒã‹ù{»¾¿•uÞý»÷xïhÄ$»’9œþ`„Óµ¿ß«…e­ªYë)¸Æ€¾êÉž=|ô- ©B*ÆFçOH0GäwôÛõXÅঠös-Xè;3;¿ýŸ–òÿ—ÙMÉ4À Ñê!q/ ²”È^úqAÑFê†7XE@,É`'b$w6×I#\QR•=¬Ê„rëÎ#‚v!{QŸêêJùShä»0“ý/âJ\v*uñê9•¢ßxýæÌ†yn|pïJ}ÑßúŸ¯|oüÿÑÅïË-¯AB ™ÝXÂ3ŠÔ¨hâUË%nÝÁ{ ¡«ÆÇÊÑœq…ÎPÃÈ_¸q®R´"20äžß{l¬œÇ-¾œ{ÊÈØ4”–7O.Ï=0^}ÌpTaGÊN Ñ ™~}™¿"Sž} ›5¿ö_ø,ÿÒÓ2E\ÕJ¨Œ±ï*1dÇþ[5 jvŒ):ñý-W™8ïªö…ߛܲ¾Dÿ-¨/a©È(“¥¼œÔÿŒÊ‡Yzœ7•1®ÕoÝP#Q½¾/Ȳõy@·G¼d˜á¯ÝmÕ Ü©ûDߪC'Ôuqkêåþñ)¯ýmoXö=P~(L.7ß¾ûüþ}•5󩨰öýY¸_ÓnfÚº- ÔiúìÁc¼¾€Z<´¨çjaÍÞ½dT¼ÁÝ©Hxˆõìjásdå&¦~ŠjUZ"µpù{mÿXN#Aä½ f QŽñg¦óÞ ¶0ŽèW`¨ˆ-œ)o¼ñ˜|Ä×ÙC8ÉõÅûŸHñR!+äôR‡Ÿ—8 zø¹¼%YŸGŽR2>áÈØ¼y39€ÐUÊGr;‰‰ÖA÷‡q~à¨î—ø³N1¿ûe¥YÄuSIx¨?Ä1o¿°¶{ìüo.á’@ÓàŒ¢Žöÿ52“Zÿj¢€B­§ÆÈ¯öñ‰Ì99º‚]ìҭǘµð¯¹m¼rÏxMiAEàû±~w§f½€¦Ïzªˆ áðfR½é4kSùIIEa»ððZpåøµÚ§ÿäð¬nÌuð”ÈAž?«³®|Ê8‚7‡±™Š£E1|ôO%^HìalrÁ¬ƒŽ&1aÁíGÆýWùÌ]fÜxìhçs¨,òh»7îh Íg/_x  T„n7«>釶ÿßÚ‡Ø#Ä’®!œ®±ÔdëÏñÛRE F†ÊÖÆcOŒVc˜ìeð÷)è½øøqbŠ1A;åE†š ôGÊ ¿õg¿â{ÿp„ã5"… Y¿Y(ÁnÌÛ •' P8øÕW_Ñ.pZr –H^_’¹ÀøÉϵ.ÇÉ¥{$_9tèÌÎAÓˆ$‡ˆF*;!’3 b'¢ ¥Yuƒgh`¡$&üOÐFs¯¼yóV©R…u ÉlÙ²ÁÂ,'ÊwÉMPS/^œ?IDÀÃðœÎü o#«Q‡ÐRÿxl“÷á´ã „{Æ<èœöA]¸ÈÍè)ž.¿ᘜP‹)ùð¶t–Ésóy„æ± mé3ûØ5僟P„Æ[·_ËÒÿ!Ükž&`-@S ;Ê޹ɤˆ²“KºÄ™F'~§ÜV êÐV9ê ƒì"Œ2°3ÞÇŽKÂdZB1iÛKÒG#b€]O>Õ ¢_ÉzDÿH´c ú†!{LèTÖlঋ.\œ²iÃŽ3'Œ8rBJÚä¡"Ô$à'—î^½{?SÏÇŒÄM_÷8ý_„©Zljá_}5äUÌç<ÊÛçMý}sûû·LJ8Êó¾ˆ9âáź¯ )A¸¿_tÍ?áäå"a/1/:ØÆÛ/€Äfooh1ÈYÃë …?çƒ|d£B&[ÎáS}èðvN¿Ò›Œ62ÒñÆëëDXƒ0F.”<ƒ!\‹"Ïq_øšáðåF¨"¼wß}—ã'û·Þz ®·„cüã ‚”ì¡´'Ç&Îá"¤‡È8«j…ñóêh„×4 Âin/ʈ7‡òÝ`äÄ}~¸¶sôäy[Xôj¡i¸u°Ìÿµv/b˜[Õˆüàô2.Eý§àiâ‘ö…Ò@•õX< ïß{xK Ä–Â×ôëþõ—QJFe³D2À—òÎÓ'h?¦{¢â¤ð2Î ¥ìBâ>ÛƒÓ¹ëD<ó`qú“V¬í ¿Fç!„±,Ú•2@&Æ£ž~±Ï™$‚Ð{š^2ðѵ0Nå49 f{#gBXò«Oo?T†ƒo;ûKZ\Šj ‘kŸÈ5Ù§h`lu—°M'™/”|§\÷˜Mž<|òTy©=DÿÛ^c ¨9šð7˜©î<0Þ¿õô91^–—†ÈÛ>¢û”#´Éƒ¨‚Yÿoÿ+.ÅjrÕªU “÷ߟ¯a2§N‚IH´‚:JÉ`aÉäÀŸXD-Éq±é’u‰ºÌ-|šÍðæ¼ÄÙJ“®¡ÊñÛ·.(O¥´¥n^F¸E0Ô”} eŸ}½ët?8¬ èo€ 'œ /N~ð·R²#4 p3(« pÇþÄcc‹À†‘Á¥üjø„}pGQ4hÚ~eìÇ®áM£OÒ9Eÿf*Jý.Ãñ’ ™·ŠŸJŠQQ6R?~<²¼g‰djà…#ë4 Ç·Ú´iCšy•‘öD d…Èú‹3Éò€’¬B4̪åçÈz Fòu0½"_'“u |ÂW…‹€mäúáÙá8‡„,2rÿ@8|L8ˆür ’Z$Ø”ƒœIb<êD8ðéwß}'ó„®ë¶Ã_1Iü–SÅö¥ '5µ1j”HÇ`Ê8÷ Ú¸€î±Ì‰Ê&ñ³5Ь_¹ÆW3¬r€ÜùÔh‘’Ã5-¥Uìì#š4¨û5¨3ÔÝ?|ÄÜò÷„¿¥áÿ¾C«Òeï?~r 7æîî ؇ …]À¸둤Ñ|]~ô\nàú¶?i#o0ÃÛ>f‰¤ª  K@}!ËàÛ9Iš’““ÑŽ0IøÇÀ”o×®¶ *7f$ X’å‘#\ð‹/¾ ›’¬t³Þˆpd¥µtÁ²æ¦mZv¶|ç7W?˜»|äúù³çpt›0pX‰<fÄ'²D®yQ#!Æq5Ñ|¾VS|âßÓƒiÒ› œÒ”>òLi›ýĽWï:]db8Y~ ÚŽ]¹Tᙢñí‹vÍ»íÿƒƒæu¿<ÿX„“%šd2^)¤1Åxã9Žà˜QA<"¾¤©€¹¾0ÂÉq fœ,jC4“ D+ rü‰âèÂëD†n“‚â¨)›ä€È“'hK] ¦hBHóÆd8 õcDDDPH¢«D )·ãˆ`˜,0:I'ºà™d cxð£ä+d§Ó_Œ¬XûR–ƒ×ýòp=ÍížW?“·B”õŠeöÃ{Æã›Œó;®©°Rª÷ë|)n¡U1“vž(ì–Ó':£oÜ_ßP]«é.e óŠh™Z¨þ?óßzIA85%ÞB`fôyggv§Ø\>ÓªzD¬Ù^ÅA¯9Œ{4/Z¥ÐûS6† ã”áÀXf¼ð'cTØÈe$bÉÆ8Ç<À èTôΜ &v‘á­5kÖ¤baaÁXÓM¨X0ÕË¥dËŸ;Ï‚øiçöΓ=gž|y ÜüÊÃ78 ­Pª îÔÀ[.Ã|BØO‡Ž–|‹gÖ¯7ÑïÌó¿M­“íië<ÑÛ‹£Nu•F„áÉï_Ý‘`ZÅB¤X[$büˆ½U î¿æÿûê@½%qTwPX}rÏØ hzn¿¹½“Ì#SŽŠk‰f³aÍóÑù'Ækšñçl]ãááÁ3¨°(dµJ]ìÖh‘ÀHl‹Õœƒ2NY³úûû3ïXªò)*>mذ!Ÿb>gÒ`ô‘©øã?æ©nùô믿·BÃÉÈ ®¥¥¥òŠ¿óù‡†ÜÙçD‚…|Ú¿·Íƒë·6f¨¥ê»~ðÙW_ŠNÂôà¥Ws$ýšÖTË=SFgò¿LS®ï?`x°âDíÿõÕ'u'øær)à7µ[üJ¦E€ìé D½ûŸ^ xˆ`½S$5‚p2ÆÕðý5OþGûE¸W4˜DèŽÂ?©‹>Yß6©ófó‚âµ(Y¯6né/îKÅAõc×Gé¾úpN§£|ÅùY-çð•Õä YÛA>«÷»_+A8¢”!L[ïãÁ¯rsÔîUŒ÷7wìd"ñ5?=Dô†å ùEêGqúcãÛÆ’®!¹‚âsy„^÷Nf¼=±oO+ó¬º=ëÓÿîwwéÿ\àÙXN•Ÿäô¿3+è™?hNnLj©ß:Œ\G³ƒpHÎJHÇ©õŠæ‰þçlx]!¡,!s¦è9X#JX*rÔ’ ™:fŒˆ¬A÷ï߀OwïÞÍqÖ¾lü1ÒSù”%rV†>ú½JrLÔ;›ÖfkÓWßzxë³]_râg&ž¾p&Ç[ÙY³2è:hÈžmEFú×»w¿‘íM–¼Ò@ºÊçõµ—(42.äááž² NV)ŒmXǃÓ>¨2ηp@²a¨Ó²cw¯ˆÁá–Ò7ãÂÂáx©õæ÷—i x}ûÿp¥#©År/E¥àî/Þö¼Ðy¢ñ`CnC_ñiüä²b‡Ã"(]þŠ{âýÌiˆneË–%ª? ùÂ÷˜Ø^§ê_‹oËLw  G%7@W…‹]Kû°†ã|?¼ ³‘¸ä½XTþØ{-^ÝY?QG´ùsú{ûò:æ Œ)î–¸óè mnи]4õ¶tî«E†ÿ'ýÆyCfLE/€‹ààÕÛòzÅ&GVöŽûèÆCåÈçL‰ù…†p×4îÑ?acÈ`Ï!ì 8ÇÚÑÔÔ«ËSy&Þ|Ä5Ô6`¡Ø¨ Ïñ]±ÈxG[ÃɘðÅÁ·ø z9œ/Ú¶üùó&%ÆîüîËÿ,œDJ”(QµjUÖ‘ vNdœ‰Bb^ÿZ¥Îº—i)hGð:}¦È œwÞy..>_±ñÑXªv|ðv ³@Úœ¥ Š•/åìwöÚeP-46šVÚþÑûoæÍ•ºiã§_3×[ÓfÅ6^x±/¼¦-á¾W* ÂiD”ø™p§c˜K¾9^h€SU¯¸¢Ž~¾}§|Ie9I,•œä&ð¦8ewøÞ÷Ÿ–ò5õÑQ‚eUâr:g œÄ¬HUy¢×§.ÿþêºÄ¬où«¡¨øõ'‘Ÿ5žæ‡ÂœÜLB\_ÿOÐŽ…¡Òç">A³qE?j»™M—î9¦0 1à•”]ºzV§Ccl°éøãÊv1½£s9zymø€ÉF3êi.(/ð,Ó (_;CÁÿ¶ÿŽ;(„»úð!xóÑœ ûÅ—²óZ~ø‹¥ú’}ÿ˜ˆ9È=XßüÉ2´>"™Du¡[åå >ður>Æ»,.yýtø‘“Ù„NH¿ˆ>-ðÓÏ]ÆúøìÁ³GwIýìÞãûw)[×5þ¯5Ì,˜¾A&·*ôz™+0îÂM4åoï/ÕßR¦í@ÆÅÓgOp‰ÕÂõ¾}j´™¾ªàX¿J¾‰u½Ã·ßPy•U¿Ýgɨøµ(…¿Šã?L5{¨~þÏ—ò·÷Ìÿë7ySuÙˆš·\G^ý—ÒsëOÆGœ¦‹€?%cýÔñWØÕ\¹˜Ê{/óS2"É ¢€´DíˆÔÈÝ…Hè„™S¿¾`ák9Ͳ†¦Ji9² œò»[þ7ç«}ß#ÜÏõ³Þ™IÀäòÏ ÛÅ ˆ/åì½ã,Ê5Ú`D×<»”Ð&nÍÂü·T£ü\›ü©Ÿ+ãÌÕçω°1]YØ=¡€Cp‡àØØkžâ{þ²WÍþª‚:F’îÏz`ÆBV¾¬Y—âí,‹BF‡è êd(ÉG: fu"ãÎÔU gÎUV¯.²&¾zõº¸Ò8WoßÔOÛä‹YAT¹¯§Ñįä…ߣÜ:Óá„{ô”ÉÀ\rðb-÷èb^‰ùíƒÆ-N…Š)3öF@#1ÈpÚ÷D'¢Áœ&¯Ëõþ´þýmMô¯³Ãe%ûy•_òÙå½.Òßp‚>Zäd¡¹ûÑí·uß’[È#½ú"úpý%'Ë¥²¢ší~ós¾üEÍÉ !7áß…øS6Ã&hõG&ùÏúj¯†p¸¡¼ÊÍD.«#œÌ2ï<¯ë>;×äiÅ|c,“f¨µ¦CPäcP ÃIÀñe R‹TýÛ À×ÖÌ…T›2ë/½jÌ3iJÙ€yEÇúz¯LãùuYÔ+ßYì§Tˆ ".\›^ÿ”íGÕbqÐ㸕V@›8˜u¼eéV/š¦Õç²209_'"Ñç ~+D´·<¸u[[•jއÒ$MTÂí³§7îÜV€‡÷{F€p@kÔŸáµäá´;hDy0Ëæ¢DÆQkÌ‚ô2Îáo¹ÇçsZ}蔞d·{¬béˆû¸l|6 —ZÀºÆÝõ½ÖäOéâßvÓÂI3‰èÆ^ä꺈ð£ŽrPV|¼ô?…p¿Ö>§L=Eª<ÞOÉ||Ä“oqŽ@—<³ˆn¢€ÕEI}ÜŠÅñub›4¥– î‡‡Z'pÅu'øÌûî f9ÓÒŽþÜKª«(åÄ…ï~QbR²Áizqߘ¨¯v©}¨æã¥M²wžoÜR`ó/ýÍ–˜?×"òçô™ ƒ³Yû‰Á!¡„çÌF ;ަåµÔšš‚úɃû* D¹šü¹+ ,p"œñeM"ï¼¼ZbA—FE-ÉpFç¡‹´|”ÅëKÃDF™ð?pLþTúrQïA¢©“Íž|ß×I?LV§LrË›×oH\ÙÓ;÷Ÿ*M¡Úd -õ×6*ExÌ‚pÚ*P{2ù Fã{g¯5óˆ(ícpŽ6»Ž`MϬ1?pÓøð*!"° A¥²°jÆoÕ»Øßjû×!œ ‚n¸Ú¹s' D¡AAB¸7nÄDÃèÆŸ;vÄÇD*„TãNÉž3åè²~tã+?º…ó£\*ÂFæU.N€*þ#ì9þ£7íׯ/uéÒ…ÓúöíËcKpb?‡–.ȆkòáÃê5fÓGÔëTTj2œ–YƒÑEL·Zõñ'2œïòmÕ'ºÍÞwDE 0:t¯ è´Á˜9Q*ï/¡;Ñv·©Œ$7ŒÆÑ ³ËyÏÌæ”TÙ'æc¼XøŒËkž{"Ã!ÀpZq-GÝ÷ó³Ï‹Eþÿv‡Ö#™™r39á™qï}c!ß8CÐô|“#û$,V³»–hFæ÷»Ï°Ü0mk]„ø³«˜ŸÂßr†>¢u¥¢ˆ\rœ7?«'ë?õV>~,¥8aÂ1¤#|Ê¢S¿ìW½j&yü”VP²«à ”¢Ù“6fý…üÇÑÒê=&Ï€fÎÒ‰.¹Åk Ýyá6©<3Í£â $ŠJ‘6jËg&wËåé¿ó¸rñŸT±¨_P‡<¹©ˆÇ4 ƒPs’.«åû·ôПôÂÑÙ)CÍ;ý±‹‹’@,',åFŒ5f̸±cÇ>rÈèJFðoØ0j/—¡Cg-ú ‚.ª ÒØ‚F[[ ©·^úôéÕ»·u¯^=­­{HéÙŒéºtî žv°´„5³…a9fmÚ´255iÑ×å&M›6nÒ¤Q“¦ 5jа!^·^½:uêÔ¢TªT}µjÕJ—.]¾|y¸˜ÉûŠ4\´îÈÛ%Ñ/9åÿþO-3Ç‚6²µè4f·åé¥ì&$>„ÒRŸ¸ks¦à"tŽÃÌ%š² eí#Ìô,}YNp÷am'r^‘|ã†.^·KÔ?<Ò51Ž!‡W Þ /«‹HN¬?i†ýýÍøÿr¥‰Êœƒi+=ÐBãž'Ý3©<?Ó‚.4Ÿø?ß=X0"Þàï_ÀÃ3áÓo¿¼v(+µºW@¨ºþoÄê$ŠAˆ oâ»Eƒ’uå÷’I˜O³ÒTŠâG~ºÊâô@£2ЊJ÷;ÝX_‹-Z9Œˆ–9P4!ööÓ',uk;„•tžZÄ9®’£ßçÏ”ö%³û”˘•ßåN‹dø½ô{ú?âÂÿ6„SjŒ*’GY¨{x¸Ô‰ Dvo„§Aƒ† ü 0)hð Ø•Gòoøð¡¯.YñoÈA”Áƒ¡4@ ŽÒ·/–*à\V„ëÖ­+lëÚµs—.$ÏASðÖ¶m3³ÖÀ[«V< Tb™W¿AmJ½úµêÔ­Q»vÍZµjÔ¬Y½Fj•+W¬Zµ2ÀƆc4™Íñ†¦·æmÛ¶‰ƒŒh`^ûk$€ð4T3jé«©ïA8÷ÕiÜãŽÀ93»¶(²4ê.–µZ:MVÚœ«ä?5eûÖä¹ÇO ¢œ·ûtÉqaåüµq\³1¥©ÿÉÛ¿áxQ?Qéš°Ä!Ãp„¼ ½!d¡Ó=­ñˆq”Ñ£Æ5ußnœ .²ñ)ƒ„ Ý ¾¡*dC«‰ÚP”¢ºDXdy m'šFÀL [;pí°µnm ¶!½™˜4Ï*À5hPOD·ºuk Âo¶råʑćp*%K–,Z´(b bèþ¬Ëo{ÓE[¥!œª¨ð‘Ò‡8¯\SÝÇ}êñÚ«µöÙ= Æ4á´œYNË€PÆrú»ÇƦN®Uœ*;yvœ’²_órÊ2mj©þ`º}p¼ý‡p?Ó…?“?ì¾b纃§8½ä£'?¯À2ZJ l#FŒ W87~üDPmèÐás}mtïŽUl8²Ý7¾¢‰wÃQbò)_ÏŠy{x‚v 1•ÁhŽANp!@Ñ [š&½YjšIspŽÁƒŠ’MãããZ4oÞQ]%›h)ÑLЇ܆rxÛgáØ3‘á^r€~½ï«Žp™qßš  Ÿ>«ª«Ó¼3§HÚ2ÿÂeÊpÊU-¥¦òW¤ÌÏqHÓpŠÅæ'—o6?±žýäF®Þ~[Þc¹ˆUC T¾¬&4€pš_iÍ´°Öÿ´”¯êÝŸÉöàQ\Äu©üaÊ ŠCì†ÝÅÇ…•œVÈÃkáùóÇ™0M—š5%D˜¢š\ýû;i)EÇH7„ÄU \ç:‘P–lÞ¼™±­$&Â^‹>t,([øúÌ™3%Þ k@êK¶¯w¬ý‚«½ z¡c”5 ãqãÙë5&“º6¶¢S¼í¬ŒcÚA¥ùÿGoÿR„çEò i#û£Ä‘½{ÛhRZ5këÞ¤Yƒj]ºX!¬uí*B›• š¥e§:¶oèÖÁÜÜÂÌ̼U«6`[‹-MÈ%Õ¢%×´ióÆ›6lظ~ý†€œìëÔnP«VpÑ­reeuC!‰S‰h)A8„ÚY˜ú^òÂo´6·iž&/´z®˜—Op¨>Ñîã§Ïÿ…À¸6h2œcÈlZÚɇÏoÜ?4zE%ºÍ/îÜŽ^·¡xQ;¨™Ä5Ýd¦'§iÆp‹øá~¾_&ØÓgxš(_%§A&·÷\¾ Á%ƒçäî¸ås:Bñ:‘çOl­š ¥¦“Ö´ÓÒAŸMüJ ëbYI=<<\b0³I2´” ,`ÁþtI:FIƒEZ²ÃlI:ŽG÷·ü”¯n^ è24󛯹ÅÊð.KÌžkûN-ê”TÁ5¹SÐô#š€þÂÓòïÓg¿þIÿ¥÷@ñÔ¨wÁÞÞN¼í•?ÉС#GŽÆV7mZ·ëÒ¹»eÇ®–@Ñö;YuìÔEßëçÈÎïzYviß¡£EûNí-ÍÛY¶³èÐ΂?©t¤ÎJ[óRÌÚ¶ocfѺM;ÓVm[ššñ§‘ƒ”V­Í)/ލƒüi "ššµ4mÍ‹/™'oþâ%J±Ï'_á"ÅråVI°¨Yƒù~ýKòÊo¼@8æ¾L/,\ËÈÍqûIÝQ[yú`BSìô2˜^Œ@þ¯{VªŽ@5‰ GfaijOî=V‰’Y`Ÿ|þ”¨†âÕOnc Óì=ŒÛG•­xCÉù?'1 ÿm?Ù?“?ìñ#»2ó‡~h3kÕ[nQÅ#ÔqˆüìòsÆŒÖqï>¾ª‰ §Re*»þ>¾¬zÜ7Öq”%4Ø»ï¾Ë`$ª~ìp0¾¢¥¤Bª9N€<5&±7äÐA¼áP°|Ô¹du`ûÑ€Úÿ·RÆÃH³½iÜ­yßaiâ÷Éþ‚“ãËø-(6><öí¯ÐOÞTñÀ?C.ñÿñÌð=þu§)'Ÿè7qâxA8ìjš¿žÃlll¿ì§§Ìž¿`ɫ˂…K³–%KWR/YAY´xùÂEËäSþäøÒe«–-_-…ºü¹|Åš+×®X™ºrU{©¯Z¾z %cMjFêÚõkÓ(ÒÒ7®I]GIMÝ(¦¥oHÏØH ¯ß ÀV´X‰·rå!çbþ…9!U_f¾æ×IK[Ï‹¶JIhZÌoÕmgƒß?3ããÚ©*þ-SK)â\¦ G¸Ï9MÝø (d¸ÇŠÁ™ï^¾‹eHÛ°wL"F*ï¿ÿ>'ð)£ šf²sÙŽ¬(-ù¢0©6ÈâŠùšÇÚ/¹\„SRµ†pw1c›Ä.ÊáX1tYÉ1AûŸf‰ñøûô×/i€žó/E8e×LqNN“ñ4£ ‡Õ v¸Nº,\°ô䉳gÎ^¢œ>sñ‡åø‰³'O?áê…‹×ø”Ó¨œ8yîÒå—¯Ü}Y=À™+™û3W8çܹk§O_=qâ±cçŽ?ÕOœ<»{Ïú š¼ñfN²w¼™Äßo¾ñfv RÉ*#ð5«+5ØBÂwëÙ#ñó`T!~Íßy þ8‡ˆõocËQL[ØØ2½¼ŒOqdNPD šeíÞ}q7×B›'8a3>Å‹A)3Ÿ(êíNJ€[¼dÞÙ ßîûxÃ!S#Ò¦W¼Ü5‹PVfQqæ7nJùÍ’d»ÕÛD\àØËiº×€;(ê,q–“uºî5ÇAÝIU_ {!§)Ú‹iYŸJzç=ýÄ1]n$Ÿê’ÁO¥þ¦ŸÙ º™&–ÔrãÙ3h¥Tw¦Š8fË—•íüó„$&ù¼}î9Q‡J‡¬,ïÞ6^G2á\¬qG„ûM ø×þ’¦ýÇìÆ*æ\$ï<7Þ½e|²ê豊¾Ó bÊøÎ™˜ñ)Ä]j¥©eŒûǯÿC¸G¸Î».Z¸ „S`ó¢¼r §c $hÇñ%KWíÛdç®ýG^¾"õ˯vrä³Ï¿ùö»½œ¿uÛ»ï¼ûѦÍo/[¶véÒÔùó—xvã®'²zÕ¤BÁrÀLÐ%«îˆÀ^çHw D ›žh%tK¼ÿßN†ûkƒÕoz:mÈ¢OŽ>ºG@Îág¦Ì+âSØkVçØ5—jdb¢2ùá~S;ÿ…¿¤D7‰xI†Ã‡)N—át„®Ž¼püÔEʉӗ('Ï\–"GΜ¿F9uö …Ê…Ë·ví=âàä9cö¢i3æ/[™>n¢ÓüE+ݽÃ"ãSf.à´¨)ÉþA‘“½<¼ƒ"c¦Ú;zÍž»’ýÚô·“Sæ9vi÷¾ãgÎÝ:}îú©37Nž¹züäÕ£'.rüðÑ‹ûÁ¶göì;½{ïÉ]{Npæžý'ö8¾sÏÁº š²åT`‘=‡á7 ÙþŸd8§2#á¬RQ¢1ó ¬:ļn*ã Ç‘×TñCã*FÑ<7:MvFä$W2I¹sä;f]ƒ78uYy{)lƒˆS“ÞpS£z{Ūåo¾•íÔùÓ×ïÜ /ïÜ»«„MšÄ†GEÇ6¯=D ýÎòŠêÖ\AXz9-+nQ‡í9˜¬•‚I`Õ%`X£t’‹ðŽèˆÈ¥tŽ(ýÉ[« î+˜¼qü%5ž?+/þëM™÷²–ê¦g0X?eúáÖœ¹[a\@%Ï)oMt™üöGÔúD¸PÝSÜó*G’"ÎвŽÉ|ªµÅvÐ×Ý]¿êz/ìÜJåÏëýôïè–‹7ª;øwM(î–h•²‡X¥Ö ïj'ý§¥üU-ü—?ùgŽ08¤ ö™wê<šÀ£'ÎSçt„ÓÑîô¹«{ ‹=§íÜsxæœÅщñI3“Sæ†FÄÍš»dJ| N>¦ÏZ“ÈMŸµ84<)*fú’eë"¢¦…„%R>ý|ï…K÷Ž¿,vððyAµ½ûOïÝæÀ!þ<·ïÀYêì9ΧŸá¦ áÞ|KC8ö á(¸–RÉYÊa+“ÛBÓq}|ëAõqv¦n~¤†Si²pHx„!5"¾ JÀzxÿ…ããÇNÞ¸À º¾a¸{ÿÎÃÇ™ž®Êò£Åqߺvõêx|}ÕšÕœFâÆfV mDÝxž•`B¢î¥p =¦Nï’•iž¯è)ÁäMæ´Ï?ÿP$XŠ?Æ^²¸èØÆGúݳâ™NÜ‚^òúã‰Ul9TäOAS9Gç×~ ƒKÉn?™?Œå?w=qOeȾxS§ÈrÞS*ºø¤_º¦=“æ;©t` K’9dú¯Šü¬¶útùºà¾Äch´ t#‘ÅJÀÛ;+;ÇTõŸYhŒßÒÓ×NhnÏJð&•÷÷wÇÿÿåáÙF†ËŠp‹-G ©!ÜEʱ“—ŽŸº|âô„*ŠTNEzÞ®KáÈ¥«÷Î^¸yãöPçÈñ ìÏ]Dª;¶sÏÑë·s2'p)Rç²;w?züÊ¥+Ï_¼÷åׇ(ÇNaê‰cš¸vŠB…²wÿ9Êž}gµº‚=@nßÁS?@8oÿ§å5E¿¦Tlš¯?F¸ä¿ªãè6aÉÅ}¡yX>…#M1š`xa6Ól~^Þ úõ›7Ì;´ïÝß–¯Þ¼Ñà|ØZ4kþÁ;ï>¼ÿ€Y>&vJŽ·rvëÑ=>! È9}òLP@pÞÜùîܺËLÛ¼EËf­ZòÝ–­L ÿpqq!p̘1€Ä¹sç¾úê«Fñ­iÓ¦AA .°„œ¸ÄÆÆæÎ{ýúõGŽ!Ü è| àäå7áhGô§Í›7O_¡ºà:S¦L!Z‘ Æ¢ûÁ¬ûá‡rAê\ ¤ÄGâ+`Ø_|Q¸paRºÃöëááÁ9„ó‰ξ<̲eËÄ VÔ×3TdÿÊüaiv•'‡T™Mþ°¾SgŸ%$†•ä„{xWd¶ï;ýé4¿£ÿ¶?¯´å—Êñðé”Ý16ôž[Æezyç¸f~SŽ“²ûyîk4Й¾^ÞãþñwþÏ—i‡ᘕt„#d „ÇÈ%Ø&ð–átT«Îœ¿ÁŸr—ßìr8‚ ñÐÑs|úÝî#9é6û¯¾=¼É™h/_}zg  wüäµÃG/½óÞ× —ŽmœÀŸœsàÐŽû.Pöí¿¸ïÀy­(1Ž‚ÖmÐ\Ép†š —‰podûƒ=M( !<…Jºa"|f<öÄ8tÚ¬ÎqŸïäøóÌh)ÌkøD^U9¨ðTдŽ7.]q²wáÉÞx+G¡Ò%Þûü“S—/tîÑ­déRΛ;OÎì99š9{–’Jµ’/_ìoæ8yäļs²Þ$s1wnܼE=“¦Ü¿ióf:žßsçÎE…È¥ræÌ z ¤aŸ|ò XªÕÍßPðé§Ÿâ.'YÈ@‚´ ÃtÇ¥fÍšÅDæÃÅŽ»pŽDræòåˉ–?å‚l˜R#n#¸çÁMC$@èääħ„^±¨’3…VãÔ©SüÉMyZ¼ÒEþËš æwÍ /´X\DGÔ@×TÕŒÜ êô]§òŽò(0#Ϥ€”¿T4ËÏà$5Ž” ¹#4=³\BúWIoâÆòÈý®.z _F 7–öhî{o ›RÌy^±1!;>;e|J÷ÑÙ8]iZýÿìp¯¡½ÿR—øIÊ’—nÉâ ÚÈ㧯H9èö¢;uù4¨vþ†¡rêÜuÞ}h?°yÛç{öŸÛµ±ì•ÝûÎRgO}ÿ¡‹_Úèò‹r‘#|}ß¡³”ïö­Ó°¹!Øöá²+ûÃNÓŠÜ0>ÕtmJ­øé…ë-œÜêyx¯¿vïÓŸÐc(ò”Þ¸÷ð†rXG‰AüÙ³QÆæÈ–ÝÙÕÅíÍYË– •ÛyøußÀ .ûÞ;ïæÊ•gúì9mÚY˜[v–h„ ãísgÏsh÷¡9I³rÞ¼wSÝÙÔṲ̈ƒ9þœ-Z™‚ ÚÁƒ©Ì˜1~ *H] Å·ß~ Ô%%%!9áT‰lÇw'Ð…§'N@uFØ>v²uëÖ:ì‰í±ˆˆÒ]BX&Ã焈™’’‚膱­^½z°²ùûûó´š\h䚤."X˜»#Ÿ‘3q‹7oÞ‚ D4>JLLäüÏ>ûŒ:×Ï,6B.þ:IEŸ¨aÐ xÊÌöLÓˆÞxnØàW;fÞžÛÊ¡õ¹JîùðÖ³[pÀ›–œðG¨øXªk*µÿîÏïH½®VšOèÉ'ž‡-ø$ÏÄEÝV4õŸùÑÝGžÝBB–ÍKy5ÿã·ÿd¸LNNøºäáá4’k¢™ÌZéÒPHŠÆ’:…ƒ(!/_»‹Ø‡Ú-åÞ'‘äÐFò)òg"ɉ`wï¡ñ«ï«ßíC;ýî;7nùtÝÆ>ûòÐWßáö8¿{ßù{9 îüÞ÷¼´g?Ç/j…#ç÷8LîÚw< Âiv8$ ¥¥|ó@¸ÿñ5Wûϰ,©ÁòÌxéž1õÈ™Š#Fõœ6¹Ri·23 Í Y4ª5?Zd¸G÷îÚOÂíÝ¿/oáÂõZ4?}õÊæ÷ßãá ,Œ„ aþÁ!&­Ût³îEì󳧇—Ï\Ž ÊiÈÎJ ÉĬu§Þ=” gÒΔhü³ X !¶I€'oÞ¼D xzzQÈXXÎÐOrQƒˆP€‘¼œ "{db‡Ê]NÛ˜ha¾ Ž+ šI(lø"ÑLrP¾…b“'AÂkÓ¦ ·ã#4¨ï½÷ÁÞKˆ1·hEŒãh%Kø|_2 ¾¶ÉH$¹L&E­Œ£8'¨•Š1ýä…:~‘…½"³9Ç Jý=ó3´’Z‡»ÏU>¬8JÜ{I†ËD¸ÿd¸×ÖK¿íBÑArOuÓÊý×J‰*ì¾¼Ól»;°ÉAtÿÁ¹Ç*Û”ñò5•|ü¿ý‡pßk)Q¡ª„‹Râáˆ8}êÂõë÷:E~ü;v|ôé§ßnÛöÁ’%k6nÜqòäEþ¤¾sçAb×¶oÿpÏž#{öâLâÖ­ÛÆGï½÷Ù_ìÚ²å½Ý»ãâÿÙg»nÝz’šºyéÒŒ³–¥m|ÃÛŸ¯ÎxwË;_MµÊ'(q󎯿ø'Io{ö¢–¼DÙ·ÿ2eï%Àí=|‘²çй}‡Îí=xfïÁS{áNy´A“æâcòfölèýˆˆÞ~­§É‹4˜Yœt@Ó*"ˆCªæ6rßøàŽäw¾õLÑßµ›RÑÁaÞ¾ÝûîiCH…ig.úÕ”?…J]¤’?7N7ž'DºZ¸xÑ[yóxùùråú °Úg É´©4™ofÏ—“˜úa'ŽL]½æ­9ù¡HN›1göãçÏÐR’ ¹(*$¬¨ 1}‰  Õ@Záð¡Å}¿þúk¶C‡QA\ã W^ê,½¢™œ?>ˆ™¡`•z¤h«!'·nÝs#ÁÂãÆƒwkÆ9 ‘·N­ ´ŠðE‰»æk'¢A3ùGè<-ßr"Eɨק°‰ºmß^Ðß/‡OpUŸ”ù{o*AR‹Ò—CKZûâÝÐuž™.”šè¿íOlMOüô&´3ÊÍdâòK»ÆçvŒªêÿþåûWÐçNúˆçwïJK×.ÿ‰üÇßú?„{áôˆo áÎrûöýêËÝ ¬X¹"}ÞÜ¥Ôw¼ýQ`@ÄüyË’“fͳ$1aF씩ik7ÅÅNKJœ>=eNtT|bB {o¯€ÈˆxJXèö>^¡K¥nX·#48Öa’—·WÄð±®#'zt³a;Ô®gß1ý‡:¬XûÎ×»OïÞw‘"ðöᮀpJŒ;txÛ}ð,ð¶çÀIU„S±Þo^ Ä&ˆC¿Î÷j„°û_„»k| È)‰½ÿòc·ÊÙ¹5 }ÿÖõ+jædâ¼ûì©b4ÚfÁxrë– ˆc'šâ©Ÿ'NðG íîîÎDÙÄš5k8Àùè9ÇRV1 —¶\~#È!^ˆÄï“UHüïùˆãTãP ò§V†éØx ‘ŽOÁ?ì^('©ã9òÍ7ß ØDäÒñÐÅI¤H‘"œIþYNÃx&ø„N)#¨:EìãRû÷ïçÊŸød±h#Å´†*UðÊl@—puu%G¦GASîÅ•_—ŽFÇŠ¨E•«¢/² ݵ÷™±Š—{Ž¿<ÁáÍ<“Yõ«‡øoû»´ïàM•o‘ñ¶íø£zÞS ¹Fv ±˜2ýaŠWAGd¸ûšØ¿äî?„û„“x8¸»áð49súÂù3—/ž»Êþú•ÛW/ݼpöʵ˷ì=ÂA˜¨î;zéüµ›×î>püÎÍœÀi7®Þ9sò¹ӗN?wôÐÉKço\¹xëÊÅ;”ƒûNž>qùо3_¾ÿã÷¿}ïݯ?ûæØÁ7>ýæØ—»N}ôÅ¡u[>ûjשýG¯*…¤îW‚k‰’á”rr÷AÊÙ]DÅ8 ¼íÞb÷#¯ ᲎å¬Â›)~P´5û}¥Å"1÷=Å•<$qY¥1ÎãV¬A˦-ÿY3"Àij--ZN‹çÖ>ÐÂÔØÄw#«Ï½|¤s‹deÏ á#Ý:¥Ÿ–@#þ”/ž?¯òÓ±¡ÌÔ/•5†ZZÓó>g}<6¤L¾®Ç|ðÁ€è+W–sø!/ÙÌZÁ]•Nþ1.6ªÎ&6¶—þÔ!kSè{™­öûÿ'‚—&€c ½­Åk«#וÂòcgKyyæ‹ +â›þ*Ê¥æ÷·é_æ ô#öT­5Ã>Ø[ÐÞ¿ˆwTQ{¿”='U”·êzFñ;JÕœù×_æÙÿ ùá^F8Ø»á°Ã…¬ëÄy`lç7{9}hÿ1*¡Pß·û`åì©‹œ¶ÏaÀöì<ðÝ×{¾þb'ç=túÔñ ß|¹ï«ÏùøôGïõá»_oÛôÑžïŽ}ðÞ7Ûßùö«Ýg·¾·kÛû;A¸·?Øæí:€›‰*Êm2Óg’0¸ ™Æ9 áD†S*J¥¥<öÚNpL&î,›è¦¾ÿ0³ÆzüàÑý;ZÜ»g™Ú›¹G¬:t-Ó9ÆÍA§˜û4¾óx Ç„!ÌéÇ9˜5Z¦{às²™é•m&Wã»z0µ\S€D BD"* \V+—ÄÕéüXrM Óæ²:.JhW¤*à«|K—ß™úÕ²FæeÅf®ÃÕô¯Ÿ<‰Š7“ÄDÂæôÇ~mƒŸŸ.ÞøÑ©ŒµšW¤zzu†î7weA_ƒ›[Ï€ƒø+üo—½¶ÇøïBP h –£—nCîªÙ‹²Mö*âYÝ9x׋pU¨?S±,5Õ²æ_ Äý‡pÿƒpø˜ÀmBfA¸sg/:pôô±3·®Þ>uôôÉ#§>ÿè‹3ÇÏîùvï—Ÿ|µó«]÷nÞ¿rþê¾ûo_»Ã9|zâð©Ëç®Þ»ùà&2ßù›7/ߥܾzÿüÉ«Ÿøí±çN¹thÏ©w|ùÕ'{>þpçÃמ¸ýö‡ûÒ7¾íÝ]”??¸s?Ü9Ê‹x€³„ ¨¹CÊ£R³Ã§ì?|ŸLUŽdÚá~¯–R·¬ü_{çgUuï{Kònn^ž‰¦ÜäÆSLr“gbro41Æ$MÔ$s¯÷ZbÃ Šˆ "Øh‚ Ò‘^¤H/Ò§÷3½†"C‡aÞwíßðwå }Î fïÏf³fïµ×Þg­µÿ¿õïI ¨lœ)418X;Gìà„–ÏÝ}ò|ïk“~zoûŽÅ§ Ä I ƒ#z95Ý}à—ï ´«Œ3ž /hñúŒÅ¡r»c-pŒãhÀ¦Æ±µ1?nkÇø<=‘F”î’ò¤I“P¹!º4\ŒBeµ¦“Ü¥¦ìY¼Ã!£Mr—ÞÊ·ÛäÞXI)ÝXÒ¾aàˆDƒ×=8æàŸ•¹»áË¿xF§§ÿ©k›F¼#ãØP³ÖB`ÔRÍpkÍ7JK>ÓõÉs»õøl×Þ=æ­sÒfâϰ“º=HìV82r>Ý5§!ÂáÆXY±1+5;’‘›šö|Ïú½Ð`ßAÀÛÒË(xc䛯½ÅÞ½ËÓC½†À±ÿ‹^î3hÈÀ׆ÿ}Ä€—ö}îåa¯¼9tàë»?Ñë»;ÞWÇ/í÷ü«+­äV­H_²,󃥙ïÍKœ½ qÉÊìå«#k Ò#$+Ò](“ƨ%™9%Ä. ls—‘[™•[‘•[–Wž_ηh4—CŠÕ¸»<ܬ"ƒ=-Öþùý²ÚË;¿ð£ÿéO-Þ‡ÂHªY±kÆÕÇf&|& ¯×év"Ø4X•SšÄR r£ÿtÞPÍú<u„Ùjáá¸ø-öbú±úu&ÆŒ5äEPÿíp â’ìh ‘“03D¬HºÎH¼ Û«Ÿî5äsO<3¶ Â ÅG0ß1{xØP+ô_ÂÆ††kßz팎>ßçÅóêœÉvKT‚›gÌb÷O ‡Oûñ î<¾±¢Äœ’¼¦ðpB¸²ÂÒ|Ù6}´hÞÂõ«Ö-[¸tëÆ-)’gLž>ö¼ÑÃG5nè !o¿><5!å½i³ÞŸ9wê;3'6°Ï«ƒú™0zÊè·&°{eÄß|©× >½_yö©¾ÉksVe&®ÏËȪ]°,k¹‹SfÍÛ0oQ²ÓÌl6„sÀ¼åv 6N–&âá@8·çÅá4ï“w;xcdbS6í %7_ YMƒo•[zCÃÕ/¹üÉîî7!ˆ3è ‚—ÉP„ ¤œ|~»wï…³± ý|óÓWsÆÆ Q lP˜«ÙôsÂ!ãT†g3¸ÝÀÌ—. i0Н’1‹ÞÁg ;©—·Ì¢_<´——©¤B…Y®òV ËtxQð8fy¼èé`õXQÂÀmqˆ k”ïvóS݇}ò©A>ölšæ¡ ]:õp;ez nûž5e•ÿ¯÷SŸéòàWºw»ªÏ+\›>ÀÀ6ø.1Q&ÊP£ì)óëNàEC„;,Â7©ª²¶¼¨,;- œ+É/ƹ8'=»nó6Êœ/Èɯ.«ÚTU 悹™‘ªÒêÚÊÍŹåE‘²ÕËÖoX•\’W‘°:mÙ‚Õ©"k–'g$å¯^–´tþÚ f°åo^³®pê{kæ-N_¹¾àƒ%i,I]µ! ƒ x¸ÒƒðVœÁ=Å8§‡ ¼àêb-¥”\òÎÁÛî «¿Fäb…„Ýںטü½ èË=ü½ns.§ð]A"oä.,-]ž÷Á‹c‡M4g—*>EE(?DSÚ8)ÖДm‡ü$$¨ômñ}Q 4ާÊ6ÔcDÿ"Ÿ»/5ÖÍòÝÐ‚Å–Ô X/Jà©·òó è‚v<ŽQúÅø¶q‹Üv;öšèÉÿ[³nE®•[÷åžÃÏxrȧº ì<ëC:èa/dºá ·S§4ä}´ý¥5Ëÿ£ÿó—tê4£ ŠwÆ^ Û~—ˆ*X~‚pB\zO3~êüÆãyÓ¶‹p¤ea䑇ðI"dañÁB‡*îæ›ÿrõÕ¿‘-eAN! 6tosÞ»xþ’íå¨ÛƒÖ­¼¨¢nóö-5[³ÓrrÒ# ç."ìæªÍ¨ß’×¥—Ô xKOŒ$­ÍøpIBÒÚ¬”õ9Ù©EIk²?˜µ¢0» n F%+3æ/HÞØááæ-JY¼"g¸Ã \afnqVn¥œáÈe•`fB¨ôp¹¥?üñOñ3o\\ù¸¼¤ySØ‹F×7˜5ǽi§LÚ)âËædÇîúû24\;dèù»§ë»8! F¾¨€0kF‰4<žÉy¤º††sâ£àE…í§‚‰þÄ–Ù-þÃHx‹ã'@ “»îº‹¹†pfrTµ( ¢‰%-*t¬~r Úq¦¯nTðð Í›‹a²»vOý~Ö(ÿ=ke»=?û¨ : ˜[¶Ï¹2Óû¿ÔéÃíTé ¼4B‰bl’´} c(·€àtkS§†s6´ÔF8@ù$‚Ê?ÿùC¸ÊòšHv>z¸žëƒÊmø›#EΘöÇiSf¾;õ½‘oy¥ÿà^=Ÿ;bÜÔI3gNžýÎØ©3'ÏòÊ[Ïv{±wÏ~]:>Óñ¡n]{¶[—ç»w~þ¹ž×.OMZYµ$iÞû«-M[¸"sÑʬ…+2.K_¶:k]rAJ®ÜÎT’8–ÿÀÃågçUeäâ×èçà-RŠ”26ç>€FxÓT ø.Ø Ënû¾í{€7LKê÷¡€?° ý͸?|ò©_¸bû¾JYë¹ &)Î+Ü9âÄá ™ HŒ)䨤³ Dô!Çç·é2EÑPO N¾zflBÙ„¨&N”ŽÐ¼L‚ª{ãgs\5aw¹º;«ön¥s¾ÐåÙO>=ðŸðó>c³1æ>\ w"\ü àÑÞDb“ÀÎ {Í®²ù)ƒóF ¾g·Üá08i´v>Z›§øõáNl\S„«ªÜ”‘Á`ü¸ÉÌ]?¸ß‹C{õðà}]ztïûÊ€·Fœ–™Zš“Y™¸.w労5 Ek“KÖ¥”®M.‚{Ã.9³ ûG„+AD))¥ÏÃ9Ì)qÆ&ùÅ1C¸ð pô\ñù,¶íúˆE9ž9ò!ÍÍ)¿ô®‡¾}÷ýïäa²å|Ü!8Iù=ûÌØŠDšŠ}ø¡,s|_â'I —ÄxÁÏ™‹x;n1 Txñûiq¨)¢Ýî›>‚…4¢°añF qZ¹c^²m]CýÎ-ö Yñáÿ~àÑÿÛwèW:÷–X ¬A‰|±}߯Æ\ñöKÂ÷9d”¹õ$eqoB8±kú5DÈÖ“èãÈËQRJâRrÈ'£x¸²ÒjBvmªÝN’KŽ›6íÈÌÈÏÎ.*/«ÍË+«¬Ø\Q±¹¸¨Šð]5ÕÕÖnOMÎMMÍ[0åäɳ׭É(/ÿ(/R™–V˜Ÿ[]R¼%7§2aC$;£"+³"’UUX¼Ç€”ìªÔœê”œ Üà€7D”ØI¾nÆÃp¥¾¥ îÞòøFJC΄”Päð e[ šFVyÀÅA@V]‹dØ“µ5uéÝÿ'÷v|tø˜R’QÕ7¦Yi )w”vÔÅáü *"P²ÒÙ‹ $d LH.)+ †‘\"!Î /¼À%FdŒñäç GÖàò]{ÿAì×mÙÝmüôoþåΆŒìr^8. Ô—ãt7‘*±e`ji8S|3»GÔcb¡(›†A¤¬¸\DOxH ;2Q&¢ñ¥—^JøËÙ—:^~ùåúS9qÀ3"erÜ€šãŒb‰i#ó!¸ÐÕQ̈Ñå§ù–ŠÎœ„B+ñ@ûB4°mv¸ ¼‰UÕ—-¿±ß€®f0¸NÌ\笂PÇtÐâ¡Nëw‹æ$-ðh+çd’F¦^ÁGÊî&€[µ†ÙsN·ùpXŽ4•€؆±ÉŸþts£®¬š¬oIbrÞÀWßž2mþÔ™ ÞŸ»bâÔ¹ã'Ìš=oÅì9˧½»píú¬qg-Z²þ‰§ž¿¯Ã»özþÅW'L™3ãÝECþ>fÈkcFŒ™>ð•·9ŽŸ0gÂäù¯;èÕÑ/¼4ìù—†9¬"iv©Û3K]‡G8ç Ÿg[Nk|—.EË=Ií±¼r߉û(¶×;Í ð!&ä”÷/üóí×?×oF¤_QÙ}7MJ ¦äûÑrRžp1%–B5YáÛ$4hxC”d$n$H–šJFϲžr ™äÕW_}ÕUWÁ™qr̘1ŸûÜçHÃöÃþtDmFJ9j’•h“°t°n$Ç!B&Q»8çwº~ؾè—po°‰t¾ÿþû Ð èšõJü~7Œ…K$àF³~מ};\¦uŽÙëñ'{ßyÿc×þþÖ?ýçÝ·ÝñàÍ·Ýûç[ï¾ôß}íïÿú—ÿîpÛíüç\õë[þzû£]žê÷ʰq)‘Ò”H1ÇÔܲôÜrö´HûAoÆh&Y9ì4!pÞ’RÂç!¢Äã;§ $&z8ÈTMÁy Κ Øj$…|!øN½0{ñ÷¼ì±§ßÎ.ÀpËL>¡íÎÏ{ãþÚrøæF I-wLÎ}”>‡$þ [âiõêÕ ("¨ñÂ… %<äÒßþö7d‰€Ð×¾ö52‘JO†?qÁ9@“\:9Ž“¤HU"Rêüô§?½òÊ+ñ1ð$TÊÎScK¿!º$t²ÞJ/#‡ø¢bâö7ì$UŸ„V ¶Cud€k´@©Þµ òç*.±¶øê‘Óîm‚L0Î IªÂŒqQ`X²Ï©É±@A_îtÎ,W·ÈwZo!Â5"Ü­·bEy„B +¶VÔìÈ̯xòË6§æ”æ—nÉʯNH+ü ʶrÌ+Ù¼6)wÑŠ¤U YİüpmúÚäÈÚ„ì•ë3fÍ]qßÃOmHÎsŒWZaVþÆe+‰‹RB¸5‰‘ä¬âĬ‚„Ìü¤ì”ìÁÂ9—8„“„ìŠ4"ÜÁÔ9Î雓Ùy•‘‚ÊÜ¢ŠƒwŽ“´Ùsz ´›;×¹wèÚ‹+¶<ÙÉW‹Ë-÷´óg£ÚÍWM’FÎoEõ £V¥üøoö@·iµ ³Yäj-¾Ã¤ÅAv»ƒ=0êraÎ[á\Vƒnsæ·xñb²ÞÅýaþ•ïÔäŠøÃxS²ØÂ[ÒHàê{ßû'/¹äþ$eN’ˆ™'ÉHùK8<@‘j0p0s(óÌÁ%@H2Γ¹[žvÌç/れ°ÔØæ\¼«nÌÀî†éIŽà»Y“ÔJוF'Î0:.º1Ž_­TG7` Æm„ëªßé¾é À&C(¨Þ©dC.ŽGó^M¶ðû°uÇÒ„cÇŽ`b€|xCè$îÆÿøÛß^;qÂԢ⊊ê­d宬©ê*7n/*Û”Wº±jËžŒ¼ŠÚºúüŠ-•‘’MëÓ VnÈr¬UÁþ‹Ó3‰ú_‘?SÒ Só9&§¦¦¥d§e”ÀÇbP <Ó.x3³óðj”ñïÕr ·dänLË©ÆÞ2R´dÍ-¬Áœ’\ä?úÉågœý —.È¡Cr8ç׾ݼ¹³øÕÄ…dÞïÜçìFdB Ÿ¥x%'ÜÙP·Ë­ð¶7ÔmjØ»›`Ê| H®R7:ÿgò¼ñIo°kf/üñ~ó`÷Q ’+÷»{œÄC AÀ÷®¥µ–“‰Œ94wiãä`ÚR ¥0$‘I$ù»Á3x2¬E8÷ýïŽßT»þúë‘aÒ ¸‘:>û쳜I^j2„??’pÖ`ÎHJFSΓ=œ4§JÛÍŸâ’aN3¦Kó¦iLnñ½ýmAYÉ “Üîå@>ˆ}°mÁH1Iøמ ŒƒÎrÅ ff2aZ“1ªa¹†Ë‹«iëŠÆ© f˪ÖÖ‚_ˆ}:…˜ôf\6bK(ºÝ:œ7ųû£:òèÔï®ß³Ó}ÊŒ±û·ïu™QÙq‚äŸÛ|åîX‚ ð ›ÛÇbH¥q·Ñ§ÌSZS¶Ñæx¸(„{ôч¡_ t œ,Mþð‡ýëß‚päøÎÏ/'gwIyíÛ£&Lœ6kCJVZ¤dźT Þ2 «¤EKÏ«ÜJ®íÂäÔv M»þÛØÓ¼¹ð r°qì4è£y’^ºÇåVÐ+3w3 G†œÂM‘¢Z6ŽìááÎúd»3ÈŒ •wÙ½…psç5"œ#^û‚õºç@r”wïÜ·ÁSÝ™ïÙ»­¢Šoù ™ÿqÿcWEXôÁ›Dö6ô{á5Oöøå#_ž±`3KÀ@ÖuR6ûH,2gäG´-?NJT¦l¬H0§´(Ž’8€- Êæ¾-Úq¸Ç¢ãúÂýÜjÍÞÍÏ*Ðʽdéå|ððË"g¼ª~‹êó«%ªmúæ-Óˆ~öãœ5Í¡¦|:¨²úÖwöÐKØÊ}u*>Îæ˜2`è'нô¹Áž?Uç©£ÀÜIÚQÃÇ7r¨ã¯áG­,ØîaH ÜÍ7ß Âá-Â]ý®ºêj®´¬7€•«“çÌ_>èÕ·úzýÉîÏwìÜó™Þ/?ýÜËCÞ¤•ÕìÜ^Èž‘_óáú¬„”ü„¤¼ ‰¹Ú)cB™”ÂÛ÷Æžž‰¹?<pÎÀ„]Ú5v¥SA!(Á¶Ì¼ª`¯ÍÊßιcn à‘‚j¸ÌÃ!\»³ÚÍžÿ>rÈFÁVrˆ Â÷RD92px«ß³uBLxŸÔ =­ûv§g/~ Gÿe9ˆ"×mm¸ЈËìtuç.ƒ?X,A•O"Âù+Á¦«B~¯><.™Ÿ1Ê3Ø8}ÆÔQÔcL%9o”£c RÔ vž²Ñh{ò•F´ZùäI/hîçFbÌí] %f ï€(ÍÝÚÑË Ï íÔ¤/—Ô—»ä_¨qÑÊC1¬9oyŽÔ”ê˜%*Ï Ù¸£Î[Oø+*Y®ÒtµÑܶÏĦ®EýÖ©æ7Øô5Œ §q5rŒñÁù.äK£î¨?0VÚ±8œ|R;<–â0püã»)åï~wý•W^5á)å·lÙ• £–S2÷ƒKW&,X²fñò¤Žo™:qú=‚L W&-Y¾*1wMb^bJ¨¶nCΚuY«×f®]Ÿ½>!Ô ç´'§Âع=%Í -1žÔîãJ>×IçªI;¶!«ÌÌ«‘¢U\€p&¥ü®ÝYgΚ?×ÙX±Lˆ¥ -r 8”}V%rsCRUßPr aÙ®†?¾ýÞgìuþã¾òäà¯ÞÛ{DdûϽþïžøÉýMÎÎDS KçlŽOªªê/Wµõu`Š©OÅò ^vÙe˜èã´«¨Ù.¾øbÕô¥=–7Î_„*\²Ø?à¤mþ£cõ­o;ËÈÿ9-ªÄ+V€~*>5(pâGq šE0Þ\Tèg]UÛGË÷ÝwjNÿFNZœOÎÊŠàÚðù‰&Ž÷g¶Íú¾‚`NjŒÔ±–þ—²Ù=ù®jÜ ŠÍ:ò ÃOµÐ9äX0üOãXd›1Ó¶ŽpÄ¥ä›Û@¸?» FîÖk¯½î¿ø¥®ºº®¨dsMínÜÑJË?â—®”WÂ`dùšÌÀM»š¦«6DRÒK“RŠÖ'ä­^›½j —½v}8ÎhߘϞTи'&;ÐÈž”Z¬ÝN&§•ÐfjF~A‚oÇÆEòk³"ÕŽÿK/â•ò"\û³>ÑL ôpΘâ 'Ι5oS²Énи ‘'ö–¹…’,È Ìuo#r÷ž÷`ÿO=1ä“O¿uÎÓo¶ëÐ狇ü¨çð‹îxâÖo.ÝVG&8Öük7ŸôØä Ðå3pQ‘þ ðøf Ëâçô½yåOûhŲÀsø¦6åK`ßž*ás¥ý“ÖøÁÐæ¼óΓ¡ V Øâ!Tæåy=[°ÛbÁsÏ=SýLˆ£˜n4\ׯk Éöè£âM¯ìÔµÑQ_Y¦$Ê´€þ•i-*Ôg )Ýé×K'3”6-éÀ(Á†búØo÷ËÔDÇÌÜÀ–X¸zTîÙÖ<—x­¿ýío™éОh 2Ù,*zÔ‚©E‡¦"ôM<Çúdáþô§?Ýt‡›¯¹æw<\YMII-×%e[p+.ÿhëö†‚â­îã| ÂmH-!žäè‰ó»¥¤•€^ ÚšuprÎÅ`k r‚ºu\ùóÙ7$Øn€ç#œ¹HÓÀåmÄs @¸BøË¼Â ñpÂ5ÚRæ‚g¶;óÜÙsÊ|عocSç…qI×^¬‚!EZ[SÿôÌ5ç?2ðSOnßsl»NCÎè5îüÓ?Õñ•Ëú½óØûkÖb3‘-v!ørf['KLiß*jÓ “’„N`hTjkß§¤šM¿=ûD-¬—šõÑ ìä^6Jµ8T¦§§C¿ðˆàmq‹º/hµ>¤ €Ò°>:t(·-Ózߤˆeeðð§4²… ’‘ˆøWÍÞ•“Q u ¨¼æ‹C[”ä3-}k&&ÞàÁƒYhAC܃¥K—Ú/Ò¹ê<ñvíZ¼\æÌ™ÃˆÒç¹—ô™À²k¸d\ƒÎë[nPÚÂAÇDì…p?ü vÀ wÓM7acÈÁÃIGÈ."˜y+1!÷éî}{ö8fÜ»3ß[6vüìaoLìÓÿÍ·G½ûBŸ7Ëo½ÿ¶»›8}qJzyrJibRñ†„Bö„Ä¢¤ä±3:éΧ”Øž”Zª=9 Ž­’==«Š=#»š=3§†î]‡&s‚­€pÅÅÕ—D8ùlöðgžyƹsç,nÔ½í¯?°Çùb×€H×ñA«­Ì††É›÷Ü6ñý éý‰'^ý§'¶ëüÆÿô^»{ú´ï6¼Ýÿ<óýÞÃW54dõ‹÷ï$]˜„ÛX"Ù<[”(_Ìß<R”NŽ“PÑSóȶ3FŽ}¹¢5e2=™«D)38¶E ÜÔ¾õdt{æüùó±óœ/ûÉÏÚŸu’IáÚµowî¼÷˱Aä=ÎS ÷€í õpcÀÉKûeD¾Õ륳ïét~ÏAçõ~³ÝCýÚuyퟞF—¿Ÿ÷Ì[_ï=ü ÷>=¥b;ö&yds±Ê^œ N" E|ùŒ}6f°. Š²1IçÅÄØ Ô—pª5Ýë[—ØÂÙÿJu£¯KwÔϯå*ðtⶈäi>àAÁÏcÙΟ: êà/»C…–ÿ”q„  ¤˜Êx¾,†Œ‚x<. _ðm@£qò‚ÇtK­é)ˆ.©©(h´/gćzˆPgr½€ð1”ͦFC-×K§tËšÉ6aÖéXBª2YmЫ”ù¾MŠ~¯Áy”jFà–(ÍôzÆLQ0,Âù¨f#ú:$Váq,zZ³ÛÛ™·@`rR¥ «Q'š¼ùæßýîwðp€!»ØÉñ]]µ¹ºr[YÉ–‚‚BM––n©¨ØVZ¾­¸tkZFY**·Ôâ@œX¶Á½¥fT$&cB‚Ùd);âJŽY8kWiÏÌ®äOÂQÚž©æ<'µSæLNn +UÈÏò6ª>…®`S$¯:;R™©ÈÉ­ÌË«À¥¡ °ìßÿãçN,éþqî9gA±Î=ûœ# ’É5;ëºÌžõƒîÏžÿHçÏu~ö¼®/þóã½ÏïúòO½ò:õ;¯c¿ » úfç>ßz ÛƒßBýæ²â¸ÔÞõ 0rèóäGnqÙ¢_=öGìk¤¶aÝs:nìÐô( ÓìÙ³©òñ#PÔWD;ƒ‡ƒÀá“Ê"”››‹ /Nâ5ˆ›@ô©§žbÎvà 7°^ 9‰s!+X7ÐŽOŒÇ!üä<|$eD&pAï€7ñÊGUmÆe7Ÿœ—Ò:À—«Oœ8‘õÊWÎ3"tµ„çpÞZmHßFçÃÐk•3zôhŽðpsçÎe%Ä„¡ÂsÏ=ÇI"õhE"àÄü=4(E˜V„“œ'F+l:s€[_Úq²gÏžð ÿöoÿÆs¹„}0£Ð¶R«Ôùüç?Ï­Ök!Â9„“„ƒûýïoÀ„=j;|;ŠÀdÒñ$æ$%f&%¦'%¦e¤e_ùó_ „;«½K›óɳ ¹Ü…û‘#/Ý„ÈË{?¶“øË$”r9£\d¯F®²„ô ð„ƒ倃7\ÅCqÒ±l­YÓpÈÕ±±° OMM½K*R¥6kÇì÷|ŽÐª5õvmÍnQШ¯Ø‰zO Ü(2ô8–yâ{°XˆHu¦ù®¨[ÐɆˆ¾œÐbúXL55b‹¢ VQÁǦgù£ÏXëqþˆÕU+[µ5„c‰êœ¢NðÆ†”îg?»‚˜&ÇÈÈÈJIJeOJH^»zÝÒ¥ËçÏ_0kÖû3g¾·`áÒ…‹–-^²bѲ•K–®\¸tÅÂEËç/\¶hñòÅË?\ºìÃù‹–Ι»`ÞÂ%kÖ&¤‚iÅåEe•û*«Ú:R.,*ËË/¦œ•·zÍn¤Aç°˜öW¬\³|ÅêÙïÏŸ8iÚøw&Oš<}ò”™S¦Ìš:uö´is§OŸ3cúìéÓfM2sò¤éK/ûñ¥?Âx„s²ÉöNV‰6„;döœƒ‚I’G±–ÞMVî= Û?Ú¿9Èv #(Ùƒð^³~ßþ.$ GôÇ}ûk÷ïCzòpÇBNJeyõéŽo\.Bc~î†+òç’lRd¨âĨ"jª Í_öÑ÷‘7)QUïÞ½­O|”5Îï¤ôØ)÷PÓo¾7wT\:FÄV<ÆÁkÈÔùM}怷(÷pU‹Z¤ÙÔâŒïªÇq'í)¾ ¥û¼Í!œ:Ôœ±„†‡áPŠ"åÄ#:RÔà¤C×$šXŽl“&MB`Z íÔ©ÓµOaŸ2mò”i:Nš4…#8cæ{”§Ïx7--c÷ž}›7oÝV·cذ×GŒÝ¿ÿËÏözŽekuõÆÚÚÍìçøñæÌ™ÇÜESÓ¦ÍàÈ>cÆ»#GŽ~üñ'Hzpûíw’ýàÁþÛ]÷ý×ý÷£vêÚµÛK/õ¥2Rø_ýêW& wr‰@‡\ý¸2 ’… è `œøÿ Õdò-ˆà̦Ø0¡¥IK¢'Ö~yö`Kùúë¯#°BƒÇiÑ_}ñ¸®<ÚÔ®6Q… >êešã="ÜÃ8-½l¤ ƒ%Âþö! d±Â:ˆø{` ë_ü(±)ÂÝ/ jùçü;3èGœdƒR#],Ž8r K‰?i‡3¸ÊÒ,ÈÄy@ o¡=zPæp«“„gh“Çqž[¸<ã•9‰-“˜B6šýö·¿mðáX§‡<\<ЩÖ“x: íÏ|æ3ÌXû°`bJC­˜0ˆ ˜ºÈ䜋ø)„WbÖ[º—°[?øÁ¨±0ä‡À4æ M±ÂcÊá$'÷pVr‚I¬Ø rS¨HQzD+´þ(Äö‰ÊêÀ¦µˆ1ߌ‹X%õ§ ½ ZˆôêՋΗ£7ÕÐÑ )Zþæ=bF%¸3âæ(]šn7œó-’ì¹M}E }>ωbõó!ñQN ?Û:ÂO“p’ O Ž 'A;6>K¾p˜t¾v…œá«Äg,¡ QP8ZD*CÐÒ³Î#¥»p¹•€ˆ«”A#<%©@Hjr†´@6©Éy6ê3‚Kz.pðU8v=ˆ8ñÿú¯ÿÊIÁ›ÞÇr!ÂÀWqÚÜb¦P"±k¶ ç¦,¼8Ϻ^>RÚ(Þ8Ì.þ5iÑÛ ±lb3‘CpRžUšíÌ@dï`eÄ!B8Ž6ÿ¿üå/+AO˜Cà¨3 6H½dþæ‰(èòÀì†TÇOö†4ˆqÌÌÌT;B¿ÿ™ ÆÒ17tIGD\ßúÖ·tÕ8xYfçkõôVÒÆ±1÷¢ZO7K(ý:pÑ|û8#öS¹µ¯Y¡Í!\”ä„cA ¶ÁÀq„uƒŸç`ãpW$Ѓ´_ŠáÆ—¯Íh Â&´Ó¦Ðé?;iCiȬùWò§‚¿©YŸt†» %T°K¡Ÿj‡v¤‡ÓŸzŸPwb߯©~—‘ ̘0È!ô£$ø¢äೌ¯2A.¦OŸNY=ĈOƒÛ‰gÁIܪ”s‡ù†è^‹B­Ü˜3ýË#¢gF|Kˆ—šÂb‹e¾²Ö!“oê¨pªwx ½?XÂU8ý†&‚å+Êä`ÁAŒ.$ϊʦðÙ›—p‹ânã$§i¬<0@Á!×7)Ya¸õæ`–i ©³…pÉpÞœÞx.úZ d6¬$óË;;9ºqž%  ƒ.ZD<° vÑEÉpOO‘p’úz=6Måõ(³B<6ICsb „çNº7@N‘f(sd¤WŽàߪ…„F‚·¦›Ÿ‹DœŸÉ!r;P$Ä2|Ò`+¸GJuI™šUÖF zñ…†mºÊ£C„k!ºÿÍúæ@ H¦1¤DðÆzY¾ÀÀF(LQI ÝÄD I¬ú¡Y"šÈÀ@h·(òè¥t©|/\…’¸’ă(CŽóPRÊ+V¬ ¬¼2·\ʨâ ,"e‹-T¹¬”%ÄBÎ C”á$Z´ šyÅüDDMSò»ÑÔd†Ôrž Š’R MÚ·y«UñO­þ<‰oËPJäËšÉ$ý¹`Á̽šŸÖ’“oèì—¼»víÊI†–Zz8þD£Lb±“zi¹Ã–‹Å ›D‘Jˆ)Ü×¾ö5š–¤{:$ØL!.°bJÒDûÜï å*ï£O*sÁOg‚I\©i¡c=ÄŸœÄ^œSû”U‡£X½æt~›C¸(Vl?Žå3C™>ˆT‰Ô…†ˆRfÉ$ǽEqi>8Ü-~a’@ñëÛ톸v¯.u~_¾æÛà6gÎ…÷ƶäcK›Ò¾h™,áË)ŽKlØ} ®‰/ÊÂ<“ &"‚øÉH\©¤nF¨%0ÒV*â ¦XQAj!pȬh ¦K`™¤Þh”NNÂ.b3)Wlû0n[3…C¬E躴´4->X¹*'£€ÈW Óñ€”]âÔÆ…á`)Ž‹:& ¢€ðY*4Mh :…AÁ Š 4ÎpC5»¸¸ÅQ˜¯ÁXsÊrpä5øÖ:š?läiR¹¡‰Ê³Xúð>LÝ¥ôrZi!P5ù¤oÕrbcÔæNÝ$[U,`ÑðøØ+ƒjŒ%2Ø8x;6®J ™¡¥ë Z8òfð%·ôï:¸Ú¥¨§ø<\sìnOl†…wµBH±¯5õŽB¥q×Ú<Ê ßlêü L´&Šf´Æ÷ à’Y1˜¥ë|?½ç›"®H[+tÎ)ýÈ Š@8œ”X4àq„”’oxÃõˆ«~#G”a×X©H$éT Ä:ÒÞ´¨3Z·0pk®B}êà1 †Ê|"O‚ÿŸ´WeØ/JäÞ°tÒ®¡ÜEÄ*T¦Ú·‡Ò¬R"ÓB•Hk˜D áã 6½ª“5P›C8}„æ2Â`|õ«_EÜÌ`H&)œÃIõP‡¢Ä26ƒº£¡U³®Æ|^Í/3£6æ·ÜãÄÃ1½øÕ!M9¥é]Ó—7ª„°n3¯)jJDeÃíG]º¢b+Fñú)°E-•¢4jö§b€éO™Þù~§ÙX´ÐÏa W’° O!þ„¯¢ŒF¾õ7~t2h‡$6Ë î|øduÆ­–Ȥ쵕0p˜ iÕŽØÄzm9ã×C•=™2†Cá e<©»x,䑯åþËç&^–# +̆E:ÀÌ#@kmjJÀÉPJ˜‰ šÆ«úþ”Ì™0¦ÉqL-]@ßÑÅäëCJÉ(jC2I”à ³¢ï~÷»ˆt„Ò12ñí$ýrS¤9ò™Ã!V³2¸Y0É»!¯· î8æÊ)RÕ¸+“I*ر™oIu3¾ ·|r5=¤Â…Bq Ò MÖ²µ «º]ÑèÙ,Ú…u¤nTe?'Ü)ÒÓ'á5£‚‰|‰)‡ñ¢ÿ틦Àf ¡ÑŽ XéÕµà À@hp¹…š6¸H­pÏ­šæ¸­F´¨ÒƒxÍ%ÓûúK(±†zgŽ6Qõ¸(ažß„w³¸*'ÜõmއSOé{fд_rÉ%JV ߦµ NŽXšÈÆä¤lâÀšn‡ÃK¡lÓ«¼!(œ¡pÈM5›n¨p¹ñ 6%7PŽ:œùWå:ÂCn²‹a6‹ EôJ¤16–r,Ïù¥šj¢D!wÂL¼Ý([m9ùªÔZ4‚£â•À~‰*ùï/º 2û}fÒMÙÔ-"ˆ~Œ(¡q‚¦¹´©eDÙÎð *c+Á]\å)á<<ÆéD_á;›Î–#þpþXiêØ8 G œ|ýqÔmë#Š.ù¡™ ücüÙð$‘6[YMÞÇX=ÞÊ„&&õ§¢lš¥özüfN’6‡p¦EÐpbÞJÔ"¡xÔcöÆ;$Œž’¸Êaˆ¡-\?±QІ¬ Ê'À%œpô¡2v½lÀ'·ÓöKDI¦Y'¤2ÒQ¢9³ñÁ«€í,† Bb’D‚EÌüÙˆïŒ=•B?cï‹ã@‹_'( šòçMÁëˆ#'`‰/È ùÓ|bòñó›9cŽñ› «µDh¬Ñ„0ß0àÆ¬Ž‚tÜxõ\¹±5Jìô‘Š[A|z<¸)0ñ G¤báv|Ý0A€5ê¶ÑvzœDÀ]ÌUµ _ˆk”LÒ™ºrñÆÇŽ»Ðç±1 ‘+0ó9b,Çw¡Ê´Ì<ÄÝ gxIa¡‰™–\ØøÉ…™ ?*¾æH«Zb8Z§MV,,dǯFtzS=]Š: ƺY/q„Ã6ÒV0>—f//ô²K–œ“Œšõ×Çv£(‰OUÌ–Dõ%J5á †|úÓO¨Ë]öò±’3µ9„Óð˜ #õšR*l ð#"FøVç ¨0¨ãÛV²¾C¾m5Á3廡 ãdÏž=¡4ŧŽa Oô/ðŒœç‚v¼€Pœ£ „ãõàÛn»Wä(ƒs PGA,&G6´Ê×]w, œ(G¨^ˆp­C†Zú)¾xÇç“àÝñub5‡4}T ì± 6Â;ˆ‹‚\_ð@Â)JuˆÜ5 N“(¤I¼‹àQ¸¢0%ÀrNð†2 ]éüpà ‹}æ³h.³›u ¼ŒUHrÎ;ðàçÄ4,Ýä¼eÓcºòsÔ B/òh6T‰mÛ˜T’’{‹Þ`ˆ\-Y2É$„ê1RBã‚‘&'&²ÖâùŒ÷¢Y³²™l|9˜§Õ²qçzº/ßÖs}SI³R³Æê§©YœAš™nªr”_Êñ~hmጕfí)¨PVR6 GL8'>ÄòÙ8` ôðÄÉu|ùƒ¦À—ÌyqoÂ9œŽÂ91ˆQŽl€áPy4›P Î’Méx@_!ï©‚ä¥l˜6äŸðmlB8à îMâÖáŽ÷“ˆÛú²&`êÚAæÀ&-ïL$\sƒ2³$#’eX%PŠš˜Sr’ÉI;T£2|øAðS” 89É‘ °ÖVt(|xA> èR™Lt ±’üÉD¥À—¢:>!¢ 8‰ÞD™„ó &k8ÔuˆÎ˜Ã’ª)¸"OAüN–¹ wxSBc¬\¹J'-`3©ÄíÈùŤ.e\äÅ1vìXz ®ÝLLT,f¡,ŽáÅ_úM§RƒÁ¸s "Æ”Önˆú ¤Jœgµq W|D±OAÓÁ„ɯCXÅ›à÷F5è!ćTN—)–é¬f”•3¬¼yVB 5Ñ¡0”ˆ[™'L0*HÀŸˆøY:·3m?qIÈ×LÊ6p|]` } “–(1ÔØcáø’A#æᙥ$UŽS89Ä/’U‚mª·ç#œ@lƒ“£)ñpQ=EYßpþgmË‘9jIæ`ã 9mÐ&ØÆ$Ï B8T†…¤ê£l)ËC„;EéZÔkûŽA@” ê˜TòÎ3¤˜¨Ø=²ØâO4p€˜¡%K– ·„=BIË,•0¦@~n‡hRâÂ\¤¾/À%>ÓcOàW< ÌäÒ™Š‘-¼‘çÝNGYz/„B¸¨ HilŠÂ̸°¬± M Ú.ÊF³t8hT`eËdÑHA0)hFÙ¬C&[~Px^€5Ó˜1cð'fv1ŽXpIÄÝŠâÍ&1ȪhdøäqdÊñD3=®Ó-má|S ºþI ("J<À±,URo_)_¾²{ú±áÉÏâTù¸IÌ-%3T“ÆQx£&™¤mʉÊÓ9Ï›€pÔa)Ä+qÌSU0X¢T–E°qœ1ÖM<À&» pr¡î„¿Š¸½ÑWõÃI£f¡v”ã iå!1F¤ hðI¢,H#YÃHaW%øá$ ä£@¤…˜ö (Â1( k|¨¤ :EÔJ&9Õ€(ÞAàS™oʄϠYÅ?ÔFvCŽŠêåû‚^C£}f—Ð2TM ,Gf¾0’KÜÎB¾9-âv@åÅè mT&‘ Ì¢¾J ^ðpô'ª Á+`.)’2®* DL̺â‰Õ†d Z †Z  O†Câ …œ0a`†A“iÝ$‚&Ã-Àj"úÔãØ8NÂk2= Dʬ Âf5æ ŠH —;ͦê#3§><¿Ž ê[Q6G'×FN]½u`‰”§Ûôp‚I°\Œ Ø /SUVŽo ‡{92Q¾ÀÆàˆÅ Þ´QæžN™q¤>(Å;@¸EðÆøñt4p0mJ,.Õoˆå'¯Ä º' ÚQY¦,3P„<ܱ‘S¥Ž™–A”)dŠ –½ŸƒØGȧ°ô,Þ!ˆÄ$†!ØÀò–j,¥!‘D‘‡li1NAø6äZT8<¢RÞ zbUN ¬¢ˆ±$NtJ‘áðD !vÐ>~ÊLÆÒP>Qa>=Ò€áÖBSH>à Çèð0l–Ëe2ë'È™÷i¥;U†8ê=%že¬&ÄÊ…Ÿ±¶µZp„,h€¸HÁº òà¦Wi^»$LfÚÀ7sÁ] %þ„³pÛZ£€p¬@;qrÀ!/ 8[l˜|3RÂÈ7Þxƒ1¢5ô©P3®‚µ¬¶0’ɽ‚T‚jZÉ;‹¥ëa6?Í™¤™l\E8Ö‰ú$¥”ù"è‚ ‘M Ä@2]`¤¨Æh0Tc&IEÇU–E ‘lÉ9XòÑ‚[Ô¤Y6šõK2ׄ· e¥›Èt|B6éáx7iàx´”…ð—¼-0o¤~c†~Âi*³VbA$¯ƒáNQÒõÚæ-?!»*¢ãë*ÌžÛ7ì–öÎŒÈu;4ËБ«¬ËìÅÕ¸´_ª©²yDÙkƒe¾VÒÒÙ‹™V*œTS¾íŸÿ«U“M¿jm3Ÿ}ÈrA ã×Y¨o…úÈ/¸à’`ºÁy¤š ‡¬N8¡‹ Uðh Ñ"ÄŠe Tˆ•< h9ø+!Žæ‰I))+¡ë!= ¼ÿ`æHS€±’d• ‹**ƒÄÊÜr£â­ˆÑgÕŽé¬"ŠÑ>KxJÅѵÀoMŽ÷snsçÛÊóÑ6t´D‚âœ8ÊDö€rŒ<¤Ëå'ÙX™‚s  ‹bù HªÉI0 ¥82iŒAä^ð ”â´|ÊöÙ&B'š‚‚gB,RR¦n¤YÞ™w jdx8𠄃Ïã)@& (w!7`ö„ÞÇû=Äy}ß®ÌÉìÓ¢fõ[d±fÜOSG(kGX"¼Qœ-áŠG{ºt?œ1`Sýi®Nf&. ë×W˪©fy¢~˜'<Ö-TóíHã|€Zâõ´ª<™ À€™S§¤¦¦r‰Å±öCJ‹ùÃ0^òý h2ì5Õ4r$[)´ Q'è‚ÆŽ:JáÍU¼—¡)s 1ç!YŠxH™~5Œ>„”Fàùdd$¯8*CÙx©÷ TJ…Áô©‹Þ'"êäv©ŠÙ,œfsÌ)Û©ï„sÌÐÁ#(*È܃)xÈÖQ c ƒÅUP‡©ƒŽ ˜Qƒ—ÉÆI&'À›*³,¢&í€|2`äv*ƒšæ“€Ôê–ðp¼ Ó”gq °j&0òŸ£) à" Hæ l%wqäïÌs¹„¡/ ¢kçx#R‡ôki‰Ï2l3ì°Z®|ŸHà?HÔ`²jÑ Ð‡‡­¿âiч6§ñá8¤ƒUÂàŒ°Ùà$„ØXõpR|À†½‰\€:89p (â^àJnmðaiA6&R¤pò´ãFZC§(Õ¸7XFn‘ï9•R^CÚ@ ¨sQ‡H¶©×‰ß Ë4ÞP¹C„kÎÞö@ö@”Ý ‚eP‡O¾^)ÏÂbE6½qîª"Üǧð"€Ø¢$ Š` tAŠ(饸74ù”ÅÀm›0†?Ñ«E*Ò5Á*‰@%¥äAœÔ½È»áº8¢³…Õƒ9Û8R_ð|´F›"ì“Õ–áçp:$@(Ä¡¥_¾ Ò‡ÉÎ'ö¬ækËZîµC„kD8!™°¦ & f „åD±¸àäÆ$³¥˜^œ„ÈI9ÀH)‹YšP«hSŽäÜ˳Ä2;Qó¢äY šâx‹(ÿ¤ÿ€Kiû8Ò2õqÀT Ñ6bIÞŠi‡m7¢s$é!µÜǶöÀÉê?çŸÞÁÕÒo¥gv¨Êšé‘ÝÒ¯"\#Âò €uÞ@,±eÀX†¬2°ÎQ'a›À†Ê2Œð¤‡Ïh¼Ã@26aíËyœ#†ÚâA8ЄۤÏ'ƒL0LŽÞ4Âá{ C‰¡š6 &ÁBœNÐ?c­ ?‡õÜ›l)C„kéO(l?ì“Õ²¤íühX-ú22gU>{PTDï}ãm> endobj 208 0 obj <> endobj 209 0 obj <>/ProcSet[/PDF/Text]>> endobj 210 0 obj [211 0 R 212 0 R] endobj 211 0 obj <>stream xÚ+ä2P0PÈå2µ4Ñ372s`LsK# ÇJgp…+äqÕ- , endstream endobj 212 0 obj <>stream xÚÍÛŽGñ}¿â¼€‚ˆÚ}¿¼"l#‚ì,qü†D"”E‚þÁŽXÉÙD¾ü|Sx ªæÒ3ÕU3çœ9 >²©¹N ´Í…ódbŠ€G/ ç³*ú‡SÑ4sßû—Le—\RÉÙ‡P”µcûË©]z¿ ‡VoáÄ® ‘RŒ*˜³ ̨ò÷c|82“„ud l•Ëž ””³‰qK´%€Sqr –è4„NW0Dm˜±1^yò‚1uf@à£H¬Àsà«SGGô—œyp?ÍeôJø!Á‰lFÐ º¹iDêüZiÏGú”Byˆv\’ŸVÏétÿK‚Ò6¯›’)`çaÁ”À6@W‡š’µFiãWléÞ·àJ”l" 8`~-´SßÖ~ø{ڜ۩ÈÐ:ëeƒX; …ù ×ÔüÀ;‹uÇÑßññ->žáã¯ñqƒoº>j!Qy™^7³—•Ô‹ÊË¢Øbΰ8$²Èõ¿Î4bŒÍL퉕3ÑÚ‰âM7 |¼ÂÇW“PêãºþáÍúdc‰å÷ò$÷oë£[Éß­ º;gû¹#µÑ%´‚ŽîùaCírÎ5z!"rÆ)%<Ý·QÏfÅÓ,ú"³4Ap–Í´°8Pe•îÜÎ1ŒÍÏ¥0x\6í‡s§Wç,¯ÛÍxâl^×ÀúU¥ðM¥ð¶.j×t›ìl—$†f‘úMåæfÚWÒS2œ-etÞÈr³9x‘$è ü]2 š–4óWÔ˜àL-ªRÞØŽb2ÿ$Tx†7’z·n*å¼E»°’<ÌÜ̇,'Mt¾ -àf§¬æZ˜p^ÌÁƒîÏ€“Äȃ…9FÇc]€³Yvé}¢*áìcS>(ÐÝP¥~OÛAyï$zÒ°{ûså¿öQQˆyí¿!ºdÿ&xaà×ÔªnêÛ»6Íe<Çž~Ó°ÔKSTW¡q6=ÈòÚ:)gŒòÆ‚•ƒ¡³pô‡ ‡_öÑQé‹ÛˆJ¶#&sâÇEZ[X¹í½"öÕ‹î- לX6JnxÏäÈìÁ¤ŠI2økêpFe+›Ã«ÊßwÕ¢&q¾h}L—îÀHŠ·C^SÁêåàÇo† 'ézüp¶.jåpª ½qï:ÁÁ¶×ÃîYÝ4¾äk®+ tØâ˜_÷lö™ÒÉÙ!f Àß˹Z±jàsQ9‡õªA ´§jЂ‹UƒˆIo¨´pbÕ€¸X5h!÷T Zð媛ϵ0%ߟМ_ê²Ñ ó)‹¦™Ówm>Ò- ‚4”@±휒Ôà¤ÃØ‘xm ÔØØSÇFN³B§Øà¤Ãu~ß©Ã0'?P‡«±³R°Ðу“Žh‡ÚðÔ©ÃNÝØAŸØpi¦-±ÁgXÆô95êÞx¬÷\ïq†)µ–´Í@¸¾t=VÄ}b#Ç™¶Ä'.úœ#õh¡cd˜íšp¥Ÿu•üÈzmŒÔ3æFêÖt?'Æ;zð©#•a|įCëˆÜ&ØrLÎ(Ç1i.b gPMêÀÃÁðí`Ù –Sû¨-¶ËEÂR,²9® [à=EÂ\,¶@‡ [±H؉EÂuEB6‘Š„-ŽX$dY,¶{Š„L÷³"¡Yð“»_]ónæ?M¨M™5 ø.6OÐzTÒ-~Rqm¶Ž¦e¬ŽylfÈÁéÏ•"ÐëMþm-<''ænÌ "G&¼œQΕ;›ZÕ!Ò þ uH;]‡ŒÞ‘:¬³Xt Il&™ý ¾f¿"Íà›¹& &Ì´‡–S’J£"œ•àôr:‡e.QBÛà\=¦ªûye`J¼ Þò$%÷ø¢²2%oohþäÍñTæ·`çÉ<æ_B–Òü[´X±Žgèk”±Ó}ÑÛèkp&„•9Ý™ÄöÞ3àò^YZNV¯‡T\XRs”pWýÊe<Ë mƒ_qU¬•p“`º-š\|‹V´½‚©êM~óù9DÃØÉÁémuÌà(m¢„»î ­PŒ„v¼¢M”¯3ø‹iuʤ ÄáVÞ­ÏÐÈ _§ÛxKn«‰£È “×öû‡|þ¦(—|;Òa& ëvîºIÃ9ÔƒýhLš)ÎÑ=cstÄëŸvIÝÇß—ì®jsj{EgÀPrn1…šY%{:àr(J‡kuÛD=ˆm“TKÆt]´gèù”±Ó]ŸÑÛêûÓ’Ë…;¿W*ì÷BWni89õí$±¤,œ™8ùõ£3ÉkCô`ʺ“™*Ä{-ÆœaB¡aìd£çô6½M]8£o8¹k£çä1zëx£çÊ’¯‰·pÇ]L,lð ,OÅ3L4ŒîAŒÞVBû,Mð¿½T?9V:9ÆK#tä¥{—µòÅJTŽºh<ݹ *FÎÕíšÌ?ðñdÑÓ¸R7|V PÙ4Ãj!XP6g˜ih;ݧ½­>…÷’LyÏ>Õ0!ûÚêSœÊi>ÕÐÛêSUÚ(~–øÿ~3Ù.ìCMjyjì;+Ç`V¾™q ‚.Aüff²û¬€»ëöøsœ}÷pŒUNGEšlUNg˜j;9qzC‘I¶»bó^CQË„Š ¡H rR(jéŠLH Xw^±¨eJ F ÐшcŽZ´Ûm†×®;K·ÂyÞ˜¸ýhˆ ïµã}QŽ´(£á„Œõħí?÷iÑ–Ò¦M]aƒŠœ‡›¥©TñZ¼^Î0SÆNÄŒÞÖHÜ]2äGÓ#¿F<ìëÎ)¸:Bdƒ7ñ/.~ð“ÿ2ÇÅ ¼@Q°Rˆ¯ó±7Æm­’wŒÞ)Ç2Áį3[¸¥¯3[¸å¯3…‘7IÅu_×zØé©âÂÞOk<~‚…W‘[ð;ø²ÆGß}ÓÐ>òÚâ»ò>c°ó–£?­ ¾tÙ2B­³‡þ³û—.þÐ}çqÏÔ_Ï-]Š4twS¶‡›uÐÿ‹‹'»ßÝÿûv:‘ endstream endobj 213 0 obj <> endobj 214 0 obj <> endobj 215 0 obj <> endobj 216 0 obj <> endobj 217 0 obj <>/ProcSet[/PDF/Text]>> endobj 218 0 obj [219 0 R 220 0 R] endobj 219 0 obj <>stream xÚ+ä2P0PÈå2µ4Ñ372s`LsK# ÇJgp…+äqÕ- , endstream endobj 220 0 obj <>stream xÚÍ]ÝŽÇq¾ß§Ø›8 â´úÿç"Œ¹K;¦D‰\™v@`áØ”•€”ZAÞä’rEh×–ùy¦8×TÍÌé™êª™3çì ÍnÏ~]Ý]]U]UÝ=Ò‡þ=ùÝî~¹{ë ëÃ裲.>î I¹xøè x­’Ê=xò"(c ÜU~ÿüà³®œ€Ý@ >»IMéÂ'/¼*¢«¿) Ô“Éð¢'žLQQOº%¼èФìBèi¤mñp©ÿ¥çR ^å4p)… KšB›¼p*mšÙüŽ­èÓÇÇoàq þûÝÁߟ|pœƒ'Ø œ!sˆÕ€ç)æÃ“Çõ@kþúä_Æ¿{åSf˜›ø8ÂÇ)ºRaèŸN1Æå]b ÚF‚³^™à.ÓÊ”À[ÄÇ/øe‚eÈ»øø%>>%ðT1žÁùxbQÖð~>螟àã>>nw¿‘š¹(—yTÉÊfNßMAV;¬•ç‰4jUYóFŽ ŽK#ÖZeœf˸ʻ¤U ¼OÈ[:‚‘S’ ¬_Ö¹¾5tÊc5ÍìÐÑÉAÙ§ô7¬É•׆‰üj­œÎ|„Újüù# Î*y¾SGB•Ͱá=¥ øcÑ|¸A ߢÖÂ8$V‡j>,^QóY§f,X¥…©k”žãã5>¾ÅÇ>þ€ïðñ‚OÕ"ÐëE¾«öϺº*ݨ™ì9AѬIŒcÈ­8g(§¬§œª? -÷½j`3Àùho8§•æ ®sΗN ×ñò{‚­òÅžK(•Ú•ÍÏêd½«¿]Vzo¦ô¼¶`|£w¾4gæ?ðqqö@Á¼êìUyNMýá§¡³gbg›Æ;ý¢³lTv™u’βÊq0ËàÛe6bq–ÁW(J³ º þ„Ðö8Ëoë£ÓÐw„,w1çY£N_¶Ò`Œ•ªí¦Ä¸’rC@ø–3ø¦Üþp¶ábêŽ3Í­ „†×1­Ên´ªÄòÿÏV7»²­æôöµÕ°à{fªuF”wÃê©9Ð'ßÐÜð}jˆ8Y20V­²[7Ó•O,F×ÓW•¯£=åªÁûpBÿ³Á“É¡…=­óÙqý5Uê¨`8m•}M5è(€:'a3r¬ò·°àA” 5:8,šŽ¶€WæHX‹?¿a’‡ºl#«p!èç·UvÇ¥ëŒy™™Ñú®¢/*™Qžó.¯ 8«-çu:ÞÖßžU1x]»¬¿õÒÎÀŒFûå8@E•cøi¬(óÔ@øÃñÚS =«ýÛ¨áVÏÀn;'²Åþx*$c+Œ¸Y³ß$1bVÚÈ…ç©lä<ô?:#ËÚÛÚÂó:}/éDYóG?âoeÄÕ àÅ›!'¯ &ßÐ :tt$Í™¶`MKÅËc~V¹Oζ´uÌ?öÝì#úœÁ—e ˜ÿìÁ]*­M,ˆ5 »V—2j-f9£Ö¢ÅŒZ BWQʨµ81£ÆZœÍ¨µÈ-µ>ŸQk‘?ª|ºG9v»FòB‚˜S´áÌéâï£LœºTTN¾O¾º¬U‡ ¦Xù‹>yY‹ÒgaÇÂHöVc@=î EkǺ‹N^Ä1ë ê6Á 3P‡BNfRWzpòÂ¥!Ã>6ÔZá2P‡x˘ #„=œ¼ˆfàÌXØP‡EÜ€ŸòxSG`RWzðɋͥz- ÔƒÁÔÚRÇB4“Ĺøáä…1Cn},l¨{ßÅW7…'[ â „“.›caC=:x1È ¢™H„øáä…1ƒÌŒ… õŒ¡Í 3XHÓ=ñ…1fúü8P¯…Ͷ ø59Ô£õËÓþ¢‡ÔÁæõí#õZØšƒu à>@²²É-d-mÀEÈ2ä)&<1L > ¦Ìq[icF_¯ÎåÖ€¥&p87•0 ¥ïæ^¦£ü=#FS•Ù­`ñfì¹¥Äp Þ’nább¸­I ³)—Ã-HL /s{“fY‘^”ÝMbx»ìnÃk…wH Ï /O oTþLãDßäÄÍ™ÙÔàÂOZT †g¡‘8)7Ñ0˜\ÔyeÓ„Ô® ­ÇÜjÓsO#`pͬD¿ôµ˜(p9(‹ƒ£YA`BvR;]j€ÚkX•œ•ˆ†™A†¥A¢åhHíA­…‰½ß+÷SåCÓ’ß³ÜÍ7²BîXåk–;FG¹ãƒ“åŽá–äŽÝKî¼KËúhþ<0RÓÙ 1Ê,Òö¬ ÚzÓÌŒ…è!ÏŽ¼ÏF¼ãgš\»¬DŸÖ"Ï•ˆPœå#üoÊ•žÕ?ˆq²óå=kÀ|#+4€U¾f `ôwÔ>8YnI8Ñ+i%7¯| 7r‚»Ea: i&³ìèV£ž2qº%Ùl‚ÕÉÚl0¶e„nÔæ›í(ôÃloä Xcfíö\C+õ§Â8­eªåHgâ\ÆìFBŒ–'D·‚Ðj§§»†hîfd®¦Ñõ[/>hnAä=)L= fhÛ~1¦†Æ$Öú_óÄ6†ïIb×Ö¦«èƒ_k ¦y¿&r¾‘&’U¾fÉèïh"ùàdÉpK&’½’‰¤äv0‘7,ŒÔù+käÌw}Þ±5jçaRІ BELs  ÔY€¯×0Ÿp§ß½_ [hd»†ñÊ׫aœþn& NÔ0Ž[Ð0èU4¬!·‡â1Ûüÿ¹Âû±ì†4xÙáD¯àˆÄöòD{¾qEv\ÕòÍéÛ9Ý«7J¿­=§»š—-eÖYGeSa°Wt#þÕª½nóFl¤çˆÔËKQÒq×@‡÷lçYayå}sC©ÉÉ‰Êø7s<Ϫ˜ùíz;äÀ*ë­§¶ZØÜ©­7jKhx¯1T1­­ðžóª ¬#VùšVFÇ…•N^XniaåD÷ÖÎ?=¡j”"µí<5M¢‹æJízϙ҅F¶K¯|½’Äéï&IÂàDIâ¸Iˆ^ÅEkȭΔ ¼Ÿ‘Bãn¾.Û¬k ›³®-nÞº /Ÿ‰•NýA?ÝÂr@7à…ÃQ¥:¢IO#) N11(íÃt|¼IøTàvÛ½÷({Œ ž#o׫Iÿ0= %jtx§+ÚmKó ÆnVs怚±Yé’8œMŠxȱż¬ø¾Ý9ÿ®ðsÚ{Á§€ ÖzÇHŒg2_Qo”x„1™äYíËʹ§ÜñóxÜÁ¬e›I9›ex#ʯèAΙsΔî4†Èd¾ó€0ç“Ü×üÔnÐ0<+È“|¨ÓÅ¢ xð×p¨Ó;§Š0?»íIúCÊYR¿ãéÛ`R¿ÈòÑFºDÔõÓ:¨áäÆŸÓ4ÑßVµxJÛ¶Têö‘´øvC2?Ôã‘ãÙ=«²ƒ÷¨±Âéã¾N[w­ºÅ^r›ÚsªqB²ÁGAº¬µÇSÎü4,8,ªXÞì+¶æÙ‚1¥gÈKùx¸i°™5ñ5ÝéþžrèkªHx´‡OËk¾ÝhþK^ó¦â¦Q@k\‹¾•Ôb>£Á2ǃ=¶†Öy軑!…•Þ…rÔ› Á¸·:ró¢=Gã9™¹% ‹â|¯óüx™Äƒ{.rå|æÊN²½$Šu¨ÌÂj‹ÒÀçfi«Ç颼ÀWáÎn³Ø$40o·éYy\¼­ÌúsÆ-U²$k{§‹¸÷è|°ÁW#¨ ^VRÔâML梊قçûÃ*k°Bš©uzX }~NåM…óŒ½QÃ+m-²NÏeƒ%J¼Ù¹ë œ|0×|¬Í5X;ªÜšàu”X C¾n¢x¥C؃Í\¬ñcb”æÄâ;i~7Aõ&´¥' ñÆd´ùZ:\2øwŽ‘zÅõ†V|’Åè)½›Å=íþ‚JXË1‹Á¯Ò<®­øî$¥(3&O}k>aÔå aV7ѯp^•6eœ¥r÷§Úõ7ÔyQCÿŽmŸà]ÂéžPüÉWOÝ}øuóág¿þ·G_}øåo*|þÝá½?ýøg§?9¹{ûôÃ;7N?¼ñѧ7n«¹@Wˆ-¦µKYg›(vé:,ïx;…טÜ8üšX!d xwÄHTv±‰«ÆûrA[¾¤‹Ÿk‘!3aÿ½“'G§zûÞÑé6'c)Wð,/ëH£‚P`%<çãb³ÇÇr»ø1ÔÇ ‰%ë\poÙ18¿˜Z`™á„ûáoD†”| °øNj{wk—ŒKÄHÍÙgLÕiЋæÙ`­ŽB=ÛmJj#5Ä«œ%»ºµïwtfüÚ q{ó÷\¾6ß žƒÐ%¦«^i Ê€·Ù{Ƭ´Iº»ßÒ"g+ƒ™ES|×˲ÖY^£Ó8ßP¯#ZñA=_o›,®c2µ7témo€Ï¾¥ØîN÷^oÛìYe]#6Ê3ò-M‹ën¢E>¥ ð4Ãz#¬ ãedy—»”GK‘GíüD›ÃZáBÏïµðoš#ÂÌàmºËmŒ3ZÙ}oάàp§Ö*ïã§ã…“=#1§\†nµÿŽÓ :icÞµ8a€âf—â1ŽFŸŒ×ž[DŽݜ]ogB]-pW!`¥p`;[äܱQçÑ5ð­Ž? ƒõB=¾²¬ C!ä·q¥«G±õ8Ìka¯¾@ìUX šš¿ RAs38S†“à Œ«CJ¼{ «C·:òÑl?È6œAàuW¦¤m_&ps9Ìä!Ðs ¾˜%Lç$×yI¥¼¡Ö2ί18[H]c¤Ðá’šx7~œ`ÞÇ5%BŒ<õqï}tïÎÝÓ»G7nþì£[§'¿úøèôøö'ÑϸظåA­Ó ¼Ag\Z¥ vE´\cëiü¢Jð•°^ɬŽ*ÃÚ×RYÜÁÂïÆèÂê̦áñ~#î~YÓá²pKlnó qüZÕ"“„4(XÙœ9o¥OWË âÍXHƒrß+'•ŠaTÎè×:^Ê}ð<ÎÂ%ðÝÓ>óß<Ϭ­(8SœíÄ„ºH ÆÈ=Z2¯P ¼Ê™vÞ‘O™4›R¨à’GÏS´gölI ×î´ßÊÀ/‹µu¸-E/J—ÈK^ÄÓ-|?­0¾ ÜÚÞfNð2¼¶FîÏJ[RÀ§ñœÄ¬ Dl×}haf´THÚàßAÁ;øJþ ù–Fm¬µÏf4ÌY¹µ=>¢ƒÇ1°lèÙVÌQ«­—ÕÊÕ8­£¡ùS›Ðàí¤†/jÏ´ƒzWèîÉÛ¥Û ?ßRXÅ_áã´ÝÇ?ˆkr·ìðþ¬Xõñ«7ë¶>)t×܇î»5 ‘y£>oé¶{›Ê/øí­Ñ-ú pnŸ %~ǧ©2·¾Ãü¥”ÅaìlÈ2~Œ±dÉÛí¶,QU¥*Ô{õ*aήoÓ…U”4ñ¾6M÷]^³NP)–ÇÙp¡ýTgDšz+޵IØáWld´ŸË Á« ƒŸÑe{éÈ“ÅOz˜ÌH¼ `cÓgv³lÁ/qóNmY.™ßâ\î>£Âç§7Öçí–9‡nÙV¢;xøeC·ïÓØYäÌÑ/ß}ÖíÊ“ö¨•ÕNž¨‹…ÑX¥‡c©÷~ñû/ŸàÖØÑ¿þ§Gq£¬nŠÜýôh1FœZ§… ø¿kX£„ºZ›jש‚ éçÔ]›ÉÿÛî{¾­|1wÑÏ}²QŒ®i“”ÿ†îkœÉzƒ)ò óÄX*© ÌiЩÅî 7¨x¢ä†Â\Ð n&ŒZœ7áÀ$Ä~¡î˪€©ÓžÙ‰Y¡à’XFa›úetüm£}'Ÿ?yøûÏ¿|ôÛ›?ûBÝòÏ_=<ÁâŒúY`ñ”Prö-!ÿñ‹nܬ¿_?øxtrðÉÁ¿vŠúž©t_L+¾û©L ºûÞX›¼"ÐMýÏî~tÿŠ_]˜ endstream endobj 221 0 obj <> endobj 222 0 obj <> endobj 223 0 obj <> endobj 224 0 obj <> endobj 225 0 obj <>/ProcSet[/PDF/Text]>> endobj 226 0 obj [227 0 R 228 0 R] endobj 227 0 obj <>stream xÚ+ä2P0PÈå2µ4Ñ372s`LsK# ÇJgp…+äqÕ- , endstream endobj 228 0 obj <>stream xÚÅ\ÛŽ·}Ÿ¯˜—ÈSdñþX+ÅkµÖ*ÈæI€mV€ä%ÿ HF, ¾@ZðÆŸàb_ØMVu÷ôô̆¹êžb±n((Ñð&( PÚküѨn³·pÛÜ¿H13Þ3e„ ¤coº2¨qñäÈŠîeþ“†ÿ¥áë2æœp&ÖsÔ_[Yâÿ_Œb„bˆ>\±•çÖ¥:¡AM´ëtr¸¹©½T»¹‰Rñ‚¡þ¹ŽW†e+Æwix}„ bÎ-š E´•ëÜ à…–ÔSã,qÇR_¼nئá6¯÷¦Y¯XÊYá=¯™ó •,h„gÍh­ ÓÆôZ‚ÐÀŠ4Y÷—¥¸È£Ùp?¥á]¦ùìÛ‚¹ó¬æ¯p€ßwËØr™†ß»1“ Çpú¯2“ï3“÷ixK,d¬&a ÓñuãëÄKý¿ ¿*ýÞ¿ ŽHŒ;c2c_‚àꔨɶÌ-ZÐGB^%¶(Œö„èFjYnvÄ« -”Å$£PÖÕA¹‡£ð)3ÌŠ¬H{­¢)1)Ja‚¢ê”ÅCtB*C¨šDtÝ,L’;€Â9ÔP%n¸Œ5™äÚ %©;=-óÖ) PYLÞži*yƒ×˜6&d(“w@,ּɘÜÝXØÏ;T§Í©°÷šÅ³Àׄ»ÖÜ ÷K²´Q"jmyP¦ÿW;Üg8ûíQÿÕÎb%¦”fï´Æw$f…DÓ°è/¾Ü}ÞÜðé]·f8°j<™¹ÓN(ï °t ä‹~EðÝKîöÓ~2½ÓOß ¨e¿@¾H ôªéÂ>ŽÌX…Ñä÷.`J<º$OòpI¼j|ª÷4™=lÈ3LÄ’JÑÅbI„<1EÕDç –¹IcUœ"? Ql°_Q@ÅþcI„6 ¼ϲ,׬ÞáÔaŽ,ùb æ=!º¤æRZX„²Ü‘XnDGmº¼#-rÅ‚©žÈìÈ~‰J޲²ÀÒRZJô,¯þd¸,«†ÔŒP-}Iš=\•I C¡•%TOhpÿ`!¼Þj wv4X-/1§àŽÐ~A-ˆPKy#¼:B­ÔZuZÒâ–'„*;÷Ó\Ú<¢ËHu„lZŠx€lJ+aU_Õ-¿Öü¾.Ÿ Xt5³³‹$›.âêyÓ\òŠU•v0®(lWqêºFï®Ó}ü·òãb9u0eŪ\I–ëtП°P r”ÕŸÌFŽ£ë×m*ïñzª“Cö;“訓Iˆ%ŒG\Ô¿¢%°ÆSœµ%°.°œ¸ †Ù6 #Ýs. VÍ:éq‰«ûʱ Lù…kú†h¸‘­Ó_U^—6ÔMž%NÚ D4¦Ôhç9UY*:_J)ÝD¤È©ˆ!€De$k”x$€Yí …e¥Qj†Ç·¹‹=°u`Zn¾­‰zКœíAk"ìA׃ÖtÓ=hMyH:/jÛƒÖ4lJÔa{Кê´žÃö Ôš3=hM¼Ðƒ¡¹”°Ðƒ²2p=(k²étÖ¡}J<š=ð˜öàpÏQ/™F5 'i(L·Ÿ©NÀÑþ;eÛôeX±‚bï4ô£è"#mÛº ]ohÚDvüÓEß¹¶“ù;RêâŽÅ*3´ }ó‰ÙzœrݧýdîN;a|›Pè.›O,lÃÊaÞͦ.r2~¨0×DÊC«?e¿R6“Í 6&&vewk!ééÈìë²Ãx T¾›ëV.¦î¨¢úKIPXàUŠã§]±%-LJI…9,¢Sx¥ä5'ˆ¶cÖÏ R?÷թĨÈïe àøÉÄ®‹7>eÑ2ŒôLXå %ÛþàSÌS…¨ €›$µ¯k*—R$+íf©þV„ŠkÛd é+TRØ•s€Fí¹Õ}EǶF,Œa¯á¹°„H§D®²Ysl¸2ÝšÁ…¶14íÑ:\À<æu—p²ooº¡ì­Ï¿º—ÉÍ}v§1ä˜J6Wö\FVUsîdU³m9§SO²êåuˆz®bok?WU¡îê*(!ËuX~Sb÷bæÞ¦òJVG—õ«RO³…zºçÀ†Ñrkkf+ñ%g•¼þ*«,öø€[ tʶ4`íb0ž­ap ¾Í'Çoò¹hsJy[?vÇ0Ñ&Ÿc~—û¾”Þˆ=/%à…þ&/û6Ëó’œ,+mE`7×}¾Ïç² ;@Á§²Q„$O:ÏX«®s²ž\ƒ9±<§æ—Э\2ÿL€«ILTˆÛ¯'Í!Ï2_9'\|l¥¼Q3…êuS#öÉܰ6¸Eì r³üôÖù€Å^ô†ãSûKñz×ç: ¦zÞmXg—’@ ²4ª$`vÉ3æœÉ&û¡áIß”ðÎsâªù’c•+\5©m1°ˆ«”n®ÒùÛ©¤¯K¸áùnìb‹¶7K†-ž7zÒÍa*úœÒeÉkKxF¢±&5VI¶‚‡¬d•p Ík~5óy f~cgŒj6 ÝÑF]eÄ:œ.<çó ¢eûröÓ> ú  äòÊ}Y~T¯£òÃgSžbô¼Ó?ÖTBòQÅïk² ƒ¨Õ›«sï]v‰ 0#·œ˜ÝÊÄD柧b6Ê£QüÉ þôVP:¬?·ü:”?ž­â?xƒXäÛ 7ËÈw$’R>Û”êy·HJôQš9°çʬÒ>¸_¢Ö>uG4ç9µú Ã@¤X¦‡‡=eý?Uëk#œ‹ܹ²ÔIVŸˆø·yhšŒ· k4>ØE &dë ˜L?‚ÙØ¼ÛzjNÈÎ/¿–Í«ŒçBà“¹a€·¸Ì b³ìˆxÇá/ÃgþR5ï~¯UA¥å\›%Ïg±€¥ðâ2fþX–®e-ŠÆ*Å¡ØêrT+@f ÝJ,$óÏ&éë¹Öž Sø§WÎ-?øôÝ >0<™ÐpƒXøÚ 7ËÈw$R>Ûàêy·xHý¶€‡õçý[³ƒÝØw?þQL9Óä A›Éÿ-;_Ý|Í@ Š€b,ÁQºuHçŸ BŒFËœþ.}MîÓ{Õî|Gp§sÃ<nq‡X[äfùùŽC@†Ï&dô¼Sdôái2ï‘7ïhFWS>½|?ü@ùƒ *þDNÝ=qz™Üò‰¥[ƒtþyp$½æîËï¶œÓ:€;%«š¯#Ú³áàéü0ƒ[üÀáÖ¹Y~D¾ãpá³ =ÏŠƒIá”+Þ°ê%¡\¨ ó£KÅ?ÂÌׇ±Õk‰3'Ä í(Z×A36–$okpe> endobj 230 0 obj <> endobj 231 0 obj <> endobj 232 0 obj <>/Font<>/ProcSet[/PDF/ImageC/Text]>> endobj 233 0 obj [234 0 R 235 0 R] endobj 234 0 obj <>stream xÚ+ä2P0PÈå2µ4Ñ372s`LsK# ÇJgp…+äqÕ- , endstream endobj 235 0 obj <>stream xÚÍ]Ý®$·q¾?Oq.ÇF¢^þ6»oi¥lIk)É…Ût(7yÅ»Ž…ØŠ!É6ò‚É#„l’Åúá 93G‚fÙU_‘쯫Éb ç‹;}¯âúÞ«û`Öeµ÷?€Êô‹_Ü©ûWÿÿ~õó»«ïßû×»âê¸þo¿,|üÁÝAܶlÖÜ?Üy§–` âóV±/ö¨8ÄkáWw¿8*b#¬Áú¥âs\±™ª…¤Ÿšyw4óo^ݽx¹Ýk}ÿêÐ$oíâ‚¿õp÷Ã×J)>Ì^ý3íëâ#  éãõñçke}Òxñ2B.ÆcÚ¸Eï[TßçlUןUÚ"­h» k¯•YÓ¿¿Moqó´w‹Ùv¡ñ&}|™>¾;þ":a‹ƒì…ÎÓÇ×éã«C륖]¡ó›ôñßéã"®Ã²öú¡lú÷÷éã?ÀÒ[0Lm®v1 ëÀè×b@ÌêÌ`CKŽqúF±Ö-[¼_ßþ:Fî[°†Åj9Æ_ä‹—–Ý}²ëý¤Ñ:z¯•6¥¾ü«S}ü[*o­Wkù·”µ.rŽÖ+Œƒõ}Ÿ·nß§o¹þß,Þ{ðt¼M+zžðàm.¢lBæ½ôñ~úø yB÷Ň]HH(¯õâlB‘Läi?žWo…Ü_¥K$£÷ñÑSqÉ¿8ÚÍý€è¬z Êš™£V!³Ò'Ø,nÓ²;¯ùs®Ò]aRŸ¦ÏÃéã§ô9·QGÔK*–°›ÎhšDõê ¶E+y7Û}JÄ­^ì&À„öE9HÙ!$ìý¢Ý‰6|Ì}N°ý!ûûôñ3"}Œp8CÍߣ»lì_m¥¾ËÇ÷‡´þijDOìÖ‰ ëŸq=™—â‹ÎXãåÝ€T6>â{§‡ÇùKøë¸]ï¿JïäÕD·æãüø;Ý8ßÞÞŠC•ÓÝç×{+”éÁºE‡ãB~C45èTdqTaÚä¡êäC™øö.è!>tâ!+²8ªÐÅþ¡_ yjòAüÿ—ub²c÷hâØŒíÙ—UíÍ ?y#â ß…v{à? „3“]{ý#Jôäp„ÐßæO$p”Uk:2Þ,Þiý5• Ñ…8!õ ˜'Þa“½yG S4lV!w€½Gœ¨rÇ›ãl7´JoîQ7´ŽƒNu£¾YûTzћŞÖÐW·Ñôoà•f?xŠ Ø”¿úõÿQ's¶×P²´׊à8ÌÖÁ©ú¤±‡ÏOŒã÷ûÑÇG³.éÚ5M˜Yï7Kô6Ä>}a©869:wþ>ÁÖv‹!÷ÍìñÍ›H.ç;ʨÓ@Š«Ãïì·§SYOÿÕ¶?½ðþÄù¼ÞüÕÔ5«ZLr€çrêvŸ/ïuü)ò-®Ë•é6‚ÈívY>3ß“]~ïÖ^㞜ɒIœAk¿Iâfð&Þ¥dZFU^¼ŒM1dáGFÅÉr€äž¹ø¬Nȼƒe||ƒ%‚3™<­Ã‚q&°ú‚Ÿ–/ÚÆIt|döÈ”ÜvRuôBËU¡Så`7²h'ã;iÀž„pÂïd€Dm‘¯;×Ñÿ˜›šgaí ç—ûÞ7pÄÞÌ÷°u¶8ÕÐÃÎi™¥Âe½[×8ñû§nçB\ÉÁ{‘ÔøJDL¼Ý6ÈÆ}×KçÆÑßwú\]YM—æÒ¡'ï˜Ë;ÊßBt¡÷|tâ >Åcœ;oà2çã \ºoàB¯•µ½x—£A ç«y‡’'®Ûã3Î…Vº4ü”’ÇÅÁ–ÀrM¡Sdj•}>½è‹ZT|’rÁ-Ƹ¸ôÑ^/qµ‡+ ÈÖ’^öàò¢©Ò¢ ?¤Rж6¬àåÃX…‡Š Jí%LçáÎ8Ü~k1‘ÊÄTTPa3Yaj±BcÔø.&£d·Û8JOX< …‡T¢#åãJ5Ð ‹ ä æ:–~H%†oL¯ ð¥\!©¹²öÖq1®êÚ;ì±n¯BdÑe_¡p À!À®¸Â!R.ö²…*P1aZ…EZXDÊÄH¨˜Y[`*…A ±0Uì¿^®Y›@ A€W„*,2—Á@À6°NãQƒÌ<锋‘R®€mD˜èŒ­+¨TðG€©pW%—Õ^âO­P©Ô° \f -Àl¡ ¨j¿"4#L+S©f¦Ð21Ò2fUo˜J¦BÌ\Á;Æo—UiæP©á®à ‹  ËªÚ—Äu€Jò J¯\Œ@YÕ&H‰)ê¿ÛB¥XH›D+¨Â€,¹lËE9€J€]‰p…)¤\³…&`«ýŠÐŒ0­B%-L!eb¤ d̪Þ,0•B¥†X¸‚*vŒß.ÛÒÍ …F%À«\A@—mµ/‡ ë4*5ÈL•N¹²­M6Ö="èB¥ "Ñ4â ª0 Û.Ç \.H¹TìJ€+L!å˜-À¬ÄÓ*TÐÂR&FŠ`êÄS)Tjˆ…+¨bÇøå2@ÚÔRhT¼ÊTa‘z¹(ÄÖiTj™*¼ÜŒ@Ù×&H‰qI¢¶2ÙNkwÄTa@]N {¡€J€]‰p…)¤\ìe U b6´ •´0…”‰‘*P1³:¶ÀT •bá ªØ1~½\!³61€•¯rUXd.ƒ €m`F¥™©Ò)#¥\!Ûˆ°&冔iw*ø Í«q…YrYmeÚÝ •J »¡Áe¦ÐrÌš€Úд›aZ™J 43…–‰‘&1«z³ÀT2•bæ ®Ø1~»¬¶:ífP©á®à ‹  ËjCÓnjë•äA•^¹²Úд›ÚHð!"”iw*lÍ«q…YrÙÚ2ín `W"\a )Àl¡ X‹¦ÝÔÓ*TÐÂR&Fš@ƬêÍS)Tjˆ…+¨bÇøí²µuÚÍ …F%À«\A@—­EÓnjë4*5ÈL•N¹²µhÚMm$lkD(Ón»…#òܸ‚* È¢Ëk4W¦Ý­TìJ€+L!å˜-TŠ ØÓ*TÐÂR&Fª@ÅÌêØS)Tjˆ…+¨bÇøõr…ÌÚÄRhT¼ÊTa‘¸ *¶u•d¦Š(ƒ(û M»©H§×ˆP¦Ý©`-šWã ²è²æÊ´»*•v!BƒËL¡åb/[¨°¦•©Ô@3Sh™©3«c L%S !f®àŠã×Ë2kH¨Ôð Wp…Eà2¨ØÖ*!ȃ*½r1RʰD€8qO›µàš á ²ä² e®Ô @%À®D¸ÂR.€ÙBPÍ•¨¦U¨ …)¤LŒ4ŒYÕ›¦R¨Ô WPÅŽñÛeê\‰@ J€W¹‚*,2€.«€æJÔÖiTj™*r1eÐ\‰ÚH86•Ê\)r–[å ª0 K.Ûš"× @%À®D¸ÂR.€ÙB°Í•¨¦U¨ …)¤LŒ4ŒYÕ›¦R¨Ô WPÅŽñÛekê\‰@ J€W¹‚*,2€.[ƒæJÔÖiTj™*r1ekÐ\‰ÚH;&U¬™J©°{ôÃdÑå8Tª¼àZ¡R©a"4¸ÌZ.ö²…*P1aZ™J 43…–‰‘*P1³:¶ÀT2•bæ ®Ø1~½\!³61€€J ¯pWXd.ƒ €m` ‚<¨Ò+#¥\!ÛHðq *•üÞîœ(eÁÆ£8ƒw¾ò À#¦XõöËŠŠ_Xˆ•EÄÓz¸•²¢*L܃IÄ Syè€&*°à&äÁ$j)<0°ƒ¬T¡+‡táAÇ:/D”ÁB)W¼J q£ÏìÖ‹ÓÁN®H˜ØÍ;jƒ->±»<±Í'¶Z{?bÛqbÿGÄà›b?jbc@gÑb±Q11Q»AQD°'B‰"œ3ˆ/‰ÐæDŒI¬óóš>ˆà`E*‚!«R±2,UÄ*yb¹"¦Œƒ9¬X>MÌcÅ\b0¹óê‰ ŽxÓ ^|bÂ5‘^Dó<†¹'<ái"õ„nÿSx:ÌDFÝîTó,‰‰jºY8ÜÀä›çû—ti¸¯Å÷T'¶µèÖÂp»ƒoµMìvЈó0 Îw`&‚à49 ŽòÀüDl”Ƨ†13¯™Ñ°Å0”ÂÃx‘ºš®°ytgbM9Ã…_ôO¬»èäw8)çkÁ™”G’€6Lˆãy˜3)q$/i˜'Åsôf2¥HºÊ0}†§nÍ$Ð,†aVÏè™É« ›ÛÃÍvžè1³ÝNö<‡{°|ÿf–l… ·æø¶ðÌæÙ!îØðÝ™=8òù&ÒL(ŸÄS‡ñ]¾·0á%a¶a؇œg$ú2ŒñHäL<ˆ¬Ê‡Q šÈÅ™±£T]ž>‘­+R&G9œ<}x"SäÒ’ûx^éD~ŸH²e}ñ„ÉÄ/‘}3Jâ™hA"-c”'ÂS”&REÄ~ý(€ç®LäˆÜÑÎ2Oj˜Ø\;|£-G¾Û=±ë(¶~F{Q|tb;Jì Œ6)øþØÄ>…¢×|ãd"€-‚‰£¸&¨Ï|ƒ„gò¾] ¾Ï2óížâ=H;ßx˜I;繿ƒ|d‘ ?“Ì“B‰ª"Gz&Q•g 2EòìL#O#¤¶‰¬Ê™Ô6ž_4Èyév39O<ñd #ò°f’axF KB$èÌdIð­êÁö¹ÈܘÙ>ç{˜ƒ}U±¥?³¯Ê7·nb¯wfÃï 6dÄ&àèHŸ|Œ~ÖùeßÚ÷c=ù wze„Їí4*8´åø6è©vt•©ÙÖ/iÏ:“N¼Qñ1äÚô,¢]6îõ©Äº˜à„9É©tôÖÞïçGpÖ ù®«ÓékàAèœû~¬³q<ƒ´Ó;:É÷ó|ß’ë2ƒ¾YkŽóüÎô©²FÚÊnýny;öçÇ'Úòé¢ñôgz=<7|éÌ ·™‰á3!²[ÉNÓ£‚‚[ÂæFí ñ!M_–fRŸÈ¯hû˺“Î\ v¦;z³qDew4(èCÏ©8ÉXmgÀµ9q: ;•§žÖ WÜ%înèMîd«;¬…ßè =[bó‹WÛ\yVp²‹u±wô¦f§â˜¾œÂ¤Crؾl5\ ¾²ù»¯¨ï•þ3žx†‡Çe0®—ñ»' »À ÝG›<ž˜Q©µû”§¶¸¸ðZÝÉþ¦µðÑ_!måýî9xæøïSg.Š“ë¤³¶éÝìŸÇ8Çg£»z¯·âÙ‚ç_ ‚5ã‘펞_Àñ {oŠzÛƒ“½ºîÅ#q®ñÈ.>Ý‹ç‘oƒû¿ô.'Ÿ/»oàõñN<^¿¦o“?ñé÷œÀã“üžÛdÂ;æp¼h”o©0~ѹ ^4B÷ùÌ´Ó®VoÏ~¦ýhCxÖQÊѸm¦}C«;p{u•Ãëà\ïðdŸÌáa»ç;Q¾Ì½wÓñ­‡ê’«9ÓQr"èñ³?iG}`û7ôTÙÃ/þˆ&geƒ‹în:+)7ﬤî3rVkú ‡çî«oÏû*>7¹ª[݃wê:O%`®vT>£âÝèÞ[œÑ~ÊžÙ]oTxÀ ˜Ð!È©§Á8ß¼ãol ÓÒàÀ×§©ë²FˆŽKZÏü,Y2Þç÷7ð!iìð‘Î/)Qsè#…Ü>Rè>#™~­Ì<ûÐéã áy')Fã6/yC«{pò^]ç&%Îõ~Rvñéü¤èǩݬ±ë’n ÐyÖñׂûý™M¨„'‡ØPOôkø>¤‹Ò‘—>ÎYOsèÞR’VF¥ÜîMè>#÷¦üâƒ{öîíцð¼{£q›{»¡Õ=8y¯®soçz÷&»øtîMÞ-Æ%«ÎæÌÒaX®ã VðV¢¹·üWʼÖ]¯sYœ-ýðaJ¡ù-)7ï·¤îóñ[&¬GÂè3÷[7„gý–›üÖ-­îÁÉ{u•ßêà\í·:]|2¿Õ¹[¿5ümaÛã`ôTÇÎS%ÝÍ| ½¶‹Ý~èèðT)?Œw¤ÜžJè>#OåBdï³ßx¼!<ï©ÄhÜæ©nhuNÞ«ë<•ĹÞSÉ.>§’ý˜Žü_¸Àìtóò?Æ;A´Ñ‚Фo8™ñž€”»À] Ýgä®tú®Ô³÷V6‚ç½ŒÛœÕ îÁ‰;u¯0×»*ÙÁ§sU¼õ›V³5`èó°% ÑDm·øíô µŸÚåþ§ãG`¾ÕR¥ÿL¿o²/6Hÿðe˜¬ˆ^0ò-ÍÇþ\åo¹ÏÓÇ7GÇ1~)7ïó¤îóñyi#ÈoÏ>ÆÿxCxÖéÉѸÉëÝÒꜼWW¹½ÎÕ~¯ÓÅïÕォ–Uï8›áh…¼oƒe%l—ê¿*íÙäŽÝ(£{9™Šezt¼ÆeѲÎð*˜Àñ…SÏò!ûmòG÷]ÅÒU§oíÛñ怔»À/ Ýgä}úþÿ³ßx¼!<ïÅhÜæohuNÞ«ëü¢Ä¹Þ/Ê.>Ù|ðôxpÛzí'‘h?óu}€q¶Ç:¾z=6Nïɯ“œFöãÙV‡ž×ZÁË æÿ¢^v_v½äãðû%6.šÕ²[ß¾ˆ—>òwÇßu÷ÑÝLj?ÄϽÊçw~wKœæ’‚:NjÈr¨ŠˆVý_Ý}vÿ/÷ÿàëœK endstream endobj 236 0 obj <> endobj 237 0 obj <> endobj 238 0 obj <> endobj 239 0 obj <> endobj 240 0 obj <> endobj 241 0 obj <>/Font<>/ProcSet[/PDF/ImageC/Text]>> endobj 242 0 obj [243 0 R 244 0 R] endobj 243 0 obj <>stream xÚ+ä2P0PÈå2µ4Ñ372s`LsK# ÇJgp…+äqÕ- , endstream endobj 244 0 obj <>stream xÚÍ]Û®%·q}?_qË&-ÞÙýÈÙ0"f¢ 0y2 wå%ÿ XŠ#D²ÉqŒ>!,6/uánö>gFÚsŠ]µŠ—êb±ÈîþìNß«ôŸ¾ë}4a öþ×—V¿‰üìNÝ¿ø—ô÷‹_ß½ýs}ÿÎ?Ý=Kÿ©|ýŸSþøàéÝ–@ܺ¬ÖÜ_î¼_—hZÁïzÁ¶Ø\Ù+ñÛ»OsAª„5X¾ü¬¦Ê7䡚w¹šóâîíw×{­ï_|ÚšüÖ..úû—»Ÿ¼TJiø1?}ñIk·ø„È9#ü¼Ì¾TÖƒÈÛïêûu1ëÐÎ,:+Zçl×UZ%íõ¢mÚ^*à߇Ÿ/Iý¢Y̺ ‰/àçsøùsþ‹Èl©­2ÿ?„Ÿ¯² –1z]6…Ì¿ÁÏŸàç[ÂnýFíPþý~þµiú²)¦:W½˜†uMéE‡X•*ê̤ s…[Mr?}MP¼YÖ4^ß;µý•{î;°úÅjÙÇ_5ηߵlôíæ—MoW•ÖÞ{©´)åå_ åéo)¿‰´\…òo¡µ.|Ž–+ŒƒåýØn½Ž‹ÓŽ×\ÿïÎ>ºó´Z¶€î'b Ê$Éôüü ~Þ§÷h\|Üû{„Él‹³Q09>¸c½|Ô+xµ¸ x~Dx‚^Tp‚é ü<£œÛŒœŸÐÝ%Ç)ëõ^†ƒŸûº-ÆHöàçï¨7HŽwÌKr/¦ÛÊê˜ í­öׇ ó³à‹ƒ ÉåmÉug†Èu·=(ØÙQAºƒŒÛ{'ÊÄÖdi.ôÕ-*¢IaP°³£Ó§NÔiGÛ.èQY6åÈ‚è¢?ËWbŸ”ž¦ÿS§¤ ߯ÛEY¨O2µµNÎwíÇðó¼ýÈw©R—réš™<%ìÉÛD%•½ü)åJW7/¸~Ù@ßÈV‡4'!)Ó¶D¥zbviÌ“Ý×ó¦þCê8´`ý‘´ødÃ&Æ ÷õ&ûŒÃ†h^ÛL¢mòƒÁyÞxÕ±5ĬO†ºm£©{7Í]£™OŠM'ØíëïÉØävܨMÈRЪ\+‚“|œ‰v€SåIeŸ›Œ#þÊ;H³6éÚ6Mî:@)XH‡è§|qYcðµ¾sÇÕú´Ö[ô‰¸d–ÖéQåü@5ºYŃ+#H6œ ëuӀȥÇÛï&݆„(éÞ3vñÉ/5·ŠëÔR¼ÆyH ÂWÉCœKLóc”ºÈ\“LÁå¡®4%9mumjI±àù«æ–sÀôTÆBzË .ýM][j°‘ Þj3À‡ðó·4~ZæÐÞ/ÞÁ÷N gžÒè‚ÁýDFf°¶Q²ÿ÷8…®hÒt©¯p~XÌ*­Æ’ÓJÓÅ–n¥ÝÀHQ65-ÃÛ übÒÌWô®°É­Á÷y[}-—z° O“Ñ0¿ëRá=¶è“NJ|¾u}Xí¢%”lXþ â…[–üw”¶7ì£aÃÒÝ1’xHÃÖ´f?3b›Kànj˜IЖ¢ÎaÃ>5̘8”øž.®÷`vX•¼"þâö~0>Môj>À¥¿m€ DßþÊ2ì‡-.FÉQù¢­Þû ü+¹zO½èŒ¬ãŸÇ9›ΚQÓ=Íü…†4l’Ãð¥È†Øä½ô¦ öyðëÖ–Ö>:âN›E­C€Ð³ ðóRÖ©Ey7³–Æž–­N‡ª6“ È¥ÉÌ«õtÛ°¬Wàц÷žc›«-Üs £eð«ÏiœÃ,gšd8û0ËÀ™DT”Âê-…>KÝiòàV ¾Ð,te’—N³*g§™„–òÁɆH8XQÊâñ͘%ÅÅǽd ‰`e5ܶÏÚ•.qmšÝèˆÑ29 ‘q=_ábŠæcÉW¤¥Zò?oÐÁCN—øÆÝi½l¾d+:+~*pÉtĈ& 2+X‘‚ªˆ\hÀü hmŠ# µ_®ø­ BR… €É\rQ‘fÑH 6¬"SQ(Ì*À(Úç5Uà’™w;Õu€Ž¹/@Qt *ôNU0ª¨Ao:ù†A§‚Õ¬U\PÀÜ)›¯!ѽ $£|º[ÒŒ¶&>Æn˜´À7n 2C߉n™¿Xf‡,–‰ V¤]V­ ¤ Zg×Q¬³C‚uª^ÞuÔ˪ê§mBÖÙuìÖ‰@wëÄVÑ/«V ¡‰4ûìˆÅ>qA*ÐeUk ‚eš)uH0Ií *¥ªò+èi~R1 ôT`M¨‚æJ­ÉˆBoÕP“9¬éÂn¨i¤œGfˆißxÑõñ#-"mÈÕÂ*Z5ÁN¯»]Ý›pÇÇüÝ8+Z6>DÔŠîèûÕ«IvhÆß̲á³ëô†ÁëÕ°Ê"xÄÞ ²‚Uƒë´Aàíj¯Âówc©hÙ(Q¡+e¡ \Þ“YU3‰k/¨±ÛHôÉñ#©#+iÀ-1ù»âVû¨XÕ@06–¸¬:Àœ¬èÙ>*T5 Í$.†˜üÝ ‹uT´b \T[òw…­vÑ`‹a`\,q!XyèÉßw§ Hµ 9€1’˜Y¦³ÜNÍxÌELœ•˜ƒÏ¸,nd3cçôDÄ'¦Éɼ-"Ðó6óx‡ŽWÄs×Ëï—ã—Oç‚V6ÍObFŸ <ˆ×>œ@htjþ ÷ü±û!3Ù‰x[Ä'³‰/NÄLlÚ9žÿx7Ÿ¹óšxP6ŸX5ˆ€/ú’E>š,D$7‰+…Òq¥ˆçp¤Øuˆ2“è’…‡áˆP8Høœr<­ñàh¶/ï|bnqk¼qOÞ­°E„ô•=y·Å’Œ{£I3³l«Lï´¬ÌÇãÍq»I¡·DnÆA'HΟS&—O* ëðq«9‘âŒY”"ŠòÀIÙ]Èž²‰3Ê®zODC7M3Y›,Çmãj¼OSÇa‰Zª0ô0™]V%™>nÚŸwrTÿ$¿!9yŽbÀ$ÏQ˜t•s=—¹9¯oï0“wpÎtRqAöE¤Lɼœàa'’’{O÷‚à’M‚„ç¬ ¡:Õ(½­ùPçÔmXÕrʃ,«z@ks¶Çµ÷¸¦Lëbíø~þ?ù•ûNaÉŽÓ¦ð6èGœf'CÜ• ~´aå“éÈÛ‹z(’j÷©Ÿ”ÖŸšÄú4=ŒÀN¼€»X³S3ýðÅÈȪZ«g;¦]dƒ]œ2Ó.‚C<1…%G]$|‰Ä t?©BmûKt¿1MÚëpXÆ]UnvYC|ÒdÔ#ü$Ša|†öpïÙvãðá‡fÂêš) 0kÊ=èß|,ú¿éÆU sŸÜ¥Ô)þó:\½aÙ™g²“—oôd¤«6oþFõ¸r£ËúNnt£x›]òü*Ø7ÞfYq›õ}°s“Xrn8vZØç2höƒœË¨û®;—A'>Ö¹°cnýøÛ@ûÓíéå\-5 ®A-Ƹ›ÇH;µ8­¯Þ&3—âbZ?j÷æo/Q+·—¬ï)—rò8Cê’ÅEs|œ3MŽ3pöáqÎ$3Ø|L{Ê—–KÊzÁwx 06„q»'7µ¬›ìO(“]¢×‚‰ÛUi´F0€“Ê÷*<eW'˜æË¬ vwÅˬh–0ëÇìšnqö]›ViÖêž|¦¾q7:>PÊ[3èéð_Òß±änqÁŠdª!ru5‘ÜñKâ¸ÃYmdnB¡&Õ¸§b iФÊ6YáDÇN7T®3k!2—L-åâtÄZjAWÃÔ–L–‚dšE >Z¢¤ÒUG¡¤Ð‰u$¿·CÑËdï;Æ€nL;¿'ì,¢Ê>¢ƒ‡Î¼+vRÛÏã@8A |ãF p|o+'vv£~Ýju¿¬HC»\AÖ‚eúNƒ,fK p;CmX •j¦‹`wÓ¥DOe¨° ‚è!RÍx;ìn¼”ŽXOehj*VävÃê »áHºê¨t…Ü¥±0Hê©jX9çŒìHÐ;s·+çóĺÛU#]5xŽ˜-‚Q½ÚT¬6E4`™ Ã+– 誡ÚS¬öD4P©‹DÝí@ÐMK±¦Z­‰j!RZÍ@T=ÅšºšbMD “ºHÜb0‚®j*]Q³A ý`þÎaê°Ä¤|Êi ƒ™°p¥'f[á„&®QÌþ'\£0ÌÉ­"Üõ¹9»¹©‘Æ9Ìo€é)¦†Sуð§sGÏ£šSŽ^ÜisÀ§ a X¼ÑB%N“–L‚:7L§+®ñÄlEÅÔ…ñôĶe´nÑ:<`ç2®AH_ݹ\á-ÎÍv.¤•L'v.³“eb£½Ë¤ Hlï2,–F£Z\Ý»LÐB„¦­^´‘6Ø»t‰3FÁÉö.ý Í'¶.CÞ´Öâ}þÔ lZqN±u©¼d:±u™«Ÿú- 1¶s™î´(™øÎeêzHA0®ñÎåÍýUw.çýUw.9çhç’óŒw.9׵˛Uw.çª;—œóüÎåí•3g{¼î\ŠÊ v.‡wópçrx×v.³ïT~ÑÛÌ?úäU7Y ™~Œ~TÛ&÷³»å`Íîû!Ø<·/Úü°Ô¾ìºƒÌ¾èÀ0±o7·„M?.±/p.¯Ûð´´þøî˜dõ÷¨Þö¢ßø%ë1¾³õ}•‰}Rd·mlj}Î4IìsöabŸ3žS„££>ÏŸSTF*½úœbbó‚›=¦s0'Ú1˜îÔ°ƒŽŸSÔKðú¸—Òº#¿ÌA¶žÞ¿FÛüÚ:Îw´­qÛA l8è¶ÆñèËíôb´¬òÊ´¿‰3á@½½­W70ƒpÜ«Vù¼Dºn+Ïä ÀÄÅFÙ rÝb¼ÈC0¼§ ‚Œµ¼H*ÝízÍ™x;¢£ªŒ0ùÊ.µÿÓ0ó,lŒ‰ŽÀšØa a´Ð‘S"õÁµVØ„ÄÈ6ZhÊkz"ÖôéÎhh.Ÿ3'$ï´Ñ#eyLdÒ2Þ»Q½Ö¤S<¼L©¢Âè‘*€FÜ H¿ø Qpê_¢¤$á)Q—$0[pÝ0PA¨ÊK.»PžîDµŽ] ¤Ã Áá£Ë®ª¯]–iÆÒ!wk¡4ÑÒ\­ƒT¤v£é »ÕPš(é ®ÔB3 Ld7›ŽXì„.»RÇ`f</¨UÐ åªfÙA0ô1&ébCðd”F6Òh°ˆ]L“_ÙNm7ó©¨uð+RµŽNûŽÜ.´&ŒÐ‘@·›ŠV¬“¿^.pMÁS‘b1¯Ø&1|½\àvQ„Mù‹­T°j 6¹],h»$‚FÜÝJ%*n!¢F‚qÓØÂ Ú®;Î#+@iØ+/º Ï3„ÝJ:Qͤc—¡îpÅpGøír…lX–iÖÒ!w{ 4ÑR*fCÀJ˜Ôn3t· J%•¡bîâXÙ-§#ëÀá·Ër—Æ °@³„Ô€*虪`M£ÃЧ…#<ðr©DTYI/£(¼ä²QåÉëN4#jØÕ\µTà>ºlªú Ðu`™nD ²Ø¡‰–Î`j¤&UŒ¨!4QÒL©…f˜H1¢†X­„.›RÇ`nD/¨UÐ eªfÙA°5nñ«.çÒò˜¸TŒ¢ò¢Ë¶{¢NT#êØÅ:\±\à~»l©'¢:°L3¢¹Û¥‰–Ê`©'¢J˜ÔnDt·J%•Á"OD50‘݈:b±\`~»l‘'¢ °@3"„” z¦,õD†žt²Õˆ¼ëƒ&¨±[l~©jAhÔ€)VyFUäj; ¬ÚAÇ2†W‡\TÅrbµ¢‚I]$nyYPëi¸Ùzˆ&r‘ yøUñ«õ4Èl=D¸p° Õ 3U‘ªéˆ!¾ºhKœÉ’‹¯ÝO¬ºx,|’‹%à4.áÓ$œã+„˜\'“½ˆ0OLøÂ÷N怜˜Ä=:ñb~šæJÄbv²Âæ9› l¾ö9\‡‰ÿt!&åIôΗ…'‚wFMb;± 8Û‰Yv2õ‹xóÄÔ/üñdŠáÈ4;FÓÓT ËÔH¤•îdÑÍ3;ÓE7]M—h,pbFCåiøÎ'¢wGMc;¾¢8Úѹvðps𥉩i¢ŒåcOdÊHFc’Xáy»in….x§ p–æ9±§‹¡é⌧N,Ïh¤<ÜùzñDìN£©itÇóD7O@Nr¡<ç~&Ê2X‡94‘›çÑxrc’gá)½3™¾ô¬ÂEêçÌBœ¯Œ&‹4‘8³Nã!ô$” ÇÙÁA¯·Óù%õml‹Ã¸¦‹œé=úÒù_¶Í¼_Péo“å/´Jôn —¦‡õtÈÍeu{ùz¢O/Ê8Áõ eòùãZÃföãMÒÃ}v±[2G»›ðÎem¤žÁó¶Y¿ÎÛ¤“¶³Žÿqð~.ôWª¾&ƒÞœ€`gã`ÿ†®Ë_±­÷yש°x/ÌÎ$ªd`²ëØ™Dø(\òbœkp€/Ú›šO/žk`5çüɽ›ê¥×“õ‚“%ÃzÑc%É¥,tpjÏ%ÅAVv|j/{–ä­Žƒ£:í++qô²Šê6¤ø­'“ÄÇÓFjÒð­iê•'µÚa/OÕ(vð©ƒSì„×ðÈV½_YëiÝ_Ã;æWøÔ"W(Û˜"7è6|]³#ia?X…te§ñˆ– tµÒŠ}û†Nk }oŠ%îüØ‘ð"²}=›È¿¤†gA÷mý1=}gòç FýAû >:™#çy¿yáÝDÝòéI8U ç˜Èá·'³Þ+u=÷ÝIpŒðbµÊñw'Áúý Ÿ’cvDŠðMLkä×G…ó4«YôŠõÒ£ÁøÁ7’|5ŠX×ÀûIñ×âdápXÉáß+_@SîÌ¹× ëã#…Ÿª¼3ü80;ÍÕžkDq̯nÔ°UÍ#†€»åÇTY`‰zµƒ»ç\zþæ6Âᣤ¯|t/p7;hßæâoì.^ç/‘ ÆŸ¹ø˜Ïî^ïÇë.þZý'uµÝ]~E}÷Àý*=ªÉ¹Oþfÿ {gæþSðÝæ?…øã]ÐøË‰*=¸P«£-þºµh5,¶ñµêòÖ>þxð!cÅ\âµoš‘?ÏA9÷ÿ¥7uZ(;ç§½)ùÜ›ê½êá_™-O$Âvæ;|¸i ií®OÙ¢˜4ÑT%Ûó° Hâ<|’íûá& W4¾ðÖ¦ÕÝ>¾ÙõËö›6|Ù¾a–§‘ßÓYå/<Š_£xb±0rœì»vm®ùV~>-M8ðŠ†°…é„#ùnšp¤øk‰yá« ð!íW°Ãója{íË ø@§Þ¶×±¿º18t´îäSe%êõ0‡9Ày°Ã´ïs˜²ü#ÉükÒ-h²ü!·¸¹a¿ðˆ><°k7‹»öAèײ=CÃ÷k¡ºuKÛȱ©.´_±ðoÛÏŸÄËq³¯Uð¹«ål·yZ.ýZ\Õ–ÍëWígá›Õ޼˜ên_›—}UýèdÑÿÂ/>¼ÂJÔêaVÂ<ÜÁŠÆý`þU´âZŽû„»Ž#Ò/ðæ¿þÐüÞ7G™é„';ØP×õûð]û‘>M;½x½^3Æ#whaÛÕ¤>äJZfF/+w^ʺJö«ß?nCõ?­}^ø†nž»Å ]`žà-³®å;‘»qðîe÷Aý’öbÇQGÓs ð¢|†¶îúïË“ÇÏî>Ë/¸¤ß¸å£#pÄPBåÓ;*"¬Uþ·wÝÿcÂý?a ƒ¯ endstream endobj 245 0 obj <> endobj 246 0 obj <>/ProcSet[/PDF/Text]>> endobj 247 0 obj [248 0 R 249 0 R] endobj 248 0 obj <>stream xÚ+ä2P0PÈå2µ4Ñ372s`LsK# ÇJgp…+äqÕ- , endstream endobj 249 0 obj <>stream xÚ½\[¯$7~?¿â¼AB_ÛݯˆÍF‚lrÈiÅ !yá?DÉ"…DdüT|-W¹<ížKE™3Õ®úÊn×|S]åYq/üŸ¿¾ñÍGÏïq?»É9sÿß/“Pæþ/wÒÊÉY,«¢‚# !½ÿìîOXó1“B0ÊÎVYWa³`óp‘êc®ÖjjÄঠWÙ*æ)€SƒG/k„¶ZîE²U=gŸØxüu®€fÕ䦘ÕTô,XÕs ‘öcÈ}±F5BÁÍ‚UÌIõ›*ÕìíRX„÷ÊÕ°@²*ŠhÐOҥȀ÷%25G åÈ@²«È0˜ÑÀ¡#ˆ@KñAÄì,â—á Öžš¤©x1BˆHàóp†K¦›è§è°H6 t´DÐH¢ B 0!â&!〠{»øËóœ#Ä VÎ( кdXÄálœÀ.[ p%ЇðѰ(î @õmj´dŽ"gÐä¥*ˆ2Ê1SAST™:‘g¡[Ô$G –è@ ÂGÃÙA¶®°AÀ‹a¤„^$Q<óä·^#e¦™ ¸Q ¾ @— «8œ“P‚¨bç¨p9Jð‡ðѰ*î @õm ˆ*dŠ*gÐä¥*¨2JA„@cŒP™:•g¡[Ô$QEÌQ‚/„†³ƒl]`¢Š…K ½Hªxæ7Èo½ÂÏaIA¤…œ„Xj”à tѰ˜lÎHI(AT±s T¸%ø‚Cø0\ ûÀ6D2Å•3hòR & `'U "c„ÊÔIV(˜Éœx &)ˆ*bŽ|Á |Ñ;ÀD/J+ô"Ùâ™ß °õvõÖ9‚²(Æè¢áÅÿÉép ˆ»ÄÀ•(A‡á ض©A9Fˆœ}&/E¡`vÒXå ª )FˆLd…‚™Ì‰j’ƒK”  áÃ08ˆÖØ6¨Ax1P˜”ГTÀÀ£û­72Þ¸ÇòÞÖ©¢*jx,…NzSÂÐò¦ˆUt±ŽÕ`©¨Hâ¤À¤ ÀRö¡Èh K•SdPÜv,Ø2šaÍ %ouME¬c9*$ÒƒÝ/aÛ÷ uÓ+^Ø0g'³æ$8Π,_P K†•ÉIp`û»ì#À•]FÂGÃÊ $˜úÀ652ï8‘3hòR”AI0uÒX娍 iÿ‰L€‚2% n°M­d.9ûL^²`⤱ʕ⠚JÅD¦N’`FsêšäZ1 –b1º`~®‚5q€ jÅðba˜I =JVL ºßz'obȉu’¥ºø‚*ªhÔM‹µ)„ªPBsT°"ø‚«è0ZÁ{@&?0…•#föQÆ "`Ô(E‚ŒÁAeâ"ÄdMð‰EŠŠ—ƒ_0F>cx¤‘SÑBt´RÆNBK²¿÷á¿Ï_ç7©7宦Åå*gKJ…ß%…"Å%¤è)ï¸`¯Í6UÛ_Øls´­²a«ƒU¤ò¶é²£HÎꕃú)+Ú﨡²rÖ ¼Æjº;Jl¬Ú1¨¾°’ߎ yH>ýtÎ A£§töÌ5xlê;žYB>x@`O¥;X¾6ÈÙCËŽ’}Ò –ÓîH1ãoý°ŒgüT.hÏ*º8¨BrÐÊ`=lq·MÉÍiÛg6HYkÐUkÛµ;šj¬½1è¹°Fߎž «~Jò¬´£$ÏŠ£ƒŠ-kì¨Ø’ Ûéú+j|¬D3¨5•ÆU#öü>(*°JÖŽ¢{¼á«—d¤ÿ:òé0ÓûYxùuxù$¼üÛ(ém:w¬ÅVJNóâú›ÿ‚­K=)ɧü ªä¿ÈŸ¯"J6|tôYwU¹óö]U‹ÿÈ»+qYŸ`í?VÚñ»ð ­Ô4ó}µ°Àß}om>ˆÚÇÜ⺛¢Ãß÷¢OânöŸMÁý½ JNLRóMy ñAÕ9iÃïâïá=Ï“ŠŸUÞ*{öpç7Èé1´ÚpúTÄ@¿^̺YJ¼EØjÅ÷Ȭ~|ª$ý× Ü]<}ë¿«W£™Òû5fêºÃËØ:ÂK3ÍÈr†Õ /|ç­÷'ô̬_’{».‘¦›¹½z‡ÌAè˜úµZŸR%Ÿ%,k™/`{I¯«;÷o+ôÿDKÅýtB_ÛñÚ´ãµiÏσµõ77þ§°á/ÁøƒSŸçɆ¯×âÕ+³8ëÖ)^í¸uÊ3½µ|Á”Š}z"4¿uÍ$×°”™i}Ì¿^¬=k9Ò©Ë ßn½åHø }¹ÿ>]ôyÓ Ùþ¾iù¬£;-ªäó±N€Æ@úhjï8p}¥‰Ü%ç­ÙïòCˆ×EK]Æï ×:ëÏ%ýÉ×]‡]¸9¨•¯+ôõ¢ÂwEvªÍ Š›Åìü£ še1Ô0töEOÌ=X'ýì—ÃgšrųŸñw-w»s‰Œn·¢¿ŠìæŠ=h©íš)3,6/%©-ÌÓ”ÅDLO;8í.ÉþzåÜr]g}Ù [_ÖMÆËÜ;zäž³û}Ÿ^ljû} _š°” Uð€Ê÷_S%ní܆8•†—7áå‡ðò¯ðòExù¶`>éÜüs¹ž¹Úý]xùÞý£Í¿fŸ(®nÌ’­Úy$ÙZÃ2ÊùgCysŽ”ÊO^={ëÿŸ²Å‘·Ú‚mмb ­]>cŦu!CrœË’-ïéòô2vd M˜K^®”­}ËglÕgðaHåÒ#£ ËU¸–ï¬v>å×;‹ñ¸ù1¤1¯“RöÖ”g­ñ³?<©µþùT)wåÝn69ïš=h‰êš)3,6¯ËH¯ƒs1éuÖ÷d¬Ç×Aæ·Ýö×%µ“òDЛì×!˜B«Ê£*Îê{ ¹¯!³‹t÷`Ïȃ?Âh²háC×|ÂÓ䀗ïûô©d¬¿é“éGŸÌü’‘¬·¦Oã³~søäÍzrò0ö¼Ùl³ç[ÀïŠ)3,6¯ Ù“ã\Ξ|}OÇž|Ÿš(Ò¢ÁVåÝ'¯Ë°ƒs9òõ=vöi£Â']¶a°ó‰¾C"ç娶šê¾Üû8*BGɢǎÆÅP¦vS2ëc¨FÏ“27ïþhŸñ;sxž«Ã #sX÷çf[°Í“Wlã¶ËgÌ Ø´.¤IŽs1Mòå=Kò]±¤ ŽÔÔ»°X}"iä,rUvÈ øñÈ kôMËváäW8Ø=¢;®wßqóC(#œx[×›÷~Ô¬ãOŽž½YüìëýÜn6ïš=hiêš)3,6¯Ë(¯ƒs1åuÖ÷dœ×Ù§çµãR¶÷«}žå:䱿‚í‰i¾.Omð|_1žÓÂsó¸IÃõÎã9f~ SÈÕÓþÍ›4J؉v5˜¼\ÃÏãkÒÜn è¹þOo}oñçÓÜSfX,4.¤9Žs9Íñõ=ÍñÊ(µsýh¤?ù ÔĹâ¼ì­CJÌÞÂËFa/œ‰÷“Ò×;‹Ö¸ù1Ì0ËÉŠ›w6¤qñ·²GÏ>ü‹â°ÎÆíö`3}»fZ.ºfÊ ‹Íë2^ëà\Ìkõ=¯uöi”¾™ëkÓµYœÇkCê|5â5~N]{¤ÆŽÔt(äL¶ã÷«{¤¦Õ;}¤¦Õì©él¹=u¤æ»þ ôìù¦µžÆá—ªòAçÙÃÝ‹»¿ÅU?úW—þÿ5‚¦‚ˆ?šNzèQ-öŸÝ½¼ÿ«Çý?™7MÏ endstream endobj 250 0 obj <> endobj 251 0 obj <>/ProcSet[/PDF/Text]>> endobj 252 0 obj [253 0 R 254 0 R] endobj 253 0 obj <>stream xÚ+ä2P0PÈå2µ4Ñ372s`LsK# ÇJgp…+äqÕ- , endstream endobj 254 0 obj <>stream xÚ½]ÝŽ%7¾Ÿ§˜ H¡ã·o›"ÙdÈi%.Ø1Hä†wˆ’E,YØ, ž»m—«\>Ç=çg¥gª]õUÙ®þÚ.÷$âVľxy#¶_>~zÖ[¹šÅJw{Ÿ»8#oÿt#]X¼Å7¼Ý*éE‡Ô¶YVáó›?åû$- c)o(¸Ú¤ ž¥ŠG]%t¬}Ÿ$Š®­Xz™àà J&Í}¼!¤‘š¸H2q7*(ó™¼tf÷ñ†A¨VJ:LV*ä#KyL°Á}’èHY'˜è;õ• ãœ+£–Ôp_ïTKt#Î`Õ%Íjk.ÆY¨ÙÓ°Kö4¸’=ø†Eø¨YU÷ ùÀ6C 2畉—¦ j ÜIg•³¨æ,¢2qÒT‰Bv:“œA ±d¾¡>jV%Ó9ÀAωTЋ¤ªg>@qêµHc´æ$ÒB.B¬-KИU5ÇYØš Rj5ì’ ®d ¾a>4WHÀ>° $QƒÌ9Beâ¥*TL@ÀN:«œD 4畉“ªP1³9öЙä$jˆ%Kð …ð¡¹Bfkì@!<'˜èE²Õ3 4õ6DkS’( Ê”%íFJŠ¢‹š×øÃ”$’°k\ÍtÃ"|h®€}`›–DYr„ÈÄKU¨˜€€tV%‰´ä‘‰“ªP1³9öЙ”$Äš%è†BøÐ\!³5v€ Z5<'RAߤ ¦=N½‘>Ý¿¯¿Û–" Æ|(j¸-§Nþ¥¦  •I¯%)šhbkkÉÒP‘*äI…ÉI€%Œ ­-=,UΙQò´c ÃBkIˆ†I5s.T”2ÕMT ±µ•hHf0œ`¿+$´IoxiÂâP˜P–¾IðÆ¡ym7Òt]Ò¬¶æbœ˜~À®ópu–Ñ ‹ðQ³ªî+@ómZ6d™q"/MAÕ¸“Ϊ䀖ù'2qÒT‰Bv:“’)€XóÝP5«é`ƒ–7 ωTЋ¤ªg>@qê­Ž=0eœ„Ð*݈IQuI³ eÜ„šD »ä@ƒ+Y‚oX„šM@‹`êÛ@5Èœ#T&^š‚ hLtV9‰hÎ*'MÁ„º¦:“œD ±d ¾¡>j6¡.‚©lI„ðœH½H& E0EOSäÖ²¶!*i´ÊE7RR]Ô; Ë"¸ D€]sàj– áCs…ìÛ´$È’#D&^ªBÅ줳*I %GˆLœT…Š™Í±‡Î¤$ Ö,A7Â‡æ ™­±lÐ’¨á¥Dé$@/’×hLÑãÔ»8FJ—EpÌŠV¹èFLŠªÛšMˆÎÊ"¸ 5‰vÉW²ß°¿6d >° $QƒÌ9Beâ¥(fE N:«œD 4畉“¢˜›9ñЙä$jˆ%Kð …ðk3@nÖÄ6€$BxN ¤‚ž$«¦=N½k´Î9äEX¤@K]t#æDQE­~Y­Í)Ô„šB€\ •Á7lC‡Ö öØ2üi€9=¨Œ}ÔöŠØ5ÊÙÓ srP»¨í1[c|j‘s§á•äÀ7TC‡Ö ˜1<Ò‡ÌAhN0©boB…K2¿·éŸ/^–_re9n®–Õ— •·uI…Ë UÚºŸ³§þžÀ+[OÊˬà7)@²Z÷Ž"$«MêS¬(º£FÅÊ“ò«™í(a]æáí-«¤Ì¶¹lÓ2ÙDuíÛ(¶¢¬°Ù¶nÇ*›-x& 0¶êß±cïÃÉû™- w¼£eço¶d˜sx½¡}Šê„â —ÁzÇ©+°OªþìŒiGÕŸÕ_'Eav±£(ÌÊs“š!+T晴Ïá +_ΪL¬H0©\tµ®u ¶ƒœlkY-eǶ–m0&»¶ÕÞ±ëaëÏÉ¢˜íÄv,ŠÙ"åø²‰­Óç˦z£>·ÊÁ,#™<Ô“sTz 5=dëOvwœ±ÑÓŽé Lî·ã†–§åùþPhGu¾ÕVvûƒ‚Ym—ã¦BZaÞQ¤ušií¨¯Xî(ÑMü´°Ð—³vÔèoºëìk;6t0Û—ôûàù¶d“ê#ZU±ÌEòO>Q ÆÓìþ»‰GØô4qzºÙŸ©ï8ߤGMÓ£¯þÀuÇáW;É8v„ÒÂÍRh±{Z|§g9;Šï´:­Ëö§;*³´H6-Úõ¥âe;ZA™Vtú:⎚ÝhÏvý}i¾ïߤú„VU,s‘<À³O€úÏ2&_ˆ°o’ö|$ÒŸÚO> `_­ìù† ?Ôœ/³ö1ã3ÄÃç–ì¨{z|Ù-MN¹ºÔ=Ç\ý¹Ãä„»í9éËÒ“ 9;–ÙS$ï«–“*«Úï©¡ö®ã…6VÓÝQk+7êc»i7A’GœÕýrIìî¯éòûxyÿ}yóó»›÷Þ_o¥¼½Kå¸T(“·©’f\|ˆÖÛ»û›w^!üOïþíR¨Åx®ô‹ty’.¿&ê)á|`ê%£=Sz!”!zÚ,Zꑞ%zÆ/Bq§nóœ.¿!ê.ÒeÚŸQ¿ ëG[Åp€~´ ÕSl£"¥¸´ê:6JJ¸%x3è½$3¤"£kÍCýIºü2]>M—_›øDéÁˆ1l·úñì?ãýrrQ’‡ü.U2‹ð<^E”"­¬V?lTCJw|Tµˆ|%ì‘\Ùºõ)±Q~ÑžÂÇ,´‹ãója>,€¿÷~èEsnõÃIÑéçû›Oân§àþžQ¥u‰OSzùAÕCX´á£ø[ §%¨íYå•÷'w7Á·%Ç}ªÜãH§R¾ÇRf.ÂW‘•QYÙEÆ Œ.ßʈd4Sú åLëwº|H­#¼4qÝ¢hfl½ÿ.|æ­Ñ‹ÐŽY?ÇJFº¨»Ø^¼C”T\o(ô>£JñM¿†q7ŸÁô’46&}œí™Í±Ô7ñ‰–Šû¤~>9Þ·´¸šöMG~žôm䏸Ä?ㄞ־Á0ˆ/(%­:"Ó$^ž]dzky‡ k)b‚ñ¡£Aj™ºâ˜Ö'ü%ìõƒº#ƒØÙôvuGƒô,ïÓÄg‰K®;ãJËŽa\tÍá3ÈÐ-“>¢«ŽèØñ`?Èì.9q¹àâëÑab=w;Һ軺þ)÷ý€^¸9¨WUî+ô~Qéå_a‘êÕMÜßù¸›AQV3AÝ C£¯zÂ`}ZC¬WÞÆ2àè~Ùr·ûzQØèrs †½¨nΘƒžÛÎ ™a±¸”¤¶§©>(#®Ûút€ÓÏ’÷Wºžìý“È }í7i¯±ôȘ³ñØ|ó~ˆÎÖuÓoÇý“‚ö_Êž<ýÜl¾I—·éò_ÊŠqáâøô¿N—7éòwæg“ïÓåoéò]º|›.ÿ¬/!ˆïšE¿sq©üœ&{µ‡±do}š‰[ãåÅIRª¼ºvô6¬1z}5’¼ÔçÈ3¦€ñÚé3(Ö‰ÉqN§HÖ½«2äÏÒŠV§ ‚wHѨ^¥è¼˜WˆÖöÜÙG5xUvº8ÐDƒl´ðÜkÊ‚¯6f<Ê{êB7¦ü.L¿2ÿšJ×ÑBîÊ×›žp­‹‹Þãr½Q.7¿k¹°(e/͹֚ýÕ—ÕÖˆ½¿ç^nŽ’î9sÐ3å9!3,×i¬;À9™uý{´…é`žº,Ò=ÉŠ®î@Œ¾#oÕÙUru=‹ XÆçýÈð+ΩZ,VŽrÐù½eîøTZX´þ.m=üvLÀ‘*¹L‰”é=ŒH™ùu¨HŠø: —&RwæêÁ›5Ê«ñèŦà8ž1ŒûΙa±¸NäQŽs:òþ=ìÄ/)¶ìÚu×^ÇQc¾Äí¦‹M3bããÑq­]VÏõ6¦{ÝŸê=B̽xÍ« z]ÄxN-¢êH¾fE´vÛ‹öšß°íÖw>´ÿôþ ¬¯ßöTn\ŒL«)•s½Q97¿Zµx­/NåqšÓ7׎^E2ÔöZ\~¹98ÊåçÌAÏ¿ç„̰X\§qùçd.ôïѸ|0OvüdËníÛÆ¼ç£KXØåoÕW”pâ݈ƒ†6¾&®wæ‡K\ïa|Å̯òÄë`âñâ‡KÚ‡í»±kGïâ»j½ÚáÒåæà(_3ŒcιÇâqÆWœÓùŠ÷ïÑøjÐ{` jº~Hä§Ç¤?Y•ñÞyK·Ô_Bu³ÛÐëE~oE@ÈÁðäð¿X·Úê·=µêô)Ô¼:ÊÔD¬Ìú:̤ݢÌÅÏ£t\”{sõU¬>Fµó¨‹MÁqZ=c ž1ƒbaȪçdVåÝ{> endobj 256 0 obj <> endobj 257 0 obj <> endobj 258 0 obj <> endobj 259 0 obj <> endobj 260 0 obj <> endobj 261 0 obj <>/Font<>/ProcSet[/PDF/ImageC/Text]>> endobj 262 0 obj [263 0 R 264 0 R] endobj 263 0 obj <>stream xÚ+ä2P0PÈå2µ4Ñ372s`LsK# ÇJgp…+äqÕ- , endstream endobj 264 0 obj <>stream xÚÍ]I%Çq¾÷¯èƒ­ ‹•[eÕÕ †” H"9ž!í±} †ž úâÿ0&Çôäˆà&êšwëà\#cÉzYïu{Ð ø¦£2â‹\¢"##³ª>¾Q·søOݺùÖk=mJß~t‚«ñ7ßÌ·ÿ#üýø£›7®nßú·›wÃs*ÿ÷ß•?Þ{ûf (vV£oO7ÎΓ×páíÂ6™t!±Wâ÷7¿–ÍLÆ-M¾^ø¾°¦ …=Q>Vó&Uóoß¼ùh½Uêöño¡9QŸ1“õîöñéæ'ÏæyVñGÿôñ¿Ó¶LNkÁèãϳôç³Ù¸(ñæ£9i‡U(m'µ­A|¬5U\=­´F*hQfÚžÍz‰ÿþwüy«§œôº ‰OãÏóøóMú‹Èø5t²2߯ŸWñçeÄ2zž§möBæ¿âÏãÏW„]ùiéµc6ñß/âÏ‚¦ ˜ê\̤;Æ‚ÒW¢Cô*jõ  S…¡&©Ÿ>Ç(ÆØi ãÕAq­Sá¯Ôs_€ÅOFÉ>~ œo>2lô÷áŽÛv•ÖÞ{6+]®—U¼þVžòkO¯ÏKù·ÐJ>K¯ÏË»¾ÝÚm›¬²¼æê2{ïÆSs9rã1ÆÝGõ¶cµeßÃÈ}%ï§'d¸ì7Ç­G/ädÕ¿¦¶þu»u„ùh£'mÂsà¦6ïæIͶ¯0Ùæ—ðÓ~Õù”XîîºÅ °;ÝèyšÏµ5éúŽˆÇm:Õ}!ÁÃX,‹Çä:>‡ù¤é=¸.aª±}éç´–¤ lð^~Û„`v9„3ŒÓf—sÆBØÃ@mÎk\ç °£çÏ0¸DÆÍ6´Btžúß3£™¦ÐmÚVMGå{¨Û ìóZª~ Ư—0-¯'ü_¼ŒŠ^Hý}üù§øó$^þ$þõpm®š§eµ´ÝqSaԽؿûÈ­¤]˜ç¤¾fbÍõ¿„^ ÷îâ/!önÞ0/Fö×—Àžjùhütç¾ ýn8/Áh_ˆ.¼ ÿèͪª‘K!hkSà:ùuáxqÆ1ôn÷hðùñ6Ôõ´Îÿ*ö=ÚìdÞ3¨Ú’»bŽÓŽàÏþ%ôùgòv2!ÌÔJ~þ™ß±=ο”eo3]ØÀ™ q‰“ð90Ï‘Û2ô‹_Ï[ñçgñç×dæÜ&ç7Áý¹K” ÖâSŒ(ß2…X¦Ç·Ð»~›æÕ¾t“¾þް[;-ñ6cìR¦mZÕ""á=¹°làœúºêm"³šÉÏnÐMkh–^;ÍWž:7™UVõÇñç—ñ'9¹_Ñ9ʘ!¶ÖjòáÞìŽþ»¢]ÚÆù[Vù Ê´LÁQ &Mà ŸbþKzUûhç;U¯azuÒ@ßH ¢Á|°¾Ž|H¢­µo&©žöÐí›’ìï «ŠU©Ží?£K7Í::ÿôד(ó³Çi‘'ä0ð§LÄ;aEëYy!³£ :,ײ⢮˜ƒÇ²«*èN…ȯ–å…ÌÞ.Ä»ÖÓ@Tôe›´©èar¦kqq¡°£ kÑŸÀ*‘Wëo‡ÿW×êYY7-ápË´´etö.ÄŸ÷á§3ŽÞ©EH?+y›†a¿ îg?¥S•NQ2çú%`þZÛy i…Œ§±gO½IõÏ(Wm7Ù!ïƒú'dþ0‚ó¯D7¥ ¾öñu!®LSǹf¨Ù§ìÑùf¨ÐXëíN3êÚ®k !:ÑáÞDó‘¦kY­èšWÃÅxÍ<³56^ Ó×j?YݩȊYu«™À,!Rµ®ƒSåI]_¯Ó9;Žö½wbMRµiŠƒytÔ6ùàc±zº® NÇn>è9{~” G=][̸‡Ø¨©h’¦W9×Fm“¸º2|xd»ù°°~˜/˜¾ù(¨ÖäFZnÝWaêÚŸ€Ãp†H•ó‘ùÔ†^Õ‚…LøÎNó&Xˆó ¡†×’çQòè˜1Ì0J{Áø.ü$‡õˆ86;¹uÐ ‚å$nžÅ©ÏrÓºìp>9¾Î’Y«0#:œ°W»aöt‡™Œ³=§Iº³N˜Æ¹Œzšá¹¾yâm±|˜‚6)ñÃå‹È0TažÚ†íЉo\áE “†³k¿aÿÐmØâ»×4,ij„’ «ûu³5L[\6ßoXž@yËt˜H{"?ÐG·$S®Ë+H(\Ö:,¥°®ÄΗpXÆLzÞáìöê¦ÍÉaÙOßÐ¥ž”—uÜÉæz%,îeÓ³w~E³¬_Õ4Úºx¥Ÿˆí³…°Õô:Ö²©ÛÖ„VÎ/ô¼'ãàœžVïÏf8ÏùŒçîf8S/ã°ëðyžq0Nâ½Ñ–};É‚|!øVïŠy0ÝîÚÊŠÉ&¦Œ¬ýSžU°qÒdLgÖ*L7‹;ßÇ:ÄÆÊjþˆ6í©èmmÚôà‚ÖÑëvÆz¹k¶5-£O™ B7xUX7kÇ.8ànô–Õe{¸qÁHN‰ö1f94¿€UTº¢r•Q •9%šj Eì†u$ª"rIâ?EŠVÚø…R¹¸âÃPAFLæ”.`V¯‚öX \¨°BkÔÃÄNá†P¢Z+]•TºB ¥HG\‚…H¬èˆ” æ[1ztäntX>§ò,]©’ä°.&=K‚&‹2ÍbéÜ„A%†"ž‰f² ¿˜lƒ,&K/`ˆAA%¼cz¨-‚ÍF‹/lXK+VP ©É€á6Èh¸„ªÅYG-VU?m2ܦ#n͆Ki•4µàZ˜P1)À,&Ó¡³ŠF«R‡mGÁǪ*ˆ±ü¢@‡ŽÜ˜6©¼JgªØ¬SvZCvÊD¶VÛL’^pÀì¤Í6Ûˆf³ ¿\ƒ,&I/`ÀPaë¡R`³6%¾°a-µ¸‚Ñ‚dÀfd4JBÕŠg¹Ti¬€ÉT›m Ù$)í±’ÊPQ+Ö„²I5Ìl2’®*!³4VÍ j®&â÷6x®CgæfQV§-°lQ@ ‹xŽX,AÐUCµ'­öD´P©“D–À(ÐPl «-Q HæÄðªÈ UG²¥¦ ØQÀdNµÚ¼PÕkÜbMD:IØb0‚®Z*]Q“AuýL´&&²áô*BÈCS¬p>C—(&þCnQåðFÎúXüɧæaÈ ââc!w§C7/‚™cnžßjÃÛ_L@¢joŒ å€Äü0š°xPv`Â~cäÈø$zhÀæA0G—,‡"9>É ¦^[šw¹ã8d XÞÐ¥[§@$ÊhÚKƒÅ ,‡±.×x Ö¥¡%‹[‘ÓdÁ.4†±×x ö¡SÏp>äáØh+Ú•M€º<íÕ@«iF"³8Ĺ,‚é=¹oóá¾äœ´-³lÇ0;f´NçA¹ ÌŽ£ÓYKÎIw?SÊ\2}Úßo¤¨#:ë!²îô8}qžtÿ†ªÔ“î˜cÿÐFõ™AÈmwy°Aˆ°|gžóLjmpMó¶tÔÒ-*kUÚ÷”üôÄ«µq³º‹‹Ÿ¯ÀÝ¥§ç@ª½3:NÒÎ%/!{ZÓªÕ9óÐ{„„b‡ûU¹>;ì\Þ?’õ€.êø‰ºÐãõ8þ@÷Ãtiæ.N·§Š+uć0z}ÂihƧió¾+ž÷¬™ß³á$,!"uJ°¥}Æ?ÑÛvž¬à“^¨0E„%ýîËžzѻ뼙Œõ¯ýf_ô´ÚõøÍ.øwnv‰;¸ÙõÜ«žga¶×Þ+ÆL8@ƽÓ#ó.ÎOöËõίƒÅž{›é|¤ÔuΧƒsÆùtìá®Î‡ã'Ç.v>* "4ÐöâaˆªºfzÄÙ¤µ zí·ÕÆÜéã7–àß¹µ$î!gsðä‡Y£w?{ðƒ±œ?÷Á˜»Ç>OïÔG< ,ØÌÌ}(¡ðБsRTîü‰àï¨wÿÀ‡²†3Š&&Ø(Ï輇ÝÖ³}{(/ê¸Ð§žP_7‡iLô ÌTèxhsÕœqÿ˜Gp¢öÃ3§¸mξ4z«Œ@¸T’òß)½Þ8O‘Èrцi©°v³P“2ªDà”h„g‚Å2Ò#øF»¹§.å"‰Ì)Ðú…ô‰ #ØÐ3áæžªœæô×{Ò/vUÚ†èB¸YèIIµÆzŠÁuñÄ-&´nÊ&b|h.‡ÒTï›Y z«Œ­0þúòZˆúwµ @-–HÑ20Q 3r*¬PUCSj€—-ƒÁ—â X„1>•ÈvÑà²] Ú#ìRXÑ’$nÜ`UìѺA×B€. €uZ´NdèDTœ*†qÃØÆóÉÚ¹l!‘p³kV€/lÀKŠçT\„3Qͤa—ÑnpÑU‹3~-ž«îZÜ0™j- 4Û¥=VÒf¨ׄ²Í Ìlø‚ÇZñ\ê ¹$–ÓðŠuà )@ÅsÕ/» Ë€ý4Èh&’Ê *5Wå=½ñAºœØŠ„wY º°/)Ö®œ×j`W3¸d%˜ªÅ¿못7LŒ@‹Úc%AC-¸&TŒ¨a+A<ÖЊu©ƒæ @3"À«V‚.h¤ëª_v–iFÉP•TJWå=ýÛYžmŒÏ ̳BV‚.lÀ‹Š— L#Œ°«\²Lå⊟‹+HcLŒ@‹Úc%•¡¢V¬… #j˜ÅJÐ5Ôâ ™¥‰$ÐŒ𪕠 )€bPP°,ÓŒ “¡0ª*¨”«Ê%zúͥǀ³mˤ- „ñ… xQ±›¼-áp#Àˆ»šÀ%+ÁT.®ø¹¸â4VÀdÀˆ´Ø¡=VR*jÀZ˜P1¢†Y¬]ðXC-®Yš(@͈¯Z º ‘(ëÀ2͈2 £ª‚Jùª\¢‡¡o!ѶDÍ‘°ŠŒñ… xQ± ÊJä܈jD »˜Aƒ‹VB¨ZœñsqÅi¬€ÉT#j ÙF(í±’ÊPQ+Ö„²!Ìl%ø‚Çjq…ÌÒD#jxÅJð@1(¨X–#jÑP$•dª‚(FC¿š ]b¢Hx‹‚|a^R¬m‰‰FØÕ .Y ¦jqƯÅÚ¢˜ˆ*`2`DZl„Ð+i Ú¶˜ˆjaBňf±tÁc ­XÛ1H àU+A4R€ŠµE1Õešd2Ae•ÒÅD=¦ •N/9UbÛPЃ/lÀKŠíVb¢FT#jØÅ \´BÕâŒ_‹í†b"ª€ÉT#j ÙF(í±’Æ`·Q-L(ÂÌV‚/x¬¡Û­ÆDL#jxÅJð b»¡˜ˆêÀ2`D 2Ф²‚JÙ ÅD=½Õéy·lDÖÔ¼Š•  ð¢b•ž·ÎF`W3¸d%˜ÊÅ?W<Æ ˜ €!´ÇJ*CE­X *FÔ0‹•  k¨Å2KH àU+A4RÅ  `X¦@&CaTU© ¢=½¯AªF³ó Ø £2c³ ø9U-° ¦Xuðå…ŠŸ,ðªLæ$QëèË UM±!À-6Dô0¡S6£@C±!€L6D KcϨ ]­§Aë!èXæÄð’y0ª¢gª"UÓC¼»‘À“ÀgÑ|3c˜ŒiÃA“§Å¤1ERiáiÕY.‘s$@DÖí@D,Iëc‘”9°F+–ÁòI¬Ù,¡D@;ˆ®Å’î@„-âAð%"þ˜˜s³ÌÏÂa¼·ˆlæ±M˜³;BdWñÀvO×6ÈÖÔ¡ žÊ$˜é–Æ¡ì2Ïó ²4ß}(õÈ“@ƒÔM†ÊKñ Á oA3e‡’|ù8XÔÒ4Ê¡-_[ V͉•Q¦‡§${Äò{” àÙ§áa1~Îçìa#~bmxØHœœGáGŸGç§Ä™§Äöñ`3[œ 8°™-v{bƒýÀ^§Ø|l…‰ý×[abob°S"¶ç씈Ôõ ‘.vo$ÒEfsgÉýyV‘dãDîwøøó¸]| ̶CÁôS%Û´ÅóÐŒévÎ^”Î'ÿ‚JÇʬӂ$=Zí”™f³iúm̳Š=û å°“ŽÑׇüáÎlý6¶ƒèOèÛ¿ã{ ½9wZÛ†ûÆx©§óŽseÓ8žo›ÚÒ[ Ï·M›ôE±3m£37¨Áþ#îv&ÿ;u_‚³–Ãð5éÛj—ô^pïéããÞÓÁ‰®³l³O5¯vTOoÓ+z9WçAd§/jŽZòƒþãæ¨xfßÉæ~ù¢jÍóÑjÅ…B¯Z”ilÇF; › xQÒPû GÇ$´î=ï÷½§S“ײ—>a$>ª&tÄׂëÞ“Vð°–£:föô<ª6³'´ºO\U§qoM›ûM+jdëo;=…Ë{Žléyˆ;´¦·[뙽õ ´ÆÐŸ¨]­gpåKþ…×M¼ëCƒü øs¯K’îËúcøDyü\×¼öúƒö›Ú|úÄà~sÜ›‰îºä+”JÏñ»¤ûÊ¿ ™0y>þˆT`§Î¿&¿¥¹uQ΋2úÀ´xÃ_F Ñ¥+>_aéIó]»ž3>7N^ÆÌ>eßhìz|äÛ ÄÒ„÷²w÷°«ÆŸ×°GžK5é\jýúÿQ7ö1Ç=XÇâbï­ ÏzrÙÇ{¸çbïPë\g¬ÔE:„£ñ©Ö+µóé˜ExMÙÄ׿±/ì{žú¸Üc/éQâý~Ü÷Ø;Ýõ%u˜Í齤®X:Ѻw¿å KhMœoßJ¾ãPÊÞ—“Ñ;ּ셢é#–f·¹q•œšËÙ ¦¼Õ½/ù2ñÌÜáÞ'z´tÕñeF=Œ^Œ¯ 0zÜ‚ïê~¼®ßŠ_¿7öÅ™ãOt°¦>èÿ~¤sRÚLN­{69òk錮º5ÁvÜ« чãÔV—Ä>p§voxÖ§‰¾¸“O»C;hrœ®riæj—&Û÷Ú<Ú~+v:C±4¢Qü„”  ÃâÌ˜ìƒ Ž'y¡‘VlSé[cŒë9 _Â_ŸqÏŸp°ã­Ávܳ чãÙ\|PâÁ‡k÷Ög=›è‹;y¶;Ô¹ƒ&Çé*Ï&a®öl²}¯Í³í·â gkK\ÚZ%¾ZÄ\‘lôe®LšØBCÃÏúÌ1qûfÚZFQÅsöª¾ÿÝ›Ó7N7ñ-èéÍ5[0iM‰9=“ùÐ%ÂZåóôö_îÿǹ›™ endstream endobj 265 0 obj <> endobj 266 0 obj <> endobj 267 0 obj <>/Font<>/ProcSet[/PDF/ImageC/Text]>> endobj 268 0 obj [269 0 R 270 0 R] endobj 269 0 obj <>stream xÚ+ä2P0PÈå2µ4Ñ372s`LsK# ÇJgp…+äqÕ- , endstream endobj 270 0 obj <>stream xÚÍ]Y¯%·q~¿¿â>d±¥Õ\ºÙýXKÖ2‘l`òd 2ÝöKþÃØ3¶Œ—H#þƒöO·*ÖÂsØçœ«Á…àã)²ê+’]],ɾóýÿûåwsþÇ'ÜíÛ½7~šgsÿPˆe2v½ÿòάëV(;m!ÕeI ~~÷Œù!Q“¥Xvqœ*ÕŽɵ%Bæ!PÎîŠT ¬Òšô±‡;çfŠº{>Jng:vЧ4f;Cß>R~ß¹‚ež‰‚B¡‚]¢Sî‡DqôÅk ¡=ãŠtzæqÄ|üÿ ‚߈邀¼¬Úæê*\´ÄëA¸l=”‚ê‚ÕtCuS dÐz´Z£UÒ,¶BjBÕvfµRÀ4´ê ÒDÁÎЫí Ø䇈 Hµýz¨¨L³ é{TQ”å==úÍFéµQ$öúR—Uû\hDˆ f€pÙJ(Õª=è†ê¦@È !hµFª¤1xl…Ô"„ª5Ìj%¤€ihÕ¤‰‚¡W@<°,È Hµýz¨¨L3¢é{TQ”å=>úŦWŒ(Á»f%´ /«¶¹º Œ¨aW3hpÉJÕª-è†ê¦@È€5Ðb#œTIc°Ø ©E#"˜ÅJhÓЪ $H;C/6Ð𪕴‚dM©¶ _•A#"¾G@YP®ÑÓ£_L”®‘P"öÝ+!yYµÏÕU¸hDˆ f€pÙJ(Õª=è†ê¦@È !hµFª¤1xl…Ô"„ª5Ìj%¤€ihÕ¤‰‚¡W@<°,È Hµýz¨¨L3¢é{TQ”å==úmžöm¯F´™ÉºX )ÈKªç)äêŠT4"Ä3@¸l%”*Õ€_ª¥©!ƒF„ ÕF¨`T Z„P5¢†Y­„0 P Eš)ØzµÄ+Á‚l¨«QPT¦Qƒôš@P®Ñã£_M,w¡Q"üš•Ђ€¼­zÞ£²PŒ¨`D »šAƒKVÂ(¨.ø¹ñ@š)2`D ´Ø§URµ0-B¨Á,VB ˜†ZYš+Øz±†W­¤$ƒh  º)¨L•A#"¾G™B0eèéÑ»=J/Õˆ"ÜB¬„äeÕ6WWáB !6˜Âe+¡T|¨¶ ª›!ƒF„ ÕF¨’Æ`±R‹ªFÔ0«•¦¡UH& v†^mñÀJ° * Õôë¡¢2͈¤ïQEP”kôôè×-J×À:ûF"gZ—Uû­Ö@#Bl0„ËVB)¨.øPí7XsBA«0:P%Áo-°æZ„P5¢†Y­„0 ­º@‚4Q°3ôjˆV‚Ù P©ö ¬¹*ÓŒ¨AúUå7XsôøèÜ Š …è¦ÌL< -ÀJjô-Õ5L‘« 4°d"Œ*Õ½Ô Sx.öÓ ‹yp:P˜ Oup™b=±˜- øP €E˜Áï»<ú†V£$;@x¬Ex§ˆZôšªð…(”dÏ÷>ý÷Ë/ê?J¶:,~ÚBÔÂú¯Â”›Xü;Ï*>HY«<â ©©òç›*Í4Èy©Dë¼—ÊB R"*w -¢©ƒ³JÓX5«5Ì`A¥VñU*ÄÄÛj‘w æVÐ Sk€!™š ³µ ÌØÊ‡ž÷æ*€{t(p!¶4¢(4JÚ4’YüÁÞ߯:´± S¼ƒÄ3ßê8”u–ù¿AV’çÁ¥$erh²âIÒCù*™9ä3xíP2C.+‹]ž^9´Ò•kŽÁJˆ¯½-ƒd@:“ùÂìPŒ,c–óaÚÄP•†—Ø -ö:öfÙ~ÙpOnÙÁc›)Ãí¹©xd{‡eÚ‡¹¹ãt$÷ÏÒ°Ãİ܎8’f9ºaÖPæªd Yg˜R’‰Ì#)%¶ºæd–ëH¾-ý†‹Q™9²eëƒÑrE.,Wo+°RZ“üu>BíN¶ËåÑŒ;æjór´›*·ðl¨ª½­Ñf›Üá=°ß¦¶>F{1rðÀvŒÊŒRõrè@¶^%NG™\¹}p ™«òj£DŸÌ.Èõ©´Ë($“RAj}>ÈÈÔÔ8aøïŒðü…—É‹#Ç‘ä‘Áu8êÈy‚`pžA¢9ržAn0¶»Õ‹#ÛÝrÿq°ª¶àì†Êí©Áf™Ú¡=²Y&w/{)jïÈ^ŠLnRíjçHª]æ>™X•þ?’‰•i²ó;•>±«ðgn @¤Ù+>ß?ûŸôó³øóAüßwÿüìîÝ÷·{c¤^J·™û”óq‰¾n÷Ïî¾÷|žçðýgÿ‰õfŽ–4ÓÒÏ{éçnj݄i »bÿ1Å ÃG ‘LÏgëŸóQ·ïð¹™ñù0­óôóqúù<7!ýü“‹ĆU ¾Ÿ~>Aé™Ì>ǧªÛžÑß§œv6“‰o¸äüœ3…É¥-˜þ>,ôLÆnÙ©žãøN&èv®ØØÜ·Ï˜Ì²M›×ù‰9ì4oVq.éçñ_ýÝ÷was6Ú«[Lç¹ׯŸêsÆM[Ðcù1gÚ§uÖ3?ýivŸ¤ÑÃø¡j£²QêDõ{ÏîöЂ釔覱5Éc¦Ìw TyEÙ‹¹Ó1ZæØ[çSoÛèÒæ/Ñrv¯™>lFÓú~~È¥£d V"¹bï?Åýèg¦Ù­Jš™µKæ)öü{”ÃG¿bÓ»-¸~Ê™Öi‰“K·íÍfFìmjWP2ç ß{;¹ õèÞ;g³«=Û7- º²ó}s>NœÛÙ¾1ö%Æ|1¶’ìÿ€»9¹žhû¶N³˜çϹXóÄsÁèÙà¢MÛ£g7?m³îsàLÑ+o~ÔÎÝF_¥ÇãS=Û„ù¢î˜-½¿GºcömZ݃/ÒG8KvfŸ{_Ô.³mWZÔ÷ÚÅ'×uò#ͶôŸ^£âU7öÃâÝv\ëȬԱÏÒwùi¾ÙUþµK-Ò½hYä [Ë-™\â¿ML"×+Ÿ9ÞìyÛ€o^UÛ¶e &|m[éD©q¶±x±Ç›ÙS£Fãøw\Ó-­îÁége¸8¶Öƒî®Öñvpä³2ý^›Uº«N ‘!ºÎê¡í>6òjH²nÕÖ~úð—~¿ÌÌåŒ9aÛ¾ôG·ØñØÅ«­+·ëéçéç7éç«ôóÛôómúù:ý¼H?o°¶H(ü'^³)ëý²Ü×2ºZ£yùuû@ÅwT²OÈÆèwú.ðÑFð¼ ”ƒq›¼¡Ñ=8õ¤®s€ æzÿ§;øöüŸzTÂŽÜ, ë(9CF‰Ö{¡Ú)£]@Öù*ýüýÓ¯sáæi1=k9ß2­«U|ÙsýŸL¥ìÄWÊÇ冫Gî‘ùÑ×fò›ìke£æÍz7†þÕ†¸ 2cÿªø.ð¯Jö ùW³NÁÚ'ï`mÏ;X5·yØZ݃ÓÏê:«q®÷±º‹oÏÇê§5p²üÝ6{ôR='"ÏUy,í .tµ·ƒ±d–}̓ÌWÒq-©ñÁ —æ;ìÓq\ËrVÿ‰;®Ç³ŽKÆMŽë–V÷àô³ºÊqup®v\.¾5ÇÕyZÇ%ë‘ãÕ³Áäª:ïÿAW•„O4ô.ƒÛ ø%V¼T¾*íF;ú*Åw¯R²OÈW-[κ?u_õhCxÞW©Ñ¸ÍWÝÐêœ~V×ù*s½¯Ò]üN}Õ?ÍQÝš6ýY+ôs­igÑÓõDkÅÿ_x9»–-Tڰ䥴۸,ëŒïŒKÆ7Ê)žx›s°ö'üù#ºÇ7gëÑFð¬ÏRƒq›Ëº¡Ñ8ý¤®òXæz‡¥;øÝ†rf²é°åôC[;‘õ\b݉Ê×NÈ·õ©Ðçûö+±^sØ<Ø«ÀÎë*QU¯Kë^pw÷[ô³¿ÇýA‚‹ŸÜÚttçDuÌoéP²ÞFx‰?_ó½Žo¤óõ!b¶Cç«ùŽ;_-û„œï²çãÏOÜû>Þž÷¾j4nr¿·´º§ŸÕuþWã\í€;]|k£î‡ãp¢Ýû2EµçÆA¶éä8Ë`±ãO,º èj³oý\<;ÒdÞp·ü­rfYù ùSÛ,¾">õéL¬óc©ø.p‘Jö ¹H7çK(OÝE>Úžw‘j4ns‘7´º§ŸÕu.Rã\ï"u¿ótãnTŒªztÔYši[¶s#bûGoä›y=·{lÓÁ“°öì«»¬cAí¦.ó¼',ñ˜çÕ£cyøù’GØÍýþYžÿÞ‚Wx*)ámºÏ·^¸ãýÞ³»_ ̺ݻ°On3÷?{ÀÒôÉ_ä«j÷y”ßýsÿƒÿ¾û8þ7wÿFÂl¦eËwm–”ùÅ‚/[ͧŠÊ‡È‘¨@K­˜‘‡‚/iÁª|#’ü©ûsé^M+çWŠŸ¿2~Zb 9‹y¶ÎÓoÉ¿ÆÛÉ$Eñ1;Úùx“ÌÙâ“Úà=ú~ÌÁæ»(Râ%7Èüm]'íFÊ|‹süWjíeÍ6ísP2¿éó²ùØZ§å=Í«¼_¡¦ë=›.¨v0œç 7džz;ÂN.î5¿³“ʱ÷ÝmËäŒã¯óÝ÷xúérønö“JOÒl“ç’-íQ,²ôív11º3^¶Üüµ°÷Þ¼ÕMœïÞ\•Lƒ›«’½{sU2õn®.vëð9#[Zïß¡««Î)¹ÑÍÕt´Su°su×½Ô7W;ãõŽRlM´ÈäçOù¥Öt[vë·N_‡K®aqš½sçÌ/q~ë<2qíÍOk§½ ­éÞç–/±ÚòùC7Ïùo›DdAa&ägú9ÄFÀ$gfÍ%›¥T¯À”¿ó ™ÂôØÓ>ê–ULº °“Wõgy F÷Ymtev‹éªåzáÓtý×Y/…Û»ÁîG;¦}QªžŸ¯1Lì×"™~„?Ö¸~‹6g¥H.N3œÐýœ3ÅÐÝ%Ó§¨û3ƒ οÓþ å]WÉWîsf‹;ÓcÓ bÏ÷!…²é€Q·Ý‹hÖEwàUKN ˜~n/­ýÓ 8±Ñ Èü ý¦yï5B&¼ñDw ‘ãÎhøפ _»ØS×TbçñèØö%> y‰6²œ¼M`ãDblèðáØùóʊ͉ÙwVÌâÁ-qzÞM¯qK¹ f©¡«£î¸?±œö'¤gHÔøè…ã;½{SA¬(.‡t•&“íîߢçÍwùÚ´ä{±ôk½:°ë´ú]ʘä~Í¿—Çßš8ÿíJ‚œ4|ÓYAò¥nºv·jˆ7'V0»ËŸòèõÿxÀÍè ´ƒB¿Â-ž¿´‹-mëI^RÑìI¼¶dù¦¿JSÙ²ú€—ûqSâe½|îFÐvµñµòç#hÉ4ˆ %{7‚–L½z†®ùœ•tô ƒŽÄYÙtÀþ•3m‘iÑÍïßÉiáàðqÙ¶ÉÏz\Zìóžþ¦Bþä‘zµš­YݯÏxtô‡Mþ8E·5§¾ðy×}U2½ÃÄØÁê¾žŽ£Sf«un‹ÞÍÔQ3"’¢06:Fyký;OøïòõbÊÿé¥ÁÙh1Ñ[Ã΀IEùKªž49‰¡bŒªhÒðJÓU>ëHØ2Iê¶ÀÑ·ÀÐ €BYƧ™¤ø^Ñd`2Ø\UÂ&̉`-]ÜÊ+à@ SV×-&}Te«+®D8g«¥0*)^¨Ž+¦\% ¦Ò°‹­4Àj,´`#ðX   O•P´™†X†Ð> €"ÕÂ¥Ðzl1^ÀôÀ"ÓäЊ¬×tȰµÈ0§¦£ÚSƒ¬Ó-(j°PƒªI±/qmY×ÉX†C©,\y[õêNmµ+Ä®v€`8¤`#ð¤zÆ,B iv…ˆ`6¬€ö0ÌÐ^@ì õ€Q4Øj6¬€éi 36$(=LªÙÂz]@‡ŒTÏØ ¥…Ê4»BH°š^AQC fh…´Y¥q ub³qImg˜Ù•„ªãúo©3[#ˆ]5ìb °-ØP¶]úYa³çÏ KiñYá9§hšøønú{Á+.þñÝ=iÛû½<õaa&ヒ9ûaa—þ¢ÖÓÙâ¶aÜ5gt-¾Gƒ®uôŠQ¿ä«ÂË69ï„<_a.8»–ÝŽΆò±[É)¾)ìâ è‘L¾/¥¹Wç›ÂëžßÓ zd¶5%yÜ£ôu£ô•dÉyü³ÂµËiø¬°jWï³Â’éôg…•¡vOdÏbìäÌéTÉw¥ëšïèõ€ì^”ôS¹ [7›i3OøUñ'6†'n-j,®½ `nj±ÂÒÏè«&!{纫Õ[é.¾ TUýe£ÒkÎ* úÙö¬€¦qSˆ!ÝéÑÄ£9‹r¤'†ìúkNõÄ;<<œœ ISÙê‡NPó]âµôc¹™ñNk‚–õôg¨RÌ·/=>}£ãÌi¬3gœgáO:²—äKÍOc,½‹cÆc©ø®ËëÆ.»øÇ³Ãs‰¶›ën¹5Ýï1‡ìPN·ôTaéþ\5upn™€:]|›Ðc=e›ní—?åäú;CpÓí-‰§noõ\çñï•æ Çúüw’†Žâ»hÂQÒ·;ÉŽãã|¾«Ñ §@×Þ£ó1H»JܹóûVŸç˜Åü"Owæ}Ÿù“ð¥ÅÑ«E[ºrÄ? |c—àP²*´ Ó‹òØ¥Ëê¥ÍDÎÎêß8(¼sÁwÜÓ¬C÷óÑtÏùê.½UßCo•KÕ]ñÜ}·;/ùwj²Kÿ‹Ô;x?0ºÞ’-ó´w/\óƒûÞÌÓ–6þ%{Y¿î|š2<êìW?ÙUa§Ûw¨}4-ßtÖ7~Zç H¸”nsÖ¯[-Ë)û=ß¶bhæ'xuö½gwçëÇóýCü {>8–òÇ–sά>RÄXAþçwŸßÿWÄý…ªR“ endstream endobj 271 0 obj <> endobj 272 0 obj <> endobj 273 0 obj <> endobj 274 0 obj <> endobj 275 0 obj <> endobj 276 0 obj <>/ProcSet[/PDF/Text]>> endobj 277 0 obj [278 0 R 279 0 R] endobj 278 0 obj <>stream xÚ+ä2P0PÈå2µ4Ñ372s`LsK# ÇJgp…+äqÕ- , endstream endobj 279 0 obj <>stream xÚÍ]Í®%·qÞß§˜EØ@Òjþ7Ù±$lIÙ°@'@²É;(ö $,;È“†d“Å*Vu³ï=g®Ag†ìª¯Hö×Åâï¬oÞþëÓúæí?¤Ÿüß¿üºþåóOžþæíÓG¯o”~óöWOªäª7Æ¿ Ö/f3oÞÞž~ôõº®_ÿøÇoÿ¬ZÌj˜ÐßæŸÏ° Ûmük,ãí,ù‹µXÍ õYþù nañ˜Ë?Õª“Ää—Y2É-Ê“þÐѪÚj$+µßG',…o[ß½-«Ùzã­Ú“Rºe³ž‰}›þ-ÿügþyOË»-ÞÆQG½Ë?¿—÷“ôÿ¯»†N5ŒQ¶ò_ùçw׫  Ö,Á«i •‹_ÃóªôbÕsj¸ùEñfü]AÎ?߃Éÿ(&±5­Ò‹¼„EçßYá´±;_XÅÕÚ[•h8·(§ cóŸÿ ïÚô²EɶûŸ«Çéß×—8|×}¼ ¼,$²€)íbÃÆdÊ7ý“üós,ãâBdÒäcT*}¶&0¡\t*çÓs%ÈCät\ŒðˆoRéMi;§LRç-“$ÞI¥× úœÃù°ç&m|jWÞé§àÔ¾$:q[Ôêå"ü%ur̆¿–ÝÿQÿö“·O‰N'–&Û~Ñéëþæ)}þ‹ÒÁ4ʰ˪²DQo‰ß<ýjT¹¥Œ !j­ˆ…œ& £2“ÙÊ vK£¦¦ ÄLòˆÈFI5—©#ºµ„×ð„¦ƒi, Š@ÕÞˆH?3¡î<¡ib  ¨Z‚m°0¨ìDBˆ;SpFÄøý±ª%У¤Dêx™)$ÕïÚcÕŒ·ÇÝÀ ÓˆÔA+SpF@&Ðc…` RG܉"¥w=­Z xEòÛkB¨]›OCíz×FÓ¹ÈUº ¬K <+‘ ‰ø… XyBÒÄ@h˜»:¶0¨T"uÄÊ”1~{Ü wmb)t"^a Ní›ý1 7ml`Ð"hc ÊÈ·ÃÀ¬zV±5}aV1µ.ΜVŒˆë<‰î™øŸÃë~Ú?=(¸s‹Êþ5™çMv‚{VÓi«»é M§]úŒW^ç@…2±ì¬œ>}ÿ–·Ç|^ܮϭ‘rÛÅ)Å)ø–~«Ÿ‚ö_­‹R&/›Â‰y^×5É^)Ÿ* n¼|ã*É&|c…V¿ÖI8a÷e¢T™¼bÉXjKã5YÖý˜uN[M•o«R®æÉÕ0uo0ºæ×?UÎOW¡Á"=)¥x«¥Åkr«—Šgòyó!Šç‘¼€{±˜Ù©=¬ W(#³ÁÚázóJnêŽ"Kpü-)ª¥m+¦f\˜]C”pÆ·¤äZ+/¹.^K…ÔÐ hµ'Ï[ñ9Òø¬Ušù絊TZ«°-Qæ]”ÝÜ¢³—;lM vÈr³9l±ÿüï`iý{XÅïëæß²Eý zð O¡þkçÄ ê˜|¾»A&÷<7ÈÔågš<0ûþ­×â¨mñÊÖ:‡€a•ä ¸cíƒP ÁBñ·È˜o%жâ¯6µ¦ÿ¡´¦Ûbj¥0mM.÷âÖ|YëåûaD<éLkæÍ*¶›±ËfÕ%J½ÆU•àx­^Ö qœ»:!^ËWí„ô®U0‹‹Ï×ÙÿóÐЕ¼‡ýa¥+ù-íYþHÃímÙòðpÀ{?Úœç°í ú›ï@ît\XSµM;.÷¬N‡«?ÊMª•ú©Vún¬Éãm#”Ø3wê×$DiÜЙè1Fõ³×“NÄY—^÷CG²bò|˜z`eV7¶á@ uäeÿü8^÷ÂK¼«àx—ú€]Õfæá”íoYpºB­^ÓçßSÛ:Í’BgY„*Yê¿ÿÐw1ÓMÍŧÿÌv`P^Ðó‘ÁÅ]µn ‹ÓñtWí(s¾«v”wÕŽBG»j¹œ±Ò®Z&'îª+"îª%Å]µ£Ðñ®Úó6©»jG¡¿äpé…ÄÈëñÝp».z5ܦ<ë«ÓÄE#WfØŸ›DÔ¼­‡Ù]³x¡ŒÇ»x­SKòUûëô’×É¿y2k ©Ü5Ùž‘^ضÕ-s=QV»¨Ê­d8„é´ÓÍDM(3Y·ØØm-ÛIo-á÷í³¹8U”«l}}7_K \zÀ®¥ÀZ:!½ã×4€V}b$[Í H¾>//m¸¸X¥ÅÁÊ(„œ ÒšuqJqùa0âÁ\Pî»4FU¼J§Ëö!>LEX¶O_³×†IÇéyð±Æ=PÜòñИ7©º²‹¥·& _žìûßËfÙ.yˉìîFÛ•¥]†¤wÌNÙrˆÅo%‰ it è9Ð!é`¬…XáV’?ŽiÔ(5á`ª`GÔ.¹ŸÁ%MaÔ2$*yO{Çl•=gDá–Ò-O#!ÝÐ{Ú;ÉZQdg›†È;Qr®®3gl ‹§ ´<.Ê-ÑÓ±+c:\¥ ÍpÈ4P€ÀV¨p§ÃVòÐ l,@`;T 8„`#ËÀí(+·YeS‡ÜéDÓ×¥ €‘(4Ù µ³ªƒVÚˆ»Èh¨;¶‘Ø ×äŽ×:RÍ ¿o“߉ƒ36%U;ÇÒW»’¢ÃUÚÐ ‡, Õ @3:¯ºJŠ[iC3°$   a´Cµ€W6² Ü^豂bp+·YeE‡ÜiCÓ×¥ ¨VÞdƒÖΫZY#fìVP†ªåmd6¸ô¥ÈúÖycg'ÊØ@–<6åqUÞÀ+Àn¤¸F’á$`ZhâØi¤ØF’í  £ªÕyÕa#ËÀí…(·q›5Vd¥ I\—.`Zx“ Z•WÚX#eìVP†©åm$6@×4j[’ÃëÄÁÈ¢Ç!3;¯z¢ñªcWRt¸Jšáh ­P-àU‡­´¡Ø4X€Àv¨ð ÁF–Û 7P V"n³Êйӆ¦®K#Qh²AkçU­¬2š”ák9F™ 6$€Ú愉¨£ÃÈ¢Ç>«ý`O¯»‘àmH†C@ ¶Bµ:¯¶Ñ†d`; Ð`Û¡ZW6² Ü^ð¸±q›5Vd¥ I\—&F¢ÐdƒVå€6ÖH»Èh¨;¶‘ÙòmRu€gBXVeqPƲèq2ámå$€W€ÝHp6$Ã! Ð@[¡ZWÛhC2°h°íP­Î«Yn/xÜ@€X‰¸Í+²Ò†¤®K#Qh²A«ò @kxF³ uÀ6ò¬Íêo*¯ìêû[d©]HeóÚ¤ª¤ê‰FªL±v*ðtC¯„ꀕPÔÕº1Ô<ݬT:uÐJ'j…jÝ8jÜX ,Ä¡•*• ·Å« 2šHÈDšjкqÜÊ!£‚Œœ¹ÄßùáŒÌO¦Ɖ« 3 l\7i² £MãOFlô{aäÁâ½IÊFB¢PÖ÷O¢_ˆHX?0é™X„t¡wb®aâ¨Xoya:’ÍMg®ÆéÑKWlº`:‘Á¦Ô.Md°áãt`˦X. lÙpb:ÐaCîK^N_6»ø²pc±üR Äú¡iÿÈB´+sàZ˜Ÿ<&gå¯Í’jaºêtÖŒÍß^›5ÓÂôÅé, ›Ï»6‹¢…áì騚Íï\Ukaxs:Êbãýk£,-„»§Q7ÿ]‹ºµ †cl<0]|a“ß³ùÈCŒÉ„<›MÎF!ĘLβ9±ÙD]BŒÉD›™MÚD!ĘLÚ°±òl…c2€gã¦Ù`. !Æd0ÇBêY”…ãta.§Ly†EÆ K¬áÏœ÷M/xÑ;ŠÌÑXÑžy?O0Ë– Ãa^v=¿…WóÄÏk 9–ÛŒ¿ÿÁ»r è°©;În;ÜÚpÔj/¿$.HÍêùvr*Zu¢:Ïüá'ñÀ‰r¹ëN”ëþi.8+e1ùÒ“òÖ}HÁåþ´wÅ•²çs‘›ûa´ãÊ™ýi;2¹W¾%n÷ócàioÂ8óÂ[‚¼YŒU—8(twÔU@ãuzY?Äq^Ü 5|½ŽèAïXåÛÃ_ðŽSµ…êßuC܈G6ëô¹ŸxÆ5quz‹åžèYgÃå®w6\÷ñ¡ož#÷äß6½?dWyÞÈ|Ø‘F9Ûn?PÄþ¸†?ó±÷4=÷n÷”Y@ce{™¯p^ì+…¾š¯äõPì*ÃX‰Nå%æhÅv£ú ƒÄ‘£OÅJ7%7'x*!ù÷4t? Óóýe>JÎÌÓýÛÑøÇ¿ƒ~åBó°é#É[¦–É=ÃÃ2Ýà©tãDýX›BÒ¼'ãC–;ªTìæaÖð§öަ|âeÐXÙ^èa9ÎË=,¯áëyXþ®&W2÷ª®î¹ž‘{þð4ð|?^x•¯F\”ŸöÛù±,=󑯧áè£7ôü²ÞoòÙÓ?—Ëgné7_røÍ“˦‰µlaÚåPmú¿yz÷æŸîÿbÁKÔ endstream endobj 280 0 obj <> endobj 281 0 obj <> endobj 282 0 obj <>/Font<>/ProcSet[/PDF/ImageC/Text]>> endobj 283 0 obj [284 0 R 285 0 R] endobj 284 0 obj <>stream xÚ+ä2P0PÈå2µ4Ñ372s`LsK# ÇJgp…+äqÕ- , endstream endobj 285 0 obj <>stream xÚ½]ÝŽ%9‘¾¯§8«]Øÿ;óÑÓ³‰ùi¦ÔwH€Vs@ì;Ã23°# bzvÅ ò ØNG8ÂásœUuª„8]v†¿p8¿ ‡#uRéÿõë;Uþøøåݶž¼µË¶™Óy/øEëxúüNG¿DÏ*ÊBÉ,kÈ×JK(üæîWLøœK‹¡XƯ²Âx(&W—5ðçRfýµÎs¹‚ê€2 ö:³Þæ\ÊL‹Ó¢‚Ó^Ä^cÖ@åϹÄ;íµYúr¤V`€r•YE׿œ*,… –›€¨*U(Íj2 6½lëZ¹´™ÅØ•p‰T”%—õË労Nˆ tB8 «ðD (BP-¼U£Â¥XÕƒ‹ToÕH…°@*RAÇ /(P-´M#BVb±r¤¶€`"UÒµªÔj •8²µ´ŠXûa;‰ Á«àv^å‚[]#­(Û.»-)s;¯ZxÕ°+)\¥ ¯ðD (@0-¼òªÁVÚð ª ˜Þ yÕ`+qh/¸Œ À´Ð6È«¹Ó†—#µ¥ & 0%]«WtgͰ¢j©ˆZ˜ŽÄ†¨Ö°Ó*ªmÑÊ7ÞЊ¢äj\VïwVµ° ‘+#Xå ¯ð ¯$"P¬RªVÆð ¢¯("P-¬ªVÆÐ 2Rx ±=ÕAš àÎ^ŽÄ¸ˆ@UðF;™äN•Aè€2`îíÙ-?åÿ¥Èjÿc¬¢wËšîôò@ñÂ.F*Ê?;³àï¬E‰ømg‰in2ñŠ ïÀä+\ÞÄ ‹`à€#Àõ'RÌ ó§*lLC ZaWЗ±õ¡€TÄÓ(E„ɇ¢17Lg-?šµ„ǘ921qdPc_åiÑ ÊìÖL£x@M;±º8؉ u:Ñ‹óÐD/íÌû‹äˆ÷‡ û*O‹fPf·f²üAç$˱‘°@&Q‘ˆÎDEbZº>QŠ@m>QBŒv‘n~§Ä¼}d™Èóér¡_¸Y-°m8ö+˜#q#›¸g±DÊ%r DiYÙ-P§Wÿ~™~^¦ÿÿúîÞ{=i}z•£Œ<íëSŽ \XbXO¯Îwß{£”ŠßõŸx]+³¸(…~”^䟟2q7!þ2ÛâlBo”ñõ_Ëä]òÓ©ÛBþûL*…7vóãž~Ä$Cš´´)”žñüó)k³©„.š|œ~F²K0VHËþ ÿ*àソu·ÃXµ¬é‰‘C£mþ÷ý¢”éK®Ði'Z0‹×‹vrÄ_矟Hñ`륵Ÿá½¬r¹™Œ%_¼ºÛbchâvpÌ¥`9?9<Ý¥kiç/cíFGÉWŸc’Gp¦ 1µÁµ„Í ¡/›ñùçǬuÕ ÝH〣ð þH x—í5ˆÖ¯©Ó›èÛ›ï1 cú9J#g·±™á=f\v‰2!³¡ksÿ.­'l”z¤õÖ•¨êªiÖ'63Íú¸¨ë¦1ñ¨ç¥UÿŠ7ü5¶þñ¸ë.9;«´ìüþtè×ÏÄ-Í!æÀà™äf”—6G.dÓ=w³nn뢶 ¤>‘þxp_¯ûÂ䎙“&@?0Gãsô!Î#ˆÖzp+®öK¯û•g a¿˜ ‹3r˜ —>ì'¨dg?ؼz¯FѤȊ¸xÕ;0£FrÊVùÀgMÎ’ì`d[” Së ™fÒß:&iWê…Ž5™“â2Ò?h£¸.åx¿AN™že£×§í·O,Nÿ’~:ÕJÇú¿û¿Û¼ZPµÓHá–‹ú¶Î.­Þ¶hž´ß>.EÞOäìn5ðW}Ý#†~àÞå˜èÚ]Äy¸«>Ÿ§“wjâéúëZ÷Ã5"_ñmÂ]ÜÓµ]iÿ'ôgÅÑ}‰¾¸7Ÿbü˜¢Å™“rÇœlûž"¤µJZšßÒÃyïR¿Ÿ6 õ.¯‰Oäán7ò×\ÜcÆ^z¥Çôy€&úö07Ày°XølNnp¯fá\óÑøÞ© |Äý¼ÚÀElö-þ”âÛâê2Ê‹Ww¿G¨°žÜæ—àÝé—g¬Í¿©øû’^>•ôò{ÿ¡O?úÝÝGéj¸)Ð$úÄ’@Ïïß V|Þ*Ì¢bÝUÓ uc…K¶8·µöPñ9­ØJEß ¹ý¥œ·W9¢þŠÄ—S¯Y×eÍÏK×v§ù>Ҷϰo‰=Ê_ÔwÜ£ãó»z×µ‹ã{nW³8kûžè\âTfwNý5ÑÏ.°)/m’Nã”9Â&““…Z´¸Ê&Ÿ(n£hsM:¦H@m¢Í6é4i¸`F†ð‡u‹)“])ˆÿÏél’ËCó•d²ñiH†º}üë;ä\cv\|pà*;úè°^TúxvZ–ã´6,É÷ ôñÙÛ:»¸5^dù×_`{°‹²b4€íí‚+7àê{É^hò^²¾—ì…ÄmÝbµÉ9žŽ‹2RiÿÞR/ÛmôÞ2.&M½ä¤dÞU´ILö~E¯zIᨓñû¢ü~µeýýâ7'íæï'Òë}½(Íïד*…ue~ÝcTÙ ’fiVÊnd[Ez²6o÷ ¡ÊæÞä\*<ÁôyÀ°”@â ­5š±iúQ1TRÁš6ÐRi\eáršìÊåÒ ÔÄ® toT±kÀ Àª'?”éAZM݈èRl Ê–ÂÜAVÊ` —ó#X÷"¶éÃÞ•7ÀÚ»Ah ûà;=Yqrx{4Z 1it– X•…ËžD™X ýG쪡w²"`(\+ ¨ž¬Ø§§Ð@ÿsìäheÅ.^MHëð]i j D衬XáÈ8ú±¢Ë[O¼ÉÃÀŸþCOCO ]ù³yˆ¯ýÍ›Š?=‡Õíä~s~ÏöWXS¶×¹´†‰6Üs÷ƒõ6-L‚hÝÞ¾¿dâiRËQV'ÍçÈ|ƒó"¤—ú bþT§@ÃåY¨kÃó.yÿXؤú7\*Ý«…Ô'¨þÓ~ ß‹þ‹|­ÓÓ"‡iߟÂó‡%× Ñé–mÚL ÉùÝC†o« &Ç<,ïV;šgA ÍwA|HãÓ>»‡YOå–U´ûqÎ r+,§:Ðjºœ äÓž¸¡·L)º@Î8ŒzuøsHôÅM7V­Û@3]îú}xÀˆH]îB–Í‘¡yèØ5$*˜&ûzõ×ß¿æ)Ç%O%û¡lŸ,äý€¥šŽq¹šCYd<§¹µÞÍÒ3áÊ­amd~ð½÷†a»c\Zl¦uŽnÄb+Q¿-:-D{¶'2ø2kö2¿ 21=ÎAˆ°õ઒×"̉§9&oîeö™’“Z¶M¢½àB9 pÝ.§<Ó{!Ôyz§U=ÊAD¦t'ôºŸYœ2ׇJۜӕBÝ6)W¶?÷BûН‰Ó]Þ.H~Z©”“O6ýc6§+©XU¡—–ykRìØÛ¨îµ¢]V„\Éõüw;tù³°„Ëumôg˜¥ƒx« FÞP,Z·Œï[,¾íWù&Hˆwr|[ÞOFöwÉ´-ÝK-äFÉ4·xg„ä(™R7Ôí1{ö|1ñwüëâý™g~Í¢µá¹nv€µ§šF>h|²jK‘Ò$ùÔ M’O½ø0ùÔ ÉäSz×m.çÖò¾¹—³rÏ|BË‡Ñ ¡_ô¹©‚a£Œ{“[µQÚV/äÚ<à^ö³Ë(%÷¹ †æS¾üø¿¯0啾Íå,T´%ƒ}®o>¯¨ò•ýì¤ìA”¯«oü»|OH¥Ï¥ ˜I~“— t-8?ÐS>ŠsÙÀwT)Ç‘•CC®ç…š}…n*pÜ’§å•àRó™’‚K‡8Ç\×%‡I õâŽÛÊÎ =å«'Öà\ÊÜ;>­¼ã·²ó#}5C“§ÂÍ× ™Nô2ûW¡;Cx…Gi" “¾š&k…F“†_yÒ +QhÕ€—¨ÚÓ +ehE :ð2@"ÕAÛ {äNZ±Rp €é`÷¢2©Af*± ì:ö˨ZS]àS­„T€R±½žlGÜ!ÎPpŒ2¬Â£4…¥9§(@RA5àeJcVœB@ „ÒŠ@tàåFdÏÍBN¡ Dƒ¬¤!+Õ—‘Ã@»À „,¤¡%¸L(×@kª kƒœBP`̨‚“,*/½žd‡Qù{»s*bÉ VÊð ÒL`Ï¹Öæ-Ë[ §d% ­ Èeƒ]`À©¦£R¢AVÒЊ@t˺ÀÍN5•r' ­X©ŽvRÛa ƒÝ‹ÊŠ™IÃJpy×— è— º6À©Z3¬Øµ ƒýèõd;Üq†ÂÆ(Ã*q`(bðÙ¢ _˜Xˆ m5ö •iû>e:Iå²W‡Ò¸}þl’×ã‰åCI½>›2Éòð4ã¡O¿¶ž¬ùyÒéЂ¿_iMV€<qhù×Çá“_N”Reÿdþ¢H““ø‘R*–¡½ÐÁ#¥ª†— ï»©Ò[U6Uö­ù‘RJ‹¾uGJ)_Ž”ê¥ø‘Rj+GJ ͼt¤”‰åH©¾ÍÕ#¥R“”êÛ ¶”šmb˜µvn˜µqfßÈšé)mºÇRù¯utWø{k·ÞkàLð圣ùÀ™Ê9G½$ÿ¾wUåËœI'W·ø-©ÁqR!oM¾AyK€9dPþ L :~ Ô½úU”:Яz ”è×è@©^èòR‚©ã¥ªg)û4FŸf¹nGj^C4½í÷ùª| ÛÁÚï/ôãïÉa-p£º½¾¶Qn·3ëÂGûYÅ3›U|Åcͭ˾ 즖çdÕÒ\ß™ÝëæÝÏ[ÖÒì.q¬øaèó|Þ¿+]Ô—öù>Œr«´4„ï¸SûW˜˜Üp—’ëÅän»ü5¯OnC¨Ý-x‹ßU'?Ð?ª½Å­yísÝì‘BÜé7ÈÉ#Æ5ùÎ|Ô£òø¡ +›àèÃdÛÛ;±ü1¼{^v3³®8±ç5«8’G›õ'&Ì}˜ëa†.LÚùœ>LXª;Ký]™4hìË:¹‹Î¬“x³áƒ§›ÿš¹³|À¶»•;ËGm«ƒîL¯ùc…‡¹³AÛ›»3³£Vwv;³.»³g6+»”Ç›õpw&Í};0#w6°óÝ™´T¸« ýi!j \wb•²ådu©µûÂoßxÿïymó‰HÔù LºK- 4v—v€8 ÿâ·x‘”O.:¾r®WÆ’G²Ì/^±v,ãßx4ù5ºÉ·xá*{rìL=»ùr°©QËféá«™ü`àüŸSZ¥øþ0|38Ûº2ý9Ÿ[f‚ÀÎù‰š–o…=.{8e÷§â+>ñ´ö¿hWùy(ŸûÚ¡í¡ÿ¼~ÁúQ9¼UÎé7îÿIî-ŸÎÌ ª¼2ßåH…ö¿¹{}úmÂý' ªX4 endstream endobj 286 0 obj <> endobj 287 0 obj <> endobj 288 0 obj <> endobj 289 0 obj <>/Font<>/ProcSet[/PDF/ImageC/Text]>> endobj 290 0 obj [291 0 R 292 0 R] endobj 291 0 obj <>stream xÚ+ä2P0PÈå2µ4Ñ372s`LsK# ÇJgp…+äqÕ- , endstream endobj 292 0 obj <>stream xÚÍ][¯-·m~ß¿b?µéCǺkæµð­AÄΩç-@^-Ò—þ‡ÓÚm ‰‘œ¤èLBu¥DRkIë²wŠ Ë›ùQEQ3:âY„ÿýË/žDúãóOžvñlµ)½?Ÿ2¡7íôó×OÒÈMYR`»Ñr“2Ö'éJüòéˆÀ)ѾGTÊÑß)ÈTE¤ê¢†žÿ)Üb-<Æ×bïð3Uñ°¶ˆÞsŸ"EÐýAлÁ¬TÅú:ú@at³KLåꊠ€ ?‘9¥‚^…Udx  j‚ŠËÔFEA³³¡ùÚdŠ„ÙM³!\`»1˜c;C¢QÃ/FÔ ‹õ¾ÓP«´ -½ Rƒ,†ÔìŽZ éèeÀœ:ÈlN]A7®­ +Öæ¢UƒŒF…¨Zu¤ê¦ H#D¦U-&3,ÈZjà¤'ôÇšâ–¼86)l³\`+sWï·ÝÚlQhèÅ`±˜¾À7|¨­ ßëèDÀœ`±—¾`o ¶‚|¯¡cê³µtm@»Ú òHC?Å`´Dåê¢!×|îá±H5¤YÌdPPt]Q+šìçø¿°âå?òŠç­Ùö šM˺ ™­+Л¯6UÿŽZ[W§ksCS×Èä%÷ÈÌsö¼0Ÿ½òÌÔÆ©-ÖˆTäsæS'~ž ~ž=i—}¶ôÌýZPG"q7¡Qdžh%*¡ËÂd©b1ÒÊREÝÅeÿÅVÏÿU êH$îFx4LÌ.„Wlq›­¶4Ø[Xm™Û›8aÌp-€‘ˆÜ@”FÃ4 éâ< pغ1P·}y-Á!ÌÊBRè: •½£ H<¿ù×øóóðóIøÿ/žþæÍÓïÏR>¿‰ëKtøò9¼ O«ÛŸßœž~ðVáÿêÍ?¶z³¿3žãÏGñçG=÷qlÖŒûÓžGJ¹íÓ[¡,æóa\Ž9ŸºMù4f²›>cú1ï.͘~†™ŽÍ9Éûþq:µiÏ;êâÏOa¿@2q¼-oçÛ·˜+š-š/âϗК÷2Jší8“±ñç/á¯Ôš>>ˆ™(ž³A¯ß ©ã?fƒ©làÜù`~†˜ÂYÉ»›úðwœÝ‡ØEqkü)tù“Ò(ÅxtóÑ›§àLà!:… ûk ãºp*?Wèi:úQ Ïv’Vv“Fµ!îûL:aú«OZçãϱtÖ&ÓuÂͤ~?Ÿ3ƒ´2Lâî˜ô—=“ÞyÛÞþs„PÀÆõb ;m«q7?ƒ9FÆo‚sÆ3‡±LˆK´çzxïu°èIǤ]蘦Ãq3zÛ\²?ºÜÓO†Åû#±,w+'6­ŽŽÃý\Aý _=”ToÑvP_[?àƒÞˆÑˆíšcéCsÃ]ijÂïâÏ·ñç›øó]üù÷øóÈ?ÒUe‘Åû–ê¸Ëøßwûëøó‡Ö†AðêB°}øùCÙ®Xa¨è££Ø9Õ¦à‰16ÄBjÐ ­ÏúÏÆ/û&l¨÷‹‚¬'—Ö‹þ^=tX¨{„ð$ì¤×aéØ+ä çþþQÖpÁÝóé»ÏÝ3¼wÿ²ÝL*n¥mvþ•uè5û]¥N“õÃ`÷œÜåo€|drÙÿCáxË,¸öwðWý}”ýèÍÓ¯Z@<[¶¤Ï??AYü ä¯RÎð9å ?ø[ùüá??}þ'†ï^øcÛUL ˜°ËP•þè=®÷ååŠúw9µÑÈ•ï„KA“S SAb¯D”?—Ä´a“lœÆ{9…r“aë©c̳W´­›£”êTH¥7›uÇf4Œ¾ü² àIöraóEµÕxç¿Øâ(â!÷ƒI|ƒ§õŽârÌDš=¥%ù=9♃g2ÿ~›Ömœ5 ¶²ÛQ?Ðà*%6µ3¶øßØØ0²¼ÍßrÕÆoâhÎ.0õï{èî{œ' aŒÑ£V[P–~?îv:Æ1ÌXäÿbǯC°ä§c“2FR- ŽÖc× ƒ£ …é–mL. ‘ޱ˜Q·‘‘qŒåå!2J¦xr6D1‹g¥\"cT"µ0DÆF¿!Ïöpè/yöc’[vsÒß «8ÒyϬÃ6Œž´ ýµÁ‘Hµò¼D'Ï—l¯5¯¯ïÀÞÁ²òô-0RÙíˆk jÑ.¤ š|ëÑkê-½ !¿?«t=†P€d ´ÄNèØÜ1.Ͱ×tÑÏ-Ç=üÙ°‡{ð‘|¿7ôž¤pàâÒá+•~?޾‚5oaIuÇ9!@užú бv ”qç¸=¬0CÕ¦ïáç×Ìek¢À‘¸!KÜŸÆÇ£ÃÈÚsî÷£×(Ïå×(÷ðõÊ4z= lF|޽`¹Röz€±Œ‡½VÆÄÞð’#߈ Ê9:Êý>üß·Ãð~¿¥aþ®1ú¹Á§ò NµÚ¼ám½KvŸÁˆÂ‚_Q9•¿}èø×Oé„Êö´¬Œ@¨T“¥òßéµ¾ÆyŠDܬŒ KvO”Ê Ûh¥™šü\/pJt®…Ao´Ò#eùý1ƒð#Ýã{‹:é^C%•)L z‰S"ûA6„@h´Òué­%$rJt‡hµ`DÆ.„Ò#E%57§)3ÿ>¼ofÒѲ2ö•Æ—„ü]-P‹¥R´”ž(•¹Tšª³T6h,P-ð¢¥ô/•4lÌ_­¤ÁåáCtÕ´S½X B Æ›~À›dÇÕF/Z%2r! ¨%ÀaveXWôîN"Â(Ýì /ÀÛU‡ÆªòÑO#ª¡4ì2ß .Z¢ruÅÏÕ¤{D¦ÚK6(¬"WWÄ*Ük "Õj:ÌN¾ ~̹bFvOÙ®f']Þ®:ø½T]2fØÕ.ÙIOåꊟ«+H÷ ˆ ˜€&;é)¬"WWÄ*Ük "`F ³Ì*@:*C…­H jf¨†R¸#MH÷*ˆ ˜€&S!Tů”õ>·B†‚²¨EâpݪÕHàEÕÆ•E­'v ”.EÊ=U«½ì«ë5¬€È@¸  )^î)¬¢V×5¬ˆ@ÀÜ0K(‰ ŽÆ`\[Ôˆ$ÔÂf@5”Â1h":馂È@è  )BfTƯ”qmQÃðqòí±¶,jÚÅ÷â»U«/ÀÛªCeQk˜`WC¸d'=•ª?U^•F ˆ ˜€&;é)¬"UbFˆ˜QÃ,³ƒ ŽÂ°«ABÍŒÕP wÄ ‰¨ÒH‘3Ðd*˜üJyÑ5 3>rO_Tœ*aòvÙNú ¼]uð|õÖFT3jØÅ\´DÕj%ZuÅé^‘©fÔ@£ «ÈÕ± ÷ˆH5£3Ï.@:*C…­H 3j¨†R¸#MH÷*ˆL5£M…S?S®JöðqòO‡ٌ̾ ¿wvÒHàíªÝ¶«½˜`F€] à’ôT®®ø¹ºât¯€È€h²“žÂ*ruE¬Â½"fÔ0Ëì ¤£2TØŠ€Ô ¡fF€j(…;bÐD€t¯‚È€h2BUüLU¸*ÙÃÇÉ÷.¸§jFÞ·™cTfl6}µ! À†cÕéç?ÙàUB ˆÌ‰£VàUM²#@-v„´‘Ó4*£AG™?€-v„Õ ¡­FÀ ªƒ¦£ZRBdN5™ ¡ª‚LU¼bJlÊÏæŒi~ïbŽ‘æ­§yF–š$§hÆs!?År“ÄË—-$/ØFr²«eÉ”…-ÛeL¶¢2ÎlRÚs·áèteZ¼ §h°zsðâm8Â¥Ûp¨4¾¾%hà] ÷á¨Í{ø¾¢ ˆøB樣gïÉ7wx&sù>µížë\+#ühzè•8r³jÖ7¼Ù~±oø+§øðn]u%ŽÜ„•¼ñø¶uŒzxùV·»Z¾èÜvÁ;MnÅ‘ÁÆÌ¬.0@¹·âhsUw¤•éò™ywâëÈñòʹ|'ÎUÍ*wâÌ›Éó‰¾äÙôÒ;å܆#T0:Å8Ï܆S‹¶é›ÌÁ‡?üKî È^ƒK?ö{û¬E™ø-S§„| ŸD©ÁgÞýåÓí;ç‘×xXßÎ|T_Ô¼nçªÃ¸£s#8Ö …¿W×rp…ʹÚzy5¼ à0›ˆî•ª%ߨGWÂ;ú:ŸØGÝçF¥ŽÆÙQÀŸw¸ðì;‡#xx³r¤•~Åo©ûác„¾Ú÷MÆ•ˆ°ñ‚¢ÓãC>øŽSZyù ê¶BÜ?ì:ÊJ7¬p¾Å+V²ãaÒ/áÞôa7Óß'‡M«Ó& nûÿ•QwÚ®_ºíÎ…¶›¾íô²#{SŠs|Ø\ôÁ÷ÌÀÈÞÑêoÝ•SÙüMÚç¶‹©¢kã]|5·zåxÌý«WÁ¿©‘»§/Ï#ö°-6}ÈxÕHï÷Î Ü÷ÍSbø¸Úß@ůó·yЬ«\ª[hwØ©Kå|׸T.ýgºÑ/·Fû°7wîôS)·ÁùþÌw#æÖ‡°{‘KÀÎå "„ÜÑxþâ§r?"áýû‹Ï˜!^^Z˜åÜzm–ØÄ!—,q´†ÜÑÛïÕmKǹyItñõ–¤Ͳ áT¼íÚYŽîŸwÿ®{)½'qä:¯¸'1¯9j?šuL×Îw͚å_"Vá/‹wEñqƒ$õÁao{pKã;VŽiÇëÔCÂøÇMÀE_{Ç |Ü=Á±y¼Écr˜›æ ƒ¯æ0Y7$»ÛóLÜ„Crç7˜Ñ¨Ð?ždr9÷œ×ÈÁ¯7pXíª¶÷8†'ñzÂÚá.]'‚'0òœyÿ~7˜7klp£jîfßUn–I¿ˆ›·ë ýx?Ëpïr´J„±0¯îh6—ís0rw´zÇgò6WËqn÷µ¼‹¯çkùl[ÒâòÅÃÂ^ë&¹#qàÿˆãPXòæææü$†ÉŠëѸâ-ãKvžá|WyK&ýÞR2ýcKÍ-KïÒ¿øòÂm×GÙý¥rË›€‹¾òž9·;Z=€ã­»ÍWpn÷•¼‹¯æ+³5ó•‚^ :éö}àL–=&WwÃV<Ý‹(æ[qÎw×ãÒ/â94¾_ó1NOî›—/}ƒ}%ÕK9½Çÿe§wûŒœÔÁÑÆÝèòÌÍoÐÁ×óxlª&ÖKIGëÌ?0ðë.nÜÊ$úŸøÔ¬]žúÍÀÍÅëñUëC/ÇØ®qrLø%E|ÛÙû8'BË_:& {ƒøÊô y¸‡ þEwÇè<Òm ±¶Ýæß8ÌÍþ÷ïÕÜŸ(=ÞÓ’8.^!®ÎKŸãÎ:üRø±§W4Þh=pÓ.DÛ¡GMôæé³ô¯ˆçSøõGú‡KÿéDˆô–{æëŠk•ÿåÓ—Ïÿpÿ|¤;Û endstream endobj 293 0 obj <> endobj 294 0 obj <> endobj 295 0 obj <> endobj 296 0 obj <> endobj 297 0 obj <>/Font<>/ProcSet[/PDF/ImageC/Text]>> endobj 298 0 obj [299 0 R 300 0 R] endobj 299 0 obj <>stream xÚ+ä2P0PÈå2µ4Ñ372s`LsK# ÇJgp…+äqÕ- , endstream endobj 300 0 obj <>stream xÚÅ]Û®%·q}?_qËì^›Ý¯4#ìM4ãdòd 6íö‹ÿA¶&°Å2¤‰/?h}‚‹÷ºpoö>õÙEV­*²«‹E6›R· þýæ7*ýxñìfßnýnc·ÛS&ìbW{ûÉvÛ<)Øo¥ô¢u¬K’•øåÍæS¤ƒ±Œs”ÊÕ¼THª-*`2§T€UXc(EU´‚ *tF-Lì” ˆøexÑSèŠ*ô&5Dè”hÒ÷n·”¢iM Ó•0©S*ÀJ¼ÛU5dªÂ }|`õ ø]v¥H¸ÍuWÂ{ãíÕà${ªŽÂ¨ÞÔ±‹7u¸èM„ªÕ?U7¼*M0™êM4z¡¨ŠTÝ‹0ÑÀDª'!Ìܧ´€è( ¶ P5D¨yRGžD(ÚTÝ5i¢‚ÉT?ê ÑW$•ñÕàŠ$‡›ÔÂÙ‹‚Ú­|w\°WVT–ÍûìD¨NÔ‹t°è$„ÊÕ=×V´&Œá©Hõ ]„PDA®­xUãS‰ê?1ßZ€5Ôú Zˆ,Ó¼§cF÷ iD®møU+ "Õw:dôNôLT°*HîðmüÃ[þ‘‡·àݲÙ›üZ‘ЯÌP©duöŸú;‚+1vNÆ8h&QO ¸"ŸðÄËÏ„Äóç¢ذ„:#"+àt“>4Róp9 à4w8½ùótùñ¦ÃÉ‘g»Ðµ*;¢A:hžd°@?~hæslða±àrx¢ƒá¡à”éÚ•ÑŒ 4KÄ85;yÞvhð!mcù ~$ÈÖ‚Ö!™“f@“.›&{|èd4=”ð}y´ yÉ‘¡ÂÑnq¬[&2à/^K‹^Û ¸jpÒ/ïµ_ ýÉÓy• Û¢ôèÎiÿ>]oàAöVöêsÊ7z•Îø*^~,Ø-<Nr¿nô¬Øä¢”Ì>xy³‡þžbþ„ŸÈJƪ€©ü ’'oÇ]äö5=ÎÆ/Ú™Þ¿¸^Áü3>ÙŒéÃö>ë-—aéªA»eEÂ#ï“÷ßâ·UH¿" dÞ|—X¡À‘‚\?£L~QÑ—G }Þn1ñeg,ð!sÉÿS K=²ý8̬mtÔå¶Y £Ýv±m„=3%›õvÏ_5é±=ì‹òZO㇠£^ «ç6ºÏNJ6:P&·››Ù¹Ùes«àúHŽ+Þ\Õ½îð iNŒäÞËæèö,ý´‡ƒq@éëìÒÛQ»"2{B5e€üc•A 9ÒOé  yŽ2‚óÃáõ0z­ñ^q|W4€ÁïF|ÊþµŽü¥<È#¥wE1¥Ü Q~ëPQ‘\*hÙ<ŒëÛX¥Õ¦µ½ò©u€4ؾ=¶í†8½cÛW<ÞJ­Û£àÃÝ5nDQs;0ˆl÷±z'¬3šŠ7k]UC£]N8ü^éq«õʣݠ‰É P›Nê«í>Òó­K~ µÙ8© VÈûƼÊ*¦E±–®g¬ ´‡Û_M{:Ï¢u`¶âã ö$ëÞÆËŸãåóxù}*ãÓïF}œ¬ÿ2^ÞåÌ‘«”·85èÿâåOí’¾J0Í ÏÜ çæA–³]c¹ð£„)`2©:Äj¦›G¶ÝÃÜÃAÚÿX!ö¡úÿr„½Ç …Ä»=BÆÝ1ÀJœ»XÑÂG¯Dµ¼W“¨ÚþÝÖŒëY·ÁãcöKݦ|½›%Êj%£¬>ǃ,$.2Ä…&ô×qŒæf‘O[®ÕßÙÚEoÙ:: :3£“U'áò{¶cDz¯p ŒZ<Ê?Ž­‘[ˆ$ð0 é¾@ûŒ.ËnËj¥²7ߣÎ,«q‚ëÇ ô'y‡ÇSk!è;o«Tÿ†rA”Œ{á×GMýÇ|’³þ“|ÞµZŒÔœ_cÐhr¼Ô s™]›IC´…Ü™† 5›7@Oiš ºD¯– üKòµ¬ßY×Pt]£eän0ÁÑßб|h›OŽê,€¬ÜÉqÃe»Ý™ÙC“#g(ÕÝÖƒÆoâž<Ýß+ïna6Oy_ô|BE g¶›àIoQÞÃŒ!¾R4‚Ñ Æ=¯2 ?.fCÊ,ü1»Ó¥¤(5EËLÃÁPà¡?û†[åw œ/e¿‹—/3«uY!³b2:†5ýoÙàû#†ßo]Ï<â˹}Þ0ÈPöÝ_×°i­ì´Ü°DË ¨ŽD¾¡Y ¸Âàf|Ú&Ÿ]ßFíqú0뇘³xuÝ 6v[¬:sƒÿ}Ô Æí#‰<ÅzKçi’ð]ç´ñÝx>gâûpkM×l]/ˆÙôVpÐeŽ®ƒdúë–ÄâÆ ­‡„&—³zÆ3Iê÷0§g<Ô>xÉf•ÈèwÍÙž°Å#˜Â9Î#C_|ÿiÜ>d|Aß¼ÓárÂU´èÅ0[ÛãùÌÕ® bkÙ^oW Þw]Æ÷´Õx Iàn÷œþu"mÿḐHÅ…Žeà—(ð¾Ð “ªK»'‰Ä)ÑÄ^ I+؆D5D®/í¨S¸s¬Ú¨ÉRxN܆ZÐ@©Ê¼iÈÄm{+‚tΑ&*jAWÁu¦=oTì¡úÕЖµ‚ª¦4T¡«Áݯ¶ªjK_sTQ_YÍ_„‹?±{\µ3Å_ØáAïþÚ ¢Ë^T ãóŠË6¢¹lî.ÛàªË’44† Ú °*ÕݶÁV·EÒÒª+hÀZ°LwÝ™]—з¥2T̆@”P©â¼ ´8/¡‰’ÊД$q¬‰jˆÕ_FYE+¨¨ëˆc$mÀYæî&ôû'¨ÌØÜÉÁ¬ÈÙâN¨îÔ)VvIWôâJ°¸Õ@¥N5:§ª†âF°¸Õ€eN/ßýAAÓ‘œ¨#'b*¨ÔIâ'TEÙ‘"p$ª…‰œ$hñ”AAÕÒ *pô%yÏ/Œz" LB”‚„)á)¿aóÐØ*‚Î4ŠÿP0^9}RD˜>2’óè6 ¹"³8r¹óOžG1 Hhu–ÀˆéôÉš?ñlœ9ŒÐ!Ÿ¥mÌà4iÃ$¡CÀtTâŒK40LÃ(§›˜ãÖjÐvÙƒ»rùÔ˜àm«>³|ê6˜HÁ½Ó 3.íœäLï·uÓ×ãuL»o£†¼'¦sæóJK ?$LZä›ñºÙòjd²iÙ²Š(ª|M/ç8Ó ÙY¦^:NÒ«µ0q:ù³6®¾È¶ÉéŸuzq«ìT÷;{/™^7íu’®¦Ç}åÒ{è¶—?T“­¤KÅõä\r‡qÜí¯ï3³ù´ÅbÞgE»kt·Ì·JH&öÚ(Äï)¤ vM{}‹tü„ëX‹¢/8¾uúzãÌQÕvì¢tu\g³ã‡™n¡ö û 8Ïl¡Î±Ó‚o(w¯ ž½wgüýhåÑÇHaöô5±7ÌÚ‹·%a}š.îç]‹?ˆïûñfžø$nß®4~aAwm‘ B1² {;öõ·5|#À™F¯ á•ltU|%wÚq>ñNÀ(iØø¥€Úà¼øÁÒ¹Ø*MìyQqwŒ´ãÂn–ÌXÄ– òJ‚É™FÛÊØ£ÚbXù×,l‡"Ï„ Œñ+!Je†í´QBMZB §D#ð”8ÚtðB5Ò”fÃû bwLò¡]‡.„QBOš?vÖS$(îæ(î†ú£F % wC=á6Op=³¿ÓºÓF Ue¥T§¯lvŒHÄÍQÍ3pm¼¤Úùr°W'ªƒtìâ!.º¡juƯծê®Õ]“©~ÒA‹£àƒT j׌àJ°Hó—ŽX8¤U»jl–i¾ƒ ³óàÜS¨ÚU:6ÜSÅ:¤ç CYç–#Œ®&zA|ciö'w¥ïÈaPm¼¨z[Ö½¼~ìDó§†]=¢Á%‡ÁT®®ø¹ºâ5i¬€É4j ÕaPA*Zu­òX éþԫà‡T´ê Ù°,Óý©C‡A¸§Zu…lDdž{ªúBƒô¼a¾šÕxnyÃÀjÀ $[ñÛýS%œCØÆ‹ª=è+ñ©ÕŸ:vñˆ†Pµ:ãçêŠ×¤±&Sý©ƒ‡Á©hÕ´Êc%X¤ùSG,ƒ RѪ+dÀ:°Ló'™àžjÕ²î©â Ò󆡂¬ÆsËVÓT·Ò–ødãy eóCr\`/ªŽ[mËу¨þÔ±‹Gt¸è0„ÊÕ?WW¼&0™êO´8 .0HE«® U+Á"ÍŸ:bq\àŠV]!Öeš?!Èì0¸÷T«® €èØpO_èž7¬T5ž[Þ0°šèÖ.ëVýɺ~ •»3 ¿VgjDs¦L±ªÈ‚ŠŸœ©áUg" ˜ÌI¢&O`TUP]©AW"*°È‰Á%`T¯NÔÀªt,sâx›TC/îÓÀªûPô ÷ Å«ž! ªÏ ®¾#îñÙ”Èx'é7ŸÈÈÀE4ÉÈÄŒà@V&ÆÉ(-²Ä#µ–“È-2‡Ñ[™Hˆ‰ì‘‰Oä&É¥˜ÜI.ùh?É=DÂ;]“ë"³å¶6x`µFL•g3x¾‚t`/¦O³Y_U80«)õ,Óç3Í™¾H½fé Ÿ}L·îl¼½Ä÷HÃÃ]üà ÌåLŒðZ-+’¶}Mß™°¦Cç}g¶äœtûÌ®ÓçE;wŸ>¸ã\£í3ëUÍI;gì¡æ@tˆ‡rÎã;g®²«:8·+‹5²‹¾¼Œ/ye7vÍÄ3ÕWiì™]3WâY±‚ݹ±bärÞøŽˆƒ‹”}ØC¥’ŽM/kXì8¬„¹°;<®ÝÞ€ÝÛÃ…eýöû™ƒ°¢Ž{ôû ˜ÝÇ䜰îÊc°¶=íAàÜí,À4ñÛ9+ê¾®?¦ÛOŒvK<_kà´J[?Î÷cÛeäyà=×_êýÐÃ{>ï›|ZÅUZrì  4!mÙÍ>š‚)d!ø 93ىǞ†pæÌÚ\È¢6§%\³”·: ÔŒ-TñSÄK·)&Ïá`DxŸÞ:kµ‡uØÁþ‡ëb‰wÿ>ÖküdÁ6Z^Õ§i8x0¯½0ä<Œ×ZÝzíhd¹GCGp¢Mw§Ì݇)ÙÀoo˜z˜;ƒÇw8Æhùшƒn0mÌyÛ|è'2ö!èÏ|bˆk_ žÆáô⇱?o·F‡I´Á髆BvmÇaJ»5ó6¦$ßñaJÊ>B…ùÞ6·ß5Ä/ÁÕnó‡íqrû‡ë÷óö>ý>ˆq÷1y'¬»[ÌàÜ9hšø­MÙ~2?A«¥R´_Ô¾„Ý û…çþÁ ŸÎsOŠ;w Ö RÙ–À¿£‰þ¹¤Þºôà ˜­—N=Uú¬ŸÕ.ò(Ó_·-­8Ï«`;]…èéâ)ZWm~T£ãIWørò€õÁºü|\½{—Âà=ì qÓîRʪlÝ·OÅ]š®ÄÇãâÔ"Æ",žýmUú¿‘ bÒ> endobj 302 0 obj <> endobj 303 0 obj <> endobj 304 0 obj <> endobj 305 0 obj <>/ProcSet[/PDF/Text]>> endobj 306 0 obj [307 0 R 308 0 R] endobj 307 0 obj <>stream xÚ+ä2P0PÈå2µ4Ñ372s`LsK# ÇJgp…+äqÕ- , endstream endobj 308 0 obj <>stream xÚ½=ÉŽ%Çq÷þŠ>ZàQ1÷åHƒ³P ÄáLsFžƒK0Üì‹ÿa8 9PÏ‚î-þ |·ލªÌʈÈz¯Þëi`±3+2"222–̨GuªàŸÿúã‰ÿxtÿ$©Soí³9=Ÿ~Ð:žþû‰önˆžtø [ZfHß#KãO'ÿJ€Ï±5˜—±‰¶¦×yí(()5$ÀÆœ- «-åßjטZ£ ˆ$ÚçØ¢s°É3)´ÆVÁGÉØèslQì.ŠÝÁÈûﻯ -ÄÞBŸc‹b÷|2µ£¨+¥ˆ4pѳrJ³îd3àÂ.ºÓtø Û¼ÖC_Ϙ¦FUŸŠ»¨OE7ªOÛš^üÓ낯Žn °1U}*Ò¢>M‡kHÔ×ißi‡, ´`œ¨é-‰òº ¬fÌ¢FeQ£¦#64êëJ£ hi´ceª(=Ÿ˜_ÈxÎyÅÑ’-^7é6\r‹Â´¾Â.¯]znÒ§¥QôiÁ=kÄ‚Ù&­òzÂ?¾®øÊhB€)ú´ ¦íp ‰òº"Ç"íªO ÆIaÚŽÐ’˜_W”¥ÑŒ©ú´ œ¦íˆ òz¡1# 4Ú1UŸ”žO¬é˜ÈxÎyÁAÈ€D•ǤNQåA+¿èKÛá hó6ÉûI›–FѦŠyV‡j iM¯gìÓÛ‚­nÑÓ!E•”³®´n!Pß”exK¢Q©Á7iJÛåmAXÇ ˪F ÂYOÚŽ¸P¨o+…2¾¥Ð ©J´ ô|Rµc&â9×YêSü"¦é)bŠ ! œÔʇmL`MǸ4“F•¿‘ŠqÙžøIø´=Vsœ¬°s{Œ®pú ¯ÐÿÝ;Qøý»±tØ¢(–ÆD€·ëèM‘&wý{âûn F¸3Øã¡hx´É=q#±ÛlQ¹ÅfÍí"èÞ´Yƒ,Á¾Hœ‡{b5‘l Ö¸ËÙã¿Eü¸Ås“´Û°‹bƒeŸ;ЍGè¥aÉn~fCÚ"âÇ}1-O¢6Ä´"¦Øçð8{Cœ#<ÎÈC¯ý.°tTi#ôÒðt)¸GÞã‰{Oè/2Î ¡¿ˆ»ö„ƒ"Ù ¿¼;VêþX¡tiÐK#¥¡ËäÀÏþ€Ç}ø÷'ÿ|vòÙ½tªõéFèÖõ)ú}ÃC:=;?ùå3¥TüÕÙ¿-ïÝàb0_àã.>¾n¡s|ÌúA £µœè™2žÂÅÁ™˜Õ̪AÛ à>£@`d”dìçøøôzPÙ È0Îßàã  ÀJáã[ ›&gɇù¨Ø?»—ÙZ°~&¤ŽH´ÅÿÞ‰¶ôŒ‘ä¾!0°_½±è)>¾’àëøïª€îÏ<9&ãÈ»g'1/ž÷| E[u®mܢО¡çÖ¤ÛD£s+$A£  Ð*Þv.º!;+€T½¾¿Ì¿¡£=0š‘¡Îÿq}ȵw9 •~ÚÙ”cÏ~I 2(Atê÷(Þæþ¿©«K´Øi|E1f—æ;Ð%9{«ã¾‰½abðrÏÄ8j—”^×úiý›Æ£’Ò’ùgtWèÑ^ ;ãh´Ù ;2° 'M µ‰ Éíã3‚SrA@=–fÚ§ƒ¦£#ÄvËt4„ÞËéèºVïò@ŒNö0¶”ÚÊø¥.[<¶‘Rué!÷K1H½y0Ùv-­VÈ~éКuÅ —ÃäUÀ);ÇâHçþÈm‹[a 3÷›ÆµÀß:œÍ¸±_ÐÀȶ{Ã_£(-å(ßN3ÂþÒévùöàÑtnù­{•47ò²øtrW}þ‘Æ äÞ±e7a¹‡Npg4^¹u… µ\zŒ-;xø*éþ¬uàö­3EÝŒi¤_¦NÞÞ;pDòB$#m¹ZL‹¬bÀÞkÍåÕj߯ՠÀX@üßXΎ鑾ÆÇøx‹—cŸ0ŽÆìFð=>.ññ¯ê‹WS$Øð2Ú;ørÜoî8ØÖ޽£¶‹úÓ;m€ms«|{ˆF„Û·bì>•Øwغˆ½gœŽç¸‡M0w¤©“xŽ7ub†ÿ8K·­<[Û±p-íUq²HQÚŽò}5røø€+|ü¥Z°×“œ„­6o1|‹Màu•|{óùX\Ro+“ïë‹ ŽT¶Ÿ§º¦¨Æ ^ñ„”mˆÕî3Ån»-–coÁ¨A¢d`~JcìñÆÜnÄì¾ã­ãO'÷uk|¹wìçMXî¡ÜgŽ;xŽ6Ç)þÃìñ†ÕÚln¹[ “mÍ64¨ÅÑY Éé¾ÊKW¶` ;FêX£ß‘ÔAFÿ×x4ÍBpïSWB ¦W4_\Àüx<*'ðÑ°ÝØÁ«Ø!ªUå÷m• “Ä|{Àp»—œšM~ç%‡Ù}‰À¡»—¨w‰`CèÀYÃOkT2NÜ"Œ håÁ À;â4]{˜l–ó ‡ž:¸ñüOH¤è©aè,Á{'qy°Y. =3Ô*˜½K‹»gXIâ`úAç©Åy3D7Ýè‡Á³vôºéPƒËsÕÜÒ˜.õÉ¼Õ F— ¡PÚ…@i”‚à\¤AÑ õ\¥… Ò2ÒŽ¾BW<¯ séÒhù¯øGþ+™¿N{Â?·+Êq4!€SKb'æa‰Ý\Á<òFÚÈÊ ½Àj;33_-óÿH¾"œ™í‚iO(§Ñ-´#*ÂZÍÌ{fË5Ìv:&ð½Ç08ÏÜ/†û…€À91(Û…Di‡*Áا±¦žt¹öjß/ˆÊtïs…Þ°ÊtÒ{—kݾë;cóH=ûA™|à› àS£—Kžû<¼aæÐÏ~E`*àB9ÔWç×±UfÈ`Oø8£ŒB–äŸÑð<‰Õêq%ÿ„-ògBLXê …4ÝÒ»7:ÙÓаôY›=ÓÐDÝÊ4ºW"Eb‚²;"Ê—´ÍWJ”ÞFÊ<:ÝœUƒoÔò<(.èL7µXTi{Ó¨)‘§É„‰ý€™nXˆ’¬‹· «úIQI0d²Ã𓳤™¨u¹¦… “Âx¬»!©•á ’n WWÔíVœºÒ‘&µ«ÇPRn%«s+ÙÑN ôbt ÚídaǼrXæŸðAR]ïÜÊ îN ,LEâú™ÀÆ5ú2a³rìbœL>5"ntI²q Üs^€ÓØ¡Ëpèé$×ÉQ¡mS“cà‹ú™›‡\&ØåjäMMÃþRÓ0ÌøôÿÒÌÃÁ&gÌ i€3,ò“Æ÷kç)dÇ€;KZ¢{CÏ*ßU¬ÿC÷›Lƒ?ÔÁ¦U)t$¶dêëcAq-Ž5­ò`¾mO¾òyUÍ+ÁqWƒ«.XÖ_o»–ã=X czÚb;gXìlVåÉ·²Á/êÒ½¢Õ8SM‡V¨ó{Góþ÷ôœ×¶³V‡MÙãõ•ËÛ§Œêþ7b:ÔXæäT‡m?TίhbÇšQ>쪲ø²wœN-$`]8ŠUË>Ð[Òe_ñò£¼Àó¶.Úª¼ïVOûé6 UÉ^ƒŒ†Â ¼b/LÒCT±#ô Jj1Ì»hMs£e\ã-ƼèÅA 3„äû«»Û(Hõt ¥ª|'Œ7VÄÅÜK÷üyÒá_ì˜/¶XàkÝJ‰"ÖyFCNÀðÈÂ8ó„¹ó­€yÄüyèÀüNxÊ‘{’LÝœe4"Yþ¢fMOøI^ÆÛÃKý¹ ƒV’ž•YpúÞï–†HÑy9i¸Áz)á)±ÙX—@arßx½ž²ˆi¥<±±Wu_µûX­D1ìo+àKj§êm¢þ?|ü½$ZŒ4ìÂɶÜþü`Ð&#ÆIólÖ:†>ä»:©‹Êó;¡¬leƒ™†O}´Ôz¦<(­äŠAD›¦tê-¤î]YPÍt~õú†f‰˜lJI~¤GóxÇ`îgB'Ú¶`s‡Ép_SóÀQ2ýjU¥Èhˆ®;/÷×4’ j{Œ™ž@\D‹o{*éhòŠFs?Õ¿yÇc ˆ¦Ýr•ÿ²Jµd  ö+éÞ5¨FÒɱ·L:LÇ' ÝÔ¾Qµ†ü?¢@é¸j€é Ó—Tv(Ÿ/ûñ x º”eLjäWèm)ôâª?Ò܇–4ÒÀ/ö¼˜óÚöaðÁÉ…ªé}ÑfŽ¸Ëø;~^ŒîD{#DÜ:ߢ¿x`iݧ ö®›Çz=‘ošŠ“ÎùqÛ?éñT©[.-«¬±KeÃG­Þ7c<à9ôƪÁÖåÄoܨX<«\—òÞ}jAá}°|ðÚ¡ –ÿÆqÑ@,È¡×ö¨¶cUAW4¨óé¥ãí¼ŒÑ|pç¸%à?Ú­S…ØV«Ðåéàý9+kÄ ÛpÜþ\”2  â*qÑ~ a¹ìšsûîð?)ô½§ùQ¤’™×RË@¡µKð»^mÿ5K<óbãÞv”>A†¤9àò±`) "ý.ß+eØ:€2 é|¨kÿF|ƒß7dçwˆ¿î„Õ"LÕ],øò·O>ÿêË/ž?>ûüìn?{Hà· ¿"8H3Ûòt„ƒßû€ôšµÈÀA ‡^=ötà¿îÅ,pÉX/0ðÚŠµ¯C¦Òÿž ß~__ÖDàM=Ö0â7\þL``5ÿØI/–sº¿R`Ço»%¦ùGQýNSC(á9øè‰'‚/ªÁg â1ˇý¾– ,p¹÷÷^5NŒ_÷PØÕh¥g©o1X9 ™ÅÚ.5ä…¹©†bªÌ¿{vòÍÉŽ—ÐçðŒÓÿ;,ãïÈІ¯÷&¸¦‹€–ñ:yzú€÷ÿä…ò endstream endobj 309 0 obj <> endobj 310 0 obj <>/ProcSet[/PDF/Text]>> endobj 311 0 obj [312 0 R 313 0 R] endobj 312 0 obj <>stream xÚ+ä2P0PÈå2µ4Ñ372s`LsK# ÇJgp…+äqÕ- , endstream endobj 313 0 obj <>stream xÚÅ][¯%7V~?¿â< ¤PS¾–ë‘ˤ§sƒFbFh¼ð’L!¥$þ ¼Ãv•½®ÞÛ>§we÷±½Ö÷UÙË.Ûµ–k½_óÿø«»õøãŇw{º«]ö”î΄_Œq÷¿¹ !-›íeœâ$Ã,)‰C¿%~}÷·%c3)‹Ÿà›Ù—¸TídÒ,íB8±1Q°Í}ù/ßËùÇy/[ðKÚB¥ ‘ ñÄ)F2ܲ5šöwaYï_þSùùeþù0ÿÿ«»?~y÷óÒ½1÷/ËE”z4÷EÍÇe‹éþåÃÝÏ^­ëºýáË¿ƒr“+ÍoZèOÊÏûåçϘ¸Ù–°íJü#&d÷Å»M ½Zm`r.,ÑwÄœcb¾ÔnTrñ .?—ŸO™Î¶.«Õ·õ¢ü|Â%÷e{ïb×ò/¿â”ÍÂ}ûGEA½}yRmk³ :Mõ{å‡Ý²uÅ tռDž¶lN ñóva ÖçÚ¦s£Æ•?8ê‡Äu1›&ø˜ …e_uëuð§Z|Ûr¯Õ ó9VY½(_ÔV5.¼ÿònÏ6x¿•»w¹?…°/Ö¶ôo0½Ÿ¶J×ÔÙuX‡ÙY-mqYKÍÛ°oáúþ®Ù™Ý‹E%þrËîœú„ åŠqA Uø ^£/TµšÕ(Í«ý#X›³J§Ó?rg¥Im´Æ¯¹âuÕ½wÚ£¹PÑk6i¿óåßoÊÏ›òóïåç§òóCùyM9Ýš¯nßÊ¡ø/·~qå¶…ø×œç'¸€ƒñ ƒa I3¾æ:GòÇŒi'·ø¨/àPü&¹Û%î±/©/˯Ûâí~EüËòóUùù^Õ‹/#q1¾ÞM½mlÖ>šÅîº)¿í×ß²{k3ŸÇÜÍiô.?ß©z ùVþn=0Aã³>µ!ƒ7ù±¡òü–x§¡çÆ\¬ÙF·[F”´nJü¸ŽßÁµ} wÿ-üuü–Û{ÊÓ †Ž·‡æÿu+5ÿuv]Ç»®é4Þk0’öµ;LX—à5Ù“F˜2ã°úyô“¤kÜdò:w_}ÿF¯Ž2Áæá¦/ 3yN±všãâê'Whû„ø¥¹M¶ c´mtFš<鈛®”É¡Æå—Õ<ÉMž›Ù2¬ÎÝ/ô‰òµî-ÇãŽm4 vƒ±¦WkÏ?Ø\ž×è³îÞpHaqÉ\ß–Bƒ½a)ÞÝ–B½½áòìÖrÎËÍá2–rW7¿âžŸôAét6¿’ËÖ¨k r¡üÜIú¾?ëìóÍü&ÊÊýúýXoç*ÙL¸p«L²LV])_0¡KèZ xE—3yèù—|âð‰ÃWuÎ8Câ ÕèHÚ#~-Dü¤ñ‰X$ U£#iƒèµЪ2C' `‘€Vޤ z-´ªÌЉX$¢'ÓH騨Á^f…ûñÂî¡%ÜnÁèxz )ÓÙÓ,1Aìñ‹q!`5=žA @ žú”‚«€yÌ$I’ I‚ OQ@mhÍ1m2š2t¢€ÆÙКñaš “BCFS†NÐ,­Ú\'}`ÚÑ”[Ú¶%ºêXVéðI«FÇÒ[i*àª}&¨]þa\ØLeP"àê%XAÁUÐ<3I’$H’ !„' ž$xš!’ OXH±ƒËP,TM ›9’ C8H±k—Ào ì8šÍd3J’A9H±k— 9¨š-BV»ìeTÌpí*4Mmü=æ¼4~Έn#mË2Pƒ ˜S!Î ÒøÈ“Ok]’á )6pŠ…ê`ãdk]’a)6íø­AãGk;€l­K2()6í4ÕÁÆGÈÚ´½ŒJƒ¦]…¦É£5!gÔm‰’p ÷%xz >›_Ý™À¸¿ <XÇ%žA @ žú”‚«€íÌ$I’ I‚ OdÆGž$xZë’ OX XR‡…ê`ãdk]’a7H T [ë’ ÊÅ (ÕÁÆGÈÚ´:h0#:²¡ÂiÊhS6Ã\ÝR)‰”pÀÓ[i*àR]`‚\€ <ØÆ%–A ˆ€Km9À)¸ Ú.b&I’I$‚ð$Á“O3N’á )v‰, 8 ÕAÛÈfœ$ÃRìY pªƒ¶ Í8Iå Å.‘eç :h»Y-³—Qi0Ã%²Xà4Åà’ÉuïÅ&»ÓdérÙUL&¬{/˜ ¶ ø‡í`3M–A @ žú”‚« í"f’$I$AŒ' ž$xšq’ OX XR‡…ê íd3N’a7H Tm ›q’ ÊÅ (ÕAÛEÈj™:h0#:²÷Âi²Á9c2Æiºåo²ŒeÉ-4Q,^—¶È…¿‰Õr¹DÀª&ÉÒŠ+Þ©KÀ™<˜+Â%Ÿ8|âð NgHœ¡"I{ć†Ÿ4>Q´j‚$m +(t¢Æ hÕøHš CaEe‚NÀ,í´¹^ú$hé úºòýº¸l*”Œhiõ“ ò¬ØXÚM­²Õ3É0„ƒKÛqPl €lµM2()6–¶ã :ØY+¼—Qi0ÃXÚ&Œ¦tð¸gŒº®,‰´á²‘§·ÒTÀmu]‰ :XþÑã°,ƒ·µu%§à*8f f’$I$AB O䋸剀õ Ê3(0õ¬ à*ðˆ%˜I’$A’ £à*諊˜I’$A’IƒàÙ˜\ NLÆø³iø¸”“Ù8D^4v’q‘3ñN2:d´"°æÂV„gÿ Î@…ÒÌÄHÏì¡Ã¸ ~˜s—>ÀÜÏQUÇÞÉÒ_sèFªˆç*.c’Y¼3¬fdš?®‡HËÓQÈ«`œyUÁã ÅÔyÈŒbex×(Ú,õ2×ÃÍT`Î8`(u2£x!2MI½‡Ì(4E¹ëÃdÐÌTò {¬§ÞCfä±®¼xÇÞÅÒ—~Ê»Xy\Ž=ASï!3ò•Ns#¾Ô{È\wâS^aÜï IT{ÈŒœÕ”ÏØ±HòN9)Ÿîõ‚°*ƒ?ÌF¾2ÊÍ‚;rà[\™ÄSîÒ}€¹& ‹Lë„;ƒzñ;~!-X§ÞG«W™üe)¢ª þø½bU¯Æ¯Ã$ñÔë0õ&…¿«!b™Á§£7xE¯ÜQ&^Ñ«÷—ƒ·©Êm`xx<íê1mò½á1mòœ««GnÉã†Gn©‰‡$ÉÀ&ÎH’GË\=åFÚ4<æF28˜Dº3q.‰:jbpü…:+eâø u$Àà˜u$ÇÄ1*ò| ¯ŽN˜ˆ†Wƒ¨e¡?µ¬"9Ñ¥*’z"ºTå]Tá®ÃAe6ˆ|“áŠo*h ¤‚ñ&”TlË ÞFMMÄÛ¨PAøˆŠš‘¡W£"T<Ë0,B9ÙeÆ„»r¸e+ßú ·låª:pŸU®âî³Êórà ª\z'¼A•‡ÜÀkOy¨Nxí)Ǧ›•ò$Ÿm+NL½z~«<`w|~«8ýòêYœò(ÙñYœò€ÂÁ¹‰òdЙcÅsW¿Sç8ŽÏ¿“‡‚ Î*“§ñÍU&žœˆ¥ŽO›9K48¹HÒ5sr‘<‰fp@Ž:Miæ€ybÈà uhÏÌA&òd‡Áêp•™'D¨þÕƒÔ ã“dÔù ^žc0 /ƒƒ1Ë*>&fYƺBpUõL® ÝD”ª°à™ˆR x5\R…¸Žã%eÙ ¶MFo΄¶É¨A¤– ·›‰Ô’¡+ƒˆ=6Q##1"*Êg&@DzÌùUÐÊŒ#¿ôuø_«à‚Ñ'ƒõ÷!úeÍ,ìë¶Ÿò/Þ¸ã‹/RòÓþ73‚ÏÆ9%Î>—q0·"¹@ù¤SBòÓ"EçÖã•/I>5¤oŒÞÂÇòBjSR_ðïµÚ%¬A ‘ï[ð/åG³OJ\¦¤|C­<¯³ïûñôê²"?²æVÝBú3%ÁØeÝ´äù¡’•Ö¡Ûtíü>|°šQ$Ïå|§2…P]½®Ì5-kì]Ïða‡ë¬Ps¯Nï‹·º±>âUɦ¿…ëíT>3¶:Ó¯ýPcük-6›J‡}|{®w{ܶÏålþúUÛãëƒûµæÐŸí9Ée¿…[üüè¯Îذ/!Ï)U‡æß>òK§º¯~Ò(ÏÈ|ÒfÕù¤Qt¹—è;6pýŸwÒ}¬|ûª{]üKPås‡Q›í«ÕþÅ(»ì1õ¯åÿl”?êë¢ú¶Þ1´f X÷ Gú-ÏüïÖ¾¿ÅGŞq³¥›ÜZÓ†èÇx¢±†kãŒô{a¯ÄÓ¢vz^¥íú$T×GuN ‡ž ë&0ä"lû¼Þ2+/iÛ—c7u”÷è³ÙÄùJAü…‹áúʽ<`êê¸TùØ\Òܑۜ¨¯Ò±xe=W0y¼¤ÆoV9[ð!h14EY‡Êì•êí¬^A¿YžÆ®@oÒ“Jeû}[âjž4zhÝfYP?^X¤—õÕá·œ¯[/· _–ÞtðàZ¤ylÕÅŽkLÛbVÛÁ„:=Mõ¬³1ouÇ.÷<÷î¸^¥¾giKO«ׯƒ©q¶SuÏ9Îê:yZË™¸-a7WìÊtÇ—2zŠ*0Ÿ«;.¸áð©åæÇÏÇã;¾ÂxËŽù~žÞñö¤àoß Î.v£€àÆ5P¯R×Á“îù°M·gƒO{Ø(Ý'ØœæßDͦLã¬5x™u5)ØÛtÚoÓ‘+SYÍz}ˆµ~_v¥fßã뺰˜]×ã…@× 9>…ŽsÄïø§¿á_$þJàŸA~ÓA6)_ÆÆ?Ëü|Éú?ù핯l'©s~üXÀ®eˆM´½ÖÞº®@ºÕIy»È*[ƒº^en/†]|תâ{Ð}Í¿é||Îù¿;x©ì#v>~ý“ú´v¹©uRå}¥¡|3ÖJÁ¯à¿Ä/¢w®¨|טчÖËÕì¹Õ¤¸x°óVlOkÝížu² ÌǺUŒ%—hä²Ì-É¥®X˜¥u1e¼¼Èyi&ªÌ|¡p»æGLO.”Ü#&šãñ½ÂxÇCî9Ð_f}'—£EV“›y{Ú#UéÞnܹ®GÖÅåkéÔü[³=¾æ]²yb”†}AËÍ÷…ŽîÍZHc?ÇdèíYçìâh¡P^·Ù'õ ­ûøQ¨Ãß›ØwF'Xf8‘ÈT®»dq>.)²¥Y×.÷£Î]¯ü š°§ò6=vÔûZÉÔ¥¾mõô¶.\Óh«¡ÓvÏ9{x›º‘Ouq+æ/T?É#•1~<’)¹GŒdšãñý©sSÖ¹çiMì¨_éFf;œÞ™mž=@]Ñ» *«º·¹!¢˜ŠÝ‹OCì¬ø,´4ù¬l©ïYÙó¦¥Ýuiñžîìzñçìù%z¶¸Ü\êŒ&ÏÑíÚ“c¶Ð»L9ÕÝ.¢ Ì_*3(.^&Í™Á¤ìa“²Õ f¥Ýué¾hñg5ƒ°Î]zsЙG½Í+þz.uðäû¼Ÿà¾Ç;\6Šª2§ƒ ³—ÃíðI1¥úøç†‚¸å‹h ~ƒ÷Ð tj΢kùY-Ö$i)õ3ùصĘ–à}OoˆøÒºJNÞ®Ú˜öÊ‚YÍ™¿RökÍá-:š!i¹ùR‡ãñ–®ùoðú¹ƒz³÷Ïvµ‡¯ï“†¥û„S74ú-F…:7<èª~ÎñÁìź÷ÒPÂNôW~+毥Y™Tœ­ÇoAµÜ|‡íp<Úü:ü7è°Ô›uX‹Ÿ¼ŸšúÍÊ51)[ïpVÚ]—îNý:âÏÚQB —¤Vt6%”EÜŠùÕœ.fS™[ÐÍÊÍ9)[›sVÚ]—î7§Öæ´yfm{Ó2˜QÇG7+¿%SÜwͧªmט in•6+{´í¤lmÛYiw]ºß¶Zü9Û¶ÄçmY¤Émykù”v[Òî4ìêúo§Ú\É9e!¼bN Q®–G ã“æ^RÞ È9ÿÅGŸD¸å¼Kaß`Ö%1§æ\ª‚ŸÓ:ã¶×sí4¶?Ñ2gsF¾Yvya¦`áb›Õ¬ÒY5œ¶¨×BZR/±”Ø#Ü~ãV³ß½WÞ¤+øh—ÊgÙ¹?µxÓføÓ „ß•µ¬Tc6 W÷š'å9~ìèžwpxªü~~”7<¨l_òÜžc˜ÏaaþþË»ïþá®?äßíŒß}Qb‰õ‹;åHmú¿¾ûìþï3îÿ%kKp endstream endobj 314 0 obj <> endobj 315 0 obj <>/ProcSet[/PDF/Text]>> endobj 316 0 obj [317 0 R 318 0 R] endobj 317 0 obj <>stream xÚ+ä2P0PÈå2µ4Ñ372s`LsK# ÇJgp…+äqÕ- , endstream endobj 318 0 obj <>stream xÚ½]AÏí8RÝ¿_ñ î$v'[Ät³@‚nÞtÏ@Ã,˜â!1þ>vâª:Uåwí{‰>æëç²}Nb—ë&Ž}<}žòÿþüÇOÓù¿ÿ´OŸ·å‘¶õó×óßëcš×ÏÿõižãcÕÉ´RQL¯gþsýûOŸþÔÿšÓ‹€…yz„U§›“ëÜ¢*ðªÆ×3™0‚¤ ’"0|'~ÒøIãÇu5éMÐkbT - u¥Ëò²DA®‰uv4Š~- …»Nw·&ÖÙ‘\(úµ$4î’ši†æô:;*ié=;[önéœNÛ"- é cf83¥ò•¦ÖfôÚÚŒV[ÒQÐ%3u­,èPÛœÑj›CÐ%3µC‡ Üò‚vµl#] 8ˆÝäQ;çë[¼FI¬säá¯ÓiåÒX`: ÔÚW"€à— €5h@©^Âb(t€™,I2$Éð$Ó OuD4lÀÙ_†cÁ:ìªYÝ 8 {¢KзFþ*Õç²:%²'ºÏuØmòò˦¡Òˆa¢«ð4µSœm:% ÕÁ°qyÈÎÕÎl w sP›2$µ:"pp6A2r`醤Vrp6A2r`é¬MÞ2T2*c M‰ñȆ¹”eÊõg‰*].»–æ9½ž*Ô•À€Âøg@`@ŠÊ€T€AÏúŠBW‘€"˜É’$C’ Ahždx’á!çÃ,”-,©Á‚uÄw’œ 8(›! @q`ñ]†$çrP6C€âÀ:â»Y=Ó„F +]…§©²îÙ}’Óiƒ6—ôF…UfØ ?(ÍÝAèÔ˜„F­-é(è6è D‡ Ò„Fí,i@‡Ì°A :T`´Ú¼ô:ëtØ õ‘ ŒöTŠ5päÄ:T:­\ LgZûJ`à`üsà3 Åe@(0ÕKX …®"C0“%I†$€ždx’á!GÃ,=ñe8¬#®ÊäŽ`ˆÀÙ]‚¾5öWæ ŸcHrJ0 dOt žëˆÛ dõË–¡Òˆa¢«ð4µSŽ-Ûv蔣Üö­†ËCvùÏÂîæ 6eHju0Dààl‚däÀ:Ò) I­äàl‚däÀ:Ò)Y›¼e¨4d TÆ@šœßB×t”0çWÔ)q¼Ðé´ri)_SÏêJ@@ü°Æ m@.@ W}¤ÐU8 f²$É$CŠ'ždxªs¢aÎf–Ô`Á:ì»Y 88› 9°û®@VçDrp6A2r`ö]€¼<³a`1¬tž¦vJÌn8mÐ)±¸<‹ aãò*;¬ð8"îæ 6eHju0Dà€ì°ÂC‰æÀ:Ò) I­ä€ì°Â£‰æÀ:Ò)Y›¼e¨4b+< hšÖüŠºÖ™Ò’X'™*Õé´ri,0Mu²TPÿ  HñB LõC¡«H@ÌdI’!I† €'ždxÈ9Á° dO|Žëˆï2$9'"p@öD— o}—9Èõ’œ ÈÙ]‚çÀ:â»Y=³e¨4b˜è*0!‚†ËCvyì ,1P§GmS¬­Ž†œM €X‡;E k«£98› 9°w @^MÞ00Ö &°4Mޱ<Ô\á$ž<,T2­µ$æ†úhÂÿ†@B¸% 0R *-Àè‘DAcq– xRàIƒCí ô?i|ò@IoŒyAº”Ï$,òçÒD é­Æ/«\#¶~6;¶06.¯²—¦ZÅÀ]ÀÔŒ Ií †½ì0Õª9°ŽôCRkƒ9 {ÙaªUs`é¬ Þ2T1,;Lµjš2À×üBº×©Ö’HQfRu:­\ „X§Z%Á‚ñÏÏ€”  @ˆ4Õª)t‰‚™,I2$Éð$Ó 9'6`ìaªU³`ñ]†$çCȦZ5ÖßeHrN0 d‡S­šëˆï dõÌ–¡Òˆ!D˜jmvJYÆaªµ–æRѰqyÈÎoö;LµŠ;…9¨M’Z 88› 9°Žt CR«ƒ98› 9°ŽtŠ@Ö&o* •1¦D#¿îuªu-Ÿî£Ì¤êt¹ìZZ ä^‰uªUPÿ  HñB€ èU)t (‚™,I2$É0„âI†'rN0lÀÂÙÌ’,XG|—!É9Áƒ³ ’ëˆï2$9'ƒ³ ’ëˆï dõLo`1¤S­­NÙÊ2†ˆÛ¨³áØq56.¯²—¦ZÅÀû©™ƒ6T3$í¨CÈ^v˜jÕXG6W3$í®r@ö²ÃT«æÀ:²ÑZ ëNê–¡ÒˆaÙaªUÓ”ú1¿îuªµ$R”WN+—Æ!Ö·Ià®Æ?·ý3 íûW$€!Ò;¦ÐUdë¿`&K’ I2$<Éð$ÃCÎ † X ;Dx¿Ñ,XG|—!É9Á²C„·ÍuÄw’œ ÈÙ!Â»ŽæÀ:â»Y=³e¨4bÞxšR–?Ĉº ùå~(Ì †ËCv~³ßaªU Ü)ÌÁ É bˆÀÁÙÉÈu@­ Y®A ÈÁÙÉÈu@¹!Iº¡a¨4d TÆ@šÊGý½Nµnå“”™T.—]KKÜ ±NµJ ãŸ)^(p½ê#…®"E0“%I†$†P<Éð$ÃCÎ † X8›YRƒëˆï2$9'"pp6A2r`ñ]†$çrp6A2r`ñ]¬žé L#†aªµÙ)eùC„©Öb8v˜KEÃÆåUö²ÃT«¸S˜ƒÚ”!©ÕÁ²—¦Z5Ö‘NaHju0 d/;Lµj¬#"µÉ[†J#†e‡©VM“£@*õëJšŽÇ mt:­TXòÓc_ëbVI@8aô ® mxÎ'È«:¨K1YФ)’¡`Å’4K2,Õ+Ѱ ç2Gjp@vY¬>‰†( œK€\  ;¬VD0p.r}d€*ì®x9cÃ@$”&L†P>õ¹üïϬÿ¸$µÒº<öTWb«mg&qC]z{V«ÿ.,“îzª°¥µrºâ=Fìk@¾GkgtÅ<¬œÐ€ž‡ÞdßÝõoõE6þë]·ÝmÀVˆ``'°Þ†×Ýhw&l Ôûrº…ìVŽBjÝþóÍvßRo^êÛ]{l62 ¬>ÖKÿºkíjèåˆz-Pwq’]9°>I/è®V°ë¥,¨‡˜võD÷#¦þÆÐýèa>§|öÐsŽÝIPûf`TOBtgEì¼ìÀĈ~+é¾&Ù‰š7%ý¨Ò{p²/nýg§3S¾ €Ç´OrÝAG+ËÖU‹³“czqV¬©«!ådìÆd¤¬¶KWrÆ©[©ÎXɇ®…ã°;Á»ÔFÆØu»A´»oÕmÛºj¶“=ßÙævÓìn³ûOºÛbìf»±1vUzw±¼Û¯3¶^Þ.Ví®¡uËøÇ–ÑÚ5lÝ¥unuïØê:³Ö¥³òÆ­øY}c?‹w¿ÖÛå@cßëíDzî7<·Œ`ì3žCïNí»¯‹c³ûvj­;ãç>:ŒMúÙ÷îÞ\€›Šš¨úe¬å1iýËù\ªØjâ*½]žp°iý³ù\¢×‰™öEV éÆª“çÔ Bã ú·¹'ê¤û–xHâÑJ*ùAµiýð\²Ð‰»õEç ëæœ“+Ó‚h‚ê ú)£'£æ¤¥ú’W–xHòÊ©%i=&áqý4ÓSqrÊ6}ÅK<¤¸ãÄZ´ŒÀ:ƒ~jê‰È8a¾à‡%üpZZB¶ûZƒyBëiXØmÿ KÚ× p{ÛõîyÁtõØÛrï¶!÷·G[Þ¡íÑng­Þ»+°Î Ÿ6{;~Ý.ÈþîLK<´;ÓmìÓ[…ÇôSmoáۄÕßf‰‡6‡¹}Ezç’À:ƒ~zîíwr{@ú{S,ñÐÞ·­Aoœ¥cÖ`Ô{Û-ìÊôÞByË:°RÞ-½Ö‹»ÔÔÛ@oE¸[%Û_½ky‡VﺅŸzi©À:ƒ~ëè-Hu‹ôú‹-ñÐâA·îL¯l“Çfk0o7½õpnPí’%Z»ä–½è…5ð` ú-ª·Ç-Qè/°ÄCK'ÜWwý]_`A¿®õV¸/¥ÝÏ·–wäó-øµ/é·ÂdÞ Sã­ðé!3ö$“§‡ªØ³nº‡ª¸ƒ':‡aØ#^ÎÂpÇ(tŽvpçs íàäî;ü ~+äþTSÞ Ð•wÂÛ1p+q? îd¤;ÒÖNŸ|@ÚÚÉýv$ˆÜö€±S¯í(ê:YäE]§2ÚQ>u*¿ʧN4³#äéÔX„<¸aGpщ‹.:­¾Ž~ Ð´ÒkÏ$àœžaOÎiŠutά̙݀“~êÈQ9éµ9*§dÔQWrYêJNq¦£‚ãŸTpœ€JGÔÅ)ó ˆº8¡‹Žø†šßpº - '2 %áö×wöü;}‹=ÿn»xg »Ó!ØÂn÷ü>Ý~ìöÔw÷»­¬íµv7ôÀîZ·ã°³ ÒíøØé6Ðu6õ¹™›úÜF§Îæ+·Ñp`ó•Û·ÓÙKä6„ ì%rû+:{>Üþ¦=n»@g ƒÛ‡2°…Á-ëî,5wÛ*–š»UÊ•ÓnùûÀÊi·®ôùBW·˜»¿Ð• ô²u––Ī^ÔܺÛöÔǧPÚ³A»Pºãù:GÚã0N t‡ÍuÀs§€çëTæå8¨Ìzõôü-wrZ÷.w:玸ÃcÎqg1t·pg¡ œáŽèwàά8îÀIÀwdéÝ ²ôNѼ£²î¤òTÖ­Põ3Ál§úÞSÌvÊË5h«Þ= ír;¢½N z@´×é½v4hð€­Óåìh…:]Ü­P'3Ù‘¾tú¥Ò—N°#Qèä8$ º]GqÏÉ&(î9²Ž2šSPFs¢Z¡/§Ö6 ôeõ‘žJ59å±®V“üéˆYå¨ "§ËÒÑŠqºHZ1Nf¤#}âôk¤OœDG¢Âɱ HT8uƒŽâ‚“ÍP\p»Ð;;ã ÄÀÎx·©º³ÑÛíÖØèí6¿v6äºÍçrÝ^ÎÎþR·Ix`©Û÷|C ÛòÚßHzÙ:KK"¨71·?‘·¯Ò›oe¯/S5Í/[¥0¿‰Õí†éßÄ ÂW@KÛÒ:Á¼s°ºÊ›Xï\u{wç˜pwÖûÈ1áöÜäÎqÎîèò‘ãœÍéÀOÏ*vçK÷+¶'¸v–µG'œ+kÏ#í“êκ9&ÕžÙ9ÎÒÝ:rœ¥=±s:£;bsätF{\]ç=wbäÈ)zöôµÎ¡pîd¿‘Cáì)YûÜAu#‡wÙCŸ:gQ¹ÅF΢2gú<;^ÈÕ=_ÈNÓ93Çžu4rdŽ=C¤s´‰;Ægäh{$Fç¤wÜÊÈIöè‚Ή îô‘¬ç€wÊÃÈV1½#äî-r·à]r'.?¢Kn…š;úÑN+}D?Úêwä¦õˆ²’}*këô™ûº¶Vµ#ÕjUvG”Z­teGQÓ©ÇŽ(jZ%ÆŽ@¤Sùˆ´Šy!?'Z9"ägà:ºtN\pD—Î uuôÜVÞˆ~˜ÕêÈa9M³9,«Ô‘-r]#²EVÂ㤔FTx¬HÉsá' 4 œ2é7±³´$ô›˜Óq¹ÔL¾üoùóïùÏ÷ùÿüô7_>ýú»ýs~†ÿR$UŠÆÉü¹ˆ ä ¶ý󗯟~õË”+ÿêËJ~öÛ´»2[þü¦üù,}ä·’t¸Ò‡eæy~,y¼ÚB¿LaÕåò(\[åâ¢ÊÅé1çv°å¶“¹üù¡üùIÕÉn¼ç_S[çÇòç·ªdym4À¦ Ýý}ÿÌMõ3_Œ¾ŽæýÍ{^ö÷X<ä&Ióú[U%ÃþØ'ß(¿W…âr¾\»îr­–7‚¿Á¿?ïM—<žö—_T™Ãçãh?¨’¹a§ã¥® Ç|¾}÷»6NËùÔå.öWªTÙ:ïÏ[²<Ÿ/±Ý?pÿŸ×ùëï3c~³n]Æ4ÇòßïΫWlkfKþUÓÅ-´imû¤oé˜rŒýhûßÇ÷õ¢ÎÁçµ’~óåS:d õ×SnIE)J—(˜ÓµtM]!Kª©¼Û¦°>æüF×ö®ó×Ü)Wò§¶[¯ù8¿ù¸âÊ£OæüKºAM“N­ SÈŽþRç¯Ë$J*Q™jçGdǯ=pYËâóäJý^ZÎ7i[\PßöGÌ?=¶¸$K~ŠûÖaßçÇ–Ÿšì¿Õ%s|˜|ùH²9:%_òŠ%¶a\Wì/Ù{ëü¼Ñ˜¦Ðzöä`cÆ#÷êÖvº–Ht;EZLµè£onÝ%øÎÒ`{vý´>ï§P®4?Ó4[ÿGn±Ÿt˜Ì®Ò`ïßÞܺ=íÛç/ZZ:WB¾êãYwøŸ‹ÜŽ[¾Åâ??6~íæÇý¨ÿY?žlFs?}êˆå%À»Uã©#¿‰ÇÉßñÌ×ÿüæÇØÛ—¥ÕÊÓíÖ=S˜Õ]þÜöö…¨¥yÚkX¿ øëïfÑ·ò4oXx«ÿ]êÓõ_ýTZ‚¦¯;SÙH?Ut„©EÆ´áooy&Õ˜SÅœ7º.ªçGv½–Ó[¨s5Fƒ¾6µÑÔ3\Dæ£[Vù%ÚåÔMù-úžÊ/Ÿëé9˜zè¨gørjγ­oÆ‚¹ó¹‹ù÷ö'~+/ý^à<Ù_ùe]åØÝ6Û.Îe=Çë.ëùÿNu¹ªG½e œ-[¦læý½Aîê¾ÑbãÖAîÑïäulû¦þÐA¾ìy¤î¦Òà`6ô<˜']o¶õLðƒ]·À5ØÿÙ¹dyíØŽþ`wå^ìžãu×õüw vzß`/ÓÌá½±n«¾Ñ^âÖ‘îÀïètlœ»VþÐa^$µÂÜhfª'_ãã ΀ù‹¡vX«¾Fõ¿8ß+QÒÜÕ®Ü £Ús¼î¥žÿŽQíQoÕkùþõæ°öu_o1qçÀn ß0²=êÐÐn4õGŽí5·H±õ>Ú?ÙÏ~Úgj33¦Í^ƒZÏŸ¾W¾ï¦Øվܸ¨np¼î£žÿ†QÝ@½oT—¯óayoT»ºo´˜Ã¸uT{ô;FµCÕ¾©?tTÇ2/¾¾ð‹Ícf†Qýʃ¸¹ãktÿ«sÁ²%­ýÁíʽ0¸=Çë®êùïÜõ¾Á]–…÷¦Ö|Ý7ZÌaÜ:¸=úƒÛ¡Ž nßÔ9¸—#¿u‡ôÊàžôdóòØš0ѼŒ»_p}ã×ÿ7ë‰å“Ï‘ú3k¾Üøop¼ì± þÆxõ¶1¾”E+á½™5_—½Ã>ð}»ÅÆc¼~Ã÷¨Cc¼ÑÔ:Æ·òÊ}¼0Æmþ<›WíØj£<¨Í^ƒúÎõÊš¬ÔŸAóå^Ôžãuõüw jzß >WÔ½7¦mÕ7‚ …¸uD;ð;´Ï®•?t8‡²T³5eŸ³ÍOu<SzRý›?Õú~çò yþɹ޹`´?æË½0¨=ÇëNêùïÔõ¶AÏå¾ïM ùº¯·˜Ç¸s\7ÐoØuhd7šú#‡v,º£›@;G\ë=Út¿¾¥r¯û¡ç¿aä6Pï¹ç†ƒ÷&É|Ý×`<Æ­#×£ß1rêØÈõMý¡#·|½Ž8c?KQËÛFÛ‹“cæN¯Aý;çzçâØþä˜/÷ ö¯»¨ç¿cP{Ôûuùœß›óuù‹Çb®Ï\ï´ÚÞq-é±ïìýŽÁîPÇ»ï‚ìåv|:Ùc©cãEégý­û›ëÑÌ_ƒß­G‹åsîÞŸ5óå^ü¾î}®ì±ï õ¶ Ê÷ÈøÞlš¯ûú³‘Ǹsð7Ðoüuhð7šú#i‘;xòÄðÍË(OË7Gø)é15Šu_öMó^Æ-‚ åÓòÞŸÂóåÆ#Lƒãõqáùoˆ$ Ôû"Iyt9æ÷"‰«ûF‹9Œ[#‰G¿#’8Ô±Hâ›úC#I8N©úáw ;˜õ^ƒÙ­} çöþÐÌ®Ü ƒÙs¼îšžÿŽÁìQï̧4Ã{ò¾î}X ì;¹G¿c;Ô±Aî»à#ù|̧.JŸ~ÞÚïÎóúË4ÛÈçSÉÄóMQ—Ûq>Z×µufMK^Áį¹›O½“¥M|¹ñhÒ¨{ÛØh`ße¨·E™y»6£¿e|Ý[Òcßeè7D:e]ð¡Qf]N©F/ð€§ËxNOò8ѬØÕQgËmv «ÛzÁ>Š˜º¢‡[Ó7Ÿ¢O[?x¸r/_÷>—÷Øwz_ð8¥¼Ò{ÁÃÕ}}ØcÜ$<úA¡Ž ßÔ$æí”̃Þ2Óm¿ž—ù‘RhÔWÛp2í6,Á@·Ä Üâ¿ùT²ÛûÁÀ•{!xŽ×]Øóß1è=êmƒþ”!<Þó®ê}ÁÓCß <ø ÀÅßúNíœwc€©ü­0ü=C7Åþàt¡ÿ%Ó–®æmíoˆ ó–AË„Ããˆk#&ÿæË§>ýÏ)×ô5ÿM—¤æ±> endobj 320 0 obj <>/ProcSet[/PDF/Text]>> endobj 321 0 obj [322 0 R 323 0 R] endobj 322 0 obj <>stream xÚ+ä2P0PÈå2µ4Ñ372s`LsK# ÇJgp…+äqÕ- , endstream endobj 323 0 obj <>stream xÚ½]MÏí8RÞß_q Î$Ž“8[ÄtÏ º¹Ó3 ,˜â"1þ ˆßЏªžªò=öy;¼Í{Ûe×ó$v¹Žã¸*ÓÇ)ÿï¿ÿ0ÿñí׎ôq};>~>ÿ{yLóññ_>ÌËüXuq_©)–׳þ‚¹þûþÉ´ÿœËAÀBH°ê2`sq[T^i|>‹;&C4AR†ïÄO?iü%ÿ—.GA¯…unPlhü¹Ô•ÆmRÈq›¹ÖÙÑ\hú¹î4î·ÖÙ‘\hú¹4î¶6Ë ÍåuvTÒÓG6¶9IOçò¾%éi(GjŒ•á¬å«L½Íèµ·­ö6”gA—Ê@ÔUYÐAûœÑjŸCÐ¥2µCîyA»z¶Q®\Äîò¬ç) ökö—Â:ï<ýuy_¹56˜ÎUû*€üâ°ú-@h0ÕK†B«°ÌdI’!I† €'ždxª!¢  TO|ŽuØT²š# fà€ê‰.AßÙ«pT›Èj”(@¨žè<ê°Ùäe—MA¥ÁDWáiê „#Ë6”,Û½‚Èí¡:«Õ @æ >eHêuÌÀÁÕÉÈ:2( I½äàj‚dä@¬]ÞT*c MñqÏ‚µ:”˜²þ*þB•Ëe×ÖÒ`Ïf±V‡Ât(Œ:$¡HÀ ôÒG ­"E0“%I†$†P<Éð$ÃCÆ ‚,\Í,©Á‚:b» IÆ ‚8¸š 9PGl—!É8A€\M €¨#¶+Õ2½€iD°ÒUxš:(çÒeA9×6 ô:"·‡ê²¼Y`PXÀƒÂÔ§ I½‚8¸š 9PG…!©×A€\M €¨#ƒ"µË½€iD°ÒUxšâÎ%M¨å\ïñª¼¯Ü„³AÕ¾ èPÿt HþB „z ÁPhq(‚™,I2$Éð$Ó '"°@uàËp,¨#¶Ëdœ ˜ª]‚¾5¶]æ ÓcH2N TºÏ:b»Y-³%¨4"tžæ”0oYKƤ”wX€@9RcU`qÂeF¯Éhµ·¡< :TX–(tPàq`´ÚÏPt¨ ° Qè À# hW÷¶Ê”,EAžía)ÍêÆF)¬“ìlèò¾rkl0MuoC à8¿L|¬~A Lõ‚¡Ð*ì83Y’dH’!àI†'2DD`ê‰/ñ Ž˜*C’9‚`¨žèô­±½2ÙC’Q‚9 z¢Kð¨#f+Õ.[‚J#‚‰®ÂÓÔAÙb†çÍ"ØWx DAäöª:¬ð¼)æ >eHêuÌÀÕa…çMÍ:2( I½ä€ê°Âó¦æ@¬]ÞT„ž75MñGé×úhŽ˜‡Lž\t¹\vm- –LXm¤€…ñO‡À€ä/” ¸^úH¡UÄ¡f²$É$CŠ'ždxÈ8A…«™%5XPGl—!É8A0W$ êˆí2$'ƒ« ’uÄv²Z¦0Ö mZƒ²„¼ŸàѦ Ï.(ˆÜªóâ}…GРGíS¬½Ž‚8¸š 9P‡E k¯£9¸š 9P‡ ¯.o * •1&{e Y>_¥Öif¡ËûÊ­±Át6¨ÚWŠà‡ €Õ_h@ƒ©^B0Z… `&K’ I2$<Éð$ÃCÆ ‚,P=ñe8ÔÛeH2NÌÀÕ]‚¾5¶]æ ÓcH2N TOt žuÄv²ZfKV#˜è*Í‚:b» IÆ ‚8 :DØòÓ¨#¶Ëdœ @¨6þ4êˆí dµÌ– Òˆ DØþkÊš²V„AÉ‚=FèuDn¯ªÃY —€…9¨O’z3p@u K á@†¤^r@u Kð¨#ƒ"µË[‚J#‚@WáiŠ85Ku(ç’g¡ÊûÊ­¥AYð,Õ¡p ãŸÉ_(p½ô‘B«ˆCÌdI’!I†„!O2<Éðq‚  W3Kj° ŽØ.C’q‚`®&H@ÔÛeH2N W$ êˆí dµÌ– Ò€P£1(çº^±ÅsåïÐP¹=T—e¼b sPŸ2$õ:fààj‚dä@†¤^rp5A2r Ž Š@Ö.÷¦ÁᛦÉ^`=5ue=—<²E¢ËûÊ­±A<êŠÀ¡~qXý… 4ˆí¡h ­Â0“%I†$€ždx’á©Æ‰‚,PØCÑ,¨Ã¶+Õ8Q0TÇöP4ê°í d5N TÇöP4ê°íäe™MA¥A<`¥9(çºÆä\ø@ŸK9RcU`qÂeB§Î$4êm)Ï‚•–% dúYÊ€•$ d­vo£Œ»% úV"kÙóZêëáRˆIÞþêò¾rki0?ŽT_K㟟É/(p½ô‘B«ˆãÌdI’!I†„!O2<Éð!‚  W3Kj° Ž˜*C’9‚`®&H@ÔƒeH2J W$ êˆÙ dµË– Ò€P£1(û”e°µî¹í;T(ˆÜªó=-°%æ >eHêuÌÀÁÕÉÈ:2( I½äàj‚dä@¬]îL#‚} ,MS¼@:² ¥/…#ÉIy]ÞWn bªG饀…ñO‡À€ä/”  ALt”^Shq(‚™,I2$Éð$Ó '"°@uL°Ï§YPGl—!É8A0TÇû|šuÄv’ŒÈÕ1Á>Ÿæ@±]¬–ÙTÄû|­AÙ¦ü0Ÿ`«öv¨P¹½ª l`‰€E8jŸ díuÌÀÕa ,Í:<(Y{ÈÕa ,Í:<(yuySPiDØÀÒ4Ù l!?¢.õ¼I)Ä$ÇIty_¹µ4ȯ©ž7‘8Á/A«¿Ð$àzé#…Va‡˜É’$C’ C(ždx’á!ãA®f–Ô`A±]†$ãÁ \M €¨#¶Ëdœ @®&H@ÔÛÈj™-A¥!¡2FcPb~˜O°ùºÅü¸¿Àà "·‡êü¬¿ÀóxP˜ƒú”!©×A0W$ êÈ 0$õ:ƒ« ’udP²v¹0öžx4MñåÜR7_KáH²·ªËûÊ­±ALuóU èPÿt HþB ÄD›¯šB«ˆCÌdI’!I† €'ždxÈ8Aªc‚ÍWÍ‚:b» IÆ ‚8 :&Ø|Õ¨#¶Ëdœ @¨Ž 6_5êˆí dµÌ– Òˆ &Ø|mʹ® ¬í\ùÀ "·WÕ1Á–xP˜ƒú”!©×A0TÇXšudP’zÈÕ1Á–æ@¬]ÞTÄXš¦ÄüŸ‹šš:`:3ˆÕå|~5–úý‘Öº>‘f ô3{ÃQú%x®'ÈK ”†äÄd)’¦H†‚KÒ,ɰPDáàZæH P‘l Hé@0 × ë#¨H^¤Ä ®%@ÖGP‘ XSx‘P™0BÙÔÇò¿?þ¾þGM}±ÆGÚë {_aun W3œcs™.ýwa™\‚§™0tL{7ÈÞ$å³×1®Ý [ö?w«ƒÞºQx6x OGÇtÃul`à@ÄŽ>.ß=¿o#ˆŽðëó³Ý½6¤`àL¯>P×=ágÏòÓ'lºG~ì¡ÃS?ú•{÷ €=…4p @¿ƒë¾´ÇÞ êÍúîÛûžrà‚Þ½ën'Ú;Šúq¾»¿`w8¶ôú¾ûÀa·<ž9ô~o bú«ËgŸ7 Ê¾Èº#)Œl"’n~›Ui,CŠMOÐÍšà·Œ%N°QËÝ`j—Ïa,žÚ9vc/]˜÷Xø¥}ê†d¹¨Ð±¨,ÑÔpÁbcÁö¤t÷·‹!;ÃmPvÏuº£åcG;í¹ªîq/wâtìÄ—=nÑ=⢱og»/Ýù”±÷Æö¥M÷]’{=ö:Éîåv·˜Ý[®±]f»ÅÓÝyr›ßc›Oöù¯÷Lê¶Ä†KéG¢þ®ÔöX ²þÝyžÚÎæPSùÙøÁ×–õÎó”n.ùU?)—!ÊÉåÒ9é„QBãú—­—fÊ¥Þé§²ÄC)\6¯F`@ÿ‚ö²Ü¸ÌýŒ$–x(#‰Íh¡²eH´±)›Ÿéç6\.‚~ŽÃ:”"ÁE×ëø}Au½èEý»Hè~„¶%ŠÐvÁ½:|X⬬À¬9zAÇ.³ j‰‡D]l¡Ž^X'Ðk›^Ì£‹ëǧYâ¡ø4Ú¤ƒ§ä”¹˜5T/äÊ…¡ôÃc,ñPxŒ‹¬Ð±ëz­Ö‹øp§àû§ó-ñÐé|w°[X'ÐkÂÞsw·8ض‡KÕÁUa±e½ð|~ØÕ ìW4¬C§ÝA7}”NP@¯n{ðÜ¡¤þa)KWÑù„†ý<ÌÀ4ÜÇ:„p_õø „K’ßIÜï>R1¸ßå|ïä¡wÈCïrswò…»ÜøùÂmîé§i°]ónl—%¸“¹ØfåH\ìrÞvòðºdÊyx]nÒN¾T—x _ªKµÙIÿér¸¤ÿt);i]JÒ4.Ã_'ë K9uÐebëd‡s™²Ã¹Äbdg.cÝ@²3—ª“”Ê%`HJåòur,¹DY9–\Þ™N.—÷i ŽK£ÒIíâòó ¤vqé.:)8\º™6ÃÓÌ.'H7µ„ ¼ï$°‰.r¸0òNh»ËO0ÚîÂ};!È.Ü~ ÙE¯v"j]Xô@D­‹2ìD>º(ßÈG4× äsј|.¸©på‚ ®\¬N'~È Ä¹øŠç.¤©ðÁKöºÈ?[KaRO.þ¤ÿAIó™Â§M´_µì4Ñ~I®ó;û Ç‘ïÛÙï¢u>׿¾¹7ò¹6ûýªÎgµÜ'äF>«e?ÇÔùJ”ûÔ×ÈW¢ìgs:_óq_®ùšù8ÌÓOÕ¸Ï õ¿Uc?àÑù®ˆýrÎÈgEìç(:_ÉpŸ:ùJ†ýl@çkîË#_3°Yð;ÉùÝF’óÛlå$êîƒ#IÔmòíNNp—Ø}$'¸M’ÜÉÝìò”än¶9;©ˆ]>é‘TÄ67k'e¬K<’2Ö¦íd@uilG2 Ú”L•.+ëH¦J›á°“xÑeÏI¼h3Ñuä¹d# òL¾µ§Ùß\ƾ~ú7›«“ªË&£ÉÔe39(?EåâKb‡«u-]NK¹ª;i åXãú˜ó‰®íOÜàŸK\ËïÚf½æ«wÚVÊcÙ&(Ãm ªæi{,ùÇÇ6÷ž¤,u—¼0yÎ~m‰mvÝåùwq™üyO²ÎÙ;í¾ååK&ìÃüPæšý)[ïoœ7:Ó4ZΑíÌüC>mm£k{·ã Z7j‹÷¾¹wcðƒõkí÷²éïëóqZÊ•.s»÷¿åÓ5/,—{ÿö–ÖíiÛ>ÑöøüªC̳&?G<ÿËz‘ÛyË·ø·üÇÿ0„õx¬yåì&´^žÄG£»Ÿ®:ΧoVUǶäYâïxæëÿ^ù96OsûºôbmÚÏ R7@S˜õ¢.ÿLn©}-ßê•]|¬aý"â/¿š½Sßʃï¼aã­þë¿ûõ¯^š¿éugj»Ð¯]aêßȽ1møó[–¥sª˜óF×Ez~r7Ðkë0½ ui£.‹A_¶Úèê."H÷Ñ-«úRívê¦Îú}*«×G+˜{¥QÓ«ë<÷üCàõÉRæðŒ¶<ÏÏê9#h“®Öw7OzNæË17ðø²Û—Ÿg£éùùÇòç;»ÊØÊ>Ó¦:h² ¸®vÒqv\Ü”ñ¯OÏÿóŒúš*õ–‰xölñ¼Ûñ6'ãtßÐcãV'ãÑïp2uÌÉø®~W'çÇÑ2"Ò^&3É÷ö@˜›+“XßÙ5‰Ý£Âv>‚ôç°möÂv ¯Û£c¿c;ÐûæoÙ¼Þç·Í_§û†þr·Î_~Çüu¨có×wõ»Îß)ž{ã˜~Í—,âýâ&¶¾åkbÿ`mp-¿á¡?³}»ñ©ÝàxÙVü7Lîêm³{-¿üûò¦ÙíußÐcãÎÙÝ@¿av{Ô¡ÙÝèê÷œÝë¶å™_˜Ý“½©Õ'e›[»fñÎÖÊûâû³Øµ{a{Ž×mÒóß1‹=ê}³¸låæ1~Ó,vºoè1‡që,öèwÌb‡:6‹}W¿ë,.oðvµ0uó$=­íYÕqކ»¾[G¿Ãñ8Ô1Çã‡ñ]µimϿٞááå„ó ú–.ÏðÎ~ÏÏÑ÷ ®Ý žÁsü|;Ÿ¦Gˆ÷˜¹¿µ;œŽG½Íé„4ŸÑuoq:^÷çF(AjG¸e4üõÝétè78:ätÃøžNÇZ÷,Ñ-Å:skóo›K€N eí9ßnÜù48~¾½Çù ʽÅÞý½Ýà}¨÷yŸWô&ïãt__$zŒ[=„G¿ÃC8Ô1á»ú]=ÄÎy aüÂsQ4£8Í—àçc?côÿ?3šž»;̦x¦ è: ×îä9^7yχ“ð¨·9‰¹„çÅô&'áu¿ôôåów:‰ú N£9‰FW¿§“˜·’¡âéòym/#$¡»žybŸØÀó·²ÛúHaó0ý·²¦?/×áŽKÎÛt&Jé¹ßnÜu48^Ÿžÿ×Ñ@½Ïuœi‡ÞötãußÐcãV×áÑïpuÌuø®~W×JR«ð3Kh×gpdžì¢<߀7Ð]tywìr.Ù¸Öþáißîoà9^·mχ7ð¨·yƒ#™ºÞâ œêë /q§+ðà7x:ä|/¿§H{žbê%™})Ú»¢–µŒBßè5›Ýq˲Xûg¨]³ñ¹ì^6MÏ~ÃLö ·Ø{ÜÂc[ËsÌãPï×fó6|Ö{-i:“ 955þ|uÿ­1„Dz5t¯;øßòç?ùÏ”?ÿUþüN q”/1ÿÀ;é¿úôá›ÿv& ùœÿîWšµ#%U˜Î W;©¦¤ÿ‡ßü׌ûùÚû endstream endobj 324 0 obj <> endobj 325 0 obj <>/ProcSet[/PDF/Text]>> endobj 326 0 obj [327 0 R 328 0 R] endobj 327 0 obj <>stream xÚ+ä2P0PÈå2µ4Ñ372s`LsK# ÇJgp…+äqÕ- , endstream endobj 328 0 obj <>stream xÚÅ\ÁŽä¶½ÏWÌ!œCÚ%ª¤kÛ9H쬽^g“ÄF \òû!%VñU·Imî«Þ£¨'RM{zžÒÿýþi:ÿøê‹§}zÞç[ åù¥üÃòü¯§y^nQ)²+–§³þ ½þþáéÆÿ%•× æé¢.¶§Ð¢Êð*âå,’! M@ŠÀðø¤ñIã/1šòVÑKa ªŒ Î/¹ Zº®A!¯ëR‘Ka Ž&ã‚ëK.(Ü8iÜ8n)LÁ‘d\p}É»ÒÊZÊSpT= g1.ý忉þT‘"»ÖêõFtÉOþù r–Ÿ`ù©2@KuÁ»b\ù‹ø*xÒð¤á%H3f(òƒòVñ¥’ñÉãC€HPЊ¡¼Tt©,h è B´"D(ºT4 t9V´Kn­òEÀå(ñ@µ´í7Ú¨Hr;nÓ šTåÜÜâ]ö[œY–R@] þ).dé)ˆƒ^ñH¡Cª<+&Y2$dHBñá!ÃÃBÃ,R-,Ô`Á˜*Ud9‚a©fH@Œ©‚H%CªRcªl+dÑ¥7M5Ä¥«h’àÂ’a½´› ´­"M]¦(ÞèN‡}@»?k¯ij€C(MX …í&Y2$dHxÈðá)âDÃ,P¤ŽcD»²ˆ p@uà&èKcíVŽ"½ Yĉä€êÀMð#ÚÈK™MC¡©†À­ð4Ypù·¹h7â˜|òNv»=‹1’ànÓ»YÊ6ã~,OÙfnvJ]úôXN©Í²ë&ÿ¹T×±ü?›ÕMÔri‰c¹Z6{¥›TãRÈÆòjl¦A7Â¥ûŒå@Ø]áîfµKÍÛ¯¶;xÝE·>¶·hw[º›@nËslÈ,•wîÝÞÔÈâ½]êì®ÀÚÝ„±5X»Ò]—qKÃcK3öÛQï›[0úÒV <Æ,†FYÏ÷ϧÙ3?½#HÔ˜îAr‡5ú‡H¨1ôθ¼ú~¾?µæ€^¾¿ËîçfSkèåf»|Õ~-µæ€^­Ë-ìçwruà4Ÿ;áÔ9uåNœºr'Q:§cÜI°Ó1îÄ@çƒ;±3pŠÁevw²ÍÝÉŠls—ÛÉ vðYÁ6™òn^§KSî&vº´·N*žM3ÈÄsI\Ä2—8Xæ’m: @.Ùm ÈåŽtòY\RÒ@>‹Û￟€àRlú là)çô®… æ#—Ñÿ&óC6wVÇþTÿguìot~ÅþÈÏÈ/ ØŸ„èüR…ûU–‘_ª°G÷;¿(à~=cäìëÎÉo÷+#'¿íQØÎ ]w}ä„®=²Ø9IéN œ¤´GË:'ÞÜéΑoöPçd’;…7r2ÉÕèœ q§¥FN˜Üû»'Ü‘–þQ›ÝIÛ¶F²¶m¶o' Ùe’$!Û¬ÌN²¨KŒIµI†ÜG—À:’ûhSÃî§«¹tÌtµIÏG§w-èùÈeÏ]9doþ—?þž>¾Hÿÿô›7OŸ~¾?§aìMNdË™eósN=[·4€îÏo^ž>y?MýêÍ?kýz[iw>¿ÍŸå? w7#Îûwè3Ïén& Z§÷SˆÚnklù-«òK’œS?X¿ídÎ_æoTLœoû]ÌWùãkå¹¥I·Ñ›rÊë«»¿î·ÒUo¥1ºÇv›÷tïÙì/Ð=¤.¡9~àR•gØoûä;årZÒlЀûë…f¢5ø üýymÚó¸yÚ÷ï•OÜoóñ´/•gêØéøQ·6sò ·v™ò”á/ÿý'Ê+oðÎûýž\æx[—vG~)÷ÿlç§Ÿæ\Ö4¦6š1ÍKþ÷ó³õŠ-&6ò—¨ºnÙÒ0<Ŷ&}O/”¦žÙ?mßÊu|Qu>|>Cõ³7Oi|“QéåLrU£—óÐÊÅ»”®!K TvRœ¶gJ/¬ó¤m¿p7?¦û@!8ÏoÚ²Žn˲8w¥è“y^o8lštºmy2NöéÏ1¿žÎ÷á4*sôºú Ó \óÔ”BãõN;­çë¤u *÷ôª¿¤©Çºû‘d¥ÔGûÖaO_V¶4{6Ù¿Öži|˜üò#Éz¤Ñ‰¼ç5–L؇K<œÛ/E½_;7:Ó8ÅóNvær¤»ºµE×AÝÎôA¶øÑ7õîüÍÒ`{’>Åû÷)ä–.s»÷¿’ûF“I* öþåÍ­ËÓÚ>g4Z;­!µú¸w;ü4p‘ÛçV.ñOòñUc¶K_½ÿÔ¿Õ¯'Û­ÑÝwß:Ò|›_mLã­cé)ñWû}Kï?aÞÐy+ÿ®å_ºþÕo¥yÐô±×|™b¦Rž¸sfÌÅaæ‡(Ï®=‚=kŽ©ØçMÏÐG£}“ÅŠcâöm|ÍçG:µ[6ˆ:·Q—Å ÇÆCи34"Ô.çKVõ¹Ú~ê¢Îú½»kÜà w^;À ,«l5Ϲ¢ù»üñgûZ°mÛùtñdß ÖôÐûUÙØëu’ô?]æ1}iߎ#sm?Mˆ—¼=êGyxλ–ßHÃëÆZû˜ßŽí½pýe!>ê¨àÀ?Æ `AÇÆ×ËÒ›}s£›ùæZxùwÖå°Ý£ÉkÏ!´N/¿™æ¸‘GõÛ5ðè¯Ï§†óÚ!Íý‘Çùýˆ‘Çsüxµ{þ1:xÔ6:ÄcIØ wúÐ8:ê›{bÔ÷ºÂaïù¾·~™+ªm¸?òÙŒûr[Ó;?Ü={wìÃBmºÅÜí`îîL÷š±eEµ®øÉ/ÃÌo̓jzñzRÿâ䔿¼‡mLNƒ¾§œ}‹œF½çûÞm9y÷‡ÊiIßdýìrÊ»©a–Ó·VNº/9ýÕÉ)o·Ð1&§AßSNƒ¾EN£Þó}ï¶œ¼û#å´yíçVS^PKÿ«éU“îÄKM³jZóþà†Ô4ê›Õ4ê{©iØ{¾ïÝTSÃý¡jŠá–åg—Ó¹¿Ëé;#'Ó‹óŸóÇ7NNùµlcrô=å4è[ä4ê=ß÷nËÉ»?TNç†ñöä4EhúÝ’_qvzõ+’é­K6ns%¯¶‡e’ͨo–ͨï%›aïù¾wS6 ÷GÊfÙÖôø“M~•Y_ý&d:ëRÍ·N5g Ð<¦šAßS5ƒ¾E5£Þó}ï¶j¼ûCUrfWx˜jò+˱¼ú•ÇôÖ%›wV6!g§­ëlF}³lF}/Ù {Ï÷½›²i¸?R6(=ýñQ² gŽÛöêWÓ[—l¾s²YÓLxИl}OÙ úÙŒzÏ÷½Û²ñî•Ͳ¤Ç÷§|ñ²›;w߈Ù|y¼úÕÆôÖ%·AΜÞ1ÕŒ¹ž¢s-štžï:·ã¼)˜9ï`ÇùQ‚™ó[I ¯~«ÑuéůëÏ9Ñ|[}õÍ’õ½43ì=ß÷nª¦áþPÙ¬Û-)åa²Io%9/ëµo5¦·.ݸUæ9ïCűUæQßS6ƒ¾E6£Þó}ï¶l¼ûCe3…3 ïA²9ÏPì¯~©1u©æ¯:=ô9¿Þ/uDz'k:Ÿ½yúòé?gjçKú¤ãÌy?Ö¼/© Ó™¸yùI¹rüOoŸÿpÿ¹m z endstream endobj 329 0 obj <> endobj 330 0 obj <>/ProcSet[/PDF/Text]>> endobj 331 0 obj [332 0 R 333 0 R] endobj 332 0 obj <>stream xÚ+ä2P0PÈå2µ4Ñ372s`LsK# ÇJgp…+äqÕ- , endstream endobj 333 0 obj <>stream xÚ½]Ë®í6rŸ¯8ƒ è ²­µUš6âÇ @bç¶_}»{ n¹Ò“üJ‚<¾5¤DV­ª¢ÅjÄçÀðö!Y\KR­½EJUåéuÊÿüé§—éüã›/_z}n}O¯ŸÎ¿Ÿ:Ž×y™×ù±éæ¾5Si§Ç3•ñ2µýýÇ—2öŸr{°e¡Ç²é6`×fƒ³T^Íøt6w$C@š€á;ñIã“Æ_÷Õ´“ Ÿ Æ&‡ ÆŸJCizN 9=gA> JÑ\0ýT w[4î¶îÙhPФà‚é§Òиy¤×fèÚn€Šª gá)/—þŽí1- ëO5óñWSNí¾P®¿A~Œ\äÇXU~ª Ðm¸ás\Ù³øŽ Ešª½olËiPg_ Ô.ãŸÚcÀ&MÕ`°ÔCX …ž"ÚL²$dHÈðá!ÃÓÄ  X`xáÃp,8G´ËMœÐ1 /íô©±v™£I!›8¡9`xi‡à9pŽhW «2{•F:–vž& n™³Äžus´ÌKVvbiêö¾±µäÏÓ B] Юàí `•¦î@6h ×|¤ÐSX»€I–„ †P›gÝ\IµËø§ö°ISu 4Ðk>Rè)¢]Á$KB†„ C(2ÅT÷\¥‘ÙRéö¾±µ¬™°î¹¤Úü¢=¬ÒÔHÀ ôšz k0É’!!CÂЇ ž*NìHÀÂÃÌBœÃÚÈ*N옃‡$ Îaí d'v 7H@œÃÚÈK™ÝŽJÓ:*c MܺfŒºç*=É–J·÷­Ñ`IuÏ% Ô.ãŸÚcÀ&MÕ`°¤¶çÒzŠhW0É’!!CÀC†‡ O't$`á%ÁžK³àÑ.C6qBÇ 0¼$Øsiœ#ÚeÈ&Nè@^ì¹4Îí dUf¯£ÒHÇ’`Ï¥iŠàö¼M[ªÝÜH$±Øº½ol-ÏÇA5[¨]Æ?µÇ€Mšª Ø ^ó‘BOí &Y2$dHBñá!ÃÓÄ  Xx˜Y¨Ã‚sD» ÙÄ 3pðpƒdäÀ9¢]†lâ„äàáÉÈsD»Y•Ùë¨4­£¡2Ò”ðÿ|<Õõî³­²œÕíˆ^­Å ŸÍZ×»ÒÀTÆ?s °%¨$`ƒzÍG =Eò “, 2$ ¡xÈðái‰Б€…‡™…:,8G2 ²¥@Ç <Ü 9pŽd0dK7€äàáÉÈs$ó@ kjï`éØWXïjš3ë%/€×µ¥Àäõ2­ƒí}ck4H§A}5P»ŒåÁ4@N„Á$ƒTa1z äÂ0&Y2$dHxÈðáá¤éHÀÉñàÈŽiœ#3pÀpj‡ OµËœ)Ó 9UF:†S;Ïs k†![ÚL§£ÒHGjGái²àö‰íÙ>y’g±º½oÍXÆ÷mõa­4@¹Œ^„'pU—ºày¼A^Ó‘@Í`Ù"Y Òd(A±f!ÃRU‰I8x”9¨ÃSX²X5‰³0ðhäùÈSX°X‰ÀÀ£ ç#La¹à%ÆNG#ií†ÉJS¯åŸ?ýTÿ¸²÷-=h¯oÔ»aӸ̠c½-ŸÓêß…er9Ž·Éˆ*½kff’"‡™f*Qg0dÞ†9C:Ïb˜øa²—©:~oSQú:dyCmaÔ:°téjúÁ®*p‘h#o‡Q‰:’kZfâ#Áe:ÜfÿcƒÝ!@:(b¥aC’úÕõð]º  ¼NWïï_zÚWû£Ÿú½ÑðE–yx•¥îß6ØWkúìð™°}x,¬” ŸÜÙÇÔ‡wúqÆðùŠ}˜xÄ¢7Ã]°}äØë­Áp¯b7æíŠ^Ä–”v÷4^Už­5ÿÀ ¨¶oòÜHU“i=Èû¶U "©ß&svÇkÑ#©¼6ñq˜is‹c™6Gm˜:çEcÙs6Ÿh˜æä’úb™N6÷c˜’â°bY)&pFà2e"©6ðznsbá6FvºëÕcÑ»6žqf邊c‘–6ölç@cQq&|è>’ÉꢙlÈ06ÅWÅ¢Sìûúa š‰EØw«ÃW¾.À!öÖ×¾¾žs/£coèì;‹á«÷â0ö6Å>_>öv/ybO¾í³Àá#J÷@>ö”Ò>½=QrÏNC•jG[ET{l.¶^eÜײõVFå_¨³Ê¸/ÿbëgŒÊyPg•q_ÎÃ>d Î*cTÁå¨sç©·Êåλ|âqž3õV£ Ä…:Ã@ZG»éŸÖÒXÕ‚ÁE¥ ëûÚJ©·E[m‘áaÑV[õò¶§­;,ÀéÊJ&Úr Š‰®ŠÜ ²«â¨lçª} *¹j{ d®*Ó R”«Š¨e ìÜÖúq¥«†Å~\)”Ay[z(PÅU¬TÑpcU4\eAµWÙ#PíÀe€²Ò]†@VºMì½K0vYò£ c—‚9H µÙάP—)7ÈÞs™ªì=—Ñ4Ȳr…,+—y2Ȇq™_l—!0ÈZp:¬É=ˆ.w™èrq;ˆvï(`%y¶é“Ça›­£ÝôOkiLjEà¢HÇ•ùMióÛBëö0.´nÊTßͶ5ßÇE³m%áAc[Â;Rߨ|Ô¡u5—#uhmaÎA½PW7R/ÔPÔut5L#uME¼Ûú|®Ðä¸@Ÿ­Z6(¦fËFj©ÙâRƒšW®¾[¤æ•-4¨MäêpEjÙb-ƒ2®^R¤†Œ©ÅqWÄÕ´Ö±ÕEl’H ›Ô>ȵwu%"¹ö6ùxíòÿ#9Ñ6It»êò´#¹«6™ocèòi#9†6éj æò#¹`69f³ãòÓ"9;6¥á>ÍÂ¥Ò,½"8­¥¡W.ëãÊ}øðïåãóÇ—ùߟ^~ýáå³/èuž_?”Œ’‘oëôšµŸïôúáÓ˯>NÓ´ÿÕ‡æñyZi÷FS>>/§Ìçüõßgþ•2Ê¿siÝÑÇiٔݚ¿û[ÏnMÊ.ÑcÎWÂÚ=OæòñuùøVÍyJ››óMùø²¤¼¶è\§6Ê7òçý_«ïø`Ôq,szäÉýë{ö—Ê<_’}Þ~æT•e¶ É_””ÑVîýî+w–¼DM‹?Á¿=ÏM[îOûñ£²É?#óñ3h_+Ë|a§ãÏríš¿e…3víº,ùWÙŸþÇ_i«|ËœéþJ®å—uí_ȯÙÿçq~öÅa¾„å¦Ü;Œi^Ë¿8^±í™m÷§øµ6ÊˤiëkÒ_éõ˜iöß¶ïù<¾¬u~ù|nÕç^Ž]Þn~:Ó³ÔïTk«×e][×–ú©:ð"mKzÝ—í1ç»M;¶¿pÎ?ïGyka-¿íËzË·úì:g®}2ÏåU¶ô¿ý[Vȳü#ûí/sþº,Ž÷ò»Üf§§?1­Àô,‹¶ÝY)f=ä•׿Œ@‚Êœž5ß|¬¹ÿ%Iy·¶æ›í={^?×Ôg×—<ß×É{Èÿ’leg²{Ëë·dÂk¸îþêü%«÷7Nç‹iŒÖÓ“Ñ‹™oäÓ³/ºžø×í8SÌ´Õÿúæ«›אָôï^Ùdo÷~ZË‘®sÿêÃWLÿ .Y*öñé­½ÓÓÚ>ïh{º?ê²iòšòÆþÎz‘Ûï-Ÿâ?ð‡¿1,[Þ?æÕ ûBëåIzt.÷íª#ßoyYuVÏ5KüÏ|üÏ+0ÿ›§¹\z±–¿‰åé‚sдÌzQ—o“OêË7zeW#m?‹øÙ³ÿQy 9?Ñxºþ;­úW0n[~¢¶×—0l½Þ[›Kwi¤c>7ðüï’oª{[wÆK{éÛM;Пã=z*«Æè§TïåOM3=èZÿ¼júy»£Ýçsá„ëv}v|‰ Íü•°¹lóoËÇì­ùY¾TÏ#¦Ÿ í©Ÿ mÕOÔz½·îëÇ›¿«~Òü8Þ_>KÞöïsX>ß;ùè«6üX>¿uúɷIJd é'h{ê'h[õµ^ï­ûúñæï©ŸíÈë×e}omTö), œ€ôe«r{ƒ­<ØÉ|Em‹€¢¶—€ÂÖë½uW@ówЖòOÁóÝTö¦ûÐV@æ²U}ïTžö-PÐöPж (j½Þ[÷äÍßU@ó”¿ÉÇÿG@Fùïµd#¿~1']ÝÿƒuÊ—ÿˆy?hZœ4½|5^o»ž÷ÖïéøDsÞqÍoëx·òÐç\ýþ£óûsyìkláµ==´­®Z¯÷Ö}ç{ówõ~^.ëú¶ÞwËsÒÕý¿uî/Œ)ÅÜ´=Ý´­îZ¯÷Ö}÷{ówuy¾OÛÛºßÝôÍIW÷ë §ÿË ß5öÜ#j{ú?h[ýµ^ï­ûþ÷æïéÿòw_÷_ÜÿßßÞõÍIWÿÿκ¿„»íGm‹û£¶—ûÃÖë½u×ýówuÿù’ÿx[÷»{¿9éêþß;÷Ÿa+1ïÇLOçÇL«ïƒÆë­qßóÎú]¿–àšùmïnûúœ«ßÝÓÊu~ž!8!ÇmOÏm«ë£Öë½ußùÞü]½?•ð­õm½ïîúæ¤çßuŸ5.%Ø.žöQÛâý¨íåý°õzoÝõ~Çü=½_BKöô˯ù~¸½ç›“¾¼ï.Û~††¼´=½´­ÞZ¯÷Ö}ï{ówõ~Úó·p[ï»[¾9éËûî)ßYq(Å|QÛÓûAÛêý¨õzoÝ÷¾7WïÏ”¿…ÇÛzßÝ÷ÍI_Þwùæ’ò}̲x>fyù=h»ÞÙv}îŒßÓã3•ùùm=îîõê”/»‡{sÉqØb뼨íéó mõzÔz½·î{Þ›¿«ï·’’ñ˯ó~¼½Ó›“¾¼ïžíÍ%…fŠ­ó¢¶§÷ƒ¶ÕûQëõÞºï}oþ®Þ_§3ÜñM½ïîôæ¤/ïûG{sÉÒÚb ½¨íéþ muÔz½·î»ß›¿«û§ù ‰}S÷»[½9éËýîÉ^Iœbë¼ iñ}Ðôr}Ôx½5î:Þ[¿§ß÷%ÿŽ·u»»ßëS¾¼þ{íÊåñÌj,iI+þ&Í‹f›µh:S„Ü4u©8já¿uõòXŸ¹×åüßòñŸüñåã¿ÊÇÿèð÷| ] ƹø¹n|ŸxùúåßÎÿOùs¿ÒÍJ*ð¢ÓÀÙA—2móÿøòÝë¿fÜÿÑÐr endstream endobj 334 0 obj <> endobj 335 0 obj <> endobj 336 0 obj <> endobj 337 0 obj <>/ProcSet[/PDF/Text]>> endobj 338 0 obj [339 0 R 340 0 R] endobj 339 0 obj <>stream xÚ+ä2P0PÈå2µ4Ñ372s`LsK# ÇJgp…+äqÕ- , endstream endobj 340 0 obj <>stream xÚÅ\IoǾóWðX1 ´z_rs Ëv"ÄMIv @‡¶Ø’Kþ#жjh[ÐLrN©êyì7]U³¼Gá‘Þè«êîêÚ§gôáñ_ôáñà‚ÿýå«Í_Ž>:øõñÁ­;úÐøÃã/L½k]¢zÙ­˜Tq–5ÇCáÖëÐÛ†WÖ ‹hd·ÛxõÞGT÷½ç«û^ºuYS”Ï|z7{Û¯ùâ« ùðø¶/Z§¢-‡ß?¼JÁ~s¼VÉJ7øè†÷‹ˆJùãëƒ/ëT”±qÃ~¤`F´Ò „n Î}àÞ~\r/IåtÉ´Gë13~c€nÄÍø•þòr¿ô¯5æÃ2Vz«øZ'(›·&v£íéÃ~Œr(üN‚ Žô ¬| t/Ÿ5µº»UíÎ9÷e#ЮFsJxÄl×§|äsãšk@§ ŸKU\ °²¬c„ÈmGæ.¸XkÀzR`à‹æû^·Ë«æû§œ}(ª ’f5d¿ëÉ*«0GkÚxÏš‡…©[-:n,x8Îî¬Í¸†Œë[74¸\J½]ï?š‡¿uÇõÒÎN–ÝÉxÞ¯[Ô€ÿƒeûÝÆ|0Èó9—ò%ã¢*… þ]/K˜Ži?p\ó¼üw^|‡èÆ[ä;&ƒš¼Ù†Ãn£ÁmS—QPî5(¨,ƒ?íÇyÓ«G—5Ù ²ÐEf1ÜôêK×|p”òt„.× ‚N%,°Ú`"ƒ¿hÓ:åCd­ ³¦$g[…íЇIkÅï!‰Î¡¿kêûS‡F/]øô‡é2³®²'>B”¹h_5ó÷6vËÔflVÚÚë°YizçûŸ-`Ð]Êzã» !ÑËȦ¬ ŒÓøÀà;l‹M+¢Æ‹¦b‹Q6ñN)²öªd³veR½d8÷ MvÂQdh®ÈªaÊU$æ ÛõïѾŠ, þ:YšÞ¹¨ƒ#E– ¡ Ï´~§n²ÌËC¹œ8ð‹®%™³u ÓÕ>‘$k¦o›$¥ÁGRÌ£®‚À0}Çœ¿€é²Ãl!Póu=~ÜuPe†¹A³Ììæ6›¸1\/ñv¿é œ+õešóy·Tú¨/Äa¾Œ‡-ßîç ö6ÎKØ€ˆ­êpqˆ|à»=jýç•0Vа«¶¿Bái©ýEakÚ_„fh=škÑQöm±ÙJí/ ZÓþ¢4Óí/Q`Óí/ ÞÜb,$×>pø³Þ‹n«…w4@ô@„ú´'}l„`¹´¶iï¶»h3Ÿ›…óPÇC4Íq±“ç°1 ¼+:yÞh•‚“wˆ'Æâ18._låyp:1ò½úÙZy!¥­›måQÌ|+¢ÅV±‚ÊzEœïQ²ŠãL vÙx Âò%lÛ%4B [¥ð#îÒ!D{p¨l9™“áS¼A:ˆ½ç€ÆrÆ¡¥šÓ‹Ëâ“pí8ωÀg]€ÜÓ­‚õÝG» |m`R”ЩÖoló©ÿ²)ðÕlû¡µê5›ž¢sjŠQ Q¸1ÀG7¢ÊeÓSÜþØt,ÔŽA‡{pµÖHùï<º*™Öíï—œ!´á’sp¡F„ì÷Ý0ÃЕxó÷Å>¨¿{ 2‰1-¶A¡ÚpÙ2xß…ŠÓæÂ@½êÀ}1 ´º J ¹ƒ(º¶Ž)ð šØbÒE0Sþºö -¸ƒrâH⬠²ð·þá6õhN‰Ð¡EuñœùD‹v£0# ¦±gk-:U@#)—©brçêÏ5›ø­£"l‰ÀXFwÚÏô¤EÓsá9^¨%/eqÒ˜‹†Ÿ6>³É>ÁŽœãÛ>ú¾O`À­•–ÇúÊñ-šj…a¼ÅàMàB+ÌBºœø6l3±­,¶»ÿôò_§”á|#`ØóÓ6Àå—}f·¦ÕF«µUÉÛ«j5ᲤÕlЕZÍè†lv»'}_ ôc;În)zóèûXeƒ]¬ –\"g1Ù–ø¶ôë‚äÓ[ºè ló¬ýíiŸ¸CœÑ…6#S" 6È4{y•ctœãœwCÌ’˜6îA¤Ö»¾d>韎=ï[lË«7½ú•r`%õ·~iãv°þÖÓN öòc-jý¾îÃ'(û»S z;ÛSî/–¥Œê„9^H< †È2rB5mf<£JmzÎ%'#¥þ´†Œ…O{…½ Á2@#0ÛY‰ÄÙ\QÖc%"û»FGÔLmí¨#„jFG$ä’ŽšÙTVÚòqèCm¬¦)h?'fs+s±¨¹4ž ½!­ŒM ÉíÄA™`M”‘RæUñåzdà=:²"hÏ®v"Íæšì„°ž±¼ãÛSþñ8k,Êì61² Ø÷Ÿõ–$iFÎd2G‹Pqø~Šl†6$e6«ÈØ€ìœÒœõ­îôÙ¼µ~íÑVJH׳F¯“J³ÝUšÍ5)*aÝ)ê¬*­ÑNH³­OW(!2Ú9á2SBø…AG%ÑOôÙuŒ†Q¬{"PŸM£+fã r›x(à°í”“4MÝëÒ¹P.[U’g´Ï…’ïM;r"uÉûªŸ´qÉÍÙ•ÇŽŒ¦/ p­ÂîŸhû «äÉMÞšTß× Ú(cø'\€ù¼f˜%Ë% v®æEØ7'Çò0ù¼c¾E©Nh±†aΖTÙfìdræRJnT€ÚJD r2(ï|Ï”Ï]eApóêæ"¶-£›ïk9lkÏJÓ®è®gmØÁubG'sM*¾{Iá2¶ÏÊ.*®³edDÇuð ´BÉ¡<Œœû|Mm”…¡’çÂg´·’;ð;/ÏE_s+J(øjD Š °‚"LfÊÚ ø×d®GÞAñ_$š·vÐ \Ùi›=H$–2¿Ííôu­®Æ´U«[2xi6?Á_©6Âl)ËC›ÚäN…Þãm!ÔížÉTî †ž!ÓgCN§žàw0@ô+3Okë‹6l´…ij> åS\‘v†Úz&¤SêT„qú©äˆÏY ä Y¡M®…)ñOÚ­‡ÚG39NfogrZdÉ|zúë´žé“6¾ßsµþe²Ð? ð+õø¦LÎY<ù’ÅJ› x˜/L lÊè`Í%GišËf‡ÇSa´³e™ÅcjžÑœPs‰‰ƒ®`€±(mËänLZ`ÎõÝ/6݉²L•œY1Ì’ J*x]!lm×då!kg†÷/çú«^"õ…)Šáç‡#> * x‡¼N^Áü¶¾«ÙŽlü†ž_.žO õç:4Ä+†©§Tîñ³q΀¥e@ß”r˜’P÷†¸xh#oÖüíÙï…³¸FPNNá =ÌçÀ£SÜÖ%=‹K¨o÷Rà ¬Q= o‹˜È§µ" šRKº¢ £ÐÛDû¥p.Ÿïi®c÷o€(œ³“3X°$ ²œx*Fy¬$#ƒOŨ@|¿eJ=&L™ A R¤äCN)_êÉaÓå0Ù|ÌA¯ SÚ*í¸wSرˆnAYw S¾DÐç …ã~B$ùÿƒæ×쓳‰Ìk>8¨ËñÊâMýü¥ž|á¿@ìˆ ~M1Ää¢ÂæPìµÄƒhèáñ»}iª`ùWùoX0I¶ú_Š>ê5IYÍ9>$o ÆÀù•|àñ"“|¿oþ@>œ ›'øÍŸ\ø°S‘Ê¸ä¢ À‰äà _-ð«’‡¯ú¾a»&õq<ä½SóxÅ3 ­kCÜmžYx”G‡¶§r{|l{Õö‘R´û©vÀ'Ðyn±oûo<à×2œ Ǹ£Ío^AX—¶ð¬¿Êå\Çf:sP»¤Êe7*èßï{ëÊxºË¼xе¹O÷HAXó{òE‹âÃÜæŸ¬pc3~L^ìÃÏÄQÌr>` ©6VžÅ#ú‰ ù4ú| ¾KËA}>P{ø|²ëƒýBˆŸføbEÞgß"@s  Gô#v!̉—½6šLà<…×B!Ó@ë"È©Œ áó³°¢<|¼`~EøR’ãZÜ|×ûxÍ{„ü•çË.ŸáO|ƒŸ)³„z§päJtôU±ÞÖÇ‹=éL¤/tš“a>+ ï䣣ãÊ!ÞGp“g°ôËLfá]cŽS8zepÇý¥cíÚM}ÉGžìxȈIm2ª[<ý°ŸúbÃÖ+¨¯Ç³núâßm‘týˆQ4õ!¹šùÑI`1â'X|JW ø#. ñž‰À–è×Ö ŸÝù|ó‰„û®©Á·pM°K߈—P^t?tý|À€Ýê —ô_<:üðý") endstream endobj 341 0 obj <> endobj 342 0 obj <> endobj 343 0 obj <>/Font<>/ProcSet[/PDF/ImageC/Text]>> endobj 344 0 obj [345 0 R 346 0 R] endobj 345 0 obj <>stream xÚ+ä2P0PÈå2µ4Ñ372s`LsK# ÇJgp…+äqÕ- , endstream endobj 346 0 obj <>stream xÚ­ZYoÇ~ç¯ØÇNZ} t˜[mE‚#AlÊç7PÒR&@‘‚HQÖLòœ<¤j–;3uôr)‚fÉeUuuuÕWG]ìý´c{áÿž|sñýÛ;¿ßÛ¹vË.\\ìýeÇ ßºEŠ‹£©9,ö¾ÛùÍWÖÚñq¿ŽDÅ™R½ |@hš‰Š°<§©Ù”XÍ£9M+Æ&¹Ö9³ÉØÑ}B䊉^ùŸr +I’A‰h—¥vƒ9ðñ)!ÏÁ´ä91®Cë*Dwññ%RÚÅmøÿ œîj~z­.ŠÏ`‹:²}e_}zOÍ‘MŠY¡·?ð±øX^ÈHøù§ø8ÿöН°‡"…?‡‡ÿíÅ2‰.3È;Kñ®ššŠ¶%{¡N¼ø,’9Vãu ì[|¼ƒþÇãv•ÞY-à Y‡Ã¾ññzä[ŽßͤÎe…äL,A–þy`$äâhó©^ü[ƒð^á[™êxTsüuøéå¨ú‹¹<e“¥¸‰™R—dZÕVweû5“Ç5cwï'¶èþ.q›oxð³wÔ÷½ÉÁ âA›×„Òh´ ˆ]íä„ÈÑÚ‘Ý¿VÊ1w\Ï7×jBM£ð:× {ã’ ÀàójîŽ?ýa2|ܦûp&!FB» Ù4ÐS> °À)« Ê ˜Œtw©šTärÞs2ÑI;Qx/è%’h@Š{ƒAÆ{›MV6ûÙ¥(›‹56ν,ëñëÃ’+’¡ƒÊ`þèò_”½uÆzÇe_“DÎ\È髯ÇÇɰgRL…ÌbŸ=´v@€ FTA>Få°>C…ìmsO GÑb ”õ%$E×d´‘b೜î•F„-ƒ«[Áw0¡†ã)®ny< §6eŸî­Bâ¿)¸®ÅܳÍu Ù±0¼Ï êÃ趉ª€ Öøâ4aŽð±šq;¾þ—Ñÿ'¯:«…aKÇ´ÈñnáÃ7â¡NÌ5*<ÁcŸ¬IrýQ_bZ?œ‹ûpµ‚õ&8i§bÆNQRÕu”eF€4”¬ÔqBŸw´”‚.¡J ,…ûÈ%ÕK=4”“Õb„-êlQ¶ÆèLÊU=Í)úhéz@ƒEžT0Š¥Ð^<;gÔÎÊ:H—‚3­iJK¤ƒ¦Ê:ßqDÞàÜ6z%:'È6tP8ú&x÷' Ñ:+¬(Èõ­ºlM­Eo‘eJñ„$!«ƒÊ «Ú ÈϨcœÊ`†*« f1Æ7”ç„öFÏÉ_Wí!Ð3å|¸›Jm¸xˆ^áÝ">àR‰Òd Ðt\ä%mÍ–4Åœ e#ؼ`Ò—Êö²~ªM3’ö3"Ó}•æ}h©sÕ¬¶Ê;ç4ࣉVêÀ:ÝÍJUÊ^¨RrœµbÑ1Œ7Z[NõéØ˜üQNP°Fƒ€óÐY Ô<ÚO±<˜”†r6®H5ëæ–‰ˆh°MÑRy[à@Š üxl8HÏä¡“ô茜æè«{iÁG4á;ã“”tCôD>wa‘Å(-!ðÝ“;.ÕÄÐtÛ =ÓͽgäG ‡sн=þnàkøÛú¾ú§“?-†%6Û~Å vÈÃOHsm7,nü°sþ­g–¼…ŽÕšiÓ·egl= 4ƪÿ,ðš2Aže4™wxü€ÑЮ8¦!E2ÚÌÄ,v~ŸÏmÕ­Ói‰” YnóòŽâŽ9mÕC •¨äèõÄhP]Hú_¥)ö¦y)üŠ]q„jÙ !WïŠÄkrºmq0ƒ!õ¾8Û²ÆgÇN圧ì(OŒ¥õfbÔŽiÖÒu²lÀ¡Uwr…a„ºGÚ={(¹†õ}Y®¶ò”•\ ÛI¿íljÔ“mà’·S&8ËÔ’îzSusÎ+ðZä®e#„qWnB‚gÛw×9îCZ€,i±y2þu*ÎžË  ʃL.»Ó%bŠÜÈù¨ÏoG9G4¼´7RÄ”öÍ¥ˆnÑ+Jn\Ú¬ZÃU0VrŒ3z^m Œ~jqß®o…Їbá Ýç"—|1i) úÎÒi½¼Ç{G¹Â‡Ýéäf@…°K0›7A*@.¢×ʧõ—#ã“—t„ý¢\qPð€0b–¦ÝÏíÚ-ϲ8^9G¥_ÿÇÓv¿ÿûŸŸ<]ñðÌÀUîhôF_'ȹI®sóŸOŸüéqg!t¥ËЇô¾mjaÏD9LbXêQ1ë±R*ŒÇРǣUWhcSÐÀ”ï ຽX¸3Ùðà-.FN}0Êÿ¥3•?À‘$åsÿ¥Á5Úf ­ /÷?ZT(ãTÕ•ÑŽ“ß`)Þê§ÇÉÊ›ŠpuP&–û×?ù|÷ë½Ý;7?ûbïëÝ;wnÞØ½¾wS÷Æ” ô#_råo¿Õ!ò°¡™ù.tAx«¯B÷¡2‚ÉgÁöŠšÿX2&8sŸãä›û2¡|}¢làYòÙµ¢ë¶]¥æ1Ý@')­²ÍÍ~.8Èæ¼r„—LÞJÊNz לü”V¯ïù¾ Ãydz !˜ ¨½É|Љ4tr.„ËŽèÚ­Àú8ß‚fi†zKZ u®+"ÞÛx§ù³§y÷…cJþÈçê“î1G’ÜÇá~Ÿ“+ïþ…¦º¯¬«2‚Ê¥¯©à¯3 #ï=]À›J'8–|t²"õò±'¾ØV]Ò4ê ,]-ˆµ»Ú;þ”~œV‡Ë”æ4=zo9^éÚ’íü2A¿5dDÛ\2õίÍÞŠY_nV10&'T¤4Ád)è!Ûap“ÚØÜdA“yÕæÅJè‹çìVºB)µwUéU‹Û¨ƒÇ÷Õlâ4ø•çP­Påž2BA/wD¯)¾³›9rK™#@˜XµwI Y¾äá5Íló—”°ñákXfvA×”ë*b¸¨Tú8ˆ ´ý—1<£püsš8ÞPkXÏÅÈ”ŽãÛà8]w€¸ÈÝôp FÛ¼Z¯š„ há(¬)t‹7„|ñ&UÁ{¨ÜÈAß]‹ª %lx§Æéh2<š^L[¾ÿ¬ûâFÛbðvè> jaû›=¼µ­)I¶-l’ð…½¬ð®i»‘xÂ&Ô3îáXdCìÝÂÉ. Ò¥ùÅßvX ˜È/~üö‚nö!]ó»ó`ñ=Èý?÷¬] endstream endobj 347 0 obj <>stream xÚíMhW¶Ç žlù£#µ%dËùPóì¸hmF¶ÛF3i„P¬ `!›Ø‰°Â#b;(ÁØZ8~‚ÄA$Ì ð< …!A« Å´1ñRx6"k´ÈÂËyÿø¼9œÜê*µúûãÿç"ª«nݺuïïžsî­R÷¿ÿMQEQEQEQ5¨Û·o1êííÅ=úôéÓÞºÿ~ñê044„KŒöôœ‹Å]‡]YYAɶÑð1ü”RJîZ„ªʧ€!ûB‚Â/“´¿?~,{,º—@e {zÅ>xðÀ}Ž=z”±Åp-´U%°'w-šžžÖýÚ•¢|j‹öɾŒ¡•´Ç/„=Zs2¿þúëírFP­²'§„°'£ÙÐVÒhh=i±œë_<öl•˜J`OJ@Uq-~$CsŠ’­á•îxöìYHMü‚ ‘Ì[öí²'ÕÎXÏ-Ù“ ÖžÒh9÷¦V)¼7·Ìà°‡m½G5p»AØ„W@kÂ^ÆBØ»g{ÁnãDEù(1õÑÈ©´w´qgþ !‘(TËǵ ž­¤TÃFzÅÑ'yäv2Ƈˆj58töHÅœ*9î[£që’œ«ݵlhNV~lÐ޵„ ²eªm—£úQ “eó行ì1§µQ¦ã[ý'jãKë9%Ø=Ò#Z‚?ƒâç@¢ícó‡x4­ÒíßË9õÑKÛj(Ù°‡:[H$„vF®”£-é„1ŽuU'.¹ã+­£tZÏÁÃÏž”&ƒ —–dÃb£ •”A Ñ2m5¹ASWÿ° aω½u†‘RˆeÑ£ÄÚàÙ“j딊 Áî¿+-V µ´¿Óª:ÛÒç:F@oÍZf)D:ÝFø2Ö´§0ÐÈf'¤Â¶¶Œ²ço Á¨GmL%ÅŠ9ʈßþˉ:”´¨³6¸¢ +ýÔ[}*^À¶§`Äž"l¬=%|š#•·©ùí¸ÖX%Üîõþ^{NÍC°ß2Ö6â§2ö–ítÍ èúƒCô²tDFö¬‹ *Á¹#mIYå>rØÓªZÓ‘¨y´§¬CTão»ÏQ¶²\*ñÏÚ‚ØÓþ Ù°çì´èÛ´ð‰d6ñ^P d´ÀÙ/( 0ŽWE_;®A  í)äA›ëm:n%#{áÓL{×z;8ì9·ïï-+ 7{ä÷ gOVýÆÄÖ§Øì‰µÍ¥ ½ãÄoAëÛ%cOÖT‘Ç™zkàáo%é *Ò^“Ô£Éä lù\×;Æ*ã]ëÝù;4öÐ[²gòmŸ‚Z^¯ë ŸphsfÏBžÑhKsé8²¤¡SBVZ²œç:qKÆ`&œ=tä8)­³"¤P`ühÙHÉYøÒ^¶­‘˜Œwm§*ÎtVK¬KUß'ë*þ 8 5þ†›ÍÚ²ÌéGƵmÞ²§õ× ŽC…~t…ölY²§M*+Bh½YgŠf ZW´íƒTKå"¥TÝ«Òáïz5~ö°G`m g…­½¿Ò¶Öð¢|ìôÏnl[-DVg—–Æ ãŸ²9‘UÙ³ñŒ3›p AGØ•œ-Ÿd¿¾—ñ¢>Û Q·K1!å„,­Ø=þÕ g iÙ³­äpƒ¬½^ÔaÏš Œ8µp[ˆùÚ`ÏYdó·§,ùfÿ.D‰úÑŸÁÙã®úðÝyÿCbŸ×‡ÿÛz—@c65t¥WŽ…—èt•#n× §e9Å °Ñ³zEœ‚~”j ÉÖ0êEgáwí\T{ÇZu[xÆÖ¡Íâ/D‹´[ÃÒ¼Ž’ýã<ªON)²GöÈÙ«s•æ-¬ZMZOa(Š¢(Š¢(Š¢(Š¢(Š¢(Š¢(Š¢(Š¢(Š¢(Š¢(Š¢(Š¢(Š¢(Š¢(Š¢(Š¢(Š¢J££¹¹¹™™™……ÝóäÉ6•Ö××———ÁÕPÿP<·ß·Æ5õ6ö¦¼TO¤G÷t6wÚÌÉDrìݱÙÙY`¹¹¹É†¥üZ]]!à´€™¶H[W´ \ {ÃW¼+ŸzŸæ–.y—¼“ 'e¤1ÙAùM4??¼Ùìu«çÏŸ/..޶6µŽ!à´äLÚ–éºwå÷y}Ç÷Þ±ŽØäø$°g_Ô?…ÙI%S;vv7uŸõÎN{ÓÅã-$Mz“i/ ìa100ØA5)t.‚7˜ Þ…²ðd100!',µä[aè:öw só ÞJ“!&,0ËüÖª¦–7®Ý8Ør†nÊ›ªpêl‚Yþmâ‹ÃV³«ÎÖ]ýðjËÞ–¾]}å çòO°Ò°Õ°ØËËËìÓjY09úêÑô®ôMïf•Rg,vW´kdh„+„•oî0sIJ¨³éío¿ö‡×h+ÜÜÕuš<ÐV >ûø³š4wAë0¢©ñ©¾æ¾š§ÎÀ×[_ÿîÑwìúòêÜà¹þ—úëçt²áäìì,!)’ÒjIYHÞ—$uÆ‘3{Fê†5¤z9M…b/å¥fffI‘”ˆ'.{— 5Ëð“` ‘uâ"Üâàâ–ì)Øjè¬=„s/ÒT—ìU©dª ÿZ+±–csà|íŒCP±3Y ÿ”=±Š~ö첡Î&ÔÉÊY2á- ŠŒ÷ŠªÉñßþ—?ÿnüý®¼YÛ¨Rºt ,NÙÏžšMg§”omlç¹|²VT---%šyö‘<C]Î! ‡d"üÀ{ÚåÝ–S t2À;c§ÖO×ýÈçu¾È®_h)žÐ¶háÚøçǦo$}:MBªh‰¯fÜœñ(ªžn‹´ x•ÿxÊ›:±÷Äè‰&666Ø}5 õõõ±wÇÚ›Ú{"=0ƒ•!¦‰æDÇþŽ{wïÑÃÖž`I`#»"èè2þˆ¤þ”dŸ×‡ˆ®µ©Cƒ/ÖÉt­?ž›öÒ—¼Kˆ²JãU/xz{å't?šþˆ]=OŠ'Ç'“‰ddw$Ò‘£/ åèOÛ{ž¯šJ¦æææøÓá”-ÌMh|yÿË ^Cã5þö“ŽÿI HâFpÇ­{­Í,¤ê™™øzþ#•¥8xÚÚÚVŒfŒ7‚+8nÝhmf¶!•ÛÊŒ÷m—"ÌhæççÙ†Tnºr劲‡íír›J¥Ø†T>W„m²G•ÞáæàvÉU‡›ƒÛ%{TAnn—ìQ…r¸Ûu»d*”ÃÝ®Û%{Tnzòä‰.‹¹eÿÔ•ìQù ìåæµÉEö(²GQd"{Eö(²GQd"{Ù#{Ù£ÈÙ«1Ý¿hh¨4×úõ…ÊÅn³÷÷{ðà(—nß¾}äÈ‘\èéÓ§¸ÐãÇËÅ®ün?\nzzšÔ6{ ]^öp³ÎN˜¾ÒÜ>Îz.øÙ³gèqIضÞY\ …ÝmìÁ~X•GÙü(PÌ ¶‘GŒ ¶+‡=ì±#"è^ Ñ‚´É Õú&Ý c¤¡ôN¥œ ëž ‹Ö{² ¡)d b탺*=E<©ø2¡K›TÚ_ Ñ£•ÆjžÍ½È]È!¹©¡rZ|Ê]KCi‚.lÛÀ¹hÒð‹Ö{¸wzØP›€<–£%ÑVbú¤ ìGN9$¢“‹Jð¹ƒJöè}…Ü‹†’#ðè}ɵ·Œ2Ö][‚ rÑ:´{NI«JO!ƒã_ÄH>6²­­ýUiì©y·½r/ŽÍôÔêÌ\´@¸¶­¶åEÉž´ªØ:|Ú‚ÓŸ¤_*= ŒØ(õƒá÷’={ŽÇ´ 6Vbæ-/JöZðQÂ5AKdΞ?*¹—üížÐ.ëUC.JöЪh(4  •el7”5&•Ïžü[œÖ?ä^²dÏÎ\dêai”e Áß’þ‹’=÷?|´S™ õ°Û6&wØÓ½¢æ¹b÷¼—,Ù›&% JŽ]•œ¸„5t!­yÙgjþçkvñJ$i» …mÞí{!§£a^Jöp/±×åŽ{qÎõÔV†X?)Á™±‚XÿÌ ‹R%ß% ÈEöÈEö(²Gö(²G‘=²G•˜½ÙÙYù…—‹/vvvê¾ðG^¨ÜØËþçDGFFòü²\вìÁpe™yqqÑÞv›ƒ¢r`ïùóç»víÊçÇ(*7ö2º]:\*7½õÖ[ÛbÏq»t¸TÎ’‰jöù·K‡K•Œ=ÇíÒáR¥dOÝ..UböÔíÒáR%fOÝ..Uzöàvép©²°·;55ÅÖ£JÏžàÇÖ£òÑ“òï_]]]ù½ÖÖÖØ\TþHËË˰xCýCÉD)O؇£‡ãѸM‡šéÑ ;å,¤±wÇfggçÆÆ– !MH]Ñ®”—ö†/y—.{—?õ>Í2ÝônÊYHÞÀɆ“€sßž}Â$hœ››Ù¿EÕ’a6::<Ù±¤m‹±í&a4ö6ö‚ÆHc$Ö›Ÿ„gÔ¼Ö××çççSÉLPwS÷Yïìuïzñ`Û2Mz“i/ ÞÚÔŠ€áÀIJíyÕOn|ÅÛ"mÇ÷¿à](#oÓ´7€á€A‘>Æ¡G®v!¬BW«ži8sÅ»RiÈeL#ÞHËÞ–‰&`¨Ù‰U'ø/:„Uèʪ@Îö7ôÃPcÄ€°Z&÷îÞëØßÿU-†.°{€°eÄÖηx“ ÄxÄ,ÄùÆÛã|ƒº«Ç‡£‡ Ø–S£¯å‹X…]@F“ÖórJö)½+}õëd¦PBc¢IÉU– ‚¯¾DíMí\ÊË>]ö.'â ’“¿&>˜èoè'QÛJÍ|Þ‘§677[ö¶d4z?|üÒ—¯©{îDîÈÎìû§dÜÿýÄ÷R”¦¯»¿®4À‚*//?§O§ÉO>ZZZJ4'26ï/ÿúÖ®éà=ØŸeߨŸÿùsÆCØï¯LP沤ÊËr_dW„Þ|4:I„r–çyAm $©9ò³‡^SDåÐâà¢Ú •¿ÃÙ“ÓqQë÷kÙ`@JÓÚZ{t–Ü rZï/·¹eåòdueßž}áì¡ï$3Ì‚ÃöÈ!™)ˆßÄQØB/ËGõíÒãà '"ÁrZÌ´÷Q&ò€g¹–Ôù-º8WNÄu‘pH‡@ÈYr/r l+ùÙT^ÿÅ#™H’¢Ü´¾¾Þi g•8 ËžtÐlçfï9BÉâå\k`… ½–Z-›YH¶W 9ËoÃ~)!›x± "RTTö` Ô(ÙþòûMÛeÙ°‡¢Ä똯Pßɯmõ`…-ä,Ëanì]ñ®ÄcqR”ócÜ ;·dÏ BØ;cýf8{AK…Aìé¼X“ëpT!”:„œ•?{ô¹y ì=M³ìY/©;ÕëôPºO&¼…eOöèLAfµ23ņĄºjíØÞŒgåÏÞYïìèð(ÊY©d*è«{ötf¡;ÕÙ‰›sæ˜Â€ø;ÿ’ÈvÙÓkáB8*Û6°”y,kŒrV8{á•—ÔéYXX B9knn®·±7öÄ¥:;Ñ/êéð×®{X2ýËrV{NiB‹ÌaufáTÌï…œ…ýÎ%äÖ¤ªá•—„P™_%”ÖÖÖ5ÊÿA@Pa?ú±€OPZе0‚…œ~SA•Ÿô&c1ò“§Ò§ÓUú]ReL'öž¸w÷áÉS+++ñhœ8më›$¶ä‹Q"ž(ê7!ÓèQ!Q_¬%ÆW—ùÒrYtkæÖ™½gˆÖ–ÿ¥‹AÊ“,¸Nõœº¸ó" I§šNݽs—¨\›››ÇâÇjã›l‹‘vŒ¿?NNФõõõ?¾üÇÚûJÛüÓùçáHH±ç‰Î­ŸMïìyçÍ“orQ¥4ÖΗ«.’úšûÎ ž#¥ŒýñDYÁuïzW´ë³?#¥×կƣñioºÁ»ä]z¥õþäAyŸ¸½ö‡×êêë¾aîþôÒŸ’‰$é ü¯üÌA=L@F¼˜»¯¾øŠý^9Z]]Çâ=‘žZ%Ôa|¥O§iî*S ò~øC¥9?&ðÚ"m ŽßlVA`*™:Ôt(èû4ªåU¨¾]}íMícïŽñ äª[…Ý·g_Cu= ¹ì]Fðp°åàk7èa«W軉&:öwÀ žl8Y±Ñ |+": ‡Á’ˆ'<ð9E-™ÁÙÙYDƒèÜã{ŽWÈ{øòkõ‰æDdW£¡«mK8??ŽÞÙ°³»©;åýöo˜¥ü"ñKÞ%ð†ëbÞÚÚÔŠÀ`ii‰V®®„î^\\œ™™ÁÄ$Öó<0œFoÃÞ0ÊìŠvÁïã*ÉD¼áºœ·Rv‘С1Ò‰G㚀&xmµ`’z{mfï…¼ õ¡Ìååe¾QLe¯ÍÍÍ£#xmµ`¢¹¹9›™­—›þÆw5 endstream endobj 348 0 obj <>/Height 440/Type/XObject>>stream x^í[¬]Õ•¦wÆ9˜ã ¾r±ËÆ®9Ä”c'†œÇuBè´MâJ\ÔILR œ@w0!)¥ÀR“­ %J”¨ˆÚQ«„D©¥ˆ–J/(¯¾újÙž^ýõ²U¬¼x˜§dÔýâŽÞ|óÍwÞy§ ÌË/¿LË!ø·ý•>´b¨Q– ªCp)…|ê©§¤àuzl–E ¶ Ž Ž«NpŸ1ó—2”lpüš:qâÄPRE¤>!JVŠTaÓc=V$UC2Šït´V€ƒ/¼ðÂP&ת<´ CBdÖƒ )¯€õÖT)…„¥ê·NøÐM•Xp.ÛGÀ_»–G‚#„™+³:Á_éÓW)M)Q³1àˆYZÆ› ãnŠ y ëF•3½„8’dö\ߪGŒç±àH¨£æÕŒØ¤¾£tï1ó«îTѯÅnçPÃÿ—{o1Wލ>@R~Ôy¡ØÐòù—õGŒ’LSãàˆú çy½øP8LFb2†÷âׯmi’Š#Öø(5•dŽ U$÷G*kEÅŠËâî‰i L‰êIÞ8 =dØè„¹ r¬JXÑÜÝ‚ŒÙ †Qw¨vʨµÐ® *£ÜÊeÐf¦¼¡‰‚#k*c·Cgàq↟¡ÄzC⇚´Êd82A2 1Å’)F¶îˆ`z e¤Æ­k•äoHå àÆ´H&qý;ÔªCÁ kÂe´HÉ‘Œ×’§l°Ž#á rµb1çÙÔΔ5tY¥ÄÒSz%ºÔ¾ˆ™fÔbç<IèJ•†âeBÊÍV Å›3C²  Ä†‰¦Ù†/F‰lغVËcâH˜$R;GèaYhhkeîÂÌ&ÃÁÍ!Ïô™qëLëLŽª+ȦkY¾.ø…ê^géFÈ·¼ú…Œµ!8ŽT„Š—Å¥K¤ô¡6Ø¿š¤VS_Eò&`ugS‡Yul0™yi¨³k”®·Å…BšÕræ_zQËV@YÖrT+ÿÉŒ—Å(1³Ñô;N\C1KˆX_r2–l>—`™%Ó)4hz7 §ÌDBㆡá(`5- e¡fi-3FÓS-k_#²£ßˆ,V$Ç‘ŠpP¹Z1Ž˜Øòo¢ #© Yµl­AѸôÛÜ›‹˜é" :ÔȘyV:µiŽ˜öÛâ«Aéz†Ã·KÓ¦Y 8`Ú¢d³ÆÄZ£¢‚5ó5BV‡X`lC¡45Ð Úä‹ep$Sx”ž„¸B†M“£yC!KC†RÖZV‘G*BÅŠõq$ ›MÅ¥î¡ÒS̼•ü¯!ôŒí41EÏû#òŒB8ãndü jò„ô Å‘<Ù!?GisXf|1düÆjá¸Á“°%M  y)#\64\G†Æ7Œ·ºÐB›ø/Uªr!¯†öÞ\V‘G*ÂAåj5q„êaÌlz™Éð/ںǙC§}¹ßy[µ|ô2#aê—–-zåØ˜';³«j¨å„ÌG21Ȩ,¦bfQýü ÈE¶gF¥,™BŇÆ5ÓÝø8b% ›ÆÇ‘ì–U$ǑʀP±b}åê¾–åtmsfˆèñ¨e?ƒƒ ÊX²@ó8¢A…Á|ÆÉükó›QêAö¨´â¨I5sßì'tjÌ4¨eý Ž2{gfcŽÁ…3Æ™ÐÝÈqf28’Ý(=Éÿj6ldŒŠkÂ-¼!Ne€/ìBಬ"9ŽT„ƒÊÕšÅ3)½¥mn1u¸˜1 læ(`Q´Ÿß‚eJïr4(˹X/†,V2PÊpÛ”Û<”QnÂ(¾eî›MÊ-²xÄb6¦<ÂÐÝñÖTiŒ†°¡?hˆcjçÓIŠ8©¹- Äãù¨tx8ê|§ WÓ4ÍXûRƒ‰<c*’ãHe@¨X±YˆL®A±éºk±.Âda~ ¦s*iêš…‡e¤gyF™·Ü~sj4oaCä)žŸ3YH5Šø+-ƒáÃÐF2Œ ©2Œ0H ï„kJ!ÙxÅRƒ-“Ô²bÊŒÚTå}®üò]„ÜÎ,uKI$´X‘G*ÂAåj£ž+Ë?¥ž¦¹\]gAЦ Ȥ¨n»¤P‹Q‰LÕÃò´ m™ˆÃ2ŒË#Rž2Ô¢ÙF¡Ådì&£æ^6Šoùûjä1Þ<ñrRøoóÒ´gˆT’Ož±Ô¢£ŒPòr¤X8Rªà‰l 9ôóÅbÊŒ:ÓiFs4:­ÙÀóܶ<ñP ÒB"ùsz•Á+:šá@qJµ™>¼•ˆñùšÃñªýä€ãHäru‰\@NÞY8ŽD®Ž#‘ ÈÉ;Ë’ ÚGã숓Ž#qÊÅ©r¤ÄÇ‘”¤å´:âä€ãHœrqªœ)qÀq$%i9­Î89à8§\œ*ç@JpIIZN«s N8ŽÄ)§Ê9GR’–ÓꈓŽ#qÊÅ©r¤ÄÇ‘”¤å´:âä€ãHœrqªœ)qÀq$%i9­Î89à8§\œ*ç@JpIIZN«s N8ŽÄ)§Ê9GR’–ÓꈓŽ#qÊÅ©r¤ÄÇ‘”¤å´:âä€ãHœrqªœ)qÀq$%i9­Î89à8§\œ*ç@JpIIZN«s N8ŽÄ)§Ê9GR’–ÓꈓŽ#qÊÅ©r¤ÄÇ‘”¤å´:âä€ãHœrqªœ)qÀq$%i9­Î89à8§\’¡êÌ™3 þ™nœ>}Úq$‹“Пýìg‹‹‹/ûgZ9pòäÉ¥¥%Ç‘8Í3ªÀÔ(rЦ9 piš¯SÖžãÈ” <;\Ç‘)W€f†ï8Ò “mÅq$YÑÅD¸ãHLÒ˜-Ž#`zÿºtéŸLKÈq¤»¼ðp¤‹#¯¿þúSO=õì³ÏrÑt_}õÕzé¾ Ç‘îyÞÃSÄ€cÿþýWüé3 ø·U4D襗Pâ8ÒC«î~H)âÈáÇŽ7ß|SìbçÂö¸÷Î;ï<öØcüm¯‹Iµì82)Î÷ªßqÔÀªC1Ýps|—$ãYPq”¯Qp¿à§ñ)™¸29ŽL\} Q9vìØ(îã­ð±_A FÿrÿĉüKÂ5?ñ—¦,DTR?ñ¡$¿úkîU¡AëKëÓv¨Õ”ò9Ž4ÅÉ©n'EÁÚeÞØ9©ÖÌä‡1Nˆ#ʪpD ´cDSüªpÉ~¢$qS˜¡ŒaUhA¨# sM”!#Z%s‰V4)–"ŽÈ)0?ByV0Ÿeq$ãªXž…û†û)ƒ#¡7dÑMˆ/4E]ƒ•˜Âq$fé$C[¢8büÅ\q ähÈ/(Æ‘Œ«’ÉÎZÝЋ¡ÍGpFBoHX#ÔP8cŠeò8ª…ãH„BI¤äp¿#oœÄ–|mG±b"[{æ_> ‘¸~ÌKŠV3G¢MJ„%‡#JŽäí³ŽX V2ËÄ5&ÈСk[~)Ì1¬¤Æ¿Tì8’’¹FKkr8"‹åó /W±dåMdÀÊwXä]j©¡ âš/B?HýZºDk7aò%Np‰S.‰Q•"Ž`« ‚’ö±%[B KUÈ¿(À‘0£Áu¸îº*¡?¢½*‚$]˜ÈíŽ.¬µ˜uÂq$fé$C[Š8"æbÛ¸8CsØ0¿Ê0A‰ “œ|а°~åff›Yø/ÍREëÇIs‡ûü¿'"ÊG’±Õ˜ MGês5¼Ôo0ÅGR”Zt4;ŽD'’n ré–ß=ímšqdèrOåòt¾‘Æ¥ Ïõ…½È¿Ð‡_CçÂJÚ#y:*M ê¶Ð ˇÇ,Òµvîí%µp‰Di“‘:ޱgvuÊ¡·ÑûövY2†óä‹l›_ulbø0  ó‡øIäQ…Çmô¼7õ轆Bªºø±Å½ó{õݾe;†7ô³eý+¶°wŠÏ?ÿük¯½6Á±e¢ƒ %á ©á‰Š8¢`$4~óGh<ó-ÚÔªó¨ü¿†ñTøFk&¨6Þuu¼ûî»LΧN:v×1àkÙºzëµ³×. Ž Ž, –ô=>8þíÁ·õå_~µ<`ÅŽŽòÓüEóÛ.ÚFSósó‡o= ²ÐÅÛo¿]Ê’5Ãà e™úȡȜÆ:Š\†ÂîmSk”Ô f:–QoÛSã:V^Ö}CRÖÃʇá•ãHIQ{ñ‰rà7Þxæ™gð8Î[qÞÜìÜÍ+n¾mpp`èÐÈÅ݃»ïܲÐÅÌù3À €…¿Óöе#ÿá¾^ßž«¨¼©yÆþ¹V’)¦;#Uç_ÛB¢XF¿†ûJìÇÌkÃÃò!1”C$Õj›]eÛ÷G¨Uc ^µ;8ŽtÇë‰÷„Y;`¢VÀ\ëÛ|{-|sðÍCƒC„Z$e'»Ð3q©%A€ãHbªK$I‡¿ò fI쀉¶gÿ·LR–…ž#‡t¹¸S—ÝÓWßq¤ÿ2'“zåeW.®\lÜÈ;kðöso¿üâËÙÃÒi¥9BÇ‘4å6ÕrCȤN8s° s¹Í;ϽóÐ_Š€ýSM‚ãHOÄO¦`׺]iíUm žxº…{"È4‡á8’¦ÜrTóà {Þ›²Ì´Ú!”›Û>×A¦9 Ç‘4åöçT“ àé»:ÎÈéOŸþÝ¿ÿŽïÏ~^ D¾·ù{Ï<®*¿ýÉoiᇻ~Xª…F ³ÕÕwÍOP•G&Èü廯6NŸ>½ìÑ>HqÏÌž:yæ¹?žHŒßί¿ñëßÿÇï´ûGªˆ0$ûwüvê—<{„ʽǗg¨—h‡Ž#íðµ¡V9Ç”£:W®\yäÈ‘@᨞²¯løÀHæbüvTË€Od" ÁÚ4¤q›q©È¸nª Gì3 P8”°ÎîÕß<ñ†ƒK"\øÕ}¿Ê@ Q¿ânà­Xà#g„òTWþr“0‡/|ÃvtGAÈ¥ (lp|üZ’ce—uܺ‘Úöâ8µÐ382 P0¡:ÉÁÁsGŸ `Þ¡¡ê¦\]P’ö¯U ãýj ÄX1|ýÊ_]d§ pºŠŸŸ6)mîŽüò—¿<÷ÜsG½W¥÷ñPŽ?~Þ9çU³=jaêÎX€cöO¨¢_uGp ØÇàXQn5Ä JZ¶E? €t ­H4µFGR“Øzy/oÙWj³hGÞnµ[Ä–cµUDP®Ñ‚º¯Fòûâq[¨"” ¿Ú†Ö­€V…Ó6¯ÝÜýæÇ÷Gz6 xå±×:Ö˜n]^ È;F»—¨ãˆãH÷Z×zÃÁaéÂA5ÊÙÏéMÝ;#ˆÓqÄq¤u«î¾žúåp°_Ù[ Æ©Å.^N]™Ô)­Ž#Ž#Ý›y=r„:©×Ù#?ŽõÆSfßÚ}?~úÇ]pvX=Û¬T‡žg­Ã½ëN”LD½ãˆû#1B@S4M”¸èÀw¾ñ¦8V­ÇÇ‘jš“L­~C òÐýM\Ž#Ž#WÂÖ øÅ¿þbûÚíwîŽ'QŸÞ4ÊkÏ'î‰HxŽ#Ž#­›q °Ïu~nþ–÷ßÒÌëâÊEÞ|þÊ+¯ÄÀ[hàaë………Hˆ™,žg,ÿ»èý»~7uÇDnȃ_yp"ûDF ÉqÄý‘. 8ž>ä˜ð Y?¸è²¶Ã°]5*7ÄÄê8â8wG Îçö-ÛÙ>¿4Xê ªõÅQߺÕëØó•â8’WYkº3ãHzâIœ½ó{9…°ìs}Õà B-rÀç‰tÿo)¹?âþH)…éaal€G„9màæ7Gòjqb.^CC„,‰÷lr¬ô¶mÛz¨å‡äþHyžõ¨y“S§NñRË5«ÖDÜ1¸ãäàd¢NNrÛ·j§½sñ.«x–c–•³ãˆû#Ë*Étà?¦”÷ž¹`†w\. ÎÔØRR–Ô) º xá ɱo)¾2ÂqÄqdº`¢Ôhy(O²bÞ8›L&áÀàÆ_Á[aë  X8ù‘¦R§$hè‚à%Îê˜ìrqSU¼ØÙÝVø _?ñuŒoÅd'†~ R¬ÀAE‘¥©¤#£ Ž#Ž#u9@(. ý¤¤TcpY­bÏjyžµgõátÊDZÛq¤SµóÎzÆÇÇ‘ž©´gpq™€Úy—=ã€ãˆãHÏTÚ‡3°Ÿuz’ÊüõüȔϻì GÜé2û@&ÆÇÇ‘‰)ŸwÜ8Ž8ŽôF™} rà°ÝºáÅÜÜ\§tÄÔ™çGb’†Ó’x}ßPቡÈo…Æÿ#£ö8§uÿ¡‡Z\\L‹f§69ìܹ3%O?ýtiHþˆ#àsXó„0ToÎ õ³D¨7|k7ÏŒGe*NÌP &„µê’³¹¦2kÝc ÀwÙWΚÌgv6’‘MGð*IP‘2't/Œ¦z$ŽÝúÅ}\²zîËW78E84ËDƒ€Š6~)«“,÷`>¦T‡]©âÃÈ€àU’Ë,Ë»8ËŸ"< )Â×wêètãuÉ& ”P3¾žcD˜*+^z8ÂSL ȆO]sd|æK2E°¾³ãè•é4ŽdÝtfÇ¢€:2M¢.P¼ëÿë|…„]J8‚]ÝZúám}EPÛ¶?¼ˆú’…­ ú^¥à† o¬›ö&ŠÎ.½gÿì5ëË&M’Á‘O4>ÇÒÀ‘«_¿îc;ÙJ\™¹“ªHìºúêõ<@1¾P½dMÜüÓ )Ýå˜úºJhËßîÁ3ƉGð-Iÿ\öÕþG§²Ç¯æŠÝÿTb~¨iHÓ\}þ‘7þçkz™O-‹/¸ckwogÓZÔ8ÂJÛÅÞJú§ìø{Y~ë]{ð˦ÙÂ;û®»¯¾ôî}½ÔŸjƒb‹ÓÚn\v;B¼8rç™;×íÝÊ0ª¿—µðËv|þÊÌi:»D¦Üój5gÓ%7l*NÒEŠ#à¤× P/»ÿã[ïÞß* ÜðÒWÕ>Y ú²Ûëô/¾ñW%mÀÜÞïxó‘VrÏ|Q¼ íT«b*ת¶løÈÖ‚\IŒ8BxåÇþÇǧÖì›8;[ *¯.«ÙaùàNFå2ª2J!¯yö‹Öeh§m;$~Óí×ä_öe~t8ª5 N›áGØ8~6uìx캊k>ÙøÙ­_Ý—ŠHxò8(£›Ð1hš2þˆUç×íÜj}q/F-ÏZÅ`5áý±fÙìW³öÖ×Ö8›£Îá£pD*¸Cå‘*Jm …JEI)˜ „"µÑ}iT¦XèЋ”_´*Q¦Žh]\8Bnõ«.njÉ-Ä øM¸–¡k¤£¤2„üJy§¦‰ŸŸ„JúWŠb“ŒªsG,×zH×t$1ç'¥RèI›lQë«mw6.¶½³cµç3…Íž¥¦¦H ©œ‚D^(§*^‰ G išCaU1€ ¤nÒšÒ1¡÷-2Pl¾ºÍõ5 C£›¸p„­" ®òfpÄ<@*\–‘™y Bz¡¸ÄÉ¿ˆM"}–p"2‘*X¼ƒ®;2’êÜ–Õæ?³3;L½#Îõ©™‰³i¡ëkyV)ƒtÌB’Pôy¥B¨…ÚG¤´!€D ‚2qi»´Ú´]p#õ±¦²ò Nþq¾ˆp„'—yè°¬-”_GÌá´EÂÎÏ0ÈL|ÃÑ¡8"é…›F¤Ž—ýi„1æŽÃÔ ¾ úQ¹P òÚ(ïÃ<‚ŒëšW*…'¨Ê(±.FáˆÚ´È ÓÛF4p¨KŽà¥7{À²8j§¹lü‡…ÂË1qÄÜÉ[“ƒ`¥)f4Ÿϼ ›†6Q¹‘ kZ²(ïd~„n…4GK¼8;` ×£pD.°Ída|Ô”r„B&7 Ž!qØ 3Úm†ã™¸F#H±[°"LáŽ.„)CqD1Qf’±ÀU93…E-áa Áà4Ø|ãcd{çªÖW¹|\£ü¨‚I?L“)+G”-£TúIQvˆ>–Ô3Òä'åÌÏR–‘Vۤ؎lºóƒûžü³'ÑcÁÈ‚¸úB [€‰’(£V¥¬U ‰¹ü c®u?S2Übdù3Eí„1°ªÓ—Ý4z¬ßp¯òØ1†qž€hÜSo°‘ ©!bËŒèBZ‡ys-çBwé’R­è¤6¡R)§Š3·Â5£QÒ1š µKÿ ÅL3e2[Jýò¡M,8Òˆ‡Yн)Ì‘Nœ—ºUwO?‡$r¾YoԠ˰׆Ù+Y,8ÂÛšZîí’¡1ô…1`ÝÛaê=r~%GÏÅ Ái \ŠGXqGRäf 4c ˜DêVÝ=ýî×ÑÞLª5 „Ü/dÕÕ4×õ iÕ0¨ÙÍJÓ¦Ž#u_ΛÆ8ŽTÃ÷Gêh2/] OˆÂ Ȫ3ªi®Ë³!²­Á l²z¨ykhLT°m'ðÒÒ5ˆGÎ&J¹±O¯k¶s:-ÁVywsæÚ=—äìžSo{Œ7ÿt ¬PU/­3»,ŽìxôS—ܺ½ø8ñHqá-¶}zi3ή)ßðe% ˆ0g.þïO¶mQSÛþY_ø–M8eåÛly÷‰Êñ·ò¼…'²íŽË¾“ ^A•¯>~ýÖ»šy·^³šHklÒÃÁýžZ#ïfàÀ4|néi¯‰hNåNɉ‡3&‘¨q*wÿÓ‡p5û1?T'I¬ÎÞ°ÉÙn äl²ÿšõ¼»ŽÈ’® Œ²:SXÍ"vQÚuv~S³‹ÁiɘÍ?ÞåoóíDÔ Ï°Õ• ¹é’R ¿ýáE`´Ôß àBe·ûJ0§RìèAᳱ̇· ÝAØ¥QMm_LÈU±1àp2{sM¢g m>º‡9“%}E¦{P¨Ü#¹Ž×&à½Ô©Ìd8 —_Àá%9€áT{¾bò8¢!±àV¨[“*ððo ýåã{<Ò NwÙ᯸g&ã¨WmÂÒ=r:›?¿ 䚯^׆ÃÛ‘ê0Ÿ›P1Q„Û6:šVnXðo7âUvi9Þ×P0h–ò†YB¢ÔÉ®ïg$q€6\]r:{Níiõ¨š^ሠ¡b¢•Y‚õð‰ •pï— „NK‚›w< d JeòGâ¨ßæ¥}LimïW¶¯è ì  œ‘ÄÚj&PÇäj?q$<ëá*˜±g<8Þž«‚ÓÁÎ%$ŠO„ëÁQ4„£8J­NcÊÛ‹uÉ$ŽúacLi蚲ୠ8 (!ß qqŠênýòM,¸ Õ´Œ†^ÑØÑýCXýÇ‘ÐI¿Ø3Ú³.ß—:â°H0|Çœ7€!«ÎH§ƒKpŸ¨X´KKð¾šåÈ‚·‚nà, „|qìDhP…ú Ž&NQÝ<4Ï‚K÷¨ÑÛM0#|,ø;v ËäFûWé‚Aü‘wÞy"!žëö\Ç‘*BФNˆ#è jî€&‘P›4blf—8Çm†q\ä‰o–lÇ‘fùÙikÉë4sf´ŠÞ)§jw6GÀhc/Ó¾¸Í‡Âòù‹S`ã3†ÿbÞö¯\}(fU(@„"ÀʇQC;¥®EaT © [®Í’?kÀq¤Y~vÚÚ²8‚ã’X²Ñ*é–¹¸hpþäÿµ’:…êÈ5Õ5ã US‚sìMn6&a ¢ f€mÈDcÎ5@ó(Äæy€p[!¸Ú?¸o#å_y‹Â#îSRÆ8)d¡AÊÀɼC4´SÚQãŠeÄÅ8-)¨ãHKŒí¢ÙeqD³œôOÉ…æ(YµEä¢s Žô/šgÕe'ÊpÓ&RÝ×$œO`K*ÌOhsg©Š~’áÅ %£¥GdùÐ,böÆ(±Žq‰üetº©!ë_å>a¸.±‹ÃV%taB­*èTýz\Ó¶òrË¥¥¥AÛÝ´Ý~G°|ûÈn¥…RÖÐÎ-ä‘©‹Tó®õ¯æ1»o³™ðEª/5Ñ )ŒšlåàȨì'áQܾ۫a¥èÔ¸Ì3Ô°ö díÜŸíßð¾à5)ó"3R é/èÔq¤² KUì'Žha/üØLˆÍXˆS`A¨¬ 2óÉå`ËrB2€(°WfÍÈ #c!†Y¥ÙYáb˜Ëÿj8b~²P8)Ït†&ÈiÐÐ6ïåiÔ:Žt£ýÄ‘ R„¬ ]å<Ž˜NËÓFAë_ùù ¡Êˆ…#¬)ÔÑ­bÉç³C†+Ä0N†°âÒ¨ÙdœN5äxëù‘:Ú5áºËæGŒ>ó¢íNhäRkí\2µ «XTŸp)Û2¦?ҮבV1ŽÀÀÌHÀNÉCy%¤BÐçÚ3%Pâ86”!' ÁD*÷ï˜BO$,œÞçJG"Æ2äDŽ#ìËbKIÇî½€Øzd§ «Ýed›XYǑĒ9ް“‚EÐØLz"ô`f­Še­tÇ‘„%3Ž°Ê»kÝ®©M‹äÑŠ}wláMXÛGrèá{°bSPNëàAûR“ÿoòÛßýûïø[ªVÙÂ?_ø¹U9óܾe[¨\ž§™IK*QŸÅý‘Ø °=Ñú#³Ì ©eí aðü-[qÌò?ÜõCP#lÿ÷ÿñ{¾cV¯_Œ#8]e¨€Á—'Ÿ|r~~~aa¡„DSÔq$Q”'$Z9ñÀ‰ƒ+–5¼¶qä×ßøu§~´ûG|ËÒY¹rC,®É»*jVÈòÜÑçTÑú §ÔH‹×o ß}‘¹ÆÇTŒÖ7 ‚[Ôª(›viQ,l”`»D)ë…#P©´+ð!Æq07„k<‹Ðæ) àEˆCuþÅ• åõ“Å2†#jßp ˜j„]Ë7¦TNâpbÓÊÁÊþá  ]‹ZeÓŽ#-Šærà`S8b±Œ¼…!öáˆ~ʳ†:–gUÔ#lÒµÌGˆ8e‡É®¼m›·Á¢C‡ E“Dó#-êSÄM÷GæææöîÝ‹æEõÁ3çÝTe lT\cídSÏ„6rU†Â)ÆóAäà˜ob‘nªS>Õ´œÿÆQ’j%Þ< 8ŽDŒYÒz‚#d"F½Åv‚÷ÿáþáCç¨U‘¿`™Wa‡ ;ƒ#€!—¤G¬®ÂÛWb’wì[a€T qÄ´2ÇÇ‘„8Ð"©§OŸÞ½zw3šgêÈ)PÂ"“1°°Kg,‹#‚Œ0ÛBû`n §@¥:›åÈp8þ(î(L-ÊÆ›n”=ñGåIc‘oã%­âˆ­àâ’X¬a©“L¼cˆ.»dÖkŒZ«Ò¯d­-q­4J…/oçãEŸñÚš(GÚe?/Ä«pV@f_|fÓº~UD©P!ˆvyhg‡~bñÅð…û¶$¬¥H'¿/^{R2Ù\ÅDZúëø€Båk—ûÞzWpi—ÓL¹L¼ã[×ô”œ9&Ñ'hÚÕ˜4[wiWn¼"·[M:Œ9R\äñÅvYï­wÈǑ֙]mkü˜™h1°Õ_0ÞºæuØãHëÌ~úOäÂ$jðmÍG`kë|÷:ä€ãHÌf3Ý÷6 %<éË©NS¸s¼ =›\Ž#]ðžmr—Ì^âG¢Ig>üµ‡»`º÷Ñ!G:bö¿ýÏ»aí ÍÎíɵöwçýÝ'ö}"‰v‘çntOA’,å82±ýàŸÀùFSòªp^Üsý×{83=ë°KÇ‘™tÅQi¼Š7¹$áPT#’„ÈÎټ̫“Q²{uéÙÞS4¯ƒê«c‚«Hy5úÄøëwÈÇ‘™=¬«þ9&î†LX¥&ѽãÈ$¸>Ì1áuY©? ‚pÀö-ÛÝ ™¼VuKãH·üÝoÞã5«Ö𮹠G–TKa4U‹]ÿ7ï8ÒéJ–ÆsêÔ)¦ß¼ŠqÀq¤?ʰ¸¸8;;[xŸ¹¯¼ôG&1Ç‘Ip½…>‰JV®\Iæ•vÊ6ï8R–c^>ÃÇ‘ž¨‚DøTmGz¢“†ãÈäxßhÏ5‘ ¡ãH£¢˜ÆÆGú u j%eCÇ‘>(ÁDÇà82Qö7Ô¹5ÕBÇ‘†ä0½Í8ŽôAöÔT mGú ƒãÈDÙßDç™ ¦Bhã8Ò„¦º Ç‘äÅŸ j*„6Ž#É+Á¤à82i Ôî?ÔTmGj aÚpI[†5eCÇ‘´• êG"BC$T~¾Æq¤! Lo3Ž#ý‘½ãHd™ÚHGR“ØhzGú#ËÔFâ8’šÄGú#±þŒÄq¤o²¬0ÏT`šW 9à8Ò}ð¸¦?²Lm$Ž#©IÌãšþH¬?#qé›,+ŒÇãš Ló*×ôS<®é§\S•û#Õ¥ôúë¯ïß¿Ÿ¿Õ›(SóÕW_-.ÞŽ;vŒ‘†ŸÃ‡?õÔSeÈ÷²}æ€ãHuébØì@_Ö¼«wÔ”%O GèúŠ+®x,ø€#Œ}Y’»7?GªË¨K‘/0AÉ÷Ž?”ø{öª+Pj:ŽTfˆ#ï¼ó³5mñ“cº ŒØG÷Ÿ}öÙ°Kþå&?8q‚Fôu±Ò^xA÷¹ÆG`eòt·× E1 _£Ö:U2 y4ã€Êgþµ†rƒ*´ ï ­R]¨^³G*±í•Bá;Ç„À A ÿ¾ù曲®uPm›üÄM«"˜à_‡ 'NHÆbé!!ˆB(‡lqÖÆÂ05|~Ò¨~È »Ÿa`&¦SŒ·£X]¨^³G*±mŽ`؆šä>È @æÄ}ì!†T…ŸðGŒ¸‰Ç5µð…¢ÖÀÂ|%¡ª<¯ÌXdù–T’/F1 ç¹!0£ ° V X]¨^³G*±mŽ„9WMÎf!h&¢ÑDMûÈÆÌ,CÊ¢ÂùáB•È Ç"O*?Ú†f ›O$‡%忨VˆP£X]¨^³G*±­ ŽPÖÍê‚.0HÅ/á'N ]*ùaf$? mòÀ1Gò@V´kº¶ê ¬.T¯Y‰Ž#•ØVGÔéÌ@©þe‚ -*¤#c{Ð’‡ÝežU© KZD–'lL±'tUŒ?°Žkº£˜S ¬.T¯Y‰Ž#•ØVGPwK:R¬‡Ò„šZÃPÈŒ$~QÈ Í"2㦅ucâˆ\6e¦õÉ ‹˜#4QVª×¬ÄÇ‘Jl+ƒ#‡¢ = ù&Ø?i-C¹Õ<ŽÈ„¸Ϻ¯Æ¥´…ü†Ã‹V^ câˆù\j!ãï5†ÅÀêBõš•8à8R‰m¨î‹Ïï‘Çl…v‚(‰`n¹:@Èm†Š¡ c}Q¦`~{q DfÈ6â!IÐa‚eFŒÎÌXòÿ†-72pÔ7äL« ÕkVâ€ãH%¶EY©=‰r¸NTDp‰H5Iq©É@¯^™Ž#•Y]EÇ‘èD259ŽôGÔŽ#ý‘ej#qIMb£éué,S‰ãHjséÄú3Ç‘¾É²Âxü|Ö Ló*!Gú£¥âš—^zéÑ?}fggï¿ÿ~ýwêÔ©þpÄGÒGºâtûý”Ŷ‡æ?GŽiŸRï¡opéDKáȻヒ’ǑӧO÷‡#>’®8à8Ò§Ûï§Ž@ÎÒÒRGV®\ ¾´O©÷Ð78ŽôG¢eq„IG<¨é6t;Ç‘nùÝfoeq$ÚxPÓ¦|úܶãH¤[G2¡5ýQ…ÎGâ8Ò9Ë[ë°Ž„¡5­I¦ÿ ;ŽôGÆp$ m<¨é*t>Ç‘ÎYÞZ‡€Â[o½U¶y­ÚxPS–o^>ä€ãÈ´ëƒBj¦]êßq¤ÿÒ¯­Ðƃšô%9É8ŽL’û‘ô}Ï=÷øö³Hd‘(Ž#‰ ®I²ß~ûí&›ó¶¦Ž#ý—ùo¼ÁËÂÏ+¯¼Òÿaû;ä€ãH‡Ìn§+ÖhÀž÷?v×±½ó{õ¹`Æö¼o˜Ù07;~wÎî wÄÏÏÍ«ÖâÇ9:àùçŸíµ×Ú!Ö[í'G“+1¨ñä“O¿÷¸ðbͪ5`ÄÍ+n¾mpÛÒ€Uܳߓƒ“ß|{Ìï݃»UëÈàÈÂ`aþ¢ùmmhæ¶Ï¾õ0ÈšΙ3g㔓Û!G:dv®p¾~âëÛ·lŸ9ÔØþþÅÁbY¼V¬Ø=ƒ{îܲ\;{íÖÕ[Á,`…•ϧÔd?«:ŽÄ+WÖP1>wÇçÖ­^‡ƒp`pàøàxY,h°<>°²{õn°laï>™—xÙç”uÈÇ‘™=^WÌöH…TÅÌÊBŒCƒC''„ƒFš::8ŠODæ GÉ£žñdÛÛRŽ#‰–Œé‰NlšÝ´gf©Šo¾ÙˆÍ·Ú.ŽQ ‰›ˆ¸é¤tÈÇ‘™=º+â—«7\q°TŠ´UŒ(Õ8ÊÙ%¡ís¾56 •ê–Ç‘nùë*ÉKâ—$bp!5KeËú-Ï<óŒï‘°nuؽãH‡Ìþó®@nI ’¼,5óÇ_øÁûVíÛ¼vó÷ŸøþÄøëwÈÇ‘™ý§®È¤Þ÷¥û@nã…Ê’¾éý7éøöÙ (Y·]:ŽtËï÷ÞûÅ¿þâò‹/¿uÅ­•í3­ŠD:lŸ=røˆï:éZÕ:ìÏq¤;f“/X:²tãš#\Çm›n?÷öë¶_çŽIwÚÖmOŽ#ñ›W^våá ·m±Ñ¶Ï ñÕë¯~âñ':â¸wÓ!Gº`6)Õ¹s“ݾ° õÑÕÅ)ë‚éÞG‡piÙ/¾ðâ®u»ÝÒúà”ú«C¾*ܺæuØãH»Ì&«zÝÚëz°1¤Y@¹óÜ;?±ï%í*_‡­;Ž´ÈlÒŠdD†b^‰8-*_·M;Ž´Åo¶º_µåª)\šßs!Wâi×¶ô¯ÛvGÚâ7‡Œq>ÐøF5%y$ÇŸîkK;l×q¤f÷ÑïÞòþ[¦JšôÛ6móDI+ZØa£Ž#Í3›­"Û×n÷´È˜€òés?ý…Ï¡y1x‹rÀq¤yfs§‡ŒiE^ p|‰Ÿ„Ô¼"vØ¢ãHÃÌfËà9:”âOñàbÃ’ðæ:ä€ãHÃÌæ0‘¡çü|áç¿þƯu߯Bã_nòS)«ËVãá·~›5I*U3œ*¼ä¼aáysU9à8R•s#êq¨úЭ«¹j„þ»ÿwøi«{îès¿ÿß-i‡DQøG»4NË”aÔ ¶€Ž’D†7×Gšä4K˜,d›:ædÆÇ,B‹q„_å’üæ‰ßpMù°¯À¢  ÑS€#d”È+# 6æpTýüü¼/înÊ8Ž4Éço=ò­[V _î ]s@†â~‡" ïmþžY&7…#˜âã3g,V‡¨qúÓ§5°îú!…©%¦Ù0¶R_üÍ4H-ARþ'5’Ǩ¢. ;C?÷…#´&zò_œ8\¹a|Ø›GšÔÝzm9ŽÔãßŸ×æ¬fŽY-ðG•0"ƒ#fojUþ…P ì'åq„8"ÄšâûÛŸü6¼©Þ­/ G”[1?Íø3Ò‚Z3W(¬¨vô)p‘x-Nþ¬£<|8Ž4©² µå8Ò#ÿÐ ï^àØôÁàeogž;“ÇÙfŒ¹šÿ‚yã€`Ÿ†,ùªáˆü¦},cˆ@IÚçˆ Êã_¨qî!P˜ûô¶Ã¿ÔÜh 6 C0ÚXø‰Nõ/3™æWvm/Ö*€Ã¢›ÌûÏýßIqàäÉ“K¼ÙµIcšâ¶8·yÔ‘«2uþb¨2*ì-ôGBc–u ;4“É0ž^,*136»•‡’ñ&°ó}€‰ `ÉÇ s4j$Äó•2.Ò²ù±=ò€J9;;¾Ì<MŠdÁ?Ñp€÷8Ž4~ãàˆ¦âH>6 ±cQƒ|ñh-L¯dÌØÀBåùª€P ïКâQh½X1¥Eô¯eR+àûnØ}J‚×’ŠçGšÑÚæZqi†—£6˜Út¦ tsTŽCþ88RzŠ#Ê¿„_s@¸PDcQˆ#™ZÊûÖÇ‘0®ÉÈc( 8Ž4£µÍµâ8Ò /Ýuì¶ÁmÅùýjë)æØŠŒùJa(Ñ,ŽXÆÄ€C+,"ŒkKˆ(±šÁ2‡Öe,tª#D.ËŠ!Ç‘eÙÕqåå×1A‰vGˆÈÛäÆÁËtŽ„©J°#³²£ô§Ò%ùTeÞ—ÉÐOO„‰[eL¶ÐC%e-GcBC&a<¦?BEÁbþK^‰¨p|¹(–”¿–—l•Ž#Ͱ—eK/Gáˆâû•ù\S}xSÑ„¥!Â[–ºîK-[:É Ž2ÛÀlV)ûUg ˨Yþ ²¾t?Ì„$Y_£ˆdß »ošƒ·2!8Ž4ÆøFŽ/ÂÃ,©Ù*^ɨ}\CÁkœ›£ú‚€‚í§?ê´¸AÞ•åo·iL 'ÔãHcŒÇßž¿h~ö2ÆÞ¹Çë;“74!8Ž4Éø-ë·pÌ—ÃÄøyÁß&eàmM‚Ž#Mrýé<ý‘ ?2¾MyIwFšT¾‰¶å8Ò0û 6¤M9jd†ÏÉ#¼$,³ý¬aaxs]qÀq¤aN³$yÉì%~Dë² ypæàÃ_{¸aî{sâ€ãHóŒçMz7®¹qYCšæ¼—cϵ{ü°øæ•oB-:Ž´Âø‡îhqvqš‘¢`줢¯ØzEþ €V$ávÂÇ‘¶ØÌ ±?³ê3%ðšÁ¹s~F|[j7¡vGÚbêàÅ~{+ã|íìµøe¾:Ó…ªM¨Ç‘ŽÏTÌ®{/Ú;UŽÉíçÞ~éºK_z饎¸ìÝLˆŽ#2þ§?þ)Ž ïÇî·Â莎Í9|Äߕש†M¨3Ç‘®cò…ÏIG½§"uˆAxEÞö-ÛýÔ²®ukrý9ŽL†÷¬}òÊ›5«Öð¢ì¡oóLM8ÙŒTâïÙœŒVM®WÇ‘Éñþ½÷ðùïûÒ}›f7Ýôþ›’Λð‚t<,žQôTÈ$õir};ŽLŽ÷ê™HçûO|Ýêu„l²HÈa_þ§½s\¾ï.›¼&MŽÇ‘Éñ>×3á‡3rÎ+€Â íCÜ¡ª8 œÛ„?å[Ë"Ò¡ ‘â82!Æî÷@a†?oÅyÆë," yØÿ²oÕ>¼NBädfw@¢SÉä829ÞÑ3gòfB&ÿ…ÁK<£ÞþÙF4ÄÊ ØA¿¼R/‰ý/Ï<óŒ{cÈmêŠ8ޤ!r&ÿG}”%r™¼5ê¬S0;‡…þ4•R!ÙHÑ&Qg¸Ó +/`ýòvßÒž†¢LˆJÇ‘ 1¾^·8ìÎÀ H©èMÚ?à¢/ˆ /‘qdpÄîpa%¹À× :É@Š6‰ªüEõä3uµGú#rŒpчDЇÈ€XüØ¢ÝáÂJrá¾F”`B#ù¢â… endstream endobj 349 0 obj <> endobj 350 0 obj <> endobj 351 0 obj <>/ProcSet[/PDF/Text]>> endobj 352 0 obj [353 0 R 354 0 R] endobj 353 0 obj <>stream xÚ+ä2P0PÈå2µ4Ñ372s`LsK# ÇJgp…+äqÕ- , endstream endobj 354 0 obj <>stream xÚÕ\KoǾóWð·ûý8*e3õ (K2 ðÀ6+@rÉeÙ ‘EÉÑLrN©êÙíêªÙÙ%׊CC²]UÝ]ýÕ£»kFïÿuOïÿøß_¾XürôáÞo÷>¸aöÙ?þ|ÏÔV³Ÿõ~òIi—÷ï½÷™Öö3m쯎ÿŒ¿/€ÉuLFÛžK¿ÂÇ| ?þüÏÇ-gø¸ZlÀŸ?6®ÆÍ­¹þöl!Ä´?°ÙüÿÁ¡òyY“•-|˜ðÏ-z² ©%4>WT±…ñ“®õëÖvZ'OD¤¤Šá]WÆï«B^óŸÒ~V¨=^ŒE8畱kÒë’0†¢|ŒŒ±.Ô·„2•“ßtR.•³ÔoôBý~ñ3 XëÑ:¨³ ¤l Pʵ+€ðyÚŸ7¾ÓñÄêJý­-á3²ë‘ë½*!²ñO!wZuU À7Õ}0Ö[£³¾£«Œ×Ó8 æz²:ï ¡Ê"¢(aÿ9! IE' <%tɪ”RO8;S´JY˜Ž »•·*8Æöœ™µAŸE êG¼Š9ˆ„Ô[ Âr ‰",*ÌÛEp[°)_TâjŸ˜~3’ÙcÔ¯´f«<ïoÀ»:¦”'mßâkiì†+ïRj6ÍóYcþ$={ Ãäà|2iù„9ÓôÂpÃöÞ íO;Utªô÷®}tçðä£{'×~w|xûÖÉá­{Gø›lî|yÐðcÎ 0Ï[~G8iú=Ý´í÷”“Æ/Šü–IN%mù¤0@ž…‰Í9¨|à|’ˆJ'+SvnŒO™²óQYãdÊÎd5oà ¢ É ŠƒÚZ !½â ØÀ8;Ý”  mÜtåÄŠâø/é`¨xÄ¡Î{ òk^ö¼uJAô†_åET)†ìqlÌqÂJ´Q&8ÃXÑ ˜¢b)½®Öô¢éæ›QÊ>$Qo]¿$³¯Y·0f²Ür 9gsǵÛÙAb”§«Üš$—û}›éBÁ}8>šì'?ø˜Žè !Êvp`Ñ«–†>k|Þ\fýí)1 9»¶“KÌg켃d$H0 ÌÝ»€û®Í![îí2¥, $.0”?#á+ ´eßó•·XÍœz3s¼×*2e˜Pš©+¢åÛUoË6óO"³ ธu×hΰ˜üîx3Êüf¸ãM¹CX6­Îû ‘ Bžüüÿ@ÃÿÛLÞ8¥caÓ’¶zÌíùšKY™/˜µz€_±Y&Ë¥C*>1òés9¦!ˆ!ŒÞ/BÚÉÁÑÑ Æµû·îÝ¿sçöÑñÁõ“kw' ™&˜Íb Çè‹IÏè:¾n¡‘Üd ‰I™5P+1™áÝ»Öß <g¯¨+¹§©¬Í|hóclÝôm<´Áÿ½5Ÿw©ÎÄò$H"ü„ꪽló<£ý´9H½æ“Ò<Ï…,"~ŽÂì–iB‹'nWG‹vk?õ2ѸQ:A¾#‡…^k•cîé:ÿ¯#l&ó¼Vi'Ì Àž\J­_s³…´39®~ ç#¸Tï×@ë-!Ç<ÖðZùƒ—{žW¿}×›¬F“Þ$'ÁDÕg'p9‰ 1ÏIp[[ s±ø^Ü¿Ö®Ô Ç«gjœLMå‚–µã”«$ãE{œµP†Ð0ÿš=F 640ŒíŽQ;®ó[:¥UÈ}»X…@Ñø´íÅ|š‘`çØÐgÏþC-8ŸòDDÅít/!’óˆŠçü™op¯Àƒ*ÄXØ(²ÞúäÚÍÃë'GwïÜ;ÞôÔ!Naë› Ê4Ñéø+º"XŠ^òÓQšµæÄbû<ÌZð1ôýÍâÅCå ˜‚KÔÊ$#R hIE™Ò_-&AÇn,k7` °Yôi[´P®Â¥=ÆËF‡Ý—ANR]M×õfq l#ã› YÅÙ “K!+Á&Ïü’A @i6œp~|pûþñÉáÇ\?¼v|° Œ¬U,cKQ®w £®ï9måŽ óÉ™Ïo“Ì' ü:¾I%¥s–É%AR®#¿$Œ¼Òt¤#ttpíúÉí[7m! Jó[g=”ëršÛu‹8*G ºìÔyØÏú˜wG0nߎrM‰%bŽ"§½Ê†Ïûr(‚Ô-w«xugä‹/¶DRÇõî‘Ô`§É{•Bb}Ì#)*ìù&‘ä ƒw2¹„%ô\õ—ÄÒ°{ [ã’”qŒãº7 H‘¦IpáÍ ¡—äPlÉGFV5ðuÓZw˜ë)aÇcáã¡\0`aYÇ€Ðó†–7 F«Ë@zЧO.ñÑÒcÀ@æD«ƒWü´¨¸zÕÔóð0«!*e®°óÉÝSЇÕÉÈÚç÷Úxt›xFþýÄEd JG>ÔWüNV4*îä ±÷ž+ê»ØÄˆ› q)O'tCÌ·ãYù¦º~ßµGw«Foâu?Å•û5?¥„¼2:ŸÐôì9­±\]_ÓKä!YŸ“E€¯Ú%…8²`Ûð`mOêR²WÝÑ\ÇÇ>n© dr©0êè)©Q­¯#bÂ$ “ÈB”jÐõtt¿ÆÇ>Ð2!Øëx>!ÚuÀ²8ˈ>¥^ŒÝL¨æu%°ßFdôSy¯/C–Ë{D‰pø\Áø¸['‹OåàxÏWƒ‚ àÞ÷“¿}Øÿj/x]w~bƒÿ j+HÐD,¾Üû|@drR±$èdñÞßøÅd -¾Ò,D `Ë^ëY ôñ¨Å(SÆC—Z.ÚÉ|V-¤¿è¡u¬:l)~¬¹¹h‹¯4c9C˸?L °Œã1i‰¹ŒdÉ-ÈE[L¥ËZH@aè1iñ.Že‰-È5jÁÂõJÓä´ÒV§Cèõ— g7–%´ \´%Vš±ä¡eHoºÇËßcñ‹ Þu &Xl¿£èzóñšp©°%šUËW«)Nk©\¤Å±¥ÉÁþ–IP}"ïr….ì»u1n¯Ú4ºŒŽê4Y‚z¢‘_¡÷qqÈ«;òÈœ½Ç{[Ö÷4ÎâåÞïSʤR‰Œò&bÀ;h®šÏhfv^´§š˜Þx.“^ÞÌíùš|J‰ŠÊ\'dÂ]GÉ|¤7„<V)rµZ¾wV^Ë;4O)µÜ†ÍgØ×jÙøn Ö$`NYèÎ5lñjîGp‹Å¤ÈED‹]´¦cÁ›&ç‚$ÅÒ¼¡éèkán,wÊÛ ¨óz8ô¥Ú+{©`TX¡»‚‹E†iÔ«…Z#ÇåÚØÉï 8–§ ]!‡ÃS„°Á8‡É¯ GZ½éº~Ç%¶ã×£ÂI/†–°Z¥µ¤OÛë/Êýö…/l>ZLð—îeB?“‡ÛUÏèPøð†:Ø`i>áƒõ›’Ž& i! ­1Æ$Ïó‚ó)ÝÓÒ‚²‹^rv0ª<;*:wH˜bÏZÓháÄó6¼§ËS‚á¼í}ÈñeÏÞ.ƒ +Œš9Ö ùHQ2ATÏ <(+ŠzŽgtÏÁví5Qºâ¯>ØXØ OÍodqØ~KÊÐrU›(ÎÙ—~„÷Û Ì‚ì/ÜÒ$ÉÞ¹¼Ÿ—_ZúAßôå€h PGF'¼#”|-Ð’AÒoÆñ.A”y*Ž’.ì“V9u1õÒ‚ÏÃV$¡¼| ××ÐeñŠÕî<$r¹W ‰‚¼Ÿ4Ô4ȳ~/gBmñ¸¼ ®BºE|s¢4vM¼‡uëЇw^°Wì)™$W_*%R%Ç¿žR@pñ*Å õmÚ@µ8/ˆ=Ånñêæß¶À.&…ã›Ë½¾yïßóú¹Þ¹üKà …MALq-Ê‹‚£ä(¯Š,±Cy„ÌKœöÓ6a]b(—ÞµµŽ¶çØåÁAåÝ£œÉÝåà¨p82è†w&y‰WgiO ß38ÜmJA¼P3:hó€,’UýË{¥Xi¢W3(¾$bnÓÓMç6=åtn#Êäpn¨Äc&[vJ&÷оwvœWK›;ùæ!y}«ƒÍ’Çâë™?[ó`K­‹Š¤‚kGKÍä^q©gÇùó8Y鯹™§™Û=_ Ùóttk”sæ-;K $_ŽavÖÙ Í;S½ §mô–®Áº”èØgê ,OÇ#|L ÌÝhßÑM~æ'ªì’¤±Î ŸÑ Í+UÖÒØNûúÇhê‹VNƒÿâ00Ræk®Ñ¥Û!“E8l1ô:[Ÿ×ËoC.Iº/èXWßËYÜm? ƒïY§õú’¿žS€Ãüä6PÝ«ï{ÛÐ`ã–LÏ;g¦@dÂÏnP¶m¾Q‹_Ðp½€©/Ô¬>aÝ­ÿ(ÁèÓíóâça@¸Ñyæë0J,Cq¸7†˜è› Ÿ.joïîý¹†©ÇðLC1(Þ—Xú‡®U~ݨ‰.ù¿Ü{°ÿ'û_Ê*lÈ endstream endobj 355 0 obj 73148 endobj 356 0 obj <>stream xÚì} X[E×ðl dö-PB! $„n !´tÊÒBmkH „Bè¦Õ¶ÚŶÚZµZ׺[µšºÖ½j]_«u©úúºo¯úZ÷}ÿÜ{'!´ú~ß¿}ÿ÷ü¡sÏ™™³Í™3gæÞÀ-¡$ÄôO¯rUDÞ‹>!zÃÌÆ¦êR@H6¨~ªwÎnÚ2ðá­ÉÓ¡n™ÞØ\ùæê¢#PoB(º¥Ë=Ø"àÅ Rwõ¬î<Ëüó0Ô"ÙÙßÕûÂÆ†D„òÏéU5ÓË›>@¨x2Ð|Õ?àé¿iù BÎ"ЙÙãkw£ÖŸJš1úw{Ü/&ÏÛˆÐ" ¿}…_×ôì¬ç¡>!’Óïô?òhùJ„NíAÈØ5»©qÆËO\B;_y¥Ý @û lß üãÚ{Ýý§¼îüê /çŽež¾„«µ—!tð]ðÁƒ•ŽF×ióvý¡û/úyÓëë•«<]PÿìÙÕë^Õù÷ˆÏza ôëúܽžow]z%ÔoB¨üÛî^ÿ*³š" üñ‡êKLg¼wà„3ý$ø^‰¶ã‡A c -ÎGàÀ'à2À-øbÀ/Á÷~LB˜L&ˆ’.ò à¿’_!¿QŒ0%”"J7²b„Y s"滯 ÀkØÀkÙ‹€¿Ä^B„½ÌŽþ*{Ú_“•€%ß LdGÕh6j@-h1ê@=h­AÐtÚ….AW¢ëЭèt?z=‰žC/¡×ÑÛè}ô1ú }#˜üÍ ®9(®3P \§B?Š™@A6@m6š‡æÌEQ1´–"/*@À`:” Wª„«Ue×R†¦Cm2Fy€g#=*‚ž|à'h×:TÏ91R‡•D(™b¡­*¤…†²À^3Z€¶†Æ{ ºíC÷¡#è}ð¤‹U³éàË™l›  Z.A{ÑM(€¢Cèit<ò.úý€VãTœƒ ¸WãZ¼wàìǧã³ñ.¼ß„ø ~¿‹á§ñQ°eŽÅq8'àDœ„“q ð§átœ3qÖál–‹Çáñ8çCdb=.Âq1.-FlÂf\ŠË`v1b0·ƒ¤”3^¿‡ÃÂ?†Äp$HQ*¶°ËO¨ý1Íÿ¹V ¶üoÙöïáQó8Œãþ !ˆÄuJÛWô Ì®Ï24®ÇíïCÉÐ ¹RÈtâU…þLˆÝj±¥ýT…á3Oè›ÂF¹æ…°¥©rˆÕH£Åð«h¡h_$”tÈâ‹Oh‹DL&Æ“¨ñÈ'Qc°_9…œ)A €‚— 1²µd¨Þ c÷öùt•º¿N7Â?õŽÙ3 Š6!î/%ÄðÜkoˆ^ûNôZ¼`g•«Y‡–4ÔÍÑ¡ëšféІy5M:ÈhdE‹@)Ø&ã£VÂx£ Gó¿E!ôÇü Õ¨ ¤ø´0a  'ò$ª?ïÑv¸ÛQ·»s  øú†zÑš~áºnp¨mjDÛ½}h—»Ç?ˆ.éöúÑ•:ø ë{ÛûÑÍâ5Ðãír£{: »…ëcbËÓý}]… ZEÝTœÛÂU†+Å«J¼ªÅk”x•¼#^5âU+Jc£8˜ÑBˆø ÈÒ3!«/@m­Òαòè¥EowÇDÏ`Ș¢=x¡yx“dÞ.õã¤vÒÆa?‡×pøœéyÒ(Y½e&'Ký²ÅŒX%ÉUì– ²Ã£Tãp&Ðß¶Ä ì„@Þ™]ãO„û“ï]7·àKEØŠ/á|¥OÁ׈p!¾N„‹Å|/ãÔWIT`e$x2_Á¹÷rîë9¬I|5§•$\ËåÞFqc—ãù`S+H:/éÂO2ìe0ªH1 Ì4¬j<Ÿ*΀íFëD "¼Œ…¾z¾ŽN‚ÏÀ›¡º´*ÿC/íã^º™ûV>ÎÛø8ïࣹkŒ—náÔ·Ÿà¥ýœ;À¹ïóÁ1^º“˽'ŒâÞ?ñ’?)Þ‡où°N`d—Ã|ƒ/ÅË`¯îÅ}؇ûñr<€aŸ~_Xà±Q) ñ"¼ŸŠßÆïg*d¼%ØÛp;ìõ܉»p7ö +븀£° WàIx2ž‚§âiØŽ¸;qvÁ©a:žkðL< ÏÆsà Q‡ëñ\Ü€q3n‚³Ä^WâUx5^ƒOƒ“ÅZ¼Ÿƒ·â ñEpƸoƒ…á$¶mCÛѹpªÙv¢óaÆ.@¢‹Ðnt1œ_öÀ ½ ]Ž®€óÎU°6¯†õz-º N4ŸýáhâûñC0æð—ø+ü+þí{$gà3ñ:¼oÀgÁéh#Þ„7ãsñyxGh$;ñùÿ%#Á@»P%ìß3Q-d³yÏCF넜ÖYmäµ3 ³mâ§ÄÝ S:'Þ Ü³¡ÔC™¥ÊR(}P|P¶@Îf¯AyÊâ™#؃ñ[P  +ÖyÊcP‡ì¶Ê(WC @ó»Ê}â> ¬œ‡ka­l;…-d‹Øbv*[Âܬµ³æa¬‹u3/[Ê–±ÖËú˜õ³ål€ 2?b+Ø*¶’­fkØél-;ƒÉÖ±õl;‹Í6²Ml3;‡ma[Ù6¶ËÎc;ØNv>»€]È.‚±]Ì.ñ]Ê.c—³+Ø•ì*¶F{ »–]Ç®g7°ÙMl»™ÝÂneûÙmìvðÄv»“ÝÅî–|Âîg°ÙCìaö;Äe±ÇÙaö{’=ÅžfϰgÙߨsì{ž½À޲Ùip/u î¤^ïlú_ŠÍëÐõ97BÝñs Ü]퇼î'ÀŽyºÝîA÷BßûçèAôÜ{=÷Ânz=Žž€;±§àÎãô,úÜ“=^€ýÿEˆ´W ^…h{ý½þÞ„¸xîNÞƒ;¶Їè#¸oû'Ü«| woÿBŸCÌ|¾D_¡¯aÆ!zÐ÷0Ó?¢ŸÐÏèô+ú ýކÑ„ ÆS¸¿‘a9ŽÀ‘X•Xw;1X÷%Çñ÷øGˆx´ù¤Ùõÿ$Bæý·‰‘ÍÿMbäÈ“(Á`· öøTû50.a¿ŽwæèàYrq5d¸&ÈÂK £ O$Vát8ì@»p†/ÂY"¼g‹pÎáùx¼/Ä) sN…ëE8 ®;p&\¯À:¸nÃ9p=ƒë…X8] Ú‘ÂJZŸ›™]§dЮ`󠿇u<Ø[wpµ¨µ‰\ñÀu¥ˆ%òÅŠ' ²H¼p&1KmÂsŽ=ØÔ"<ñY°_`ýÈ©ü{ü³Ø"œáã Kob…{rž˜ÍâÝÕ88Àw“a›‹àtSãŸ(‹ðÑ…¢7ôⓦbÑ%¢7 ¢7„g7 û‚¸;^Q‚\É’D‘"‰S0Ø ÄgWpÝ.ÂZñl˜\¸'¨wÁ›"ÖÂnì<û,ˆ±ðpƒˆíç˜æP ëæÈ& ùY•À½•pÆEÃ_ʆåeâ3œ>\aWm;å²SHsýüÙöÙGÝoaTŒíj…Ò2{¶#¢kQÇ’¡!^¡¶tÄ-±Xâð.ÓÄ-‹¶G ¥Ð׫LŠ‹Kr8 §d¦WPh± …EI¬pJQQDaaÜ8ôG`× ¯Æ®Æ{±ÍŒV{« D—bimmˆŒ,,-ê E²¥°°´¡­M¨)£R,mr¢+À¨ä­W'—¼õ¤%kÇÚJôHkK.Ñ Xj²æÈa ÄÚpÉ­Š-¥D 8dÒå­Ã£W`Ó¼zD`Æ—Ö¦9¬ÇÉÂúm¢l½^ê}åˆÑ§¡lm6ÕfkqžÕbµ”irsä ñI‰ ñò¤x¹9ùye¥VK>ÉÍ¡r©#7§¬ÔRf‘:ÊJóó€I¢ƒR#DB´™M ñò`¥À*þ…ȆürMÆŒFDEkäÖDrB¼–1ÌRRà´ñ Éy„Ò¹Z§Ù¡ˆHd”ÆEÅebʲ¡ì©St¸EÁèð—Õ?'ÊÏûy€<ƒ &OªÁŠ53ޏ[Î^=3ªL‘ž“™ä8oc~p¸ªnãyŽ¤ÌœtEYÔÌÕg·¸̘V–OdóœSdã N>eFw¤r|þÄXgŠÇ“Z["~sÓÂýPâÈϲŲ³‘ÝoŒÌÆòÈÄHÒ¤îP“‚½9ö½¶’«-1Z&)Ý’cKg©ùé99ë-¶x‹Å–´6Fyª’(JK·Émy6’Si±•Y*-ËP¥¥T£8bâr,ùqç£(•Ÿz¾œL»ÝJh¾ñ†Ââ[‹bÑ´&ÿ>yÚÇ5¯‡9^tf¦8ÉZ¢7/Òšõи¹X¿æ[›dÃâ|Ûlš…a¶-K4›¬³)fÁ¤å[¡Á"ÌTnNL…\˜»Ä,!4ä[!*¦k\,ä•ë—«nÛuîÜi;nì~ùˆ{©B>ÛÕzŽë¬õÅÞñé•yi4Û¸4B®Øuõ#çPŒoÊI™°È•Y²0"Rvv„ŒÌ¹²÷ÈðûyöÈôÁ‡ÚÖž­¹û†á¯NˆOË òH“"".˜Ð¤)ÇI.pÄ&ª©,Ò"xÑÈ16Evš†>¸w’j–j™Š +<)µ¢BXT@¦N’¢Ðf¥èssMúm^)ÑÆÅ­7•Æ›L¥qÚ¤(Si±u*½¡â3’ì;’p’Àšh)Iš–D’’Yã¯Ëɉ:Ãj· “S-´gEÅ[¬U&œg*5fŠ5AÓ+vMbú]iqhÚñiÇa&-ZS!®¯9ÇÍ%ÇŸ„5»H¿<¬.­BÛf&NÓ"i¹Ç óëÖ+ÖëÅe‘›o)ËÏ–LH&Iʤ°ŒXnN^~¾Åbµš“"`‰ sWVZLò‹ ,I˜Ö¤$9‹T" ɽ iî–EÕs;½3ô7ÿz­ç‘iL‘OT%Л~§çÒ=Ù{Õ5ç·ÜðÓŽ;׳\–©ÛU6eÚæú©õ%i‰ñÕË]›¹ Â Îú\§ˆìÖ—´ÜÚk¬Õ'kòíô_òÉ™­ªÂsϹ#° ¹^x&_†'ØãV«îS‘"Re‰.*“àêçîLÉ®P 0“ÃØÚ§GEW”–¦”•E—•)JK‹3Ò3 `ç øÚœÌŒBÅx™*º §ÐP R(2sr6+ ⊂̂…EQP†XaUlŠ,&kŠBe)>Kk×ÚuzK_¥ÅZ‹¶[¥ de¦gh wÛS4—QLí1Z Ùö¿I–h¸8:Q˜Êß¿;®_„’§¥Î9>Mœ/­MXdÉ%‹–ó¹•jUÍZóæâä9Âdj"¢…u " äìd͇IâtK¹A4À?!‹“¬×/Ÿ!‡Ü iÒb%Œ#S)¬Ï$k’°âa½b! ˆ€Zbád›ÈîÞœ ^»hê£7\w]kcçõËSj¦´MÏÊ·¿[üh“¡l?®Q4iär6ä'2"ºÖ¾8¦›LãM¦äBùf;BE™YÙTwmr´ÚH£®-JLNÞ\X_XX”X”\h.,*ƒóÁæîHs¡™ KWRV˜\”ÈJÒ£÷÷•Üd×jr„PÍÞŸ¹/ý¦ñà£ß8®c!ÛO;®£rlPJ1(Æ¡¹$õ¸eä­E¸Ô"9ü…ó­^‹ ¢·¬IIÑ„G$¤Ø âð9µSJ'ÏpL)~2žž°¦ŒË2Íת27¨YõcYùyIyMIy[ÖÈdS[¦™¦´WÿþZnÔ9úì¢M ?lŽNX„ ¢LëuÅÅC;±Ã–¾ä÷!ƒx ƒ¨˜ðl=KüæoåÝ*]t¬%ó „Üu”EO?adœ¼TNbtª(‹N'ËÎŽÊÎÖêt)Úô‹dšø‹ìQ‰)v8奜eÌô2íYv”ƒ:±à<à«ú8ÖÆž=‹`Aƅ†Hqd|1•HQ÷5ži{0ÛzÞ}÷>³nÍËç çMZTg쬙3ÔŠÝ_áäE8å¡Í×\sÁð‘ó<‹/l]ÓWyËp÷YÝ+†÷Ä FÖ‘7èú2œÓ_±¯ š´ñúñÔ¯Æ*E$U^ 9>¶åc]vFlB|*¬|yAA5űù™ù›1‡¸¥ù0(ZV’qUɰ+Õ–ŒŒ"hñ#=.MÏHͦò]n~AvvAî•©šM }¿bŸü¦h œé дiZ›ä‰ËŒï>bÖ’Òœ¤Â“Û¬†–µikZa¿ÒKÙ .Á¥°Å3Ð"¼()?V –üш¢f!£ÁÖ$Oˆ74‹teBÝô¤ôž˜8|Ûåã325UÑ%K;gëÓR"bR“J*Œó—ÖÆ–ž–—·Ž›ëÍsqvôÎ…³rê‡ßé;¼¶ BY|›9F_ùÜðG{Z$úõ-:•¾„*pÂhq‘9ŠE«ƒËa3‡mA/ìÑŠ(˽~s”&>*Jupä+{f´Æ¥ÑO`òìqY·gá,Á­YYã(’ïÙW%Ü $O·;Ec‘ï6'ê'çGi”qiºë32”gÛ‹íãõ–b{f\¢Ò-YŸxr±—YÉõùgÅÙã#òõ•íQŠt‹&îª87)N ÖEú°„ùä– ß!Kš· §}ñ!žíEL8ÂCJâyvš8s’t^2`^~1-+gEG é ë>)V¿¸ìÅcF×DÍß6ÇÒZ4~ªËÓèÐO˜uÓÇæøE‘B5qmEõâÅ›Ÿ2¹âŽMË,ýL™Fp¾¢Õ0=»¾0¯<;&)¥t¡ÅÒ>½;þdkdäÂ"Ã\»kJj¬¾£Òµl[¹¦@™s×aö:FŽÑY>ܹ~d?{YÁ¶¢ŒŽQ$'ÅS]B‚SFp²›PXDu°yjÓt1:¹œ!³ÂlÖ%Ó´ñ e ÖÈcpŒN·Ù¬ˆ7›1 ÙjV”]e~ÇLó «¹TÎâ–Ek%¾èh-»¡´ÝvmÌD!¿íŸG’1ùu²æ¸%„=GÜwþhó_¤ök"d“#' WH¾‡‰‰76tµ™Å…’+­…[.áškÄ$lø°>rå1DÚ±’±xò‹pGÔxQÇO^mJÒMêZeTA<ÏlY¦M*ÌRËÒâc g´FÇ“Ï/ª˜_\K§)sÕq†¤™¾YQEñ,¥mx8RSlRF4-;|‰=/&5U;q*ÎWßT=£b|ß‹¸[øþ° ²q!dc»ðûx=Á¤‹K©0Ù£c*Zã÷¤‘˜ª’*b€vgl’E€ö‰°Èüt[ÎwZivÈ*+‹ÕÜ!;á*ÆÏ§yצ'¥¤&Š‹ âÈ­! }k´¶ÂdNOÉJ,N*ŒTËb*¬SÌ©)I—¤ãÔôôÍʼnñÅʼn(©I¤Z½ÙZoµV¤&¦GV¨­ÎâÄ2§µ¢¬]U1œ­N«9‹KÖÒ±"c.¶› „©Îß?~_ÖM…‰gSLöÛ÷M¹I¦IMJÑ$Å@~Œµ ó¿H< ­ù+°gÓT‚{­¸:ÅH €£"œ‹ ‹k 9Ô ë:¸C [’°AkžÔ<)D H7%)• {³t „c"†ðºpCÀÅj•£ð}[±KCν¿Ü‘”Ý“›8¯¹²¯ AÞ5¨²6C›—ž• N¤Gú&då˜ó— ßÛ¡·hÇÍËPg/$§ÿFžË‹îZV—7pÆp :£ÐÖÛôÞž¦™òœØÃÃÊÙã“cò£.-Ÿ˜?ùð% ?=yR~Ëf\ÙR]«ÄýÎ÷myô5dEÚ+ÒÒ³hvJj’ÖT¬¤g¥ÔjÕwQB“´+[£ÝeÏOÌÓ)2*ÒSS²XBLNKKP+£•Bˆ(’-JetÂÙö¬\Œr³r ¹4×–ëe¥¸Ðb-»^ø¥ˆè³ íÂ#—{4)Tˆ …u*¦ÎWv®Ñã¤ø˜DÚÀ Öfèl0MÜ“„<*ö {[\œpw%ž‹¢¥’%lŸ³ŠÓ<À[¬0ù91$×ÖМžoZ3iA^zéæš™SZö.mIˈVÓ̦¨ä„ݯ ¶¡gkÉÊ[ ­§.P–;T…ä,‹‘)ÓómÿÚïm;€-ý+cYjTbKRÄóaï‡îŽ[ "[i/Ÿ1©Âf± %Å‹ô… òóÆgë²23ÒÓRS’…ç5q±ZMLt”Z¥TDFÈeŒÂ‘»’-®¥ç’@unU®F¨®ýjNIŦeçjÍ­%’€L@q³ñõ-½¼5 ×é¯ Ðñšo²mNšÎ`ãá_îLwG  ¡%;WóRZ¨¿X©Î–ìì´ÿj  þÍtë:šzhÏN“Zj¨¾E(GÞ/‡FMyvkZ5´2¡ Û5Ô[[ÿÀÂû94ÆÆZ¼Us :ÅY@ñPõû” }UŽhr @fhQÉTÀñßp\'̃ÇȸÞ-?qô®Ž¥¹®/x±cɨ¿’¼˜­ÛªÛÚТ5*Z{@¥tæ:=ʉEè€R¨ 0àê?€«§b!Õ®ŠEF¯bë\BY°o[Hn8 zâF{ Ò·‡w!` bq†rg BÔ«óìîÚ¦;PthëöƒÔ¶D¯îÈíp/l P7Ø72ã]ÝMôYõ   ”@YÒ­fµJ¼s¤suë¶B] ]×Ü*anÇ´wt{–Ñ€—äVAŸÂÙ²9ûPZ  + Õ¦Ùô5¦Ñ­®d¯N¨nݺYØ;·%¼7[¸ÂT'ƒé[]¹  „¹–V óUœ1æj:„‰pëëÚ–JáåÞ îì­š@õÙ0 0A.îÀŽ%Ks—º…!º–ê¶nóˆÃÜ. BRçZZ%5÷‚Ww® |¹MRƒ„Ž?‘7;;¢·nu ö¹;ÀrÉ^è5^û4={œ{“P“èÐhwWµò&N°@`z–Tµ¶fKs 't§0ž\wUš4ÊPËÞ ®`§`mn HèÚuÂÒÊÒráâ)G[ÛËE_e·bàªqUçV/Ùºµ:WW½uÉV÷Á‘um¹:MîÖ³fmíw-щ«CûýÛÒÕÛ[š%ݸfN¢êÁåÕºn·´Æ§åfƒmk°»þϺ„.0,•­šÏÁ{jÈ iºjÁf!ÙAX\ ½¹º] >ñÞRÓ„§­ã]ÞF>+>ûBžšË[AHv¶°¶´£6¨ÖÍm‘ê:Ô–v²—èa"–=‡‚= ÍBϺ`Oˆ}I.LʬÆœá¹U›«³•ˆ&dó5îl¡i¤UÂH0¥òËä@’p2^>¤°­š\ÝÑÜ€F9[¥MnÕi´„©kÌ5wAK9Ÿ~©¦sm „Ô N‰æ¤Öí˜Ižô»Dü÷Qüã¥_WŒɰ!þy¹¢pÓŒM?Fá²wCü#ÐôÁØmPË#¥"“!ùR/Ç o°Ìö6ê Ea-é×d®KG“ÅŸ:Ô†‘õ òC™*ütcå1MÆÎEÏ(z¢÷â/¾MmïÛýÕÞ šó ˆÝ°ï#úÔë?v¼3ùÔý~éÒ¢Bvbæ¸ZCŒœ6³ˆ¸Èš>¿g Ïã7&„&e\ô<Ï€·ÑÛÕW¤«ék/6š F¡CWìÐ9}½½žv¯»G×èëô¯txtõCm=ÞÁnÏÀ Îé0d&EÙ,†RƒÍ ~$EAÅh°šÌe¶2Û‚ÿ Ö_>n,Ctý¹È°þ²~=züe¯§_ØtKÁ“mÉw65?QµÙ5sÒcg¼þòkO¯Ûtîëê¯/nÙ¾ wìX1¸ëé'Ún˜|÷sßóeäÕµ]²•ïïøûÜ×~½8åÁ©¯­\ÿ¤ó­oÞzçÙkÏÚö7Ç£Srf̸!…¿Ì~´P°ëîCKϹfÓC«¿Ñ44 ½9$-1Ìþ`FiÊ} 3ç&¯nœxÚ1ãö'<{Ž’onk_óÉàž„©Yk¶9ŽžWqôHyiÕÑ¡Ÿ>[~x}JyRÙÌÛž˜jú8û ìÐï=U¾ðõ/(ïØy¼éùg_~ùè©_²ËÞ&ÞÚ2áÀãu×YÞaœ<bè” $>^Üúɇ*{ê²s·<›õlã¼óà fGë¯4f2¤)K ÍLÓÀР_Wëñ¯ô , Ωê¤9-2J¹£œÞ^®Ñïîí÷öué=+¼í]ƒÏç7–Lµ¾¶N7»ÆQY3»¦©Uçp:]õM®ª"]Aû›U7V‡…VC™Ñd°ò(´ÙŒ&¸5•ªÿýðïbøåbÝWݧM,^Ÿ~@~Ǫ{µQóßh|}èƒgÌ…w¼òƒâ”Òo?Ý9¬PýGÚ‚ûŽüó‡-®8´yü¿Ö¶h—®úÛò„ߟlùaÂ--‹w³ß'¶i[Ö§?»üÂc9-%Çž‹—m¹ÿ›ïš3óÓ/&å쟷çŒìË{6š9ýâ¥wÝ`9ö›bâËwÙ.;)†™ÃÚË7ʦ¾ôéº_O;¶ï»[Wÿ&ûí¢)Ës÷é ÞÙç9g¸h3Þ±àÒ¶gµ7®ûîÞ‡ãï}qÞže‘m®'¯¹þ²3e9oLd›d7ž®H¼ ÞùÕ‰s^8ï2MO˰²ìâgϹêÖyáZ÷y~¢Z~éMOu¶UN¹èÂÓ%9çlý¥#rÜ÷/ýñ{Š…$ ‡´—¾á<žýkuËÙç<[½eçø/â—üÿÄ·ó ã%Á™ÿÞŒàHU:Òÿ%ÿÿù·vWÝAUŸáËk,·LT¼óµ/ÿ–¨¹Kdeug>ßTwôÞ¢Ê×UGÏ=¸xäžuG?Ø}×™95•šž—/ ày×>þBñUßySË ¯åx>Ú~˪ËüûôÊîS&®ýýn‚étï’_÷œz÷ΗOë×·åfVéæÞž›ð”Ÿü\óM~êÂ[7-/‹Ôÿ°ãíwïÞýɶg}0øô Å7¶½‘°ëYú‘bü<ù?k¯›~ý‹ó«_)Ÿ÷}ö‘Çó&Mozþ²÷±OÿìõÞé+>:d¸6fÝóg¾>錽?_ThÔ'üòtüñ·Ÿ6;ú«'aØy”Œ½pOKˆ¦9jË÷Ó:_S¢×]»Kÿíî6ƒÙ¶» ¥FKpw߀ý_7ÂXm¨’˜¦¬\¹²x0cq»¯·dÀÓïôú}«Kê‚ß@±®mµ®ÁÓY\$Äuñì¦*!–ËS “%9eUÞ.¯ÖTéœ=îÁAY7Q7ÇÛ>àFí˜çîñv¸ý^_Ÿn…ɨ2(~yin4Æ´B%2N9ß=Ø KÏïë3j Ñ’+"<½¾¾c¦!]h¡ñ £â`£o@ìWýIÿ¿]D×eµÓé«¶ßôà¼=ïÏ›—± ©þIÃÛ_Nøî—ƒoû¯öÝvÊåô¬3ŽÞØôØÛÓÜï×Ë_Ù˜cÌøIÞz©ÊzÊ•?WÝ;máÛû¯°/É_<fÊ`ù Ël:Ù^ý3M“•wäüú´çòk?Ÿ^ùÉsç=×5­gNÎÀ33_}ýí]¿Hüiå?a]»Aæ3l-=“LjTÃ%²½†õ 5ÌÖo‡Ílæ´Ý¾èü½û’oËŸë›ôjÃÕíÿQ¼áäsr¶`Ãx„%â Â)~ô”žHIÄ:n%“` r8o3KR`ÝÀr¡9kï„uùÝ~ÿ`EIÉ¿ Pg}ãÕèÁõè]MÝÞA]»gÀïíô¶»ýW \aÒ=ƒBôx:=ž¾vO‘ÎÝסóúuCƒ@6¨ôxÛý=«•ƒCmK=í~ßW¤ów{t£þÉâ¶~ÀÝî6&Ø"üž^OŸ_W–LP‚™ƒ±ØJV¸½=î¶Á’±ÒF sû+”6ÐI‚Õ®‰½ èt aâ€gùgÐ?hKçPipìôéLe63̨v*Ç 4Ìñ õùÝ`Õ<¯ge̦ÎVj(5+›@׿zÀÛÕí6+£Íf9AœNçèéÑ5ƒaoôt뜮†&GM­r¾£¡ÁQÛTãjÔUÕ4:g;j渪tŽÚª°ýpv͜؋•umMíô ]Ó —®¹Ñ¥««´¦QWS]ãt4¹tPmlj¨q6ÍnÕ56WÎt9›tMu‹rž«¡¦±fzm}M]­®¾Áálªqº€ÌqÕ6Ù‚ŠšÆÆfЧs47ͨk[”A#ƒ#ÐÕÌ©Ÿ]ÃmvµÔ7¸u££'Ô:g7W RF[•`÷WƒsTƒ£¬kÐU×4Õ ìÕ€;tõ°ÑÙ<ÛÑ «on¨¯kt‰Jæ×Ìž­«­kRVºD'Ív‰ κÚF×Üf0¾Æ1»Xjkšjæqž ±u0ª]•cŽcº«±X×èr)…qB¨ˆ2ª\@5»<íôAèƒ)óuž‹]ÞAÈž]Ÿ¯O«N¯§£QZ?¬Œ¶!X@JÏ*àƒ{…»gÈ£ìvCôùüº6®Ý]¢÷ ÎÝÞ>4 ­ÀNß@¯¸f”+¤´©‚5Žbåµ–u¥ÿ™elïñuùŠ»¼‹H(+1L4è÷NØ›¿i¼ ¤ Š+¨]ØŽŒÅí=†Ä°|“Æ" rÈ9ðïn&›_»äHÓÌß Çïzñ•Ÿðs7Ÿ›øã?—=³ÿ§…åÅ VÇüÐPyÛo£Þwiçáæ'š=úà)xε±ßL»ü’Ã=s[ß¹r¿½ËdôÙM“Õ…_ûnþò³Þ37_ñù¥—¥–ßy[χ³ÒëÞmIþ-íݯ_<ZóèU†…aäjc­aöÞœu:TܨŠyQò!j@Ô…†ÄÖ«óÖãÓ.Oop³'Ý¿ºß×5àîï^­;a·gë×u¾ãùüòíÿZ°!éx­qãÝ}ŸþæÚk­AOn¼hÅ—ßÔ›ôOÖ˜¯Ê>vuIKæµËc¹‰ç\qï6KüƒÓcryþ︬¬‘ç|_{fûÐmwÿðíóK'÷>UÖ}EýŒi‹Ö®èüÉþõæŸ+Þ¸0½ö¹9›Ûò›~îáSf÷®¼æü ¾#k¿žpõ|ÎyϺEnÜ€‚¦û„ùWÿw¿±ú³ûñ1ÓjHÕè? ê‘cÄ3±Åh0ZÆRË‚“"ÆðȦ§f'ù6,y3êWoü+ãä9=-å÷®¹þ½Ó×ÝuéÏ?Í™tóÇmϺ,|þG÷ų>¬ÊÒE\íÛpE¾6¹ôás«¦F_¯:óÙÚ=µã÷þöBì5Ë~ÈÝÓÑnøÜ~q¶æ£–‹JûºÛöîæ?øèÔ‡.œû5ÙR²ó—¿-¹ùãw–¿¼'kù·-Šºo7žY9í¢9O?¼aZÿmg(ç tÜÒyÌîK¶(p~ÓÍøbLT8b „w&®ÆH)Šu¸VeÛ« ¼“šcó½ƒíïjâlöw£¢á¢PÙÞy71)]sìªcdÇ1l?¦€æWâá¢TÙ^9}§ž˜öåiØ~ZŽÞf?=/ß&|ù9|:³Ÿ–”j»]芉µvzÊ‹/ùŠ•pé퇋½§ÎGP¦G×3­‡õø iZ^Ö—˜Ó—Õ§[V¿Œíè;ºŒ,ë;s µÄ¯"1~4”å× ±uC;‡ Ñi~ÃPýPÿC~¡‰ŸíºjèÝ¡¯ül?à?ä?êgþ¡ø„ô®¥p)éÔyIL'òfuj¼lw§÷—"o½w‰·ßËyzIVg‰wš7àe^`X×½ÓsÈCQw}÷’î~{×󕇠騇zºãÓNíöu_Õ èÆå©)ƒ‰kœ)Ù«¡ØwᇰË!Id§åö(]ÖÈúÜ,Í/õ¿¬û… ¿FðKR²M„Q ¢»Æýžþùûø¬ï¾ÏÎúþHBÖ‘ç¦dÙŸ‹O°íØëvaûí…z‘p$0¼Àèöub¸Ï݇³÷÷9öÑWà+.@ú ¡ì‚r>”à .Bú=P.¾é/¸JýµøÜÍL¿}ÓoÛÈôçœÅôë×ýú3©~í™2ý™©þvhß²é7<{#ÖŸðÔ¾gnŽ¿oütãÏé÷o|`ãß62ÛÆš­iÔÆ´ú4f2=tô«£TsÔ~tÝQúeN³&$[ÊbKbÌ jS‚˜ 7$Ð’Tœ™­ËŠIr&gk¡ÄC‘A‰ÑhÕê¨hµB©RË#"ÕrjÊBØ>…¨u‰ð‡Š,.‹2™: gD%G¤FE0SV‚&)*–ÅGÅÄài1§Æ|CR<^E_ #”%Äš;LYšƒ8@ÜA €ÄQöxSVÚ$SVL…)‹Ú@Q¹)«Þ|€ Ê;’´x‹.3wk½aÕ¥nËA j^u€àÊMÏÎÆØYhVSe l¬¾‹˜õ³“&ŠúSZ`|^kšÐzï<¡¹šdËAŒšlËA Ö¹à”–ƒ8Eèߘv@†¡30kÉÆsÏmÕg:„¯jÖe´L²3£éùŽãþªÿÃßïăðÛ?(Éý¼Û"?ÖëÉ=ŒÈõ@á/CCz p =’Ä FUn%š6-Y¯™ŒW””'/Z´\/WäБ[Ù|UñÿŸ)ô›Ñ";ï¯òÿ[‰h["w-Š£\”÷u,BQг!íÍÂ;¦þ*•¿Ê_å¯òWù«üUþ*•¿Ê_å¯òWù«üUþ*•[øo³ßtÍ‹N™ü}dZ¤øTs¿©—ïÜpéûÇ~¿U¹<²Q齚B»ì5¸´ÉÖ¢´P¶Xx÷&½eÂõa'âh-B#¯Ü*^ï®ý~Xä}¡á_"è%ôŸüÈž•­¥×ÿþ4X!}ŽÑÏ„×}¢¥øûÿ€u!zcô Ç£…cz;пP'’$ŒìùG£5H6üÍȦ‘_ÉÍ4cäv´{ÄFÝ2ò1NFƒ<¥}Ž.%¿‚f OÑõè4J3ò &дµŠ:—¢çÖ¡Ñ{èºÇ"?zý ÝŒþ |(S€b‘èØ$¼ú%OŹäl ÙyÒxn¾ƒŸ›Q=jAF´~ç ®B§¡Ò"Ö6¡I#‡Dl­0âóêØ¦yo{·ã"tè?í@gâh…®Dn°À† M˯ª3Ð*ô1z”4 ArZ€zÐqt?Ùˆ†ñªC³Ð©¨sä}˜ÿhJù%|"½Oyä(uýᜤ·¦‰o/ÏãïÜ(ßk.¼½D|«ºIz¿ ØdEåȆ*Ð$4üõ ÚžBmè6,CíÒ[×ÐN¬@¿c%(ìß¾sâ>ž…± ïbÓJoG?ß;~AxCÜŸ¿½óP'ÎÇx:Š^F/Âhn—ÞGŽÎÇQ üäèC\Š~ÅeØ‚­¸Û 2^EÇP÷½-ýKx_(zW£ƒï ÏV!ªFÓÅ÷ÈÏß/?ÕŠïvŸ‹P#Ì^³øùˆ®èˆ¯EÈ 3µ æ¥ÏB}Ò[GÑ^\3TQå“Þ>Šú!NÐ nÂÍ£oE?ß Q9„V •øT¼½vò»]…7Å¢pZ|[,Z ëå4t:Z+½7]ýè@ø›ZÑGø4ô›ø¶Ö3ð™Ig¢uhýIï?Ý‚ÏAŸã­xºoGÿ”Þ‡Š¾@Ÿ¡s„·¡ŠoEÞŽº[xϾ_‚÷àKñeÂ[lñ•ø*¼_¯Á×âëðõø|#¾ ïÃ7ã[„÷ÝâÛðí8€ïÄwà;ñ]øn|¾Ä÷áûñøAü~?‚áGñcøq|?ŸÄOá§ñ3øYü7ü>‚ŸÇ/ˆo~N@‰( %£”ŠÒP:>Š_Ä/á—ñ+ø~¿†_ÇÇoàà7ñ[ømü~¿‡ßÇà¥7âðÇøŸøü)þ ÿ Žã/Ä·±~¿Áßâïð÷øü#þ ÿŒÞЊÇÃxDx!1Þ÷$¡è;ˆLx!‘“IDITDM¢H4‰!¢%±$ŽÄ“’H’H2I!©$¤“ ’I²P4º}‰¢¯`Õî@7¢,”-¾‘Ñ«þz¢þ’.E{HÉE—£ûÐudOòH>) H!zò…í&zAŠÈD´‘£³Ñ ¤„ˆ‘˜ˆ™”’2ô#ìO -ŠAn!”ƒ®A ]K¬¤\|ïøTd‡ ¹D|—ã]ènt˜ØÉÐãh³ø>Gá핤m!“P.™ yå1ÈfQd Úyu;™J¦;qJâ$UÄEªQ,šöT2}‚4dºÝIj%3É,2›Ì!µ¤ŽÔ“¹¤4B¾s¢×Ñyèï‘ÿÞ"Mèmô&z½Þ%Íd™OZH+Y@N! É"²˜œJ–7i#í¤ƒxH'é"ÝÄK–’e¤‡ô’>â#ýd9 ƒÄO†È ²’¬"«Ér9¬%g3É:²žl g‘³ÉF²‰l&[È9d+ÙF¶“sÉydÙIÎ'»ÈäBrÙM.&—=äRr¹œ\A®$W‘½äjr ¹–\G®'7ÉMd¹™ÜBn%ûÉmäv ÈäNr¹›ÜCî%É}ä~òy<$½—#ÿ"Ÿ“ãä ò%ùŠ|M¾!ß’ïÈ÷äò#ù‰üL~!¿’ßÈïd˜ŒPDÅÿ¯ƒ2*£rA#©‚*©Šªi¦1TCµ4–ÆÑxš@iM¦)4•¦ÑtšA3iÕÑlšCsé8:]Eóh>- h!ÕÓ":‘Ój Fj¢fZJ˨…Zi9µÑ :‰N¦SèT:Ú©ƒVR'­¢.ZM§Ó´†Î¤³èl:‡ÖÒ:ZOçÒÚH›h3GçÓÚJÐSèBºˆ.¦§Ò%ÔMÛh;í ÚI»h7õÒ¥tí¡½´úh?]Nè õÓ!º‚®¤«èjº†žFO§kéôLºŽ®§èYôlº‘n¢›ézÝJ·Ñíô\zÝAwÒóé.z½^DwÓ‹é%tº˜^J/£—£ËèôJzÝK¯¦×Ðkéuôzz½‘ÞD÷Ñ›é-ôVºŸÞFo§z€ÞAï¤wÑ»é=ô^zÞGï§ÐéCôaú=D¥ÑÇéaú}’>EŸ¦ÏÐgéßèsô}ž¾@ÒéKôeú =F_¥¯Ñ×éßéôôMú}›¾CߥïÑ÷éôCúý˜þ“~B?¥ŸÑÑÏéqúý’~E¿¦ßÐoéwô{úý‘þD¦¿Ð_éoôw:LGb˜Fc2&g,’)˜’©˜šE±hÃ4LËbY‹g ,‘%±d–ÂRYKg,“e1Ëf9,—cãYËgl+dzVÄ&²bV ÌÈLÌÌJY³0++g6VÁ&±Él ›Ê¦1;s°Jæ ýï&3Fÿ“ÿ ox^ÉV‰ïï=íOßà»…sÒ|wý}ƒï}ÿÓïð}Ix/;Æ^e¯±×ÙßÙììMö{›½ÃÞeï±÷ÙìCöû˜ý“}Â>eŸ±±ÏÙqöû’}žfß°oÙwì{öû‘ýÄ~f¿°_Ùoìw6ÌFdH†eDFeL&“Ée²H™B¦”©djY”,Z#ÓÈ´²XYœ,^– K”%É’e)²TYš,]–!Ë”eÉt²lYŽ,W6N6^–'Ë—È&È ezY‘l¢¬XV"3ÈŒ2“Ì,+••É,2kD¯wpÐÛ×%+îêéÑôùúzÝË aÀãè“;Ú<+¿»½ÝÓç—Wµ»À€Ïí—»¤šK’ê ‘E¸¸T—:Ôç5«KUÓG¥ª§·ûz{݃rzˆW5c”†ÍhsÈküÞž¼FÒR3ª¥†k©‘´¨f†IŸ&]Ro¶Èg‹cSÏë“ÏÇÀI*Ùl/¯éäµb—ºö$Q¥eò:Ñš¨ºî!ðäÀPo{ÈQ'¤ªìqvKB8d5œ$«Ì"o”\Þf~cº)ÜÞ&QªiùÏïÑ_’c1±&Á[Í’·šEûdÍÂLG5±²™»­Yr›|¾dáü®÷ jþ¨Šù^Ï€gÐ;(o•:[G;å D6å‚Ñùí¨´RW_—Š»Ç/wK“æ 87×îæ¡áöH£o ¸öÑ€ëB¬C 8TóHR=£ª=\ªgLÀ•©ºÂ|Úp]£×pÝ‚ ½’ ½¢–/íåQ¶4L䲓£Ìª^«ÍÓ×ãîëð¶Ë{¤ë ŸÂžðs²!äú¤I蓤/Œ\Õçþã³_·‡‡ŸAî“ÂÏ7fb}<ü|aá7À$wàäð³Ê¥  ×`xøùÃm÷‡Ùn13¿à¯!É_CRÈ ‰!74Ʋ!îÃ!r+%«VJQµ2,äV†BnµÔ¹:,äÖH!·flÈ™l&êéëRvyzÁém=¤f&™;DšºI;ü[FÚý¤³“vvz¡ôN?hiÐF:»t“Îe–‘ΥĻTÖãë딋W¯z"²AÄÂz3ª+ em›º%°Œ öó~ ñû‰P3¬Õ ÷àP?,a߀¢-„µ‡°Žæ a!¬+„u‡0o[–…°žÖÂúB˜/„õ‡°å!l „ †0 a+BØÊ¶*„­ak‚˜ÒœÒB£=âÜ«‘k<ìVA„÷yDè_)ÖþnXjÙéï ‰fлJ¤„ ì1-E¢>¯$H-Höõt úW÷xT =„ƒ† %j ÖÔ‚¦Ñ h ñ€Æ¨5T5‡˜í¡Š`Ap ¢ìÑŠwÔ‚ì .ÉÕDÙ!&Av¨"ÈööuJ`t!FÄ¥Ñk¢£° Ä„xD B5Ñ‚“`A°ÂCÝÁa%‡Nm¿{R¤§3dx¬Ø2>‰¸œ3—sæò0æ š0æ`S´(#´†¢ÄН_O{ÔÓB*£ÕXV)ÄZ·w C!›€ ò®2-Z9,çÐÆ¡C"Dßt«E'Kø Jp+ÇÕ¢'yEï‰PÕ»Ý=‚€‰¢n%!aƒÂDN\>ä†pˆåkƒ"}§·Óß-Ò‹Ø ¤›WTÂür\¤VI·h‘„*…VÉ )4&M‰xEŠ€`Mš³K„&wŒI„s•3 6†_—·ÝÝÓçó«<ˇ¼+Ü=Ÿr*Ú!G ÿe@ ;”Wøã¨AO»ð7g ιcÞå«=}ÂÉÂ3Ø>Ôáã3\Má/áz`ÿ ­¼vdá^a.Ý«%;&aëõ¸åýžAèUH@=0ÔïuwGƒ a£"ÍÝá,¼ª½ÇÝ ùž¶*J:‚y„?õtD õlœ QCDºÅ?_ w§×k1šJË!•ûá<á÷tÈ{½}ÂCõõu)Êmòà@«Y>ÃX^V*2£Ìf¥¯ßÓ×{¸ñUWW;%[Œe§·k4þ/Ê2`¥H>\ƒ™ÃRË8´phå0Ègã/@C¥êÄÓƒÙh’9„-Y6]È×Jgh«Ž¬âÛ¸¬I8Ȝ©AV)8‹5Àü¨œa¢œž/Ì¢¢*¸­«g„äsijƒ¼N<:(E}ƒ½îž¥¨TDcF5‹õ¨ z‰P´ABEC$T´FD‚I"¦ ³KlPsãÄJtÈB±ª 7SlQI¶J¸d°¤@˜£Á`}l(­2„ZÊC˜-ˆ™B½e&‰Þf õCØh›Y¢2¸tK¨§”óKK±Ô9Ê]Æ{BúM£\ÜJ×n¨ õ„¨-FÎïàÐ)AGÈvSh<æP›™s9B¶›G1s+ aÜJ‡#ÔÂGâpI°rT¶5d·ÛÅiªGu„ì7Û8¨¯4$©”[YÉuU†¸JG©CÖ–†¬-- a!_–g|TÆ(ô±”k²8B-Á9(µ„øÊFã#¤±,¤±,䇲eeó¶Q,ä£ÐLÀO3…0s+ a¡ñFg%hqe¨%o!댶ÒÈÕn¿ô¸AZV!rŸrWÈœ0cËù6l.3E¶¯÷‘îk=°™³J8#Ȧ»a“UyzüîWÿ ŽltPt6uÆj`§Ír÷÷»å³Ý½mn2gˆÔ‘oDø‡Î}¤ÞKº}²FoW¯›6¹‡"š%Q´¾ÛKPê½JQ«ß×çYÆjiwhãÐÁa%‡N«8tqX-ÁrÎ_ÎùË99ç/çü圿œó—sþJÎ_Éù+9%ç¯tª¹GÂŒ6r&#g2r&#g2r¥F®ÔÉé¶Hðh˜ ï0qA&.ÈÄ™¸ dâÖ›¸õ6Îoãü6Îoãü6Îoãü6ÎoãüNNïäôN§B˜hÑBµ€Ÿ^HÝf®ÎÌÕ™9»™³›¹:3WgæêÌ\]ç¯âüUœ¿ªR̓(Ì7¥œ¸”—râR®¬”++åʪ9}5§w9ÕÍa3Ã+cGTƉ˸Ð2.¬Œ[ìâB]A¡ÜW¥²®×Ó>—Njá¤Njá¢-Ü^ WaáαpUÎïàüÎïàüÎïàüÎïàüÕœ¾šÓW;enq‰· K¼K\ââ÷ð%¾FXâB§_\â^a‰/—x´Äû†È*o„Oš:Ðí“ ‹Û(õÃâk¼Öw;¨Ê|‚gø½’A. 72 0ÊÅ£Ò}B6M€¾¸yݬ—qhæ°”C‡­|qs¾r.§œÓ•sþrÎ_Îå–sþrÎ_Éù+9%ç¯4G °³º’ ¨äŒ•Vµç¤,aåÚ¬œÛÈ¥¹t#×nätF.ÔhŠôŒÉVNhå&.ÈÄ™x¿‰ 2é¸b·Òćgã|6.ÇÆélœßÆùm\®óÛ8¿“Ó;9½“Ó;9Óªð†²ˆ÷¤,båb¬œÜÌÍ0s³Ì\­™‹7sñf®¶*È„\^§¯2iÕ†9²Šk¨â«¬jßIyÇÊן5˜8q)g.åæ•ru¥Ü¼Rnž‹÷»Jã‡Æ¦)Ш:9pø ¶ò]Æ-(ã”q eÜ‚2nAYÐ ärqzWŽËsqù.«ÒwBR³òdc &/Njá¬nŠ…‹¶pS,\E57Á„ÜçwpyNïàr\ŽƒËwp~ç¯ÊçôÕœ¾ÚÊóŽƒCé–É, Õ`®æÐÊÛ¥¥°”C‡L}Ô˜9S¸û|~OÇëæÌ Ü;•<WS1¯Wó~Wp»åíNÞ^ÅëUÁs÷Š3¸_V+:¼îžÕ~ï2®ÙÅ9\UòîöîÕ*áË™eÒײºnß@ŸÌ'^›Åëpe¾¾.u‡Ïßæéñ­l÷õ¶)ÄçÑ"&+ELüÖCÀ¢º}¾eî6ŸD!wˆ·üòJ 8%P%—ª%0]3$P#™˜%Ù˜#Z ÔI ^s%Ð F 4I Yó$0_-h•Àéi…Ãz°¢rt…ž¬híc­D;:Ÿ­¨þÐÕôõ²ôtEüŽYz83úu³ôH…çÌ+¾ÑÇ$ot…YãÅ5άQ9ÛCt¢œíaÏjbF¿µ–(«F)UÒ÷×"'Ìn©1\§+Ì®=àëW˜`רb\c P»Â‡í ¶jzاŸ8Âé£"µáß™KJ¦U¢™q»Bø ]T6¾š°ñÕœ8¾š±ã« ›áš°ñÕœ0¾šðñÕ„O3ó ÚY'Ž#jVøÜ©fšª}"­jvØœÏçSßÞsñ;P ¯ xmØ`jGåhkO²¨vŒEua2êœWw¢óêÆ:¯.L_ݨóbÇüâ€ä²ºÞð‡‡£ökÂ~@Z&uÒ2Q5„Õ6˜†“Ó0f0añÖxb¼5† jѹÍc󾆾°ÜÓÊ=±Í'û¹9Мü`é“ú‡u$†>¢±-=…Øø'D¯–êyX—§ÌKçU5˜þI[ ~ÔÀü(•J QÃ'^ÿä£}Dù'Š*µ(F•«»¢JLJ\P±N™§ÌÇÊL%.Áà  J‰Æ8**§ਂ‚U” '᜞gÄ)QaŠòñŸ~Ta˜^¯§T¼`œ -Ú‰c?ø?úñª$£-a^æî £OúC)‘‘8–[,Xãÿq1!²bü?ù" >>~t¾ÇÃGˆ –¨í‚vÉj)XTª ÁJ˜žq^8'g£Ð$ˆ ƒA˜G˜ø ʘL­VŒ¥ôh˜ èè‰BHý@h`œ‹…-ã,q4ñÂØ!‚•¸HЙžª.. ÿÑQpœ•ˆ ~Æ r||V<ÖÉ0–ɲ²È2ñ¨…9MKKMc Es'âXŸÇr黎Q†Õ%ÿïæüÉ'ùäO—òäÏŸ)Hÿ·êCËWpiV©‹ÀÅ:)&c¡©$\pF(.‹‚•ðQ«Cõ¼ÿpı±86j¬Ý’ )@ÿø'ý„Ÿ¬¼¬¼DüÇ?0¨°Î!ü£ì¿ßOnVÞ?|è÷ƒÊåH‹èÈíá†Ä?0DJ•ôWªÅŒê–`Ì@9BÚÓF w6À „Î. Hº1U*¾Ö]:Ÿ‰wà]øjÀ÷âïñI#­d¹Ÿ¥÷ˆxP<*>•1ù0«³`%r(—Oµõ¥|êG°%ÒžüZŽ{ÄÙONËé|º€~IÒEt1ýŠ.¡Kù,Þet9]AWÒUô[Z¡O-ÒÿÐJº–®£ëa/FKõ»Å[b“xM¬—cä~òY,&ȾâY‹2G¬÷ê3˜ò0ëbÙ_æÈ™¢U"óÅ q¥¸Z|FC`¥ôÙ?›¤‘TNc©†ÏÙN£©4Ö®šÑqôŸt<ý„~, Å¡“)J1:ƒÎýéFºn¢›éw´Šn‡†ßCwÓ½t=AÓ“ô”( ×im„ÝÛBo‰ûé=úœvÓô¥p#8Ë¡á˜et  ßÓhZMÑ©‚þDc誤?SÝEé!š@Ð!ô æÊÃt0ÝO‡Ò£tý…&Ó:œþJGÐßh =F3éįçh=ƒ¹õ<ͦgÅ@1’~H§#éz‰Ž¢Ð|z™Ž¦WèG´–Ðk´ÖѱôCëéM:GäÓIô.@oÓ‰ô¬õûÔ@>ä“ÞM´ƒšé#ZBŸŸ>¦í¢ú”ÂôOj¥¯¨)}Mm´‡N¡Z&&ýLdÓYôs‘Kg‹<ú‚ÄQ4‰¡at+¢?‡¶ÒÑNONæ³ät9WN‘³U¹£Ï5YÕªÚšdeýÄ [?·¶íó)º:«öõAë1kƒõeïÏŸ9§Ï¬«a‘¿²>¶ö¨~òd–·Ë€¼U®2§õÉÃßËÓä©òBùÙdÎEê3‘Q¹”ÏAþÔœ}ŒŸ|\.ɧõYÇÔsŽú”ãæ£>½ø\ÃgŸ2çã§õÙD}"QŸGL=‹¨O"> ï—;äÝ]Î#î–OÃ÷¬“ŸËkåò:ùl÷y£ì7Y$[ä=2&–mòoòtùŒ+Ï”ÏÉ_ÈåyòUy¾|]^ ×ËKå&y™Ü"/—oËÛä?e«|D6Ë;å5r›\&Ÿ×˯åEò y±|“~*,:UHx|׿Ã9*:Sd¥ž¥²n²n´VñùÂßñù®§0±¶ÖðYÂG­'­'¬gùáS|аë‰ËÍÖ&ë>3øŸìzÎr—õ‰µ›Ï ~ª0a”‹OJ}>Ð ¨ª¿*äõyÀng,o€f?Ý~Ú½ú½šÚ]-PýºŠÞåäh×óŽ]Άv={ØíÊgMU­š¨ç“Xï[ïZ;â'MÕ¡j’šÌç!sUŽõ…õ¹r«¾‰ó¥jªš¢Qû©á| •O“ª ê`XýrY!+ùöA²@Ÿ—.é––Tb;ŸÏE$ö Ÿ+Ü9™/NåSùçŠóô¹{q˜¨Oèw;™Ï'ñõ|WŸ^߯§×?PsÄ»|?Ýéû+Ä3â>™#kÅ«âñ²x^<$^%|—}…J1Î>—œ›ˆ.Ꭰ™€öþÿþ¾œ#æáƒkàs {¼ëMð¬7Ã·Þ ¿z{ÖÇá[áYáW7³n¦·àYwë§ÊÀß#@+û‹þˆŠåþò0y„xÞ}±xÑ€¾³Ázëbñ$Ææië×}‡Šgá½ßŸ!šx£µE<,žÒwŸÈÄCáýáY¯ IZ«ÄýâïðßgÉQâ]}ß=¢Ð®éÛÅåˆ)Æ!²x‰#¦q Aˆ%tô¡gáá¦È9ÆÇÍ”³á禲&d4á»kñ£ TˆïøÞ3· ëŠ 1®Ázá–ø½cQ¶7YÝ…Hû1Dϯ ~‡¶Óg´qz¾(CÄØê åYb>x{Èõ-‹„,÷Ãõ‘IÊ\Wƒ²J\× |®ËRdyµK?}@Ê5¸ž‹ë1¸žŒëY¸>Œق$~yøŸ"óóq=*)k.·2v®§âúv\O3×Ó÷A\ÏÀ·t5amÀÇô4ô2õ‡|à ½Gzë’øÿŒnc*0F¤Ÿ,aÆ”öeLñÉCz¶ˆx?ËCŠWQ:BÉ~ô,×öTï+•ásP¯q3¸/qpÓ« LkPsÙ¶¸“Ôª‹µ5sÍw/B›úž^±ì+:æe߀ÏjÀ÷¥),¯Àg1>ç&ÊžëïÞ¯Sð¿Ò±8{3>Ûïê^žCú9ß|½8'»[ý‰v ég‡¤ëuŠ{l¿¢®ÜïÚä‡óçåT÷Ä7×_“h?©cbšþçåÌèeûº´íWäü¤[Þš/¯îÔ>˜–ÿyû '‹Óä­6t¦|zl¿¦ó§×ý®é‚#eü÷ÚnmÏxöi~¬íÒÿêÞáêÖÿêïÐï¶}§¿[ûs¿çþ/—Íñb!ï§•ðÓJaý‡Â hžË’úô‘µÀ×…(ì<õ#þ<: «#K–«ùj¡:N <|ôÆ´÷GO½§yòå]ïFþ*Þ¯auÿVö›°ª+ú­X͈õb Äÿ—}6Þ\äãjÞ ÜÂs ÆÛ ®ŠàÉKðÎwÚê>,pFSÁAx8‹²Á pa!ÅÚrÁÍ|êŽR¸:Žú‚³(Üy¨Ÿæ Àc#õŸ'£æêjÔ¹[ÝÒÇÔ“(}J=‹Rððšz éëêu¤o¨7nPnR›¾¥ÞBú¶zé»ê]¤[ÕV¤¨~¨>DL?Ú5š²Áý¤æ{±‘B!û&ͳÅ<+æÙexÖÜJæV1·.D4Ë! ±¸éb¼Ý¼Wš…øe `ýŸYð—Ï~o7½„·›Ö‰|r#†dÅH1’²ÄXq0àâ#¬?;!;¼(W*©j9öA¼4“Üj6b&7Ë4%Ø—%˜ÏìÇÌcÙõeÙå³ìúÙ­UkÑÖ‘à:µ°#Çõj=`Gšoª7;2ݨ6v$»Y!¾5òÝ¢¶v¤üŽz°#ë÷Ô{€‰¿¯ÞìÈ}›Ú˜¥¯¶«í€?R!Ý©v"Ý¥v!ýL}†t·Úô õÒ¯ÔWH÷¨=ävéÅR–Kº$RåRÈÁi¶+i®+iž+i¾ ²u¸ p @:È5i¡«é`dî*v#Ýßµ?Ò!®!Hm—´ÌU†t˜kÒ®HG¹F!Õãrä:°Ö—«ÜUXkËUéªÄ˜öÑ‘t" Gò¨f¿€¡xäB| x åå¡F  ‚)„\­Uß}ñF©SV‡u(òôJX|‚žâ­k9-alRZöÓe_=‚ˆH×þúÚZª{Òµ35:<ÒÏŽ I÷_„òAS!o(ç)E†nª[¤f NÀÕÈÌ}T#G·Ñ¤X­ã;ñ¾<=íCÜÕ1¯»íéw‹›ˆ:VàSÀOA‹96Øi‘Ú2~/‰{ìî>Û‰*?ªq'½ð¯@ÉŠü)ø×p‹‰]£$§MÏQ˜n׳Wçöóœ Z¶™óNzO¦,My ^A%Ž7á§ì8OØ9§Ë³r®’+ø98·ñNùóüœšX¸lÅ[qÁÖGj,dO )à9‡\Àµ0ð‘/¦,à» `…\ôFy#rn’7¡Îmò6X4ôüçåó°hè‰úÈô¦×6[>Á–O²å³ØòYÜ·â¾]2(ƒèéLy&ðþLþ °¦ ‹)Èf räoäåÀ®éÈb rôs}¯–«Qÿy'zý³¼é}òY¤ÏÉç(4­¬iê+ß›¿%ߦ|½ƒø=ùêl•Û$w"Ý%w!ýT~Jýäg–žCÏŽEâ)\õùæ9‘>ÖHÕå¤þ;úæè´#¡›©ßé¢S£Á+ÒÕEîĸfvÒÄ5¬«+ºÎQgV&£7ÔYëÔ6” é蛥ø÷Ÿ|kÿÎSœæÙCñÝèôÏÿ9ÇZn]dý z1°»;ô=¸I¡—,Àùbô6ˆ\è±ùûYû‘=Sz†Ò «i£Õˆ:MV¥çXçP6zZN9èí"ʵ~…>u,°ÿÞµ‘)pqß.îÛÕ©?ð†œ«&ÑÓÙÖÙèI÷—cgø|ë|¤¿´.Dêô}±îÛºÔºéJë ¤¬ÍH?RÃ)[VˆXÔA ëi5F-WåfïNŸ°¼ öø6~ª¤o0—Èšâþ©sv’NRËÌéK²F9?}s»2¾²x¿³Ðú¡-ª³XÑ$kµê'E2ì¦ J8‹îR œM6|»çÐ`W¾s]ǺF¸Èý©ó(˜{ûº‡õ)0p>Mî?>þ?Hâ×ý#‰ËþÝ–Ôgà~¶hÔÀ2+:`à 좼MvSÉÀ¨³èÇ/4p6 ÜjàÔÿÜÀ¹ò–A.÷¡…·8)|ÔÀ}­‚ÂÝΧÒâl-qe¶!Å# ¬hZñL†õ¾Zqñ9V4¹øZ†ÝÈT¼ÁÀŠ&Âp–—’1ÆX”LeXkhqÉ©ž’ß0œ£Ç·ä%c|‡|i`à)=ÀÀßÒqÎÒŸã[ú 1¾¥/ãk÷10Æ×~ÔÀ_{“1¾öçÆøŽ8ÚÀß­ÆøŽxËÀߊ,†sµ¬*f²ªh`ö”†UÜh`Es*ždXûŠâÊþ|ò9ßo`ïðU€ü²ÊG ¬hV¥CÃ@-“ªÑ†ªŽ`xžýUíV4¥Ê‘í4=U/ôT9üêµÂê©ýÕ'1\¤û­¾ÖÀè·ú¯ —h:kr :kdø­5Cj¹•êµHÍï ¬è°š¿1Ú4i+5Ь§=ÔŒšA”ê_v¦ÒlªäïÞv %Q¾òá[ãYŠÔË5¡Ô‡o׺®u=ܺyk¸òr}›ûLöè`ô Ä*œu1ÀñºLc´©ešƒ0RQs¡k5!/f¨X„^À¹S­q50%QC…‡ûM¶r0†™³Ó†ï&EÝKm« Õ~#Ã(ÚÕ#õ³¼<,aMg¹‘F8!å Z8ôÖ3Mó¸‡SfºuN=êk,ºÆlPSªË™ÂVÔ 1›"0¥QnYÃu&ðÿ LcOãqÐ<‡K+s«qjŽ[˜›vñ:æ(†¾C,S›nIèÞ£§ŽŒײ²D5%Ó¹u˜SOKªÎ-è¤s Òè\k˜ÓZK¤»l¦0?s>jJ¾¹ÝCKM]˜Ç*2Ͼ=¾c™£¨á^c¬Äçàn»â«HàÛ_·³¾EY­jâë÷ê蔣Z·[X–|¯ZÿÍú^ Þæòþžþß´:š Þæ ‡·ƒkNŠæiüÇ ƒÂÞHÝá>>¿½lt?·Zʹšî6|/í2I)¤éÝ.bÌ]iг©¥¡eb3¶ [¤$¼Ì·Öí ç&LÕ€šY¢6K¼ç c ƒæ»1…Ÿ6ž=Z Fr›ža1.‰œ¶­ ‹ëfõ<šelSŒ)¦È¤³-ï*£r–@„©ò±MqðÄG(É—µ¬y ‚žÆbÊlÖ?¯×é«[G˜Ò˜éWÓ2Rk@­VæÒÑ6íeNášA¦p©ñ,ö Ié˜'?k:’°¹IªtïN^c¢÷¤‹ëu”íjØØÀ¤Wšnüv a1â-êY3›Í89zb]L­æyÝÞ©l6ÓéÃ|«dfÝð'ä÷c©ºãÌE=nKpÈxâfî­¡“ï;ü8v$ÕóÅKµOŽ™Qp8mážÚ¸ÅàŽÅöûœnÖtÅÕSr%õÈË–ÀÃ2‰&Ʋg{ÌXõзZ)Ô}ÃJa¢³o^-”w[/”s”á%ÓÿÓ7ÑÎhÆséÿÎz‚ºì¸.zŸéõÏg4 .«–æö´çx£øŒŠËÝÑõcqbÇz;k‘ÛöhÂ×yŒ¸×Þ„ÍT%ç•æNûfb~iì­ç…Øâ.3œ¦_»ó–”o\†qÍ›ñNZ·ä täè1~H¯ÂœùSaF]óÞš–ú^G,MYa;”ÅÓ¶„í×”†%æÉ‰I¼ YGºÍݽù­^έé¡p;ßÙ®©XSd\¹kËkjk¬hÏñù½¾@½/Ò䋨3"­ KZ<цfд§Î®´§¶ske;â‹ú"K}ÞJ{Q³Ï¶½þ&Ì´Û¾`CÈëóÚ-nˆŠ¯§>à³C­±€Îðzb»1±Ã‘·µÁl²c@±¨=ìkô4ø¢vÀßà FÂñq*†}‘X»jümOÐ[Ô~P¨ÿËÕïõ{"~_´d„5ÉÁðÖ·ÛóüÁP =¨x"íöì–ú9åöŒÖp(³Æ"žhÔg×”Ûüd&{šÇkÏ µÔ·FšìÙüÈßöJ».á»!Û·héM¨`¥U 5Æìé¡H8ñè*Žä8’[\'€â`(AÍ´PÀkÏ…ý ÝÊì”B{j8âð˜íµÞ±¾HÝÛ5•5Ç+ÆëUèzûºÙöGmDÕä×Ï´„¤ ¯Oÿ‹pïDßMî•óæÎ?zÑqu3+æÌœ7µæ°ð‚öñžpcwÒѽo¯¯ÑôÇüK}vÐ×f/5\0 Éæ/G,·Ûšý ÍvÔlð1^_Ôß´ýà½öàj»Ùµëõ“ †PA`Òý´…"ïȨÝŠÆì6Í\»Ýª/×ÅJ{´)Ö Â4%FËã•Ûu‘P£/EMwãxÚ‚v°µÅ µBœ^¯_«Z54{"žý¨Q;i V¯b³}§Ä ðšÝˆ'ØÄäüMžXkDk.£ò5êæ¬qZÖÑÖ0ô+ÆSi:æv@+†.¨ÅšÁd š¬p(Ðî\ÍÖ¢¨´†} ~M“žcŽt0Š1φ0‰›=Z”ZJ'·BGœÉ§/¾X@§-QHÕ½þh8ài‡Ø0FºÄnE;Ú J^nëGœyî‰Ùi‡½sÒ@õ´­b`ŠtÇí ´õÂ.øƒ1m€´Þ˜!ÓÈ0’`MË£©+²€µQÒÏ_¶£à@ß«„ÎhÞC¡%¯óô^ýÈWGÀ 0TPS´²9 Oªªjkk«l„yˆVz})Y-ñ_ Æ«@GˆŸÁÚ^åè †»ªy´hZ˜TÃnôƒÍ²ÍáòØa¿¯‡>iAtÒ¦ˆ§VÔn Añ‚Žã¡p ¥íÑÏiñ]`!'°Åq1qß-žv¢Ç˜ÛMк íió´—£jÀ« %ÛH „<º3¨CHFTK†ÏæÊõ­1»=ÔÊ6v?ÔæÔl™zOÃ’Ö04!lô&•íʾ¹}s§&çÅ<‡h§LÃ[”‰¡áÖæžœ‘PKzû µöA›“C¯e*ñ±Œ¼¾˜ÇaØñÇ|šô]B]—0£¢›S({…r{–ç{ÔøÚÑj[1~âx{|m-s|t«Ú¥ì›{œ‘‡ùù MU‹®Üž&‘(M;¤±C°1Pnø€R¤ƒ1‡ôLØþF«ˆ~²/»¡5 µø—¡ÓëšèéÕjá‡Á7« hôØÚa|*ÀºÏÓšDßàÓF îÈô_›ÖþfX_x쥰#^Mu$>º•ß0V4Ÿ·6"f1à„…³õåéÕ†ÉÞ1ĨUôE‹­(YÂ%ËèÃ^ãî¹u£ X—¤ôÖŒéÚÍ2›"6¹ØÒ¶´Îµ´ÖX#ý#ÙÖJë~ë6ëNë^\õç^Zg~ÒËü¤—ùI/ó“^æ'½ÌOz™Ÿô2?ée~ÒËü¤—ùI/ó“^æ'½ÌOz™Ÿô2?ée~ÒûžÒKìmùÍÃôo½;–ƒ®¯-ÉR´ñsäÙyJçö¦—Þà™mæmêJSk¯W=ôÜzmÅÕú ýluìørb½ÜAë©õì;3zæìÄyÚº{Ær,—¤ŽŒ¯—«Èô-çpË¥¼öù6{Š{oïDJzÍ÷ZɽÌvöýé£7xR57dÆ}“™c¡}ÖýnT©š¬UÓÕ5QMQ‡«#U-Ùª9SÔTäíM½À²Èì!oúV;Ð=·žõ-Ç7]»#u;Q£í³¨N̯%½Â×SÛ#Í~án‡[xØw{9z{kä•”ŸÞwÖc¢?m¶„Åì ÞžÚÎ3¾×fù,ãÁÓKë—®å¿Úvÿ‹çÇ¿œþ•?píù~îä:–ï™ä+ŒÒ ”yý¿zaLÔéŽÐ¿¤#R¯å*:´‡v¾D›è´;ß^äŒOmF²™Wæ•ye^™Wæ•ye^™Wæ•ye^™Wæ•ye^™WO/שúðÖ¥òrQ¶Ë¥ø¾âü}Œ¬¦Sä¡>#Ý–+Wªd3Eß%Ô¼ôQ,ý䬎¯\¯}Ÿ\•Ý(}6‰ÿÑeÖ*×i¤Ÿ€gý/l!a endstream endobj 357 0 obj <> endobj 358 0 obj <>/Type/Font>> endobj 359 0 obj <>stream xÚ]ÑÍj„0à{žbz(lÖŸíº+ˆ°XJ=´]Öö4­P“ãÁ·oÌÈPø˜ÇÉýÝ¥ÎBµì#¸â¤fÃ1(ßͲz®ä`!¼Åk´Ð R˜-ZìÉâÄÀí&ÿæãV\/“ű’byáÕ'kØù/>°ðÃ4ƒìa÷UÖÎõ¬õŽ(-D¬(@`ç¹YÞ›!<‹WÅ—úø\4BâÓ \ œtÃÑ4²G–GS0”â_<ÞÊÚŽ7fM—E‡¨ð:ö^§Æ+IH:xeT—f¤©#µ^Ç„ÄIÔ3¤'õ> endobj 361 0 obj <>/ProcSet[/PDF/Text]>> endobj 362 0 obj [363 0 R 364 0 R] endobj 363 0 obj <>stream xÚ+ä2P0PÈå2µ4Ñ372s`LsK# ÇJgp…+äqÕ- , endstream endobj 364 0 obj <>stream xÚ­=Ûn\Ç‘ïü >A‰[}¿¼þ­™–µY…”„ii·þÓÚwÓ¬_5ÈÁÃ^x†|Ìß:1ª”48®´•¦-«ñßÌ?;`Šr1ÉQ'wÞ€;Ü”¸T•PùŒµ ïI‹"è~1Œè5ÒFk„yÍQ#›€ yäÚÛÜå² ý'‹s¥L,îzš«Aî|d‰Å³%©d[:ï>=8<|úÉÃûO?ÿôñç~vxtpïé݇÷ÕÚ|Rç"z–˜Af6§² P¦1ô1+o9/6a@KsrÓt²Q:ó¤É*yNg¦ïòZ`Ø’ïÊ0I|Bo“¾+Æ›;Jߌm‚c£)8>ê_ß66G¿l'œUöŒÖù€²âº k³°6Šóz×:ê÷‰“A®[5p¬zat:VÝú¢JŠ |5à·ªÓ’ä\bØuª/ZÞÃÙ1˜NgPæ$sã’Y gq|Ñk³ÞºGpÍžo󫪇©Ï7nQõ`èL2‚´vŒêàä¸åÙþ kÈ÷Ž0¶ÕG4ÆXM±Ö’pünx;lÂÙ»‰ùQ ‡½yÃØn„ÂŒôó—-öMÀp-°¦dhó/üø÷Ú´Sƒ`ÁØ80ËtŸÛxÄ+†×w-LSœ­u|è^°å 6óFæØ8ÎÕ„\ºä•ñ~bÒ|nZ+ˆKdA ›@#6Çñ¸1ð\lÌs™á!PMè#øËA¿oÀ“QO ~Ê"`ŸƒB“?͡˖çƒÐÎÑ@ÜF—j`‹õ^5~¸þ—#t-µ¦s‹†Q"›çV ÍBA‚Fñ^ ̸–{=0ï²£«àM`Fl:’°#x˜À±{š3w¡È3Ÿw 7ÿ9-‰U¨¬®Jt#ŠwZ9¤Q°ñ¶Ay|ƒßÃÇGOï>~|pxÔÙÀY_ £m°îoëNå@Èi«¬á$.9§Á¦·ä„MuðŽq`’v üTØqpß—wÝ·#­áá‘ÑwœJÞ!,ç˦ÁäjÌ/$®¾m­­­9ª¸î«!Û¾Iß_pëž=Hs·%À~k¿;÷¶ˆ½*‚,/û ”M±¿w0)ø r“@Ç[$ø&(o8 AðaÓC´ ²'ø"T|ÞüZ)t \üñ ~wÑ3ßZåQð IÁ÷0ËÄyÀÔ¸&ÖW[Á5¶(øÒº¹à·‘D‰Yº¹;ŒÆíÄ·Ê}(ºVßD¹ß”vØÚXT¼4ǽEqÊ‚…òÙ0¢3‚ìµ2`pŽþ,•sX}2×ûŸ~q÷Áý{ ×>?x|´fMŦZí@«‹gs:cFÏAúî gI/¤Õ^ÙÌÁŸ·^s|û#.©ÈªÀ§5–£_µ*PT4~‚³½Lâc狼üU+ÿ¡8ûCˆæON‡ƒe²Žㆰ 0¶a¬ ·Õ%Pþ@A–š'S@[3iÜÚc.Ì&* ™¢F3@ÒK¶1º{c1)ƼjjK@;A°yo Ç)ÈÙ©æaî'ÜsSp‘ójž5xÁw/æY<ÃY¾ ˜çз{i×fœ8¯Ut™Œ²¾³-dÄBP`ÓæjF^‰²i ß3va…ƒ`½Ï %ÝT8l»ÆÑp¾Ç#¨FH†Íc{"ͺ¨Æa´)|ènZaßÂe5Ƭ¼æ#öÊô Ø%;ÎÛ,Ó'YP&kEB¬.e.·|ÌÊ G'à½"dv ’Zq¥$sH*G3±ï·-BúéŸq U”`½O¥¤ß‡Šn!·«(¤/γylWQ[!)ÞnEF´Æ¶0b–WC?'ƒsŽ¡Dy–·2÷U,@®Ç†9å” Œu5åágOŸ~öigs@M ã,)£`—9ž<`ÛM‰–ö¬¥Îõ\•@÷j(‚r ´PBqRiß_ï¼Ò•!d"d& (‚ºÄ–Ïê'"’˜Dv¾eý:!-y[õ$DˆºÜÌðÉ+>ï¥ &ÇžÙ >.FðºmòÉJó=ç¡[]Ž:‰€,½õ6¸lºûc€˜-Á a5f)¸9»°k É·‘µê˜å9u*<Ûƒ´v‘AÙ@i,ÊGuLŠwXš%C-²) ^Xš¥$$£’ji–Bö¬Š µ4KÁ{fÅéZš¥à‚]©É«ŸXô\ÃRji–Ò™´,`2°4Kq¸iIµ4+r•¼l-ÍŠëžu&9x–¹Ûâa¿­¿=÷‚`c9÷+ƒÇEl­ ll°I†\1ëáq!eÊÆpÁ1Hfg hŠ0…ì 8àh ƒœã ¬Ž¾{†{+c!¢0±51Bô!`mŸ46È›Ææg_þìÁÁDáØ¬G:ø"£S¼ QÂy.J«gs@(£s ¼gs<6”ñiœŠ Å9ø‰5Ï´9mŽet&mŽÕÊ;>6ï*޵»Sdjks`ÝUϲ8ÉÁžF`,Kµ-`X©,|S:™t@¿‘¶éqQ à ½0­Ž¬T0@Óîåó•qœÎ™`$eÈV74X¿ìdȶÀœÊ9Éô†zLH%È:PKœT®/*h¾œY†0ƒÊ†áÞÆ:ÈKöKb­MÑüÉ–âQ2Ø2Ç„“:@ “–Av-_®W(x×òï!Ú¢à’åƒ\d§¿è¹ VEˆ¶(i˳Lœ¼,$Øq‘«oi;ª‡hK\÷¶T.ÅZu˜¹#}œ½5ß0õŠ!ÎÂt)Fòšš>—!*Ëa*È °cÚËôòE ‰A²@+e[´°eÜ:9ÛGYÈ­åC-52â9¡ ëË7D?hΊà…)ÌgÃq\sŠ— „¨ ø!»ûvÃ{NÛ¾i¯trîÇíYšQÎ0 /[<ˆO ¨=Ï¿=ĶýÀ‡{‰w+bÈÛW ÞòV7ž{~LK³ÆæmLÉ-İ…+xnoì®à53Íôò(cJ+Ä ‰OüN ”@àøpõâæÏiJ ç[H—±î'Êê'mÌÉopÓ À³Ä Hôö3c¬+–<ûâ z[Ža†t<ÿ¹©þ÷ŠäxõÅBÖÒ#G¯ šœ•AsÇág]´øG>ý-×ÛÛÄÌ3äèíjÀ>e¡‚-Fi ~?¤CEΞnÄb W+ ü»ö¨à„µŒóùšzÇ ètŠ<ýïi¡9¤ÎB/†•´ÍA ÆFÉíÕ¦¶g ìaœJ*F>ÔN þ¬Þ¤×A½3 òÍàø:wº°ÅÏx¾Šã¶™í#ƒyÞ]·Ã¼icœ¹ê,zç$¤„çí¥2ᚘ#1¶@™üKIšÃö‹OøÀcÕM‚Ü3ÇPVÝìŒuN®Ã¯Ã˜×ãÀxdÍ‘Iø™?ÚØd?a¼,‚³N,ƒvž@N<íh¼“V[¿s܉dLXkÚÌíh %˜o\é+@:w$ä٘ĵ&5)aݬROÞgr-`ûj(»s õz‹Ÿ©¯¸÷Ê#wÎ ´7›|É+û 2Æ„|J~|·´²‚ÆQ^X‰piï[èÈ ‰O\ ?«ìøÌz¯¯:¬¾Ósªx ›£eÄøÁV,ðŒvby4uÊF’€¼ àae’›çmðå@ÚÄ oƒV¸„Y‡Ì°…Öã²Ú,ë¾A€_ ãhPNØ%°„÷^Ñ7L æJ„øó–ÚaVÂC‹YÅl•“qÂãŒñUM&8½‡³­=üXºÅE½ODUë"^·‰È±tg­·õ:8%¹š;ÈFbæ[×­~k<1¥Ð<,õ°kÑw {'ωñ ç¼µƒÿ`¸ÀqFóñ¬ÍÃIÄ:N…gY £MßÆÈØÎe ^ëN>Iª’„"S^`HÇ• Žk4 ±ãE˜Ž;ãOã+Y0¢sÞÇ‚cÈ=ÇaH®gà=íôAßÍÏ@"g 'v&6ûW÷N »~,©–v¥SÃ,Ȉðó ÷r9¾a‹ŸíiòN&ÛëZµâf –"ìŠ yE+tÚ2^ƒ“JÅLmïB)F™læJfÀçp}?¢Jm2Ø¡’&¢ƒð!¡½Ú»-*‚Í¢à»6‘APɉ͋e°>€í–»“Ta;¿5…÷ÏöÈ•)¾ B}Ekñ¹3«×3œ±p òÄ…â;>gèø†ž·§ôgS/›dlÙì¬áBöx¾Ö¥;rtI}µµq®Äy¯ëq—¸¹9+W`ƒ$ÜobŸ:^¢À¯@{4ÄÑœvÏyâ7hëäí9üx}ÎIœÎù¶NíH:µñjŸÓcÔ_Uò1o ŸÇãеö'ì%(4 )GþÓÖl`מå3hs¶Å1 èÛE õ‹Å|ã· ‡ÕôÈ)}À—ˆÇóSȶ ˆÍæ–󡶺ÿbè"KX;Œð&hpÈÚ0ü;ôto Q CïñÞ7ø¤î -çèãíZئÃ6.Á¬*Êòñkj^w¦×VVHm)¸¢¯î˱.×¼m`¨Sá”~Ùf-ënªÉáð…ìég*À8‚·¼Jâ_ Bò {?[€ÞÚŽwJÉ ^£·ù:JK¸M“°Á!ÛGýrª=hêÛêM4G84À+ÅMP'~rž·Æ3:Ÿ _Y'Ì(¢òYüµÍGÞŠOÃbŸŠÌë6fº\"ÎÒɳ\µçÏ{]|'¬29Å·-¿£®ß™ 8Ýçás}}Oî]bOÌÑ!—è’c¤ƒ?+aBµ´èÆË’\iûËlf¼/ž|Ú¼jæ½,èÍÚ´Ð;÷Xñ±2)ÖFft½®G`ç5uCBMjp—Ü É°b43èSµ=§c}øm¾S9Àžc4܆>ÑØOåZ-k‡hHÂqÛ£Eê£D/le¬\ŒÅ»¬}Íðö…X|ûÌhË2¿‹\ðÙ©àyë¡VmÜé‚oRÁו"ÿìU+~ýõ‚\±Z¤IÝÒõ +8ÂNêî1‡.5¦a ¶Ø¸ÍÁç)>z¶š /ѳ´nÛ#&Ëèø@89‚ÒÓ6S_#ÀKô o´CÚ Q›ž®§:ÂñzXH”qhêÚ3*>cß2¤&ÝýÓ·ÿ{ÿüïo¾x†Äsu¤¼q¿arL¼`¢3ôà/ß~ó__£Öæ0>t}}ÏH7ÚY[»›IWR,í³eH0°2 „[˜9|3¥K•EC›ðyUÑŒ×{½€nô â‘^ ².*윂.ÕoÛ"„{Çä ¢ù$°Â„mÑiÀ‚¼Kª›ŸâÛÉx2Ò ›/ñãWwp´÷hïÿª ÿ=|¦b÷ÿg/ÔÚMû ?þöÜÆ?5 7ø¿Ý{²ÿ ûÿØâ[› endstream endobj 365 0 obj <> endobj 366 0 obj <>/ProcSet[/PDF/Text]>> endobj 367 0 obj [368 0 R 369 0 R] endobj 368 0 obj <>stream xÚ+ä2P0PÈå2µ4Ñ372s`LsK# ÇJgp…+äqÕ- , endstream endobj 369 0 obj <>stream xÚ¥[érÇþϧتäGìræ>~26uTÙ"-Âq9a…“+ )D²^¢(‰‹THÊŽý€NÞ = b3=³XHviy »§§§¯{‡´è=[£Eoþÿñ“ÛoÝ[ûsoíÎ]V0Vô¯±ê·¬°´0Ò*lÑ;\ûÓ¥|‡2þIïÀxþ=©Iå1-Ý¡\û¯oüãÌsÕÔ\¦DŠƒù¯ï*ÿ¸˜ýšñÛo¿2ˆ3œžÿBzÇ ×:E¯b¾ùº‹üœK¢™Aü•Ú?ùÇ{ÿxí ö™ÿî¼ÚJ BƒœD"^úÇe½ýë€ÇZ¢ C<5ÏÍ"¹ †Š—¸®|W?*î+,BZ"­MŠÑ[Ø۟ç_½ÁØ!–#SîAõS d‘_2FŒÅü'õÞ_ä,+eJg]oõ³iJ,u)6®v2?ÛÙ½ }5°_B‚@·¸m;óüXØï³ØŠ£s1 ™#p¨â1 m GN´v †tøHN· ò*z~©=þÆ?Në5+ËÿH²$¡…+k^… ^ÕÔÿ®ú<ü Œ É ïÄRNBKÓ1ÍÛúäÿS/ò¶^ómwŒp‡ÌSíþU@Èá<>'ö­üÝ?þP FœEb¯ëžÖ«\Ô™¤qªZŒQD©ÄYÏ‚ñ}m½óZÒë0ƒŽùoÒž%%JÚ$õy=aÎ r2Mv#‰•*ç¿+VÅI Ö9|¤Q ¤låB 70ïÖÿ …Ä×>éÓ]$â9?ƒ{_Œ8´Â1e׳_ZE84ñÊaUpïÅ $tÀI¥¹Â1î„È/j[þ’ _@aŽÉô¯…ã°éæHë&šˆÔv ´‘ .K €hØŠAßi¨èj))1íK„ê¾Ù}-ë åpŽ2íµ;( Ä@Ùøá¥òù&âyÁ뎘@¢»a‚6ácÇçt?Pl²sà ”¥è»µ¼–Í5â_ev ÅÆ(ƒDà´É¹æ(D%œV (Áú|‰h¦Ü:¢6m*h"Q0ð*É[xžRx'äM(Q Ð’â¯ÂL£f™²n8¿òc—„+dÆÎÂBøl½¶÷NΆûÜñd‡Ò']‰—¸J´¯ÃCû-1Úµ³ö§Û‰@ûW½ÉÈY¸[Ž©" Ê(•¶Û°Î‚„·fÒaÓÞᤎ÷›Ì;H¯¾P†2C‡eÆA»ˆÉšY0$Õ —7>œÉ*ÁE¬Ñè—©U«ÝÂfГ¯‘)ÍÀœÅ%¦\š—¹…iðQ&м3€ ¢Ì¼b@¬Kîu/ç-&99Ë:XL@·Âi†rIÓ‘Àÿ ÐV34„éîj‡2kËå €„œŠ÷ºb]#°»NùqÿÖÒ žL>ôó^(1õ¥CPZíXV®>1q‹]ÍO¡âélJJ>#r%YŠIçŠ)„yÛ2qª–Í--¦ ·µR1…J9/‘裊 øL%Ö~N7ÏQï)Є3å‚Q bYfþŽTÞ#}õM¢KغÃÔ ò$Ä‹°­²àÛj9Vü礈É33Á¡£21a½íÅSí>ˆñuÔ7R‘ÔL¥ØÙÅÔ/±ÿ6óâE‰™ÅÖéP¶¡`0‹T=‹ïqŸQÛy¾ä¸hhܹ ÂôâÝ1¡ å_â«„ý1ÌûPþ-¢Ù®÷© †aê¯ýãž|¹H I’1‰¨ÿzœõ£°¤ŽóÙKòFÄmõº¸Ãµ Æ; æá(.C÷AnßEsß$t¢+ìû†áñ>tôгýË Š—M4kÔ`¢Ì•!îÛ²CBÁt"EßízÔž*»Fü«dv*Pl¿W™™‰`Ħw¨ÂË'×aƒoË?°g QT…ó ›ZÊe½1ôRƇA$){oŠ™Kía6d¼Àsåã «z½£«õ 9Ö%½|Yt(hF¤uiçû5¼ï˜ÃÇ.ôiŽEøOZ °Z"êf†pÝV r¹¸S8¢¬A”Qݹˣ,Ä i).±Ý¿?lö·ú#òtÆ'/ÿ~ÔߌŒ×{U«wVo3¬b:PYEO¯>91и'Ív+:­å»Ð¿ò2óŠD1Â<6ZjøêÕ(“Ë ßÀÍ)'† ªª÷ßÔöpÍñ³J«,aÄÖü)•(fß èBøLާ­Í8(à_l¥\¤ù®‘ã> o«ÿ´âå¢êY-pþ’j6ky¢ (gm—"ø«Öée/ÃþJW·ŸbʸÞ1€–ÊØ®V…è…þ »y9WµV˜ºãmVN8”¥ˆ} ìBÙÁ«ký•Ó‚±E‘²êoJy;Ehª×Ûñ’mI…SSÑÆ<§ €v5™aăÊÐÇr²–ìP§U½ ï]†ï(›7Òÿ›[ÏE}/-ÚÌ^Jýaðx¸_>.vw·×ïo=Ø\ßÞ\ßÚ½Ÿ„ˆ™sù`X.ãþ>ÔŒãΧÅv9œ‹‡ÓÃïËñ¤˜NÊýb0,6× Ï]Œ¦OàÇXTQz+£ø4þÂê‹ÍaÑßß ŸÃòY1©–û¬8~ZŽžùOöûÇýbr<žîOÇå¤8ì?/Æå?§ƒqYLGðéàhHâeÀx³ÌÖAÙŸÜR—Eoïhì=xó @–¢ác¤xXëUìô'¿ÿÙ¾ïõw'à¸ó¯»3²™/Êô·Ñ™œ_õì*6|4ï•,Ö7QX¨ZþP ]ŽÁv~׫ë­Mío°€ ôN,pØüyõÇc8¡Á0˜Ø4âà¿¥[Þ‹EHÀýj4œ?ô¦X“XI˜:`%MŠ{Gß÷æ‹}„dn¢£0dd· ~’\/æÈ´©¿Ö݈°ñN[ÌIòóañqÊøa×B¨8¤ÌÊ^Ç]Œ’RJÛ…8¸*mí“17Gå¸ÊH^iPp:™ëŽ9}?eçÍõÝ*/oo<ÜÝÜÚx´»Ý[ï}³ jïÌjåÌY !÷v>)èP4âôËý_K4 mËýÁÞñàH©ýƒdмBÌÕÞ”RhëÑÆ»w×|Y´èÃb¡~2ݨÓ{ZŽÁ6ã²_¥ýœ.þïÉD‹.½¯¶–‡ÇRKÈF™Gåþt¸ßî=Ïëa\í?)=À$ß<ü¢E ô÷éîö‡ÅdTB]Íj *â‹Ü]¸»½µ±Ñ¦„ŒeJ·è´[GÏÊñò#ñwPÚÜãÛîªPºè­†ÇåØÇNUôËñÉêÃi«»>xØÛýb½·¾»ñèQ^!Kõw)…¾êûOÊCŸvFã#HUj׋ÒV×Ç­4ʪd"Ž.:íì°&ÓÑèÜvúýäùä¸<,FÕ¯ÃÑô8«™¥­¾ü :ÃÅl$ÏÐEWnUìhzܦt¡m>¾ùMo‰j.ž†PìàÕöú£þÞà8Ÿ$]ê÷Ÿ¯o­þ ÷]^Áþ¼»qÑK]Ô/vØwþ±³ã©7zk_¯ý³z‡sO-ÛÁšò=+ ðíÓ[º…_¤sþ§kßCû¿„_ endstream endobj 370 0 obj <> endobj 371 0 obj <>/ProcSet[/PDF/Text]>> endobj 372 0 obj [373 0 R 374 0 R] endobj 373 0 obj <>stream xÚ+ä2P0PÈå2µ4Ñ372s`LsK# ÇJgp…+äqÕ- , endstream endobj 374 0 obj <>stream xÚ•˜Ïr£FÆïzŠ©ÊewòüCG,!‰Š, 8›rŠbÑH&+½›wH¹¤rÌ›f°åõh,šM¹4®¡ý«îoš¯Á(zèa¥r™É϶wõ®¦™(ÚôÂò‡ s„†|Ô7éEûÞ›«w(ºå>Ù¡‡¤Ì³|‹*‘WE‰Þ]½~;»™}|ºí‡µØd¹@ž‡žåÇ¡íÆÑÜ–ñ¸¡Û7a2?dác,÷¸nß"üãzPjöÉk–u’oEÙŽBÌ>íD™XîÌÚYR=*6ûì…ÅñPZä›l{,“:+r$ʲhg˜fŸLŽ=wêÌb; ÖzØ‘Ù7^ &â>K:2=¥ø|UÝ64ûlbÿû7AØï =êÀì•dåÕq³ÉÒLäµL[±k”ÔÁe˜ý”07\Meμ€µÑƒrSÕö)]»"ý®r *¼ÉÔÂ?° ‰`=*êÄOH›$ÛKÑÎB1(ñ†ej9@nÑC¬êû²Û2Y‹u; Æ °’‰= ¬ ÀBµ †‰UY[ã΄# ÊØwåƒé‡X•pFSôñX‰ªa€aÅÒq|½ ®G4°*×@¬¹ì}é×¥œ€J ìÉÊtÕЃ2¢ ÕÎÓ]Q5%I¶ÛRl“Z â žš¡ìÑUÔG Y”€¶ÝqlÍ‚ØóMzTBT _b<”b¥uvß}È L@i?3ú2Ÿ'uµµÐÜ$ªÀ_@=Köíoen#ã#ª]^?Õ¨ïH9$ªÞÏd¿þÔUQ>  üåõÂqŒÃÈŠšSÐÆeêq ¢'¯E)Ÿ¼¹Hk4öW²ŠÇ]ÝNÅ)xdYºÕ"2•è1UOÂÑHvõZØ“v$JAéÏmkÍã&D;“î”8¡ªòçO§’Ë6*LA±Ÿ¨žÎc+–nš˜IUŸcý£ÈFü‰î;N¢î Øª²?=ööYUAn— ((öæ©·tB¨Ùë–‰ô‚7y²rUcåòÈgÞ¤qq!äâˆn—c¼ÉÇ"_ƒ¹¡¬Ó›\{Po¢ºIb„©êvEýP”Ÿ4Þʃ¨l׎NÞ ÒÝ5™*ìiVîå„ô(œ}R§w¯1舞Þ4ŠYZÑxpèN‰™*_¿,6ÙN cžHosiÜ`«@ ²xÓxåZaèÌ\p6¡º¢» è¼Íúx8e ¸JÊy§ž]/ŠÃ•ï{AÔ¥[*ÊøÙDYÒþ?hS+åð`éyr¸y™—Ú¨toE Wõ=Nv;4÷Û90=¶‹XÞß 'bò sd–o 9pw<9ȈwNŽ;õÝ‘!WUÖE™l›a仚3pPÓaäÖÌVšt—ÁUI¿x$gòrò[±¸jº±“ÎDimTºC"̸Ц÷ÙÔDÎF½t~Ž;pt{Dˆ¡ŠÙ> endobj 376 0 obj <>/ProcSet[/PDF/Text]>> endobj 377 0 obj [378 0 R 379 0 R] endobj 378 0 obj <>stream xÚ+ä2P0PÈå2µ4Ñ372s`LsK# ÇJgp…+äqÕ- , endstream endobj 379 0 obj <>stream xÚ•ØaOÛ8ð÷ù–î͆N©ý¾*/.ÏGã2ÿ˜ãIùéúj ŒÝ¾Ê«?æyݬÚîj³,n_3þ/‡;š :§[¡¥•Ð1üJ+t¶BN³¹Žñt+yÜ*Ñ:–¿ÒJº[ šéX9Z oÞ?W–J©Ž““•LÀsáî48Ñqz¢…S¢tœ÷q[B¤ÁR;…ïûX %’ðÞ÷ñ(’4¹Óö¾ðØû>?Š îT=©—m÷ä$Äy€êÉŽ´‡PB‚•æNÒ/*Y©Œ¨žœÜ‘0¥Á)wª~QÉI%<öäôv”Ñ`Ű_T²XRRØžœÞ‹4 Fq`{ÝvÕ}½ë4𝾹()ºGoó¿NYªh²¼í•l”¸ÐÝWòXúB’¥¼í•,”d&t÷•<–¦49¼í•,”d"t÷•<–f4Y ß¾mA$%„mÙ¢ôªi*‚o¿¶õÛªEéQCg")À¹O;zpüÜÃMEÒ)5øæ KÌ lÔ¥Û‡¤s¦à›3,¯hL lÄIçTàsjë!1Ì)x|H:ç ¢Ï©­`˜Sðù ó ô9µõàæ|>è\}N-Û+dæ}>è0)úœÚz$æ}>è }Nm=¤ sŠ>tl”>§¶ Ü¢ÏU@HŸSËÿ:à2Ì©ôù ŠÐÒçÔÒCd2Ì©ôù S‰H¥Ï©­G"ÜJŸ:Š%}Nm=¤ s*}>èü!@õêLaÛ¬»vÁšÍòKÝ­ØfUÏØ¼1 ±íBìa±¹7OiˆP=2vÆ®VÍfóæž5õ#›þŒü}ÿ€U]W=mCÍçϼA[•«¶zØ/»zÕnºi½ŠîW½N³ÔÒ$uõ÷ͼ«ÙæaV­çm“K´êåßÕLõÈ̯ÿþí¨¯yü¦‹êåÐûo®+‡WÅ»KÖßùáº[ìî;ÛÞyÎÞ èY™•oÚGó÷w®­T¯…®}óáÝɵÅÑ<ÛS2k_Gìb³^· »l§ßH‹Áqø~&fˆ5ªçëoMúÇíáóöäqý}¶'.Í1ÕÀ‘ÒÛ×Üán~Ý÷âG§î¯ÿ}`Éý”]@= endstream endobj 380 0 obj <> endobj 381 0 obj <>/ProcSet[/PDF/Text]>> endobj 382 0 obj [383 0 R 384 0 R] endobj 383 0 obj <>stream xÚ+ä2P0PÈå2µ4Ñ372s`LsK# ÇJgp…+äqÕ- , endstream endobj 384 0 obj <>stream xÚÍ\ÿ’ÔÆþÿžBUŽìr†ù=ÒŸ8À&€á †Puµæ¸·wÞ»³C!6P1¶+`'~Á¼Bz´»³šé–V:­¶RÚ•®§§¿žîoF³jñlçÛ-ží<‚Ãøÿdë“­óÛ2+²Ç["ãðOdEž9³BÚlç`ëÜ{{ãÇû“qvóÂî›ní^¿xi÷“/vnÀ—Ïv/ÞØ¹}=Ëž»3ºz´ñdúìÆéÁÎó,ãá\~¸óçH¯,˜˜ë=ÿQvñôøäð ÛŸ|3žœNŸg¦ãQ6šìe÷ÇÏö޳ÓãñüúÎ|ßÙѳÓ'pšj“s­ÙGÙÍI6ÚÛÛŸ<É&ão+ÊG^ùát¦ûãìñh’ýõ€ŒŽŽ¼ôt:zî;ÛŸ¤úyÁÔRÿ̈ó‡£ÝãÃÑÑâsw:>><>³G òy6}º?g§G{£“ýà K´Ú¢`:h=Ÿþ5/˜YzjŒ}à-ÏNžÁWÀþ›zÛOžŽ³½ñ7ûÆÙW£çÇ„>W0[3¢×nÜÝÝ~°{éòÝÝO.ÜÏÂp^Û›^Û[ ¦à1rÑÉ&ȧd £`¥` ~¯€Kp •1t+]&8‹óÎËø­šX¬a:¾0‹m„Ù§óëóOá¯Ãwábyé×£\]ô÷_,*Ûvþ9×#Ä\ޝój?•~¹!Ù«7ÜÙÂ#]uÆ®øE&xL¥_ÿÉãó gI[>Nâ ý`|6ѯ Uÿ>Oa)<·zà!õÕÚâÌÑãð¨xefü¾\½Z™6w$¡a˜¢“J'»¡4—ãÕ°Cn ýws eO<|¢°TZ«x·8R¶ñŸA„‹|6óÅ›p{øºaÏK(X…XB‰ÒË"¼ÇÐ0Ö-÷'® ¿àÃZL¼ÍñŽÞMŒéyßÚá™YÎ2~pfî§%3#<bæµá[ÁÌß0ÌÜ©¯Öî~Ì\«¶%3c˜›efœ~:E¤%ÑŸR)cî­·CðCŽˆr‰w‘>¥>qÑfM¼üoÍ–ú&fLÁüT‚Ú¯fêš±ïÈÔXK7¦V…,š©Uî÷*'êþpÚ5‚³ž^¼fžÆð¡é>pH}uf÷béZ­íHš¹Q’ƙב£yʲ‘‹•u¬pâì\Œý… ˆ÷!$ã†j‡8˜îÞn<Œ•t¤a]@{9< Ã…Üapî§%#<"âµá[AÄß0LÜ©¯Öî~T\«¶%c˜›åânni½•A¤5¹•ÑÂh+û¬%Çíâ•9ËI娗‰ŽÔ+9˜0ü.²‚±*Üð»Èýñ´¤^„gCÔ»6|+¨ã†z{à!õÕÚÝzkÕ¶¤^ s³Ô‹Óoë`ñeEˆX\"Ô-É3n'¾$É»´+yâAíFž²`Âð½åC-nøýƒþxÚ‘'Ƴò\¾fò$ð Bž}ðújíîEžõjÛ‘'s£äI¤ßZÈó~#ybÔíÈ3i'îSäI¸´#yƒÚ‘<íìùÍÁÉÓ0´ž<{ãiIžφÈsmøV'Æ7 yöÀCꫵ»yÖªmIžæfɧßZÈóA3y"Ô-É3n'ä‰]Ú•<ñ v$O¥˜ÞwJÿ °ž;ûÂiIΆ¨s]ðV0'†7 sž©®Öì~ÄY«¶%q"”ƒòæàn–K_M ÁIØ•Am­aØ“älñ[,ônNÝ4ëlYÖõϘB}¹‘+Ÿ¨În¿TZ:¯F?þ§*Q(0tøŸªúãiG½φ¨wmøš¹—À7 ÷öÀCé«·»ùÖ«mI¾æÐìë!"Ø—HÄŽì›’pk`]䟙¶——µ¢qÅ¿råÃbXÁJ®Ón Lhif`òÝ ~tŒ²­ÊŸsf…@-ÎXÿì˜3)[–ûÆO2™ûß÷Rq¢xÜו)Œ‹,­ÆeÌÒ°œhýs”²Ç_²tù°t¾ûjéWqh½‰íuÍ `²—„ZBR;––vC»8ó%Ђ C´²"[KËdîh]K²} cÁóà5d† Iþ ù÷üàjWïnü›##K¶“ã ‹½A>"z¦ZoÿԿЪ¹Ö;ZQ늓µÞ©Uëm­ äªõvn£˜ ”áZok°ùd­·¸Ï†Zo-±_VÕz—쟴i¨õ妻hUì-ػÀðQ±wAø{çÂ"©²Œú<õtˆ°‚*JÄryY|JÄÂå侦Ö*:Ð?' ¹5Å £Ë7‘`zòõå„e¦ÖBÿæK¤MS½¹–œKÇsµÜ\pf¥™—›CÜÁ÷y¶$ÎgÂÕ ó*óò˼Üg¹r h¯Ò"9‹V.ä³.K=óï+ë¾ý;‡ $€°Ìå®c¹ª.8ó“EÒøv,£ËW¤B×âZrΤ'šDèãe–/‹ÐõíxXÐÍB¢¬M­2‚R[¬|6•ÜÔÁ®E…ïj»%¾È.ªÆ7ª/òM%é*_ÃýF…ƒ™‘)+èÇÈÃË z¯´ŽÇö”›72;¹“ôïrPŽ@·ò¡=BsçòC¤£ùþÈÂLdò:cÛ¾ ͲÜQˆÛíQ-b2/·²9fb™ ÄÌðµQgzÞû¡SéjÞ%þUf%¸ÓNQ³–su–·Ž+ ÊTs”Ä2ÿ‡QR_q¦h@xÛýjˆšµ¨½Ð“º <Ü%r7 9¡¤í¦6N¹I ƒøòçÆwûý' *˜+¥"éHJûw¼&Råc0bw¾ ü|ëëòFñŽ®~1Ë'ã“Ùo&W¹‰.Ú?ݺ—M@ïÿ¦°ý# endstream endobj 385 0 obj <> endobj 386 0 obj <>/ProcSet[/PDF/Text]>> endobj 387 0 obj [388 0 R 389 0 R] endobj 388 0 obj <>stream xÚ+ä2P0PÈå2µ4Ñ372s`LsK# ÇJgp…+äqÕ- , endstream endobj 389 0 obj <>stream xÚå\[¯µ~ß¿b¿T*Råø~yEM¢Iz G!o•šqà…ÿÐJÐ"ÑF*ô_ʲ=7{­í±‡qveÎïÏËëfÏZ_感9üùúÕ‰§ÏŸý?^~,÷f®õžIx 6ƒ[îMpo[ÁÅFõ·öØ-\ÂcãÁ%„ ×È¿Üô; î2o{¿ù^éR¯´ÞŒÇqGöf9ß.y³Äçç2¶ŠOÈ ¤iÿM¢Ê`J¨Ú-åç‘”pʆ’ÒÎ \|M–… Û;Ûl²jL»ÉªÑd“Uƒ¨&Ë@˃qŠ×O6 ¥dÓŒØdqBj²¸%Ô'›,#ñš&KAÉTÃ÷š,8–МF“å´§—èj²¸À‹µš,ŽÍGM–'|„›¬xÞU ¢]qu¥™¨ÇŠ ‘ftåˆôhu0 R*(O';Tù°³´ƒ¯¬ËÌIª›ƒ\ùb Ã7 ––™BYo&È&êf¢l"y¶ 5Y¤e vj☖›Y:4‚ÏÒ<ŽÔVÈðÍ€™ÖOóç›ýþEA} §ƒÔ°ÃFÛëà´Rõägu‹£¤­1e÷Ii¡‰ª0›ØPÇW²Ú½‹e&dѺ€½ðD8ä,¯Ftš—]æ¾¥Ö‰j[*Ì宥^jZ$³Ñ*(ŒyЗJŸ)%è7(}¤%J™†œòi¨Ìj¤7W%£à”Д}vS#âûm15•%ÿŒ—ï—z%Õ:?¡ŠìŒ%„ìVHÁø‹êöWHÞ9JJoÕœSÇx¨9àáÒL ô;¬šgyJÕ)õ6«iÂiŸ“{oçâºÜþŠKÌo§Š²p({jÙ¡T‘P¢º‹Ê÷§ TãÎê!.Ïïâr‰ep¹—”ïÞøÂG;¯mW «gs±½}üž×Ïç>>@èRó fowЇ tŒ.6ª3è-ͤá±qÒ2\ßKh·]£‹ê nå1’Ñ%> endobj 391 0 obj <>/ProcSet[/PDF/Text]>> endobj 392 0 obj [393 0 R 394 0 R] endobj 393 0 obj <>stream xÚ+ä2P0PÈå2µ4Ñ372s`LsK# ÇJgp…+äqÕ- , endstream endobj 394 0 obj <>stream xÚí›[%µÇßϧ8/H‰¼¾_^#v”–Í„Vó ÊD /|›€,"…Oš²Ýö´]Õ7(bÎD«í™öü]¶«Ên÷ïøðóÕg'~¾ú+\â¿O?š~yþôôǫӣ'þ,ÄùêÓH¥âüÙiˬVç«ÛÓïn8çî÷WŸÔ¿ .™vXôV¼<Ž—w¹p̸€äo7"˜V‰n¸´Næ$!Sª‘iæìÆ8ŒbÛúS«  Ñ¸óñò—Fi=³7ù¬º¦õЇ{ìD[­¿/ïÏëH!˜À-Šgž™l¹üZì*—’íª0«ÓÞdÙ¬Àæ&Sµé÷h“ŸŸÂÿÊâæk6âòN&½«^5iŸÕUÏAí ¬L Õ~ÞˆgJZ$z§ïF¢?ÜÍÌ:ÞªeOj·Ú™èÓ·¸:×a}ÑsýPРçŒC(¹Lp1Ô/Éá )·û—tcîW»ž[¦%ösòé³~Iww6ͯGOD›Gœb=dL*µ&µxAÆ¥ÅFäŸ\ÁyÃ…›Ê ñ÷x/i/÷¼û»mÿ^Ëì´A姈£~sÕê,SFPã³e!-í œ lÇŸßÆËñòu¼¼Š—ïâå§6¬žIʱJÇŸ¯k­Wí#”³`üb¿ª-þP»òy¼|ÓX PÛ9ÊJòæOµZúíßñòãÜ@Éëá‰aeÍk*w:Ñÿ w¸žrƶvø<§æz3k§Ä|öw¥Û~¥öŠzÂXk½U;èë~6à(ãÚµOÂ~ˆª‡&r²Ð°åÔʬ‘YBØ’RVg쀕Õ³ Ý—„/f¢…T‡ÇŽ·æ~ ç3Š×Î|î’¡M\xáð¤ñ¡Äµ:íu±‘Á¼U°Íƒ®>ù;ѽ‰îõbÞ¦è¢QíŒnç²k2ºØe¢‹ F^…½uÑmE¿ÁèÖzóûcÏæx4àlèUÈë ŸÛýšyÂÀæ†MÐŽܰqo(+ëIy ³ <ãvyfõ¢ ˜ÕËI˜Õ‹(˜¥µ t-ºˆ¯>¸Éa¬ÃYDwŸÄY*à6Wp–äØ/ë8‹3ïqWx–…WE²‰@·+¿ ÝÒ6q·N·zÑÝêå$ÝêE³­8:‹+ùFG£w‚A"|+Ý#é•3¸Íze¬Bò÷×Þny`{a^9æna/¼Œõ»rù˜·¼cW†9E=»Ò° á°¬±+Á” Dv´'ôTL5Âå DZDZW©^,²­ÈûÊ™mIe˜‚Ÿ·ùÆ2#U¥?‚,Éæ%šI§2"º»™”æ"ñ® Ï`*šd‰˜Ù¼DZ=ñ³zSð¼P¥ N²9¢$W˜•ˆ0u"š¨7Û ÒÇ@bpŸ®ƒ+ÀÛ¿¨v¹4 J#Ñ;ýSZ‰D!,Õ·¸ ¹‚‚ƒÅC! Ì%¥º,=úU ×v¿ äBý¢ W/Z†\½r rIXÙüYÁ l¥YÚñä¸t¢{¹rÄq¿;È"4 Ôø6!e{ra#» ×RÇ aeïnyÊØ Ù}lý&¬0ÆÅSï(‹Zùopß\ìÕ{ÌJ6¥“3Œç»猗y‡=K4™pj¤Ö~N¹WS1¿p´ó6h–¨¿> ¬ÆSÍÍ#›v·Øùýóö/ð¼±·¢KgƒÓ E\¢ÂÅú%zª (÷ Õï6¸—D½=„<è¦kCòë!aelÈà˜Pës Õ\0Œ!GƒÚGÕÖüU ö×8SÃ6ãê<ìÅÄF`[Ñ…Ä£ÚÚÎe$0%\v ¸ØÈ`t#ªSr#º­èÞD÷ƒõè¢QíŒnç²Èèb—ˆ.62]-Ò{Ôzt[ѽ‰îËõè¢QíŒnç²—dt±ËDùU¸¶޹ Ö¹v/ÚàÚ½œäÚ½¹¶:&Öu§6á‰6Æa཰Õao"Áèøñ÷m¹ñ3TNdZ^ "Ò>¿»™¬ÇÄ'M°^ÀEÏŒá‚I>+pSûÉX¹Ù{˜3Â*­ÌÁÜ}mò0g/"sö¢cœÛÇ™2¶Î¹=Ó‚ Á¹ã‰§ƒ‹Ï¼‘n̽ݭ‚¹Q¿(ÌÝ‹–1w¯\?Ë)`£ËùÒû%,­è`îpÔížrf¬¥†·I¹)ÛÔÙE¹—ú;F¹ +cgBâ‡ßw§´ºš9&íHªù4ÀÕ>ÿØ?¾\Ð}ýÖÁ½®ÄóMX¬œi¸zi\Ã’+ÄÃäêœôˆŠ'äâ÷âfĉt¯7-58ZýŸÙç¥åü²GÕw{Üè`¿Ðóý+éÓúõ‡I+ºX‰GµïµxÕe嵘pÙøk1ad,º^Á$7ëÁm5‚+Ñ ö…¶ó +±¿Æ‹m ~sYC^Øõ¸¶šð½å~¼£_[îëïûÖ2òò‘/-##ûÒA{›¾ì,a“©ðñïëånOûeÝçþ§I,x±7]l¨¡Qvgé5x®Jð1‡ãñÕé½Ó?“»…« 雑!¥|sÃÓ[sÖÍŠi©ÿñéÅùï`÷¿ÐxÅs endstream endobj 395 0 obj <> endobj 396 0 obj <>/ProcSet[/PDF/Text]>> endobj 397 0 obj [398 0 R 399 0 R] endobj 398 0 obj <>stream xÚ+ä2P0PÈå2µ4Ñ372s`LsK# ÇJgp…+äqÕ- , endstream endobj 399 0 obj <>stream xÚå\ÍŽE¾÷Sô±+A:ÿ®Û‹8`Ì€íÑÜ,„$ö²ï€e c1ääØÃFVueUdDeUõaåfd9»«úËÈÈøË¬È¨‘û³ÿìäþì14ùß¿¿<|¹w÷ÁÙîÖ¸Wjöd§º»jå>X/¼5û³ËÝ?.¤”áŸg_¿[aC$˜ss;7ŸLÑ) AÿkŠQJ k]H0.ëXœC8#… ¦= e¬H ±ÈJ‘¼¢ìçæs„tRXEǼWdƒÄ¢‚Z;÷…ú§¹ùõIZÄD9¾ß1CàZI€ñ#<ÌÍg¥¹O¦£-HGÒ±þî"¸×"$:ûÛE`DtqP!¯4A½“›[½ºA=’Ò8Æ,ŒÆ¸$¢õœù˜üyg 6 ˆJóñIQ*’‚1ìÎóÆ~ûlžåÀLðzÙ_€øý7;f4s݃Ç6 ©à:w¾µ{’¯ƒJBéå|&¹ë žÜˆÂõ„‡¯]D ]“&}ðE›Üðý]·Ã÷LSîïÂÿ/‡à“¦±¢Áhµ:†"AUŒö^ 3ÔmÐBFÒù>Æx‘Œ! (jP„" ÷FÇ,Îða¹w§p…ýÐ BÙj¹ºŽNHMgBý49°ép¤À¢ÙÄ•’ Y³†­ÑK”- ŠÂjªìN¢÷ê€}tŽu뎪ŒV¨¨ ½ˆÐë€VX­`Pªÿ”9(è ©Â°Æ0¿çkÍãäp-«ß=þ½ÜŸ¡£=Š1á p·DAÑ€ wk ŸÖVn팆%?ÎÍÓÜü”›ç¹ù%7¯‘®´ÌAŒ16^•^ÏñB«a5޳ìþXFüµ°ò}n^âU5Bâ„Ó óuéÖ}û-7רñ{Óñ1 ãu1sÎt*PÅ–º)þP¸¾ÆN †±»&ð¢Ì¯“ÒϹÏûR€Êóö  eôæÿh¹Ò,Öc:rjÑ =cj‹f<`ÒÏXÌoÇÇ€ïÝX²O[ž©ñà­øD¥wµ hû.ïnœ Ï‰ !80Fß ö¦³òâZÏ‹ÑÞÀVšéߎ °sðŽõµMqAÃSH˜e~}\€…Èxß^R*Ð[h/ÒMÆ–õ`Â3Ëz'“¢Dð^öÏNµ%¦à%JÅIl‹va» N†ÈFå¦%ú° \ :å>l*—Lj¥r+‰=d•K%v„r)‘mÊuÉ€uĶr+ÐÉ(÷QK¹tRë”[Kì§\FbÛ•ËÙ¨Ü`Á:Ò‚r1èd”{ÞT.™ÔJåV;g•K%v„r)‘Êuvf ºE˜·Pµ¥ßñ[Þ©Öëéödžm\å¼ÁŠMÂzF\‹Ïf V*äf2:†HÛhÒšÍX;;<›ëÓÎX×h6c]ƒ¸Œ5\,¦«‚X&áž1·¦«£ùhÒç«0èá|uòài†€ŽËW›1‹ŽØÌW»Q=ЩPG¯ÒÒ)2fŽkÖËl k—°®Aó ë9“°Nðp“"|jì\vá – ôö'¬m¯pÊw•°vV@la¦·”¯æ(oÎWS"«òÕsìnËW3TVî‘ËM¶¶a&_=XmÈW‡ƒÈ(l¾š ê!ÒÚx3³ÔD΀Ó|‚Ú‚(OpW,1ó¡êÌJO½ŸZõ¦„4í¿*!Í {DBzŽùõޝ¼ÐN-8>áø¦ãC,³°ëc=ñ,x'lLƒÓË^\áX/6 HíÌi‹‰ø$Ñýº¬TmÍìacXÛ³R ‘mŽgr1“³mÇ«@Û¯&°Æñ˜AOü„¢ˆÓÁVÒ¹EÇ«q¼ãYؘ8Úbªê~ãÕÖÌä0†µÝñ"O瀹°Õ­@G8^E`•ãÑAOüô¨ˆSõRYt¼ Ç:žN9ô¦Óq<¢û•ŽWY3{ÈÆÖŽG‰ls<ºœYÓï0f»ÛUý×xòÄOõŠ,áÉYW¥pœÓÕ8Þé,„]\ùrzbªŽ¨~ϵ yp9jUÛ=ŽÒØèpåXà7c%ô·?ú¤óÝxöI ¬:üdä|Äé'C¥mïK!³Û>î²ÆäØSË|¤3g§u*ܨHz¼(sYšîò’8í7 D“D‰ÓxZˆa.r¾CÓŽ/Ë`cÆæŸ%:`ߎϊø_”±+_cQÂYÍ3½N:¿µ£,!qóËר ÑDŒŒ"æ 4ËÅ÷„s£“!òÃv³}UšqØ1íõ †+ ÃSâ1dž(§WœÐPüÒ° ¥ØRÇßï¨<†+†º³"iÇóÿ²ð±=°!ñ’SH7'ùÇI2¢ú âjœ#-œ…&&è=î¿~e‰ªÀ³Œ!hÎA¨n•ŽBIÚ»wãúÅ6 O¿5òUQOGý÷ÒûŠ_«TôBAÿš öÕsóç†òûC0«fyGi—wÔh¶¼£M¡B}ÜVBðïRÊ`çÒ‚ü¨Þ?©ø=,'ü8;æƒP©-¨\Ä‘‚% \B€¨8™’@J8SA¢!ði¿5¼y¬ /)Êð\ ‰ »À±\B1i:Ø\ I~›êè6ö¼™šÑEý¦¡×Tu/¥§ÌaØM\Я1@kôk¬ƒhbÃp/aŽÀa‘ñ,†l™ã)Í ÐIоíÜVæú×v«4˜’^PU`ÓšÎæ3\YÑ×ÖtGÆòð"eŽc%Mv\z£‡ã;]±ÍX÷ýPþ¢¼~âùmÜ8íIoôðéÙßõ?|_¬.ŒÏ+Á6uûëš^øHo\ÿó®`ª×5óë^‘€Ž+q°M€ M¬§ °ªDà‚Œ2;ÉQƒçŸ-l å/Ël å/„-®ü¥Í—¿Ôȹ÷5ƒÈñÏä÷Õç^×´‚Aoõ‹?è›ð]U¿ø(ŒSÜü–Ê_8Ò›Ë_(‘Uå/sìn+a¨¬-ï-‚5p´`9tC QÂH¡þ 7OÙu¨Mlª¡ýWÕŽ0ÃQ;2ÇüZ¯ ®+o: ÆœJÖøh{ Ó]—P&݈Ðb£º /*à-–Ÿù`ßC‰l2ç»LrÓ0æïñJ+™ÓÊW§â*oNqñ⡱N«ÆÃ³¶Hfdñ¼éÓȧ»ïºdË%´!éül÷[¦²Ûý÷¸É-úµ{°ÿèþAK‘9 endstream endobj 400 0 obj <> endobj 401 0 obj <>/ProcSet[/PDF/Text]>> endobj 402 0 obj [403 0 R 404 0 R] endobj 403 0 obj <>stream xÚ+ä2P0PÈå2µ4Ñ372s`LsK# ÇJgp…+äqÕ- , endstream endobj 404 0 obj <>stream xÚåZY5~Ÿ_1á’ãûxE{ˆD6»d7aßH„²Hð‰ˆS$òK)ÛÝž.WuÏ„¡(žiÏçr¹ª\®Ï½r-áß7W²|¹ºJqí­)ÚõM}ðBÉ´~ºr.Š ÛSL{Œˆ.cŠˆñáÉê‹ÜT|•hᥛŒåz wçªøÍC¯Öù¬¨~©+ ΊÜ0£óSQÝSN{ŒãLã÷<‘\_|››Ï¡9…ÿW\¬nŸÄµR달G6¨Zça`°àãúâfõîµ”2¼wñeû]I-l  £ÜçæWA¸üé$¬ t-u?ÞFá@íÿ•ì•Îä‡d…‘Š_ÒUYRn.јè„J[L“HÁÐÇ”€¨=ïäæÓ)RKV"À{MUdx­½ÐV¸oÂÏró±A$E¾_t¡pï„wŸ¢Øí¼5÷érXGÓÉ.›‚§S¸@ŠÔGÇ£!Þ©…®¯Èhá5uF « $j}'8Zš JXÅ<‰[%ªMbFJ!ó&<ÈbJª½ôRP9£wÐ+Ÿ¨ T/‚íd5uF±é½þÀ L`Ü©ÛMá0rpPå+!ΕÁê’u å£^ÕO™w¦†Ý0–Žù=?k'Çg‰—vØeË‘~2nŠw“yÆ’D]M@xeÅ©dUT v—†2…ŒSWEd…ë¢ú¹y–›?róKn¾ËÍÏ}±4'¤hø¢*ßþÊÍŸxsçú!Ó„eçv 7ƹKWµ›s{“=äœË˜lç2Bös®Oq‹s1èqî£eç’UíèÜÎdXçR“à\*d?ç:Uj„eçbÐkèÜ6nú<ùÝX¬W™oÄ3~' ®‚ž5‡üÖüó¢,Uƒ2ì×" ;S ÅzŸ€¢]FÇIYŽ Z\²7^aBX¾ èA[nz8{Ѓȶ3N¸ÄáŒì £Ì–…8#$# ót(­K ôêÓÚËǤzä QÏ·Æ;_,P•’1ÓQ‡üÃ8jGž´TZ:× O×QŠdèê1ȋȘÓ=œ@ {Ô­Ü”íü6fÿZ(~]ÚÏÚ0¸Û–}†éu¾¢*.ña ÛàùÏì-®×ÀmT½Ùs`Ú§÷y\O0íQÀ|½âÛ< w•V¾¼¬—¡@O,¾è$=ãÜ£&hÃHˆ—ã #ƒ&`zê€iO”("Ƈ]驇Úòúô´ÍÑÓÃÒÓôJô´¶ =%+™¥§‡Y¬¤»=ôéév½FzJôâèiš§§=r‘žºçQrËuPúê 홺fAŽöø¾¯:œê- Æya leÖç»›wׇ'»Õ(ßçæy+^Jáó{¸ gØ­åRrqVßÝË¥y™‘²W í —iËÍFz KèQž1}Hý«¥5cˆ2ÑËbÞfíZiãPQ"q†\y>‡ v¯P‘P­†Yå_µ²v" NšÅʺm©¬{8[Y÷ ®²†›ÁE*k8ç—•µb„ÑÊZkª>_Y:çRe ÅT°t¶J(_’!cf+k0½¡SìZZ+%l®´ *êç®´v¥Ú"þëJk+œ¤Žñ}õY%QƒÀÅ>Í ¿Á"áÕáJØŽ|DŒ71XU«a=4†nµjgð+7(MƒæU:'{È@@G׺üŽ,ó¡™è~°!Nî`†?2°Û±dÖ\G…o:rp(SkêÍÃÈ ò›:ˆÓJ;ò l(…æ:ÂÀ*&J©´‡Qz®Ôâ(ݘ{*ŒvTø¤Ã ó—ñãÃn|†k#bŠñHF3|@CH †Í9®¶H`¥§Ka,Øùa&+§ùz„`»^#! zq„ Í‚¹Dê§ z®¬ü‚Ao#Ç8Îìû„œ´ùàf¤ì"y`ôJK((mþ½5›ýñC3Æß(Øt¾‹cY„²)ªU^{ÕWŽPoœ­¾.üäÚt>‰S}-<}å ®¸I‚ŽãŸ¬.×_ÜpQü- endstream endobj 405 0 obj <>stream xÚ]”ÁŠÛ0E÷þ uQ˜.ÒX’%YCJim‡ÉôlYNmœd‘¿¯£#¦Ð@=ë½sqÞÇ/‡Õs7¶q¥?—â5^ÆÛâj÷½™Šõnÿe?œ®bý2ᯢ? ÝœkD§¡Jt§pÍ”~Ã9?|¸_®ñ¼ú±ØlÄúu9¼\ç»xJ?ëŸsçÓpO¿v‡…·iúÏq¸Š²ØnEûå¢e–Í9Šõs÷m «¥ôßÁÛ}ŠB%–ÌÆ.^¦&ĹŽ±Ø”Ëg+6_—϶ˆC÷ßy]ñXÛ‡ßÍœÊõR^–•Ü&ª HCª ¨†,ä!5P µ‡Ô@ÔB Pu‰d EHB=¤™ÂÏà'ñ3øIü ~?ƒŸÄÏà'ñ3øIü ~?ƒŸÄÏà'ñ3øÕTZf©©´ÌRSi™¥& Ë,5IXf©IÂ2‹' Ë,ž$,³x’°ÌâIÂ2‹' KÖž$,Y{’°díIÂ’µ' KÖž$Y{ü~?‡ŸÇÏáçñsøyü~?‡_ƒŸÃ¯ÁÏá×àçðkðsÉOt á %„ƒVZC8è ÂAm!´ƒpÐ5„ƒN“É6W¦> endobj 407 0 obj <>/Type/Font>> endobj 408 0 obj <>stream xÚ̽ |TÕÙ8|žsï̽wf2sg_’Y2k’I2[’ÉL2Â@A‚ ,"²$ ­‚¨à¸Põ­ ŠQ\ -. mµ¯HkÕJ-Rµ ¤ååU[*mÕj•äÿœ;7€Kû~¿ïÿû}ß;¹÷yÎ=÷Üíœg?Ͻ!@qÑÊqcÛ;Fk?I|›¾a|ÏôŽsi~7!š§°Õ§SÚ&L?¿þO¢}·ÆõÌsÿ3_Àíc„ ‹ç¯ZI\D"ÄÆýòâKÖ,j»pSn×òÚ ‹V.^VvyóÛ„ þÏy÷Øž®qËÿé%„ü÷tBl'Wö/\©©¿ü!_Œ%Ä|å%+.œ?쮹Œ@É‹¸ÿE ç/øå3^Ç®áe«Ü â¯pÏÇÿyåŠU«_ø¼ñ±G I-ž0½§³Dp ˜%ãõê.ÂX6~H`.žŸ„/\6åyo·}ˆÛüÁÒ…ýË'n™|˜À5e„p7ÝÓ~åÌÛCà:<™9nÊäžkîxñ!×ãf¦bÙüËW[þF`oV–Ï_¶pðò9x?{; Iüè¢e«/Ÿz_IŒÀ{"Þÿ‹“{髞ݵÀ?Ãöóë{9Dµ„’rÜŠâÃ?J*È|,_€”\HžÄò÷ð’]ä},€”ü d`lPåJ¨Çr|ËwóXÞK›Ðfºˆpt1ý'–?§ŸJ¿à€G9ŽpÜõ|->Á·ŽËwb¹‹ŸˆåI|–ûù~BùUüX~’Ëßã‰å7ù7±ü+þ-,æcû_kxo#>R d™FÎ%sÉr é'Wõär¹ÜMî';Èää9òcr€¼FÞ$o“ß“?ãøTÁçª#ød™0EÒJßvqó¤‰pØ¢¯BwàÖl¼ÊBÄARMj°6ƒç XÂçRŽ/%eÛ±mñ,î…g`×bÇ×’F’SúŸÃ–Qe"ˆÙ8Tž¾òT|" \u¸Š¸:p àêÃã¢'fä¤RâÇûÈà=Ýtúy$d'ÙG^'Ànç;øqØÇãùn~öô¹¤Šì&{É‹ägä(yœ$Ÿâàˆ ƒ 8²I`:\Ãå°nƒ­°ž€§à‡°^ƒwá=8 ŸRB´‚ŠT&ÉÛÔ…÷U…OrÒÍ`+ØÀpâYÝàR(/øÀ×(‡ „ ˆB ©¨ âP 5P ¼z Ò:¨GZxG´ó·"æÃê¶AÅ£¾²mør;úikÇ«ûŸQñ´¯à*µýM_ÔhÙ°î+[Å6?<]‹¼®Y¯Ö¾{ºöN¬òç³ýÛÚªøÜÿG÷fû·çÁW~¿¥â¤Š¯WûƒžÆD‘Ü…kú/!¾Åý —’ð%óW/GÉKˆ…°ŸAZ\y¼¾y C©™B¾ü{VyüWö5Ÿ.9jæéÒÅHñZ¤yŸÑ@L*TîP¹?Æe¨Uæ~¥N$RzÍÆîslûŒ™7mòÄÙ1}Zw€¬ŸÙ5=€2‚ £r¼(Þ›F}j>o î‘ÿ¯Z°ý¦ÓBæ¨UÿýUxö xñk­þõó¢þù’‹æ/ê¿ô¯X~é2rÅJ×­ºtå*²aÕ¥¬"·¬Z²|¹}þ%«W‘»/Z²j5¹Ÿõ3Ù±jÙ…+Éc Ü}É’ÅóÉ3 ‘^Äà*5?[°rùb”FH­Êµ9eðØÕÙ–V‚:Ú Jg•u Ô+РÀ{Á¤@Yfå¬&…öXqD«âód Òô4”à µ5ÐM(ïEiü˜¢}þSé ÛŠ÷sŠ”Šw·÷Ã@±ž^ â•*~Pů1w[ñ)ù)E¬ñ¨8\ܯé(ba^ñ¼ÒÕE¬Ë«xoë *Ncû§ð^,È‹o'â–µŽuS-i€{P«Gá\¸WÁ³à» ž ÷+øfGR¸6âæ=xUÝÿØK;Õ^zL}î'Ôçüžúœ?PŸæ©/õÒãjë]_é¥'Õ£w«G?}V|ÿK½´G=ï3gµxö_ô“ŸìD­Îl=Ÿì»8ŸÁ€Z)\Ë`9¬€•Ðý° ŽÂ_`9Ëè…¹p>üñHJ¼y0­† a,„E°.‚%Œ³¾é(„6Ì^´b¾éi÷Âsð#|æ?‡h}_ü_?ÉÕ°­¬k`=\ ×Áõ°6­hum:ý$›aËÿ'Ox´mÓf´uÇ’NT~SÈt´ç ï°€\„–õJ²š\N¾MÖ‘ëо¾ïâN¼2`K ÌÂ9×E¸^Œër\WàŠþaVܯq=‚ë_«j_ø®X ï!×ñ[q½×í¸îÆ­5þY\÷a{7é&“Ð&XH–’ex/É/É[äwäù;ù~‹Oò>5ó[ù{øíünþþY~¯j?#ƒÂßø|Ìzæ‘_-ȱõN/Qïè#ÅXŠwýw¼; ²½’Éü~*?ïá§ó3ø™ü9ü¹ü,~6?‡ïåçòçóóøùüü…ü~!¿ˆ_Ì_Ä/á/æ—ò—ðËøåü ~%߇¶ì*~5)9ÿ-~ ÿmþ*þj~-¿Ž¿†_Ï_Ë_Ç_Ïoà7ò7ò7ð7ñ7ó·ð·ò·ñ›øÍüþþNþ.|¶ïðwãóÝËÿÿ]þ>þ~þ~>íƒüCüþa~€„”ßÉ?Æ?Î?¶ó÷ø]ØßçÀïáŸâŸ.ö ÿÿ<ÿCþGüùøùŸðÿÉ¿Äïç_æð?åÆ¿Âÿœ•ÿÿÿ%%ú^o¡çuˆ0óæÿ î £GòJʨ GoìI¤Ë]è…|5ãSdyšÏ¾ÎÎÛiÀbÏ¡¤@ÿ¬Hu³cQé0\p%’ùnÏÐßï^kªØUAϯ€ ”§{4˯ëëêí;[ý}ý‡kÍíe[½is&CZ[Q0ÎÄJä ù£Èu‘ÏQR´$\ò''Ì™âŸüÉëqäjÆ›q…KûûH_?²îiïSø»Èâ* ³s«Ìªˆüõ÷õw÷Z‘3ÑDÈ2;€‚³ÛŒ\(Cþ,²­¥Þ««åb šl‡Öne[l³<(˜Ã¢øxoèo“Bí©KnYÔT±ôî.s]~½~ì…¢˜·èdoJÓ­o<8êúþÞq8uÓƒúkM«¦]H Ȧ 7ž³âÇ•ºèä«{Fo¸nn•†ÅrǓ΅ß[!ëùSŸñw^Ó½¤Ñ4ûè«,sš·ùI~èq´„Æ ÿF³Jó Á_÷ Ž„zÂË4††”U{‰l±¡’F ²*îsúà˜¼lLek'Ã…¹’±ó™2È”µ•õ”­*»¶Ló®ôîRw“û<7/ÙFs'/Žï¹ý"L?©ÇPeȸã"ì¡[€& œ§ù“†¦4?ÑP^3V³Có‘†vå »Ä-Wþò Þ½´Á \[]4,ÕIc¥Õ@Z*‚nJdwäd„òF„ t­t~ŸVú_ñS¿ì äý¢Ã÷ßÎYmƧÉÒj9ßÂ-§ÝI#%N¯³ÆÉµèð'ççNêÜâÔŽ·YwÈFù ±ÆÂSž†$)•èvdaèJHN"\)ôàzq)T•~PJs¥]¥;K¹Ò;êaw¾TD¦)½ªÐ‚I A•VÖ^BãàJœ?·—>ÏD…Ú?4—‘n:}øð‰4ií?Q¤Äýs{‘r­È3HœúúÒ9¦½µö*?T4ŠÊb?$g¦q°®W%술 ˆ¹ÎΤy§S+¡XŒ*Oí6 Ï(5«YýýCßj„¾ã׎ഠQ×õÆÊCÝù=¨yeÖŽeé½}p/tƒ;cºÆß‰âcùÑ[†NüôgCo>L3?É7ü©æ·¨C¢$ ¯‹¬hM2cQpaig,1ÀÖÄ@‚n­‚­hSé·êiG5¼›€z6”€MX \'pQíq-µh/Ðök¹[ßM<‘àÆë¡2¹TÖBi-œWû|í«µªåï¬ÝQK·Šð°\üÚ8Õ ô×èi{üá8m7€”èJPÉ5`´F`K'c•̺S9­ò‚J®r‹ÉjI2Ò båÄdorY’Kná9ŽÍïÉ6{žT ‡¿;ÊjTáX£ Ç&Gá8Ϩy«†ÞUŽÐÖ Ôð<Í7‰¡MbL5±Y,€mb26ˆí¥ù‚®öœpÏ©­m·°ëÚ²,s4ƒH}ã?;f̸ÁöÆf&\%rgs=ÓúõsÚ-7{ö¤Y³FM2éwˆí¨ŠÿŽH0Ü8ftÓŽÑ+ÑgÇ„ì®Îð£@•5e7Š0-Œ>îI¤Ö¿wNÂ!âÒ{‡³‡N+>UšUšU:]çLª»“l·w'Ùî$Û\[LBO}ʤu“¶Mâ Ü$•Ü&7é ¹!µUxs.Á°3ô…tv¨·÷@¼÷*å´üVó ù„|8ÂŒ™õæÚû(ÄÄshò[r'äãÇOÄqku\±Ï‹p¿9—Suúù€b©£6WˆÏ"EÆ,f&ÅL’Ý(ÚJ3Xïd²­–S”°Í‰¢ é3›Å=Z´©Ë#_¥Ø×%Â9óm)Û MIPÒz¤qò•<Ç]rÞœoÛõMâ ‹§ç„"¾òÁ`Ð –'2:¶ 0],R°ü&&Mì¬íXcÚîìÕÚÕ9~\atëŽ1ãwŒ7&ÙVh›×¶®mwÛ‹mÛ„¶6ˆD“µÕ;*[£°+úB”š¢­ÑMQNuÖeA„ "H”ÀˆQÂÚ‚ìâœâ\ç<ê<éÔ8ç4çRzFΩ1-3Ú‡Ò¹’o5#q@r²0’JË1«É )Qq;?9 ˜‚u²&‰™´Bƒ½ERìUhì§5…€FqÙ¬©,†eTŸY¤.FQöÇ(Ïl?M‘‚Íé°Ð$< ³6\,ŠCå!QœÛb/a¡PI©ƒGÇý埢¬ÓŠ ýEÏN[®_[;ã W ž?# /¥ž3–÷/¤¾úÒ²qv¯M‹øKkyƒ­ùâ·à—úÇ8ŒTø@‰X  ’ÐyºÎq{“½ÛÎ9*`CHFøÌzS·‰~n‚Y~8ϸÔx¥‘›i^d¦]þ%þ5þýüu±§bt}Å*訮"SÑV±ªbO…ÆUÑJˆ–@´¶V€¥lƧŒ´4ü|˜–šo6?oævO£ÍuÙæÁì )ŸÈS)Ÿ·ÖH:NWQZe© Vq-Uí©z©Š«Úb°š<~Ï WâÑñÜAo°&ȵ¼üMðOA.¸ÅÊ—•îpÙ‚N’Lzê$Í„ªöŒèg!a&>yD"€Œë"ÈBR(ó„•Â6AÐŒž?Fa|tÑŸGiPŠº£k¢\(ÊlÄ(³£ÌFŒ^UØ$g’Ñ>”[ä3öaoQ§+A„>Å>TŠŒÖÈHµ™DF>”VŒÅ}ª©¨–œiÅs:~œÑ?“¿h3ª ¢3ê¾—m*Á P¼ž¹Š ”HF´_ S¦Ô#¶c-–í˜m¨gnã'ó•4ïò)‹VÒk‡þ2tä÷C÷¾ ïÀUà:"X\(D5œ¾këÌg‡Žoº/ô<Ù(Ù&_+I-÷]˜[NË}¯Þ°tâ9‹tK…ñ„Ùp÷ùú¶Ã‚xqÅÛê½{èw?Ø;ôÒÊ}ù+&Çd*UKT£EÎ ª½ eãB¸»pya1ÅÉÅ4°xÛb:º½Íb”Cî2áÂ’Ìd'Ìè ” úx2H3ÙÁúÉ=ƒSefÊs’m ·mCIu´?Ú¤ (À(i ´%9¶Y‘d'Û$][Zo™jñq”+md‚°iâY”ƒÛ åi&+K°2Ídez{•vÒˆôœÄj&mëX04½ã³æ§oŸc)PèT:+°Ý!$–ÂÚ‚©jW5sU‹«–Sy1˜'Ÿ¿ø…Åü®Å`ìPE'Ã… gV9S欛sÍ”žsÍ9#=O+ó3–ãHMQ`~ ìlm5«Ž9.'â¨ÏÏ,§ÎZ þ.*ð~ægQˆ9»€2­?[„²zA0«‚6<"hë³õXÖükÜ4ì/GQÚÞÔÓßìÃ-t–†¥2¥?xJ;ºƒ: Xi­_*ŠÃÄ„¹£lF:ôö·®úÈDø‡E±wÔYYs=JÏ´@EÇÔÎã·hµ·œ–­gÕ¥^êã8[[G-ýÕ1­öØ7ÕŸ‘Ïh¯f†÷ÓuJìŸåÏ>]¨œ\¤ns¥é²'Ö{ù€OC9—o°ŒãÊ,é´)•Ši#¤äd¤äÜnJú)ù‘VžÆ ÿv“J ¦ÂĨÁĨÁ´¶09$¶9†¤‹Õ-_+fbH ê°«'~z¬OÛm_Ü¢Uv~o¯ÕyÖ¨ŽŒÞißà¬qŠpMW]e#¢ ÕH·kWñµŽ‡:£æz´¼¾©“™…ôõÞœªXHÃï ­¢W¢¨"/ï#ä=ê$Ñ=«5àfŠj”Í‘·W[ùÉÕp¨H5’Fh *:Xa³°Ú.;ÿa¬à°7-eÀúXÃv)Ì6Âj‡·KjKŠÓˆ,±–XKØÁe@ÊÀÌ••Uc÷ÆË¾Þ½Ç‹¶®|(wàiMœÊmâSÍJ¯2‹0‘ j¿Ú‡«![Ë*–EýˆõÁ:Ÿ^)t°.m¼å®.»gÍ4¦Z=Ú"Í Â©`è ÍÕ#]y*}ÿ+÷h**Ü©’h¤õÑfnáYd]”¤š™•É?_‰ËlΗχÀéT< BµÓ· .È;VWÞÁ€[ôD°¿fkžÊLÊLƒ+/+¸4ofâl Î äRvl:sƒ=pi€jý°Ð¼-l£¼Íf[`»Óv̦ùȦȺôTà¹ÀÏô±2:.YÞµpr‰ =^ž”¡A†Ï5>h-‹,ÔL]Þ@§XBuY S aÞ+Ì÷šéÅæ+Ì7™Ÿ3¿kþ§Yû´ªÌðü~ œÆz—•F¬—ZéÃVX+ý2<'ƒGþ@¦=¬ä!B9R޾O?£Ü;9x¯Ê"ðzÒD–’?ÞÌè9D`+(™Iè¦À‡º/PÈ€>^ ü&ÀéñÀÒ§±Ø-K»åa‹æV ¼gJËN •,•–%–÷-¼dcˆgU±EÅ6Fˆ¥¥¬^ÁÅÄÇ‚9PÈË ø»‘ÿîÒ¼Íåò²Ð»7oq¹|y[ÀåÊ[,/£Íg Øx(™‰ƒÎ2Q'KÃSüðüóü›ýü_ÀWðÍómöiܼz¦û€÷íðòqÖïL/"Xä}Æ{Ø«!Þ€·à]éåK‰ zdÛ%¶‚m³í¤w+TQ+ôL³ö[)µŽ±^`½Ýúë›Ö¿Y…+-àeÝû°#h¥%‡=²ÓÂ_f)°ÜžBϼŽô${VölëÙÝ£‘euæKbû¦É1%NÉU¬Òb{\T«¢_Aê‰ãÊÒß×[ÛMWÔ+#XùµCŠõ˜>Àü—ONÈû͹VtXØl°b32%hÍžmaØœÿ"¨sZ)FÄOÏêqÍk­iÔW‚”D³øã¡W‡~»à"Qe(1ò®þ’5×10æIƒÓý”Q+ŽSã1ãGOÀ“ê(°~.Ь'S¹’}8'YfE„Yìee £tð2|´`DÁÚ-ãVwÀîe“b/.ľ‹|Ö ‡»Á9¡áÈØÈuNЏ#TïÿÎxNz-s|°ÐãE«5ßÅ@'å"^l¼ìbãƒvg¾‹N&(ɶüDO`ʯ?QÅ“özÙlËÉ=No>¤bfßÞÆóuLš9iÑ$néD˜>M€Ï»aßxøÙxˆ‡.¯¿µ ´ŽÎhç'|® rã¡~ÂŒ 4lÒg‚‡ƒŸ¹–CEšÂ ÃOà ‚;øYºËá†rh Áã!øVhcˆ AøVpcÞ€à?œã_ì§Yß9>ºÀ/ô€©gr%=0¯gsíŽø¸ÎTù®à A4ºÌöAk¼a 63˜=0– dÒà”αƒSPb[-)Kw·Ôä`ìP½3Ç6ÈŒÆ X)3—·K5#Rº†UÔl‹´Õ±cêX‡¸±¦n{g°|kò1÷ÌÇ5Ÿê£ùX+;Ò¿omÁ/IòK“%NÏI=Ò^ÐL”4MiZ×t²‰7pMÓšöOFâ+|!Ÿ0;sŠgÜ1RP2'ˆKälaÓÓ"=Ñw–8/Ô=iJ÷úrŸ­¼{|¹/ÒÝÙ}M0b vOF6еñüUû»á>«YUcüEI¬D”<6ÚW„{ï7ÉXÒ×;"OKÝ¢g¶ùè—½53P!ÁÈž³¤®¹Ž£ŒÍN + ³$qy½ƒãµÖô¥¢ôКi/+<7ôÈúù±ÆðPPcc{ Ž ¼!ŠË뜚m¬¦ýÒåÓl¯„™7'çõN׬S'G.ù|(³à‹J+'¤DI“"Ö-ÿŒþþTíÐ_?¼f"7xªý‚á “§R9zÑ0üü<ÐT*µÍÞ÷Å'ô(_«A>¬e2 ƒ–< D"ù#ƒ Ëƒv1Ënp—¡uåd ãbÀ]† §dïx>ZpZ=ùÇrp8;s Ê‚eÑeî¾L™»?ÊÚfUܸwø ÃÊœ¾ÝÃêÜÈö«Û…óQHdÙ 52Ðå„.;híQ{ƒ“²•Ù\vg–—d–=†œÛÞ^ˆ…#Æ»yÐZàÚÈ`]Áíí¬ko@ƒ4ÂY¹{ÎL Ã1ž²Ç4!Oÿæ–+ô… ¨ÑŒ}*þž’ÇÆÐ1¬Ö޵cX혿åd–¨¤xUì¬Ò Ô”Ϲåùœèõçsë$7“N¸íf3kXç^W8’SjW ]ÖTgj9•% Òé¨tRBž’ÆIg4Ì—8JÆõ#6ºŸñQ¯ŠÐ’S-£ýq•‘ŠÅâd»#Œ“ôî\Cî»Ûf·»7"ã\¥°ËÜbЗبÙEÅŸ’äÃ×›ëÎP5ÚNsÝq o7[NlÂ1¦ nŒ‘¤–.» D Eñ¦øÂÑÐ oÍ8WйۛDqêÖGIâ˜N‹  ßš¾rÜ[§f :¹¾GëVß%Hµ"ÊF½›à*2©H²Cœzjéë5Öï[ù+t•AYÙœ²[Ê8jM£W1ÍÊKZöVvÛ± å!ÿ¾´þ­~ª«ôCÔ»ÁKk¼ óz¼Ô¢Å[ÓZVê Ê5ÙÉë`qi×ïXï¸ÝÁ9¶tÀ`õ)ž16Ðø ºÌw•ïVWâóúj|\Ì·EÐ@•†Íååfƒzþì:ìaÔŽJÄèý.–dãçiÏË.¨õ8<—y¸çªa,׉E.͉aq]Þ¦$,‡·…9«) =‰ð‡aÚÞ¦¦ðŠð¦0gàÐßý£Æ›Agf‰M\P2»ÍkÌ\ÈÌ¢Ðf…6³(´ùª‚‰À?ÙD޼ ‘ÓÁèþ¹_‰FÏUð¾þ/µPª°¶0«Á#%y‡4Z{O°Ô5~4’|W ;+ÁY³Îøë/&4œÕNQNý# h­³4„3b¶Q> GiÖfq°ÔK} ‡‚è«'g¾á½0î<0´éøCCùÉ9'ß÷úµÿñ·«7}òà߇ޣ ýþVà·fèÖ¡þ0t÷Ï–½ eÏ^1ô߯\pÄŸû9tÜ9tö|öq1:Â?¤Ù@Zá†Â•ë:‘™¿b%û p—þà„6é‰nàI÷ܯ»¹¹O¸©;é*í à÷‰Ô&ÂJÉÝ"·{4øGŸ?šZ¬f»©ÎÛï ˜Ö™¨É÷–VT¥;KïÔ¶ í ¤Ñä@eÍ`ÜB9«ÙÂ,I#c@ à"Y,ºŠ¦(ƒ·Zk™¨­UŒ¬©ÝÞ`pAÁ䂞.èpK5_\#!f×U…Ý:ئ“ί;_ÇIœn´n•GÃÚÑ»FÓ/ù¨‘¯ú¨r†) ëÐû8Ù€njC¡ákfÿié¬ÖGö´S (Ç_ÎŒÌÍ?Æ,8›Èè=ÏÈF,†ej1"8+CK‰“)A²bŠ· 5›ÿuèø‹ö¹—~Û{˳—OßzoϨ f©;qí?rÞ2éLT8øÅ×£Â>ï²Ù^–1¶èÌOn¼áÁàÄ¡w¾9|VÀ—P’º¥êvRCZ8y©*²~\J:.#)/ Ê”1PʰØ;ãLõ#VÝ€ÉÝZ zÞ–`a ¸5p>ñÀ0ŸÅ`«qÀxÜÈÝÕòp˵pÞ\oŽz[àx,Ét’Úê§×Óˆ³ÞÙî\èäW—\WB£Ä5°_{HKŸ©ƒwY¢ÒZú´Ƙ§™×›¹±ÖéÖcVÎf.n‡â\{jFŠ*QŒIf['$G'§&û’×$¿ŸÔJú\wŽ–ÌÊACùÌr:3 ³š!ŸŸŸçÆknÒÐm–ÒУ±nŸ¿œ yËÒ!H„ ĨŒMA²tÊn¤ð«B°«?%ž¤g¥‡³L÷ñÈê¡@¸%¬¨m¥£’Z+?å3ŠŒÎ€%̤3\f}æö —Ùb·61öÍtDKš¼M5M\KIœh:ÕD›¶8õ çy{ˆ#>S1¿‹¥{­#'‰ "²PÀµ'«Jí¬:dY&µ·2©MöéìËY”ÚYGö²,Ê¢Ô6¡Ô6A–>hBqjj5¡ÔnÒº»•’V¹u[+JíV”Ú­¶ÒÖÖ]­ÔÔº¢uS+JíZ(àÚ3¾tµÏÕþ¼Åv­»vM-ªeb»–J-Ûµ(¶Q;øE0‰›Ä#Šv%þ ±­iþÜfXaEtÇYüh$ -ÞªÈîæSŒáÌbòø“Ä}½X¨©˜“¦üˆš+?KŸ5鬚fyÚpÒÔg²âTcš·°DKÁát¨“ÿ‚Qe‚]‹æÏWä<õj8賡WöÀ“0ýw0í¹ÊÕû†o›~㓪Ìëx£of™yùÊo 5yê©¡w¾¬¾¨5\ü>Ì;cᾇüzÎk‡¼X2dÛ!¨ÓË)¯\^y޽¬Œûø+jEª†?ÕLB0™»}ñS-Ÿ° f5Àâ­ ˜01`d@[ ¥¼ì·Á~+³¡Xàe3hÌP¦³À8â¦Î‹™ú†rŒòc2uêLX2=fÂ’Æ]a„ySa*S sÑv×Xàc |^ šÄ½÷Á;xýnfùÞ÷Qh¹ëMð°é-­4ï3¿bæÎ5_d¦3Ì’—Èt¿ ®·Â˸0ý’tz팦ô48TìT±R_›.Ö#vª¸„uÄ­hjñF°œp@ÀÎR¹%ôðÀj¾ÄVBK* Ô)ìS)äÑqi‘D‰p½—»Œ/?6òZ Ü…Z¶äézY9šmPrØ[Kà“X­‡Ž , ã)Àü|4¡[Â’Qß Â[aДƒ3X¾µž«œuÒ•ò‚§4¿©LØ/¦òÖòMåGÊyS¹¿5,ÏŽhÞ,Ó¼Ùmhð0ÍÛŠOþ V´nÛ;üAÁáöæ›c`ˆA!G >‰Aì*»›˜Ç“×Ü¥y”/.+tTÖt/긃:Hê º)ºÍ:žµÝu2ü”ÓשK¨*™á‚Ur‚©äSɉµ2nʸuãP”Œc×<ÞN¬XJù[Gr¸Tµ|ˆifæùÇã'ÑÐwVì!c.ºJL!#8­“Y5$‰‚Çí^È\&ƒÕh¼¦Ük+7–”{Y´Á¨ŽÓ®D? +æš™] øŽä#_­(xø;-Š }Š®ïS$ˆr`ÿH†÷Yïg¨¨O9ü,©b=Àm·iµ(PÐÈŒÄcÑo¶¾!*\%>»¨ïÅqSOûÄwʺnk¿¿¶<,JÉ1㦷ßùÄSº:ï“ûwo]Òkú·á`mèÞ«§?¸Ê›÷ÃÞ7Jµè¦iµÓß8ùºŸ¸ãº^ÇÐÿÓtg1g‡ç4‘&º¨ð`KÁhi -P¾«L-O´¼ÑBý-kH´¼Ðr¤…· ÞõÂ;õ,=uM¬Ö_Z8ì:îúÄÅí+ƒË4°!×ɰÁ)иá°¶F"tMÞ±À+,²B´²¡²£’›™[”»,·5w8§)«ÀëHÂe)WOKíà1;ÅnÈ‘¾,M£é4åÒméž4§óyc,âÐäLAVX|#øap8(=ùœH¨L”3RMdRfC3Î{DWye^}áNèézñvñA‘ ‰±MäÄ-Y+KÕ܃mbLkG°&fÑHIÌ«‰q-¯Å~ûsŒ‹mñð|È¢1k„g‡}àS¢æ¾`§¯`07Lö½á£¾:=WÊÑÏ9à°á3$ïüAÕF0¨ö5{õ®Ð‚ŠÚpõup²äºdÝæº£u|]œiò8ãÙ8Ó䨲ÿ‡øÕ&§ßIõJ¾ôls‚3QTÝ'”W~‡îãÛ>ùða¬‘!ÿõîÃâHPUµ²C¥¬&!·ÊûÙÌMFIöUÇã#9@ñb°WáÌb0›×éE0†´f3Œs”·ji¬–¯¯ #S©)AµhwkµvÝóQåMÊX¬a²˜5æó¾3ñâsk¦^´xAßÊîàsÎëÓ‡Fª©ø½E3îœPÛ5ÿšïoŸ?ôð?Þø®VçŠâº\kŤïÌsA“×,{zÖ´?ÿa¼Ê0ç1Q¸|Ôœ±·Oh:¯Þcu»wÙ[CÇÆ—´2-CÏŒÍ[7‚£ÐhÊŸŸß”çüùɈÈïÊÉkùd~e~wþÅüÁüɼ@òÜ|‹I“Ê®3””TU²¡óEóʤU3©”+•\¾rK–Ôf9GÀ`:À5ñr1™ïÚ.û˜ÈW´¾+|Û£‚vµ‰é:P A‰z™pÄÏ€Ïä)uP÷™¬Jp† ^”à2£™Ipyí¦(¬Œ¾¥/FFi4r¯8{Ò+coÁ>‘VVu6…´²\FEHŸb4ÐŒù·ÍŨUo8µ#™ˆ!­ý2mÌu16Š&Räby€V’Ä„¨%Ûò±?¶T†‰/pJÉ^4Rñ®9ì’Nª© }î‚û4×K³ŠÒœñå&ÝB§ö½Ô×fÿªWDÇÉ‹åç͑ĿvI"{o×7¼_kÕ¼¡|ýmìÜG¬È4’Ýž·¸ä÷biu¬—X8µó=þ’G‹é…@aD_©{§îý:nÀùŒ“Ô?SO,,Sqâí¾]§7v.ÉÀ’èóKóWæoÎóéZ×µ­‹3ŒËvp±PHSˆâXÍXöž@„ã8»ÍåÏÛï¿; Yë¸q¦Ž©rdð‹sºÛS§£Lß·yþõZ!­L¢µxÖÎOÁŠÔ‘ÔpŠ3¥HíJqf.Õ•ZNÙ Q}¢ L]“»ÖvqÿÄ[ –)-ëZ¶µm9Ù¢5p--ßàyŸ™k`ï ŒÐŒ²W¦Š‘š¾q6Ëpâôû˜róé`ª¿{GÞ99£^OÏÎ1 ÁfâÎŽé¤v)/NÕr#Ótœï쉺’ø¹;.Zþ¿ƚY-ŠwΚ°M’ææœzʕͿþàÊ[~ýíYU¢\‰ö+³vÿyß »j[VÿèQ¨›æJ;E­Šô–©ÞQ»lpèà3on­“Eø”Y5·Š]*f‘¾=‡ßfØ¥b^ÕœŠ©ŠAÅDż’KãfíLU *&*æÙõðÆ8SƒŠ #ÒawE¢yŽÊ0@¸»æÑH%SëRÛR»Sš)©•©Í).‘šœÚ”âUC¥ÞñÀ£ Ä¡B;v¾SýH5]ä†%,qÀRÏÍ*ûa­ÿÿ.?ç÷»ý&XiÚÌb\öDìHŒÆb+Îé®¶s-©ð DÊCò@‰v DÔ‡8=— Vw5IØ9-ªÃ)ΕNêt¦’ü­êKÅÎ q©oL™³U'ën›Óé&wÝi³Û§_®u©V*{{¸7èUÞVÀ™|YU;öý›7~IŸ²TW5\‹¦­&ÊÁ—øAùô€€ù¯_â*ènÓò¡'ò¾%’tÏÒ‹âšDÁ 9Д^”ºB’v%c‰b§ÏÙ<ô³%Õ–js]›c‚TË(>+šì†þâ}º¹ ª|n£™@áN®ÝxŠ ³o)8‡O¿ÕÜA Ü¥O7±´”WüX6—Š›˜§´ÖÄhÉáÎ+Ñ“«=[¬óB³ËêÍ·00ŠV ¤H3a ŽzÈ2WB'Êü—‚UœW沜¬^Á*æØw bè;5¹PæÈ1ÐÈe Ê&ûö[a+,`wY1¨˜¨ØÉL4ÉbÉ—Ô) i)f»e±àh\3\Ñ‹šÀÝ”kšÕĵç¡4í¸4Âûpwœ›ÃàÒpOà³UÎx›+ À?äÊ ·®,… ¥¥ô37,rÛµÆEsN8×í6ø…s©ÂD¸Ü„ a åÓ:fò®¦ÚíÎ×T£¬©F…XS§®©Ik™bÄ= .-eøÅ‚ÛëÍŸÔ‚VK×FˆP‘#4‰,5¡0 (ño6‚ÉF–èo4Z^jmò§ ñ¸ÝºÚxx ¬4 4qPWÉé¸lc4Z‰5àŸw”—z]p°ä²=G1ÉŒÝÔ·ýÐä¿>öCÈ¡•Ÿ£ÄZpxݞƬ?m½² ššÆŒá]³3§ª“D/ò›æfJç,^FˆìxCWgÓéõ~¯Íï÷6šò…õ·Íáp765]ãñÚðßÈužPÃq_’ZEX­ ÖŒ‚¾.N+p!ÓSýúõy?q¦{DqóŠž$qEM…|ß?æÏ-L™ñ§Ç<ÒßÅÇBÝ¢˜‹–yò‹M+]4öØO—V¹³VØÎe/pêÄjRµÈ=ö#§ºéâ@ÿùŸO­¦3梿^ZÂáNüÕÔšñÜЮ®#C@ÃstÉeè½÷3ÍéþBS£¹äè÷‘:fã"Ûï-b%ÿÝŒ;KRY ¹NCµƒ0B%ánnÐÁ 6X”‚5<ÌJÂÌ´‡†éXt%Ë/+§}H_JRWyuït’ biïðG{¬ÊgJ¾Pñ{ŒeÙgC Nd»p­ã!-8 ]€ Ë¦È¶c…ÏlÞ¼¹ …+6ì2‚+…ˆ0e #vp§siš Á=4 ÝÂÍÂ㿳rÈé g…T¦ * UÂl^fˆã-ESÂáC}Y}u='¹µû´©JÓ¼&:yϨ+ °÷lʦ”Í+ãÊʦ*U¢jrÕÚ*®ª€cUU„¦.ÀEÒ!Á®³ ^Z2 $sƒl2CÙ%yÁ;àñ8]\ÅòÐ`-ßÜ`Ö‚G9ø„Îì¡´Ø”güùÈPÌE(‚^öºÔïâ'Š;w{{í¤Æõ-ia}ºÎ–Ät]Äj½F—°ét ÆT#<Å´çFÍHF‰ÂKŒuæùˆÝ>…k˃¡P8Neêuv»MD­Æ¡Aeì…ÊÃkDA›N×¥t)Y›ÅfãUû÷Ë‚±Y)7”ÎÔ4« ,s{¿Êž_bȳ6¿Ô‚«³ÊG9€C¿Y.â@„ÓŒg¢p&—%A˱’_l«í\æïÛ6NŒÎ”$(̘ú(\=Ã"ÎÅÖÊÑ žë†ždS¸ ŠçÇ2‹›3CŸum~it$ÚªIŠà<ïv¸j‚/M0HURµ□ßÒZŽ“jDÎJ˜"’o'Ç-fÙ`äüñ`Å`ÔÒÔ”ÊçÝ|RåÛÝèR¶YÀâæùµè+§$–¢8An%k 7s‚ÜÌ r¯MË)8˜‚T¢·¿YqwP±¸ä½¹„|¸÷uù˜|ŒE+G\%’y¸9“‘!åÇé[r»ÃŒFK$I—Mg¯á%ÏKŒÊ7ŠWíŸE\Š Ôˬ»¾â»õ_Jÿ@7ˆQŽZœÙ¬úš‹–©ý³Lë£Ìp&F6¾Ü²'&/Zu(q&Äô›‹·ôÖz5~È^<¿Ùnê¸êܪµQzE@c$c/ìúé}¾Ky^´f‡Ž<ôtðŽ­ç´Û_ fg<þã†×7}z´þÑ¢¿þTcC' Ê€%‚Wqp£*½p…&ÚMit¥j§b^ÅÊ÷"¬Xð”1àe@qC\¥E·1¯bå NF,”¹x]Å*Å´ãϘx' wa!áƒ{8¨ ïQzÝIéõ^ØÀÁ‘4d½ßòÒî2Ž–rPÊC©¢¾_‡ï¸OZM‰Ìh„É(U›§”ÜöAa‹“óE+¹d¬€N†¿:9ˆ*kK­%VQYDwÄ+K&Ùn3”ì°Ø2‘?”©¬qJ!PŠ#“dßÉG— ýzo_:}¨··ùÀ‰´9cÎåäÃ#%Òz"—CAz ×™k=ñI3Ò–ûœj‘Éçók@sM©ÏVªJ}JžXÌ$RCp}½ßh?¢ÍÂÉ ÙP,È3ì¥göÂT)LMz§¼÷̱8Ž&üWÚ´¾¦rû¡¡S=V­Qb @,¼íϰNZ^ýÅ pךO&yuz‡”@Q+ Íþèñ¡Ë UôÈ@'”݉ë$iBÍã˜qYßøù‚Áàtæ6ˆbaèšìKåÓ†÷sopŸ*_oÎ:íü}Ä;õæƒ,É-Uí)Càó#H§YHì蟯ó¢‰*²o\¥d,¥Ì‹uasN´Ú}Êt90ÓÙ¨|5¢”}5íså`öÅ’ û¼•âX£ôRÅŽ¢ƒõi…â\,sˆájµ^!¯á@ ¯ãÀr3¯”2Þ÷³8\‡‡kuhÒÄAÏïÓðn f£,IÃnx Í Ý0ݽÀ½ÚÍÍ®Cú‰ôÓ¯¥ù’gR %À©¯Ž¥5 ¯é®y¾æO5¼OÜÓP îê®êwªÑˆrW/©~¥š/iªî®¾¹úùj^Wí©®ªž]}qõ½Õ?¯ìk*@[ᨈVpÎÊp.LKÂýá[Ã|­.ì Ó¶ñá甫ÂãóÃï†? ¦°+‘ÐãfŸ4« î ~ä¤àÎ 5i‚öà[A®#¼4x}«‚&øpðå`!õ_Áƒ›>Xl rÞ`ÀáéÔéìÙå0¾¸rðiËañÖòrŠK9‡ïË–†jÿ?•|àû•8ßK>ÚªÀßLe€=µM]Y&íNrU@9ö]™=v%ób!±BùÜŒ‰ø 5‚ÇÛI VG'ÑÈX­ÎA»>s&Äá÷q(‰ƒ6>&~ ÎGYêHaB<ž×Ä¡Gˆƒÿiœã>ö¯"hzƇ ?ô‡‚PH#%Áy 4iIR_RF¹Î|rk™Ý.•AUôj¬)sQ¨%Q8w^¢liˆÒ‰Q¨ˆ6F©!Z¥¾¨y*ʸÖíaød!Šç‹~W#×Õé2™€¤sºÒ& ^´´P {±Ü¸ٲh!¡«ZA×Ò]”3Q?¥zB ”–o¦@(Ì‘)¤G)%4‰ÕS(¤ìFs' ¸Ci5}]ñ1QF¤¯':(ÌÓ±f›L:˜lÒ%t­ºMºtšaeFÕ ³Ö¼Z8Z îZj!]‹&P¡ÑÈ×Úð¦kQiäkYFc­½‡ÚëL àšWv^¼àýÖ `s`[€¥B½øT‰ÜàoEÇQy}Z±;Ø+*½ý}‡NgXÌí=¥â÷Ç‹UŬ9%dÏ2Ÿö§å—GÌ’bŠ›wQmÅV–¿ªäƱ ¨bFÅH&úU¹b6øþ¸ú+çÿ!íMà£*Ïýñó¼ï9gΙíœÌ¾Ïd2k&Éd0C–“Â$ ‰Ô@T@Á·Zh—B¯+ÚVZTŠm¯´*ué­Ü^¤ÕÖ ÷¹Uëªò«¶ü¤×jI~ïsfÐjïÿóùÃä}ÏÆ0™÷}öçù>MMMÿ®þ;ÓwØ;M&¬~¢gò“Mbß-ž?\)+ÛÑO„VKI!cìwËèOúN¾Ó˜þiÎ&•”>Üä[/žÊœüKޱÉÒ ÝY6<üÐôìÌ.åw*˜¡&åd®V¢t"Lg\‡ó Ï i¦~Qz$)ýàÛkè*\¡¼$õu¶ÍSø×[»×´?nZUXbÍÂK㿽ý¡Í_~ÜI3¿°iÁ—¼4~´Ý'SANI¢hýæãî•ýw?Z¸ç†¨sõ®ìÕ£_{Œü ŽL¼?ñÞ%¼Ä%¹Vš~–ó”ÌQ7nª ;0bY˜YeœÇ„°F‡ð3§Ÿ´—¸XXÀ4rÍÃ6ŸŠQU]n60ahVÝžRz·Ç§§{k·°ƒzÔ M&[8d#L°f#‘J60^’żófP ¶Ò9H7(Ù‚ÅŸò 7{›ÓÍô53¼a‚7Œð²üºLÖ×Âz̯¿·þÑzúj=ìpíq‘Î=Nòv+\^±¦‚,²ÃÅ75’w=€àŸûáâ;F0¢øUv¬çŠüNG=4×ÃU57Õk® |1ð•}Õý®›´¸ÿâ&¼êPcêRu­ºIå{yˆó3ùÍü‹<ïÀêÒV”ë¡fŒœÕ0NÞab½=+°¼.n‚¾,ô‡à ˆÊze‹BE%¡ -\:óÛó;óôX0·^K#Å·ò ä³ùü†¢»óƒÕ£†•è·ßU)¦Ã•rQVÓ*ã{éÍÛ*_¨$«+¡’1¢1רÕÑV_A£Ç›ÕýÚål]IqÆq),ÔyšÝ99ªã£`xZ‰idÊ,bÒ÷]6uJI˜‹1ÊÉœƒ¨W$ë¤=ú9”L}§Õ-V8;è$¤û‹dœ40ÝCCv¬™ÂÒ-²ôÂ-v“ýʮюÑï ÍÌfÝ1zQïXûù•vžÌÁÿ–g­nûÊ7gl™wùý f¹šÍkÆ›ð^QYýüÊeû¦G›—5%«çXöý–Øö_»H•Î䯷fƒÓ3¿Þ³rׂuˆÁ?qœ.¥?ábtš¦Z#lÙ"j8Ìö"ªÊZ¥ž¨ÍîøôLovA 0B—q0âÀlŽ‚‚t¨`…–‚¨»U¸­…òÑg»¥{D»‘wÚ&ÒnXW¼Âxù<ÙÊÃ6nÀV€°žºG†uFxÔUÁ ?üY€ù2ü)ŽÐR¬“Z"î(tu—NûáˆXÈÈ—É?‘ÿSˆÜ(É”ùoɰF‚]Ì—à/ pP€«„›„ÊöÚ¯ž´T]%›©Ø5Œ |5%}ꔦ°ýïÅßét}0Ä¢:ü¤Í]¬ÒÑ)mÞâãðÇ}ïû>òÑ·M2‘!8Êl´Ó!úXhŸ~À¿†–00>xP»šmä¹a¸AY€¼ÀÆ—„×*¿Âƒ‘÷ñ+yZàûù‹xª&€KœJ›’`$›':‰U‰·b6xžM¼ÀÎ&"PA²*]óûsv-fC…7gGÖàd~¯}¿(v°ÿ‹ç9]΃®o.ê!ý$cižû-ë+A®„%•«*7TÒJcÍ•¨+U~º,ê8ðÙæDuÑñþÆ ¨P ¦(\'·Š£s0U†[Ímçös‡¹cØ¥&¢§’îä#À¯ª‰q¼€­gT;èÉ ÚaÀÝŒÞщo‰â—f´Œì‡zÆèX[c£ztôdfŒëDšEµaxì@‰hmh‘æm¥Üé±³jf|e&«oõÜì`­ž˜Y®Óµ¬ï-¹=tp̱±Ï$pŒ’–æfœ~:'+6éÒÔ—þõ©t眧/9ÿ¡ËíF9-óÖ¯^pÁÆ®æùw.È]1㪳@<´øî‘iKÃÓGïäy…î™_¿æ’'Öô"˜==oâ·ü7˜Ì­ç4Úð,×ÂÈÉ[òUi2;¨Æ:K?š›LŒèå%j=¦E™ÐŽ®Öj”ªí¦ƒ¶E\žBÁg§ã€¸“˜`P‰Ëì Ñãä2‚Ql·;Á\ApÀî»ì^ `lšfv8ØM0tÂÏ Õ·T“?Uƒ‹b$ù>ú%÷äÉgœùx¾%¿.¿9/´ä_Ì“Yyè¥ÀþÙƒ‰÷%袸#p8 ÷V>ZIfTþ²’¸+ÁŸ¼Ð…#Qpu@¢Œ•¯W¾_ùQ%/Wz[ñDzªçU/­¦ïTÃ,*=1îŠ'âëã[â'â§ã̘O9 Ö&à¡Ú49#9”¤ö=X€– Ò N®†´n`/®{o7±ìVUÇq›³Á«%¦W7§ú§ÃsÓáÅé0½žíßé¶§ß÷£gW¢9×ÜÛLõàY@w)žÒœL5i~8¥ üæz¨ß}ˆ€B€ ÜUyÎêaBͺKz{œ-®Îq0*½KãÉíuVke5_Ó.wÚf,ƒ±f1ц–”ò_¨"-‘>¨“JZ*S”º¥gH6‹` šÖ=Ò½º{c÷þnÇNWwoïÞÉNNudy4NC"œ†D8 ‰pá´w4…™Mì§ŠVuU=KfLUkNeL–R¥§€ËÔ(~´åÕ£¯0ýĸÎÓ(Zmy.1·"ÃHŠIZ&hu÷ûÞÊÙC ÷ùT¯Ú¡V³_sû³è\BL§.gAf&KãÇJÕ¥ÔØh¹(fñðâÏò—s)Ë¢÷Å™Lʶê"¸¤Hw0Ruc‚]—½%€üÒB¾© aƒ-="ËW·å–š(´¶žï­›û¿^0ÿëÏ^¼a O$sðªouÜ?gÞWµïoéí3 s&…ñ™Ñe÷l’” ÓeI¡2ÕP´¹oûåªÑÿ¹¢ó­µWHg¾ÒÛñ“+ž82clìô35M _¥2ƒ»EÖÑ9š³¤#ëàæ*|8\‘Q¾.gv -5p{ `HT'eSÈBoæ‡ÚmÎbšËs}†B¦ìC¤ñpKxf˜Ê†<ô_®þÁnÁiôCpKð>‡DdFØO\„˜äRjÏid¶Š{TFd襦M&¾Z4ÁH¯ié ‰b87 [üHÁë©÷Säö ·ÈJÆ— ¯x&ºŒXuÁÆ•ââËâûâG¢(¯õéÿqÌGÍ%'û•ýaôo ±ƒEõAÂ[|A4ƒ`‚EìÉÀ¿gà1Ë> ‘*À˜†ÇX]\}¤^«?\Ï[•z¸äF–šl.ÖñµÖxÄá¬ò„QNÎ6«¹íá½áýahŒîå<ªGó zF<Û=;=‡=Ç<²Ñã±$/ 0tà’€'“-®À¡À[øïúk5Tão Æ ß­C5Äp›kéxuQ¨vVÇ«i¦ú^ƒ†¬j]T[k“"ÞxÂ/p‡˜¥\²¬;%Ëêu²¬^'Q½¶2jMÞ‚º5yË6½î>ÓK£–©¶Ü  ýõëAÛ1/Ûl^¤w/Ò{)|€ôîUë‹/„Ò^¼/‰yo‘$¨–´æ\®SÚ€æ ä5a‰äfŒ†l“@Â/MBÛq p÷äâ)¶I¯bÊ”µí£ˆDXµ?[ ‡V=ãX=ÿJ/·89¦ÅL¬<è%€úL©Zct¬ L¯Sy9cñpY2ŽŽžcËOžé`ñÙŠŒ sŸ•Ö“$_VÄ x¥R/ªh½è¢Ü$(]¹r—výÝÚœ¿í…×ÿ°ŸšzNÄÇ_ ¿¸§÷KÅ3Ûl(Ü‚/^sÝfp›ï.ÎH->ö{.XÚ6º÷òpФ¨ÏÀmT<–‡îâÿB¯Ÿþ<)¼ÌM'MX5¡»~e°_G°´ëÀÚÃÌla†Uj‚_¤T™}À!ˆÀ—üw’ÙV2¥ýéLš>•G*–"4rìÆ ÌöÁ¬ …«‚dåÝA A{p(Hýbv‹AWðDö÷ú¶ œ@Ô-ˆX0ûŽôùa‡nrÃón&¥m¡b*Â>K MF/U0æ}ùê<Ý‘‚o¤à+©o¤þ9EQCÖØ\ÅÛp«KѲýíÔ¤´w¶¯j?Ôλ]Nš±;Z<™†–º–û3mÑHULsy‹XÕ‰Q[Œ)½3 8œ€Äo˜"dÞMåã')±Oxôä.°ïËQ—ÁÖO³KÆ]zÿˆ0B^1m¦°× N[ýÁìÑ,Q³ÉÂÎìÞ,É>Íœ‹UMDaUôá(‰>6-hËä<944shhæ6Gl0b[mÛnÛÉ Õì0îmL üóðè‹8Ž ¿ˆ»7s6£lg>²žGxÙ¦mê‘K¥B%Û-È1T;uu³¼oGÏ…’™oÿ¤ƒ(þ‰¨ßRskYý4JÒˉ‘8$šƯ‰¼›²IŒiÍ:óþBú¯\ ×Í]À×iª¥†}‘ápzŠ5»§x2rÆ›Y”¡&©ÄoTÁå¸×/:Þu-sàÊ^¸ï<ðVÃÌ6¸Ñò åq e‚Í,J ‰Tp4”Ù`æ¼ãâl%ré8(qð8¤âÏL¼®U°•ˆ? ¡Ú¨ºPOq•!]ÏÇ©ÌÈû­þLÞkúV&K—/+0ù]ý¸ˆfvØ×ûwu…Ë>0®ã%Œo„7«|†ƒ ª*TU2›»4U«­Ï)* ¨Ô‡Õ'T~ »b¥ê\õJ±_td.dçÌ%Ûæ><÷…¹T™Û9w ;84W°)]Ð¥{Õ6æ¸.Òº€ëŠtÕw vêª(Þü!ûVºÎëZv¶ÿV;ëÐ{ç”Z°CŸŠŽ#¯0ÕçdI9:§îbï¦ÙC ¿ ߬\ÄyÐ6(ûJ^ù©ªË“:Ü^ftìŸ;c¸”ÜVÖ—ôPãè”kb2Ü7‰ ¡3ªŒþ±[N©IÕgè¡§>׊\&DœNcŸõ`Xr§ã“ ¼îÇÇdº̳›æ‰ùµs¶õ_!IjÝ7™-¦iÃÝ=/¶K²Í·D–n^»æfY¾Ôk7ÈèÕ­”¥„—Ðwð?3{ì6GÇüµó÷VüvILÊH’dúòܲþÊùÙøÂéó~àú eD¦©Ig5"Yµ@•0€Ys™‰$*\Ï™iZŸ¶`HL/ÙI±G5ÏŒx&á™ï©x‡R§<ýÖ)Íǘ>ã›aéÇÍp¬H£Ÿ;1Âìïg âi³Å\»» ÃfvEvcÕ°Ó¬2³.a¶èp¸ç=¸ç=»Ô:ÜÛ:L‡‰]¨ÛÂó’±FÏ®„ü.-o{=mrŠ»3ÖÔ“£zË=7¾ºYc†BŒK@#M$š¯Ü,5%–MÏ–ýSGتêÅ?'J{ð(‰²g±ðmyõôðIÝö\2l1‰M*¹/ôÐa)(a+#°ÿ†ˆf hžŒ*ºõ¸…> åÖŒ| (ÙSg‚ÀûÁ nÆ'gì*ñL72O”¦\ZCŒ5ߊ5âc“î¯Æ]1ä—1ä—±ÍW8U U´Ð[XVØÄÂÐ53”yº~¦ëlmêìD8%"‡ÇíÌœ8‘ÅêúI ĸÀ ìA=œŠECúÁØÙ4«Å%WñYÓQH+©S©T%<ÍI ®”hõédó)àãÉlªrÓ³¾³ÉŸ’çx¬ÔÍtq¹”qôœV_ç¤~Mš§Ÿ[É„º`E9·$ÉÅ1}Ð)Y’H&ÿ‘xµÝýÙ[t~…»W–[v­º´äGñ¯ ô/LϼûÕÇ3Žo’)•“2u¬¾x cüþÉ™1ä. ÎY”î¼íºÿM ®fâCRÅäIœ{]«âÎx¡-ŸÝq0ÄgʼnWI2* „ W¹[‰u6Ýb;ÓÁ»-Ƕ39à£å¸±¾£»|æI½ÎŒ;Ѽ‹/µ6Å«Õì‚m{Ç=ÈoÖVù@ñ±ÿÌ·ÑGª©Ï—dúZÂw®¾vÎŽ,7 8úÊÙ]È,=¤¯÷ÔK³GÑR€ïsbýg)cŸúªÏÜõ¿jÔˆ€ü¡øú<7JŸÒ&h¤²²Àã@1AMuŽÆG©M4aü{¨%33C ¦~)ýÁ”R ý”´Î™5‡ˆf—™ð³³‰<Ç;‡´a…,*Ó³.´]a#{2`F¥‹Ï82± ].Ãr–Û@¨pVÁè4¢£¡‘_ñ_ŸP-P´€køÉDa~ŽƒYéÔf2BÂkÙæ ºº¾[®Qxoœ0ÃÛ&¨0Ëv3¸jÀ! ìtˆ¾M©ƒŸÇ¿ÃÓWMðR^2à ŽóàÀyÀ>˜¶?š»"‘ˆ1 3nLÞž$+Ùð`’ÞPÜZ$+ذ£Hi…½¢ª‚ʲ l‚ii³‰zy#1>e$¼Ña$ÆÎ5ÛÖðšÎ5O¬9´æ­5kDeMvÍvõá5‚…[ƒkFÖíkö®9¼æÔ^]S¿†pk"ì˜Ê&‰}¯¾ÝÁ`åñ°³¥s÷´¶ãç‚‘Ý‹†_ì¼f÷jÜÅàTsf§us= Jš™ëiH¥u!ÌJz@QÍý0»ðöÃD?ü±˜%~ì‡hƒ? ©ÉÈCwzààžvr­ ·NR@+^oÝ•mG @'!’Hû·f.œ|`!>°ð[ƒ×â×Nš>×îZŒç‹ñÜÎÎïZîDšq"Í87ëÙFA¥újÃŒ(ïÓ,Y|"‹Od7Ï,ëË3ËúòL|¢0H9ÄÇñ±A&–kË/§³ÕåÛ—mù ›(·\]^¿|'»~j¹è¥ËÇ–/#ç˜ñ%ëé´2vÈÆ²5â$…w•ãX²ë£±²]ãþ˜Ð;i޳æÓSæý”_Q¦éѳB ,>ô €©”ÝÑIf>õgl*Á¶ÄÂK¶hæCí,ЦîeÔíz—ûs­{LøLëþÞš4aµ]$KR¾‘–¥÷Ån­½¬a`Ó\‹HW¢À{½ÅºvNnñlÆaì^]µ¹ÌŽÂËÏk»¼S™ºñwF#}ÖÒ}É…qgàò 7‚=×n\½â\ÏÀõo8?3¿ï²›kþ˜ªø4½q^vfÛÒ{>ëæYC“q8óćü=ŒÃÍ¡kiAôLRJ~KiÒo©{+éç»,“.Ë’·RòVâ@ÑeÉ—]–z9”Ø%×å'Ý–‚î¶,û,KK3xM ;Ã:¯^ø—DXg†}Qè‹®ˆ¦½ÛŽ&¦|–œøœ–9Ëæˆ9Ä&0™~n" ÁädÌÝiŠ›15šºMÔØ/B¿?3 'ÕUrW úGÄò‹_ðç·òä< &:ÞAŸ§?§‚ÍL¨—g"£‡n¢d…yt)}„>EùB|Z†§€®Ë)¿¥r”ßÒº}îιäðÜceÇ¥Ç(Ò˜c·Ûí?î=Çq©{,ŒÆt&å=$©Ø¤Ë2ö€A†jù3\–Êç»,u–ßUrU–õ‚þ]]¡2SÒ‚1ڬпsY*ºËR¡eƒò°ò„Â/aaW¬T™«ü¯.KÝ_é¨mÌýóUfþ£’ñ¸O9*§Z ô÷ŽÊsøØ¤›rŠOýÿöSêlñY7å穦†ÿÍKIÿ1³ZÀ˜Õ`Ñ_PòS’„î§ô]~ÊÅ]Íý—ÔÈŸïÄbühÆ5ÝŸï¥tvåÿù{¶0ã©gâï£rÎÇù¹y{XÓ¬‘HAŒèj—åݨ«›9„°FüœDè\'Bµ ®7A\€ëxÏï9à]ìV¨QYwwÍe¬c¹º^%'TXj†{Ìð¢™qŒÍæ{ÍT0?j&V‘€¶Àû|pÄòŽ…üÎü±™8ÍóÍdÓÄÓ"Ù,Â2qHôºû;œž"f-‘‹|˜Y<_5¤…V‡èáбЩý›vxáB÷nòö¡ìµ“œ »- ›¼&²CÞ#“oKðmxÁ!>ºˆ® T”u€=`ôó6ŒÚÌŒj~i{Ûö'•±ORѶÐFÞ¶Í­-Øî5º<åȤGçÀ}ÖšØMÑó˜‡D ŒFIÌì xÈß<`ö@ç^ž±x«ßo;rNÕ¹ÓIëgÙIä,ç9ñý<^œ?ÒÖ3k×y‹fV.´1DfDBõì7ÞÚ°5Ò^ö[óªbÜ)4Úz"t($L„@ …C/„¨ñe+ôYaõY+±bf’3“¬föþVÌL²Þ¢q:{©ó¸˜ \[NÎ5X1owøœj#¼W¾¡' OpŸœ|&£'þcŒ’Ñu)ɨ U3 §gråÜ ¬ù ½ê¤O)gÃöæ\®©‘ӑ߉ÖÉ€$Ñó‡z.ûÓîÿiü?ŽÞùëÿRüÚÒõîþú—ÿ ² ¼|Ý›ßÿŸÃïŽÿêþ×_¼óÍ-ÏÿèUPӰƆKŸÙϾȘ þ·g9Uw×Û˜¬dC[ðÁSžõËH ëUX_×¼çù«‡˜µ€Fp_ܧb3÷ÚŸY wöHŽ`‘¦˜H2b.„„¹„eç[î—«PÔ™Ý>fÖ°3-R[˶DZ„Ii».­]ØKŸõôq+V5× hWn¼tL›`âýÆ~ø}<ÙW÷|¡çk=?êáv¯A¬­¹í6Ú߆ø2®¬/-ª,^ã‹'è!ížó<Ãê©·{‹|ðó*ˆÙ¨2ûA©OF“âW®RÞPøF£r‘²R¡³WžSˆ¨€Çd…ž«¬?·¾a¥/YiÕ,XfZæ[–Yx§htI„QW÷¹T Ô,Ã[Û7|.„42åì‡ÑÏ‚Æa£ÄTÎÊéœ.¥Vb :ZûgøÎF‘\S‰ º ‡1»n»ê– ¶Œu×Í®ííìÈDk¯¼bR6¯AÙ<âc²YÝ)”Í·×ÝvÁ¥÷^зcAËÒ „¾h[ø…ÁÚ+Z^¼ç‹ét¢&l³µ¼úw²¹ú7y2Þ¼ÕeÕ…ó™–ìÌËþeÍðÎKâÅ®ŒkoZϬÆ[©_ó¾Ô Ïeáû´E*ë ÓKƒÃYJ±b»;½?9™råã¼_·í½ÍìÂ3›³¤(bý{›Ž.ˆ6B¨œ¡¥Ãpá?›^ãõ£!|»ÁKm½í…éøfm¸}ÑFÖ:ØÁŸc°®ÁYWae›^jNrIÈÇÀW 7Æà»A¦<þb¶'ÈM±5ÑJ²è/ac91ˆñ+MF€|w½^YÆ:=O)Àñ+íëì¿9öª^­"…ª×«ˆ¥ NV©"UõpñÀ4hÉÜ›!Þ<¨ºjººkg×þ.q¢ Vu½ÕEöTÃcé}iR•š²§nIÑåuëë¶ÔQ!öhŒ¼‹M.À»*öFìw±c‚«ë©#‰†Þ"&]I"dÁ˜‹‡@°­ž5Õ**`“ó‚NÇìÓT·¿ÐTXS …_*Qˆºä&hÒnÁxAlr5%š¨Ñ‹´@4^l® :šÞvÕB­Ê©f×nÅ~¼ÂodVU/^ømëÕ@è±pì d³Û܈õm²êÀûŒØ›#b½xX¤œO‰TVDÚ {)âÃâ"µ‹bŽÉþ\?sõò@¼VȽ£)qHÓ¸_þ)Ç5&g§ôäG–Ê~ å“I™c'K@f´“¦#èÕîÉä&]ÿ-6BÀ꜡Ä#΢Ýéµ %7Ãç8Ñïn+q~†GR§}ÒÒܚÿ˜³©W8“©ÇôX<¨œë$]é>ê‘sѾš zvŒ¬ÚpÛ@ôι›Ú6oËU”îs ,|áæ3·}=Cz‹Â‹`ùá×^P¨˜ßÜ»6Ú{øÛ«~~Ѧb1{?7ñ!FÑ9ø³–zÔÛ§AdpÓvN#²2 .a?Súl‚ †ì‘’ÖQ èQS(*&z9RÀæ.9gŽØE†Í1mƒ)[p‡ t<”…K¯(n£L\Wœ LÓm°H‘¿'•…êWÀ8é|TxCbðÉÙ‡xr"·[á½ÍdUMF‰ªþøîPôxÄÙ¸»Å`˜½ï6¦%È* ™U¨TËÿ!I5À@6©ŽbÀÙìq—¹^zÓ Í»ªð’^ÐgÁKU0Tµ+cÝfAÕiau>g±˜À£ÞfûM‡M|…b‚K:M3‘G³¦L&ª˜Â&b6e¨“ƒs}xÚ™2º1\æX†øh¦5sVºãf;0µ›3YÌY@US‡½=Èök9^¿?eV4aF ¶¿.`&ÝgepñrÒKYg…)‰¦«¶S1D4®*çÿ#“q£]¤³ãù9©š¤A%µ©E—„Ùv oåÍ_ý,±pÏ’lSÀfݼì’ë.^z?V!>ß®âM¥?áÚèÇO'бî)§Å{Êâ@oÅD¤»Zƒzl-YÔÄjÍŒeèJ©Ì¾ÿê·´‚&ØAø¡ÖÁ Ë:\¡žm|©ñµFúŸ2&ûêàHYàëõÄ):¡Z¬†!¹\{Tf´AÚh_ÐC›²÷dÉ <å€-6Ø’ox3é ¹¨=Lô™™‰W†>y‘L’upEYgöéì‹Y>V÷Tݺwêxg-<–„µ[jï«¥3kæ×l®¹·æÝ¡7³ x1³z~5ÉYA¬vU¯¯¦ ŸhNô$¨CNÀR1 VK,TÌŽ^%OE$·µé½&ò ÄÑè vÞ3´¾õŽû$_%U˜n‘P_e·Ùq¯ãQ}Úñ¢ƒ¼T¿N°_"ÝDøFGc¬‘š~GÆAOu×±ºc{•;LejÛªx¢ãPQ:²:ðP06”ù¿ži`rüpì)>fиAfÒQ¬ ÝÎéh ZÓzDhwÆùÌœŽ–®¯/<ãi™Yu)™·VNoj kU×ÜyC÷;Ov>ß-çµe§ d:Ó_ž¶å›ñ kêqYnoÈ'c}͉¶¸ˆ6.+Þ~0Pa™î\ƶlÝÄ{äNþO\ <«¥eL­ yœ5E±ÊUEú·VÁŽ*¸¾ê¶*2Pµ¤jU½?ùè 6Ì”AéÂ岈PyÖ!EÃŒjŽyOyÉ wÄ»ÚKT-¯"z2VØc¯)Q,]Íþ«­ÁAR_Ç> 3ˆë`$[·¤Ž(uٺκ‡ëx… Ä#Qc†‚š3P úG…já]¼‰ÔØ\é×ý¦6ù°bD‚ÄñÕ)Éoö ~‰íÐ üà×[¸V×ý÷E]±”ÛÅ»Dúœæð¹”M©Ð«UáEõU•¨Á%!ؤ=ÂæPJböŸ y­ E¢k3—‚½©ý©S)ª¦Sduj{jgЦ²¨v¡"w³zÔó æ¹6ÕÛc52˜iúnõnÜ1ÄN=8šï÷óÜ9z;`À¿·Â{­K%ÒÅ\ʨ•"X¹"4²Ÿ¡íØ"S-î/.ò½Í3™©'9w{˜‚õ´ß§j»gèé{LÕŠïN¯9^íÔݪ1¿?ç’à”g$ŒKx™^åêí Íœ™Oê.X‰žÜR\À ?·ŽNzJOþsí²vá….p]èÚ•÷ùC–l ­µ–Šï]ƶu³¦ûÁJCÅЕD)f‹D-Â^ö±éÆâ^<ÕŠ#ÅÕÅíE+O©‰ƒO$#LÛž‡cˆ¥¢æëó;óûó‡ó§ò/E8•Ö6ó³òçÄF_Ôµ´£¯”»Ÿ…šgWo>àÎ{°úDÉ Q ‡NÖ>Ž•¡'˜ÆÖTúa–GÙy61†›¬§lü]ÂFB‚³d"t¬öšTÆô¼Dc€Mg=ÿ­âdã9Æíp‘Ý”éî»þ|3¡“ÚÙ-v“@*BýYº«¾}Piçùáµý«on†ÉG`ÌÈt¸[^~oãÒ–ü•±¡ÕWOéjÍìò^åÄü¸"¥dÉ -ŸÕpA¸zÖÍ;þmê™5zÍchâÿòÑG¸ºýYNFçQ° =Sš åY,ÏByæË3-Ï¤Ò W«Þ£vÒ±ZB¥w”úQÚÙA½dg%u8øñ¾³Ô¯goyæÎ6¹ÐgRžuð½×ÙÁ/,hXÞ°¾Ê:vž\8\^ž©—5Œ5ËêÇêÉÑZpÔÂé bòÝØ ùa¶~=yÈnwÒ}«›.Gªa¯®×\T^î\ï$&'t®sÀ»ø«üŒ–QXA÷P"Óô5Jå< ü”y€÷~ÇÁML×G.I•¦l11óߣé^€ÎM0Ò´ºi{ÓΦÃMÇšDÝ9€Wv6ñMº¿Òí/¦Ð*JáטJÕÊ#«ì›–ñ¾‘itÛdeª÷ž²±';+WU’‘Jà*U£~9iQ‹••>õ¿ l§*ES•Êve§²_9¬SLŠ‚Ü#ÁþEqz\Ô_+pÕ‘HE…`€FÃnc²ªÊj5sfè4#ý&Ò9³ÒÀùõxÛœ_õGüµâ÷üð°š<Œ8…Éí¶»[[uÿã§Ð¸E ãý¯8‘zI¾ó‚µë$éÊhêÆ‘¥CõšE’ü…Žæ/ÊÒôd|áˆç^Û׿ofC"‘2²Á ÕHÔm ]>~øí·ÿ}Ýeª½‚ׯËIðÌ|ê•æñ¯³œ8)n OrÝüŒg¹NFÙF¥¿ë£Á‘ÙÖ^°èùűXÉ´³Í쉺pèÆ¡]׬ƒ…ŽòÜYž¹ò å™”gŠöañUö¯[q˜†C‡ÓqháJ/Õv£§QŸãÈ/&˜–˜ÝI»ahY –U‘Àûä#BŒïÃG@Œ¼Ï}Ä£ïkiDns;ü¾ýoíÄÜ¿ïø[1wÂï;ÿÖIò°, «{@ééì!Æt7t«¾@îñvx¼ ]î®d5hn$:!ÝyC'YÑ ’ÛŸ“:<WvÐþ˜Þ[; Íì³v¸±ýöv2­½ØN´!ïΓ|+œn…p:†Ñ™ÑùQ’ˆÀÌÌ‹À¾ˆW€L @Ò ITâ<ÎØ†!µ"=ƒ=«{ö÷î9Ö#ª=ÍÓ3Â.lÄS®§¾|²³GìAw;=Åph€] ЀÞɆ†Ÿ3¶€Œ[agŒ?<žH¦>C2x-àr2 deÞÊ|á3™¸a×8dß°Öá.* ˜'ðF©³3ž3¸pÈ\_s¼®).³Æ ÌL-®Ó9ãuÊ$oÐ2:shkïæÚ¹õN¸Èy£óu']åÅ %Ðí„f'8ãåôwD`×6²uŽ£øê8¬C,þHœÌˆß;N›âÐ_,~4~". Æ‹ÄWÇ·Çùøù^ø÷^¢z7z‰7Š_Àb¶¾QP£°. b¸è`t$JÙïÂu‡Âímñœ1ê=Ý K;acçþN2Ò¹ºso'íäïB~4<ìyåw“7[öP"D¢';Y™ÉètþÀe³zSŒ†d3ù2,Æ¾Ž–: dôV!íí·FÃŽh4L9îV¯Óáõ:oJ`çŒWé\,ŠOºrmm·EãìÉxgwg{÷mÞ{64Õ\@(?­3¶’ ƒ m´Üf`¸ŒMñ5=‰sÉð9–âdã‘R„ÎãF1c¸ø‚}îF'ÿŽ~.v"WbÙÖñÇÚ\î\«=×Ú„LîïyœBEf^R…À÷nMÌrûB½¹xÿ® dÃ5éà°+êo¸»¥¶á¢5‹fwkFdyíÀÒ…’”K64^^;«RY\ÿÎȪËì°ÿ‹¿šî3JR9\Zf¦.ÿñì¥]×@ߺëþ8þß¿~qÏo"•ª%ÆÓ2qœ·þw«Ÿ»pÚͤýЇ*!Vÿ•þžþ˜ë$‡5›©CëÜ ¸AjµÄé×!›ìé„xÙ‘s1Ø™`Wu„`{¹Ò͆ò¬§-ü';= K0”¨CN8Ø ¿žGÝp¢„6g[¼m]¿l:ôà’<ä=f¥¸6¿)Ožìµlb¯©½¥–\„Áv÷ò®õ™-Òç…¾ép_âq¸!¾'N–úŸò“.ÿWý¤Å¿ÙÿªŸý`ÎûùÈr,ò , €nÄ…óºò®E.jöØ]Å­&ðšÒ¦¼i‰—exÖðš(]ÌZéb–J)ç‡à°±‹Êz2P c6›I‰°g"ƒ‘½ªF"µ…jQò˜\Óe'UwÛµÊDÎ^ ìÎèîpØÜ©‡w’9'„N=JÕÄxDP©ßÝÔÔz¼ÅIw·qÇ;œ­&W-{£ê‚ ƒ°ºq{ãÞÆÃ¼±£‡ìh–mSÛ'Ú 08ÑÑJfJ ö†õvÕñêÚxY#˜^(Ü&‰©—ÄZ—ëVS«Ãdjý»vÖ©v:ué½JtÙ˜H¦ÒÕÕµ…B~z|ºÏëñ¸$Éhý¢ÛãñUW'25µ®Z£,I†B¡-?­ÕÔª¬7˜ì(ÀNØß©~¬Ø„ |»Ôr 3Õ)ºD°S~žrÞÒèdc½áI#{ø“„É®¸“zóVÝc@ÇM+£ÏÑ5 ·Ëv6©‰Ñ©Þ„ F’ãÙó¿9ß~Ý`Ò!+ŒÊ–ß4óÖþξMÙ€¯F’*Cƒ3Úlqï çU&$©?e^{ÁÐò+¾×cqä”ÎWþtCà‘!RF³/ÿŸë—ü˜QaJ¢Ö¹ç®Á|lü)RšÑæ\7þgÚêgöóýÌV×{µ‘_humo¤ÐŽC8h8té7$›½ÐC'©rwdyʸŠby®,gt”ZzÄJ4dºÉÜ¥#¸áÐC'2Z@Þ`©«›MåÙ\ž-åYÖpé)ÆÙTžÍåYw¿‡oÈXÁ‹ðFÁ[ Þl ß&|6…Ào¤4Üf€Û4´Ô¾í}$Ò7Ø·ºooß±>AÕ§S}|¶o `òÅï¬4m‚tõ2­Z[©ñò¬^çÆVhmm?Ät„†ç‰xö{¨Ç ÛÀfcÚ‡BÃ4Ki‹`h£+~îÿ¬ÞY½1JFKš½b±T{Ä,¨R>»;×x¼Ù§îvÛ;7C³Nꌸ›•ÃL¾ãYŽ9•N ¤T»&EÌ"M‰ÁЪØÃ±'b‡boÅ&b⚨øŒÄh,ÖW,™c%%[qe™”c/µT¬0Ù˧ N­½ý¶TÌ‘JÅÌ’tk,âˆI†Xd²F'm²½è¥ö}¥¢©)›å:‡Ïè¹ËÑ£(KÏýáÔƒYÝÇ5Ì Ã¹]»ÆÊ޽1ì?.;[™<Ô!Ì ŸˆØ¡ÇíBÚ,IË,ùD{;ŠM°×F+< ùY+Fɇ½—ÙCÝ’¼æ†¯œ'L˼ÁÎŽhK y("GZ« Ò¼5+:%)^“º²ù²ÿZô¥b'¼õ»3Ççõ¶Üõ‡«–Àíío»2#F"ÁàU+ž/~íÁ¾uÚ—\’]ª(2[B7(ÀV÷êØy§wç,qšîiˆM|HŸ¡r ¤æ‡ @`6”›xˆåy2©@'@o ’XÃ~Aô …ô£FFŒ&%J7Ñàqc >¢Ú„ñ Z.^dóÿÕ3"PnІÐLx_ˆ¢¾ÿ”‡o‡`Oä¥Ù~)LÃÝl Ý´„"ßÌ÷ð¤YèÈ" °,/…`³ø¨HŒ¢O$f!6l¡Õ2y(àaÆùÚ´±iåšTf’ã!šèÙop“H=‡éQÏL¼¬—d*nl ÿÞ˜¨-îåÜЉÅvš™m{·‚­>‰œÖíyÅVLGê¸ãõ••=¹·Þ¹/u0u4ESÏÕÔ µ0Ádýê düÏZÀ‚›œª©ƒ*5©>¯Öû5?9äſĿÁÿ°ÿ_0û‹ F5¤,!ݪv7¡+mØÝxtñðÁ“£êѱƒEÂužÉèêÁL ü$ŠÏ¥h={•TV‹!âÜJ ‰ƒÞ`B(5˜˜´–Ë Û££ç–}}¶²ÈäQRW 'û€N¶›hÕÛMˆ†¦Ö¾•©ŒL&Ū¢9YþÒú7¯¼è÷—]vQJÉF"ÁÚ7×÷H3ÿiü£µÙÞŸ]{ŸW Jr­ì¡Òø‘‡¶JRbë=`ûâÙ}]D’¿áõÔ°;ÝœçÆŸ¼»›‚j’×6JòF$³l:&~E÷ 9• qÏjwÌT ×®\!Â:,3ÀUV¸J÷¬0ß°Ù@Þ5üÅ@x þ,ÁAr”ѽFÈ!aÏÙÉ VX ,Wö)´ÇŽN¥µ"[½é~âÜaövïÖˆ|L&š<"¯–÷ʇeA®ØºŠÛÆ‘8àVq8ºÛË‘íz_™ág¸Î“'´qªÌb FO¡µ7Û0íÉesªA\Z¶Rïz<;b7=»~ËÏýåµkv_•ùn~ó%‹®kýò}·l!—ÿ‚o­º}ü7§ÇWoYüƒ?þÛǶõFH½  8Î>ÅÍŒÊç wpinDkß!ìˆÅª*ö!&r”iªo7vðbÂÃ8àÌ}5Þ¡D"dUdC„ŒD >²=B"h6ž9¨80¬.gŠ4}E/HÍpÃvTNb­îOdszK…Šs¦ªì°K¡±Û§Šæ`ó— †7.êÿƒt_Æm•©Ê[ã—wð+Å ŒÁQãxÿÂñ»¶þ!ãa<¬Vï6&™ŒÞ^XÈÃímäÕ¿^~š>/|«Žg¹ Æ`~gs¬6Xp0ãàÇÆ#‚ˆÂÂá¯vø¨>²Áø_ð¿æé‰¼ÑÎèüF Ýz,D”˜œæaÕË«Ý``6>÷"71†ÆÚÚ¢†bÅ?ó¨ W†—„V…HèÁäqîxµÇ&(0 ,ÑS÷ßRåkòwe"?è4„@¼]õÂ)/h^ðz!ÝÛÛ;ãQ¢~ÀD¨Åv O¨ ²·2«`lƒ@þ.¶.°ý̛ãb€Q¬?ÅÔ>vÙ–ï3Š‘?v]gJ£œn¡ŒŠf€i8­­n›¹¼' :¢Ã䉾C03KiÇM‚©ÝWÚ„¸µjð¾ ¯ýRï7UwÏ4¹Î÷¯ÛºmÅÌ›Rqc­ÔvóÑ]/­_ñ½»Æy§g½{ýcŠÕpÉõÚ%߸|ójÀxðØèå[¦¥¢Keù·w}ï–¥»û®Û?þŠù½™ñ³Ÿ [¸®{U»«×Š]õÒY¸¾ž½n«'·[a•eƒ…d,³-[h®Z¬°^u Ä•e¦²NÙ¬²Åk!îZg¥Î¬{(b”åL…’¥ª!Aw§¹ãZáT²uóöZèdr\LAªr–)àñ9+ë*ï`•´…9I•ˆ„¸ØùÈAÆ%‡K¯1ÄölRup d˜î&¶Hmm'0RUÛÚÊ 0)0ê_â˜--híÙ)Ž:õð•‹^U•ó,8/TÚEú$éžVŸå6Uü3Ü—×DoŸ-3ÅÁxiW“Ù7p©,í½î'ãÏÂwä‘ñ_KRFâ‘/ôö‹9è%+óæÇ??qc¢¢2"‹3V/fö Ö¦ÀïÉO·ŽGÑ»™xƒ~OXÅMçþ å}­¯·’Ó-pº .o^Óüv3]-Ârq‹HLÊ ™­\¬¦V¨ W¦k3.…a'qf+h!µq{ãÎFÚØ˜ÌŒ0 x°Räd$¬<åuú1å½N·×\µÙg ¡u¸b)ì/“ ©.xÂuÈõ–‹ºˆeë’<‘;”#j®>G6ævæçNåøS9È ï+d€È!¨>¡FH7õÈðØA6°Õ9sP÷<œ<0Œ¨“£H7gò‡Gó*»yPg–%Þ8ö)"(qF¶ë[˜Ú“(«÷%žX1ˆt’]r•ÑÄ-žÙ¤Ê<”þ§ó—}mÎìM»¸½:mâjÙqàÞüÇö\­ˆl:]>þýñ{/¶Î}Êâ ÷§[~÷š« eëÌÿÕÞñƒÁ¾Z³Ñl66T;D‰¬?Ú–Yúãk>þRE/[¡ç…Û9?£‹µkõæ;Ç8V ë£'¢dMÖ9_t’•*” z*`QÅŠ ržÞgЇ¹¸Û ›,÷X±Ð›¿KE‰ ² ´À@Æf/È&ÊÈá‘;#Šdv¼“ŒÑ£+FÓw‚°ÝGÜ&îˆØAæ‘&²•й£ñÈhœ¥ŠÍÉOÉâ)F1ɱò!Q €öá1\)>M/PB£ÄTõ‚¾0W“WŠ[¥2³§C[C°1¤5Är:„…¤¡M*´1ªº¢0ü;¢pY”#ŠH÷sÚÎ¥@P…Ùšr.E ¯çÚ‚åÀš°çº‘_ú€O!ñ3W¯—#^y>ÐðÜúá:–^à4ø2˜pé;lüSüF‹üµðþ4z©—;œŸ<_÷àüæÍíK§l>»bÿgw;¿n*½Î±xÛ¼üe󻯵Í|yaüKîøÐ¼ÙR½»Ò/oFçìå¶ß{ÝÑl{áÆÎ Ë›f.ÿ¶xwÃö½å[+–]‘6 ®7®AÃP"o [IñÔP|1 _ Ã;È>r6gâh(ƒ§Å×6\[‹7Ff+ÕSvúáá »Bñ«ªTd˜Þá·Ïï°]™ˆçiš4«5Ôâ_ïÜŸŽ‰K6‡àÍaxl]¢>"³¢¢ÈȬôî»Åw§ïC¾‚„Ëhù-ìS¢Å ¼P±KAŠañø»øßãI¼‡Ë}†E±ˆ¸a*Œý±²*ÇméRw« RkÕ:uºUÝ¥>«ö T©q¨Z±)q‘C¹]¹_I•ÆœqSÎ+q™Ò¡ìŠ¥ølÏeJ·Õaß)~[ŽÓLÚx VŸ'àuH?¾_-Þ~[‘=…òŒ£ÌŒà° êêý˜ÒN< O »ù°óá ,<ûü©«^ùcõð‰×V-ëºáêå·ú†± û[ÜËÞÇŠþ/úÿÙþî'Ï­ f>³ïŸ·ëž{_‡Ëp‡ ŸÐ)U|Ð"cyF ·BlžŸ9KòeŠU0¸hW#*—ÞÌrê<7d/ _$`ch|6ª‚sÊÄÏ0àÂi‚x½5‰ËÕÇâö\=>;>€~òûz\ò^kM«¸:lø/G!4ñbâ÷Ôbs|¥/1B‚há¤O 4¹~t*ÝÆ#?ì—ÞFEéçÄï9ˆÏ¶özèFºÉÅúŒâ⊲ôÅæŒŒb4ðcÿKøzô DƹïÀ‚ña¥?>B°ÒG@B ’8ú©$8ÐO(¾[0ÑI"ÞÄ'ì eo—RgC=g•XyàŒ€ Ù%`AºÚ\ð…tñ >nSˆ¿2‘à-þZl)D¥ŸpDŸ I9ÉBfñŒ¨ŽÇªúÏ.jtN²’€àؘþ÷O$‰;ÉB´,–‹¿è”l&ÿŠB hžaâIzÙì ù2.7ŸÂT!SÜ!ÞV WMUí?#~pÃ%‹zÌš?hÙ+žbx‰¥õÅ¢¥'ë¹Åiwq†X”UôÇDñ1ZÙŸDj„;Q02G4`!è‘à¬\Øê£`uH„I{ý³5ŸWûkú_Þú(ÙŸtÿ€£¿À 85'ù÷»ÿø¤ÿ­þÙ§â¥_€zÐAæ³Ôøkþ"¿$¼+9X©Æ˜PŠ”~¾ÔŸß.¿ý~ÔOqÝ ¬ Âê $½¿04'HzáÒ¼å¥ †KFqJK¯Ý VãìÜÜa &¹:`Ô£[û_Öøïĉõ'áø€Óø!œBâp¹^Ú¯ê¸ÿ»~è÷@¿…L:Qš`Œ/KÆIûÄW1l_p¨*˜â°¸ ¿¸Î þ¸Ë¿ÛŸøK—»çÞ™ ~ tt.]<‰z`Ï3Þs@|’çãkŸ Jƒ¥¯EÉLóÃÉ‹GY–‡P¿×Ts§Ÿ>rib¨?¥4…ÇÝÚS–3!äIœJÛ±~u„ ø|QiîëŸxc¿õ»[“C`3Œªú-øgÐ}èžP6 “}Ú !û"àÂTW×(;Æàš˜Ö˜î#*¿à2å%ÝCÁjâ­1*~Ž0ôѺ‚ª¥+½Ÿ*¿õ i>&$Pß6*LðÛP4Íâ©_øŠÊQ·ô_•¥¤84en܃çbËc-A B@qAˆhúÃÿ¿þ´=DDXÞ)NÞj£1Ú/V|^Ýþ1X;¦|Ìš14jtx\ŽÏè°¸œ‘ÒOù ç+йt(Öhü•J1 ÈQD´¿*Ñ—0%ñAAˆÑêTXüZ·Šªä±Je«~Qý„Æ“ù'aQ8iˆJçSLÜ¿ƒ‡ÃÀeg‚áËÏ,ýÒ+3Öòà0A8HD Ë$åÏå‹JL6,S=qå¬ò¸Q ö±³£³úï*œô,žSmÑŒˆ*5ÔâÕ³Ç×&FFµ­ïß°lÜ”8Íä¼Õý×?=:,0,%Yàf°À0¬ñ²Àp±»T´@à ˆX4JÌ…AqXt]‹ü•þ±‘£G¨Å/ÎAßÕ`„Hé#ÈD>Ø1ëćÉ/ÿ!Nž¥CÖxë?YCüÎ…Øq/kŒ’-%CÖÈ2$'FËn^âèØö†Qqå³VN¬ËŒ\@FÐXªûïvRaTžq%v®Î›¬‰›2n^µ¾-*2±vüìþÎZC)Xc,]nE~èÞÞ1–Þ·!>õ¬q1$`¯ò 9B^!ôAz„’ûÐ!Dvرà(¨ñ;â÷нÙ#Œý˜Û®ÀŠ^Ä>~?«ñÁ>Û}Èy|‡ö9ÖÍðv¶‹Ã–Î3FÏaFUHKO°tÁ9ñöÓÒ{¾vð­¢øòtñ·Wâ §¤\Üg)ð_<7fõ6áÖˆ«?²GÆGâ”]È«OJ´äRÂòPyUŽøÊÞ|³ˆ/Ç˹–‚cñ`¾oª^æã«µÕ¾¸Õw/9ë‹}Õ­ŒÚ„Á™#ˆŠž»BI,Ý; MšDänZ\nÎ耦êØÕÛèúKÛ5Qñ‘ýït£ä¤ëé= ]Á°HDŒ/ „ÌÆD® ¯ §¸&¸5˜hƒuÁÄ|AN‰E,Xü™8ØKíƒÝ>|ˆwaÙX¼ã´4/ù€½ÄŸˆü > ü'Ç¢|6×HOð?ÁP„6ª#àt´LÇùÒíd–/^6Š›š¥"ßlq–ŠV]Mátáa€LG`cqÁ˜4:%Çãqk‚N ºÄÒƒ°*XÖŸýðXkÅUí¤øžs”r4žW-H ¥|+æCMðˬ÷ê2”qii±þýwƒL€kèI»³Q}F…Õ*£jŠºUTDú^[8l§ËA¦Û§\|àTö®[zãè±Þõ%¬XçRÀº¾@~ÖÌ,_<ÈËxižwŸõô7½f½ŸÅÏßwÕ§OÝ´àÁ¹Àõ÷14 ƒýâpc,S• ‘6%Ï€aÒÓ_›øó×àìøp-W¬)”¤Kxö—åÆì¬(Áë#³ŒÑ…a†¡•€ó¡&Ô3±„1 ÀŽiBþþœHñ +Xü-€^Žs3#°O"‰QÖ+þøÌ¿ö;Å!_å/¥~¢…‚”àM\® `>#Ê(—ëƒÂÀ«ÅobÀÜ$ a"·¡’Üþ•ÜàA¹‚Ob’(šÞãSëÿÇg>uÊï”~ŠƒJñ™»øEؤ„÷³Þ˜ t‚Q§Š[8+ø LŸÖŠïÞC5°m†eG`Ò-és(]üè}A|pf0~Ñ)¼ÿk’8[ñcd))€vÝF­Êç” D>:2^ícôiõéö9 Vò©ñéò¡þâ»{óM9.-“°±(1)|`‚@& AG…S0iérž€ûkhí TEq8¢Ø ƒIF[iíSac~aNOIçw¾ÛÔ'Åq{Rúé‹ô©T+u|¸Ïر$B‡ Ú êç‡"©`‰Àƒø@’‡ º>´|¹h/?|XñÏÑ C+ì'|/[†ŒéSK¦L.?ÎsC¯KO›š2&9iÔÈx­&.6&zxT$¸ohH°*(0Àß—’TìŽ,¬žá¦#Õ?Æ»QÈôh­ÙÍFÂâTk½{tEu|¢úhOýœ9cSÝà «ãã£Ýd$ü—@üOµjëÝêr(–KJܨ¼Z„¾Oò P?'Ú*ªÝq_@?gŽÈNÒÀ\¿8Ñ\owGÖ×Ô¸‹‹ÕZwñ…t¯Ý¢ÝRQœ I‘AƒÖ¸x–¤Ø<îA¾ ZH èda±Û¸µ‰E Ô„ÕÀ˜oó®B@6˜ •SZ»Ûhu£­Ú©Ç¶lëS£Úš”€úÄzëüj7µ‚in´¸c¦•Ï…"à PÓ¨-W$D;hÍÚ-ÛÖÀ9±H´ß%åõ¶Ñâ¸&±êü «7Æ‹v‡6»ƒSÜ“¡ÙäUŸEÓ-æH»VÌnÙ²QëîžYí]/žÁœ‘ ús"HfæÅܼò–Ô‹6¶jÝkjË£gÝ—ì¿Eí.¾RqƒÕ×,5]l{g^¬Ý²Õ&õp›Ô#q­yq‘"!øªê¹ÕæÆD3˜q«,ú :òrÚøxwTŠH¸e‹YÔÏZJËúBÅò¢WE§`ЧÐm´HY$ÓƒD£µh/â æŠdbMMÑœ9ñÒ˜âiÕ…b­EÑr/=%5¼ ̃•¢¶‰%ÀÁ­­ÓŠž›MóÄ“-m©Ë“l?U¹‡ª8±¸fË–âDmñ–š-Ö¾5µ‰Zuâ–Ó¦mi5×h¥I¡ü‰­ÑîâmsÜêšF<MôŸâ ÑäÅÚF«<…òãAHðœÁêòW½EýØ,¦e´¶XÔTœ^â”g Ȭª®“¼M:gW¯hÑÇ霑f{%×üˆ¹8ùgòR`/zÿÖ>#ª…Œ{ÍÌj9¯EµÑ=vRÀü5bͱÁšð*±fÍ`‡¼&†bZårIowÜœ¢5¤K*Äó™\XM£É9E¢©8l•‰ÓfέÎãƒ(ç´æ-ža•KܤPnsE©§í¿å`ùüòÅWú“â}Ø€Ãt„½¡[öšÂŏ)þˆ}H÷º°£Pô$ì ôAº…¯\CàêKW£P¦(`°.Öþî ]¹.Õ«$fOÜš4Aú+CµÈ [ŽfdC.€IâŸN{)?¦î¿9bíÞ©m[wí„õWÍì^§¾Q·Žuë`Ó®¦/mÏýð¦Ñg&<9üÑu¿.Rë=zÂ6é¬ú`JA«˜O¨oI‹ËÖÖbsé#táb‘24h–­Í^i_Ô’ª-i©KÓgêôb…è˜Á m¡cÉ[[ÝÚ¬­t4¸–[ÛlÚòöÚf»³ÑÖæÔštq†]–Π“޹Ñër32³ Ù†¹ÿ*¬ÝåÝo ³µ×#ÝÚÍdíZôü›v[¾Åòðèk#{-U/m4Oÿܵï½ùîËk6\ÿ^ÀÃî:Ñô`rÏöeΛ^~¡vß„sqBû…PÔ6ý­Û»|ž±;×öÕÎÐǽþû+ß^Óuô±ƒ“g~çx­>›¼sÍ"aù'Ûߟùîo·E=5éÝåk_,üèÇμºwýÖ¿˜ž˜0eʾ(BÁ©. zzÊݾxóž OׯxþþŒö¶à‡F‘ˆ]é§S²¢ŽTL¹¦¿rìê·õÛ^°Ýa2¥ÿøXݪ¯œw„w ׬Új:}øÓ'ó²ŠN·ÿüÍÒãk£ò"²§>ö¤Œ/âû„c7ÿí¥¼ùïýóæ¼ú®s–×^}óÍÓ Ï³;?&ë>Ú”|àù²ûN.­×O˜>t ™„…n>øú–¯î?þtöKw^¿éUÍ«•³nôVv¸ºµ÷è5ºXyȆyFÆÒÖîtigØ\ËmMƒcêئêÆÈ‰C”ö%6m¥Ëº¤ÕÞ²H[ik[f¯³i+—>K—!·N™Q¦--1””–XæhM……ær‹¹(U;º.Ù«½T†ä…¹ºl}†.—{!lo32õ<ûþ“¿™¦½ÐxuêØ´µ1=÷û?8ûƒÊ÷Ú?}%sLÏ[ýæeýýë®~¿€ÓFÏ=ròË‹›Ü}lãÈo¯©V;¯øËÒð?^¬¾˜üpõU;Øckƒ«×Ƽºô–·ªÓß>&\—óÄ-œ>õëïÇ'<:ëŽkãïjÞplêäÛÜ—óöï~cßÈî>nË6÷_í7ìæ°Â ÿ6ýŸîT7W÷+³o{uó®3¬õ®1×Xoxö+ÿ¥;x©¡¶`â­·$dÜž°y˯õ¾#~zãWðß“9$=¼óƒÂsñ¿W_·ùÕâM]#¿«ùïçÄè“t#eÆqÿYÁžúÿÛžþ/©øï÷•A^·öî+\z+ŒÂFÑ¥¶ž;øèõ]“»þz0ø*û_•µ] ýÉ×6ÝXünɸ[¾~K‘÷£{VÌýî—ßëÌe}þ-ºó{rëwæGÒÃ3k„첎×,e§O-xÏÿôõ}W ^súÓ;J ÔÍoÞîÆ³ö>*m׸tgpu_‡üoWB_¬+’‰&._¾k˜š(™BQÀ~›åxµQФëX"kº“×$5º\­ÎqééÿÉA Ë+w¯£}k×у–F»S[gksÙìuV—Mk—Wt›SôÞ6[ƒ­ÍÖRgKÕZ[êµv—SÛî„fN­ÓÕf¯s5¯T:ÛkÛê\Z—#Uëj´i‡ìáá+úmy›µÎ%.L°D¸lKl-.íhÐ$Y j:Åú4Yfµ7[k›EM.å6Ô­Õ5Nùï::^ÔÚ´O5(1¥)÷æ¬ÉúŸ™æƒåÍŽEŽ´Eö]ŽH(K×Õ¥t'w'm)².N˜‘íÎKՉˑ>­®­Y7Ì+ÞD3_büÿ‹‹Éªwo?i™ú»îÜÁ×ßúŸxèúaÿüréS[žŸ—þY±êbEÁc÷Œ–´Y³ŽW½Põìé§æáé{C~Ì¿ëöãÍ3¯Ê=sÏ£ÆÖMÐ7LóCšã¡óß,éØx÷w;ïž×ûXógÓbÊÎVǼöQð¡÷n럹î÷w¾ûúµ¿í¸*þé‹ûë#«ªõë裺uôA‚±®ý¿  ÿ‹­Ñ%·Mº×öé¢z¬gâŧƒ¼ž7\oFä¹¾{èèTcô-wbïÚ½Ÿ†}Þ‰!³(ôëðÓPtDo0õÿíVÿîúðRŸ™£‹ôvÿ¡;~<ÆS#èUÒž8G¯ÓçêõY™s¯ð˜g××~øý¼‰-[¶ý`JÚWWŽiðžúåêgÇ?¿óSÛáÛ–†šñȧ¯o_7mNÒN½bCÝOß,,iøõ»¯^ºÉïÃÅ›FFZ2?»µjòÒS«ïø::¿äÞ„·âÒÆ²™ª{ŸþüìUÏO|²£ÿÚòç¢ß¼ö¡‹[Ùí?•nké¹öÆ÷~{!ü=ݯ… OßphÒ¨7ëgüòˌŭɟº®M½irÌô9$nûâþ/ÈmŸßÿ9é#ERCRØÓ T`tÚ4_t¦h>ø­3^ó†$«=,ÀB µm@Ñ&µkƒò6t`€‘¸Þý9‡)“´¢íûN0¤‚3FFÒ‚ÊjZBpVhtR‰Š,±KÐ1Šºàì8/å4pÎX(æHs/רL*Òš@ œóç,ïIcè#ó{Ø(Í‘c$µgT²ANDDó„_ˆÁ¤ÄKñU(i°ëÐl¤8†ózJ¦ŠMpvÏ”)¡ë™2…' ybÂÃ<Oî™­9oŠŸ½…âÉèÀŠŒÀP|8²­pÔé0p¡÷þùóÁM>î½î<Ñ]zï¿¶SÆ9Ò{xz÷é2 âcQ÷UVJåûZÛE|p_y…Ú/ïn|øž¾çÅoõ\“ŽøfÏ1€^ïéHÓÁnühOœÆØ‡î™=OÒüá^è‚T`,àãÆÐ…‡QÀ)€3 ºó0)ƒói€³¤ònü ’Û%©d»­î5î.7mÝ¿f×~ºÐípw¸·»ÙY÷79»ÿÂ~âÞ©Ùß ªíêyÆèníìyZœ w<þt±æégŠ5Æ'ðÕ¨_mT“ò£X÷Œñ²æèé£gÒ§ð­ød‚±º¥÷T’f—)߀ö Èç€íbÔJ<ý2ZsèÌaª=”˜´>zøìáÃL{Xw¸æp÷!fCnE­Ý§ÀwðÖžñã%Ëlí)(0ôáíFÿÓ¹šÓ§r5'OäJsüD~¾4('ÔÁ’ÂN„FÔ'Œ'ˆN§N œ`!­&5Î…¡ÏE]iá¬0”ÔàÜC®ûw’>ÜÖ«—N$pf ¸ôy8H©ýp> p à #Ü‹ŠÁ-à¸ÓמØÇ¡,À­=>Y0òMøªžáâÈ_%vÇTŒàr4ê p6Jœƒ’ãO™h"àY€c[‹õfÀa€‹8.œxà8ÀÓq–¤Çx ÃéÎ'Òà„>Y(_â#ãLœÕ;GÒú‹Öt‘±é…Ûq—ɇ8>}|ú8 Èq$àã½1d %ã dŒƒ1HÆIAÄ%(1@‰L3ŽŒq÷Çn<}#½íV 8–úðÞxÍ=7BÌűÆÔC4Üš®)›€µÎL î §' ªÍ-7#ÍM7Çkn|ó­H³ãÖ81nàž‰ù9Qi_èé„IFìÒ\#=[3-’QC/ 0ø×=õõÍ×=0ÉåDuµœè-+3HM¦Oç5EE¼|M¬éßB¦pü5˜âk0Á×à;ep®8púç€.üµQIÑ&|vÓ…Mä¬i$Þ-öˆŽ磧Έ4{Àûö€¿ï¿Ü´{|÷€$™b7PìŠÝfö®ŸfÁßC¨‘Χ¥³Î]ÝnF2z`^‹8ÁcË Þ™bh9cJÅâÓòáÜÅwâˆç)u o„š]pÞ@`o€Ú 0‡7@·wÁy?µ6€ZbÊS†?ÆŸýs4ê°ûÜuK9n4ŽwÆjtOY° Ì2Ý—Æ/Ë¿¬ù²õKa!Ì÷u dY' XÌÖ" ïuÜ óð¾X‡ÅÅÁØ“(­ù½8ú4É—¾NÓƒ0Iè¹Fƒ/#m/ î§ño`Šß@=#¾ØÛ¾LìûÅžrpÝÓ9 Ú©d!#Ö³¾P¸˜{Š„`4 &~€\©”‘¯Œ‚{Öƒo·ŽÍb$ù=#45& (Ô °@\šóaÌñ*8k¤”•Ž€…À¸á×ÁÙ@ð‘žNq‰¸Ð³~  oeôÁáŽL̓Qb€3ªæƒžžßëÈÐlÛ,íĞͩ€ÆôlŽ”"£„Û34[úðèÞ­!à.)8…€}C@±ýp¾@@…É‚ XÄÂhêD€ƒónÞÞî!­5@‡C{öJã‚U¢ƒ‰ËŸ b¨ ÜDœURÔŽœu‘ƒ³.²ÖNdŠÇ‘ ,¬ ¢" „vÁ¹€€R‘ T$L²H` JˆõÞZRU/°.7ƒ¤ ôWÁꨂF*`+— õ´Ã’hoޤî1/'ø¾aGïܹ¢wìè^&ã©Ódl4:L±x‡4SvÀ”Ýlw€Up.(¨'ò½C2ë§°0Š,F{Ú¥å¸w/Ç{øÎa/Ç{@éÁÏ{!qf/®ÙS³·uOëÞ5{ÖìUtïuï=¶÷ô^†ötïqï9¶çôA÷wã߉v·n·q7ÕvëºÝT½Û½ûØnÚº{Íî®ÝÝ»™ºÛÝ}¬›¶v¯éîêîîf¿vŽÕ|¶^܆|ÑÉ>¢ë鮟 îøk€‹bmªqËæÍõK·lh^{õÚë×î\ûðÚ'×*Öväj®0v”—Œ×€/; ÍGGG9Õq¦ã|½sãÃIÓÆÕ·n<²‘utê4Ëuës5ë;'iŒcgõ<8‰·³ Ð°¿óhç©Î3ç;U§¦“,ìè$»:±º÷dÇ«ž"f”âaÒ÷˜LÒì/ƒ±±˜£JK Á°ŽÎ Ì ÏÉ We†d„ûéúpšŽÒµO9"æôÔ!Óz‚ÃMí ViºL dligˆÞg#@9@+€¸ù-…I\*-ü¥°ð—J»ìR˜Ô¥°«-…M@)b ÏÔžÈHI±©=ÆI‰iƒ%ÓŒ~Pd ŽŠ2 §É$X'‰^A&õ&¥ˆ]ß« ñÄÞ¸8 ÷ˆ{bêFkÄœhB *>¾´™Ð ÌElÜ––f0 Ã4†QIªÑIª1)ªÔUBbЈDUœ&H«Q©ÔÁA~Jÿ…oX!@A“4Z$}ñ–†jN‡â3 S&œ¦8Ÿî¢§èe]*¬Rá|ÕBÕyUEi¢Ò£ò£Ê¢F)ÎG D‘hé3<ЇehÂÕ!,,pXžß“¡Q÷áy€Bûð\@¬Ï1†eh¢ÇghTã24Ô¡AyšòÌôDãMZwÂÌ-‰+ÜÆŠ”ÚM}jTµâÁnÝ!ÓÐ4K;®,pg¦Lë£Ú wFÊ4·_ù¼êß0JÝdLp‹›mê#€B çΫîÃQbugôC¥{ZMçõ×ÏI‰u׋_GZ;Ç!&ºbç KVãjwŠÿ).W œ½Ž£G™ÝcÌVwª¹¦èRéìtºœNOÎûm5À°ÝÓÖåj÷"’ „r çu"/WûPm ϶§H©ö!Å\¥í—JuÊ”@$ò–ȶ]”ÕÎe´§ˆ‚¥ÂöËŸÙ3({P[è[»«½°Z\¯²zÖˆ2«§¤LŠ Y½Ñ±RAïø‰†ô#°©ÄÝœû<,§¬ŽÌ¯´·u©H^Ú[²fÃ]`Ó!º Z4àý˜Bo_ü’¬'àÛÀïŠðD:m„žý^à ­Á#šQXÈe¯)Се[ñ.¼IøaàAdPÓnúª¸Ýʶ²›>Â+ìèÀwà%àÏ÷€­¦w£ÖÌnhn†8Vú,¸ÍxÿêY/£¿ …ì'á –7ð<ö¥ç6)KQPáfñ;RÓçü«Ø¤ÃSÌ Ž„O‚ˆ“ þš‚Ra´ÒP:xª¼$¬•r`òÀÿÆAo'€G½‚…HP‹ÃªÃ ìcÚ…ýÐX‰P=öÇ8} Öý èø*Â*¬ÆÁ8‡â0ô3ÇÃpŽD'Ð)t½†£ðpcp,ŽÃ¬ÿIÀ‰x‰>Á£ÀúIx4NF§!нŽ¡ýx NÁ©èF<¹qNOÒã œ‰>ÃYè7œsp.ÎØŸï ·Q#‡Çã x"ž„ó±›p.Dßâ"lFOâbôžŒ§à<“ßú #+ŽÄT…Rë0–åà/àáðúYàÑÕhÌŠyh>Ä,;Ìœ&ñ%F —âéxêÆe¨—òãÀ3q̆V´æµ[pž…gãj<ÏE¿àyx>^€¯‚Ö>¸/Ä5è]lŵ0Wê± 7àE¸ÛñbÜ„>ÅÍh^‚[°·ÂÜYz5º/Åm؉vc:€Ûñ2¼¯À+ñ*ô9^~ÇWãkðµ¸fbDôµx ^‹×áõø:܉7À|Ù„7£ïð¼=·¡/ñõø¼}¾A›q¾ß„oÆ·à[ñX=žÅ·áÛñx'¾ß…ïÆ÷€WwãÝxÞ‹ïÅ÷á}ø~ü~?„ÆàGñc0sÜøÌë{pîÅñ!|?Žûðü~?…ŸÆÏà£ø~"Ãóø8~¿ˆ_Â/Cì}ÿŸÀ'ñkø Ea°b C°RG¡á(ÅàÓøuü~¿…߯ïàwñ{ø}üþÿ„?ÆgðYü7ü þ†~@?¢¿ãÏñøKüþƒ¿Åßásø{|_À?@¤ÿ;þþ _ÄÿÄ?ã_ð¯ø7ü;þ÷ã‚ğâý"¡è„ý„.ñ!¾Ä(‰? D|nµš“JÂH8F"H$‰"ÃI4¬±á4(Ý +dºûŒí°k ¦Þ±Ç+í}D qüvQò’@!A÷’d$E’Èh’ 1òiˆþ ´ƒ¤ ’JÆ¢N’jI':¢'$“d‘lôOØñ¼€‚‘ v8qèa’ƒøÕÁ½$—ä!€&Áê}¬‡‡Ñãe¡ãÄ€”H€X¹vG!Ò<„ È8´‰ŒG‰°¢­CÏAT $aÝ‚¶‘I$Ÿ‰‰BRk^1 húZH&Ãj &S`%í%%ˆ’©d)%ÓÉ RFÊÉLRA*ÑõI߃•ó}X>D úÖ‰3°ž%Ud™ ëè2—Ì#óagpYHjˆ•Ô’:ROl¤,"ÄN“&ÒL–â ­d)i#Nâ"ídYNV•dYM®&×kIYCÖ’ud=¹Žt’ d#ÙD6“-d+ÙF®'7í¤‹ÜHn"7“[È­d¹ÜNî ;Éä.r7¹‡ì"Ýd7¬š{ɽä>²ÜO ’‡ÈÃäò(yŒì'nr€ô^r"‡Éã¤!O'ÉSäiò 9JŽ‘gÉsäyrœ¼@^$/‘—É+äUòr‚œ$¯‘Sä4y¼AÞ$o‘·É;ä]òyŸ|@>$%‘Ér–ü|B>%Ÿ‘ÏÉäKòùš|C¾%ß‘sä{rž\ ?ÉßÉ?ÈOä"ù'ù™üB~%¿‘ßɤŸ PD1%”RFª >Ô—úQ%õ§4QUÓ`BCi §Ãh¤Qt8¦14–ÆQ ÕÒxš@é:í¢£hM“éšBSéXšFÓ©ŽêiͤY4›æÐ\šG tO'ЉtͧFj¢´Q3-¦“éZB§Òi´”N§3h-§3i­¤ZEgÑÙ´šÎ¡sé<:Ÿ. WÑ…´†Zi-­£õÔFè"ÚHít1m¢Ít m¡ÚJ—Ò6ê¤.ÚN—Ñåt]IWÑÕôjz ½–vÐ5t-]G×Óëh'Ý@7ÒMt3ÝB·ÒmôzzÝN»èô&z3½…ÞJwÐÛèíôtÝIï¤w¡;éÝôº ÖìÝtÝKï¥÷Ñ}ô~ú}>D¦ÐGéct?uÓ´‡öÒƒô=L§}ô}‚>IŸ¢OÓgèQzŒ>KŸ£ÏÓãôú"}‰¾L_¡¯Ò¿Ðô$}ž¢§éëô ú&}‹¾Mß¡ïÒ÷èûôú!ý+ýˆ~LÏгôoôú)ýŒ~N¿ _Ò¯è×ôú-ýŽž£ßÓóôýþHÿNÿA¢é?éÏôú+ýþNÿ ý6O 3Â(cL` æÃ|™S2ÀYS15 f!,”…±p6ŒE°Hņ³hÃbYÓ0-‹g ,‘`#Ù(–ÄF³d6†¥°T6–¥±t¦cz–Á2YËf9,—å1ÇÆ³ l"›Äò™‘™X+dEÌÌŠÙd6…•°©l+eÓÙ VÆÊÙLVÁ*™…U±Yl6«fsØ\6Íg ØUl!«}t-«cõÌÆØ"ÖÈìl1k‚=ÒÖ¬•-emÌÉ\¬-cËÙ ¶’­b«ÙÕìv-ë`kØZ¶Ž­g×±N¶md›Øf¶ö_ÛØõì¶u±ÙMìfv »•í`·±ÛÙl'»“ÝÅîf÷°]¬›íf{Ø^v/»íc÷³؃ì!ö0{„=Êcû™›`=¬—d‡Øaö8ëcGØìIö{š=ÃŽ²cìYö{žg/°ÙKìeö {•ý…`'Ùkì;Í^go°7Ù[ìmö{—½ÇÞg°Ù_ÙGìcv†ecŸ°OÙgìsöû’}žfß°oÙwìûžgØìGöwöö»ÈþÉ~f¿°_Ùoìwöëg°øØB ‚ |_ÁOP þB€( *A- !B¨&„ Ä!Rˆ† ÑBŒ+Ä A+Ä B¢0B)Œ’„ÑB²0FHR…±Bš.è½!d YB¶#äú,±;ö–EBZK{s³ºÅѲÄÚÖm6W{[‹ÂTÛf[fSšÚ ÈZ×î²ù˜–XëÚ->&Ç"G‹­ÉÇd–Êý ëìmuíKšm+”…õ—µ®ÎÖâRÕY¡5 6‡Õ¥0Ë9³ÌÕìiæcæ\Íœk{‹]§/ÎòŸ<Ä5`rcÉ«L œì¡õŸ2Ô†M©µ¶)J\öæz›¢D–R2$¥„K)‘¥øOõâ>Í‹»,>3GQ*õ- Ô«NQ*õ7)`¥À^1Cj§˜!U̸‚UV¶¢LÒ&°¬±,ÙÖ¾¤ÙÚîò)“ò/s6[2“ Žd^WðÊÎQTÊ&¯ôR¿Ò«]€Å[_‹ÄÈß²´Ýá²I?†—ùäd0‹h­*ÙZU’~B•8ÒU—hYÅÍV%›M1[Öpö¢6ë2›ÿì!-üf×Ûmm6§Ý©˜#WΪT̕Ȕs‡ÆCÒ£ —š[)¬Í.…U4ëÃY¹t+w «Mî}—ÃÕ 9\½ìbõ²ÃÙäœMæjmã\m—8\¶ÿ"/›.òv¸EC×èåp¢ í² í’;gmç^¶Ø‹eÓ•^–гÍÖÒlm©·×)še—köÂfo—+d͢˵ȃÐ"»I‹Wsÿk«Ãéjs´6Ú¸ûéÙý— ¬ƒ»ŸÃËýÚ8’ù¶]é~¹ §<N¯~9½ÝÏå­»ËK÷œLæíÕ.Û«]v¹vÉåÚ/Ѭ۰»ÜrY«å²W-÷r¹å—[)W®ôr¹U²Ë­ºÔå2 ÔÖ²H¹ÈÖ¶Œ^Û\IJ¦’™íÄÒHê࿉ԹHCmh°4“ (©TK5’†&@M¤a1±/š-‹œ él—Q³¯ˆ€·Óo0a÷¤šE5Š tÙrÛZ5ʨ‰8[y}q¹ˆk•˜ËÐåûYí­0…m~µžT'UïIÙ<©Oj‘'ÕèIÙ=©ÅžT“'ÕìI-ñ¤Z<)‡'ÕêI-õ¤Ú<)§'åò¤Ú=©ežÔrOj…'µÒ“Z5˜RZ=S:<É ›4öƒYßU¶6v+ÀÃ[lv-—ò~®F˜jbÊ·ÁÑÞ&'ìËä6Nû ©œ²EJÙÄh)5j±ËŒDÎŽæz§ke³Í¸{Ò a0(Ï’†2 ÍC=4’TON’ì!¥{2¢ƒ•xeìC&y¦eÞžœÄÛC$òödDÞö–™ôΓ†Þ ¦åÞ æ$ †2 ‡4ðÐHxr’"QƒÁ wuÇ·ZÛ DÚ<ЇH%mÞ}‘çqâ’ƒ³I->-¦ÖÏÌ«s@^"Ž¥µm¥¬§)ƒcXzímVE«Í µ~2Y·µ·Ú­A`BXhDO³ÖÛ ¯¨k¶.xÏ{[(oÁl⃕lõí-Ð Î6´ ´Jø†~Ö»=GŸ‘•¡Üû —­^±ÄÞ".ÐUGKý`‹<ƒb 07S1EŸ—%£l½„23•ŽV[K-lìmÒÂW\\\(ë¢ÏQ6صƒdX÷%^:̹RÇ»«Ëä8‹ãlŽs8ÎåxÎÀ1Ÿ€ºÿËw™ú Á$.ÉÂd1^+ =Kµo_Æ‹¸7 Å]ƒP ‹UÀøøz±*´ÕÛaýŠ—õ€)^›Åtiï (“¶JIžs‰µ¹Y) •’ª!ÉR>pP¼ÜPÒANJŠÈII)é'ª$¥Ô^zI\9)äÑPÊ{«)•øËºÊiYaY€8&zN/ÙX—U¤ó”äyR†ÁT†§6;CnoÈðÔé=©¡²L¹•Nǹçxj²8½<³ ‡¨³yG~Æ×ÒÌ¥ëŠ<5žÖ9zNoâ¸PÆ&îžþdzÊ29•É£{æP*Ó“Êò¤¸–&“§„÷Äd–qÁï\n\o3oS<$ã¦Ó{ê²<œ²¸–\V‡*k¨µGÛ,¶YÙž”Ç–Yƒ#>Äc(5h!}—”cò” ŽAž§ÄC—=ä‰Ù‰Ù;d{4ËæRà±cνG·!YžQÌácQäñ¡Ìœ!Û{ôôFƒÇR9^¹é¹ÜÖž>AÜòÔ z?·Eá õó ™J^áUÉ+#­HÉûk’è±Eî`/a‰æ²=þ›ãÑžû‡¡€ã"îwžÞçzúœ;¤1§2yúœçéiž‡2ÏãEy\OS§Ä£gÞ žz=·¤©˜"·™™ç‹‡¤yF$Û¬`¨Î£eÞ ï¶ñXÉàÑÖàÑv(ö ¤Á£¥aP˼!Ÿ7 ¥<6òŒüyRžT¦'•åIyú¯•A <%óh§7dù®´ºäÛ ò´ò47ð!7{ÔñR6/ÙÙ¾u+Û¤õALÈ×µ¦fXÌYì„ÉVX$„"[³ËêcnuÚa‹ÁæB5C¥¥R¬V ašµµÕª(µ.©­·’éídF;©¶û”Ik!åvZÑè*í‹–X©ÅÚîS%³¢åvZPî´+%©.G‹CÚdé‹åÕ°cÇr\ı™ãbçqúÓpúN_Àé 8}Aa·ˆ—ÒzN¤çDzN¤çDz.TÏ…òö…_°¨£ ^‘ÁepFœQg”Áepí3¸öNoàôNoàôNoàôNoàô…¼}!o_Xè'´¤a€˜¼{!Wgrq™\\&'Ïää™\\&—ÉÅerqEœ¾ˆÓqú¢‚îD^¶Éâ³xã,Þ8‹ ËⲸ°bÞ¾˜·7TyœŠg.íQ6oœÍ™fsfÙ\c3gjdÊ•0(Ë–ØyeošÃ›æð¦9œu×7‡‹ÈáÆÉá¢LœÞÄéMœÞÄéMœÞÄéMœÞÄé‹yûbÞ¾¸P°JS¼Vœâ‹¤)^/MqŸâ«Ä).Vº¤)n§x“4Å›å)ÞÒNVØ}òÐжF‡Â)Nn½ !ê‚9ÞÎçx+Ìï:È Ñ2üZI§˜ë4Ð+¤½ÒzYMÀ:>¹y^7˜Ïæ8“ã,Ž38Îá8—OnN—Çùäñvyœ>Óçq¾yœ>ÓpúN_Àé 2}EÜP\Àp‚ÜÛQ"—KËåÔzÎMϹë¹t=o§çLõ¾¶K¢D.o˜ËdpFœQ¯ÏàŒ2ÛqÁ\Ë Þ=§3p>ÞÎÀé œÞÀù8½Óòö…¼}!o_ÈÛæúÙ=QÄ~EÉålryóL®F&W+“‹Íäì39ûL.¶hns~E¼}QF°·P/Cq E\bQn€ãЏ“Ëç_î`üá³8qW/‹‹Ëâêeqõ̼ޜÖ~iÈ‘ãÐe…íW:ŸÁ¹|Fgs ²¹Ù\B6× ›k=¨7Lö æ2óöæÁvœŸ™ó7ç*—µ\lrƒošÃIs¸*9œuW%‡‹(æ*ä b®Š‰Ó›8?ooâ|Lœ‰ó7qz§/äÏÛóöŹ<î˜8–/™2å®ê2‹9ÎååòԜűIzxɘùY[.[³Ínå>¸u x(. Å<_Ìë̓Ë-//äåE<_4¸OàV)\/‹ýêíÖæ•.{—lææ"Ų6k]ãJñÙ&ù㡬ÑÑÖ"8¤s•tnϬÞѲ( Þ᪵5;–×9–ÔúI÷£¥”´­”RÒ§b*°Ñáh²Ö:ä “tɯ(Q¡ŒŠdd–Q±Œ&ËhŠŒJd4UFÓdT*£é2š!£2•Ëh¦Œ*dT)#‹Œªd4KF³eT-£92š+ß­0Y=7VüM‹¿d0pùü„™ß€0óf~Â\Àå󽆙ï5Ì|¯aæ{3ß“˜ùæÜÌ7çf¾97rù|“n.äòù½ s!—Ïo ˜ù-s!—Ï÷,f¾‡1ó=Š™ï©Í|Om.âòùnÜ\Äåqù|÷n.âòù=3¿'`æ÷ÌE\~—Ï÷Hf¾g2qù|kæ›X3ßÜšùf×læòù¶ÜÌ7Çf3—ϯðÍü ß̯ðÍf.ßÌ囹|¾3ó=¹˜Ë/æòùNÔ\Ìåñ°¹˜Ëã·)ÌÅüã(“Nú%E ÆÁ)q)qqééúÆ`³eZr –”ä­¹–K¦ÅsŒÒjMâ‘’¹`ð# ’‹-33Â"ÑàÀ†!âabó‰âaÍ´Zs=‡¨r&Ð$"!%73-95=)c|Ê((MÉJIÏ…?}zRf¦63mDn†>m|fòDÛ‰†¢‘%#‹Ú2Sl¥ m£SâÊc2ú19É©cJñБ,U^%8ÿ_ÇK§$M~ N{éÿÇðôa8‘íPœÑr;6² k¹9±tf+2¯å:Íì, ›Xê,+Í4}ú„ì²Ç0ô3yÂÏš?1²•Â$ËÊÊJ#G’˜§âîì2ÞÆë-ÂMÿþý4³cô6yr§É“'D7ý?Ö†bËÏÏ/;±Of–ȘÞúžó˦{±»Ø]0=~wš‘=wXî°ì¬ÈÞsˆÞ»êÕ¸ŽWÉí6ÞÕxW»™ÖúÜøÕiöBYG™•Ûî,ëܾÚ:wàœD”qÎÉD™WàÜ“¨³þŽa™-gÈÅr•|A¾(7Â0Œ¶FG£·á4êŒ Œ¹ÆÍ¹2çëÜι=sÇäžšû_¹3rgæþ2÷âÜGrŸË}=wcîžÜÏrÍvfŽ™ 6‡˜#ÌQf™Yk.4ï2ï5èåè•Ù+«W^/g¯¢^gçɼ¤¼yóºçåä È“7>Ï•çîžGþýùkó_Éðp¼š´Œy\&~?ûeWæñIù¸´yÊŽlY8ÒwtØ‘Ö$Vº}°…o«Ú¶kÛßqÞ±MEò·uØ–ºm×Öý[»uÑ–¶<·åi¾eŽE[êÏzûO›.ÙT¿)iÓôM£ˆd?Xîvq[¬cª1Ý8ËÆÏ²Ž¸Ü_0<G…1¯i»¿C{‹Õõêhð!õ4¸F­U/©—Ô:èòïêÐçVÇbøÛ*¢${ÅhRJÒØ¤‡’Ö&íHÚM”œŽ#'yDò(+7y„“}És’›¬,M¶×m'_š|àeŒÿwÓ6%_À+»‹Å—²Ø(Þ7ˆe²^m'»Š'Ä^Y(öHgl}ddu¤8›Wé­ψ?ŠÏe&<\‘^Œ(Ñ–RxU[{J£”NÔ±Õõ‚ehÏÉr$Í£kh>- …´ˆ®¥ßÐbºŽ×âÝ@7ÒMt3ÝBKh©^µH·Ó2ºƒ–Óˆý$‰¿ õ_‰wÄ6ñ–Ø$È.òÙ]'Û‹×d!"Êx±A<©×`Êãke†l+Lj:1L¦‰¥âfq«ø‚rôh ^ðÕÞT@…t ó:Ûi4„h7˜¦Ó ú9I¿ ™âi:‡t)D—ÐÕ"ƒî¦»èº—~K+è!Xøô8=I«è¯ô½HkE:m¤m´qo½#ž¢÷ékúŠöÓ7" c¨¶”ŸÈ£ûÈIR?ZIýé÷4¡ô0Ñ£4ˆ£áô,GOÓ0z¾²šŽ¥§ègôG:žþD£è9I¦è/TJÏÓú§Zú’êè5 àÏ¡ƒTOt>…é!èb¡èW¢ ]F—‹ºR¤Ò¢èK#h õ¡û©/ýŽ\ôKû4=9ŠW4Ž•'É ²TŽS…j€^×d VƒÆ©Æ/ŒZãr㣣^E7ŨF|}ÆxÞØb|säëϬÕgÆ­ˆÈŒOŒFÕAž'kåCÒ+ï—+ìUˆzåáƒòby¡\('«ìu‘zMdPÎáuÙk#+çɼÚQ¯uŒ_ç¨W9>l¯`Ô«Ÿ•ÏñZŵöúÄÈêD½6Q¯HÔëã×"ꕈO˧äùx³õˆ_É¿¡ïÙ ¿–wÈýr¹<€ØÝ(ï–ayA²F>!Crµ¬—‘såKòù²¼T®“Wȿ˫å?å5r£œ/7Éëä6yƒÜ!o”ïÊä—²N®‘Õòò6ù‘¼@þUÞ)ÊEr³¼V¾M ƒ.=¾ãÇ°ŽŠ.Éñk©Œ{Œ»¼¾ð·¼¾°ù*Ì5Æjã9^KøGãEã¯ÆË¼Šp-¯"l¾âr»±Íx× ¾Ã+›¯³üÌøÔøŠ× ~®à0ÊÁ+¥^hxUG•¡²xE`¦^Øbå]°ìgaÛ/Àº·Â¾÷ÁRðÕtաŪÈüf+G›¯wl¶6´ùÚÃë9›®²Œ®Cµ× ¯ŠãVPêÕ¨¼ÖT•¨áj$¯˜Üe|hì4öDVšªŸ©j¯‡LQmýÆ×*Iµ®/­T£U©¦º¨|^…Ê«IÕqêXDýB9Pñ*ìþ2]¯—™$ ©Än^ ž‚‘ا¼®üke¾¸Wå_%®ÖëîÅ|1\¯Ðo±2ŸWâë5øŽA¼zý#^½¾K;y~k«ïo/‰U²­x^¬ÿoŠ7Ä+âYñºÈæ¯,èo,‰!èìSÈúˆN³‘7®eûöMüøûr1÷F\Œ>w&zػлރžõ^ô­@¿ú÷¬/ oEÏŠ~u+zÖíôz֯Ы¢O•Ñßc4€q@ŠÌt—=äñòñ,z÷sÄ_1Ð_6Ød\+^„nþf\è/T¼ŒÞû}ñF¯A[;Äj±VI@|*‹1Fè…Þ½ Û,I[•xJ¼Šþû2ÙWìÔßÐ…uµ•±[܈1…þßOC1ž°Æ'ò‚0–У‡½Œ®TŽ·û¸1rú¹Ñl é Køþ–@—üÿX ƈïjŒì’~K蘰„gLà‘9FÞz„|ä1²nݬ”…– ¿§CÅ¢^[‚dYf'Ä,zî¡-½üÍ8,AŸG,g í0?È02-KÀì`Šì‚>yƒlk¨¨%8ìù„žMt¿ÁœAÏî4ÒÅk˜Ut«¬ˆ%`nÑ #Í-ç(nŒU¬¹Æ'¡4ò|c)Ï7nÁ¼ãÌ7Û3Ž›õ|ã´ÿáùÆ|Ì4nÀŒãfÌKôŒã#ã›Ä(!bß{fÕ$"`îfE„‡äñ,æsG"‚ܧ#æu÷cu/fP+1ƒú=æPŸÉ-#f~_aî÷7̶šF„ݘ nÀ|ðkC`Æøffßkf‡>&a ±¾A??)&§Ý7âç)Ý7Ð'üL¥'?E­ŸŒPƒîä_Ñ/œ÷å‘D¯Ñ•4U¤ÒHybâ™zâ™zâ™zâ™zâ™zâ™zâ™zâ™zâ™zâ™zâ™:?S·ç8Æ^oèo•Ÿ>5+\ Ø5<°ãÙá\ýoËÃ~Àe —‡ç’!¥Æeqxú_#|9µ{ÒFìL¥€]Ãã54Ð ¸<ü(¥á^`qøôÓFø|ÀyáÕ€ Þ¤¡ØÓxp¯†(ù:zó®á•€ÝÂë³.o¦Nœ›:Î Ïœ6dц ÞšY ¬ñ% —2¼áíá‹—1\ÎðN ÁQ5à^†Ÿ åYbŸ†²\wE#u]¹–®´8¼ð&Æ—„½€·…—kŽöîeøIxà> A­##<pî톖7.d¨ivM/ Ÿ xdÛ 4ѱ€{~Þ¸OCÐ\„ôlÐÔpÃ…áŸ.†4²ASã7‡§ÞÂøÆ—‚£lÔ2ðv QËHÀ½áÓ?A½Ù¨µ€&ä¿‘‰ÏÑû/_2<€z‘hÔPJºP.«÷BK~ bX ·£/.„NoGÛQ>p/à2Î]ƹË8wó¾Œy_ιË9w9ç.ç{—ë{1{Ì §vm\ Ø-|ŽøcE8¨¡d4þC ñEãhÓ¼ð8Àá>€ Ã3o_xãK_ʹ·†C€÷„/|œsŸ`ø$ÃíB2!i0}ƒé;tKÑ@´sa#ü˜ý´A?ÅTÚ#ª]¾*O…Ûð×øÈ(ox©SUÀ=›º{]!FÙ{S­Áºõïà—)ð¯Ž$“hÜj?ßÐ0ãÙ÷m:>¦3—ét¢¤ÊÆœnÒqS'ŸjÒ¤éSO1éÄ3&L712"Ì´ eãÊqS‹œÖð¦×¢Ùµ¤¤Ù ¬›¤áA¯’FéoobLQ.DôÙà·ì„]Kl ¹éƒ±ôPŒPËh"FÐú;ØBý·u°Ò:<Ù¦5Ø>ŸÏ”F |ŸYgcuV—¢ë<ø*°^¢¤µï³ë¯³‹±‘/³‹S¬ïª‹Éb O=òMòiú{êzô›€ƒ¿½iâtP Å=½I¢ëÒu¢_A‡¥˜ ôà7õ3ö31{x³ƒ$ÌŠ0ʯ„±øYTI>Œ¢çêÿF™Ðm(÷I£{òyçKõaR ÆüÒH ?‡ù€”— ÝôÉH¯Àõ¥H?ùC>0BBz!®³‘žGR¼çXË÷ß§æ¢N)ÞEúPœ÷#½éÏ }8®‘^zyH/@ú»HwâºÒ5ŽØ·xañZ`N%P†pŸG°”ðà[Ò©*ò–áëqn£ÓqÎÂõ7ÆWð$!®Ò¥Ä ˜ƒ Ì XS;œ» öåaޏ¾sbÊ}‘ï#ïÛdõfMÏc&ô&ìé=ÚM_P#æ\i"Kä'úÝã å±bxêíxEó•帞“¡¨Âu1Î3p} ÊeáºWL–Æ\Å9×ãpß&\Àùi\ÿ é}’gp¾M_ì¿Cb2—)¸'ëÁ¸ÎŽÊXÊ ¸ƒó4\ƒŽ,õ¦7ȪO|æX¤¯#ôŒ|ÔŸo·Oëj Ê÷µéõCzI³öž‚üÓlúS[èT@GDúù¥S:â¾TÀþ:b™£……Èujš¿ïáûÑ£(ë±ÏGi¹áó‘¾:ÿ@sûiŽ–öêØ9þh­Ü·Ñż‹#ªóuýâ®_̪·ñc‹6Ý-næSÛéCœS[¹Nþ5'ìÆqnÿ qeÎuVÄâ§ÓÃczm¢ßxýÇóÉ[»?rðõXûØh‡ä‘“£Yxx\ZÃ!ÊÐv^ÚjþXç¼hÝ?×vèd 2>%rvÞ?±t=öy²sù·õßáyÖÁcÉ»m96­9v¼\Óˆ»o¤syø4Ð_ê\ãáCò?e´ŒN;û?íGqc嫚‹¯²óC‡ qyl,¥1ó»Í׸ݡïx_:ä¶çsþCŸ-°çY‹¬1ï ßRbû‰Œ‘—§ÿ³zü¼úGÃ[Ü\øˆÊ/þaÊüdlcil>β¼êGÖ~÷ÑÙì‘ØÊÑØÓOÆî±âý¡ž ÿÛ¶û(cÖOÍÿÃEÖqÄåOüaÊü[ͽüeþúö£‰ÙGÌ¿ ‹È 6ü®R'Êâ·ó³ù¿ç’I½(zSÊ''J“h FS©œ*ÈM•ä¥òS-]Ó\º„.¥_Ñe´ˆ–ð[úËi}DÓn!…!”pˆ$‘,Úˆ¶"[ì߈ƒüf¦!²P«Ijšš¡~©ÎV.þ?Í•­þfý•­ÿªù¯Éú%ëÿ”Üü¿"ÿS½¥6ªÍj‹Ú¦ÞQïªêµK}ìèy«—$á7 ø×ï¤a7 ‡Ž¤ ‹Nä€<²( 2éJÉK7”ÊÆÞòÑo.h‰ÉTÀrÈÃÁIb™$A*sQþÈ£-$²ˆR •%Ô’¹R!eÔZŽ:wÑnj9¨=$Ô–Ò ŸlJŒvS&äô uÅAÒo² Ê€Ì$u„Ü àé LýÆ«~óRSgÈqeA–Ó¨ ä9ƒºB¦¿¤nëÙÔ²uQ6ä[N= ã ê 9WRd}î‚tQ~‰ºð!õ{”‡tQò|^½ˆòkÕË(ÿOõOð[€ÕFÀÍj3àµp›ÚøŽzð]õ.àNµðõà.µ ðcõ1 h£µ…F: ) š¼úIƒNîµ5”Êošh}¬Åúp°>’ ¾(s2v Ô¢Œ–¾ƒ¥ŸDó°'Ó|ìmhö¶´{ -ÆÞŽnÀžJ7aoO7cO£[°w`m¥ÓRìt+öŽtöLÖ_'Ö_gÖ_݉½ Ý…=™î¦ûкt?ð°w¥éwÀWboC¿§‡Ñê?Ð#À¥ÇВDZ§Ðػӓسiöôöžô4öô öz{Z=…^ÀÞŽ×çÐZz ¾ú2v“ÖaïE¯`oÇ+ËÛÓvìyô½ ?~{{Ú‰½7½Oß…=>ú|~ |ö ÚKŸÀç÷ѧÀõºôLÚÝIß`/ tx#…aúõ§þò pmÁaÁI”?oK}EŠH¡.¢hGýDªHÞYt&Cd‰®ÔFˆØý1beˆ=bõ{Å^ >ŸP¡Ø'öÑ@ñ¹øœŠÄâ ,¾_Ò ñµøp¿Øôâ‹FÑHǰW ‘J*@íCÙŽe8NMUSi˜:CAÃÕ/Ô/¨„=a„š¥fÑÏØŽgÉþ0 þP»<ª†Nбx­ª~ž ¿H]jóÕ|P[¬^¯®¼S=ÊÃ[F¨§Õ_@YûÌHö™Q¶Ï¬Wë)Ùöœ jpË6©MÀ-/z[½ Üò¥­j+pË£¶«íÀ-¿Ú¡v·¼ë=õpËÇÞWï·<íCõ!pËß>Rg¯S»Õnà{Õ^JQûÔ>ÀÏÔgˆ_¨/àç_©¯÷«ý€ÔÀFÕHÙýºi; ¨ŠÚ;’I€mm(Ï‘âHLu¤¦9ÒÓé€==(Ó‘ãÈÔÞžäèïèOYìóIìóYìóIìóYð¼®$ÖÀuÐì´=ŸÛÂE©~Ñ–±ÑÖi:>è•e0¤´µïJ'ñg}Aâ%ýªWªÆÖLAzgÜ3%p~i ÊvÑTÖ¯VSô= 5F¿ÏÚV·¡TÙõèw\™~©Ý*œÓuÙRÂÝíôÝ¥éÈOÅÝú:›©Yyí¸t¼Zó°tÑš2›ËR²î­Kdðµ~ïQL/³ÎSÊúÊJqm"¸fnUÙý•¾ËÔ¹8wÒ9 ÖS×·FS¯£K-é–¦OÑõZ%õ\:ðÝš^gN+µ¤Vªk‘ˆGúͼˆ6GÆQ?Q<ð]Ÿ;[¿Û†«Ã¹áîá‘‘ùKx.Ïaüö³º¹±_˜Ã á™Ñç­wðØ¦Ø>S0ªdµœ-½²FΓ÷èw¹wÜ£JîK%÷¥B—$ekH¡ì<À{p‡~Kº¢Ô^i$Gi—öIÊýJþʾÇ!¯‘ó)Iþ¼‘’åÝònj#”!}¥\‰2ˇ©­|R>I)r•\Eíä+òà¯Ëׯ—ë)U¾%7P{¹Qn¢4¹Y¾ |·ÜMäçòs”<(Q2,ÃPš¯5dL1VÁFzþ;ü*^ gìGQÞßCßçXóý¸ÜÓZŸ¯i ˆXš¶µ&yç¶œí…×EÞ¯h–·2<ñ;òY}äOËcž>ÿP–Gí9[?Ë×vs*Ï ,Ÿ/¶ŽŽá›ŽÁ(Ýž äøÆLK–ásQR¿g±4|9ûIôW :Ý>_Üj+î°Ïßé]¸ê‰C«oÊg?/4¯M3:ñŠÏîFkõ"ëÒ**£Úðç³ otUÙ¯Åðô Ž ‚ã‚àÑ„eE¨'‘B Éä@-i”„š:Q2jË¢6¨± µE­Ý)5÷AùÆ`ÀJ£eªŒZäþÚø5µ3£=¢-²bŠ^MM’#‹Á‘ÅàZa\wךl×_8BJµQ |^i\‰X5]m\M©Æ5Æ5ÔÞ˜o̧4c±€: …”n\k\KÆoŒßPGnS¦qquÒk^o1n\b,¡ÎÆRc)e··‚Ârã)ÐÚx”ÿblåÍÆfêb¼m¼M]-ÆÐßjl¥nÆ6ãênì0v }§±ð}ãÊ6>4>¢Ænc7Rö{€ï5¾¢N*Måc.ø+Î ¶Ý£{[h8›NA9)ãBëûÌ4Ö˜DÖžÉp² XëPòøJã˜ÏãmÜ ñÆ6®Pæ6w ö56žD…ÆzO¦Ç”²ñ6dªU6ŽqÚ`ã)Ž©jŸ·#gJ™§’/å\oŸÔ7%B3FeD¿s"®Ë]M“Ññ5—”Üq»Ô§ã6®(#³½;(53ÇÆ1ÒÎìoãÉ43³ÔÆÛPzæǸ"ó~O‘÷e>nãí(3ëO¥aYAootÊZaãi”ÛíY-q…þ‘R»mf\¯ñHïöãIœþ5ãÉ:½»ƒñ6Œwf¼­ÖQ÷|‡ŽzžbãÐQχŽz^hãÐQÏ?Û8tÔó]‡Žz´qè(§ŸCG9[l:Ê Û8t”ÛÅÆ¡£>‡Žú,²qè¨O„&t4ÀjgŠæk@9ãí4/üŒ§rú%Œ§1~ ãéš—72ž ¼ã€»ïÄeg¼3Ó±øÊâô×ïÆ÷ZíÏæ23Þ“ËXmËÕxa[Æûèò…–lû3Þ›ñŒk¼ ·¿ðƹ®B–yª•þ_Œ3/…åt?±h y¨Šª)„‘a1•ÐpÀ66„ £©%ü}³ì±TnÒxrƒ†~:ä¥Y€ÐÓФ2À:*§ÙTC. «FIrõ ºÑ4ŽŠøìÅnƵ$ÈWnœ59€\r:rÝ8WpIJºøÞ¤išåà©‚K›\c¬>‹ž 9.´ÑË)~´-ÎŽ4ý3Õ¢…G¢‹ûP4ÎhÿÖe<|×NÕí®ÇyN3 ĤÐJíf7¦Ü¼ Ú7êYZ&&Sóq ‰I¢‚ùÖ–êãTŸm'ÇÒ``Õ,Q“%^Κµb›Ï>WÆñSϾàž§†ý%Ä9ÍiﮋƯP‹(§½b¬iBÜò`œLšFææ2*d ¸UnŽˆ†bÜT°•Õ3¯>´§†éø¹e&Û_…­Mת«œïpKCv½º~[jå(UÇ\ZÖ¦ûŒó¹¤[8Çî'\écÒó2OZguvÄ,lÒ*]»•V­=±"vä(YkG´Xs’Ý{íÞ#vÇ,¶Ìj[O–úÙãKiŠZkñyã¸nø[GäZ¶ OTN‘^)Þv,_Ôz›Åýv¿Z͵•7éÉÎ?.ns|?ÉÕ=lÈÖ‚Åi ×TÏù>ÛR‚h™ö†ÛÚüv½ Ëšk¹—¶âHc¼ÕÖB»mAÖJ|ïìbù¹·WÛ½€eû^;êEF V‹­6ލÝñ­4£}²Ïîý=ÜOFF3‘xÓÔË"-³|ÒÒZÄ^êì~ÕÓÌ‚+¢k¥™\.dó_©Vœ‰èÝ}¶m½Ö¨ÄÃ#[‰·‰—Ûã#/JTq$¨fúµ4cA”Þ‹¸¥>Ž]EܪÖKմ豋l²å¡k pd¨Æõ &qÐòîAȹÀŽVkjâ¤Z“T²¹mjl½zlïr1ïö‘˜×·6¢ˆ`õQŠõZºÆ*ä[Ï×d<óŠøñ¡¾»Ê¶”{ÓsÌ’[¶­y;šZSŒï¶QÓ¶zËÏM¶î9¶uº˜Fë?È‘¤":>Œ ­i½»¢œYÑÁõŒ`Ô&­ñ›Gyû°‰+ÁÍ8éy™j}š5v ²43‹}b6GO+&Ô6‹7‡Òvµ§>F·Ú_Ll¢à·”ô6+“ì,{T¯cP¹O-^*ÙvjŽj4mEk·›[óšæ´šRŠyPÌŽ*8 ¸X&Á¨.ëÙÓCvD÷§1ÿ”ÃŒùË02;ü¸¿°ÅÈ¿G.D1ý ”¡éôc:Ã@e ®‡ã09½$NǧÚq«ÒŽ] ê¼Íì.â­ÛŸÛ¶€ˆ¬j¢”Zµ8«'ŠxTDî–­˜Š5ޱ"·5«ðr\Fû9먜k=rM˜Üª˜_iît¿ì‰ú—¦^ÇceùÏ@[ëš÷ºV[_Îsˆ9qse«eXýº¥µÑódG*¢²´ðÝ?ßË¿Nò×6ð6‹K†R¨Ñ’Ââ’FK†›ãÝž ·w–;På˜eºòÙ5®`yµÇçö™£Ç™£½^Óú÷ÂfÀtæ¸+ŠÌéÕn³ÂSå ¹¼ÞÓí+÷W¸+Ì߇r® ×,¯Ûô×…¼:¡Âr™•þ€YðWÔ•{|Uf¦7Ôº+]åî éõ”»}ApÜœ…‚µî@¨ÁôW¦…¦ËW1¤=h þ0§Âã xÜÁB4£V·ØÝY æDÏB@f\s\ͬñ…fY]­ß2§…®`ÐmšÇ9öóDW…9Þ_3«.PeŽsj\¾†"sŠ?ÀÿؼO ï¸,ÁS=åÐ_2Oòjý—.b nª%¸©QÁMqy‘íóG[3Õ]UçuZ¤›v†9º6àñ²ªZ”9â*³¸¨øØHf$oàT?šI½×ôM$Rå †ÜìV¸õÇ“ŽLÂ-Ä[4q¤ÉÓgL3pü˜‰Qj<ËÈgžéª­lÉ ª×j­pWz|žgŽÛô¹ëÍ96Ü„Øío£r*4ë«=åÕfÐã+ws#*ÜAO•Ïô€í’c›Õ® 9Ë]ÁÒ@I×Sïx+ ‚f?2ë5s f¶¯PÄäŠÌ±0šP5¦[bs¤E…攀¿Ò ¢ŒnWSpÕûL_];௃8+*?»Öì\¾*nž×Så Õ´2)—X¥¾ KË:XW 3 ±ÇœöÂ=8c–?T ž S¿ÏNªõ{¬«q·{v‘9­Ö]îÑmÒ®dIZ ¹fk臯V»´(µ”Ϋsy=–éK¯;PiMRGñ O°Öëj€Ø #]b®­C3XŽÊ %0W°ÜÙ2[U{5\Ò÷ÂôtHaP ´¤m‘4µ'ûàþ_H‡m7¶Ê41h¬i¹@›º XÇž03ô%‡a3šw¿6Ä‹PâñWxÊ!kZ9â‘×_,ª…jG T___T‰(,ªpÇ%ÕD»ŒB;üUWmuà Ë¡îAÕÀ:@¦†›ªi˜•°Yî‚AÖ{ .—Yëq—³êcBƒz­ v­ Yå‡áù¬8Ū°â¡éª‚PjÜ>ËXÈQj¶˜¸îWƒ ÑCçf¬Îgºê] …(ê­ÐñC!yý.]ÌÁ¯•Ô’D|3¹ð¬ºÙà¯ãPŒðJÖÀ‚ÀÌ,WùìºZXB­m7ñlµOiŸ2:æ-6‚MmÞ‚ÜX4´¶.ÿÑÎYð×´¦aÖnXsL5‘Rv!V˨Âry f õOÈ­›~ÈÈ?¥Yä/Ø"öF‚¡9Öu¾ÙwhI¿ãЇ3pèð¡æÐ’æøTØV%¬K3Ø>e†-;­‡8ù¹!ݪ]¸!&88‘V”n;¤0ýˆ10nt^7¤IûB­3az*YW÷yu­/³¼.ò×x.@¥qÑ5Z·W·P ¿|³¹±ÑF—©û)èg Xw»êbäËÝ:ˆ¡W1ýW¯­¿ÚS«/\æÄ‘ Ýê@D»\ÏaôE“ìG.Öd“Pу™s1´ù€‡7‘¼i<ìôñOª0n1~oŒcEø}Ç+4yùÉ¿!gÒ=Tœt2 VoÐ}vüœú«!TªvRèå8^ Îmˆº8Π\I8ú$¾ôãÛÑTUþÐX@S ûéÆÚ¨ö1NÝK)r: [Âkp¼09œHOUgQ™z…ú© i²ÎÀ¨ “åR*R¯Sºº’r’ žªõÁ}é¨#a‰í§â/£p\Œ#G>ŽT&ޱ8ÎÂQŠchBRÿ/ºùI|aT]%)¼OŸ¨ü jÀq2Ž{qœŽ£ÇLYBõ¹qDÿÿ¯XAFeö–HmEŽÿw¼]Ëu¦Yõˆçãx©» ‰¶ kNl‰-±%¶Ä–Ø[bKl‰í?csÌ£‘$kŵä 6‡â/ Yg9˜Î—…’Ê!‡a¨­düº”(3r·~¡›JÉ pl<¸J®hS)Ý&‰Ûužq«CwÇ$ãæZæ endstream endobj 409 0 obj <> endobj 410 0 obj 130344 endobj 411 0 obj <>/Type/Font>> endobj 412 0 obj <> endobj 413 0 obj <> endobj 414 0 obj 106000 endobj 415 0 obj 19279 endobj 416 0 obj 531 endobj 417 0 obj <> endobj 418 0 obj <>stream xÚ]“ÁŠÛ0E÷þ uQ˜.R[N$Y CJim‡ñôlIN mg‘¿¯£¦Pƒ ‡'ùê<ô>~xi6Ï~êÂfû¹¯á2]£ ›Ã÷vÎòÃñËq‘¿ÄÉ5aý0úøX#ºpÆL–ÂnyPúºócss»,á|û)ÛïEþº/K¼‰§”ø)ËFâ0žÄÓ¯C³rsç?áÆEY] úõGëY~´ç ògÿmr›ué¿ÂÛm¢L,9ƒ›|¸Ì­ ±O!ÛëS‹ý×õ©³0úÿê;˶®w¿Û˜–o×åE±“u¢TB ÚBÚARPiÈBj¡ ê y¨ƒä ò‰dHB=T&R„ƒÂAâ p8($ ‰ƒÂAâ pœZqê #MÏ*jš¼ÊAäUøiò*ü4y~š<‹Ÿ&Ïâ§é™ÅO“nñÓôÌâ§é™ÅOÓ3‹Ÿ¦g?MÏ,~†žYŒ F#ƒ‘ÅÈ`d12YŒ F#ƒQ‹‘Á¨ÅÈ`Ôbd’‘ìÉ++ˆ¼2ÕÊÇ-P}ºÎ{{¿Ø÷±{wq£4›iRî32Œá}|çi¾ïJï_faü‘ endstream endobj 419 0 obj <>stream xÚ̼ xŵ6\§«gzzö}Õìš]ÒŒ4£Ö.µË’7Ùx#Ûà¯26¶ƒ Ä2»YÌn³„}1 ‰MB!!.!NHä‚/Ëu ¹a XúNõŒdrïÿ<ÿ÷<ÿg¦«ª««««»Þ:ç=§ª‡!ÄExŒÖOìšÐý·©÷ÿš¸:4iæ¬îy\㣄¨Ê±Ô—Ó;§ÌZXù·» Q—á¾4qæìŽ?n­x÷gbœ·ü¬s×7 ±?„ÇÍËWo]v¤¦zî?GȆ_-[¿|Mk¬\&dpžsK×ÌÞ‰ïîüè6B®Áúí¬ß°týðÝ?#än=!⇫×->‹‹¼z6!}‰Ç_X±ô¬%¯í›ô$!Ï?Ç®¿ø¼¡}÷}†ûÿÀözׯ;wã¡¿ÕcÝ?3R½|ʬ™={(ø2!ŸoÁ{(¬À ,­Ú÷ ùšµ¯|ñš³ÖÏ?Òù î¿FHäñUK7¬-[ý1Àe„pë;ÚgN¸`ÎuoaýdÎÄé}3õZòÂS°þýkÎÚ²^7C×Dà´ÿÄ㡵g­YºgóuËÌÄö×¾·bÍÆ-¯¯=D`×§ØþÃ}3³5Ûžz¤@àv|¦daÏ^K®‚Ž8€7 $IHb:µ˜–à&Lïƒg0}ëqÍÜ2B¹åÜ?1ý5÷5á¸o( ¥„ÒïñUø,ßI(ßÅ÷`º—ŸŠéiüo0ý:ÿ:áøã‹é7ù71ÿwª,¶äï$@dÒM¦ÓÈ<²€,!«Ér>¹„ì"×ëÈ>r¹‡kâÇ-€ç xÄ‚#À‡W‹`Ï WŒßï]dˆ<@ž%¯¿à“œÀwóñYNâ'óSð‰NÁvï#ûÉýäQr&/‘×ð‰¼C> ŸzðBrPÝ0 ΄%°6Â…p\ûá~xÂax ^ƒ#𶥬`;8À .pƒÏ÷Aø!AAk‹B9Ä  DF2P•PY¼J5Ô@ P‹½ „ǾÍcnI1Ví/Æt_)ÿ迎ág¥øo¥øGøÕˆR–úo§ì+•y~<÷%Ìý¦”ûÇñÜ?ž”ûÒ)e}'÷G§ÔPŒOœûíøÔºþuÍÿcÌý¡ß]Š ¥ã×—öc8FÙ8¥‹·nXMË7,]EÊWŸµq-J:B¬„}ôJ¨ÆÇë»ÝJÎtrê§ë¤ô¤okO8kÎxêDª±ªÁ{ÔS)TZ¨´Oƒ[JñßÊÓž‹c \õwJÃèçß) Ø~CŠ2E A³ˆâÓÊ™Tßã6M? ï}åÚu¡Þ!ö-}¦·OéÍåÙIJÏK‹þké©ýAyjÿPžšµ³kÂìYtZßÔ¹gÖi“Cä’9½³B¤•ÑQbTjÀ‹bÛT¥»Öâýðˆùÿª;núJèNÔrâ¾ ÏnëÑ|§ÔIJlÃY‹Éг–mXL6¬[»i 9= ·Ÿ»iý¹dç¹›Î>—\uîʵËÈug­Þx.Ù·bå¹Éì9“{Î]³x=VÂGW¯\~yz Fä¹,ü‰’óÒ’õk—£B´*צJ籫³=µ ¥Þ&Š,<‘Ö*¡N õJhPÂâS0)¡Y -J­&û@lØ£iD|#JéI¨;Î g#Z‹šã ”£· V´ÆO”'(1•öÀ™EäÁÎbËàªâq*æsg—âõ¥ø®Rü«bL¯)Þ%?½«jJqsñ¸jA1¶ëo,ÆÚÓJñkÅXW^Š'aù'±-VËÈסdWãý;qDÇQCIp3jÝ8̃[”øt¸M‰Ï€;”x>Ü¥ÄgÂ=J¼@‘GF¸µTúÎb)l¥Ÿ¤n/½¿tö½¥³pLÂRÙb w—ê:©Ä}ãi5ÌÅ6Ž5͇~¬}ݨ˒xWö4Žj˜ •” 'ö9VŠK–ò)ÆV<6½4ŽÙ™\ƒ¸{3^Uûÿø”(=¥áÒ}?TºÏ‡K÷ùxénž<å)=X*ýÈ·žÒ÷Kg?Z:û©“žÁc§<¥'Jõ>}R‰gþ›§Ää'…à!¬Ç ÞÙmØÞƒÎU¨«×ÀZXëa6À¹ðü… |b'j9úa,„?ûx¦%Þ"8 ΆŨë—Â2X+`%Yÿê,¼¿[ø[ùÛøÛù;ø;ùýx·wñwó÷ð÷òCü}üýüü0ÿ ÿÿ}þaþ|ñóOðOòOŸ ÿþ‡üsüøó‡øÃüóüOøŸò/ð?ã_äοÄÿ‚™ÿ%ÿ+þþ×ü«üküoø Жú-ZRoàÓÙùÿ ›÷{9÷¡}ñó ZWßG>‚öÄc¨1Ÿ$O§ÈÓäDð³¨?Hž#?BÛëÚÏ£6}ü”ü -±Ÿ£åñ ò2ù%Úd¿&¯¢þÿ "í D›ˆ¶#ä÷ää-òGÄÅÛh¼‹Û¿“÷Èûh·ýÚ*¢õö1ùOÄÌ_É'äSò7ìqDù {ú ò%ùŠü“|M¾!ÇÉE¨p@ѾQЀZСµc3Ú%Çà3øb'ƒßAÈuÿ¿ dÎÿŒ þ/ÁÈ+ÿKPØnêx/Þû]x_L_ÛÍlã(‹»QÂÍB)¼%*óHl2ä×’ëÀ¯Ä7@P‰o‡°_ Q%Þ1%¾–¯‰]"èì‚ Ó ;By{(”Ǫ©NˆQ½ZïÔÇõSfÑØ£?8zø‰H¹¤ÄþË“>‰èCúõúíz^¯¯“ ]m6;Öºp¤¦z/‰€9"G¶Gh$¢Ë꩎Z†ìÃNß{ØiMUg)’¹¬•´}~Ìüù±RØf±6dûŽ7››-VWƒù¯æ¿‚’…™… ú-®¼+?h¬rOͨ¶™_`©Œ° Ÿ}ô`˜Á†KCC†Õnó{Å/«ÊÒ5O>mÞSÕ‘hy,/››UÍ;Òî ñðaÕáç³O„kò!TRƒ,Ÿ Tç6l€!ÑÆµÒº:ÈÛœË%ñh„ Iª-$hX0r»³”aj£ ˆ«½»ÁÉ=¹à~£³âLµF¼ji׃xà¨11b¸Ú>׸X-ˆ—Í‚_ÀÁ)ÓFžÓh*‘׺WÌñ¿îYšÖj4†*{Xs$? ßÖZ,*M…FÃmã&ýê×8f{G¿âÏW}T’&2æÈŽËk`W4zø@€õS¡¶|B9b½ù¸ÑÒãpƒÃU¹údSUUuOÏ„ÞI“››-tˆºªÆ\}Osw«N0Óä.ìÓAcsc]󆡿AWÕÓØlD„F]³P»]6{ÀÓ±-k#`Š€¸ŽEÙ§G(S]íA / G* )æ­"S„B Ð}ò¥r{º»ë[÷$‡+R*¬õ{œÃómØAÐ|¦€æǰCaÇ6Œo ž,¢Å]È0‘K¾˜Dll˜úî¼Ç,yüZ85UEõdN®¥†f ~Û^`ÇaÆêÉÖŒHsa·R›­{=Oàž3_WãtØœ@i4’`pækZ9,ƒ á(îHÊ Ñˆ‰SÏШ4õV‡·¶¥<ìh&¨´óÿæ7OÔ lœ5xÁôŽ-­_ÖuéÜt´v%ÏÞ±¾ãÚ º¦6ß°ð’M7Α¯ØÛÕU–² BF£Õ–-?Ìyëí ×&P1­ÑðWnŸxѺ֠½fÛœ©û6åæ)7Ê'μjú†Õ†‘¿™ä™ùøò™›…{þy.ê€-£oª&«nE½ö9qyReÒA0õ•ê[ÕªyˆX"ªÕÀJËüMøà蟟0Y¤ÈÁÑ—e¿É*q,nç=²Ílˆe·å5˧^gaH3˜¬=& ¸©%´M£a9e!‰hÀK51Íj°˜½n£ÝL`7SN&;bÃîFñÆèû¼ìÅ‹ÉZÜñ¾oämFž´µ™eˆ×mžŠ‘Ûüv²ù… ØKläóÔwÝo°ëÿ7½ÇjÌ/ÖÔ >X'cvu®(9úc.AŽ”c/Y[¹|Ë¥„h¢ÀºÏHf’¯á­ ¼:òÉK#oö­¿{k÷_~Èìš´†nûxÁc—¯êÝ¿ÿù5ïõ7í¹ÛÁøÒ-§MÓÍý‰Fs™{uÕÊ'?Ù;ò雿éýBõŽÌi—,«=Nw^ ¨ÝN÷ynÊWÚ+9Þo÷sê 3ÈmuÃÎ<#Â/ø½¿×¨çTn‡›Syž˜‡êŽ~-o+¨à̦š` g)Z¡A'ñ8^5:° ¥ ’´C'ØuRA'Hº!»Í×ä[Ç7âx<"| p%ׇz\¨CQ¡‡e£P(Õ”Þ޳‘·Š#ѪŒÄÏN‰(lÇGÞ@¿’œú.ml”Ù(Ã#Ø'¤2Û­ïƒ~RŠÿÕÀŠÕ°!Å©:eYk UŽ*JÿÅ@Ztl{úÍ¡þ¾[_¾ûðöykûçÍüÓÓÜtäÞ3¥kþ|Åê5½³ËÿõÐÔ5çÙ³kdô/z£*~}hãï úšÅOìÎêF6Œ˜_GùÚ3º—¿ 5z›‰ƒmòiká¦IÁ$!™Jeòù\¡VJH½½…I“ª ¶8 & )š‰‰RžV×'÷ !%bÒÑ`¥zÑ0Hb6[Eªä*N¤Ul€ì6»¤ª*oè¿lòƒ‘úe³SòË¢AZç¿BÛ=²©£¯ƒ³ÑŽq²h¨MˆuâD‘"bÔ¢SäDQôˆ)‘º(]E&‹…Þ¬kRa¢|rK²Ñ,br;´×g‡«+‡3{««]õ{º‡'²Ÿhíñ »¬CŽaWQôU:üýc¨N55¿€/CX¯²HTÜcH8E {§{1ÏÔ9C‚2tqWÙaJP™Z’È™±‹XÓÞL&+"¹¹:§b†©øµÙ¬'ªs©M\4Q…ÔLîÖ¹EMÕ‚"‘ñŒº¼K#=Ú'Pí½ 2ôòôŒµ»W­ÏZLJ5ÔdÓD5ZÁßÜÍ““mK¦íú™ÿðÂÜ->áŠK.~,î²ubZ0©áxÏÃ\j¡¢¥Õ¼`¯ÍB?üø*›UC‹ªÛµôaf_Øn¿?2H Ú…:ndïíz£%5U £Æ7'jT?ûŠ- ÎÑ/ùe(-$ˆÊ¶­™Ë3Üæ …#‘h&“ªVý§|[õ 㨂"REýªŠ MÑä ‚Á²Š*Ñ®R‰A±B•H\‡\|zœ‹ÇUï=2q¡˜u¹êëTbmBU§š¨¢Ï 9©rªƒ*³ÓÓƒ™«Hªpjå?6M G÷¦R¶ÚÜP~¸–¦Öêßc¶†Ìö¢„x¿DðXcˆyñ\œd~&ÄI¾ˆ cÕ¿†„ù½z¡…"$H>މ †ã±’ ‡u1 ”3=ìP4?vü–pm{“¯|› ½¹Ÿrgi=M\S9òÞ¤^W é/Kž×¦GþÞ4wN¯:F%þzþbÖÅ\#`1œqGµ%À±}ätWî×h®ïQŸùÄÈjÓ-Ó©Fæ7f\zMJ£Q´ìïT7 –í€ÂÓ8'žƒ£ÇåÇvà¼ÈÎÈŽžˆîˆò ÔëÁ©‹pþ€UìÒµ¾‹ËfÓuu-‰öt ßK¦‰í-ööö–DKšn­ývšÅ‘ÜnuÝ#²ƒÝÞfb Y§[×[·[µ¾fDj mÓvjWƒÕRfJÁÊÔ±†!©j¨Z–†«‡M…l¡¯pgÑ 19@O¨ò޲ÓÆ±£j¹lL—½oRÛLßÒÆ¥n\Ðý½ êÑ£^ó1ó1‹K¡VEµÀÔuM¶ŸÑ1ìhdõUìâ¢n( Ìfå«s%ÝPZšYœêhQO——Ÿ¬§±#yTTÞuŠÞÈ¢íé*zäãžç°óŸˆ‘3.¿á¬×GÞßy ð~øør'jq¡öå•üíöÆ~¼þÞ 1S¨m—F­>Z»þb×´† :½Æ9×DƒUáë@ÿà!8ýÓsût«ÕhzÏ®”î¹þ·[~ssCû ³ý^¯C6jªIˆ:£³¦!qc˜Í"ÛF¿T/DZ<‡SÉ_ ºá5ÜÒ =Yا‚/Upóøjv—û;Î(ŠŠu‹Šj[$ý6ÓaÃ1ŸE¥;¤Vófÿ‚‘_ޤGþ·X4Tu U£_ª6  ë‚/åªõÝð Ý~¸!û*@:½Þɤ+´úŒ®Âü‹Ìï3œ)&=ˆLÓs‰PFo0šü‚7ÖTѦå;’N?‹¨Úä4ÅMԤК UÀ¨ Lð.ªÚ¯í:ÐV½¿¢î@“Ål5*"ié„  €–ú޾!?NKAvÀïoñs-þàŽT%]fWìkƒ ­vG[“½­­)•Z}$Ê‘(D£n¬Òo2™­`µšÜAwŸûN7/R·»iBS[m¢©®ibU79›O7yšRMȧñÐ*2¡©°8°7pw€’€àLú>=Þp_†ûÎmF†béᄕ‘¤jÚá‚Õ;äfÞ aˆæ:‡`˜+’¥Ï]EØgJjL–ôåÓ©'K¨'qLÎbojI6ð±S †~2P4~QS—ÀˆÙõ ‡Õ¹ôªÞ’'ŠpdEK ê¬ÚÆ…•@%Æ·×@Î1Z%ppªÈ:ÁÌŽ£pQ€¹,Z–lØ÷‹OcFTBrvŠ•–† Çÿ?žÒ2SÍ‹½Íñ…ÇFž“Q ÌOPµmEA¢ÖŸþÖÈÏ^ù,Q^ГCeíÇ¿9þÇ~”4XfÃÒãÇNH§76ë=úŸ@\×’¿Ê®—õðó0ü<¿ÿ>ÌÝûCCœÈÄÆEVG©3×qz„yÄ} X2·#º 3·çé ‰ì(zWk*î‘×edCYÎ@³YABcûN6µ'*¦¶„¦¶„¦v±STUÅö P›.ådÏWGawÛä÷v!ƒ~…Ñæ¬yLøµJ¤ÿÞÔë^õ˜¥DÛ¸<#Z±X¤þ;föù^63Ï÷˜T¦Š-nº~ÑÅ7Îs˜-11£‰‹âÈ#ù ÿ‹ »BÔjLæÔߎ·í›¢Ì&oÃøñž¢õ3úÎè„­Ø+3àòèÝžóp“»`kô•­+ãb(ѹZL3ažg…‡›Ý±¶Ùm\Ì;ÛËM6À„vx zÝÐÓ NÈL××@MME}}Ëä)S&4µBµDK«½¥¥õ‚V;àʸ¬ 6–A™ÇsIG«½Ããîh­sOts+;AìR§®NdDWN€\—ÜÅå ²»ÌQ¼dB—}„®†.èrwvÐ.§EL¶¶V¤[àüèji- kO Ä[ÀÜj‘[¨ÜŸ¶Àúȵiy­…kéÒOxM„.â¢$rxľV¹i]+'Nð´T´& ]¢…&;:m(N‡ê†Ñð²"V& M&ÃÓ­Ñ¡ÐpÙp€¹ÜÝÃöa'å¯&mGš‹‚7óXج@ƒôCVC^!'}òù ³Œ y²HÞ³ýƒ%ÖÃXL)MP¶ ÑîVòŒ!ST•ö+€dÕ²šq+‘ùæòNðuã:Á@*ÂÑÄéIÔhÜÛ^gSäÿ@}ˆG˜u#ç™cÑ ¶€Ü¶­ªwî.›Ñ×5ð»yk¶Ô4¬B$çËŒŸà75nUâ¢ÛwíDDîªÑuäGj6Mªymä Oí|Ì+ìncCÄbž3ú<8™¦Šöüz ­ºù·Š@Ѩ,Áå#[<²ößš›‚j·VËQá&zפo>øÓ.~÷7«—x=^Q±lÝßèûꥈíNøgÑÌ?"{")i»nuÀ¢  ¶ƒøUÔYÐÑ,³µÄpJÒT ªs²½'ËÂR¾PˆÃÒüÌrÂ#qˆÈ÷»ô4û[¡u¿Ôuº24§– ÔJ“9«St>à䱂ݺÄÊÙ K \®PØauÚ­…Z«ó2\™…î,pà\ ’Œ9×ÙÅi³™Ì%.§Ýårê$à5¦©—.Qkìjµk.d\MÖ)©»œ®Ú.µ¦VåýNÈ98e'gb ?,÷!írNpî]«Y§AíRs:ªîR£*uºÔÖ\kN£SKšo¥¹–!q-#ª;¬É¡X`(G©nÈh6›é®K¬L‰² ÓÖ“x>#îð(ñõo±ü"YÓŒ±5EiªJ“JL œ„oüXKK8$›`‚õh? Ìï¡z`öo ¿â^Xª„ôgQËÙl'Ä,BlãÆê -JQîF±PA|M ô„ò¼ªìôEég«©Ø{NO·Vêår·šùؤjÄÖ„=7¶Ts§º§Ãç\¦Í´ÿùâ„?7ÇèDЯZ7‡)DÞw+<ÇIå Å‚à8ûÒo&Ñ[·4e5ƒ'Uò3Ÿì¹ô¶g}ëé‹Çÿ}ôÇ©tpBFÔ°õ×[F÷ª¾AÎn!åýƒßËÛÿ€¸nöÀ-<4ÒI”“t;uÜN”Û/³s»Êà ?ˆ´DZ®Nlj^xMiÓù&ê5§ÍœÖ:•à8ý—ÚÁ @ô§üœ‹–—[£Q«w›×ñÖm$FVCyÁͪd'óH8÷äà˜G"¸Ge°©¾å‘sJ*¾‡’cZq'… #/b:Qéí' '°¬Öò| ït˜9>©âêPÔäkÊK®gžºeÆ›ÐñúãÀÝðåÈ%¿ßôÆþ)OôÿÛÏSáü'V=:òÍíÜ9sk@ÿÍÿ|~䛑æW'Üþ—kî|÷üCp׫ç>re×##k¹§‹>¿ðè—üQ2tÃF9êS¼${E–kÈôf8UàÞ7Ë¿ÄÏü ùßôsO…!ѤŸ›¨MTô(±Õ¥Äò\­¡§+2+ÂÙ˜Ú4®єçm4¹¹Ž4ÂÖÐ}©ãØÉqlëœØ×“«ÈD]A¹®›Ær‚œ@ù•H¤öèîèþ(FsòPçðF{&Xs{ʆݶ!ç°»H{þ1æDdv|MVéÓWN!@c“ʨÃ~ds?̉”gBÌì>… ±™e6 Äz{ÉY½aƒ±Ñ)åÙìs@%jëÆæñ˜sY`¦wÑÅ4¦ ’ÿÊ"›v`á¢í©×nøËÕ‹fë:&~ó¼[¯l?ƒ/³ú2&WDGk/Ôâª;¶ý·æ™†òm;÷¿îÎe5áeÏ­¾á«ïÊ3÷Ô{íë]1mÒÇØ¯¦ˆ!•W±ÓfÊoí¸¼ƒ›«u9¨£R”S'œ )ÑÎâÑ- æöŠæ$m­µS7ÁÆ$“ÉDÅŽÚf{mm3*+µÄ]î/ÝŽÍ/ílÅ{ÝawÛívw;ŽF0Å@‹eIHó¢f.ij¾³™Ó5WÔÖ^œ…¬÷˜²Á,§GlŸ`w×*N.Å4 ~{á”k7„)r,ˆ:¬µSS5T=\;œ·j†tÃë ƒÎ=‘ápÙPp8|ò<ðç%S©!»áØ)žeE—Xq­£|-&† Œ7L}÷„kYÓãÓwͤ¿8ÛÀDB?PFE\§r‘ng6YÅp"8]NâÌ— á¡x‚&ê\5X.ặô'ÒµÅþ>ÿTô´0å…Çþðks¼ʦæÕT3+¡º”Nk Ôÿ¼Q;óû¿ù°K?¾qdοdõ¿¶k0S¸iëÞ÷*]­«Fú³ž^zN~Tô¹ùß\ö>“6«FËÛT· åéá²èª)Uæ*§W.ªä+¬ÍÖ3­«­¼T>ïΨ½ Uœ õÂÎ*˜g^aÞe¦+ì²~iåÔ&Pgvf¸.ðýFž¯VÝÙˆÛÉnö®‹=tÿm<â;ä{ÕGM¾·}œÁçÓ_DrÐhΜ[”ãL¹Gr‡r4—K\$·Ù_µs‹ì`¶Ã"ûvû~;%öœ]¶£ádgBä4‡§Ç^‰D¤ dXfAЍ&ÃÁ(‘hÁçê˜Un¶X55Õ¹lUeE&ÒºM¬”n‘©ñhAŽŽ©’èQwÁæþîT³2ÙŒàp±©æ’‹­(Èœp l`FãÓ(‰Ž1¸õoxó˜ùÅ,âìÍc5¤ñ4@Š"G‘K– Yáb*mö™ÀdÒ¢AR42oíÕîõÛ”¹Ì£G‘FfŸ4++?².2Å ØÇùì`iòºÈ J*d|‰ÈqìÔãoöC%¢RŒi«µ.¤t”Ä& \ªÒºÒ~<fFõÉ«ƒì¯Ù’1YgÍsŽ<=;-&5ANÛk.À]ð…Ø$z½Ú¤8ܪ wè§&÷"¼ùÊÊ ‹½ îá\/‡^ÒhFd­ @#ªµg¿%Š–•™ÌG®îqVû¼*‘iJ~2ºW½Y{cs*\,‡]!¸1;Ák­Ák¸Âp‹×æ@ëð:8o5$¢a’7˜{&¤`v R¸Ü \R †J%jvAÓ]Y•íòê$9ÐÝt ³°?ë±%ØÊ—G2±‘t&ÔŠ-ãêFb:»»wY» dÝ6PÁÊ'@e?Mƒ;l&»-è·™4•UTèÌv A[Â4MÈÖN3Ùj±‹w¬ÕL ¦i¦Udš©`3ÇhÚ-tk*³êõä!nX=Ì[ÓG_{¢,Ü“>[e§ÎÖ2Ô8\Ÿ’†ëipØïò ûK³Ù%ýq,s²·­8KÁ˜µ€ù̘:¾˜­*:u.@a (!¦ž˜ ÊÄSHس ccÊC¼2Ç1^g=Ù Ãü/ÊB2d›§ÚÅßñUÝ/ˆó¦v5g޼ûàÚGOóGΈÖw#XÖ7N_YiœVþ¡ k@µu \uæoÞ·†M,1k-Zo¡/k›Ù{ü•S)¦I¾Xóð¬ëæ4~>>-ì@‹"lä­ÅŒüùüK$×¹v]Ç=õrEȪf3g;*ðöDÿÈŸG2#G.‹–SíUüÅëF?Uý–­CçÓIvñàb¾]gì@Ê1°ßCŒ` ÆývÍÞÅÆµX“—\«Sr1Ÿ®Ãl‘\¼Ã“R%H’z€¦°´‡¡j©5 ”§`‰g£ç2]UyAå••´2Õ—ºÄã²{<®›àr¸ÜŽ<±ó<ñ¤°2Z™SÞŽ&ÙªbÕ¤ÒFl‰¡òáˆ(4¡æ!ðN=$ëè·×'²ÉI6‘”w2/]´'Ÿ6o›ïüÓ™ƒD™LR’·CL°UJï±MQýª8¥'ùÝL“ìV!µ…D4qŠkU ðkMlƒÏ5ˆ"cé›®Ç~é,$#«a¤§/žœ¼÷Šnº+׌ÜR7òžy:h¨ù™FPì<öØ´‘ï_ÄUr†²º˜´ ùèñ>b|`åè§š j7i‡}r«©³­³¯“.ç A†dìÂ_¤3pEæ–Ì2 у¨× ²’ÔŒ:\Z;Sq†&J±œÆîš_¶ªì‚2:KX"lD¾SZŠ?¡Ì]v ì” qvZ{é4Ë×ZÒªøñ+ãtIûÆöËÚi0 Î88Û!_ÒÞjo‡Ú[‚~ûÃQÿ¤”w+¸I$v´6Û[[›[i¦9,¸…ªG­”£\+ÌCŽ™I4ÇÛ[)ñ— n}G8ÜÙQæ'ÚÛóŽ!ë°Y7Ä| õCHAÍ+Ž´“a~!›mÎ6à Y¶_YÙ xÀJZcð„þdGc’ Vtjfи­(Q”¼1ÆZòš-(¹ÎŠˆýàtÙÐ4±~K"0¿‡jY¦ºèA ´Š;¥„Ãn³µŽ_ìIüÝ߻周yH6^²Rfà‰Õßu÷ÊŠ%±ìØ^[_Jã-6wø4”3¯½nFK³­Aˆ¾0Gµ{ãuß\Ôþ,dá5f§I‹ ޏØàÈE#kGŽßpqÕ:µkdßÈšƒëoƒE\ý“gšŦÓÎ×>ÿøÃ#¿ãê`Û‹lð†Ñ½ªËP/U+ÿ_ð®\fˆ¸|Ò2?ìóòZÐêtÝ*ÕÿfQ'MÖ_ ¿RO¸Õ*Tˆs4ñu#}ЬH d3 !Œ¦#=`¼áSdBmAˆkb¼&‘Œ¤4[5—kh,ß!hPiJÇ2CUÃ9f…æ¬Á`€Ú†Ö›Ál6: ¾RƒÖg[>;¶ ÅÕ0n\–üì´:‘A¸òÌÝ^t}Vç2ÅÅoŒñež ª-pŠüO á P«ËJêØ °Z™é rEz@a-öÍÆ€ÙQe}`ÇÔpVÇ«gwIÓg-\äÛ—Ý­kݺ÷¹Å¶\ £Ëí¼ æ¿Ë,Am¨þóÕž¹0òMé¥F.¾øõ‘œ8jÝ­í¸qäý£#ï—•UŠP½ˆòš'±Ñ½´W‘¤òŸM\ÿ³D?ú[n`â¸ïÕƒÚ ZSK°%ÛÒײ°åâ–C-o·hl´Eõ’”tû{¦2þÊøGã7FÕ–uX‚²â¬ð¡–OZÔÆ([ðŒ×ߣ6Ì1pê:à%ðPcVÿCüßá# E@ w‡¹ !BCœ‰#á°dŒ YÑêôõ ª”¨Ó‹”#©óºSµ™¤×H=-›#ᜤMVˆ€QŒ@o&‹`ñz‘@`0%ÚS)1Šèu¢(‹Z©YLÕ~"‚I ŠYq¡øˆøª¨6‰`$"ÌÜ-‚(Ö„¨\ýšÌÙÂaü¶ú,`²Üi9d¡&ji ÅÆ(íÂöp÷%å$Óm½QJ&c_˼³6)o¬Xí&ïð®0þ»¶Ú¥Z4¬¥Wkß®ý¤–šjÁAk¿–MNŸÏíõfÜÅ\hÌC!‰í=á ` «s› ’˜ [ZÅÄJ6´@ç'û7Û-9N¦2[™¹I]cKeëEƒ8Ïì¶§¡üw粕ÃEÕ¦\‡qᱪ@aOyÆ™ŠþÏÒ§X\Yƒ[ZûG¦ÄݲW=¤6.ÁH[|KÑÎQî1i…PeƒÄH$Yë”öüëSj I}ÃÈñBwû‚†ïmœ8÷lÙIU_•ÏRß»ʼÞGÅô›­üõ=ÙϾàÓ?%6¬j¢o¼ñà*0л ¦ç?ÒÉ@=w~Ôgžñ§¯'Õ…~äÍ‘¯¯aomË£ïÐEªC¤œä¹‰Ï’SNn©úà‰X^iµIªÐjh¼—ŠÿOë¬àÐÄ44ô3 ̶ÃAtê`j´iozRúŒô9éá´z’þ ý9zªuÂEú}Žaé·Ñk<ÃxŽqبÒR‹Ñ–Ôq° vÓ8Bä _Xªe`rÇRR¨vz-gª]X»®öÎZ^­§±ƒ£_Èn,Õó†ÌŽåÇs2ì•+.Õj•U¥HÈCh‡iaºv»v7šIZ0ij×iïÔò"ÕÖjWòçÅvƸó`'p Þg½Ü/¼ð €z€Í0\,ä ôèÀœÃ©#^Ðy}^NGcƒ^‡Ýëu€7æ(8¼µ&G›£Ï±Ðñ‰Cer€‰:äd¦Nj[öàèOØll¢ã‰Î‰’²IIÊÄGª¦Q*g³¨`ÇÍA³j9YáHÉoÌÎÐPT6Zz¢Qµ™½DßVÓ†ðfL^ñ *òVÁ~i±aøq^Z¥Á€Í!M>EÁ¢.Ž´à”äXÙ¯J¡åÕo”-Cõ))öÖÈé ª™y S’ô%г*Ù$ãüD™¸Ç.J™Aït²Í²ÿÚ2üâû#ñ(SÙ-â]q0ªÕ<æí^vÙ'§gjÜ‹Ö ><}öæh·Ý™°Ð`ròÀ,ì>mýÞ³™Ž½{ºT‡l#Ï„¹¶biÏî‘¿ÞsÞœ…“³OÁŠ5þ~O粂Æ#¾no›ÿ2´®^ÓxÆK#o1æ×5úgZN_AF-È;V Û:ǺÌJcaP…a®A Iu½š›§St$ʼ“¡,Z”YŸÙžy-£6ÒP¤,ܨ / o Sm(쉦NGûÕ}¯l[è¸ÖÁGÈ‘sLw¬wìw¨‰ÃìXäØîØ;‡¯9>uˆ8ÒÑK‹ïÄ+s’I³Nز raXè—ËÌ݇­i*ß§bžÿd­?,÷™UN³ùdwM ëHfÜ÷ªÒ£Ev5Ðÿ¢÷Ø‹ý55ÌœÇ#E™5 L¥6“Éä“Zé¶Xø$Léý uÑ:“ê¸7utë/û/¸¨bÒŒk¶Ô=‘úMš ÜóêVn[|öÔ¶+Î?R¦_ºææÏ|õ–3ò]éjÃæó5šN»1\X3òì¶mg ´É¾OßEiS ¹F¹ã~ åüõv{¬uÉõØîœD›ô¸kS|Úõž Þs¤š£R½¨âßx/ L:ü¨ŽªÜÞŒäbÁÌMûÒ¿L³\i—=vAZåêq¥k³.¸ØuÈÅ™\wb@\û]Ÿº¨…â±B+Ó¸®l izH(’CÓC»C*UÞarÚRˆµ/ÈÛfºO/+/«åtFI¯×~-[í‘hyã«ío·ÒNMí(JÚ¿.sæîËËy"R>OjëR‰:&{¼©5꓉1±¢¬ie_÷˜úl+*Öï(UWÉØÅiˆ ¥uîã wP³ž>ã²'3®-KËÙ¬ü¸Ÿiê{ýeÝ|uŽ(µ°IÌâI ØJDØêE£…àR,EƒÖ¹ÆQ,Õ%Ô¤èk(*ZÛIò†½éÂ+xV&?èKžlóyeWߪÓÒþ'ãŸ?¡Z=òÛY´·~Îìk–Kk ”?ªùá†KZ§&ÚšÃNW¼ûœûÓ6B/޼{üW»›möÜ"ê2Ì8·²2vÃÝðôÈHz}ëlÐ<ö¢´²q¯³(‘Ž¿Ú—üÞó?œ+¥+ºÞÛÑDŠ|”ûù¨iФ!&»´ê´š3j`ÉUÈœ©"[Á¹i’ ¬N/-Á²àÎ ×`»ÜÆ©CÎP½gðG#m+´TЧæ¾ñì›Ãk-Nß¾ÁͽÓ'θüü„n‘|Æ9רf vK…ÜvhC²#¯žÎWý„4Ây¾©9ØÜ×¼®™7¡‰Ü†ÉCÍo7«õEêõëÑ /3úü‰•ÅbåeeaŸ7î­¯oÔˆub:U+ñõ”ÂÂ0p(¼>L4öV˹\•òjL•É,íf+¥êl6‹ÅÛ)Îi¼/y9‘ŠurÝ`ÜkǽuqÑÛä×z•ùP“{‡å&­AÂÜB,V½/*ãy !õûä2¦Âd±˜lv»ÓÁ®rÞ$›ÊrÕÕL>TWWnª¤ØyÖK( ØÈ/®uW¸`5+² hò1¥Stž¼$ô„‹H!Ðì\Å>,ZüÞW0Í`®ÂYªsfAÕ¬if/½°Ex$›ÍÂX?ÓFñ(ÚýsF#‰âZ< i²m|5i]+#•T:‰7 º´b¶J’.i_|Û´l6™<é–xwëŒøôW£ åÍù¤-ÔëÌ´Ü•69Ó*¤©•5·Ñm†¶*8¾ä/o Å\¶Ýêúô:Xò'ø#pš€˜‰üôŒæÓÏ‹úÖÕ áTÓ #ŸqZBG{üçôúÉ’f2ž”»–Fai(<[àîjz¼‰›h¬7÷ u>ÝÉ=Ðýl7wpòK“¹;áE?´MûdG¦™§qâÆlîMm;žñá@Tj;8zTΈFi{¶GàìNXÑiéiwØ·ÛÁdGåhgÖÝn¹Wé ´ÈZß~Ž}GUNRbw@‰e½Ã)ù|qm&ÓÜ¡…h‰³Ó6gVvú%­l2IZmEÏÎWã°>$nŽOS‘ÆC\OûNM¬«Ó%‘ sÅî *V¨"`¡ÖV‹Á(‘U—Ãs£›d1å². «@¥2µäª»pÿ©”oS#4bê13í6´S¬dûól<Ÿ5S@qa§;ˤCQx44é‚AÈxJ¯X•”ÆÌÙ¯)M•÷×Á4(KLÙû­Jýýc\F™øˆ)*dŒ!¨¤Ò UÊd§2÷Í-_Ô5’Í>6ƒ…¸³•<ÙÅW_°¬²eŠßºùª®M÷žõPçÆÞìóD+ùgo¯oºaNíÈ{o>üLÏ òYgnÙ˜œÙ¼ñ¢¥³÷µß¾mÎÕÓ#…Öåîëà¶]8÷ûk¦¯çtª%ò^ó~¦6ï¼ ûœÜŽƒ—­kß~!W³|Ó®è:³ðëãŽEZ— äúë¢=ÕUÈu½£ïÒçgÉ4*7ݘÉñ ˜Þ¦ŽlÇ'ÔÔñv×![="D´…4ðiØ,ƒ*ƒ½** íï7žÈd¥T)N—b%?R^ÌÇ8}Ò¾r8$U #­ š'¨@Ë7òÃ<ÕÒF:L@jVè¼`Hz±²”Wqªå9 Ù$¥ª,—=¤‚Cpˆ‡CxUNH¦Ò™ Uu‹ªùpNv-rqÓM6’s ×Ò"IBs¾&lŒêù¸O…\ÒeL9Á8×¸Ü¸Ùø;£ê #¼©=ó˼SìÙ¬‡›ôÏè¹›¢0¤‡ßêa“´ø‹‚x^ºóp^î’`¢÷IàÌ3^¯ÄVàkõFã`8j‡£Grp„™°Y‚9PiPÈåó’=Ÿ—ôQc¤\¾=­mÏKµ$ !SÚÖ…a]øÎð#aj ÷…×…¯   &nòrÍÃ<˜òÙüÂüºüµù;ó‡òx0/cãóíùÂwoÙ}ŸC&R˜f­Qr !‚ÚÑúµìsÆï+ K,–˱s®ß2N_ˆÃöøîøþ8- lncg[›Â ³Ø80™ÑWd‚my–KÆ”tñ…ô±õh'ÙŸãN—"•Ÿa<Õ×20¶Ì²ôÅÉb6,š7`|ò[WQT‰â:Pxd‰”–F·YÐ4—•®†þâH/ÑIÅTfûX÷PLb¶œs@¡“.©\a¸Ñs2¯d‹ØŠ aJkaÖâ¶"¹„—=é}³ê “ýs¦¬Õs3_ ;}ê`CSÒWÖrF÷ù¯3v¾ÅpÓÔ°ÆW1Kà 8DmÏðÿõ`ÔS~ám#«““”¥^]×¥Uqopç—¯-7¦µ><¯{Å‹‘kwó:ì ¡$”LAþèUÝNtÌ· ?•ç×ÇÁ킯œÐm‚¹i¸Ï=.+ U{‚h+ô®-Ðj½‘fˆLAÃÛ†O Ô`È”ùƒÔ-À¸“¯ò&É¿ËD ^ªV;ÜÌ÷°ËÕøVòãä×Iú–ûc÷×n*&=INt{ÜÜÓɓܜÌçΙy:óbæh†ŸãøÜÁ=íxÑqÔA?DLdà¸[8ènpãOãðô8?sps_88Á‘p<ã@êäp»“{2™qdÜÉ|2SûILÉ…ÉuÉ‹“‡’*M& ƒ+4ùäR’OJíß#Ì”òð¾2ößa9ª7Jee^ƒÞx_µ\-#ô«eTOÈw¼_G«n²D–¢Im.ª“"AU^7O·)Vö·\~çE˜ÅÃR„0{êÔ7>Ç^ýË*K+,Š#R¡@ýÅùR6aÒ¿a ¥UXˆÜ˜©Sr§ ceT 6˜ß™‹¤[³ÑìÈ×Zºko:åH®)Ë hu\÷õmŽ@Äcm¯s™ÊÖ/T¹jg¤ÒìÜñ/]†³ûš|‹oY=)9›zõÒ_!Z¹¼íàýSû7ßÎ}—^Z¤•{Söv§ábLrP^("+Î8;ç'3&þü„ÝÞhe±ÍÞhcÀ(&T6à-@5l¥ãoñ‡€é g’ûäkeª§q·Ý!Ý­¬ðFÐn&‰¤F6·ÛÓ(óQ¿_v–I²»ŸëóÃ!ÿ«~Îïד&hj*Älß³qPI UI“Ô¤R°i¨¶¢Ü™°ñ¦p®¢@¡*©µM²]a£ƒ‰[lÙÔÚÄ ®11)q&nI|”P«p¸v;÷;;é[N8„¿rpØb¶{môJ'蜫œÜªr0•ÃåðrùÊ?*§˜Ò–{ËÓåT´9mç`yÂ^ît—'ârc¼ZÔÜŒ ÞÂ˪à>àl´`°³pDæÚr…ZƒA¿_ƒGÙ?É(v½Õë—Lú6}Ÿ~¡ž·R½^αìyÌ ÈMÏqfS.˜C»+XJ°’Sn:pŸÉw§­@âMÔçsß®ÌV5Þ×"·0¦ßÒ/©7ݤ­t„UNB´là'{,Ÿ­ÉfóãÐGÆòÆàò²³“ž³ýÌ©ëNZ^\ú›±ñQ’öýãKÑJrœ(n–è?IÒ³‹¹òÊ«=Ê•°áÆÖ¬=Ú7yæ<ÙÀ1r …J¨,þ­Ió¶XØ\t]’¢ï³èž,¹Æü’•ù¾Å~œV¶2©nLüWÑ„‘š8‰Öº“%þKžhccy`Úß~Ò]–ŠT$¥s:#ç6Gôe“ƒ:-½út‡Ö•ž’–["®2½{—¥:¸Õ˜Ø§š Øß=òñÈ>xÞz0o3_e¬˜ßµjäÎ*uëWÔZxjr¾nmÏ5å†oå&ßü›„³(õÙ?ŽOý |ã2Æ\cJÙÄ' Þ”í® uÈÈî÷9`E Ìš@¸gŽ æXQ®æ¬ŠU!OÄ_Pð…­I}4ʉѨÏd Ù”‘wñ@‰5é³Ú]Iîç!å‚\Ϻ8Ô VµÏéã“ÂËLŠ7X ,FËöåŸb¢‡ýçüÀõøàœÇßÈñOóüu®óÁt»àF׋[W·ÊwïJ­ÇãÀ Ø0ßÝ>Žú@k„k€3ø®öq)nÎ,únöqËíJºh€ò8°|.;3{\àã].¹²ZrE<^éVè\»8kÀUåºÃõ°ëÇ.•ɵÎu±‹º©+îZJ\¼xb —Ëål”—1dt:äRƒök«“±¢¶ñŹã㤸LÆÿˆgÌ$þÖXPþ¾IqÀŽë%ÊŒc²¸7þŽxq†\y»RyöäE#™þR:³@07æûP@[Ô¶Sáú®7qáézή¯õkuôï³Aïä‰eQ!˜`ˆdDäîãŒÌši5:Ü3¨~Z™HÐyçKIgɩިk}Gõ´sgңϒv”ôþPH D”Àj•œliK âõb YñË–KÓJ±²%ؾìÂDÐix°³ÄöËÛ9' (zÄÙÈüÞX–Åxn¤Ñ¥è«£ñt>”áø4ø}0ê‡;gƒ*8!È©\\œ¨îÕtpu$:&vPçôøôîé”̆Üìó¹WgÃÛ³Ggsx†iöºÙ×bš×)ƒ#xB<çRåð‹éðŽ êü‹CCü¾N‡}F Õ9%SQEc‡*••£\MeL‡4J%¦ÖèÛ0Tõ±Æ(ªééôO*S¹»¹h0šIreæ5®häºcsbËbOÇø ³¹òè¬('E»£OG©+:1Ê F!6ÖÛë»;çt.ë|º“¿±6— –ÝTF7ËÏa‚{¶ ~YöV÷ƒIðò¤?LúhMö‘^Ðô${VôЗz ¬³s°g’½§gÒÄsgpsíËíÜfû ÓØ_²±S¨ò¨¾RQa·ª8»JÅEcõe“:{ìªܬúÆÚY=“jgqªZÒcîù´‡VÓžžz®^no—LõPŽ[ãÛõ`ªï«_Wqý#õo׫ƒÿ‡½÷oòÈF§IV³%۲ܭfã"K¶lÀr‘Á4Û,l ŒeÜ€ÀôI R!! )›D@ ɦMϦžM6!ɦ÷M!…`ÿç-’M²»Ï}îsÿïþ÷>‘4ïœigÎÌœ9sfÞ™€ûK¿.e'K±¦´§” RO)‘—"r’ÀÀGøõʘɀ¾¸yrq3)þ÷ÕÅ)k!%V+q UÊ ò [<~Zʜڢ·µäœ±{&мÁÙžXà 4Q3Ñ0hxÆà™&†r¶Ç ¡CÓvM;0N;“$Û«™T‹kìºZÒ4I8 ÂÇëàÂÞ°:Èõ5<û‡CÍk\ä´Å1ƒØè.Ù"¾«‹³ açiÌß*‘ ÆÎŠD!ÁÇîÃ[ÙèÙÇÍ•aÍrù|~b¸±0–.çÏ­q[r$ŽÃâÑ~ëgD ñ‡Ö,‘O"7ô¹]“ÛËÁ룔›-qz©`S"¼Ëþ­~Êß.ÅÏ–xe•;ÿ/]ª.Ë(IL)™¦RÐ/§ç+ÝÛqæù6­m'öεµMK×”´€„*¸®!%Ý$OÊ\¨U¥¬¸¶­f\á|uýìôôÞ?ù=13´±'»±ä–Œâ4Ó©o·Ç× ÿðØËy½/>ùнfø²áOËsS*XrtæR³Å”^tÞÞ펋õ\}ígoE%¨p>6ÃRqô¥á7¦rw{GÞc:ú0ª¢Þû”“jññe‡¢qM9®›¹_ÿxò} –æð’)®Œ_H¾:l‡'â}F<8ï¬Á­5ØÀ#N:ÇÇ V„ß]-œÚã_}Ð%˜foÀÊuý×_9ü뚦 ÝL³+ªÚçææ5–]½ O¼'>ŒËî»ä¶›‡oMßÜ;Û?¡ö¡ÏÛæu—ïħÏ\ŠÈÈé³OÒ£ô ”&›<‹V˜ñþ Œ*°¡ÂSA¸Ç»TnJ6ÝbºÏÄLšhÍd¹=Ù~‹ý>ûÓv‰ÜÎyüݧ¦¬N!(µ!•ìÌÄuv¬4§š§š—šw˜¯1ßfŽR¬³a¥mž(i¿Šär‹v™¸mŒs{¾ >³-ó`æ±Lok³´³1IfV¦7“JlY6¯m–Éåî:wÀMvcyY]ù¹ ƒsbJcÈ÷eø{7v—qÛ「,k¦ç$Ó¼‚ É,ɧQS™'¶'–¨c×Åel¬¬ $¯(‡XdI,qwrä|˜„ïNz5‰Ü-ÃQI‰I?&Ѹ”$œ"»_FZ’:“H‹¬SF¤e¶¤ˆŽÌ&0·H²X¶‚ÎÅ8–%É,d"‘9‹7ž2à ÃBÃ:Ã~Ó80hØ ©Ú€ãa—$ò/þÓÑ“ j¢'AsÐ…dÙO&§È×$*Egò -þ-µµ–ZUdJ6¸ŠrT{<î’^Ês•ðY›ìb%¸lwÉM%¤do0JÍKÈ9• *Bv{H*^õ‰u¢ê9î€Ð–1"Š¿rôX"ØÂ6€ùÜAÔßOƒæ‡ÕŽð…¤"^Y h0üÑ#áJÄÝH*H´‚”±Œ:æ–ø›¸Õâølî~¼ðR­ «ðÊ ¯«p/nb¸ž’M¥ñ£÷•ò˹D•‘^>M£ˆf©Ñî¶h9õ=XTX²ëÚ 2*g÷îïÏJµ–5/{uÖì)Ý+&ÆÙ/ÜYlJ9û¤jÛF\¶7šT¦t("õ]E%Ã_þåAÛòêó¿¼e…¯XwöS5Ùk­ùêÇùe÷÷LävÝM8û]Eÿ ²Æ†zœ6Áåà^àiø!¬Þ±Ð±ÓA:ð~v§qÇåTa2倠‰KqI TÈùÆÌqq¶§|ɰTþ„æ?ñXe³Ê¢¤½$´hª4)£]c™^bÓ[Œ’t} KF9[ôx‹4šä"×'ëa KOIÙª—hõzIŠ>]b—èA 6H0’x$C’„É)øçp›bb41ø@̉˜“1ßİ~6q²:2ä\Çã]¼¯16Þ#æÉeϱ§Ü²WéI2êR’5É:cxϧ‘Ûói÷|ã.B—žl©Ôéx–ä’ßðæHªà^ê¥p› F/¶Mä¶¥3c`…“ÐÂÂìï÷¤ôö†÷¼ñ{š¹WÕ|Jqõh<¿ï "t-c¶»œÍÝOåŠçw›8‹ã\%üûÂ’D)öÝi2‘á‡ãâ£ã³Üq–…ÃÏ4X “rÓtÌ«J/¿¬²ãosΟXoñ”'¥ÅÇξdÐ^pö‘dM‚çQ<®K®þºcz;¦÷»²7Œ+´ª¿<?› ™eOλèõ‡Öܼ¡«W= Ú«sä}ª¡O£,¼ÁóàÕ\u<©‹ÇÀÚAÃÃUÇáè8PžHRb²ëi‚×ec”mÍödŸÌf &§‰l1á9ü° ?4ãøŒ´Ô…Éw&k2¶&{’I²R.£¬U±Kq@A÷+îT…‚ÅÅf3£R”s»b±4ö£XRËÙ{b‰|ÃsH€7cñ› Ëc?6‡Áãgß[»•-c$–™É8œ¼H›"mÁQÃŒq)rP–ydÜÂ=’áod¸B†e2ijZZrÆõ:éÞœ™€€IbD ‹Jö"áÂåcv/…Wi,c8âœM ÂqEaŠÙð™\ÁÔjùv`?nÒòåÜÁêåóÅÆù ø‰ÔXÕG@‘wÅùЊ¸ÚIÁügÎã…9uóÖÉ©ãÓÒÇ¥Õ÷Ï*ÎñgÄ|ˆ¿›T0t™Iƒö²á{¾ç)K®—æ^|ä¥G¹Õù¤‘×ɃôITŽ·{ó85%—{”p÷Ps·°X'ãZ¬Õà»4˜©µjr—Vã½¶Ã6"±%ØÈÝ6,)J("wa‰5ÁJ¬YÖ»­´¶»5¸Ä‰÷¨1³j­DŸOb–Kžæ×–-:åŵyVW…®^Ô}­ÑIt:äˆÞM£·¸ø#ö8ß8¨Õáq„ÔáÈÈgî”ÚÜŠ 77 Îd±•L/§µ+ôN[²°¡&ÛRyO…?˜x}«LvÃtCɼ"Ãø,&¡¸ÙV½¬ÕcU–õÈdå¥Ó—M›8Y£-šZTºt®/ÓÉñK×È)²S¢Cü¹Ç¦/XX@ 0*°œ, Ð£Sã§dN-¢LUt¼–%hbc¨R­V ¼:b2˜\n”2²p»¡óašÌøWÞ83Iš˜“É­-ssçŽ,ÌݺžÀ]PÔ‘³Û’ˆ4ᣒÉMö&¦&’‰gâ¨Ì{3ŸÌ|=“ÍUâD%ŽR‚V”™¹U™ U*’2•ùʧU‰‘R£|Wù’ES%¿Ù)ÎÅÙ‹\é‚8Å{¼^Ÿú«Ùh4ÇÆÄ˜Q4Ì£¥‘Ã:ò+Hjˆo±dŸ‘&$$%Ju‰¨¨f:Ü^“1ïµùñØa¼£ˆÛ²ÄÚÃï·5ç÷ ?¯²hùE\÷èëNŽ8"G-“Š„ÛUøÿáã‘ÇÇÇFG«UÊqT꯭1'`²)\Úï‘'§¦f˜Í¦Ì$ñÒ²Ô1^[¹x1'æp»¨ŠÄ;Ü^¹ðlW¼xQ<·±…¿ú lS¶¸xSB2•4û‘Yút`Ê £¨lie¼q©=);ª° ­-W‘˜uwp\|Å ó;‰*ÓŽ"—½|_{™,úg Æ©qW¥Hcd‹$g?_Xht§rgŸfŽ\Ád0¯òpÿÀJžºÛa2eº ¹?Û^íRŽÇgÆã9q8ò© ‹Î0¨Ú¢ºGE£RSI µ‹KÇ6ѶŠv‘hóáq B8ØVÑv× ³áÙExv!¦… RZp°àX•×Åb¹ô*KtE%w:å»c)üLï;Ï•éWO ¶Ö4Ô»ÍJóUYfM;•‰ø_ffAZ^☶bø”sgî™Ò•Ÿ¦Mbºœ2U¹’I™æ,Sζü¿çû’ðž¤CIdPËíÇÙ£=¤%?¥aY–i±<-)i«6_«Õæ–C78¬$‰ve•’H•㔇”4ãúo= qZ×6w ɶ2¼­ËÊ?)'òU8Jƒ»R¥ÚZV®-++OÒ¦å+ËUeÕùZguY¹³>a>éÉÇ(ßšz^~u~1*ÃnÖuâXJ7Û:áÉ·¬º¬˜/‰ö÷%9lò˜ãÒq yð7¼Ðƒ=ž$V«›¸WªÓHIÌo´sC2÷RÛñeûÆ}ìj¤«EfÁÿmÉcyx‰C¼äbúè¦îàÏò±“ qˈ°bº|ìŠi¬ø>^œc a16²ŠÃרB˜mˆ‹«yþ¶mâ¥DY wÄgGÅ{ÆÄULç)hÆS3@¥eŒ;üH‹IµFs2 ±ö¥’„–¥'¥6K§ŒëØÖcI·d·¥d¬&ä>òubLâj“!!qàìw ò7þé’¡–N_?z:¯H_Å£wL°¤MÄóé×Àµ±îÒé×ãKfp2·ƒ厼EŸ¥!'ÞåÉj-Á©J,ËÜ—IäŠ,¬ÈÄM`±8&*'Ò¬¤ÔT—†[ê›{Éï) _’u ,>ER”BâhŠØ&%%~‹§‡ûS«©ÁÔcÚe ™¤¦÷¿…rªÿf…·SÓxÛ““|¤0(¬ ‚ÁìF‘¢Ú”›+ÆÌå·À¦d¸¬¹¸•[¾4ä…:x<7·Øé8äAjO¡Õ¥Ugª‹a~£ÆiT}Ÿï)§KØ«Ï/ÚG=Iɉ)‰ö‰‡S<<­ 55crŠGŬw:1¦@¢B.§z å88ÁÁíä7­Z%<ð:ƒ[ØÂ¬öÆó|™Â±­#²ñ?{1f‘_˜Ï_.l¡ç¯ê‹e £–]Àß;ɽ„æe2Š ŽáÕH'7©]ëùF‰ÔœÍíFŠ2çδä™ÏŸ9n¼-nø«Æimw,“”¤ŒÎÌÑÇêj¦þmø³%ó¶®;ª[m©*µ+RÉ£©å²Ø´á;‡_ö­| —,ߤ ª´|“¼³é–áî//]u1Ö=.#ÊäÜ-n¦‘·%—ч‘—T{ 4H'ŽV¸°Â‰X™›À(Ó°ÒŠåº\‘ÇæÆ’˜d –%A}å'¤¹ô“öO"h.…y®VGTT•¯P¹ä*HsE –KŠŠgS5å_&«q—pxð„ȃ¯xšø$’†§:°Ã<7(±UéQ¥2®lPÇᔃ`×ÅÆ&ÄÅå•™Œ=KÏTge¯fr¼š™™¾%σòZóHŒ:(ÈãðÇÆq»OÜ ÄäEo*+‘³ï>ià ÉT¹jrY™Õb  ÆÅ•¥˜âÓ\)Æx ujÎKÍyqLyO‰N¿7g‚ç8nò0ÉlÌ4r|i<œéQgê3+2¡Ì™Sffæ€êC"&J®ÏÅq÷({ |0ßÊÑh5üR¡À©£§6„7Å£ Ìo6¼/¼yCd\ ?±åï‘ ¿‚ïÓí03†L8ÙÇïÎEó1w$R\Œ ŸØ·m‡šÇ,ÒONuŽÏ>‡Çö8NöÛav~Ò$²zIXŠŽò|Žt ÏÝ×üñŒ©Óbv×LØòb{rªR3¾ =í²¿ ÿØÝ0W[]sË”¦ö5w…ùŸüE&òÿ‘áç_ÂAü¶2]5lz¥Þ÷[‹IŒò`æ¦/oLÝP;hÍY;ïá·¯0ƒœ®h1Ì8pÕÎe Y|}öQú1hÖ^T ÒuØsk¬ ´] ÷¨ã¶9>­Á[&â- Ì&àT‡ÅQî ê:}Ý×uô¼òÃåÕq{‚@ ®-ž]Ll»šÅä;cT.•Ùh )õ¦…&b2¥ÄjÔÔ¯ïr³ÒÊœR×cn,‡Ÿ ×€$|Xœ³Õ9X‚åãÝî­.•ÖåREç¤çè”ô-ÉÁ’œL-YE3J¶Ôðë‡ÚOŠ'1Å•â‰×ÁCcr>wbIçQóãÇgkãt.«®GG¸K6t­º!DNun×xÕd•Ë©âö9©<±ñ.=w7uÛEú„ t+'ðt#þªå0Kº²Òå.5͇ DZCz7%ÙY´¿èÎ"Zt&>}oVej¼®T“5ʺ½ÂA˜ˆªZäx¢H8|épÕYyÑ™è SŰTvðç„u_Š·k†•Ö°ÆjáO#Ĺ-ç¾Úç™:füx,Þh;_¼ÕO¸ÖßBAù–iI ·¬ÀOø„5î0c º*¿,É+«T>œ‹ãUm ¤Ù:®~ê‚陦šÞîÉiyÖ˜¤Ø„ÄZg´’žš”aV€F¡¶uuͲšjštö-5ó.¼é²ªI‹IãÈð–ê(jr]öÜW~ؼ¦smoþâiÙ«Þº¡ÉQ˜Ë’ÔO®éþsoN^Ò’þºD‘¦m.ù|ø_§nªž3Y-¹œ;‰ŽÑò‘²_ò<ŠCÕ£DR˜TÈ5¹\µQ µRe4ÅjL.=Ž{PÅÛ½ý¸æqÌߘh/BPŸqnÄm–š/GœÄ­ÅHI,w‡PT^ºh¶¼®2üã‘Ìñšöâ|Á)lÆŸÜmR~>œ5üܺ“·-Rj9Z/Ћj<Š %†ÆÈÕê0-Ú´Ä"!G”Tü'b°..Aƒø“µq±ÅfáxêÒÃo¼¥4¼ú”§‰¤IžÝ3¼ëáSÉ÷š”ïãw°û N¼Q  ßÇЈæÒ 9!¼××} 9Ùažë4&0ˆ´bòLœ>mꔺɓjËÜ.î/&#÷ÀådËU(#=-5%™SàµñqÐEb¢UJ…œ{Uf‡8”TÝâ]J®n ÕškÌC¨vÆ7Ó‹B(.ÕhŽuÌ)¢„$–ŠŸÒ6´AžÒ9!©åœð!š¥ùÖɦ§¼!–?ó_{(§±ÅhÖ¼” ŸIB)Õ-FcjˆdÁ¯‚à7ÅghiÀߘ*øÔ…PC g޼_ žšRãœÔjl e€óøÈ7àž3çßPxB#'ΡqÞ®9R›\]BÚ#¨öýJà"}SŠBh|(ÇdhTI!TÂÚoC8>„¦ÁçàçR½[úÛÒ{Û—˜½í¨ÅöÖÑzüF¨E£a»a{cK¬@žÚ#JEµ¹Ú¯(ÈGGJ•Aªž#¸v"æRë-;B,ê*Ž£ÎË™%!ÏŽVÌ5PI?²óâ±A’…¡xÂ!iu(ŠÏ×y|!´Ãp$ÿÄö‹kТV‹ªÝÜî;¿%D}@ãD³¼Í¡´© sÁ 2ÓÚiàZµ†pmdðv¶ƒ›‹Û Os ×¶çø·wú[9nÀ­æ“W·l5žH Åí ÅZB“ Ú¤ >H¥Û½Içܾ}«!t`fËØP#÷„¦NÒ·{Í ó.©âÚ«(Ü><ÏÕµs á3„†-ØËwq˜¹Û5¡ÚÓFhhˆp*±Û[—pä.ñqEô.1lßáç‹y1_,`IƒwI g¸„Ààh¤žÛâí4{¡.wB¡ Y¿Mk4†’-\ÂíÛ½}¾v \ F‰çØ>Õ‚žê§™·P3_ÿ£ÇW3Gô#Ìå’q!­5sæ…6žÚØRÍ•Çì«IJñi}ÀÃä¨5׆¡ÍÀu-3D-åþR´½­”¯+ã ©"©j͵­Û·×š µÛ[·ûŽ -24æíG¦NÝÞãm5ð½ƒÿý;RCµÏ iZ;q´ÇDµ\•×:}B¯0!“Ø9áà†ÿŒ€u¡«l×|µ§ ’j¨åhæ$'¸Î¹Ïj†n㙣7ÖTŽåéœ,o I, °•Øúœœš)ú£‘ë ;Ž{Ð"p„†f¶nZ”zyŠ,Э\ȉpHÂ,.d(IÞj†F™Úôߘs,cn5ÇÜE< F±W·ÐT2G€H*å …äËøP¢`’ÅDØvÙpÒÒXB’ê–©ãç4± ¸¦k2O9·¥Tl~Áeðn0„à"ÕBœÿ¯ùߤ*„‰øEÜó_~Ó¾¶–÷EÚg­´OIåy[&où1G‘´÷×Ýc[ŒU%• !D"AÖV©Â"Å o(!˜h´6XóÇø¤Ý˜1”†Æóßz´õ¡ êB~Ôf"÷µÎÅÇ4—Ÿ:®W§}±é¡ý;{Sý šË¬ˆÇºßB4ôÉ%o]žsjü_RnßðËb5:B'&@ŽÏkUKé,/«ëî÷÷vûûm‰ÖÎK3Ûßh ,îÎ7Ôu·ÚV ŒÏ ªƒË–ù{Û¾.CS°£…¯×ohXÔèëô÷öª+­‰Ñn—µØê¶òŸ¹‰Ñà°YKì§Ûéžû?AÂúýcË%ˆ®¿Y×o#ë×£G_øñîæÛržX”t¬yÖã5[½SÊÿºö—_jhË%o¨þ¥»öÙ¥·äÝ9ØwùS/:4þË ÉÀ7ñ¨K;ý•}»¢ ô­?¾h†-ãÅ_ŸV}¾f×ÃwÜ5iæÁçÛäµ5‹%+Þßù÷™¯ŸÙ›üÀÄ×W¬¢úíoß>õÌÁ;þVùÈÓäɇ’ ¦úM³P ëîBK¶Ý¸åÁö•¶ôÆÞ:Ž$¶Z§ýsrqò}Sf& 7¬~Õvñãþ«*+‹¾½£í‚Oú®JØ•¢¿`GåÉKËN>WZ\srà§Ï–?¶>¹4Ñ9åŽÇ'Ú?2—œ¸â½'KÏãÇ+JÛw}Ùüü3/¿|rá×ìšwȆ·/Ê=òhýŸž[Þn?xè˜\¢ßv׋Û?9ü؃Î'¯¹ä¢gôÏ4;l,Á0‡³®¿Þ¦·¦ M¦‹´Lsï@_¿a†¿E°wi¸M•¿kÓ|kž`MXæ74õû–õºšü½ƒ6¿¡1ì·[íBlËŒzôºÊªºiuÍs •ÕÕÞ†foM¾!§-×]b87ž K¬N›ÝZ"r!̬í›èü?¿ÿ‡_.4|Óya~Aáú´#Ò£‡•÷ÆFŸ÷fÓÿ|Ú‘wô•ÓòyÅß}ºkX®:ùVêÜûžûøôEG®;±5ëó5-š¾%+ÿ¶<áì-§sokY°‡-XÛ²>í™å»_5µ½ú¬V²Éuÿî[ïš>åÓ¯ÊM·Ï¾j­ñÚ®-'¦LÚ»ä®C®W•¼|—ûšßñ0x¸,öÚÍ’‰/}:tfõ«·|ÿçU¿J~½rÂró-–œSÇû· çoÅ;ç^½è™ØÃCßßûöÞg_µT¶ÈûÄzÓ¹Nbz§·€m‘¾P®»B[ýͺé¯E]z¦«eXáÜû̶ý§Xϵyk|—>ò‰rùÕ7?Ù±¨j•»Mö}¦mÛi—eþðÒ/À¿Ïq‘ô`ìÕoVi÷è¸ò‚,ûó×¼ÿ°gÒgo,›4øá ëAõÐóëÞ(_{àç+ól–„_žÒ~ùvèÓY•=µùk­dwI?³]B4³¢/ú¡¢]÷ºª½á½\WüÿÒèî¶:lcFw«µØæ îðüÿíDØj­5B¢ +V¬(„„}°°-¸¬¨×ßì ô{W56Try{{ ‹Vý…ù_Nk®áx¹Ô6Ñ:^À㬠,ôC†u5†ê.__ŸÁa(0L´õû€„Q:fûºí¾þ@°Û0h·)­r.½4žÌj²Å[c9‡,^qž¯¯º^°Û¦±ÆUÕèo_ìn·eXÓ8ªME_ 4{y´ápåÿ¯è&}´ò⛘}Õû³gë¢æ&6Û]þ­rà mÿ\¼á÷z²‘£Ša<­Z+§Åjé:J¢†T;DQ0© "}›¹ÆÄQpI703xëäewö÷÷ô•ý7­nhºa=¾~½«¹3Ðghó÷ö:m¾~¿!À3.×èþ>Ž{{ýþ^w›?ßàën7úû }­ÏÐ×ßhëïZ¥èX´ÄßÖoèæú;ý†Ñúˆàåø¶¡××ÖÏ L0Dôû—ù»û 9@I®Èìã"Ø ­É /Ðå[ÔÅQr.¶Ñ|ýeŠÿTÐrŽjoÁ2@ñ CA¯ù€¿¯¿Ïsn¼`¯¢†#žÛ¼ù»Óí€õÁHU9èéÁî~P5;à_‘­ip[‹ŠYM•¯gUo`qg?7XÙÜn×oÐ •]]†F.F„>ýí…†jocseÝ Åy••3šë¼M†šº¦êi•uÓ½5†Ê5cÆÃiuÓë`8,Tp±gÔ͘Tfhžì5Ìjòêk¬kâÑÕÕÖUW6{ àljn¬«nž6ÇÐ4«jŠ·ºÙÐ\Ï%QÌö6Ö5ÕMš1&~]ý CCceus]µÒ‚éÞÍ@6—E]SÓ,ÈÏP9«yr}#ТÙ.¡nzô:‘foKC£·©É0Z*¨„ÕÓfÕpXF}@÷tocõdp†KYßh¨­kžÁ%¯¸ÒÐP 4VÏšVÙhh˜ÕØPßäÍç39¯nÚ4ÃŒúfE•—¯¤i^>AuýŒ&ïÌY@|]å´|H2£®¹n¶˜&Ll=”ªÑPS9½r’·©ÐÐäõ*¸r«ð8j¼kZÔtuÄ@74Y°ã·¼¸8ÐÂßnèvslÕð·7 ¡²zÆ¢è@ ÿJHÏ3÷ ¯kÀoèëôtû ‹ü†¶ µóH|}_[Û@¯Ð;‚½Ëø>£Ä>ÄNå(¨«,Tt ÿ_éæaÿ®àâ`áâ@‡ÕÅ ÊŠ¬VËÜÙ[²84€¥zä@ß¹ˆÚ¸áÈVØÖÛeÕ‘7©Lf•‚Ìß¿™LÎz}ßsÍS~µ~y׋¯ü„Ÿ½õÝ/ÿ×”žŸÎ/-Lø V}º±êŽÃï e½¾âŽÇf=>ë‘“ÌÃÓÆ}[qí¾Çºf.(9uýížž‹Æ£Ïn¯ÊûWaðÖ¯?[¶nëu_\}MJé±;º>˜šVÿnKÚóoÇÞýÆÞá™~}í‹OŸoÏョßûÇŸ/h±m ‡­èA‚±uà@ ÿÕèœe“ëZ“#µ$§¶±âÁˆ;êRÚ~#ü­úÑ„ÌÇ4ú&7nÌ{úã=ö¸}gn¶Î]e›l­=6”‚uéGÔ‚È€ªøÕöÆ eŠ Î±Í²ð0Ï7wÿªžàâ^_Oç*ÃoÆy¶~hó©[Ÿß44îô²éþÙÜzÍÔ{ßÈ”A eHR=Ñ2ÃÖ/<_ø"ô…ÄZiÃswµ…΄g;œÀN`'úŒP@òD VÏù€6Ðæƒ>”0b0w‡w.ÄRã(U”*Ç£¥v‡vŸØ}r7kÝݳ{h÷®ÝLý6B#D0ÞE‡§*Áõ5˜020BFÈÀøÀÇ>OÛúÎÓŸ¦ OO¯;½ó4C•Ü€8ccãÓF Ei€¢4xtdá³Ág zPó õAσ =¸ëÁ(Íq\q,3ß µ=þ˜Í!ØúLÁŽKàì…µ.ÅmøÜú¹çóŸ‡>—,„~S S Ž[.+Ðe…ª°µ#ØÕÔ€0 ¶`À4Ì£`ûºó§‡zá'ö^„Í(*aáÑÍ©Ð{^QVƒ`Õ]ÃõÒ©GŸËË{ô½Z°ª®okÂÑý¸—¡\Ho;ú\øZ>g«èèsÀ*䬰ç!=ÄÉ:ºÉ¾ýG7rV†`ÅÝœ–Êcžøú½qúï×dèׂٿ_²5Gñªß¾ƒÃ¿Ò“ºc¼~ÇÖñúmÚ³ÆRàö¬‡Ç›ð¦Mpמb<OðÄ÷mÄ7nÙwìØ¸¯Y3´ÆÄ‰›£›ÀJòì^ß _³Þ¥_¿n¼~Ýf‹þƒÍqú‚ ¹ÌE›‘~˦<ýÖÍ ž6çé7n¶éM›m6·g³É hÔ’„$WB‚3!®8AíHPÙä¶©5% Â„qÙêœlužEoQ›Ì1™fu†>Æ W[=‰ ‰­‰ %ö$%îJ<J”¾›øM"ù˜OÍ¥§Ì˜˜`$À”qö5w” øz6ô€Ùž,¢9ë9Ûp–†Îž8{òì»g¿9+±ò>­g{ÎÝuöÀYYëqëQ`µ¤HR!©—@“Ç’ÙÐJÏZ©]¯ÖĪTÑ1*¹B©’FÉTRš­G˜¨ !/¯§L¢jÕöh‡´»´L£5ðÿfØ •mXmÓÛŠl¶…6‰Z‰+” •ä$Åt?}ŽP¦Vã õBõ×jšŠÓ£“¢R¢£˜]Ÿ IŒŽcÚhÝq¬;j×Û'€kÁbÇq¼Gk×§–iev=uÛõ¨Ô®op!¨êhb,¾È2ÍÜn^ò4®<¢0\t\ƒf­Âh,ÿáÓTõ÷‰`ÿ@?G.Oí”c€wˆEg_ŸP¦~ô[TB\(D()” µÎW ïÏ£0q5Ôßo<úǦ?"çZÇÚX554¾qjHÝ0/”bÇSàpCe®‚öãªD×’˜ùF…À–û”¡ª#Q¨ê>¤à %ªJÅGÒiŽÔ¢ž#¨vbÈãE¡JoHi ) ¡Ò\…**’,šñx°¨4iþ|©*$ÿ(sÕþ`Ϩ¡G’|€PÔ4„äq)/@(z BêZ„â ¤UF÷>BI+JmF(âé»2Œù¼ÙO!”W†å „ [SôÙæÿ«Æþ+BÎ*Y‚PðÅø„&Ö äy ¡šûš”$˜)!„¦ç#ÔHšÍ:O‹ÐÜ^„Î?Ђ{jmç#Ô8)uå!Ô þË·üaþ0˜?Ìæ—é…±º÷úÿͳ˜?Ìæó‡ùÃüaþ0˜?Ìæó?fÄ9›?•/TÿA–*ãW5o··?ÍÙÇ6\ýêðÝgÿ,?+[Š’sG©9É Äà9„ h¾d<½%¡ÅôE¤øV¤G›y}ä"x¾7²’;)‰ÐÙ'‘TX5Ù…þóçsT D½ÐÓ#W^’g$kèŸHi$Ϋô3„€Ö%øôß?µh'ºŒ7£E¨åœðWQ ’ŒXFž9ƒ£Ð\$þyäÐÈâ&·Ž¬ãcdŒ¼/Æ­yÝ‹.|·¢ý÷º 0o„²®GÑðߌ®A Ñ,äœÖ¢zÔŽ¦{%êDÐÿ:Hóê˜GG.@[P9*B¥(· Ù( =‰¬h1r¡‡Ñ?ð²á+Ð4–þÛâàÛñí(Àƒ;Qo7·r߈RP+äTazÅxc?U@ÝÐÈþíB'á»-_r£É8'£™ð]‚V !t)”4ß&H± ŒÜ‹.FsÈ|ˆ» m£ Ðù¨ ÝV’õd=Ê$3Q-pB/P 餽D²QÊÈG(iäT‡þŠn@o£{(BW «€¢KP7|÷ ñh;Ð{À“¡ž‚h;ÙôÌÓ ¥³Ck•£ùÈP5j@S¡”—AÝze(è¼mäc(G;Ôk1y<avÔ8Ÿ÷·TƒÐPÔù$¿6¼w¡|`Ý%È9]=òÅÈÐ*õh>þžç£BàŠ•S;ÔÿNÔ,y„íÆƒàÞ¡3Ùt;”Ìœ2M‘,’Ø%ìäºJÛ€æE颲¢¦K_“ JÎCÜuhä4âNm¯üw )±b‚)f(e¡q([ø÷W(c>*:Š€lP*FNÀ_üᆺ(‡rM@O%OB­Ü%¨ Kq–¡]XŽÎbAíX‰U8}Šüèoè)ô ŽÁj¬Á±8Çc-ú '`NÄIèYôz=-ž‚SqNÇX ؈MØŒ3qzC8çà\à’—Ñ‹P3wâ·à9x.úÏÃçãùxê>D+ðBÜŠ^Ç>¼·ávìÇx1îļ/EÿþY‰—ánÄ=hôåÕèB´/ǽ¸Ý€ûÑ<€ñ ¼¯Â ñjô+¾¯Ákñ:ë ?­ÇCx=Þ€7âMx3Þ‚·â‹ð6ôÞŽw ûñÅèc| ¾ïD_¡ÏÐ6¼ _†/ÇWàÝøJ¼@à½x¾ _¯Á×âëðõx?>€oÀ7âƒø&ü'|Æ7ã[ð­ø6ügwà;qAסëñQ| ß…ïÆ÷à{ñq|¾ÿ?€Äá‡ñ üþ+~?†ÇOà'ñSøiü þ~?‡Ÿ)´(éP"È÷d0©( ŸÄ/â—ðËøü*~ ¿ŽßÀÇoâ·ð?ðÛø| ¿‹ßÃïãâпзè;ü!þŒ?ÁŸâÏðçø ü%þ ¿ÁÿÂßâïð÷ø|ÿˆÂ?ã_ðü+>‹‡ñAÜ1 òOо'ŒHÐè4‘’("#r¢ J¢"Ñ$†¨‰†Ä’8O´$èH"I"É$…¤’4DDb@ê|Ž£o`¤Ú‰ÃèdD»Ñ•¨ùПˆäÜ>bDW£«ˆ‰˜A6߇n"™$‹Œ#Ù$‡ä’<ô HW)ÚC,(Šä“´™‚²ˆ´‘vâ'd1é$²„,%]dé&AÒC–“^ÒGúÉ$+ÈJ²Š\@V“ ɲ–¬#C0:l É&²™l![ÉEdÙNv‹É%äR²“ì"—‘ËÉd7¹’ì!{É>r¹š\C®%בëÉ~r€Ü@n$ÉMäOä9Ln&·[ÉmäÏävr¹“„Èr”#w‘»É=ä^rœÜGî'!Àxðy˜œ ¿’GÉcäqòy’'_/ÉWäkò ùù–|G¾'?ÓäGòù™üBÎ_ÉY2LF(¢˜J)£*¥QTFåTÁýϦ1TM54–ÆÑxª¥ TG¹?¤J¦)4•¦ÑtšAõÔ@ÔDÍ4“f¡ýtͦ94—æQ ͧ´Q+µQ;uÐbê¤.ZBK©›–Ñr:žN iõÐJZE«i õÒZ:‰N¦ut J§Ñét­§ t&m¤M´™Î¢³éy´…ΡséOÐ…´•úè"ÚFÛ©ŸvÐÅ´“躔vÑe´›i]N{ií§t® +é*z]M/¤kèZºŽÑõtÝH7ÑÍt ÝJ/¢Ûèvºƒ^L/¡—Òt½Œ^N¯ »é•tÝK÷Ñ«Ð^z5½†^‹®¡×Ñëé~z€Þ@o¤éMôOô=Lo¦·Ð[émôÏôvz½“†èz”£wÑ»é=ô^zœÞGï§¡ÐéCôaz‚>BÿJ¥ÑÇéôIú}š>CÿFŸ¥ÏÑçé ô$}‘¾D_¦¯ÐWékôuúý;}“¾EÿAߦïÐSô]ú}Ÿþ“~@?¤Ñé'ôSúýœ~A¿¤_ѯé7ô_ô[úýžþ@OÓéOôgú =C¥gé0aˆaFeŒI˜”E1“3S2‹f1LÍ4,–űx¦e LÇYKf),•¥±t–ÁôÌÀŒÌÄÌ,“e±q,›å°\–Ç,,Ÿ°BVÄ¬ÌÆìÌÁŠ™“¹X +enVÆÊÙx6MdÌÃ*Y«f5ÌËjÙ$6™Õ±)l*›Æ¦³¬ž5°™¬‘5±f6‹Ífç±6‡ÍeóØùl>[À²Væc‹Xkg~ÖÁ³N`KØRÖÅ–±nd=l9ëe}¬Ÿ °A¶‚­d«Øl5»­akÙ:6ÄÖ³ l#ÛÄ6³-l+»ˆmcÛÙv1»„]Êv²]ì2v9»‚ífW²=l/ÛÇ®bW³kصì:v=ÛϰØì »‰ý‰b‡ÙÍìv+»ý™ÝÎî`w²;ÂŽ²cì.v7»‡ÝËŽ³ûØýì/ìö {ˆ=ÌN°GØ_Ù£ì1ö8{‚=ÉžbO³gØßسì9ö<{d/²—ØËìö*{½ÎÞ`go²·Ø?ØÛìvнËÞcï³²؇ì#ö1û„}Ê>cŸ³/Ø—ì+ö5û†ý‹}˾cß³Øiö#û‰ýÌ~agدì,f#$Á"¡&‘H¤’(‰L"—($J‰J-‰‘¨%I¬$N/ÑJ$:I¢$I’,I‘¤JÒ$é’ ‰^b%&‰Y’)É’Œ“dKr$¹’<‰E’/)JŠ$V‰ tR‡¤X┸$%QË}}îÅ’Âî®.Mw°{™¯w)xôúûz»¥•‹zýƒ~Ee/xùÚúýQ•Ë|m½Áî¨Êàâ`·iT¥—÷WV·zÛ–utùW*ªÛƒý¾¶6w¿´¦Í±Áê úú¥^Áå°z#Ñ¢¼"V¯ˆu ;`µÕ+'bUMj .[æ(&EÒ*'Æa“ùz¥uý®v¿´NÈ¥n4—:1—:!å”1اŽÁ.dïpI§ñeSM&Æ—AŒRŦzé >žt¤šñ;TÅNi=OMt}çÔdïÀ².ß@T½@²¾¯Ë××) i-Wãïp9]Ò&¡Ê›Æß4&žªy,½Í<"eóò`¿Ÿ?¤%àqÙY3W[³„ÚšÅÓ'™Åµtô¬s¨œ%VÛ,¡Ú¤ç ž·¸×7èWž7J…ü¼ö€¿×ßè“ÎçŒJçòÉsGÛƒ§£ª„z»KÁøºú¥>¡Ñ|£ çs÷‰¬áó ¥oÃpm£ ×.°X»Àp~Áå°úG³ö‹Xýç0œS¹xL.Ëp‹G®s ÃurUª0ÀçQD.[2åÒßsY‰j)ô6w—¯»=Ð&íX®klve¹jÖű\·ÐÝ›t‰®ìöõûú{ƒ=~‘ý¬Ò À~Ás6(²_p ûõŠ–€·÷÷ìW"í oL¹úƲ_ÿXÚûÇÐîr°~®¾„úXn€g¹s(ëp@d¹U+®Z1†åVDXn•¸j Ë] °Ü粜Ým§þîÅŠÅþÞeP鋺šHÝ2s€4w’6ø-%mý¤£ƒvtÀt‘Ž~°ÀgX‹HG'X¤c)XKIÇX"é v/î“òÏ€`uÉ8 p÷ÉÃ@ uqdÔVYBÜE‚Õ)XKI_î"ýý¤ÿÎe·–ÔÊ}}=Ð…ƒ½òE¨-µG êˆ@‹#Pg D %hiêŠ@Ë"Pw F ž´<õF ¾Ô"Ð`ZVF Uè‚0¤ðE §FÀ?ßöa§ì/»•ÀáÝ~Þî_Á»åýÐÕ8HÖè€À §/°’ÓLÙÍC~NZò‘º"‡9ØÕÞ׿ªË¯ìrÃÑ|.a—ŠËiÔ¹EÒ@Ž‘4|®Ÿs$—{ÄÁQ.({Ô­wpG\<îH"wÄÁátw tJ†…Ò…]<£  ’(ˆ¤á)ˆ¸x "‰8 ‘Õ+E»J´«c{|½ "ýÂãxŸÞ±e"—ЉKÅÄ¥c‡³“8ìÃãˆô¡h^†Eø«=ØÕå­iN”œ“«ÍY+ãx­3ÐÛ.ç˜úÄ §h»D»D´KEÛ-Ú•r@Á×M§Š¯dîSrÕ*Â*¾&EÇÞ`¸¬ :}]‚>o!@}\C,ð»÷Æðxî>>~G £¿“ÏC}BÞ¢Cɵ¯ó±¹^ÒÉS$€} ÎW H`‚0©|$Ñ!p@Ø%´ŒÃËÛv«X1vÞ¶:jª£a`è .´ùººƒýJÿòÀ ¯‹;†/oÙ;õ/¸0B¸ƒ­}þ6î¼°\L²A„@¼KWù»9ÍÂß×6Ð[2Ü›4Ü)æ."=¯-Rx×–¾ÞU•vц¡7Ðë“öøû T.XêÞž€¯3ªŽÓ|í~Â+Ûº|Ë@Þ‹¥­‰T0?wàßß=Ð ±`àìõCp¤?€ 徎@Àe³—‚(ï}¢ßß.]èæ†@(j°»=£Ô- XâN¶•:‹Ëiã-‡Cìñw/ÅÞÏ|µµµÕ-6—¢#°xr†qŸÇeµBO­bq­Ñ.m§h»D»D´ÃéÜ¢-v@k•ò·ÚƒÃf—TrC²d'¯Õ‘¡ZV#ã’fN7TsZƒ¤Š«,Öí£¬ƒªÚ߀V”ׄ‡uÕä1ʃt:¯;HëyÕAÁç×·Ì×Õ¥à3åAõhμ;:œ½‘§AyB§†åI<¤Cã1 ygìX2y¥@«  pmb³Zm|[‹k¬ŸÒäCöH¨Ó.ÄwÛ#a¶4êçbY­"vW$¤XL/tÅâêÑÔN1$’¿}4•H¥WÌÝZ ‰ÄvÙÄô•¢]-Ø•Úí‘ò8"~1Ue„vÇ(äˆ@ÅH¤²²2â#–¤Ò+ØU£¸K"´‰t{Å8µ£yDèw¸Åô‘°â¦b‘Ê*1¯ªHªâÑØj‹#Ô;#P¤.‹Ã->Šc ×­XÌÉUñ ·AiÄ'’Î9Ê‘‘‘zpF(sŠR©G×([$‡Ql£yEZÑ%¶EM„‡\‘<]£u¡7ÌîHM¹"¸J"¹—ˆu)È­HX˜ûź¨×~©Û¡C@¼*ÄÀ°¤åRŠåuæ©‹’p)aˆóŽðw‰+B½Èî*Ñ®ù.Rú’H™KF)SUFÊ\)ii$ei„‹JE:+«">:KÃtÚlbMVÖŠ­(Ö™Wt׎æi‘R±ÎªFÃ"T–†y?'RKîµîµ£²g´%Ý*Ýa*KGyÞ= Eê(Òð@öäˆ@Å(R~ëh«„)®ŠøDø-BÍ],[åë–„n‰î›Ü!g ±¥â0ìpÚem«zùñ„yme æ¬ tÉ$ ’W¿/ÊÛӃͅê…ÀæN€XŒ’©¾žŸtšoÙ¢v™>@f –@T=UE7iÐÆÎ ¤)°x™6û¢f ¨hCg€Vƒiè (ø\ûƒÝA^É²Õ £3ØnÑ®í*Ñ®íÑöŠv­`—ŠéKÅô¥búR1}©˜¾TL_*¦/ÓW‰é«ÄôUbú*1}UµJ¬‘1DÛÄD61‘MLdÙÄLmb¦Õbüj· jt "»`ÙEDv‘]DdÙEêí"õn1½[LïÓ»Åôn1½[LïÓ»ÅôÕbüj1~uµœkhžB…W/„`‡˜CÌÎ!&wˆÉbv1;‡˜CÌ®FL_#¦¯Ó×T©D&S7Åbäb1r±¹X̬X̬X̬VŒ_+Æ÷V«fi9µè8·DN1²SDê‘9Eн"Ro©H„·JQ¿Ì¿xl[ºÄ¨.1ªKŒêQ»Dz]b.±r\bV•búJ1}¥˜¾RL_)¦¯ÓWŠé+ÅôµbüZ1~mµÄÇwñE\_Ìwñv¾‹ûÅ.~׏À~¾‹¸.¾”ïâ]Bï +QA¡ihogPÚÇun›„·h?ôñ±÷@ÿnNI«q®d•þ¯ö¾>ªâúÿܹwò~‡MB’›ðÌ“whK ÉPÊC«mÕ%Ù$[’ݸ»!†¶ÖŸm­oñ­¨ÔZÚRkmKm‹ViKÕZ‹Ö”ªõˆ/|±ÿïœ;»{w“Hýÿþý|rovî¹sgΜל937³ËÈë ¨Oâ'õ©î'` š¸Ö©Î­îë"÷ÓÕuªºNS×)ê:C]gªÎ­êÍRxf©r³TýYªþ,…w–ª?KÕŸ§êÏSõç©ú󦎒×ö–y Á#Ng)nŸ?äéòxÝÊÀ#~AIgžrÅó"®XÝ·¨ç®Èp«ò›T~³ºoŽÄ J*M‘ñ²%¥ÍëîêyW«–]ª†«9iMÀÝÚÙŸ&_ά¶^G8–tú>‡ŸÓ•œöÊÔhóû:ÒÛü¡Už._«¿{U ¯G3Äa%CüÖCB~ÿj÷*¿U"©‘§üIó¬K“ui¶..ëÒb]æ[—Öe¡u9Áºœh]Y—“¬Ëbë²Äº,µ._².ˬËrë²Âº¬´.'[—S¬Ë—­Ë©Öå4kµ¢Ñ]XIk숮¬d7¶Æ/­d6¶Ù×VÒCÑÅ•4ëõ²µºÂřØëfkIE½sV7þØ2Ir£KeºlÔ4Åàì¦jÒšZ£ :M­¶µš¬Ø[k«ds¬dšõþšaD˜V¦½M—M®D ¸â%à²!vÅ$åŠ' ÝegÛec;m¾Ãù‰Ρ̱¿3·™ßHö‚„ê)òº…h¡¿…6þ&ò·0ž¿…6 /´ñ·0¿…vþÚøË>!¡…œùÈ8Ñ®»´E1Rs%–M[dÓù"{½ùö^•áw ¼ØÆøb3‹cxr hqEKl8–Ø„·$QxKâ…·ÄÖÞ’˜ðrãþqÀÙ’nûâaŒþlÛ¿XÝd‰ÕMÒ–ÙˆZfcfÙf–Å1³ÜfoËím¹ Ñòˆ–Û嬠›±ÚÙ¶ÿQ°*¯ˆSÖŠ¨e®´ñ±Ò&Ü•‰Â]/Ü•6á®´ùž•Qß“»r œWÚít¥½žb£ã§$ÒqJ<§Úêj«wjb½Sãëf«wZLpY§Å÷¬ÔrT²T¿Ð2ø+€½k±ÞMXm¸»{< Û×fÕU"wwñ’}½KE.I¸T$áR‘„KE.I¸T$áR‘„KM»\jÚåRÓ.—šv¹Ô´Ë¥¦].5ír©i—KÍ\j®àRs×<Õ¾š*¸æ©öÕ”Á5Oµ¯ \jÂ¥ \jÂ5Oµ¯b —Š5\*Öp©˜Á¥b— Î]*8w©àÜÕ¤ÚWAº«Iµ¯Ö&\Mª}µ$àRK®&Õ¾ŠY\*†q©Å¥bj—Š©]ͪ}»šUûͪ}½»šUûjMÀ¥Ö\jMÀÕ¬ÚoVí«É¥b&W³j_±.ĺTpëRÁ®Ë¥ÚWa¹KÇ.—j_Íð]j†ïR3|—KµïRí»Tû*s©˜ÎÕ¢ÚoQí«HÔÕ¢ÚS°«Eµ§–)\-êuTcï¤È×´š1éÚ­¦°²2'35 ¦¥jù™™iZMôÈÏO—‰œ_ˆZ‘#''“lyhÑ#+䥦jø‹²l g§™0¹º¦t¬sREqEÙÄŠÜÉfEnEEvM¶3Bä¨ÈË«–GMq©:Šœò˜4ÑŒ¥eeZ™æ”?ùTW‘= d†²+ª+r*¢‡dC"ÉÏÏÏ=¾87'3«lLQF¥³ÌÕ™•N³*;­ £ÀYX^XXå,˜læ”æ§ešé©¥fºYZz|Ññ¥ÅµfAavј1EæèÒÒL-#ý±š–žš©É”¥˜®¥«ç ‚2ssÓÒró!´ÔTQh Gš¬!‹fXLãï|×2ÒSSí2F¹ 9Z^ô–^«4‘•§¥¥§gDž'Z¹U_ב_¤¥¥&–Ñj´£<Ž;.mLFFÆ8 3Ry99šæÌD¶¦åBu–EÔçHcÉKË­åj¹(ª?V_–Y«iU&Œ‘j›(1@'N„aà`{(.,+Ë­˜\]=ÑéÌÍu: 22JÒÓó+*ÒËŠµŠ gern…YœQ>測¼¼üI“*ò`ÐÇ‘ÂÈÐÆçTfd£ñÜjS«/v‚huLVÚ³HÓbúK‘ÇZ™2ûQ8Â主Zãq*ÈOÎ-É/qæ—8óó&VN4§–kyÕ%©ÕC%G:òÓaÔùy8óùƒcbì(xTqLLOŸ˜Í}?Öÿc®@˩ʷxÊ™Z©eæ.td—VÌ­È,uf9‹k3œ9Ñ£¸¾bt¥V®eª#}´< kÑ 5îÏYY…ò¨eF:jNN,-³r¹dVäÈ–´ÃŽ2d7.ªÏ«ÕLüSVš•°2û™=+´ŠªüÈ™æ”'ÿ›cçG[ĦÔ%‡}xLÊG”CºÚç¨v§o¬$Ÿfk·gÚéÖ5£ÓºfpM"Êù&®ÉDyçãZJTpj¡ÄèëÉH+FÁçé\”[EçhßÖ.×Öiß×îÒ~£½­…E‰8U¬[ăâ/â½UOÑsõ±ú½W_«Ÿ£_¤_¢_ß®?®ÿSZߥ?«ïÖg­Æj£×¸Ê¸ÙøñSãWÆ=ÆÇO/ÿ1öo–]Pö^yAyi¹«ü¤òSÊO-ÿJù×Ê¿U¾¹|[ùßËw–ï/«ü°™f–™•æ³ÎœjÎ6ç˜Ífy™y»ùcóŽ GE^EaEeÅ„Šš ù+ÈI•Y•¹•Å•e•ÇWº*Tº+=c³ÇüOÇ?<þÑñ/~þ0¯&m`7h?oiï 'óø;ñxÜ¡“Çóx>x¼Lÿþ˜þ¤G2V_7ÆƵÆc“q§q·ñã1ð¸ÃxÞxÙØg,;·lC9•;ËÍòåKg”Ÿ[~wùåÿ,¦ü`ù;¦0³á•ƃÇ)fƒùyæ1dn0dþ4ŽÇåŠÇœÊ"ð8‘y<³²yܤx$Å#iY´LÜ.®;ü¨2—«#¼˜HZv‚¶PkÏÒ&„ËäÖaºùOñnßíá¿Ò¢ÒBZ@ CmÔýh}bÎÞ| ñÉÞ›µ73î ¬ôù: ÞÓ±çÕ=Oàºwy¾'kOúžWw¿¿ûG»_%zîÁç¶=w¯Ìn>—?ׇôôgÿ¸ëÛ»úv%íZ±k‘˜Ë}^»%Ö†¾L_¡Ÿ®àÓ­íéW9= Ÿ6ý¢xºõ' ½uÆÕÆÐàÆfhp«ñ°ñ‘ñˆ±º|Âøô¹Û±ým Q’°ê%¥&µ$Ý™ôpÒÞ¤}DÉÙø”%ÏNžc=Mžm¥É¾ä5Éq;K“}êznòyHÏcø;ñ4%¯•©¨×Þ£´Ú³ÚµÚë"Yî¶Ní·ÚQ¥íbû##»#µ3x—ÞVí÷Ú´·Ez¸Aôêdx‰Jå]m”IY” _’;è~ÁÄDí°¶Md‰/ÐEt1]B—Òet9]AWÒ:ºŠ÷â]K×ÑõtÝH7Ñz¹k‘n¥ ô}º~1IögPH{AÛ£=¥íÇ‹Ñâ‹¢X›!2´ÇE<Êíiíwr¦ø¼~…È)Â¥õj3E¦¶^»A»Y{‡Êà¥äÞ?“ÆÒDª¢)TÏûlçQ#5ÁÛÕÑ :•¾L§ÑWé+Ú½t&è, Rˆ¾MßÓrè‡t;m¤ÓhÝ ÿ-ý†~G[è!zþBkÙ´“öÐnø½½ô‚v½LïÑ!zŸ>Ð’I¥Ðxô‰Jú M ŸÑ$º‹&Ó/¨š6ÓñôKª¡_S-ÝM³è>šA÷ÒLú=úÊý4î¡ÏÑèóôGšCÛè ô'ú"ý™æÒ䢿¢Gm§z}ëQšOÓò´‰t=F'Òãôw:‰þA‹éIZBÿ¤/ÑZFOÑrzšN¦gh%í¢gé»Z&A/Ñ×èßt:½oý µÒ«ä¡×©^£ÚOt€VÓ›ä¥7¨‹Þ¢nz›zè]ꥩ }D}t˜Î¦0­Õ4ú–fÐÿh£è<ú?Z*] ¥ÓùÕŽ£Ù´•ÆÑOé8ú9¹é?ôu:(ñ‰9¼£±E4‰…b®˜oTÇË}MzQ§ÏÖOÒ¿ª÷èÿGí¨wÑ-Õ;á_¯? ?§0üýgÖî3ýfxäõ7ôÃF–8Kôˆ;E—ø©Ø¤v!ʇ?ßß—‰Ÿ‹µ/Rî‰ Š5¼ò›jïcdçãEâRÞí(÷:Ú÷9Ê]Ž¿T;åîÅûÄ6Þ«ø°ÚŸÙ(÷&ʉr?¢}/¢Ü‰x¯¸Gì¿IØxHücÏÓâ=ñ}ñ¾¸M|ß}XüP„ÅFD·ø­‰ûEŸø³8G<"¾-þ&ÎÛÅùâ ñ=ñ/q±Ø).»ÄUb¸Vì׉‹;Ä»¢WlâWâñšX+?‰ËÅ3â ñ,}SÓéšÀˆïøoØGEçjÉö½TúFý‡ú&Þ_ø#Þ_˜¸ s«~¿¾÷þAÿ‹þþ7ÞEø0ï"LÜqù¼¾G‘÷ ¾À;÷Y¾¥¿©âý‚oè0†ƒw ¹?Pï2r£wæÉý€öXÞ˾¶ý ¬{7ìû ,5 [Í6²ìŠŸ°s4q¿cÂÞÐĽ‡ösÆï²ŒîCU{?oÔÛvPÊݨ¼×Ôh0f_à“¯ê¯è/éû#;Mϳ9¼2ÕHÑß×ß3’ŒŒèþÒv£Ñ˜kÌ4Fãy*ï&5fÓáõ«Dµ¨á]Ø“E¶Ü/."IèÂÐöñ^ðTDboò¾ò­ùÚ7xWþ…Ú÷ä¾{ím–Ü¡?`g>ïÄ—{ðµ¼{ý5Þ½þª±@{‰wà¶ûþzím‹HÑÐvhÿÒþ©=©=ªÝ§ý]+áoYß±P£MÅ`Ÿjý²KÛ¿ÚƒDúøCûïË9b‹1¸cîW0ÂÞŽÑu#FÖclýÆÕßòÈú ÆVŒ¬Wwcd}ž^ÀÈz£*ÆTQ€ñÑâ€T "€b1F|^|Q»£û™ÚCˆä7ìÒ¯ÐþÝüU¿‘ßPñ7ŒÞ/kï šxÚګݯ=,¿I@{SÔ#F¨ÀèQí –$­J»G{ ã÷yâ8í%ù½R£°®áÐöi×!¦˜ŠÈbâ +Ž˜Ç1!–ÑC€þ†n®X Æ8—˜q®‘-!{ÄŽÝèÛÿ;–@uˆø¾‡È.éS°„ÜKøïô ™#ò–òð}d=¸%X_À±ù}:T¯õIK0j-KÀ¬à‹1K€žÇHKÀ($KÇkoG,g i˜äèy–%`v°TŒÆ˜ü´HѨ%8Ô|BÎ&²Ä•˜3ȹÃôlíqÌ*òµûõˆ%`nQ„Hgv¢%ðŃXÅšk¼å0Ï7Öó|ãFÌ;.Æ|cšqÜ çˆÓ®áùÆ%˜i\‹Ç ˜—ÈÇkú#QBÄŽyfç0w³<Âb¿væs¿‰xqPzÌë~Š9Ô1ƒº 3¨_`õ–Ø4Ð#`æws¿¿b¶ïöa6ø4æƒïéfŒ÷`fvL3;Œ1#–äúI=MPcÃÏèxŒ ¿ä•”ßðJC Ɔ_ó ÊLŒ ¿Ž r …ÇjHè~þÄë' ¤%Ðv:QŽ ôTtåD®¢È“åÒèiZiv‘ü&¼éŒÄ±^âu”6/Òk¼žâ•c½Ák*¥¼ŠÒ(WF¨_Ž â!Œ gÙVQ¾­%Ñãt-ÓÒé bÞÈšúÈšúÈšúÈšúÈšúÈšúÈšúÈšúÈšúÈšúÈš:¯©«9ŽèBêÑd|ü,ÆÔÂðåHáH‹.áôÖðf¤8½MæˆzÀɤ‡×cüÕÃ¥4JÛÏ餙ÀBêÄÓLà‘iI¸ém¨•‰º;ùh.Ä8­>D¹Ú~N ÍgòQ·iÃ%œÊº…¨ÕŒ4 é¢ð,¤—pz§ëP²®gø&N×sz §#RPÛ‰ô§opzP¦¢ œ ê|¤É Ü‰¶.D*Ûr¢•f¤ëPÒÉ­8ъ̹…áÛ§““yq2/N`ÞŒô LsÓ_lÿBz§ë8½žÓ›8½…ÓÛd :Q tÊô p]lHm'b‰­Ødz$_Â(6 ß:KèF~z §·Êà œ2}ƒs$ï%ÀÙ‰¨ç`¾ Ødz§Wrz=§7Ê”¥wKïV¦ðV¦pþ ðf¤›Ë¾‹gÔr¥ÎZïtû:¼mÀßí#½µ?ÐEùÏj*îr‡|ˆŒrÙBÓ­€”SÛK… å’æøi‡w«9¼LS³½¬ðøÏ9Œ'ŸÆÑìZiÒŒeKN2iñŠe'š4ïä…+LŒþ„لΑ$1l¨¨’< Ž¿×î%­ö|4Ó*N§{WiVÐëk§9òû%ëQ” -º>¡ñ’iª•X”+¹‡xq¢°fZ„(Q~׳f\d]˱®ã.S¸êÔu-c¼ºj‡¬«¾ÍºNdmø‘¿ùg#ÿäïF~ òßE~-ò7!®78<üüY£ñ¯Ð.Dþç¿ù È¿ ù³‘_ƒüÉÈï@>êëw2öÚ"ä›àÂûÎYX€ïÒ0wÐøÇnkpA"|ox5æ>‚~®–¿5þ½u¥/i˜ÿˆðG†³ M»ÒÚµ˜khÒ÷¢Òp ŸP‰¹Ðeè?·`Žó“È÷ÝâÙÇÉênÌ@ÄÿOŒ/Ò>z‡cn‘©jeÚŒ/3 åm1x:àø3ì5*Kñ/Ü/ŒÉP{ ÷àƒ>ÄýL”¿÷cc²Ô»q¿÷çáþ$Ü»p?÷m¸Ÿ ÙOMv`ÎÃß~gÇd®½„ûI6Y#hƒmDd,„÷¸¿ ÷óTý´3÷óq_èXÁtÖXø˜¾ о‰ _…ÂW©è=QÑ»HáoRø›èTƒN‰ä:…¥S:¢^:ÒÉÒ#âü{ ¡yðt‚„£íÈ^.ý©\ «Ägò°qS¸×Y¸i+¸¤ Ù·$ŨÍí‘Þ,o{ÁoÑ'ÓáQ‹ùX׸_qvZ†{ðYk{v>ásõ@ŒNµ–$Ÿ9oovÞÁŸËwÄÊGðFÊ«r\f¸‡sóÐ÷Îû†WgÐ2ýwhÎùاŒï¡OOÎÇŠ'¼þHtÊ«s·õ¬-~þP¬\4ÿ•„gÕç•ODgét¾_4ÊÚàq6¸Ê϶Á-6xűѕx™péókú¼ . Ë^æ¼ÿ}ûü´ÊÍQt >×âs›åïŠ6©|å{жÚÊ>dÉ_ÊOþ#Qž»‡ÁÛÞ!ò_ûìü\Ñ[ ÷‡·[ûQš6‹Ç%ÜW™žâCäW}†ãÛÇô÷¡èL´•(s›ŽBß)Ïø,³è“0_¿ŠO»­L`øãfñ7âŒUGæáð¡!é<èû¡|`ñº!ò7ØàMÃál(º8îì´ÇŸÅ¿ü,|øpúÈQö£{î·ÅûyÎ{$æË‹ÿ¡òvá³7VÞ^·øÀ'öG˜‡„w’?kðkDöƒâš5\Ì1 ¿u^ð>žUR/÷’Év^(Ïæ!òO&]‡,;ÈÓŽ/®Í%Þ—LêÙ`ùÃ8¯Ü³É!él.™·–Ì;¢}–*›j¤t~‚~Ó9üzQ~vÆów¤²ÃÅ=Σåës=a„ÎO‘ÎÍqÿŸ÷³#þˆý?@Jø÷Ëɤ ª¤±Ÿè—DçÐi.5Ò<þ/£ÿíÍÓé :“ÜÔJmä¡vê ÎØïq’ü‘ßÝŒü¾&ûÝÌÈ/bÒytÿOÊmô*½F¯Ó>ë·Q5‡õÛ¦ZŠñ/œO;gŒçŒ=Æ Æ¿—Œÿ¯¯û7Œ7·w÷ŒŒºÃáHv¤8ÒŽ,ǤÈûgàBçé¯û9pêtî’q: ñQ¸KÁ™ ɧâ. g 4Ž» œiÐD&î²pf@#Ù¸Ëá_zÌÅ™ íäã®g.´THyÐÔhùæg4V„¼œ£¡9¹ž)u%×r«AI ôd@S $W{瀩™QÐÍBÐpÎTÖI´² 4,‡&2¡ 7Zo…äs ûÕh· σÌ×¢Ýo@Â…ñyhñ&œNHùVP±g1¤}hy•ö‘òvP1¤‚A²& Ò~ éNc'ÒgŒg>g<‡t±é Æ HÿmüéKÆKHÿcü髯«H_7^GºßØOhç ¤oo"}Ûx黯»Hß3ÞCúñÒŒÈÍé”í9&;’‘¦8R¦9Òf82â$©ÕI4š=i•£ŠJ ájÀ5Ðs tPš–º¬ u`°¬ƒ$¥ƒ/ÂKMgy9X^ItÎdºç(ºg ]Š3•.ÙFWàL§+qfÐ:œò·E¯‚&®Æ™M×àÌ¡kqæÒu8óèzœùtκg!ëc4­'ù>öfœEt ÎbÖP kh k¨”~€³Œn§Ÿ£¯ßE›ÑßMwƒ’ßÐýèù[i(ù3=J§'Ðú?hZg=‡3vÓ+ð²o•½ í¤7Ñî[ôÚ=¤i4Ž-`<[À-UK§2­PsRŠü…Vš(ÿSŽ“ÿ@“”}ì0vP²²’§§©\ÙÊ.c`Ëbž5žlÙÍnc7`Ëzž7žlÙÐ^c/`Ë’^4^lÙÓËÆË€-«zÅx°e[¯¯¶,lŸ±ð㥃Ta¼e¼…ô㤇ŒCHß7ÞGú¡ñ!ÒÃÆaªŸ2Â!J›“/< ÊgËŽ$GU²ý Ç(Ç(ÀÒ …#Õ‘ XÚ¢p¤;ÒK‹ŽLG&`i—‘íÈ<Æ1†ŠeŽ2Ç–šä˜ì˜LØ^“Ø^'°½&±½N€~ H[AÐ\ AØ:±×Ð0 –þCkÞŠ+žÌ%ÎÉ“[°,QS^³$޹+`NyЬ„¶²åË2NùdkÒRu?ޝ²°ýIæ”ãªÃž&YOÞœúæÜgÝMÕ§n>“GûFyǹd«†Õ žhÁSëÞ”w sìØd^òäu©äŸs¶hZ”—NWeæÖ¡LF9mé\~Y'9[Z§žÎelá„ëdoÅ?Wâg¹ò+g®M&Èùƒ”S07"¥SÎÓ¢¦.*9ÈV¾oÔ\®cp•/rd«®hus¡§ªW`åiÄ¿ ¬=Bur,1­§Ù2—uöyŠRš!åú(éé<úèVÜÇwôÈŸ%EO]ñx¢HWmJòeT =F¸–³D‹,ÌHekrÇâ*ékÉ+]R^Îp:H±jéJ7sYîãX’ˆõ—ºEˆ=Q^YÂÙ±+[e_…þu©.ý ý1øÎ‰Ÿ~uøqQÕ69»ãs£œå…á³¥–Y×°m}…ï·„·ã³e°·r%éÆð]8·ãzœœ=†Ÿú.‚-ü|øœØŠSx;ç]8¶¡p[k’¨3/|2ÃwîáW³XÛ8]ê·ã¼Ë*'±!'ôqí q”Ñ”£ˆm·K?µHy;ëÉÆmX­ªX9öÜð¶ÇóiÛÛÿGØóÄý>wâ¯sÿPþw-âTYŠ4”ó’@Ù¯“.Ë“>r V€’P§—’Qç‡4 õî¢ñ ÔNEýIÈÿ ¨oDÔ"CdK¦È–ZQ ,²$Ƙ̸FÉ_–ÿÿ .Pšü-pJ‰‹(C\*® Lq¥¸’²äïS¶¸F\Žn7R®¸YÜLybƒØ@ùLSüÍo*›Åf-~-~MN±EüžŠäï|S±x@<@%âQñ(‰Ç¨TþÊ7•‰¿‹¿S¹xR±Oþ—DÊ\éÉRÞOÝõÙþOÛ;ÐKÃwqÞ9ƒø§-Ê·¨7ªáŸÙ×"yŸ¬ý#=]¥j½¦ôãÞôFž¤Ìv âYÐÛׇç ç­±zþõeíyÊo<Ò»€X‹Çâ7à¡Ö¤?¼cp"ŸHy%ëíCËw8~WZ²¢õƒIÁò™ñãPD>V½2“°aí:úLúÂÆáÛj”æíÑ÷xÑñõHö3²µÃƒï‡ÃÛå'ÚCEb'Uç¨ý*kŠëøÅþ®u8oâŽQRÛ>‹Ò,…²AûÛöDÛd nÿ¸Þ<<ÞŽ“Dði– Ÿ£"Ê€¶«HyQ\d¶(B³â[F¢Û>‰Ìg†w½A/X?˜O‰×J=ÿq>Ÿ1mÌ—*{¡5‰ŽcQOz$œ… žËêép±|o<ÄȹQÉ`‹M1Þ7r|úÛ^3¹ÓLî3Ë–ß°°ÃlÌ€B‘Ý0Sô©ú4}º>CŸ©Ïâ]0Ÿ°CHî‹ùš~º~†~¦îÖWé­¼¿¥]ïÐ;u¯þu}µÞÝsÖ€@rÌwõ‹xÛ:Þ»vbÞñ Ü Ô;0£MÒ“HÉd€“Qä7©”ŽÒ(\eÐ(p–I)à.›RÁa.¥Ë|J§”n )¦,pí¤lp^D9྘r!ʃ0ëçuH§è³ÑÊçô&´þ~M÷g»Þœzðœ¥÷£èGú]ý»”..¢pr‚›Ëi48ZGNpu-³ë¨X¿ üÉuÓzDõÕËu>¹çSòæ`®’˜ŸdæaóÂ<¤2Ýi »u%}ÉLY (;ùè€VIY†~¡~!øÿžþ=Ð-©ÌÖ/Ö/ÿ—è—€ÿKõKÁƒ¤;Ÿé.ЯЯWêWFy¸J¿ <\­_ ®Ñ¯¡æj sUª_¯_Oeú ú TΚúz}=Uè7ë7S¥¾Aß@cõÛô{hœ~¯¾ Úý³¾‹&èÏèûi¢~@?DÇéïéïçFM22ñTiL6&[ûut1eÓù?uHo1ò~•òÀr¿Ã†ü_9¹çôãØü­ý•|'a9œ `Zô“lP¾^Áðøˆ‚“¨Fß«àdºÛÈUð(2‡œBNãe§:NsDÚM£ ©§)8|©ç*8#i\ê>gÒœœÜÈwHhWç,îâÈÉÝ«`AI¹o+X§±¹(Ø g^™‚”ž7CÁI4:ož‚“é+y§*xeçmVp ÊoSpªøIÞc N£¼Â~§ÓÌÂKœ¡gþIÁ™T^ôw¹ÒoH©gT°ASЉa¹Ç ³xŠ‚eþ\†“¤ü‹ †Ì‹Ïa8™óïT°ÌßÂð(ÎEÁ2ÿ†S¤~K&(ú-[¬`”/ëQ0ô[öM£nÙ ý–T0ô[žª`è·|–‚¡ßò} †~ÍLC¿f¤]èwü¹ †~ÇoT0ô;!_ÁÐo•…SÎß3«Ö(2©:ŸaùÿùùUw+Ø YU3œŽüìj¡`ƒ¦Uç2œ)÷æT·(Ø ªj‹÷l‰¿z­‚¿úB†ó8‹‚eþC çKYU¿¯`ȧ&‰áY¾f†‚Q¾¦™áBÎ_£`™oÑ_$ñÔÜ­`‰Ç’s —?¨`”¯µl£T–¯¢`”¯Ãp9çû,ó-^ÆI<µ›,ñü–áÉœÿŠ‚eþ!†«%žºÉ ž:æeË¿®]Á(_b˜ùªÛ¨`™/÷&jéVù,óßb˜õR?AÁÐKý jâ7®ý /¿‹ ‘Éïg!­VÐTªŠæ6ð÷l5àŒåÊ|“8ä[Ý.Z…4|25©i/µÒjê&7Éw¾><•»Üi>Õðµ §i£$Èw\%ž5HÛ¸ä <õðÚ—õ¢¬›k÷#ObmWm\Þä6c-ZÝxâ•]œãu!À‘ò™ÄhR;žIzJŒ’ Yªy!EÅ ´ÚÃï²e;¦ZâjeJ‚Š 7·«eaìaÎBL·ŽMвêÖ*ª½J†AÔ[…ÔËòr³„%UJ=Q)ûPâwÓ´ˆ[ð3…=L·ÌY…ò‹,1Ô¬ÕULa/Jù‹IË‘˜Ò ׬ç23ø{¦ÓÀóX’g?céen%NÉq7sÓÏ_Ê…жŸejÒO¢¶7CÙ©e…'±ä¥lƒ,QII×îáÔÅb·¹eq6·l›[ÊfÕ–(›…Ê eûG.mÆ•—”ô°^ºl}êh±œÌ4O >ÓàIÄRý±´ßÉ–dë²ì¥ƒïCÜše-–¦¥Õv³e¬þTíùÈ–\žòÿžÈo YJ.ð´é"œ®6›’øOÔ ‡#c‹ûHϵþoE–ñr­5œ+éîÃuM‚bR¤u³ˆ1'Ò ûIKCÊÄdl>ö'1I´1ßÒj}œëSv3ä{ÒN–¨ÉoåÞeù9Ÿº¶Ûøéã~ÑŒ¹N7÷?‰hNöôÞ¨/ ðx²‡´(¯bʃ6™Ä{éDU±L•‡½……'¢¡7mle}Ì«ôt3?Sf²ýµ)H¼V[­\;À”†T»’F¿’Z+Jõ2—–µÉñãl.éc ר1ÃÍ^?&½.æÉÍÿ¥ˆzÓU²u+¯=ÚzÌ{Eì:ȳGy·ØxÓ¤F䮨ˆÔXÅ–Ù©ôdÙ©ŸmÑ^Jb”Z³?›ÏtzÐßjØ;÷°mx£rŠŒPvÛ±ú¢ÔÛê(ìWcl'·Ö7ª~,?bÓ"OåhRZ°8íæ–úø¹OYJ”ÉÞЯ¬Í¯ÚµpXÖÜÃ#¶åG‚ìï-Z«mAÖŠ}¤v³|‡ßÛ;Õˆ`Ù~—òz‘ˆÁ¢Ø¢)0,ºíTšÑñÙ§"/™‘Ø&âoâ{Y„2«OZZ‹ØK¯c½ Üí±VžÉåBŠÿލOµüLDï~œ«•õZŠ—£/[IWœ·ªX© %:Ødðÿ¾¥òhBýÙˆGj!1yÖ0Å>öa5LÝॺŒâ5JóµJ.²µ{ˆNÜׯùC«—×âÉZåCj¸n›tÛ£qJ;÷3â¥[é׫z™›eàå¾ëýƒE¨/Ú“b£—l±Ï-Ïç‹‹±b½Ã3ÊÚÊbºUdÓwÌ¢Ò–HG¼UÅøîf[5•õ[ýÝd+_£¬ÔÍ8úÙ‚ìQÚ¢1c,R´(’úwG9³¼„?ÚC‚QÛ´b:Ó†y÷ewÒ“›6éu1Ö¾8œÝÊYšYÅ}c5{QË7ô$ø¡´³ÓÆAÇEqÚ~LÉ®„’1É®R‘¾ôE­Ê¯Z¼´³ítU„mymòуõšD\ñ˜b=(fGmì Ü,“`T—}ÜãCʳû?Ñ<`éæ͈Ў<¨0¨âHà o&¿½d"žIŒg&°Tã~>&ç7Øt|’ò_íʇE4(Ÿš`w‘þ0¸ýy”DdÕÅÜ?¨ÅY#R¤GEänÙz€±XñŒåÁ­™Fû÷`t¼ó±ŽZ¹ÕákÂdªbýJr'Çgo´Iì½ëùÙã®UœÃä-&߈ #–ߣôón±hÉÑ­Æ"9DzúOµÒºä½wPê[y.±Æ6¶(‹¤}Qß/)í‰>q3OV\Ò•u`@ß­ù˜qk˜}«ÉßÓÏ¿YkÖ7̪¯F2µJ‚ Uõ 6Ì2x¼mž®Už@‡'`6z[Ww»ƒ­^ŸÇg6ί1»ºLë‡oÍ€'è ¬ñ´Õ˜+:=¦Ùæíð†Ü]]ý¦Ç×êoó´™Ýn®ˆ‚î6÷ª.éï uÉŒ6wÈm¶ûfOÀßÖÛêõu˜! XÑßãiw·z‚f—·Õã …;àáG(Øã „úMûH4ݾ¶Z ö‚Bù}>Þ6¯;àõ«@F$ÙÞUýæ"¯ÏB‹VÜ~s~÷ªUfsoß2—‡î`ÐcÖW™3ê§NŸbÎs·™ üÝ«zæ|O Ûíë¯1—úü[µæO¤ôfT³Oò¶üA{Èlòzü·,bIn™%¹eQÉ-uwá±Ï¥f!DèmmZùfcOÀÛÅšªÈÉž@í™õ5õÓ#e"Eªã±ÿØôM7äÒá †<ˆL·yä7 O΄\³háâ%+N]êª^àZ´¥°¤|æiîžö£y©Ü6O»×ç y×xLŸ§Ï\£8`bÕŸ F¥Ueöuz[;Í ××êa"ÚŸéëíöü½g[›WêµZ;Ýw+ .ý ­µ«·Í±™ž³C°nÉnÀíë`òº¼îPo@š)£rwj—ÕÙ¼¤¬ƒ½=0¦÷›&tä.iòÁ*¨æ.dÒ'Ä]+hvøax>Ë[±*,¯hº; ”nϲr[‡·Ýíî7!zèÜì€ÕùLwŸ»¿ E»Ú¤Wd‡D]~·l æà—ÊJIÂË™\xUoÈì÷÷²C†“÷÷Y%»aA`f•»uuo,¡GÙíšŒÔŒÔÆX¿Xd±ŒËT¼™XÚÓ@ÿ‘³=àïÜYì=°æ˜j"¥T!V˨Ír{¡f€}oÈ#IÒÿ/MðÿÍÕF€ªÈPe¶¸Ï6›Ö0iFýÌ)ÕÓfM3§540Ç'Á¶Úa]’ÁŒÔS•ì¤lòó@’ªnY¸?&8t"©(I;¤0ýð10n ]H’ö…àgÂô¶³®ž³z½R_fko0äïö®E£6ïmé•Já÷€o67V ht›r´‚~ªÁºÇÝCßê‘N c3É¿>iýÞyã6×À´IªíÖAWÔÄQ–µ¶åÖŠH|Õ|·–^výø«m؆_Û*âQÖµ•×7è÷èwè¿Ò§ÿb8uãʼ%yK6ò–lä-ÙÈ[²‘·d#oÉFÞ’¼%yK6ò–lä-ÙÈ[²‘·d#oÉFÞ’¼%;º¾u¬kPöu ?[ZïÑ®EëÅfuRœOZušµ/á.4¬º‘²Ö|;BËðd`¯“ˆg˜3´øǰ–…ûy„:šÚV )¿=Ê®üÖx´†Ql4sFc–1e8µãÊŸxÔë—ñ5ŽAnZ]ÔnV§nBy¿æf/é¦ÌâkøÔw­½ÂÐpêÇ×páÉZ_†'5{ùcíïÇh/ŸJûÇè#’¾~/²ËÑñ`øUãZè8™ÎNj …€*t<È÷ybåq¹“©ÆR]ò¥áÝÈÏÀçl”­PÏ*Pgµ±—nFþðÉ—¢5ëÙ54rüWú¥4^ßLsõFj6ˆ¦ê¥4^4~ ð“¸/ ´H•+”0t?6âÂýD”yu¿€:ÓñqÂŽºðìK¨7 ¶U‰ë(”Ù?"å‘cä9FŽÏæ€ß= ŸÑŸ>cD¤#ÇÈ1rŒ#ÇÈ1rŒ#ÇÈ1rü?:¢³IèÓµ+ä¯^8Ï_WŠ::[äj†0¡;Ruc7éßKÖ ¦<ä~ÒÈ èØùѱiT»ð˜¤Ý*Ÿé›ß"ùýíúÿ<âÒ endstream endobj 420 0 obj <> endobj 421 0 obj <>stream xÚ]ÔÏŠÚPð}žâvQ˜.¬Ñûý™ËPm‡±}€˜ÜØ@MBŒ ß¾992….f<’ÄóãÈõã‡×Ãâ¹êŽi?çá-]ºëP¦Åî[ÑgËÝþ˾mư|ºòÆP7m5Üï ÇtjÚlµUSŽ÷wóÿò|øp»Œé¼oë.ÛlÂòmºx‡[x˜?eËC•†¦=…‡_»Ãôþpíû?éœÚ1äÙvªTO4Y¾ç–ÏÕ×®\L·þ»ðóÖ§°žß¯h(»*]ú¢LCÑžR¶Éómؼ¼l³ÔVÿ]óû#Ǻü] Ùf[ó|z™rdŽÈÌÈOÌOÈs\2—Ès…œ˜rÍ\O9²+¢+®˜WÈkæ52 †(Ì‚¬ÌŠl̆ìÌŽLs„9ÒaŽ´EØ„½‚^a¯ WØ+èö z…½‚^a¯ WØ+èö z…½‚^92‘¹•`+¡Gf·l%ÜJ°•r+ÅVJ³Â¬4+ÌJ³Â¬4+ÌJ³Â¬4+ÌJ³Â¬4+ÌJ³Â¬ü~߯ңð ƒÑ`0 ƒÑ`0 ƒÑ`0 ƒÑ`0 ƒq7ÃnÆÝ »w3ìfÜͰ›Ñip:wsìæ4;ÌN³Ãì4;ÌN³Ãì4;ÌN³Ãì4;ÌN³Ãì4;ÌÎݦºûéÂñÃÃûq.¯Ã0ôù×c>Ë8ÅM›Þ`ú®ÇSóß_G'P endstream endobj 422 0 obj <>stream xÚ|ºp&]·6ÛvîØ¶mÛ3ÑÛv2áÄv&¶mÛ¶mM8ùç}Î{Þï?ç«úª«V÷B¯¾öµVuõÞ½)H”ÕDLí’öv. ,ŒÌ¼1{W'K €™™‘™™‘‚BÌ häbio'näähM"®æVN '/3/3 €…‡‡ûo ¦‚«³‘ùß6N73â¿2‹[:M\ì<™þ;»µ½»÷T3K;S³¿SW“†¥£+PFüßQÿÓft°³3s°€Ž ‡‰€é_P÷tþãcù—ÝÈÎÔ×ÛÁÞ`fdã ôµ4þ=½Ü€'W ¯÷ÿßó?5D€©¥‰ Àhni‡øOz;3{ óÙÿèß>7 “ó_jÔÿ¦‹ð—,S{;O€)Ð ‘IÑÞÅÒ ³wðt²4·pP›Ðüå‹›‡þ_¬1ÿ#Yþ‘¬ÿH¶$ç?’ëÉ ø§B5Og ­3@ÆÎÄÞÉÁÞéo5L€ê¿2;TÎ@'·¿ÖÿBÒÕÆFÑÈöÿþÙZÚxþ?C´€ÿ_hjéjû¿½–Î’–@SeK—¿ùÁÿe–q1²±4±3·˜ÿˤag t²±´*Û;[þ«­ ¬¬ìÿ˧naibmtvü­ó¿\@;Óÿ ùoUþüŸ&úÇ,ñ—SK;s€šËß&0r2ýá·²‘å¿{…ùÿ¤ùGgù?º‚‘‹“¥@ùoEYþþ=þûÊðßHÿÝŽÿÕŠÿ¹UTÔÞÛóï˜Øyœl<nf6ßÿÜÄÕÉ hçòO#ýÕëf–)=€&pÌÊBÆqÝ­<¶Ÿ† Èe⻸. ?3TuevãEÅÚ{Ý]¬“CñÔ o”‰ßÊ¥ Í›je;Ë$ôæˆh7S7µÒ œFEaœ.g«Ô-‚ñQ&™æÛ¹fŒ"—UíB}o±ƒ³¿ÉE嚸>¤þÀ3é'–j@Pß–4R¾*¶¥ˆµóGø¨·@Hóñ # ÒQÚ Ø¢³¢ÓUñh`Š °é¦½Ì“.ÇÃÚŽzžïÚ¨ÝyS—ϲ öJg?’l¶ÈóPá2æÒv6h30.Ð.[ýý»’YŽ˜ù—B±ÙЫ¨³2$F©uç9(&KXá +Ûs,/¦üv±0Äsþã¤ÅIÄ ¬1Ç}×%‡f¤«žgi±þ8/Òïžó|–beY×oŸÑ횺•Õ±¬¸ÇÔñ) WWþX(9ùÖ¥Þu”—ˆ…ó±D“'ƒ;î/Â߱˨ß镤/‡-6›^ÖÓçQtÌmŸ›“pÔ°¶"SqzÀÛf€¹Ž–å£lòþJtNqWÅuõ§S{Ý=’ ÈJ^Ê·t\|#Üî&²\IQ)mV¬_•õöt›e5Y£+!´Xäyñ¤Béx‘8Â#?õr4˜ÙD,Pr"Úƒ¢›Ì¥6Ö ¥04^, 6®¿Ü[±5ldñƒ3gèçJ´tÒBce©sh±¦¸Hê¿D$Å~/ú–wðH”Œßì¶Íp“ê¸è£WdÄü¢7CDà&ÙÂ-g4 Ãæóù#;×ü¢-”ŸÃ¤-ûµ"¦KúÚ×@׺ÐK­÷gÀ$>v‰hU&Õ7òƒ~¨é¬VˆÂ>ú÷º,;šH7ŽPŸÓ£|%6óàÂx?cO¢+}Ä…cé"Ü¡žxê(Ñ´LPñ®eƒñV›Û¥aÞoÙZˆ´”ó¬“gŽáÁxV Š‘ä7´GȬæÈú,±×1Ä–°=zºáN1˜a¼%´ëæ%&Xèæ±èKÔq”«¦Ò ÒÊgc¬Ü$Ýž{Ÿ”³FbR¼fÏÊß_;Cfï·¶¶…Q#KÃ)âá†|¦1»Ì›fÌÚóÓv‰J5 ƶ•çà4^Øv‚ äËð¢Úͱ­ŒâÄíF-óŸRÁ§ð9Ë™„ð…#Æ”T*ýV~C°X¦Âvf€ÕÄ,&‡-\žbΞÙøù´ÌÔ¤íi³Xßð®É“C›×LT¿ûñq§¥V§Ëí7VÍc¿û3GŠ þ£çy{s]:±éÕ-ÝÌEü»Œ«D¡tú 8­&s®LSmüƒ2aõ)7yä­Z9â$YÜ´—-Âva‚³°îˆÞO±sy®ž@ŽŽû6—ÙDT.aÆmAyáØOìRá½äœŒ}m¯h¨Ê 9\lù4|ØüÜ ©^‰%;¿¯¨HF yÏ?à‘q¯È|®f£XÃÌwO¾'÷û=aŽÓÕìé¶Bìî{Q;Ã’"ŽÞXJYߤ‡{Q”ÊÛ¾‹Ë@A†j¥)n¶¤!~Íl­çì k•Éxu¸´æ€Iõ»•¿–]Z"²ô}& RËÑ .â¶Î׸™]çlœôx¬ºu—(Å¿½ôÖ¼s!Ì% ü1§9¡H;Ú’bƒÜô¹´Å¯“•⩯oñà‘íØ”¬FÛœy»–Ñ›ôÇPjë·–­3& Ä‹“tÿ9!œX%]`’ÅBD‘0“€¨ÂArâìð"js»õÓNŽ1MèqqºÎIþ.÷–¶ÔÄq_¬æ˜Â‰â˜óí~ÃMœÿzg¦‚—Ã’X- gçÒµµà­:‘J¢¾têF·Ñ’¶‚5ƘšîÒçßyëkêó‹úØ yjˆh/ -°OIšÉ⎪’á}è(Ÿ;‘¶ê‡Õ_*V™7´ÞÅ&ÅWÄqëKÖmÌ™æ"—cRÐêë„ÃÆ±7Ü\„C=ºD ¬§ö°Î›Ÿ#}BVcÌŽ@pÑæ‚ÝÿXz"P ìÊŽÀ:ÊLphìÛsVºÑ|ôæàæ}T6Ô¾9c• Cý_@cºÒ ÀïxòlÈ.¹}®xá9öFÁA3¢°õyŒÕ¿]!î¡;4PFF3¼$^±;Föü:™ô s{ø#y}§ŠE~éwCÿªï`õ¢êgcËð“­GÚ¨£c’€ŒÇê4™\ÂòGFvìΈ‡.>¼_JRаöÅBÌ× NÖrá|pý´OG…讑øƒsjõc•œ-§1Òiã-îni=AöÒÞyè) z‘§ñƒ6‘¡º“^w8‚• ‡„O™LØF*Ö\ßÝØöÕÞ:$ËMÓOÅí+ ý‰lôÉÊÜêœ y+;Ýf΂0|(«\-‡¥æg—Å’kcºoY4AGÔXן¤jÞIvÏa4R3…±QŸ ’¿@Sû@$zÌÄ:;æî\±Äp’³®æç†§óu9J9.[ ¦ÝÂÞÍiYPŸÀŒd¥Ϙ•CÖ!Ÿtˆ´¸Ä,e›Á¶7%n[˜ [ž^ ÚM¸Ùþx•´w#QÄ­~".šŒMMoÙÕc%Št•çZþàî>ÝAýàüSªè·"ÙnoVø¸¸ØØ ò7m,FÄ ”ý 1úüëÑ×¾è0ÞEBÖ¢Áç «±5šP£ÐùÄé8s øÌ/(‡< Šë÷ÈlI²În¾ØnjOK ß‹§\³7Éãó©B¬ËMÚçÖz˜}ñ¨8bÉC)ÿôÑkìsÍ>þ Ã£‚ÌD€£öZ Ô[£ùñ`vdÙRQ–Eâ~ZÓø<ÒØÜó’[’[$Ê}r!™ýÆîa•o¾vèøñóÏ:oPïÐxý2𑉘9L·3>—?×\Mt*<Û.kï¢ ,ãK65À»ÖáÂ9µ¡XD3#,»wKFŠEG:IöîI­™­~>\-MºsnA»oû³¼î¡«á`»_¿ñpÖ§® ÷Ѻ¥OÇ&HµmѼ§ü>|ƒ\ Ø|©¹\7¦œ ÌP(¿†,µžaà,Ò…vO»ˆ(¸ ÒKÄ3¥i ÃO𥉽öûæäp*Ðî½z¤¥ï~·ÀwIرNPJ³bóÚ—Í5¹àžj2ÜCnç3Þ1Æ"ZÊFoWý>…o#‘Ðga AB¯­L‚àŽ7¨7xL˜žòmW ”|{ûIþ0ThÜP‰ÙYñ3¸ÊƒSo*–™”ߺ‘½àWT­'µI&Ì»´ãöC‘ŽW b[wÞyzUW.v{{ƒÞá ¥B¦”'Y“Ž­{ÈV“7>Ð÷—éµCÌݦ #\ur®Û=2’äPYâÂüH•?9ò[©î¸DM;à¤*7˜y»FMõ_•{ 'ý§i1¿®ΞÍáÆ â`³ƦÍ{; ïD\m×âI6ŽÆ#ä”uݧÛ<¸FûvècSÆÝ{^ì‚­ª†)²#ÖÿÇ@mkOÐâa6¹/ÕFå·'ÖÎC/8Óƒ6þÝy&„‚‰•<òþª§”&̱^Ôt”·eØ{ôRnØõǤ¥º£?Ô'7žÒœ£6€= y®W,hŽWܰ²Öë†×ú.Ÿ“i8&mÄúË¡w¾[Wº¤ËœÇ%œZËÇç+º¸‘EKI͑Ӿj~G†aEx$ª«×¾ª}"ØJ’ÂA÷BëK …òŠ"~B¨Ì§èØÑCGsí±òa—8–ã%s‡ävtâ—ôFËGfŒ[ûÂEŒİc~Q¬ù±£¤,Ùu—e›"{ÊøÞJ¹tò ©Bá΋­gí¿¶ÓJéŽî==&«¶v¨§ž£a †­‡_8kT~¿>G(è3>áò™š ÊTTàOE!C“8e£¿Ò{ Å,ÚÔ}׬ú¸õ­@ [EqÄ%”á¼ dRm‰C¦q†¡"Çö\ Tqú—:^‹z.&Ñž”0›SÔòþ&³ñt9iòãµÿïwyV?¯¿¿ äÄ¿‚‹uà^P¾•®Dó°ˆ,ÁèIO6F.¥8§)¼+̆]ùËó4KYúåê´¢·€#뙾ˆ:oà݉Òw³{  ]+Ç–Ò·"a©rV' šåoeë?ÿ@–O1½ÆM µcÕ—Àõ”œoz5ƒo„û±4›«ò«ß¹o¯FÅÖ´`¤&ÖHº„3‡eÉE(ƒ5\/®í@î}íx;GÏm Ò£“ŸÕìî|a©· «h¯ëVEG ” ¨anÃÃ=+]ãàŠ;óMœÛÕGóú$§wQsÜÈl†/Ÿ,Í©°”íÝ'¿K2’ëFgšïÉ/¶ÄWU±‘H4gß‘ëƒi´û)’Ö´ìiW@ŸÄ¯ûòάÙ86õ²€Kû‘×)c²l¬ª·íÿL™TëaEžA6“÷⪣Ö8wO‡ƒœ…Q[þg<,¾g8±[.Õ¸‡e.£)×lº\’›••o«¬8¶ u¿Ycíàp-ôOÉÅ»™©jg/=Å·gZü«æ~€3E4Wù §‘2OŠÀÞ$ZÿÏxOŽW‡tð\ã­B¦ÓbüŸÓËÎav¤«‡oÑeeø£ÏX¥s.ȃèÇ9‘Eýürßoì/ZØu×(_ñ+Fû›87#µQTX=F*M’1¢²¦ ×ô¸åm~€ày,©ßI­&`a5ÛÌÇÖgK÷.T¨$_ïŒ=ÉùΈ^WywH³}!ê 'zÒP¿†™¢ò×ù·Æc¨Ã .ùjǧ}‘ëÆìzsaGįpá€GSèÚc«Y=™½î“þ’Š"Az¯;%»ÇcÒ‘ðàê4û¡¬F$žÛ5Clš) Œ-»À#×ll_—çsÖý«Ž¢K´Ô¸]@P¬;hH>e6âûïâªD[&‰—{{¤Ë6:¦Ë÷{œ¬6Â×/­ö¬t³À-,ùOíÄÀ2+ʤ¥N"Z"Xa{× êÖg×Ðjl+Oç¹ ú°Á13œ®ir©@ä}K‘Ñx&,ÉM5Í\êèH¿ u Š¢»çw²K†jÞ}£Ìv+%Ð9¨óÎæ×yX Çð ×xÎ[]¤°cßlØ:Ÿá$$NJ\÷mÕÇw4` Ý„§M ˆ uO˜¢,†à.uÝöÈfâIË,PQÑN°ú?šŒ;fÞ³N¿q­’sƒÀ7•j;ÿ /"„÷âå%¬xOC“ ìÃ3ú.&÷Éc”æÊ…Ý,ŒxõRX£[‹Uýý«¶²îÝ…B>èh“a•–%F^lE*jׄ£òHbåeÛ¤/¨8©†½¥È4*Î&Ô(­EàâAž<™kÎF³ƒ©Kî‹zñwÌZáÈ6GÆK{¡uò+ß™¡P=y¤¹tàôâ¶hW«-…0eR~·¡Çº­´e:…åYõÆjŠþáäbVµE.´=ÒdÈòÒÝ­E\'Cãæ÷(ǯóÜ!ô!cžÛÞ‹,ú¡È˜v*Zîk]†Ù‡yƒ¬¡Ú7RõÓÔÀ’~]ýÄŠjÅ›ÒF¸n‡“¨Œ˜‚2³„2ý*'·á\AÇ£’ŒÜ"6°£p 5¬Ä+|âŽïž3žŸ==å_^ #<Öfˆ0zßà{®ÏH.hõ¤?|Ñï–rOiAúÕ|JÿšIõñ*ì5Üœ(I·üèœeYð†ArDùœÇpÙvŤA »1¤Û#å#ò«×¸~Yk*ßTv‹9Òa²WÄfl.ÄWQ ¬ŸE°^𒦯­Î,hA­±Ìœå™`¿Ê¯‡ (û¤Á± ‹‘êfù=Ê´¶›H½ÌMJvc*)³ðŠzIh]Hˆb{ôï¹ÜøQr ;-(ø,¦ò9DNklÔ¯¦Ið¨å ð`ÔZ"šIê,‰¤° Söhœ¦€-ÔTõJ~ŠîŽLîŠP6MŽ#ÂküsZt·b6Ä—C?ÛMO«LÁ@ìÜ“©µÁ¸'ŽIÀÄ`eøAè°âºU³9à¤4¼©åC£>Ž'ùÕpÜ•ß8}ø®Ÿˆ‰"È™ÀÉöÉ”|‘†ì‘Ö3pÌP ÅBœyœ„Ìÿ[È Õ³¿·Ñ»õ©OtL …È™çhÄ=±'œîôcC*s!á]¦’‹ÜÁ°‹>>ˆ¬âu3ŒÓ}eãrÓ…ì ¢»BÑïUŠšDô>Tm§“Gd X‡ôìY9á²ê[^Ë .ÀßDŸDF?å.|A±°'–ýŒW êËKB#„¿®´$< ^å*×)uèi¢˜[S9§^+!ÖZº3U¯ƒ»ð« Kˆag-/‡:гoÎL+œÉd”ç-áŽNB#l@£ÆÔÍK„ÎìØ| ˜G*È! 1_ârˆZË…Å[|)%—¬d}9\Áiä•×&xâh6§ÌŒïš®©+Þ¼«^'T¦VL½ÑÁ7!®vŒ´'‹¦Ë¬û¿›Ë×ÜU-cý}Ó¢šâ—Ķ*y"zÆtrO˜œã̹%´Õ’0*–¨^›[&І P¬ZÔÚÜÚõ0œš¼™hë)¡y¿Èúl® _MÊêªZùÛèmÆž ¸KÖoMøÃmëi<ódDµdh}[VŸÂ”NAÓ.3$S”ßÖ6¸{hµjV¿Cnß´ˆ!ª9ÄÊ’r¦øÓúˆ=’èdØR¶{B¬»ß(aÃJgá¡ßžlÁ8®d´lÏäOÚxrôcA˜¸`×ãòeÔZ;:Á†ä]2WÑ÷P¿ CºÎƒD«‰Ü¨ùžßG·+ aÚzʃ“æŠZ…ò6ýÝڳçiBY~ b÷ß¹ÇV)4/'V,LˆºO*˃ñ†èàÚ5¤#³³Y¾ç$ChM £u åO-S±ÑnöÚ¤ f ÉíÈz=òt²’h/Ý¿V­Ëè[–æÎˆy1{è4Çjœ^ÌF@–ù¯Bž_îõŠœö‰÷“ëbH¸ÛöŠI:Bœí.ÖØ‚Õh*ìF“ùÔ3 `O /§%T¿Wy¡NWߌ§P¿lÌ~“- ”Nåf‚.à­ö ªÏÂÁH*Þ%–w«1¬?8ö÷…ö‘giB ˸PlýÜÉÿI®¿Æ0^h ¬Ï†5rB¢—ÕäúÚÐPcð¹Oá' õPƃiO±ú‹†j­ CžÙòö@ÍÈöŠýrS’«¼ÝŽË¢*ôª$xåÒ+Ö+&êÜp„l$ÝåÌYP¿#)‰~¬¹D®ù}[D«Õ˜gx¨ûçŽÍmgX v»EY`m*”Œ¦†(XˆÅà× ¶ÄâëÚ²¹…Zc½êpdwã,E4DV¾ÐœÄ]TLNRVü^€.«êqé&„P‘@¤W^ÚǹqÚæ&xY+ e­©·ºñ‹IÞ’8'’ øJß=ƒ«{¡xeîK³þY¥Ž¬ü†Ù¾¯5°Ô¥șn#ð4ù uÊÖ¶=kð§[¡NéuŒ…} Óü ˜§7·=½ÕŽâ8 µl~–àcaÃ…Ž¾Ê(…ê(¦ÇËa‘WúšÙA± +ð‡\PÀ áÊVÇÕ±ž)ý/apÿM—Šc -> `Ç}BìHòwù( îTY «û  ³1»‹ÂñŠÌFve8m–¼y°xrêçà#Núihªs¦v+‡ÙwhýaQMAvtƒ†BÂ¥|Ä£Š7é—Gﳉ1ãÃ=ùÚ•ŠàÙ¨ÔõS¯¥êF‘Ý.qÂûéÿ¬´@ßsm™—ê!<…Ú ݪ; ð« %®“zt4$˜WXÀºm5Æc-³GeFMeþͧ„/q^Ÿ &¤‚ßh„ï^ÿ4b6{u#z OÃ[)†"&¦¼ ÍÃ"  Aߦ}Ú“@ß?Ô+žÄøuñsá'›í!üísªQåÓŸÌÛðó{çY!RkÐ0V^¦³È"%ÉÔ³ö2в/oˆb;Þgê±fÁË÷H¥¸5¸Á“ÛÔÁMÀÕCºïOK,ꈼl3ìïI0žs}óÌ3”ÕaW`˜·î&øÌÂ,³ðòö’Ήd0ù+§uF 9³iš€b-ïn)ù° «ŠJÛ?©–©™œ\<‹Ë˜%’íËc$ƒœKQŠkæËÛ+_àØÒ|F$¸É3au¿ ëX…[TUvUt~~mØG–Ø®ë±,‚oïá=ˆ|@x=ÏÖ¬ÀÎ JnÁ¡EJí ¤B; y:îç÷úúB0ÐüæVÄç2¥Ž—Ôkj¯/´ ÷DÔ{îÀ-JD55J–VöƒÙsÈX .ÐÜ}Ðåî‘oâ®`Ø ª•…¶~ŠEPÜÒGÞ+i<°¬ ý.\˜m#sëxr%pÅþùfzô‚¬ s sùU^%îÚmc¦=Ê>ŒZ/ípæR=Èš[¾•Ô€eš¸¬¡]oK‹Þ_vðÐ…„vqÃ*[§ÓÚÏPxâªö:8éòÔ§X´Iþ½ž$W] û0v°-2Š>Š%”†š“\>ÉèLú}Sœ ñ²ãp×ÍÆ^l†$4m=–)ú<:=®'Ѽrñg?ÆìÅX; ÙØ‡Nôd«-HbÈMrbÿÔзö@{µ =)ã`©(## \ "¥Î„ŽS¤s…X)9&—ÂËÐå¬ÿˆ¤yiŽ\ðR/RkRõ³ò%TpP¢Uúq¯Ÿwâö–¸Væe”kNž ÿc#ûÖíÏl]ŸEƒ_R_ >`dàïN‡YÉÆþ+öæÉJÛF £käù¤+p~#[Ï—‚FþÝež™dM¸ž¼}gQL)ÔßL¿—΀IGÚß.Ø"÷ܤßn,~Ó¨ ò €wz˘Ä2;1­ÄW0˜Mnm¡(Ü.V½™À§‘e Ž) %€[CIf&´§èpÒj¸Ô¯ô›Äá&‹cYò†³â+-èÌ9(M3ß•mü˜üÙ;—Ç­Ãã5>Äëã¼uSqd¾îg¢ÀÃ’]”„£¢^ôÊÿ¼š8¾WrèeE°ã^^Oµr:CâË^Ísm‡‚.ªîÃ%0FCAwŠ“¸~Æ#]“ê'·´"Sž’é˜:8—“*Z:órWn I•ÄÍe1PÀY¾'Ë$*Tå 9Û®8¹‘âMÉ•±qÆà7ë0x»MÈË+RìÚתºbƒïbÍȶNHÞžéÆb¹,ÐÁ7E‚_H5ti«|{R0¦[KC—ì/È™ ;Ýë’€wð ÏÑʵoXÖÅw¨`eíœÇNq¸É%P—d[]âZZYsäg±‘)-¸eN-”¨‹ËPF7 2ÁÊgÉ‹ $Xå2×âÒ;±a' z‹‘aÓ‰#à¶ý§Ž“ƒ¨gŒÙÀîj/r+÷ð7èïS¡&© T[ùè‡0pd@^1båãáJuJݧN[ã…ÛÇv“nm “ 4I¯Q¼Ä`…|ׇ‹\ q vek•žÃ7XDPuíb=.õ&r¯R½Î½= è¸é4Bfü$‘vCVñâcBw²¯=Ú:UOÅÂO§~zî»>dtëŒ"ßUªHñm<¯œ •NæC blšÑ™Ú ­/¤*ÒeAC}»&,7I!Ÿé¨ûö¥ŒõÙì¤ HöÚsM,¨áEÅM3:pÁ¤½2 ê¼àЂ½û}¿… I¡ïg9¿BžId¥æ2õ*õ´«³¥³·–gTãÏU¸JÍÇZ•_`‡ç«}©Éøþ¼z[•¯UF½Ãyãøä”-#J‘!B0ÀxLñ¿ùÃär ÚÝ=ÄÀ9kG|m¤çfZûÒ<‰TH¥ˆ®­ï^4x…*­ S™d#`B’¦µbBí¤< ÓLð ß­Üñ èÔÎ%GW°1ùäá7N‘SÓP<ßgmèž@Üz‰Ò[b!jÕÇðIæV yÑWËÆ*™æ0­ÛÐÛÆnÛñJ?æÉG½+‚tu–™á6†ÐPCSÖmrùª¡åA./·"=>w4áýnþ÷o¿T„0I‹ØßšM“•©•ÙM‡Í-v:8ñŠ¡uv âvÒ¤ª¬ô»$¦¡J…ýe^uq‚Nìa×az‹ŽP!šž·}°Ú.üÐþÄ×ÜzøY§KÑŠ‘ád†[ÈùГTÜ!IÎÊ'cã£äâÙãÝQ¾bæ«´¥H,…:ö.W²=ݱŸ:"ìl··zç¥763").ƾß3Ü8@Gšôh&>˜FSÞÐ+Œ}Ñ"‡¶°„»Ø§£d™$Êdé¿´·!2bEõshŒÎ¼[-yMÖ÷MS w ™ÿtº\ÐEÚkÕ»%Q¬E´JÖ‹øܘ/õV‹Ò²cð¡Ø ôæJu"ŒL±óûó ¿»‚ìZÊüRFšbøñú³UùèË¡ŒÌ\èliFc‘³”ETš»'þ,õÑg Y¬TÙçÞ‰VôkN ­*âo‘Œú<î”*غcÞQŒ £é´/²©¡ü#ÛþuTcô¶ì®pÈŒTû˜*eµš{“ê^vGËuÂÎÜwwLéxŒyÔwœo!^«NååRŬ:ºî£ÈquN¤œÆ­`1s¢Ëp—eò›M¥ßò„¦¨›'úa!]ê(ç"ó…øä$ø¹Ÿßm5«çMå; ¦¢k2ñÙt»…$ý·,é2=B pA)5ÇÍrÉZ‘Uiéb°`¶˜GTø;ÔÚu˜5Ì ZÚ9uLó]™MØÊoš+Oº[h!ç˜.(÷/áÎa¿µ{ŸÿÏ¥A´ ïŒåa ÝŽCÿßss÷ Ã™jBÆ´Hª”<}ÃóP0{ÒÊŠ|(Óq0•¸è³[ÖE¾¯™qAÞr—`á2+†¨U•lbzpá°z`çÕ=löÑ1¯skWÂêt°“Gö¬½Ï?x-x±w&!ADÂòÜã£êQðãi—ç_wž„¨x‘Ì8µúÑk°Ñ*Ùí{RM¥$N0´oÐ,úRÕÑÍ Ìœ[ `ÍêÔOLäªA|ž¹ÍX¢beˆí0 > Ú Ï=²á˱æh×—}à‹C)D Ĥߑf¡Ì€P 9%îµòiÝ^H)PlzÝ)”‡–Ò—€=õ¨K‘Û‹AŸaU;ݶ(蜮¡¡<Ý' $Ä%ò–›H¦#Ì>æÚ¹ÑÍ)!l$ÕÔmP¶²ÞÓѪÙCʹ¦-‚/î|Ù]øõi¦­±ŒÞ.¹¾Xµ¤"<ñ!˜%ˆ¯¯ï&d±v¢ðØ£,ÔªNbCûëÖmS‰Ó¼ƒ.£e·—Áj$|7è|i–y) `ƒ¥ç»-‹Y5ú^_ÑìËò)±J„²éª¤{Šæ’j=¨Ch‘î‘+'y¦HßAá¾þf0’u&ìB…žéœÖG¤ ü^(3^‰§ÐÎ-±Øï{"ßL‚+²“0êCؘ-ÇÒÖïžËŠ“ l¿A}D ÞÈŽ †ëby³2Ål&2ÒáµCò•Ê3B;ýø2oÂæGÉW»p$>Dâ´%<¸ñc¢‚ºµë­ ‘Q4è@Èì ׂœk 94$Ém/##×jxWL{­q€Ÿ o³´ýùxÕêRj‘)Øä1ëÁ̽y šw¡›÷#ùªäc‹Vå7snxw’áåL=Tý:E7¢wd}`Rè“à$wNÀ1A¸j6ç…÷Æ!}N&×ÝiòÞߢ‰·6{è0ªÌýˆM!ÕöŽÞ ¢ØOLI¸¡ú®ÍñuX[G&&~¡fo¥»(¤U’y°UjãZ?k°W:®ò¶x£Î×7LxS¸˜ùuR‘gIÎÞÎvå¹9¸ºÉ­RÖyÑã»bk™{QÏ×ËÍIéZœ•NœjÞ‹—È-¬ôrR`åt.±9?‹ö8Æy³½ÂëøŠ'IPØ[LºÐkT6¤ƒûAœ¢IsKy¥.–!'[ÆÁ D”lì`5yZhÑx܇a” •„ÂÕ¯‚-ÂyåEÊWsì­cBBÏÌ-&ã_+[¾=&üXó¤uÒãÎåϪ)Ë04М3”3Y˜t&‘l_•>á S¢7Œ£•úûèP˜òqÚÌö™K‡ý´é¤mÖ»ìŠ!}TIØ¿Éu¨TÁœ3Öˆ/ï""fÚ–Y¡çõh$ ºqc8qɼ<ð'“)ýÙ/ÒÄ÷ËÛ@-¿ÃÃiPuvCIäÿ(h&>Q¤TØ£¼`ü!‰LŸdx÷¨ÏQ ®GÈ´mÿKGM58¯v¹«R%Øð·HBEÚƒ”MUîG=õËQ-bJPîa+DM›“Ö//k.΋Ow:·X’ʬ¶~y‹d’‹#;ú™ÿ#Ð6ªQ¥}jÃÝ`ÿ%ë)‰C[¶åÓ«W6òõ¾‰ÕhÐÊ%- 9áš9¶…ÁEš¶Í0c_FÆB-ð ÄíÑkéÚÎã“9ƒ%æv¬±¨Kè§tLPþA—b›Þ¢:Q¤#u« Ü‹ÑÈí7K¯¦É:1©Jü†eíV•+k?í½ÓB׆­Žä#müˆ ™§‡ó‰r„Þ "Íh…T ´ee­­+à$ ±‚f>5Q³ŠýÏ>™vU H•ˆY 7$U":&×éó½=‡dÝ`“iö‘À³Z@¤¦W·YD[Šô¼×7üõðRWþ¡žêNÖôVu%Z>óÓ¯©Nù‰™P0=ÞâhÝ×UIe5iK)™þ9R¹Deñ¾tNÎÖ¦ÙèØ ÌLoYËi¼KOT†Ö1èh-dèØ‘Û¨ïf„T/ Y>M›?á;V¸NÞ/ÇlÐÏÕBÖV^¥¾}>»§‹sÒ>³¸D…[? Z½½VÔâµÒ2i)D8u<äo?êÈÍyE6JërH`dY¿ÓÍF³,=fÞl¡R 1a)’p˜@‹gÏ|p#±d©Cþ™+Œ‘(¤!#V‡N¹V<¥y)…¯?RâÈÂâEV¬q=±=ÀøúàS°€Úc¤;0^ªs+õ ~…G²=„'鵈5XL‘å´Êâ›+ïœ):è&KÎ1ß²—|TbʸÉZ•$ó(þѬ8Ø»# ".Ó,/$?îÖ‚È™ÃQ ú\^@@M`s–h[H2ØxI7øèÕÍ]ek.);±l§íõ}€—¸ò1Ää7¼Å“ÍPv° ÓŽ­¸Š–`R0“@$»­xƒT#R‹Û×í΃Ÿîd-šÌ6ôGÙ€‹»ªÀLÊᪿB5HWÞjÔèÈÍŽ²h’–úoS¸Ò~«ÇGÖ²&:(OØ;8´Hæ•/Èóy«ƒµ·u¿ôf0Røj&?º½q³ ®é¤ù*aç,E̪¥ÿ³œ\ï*¹íh=ò’®÷}(­å×9iG¿¹uáá‚/ñ¾— ¢§Žfäat´]0ƨ0g÷¤ órB³*k@¥Çø’›UM÷°/_µ¸îp¡ÅOÿÆTÜ@U0Ô‘3èDÉ0½²Îi¬žúD Ò¿%‡-†›Ÿ„üèjgu5&ÔþVm?/âøÂÒ Žk<å!r~amg›.ØÐ2ŠûhPº_娫²ŽÈy'+—@²2ƒâ¹ñ€@Âà¥ý¹†ùàÀ–kŒ$6§«Þ•Áµ,õ?ëKrì½rƒ7*HÀ0ññ8Gɱ)ZcªöFÉÝÀÓY•Ehg§ä5Ü?¹—Í‹v_”TyˆfXë¹Èƒý'‚…c#J»~úwQ¼Ê}+¹~m†ÅØiUFHOyìVÌR5%¨Àç™®ý9RGÖ Üw_©ÓÃ_ª ]1P²Ù¯ ,UÔšôæ³fÙ|ÄÊê`)‰ô†Ü‘ç´É¨icFá†D….6¬–ž¯³™Z¾[ç¦âÏ`ÍkâüØ;»gÏv›M–'gØ’c\÷À¿æ%Ÿ z\k4»×®`ò%f`±X;¼yóAw•/LOù™‹4É9&Vdoíæ€…øjO„Ó›u€rV>ùÔè ?==—%4ú¹á?Cšî£®ýV²ƒb8O²%*0€³ÿññÛ_A¢yp#­ä—œ¬ÅæÀ\ˆý6)dY 9%…wzÜ+R\’CVåÞûRõÁ<ȹ¨'¦YÌ7ÆSîû_;‡û ?¦%â.Y½çÁ PÄtÀ8H‡›U¶â&ÔÂuÂÂ8#i‹äï‹(‚g4мpɆ£A&ýVR^+@òôÑCHT€VKs`¦•›ö.YÈrÏWÕÛ<à–yUÍò_/Øà¾Sò.hÑNXÑ9mò÷©h‚«¸ü¨VÖé‹mÝJ}U¹*@V­`n|ÆŽk»ï†2?7dgWn†ápóRr²ƒ²"ur¼ò7Îæœã3 /w¶°éº4\/C …ë04éeö9”£Âºâ’UÕÃú’tÁÅœ‡®«CÞë–=ÐÒ5O¤&§¦Zú§Îcé“:«n3_úBÏCcP(¡ç/žÜÃô&T—b¡=:tû|#a6u¥Ü7œJîFìÀ¸ûq6Œ+øðXcÿ-&¤¿™›û9ŒÅ`㞯8f<‡ÏRÌL©ï§§ØÃé5çu÷͵ÝDiŒ¡.oÌi9£±À¢4Ž-F€QgŠ6_ ±öШuW][ øˆ©$bYL.ÜÝgÄ}zfãV¦6#%‘ÙÞVW‹nxD ÅRʬ}“Vjã‰÷‡À!2Rœm.•ý{‰6e@žfÓruM ÕóͬlÂó³×¬€¬Ö%½´ë Då=aý%Æ–ãB@ÄmV2¦_§©¤b±á("ÂÖtæ ¼×õ7Ðâ:{$_)Hñ]AæìšŸ9Â{¦dSîû¹R”qwÈwVG£}ìÕuo«m‡«8‹øìBÐ`^k‹§@"† ¬£E”¦{gßÄ‹úî)P}`áÃÏðznBºµ7#üÔ‰9y×¹øczˆé™Ÿ¸3”òo–\M‹:²p9ü oþ÷?:”‹S“PV•!W wˆNzZˆCü …  O:AlÂ8IÀú'l0±öY’=nºVû°DZ8QÈ\ïÓÿˆfF®hì/Xßçjr mêÈôÙ š˜Œs¥Q…¹cn¨ºžsµï¹9ž*%9ÿ,ÁBŽÜjòþ™Ø¸Ð²³\›ŒÂ’§•(}f;ÊP Åóñ—7­l|‹jNYÏW&ÛPû©hÞ]ua ÅÛξ|]‘4ml½“,-¤4 X±`èyÄ”)65¤• )tÏzuk|R›yo}1'2=ŒÔÇ*ìVÂñÕÓKŽ_w««Þ°PÈ-£lÛÿAôì;þ²Œ¨QÖa¦+K§ÞÏžËTÆ£Ë5¥Þ)™8iY ~^ÌÏl}“BëõR¿÷¦ ¦ýë—ørJ¤ÒZ'›©¡t÷#=ôÒ@“’á²^È€ûzŽøÖ™1=ã™ »ºOaË–R *ّГ b%î’¤¤GÝY¼cÒúyéP¥0âjbJ|PiiØjˆŽ ûi‡uªŒ{PEB7ðO |÷Tƒke›hô7 :‡9œ›¤èÔÒ*=Õ2 £¶÷´núq}a÷PÿÚÜ!&E:jsv-Ü`ʰ^LÄEM nÝ4Äô(.K”™ô“»£‰i¸Hxìlu}C"ìÃÄétNŠKáÆÉÊéÕ}î vò šº§ûkì¹v ùwrÆš6ø»9ð—ÒdÍUÚ;çtŽ! –Mf’êZÁ‰zÊœ$Q­ ¯:.Žõ¾‡]¸ÎBYˆ“æÐ>w‹ÿlÕÞ¸ŸÊü·{Hq©uFõúõRilâK߀Þkæÿ2| /þñúç^i¶Ò£—ñëºV¦z¿ ç˜Bä…œ4T¹€'žÏØÉ-p¿"DÕ¹ïÎÚ¿²:Ö'\õÃ%˜¤º½wü‹Òï¸>«ºX'3Ò®–x^öá¼­>Äp€ë<¬ÚxuþâýÏ.ä”óáKÈ›ñn-yH‰ÙÙndâ>Š©1Ác¡Z)<÷¦·QQwVcMXQYw¦XöŒßƒµ6ú#ýp‡å‹0 Z}ë5ß¿’‚vi—4ÊVßPQžuå:õ©;R1ÞQŽk=.Ø×úÒR7Qaeú±S‰úÞ}cí>Åßï¢ŽŠ„¹maî ™ˆî8Ê’8L{·”V¶s3I©N5¹AùÜåé6åF)OU’ËÕï刳@ýÂH²¦NUFï=ýqÅëÇ[-fˆYÆyEÜY{ëËzWv“¢7ÀóJ(ŸVh6ûM"‡§F´^Õ=šXX¡·?$ÇfÕ _¦ Žj7­·¾1˜$Û³­=Eƒò‚ûÆ ‡™è!?ÛڗɘxÂÙû | ;ï.÷‡–ÇË4þ˜T}ùvÚ#–°j2FÆn’³ˆƒËiâñ6±>:ÑtL½S呿¨siXwG%ÆVÊ©ƒÇu&ÿïŒAå Ž—k r™‰Õ<*ãê_ë_§ÄòÑ,ÇÁ³‡&Èp‰3:ÜHÅóæuÒµ˜2±¨ÙòÓfç“ȃœÞüñÎËÃA+ã °1=XáSPûsä >ÅA°%K©­—¿ýA‚ÊQ bÁ®J¬ƒã“Hwo“ÅAí”2Ë6Ò«/!Z)AŽäŒÕw¬ÀÊj™I‡%F¼[~¢"¬óéÿ,^b„È+ÿyúóü~ÍŽóã;mƒŒ^ëÑ÷4Œö ²Q 3Q E$QêúÈ5X7÷Çè%-ô+ÖIÈ‹c c"%§D’µ¨¥úÎ$¤lñt„€—gSãq8zÛH [$×´\ésÝ.iܲ¡Œ³teœ×sXŽ4ÊüU¸ŠFi+ÝLÁŒì!?ëÀñOÊ‘þ¾>£¹+Tx›°0KÎ.vÉ«´à’y溲–îÍÒ°Îɘax…¶âÒ¡£J¿¹ÎãÙ­Éõ@X q<uR¸á¤©b¥RŽ4·ØEɺ°ïD¹².ÒH±#»:.y*9­‘“¼¿M·@ Úàc-=1<›o— W³&”ÀJä\Ù3Ô]RgB0`D+‡6¸9øÕˆ±°¾0O¬óYæ‰;~£@Ül•½†ÀdX.æÑæ­/õþ‹ž Ñn’ œp޾ã8ÂhɃ Ïгgÿl=TËõÌOž^?FD½–rbã7¶ã*ÑvŠý1R2îé$ÊuûÉ6߯où¤Q‚]P%ªIhë55UyÎ?°2á°ù8 “@¶Zª*k)‰ƒ[ŸŒ¸Î"TnÉI÷–z`5d'þ:´ jJ@…}j¥‰æoPñÝ‹%)¡'¬‰$Õ,ˆXŸ7zsëkùšMº¯(n„Òr–I¼tÔg%µV3+Åó£ŠÑ% +¸‰êGt”ñ€¬ÔSBo¼`g£$Ê÷0x—áÑ[¦¤{ýßý´ýyŒ”D_zÞ#þL9c{]1€ˆv§ÙHªOõ²Jo¦‰‹Ÿq!yЙõ¯C\;…û©ú¡® *ã†)Èq  Üë;(sñ¼&S4lHŠ…ú5Í’;„/G<’{¯Œ‹Ýgžôש¼jâl~IeæeëÛþÉÐ)ÌûÁ½µ×Õ°´È@Izt>ïܸzCR̽ ?&½¨»œ§î….²Ø«Ëlx¾+gÖ¨| ½Ñ¹ŒV #?î7ë’É$ˆø¼TŠ7M&&Ž¯ëªÆF(Bºm"gãBô³õßeWpœ ^þMö÷šªNN:ŒÊJ ž;q2ÏÅU'ìddÕ7òh>aü({P©ü¶çg×Ê€ì2fßMjW®ñR›0/èÏq"òÙŽ+É ²Ø@-;´Ò‰ÜŸŸƒ]Ûºêr¨*Ë V ÛÇž¢.ìTñ$âC¦m;ƒäk«ñ[|1¤Òg¾NúéÐK£å_Ï¥FO P µ‡eÙ½6’*Oÿ_ûæÙ ‡ÃhqQ£÷ÞÖêÑWôÕKôˆž,%Xìê²Dï½Ñ£ á/zYÝêuõNBt÷?sç~‚ûî™ç|€ß»3sÎÌ9á2µÎ•òÆí¸÷*^®‰_qàt÷|Ãjt‚“ ãm¥£;ÿw(mw~j§“Ëuôéã§ïÔÆ¢·¶©1£(Ü»7ƒñ¶¶,«LÃV5cgV’‹}Ô1Á±z ÀÉ¿—_\ë6/ó”ý”ì-â©#½Zvc¥þš¾èÔtµ³ Œbr‰FãqÀß$'|·_PÇûzŒØ”’Íœ’COR¤V:1õyß™§u2;îß× {À4íÙ#-Ù«Rˆ®¶Jq€%íÛÖ¨±\tàñ¤Ð9€KêžMÿ4ždܽ_öNý ‹-Y žyÞˆã¾ú^ª~|\ûy_6döôŽ^4’ƒU"!ˆÙB˰æÞRÇœÝ*aù²—úèrå HÿÇ×¶ï+|ˆ—·qŠr–Âh¾?Ôh&á>êQœ¡r™Á›+Ùkp€§êš®7—“˜Èùbüž¤}sˆOûÎF1ãØ1Ý®8Ž Š·Ã‘) ¦€RD'¹ÐD p´jVªÝ¥oVîýz³ÃP3yQ füûÍ£%µ¯õëÖnì[ù­çY‹Š`J†00Fê;ÊÎ'8\; wÃtÆØs>wõŒ6*Œ/z(hÊR •ZÄ<ƒÚ÷ÈqÛ‰Ék¼°Crc‹©­;î'èev5Ñ4`xkÿвáYá®Ép/ð?Áƒ<#»œƒy–°ê¿W'I§“â~M1¬;³~wœÀòü?¦Ž(šµ£\¢°Yú¶0K„›®Uy„hõ¤aJ¡sÌèŒUA ÕÜwÞ~+•#"öÁV”~6·éŸwumÕao¦œ1j¯¤ùH¯0óÝsÐÖw¬öü³v}D(Á%7³½£*íP³f¥Â¼­x ”%†”ߪ¬æKÄŽ5ªÿå¶5ÞfYVzœËÜ|ìß—bQñQœ_áOÈl×ä_›ÌšÌ]zuö¿b%$— ÉþvïÌy²°Ð©º Å— 3¶™4*Ü{UCt­$S™™šÿ0y…½i–£úÒ×ãÏ.’Ýa•+=)¶bŒZï9lNˆçê¾êɼû@=ßZÅïlX™]/ibØ]Ê¢B$t?1Q9·¯*­m_È¡¯qÝ öe:A'ãVIy«®-9{]DPïàW¬7?Eƒ~LÈ-„ß…&G•„Ä¿ï`V°8ôè‰ Lšé  6"*èDû½3Rg€*¶“c]µ±Feœp³)¿:Ó'3)Õô¢‡9°1îtçOîÝ›6àf}<îùS\ ÿƒÎtýÄÀ†¤/OÐ]‚!¾Hªm,øQJp^ÐI Éap&%Ɖ™?CHÙBûTy hvz®^§Á@‹[6· ¦¾u½¦ʉzäï{øZ‚§·P±VøiÉo ±+åŠXçLê ðÍæ©PécÀ¼ÇŠÎÑËÊŽEÝ»ë3ÄzþJq]V62[܇—K™zËfhVÇ€)¤Ò.k3Šz=¯õ &“tvwV•ÅU?û9ÛÖ;‰h)ª(ÑSǦ7óCÛ>œA›Ú—™¤’¥Ã·Ï"ëI-A’|øF2þãU€–Áð¶Àô¥Ó¬#®G{¯áŽÜ¦#o-Žˆ4†J>Š“nÆ@dÖü÷8«ÉJ#àsO;\—}UAºnJ×…6uYŸ½šö‚ßW]Âò…#d»Œ¬„òáƒæp5‰šm[õ³Þ;V™””üî þåün³Ei„d~¶M n‘uz­¾q=^zÞ$¢àñÍ“,ˆÁÜí-ÆÉk×hgª65 R·5Ðç,Ô¼6`oA6‹Ql•m=æ|ÊÀzi¡J=§ÙêíŒjB¡ª3¥¸¿K0FB! ‚óøÞB.npîh¬~­ÂwŸþµ&Yê8>3ü­Av¿@@ßÿ~B–„þèT…YÜæd ý6^UJÌ A¾H\bS;´ô ŸïŸ¶œÚ÷Ø”³üÀø,¢Á#Õ6ç3þø2WF¤ŽÁQ½k^Z·/:ùÁü†V{G7Ü]L<½â6æWòôT@ò;ÑÙÌôkË´ŒÔ‰ß£¬<ÜÏ-}}¾ß_ëƒkä!;–½°›ßÞ?wX]wàIžø¥¿WÉ"eª’Ú|`&m~C3r¶î¼°X S‚Þ–w«–Ój¡V” ßè¿s‰¯Ók^ÀL’CéêÖmîFã˜(‰Š™6NøyµzeûêÑizGA­(°AëPmývYoÑŒÙØâ¹û³·¨è¥+×PG«Xab!;_Ó>(îˆ\ó½\¦n©‹a| Êw¹Ð”úu¨¼ã¬žý·ÎcŸäç7‹ŠâçÓ‹Â×^óÔýeÍ/•sTwü#Ù”7;ëXH$%\}ÜÅ ÉŸ]·(xþá©ÈZ¸Å»Dš“ûÓ%kÊÀ|Qf…I:ÈÊg4Zâ¯óÎC‘AÝ OŠÐ-½úZŠW·”ɟȶîª8:1ŒŽš«aÜ[%8”í¸/Í­ã:Ì(¾Ç]ÜeS|½/ù@ãki2ÑÉqZ꜋ø^ïÈD^PsÅùuÜ7C#Pˆïk°CLk™ÆÓ°Ì¨k|ÓÙD¡aÔÑ©ìN»¥šG<¿ðm;ä6ñø4üUµÜáNlis.Öæœëø»KX¿D婱pÕ—‹šð?í*×¹|Tyéš2uݸc08h|ÍÀÛ-Ëöþ+Jt1ia7 ßy¹pFîÛþs^<ê»ßlsÞáj Z×.üôË!5>2à{KÝÅùB>í{a–n䦳.u0ß ~%m©ñ£Uç/°Ô‚¼ ½œ“n¤wˆë½.•Ê=qû9æx™êŠ}]-(kîy8«$Ò ¡Ðá›í§”wlÕ>ÂàÄíÃŽ…üpÿ·”}0¸tÙ®T’Ð5º5[nìÒX9î’š§UÉGŽØRç÷Øg1›–\³Û˜¥Š]þ‚I^^š‹š:…ißÄ1ûKˆ …ÊË6ܾF›JÄÈ5p/9$5±šg[æqw߀$ƒïÝ“\ó×S~?–ET†9«§È 2GíõKN0iíBº áìÎ!Â^K‘ü`1]ùVý”råUGÚB¤R#–.È]r9ǘz—÷äóϧxx9Ð[ÌŽœ†´@Émð„¢ô}j­Þ¶(¬Ð:2Eˆˆ@»ý&ÁÃáÄâ>듾5ÓU´«iÑIϹ éÀѦ·ûÑãïtÝ+?ã}ÒûJ¨u†c»Ußyû§+óm¡a&ïŸ “â¿Ã[Ø^½¥c»~þþƒpËêW|C×]‰º ´°yžß gŠDL†CÚy¥\Sª}©®@»J"ª‡%Ës²ç Õ™‚$H ´¼”[0ý‚¯IN$ì·î…¾f)7ÍGÇõ¨ÇMNÄCZ圸#ÏÍfò†ñnU[Œ”ö³ˆ‹ Ÿ,„˜XIù²ùánMÔ}gYLÁFåôѾøÓ{H»†MÿeŒï˼ª¼ wí&ÍjÕ}¬ÅZÎ0ou}ã±¾yfRjPeSˆ|ÂQ½i­WÏ –è;Yÿ+êÞ£>°œ“¸¹aƒçm“$Ýï&ž£´nÚ}\´ýŸ·‹J¦-0CÜF‰M Öª»r”/4¢Ÿ7ð—‹[_)R—1œ”[Ó)uyõ<šN–ÑÈ9¥ÉÙ\°ÀÙØägH´Ks{¶N•‰ÈÐÑÃÊ)7ü9<œžEÜ‚wl_/Ô¶2"d‚_dõL.¾æ¥dZž9F/¨ÛÂ5+ ’ª.²b^FÇ‘7Ý{ž­ƒ*ûÐ`¯‘geÿš§i´c±¦Â§‡`+•„¾0âSÅ2i¶"™f´‘··ÈiöÐuýC£°›M>û“†”€·-ȳ=)±S‹Þذךмš.\é†7b÷óÓÙ񫎣 ¿Ø6ºÖÐÇ—dæ8ÌØEèùêñf}@IöÑ]ce‘QÿœÙ߯(X#¨{++x£6–N)?*µz„±¸ó‚“êC1ĦåVž§ÎK0A¬Š´C}LÛ[ZÑÿ§ˆÿ ø¼…ÙÛzx¹»Úz¸ÿ1gÞ endstream endobj 423 0 obj <> endobj 424 0 obj 918 endobj 425 0 obj <>stream xÚ]’ÁjÃ0 †ï~ ï0èYÒ4µ[ÒQÖöÒlØJXl㤇¾ý,+t°C¢OX²~I~|8ÕÉNÛ’ÕsÆÏ0Ú«WìßÇÒýñåhú‰§'oU ïz£ýÃ[¸ô†-s®{5Í^ü«aN®oãÃÑt–•%OÏápœü/bÅ'–~x ¾7¾øÚ×Á¯¯ÎýÀfâ«*®¡ -ïÍ<ÝéW«’úwðysÀóè/Iƒ²F×(ð¹+³¬âåáP10úßY¾¦”¶SßgeŽ¡YL` 䎸 \PL1Å–xx½Ž +Å2r0sâyE¼B.ˆ dÊ1W dI,‘7Ädª+°®h‰[dE¬5±F¦^ö"¨½HêEb/’tJÔ)I§D’tJÔ)Ig08Ìyj8V\ø}Mêê}Ø`|qG¸ÞÀýá8ë0+~¿°ß­x endstream endobj 426 0 obj <>stream xÚd»cf[³-\¶ízʶ.Û¶m]¶mÛ¶mÛê²Ñ…»ß}ÏùNÜóýɈ™‘9+bαȈ”é„LìLÅìí\è˜è¹¿ì],Mèäl,]MŒŒ¬ôŒŒŒðdd¿œL ],ííD ]L¹ê¦&!Ws3;€‰›™›™ÀÄÅÅù£š¬«³¡ù?>LLŒ¬6Vv66x&&€‰¥± ÀÈÔÜÒžá? %íÌìLŒÿ7quøo››©“ó?y”ÿ•› ðOf{;O€‰©<ƒœ½‹¥±)€ò—½ƒ§“¥¹… €Ò˜êŸäœ\´ÿ¡Àø¯dúW2ÿ+Yþ•ìÿJŽ%'à߲ʞÎ.¦¶ÎI;c{'{§J3¡„llJÿ‰ì P2u6urûýß,Ä\mlä mÿåñoËÿÕ²ÿŸ£¡­¥çÿãú¿]ÔMÿo²¦&–®¶ÿÛjé,féaj¢`éblpqúg(ÿÂ’.†6–ÆBvæ6¦ºÿ´÷? ª‰©“¥©‚½³å¦ cffý_6 Kck;Sggó¿&S;“ÿMúŸùüK™á/Ä¿fÑúebigPv1´31t2ùÿ€Í †–v.*žÿ¬Ïÿ„ûWgú]ÖÐÅÉÒ ÍøÏŒ™þó?¾ŒôL\¬,œ¢t,€Ñÿ@º€ÿfÿŸô’"VVF6Öÿ #,lïáMÇþO¬\v.'#‹ïÿSŒ±«““©Ë¿köO¥ÿ­›YþÓ8SSSca¡9=m„ó¢¬)½ºXÌtW„=—pðΘì'ç8Ÿ÷•òË«<;(ö䢕„K'›¤-¨¸'ÒvQ³nг#q—:„äB/î5 íæœ,ãPÞØPõÊ„»x»ˆùD†Hk¦Òè¥gsßvªzo×ÈÄj`ÅvŸtíoŠÉ çG©:ý½™8~lEú2Aí4hΰ¬æPòž ï?LXQ<˜‰ýó)u£“!p˜À½‰Í¤æèâÅ7»Æ\ª•aå<×>/²Á¥šd1«P3&„èF9asE‚—9§Tßõ›a7þþPJ¹"&²œOgè˜ uë2¾ÝLûMÅo¡ÒPQºøh»äʲFºÓ(Ðl”,â ;ÃÏ‚iÕçå2_ÔתàMP­b­U©ãàºS:ŸÓ‰þ–»¤²À—s¦eè“bĬ ¶ûó.—$F™¹ƒÊc¦î „¦ogD!k>E¾ö^µ#bicB–ÛLŠ@EÔ!ZÍèämq„y‘@vÌÉÒš4âùÝÉY·‚xòÈ.+†TI‚¥4g|·ªLÚ¶yŸ=Ä ÌWƒàh¾y™B\ï?2L±-œøô°«UJΟ 'ôªw•×}­Ô˜ˆ’ýu¬ï!g°Zò~üStz¹b-YÄøÐ²Öœ•*KÕ[ ?‚Cå-Y‰™Iœ´ï‘2¥¿¡Ç?{.³šÒf´ƒkâp ûÊQhÙº¦±¿¡Ã‡©Ñ‚<Óƒ<³=#?Œ4òì{òî%b¹Còãþ8Û¹›¢ÌzÙ~† ÈÇ~43èKüv(+¶®ªƒµu”%EpdcÄ&¯ŒÖ±ŸÆ¤H’ = 2^n#ññYM=Up~Åæ#j˜˜2tÑEf6r"ìË£®MEJ¢×¸ÒÝÿ¢£$‡Üã'³€tfm6ðâ] ¸°"fÕa—„Á–R,á~~ç£ô–˜3~ä6©-i¶„:A€ƒ:"•it?ºó¯wuÞ>HÀjõŽêØäê8:F:uéYÞP§ ÃдæìþŽ×‡Õ-ÖR_·(ÈÜÊc)'º²Þ®šVëU·“D¢u}žS/û%3GdÜ[©^ÅÅFlà300qÕè>TJô;Æ%ûÚ+I`¤"Ì:ß¾ñÛ¡I§ñ©uÈÇàáÑÀm ûѧÁŽ ¦–«Ã®t¬x…>I–Þö«IL «Æ õé+)%Ž©øÜ|ú*Y 0·¸Í*Q\F»í®æCQl =lj ¢^d­_/>XN«ØíÜõiÖGië󵥈öÇý¦ap^ýÜ›W@SeÅ÷ß#Eù3yaSƒ˜)0êuáAÛL(Xº]ì>ƒãì€Â§fŒWpZ™3Á˜}ÝrÿÐ!?õ7ª.ò%ܪöÌó¾ý’¹S•Öë½PqÖÀ€XCÃÛåÏ'T,»eøY;ÒSõÈeéURT>N£Áb{ô\/cCÎB;h¾ò‹÷ ßbDñ§žàž5~ûð<ƒ*>êµD ?ó ý 2ÝÇÒ úš‹.u3"Wöˆ€Ù"?Åï{–nõÖoÈœš:Y—×¶C.@¨¥OÓèB½9°¼,*r^ÎôOþÔš%Ô«Œ  ÈùÏU17ž-êÒ䈱|¡ãË[Há?`@}p×-©¡êâRvëùî’Çïs1JScTV’GÛ÷>/esFqoŸA7¢?ÁóÔ³$MZ3½×¢5tìzîö×kXód~pÈÝ+{á.iV·Ã+þ8BT‚l‡ `×[êÐÔø:$FÃA¥h4xcûô?î:çÙ-‘Ùzw™Ï…7ü­ÁÍ õ|Ï—¾Ô „< ÎìjÚ«âœK i…Ò¼—5ž²ø®*uAI;ï> š…g•‘ÇŸÂϸÅV=v™·D‰|̵@,o*Y".É`b©Û~Òj.IWªÔÌÝí©cö&ž$Gd ;FVÞ,ÞÒÎ>/›×b¸É ©uºz*bn x#!.âÒ¤u‘ê!GŸ‰·qÃÈÊ*ØêÈ!4,¤¡É/Žáð÷™”–&vö ¡Ô ,sŽ#eA’èd$ç<ˆ§A™+œøDñØ“.œn.PÞkȤ„iwõ~ï ƒÌž¯’ ‰t|ì—I×G±¬‹ø™Â‡ ÞžÖ†­3I°:à–Ò5£Ý+sùK¯)wµ5-‚…å2KJz}=D-Í£µ]:‰¨‡0H/T­d¿K}Ð×Z¦î6½¯¯…ñæRMj æÎö M!Ì7¶Ú1¬Ç©›MÑÌSLØZ~µçõnÞüÚ®Çhôg˜Q]d]t¸lîÙ€±C ëÁí„’€•ê«;52§v]ì&— Gó¢Fª†‚‰7X|Ù‰Ôüyòk®—.áÐh`Žéw¯¹:orFŠ¥DÓàOÙ]Ã!(:¢êC›~Ñ– 0q1€Ÿ!Ê(ƒ/·Ez¤ÄùØ€F—²îm÷ˆ²‘ˆg–‰…™B_Òù‘Ĺ£¼C”rØj={ƒ.ŽölzpEÆÆb6cäöq®ŽNʸù5**¨ì-–}¼ÿñ»E4/ÔxŽvÓš1Î¥ñ&”>ŠG4+£ôNYZ ë·E1ø)¦þµPˆ”Ñ.ò¨ j¼óÏ Rg…Ü ùÝŠÙ¢$×’ôÄ\M<%nÉ]u¾<öêoÖG£ÞA§–f•-Û%‹8Ü, ß .›G~9ɘKñ¦­÷8³ˆÀIÒ‡¢Y­›ž<™It3ET(±9"Áû[ýoãŠî‡Ç ¬v†¥½å©· p¥-„åvDø Z¥ã›F!ÒöŸ~g…föÂá… jØ!ÜxÃoBsVm:÷÷Ä.LªÌ|W NLi1/ÞðžDݱoÚ!šÂu£²ô4•½^içmù<¼¯MçgèŸ2Kl{ð û‘ÎDôcE>EVšÇ§˜/ÃÅ]…c&%ÚW»Â?TÇÈçB‰vdým†¼äfU=„«ØUÙY礵í ÀòÄV}ë)p5-ýŽdý&P"¶¿–qcoÁƒ£‡nx­Ÿ€ëŸÛZš@%©Ç&÷Ë}9Ð¥£O×ø˜Rš±?ªþ7-hÀµ¤’èÂì:éõ!`|kÖ}§ ‡Éë±}æhÙÃSQl{ÇÚ–£-¿š’²/ýM³“1ÍàX¨)¼ô}L$ðÀ±{® ôµ%Êt¹lÀ¼Y=û¤eäÅl–#(Âá÷™m·ŒZ$t¥fþÔŸ¿ë>ÚMúŒ8IÙçHàåÛê¿ÿö–ôpÚ“öVÅTÒèã|¸‚o§³PL…žv–ü«8âž$á5ÏÜ{qû¼cûÌyTOj‹Gua FÜ&Šzé z™Ù`ÐMù0øó-URUZâx*e±FkÉîl#_’®Xõ}&I¾tŸµ‘#YØ­0Ó°ØÞM)r˜ãÄ¿å›ÂíC,V;ö+pã§¼N /§Ü4~t žô ¿Ï5Æ[²Í(a1ŒÅ¼´™§žqèü]7A¡0Qïö q¼€•õ×P~?.Ú÷Ip´ÞÔß»š§UßaÒùÀ}•"ÁÇIèYxhº2Æ9çP´ø9´É¾§˜œqÍ×b¨Î¨ßny?jï³´Ìsp” í|§Œ’©£jgÁ`KÇ´¦ÊìÅöÖT™BñŸ›L,!T››m °\þºgïfx—Mž•‘ ZÈ”1×Èâ#_þ‚c½±÷{øŸ©„êé ï©¥ñú÷< Ö°ò{ïçX5ä ýÑKî°¢:»Ò; ûq¾å;t|aagAsMF“°S'£_P@‚Ä2_8èäjr“[)_ßÈ ¸.禦µ¹¾›¤Y9àär"¯ÙÀïª*aõqÉ/¤D¾‹vžyð6oï¬ÓÐÒÝž¸ÑãåG%>ïB“I•’Y³E-ÍD˜Ÿ@¹=7!9iŒŠšM.,Q¶ûÍò‰DAÓ©od¼Afó¤R8&1Е¡†zcCN¹ u¼ãŽÌ$uœýšº:.;7ydÄgúÆ]ÀI‡ŠëÞà"O7c~+m]HÔš:DQ;ܘ ƒ›` ‹@>Û¶óYÕR8ìlå¢Õpß[» 3!Ô.=ÄË…kÊðíx`ž°‚Ö~Z9š jÈd侤æÐ«ušÐäwÂ(;eVÓe¯?°¥Õ9'^®õÙ…iŽ+lA xv‡1 "™F\Ôt>™^Q?Þo`Äb#~×¼gÛ´¥{ON!çUõÒSë/áïŠnäýí;ê¾ñ£ûœ–|i`ÛY~òK @³"Þá®ÁK á$éŠäTêê> ™5Í‚ôNßá•f‰v«Ö;]rAR«ß7ò£ê7@Áèò(jÿE}òHyÒ{¡îRIôàL¸>}ïû»Š[ìi€?+ÒLq‡f&øKÕà׃sá¡ory„mý¦w¶¾¯WAifúæiJåj¬Ô<‰ˆ22Öð@C|2hÑ(êÜæ^®ëµxÀýÈE‰~ òΑ‘âzÏ1]Æ'ø ŠõëçWz7± .|äL™sÿ/D³û¹_ýn&ŸÝæï¿à²çªLá‘®K½Né·òíoðã«:÷¿A€*…6´Ù|3¼œîŸ‘=¢{Ÿ@°½ÍÜ„ä{³²ïIŒ+0|ašñ!¸gl'g p2éÕ±§@<¬#ËVcµ+aù‹dz­\oÊ~2=쑤C¿NhÎ.Eð_~N¬Ø=µûEo%P4DV”L`A¯¥ÿ ‘@D7atœ„›ZC‹¾Ã&åØY¬E`ë´ Õ]K ®ééݤšŠ7v^ÌúM1=¦FÒϘµïF< ‚`F.émÈ9Î@û¶ŽOÊ„fϵç#š¡}ÃpˆUø·<û%éåçÓvF>×E-®#»u¦ï4énTQT:ƒëÌÎÛÛü©iì-ÊšÉÿ - šIÁfNò¤!'Åqá {žßíq2½#Y\”Á5èÏRÛ™6PLJ?õyÿª%5R©®Þ –‡ÙKúô£I:/¹¶Ý·É”Zdá½–hu6üv|ŒW¤ž$g`.„!pŪTOUmU‡°ZùÌà`¿ð·c8ÎÞÄØ”Ÿ ÑöU8ù¡"“)lÌýudó*åpE(h‡²<$DU4Q•¢ܬW<î/qð rˆÙvàOF](‹'Îg_Ûë$ýy·óHÊ—O?;šUÉZoÀyA•RáVÑ1DTA –¹¸%ÈMšÒ´Â+—:¿áßnZ8©ˆ?šã:í;h ¹±$ëyåZôÓP‰ñâ=eܸuä6c²éÔ` Áü"Bq„;sV–BÕO+llõRÚ 'i“Þˆb¡¢ÛXÝ)ëj±þ`ì)ë®zUt-ŠÞ%„–?ô:%_ C«Çc…eÿ”Î8>àƒO•Zqð¼yÓ5­™(Ža¢:T ôâAD(“ˆa£5Ù0q‚µ@¾Ñ¤Ë!ê·¹î )ST‹ˆeA¬"2£Sëõz}¨‘÷XðFˆl JÙÁŽVì…nÅ9-ž@1ÆbˆòjfÉZvþJˆö°¾ l+ŸdγúÑFÅ0ïcÇ.ç«^ЯÎÄH`‰v±÷IÎf†ûKM²g^þrŒÅ0×czçOðíÏ%¬ñ5šHPLÅ^z«dÈdVÚT?$ßêÀÌÐõŒz*]~ëêx*P|gëäíÜJûpî.‹G~T‘iŸÆch œÙþ*•.¤èÎ9/Ô„;Æ×óœË×iørÓ²|$ŽØîßyY%Û•׈W‡&W´ïzCUÊfd¶ª«¹ð={BPêÉ4޽cM’°á„D«,—mi~d@wp"Dr¨f˜/U¨¡å°ÉðR¯MŽØ":ÄýçËbVtlE“Ír Þî0¾ <×¥èQh¸*@3iïzb¢ÅhÁSa[£?ÔÛ=^=þ<Ÿ]gƒ †@iå~uNWÁÜ´-v(ÇE8Šzf7^»-º’1ã"É.|­ýGP•_gËjäÉâ÷ õÞ8‰åÍ÷w¥™³6qÓUOJÆ[mªg‹ºå ø ’ĬŒ†€X¥)¯ÏßÞã y¾ÌÁ)ïz,)Ç6y«ß­êWã#/Ò"ÎwôüÃì+èèÀVÔ2s]AîŽï`)AÈ›O"[ømÅäž± 1»›”*›V³‹=dx3­eáÆv´ ¼ê*ÕP(®Ç¬®äŸ€nH \AÔhÑ7\]:!zK ) cUA ¬ kµœµ°øs}”¨ˆBP[Äᑆ½£_[âq^ŸÊCÝà_v™˜ð/^ñ­Â‡Õˆë»=ÜÇ(ÝSÇ8L{½[AóJà7ƒÒ_d­¯” Úê+TŸê‚:*ý‡üZÑ—6´¡%âÐècí¨Õ~AÓ¯›ô9Ø.ùz§×ç¯þñ__±/"aÒ—ÀvÏ5 Â…ï45‚£ß?„ÀÂUŸ]§0›È'ì²vc-ÌÓ)ó …ýœ“5çûšNŸ—X'l$ÜÕwÙKº!"ØÌðø“6BɱÆÙÇ,•slÊhÌCtªí¢Ñâ-ËÜ3KúOè¿å\@Ѷ•î5»¼æZ…%ð£žÁ ŒîU“Dèa :x]¤2äŠè|%eâ?ñP;N–I÷L×6p#y¸ |ŠöÚä£ÀltÀìåJªçSÚàù£½ô„ô`žÿÍàYá'ã¶* +™Ù½ï§¢¶ÎZZ2Q²j65[«õì~‚ݘîŒÂí¤ Ì“4²–5½]NZ»‡Áî†O çØsŸ ߬ è[t™¹Ys8 ¦Z~–öñ¾—Ä.¿DOC±¨Øv©˜çE¤Æ{×ÃBšÉt=f?öCÖ U5äB/‹Z,¨‹<,ÄÆ*Œa"t(¢ôÀ¡°ð!pÀ‹å™\•Ñ}.ÂSÄðÑ›Cîj°™½p"'ûââHðÔYa#(rnÛörk¸æÆ¯i×P>öT5p>à`¼‹ñ.딫?´`b›LTÉ=…^V! ×yD¾OüƒI~ÌÇ%-™¤²wSÓ†7ú²ñè1ËçPÆØÝy'è;Áõ[,<*aG5hŸžL‡®­ÆÏÊ&ŸÕÔŸ%n ôä€ùÖ_/Â;Å(âñÄVua\Žª•>;Ù²·à1'Á&ïÜ‹0 º;Ù‘j $ÂL ?B ¤hí‹¿6… 'èÒõåä;T'ÑÀŠû¥ Òhˆ ä—S&¸ÓQÉÂ-.7ãÑÐ2ErØåöBµ Ízš§ž²V•¬sërÌlm ?J« ”JHÞZ‘rPî–™éåVwq« %:#î«ú\âhô¢»ú'©ë¶€:¬º­˜>úR+A?VtpjñOÿXAâÝ$Øoª!–aþÇ_°>_Y¸ÓÿmúEo ö~{ÁLŒWK }8ËÈ<[FŠ÷;] íKz½£¢¥ æYt½&1$<Õ¡J5ϺIcçdQÇã°P"ÃüÆ•ÒdÚSZˆ”$Yõã£h¯¥ó†Ó?KÂ[rîtò£š5`\¤çÑN̶[ÏÀË{¹;ÛY¡gûóÂWýCƒhˆìfÖE‚lSÝàšPP™ô(¢ ÆW9J)äÈWHþ‡À6 ÓF­ö/¾—àçß|¦c^e+âp«.5áêä7néXM.!SÙ KßÚÖ=*ä>ìë+Õê¦ [‘Âç`D:ߨ´h‡?ÕßðÙMŸWÇ£uÑÕ…ë»îé_3 öF¯k†Ñsyª7ٖͤݫ‹l{‰E¤ƒW¢'ú’éílùü­WÛB tð%“@áñ¬vö–?(Øh5D.+% Aú=UUrF½×sp›jãp¾a¬mÏÕŽaÖwÂeè§9 [&Eý“òi¹Ñ^´¡¾‚ˆ”Ãçlt@årÍöÉ{Ę«´-¹ûè6TbÑG ð«{³T‰Ñ:BwC­¡J©“Ü`•Ûô]8õãy°øÚòZßùh¸ñe;Ï84Ä›¨DiÆf7Ë’5 [` ).µÚöÛÙƒj5ÇØ¡5Ëû2–Êó@oO%AR'†Ž9ø¤àÌÄ[_QÔÛ¦#Q{‰¨lWeÑL“‚À#yŠÑWÒ é–½C ,µJed‘jC¬åPòÑž‹›®÷Ù±– ¾…3J‹ÉF„µÍHTœªFÍ0wÑÁÅmwÒõÓcÌ>ÇbÅ›©?¹šª@í^ˆ{ÅŒô"Ë‹>¾X¿Ábh4ÛÂ÷=Ã¥ó÷ÞyJCçÃ{~›ñ¥ê‡é$y¨½Îo8­>«‹áÿÙ./Å0ù豃Ÿ½¸«Ò¶]Nvp ¯Œà®÷¯J@Nuâþºž$U+(§ý¼8u¬ÏF<úØô\V/„7ý[Óz~828B~.ÅÊèòUðz×8 À–ŒSu™þþX…O4…(+œZNí‚VÅŽg´¡j@B¶<‰ˆäŒ7ÒûÀª¢Ç³*äE& Š/{þ—~ÎꟚÀ[–âóÃU60 `M›äøâRÄ©Có8ÀÚQŒÜcN KëÈSÔŠ¢ý§Ñ÷ƒÁ+ï¡ý=ýæ†: „Cϳa+¿¢GÛdt`Ü뉔çïíϱFÓ\2 #xÌnoœ±•~8Ûm hñ±ÓFáÇ÷(nf9xp“ º§¦¥R>DõÃ>×&Ùt.ʰ‘Äç“Rg4ˆ=«¥‡ äµËZ2„SÂ3MŸƒ@zù×UÙ”tð[èM°™±æ:V[ ¾*Üýu”ZF‹e)§Àê‹ÅØB &O’ÒcUÊ„ |A?’6%ÃÓͤ‰ö²ZAòs*Þ MQ k½pZ”à U<´„Ø÷2çi-+ÑêékOÝÏ0UL·´ŸhïÁM¤)MLGš@ƒMt>îQNg*\ªä&9# †ЇBÃ4/>Ä;†g¼Öùjc÷=Ü9·ÕÖvC5¸ßÉóž7hY‘Þu3o°« `A5 E½èmó57¦’P¶wrþw~ËÐêE7S‹3)½Q¢oUØtŽfOû ½é•D±œùÜŽH‰)»4tdŠY²Ô4¶>²K†£øíu˜î›Ü¬Ï UN7ÑQv×ë NHg,'>'kfj?°šÈ{©q½Ž<¿ ¸’siè‘gD3Óó&à¹ahþbòÙÀZÙ{è xÓÔ£­SMhÅÓ¬BŠ[/HUúw¿RjO¯=)mEè:~8«Â…›cÆIê„øcÚ¤BZÈää¥ëV‡(õe¶Ãbì-!^ùÒ¹W¬JíÅRdmé‚Ö‡b`?ÅÒœ`ÃØ9Ä},»”ìÔëØàïÄC‚òT°³ úõ0’*,”@â>ÿÔc nb“Óh¶;‡‚¼%Ðì;âf³Ö쾦{àÜ'äÇ®Œ]hߢ|0ŽØÆ‡wÝI}ctG󭎳o %Š1~ëxؽçš2w¿±ÀÈeê Ó_=WNò¢µÔ™é+ ›Fê+WY‰”o²ÝöFû‘Vçî8!PBD:Ç<–¨æ™f–ÑjiM;uŸ7tùéyŒ‹[³É­¥$‚¿,™}t4J®ujà ö Áo-kJ ràkmKñlÇ®•3ÈNA­€=®—Üd¾i)Ò;‰®¶Ýá}ølâÃÞT[âŸH&íÈ™éþ†¥1Tµ,ÖfG?{ä pK~–B¥m[;Ÿ`û”éâQ²QlC²W=pYˆyÑ6Däè ž"w«ñ°*õ›Pˆ×Ý» x°â††´y P6‰³žjGGýpUÐ:!Ô©ÔnÒ5?®qÔ{Ë&–¬¹Çõ…6ï¯V’ U’ÿæ‹ügS½-­‰DCzfžhŸHæjÛh¦ÍÞç2ªóåK³çm÷WEIí³~`JA…›¡Sõ½Ä>5ZOþ3†G©Ø7Õ DtÍ!Gçw‘Åä~?ShnÍq&lP$Ë/4èziqÐ÷Ä¡&×k1àR¤çqߦø Š9 ê×*P ¨ó'ˆ ‰?¢ˆÜò¤Z“É„sXÎw’ØäÑÄê+uuågVûädªé_Îèe­ï¾®'OÀÒâM`›vÃ`#ðvnÜŒžÝSíPïp„ò¯+53ÀÀÀ í‚=ʸu ®ÈF˜î­Õ4ËŽ1`×)¤” t`|iÈÙé_rr9X~g‹±d=Þ°TÛ¡î Ù^‡ü9BêÖG@*%¼ëXØ9¡ž×J 1ÇrYdY|ø  ,VZ/cIU›utO¦œlkÅÁ ¼X)öîäšö3j ®:_°¤ïƒ¾)Ù@W§…4TWn-IàáT-®8XQs—àû*ôEH!Œ åÒæV¥wåîØÂ´àÒµˆ§µö¼‹÷w5Þjœk¦¤¢9‡AM<’AB3Ä *+ ÉvK®®2>`ù÷.™£p€sZÔÙ‹· ßvÏ7Rç(;‡(2!ãyåIXŸ'ܨN ¥ùrÊU šÖšÙž>¬Ù_QYï‰zç®8Þ¼n‘Ó}ÆŒy•&¥·Ä‚C:‡Y¨ <â]ºŒž·¨i £6k:ø¤§š‰Â‘ ïï†Qû‘ÚÙ%\¸öìTuÐMyU Ì3VŒŸI['߫һÑÕ›‡²oÁÂÀ òwQ¡Ä_©#, äbàý㵜c h%Ø2éõ5B æ"JÝÃþ•VPU¶ÎP%Á£cŽÿœQ3¾ÇïÕ$±4TlKªýª¸ kË `šÀÿ [èÿq®1 š PªÞSá_H^zø`¨}°‚"Ù|àÌÜ«E³u¤deEUܯŠŠM¹éPÍÆ}{™ ]š5óƒoÿí°¨Ä$-+œÆ}ò&ŸÀe÷Å{bð_ߢw~0²L¡ûˆ¡%Xú2‚ùk ­š.}W…Ç<ƺ[•ë øËq¢°õ7"0bt´‡Dø…¼ÓÃCïÆÌ šFá"šö>*ˆD§J¾À±n$#MÞzÍv¦ŽêªXUA ÏØXEj±(]8ÉPQnNÔ…ìvÔ[áÉýjHI•…©˜x©ºRX·$T–5ˆƒ’´ \òb:zB†¯¨tsJɳ³ÅŒC¥u)Ä’]ÿæç¾gâ[¨ŽóC§ £ì€Ý}>‰Q#S*º‰ßzBŽ|0wÁš5ÉšÀ/X Ö® L&3Ëñ·Çaf—˜¥‰d~DTÅ]¹M¸}°]Okǽâ«#|‹v죷wi©}zÀ”ú½U4Æ?…µ °Ü€cÇ8ÕŒž®”—Ç«ÖÙ>Ê7°>O½C#[»®Ãv<t¯,TÄß/@œ»Õ ~Ý qˆ‘ßA•“àA’7{R¤/´kÌô?È’½u÷ϟ컹 hze×^4) §þ"“æÝVU;•qIE›šíËKð›{p wh°¢$` ›ó:.£„'&Þˆ–Áßìâ¢2韌é!©ö§sǪBÏíLO²] áÁ÷ÏÀÃÆ\­]›pߋޮgU ágO·|®¸h)uyOÕ 9«>ÑhÔÍ¡aÝ\•#ÖY.þ¾vbåû­‘n%ju>x±#Í÷Q¼ã&pûØžaŸ¡æ=Q ù¹Uç2wïus‹‚4Í,Ôh€j–°7åÚfPôöÊ„°¸è§êID²þÄz‰DbÅú¡Z O×%F:¹’ñ̦÷< ߬R¶–Ký\¤óÎ*µæF),DÚÝ=¡!9¿L’ŽˆÆx+š[” ê== -¿ ö«$Í ƒûºŠyBéâ@ÑÁÒ¾ÚSu6]χ{“-9w®KÚwŽÓJK• H¶&+»Ä&híد)c,ÿÜéÞMŽå’o'tR²T}¬Õr—ôÃm‰JÀ“zïÕíÎܤ3aæ=ü«Ö2"AGϧ))b°l ×gþðó*¢î‡1]+ù¶ú•yÕ€–ÁÜv«0Î±è ­ÛMÎl&–‡a4‚*"þ.ÆÖ¡p"¼nB“ÜïÜâ}ìF‡'õL‡Mhè¿ ¨¸»äF#ëIÕ»¸|§Zø›ªŽA•¸®€qL¨®=Ÿèå³k¤ª„/Ô¶ýŒÞ‰œ@Á¢KÞ¥-Tâ 0ŠŒÐ£â¤Ù‡EKS”™t›šŸµÚåˆT²"ÞÁ´âé˜Í´Œ¹1b[ØhXû5¤L¾z¦ð&çVŒÚ¿ÝÜ¢ŠÖ›ˆ@¦j‘à©,&Ö®ŸòèÌgœHWë¸)z½XÑ‘˜è½~ –bqMî),¨Î×2Õ¨¸9Íãeîyk¢4U¯¡ƒW@ÀÔ•?±Äò‰T %{®Ï}o·w¦>NƒÇYô>ôŒ+CÜ«tÚëª_÷€‡ßª,Èv[ˆï¯l¢wœ…5çóÜÊcÎÆ±Ñæ÷òÇ›§o2`¾†kA²§Ÿ~=¬Ô  å [cv2C[&ᄨz‰ÚGÿ†‰e†.‘ð-ÀЄtAËvÃ…šMŸÎºÈ×T=µâ"q¨ú`s:Ží ²±ÔèjÖ8—Ä\~Â)ùè/‚T_QÓa¼‚tC„Éä\gýÀñÖŽåœÈ}}‡¡P€hìÁ\†ttuwXq‘ #¸]èeÚOüÁíÔ‡ëÄC§}¶u$F“/ü3´êgv³ºü Îǃ†½jsF w;ñþKδÅ=»” ãÏ”yu¦üï1p¤o¥œ£EsÌý:â€% Xù„-lP-‚`±^¨`ÛWo¶+«> $n)’°ÛÛºìX¶>ش컯'ä”’¼'ÚÒ.t`ò|`N&jè\B†9‘ Éryg{HÃã ˆÔÛÛÐÝ€H9CN»Q£Œ&|ÂPµnêÉYùÕ êÙKT¬´ÑXwº¶¼þe}Õº“6+IK‰±Z!zQxص2÷Ó™"™ö8j=äRyÁÌ^ªgC<ÅñÅB*Á:¡Ç{à"JþƒÒõÞ³x«]¯ÖÈÙù˜$ÃÕ‡ªS@h‘¤öã,ð‹~YÁÝrŸ¶ß½û°I˜N—{@‡T)w|wOrËëÕjS\ÖÈ„Øí늆¹Ê÷Ô…5 „£€¢ËÑ:÷8¦w"Ô¾Šá@…Är¸ªžmÓx·»Qy«‰Jn½fõSÒÔaÓ¥·g’Ä®Ïô”z–Á.v`|°8¢ËøÒïg2~u¼‘FÒ_±cƒ„ÑÃN£#Útó!ç{«J{ž=6!²¡Ðõ0î>Ò¥ÞlSón«Sƒ¤b¸%rÃ7+:iÔ€E˪u[è9wë9ˆ?ôV›s‹m$ÑDu fŒH ²Xt“ôû¢@ÕÖK[|Øm^i…P! ûvvØÝÐÜ&F`àKÍÓñ†[1¯ÿí@Ëñ~Z‘æ<±ïÔËDJ­¤âpj˜œe:¢Cp."M´Žžb©+ žf[¤ÁÝnÿ×Û_ß~n_}¶”—½t—WÉîÑ=ÊìŒ#‡×K‘PÅÚ•‡™3µ¥]Z< Ð í0æC¹éÕ!FîÒp3~µÑ:—™3•õœÞ[^¾Dª„5ͦ^EŽyûU ž…TT¡‡wd½}3¢ ±KÚÎî3ysug%Á,8³n²äßGêt8XÊóÇ=úÜÙÇ‹ˆŸ LÝM‡+ÃYލÙ^Ú׿÷ú›I12ˆmþ`ºO„ž¼lÑïÍj©çªH~¡L7zë"#«–À«’6µÔG¥MƒÕ~Ùf…0¾Ÿ}Tkõ`ði:î(èÝ_«èþ`Ç¡3˜X­{Ò7¢¨ „GnÓ\¥^³Í Ÿb‰ xqg·»óÁ¿ðéÑì­F‚,¡ß0 )Çû€…Û© 'l¿2±tŠf¸ò¢géa ¿|¹h9E35±Qƒ¯ÿH”ªÔ NßTÐ ¥v­(ÆËk6‹;JûZ™f¦ä¬\¼“#DÜÇ1·Ε¯$ÊåÇITBSgðw/ÃF*ÀÇ®¡;’vrµ­ê†Ö°ªŸl;ÁØÎs+(ƒÌvOÂ~S^¹¶ö‘*q0GÓ.IÆdK˶ÒLqä–´ÐÈš“´«<ýžñqœùóÓG™gbUïC·È¦CœRͽ±7ì—_Ä6Ç®rˆ=ŒŸÕ™í» £UmóD?Þ®o¡~&öêÏIŒÛ$SËÁÇÐn*®†çÜÀßb)þ­"6ðNDìƒ3/Q¯ ÝLÁ\Œ|ø7R)-§­8¬‹O›ïðdæ¯(¸ÐÝtmfŠñãÂüÇ@Õp|+*$ Š6Hc¾e­G— §ñŸï(×'ê|¨e•(D$75Ü  À$毞 ¼«B‚6—Áj"’—C·³/ÄC³‰dá`òçZùTiîÙÉFÇVT/i™'»È닟Né­D-÷´Æ¯_i…e÷AÆŠu*ʾ#‡)IõíøRc[å1t’–˜X/5Œ¤]Ý_?êÛÀxo´yÝñÖh êÇõ:nÏ•rÀé&2XºYÐVøüUca²Þ+P˜˜-¯¿÷A|¾~S`ä»ú °‡0-©˜>­˜Ëçmþ”F¾™t$åôÙ˜NM*Q:¢*<ÇçèTWò¢bòñ|-óûI‘—>Ñ'˜§7‘+m1ˆåÌ„BZÆÎ¾ÔvS{‚zk26}X_’È%+Ÿ¿ÀõFU<}Ï00櫞f¢ð¥vPÐÒ»ò(ÿæƒÔø’ l%ÿuy%,éõ.cd¦ÕnlFîf€¤Ò°W²#(œhᨾeﮀphü´‰“ŒêÇPÛiV`ËNU¶ ΘJ†H‚±M%ÔÏ"¯X‘.¯J‘QÒñþQfþ8;W|¸C0~,Çyb’ò‹VÂþù‡+‚‰—Q=‘|¯½ [dÌÚ°ñ¸ ²¶×䨶zû„jt{ÜlBŽÏž¥p÷-ìà+hê÷Z*n¿ÆW«|28< ëÞ¦øuWìÒ+øÀF#£Ž±Î ÿ¶7íIÁ'I–Œ£œÜADÙ5UÛiµ&6O­FØ*ù-B]™•ʈ]YödUv.dj½µöïôæäy¯O1„TóœãÄ•§Ïú]€³jÌœ½ô-ùÛz޾+Eâ‰q††#¤x‡g¿çÏI »Ÿñ¶Öq0L£[(%™û¦ý2‡êcj´¶øeËñꦆ¶~¨í¨]3R”;œšë¾”1 ߈³üÔÚ »›âD‚¦ Å8•UÙó¦îòò=Ž)µØ%¹iñ¬ø LÀ#ŠŠ‚ÅN]XöQ9±‹ŒU‹YHVÆô'ùƒ~èõ ìÐN°ã©á²—’ëƒ×ÓLX¤SQ· á ,lƉ2ç® #Âzò¼aÚC…^‹ØeR^{È®þ,ßþs=k®?¼Žífèµòº-3ɦG¨Wp H–•ÝÂ%Âúªåk m‡„¤Bx™ŠÔÊã^Ü"À=}UJsDù ‡¶#ÜÞßH…ÂßÌ8 ÷ZŠ*ƒ*Áï°£ã  5maº¾TZÔèú³Ôÿ§VL³ÝvñŒá"ºeJÂ`"ëb×E:¬òÓ–¨È–4+|T»zýjd6ÃdŽOtõçÍs<1 E¨=|rý,|Ýõ$šd§m³„ÎK1`, •ª–,$H×ê1oªy:µÖ'mJL)¯_øÔ×çæÉêqŒf¿’ö0“xÍ}‚ú™ÓÔ+½Îy:ºns+ïeS®e_ʰ¾ò¬ °ˆ¢ÄdŸŸ§mr©M½u{­ãB4‰œŽó“X‚n‚Éc}¬<=YŒeslNÁKnI=·¯ì‚R½½BU­P¨P L÷­ÆÄ§T˜çþd"1ü‚Iæ!½&Ü.’Ú)Áq¯ûq´ú…@â½:Iº;»ÓXŒŸoÞ AîpÓ”ä%vS™RwìÏs«Íçiˆq‹¦{”ȃ;6ô’ì>I:Ïת@ÑÊ‘˜mŒþM{]¥Z¶Çq„źYQÃã\¸©Ê›^ k26ƒ^ïu›·_×Z¨Í˜ M±°»DB”a]ÝjÛóHê°ÚœÀö5H(ºÃœ-û÷Ö±R/8—œÖÆ„%žN\T7†äIËS;.¼ú¤ÿì·sYcRÉ,ƒ]ƒ2v¦&WâlíB¿ª ÔX¨i DbùÙ'š®ê5! úû9ò ¿ýû)µõIb`ã;‰3îÃòÁbuu¾Ôñžþ¤¹y°M[ÅÕ¾ëñ ©=‡à°iîî7¢ç.,Éâà}Œyž¥¼˜ïG®ÆCfV_0/0SoêòŸ ‘k¤=‘ J–”Þo'Ê¡øa²êäßEY2¥‹¿{5™+ âøz¼œÆ@ð v»"pÿë7„EfBÉ ›á¨´×-¤—é•AX d¥Ä\ã$>~Àí°…3,Ú-@j:N`¼-FÛ U Bañ·è×XÃÛÆç°f#03œ‰aG4‚Z«¢ ‘ÝmjrW® Ö Aû1åôWåä ™£MÌï·0{‡üŸMv† 0‘¿àŸxH¾¢› Tk «1_$Ú‰æaÒk¡@÷ˆô뀹Þiórí_¯i´_¥H+ÉõgLÁ½ZÃ:ÁÅp ÚÊuæFp£{ÉÿtÔE>?©Kx¶Ÿ… f÷ït2c´ùÙä6 Ð/´Žz—–Ef@ïß{Ç žEäƒjaã­NFSzG²w\qž“òùßÜcã×e:¹0„ÁH¬ãW¹tg ˜‹T:AÜåí°Y|2lHþøS­‡KÈlÙ@­(R{ϑųo Aïùå|¼‚'¸n!î±"ðkÉ&‰™êÅ{PâüOç'ª†ž@2ïá—&@"1hVçÜ]ìdŠV†‡£ ¥ïºßC­Ýb#«•T7úÛ‹þHÎç2†°Õ °~çÕvº:+'VÏÜù#ÌNŽ1Oûˆžä‘Ôc×@g:R¸ÆÔeÏ =FŽqØz“ D‰úâœ%¿/ÓÈeñ•:$‚—‚ò:”;éÛ_Ϊ*u[òþ‘ÜF¡®ÙÃq9l‚´SÖˆôôÚ9‡a&ݶmÛ¶mÛ¶mÛ¶mÛ¶mÛÝoÛæ|“Ì$ww7÷ùgS‹JUræ^öeÙ Z1‰ßîEöYs#‹È¥‚Æ’wÔ8|™”+gL¹^ùº™àû=uÉö ÞÐÉ͆ö­`r;¢O¡ GœÁ¿5™†nJbœ+YäaÉg¬}Çe¦Cèaâ²¾¼ÝÝÞ‚6rhŒáêhÚ™lÆâÝL³8™7Œì&¼³d÷mž}Æ·Ÿ‡±YŽÅ©,yQWð_på%3ªö”0Yø ž£HºÌŒº#„˜dŸsÒsŠÁ² ¨ç{ê¾qßÜèÕÖ#=O›¥¤Þæ…ù/fRƒ¥Ìù¼)U¶KùäsCI³%î§k§Ô‘K‘X')+3c™ÕÜ€<+šÜß{í¿L%¯’‰ÚÏ»Õÿ"Xvº%~G^¹)ÊŒä8¶¾©Üè#¤54™_Þ¤$ût$¯B´W/ä÷šì˜JYdYo`i{WTÚKöƒxw(›"'ãG¤Fu°•(2V ¿W ÷bqŸïW«»<ß× Ædã©Ù©O¢$Ndúà‡‰‰ Å’œ%ÚP‡g4–×›Jù]>}?c7BX{Y, Í'¿ …IxÊOür°µâQ'f¼±–OÄÜ!Ýæµ\^Ö„¬»"áö–ŠÛ…0;0^=T4ù“ÁI ŽùsèÚåoÔ/p˜¥‰«FË'Ipìµ&q‡^€n†4V•‹rZV¿‹š–PH€_Â1#€ø†4›_éð;\½·Åˆ‚ÌV¶.ß™œì‚üºC7ƒ[å}ì׮Åx*`ó(7À¯¼Î*•Ù¶fÚXl=Bðè=õmp>Z‘ƒbWÂÛA_ÿø3³¢dO‰Ÿ‚{A±Ö%¹Ã.i£ÇFÛAš\âïµö¦nÊ…aÆÝ¡`ÛÌ ×Þ×S=0ž… {Ú†ö³%4ÎYRLƒÙõèßD§6Û³`2ÝÕ nP †øéö‹Ï)ÛàdÒ%÷! …èû˘Û?®HY{þ<üèx«ä_dï¼ÚÁAýBåÏù–,Ð$¿<)š[êœW—8÷Oð†/XÝiÒÿ)€»¦z_<Ç|m[GKœÑf‹·”@ì°Óú¼ü«âÁ”戨mHtk"H’*7V²ØÇòžøÂ`ƒ^±™ö•pm‰ûï %&žc´ÖFlg×ÄB«nˆvkÝö »~‡XS¨éØõÏì¥IÇÃK†»xëÈ÷xN( ÉÙöî¦,Í]McÇ haj '›4ãßì”ÿú\PBcJm¶»NqƒUŸVÈÀTÄX©vUVÝ_YÂwÔrùx–ѵ*¹Ú é*"ÓZÙ¾‹½¼xÖCÜâü/µa ƒ,èN_¶ôâ÷ö\XEÀó€X¯… ž…P™vä¡Cˆš_É Œ,s÷ýl¾-Òåá럤UwNáQüFø¶ÉÂ6Ç”¢ ìd±áƒ‚?ø¹ëº©ï”f¨zKùúÀI&ˆâ¨'¤ ñ~YŸP ‰¼¢ëêˆp‡šÕ(ýñ˜’N®–^¾µ’è°Ê}|Ö$­SýTš!…œê µÄ:.%C0@äöõ¯V¦<"‚ÏÕN¡Ò]Jœ“¡ŸK7,’ðñÖfx*Á/³³À6̾„§~†Ò!‹„[Éî@îí/5©}ë¼C¨ì§©^_ÖV²`·±Š”±AV´îå<ÖýY½l,X¤ÒÁ¢—CT ö¬ÍÊÜt¬«´W›te˜­Á€ÞA`Ä=òs¶Øy;ù#è °Ç&ËÏÝ¢€G±Œ¿?6õ:Uy¦¥È¸ö3>\]¨õ§ÓüÔª=€¦"1Ä+# †¶Ç¥h¢øÝàG•j¾u᫇c¢Ù°³š>/,ÉV_"¢ÞFyÌü&Ð\Åø+#©ÅÕôœ¶tù–Ðט€(ܘ&þ ƒß•®ŠØ‹€—¦r„˜?ÁIT™O±fõz½V‡ØXÆ4¾Z³|^è®!C¢+„º§ Tc÷ûi©ÈÍ˺Ñ×|e0ѰŠ,;)Wê35<˜-Ë—h Tàçf8}²l¾o&#Ö’¢¬^šý"GA tÙníêðG‡‘³ïïí’â>¤W`˜bú7FúR3‘؃ °¬S#å}6Âï5 Á©w™)l!¥°Ì8±yG=Œ€›dX^x׉v•èžY'Ï×»Õ)Î 6àyÕR_úüæÊŠ>Wކà0oãd€ÞÉõïù²=•LOÀŒ©93ïðf–x¡¸åG%ÌS;Ù‘¹æ7&¦*º¢c×7JR©C×Ö…¢è ÛÏ¿ ;j ºÆ"_ëtî%¡Û«£ª—ú=«Ê6«d{ê¿zÂ¥Î`+K$H„¸ûh¡N;Mž¹ÔYN(³Ï)CNSÕÑ€žMÜ“3âÌ#é¬7£P°<^Â?;ÚØÝx²:Èô¨È%K«JûDä´äbkòœ—2“8¡ÍšÞ®4MßIyª“*=Âô}Ê®«¸‡ ÛÞ‰–ê\Aâõ ÃZÓ›©41Üæê9ÐBâÕûWG²P›³Ú H;·õ±/zô¸a’\œ%ím˜ 1 M¤û¶+†ÊâkbUƒ3Í>o˜<‹1{]Ù%î5 cJ®nkåj2+"'  —‘×ù0÷ú‹ÆáÔŸÆrü{ú±p‡ˆÔC`Î8 ú3ê;€È˜°-&deÌã5ÿã —Áâý¡èWK"Vô^ê¼×½á¨6ÀLÇ6—ÅmjHŸç‰/_–¸ìíeÅ%|4d,Y» ^Bw-UÆ¡÷¿¢”4ËãnB™R-uas”]]ê§›â§ÀJ2·UÉ ÙÞ}ôdä(ìµEü3YŸ%IdeC¦\×øvV !(c¨¹Ø½á7)3UxøuÄ,à碪´ß4thoúeŠPEíê?o¸´ 0ÍovŒü¥"T {S2¹LwúÐÞùð¦¬wÖ“5Óê­”ªo Hàä@á~îSÀP]§Ü…„ÄÐ9L(P6‰ÍÀó$LSòjO6úL6À§&G³*[Š$uÖí o¶aÙâ Á†aÿR{Y,m,, W‹œøQ&í4Ð_u÷Gµ "ï\iT¬ôòª‚óÿ‚ʼA&m =>!¸¡/ŠÈש¼G $¾sè7UÞk¨2¢:u$©fáôV&®>ôD²çiN¤Á±ëçòjv"ß/ù#[&㆓Ñj3úû}–ÔT çG¼W§ilC°†¶5€0†–w“ËP–æ)”)„ ñƇ”êܵÊA!Ç£GzÕ)5 ²ŠÞªú]åÁì{cpäët½¥§ †ð;çoEÇO!K¬·×r¤’”¨ûÐ3_Ë"¬òN—%…Þƒ‡½^ÖÚ‰Ýù æ_,M(H0ô²NOHZFžÿ1ª7Ò@ÓxNL£l8g¤-2?B.ãùMf–iî 5L¼ûPnZåyW$ô,¶>M«OD½8Ù¼°Ê‚z¥6É_l‹§TZÁª’Ú9HäUqF‰–ö Êlf”^«çyÖà¬Åé0C¦k9d¦@¤’¦OïoߊŒK}sy‹›³g—eß5¤Ybõ†¤‹hÂé£ L„h%»ÞÚùÕi•_NT"7¦‘`L¶Ãu7±ê±6ÖiãÍø“€‹UöºˆðÒ·ô¡i¹¯ 3¾ÙeU›¹îò‰ ²™>rޱ™6†˜M{qñò¾³Î§Â:žy ¤Ž­ÎäEé‹D…8Ïeº¯¤—O9S ¿­Ã$eV¬3ß âjK‹ÜuA‚ƒIYÑ;WÃóˆ–ê‘Ê0ijcXâÛG¥Y“Á·¶PHV”ÏØYÌ$CÛJºà·À·#8p˜Ä·’›mÆ7p“72©¢¾qñ¶}½†²/‚½Œ°îþÇ*Îv©ù é÷5·æåʬMçõ(ÊݘêÍ侘Že¾`E&‹&Òÿ´K“j¸s¦jÓ’ KëFfÝ›Œ]ßþxÔá4ýÖüpDÿ®·¦mÜ(¼GæŽnD«2Ý=Ë(ÎT°¢F_ˆyKþõ¡ÎßYÁôÔ öö·³¨¦‘ØÅ=§*ꂇó}]-1‰m±>J›ÐÃÑð/üñÆ4ÉÌx( ŸÕÛ§¯’hÄ>"¹S‡ÎWX_žØÔnêO9:þeš„$4Üx $Û\„ß?ºs”O»cbI—RUÜ #´G á8}Šß„R*zÓsá09•„C?7F_Hõ<-•ÇþOÆ}ýôUfÃ<ç± `’™V3ÿ"qš/ßÐç }š?E¸ÿÏ ÷RláiL'zuù eÐM†áòs‚rØMÝÎÊÈú’ÿŒ­Á{Ÿð#áâ³›ÕTDÎe‹]ìBŠ}œ®?D4‘µ1½¿AÂSºb¾ ÐØ¿CU"®U¥Ü|ýaŽ=»wŸ2ÿNÔ¦X˜ÿ·ŸFåKIª g/¹g‹„]ù¶~:>Ñ&\ Š¸úæ¼é“GÑÀ¥ Œ¯ÿ'iH—ûRWÔ<â[!ð¢þíF-ä"H¸›¼¥©šÛ¹^R¦ÊÈ/õ~$@”T1æ=³ø[hœñ\\>…© :Åõv]¼ÃØ6R‚ –0¹[7­¤`¥—¨Î¸ `ïþ\Êøž­†ÏéÖq™‘‰W‹óàx"?ýlÊu§š–;g~ÙLˆ@ÃÈžS1‹‰E”¬Se«D\½„$ž¦G‰Bû“R$I3ÿ6а~8¡ÐÕµÇ$kÑÌÝ8,¿+öèéþ¿½éy6¿Î¸(’ÊÎD.m³,Œßjm$I4T`ÉÕ×·‡ˆyô´T ¥ªðFû4òÐý”%º)ÔEÎ?ô=¢ßnÀÔhJRÃröêÉ5”?î«]:n+Ù§ vÞÉu&6‹\“ùÖ2Ô@:ÿðí) œ…YùgΗÃò–Ígð=ðR[œö¤r‹s$gÙ‡Aº¯ÇyÛIu4+ÚÃbУñû§Û#ƒ–õ¥º–P!‚64:fžÎÐòÀÕœyØëáT}–©éÂCçÉSÜqµáª3Tc¤èÃJžCvFȵL"“Æ1_®¤AÏ~Q©OÄSîkâôâ(fµ çÊŒ$ÝŠr;¶áÁûÝ ÞëªëŸšü-uaÍ©t˜ÀïG$ÆØðBNAQ‹°9Í…‹ÃÍé@"?[‹¯¼[µ»©âº÷#wzöù î~:F”ï” Ý‘'îd?š”UÚÒ’Á‚yh§AËd2FZtjt±C¬NÈ[`“v xžz¬F¸út‹kw_Õ¡ü`}WIÜ9¤³í9.4€( áÉ %‹yU3@ví5 ]Qõ´ÍÄ¢Ø0ÝÔÞdztM(y×ô}ÃRÍêi?ÚÆXGôŠ Æ®6R \N|7 .º[§–†Æ8Èö  /-ŠA",í…5C aŠã%RÃl&æ=ˆÅNªŽŽYØ(ñ°ÝaÖØØDˆÏ–{Óø¸ÏòSzˆGV¨Ÿå%ŽÕp6ä¼ùõ† hQ¾àUÜ&ŽM*1À«qeí’bȳïÝñÆ¿ö|Ij"Óæà98 eÑ›µy^øo2…R÷ì` Êúg{⫇ݵHEoÈ`Zœyr‘ìŽ6…%%{#~¹Ä}ÞêòÄÝÔjÉfuA}¨m}ãBI36åN…ý]e;l‰àHt¾~4BÍ-ѡӟBÐ 4Ò Š¾Ž¢Ç×-Å;°ºzœ‰P>@~ÂrR j¥'Zþªþb’ïLä_ºMd¤HY‹sŽùù^ÏâqæÚ˜yTϾïñíñbÆÒº+.h5oSC—ÒîBî'[÷#ƒ¿/^ôqqpDÊßäÌ”žÄñàê„ÃDF|k_,'žÈQ/¹S¨£§ÛÝz~¸1F¦¸\!Ù$äùZf” ]f!eæ‚l Ç1W2IkOxž£\k€Ti5² ½¤UGÌÕ†]A«!4?#NRo?“A¹j5Íï[¯•Žø(»L• ÍýAwÇyÑÛòV{¿ÉYäï¿ ´þsï H'bæ»?LÁ§Å] „3ò·“ÐìÃýµÈgb¼öß*}ÜûÐÉc>{“áÒR½1°Ÿïs{TW]”Ý€§% ²°í­r½ƒâAŸ$¥ÕâZ´ø´—Yí•é­ä´'ÏÊ»kçìhµøÒ|@ÿ>ï§°k¯<ÊMŽîÇÿ-*!x;ŠÿýÝ/^ôržìöÎ_ör«ã)` ë8-ãz3¨hãKÀªÅ\ÍÛÎ$IÑíhÿ ¢¾ž¿r$€7p7~J=±ÀpˆBðð.zBÙ"ù:QçîŒî+úš®·,—@yÒsoY$$¡al>·ÈtÔâªôÖÚ& é‚ÏØ°Ä}/,ˋϮŽâš¹ ÜÎ:1™°Âu)g->4cû×jÑ:Ÿo—† =[8[h{¢tìY¢+¢¦üO$–_ƒÍô¹ ȱ´·¸ü{Inƒõ^f¦§+6qnjŸ}Êü‹ýü ú Úô¹)–•Àì\zeÝŸÑ'b(ÿLÏÑŸuTjDÀçÊ4¹êúï˜ü¡r‹%' çø>aêÇ4Q)#ë›õðÔN¡HÈö}Nàæü*B´¶À¶Ãºn<äú®å 2i  ^Ý%e¯A®Xk´«èe§Ð¶## ä”5R–î’‰¿áжÇ”;•,BF§p4V|‰ô0,fÿWÃö~Ðýer¾iã‚fÂi9#î’o‘_]§×âyH€¾J•Xq“>Ðò™éëÜ (ôÜ­µïtö:ìÒ$GfgæðŸ.ûáÔGOA¾–`*›V({Ý)¬ˆžâq/> •”KÄ\Ÿ8VNz²AçÑåÖǔʹ£cVKšYi_F4€^ÈY9ÕIàÅv´-½És†g™W ©4³”f ¹Ü«2Œ†Ë¯—…bÂ1 …p°ÖÉ(úñ­ÜŒ]ï@È7ewÉ…£üôiÞOcGª$±ïQiK4 ktÃØ…Ô&þ‚S·ø4ÚÂtゟ†6àœÇÊ-¢Ê•¤ÇÒ÷©Ï­`FV¡Ç7º&ƒ ƒy `Þå;¼À&Dç’mZç¾÷²z3ôœäC·Y ã7¦ÖÙp˜ Å‹=œ±ä™+kÅÌÏ (û½s‘gbC[æ$˜ÊŸ’z”µëa“‚õÍ^A2nGù—˜¿ª¹+¢Rc;þ f—‹C^ OôvÌ'쌨˦›•>y2cý5Yâìš’dbÈOºLˆ\˜bJ€)%jBˆ×.+¼\b£oŒ³¹#œ¨!°ƒ [ôœH·qȪû¾Z#àJ5:8ž¡ÍÜËÝAÜáFÖØýíf¥NÎÐ7¨”û«c³§*XD!¸(£~¼ˆwD‹ï¼ØÍËù¡ëÎd%¾XÝ §c I:°Q ntRóbÙ~«˜¦1¸`]ç;ü”Ù—Âã'ˆî _±ÝÛ#FÅzÞo‡fÊÁPI@ɘ].¤•MÍîˆz»bEÎ7ϬO÷ݚǜc'q‰û;o†¦‚Tü—½³©Y 2ÖŒç÷=(ÿޝðÝ … ë¤ttTû'©v¯mÛu'2µ_*ElWC«x¿ÏXGU4ÜûQ®_ùІvx/,§YÐáZ|K3œöÍ1W,Ê1ç§Á¸Þ)šÀ]mwVt½ˆµ12‚,ç7¯þŸ³Ðò]4¦äXxcp…Ô8ú8@ÿúŸæ)Uù¼|żÿ¼Lÿ¢6“d…( »Æ‡ï/x›w7uÈx¾U;‰ë>“‡ïKYýu™Y[úõ!Ο¾Ì*x€Âæj1m¾éæ Ѓ÷¬µ0Ï7{%K©›”.­ÓÎ|W|B ò}ýyô÷^ýÓŠRÛ#aTâv6ór$ëëFzÉ”ñPñ5Ì¥)?+K‹ò˜AÆš}±[…ŒFB’ñ3džðèÉdlŒ0Œ&Rvyª3ò^vTˆ‰ýÖIh“Ű=Ãçëòn†¸ŒýÿmH€ŠWP ¾%2Þ蓌L©¯ôG10sߪ¥(NýQ?Ƀ½±ãÃq¨—™>ˆ½ù†ü±ßöµùJ½ÍØ•#¡«Ci*ƒ.žP|&¡…>ÞPl1p:N;ÏÖOªh¬¡dbðh Þ¬îÙ€ÇJÊÉŠ?Ýg¾Üh™6m£0ˆ¯°¢»%'Aº¼¾‘u«³¿EUg«½ÆºvF3?íQØ[ êž6Êúc¢ðÔ’ÜöÁÀœ·äíz;G4å†t¿ÿåÍãbÒÁ¦îÎ<•çGq¯œÆDY¾h×Ù¼¨9ê[ÖÀ2OWNÁÂërÈ£iÛ”¥á¡g}Ïw,*ª"ø<7RbR~¥²`nçšDö2’Q„,ÕJ&FÞ€™J¡3%äú%'74²s½èéÑ«wºªfVåjs7a êñ2#‚kY³+P${F…ŒhXʻ֠ÎðŽkôM”Oáô9zÄø<6§è–?¾/Qñð÷ C˜ vÒcR\ñh®æ~³%TZßÿˆ¥©Ãˈ;þ.Ë– aŠyšê*ŒÔ­¨×ÿÞiU“PÐÛ©'¤ët$‡¾¤Ûú41–θð=éjá>?Q9|7HÎòÞ‚C›{µ6\Íc€[²ÉÃXͰ¾‰È#ËÀ_`ý2œÿMÏ<;‘)×i¶~îËd‹™½´#ùl ³mò3_ûN{¥:TC _K¼vR $ž˜ [îo(¾x»ÄûNà’ Ý´k»Ä>Ò`~ܾã“b4ï|ûîjͱ•§ ¥q óD§]ûïÅBYu½îH¹Ä€2U¿§ØI3£üO)ßssÍÿáà[('l!V²¥Ä£ÒeéA^e¦«59{Ó6¯#ñ)$ì @²VéJó5†TD, Ù¡ÇC£`¹F²”“’ðÏêO–*þCI÷eKKÚÈ…–xåQ{óM.¡G×ËBŽqìð߃…å~£ËHS•j{0[&ò‹6Í4©oR»®Œ 2 Úr3’3#¨¯eÖþ»§Ûâ÷óxG%²ãìÚS‡<#$™8ƨLi…Áß÷¦NxèC ô°³ga–˜äÐ%rØœE–}BK¶µP’@KŸ´œdqèYO0fɧøÑ`5ÑwxÆ´rÏŸ˜ÀÁÑ!GÈ‘7ü¯U‘ÐÚrF[cûÏhe&6Ô¥"¸óY…ÊHhqGí!£'bòá=5°{.uÊ‚å8<lÛè’¥ëÂÓò‡Mpâ,ܬý¸ÖIlµ×4Æxg§±örúþ2U.·xBRnsD~’TwвàÞx¡JòtÀ?–…]-÷Œïvã®L_¹ a°½äÇ0ïJô(Îû£zËWõóSõ0€±è²ø‹à-Ð*W³,oG+‡±Ž“ Í%àÊO„@ÐÁ#ø¤M3yž,z×a0]eY%/ŽÙÜFrš$´¶z5ï–¤åþrík@–Ýc/eÙîEõ#¯§b)Ñz|å<ʱÆ/@í  ~µP›??ßÊT3{u½UoçNÝ~3hzø{—gwe(ˆí({kë¿}Ò D—Àjž3EÄ8gÞÿB͈ªô?|裔zÉÈ`Þ0='rq&ü³Ì¹ ë èT:´ôÑWá¿^¿Ï;’Béd¨¢’ë3÷v¯ÜÇ‹ÏÝp_£?ñ„^˜“¨:ú÷å+S¤ˆtÚ»ŒˆDU5L!’T8ƒCÒ£…­+|G-žÁÏS—g»ë±WI‰ù ˆ¼i·O¶¡wKÇÝÂ^ÿº ÆW}é­¦%Z˃»¥k™Ÿò)åºÖ‘‹ì*Kû#¨d‹k×ýqÀh¢Ã2ËôPLºPôÉ2BNCTn¡ÿûùá»NƒÓç#éé&[»ÊT2T©40èY£g|rhŠŒ k—nœÀ„¸RÇ@’S=è,‚³•?.‚RïÈÖ¾Lþ¡׌â;.ïÌí/݇hè–Zzéxg–ÖFW†S +ålêcR€³ŒÃ[¸ ùŸ`»õ:ø–Á£ëb\#ûdÍ›×)6·¨| ‘^“'E8étj$³)üŽZkÝÍÏíª({wTèø‰Äx@l.½¼êwÈF,L4¦&ø":m€ýÒ+S&ÛÝœÔoqÓ”©K×ÖEpÜh3 wfY®[œžªþV ,ul@`U)ñ8• ìr‚ º:Æ/S4Dùx zo3V˜Ø^ƒô9¢Ã©:ÙoA¿J©¹Ë’}|ñ6ocÇû´ÙŒ“ œG¯«i¿KÆÃæÜ-#1·—3½ḣE±âó°ïmšÓ-WwæxóÜϸ€ÉUÉÑHž[TÀ~¯‘_K_? ¬ˆóWƒšÏ¼äYÄÃy¹àR¨!(ÈßÑiy°è0¤°@ 0|´mûB² |ÅŸ¾,€6϶ªFQ{ôaÀqÞaKëáo.ÆzÏ5p­^‹‰V¥Õ«É~…¶›×·ôdbŠ©ò6ª"P{ž‰Öt—’CØ ÿ½:¥e˜üŸÔ ñ9¯YˆÆêýú¶ëȹ< >{ôÅÎÒ¡øu2EÖ?éØé_\29'L#¾ &0`ËÓæ=:ä*ªf8˜¢Í_ÓýŠ0û€–ÉÔáû£ÇÝæK;Œ ìVÑ`9¯‰”?{Hv¾‰ÛƒZa⟧¨úŸûF3Œ•t@JQ4üí–×J^O4€Ñ?n½1¿ ‹“ëÊh‘†œ|î èra";âðÙJ„E %Ê)VªÕâ(ùžÉ\m²n"³)mÏ;IÈz0˜²õ¡ Û,Óù’í´Ó'¶:¹=^ÚÖ”vüÙÀL2 ß%Zèÿ¶âƒÐ5pøŒÆ“–À÷œðã¶2[îö‘`ò/ÍÑÎ$«Æd„W¸Jðe7|ÒAÛe5Ï7‘^~Ów6J¼Œ]ŸG´ãIºÕÎXj§Ddì2ã’éÉX!‹Äì;¾ÎHôã \ÆIINÂ7Å>y µ Е–yF‡Ñ-”%*È®fkÿÍ¡=ª·3“MaÀA?—•†•I.§ faótózÉǰ‚º þݛĀÏDjPye惮îf.QK§]!CëL†>õ4gÏ\T5«ã~Žl¸"ø††~ñqy(ã3œˆ¸'§ocâ S4òÕ°-q$…Ä­Ú»%‚Œ^àW”rËðòñ ßÂ6uKV’¤©¹Áóbhe9‰‰©/¹ô¹umÔ &,ìët÷…õ{¢Ÿ5§Êr×U•¤ýŦì`I¸ÔBKv ï9`å9§+u[\OÊG Ú{+%&aë‡!þë'òM "Òkt€·Ö¬‡e4¥ïÚ—ÛüÑcPÖ¤Ê †3‰Ì 3†L–…m%™´!¼®nAùJÀÛ±4ˆucuèÆw%@R憌Usì`íÜËßšÆG¨ÃouÛ.SñHLH4 ³´d±°XK#¨f‘…îæ´F3Gày5þ Í¢ÍöM<%"±ÜÏïWTØ0TÅþê<¦ÃÃ<èEäú)OH{u¿ Ê׉@›p?R‡‡Myí¨E_NRü­´´MœJ ±ì‘ˆ´í·\#ÕÝY¼¥`.gk…ïŸêºy¾8ðXšV­³w&&­Ÿ­?‰2&D^=‹Õ}Ù8éÚ&édà»ÿ1©‹N2”0D‹¢ ƒf§À]_{Ÿä«ØÒ"tÕÞo:WÅ6Ëû\{ª^ñõ5ó©)eúïFQÒñUàH(MK´6×(“¸ o¹Ç?ßÚô•°oì~ëà®#Ë3éý‚Ñ5§* @ŠÈ™µ*œêÓÙÝë[w*éܹH¨Õ™_«r²†r-f*>ñb6he«ï5âš=1´\Q©ß‹€NÁmàÊ•‘OѤ³õ?G=·1л %µ2,=Ûݽ³ñYj¶‚bdNœÜý3½dp…é -KšÞ?Àæ¿áβ~šLó÷†>]4¯97=Š/=hžËúçÿ§ší~ÞÿíÑ£M¨ùô‰åÝÑQ9~À5gjÔ½ô¸Å_µ=†è–hõð³&k%å0¸“M •—*ß,0̵l+};«†{Õ•ÇéZ~0 ªÉg.Pð%©™cXÚ€þžÏ±¹^eÐQOÐOä5o[à«èŠS2·ÿ7z¦¨”æL€öëô"ó¨Ûó7}èæÝ\ 4ÚîúW4‘SžÇw©úÃyòÓ¼4 ¹-õhb xÌ ÇfrÈXÚìä®Yó6Ì Û7žú˜ÛÕÙEá‚¿Hëy¬¨y2ŸøGÕ+ˆï®GÝÀO1‘»ÃfÇÏ ô|ÔWBY ?AºqN5nm×O òhJ¸Ç–…sO±gzI¦ÉÎw Ã@kÝç¿otÔ. &—W³f×ñ¢òÉs®)D¶ÚÁÆXߘÛL¦$»û o*ËZ>ÒTÿès-14üKÎFmÇ;¬›Î朩G1&Õ·ñì’¨T‡Ý»–)—u º­݆Ô^ñž5î¹__|Éæã¬†cýÄޱ_œžÂÄf‘¬MB ôqFÍK¸?¼û¯ÙÎñ`Ì(”yv}ÚGŒ„ ¦¸fAÉ3dL*¥? ù±‰¬šI0#‚j”@§ÖÖ×¥kë‹4‰¨îŒ_UÉg ýi÷Qåúb6äçX¤C0ë2Ý‹Ôaf¥Üm,ˆüÏe\‘Åé8Tëþ*ñÕʵ ¬·*ÉÑ!ŽF˜®€Ö^úY_pZþ6äOyûwôBÑ ÎX$}プ ÊeR¥y·é€ö=ÂÓmÓnPûë0þf¤(¤ïu÷æv€GŒìkæ?Ä^i}ò†þ§~­²éjm *F¤ÈÃßHw¦Ì­ÇdÊÊ \{´¾FàAî¡˜ ­iØE_WŸ{ ‚ó›À4>òî5¶Ng›ß*–¦fÅ*ÕèÅòåêYûå¼üŒVÝÖâŽ@ $Û1׆ "ÇïYz»ýgùQByJZáp» M…zHâ, €DKžê¯P¹JÝVU¬õµå…`æSÇËÀ°dž³Š1e²Å•ÆIM¸\qnqü7eêcCAšÅ\ǪŒ®Y‡€ë!‹O6æpYo8|ŽjašÎ⎳—ÕO\¶®Pa˯ƒ%é ªÅüË"™Ñó/®‘bmè6˜z&˜<£ìT9xHÀvµqÌ”ðlÉ®±ü䙘ôpy3ì‰}ÂàÈI%§à’ñæITK¹z¯_ýb{ƒx¬ÏýºÁ߯èMJT§Ûà ·Ô‘Ý<Òð{ËDå6‰)j…V­hXx²Xœ"Üv31«Þ¨Ý´£s „â6CÏHq«03Žp~uŠ }Ps’÷™M½Tú£§ÈÌ'ìTmÊáñ°]çÖJ¼2£Å#êjÄ™òq›U›ÁA%ú7lÄIH!f°h¾÷C¨.úù=}.9h•]ú\=EµÜ·¿{Yvg¢Ž´ÜƒP+>ˆL (½0ÙÂɲ[U÷ð×vŽ)3Uw¬eöqc¼š| ÿŒÖ¢}°À;ϫԩÂÝ@Ûk[‡W zdªóŽe`0ݤ—Nîùh¼B fïÃèéã[-þ/õÿÿOŒmL \ìm ¬¡þ iÕÛ§ endstream endobj 427 0 obj <> endobj 428 0 obj 777 endobj 429 0 obj 29181 endobj 430 0 obj 531 endobj 431 0 obj <> endobj 432 0 obj 79516 endobj 433 0 obj <> endobj 434 0 obj <>stream xÚlºstgÝÒ5Ûv~±m'Û¶m³cÛ¶m'ÛÛ6:NnŸçœ÷ûîyï{ŒÚ»fÕªU{Öc¯?6‘‚2‰½‘©˜½ =#7@ØÞÕÉÒԉ €‘‘•ž‘‘žŒLØÉÔÐÅÒÞNÄÐÅ” njr50³˜Ø¹Ù˜¸Y8L\\œÕd] Íÿæ°03q2X¸˜˜8àÿU^ÄÒÉÔØÅÞɓῶ°¶³w·óþoÌÌÒÎÄì«€AÕÎÒÑÕTRä?©ÿ™›ºXYÙX¦ŽSc ÿ6Sñt0ý'Æô/ÜÐÎÄ×ÛÁÞ`fhãlêkifú÷€÷v6t3¸8¹šúzÿ¿#ÿíÁ31L,]F¦æ–vðÿ”—´3³01þÿWCÿ‰¹™:9ÿ% @ùâ¨i3±·³ñ˜˜šÁ3ÈÙ»X›(…í<,Í-\”ÆT™ãä¢ýŒÿX¦,Ë?–ýËñåü3*€²§³‹©­3@ÒÎØÞÉÁÞéïDLè!€Ò¿j:”LMÜþ¢ÿ{1W9CÛ:ø‡oÀ¿øþÿdÚZÚxþWÞÿNQ7ýw÷ÿË-Å,=LM,]þNã_ìþ–t1´±4²3·10þRµ31u²±´3U°w¶ü—ºtÌ̬ÿ+¦bailmgêì `cþ'djgò¿þ;’ÚýoýýË’‰¥9@Ùå¯ LþðOXÁÐò?jaü¿µþñ™þ¯/kèâdéÐfü;S¦¿‰¯ÿyÒüO»ÿä¿Åø–þøaïáMÇÉù÷ÍX¹ì\N&&ßÿjߨÕÉÉÔÎå-ý}·ÿñÍ,ÿejêaj £+‡["r¥%bcdÂŽj£%DÀäŠZ=ú;``OÈöb?" ‹†¦‡˜õI~?M,¨CK7ŠBq_¢ 0Á¤‰UÓ¹‘€5ƒøÈö8­ø8¨MI¹“hÛôG'9«ÀxôcÄjÇá˜BÇuФ˥qëÔ“àZwÔ ÷£(î>íõ8—Ðë»J¯Zþ28­wÒ…6v臤Jžýº”2О¶ß¼á:Ä'P ñ(îù$½kP&d¿]޹‘ˆ6´“*Þ;±äUvŽ“€¦}µ6#Èáyý‘­¶|ˆS£?TÒÛ"Ù}öëYÒGßJH‰3Ü7ì>¾ôJGgçY¨ð2‹Òë >êùù^™µV¯8DÑØ†]ÄâfƒBõ/9O§ŠhÿÄx_,Õ á‰§‰XQ^võñ…áñc$ÆÈ÷»Í­YX£"ºA™tB—«w1À“¸Ç:Ð9µ:n‡üªJ#QLûNÍåv<ïÈñ“V™\Ëü†7 uŒ¿ÀX§„añ,k$gã,WðÊPÕ¨­>Î;7óüÉøáû%‹m¿¿ŽÔækôvaˆÿͼ÷üªHã7ß¾aF˜ëÿâv5;“‡°}ŸGû"þðuíMz¹efst¨Êsì8ž•Ÿ0ö925ë‰}“ÞMijœòœóÀ4¶gâE·Ì6áëK/™txÜ5œ%ÀAŽ{Ÿæ×·Ï…´Ð| }Üó*×táÙîÚOg¨ó<¯pœ—½ord¢;½OìwFI×ËŒqÇ«:å: ¾ f¾.Ï<Çaˆ$8–}Ñ’rÎÑêz~YKamÜî??¤{JÃ>µŽ' ̺24ì–4v¯›ñçN•> Ã݇Gñ‚|Úß 7Ö@=åE¸£GÉ4 RÛƒ‚JMhx \ÍëbGÓ (¼@y!HŸÖÉìø%a­0˜ Ž [ë×úñÕYjÊonSÑ‚rÚOÆÓwKÂ"äüÊÕŽð[›¶ª‡Ãæé™0ÖØ”îq’™3UPz ’•û¬Pucè´Öª;5V?%# úšqŸP†uËý(Ò±—dhœ°jmòô‡Â¨û=Ã"!…–·ƒ=öªÕL®öfR|Gõ‘a¯dÏá×L ësƒ?ÈiœÔŽ*Ók•ûà;²ûÅ%˜_öÙz1ά·à,Ip¸i>ùÛmA#üÞÆ4 ½?Wók Q”òM Ÿt ±.œ%k½mÌ€ª ß$²õÎ)-kÑŸÞöxêyþ„ÿÜ)ÑÇxH “ÂÏB ƒ‹ xúDßà s·¼${·y"+Ï‚[ÔŽ@ü%bŒg§+\øi!\qÚZkœëŒå§Ýù”†¤!Ûó+¶|E#Š/² ü˜³+Û„¯‘¡»õ8}?~2P|Q|\ :/P+Cí¿¶‹“rqÚ ‡%‚»¥<¢R›Šî¥—¨ o‡"½ö6ýqÄMÞmJ÷Ñ‘°z}6a5(Ó˜ÎÖç —š‰·æéöë”?ÒûÀ!ãDú3Sâð¯S Ç»½£"´6´ßVu—ˆ|èdäüâ;ÛúÐV±pñ@4üþáÝUÉBõÙ¾æ©Ûeu"SAwuž4l‡ü·íLàãœ/{7úLÓÞWÅî÷ë‹BN*w§¯x~£“ªbPMpí6³‰„ºë(Y_ŠOâµdÂsza‡é.ƒ³¦ï[Bø±õæÓÝOQ”á$üþ^+XÓUŒÖûKª§j‹lÇd×ÐhâÁ¼ŽX^îe½¶yzSǘ6_ø˜«Tc š9Ä-!­â/ŰךžÓ(mÖŠÝiË,ÆÿbÀ²ÓÿCÓ‹®ïŸ[ -9쓘Ût9Ú˜_´Zº!\T`çu¡`%W¯«`ûp)BÅz©ëùÈgi+©SŽœÕö«…>ÛYèœö9Úu—Íqñyj݆H) XX†>Äš…K·xŸMÜÄEZä5ÚuO1¶Õ‡âƒ•G7ïýÙ.Š®}€/ˆ—ˆTÞð11 Ús¤ÕZKed¹ý¥¼Moűsu¼>‹ÁdðaU¦¢ßôkEø‚­âT3â+Ä+rifZ²=wà”=Ÿ$• Öe˜™žÌšßcãmµÄ[=oª ÑqFãaöæfâmi’ØìäÃêôúb=‹°*OøÇ/¤Iдñ—“øc–™<ÆÈ™LtaÔµlõ͹Sä€"°Ÿ~릿 ~ÊY¶±ÔžOYÿ‚5 s7£`ÚÇ8@;&n6&…ሢDb¾µÇºÇ¿²x¶ ÁHCWGêù(atªŒ–àÀ2d ›1ÏÓߌN[ûö©î1`þÀc¬‡}„wµ,yc¦7¼×fÏ›f³‰ŽÓ¬50ÏøåÔ(y?æç——”ýã}Œl~ùxèÁwõF±Ãgc`YÚãÛEȪ£õ@â ç”Úì{ FKg~V©Õ*÷þHÄÈ·ëöËt¼Ò:x4N,V”—¿ãâåÖìw Úy´;G[î­)Q¤2 ø¡Dåµ¾]e÷¬É9¤EobͺŸ% µl—»'㤛¬Ë¾jåY )ø*PÒqðÈmaªÆë8GåcÚ™n:°ÛðDn’çgEÊ.ýØ“ ôîÈŽþ«^Ýad¬ååàæ1Œ¥æñ¬®.ᙊçÂJ(s/&Rçÿ£7Ç2=Û¤ÅÓ Vÿá=ê±:²×Yð°sR¨–ë*U „Ä5càâäg/°$ Ô]3z¡ Ò¹#þ³Ø‚'»7ÁÌx !H´OЏá îŸ,NŒ-¹¥¼Rð£ ,6®—Õv\-E•J7D¦#§vŽDòÐågãYü”Õ4‚E)·äÔ|iv€Q÷W¼?\ÙîtûšŠ.Ô…Þþ¢Ã¢i½[¸• ªäÿȼîþW 8xÆ3xÂz½[ûÊÒç˜èKÚû ÒA@ã–hÿt¯~:Ï»BîCtgXÁœ>Z9œaiÜÅ„²‡÷—¤PÈÒ’©ÐµSÂÃT%ø:¾},Zdm:{I Ó%†èï U_<’kPÐt>˜+0o|Ž}ùëÅ”œÀ¾’Èt>Å5ògzˆ+0% ªWÚ^mKáæ¯‰$#W·RA†ŸP1ÛµT‡÷s9£ý™Ø"Õ\ƾãE©‘K›®Í¾¦¬cÓÌZQj%ÉÆ‚V!iùå£j!¡6²üd´_á¾í8 $5~.ÇÔ‘l_¹tôe£f{†ôˆ,¾ò1±yZ[;ˆÔ¹"ƒêd«®X”Ö6ßãTÍ-%0˜†xßÕ\ݶ_ØJU'æŽKÓ›|(z³ ”z‰ƒŠCö½Ó¤€Deþ^~‚'Æ"!ð5öY¾Ù¨¥ íéU ˜ ·6D9º‡»“ZŸÑ"\‰¨tïOpìRLà/¤ªp6 C€cEoŽøÿäÚÄ™òuò.Gºp~ ¶¹¿¸þ&ì׿èu¯«ÈS}ú–H_s0Nc£u´x¿§¯‡÷ÓdŸR-HC˜ÇVp©È`âë¢F‹|´†jR3{Øô‘˜OÒ&cÿ^¼¯¦ãݤéu*ã~WÐMÛK¨€˜Åæ~nI·Aï½çéw»t«I}¶Œ²$á´š³i@„ŽŒUªÅ%vŒTÿ)×õ‹?6bX¿{Òlj͡eòh d¦p›(„oŒ1ùM½#»œg¼éSrgˆ„f!gcŽH“m<ÜU˜‰óQj§éÐÞ); ¨§²µ‚¢˜cƒ]b?¨R™‘ì V] ±Ìr6Ù,Úï°€.߬²^l ?†¶+ Ì .c‚¶šmæ¦ ™Zø8š^„p  ¦'ù Nœ%¶n°xƒÓÞbW]Æž¸¦‚…¥šÎ»¢Î>°áËò䘩Poþ 4tpÍ–íÊr:ù­BHô6*o“ÄZl*%#«ªJN_%Ѐ¡ùšÃÌAGÏÑGx ëVÏ«:©m|?ä~&šh ­ ;š¥‚r³•D Ñ©ÐC…i‡uß‘t§ãN7‘þýç·ömÙÔå3›þbÿïk^±¸…,¶,ÀR‡Ä¾fº­ß¿Sû†6Zäi‚Ÿž³*ò”“åkáTÔŽÔi3ÓC;&´fþÈZä¹%É’þ¯Í1}÷Þ÷Äj#¾5Æï¢á<ý4™ørH)vè £T´Ek~.n@e=Ì„_3ú\|6|íÊ®)Gf_zšMF“ÿ1Èõ§Û*ʾŠ(÷z/ÚûCx…N/6ô„ ¢Ä:.&„7»¢‹<ýÞÜ»€¶EY"Åû~o‘ºUUU£¢o±úG?“ÏJ2Y@Ž¿fÔëY«Ú)Q–ƒqrEÛ³+T±Üåû˜ùåøO ˜[ëà”"Ÿ‡åï_ýQíFH¨¼ùaM\æõ§wÁ{$ŠÊþ®²^²@ f´¿Ã’I3Iè]ݯ£à§²têgÄDé0¸bêU\Š/;U£(ñÖ™·kžA¯Q+ýòÝ> /ÿ¢:6[#Œ:iŠäKR§Æq8vW0!o­Ìvéé¤ä˱Q (¸®KëîÞé GDýÁûS#¢¦P»V¢¬ÆÔèþåÛµ/Š^R ÝçÍõ¾ñuÏ:ª|FÛ§Ö†ôQr’XçÆåÄ‘Gø{†3P;ÍsFìÉ ‚í?¸Ç5«à±ÛÙ6´ÚÌZUZ²ÓŠ" µbèu©ˆê`Î9ô—W’—°‡ç›<:ÃáϾèG«6²¼ß;—å)òÃW£1ÃKº9ÈV.Ý-ÙÎ¥^ðÎÊ×ͪúƒpÑýÄ0ƒDùÝkk”zùÁS"áÀ=®¾T„{LqÐ¥7ÌV 9l)Òn!N&—‡?6Ö|‡Òp$t  »((%â°ŒPÛà®à{ˆ+±ŠWš–¬c’O‘ðHÁúÔy¼ÏÏû§å„™ï|ƒ(Þ²L*jG¿Ä*8€›Üqfrè9ÈÌ1¯ùÎ&Ÿ$ªà»)5>QMŸ“§Aî ¤j)4ñljÃ=²[F™8Áò3•˜óöaH[\Ç‹u Eγ2[Q¢ÄÓׇïá.òVê¿1FÅ•;G•ÿè NT b(iíJêèAK/¹j¶Ú=˜ÝöG„u(PG|®:Ç;ÄŒf§Ã>±ý0ÍÀ€ l;P5EÖNuaWËÚwø²1pEvÚgw¯/‚6Ö™ÆGëäk7)œ²¤#“`÷˜,ömÅ¥Bݨ`ÌjuÃ/-úU’þçÐ9ýãÝãK*ß…úAÙð§4&”©ä6¿j®ÑdJ&îOª×JN{¹‘+óR0§`Xe~Då1åÏ„°÷bn×’Eý±Й_¤ÓÂ\g~ôl°Æ›?#µZ(­e¢ó“/Ó˜†5 ›¿±#MMþ~6s2¯ÅÊ›;ɦÚϳô/(6T•ÄW;‡4hoB¢×Á¡3.»Ày³6!=ÞU¤k× ¡$ïxíP–NÁ\VÊp€=vãØ[U¯~‚öÙßh"H$t‚ÿŠž) 7ÌqµEA?/3•ëwg¸*d$éßš‚NFE8±’]´Žñª›ãZMµ š£ óä¼= ˆ1HícûêêØoóü.øHý)€ïú†Îr뛳Ë×pÜúDÏò ýKdV2 ‹`IjM-Ù®vCv@:&æb&²–ü#í¸ÿ´ó*em—Wm'»Òb¾˜÷òkIÏA âéí$äE>t,vƒ¼<èœþ:‘)ñÉ)Ô;ï×#²vì=îºÃZZÜ*zå›M vV.µ'yŒUÛ[m^FklU@‘—v¤p‘ Vʼڼ[€Ø-Ž`ÊA|¥˜ŽÇÇ>K9]Îm[¼Öe<É‹-®`¼Z“—fznt,Œ“0Óc¨G•w>šÌqÜ'l=êiùf+šéŠÜ‡Ùñ`Ìh`Ÿ3Ц÷osYÐ×(:?ºíu½¬¬§%p³ºÙm*¯‹#\vµßÇßúýÎU,«~Õ²7¶ž›nž¤2Û°Fïme|auÌï`YU G†ž'LA¤Ìxl¿u§4-ÝÛïͰFVY< Óí£í~nÐ61Æ“Õ䯧„•òóìüV¥ÝÕ—J$¼Í„ªvBÐÌ€¯Ï£—€ÁØaÔJ[ïj·êp]ûr}ê*¶24|­HÆoò›Ý²›híwÁøNfÏQÎEbBÄP @>rÿ… «DLzðÂß Q˜ÆßâñÖrÞ KDs#Õóó gŒ÷tп «Hs,‰ nŸWÁmèÄ0IÞ+&)â|—{x9v›?|×"àgRÓ×S"‡ 2‘L£¾ÿ½†LkèÛŸ}ÛljF yÏÙ<çR“L—b Њ$ã-_†JUj·EÖ‚?µtL¥>à~¿€ñI‘ !¸ßxT Oáwמ±F¦¼bÀ#/ >{ó.€«eµ,¼…eochµÙVïî;Þ=„†Ð`GÞqùèq1¢xB±Ï)${²Už¦<õD–¥Æùú·ãé :£Â4×x_Ø¢D[ë³Û­äÇö¶"ÔæÕ3Ìôv®‰EÒ¢-ÒÃçKŽh]£g¯þ‚b moñÌœ¬W eP3,BÃæôe ¡¢d'Õâ}2&ïù¦ñ’é“DÚ‹ÍË} 3©óuvIs·>g-8áÎ7œëjh´Ó GZuŽ«9Ùh<©v”ëBÐíë4æžFÔJñdÇ팉YJgJÞN¨³Èé]¬ãÛÒq–ð©S)÷ÓnŸ5îÓ^˜i!ËÍw½+ɃRyøa %ç¸û¡3¿Øæ™NÚRòFµ‚ü@9oÎ…Ã:Î [œ¥ÐÆ”‹ÝÒ@}35迵Œ€ÿg™t$²”ÜMëËÔ¢L%i„øi¦ªºG–•ñÒ)¼ÞK±’èçÌ¢8p»‹âòPÐEípu—¸Áš¸ÈÌÍ) Í”‘ÆÙt±3uM”è^„§ð]•ÆuQ¾ ©*êéBÓp«¨Ô¤uo²Ÿ¶jßlh}ø]¿3·•œç« >ãÍdXm3[~ÓÀ Eòñ@Ñ«×I,;#/ëôÍâK?ÁŽZʰkT¢… åêI%& n€)€ömgá7¾1,ÿr¼5·¸‚¸¼ms$ÝEtÓ/­3’…Á )¡°Ö2óvX¥†™tÖ€‡ûíL.~ãÎ\.©‡Î!—WL5¥À|wøìbò{oe]æþu:n¨h°â'R¿(?úŽt¸)LvÐJ¡rx Èt(l›:z‚x>¨ ÿÂÏì©þA^5uêÐД¨ÊôåG×Ý! ÎjGŽYUó¾ÝáYŠ#ËÏXîËæ= ”ãµÅ=Z"ör]¿†ßŒLXuh¸V‘üt¤5ޭʽÒu [ú¢•s='©Öω+‰~UCÄ„ XÀ0á½xöÙí¨,óçt3¨-x*2Ö™Š$܈zý¨…¾^Ÿp¼¥ß°°9z˱,‰Èñ x<ãþÞlæpó~²kõ0­ìþì|A)é¢OÚS¯1 ¸©±5 Zº©¨þ–Ô˜‡ôvlG/”EÚè’õ¯î½Yr—3ÓßOX#Äý¸÷^ƒ‰lLõ[’ÞSVý‹ñµ£ôÔÞ âüHo{ñÉ¢ÜsƒFFµÐ?¨û^¸¢&ŽÝ;t"SÜî†i:\œQ)Ñ I˜äû«/|AJxâñý`ø)Ë5OX¬ÏÜ'èÐRFZ†aé­•Xí–×; PM_>᎙DoÕ N?…Ø!‚?¤ƒu€ˆæãT¢ò(/Ê$¨k"MII_eúmû¢oÞÞ©Ñe†óCnµ-¹áÞCg¶w…çó&‘¼O÷v©š·KÏ]´‚ p7¬q[ͨwÝÎ ¹×E¥"|Ôó±'ƒe>¥}Œ¢ÊÅvÅÒ ˜ùzˆö±÷™îÜ’-Õô:\Þ¥p¢6’ÑX ›˜Ÿ†å¼OÒ›r¶÷m„e)DÉŽç1’â¡ûíȶLëUÔ6Cügt¹Þ÷&rÎÑ^c4‚4M+„µ¤ç«˜†eV’‘o{èPAYX‚¢ÞáÆ¨Æ> køCl¦ F›©bb¼ô/î+Û>ˆÊäŸÁÃë–œïî„CKšõÞÖ›– æ¶N¦ž¶ô~a6 ÙDd®`>aq v7öÕŠIþÐQйzí#]hO UÞR²Ùà¼ë>iWÁâ§¿™ÕÎÃe'ã4ùÝÑÖô1p°ß]ÏÜ ›!¤õ'Ñý¡ ¤é¶8²wŠ*#~‰Dòí¡‡ß‚*Á¿ïMN Sˆ|©0»§ÅÚaÇ"ht·íŠ4ìÕZL0 *í Õ s˜ß{TFC ;¦àÖ-/dJMOÛÙБFHÏÝ34¹Ÿ—ÖpJìhhôSóŽ=ë‡CNùs_Ë >Êý’d•]™[5…£ç.Uï;#®£âP”íaÞò¯Z`|ëJï컦/à\ç]êP–ã6í…ti´¼•8ÓÕVñ²å†Ã®½‰Xô}Uär=¦j• ZAÉ1hÂië4½TÜ­‹ßùÙ8eí`†|§.‡=âþë¬6Åá~#þÕ¹ÝZjUT¯îUå´©ûµ!"Ì?ÈÕ©/K}—Ô£x´så2TwѵľŒg´v{ÁàË^3§ä¾—(ç{Zx{øhâù7YFñ2Çò£Ã¾÷‰*‡œx ÚeíYaK>Û윳Å%·¦‡ç÷œ±¦w³}iÑßYt ì2ÎÓ³,fj·»àZDàÛù×YHÏtDûăs=m<ÂK^ß }@•`wÍOɨP=]¾æwã½øñM¦\V2Ñ%ˆýnÂt/‡Ãv5‘ÆÉaLSýˆÌ­ßS½¡×&-az¨6Ù7>³Âˆ…Oq× Ö5,é” kÖ%³ûú´gŒ(*p:ËžJ©ÚånY+Á_ö­E‚ÙÑCâ‡hX=γá¯ÀMŠSíçúæŽk´b…-¹—¬ÔzôÄâÒ™_*TYèu ÿTDL‘-7áµíórÝ#ŠÕôâ¨WÖj®{ަ¸æÀ6 rè\¯ç’b1¸€½¥)h+>æìð/T·.I“cXåöÖeöóJ~²ñ€6Ò±|S:àn†¸)Þ Šobrla &ÃRÙŸPÑÿr:ï­£¯„'»T{Êœœ<&ÅèÿlÖˆíNs2çú.£À ‡æd}± 9Š ñ´l, Èñ& ³¼>–/j§ü3ÊްÀ%.·Ç}Åþ´\òƒAòœSìXm€ót·rh¢ÀŒD¹Çql„k[<·U—àíL@´·Ö‚’¿®ja)Ÿ+Ýwû³[¿óÇ©îÌOÔ¯+Êœ!–òBž u«mýbëE³5,ÇV«Ü9z.vîŒvõX³åu)üo…¹1%ò¡ßN »§X¸þ &±aE4 ˜®íE@òòÏ-‰ã?±ÈÉã´ì0;ÙÄ'óá5º5/À—Àï2MÁv@¿ÒÒ Ùü€ „_޹éspð4‹Ñ”N\¤]j:×@Q«ûáéöŠœUkµNça9éUÊÀk…‰[jQØÝKWܨRªÖ$ âς노¾‰é“s‰öÕ é0·Ö‘E£ók¨÷^OŸÙÂRf9ñœ¨º0ÍY( ÆO¹'bËë;ÕEK_ÄÒ,còå땟ę$î%®½ ñf~ÛT¶áÎgOû”§q;îñúi~+D90kƘ,'NëþúÜ[ úÑ{gˆ3\%¬îˆÊ5=ú\9- ¯™A.pÊ!£ªdù«xURqÑÛ`—¶¹‹ÙÏ ):¥5sqÿ$¥:ϸÑ!?— ׯOÜÔØËJcᔄÞá±­B•=a…ùwûê>5ÞÖcš3%Nœ)°ÀìÓ’Æ}!”µ‡‘d×໸Ÿ‰Ÿu^¤¹¢ð¡qÞ€†éƒÌ«ñÏŸÃzÐv!Q¦aÇw“eáÔÍ7cë +¶ØqnGMå¦è™]TdÚ°2Äzššp?F­BÜ …Ë0UÌu¢;"Æîš#™0öΟ߼z{Ä™Þó»ûä–x¶ÙáߨávSB¨¢º”¹jÞÊbk_ °Ù%¯L¯PBY+!»#'}ŒœU[=”¢ñ”Uß_}üMqº´>}¿™©ðþ ó A¥Q\Ž¿A¬~²\ï¶I˜ºB°ììÿY'Éóþ‰°&~ê/ÂV˜ð¢"dCÿ4Q –’lƒcPS1‚bžåyÎîåûÍÍÒÇ%àuØ ÿÊ›qQ×PhHä"ÂV‚Äírj eêÚ]÷ÚEÌ¡ò íA哸ng#b&ëdÙ²¢K¬–-yä¢7æQJðâöŒ SpovKÆ?·BŠÍ£-_XþGÜSyRð$ “»O•‰îKx‡‡¶¸÷ ߺï«Ü^Ž/*qÚï{Qöm¥ Ì;tŠOŠù˪³ugpµRÃ@D„ƒP\,¿5e’>ü kO‹†ço™4à6˶X^í_Ï ™"&ÊÕ–Ìt–®á$m.ŠÖ–.Ï­Ö»·>í²òàÖâmã 5³\-¿¨ùåÁX†Ÿ+RtX&_þ⬚B¨`¶¡ÍJ }xD‡'YÕ)ºÆ‘ð±Ÿ7ÈqmCÓ£³„?7 [ l¿/’•ާLmT•·4š¦?øá>¯ŒÈ%§X^Y(iN>ïVt5™1¤¥lÑÆÝí¾¸®ûé=~™&é©zrưòWc nÆø¦¾;rg—d.ÇYÞŽkñ†eUXѤEá(£h7ÔKÒ“BÆö‘#ñã¾Ë;súØòVÇ´ 0(u9Ò*œ{tÄò@iÂÆc<ØïFT'ÑÐ˾ÄÜ=y WÅóÔîˆ8ú ÂÂŒýPÎ`†ç€{ö¡zj༪LHŒ0ªÖ¡K‚(Î[Øäqvz~‹Ú=I®TõQd¿:%òÁ#RhNÙjÖEž‰E*Åy%ÅÉÞf±®†Ì çãýn í^';6C;î|¢«¥YOgAbòR{ÎжI\OUùŽŸ¼LøDò×k‰¡~ôèqî,Äøõˆ öÆD¾ÇzœQoÜWHJ²êŸàlä[ÑQ Îèî1ÎkLNF&É­}%- r¡<7Ú¤å¸8~l·:ñÐAJtÕGMlz‘ù4ûrÃͼ8 ´ÖÍx¥ð2îs•þAáu)ds,ñ-½É‹C%òy~t–¯ÏfŒ»q0iAHÞ£K…$ø‘5Š -iãLa@l~̨ 7üÔÑy ¥˜Ñ~Ù¡ByêO>7ÆY j!«É'¸¸„Œòa êgâå¹#¡ñĵÏEVÏbòv•ÿG‘²ròÌ‚Ì9ZJ ñ»Âüjgù(¯l$ ¥öô“}0°5Žå‰—£šTUc›,îjË: 8|V”³g‡’lZ”5—ïe?¼†ÿ‹©ã¸ï”(eÉ®Dµç™§‹¤á­(пÿ  ’y½Mg™ûžâ¹ÂÉÓf™èµéþ¶LeÔ 3GÇñü‡´aûíkšpp§— +mwÖˆWN|ØPÐýظÓ}iœàB?0ЩëMxPïž°y±Æ¦v}•‹G˜YP3?ÄH$Á˜üõüÐBêéfUÖbàrèŠÀâR.Š4¦óTÁÍ¡¾Õ@òZ%¦/ñÀ¥HÇq~³8"²®v õš­Ñ™úþLÛûw¼+Óü“ì3{"‘i>~.ϦáÞÊ‘£7b*ì\pœnœ³¾N ¢ß cÔšíéÀscÆ`òËÀ#LšYp-ýâOì;ÙûGEØ"$—ÿøðþ¥HÐN/¥`"}±Õ’äèµ`í I}'⢜WmÖ3`Èΰ=íŒ!áO1ºòéKm*¥]†w\nîð§§Vi»U•„PSœFeÈwEÂ|ø¾¬Fÿbw(oß%${­m­%°Ì)>Ê÷`ÄY#¾=?Š–»ßuåV©~µÓç€Eå(†5Ú­aé€ÌE:µ¨tGcß¡Vò©1ÙâPqð;驌åF- Ü—²¦àdy´Ô~ìG›ª¾1 qš(oé­ϙƬæR#µ{É¥Ñýô;5 ÀNiÊtøü3#TòMöÕÈ:µŽÏsD“(j¾m±b:‰øSäíÓ×·n(æ o²êáK-ÈçU8™n-L`xzй¶èæiùy‚æic]¬\hXPŸ%­šä_³„!î\ˆ\Yß*Ï•#.ÑåÓϤ³s¨È­¢ÿ¾4—^멘:”¸k«N1&Içm‡‰AÅI’5þ8¥ZMÑA¯à€<ç©=]õ‹£µ Y× p{zš¿]Åí¸J©…}-ý‰‘AÕs«ly¨™7VâF-2&§/x4å ÅZ ¨Z”I¸Øš>óùu“hÒzy€‰”Â&Øê§½³,*©®ãd޶¶|^+&ã'p{ú^H½*Õ[ëá¾a à9Z鯄(ÆêSZ£.È0ÁªÆ(Ž{Õjƒl…hò€úöÙ`{c=ÞSÌŸû¶&(£²s[¹ËZ,mX=J¨§¨} O™,_ü~)r¬,F„¸n"•ÃTs€ëˆ¿´=Y@8ÄÀ“P²ï%ÿ î_±QÚ†mwÒŸ3V•ôfp}Ô=¸Î>½Á¿/Êc4± íÜú`Å0щïEé¾=êÌ”&Z݇‚‘— X;´uÁ„Áñ L¤h°= _é¢ÅzÅŠ¬Zà8jz± P*ÆÒl1÷²» Æ}1>çY1” `‚ ¶Àúpâ,ùði¹æ¶ƒ» ‡Åßxx{4„£dµ¦lÙ%ß•ø¶S@÷ƒÏŸlô°‚c@5 Pn"­ïÑ|žže˜ÊÝs¢ê=Ý€½UYî§ „1P’¹ù —íyºk^þd»;tÐO1S¸Ë À#Æ•Á·å:Ë#‹‚S¦åã67»0ZÇf„¯¾¥÷sòoq[â­•WÎ>zVÇÖÔÏÍ Ò-Á·"×õß.ª¤ŠX#5IÈŠFÕÎØÁÒÎâ‰á§ÏÃÁ¤³¡}Ò³Q¤ÖËA) ù¦¶'ü%på/Š&zÂNôV):¦ïÃf,¶ËfÜióæ˜ØÁb}Ï{„~^ Ì­ÌŠÎÀY‚l§pÁFánÊ¡Î"µló*^?슠@w?|Ö½Ý&+M¼D BÚ¸äѺ߳Éá{Ž›©üУ{Z9Pbc\6ÓP¬.Žæù„«s%t{ ä²l¼ïS}‘p}H“=d1“ÑûÝî­A8FÒHöÚ²Dq…he:eÔÒõëF øÿÞ‰ëb4¨3(Ð/$­ zÃУlµ#šcœoÄ9]ºéðF‹Ñ‡jA­¦ÄÔ^¾uo•^[ÿœ¡qñz)›âêH,…_»ë6pýN=²uXfO®Záþà h”¸eÓëG{“(7èTûYºó8á‚/âCAÒípÕ¯½pŸÖQ`!”7S¯Yo³ ×R¦ŽÇ5Þ§š¥üzfkÔí$L½îO£í÷£ôHÃ3¨9Úœ8ta€P\¯äÎmiVd{' ùž‹Q>¶‚˜ÆËʈ+ÇÊÙ«å¤%àJ)ŒE¯”MÝ*¾©)Ò@…åQÃØ%NZX{éƒpìbuÁ±Ø_IÄ’EÎùut½ä¡•«}¸u3©G°SBÏæ…)ÃßìdýaÙâG•ág™sùÉáì‰R¶#N+aŽªìqB¢,>'?þ¬iÑÐŒÃÙ.Üì—k¯âúØoAËmôVG¤>Ñ©¨Ñ¨%5WN(qÜ)ýhßÍ×=Ç*è¨nçD»?ååÀ+ ¡ÌRõ¿×V !$Pí(¸u§+§ ÷M)ÇW3æIs=…g.Ö#PæªrJ^4³ Aí¼PÝY!=g~ÀÓó€ì&h¥t&Ýñ¤oÓ(¯Ãäl£[/$u¤jP6€ÇVboßè O4Ž•:ȪBÊ¢D°uÍEuÁšnç_п䙲ÄÁv§•ÒK5Ïìš¼!’‰ˆ«NÙÌ_´Ôj¤"’AÌœëÈdc¡4‰$zHx…òW/iêF@ÃäùD÷:  /"kæ]Ä W;IK ¹Ôd7Öä‡rRk;_º£p”!çßæ®z‘¾§ò`¿ÜÌw0¼Æ e*tcû¡‘ ´/@ñ:‡Z]Ð6e9ŠÑƯ—;6IÇKEi¹ ‹’H8EÄÆ y¹6^š„GíæÑÓÃÿ&3zæ §ñ5aÁ€¤ÐŠ bY¶ZÎ z”þ$cÁ–ªÆ^`Ïžo×}Ç'tðÂ@6rp#”ÚØcº÷¹ýr äɨÉ{ÐR%¿Ç“»Âýôþ}ÿ(fðY¶ÍÙÑþ*žH2)zcœ:\ÁlhÄEÁÿ­VžržÁ–ÑŸÃGç­„NŠÕ0–¬áèùú Ú{&ŽÆf9z>‰µØ¾­­€BnO®*£/¶¯€À\ºP†Ÿº‰Í¥‰<êy“¹@I?¾u¯¤Še¸ýGOà¹N ÛɲAy:óÀËdâ7$KK!œ`lÇYׯº€™R™a˜^Qu01¾Ž)Œ}–[Åè…ìÛ$è+aNC9Ù}E¤³Ü},HŽÚ盌Q;GëOó§‚]ñãPƾkÖm¶*)xÍãÂى跋ñç’É¥½àÔçšjjÝÓé€"˜ÇáºTJŸ[Æ —hˆïÙ ÿ#ÉÔØ ½’Ô¼†WJÆ3<Æ»ÔÕ;2‹lp““Ân¡+u ܪ`Ïx’Î;ðcI¦Œ&¬â–~¼HW—ykƒ³áU*bªoovj­z† E›»ðÙ ý)…ZÍ¥»;çm®#0#Ã3.Y3ö=Ϩýéǹ% @N“! X›6Wý7›á†ÒÍïb¯fxJf0GuÄN”è«=o¥¥E¬ªÅ û/̈h=Ù!} âÊÝÅ!L˜p»Rõkž'œ`\‚ÛL°©à̸‰§Žë \BÔJH”Ú¼GƒªÞE3DË ý9vc%«ç þ\Q$î{Qon5]dò럞ü5eUñÖ`òŽ%1`²NŠ æøÙ\?.¥hT,Ô¹};®µlJóv!2¯£S¯è_?]MTaûgÂù9..€ˆ[é!YZ£FJK•« n/S†iÐÊx‡G#8ŽèžT†m¾EíZÎþtT@ðhÉBF\+ÞèH½YÌéõ„»;ër R׿7¦ÇÀ; Vì²~JM IµN‹D*®$̓±’JÈö^Õ ^rt~´oç>¢*'Üî¾]"2þñ+W'"¯÷.{PdË÷´¡Nƒ¾RÜÂ÷s´|)pòŠ%¬¹QZðj<¯'3Ù‰<ÞÜáP¶÷×Y];ý ¦Ê¸ \D2¬î§¤­+œÑ»òí»VXTKHê&k0ô$m+ö““BëˆàQÞcÚwÅ#ëw”µˆ(š dæÔ\¸*V›Wz<¦[Ü£Ò³ãªÃZácî’Ws‘ÞQDÑq'u¦üä1¾Ì6åÍÎÊåÞÅV@”•w&OEË(à±,åÇp¨mѨ³ýHdcÄ —$Eëô©·Íøžµß%’8Äùªqþ»AFÍàÍf4ˆÿî€r· æðÍ®¹ys“RÇF*î ¡Ð‘Iºñº¡ÔS9LæíYL¡°5Ç´EByˆòœ3a:U±ÑœZÈ%N>)I¦ê)ý»™]†ŒC ˜s† ÖÒøˆÏ‡‰Œ#IdáG¤VªF R¢ ƒwÈC–cÿ¨ù©Xy‰ŸëP?ûEê¿xæ…êBV 6TÄ8_ß3¾¥UPä2#QìX€h°ƒ=/ÉÉj©Þ9 {)¸8˜Áш묅æš…Û'nK}³@‚“‰ Â¥ÕšPvàD;MpAŽ3_§zŸõŠëëZUl}•ì}DDOçpéaæ_zÏ}+ý³A¤Z¡’T ¯¶RØÙK.~(ÏòÎòcA{Å‹‹î0ê’ü¬|½·xl‰Ûr©³«—û‚ÂîÊ*Û1nù\:=5â܀‡¦‡Ÿ6¹é6ó2&ˆÂõ4]Pj~põœDc³-€–É7âžu¥PjÈ2³Š—HAÃÛk‡²-udDØê~þf¤¯ºëPÖã­pÏûniü¾ãÐcrHyaØ`?<­ü’ §í‡Š3s+µÂàʦm’*É›ÍAªu¨þXì  p^ø;ÕÄ6¨Ç§7¥´ë.õÕÊPéãßôL{®J= K{Eì9†€3 ]Ç—f?,š¨›`ï—P<û…ŠÍ~Ðñ&0œ5ŸüæÏ­m¬i½)ļßÿÍÁrû‡~Gýçò+Ê;ÁØÇŽk{Å{KW2Ê\¶Y÷O„/DÈ„šKð+’9è²áoÝ#B—ÖA[ïœ!Á=,†½àãôÖñ#ëRrf½7¤ÕRk®7¦Ç[õÁ-©Î¼‹Œ‚9RgåÿgªO¿&ÍxtÿîÌ«ß2bºzÇŠW^âeX±XÍÒ]Îu\ûK³Ù½¸ŸIsw¥ý{]“5%þ—œi­}›÷ÍS^ŸÊ`ÝWttÕ‰ŒuþÎGšzf³›•×{úž Yì*‘(Ÿ½Io·vú æ×U²ÑüÇ‹®äýÕñ´/Y2éߌ·wØnYFýÜ(zˆÿÜM™?m›*ÍXÈù{¶ñÇ#wúnòXþEskHصLk>Y±#7–þj]Ç»#ú‚òWÍe_¬_Mɹ“î|üâ—ŸÉû³+ÓºBMØó+77Gj{gÈèn0’eÏ~ãxÌÍèö®§žŠ=rì«TÏÝk~ßü0lEU ÿé6‹BM›b Þuè[}òÏ=‰? 'ånü_¹~ƒÔN÷/®Q†…É9©‰E%ù¹‰EÙ\ì endstream endobj 435 0 obj <>stream xÚì} \”U÷ðÝf`†öye_fEvd10Q`d·ѽ4×2SÓÒ6Ñ [^íÍÌvÛÌz+Û´Õ¬^³Ò”ï<Ï< ”Õÿû¾ÿ÷ý¿ÿïûž{ν÷œsÏ=÷œ{ïƒð Â!Äuæå¸®ß? !|#Btׄʪ‚2¦!É(àú¹u§V›ýðåŒeµœBHÛ2±ª²hBüuº‹/µxtFh«äG5¶›:¯?•{êw"Ñ?ËÜÕ;&r3BÏ€ ™““]™ÔµÿBèÙ£À?¥°¼¬rŠô…+…ùG¿×nš×©ºßƒÐ×?C?×aj7û½)OB蛄Ò[ÛíóÒ~ ÂáàOŸ#e•ɺ›?Þ¿a}&ð×#Þ÷r´ ÿä‹0VxâhDp Ž:§­Ç›€¾?ô‹0É$͈’r èËä2"äWЦ„RDi/KB˜%³\DY+º˜•=‰½ôì DØ›ìm O²“ÐþŽ$,ù…!#*@QªAÓQjC]hZŒ–¡ÛÑZt'ÚŠîC ~ôú:†^Fo SèCô :‹¾Bß ÒQ”U¨Ê$” eRCYˆŠÄ^ ƒr¡–ò¡V…f€(ðÅ¢8¡Õe Ô0Ò„‚¡, zƧ¤ó„ZÔbP JÞ( ƒÐhÀ%ÂØEC™TBY¦@*‚€ ä\ò„ †–Ð7­pÎwÚ…D‡Ð+èðd>+`…àË ¬„MND£€k;zõ¡tG'À#¡/ÐḚá¬Á¸OÂÓpnÃv|#¾¯ÅÛñ¸àSø#|Ç'À–QØ {cì‹ý°?À ŒCp(ÃjÌápЉGáÑ8 GCdÄáxœ€qN†Q´X‡Sp*NƒÕňÁÚ~æÀ4Ô¥‰õÇD|Ûcrë5˜€ÏäŽöãïjÌó®ÕúOÙö׸^Ä"îýAœ yJçwµ¡°–.ó,4ªÍdï@ãÈ ñ_ ¡”0? b·@h)G¿ýÊAOø]_¦“–šâ¤fB¤J!V]aŽ ¤KÁBÁ>W€ØÅ§ÿ®Í1í5Üxðâ5ÜìçgNaO€-AóˆîAH£”ÜDºËM0wK‡•Ëiâø¯Añ«<{bŽFCÑ$úK1ü­èµ÷¯]¼æÃÛ™—_Í¡úвRÝWUQ¡ÅSŠ«84¡ÁAä!h€AÁ6‰8k9Ì×zTÿ)¾_ùnÃ:ì?…ñ=®×pýygs—©µšš»Q—µ£»-èäË[w§ -±u7ØÐ*›¥£­5µÙmèÎV‹Í޶ò~F÷ÙÚ;ÑCBÙ×fi1¡Çš¡§ZùòŸBËñ¦ÎŽØ… Z…±©°xüèHØùøÒE\m¾” åBé&” ¡tJ‡”B©JOA«Rˆ}Œ¼aEã âÇÀÎ>vÜ©¨¢Õqr¬€}t3ì¢ §Æ?Ï`Ø1{ð4Gäá%Ëð*G?Þåh' "îñ¿ìÀôvÇ,Y¹K‚D<ÊÑ/)p`—z‡^ÙÍ,#âvSˆXüÁ/ÈÀfäµ°³Kaþ~ÑQpªèñ]pêFá¼YÀµx‹€§â­¾ïð4|Ÿ€§ û‘¾[äÞæà+]Á“øQz»(}¿(9‰ïyvŠzwàØí¤¥ø:°©4]ë@;ÿgY ÌÊUˆ@+ Y§à `5¢Nx.#¶SÀ^ÐW.æ1/IðÍx)Tï‚Qåÿ¡—½ô8ïGÄyîçÙ/Îæào¼ô°È½ïw^Ú#J÷‰ÒŽðÁþßx逨÷±ÿ‰—øý“âñ# òf¶Öƒ¿±(ðL< ÎêvÜ­¸ÏÆ]Øçô'|^€Ç†µLÃux:ž?Ä w9®Ç&Ü€á¬7ãfÜ‚[±…Ϭ?’‰f¤Á<Å™x³°g㜋óp>Ü q.Æp žˆKáQ†Ëñd\+q5®‚»D7žƒçâyx>^€o€›ÅMx^ŽWàõxÜ1Öá•Qi W¢Uè6¸Õ¬FkаbëÐz´mD›àþrdèÝh ºî;Û 7ï…|݉öÂæ«?œí~? sþŸÇßáËø×ÿôLnÆ q^„ã[àvÔ‹—à¥ø6|;^íœÉ|ÇÉL0HÂ-4nÂypÜ1^·áipKmB­p#îDv4݈zЭp/^V¬‡‘1pbàÅè:€f€™V€eü­ì€Óß ·mŒàôÅ@þ r²Žm¸ à^€>¸­±Ç *A“àN`F³P;ز½ŽÞF sèßè~fò%ñdÙ]ì^ÖÇc³ñÞ ù…ü†ùñ·^ùê$ZÚ&ZtA¸Ì«ÿ Öì…–ÀSC+g“Y«dU¬šMa×±V˦²ëÙ4VǦ³¬ž™XkdMÌÌšY ke6“Íbm¬u0+ëd³Y³1;ëfsØ<6—Íg Øì&v3[ÈzØ"¶˜ÝÂne½l [Ê–³el[ÉV±ÛØíl5[Ãî`ëØz¶æ¶‰Ý óÛÌîf[Ø=l+ÛÆ¶Ãlw°ì>v?ÛÅv³؃ì!ö0{„ía{Ù>ðÄ~ÖϰƒìQ‡OØìIö{šýƒfGØ3ìŸìYv”=ÇŽ±çÙqö{‘½Ä^f¯°WÙkì{ÝÏLoÃÓ[à%ÿ[1xºž$vÃNù œ…ÃSÔˆË}ðܰNƃèz=†‡H=çä“è)ô4DÄix ùžÌ>EŸ¡3ð|ö9<“| Oi_£o Z¾EçÑwè{Xqˆô#¬ôOègô º„.£_Ñt B¨`L0…ç –bìŠeXŽÝà©F‰Uðüqÿˆ‚ñAK¯‰µÿO"dÊ›Yúß$F^ùo%ì–ÀYsßóâÏeoáöº3ÀÍ¿ö¶*¸=ÖÃþÉÿäa;Àj´‡ xV ø.à•8RÀwàÑ^AçZåÌÿÜ`5ƒòÌA¹G@yåzÌß~Ö vD;©Tž—§„Ÿðû¸nÃ0>º‡ñ??°ÃÍÙìÓaœ ‚”Hm(_^¿pQà^ñáï0gGÿóŒ»pÊÐ(üOv`ÕyêäÑO"OÿˆZø»º7ìÒ«øX=9EØÍeÂSÔ(¸wkÀw™pó. p‹‰ù' x޼'x#^ø‰R’àdÁÁZÞü¹ œ¼Wä ×a‰ŸÀá/r08 „ŸQA¹JÀ“„;`HiàîŸ'œ¼7]ªÁIíêvújˆb]àaáy›í))¬¡'äͰ›L爛¡øŸÏèwJÞ<sŽD‰(Cœ\cMÕÈÝÇLV_]ž†ÓQ–%¥ŒRuJwìAÝ& 1æËõ*}„u=¢nð(î —î@c¹:Ê+B¶çà䜬œÕ94§'«¹@c`y`gàšÀ#.uÓfÔí«#už^†äºÙGëꎾõJ< P}ptÆôºéŽj€ê$TŽ}pô¨nzêdÝQžª‘c¼Ü1”œœy¬n6™))'3=Tüà˜N§ÕÔÕẺ®º®øxìã"ŒˆÖ§¥FF¸DêÓõ):?ìC|#SIZjº>ÝÏßÏÛ'2<"-5%\çâ‡#£"#|}üyÉ(ž‹òö‘ºDñµ¿h©‹ÔEŸ.y#)£^§ÑÜ;'`Žyq÷ø”«dGýŽ #|UØ¢¯Ž&™Ñ%3&Wùuª¯.™{sF£«OONß½Ø<çø  xŸŸ'ýª&ÏX©¦AåãŠýüRsv¿nkÌÍÀ%£¯^÷àƒøÁѹùið•ÿë™ÄÄÄ+?*gvl<ïÝ“êçW<®|rFn£íʱܧRSŸÊ-0™L;f*·žæŸ_¦¾-Y*ÙŒ8ôŽq­4Ä/DR–ï &®Áøç`\ˆ¿ Äwâwaó’à_$xŠ“`y(¾Š¿”ã9ž/{AFºlnøü &KdøV†S|s}‰¯—¿’Ã2.l-õFî*w¢pwwSza•—Qî^äå‡ ºÉExNÞeD*•ŠøS•G„‡•¸„»´Xädø…*=w¬Nue]9?½–rzÓùá—R«Au³ë„JÀŽr´‹4œ£Qiªt}¸Îß_êâ ‹‡!Å!Ø' §…á1axAØCa$,À?¨(,d´¯+ŸÑÍî~E®®°ó©œ¢^Ñ©8¢Ê¾wH½£Ð=º3+Ô Ä-!åŽÑ,$,0¦’ʤ.<Án²±ØÏÓSj$7M(Û-—õøÅ¸ÐÈ_9þmQ¨+“ÊsåR©,O.e®¡Eß’ŒŸÔnR™J“–!—?\T*—Ëá/짯ÓK(Yøß>nÌñq ÖKÁ—¼05z•{¥‡Úƒ($î\\‚ÞS¨ôs|—ønô¥wù>èKàu£ÉîYîD™®NON§,ŠÏˆ ß½§ÊC¥ç½ËEÑ|Oœî¹Ôs“'5 à›a ‚ÏSYp°·¿‹F¯5FŹiƒµñZê¥}Ó¨ôV{oä­òîó>âÍü©·w„BÏ+Ž ‹Ô÷è±þ+ÅgI»±dõÍPúãpê¿1Be0(32â‚v‡CyÖn7>TJbBC5ÊT<¥byj¯ò´ŸPbNiT’”X)UK“¥TªtQ»$»P/êâ­é2&‹3&$éãŒAj=ŠÃiÊ8<É·:Ž”ÅYãƽÇ”qe@¬Žc4nl\+QŽQ6ÌóÙ]üÑÏüGKÏ©®dfòç?$eœ |Ÿ(÷„Òs@C®£¬sÀs âê\l]Ð%'ÀëiHñ¤² ¹ããtAäÍæG«³gÀa´#èÒ™/døèT>¯•$::]¼2øúðYî1::M TŠŽzÒ×ݪګ'Édÿô÷ô·Îmœ…óªR '%F¹§¸HÌx®j•ÈGȯÞq¿m®ÙGê&‘¸-YïÉÈ’9[² Ûôá\‹ÂcΕKKÉÝQU«’7Uú·ýGUV/£–ËüÿªÔAä @ä…ÿ³‹¾~ÔSÊñ©ýQÉÖ+ýÕþVÿ…þÌ_âÍ¡Áú¸•á8o¿¢ù~¸ÖÏâGæûàLoLU¼”Ü7¤H'Ï‘i bÕ ]W»¥+vÝèÕé=½übÕUÊu ‰‰ñE®½¾Je¨:”ÈBo5Ân‘EQ<²ÀÝØèK8êçÛLP|}<©ï‰'u³Åµ‘°(GUçtŽÕ«ƒå;¸p<»{,ÎŒºøü)_'¬pãWE騇ýK¤r,ŠDáé+ìϰØíÖ÷¢·ÆH«kW×ß°öáé¸ÿ@CÓÕËì³¾tžO´ž£èºú–œÐƺ«_cÿ–Û[fîÁW/øÉdWÚY¿ j‘ž§o"Þu*ßÝ^EH©Ro¦€ê'kõÍ¼Ë eîú‹ÍøÖz|´þ­zÒ­èUܯxTÁ¾V\V~ØåK;{ûéÎDLÃrÆEv1#"Á’ÂÝy{r|«v_··Ö$ê†E:òàÝ)8…OÏ ¯OQ™˜‡fSÓôZ•k¯±Õ¶#¹£,£gb#Œ‘1ú£L©_ɈÕD1#ÂIaLH.Š0EEDÄŽÏëSûê¹ñšñdüøØ©úÞRcÁ”\)V–‚¶Ò3^AÑMêF¬:ŸªW€ |.>à,ŸÙ¥øœ»p Òû(,:p )ïHÅøaž³GƒàÜ8yôÊQÿˆ…xÕÅsYÏù§øëîR‰«<ÚÝÆ*¤ä= çvj¢ý3C"Ƽkl¶xú*±|œ\êUÈ¢oX}<ÌGB¨<ÃÍ3Ç}Û¿’éëüWïI ŠÒ¨ { ï ƒ¿°ˆ÷lôì!îˆkØ^¾0z(}Š”é8B*ñõ×§ 7C¨wKðJ}vû‡íÞè¿Û˜´Wã10ØcÌVxè<°ÔCç¶)M£B¾*_ΗÊ|wêT½£BvŽB£p…6dïÈÌÍl%£rF™ —‹­¹Ûr_Ë=ËêꆆR>`}UAÈœ{ÆÉs:„ ‚H¹Ä\ 3U3Ï × aÏ ÂåÌWåÿ?³ÆüêŠ{<wL,X"÷ê›–šàîÚögËöHNÙ¶2£«|Ôssq‘ŸžôBVšþÉ«WÆF’¿XˆÖ×OÚäy!•_9¿ºÁ_h0¬@ :u…ÂŽ“Kà¡JNÑ[Óö¥uÎJ+K³¦QUÐnoÿ=¾¾Ñ»ãö&$e±2F˜”Ï×±ðÌ%ݪKPQĬ*‡‡4Âýú;þ?9Td:>‚WBiÊ´iÄ#)ÑS¸-xùyºõrÆØÀ\G§â4\=w„;Á}ǹ¨)—Ê™‰ó–w‘OãcñGù{wJ2‚{“½ ( ë䕸cu)BÎêÎéø»ölþQœ¿Å9®Ë|âýGK"¼4ØÓ¸äÊm˜ ‰š'—¯»ãÖa|Mla=ÖŸáž—9ºè«âÅ£ý˜ìÏý´¨>†÷zÒà§d³dÒ¢w!6øÅ¸1óq¯Q뻃1Uúâ ©ÌÆéeF™Jïé{§1`ôžˆl<€´œ–wœth“¿2J?Ca°M†EEÅiÁÛ|—›»RÏ6¾Å©ùzL´V¯Žˆë5zïàÜ5î„nÞî~ÂùRw»™,LÙ–²/…:/Ó™GK? º’yT¸9vÕ@Õ+ü®‰øþ¬ Ò+¯Æ#¾- «ôlJЕ·ò‰Àž%8~´T| Ϧ§§EÂ5Úánp¶Ü K"«.‘üœ?JÉf—Qcã´º•érLƒÓbÝ\½¢ý]KꪃYx{™›‡ü“ŒKs‹kDF’jrdRzíùKD¤T„x/«ž0:ÎçÆ†=.nÝò«{v†Æ¥ú!¸* ö³ýpÉ~«éªQm €øŽâø=& ÇI•Æ€`½G ì/H‰3$2þ`•ÉÜÆÄǘBþ¢² Þ»K¼,&o7–Â}6f“ûgiA»3B÷Ž)P«”…êÂÃ…TVXè]P0>x§7Ù cÎ{»p5–ä–{c™xù–ÑôI½Æ±ù;Ç7fŒÑ‡g-(FÇèÇo%ÞEÞ°)ckñ¶â׊OØ”âçÔÙcAW>7?w®® ª³Ž{ ¿IËä?ë\ÖÝ98°`·ÊZÞ¤¤‘°K ];—b–ð—›ôkº†˜°'Û/ß¾˜suM]œ=aéƧÅD¹üðQ?w™¼$kÒØ J”2hssûÇs¾î ©G@¹Û•§$r‰ÄµbBôÂÀu+<;RzŽqÃé±ë¶g—ë2ÇëtF­âÀшáŽ÷\=öfˆs‘ÈéÀåcBqQáä©V“œ”˜5:œS‡…†À†êíå©ôpW¸¹R’€ûrk&õÑѪÂûWi0—ßÇFÃ¿È ¦¦¾˜ŠšðHÕÁÎþÚÚÄ„¾ Üšððà>2þCü›`âšúTåÐìh)îCå5< ~’ªŒðÚà>TQÓU¸SA½–W'Xß432¿ÉÒ˜ÛT_ßW™©âú ¾K†!ƒáér·¢¢Æ3H^Cç~\0 )ȳŸ Ww0Í+lÊçafŸqe=‘y`ôx÷@Ö¯Ù…@lˆòvPœ¥ÏhêC+¹ý GV¬P¡†úxESd“iZM5 ûßZÕRR>š@3@}+Ç{.O(x?pù­Ü ¨ó¼õPFæñþûM{S«¹ž÷8®Ìƒ>YnÍÒð#Á}^€óû<ãû ­pÁgÁtE~€…ã«+V,åú¶O®ÙΗàÎ0}E~$ŒÊògæˆîu,iqïc××Ó0Ó±z¦UàqÁßá+T}ÃÁÃàã!)ÑaMõ3yKgšøÙåÏäV¬4 3\%ÌVœËŸ™Ç/ñƒªAzjM~kd>¸q¥c@˜/tôïeÃÃûãyÁ+òyûLM`´Ã^è6žªàx öäö«„ª×ÈFS^­Ø$2LåÅøžú¼ÚÚpaMqIEM.?ŸHS^°c–Ζz±ò‡:yk#‹AC×Èñ‘ ¬|aÎ@+3_…×b*wJDÔ¯XQɬ¨_= ‘œ*rÅþ’’ùõœÚŸXÜW°ª¶OUߊÇÀ¢ññSPÁ»¼€k59R(+2ñ¬ê.ÿ³îªoÀg HË`®€·”O/>åøl1«k ‚…h ˆìJÐÌÇ8­o©í‡8לOþÉb+( ç£å€5@¥¯gr£Î¡†à~dLŽ÷×ó=G†z|«ùžž¡§x}$,EIå_…äÈp\áéÅ’ÂÅLέ¡Á¤ÖA‘`Ê/[edÉä©5â":j\þ ç²:ZúH®ƒGl­úž gŸƒrü~’ø;‰Èç-À>Ž_ôyY³Øç¸T·¤hÉOîØ…l_ìsš%k=4 ©«£‡H$HS/•ÇK1Ã‹Ó fÛ+4åš„-!;ÂzBP¦ð]† YQ2#;Àxþ[ÃýVSuœú¥øx§¦¡ÿxøñÐ'§wm_¬ºC³˜5‹ñƒDEŸ_þ¯µ1§3Ÿ Ú³øR‹Jãî´0ǤõÔ(¥´š¹x»wØÍ]f»Ö_ãË7ɽ=¦˜»,•––Ž®¸£1I›¢ÑònÞqC\®µ½ÝÜÕh1µq•Öfû\S—™+ïnh³ØZÍ]6.7[æïnÐkR5ð5Õß*ZMº.%Íf˜ú_a¢m#ç%ˆ.º i-'‹¡gß´˜+ðúª‡cŽ5¨ª~.oiþ„±ÿ¼ùÔ›ïïYrÛ)Å÷~[^žõ`lÿê9¶µÇŸkØ•y.LÒý7jó)}ëÎ5.ÿ°Ø 4LÒ†½þë Š¯oZsxïÁÂÉßX_mJ#'oj‘Ìýdõ»“ß¹¼)ð©ñïÌ]t,÷ƒ>8ýâÎ[V¾”ý̸ˆ¢¢]„ÿùß- »}ª¯{æòKžnš÷ìn]w—çCQÄ¿^3ñÓ¢ÔÀC&ô\­L¼ámíªçÌweg'ÿ°·qÁ¶»|ש¬Ì>qû˜¯d¤æèþù«ÙGfø§MØûÜxÝÙðÉ‘u?Ÿ1íÔOë2šÖœ«zõÅ7ß<1ã<»ûC²øƒe±ûŸ-»ÿ•ÙMÚÌLˆ¡#±ÄÇ{ùÁ×W|±ûèÓiÏß}Û²Õ/VN¹c¤Á âhÑV­ZêX2?çÊTuuÛìÜ$³}®µkÖКº]³¦ š8GGä°¤¥ÝÌUÚMí–Ž®ÒÜ5ÇÒhæ*¬V»6U£spÇO*ã&gçO,®ªå²ssóË«òó¸˜ÆXC:÷Û1„(Lפiušt1 ­.E+VÿûOà¯bøÍ$î»Ö“…ì—öïv{ÜÓýº÷*OuúBJ\ÿ[e×§þûË5WeŠÿ žzè•Ï/.ÛÏ‘¥£¿¾©Fe›9ï¥Ù¾WŽÕ\Œ}¸fúFv%±Á³fQÈ‹³×¿Q“üöË>’[õO¬è`é„/¿±gÊ]7‡oi[rdBᦙwéßþU–øæAÃÝ×Ä0sÄðÏ-½’ño|Ùsù†·¼ðÈü_%¿n7;òÁø˜Ó«¼Í˯&,Å«§nnxÑswÏ…ÇÿáóøëSîšåÚlÇýï¥-”D|ؕȖHvß(ó[ç“ûÝO~¥']n¿[ÕVsUž¶éÅåÛN³Î-q7™næ ·Ù›x¾¹!g܆õº;#–¯¸Ôä:êÇ7.Aü¾ '¾èiÏÍïåž ¿\Psëò –­ý­OýÿAüˆ6Z3Ú¡8ì¯Íš©ÛŸÎôËÄ?߸¯Ýä5‹î¹&¤WÂ*,åCúaÓ¹ƒ{n[S¸æýƒžÓ-ïË6¬‘j_yupÙïYÿå[Ò¬{öì˜7õ›_~mÌ/pëМߡ8Qvú{kôÃî“ë%ie _­*;ñxBÎ)·· L|¬çħ.Œ(ÎQµ½ygž²óÙ×’¶¹°ðš]ïD˜Ï¬zxÞ–§Þ-Ìi½>ñ¦+pvÓ?èöúËw͸ÏràÍ:ã"Ãò¸Éû"}Ÿ·“_ŠˆšöÈ’Ùi®ñWøÑ£¿X¹»äSÛñ"Ù=}ï­|Ïwí‹ôŒlôéç“î+¼ÿõë Þʘòcø+ÏFM­{õîO ¿:Õ^8çÌÍNeÏ« O½yû/â´ñ¾—Žûœû ïËêì΂Ą›5‹]„n§¢ªv_öcV“ß; :•¿Ö/õÿÑénФhGœîMªV?tº/Æuÿ×ÐhòBãæÎ›4m ˜ÔhmOî2wZm»µk~rEy6?†µ«3‰k˜ÏU˜›“ø¸NšX•ÇÇr†v¼&Ó¡'-ÏÒb±Ã€Åy\n›ÉfãR¸D®ÔÒØeµ ÃvL1µYšLv‹µƒ›£Óºid¼¼Ô›TWj½5ž|ÅÕ[~ÉÖ ©g·vhU‡+\*ÌMíÖŽ&m˜&„o¡>¾ÃêsÁFk— v¨ßíOúÿ2‰îS7ÒÂy«xjÊ]ŸL™âç2Õ¿ü˜æÃó±. |h¿×º÷úXy¡ú滫þùaá+OØã¥oõFhC–ÖnvK¿~ë/ygMûpÏ=Æúè©×M´eÌÑ»ßÀI¶Ç¿P•©÷G\>nÞ²ó›Âœ/^¾ýå–¬¶Òˆ®&œ<õáÚoC\žû9$ÑÎÅ«f±d–à™PoF4HãÆ“JÆ(‘l×,ZÏ×0[´ ³Õ ?{=÷JëÿÎx¹cìn‹ïmü/ˆâÅ×Þ“Ãy«ƃÌ_ã£áoñ÷t?J\z¸XäLª‰Há¾Íô#xä¼èb Íêí±=Ñ­v{§mLrò_hny彋éÀ¢Åô`U«ÅÆ5š»ì–fK£Énæ,Bàò‹n¶ñÑÛen6w™;Í œ©£‰³Øm\· ØlœÍÞei´·Í—ÛºfšíœÝšÀÙ[Íܰ?œzù¸-ï25Úùƒ Ž»¹ÝÜaçbÀ’X9˜iã´IdŽÉÒfjhã-ù­¶á p&ûùŸMt,ou~b;¨>FHì2Ïî6Ûì6ãoù¬]r`büíò&pº4C ¬¨ Nªì9fh(µvwØM`Õ‹yn¬&gHÕ¤¦È«+³¯s~—¥¥ÕÎVZƒAÿ;u—ÝÖÆUð6Ølp6š›’¸ÜüŠªìâIòë²+*²'UçWryÅ•¹³‹Kóó¸ìIy#ÎÉťÅp&ÉyîIÅ“ ÇpUEù\ue>WVdq¥ ®¸ 87»*ŸƒjeUEqnÕÄZ®²:gB~nWUƋȧäWWNÁ_\6‰+¯Èέ*ÎÍ9PPš?© Ìæ‡(®¬¬†ñ¸ìꪢ² °E>ddåÐ ¸âÒò‰Å¢Íù5åù••Üð¬À “r'VçñZ†[å`wi~EnT‡fYVÁWMâÅ €ÎæÊ³ÁÆÜê‰Ù\yuEyYe~‚0ÈuÅ'r“ʪä9ù‚“&æ ¹e“*ó'WƒñÅÙ@dRqUñQfÈØ2˜U——]š]˜_™ÄUæçËùyB¨:òòkb%x:× Û@,™µù÷±Øb±Áanâ:¬|X5[ÌM•ŽDȶCf4tCÉÍó@^î9¦¶n3gk5AtXí\ƒ™k´BW“ ÄdãLÝ]Ž l¶vµ 9#ŸãØö"•· 8;I¾Sß“ú?“æCímÖkR‹¥Y£ç7Ê’5‰šøí±Û£—ŒæÕ€dd·í·ŠùãH›ÔØÕ¦ñ±ß3Wöø÷“ÕïÜùJÕ„_5ç¾þÖÏøå‡nóûéóÙßOèüyZF’ïgÊ‹9{wˆÚ»L©ÍG«Ÿ«~æÄS×ãÒ^?dm¹óhÛäéé§·î1v.ËD_=©ˆû>ÉúÐù¯Ú.½ç›ÍweØÛöYIHÙG5!¯~àùè©MW'/þõä7_¾úñÆéáO_üøýGÔhÓÝšÅt'ÁXÓý_°¡ÿÁÕè7?6Ù¾¨_èô’ŒjGnï NÜáš›öw›¿F=,È´^LõdÍ­úíê|] FçNŠ}H3e»B[¤)ØÒ„Ê‘ µØ‘u +âPŽðÓ¦{£zF‰ ·MûÐ1/,·}~§µ¥ËÔÙ:ŸûÝ9ÏõÜkSº+ðõ¼ÎµcnÞ|Ã?_ø:Z}ý‚¶K~ãôÂÞ-ÿæ%®|ÿï{´¶ñáö<ຳWº½dgï‰qé%G›ëk_ýÓû‰{Ê®f ZÞï÷ÜÔ/i/»ÿãÝ#od¶ï)]™ÔSTôüî†KÜÙì Ÿ›VÇøynÜjžÝñÌÓ=wK}4ïÑ­ž÷.Æ'à†÷ò°C¤ÚÅøih:įô¢ÿöTödøÛh©ÕŒ ·áŸõaˆgD«nÃz­F›®Õ¦¦N½&Vü_Û÷X™æ¥—r­Iøœ횎;\Í6l»-áôu׋ wøY£rszë¨Ã1ÿV+"êçücÜéO.ˆ¼PŸœðý­Òc½¤[žÔ¥½þ¯ó5êŸ9;vfñÂ.´ÐëîÛ#Õ—ë>©.5¤}y÷¬wû¶k?µn~8AA«gÖšYû:wHWwœ˜Efu,ì ÚÞ¼ÏÒ×|ØÂìÝ>¾!-3¡h¶@anõ 6šñáÖÓ­ç[[ÙÂÖÕ­ÛÍûZ™²Ue6šËÍŒ3kÌ=æ>3ß-5·öÎ ´ù-È Ÿ@ð½v'¨g<‰›<‚¯ë÷ 0w•aÇ÷ï.VgËðr¼Œÿ®Â•¿j\Òßë£~ߊoA‰H ü·U¸l54hRAÉô¬è6$EPb´ßÈÿÅ ”F€z€N|㣬oŸFÍ=‰ç Ötð 4pD¿—ái܉­([ÍÚïëo8„;p{”Ú‡”Ùþ¸­x €¢,(ËŽh"+GV«;³#±?ÉÿEÌã`Çx”«^80 xfˆ|C=|,ŒãM<4ø Æý¾¾‚q¿_ xõ&ðƒ½Ð𜧈gõLQÂؽŠúü“ؼaÄ5**ø×(*rà¼|ÎÎqàñãxìXÃÂìQ¸l¬KjÀ¾Ä@q J(˜!´œûˆÐ>c„Ú1Å!ýkÔ=‡q¬PúŽÿ»˜@H¿»¼ç€`0Å ,íËö€ú€ï(,3³xñB¶†x9&g éõW÷–ï%ÆoÂG¸oðŒo¬ßú­øëMÿÛ6…p ð³QöÙÎû Ÿùíä—Óx`ÌÃwO`#g4*”>jô‰êR†Îýs²Ýñ¼Í»¶à)èÀ÷@½ðöþ7àØmxk;¯lë¸)󸿰ÄÀ£ ê|÷uz¾wsU´n6f­«Rß¾J£^µN£¾ûûXõ]ÂÕ‹{4꨻ŽS¯_®^»©ï¼ú>ù8Sýãn£zÀe€œxreáS`Îj‚§“wsê7¡oӾꯖmШ¿Ü¬¾`ã_uù†ú D³Á¸$Ÿõ=sîêÓ‚ÏïÂ>H'Dºá@t’¡3[… àbþÝ+k Ä°”+ WCµ¼4©¿7OÍG]iI‰~¥2 ¬V)°sP~@‚ò4OËÄ!Þ‰^/<q"pqPv|ÀÿÂõD´oÖÞQ1†rPÛ ½k/°ö `¯µ‹¸yÊŸÆÅ0ð \Öåö/Œ€%ÉÁÙý£Ô(;góÿu¥ `Àv‰ÐÊ·ôøHlM‡ÈM¶•t8]˜É P»¨ÓxDùˆæ`m=´uœjåxž°Í¤@[ hM¶dl µ÷û ó_êH^ž q¸,—‚–¥ ·Ê¼"…—â˜þ@5—í&ü‚’X @A2æl§å°zÿV(û„¿u+‡r¨Ægw &ÎðêVö7©‡±\Ö†ùWó¨qêQsOà hTÝ^¯~ååõö—1—­ÀSaVSAÕT©ðTc:5®†%]½P§>w6R½¤×CÍ}®ùœ(Ïd);3ãÌÂ3‡Ï¼vÆEyF-4l;³ΟþÌ"äcÃXÚñÇ·„«ïÝΩ˷×o'k¶oßNÊwâ¬1ºíˆU_Ø ÀgðŽÑ1|Ê+vÀ†÷ÃyOõùåþêÛ–V¯¼e´zÅò(õrÀ‹jÔ7-­^ؤÞ׫Q/¸à€… Ï/$ɽY½‡{iV/6öÂj{e ƒÒ|“àÖMàÒM&›`‘7!>ÛÐ_;UXª ýyyâÀ¸q†86@’l7Ÿ€ò#BP®ØÐÀðzl´µý,r÷Ž~V®ÎöÃëð44šoÇ«P$àÛ¯ÂÓö•x&ÜWùÄœy :"$T:ë!²ê!Nù&mƒò<Ê –˜!VÌ0¦;ð5%¸QÄ €›xylêçÔÉ`†IHqT&ÐbbÖ oMPÃ0s,H´âiýc!úTx„Ç hõ€Öé€ùØ©ñõ"—7Ôëz(øhœÓ@?_SâZàœñ4ÍXFƒÓ}ô¾¾i¾^©¾Ê_…ÎW¦õ•j|i²/JòŠVÆD+ãâ• ñʈHQ‘Ê0µ§V*Už …»‡B&wSH]\R¡F˜(ðc&­VCðmO½Õ”I'(~R’E·Q¢Tâ,å åy% Æ¡î.Aî.,Zí«òw÷b>î|”±‚Rá`Q ø‹ƒ*{·ÁoöëÔª\È{çb8Ïè£SÕ©•ctjjЩQ†N]ž²Ÿ œ~O¼Œë‹˜¼"r^Ÿ±bÞ~9·l@…ªçí'8§†„‡ã>¯TR•ÓçWæô¥Ä— à5}ºø’>Yùõ5û1¾½ZûÈ28Þ«úزÈ+wêõ58ïî Þ/\A}cë{o»­6>´¯‰ÿþžÐÚ>O¬ ­Eñ¿û²Ùm6;Äz_@IyÍ!D\Qç!$J¡ôJ¡tƒ²ÖÁ¿?&*¿/.ßÔ—_Ÿ÷Å•‚înq¨nûˆq»…ÇÇwÛíñ×|uóâÝÀ`­äkñ6‡ ô‰JÁz`n¾j³‰½ÝÃú+mxˆ?kø †±‰„] 9^­½»ûwò0‚mh–ž¡‰ ÕÜšZÌ»³o¬&ÏmwôÚ†|má‡ý2~™Ë+rJú2+Jú”å×÷EBå8TôPQDæ8_ùD2¯ºø?Ò„\Vü ÿ?œýÜæü5x4#¤üâ·à9Ý^/½«ñoøþ†¿áoøþ†¿áoøþ†¿áoøþ†¿áoøþÄ¿àÚ´eBÿ eæ®Á®ÂO5÷èî9Âã‹7xuË•»ÝÖ¸6 o"'‚’¼$¨XrJ@Ó$…(!ú0Эô0R‹ôB„ß|ÜY~ŠÐ•//8~j:‰+A„ü\2ÉIøàYô_’%7Ñû¯— µ¸Šð~YÐ%¬F—DÚ0ò« B•(p0fpïàçhMîüœE9ƒ‡qª ¯C_Ì@óÇX†.tà†ÞAhÀ €»Ñ!´ðà|=„¾F¯¢½ð½mE“Ề_wÀ?")ªÄcá[Gnþ¾§Ã÷‹h,­Dû„ïᯘ“ ­íSQÚ ¸¥ò.¼ š?£ž€n€ï¡¯*Ä ~„Ópjü˜¢Wг`ç õYøþÍCŸ¡ûÑ÷è5hÙ:ÞDѨ$«±FcÎC’DÆ4wp9Š|‡ߎ’Pâ‚*àû,z¼;1ðóWUPÎC§y®À‹q ÚÄÛGþÖ_À1($ P6Œ3`%©ÁñøY†¼ÐF¬Ã G ÷Y#+c:B.Ñ[c^ØAÜ ~AHð1‹V€õo^y­FùxÞ‡à—óä×füËaSX›Ã¶K.J©Ô].#mÆldæ?¸rð+ÔD(Q€Ý0ò&4-';$wà²MÏœ¢jtv°ÿjÓÕ' ¹“©¤¶¢.°> E¡¾Áíìmv„}õ6ÉfÉc,NZ"y…Iž߇Ùò3ãË©P%b>hÀ;÷Ç›[Ñ(ásSoUŠCñ_‰Â§·hé„ÏWICzÇû¾Ð4e¢qè´=Ð^,AŽ7¿¢5ŸW°"½Ix¬;ú™ÑKè8z{ïƒõt| úyè3NÐË ¯ Wÿü³NÐ'8 5ãhƒcÑ ˆ—×Q ÚçøìtND}#?ÿ}9tâOÓq6 ·ÐIô6jý£7“£¯ùw“£'q:;ô~rtå‰of(BÅhøq"*E“P*‡ â?M¦Jø4™ëP ª__¦ANXÐL4 µ¡vˆ¼ÇÎÑv\†®ârØÒ¬Ž7£NXó.dÃU¸zømäè—¡÷‘#;êFsÐ\Ìÿï;×¾Gž+=ú·¡yCo¦GóÑȽÑMŽwÔ£{±íùVxt߀~Þ 3^ˆn†³-ºæ]ëËðrô ^W¢'ð*ô¹ãÝë°7|…–óo^ÞÀο‰}#ÿ®a¼ ߉ï›ñÝüóñV¼ oÇ÷B>ìÄ÷áûñ.¼?€Äá‡ùwëã½xîÃûùwã~|ÄâÇðãxÂOà'ñSøiü|ÁÏàâgñQü>†ŸÇÇñ øEü~¿‚_ů Ÿ2á‹ü? @Âç…àøuü~¿…߯'ñ;ø~¿‡ÿ…ßÇàñiüþ‚?ÅŸ9ÞbŒÏà³øsüþ…¿Æßàsø[áÍïßãð¿ñü#¾ˆÂ?ã_ð%þmðø ¾Šù? üÛhŠ.F$ü»‰”¸W"#râFÄx%QOâE¼‰ñ%~ÄŸ@D‚Iì\aD<Ð:töÚï{Èn8ÏÂ…·BgCÆßO8þ3‡H8ÚŒî"$m½ý>2ŠŒ&Q$šÄX‡žFüo¸m$ñÈ…$DÔK’ЭhI&¢%:’BRIú NÓç'RÂé†&z»-C;I:É>ãd<2¾_/¼Oú zöV’ùû,Z*¼Sšuì§ËÈXI2áŒù'Z»Ò88YV Ud<É"F’MrH.É#ù¤öÒ,ôšA ÑHEŠP?:@Š%H ™HJÉ$RFÊÉdRA*Ñm(ÎÆÛáÄúý }@ªÐ‡è}t½‡>"Õd ¹ŽÔZد'ÓH™Nfzb‚}¸‘43i&-¤•XÈL2‹´‘vÒA¬¤“Ì&]ÄF줛Ì!sÉ<2Ÿ, 7ÉMäf²ôEd1¹…ÜJzɲ”,#ËÉ ²’¬"·‘ÛÉj²†ÜAÖ’ud=Ù@6’MäNrÙLî&[È=d+ÙF¶“{ɲ“ÜGî'»Ènòy"“Oȧä3r†œ%Ÿ“/È—ä+ò5ù†œ#ß’óä;ò=ùü›\ ?’‹ä'ò3ù…\"—É¯ä ¹J)¢ÂgƒQF%TJ]¨+•Q9u£ êN=¨’ª¨'õ¢ÞÔ‡úR?êOh ¢Á4„†Ò0ª¦ §4’Ž¢£Ñ6E£i ¥q4ž&ÐDšD“©†j©Ž¦ÐTšFõ4fPCÇÒL:ŽŽ§YÔH³iÍ¥y4ŸÐBZD‹éZB'ÒR:‰–Ñr:™VÐJZE«éz­¡µt*½žN£ut:A멉6ÐFÚDÍ´™¶ÐVj¡3é,ÚFÛiµÒN:›vQµÓn:‡Î¥óè|º€Þ@o¤7Ñ›éBÚCÑÅôz+í¥KèRºŒ.§+èJºŠÞFo§«éz]K×ÑõtÝH7Ñ;é]hÝLï¦[ÐÝôº•n£Ûé½tÝIï£÷Ó]t7}€>H¢ÓG躗î£}t?í§èAú(}Œ>Nè!ú}’>EŸ¦ÿ ‡éú ý'}–¥ÏÑcôyzœ¾@_¤/Ñ—é+ôUú=A_§oÐ7é[ômz’¾COÑwé{ô_ô}úýž¦Ñé'ôSú=CÏÒÏéôKúýš~CÏÑoéyúýžþ@ÿM/ÐéEúý™þB/ÑËôWz…^¥ƒ 1Ì£p¿‘0)sa®LÆäÌ)˜;ó`J¦bžÌ‹y3æËü˜? `,ˆ³ʘšq,œE°H6ŠfQ,šÅ°XÇâYKdI,n:Z¦c),•¥1=KgÌÀư±,“cãY3²l¸'å:?I­hø³Ôþ/|ÊÄ\6Oø þôS–±å×|ŠÀÚÿ£Ÿ"pèùsÞà?Cîz'Ù;ì{—½ÇþÅÞg°Ùiöû˜}O Ÿ±3ì,ûœ}Á¾d_±¯Ù7ìû–gß±ïÙìßìû‘]d?±ŸÙ/ì»Ì~eWØU6(A,!*a‰D*q‘¸Jd¹ÄM¢¸K<$J‰Jâ)ñ’xK|$¾?‰¿$@( ’KB$¡’0‰ZÂIÂ%’HÉ(ÉhI”$Z#‰•ÄIâ% ’DI’$Y¢‘h%:IŠ$U’&ÑKÒ]Ú-6›¥£E’ÔÑÝÖ¦ê°v´›ºfAC—ÙÞÝÕ!Ínè2Ï1˳» ÉÔØm7»d·›»¬.ÙÖk‡y–Kv¾Ðî–Ûhéjìnon3Ï“ç6Yí¦ÆFs‡]š×hn@]V“]šï¨å;´æ;Ù\òE­ù¢Öî‹F[êV8¬UQØhmo79ä…NY·¢aVÔ`ê’Û-mMfi±c”âáQŠÅQŠ£¸M¡½d„vÇð)zéDanЉ#ú¤…9ˆ,9l"¨—Nø¤“„.ŤkT¥¦IËkÜËZ»Á“]Ýím¦n»K™Ã ·2[›ÉÖêPR!"‡®Škt¥é¥•—WŽ0¿rŸ¢j¤½U‚"·ªÙÝV»Yø@‡½ŽUñÞªvx«Z°ORͯ´{õo¬¬ÝVíp›ô:‡…×µt™æ˜Ý®¶Bv]“ÅÜe¶YlÒZGgíp§tª &Ÿ:¼‚9é4¿£E `j³KMŽE3 œIÝ$††Éì˜}㈀k¸&Gˆ59Î쨙ZÍÃC›E­æß\š[ËŸ¶Œ ¸–á€kp­¼ -Z„Q\,¢j‹e3G¨œum”¥+fA¶™;ÚLM–Fi›#äÚF.aÛÈËem|Èu8¡Ã&#ØÝ:Lü‡¬vY;[Íbøi¤VGøY³°V1ü¬#¯KD½]׆_ºÔæXÛˆyÙF†Ÿ}¤íö¶ëS˜÷W·Ã_ÝŽëB®û7–u‹>ìCn®Ãª¹Ž¨š;"äæ:Cn¾£sþˆ[๿ 9AGÍ-òsW;8½¡­’O “»IU+i„³H£47Óæf @i¶‚–@ ¤¹P+ižhižI,3%mÖŽ›T(-ÔæÊ#Ðm“ 'ÕÆ›Q£Isð68P«Í"¶N±_Oìvb_À×tšô™ÉÖÝ )lí’58©F'Õä¤ÌNªÙIµ8©V'eqR3Ô,'Õæ¤ÚT‡“²:©N'5ÛIu9)›“²;©n'5ÇIÍuRóœÔ|'µ`ˆ’›œ““[¤‡YXû¡ªëslvó Â;̶Ïê2{+¤O¹6[»»„eŽƒÇf™'ðØ (;ÊÌï–S‡Å¡HÁk¶¶5ÙìóÛÌn ÝIÃC´»0ÊPMÁ4\Ñœ20¢SFÕYFv ñ£;+¼CtW,Ã.àuÑÝΚ Û)ÄëvVxÝ–Žf‡˜“†Ù ÑŽÙ Õ †+`S,pÊ8k‚N!Þ‚¡ŠêÙ"Îq®g§© ¶Hs³Óp/¡¥kä\Ì¢p†(œ1Bxh˜ÂCM‚g¹ {˜3¾š¬mm¦aOó[ÉoFÕ¦¸ò±Öjéj’ñÁÆ6±+MÄz§‹8CÄgË@…à›V…àdmsãÝ*Ò Á“b…ïD~èÄVS[3¯ Q[F8(¿‰³»Mî]‚Þ¡šMào¶4Û[~²9Æ+nüúŠ´ÀÍgI«`‘ƒ´ÉùV‡AŽÐH2U`+Žª9V&%_À:è€5)y¹îp0´Y[,¦¶«ÝÍ<»Û2ÇÔÆ¿âAÖ{dW7ø_¼pBYø?š¶™ù¿E—‰2°7ˆlïÒùæþfa¶5v7YÅ•Ê&ÿòmpþ83¯Ñ »p;¿–¦®ù;³u"†£×Òe’všmÐ+s ^uWw§ÅÔê.„ƒ†4S“váym¦vØïÅÙæ¹;®`fþeæ&÷îà‚ƒ³Ë < ˆH“ðÇÍ Pfj¶XôZ]jlåv¸OØÍMÒvKÂT­MCi80=EZ¤ÍHKu 4­€RRäÖNsG\ìÍÂÁWPPë°E«—7[Zºad8÷] dŠ£S#NW“"âT§‰X/âtÉD,& &Çí÷·‡­N’ÍÉ’B~¿–ç:j×<ñ—TñwI.käðÎb°>n¹#Tåš›,°Š²¼¡c]Q4âò -îÒ2áê Ƴµ›ÚÚä ©Y¨» ï`lp‚!R°F e¼I¥a—Р*N …ªçH3…7‡­Úa°c~M´Vð±&5OãlÉpR†!JçìMÓ9ø :gŸÖI ·¥8¸4Q»ÞÙ“*Ê;R15wX:Mìqޝ–­ÌG×ä9{œÜz­(Ÿ-â\ÎvÚ®sÎ'ÅÙ–"Je;mO¦RœTª“­ÌÎv¶ˆ3ÉÎwàœaÝéNÛD»óEž‚á1œö§Dyg_ªSSªheŽ8VŽS*u˜ÛimªÓÚÔ4'åôeêЊë¦†<¤MGÒg;[†Ö ÃÙâ”KŽçˆiÎÓœ~HsZ–&FHŽÓúaZçÃÚ†Çr®¢^\‹C”Ïå3Dù Q>C”ÏåsDùQ>G”ÏÉUˆa´VÒŠBZQH+ iÅAµâ ¹"®Á<:B‘NìЉŠt¢"¨H'*Ò‰Št¢õ:Ñzƒ(oå ¢¼A”7ˆòQÞ ÊDù\‘?WäÏÍ•ñ -X¨à©¡Ÿ^8ºSÄáRÄáRDñQ[”Ïå³EùlQ>[”Ïå Dþ‘¿ WbR¼Oñ!Å›„7‹)¾€Oq¾Ó.¤¸…OñYBŠ·9R¼£›Ì³¸XKC»Z­RŸÜZ‰€¨r¼[ÌñNÈïF¨J¬¼gÄg%TP®eÀ • =Z¹éw›€ãЬ“[¬k†êi"Nqªˆu"Ö‹8]LnQ.CÔ“ñ?Úûø¸Š#ïê~=:F÷iÙºž2ë°|É" ±,lƒ±dMÂ1–FÒ¬¥13²9`³a1G 1âátös !! „ÀÍ}Œ9Ö°¾×ë9%Œ€ ÙÝŸÞ³ûÕëW]]]U]]ÝO=ÏàÍ7åç›òó Ýù¦ü|S~¡)¿Ð”_hÊ/œ¡¯Ý …¦àÂælß(/Ñljk6¥› µ&C½ÉÔÞdðš ѦY¾$/Ñl› Â,Ch–!4Ë<Ÿe͊♊g.g™æµ˜r-†N‹Ák1å[LùC·Å”o1åÛ ~›Áo3øm¯­9Óó"þQ^¤Ùi6è³ ³ [³Mµ³ ùÙ†ülSm{´\ôjèµüöY‰•&²ÝÔÐnjloÎŽò;ͦÿ5GýAžc Ï1ìÍ1ÕÍ1ìÍ1ìyÌsÏœâÁd—ãø¡”ÌìÁцczp³éÑs s sM s s s£ÁÌ^€<ßÅ3ô<†¾§ÙLqjÍÆÙ4G—AgŠÎ3¬Ì3¤çVæ™*: ó¢WÃJ«)ßjèµüVC§ÕÐi5ô[MùVS¾#JßàwüŽfãwZÍÕ™2Ívš:sv‡¹6›|§ká:Ç\[]Üúœ$ezÁˆ¯Ïç÷ú#…Æ/Œºbsßaž{¢Ã­Éo3ùíæ¾='©´EÇËŽÌ.¿·o8â_ojö˜žö´ !ogïp–~9³ÞyáZÞ \AN×p:¨SÕ ôdw#ë|}Á¡Î`ÿºL^fˆÃJ†ø­‡†rzƒÁõÞuA#­•§üi K›siw.çÒá\9—ÅÎe‰s9Ô¹æ\–:—ÃË2ç²Ü¹¬p._q.+Ë*ç²Ú¹¬q.G8—¯:—q.kË‘ÎjE«7¶°’ÕÚ[YÉoíL^ZÉmíJ\[ÉjÄW²œ×ËÎê ¿cvg⯛%óÎÙÜãË$é­“éIà¦-ç·¥p“ÕÖ[ÐÉiëLX«É‹¿µv0Ûã˜YÎûk†aö:™‰uz$àI•€'Yžž¸ò<É d{›íIhvÖ¢„.Jmá¢8É‚ÄwæN%‹’+É_œRM=õ6‰†Üì™ûïŸïvW¸q ­U…n7î ÜE"» TÌ(Ÿ:#·4WLS÷ÛϽ_ÍÔòÜܲ¢¦©åÅÙåÙÓ’®@i!r³>⇽øó\)>é‘7K4”»Ç,×Ð DV¹fDKKƨirÇàf-K§“ù߬Y)?1w¢¤rÚ4G2¬rcnd•6––ä44”ää°‚…(‡!•MîúéÌs´bqç*9yy'fƒ|åfA…È«?@ˆµ}egO-(¨ßo¿ýfÔ‹/ϰa¡3ªµ¥æçæÖ£ª¼¼|mÿ¢rZަU«) 0#JÜUN#Ý,Ë…Ý n–››œ™¢¶¡Á]¢å­ûŽébÒ¤Lðæ5YÙ¹LˆiÖ×Oš„‡åÙÙS¦ÌeÕEسfˆœiUMÈ·ëÑΪl§Žêðt»‰T¦>*mt×D»gt;­º6¸Õ%“JŠjŠÌŸ>½8ÙRõát|瘦êêXÎVÅÍ,‰¢G>ŠŠ*‹ŠŒÓqã@‘IEû4C;ùÔµ•æ%Ñ3»"»Â]=KòõY­wzºžøðVyMÖ¦½—ì½$ë,gïgâî4³ ÓÂÿvçiÖÑÎ5§×¹æ…pM#*пôœNTt2®•D%g¢0&]@*k Ÿ¡“€·Ž¾-NÅ9ârqƒ¸Y¼#Fd¹\+Ï‘·Ê{äïå“z«•iZûYÓ¬AëëÛÖéÖÖåÖÖCÖ#ÖãÖvë)k‡µK£:Õz5¨ÎU—ª+Ôµê—ê6õŸê!õˆzL=«^Vo¨·ªN©z¯º¤º²ÚS}xõW«×V­ú¨êoUo©ÞVýçê'ªß¨~»z¯eWÙ5ö4{¦=Û>Ø>Än·ì3í+í«íŸMuM-šZ:µfê´© S©‘5i5y5…5SjªjfÔxj×xk|ûå×^^{mí½µÖ¾ð÷´‘FFHáz·q“ø9Úø¶x_–q-ïFµ(¡nãÉhã™ÖÖ­‡ÚHjúWRg©óÔ&uº^ݤ~£þˆ6>ªžQ/©×Õª6USuYµ]½¸z…iã1Õ'UßT}wõ#ÕOVï®~×–v>˜Z´q–Ýb‘Û±7Ù?±¯Mjã*ÓÆ‚šÉhãÜÆckº¸×˜6’i#‰jS¤æõtù'õès‡ëô·[‰ÒÌŽÑ4wZGÚõi÷¦=—ö:Qz>þW¥œ~ˆó4ý`'M¤oHOÚYš0דҿƒô; 7™§ôx×p“ø/™!žO‰óÄßdºÞm'ËÄ-b—¬oÈiñý‘ÑÝ‘âÞ¥·UÜ!~#Þ‘EèáŠ\èÕéð™äæ]m9”Ky”OT8æ~Áåb¯Ø&óä—ètú>AÿAgÒF:‹Î¦sè\Þ‹wOÐ…t]L—è]‹ô#ÚD—Ófºþbº$ñ[p¿G<+vŠÇÄv9CN’_–SÄ<™#’uð(‹Åãâ×z¦ü¢u–,™Ò#E³Ì—ˆ Å¥â]ª‚—Ò{ÿlÚ :šEM¼Ïv!µR¼ÝLZMké_èHú:}MÜNÇRˆŽ£0EèD:MÐUt%ý˜®¦ŸÐ5t=,üº™~M·Òïèú=Ý+òé ÚI;à÷ž£gÅmô½G{è}ú»Hy"“jÑ'jè§4®£étD¿ zÚB3èFj _Q#ÝDóéNšG·S3ݾrÍ¥Ûè ôú"ý'BÛèKôÿèËô[Z@w“‡þ€õuÐ}è[Ò"ºáÑt(ý‘£‡èÏt8ý…–Ñôœ¡¯Ð£´’£Uô8AOÒÚNOÑ©"—Ž¡é(zžŽ¦à­_¡Nz•|ô7ê¢×¨‡Þ ^ÚEëé-òÓ›ÔGoS?½Cô_4HÐ0þú†h/O#t‚ô-¡èßD}‡þ]¸é‘M' ýCÚÓVÚŸ®¥éç䥗é_i·¦'á²M.‘ ä"U§fè}MÖL5Ó:Ø:Üúº5`ý»õÚ'ÞE·ÂꅽúÛzÚúûø÷Ÿ9»Ï¬Ká‘?°Þ´öªy­¼ÆìBÔ;¯“ß’ßgʟ˳/Rï‰ Ë ¼ò›fïctçãéò?x·£Þ똸ÏQïr¼Ñì`Ô»ï”Ûx¯â½fbtw¢Þ›¨w$êýˆ‰{õNÄÛåmò ysÊ~Ä=ò{—ïÉËåûr³ü¾{¯¼JŽÈ[$ûå-2"ï’Cò·òÛò>y¢¼_ž$'Ë?ÉÓä_å÷åò ¹]ž+wÊóäsò|ù¼ü™ü/9(·Ê^ùKy™|Mž '¯ÊòIy–|о),ú†ñ]ÿöQÑI"=q/•õcë*ëÞ_øÞ_˜º s«u—µ÷þÆú½õ;ë~ÞEx/ï"LÝqùŒµÓz÷ >Ë;S÷Y¾m½eíáý‚ï(tåâ‚Rï´úT¡*P¥¼#°HïµÇòJXö°í{`Ý;`ß»a©#°Õ|•7jWdmÊÎÑÔýŽ){CS÷ŽÚÏ™¼Ë2¶ÕìAü¢jJØA©w£ò^SÕ¢æ«/ñŽÉW­W¬­7¢;MÕÔÁêÞéV™ÖûÖ{*MåÄö—v«Vµ@5«Iª–w¡ònR5Oͅׯ“õ²wa$óõ~qé’iÒ’J¼Î{Á݈ÄÞâ}å÷8;óÅ7xWþ÷Äizß½8CÌ×;ôGíÌçøz¾«‘w¯¿Æ»×_U‹Å‹¼¬Ý÷ˆûÄ­2SÜ-ˆ‡ÅƒâNñgLõ¯,èßXh³1Ø»Éù–”È÷2íûÿûÇrŽ˜÷ÃÜ„1÷ka¯ÄèúcŒ¬Wclý%ÆÕ[xd½c+FVŒ«;0²>CÏbd݃Qcª,Áxhq€[ˆDSd…ü¢ü²¸£û±âwˆô/l·Î¿‡nþ`ýÑ¿Pq?Fï—Ä»ˆ&‚¶žw‰{õ/ ˆ·db„©ý1 ²]Á’´U‰ÛÄ1~G(^Ô¿; 5 ëÊ”.ñº81ÅlDsO8qÄBŽ!±„ŽBt?F¸r±ã6èõ“&šfƆëhƆy%åf^ihÀØð+^AiÆØpGllÐk(<6PKêØ@wñØðÿxýd±¶z€Óc=[9Ñ«(zÅd•¶zœÖ$Œ ÛéhŒ /Ð1©c½Èë(]:^¤×x=ůÇz“×T*y¥U¯ŒÐ°äï0.—°Šr¢H£‡èZ)²éKráÄšúÄšúÄšúÄšúÄšúÄšúÄšúÄšúÄšúÄšúÄš:¯©›9ŽÔ—Ò-t|üÆÔÒ‘v¤e{÷ ÌpùH¥þ„ëÈqú£¿œnÖ©”ú©TH3ÈÙHâ `fˆ]HsA§ižæ2\ÐÑéf²:UH Q©x5Š]H‹Qv#Ò2ä£ì¤åœ³p)ðÛ‘žÎ騫”Îdø~zãl)]Âðe obx³NÁ§Nwqú¦~*vëTÖ!-# <”~%Ò39Õ”Ë@YÃ3ÎeœjjeÌys^ÆÔʘZ¨µ#î°8=9“AM§çŒ<ô†/åÉ ¶éf2o“™·É †§ †Ô¶ ‚Ñr.gjåL­œ©•3µrºŸ^„²åL³ZC>hêt§oê|ÐDÊíÝ(%-Eª^ ÌHwéùÇ!UHÄšýkvs¸‰9ÜÌðf K¡[Š2—Œl”ÃuÚ–1 ="-GÎÌZ¯Ø)­ý^o Çßå †‚ý²:‡C}TÜò­§)}ÞHR![j¶˜:?ãtÖ I¸¾Ebï3—ש±ÛK†N€é|›éS©vÏ›æ­\~¸MËV¯<̦…G,Ym# Ì*,Ž(‰ae¢Kõd,8ù^¤ÜKJ[ï h§uœÎ ® Óü°?ÐM‡èß™DÌG±VˆØ:…à¿(¦–x´«[³?âÆ9ˆÆÚ¡¹Õ¤óY¨ï:×ò|ç:u©¡5Ó\gJÑ_ÅÛÎÕÚê\U1ž¹un4U´Œõ[äú—ÈEGôWÈÅaÎoˆ‹åbÿvxô÷·WéßÒûà{üáñOCo•XJ‘Ä_ Oòº.]'|(êø,ÅBä[Ám§×“D¤ükDÂiˆvÑ‚(uâΣ©›ˆ¿MßÅà<Äù?F,-­¼ôňÁ¥:9훈ǥ|}äFÄÂRžƒüc‘ŸŽücô=ò!wk9òBþ6äO×÷ȯÂóB×嚎õ-u?t„{ä·àZüÙÈ?ùsp0òĵùµÈÿ9ò§é{äOA+\ñß…Hx1ú8„ö´–Ül\•õ>Ú)Ém®¤a+¸â¾úþžÆça¾!0G²`MY¸N‚§¨Á|èLôË0Ïùiô7oñl_²º 3„»õ?{z^§wi/æ¹¢TT‰icæAËb™–©KÏ#d‰û5qŠ3qß ¯¸oÔ2Ä}u\–V3îé+î£ÜÜk:;pºVQzs8ýB´w~‚ÌÆýôDYã¾<&c)ûqß¡¯¸_dž º3LùB×™\¯¡ÇüÕþ þ†Þ†ß•†ßU†þCÿˆQ:Ð)‘^«ptJŸD§(—ô í qÞÏÞBŠ5x:Mñzt×¾T¯‡ÕàÿA㦽¿¡}N”68Ó$Ôö+iqnsòµ'ËíÊÿ6ê±éÈ1²±ñBñ9{÷ct,Þä­Œê¸G²nÌÿ;²*Y—Øã2+ùW‡×’PBýßL¼NÆý¨ÿ¦ý÷iùÇpÛK.ãûÆÆRêÿ([Cù«ùúDIÜŸm)¹ÝÑUÉÝq½•üù£þgxú¦æÃ”y-©ý[’û!Êï«_Žô–:qò¥Ù€1ï,­Š—Ñy‰ú,¦åŸP¶8ó |È>ëoÿôóö‚sYZzèè¼ÖxZzÄ?Ê·ÿÿ¹×ß^zôÿh[ùLºýÑí-í†ÜЗOü]ú?v|ž1ߨØbË?·ÿ}ž±îX6ú¹·Ë8ët5¯¥Q†y;é¼›L|3YÎß½ªÆli*æeû™/Ü9ß´‹Óm__t;šŽ¡Nê"fé=Ôÿ£ßq‹~¯Ž‡-ú…5úFéb~Ϲ™^¥×èoôºó½=ár¾—'2E¹8PÌà•mKÖ©ej•Z«ŽR^þÂM÷˜_·Ñ_¤q¾G£¿.£¿-“ú™¿ªÇÔêIõ´Ú©žUÏ«ÕËêUõ7—år¹Ò]™®,WŽ+ÏUîªtM¾Á\s-¯¬é¹(¯®á´ ß ÜeóŒ9§ ²ÎÅ“|Òka¼ÚQˆ3²/n N½–RJ™ÐÃ$Àe8ÝÐÇdÊ‚NÊA©’gРЃM ­ ë# Y©¿Q ]HhãàtBþÐÀzähégBþA¤8s ‡ÿ H= rÿ蟆3’ßN/Æ™ üünÂYMlFú*½NyÐE&@å” -ˆt†˜A¹Ð† BhDR´‚ê7T í,£hh•BKk¥Ž¢IЖ9ªp—ê¢2h®›&C{ÇúBz±º)4Lè éÝê÷À¼WÝÌ¿ª¿bÞÿ˜z éê ¤Oª'‘>­žFºSíDª¿* Í瑾¨^Dú²zé«êU¤S# C‡Ð² iº+i¦+i–+ iŽ+iž+i¹«œ$, ét×tʆ%Ì@Z窣XD=àØE¤û3c.^)Ëäï´ð“"œŽ¾-Ö´bM»XÓiFÓÓõšëRÒ:œZ‹À×:s±ÎÒètœétÎ :g:ƒ3“.À™NâtÓE8³X£Ùt κ g.k7µ›o´{%ÎtºŠ~ ˼†®ü3œ…tý𠴵܌3n¡Û‘Îtºg!Ý…3îÁ™I¿£ûоûqfÒ8‹èAœ™´g:í¤çÿÎtzg!½D¯~§þ+«×€‰ø œ9´‹ÞDÙMoÞƒ3—Þ£Qj/Àòô’O¡ÞW X åÃC¤Á:Óa£úK™e”!P&ã2G³P¿g»i[j™TRé÷#ú­€jWí$•Gy(­vŠZ®–S¹Z¡VP…ú ,¸\­V«¯Q_üuõuÀÚšËÕÑêhÀǨc«Ž¥JýÅ-ªbû®fû®R>åÃSmåUªGõ§W…QKD²Ãêd<=Eøtµðê:À׫_¾QÝü›a÷Uú¯e;Öÿ¨zÜ:}àqõ8`§'lWÛ©Ðô‡§ÔS€^±CíìôgÔ3€òœz°ÓO^P/vzËKê%ÀNŸyE½Øé9¯©×sÿQ¯«×ïR»PûnµéÛêm伫ÞEºGíAú¾zéê¤{Õ^*ÔÝ‚2]Ò…¾Á=Pº”KQ:÷CéJs¥Ö½Qº2\À×}RºÜ.7`Ý3¥+Û• X÷OéÊuåÖ½Tºò]ù€ \èk®Bü¬«È…ç*v#¿Äoë*u•"’ ÞÖUæ*Cþd×dÀS\S_᪠\W•« ©í²‘Ö¸j€³¿kÀÓ\Óè‚ïc/æ:Èuú¿öi ¾ Íø‚,Ø®XM<ÞŠúýQ>‰ ‘øŠ¹ßº–çí®Ä#…ÀUû }ÍD_ r'‘þ4j–¾"ÊÚº¢•LÞ äå¡ÇˆÕšF1Óå{<áëŠüÎÔ±WrèGsr4´MpŽÌGýùÂ)מïpµ•0Z•‘xx„Ó¥ót;V/¸.(+þ¤]· %=.c…ƒ¡¹m_jJ-]Ày“iºN^{4Êv  èØ%Ÿÿ 4N-‹ØÖ~ßVK·¥°•ý`6ñè«96T˜r6C9Z² ·w«–¨–øLçºB_+5^öVE ý­fÛ eæ²ØFÛòq_®s–ê:¦êZUñ}ÛkÎ|0“¤µ]¯|ÃÏ û3Ïü>Ë|n¤7Zúã¨ÄŸltêÜ»gdcâºò{£x:Æs^]Ü»'uu޹Þh(mtè!bõQ3½ñÏ5µä2û*åk¤w4‡=[¯½ŽäÆ|–Ü®ÑvE¥¡å‘ÊÕH¥Á¯L•ÆÞ“¹øÛ{rj)MQckM5^*Þv‡Ÿ±¤1šwPè5úU—áoãÞ›RÛ5ž™ÖhìÝýiÖ)ÆcŸ~µ U'Ÿ‚CA³c6Âߨu¾¯ë|U7þ%ÝSä©£¾ë|%7ú}\ç ¸‰_°}I¾Âµ¦¿I;bé¿7(çH[pŒ-8r‘ºN²Pk?)Ô:H.ÔzÒSä)”†ZO¥tÔ|:eèÚ)õŸEnÔ~6e鿵8@z•¼Š²ÁÇAç&y åh^ÛƒÊÓü~Iêï¿"_A ΂7¤#r„ tÈ O(©…c-Á±–äXËâXËbŽsì’@­šãtùoòßkŽ3ôW†‘jŽ3™ã(¯?”烿‹äEÈ¿\^þ4ßÌw®¼V^ ø:y=žÞ oµåàû—ò—ào‹ÜBòWhU¡üµü5f)·Ê[ñô6¹O·Éÿ |ù”ügùg<ý‹|ð#ò¯€•R1$ò•ȧåÓÈÙ!wR©|F"Ž’ÏÊçU¾ Ó²ŒŠåËòo€_—¯g—Üü7囀wË݈9ß’oÑdù¶|ð;òÔû.¤Y(ß“ï!Õ2"?ÿC¹eµö !Ë[ôb}Su`+þÇ®ÃÓõ~<-ö ڵǩÇ{T|,Hñ_Q¹‘ŽÄb<Ç‘tÞ§ïícà3½øH°ïzã¾?NG‚ÉíÏècdàP¨L â~›éÅøkOÒËFöà xŸöèøÇÌOþv3š cÿh©Oð×Ê£¿¢ý»Êñ|1[ÿ…åÇ÷±OµN·6ZgëMí{Ñx5´)Ú•8Ãr“ mË¢4´/pŽ•Céhg.žæYÈ)´ ñ´È*\lSÚ]¸Ô*¥L´eAeä†&#Š5…²!ýA¡Þš‰t–Õ†|´érëëH²| ÙmuƒZ5 §Z§R¸?rÑ‚”gvèU¨9ûöÏÜ*·'ÚÍ}”oÍe:s™Á\f2n­à4YMH{­^<… ‘žbb¸É¶N³NOß·¾žþÃ:3ÆÙYÖY€™?ë\ë\àüÀúr~hýðyÖy p¾u>à ¬ €s¡u!ž^d]ŒœK¬K_j] x“µ éåÖåÈÙl݆R·[[‘ókƧß"ϵž²0#¶^±^£"ýýoÀ»¬÷ó¡Ê \ý7·HsU-娃”þ{ªjæ¹uªÎü œþ•µß@ŽWêùr*éP¢´`ödç÷Óè¥w–X¼ïeš³ý…ËÕðÅ7˜a-6°E ­VTgc`•Yw8²1p:ݤ¢43ÈV78“ÊTÇíZ‰Y¹gÑ4÷gSÀÝmàœ´ýÝ1p.’¿'ºQœ[0/ö€…¿7°$Uø¸-šZø”•F÷;»(»¨ÄÀiTR4ÕÀéôµ¢(Í Ê/:ÛÀ™À¿ÜÀnùÓ¢ë Œ¹]éΦæR¿s¬üÒMÎ¥êÉ7h‰+ ¼åN~ÐÀŠfM~’a½òæž’g`E SXCJÿ•PÚ”EVtДÃN×z™2d`èbʉ g ?{ʵV4sÊÍ gjýNyÑÀÐoUŽA§ªÑÀÐoU³A³jØÀÐoÕU†~«î00ô[¥ ýV_j`è·:ŠýV?l`è·öC¿µ‡ú­½ÍÀÐvkYÕU²ª›Ápò ëŽ2°¢yuA†õ*vFÝUÿu×1œ‹üüºÇ ¬hNÝË kïRX_i`Щwä ×<Óê}†Ìë×3¬ÿÆ+·þ‡?õW0¬×Ä‹ë6°¢ùõýRß0ÕÀÀopèOÖø ^¿aárm ×6Ðàè®RóÓð¼ÁOë WküÆ¿±šáýµ 4n`Ø@ãZ†õß®e4žf`ȧñl†ë™ÎÖtîÑpË¿ñƒÿ™¼NœÁíš9×À:¿MÃÙŒ?sÐÀ:ÿßf½Ìü•QïÌ;¨ß² Sˆüüö%B65Q ÍGZo ÙTËmáßjhÁÏÕù6-&hè÷8}´iôtjS;ÒAê¤õÔO^ ÒoyxªÿBº•Q_ûpÚ œ„ù·«¦³ic®ÆS®6î5®¸^.=ŒÚO÷ÒÇÏ¥6p®æ{× )òKaŒÚíÉL9•Ý+†XZ&6S °÷ˆK¢‹Û­m4À¹c/si& ^–¨Íïä¾äxµ€¹v'´gˆ{Öü\¦Ÿ{J„ŸD5§ûõ`ÌsEFù7Ýs:Œ‰0çá™$ûäTÕ±BÌ•}ƒC'ª¡xkºØÊ†¸­ðÓÏt‚Ì™Íö×et¢é:uurés1õjƒFjÀäV:Ö¦G‹ã3Àn0#„—}|\z}Ü&/ÿB(æ;ã\éÚ¼îXíq_µë0ûÇãËâ£K›û̸/±Ž-³×èÉ±Ó Ûb"Ö÷åá¤g‹˜Oú[ûâ¶ LNÑñ(Ñvœ¾¨õ¶>͈Ú˵u&aÇ¡=^æ9q‹>ÕckÄhÁii?×4ÄÏÆRÂàL÷†acmAS¯CñæŸ?fïîðZgx ³VÇe/Ëwü½½×øÇöûŒ×‹ÆÇO¡qñÈ¥fÜ÷ód¢þ&¹—E9sú¤£µ¨½ šÕŸbÁ]±ëäÙŒ1íï‰ùTÇÏDõ®ÿÊc½±^'ñs¬ãg+éK²àNõ£‡=A/Ó ƒu4BRúl`N컘«±±úGÕ FãFº–{†^Ü7&ùA§w7âÉ Æw8Üô'Hµ;tsÿò™6ô½úMïòrÛýÜGâ½~¬X" ÅzP|ÔÒ5öà¹ãñI‘T¼W$F†ºt±”~Åõ·äѼ¥ò‘lMñv÷³ÚÆê~n³uo0Öéeìÿ°‰ ¢‘a<t8Òz÷ÆZæx‡`¬g„c6éDnvåu܇mÜin'H¯©%Ñì7>ÈÑÌ:îëÙ{:>a Åß|”¶(‡Üü¿uÌñbi’6ÂûÀìKÁŒKv‰çµê4þÔiK7ÛNÿ'Š£oí3¾y¬^“J+™R¼Åí¨‹½€—eŽérˆ{zÄxôà§ŠöW|L´ßŽÈìã#þºQ1G^x1½¿u"éL§Têq?ÿmÎoIÐñáÆoußÕ ~¶6Åî¢ýalûó ˆÊª?FyxL‹sF¢hŠÊݱõSqâÇs;3š>öëáØ8`ur­ãׄÍ\Åû•n—ý±þ¥©rŒd{‚i騱ëè¶Åå•aÔòŒ¾ãÞ-Þ9zͤgRNÿ©7Z×m“ûNžClH˜%;œEÓ¡˜ïלÄžx¹MN<Ò“uhTßuÚó™úV[p`˜¿nf7µÌoªG2»Nƒ-uM-- ¶Ì·ûü]¾¾u¾P/d·‡;×÷{ýþ€/`·.j°[ûúlçivÈö…6øºìÕ½>Ûîò÷ø#Þ¾¾aÛè vùºì~/¢·Ë»®Ïg#}:£ËñÚÝÁ= v vú=v$Vøº½¾°Ýçïô á ùø|¡È°ìþmo «¤ýàPïøöwù½!¿/\64Ëè®¶—úÁj°.ä Û‹ú×-®³Û‚ˆ½*ò†Ã>»©Îæ/¬Û ½]öâ`ÿºÁP½Èê÷†ìÁÕÌþ©–Þ¼zááú“³á`wÄn †‚!¯Fq$·Ò‘ÜʨäVxûð4Œ1³0Ø×5*ÓÖ¹vë@ÈßÇJá_(ŒŠì¦†¦¹QŒ(B}"Ý«mØöB=þpÄ‚4ÐÖ.ŸÞ?>ñŽ’mÃÒ%Ë–¯^»ÂS¿Ø³t)°³€ö‘ÞîÑÜ¢z­Ó._·?àø7øì€oÈÞ`øgâÅÛQ uöP¯¿³×û>f¢Ëö÷l?ZÝ2w¦Ýë ÛëôWMaj03PÒõ C}]„íþ`8béÆ ÛƒÚ¸"Q{k°;`1‘^0¦91–å¨Î^ vûÂaàhޏš®w(`û}¡à ÄÙÕå×jF©Î^oÈÛ Á¢•A°ÖÙ7ØåƒØlßñµnnÈèaöúü=ÞÈ`H['“òöêÖÅÙª´¬Ãƒ°¡w—6ôß>ô ~°.éE› Ó`Àd û†»Eú³± öª_§_ó¤û‘#h1â]¯Ó :j¯W‹RKé¸AoŸßé`ú¶ÏAPiRz—?<Ðç†Ø #1 Çw¢2H  9}Ù±ÇT{/ìÒïƒéi MÛ!iën@ß÷"ÚÉh»1*ÓÄ I4MËÚÔˆ,`íx"€ì0Z ¿« ÂftÛƒÁõ/üˆ?ØåYhpF}ÁžpCo$2ppcãÐÐPC7\@¸¡Ë—ÕíÕ hx#øö„¼½ÃŽ Bݽ'À:@¦ŸYÕ4ìn?šÙé…Aù¡.¯=à÷u²êã^B'CZAܵÂvO†pœ«Âq†¶W ¸ßpl…£¥aÄÄu÷{‡mˆ:·{`uÛ;ä®j_—v†ìA¨/èÕ•Á‚Za-I87›‘× Fìáà ûaøöàƒÙ BcÖy;×ÀŒÝ$6»!Çãn÷‹¥N3ÂI™¦mafŒ †ÐtçìûÇöÑ0k¬9®š(–Ab±Œº|¯j8òG|šõtû+RÜ~{ý(Ç_õüuv‡÷xûÀ9-Óç55ϪŸ3Ž=§¥…[|8l«Ö¥˜ã^kd§õ ? ¹ê×ÈÃqÁ¡iEiÞ!õ„qc éóA*t ç0v#l7ë*ä;nЯõew†#Á~ÿ ¨4Á»Æjc~5‡Zøh7›+> endobj 437 0 obj <>/Type/Font>> endobj 438 0 obj <> endobj 439 0 obj <> endobj 440 0 obj <> endobj 441 0 obj <>stream xÚ]‘Ýj„0…ïóÓ‹ÂöÂú³«vA„ÅRêEÛem@“Ñ 5 1^ìÛ7fd HàcÎL'÷wç&8 Õa°Œà‚³Z Ç zk5 «ú¹–£…ðloÐB?Ja6 t8Œ’Å ˆ‘Ûüͧm¸¹Î§ZöŠ„ל­¹ÂοøÀÂ#ÐŒr€ÝWÕ8n­pBi!be {·Èyyo'„ð$^œô¯ñyÕ‰ç˜yŸÃšÀ(ñö9ZéuÊŸ_[&Ž endstream endobj 442 0 obj 531 endobj 443 0 obj <> endobj 444 0 obj <>stream xÚ]’Anƒ0E÷>…»¨”.(„`ÓH)J5‹¶QH@ì!E*²Èí;ãA©Ô̳lÿÿíñãáŠ6¶?C´zNäÆþê DÛ÷zñvÿºwí$ãƒïM“lZgý¼FžáÒ:±L¥mÍ4Âßtóæê6NÐí]Ó‹¢ñ'ÇÉßä"8>‰øÓ[ð­»ÈÅ×¶Âqu†èÀM2e)-4(„Y>êd¼±o½‰péßÄé6€LÃxÉLoaj¾vE’”²ØíJÎþ›K×¼åܘïÚ‹"}Á¥I‚yͼFΖ± §Ì)qÆœ+fEÌ:éd¬“Ãlˆ-³%n˜d•Æ‚Ì^Š¼ÔŠyE̾Š|û*òUšY³—"/ÅúŠô5ŸEÓY4kjÒÔ¬£IGs~Mù5ç×”_3³¦&Íœsæ”3çl9eËY ]þ|ËÔz ÷¶š«÷ØñðŠBO©›­ƒûCúv…ï~¶¾ endstream endobj 445 0 obj 936 endobj 446 0 obj 16181 endobj 447 0 obj <> endobj 448 0 obj <> endobj 449 0 obj <>/Type/Font>> endobj 450 0 obj <>stream xÚí½ |”ÕÙ7|ν͚Ì>ÉL&;“…ì+Á „$Ù‰A‰$,ʲ1bkÕ­¶ÖZjmd P‹hmkQI ,æ±.h­".U+µÖúX$÷¼ÿsf2Ä¥íû|ßóýÞßûûœÛùÏ™û>÷u]çZι®s‘PBˆ…Hø0ÏšZ?·ü¶Ò Bh,Î-ojo%QD‡ïsñݼ|Uײµo|X‡ïÍ„äݱ¬uùê÷„¿#$ÿ®¯µ­¥õýS{?'¤`#úœ_µviÓK#g>©FB¤¢Öµí)ß/y˜²û‰øÅÒõžå[×·RSƒûXÑÒÔüÎ¯î¾ ßßdüëçΩ¹#wh>!µÑ„ñ+ÐÁœ­'dz ®'/]ÝÔ:£sñðôõoÝØÒ¶æùØW_%d¾×g«›6¶JËÅ|BZYÏš¦Õ-†9ž}ø¾ò¬Y±ºcã¹nÍlB:N¢]៓wßä‡~BÈ–ô_B ”)¾0K| ·GÊ¿"¤º³£³­ÉS³Þ|‘Ð+¿ pzNŽ@|Á¯"ј ÐÈ2õ~i™¼ m qûŒR-Qj©V¶ É>öâ…\b~ñ‹rl–KJ‚%a™D.·‹1—ßUï×D~öq›â…,Zõ }zAcOG‰G)$ó‹ÇJKqÿåc9>s6Í&ˆe¤ŽÈ bÓÅtú¡ˆ¹Ó™ç^³ð·D ! ‡¯ÄR\²È—œ)î"}ÂzFShŠ„»ýt¿pP”p5€«qî5ÿŒ5Å0…Fž²i7Õ3zÝsô,-$â=¢F¢ƒô>9ÆèÙæ‚Š‘S1âRI±+I‰©…EùyNz¶¹fZKË´i-wN[Ú\]ÓÜÌ,AIœzFÒ+‡!g³/’ˆSè—”wႵÔZšs$•¦ ^QäZ3Ìý:…Å— {Å!2(H“h¹PKºÈFºAÜKöÇéqAÏU•F%ýåGʼnJóg+gi~ û{ç¤ °¢ñôŠÏ"¦:t©&‡#>šˆFE´Fsó3A>¹`¾˜ã³g IR¢6ÝmHµy£4)!dLã\fÐk˜>®Ûh.e4Ž”m“Ä2©B*ÔæhótS#«ÌuöéξÈ}æÝöÝÎÈl1[Ê–³•lM¶6[—mÊ6g[²­Ù¶l{¶c’8IWQYd.²Ø&FÕ UR•¶N_1Ù2ÙVµ^ÓG{å^MŸ¡×Ükïsž¢ÇäcšS†tŒœI‰‚ÃnÍϳ¦˜IR"±˜I~g}¿½mÛ]ë:î¦iêó—>W_¦—.Ó,QûÍP_øø/êÐ SïS«èt-½‘>¡Öc<¯!ŒÒ-‘É\ŸQH•œ˜¥D"RÅüâåc˜-ûò¨j¼˜) yb•$gˆ“„‰b…(ú=t£pÝ(8‚º9²EÜ$ ˆâb/µ$ØÄ4õUõµÍôyY JÐ_*07äÂVQ´ÊçNƒÖe0Å;]Ä)8 2%²`5PcÐd/³XK™ e_¸|ìkçøôU´R¨Å:J_ñ¤¯Ø¨>Ûm,£Õ‚¡çð8 iŽPd/vä8Š9N?™,øE¿ä—ýŠ_ã7û-~«ßæ·ûþ¨nÚ%tëºõ݆ncwDwäz‹‡iŸEc„9ˆ3  2ºi3Ý ´ [´›tëûé¡Ç#†~C¿qˆGÃÇ1ñ¨8`8i4ÙÜ´Mè;´ëíëÎ=ôaÜ´[|XÚ­Ù­ÛkÜmÛißíØíCà˜xLTNOD E³·•þ§ðü=ÎYØtË ŸPòæ‰{ÕsêƒvA •Â.ãi½/%Õ첺ܱ½Kžx¯Íì´¤&EÄ’8'µ$E°yVñ†L€e˜qx„»`¼øâÅÒ/LR<¼ÜH^!#][“[W_š*[r,9øš—ï'~êgÒû ~£?Âé7ùÍS-SGäôGù£ý.¿ÇŸàOô'ù“ý)þTš|·Ô-w+Ýš›´Ý:ï³y¹Ù¼L„ ëæNa½Ôª´jö û¥¸¾È>h½7ú‘Ø]ãv%ô%ïOÙŸº3íàøÂ@̳±ÏÆ ŽLpwȽ´ñ¹[Û§ëÅ-½¦^ܲ'fWòÁ”½©ý©}iƒô„4u2þXâñä(&€]JJL.L°;óóŠ`¦ j 6`/|åöR4ñT*UÿôÉyõï4®£iMûæiI«V/™5‰N½høûk/|zûÚ[ _ºôÉ [ÖÞØ¾žê¯[2ûz==þÒ¹ßm}Ü÷*‹/‘H¤Õ [#È ÏAõF2N#ê² %¢A"Z…Dš_,?v¹œ óË/äYYžD!U—ªÏÓKÙ$ƒfÓlOeÁi̘a¸²ÞÙ®¬<‘ܨ‘8BF™¢/×Õèüº~ÒOû…~±_ê×ôkûuÁcŸ¾ßØq’ §uŽtš®/Jueú*ÝT}§nÝ)ÐíÑŸÂÒøœö´î¤ÞÂth¡rÖî„B,kùÂaõFqævõüÈláijÜ.D w´W_ Y·Ks/+f |9:ˆ§>ßxW¬Ý¦ÍŠ^Œr9Ì ±z·èp8cÓÇE;l¢KgVœv2Î| Z1¿|ÑR\´Øba¾È|;Š-_>]ª#Ñ™•-…æ/8÷8®‡q8BzxÆkK‹.ÑLÔ^Ya­°UØ £«H5õÑ™R­¦N[¯«×O‰¨¬Š^'l‘·h;¬ëãöË´»­»ã¬Çã²”${¢#):ÕåqMR 4%‘9¦3‚Äšc˱ç8r¢ó\9œØ™d:õ‰>É'W+ÕšJ­O;U7Eï3̈˜éô™|fŸÅgõÙ|öÉ_ô—Ïí‹ñÅÖÄùãjâýñ­¤¶ R«±5¢5²ÃÕÛ?è˜Ìto& ‰©iÅñôŠÛ¦Ù` ‘ù.‘²Õ!õü†g®­XwëÕìï»cÚ“«ï>9—›0%ÿÕS¯·K*>­Ïøùw·îÊÍÍcÕOÕËú:÷×ت¶282䋉NÑÃÖo§3&Þa†A ²Æ›ƒsM)óZó1nžWøâ=ÄC=BªÆ£÷èsYu&³ÎíÈScâÍ&£QlAGÇ›yÎ`) ¥˜—ƒµ/óJÒœ™jβ¤[³ÙQÙÑÙ®l÷$±ÔdöšS¬h ñ–¿ìÃ_ æô^ëqÓQÓI«T9ÃTi©vׯvEn4í7õYûœû¢†"O™ž³º†âÌ_ VA¤ '›|Nª“ÝDçDF Ó(²$P¢µó±clÑË.¿üâf™H M3µ^$ed­Ldv•¶V+ÖÉUÊ~²SØ'íÑîÓõê‡Èäž@Ò©W;‰–h‹t{Irá>±O³Wkdö2Pš ânxöq«z¨eäâ2õ`¤Ë„záÞ‘µ#‡é|uDå>Š`¾†k‰…xÈS¾„xÑitG9e·C£MF‡"Å!’5&B’œ ð¬¼cl±°£¹¨òDÔwó$]©¾B_f©°”º+Üå1%±±3t5z¿¾Öíw×ÇÔÇÖÆuYöÑ}òí^–£D4õ›v™±ôÚö¹ûÝûczc×?nÈ6ht ÄõNr—›¢›é®ŽõÅvÚ7¹z…}š¦]–=öƒ®è¾'®wÜ }ØuÜíh0ñGMV"yB)|ºµkæÌ-[ª×m5›×ßD»ÕWÔ7ÕûèTj¥âmw Ñ×—­Vg­.\;K}hñÈÉ·>T´ƒÏß¼Ãñ|°®b5p/âÏ… ØåŠpÍ:âÍÓ#:tñn›„’ß54/\ ÓvKi8W-zGs;7÷D7ŽP\mÊ5MŠª#µ´Vª4L¨‰Þ"l”6jÛõ˜#;L›,ëë£6Gïb{J¿r@Ó«Ý9DLƒQg¢‡£=‰$јGòŒ3m½±>¢:ºÞÕ&µk·˜Ú­öÎ褷ñìÚÚ3@†èc(*qš‚¨ô°ª7!Ïe™ÀB”—ÃEÅRïU5©»Ô5ôçt^÷“³üO-yY |øÜ棳æN˜F£mt }6§H}´zºúþûÕ?ÏžÏöàcC>ÖäC6é”]FE4%"é$!ÂÊkh(T„bY-ò õš:“ß4ü‰nÒÞda~¾Oì“UBµ¡ÎXc¾Ih×´ê7ºÌ{„=â~y²WÉ@à¶gÕ;·=v®®îÐ2µ^ݨ¦ôAú„(ý….©î/êÔUŠVmgöE<ˆ[yž”ì³j]ŠäœzÑÉ’FD†Ä ›w!/(å‹rƒÑCÜzù’¨¨YôöÁOÕÔ¿«ÝÜonÝ  «#™>qi—äÄ(ÈDÔsoÉãó4Hút%XzK°à²ø õ êDõácu"ªÕïté“ÌÒ\ælŸEpiõŠSBÈ D# ²‘Å닜|ùårNŸW ¨¤ÅcÅ—>P_¹Àò{ÁŽ7g1r·Ðôûµ€ÁC$æ#‚+Û'»ÀôÀu@d7òI%¨Ã$¾çQäÓ3Q lÇã¿áBÎa¸§,ðÕÅöuÛA±Ä¤‘…4‹nV´Ÿ œ®™¥täsŸK/ ¢AëTDb4èuZL²¢@ D6ÁIõV¦¥ÆDÂöÃÒ¥t9AÉÒŒÇT›n@lб@Ê—‹•"M޶P—£/6°›&Ti¦éÜ©$]H½¸) 7 ãÕ#Jå|}޾F˜!W£ª6Ø®,‘ÁM¬>’£eÚt¡JßGö {¤½r*Úúýn£aºàfˆÕÒL¹Fñ+5¿f:OºÈ&Ú©¬×lÒn0¬7ö {¥^¹O»C·ßÐk0Äð‘&Q1Á–€QéQÏÞ­?¤¿[=û]GE¥ÕŸÿ½íå…âÞQ›Èpÿkò™5‚VvŠDCQ” ¢¤ã"òX6X6z&ȺKØ£ôi†É):Œbòiå”fX3¬ÖYÒ…l¡L(Ôt ë5}BŸæ=& iXõê¥Ü~ùõÕ‘\$×iÂ0M“¬Ÿcøüc,Ó¼&Á\ª¸B9lÀg='¸Ÿ(éËû‰W&ϯۈúÍMÂ&©SÛ¦_Ñeí¶uGõÑ^¡WÜ#="÷*»5=š=Xrvëû {"÷˜÷Ø£‚im8©5U˜+,Áú±Â±‰v‹ÝÒ&¹[éÒtk»u› ]‘ݦæ-–nFÚÞíØIöÐ0èÁ„´[ٯٯíÑ= Ãî2ô{"vDö˜v›÷ZvÛvÛ{»œ{¢z¢†ÅaiXV‚Ê6 ›‡-ÃÖaÛ°}ØQýÕmÇ„àì!Òù?ñœ8þZ¢NW‹c:&Ú©8¥7i¬úΛoªïÐØ7Õ=j=Má8­0ý²yAáó®ÜîsÈn£è6;#ÑÂ'ÞI0Ùƒ¦zƒÐB/ÍÕ”i‹ô]t³¾ËÖGú±ÐôÓ½B?ÌܯyDË·ôý†~ëAÛ0¦ÃBhXúa”§TSª/5”+Œ†ÍÖ]Â~ ›aìr-ï6x$aø¦ùù[Ûi±úêHf’…ÔB¥Ü5íjù_Q#{íßÈ蘶ð19È>—ì0 _quz+Ö†e5H‚.ÂÉ&›ÑY‚9פ9¾%‰º}¡R¦+Ó—&ÚKŽ):¶Ätèºô|'EÓ§}X·ÛÖçpdè¼úlã Ù¯=Ë‘§”* ¥ö›t]æBÜ£ôjz´}:˜ÝvÀ¾ÃqÂ>lw$M Á!²ôCøôÖ;*+¿ómz»úcõ>Œ²‡ÊÔtøRÅšõº–ËéÂÓ#Šö¿ôÙ´À9ñâ#•|©®8g²Ù­QôbœË%Iƒ >>Mc3'{Ü®I!ÁeKãÅ{0ï/µ†w …röÎñÙÓ-É)‚WN7¥›Ó-)щ‰©Éš1›¼i<¶Òp„bë»ãMÙ¦ôÄŒ¤ôÔ|s®» &'¦Sè’Ú4æ Q‰É­É;åƒÊÌn»Ì}–GÜ’{SN CÒ å„c îdüp|ÂxSjrJj©\®)²”»‚ùaAò ÍLwÝ¢¬wÜìîJÞ«ìF2ÒçzÄݗЗ¸7¥/õT†,Ööу±gÆ%nõÙ*I ]Î( ËUP`D9£P|]R/Òw©ä©q/¾îúoõ¹ŸÊoÜþ\Õ¯ân­žuíkãGwÐ}¯_ܼö¥Y- çÕmllù»/´4Ÿœ8sΤÍëÆ_d6°c-»þ¦!Õ>“D\ŠK–m*JZ3««xÔäÎNÁ„NË5Èœ4¤AÝx’MÒd,…Wtñvõuõõu±]R?‚e=nZ‡üò¬Â2¥Å>»I§Ñ%:̧ܵ’b OŠyŸ½;Ç—SK«¥J¹µ@?íØòÞ‡ec´Bî7÷[©µZèz%f^ØñÙÅi‚[¦XÿÏB ÔO0[oÝ|ËM´XX¨žQŸ¤~š.ºó£í÷ÿD|2òZÇË÷E¶ú"e‘8)/qÊhF+,#5/0¶=’&eÊJ¶RF®¢Waâ…(5¤ŽNªÅ*iº²žl»¤r¦U)î•ãÈx!QJ…ÊŠI–ê<¹’ÔиÁ'w‘ ˜ÔŸ•­ß&ÑQÙ«êÕ_©zÚ@+¨OÑþã3,4·I›IH^é6nÃû|fÙy]¢LA" ŒxìET…>ý]¼|%r:n‚4AÊ¥¤€æ yb¡T‰«$S2OÓ¥ñr!)“”Ñõÿ댞¼žì"}Ò.ù8=%”5íä&©KÞKöÒG¤“È·OKƒrðY[,,Òm#ÕBïç· OÜÃrõSîIOŒãµm,ù•å™Î#º£tn‹#*=&ÃèŽ E¿=ŽûFÏNƒ•ø/íÊ}¡ôˆãBÇá —à*3åºXw:å¡X_éê{$6Õõ`ªëÑõ˜{,=Ö¶ûNG³'ª×e îÿóD..pKˆÜ-œÜãCÖ§°ÞE¿TþÓ„BVú …üIJTa‚Hº¯½vËM×]w3§žÏ¼sѰª_wwG?ݰsÇÆïP·¶×N§™~H³fT·³µ`ßÛÎõ²Òå­6èvëÜÈ"2Ýé6$ìN«B¸bòò‚éꘒ ‘“.O”ê¢C[èlE3ÆŒ»?fì@Œ91:/ú@dƺ3f(Ró¥] »Àæ"‹h¶åh'±1°±Ð$>õ<LJC?ÛððÃ6îܹñCõ÷3«Û•í—Ï×LW_‚¾`_E$jÊ—ÇÖ”nÓš2Ým£ÿ5åÆWEDEdNtŽë&ºQèÚL[¢öÓÓÂqé„v@?`0§=Æ”OD!¹’‹BiQ‘cÌ>^ø9^—Ø*µÊìO«¶Í¸ÁÔjiµ¶ÚZí­Ž}ÈvwiF¨¢ íó„*ÊþŠÅŠI«j.c-̾T»zbÚMå]?ÿñV߆ñ )q4ùo¡ÞXh0½ gã­?)˜@Fc!dóÇ|1î(á †˜Ì¨ô A›N]ÂâÿVP$æñ€«\cBá añ/‚À§ï‰é‰²Š'ÿ&,ÿí8ÇA'.øÏð…ÄQ«/Æj‰$z1!&2ÁâpĤÇë-VB4…ð]A„Aé•gˆ_~nÌñ…Gò£ÚøÊ®ßK»œg)·VDû"|¡‡ Ó¬>ë&Ò¥tóì)¤a³±Í²ÎÚaëŽf©ãAZy¿u¯½/ª×ÝËJ‹“ÂIqX<% kŽFƒ&BÈ ûE”™?‰àÀQ}Ù<’GN0%Xø²aZgyØ¢£Á_±ŒÝrÿ¡újªªjboñ"ýQ°ÕÄcŽí'fAz²ÜgÓkQ›!gŠD/è— ¼ö þ¸¦ü¶TîÕæ!,ÒæëêÈt:C[¥k'ë…Í LrAÙþùèïÔÉAÙèmM$ G„L&nxŸÌgôÈëäYìzD!¨ëz#…‚÷*ZÄR"9åK¶´HP±öD)'Œs¥Û3¬:«×Âܰ¶ÃBlIÜâ—ùC‚^—ùo `{ µ¹ÀSçô;Ť˜dOALm(éK»â c§¶ŠõÇ÷ë÷ô'ô'ö'ÛÂ1”ÄC. ÇècŸÝÊÞ¸§£†¢O¸OÄœŽ=§MKö$'ç$û“Æ DvãÂÉØ“qF¾_uÅ£®¸–ƒ»VTÐÁ­úNqõŒkÔ·9B!Û–µÜŸ¹oéöï ³¶4þdÛÈåÑOñbg}íüùþÅOž èÌFº}QZDB‘ñOƒ+(ÇWŸ®ñF¦Z½¶BK]„?bݘéS®ÄÈIÍÓ¦!ó Ë0ÊPWº’¢IŽÌ´{”AùtÄ`äIÓIó3ã—#Çñµ‘óÓŸFQ[?|2¸ÆršI¡gWõYD·ƒg°éÑü‘üW~WgóR¯œ¥x5^s¦%ËšióÚuámÈ5ûÿ`‡ôˆv¿¾/¢/²×¼Ç²ÏÖkßíŠ89h>nr<í|6Ê2æçZZ¿®6’mÀ_I÷ö‘ý´GÜ)í”w+»4;1KÐï7ôFìÇZuÀ¼ßÖãØïìêw}q·k0âD${ ;l~Î2l}Î6 fÃŽ3Îagñ?y†ÏÆÜ¾tù­ßZvc7MTÏžK}‘¦¿sžzég{~¶yËCv¿£ž¢ï¾G³Õ3\ËF.HKBuÒ _¬Õ¤‹r„ÊQŽŒ88Ä— ó…±¥’oÂD©öŸ”P˜R$VT£$øå@جâ”[–°rອ4þËåÀú¬ص—#]ŠÐÎËOK‡…ÌõE“Q/i´TòPSº>áoТ³òIÎ2æG{|ñ ÿJÃcò˜=–iš,þ£ñ{–?ÙÀ%CË|ØOE)?&Û½¾I7~ëÍŽ¥ ¸V”WÍ¿þ®Ï?~ÝýßñÖåLœ2÷úo}ïåßv<™C•”¼ôì))…ßßp÷ž‰¥;¼ Ù)…Õ =7Ü·Ï_ÜOrå|øhƒÏŒ4Q«W2¢£DÖˆÆÐÆØbYëæ<ÚACOIBIkäË? öEdG “£òQeØ0¡\IëØï¸rïRϯ[GÇÝ5šÂU©¿ÚózØó]ñ"üìžÑ½&7ÛkʰšØóµ{M±}´GÚ#Ù@ºÚo3ì£}rèǽ|Ѱr­8FG„ÒC_Ä)á”ôŒñT„víaÚ'<"÷Dì‹|Ø6@OʃúS†“F¾ÉÇ´=v{J|÷•÷?~žŽ›5×?‡ÆÓg?ÿà-*#G–5-kêBû<âÇ‚¼À$‹$#´/¥aS/³\Ù™ªô’T1MòHã•l¥”‰…R±\KªÅ d=Ý$l7J{H/Ý'ì÷Hû”!rB8.—N*±Ér¡Ü.÷Ñgeyt÷)†Š«÷ªo«÷ÐIO/^¶ŠGº…­£{OÊLÈd$ŸùÜ­(BÍåϬ4ÁgVD‰‹‡œ?µªN!’!¤ˆ)›ìS5Yºl]’>ÃXJ‚.&¡+×–ë*tŽDtÅ¡¤iÒt]²ÁcH1jó 9†ˆ1ûS¼fˆ`¨B¿Í,+ÄRm©¾V¨ýâTƒÏ°‘®—×k; ƒÊ1í Áì‰,”ruõµ¤J¨«•z]µq=Ù ­—6Ë•šÚMºýCŸþ$9AOÃÐÓQiPԜО2G&÷· A=á?e¦úSõ}û ®ítÒ‘}4nߦ2¡a¤jë¶±7÷ÏÀgì7–Цù¢ ZYtJ†HxK¯ ½T$chûÎTÞE®;W¸òëðñZ¯ÎkÈ#zœÒáM"ò­|%”VM ÅB±®Øp€ì6œ"ÏÈǕ̀þ¸Á˜(& ŤT(Ñ–¡C-­«4uºä‘ÑÌZyDÓ¯íÓ&Ãô4tÁJÚ3ÒyX>¥ +§5ÚÓì)‰î´~XÆ0lýt–—tFn#((HÎn²Oè“w)kû ÇÉ*Ú“ò€Ö°Ùã.¬¿»±þîÓõNKñŒ6˜kØn(S5•V«?yõ%µ‡Þ©ÞK›M—¨wÑbuHPèû쉜Íæ€H¬™^èXC¾í³(b&J«Qd‘Ê‘´ì—n¡Ÿi²°¹v‚˜%y•tM¶¦„ÓB¡H*RêH%­†{TIÕòtÍ&¹ìFØúä>¥OÃ\!†ùrM”dÍDZ$ä)5„måVKë”d/ÝÅR Å (_òŽœQŸyAý½êùañâ?T!K|id£p9|ÒK2=æCBJmó!ßÕ ='%de~é«Ç¬ñ"³Etyžf-”bäE‡äØCbŠö”’tþŸ]<Ÿ•9}ÖBÏ¡éU•!ªUK*qnÎB4Ù7œÆùªÊ,ò„p‹/P«Š5Óìr*N³‹ÕªX¥ŠS§l‘§ªâ”-âdß6y²*N>*ù*ɾm¢ï©âªT¹b‘Xá“®J'©bù¯Å‰¿Ë.‰%Å™r‰*gŠEªXX0M.üµX0MÌUÅUÌþµ8a‹˜¥Š™—ÄŒKbºw›œŽ£’wübÙ»MôÞ"OK•Ç/Çû¤´T1u²˜’¼MN¹$¦•’“ËÉÛÄä[Ø£9i±˜ä“SÅ×d9a›èÁ‡g›8㶉ñqÛäøKbüQ).v±·MŒ»EŠI•c‹±>)&Ut£Ÿ{›èš,FGm“}Ë¢/‰QÛDç%ÑaŸ,;.‰öÉ¢M­ªhQE³É.›UÑd#Œ½r„*{EÃQ¯Š:m¦¬Í57ŠŠ*ʪ( ²t¿(’ɲxIð!4ˆôΉä Ú|Û]4㟽HÆÿ¯¸à¿ƒJü—Ç ää)Jèvú²°Cüޤ•Þ7ʃÊ3š™š»¿püY{«.Vצ{Hw‡ª·óçÃ0ÞðŠq Ž'"6E<Š«1tüfìaªAŽ=Å|Úò]«Þú”-ÒV‰ã¶Cö:ûÇ,ÇaÇa'qîp¾5+j{tIôŸ]•ßßßÿ'^ò—ú)9C¾æ%¸±ü è%‰ÈÈY5„ý:GÊÀˆ,-’˜ˆ™¹•ØP38ˆ“D¡w7‰AuGâÉ8,ª ˜’H2*²T’FÆ/I'$“d‘ $›ä\‚R‰BRDŠI )%ed")'“ÈU¤ Çd2…L%•¤ŠT“i¤†Ô’:2Ô“d&ñ“Yäj2›Ì!sÉ<2Ÿ, É"Ò@®!d1¹–\G–&r=YJšI jÖådY‰ÙðF²Š¬&kÈZÒJÖ‘6ÒN:H'AÚH6’.²‰l&7‘-äfÒMn![É­ä[äÛä6òr;¹ƒÜI¾K¾G¶‘»ÈÝäûär/æÖ’ûÈÈýäÇäò²ü”"'ŸOÉ_ÉÇäoTKuTŒÌHFh ÐHj"P3µP+µQ;uP'"ŸÑhê¢nCcÉ%‡Úfõ K$oÑ$šLSh*M£ãÉR/M§4“f‘wÈçt ûšKóh>- …´ˆ“i -¥eäOt"-§“èUD¥X›|t2¥äÏt J+i­¦Óh ù­¥ut:­§3èLê§³ÈÛôj:›Î¡sé<:Ÿ\¤ èBºˆ6ÐkÈ»ä2mDÚ|-½Ž.¡Môzº”6Ór.£Ëé ò]Io 7ÒUt5]C×ÒVºŽ¶ÑvÚA;ézºn¤]tÝLo¢[èÍ´›ÞB·Ò[é·è·ÉÏémô;ôvz½“~—~n£wÑ»é÷Éé=ô^úòSúCzý½Ÿþ˜>@‚uö§ôAú3úý9í¡Ót'ÝEwÓ^º‡î¥}tÝOÐGèAÚOÑ_ÐGé/éaú=B§OÐ_Ñ'é¯éoèoéSôwô(}š>CŸ¥Çè¤Çé :DOÒSô4=CŸ£Ãô?èóô÷ôú"}‰¾LÏÒWè«ôô5úGú:}ƒž£oÒóô-ú6}‡¾KÿDߣïÓèŸé‡ôýOz‘þ…~DÿJ?¦£ŸÐ¿ÓOéÑÏè?è%ú9½LG¨JÔ°‚(H‚,(‚FÐ :A/£!D &Á,X«`ì‚Cp QB´4s^}½vÙÊåí­MK[t+V®á-MËèçêà•öe+ºZW´¬1¶¶´­\Û¼´eMGK›aéÚÕ«›š–²ošÉk—¯]Ór£fòꦥmk×(“¯okYßb˜ºteÛÒÎÕËVµl”¦6¯íP*—6±Ë•í«šÚWhª‚w)Uü¬¦*ts¿YªÂ †iW(h§-mi^¹jU“4]©¹rE©íX¹ª¹ES"PË hjƒäµÓGï«g"ÔE¨oZÚÙÑ¢­]SfòïÊL~U;3tZã‘ôs’:óõ«‚g‡>‚ýg’™ÃOæŒnn°ËÜÑ.ó‚ÂÎ QžÇ)ËóÚV®Y®›7J_3/(¼aÁJºÍ+[ÚZÚW¶+‹–·5A¿‹Æ°ià÷I £¦)D»)¨ˆ¦­¥c̱”é¢9¨‹– þ[BwµõßÂ(µ„t¸<$½aùË™V\9¡Yê}ã¨ÆW1.«‚\‚Ó®ÕÚ ×Õ³fTãkCR¬ j|mXãm¡`ÿ¶Q2íA·QEG°KÇh—ΠÆ;C”;ƒïäï k¼3¤¥ c4¾!¬ñ® Æ»Æ°ÙÔø&6Æ•A+C,VU¸´¨ Gž¼ªuE“4¥¥£IžÖ„‘+[Vu4iªZÛW®Z»FjÀ± ç®@Kª]‹æô¦ÖÖ&¸èêë››„ÂÌNaáJøâJF\˜µRœ½b­©üï$Šÿë=òÔ¹ûö…>Ϩ÷ŽœÕUhñUáýCUf3¥´ùß¾ìÿ¶‡ÓØl±Û›ív ïë´4;¿¾^v;ëÆ¯Åö‹|ÿ7ýª¼l|šÿÇ_v6Þ↤Š}ŒÀN66‹=Ô©Ùn·ÛÿÀÆÑ¦ýWëÿmm|=Õ h_R6H´#g ÑmWïU «¸â9Wv)ˆ|+Í¡«±ø†ýQ(û ƒµðÿÝ»DpaÇH/ ûÉ­äÔûƒ4ŽõÐEt²Ú@é5ÈCi2]Œ¼–¦Òë“,¡´™üšf"'ÐåÈS–a–z3´'y3Ò¡ý°‡B;bl?ì0}tÌžØcð¤}aíô—¡²ßÐ? &z–ž§¯ÒWB»[¯ ÁF_ÿÂÞÙv»`$!RP9´o¥¬ÈŒôô‚±ÛDÓéR6c N>ƒãsèŸco'?!ï“ÈîofŸofŸofŸofŸÿC³Oð×pÄõ ¡ÒÕpn=¼]Cìêyd²ÉÈ_u$+ð6°8p XxXx XèNâ}j‘¿êsf oÕ!ÏŒ6ö‹T{`ÐLØ€,8\×@ÜøïU£Ø_œà=³8–r,C~lvWrfä¯DfmBvk× @ ø‘KOÆã>±>ÚÕ'€Q8LàrØ<8|,ððñÀë bèŽÀÀ(>wà‡ÀdÂÎç!ï6“"ŒÚ üXʱ,p810,lN ¼¼&ð°1ðpqàIÈg œ2y,Ä`¿7Œ†„>^ (<Ø| rZ U/êðaUæ=d{è„Ì6Üû ÐØŒ…ü6Œ:Õ…1°h xfŽ–À8 -д«ù¬Q/ê§À(Þ'c·¸ØA“‰áË1.Àîúv`,g‚äP>´`tмt޳Êúq€&ÃhŒ×šO™æ ù606ð40ÖtÂV@ äw‚Χ@´ê×X•„‘:Aç%  ^ç^` ôæ§`'#|, ZbÈ, Oà…* t¢Ø¿ 2kFáÞO±gqðÕhPp-Q4´tÈF :;€NôŒ†$çù¿3bmèGƒÚ` $µ] a‚]$ hw¨½ ´«gŽÀý@gàUÆ ÞâvÞØ Œœ.ÐÙŒCè‚5a дÍu@K@ÚÐÇ‘ #ð и¨Fƒš”Ù¿y}T˜Û±ðj7ì¸ÑcDõÃ)Ä€Â0Ð ;ÆàÞ÷€LW1Ü^¨M¡óX®ŸXHr-Ð.±|\±Ü'cAáy :Aô¾Œ†cAgÐ ÅB†3ÀXȃj\âà­•@fñ8XÒ t¡ÞCÿ'1òÃX±vĆÑ‘Ì#81ÁÚ©à˜LÒCÀ<Ž‹ɈÍ;%à˜ŒÝ,ƒ$Ɉ͵Ài¼O-ü'™ÔÃ’É Ž³ùù¹r\¯K& 1ºdÔÉ À%°x2¹“÷éƒÏ'#fo>xø8|,ºúhϤdh8sœ˜IدƳÀ1…Ç{ ¤}X :)ó,°¾”Âg·Ôðì®FÈŠt"Ð¥²¹ háX±ÔRÑßœ.©¨ùú96ÂëÒ ÕS@ f˜4HõÿÓz¼³àÕiçm`1ìžyØÕ2Hž†™í `9Æ•-} dsÚxÈ4A“ãAó"02Œ‡]>æq,àX‹åsÀR~oYàp"?_Îq¿wo7pd£öboðv!os^¥ÐF&·Q&lô.poWrîÕ¼ÿ4Ž5ˆÚLRÇÏûù™ÙçrœÏÏ/‚ϰ\ h,Œô0–ÊâËHȪƒAb̸6& ÒŸ¦sÌ„½&À⇀‹ ÛÌef` ì;yB°RMÀú ¬DäN€? ëácà G€ 0Æ °þ“ÀÌÌ ç;Kà9ÈYÐ3±Ãti³kQÀdPΆTOÓqo6ä9,Ƭ› ž–ºeˆ—løÆ|`%§Vͱc̆$ŒËlÞž[gCÆe!ÇEÃÀŽ`_`/ð0ò–lÌ3ß>Ž9'&Ù<MÇ+9Öðóõ9a8T|õdñËü Èôœ [¼ L…$¹Üsy¦—Ëý0—ûa.dx~c‚&ópדÀdÞNã¹Q&옇»ÎY¼çñHɃ6ž–ñžù]l&É#U°xrEv×tÞžÉÑÏqÇ«9Îá8㎠ù]×@Â<>–|Øë,Јa>ù3 ÀxøR>ä¼ ˜ ßÎ'iÐ|>Ïû§ó3¼ÉÛÙ¼ƒxχe_æó3…‹xŸbα„Ÿ)Ã,‘qõËa¯|Øúà4Ž5káÿù°8£éÇŒ‘»8šÉ‡ÅO¯o F’€ ¡ÏB´cXL‚~!Æò0W 1Š ÀtŽyÙªW©Þ–€W!t>,ã÷–à …ê=`5Æ^©.ëù½³ù™…ü^¦ÉBXùIàcœ×ãðö"H2Èf¢"î-EÐçKÀTô/‚$oó8pdZ*â3IäùXŠ1ñÙ²ˆk©ˆÏ½Eðð€ˆšbXðЄ5´˜ÏÅàõ}`ÖúbØñ0Z ¾Ó9fÂFÅàÎÚEðÏbz¼KáçŘ –³|èVs¬Á\]L¦sŽõ¹vaíÙœû¼ÀAà|¬’ÅÐLp—¤c#"½³ãÛhþ’ãaØ·±É¨=IJ0–€,³)ÁXž&#:JxPÂWÿž”𠤄¯z%ð„³žÍ„¥<óAƒÜ¯:yhAV ã¡™RÐÜd3R)tÂ0cÇbÄ~)4ô^)ôð °Q)ÚcX ýL„$§€õðç‰àþ`#f°rŒý) )ÐÀ< ^QÎscè^TŽQo&CoåàÂú§sÌÄXÊÁ…µ‹ írŒÝ d+W98®VAçå˜CX»†S¨ãm&C9ôÀ®Îæg満sy{!ÇEœòÎ¥/Àžýµ[9üó%àcˆúrøçy¬Ž&ðE ›Ä+ÐIê8°„Ÿ©„WLâsÅ$žGMÇ· ùÕXgôð¹ cü˜Å±Ñw÷ˆJ^ UòJºšyX KUb6è–AÕ˜ ÖkxÿEàX Ê YîW‰¼ˆÝu˜S`^Wɽ® ”ßZƒU ùͱU pØÀ‘ùCF}ød«Â¨ßCîbÂH«yTVcÔQÀñðj¬$ã€Åˆ²jHµ8÷©Çj¬M¬íç8ã|ÌÏÕXØ] 9FÈP i1Ë@Ú dHLÓøØ§ñ1Nƒ„€ Y^Wƒ>çøúš ´ "jx¥PƒUÚdN ¤Ú,ÅjR½= ,,cÏ÷À±4Ž×`f¨ác¯å«I-¯"jÁå Ð yjÁå7@¸Ôò̤VþX ÍÔò©–ÏHµ°ø{À®–,ÂHkIÇF~ïÞç0›G0ÞJàãh×ñŠ \.YþPÇÇWÇóœ:ž÷Öñ±×á^ð1ЬývhœÝ;Gèt®±é×y`#ÆUÏw 깟Ôs?©Çx.FŸzP3zPÓ“üÌ ~f?3ôßš‘OÎäþ3ÑlVBc3±:0œÆ±¶˜‰¸cíÙ˜fÂó‡‹0–™ÐƒÞÀìëçÒúyë‡l aÙY|D³xŸY|D³Ðç<°#×,H¨G®Ãz^ º. ë5ì¾Èßu5¿ëj~×lî9³ùnÃlô Èba6ÏfÃ[î–a¶œ o¹X igcÎdW!ŠgƒÃk0+ÎÍàaÈ0‘rY— Q?”‡ÅˆÙ9Üßæð(›Ã£l÷·9ÜßæñµVöy|Íš=´ÀW3ð‡y|-˜‡ãÕéó ùóÀ*È6ú?œÆÏÔÀ²óàS.`üpÖÖ§žÓœÁq&?ãç8‹ãÕgÃOæandí¹¼ç<Þ^€˜;²ö"ÄÙ<Ø‘á5ˆßyðjvõ0"w,R|íù<ûšiwKQ)̇V÷ËÍÀjŒz>¯‹çƒÃù™†çCK¯¡áùðÒsÀÇ`ÍlhÂÕ<ê`Nɲß,àÝNy4`² y粇ïE¼gÇFÞç0fä Ïf¥Çá× 9ý…Ü£‚Ë)`1Vö…<‚òZ žÞ Ê y<.äñ¸Çã"È鲬l(Üd¹ß"XíÙh¬ÃÚl^ Ï™¶AìÌNg!ïÙ=/",K^.¥ÀÇYù4p. œK´a2^ œW¼‚!ãØÀuÒÀý¡ûC÷‡î ܸ'4@v×<Þfò4@’÷€ ˜¸< \ž.O—çHòÍ×@ž³@6?\Ãç‡køÌp ¸¿¬ýkÀ…ŸËq!¿Úˆˆ¾4#ÑÒAÚFм h†žAóv ÛjäQÐú¯«0ºFpy8Ÿ©ýF>37BÏìL=?ãç=gq¼šãl~×ÞžÇq>¢ ‘ÏÞ\£ið1Œ·#õ’Å|[ ©ŽYn¿ýÌ@VM/æš_ ÞΆ/-æ#º’ŸfÁ:×Bþ×€¥àx-ââ=`9â÷6bÇ p'_×îä±p'Ÿ1îD¼dëòý¼Ï>¾»‚\¹å>ÐY , | XŽìå0$ì²¼÷0zn%,7Œd»ÿÈÏCW;€Ó8Ö *CKg!âC3 gó«sx{.¿:·çÃóóúë0ßw:Ì3ðȈ'€×aH;€1› Éc|ýÚ7-¹ÀdÔãG ùÇÀJDÖÈópÇøóȳ8 ¹âÈÃp6¿:‡·çò«óx{>òí#çi [Óð5ýä9l„}ðçGÈHõ8$ÉZvàã˜QÏijP© ðµÙ=òÒèó. Ë)‹ íè÷.Xa3{ê#¸±njÿÝùÐ&ÂxáF|cÏA£ijøyèÌàs"Ž:| ¶ܱ Ô1—^jKèÓjË$šÜj+DK¶‡ÚÌ];Bm-ñs¡6{žµ-DCµ¡¶•訉ýúJb’ãAjSb¥‡CmDÒÁP[$EôÅP["VAjË$Gˆ µbêCm Ù$4†ÚZâ^µÍÄ*:Cm ‰LJÚVœ/¿Ô뙺¶µ«måòžÜÒÒÒ¬¼œœBÏ”•ím-M«³§5­jjmZ¾¶ÝSÙÒ¾rùÏ´¶µ­<“W­òð»Ú=m-í-më[š'„ÿß„³[–w®jjýÞÒ´¾+Ó3­eíê–Ž¶•K=y¹¹á®«—-o]ÚÑ‘µ¾`B§®s'·ØÃDv¨Yåÿw¸²ÝÓäéhkjnYÝÔv£gí²/å¿ëðÏ^ {)f™Êÿ-\i#+ù¿’ëÀ¹\x;²çà(Ĺ)¸ÞÁÿ½\i!Md5f‘iø\…w+ÞËA§ý*qµÓZƒoÓÐ{-éD ø6½Wáó ¯vþÝÑ‚ÏõÀfô¬æÏ²;q¦ ×kp~6®,ÇÆ­í+×™<ë1†LαW;8Ÿ¥8—‡å~ ÕÕü_¶¢OŽ,œ)`û˜¸Z‡~k¸&ŠùýA-Œ¥Àîÿ*E8²1±ïü<û÷‡«¹Ô7âÜZpüŸÐåÿ[ ÿ] ¯Ç”q†ýíŸÿg/aÑ »ÈD|vK³HœÔC¼x¿†wEè­à=KCçjXÿFS^øTZM6KÃÄ+geâ{d³x˜ý¿ p­™l´ìÿ úŸ…“ÍÊ!bV¬øœÞ¥ìoucLp!I$v¹†¬“ãØßD¹ò’¶ñû®ÝFRð^&^Ë?S$¸„ÕÄ%u£=›,öwçЯ,£eÊ d;/]¼ëå#Ü_Câ„\b—jÈõâ{O•JŒ«9ð™ä%‘ä›×7¯o^ß¼¾y}óúÿÁ k¾žâ&zª­> endobj 452 0 obj 32144 endobj 453 0 obj <>stream xÚ]”ÑŠÚ@†ïóÓ‹ÂöÂgΙYA„ÅRºm—uûq2±š„/|ûÆùd >2ñüÿN>~xÙ/žêþîsi^Ó¹¿Œ1-vß«¡Xîž¿ÞÌÇËÒÆíV%TC+(Aj —É•@+H! yÈAèRh y¨‚t€¡­¡ª2Y²Y,Y„,–,BK!‹%‹Å’EÈb™.L·L¦[ ƒƒ‚A‡AÁ Ã bБSÉéÈ©ätäTr:r*99•œŠ Á„Ç„0Á3A˜à™ LðL&x&<„§ây*‚Á‹ÇË\:ÓÂ’Ç’bÉcI±ä±¤XòXR,,)”J‡@¥C ƒÒ!ÐAéè ttP:„u^ŸûžÜé¶æïË/ã8ïm~äͼídÛ¥÷×Åз»ò÷/-œÆ endstream endobj 454 0 obj <>>> endobj 455 0 obj <>stream xÚ½VËŽ7 ¼ë+ú¬H¤ž×½àƒ±¾9u`ÆîÁðÁ¿Ÿ")izç± Ãð4k»EU±¨GØ>í.lŸ~¸o.nÿÞÉ#6_bÚög÷Çûǰ}ù.Ï(OüÿFò Û{=ç¾ýØþÄÿ¯.mÜ_#×?.’¯¡l±z.q{>àRë”RÔ9 ŠLíÈK™'|rϺ^$è4LY†É*:t@}yÈÉ®sX¼»ÁÀà“ôÆ—ÆÜr, ù÷3•Oî_÷ðÓ•"TµïR¦ècáŸÜã}Ùbð)Ò |¾äÙ2TZ|–)Z¦/.ùPÊÆ¾vñÜPòµÄßjGœXâDqÄ»c|•B9ëa±åÚÝD‰å7@ã«2rY,¹jmM.2âÈk‡KŸ¯²‡‹q‘W`Lª4ÂÕdÜ š¢­7æ‹ç| a -×än³LdÀÔóå Z;ä*ÆK ¯[…žÈ9/¹}*SW÷=žÜêøŒ×ZþZsŸ–Oaø .‰/Â{,eÈl'KÙw9ÜÇ![¸y:cóÔyŠ8Òð”G×ßm*Š>n b+ɧÓV†mÓ<9‚ê²{VËM®jJ~EaÉ/R>(LtP¸€(Ô=ö¨ð…@~hgÆR¸ H å$qqÙÏ/½÷7Eije0¸f’¬ Âý¼#û¢´ì]Òv]Ý\ÿ¿9`@Uæ µ}VQYQ)¤“|tÿx•­\ endstream endobj 456 0 obj <> endobj 457 0 obj 23336 endobj 458 0 obj <>stream xÚ]‘Ýj„0…ïóÓ‹ÂöÂú³«nA„ÅRêEÛem@“Ñ 5 1^ìÛ7fd HàcæL'÷wç&8 Õa°Œà‚³Z Ç zk5 «ú¹–£…ðloÐB?Ja¶èp%‹#·ù›O›¸¹Î§ZöŠ„ל­¹ÂοøÀÂ#ÐŒr€ÝWÕ8n­pBi!be {·Èyyo'„ð$^Üè_ãóªÏ1yàJà¬[ަ•²"rUBñâªd(Å¿~‘¬ëùwküxçÆ£(9–ž8Ñ“§Cæ)ÛåD¢#QJDºŒtiL„D QOD[rÚ’Ò–<õf7W«í5Ô[|1Æ¥ä“÷9¬ ŒoŸ£•^UþüF« endstream endobj 459 0 obj <> endobj 460 0 obj <> endobj 461 0 obj <>/Type/Font>> endobj 462 0 obj <>stream xÚíœ |TU–ÿÏy¯ª²U’ªì;E6’½*‚]@V d# ‰I€(Ì¢¢¸¶ÒâÖ¶KÛ¶¢" Ú@kŒ¢¦[AQ錊h»ÐŽ:ÎÐjÓ´ÝMkÕüî©JŽ3ýÿæÿŸùÌg¬¢¾uß{÷sî¹çÜåQ@LDV2àËÒ8·¡¥ðè ŸqÎÚWô ­¥X Âq Ž-+V­[hþ,ǽD!´|íŠÕÇþþ"3ŽéƵƒ}kkÎ݆ãω´¶UËz“‰Âk‰ öµCÃs/·uE^Iú‹eÛîžvÅ¢©%¸ÿW+ûzz?<ïªOqüg¥¿¡¥¹ö¦l~œ(µòRV¢BD\ø\¢ôF\O_¶ºgíüÕÝס8LüÛ û׌z©Ÿ(¿(%nuÏ¥k?2l%š¿õmkzV÷-?•sŽo…=¿^¹zøÒŒ¾º–¨i)QàÊ…ÍùEw¸î$ê| õ—œ2‡‚´KôÛ‰maÆ¿#ªì±Í¹°nئ^ä{—”Ö¸Éå=Ô)4²{<(k´Ü}§a¹q Ê”à2Î%Ó¹hŒÐ ”ÿ‘…d9râȉ‚HëTkÆTëÔåúrHOüòC÷a>9hʆ-£îbíSEÒ ®p Ž Ž  Š$…FY޼ðªÕé´:!IJ®Ô¬€¬À¬ éÁ9!ÙærvjÎÀ™Á3CœVsVPVpnH–ÙÐÍÝ\¿+´¥~WdË’ög( æ3å/³:Ê:\IÛ‚·YµmÁ[B6›7‡nÛ¾Ùò°õåà–ƒ‘!ÝÔÍ&Mã計؀L­´ÄîH`‡öÉ­ÏM·„—”ÜX1Ëž?±ÙxòUw’û³¥Ou<ì~óêŠ[¹òÉ%O÷pšFÇà)èC»j¥]7»ÂC z˜f Õ Á뷵˒ÍÙ&;Ûv“2jgZaiYR¿+úÛ›º“ã–Ö;#MêŽÈ©w¥¯Þ•ÞzAé€~0`¼ÌÓì‘çpi‰6ÍeÒ²óÿþþKn}&×^\¼-Ô Ý¿ùÊs¬âeþ#Ïß×ñ g^=óV÷³h#_ç9®»õc4…~êJ¢d £M¡†ÔäÐÔ¨èäé6k0“%˜(Ö††žxÁêmè‰S',ŸZ#œªá®tep¦5;1{JÙCJ¬s¨Òœži)Ñf†WsuH}xÀ7»Ò&í·‘m²ýqC!·&éƒt±qØzqÒc¦Ç·%˜¨º1`§¥šTWÆÙ(¥¥fªµSqQŒîN,º¡zû§ šöä 2+±ê¾¶W¾ÐéÜþ»¦«ô»wfåî($>öª{ò²w¤¥}øtxFæqN–äÐèzÏqc¬éô/šáJÒ#ÒRá.šrçsl¤Æ=¦RP¦ò:9^È?áuƒêò’lJåœÐì°éQYÑY1™±eTÂņC±ÕWœQÅs­Õq•és3¢2ÃrÒ+ ß34^X¼™ ‹LqK&eNºåGC´Ž/‹¾,æ²Ø-aÛ#H|8i[ÆA>¶?jôþ˜ý±–KQaCÀ†À A‚7„l0oÝvEä÷£¼7mHÚ¼!eÔ ¶ S‡S·Ó6~̼ÕúpÄö¤ƒô*¿b˜0N˜&&'‚&‚'B&Ì¡Ã&Â^Œ<u0ú`ìËq‰IÉ)S&lS'R'ÒÊÐ!AœæøzÄFê* 3Ïî&c¬û[â]ã—üüˆÁÆù¯ =”±é9]¿mý-¯Åãë’›Ž™îùËòûº—þö©¤’¸w8¶³Eøë¨ ë÷o~ægQ™Ö+òŠ·§†YˆÓdÊ ×\¹SRS’ãÈH)ù!œ—š˜7=“’YO4g„hº1…̉FŠÈT#z-ÖiˆõG¯{ÿ§8öý)pE¥šSCsb²Ó‹ÌsÌ¦ÌØ™aõaú7ò6òÛ;Èõ`ÈC¡Ä>œ¶9íàÚý€á€ñ`ØxÄxä¨Ñã1ã‰ãI’ÇSƧŒÛÆÓÇ3â×Ù‹ÞšúXÆÁ°1&‰o£?´c¿î×言i>·J¿"æë/xÀ±~ñïîØ÷†ÁÊç¼øä÷ÜpéºçlìvrP\ÌÕ›š›k×o8öLŠ=îMN™Ø‘<³4víú›.Ÿ‚3›Œ[1£FÓ÷]º9bZdtd”‰Âƒ"LáQ1–#¿9‚qLü¢¢üË#/¸‚R#3£ #K£ ßÈâñF ÅLzcZeä}ƒaƒqƒéLL®‹¸,z[äÃQ[£FŒÜõbtd7O6³ô–fšB8-Rk œ?#Û¡,Pì¼{ËÝÆÒsìYz¨6c.¾Ìîk¾¬Ô÷‘ŒËwcŽŒBLÄÓ®³n%4>jzø´Pf儇šuÍd 3cÃ,GŽ oÒ¦Š_ª,V™›’ΩZŽ9'¼”K4gxWiuaÁéÑöÒ誘³& hit‚4:&]°5‚/¦‹yD6„ŽX¶j[õÍA›ƒ Ùj~Ð7+m¶nŽØy@Ù| ,Fu¹žéO”‹&ý`0Ÿ¿¥Ó`hî¸üäÚ‡îÚë|dÍ› ÚʯîÖfÆäÅ-YüüSîR}ßM­­·^?Ã?†n/¬”FtYãRÍSSõhóôôh O!SºLß“Á_àZh£L¶±M˶™m¡¶0[¸Íb³Ú"l‘¶([´-Æk‹³¥ÚÒ\äb—æ2»B]a®p—ÅeuE¸"]Q®è91®XW\ÕWª+mÚ·eJº¸)Ò'ÝÔ¹>f]üД‹S·†<ÿóÔ€uÚÙarĬ„ ‰ÞáêŠ)[x«öXðc [ÒÆiœÇµqóxèxØxø¸eܪkÊ(Œ^Ú~ÃOµ¤Ï˜Éh@çQ®Í²K˨ëÝåZÔn{©cj^î7m–Û.jܺζ×ãil7$;v“vé» iÇÿ½‹ÇórëÛm»–VUú¤V-­Ä¹ævÕNã|UeíÕ®tyÎuëÝÙÝÆîÓz×’;]ø7,éì5.¹S_r¥¡³£ÈØÙ«wº Ezûi}q[‘qñi½­Hom.2¶žÖ[ðÕrZo.Ò›clrë‹ÎÑÝú|·ÞP¿ÉØ€¯qCý¼cý&½þJüºLã¼}žËP—©×Ö¬7Öºõšõzu½^åÖ+ÝúÜJ}Ž[Ÿý´îrëç<­Ïrë3kŒëõ™5zÙӺíÛÝz©[/qëÅOëEn½¦žÖ ò6 Nëù3RŒù§õ)zÞ&=÷´>=g“q:¾Æ 9¨—³IϹҕiÌîÖ³]†¬L}Úi×szfÆ&cæi=sÜ‘ÞmÌØ¤g\iHOË4¦wëé.CZ¦žzZŸ[dœºI·%vm§õ)§õœH9­''m2&ãkÜ„KI›ô¤+ ‰ ™ÆÄn=ÑeHÈÔãOëq¨wZ-ÒcNëÑQ³Ñ§õ¨Ùz¤[pëV­×h=­[£Œ·¥‡ºuói=Ä­ß©ºõ·nrëFÃz£ñ´nX¯ë¨¯Ÿu>­þìåÞënâéßú¢éÿõ¯dÙó¥~ëûfúò¿þÍWhÚ)ï[ïô¿ß7üØÿ~ßxåwïïÞß½ÿ;ß²¶$ÏŸˆÜ_Ð5ô-/5²†Z:ÈH&  @ ¢`¬ÌJaŽu‡•"°»ŽÂž#+”8¬Ø(‘’°›K¡)ØYOÅ8”†¥b6VÓ(‹²)‡¦S.åÑ Ê§*¤"*¦*%;9¨ŒœTN3©‚fÑ9ô=,&fÓšK•TEÕTCµTGó¨žh>- …ÔH‹¨‰š©…Z©S;uP'-¡.ê¦sé-£^ê£å´‚VR?]@Ò*ZMkh€ÖÒE4HC4L#t1]BØpÓet9}ŸÖÓ´+«èjxçZºŽ~@×Ó ´‘~H7Ò&º £ë-t+ÝF?¢ÛéÇtÝIwaßòº‡~еäÏè>ºŸ6Óô =D[èaÚJУ´¶Óc¬ÓÏií¤]ô z‚ž¤QÚMc´‡öÒßa÷4í£gèYzŽÆé—ô+zž^ ýt€^¤—è ½L¯Ð«tˆ~Mô÷ô¦#ô:½AGéM:FoÑÛôz‡Þ¥÷è}:Î6²‰èO¸òOô}N¤SôýžNÒ8ƒ8˜CØL_q(y°s §OØÂVŽàHŽâhŽáXú3Çq<'p"'ÑiNæž‚ÆTN¥ßr§sgò4΢ßq6çðtÎå<úGú+Ïà|.àB.âb.áR¶³ƒþ…ËØÉåôÏä žÅ盿ÇÄ.ž½Ý?óžË•\ÅÕ\õô®ãy\Ï <ŸðBn¤x7q3·p+·Ñ§¼˜Û¹ƒ;y }ˆ¹§ K×sù<^Ê=|>/ã^œWðJú˜ûù¾Wñj^ü–/âAâaá‹ù¾”×ñe|9Ÿ×ó¼¯ä«øj¾†¯¥ûù:þ_Ï7ðFþ!ßÈ›ø&¾™o¡»øV¾D?åÛùÇ|ßÉwñÝü¾‡Ê÷òÏø>¾Ÿ7óü ?Ä[øaÞÊ𣼷ócü8ÿœwðNÞÅ¿à'øIåÝ<Æ{x/ÿ?ÅOó>~†ŸåçxœÉ¿âçùÞÏøEÆ*™_æWøU>Ä¿æ þ{~ÿó~ßà£ü&ã·ømþ ¿Ãïò{ü>çßòüü!Äó?ñ'üÏü/|‚ÇŸògü9ÿžOòøÿ‘¿à?ñŸù/|šÿÊ_òWìfÒŸ5MÓ5ƒfÔLZ€¨iÁZˆfÖBµ0-\³hV-B‹Ô¢´h-F‹Õâ Z—÷¯ZÛ³¬/hxeÿ)ôM~¯ö^Z>¼rÝÚ•}kÌkûûz—õ­î Y6°zuOÏ2u0{`ÅÀš¾ f¯îY68°Æ4ûüÁ¾‹ûBæ.ë\6²zùª¾K s{†M•ËzÔåÊ¡U=C+ª¼w™ªäl@•ïæ*¹ÙP…BjÎH¬YÖ×Û¿jU¡F]©=sÅT7Ü¿ª·/ Î' NÔyÅÖOÞ× LhðšÐгld¸/°ÁwÍ´@ŽM äjàß逅>‘ EdÐÂÞóWy+6ù¾¼õ›&Å4Ëéæ³ŒkñVi™¬Òê5¶Õ'¹U$[û׬j”Ðê5>dñIA‹{ûûû†ú‡L+{àߎ³ÔtÊ}†N´1 Ç'»Ç눟¬eguÇ2å‹^¯/ú¼þïóÝÕçõŸ’Ôçóá Ÿõ!+Î’±BõÃÊ3'ú}µ/œôø*¥e•W‹·a«&ý°ÆëÁ5^÷¬™ôø€ÏНÇüô}yëNŠòz|è,W {« OVñz|Ä'yÄëññøˆßã#>/]r–Ç/ñ{|×ãëÎRs™×ã—©6ö{UôûTô{]¸Ì^R`œ½jíÊܾácMRÆXÙ·j¸' jíPÿª5†N\Ыp±e%J†ºë{Ö®íAˆ®>¿·G›?¢-ÑÚû‹ýJ¸Öد7­06÷¯XÝ£·ôŒ´zEé+ûõ¹ø4õ{DëùJë ÑÚ+Zû|Z/SZÕÅaÑÚ¯´^(ZWyµ®Ñ.íGgˆJ}ú†”>“°P†ÚŸÚµP¹ V÷­è1¶–õ¬î[Õ×ã‚bGŸqx`ÍÀPè¤Gå(Xœ#E³Ï!r‡H!HùÃ{Ý×|ïAëY•ƒ*¥R ÷ŸTÜsF~ßÙòû&å÷ûåœ-älù~ùfU}R¸¹î¬ƒð‘¯k¶¢fß×Úõ^ý=Ëûû þR™¿äœ,øK…þR‘¿Tì/•øK¥þ’Ý_òë(òë(òë(öë(öë(öë(öë(öë(öë(öë(öë(öë(öë(ñë(ñë(ñë(ñë(ñë(ñë(ñë(ñë(ñë(ñë(õK)õßQê—Rê·Àî/•NÚRxF[©_G©_Gé^ûì…Å¥~ëíþ{í~½v¿»_ŠÝ/Åá·Àá÷†Ã/Ïáo‡Ãï ‡_‡Ã¯Ãá×áðëpøu”ùu”ùu”ùu”ùu”ùu”ùu”ùu”ùu”ùu”ùu8ý:œ~N¿§_‡Ó¯Ãé×áôëpNêÀÛ_*ñ—ÎH)óŸóÛ✴¥Ð¯­° Ô_²ûKgtøíó÷ Êþ>:c¿•ö"CÕÈàÀä…Âã²2tM 2zE/V3F ööR¡]mÊÅNäQì¥Ç ;h–áì ¶ðö »´JÃc-=NCUsŠ){Ûi½)ÐûÆîävS1ö#÷™îñ¾õ}“oÓ=ZjhÙú'üp°~œ6j_b¿v›~¤%IÌ3äÑõ&3vHXýÑÝ´ÙøKï›î6%c/…}Ö%ú=úý:ì´.¡ &µëcŸ…Ëò÷;øÄÿä÷£ºÎ ¯ø#ÅÊ~óÙ÷nnð}¿å¾ý«£AÇ»±û4I}ߎ´—™{ÿÃ×߸üÿýÅÿ9Kþfû¾{}ûËWÝ_% CüÜ‹ø!®üæ Ò½S¯/®’p„D&~YýVûæÿÙOøîDïÝ@ôîð»½{Þ»ùï¼õ™åwÆçÎŒßt)_Í?æ;yÙFšÅ÷‰Ã'UòÔrµJ­ßËñY£]«ý@»Aû¡/ ýP»Yûý;/í ïçß¼þ§Çó8ŸNqäBú#Ñ\LæRú—Ð_ØNe¹¹œ<<“‰+èKžE_!Θ¿Ç:»ØÀ³YãsØÈsØ„Ø à~ä 8˜çr½Á!\Éa\ÃáÈŽP®f3W±…ëØÊó8ÑÁõÅó9šp /TÏ-9Žq7s<7q"·p·r /ædncwðnç©ÜÉ©¼„Ó¸‹Ó¹x.gòy<—òt9Ù8ƒWpÆ£y½Ï/ßÈô®ïÙÙ}¾§gêÙÙ(?qÖó³Ýˆ¤;¾öÌíü¤ï©Ú>þÎGù8ã7}OÂÞÖ¬Z$¿óµçl_{2¦iÍ …i&Íè{ƨEhÑZ0¿¥ w{8‡—©S‹•ôC÷Ë{=ý„þ‰>§‡¿}¾}¾}¾}þ›Fß+%Šàpw°É„5lºüš>«Î rxžž×Àra…ç°kÓ ¬3³ÁÅX“ami;± 3 ëà(Z G{Þc<'ÀXÏ~0Áó ˜ä9 ¦{Þ²n.Vx>;„rï(ÖÂf¬§KA ÝZ±*6˯@ÍXIOŵHσ`”ûr0Æó8ëyŒ÷Œ‚ ž0ѳLòLG…»=3Á=žyåþŒö\Æàc*ÁH¶ˆO,X/íž@‡çEÐéù%X.œéQ*<×€³`¿žÉ;Äî%h»…º=Ûa}$ê[¡ñ0r¬ç9Ú=à¨g¸ÛÓîñ,Ç‚µ<ö #aá(ã9ÆzŽƒqž£ jc$Úø ˜¯FÂ3ñØ{˜=Ù`¸ûhA£ÈêÞ Fz¦¨”»ÕF;Z®ÆÈùXaœûy0Þ}L&ºƒIî`²\½Ö½;›pÏ- Ås7hõ\F¡N4ìTWc<ÁXÏ0ýQuä¼ê‘hXû˜ ?DSŠçYxßê#ѺHÛF{n“˜îR;)Äa ¤‚ñRSµ=Ò^“ %V–k•œXÈ9 F{nc û1è…U3ÁÓ* ±°LöœÂŽÍŒ{ã`Ï`$ú(rö‚Ñž•` Z'ö¨Ÿ±Ý©vxž`ÚiƒIˆ‡xØó¨ú1Ò&ÀHúͪ’i#` ZiŸƒqˆ“xH{Eí=µ`¢g˜o' 7÷‚Øœ€Þ#=C ŠáH» ŒÌô¦Œóœ Æ#ÔïU_W»PϨlK@K‹±+ G|&BÎ' òU"äÜ ÆÀɰê0ÎóKÅç‰sXíháŸ$øêiIhc>éyTÒ’ mû“ ­ ŒƒŸ“ í60Ás9˜(r’Ðjì‘‘¿É*¢Aå¥dÜ{L@¦ GNaï<ŠQ%‚kéÐ~´`ÇN™ˆ«tÊæ!‹Ó©HÊ%B;r'ù»,ó< :¥\.¬À˜N.XžN•Èôtª-ÕR®Ö ë0:¥Ó<)×ÃoéÔ 6Ì.3 …ÂEÂ&©ß,2[¤Ü*ç Ûéýž;átê‚ßÒ±cWíZ*7JÍmru~NÇXá÷xª1"†c4È€ÿ_Ó!'Þ8æóäLçC°ãU<£ÊvØœŸÜ –y>ŸŸ(V`TÌ€Tý6‘³XÊíè… Xø ebÔÏÃq&ÚOÉãƒE¡93!_]­@fÂÃÕhW&¼ªÊÊ“™ðä!p” ›¤N‹°M$,–²òX&lx”0¢ÃÚiоTmŸëÂÀLŒÀÓð“§,ŠÙÂéÂ\a²rÍr¾°3Ô4ÌsÁ`±œ)Ú¡w|µ,“«NŒ]Óà+Å™ðü4´îF°R®Ö ç#¯³$V³`çm ãI¬½L‡W³à±ý`ްHX"´c4ȂƷÁ2x; ?Ë…3áŸ,h| œ%u*‘¡Y诣`µ”k„µÂyÂø' V)6!dz“ª~‹\miíhQ¢ñ°ý•?+nDMÌüðC¶ŒÙhQššë¤lõLÓ1se£-ï€EB;ZšVœ+`s6²L±Ú³aÛ`Følôø^° ý˜ìPå6ôN6züØ.gºÐöldÄ ÊAì!¾aÃS š;r ýQ°zs ÷ÐÉ÷N‚Nø3ÞST±¿©«ª¿r`ÃÇ`Ú’-ÇÀnÌÓ!ÿ8hE«Õ3:3h‡öé¸K•k… °j:îú5Tý\ÔWT+•\Db–0[˜#œ.ÌÎæ ‹…¥B¥+­8 :á·\د8ù› ûÕùJ©Y#¬ÎvÀæ\¬îÍ ƒ 5OF‰<ØvLG®åÁ«'¡;¾‚ðÛ Ô9Z२ù<˜‰™eúôF0‘0=«Î”íR³ ñ3^=ÎÂ<:½|¬ÄØ2½¬Ø€¨ž^> .6!#f ¯U¹ ›¾VòÛ33{`—§\ŠöæÃΣ šUóaáPͪù2ÞçÃÎ[Àa‘Ð_åÃ{½ óóáÃsÁra…gX‰ÜÉG¾(ɵð@>2Ei@žæÃÂÃ`f˜|Øv l‡òáÛËÁNÌ¿ù°p¸Ís=8êY î–ó{àŸXû¨ÆÆ“ dL.€…Švè-ø),+Dý·A ú«w©r:âª5?U”"·Á¶"ÔßZ1.¡æ.0~.’Ѿw½:àÏ"´}X.œ‰ÖÁW °¤2#ŠÐ®Sàx£V©òFœ/†ÿƒáîS +½b¬CN€)žÛA•ûÅhãkà4´«˜²„9°³˜¦K9W˜/,À»~Põ‹åL©ÐŽur1l>–ÉÕrø¡6o+°¾*F¯]Ök‘ËŘ—?¤ÎBdn1úî"°Mì\ £ïž;á™b´NÉìBü—Hv”P;¼®v?`8âªm<ZÑ/¥ˆ±)`&¬*E‹Žƒ¹¸·ö«3v©é€WKaóÇ SÊåBµ{*…͇ÁjäZ)lVåäW)ìTgÚ¥f‰u¯1¿+ ËÅÂr±°\,, ËÅÂr±°\,, ËÅÂr±°¾z T–‹måb[¹ØV޾;*ÛÊá=UV–‹…åðذ]Ît‰œ¥b•²³\ì,;gª“ =¢Vë¥`&bo&,™sÑŠ™°G):$o*Ñ3a‰bƒ°IØ…1³m4ê ´]ÅŸ±T-ÓÁd´·mÓ1_T@ãõ`Ž0YPªl—»ˆÞ Ø›¨þ¾YSí`,¬Àx¥ÊµÂyÂŒfð‰’Óäi›å|‹°ÝÓªx®À ø¸ »¹ øã "ù ¸1VH>†y7±= öÏ­sfÉL= ¹ÿX‰s´ï0#ςƭ`;ü0 [ vÁçç ¥/‚yÎÁèñ9X1³Rf^õtD­~¬RVë«JYÛWbl¹,V`Ö®D«O‚ÍÂ6©Ói•hÑÛ Z[VʬW‰µÖ!pyW‰í÷ ZªdZ]û@Æ*ÄùIP̓U2VAòç`ì©‚ÌWÀ.x»J2½ Òž÷`N©û«áŸõ ¹\êc°Hʬ ªa9ÆDì1°±Qýˆ*/¶ Û0›TËÞ­ZÆíjhTåQŒ'ÕÐx«1¥«F¼T#í­‘öÖÈÚ²WŸ-X©ÕÊ*«VfêZØp=¨Ö«µðçz°\¨üY‹¶Ÿë µ°í88_¸@Î,6  […Ê?µ²w«•õ^­øªV|U+cT-¬:n”:ÊoµhÅ^p"¡sâ0±Z›ƒA+ÆÏ:Ê@ŸÖa6W,V"æëÐR®GäÔIî×ɹ֪3 …ÂEÂ&Œêu°Y•ÛDÂbdSlVr:0ªÔQ'ôבzjS‡QBY2 ûë`­ºwÜûüm’Ìj’Ìj‚…÷‚»‘GM°ð)j ›Å¶fßše|k–ñ­Y"¶Y²µY²µY²µYÆ·fHÛî–{Už¶ÈèÚŠíhFVÈ?´À­Ð¢Êɰ§3Ú~0ñÓŠ‘Gq`¥ÔŠ8Qå*Œü­ˆuWœ©•úuˆŠVÄŒ:Sÿ´ÂN¥e¾pœY(l.6‰œf‘Ù‚¶´Â{ê¼ÊñVäx<Ø.W;0δ"ÇÕ™%ÈîVÄáTp‘Ü*9Þ*9Þ†v½'»²`Pí’Ú`ÿÐéË…ž°þlC‹>«mh‹b“°YηHY­ÜÚd§ÐŸUtµItµIn¶Á’ÛÁÝð|,Ù ëƒa‹ežZ {Ò@5ž/–ñ|1´Ÿ«…5ÂZánÕÌ»QvF‘M»@µÞÛ.½¼]Ú¾ùÛ– +°…y Õ“¦{¦‚Œ£¸z¬Ä> /€5R®•ò<)7zn ›ä|³ç°Y3 ÿ¨ómX'#0öŽÂÂ`'¼1ŠQºàQX{.í†%‰ Õc¦1±jL¬«ÆÄª1±jL¬«ÆÄª1±jL¬«ÆÄª1±jL¬«ÆÄª1±jL¬«ÆÄª1±jL¬«Æh }´ö˜A«Û îÁ™ýòly?ÖðAvûáÛD°\Xá±€ó!g?äÏ;±»aùä `Mcÿ#Ì…2éÍúV©ßIÄq¦ÿ÷ |¿ÔU ‘·¬~»ØWÖ1zwûÊH»ÂW6RÝì+›(œ¶úÊjõï+’þâ+[(ˆã}e+™8ÕWŽ g©_g‚pt/—ùÊL|ÄWÖÈÌùÊ:Íᓾ²lZ‰¯l¤­ÅW6QŠv­¯@7húÊäÒs|e EèøÊV2ëß÷•#Ȧߵ,Û6w`íºÁþ+‡m…N§3¯¨  Ô6§xhx°¯gu~MϪžµ=+†l•}Cý+ÖØjFÖΰÍ^µÊ&w Ùû†ú/îëqÖÿéÖ³ªÙäáÀÀ…6ï™\[MßÀê¾áÁþe¶¢ÂB}ßåÕËW¬]6<œwqɌۼ‘5¶B‡M™ã­7缯˼ÍÖ?dë± öôö­î¼Ð6°üoÛÿ·*ü;M™TIY´Œ²ÑësåßÝ®CöË¿ÈƹBŒ*ê§žlâ]Šssp}Xþmî õQ©'¯5ø^…ÏZ|V@ÎêUâêÈZƒ£Ô Ô˜£Ù¨½ ßgt É‘º£ßƒ½¨Y-¿…Á™Ñ|!ÖBâ«VóêÞ¢tv\Ñ݇+«ÁaѸ çŠÐ¶Âo‘ÿõ»WË¿N^‹Ò0Þy°«D=G­y¸kxÈ!Ò¼Þ9[ž’–÷ÚûMm6PùA]–ZêßG¯Æ÷ Ô€5ÿ/üÿŸ•ð×+ßl%¡ÿ‡/ û2|¢èÁKŸ ë ÷Ñõ†itÝ×|¯þ±¯¿ NºÛ°®ÿæy>A÷â1¯|÷úîõÝë»×w¯ï^ÿ _úa¾‘4ý2¾»Œ@cáU"w‘÷[»€®Ñ–êZˆQÓ4C®o&mg#ÙæMÞ]3»a¶ú¯rÿª™¢ÜQ|O`·–½”èþ÷ŽBò'¦@ùí>ý+1jþ: endstream endobj 463 0 obj <> endobj 464 0 obj <> endobj 465 0 obj <> endobj 466 0 obj <> endobj 467 0 obj <> endobj 468 0 obj <> endobj 469 0 obj <> endobj 470 0 obj <> endobj 471 0 obj <> endobj 472 0 obj <> endobj 473 0 obj <> endobj 474 0 obj <> endobj 475 0 obj <> endobj 476 0 obj <> endobj 477 0 obj <> endobj 478 0 obj <> endobj 479 0 obj <> endobj 480 0 obj <> endobj 481 0 obj <> endobj 482 0 obj <> endobj 483 0 obj <> endobj 484 0 obj <> endobj 485 0 obj <> endobj 486 0 obj <> endobj 487 0 obj <> endobj 488 0 obj <> endobj 489 0 obj <> endobj 490 0 obj <> endobj 491 0 obj <> endobj 492 0 obj <> endobj 493 0 obj <> endobj 494 0 obj <> endobj 495 0 obj <> endobj 496 0 obj <> endobj 497 0 obj <> endobj 498 0 obj <> endobj 499 0 obj <> endobj 500 0 obj <> endobj 501 0 obj <> endobj 502 0 obj <> endobj 503 0 obj <> endobj 504 0 obj <> endobj 505 0 obj <> endobj 506 0 obj <> endobj 507 0 obj <> endobj 508 0 obj <> endobj 509 0 obj <> endobj 510 0 obj <> endobj 511 0 obj <> endobj 512 0 obj <> endobj 513 0 obj <> endobj 514 0 obj <> endobj 515 0 obj <> endobj 516 0 obj <> endobj 517 0 obj <> endobj 518 0 obj <> endobj 519 0 obj <> endobj 520 0 obj <> endobj 521 0 obj <> endobj 522 0 obj <> endobj 523 0 obj <> endobj 524 0 obj <> endobj 525 0 obj <> endobj 526 0 obj <> endobj 527 0 obj <> endobj 528 0 obj <> endobj 529 0 obj <> endobj 530 0 obj <> endobj 531 0 obj <> endobj 532 0 obj <> endobj 533 0 obj <> endobj 534 0 obj <> endobj 535 0 obj <> endobj 536 0 obj <> endobj 537 0 obj <> endobj 538 0 obj <> endobj 539 0 obj <> endobj 540 0 obj <> endobj 541 0 obj <> endobj 542 0 obj <> endobj 543 0 obj <> endobj 544 0 obj <> endobj 545 0 obj <> endobj 546 0 obj <> endobj 547 0 obj <> endobj 548 0 obj <> endobj 549 0 obj <> endobj 550 0 obj <> endobj 551 0 obj <> endobj 552 0 obj <> endobj 553 0 obj <> endobj 554 0 obj <> endobj 555 0 obj <> endobj 556 0 obj <> endobj 557 0 obj <> endobj 558 0 obj <> endobj 559 0 obj <> endobj 560 0 obj <> endobj 561 0 obj <> endobj 562 0 obj <> endobj 563 0 obj <> endobj 564 0 obj <> endobj 565 0 obj <> endobj 566 0 obj <> endobj 567 0 obj <>stream 2009-02-13T20:42:06Z Unknown 2009-02-13T13:44:17-07:00 2009-02-13T13:44:17-07:00 application/pdf Unknown HP BladeSystem c-Class to HPI Mapping Developers Guide XEP 4.7 build 20060908 False uuid:999ba503-9283-481a-a2e4-503ccf940602 uuid:dcb49fd6-b365-4785-8b04-d18c2b323d88 endstream endobj 568 0 obj <> endobj xref 0 569 0000000000 65535 f 0000028308 00000 n 0000028491 00000 n 0000028550 00000 n 0000028579 00000 n 0000028687 00000 n 0000029759 00000 n 0000030229 00000 n 0000030315 00000 n 0000030401 00000 n 0000030487 00000 n 0000030574 00000 n 0000030662 00000 n 0000030750 00000 n 0000030845 00000 n 0000030933 00000 n 0000031032 00000 n 0000031120 00000 n 0000031208 00000 n 0000031296 00000 n 0000031385 00000 n 0000031474 00000 n 0000031564 00000 n 0000031654 00000 n 0000031744 00000 n 0000031834 00000 n 0000031924 00000 n 0000032014 00000 n 0000032103 00000 n 0000032192 00000 n 0000032281 00000 n 0000032370 00000 n 0000032459 00000 n 0000032548 00000 n 0000032637 00000 n 0000032726 00000 n 0000032815 00000 n 0000032904 00000 n 0000032994 00000 n 0000033084 00000 n 0000033173 00000 n 0000033262 00000 n 0000033351 00000 n 0000033440 00000 n 0000033529 00000 n 0000033618 00000 n 0000033709 00000 n 0000033798 00000 n 0000033869 00000 n 0000033901 00000 n 0000034010 00000 n 0000048012 00000 n 0000048198 00000 n 0000048258 00000 n 0000048290 00000 n 0000048399 00000 n 0000048578 00000 n 0000048814 00000 n 0000048914 00000 n 0000049017 00000 n 0000049105 00000 n 0000049196 00000 n 0000049288 00000 n 0000049383 00000 n 0000049454 00000 n 0000049486 00000 n 0000049595 00000 n 0000050967 00000 n 0000051153 00000 n 0000051213 00000 n 0000051245 00000 n 0000051354 00000 n 0000051534 00000 n 0000052439 00000 n 0000052533 00000 n 0000052630 00000 n 0000052727 00000 n 0000052827 00000 n 0000052923 00000 n 0000053022 00000 n 0000053122 00000 n 0000053225 00000 n 0000053326 00000 n 0000053430 00000 n 0000053531 00000 n 0000053635 00000 n 0000053735 00000 n 0000053838 00000 n 0000053932 00000 n 0000054029 00000 n 0000054120 00000 n 0000054214 00000 n 0000054309 00000 n 0000054409 00000 n 0000054510 00000 n 0000054616 00000 n 0000054716 00000 n 0000054821 00000 n 0000054918 00000 n 0000055020 00000 n 0000055123 00000 n 0000055232 00000 n 0000055335 00000 n 0000055443 00000 n 0000055543 00000 n 0000055648 00000 n 0000055743 00000 n 0000055843 00000 n 0000055941 00000 n 0000056044 00000 n 0000056142 00000 n 0000056245 00000 n 0000056339 00000 n 0000056438 00000 n 0000056529 00000 n 0000056625 00000 n 0000056718 00000 n 0000056816 00000 n 0000056911 00000 n 0000057011 00000 n 0000057107 00000 n 0000057208 00000 n 0000057303 00000 n 0000057403 00000 n 0000057497 00000 n 0000057596 00000 n 0000057687 00000 n 0000057783 00000 n 0000057881 00000 n 0000057984 00000 n 0000058085 00000 n 0000058191 00000 n 0000058282 00000 n 0000058378 00000 n 0000058471 00000 n 0000058569 00000 n 0000058664 00000 n 0000058764 00000 n 0000058851 00000 n 0000058943 00000 n 0000059030 00000 n 0000059122 00000 n 0000059209 00000 n 0000059301 00000 n 0000059388 00000 n 0000059480 00000 n 0000059567 00000 n 0000059659 00000 n 0000059746 00000 n 0000059838 00000 n 0000059925 00000 n 0000060017 00000 n 0000060102 00000 n 0000060192 00000 n 0000060277 00000 n 0000060367 00000 n 0000060452 00000 n 0000060542 00000 n 0000060627 00000 n 0000060717 00000 n 0000060802 00000 n 0000060892 00000 n 0000060977 00000 n 0000061067 00000 n 0000061152 00000 n 0000061242 00000 n 0000061314 00000 n 0000061349 00000 n 0000061459 00000 n 0000075508 00000 n 0000075697 00000 n 0000075758 00000 n 0000075793 00000 n 0000075903 00000 n 0000076083 00000 n 0000076288 00000 n 0000076414 00000 n 0000076508 00000 n 0000076543 00000 n 0000076653 00000 n 0000080573 00000 n 0000080786 00000 n 0000080906 00000 n 0000081032 00000 n 0000081159 00000 n 0000081194 00000 n 0000081304 00000 n 0000086378 00000 n 0000086400 00000 n 0000086423 00000 n 0000086444 00000 n 0000099520 00000 n 0000099736 00000 n 0000100106 00000 n 0000100225 00000 n 0000100430 00000 n 0000100527 00000 n 0000100643 00000 n 0000100678 00000 n 0000100788 00000 n 0000106590 00000 n 0000106795 00000 n 0000106897 00000 n 0000107032 00000 n 0000107067 00000 n 0000107177 00000 n 0000110551 00000 n 0000386208 00000 n 0000386413 00000 n 0000386514 00000 n 0000386608 00000 n 0000386643 00000 n 0000386753 00000 n 0000389864 00000 n 0000390085 00000 n 0000390188 00000 n 0000390281 00000 n 0000390372 00000 n 0000390477 00000 n 0000390512 00000 n 0000390622 00000 n 0000395455 00000 n 0000395676 00000 n 0000395779 00000 n 0000395885 00000 n 0000395990 00000 n 0000396073 00000 n 0000396108 00000 n 0000396218 00000 n 0000399234 00000 n 0000399447 00000 n 0000399543 00000 n 0000399639 00000 n 0000399763 00000 n 0000399798 00000 n 0000399908 00000 n 0000405520 00000 n 0000405749 00000 n 0000405848 00000 n 0000405956 00000 n 0000406063 00000 n 0000406167 00000 n 0000406291 00000 n 0000406326 00000 n 0000406436 00000 n 0000412536 00000 n 0000412725 00000 n 0000412808 00000 n 0000412843 00000 n 0000412953 00000 n 0000417158 00000 n 0000417347 00000 n 0000417430 00000 n 0000417465 00000 n 0000417575 00000 n 0000421445 00000 n 0000421682 00000 n 0000421773 00000 n 0000421880 00000 n 0000421989 00000 n 0000422093 00000 n 0000422194 00000 n 0000422318 00000 n 0000422353 00000 n 0000422463 00000 n 0000429031 00000 n 0000429236 00000 n 0000429332 00000 n 0000429456 00000 n 0000429491 00000 n 0000429601 00000 n 0000435698 00000 n 0000435927 00000 n 0000436028 00000 n 0000436132 00000 n 0000436229 00000 n 0000436326 00000 n 0000436409 00000 n 0000436444 00000 n 0000436554 00000 n 0000441755 00000 n 0000441960 00000 n 0000442056 00000 n 0000442191 00000 n 0000442226 00000 n 0000442336 00000 n 0000447652 00000 n 0000447865 00000 n 0000447963 00000 n 0000448065 00000 n 0000448200 00000 n 0000448235 00000 n 0000448345 00000 n 0000453697 00000 n 0000453918 00000 n 0000454016 00000 n 0000454116 00000 n 0000454213 00000 n 0000454348 00000 n 0000454383 00000 n 0000454493 00000 n 0000459996 00000 n 0000460217 00000 n 0000460316 00000 n 0000460419 00000 n 0000460510 00000 n 0000460626 00000 n 0000460661 00000 n 0000460771 00000 n 0000465980 00000 n 0000466169 00000 n 0000466263 00000 n 0000466298 00000 n 0000466408 00000 n 0000473669 00000 n 0000473858 00000 n 0000473941 00000 n 0000473976 00000 n 0000474086 00000 n 0000482276 00000 n 0000482465 00000 n 0000482548 00000 n 0000482583 00000 n 0000482693 00000 n 0000490185 00000 n 0000490374 00000 n 0000490457 00000 n 0000490492 00000 n 0000490602 00000 n 0000495607 00000 n 0000495796 00000 n 0000495879 00000 n 0000495914 00000 n 0000496024 00000 n 0000502097 00000 n 0000502310 00000 n 0000502404 00000 n 0000502500 00000 n 0000502605 00000 n 0000502640 00000 n 0000502750 00000 n 0000507032 00000 n 0000507237 00000 n 0000507331 00000 n 0000507488 00000 n 0000507523 00000 n 0000507633 00000 n 0000510572 00000 n 0000516735 00000 n 0000536544 00000 n 0000536749 00000 n 0000536847 00000 n 0000536975 00000 n 0000537010 00000 n 0000537120 00000 n 0000541117 00000 n 0000541140 00000 n 0000568900 00000 n 0000569160 00000 n 0000569464 00000 n 0000569822 00000 n 0000570011 00000 n 0000570105 00000 n 0000570140 00000 n 0000570250 00000 n 0000575829 00000 n 0000576018 00000 n 0000576101 00000 n 0000576136 00000 n 0000576246 00000 n 0000579863 00000 n 0000580052 00000 n 0000580124 00000 n 0000580159 00000 n 0000580269 00000 n 0000581710 00000 n 0000581899 00000 n 0000581971 00000 n 0000582006 00000 n 0000582116 00000 n 0000583167 00000 n 0000583356 00000 n 0000583450 00000 n 0000583485 00000 n 0000583595 00000 n 0000586896 00000 n 0000587085 00000 n 0000587168 00000 n 0000587203 00000 n 0000587313 00000 n 0000589890 00000 n 0000590079 00000 n 0000590151 00000 n 0000590186 00000 n 0000590296 00000 n 0000592931 00000 n 0000593120 00000 n 0000593192 00000 n 0000593227 00000 n 0000593337 00000 n 0000596028 00000 n 0000596217 00000 n 0000596300 00000 n 0000596335 00000 n 0000596445 00000 n 0000598397 00000 n 0000599057 00000 n 0000599205 00000 n 0000600037 00000 n 0000665905 00000 n 0000666153 00000 n 0000666177 00000 n 0000666747 00000 n 0000666896 00000 n 0000667149 00000 n 0000667173 00000 n 0000667196 00000 n 0000667217 00000 n 0000667537 00000 n 0000668055 00000 n 0000717109 00000 n 0000717595 00000 n 0000718202 00000 n 0000738344 00000 n 0000738545 00000 n 0000738566 00000 n 0000738985 00000 n 0000768930 00000 n 0000769141 00000 n 0000769162 00000 n 0000769185 00000 n 0000769206 00000 n 0000769418 00000 n 0000769441 00000 n 0000769580 00000 n 0000786602 00000 n 0000817399 00000 n 0000817788 00000 n 0000818070 00000 n 0000818323 00000 n 0000818672 00000 n 0000818819 00000 n 0000819173 00000 n 0000819194 00000 n 0000819578 00000 n 0000820017 00000 n 0000820038 00000 n 0000820061 00000 n 0000820255 00000 n 0000820389 00000 n 0000821041 00000 n 0000839201 00000 n 0000839436 00000 n 0000839459 00000 n 0000840015 00000 n 0000840101 00000 n 0000841174 00000 n 0000841218 00000 n 0000841241 00000 n 0000841595 00000 n 0000841736 00000 n 0000841979 00000 n 0000842254 00000 n 0000853638 00000 n 0000853791 00000 n 0000853867 00000 n 0000854264 00000 n 0000854568 00000 n 0000854880 00000 n 0000855199 00000 n 0000855676 00000 n 0000855999 00000 n 0000856049 00000 n 0000856097 00000 n 0000856147 00000 n 0000856197 00000 n 0000856247 00000 n 0000856295 00000 n 0000856343 00000 n 0000856391 00000 n 0000856441 00000 n 0000856489 00000 n 0000856537 00000 n 0000856585 00000 n 0000856633 00000 n 0000856681 00000 n 0000856729 00000 n 0000856777 00000 n 0000856827 00000 n 0000856875 00000 n 0000856925 00000 n 0000856975 00000 n 0000857025 00000 n 0000857073 00000 n 0000857123 00000 n 0000857173 00000 n 0000857221 00000 n 0000857269 00000 n 0000857319 00000 n 0000857367 00000 n 0000857415 00000 n 0000857465 00000 n 0000857513 00000 n 0000857563 00000 n 0000857613 00000 n 0000857663 00000 n 0000857713 00000 n 0000857761 00000 n 0000857809 00000 n 0000857855 00000 n 0000857905 00000 n 0000857955 00000 n 0000858003 00000 n 0000858053 00000 n 0000858099 00000 n 0000858147 00000 n 0000858195 00000 n 0000858243 00000 n 0000858293 00000 n 0000858343 00000 n 0000858393 00000 n 0000858443 00000 n 0000858491 00000 n 0000858541 00000 n 0000858591 00000 n 0000858641 00000 n 0000858689 00000 n 0000858739 00000 n 0000858789 00000 n 0000858839 00000 n 0000858887 00000 n 0000858937 00000 n 0000858985 00000 n 0000859035 00000 n 0000859083 00000 n 0000859131 00000 n 0000859179 00000 n 0000859229 00000 n 0000859279 00000 n 0000859327 00000 n 0000859373 00000 n 0000859421 00000 n 0000859471 00000 n 0000859519 00000 n 0000859567 00000 n 0000859613 00000 n 0000859661 00000 n 0000859709 00000 n 0000859757 00000 n 0000859805 00000 n 0000859855 00000 n 0000859903 00000 n 0000859951 00000 n 0000860001 00000 n 0000860049 00000 n 0000860099 00000 n 0000860149 00000 n 0000860199 00000 n 0000860249 00000 n 0000860297 00000 n 0000860345 00000 n 0000860395 00000 n 0000860483 00000 n 0000860618 00000 n 0000860761 00000 n 0000860904 00000 n 0000861047 00000 n 0000861133 00000 n 0000864910 00000 n trailer <> startxref 116 %%EOF openhpi-2.14.1/plugins/oa_soap/oa_soap_ps_event.h0000644000076400007640000000451111302566664017002 0ustar /* * Copyright (C) 2007-2008, Hewlett-Packard Development Company, LLP * All rights reserved. * * 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. * * Neither the name of the Hewlett-Packard Corporation, nor the names * of its contributors may be used to endorse or promote products * derived from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * Author(s) * Raghavendra P.G. */ #ifndef _OA_SOAP_POWER_SUPPLY_EVENT_H #define _OA_SOAP_POWER_SUPPLY_EVENT_H /* Include files */ #include "oa_soap_re_discover.h" SaErrorT process_ps_insertion_event(struct oh_handler_state *oh_handler, SOAP_CON *con, struct eventInfo *oa_event); SaErrorT process_ps_extraction_event(struct oh_handler_state *oh_handler, struct eventInfo *oa_event); void oa_soap_proc_ps_subsys_info(struct oh_handler_state *oh_handler, struct powerSubsystemInfo *info); void oa_soap_proc_ps_status(struct oh_handler_state *oh_handler, struct powerSupplyStatus *status); #endif openhpi-2.14.1/plugins/oa_soap/oa_soap_discover.h0000644000076400007640000002404011302566663016773 0ustar /* * Copyright (C) 2007-2008, Hewlett-Packard Development Company, LLP * All rights reserved. * * 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. * * Neither the name of the Hewlett-Packard Corporation, nor the names * of its contributors may be used to endorse or promote products * derived from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * Author(s) * Raghavendra P.G. * Shuah Khan * Raghavendra M.S. */ #ifndef _OA_SOAP_DISCOVER_H #define _OA_SOAP_DISCOVER_H /* Include files */ #include "oa_soap_sensor.h" #include "oa_soap_control.h" #include "oa_soap_event.h" #include "oa_soap_resources.h" /* The OA does not gives the resource names for power supply, power subsystem * and OA. The names will be used for creating the tag in RPT entry */ #define POWER_SUPPLY_NAME "Power Supply Unit" #define POWER_SUBSYSTEM_NAME "Power Subsystem" #define OA_NAME "Onboard Administrator" #define MAX_NAME_LEN 64 /* Maximum length of the serial number */ #define MAX_SERIAL_NUM_LENGTH 32 #define CISCO "CISCO" /* Identifies the Cisco interconnects */ /* Builds the sensor rdr and gets the current value of sensor */ #define OA_SOAP_BUILD_ENABLE_SENSOR_RDR(sensor_num, sensor_value) \ { \ memset(&rdr, 0, sizeof(SaHpiRdrT)); \ rv = oa_soap_build_sen_rdr(oh_handler, resource_id, &rdr, \ &sensor_info, sensor_num); \ if (rv != SA_OK) { \ err("Failed to create sensor rdr for sensor %x", sensor_num); \ return rv; \ } \ \ rv = oa_soap_map_sen_val(sensor_info, sensor_num, \ (SaHpiInt32T) sensor_value, &sensor_status); \ if (rv != SA_OK) { \ err("Setting sensor state failed"); \ g_free(sensor_info); \ return rv; \ } \ \ rv = oh_add_rdr(oh_handler->rptcache, resource_id, \ &rdr, sensor_info, 0); \ if (rv != SA_OK) { \ err("Failed to add rdr"); \ return rv; \ } \ } /* Builds the threshold sensor rdr and puts threshold information provided by OA */ #define OA_SOAP_BUILD_THRESHOLD_SENSOR_RDR(sensor_num, response) \ { \ memset(&rdr, 0, sizeof(SaHpiRdrT)); \ rv = oa_soap_build_sen_rdr(oh_handler, resource_id, &rdr, \ &sensor_info, sensor_num); \ if (rv != SA_OK) { \ err("Failed to create sensor rdr for sensor %x", sensor_num); \ return rv; \ } \ \ /* the thresholds values updated in the rdr from the global sensor \ * array contains the dummy values, these values needs to be replaced \ * with actual threshold values provided by OA \ */ \ rv = oa_soap_map_thresh_resp(&rdr, (void *)&response, \ event_support, sensor_info); \ if (rv != SA_OK) { \ err("Updating rdr with threshold failed"); \ g_free(sensor_info); \ return rv; \ } \ \ rv = oh_add_rdr(oh_handler->rptcache, resource_id, \ &rdr, sensor_info, 0); \ if (rv != SA_OK) { \ err("Failed to add rdr"); \ return rv; \ } \ } /* Builds the sensor rdr which does not events based on sensor number */ #define OA_SOAP_BUILD_SENSOR_RDR(sensor_num) \ { \ memset(&rdr, 0, sizeof(SaHpiRdrT)); \ rv = oa_soap_build_sen_rdr(oh_handler, resource_id, &rdr, \ &sensor_info, sensor_num); \ if (rv != SA_OK) { \ err("Failed to create sensor rdr for sensor %x", sensor_num); \ return rv; \ } \ \ rv = oh_add_rdr(oh_handler->rptcache, resource_id, \ &rdr, sensor_info, 0); \ if (rv != SA_OK) { \ err("Failed to add rdr"); \ return rv; \ } \ } /* Builds the control rdr */ #define OA_SOAP_BUILD_CONTROL_RDR(control_num) \ { \ memset(&rdr, 0, sizeof(SaHpiRdrT)); \ rv = oa_soap_build_control_rdr(oh_handler, &rdr, resource_id, \ control_num); \ if (rv != SA_OK) { \ err("Failed to create rdr for control %x", control_num);\ return rv; \ } \ \ rv = oh_add_rdr(oh_handler->rptcache, resource_id, \ &rdr, 0, 0); \ if (rv != SA_OK) { \ err("Failed to add rdr"); \ return rv; \ } \ } /* Function prototypes */ SaErrorT oa_soap_discover_resources(void *oh_handler); SaErrorT discover_oa_soap_system(struct oh_handler_state *oh_handler); SaErrorT build_enclosure_rpt(struct oh_handler_state *oh_handler, char *name, SaHpiResourceIdT *resource_id); SaErrorT build_enclosure_rdr(struct oh_handler_state *oh_handler, SOAP_CON *con, struct enclosureInfo *response, SaHpiResourceIdT resource_id); SaErrorT discover_enclosure(struct oh_handler_state *oh_handler); SaErrorT build_oa_rpt(struct oh_handler_state *oh_handler, SaHpiInt32T bay_number, SaHpiResourceIdT *resource_id); SaErrorT build_oa_rdr(struct oh_handler_state *oh_handler, SOAP_CON *con, SaHpiInt32T bay_number, struct oaInfo *response, SaHpiResourceIdT resource_id); SaErrorT discover_oa(struct oh_handler_state *oh_handler); SaErrorT build_discovered_server_rpt(struct oh_handler_state *oh_handler, SOAP_CON *con, struct bladeInfo *response, SaHpiResourceIdT *resource_id); SaErrorT build_server_rpt(struct oh_handler_state *oh_handler, struct bladeInfo *response, SaHpiRptEntryT *rpt); SaErrorT build_server_rdr(struct oh_handler_state *oh_handler, SOAP_CON *con, SaHpiInt32T bay_number, SaHpiResourceIdT resource_id, char *name); SaErrorT discover_server(struct oh_handler_state *oh_handler); SaErrorT build_interconnect_rpt(struct oh_handler_state *oh_handler, SOAP_CON *con, char *name, SaHpiInt32T bay_number, SaHpiResourceIdT *resource_id, int inserted); SaErrorT build_interconnect_rdr(struct oh_handler_state *oh_handler, SOAP_CON *con, SaHpiInt32T bay_number, SaHpiResourceIdT resource_id); SaErrorT discover_interconnect(struct oh_handler_state *oh_handler); SaErrorT build_fan_rpt(struct oh_handler_state *oh_handler, char *name, SaHpiInt32T bay_number, SaHpiResourceIdT *resource_id); SaErrorT build_fan_rdr(struct oh_handler_state *oh_handler, SOAP_CON *con, struct fanInfo *response, SaHpiResourceIdT resource_id); SaErrorT discover_fan(struct oh_handler_state *oh_handler); SaErrorT build_power_subsystem_rpt(struct oh_handler_state *oh_handler, char *name, SaHpiResourceIdT *resource_id); SaErrorT build_power_subsystem_rdr(struct oh_handler_state *oh_handler, SaHpiResourceIdT resource_id); SaErrorT discover_power_subsystem(struct oh_handler_state *oh_handler); SaErrorT build_power_supply_rpt(struct oh_handler_state *oh_handler, char *name, SaHpiInt32T bay_number, SaHpiResourceIdT *resource_id); SaErrorT build_power_supply_rdr(struct oh_handler_state *oh_handler, SOAP_CON *con, struct powerSupplyInfo *response, SaHpiResourceIdT resource_id); SaErrorT discover_power_supply(struct oh_handler_state *oh_handler); void oa_soap_get_health_val(xmlNode *extra_data, enum oa_soap_extra_data_health *status); void oa_soap_parse_diag_ex(xmlNode *diag_ex, enum diagnosticStatus *diag_status_arr); SaErrorT oa_soap_build_rpt(struct oh_handler_state *oh_handler, SaHpiInt32T resourece_type, SaHpiInt32T location, SaHpiRptEntryT *rpt); SaErrorT oa_soap_get_fz_arr(struct oa_soap_handler *oa_handler, SaHpiInt32T max_fz, struct getFanZoneArrayResponse *response); SaErrorT oa_soap_build_fan_rpt(struct oh_handler_state *oh_handler, SaHpiInt32T bay_number, SaHpiResourceIdT *resource_id); SaErrorT oa_soap_build_fan_rdr(struct oh_handler_state *oh_handler, SOAP_CON *con, struct fanInfo *response, SaHpiResourceIdT resource_id); SaErrorT oa_soap_populate_event(struct oh_handler_state *oh_handler, SaHpiResourceIdT resource_id, struct oh_event *event, GSList **assert_sensors); SaErrorT oa_soap_build_blade_thermal_rdr( struct oh_handler_state *oh_handler, struct bladeThermalInfoArrayResponse thermal_response, SaHpiRptEntryT *rpt, char *name); #endif openhpi-2.14.1/plugins/oa_soap/oa_soap_ps_event.c0000644000076400007640000002241211302566664016775 0ustar /* * Copyright (C) 2007-2008, Hewlett-Packard Development Company, LLP * All rights reserved. * * 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. * * Neither the name of the Hewlett-Packard Corporation, nor the names * of its contributors may be used to endorse or promote products * derived from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * Author(s) * Raghavendra P.G. * * This file has the implementation of the power supply unit event handling * * process_ps_insertion_event() - Processes the power supply unit * insertion event * * process_ps_extraction_event() - Processes the power supply unit * extraction event * * oa_soap_proc_ps_subsys_info() - Processes the power subsystem info event * * oa_soap_proc_ps_status() - Processes the power supply status event */ #include "oa_soap_ps_event.h" /** * process_ps_insertion_event * @oh_handler: Pointer to openhpi handler structure * @con: Pointer to SOAP_CON structure * @oa_event: Pointer to oa event response structure * * Purpose: * Adds the newly inserted power supply information into RPT and RDR table * Creates the hot swap event * * Detailed Description: NA * * Return values: * SA_OK - success. * SA_ERR_HPI_INVALID_PARAMS - on wrong parameters. * SA_ERR_HPI_INTERNAL_ERROR - on failure **/ SaErrorT process_ps_insertion_event(struct oh_handler_state *oh_handler, SOAP_CON *con, struct eventInfo *oa_event) { struct getPowerSupplyInfo info; struct powerSupplyInfo response; SaErrorT rv = SA_OK; if (oh_handler == NULL || con == NULL || oa_event == NULL) { err("Invalid parameters"); return SA_ERR_HPI_INVALID_PARAMS; } info.bayNumber = oa_event->eventData.powerSupplyStatus.bayNumber; rv = soap_getPowerSupplyInfo(con, &info, &response); if (rv != SOAP_OK) { err("Get power supply info failed"); return SA_ERR_HPI_INTERNAL_ERROR; } /* If the power supply unit does not have the power cord plugged in, * then power supply unit will be in faulty condition. In this case, * all the information in the response structure is NULL. Consider the * faulty power supply unit as ABSENT */ if (response.serialNumber == NULL) { err("Inserted power supply unit may be faulty"); return SA_ERR_HPI_INTERNAL_ERROR; } rv = add_ps_unit(oh_handler, con, &response); if (rv != SA_OK) { err("Add power supply unit failed"); } return SA_OK; } /** * process_ps_extraction_event * @oh_handler: Pointer to openhpi handler structure * @oa_event: Pointer to oa event response structure * * Purpose: * Gets the power extraction event. * Removes the extracted power supply information from RPT * Creates the hot swap event * * Detailed Description: NA * * Return values: * SA_OK - success. * SA_ERR_HPI_INVALID_PARAMS - on wrong parameters. * SA_ERR_HPI_INTERNAL_ERROR - on failure **/ SaErrorT process_ps_extraction_event(struct oh_handler_state *oh_handler, struct eventInfo *oa_event) { SaErrorT rv = SA_OK; SaHpiInt32T bay_number; struct oa_soap_handler *oa_handler; if (oh_handler == NULL || oa_event == NULL) { err("Invalid parameters"); return SA_ERR_HPI_INVALID_PARAMS; } oa_handler = (struct oa_soap_handler *) oh_handler->data; bay_number = oa_event->eventData.powerSupplyStatus.bayNumber; /* If the power supply unit does not have the power cord * plugged in, then power supply unit will be in faulty * condition. In this case, all the information in the * response structure is NULL. Then the faulty power supply * unit is considered as ABSENT. Ignore the extraction event. */ if (oa_handler->oa_soap_resources.ps_unit.presence[bay_number - 1] == RES_ABSENT) { err("Extracted power supply unit may be in faulty condition"); return SA_ERR_HPI_INTERNAL_ERROR; } rv = remove_ps_unit(oh_handler, bay_number); if (rv != SA_OK) { err("Remove power supply unit failed"); } return SA_OK; } /** * oa_soap_proc_ps_subsys_info * @oh_handler : Pointer to openhpi handler structure * @info : Pointer to power subsystem info structure * * Purpose: * Processes the power subsystem info event * * Detailed Description: NA * * Return values: * NONE **/ void oa_soap_proc_ps_subsys_info(struct oh_handler_state *oh_handler, struct powerSubsystemInfo *info) { SaErrorT rv = SA_OK; struct oa_soap_handler *oa_handler; SaHpiResourceIdT resource_id; if (oh_handler == NULL || info == NULL) { err("Invalid parameters"); return; } oa_handler = (struct oa_soap_handler *) oh_handler->data; resource_id = oa_handler->oa_soap_resources.power_subsystem_rid; /* Process the operational status sensor */ OA_SOAP_PROCESS_SENSOR_EVENT(OA_SOAP_SEN_OPER_STATUS, info->operationalStatus, 0, 0); /* Process the predictive failure status sensor */ OA_SOAP_PROCESS_SENSOR_EVENT(OA_SOAP_SEN_PRED_FAIL, info->operationalStatus, 0, 0); /* Process the redundancy sensor */ OA_SOAP_PROCESS_SENSOR_EVENT(OA_SOAP_SEN_REDUND, info->redundancy, 0, 0); return; } /** * oa_soap_proc_ps_status * @oh_handler : Pointer to openhpi handler structure * @status : Pointer to power supply status structure * * Purpose: * Processes the power supply status event * * Detailed Description: NA * * Return values: * NONE **/ void oa_soap_proc_ps_status(struct oh_handler_state *oh_handler, struct powerSupplyStatus *status) { SaErrorT rv = SA_OK; struct oa_soap_handler *oa_handler; SaHpiResourceIdT resource_id; enum diagnosticStatus diag_ex_status[OA_SOAP_MAX_DIAG_EX]; if (oh_handler == NULL || status == NULL) { err("Invalid parameters"); return; } oa_handler = (struct oa_soap_handler *) oh_handler->data; resource_id = oa_handler->oa_soap_resources.ps_unit. resource_id[status->bayNumber - 1]; /* Process the operational status sensor */ OA_SOAP_PROCESS_SENSOR_EVENT(OA_SOAP_SEN_OPER_STATUS, status->operationalStatus, 0, 0); /* Process the predictive failure status sensor */ OA_SOAP_PROCESS_SENSOR_EVENT(OA_SOAP_SEN_PRED_FAIL, status->operationalStatus, 0, 0); /* Process the redundancy sensor */ OA_SOAP_PROCESS_SENSOR_EVENT(OA_SOAP_SEN_INT_DATA_ERR, status->diagnosticChecks. internalDataError, 0, 0) /* Process the device location error sensor */ OA_SOAP_PROCESS_SENSOR_EVENT(OA_SOAP_SEN_DEV_LOC_ERR, status->diagnosticChecks. deviceLocationError, 0, 0) /* Process the device failure error sensor */ OA_SOAP_PROCESS_SENSOR_EVENT(OA_SOAP_SEN_DEV_FAIL, status->diagnosticChecks.deviceFailure, 0, 0) /* Process the device degraded error sensor */ OA_SOAP_PROCESS_SENSOR_EVENT(OA_SOAP_SEN_DEV_DEGRAD, status->diagnosticChecks.deviceDegraded, 0, 0) /* Process the AC failure sensor */ OA_SOAP_PROCESS_SENSOR_EVENT(OA_SOAP_SEN_AC_FAIL, status->diagnosticChecks.acFailure, 0, 0) oa_soap_parse_diag_ex(status->diagnosticChecksEx, diag_ex_status); /* Process device not supported sensor rdr */ OA_SOAP_PROCESS_SENSOR_EVENT(OA_SOAP_SEN_DEV_NOT_SUPPORT, diag_ex_status[DIAG_EX_DEV_NOT_SUPPORT], 0, 0) /* Process Device mix match sensor */ OA_SOAP_PROCESS_SENSOR_EVENT(OA_SOAP_SEN_DEV_MIX_MATCH, diag_ex_status[DIAG_EX_DEV_MIX_MATCH], 0, 0) return; } openhpi-2.14.1/plugins/oa_soap/oa_soap_re_discover.c0000644000076400007640000031360711302566663017466 0ustar /* * Copyright (C) 2007-2009, Hewlett-Packard Development Company, LLP * All rights reserved. * * 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. * * Neither the name of the Hewlett-Packard Corporation, nor the names * of its contributors may be used to endorse or promote products * derived from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * Author(s) * Raghavendra P.G. * Vivek Kumar * Raghavendra M.S. * Shuah Khan * Mohan Devarajulu * * This file implements the re-discovery functionality. The resources of the * HP BladeSystem c-Class are re-discovered, whenever the connection to the * active OA is broken or on OA switchover. Re-discovery is done to sync the * plugin with the current state of the resources. * * oa_soap_re_discover_resources() - Starts the re-discovery of server * blades, interconnect blades, OA, * fan and power supplies. * * re_discover_server() - Re-discovers the ProLiant server * blades * * re_discover_interconnect() - Re-discovers the interconnect blades * * re_discover_fan() - Re-discovers the fan * * re_discover_power_supply() - Re-discovers the power supply units * * re_discover_oa() - Re-discovers the onboard administrator * * oa_soap_re_disc_oa_sen() - Re-discovers the OA sensor states * * oa_soap_re_disc_server_sen() - Re-discovers the server sensor states * * oa_soap_re_disc_interconct_sen()- Re-discovers the interconnect sensor * states * * oa_soap_re_disc_ps_sen() - Re-discovers the power supply sensor * states * * oa_soap_re_disc_enc_sen() - Re-discovers the enclosure sensor * states * * oa_soap_re_disc_ps_subsys_sen() - Re-discovers the power subsystem * sensor states * * oa_soap_re_disc_lcd_sen() - Re-discovers the LCD sensor states * * oa_soap_re_disc_fz_sen() - Re-discovers the fan zone sensor * states * * oa_soap_re_disc_therm_subsys_sen()- Re-discovers the thermal subsystem * sensor states */ #include "oa_soap_re_discover.h" /* Forward declarations for static functions */ static SaErrorT oa_soap_re_disc_oa_sen(struct oh_handler_state *oh_handler, SOAP_CON *con, SaHpiInt32T bay_number); static SaErrorT oa_soap_re_disc_server_sen(struct oh_handler_state *oh_handler, SOAP_CON *con, SaHpiInt32T bay_number); static SaErrorT oa_soap_re_disc_interconct_sen(struct oh_handler_state *oh_handler, SOAP_CON *con, SaHpiInt32T bay_number); static SaErrorT oa_soap_re_disc_ps_sen(struct oh_handler_state *oh_handler, SOAP_CON *con, SaHpiInt32T bay_number); static SaErrorT oa_soap_re_disc_enc_sen(struct oh_handler_state *oh_handler, SOAP_CON *con); static SaErrorT oa_soap_re_disc_ps_subsys_sen(struct oh_handler_state *oh_handler, SOAP_CON *con); static SaErrorT oa_soap_re_disc_lcd_sen(struct oh_handler_state *oh_handler, SOAP_CON *con); static SaErrorT oa_soap_re_disc_fz_sen(struct oh_handler_state *oh_handler, SOAP_CON *con); static SaErrorT oa_soap_re_disc_therm_subsys_sen(struct oh_handler_state *oh_handler, SOAP_CON *con); /** * oa_soap_re_discover_resources * @oh_handler: Pointer to openhpi handler * @con: Pointer to the SOAP_CON structure * * Purpose: * Re-discover the resources. * * Detailed Description: NA * * Return values: * SA_OK - on success. * SA_ERR_HPI_INVALID_PARAMS - on wrong parameters * SA_ERR_HPI_INTERNAL_ERROR - on failure. **/ SaErrorT oa_soap_re_discover_resources(struct oh_handler_state *oh_handler, struct oa_info *oa, int oa_switched) { SaErrorT rv = SA_OK; struct oa_soap_handler *oa_handler = NULL; oa_handler = (struct oa_soap_handler *) oh_handler->data; if (oh_handler == NULL || oa == NULL) { err("Invalid parameters"); return SA_ERR_HPI_INVALID_PARAMS; } err("Re-discovery started"); /* The following is applicable only to OA Switchover cases Just rediscover oa and end the whole thing. If some other hardware is removed at the same time, then it is a separate case that needs to be handled separately */ if ( oa_switched == SAHPI_TRUE ) { OA_SOAP_CHEK_SHUTDOWN_REQ(oa_handler, oa_handler->mutex, oa->mutex, NULL); rv = re_discover_oa(oh_handler, oa->event_con); if (rv != SA_OK) { err("Re-discovery of OA failed"); } return rv; } /* Re-discovery is called by locking the OA handler mutex and oa_info * mutex. Hence on getting request to shutdown, pass the locked mutexes * for unlocking */ OA_SOAP_CHEK_SHUTDOWN_REQ(oa_handler, oa_handler->mutex, oa->mutex, NULL); rv = re_discover_blade(oh_handler, oa->event_con); if (rv != SA_OK) { err("Re-discovery of server blade failed"); return rv; } OA_SOAP_CHEK_SHUTDOWN_REQ(oa_handler, oa_handler->mutex, oa->mutex, NULL); rv = re_discover_interconnect(oh_handler, oa->event_con); if (rv != SA_OK) { err("Re-discovery of interconnect failed"); return rv; } OA_SOAP_CHEK_SHUTDOWN_REQ(oa_handler, oa_handler->mutex, oa->mutex, NULL); rv = re_discover_fan(oh_handler, oa->event_con); if (rv != SA_OK) { err("Re-discovery of fan failed"); return rv; } OA_SOAP_CHEK_SHUTDOWN_REQ(oa_handler, oa_handler->mutex, oa->mutex, NULL); rv = re_discover_ps_unit(oh_handler, oa->event_con); if (rv != SA_OK) { err("Re-discovery of power supply unit failed"); return rv; } OA_SOAP_CHEK_SHUTDOWN_REQ(oa_handler, oa_handler->mutex, oa->mutex, NULL); rv = re_discover_oa(oh_handler, oa->event_con); if (rv != SA_OK) { err("Re-discovery of OA failed"); return rv; } OA_SOAP_CHEK_SHUTDOWN_REQ(oa_handler, oa_handler->mutex, oa->mutex, NULL); rv = oa_soap_re_disc_enc_sen(oh_handler, oa->event_con); if (rv != SA_OK) { err("Re-discovery of enclosure failed"); return rv; } OA_SOAP_CHEK_SHUTDOWN_REQ(oa_handler, oa_handler->mutex, oa->mutex, NULL); rv = oa_soap_re_disc_ps_subsys_sen(oh_handler, oa->event_con); if (rv != SA_OK) { err("Re-discovery of power subsystem failed"); return rv; } OA_SOAP_CHEK_SHUTDOWN_REQ(oa_handler, oa_handler->mutex, oa->mutex, NULL); rv = oa_soap_re_disc_lcd_sen(oh_handler, oa->event_con); if (rv != SA_OK) { err("Re-discovery of LCD failed"); return rv; } OA_SOAP_CHEK_SHUTDOWN_REQ(oa_handler, oa_handler->mutex, oa->mutex, NULL); rv = oa_soap_re_disc_fz_sen(oh_handler, oa->event_con); if (rv != SA_OK) { err("Re-discovery of fan zone failed"); return rv; } OA_SOAP_CHEK_SHUTDOWN_REQ(oa_handler, oa_handler->mutex, oa->mutex, NULL); rv = oa_soap_re_disc_therm_subsys_sen(oh_handler, oa->event_con); if (rv != SA_OK) { err("Re-discovery of thermal subsystem failed"); return rv; } err("Re-discovery completed"); return SA_OK; } /** * re_discover_oa * @oh_handler: Pointer to openhpi handler * @con: Pointer to the SOAP_CON structure * * Purpose: * Re-discover the OAs. * * Detailed Description: NA * * Return values: * SA_OK - on success. * SA_ERR_HPI_INVALID_PARAMS - on wrong parameters * SA_ERR_HPI_INTERNAL_ERROR - on failure. **/ SaErrorT re_discover_oa(struct oh_handler_state *oh_handler, SOAP_CON *con) { SaErrorT rv = SA_OK; struct oa_soap_handler *oa_handler; struct getOaStatus request; struct oaStatus response; struct getOaInfo info_request; struct oaInfo info_response; SaHpiInt32T i; enum resource_presence_status state = RES_ABSENT; SaHpiBoolT replace_resource = SAHPI_FALSE; if (oh_handler == NULL || con == NULL) { err("Invalid parameter"); return SA_ERR_HPI_INVALID_PARAMS; } oa_handler = (struct oa_soap_handler *) oh_handler->data; for (i = 1; i <= oa_handler->oa_soap_resources.oa.max_bays; i++) { request.bayNumber = i; rv = soap_getOaStatus(con, &request, &response); if (rv != SOAP_OK) { err("get OA status failed"); return SA_ERR_HPI_INTERNAL_ERROR; } /* Sometimes, if the OA is absent, then OA status is shown as * STANDBY in getOaStatus response. As workaround, if OA * status is STANDBY and oaRedudancy state is set to false, * Then, it is considered as ABSENT. * * But, if the OA is recently inserted, then oaRedudancy state * will be set to false. In this scenario, the OA state will * be wrongly considered as ABSENT. This is a known limitation. * * TODO: Remove this workaround once the fix is available in * OA firmware */ if ((response.oaRole == OA_ABSENT) || (response.oaRole == STANDBY && response.oaRedundancy == HPOA_FALSE)) { /* The OA is absent, check OA is absent in presence * matrix */ if (oa_handler->oa_soap_resources.oa.presence[i - 1] == RES_ABSENT) continue; else state = RES_ABSENT; } else { /* The OA is present, check OA is present in presence * matrix */ if (oa_handler->oa_soap_resources.oa.presence[i - 1] == RES_PRESENT) { /* Check whether OA has been replaced */ info_request.bayNumber = i; rv = soap_getOaInfo(con, &info_request, &info_response); if (rv != SOAP_OK) { err("get OA status failed"); return SA_ERR_HPI_INTERNAL_ERROR; } /* If serail number is different * remove and add OA */ if (strcmp(oa_handler->oa_soap_resources.oa. serial_number[i - 1], info_response.serialNumber) != 0) { replace_resource = SAHPI_TRUE; } else { /* Check the OA sensors state */ rv = oa_soap_re_disc_oa_sen( oh_handler, con, i); if (rv != SA_OK) { err("Re-discover OA sensors " " failed"); return rv; } continue; } } else state = RES_PRESENT; } if (state == RES_ABSENT || replace_resource == SAHPI_TRUE) { /* The OA is present according OA presence matrix, but * OA is removed. Remove the OA resource from RPTable. */ rv = remove_oa(oh_handler, i); if (rv != SA_OK) { err("OA %d removal failed", i); return rv; } else err("OA in slot %d is removed", i); } if (state == RES_PRESENT || replace_resource == SAHPI_TRUE) { /* The OA is absent according OA presence matrix, but * OA is present. Add the OA resource to RPTable. */ rv = add_oa(oh_handler, con, i); if (rv != SA_OK) { err("OA %d add failed", i); return rv; } else err("OA in slot %d is added", i); replace_resource = SAHPI_FALSE; } } /* End of for loop */ return SA_OK; } /** * remove_oa * @oh_handler: Pointer to openhpi handler * @bay_number: Bay number of the extracted OA * * Purpose: * Removes the OA information from the RPTable * Updates the status of the OA in OA data structure as absent * * Detailed Description: NA * * Return values: * SA_OK - on success. * SA_ERR_HPI_INVALID_PARAMS - on wrong parameters * SA_ERR_HPI_INTERNAL_ERROR - on failure. **/ SaErrorT remove_oa(struct oh_handler_state *oh_handler, SaHpiInt32T bay_number) { SaErrorT rv = SA_OK; SaHpiRptEntryT *rpt = NULL; struct oh_event event; struct oa_soap_handler *oa_handler = NULL; SaHpiResourceIdT resource_id; if (oh_handler == NULL) { err("Invalid parameters"); return SA_ERR_HPI_INVALID_PARAMS; } oa_handler = (struct oa_soap_handler *) oh_handler->data; /* Update the OA status to absent */ switch (bay_number) { case 1: g_mutex_lock(oa_handler->oa_1->mutex); oa_handler->oa_1->oa_status = OA_ABSENT; g_mutex_unlock(oa_handler->oa_1->mutex); break; case 2: g_mutex_lock(oa_handler->oa_2->mutex); oa_handler->oa_2->oa_status = OA_ABSENT; g_mutex_unlock(oa_handler->oa_2->mutex); break; default: err("Wrong OA bay number %d passed", bay_number); return SA_ERR_HPI_INVALID_PARAMS; } update_hotswap_event(oh_handler, &event); resource_id = oa_handler->oa_soap_resources.oa.resource_id[bay_number - 1]; /* Get the rpt entry of the resource */ rpt = oh_get_resource_by_id(oh_handler->rptcache, resource_id); if (rpt == NULL) { err("resource RPT is NULL"); return SA_ERR_HPI_INTERNAL_ERROR; } memcpy(&(event.resource), rpt, sizeof(SaHpiRptEntryT)); event.event.Source = event.resource.ResourceId; event.event.Severity = event.resource.ResourceSeverity; event.event.EventDataUnion.HotSwapEvent.PreviousHotSwapState = SAHPI_HS_STATE_ACTIVE; event.event.EventDataUnion.HotSwapEvent.HotSwapState = SAHPI_HS_STATE_NOT_PRESENT; /* This state change happened due to surprise extraction */ event.event.EventDataUnion.HotSwapEvent.CauseOfStateChange = SAHPI_HS_CAUSE_SURPRISE_EXTRACTION; /* Push the hotswap event to remove the resource from OpenHPI RPTable */ oh_evt_queue_push(oh_handler->eventq, copy_oa_soap_event(&event)); /* Free the inventory info from inventory RDR */ rv = free_inventory_info(oh_handler, rpt->ResourceId); if (rv != SA_OK) { err("Inventory cleanup failed for resource id %d", rpt->ResourceId); } /* Remove the resource from plugin RPTable */ rv = oh_remove_resource(oh_handler->rptcache, event.resource.ResourceId); /* Reset resource_status structure to default values */ oa_soap_update_resource_status(&oa_handler->oa_soap_resources.oa, bay_number, "", SAHPI_UNSPECIFIED_RESOURCE_ID, RES_ABSENT); return SA_OK; } /** * add_oa * @oh_handler: Pointer to openhpi handler * @con: Pointer to the SOAP_CON structure * @bay_number: Bay number of the extracted OA * * Purpose: * Re-discover the newly added OA. * * Detailed Description: NA * * Return values: * SA_OK - on success. * SA_ERR_HPI_INVALID_PARAMS - on wrong parameters * SA_ERR_HPI_INTERNAL_ERROR - on failure. **/ SaErrorT add_oa(struct oh_handler_state *oh_handler, SOAP_CON *con, SaHpiInt32T bay_number) { SaErrorT rv = SA_OK; struct getOaStatus status_request; struct oaStatus status_response; struct getOaInfo request; struct oaInfo response; struct getOaNetworkInfo network_info; struct oaNetworkInfo network_info_response; struct oa_soap_handler *oa_handler = NULL; struct oa_info *temp = NULL; SaHpiResourceIdT resource_id; struct oh_event event; GSList *asserted_sensors = NULL; SaHpiRptEntryT *rpt; if (oh_handler == NULL || con == NULL) { err("Invalid parameters"); return SA_ERR_HPI_INVALID_PARAMS; } oa_handler = (struct oa_soap_handler *) oh_handler->data; /* Get the oa_info structure of the inserted OA */ switch (bay_number) { case 1: temp = oa_handler->oa_1; break; case 2: temp = oa_handler->oa_2; break; } /* If the OA is removed during the first discovery, then * oa_soap_handler will have the information of the removed OA. * But, RPTable will not have the extracted OA information. * If the OA is inserted back and becomes active for any reason, * then we may end up trying to update the same SOAP_CON structure. * * To avoid this situation, check whether the event's SOAP_CON for * the inserted OA is same as the SOAP_CON passed to this function. * If yes, skip the SOAP_CON updating. */ if (temp->event_con != con) { status_request.bayNumber = bay_number; rv = soap_getOaStatus(con, &status_request, &status_response); if (rv != SOAP_OK) { err("get OA status failed"); return SA_ERR_HPI_INTERNAL_ERROR; } /* Update the OA status of the inserted OA */ g_mutex_lock(temp->mutex); temp->oa_status = status_response.oaRole; g_mutex_unlock(temp->mutex); /* Get the IP address of the newly inserted OA */ network_info.bayNumber = bay_number; rv = soap_getOaNetworkInfo(con, &network_info, &network_info_response); if (rv != SOAP_OK) { err("Get OA network info failed"); return SA_ERR_HPI_INTERNAL_ERROR; } /* Copy the server IP address to oa_info structure*/ g_mutex_lock(temp->mutex); memset(temp->server, 0, MAX_URL_LEN); strncpy(temp->server, network_info_response.ipAddress, strlen(network_info_response.ipAddress)); g_mutex_unlock(temp->mutex); } request.bayNumber = bay_number; rv = soap_getOaInfo(con, &request, &response); if (rv != SOAP_OK) { err("Get OA info failed"); return SA_ERR_HPI_INTERNAL_ERROR; } /* If the OA is not yet stable, then getOaInfo response * structure will not have proper information. Abort the * re-discovery and let the OA to stabilize. The re-discovery will be * called again after some time which will allow OA to stabilize */ if (response.serialNumber == NULL) { err("OA %d is not yet stabilized", bay_number); err("Re-discovery is aborted"); err("Re-discovery will happen after sometime"); return SA_ERR_HPI_INTERNAL_ERROR; } /* Build the rpt entry */ rv = build_oa_rpt(oh_handler, bay_number, &resource_id); if (rv != SA_OK) { err("Failed to build OA RPT"); return rv; } /* Update resource_status structure with resource_id, serial_number, * and presence status */ oa_soap_update_resource_status( &oa_handler->oa_soap_resources.oa, bay_number, response.serialNumber, resource_id, RES_PRESENT); /* Update the OA firmware version to RPT entry */ rv = update_oa_info(oh_handler, &response, resource_id); if (rv != SA_OK) { err("Failed to update OA RPT"); return rv; } /* Build the RDRs */ rv = build_oa_rdr(oh_handler, con, bay_number, &response, resource_id); if (rv != SA_OK) { err("Failed to build OA RDR"); /* Free the inventory info from inventory RDR */ rv = free_inventory_info(oh_handler, resource_id); if (rv != SA_OK) { err("Inventory cleanup failed for resource id %d", resource_id); } oh_remove_resource(oh_handler->rptcache, resource_id); /* reset resource_status structure to default values */ oa_soap_update_resource_status( &oa_handler->oa_soap_resources.oa, bay_number, "", SAHPI_UNSPECIFIED_RESOURCE_ID, RES_ABSENT); return rv; } rv = oa_soap_populate_event(oh_handler, resource_id, &event, &asserted_sensors); if (rv != SA_OK) { err("Populating event struct failed"); return rv; } event.event.EventType = SAHPI_ET_HOTSWAP; event.event.EventDataUnion.HotSwapEvent.PreviousHotSwapState = SAHPI_HS_STATE_NOT_PRESENT; event.event.EventDataUnion.HotSwapEvent.HotSwapState = SAHPI_HS_STATE_ACTIVE; /* NOT_PRESENT to ACTIVE state change happened due to * operator action */ event.event.EventDataUnion.HotSwapEvent.CauseOfStateChange = SAHPI_HS_CAUSE_OPERATOR_INIT; /* Push the hotswap event to add the resource to OpenHPI RPTable */ oh_evt_queue_push(oh_handler->eventq, copy_oa_soap_event(&event)); oa_handler->oa_soap_resources.oa.presence[bay_number - 1] = RES_PRESENT; /* Raise the assert sensor events */ if (asserted_sensors) { rpt = oh_get_resource_by_id(oh_handler->rptcache, resource_id); oa_soap_assert_sen_evt(oh_handler, rpt, asserted_sensors); } return SA_OK; } /* add_oa */ /** * re_discover_blade * @oh_handler: Pointer to openhpi handler * @con: Pointer to the SOAP_CON structure * * Purpose: * Re-discover the Server Blades. * * Detailed Description: NA * * Return values: * SA_OK - on success. * SA_ERR_HPI_INVALID_PARAMS - on wrong parameters * SA_ERR_HPI_INTERNAL_ERROR - on failure. **/ SaErrorT re_discover_blade(struct oh_handler_state *oh_handler, SOAP_CON *con) { SaErrorT rv = SA_OK; struct oa_soap_handler *oa_handler; struct getBladeInfo request; struct bladeInfo response; SaHpiInt32T i; enum resource_presence_status state = RES_ABSENT; SaHpiBoolT replace_resource = SAHPI_FALSE; if (oh_handler == NULL || con == NULL) { err("Invalid parameter"); return SA_ERR_HPI_INVALID_PARAMS; } oa_handler = (struct oa_soap_handler *) oh_handler->data; for (i = 1; i <= oa_handler->oa_soap_resources.server.max_bays; i++) { request.bayNumber = i; rv = soap_getBladeInfo(con, &request, &response); if (rv != SOAP_OK) { err("Get blade info failed"); return SA_ERR_HPI_INTERNAL_ERROR; } if (response.presence != PRESENT ) { /* The blade is absent. Is the blade absent in * the presence matrix? */ if (oa_handler->oa_soap_resources.server.presence[i - 1] == RES_ABSENT) continue; else state = RES_ABSENT; } /* The server blade is present. Is the server present in * the presence matrix? */ else if (oa_handler->oa_soap_resources.server.presence[i - 1] == RES_PRESENT) { /* If Serial number is different, remove and * add the blade */ if (strcmp(oa_handler->oa_soap_resources.server. serial_number[i - 1], response.serialNumber) != 0) { replace_resource = SAHPI_TRUE; } else { /* Check and update the hotswap state * of the server blade */ if(response.bladeType == BLADE_TYPE_SERVER) { rv = update_server_hotswap_state( oh_handler, con, i); if (rv != SA_OK) { err("Update server hot swap" " state failed"); return rv; } } /* Check the server sensors state */ rv = oa_soap_re_disc_server_sen(oh_handler, con, i); if (rv != SA_OK) { err("Re-discover server sensors " "failed"); return rv; } continue; } } else state = RES_PRESENT; if (state == RES_ABSENT || replace_resource == SAHPI_TRUE) { /* The server blade is present according OA presence * matrix, but server is removed. Remove the server * resource from RPTable. */ rv = remove_server_blade(oh_handler, i); if (rv != SA_OK) { err("Server blade %d removal failed", i); return rv; } else err("Server in slot %d is removed", i); } if (state == RES_PRESENT || replace_resource == SAHPI_TRUE) { /* The server blade is absent according OA presence * matrix, but server is present. Add the server * resource to RPTable. */ rv = add_server_blade(oh_handler, con, &response); if (rv != SA_OK) { err("Server blade %d add failed", i); return rv; } else err("Server in slot %d is added", i); replace_resource = SAHPI_FALSE; } } /* End of for loop */ return SA_OK; } /** * update_server_hotswap_state * @oh_handler: Pointer to openhpi handler * @con: Pointer to soap client handler * @bay_number: Bay number of the removed blade * * Purpose: * Updates the server blade hot swap state in RPTable * * Detailed Description: NA * * Return values: * SA_OK - on success. * SA_ERR_HPI_INVALID_PARAMS - on wrong parameters * SA_ERR_HPI_INTERNAL_ERROR - on failure. **/ SaErrorT update_server_hotswap_state(struct oh_handler_state *oh_handler, SOAP_CON *con, SaHpiInt32T bay_number) { SaErrorT rv = SA_OK; SaHpiRptEntryT *rpt = NULL; struct oa_soap_hotswap_state *hotswap_state = NULL; struct oh_event event; SaHpiPowerStateT state; SaHpiResourceIdT resource_id; struct oa_soap_handler *oa_handler; if (oh_handler == NULL || con == NULL) { err("Invalid parameters"); return SA_ERR_HPI_INVALID_PARAMS; } oa_handler = (struct oa_soap_handler *) oh_handler->data; resource_id = oa_handler->oa_soap_resources.server.resource_id[bay_number - 1]; /* Get the rpt entry of the resource */ rpt = oh_get_resource_by_id(oh_handler->rptcache, resource_id); if (rpt == NULL) { err("resource RPT is NULL"); return SA_ERR_HPI_INTERNAL_ERROR; } hotswap_state = (struct oa_soap_hotswap_state *) oh_get_resource_data(oh_handler->rptcache, rpt->ResourceId); if (hotswap_state == NULL) { err("Unable to get the resource private data"); return SA_ERR_HPI_INVALID_RESOURCE; } rv = get_server_power_state(con, bay_number, &state); if (rv != SA_OK) { err("Unable to get power state"); return SA_ERR_HPI_INTERNAL_ERROR; } /* Check whether current hotswap state of the server is same as * in hotswap structure in rpt entry */ if ((state == SAHPI_POWER_ON && hotswap_state->currentHsState == SAHPI_HS_STATE_ACTIVE) || (state == SAHPI_POWER_OFF && hotswap_state->currentHsState == SAHPI_HS_STATE_INACTIVE)) { return SA_OK; } /* Hotswap structure in rpt entry is not reflecting the current state * Update the hotswap structure and raise hotswap event */ update_hotswap_event(oh_handler, &event); memcpy(&(event.resource), rpt, sizeof(SaHpiRptEntryT)); event.event.Source = event.resource.ResourceId; switch (state) { case SAHPI_POWER_ON: /* Server got powered on. Update the hotswap * structure. */ hotswap_state->currentHsState = SAHPI_HS_STATE_ACTIVE; event.rdrs = NULL; /* Raise the hotswap events */ event.event.EventDataUnion.HotSwapEvent. PreviousHotSwapState = SAHPI_HS_STATE_INACTIVE; event.event.EventDataUnion.HotSwapEvent.HotSwapState = SAHPI_HS_STATE_INSERTION_PENDING; /* The cause of the state change is unknown */ event.event.EventDataUnion.HotSwapEvent. CauseOfStateChange = SAHPI_HS_CAUSE_UNKNOWN; oh_evt_queue_push(oh_handler->eventq, copy_oa_soap_event(&event)); event.rdrs = NULL; event.event.EventDataUnion.HotSwapEvent. PreviousHotSwapState = SAHPI_HS_STATE_INSERTION_PENDING; event.event.EventDataUnion.HotSwapEvent.HotSwapState = SAHPI_HS_STATE_ACTIVE; /* INSERTION_PENDING to ACTIVE state change happened * due to auto policy of server blade */ event.event.EventDataUnion.HotSwapEvent. CauseOfStateChange = SAHPI_HS_CAUSE_AUTO_POLICY; oh_evt_queue_push(oh_handler->eventq, copy_oa_soap_event(&event)); break; case SAHPI_POWER_OFF: /* Server got powered off. Update the hotswap * structure. */ hotswap_state->currentHsState = SAHPI_HS_STATE_INACTIVE; event.rdrs = NULL; /* Raise the hotswap events */ event.event.EventDataUnion.HotSwapEvent. PreviousHotSwapState = SAHPI_HS_STATE_ACTIVE; event.event.EventDataUnion.HotSwapEvent.HotSwapState = SAHPI_HS_STATE_EXTRACTION_PENDING; /* ACTIVE to EXTRACTION_PENDING state change happened * due power off event. The deactivation can not be * stopped. */ event.event.EventDataUnion.HotSwapEvent. CauseOfStateChange = SAHPI_HS_CAUSE_UNEXPECTED_DEACTIVATION; oh_evt_queue_push(oh_handler->eventq, copy_oa_soap_event(&event)); event.rdrs = NULL; event.event.EventDataUnion.HotSwapEvent. PreviousHotSwapState = SAHPI_HS_STATE_EXTRACTION_PENDING; event.event.EventDataUnion.HotSwapEvent.HotSwapState = SAHPI_HS_STATE_INACTIVE; /* EXTRACTION_PENDING to INACTIVE state change happened * due to auto policy of server blade */ event.event.EventDataUnion.HotSwapEvent. CauseOfStateChange = SAHPI_HS_CAUSE_AUTO_POLICY; oh_evt_queue_push(oh_handler->eventq, copy_oa_soap_event(&event)); break; default: err("unknown power status"); return SA_ERR_HPI_INTERNAL_ERROR; } return SA_OK; } /** * remove_server_blade * @oh_handler: Pointer to openhpi handler * @bay_number: Bay number of the removed blade * Purpose: * Remove the Server Blade from the RPTable * * Detailed Description: NA * * Return values: * SA_OK - on success. * SA_ERR_HPI_INVALID_PARAMS - on wrong parameters * SA_ERR_HPI_INTERNAL_ERROR - on failure. **/ SaErrorT remove_server_blade(struct oh_handler_state *oh_handler, SaHpiInt32T bay_number) { SaErrorT rv = SA_OK; struct oa_soap_handler *oa_handler; struct oa_soap_hotswap_state *hotswap_state; SaHpiRptEntryT *rpt = NULL; struct oh_event event; SaHpiResourceIdT resource_id; if (oh_handler == NULL) { err("Invalid parameters"); return SA_ERR_HPI_INVALID_PARAMS; } oa_handler = (struct oa_soap_handler *) oh_handler->data; update_hotswap_event(oh_handler, &event); resource_id = oa_handler->oa_soap_resources.server.resource_id[bay_number - 1]; /* Get the rpt entry of the resource */ rpt = oh_get_resource_by_id(oh_handler->rptcache, resource_id); if (rpt == NULL) { err("resource RPT is NULL"); return SA_ERR_HPI_INTERNAL_ERROR; } memcpy(&(event.resource), rpt, sizeof(SaHpiRptEntryT)); event.event.Source = event.resource.ResourceId; event.event.Severity = event.resource.ResourceSeverity; if (!(rpt->ResourceCapabilities & SAHPI_CAPABILITY_MANAGED_HOTSWAP)) { /* Simple hotswap */ event.event.EventDataUnion.HotSwapEvent.PreviousHotSwapState = SAHPI_HS_STATE_ACTIVE; } else { /* Managed hotswap */ hotswap_state = (struct oa_soap_hotswap_state *) oh_get_resource_data(oh_handler->rptcache, event.resource.ResourceId); if (hotswap_state == NULL) { err("Failed to get hotswap state of server blade"); event.event.EventDataUnion.HotSwapEvent. PreviousHotSwapState = SAHPI_HS_STATE_INACTIVE; } else { event.event.EventDataUnion.HotSwapEvent. PreviousHotSwapState = hotswap_state->currentHsState; } } event.event.EventDataUnion.HotSwapEvent.HotSwapState = SAHPI_HS_STATE_NOT_PRESENT; if (event.event.EventDataUnion.HotSwapEvent.PreviousHotSwapState == SAHPI_HS_STATE_INACTIVE) { /* INACTIVE to NOT_PRESENT state change happened due to * operator action */ event.event.EventDataUnion.HotSwapEvent.CauseOfStateChange = SAHPI_HS_CAUSE_OPERATOR_INIT; } else { /* This state change happened due to a surprise extraction */ event.event.EventDataUnion.HotSwapEvent.CauseOfStateChange = SAHPI_HS_CAUSE_SURPRISE_EXTRACTION; } /* Push the hotswap event to remove the resource from OpenHPI RPTable */ oh_evt_queue_push(oh_handler->eventq, copy_oa_soap_event(&event)); /* Free the inventory info from inventory RDR */ rv = free_inventory_info(oh_handler, rpt->ResourceId); if (rv != SA_OK) { err("Inventory cleanup failed for resource id %d", rpt->ResourceId); } /* Remove the resource from plugin RPTable */ rv = oh_remove_resource(oh_handler->rptcache, event.resource.ResourceId); /* reset resource_status structure to default values */ oa_soap_update_resource_status( &oa_handler->oa_soap_resources.server, bay_number, "", SAHPI_UNSPECIFIED_RESOURCE_ID, RES_ABSENT); return SA_OK; } /** * add_server_blade * @oh_handler: Pointer to openhpi handler * @con: Pointer to the SOAP_CON structure * @info: Pointer to the get blade info response structure * * Purpose: * Remove the Server Blade from the RPTable * * Detailed Description: NA * * Return values: * SA_OK - on success. * SA_ERR_HPI_INVALID_PARAMS - on wrong parameters * SA_ERR_HPI_INTERNAL_ERROR - on failure. **/ SaErrorT add_server_blade(struct oh_handler_state *oh_handler, SOAP_CON *con, struct bladeInfo *info) { SaErrorT rv = SA_OK; struct oh_event event; SaHpiPowerStateT state; SaHpiInt32T bay_number; struct getBladeInfo request; struct bladeInfo response; struct oa_soap_handler *oa_handler; SaHpiResourceIdT resource_id; SaHpiRptEntryT *rpt; GSList *asserted_sensors = NULL; char blade_name[MAX_NAME_LEN]; if (oh_handler == NULL || info == NULL || con == NULL) { err("Invalid parameters"); return SA_ERR_HPI_INVALID_PARAMS; } oa_handler = (struct oa_soap_handler *) oh_handler->data; update_hotswap_event(oh_handler, &event); bay_number = info->bayNumber; /* Get blade info to obtain serial_number */ request.bayNumber = bay_number; rv = soap_getBladeInfo(con, &request, &response); if (rv != SOAP_OK) { err("Get blade info failed"); return SA_ERR_HPI_INTERNAL_ERROR; } /* Copy the blade name from response for future processing */ convert_lower_to_upper(response.name, strlen(response.name), blade_name, MAX_NAME_LEN); /* Build the server RPR entry */ rv = build_discovered_server_rpt(oh_handler, con, info, &resource_id); if (rv != SA_OK) { err("build inserted server rpt failed"); return rv; } /* Update resource_status structure with resource_id, serial_number, * and presence status */ oa_soap_update_resource_status( &oa_handler->oa_soap_resources.server, bay_number, response.serialNumber, resource_id, RES_PRESENT); /* Build the server RDR */ rv = build_server_rdr(oh_handler, con, bay_number, resource_id, blade_name); if (rv != SA_OK) { err("build inserted server RDR failed"); /* Free the inventory info from inventory RDR */ rv = free_inventory_info(oh_handler, resource_id); if (rv != SA_OK) { err("Inventory cleanup failed for resource id %d", resource_id); } oh_remove_resource(oh_handler->rptcache, resource_id); /* reset resource_status structure to default values */ oa_soap_update_resource_status( &oa_handler->oa_soap_resources.server, bay_number, "", SAHPI_UNSPECIFIED_RESOURCE_ID, RES_ABSENT); return rv; } rv = oa_soap_populate_event(oh_handler, resource_id, &event, &asserted_sensors); if (rv != SA_OK) { err("Populating event struct failed"); return SA_ERR_HPI_INTERNAL_ERROR; } rpt = oh_get_resource_by_id (oh_handler->rptcache, resource_id); if (rpt == NULL) { err("INVALID RESOURCE"); return SA_ERR_HPI_INVALID_RESOURCE; } /* For blades that don't support managed hotswap, send simple hotswap event */ if (!(rpt->ResourceCapabilities & SAHPI_CAPABILITY_MANAGED_HOTSWAP)) { event.event.EventType = SAHPI_ET_HOTSWAP; event.event.EventDataUnion.HotSwapEvent.PreviousHotSwapState = SAHPI_HS_STATE_NOT_PRESENT; event.event.EventDataUnion.HotSwapEvent.HotSwapState = SAHPI_HS_STATE_ACTIVE; event.event.EventDataUnion.HotSwapEvent.CauseOfStateChange = SAHPI_HS_CAUSE_OPERATOR_INIT; oh_evt_queue_push(oh_handler->eventq, copy_oa_soap_event(&event)); /* Raise the assert sensor events */ if (asserted_sensors) oa_soap_assert_sen_evt(oh_handler, rpt, asserted_sensors); return(SA_OK); } /* Raise the hotswap event for the inserted server blade */ event.event.EventType = SAHPI_ET_HOTSWAP; event.event.EventDataUnion.HotSwapEvent.PreviousHotSwapState = SAHPI_HS_STATE_NOT_PRESENT; event.event.EventDataUnion.HotSwapEvent.HotSwapState = SAHPI_HS_STATE_INSERTION_PENDING; /* NOT_PRESENT to INSERTION_PENDING state change happened due * to operator action */ event.event.EventDataUnion.HotSwapEvent.CauseOfStateChange = SAHPI_HS_CAUSE_OPERATOR_INIT; oh_evt_queue_push(oh_handler->eventq, copy_oa_soap_event(&event)); event.rdrs = NULL; event.event.EventDataUnion.HotSwapEvent.PreviousHotSwapState = SAHPI_HS_STATE_INSERTION_PENDING; event.event.EventDataUnion.HotSwapEvent.HotSwapState = SAHPI_HS_STATE_ACTIVE; /* INSERTION_PENDING to ACTIVE state change happened * due to auto policy of server blade */ event.event.EventDataUnion.HotSwapEvent.CauseOfStateChange = SAHPI_HS_CAUSE_AUTO_POLICY; oh_evt_queue_push(oh_handler->eventq, copy_oa_soap_event(&event)); rv = get_server_power_state(con, bay_number, &state); if (rv != SA_OK) { err("Unable to get power status"); return SA_ERR_HPI_INTERNAL_ERROR; } /* Check the power state of the server. If the power state is off, * may be server got powered off after inserting. Inserting the * server makes to power on automatically. Hence raise the hotswap * events for power off. */ switch (state) { case SAHPI_POWER_ON: break; case SAHPI_POWER_OFF: event.rdrs = NULL; event.event.EventDataUnion.HotSwapEvent. PreviousHotSwapState = SAHPI_HS_STATE_ACTIVE; event.event.EventDataUnion.HotSwapEvent.HotSwapState = SAHPI_HS_STATE_EXTRACTION_PENDING; /* ACTIVE to EXTRACTION_PENDING state change happened * due power off event. The deactivation can not be * stopped. */ event.event.EventDataUnion.HotSwapEvent. CauseOfStateChange = SAHPI_HS_CAUSE_UNEXPECTED_DEACTIVATION; oh_evt_queue_push(oh_handler->eventq, copy_oa_soap_event(&event)); event.rdrs = NULL; event.event.EventDataUnion.HotSwapEvent. PreviousHotSwapState = SAHPI_HS_STATE_EXTRACTION_PENDING; event.event.EventDataUnion.HotSwapEvent.HotSwapState = SAHPI_HS_STATE_INACTIVE; /* EXTRACTION_PENDING to INACTIVE state change happened * due to auto policy of server blade */ event.event.EventDataUnion.HotSwapEvent. CauseOfStateChange = SAHPI_HS_CAUSE_AUTO_POLICY; oh_evt_queue_push(oh_handler->eventq, copy_oa_soap_event(&event)); break; default: err("unknown power status"); return SA_ERR_HPI_INTERNAL_ERROR; } /* Raise the assert sensor events */ if (asserted_sensors) oa_soap_assert_sen_evt(oh_handler, rpt, asserted_sensors); return SA_OK; } /** * re_discover_interconnect * @oh_handler: Pointer to openhpi handler * @con: Pointer to the SOAP_CON structure * * Purpose: * Re-discover the interconnects. * * Detailed Description: NA * * Return values: * SA_OK - on success. * SA_ERR_HPI_INVALID_PARAMS - on wrong parameters * SA_ERR_HPI_INTERNAL_ERROR - on failure. **/ SaErrorT re_discover_interconnect(struct oh_handler_state *oh_handler, SOAP_CON *con) { SaErrorT rv = SA_OK; struct oa_soap_handler *oa_handler; struct getInterconnectTrayStatus request; struct interconnectTrayStatus response; struct getInterconnectTrayInfo info_request; struct interconnectTrayInfo info_response; SaHpiInt32T i; enum resource_presence_status state = RES_ABSENT; SaHpiBoolT replace_resource = SAHPI_FALSE; if (oh_handler == NULL || con == NULL) { err("Invalid parameter"); return SA_ERR_HPI_INVALID_PARAMS; } oa_handler = (struct oa_soap_handler *) oh_handler->data; for (i = 1; i <= oa_handler->oa_soap_resources.interconnect.max_bays; i++) { request.bayNumber = i; rv = soap_getInterconnectTrayStatus(con, &request, &response); if (rv != SOAP_OK) { err("Get interconnect tray status failed"); return SA_ERR_HPI_INTERNAL_ERROR; } if (response.presence != PRESENT) { /* The interconnect is absent. Is the interconnect * absent in the presence matrix? */ if (oa_handler-> oa_soap_resources.interconnect.presence[i - 1] == RES_ABSENT) continue; else state = RES_ABSENT; } /* The interconnect is present. Is the interconnect present * in the presence matrix? */ else if (oa_handler-> oa_soap_resources.interconnect.presence[i - 1] == RES_PRESENT) { info_request.bayNumber = i; rv = soap_getInterconnectTrayInfo(con, &info_request, &info_response); if (rv != SOAP_OK) { err("Get interconnect tray status failed"); return SA_ERR_HPI_INTERNAL_ERROR; } /* If serial number is different, remove and add the * interconnect */ if (strcmp(oa_handler->oa_soap_resources.interconnect. serial_number[i - 1], info_response.serialNumber) != 0) { replace_resource = SAHPI_TRUE; } else { /* Check and update the hotswap state of the * server blade */ rv = update_interconnect_hotswap_state( oh_handler, con, i); if (rv != SA_OK) { err("update interconnect hot swap" " state failed"); return rv; } /* Check the interconnect sensors state */ rv = oa_soap_re_disc_interconct_sen( oh_handler, con, i); if (rv != SA_OK) { err("Re-discover interconnect sensors " "failed"); return rv; } continue; } } else state = RES_PRESENT; if (state == RES_ABSENT || replace_resource == SAHPI_TRUE) { /* The interconnect is present according OA presence * matrix, but interconnect is removed. Remove the * interconnect resource from RPTable. */ rv = remove_interconnect(oh_handler, i); if (rv != SA_OK) { err("Interconnect blade %d removal failed", i); return rv; } else err("Interconnect blade %d removed", i); } if (state == RES_PRESENT || replace_resource == SAHPI_TRUE) { /* The interconnect is absent according OA presence * matrix, but interconnect is added. Add the * interconnect resource to RPTable. */ rv = add_interconnect(oh_handler, con, i); if (rv != SA_OK) { err("Interconnect blade %d add failed", i); return rv; } else err("Interconnect blade %d added", i); } } return SA_OK; } /** * update_interconnect_hotswap_state * @oh_handler: Pointer to openhpi handler * @con: Pointer to the SOAP_CON structure * @bay_number: Bay number of the removed blade * * Purpose: * Updates the interconnect hot swap state in RPTable * * Detailed Description: NA * * Return values: * SA_OK - on success. * SA_ERR_HPI_INVALID_PARAMS - on wrong parameters * SA_ERR_HPI_INTERNAL_ERROR - on failure. **/ SaErrorT update_interconnect_hotswap_state(struct oh_handler_state *oh_handler, SOAP_CON *con, SaHpiInt32T bay_number) { SaErrorT rv = SA_OK; SaHpiRptEntryT *rpt = NULL; struct oa_soap_hotswap_state *hotswap_state = NULL; struct oh_event event; SaHpiPowerStateT state; SaHpiResourceIdT resource_id; struct oa_soap_handler *oa_handler; if (oh_handler == NULL || con == NULL) { err("Invalid parameters"); return SA_ERR_HPI_INVALID_PARAMS; } oa_handler = (struct oa_soap_handler *) oh_handler->data; resource_id = oa_handler-> oa_soap_resources.interconnect.resource_id[bay_number - 1]; /* Get the rpt entry of the resource */ rpt = oh_get_resource_by_id(oh_handler->rptcache, resource_id); if (rpt == NULL) { err("resource RPT is NULL"); return SA_ERR_HPI_INTERNAL_ERROR; } hotswap_state = (struct oa_soap_hotswap_state *) oh_get_resource_data(oh_handler->rptcache, rpt->ResourceId); if (hotswap_state == NULL) { err("Unable to get the resource private data"); return SA_ERR_HPI_INVALID_RESOURCE; } rv = get_interconnect_power_state(con, bay_number, &state); if (rv != SA_OK) { err("Unable to get power status"); return SA_ERR_HPI_INTERNAL_ERROR; } /* Check whether current hotswap state of the interconnect is same as * in hotswap structure in rpt entry */ if ((state == SAHPI_POWER_ON && hotswap_state->currentHsState == SAHPI_HS_STATE_ACTIVE) || (state == SAHPI_POWER_OFF && hotswap_state->currentHsState == SAHPI_HS_STATE_INACTIVE)) { return SA_OK; } update_hotswap_event(oh_handler, &event); memcpy(&(event.resource), rpt, sizeof(SaHpiRptEntryT)); event.event.Source = event.resource.ResourceId; switch (state) { case SAHPI_POWER_ON: /* Interconnect got powered on. Update the hotswap * structure. */ hotswap_state->currentHsState = SAHPI_HS_STATE_ACTIVE; event.rdrs = NULL; /* Raise the hotswap events */ event.event.EventDataUnion.HotSwapEvent. PreviousHotSwapState = SAHPI_HS_STATE_INACTIVE; event.event.EventDataUnion.HotSwapEvent.HotSwapState = SAHPI_HS_STATE_INSERTION_PENDING; /* The cause of the state change is unknown */ event.event.EventDataUnion.HotSwapEvent. CauseOfStateChange = SAHPI_HS_CAUSE_UNKNOWN; oh_evt_queue_push(oh_handler->eventq, copy_oa_soap_event(&event)); event.rdrs = NULL; event.event.EventDataUnion.HotSwapEvent. PreviousHotSwapState = SAHPI_HS_STATE_INSERTION_PENDING; event.event.EventDataUnion.HotSwapEvent.HotSwapState = SAHPI_HS_STATE_ACTIVE; /* INSERTION_PENDING to ACTIVE state change happened * due to auto policy of server blade */ event.event.EventDataUnion.HotSwapEvent. CauseOfStateChange = SAHPI_HS_CAUSE_AUTO_POLICY; oh_evt_queue_push(oh_handler->eventq, copy_oa_soap_event(&event)); break; case SAHPI_POWER_OFF: /* Interconnect got powered off. Update the hotswap * structure. */ hotswap_state->currentHsState = SAHPI_HS_STATE_INACTIVE; event.rdrs = NULL; /* Raise the hotswap events */ event.event.EventDataUnion.HotSwapEvent. PreviousHotSwapState = SAHPI_HS_STATE_ACTIVE; event.event.EventDataUnion.HotSwapEvent.HotSwapState = SAHPI_HS_STATE_EXTRACTION_PENDING; /* ACTIVE to EXTRACTION_PENDING state change happened * due power off event. * The deactivation can not be stopped. */ event.event.EventDataUnion.HotSwapEvent. CauseOfStateChange = SAHPI_HS_CAUSE_UNEXPECTED_DEACTIVATION; oh_evt_queue_push(oh_handler->eventq, copy_oa_soap_event(&event)); event.rdrs = NULL; event.event.EventDataUnion.HotSwapEvent. PreviousHotSwapState = SAHPI_HS_STATE_EXTRACTION_PENDING; event.event.EventDataUnion.HotSwapEvent.HotSwapState = SAHPI_HS_STATE_INACTIVE; /* EXTRACTION_PENDING to INACTIVE state change happened * due to auto policy of server blade */ event.event.EventDataUnion.HotSwapEvent. CauseOfStateChange = SAHPI_HS_CAUSE_AUTO_POLICY; oh_evt_queue_push(oh_handler->eventq, copy_oa_soap_event(&event)); break; default: err("unknown power status"); return SA_ERR_HPI_INTERNAL_ERROR; } return SA_OK; } /** * remove_interconnect * @oh_handler: Pointer to openhpi handler * @bay_number: Bay number of the removed interconnect * * Purpose: * Removes the interconnect. * * Detailed Description: NA * * Return values: * SA_OK - on success. * SA_ERR_HPI_INVALID_PARAMS - on wrong parameters * SA_ERR_HPI_INTERNAL_ERROR - on failure. **/ SaErrorT remove_interconnect(struct oh_handler_state *oh_handler, SaHpiInt32T bay_number) { SaErrorT rv = SA_OK; struct oa_soap_handler *oa_handler; struct oh_event event; struct oa_soap_hotswap_state *hotswap_state; SaHpiRptEntryT *rpt = NULL; SaHpiResourceIdT resource_id; if (oh_handler == NULL) { err("Invalid parameters"); return SA_ERR_HPI_INVALID_PARAMS; } oa_handler = (struct oa_soap_handler *) oh_handler->data; update_hotswap_event(oh_handler, &event); resource_id = oa_handler-> oa_soap_resources.interconnect.resource_id[bay_number - 1]; /* Get the rpt entry of the resource */ rpt = oh_get_resource_by_id(oh_handler->rptcache, resource_id); if (rpt == NULL) { err("resource RPT is NULL"); return SA_ERR_HPI_INTERNAL_ERROR; } memcpy(&(event.resource), rpt, sizeof(SaHpiRptEntryT)); event.event.Source = event.resource.ResourceId; event.event.Severity = event.resource.ResourceSeverity; hotswap_state = (struct oa_soap_hotswap_state *) oh_get_resource_data(oh_handler->rptcache, event.resource.ResourceId); if (hotswap_state == NULL) { err("Failed to get hotswap state"); event.event.EventDataUnion.HotSwapEvent.PreviousHotSwapState = SAHPI_HS_STATE_INACTIVE; } else event.event.EventDataUnion.HotSwapEvent.PreviousHotSwapState = hotswap_state->currentHsState; event.event.EventDataUnion.HotSwapEvent.HotSwapState = SAHPI_HS_STATE_NOT_PRESENT; if (hotswap_state->currentHsState == SAHPI_HS_STATE_INACTIVE) { /* INACTIVE to NOT_PRESENT state change happened due to * operator action */ event.event.EventDataUnion.HotSwapEvent.CauseOfStateChange = SAHPI_HS_CAUSE_OPERATOR_INIT; } else { /* This state change happened due to surprise extraction */ event.event.EventDataUnion.HotSwapEvent.CauseOfStateChange = SAHPI_HS_CAUSE_SURPRISE_EXTRACTION; } /* Push the hotswap event to remove the resource from OpenHPI RPTable */ oh_evt_queue_push(oh_handler->eventq, copy_oa_soap_event(&event)); /* Free the inventory info from inventory RDR */ rv = free_inventory_info(oh_handler, event.resource.ResourceId); if (rv != SA_OK) { err("Inventory cleanup failed for resource id %d", rpt->ResourceId); } /* Remove the resource from plugin RPTable */ rv = oh_remove_resource(oh_handler->rptcache, event.resource.ResourceId); /* reset resource_status structure to default values */ oa_soap_update_resource_status( &oa_handler->oa_soap_resources.interconnect, bay_number, "", SAHPI_UNSPECIFIED_RESOURCE_ID, RES_ABSENT); return SA_OK; } /** * add_interconnect * @oh_handler: Pointer to openhpi handler * @con: Pointer to the SOAP_CON structure * @bay_number: Bay number of the removed interconnect * * Purpose: * Adds the interconnect. * * Detailed Description: NA * * Return values: * SA_OK - on success. * SA_ERR_HPI_INVALID_PARAMS - on wrong parameters * SA_ERR_HPI_INTERNAL_ERROR - on failure. **/ SaErrorT add_interconnect(struct oh_handler_state *oh_handler, SOAP_CON *con, SaHpiInt32T bay_number) { SaErrorT rv = SA_OK; struct oa_soap_handler *oa_handler; struct getInterconnectTrayInfo info; struct interconnectTrayInfo response; struct oh_event event; SaHpiPowerStateT state; SaHpiResourceIdT resource_id; GSList *asserted_sensors = NULL; SaHpiRptEntryT *rpt; if (oh_handler == NULL || con == NULL) { err("Invalid parameters"); return SA_ERR_HPI_INVALID_PARAMS; } oa_handler = (struct oa_soap_handler *) oh_handler->data; info.bayNumber = bay_number; rv = soap_getInterconnectTrayInfo(con, &info, &response); if (rv != SOAP_OK) { err("Get Interconnect tray info failed"); return SA_ERR_HPI_INTERNAL_ERROR; } /* Build the rpt entry */ rv = build_interconnect_rpt(oh_handler, con, response.name, bay_number, &resource_id, FALSE); if (rv != SA_OK) { err("Failed to get interconnect inventory RPT"); return rv; } /* Update resource_status structure with resource_id, serial_number, * and presence status */ oa_soap_update_resource_status( &oa_handler->oa_soap_resources.interconnect, bay_number, response.serialNumber, resource_id, RES_PRESENT); /* Build the RDRs */ rv = build_interconnect_rdr(oh_handler, con, bay_number, resource_id); if (rv != SA_OK) { err("Failed to get interconnect inventory RDR"); /* Free the inventory info from inventory RDR */ rv = free_inventory_info(oh_handler, resource_id); if (rv != SA_OK) { err("Inventory cleanup failed for resource id %d", resource_id); } oh_remove_resource(oh_handler->rptcache, resource_id); /* reset resource_status structure to default values */ oa_soap_update_resource_status( &oa_handler->oa_soap_resources.interconnect, bay_number, "", SAHPI_UNSPECIFIED_RESOURCE_ID, RES_ABSENT); return rv; } rv = oa_soap_populate_event(oh_handler, resource_id, &event, &asserted_sensors); if (rv != SA_OK) { err("Populating event struct failed"); return rv; } /* Raise the hotswap event for the inserted interconnect blade */ event.event.EventType = SAHPI_ET_HOTSWAP; event.event.EventDataUnion.HotSwapEvent.PreviousHotSwapState = SAHPI_HS_STATE_NOT_PRESENT; event.event.EventDataUnion.HotSwapEvent.HotSwapState = SAHPI_HS_STATE_INSERTION_PENDING; /* NOT_PRESENT to INSERTION_PENDING state change happened due * to operator action */ event.event.EventDataUnion.HotSwapEvent.CauseOfStateChange = SAHPI_HS_CAUSE_OPERATOR_INIT; oh_evt_queue_push(oh_handler->eventq, copy_oa_soap_event(&event)); event.rdrs = NULL; event.event.EventDataUnion.HotSwapEvent.PreviousHotSwapState = SAHPI_HS_STATE_INSERTION_PENDING; event.event.EventDataUnion.HotSwapEvent.HotSwapState = SAHPI_HS_STATE_ACTIVE; /* INSERTION_PENDING to ACTIVE state change happened * due to auto policy of server blade */ event.event.EventDataUnion.HotSwapEvent.CauseOfStateChange = SAHPI_HS_CAUSE_AUTO_POLICY; oh_evt_queue_push(oh_handler->eventq, copy_oa_soap_event(&event)); /* Check the power state of the interconnect. If the power state is * off, may be interconnect got powered off after inserting. * Inserting the interconnect makes to power on automatically. * Hence raise the hotswap events for power off. */ rv = get_interconnect_power_state(con, bay_number, &state); if (rv != SA_OK) { err("Unable to get power status"); return SA_ERR_HPI_INTERNAL_ERROR; } switch (state) { case SAHPI_POWER_ON: break; case SAHPI_POWER_OFF: event.event.EventDataUnion.HotSwapEvent. PreviousHotSwapState = SAHPI_HS_STATE_ACTIVE; event.event.EventDataUnion.HotSwapEvent.HotSwapState = SAHPI_HS_STATE_EXTRACTION_PENDING; /* ACTIVE to EXTRACTION_PENDING state change happened * due power off event. * The deactivation can not be stopped. */ event.event.EventDataUnion.HotSwapEvent. CauseOfStateChange = SAHPI_HS_CAUSE_UNEXPECTED_DEACTIVATION; oh_evt_queue_push(oh_handler->eventq, copy_oa_soap_event(&event)); event.rdrs = NULL; event.event.EventDataUnion.HotSwapEvent. PreviousHotSwapState = SAHPI_HS_STATE_EXTRACTION_PENDING; event.event.EventDataUnion.HotSwapEvent.HotSwapState = SAHPI_HS_STATE_INACTIVE; /* EXTRACTION_PENDING to INACTIVE state change happened * due to auto policy of server blade */ event.event.EventDataUnion.HotSwapEvent. CauseOfStateChange = SAHPI_HS_CAUSE_AUTO_POLICY; oh_evt_queue_push(oh_handler->eventq, copy_oa_soap_event(&event)); break; default: err("unknown power status"); return SA_ERR_HPI_INTERNAL_ERROR; } /* Raise the assert sensor events */ if (asserted_sensors) { rpt = oh_get_resource_by_id(oh_handler->rptcache, resource_id); oa_soap_assert_sen_evt(oh_handler, rpt, asserted_sensors); } return SA_OK; } /** * re_discover_fan * @oh_handler: Pointer to openhpi handler * @con: Pointer to the SOAP_CON structure * * Purpose: * Re-discover the Fans. * * Detailed Description: NA * * Return values: * SA_OK - on success. * SA_ERR_HPI_INVALID_PARAMS - on wrong parameters * SA_ERR_HPI_INTERNAL_ERROR - on failure. **/ SaErrorT re_discover_fan(struct oh_handler_state *oh_handler, SOAP_CON *con) { SaErrorT rv = SA_OK; struct oa_soap_handler *oa_handler; struct getFanInfo request; struct fanInfo response; SaHpiInt32T i; enum resource_presence_status state = RES_ABSENT; if (oh_handler == NULL || con == NULL) { err("Invalid parameter"); return SA_ERR_HPI_INVALID_PARAMS; } oa_handler = (struct oa_soap_handler *) oh_handler->data; for (i = 1; i <= oa_handler->oa_soap_resources.fan.max_bays; i++) { request.bayNumber = i; rv = soap_getFanInfo(con, &request, &response); if (rv != SOAP_OK) { err("Get fan info failed"); return SA_ERR_HPI_INTERNAL_ERROR; } if (response.presence != PRESENT) { /* The Fan is absent, check Fan is absent in presence * matrix */ if (oa_handler->oa_soap_resources.fan.presence[i - 1] == RES_ABSENT) continue; else state = RES_ABSENT; } else { /* The Fan is present, check Fan is present in presence * matrix */ if (oa_handler->oa_soap_resources.fan.presence[i - 1] == RES_PRESENT) { /* Check the fan sensors state */ oa_soap_proc_fan_status(oh_handler, &response); continue; } else state = RES_PRESENT; } if (state == RES_ABSENT) { /* The Fan is present according to Fan presence matrix, * but Fan is removed. Remove the Fan resource from * RPTable. */ rv = remove_fan(oh_handler, i); if (rv != SA_OK) { err("Fan %d removal failed", i); return rv; } else err("Fan %d removed", i); } else if (state == RES_PRESENT) { /* The Fan is absent according Fan presence matrix, * but Fan is present. Add the Fan resource from * RPTable. */ rv = add_fan(oh_handler, con, &response); if (rv != SA_OK) { err("Fan %d add failed", i); return rv; } else err("Fan %d added", i); } } return SA_OK; } /** * remove_fan * @oh_handler: Pointer to openhpi handler * @bay_number: Bay number of the fan * * Purpose: * Remove the Fan from OpenHPI infrastructure. * * Detailed Description: NA * * Return values: * SA_OK - on success. * SA_ERR_HPI_INVALID_PARAMS - on wrong parameters * SA_ERR_HPI_INTERNAL_ERROR - on failure. **/ SaErrorT remove_fan(struct oh_handler_state *oh_handler, SaHpiInt32T bay_number) { SaErrorT rv = SA_OK; struct oa_soap_handler *oa_handler; SaHpiRptEntryT *rpt = NULL; struct oh_event event; SaHpiResourceIdT resource_id; if (oh_handler == NULL) { err("Invalid parameters"); return SA_ERR_HPI_INVALID_PARAMS; } oa_handler = (struct oa_soap_handler *) oh_handler->data; update_hotswap_event(oh_handler, &event); resource_id = oa_handler->oa_soap_resources.fan.resource_id[bay_number - 1]; /* Get the rpt entry of the resource */ rpt = oh_get_resource_by_id(oh_handler->rptcache, resource_id); if (rpt == NULL) { err("resource RPT is NULL"); return SA_ERR_HPI_INTERNAL_ERROR; } memcpy(&(event.resource), rpt, sizeof(SaHpiRptEntryT)); event.rdrs = NULL; event.event.Source = event.resource.ResourceId; event.event.Severity = event.resource.ResourceSeverity; event.event.EventDataUnion.HotSwapEvent.PreviousHotSwapState = SAHPI_HS_STATE_ACTIVE; event.event.EventDataUnion.HotSwapEvent.HotSwapState = SAHPI_HS_STATE_NOT_PRESENT; /* This state change happened due to surprise extraction */ event.event.EventDataUnion.HotSwapEvent.CauseOfStateChange = SAHPI_HS_CAUSE_SURPRISE_EXTRACTION; /* Push the hotswap event to remove the resource from OpenHPI RPTable */ oh_evt_queue_push(oh_handler->eventq, copy_oa_soap_event(&event)); /* Free the inventory info from inventory RDR */ rv = free_inventory_info(oh_handler, event.resource.ResourceId); if (rv != SA_OK) { err("Inventory cleanup failed for resource id %d", rpt->ResourceId); } /* Remove the resource from plugin RPTable */ rv = oh_remove_resource(oh_handler->rptcache, event.resource.ResourceId); /* reset resource_status structure to default values */ oa_soap_update_resource_status( &oa_handler->oa_soap_resources.fan, bay_number, NULL, SAHPI_UNSPECIFIED_RESOURCE_ID, RES_ABSENT); return SA_OK; } /** * add_fan * @oh_handler: Pointer to openhpi handler * @con: Pointer to SOAP_CON structure * @info: Pointer to the get fan info response structure * * Purpose: * Add the fan information to OpenHPI infrastructure. * * Detailed Description: NA * * Return values: * SA_OK - on success. * SA_ERR_HPI_INVALID_PARAMS - on wrong parameters * SA_ERR_HPI_INTERNAL_ERROR - on failure. **/ SaErrorT add_fan(struct oh_handler_state *oh_handler, SOAP_CON *con, struct fanInfo *info) { SaErrorT rv = SA_OK; struct oa_soap_handler *oa_handler = NULL; struct oh_event event; SaHpiResourceIdT resource_id; GSList *asserted_sensors = NULL; SaHpiRptEntryT *rpt; if (oh_handler == NULL || con == NULL || info == NULL) { err("Invalid parameters"); return SA_ERR_HPI_INVALID_PARAMS; } oa_handler = (struct oa_soap_handler *) oh_handler->data; /* Build the rpt entry */ rv = oa_soap_build_fan_rpt(oh_handler, info->bayNumber, &resource_id); if (rv != SA_OK) { err("Failed to populate fan RPT"); return rv; } /* Update resource_status structure with resource_id, serial_number, * and presence status. Fan doesn't have serial number, so pass in * a null string. */ oa_soap_update_resource_status( &oa_handler->oa_soap_resources.fan, info->bayNumber, NULL, resource_id, RES_PRESENT); /* Build the RDRs */ rv = oa_soap_build_fan_rdr(oh_handler, con, info, resource_id); if (rv != SA_OK) { err("Failed to populate fan RDR"); /* Free the inventory info from inventory RDR */ rv = free_inventory_info(oh_handler, resource_id); if (rv != SA_OK) { err("Inventory cleanup failed for resource id %d", resource_id); } oh_remove_resource(oh_handler->rptcache, resource_id); /* reset resource_status structure to default values */ oa_soap_update_resource_status( &oa_handler->oa_soap_resources.fan, info->bayNumber, NULL, SAHPI_UNSPECIFIED_RESOURCE_ID, RES_ABSENT); return SA_ERR_HPI_INTERNAL_ERROR; } rv = oa_soap_populate_event(oh_handler, resource_id, &event, &asserted_sensors); if (rv != SA_OK) { err("Populating event struct failed"); return rv; } event.event.EventType = SAHPI_ET_HOTSWAP; event.event.EventDataUnion.HotSwapEvent.PreviousHotSwapState = SAHPI_HS_STATE_NOT_PRESENT; event.event.EventDataUnion.HotSwapEvent.HotSwapState = SAHPI_HS_STATE_ACTIVE; /* NOT_PRESENT to ACTIVE state change happened due to operator action */ event.event.EventDataUnion.HotSwapEvent.CauseOfStateChange = SAHPI_HS_CAUSE_OPERATOR_INIT; /* Push the hotswap event to add the resource to OpenHPI RPTable */ oh_evt_queue_push(oh_handler->eventq, copy_oa_soap_event(&event)); /* Raise the assert sensor events */ if (asserted_sensors) { rpt = oh_get_resource_by_id(oh_handler->rptcache, resource_id); oa_soap_assert_sen_evt(oh_handler, rpt, asserted_sensors); } return SA_OK; } /** * re_discover_ps_unit * @oh_handler: Pointer to openhpi handler * @con: Pointer to the SOAP_CON structure * * Purpose: * Re-discover the Power Supply Units. * * Detailed Description: NA * * Return values: * SA_OK - on success. * SA_ERR_HPI_INVALID_PARAMS - on wrong parameters * SA_ERR_HPI_INTERNAL_ERROR - on failure. **/ SaErrorT re_discover_ps_unit(struct oh_handler_state *oh_handler, SOAP_CON *con) { SaErrorT rv = SA_OK; struct oa_soap_handler *oa_handler; struct getPowerSupplyInfo request; struct powerSupplyInfo response; SaHpiInt32T i; enum resource_presence_status state = RES_ABSENT; SaHpiBoolT replace_resource = SAHPI_FALSE; if (oh_handler == NULL || con == NULL) { err("Invalid parameter"); return SA_ERR_HPI_INVALID_PARAMS; } oa_handler = (struct oa_soap_handler *) oh_handler->data; for (i = 1; i <= oa_handler->oa_soap_resources.ps_unit.max_bays; i++) { request.bayNumber = i; rv = soap_getPowerSupplyInfo(con, &request, &response); if (rv != SOAP_OK) { err("Get power supply info failed"); return SA_ERR_HPI_INTERNAL_ERROR; } /* If the power supply unit does not have the power cord * plugged in, then power supply unit will be in faulty * condition. In this case, all the information in the * response structure is NULL. Consider the faulty power supply * unit as ABSENT */ if (response.presence != PRESENT || response.serialNumber == NULL) { /* The power supply unit is absent. Is the power * supply unit absent in the presence matrix? */ if (oa_handler-> oa_soap_resources.ps_unit.presence[i - 1] == RES_ABSENT) continue; else state = RES_ABSENT; } else { /* The power supply unit is present. Is the power * supply unit present in the presence matrix? */ if (oa_handler-> oa_soap_resources.ps_unit.presence[i - 1] == RES_PRESENT) { /* If serial number is diferent, * remove and add the power supply */ if (strcmp(oa_handler->oa_soap_resources. ps_unit.serial_number[i - 1], response.serialNumber) != 0) { replace_resource = SAHPI_TRUE; } else { /* Check the power supply sensors * state */ rv = oa_soap_re_disc_ps_sen( oh_handler, con, i); if (rv != SA_OK) { err("Re-discover power supply " "sensors failed"); return rv; } continue; } } else state = RES_PRESENT; } if (state == RES_ABSENT || replace_resource == SAHPI_TRUE) { /* The power supply unit is present according power * supply presence matrix, but power supply unit is * removed. Remove the power supply unit resource * from RPTable. */ rv = remove_ps_unit(oh_handler, i); if (rv != SA_OK) { err("Power Supply Unit %d removal failed", i); return rv; } else err("Power Supply Unit %d removed", i); } if (state == RES_PRESENT || replace_resource == SAHPI_TRUE) { /* The power supply unit is absent according power * supply presence matrix, but power supply unit is * added. Add the power supply unit resource from * RPTable. */ rv = add_ps_unit(oh_handler, con, &response); if (rv != SA_OK) { err("Power Supply Unit %d add failed", i); return rv; } else err("Power Supply Unit %d added", i); replace_resource = SAHPI_FALSE; } } /* End of for loop */ return SA_OK; } /** * remove_ps_unit * @oh_handler: Pointer to openhpi handler * @bay_number: Bay number of the fan * * Purpose: * Remove the Power Supply Unit. * * Detailed Description: NA * * Return values: * SA_OK - on success. * SA_ERR_HPI_INVALID_PARAMS - on wrong parameters * SA_ERR_HPI_INTERNAL_ERROR - on failure. **/ SaErrorT remove_ps_unit(struct oh_handler_state *oh_handler, SaHpiInt32T bay_number) { SaErrorT rv = SA_OK; struct oa_soap_handler *oa_handler; SaHpiRptEntryT *rpt = NULL; struct oh_event event; SaHpiResourceIdT resource_id; if (oh_handler == NULL) { err("Invalid parameters"); return SA_ERR_HPI_INVALID_PARAMS; } oa_handler = (struct oa_soap_handler *) oh_handler->data; update_hotswap_event(oh_handler, &event); resource_id = oa_handler->oa_soap_resources.ps_unit.resource_id[bay_number - 1]; /* Get the rpt entry of the resource */ rpt = oh_get_resource_by_id(oh_handler->rptcache, resource_id); if (rpt == NULL) { err("resource RPT is NULL"); return SA_ERR_HPI_INTERNAL_ERROR; } memcpy(&(event.resource), rpt, sizeof(SaHpiRptEntryT)); event.event.Source = event.resource.ResourceId; event.event.Severity = event.resource.ResourceSeverity; event.event.EventDataUnion.HotSwapEvent.PreviousHotSwapState = SAHPI_HS_STATE_ACTIVE; event.event.EventDataUnion.HotSwapEvent.HotSwapState = SAHPI_HS_STATE_NOT_PRESENT; /* This state change happened due to surprise extraction */ event.event.EventDataUnion.HotSwapEvent.CauseOfStateChange = SAHPI_HS_CAUSE_SURPRISE_EXTRACTION; /* Push the hotswap event to remove the resource from OpenHPI RPTable */ oh_evt_queue_push(oh_handler->eventq, copy_oa_soap_event(&event)); /* Free the inventory info from inventory RDR */ rv = free_inventory_info(oh_handler, event.resource.ResourceId); if (rv != SA_OK) { err("Inventory cleanup failed for resource id %d", rpt->ResourceId); } /* Remove the resource from plugin RPTable */ rv = oh_remove_resource(oh_handler->rptcache, event.resource.ResourceId); /* reset resource_status structure to default values */ oa_soap_update_resource_status( &oa_handler->oa_soap_resources.ps_unit, bay_number, "", SAHPI_UNSPECIFIED_RESOURCE_ID, RES_ABSENT); return SA_OK; } /** * add_ps_unit * @oh_handler: Pointer to openhpi handler * @con: Pointer SOAP_CON structure * @info: Pointer to the get power supply info response structure * * Purpose: * Add the Power Supply Unit information to RPTable. * * Detailed Description: NA * * Return values: * SA_OK - on success. * SA_ERR_HPI_INVALID_PARAMS - on wrong parameters * SA_ERR_HPI_INTERNAL_ERROR - on failure. **/ SaErrorT add_ps_unit(struct oh_handler_state *oh_handler, SOAP_CON *con, struct powerSupplyInfo *info) { SaErrorT rv = SA_OK; struct oa_soap_handler *oa_handler = NULL; char power_supply_disp[] = POWER_SUPPLY_NAME; struct oh_event event; SaHpiResourceIdT resource_id; struct getPowerSupplyInfo request; struct powerSupplyInfo response; GSList *asserted_sensors = NULL; SaHpiRptEntryT *rpt; if (oh_handler == NULL || con == NULL || info == NULL) { err("Invalid parameters"); return SA_ERR_HPI_INVALID_PARAMS; } oa_handler = (struct oa_soap_handler *) oh_handler->data; update_hotswap_event(oh_handler, &event); /* Get power supply info to obtain the serial number */ request.bayNumber = info->bayNumber; rv = soap_getPowerSupplyInfo(con, &request, &response); if (rv != SOAP_OK) { err("Get power supply info failed"); return SA_ERR_HPI_INTERNAL_ERROR; } /* Build the rpt entry */ rv = build_power_supply_rpt(oh_handler, power_supply_disp, info->bayNumber, &resource_id); if (rv != SA_OK) { err("build power supply rpt failed"); return rv; } /* Update resource_status structure with resource_id, serial_number, * and presence status */ oa_soap_update_resource_status( &oa_handler->oa_soap_resources.ps_unit, info->bayNumber, response.serialNumber, resource_id, RES_PRESENT); /* Build the RDRs */ rv = build_power_supply_rdr(oh_handler, con, info, resource_id); if (rv != SA_OK) { err("build power supply RDR failed"); /* Free the inventory info from inventory RDR */ rv = free_inventory_info(oh_handler, resource_id); if (rv != SA_OK) { err("Inventory cleanup failed for resource id %d", resource_id); } oh_remove_resource(oh_handler->rptcache, resource_id); /* reset resource_status structure to default values */ oa_soap_update_resource_status( &oa_handler->oa_soap_resources.ps_unit, info->bayNumber, "", SAHPI_UNSPECIFIED_RESOURCE_ID, RES_ABSENT); return SA_ERR_HPI_INTERNAL_ERROR; } rv = oa_soap_populate_event(oh_handler, resource_id, &event, &asserted_sensors); if (rv != SA_OK) { err("Populating event struct failed"); return rv; } event.event.EventType = SAHPI_ET_HOTSWAP; event.event.EventDataUnion.HotSwapEvent.PreviousHotSwapState = SAHPI_HS_STATE_NOT_PRESENT; event.event.EventDataUnion.HotSwapEvent.HotSwapState = SAHPI_HS_STATE_ACTIVE; /* NOT_PRESENT to ACTIVE state change happened due to operator action */ event.event.EventDataUnion.HotSwapEvent.CauseOfStateChange = SAHPI_HS_CAUSE_OPERATOR_INIT; /* Push the hotswap event to add the resource to OpenHPI RPTable */ oh_evt_queue_push(oh_handler->eventq, copy_oa_soap_event(&event)); /* Raise the assert sensor events */ if (asserted_sensors) { rpt = oh_get_resource_by_id(oh_handler->rptcache, resource_id); oa_soap_assert_sen_evt(oh_handler, rpt, asserted_sensors); } return SA_OK; } /** * oa_soap_re_disc_oa_sen * @oh_handler : Pointer to openhpi handler * @con : Pointer SOAP_CON structure * @bay_number : OA bay nubmer * * Purpose: * Re-discovers the OA sensor states * * Detailed Description: NA * * Return values: * SA_OK - on success. * SA_ERR_HPI_INVALID_PARAMS - on wrong parameters * SA_ERR_HPI_INTERNAL_ERROR - on failure. **/ static SaErrorT oa_soap_re_disc_oa_sen(struct oh_handler_state *oh_handler, SOAP_CON *con, SaHpiInt32T bay_number) { SaErrorT rv = SA_OK; struct oa_soap_handler *oa_handler = NULL; struct getOaStatus request; struct oaStatus response; struct getOaNetworkInfo nw_info_request; struct oaNetworkInfo nw_info_response; if (oh_handler == NULL || con == NULL) { err("Invalid parameters"); return SA_ERR_HPI_INVALID_PARAMS; } oa_handler = (struct oa_soap_handler *) oh_handler->data; request.bayNumber = bay_number; rv = soap_getOaStatus(con, &request, &response); if (rv != SOAP_OK) { err("Get OA status SOAP call failed"); return SA_ERR_HPI_INTERNAL_ERROR; } /* Check the OA sensor states */ oa_soap_proc_oa_status(oh_handler, &response); nw_info_request.bayNumber = bay_number; rv = soap_getOaNetworkInfo(con, &nw_info_request, &nw_info_response); if (rv != SOAP_OK) { err("Get OA network info SOAP call failed"); return SA_ERR_HPI_INTERNAL_ERROR; } /* Check the OA link status state */ oa_soap_proc_oa_network_info(oh_handler, &nw_info_response); return SA_OK; } /** * oa_soap_re_disc_server_sen * @oh_handler : Pointer to openhpi handler * @con : Pointer SOAP_CON structure * @bay_number : Server bay nubmer * * Purpose: * Re-discovers the server sensor states * * Detailed Description: NA * * Return values: * SA_OK - on success. * SA_ERR_HPI_INVALID_PARAMS - on wrong parameters * SA_ERR_HPI_INTERNAL_ERROR - on failure. **/ static SaErrorT oa_soap_re_disc_server_sen(struct oh_handler_state *oh_handler, SOAP_CON *con, SaHpiInt32T bay_number) { SaErrorT rv = SA_OK; struct getBladeStatus request; struct bladeStatus response; if (oh_handler == NULL || con == NULL) { err("Invalid parameters"); return SA_ERR_HPI_INVALID_PARAMS; } request.bayNumber = bay_number; rv = soap_getBladeStatus(con, &request, &response); if (rv != SOAP_OK) { err("Get OA status SOAP call failed"); return SA_ERR_HPI_INTERNAL_ERROR; } /* Check the server sensor states */ oa_soap_proc_server_status(oh_handler, con, &response); return SA_OK; } /** * oa_soap_re_disc_interconct_sen * @oh_handler : Pointer to openhpi handler * @con : Pointer SOAP_CON structure * @bay_number : Interconnect bay nubmer * * Purpose: * Re-discovers the interconnect sensor states * * Detailed Description: NA * * Return values: * SA_OK - on success. * SA_ERR_HPI_INVALID_PARAMS - on wrong parameters * SA_ERR_HPI_INTERNAL_ERROR - on failure. **/ static SaErrorT oa_soap_re_disc_interconct_sen(struct oh_handler_state *oh_handler, SOAP_CON *con, SaHpiInt32T bay_number) { SaErrorT rv = SA_OK; struct getInterconnectTrayStatus request; struct interconnectTrayStatus response; if (oh_handler == NULL || con == NULL) { err("Invalid parameters"); return SA_ERR_HPI_INVALID_PARAMS; } request.bayNumber = bay_number; rv = soap_getInterconnectTrayStatus(con, &request, &response); if (rv != SOAP_OK) { err("Get OA status SOAP call failed"); return SA_ERR_HPI_INTERNAL_ERROR; } /* Check the interconnect sensor states */ oa_soap_proc_interconnect_status(oh_handler, &response); /* Check the interconnect thermal sensor state */ oa_soap_proc_interconnect_thermal(oh_handler, con, &response); return SA_OK; } /** * oa_soap_re_disc_ps_sen * @oh_handler : Pointer to openhpi handler * @con : Pointer SOAP_CON structure * @bay_number : Power supply bay nubmer * * Purpose: * Re-discovers the power supply sensor states * * Detailed Description: NA * * Return values: * SA_OK - on success. * SA_ERR_HPI_INVALID_PARAMS - on wrong parameters * SA_ERR_HPI_INTERNAL_ERROR - on failure. **/ static SaErrorT oa_soap_re_disc_ps_sen(struct oh_handler_state *oh_handler, SOAP_CON *con, SaHpiInt32T bay_number) { SaErrorT rv = SA_OK; struct getPowerSupplyStatus request; struct powerSupplyStatus response; if (oh_handler == NULL || con == NULL) { err("Invalid parameters"); return SA_ERR_HPI_INVALID_PARAMS; } request.bayNumber = bay_number; rv = soap_getPowerSupplyStatus(con, &request, &response); if (rv != SOAP_OK) { err("Get OA status SOAP call failed"); return SA_ERR_HPI_INTERNAL_ERROR; } /* Check the power supply sensor states */ oa_soap_proc_ps_status(oh_handler, &response); return SA_OK; } /** * oa_soap_re_disc_enc_sen * @oh_handler : Pointer to openhpi handler * @con : Pointer SOAP_CON structure * * Purpose: * Re-discovers the enclosure sensor states * * Detailed Description: NA * * Return values: * SA_OK - on success. * SA_ERR_HPI_INVALID_PARAMS - on wrong parameters * SA_ERR_HPI_INTERNAL_ERROR - on failure. **/ static SaErrorT oa_soap_re_disc_enc_sen(struct oh_handler_state *oh_handler, SOAP_CON *con) { SaErrorT rv = SA_OK; struct enclosureStatus response; if (oh_handler == NULL || con == NULL) { err("Invalid parameters"); return SA_ERR_HPI_INVALID_PARAMS; } rv = soap_getEnclosureStatus(con, &response); if (rv != SOAP_OK) { err("Get enclosure status SOAP call failed"); return SA_ERR_HPI_INTERNAL_ERROR; } /* Check the enclosure sensor states */ oa_soap_proc_enc_status(oh_handler, &response); return SA_OK; } /** * oa_soap_re_disc_ps_subsys_sen * @oh_handler : Pointer to openhpi handler * @con : Pointer SOAP_CON structure * * Purpose: * Re-discovers the power subsystem sensor states * * Detailed Description: NA * * Return values: * SA_OK - on success. * SA_ERR_HPI_INVALID_PARAMS - on wrong parameters * SA_ERR_HPI_INTERNAL_ERROR - on failure. **/ static SaErrorT oa_soap_re_disc_ps_subsys_sen(struct oh_handler_state *oh_handler, SOAP_CON *con) { SaErrorT rv = SA_OK; struct powerSubsystemInfo response; if (oh_handler == NULL || con == NULL) { err("Invalid parameters"); return SA_ERR_HPI_INVALID_PARAMS; } rv = soap_getPowerSubsystemInfo(con, &response); if (rv != SOAP_OK) { err("Get enclosure status SOAP call failed"); return SA_ERR_HPI_INTERNAL_ERROR; } /* Check the power subsystem sensor states */ oa_soap_proc_ps_subsys_info(oh_handler, &response); return SA_OK; } /** * oa_soap_re_disc_lcd_sen * @oh_handler : Pointer to openhpi handler * @con : Pointer SOAP_CON structure * * Purpose: * Re-discovers the LCD sensor states * * Detailed Description: NA * * Return values: * SA_OK - on success. * SA_ERR_HPI_INVALID_PARAMS - on wrong parameters * SA_ERR_HPI_INTERNAL_ERROR - on failure. **/ static SaErrorT oa_soap_re_disc_lcd_sen(struct oh_handler_state *oh_handler, SOAP_CON *con) { SaErrorT rv = SA_OK; struct lcdStatus response; if (oh_handler == NULL || con == NULL) { err("Invalid parameters"); return SA_ERR_HPI_INVALID_PARAMS; } rv = soap_getLcdStatus(con, &response); if (rv != SOAP_OK) { err("Get LCD status SOAP call failed"); return SA_ERR_HPI_INTERNAL_ERROR; } /* Check the LCD sensor states */ oa_soap_proc_lcd_status(oh_handler, &response); return SA_OK; } /** * oa_soap_re_disc_fz_sen * @oh_handler : Pointer to openhpi handler * @con : Pointer SOAP_CON structure * * Purpose: * Re-discovers the fan_zone sensor states * * Detailed Description: NA * * Return values: * SA_OK - on success. * SA_ERR_HPI_INVALID_PARAMS - on wrong parameters * SA_ERR_HPI_INTERNAL_ERROR - on failure. **/ static SaErrorT oa_soap_re_disc_fz_sen(struct oh_handler_state *oh_handler, SOAP_CON *con) { SaErrorT rv = SA_OK; struct oa_soap_handler *oa_handler = NULL; struct getFanZoneArrayResponse response; struct fanZone fan_zone; SaHpiInt32T max_fz; if (oh_handler == NULL || con == NULL) { err("Invalid parameters"); return SA_ERR_HPI_INVALID_PARAMS; } oa_handler = (struct oa_soap_handler *) oh_handler->data; max_fz = oa_handler->oa_soap_resources.fan_zone.max_bays; /* Get the Fan Zone array information */ rv = oa_soap_get_fz_arr(oa_handler, max_fz, &response); if (rv != SOAP_OK) { err("Get fan zone array failed"); return rv; } while (response.fanZoneArray) { soap_fanZone(response.fanZoneArray, &fan_zone); /* Check the fan zone sensor states */ oa_soap_proc_fz_status(oh_handler, &fan_zone); response.fanZoneArray = soap_next_node(response.fanZoneArray); } return SA_OK; } /** * oa_soap_re_disc_therm_subsys_sen * @oh_handler : Pointer to openhpi handler * @con : Pointer SOAP_CON structure * * Purpose: * Re-discovers the thermal subsystem sensor states * * Detailed Description: NA * * Return values: * SA_OK - on success. * SA_ERR_HPI_INVALID_PARAMS - on wrong parameters * SA_ERR_HPI_INTERNAL_ERROR - on failure. **/ static SaErrorT oa_soap_re_disc_therm_subsys_sen(struct oh_handler_state *oh_handler, SOAP_CON *con) { SaErrorT rv = SA_OK; struct thermalSubsystemInfo response; if (oh_handler == NULL || con == NULL) { err("Invalid parameters"); return SA_ERR_HPI_INVALID_PARAMS; } rv = soap_getThermalSubsystemInfo(con, &response); if (rv != SOAP_OK) { err("Get thermal subsystem info SOAP call failed"); return SA_ERR_HPI_INTERNAL_ERROR; } /* Check the thermal subsystem sensor states */ oa_soap_proc_therm_subsys_info(oh_handler, &response); return SA_OK; } openhpi-2.14.1/plugins/oa_soap/oa_soap.h0000644000076400007640000002046311302566663015102 0ustar /* * Copyright (C) 2007-2009, Hewlett-Packard Development Company, LLP * All rights reserved. * * 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. * * Neither the name of the Hewlett-Packard Corporation, nor the names * of its contributors may be used to endorse or promote products * derived from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * Author(s) * Raghavendra P.G. * Raghavendra M.S. * Raja Kumar Thatte * Vivek Kumar * Shuah Khan * Mohan Devarajulu */ #ifndef _OA_SOAP_H #define _OA_SOAP_H /* Include files */ #include #include #include #include #include "oa_soap_calls.h" /* The resource numbers in OA SOAP. The rpt and rdr arrays are indexed based on * the entity numbers defined below. * On supporting a new resource in OA SOAP plugin, please update the rpt and rdr * arrays in oa_soap_resources.c */ /* Enclosure */ #define OA_SOAP_ENT_ENC 0 /* Server Blade */ #define OA_SOAP_ENT_SERV 1 /* IO Blade */ #define OA_SOAP_ENT_IO 2 /* Storage Blade */ #define OA_SOAP_ENT_STORAGE 3 /* Switch Blade */ #define OA_SOAP_ENT_SWITCH 4 /* Onboard Administrator */ #define OA_SOAP_ENT_OA 5 /* Power Subsystem */ #define OA_SOAP_ENT_PS_SUBSYS 6 /* Power supply */ #define OA_SOAP_ENT_PS 7 /* Thermal subsystem */ #define OA_SOAP_ENT_THERM_SUBSYS 8 /* Fan Zone */ #define OA_SOAP_ENT_FZ 9 /* Fan */ #define OA_SOAP_ENT_FAN 10 /* LCD */ #define OA_SOAP_ENT_LCD 11 /* The different enclosure types supported by OA SOAP * * If a new enclosure is added, please update the OA_SOAP_MAX_FAN. Add * entries for the new enclosure in oa_soap_fz_map_arr in * oa_soap_resources.c file. */ #define OA_SOAP_ENC_C7000 0 #define OA_SOAP_ENC_C3000 1 /* Max Blade in HP BladeSystem c7000 c-Class enclosure*/ #define OA_SOAP_C7000_MAX_BLADE 16 /* Max Blade in HP BladeSystem c3000 c-Class enclosure*/ #define OA_SOAP_C3000_MAX_BLADE 8 /* Maximum Fan Zones present in different HP BladeSystem c-Class enclosures */ #define OA_SOAP_C7000_MAX_FZ 4 #define OA_SOAP_C3000_MAX_FZ 1 /* Maximum fans supported in an enclosure * * If the max fan is changed, please update entries to * oa_soap_fz_map_arr in oa_soap_resources.c file */ #define OA_SOAP_MAX_FAN 10 /* Definitions for the different RDR instrument ids */ /* TODO: Move below definitons to SaHpiOaSoap.h file */ #define OA_SOAP_RES_INV_NUM (SaHpiIdrIdT) 0x000 #define OA_SOAP_RES_CNTRL_NUM (SaHpiCtrlNumT) 0x001 /* SOAP XML calls timeout values for event thread and hpi calls */ #define HPI_CALL_TIMEOUT 10 #define EVENT_CALL_TIMEOUT 40 /* Error code for SOAP XML calls */ #define SOAP_OK 0 /* SSH port */ #define PORT ":443" /* Max URL and buffer size */ #define MAX_URL_LEN 255 #define MAX_BUF_SIZE 255 /* Max OA bays in HP BladeSystem c-Class */ #define MAX_OA_BAYS 2 /* OA Error numbers */ #define ERR_INVALID_PRIVILEGE_LEVEL 8 #define ERR_STANDBY_MODE 139 /* OA firmware versions */ #define OA_2_20 2.20 #define OA_2_21 2.21 /* OA switchover re-try wait period */ #define WAIT_ON_SWITCHOVER 10 /* OA switchover max re-try */ #define MAX_RETRY_ON_SWITCHOVER 10 /* Enum for storing the status of the plugin */ enum oa_soap_plugin_status { PRE_DISCOVERY = 0, PLUGIN_NOT_INITIALIZED = 1, DISCOVERY_FAIL = 2, DISCOVERY_COMPLETED = 3 }; /* Structure for storing the OA information */ struct oa_info { enum oaRole oa_status; SaHpiInt32T event_pid; GThread *thread_handler; GMutex *mutex; char server[MAX_URL_LEN]; SOAP_CON *hpi_con; SOAP_CON *event_con; SOAP_CON *event_con2; SaHpiFloat64T fm_version; struct oh_handler_state *oh_handler; }; typedef enum resource_presence_status { RES_ABSENT = 0, RES_PRESENT= 1 } resource_presence_status_t; /* Resource presence matrix per resource type */ typedef struct resource_status { SaHpiInt32T max_bays; enum resource_presence_status *presence; char **serial_number; SaHpiResourceIdT *resource_id; } resource_status_t; /* Resource presence matrix for all FRUs in HP BladeSystem c-Class */ struct oa_soap_resource_status { SaHpiResourceIdT enclosure_rid; SaHpiResourceIdT power_subsystem_rid; SaHpiResourceIdT thermal_subsystem_rid; SaHpiResourceIdT lcd_rid; struct resource_status oa; struct resource_status server; struct resource_status interconnect; struct resource_status fan_zone; struct resource_status fan; struct resource_status ps_unit; }; /* Structure for storing the OA SOAP plugin information */ struct oa_soap_handler { enum oa_soap_plugin_status status; struct oa_soap_resource_status oa_soap_resources; SOAP_CON *active_con; struct oa_info *oa_1; struct oa_info *oa_2; /* Type of the enclsoure */ SaHpiInt32T enc_type; SaHpiBoolT shutdown_event_thread; SaHpiInt32T oa_switching; GMutex *mutex; }; /* Structure for storing the current hotswap state of the resource */ struct oa_soap_hotswap_state { SaHpiHsStateT currentHsState; }; /* This define is the IANA-assigned private enterprise number for * Hewlett-Packard. A complete list of IANA numbers can be found at * http://www.iana.org/assignments/enterprise-numbers */ #define HP_MANUFACTURING_ID 11 /* This define is the IANA-assigned private enterprise number for Cisco Systems. * The HP BladeSystem c-Class can have interconnect blades from Cisco Systems */ #define CISCO_MANUFACTURING_ID 9 /* Checks for the shutdown request in event thread. On shutdown request, mutexes * locked by event thread are unlocked and exits the thread. It is necessary to * unlock the mutex, else g_free_mutex crahes on locked mutex */ #define OA_SOAP_CHEK_SHUTDOWN_REQ(oa_handler, hnd_mutex, oa_mutex, timer) \ { \ if (oa_handler->shutdown_event_thread == SAHPI_TRUE) { \ dbg("Shutting down the OA SOAP event thread"); \ if (oa_mutex != NULL) \ g_mutex_unlock(oa_mutex); \ if (hnd_mutex != NULL) \ g_mutex_unlock(hnd_mutex); \ if (timer != NULL) \ g_timer_destroy(timer); \ g_thread_exit(NULL); \ } \ } /* Function prototypes */ SaErrorT build_oa_soap_custom_handler(struct oh_handler_state *oh_handler); void *oa_soap_open(GHashTable *handler_config, unsigned int hid, oh_evt_queue *eventq); void oa_soap_close(void *oh_handler); SaErrorT oa_soap_set_resource_tag(void *oh_handler, SaHpiResourceIdT resource_id, SaHpiTextBufferT *tag); SaErrorT oa_soap_set_resource_severity(void *oh_handler, SaHpiResourceIdT resource_id, SaHpiSeverityT severity); SaErrorT oa_soap_control_parm(void *oh_handler, SaHpiResourceIdT resource_id, SaHpiParmActionT action); #endif openhpi-2.14.1/plugins/oa_soap/oa_soap_power.h0000644000076400007640000000614611302566663016320 0ustar /* * Copyright (C) 2007-2008, Hewlett-Packard Development Company, LLP * All rights reserved. * * 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. * * Neither the name of the Hewlett-Packard Corporation, nor the names * of its contributors may be used to endorse or promote products * derived from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * Author(s) * Raghavendra P.G. */ #ifndef _OA_SOAP_POWER_H #define _OA_SOAP_POWER_H /* Include files */ #include "oa_soap_utils.h" /* Seconds to sleep between polls when checking for powerdown */ #define OA_POWEROFF_POLL_INTERVAL 2 /* Max number of times to poll when checking for powerdown */ #define OA_MAX_POWEROFF_POLLS 100 /* Delay (in seconds) before sending a "power on" command after having sent * a "power off" command. */ #define OA_SERVER_POWER_OFF_WAIT_PERIOD 5 SaErrorT get_server_power_state(SOAP_CON *con, SaHpiInt32T bay_number, SaHpiPowerStateT *state); SaErrorT get_interconnect_power_state(SOAP_CON *con, SaHpiInt32T bay_number, SaHpiPowerStateT *state); SaErrorT set_server_power_state(SOAP_CON *con, SaHpiInt32T bay_number, SaHpiPowerStateT state); SaErrorT set_interconnect_power_state(SOAP_CON *con, SaHpiInt32T bay_number, SaHpiPowerStateT state); SaErrorT oa_soap_get_power_state(void *oh_handler, SaHpiResourceIdT resource_id, SaHpiPowerStateT *state); SaErrorT oa_soap_set_power_state(void *oh_handler, SaHpiResourceIdT resource_id, SaHpiPowerStateT state); #endif openhpi-2.14.1/plugins/oa_soap/oa_soap_discover.c0000644000076400007640000044407311302566663017002 0ustar /* * Copyright (C) 2007-2008, Hewlett-Packard Development Company, LLP * All rights reserved. * * 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. * * Neither the name of the Hewlett-Packard Corporation, nor the names * of its contributors may be used to endorse or promote products * derived from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * Author(s) * Raghavendra P.G. * Vivek Kumar * Raghavendra M.S. * Shuah Khan * * This file implements the discovery functionality. The resources of the * HP BladeSystem c-Class are discovered. * * oa_soap_discover_resources() - Checks the plugin initialization * completion. Starts the event threads * for active and standby OAs. Starts * the discovery. * * discover_oa_soap_system() - Discovers all the resources in HP * BladeSystem c-Class * * build_enclosure_info() - Discovers the max bays for all the * resources in enclosure * * build_enclosure_rpt() - Builds the enclosure RPT entry * * build_enclosure_rdr() - Builds the enclosure RDRs * * discover_enclosure() - Discovers the enclosure along with * its capabilities * * build_server_rpt() - Builds the server RPT entry * * build_discovered_server_rpt() - Builds the server RPT entry * * build_server_rdr() - Builds the server RDRs * * discover_server() - Discovers the server, IO, and * storage blades, and their * capabilities * * discover_interconnect_rpt() - Builds the interconnect RPT entry * * discover_interconnect_rdr() - Builds the interconnect RDRs * * discover_interconnect() - Discovers the interconnect blades * along with their capabilities * * oa_soap_discover_fan_rpt() - Builds the fan RPT entry * * oa_soap_discover_fan_rdr() - Builds the fan RDRs * * oa_soap_discover_fan() - Discovers the fan along with * its capabilities * * discover_power_subsystem_rpt() - Builds the power subsystem RPT entry * * discover_power_subsystem_rdr() - Builds the power subsystem RDRs * * discover_power_subsystem() - Discovers the power subsystem * along with its capabilities * * discover_power_supply_rpt() - Builds the power supplies RPT entry * * discover_power_supply_rdr() - Builds the power supplies RDRs * * discover_power_supply() - Discovers the power supplies * along with its capabilities * * discover_oa_rpt() - Builds the onboard administrator * RPT entry * * discover_oa_rdr() - Builds the onboard administrator RDRs * * discover_oa() - Discovers the onboard administrator * along with its capabilities * * oa_soap_parse_diag_ex() - Parses the diagnosticChecksEx * structure * * oa_soap_get_health_val() - Gets the healthStatus value from * extraData structure * * oa_soap_build_rpt() - Generic function to build the RPT * entry * * oa_soap_build_therm_subsys_rdr()- Builds the thermal subsystem RDR * * oa_soap_disc_therm_subsys() - Discovers the thermal subsystem * * oa_soap_build_fz_rdr() - Builds the fan zone RDR * * oa_soap_get_fz_arr() - Gets the fan zone array information * from OA * * oa_soap_disc_fz() - Discovers the fan zones * * oa_soap_build_lcd_rdr() - Builds the LCD RDR * * oa_soap_disc_lcd() - Discovers the LCD * * oa_soap_populate_event() - Populates the event structure with * default values * * oa_soap_push_disc_res() - Pushes the discovered resources * information to openhpi framework * * oa_soap_build_blade_thermal_rdr() - Builds or Enables the thermal * sensors of blade resource * */ #include "oa_soap_discover.h" /* Forward declaration for static functions */ static SaErrorT oa_soap_build_enc_info(struct oh_handler_state *oh_handler, struct enclosureInfo *info); static SaErrorT oa_soap_build_therm_subsys_rdr(struct oh_handler_state *oh_handler, SaHpiResourceIdT resource_id); static SaErrorT oa_soap_build_fz_rdr(struct oh_handler_state *oh_handler, SaHpiResourceIdT resource_id, struct fanZone *fan_zone); static SaErrorT oa_soap_disc_therm_subsys(struct oh_handler_state *oh_handler); static SaErrorT oa_soap_disc_fz(struct oh_handler_state *oh_handler); static SaErrorT oa_soap_disc_fan(struct oh_handler_state *oh_handler); static SaErrorT oa_soap_build_lcd_rdr(struct oh_handler_state *oh_handler, SaHpiResourceIdT resource_id); static SaErrorT oa_soap_disc_lcd(struct oh_handler_state *oh_handler); static void oa_soap_push_disc_res(struct oh_handler_state *oh_handler); /** * oa_soap_discover_resources * @oh_handler: Pointer to openhpi handler * * Purpose: * Discover the resources. * This ABI is called from the OpenHPI framework for * discovering HP BladeSystem cClass resources * * Detailed Description: * - Checks the plugin initialization completion. * If the plugin initialization has failed, then it tries to do the * plugin initialization and then discovery. * - OpenHPI framework calls this ABI every 3 minutes. * If this function is called after the initial discovery, * then call is ignored and no discovery is done again. * - If the discovery is called for the 1st time (after plugin * initialazation), then, starts the event threads for active and * standby OAs. * - If the discovery is called for the 1st time (after plugin * initialazation), then, starts the discovery * * Return values: * SA_OK - on success. * SA_ERR_HPI_INVALID_PARAMS - on wrong parameters * SA_ERR_HPI_INTERNAL_ERROR - on failure. **/ SaErrorT oa_soap_discover_resources(void *oh_handler) { struct oh_handler_state *handler; struct oa_soap_handler *oa_handler = NULL; SaErrorT rv = SA_OK; GError **error = NULL; if (oh_handler == NULL) { err("Invalid parameters"); return SA_ERR_HPI_INVALID_PARAMS; } handler = (struct oh_handler_state *) oh_handler; oa_handler = (struct oa_soap_handler *) handler->data; /* Check whether the plugin is initialized or not * If not, initialize the plugin */ if (oa_handler == NULL) { rv = build_oa_soap_custom_handler(handler); if (rv != SA_OK) { err("Plugin initialization failed"); return SA_ERR_HPI_INTERNAL_ERROR; } } /* Check the status of the plugin */ g_mutex_lock(oa_handler->mutex); switch (oa_handler->status) { case PRE_DISCOVERY: /* This is the first call for discovery */ g_mutex_unlock(oa_handler->mutex); dbg("First discovery"); break; case PLUGIN_NOT_INITIALIZED: /* The plugin has encountered a problem while * initializing, the configured OA may not be reachable. * Try to initialize the plugin again. */ g_mutex_unlock(oa_handler->mutex); rv = build_oa_soap_custom_handler(handler); if (rv != SA_OK) { err("Plugin initialization failed"); return rv; } break; case DISCOVERY_FAIL: /* The last discovery has failed. * May be due to active OA is not reachable or * due to OA switchover during discovery. * Try to recover from the problem */ g_mutex_unlock(oa_handler->mutex); rv = check_discovery_failure(oh_handler); if (rv != SA_OK) { g_mutex_lock(oa_handler->mutex); oa_handler->status = DISCOVERY_FAIL; g_mutex_unlock(oa_handler->mutex); err("Discovery failed for OA %s", oa_handler->active_con->server); return SA_ERR_HPI_INTERNAL_ERROR; } break; case DISCOVERY_COMPLETED: /* OpenHPI framework calls the discovery every 3 minutes * OA SOAP plugin gets the changes to resource as * part of event handling, hence re-discovery * is not required. If the discovery is already * done once, ignore and return success */ g_mutex_unlock(oa_handler->mutex); dbg("Discovery already done"); return SA_OK; break; default: /* This code should never get executed */ g_mutex_unlock(oa_handler->mutex); err("Wrong oa_soap handler state detected"); return SA_ERR_HPI_INTERNAL_ERROR; } /* Create the event thread for the OA in slot 1 * If the thread_handler is not NULL, then the event threads are * already created and skip the event thread creation */ g_mutex_lock(oa_handler->mutex); if (oa_handler->oa_1->thread_handler == NULL) { /* Subscribe for events, so that we don't lose any changes * to resource states which may happen during discovery */ rv = create_event_session(oa_handler->oa_1); if (rv != SOAP_OK) { /* If the subscription for events fails, * then discovery will fail. * Discovery method has the recovery mechanism. * Hence the error is not handled here */ dbg("Subscribe for events failed for OA %s", oa_handler->oa_1->server); } oa_handler->oa_1->thread_handler = g_thread_create(oa_soap_event_thread, oa_handler->oa_1, TRUE, error); if (oa_handler->oa_1->thread_handler == NULL) { g_mutex_unlock(oa_handler->mutex); err("g_thread_create failed"); return SA_ERR_HPI_INTERNAL_ERROR; } } else dbg("OA %s event thread is already started", oa_handler->oa_1->server); /* Create the event thread for OA in slot 2 */ if (oa_handler->oa_2->thread_handler == NULL) { rv = create_event_session(oa_handler->oa_2); if (rv != SOAP_OK) { dbg("Subscribe for events failed OA %s", oa_handler->oa_2->server); } oa_handler->oa_2->thread_handler = g_thread_create(oa_soap_event_thread, oa_handler->oa_2, TRUE, error); if (oa_handler->oa_2->thread_handler == NULL) { g_mutex_unlock(oa_handler->mutex); err("g_thread_create failed"); return SA_ERR_HPI_INTERNAL_ERROR; } } else dbg("OA %s event thread is already started", oa_handler->oa_2->server); /* Plug-in intialization is successfully done. * Start the discovery of the cClass resources */ rv = discover_oa_soap_system(handler); if (rv != SA_OK) { oa_handler->status = DISCOVERY_FAIL; g_mutex_unlock(oa_handler->mutex); err("Discovery failed for active OA %s", oa_handler->active_con->server); /* Cleanup the RPTable which may have partially discovered * resource information. */ cleanup_plugin_rptable(handler); return rv; } oa_handler->status = DISCOVERY_COMPLETED; g_mutex_unlock(oa_handler->mutex); dbg("Discovery completed for active OA %s", oa_handler->active_con->server); return SA_OK; } /** * discover_oa_soap_system * @oh_handler: Pointer to openhpi handler * * Purpose: * Discover the OA SOAP resources. * Discovers all the resources of cClass system * * Detailed Description: NA * * Return values: * SA_OK - on success. * SA_ERR_HPI_INVALID_PARAMS - on wrong parameters * SA_ERR_HPI_INTERNAL_ERROR - on failure. **/ SaErrorT discover_oa_soap_system(struct oh_handler_state *oh_handler) { SaErrorT rv = SA_OK; if (oh_handler == NULL) { err("Invalid parameters"); return SA_ERR_HPI_INVALID_PARAMS; } dbg("Discovering HP BladeSystem c-Class"); dbg(" Discovering Enclosure ......................"); rv = discover_enclosure(oh_handler); if (rv != SA_OK) { err("Failed to discover Enclosure"); return rv; } dbg(" Discovering Blades ..................."); rv = discover_server(oh_handler); if (rv != SA_OK) { err("Failed to discover Server Blade"); return rv; } dbg(" Discovering InterConnect ..................."); rv = discover_interconnect(oh_handler); if (rv != SA_OK) { err("Failed to discover InterConnect"); return rv; } dbg(" Discovering Thermal Subsystem .............."); rv = oa_soap_disc_therm_subsys(oh_handler); if (rv != SA_OK) { err("Failed to discover Thermal Subsystem "); return rv; } dbg(" Discovering Fan Zone ......................."); rv = oa_soap_disc_fz(oh_handler); if (rv != SA_OK) { err("Failed to discover Fan Zone "); return rv; } dbg(" Discovering Fan ............................"); rv = oa_soap_disc_fan(oh_handler); if (rv != SA_OK) { err("Failed to discover Fan "); return rv; } dbg(" Discovering Power Subsystem ................"); rv = discover_power_subsystem(oh_handler); if (rv != SA_OK) { err("Failed to discover Power Subsystem "); return rv; } dbg(" Discovering Power Supply Unit .............."); rv = discover_power_supply(oh_handler); if (rv != SA_OK) { err("Failed to discover Power Supply Unit"); return rv; } dbg(" Discovering OA ............................."); rv = discover_oa(oh_handler); if (rv != SA_OK) { err("Failed to discover OA"); return rv; } dbg(" Discovering LCD ............................."); rv = oa_soap_disc_lcd(oh_handler); if (rv != SA_OK) { err("Failed to discover LCD"); return rv; } oa_soap_push_disc_res(oh_handler); return SA_OK; } /** * oa_soap_build_enc_info * @oh_handler: Pointer to openhpi handler * @info: Pointer to enclosure info structure * * Purpose: * Gets the enclosure info and fills the max bays available for the * enclosure * * Detailed Description: * - Gets the maximum number bays for server blades, interconnect, * OA, fans and power supply * - Creates the resource id matrix for the server blades, interconnect, * OA, thermal subsystem, fan zones, fans, power subsystem and * power supply * - Creates the presence matrix for the server blades, interconnect, * OA, fans and power supply * - Initialize the presence matrix to ABSENT and resource id matrix to * UNSPECIFIED_ID * * Return values: * SA_OK - on success. * SA_ERR_HPI_INVALID_PARAMS - on wrong parameters * SA_ERR_HPI_INTERNAL_ERROR - on failure. **/ static SaErrorT oa_soap_build_enc_info(struct oh_handler_state *oh_handler, struct enclosureInfo *info) { struct oa_soap_handler *oa_handler = NULL; SaHpiInt32T i; if (oh_handler == NULL) { err("Invalid parameters"); return SA_ERR_HPI_INVALID_PARAMS; } oa_handler = (struct oa_soap_handler *) oh_handler->data; if(oa_handler == NULL) { err("Invalid parameters"); return SA_ERR_HPI_INVALID_PARAMS; } /* Find the enclosure type and max fan zones */ switch (info->bladeBays) { case OA_SOAP_C7000_MAX_BLADE: oa_handler->enc_type = OA_SOAP_ENC_C7000; oa_handler->oa_soap_resources.fan_zone.max_bays = OA_SOAP_C7000_MAX_FZ; break; case OA_SOAP_C3000_MAX_BLADE: oa_handler->enc_type = OA_SOAP_ENC_C3000; oa_handler->oa_soap_resources.fan_zone.max_bays = OA_SOAP_C3000_MAX_FZ; break; default: err("Invalid number (%d) of server bays detected", info->bladeBays); return SA_ERR_HPI_INTERNAL_ERROR; } oa_handler->oa_soap_resources.enclosure_rid = SAHPI_UNSPECIFIED_RESOURCE_ID; oa_handler->oa_soap_resources.power_subsystem_rid = SAHPI_UNSPECIFIED_RESOURCE_ID; oa_handler->oa_soap_resources.thermal_subsystem_rid = SAHPI_UNSPECIFIED_RESOURCE_ID; oa_handler->oa_soap_resources.lcd_rid = SAHPI_UNSPECIFIED_RESOURCE_ID; /* Create the resource presence matrix for * server, interconnect, OA, power supply and fan unit. * We need the resource presence matrix for re-discovery to sync * with current states of the resources */ /* Build resource presence matrix for servers */ oa_handler->oa_soap_resources.server.max_bays = info->bladeBays; oa_handler->oa_soap_resources.server.presence = (enum resource_presence_status *) g_malloc0((sizeof(enum resource_presence_status)) * oa_handler->oa_soap_resources.server.max_bays); if (oa_handler->oa_soap_resources.server.presence == NULL) { err("Out of memory"); return SA_ERR_HPI_OUT_OF_MEMORY; } /* allocate memory for resource_id matrix server blades */ oa_handler->oa_soap_resources.server.resource_id = (SaHpiResourceIdT *) g_malloc0((sizeof(SaHpiResourceIdT ) * oa_handler->oa_soap_resources.server.max_bays)); if (oa_handler->oa_soap_resources.server.resource_id == NULL) { err("Out of memory"); return SA_ERR_HPI_OUT_OF_MEMORY; } /* Create the placeholder for serial number * If the gets replaced during the switchover or when OA is not * reachable, we can detect this change by comparing the serial * numbers of the old and new blade. */ oa_handler->oa_soap_resources.server.serial_number = (char **) g_malloc0(sizeof(char **) * oa_handler->oa_soap_resources.server.max_bays); if (oa_handler->oa_soap_resources.server.serial_number == NULL) { err("Out of memory"); release_oa_soap_resources(oa_handler); return SA_ERR_HPI_OUT_OF_MEMORY; } for (i = 0; i < oa_handler->oa_soap_resources.server.max_bays; i++) { oa_handler->oa_soap_resources.server.presence[i] = RES_ABSENT; oa_handler->oa_soap_resources.server.resource_id[i] = SAHPI_UNSPECIFIED_RESOURCE_ID; oa_handler->oa_soap_resources.server.serial_number[i] = (char *) g_malloc0(sizeof(char *) * MAX_SERIAL_NUM_LENGTH); if (oa_handler->oa_soap_resources.server.serial_number[i] == NULL) { err("Out of memory"); release_oa_soap_resources(oa_handler); return SA_ERR_HPI_OUT_OF_MEMORY; } } /* Build resource presence matrix for interconnects */ oa_handler->oa_soap_resources.interconnect.max_bays = info->interconnectTrayBays; oa_handler->oa_soap_resources.interconnect.presence = (enum resource_presence_status *) g_malloc0((sizeof(enum resource_presence_status)) * oa_handler->oa_soap_resources.interconnect.max_bays); if (oa_handler->oa_soap_resources.interconnect.presence == NULL) { err("Out of memory"); release_oa_soap_resources(oa_handler); return SA_ERR_HPI_OUT_OF_MEMORY; } /* allocate memory for resource_id matrix interconnects */ oa_handler->oa_soap_resources.interconnect.resource_id = (SaHpiResourceIdT *) g_malloc0((sizeof(SaHpiResourceIdT ) * oa_handler->oa_soap_resources.interconnect.max_bays)); if (oa_handler->oa_soap_resources.interconnect.resource_id == NULL) { err("Out of memory"); return SA_ERR_HPI_OUT_OF_MEMORY; } oa_handler->oa_soap_resources.interconnect.serial_number = (char **) g_malloc0(sizeof(char **) * oa_handler->oa_soap_resources.interconnect.max_bays); if (oa_handler->oa_soap_resources.interconnect.serial_number == NULL) { err("Out of memory"); release_oa_soap_resources(oa_handler); return SA_ERR_HPI_OUT_OF_MEMORY; } for (i = 0; i < oa_handler->oa_soap_resources.interconnect.max_bays; i++) { oa_handler->oa_soap_resources.interconnect.presence[i] = RES_ABSENT; oa_handler->oa_soap_resources.interconnect.resource_id[i] = SAHPI_UNSPECIFIED_RESOURCE_ID; oa_handler->oa_soap_resources.interconnect.serial_number[i] = (char *) g_malloc0(sizeof(char *) * MAX_SERIAL_NUM_LENGTH); if (oa_handler->oa_soap_resources.interconnect.serial_number[i] == NULL) { err("Out of memory"); release_oa_soap_resources(oa_handler); return SA_ERR_HPI_OUT_OF_MEMORY; } } /* Build resource presence matrix for OAs */ oa_handler->oa_soap_resources.oa.max_bays = info->oaBays; oa_handler->oa_soap_resources.oa.presence = (enum resource_presence_status *) g_malloc0((sizeof(enum resource_presence_status)) * oa_handler->oa_soap_resources.oa.max_bays); if (oa_handler->oa_soap_resources.oa.presence == NULL) { err("Out of memory"); release_oa_soap_resources(oa_handler); return SA_ERR_HPI_OUT_OF_MEMORY; } oa_handler->oa_soap_resources.oa.serial_number = (char **) g_malloc0(sizeof(char **) * oa_handler->oa_soap_resources.oa.max_bays); if (oa_handler->oa_soap_resources.oa.serial_number == NULL) { err("Out of memory"); release_oa_soap_resources(oa_handler); return SA_ERR_HPI_OUT_OF_MEMORY; } /* allocate memory for OAs resource_id array */ oa_handler->oa_soap_resources.oa.resource_id = (SaHpiResourceIdT *) g_malloc0((sizeof(SaHpiResourceIdT ) * oa_handler->oa_soap_resources.oa.max_bays)); if (oa_handler->oa_soap_resources.oa.resource_id == NULL) { err("Out of memory"); return SA_ERR_HPI_OUT_OF_MEMORY; } for (i = 0; i < oa_handler->oa_soap_resources.oa.max_bays; i++) { oa_handler->oa_soap_resources.oa.presence[i] = RES_ABSENT; oa_handler->oa_soap_resources.oa.resource_id[i] = SAHPI_UNSPECIFIED_RESOURCE_ID; oa_handler->oa_soap_resources.oa.serial_number[i] = (char *) g_malloc0(sizeof(char *) * MAX_SERIAL_NUM_LENGTH); if (oa_handler->oa_soap_resources.oa.serial_number[i] == NULL) { err("Out of memory"); release_oa_soap_resources(oa_handler); return SA_ERR_HPI_OUT_OF_MEMORY; } } /* Build resource presence matrix for fan zone */ oa_handler->oa_soap_resources.fan_zone.resource_id = (SaHpiResourceIdT *) g_malloc0((sizeof(SaHpiResourceIdT ) * oa_handler->oa_soap_resources.fan_zone.max_bays)); if (oa_handler->oa_soap_resources.fan_zone.resource_id == NULL) { err("Out of memory"); release_oa_soap_resources(oa_handler); return SA_ERR_HPI_OUT_OF_MEMORY; } /* Fan zones do not have serial number. Therefore, the serial number * array is not constructed. */ for (i = 0; i < oa_handler->oa_soap_resources.fan_zone.max_bays; i++) { oa_handler->oa_soap_resources.fan_zone.resource_id[i] = SAHPI_UNSPECIFIED_RESOURCE_ID; } /* Build resource presence matrix for fans */ oa_handler->oa_soap_resources.fan.max_bays = info->fanBays; oa_handler->oa_soap_resources.fan.presence = (enum resource_presence_status *) g_malloc0((sizeof(enum resource_presence_status)) * oa_handler->oa_soap_resources.fan.max_bays); if (oa_handler->oa_soap_resources.fan.presence == NULL) { err("Out of memory"); release_oa_soap_resources(oa_handler); return SA_ERR_HPI_OUT_OF_MEMORY; } /* allocate memory for fans resource_id array */ oa_handler->oa_soap_resources.fan.resource_id = (SaHpiResourceIdT *) g_malloc0((sizeof(SaHpiResourceIdT ) * oa_handler->oa_soap_resources.fan.max_bays)); if (oa_handler->oa_soap_resources.fan.resource_id == NULL) { err("Out of memory"); return SA_ERR_HPI_OUT_OF_MEMORY; } /* Fans do not have serial number. Therefore, the serial number * array is not constructed. */ for (i = 0; i < oa_handler->oa_soap_resources.fan.max_bays; i++) { oa_handler->oa_soap_resources.fan.presence[i] = RES_ABSENT; oa_handler->oa_soap_resources.fan.resource_id[i] = SAHPI_UNSPECIFIED_RESOURCE_ID; } /* Build resource presence matrix for power supply units */ oa_handler->oa_soap_resources.ps_unit.max_bays = info->powerSupplyBays; oa_handler->oa_soap_resources.ps_unit.presence = (enum resource_presence_status *) g_malloc0((sizeof(enum resource_presence_status)) * oa_handler->oa_soap_resources.ps_unit.max_bays); if (oa_handler->oa_soap_resources.ps_unit.presence == NULL) { err("Out of memory"); release_oa_soap_resources(oa_handler); return SA_ERR_HPI_OUT_OF_MEMORY; } /* allocate memory for power supplies resource_id array */ oa_handler->oa_soap_resources.ps_unit.resource_id = (SaHpiResourceIdT *) g_malloc0((sizeof(SaHpiResourceIdT ) * oa_handler->oa_soap_resources.ps_unit.max_bays)); if (oa_handler->oa_soap_resources.ps_unit.resource_id == NULL) { err("Out of memory"); return SA_ERR_HPI_OUT_OF_MEMORY; } oa_handler->oa_soap_resources.ps_unit.serial_number = (char **) g_malloc0(sizeof(char **) * oa_handler->oa_soap_resources.ps_unit.max_bays); if (oa_handler->oa_soap_resources.ps_unit.serial_number == NULL) { err("Out of memory"); release_oa_soap_resources(oa_handler); return SA_ERR_HPI_OUT_OF_MEMORY; } for (i = 0; i < oa_handler->oa_soap_resources.ps_unit.max_bays; i++) { oa_handler->oa_soap_resources.ps_unit.presence[i] = RES_ABSENT; oa_handler->oa_soap_resources.ps_unit.resource_id[i] = SAHPI_UNSPECIFIED_RESOURCE_ID; oa_handler->oa_soap_resources.ps_unit.serial_number[i] = (char *) g_malloc0(sizeof(char *) * MAX_SERIAL_NUM_LENGTH); if (oa_handler->oa_soap_resources.ps_unit.serial_number[i] == NULL) { err("Out of memory"); release_oa_soap_resources(oa_handler); return SA_ERR_HPI_OUT_OF_MEMORY; } } dbg("server bays = %d",oa_handler->oa_soap_resources.server.max_bays); dbg("intercennet bays = %d", oa_handler->oa_soap_resources.interconnect.max_bays); dbg("OA bays = %d",oa_handler->oa_soap_resources.oa.max_bays); dbg("fan bays = %d",oa_handler->oa_soap_resources.fan.max_bays); dbg("power supply bays = %d", oa_handler->oa_soap_resources.ps_unit.max_bays); return SA_OK; } /** * build_enclosure_rpt * @oh_handler: Pointer to openhpi handler * @name: Pointer to the name of the enclosure * @resource_id: Pointer to the resource id * * Purpose: * Builds the enclosure RPT entry. * Pushes the RPT entry to plugin RPTable * * Detailed Description: NA * * Return values: * SA_OK - on success. * SA_ERR_HPI_INVALID_PARAMS - on wrong parameters * SA_ERR_HPI_OUT_OF_MEMORY - on malloc failure * SA_ERR_HPI_INTERNAL_ERROR - on failure. **/ SaErrorT build_enclosure_rpt(struct oh_handler_state *oh_handler, char *name, SaHpiResourceIdT *resource_id) { SaErrorT rv = SA_OK; SaHpiEntityPathT entity_path; struct oa_soap_handler *oa_handler; char *entity_root = NULL; SaHpiRptEntryT rpt; struct rackTopology2 response; struct encLink2 enc; if (oh_handler == NULL || name == NULL || resource_id == NULL) { err("Invalid parameters"); return SA_ERR_HPI_INVALID_PARAMS; } oa_handler = (struct oa_soap_handler *) oh_handler->data; if(oa_handler == NULL) { err("Invalid parameters"); return SA_ERR_HPI_INVALID_PARAMS; } /* Fetch and encode the entity path required for the rpt field */ entity_root = (char *) g_hash_table_lookup(oh_handler->config, "entity_root"); memset(&entity_path, 0, sizeof(SaHpiEntityPathT)); rv = oh_encode_entitypath(entity_root, &entity_path); if (rv != SA_OK) { err("Encoding entity path failed"); return SA_ERR_HPI_INTERNAL_ERROR; } /* Populate the rpt with the details of the enclosure */ memset(&rpt, 0, sizeof(SaHpiRptEntryT)); rpt.ResourceCapabilities = SAHPI_CAPABILITY_RDR | SAHPI_CAPABILITY_RESOURCE | SAHPI_CAPABILITY_SENSOR | SAHPI_CAPABILITY_INVENTORY_DATA | SAHPI_CAPABILITY_CONTROL ; rpt.ResourceEntity.Entry[0].EntityType = SAHPI_ENT_ROOT; rpt.ResourceEntity.Entry[0].EntityLocation = 0; rv = oh_concat_ep(&(rpt.ResourceEntity), &entity_path); if (rv != SA_OK) { err("concat of entity path failed"); return SA_ERR_HPI_INTERNAL_ERROR; } rpt.ResourceSeverity = SAHPI_OK; rpt.ResourceInfo.ManufacturerId = HP_MANUFACTURING_ID; rpt.ResourceSeverity = SAHPI_OK; rpt.ResourceFailed = SAHPI_FALSE; rpt.HotSwapCapabilities = 0x0; rpt.ResourceTag.DataType = SAHPI_TL_TYPE_TEXT; rpt.ResourceTag.Language = SAHPI_LANG_ENGLISH; rpt.ResourceTag.DataLength = strlen(name) + 1; memset(rpt.ResourceTag.Data, 0, SAHPI_MAX_TEXT_BUFFER_LENGTH); snprintf((char *) (rpt.ResourceTag.Data), strlen(name) + 1, "%s", name); rpt.ResourceId = oh_uid_from_entity_path(&(rpt.ResourceEntity)); /* getRackTopology2 soap call is supported starting with OA firmware * version 2.20 */ if (get_oa_fw_version(oh_handler) >= OA_2_20) { rv = soap_getRackTopology2(oa_handler->active_con, &response); if (rv != SOAP_OK) { err("Get rack topology2 call failed"); return SA_ERR_HPI_INTERNAL_ERROR; } soap_getEncLink2(response.enclosures, &enc); rpt.ResourceInfo.ProductId = enc.productId; } /* Add the enclosure rpt to the plugin RPTable */ rv = oh_add_resource(oh_handler->rptcache, &rpt, NULL, 0); if (rv != SA_OK) { err("Failed to Add Enclosure Resource"); return rv; } *resource_id = rpt.ResourceId; return SA_OK; } /** * build_enclosure_rdr * @oh_handler: Pointer to openhpi handler. * @con: Pointer to the soap client handler. * @response: Pointer to enclosure info response structure. * @resource_id: Resource id * * Purpose: * Populate the enclosure RDR. * Pushes the RDR entry to plugin RPTable * * Detailed Description: * - Creates the enclosure inventory RDR * - Creates the temperature, operational status, predictive failure, * internal data error, device failure error, device degraded error, * redundancy error and device not supported sensor RDR * - Creates UID control RDR * * Return values: * SA_OK - on success. * SA_ERR_HPI_INVALID_PARAMS - on wrong parameters * SA_ERR_HPI_OUT_OF_MEMORY - on out of memory * SA_ERR_HPI_INTERNAL_ERROR - on failure. **/ SaErrorT build_enclosure_rdr(struct oh_handler_state *oh_handler, SOAP_CON *con, struct enclosureInfo *response, SaHpiResourceIdT resource_id) { SaErrorT rv = SA_OK; SaHpiRdrT rdr; struct oa_soap_inventory *inventory = NULL; struct oa_soap_sensor_info *sensor_info = NULL; struct enclosureStatus status_response; struct getThermalInfo thermal_request; struct thermalInfo thermal_response; SaHpiBoolT event_support = SAHPI_FALSE; SaHpiInt32T sensor_status; enum diagnosticStatus diag_ex_status[OA_SOAP_MAX_DIAG_EX]; if (oh_handler == NULL || con == NULL || response == NULL) { err("Invalid parameters"); return SA_ERR_HPI_INVALID_PARAMS; } /* Build inventory rdr for the enclosure */ memset(&rdr, 0, sizeof(SaHpiRdrT)); rv = build_enclosure_inv_rdr(oh_handler, response, &rdr, &inventory); if (rv != SA_OK) { err("Failed to Add enclosure inventory RDR"); return rv; } rv = oh_add_rdr(oh_handler->rptcache, resource_id, &rdr, inventory, 0); if (rv != SA_OK) { err("Failed to add rdr"); return rv; } /* Make a soap call to OA requesting for the enclosure thermal status */ thermal_request.sensorType = SENSOR_TYPE_ENC; thermal_request.bayNumber = 1; rv = soap_getThermalInfo(con, &thermal_request, &thermal_response); if (rv != SOAP_OK) { err("Get thermalInfo failed for enclosure"); return SA_ERR_HPI_INTERNAL_ERROR; } /* Build thermal sensor rdr for the enclosure */ OA_SOAP_BUILD_THRESHOLD_SENSOR_RDR(OA_SOAP_SEN_TEMP_STATUS, thermal_response) /* Make a soap call to OA requesting for the enclosure status */ rv = soap_getEnclosureStatus(con, &status_response); if (rv != SOAP_OK) { err("Get enclosure status soap call failed"); return SA_ERR_HPI_INTERNAL_ERROR; } /* Build operational status sensor rdr */ OA_SOAP_BUILD_ENABLE_SENSOR_RDR(OA_SOAP_SEN_OPER_STATUS, status_response.operationalStatus) /* Build predictive failure sensor rdr */ OA_SOAP_BUILD_ENABLE_SENSOR_RDR(OA_SOAP_SEN_PRED_FAIL, status_response.operationalStatus) /* Build internal data error sensor rdr */ OA_SOAP_BUILD_ENABLE_SENSOR_RDR(OA_SOAP_SEN_INT_DATA_ERR, status_response.diagnosticChecks. internalDataError) /* Build device failure error sensor rdr */ OA_SOAP_BUILD_ENABLE_SENSOR_RDR(OA_SOAP_SEN_DEV_FAIL, status_response.diagnosticChecks. deviceFailure) /* Build device degraded error sensor rdr */ OA_SOAP_BUILD_ENABLE_SENSOR_RDR(OA_SOAP_SEN_DEV_DEGRAD, status_response.diagnosticChecks. deviceDegraded) /* Build redundancy error sensor rdr */ OA_SOAP_BUILD_ENABLE_SENSOR_RDR(OA_SOAP_SEN_REDUND_ERR, status_response.diagnosticChecks. redundancy) /* Parse the diganosticChecksEx */ oa_soap_parse_diag_ex(status_response.diagnosticChecksEx, diag_ex_status); /* Build device not supported sensor rdr */ OA_SOAP_BUILD_ENABLE_SENSOR_RDR(OA_SOAP_SEN_DEV_NOT_SUPPORT, diag_ex_status[DIAG_EX_DEV_NOT_SUPPORT]) /* Build UID control rdr for Enclosure */ OA_SOAP_BUILD_CONTROL_RDR(OA_SOAP_UID_CNTRL) return SA_OK; } /** * discover_enclosure * @oh_handler: Pointer to openhpi handler * * Purpose: * Discovers the enclosure. * * Detailed Description: NA * * Return values: * SA_OK - on success. * SA_ERR_HPI_INVALID_PARAMS - on wrong parameters * SA_ERR_HPI_INTERNAL_ERROR - on failure. **/ SaErrorT discover_enclosure(struct oh_handler_state *oh_handler) { SaErrorT rv = SA_OK; struct oa_soap_handler *oa_handler = NULL; struct enclosureInfo response; SaHpiResourceIdT resource_id; if (oh_handler == NULL) { err("Invalid parameters"); return SA_ERR_HPI_INVALID_PARAMS; } oa_handler = (struct oa_soap_handler *) oh_handler->data; /* Make a soap call to OA requesting for the enclosure information */ rv = soap_getEnclosureInfo(oa_handler->active_con, &response); if (rv != SOAP_OK) { err("Get enclosure info failed"); return SA_ERR_HPI_INTERNAL_ERROR; } /* Retrieve the enclosure information */ rv = oa_soap_build_enc_info(oh_handler, &response); if (rv != SA_OK) { err("build enclosure info failed"); return rv; } rv = build_enclosure_rpt(oh_handler, response.name, &resource_id); if (rv != SA_OK) { err("build enclosure rpt failed"); return rv; } /* Save enclosure resource id */ oa_handler->oa_soap_resources.enclosure_rid = resource_id; /* SOAP call has been made while building the rpt, so the response * structure is not valid any more. Get the information again. */ rv = soap_getEnclosureInfo(oa_handler->active_con, &response); if (rv != SOAP_OK) { err("Get enclosure info failed"); return SA_ERR_HPI_INTERNAL_ERROR; } rv = build_enclosure_rdr(oh_handler, oa_handler->active_con, &response, resource_id); if (rv != SA_OK) { err("build enclosure rdr failed"); return rv; } return SA_OK; } /** * build_oa_rpt * @oh_handler: Pointer to openhpi handler * @bay_number: Bay number of the OA * @resource_id: Pointer to the resource Id * * Purpose: * Populate the OA RPT entry. * Pushes the RPT entry to plugin RPTable * * Detailed Description: NA * * Return values: * SA_OK - on success. * SA_ERR_HPI_INVALID_PARAMS - on wrong parameters * SA_ERR_HPI_INTERNAL_ERROR - on failure. **/ SaErrorT build_oa_rpt(struct oh_handler_state *oh_handler, SaHpiInt32T bay_number, SaHpiResourceIdT *resource_id) { SaErrorT rv = SA_OK; SaHpiEntityPathT entity_path; char *entity_root = NULL; SaHpiRptEntryT rpt; if (oh_handler == NULL || resource_id == NULL) { err("Invalid parameters"); return SA_ERR_HPI_INVALID_PARAMS; } entity_root = (char *) g_hash_table_lookup(oh_handler->config, "entity_root"); rv = oh_encode_entitypath(entity_root, &entity_path); if (rv != SA_OK) { err("Encoding entity path failed"); return SA_ERR_HPI_INTERNAL_ERROR; } /* Populate the rpt with the details of the enclosure */ memset(&rpt, 0, sizeof(SaHpiRptEntryT)); rpt.ResourceCapabilities = SAHPI_CAPABILITY_RDR | SAHPI_CAPABILITY_RESOURCE | SAHPI_CAPABILITY_FRU | SAHPI_CAPABILITY_SENSOR | SAHPI_CAPABILITY_INVENTORY_DATA | SAHPI_CAPABILITY_CONTROL ; rpt.ResourceEntity.Entry[1].EntityType = SAHPI_ENT_ROOT; rpt.ResourceEntity.Entry[1].EntityLocation = 0; rpt.ResourceEntity.Entry[0].EntityType = SAHPI_ENT_SYS_MGMNT_MODULE; rpt.ResourceEntity.Entry[0].EntityLocation = bay_number; rv = oh_concat_ep(&(rpt.ResourceEntity), &entity_path); if (rv != SA_OK) { err("concat of entity path failed"); return SA_ERR_HPI_INTERNAL_ERROR; } rpt.ResourceId = oh_uid_from_entity_path(&(rpt.ResourceEntity)); rpt.ResourceInfo.ManufacturerId = HP_MANUFACTURING_ID; rpt.ResourceSeverity = SAHPI_OK; rpt.ResourceFailed = SAHPI_FALSE; rpt.HotSwapCapabilities = 0x0; rpt.ResourceTag.DataType = SAHPI_TL_TYPE_TEXT; rpt.ResourceTag.Language = SAHPI_LANG_ENGLISH; rpt.ResourceTag.DataLength = strlen(OA_NAME) + 1; memset(rpt.ResourceTag.Data, 0, SAHPI_MAX_TEXT_BUFFER_LENGTH); snprintf((char *) (rpt.ResourceTag.Data), strlen(OA_NAME) + 1, OA_NAME); /* Add the OA rpt to the plugin RPTable */ rv = oh_add_resource(oh_handler->rptcache, &rpt, NULL, 0); if (rv != SA_OK) { err("Failed to Add OA RPT"); return rv; } *resource_id = rpt.ResourceId; return SA_OK; } /** * build_oa_rdr * @oh_handler: Pointer to openhpi handler. * @con: Pointer to the soap client handler. * @response: Pointer OA info response structure. * @resource_id: Resource id * * Purpose: * Populates the OA RDRs * Pushes the RDR entry to plugin RPTable * * Detailed Description: * - Creates the inventory RDR * - Creates the temperature, operational status, predictive failure, * internal data error, management processor error, device failure error, * device degraded error, redundancy error, device not supported and OA * link status sensor RDR * - Creates UID control RDR * * Return values: * SA_OK - on success. * SA_ERR_HPI_INVALID_PARAMS - on wrong parameters * SA_ERR_HPI_OUT_OF_MEMORY - on malloc failure * SA_ERR_HPI_INTERNAL_ERROR - on failure. **/ SaErrorT build_oa_rdr(struct oh_handler_state *oh_handler, SOAP_CON *con, SaHpiInt32T bay_number, struct oaInfo *response, SaHpiResourceIdT resource_id) { SaErrorT rv = SA_OK; SaHpiRdrT rdr; struct oa_soap_inventory *inventory = NULL; struct oa_soap_sensor_info *sensor_info=NULL; struct getThermalInfo thermal_request; struct thermalInfo thermal_response; SaHpiBoolT event_support = SAHPI_FALSE; struct getOaStatus status_request; struct oaStatus status_response; struct getOaNetworkInfo nw_info_request; struct oaNetworkInfo nw_info_response; SaHpiInt32T sensor_status; enum diagnosticStatus diag_ex_status[OA_SOAP_MAX_DIAG_EX]; if (oh_handler == NULL || con == NULL || response == NULL) { err("Invalid parameters"); return SA_ERR_HPI_INVALID_PARAMS; } /* Build inventory rdr for OA */ memset(&rdr, 0, sizeof(SaHpiRdrT)); rv = build_oa_inv_rdr(oh_handler, response, &rdr, &inventory); if (rv != SA_OK) { err("Failed to build OA inventory RDR"); return rv; } rv = oh_add_rdr(oh_handler->rptcache, resource_id, &rdr, inventory, 0); if (rv != SA_OK) { err("Failed to add rdr"); return rv; } /* Make a soap call to OA requesting for the OA thermal status */ thermal_request.sensorType = SENSOR_TYPE_OA; thermal_request.bayNumber = bay_number; rv = soap_getThermalInfo(con, &thermal_request, &thermal_response); if (rv != SOAP_OK) { err("Get thermalInfo failed for enclosure"); return SA_ERR_HPI_INTERNAL_ERROR; } /* Build thermal sensor rdr for the enclosure */ OA_SOAP_BUILD_THRESHOLD_SENSOR_RDR(OA_SOAP_SEN_TEMP_STATUS, thermal_response) /* Build UID control rdr for OA */ OA_SOAP_BUILD_CONTROL_RDR(OA_SOAP_UID_CNTRL) status_request.bayNumber = response->bayNumber; rv = soap_getOaStatus(con, &status_request, &status_response); if (rv != SOAP_OK) { err("Get OA status failed"); return SA_ERR_HPI_INTERNAL_ERROR; } /* Build operational status sensor rdr */ OA_SOAP_BUILD_ENABLE_SENSOR_RDR(OA_SOAP_SEN_OPER_STATUS, status_response.operationalStatus) /* Build predictive failure sensor rdr */ OA_SOAP_BUILD_ENABLE_SENSOR_RDR(OA_SOAP_SEN_PRED_FAIL, status_response.operationalStatus) /* Build OA redundancy sensor rdr */ OA_SOAP_BUILD_ENABLE_SENSOR_RDR(OA_SOAP_SEN_OA_REDUND, status_response.oaRedundancy) /* Build internal data error sensor rdr */ OA_SOAP_BUILD_ENABLE_SENSOR_RDR(OA_SOAP_SEN_INT_DATA_ERR, status_response.diagnosticChecks. internalDataError) /* Build management processor error sensor rdr */ OA_SOAP_BUILD_ENABLE_SENSOR_RDR(OA_SOAP_SEN_MP_ERR, status_response.diagnosticChecks. managementProcessorError) /* Build device failure error sensor rdr */ OA_SOAP_BUILD_ENABLE_SENSOR_RDR(OA_SOAP_SEN_DEV_FAIL, status_response.diagnosticChecks. deviceFailure) /* Build device degraded error sensor rdr */ OA_SOAP_BUILD_ENABLE_SENSOR_RDR(OA_SOAP_SEN_DEV_DEGRAD, status_response.diagnosticChecks. deviceDegraded) /* Build redundancy error sensor rdr */ OA_SOAP_BUILD_ENABLE_SENSOR_RDR(OA_SOAP_SEN_REDUND_ERR, status_response.diagnosticChecks. redundancy) /* Parse the diganosticChecksEx */ oa_soap_parse_diag_ex(status_response.diagnosticChecksEx, diag_ex_status); /* Build firmware mismatch sensor rdr */ OA_SOAP_BUILD_ENABLE_SENSOR_RDR(OA_SOAP_SEN_FW_MISMATCH, diag_ex_status[DIAG_EX_FW_MISMATCH]) /* Build device not supported sensor rdr */ OA_SOAP_BUILD_ENABLE_SENSOR_RDR(OA_SOAP_SEN_DEV_NOT_SUPPORT, diag_ex_status[DIAG_EX_DEV_NOT_SUPPORT]) nw_info_request.bayNumber = response->bayNumber; rv = soap_getOaNetworkInfo(con, &nw_info_request, &nw_info_response); if (rv != SOAP_OK) { err("Get OA network info SOAP call failed"); return SA_ERR_HPI_INTERNAL_ERROR; } /* Build OA link status sensor rdr */ OA_SOAP_BUILD_ENABLE_SENSOR_RDR(OA_SOAP_SEN_OA_LINK_STATUS, nw_info_response.linkActive) return SA_OK; } /** * discover_oa * @oh_handler: Pointer to openhpi handler * * Purpose: * Discover the OA. * * Detailed Description: NA * * Return values: * SA_OK - on success. * SA_ERR_HPI_INVALID_PARAMS - on wrong parameters * SA_ERR_HPI_INTERNAL_ERROR - on failure. **/ SaErrorT discover_oa(struct oh_handler_state *oh_handler) { SaErrorT rv = SA_OK; struct oa_soap_handler *oa_handler = NULL; struct getOaInfo request; struct oaInfo response; struct getOaStatus status_request; struct oaStatus status_response; SaHpiInt32T i = 0; SaHpiResourceIdT resource_id; if (oh_handler == NULL) { err("Invalid parameters"); return SA_ERR_HPI_INVALID_PARAMS; } oa_handler = (struct oa_soap_handler *)oh_handler->data; for (i = 1; i <= oa_handler->oa_soap_resources.oa.max_bays; i++) { status_request.bayNumber = i; rv = soap_getOaStatus(oa_handler->active_con, &status_request, &status_response); if (rv != SOAP_OK) { err("Get OA status failed"); return SA_ERR_HPI_INTERNAL_ERROR; } /* Sometimes, if the OA is absent, then OA status is shown as * STANDBY in getOaStatus response. As workaround, if OA * status is STANDBY and oaRedudancy state is set to false, * Then, it is considered as ABSENT. * * But, if the OA is recently inserted, then oaRedudancy state * will be set to false. In this scenario, the OA state will * be wrongly considered as ABSENT. This is a known limitation * * TODO: Remove this workaround once the fix is available in OA * firmware */ if ((status_response.oaRole == OA_ABSENT) || (status_response.oaRole == STANDBY && status_response.oaRedundancy == HPOA_FALSE)) { /* Update the OA status as absent */ switch (i) { case 1: oa_handler->oa_1->oa_status = OA_ABSENT; break; case 2: oa_handler->oa_2->oa_status = OA_ABSENT; break; default: err("Wrong OA slot number - %d", i); return SA_ERR_HPI_INTERNAL_ERROR; } /* If resource not present, continue checking for * next bay */ dbg("OA %d is not present", i); continue; } request.bayNumber = i; rv = soap_getOaInfo(oa_handler->active_con, &request, &response); if (rv != SOAP_OK) { err("Get OA Info failed"); return SA_ERR_HPI_INTERNAL_ERROR; } /* If the OA is not yet stable, then getOaInfo response * structure will not have proper information. Abort the * discovery and let the OA to stabilize. The discovery will be * called by the openhpi framework after 3 minutes */ if (response.serialNumber == NULL) { err("OA %d is not yet stabilized", i); err("Discovery is aborted"); err("Discovery will happen after 3 minutes"); return SA_ERR_HPI_INTERNAL_ERROR; } /* Build rpt entry for OA */ rv = build_oa_rpt(oh_handler, i, &resource_id); if (rv != SA_OK) { err("Failed to build OA RPT"); return rv; } /* Update the OA firmware version to RPT entry */ rv = update_oa_info(oh_handler, &response, resource_id); if (rv != SA_OK) { err("Failed to update OA RPT"); return rv; } /* Update resource_status structure with resource_id, serial_number, and presence status */ oa_soap_update_resource_status( &oa_handler->oa_soap_resources.oa, i, response.serialNumber, resource_id, RES_PRESENT); /* Build RDRs for OA */ rv = build_oa_rdr(oh_handler, oa_handler->active_con, i, &response, resource_id); if (rv != SA_OK) { err("Failed to build OA RDR"); /* Reset resource_status structure to default values */ oa_soap_update_resource_status( &oa_handler->oa_soap_resources.oa, i, "", SAHPI_UNSPECIFIED_RESOURCE_ID, RES_ABSENT); return rv; } } /* End of for loop */ return SA_OK; } /** * build_discovered_server_rpt * @oh_handler: Pointer to openhpi handler * @con: Pointer to the soap client handler * @response: Pointer to the bladeInfo structure * @resource_id: Pointer to the resource id * * Purpose: * Populate the server blade RPT with aid of build_server_rpt() and add * hotswap state information to the returned rpt. * Pushes the RPT entry to plugin RPTable * * Detailed Description: NA * * Return values: * SA_OK - on success. * SA_ERR_HPI_INVALID_PARAMS - on wrong parameters * SA_ERR_HPI_OUT_OF_MEMORY - on malloc failure * SA_ERR_HPI_INTERNAL_ERROR - on failure. **/ SaErrorT build_discovered_server_rpt(struct oh_handler_state *oh_handler, SOAP_CON *con, struct bladeInfo *response, SaHpiResourceIdT *resource_id) { SaErrorT rv = SA_OK; SaHpiPowerStateT state; struct oa_soap_hotswap_state *hotswap_state = NULL; SaHpiRptEntryT rpt; if (oh_handler == NULL || con == NULL || response == NULL || resource_id == NULL) { err("Invalid parameters"); return SA_ERR_HPI_INVALID_PARAMS; } if(build_server_rpt(oh_handler, response, &rpt) != SA_OK) { err("Building Server Rpt failed during discovery"); return SA_ERR_HPI_INTERNAL_ERROR; } /* Set power status of discovered blade resource initially as POWER ON*/ oa_soap_bay_pwr_status[response->bayNumber -1] = SAHPI_POWER_ON; /* Get the power state of the server blade to determine the * hotswap state. The hotswap state of the server will be * maintained in the private data area of the server RPT. */ if (rpt.ResourceCapabilities & SAHPI_CAPABILITY_MANAGED_HOTSWAP) { rv = get_server_power_state(con, response->bayNumber, &state); if (rv != SA_OK) { err("Unable to get power status"); return SA_ERR_HPI_INTERNAL_ERROR; } hotswap_state = (struct oa_soap_hotswap_state *) g_malloc0(sizeof(struct oa_soap_hotswap_state)); if (hotswap_state == NULL) { err("Out of memory"); return SA_ERR_HPI_OUT_OF_MEMORY; } switch (state) { case SAHPI_POWER_ON: case SAHPI_POWER_CYCLE: hotswap_state->currentHsState = SAHPI_HS_STATE_ACTIVE; break; case SAHPI_POWER_OFF: hotswap_state->currentHsState = SAHPI_HS_STATE_INACTIVE; /* Change the power state to POWER OFF for * blade entry in oa_soap_bay_pwr_status array */ oa_soap_bay_pwr_status[response->bayNumber -1] = SAHPI_POWER_OFF; break; default: err("unknown power status"); if (hotswap_state != NULL) g_free(hotswap_state); return SA_ERR_HPI_INTERNAL_ERROR; } } /* Add the server rpt to the plugin RPTable */ rv = oh_add_resource(oh_handler->rptcache, &rpt, hotswap_state, 0); if (rv != SA_OK) { err("Failed to add Server rpt"); if (hotswap_state != NULL) g_free(hotswap_state); return rv; } *resource_id = rpt.ResourceId; return SA_OK; } /** * build_server_rpt * @oh_handler: Pointer to openhpi handler * @response: Pointer to the bladeInfo structure * @rpt: Pointer to rpt to be filled * * Purpose: * This routine should be called to during discovery/re-discovery phase * and when a new blade gets inserted. It populates the server blade RPT * information common to discovered and insterted blades. The caller will * fill in the information specific to the manner in which the blade was * found. For example, the hotswap state could be different in the case * of discovered vs. inserted blades, because an inserted blade goes * through the pending state, while a discovered blade doesn't. * * Detailed Description: NA * * Return values: * SA_OK - on success * SA_ERR_HPI_INVALID_PARAMS - on wrong parameters * SA_ERR_HPI_OUT_OF_MEMORY - on malloc failure * SA_ERR_HPI_INTERNAL_ERROR - on failure **/ SaErrorT build_server_rpt(struct oh_handler_state *oh_handler, struct bladeInfo *response, SaHpiRptEntryT *rpt) { SaErrorT rv = SA_OK; SaHpiEntityPathT entity_path; char *entity_root = NULL; if (oh_handler == NULL || response == NULL || rpt == NULL) { err("Invalid parameters"); return SA_ERR_HPI_INVALID_PARAMS; } entity_root = (char *) g_hash_table_lookup(oh_handler->config, "entity_root"); rv = oh_encode_entitypath(entity_root, &entity_path); if (rv != SA_OK) { err("Encoding entity path failed"); return SA_ERR_HPI_INTERNAL_ERROR; } /* Populate the rpt with the details of the server */ memset(rpt, 0, sizeof(SaHpiRptEntryT)); rpt->ResourceCapabilities = SAHPI_CAPABILITY_RDR | SAHPI_CAPABILITY_RESET | SAHPI_CAPABILITY_RESOURCE | SAHPI_CAPABILITY_POWER | SAHPI_CAPABILITY_FRU | SAHPI_CAPABILITY_MANAGED_HOTSWAP | SAHPI_CAPABILITY_SENSOR | SAHPI_CAPABILITY_CONTROL | SAHPI_CAPABILITY_INVENTORY_DATA; rpt->ResourceEntity.Entry[1].EntityType = SAHPI_ENT_ROOT; rpt->ResourceEntity.Entry[1].EntityLocation = 0; switch(response->bladeType) { case BLADE_TYPE_SERVER: rpt->ResourceEntity.Entry[0].EntityType = SAHPI_ENT_SYSTEM_BLADE; break; case BLADE_TYPE_IO: rpt->ResourceEntity.Entry[0].EntityType = SAHPI_ENT_IO_BLADE; rpt->ResourceCapabilities &= ~(SAHPI_CAPABILITY_RESET | SAHPI_CAPABILITY_POWER | SAHPI_CAPABILITY_MANAGED_HOTSWAP); break; case BLADE_TYPE_STORAGE: rpt->ResourceEntity.Entry[0].EntityType = SAHPI_ENT_DISK_BLADE; rpt->ResourceCapabilities &= ~(SAHPI_CAPABILITY_RESET | SAHPI_CAPABILITY_POWER | SAHPI_CAPABILITY_MANAGED_HOTSWAP); break; default: err("Invalid blade type: " "expecting server/storage/IO blade"); return SA_ERR_HPI_INTERNAL_ERROR; } rpt->ResourceEntity.Entry[0].EntityLocation= response->bayNumber; rv = oh_concat_ep(&rpt->ResourceEntity, &entity_path); if (rv != SA_OK) { err("internal error (oh_concat_ep call)"); return SA_ERR_HPI_INTERNAL_ERROR; } rpt->ResourceId = oh_uid_from_entity_path(&(rpt->ResourceEntity)); rpt->ResourceInfo.ManufacturerId = HP_MANUFACTURING_ID; rpt->ResourceInfo.ProductId = response->productId; rpt->ResourceSeverity = SAHPI_OK; rpt->ResourceFailed = SAHPI_FALSE; rpt->ResourceTag.DataType = SAHPI_TL_TYPE_TEXT; rpt->ResourceTag.Language = SAHPI_LANG_ENGLISH; rpt->ResourceTag.DataLength = strlen(response->name) + 1; memset(rpt->ResourceTag.Data, 0, SAHPI_MAX_TEXT_BUFFER_LENGTH); snprintf((char *) (rpt->ResourceTag.Data), rpt->ResourceTag.DataLength, "%s", response->name); /* set default hotswap capability */ if (rpt->ResourceCapabilities & SAHPI_CAPABILITY_MANAGED_HOTSWAP) { rpt->HotSwapCapabilities = SAHPI_HS_CAPABILITY_AUTOEXTRACT_READ_ONLY; } else { rpt->HotSwapCapabilities = 0; } return SA_OK; } /** * build_server_rdr * @oh_handler: Pointer to openhpi handler * @con: Pointer to the soap client handler. * @response: Server blade info response structure * @resource_id: Resource id * @name: Blade resource name * * Purpose: * Populate the server blade RDR. * Pushes the RDR entry to plugin RPTable * * Detailed Description: * - Creates the inventory RDR * - Creates the temperature, power, operational status, predictive * failure, internal data error, management processor error, thermal * warning, thermal danger, IO configuration error, device power request * error, insufficient cooling, device location error, device failure * error, device degraded error, device missing, device bonding, device * power sequence, network configuration, profile unassigned error, * device not supported, too low power request, call HP, storage device * missing, power capping error, IML recorded errors, duplicate * management IP address sensor RDR * - Creates UID and power control RDR * * Return values: * SA_OK - on success. * SA_ERR_HPI_INVALID_PARAMS - on wrong parameters * SA_ERR_HPI_OUT_OF_MEMORY - on malloc failure * SA_ERR_HPI_INTERNAL_ERROR - on failure. **/ SaErrorT build_server_rdr(struct oh_handler_state *oh_handler, SOAP_CON *con, SaHpiInt32T bay_number, SaHpiResourceIdT resource_id, char *name) { SaErrorT rv = SA_OK; SaHpiRdrT rdr; SaHpiRptEntryT *rpt = NULL; struct oa_soap_inventory *inventory = NULL; struct oa_soap_sensor_info *sensor_info = NULL; struct getBladeThermalInfoArray thermal_request; struct bladeThermalInfoArrayResponse thermal_response; struct getBladeStatus status_request; struct bladeStatus status_response; SaHpiInt32T sensor_status; enum diagnosticStatus diag_ex_status[OA_SOAP_MAX_DIAG_EX]; if (oh_handler == NULL || con == NULL) { err("Invalid parameter"); return SA_ERR_HPI_INVALID_PARAMS; } rpt = oh_get_resource_by_id (oh_handler->rptcache, resource_id); if (rpt == NULL) { err("INVALID RESOURCE"); return SA_ERR_HPI_INVALID_RESOURCE; } /* Build inventory rdr for server */ memset(&rdr, 0, sizeof(SaHpiRdrT)); rv = build_server_inv_rdr(oh_handler, con, bay_number, &rdr, &inventory); if (rv != SA_OK) { err("Failed to get server inventory RDR"); return rv; } rv = oh_add_rdr(oh_handler->rptcache, resource_id, &rdr, inventory, 0); if (rv != SA_OK) { err("Failed to add rdr"); return rv; } /* Make a soap call to OA requesting for the server thermal status */ thermal_request.bayNumber = bay_number; rv = soap_getBladeThermalInfoArray(con, &thermal_request, &thermal_response); if (rv != SOAP_OK) { err("getBladeThermalInfo failed for blade"); return SA_ERR_HPI_INTERNAL_ERROR; } /* Build the thermal sensors based on the blade name*/ rv = oa_soap_build_blade_thermal_rdr(oh_handler, thermal_response, rpt, name); if (rv != SA_OK) { err("Failed to build thermal rdr"); return SA_ERR_HPI_INTERNAL_ERROR; } /* Build power sensor rdr for server */ OA_SOAP_BUILD_SENSOR_RDR(OA_SOAP_SEN_PWR_STATUS) /* Create power control RDR only for server blades. IO and Storage blades don't support power management. */ if (rpt->ResourceEntity.Entry[0].EntityType == SAHPI_ENT_SYSTEM_BLADE) { /* Build power control rdr for server */ OA_SOAP_BUILD_CONTROL_RDR(OA_SOAP_PWR_CNTRL) } /* Build UID control rdr for server */ OA_SOAP_BUILD_CONTROL_RDR(OA_SOAP_UID_CNTRL) status_request.bayNumber = bay_number; rv = soap_getBladeStatus(con, &status_request, &status_response); if (rv != SOAP_OK) { err("Get thermalInfo failed for enclosure"); return SA_ERR_HPI_INTERNAL_ERROR; } /* Build operational status sensor rdr */ OA_SOAP_BUILD_ENABLE_SENSOR_RDR(OA_SOAP_SEN_OPER_STATUS, status_response.operationalStatus) /* Build predictive failure sensor rdr */ OA_SOAP_BUILD_ENABLE_SENSOR_RDR(OA_SOAP_SEN_PRED_FAIL, status_response.operationalStatus) /* Build internal data error sensor rdr */ OA_SOAP_BUILD_ENABLE_SENSOR_RDR(OA_SOAP_SEN_INT_DATA_ERR, status_response.diagnosticChecks. internalDataError) /* Build management processor error sensor rdr */ OA_SOAP_BUILD_ENABLE_SENSOR_RDR(OA_SOAP_SEN_MP_ERR, status_response.diagnosticChecks. managementProcessorError) /* Build thermal waring sensor rdr */ OA_SOAP_BUILD_ENABLE_SENSOR_RDR(OA_SOAP_SEN_THERM_WARN, status_response.diagnosticChecks. thermalWarning) /* Build thermal danger sensor rdr */ OA_SOAP_BUILD_ENABLE_SENSOR_RDR(OA_SOAP_SEN_THERM_DANGER, status_response.diagnosticChecks. thermalDanger) /* Build IO configuration error sensor rdr */ OA_SOAP_BUILD_ENABLE_SENSOR_RDR(OA_SOAP_SEN_IO_CONFIG_ERR, status_response.diagnosticChecks. ioConfigurationError) /* Build device power request error sensor rdr */ OA_SOAP_BUILD_ENABLE_SENSOR_RDR(OA_SOAP_SEN_DEV_PWR_REQ, status_response.diagnosticChecks. devicePowerRequestError) /* Build insufficient cooling sensor rdr */ OA_SOAP_BUILD_ENABLE_SENSOR_RDR(OA_SOAP_SEN_INSUF_COOL, status_response.diagnosticChecks. insufficientCooling) /* Build device location error sensor rdr */ OA_SOAP_BUILD_ENABLE_SENSOR_RDR(OA_SOAP_SEN_DEV_LOC_ERR, status_response.diagnosticChecks. deviceLocationError) /* Build device failure error sensor rdr */ OA_SOAP_BUILD_ENABLE_SENSOR_RDR(OA_SOAP_SEN_DEV_FAIL, status_response.diagnosticChecks. deviceFailure) /* Build device degraded error sensor rdr */ OA_SOAP_BUILD_ENABLE_SENSOR_RDR(OA_SOAP_SEN_DEV_DEGRAD, status_response.diagnosticChecks. deviceDegraded) /* Parse the diganosticChecksEx */ oa_soap_parse_diag_ex(status_response.diagnosticChecksEx, diag_ex_status); /* Build device missing sensor rdr */ OA_SOAP_BUILD_ENABLE_SENSOR_RDR(OA_SOAP_SEN_DEV_MISS, diag_ex_status[DIAG_EX_DEV_MISS]) /* Build device bonding sensor rdr */ OA_SOAP_BUILD_ENABLE_SENSOR_RDR(OA_SOAP_SEN_DEV_BOND, diag_ex_status[DIAG_EX_DEV_BOND]) /* Build device power sequence sensor rdr */ OA_SOAP_BUILD_ENABLE_SENSOR_RDR(OA_SOAP_SEN_DEV_PWR_SEQ, diag_ex_status[DIAG_EX_DEV_PWR_SEQ]) /* Build network configuration sensor rdr */ OA_SOAP_BUILD_ENABLE_SENSOR_RDR(OA_SOAP_SEN_NET_CONFIG, diag_ex_status[DIAG_EX_NET_CONFIG]) /* Build profile unassigned error sensor rdr */ OA_SOAP_BUILD_ENABLE_SENSOR_RDR(OA_SOAP_SEN_PROF_UNASSIGN_ERR, diag_ex_status[DIAG_EX_PROF_UNASSIGN_ERR]) /* Build Device not supported sensor rdr */ OA_SOAP_BUILD_ENABLE_SENSOR_RDR(OA_SOAP_SEN_DEV_NOT_SUPPORT, diag_ex_status[DIAG_EX_DEV_NOT_SUPPORT]) /* Build Too low power request sensor rdr */ OA_SOAP_BUILD_ENABLE_SENSOR_RDR(OA_SOAP_SEN_TOO_LOW_PWR_REQ, diag_ex_status[DIAG_EX_TOO_LOW_PWR_REQ]) /* Build Call HP sensor rdr */ OA_SOAP_BUILD_ENABLE_SENSOR_RDR(OA_SOAP_SEN_CALL_HP, diag_ex_status[DIAG_EX_CALL_HP]) /* Build Storage device missing sensor rdr */ OA_SOAP_BUILD_ENABLE_SENSOR_RDR(OA_SOAP_SEN_STORAGE_DEV_MISS, diag_ex_status[DIAG_EX_STORAGE_DEV_MISS]) /* Build Power capping error sensor rdr */ OA_SOAP_BUILD_ENABLE_SENSOR_RDR(OA_SOAP_SEN_GRPCAP_ERR, diag_ex_status[DIAG_EX_GRPCAP_ERR]) /* Build IML recorded errors sensor rdr */ OA_SOAP_BUILD_ENABLE_SENSOR_RDR(OA_SOAP_SEN_IML_ERR, diag_ex_status[DIAG_EX_IML_ERR]) /* Build Duplicate management IP address sensor rdr */ OA_SOAP_BUILD_ENABLE_SENSOR_RDR(OA_SOAP_SEN_DUP_MGMT_IP_ADDR, diag_ex_status[DIAG_EX_DUP_MGMT_IP_ADDR]) return SA_OK; } /** * discover_server * @oh_handler: Pointer to openhpi handler * * Purpose: * Discover the server. * * Detailed Description: NA * * Return values: * SA_OK - on success. * SA_ERR_HPI_INVALID_PARAMS - on wrong parameters * SA_ERR_HPI_INTERNAL_ERROR - on failure. **/ SaErrorT discover_server(struct oh_handler_state *oh_handler) { SaErrorT rv = SA_OK; SaHpiInt32T i; struct oa_soap_handler *oa_handler = NULL; struct getBladeInfo request; struct bladeInfo response; SaHpiResourceIdT resource_id; char blade_name[MAX_NAME_LEN]; if (oh_handler == NULL) { err("Invalid parameters"); return SA_ERR_HPI_INVALID_PARAMS; } oa_handler = (struct oa_soap_handler *) oh_handler->data; /* Discover the blades present in server bays */ for (i = 1; i <= oa_handler->oa_soap_resources.server.max_bays; i++) { request.bayNumber = i; /* Make a soap call to get the information of blade in the * current bay */ rv = soap_getBladeInfo(oa_handler->active_con, &request, &response); if (rv != SOAP_OK) { err("Get blade info failed"); return rv; } if (response.presence != PRESENT) { /* If resource not present, continue checking for * next bay */ continue; } /* Copy the blade name from response for future processing */ convert_lower_to_upper(response.name, strlen(response.name), blade_name, MAX_NAME_LEN); /* Build rpt entry for server */ rv = build_discovered_server_rpt(oh_handler, oa_handler->active_con, &response, &resource_id); if (rv != SA_OK) { err("Failed to get Server rpt"); return SA_ERR_HPI_INTERNAL_ERROR; } /* Update resource_status structure with resource_id, * serial_number, and presence status */ oa_soap_update_resource_status( &oa_handler->oa_soap_resources.server, i, response.serialNumber, resource_id, RES_PRESENT); /* Build rdr entry for server */ rv = build_server_rdr(oh_handler, oa_handler->active_con, i, resource_id, blade_name); if (rv != SA_OK) { err("Failed to add Server rdr"); /* Reset resource_status structure to default values */ oa_soap_update_resource_status( &oa_handler->oa_soap_resources.server, i, "", SAHPI_UNSPECIFIED_RESOURCE_ID, RES_ABSENT); return SA_ERR_HPI_INTERNAL_ERROR; } } /* End of for loop */ return SA_OK; } /** * build_interconnect_rpt * @oh_handler: Pointer to openhpi handler * @con: Pointer to the soap client handler. * @name: Pointer to the name of the interconnect blade * @bay_number: Bay number of the interconnect blade * @resource_id: Pointer to the resource id * @insetred: flag to indicate if the switch blade is inserted. * TRUE inserted * FALSE not inserted (discovered or re-discovered) * * Purpose: * Populate the interconnect RPT. This routine gets called when a switch * blade is discovered as well as inserted. Hotswap information is * initialized differently for these two cases. * Pushes the RPT entry to plugin RPTable * * Detailed Description: NA * * Return values: * SA_OK - on success. * SA_ERR_HPI_INVALID_PARAMS - on wrong parameters * SA_ERR_HPI_OUT_OF_MEMORY - on malloc failure * SA_ERR_HPI_INTERNAL_ERROR - on failure. **/ SaErrorT build_interconnect_rpt(struct oh_handler_state *oh_handler, SOAP_CON *con, char *name, SaHpiInt32T bay_number, SaHpiResourceIdT *resource_id, int inserted) { SaErrorT rv = SA_OK; SaHpiEntityPathT entity_path; SaHpiPowerStateT state; char *entity_root = NULL; struct oa_soap_hotswap_state *hotswap_state = NULL; SaHpiRptEntryT rpt; char temp[MAX_NAME_LEN]; struct oa_soap_handler *oa_handler; if (oh_handler == NULL || con == NULL || name == NULL || resource_id == NULL) { err("Invalid parameters"); return SA_ERR_HPI_INVALID_PARAMS; } oa_handler = (struct oa_soap_handler *) oh_handler->data; if(oa_handler == NULL) { err("Invalid parameters"); return SA_ERR_HPI_INVALID_PARAMS; } entity_root = (char *) g_hash_table_lookup(oh_handler->config, "entity_root"); rv = oh_encode_entitypath(entity_root, &entity_path); if (rv != SA_OK) { err("Encoding entity path failed"); return SA_ERR_HPI_INTERNAL_ERROR; } /* Populate the rpt with the details of the interconnect */ memset(&rpt, 0, sizeof(SaHpiRptEntryT)); rpt.ResourceCapabilities = SAHPI_CAPABILITY_RDR | SAHPI_CAPABILITY_RESET | SAHPI_CAPABILITY_RESOURCE | SAHPI_CAPABILITY_POWER | SAHPI_CAPABILITY_FRU | SAHPI_CAPABILITY_MANAGED_HOTSWAP | SAHPI_CAPABILITY_SENSOR | SAHPI_CAPABILITY_CONTROL | SAHPI_CAPABILITY_INVENTORY_DATA; rpt.ResourceEntity.Entry[1].EntityType = SAHPI_ENT_ROOT; rpt.ResourceEntity.Entry[1].EntityLocation = 0; rpt.ResourceEntity.Entry[0].EntityType = SAHPI_ENT_SWITCH_BLADE; rpt.ResourceEntity.Entry[0].EntityLocation = bay_number; rv = oh_concat_ep(&(rpt.ResourceEntity), &entity_path); if (rv != SA_OK) { err("concat of entity path failed"); return SA_ERR_HPI_INTERNAL_ERROR; } rpt.ResourceId = oh_uid_from_entity_path(&(rpt.ResourceEntity)); /* Check whether the interconnect blade is from Cisco Systems * TODO: Cisco interconnect blades will have name starting with "Cisco" * If this format gets changed for any reason, * then Cisco interconnect blades will have manufacture id as HP * in ManufacturerId field of rpt entry. * If the interconnect name format changes, * please change the logic accordingly. */ convert_lower_to_upper(name, strlen(name), temp, MAX_NAME_LEN); if (strstr(temp, CISCO) != NULL) rpt.ResourceInfo.ManufacturerId = CISCO_MANUFACTURING_ID; else rpt.ResourceInfo.ManufacturerId = HP_MANUFACTURING_ID; rpt.ResourceSeverity = SAHPI_OK; rpt.ResourceFailed = SAHPI_FALSE; rpt.HotSwapCapabilities = SAHPI_HS_CAPABILITY_AUTOEXTRACT_READ_ONLY; rpt.ResourceTag.DataType = SAHPI_TL_TYPE_TEXT; rpt.ResourceTag.Language = SAHPI_LANG_ENGLISH; rpt.ResourceTag.DataLength = strlen(name) + 1; memset(rpt.ResourceTag.Data, 0, SAHPI_MAX_TEXT_BUFFER_LENGTH); snprintf((char *) (rpt.ResourceTag.Data), rpt.ResourceTag.DataLength, "%s", name); hotswap_state = (struct oa_soap_hotswap_state *) g_malloc0(sizeof(struct oa_soap_hotswap_state)); if (hotswap_state == NULL) { err("Out of memory"); return SA_ERR_HPI_OUT_OF_MEMORY; } if (inserted == TRUE) { /* The interconnect takes nearly 3 seconds to power on after * insertion. Intialize the current hotswap state as * change is handled as part of interconnect status events. */ hotswap_state->currentHsState = SAHPI_HS_STATE_INSERTION_PENDING; } else { /* Get the power state of the interconnect blade to determine * the hotswap state. The hotswap state of the interconnect * shall be maintained in a private data area of the * interconnect RPT. */ rv = get_interconnect_power_state(con, bay_number, &state); if (rv != SA_OK) { err("Unable to get power status"); return rv; } switch (state) { case SAHPI_POWER_ON: hotswap_state->currentHsState = SAHPI_HS_STATE_ACTIVE; break; case SAHPI_POWER_OFF: hotswap_state->currentHsState = SAHPI_HS_STATE_INACTIVE; break; case SAHPI_POWER_CYCLE: default: err("Wrong power state detected"); if (hotswap_state != NULL) g_free(hotswap_state); return SA_ERR_HPI_INTERNAL_ERROR; } } /* Add the interconnect rpt to the plugin RPTable */ rv = oh_add_resource(oh_handler->rptcache, &rpt, hotswap_state, 0); if (rv != SA_OK) { err("Failed to add Interconnect RPT"); if (hotswap_state != NULL) g_free(hotswap_state); return rv; } *resource_id = rpt.ResourceId; return SA_OK; } /** * build_interconnect_rdr * @oh_handler: Pointer to openhpi handler * @con: Pointer to the soap client handler. * @info_response: Interconnect info response structure * @resource_id: Resource id * * Purpose: * Populate the interconnect blade RDR. * Pushes the RDRs to plugin RPTable * * Detailed Description: * - Creates the inventory RDR * - Creates the temperature, operational status, predictive failure, * interconnect CPU fault, interconnect health LED, internal data error, * management processor error, thermal warning, thermal danger, IO * configuration error, device power request error, device failure error, * device degraded error, device not supported, device informational, * device missing, duplicate management IP address, health operational * status and health predictive failure sensor RDR * - Creates UID and power control RDR * * Return values: * SA_OK - on success. * SA_ERR_HPI_INVALID_PARAMS - on wrong parameters * SA_ERR_HPI_INTERNAL_ERROR - on failure. **/ SaErrorT build_interconnect_rdr(struct oh_handler_state *oh_handler, SOAP_CON* con, SaHpiInt32T bay_number, SaHpiResourceIdT resource_id) { SaErrorT rv = SA_OK; struct oa_soap_inventory *inventory = NULL; struct oa_soap_sensor_info *sensor_info = NULL; SaHpiRdrT rdr; struct getThermalInfo thermal_request; struct thermalInfo thermal_response; SaHpiBoolT event_support = SAHPI_FALSE; struct getInterconnectTrayStatus status_request; struct interconnectTrayStatus status_response; enum oa_soap_extra_data_health status; SaHpiInt32T sensor_status; enum diagnosticStatus diag_ex_status[OA_SOAP_MAX_DIAG_EX]; if (oh_handler == NULL || con == NULL) { err("Invalid parameters"); return SA_ERR_HPI_INVALID_PARAMS; } /* Build inventory rdr for interconnect */ memset(&rdr, 0, sizeof(SaHpiRdrT)); rv = build_interconnect_inv_rdr(oh_handler, con, bay_number, &rdr, &inventory); if (rv != SA_OK) { err("Failed to get interconnect inventory RDR"); return SA_ERR_HPI_INTERNAL_ERROR; } rv = oh_add_rdr(oh_handler->rptcache, resource_id, &rdr, inventory, 0); if (rv != SA_OK) { err("Failed to add rdr"); return rv; } /* Make a soap call to OA requesting for the interconnect * thermal status */ thermal_request.sensorType = SENSOR_TYPE_INTERCONNECT; thermal_request.bayNumber = bay_number; rv = soap_getThermalInfo(con, &thermal_request, &thermal_response); if (rv != SOAP_OK) { err("Get thermalInfo failed for enclosure"); return SA_ERR_HPI_INTERNAL_ERROR; } /* Turn event support ON for thermal sensor. * Interconnect is the only resource for which the OA supports * thermal events */ event_support = SAHPI_TRUE; /* Build thermal sensor rdr for interconnect */ OA_SOAP_BUILD_THRESHOLD_SENSOR_RDR(OA_SOAP_SEN_TEMP_STATUS, thermal_response) /* Build power control rdr for server */ OA_SOAP_BUILD_CONTROL_RDR(OA_SOAP_PWR_CNTRL) /* Build UID control rdr for server */ OA_SOAP_BUILD_CONTROL_RDR(OA_SOAP_UID_CNTRL) status_request.bayNumber = bay_number; rv = soap_getInterconnectTrayStatus(con, &status_request, &status_response); if (rv != SOAP_OK) { err("Get Interconnect tray status SOAP call failed"); return SA_ERR_HPI_INTERNAL_ERROR; } /* Build operational status sensor rdr */ OA_SOAP_BUILD_ENABLE_SENSOR_RDR(OA_SOAP_SEN_OPER_STATUS, status_response.operationalStatus) /* Build predictive failure sensor rdr */ OA_SOAP_BUILD_ENABLE_SENSOR_RDR(OA_SOAP_SEN_PRED_FAIL, status_response.operationalStatus) /* Build interconnect CPU fault sensor rdr */ OA_SOAP_BUILD_ENABLE_SENSOR_RDR(OA_SOAP_SEN_CPU_FAULT, status_response.cpuFault) /* Build interconnect health LED sensor rdr */ OA_SOAP_BUILD_ENABLE_SENSOR_RDR(OA_SOAP_SEN_HEALTH_LED, status_response.healthLed) /* Build internal data error sensor rdr */ OA_SOAP_BUILD_ENABLE_SENSOR_RDR(OA_SOAP_SEN_INT_DATA_ERR, status_response.diagnosticChecks. internalDataError) /* Build management processor error sensor rdr */ OA_SOAP_BUILD_ENABLE_SENSOR_RDR(OA_SOAP_SEN_MP_ERR, status_response.diagnosticChecks. managementProcessorError) /* Build thermal waring sensor rdr */ OA_SOAP_BUILD_ENABLE_SENSOR_RDR(OA_SOAP_SEN_THERM_WARN, status_response.diagnosticChecks. thermalWarning) /* Build thermal danger sensor rdr */ OA_SOAP_BUILD_ENABLE_SENSOR_RDR(OA_SOAP_SEN_THERM_DANGER, status_response.diagnosticChecks. thermalDanger) /* Build IO configuration error sensor rdr */ OA_SOAP_BUILD_ENABLE_SENSOR_RDR(OA_SOAP_SEN_IO_CONFIG_ERR, status_response.diagnosticChecks. ioConfigurationError) /* Build device power request error sensor rdr */ OA_SOAP_BUILD_ENABLE_SENSOR_RDR(OA_SOAP_SEN_DEV_PWR_REQ, status_response.diagnosticChecks. devicePowerRequestError) /* Build device failure error sensor rdr */ OA_SOAP_BUILD_ENABLE_SENSOR_RDR(OA_SOAP_SEN_DEV_FAIL, status_response.diagnosticChecks. deviceFailure) /* Build device degraded error sensor rdr */ OA_SOAP_BUILD_ENABLE_SENSOR_RDR(OA_SOAP_SEN_DEV_DEGRAD, status_response.diagnosticChecks. deviceDegraded) /* Parse the diganosticChecksEx structure */ oa_soap_parse_diag_ex(status_response.diagnosticChecksEx, diag_ex_status); /* Build device not supported sensor rdr */ OA_SOAP_BUILD_ENABLE_SENSOR_RDR(OA_SOAP_SEN_DEV_NOT_SUPPORT, diag_ex_status[DIAG_EX_DEV_NOT_SUPPORT]) /* Build Device informational sensor rdr */ OA_SOAP_BUILD_ENABLE_SENSOR_RDR(OA_SOAP_SEN_DEV_INFO, diag_ex_status[DIAG_EX_DEV_INFO]) /* Build Storage device missing sensor rdr */ OA_SOAP_BUILD_ENABLE_SENSOR_RDR(OA_SOAP_SEN_STORAGE_DEV_MISS, diag_ex_status[DIAG_EX_STORAGE_DEV_MISS]) /* Build Duplicate management IP address sensor rdr */ OA_SOAP_BUILD_ENABLE_SENSOR_RDR(OA_SOAP_SEN_DUP_MGMT_IP_ADDR, diag_ex_status[DIAG_EX_DUP_MGMT_IP_ADDR]) /* Get the healthStatus enum from extraData structure */ oa_soap_get_health_val(status_response.extraData, &status); /* Build health status operational sensor */ OA_SOAP_BUILD_ENABLE_SENSOR_RDR(OA_SOAP_SEN_HEALTH_OPER, status) /* Build health status predictive failure sensor */ OA_SOAP_BUILD_ENABLE_SENSOR_RDR(OA_SOAP_SEN_HEALTH_PRED_FAIL, status) return SA_OK; } /** * discover_interconnect * @oh_handler: Pointer to openhpi handler * * Purpose: * Discover the interconnect blade. * * Detailed Description: NA * * Return values: * SA_OK - on success. * SA_ERR_HPI_INVALID_PARAMS - on wrong parameters * SA_ERR_HPI_INTERNAL_ERROR - on failure. **/ SaErrorT discover_interconnect(struct oh_handler_state *oh_handler) { SaErrorT rv = SA_OK; SaHpiInt32T i; struct getInterconnectTrayInfo info_request; struct interconnectTrayInfo info_response; struct getInterconnectTrayStatus status_request; struct interconnectTrayStatus status_response; struct oa_soap_handler *oa_handler = NULL; SaHpiResourceIdT resource_id; if (oh_handler == NULL) { err("Invalid parameters"); return SA_ERR_HPI_INVALID_PARAMS; } oa_handler = (struct oa_soap_handler *) oh_handler->data; for (i = 1; i <= oa_handler->oa_soap_resources.interconnect.max_bays; i++) { status_request.bayNumber = i; rv = soap_getInterconnectTrayStatus(oa_handler->active_con, &status_request, &status_response); if (rv != SOAP_OK) { err("Get Interconnect tray status failed"); return SA_ERR_HPI_INTERNAL_ERROR; } /* If resource not present, continue checking for next bay */ if (status_response.presence != PRESENT) { continue; } info_request.bayNumber = i; rv = soap_getInterconnectTrayInfo(oa_handler->active_con, &info_request, &info_response); if (rv != SOAP_OK) { err("Get Interconnect tray info failed"); return SA_ERR_HPI_INTERNAL_ERROR; } /* Build rpt entry for interconnect */ rv = build_interconnect_rpt(oh_handler, oa_handler->active_con, info_response.name, i, &resource_id, FALSE); if (rv != SA_OK) { err("Failed to get interconnect RPT"); return rv; } /* Update resource_status structure with resource_id, * serial_number, and presence status */ oa_soap_update_resource_status( &oa_handler->oa_soap_resources.interconnect, i, info_response.serialNumber, resource_id, RES_PRESENT); /* Build rdr entry for interconnect */ rv = build_interconnect_rdr(oh_handler, oa_handler->active_con, i, resource_id); if (rv != SA_OK) { err("Failed to get interconnect RDR"); /* Reset resource_status structure to default values */ oa_soap_update_resource_status( &oa_handler->oa_soap_resources.interconnect, i, "", SAHPI_UNSPECIFIED_RESOURCE_ID, RES_ABSENT); return rv; } } return SA_OK; } /** * build_power_subsystem_rpt * @oh_handler: Pointer to openhpi handler * @name: Pointer to the name of the Power subsystem * @resource_id: Pointer to the resource id * * Purpose: * Populate the power supply RPT. * Pushes the RPT entry to plugin RPTable * * Detailed Description: NA * * Return values: * SA_OK - on success. * SA_ERR_HPI_INVALID_PARAMS - on wrong parameters * SA_ERR_HPI_INTERNAL_ERROR - on failure. **/ SaErrorT build_power_subsystem_rpt(struct oh_handler_state *oh_handler, char *name, SaHpiResourceIdT *resource_id) { SaErrorT rv = SA_OK; SaHpiEntityPathT entity_path; char *entity_root = NULL; SaHpiRptEntryT rpt; if (oh_handler == NULL || name == NULL || resource_id == NULL) { err("Invalid parameters"); return SA_ERR_HPI_INVALID_PARAMS; } /* Fetch and encode the entity path required for the rpt field */ entity_root = (char *) g_hash_table_lookup(oh_handler->config, "entity_root"); rv = oh_encode_entitypath(entity_root, &entity_path); if (rv != SA_OK) { err("Encoding entity path failed"); return SA_ERR_HPI_INTERNAL_ERROR; } /* Populate the rpt with the details of the power subsystem */ memset(&rpt, 0, sizeof(SaHpiRptEntryT)); rpt.ResourceCapabilities = SAHPI_CAPABILITY_RDR | SAHPI_CAPABILITY_RESOURCE | SAHPI_CAPABILITY_SENSOR; rpt.ResourceEntity.Entry[1].EntityType = SAHPI_ENT_ROOT; rpt.ResourceEntity.Entry[1].EntityLocation = 0; rpt.ResourceEntity.Entry[0].EntityType = SAHPI_ENT_POWER_MGMNT; rpt.ResourceEntity.Entry[0].EntityLocation = 1; rv = oh_concat_ep(&(rpt.ResourceEntity), &entity_path); if (rv != SA_OK) { err("concat of entity path failed"); return SA_ERR_HPI_INTERNAL_ERROR; } rpt.ResourceId = oh_uid_from_entity_path(&(rpt.ResourceEntity)); rpt.ResourceInfo.ManufacturerId = HP_MANUFACTURING_ID; rpt.ResourceSeverity = SAHPI_OK; rpt.ResourceFailed = SAHPI_FALSE; rpt.HotSwapCapabilities = 0x0; rpt.ResourceTag.DataType = SAHPI_TL_TYPE_TEXT; rpt.ResourceTag.Language = SAHPI_LANG_ENGLISH; rpt.ResourceTag.DataLength = strlen(name) + 1; memset(rpt.ResourceTag.Data, 0, SAHPI_MAX_TEXT_BUFFER_LENGTH); snprintf((char *) (rpt.ResourceTag.Data), rpt.ResourceTag.DataLength, "%s", name); /* Add the power subsystem rpt to the plugin RPTable */ rv = oh_add_resource(oh_handler->rptcache, &rpt, NULL, 0); if (rv != SA_OK) { err("Failed to add Power Subsystem RPT"); return rv; } *resource_id = rpt.ResourceId; return SA_OK; } /** * build_power_subsystem_rdr * @oh_handler: Pointer to openhpi handler * @resource_id: Resource id * * Purpose: * Populate the power supply RDR. * Pushes the RDR entry to plugin RPTable * * Detailed Description: * - Creates the input power, output power, power status, power capacity, * operational status, predictive failure and redundancy sensor RDR * * Return values: * SA_OK - on success. * SA_ERR_HPI_INVALID_PARAMS - on wrong parameters * SA_ERR_HPI_INTERNAL_ERROR - on failure. **/ SaErrorT build_power_subsystem_rdr(struct oh_handler_state *oh_handler, SaHpiResourceIdT resource_id) { SaErrorT rv = SA_OK; SaHpiRdrT rdr; struct oa_soap_sensor_info *sensor_info = NULL; struct oa_soap_handler *oa_handler; struct powerSubsystemInfo response; SaHpiInt32T sensor_status; if (oh_handler == NULL) { err("Invalid parameter"); return SA_ERR_HPI_INVALID_PARAMS; } oa_handler = (struct oa_soap_handler *) oh_handler->data; /* Build the input power sensor RDR */ OA_SOAP_BUILD_SENSOR_RDR(OA_SOAP_SEN_IN_PWR) /* Build the ouput power sensor RDR */ OA_SOAP_BUILD_SENSOR_RDR(OA_SOAP_SEN_OUT_PWR) /* Build the power consumed sensor RDR */ OA_SOAP_BUILD_SENSOR_RDR(OA_SOAP_SEN_PWR_STATUS) /* Build the power capacity sensor RDR */ OA_SOAP_BUILD_SENSOR_RDR(OA_SOAP_SEN_PWR_CAPACITY) rv = soap_getPowerSubsystemInfo(oa_handler->active_con, &response); if (rv != SOAP_OK) { err("Get power subsystem info SOAP call failed"); return SA_ERR_HPI_INTERNAL_ERROR; } /* Build operational status sensor rdr */ OA_SOAP_BUILD_ENABLE_SENSOR_RDR(OA_SOAP_SEN_OPER_STATUS, response.operationalStatus) /* Build predictive failure sensor rdr */ OA_SOAP_BUILD_ENABLE_SENSOR_RDR(OA_SOAP_SEN_PRED_FAIL, response.operationalStatus) /* Build redundancy sensor rdr */ OA_SOAP_BUILD_ENABLE_SENSOR_RDR(OA_SOAP_SEN_REDUND, response.redundancy) return SA_OK; } /** * discover_power_subsystem * @oh_handler: Pointer to openhpi handler * * Purpose: * Discover the power supply. * * Detailed Description: NA * * Return values: * SA_OK - on success. * SA_ERR_HPI_INVALID_PARAMS - on wrong parameters * SA_ERR_HPI_INTERNAL_ERROR - on failure. **/ SaErrorT discover_power_subsystem(struct oh_handler_state *oh_handler) { SaErrorT rv = SA_OK; struct oa_soap_handler *oa_handler = NULL; char power_subsystem[] = POWER_SUBSYSTEM_NAME; SaHpiResourceIdT resource_id; if (oh_handler == NULL) { err("Invalid parameters"); return SA_ERR_HPI_INVALID_PARAMS; } oa_handler = (struct oa_soap_handler *) oh_handler->data; /* Build rpt entry for power sub system */ rv = build_power_subsystem_rpt(oh_handler, power_subsystem, &resource_id); if (rv != SA_OK) { err("build power subsystem rpt failed"); return rv; } /* save power subsystem resource id */ oa_handler->oa_soap_resources.power_subsystem_rid = resource_id; /* Build rdr entry for power sub system*/ rv = build_power_subsystem_rdr(oh_handler, resource_id); if (rv != SA_OK) { err("build power subsystem RDR failed"); return rv; } return SA_OK; } /** * build_power_supply_rpt * @oh_handler: Pointer to openhpi handler * @name: Pointer to the name of the Power supply * @bay_number: Bay number of the Power supply * @resource_id: Pointer to resource id * * Purpose: * Populate the power supply unit RPT. * Pushes the RPT entry to plugin RPTable * * Detailed Description: NA * * Return values: * SA_OK - on success. * SA_ERR_HPI_INVALID_PARAMS - on wrong parameters * SA_ERR_HPI_INTERNAL_ERROR - on failure. **/ SaErrorT build_power_supply_rpt(struct oh_handler_state *oh_handler, char *name, SaHpiInt32T bay_number, SaHpiResourceIdT *resource_id) { SaErrorT rv = SA_OK; SaHpiEntityPathT entity_path; char *entity_root = NULL; SaHpiRptEntryT rpt; if (oh_handler == NULL || name == NULL || resource_id == NULL) { err("Invalid parameters"); return SA_ERR_HPI_INVALID_PARAMS; } entity_root = (char *) g_hash_table_lookup(oh_handler->config, "entity_root"); rv = oh_encode_entitypath(entity_root, &entity_path); if (rv != SA_OK) { err("Encoding entity path failed"); return SA_ERR_HPI_INTERNAL_ERROR; } /* Populate the rpt with the details of the power supply */ memset(&rpt, 0, sizeof(SaHpiRptEntryT)); rpt.ResourceCapabilities = SAHPI_CAPABILITY_RDR | SAHPI_CAPABILITY_RESOURCE | SAHPI_CAPABILITY_FRU | SAHPI_CAPABILITY_SENSOR | SAHPI_CAPABILITY_INVENTORY_DATA; rpt.ResourceEntity.Entry[2].EntityType = SAHPI_ENT_ROOT; rpt.ResourceEntity.Entry[2].EntityLocation = 0; rpt.ResourceEntity.Entry[1].EntityType = SAHPI_ENT_POWER_MGMNT; rpt.ResourceEntity.Entry[1].EntityLocation = 1; rpt.ResourceEntity.Entry[0].EntityType = SAHPI_ENT_POWER_SUPPLY; rpt.ResourceEntity.Entry[0].EntityLocation = bay_number; rv = oh_concat_ep(&rpt.ResourceEntity, &entity_path); if (rv != SA_OK) { err("concat of entity path failed"); return SA_ERR_HPI_INTERNAL_ERROR; } rpt.ResourceId = oh_uid_from_entity_path(&(rpt.ResourceEntity)); rpt.ResourceInfo.ManufacturerId = HP_MANUFACTURING_ID; rpt.ResourceSeverity = SAHPI_OK; rpt.ResourceFailed = SAHPI_FALSE; rpt.HotSwapCapabilities = 0x0; rpt.ResourceTag.DataType = SAHPI_TL_TYPE_TEXT; rpt.ResourceTag.Language = SAHPI_LANG_ENGLISH; rpt.ResourceTag.DataLength = strlen(name) + 1; memset(rpt.ResourceTag.Data, 0, SAHPI_MAX_TEXT_BUFFER_LENGTH); snprintf((char *) (rpt.ResourceTag.Data), rpt.ResourceTag.DataLength, "%s", name); /* Add the power supply rpt to the plugin RPTable */ rv = oh_add_resource(oh_handler->rptcache, &rpt, NULL, 0); if (rv != SA_OK) { err("Failed to add power supply unit RPT"); return rv; } *resource_id = rpt.ResourceId; return SA_OK; } /** * build_power_supply_rdr * @oh_handler: Pointer to openhpi handler * @con: Pointer to the soap client handler. * @response: Power supply info response structure * @resource_id: Resource id * * Purpose: * Populate the power supply unit RDR. * Pushes the RDR entry to plugin RPTable * * Detailed Description: * - Creates the inventory RDR * - Creates the power status, operational status, predictive failure, * internal data error, device location error, device failure error, * device degraded error, AC failure, device not supported and device mix * match sensor RDR * * Return values: * SA_OK - on success. * SA_ERR_HPI_INVALID_PARAMS - on wrong parameters * SA_ERR_HPI_INTERNAL_ERROR - on failure. **/ SaErrorT build_power_supply_rdr(struct oh_handler_state *oh_handler, SOAP_CON *con, struct powerSupplyInfo *response, SaHpiResourceIdT resource_id) { SaErrorT rv = SA_OK; SaHpiRdrT rdr; struct oa_soap_inventory *inventory = NULL; struct oa_soap_sensor_info *sensor_info = NULL; struct getPowerSupplyStatus status_request; struct powerSupplyStatus status_response; SaHpiInt32T sensor_status; enum diagnosticStatus diag_ex_status[OA_SOAP_MAX_DIAG_EX]; if (oh_handler == NULL || con == NULL || response == NULL) { err("Invalid parameters"); return SA_ERR_HPI_INVALID_PARAMS; } /* Build inventory rdr for power supply */ memset(&rdr, 0, sizeof(SaHpiRdrT)); rv = build_power_inv_rdr(oh_handler, response, &rdr, &inventory); if (rv != SA_OK) { err("Failed to get power supply unit inventory RDR"); return rv; } rv = oh_add_rdr(oh_handler->rptcache, resource_id, &rdr, inventory, 0); if (rv != SA_OK) { err("Failed to add rdr"); return rv; } /* Build power sensor rdr for power supply */ OA_SOAP_BUILD_SENSOR_RDR(OA_SOAP_SEN_PWR_STATUS) status_request.bayNumber = response->bayNumber; rv = soap_getPowerSupplyStatus(con, &status_request, &status_response); if (rv != SOAP_OK) { err("Get power supply status SOAP call failed"); return SA_ERR_HPI_INTERNAL_ERROR; } /* Build operational status sensor rdr */ OA_SOAP_BUILD_ENABLE_SENSOR_RDR(OA_SOAP_SEN_OPER_STATUS, status_response.operationalStatus) /* Build predictive failure sensor rdr */ OA_SOAP_BUILD_ENABLE_SENSOR_RDR(OA_SOAP_SEN_PRED_FAIL, status_response.operationalStatus) /* Build internal data error sensor rdr */ OA_SOAP_BUILD_ENABLE_SENSOR_RDR(OA_SOAP_SEN_INT_DATA_ERR, status_response.diagnosticChecks. internalDataError) /* Build device location error sensor rdr */ OA_SOAP_BUILD_ENABLE_SENSOR_RDR(OA_SOAP_SEN_DEV_LOC_ERR, status_response.diagnosticChecks. deviceLocationError) /* Build device failure error sensor rdr */ OA_SOAP_BUILD_ENABLE_SENSOR_RDR(OA_SOAP_SEN_DEV_FAIL, status_response.diagnosticChecks. deviceFailure) /* Build device degraded error sensor rdr */ OA_SOAP_BUILD_ENABLE_SENSOR_RDR(OA_SOAP_SEN_DEV_DEGRAD, status_response.diagnosticChecks. deviceDegraded) /* Build AC failure sensor rdr */ OA_SOAP_BUILD_ENABLE_SENSOR_RDR(OA_SOAP_SEN_AC_FAIL, status_response.diagnosticChecks. acFailure) /* Parse the diganosticChecksEx */ oa_soap_parse_diag_ex(status_response.diagnosticChecksEx, diag_ex_status); /* Build Device not supported sensor rdr */ OA_SOAP_BUILD_ENABLE_SENSOR_RDR(OA_SOAP_SEN_DEV_NOT_SUPPORT, diag_ex_status[DIAG_EX_DEV_NOT_SUPPORT]) /* Build Device mix match sensor rdr */ OA_SOAP_BUILD_ENABLE_SENSOR_RDR(OA_SOAP_SEN_DEV_MIX_MATCH, diag_ex_status[DIAG_EX_DEV_MIX_MATCH]) return SA_OK; } /** * discover_power_supply * @oh_handler: Pointer to openhpi handler * * Purpose: * Discover the power supply. * * Detailed Description: NA * * Return values: * SA_OK - on success. * SA_ERR_HPI_INVALID_PARAMS - on wrong parameters * SA_ERR_HPI_INTERNAL_ERROR - on failure. **/ SaErrorT discover_power_supply(struct oh_handler_state *oh_handler) { SaErrorT rv = SA_OK; struct oa_soap_handler *oa_handler = NULL; SaHpiInt32T i; struct getPowerSupplyInfo request; struct powerSupplyInfo response; char power_supply[] = POWER_SUPPLY_NAME; SaHpiResourceIdT resource_id; if (oh_handler == NULL) { err("Invalid parameters"); return SA_ERR_HPI_INVALID_PARAMS; } oa_handler = (struct oa_soap_handler *) oh_handler->data; for (i = 1; i <= oa_handler->oa_soap_resources.ps_unit.max_bays; i++) { request.bayNumber = i; rv = soap_getPowerSupplyInfo(oa_handler->active_con, &request, &response); if (rv != SOAP_OK) { err("Get power supply info failed"); return SA_ERR_HPI_INTERNAL_ERROR; } /* If resource not present, continue checking for next bay */ if (response.presence != PRESENT) continue; /* If the power supply unit does not have the power cord * plugged in, then power supply unit will be in faulty * condition. In this case, all the information in the * response structure is NULL. Consider the faulty power supply * unit as ABSENT */ if (response.serialNumber == NULL) continue; /* Build the rpt entry for power supply unit */ rv = build_power_supply_rpt(oh_handler, power_supply, i, &resource_id); if (rv != SA_OK) { err("build power supply unit rpt failed"); return rv; } /* Update resource_status structure with resource_id, * serial_number, and presence status */ oa_soap_update_resource_status( &oa_handler->oa_soap_resources.ps_unit, i, response.serialNumber, resource_id, RES_PRESENT); /* Build the rdr entry for power supply */ rv = build_power_supply_rdr(oh_handler, oa_handler->active_con, &response, resource_id); if (rv != SA_OK) { err("build power supply unit RDR failed"); /* Reset resource_status structure to default values */ oa_soap_update_resource_status( &oa_handler->oa_soap_resources.ps_unit, i, "", SAHPI_UNSPECIFIED_RESOURCE_ID, RES_ABSENT); return rv; } } return SA_OK; } /** * oa_soap_parse_diag_ex * @diag_ex : Pointer to diganosticChecksEx structure * @diag_status_arr: Pointer to array of enum oa_soap_diag_ex * * Purpose: * Parses the diagnosticChecksEx structure and extracts the value. * * Detailed Description: * The fields of diagnosticChecksEx structure appear and disappear * depending on the resource configuration and status. If a field is not * available in the diagnosticChecksEx structure, then its value is * considered as NO_ERROR. * This function parses the diagnosticChecksEx structure and gets the value * for the avaiable fields. * * Return values: * NONE **/ void oa_soap_parse_diag_ex(xmlNode *diag_ex, enum diagnosticStatus *diag_status_arr) { struct diagnosticData diag_data; SaHpiInt32T i; if (diag_status_arr == NULL) { err("Invalid parameters"); return; } /* Initialize the value array to NO_ERROR. * The diagnosticChecksEx fields will change depending on the * configuration and status. Hence, if one of more fields are not * present, then it is considered not faulty */ for (i = 0; i < OA_SOAP_MAX_DIAG_EX; i++) { diag_status_arr[i] = NO_ERROR; } while (diag_ex) { soap_getDiagnosticChecksEx(diag_ex, &diag_data); for (i = 0; i < OA_SOAP_MAX_DIAG_EX; i++) { /* Compare the diagnosticChecksEx field name with field * names in the array. */ if (! strcmp(diag_data.name, oa_soap_diag_ex_arr[i])) { diag_status_arr[i] = diag_data.value; break; } } diag_ex = soap_next_node(diag_ex); } return; } /** * oa_soap_get_health_val * @extra_data: Pointer to extraData structure * @status : Pointer to enum oa_soap_extra_data_health * * Purpose: * Parses the healthStatus field in extraData structure and extracts the * value. * * Detailed Description: * The fields of extraData structure appear and disappear depending on the * resource configuration and status. If healthStatus field is not * available in the extraData structure, then its value is considered as OK * This function parses the extraData structure and gets the value * of the healthStatus field. * * Return values: * NONE **/ void oa_soap_get_health_val(xmlNode *extra_data, enum oa_soap_extra_data_health *status) { struct extraDataInfo extra_data_info; SaHpiInt32T i; if (status == NULL) { err("Invalid parameters"); return; } /* Initialize status to OK */ *status = HEALTH_OK; while (extra_data) { soap_getExtraData(extra_data, &extra_data_info); /* Check for the healthStatus field */ if (! (strcmp(extra_data_info.name, OA_SOAP_HEALTH_STATUS_STR))) { /* Got the healthStatus field */ for (i = 0; i < OA_SOAP_MAX_HEALTH_ENUM; i++) { if (! strcmp(extra_data_info.value, oa_soap_health_arr[i])) { /* Assign the healthStatus enum value */ *status = i; break; } } } extra_data = soap_next_node(extra_data); } return; } /** * oa_soap_build_rpt * @oh_handler : Pointer to openhpi handler * @resource_type : Type of resource * @location : Device location * @rpt : Pointer to RPT entry * * Purpose: * Generic function to build the RPT entry from the global rpt array * * Detailed Description: * - Gets the RPT entry from the global rpt array * - Assigns the entity location in the entity path * - Generates the resource id * * Return values: * SA_OK - on success. * SA_ERR_HPI_INVALID_PARAMS - on wrong parameters * SA_ERR_HPI_INTERNAL_ERROR - on failure. **/ SaErrorT oa_soap_build_rpt(struct oh_handler_state *oh_handler, SaHpiInt32T resource_type, SaHpiInt32T location, SaHpiRptEntryT *rpt) { SaErrorT rv = SA_OK; SaHpiEntityPathT entity_path; char *entity_root = NULL; if (oh_handler == NULL || rpt == NULL) { err("Invalid parameters"); return SA_ERR_HPI_INVALID_PARAMS; } entity_root = (char *) g_hash_table_lookup(oh_handler->config, "entity_root"); rv = oh_encode_entitypath(entity_root, &entity_path); if (rv != SA_OK) { err("Encoding entity path failed"); return SA_ERR_HPI_INTERNAL_ERROR; } /* Populate the rpt with the details of the thermal subsystem */ memset(rpt, 0, sizeof(SaHpiRptEntryT)); *rpt = oa_soap_rpt_arr[resource_type]; rv = oh_concat_ep(&(rpt->ResourceEntity), &entity_path); if (rv != SA_OK) { err("concatenation of entity path failed"); return SA_ERR_HPI_INTERNAL_ERROR; } /* Set the device location in RPT entry */ if (location) rpt->ResourceEntity.Entry[0].EntityLocation = location; rpt->ResourceId = oh_uid_from_entity_path(&(rpt->ResourceEntity)); return SA_OK; } /** * oa_soap_build_therm_subsys_rdr * @oh_handler: Pointer to openhpi handler * @resource_id: Resource id * * Purpose: * Populate the thermal subsystem RDR. * Pushes the RDR entry to plugin RPTable * * Detailed Description: * Creates the operational status, predictive failure and redundancy * sensor RDR * * Return values: * SA_OK - on success. * SA_ERR_HPI_INVALID_PARAMS - on wrong parameters * SA_ERR_HPI_INTERNAL_ERROR - on failure. **/ static SaErrorT oa_soap_build_therm_subsys_rdr(struct oh_handler_state *oh_handler, SaHpiResourceIdT resource_id) { SaErrorT rv = SA_OK; SaHpiRdrT rdr; struct thermalSubsystemInfo response; struct oa_soap_handler *oa_handler = NULL; struct oa_soap_sensor_info *sensor_info = NULL; SaHpiInt32T sensor_status; if (oh_handler == NULL) { err("Invalid parameters"); return SA_ERR_HPI_INVALID_PARAMS; } oa_handler = (struct oa_soap_handler *) oh_handler->data; rv = soap_getThermalSubsystemInfo(oa_handler->active_con, &response); if (rv != SOAP_OK) { err("Get thermal subsystem info failed"); return SA_ERR_HPI_INTERNAL_ERROR; } /* Build operational status sensor rdr */ OA_SOAP_BUILD_ENABLE_SENSOR_RDR(OA_SOAP_SEN_OPER_STATUS, response.operationalStatus) /* Build predictive failure sensor rdr */ OA_SOAP_BUILD_ENABLE_SENSOR_RDR(OA_SOAP_SEN_PRED_FAIL, response.operationalStatus) /* Build internal data error sensor rdr */ OA_SOAP_BUILD_ENABLE_SENSOR_RDR(OA_SOAP_SEN_REDUND, response.redundancy) return SA_OK; } /** * oa_soap_disc_therm_subsys * @oh_handler: Pointer to openhpi handler * * Purpose: * Discover the thermal subsystem. * * Detailed Description: NA * * Return values: * SA_OK - on success. * SA_ERR_HPI_INVALID_PARAMS - on wrong parameters * SA_ERR_HPI_INTERNAL_ERROR - on failure. **/ static SaErrorT oa_soap_disc_therm_subsys(struct oh_handler_state *oh_handler) { SaErrorT rv = SA_OK; struct oa_soap_handler *oa_handler = NULL; SaHpiRptEntryT rpt; if (oh_handler == NULL) { err("Invalid parameters"); return SA_ERR_HPI_INVALID_PARAMS; } oa_handler = (struct oa_soap_handler *) oh_handler->data; /* Build the rpt entry for thermal subsystem */ rv = oa_soap_build_rpt(oh_handler, OA_SOAP_ENT_THERM_SUBSYS, 0, &rpt); if (rv != SA_OK) { err("Build thermal subsystem rpt failed"); return rv; } /* Add the thermal subsystem rpt to the plugin RPTable */ rv = oh_add_resource(oh_handler->rptcache, &rpt, NULL, 0); if (rv != SA_OK) { err("Failed to add thermal subsystem RPT"); return rv; } /* Build the rdr entry for thermal subsystem */ rv = oa_soap_build_therm_subsys_rdr(oh_handler, rpt.ResourceId); if (rv != SA_OK) { err("Build thermal subsystem RDR failed"); return rv; } /* Update resource_status structure with resource_id */ oa_handler->oa_soap_resources.thermal_subsystem_rid = rpt.ResourceId; return SA_OK; } /** * oa_soap_build_fz_rdr * @oh_handler: Pointer to openhpi handler * @resource_id: Resource id * @fan_zone : Pointer to fanZone structure * * Purpose: * Populate the fan zone RDR. * Pushes the RDR entry to plugin RPTable * * Detailed Description: * Creates the operational status, predictive failure and redundancy * sensor RDR * * Return values: * SA_OK - on success. * SA_ERR_HPI_INVALID_PARAMS - on wrong parameters * SA_ERR_HPI_INTERNAL_ERROR - on failure. **/ static SaErrorT oa_soap_build_fz_rdr(struct oh_handler_state *oh_handler, SaHpiResourceIdT resource_id, struct fanZone *fan_zone) { SaErrorT rv = SA_OK; SaHpiRdrT rdr; struct oa_soap_handler *oa_handler = NULL; struct oa_soap_sensor_info *sensor_info = NULL; SaHpiInt32T sensor_status; if (oh_handler == NULL) { err("Invalid parameters"); return SA_ERR_HPI_INVALID_PARAMS; } oa_handler = (struct oa_soap_handler *) oh_handler->data; /* Build the fan zone inventory rdr */ rv = oa_soap_build_fz_inv(oh_handler, resource_id, fan_zone); if (rv != SA_OK) { err("Building inventory RDR for Fan Zone failed"); return rv; } /* Build operational status sensor rdr */ OA_SOAP_BUILD_ENABLE_SENSOR_RDR(OA_SOAP_SEN_OPER_STATUS, fan_zone->operationalStatus) /* Build predictive failure sensor rdr */ OA_SOAP_BUILD_ENABLE_SENSOR_RDR(OA_SOAP_SEN_PRED_FAIL, fan_zone->operationalStatus) /* Build redundancy sensor rdr */ OA_SOAP_BUILD_ENABLE_SENSOR_RDR(OA_SOAP_SEN_REDUND, fan_zone->redundant) return SA_OK; } /** * oa_soap_get_fz * @oh_handler: Pointer to openhpi handler * @max_fz : Maximum fan zone supported by the enclosure * @response : Pointer to getFanZoneArrayResponse structure * * Purpose: * Gets the fan zone array information * * Detailed Description: * - Creates the request for getFanZoneArray SOAP call based on the maximum * fan zones * - Makes the getFanZoneArray SOAP call * * Return values: * SA_OK - on success. * SA_ERR_HPI_INVALID_PARAMS - on wrong parameters * SA_ERR_HPI_INTERNAL_ERROR - on failure. **/ SaErrorT oa_soap_get_fz_arr(struct oa_soap_handler *oa_handler, SaHpiInt32T max_fz, struct getFanZoneArrayResponse *response) { SaErrorT rv; struct getFanZoneArray request; struct bayArray bay_zones; SaHpiInt32T i; byte array[max_fz]; if (oa_handler == NULL || response == NULL) { err("Invalid parameter"); return SA_ERR_HPI_INVALID_PARAMS; } /* Create the bayArray for fanZoneArray request */ for (i = 1; i <= max_fz; i++) { array[i - 1] = i; } bay_zones.array = array; bay_zones.size = max_fz; request.bayArray = bay_zones; rv = soap_getFanZoneArray(oa_handler->active_con, &request, response); if (rv != SOAP_OK) { err("Get fan zone array SOAP call failed"); return SA_ERR_HPI_INTERNAL_ERROR; } return SA_OK; } /** * oa_soap_disc_fz * @oh_handler: Pointer to openhpi handler * * Purpose: * Discover the fan zone. * * Detailed Description: NA * * Return values: * SA_OK - on success. * SA_ERR_HPI_INVALID_PARAMS - on wrong parameters * SA_ERR_HPI_INTERNAL_ERROR - on failure. **/ static SaErrorT oa_soap_disc_fz(struct oh_handler_state *oh_handler) { SaErrorT rv = SA_OK; struct oa_soap_handler *oa_handler = NULL; SaHpiRptEntryT rpt; struct fanZone fan_zone; struct getFanZoneArrayResponse response; SaHpiInt32T max_fz, zone_number; if (oh_handler == NULL) { err("Invalid parameters"); return SA_ERR_HPI_INVALID_PARAMS; } oa_handler = (struct oa_soap_handler *) oh_handler->data; max_fz = oa_handler->oa_soap_resources.fan_zone.max_bays; /* Get the Fan Zone array information */ rv = oa_soap_get_fz_arr(oa_handler, max_fz, &response); if (rv != SA_OK) { err("Failed to get fan zone array"); return rv; } while (response.fanZoneArray) { soap_fanZone(response.fanZoneArray, &fan_zone); zone_number = fan_zone.zoneNumber; /* Build the rpt entry for fan zone */ rv = oa_soap_build_rpt(oh_handler, OA_SOAP_ENT_FZ, zone_number, &rpt); if (rv != SA_OK) { err("Build fan zone rpt has failed"); return rv; } /* Add the fan zone rpt to the plugin RPTable */ rv = oh_add_resource(oh_handler->rptcache, &rpt, NULL, 0); if (rv != SA_OK) { err("Failed to add fan zone RPT"); return rv; } /* Build the rdr entry for fan zone */ rv = oa_soap_build_fz_rdr(oh_handler, rpt.ResourceId, &fan_zone); if (rv != SA_OK) { err("Build fan zone RDR failed"); return rv; } /* Update resource_status structure with resource_id */ oa_handler->oa_soap_resources.fan_zone. resource_id[zone_number - 1] = rpt.ResourceId; response.fanZoneArray = soap_next_node(response.fanZoneArray); } return SA_OK; } /** * oa_soap_build_fan_rpt * @oh_handler : Pointer to openhpi handler * @bay_number : Bay number of the Fan * @resource_id : Pointer to the resource id * * Purpose: * Populate the fan RPT. * Pushes the RPT entry to plugin RPTable * * Detailed Description: * - Creates the Fan RPT entry from the global array * - Puts the primary fan zone number of this fan in entity path * - Pushes the RPT entry to plugin RPTable * * Return values: * SA_OK - on success. * SA_ERR_HPI_INVALID_PARAMS - on wrong parameters * SA_ERR_HPI_INTERNAL_ERROR - on failure. **/ SaErrorT oa_soap_build_fan_rpt(struct oh_handler_state *oh_handler, SaHpiInt32T bay_number, SaHpiResourceIdT *resource_id) { SaErrorT rv = SA_OK; SaHpiRptEntryT rpt; struct oa_soap_handler *oa_handler; if (oh_handler == NULL || resource_id == NULL) { err("Invalid parameters"); return SA_ERR_HPI_INVALID_PARAMS; } oa_handler = (struct oa_soap_handler *) oh_handler->data; rv = oa_soap_build_rpt(oh_handler, OA_SOAP_ENT_FAN, bay_number, &rpt); if (rv != SA_OK) { err("Build fan rpt has failed"); return rv; } /* Set the fan zone location in RPT entry */ rpt.ResourceEntity.Entry[1].EntityLocation = oa_soap_fz_map_arr[oa_handler->enc_type][bay_number].zone; /* Add the fan rpt to the plugin RPTable */ rv = oh_add_resource(oh_handler->rptcache, &rpt, NULL, 0); if (rv != SA_OK) { err("Failed to add fan RPT"); return rv; } *resource_id = rpt.ResourceId; return SA_OK; } /** * oa_soap_build_fan_rdr * @oh_handler: Pointer to openhpi handler * @con: Pointer to the soap client handler. * @response: Fan info response structure * @resource_id: Resource id * * Purpose: * - Creates the inventory RDR. * - Creates operational status, predictive failure, internal data error, * device location error, device failure error, device degraded and * device missing sensor RDR * - Pushes the RDRs to plugin RPTable * * Detailed Description: NA * * Return values: * SA_OK - on success. * SA_ERR_HPI_INVALID_PARAMS - on wrong parameters * SA_ERR_HPI_INTERNAL_ERROR - on failure. **/ SaErrorT oa_soap_build_fan_rdr(struct oh_handler_state *oh_handler, SOAP_CON *con, struct fanInfo *response, SaHpiResourceIdT resource_id) { SaErrorT rv = SA_OK; SaHpiRdrT rdr; struct oa_soap_sensor_info *sensor_info = NULL; SaHpiInt32T sensor_status; enum diagnosticStatus diag_ex_status[OA_SOAP_MAX_DIAG_EX]; if (oh_handler == NULL || con == NULL || response == NULL) { err("Invalid parameters"); return SA_ERR_HPI_INVALID_PARAMS; } /* Build inventory rdr for fan */ memset(&rdr, 0, sizeof(SaHpiRdrT)); rv = oa_soap_build_fan_inv(oh_handler, resource_id, response); if (rv != SA_OK) { err("Failed to build fan inventory RDR"); return rv; } /* Build fan speed sensor rdr for fan */ OA_SOAP_BUILD_SENSOR_RDR(OA_SOAP_SEN_FAN_SPEED) /* Build power sensor rdr for fan */ OA_SOAP_BUILD_SENSOR_RDR(OA_SOAP_SEN_PWR_STATUS) /* Build operational status sensor rdr */ OA_SOAP_BUILD_ENABLE_SENSOR_RDR(OA_SOAP_SEN_OPER_STATUS, response->operationalStatus) /* Build predictive failure sensor rdr */ OA_SOAP_BUILD_ENABLE_SENSOR_RDR(OA_SOAP_SEN_PRED_FAIL, response->operationalStatus) /* Build internal data error sensor rdr */ OA_SOAP_BUILD_ENABLE_SENSOR_RDR(OA_SOAP_SEN_INT_DATA_ERR, response->diagnosticChecks. internalDataError) /* Build device location error sensor rdr */ OA_SOAP_BUILD_ENABLE_SENSOR_RDR(OA_SOAP_SEN_DEV_LOC_ERR, response->diagnosticChecks. deviceLocationError) /* Build device failure error sensor rdr */ OA_SOAP_BUILD_ENABLE_SENSOR_RDR(OA_SOAP_SEN_DEV_FAIL, response->diagnosticChecks. deviceFailure) /* Build device degraded error sensor rdr */ OA_SOAP_BUILD_ENABLE_SENSOR_RDR(OA_SOAP_SEN_DEV_DEGRAD, response->diagnosticChecks. deviceDegraded) oa_soap_parse_diag_ex(response->diagnosticChecksEx, diag_ex_status); /* Build device missing sensor rdr */ OA_SOAP_BUILD_ENABLE_SENSOR_RDR(OA_SOAP_SEN_DEV_MISS, diag_ex_status[DIAG_EX_DEV_MISS]) return SA_OK; } /** * oa_soap_disc_fan * @oh_handler: Pointer to openhpi handler * * Purpose: * Discover the fan. * * Detailed Description: NA * * Return values: * SA_OK - on success. * SA_ERR_HPI_INVALID_PARAMS - on wrong parameters * SA_ERR_HPI_INTERNAL_ERROR - on failure. **/ static SaErrorT oa_soap_disc_fan(struct oh_handler_state *oh_handler) { SaErrorT rv = SA_OK; struct oa_soap_handler *oa_handler = NULL; SaHpiInt32T i; struct getFanInfo request; struct fanInfo response; SaHpiResourceIdT resource_id; if (oh_handler == NULL) { err("Invalid parameters"); return SA_ERR_HPI_INVALID_PARAMS; } oa_handler = (struct oa_soap_handler *) oh_handler->data; for (i = 1; i <= oa_handler->oa_soap_resources.fan.max_bays; i++) { request.bayNumber = i; rv = soap_getFanInfo(oa_handler->active_con, &request, &response); if (rv != SOAP_OK) { err("Get Fan Info SOAP call failed"); return SA_ERR_HPI_INTERNAL_ERROR; } /* If resource not present, continue checking for next bay */ if (response.presence != PRESENT) continue; rv = oa_soap_build_fan_rpt(oh_handler, i, &resource_id); if (rv != SA_OK) { err("Failed to build fan RPT"); return rv; } /* Update resource_status structure with resource_id, * serial_number, and presence status. Fan doesn't have a * serial number, so pass in a null string. */ oa_soap_update_resource_status( &oa_handler->oa_soap_resources.fan, i, NULL, resource_id, RES_PRESENT); rv = oa_soap_build_fan_rdr(oh_handler, oa_handler->active_con, &response, resource_id); if (rv != SA_OK) { err("Failed to build fan RDR"); /* Reset resource_status structure to default values */ oa_soap_update_resource_status( &oa_handler->oa_soap_resources.fan, i, NULL, SAHPI_UNSPECIFIED_RESOURCE_ID, RES_ABSENT); return rv; } } return SA_OK; } /** * oa_soap_build_lcd_rdr * @oh_handler: Pointer to openhpi handler * @resource_id: resource id * * Purpose: * Builds the LCD RDR * * Detailed Description: * - Creates the inventory RDR * - Creates the operational status, predictive failure, internal data * error, device failure error, device degraded error, enclosure * aggregate operational status and enclosure aggregate predictive * failure sernsor RDR * - Pushes the RDR entry to plugin RPTable * * Return values: * SA_OK - on success. * SA_ERR_HPI_INVALID_PARAMS - on wrong parameters * SA_ERR_HPI_INTERNAL_ERROR - on failure. **/ static SaErrorT oa_soap_build_lcd_rdr(struct oh_handler_state *oh_handler, SaHpiResourceIdT resource_id) { SaErrorT rv = SA_OK; SaHpiRdrT rdr; struct oa_soap_handler *oa_handler = NULL; struct oa_soap_sensor_info *sensor_info = NULL; struct lcdStatus status; SaHpiInt32T sensor_status; if (oh_handler == NULL) { err("Invalid parameters"); return SA_ERR_HPI_INVALID_PARAMS; } oa_handler = (struct oa_soap_handler *) oh_handler->data; /* Build the LCD inventory RDR */ rv = oa_soap_build_lcd_inv(oh_handler, resource_id); if (rv != SA_OK) { err("Building inventory RDR for LCD failed"); return rv; } /* Build LCD button lock control rdr */ OA_SOAP_BUILD_CONTROL_RDR(OA_SOAP_LCD_BUTN_LCK_CNTRL) /* Build operational status sensor rdr */ rv = soap_getLcdStatus(oa_handler->active_con, &status); if (rv != SOAP_OK) { err("Get LCD status SOAP call has failed"); return SA_ERR_HPI_INTERNAL_ERROR; } /* Build operational status sensor rdr */ OA_SOAP_BUILD_ENABLE_SENSOR_RDR(OA_SOAP_SEN_OPER_STATUS, status.status) /* Build predictive failure sensor rdr */ OA_SOAP_BUILD_ENABLE_SENSOR_RDR(OA_SOAP_SEN_PRED_FAIL, status.status) /* Build internal data error sensor rdr */ OA_SOAP_BUILD_ENABLE_SENSOR_RDR(OA_SOAP_SEN_INT_DATA_ERR, status.diagnosticChecks. internalDataError) /* Build device failure error sensor rdr */ OA_SOAP_BUILD_ENABLE_SENSOR_RDR(OA_SOAP_SEN_DEV_FAIL, status.diagnosticChecks.deviceFailure) /* Build device degraded error sensor rdr */ OA_SOAP_BUILD_ENABLE_SENSOR_RDR(OA_SOAP_SEN_DEV_DEGRAD, status.diagnosticChecks.deviceDegraded) /* Build enclosure aggregate operational status sensor rdr */ OA_SOAP_BUILD_ENABLE_SENSOR_RDR(OA_SOAP_SEN_ENC_AGR_OPER, status.lcdSetupHealth) /* Build enclosure aggregate predictive failure sensor rdr */ OA_SOAP_BUILD_ENABLE_SENSOR_RDR(OA_SOAP_SEN_ENC_AGR_PRED_FAIL, status.lcdSetupHealth) return SA_OK; } /** * oa_soap_disc_lcd * @oh_handler: Pointer to openhpi handler * * Purpose: * Discover the fan zone. * * Detailed Description: NA * * Return values: * SA_OK - on success. * SA_ERR_HPI_INVALID_PARAMS - on wrong parameters * SA_ERR_HPI_INTERNAL_ERROR - on failure. **/ static SaErrorT oa_soap_disc_lcd(struct oh_handler_state *oh_handler) { SaErrorT rv = SA_OK; struct oa_soap_handler *oa_handler = NULL; SaHpiRptEntryT rpt; if (oh_handler == NULL) { err("Invalid parameters"); return SA_ERR_HPI_INVALID_PARAMS; } oa_handler = (struct oa_soap_handler *) oh_handler->data; /* Build the rpt entry for lcd */ rv = oa_soap_build_rpt(oh_handler, OA_SOAP_ENT_LCD, 0, &rpt); if (rv != SA_OK) { err("Build LCD rpt has failed"); return rv; } /* Add the LCD rpt to the plugin RPTable */ rv = oh_add_resource(oh_handler->rptcache, &rpt, NULL, 0); if (rv != SA_OK) { err("Failed to add LCD RPT"); return rv; } /* Build the rdr entry for LCD */ rv = oa_soap_build_lcd_rdr(oh_handler, rpt.ResourceId); if (rv != SA_OK) { err("Build LCD RDR failed"); return rv; } /* Update resource_status structure with resource_id */ oa_handler->oa_soap_resources.lcd_rid = rpt.ResourceId; return SA_OK; } /** * oa_soap_populate_event * @oh_handler: Pointer to openhpi handler * @resource_id: Resource Id * @event: Pointer to event structure * @assert_sensors: Pointer to GSList * * Purpose: * Populates the event structure with default values of the resource. * If sensor is in assert state, then pushes the asserted sensor RDR * to list. * * Detailed Description: * - Populates the event structure with default values of the resource * - If sensor is in assert state, then pushes the asserted sensor RDR to * assert sensor list. This list is used for generating the sensor assert * events * * Return values: * SA_OK - on success. * SA_ERR_HPI_INVALID_PARAMS - on wrong parameters * SA_ERR_HPI_INTERNAL_ERROR - on failure. **/ SaErrorT oa_soap_populate_event(struct oh_handler_state *oh_handler, SaHpiResourceIdT resource_id, struct oh_event *event, GSList **assert_sensors) { SaHpiRptEntryT *rpt = NULL; SaHpiRdrT *rdr = NULL; struct oa_soap_sensor_info *sensor_info; SaHpiEventStateT state; SaHpiEventCategoryT evt_catg; if (oh_handler == NULL || event == NULL || assert_sensors == NULL) { err("Invalid parameters"); return SA_ERR_HPI_INVALID_PARAMS; } rpt = oh_get_resource_by_id(oh_handler->rptcache, resource_id); memset(event, 0, sizeof(struct oh_event)); event->event.Source = rpt->ResourceId; oh_gettimeofday(&event->event.Timestamp); event->event.Severity = rpt->ResourceSeverity; event->resource = *rpt; event->hid = oh_handler->hid; /* Get the first RDR */ rdr = oh_get_rdr_next(oh_handler->rptcache, rpt->ResourceId, SAHPI_FIRST_ENTRY); while (rdr) { /* Push the rdr to event rdrs list */ event->rdrs = g_slist_append(event->rdrs, g_memdup(rdr, sizeof(SaHpiRdrT))); /* Check whether the RDR is of type sensor */ if (rdr->RdrType == SAHPI_SENSOR_RDR) { sensor_info = (struct oa_soap_sensor_info*) oh_get_rdr_data(oh_handler->rptcache, resource_id, rdr->RecordId); /* Check whether the event is enabled or not */ if (sensor_info->event_enable == SAHPI_TRUE) { state = sensor_info->current_state; evt_catg = rdr->RdrTypeUnion.SensorRec.Category; /* Check whether the sensor current state is * asserted or not. Sensor is considered to be * in assert state, if any one of the following * 3 conditions are met: * * 1. event category = ENABLE and state = * DISABLED * 2. event category = PRED_FAIL and state = * PRED_FAILURE_ASSERT * 3. event category = THRESHOLD and state = * UPPER_MAJOR or _UPPER_CRIT */ if ( (evt_catg == SAHPI_EC_ENABLE && state == SAHPI_ES_DISABLED) || (evt_catg == SAHPI_EC_PRED_FAIL && state == SAHPI_ES_PRED_FAILURE_ASSERT) || (evt_catg == SAHPI_EC_REDUNDANCY && state == SAHPI_ES_REDUNDANCY_LOST) || (evt_catg == SAHPI_EC_THRESHOLD && (state == SAHPI_ES_UPPER_MAJOR || state == SAHPI_ES_UPPER_CRIT)) ) { /* Push the sensor rdr to assert sensor * list */ *assert_sensors = g_slist_append(*assert_sensors, g_memdup(rdr, sizeof(SaHpiRdrT))); } } } /* Get the next RDR */ rdr = oh_get_rdr_next(oh_handler->rptcache, rpt->ResourceId, rdr->RecordId); } return SA_OK; } /** * oa_soap_push_disc_res * @oh_handler: Pointer to openhpi handler * * Purpose: * Pushes the discovered resource entries to openhpi infrastructure * * Detailed Description: * - Get the rpt entry of the resources one by one. * - Creates the resource or hotswap event depending on the resource * hotswap capability * - Pushes the events to openhpi infrastructure * * Return values: * SA_OK - on success. * SA_ERR_HPI_OUT_OF_MEMORY - on out of memory * SA_ERR_HPI_INVALID_PARAMS - on wrong parameters * SA_ERR_HPI_INTERNAL_ERROR - on failure. **/ static void oa_soap_push_disc_res(struct oh_handler_state *oh_handler) { SaErrorT rv = SA_OK; SaHpiRptEntryT *rpt = NULL; struct oh_event event; struct oa_soap_hotswap_state *hotswap_state = NULL; GSList *assert_sensor_list = NULL; if (oh_handler == NULL) { err("Invalid parameter"); return; } /* Get the first resource */ rpt = oh_get_resource_next(oh_handler->rptcache, SAHPI_FIRST_ENTRY); while (rpt) { /* Populate the event structure with default values and get the * asserted sensor list */ rv = oa_soap_populate_event(oh_handler, rpt->ResourceId, &event, &assert_sensor_list); /* Check whether the resource has hotswap capability */ if (event.resource.ResourceCapabilities & SAHPI_CAPABILITY_MANAGED_HOTSWAP) { /* Get the hotswap state and fill the current * hotswap state */ hotswap_state = (struct oa_soap_hotswap_state *) oh_get_resource_data(oh_handler->rptcache, event.resource.ResourceId); if (hotswap_state == NULL) { err("Failed to get server hotswap state"); return; } event.event.EventType = SAHPI_ET_HOTSWAP; event.event.EventDataUnion.HotSwapEvent.HotSwapState = hotswap_state->currentHsState; event.event.EventDataUnion.HotSwapEvent. CauseOfStateChange = SAHPI_HS_CAUSE_UNKNOWN; } else if (event.resource.ResourceCapabilities & SAHPI_CAPABILITY_FRU) { /* The resource is FRU, but does not have hotswap * capability Fill the current hotswap state as ACTIVE. */ event.event.EventType = SAHPI_ET_HOTSWAP; event.event.EventDataUnion.HotSwapEvent.HotSwapState = SAHPI_HS_STATE_ACTIVE; event.event.EventDataUnion.HotSwapEvent. CauseOfStateChange = SAHPI_HS_CAUSE_UNKNOWN; } else { /* The resource does not have FRU and hotswap * capabilities. Raise the resrouce event. */ event.event.EventType = SAHPI_ET_RESOURCE; event.event.EventDataUnion.ResourceEvent. ResourceEventType = SAHPI_RESE_RESOURCE_ADDED; } /* Push the event to OpenHPI */ oh_evt_queue_push(oh_handler->eventq, copy_oa_soap_event(&event)); /* If the assert sensro list is not empty, raise the assert * sensor events */ if (assert_sensor_list != NULL) { /* Raise the assert sensor events */ oa_soap_assert_sen_evt(oh_handler, rpt, assert_sensor_list); /* Initialize the assert sensor list to NULL */ assert_sensor_list = NULL; } /* Get the next resource */ rpt = oh_get_resource_next(oh_handler->rptcache, rpt->ResourceId); } /* End of while loop */ return; } /** * oa_soap_build_blade_thermal_rdr: * @oh_handler : Pointer to openhpi handler * @thermal_response : bladeThermalInfoArrayResponse response * structure * @rpt : Pointer to rpt structure * @name : Blade name * * Purpose: Builds the thermal sensors of blade resource * * Detailed Description: * - Parses the bladethermalInfoArray responses * - For a particular blade type, then thermal sensor rdrs are built * based on static information available in * "oa_soap_static_thermal_sensor_config" array for the blade type. * - While the sensors are being built, if the soap response is NULL then * the sensor is left in the disable state, else the response is verified * to check whether the sensor can be enabled for monitoring and is * enabled if monitoring is supported. * - The response contains thermal info for different components, zones * inside the blade. * - In addition, the bladeThermalInfo sensor of same type in response can * repeat (Like multiple system zones, cpu_zones, cpu information). * When there is such multiple instance of the bladeThermalInfo structure * in the response, sensor numbers are generated as follows: * For each sensor type, a base sensor number is defined * First occurrence of this sensor type in the response structure * is modeled with * sensor number = base sensor number * Any later occurrences of the same sensor type in response is * modeled with * sensor number = sensor number of previous instance of * the same sensor type + 1 * - Currently plugin considers maximum 4 occurrences of thermal info of * same sensor type for thermal sensor modeling(For example only 4 * system zone thermal sensors will be modeled even if the blade is able * to provide more than 4 thermal sensors of system zone type) * - Finally the bladeThermalInfo structure instance does not contain * any field identifier to unique distinguish itself into a particular * sensor type, hence the description field in the bladeThermalInfo * structure is used as the key to distinguish into particular sensor * type category. * - If this module is called during the discovery, then thermal sensors * rdr are built for sensors supported by blade * * Return values: * SA_OK - on success * SA_ERR_HPI_INTERNAL_ERROR - on failure **/ SaErrorT oa_soap_build_blade_thermal_rdr(struct oh_handler_state *oh_handler, struct bladeThermalInfoArrayResponse response, SaHpiRptEntryT *rpt, char *name) { SaErrorT rv = SA_OK; SaHpiBoolT bld_stable = SAHPI_FALSE; SaHpiInt32T i, j, sen_num, sen_count; enum oa_soap_blade_type bld_index = OTHER_BLADE_TYPE; SaHpiRdrT rdr; struct oa_soap_sensor_info *sensor_info = NULL; struct bladeThermalInfoArrayResponse temp_response; struct bladeThermalInfo bld_thrm_info; struct extraDataInfo extra_data_info; SaHpiSensorRecT *sensor = NULL; if (response.bladeThermalInfoArray != NULL) bld_stable = SAHPI_TRUE; /* Resolve the blade name to blade type enum . * If the blade name did not match any of the existing blade type * string, then it is considered OTHER_BLADE_TYPE */ for (i=0; i< OA_SOAP_MAX_BLD_TYPE -1 ; i++) { if (strstr(name, oa_soap_bld_type_str[i])) { bld_index = i; break; } } /* Fetch the thermal sensor information from static thermal sensor * meant for blade type under discovery */ for (i = 0; i < OA_SOAP_MAX_THRM_SEN; i++) { sen_count = oa_soap_static_thrm_sen_config[bld_index] [i].sensor_count; /* Do not add any sensor rdr if the sensor count is zero */ if (sen_count == 0) continue; for (j = 0; j< sen_count; j++) { memset(&rdr, 0, sizeof(SaHpiRdrT)); sen_num = oa_soap_static_thrm_sen_config[bld_index][i]. base_sen_num + j; rv = oa_soap_build_sen_rdr(oh_handler, rpt->ResourceId, &rdr, &sensor_info, sen_num); if (rv != SA_OK) { err("Failed to create rdr for sensor %x", sen_num); return rv; } /* Initialize the sensor enable state as disabled */ sensor_info->sensor_enable = SAHPI_FALSE; if (bld_stable == SAHPI_FALSE) { dbg("Blade not in stable state, leaving sensor" " in disable state"); } else { /* Call the following function to retrieve * the correct instance of bladeThermalInfo * response. */ temp_response = response; rv = oa_soap_get_bld_thrm_sen_data(sen_num, temp_response, &bld_thrm_info); if (rv != SA_OK) { err("Could not find the matching" " sensors info from blade"); return SA_ERR_HPI_INTERNAL_ERROR; } /* Check for the "SensorPresent" value in * bladeThermalInfo structure. * If the value is true, then enable the sensor * built statically in previous step */ soap_getExtraData(bld_thrm_info.extraData, &extra_data_info); if ((extra_data_info.value != NULL) && (!(strcasecmp(extra_data_info.value, "true")))) { sensor_info->sensor_enable = SAHPI_TRUE; sensor = &(rdr.RdrTypeUnion.SensorRec); /* Updating the rdr with actual upper * critical threshold value provided by * OA */ sensor->DataFormat.Range.Max.Value. SensorFloat64 = sensor_info->threshold.UpCritical.Value. SensorFloat64 = bld_thrm_info.criticalThreshold; /* Updating the rdr with actual upper * caution threshold value provided by * OA */ sensor->DataFormat.Range.NormalMax.Value. SensorFloat64 = sensor_info->threshold.UpMajor.Value. SensorFloat64 = bld_thrm_info.cautionThreshold; } else { dbg("Sensor %s not enabled for blade", bld_thrm_info.description); } } rv = oh_add_rdr(oh_handler->rptcache, rpt->ResourceId, &rdr, sensor_info, 0); if (rv != SA_OK) { err("Failed to add rdr"); return rv; } } } return SA_OK; } void * oh_discover_resources (void *) __attribute__ ((weak, alias("oa_soap_discover_resources"))); openhpi-2.14.1/plugins/oa_soap/oa_soap_fan_event.c0000644000076400007640000002166611302566663017130 0ustar /* * Copyright (C) 2007-2008, Hewlett-Packard Development Company, LLP * All rights reserved. * * 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. * * Neither the name of the Hewlett-Packard Corporation, nor the names * of its contributors may be used to endorse or promote products * derived from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * Author(s) * Raghavendra P.G. * * This file has the implementation of the thermal subsystem, fan zone and fan * event handling * * process_fan_insertion_event() - Processes the fan insertion event * * process_fan_extraction_event() - Processes the fan extraction event * * oa_soap_proc_therm_subsys_info() - Processes the thermal subsystem info * event and generates the sensor event * * oa_soap_proc_fz_status() - Processes the fan zone status event * * oa_soap_proc_fan_status() - Processes the fan status event * */ #include "oa_soap_fan_event.h" /** * process_fan_insertion_event * @oh_handler: Pointer to openhpi handler structure * @event: Pointer to the openhpi event structure * * Purpose: * Adds the newly inserted fan information into RPT and RDR table * Creates the hot swap event * * Detailed Description: NA * * Return values: * SA_OK - success. * SA_ERR_HPI_INVALID_PARAMS - on wrong parameters. * SA_ERR_HPI_INTERNAL_ERROR - on failure **/ SaErrorT process_fan_insertion_event(struct oh_handler_state *oh_handler, SOAP_CON *con, struct eventInfo *oa_event) { SaErrorT rv = SA_OK; if (oh_handler == NULL || con == NULL || oa_event == NULL) { err("Invalid parameters"); return SA_ERR_HPI_INVALID_PARAMS; } rv = add_fan(oh_handler, con, &(oa_event->eventData.fanInfo)); if (rv != SA_OK) { err("Add fan failed"); return rv; } return SA_OK; } /** * process_fan_extraction_event * @oh_handler: Pointer to openhpi handler structure * @oa_event: Pointer to oa event response structure * * Purpose: * Deletes the extracted fan information from RPT * Creates the hot swap event * * Detailed Description: NA * * Return values: * SA_OK - success. * SA_ERR_HPI_INVALID_PARAMS - on wrong parameters. * SA_ERR_HPI_INTERNAL_ERROR - on failure **/ SaErrorT process_fan_extraction_event(struct oh_handler_state *oh_handler, struct eventInfo *oa_event) { SaErrorT rv = SA_OK; if (oh_handler == NULL || oa_event == NULL) { err("Invalid parameters"); return SA_ERR_HPI_INVALID_PARAMS; } rv = remove_fan(oh_handler, oa_event->eventData.fanInfo.bayNumber); if (rv != SA_OK) { err("Remove fan failed"); return SA_ERR_HPI_INTERNAL_ERROR; } return SA_OK; } /** * oa_soap_proc_therm_subsys_info * @oh_handler : Pointer to openhpi handler structure * @info : Pointer to thermalSubsystemInfo structure * * Purpose: * Process the thermal subsystem info event * * Detailed Description: NA * * Return values: * NONE **/ void oa_soap_proc_therm_subsys_info(struct oh_handler_state *oh_handler, struct thermalSubsystemInfo *info) { SaErrorT rv = SA_OK; SaHpiResourceIdT resource_id; struct oa_soap_handler *oa_handler; if (oh_handler == NULL || info == NULL) { err("wrong parameters passed"); return; } oa_handler = (struct oa_soap_handler *) oh_handler->data; resource_id = oa_handler->oa_soap_resources.thermal_subsystem_rid; /* Process the operational status sensor */ OA_SOAP_PROCESS_SENSOR_EVENT(OA_SOAP_SEN_OPER_STATUS, info->operationalStatus, 0, 0); /* Process the predictive failure status sensor */ OA_SOAP_PROCESS_SENSOR_EVENT(OA_SOAP_SEN_PRED_FAIL, info->operationalStatus, 0, 0); /* Process the redundancy sensor */ OA_SOAP_PROCESS_SENSOR_EVENT(OA_SOAP_SEN_REDUND, info->redundancy, 0, 0); return; } /** * oa_soap_proc_fz_status * @oh_handler : Pointer to openhpi handler structure * @fan_zone : Pointer to fanZone structure * * Purpose: * Process the fan zone status event * * Detailed Description: NA * * Return values: * NONE **/ void oa_soap_proc_fz_status(struct oh_handler_state *oh_handler, struct fanZone *fan_zone) { SaErrorT rv = SA_OK; SaHpiResourceIdT resource_id; struct oa_soap_handler *oa_handler; if (oh_handler == NULL || fan_zone == NULL) { err("wrong parameters passed"); return; } oa_handler = (struct oa_soap_handler *) oh_handler->data; resource_id = oa_handler->oa_soap_resources.fan_zone. resource_id[fan_zone->zoneNumber - 1]; /* Process the operational status sensor */ OA_SOAP_PROCESS_SENSOR_EVENT(OA_SOAP_SEN_OPER_STATUS, fan_zone->operationalStatus, 0, 0); /* Process the predictive failure status sensor */ OA_SOAP_PROCESS_SENSOR_EVENT(OA_SOAP_SEN_PRED_FAIL, fan_zone->operationalStatus, 0, 0); /* Process the redundancy sensor */ OA_SOAP_PROCESS_SENSOR_EVENT(OA_SOAP_SEN_REDUND, fan_zone->redundant, 0, 0); return; } /** * oa_soap_proc_fan_status * @oh_handler : Pointer to openhpi handler structure * @info : Pointer to fanInfo structure * * Purpose: * Process the fan status event * * Detailed Description: NA * * Return values: * NONE **/ void oa_soap_proc_fan_status(struct oh_handler_state *oh_handler, struct fanInfo *info) { SaErrorT rv = SA_OK; SaHpiResourceIdT resource_id; struct oa_soap_handler *oa_handler; SaHpiInt32T slot; enum diagnosticStatus diag_ex_status[OA_SOAP_MAX_DIAG_EX]; if (oh_handler == NULL || info == NULL) { err("wrong parameters passed"); return; } oa_handler = (struct oa_soap_handler *) oh_handler->data; slot = info->bayNumber; resource_id = oa_handler->oa_soap_resources.fan.resource_id[slot - 1]; /* Process the operational status sensor */ OA_SOAP_PROCESS_SENSOR_EVENT(OA_SOAP_SEN_OPER_STATUS, info->operationalStatus, 0, 0); /* Process the predictive failure status sensor */ OA_SOAP_PROCESS_SENSOR_EVENT(OA_SOAP_SEN_PRED_FAIL, info->operationalStatus, 0, 0); /* Process the internal data error sensor */ OA_SOAP_PROCESS_SENSOR_EVENT(OA_SOAP_SEN_INT_DATA_ERR, info->diagnosticChecks.internalDataError, 0, 0); /* Process the device location error sensor */ OA_SOAP_PROCESS_SENSOR_EVENT(OA_SOAP_SEN_DEV_LOC_ERR, info->diagnosticChecks.deviceLocationError, 0, 0); /* Process the device failure error sensor */ OA_SOAP_PROCESS_SENSOR_EVENT(OA_SOAP_SEN_DEV_FAIL, info->diagnosticChecks.deviceFailure, 0, 0); /* Process the device degraded error sensor */ OA_SOAP_PROCESS_SENSOR_EVENT(OA_SOAP_SEN_DEV_DEGRAD, info->diagnosticChecks.deviceDegraded, 0, 0); oa_soap_parse_diag_ex(info->diagnosticChecksEx, diag_ex_status); /* Process device missing sensor */ OA_SOAP_PROCESS_SENSOR_EVENT(OA_SOAP_SEN_DEV_MISS, diag_ex_status[DIAG_EX_DEV_MISS], 0, 0) /* Process device not supported sensor rdr */ OA_SOAP_PROCESS_SENSOR_EVENT(OA_SOAP_SEN_DEV_NOT_SUPPORT, diag_ex_status[DIAG_EX_DEV_NOT_SUPPORT], 0, 0) /* Process Device mix match sensor */ OA_SOAP_PROCESS_SENSOR_EVENT(OA_SOAP_SEN_DEV_MIX_MATCH, diag_ex_status[DIAG_EX_DEV_MIX_MATCH], 0, 0) return; } openhpi-2.14.1/plugins/oa_soap/oa_soap_hotswap.c0000644000076400007640000004457111302566664016651 0ustar /* * Copyright (C) 2007-2008, Hewlett-Packard Development Company, LLP * All rights reserved. * * 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. * * Neither the name of the Hewlett-Packard Corporation, nor the names * of its contributors may be used to endorse or promote products * derived from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * Author(s) * Raja Kumar Thatte * Raghavendra P.G. * * This file handles all the hotswap related event handling * * oa_soap_get_hotswap_state() - gets the hotswap state of the * resource * * oa_soap_set_hotswap_state() - sets the hotswap state of the * resource * * oa_soap_get_indicator_state() - gets the hotswap LED indicator * state of the resource * * oa_soap_set_indicator_state() - sets the hotswap LED indicator * state of the resource * * oa_soap_request_hotswap_action() - requests the hotswap action * * oa_soap_hotswap_policy_cancel() - requests hotswap policy cancel * * oa_soap_get_autoinsert_timeout() - gets the auto insert event * Timeout period * * oa_soap_set_autoinsert_timeout() - sets the auto insert event * Timeout period * * oa_soap_get_autoextract_timeout() - gets the auto extract event * Timeout period * * oa_soap_set_autoextract_timeout() - sets the auto extract event * Timeout period **/ #include "oa_soap_hotswap.h" /** * oa_soap_get_hotswap_state * @oh_handler: Pointer to openhpi handler structure * @resource_id: Resource id * @state: Hotswap state * * Purpose: * Gets the hotswap state of the resource * * Detailed Description: NA * * Return values: * SA_OK - on success. * SA_ERR_HPI_INVALID_PARAMS - on wrong parameters * SA_ERR_HPI_INVALID_RESOURCE - on invalid resource id * SA_ERR_HPI_CAPABILITY - on not having hotswap capability * SA_ERR_HPI_INTERNAL_ERROR - on failure. **/ SaErrorT oa_soap_get_hotswap_state(void *oh_handler, SaHpiResourceIdT resource_id, SaHpiHsStateT *state) { struct oa_soap_hotswap_state *hotswap_state = NULL; struct oh_handler_state *handler = NULL; SaHpiRptEntryT *rpt = NULL; if (oh_handler == NULL || state == NULL) { err("Invalid parameters"); return(SA_ERR_HPI_INVALID_PARAMS); } handler = (struct oh_handler_state *) oh_handler; rpt = oh_get_resource_by_id(handler->rptcache, resource_id); if (rpt == NULL) { err("failed to get rpt entry"); return SA_ERR_HPI_INVALID_RESOURCE; } if (! (rpt->ResourceCapabilities & SAHPI_CAPABILITY_MANAGED_HOTSWAP)) { err("Resource does not have MANAGED_HOTSWAP capability"); return SA_ERR_HPI_CAPABILITY; } /* Get the hotswap structure from rpt */ hotswap_state = (struct oa_soap_hotswap_state *) oh_get_resource_data(handler->rptcache, resource_id); if (hotswap_state == NULL) { err("Unable to get the resource private data"); return SA_ERR_HPI_INVALID_RESOURCE; } if (hotswap_state->currentHsState == SAHPI_HS_STATE_NOT_PRESENT) { /* We can never have any resouce information in RPT with * NOT_PRESENT hotswap state * Ideally, this code should never gets executed */ return SA_ERR_HPI_INVALID_RESOURCE; } *state = hotswap_state->currentHsState; return SA_OK; } /** * oa_soap_set_hotswap_state * @oh_handler: Pointer to openhpi handler structure * @resource_id: Resource id * @state: Hotswap state * * Purpose: * Sets the hotswap state of the resource * * Detailed Description: * Currently, the OA plug-in does not stay in the InsertionPending or * ExtractionPending states. Because of this, the ActiveSet() and * InactiveSet() will always be an invalid request, as per the HPI * specification. * * As it turns out, the current infrastructure code does not even call * this plug-in routine. However, if it's ever called, we need to be * returning the correct values. * * Return value: * SA_ERR_HPI_INVALID_REQUEST - We're not in one of the pending states **/ SaErrorT oa_soap_set_hotswap_state(void *oh_handler, SaHpiResourceIdT resource_id, SaHpiHsStateT state) { return SA_ERR_HPI_INVALID_REQUEST; } /** * oa_soap_get_indicator_state * @oh_handler: Pointer to openhpi handler structure * @resource_id: Resource id * @state: Hotswap state * * Purpose: * Gets the hotswap LED indicator state of the resource * * Detailed Description: NA * * Return values: * SA_OK - on success. * SA_ERR_HPI_INVALID_PARAMS - on wrong parameters * SA_ERR_HPI_INVALID_RESOURCE - on invalid resource id * SA_ERR_HPI_CAPABILITY - on not having hotswap capability * SA_ERR_HPI_INTERNAL_ERROR - on failure. **/ SaErrorT oa_soap_get_indicator_state(void *oh_handler, SaHpiResourceIdT resource_id, SaHpiHsIndicatorStateT *state) { err("oa_soap_get_indicator_state not supported"); return SA_ERR_HPI_UNSUPPORTED_API; } /** * oa_soap_set_indicator_state * @oh_handler: Pointer to openhpi handler structure * @resource_id: Resource id * @state: Hotswap state * * Purpose: * Sets the hotswap LED indicator state of the resource * * Detailed Description: NA * * Return values: * SA_OK - on success. * SA_ERR_HPI_INVALID_PARAMS - on wrong parameters * SA_ERR_HPI_INVALID_RESOURCE - on invalid resource id * SA_ERR_HPI_CAPABILITY - on not having hotswap capability * SA_ERR_HPI_INTERNAL_ERROR - on failure. **/ SaErrorT oa_soap_set_indicator_state(void *oh_handler, SaHpiResourceIdT resource_id, SaHpiHsIndicatorStateT state) { err("oa_soap_set_indicator_state not supported"); return SA_ERR_HPI_UNSUPPORTED_API; } /** * oa_soap_request_hotswap_action * @oh_handler: Pointer to openhpi handler structure * @resource_id: Resource id * @action: Hotswap action * * Purpose: * Requests the hotswap action * * Detailed Description: NA * * Return values: * SA_OK - on success. * SA_ERR_HPI_INVALID_PARAMS - on wrong parameters * SA_ERR_HPI_INVALID_RESOURCE - on invalid resource id * SA_ERR_HPI_CAPABILITY - on not having hotswap capability * SA_ERR_HPI_INTERNAL_ERROR - on failure. **/ SaErrorT oa_soap_request_hotswap_action(void *oh_handler, SaHpiResourceIdT resource_id, SaHpiHsActionT action) { SaErrorT rv = SA_OK; struct oa_soap_hotswap_state *hotswap_state = NULL; struct oh_handler_state *handler = NULL; struct oa_soap_handler *oa_handler = NULL; SaHpiRptEntryT *rpt = NULL; char *type = NULL; if (oh_handler == NULL) { err("Invalid parameters"); return(SA_ERR_HPI_INVALID_PARAMS); } handler = (struct oh_handler_state *) oh_handler; oa_handler = (struct oa_soap_handler *) handler->data; rv = lock_oa_soap_handler(oa_handler); if (rv != SA_OK) { err("OA SOAP handler is locked"); return rv; } /* Check whether hotswap action is corrrect or not */ type = oh_lookup_hsaction(action); if (type == NULL) { return SA_ERR_HPI_INVALID_PARAMS; } rpt = oh_get_resource_by_id(handler->rptcache, resource_id); if (rpt == NULL) { err("Failed to get rpt entry"); return SA_ERR_HPI_INVALID_RESOURCE; } /* Check whether the resource has managed hotswap capability */ if (! (rpt->ResourceCapabilities & SAHPI_CAPABILITY_MANAGED_HOTSWAP)) { err("Resource does not have MANAGED_HOTSWAP capability"); return SA_ERR_HPI_CAPABILITY; } /* Get the hotswap structure from rpt entry */ hotswap_state = (struct oa_soap_hotswap_state *) oh_get_resource_data(handler->rptcache, resource_id); if (hotswap_state == NULL) { err("Unable to get the resource private data"); return SA_ERR_HPI_INVALID_RESOURCE; } switch (action) { case SAHPI_HS_ACTION_INSERTION: /* Check whether resource is in INACTIVE state * Setting to INSERTION state is possible * when theresource is in INACTIVE state */ if (hotswap_state->currentHsState == SAHPI_HS_STATE_INACTIVE) { rv = oa_soap_set_power_state( oh_handler, resource_id, SAHPI_POWER_ON); } else { err("Setting to INSERTION state is possible " "when theresource is in INACTIVE state."); err("The resource is not in INACTIVE state"); rv = SA_ERR_HPI_INVALID_REQUEST; } break; case SAHPI_HS_ACTION_EXTRACTION: /* Check whether resource is in ACTIVE state * Setting to EXTRACTION state is possible * when theresource is in ACTIVE state */ if (hotswap_state->currentHsState == SAHPI_HS_STATE_ACTIVE) { rv = oa_soap_set_power_state( oh_handler, resource_id, SAHPI_POWER_OFF); } else { err("Setting to EXTRACTION state is possible " "when theresource is in ACTIVE state."); err("The resource is not in ACTIVE state"); rv = SA_ERR_HPI_INVALID_REQUEST; } break; default: err("Invalid parameter"); rv = SA_ERR_HPI_INVALID_PARAMS; } return SA_OK; } /** * oa_soap_hotswap_policy_cancel * @oh_handler: Pointer to openhpi handler structure * @resource_id: Resource id * @tm: Timeout value * * Purpose: * Requests hotswap policy cancel * * Detailed Description: * Currently, the OA plug-in does not stay in the InsertionPending or * ExtractionPending states. Because of this, the policy_cancel request * will always be an invalid request, as per the HPI specification. * * As it turns out, the current infrastructure code does not even call * this plug-in routine. However, if it's ever called, we need to be * returning the correct values. * * Return value: * SA_ERR_HPI_INVALID_REQUEST - We're not in one of the pending states **/ SaErrorT oa_soap_hotswap_policy_cancel(void *oh_handler, SaHpiResourceIdT resource_id, SaHpiTimeoutT timeout) { return SA_ERR_HPI_INVALID_REQUEST; } /** * oa_soap_get_autoinsert_timeout: * @oh_handler: Handler data pointer. * @resource_id: Resource ID. * @timeout: Timeout to set. * * Purpose: * Get hotswap autoinsert timeout. * * Detailed Description: NA * * Return values: * SA_OK - on success * SAHPI_TIMEOUT_IMMEDIATE - autonomous handling is immediate * SA_ERR_HPI_INVALID_PARAMS - Pointer parameter(s) are NULL. **/ SaErrorT oa_soap_get_autoinsert_timeout(void *oh_handler, SaHpiResourceIdT resource_id, SaHpiTimeoutT timeout) { err("oa_soap_get_autoinsert_timeout is not supported"); err("Default auto insert timeout is IMMEDIATE and read only"); return SAHPI_TIMEOUT_IMMEDIATE; } /** * oa_soap_set_autoinsert_timeout: * @oh_handler: Handler data pointer. * @timeout: Timeout to set. * * Purpose: * Set hotswap autoinsert timeout. * * Detailed Description: NA * * Return values: * SA_OK - on success * SA_ERR_HPI_READ_ONLY - auto-insert timeout is fixed * SA_ERR_HPI_INVALID_PARAMS - Pointer parameter(s) are NULL. **/ SaErrorT oa_soap_set_autoinsert_timeout(void *oh_handler, SaHpiTimeoutT timeout) { err("oa_soap_set_autoinsert_timeout is not supported"); err("Default auto insert timeout is IMMEDIATE and read only"); return SA_ERR_HPI_READ_ONLY; } /** * oa_soap_get_autoextract_timeout: * @oh_handler: Handler data pointer. * @resource_id: Resource ID. * @timeout: Timeout value. * * Purpose: * Get a resource's hotswap autoextract timeout. * * Detailed Description: NA * * Return values: * SA_OK - Normal case. * SAHPI_TIMEOUT_IMMEDIATE - autonomous handling is immediate * SA_ERR_HPI_INVALID_PARAMS - Pointer parameter(s) are NULL. **/ SaErrorT oa_soap_get_autoextract_timeout(void *oh_handler, SaHpiResourceIdT resource_id, SaHpiTimeoutT *timeout) { err("oa_soap_get_autoextract_timeout is not supported"); err("Default auto extract timeout is IMMEDIATE and read only"); return SAHPI_TIMEOUT_IMMEDIATE; } /** * oa_soap_set_autoextract_timeout: * @oh_handler: Handler data pointer. * @resource_id: Resource ID. * @timeout: Timeout to set. * * Purpose: * Set a resource hotswap autoextract timeout. * * Detailed Description: NA * * Return values: * SA_OK - on success * SA_ERR_HPI_READ_ONLY - auto-insert timeout is fixed * SA_ERR_HPI_INVALID_PARAMS - Pointer parameter(s) are NULL. **/ SaErrorT oa_soap_set_autoextract_timeout(void *oh_handler, SaHpiResourceIdT resource_id, SaHpiTimeoutT timeout) { err("oa_soap_set_autoextract_timeout is not supported"); err("Default auto extract timeout is IMMEDIATE and read only"); return SA_ERR_HPI_READ_ONLY; } void * oh_get_hotswap_state (void *, SaHpiResourceIdT, SaHpiHsStateT *) __attribute__ ((weak, alias("oa_soap_get_hotswap_state"))); void * oh_set_hotswap_state (void *, SaHpiResourceIdT, SaHpiHsStateT) __attribute__ ((weak, alias("oa_soap_set_hotswap_state"))); void * oh_request_hotswap_action (void *, SaHpiResourceIdT, SaHpiHsActionT) __attribute__ ((weak, alias("oa_soap_request_hotswap_action"))); void * oh_hotswap_policy_cancel (void *, SaHpiResourceIdT, SaHpiTimeoutT) __attribute__ ((weak, alias("oa_soap_hotswap_policy_cancel"))); void * oh_get_indicator_state (void *, SaHpiResourceIdT, SaHpiHsIndicatorStateT *) __attribute__ ((weak, alias("oa_soap_get_indicator_state"))); void * oh_set_indicator_state (void *, SaHpiResourceIdT, SaHpiHsIndicatorStateT) __attribute__ ((weak, alias("oa_soap_set_indicator_state"))); void * oh_get_autoinsert_timeout (void *, SaHpiResourceIdT, SaHpiTimeoutT) __attribute__ ((weak, alias("oa_soap_get_autoinsert_timeout"))); void * oh_set_autoinsert_timeout (void *, SaHpiTimeoutT) __attribute__ ((weak, alias("oa_soap_set_autoinsert_timeout"))); void * oh_get_autoextract_timeout (void *, SaHpiResourceIdT, SaHpiTimeoutT *) __attribute__ ((weak, alias("oa_soap_get_autoextract_timeout"))); void * oh_set_autoextract_timeout (void *, SaHpiResourceIdT, SaHpiTimeoutT) __attribute__ ((weak, alias("oa_soap_set_autoextract_timeout"))); openhpi-2.14.1/plugins/snmp_bc/0000755000076400007640000000000011405006365013273 5ustar openhpi-2.14.1/plugins/snmp_bc/snmp_bc_sel.c0000644000076400007640000011376511302566770015747 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2003, 2006 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * Sean Dague * Peter Phan * Steve Sherman */ #include #include #include #include oh_el *bc_selcache = NULL; /** * snmp_bc_get_sel_size: * @handle: Pointer to handler's data. * @id: Resource ID that owns the Event Log. * * Get size of event log. * * Return values: * Number of event log entries - normal case. **/ static int snmp_bc_get_sel_size(struct oh_handler_state *handle, SaHpiResourceIdT id) { int i; SaErrorT err; SaHpiEventLogInfoT elinfo; i = 1; err = SA_OK; /* Go synchronize cache and hardware copy of the SEL */ err = snmp_bc_check_selcache(handle, id, SAHPI_NEWEST_ENTRY); if (err) /* --------------------------------------------------------------- */ /* If an error is encounterred during building of snmp_bc elcache, */ /* only log the error. Do not do any recovery because log entries */ /* are still kept in bc mm. We'll pick them up during synch. */ /* --------------------------------------------------------------- */ err("snmp_bc_discover, Error %s when building elcache.\n", oh_lookup_error(err)); /* Return the entry count */ oh_el_info(handle->elcache, &elinfo); i = elinfo.Entries; return i; } /** * snmp_bc_get_sel_info: * @hnd: Pointer to handler's data. * @id: Resource ID that owns the Event Log. * @info: Location to store Event Log information. * * Returns SaHpiEventLogInfoT information about Event Log. * * Return values: * SA_OK - normal case. * SA_ERR_HPI_INVALID_PARAMS - Any pointer parameter is NULL. **/ SaErrorT snmp_bc_get_sel_info(void *hnd, SaHpiResourceIdT id, SaHpiEventLogInfoT *info) { char oid[SNMP_BC_MAX_OID_LENGTH]; SaErrorT err; struct snmp_value first_value; struct oh_handler_state *handle; struct tm curtime; sel_entry sel_entry; struct snmp_bc_hnd *custom_handle; SaHpiEventLogInfoT sel, elinfo; if (!hnd || !info) { err("Invalid parameter."); return(SA_ERR_HPI_INVALID_PARAMS); } handle = (struct oh_handler_state *)hnd; custom_handle = (struct snmp_bc_hnd *)handle->data; snmp_bc_lock_handler(custom_handle); /* Build local copy of EventLogInfo */ /* Max number of entries that can be stored */ /* in bc EventLog varies, depending on */ /* what events have been logged so far and */ /* the information each logged event contains*/ sel.Size = BC_EL_MAX_SIZE; /* This is clearly a guess but looks about right * from the 75% full errors we have seen. */ sel.UserEventMaxSize = SAHPI_MAX_TEXT_BUFFER_LENGTH; sel.Enabled = SAHPI_TRUE; sel.OverflowFlag = SAHPI_FALSE; sel.OverflowResetable = SAHPI_FALSE; sel.OverflowAction = SAHPI_EL_OVERFLOW_OVERWRITE; sel.UpdateTimestamp = 0; /* In Event Log, the newest entry is index at index 1 */ /* Need first value to figure out what update time is */ if (custom_handle->platform == SNMP_BC_PLATFORM_RSA) { snprintf(oid, SNMP_BC_MAX_OID_LENGTH,"%s.%d", SNMP_BC_SEL_ENTRY_OID_RSA, 1); } else { snprintf(oid, SNMP_BC_MAX_OID_LENGTH,"%s.%d", SNMP_BC_SEL_ENTRY_OID, 1); } err = snmp_bc_snmp_get(custom_handle, oid, &first_value, SAHPI_TRUE); if (err == SA_OK) { if (first_value.type == ASN_OCTET_STR) { err = snmp_bc_parse_sel_entry(handle, first_value.string, &sel_entry); if (err) { err("Cannot get first date"); snmp_bc_unlock_handler(custom_handle); return(err); } else { sel.UpdateTimestamp = (SaHpiTimeT) mktime(&sel_entry.time) * 1000000000; } } } else { snmp_bc_unlock_handler(custom_handle); return(err); } err = snmp_bc_get_sp_time(handle, &curtime); if ( err == SA_OK) { sel.CurrentTime = (SaHpiTimeT) mktime(&curtime) * 1000000000; } else { snmp_bc_unlock_handler(custom_handle); return(err); } sel.Entries = snmp_bc_get_sel_size(handle, id); oh_el_info(handle->elcache, &elinfo); sel.OverflowFlag = elinfo.OverflowFlag; *info = sel; snmp_bc_unlock_handler(custom_handle); return(SA_OK); } /** * snmp_bc_get_sel_entry: * @hnd: Pointer to handler's data. * @id: Resource ID that owns the Event Log. * @current: Current event's ID. * @prev: Location to store previous event's ID. * @next: Location to store next event's ID. * @entry: Location to store retrieved event. * * Gets an entry from the system Event Log. * * Return values: * SA_OK - normal case. * SA_ERR_HPI_INVALID_PARAMS - Any pointer parameter is NULL. **/ SaErrorT snmp_bc_get_sel_entry(void *hnd, SaHpiResourceIdT id, SaHpiEventLogEntryIdT current, SaHpiEventLogEntryIdT *prev, SaHpiEventLogEntryIdT *next, SaHpiEventLogEntryT *entry, SaHpiRdrT *rdr, SaHpiRptEntryT *rptentry) { SaErrorT err; oh_el_entry tmpentry, *tmpentryptr; struct oh_handler_state *handle; struct snmp_bc_hnd *custom_handle; if (!hnd || !prev || !next || !entry) { err("Invalid parameter."); return(SA_ERR_HPI_INVALID_PARAMS); } memset(entry, 0, sizeof(SaHpiEventLogEntryT)); err = SA_OK; tmpentryptr = &tmpentry; handle = (struct oh_handler_state *)hnd; custom_handle = (struct snmp_bc_hnd *)handle->data; snmp_bc_lock_handler(custom_handle); if (handle->elcache != NULL) { /* Force a cache sync before servicing the request */ err = snmp_bc_check_selcache(handle, id, current); if (err) { err("Event Log cache sync failed %s\n", oh_lookup_error(err)); /* --------------------------------------------------------------- */ /* If an error is encountered during building of snmp_bc elcache, */ /* only log the error. Do not do any recovery because log entries */ /* are still kept in bc mm. We'll pick them up during synch. */ /* --------------------------------------------------------------- */ } err = oh_el_get(handle->elcache, current, prev, next, &tmpentryptr); if (err) { err("Getting Event Log entry=%d from cache failed. Error=%s.", current, oh_lookup_error(err)); snmp_bc_unlock_handler(custom_handle); return(err); } else { memcpy(entry, &(tmpentryptr->event), sizeof(SaHpiEventLogEntryT)); if (rdr) memcpy(rdr, &tmpentryptr->rdr, sizeof(SaHpiRdrT)); else dbg("NULL rdrptr with SaHpiEventLogEntryGet()\n"); if (rptentry) memcpy(rptentry, &(tmpentryptr->res), sizeof(SaHpiRptEntryT)); else dbg("NULL rptptr with SaHpiEventLogEntryGet()\n"); } } else { err("Missing handle->elcache"); snmp_bc_unlock_handler(custom_handle); return(SA_ERR_HPI_INTERNAL_ERROR); } snmp_bc_unlock_handler(custom_handle); return(SA_OK); } /** * snmp_bc_bulk_selcache * @handle: Pointer to handler's data. * @id: Resource ID that owns the Event Log. * * Builds internal event log cache using SNMP_MSG_GETBULK. * * Return values: * SA_OK - normal case. * SA_ERR_HPI_INVALID_PARAMS - @handle is NULL. **/ SaErrorT snmp_bc_bulk_selcache( struct oh_handler_state *handle, SaHpiResourceIdT id) { struct snmp_bc_hnd *custom_handle; SaErrorT err; int isdst; sel_entry sel_entry; SaHpiEventT tmpevent; netsnmp_pdu *pdu, *response; netsnmp_variable_list *vars; LogSource2ResourceT logsrc2res; int count; int running; int status; char logstring[MAX_ASN_STR_LEN]; char objoid[SNMP_BC_MAX_OID_LENGTH]; oid name[MAX_OID_LEN]; oid root[MAX_OID_LEN]; size_t rootlen; size_t name_length; size_t str_len; int reps; if (!handle) { err("Invalid parameter."); return(SA_ERR_HPI_INVALID_PARAMS); } str_len = MAX_ASN_STR_LEN; isdst=0; custom_handle = (struct snmp_bc_hnd *)handle->data; reps = custom_handle->count_per_getbulk; /* --------------------------------------------------- */ /* Set initial Event Log Entry OID and root tree */ /* --------------------------------------------------- */ if (custom_handle->platform == SNMP_BC_PLATFORM_RSA) { snprintf(objoid, SNMP_BC_MAX_OID_LENGTH, "%s", SNMP_BC_SEL_ENTRY_OID_RSA); } else { snprintf(objoid, SNMP_BC_MAX_OID_LENGTH, "%s",SNMP_BC_SEL_ENTRY_OID); } rootlen = MAX_OID_LEN; read_objid(objoid, root, &rootlen); /* --------------------------------------------------- */ /* Object ID for GETBULK request */ /* --------------------------------------------------- */ g_memmove(name, root, rootlen * sizeof(oid)); name_length = rootlen; running = 1; while (running) { /* --------------------------------------------------- */ /* Create PDU for GETBULK request */ /* --------------------------------------------------- */ pdu = snmp_pdu_create(SNMP_MSG_GETBULK); status = snmp_getn_bulk(custom_handle->sessp, name, name_length, pdu, &response, reps); if (pdu) snmp_free_pdu(pdu); if (status == STAT_SUCCESS) { if (response->errstat == SNMP_ERR_NOERROR) { for (vars = response->variables; vars; vars = vars->next_variable) { /* ------------------------------------------------- */ /* Check if this variable is of the same OID tree */ /* ------------------------------------------------- */ if ((vars->name_length < rootlen) || (memcmp(root, vars->name, rootlen * sizeof(oid)) != 0)) { /* Exit vars processing */ running = 0; continue; } if ((vars->type != SNMP_ENDOFMIBVIEW) && (vars->type != SNMP_NOSUCHOBJECT) && (vars->type != SNMP_NOSUCHINSTANCE)) { if (snmp_oid_compare(name, name_length, vars->name, vars->name_length) >= 0) { fprintf(stderr, "Error: OID not increasing: "); fprint_objid(stderr, name, name_length); fprintf(stderr, " >= "); fprint_objid(stderr, vars->name, vars->name_length); fprintf(stderr, "\n"); running = 0; } /* ---------------------------------- */ /* Check if last variable, */ /* and if so, save for next request. */ /* ---------------------------------- */ if (vars->next_variable == NULL) { g_memmove(name, vars->name, vars->name_length * sizeof(oid)); name_length = vars->name_length; } /* ---------------------------------- */ /* ---------------------------------- */ /* ---------------------------------- */ if ((running == 1) && (vars->type == ASN_OCTET_STR)) { if (vars->val_len < MAX_ASN_STR_LEN) str_len = vars->val_len; else str_len = MAX_ASN_STR_LEN; /* ---------------------------------- */ /* Guarantee NULL terminated string */ /* ---------------------------------- */ // memcpy(logstring, vars->val.string, str_len); g_memmove(logstring, vars->val.string, str_len); logstring[str_len] = '\0'; err = snmp_bc_parse_sel_entry(handle,logstring, &sel_entry); isdst = sel_entry.time.tm_isdst; snmp_bc_log2event(handle, logstring, &tmpevent, isdst, &logsrc2res); err = oh_el_prepend(handle->elcache, &tmpevent, NULL, NULL); if (custom_handle->isFirstDiscovery == SAHPI_FALSE) err = snmp_bc_add_to_eventq(handle, &tmpevent, SAHPI_TRUE); } } else { /* Stop on an exception value */ running = 0; } } /* end for */ } else { /* if (response->errstat != SNMP_ERR_NOERROR) */ /* --------------------------------------------- */ /* Error condition is seen in response, */ /* for now, print the error then exit */ /* Not sure what to do for recovery */ running = 0; if (response->errstat == SNMP_ERR_NOSUCHNAME) { printf("End of MIB\n"); } else { fprintf(stderr, "Error in packet.\nReason: %s\n", snmp_errstring(response->errstat)); if (response->errindex != 0) { fprintf(stderr, "Failed object: "); for (count = 1, vars = response->variables; vars && count != response->errindex; vars = vars->next_variable, count++) if (vars) fprint_objid(stderr, vars->name, vars->name_length); fprintf(stderr, "\n"); } } } } else if (status == STAT_TIMEOUT) { fprintf(stderr, "Timeout: No Response\n"); running = 0; } else { /* status == STAT_ERROR */ snmp_sess_perror("snmp_bulk_sel",custom_handle->sessp ); running = 0; } if (response) snmp_free_pdu(response); } return(SA_OK); } /** * snmp_bc_check_selcache: * @handle: Pointer to handler's data. * @id: Resource ID that owns Event Log. * @entryId: Event Log entry ID. * * Sync Event Log's cache. If this is first entry, then create the * event log cache. * * Return values: * SA_OK - normal operation. * SA_ERR_HPI_INVALID_PARAMS - @handler is NULL. **/ SaErrorT snmp_bc_check_selcache(struct oh_handler_state *handle, SaHpiResourceIdT id, SaHpiEventLogEntryIdT entryId) { SaErrorT err; SaHpiEventLogInfoT elinfo; if (!handle) { err("Invalid parameter."); return(SA_ERR_HPI_INVALID_PARAMS); } err = SA_OK; oh_el_info(handle->elcache, &elinfo); if (elinfo.Entries == 0 && !(is_simulator())) { /* err = snmp_bc_build_selcache(handle, id); */ dbg("elcache sync called before discovery?\n"); } else { err = snmp_bc_selcache_sync(handle, id, entryId); } if (err) { err("Event Log cache build/sync failed. Error=%s", oh_lookup_error(err)); return(err); } return(SA_OK); } /** * snmp_bc_selcache_sync * @handle: Pointer to handler's data. * @id: Resource ID that owns Event Log. * @entryId: Event Log entry ID. * * Synchronizes internal event log cache. Although BladeCenter can read events from * the hardware in any order; RSA requires that they be read from first to last. * To support common code, events are read in order and preappended to the * cache log. * * Return values: * SA_OK - normal operation. * SA_ERR_HPI_INVALID_PARAMS - @handle is NULL. **/ SaErrorT snmp_bc_selcache_sync(struct oh_handler_state *handle, SaHpiResourceIdT id, SaHpiEventLogEntryIdT entryId) { SaHpiEventLogEntryIdT prev; SaHpiEventLogEntryIdT next; struct snmp_value get_value, *this_value; sel_entry sel_entry; oh_el_entry *fetchentry, tmpentry; SaHpiTimeT new_timestamp; char oid[SNMP_BC_MAX_OID_LENGTH]; SaErrorT err; int current, cacheupdate; struct snmp_bc_hnd *custom_handle; int isdst; SaHpiEventT tmpevent; LogSource2ResourceT logsrc2res; GList *sync_log, *proc_log; if (!handle) { err("Invalid parameter."); return(SA_ERR_HPI_INVALID_PARAMS); } err = SA_OK; sync_log = NULL; proc_log = NULL; fetchentry = &tmpentry; cacheupdate = 0; custom_handle = (struct snmp_bc_hnd *)handle->data; err = oh_el_get(handle->elcache, SAHPI_NEWEST_ENTRY, &prev, &next, &fetchentry); if (err) fetchentry = NULL; if (fetchentry == NULL) { err = snmp_bc_build_selcache(handle, id); return(err); } current = 1; if (custom_handle->platform == SNMP_BC_PLATFORM_RSA) { snprintf(oid, SNMP_BC_MAX_OID_LENGTH, "%s.%d", SNMP_BC_SEL_ENTRY_OID_RSA, current); } else { snprintf(oid, SNMP_BC_MAX_OID_LENGTH, "%s.%d", SNMP_BC_SEL_ENTRY_OID, current); } err = snmp_bc_snmp_get(custom_handle, oid, &get_value, SAHPI_TRUE); if (err) { err("Error %s snmp_get latest BC Event Log.\n", oh_lookup_error(err)); /* Error attempting to sync elcache and BC Event Log */ /* Leave thing as is, instead of clearing elcache. */ /* Clearing cache will cause snmp traffic to re-read */ /* all BC Event Log. We want to keep traffic to min */ /* for snmp interface recovery */ /* err = oh_el_clear(handle->elcache); */ return(err); } if (snmp_bc_parse_sel_entry(handle, get_value.string, &sel_entry) < 0) { err("Cannot parse Event Log entry"); return(SA_ERR_HPI_INTERNAL_ERROR); } new_timestamp = (SaHpiTimeT)mktime(&sel_entry.time) * 1000000000; if (fetchentry->event.Event.Timestamp != new_timestamp) { this_value = g_memdup(&get_value, sizeof(get_value)); if (this_value != NULL) sync_log = g_list_prepend(sync_log, this_value); while (1) { current++; if (custom_handle->platform == SNMP_BC_PLATFORM_RSA) { snprintf(oid, SNMP_BC_MAX_OID_LENGTH, "%s.%d", SNMP_BC_SEL_ENTRY_OID_RSA, current); } else { snprintf(oid, SNMP_BC_MAX_OID_LENGTH, "%s.%d", SNMP_BC_SEL_ENTRY_OID, current); } err = snmp_bc_snmp_get(custom_handle,oid,&get_value, SAHPI_TRUE); if (err == SA_OK) { if (snmp_bc_parse_sel_entry(handle, get_value.string, &sel_entry) < 0) { err("Cannot parse SEL entry."); err = SA_ERR_HPI_INTERNAL_ERROR; goto out; } if ((fetchentry->event.Event.Timestamp == (SaHpiTimeT)mktime(&sel_entry.time) * 1000000000)) { current--; cacheupdate = 1; break; } else { this_value = g_memdup(&get_value, sizeof(struct snmp_value)); if (this_value != NULL) sync_log = g_list_prepend(sync_log, this_value); } } else { dbg("End of BladeCenter log reached."); break; } } if (cacheupdate) { proc_log = g_list_first(sync_log); while(proc_log != NULL) { this_value = (struct snmp_value *)proc_log->data; err = snmp_bc_parse_sel_entry(handle,this_value->string, &sel_entry); if (err != SA_OK) goto out; if (g_ascii_strncasecmp(get_value.string, EVT_EN_LOG_FULL, sizeof(EVT_EN_LOG_FULL)) == 0 ) oh_el_overflowset(handle->elcache, SAHPI_TRUE); isdst = sel_entry.time.tm_isdst; snmp_bc_log2event(handle, this_value->string, &tmpevent, isdst, &logsrc2res); /* append to end-of-elcache and end-of-eventq */ err = snmp_bc_add_entry_to_elcache(handle, &tmpevent, SAHPI_FALSE); proc_log = g_list_next(proc_log); } } else { err = oh_el_clear(handle->elcache); if (err != SA_OK) err("Invalid elcache pointer or mode, err %s\n", oh_lookup_error(err)); err = snmp_bc_build_selcache(handle, id); if ( (err == SA_ERR_HPI_OUT_OF_MEMORY) || (err == SA_ERR_HPI_INVALID_PARAMS)) { /* either of these 2 errors prevent us from doing anything meaningful */ /* tell user about them */ goto out; } } } else { dbg("EL Sync: there are no new entry indicated.\n"); } out: if (sync_log) { proc_log = g_list_first(sync_log); while (proc_log){ if ( (this_value = (struct snmp_value *) proc_log->data)) { g_free(this_value); } proc_log = g_list_next(proc_log); } g_list_free(sync_log); } return(err); } /** * snmp_bc_build_selcache * @handle: Pointer to handler's data. * @id: Resource ID that owns the Event Log. * * Builds internal event log cache. Although BladeCenter can read events from * the hardware in any order; RSA requires that they be read from first to last. * To support common code, events are read in order and preappended to the * cache log. * * Return values: * SA_OK - normal case. * SA_ERR_HPI_INVALID_PARAMS - @handle is NULL. **/ SaErrorT snmp_bc_build_selcache(struct oh_handler_state *handle, SaHpiResourceIdT id) { int i; SaErrorT err; struct snmp_bc_hnd *custom_handle; if (!handle) { err("Invalid parameter."); return(SA_ERR_HPI_INVALID_PARAMS); } err = SA_OK; custom_handle = (struct snmp_bc_hnd *)handle->data; /* ------------------------------------------------------------------- */ /* If user has configured for snmpV3, then use GETBULK for performance */ /* Else, stay with individual GETs */ /* ------------------------------------------------------------------- */ if ((custom_handle->session.version == SNMP_VERSION_3) && (custom_handle->count_per_getbulk != 0)) { /* ------------------------------------------------- */ /* DO NOT remove this trace statement!!!! */ /* ------------------------------------------------- */ /* Without this trace statement, */ /* -- stack corruption issue with multiple handlers */ /* gcc (GCC) 4.0.2 20051125 (Red Hat 4.0.2-8) */ /* -- works OK with with multiple handlers */ /* gcc (GCC) 4.1.0 20060123 (SLES10 Beta 2) */ /* -- works OK with with multiple handlers */ /* gcc (GCC) 4.0.1 (4.0.1-5mdk Mandriva 2006) */ /* -- works OK with all gcc vers for single handler */ dbg(">>>>>> bulk build selcache %p. count_per_getbulk %d\n", handle,custom_handle->count_per_getbulk); /* ------------------------------------------------- */ err = snmp_bc_bulk_selcache(handle, id); } else { i = 1; while(1) { err = snmp_bc_sel_read_add(handle, id, i, SAHPI_TRUE); if ( (err == SA_ERR_HPI_OUT_OF_MEMORY) || (err == SA_ERR_HPI_INVALID_PARAMS)) { /* Either of these 2 errors prevent us from doing anything meaningful */ return(err); } else if (err != SA_OK) { /* other errors (mainly HPI_INTERNAL_ERROR or HPI_BUSY) means */ /* only this record has problem. record error then go to next */ err("Error, %s, encountered with EventLog entry %d\n", oh_lookup_error(err), i); break; } i++; } } return(SA_OK); } /** * snmp_bc_set_sel_time: * @hnd: Pointer to handler's data. * @id: Resource's ID that owns Event Log. * @time: HPI time. * * Set Event Log's time. * * Return values: * SA_OK - normal operation. * SA_ERR_HPI_INVALID_PARAMS - @hnd is NULL. **/ SaErrorT snmp_bc_set_sel_time(void *hnd, SaHpiResourceIdT id, SaHpiTimeT time) { struct tm tv; time_t tt; SaErrorT err; struct oh_handler_state *handle; struct snmp_bc_hnd *custom_handle; if ( (!hnd) || (time == SAHPI_TIME_UNSPECIFIED)) { err("Invalid parameter."); return(SA_ERR_HPI_INVALID_PARAMS); } handle = (struct oh_handler_state *)hnd; custom_handle = (struct snmp_bc_hnd *)handle->data; snmp_bc_lock_handler(custom_handle); tt = time / 1000000000; localtime_r(&tt, &tv); if ( time < SAHPI_TIME_MAX_RELATIVE ) { dbg("Time input is relative time. Make it absolute.\n"); /* c time utilities have base epoch of 00:00:00 UTC, January 1, 1970 */ /* Bladecenter code has base epoch year 1999. */ /* So if the user chooses relative time, then */ /* we just adjust the year to the BladeCenter based year 1999. */ /* (1) tv.tm_year has (year - 1900) */ /* (2) which is (year - 1900 - 70) from year zero */ tv.tm_year = tv.tm_year - 70 + 99; } err = snmp_bc_set_sp_time(custom_handle, &tv); if (err) { snmp_bc_unlock_handler(custom_handle); err("Cannot set time. Error=%s.", oh_lookup_error(err)); return(SA_ERR_HPI_INTERNAL_ERROR); } snmp_bc_unlock_handler(custom_handle); return(SA_OK); } /** * snmp_bc_add_sel_entry: * @hnd: Pointer to handler's data. * @id: Resource's ID that owns Event Log. * @Event: Location of event to be added. * * Add is not supported by the hardware. * * Return values: * SA_ERR_HPI_INVALID_CMD - normal operation. **/ SaErrorT snmp_bc_add_sel_entry(void *hnd, SaHpiResourceIdT id, const SaHpiEventT *Event) { return(SA_ERR_HPI_INVALID_CMD); } /** * snmp_bc_sel_read_add: * @hnd: Pointer to handler's data. * @id: Resource's ID that owns Event Log. * @current: Current Event Log entry ID. * * Add event to Event Log. * * Return values: * SA_OK - normal operation. * SA_ERR_HPI_INVALID_PARAMS - @hnd is NULL. **/ SaErrorT snmp_bc_sel_read_add (struct oh_handler_state *handle, SaHpiResourceIdT id, SaHpiEventLogEntryIdT current, SaHpiBoolT prepend) { int isdst; char oid[SNMP_BC_MAX_OID_LENGTH]; sel_entry sel_entry; SaErrorT err; SaHpiEventT tmpevent; LogSource2ResourceT logsrc2res; struct snmp_value get_value; struct snmp_bc_hnd *custom_handle; if (!handle) { err("Invalid parameter."); return(SA_ERR_HPI_INVALID_PARAMS); } isdst=0; custom_handle = (struct snmp_bc_hnd *)handle->data; if (custom_handle->platform == SNMP_BC_PLATFORM_RSA) { snprintf(oid, SNMP_BC_MAX_OID_LENGTH, "%s.%d", SNMP_BC_SEL_ENTRY_OID_RSA, current); } else { snprintf(oid, SNMP_BC_MAX_OID_LENGTH, "%s.%d", SNMP_BC_SEL_ENTRY_OID, current); } err = snmp_bc_snmp_get(custom_handle, oid, &get_value, SAHPI_TRUE); if (err != SA_OK) return(err); else if ((err == SA_OK) && (get_value.type != ASN_OCTET_STR)) { err("Cannot get EL entry"); return(SA_ERR_HPI_INTERNAL_ERROR); } err = snmp_bc_parse_sel_entry(handle,get_value.string, &sel_entry); if (err != SA_OK) return(err); if (g_ascii_strncasecmp(get_value.string, EVT_EN_LOG_FULL, sizeof(EVT_EN_LOG_FULL)) == 0 ) oh_el_overflowset(handle->elcache, SAHPI_TRUE); isdst = sel_entry.time.tm_isdst; snmp_bc_log2event(handle, get_value.string, &tmpevent, isdst, &logsrc2res); err = snmp_bc_add_entry_to_elcache(handle, &tmpevent, prepend); return(err); } /** * snmp_bc_add_entry_to_elcache * @hnd: Pointer to handler's data. * @id: Resource's ID that owns Event Log. * @current: Current Event Log entry ID. * * Add event to Event Log. * * Return values: * SA_OK - normal operation. * SA_ERR_HPI_INVALID_PARAMS - @hnd is NULL. **/ SaErrorT snmp_bc_add_entry_to_elcache(struct oh_handler_state *handle, SaHpiEventT *tmpevent, SaHpiBoolT prepend) { SaHpiEntryIdT rdrid; SaHpiRdrT rdr, *rdr_ptr; struct snmp_bc_hnd *custom_handle; SaHpiResourceIdT id; SaErrorT err; if (!handle) { err("Invalid parameter."); return(SA_ERR_HPI_INVALID_PARAMS); } rdrid=0; rdr_ptr=NULL; custom_handle = (struct snmp_bc_hnd *)handle->data; /* See feature 1077241 */ switch (tmpevent->EventType) { case SAHPI_ET_OEM: case SAHPI_ET_HOTSWAP: case SAHPI_ET_USER: memset(&rdr, 0, sizeof(SaHpiRdrT)); /* There is no RDR associated to OEM event */ rdr.RdrType = SAHPI_NO_RECORD; /* Set RDR Type to SAHPI_NO_RECORD, spec B-01.01 */ /* It is redundant because SAHPI_NO_RECORD == 0 */ /* This code is here for clarity. */ rdr_ptr = &rdr; break; case SAHPI_ET_SENSOR: rdrid = oh_get_rdr_uid(SAHPI_SENSOR_RDR, tmpevent->EventDataUnion.SensorEvent.SensorNum); rdr_ptr = oh_get_rdr_by_id(handle->rptcache, tmpevent->Source, rdrid); break; case SAHPI_ET_WATCHDOG: rdrid = oh_get_rdr_uid(SAHPI_WATCHDOG_RDR, tmpevent->EventDataUnion.WatchdogEvent.WatchdogNum); rdr_ptr = oh_get_rdr_by_id(handle->rptcache, tmpevent->Source, rdrid); break; default: err("Unrecognized Event Type=%d.", tmpevent->EventType); return(SA_ERR_HPI_INTERNAL_ERROR); break; } /* Since oh_el_append() does a copy of RES and RDR into it own data struct, */ /* just pass the pointers to it. */ id = tmpevent->Source; if (NULL == oh_get_resource_by_id(handle->rptcache, id)) { dbg("Warning: NULL RPT for rid %d.", id); } if (prepend) err = oh_el_prepend(handle->elcache, tmpevent, rdr_ptr, oh_get_resource_by_id(handle->rptcache, id)); else err = oh_el_append(handle->elcache, tmpevent, rdr_ptr, oh_get_resource_by_id(handle->rptcache, id)); /* If can not add el entry to elcache, do not add entry to eventq */ /* If entry is not added to elcache and is added to eventq, there */ /* will be an indefinite loop: */ /* 1. get_event is called. get_event call elcache_sync */ /* 2. elcache_sync finds new el entry */ /* 3a. adding new el entry to elcache fails */ /* 3b. adding new el entry to eventq */ /* 4. new event is propergate to infrastructure */ /* 5. infrastructure consume new event */ /* *and* call get_event for any more */ /* 6. we repeat step 1 ... indefinite loop */ if (!err) { if (custom_handle->isFirstDiscovery == SAHPI_FALSE) err = snmp_bc_add_to_eventq(handle, tmpevent, prepend); if (err) err("Cannot add el entry to eventq. Error=%s.", oh_lookup_error(err)); } else { err("Cannot add el entry to elcache. Error=%s.", oh_lookup_error(err)); } return(err); } /** * snmp_bc_parse_sel_entry: * @handle: Pointer to handler data. * @logstr: Hardware log string. * @sel: blade center system event log * * Parses a hardware log entry into its various components. * Another transform has to happen to turn this into an HPI entry. * * Return values: * SA_OK - normal operation. * SA_ERR_HPI_INVALID_PARAMS - @handle, @logstr, @sel NULL. **/ SaErrorT snmp_bc_parse_sel_entry(struct oh_handler_state *handle, char *logstr, sel_entry *sel) { sel_entry ent; char level[8]; char *findit; struct snmp_bc_hnd *custom_handle; if (!handle || !logstr || !sel) { err("Invalid parameter."); return(SA_ERR_HPI_INVALID_PARAMS); } custom_handle = (struct snmp_bc_hnd *)handle->data; if (!custom_handle) return(SA_ERR_HPI_INVALID_PARAMS); /* Severity first */ findit = strstr(logstr, "Severity:"); if (findit != NULL) { if(sscanf(findit,"Severity:%7s",level)) { if(g_ascii_strncasecmp(level,"INFO", sizeof("INFO")) == 0) { ent.sev = SAHPI_INFORMATIONAL; } else if(g_ascii_strncasecmp(level,"WARN", sizeof("WARN")) == 0) { ent.sev = SAHPI_MINOR; } else if(g_ascii_strncasecmp(level,"ERR", sizeof("ERR")) == 0) { ent.sev = SAHPI_CRITICAL; } else { ent.sev = SAHPI_DEBUG; } } else { err("Cannot parse severity from log entry."); return(SA_ERR_HPI_INTERNAL_ERROR); } } findit = strstr(logstr, "Source:"); if (findit != NULL) { if(!sscanf(findit,"Source:%19s",ent.source)) { err("Cannot parse source from log entry."); return(SA_ERR_HPI_INTERNAL_ERROR); } } else { err("Premature data termination."); return(SA_ERR_HPI_INTERNAL_ERROR); } /* No Name field in RSA event messages */ if (custom_handle->platform == SNMP_BC_PLATFORM_RSA) { strncpy(ent.sname, "RSA", sizeof("RSA")); } else { findit = strstr(logstr, "Name:"); if (findit != NULL) { if(!sscanf(findit,"Name:%19s",ent.sname)) { err("Cannot parse name from log entry."); return(SA_ERR_HPI_INTERNAL_ERROR); } } else { err("Premature data termination."); return(SA_ERR_HPI_INTERNAL_ERROR); } } findit = strstr(logstr, "Date:"); if (findit != NULL) { if(sscanf(findit,"Date:%2d/%2d/%2d Time:%2d:%2d:%2d", &ent.time.tm_mon, &ent.time.tm_mday, &ent.time.tm_year, &ent.time.tm_hour, &ent.time.tm_min, &ent.time.tm_sec)) { snmp_bc_set_dst(handle, &ent.time); ent.time.tm_mon--; ent.time.tm_year += 100; } else { err("Cannot parse date/time from log entry."); return(SA_ERR_HPI_INTERNAL_ERROR); } } else { err("Premature data termination."); return(SA_ERR_HPI_INTERNAL_ERROR); } findit = strstr(logstr, "Text:"); if (findit != NULL) { /* Advance to data */ findit += 5; strncpy(ent.text,findit, SNMP_BC_MAX_SEL_ENTRY_LENGTH - 1); ent.text[SNMP_BC_MAX_SEL_ENTRY_LENGTH - 1] = '\0'; } else { err("Premature data termination."); return(SA_ERR_HPI_INTERNAL_ERROR); } *sel = ent; return(SA_OK); } /** * snmp_bc_clear_sel: * @hnd: Pointer to handler's data. * @id: Resource ID that owns the Event Log. * * Clears the system event log. * * Return values: * SA_OK - normal case. * SA_ERR_HPI_INVALID_PARAMS - @hnd is NULL. **/ SaErrorT snmp_bc_clear_sel(void *hnd, SaHpiResourceIdT id) { struct snmp_value set_value; struct oh_handler_state *handle; SaErrorT err; struct snmp_bc_hnd *custom_handle; if (!hnd) { err("Invalid parameter."); return(SA_ERR_HPI_INVALID_PARAMS); } handle = (struct oh_handler_state *)hnd; custom_handle = (struct snmp_bc_hnd *)handle->data; snmp_bc_lock_handler(custom_handle); err = oh_el_clear(handle->elcache); if (err) { snmp_bc_unlock_handler(custom_handle); err("Cannot clear system Event Log. Error=%s.", oh_lookup_error(err)); return(err); } set_value.type = ASN_INTEGER; set_value.str_len = 1; set_value.integer = (long) clearEventLogExecute; if (custom_handle->platform == SNMP_BC_PLATFORM_RSA) { err = snmp_bc_snmp_set(custom_handle, SNMP_BC_SEL_CLEAR_OID_RSA, set_value); } else { err = snmp_bc_snmp_set(custom_handle, SNMP_BC_SEL_CLEAR_OID, set_value); } if (err) { snmp_bc_unlock_handler(custom_handle); err("SNMP set failed. Error=%s.", oh_lookup_error(err)); return(err); } else if (!is_simulator()) { /* Pick up the newly created entry, Log Clear message */ err = snmp_bc_build_selcache(handle, 1); } snmp_bc_unlock_handler(custom_handle); return(SA_OK); } /** * snmp_bc_sel_overflowreset: * @hnd: Pointer to handler's data. * @id: Resource ID that owns the Event Log. * * Clear the overflow flag by itself is not supported by snmp_bc plugin. * Rather, it can be cleared implicitly via clear_sel command, saHpiEventLogClear() * * Return values: * SA_ERR_HPI_INVALID_CMD - normal case. **/ SaErrorT snmp_bc_sel_overflowreset(void *hnd, SaHpiResourceIdT id) { return(SA_ERR_HPI_INVALID_CMD); } /** * snmp_bc_sel_state_set: * @hnd: Pointer to handler's data. * @id: Resource ID that owns the Event Log. * @enable: State to which to set Resource Event Log. * * Enable/Disable logging of event is not allowed via SMMP for BladeCenter. * * Return values: * SA_ERR_HPI_READ_ONLY - normal case. **/ SaErrorT snmp_bc_sel_state_set(void *hnd, SaHpiResourceIdT id, SaHpiBoolT enable) { /* Other required test, SA_ERR_HPI_CAPABILITY, is done in infrastructure */ return SA_ERR_HPI_READ_ONLY; } void * oh_get_el_info (void *, SaHpiResourceIdT, SaHpiEventLogInfoT *) __attribute__ ((weak, alias("snmp_bc_get_sel_info"))); void * oh_set_el_time (void *, SaHpiResourceIdT, const SaHpiEventT *) __attribute__ ((weak, alias("snmp_bc_set_sel_time"))); void * oh_add_el_entry (void *, SaHpiResourceIdT, const SaHpiEventT *) __attribute__ ((weak, alias("snmp_bc_add_sel_entry"))); void * oh_get_el_entry (void *, SaHpiResourceIdT, SaHpiEventLogEntryIdT, SaHpiEventLogEntryIdT *, SaHpiEventLogEntryIdT *, SaHpiEventLogEntryT *, SaHpiRdrT *, SaHpiRptEntryT *) __attribute__ ((weak, alias("snmp_bc_get_sel_entry"))); void * oh_clear_el (void *, SaHpiResourceIdT) __attribute__ ((weak, alias("snmp_bc_clear_sel"))); void * oh_reset_el_overflow (void *, SaHpiResourceIdT) __attribute__ ((weak, alias("snmp_bc_sel_overflowreset"))); void * oh_set_el_state(void *, SaHpiResourceIdT, SaHpiBoolT) __attribute__ ((weak, alias("snmp_bc_sel_state_set"))); openhpi-2.14.1/plugins/snmp_bc/bc2hpi.pdf0000644000076400007640000261312611302566770015157 0ustar %PDF-1.4 %äüöß 2 0 obj <> stream xœíWÉjA½ÏWÔÙvWï & YVÈQAˆã„ %Ø—ü~ªz™¥5£ø‹Ã Toª^U¿Þj$üîžAÂ;)*zúÈÏ—¯ðù~¦—ü{ùÖm༣×ÇG¸Ý#¨Ç'¸“øŽ?:¥…'Wzw'UBP W‘@Ñ1‰ƒÍˆ¡".3+¡—}|ö‘ÂT$d%ârT̈M‰£lý8¶µj?xÝË|H¸—C]¹/c´¡Ï‹²ã ‚Z]Œ³žÇîÐL‰uT’ô:OŠ"c<)z_b \xü `ͲfY³¬YÖ,k–E _k£@×®`ä¤ëí„ö~¸–u¹4éÒ_.(”¨>]ük…›6Ѷå¸î¯ÞÕ6R=ÍU½K£Ö¨´BU`ß&Ñ¥Ô™4‘;‰™4¥õ˜‹”i®°VŽÒ«˜¡ÒÅ*P2ß\ª‘tÜÜàÏz Jr[ƒMCʨ²)¿²ì,´ðåÜÝ~<Øý‚Ìvµ¹UÆ[¸B dšªF0ÚŠX¹ìÀåx4ÆYêËupÐ(Òzħ\š3¢3Ž™)‚j3ÙÈ|îµµÉÀE0™âæÐ‚æ6F,UšÉ|&Cà ŠW‘¡² œ»$O6N ZƒŽ dÑZ+;N8Nð½{ºéòÄ~úÐÌqˆ‰Ÿõhæ8wÂ}lÚmUxÝÐh ôÒ#7¡¼|ï[ ”µºHYŽŒ´ðtLƒV& §]+Y'(–I,£“XS+{NX®K§-Ëk”ÛÚõçQ=)úMmQ;%ÒwQ mQJÞ9É¢¥—-Þ¼ly5ý_½F §îš®´Ê)Œö[x¥¬þMÈÚÀ›AV£ùL²êÈŸ²Ù¢%›-oy‰:7þW<ÆÑ×%ÕAòœÎˆÿx©ÒkgT>À“9¤| endstream endobj 3 0 obj 686 endobj 7 0 obj <> stream ÿØÿàJFIFÿÛC     ÿÛC   ÿÀÒ‰"ÿÄ ÿĵ}!1AQa"q2‘¡#B±ÁRÑð$3br‚ %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyzƒ„…†‡ˆ‰Š’“”•–—˜™š¢£¤¥¦§¨©ª²³´µ¶·¸¹ºÂÃÄÅÆÇÈÉÊÒÓÔÕÖרÙÚáâãäåæçèéêñòóôõö÷øùúÿÄ ÿĵw!1AQaq"2B‘¡±Á #3RðbrÑ $4á%ñ&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz‚ƒ„…†‡ˆ‰Š’“”•–—˜™š¢£¤¥¦§¨©ª²³´µ¶·¸¹ºÂÃÄÅÆÇÈÉÊÒÓÔÕÖרÙÚâãäåæçèéêòóôõö÷øùúÿÚ ?ìÿaÏŬxB¼D ÿ¾–¾LÖq\|ÞmÖöùþîúçþ7þѺ÷¿x·C±Ò¼;~š4»"y´x·²lFùëµÿ‚qj²ëß ¬š]>æÃìZežž³\}ˤYn?{û?>Ïø|©ûf?Ù¿h/‰ çɾêWx¡Fù>T‰eßÿzU>#š§4¤uÞ ý»|Câm9nçðç…­·où?²’µ_öÒÕ_þ`ÿé+_2üðkÚhŸÚ2ê¶—6^C'Ù."Ùÿ-‹øŸçÛRÞ'…tÛ8¥ÔìÙ%Ÿ{Å*NɧûŸÃ²´öqûDûßÌ}%ÿ ¥©§üËÞ û†'ÿMÿ†ÜÔ?èZð_þ ÿ‹¯?±î|ª}‡ÁÖ7×—o/Ì–í²$_øþ†ûj•×…n|%~‹yã .k¸¥MÚ~;Þïoîï‰|¯ü~¢Q‰\’þcí¤ý¶îSïxkÁoÿpïþΟÿ ÂÛÿáº×ÿg_H³Ý;Moâh®%¡.ñ2ÿ³ó.ÚlßÚ¾¿Ší Ók¯Í½?ïŠ9–_Ì~§íÃÏ—Âù¿ƒì-ÿÅП¶ß÷|á/üoþ.¾Løuãm1-n"Õô¦»¼gh¯·±üßv½CJ°4»½N +êvV±ZùO_aò—›q/ý5ßå'ü®4ãÊO½üDZ¿íñ?äBð·ûÿe—ÿ‹«¶ÂÞ^Å_¼73ÊÛvCk.÷ÿÇëæOøÛA°½Ð¥ÑtÈ“[°dynõ_³§î¶þö-Ÿ2ýÿür¼«ÄúvŸ®Ý'öC]ßê³Ë½¥´‰¢·ÿqWÿfùܨå*1—ó¦°ü{Õ]w7Áø<¯ö"ÿìé÷?5 ‘~ +«Ó-ÿú ׿…Ÿ€ç·Óe¾Ôþ hÚTÑ)uÓQ–âîVþæÈ•ÑY¿Új«“sªH’YøæÜ»iläñMû?7Èû?Ùj9KåÌ}íyû]YØ_¼_ 4+o*]¾+éÿÓßöÌÒ¿å—Ãíæ-ß,ßéIÿ³×ç\–úŸ‡õx¥–æo:)|ÕóY™þúûÕ÷OìƒûH|.]OźŸÅ¯AqâMz_Üjöjö»$_*+_¹÷þOïÕÆ1ûDJþc¨ÛEßóü;Ð?ßóçÿâéÿðÙ:ï›áÞ…ÿ—_ü];\ñLJõm5üacà8Ek¥6—ö/±ÅöOõR¯Û]ÿçªË³þøzóßÚâ»φ>Ð|áÉƶ±Z˩뛒Ö$uM²ù»Ö«½0÷¿˜ôý²t7ù'z&ÿúþºÿâêÄ?¶6‡ÿB–‰þƧuÿÅ×Á¾ ×&¿&›«]ÜÞù¿½[ÿG‹ý„Ýó;ß+þõgØMâo2çÅš~›³þY_N®íÿTzŽH‡¿üÇè/ü67‡¶mÿ„OÿÁÅ×ÿN‡öºð¾Çeð.žŸìm]WÃÚ>¹¨éK«éþ4ðë½Ô²ÿÄ„ÞEõ¿Ï·k$ª‰ÿ|µs×:–µá_ÛÁ®7œ‘2<¶ûV/5¹¿e>H—ûÏæ?E“öºð¾ÔÿŠÜMjëåÿÇꦵûgøGG³–æïŠ%ÜÏý»pµò¼Þ0ø}¬hÑ6‹áÍBÛSv_žïQß|ÿ>ôÙóÀ)~2x&mSÀøŽ,4íþÛ}³+3Üm•þtù¾þÄù¿ßªöq'š_Ì}Õðgㆾ1ø¯OÑ`ðcX}±e;ûjáömMû*O|ðŽ-~€¾ šöÛíM –µ:=¯Ê­µ÷½^û MxŸ´†­¥–'·Ûò'ß_õ»ÿ½÷7Àëç¯x×\Ö¼oÿ¹oî'¹¼·û]Ä»¿ujŽ©üä_øG)Q•C?ü ñ;C‹UÓü?…¼¬Ëÿ4NŸ?ûI^€ú¯€&‰÷Oáýî»öÂM÷ÿ勞‡þx††> ²Ò—ÀÖ5[ûEóß@÷NÊÛÛ~Íéò§É]·ûdÙønÕ/†Ÿ mŸgß—EÞŸðß¹š¢Q/ÚJÕ¶wÿï,ææ-Â]ÿñï7Šbw_ûå*½Íÿ™­]šçDØ÷ÄQñªøVÛöóñfß"×á—Ãy¾o¿ÿÚñu4_¶Žu[f·ƒÀ?–õ¥Ü`‹Ãða¢Ûþ÷ÞÝþÕDb_µ—õÿ}˜þ*ø4‘~ñ´ÿ÷?´âý·¬Ù¼sðYÿqmÿ–¿?þK×ן´ÿt*)ü%à7Í]ë øn-ÿøõtý¢¤ño‡.ô]Bèž2–ë}Ž¡6‡oýŸuüûºìýÔ¿Ü—vßá}¿~¶÷CÚTþcê‹ÏüO•ôYæÿn/±¿þÛÕ+Ÿ‰þo]»ÿì¶ÿ´«æÏë:Ši—7>þÕÛóĦ+T‰þ}é/Éò·É\>±ñ UK‹E¶—HDòçytȾGþ=›jý‘Ò§ógÂmðâ–UÐnv?ÞÿCÓ¿øŠ£sãÙãø´AßþÀúkÿì•ñljþ"êö¾| ¥Û:E½n.,âOµsbÿ»^y©|Kñ.¶ÊÒ¥§Ëÿ>öhŸúcËý¥æ?@ŸÅ_³›ïYt´Ý÷ÿⰦͭþÍ“}íOü&mkà+ýKÄúU¿•=›¤¬ÛÖ_)¾eÛÿÙ­f'еé“jοû=¡íkÿ1ú ïû2Ìû¿²™?ßðÌü]Dö³Ë·ì{7ü#+ÿÇkãOéš¯Ž¬¦¶Ò5f%€ùŸÙwo·Ï‹øÞþ'_îýí¹ûÕoû^H>]MžïÈûG•æ£ü›7}ú¿gÎG´«´}‹máïÙªòtŠ+hžWû©ÿËüßù¢¹ðìÑö‰b—ìвîVÿŠz_—þù–¾/Iµ©®’/íx¾Ï·{K3|‹òo¬ýGÅ:曟ÃKíŠó*£·û‰ýÚdÚ¿ólÂû2»ÇÍþ.“ÿjÑÿìÆûãûfšŸ/ß}÷ÿŽ×ßð°¼CöT~tftû´ù¾'jvÌ‹÷÷.æÞ¿u¨å/ÚW>Ýÿ…Wû0L›QÓSý¿°êIÿµj»üý™fûš¾ŸþÎøµ/þ.¾/‡âv¯6Åòþµ»mâ}rdÜÐ@‘'ÎÒ»|”r‘í*ŸX\üý_ýWŠ4Ø_øãþ¢‡àÀÇx ñ~½>÷úUêlÿÇ+å_øÎûM K9üébóZT]ÞRÑð¿^›J}WWÔ'ÞíÝ™öÿlÿQìãþ³W—˜ûÅ¿±·€<= Ë|Ëö—o)bH§¼‰ßÍtTÚΛ}zü9`ÿÑcøKÿ÷m}ñ¾h®~£,»â–}9Õ÷ýïÞŲ¾¸£–‘­6®Ï‹?`øVÙïáÓ+7ÏáØ¿ô¶ê¾(ý°Ö?¶üZ½²êZ}œ[ºKoEo‘6=kïGá#â<*çn‰.Ý^&þÌ»ßß»øâ¬K—žÚñ.beÙ÷àx~M©üè~`ÞEcþvŸ:ý£L–Vù"þúoþíPñ_…¼?áû×¶Ò5;½cL·fÛqw[»nþ Ÿ7ñû+Yz~ñ_J‡áXÿf]ÿjµ¬©-Ú4[%_ÞìO¹»äy]¾ý|þ—7Ú–©-ÊÏ\7ͽþæßî»¶½7Að’Üé?ÙžzÃvñ*EhëûÙw}ÍŸ÷ÝyUå³ÙAqͽ¥kvÿwøèF'M¥YØëS¿ö2Kö-­öÈ¡VóQ¿ç¯ýrªÖÞÑR]—Úœ‰/ðÛéÖ¿høïÛZ? |1}­ÞÛéZd²Ù½êÊ÷W6Ͷ¿uÓþ²½jÚæ ùº†lâ¶ŠÝ^)o¶ï•Ÿg÷è ºǀ4¯ÿgÞYÛMâYe•å›PÓ¿ÕK¿äò¥ßó/ûé\£s…ëÁ¯DÏ¢;|Öéó?Íÿ>ÿíã•ì¾ °‹Æ²ÐçÓR{x÷OÎé½ßäïWüHðd¾Ÿì1Nךd°=î“qþÇÞtÿ¾j¥)r¯¨Ï£ëh¿Ñæ¶þãAþ~õv¶Û%­ë^\ÿ¢\iÒʯϵü­ÉÿÄÖV¹àx4ë[(íµ?¶Z½­½ÔWrÀñl–TÿH‹c|ß#|Ÿí}êÒšÁŸÃHÛYû3ïºÿÓ*ÒŒcÍï GÔß°LÏsûMè›cò]e–-éüMýžŒïÿ»×Îÿ®,®üZ“é¶ ¦Y>«â¢¶y|ß›ä_½þó×п°7üœÞ‰±›þ>¥Oü¦Å_:x«cêÖûU¿ä1â?ûív5cö½âÌÿøÛUÒ¶Ems;ê³Ú£ý¡{¬L•ƒ¢Y.¦ŠºŒ"Û\’¶Épû~Ø›Q—þ·øÿŠ›ãû9SÆöjû,â‹z7ÞOž³¯5(Eÿnˆ”súÝþ«á[¤ótȯü9zÛâÓ®×í7IÿL>ë·«-sìÚjÿlh2Lš{Ëäm–u–âŶÿªf_øÇþ*ô¯øn_‡kqöi'¼ð}Ô©öæîû;7Ü•ûßÝÿ¾kжøw>‰¥Kq¥æŸ|ÒÚÞ[£>ø‘vùRº2·¹vïû@/Áˆ:u“ߨø‰ÚGŠÍþÍ7•æ´¯÷‘ýÆÿz©|yñµ§ˆu=RóEf±HÉ”Ÿ+|Ÿ+ÿû_Þ®oº&ýKû>&Y®âŸÊß÷Ý“b&ÿáþ:é­t]+¾%¾»ñEž¥s¨-…ż}¼Q=»;DÑo–]ûÕw2|Ê»ª9ƒûÆ»?÷ë6_Ùu¨,ÞãSÓíÙR)ö²ïžÞ/á_âtO»µÙ~O¹OAðö•s¤%毩²#|Ëoi/•å㺲´Ë—Öâ¾Ó'žÚöÖtû,¶íûÝë÷6Ÿã¯P¶ð6™¥"_xŽí-B»cî¢Oûæ¶Œ¹dD2×ôV›[—ìwv’Å<» ŠÞé~_—îÓ#´Ôm&Q®iWw^g”×›n"?ì·ñÀ¾õvÍáMSñ‡Ù$³û5¼ëò¥¼»Y_jlÚßð&®Š6 já_·e+'öuŲm•‚_ö¾ŸíîJˆò–yÍå¶«à;«-OL¹–¸Þúv²‹±ßl¿~/î¶ôÿykÕþøËÃ~2¸—WÖaÓl5X¢Î¢“DžT÷ Û÷.åu_5wîù>_š¼§ÅZýæ«öë—oõÿhòÕN«·åÿ}~_øT>Óžþå§³_9š ­ |òüßú_ø“â-:Çâ4ϧZÙÝXÅ$RÉnŸ-¼Ë±w'É·åûßv¨ëšM´³Gªh¦ööÒwVU—ï@ÍóyRÿ»ýÿã©|EਬtÉõ¹.V9EÒÅ>Ÿp¾TÑ+«ìÿ{扷ÿwäþýfø2çUMj±8ÞGåKnëòKÿì}ÿövÔ>«¢Oagoûõ{ÙYž_³·È•[FðÍþµ6¦Ðê¶–?fƒÍÙ{>ϵ>ïõKü.ßïWgyàÍ+M‹þ&òÏ{/ΰÂÛ+Ó|ãÜGËYÝÅ.ȥݾ/÷®<¼Ãû&~á­BX§–æÓû+È—È–â_–&o½³gÿRé³5ž£ö;ФM÷øº;ýº÷‡5[9îg³ÕtM’®pÛÒâßþZìÿi>GÿiÜ®Yñ#x«KÓ®¦Ûý§¤Û®Ÿ-§Ï< ÿìßí'ú­ÿÝT¢B: ÍzûUMAe‚?6X·µÃ®Íª¿À‰÷V¹ËË;d°ÑZÖûí/pÈóÂñ2}¾“ý¯ïVïˆng›ûCÍ–GÛQ.ößòõÎíŽ8­Ò)|ìÜÄÛÿºÞSUÊ1‰?f¾3h–~$ø#o¦_+}’{]-%ò¥Øûu÷¾Î¯‘>$É"ÓÛþt¿ý¥_]×*ظ|'Çß±ìýœþmûḛÿ&®+óÃöχí'â Y>G×õDÿý Þ¿D?bvþÏ? >où–mô¢â¿<ÿkûiŸö¿¿‡Íg¶½Ôïå1?ÜWò¼§oûå¶­üs/´xÞËi¼´S¥Å½®ýèß$¿'ñ¥s‰­xªÉÛG¶†þîÎÚ[¹íÂ|Ì‘2ïÛþê¾æ®Þ¶¹²ûÌÛ#Úìƒìÿ"|±?ßþö÷Jóèa•-Þ"žÛåIUö·Þþ:Ò§ºU3Ó>xVç^¿Ö-—S—D»M1]R•åþGÿgýŠÝÔ­¬ôyí­kw7]Òâux—oð?ÉW~ø[?]xÏUÖ•<@žmÔ“].ùbþ?7ø¾vßZºô>ñŸ†¯µ{k¯³]¤å·Ý±Ý—ûéÿ³× eò•*dõ1™f#NZßòóá9Û[köªÞjÛ­¯Ú%ýïî·ÿq>J¯ñ_ÀËá_iú­æ§=̬»ÓÏßµš/öÿ¹òWªøbÂÙü%áû9o­žÝ"YVÑt¿íÿ5x‡Ç_Aã[øtÝ*ñ&Óí¾Y%…[cKþÏ÷¿Þ_–ºå(ž\S<ÏMÔ¥¶ÒîÚyÚi]¢H¦Ú¿#oùÿÞùR½noÅmå¶‘²J»'òw¢mdù>}ÿ{þ^k¡ø2M{ZÓü8º…¦›/Ùî/e»½Ü‘4«²DŸímM«þÓW_¦ßêvßn4ű¶ÿOµO6WµG¸þöļµÈà[L›[²Òìô½÷:€»¸Yî¾G_“gþÏÿ}W·ü)øk‰|qqccv\iÚd ¹vK:ü¯*}ßâ¯<´o_øRóÂ?i†õ,íu ~×ó$Z¤Oóìÿ¾е|ñZÿ„ÓPñg‰u÷s³î–á~{¦þ8¶*wøþê|•·Ã.SNhòü>÷õýn}1âˆ^³ø}¨*Ûk6ß•=º¤ËoòÊ¿Çòÿÿýº‡^6ð-ŸÂý\×"»¼½M9úE‰76÷Þÿ7ü¸I­¼9ãm#P¾‚æÛ|ö¬ò¤¿?ͳïìûÛ¿Ûª^ðö‘ÿ§‡úxæH­Rá!Ú‰¹¿ÚþöÏûæŽsŒø­àïøFü?¢xƒRžTŠëíÖ›·¾×·vMÿ?˳䯰×îfÒµ†¾¹{›™`‰-ŸËOÝKæ¦ýßð õë_|[mã§Km?UŠæ }ëxŠ¿ñïóî¶ÿâÙ÷~íyÿ‚ük­ß¾Ÿ©ê6Ú}•Ư}q§À· Iò,Q3¦æù÷·Ïò®öþ ‚ÏZ°ñä ¯hgá;H|‹;tkˆg¸ó[äùÝßÍùwÿ±^A~—ºŽœ¿e[#u-ÍÔ»öDÉä/ÝGù~Vù%oŸøk¿ÐµÿáY]Ác¤G5”±Jë«Mgþ—±~çï‡ï§ý÷^Qá¿>Á|ˆ§žÍïbd‚ãîüß:ÿß/ó¥/1ë¿ü7>½wqå_Ka-½´I?Ùsot}»‡îßuéW)¥\ü;¸•¯¼Amw¥Ê±}’V‰íåmޝþÒ¯ÉüÃ^ðsÄíàmgÏÔ'ŠÏOÜèÏ3?ýñÿŽã•ô³è:WŠ­e¹¶hŸí°>íûöKò}ÿ•þõÁ5ï{§’i^!¹š$h//tؾgÙi/”‰óÕè÷š'†|/¨jsÇyo¶W[I¾ýºìßü/þåv~𖔞Ó/µ;˜žÑUauÙ¿ç¿ýï÷¼Ëã/‰äñçœÚ4ðÜÛÚ§•-º?Ïoï¿ýß›ÿ¢\¤Dã?á$¹Ô¬®ç¹‚ÑöD›Q<߼Οí×¥h—Mà7ƒÈžçVm2TTMû-âòŸ~ߟÿCÿn¼ÃOðôóiŒÍ £-Åô«KöTû©æíù•~mÛ«²°š°i²Bï¦où?Ú‰ÿöZÚŒy¤9K”úCþ õ§í1¦/ßuÔn—ÿ$"¯üIûßX¢¯üƼP¿øå{çüîþI¿k±-é±j·[v|ÿ;Zºýÿûe_:x‚êòOËu+o²µñF·o'ßÝ*ný’±ûe±má?øI­}+]Öå‚Î+Ûû¸o¢·t‹î>ȼ§ûü{ÿޱ4H|+7Œ­4Í?Â÷vrÝ$Oâ(®‘·:lÞñ[ÿã•…ãoêZ?Š!ž Õ ú*ÄêëüîÝ\äÏw¦êúf§l¿¹Ø²ÚìM»Õ~ú¼Ÿ5\¥ÉîŒú£Ç—:R]Yiø^õî µýëÿl|þÚ'ÙþZå4MWC¹Ô®?³ü4¯p°®šýŸäÙ÷?Õ}íõèzT2øŸÁ¿ð—ÛD©on­ÿy©*ý×ÞŸÄ¿ßÿì+„›ÃÖ<»‚Î+K n¢ØÐ¦ç‰øöW5›vêá£êÒË>™cËüèþs}ϹRÍ Î½ã)bÔ$W–ÿý ]þDÜßqÿu±ð‹RƒDñ±¦_\¶•qäJ‘y˳÷ñË'þîõÞŸï"T ¥©^j·—ò´öqù²¿Íó}Ú®óOg+´ ¾víí±þãסx†ÎúÿKE¶Š;›x™¥WÛ±þo¿óÿÀ>çðüÿß®7JðÝæ«=Ã&ØU÷²¿ðÑ(‹˜ÅÕõ[éµ½7P–ÎHexšÝŸþ~î|ßú bEáOHFiínaŠò-±<±2oþ/“ûÕ»â}Uf½Š+=ßÙöHö±?÷¾ûÕøª{Ë[Ei[äù"ù¨¤és ¼ó®Èb]ûݾyÜ®^Ù6-¿ñ»NŸú×WymšêʾrEk•ç 4[Ÿî×5xEŠÞä7Éç¯þ€õ´©Ë—˜Î'íÇÄ/ù$~ïùóÓ¿ö•}k_?4ω³ž•â#ÏûÅ­œJ—lux¥HŸz¾_jÖª ògìXŸñ ~÷üŠö_úQq_œ¶%þ‡cûMøÚûÄ ©Í.ª·ötVJžV￲_âûõúMû#ÙÆŸ³§Â¹cÔ'†é-hÿÅðû@ø©ÿ³ÓÓâîƒònøs¡?ýµ¸ÿâëìÔý›?d”ÿ™ÚÓÿõbÙ§öIvOø¬ì¿ðG/÷ƒÚÓÃâôøÁáíŸ7Ã}ÿí¼ÿü]ð·|5·oü+M%?ܼ¸ÿâëîý¿dÈÙU¼Y¤ÿàö¦‡öxý’fGò¼U£>ïú/ËÿÔòÄ9Ÿüü>ÿ…¯á}û¿áZi?wfϵ\SSâ§…Ñ·/Ã5>Wÿ—ëŠý ðïìðÆ–ÚzÓê–NÛ~Ñe©´±nþíPÖÿ`ÿÙãÃ×ÿcÕu©t«½»ü›kÊ}Ÿð*®RíÿOÿákøknßøWv;?¹ý£=W›â§‡7§•ðËK›þ»jsÿñö~±û-~Ê<©þ:ß+n}–š×Úåûÿ"ïªZoìáû"j»üˆÑ¦ßùøÖ¼¯ý £”¸¸ÿÏÃãY¾%øiÛwü+ -?î-qÿÄS“⎂Ÿ*ü;±Ø¿u?¶.?øŠû?cÏÙ6J¾?×z»øŠÝÑ¿ïªö'ý›®[÷^=gßýÍvßÿˆ£”/ùùý}çÃÿð²ü4ëµ¾Úàâ_þ"øX^Û±>Z'ûš´¿üE}ÖŸ°Àk”ýÇŒo_ýÍN'ÿÙ)ïÿèø0ÿ,^*Öð:/þ"ŽR¹#ÿ?ƒÓâ/…áYV‡pB’®É|jTóWûû¯™iŸðžxAÛæøsÝÙ±5ÙSäÿ¿U÷‡ü;£àÚ3ÿÅY¬§û÷‘ñ^oø'¿Áˆb¸‹þÍB5vo{Ë]éþçÉòýÿür®1þñ59}Ú‡Í_°®¥¥Mû_iQhpGai~Ï{>˜›ßì »¢'šßëwù®ßì׆ø3ÆÚ†¾"kÃYÕWB›Kñ£{mpð=ÇšÒþáÓåGÚÈ›Ù_ûÛ+ô«á§ì©ð‹àÿ‹ì¼Ká¯Åg¬YE³Í–úÕüß“n÷Ýü[k—ñ'ì)û?kúÜZÍ·-ôMIX<òÚj–î—ß3;¤»×æo›ä«”c/w˜æNYsé¾*ðMå¼M/€§¼Ùò}¡õg‹ÍÿmʧÍâ"ªÿ¾¾tVÞ¾Vµ÷?ï¤Jû¯þà´ÞR¯ÅI~DÙ¿ûFÏçÿ~™ÿ÷ø:íÿ%JçgûÖUŸÞ7öœßj'Ä–|9mkö?øC¼D–J»Ýw}¿®ÿï«:¾R9¿½Äø‰5/Ã,ÒÅá$¬ûÙÿ´`ùª½äžÔ>Ùá­vm¿uå¼öWÜðíÏÿÅ›—ÿÀ:wü;gÁ?ôU®_ÿhåþðsz?‰ðÔÇÀ÷+Ë ø‰ÒÚ/*ûTå'÷çù~óSôÝKÃZ"íÓì|Sg6õHo Mÿ}×ÜðíÏÅ)ßþkÿÅÕy¿àšÞõ_§O÷âÿöz9¼öôây¯<94¯/Ù|Iö†WF•çƒø¿àuRÎ é·öú…·ˆ­¯mÿÕJ’Á½?¿üuöïü;OEuù~)7þÛÿñt×ÿ‚eX¿ú¯‰ÿù#ÿG(ÛÑ>›Dð…Ë~öÛ[Ûÿnÿü]>ÎÃÖím³ÅØ¿,ÿ¡=}·ÿÍTO—â\þþœŸüv«¿ü6ùeñ6Ûÿßý¶£”9éäò>$Ô´j·ïys¨÷ ÿ-¶ÄŸû=.·c¦ëÚµÖ¥}.«yyóÜÜ?•º_÷¾zûQÿà™ZŸðüH´ÿÁcÿñÚ‰ÿà™Z÷ü³ø‰¦ÿÀôÆÿâèå‘|Ÿôò?ùYíÓbò­µ=]"û÷ÿgªóiVÏk, }¨yR¶ùSj"7þ?_iÿôô03}¢ãÍÿ¦Jßuk¨»ø]àt²•[⦥pëþ©Î›ÿ!}ÚøƒAø…ñ.Û^²—PÕdþ‹ä—OÓxoR¸Óõ_[]ÙÊÖ÷V7zÄI,R«üèé¿r¶êµooñ£âdº®¿¦Ç{¾“mæê7ze×›caÄÍæÜmwÛòÄß3ÿwýš~ñ¥¤~ŒÁ>õè!ý“tûbæ;=)5‹ô¹»¸¼û.Ö[±.ÿö›åûÕ䟶÷‹¼Añç–v³^xCUÔ`ŠÑ-â¸I•—ý5·?ðüË7Ýùk×?f/ Ú|#ýŽï4oé âh¬µfGƒI±þ×Ie–dx§Dÿ–ª­*7ü¼ÃöŠÑüA£þÒŸ­ž÷JþT­òy[ÿÝÙóýäþýy¾±ðľ½Ô4­Â~ ¿Ò´ZëL»KíŸoóÝ7üŸÄÉóýͬ»ß öÏÂZýͬRÛx«[HeT•v,Iò7ü¸)¼|—^Cx£Çé|öMû¨¶|»þ÷~O¹÷š½#Fý•ôû/AžûP×í®íìg‚x~Ó÷~ÔŸ½MÊŸy7¿Ì¿~¼’çáG‹ô¯6ÚÏÂ~${}._ì(/•<øúB§ð·Üùþçû%hE¼ð¯ˆ]._x‰ö|íûÔÿâ+Ï,üH¾$ºÒ­¿á!ñl2ßï‹ý.¶DÿÀÿ}§ûµéz—컢ºj ÿ ³¾}%t¦tS~×ÞÿŽýÊò‹oø—[¼´Šç@ñ£*éWR}©]lÒ-Ÿé7ð7Ï»ø_oË÷èS¥×¾fé7º…ö§¨\ÅkË*%»»íþçÉ\f‰áÅZµ¾™my|—¿h_7Lƒgñü›×ýÇÿf½cXýœXµñ,úF¯¯êZ„¾Eúiö÷;tIµþ¶¹Ýàoõ¿ÛÁ¨xsÅ •ä¿ÚÜ<ë*Zºïý×û¯±?ÚùÓïl®¨áªU4bDªF⯃–>Òïuyõ]I"ù~Kh¾oŸjlù*ÂVzÅ寙§ëWÓMÙwÝé‘|êÛïÿ±½+Ð|sð Qð“-ô~"Ôµ Eµx´Ç•·Ê’üŽŸíÀ+ÀµËÿ[Û_/‰´«Kx>Ûö»¶ÿ[梣»ÿy7¿Üþãü•Í(J_ÂdøŸÁÿØ+¦6«ªÜÍʶ±$:tRùKó¿ü~ýRÑ<+ˆb¸kC‘;ÄÞn˜©¿çÙ½?Ùù¶üaðŠûÀz&ym}â/Kf²Ù5¤M½öK¿cìùþ㼿îÓ|)ð×Zñ×lµ-O_ÑÊÓþÑsò½ë¶ÿÞîÿcäþÿßM›i”ÁÕ|=‰ªZXÞ^,/u¿k¦ò.ßïüÿîSôO ÂI¥Å}§ßDñ?ÉåM§2:ÿãõ£ã/†Ú‡†µm:kýsWþÔ‚-6YâO4YËÍ“üÛ¿ñïî?ÏLð×ýWÆ^Ô}gVðü²Î°­´ÑyNÖwO7+|ßíµ@rûÇ=ªÙÙè7Wv×Ú„ -½¯Ú·ÿg;£/÷>Wûß#ÕÛ? ]l·¾³Ô-¾eIbtµ•6·ý÷÷“ÿd¨¼[á-_GñF¡mη~÷¿ñ2[´ƒÍò¶£ï‹ý×ÿ€ýôûÕ¹ xW×t'T:þ£§*ß5ÿö|ÐyOço”Éÿ~?5Ëc޼š+9u?>ú/´ZÊ‘JŸe•üÖoî|ÿ?ßJ×›Áú‡ü²¼¶to¸è²ìtþÿ߬=OBÔ‹/ú+¯ßùö÷êÇŒüâ[ÞÜêz…ΞMCì“Zº?•ýÍŒŸwÿù*冫~qòLÒ›âGµ[˸—^‚gŠ%•¼˜•6£À+ RñWŠ¡–%¹×'O´6ÅÙ;ýÿøV†!¾¹×6Yê£ù_mùìÝ7[¶ÏÝŸ½Uuí+YðÅ–›>§ª}²(X™ü­Û™¾ãÀký’ì:¯‹/âXOý–¢Ñ­µKè5+KmJÙ'Š&·vH?zÛöJ•Ÿ¬C©YêiÍôï-¢·ŒÊ¿"·ñßUkÙø·â ÖñOmãmgÊ—îºj×¥ãÏùO¾8Ö_ì«æË³X¸M»¿Û¬û;mOUÓR[ËdD•|Ÿ¿±~úT>MòjW±\ÏmÿKq+¼OòEü òÿã” –'G¦üBø›¢y±Eâ­K÷©ÿ/‹Ü|¿ð$z_ø]?|§Eÿv·öv•UaþØ—äÜÿÁImm-µÕ»^Eö˜¼†Ý›³÷¬Ÿ'û[SûŸÞ®?â[·ü#HÌßvéh/–ë5Íü÷Ÿ³·†µ_´Üÿh\höÜyí½¥Mûÿ½¾¾Õ¯‡ôßù4ß6Ýÿñ"ÒÿôjWÜ£ð¡SøO¼5ýšß²§Â;oOmgà™¼7aý±}s©Ë§}•×{Yl–/™¼ÙþF]¿v¼oâF£â-Söùø#uã =3ÄòÜé}cc?Ú-à5öí—øÿuµ··^ùðæk«oÙ³àÞ§gm©k aá»Vºðö“gÔº¢Ëº$ýÔ¿.Ûwýîï½^ ñ+AÔ|?û{üÒµ_ËâÍVÖçNûV¹:¢=ãý¡ÛæEùbì_—û•Ñ_ø¯üFhýðˆ5=kMÔóÇñV£¦ê²é÷w²kXm¥EMÖ²Ä×W,³£Ü¥Õ¾tùWoɯ‰¿ ¼UñKöƒø¼|1¥ÿiý‡ÅŸûø¢Û¾êãgú×_î½}½ûüyÒ>!| ¶»ðg€D:Ÿ‰îô´ÓtÛ/±ÅhX%Ô’¤fy¬²\¼«åŽ7ÈÜËË/Á´ß„5ÿê߬|=¡êzÝüÄ–ºmœ·${õuݵîüÉÿ}W…„Ö;çðû¿iöìô_+ùšF´*ÊTañGw¿ŸRKˆúÄÛ#ðÃÃÑKªøž}:ËK·²‚H¢Ïb×RÜKûü†V]ì­Q;}¢_Þ·úC_ø¯Ç/kßõ› +Ä6?`¿hšãÊóR_•÷•ÛûµÄÃ?|Pÿ¢mâïü]ñî?4ëM#Åž±ñͳYµ·ƒô¸¬m¼AâXÅ:ÙZ«¤éïÕ?ãëýWü·Ù»åókïxnj9o¿äÅZ/ùÜð1_NþÓŸáø‡ðÛÁ6|U2›I o¨hÿÚ:Õç*Ä¿éâKËh#ù¥k¯‘•¥‹íVYbò¢¶ù«ÇßÙ—ž.Ön<=g5®ƒ5ä¯ao)&X-÷·”ó7!vÿtûƹ淛*±í÷kïqù¤å‹Œ¾­/Ý~¿öïärÆïÄlŒW´ør>çÄTZ¬¾N•-ÌIy/šÑl‹Îû–)Y~_ãH¥ÿu¾íqÞÁ‘øUÎ?·‡åîóþÑþ©~Ëö]Ÿºÿ_¿Ïóÿå–ß+ç®ïã'ÆÏøSá—ƒ¼ ¤ë³XxgVðüÒßY[Å<¬úâ>eÛæme‰”6Ö\çïµyaVU£AÊ»þ…áίâÎá­.-5ô?°Ãx÷:ŠÜÃesæªD·N¶ïµn.•~MÉ»ÏmÊ‹òíÙuu jv_ ÿ³u‹ßxKG»ÖlX,|C¡Kªþãíýeq¾ûwù¾þß÷ëÏd¯‹^+øñgÃz/‡õOìý/Äšæ™gªÛýš)~ÑÚ6mÜèÌ¿,²“oÞ>Õ±ñ;P¿Ómül|kÿ aÇyŸÿ]Kþ}ão»þß÷«óC°ú Ç?´6™ñ§ÃÚŸƒtmOÀ§Ø~Õ`“hÓ¦­kö8¼ÙZ+¨´ÛXÞ X ûŠ¿gµŠ?½¹ÛÐa¿ù7¯ÚŸøÿâ–_ý%ԫㄚ¾¥ãÈ¢¾ø†|YÒµÇBâù·öEçï/û?Þù«ïŸÙËÀº7€¿gOÚ1´éÞ+ûRîq§®M«ýQí½þVþ—ÊŸåo6¾]Ì ¯ØÊDÓÿfŸ‡¦k$ñ•ޝxú-®§¨ËeosDŸhvÛþ·e®÷Úÿܯ;ÿ‚üHÄ?<â†þ'†ãS½±‰´«Ý2]îê¯tŽéòÿ¶êßï׸~ÎV­©þÌþÒ<4Ú½„·^S¯‰4ËX.M–+XžT7øeØÐÀö׊~×’Ç®ücø?«Çáiü!¾=9bÒu T†[_ôÛÑlO•wmÝZËÞ‘‘å~Öÿh* ˆï¼^·*ì‰.çØöïýÿ‘+[ñoÇ}6ý4é~,ÁavÊò­¼×Ió"ý÷ÿU÷k诉ñ·àýB/Oiaâ Èö·kòlßóÿüÛ>O¹_?üWÑ5ÏxÂãOñ«¡^jº•‚ˤÿĹÞµ]ÿhGÚŸ{ýnϽÿ£”R;?k~:Ö4½æ_x“R‹ÊGº¸±Ö-|©[gß‹ýåùÿ¿^âOüV†ÿ]Óï>$Aýžñ4«i¨êÉoqo?Èîñ"7ýñ÷·×Qð÷Ã~:ñ'‚âÕ|!©èÖz,ºŠ}• ŽÖ«¹%O™æÝ·ûÛ¿ƒeqŸí§Ð|[­ØøžûFÔµˆ¥ûmוbÛKþOúk÷~ÿý÷G³»Ês·? >&ÜÅëâg‰×å›ûZêTdÿÇêŒ>ñþ-Ä ã­eX§Iuž&o¸Ÿ5{Ÿƒ<1ñXð÷…ï´ÍGB‡B–y_Êò>v³ÿ–_Á»ïoÿkýºò-aÿ±õ-BÛÄ7š4ÚÆ›uÿ׊Íÿ×·ú§‹oËü6Í­þýDbd؇Aøá ~ëÄvNû¿ûUlxXñé–K¬ø’ÏQÔ>ÑöYn!Ö¢‹ÍŸÜÙö•«°Ò¼1ñZm7Jkí ìòé·÷éö†ÿwÿwfÏýž¼R{>ÕÒ/´é2ßA+YK¾ÖTÛ¨ï}ßwîÅòÿß[þJ¾Q|'ªøoxV]B_YÚxµ%fû/›}ö_³ÅþÞÛšºkoŠš~¥¼Qx3I¹ûlN‘}ŸÅ?ëWøö~ê³üIàÿŠk¬,·Ú&ÆÓ¢òàWÿHÿ—ÿð ÿì׊h÷6ÓjúRè2é³\O*Å£ïÑ÷.Ï5síûû6#ü¿sç¯N†"¼c˘ԧÔþ*xóân·o¢ÿÂ+“àm3FÓ¾ÄÉ-ÿÛ|Ø—æGw–/—eyý¯‰>:\Iå[x×@¹“ÈûFØV&o+ûÿ*WWã­+ÆöÞ×äÔ§Ñÿ°’uwýÆÿô=¿½Tù¾öïþ¸Ï\µç- ÐÚÑïgg–'š'Oô/Ÿïî½÷÷ýÖ_Ÿfï’¸«JUåÍT¸Æ4½Ø–õ/üv°îoåEо5\«´:‡‡¦ØÍºÇÊëü?ïUïYëúU†?ŠRÂ4ò(vÆÜ_6ýŸq›jìþæïø AàÄÖ®lµØ¼/‹ÝÁÉ|ÕØŸlÞÿíÿ¿ýåoö(å'ñ?ÆØeоðç›.ï*±om¿ÝZbxŸã]ÌjI<7y üé*¬Nþí?ÆpêöÞ ·]N-=5 ˆ"‹LM¬›ÛäûFæßò¹þçÏV¼%ý¹yáY›ÂöÖd—‘$Nëü?ò×äÞŸììŽôr7‹~1"ºËÿê:¯šÉ¶-èŸßÿv‡ñWÆ$Uo³hN­óïÚ¿?þ?Qxµå¶ñ±«¤7®ÛÞÝÿ ÕßþßÌß÷Ïñýêè4OøHît½ [=>ÙôÉemß6ÿÜñ§ñÅÛýÊ9C˜åfñ·Å¬Ïg b&D•>Vo¸ó×±|øß¯xcÁ¾(Ðüc¢êIq¬´I÷…§ŠÝàUÿmŸïn¯ ¹¹dûGöœßhŠw—SH¾âËÿ,¶ñ7û•ÛLþ,Kx¶èöÿæùݾõ×ð|ÛÿÜÿ{ð×N´¨OÚDʤcV<²;«Ï‹º-Êî~%\ù¬ÈŸñ=‰ßøëÌÏå@Šÿ7Ýoõ¯÷ÿÞù?Ø®ÜN6­xòÊ(Æ9ßÞx‡ì¶ŸÙêJ˾T—ÊùçùÑÕÿÜ®^æçÇ_zYnÑÿÛ+ªÒ¦ß«Û¶ŸlÓ;.Ë=÷í~}ï³ýýÿ%ßö„Ð'öž™¶Ÿöí’ºo}/Üÿ{ÿA¯'”ì8Ä¿ñÆ÷_ôçþ?õ«VáÖ<_ ÂK<ÌŸÜu‰÷×G¥\Þ}¶ïʳ•å—çºØÿu6'•ÿ²³óÖ}ÍÍ÷Ú4Éu;%¼‡•Sî¥|Õ¡ÌE¦ø“Ä3$¾mµšsÊwÿÐ^¬x“U³ŠÞX,ã¿wWóÓ쮞Wþ?óT¶s]C¦Ý­¶Ÿ,Ï»ìâ¸ßó§ûßþø¨¯íõ+ø—Èä,V©æüïæ§Ïÿ|ì”{DñœOapš†•¨%ÆßÝ%¤ ³ÿzäu„Ö<[°O§®•oy«q3=wzlNöQ4±[Z<­K2»ùQ/û þ¿²±ümóøWUþâ¢ètOÕ 6~Ê^ ù[gö.šŸù+íºøsÃÛŸöCð.ï›@ÓôjWÜt£ð¡CcãÿÙûƒĿ> yÛhYø^tˋ؞[xÑ’ëîº6ï)öÀ«äŸÛÃÐ|ý¢þ·ÃíË X-Õ¶÷•"ùüØ·»of_7Íûõö·ìa`Öß³ïÃ]U¥ó’_ XZ¥»¯È›ZVwÿïOû⻈üñ/WmW_ÐRïRdTûGœêû¯){IršS§NU?y.XŸéÿðPÿÚ:úÞ&ÀÖ×Né»)þ˶¹oü_Õî,µ©¼E¥xƒAÖµj]^xtË_5šYet}Û>Wi[î ~‰h_³¿‚|-sΗg©XÏÝk}VuÿÙéÿðÏÞ }Uõ¶Ôžõ¾ô¯©Êïÿ¡×™Z…Jôùeÿ¥À>›ŠÀà*Ê¥KáûQÿ‚|ÿ Õn[þ=¼Zî³|6.Ÿû=yŽí›â/ þÒð…õÞ‹™]5 »;׸Wm¿}b•7nÙÿŽ×Ô?µWÂýá÷ííô7í(<)u©-¦§|ßgkˆ®>GvwùWïWÌZVªÏ©\O‘¥ßêwVv §Ê›4ËTo•ü«ÿ;}ÇÙþÛýý•ž ‹ÃÔöô'Ë/뵎œFk—â)ûBR¯/á©Ëêß ­í¬­[HødÚÕij²ÏÛû"/à}ÍqónþíROÞ#ÔŸýàÝÊnû»'¿ô+ŠêáÔ¢þËÔ,m ‚k/?QŠó[¾ƒÊ¾·uMéö[}ÿ½Ù¿ÿÙ©®¼_i.™e3ØÁa£Ú.uŤ 6§z²üŽ’ÁæîTß¿þøO¿¾½Øæ9×ÛÄËñÿ3Åÿ„¯ù÷/ü ‘cû|QÖ†û/„·ìžîßü‘]˜ýž¾;Ùi–w¿ ã¾·°F·Œ^ø_KÔ¦‰7¼»Y]ÛïÊí³ýª‰þ ê6z´W‹mcm{»Q·³Ñ´û†—Ov‹æGº¸Y~WþŸÿ§ÙüL¿¶Ôî¥Km7PÔ.%Ó®'¶½¸h´ËX§D]°Oæí•·À¾gûû+Jøœ^"1öòæÿ™ÁþÍÏîDÒÒ¾øãIñmª¯Â«o}–_´G¯ßh]ª@éó#þëMvVÞŸ.ÊÂÖ´ [Ãþ·I<%e®ÿe«ÚÚÛÝiöw÷~Ðíµ}5Ûné]¶»ÿK£üHm*×ÊŠ kû+_·Ë>¡­ÚÿÄÁ¥ƒc~êÕ¥ýêÿ{ý÷û›+ ñeÞŸ‚´-gPƒû6âëXµX¡ÒtÍÒÜZÏü÷¯û¯Þ£ìO»òy¼¸Ÿ³ÊtÂXµàKü5Ó|MªCÁ‹á©ÒŒ°Kϧhºu½ÂÅ*ø™àíág‰5]/Ç:WöKÝ=â£Ù¯Ùî"‘%®Æÿ_ýåû••â oUðö¹ k^Òtß&u*èžFý3÷Nìq;¿ÊÛÿ!E³fúvŸâíüC¨Eo§h—7W–q]&¡Ecd“Äïþ„ûÿzß¿Þù>Fß]0Œ¾ÑÃ>^opûö=ð­çįًÃ^»µÑ.¼/ô¶úƨ4©*KQ4^W”ÿ#%Òüÿð:à?n¯ê¾Õü%¨x²-'Rñ^—§Zê¿dÒZTŠòée–-‘|þjÅûÔgÿr¾rÐ|g(ð•Ýœ°[i‰au{.£v¿eÕ¼Ø%ùÒ+7s+ìÙ¿ñ¿Î›6V…÷‹åÔïôvÕm­¿u©ÚÚÙÍeŸwz’Äþž»ÿq¿gÌýù~O—uT¹¤fhh?·µå´¯.µà/°Z$_ºti_{ldþ:£ÿ ÿsuö `¿x•’)wJþÇÙòÖSøþî[æÓü:÷²éŸjmåmå¸ò·ý«ÍûÛ7ÿÀþ]ÿÃ[¾¼üM­ØÁm§Ì’ÞK³j6hŸeÛnò§Ø>ßÿû?º‹äýíO,ÃÝ; ö´–óA²¼=á½)v+i×ßÅöUÞÿëv[íÿoä®OWý¸í-üM{e7ƒ¼?~æ6·MfÈÏt’Äé»b«ÄŒÉ¿ø~JŸÆ·+©| ÑüG™5´W°K-ö£c¢ì»ŠãíH‘D±DûvùO¿ïÿmsZμÓx‡IkI³ºµ¼º·¶²Ó-ѭ·¯ÛÛî7|»¾_—çû›jå…7í™ãÛ™Sì6Ë /È©o û›êý§ZâȶµŠñ´Í 욥ûÅç\@¾TMötgK'ßûÕGtÛÿ}|ûê¿ÆçÃÏâ‹?E¦ø~Â×íëv–¾n¡oq½ÊOï+ïEßü;þÿÉ^¦SO–1üÎZ”#9ssñ/ã­›øKÃé¢è·?uXšâ-Eíô–Ób–&ù‘þã¯Éò&ÊòË?:¾šÑ5·Àû›g·‹ìðôoûê*¯ÆÍVÚYgƒàÞ¥mq*¬M,RìvUû‰þª²¡Õb¶mcJ‚ k——QÔ¢ŸP¾îÏl[Ñ,¢ßûÝŸ?ÜþçðoÝT®¼Og/‡ì‘â‚ÏL·‹N¸]NÒ/7Sºó]ÑÒâ-û•>ÿýðŸ}qòÈØÚÔ¾4êÄI÷Áý^ñ–UI[z#ÿߪŠÏãeöš× mð‹W¶{†ógò~O5¿¾ÿº§C¬¶¥âIdÒ´ˆoZ-J(4›²é’ùOòK,ªÿ+±þÂ}ÝõØx>ÎÇÄšÚXϦX½»ù©²ÒÍ^TÿEyÿÑþÞüßøí p·ÿ®oç·žóá&¯s, ¾›çx¿ÜýÕ2Ããdú=¯‘cð§[³·ûþTK±7ß‹¢ðî+•¶o섳yeךûkη ¾/+û»øQÿØ«Wí´úµ‡Ÿ§éð—Ïkg ¿Ì—¿ºF‹í_óËþý÷þå²÷¿⻸{›¿…:´÷~[ÛùÒª»ìo¾¿r„øåö;t¶µøs®Û[ªìXSî'þ9Y±k±G+Ý /K›R–Æ ÛO™öYD/”ïûö³ñìS>ÙkömBÎ ™|ûô¹¾–$K»V‰7þê/â_÷>íð{¡©|QÓõ)n%¹ø]«<·[wò¾vÛ÷?‚½ƒàGÆ ÞjZÅŸ‰t)¼>í§yZcë/uŸü"§ð×ÿlYßŧ¶Ó[?*î(¼Ùn¼Ôÿ—„ûËÿ³l­¿³E7د%³ÓÒ[‹WßoÏcnËq±÷ËüL‰ÿ WN´¨TC‘ŒãËÌzlÞ-ðÔ1nÿ„«ÀÑ‘Ûìþ gùÿÿÕWšü\ø³:Ïa›{câÄ)ÓLÑÞÁ ÿ®»¢]Õ>±`©aéúTS;ÝKó"þö(¶;ý¡ýŸð:à¯5‹tÑRYUa³ŠÚ+‡Ô63Ü34¬›e‹ï*ÿµü[?Û¯S˜Ë^Soe.nb•þ½}áˆ!¾ƒAÓQàÝ_d¼YeOøü¹ýKã§k-µÎ™ÛË÷’Xÿˆ®¶çQUÔ¢•ôË[uäPX£þêëÊ]ɺ_á÷ÿöz‚Úò'Õ|ƒiis<íf’Ú2mû*ÊŸ3Äßò×ÿf¯Ÿå;ýÓŽ¶ø©-ÓκfŸm+*#?•/ÝZ}ÿÅ5W·þг´™"mÿ#J›ñÊèþÍô?– g`–VÔü¯ô…e¸Û·Êÿwø¿Û«SMc=ý¬³é¶)ºåíâ…?Õ^~ërnùdÏÿ³ÑÊᛣüBÒ>Õ*ØÙÈîíæÊï*ìwÿ=XÖü[¦Ååj6mò3À¯çÄÜzf›µÎ Ë=„Ò˶žñ*yJÍ÷¢ãÝ÷àuôÇìÁû%øWö—ÇÛWÚ†›o ßZÚÚÃb¨›Õ¢wù÷¹AÎúŒÎ¶Õ|KöYm[Só™âŠÝfû»º¬_:lù*¾ýVÚâ+˜®VAe¸¸ûZYÁ½üß¾û¯÷?ïŠø'Ãן5[ô±¶ñ¡5ÛíómÕÝÑwìw}¿7ÉüUÔ|BÒ¾)|4µIgÕîntûÈ%O;ì²üŸ}6;ïÿ[ýߟø(ýçò‡¸}°ú–ª–émçÁm§²Á¾$±·O7Êù‘ßäÿ¾«ææ•Öó˹´inmæ±·x‘¥ûûgÿ³¾¾?ø]ñƒÅš—‡ì¬bñžlPlo´i\>ÿ÷Ù÷7ü·¦ø÷â[x¯ö³ê6r½¿Í±Þ „Uo“ïÔsWûT¿òbù©ý™mkš®«~òÜÏ-ãî·yRâÕeó^/¹¿r|ßÁÿ|%2ÏM¼¼"h x¢YR(f³‰Ò/5÷|Ÿ'ýñýÚùWGý¥ ¿Ô’)t? BŸóÙ4ËÿþM«$øýáËo*(­´)®7~þÓ5K}¿ð5½ùª}®'þ}äȾJóðúµ4Û”¿þÐh—ûMeŠU»û,[þTÛ±>O»÷ÿﺯs£ßmuÛþ¶ måxmbG•%}ï¿äûÛ¿ô7¯—|Sâý\Òt-g^š? x~+•óåðÚ_ÛÝϺ)|¨¾k§]ŒÈµê÷ÿ°‹ïÝjújyIòE¯ÜJ›ÿßd®º|Ó½R%ËödztÖs½Ã¬¶Ð}ŸÏ[²=Œ_gÞ©·~ÍŸå¨{kĵŠU*Íí`wµ‹|I¿Éò|¿Áó×—ÿù|u²)[â·³w̉­}Ïö>åa|Fý‡#:Nl×·ÂËTÝ*Ä¿j²ífTþâ«#”÷Ôñ‡Š,÷ùZ„ˆuöÖ‰ ‹cKåy_?Éýßýª}³U¹µ{iZ$ŠXÞTû ½U÷üÿ'ÍÿÄׇü7ý›<=ñËGÖ?á_x÷Ä­¾äZÏ®]êw¾mÄ©»ä‰·ýÅûß/û•ªŸðN/Þ?î¾"k)÷ßcêÏÿÄP§¯My}¿kEÄ“Ëp–ïcÄiSkü›?ÎúÊxo<ˆ·m¹x"‚(®%³‰åO)÷¦Ï“åÿÙ«Ï¿áܾ/û,¿5Ù®?ØÖ>ÿþ9^ZŸ |5àŸÿÂâ?x¿Rø{ykkc¤¥ä©nþ~Í’ý¡]>_÷ïMß'ñPÒ^v¡ ×Úbò7·Ÿ½ÒÎ-òù¿{ìÿ¾*“ßß:¼^U·ÙÿÑ÷[ý†OÜ}Ï“gÍÿØWž_ÿÁ=ZÓø—ÈH×P‘ ó⸖ßʋʕ•6ü˲¾ñ¿ì‘ÿ wL°ñ7޾!ø¢ËÂ’ÏSÝÛj?hò·>ÔfEÚû¿»÷k?ÁŸt¯–ë^ ñG‹m¼?òÚÅqq¬yOtÊû]öJïµ~zvaÊ{lßiÿH_*ô«YmeÿC‰UgÜûþO™¾ÿýöõ4:•Í«ÙýOû'Ûëìói–þR¶Í¿sÊÛþ×ü¼’ÿöñ\m_x¥62n·þÖMñ'ÉÿÅÓöñÛ6øÛÄßßg}b'ù>z^øœ——ØZZ¬P?ÙíbµŠo°Û»¢«ïMŸ'û”ɵ[—ןUò,RíÚW—e¾öóSgßÙþÂl¯œ&ð‡õ/ËðïCñO‹æñí¯žº‹ê:ƒ$V¯Ìï½Ö_áÛ±НÍû x¾7ù~ êJ‰÷Ý5mÿî|”í©4¶q\*ÙÚyW y_a‹cùò?Üù›ûßÞÙUÝîa·Ûú4±}£mżDëæýý›Såÿb¼Wþ/ÅòÿÂÃÕŸoÞÙxÿwþù®CÆ^ƒàÞöÏx¯_ÔRêA˜³¾%¶|Ò«íÛü?v‰ô¿öÅöëFUýÕ­ÔWK±DÈílþç÷>ýfMs.û„k;M—KnÈ–vèÿ3îw“æoþ.¼^Ãöiñ>½§C©Áã nÎ+ÅKˆ-ÞûçTdÜŸïüŒ•]?eßíyãÝIÊW_&ñÝŽP=¡õYþË4Ùúk£Þ=Ò£éÖ¾R|›vlò¶íûíÿ¬û›ùf‹OV±²ßg¼K+ØÀÎÞSïûû>]ÿÇ^Tÿ³ˆt§ûLþ3Öï, óeºŠí¶%ùëÒü)áÿˆ7/á/xÊ[;/).¥-òïmì»zÿÂ@èšóCâ9uuÒ´ýì·'ØàØþo÷ÿuólþý’›‰ç³Šãþ%ú_šòÛºÿIJ×by_ìù_ÇüuáZ—Âÿ²ìÛã™vïò·ÄkÿË_áù?ïªÏ’æ(¼ø…娛ç‹c|¿'ñÑÍ0>Їâ/ˆt­]>ÆuÓ~ÛkqkuqoH÷JþkïÚ••⯴øûV]+OùçiZ$±·Þߺò¶oò¾ïÜmŸwux®¿á¯ xbÛOÓ5Ïø¾ËÄw‹Á ¢-Çš’ý×]׿{ø*¦¥à ÚãʋǞ6}Ÿý/üwý#棘W‡Uû½Ú˧éïæÅJŸc·Ø»_výžWÌÏüoüU^ç^Ÿì[VÎÑ.÷\Kö¿±Áòîùby_.ÄûŸÝþ •ä_ðŠøks«xÿƉòý÷³·Ùÿ¥U­¥xWÂ_Ù—×—ž8ñlÖ6±y³Ü5ªÿ£¦ÿ)7¢Ü~£˜£Ñ&ñ ý¢Ý’ÎÚDhXR }òùIürù_uÿ‰?ï½õCþùâ– i¢H<¨"H­ÓÊù÷ïtÙó7ðz¼‰4­ÿMKëOøµâvt‰ÞÆ-ŒË³ü¼QäéVÖ»Çþ4…øÅvéGûsÊzªkÒ»Ë.ßø˜;7úG•Ï)“g”‰³åþ?¹ýúú·þ ¾ìïños3ÿÄÇN}ïÿ^ò×ç}†Žšª¯ŒüAsdÊÞj}Ñ¿ƒoúGÍ_`|ý­>~ÌF¡¡Ùè¾+¹ÔõR[û½Zx<Ùe‹z}ÅûŠŸ?ÉAчMUfûõò ?ðT†—+¿þíu?ï×ÿV?áç ?‹C×òÿVd}'ñ?â×[þ˜ìé_B×çä?¶„þ-x^÷OÐôR½eµ[‹‡‹dO½>þ×Ý_ x©f°øOÌ)¾O„¾‹û¿toý*¯ ý“ô;Ÿ ÍÁö•H¬å_;æØíçÙ^õ¥hí©x/Â:b˱î¾è6êïü;®‘özgï_ð¤,%³þÞÓõï5¢ÓÙìå„°DŠèÿíW¯*Rœe8ÿ4Œy£ z?ƒ4]¿6•hïþÜI¾»/|=Ðîg·Ý¤Y>éQ6< ýúʰ…/6-É·ÿ®ã®Éí_šT½þÝy†Ç宩âËö³ñ®y}q§Á¯Ï™fó¿ÙíeyÛs¢}߸¬µîž ý¨~.øoÁ>ŸnôÝ2’ÖÆŠ/’$O‘~æï»^7àoÏãÿøÂÚ+fšÞ×ÅÖ÷Û>üV­qt’¿þ^«y£èzÜIœ– o¨¯w>ÿ™¸›>÷ܪ§Oš!ÍÈdø[ãG|9ã»-sÃíöMa –$»ŠÞÑKóËò?Ëó}úî>'~Ð>8ñÏ‚?kßðéJßm]>[X“lèýßøÉ_:Ãöë›Ô–x¥xUvo‡vú©ssrš& ±NÓ:ÀÏ*;ªù?‚«Ý"Qç÷¢WÕSþ¯k·:/›mk-ä²ÚÃoòm‰Ÿz'üî×wagá{Gm3OÕ­¼[ñy·n¿è‰ÿ=_üÿ±þÝZøiá»? ¢išä°iW~jý©ÞU}ïþÿýñ^Áã=+Á—ž²Ò4†ŸUñ¢Ñ[Ú¦.÷•ÚTO+gñýö•ÓNŸ/¼sJ§Ù=“ö†Ð>x“á·qák{oøJNϵÏó}¢wØ¿$»¾ûn}û¿Ø¯‹¾%ÜèÚlVövpy:­®ÿ6á>ü«*Eå#¹²ZôTÖüCðÆòöÆóEhbÒ?ä"‰åK-ªoÛûÔ_¹÷ëÉþ"ØK­ø£X×–ÙŸM¸ò-ฉ?uæìÞéÿ|íoøEHû¡JR+ü+Ð|9s¬ÜÂYªêZU¦Õx&±ƒÍÜÛþ}ÿ#ÿ}Ýû'ü)ø1âƒwI¯k"m{QûRºÝ¿ÙÞó]"•Sø¥Ø‰÷«àO·Û%½¼Aìßµå–Tv¯eøiðÇž$ðuÇŒ4¯^ßøm·@·ó¢ùí÷Êó_|¿sýªˆûÑå6æ<ëâüÿ`½ð匫§ØkðyýÿŸø?Ùûõû ¢|`ð¾·âCLYZÓeû?Û®6%»7•>Çþ%ýïßûµù5yaþ•süIîÅ:uªý®'‰í{ó¼©ò}Æþ–¾è³¹ŠþÊâ_6çÅWÚvlf‰¢·³ò’-›åÙµš-ï+§ÌÌîŸsø.QæËÝ>ðÿÅÏ Üê7v«säÛÁs-¿Û®>Kv•v7Èÿu•÷®ß÷¼_ö™øµþ üPÐô«K—GÑu+(®6¶Ë©bOýýÿ'÷¶VÙùÚ‹ØÄÓërÁâ+wþθ_*ÇMùÓçò¶·”½ÿs§Üþ öÑX-ÜöÚæÍN×ω®×e–ÔExþEfO‘[çÝóÿß8ÊœCœðÿø&ÏŒâÐ~øŽ{›k»ËÝGÄ–VðCoÎÎÖÿ}ßøU6¿Îõö†¥ñƒEK=2X{ýJþtµ]:Óç¸Ú'oÞíû«ò?߯‰ÿcÍv {àe¼šôú=¼º­½¼ZflÒÜOå&×O‘¿zË¿äMûQÿÞ¯b¿™a°DŸí~Ó?¶ãIW}CTݽÿ†-Ëæ¿ï¿åEü|¼ß|ǵøÏã–‹£èÚdZ|M­Þßì‰tëOµÅº'—÷©ü;+à_êRkßðPëÓÛJ\K ÜnùþO›gÍþí} œI¤Mª¿Øö—šœ©èÊòê–é]ŸîŹZW_7äÝòÅ^Syâ«›Ú[áæ‘ý¹man±y¿kuß-¬=Æÿ“ûÒïÜ¿ÝßüU¼¡]ø?ã÷‡<[{crÒøoÊâŠ]oÊ·Šë÷®¿&çþ?)þGÚûvV‚hxÚ}M™[ÃÉk?”¯¯l·ûB4®‰ånöäûÕà^-ÐtÏê?èmwãû·Ö.·;·Ùíì¾úoOô›z§Ù×fåÜóÿŒM*}oR‰¥ŠÅ±:K4Êñy ó«¤_ºû¯±"]›¾dŸïï¿fG7¼]ý±¾7éÿ?gA¡é÷Öiky`û/¢Ùöô­¨ñ'÷~ÿÉ÷¿¿Oý>!i¿ þZA.Ÿwuw{âMF/ôx•Þ(•‘žWw}ª¿:½\ÿĽVÛ¾ñ†«§ëßÛvéuö‹Ç–×ìöòþõâ‹äEùþâ}ïø÷½[¿ï×Uø#à-;Pñ}¥ÅƦÏk£CoŸ÷[âŠWØû~ÿö_âŽSCè?|oÑ|7ý·ÌÔ®5eIíìbŠ_±ù_Ç+ÿÇtù¹ÿˆ_õy$)µ¯†´ùà—¨úî<-òK-ûïÜŸh•bùwüï/üçþÿ?¥X[C¦Ÿ}f¾¸ŠòYlü'é]—ÊGDwò¾_—{ÊÿÞx·½_)Ÿ1ç^IßöÍø©¤ r‘kÜKöx¾Ñå/Ùâoáþ/½ÿ|Wºé_¬ntKV]Öqo•´ë¿k}¨ï³Ê_¼ßsäOºÕã_|Hú?í ã¹ñtžG±>Ñ k³}‰6E*u6|ß'ðhYÌÓXZjq,óDö®ëâi•ÒX¶£¾÷Fù¶ÿËWþ µ¾é|Ç©é_ôÍKÂw×,ÖÛ-n¥û߸ùbÞé±~ó±_7þØÞ!ƒÆžð¥ÜP47o=ç›iòy±mMŸ:¯ñ|¯]Öy²Ùj ­ ¿ØÝ'ñNß5ÕW{ü鳿Ù÷Ûî¯ÜZòÿ޾m‡ü#MÃöÕÞš…ò²}«k˱ÝfÖOâÿ}){Æ•ñ/LÑ%ðç‡'ó!¸þǰÿHx-Õ~Î÷Ûý”«|NÒ&ñƒé_/ú„¸–í×e¼¿&ÿ‘Ûï7ñwçzáüq­7Šu=$ñ?ü'ËáëU{FµkyeU‰ÿÑ÷2}ÿ—þù_ãþ>jkŸ´ÛÝÁå.ªÿÙ‰·CuÙ-¿Ï¿ûŸÆÿ½ÿwÿ|¤s—­øÛL¹OiJ»â‹N–â[ç•<©w[§É³üÍó#ü•óìí¬/‡¼ã{›•‘í"»°–xa|Ì›f_“þ껿ۯOñn¥ý¥¥ÞÏçµýÄZfùtèWÊûoGûêŸÁòK³þy?Ü®7á°ÉðŸÅv×Z½µ…•Ó|© [ßvôûß#ü¯¿jìþ-Ÿ~‘|ÆÖ·ã;[Ï[ß+I2/•p»>ÿïƒbýÖß¿~ÿöé¶É›göíkPdû,ð#ØéÉö‰Y÷lDO—îïùÝþ]ŸÅ\åÿú–ðNËgi-¬³D¨òߣy_ê¾O—z¢"ÿä‘)ûììíuX¥fÒ­%µ‹ÊH•eÝòEóìÙüÁ÷¶üÿ'÷BNoã…ÿÛþ3x"xî<ݰØ*ËþÏÚc³òì­íWÅV×:ö¡l¬Éwo,¯t›~â³¢ìO÷>OûûÍCþN”»lf—o›þ–ûíÝ?¿ýÖ]¿søk ñ²ê^#½¼³[Çe‰'M±D–û‘<§—û¿Ç¿Ëþª ©üÞn«zÑ,Ãk+ÛÊïò|ßçïÖž»4v¿ ¼ebº‚ßÊŠÉ:¤I³ýl[ø—å—ç_î'÷öÖ}ä6ןmºfŠóS–x·_:ŤKü{ûÿ?ßþ:£ñúS£ø€[ÏÕ¬³¢HÈŠ»výÄoüy¿ßß@zMå¶›ð»ÃSÝH¢'–ñ~Eþ-É÷ªž«3$±.åÞòùJû~MÿïÿÀë¨-þZXß.Ÿg/¯¤JþküþR;ÿŸ—ûõB[O²´º‘XÐÎ’®œ›|Ýß2üÿÝþ-ßŶ¤ff›£´7öŸi¼ŽÍÞ³Åü½ÿÙ~oã­EKß‹šúÎAo¨êWÒâX²·-Ä¿÷ÒoW_ø Ui¢Ób·[eŽi´Ùà±»U÷7ÿµýÿ÷½WჯzáaÔ›AÐü©ù sö_…¾¸XQ~yvÝ#lJw€üs}ãËt¼{±ÚOZ»;¶ÉRYâÿwOö+Ýö¼´¥ïHæ”yåÌuv{vùK¹6ÿÿŠ®£Ã{m®­åO™ô:ç!‡÷»«¦ðôÑ&©hËóþõ>çð|õã‡çOÂ[ÆÓn?h;åf¸²ßu:ÿËUº¸Ù]_~kÞ±¶›Z±Y¢]15Éõ3Q—÷Q;ìßå*nÝþÏû~¸/ \Ïiíä@ÓDþjNèû|¨¾Ûq½ëëߊ~{•ð-Ì© 1E៳Å}µ7ØD·½eF_›f÷eþèµ1ææ}ÃnúÕÏžŠÍ/¶b‚W–ö ~H"ùö³·É±þîÇ®kÆÚ=ÌÞ ¸ÕbV¶²m2+Õ¸óÞãíŸjÿU~é>mûÿñúû Rø¢Í¥øƒÅMyÚ-¯öGö›ª½¼M¿|®ñlù¶*E÷>Uþ •æ¿¿gmÁþñ׎Fñ Z¶“-»jzs"[ï_+z,_ód[6ü«óÿri <ãÅœ³Ì¬7wìð®Í»~]ÿ/ݪžñ·†“AÒ ±Ò'Ñ<[­¼K®;l…%]ÿh}êÿ.ýè»ö|µ/ÆËiïüsvÍg>ÄûÈûgýóY_ üÞ9ñ«äZ¤1XiÒê ý“f—±Ñ¿ßÿÇ+²29£ëÚoTøMñàî‹?…´tÑu}:5¯~ʉs;²ªý•ßþ^7·ÌÍó/É_4øÎ;áõí⯓qýºÑ7•ònO²ÅòWо'ý—t7K}"ÇW»ÒžÖx"–ííQ%ºŠT—zEÿ=eÞ‰ò·^/¥[Að«U‚U»x“SOÞíùå—ìñ.Ïö[ûÉQñG”%ñsHóφ/àŸ´jðAvñ£¥«ØïùS{ý£î:Ýÿj¿AÿeŸøSº—ÁËÍZÕÍýޤûm-.e—÷n)"þìªîßínjüø¹ðMÍÍÔ¿c¶¹ÿG‹Í•/àþây¿Ø¯·g_ØÎ/ëðÙø³íú†­AoÝè²¢+~éþç›÷zŸ=_/º\dr¿þÞxKðúÄ ©kwþ:Ów=ôèéu»~Ä—äþ?)7ÿ¿_AÍá»?A‹öåÖ%ºÖ¾ÐÞ‹e½¼®¿>÷uþÙó§þ9ýï&ý´|Oªêóü7ð¿Š-­.µ‰|S¤j“éšNõý×›p»?ûßùwÿ{œ0Þ^i)´Ï¦èë®Åå[éìϪÎí÷öíûªíòüŸ6Íÿ?÷T¥)1‰a<7¤ºf‘;}¦íßør|¤ý×Ì›åÝó}Ävß¿ÉYšòO¡\iš|Q^JÓÞ$þ›jEÉ+£¼­¿ïýöûÿ3­vZ¶‡ºm”:‰¼°ÐbÖwÛGdÒ¶«;¶ï¿µw®öÿlÿÇsïìn¦ð½Å­ö×:žùlôûyŸûUÓÊš_¹÷Ûæûëòì¬}ã^Sæ¿ØgD±Ñ>ig«Úhš{ëRËý­Å-óËötß³ûªŒïñ|¯^ÏáÏ Zi†×SšOì[]Zòwÿ„„¿Ÿqpÿwb«7¿ì×Á?t gßíEŽ jC\y¿¶/gÍ’¤±|¿Åü ½ä_Óæ¯¥ü3¤<”wÏu®Å©N²^_Èé¥[ýõu‹åþù>OãjÒDœ^á»]+S—AþÑžöá¼H’ý¡åàÚŒïµSûµóýχ™ÿk†÷“ékërÁ,±K}*ì–/ô­÷›?å“"lÿ€|ë_MiºuΉ¨[ÏáW’óSþѺŠëPךTÒl“çßö“øÕ|ŸÆß=|×⯠ùßµŸÂÝ^? ê×öŸÙÍnÑC>ϵOþÈÑ|éû¨¶í»þëTDZÕ~Áâ­GOû ÿðÞÚ¬·³ÛÃ*[ÛÚºÿqÕÓr¦ýêŸÞßÿ«©|=¶ñT¶Mc}.½ö{YogKv[T²—ý„Þ›¶ yßþÒë_\ÿÂ>ºçŸ¦Û£\Ec£xm¥{æ‰Qö%ê|ªŸë[gûÿÚÌ×MÝí¯†“^»ŸGD‚â;OðÛ<·ýϵ–ž-KD–+yu¹oœí*$¿?ûþ_ø]ø£Åaû>ø^{•ÒtKv‚W‹b,·û¿ç®ß™V_ûév}ú?høH~"ü Ô4­CL´¶ÔÎ {}&WtµO´~éî¾Oàþ?¼¿:T¿³”7– üm¤xzDŠòÎTÔu=fwòžßfù^ßï³oû±'Ëüsø‘&ÝŸƒ"ðƉ-µäí`÷QK{ÚŒ¿h¸Ô¥—æûûþ_7bnO—o”•¦ø?þû è¾Ó%…ÅůڬßQo´]Þ¼¿}÷ÿË]›ßû»þÑønò{Ët—Ló5»Kˆ®-õm{Qù"ò·í²¦Ï™~甉ü(ÿ?÷ùM+XÔí´ˆ–Å¢ñU¦¥k*_xží¼¤H—bº[£ÅýýžWðíþ?’ðBkÍ7öñ¬ºeΟ¦§•*5ƶªþj5¯Üþ5óeûßþú®öOÕeûr´é-»*y³O±?zÿ½Ùü¬ÎÿÇ÷¶ìþ áþX3þÒž;oì…ñ Æïõ× å'ÍoóÊŸq¾áù>í{•fÚmÒEx×z÷Ší`*ÆÝ™´•_)ÕÝåþòlD]ÿÜ“ïÖ£1ßÀv0ë«é3çé×QD³_?•æîù¿Õ}ÖùþGþò¢W€þѯg©\h’ÛEwsp÷›íÛÍùÝQÓoü ýÄù+ÞïæÕõ_E}}s&±âØ¢—þ%îM1>O)Íÿ¾þM¨í^ûFý¦ÿTðúê+ªêÝE-å¦ôû;³º¿•»ø_äMÿôÊ€=/U°‹^M2 B{)¯^ÆÞ×ÎÐÖ+ÝlØÿ?ð²±ómßò-Emà cK´Ò¢¼Ÿþ[‹étßÝ6ÄX—{ïóØtÙþëÓ¯<ûmÉ¥³“Ãz#YÅ羘Î÷:£üè›?ý­Ûÿ‹øêê^$ÕÓ‰¤yóé^EûBßE½î<ý›~tÙ¹~þÏŸæÜÿsîVB÷Œé¶ÚW‚ßL¹¼îÕnž_³ítWWÙ½ßýÿݺéÿá~i¿iøo¬\Ëm¦ÙÚ}«dúÆ×–TWFtDûß'Þ_÷?ï¾×[¼Õí¾$W’ÛXi–3Å.æón‘7£¦Ïºéû¯÷ë‡ø3i¿ ®ç³Ñnîu·?•q+?Ù7/Έ¿nϾÿ"ü¨ÿø\†l?‚l渖ù®gÓtyb[vy¥ßó¯•þ©7ÿúÕÿ}þvþ:úVƒ&•qª­ÌúV•*ýŸý/÷®›|¤ÞŸ?ðoÚ¿ìÊßz¢ÿ„ÃSMQ/ ¹[›¸­RátË´ù,¥WFûû?ƒ{¿û²§ÈŸÃŸaâ}Uõénâ’+÷H"u²Ô?uö6mŸÇ³æÙ÷[ï}ôùDÚ\ÿ4«X´km<¤Oìû‰|¦Ü©·b¶ïºŸu+¹ñ‡—R¸»Š)[ûVéWu½‹KûÔýÔ¿½ùÿ%ù?Š*äʼøå¡Iy>«©+اɥ«}¡?uòÅÿûþånø·ÅW6rêv6~F•û„•n6£ý«vϹò|¿ßOúeæÔ3Äþi­^ÎÇS‘îÛçXm×u¼_&é_åù~}‰/ÉýϹ\çÅÛe¶ðÕëK*ÃvþTOih¯ålWwÙýßãIàu¡âOêé×zUŸÙ4t‹gúåGó÷|ïóÿ½÷?é–úËø™{;xSR±x"Ó~Îbw†FW–]Ï/Ï»ûÛ·ÿÀ(_MÑ×þ«F¹Ò£Ò­å<ßÞÿÇÆä•7¦ß»¿îS.|=³í·-¨\¥•Ä¿,ÒÿÇÅÂüÿsþºÿèHÿß§ÜßÛhž Òn`¶Ô.e{8·>§ü$»önûËò~ëý¤zÌO\ÛO{<ÿf¿•®™ûøb }ÍŸð:`W³ðÛÛY:ß^l²–ñn"–X¿Ò>Oÿoû¿#×ѲóÃk7‚õ N9eÔ¼-âM.víi^-In7ÿÀü×ÿ¿U󽆷¨$W„ëirÿÚ>Rß&݈ûÑþDÿ¾?à5ØiÞ9¸øuáÏ„^ ‚Ýu ‹Tñ*}žÝ¶$»¥uÿ¾>}ßð ô²ÙF•IU—õª9ñ”£Ëýl΢òOx)WîdËÿ¥·UÍ\óýßá­„ÔšÿAÑ-¶ìM.×ìJéÿ-SÍ–]ÿùÿïŠÏ¼‡ÉßXãêÆµyJ&´½È>¦ÿаÿ׿ô¡+÷«ø5ð•6|Z´þÜEÿ¥ _¼¹¯4kâ‘ù»q7“០3\ý™"øW þûïù_éhÛëŒø —ÉâÝÞ|÷úd¾Ó‘n6º$²ù²üûø~jêýòįýÍ’ìáâ¯:ñç5Í{Âþ8¶û5Λ{‹öŽ™J–ö ò}¡÷ýÖò’_àÛ÷ÿ߯£ßÄžÑÃý§µmåðÌ(öÛ%Ù³d¿ÞÚèŸ#ü¿'ΕÂüo¹ð›ü:ñZøjÑõ_ì™R}ãfø"ÙòÊíóü‰ón_ŸþY|ß5GÀŒÙÙÛ|]]wÅZ|Kå-ô¶ö¶/¤¥ÅÇÙâHšYeýê}Ï7o÷š½CDø8Öwºe¶‚°jºÝÒÊ—Pè:JlU‹ç•åyn?uü&ýß?É^eû7ë~O„‰æ²\/Ù"ß½¼¨¿Ø•6n—ø~çüÚ>xóÃÞ°¸Ðu]sÄžðäÅÕÄÏÇ–y]_ìé.ÍÍ›½ßÝÞŸ?Ï[{@å5uï†:Ÿ‰õKuðâézõÂÄžoØtén.-^$E{‡µ"Å÷Ój}êð$›O›â§ð›í–ŸmM~êYuYmâŠ(,’_´|»Ûs¼Rü•ôB|iÓ<1‡×ÄôТº{+[2*îëÍÿT—Oå|¿ß½÷Ó~Úù_U¼–oÚ¾%—E]6î cM³Û¶ùmÕ¢DÙ+ÿ{vÉeÿÑÍï)î¿ üc­èÚÞ¯}¨A¥\i,É;êrßÅ,R;˾ÞWÝ÷6>ôzô„_SÅ_ |Aâ_øâKÅ·•Ù¦Õ¯¯l–ßÊO6]é¾WoÝ6õÙ^oªéºeÿˆü?­\­ÏŽm]¸IuÍ2’+_6é)eÚ鹑ßsü«òü¯òWQñƒöcø}ð÷Mð£éú’>·¥ê±Z闶ж¶2ÝJ’Ëþ‘_*£ºE»ýŸÃQ’˜rÀó/‰l~+hŸ uË=J l—Æik}b÷M}f±2K/î§ÞßòÝÍ_WüZñˆþü×_ïW§x_Á¾Ѽ |#¤é6Ú¦‹gzšl±j±´ºU¤ »<¤÷™åþööùÚ¦ðž™áÍêßð‹]Úé:uÌšmΦðãOµò¢ùmÕw§ú¥Ø¿{ûÿ5_ºQóGüºhµïƒVí{§j&ÕbÖ$Š-=ÂEonªŸ+nu]ÿ*nþ/™k®ðoÅø«ãçˆ|#â iÞ³¼‰ô-Æò/´E,¨ìŸj‹Ê»|×5~YQ6nÞ•Gö+×£ñWÃm:­ÍÍ”Zœ¶ë¤èë²áYUÞWGû²²y¿Ãòï¯WÑüàÅ’ø³OÒ ÓuKUd–çAó[U¿‰·²¬­ý×ò¼ÖÙü)ZÿˆˆžA¨ü}ñ'†~,ø£Ãß|5¥k^³Öí4¯ éš=ÌS\-ÍÓ²Ûý©7ü‘{ÍUùömß\W/í¡ý«~i²ø]{$Ò®¾Ól‘~êß*Ån›¢û®­ó¾ÿïüë_G_øÁQøªmv÷Ö:^µª_5½ÄZ-ý¥¨„w–5•ÿ‰÷Eæü¿6ÔûÕäß|IsgûEü;ÑWÅ:L.úUã¬S*½Ä_ëÑíÛçÜÒË»åoáþãÖ~ïÙ ¿hOŠþ(øtºF•ðËDÓt¯ﵸ¾»×햷.ÆIZTVgxY>ú®Ïøþ/ø‡Ç_ <àëÒtWÕõ±]¿‰/Ò&¼‰¾wieO™Ù?ßÛ³åþï¢\èþñ§ö‡«èÞ$¸,²¿‹¢–X“våY`‹ûŽÊÑ+ýß•ÿàXÞ$ð߆¼yáï éš¿‡—ÅZ?›uþã(®<Ýÿò䊟.ÿºŽŸ.Ôÿ¾tgŒü`ñ&ŠÿîÏž©ûâøNWá7‰üOâßê ã? Z:xsQ–ËG›I¾FÓô¸"dO6ã÷»u½QþÞ¿ÉòÖO†¹\ï…¼?¦èM–Ÿ¦Ú/„Þêæ{ÆÐtO6á>Õ²$óoetvù>ä¿ÁºT¬¤3Å>½œß´?Œ¥¼k½cìòÚ¿Ùí÷¤Nëoó£ü¿Àß$_6ïî;Ö¦ñÞûâ=ß„¬|3¦Øè^¿¹žÖ_ Ý4V÷må}Ä‹øçýÔ®Šéóoo›îRx %¹ý¡> iöÚœPÞÜKa®Ÿiþ¶Vò¶&ÏâÝoüí}úõ?‰ѵZÜÞh6Zl¾±Kšã{ë>Å•>Ew_=?Ö³üß}>O¿WËîó '#âjvzöŸ¢ÙÛiµû|WžI×íÌðJñKN»ÍH¾ëýæÿÇëÇh8´­{ÂVËmƒik}öIm4Í5®Ù_äý×ÞÙòlÿk}{—‰ü7m¯i¨jDºjEg¾×S»YeÖÑÞT}í¿c&ýÿ?ñlM•äÿ´=³iZ÷%û¾·]N/"ûYÞ÷VW}÷ +ýè·ï}ÿ߬¹K$×¼Y§i·úf‰¢C=‡‰"Ðî/à¾Ô?ãÞ_)åu‰™ß÷_u¼ßïÿSÞ[i:eÌVÖÖÞ+½Ñn¯`Õžx¾Ã.ßàwß·î>æþÏ]‡ˆì}/O±»ïÿá"K‹]=/·­¥úE¹U×ûûÑ›ý•MŸÁ\ýΛmm ÿbíŠg– m×F•eû 'úÝ‘'ü%þ÷Ü_ãJR$Í×kÿEuw¢ÛA®\iN²jfáÖ}ªŽÈ¿7ÝØû—ï'›üUÃü3×´ýànµs}y{4Kçùö‹ü{«ÊˆÜÜÎû×ÜwûŸÅêúlIàÛ‹,õ žÞÅ¢û ù¯ij‹ûß‘Ûø¾O?ûÛ~Zá¾êigð y.üCi›מ|Iél72|Ï·wúýÛî·Íòoþ'­Ü6‘¥ßÉr±Þøv :ÖU¸‰‘¥e—ÊdIUûß/÷vª|Ïüzv/uªëW+6Šuí-ôë?²}ü«‡ùbmÓüßDZ·ïÿcæj»t‘¶q«˜Kí*$—Y‡vË­ÞR»·ËòïÿUýåÚÿ"ÿ m4}¶þ&kk¸bº³‚%¸ÑÖ_7QÝå>Ï•?¾dþêÄÿv oF¹M7ã•<¾'þÍò¬ZTÔR=Îß&ôO÷ŸþúÝV¼O7ö¯‰u†³¹ùìþÏÕ”Ûö[îEGt7çÚÿ*ýßõ¿Å[>ŽúÏ㤠Þ‘¥]ÿaÎÍ5÷Ïo/îNöO¹÷þúÿ½÷Z±|Hñ\ë:õ³5µËù¯-¤*©5®Ý›7üŸ6ÄwVÿiÓäJ 1u{Ë¿ì]bÖÞÙnç–xb¸FWÚ»Õ¶7÷Sþ=ÿÏËÄèb›IÔ.m ¹°´h¢u‹PoÞËóºoOö~MŸð ¹âmB]F=TM¿Q6ñ[Û´_Çj¬Ÿu—ÿÿiÞŠ–ÛôMFèËu¨¤«½ôé·æù¾çý2þâùÑèï‹5ËH< ¦Áý¹%úKA|ªÈ‘}÷tÚ»>ã6íßïnß\õÍÌú>£eÛG±'H¢ÞÏåDË¿ø?é—Íÿ}ýÊï¾"}¹ìtÈÞûI¿º– ³KcävòŸÊOãùÓø¾oûæ¸MWìÐÝ\@Ñ5„Oxk ÆÇÜÿ>ÏŸûß?Ïÿ©D¯˨è—mŒöwªªEp¬ÿg·‹çÙþ†¿î×Câ©>Íð³ák2ìò—Ä‘?ƒý"±­­¢‡D{o.îMbÝ"Ó¶þçæO¸ïÿ=~ÿü +SÆûáQ|2Ú¬©åx‹b·ýw®š©þý¹¾(ÿ]ߨmHw3þýþwÿ~«Ü§ð§ÏþÅ;G;H†u_žVwÿÇè¹ÿTíò×e…ȰüU´eÿžQéBWï~ü.ùþ-Ynù÷ÅÜÿ¯¤¯Þ hÇ©ùŸ®îO軿è“hŸú5+‚ý‰5'¿ø^‹»‘¬[?»µ½7QÓeÖ<¢ÁÝÿð§ô™~ö_{ÿè5ãÿ°’5·‚5ØoÈÖÿm÷'þ‡^oŠ_öñ¾Ñõ,0²|˹ÿ¿]‡“eý§÷ZU¬{=»ÓûõÒøzû}¦æÿ–«ÿ¡×¡ù55³¿Œ¾%ª¦ô‹_gdÝÿMoWÿCzýø©©ZXx_ÀÿÚ°Eâ1¼#-­Óۮ˸žWÚžV×O¿÷?ÎÚøWK¼µOüX³’×í:Õ׈q/•½Ö%¸ºóv?ðÿË/÷«í«=ľ*ðÏÃK¯7ö¬^H´›ë{¨’WŸz|æýÆÝ÷>ଢköJ¯ð*çRð†¡ªø{S¹}aô”þÑ‹Èd¸TTýëù[Ók:ÿsæù?ï¿ñ·€'³²ñÖ¥s¦jÿ±~ÅöéZt¸¿UH÷>ÕóYÍMŠÈ±}öùëéïëž0øsk©išÿ„§±¹Ô¯t¿ „vŽUÙû¦Tß÷Ýö}çÛ^qãoÚKÕ|C-§‰`W¸Ñ¢‹R¾×¾Ã½/,ÚX¼Û}Œ›_zlÛ÷÷7›ÿ?º 2J†Í ‡ö¯yVêæÎÞ]FÊU»¾]÷K*}÷Oúxßÿókêßøz'ø¡.§m¡ê—šUþ±qk¦]èŸ=Å›­¾Ë7î+o؉þÂïÿx‰5]ó⇃åÒ/ Ô¼FšûK«_$N>ï+c§ý2ÿ[öîü”J_S=öóÁ+¥ë·Ú¾™wÿ ºÅãÙÅ ß2ZjÞWßIbþëÄžGÏò®úò_†ú'‰|[¢iV7–:Ï„µ[_7R—Ã:dm–¥eþ«}Ô¬ÿºYw½¯üîWÑÿ ´ ëX¿ç«²íGþvûՋ㟠ßj?´gÃ+ûM@7³hº§Ùe»ŸkÜÄé+K+&ϼŸºÛþÿðQ¤|G×¼;ûHxæÖËÆ0øòê?Áo‚Ë*EáëYßÊ–ënݬ±oÚÛøþjÜñ/ßí=ðÊïþû©­›O¾yäk´Ù,¿7•:üß/•óÿßåùZ¤³'ã_Áxÿh{mOѼk¨ÍeåO:i+RÀnÿG–ãÍþ·äþën÷5~2|*ÿ†‰ð×€¼=§xßSm_AÔeÔï.4VX¢‚(×o”ÿí¯Ê«ÿ¯=ý¬¾"x“Áái~Ò´éìÞ=N%–+£/›æÙ:Åó|›Wû«ó&êßý­µ=Cà þܯņé&­ö;O³g†k}Ÿu¼­ÿsï?ðüÔ£}‘¿,àñ7Àý[MÔ5 +[Š+iWQŠ&û=¦Ú¿{»yøÿ½¿æ_»]—ìí¢éiðSÚWŠçѼ=§ë²û6ÙWÊ¿Egoß«lÝ+ÿÿãíU~9Xj^<ø©iߨq&¡•pšu£ªdùW RÏóí“çÿýÊã®´­CÀß³ÃïxsÁ+wqk¢Ù[Ï¥Íuþ‘}Ó"\Kn¿7Ìÿ'÷v¯÷*áýÐ3~ø_…¶·³ã[Û=Ä·©*k›Z[¤ošÞÝwËæìwoâýÒ|µÂü1ðÆ¡ð¿Aò/¼Y{aeâ ›­JíeW»¿YQ+/õ¿.õMïü[‘>JÞýšnu_‰z§ˆ­§ñ?‡|[q¦ß^E>³¶U{[Yv£¦äûϳäò¾]–ïó×?ð÷R×4Oj²xËLñÔ¶·7Ðˬ5«¯•$Lö±o‹~ù¿…ÓäÛüÕ„¥ö€æ~¤ö~"Î[Xié.,¿2ý¯nÄxž/áÝüO¿þû®³â­"óâ^‡ã Ä×õ®»U_–[X¤¸ŸçGh¶þõ÷.çeÛò/ÎßÃY ü*º¯ÅÿWxr[”µ³Òî>ݨN©-¯›ÎÿÞo´è?}?†¹;?x§Tñ÷†bñÚ·õmfIíLJ嶕¡[fÉ~öØ··î¾}Ë·wËóV¾÷/ÂOÚ= žÓ/}cöwÓ×Sºðö‰£Þj:¥¬Z½ÜM+Å÷W¸‹ø¢þÙ»clfÛònì&IáOiSÿn[^'‘½ná‹ý.WdÚò¿ÏòïÿQóüßÅ\ïýâÓöK´Õ­üòÌ׺œ‘_Es‡Õå“d[WîýŸæ—æûþS*eÎûÇíÚ’\Ü¥‚ê:,ò—Š)l•"ò›tI½~M»à{öÖ‡ƒþÇgã'¹¹Õo¼7o,Q_j6ëÅþë{Û§ûÿê¿Ùß÷«ëYÕ~Å©F–Ísqa§@Éá÷ywÚÿª½÷Y—æ—åù¿{]Â_>Ûâ•£Eâ;mà‚Ââ(uâÐåW‹{üÿë|¤Þ¿ö×ýŠt ¯…Ÿ^ý£ml´¯iºÄ¿Ø·_è:ÌŠ¦ØŸs§Êÿwøô5ûÕÉx‡K–[S»Š;HRx­^+Ûžá¾O‘.‘ŸåÞˆÒ¿û[>w¯Dø£Ûëß´¦×…õ:h7Íýe/ÙßtHèŸ>ôùgûßìµp^-K›j¶ÖÐIm5×ÙbmBo’Þër$¿ºù>]ò¢ßÃóÕÊ RñTÍ5ߟ|°¥ÇÙü‹>/ž%mòï•>O™ÿÖÿÀÿï‹ßRð~?ö»jÓE§[Ûì…6Å`ûå²ÀWd»¿½+¯û¹:Ýõ†¤É,z<×^EÂË4»’uW}û—øYÛ÷¿îìþõvÿ´ÈœøKÂÑKwa4?ðŒÚ½´:wÎö±-ÅÇî§Ûÿ-w;ÊÍý×OøDøãáBÂ×ñO èUÅÆ“¥Þ­¼7?ºeØû%M»?zÿ6õÛÿ}ýêóË‹E™–MÑÍi¡¤.ËŒ­±×ýÿŸþøû•ë¿´g†àÑ4ï AuOÄŸKÝcw;K,û¢}÷[þ}ªûcü›>âýÚñÛËû™5]FêÙµ$¼¼K‰Ý6ì]Û·§ÜùÙñÊ* ÕðŠŸklÍq-Ö±k*iw ²[ø¶JîÛÿ…‘67üíÿ…Eð¿ko_+Ä;ÿ×Å]ðî§x>xÃv¥¥ÜÄúî,»ÛmÅÃ/Úßý”o½þËÕoÉ'øeÿ\üEÿ¥µáTÿꄾ(ÿ‹üÎÛÃiÿ®™÷w´[ßý­Ôû˜w¾ú–°ÐtËfûñZÄŸøåEss³}r–[øPŸñwì•~wh¢ÿÒ„¯ÝÚüøPûþ/ÙmoŸÊ‹ÿJ¿x)#§ç–“óèzÿÕ°ÿÙëÃ?a[¸ï¼#â§{³Jnl-|­ßóÊÉQ?ø¯ø{–ˆëý¡3}ÏøSVû=y—ìÙÏøÂUòæó[K•ž‘?{§Û¾Êôk_öñ¾Ñô5ƒýÏ»¿nÍ•Ôxm.­þš­r–&Æoãþýuzü~Û²2¦ÆMµÅö ÉɦžÏÇž=¾YÚÚÕÕºìoùkö‡ùëï_Ù†ñ¬/4}2æïRºM6ùmÒöáüÔÚ¯òy_;7Ýù¾ï÷ëàÛÏ ê÷ŒUGoõNÛÑ_rÿÀ«ã/ØX¿‡µ»9neÑ%‹Ãw©’‹¾ÞÂUtÿU»gË>Ä}›¿zÿí×Ô¶¯Š4ü ÑuÛ%[*éÞâÕï—ÊBÊé±Ý^'ù‹î×Ìþ'…o< {§ÅsÙåÐ%û-¢D»Ñ·ÛìÙû¤ýÒo}ÿwï§û ‘÷ˆ¥ü3¿gçÿ‹‘wû«ëËymn“ì–÷6Äÿ½ûé÷6n¯ÑOÅ©ÜüµkÉ-áýü Ó­³o¶üŸ{ø~_›ï|¿Ý¯€>h-áï‰Åy©ÿe?Øî]7o¾Ÿscü¨É½÷ü»+í¯ Üê3xîå¬dK‹[åK=NúW•/´lØë¿wÏþ«øWýêÚ1å¦sKÞ‘ä¾?ñ¶½sã}2ÇPÖ´k?éúé¾I¢Þ—±ª}ñoE‰“z:»¿ñ½|ÙñÂtøñqþ™êo«ZîM?ýU«E±|¨Ÿø¼¦O+þÙ·_lO¤j_ç½²Ò<1m¤ÝEâ&ŸQÖNŽÒ¤¾UÃJÒŽ6·Ê»7úø÷â.‰yÅ«ÝUtÈ´H¬å‚X¬Q÷¥’lùWþöÔù¿ÚßQ/{—”)ÿxû·áEäx/SŠÇWÔ&Ùs*i:òʒڮϼŽÛßÍþîÆÝó·ÎµàVÖƒø—Âö0ië©xsKÕ¥•nÿî•™ÝÓæùÚ®‚¶ñ·ÁÚgü%º=²5Ô_a¸–/´CýÈ™wîmûU·ÿ±þÝ(rÝÈøÏKð-„º5±Ð<%£¤­{Þ£Ü]JîË›æü«+üïümÿÔŸôï §‡ü5tíÁ¾žü5¢\Çòê7NÿºÝ»î»7Îßy¿ñúÎø±ðÃ%Óç×’X´ÿ7íhÖg–+Iç]ß½·Úÿò×~ÝŸwb/É÷+_âŸÂï üuðO†4]WIû"i·Mg{¯3D—.­·b:>í²ÿè+÷i{¼Â3>.]i¾ýªŸ-„M/›˳|»›dH»·nùj÷ÄOI௲Iëési*^j~#dŠ-T´¿r-϶%}í±¿ƒäù*¦—©iþ:ýŸü £j^*¸¼¾¸ðä3ØÝø^×t°*3¼êŒë¶/•[ý󺵇/+ˆÏ&𖃢Ùê’Ï èº_‰5;´^êßÙ1[ÛÛé³ìÿHû¯óJ›ÓÊß¹¾yk?ÂZV•yĺVŸ¦øžîÕn¥¾–Ò+x­4»Ýy¾RoÚÒ§È‘ÝõÒü5ø_àÿ„:ž¤š,·Û÷’Ûè<¿cºe]¾oðí·gÙ·î·›\‡ƒ>h? l"±±¶“R·¿–óR];IžvŠÖVò“͸mŸv/õ[åÜÿÇ\’ˆ‹¿4K?üZý %Óψ|Nëm¥Åk,NÑE»gÏæýÅÚ›?u¿øäâ«_|ko­|@´±ñÖ§`þ(³‰ô»×kùïµ<Ø¢¸Ø›¿>M¿½wù¾Jé¿d¯isOñîçÄÄÑ]m°[¨-WçEo±"Ü¿6äÿU^ão†:dßtËÉìäÿ@º–]&ß^Ýq¬l÷$I¶]¬±}ôwÜß:%vMrÓ$g­ ³ñZGˆ[O‡]–Õ­ìü!¦5»ï‰SçÙ.ÄþЉò®ä½\?í¢^?ćúv¦°C³Ä–Vëcá†ßötß÷"x‘îlÛü[·×£xÁ,í¼Q«c§ÅáëL¸µŸO»o7XX—{l·uàmÿí|ÿ~°|q5…—Åß„rÜYÍàÝ;þk;fçÏ–%O—ÍûÏüi÷Û®Zkš¤bQÖ|Ô/< sªèoÆ‘á]fîêãn¥:Ï,~RlûEÒ:îH¶·Þ¼Ïµ÷üÕãþnžþ·¿[›$Ñolî6øtN²¬_|^Vݨ¯³øW{ýǯuý­ô Å>5Ô–«©_K?Ú¬u©¾tIwEò+ªº:¼MüKü?Ýûëà7^ðý¿‚l´Ko³Mź¬Ûÿ²n¢ÿ[²Uß»ryR˽?¿·÷*´y\@»©i»þZ_iVz|:}ÄL‹«#E¾ëj"'ɳå]¿wþš¿Üª>}#ÁŸ±‡®'ÄëªÇªÞ\¥î×k–á6¬Jÿ'ð&ý‹óm}Û«¡±Ø|4x-´5K‹%DmZÿÑ"_³îò‘7¾ïùøßü,ûwÕ/ x’O~Â:f…Ä …š-BöÞ_iö©ö»Ti_Ê—æùÝÑ~á•¶íÙOËÍï ñKÏÄ–o¨O-´ñ&•ÒÛþé/`]ñ2<»SwÞß»øvy[îW[ð^Î_|^ð½¶Ÿm¤êWHÖeÓõæUHäÙöÔþ5ØŽíþÓŲ¹W°¶Iïg¹ûNùt˜¢—YÒYÒîwù%ØÏ·s¾õÿv/¿óÖÇ€a¶‡Æº|·Þ“ÄwYù¶ÐÎñK«|ˆèýÖ—ï7ÝÛå|õÌ/têþC¤x{ö·¹ƒÄ,ÕtK_[¾­áíîß"mùv£ü»>÷ûI÷«ÇüU«Ûj^ ñU–ŸsöølÖ$ߨ@‘DêÏýíÿÞØ©½þë½wŸߺϱÿà+üšñ—ݤWºÝ¦ø¢–¿uöyUåß[~þÄÙûß7÷*¯ÆIV]-ì'W—Nµy帕¿zÌÒÿ¤D¿q"o–-«üQµYGÜø€ôßÚkÅ<òøa,üe®xGÒìå}fÕÒâÎ_+ç‰7lùWï#ì_¾û]«Éµ‹È¬î¥Šå`wŸQØÉ§Äމ·fÿŸý›Sý÷¯@øÙâKÄ)᫟øJ¬u(­ml5m2ÛbmŠ'ù>]ëû¦ûÏ¿øþzó[Ë ßTýÒ¶šé|»í>iQѼߩ÷YþïÏEIs êü*Þg¯4Z‘y»_Òÿâm*K`íö’/âòŸçFÿeSå«¶‹¬xsà…â$ÐÝ^ëNŸÀÊ׫¾¸ý6+M+ÂW¶fÆîÒ÷ûb‚X§³§ÈþlMýíß"ïÿb» ì¿Ó~¬N»×XÕ­åO›÷Rýª&Ùÿ|Êÿ«§/ÝÔÿêƒíGüG_r›þfÿ¾?¹X—0ìWÝ[×î¿Ãÿ¬y‘v>êå(—àçü–m?soýÕ¿þ”%~ðWàÿÂ]©ñ†Ëj²~âßÿJ¿x)˜õ?9ôMI-´¿ÄêÛî¾ØD¿ì|’·þÉ^ÿñ…¡ð—Œâ•[þ?-_çþÝW¸:Amáÿ…SîT¸Ÿá­ª|í÷¶¤¿%yWì[âYø÷SÓ,²¬®¯­^+MÛü­¶ÿs}vTŸïåñê8S{í]¯þýt ²=¾æ_õ«óÿÀë¶|K·þùtjê4GÙqïïl_ø `h~lø{â¢ø3Ä¿à_6ª‹â+û‰î7ýÔi]"Oö~ï×Ö¼7s¢Zø~ÛPÓ$šáàFÿ–ò¿÷Õ>óïÚßû5|ñðNÚÖÿÅ¿´Ý´è·)ý‰¬Ë³nÿ»t쎟í%}{ðZ2çVÓÖu¾û?›jëöIÒ%uµOýzu«’§Ù;°ß Šß.`ƒöKð—Ú½ä6ë,¶sê7po•sþé‘öýý›w3 xÿö­Î•᛿ÛYÿmÚE ^\KwæÿÈF-ñ|è›ÿtÒª?ð|¾Wý÷ô_íC5÷…fÍ òybÑå°º—z\E¿rîÿU±73ÿèUòÿ‰/-¯< â‹™b–åï|1ª<÷Ö-û©ãÕ÷ۧϵ_÷[åÛ±éUþ71tÿ‡#àÿŠ¿ábø¾÷ÇV6Ú6‰¦/Ú´ÿ:ú6UvûDû~O–_5"úäõõu扦hŸ |Õþп»Õ. –{¹wÚOþ•å?ÞO)7ÿ½»ûµó'ìý¦Êž´ž o6@›n7lEót[T—zlù¼ß‘Sý­ÿð?ª/5]#[øU{gcâ ],åµûv™i}¡%[­É,_Ä¿ßÿ⫲qŸ>xÀ×Öß<[}gûë(¼io-öyxðÿe¢ì_ô]²ímþnÿ¶íDJó_øæÏûSUðvŸá=^mböùm`¾Ôeò¾ÔòÄì.ïºÒù¾k#ü˾½—ãG€ô‹›» 2óY×üU®éݽ֫µŸØ<‰ed—|©ó4±?î¶o_ùe÷ëÍìæ‚çÆZ­çÛ¤Ö"o[¼ºƒÅ³í[´Û6X“ø7üþVÏúe²ª_dˆŸQ|)Ò®/<3wªê[}®{«ôþÖÐd}’·•þ©¢ù¾TÙþ÷ÈŸ2ׂüEÑ'Ò¾$išÔ^3¶³»]ZÝàÓ´é|«}zV·‰Ý7ý×h–Õ·îUTÝòï¯|øBúF¦ê¶ÖútÞÖÚ÷Q]…Õ­'M¿wäÚ¿ÝÝò|­^7ㇾð€tÏ_Eÿ½„«u+¿‘+ÜYÏoûÔ‹ø¼ý޶ñ<_òÕRœ@¿à­+Uðß‹>iZÂÚ\ëVúÆ×±†éî4û/5®?zÎþl¯ÿÙöáþ?©¿i¿ ü!×55Ôu+KË ø°4h‘þÏ.ñ·ï®ÖSü[¿½÷káÏ Ø)Ò¿g-=­$Õ-ßV‚âßDy×íwJÒÊî÷íEÝ·ÊTûŸqëôÄÿü/à?\êÞ1ÔŸ‡c¾Ùö$Þš_‘%y¾jÞô"ÆbÿÂÀÕ[྿|ÚÛqqÒÚ¯Ú ‰‘?{pònMÌÏü5ê~ Ô'ºðΚ#õ+¡þúáv£üŸvÊçî¾(øFÿÁzF·6¡ ΫÏnštvéóOæÿªÿ¾«wR»–[X¡[%¼ŠY%‰4µÂ;ü¯÷ŸmD½à<_à5ÃZ|9†úææÎÆÒ]nñ×R°ù®<ÖvßÍŸÞù‹åJæþøšæ~5³ÿ„—Y{u¼Ý|—¨¨²ìMïoò;|îéµø7ìþ µû8k©u¥¸4øEYõø™ÞÞ,ñ4[?‹ý´ß³çÛ÷ÿн Fñž‰wâ øt;ØÛ]·Ôž-CTÔ·y Q>}‹¿øw¢À«¦R÷€ùÃEñljâý§üu¡øGP×M¥–±k-Ô:œ-¤VsÜ"Þ½«lÜÒÿsðù»+Ю ¹½ý¡<sŸ¢ÜK¦­¬WLé5Å®ÿô‰]6}íè›k ðÇÆïêß|Cà¿jN|u§]¼º¶§ylò@«ó®ä]ÿ2«²EþÎúñß=ÕÏǯ‡òËáyõ]>WÕ%–ãí‘#ÝOûÝ—Ÿôï±Ñ>›ø)ÿˆƒoâÒxÆå^óJk½{DѾËå}…m^âÊážT»H’—j'ÙÕ~ónßþÝfþØþ%Ðì>ü?¿:׊¯µ”×ŪÉáØÓz¤¿~-Ž»~êm_âݺ»ÏŠ_¼-ð§@ðþ«ñ]a¦ù¬–Ú~Ž’ªE++mIY>fÚŸ3}ߟþY_¾0xGáFà­OâV®×·WÚéÖZ Kû†þ•ÓïyHû¿‡ïÿDyŠ9‰uð£ì>%¹KËÛ‹Ë}EîÊ´³²[Ÿèï³ïù[vµ¿{Ö.Ÿkãù¿gßÂ¥iv-þÅÓ–Í-FÉ›÷¿jݳoî·»íßZ_´ö©â/xJÒ$Ô­5]cû:U³±±‹Ê‹Ku•Íwo¼Ñ|ŸÝÝ¿äJÀø ªê¾ø7áÝCÃö2xz[] +¹_sK.¤í±S쨯÷®fïvìùÒâIÈþË*ÑüCŠ4¨Þ%æ­}‡ÄZ°Ñâ¹¼·ûF­IpòÅåyVïþÎÖ—ñoDþý{GÃïøw✺ü^×¢šîÅ¥µÕn5iåD¿—ï´KýÏ7ÊwÞ¿/î¶×)àÿé^9ð·yðúñ®tÿ´µ®£ý¦Ò»Î˱ßc·ðËþµÿ‡äO’±‘EÙ3]»±ñ'ÆËm>ûM°µ»Óô¹¾Ã¨.ég‹gÈëü *#îo‘þw®êˆ¿<}á­?â-®¯sªßË:O}n»ííl÷£[ù»¢ùš'O7wËòýÕ—ö{šwñ§Å†³Ò­µˆž×KíæÙq·Ü¸Dûß½ûî›×þ÷k¶ø‹ñH°ñƉáýW\“ÆÚ•åÃZhúõ¼lñm_•þMïµ|ÖÙ·çm©ü´¹y}ãÈ»ñ#ºu·Ä‹FÐôÍfÎËûÍ—^Õ·'Ø¥wŠ_²ìýë|èïþËîÙ²¼³â¥Êé_|y¥Os`ñxŠÍ×VÖYþu[‡òžTù>çÎÏþúW¤x·Ä–Ú'Žt­+í7>'Ö<†»‹Ä6ð?Ùíbmêžnçû®ûÓþ÷ëȾ-_´Þ*ðo‘<~!¾¼Ö¬Ýžá6Z\/ÚÊþ÷ßÙµ¿ÙOø cö¤z×í;¢|PÕ¼_âO¥Å¶¥ðò+[«{ëoÇ´Ý]lmžSª¾Ù_÷M÷þ_Ÿïÿ”^¼º÷Â4Ô%Ñum£Ü%æ™ ùWu,»Óc¤_+:$¯³ÿþÿ©üDøƒyá›=jÖiGЦû}Ö§ Ø»lŠ(ŸsÊŸ?ÍóýÄÚ¿öËø<æßÅZUÿÃñßK6…ý•tÒØº?ÚöïtÞ¿?ÝÞÉÿ³¿ç«—/Ù"!sgfŸ m`Ô¦ytä—û2o‘-~ã§ð|Íæï•ßû¿ÁUþ§Œõ¿ÙOÒ<9k¢]]EªêO§\CíBÞ_ùk½~••ÙWgñ4_z¢¿ñ ê¾ÓÖ[ÉOþÌYmtä_ô¸·:*;üÿÆÏå×-ÿ?÷¹O…Ú®§á¿«éš zÇŸyåjÖ÷^SÝ'›ó£ýÍ­Çd}ÿòÉ>çñ`YÉ^Yêˆu‹khž-û: ·yIöyn™íÒTTX·ÔOï+ìE©t{hÅ÷m_Ÿæ_áÛýÚÅ×aÔ~ݨŨÁomgäÚ¥¤12}¯Ëò¾ô¿ðgööÓ<1¥Û'ưþÓXH´öW·Y6›wù~xþvØß"ÿ÷kKÄW—w:Ž¥}ªZ_Yéö@–×ÑNß¿óWø?»æ·ï_g÷Ú  OEkmßÚõ&x|ø›ìú|[vüòűŸø›ÊE}ÿóÕßû•_ãªxq,äžåæ‹Ê³ÊËû§ØûÓþ¹&ôÙþÓËV¼CxÖvZ„·Ó¶•§ý©<)ßæGdwEû¿?ïÊVwÆ ‡Ôt±s=âM4QAoQnÿG_þÏÿþÿñ3ÔŒë>(ÿlìÓî^ÇF°uK¼xY>Î˱¼¯½ón}ŽÍþÎÊä¯`XÚÚ{I¼›G¹_µ»§ïU6þé[ý§_™ÿàÑø§í¶ÚM¥Ž›á÷°†þX-çÓÒçäUmÿuþîÇÙÿ¾jÅ[©c‘­4‡“ìSOå\Ü\;*ºmVO½ü2ýÿîü´HEîÆÇIµ½Šîh­þØÈÆVûߺo¼ŸÃ*ýÿ“wÍPxÅ7Úfµà(ÄÂ};MÔg¿ŠÝ×î;Ü*Ëó}ÿ™b‹þùÿz¬Øê6Ú¾ˆ–¶7‘}Š[õyÒùÛ{þëç›ûŸ{þYÞ¹ÒïÁ¶3ù–n—7ŸlÕ>÷ú+2mù?‡fÙïïû4{Íâ*4«ó|¿v³&FûßÁQ?Œ4‰“wö…§ÍýÉj”Þ$Ò6ÈBÛþþÐׄWøÉd¿ôÂßÿJ¿vëð“àÌÑ_üW²¹¶eš%‚Þ&tmèö„ù+÷n›9×Å#à[Ù‡Äþ|×´mnÃGþÍð……¿úF÷wo™ÿ~ïÝ®ZÏþ …⯠xyí¼3ã¦ÑïZT—b_J–ûÿ¾X·WÖ¿²æïøfÏ…¿ö-Ùèªõ?š¶Ä_â*1>Ó?àž,ŠÕóâ^»s6Í®ñj{wû?º­?ø`"íÿ…‘âmŸöÿíUöƒ¥9>çÞ®bÏ.c‹„¿ ü{«ÚŸ?X—ÃwñOªKx»š&‰ÙþT‰?Q·Vû¸'ÔôÙ¡<÷ =¬¯qåy^S}÷_î}åOöÞ¾®øÇ&σ~?feMºÿÏÿnï_,ü=Õb‡[ÑâŸP¶MBÞ{)[bÿ£ÙĶñ°ŸsÿAzÎ_Nü4¾#Ñÿo}¨ü"µƒMBÓ\\lVŽM³ï<¿ëbÛ³fï½_x‡RoøWÞ%Š}V}6î×B½‰´ïõ©nëok¿~é_æ‹þL?ûlÿg~ݰ´ÓDð^Ü"_3°±—Ê,ßßWÞ¿*}毵é™>kc¹´ò¿±o"ŠÆû绵]–î‘\;oÜÉó³?ûq±XËâ |ÞÎFÁi¬ÿá·YàÔ.]¢·²Z2ì}º-¯ñïûÑ}äþó=}72xáçð¼šÛëÓ­Õ‹èv;ÞÎ&5åw—øSzoÿ¾kæ/ƒ:«i¾´‹þô«wŠÕÚx™åfþÈ·d¸ÿê¾û³²½—Å¿5YµOj¾%ŠÛÃV—­K¤Ao-ÓùºÌKò|þRn‹cÿßU´¥ÉÊsçÇ xÇ[ý ’ÓYÔ?±î5NÎ÷NÔtøåÔ­b·Ýö{¯6´K·kÿ~Wûßz¸Øf¹¹ñ~½º{k›¸¼yk¹-×}½»®•/ÈŸìÛìÿ}ž¾ªý¡þÿmøßGñz½³ÙE-•Æ£o¦ZýªáV$D‰ÿº«ºVùÿºõò~ˆ’ÙøP‚+h´ßø­ì<­>Þ_õ ý•+E¿û'›þãÑËíÚ<+­ø‡Á:߇-´ ëz¬^!Õ¯â5›¤D³FtI]w;·ðoÞŸßuMŸÇçŸ|-â;‰¾´»ðúZ6—löM¨³·Ú,¢EIUÿÖþ÷fçºW}ß?ÉüÑøcâuž•ñsÀRÏçøÏìúµå¬ÖŸ#Ùù®›üÔTO™÷Êû«Û?h‡ÐxÇãì~(,°?†tw¸yo¾[v_î.äŸæÝ»åùhçrŸ-߽φ4ßÙþ[ïíHa}vÏÍ»H%‹VÔ[|»åDßæª¢Ëò5Å}Éâ_ Gñ7á5Α$újYjš‚«jsXÅ{,¯¿þx7ÊϿ䯎þ=ø·H¼ñÂÏi7/¥K­ZÅÿ >¢ÛÞ-ÞjÄ‘#'Ý‹{ÊÿöËïÿ¹|ZÕõ}3ösÕuÂ׺ö¿g¨D±Ocu-ºüŽŸê™]ä_î}í­þÕwSø}â%ñÓ¤|(ÓtŸ®•~cU—RG’ðÙ§˜ÓĪ‘}žÞ±/î“j k}“RÑ4[¦Ôõ ëÍ5o¥û2ZE³PÛå2m‰Wæù›{~¼Äþ:ø™á_Ù¦÷Äö~»¿ñMÍÍ«ù tÞm„OE, .ýìÑ|é½>oŸûûëcàýï‹­´­[Äž,Ö$Ðtë–·u½•YßC•mv\Z«K½eE“÷÷ïÞõ¯ ÌÏÙÒçÃN^ÓÂúÆ£âk}å-¾º™µ–]Ÿ:#}ßÝlùöÍÕß|9ðž‰âkùáòoÙµ?³Ç¤Çf±ZÚ¤Iòn¸ÿ–»ûßì|Ÿ"W~ÇÚ«ê¶Ó@\j‘&¡¼š!E[†]Ÿ#ÄÉüìûCïþçü¶þMã+ö‰ñŸ‡/<­¿†¢¼þÜšŒ²ÿkJ»å–ÿ)wüÎî›Õ|ÿ}ê~!â€þñ‡Î¸±A5íÖ¿k{}e ¬V¶òËfï*¥ÅÒ¦ébþò¾ÿŸex·Äë?Jøûðý®u}£ý=%†ÆVû<[wìtOºÑ">É_îýýõ4w>?ñÇßè¶z¥áûC­ZÏk"]Oq§Ün–×Êóv@²ªÊò´[vìùÛçùù?ŠúÄV~é ¯EgòÝ¢\mýӳ˲'þ-·oÎû¾_öiȓڼOá/|EþÀ¾ñV–~j¥½­ß‘ì·²½»Ënèë­v½·øþýt¾>Ðôÿø[Ã6µ †ˆÖ²¶¥¦2YÛßË-Â;²nŠT}¿Äϳæÿj¼—ö‰ÑüEiáÏ øÏGѤñ ¥Õ­½ºO-“µêËp·ªÉ*²,¨è›>îÅûŸsfïÅû+ÂÿîtÏ]Þ]Åy+jz·ß–YQÕ??q/ο?ʨ‰ò}Ê¿x®S˜ý¡4¯øA¾¯‘fºU½®˜×QE¤Ýy·×RµÆä–áönþ6ywîO+†øA7‡õÿÙîçCÕì¯5t,ù7³ý–îÚX¶ì–ÂWùÿ÷K÷v£lù+£øÌ÷ß¾ý»Wóo±µëk7ÏóßÅ-ï›[å_5QøÕ'Ü®wöyð&½ñGà\ºG…uÄ›XŽÆÂX54Ýö;Èx¼ÔDûŒÈŸºÿk{îÝJœ¥ÌDMøw¥økÁ·ZûizN—â{ë—–æÆîÚ Vf•׿‰"ûÌžWÊíómß\U‡„´Ï ê:ŸöWØuX¯.§– I­mô×·yv;ìDùY¿tŽ’ü­µöïùëWö^Ò¼Q¯éÞ0ƒZðí…¾ª´V6¬K¾-߯»¥û©÷USåýïÊ•ç¿SÅøÄ ¯xbm6ÊÏZ•%ÓÒæYn-÷lÙ*ÊÌß*|é·îíþ™H³‰ø2ö6¼{=Ìsß˶V¡n¿èé/ñ¦Ïâ‚_àùv'ðWg£øJÇÂW·³éZzéZeƱ-ůØQ¥±ŠYeFwGdýÒùIå,O^cðÅÚçã?‹m¥¼ûÜ·VÿgFÙiý×·•ÿ¼Ÿu7¿÷þýwž øQã¿‚<'¥;Xxª GQººÔ.ïgDÙûÑâÚû|§Dݳæÿ€Òæ‘'Yãûý_Æ~-²×/§‚ÂÞ(¥·þÉÐàÿA¿ÜîïæîMÊÎÛþGþ?û漟ãÄÖwú·‡^¼mWS–òÎ[FMù²Ü~÷ÍvDûéò¯ñnOîüÕè$Ñ5 7âÖŸrñhVê·_êYeß¿òÊÝÕö¬IÏ÷¾}û_æ¯øîëe¬ø)e·M"Ý5UÿFÓe¸‹l¿½Ù³wügñÿµXŠG¢x‚×O¸Ô#û…ºæuº-¯ÍË{¦$Kqµ>eÚȨÍòüÛ›gúßâÃ&MGÃv!cHÒÒÚñWÄ ¯ö«h™þx]YvË÷62ýçû¿ÞYø}{ªévÞ9´Ö>Ýך\SD`º•¼ÖDºMû¾dûÛ×gÉüv±%Òµm_ÀÚN«tl¥.yjúbÎe<Ϲծ>¹µ]¿º²ÿi ‰³©<¶ßef¾ŠÎ$ƒ÷ºŽÏÞÝ&Ï)þú|¿'ú:'÷·¶Êò/ éºV±ð·S±M+W›Ík§_ßíK¥Y~]Ÿk'Êíò.í÷ÿ‡Ñu)•ü%²Ám º#¤³y¨Öÿ,Iû¨“ÝDÙþÏšÿ~¼çá~œÄÙö¯ŸåùÙ÷íù¶}ï’ uæ[o‹+Ì·óÄ©-Ý4öØö¿q|©_äVDû¯¿ä§\é¶i©x®Wi,ÒuŠYe¾Øöò·ð$I³ûûé’=Asy|]‹Í¾{%ÓÑ"t]Í*2.Ô—ý·_½÷>oî֭ͽ͆¥¯™o濎X"šÚ;è쪋º&ò›ÍóÎÔ¬"K;Û–Š-5Þâí·ù²«ÊÛÿÙùÛþùDÿnª|ZY%Ð$ÚÒÝ X¶#+¼»wìÿ¶»]ÛýÊÖñ¶¡a§n±Òç¾½}C|ZįRÅóÄÉoÛµ~h¾OáGÿ€b|Sò¤Ð¯;v‘–x®à:º>ÇUþómo“øv}Ú€â 5{=5¢¶Õ&u¹‰¾Ï,ÿéßsæþ/îmÿqþíFÚt·zÅÌÐ4’Yê,ëóm‰Ý¶+2/ñ³þÊ}껨ÛÿhøzËS¶Öu)â‚ò&–kx¾v_»ûßîìgDO“æß÷…Ò®u$Ôf‚KÝ>Âûì÷V–’íÙ¹Wïüßut_ÝÿgûÀPÙÉs§¥­¬v—oý§æÆùUò¾_ýï3mþ•ú5ðwþ ÷ð—âÂ?x†ù|B÷–—ë¥ÜˆžT²¦év£Eò®ýοì×ç&.n`Ò?´¡i®§¼–Þ(¢•Ûø>Dvß÷_5~ÊþÏ|mðáü?tKˈ´+X¥yn ‰ÑÖ$MŽŸì}Ïø"Gaÿèø7¥ZùK§Üܦæ}÷m¯ÿ¢«JÛöø?f®¿ðŽ[?ývµ‰ÿöJögø£àÏúôOü‹ÿ‹ªïñ/ÁŸô6hßø¿ü]_(sHòÍ+ö<øsá+ygÑm¥ÒžÝZëýQ7ºüß?É_eb¾zÔ¾+ø3û'Pkoi7’µ¬©Q]+»»&ÄM‹_Bæ¢[”ÌÍG⿌| ð×àŒ^×ç±Óçð5ƒOnû¦v—ÊóÞMÿøíy÷ÃÏŽÿ´wÇO ›ÿø’Ú-©y<·N¿{jofVù*׌.Yþü‰vÿÉ>Òßÿ* X°¿†WÅ_uí?ífK_é:¦å‹ÎÝöimî¶lÿkÈÛÿþ*ÎU\±5ù¾ÉëbiS£¡?æææ=Âãö½³ßø²Úóý·º‰?ô­í_ÚïgËâ]=6ÓÒ|ÿøåz×Ãÿ†ÝøoÂIoym~¾ºŸP[»è™.'ÝÔ^kl—æ¹o´3K+nIYåmˆÌ›;JåÃãðø™JjsJ6üu_yãÓ”jSj~ôeðŸ'|6ý Òþ%Ó4ø¬íá"Óž-:¯.Õ‰>{þÿÝ}ÿìÀ¾tý’&_øT¿´ZË»göÂlFùÛýoÜÿj½¯Ã³ÆZJÅcs <ý­ÙÝî·"oþUÞ¿wçûÉ]rø¢wáwý»îþÅðšûmÝ„±Þ6Õ±m†þVV‹åoâùëã£\ü2ÔÖX"ÕSû&W‚ùÛ÷·[¢µØ’¿šû¼×ß¿þ½ÿàOö_íËmöÏ„ºm³^ÛÚ#ÞÉý¹£UÚw¬»7üÿÝù~ö+⟼V õ6®awÓ®¢–îß䴸ݪº[üŸò×j"¹/ÝþeñOør/|KïøEb–ÚóF°ýÔéÛ<ÔfÑmö"#?Ý•þGÿe+è/‹7>Ö,<uø_JMý%dvGv–}þoúÖM²ºÿ}|ëðfÚY¼?dxz-Vã챤JͱU´+5?»ûߺ¿íV—ïìü[ ÜE}¤Oã8¢Õ™6iŒÉ³l»6#ìù·¦Äù?¸õrÂsû@øŸ^KÏêþ³4Ë‹­;÷7löéçØŽžk¦ævß¿ýÏã¯)ÐR+oëU´öOã[9Wí;âT—J¸Ùæÿµq¿æß÷|ׯkñ'Áo'Ãá3ÑW[½µºþÐЭ>Ô©*¬RÄȉ»î³ÿ¹÷~Zð}ÖóĺíÔWÓêHÞ2µ•µ…ô­ÚEÇ›*'Éò¿Ï徕1ŒcîzÅŸŠ¼9 ø×ÃW>(¾¥áýCÄÙ:„§‡í¶=•¾í¾Rÿ¿óù¬ÿý…|e⤳Öüð—LÓ{Í)uÔ¸±Ðn×cË›q½î“øöyHü(ÿð¸fÓãñoÃ+ ÜëúÅ…¾©}‘¥hÒýŸQUÿž­;7˹¿àV»éü$}£?Ŵ燴‚·aѵ/ê0Meyÿ“Aû­.YÑZ(¥UO•Ñ]]¿ß_ökÃßí>$hÖòéWÛm~îÒÞÓVñ&±|‚ïIów˨ù:Ûµä¿sç_Ÿoýôõй—7)á߲߸Gµ ¦¼ÿ‰U½ÌRÏ«ZKºö×r#Ëoÿ¶ÿ"ìûˆŸð*ô~Ѻ¥ñÄ?¬´«ÿYX^E{'Šm V»ÕWM‘DÿÄÏæ¦ß¿¹öyoì+¦Ïá½/SÔÎ=íõ¥ÿ„‡w›oR¦íïñ6Çù7ÿ}ÿÛ¯oðϬ_Å7>,ƒÄZ¥£ÿll–÷PL³Û÷ÖËþY2ïØÿM_ïVEœü_´.‹sñ;Åž“M¾ðNáÛ´žëÅûbŠ]RY_o”’²ýù^X¶ÿ°òדxÚw¹øóà¨Wìw:¸º‰t˹^ê)YþÑþÏï[o•ýÕÿz½ãÄÿ´k¿Ë«Ü뚇ööšÜ^M¬^=ÆŸg,R¬±^ÛÙoýÓ$ª±+ü«û×ûõó‹t¥¿ý¤|9rºDšÅ¢_4Sù-²YëÝ?é—Α>ÿãù?½L‰Çñ—âÀ‰,/¯ôKÿø _4W:2ÅÅb³ù¨n›>Oónmÿíoè¼Câ×Ñ4=S[SÇ:…×Û"OµÁ[Û¦öóR×äûÛt¿y·#üÿß‹Ç:xñ•Õ–›â .l5Y`±þƹûÝ‚Á,²Ån÷oïö&æÚûw3ýÏîËâ« ŸxKLѧñUõÍÄ ;ÙÅ£_=”Ú\«÷þ}éæìM›b¼ÌûSû•ýÒÏ,øë¥kò¥Ö›XFYlµ=Nâ]–‘~õÒáoÝû¾T_3mh¥¬_‚׋¢|ÓõíVæ (–+[NÒx¢óoY"û1EñwÚ–«sáù<-¨oýž ¹Ub•–$E}ñ*|ßòÉ?Ù}•è^ð俵o®•â]gÃrê7V±Aý£sý©§Îò¯ïQ¥Ýµ‡åþصÆÿÂgðãJÖ´»{P¼½¸Ö’ÞÖûQŸíöòÄÈtŸmÝòodO‘‰>ãQ"øòßü]Ö ±X኱íÓ/›÷²À©üoÿ=Q~ÿÉ÷ž½vçãFŸ­üAðΕðóHÕüOàKýE¾Ò×lÿèsü¿+nMËò·Ë¿ø_ä¯ýœ¬þÓñ³Pò´ÙŠ[§ÔåÖg}–³¬¯¨›“syNŸÜ’¾|øäñYëÞeŠ})ín¢Š]FûsºJ²¿ÈˆßÃßÿ×¾êº'ü$ž/ðæµsss­ëÿjK[w¼D¸b7î/ûo±ßgü¾}øÌës«øJæÙ¥¼¸ûT¯®Ù>ÎÏæ¾Äù‹ä}ÿìì¬$3º×|aÿÿö-œWÍâ››«¨ô«F—v£nÚ«òmV—kÀWåÝUSÅ¿cðæžßÙ—°ø–ëEºº‹Ã{™~ÐÛßð}íÿ½Ù÷¾M»)ž$Ҵš,ÚU–›pÚUÖûtž$»h7Êò¼O÷—æÿПñÔWš=²xfÊÎåc³±þʺ–+D–$¸‚&ŸÊ—ï*îTÿgÊOž¢Wñ$ÓÜøVâ]VÎ_í+­vhɽ"VØ·vÝ»“cÜy«€øQy,|E»Z°·µµŠy[íÕíw6ÍÌʯþ·î{÷¿&ïàím‹»þûûë÷j”Ú¤u½¬ÚÍï'o"+%Ù/ʈ›>çü¾ïÍüoZ–+sàÝ> ¸,4Û¿¶Aäouxž_¹üOòü›Ûîry£Ùé´ò]2xzïíËö³2\ ü›üߗô‹o}ôzEíòÿfÄÓËû«O6W؈ñ2íM¿.Åÿ¾ê¯…tKûŸx7LŠäÙÁ¯^JèöóÄžo•¹ÿÜò™öÔ’iØòØÚßDÖÈ×Wì…¼Ô•6mýÓïþÿÇž¶>®ÏüÜ­½|ÿý*¸¢¿1´~ †ÃSx7/еÔßýûǨžmrÍuâÍu¿ééëwÉkh‘gÜŸ-e\¿þ9D¡É/xǘëþx«UÛè÷:Œ÷èÂÍqóº~õgûµû™šüø Œÿ¾öÏÜEóÿÛÂWï-K1ê~JêPÅ©xSàeœìɾѢ—Ê—cìmI?økñvÞ´Ñ›Ãñë¾ÓÞÏ[¿¼µÑ5_±5âYÙyñ|È›WvßâGûõ¹3ÿÅ3ð+þÄ=ÿNIYÿãûRè¶FâÞÙ§Ó|OaÚ®¢·‹Ï—Mò‘ZWeEÞÌ‹óµ|Ô[þÓ«/ï~‡èõä¿°éG—ìËÿK<{À_µŽ‰â?Ùiþ$ñÄ_ 貆7Çü&rÞyQÙt¶[Ÿsí_øS³øµñþÖ[›oøšæÞ(¾Ñ,ÐêÓº$[Ñ7¿Ï÷wº/ü +Ï|û.k!ñ]•‡‰µÿxSD—Ìóõƒ¯i·‚ßj3/îRësnm«ÿ¯Eð—Ãßé^»¶Ò¼®Þiš¾¯Ú?²g}öþlWèê›å’|ÿÝzú’ٴؗà·öÚGˆ-µ Ë›k¹u©w}ž]›`Ù·zµûÙR¾¶¼Óõ_ ø Ä«þ—WÒ_ÏÕ¯™^Òáâ•%}ϹVßï'÷™þùî÷óéºö«å3Çäéÿ½}—¦ÙÛxÿà‚´ûÉnu/ô;‹VÑ¥–X­`¸‰ÑÒ_+åÙ¿|»?¿ÿMãËËÌG4Zýª¿kŸ x¶Ë^ðƒ¢ÇâMcA‰µ'»Ô#‹ìÚÝ]Èû¾]‹.ÿûãexãõ¿Õ5 jþn›ek¤ù·:M½ª%½”²¤^j[Ë¿ky_&Ï“þZËó·ñE©i¶Ðëvð[i 6”š‡›á‰›íÉûßÝK¿fæŠ&ûé¿î¢}ßáõŒvxoöañ/„,t=-<9’A©Ã}ö‹½¾j|’¦Ï—î=D£ö‚5eðÄóO‡·žO§‡­¢Õ5[O²¾¡¼[nÛ{ˆ¥Þÿ'ü{ÅO}íûë¾ñ'ïëÞ}WWž =Âþ"K©tŸ Ï›,RÜm؈»›çFÞï»ï×Ïÿ³f½³Å³A=õõŸÚ7n¸Ó•ÞUò­åtû»þTwÜÿõýÚûKá£øÂZî««éM¥i÷ŸmŸYIQÞÕVWù/î¿È‰¿ûï³uóoÆ_ŽºŸ„üMáMWÄK¥YKyk°éŒ÷_ÚQy[^+Û6|›vìÝóoûÕä>*™|ã}oÅŸˆ´®ìõg½ºÓ4õÿBdŠÝ-ÿuóýè¾+þ¹Wqâ}Ú¯Ãoµîÿ…zú6­²+‹è?ãê(.¾ü¿Å·c¿÷~úÏ_;üWÖ.l>/ëRØÁ`‹,QE§BÛÒ×÷I²ßýäûþÖú´Ó m¼O¢j*±Ô,´×Ñ59n¿°|Cæý¹¢ýÓ¿ÙzËò¯þ?Þ¯ÜOâ«ñ/^ÔïÚÛGºŠê/í›æt–×÷^oš›¶nd_Þ«ìûß/ûÝ—Á\ÓAü'2êWoy ¬Wv$RïGdOâ—ø¿zŸ#ÿ/ªÙéþ6²ËfÚ÷ü"Zû¢êÞoϧ'Úe»£lm¶ûÑŸäÿT‰óÕËÝ ó‰&¡à‡ß ´‰õÆÖ>ËâImÚú'inõFYeG•{í‰þ_›þZ¿Üþ/©~ Úx‹^ýœõKÏ¡¦§¨êñYÜjj²Ë~ϵ%+cü¯ò¬[·WË^?Õtûo x WÓ5ïôGñÛ¯ˆ^-³Í¸H¢Š-Ÿv-îïýïÝWÓz®¡âï|ñ‹¼+áû={Åv…¾ÛÛ¹Ù-íÛÊ‹ýßs§ÉüßÃ½Ûøÿ‹ja"î£á_‹³n§¥hz®“£xÂÿQµIo.Õ?Ò'ò¢Šá"‹Êm±K÷U67ñ|ª®»0¼1à½{Àžñ}Ƶ%ì)wv‘_Em"o½ºŠÁVãìP"$°Dû>ÿð|¨•±ÿ £ÅV¿óÿ•uŸxÿWý |W}%ö›áùuûÓNE²û,±J¯þ•;Eóĉ½YÍݽ>Eþñ&«³öŽðoÛ5]KìP^~õ,Qßû;ÊÝl_âh—vÿ÷ÿ‹ø}CÄüCiñ^Óô‹ÊoÞ³»Jòìݵ>úÿ¾4Zø³QøQà;/ êz.ƒ6Ÿ­´×>ž÷ý•w6ùvÄÿ7ñ¿ûëûßïóѬµNËs¬j÷žTW–w— ¹eyWæfV‹fåÛð7ðEñ[_ñ¿€üá_Áš>=ö©©ý’KZ÷ìéuùWçýꫳ²?ÞþOÝwO„'ö°¹ðÛOìÍOì~lOqkoouö‹¹[íËR¾ÏùwÞîß{ýj|íü]ìÍá]?Çÿ³µ×†bÕå¶–Y⸿Ñõû=½äQ}žTŠ)]æ•âûŸÝ]¿%pÿ¼g>OÁ§ì´·¼óZîû÷W‰ãùHÎÿ½–[ywýß•ä_àÛø9ã”ðßì—o>¡x¾'ðÕ­ôV·Ze½›½öŒò¼H—êèÍó¢"ÿÀþõeˆ£¸ø¥xÏÁö´?êúÚ/õ=ðh7sEÔM¾WOõ_+?ɳÿC® žñŸ…t½KEñ]ݵޱeâoì_²ÚKlu}žR&ä›ûß3|ÿ?Ë{Àž/ñ>±¤øÂóÆZ]”öÚ6¹üK,®|û¿+ÍÛæÄÛ÷n‰Ýw½÷>Zä|7ñ/Äzdž×Cñ´ÅI-ÒØé’ù³yQlWÿHó~_šTMŸy¾“䣛˜“—ýš^-cö‚Ô'Ô%Ôµ‰^xŸûOFÞæìÝæì_›ÈÝóýϸ¿r½_Wø)â |Gð¾±mã//ÃQø’Yoµ=)å½ûw›²W•÷~÷ÍÛ½î²W’þÍšÇü#ß´·ys­7†î-ÿF‹íûÕ?ã×gÝò·ìOŸøwüõÕè5‰_¼¨[3Àú~¹¨N·Ë¬4QK-ÆäßulùÕ¿Øþ?÷(æåˆ¢uþ'Ñõ ω>¹&½¨^iOöÍ©o±EtÛݼÛâÝûÔ_ö<¯‘ëÁ~9y÷‘x?íŒ×’Åu¿öf݈‹½þwÝüRÿ·ýÏ÷+Ñm¼msmâÝ*(5 / ZZ¶£oýoOw«Ëº;ÅýÕ}‰³ý­õåÿ¦ƒûÁQAVz|WŽŸd´ÿ[q/šþmÆý‰»û‹÷~ãÖž³­|&Ðï¼?eâÍ9¤Ñ5ˆ4{«KfÔ^VÔàm­²ábo•àÚÒªºn}û6WšF«7ì·j“\êPh÷¶M¬÷•“s|ˆûÛfæýïÍ»æ¥Õt­y5Ÿê÷/s5”K^m¼OöK Ucÿ"|Ÿ'üõª·ú“iZ5ì÷–Þu¼e—Øôý±<¨Íå2y¿&ÝßÇýÝ®Ÿ'ܧjºÅçö§ˆ,g¹´‡LµûÅ®ƒhËöxblySø•ÿtû”qº“½ÏÆ=×1Ë©Oo†ßþ]]6'”¿ìÅ·gËýÚé|A¥ 3SñÔ“i±Ý´MtÒy³OòÊÿwgîþuóݸ?Ú¬ bæ4øêíyæèé¶-Öúz§ú/È›boáù>ëîþ-ÕÕ_øŽñWŒÆúöæÉn–ÖóX{X¢yb—Íß·{|ûÛgßÿ–Hõ7Å:F¥ÿõ¬]îŸodo¿´¿âY›} MºWyvE¹]7nûß'Ê»¾åqŸïîÏ…®,ßm¤WÊ‘Dßññ/É»kÿfÿ½ýæ®×R×o´ý.Ò{í´[vÔî¬'ÖQ¢K»Õwmé*où¾e}»Ñ~Zá~$]­×ƒ.…½´>Rjj¯}*¤Ý3#ºïÿkûÿöÊœ†kI¤-LJü;*hÌÏm©D+‰uöþïÝmû7wdU=…»[{Üêk¨ËjÉ}oòš%o‘vmùÙ_ýÝûŠ£“S± øoOˆê7Ó\êj¯i4λ6lùþö÷o—ûÛQÿ†®[j[ï.ìm¬àÕnïe–Yÿµ–'{yWfýò}÷÷¶¥šÒâÕÑ/›½ÿ‡äÿ¾«ï»Ÿ‡SÜü+ø[áír(4Ø"Ó®­å»²E¸»[Ý5Ã:·ßÞ©±Ú‹þùÚ>í2 ×´¨¼Cu¥Ká[Ë»m3V±³Š-[Íß©¤«,In’§›óoMŠÛÓø?‹Íí¿´‡¬ü7ûRý˜ì/,ö‰ÑÙÝYŸþZÿªEòWÎÿ´ß'ã…Ŧ™¥_y/=«Ábíþ›,L‰³wý5—ïÿÀëéÏŠ^Ó¼àï ÜÚGyñ,.ìüõ–å x™RT]»™‘þDÛÿL¿†¼ÇƺƫüQðVŸ¢N÷Zí¾«qq}¨][l{ø¥ò™%þèÛ%ò¿»¹*9y‚'¼x='Ö"ðR´ÿfŠ-Z_*ïÃ=Ä[mÓbJêîʱ7ÈÏü_'οÇÃèŸnðóéšf Ú{ë!¼½»m;FÿUtí¿ä¸v¼þSÅ*|ÛV½ Ã+áZK©Ë€î%×eH¥±Û,WޱEåDû“ýŸø¿uòy<ÚÃMíÆŸ¬e¬b¸ñEýÅæ™xŸ>¢·RËË4HËæ®ÔDþ÷ñQ 8mVÎ/øVŸ í§³ŠÏP°×^)Q%ÿA°ýíÃ$_}÷K+'ÍþÌI_céZO†¾$|=¸ðޱ¦5ý¼÷Övóé7½¾™e¶(¼¤–U_žX·ooöY>Uþ’>*h:V›àßè:S^ÜÚZø’[‹[UÓ͕͋Þâ]É÷ŸýR#ÿÏ)kë_é¶zÞ‡¢hqjåÕ¢ºþÏÔ%x’}¨¾Wß÷¥DØéþ_jr÷BGUàÏø[Â>¹ðbÙé¾0Ó-õ8´Ùíµm¦YÀ±D±$²¼_½e_™¾ó|é÷ƒ#Äú?…ÓÞ#±ðÖ‡m©[Ý}—í¦ËKX ‹ý$—ïKå.Íß>ïŸø?ƒvêÂÓY´Ò´Ä´Ý©¿‰v˜’´Z|®¿óÖ]ßvU‹ý¶oý•ñ…ͲxUoìûÝVáµ;ÄŸF±ÿ¥ß÷Óïü¯±þ÷û•·1'€þË ¤x)u¶d}+v›»S´d—PIgH¥–ÞÝ67ÎìÛWû»?àkïv¼'mâ«¿Kcƒ©ßë oy}¯.§©+<_ºH¶:®÷DTDOà¹ü7þÆ_ Ë{ý§cwö‹ymoWS´Üñ@Œ‰*>Åÿ–©½6}ï¾ÿð?¨<7¢Em-–µx®š}þ»qqö¿™ï¢ÚŸ'ÉæüªžWð|ß½þ/ãˆÈSXðÇì=òÛk}£ÉûRÊÊíjê›W~Ï+ÌŸºŸûÚÿðÛx“TÒtû>Í-”WÛê?%¥»üÿ"|ÿ6Ï5Ûýï›ýÆê¾±Õt¿ÛX³[J¶wSý¹‘?‰ü¯Ÿï&÷uï;ÿÀ/ÚyOÇ_ì¯érù\éñ]l¼Ô]ü«{tgÛ-Â>ÄÞ²¾õM›•v?ü ßì÷ªÏmû2iòÏc¦ÿ¯ß§§íû\^/žá6>剶}ÿïîù+7ã߆4ë¿ÚiúEßÚ5e}É6Ô·‚vßï|©¿åÿißýº‡ö~³³³ø¥_OáÉm¥eòµ ÛÒý¶|‰·Ê¿üïTs¸°ð†¼kâ½WÖqiº}Ö§jÿÛ:w›²ÉÕ?Õ2nûïóüÿÇÿ|q©á=á÷†uX‹¥êVé¥K+Åâ™vyQ*ÇÃnùZTûûý¿š½+D{mbÏGÓ4õ¶Öíímnµynõ6ŠÖÞÖuDGx¶"y¿*$ªü %[;k9¯ôÏÁlºUݺ߼·Úœ[ÑQSvËtßó2;»'ÞùŸø+Á>.Ã}m¥øJúñe†Þòùž×Q¸ßö½‹+¦Ï™ßr§ÏóüÛ·ÿ±¶¾ƒ†ÎÏ^ºÑÿ²®d¿þÆÓ.®¢¸Ö^+{{YY{Ä›>mŸëø¿»^ñöæÂdðlú{^Må4H/¯Wb&ÙeÙo|¿"oÝ»þšÿÀ©Hg¶üW׿á!mJ¹Õíµ/ïR(›IŠ'ûEÖë„ù"•~ë3}ïö7|éü}çì,ô}SÒ¥¶ó4{²Øè;ÓgÈÉæË³øþyÿ¿ü+‹ýšæð7ˆÁ¤ÞÛ+&ýì‚ú%iQu»ûÛöÀ›ï}äÎ@_ÓaDµûuË}²Ñ嵕t”óRûQYvoØûþ]þVƽ¶/¿ýüËÆÛI×ux§ŠÂî÷ìQZé–‘?ÚÙd¨îûþëìß³~ï‘>zë¡Ñ,Óí?a‚åî<¨¥Ùò]º+Ĉ‘|Ÿ.ý‰üþJLJA±†ëU¼‚Ô’þX¼÷™ÒßnϹò|ªïÿŽÅü4€òèæ–Ï㥷›wpB?Ú^'rû¶²´«÷·?ßÿŠöOØMâˆ7-m©Ç¢[ÝZÝEs¬ß$¿Ù÷Kþ‘­oµ~ãÿǪlþó6êò8w?ÇÈš(ìÜÊ7»êͶ+­ßz_øÞ_—û•êÞ'³[ÏùVÖˆö·I¸e{Hš'—dI÷×jouþ-Ìôâ=ÿ†4ýz /ì¥ðÛÝ+$ú¶¬²ÜZj÷]íþO•_fÔÙòíO¿^GñIe¸ÐɳZý©Ý.æÜˆÌÎÿê—î&íŸuç•z¾¥¦Áu§­Ë5ä¶ï]2ú]öµ%M‰ÿ §ûHõæßá·³ðò[çIVçvÏùbŸÞuÿøÜz$TNÏΖóà²4RϬ"^@ÿn·‰’[ Ì‹ó¯ñïoÝ'ûŽÛ*ÝæƒÒê±Kü&h×+qs¯[ý¢Þ[yY>5ï}Ý«ÿ Sô´kŸè¿iþÏH]üß¶éŸ}š$‹çuÿc~Ï÷þoîg¦‰mmk§ÄÊÐÛ¤_gŠãIÿZŸsýnß¼ß>ÍÿÞþ:_d“¿Ò—ìöPióÿi;y²¯Ù"tÜŸ&ÿ7çþ?¹ÿ­ß‹V¿À/W.›íî-u˜–_ï²êRïÿÐÒ¢}6 +H‰ZÙ^Þ(¾Ïæé?òÕ6ûÿwû÷«Wã6äý•gÏàuÿ„ÿKR´¥ðËü?ª*[Gü_£4ì÷}Ù¾Dó_î¿Uïà ÷hÐfß¡Å.ï½½ÿñú†ýþ_•k(’o|Ûÿ -÷}Ï"oûû_¼µø)ðYÕþ#\nûžD¿ïë×ï]CܘŸ‘W¶±„®V/ô™|fŽßÞTÔ“gþ†ÕàþÔ>Ýà«gÝ÷ |o¿ÿl{þ©_=|Ö¥Òô;R-ßhÒlu»Ø6\Ëo½àÒ¼ÔMÑ:¾ÝÊ›¶2î¯? þñ‰ÿùQ˜ÿ¸a?Ã/ý)Ÿ=xÀšßÄïYøoÃvRÖï7ýžÓÍH·ìF‘¾geQò«kè_ kÖºoÂ]OÃÚ–¡©\êW°Z,I-¢J»7˽¥ù]ÓzoH·|‰ûÝ*4þý¹5ñ]ñ–›wÿÖÞ`ëz¿ÛGÈÛ<¯7QÙ÷önÝü;«Oº÷‰u/^ë–6žþÄÒ-b´]èkË:ïŠ-‰ºßt¬Ÿh‰ÿ‡zo}î›ûž<žç|:_Ž6îùu¨¿ô;ªýC¶û46 ï-¬ÛDÿ­ºœß>÷Ùotþê|ÿzü¹›Ê{ù¬ÈŸÚË÷?¿¾ãgüu~¢Û_Åö?†V¶7—:•ݼ÷V«.¦®–—’¯”‰÷~ûüßì»Õÿ˰‰Úê7.«.«³Kxš”P§‹aÿvùþMñoûßòÕ¾ómÛ÷kæ?Ú*k—ðGˆ/.g¶ûlòÝKuw¹.6¼¿½‹ø·&ÿ“þº§ÞÙ_N\ØIi©]¬êé®Ïx޶‰¼è—[›øßgÊ®ß/ð®Ô¯’ÿh}bÎÂx^+;'»µYî¼ØgtŠ/žTóbù6ùQ3¿ûß'ÜùëÍ”eíc/²mÍSÃ?g‹h/4²é÷:«¥ô®°Û²"Ç”¯+¾ïâEùâÿj¾ƒñ 0j¾Ò´­Næ;Ÿ·êÒÛÙé>¶ÿH÷Ëóïþ/™_“û›_øëÅÿgˆtËmõ—UÕ-¬¥ÔeH­íâ6áâÓå}ÿ/ÜòŸ÷¿î쯢<y>ƒ\ø‡JþÄÒ¬®®¥ŠúÑR[µýëüîü;6ïþù?‚½(œÇ?ñƒÇúE‚ÿfxªò-cOÕ´› ]:ãÃÌö²ØO³wýõ³îoûÿ>Ϲ_3ëóÞ~Ôë,·1ßÞµÕºJöë²$•bÚéßá‹gËþå{ïíü#w^Õìu­/ÂR´º]½ä¶0;£¬IþªTŠ$ÚÑovùþöÿ¿òW‡ÜéKsûO[ÙÏåiº„Öûlmþt°Š+W}ŽÿÅåmMßÞùèŒ}î`‰ôï‚~ͦÝ\\ÙÛcý—QºûT:ô^nè%Š/’ÕÕþóìßýß‘÷ÿuü¿Á>$žÃ—ºÐk~Õ//%¼»¸ò¼Ø® }Èöé½÷lùÙvÏ‘¸ÑKoLÓ-VïÇ:U¿ˆ¥–]'QóQí_ÊGy_r}ïü¯úëòo®*;‰Ó^ð犠ðü—ÚöíîÛëK§_ì»9n%ù%FMÍålfo¹÷]މ{ÑÏõ_í¿~ÜÚ_ÜÁi/ˆvŘ/nŸs¬²ÿ­–(6lþ9^¾¾³Ö>ÙðÓOUñS%¼ºÕ»²B»ï¯Q¥EýÖØ—Íû‹ò}çþàù¿ãÇŒ4«?†ž×<5y±iet–­¬¾Ý÷WKö­ˆ‰³þYy»Ûýô¯½ôß…(g*¬Ö-uý¡kçDép¯³z'›¿î£¦äÿ€Àö§ðóæúõÍçö¦•|·>ðý¿‰-ü‹xYŸP¿Ý±¥DÛ˽Ñ?‹r?Üþ _k?ðêzf¡s?†ôx/§µ±´´Ý-ôîÉ»çùo›½ö|ë÷~ÏŸo°X| Óìm÷ö” vÛÞØ‹oß»j|ì©ýïøqŸ~Eà?|Eñ™,÷7¶ºv£­@÷#ýžãìÿ"où÷,[>Z¾h’|Ÿûø†{û„¹Õõ«»=OíP$Op¿è‘[Ĉˆïòmùbÿ»ÿŽ}¦ë6*½¼±¾þÕ½MkdW{[ìöªÉßO+oÈŽò¶Ï›l©÷?ƒÇÿaëöø–¾%žÚ&¶·Ò×C–+yW͉b– w¢ýå)?Ým•õˆ~éZõ‚YÆ¿cÔ弊öy¢_’7£Å¿nרŸ÷é?Û¬Àñ¤ñ&¡¥koªéòµåëkùºƒ´¿gµÝ³äù¢ùÚ-îÿ]Sû?üBÔ¾ÓûBx_ÏÔu›ËTŸQKt{9Õ?ÕEýæ‹s|û?þF}õöÖ½ð+J ÙiñyöÉâÝ4ȾoÛgþåÄ[öíwtÿ¿I_(|oi~~Õ ül’ÛCæèÓùÞnÇù®.ãwýuß÷¿Ù bׯâ}/ÃðEâ6™"ûB.™¿Úäwûê›·&Ï7þŸð[|#øGã?Û\ê­ÚjzvëA¼©¼´*º|¿{~í›ßïl®Cög¸¼Ö¾ èðK;M­æ£k¼«ç"#²}Ågù6|­YÐÜøžçJ¼ÖÏmα{t–­oo½ôÿ"TùÑ%ÙòïDÿwä+°ñ&¿gâ‹k–gÔµ7µ6·ö|Vû7¾ÇdÿTÿ#ÿwj?Ïóשkß tÍIôý>Î)lì¾ÕöÝGO…Q]¿sço™eùfÏùêÿ'ÉTµ¿„ZV¥¬øj ž*Âù®%Òm"Ø’îÙóýýÑ}Í¿%jAóÿìÙaý·ñ§ÄRËáÛßïÓ'¸W†w·}ì‰þ”û~o+ûÉýÏàjô c^•ôÁ¨j¶×(³ìX´Åù"þ³»ù¿2ï}ŸÅò½p_ [ÛÆS¤°ÛÅ©kö{yöm‹Ê؉¿ø~ZúbÃÁše†i§¶•l‘[Áöx¦Hív:ýõO½³øés{¥ž9©jº¿‹WÂ’½ÏöÅÝ×Ùm-?Õ[Å¿Éqóýߑվ÷^Eñâþû[Ѽ}¨ß6«¨4#E ¢[§›/uß÷÷lÝüî×ÔZ?ÃAð¤ºc@¯nö³ÚË/•óþ÷ä}ò¯ûúxíyáx¼!ð£ÀÖ°*§•<ñ+ªìivÅ÷Ýÿ‰ª$(Äõ/CsḞì¥øuo/†âìÄ—íéóït}ÿwûŸÃ·Ý®+GÖÚkv+«¶•iqbþn™ó½Åë}£ç‹›òlo“÷wüõéÒ’ÿI²¾ŠÚ;™gÑl-g{åYå’lÙ»î·Îô'´ÏøHî58¬`ón¬â²ÞñoM‹ÿ<¾O—û›ÒÏ/ñ›¨h:_Š4 ^Y|=åi£`©ä·Î›Rá÷|Û¾]Ê”zµÏö{ê6W:äúmž‰?‹-þyl Ùo¿dK/̱#¦Ï“c=ÃüïüYþ!ÐoN´ñ,Uχü÷µoZJˆ÷:|ï›òìù>ê²ï©¼g§.µg¶ò6n‹t¶‰·ÊuûŽÿÄß7Îß&ßë'Ä:ij\}³È¶°»yRáRÆ$Š(š-ê›îýÝÿ'ûoýúÔŽc…µ³moöŒ‰c±o•ŸÊvû?Ÿ³ø¢ùþEM¿/Ì¿r½²s/Œ,ÓCû\V¶7ŽÚ¡;#éh‰+ý¡åvMÍ|Ûnév}êðïO=Çí%á«™mà…îîlçkx“ʈ#?ÝÿweoÿÂg>±£n¹nmî§gk»ˆ¿Ò7üîÿïowFùþjÎ?gkªè6ÚÞ‰w¥xCZŸÅ®ºdWWš{Àö÷z#¬©æ¤[¥ýë&÷_ûjí³û¾)ñ:í¤ðŒV­©¼ëã¿ØBªþ®ßì}Õû¿{îÖÝž¥ö :(–Òvº[Ÿék>çGâÿö+ÇWÍuà!ØàKx%FŠáVfþþß½ü÷Ý"?ë=„º'‡ü)s.‘má‰edÛ¨Ã/›otëå2#¦ÿø|›·ºT:•厛ãµö«†÷ØŸÃó|ÔF^èËé~uÝ=Δ÷]4¿>ï?ïªÚßÀ³ø¾mÿðÃãbÆ-~Ïë·gÍâ?“þâ ^s£ëÛ_¢ùPM¶)b_:}»·ýÏý ½ãüšÇìõÿsþœ®ŸÃ/ðþ¨©mñ~Œw†÷Â+§ÿ×*mä˳mK`žN‡§Åòü°"7ýñUïïî®h’töÍñ.á[þyAÿ£^¿z+ðSà>çø}·ïùVÿú×ï]7¹ â‘ùXËðCà0¯ü"'þUR¼á>>£1ÐcYR{ý;T²‰Å´·ÍŸEDO–$yvî•wmF¯uVX>ü ‘~}žÝÿ•Šð_éwš~'ÓïgûMÌZ?ˆ7L»r¶‡òã»+‚‡ûæ$úœ|£,ü2üÙgÀ_°Þ ¾+²>2Ô®ÿáùÅçö‰«ý´ü³ÊótíŸfíßú¶ü7áÿøO³hšn¹e¢hº¥œO.™/‰¬­÷A*Dèï·•ž/+ý­¿/ÜzùcÀ~;Öþø¦ÏÄž¿n·g¿ì÷~RK³z4mòº²Ÿ•˜s_E|:ðʼn>x›YÔí¯¿µtÛX%Š(¥û=¼[’]ï+´N»‘‘6ÄïKóª;¶Å®³çŒÿ†öÖ×–ò®vYÏ,HÿÃ*Ë.Ïø}›ñjæ}oáG‚´ø¼Kö•ÅÍå¼K§ª'ìö茿sûþS¾µñÃ{d¼·øÊ²«?•òìFØÿ,²µ}‘ñ-zä¼gð»Äpé>;ŸÍÑ5¸¬4´O}öèžáÒ-Ÿ}÷þ÷ûìSþ&ø=¼ ¢ø‹Ä·×Éý¡{mý•ÿ 4ÎÉ/š¨ûÛ_)™7ïÛü[™?ï:ñŽ©ÂëW‘C«B—z[µ¿›ìº¦íŸº6mýê*/÷•’_•j)Ô§Wá s¥á‹˜´Ox­m¯´ßi¯Ïûí±K÷´÷Ø‘'÷]þÿý2¯Eø>ö:•Ç•m¦Oa-Ö£uæêzš½Å½Çü|'Üÿw÷_&ß¿ó½q^†åïî«oJšÙüM§ßn¹Ô¼ßÊË}pŸ½½VÒŸçÿußî¥_)'®é·’Þx£Oó'Ÿ[´]~âU»ðô[.Óʉ7¼»_ýT_>ïáo“}-×¼96¥¬xr{›-KP•¥ºÐ¦±žX¢X¢—þ=î~_=]’ÿ³óÕOh-suâ½_ûF}îßXDYtùÐoâdDx®7§î7íݾ¼ÖSèqø~Ú»ðM­Ö£uçè7^kK¨£í‰÷3'ñ®ø>o÷¿¿QF§º\½ÂˆpÜê_<4ºÝ¥’J—‹\Ù4_g³M— ‘E±ö³»}ÿöR/ï¥}‹¢ÁEçÖüMqáËoEæØ]]X-Ä·ÿ#}—ÊW}¾WñïJøë⎛öŸ„Óâ±»°{[õ°¾ý"¤©æÊÍ÷™ö$I¿ømßgñÖ€Îø»â9w,;5mfUù¿é­½tÆVøŒeðŸ¢iûaê·6þRøOOÿÀÇÿ¾?ÕW/ñ§öÔ­ÿ†Ï×®b—þ)}-âUùQï%ÙþÇɲ¾gøÓãÏøO?h…þ3¾´‚ÛZ¸ŸHx-"—î’êëþƒê‹MÕUín?ÚW¯?ñmœ·?>ê¬ñ¼PE§[ìÛóü×WüCUË–FR—Ä{®ÿ×ß¹+|¿*ÿ±L‡GþØø)ã=>&Ø÷·–#íÞ‰ºâ%Þõäº>Ø®¼¿äýÆ©óÿÛYk|eÇá>§OÚÓ_¶óY¼=¥¼R«î‡íRýÿïýÏö+Cõwˆîug–-KGmÒ¯<¯å:§û•óUåüH›WïÿjøVÿeý»nþÿÐ+§Ý9¹¤>Þøoö‰ø‡â¥†Ú]J MR÷ÉdÿGÜÈ¿.Ïîüõè ûOøÎk;}«¥üë½wÚÊû7ÛZñIþ_üFfv™ŸFÔ~gÿr*±msØíþmïå/þ\Ñ:e#×á¤Ë|í¿æoš«ÿÃKxáÿå¾›óÓŽÿýž¼÷ÅÇâ‹ÿàýÕŸÉÿnVõ“ö”yR¦2 õañ_ÅZ–—n×7ÖžUüW >ê[¿ÕmZÿñ}žãøh‘q:›Ÿ‰ÚõýÇŸ+Z܃gÈ¿Á÷þíoxo^Ô5ë;ë››˜·ÛüêžB}ÿøû•æ3\«§Ë]Ÿ‚fÿ‰F¬ßì¯þÏD~ ‘ô×7ÿ<%ä­s3½—Ί©üuÏCãBk5‰¢´ØÛ_ýWÿgZvÛ¦øÃàÿ—øí‹oñ×fÿèq»PiöNÃÃÚõö·œ²Ç "¿Î‹þÇûõ‹–äxcUŒÎŸgŠX¾EM»¾j£àÇòuÄÿuÿô ‹fi´MWþºÅHÏí Ôõô?ÑÀ%þÊŠ_™7nf–Z£a­Þ}µ"ܨ’þé¶/ðS¼Dê‹¡|ÛÿâOþ†õ•g7úl_ïVe­æ•ö=Q"‚å¾vÙ¿j×G¯C>·ðÇá†Òÿ£Ëy¨¢üŸq庉]ÿñÄ®R›~·nÿ–¯]+¦ÿ |_úˆÝéjWu/†§øTGòâlùUv'ð¢V%ãýýÛ«zÿl?7þÍ\ýüÛþíršÀ×Tñæ Û[ýU¿þ‡-~ö×à—À§oøO5=¿mºãï_½´žæ+â‘øë`›ÿgß‚I÷÷xY¿ôõ^Eái>'ñ¶©ª¤Šºeúß[ÜZîób‹EÙuò¤±|Ω.ÏÞ¯ßJöZ¦«ð?à—š¬ÿeð¦¥*¢;®æ‹P¸dû¿{æÙ^ ðûÁš–âx\YÏs¬Åcâ #in¾l¯?öT©±U>ón¬ý—%z“þcÑ©‰Z©/1Õ|ø‡ðWNø¯¡ÜøjÞÏÁšÚ ÌÞ¿§\Eemþ.ÿ5ÛYuù—r/Ë÷™kM›Âi»¥ð¿‰/%µ%¼¸´Ö¢H“çDß³ìOµwº}÷þ4]õæ>ý”~'øëÅvz'ü"¿‡Öè?üLõí6êÖʨÍûÙ|¦Û»nÅã–e¯Qøe¯økÂÞñN‰®YÜÞ]ÞÙÅż_ÅRìÜë*í_7ìòìýê¿•÷7ìec3á¿›öÏWñÁu»clØ»åÞ麾ʶ²»ÿ„OÀ¯c§ÿc»ë—Im¬\?›+JËjûömݵ>VUþò |“lÕ¾ [,«º]YÛnïîË/Ï·ûµö±ñSOÑþé2ørÎï^ñn«]]K§\E,±34Vì‘"|û¿ç¯û»þ÷ÏD£Ó”dOÙ=/Äþðö½. ¾:³‚óD•åFÖn.¢‰%ó^U‰î-÷îÝæþ÷çÜßsçZù¯Ç ¤Ó,|g­Ù麵¿†¿°ÛÈ6Š·e«&ß¹/÷•UvýÍÍZIâ¯hÿßÅ_cÑ/øY4M>/Éycä¯ss©Ïk-Ū?˾'Gù~Dÿ¾«ˆÓïgñ·Œlµïi_ð•[éדºêÚŒnöp2+3·›ò¶ÿþö•о¶Òhˆ¢çÅCÃm§É§Ù"ËxÏ¢­ª[ª®×tF¸ù÷}ýÿ2²'û4F!ñŸþÒßu¯‚ÞÓúãþ+ü1¶‡á§Š5[ÉZÍ4Ýòö M2v–ââ_³¼Iö‰]åùþâ"×\¹LcŸ³ëZ…÷Ë™5 ‰'»Ký9²üʉktˆ¿÷ÆÊö-D¾Ô§Š+;;™¾Tù!‰Ÿø‚ßðüc‹Xþ×­­íSHŠ+F_5%h­î"}ÿ:6Ý›¾å{Ý·Á9tHXöÎÊ%‹ç±¼]ŒŒŸÁæ¢7þ…\ô½ßˆº‘+øoöxדÃWö½=—„´H•ݦեýëÿ°–ëó3WÎþ6K»?ˆ“tŸeÛdÒÄ‹ònûmÆÏ›þú¯±|=ðõ^ÖíntÏí+ØzÿÂC©µ×•óýô·ƒb·ý÷_2üq{}ãïÃÿÇ,÷?l¹Ó¯çºiWn÷½¸gX¶ýض˵SøvUT”B1A·ökÆ»¹tgF†]Gʉ™_î?”ŽÌ¯ò}ʸ.nb§Æÿ ø{á÷€üg¢ø'Äóø±ìà°yõ x6"_ýª/’/ökæ 5[˜¼&ò0ƒSgÿ¿¯_]~Ð:zø+á}íôV¶––º\ð,Z^’Ÿe·FûT[ÞWgv›Êù]þdþçÏ^)ð£Âºg¼ ¡yóº^¤÷‹k/•½_ãù÷/ݹýúŠœ²—ºoöNMÓnoö*«;·Ü¯Uð÷†<5¥x^îçPÕg›ÅòiÚe¤_º_ùê÷þçÝÙüTýKáúk?ïÙÓvÅ7b?÷>ôHß?û•Ûx?áì^Ñæ(­,Uÿ´Íö«ˆ•¿Öº»lX™þGEo¿WrróŸ<êêËñ#â*6ï“E¾OÞ§ÍòÅÿÀ~íR³…fÙ_Áüÿð ê|%s§ÿÂþñZêÚt«{ûylRëçx•vy¿Þÿj½‰> ÛxŸK·×"X­¢—gšïDêÍ¿f÷O—çÙýÊÆ15‘ãš 6pËj$K÷¶Tã‰|o,HɺĮŽÿÄ¿gþöKƒöÖrÅ<¿d¼F_—~ûüsäÿÇë‚ý­´K=7Á¾–’{Û‹—Š[¹¶ïh¢‹äO“åUMïò"/ñÕÊ^é1¼yWŽaßâ‹ßïùV_÷ÏØ­ê¥…ŸÏó2¥} øOø…ui¥E¦*]ý†ÏýL^jOpÖñ*>ϼ­÷>ã¯Ü¬øRz|7HÌÐ&ß¡ýÿ÷ölÙ¿ïÀê#ùŒ&™s£iê»íâ•ÙÓî#®ÿ¿ýß¿ÿׄxywxPo+~ÝVß÷¿ÝÿG¸¯­í¼cgá}V/*'·Xám-þK5StR²}æÿ»WÎ -¶x7Z[•—{ß[íMì¿zÞãçÿ¾Z¦A‘†ï|sm ž¡/Úe—by)÷Ù>»Võ‡«ake}äK äRËc3§Éx±Kµö>ÿ›gû”hðÏᇖ{Ÿ±Ëå|·Åûß™?¿¿åªå”> øÌŸXZi¿¼;mj]öGkæ£íÞ²ÿü•ÂéVÛâ‰?‚º]>ÑŸâæ†ÌHžâ-®Ÿ!_þÊ´,<7>½a{yg÷)akæÝy+½íâ]‹æ¿÷Ws¢ÔrÊr/á1|<ñYëɺUO•¿ô Õñ•½ˆð-õæù`½–ö8’&O’UÆæeoö~Oûî©iºjÙê1N±E3ÄÊê— ½þüUçÔüGmö‰åûeÆí©±v|¿ÝÛ÷ïŠí>(Þé¢6Ï—û*Wÿ¾ë>Ïj\BÌß&ä®ÛZ¶–þ ÛGæLòéV¨±›{ÿÿ½óÖ7ˆ|%sáz÷EÕlg°Ô,ç{{«y—cÅ*ýô¨äŸÆÐ:í*3[Ö]u™lí)eû\1y¨üþ»U4Ý{íëðËOye•ã²¢/ÜYn¾þÿøþ9YWúö§ªÚÅg,±}bÛÅĉÿZ©¢L©uá}Ëûß!%_ï}µÛÿŠ«æržÑ~ûâù¾G¬+ÇùmlMr¿ÃòVMæ×ÿm)tŸþ+­OýÛ_ýž¿|ëð?àWüŽZÛqmÿô¯ß ™Ov~.xõWøð6çOFxŸLÕ4ù~o½»R—ÿeÞßð óσ>'ðM‚ø—ZøÏ¡ë:õÆ©|²Úß[ù¿fù]ÙeO¿¾*û³þ Çà¿øŸöSðeæ±¢Øê³@Ú¼Owý‰öÙ]þõ}Iÿ £Àïnñ7„4o)×cBöi±¿àµNnbÌ$ñ·ìÊÿó!x‹þþÜòUð›þÌ_ô"ø‹þú¸ÿäªý=O„¾ÿ¡'DÿÀ§ÿ¨ð*Ì™¢à Ö"æ‘øÁ©øsEðφ>%xþ “Eâ]NãOÒ´ÆÞ—u¼·lWOÿýÖÚúrÍ4©¢Ó5[kDÔÒÖ$ûr.ÇÙ³øßø¿ßÿb½{öðøo¡ëo‚¼!¢éš†íõyî¯n®--U¾Ê‘2&õÿnZù>o†>:ûSËÄhì"a·Ó·¢ÿ¹¹êã"ÏmÑ4­?[g¹–úÒÂõ¥Øßß—äDóÚù>OøRø„ú/‚|ªø‚éluI`ž{x•UçþÿñüìèŸü]xÌß¼msóÂÍ•>]Ÿò Oþ.ªê_³÷Š5¸>Çyñ>wŠ_½ÿïàÿ¾éÒüÕtÙø×PŠÆ/±^øš{Û[µWx¢•gû?srW¹èöiöûI~Ò°ù[“íóùI±ÿô:ùÞÃà&¹á94ÍÇ_Ø–ˆÌïö¿»gßÝ+ÿsuX…7nÿ…·©|ÿÆöiÿÅÖœÀ}eý‰¢½“Á¹lé*¢lýÖÿîìMßìWÇ÷þ*Ðÿá¤môûk•›UƒÆW÷³Ý£o‰í³âŠ/ŸýôzÐO…:ß¹¾-êIþߨ×ÿ‹¬ÝöT¹ÒµK½U¼lך›Àñ}®ãNó^%ÿc÷¿/û5ŸºÒm†Ÿ¥iØØÛ[[[³Ǽ6ɳnÍ»?Ýùk²°³Ò.mSv¹ôU‰’o¹å}Ï+cÎéýÚùžÏá/Š’/Ý|RÔ‘?ìÿB|%ñF×oøZšÊ#ýíšt_7þ?OÝ$¡ûphö_ðŽøWEð·“,ÿÚotËm±]ÕmßsìÿaSÿe¯OøñFòÛûau=çMÓì-ìÞí|¤º‰¼Öybâ_ãßþÝpZoÁmWJñF™¯7ÄMRòîÂT–(®,bò¥Ûüüÿ2üïò·\§ˆdí+]»ó[Åv{YþK+¢ùwîþùªéËÙKš"”c(òÈúMõ(.^)þÙäÛÅ/î·Î¨ì›Óäÿj¹ÿŒ×ÿfø;ã6¹•S~u¹÷|ûšÝþOûî¾uØ·AEù¼g¬¾Õþ8–¥›ö*ð¾Ï›ÅšËÿ{÷I²‰Tçç¼â_‚úÞ˜Ú.¡6§yk¤êCiïH§²•÷üßÜwÚÕöÅÿ¢¼Ñ¢Ò¼ûk Ø›ÊT{­îß?Ï÷Ÿæþ4ùöÿ|û âÝ OÓujš¤6±}ž+«‹h>Љò|žnÝÿÁ\dß±‡…R_›ÄzÛ¿ÜùÚ/þ"®IF<¡(ó˘úŠÏXÐí¥{kk›DH•âwûgβËük/Èÿ?ûuògÇ‹yµ¯ÚÂ^%Ó¼»ý'Ã殮óÂežë©YwmûËû§mÕy?c?ÊÚÖ¶û¿ƒt_sþø®Ã³Æ‹àË]BÏLñ¶–Wÿºº·ymöKò:|û¢þã¿ý÷Q)sÊv¾'Oáï êð”A›-Ô¯Ùõ;¥ÜlOàWù~o㮊i=Ä¿Úúz^ÞïH.&¾M‘n¹÷þ_÷Þ¼VoÙ À÷’ùóßk>l¬ÎÏçĈÌßì,_-þÆÞGù¯5dÿaî—ÿUûIrò˜û8óGí;ªØøÃá„ú6}m5î­qoog§ÛκV¸‹dOóü¿ßÝþÅxŸÂ)ï¼9¦xRÒ}5ÊZÜÜÿhù—+ [üÌÉ¿s¸Ë^™¦þË^ Ðuµ >ó[¶Ô-eób¸ŠñQâoûõLÖÿfÿkÓ¤úœº½ä¨»Þù>çü*Žo{˜¾_tí|Uñ#OñW‰’ææûH°¸X"{¨ao²¼ª©òoùÝ~ï•ÿ|SSÅZW•·ûsKyUšX.uÙ.Í‘:oû»þ÷]ëÏ?á•>§ü²Ô¶×ÿÿaOOÙoáäßóÔ×äÿ檕iU—4‰8Ò,O$¶t‡â7‹uéZ4ÒuH¯ÒÎîîéQ'vGTù¿‡{#üõïßþ#|ºeËÿÛãýÊšu%KÞ‰R§|GUñÁ>oüŽ:[þé7lþg¯6øýã ?â>‘ Zè—0x’âÎæ_=ì¾H‘/)7¿Ê«ó5nÃ<|>DÝý•>Ïúü–®Ø|ðvýŽÆîÚ)[s$Z£·÷êy‹9/†ÿ´ÿøËû^-{OÓ|­: t—|¾zžôþ¸éòWg¯|kðŽ©q-ä¾*´šâVi_Ï»çÿgýçª7?ü÷_ò/3Ý·ÞO>ã{?ý÷MO‚~ ùÚFè¿ÇæÊûñúÖ5%ËÊG³70çø¯á[ý7P³³× ¿»–Öá"´´ŠWy_Ê}Ÿ"¥|ý¥ßgxNÿK¸kM.îò{;…KÙ6Æx'–[†Û¹>ïÝo½Zø§©ø jÞÃ\·Ó­õÈšÞúFWKˆ>Ý6äû¿;W®Mð÷A…íâ Z'Ú¶ùð­Vû› ›áÖ†÷²ÛEá«$¸‰ZV‹ÈMè‹÷Ýê#*”¥Í”c(òÈðûmwK…âßw }ŸæWOŸýß½÷«?Äw–z½²Ae:¼²Ê™oà_ö«Ü¿á Ñ^Íî—AÓ~ÉyM7‘Åz{øKJ°K)WJÓSí_½µ*/Ÿüÿ·D¹‹÷O‡ÆÍ§\xrúÇPŽÚûI‚*á7}¡%‹ÿˆþ›Ä¿&ñn¯w¬kšÃêú­ÔIæÝÝüò¶ß—æù>öůf›ÂV/«Ë§ÿei¿Ú ½Ù6Û§Ýûÿ?Ýj¯§½­ÅÌV:o•nÈ’ü±#§üïQí*ròý’=ÞncÁæÖì^/õžwÊß%}ƒðïþ ¯ã¯øgþ'Ò¼oáÔ·½±I xn^_)%ù7ªíÜ›Ù_oûuæŸÙZzEo>ÛGIþê'”ûàÃüuúÿ號ö}½‰¶ùPx›QH“oÜ_ÝTr„¤|úŸðL¯ˆ‰ï|q£oþ-žoÿBÁ1ümÿ-|u¥ÿÀ<ßþ"¿Hž¢«å#˜üô¹ýŽu€ž»×/µ«a]’½¾ï5·#ìþº•úÇ_&~Ô¯³àÞ§ÿ]âÿÙëë:%T‡‰ÿà™Öíaû$ø^9bhfûUëüÿÝûC×Õuówìš`Ñ|  FÚ”zvž‹~’ÛKòDª²£y¬ÿu»ÿ¯ý£lωþ×¼9m¢éø%5iå·û>·W®È²íK¥eÿ–Oÿ²TF¯Ö9güÇEhû*’÷²Q¾¿;áý§>9?üÏ^û–_ÿ‹«ðÒ¿6ÿÈûá}ÿÅÿËÿñuÑ쿽ù˜ó§ûp¾Ïü/eþµŸâÙüõò¼ß¼8ò¼ñ[ks[ÿÇ×ζ{>Ë÷6}£íVíÿ6ÍÿÁÿ­OŠ;øŸñûC¿ñ«£øÂ5'†-?O±]5WÏDß¿{üêû6m¯8‡DÕí¥•á ‰ô¦Š+uÒeÖìñmwmè›þó¾Ïûâ§àÚ¿ÅM!ÓÊû¯ ©þ…+¿‘4ÿ;;ź]Ӯϓäù·'ûtôøÓ ù¿im]{/øúû$+köï³·î‘>Ë¿wúߟÝÛ\d:oˆaµ•eð¬wŽÒË-­ÄÚÒ;Ùy¿/îŸøv|›ÜJš+Ä¿e²X¼+iö»³îÔZO´\,_òÊ_“æWÙóÿzm·Å­#Ê{?ì­Rkßø÷Iaºµ–%•v<¯pëþ¡]~_ŸæMÿ?Ü©Sã~Šö sƒ©|Ÿé -Æ£k‹Å/ÉIu³kJó·ügÜ®Kì#Kß>hÐÄñOÕ¢k å]y»7¼©³ï|ÿ^­ÛXx©.¥ÿŠC@¹´ib•ln5=ñDÑ&ÔØ›>_ão÷žŸýºK7Æm"mÿâžÕ¡OžÞ_µÞA²¼5ĶñlÝ>ôû¿øý[³øÓ¡Íª]µç†µŸ²2ï‚ÆÞò+A|ôýÒKn±~ëcïùÿÜ®ôÍ¥ýŽ_hŽéÛÅ|ú·ú\[ÝÝ%ò·nùÿñÄ«³Yøãíyÿ¯†í®v¸óa¿Øïò:§Éå|Ê›Ój°ŸÜ£Ÿû zn·ñ#Á–v¶²èvÚ†·§ÜlK­fkÈ"·°hý#~Ýÿ+£ü¯\®±ñšÖKh<<ÖÒÅ?ÙÛV¾Õ~Ïitóüñ=»}ŸsyKü>oŸîì¬I¡ñ•iü!>G·ÿP‘j2¢*ÿôò¶¶úÏÔ¯üg£Áw©Ïá_ ¼6©-ÃCöÆoûã÷_y>Oîïù*ù¢Qÿ ¾ÃûNÝÿá Ô!²ò¾Ñýw¨íÔ.<•öĶÿvWþ'û»_åjm·ÅÔ{ÍBÏþ9î_wØ–}OÍ–ÂYWÍK‹¯Ým‹ÊO—j3nùþíSøWàß|QøZž,Ò´ Y½ýäVº>¬ê+o{©4HŸ%»²lÛû©]‘þþÉw}êå¾/ê7? O€ô¨/üâÛ/#Ek¬xrñîʲ¢J’˳s6ï—åþûýÝôÀê¿á|Cÿûêð‰Ã2nK¯í4Õ[û1[Êû?›ö}ÌÎÿ7È¿yÑÚ§\ü`ÙŸfÞûÚ?о×q}.ýE¿Öý¢Õ-ÍòüŸ>ß¾Ÿ=[¼øoãßíH¯ï·–ûG“÷~x¼¯àß÷?½óUK?†>=¶º»–(<òÞű’fÑ{¿Éò|­û×ùÿÜþå.ar›#ã~•%«Ëÿ úõ¼AæÅ¨Eá8µ?`oÝ~ö]›WçýïüîÔ¾*ñÏü#ßÚ1xkθ[5óîîï%Š-9(§óeù>f}û6'ð§ü¹ïøV>3‡K»Ó§ÿ„Cʸ–YZ_*ãÍß+»ýýŸu7¾Ôû«Z7>ñÅËY7üQ·—Q%½®û[§ØŸ"ÿÀ¾DEùèæˆÌ«ŸŽRC¢ÛÝ7…´Ûkw¸[í;‹Ë×·ŸÏù~ÏJžoî¶îÞËólzeÿÆ;¸ol “Á––r¬Måió^N×w«gÿ-w¯Ë›÷ÝÙòo­|ã8uÇÕüÿ¥ëÅö}Ÿa¸tÛòË/ï|‰Tl>x¿M³»³¶ŸÂŸd¿g–t}:â]ß"/Èÿ¿ºO’Ž`mñƒS›Y»Uð®—ypŸº–Å/®ì_jMûå¸oÝ7•ü>öÿž³Óã•òxqç‹HÑ.mÙ~Õý¦íy*Ñ>ĉ-ÙüÙ|Ýÿ;§÷ÓgÜ«S|(ñdÚ&™¤6«á¿²Xlòì7lOÜw—~æo’¯MðÓÇ:;¯/ˆü6š„P=ºÜ&“*l‰¾úlß·mÀf_üSÔ.~Å¥I£iviæ½”R§Ú¥¸¿óU%y|¥—÷>êy¿.×ùþd®×Á?tÿk:´°ñÅäù7ÒÜið[·î¶;ÿ{ø¾þêãÓá§Œl.µ9í¼U¢Cqª|÷›4wt¾tÿž»gûTýáïŒü7e§ÙØø¿M°²°n-aM”ÊûþMÒÿ¿ü˜Oñ/\Ò­nÕtýíî’âÒ[눮"òÞï‰<ÝÓ·û›U•?àTÆø©âÒâ¶:f“ )Ñu?Ù[αò­"óâón<©wî“ø>O—ýº¯ÿ ßS°ÐnôÉ|f°èóîyíÿ³"ò›wßÿ–»i·>ÕoÚÊÙ¼q<ßÙ¬’ÀŸc‰ÞÝÕ>Gûû¾ïýõG1D0üEñ|: Á’Ku‡ï´$ût­¿Ê·Ùk¿o”é÷·ýíîßÁV?á6ñÊ%›iú}Ο`·VIo ŠïX•7¼·Wv&I¹÷wºU+Ïêvz—ö…ç§¶½–/³ý¡íbGtß÷7ïùª+?Ïskz¶>8¹š)go´¥¼Vû_ãÞŸÞ«æ$î¯>"ëמMr ?ÃvÞ&ƒQµí;‹7H§Yâ•<¯âTH¿ƒoßÝ\Gü%^1¶µ½¶´‹ä¸ŠWg—G·û\°DÿèïJŸ/ÍürýïºôÇÐn|<ÖVËã«ë7EÙkú:|‹ýÄÙU!ð”ºÇ•ªÁã=Ró÷Oå_Eöwûß#üû(æBoxÎýOž%KK{Ï)í-ôË_5wEºëíìò‘~tùæ]鲪¿Œ·{=ޝ¨=½Ô»ÛdKqp°4[®gÊ®Û>}ÿÜÙ\·†¯âŠÚÛÄwÓ<ò¼PEöÏ¿/ñü›?Ü«³xzÏG‚k™u]RÚ(¢ýëý¹ÓbÀhæ$¼š¯ŒfgOíYî("yb†XŸ÷»þG–]ŸÁlùøøé“k~!DÔ.WPƒìWjFI¢‹ìñEü lݹæþ»¹«ê7Ñ[ZjW—2Ëžª·/½¢þõøsN{íB{´·Ý·þ?%ûÍY”nÜ]kÃN·ÓgÔQn`•n ÁöÖuGß±þ꫾ßq6Ñs¬k—7ö—;¬¾Ñeg±m"‚Ý"޾Ǹù?{ÿ| W5a£h:Ååíµ¤÷3KlȲ'Ÿ/ËÿÔZÞ‡áý"{(nDéqs'•yò¾æÿ¾è¢°ÕeÕuë¶ž[g´·¾•ÝþƱ[£ìû‘"üßÇÿŽ%}gû~Õß þ|"Ô<=ãG£ëÛ÷—_g{Y_÷M³cü©þÅ|O¢èz»§}®Ú&šßs.÷–Tù—þN¼Ö4}yl|¶Kˆ ûD¨ŠÏò¿N?Þ#”ýP³ý¼>ê¬ÿcñÚ]UݶXÏ÷¦þÞ5»ÿ±Øø¢ææãû‰¦\'þ„•ù AoÏ©ªó­]ðÃù>-ÓâUTGYwÿß·4H”ycÌ~žþÕÚò§Â ¸>ÇsûÙSsºìEýÓµ}—_~ÖŸòIn÷}͉÷ÿëÕëí:Ê{#j_ ðW‡®-¢ø#¦\µ´áÛYn® CáÕÖŸªÜëo>¡u.°òê¿Ú?ÙÚ‹Jq§¥Ç÷bþþøpá?Ý©cÞ$_³¿ßÍóÕï´·û)\¾›4©Ýÿn´‘ÙöD¬»Ú½ ÎcY/Êß:S¾ÒþWÍT¡°¼tÚÑßu+ÙΟÂÕ­€¶›_îýÇÿj¥I•?‰·ÕW°¹HŸtL‰ýý´É¡Ÿçh “~ÊË”f¬7,é»vÇݲˆnUÙYSýÏᬤ{Ÿ) d¡ædtÝ+'ü¿iùÒUÛ½ž—?:|Ͳ°’eH¶îØïüu,7?½OÞ®ÿö(oí,ÿwçEû©Xþ6›„µ½Í÷¬åûŸîUˆ]bÿÀö%cøÎå¿áÖþeßö9~ÿñü”럱µ†»ÿ ™áí ¿ÓuÝgXßáïÚhñ_®Œ¬/Ú%ó_j¯ü|E¿ï~ö¼ãöÔÒbñÿо^hž ¾ðU†“§ßÝϦj:biòìŠêß|¾R|«¿~úè¿cKkøc½JÓÅ¿ÙðÙõõoÿiÏqç&–ÑDñ}ŸÈù¼ß5¢ÿ¾«oþ Wã–ð—Äo…°iÓù:f³ ^éÿ"oßKo±>oø mSâ3å øŸã_øWÞÕü@º\Ú£Yýû+_õ­½öWÎÿ¾0xƒ[ñM–¡§Ùx«Ãöº=ŒWiñA±ïžéSbÿ¾žo÷îÿ };xí ÓíÜŸ3ýÊó‰Ïà[ŸøV_êfÕQ']>'•¶6ï¿¿oÿcY{Ƈà/‰Þ!ð‚u >]Äž8¸Òî¢Oí9¾ýÒOü ÷þçûÏ÷ÿ†¹ˆ~-ÖüIã}bkX¼Oáéþ)åÓa•Qv>í÷ÿî¦ÅÝþúüë^ãð‚ûÂoàˆ“ÁW2Þhž|»%v}í/ñïÞŸîW)ñûáu·.—ÅMÿ÷ÑeÝþ·åµØßsoñ}í´{Àfx+âOŠ´ xwHoë¼+¨ÿdjË>öžßþ~¿ÏËò}úòý{Qñ‹üG«¶§ˆ4Öß˺²ûr§öLPlÛ&Öÿž¿sæÙü~¾–ð&¥¡Üø/G“ÃûŸBkoôfù“åÿÿ·¾¼ÓÇž(øO¥xƒÆQkÐÊú¬Ijú¬Iüÿ:mÙþ×Ì´ƒÞ.èÿüu‹áÆ‹áåÜÖóéÒË.ûÏ6]Ñ'î·¾Ï›ÍØŸ÷Ýx˜}KV¹’h_UŠê{Ïí{ÈäÖ•<›ýï²Ãaÿcæþÿýó_\é·_éz{XíK‚)mQ>M±2|ŸøæÊðûÿˆŸ ìï5ŸG–k‹]u-åt³žñ·üÿî|òÿ㕨¯ãÿ‰Im¨mðó×JK¥t¼ù~ÔΈñÀ7»ìûß%x—†ìo´Û½æÓÏÕï4›„¸ÑRãZGŠòò]Ÿh‰¶ýåFù>M›ÿàuõÕÿ›¶_7çÛ»Íùw׃ø[â7€nï|1k¤xríæò{[^Ù¿q*ìÞíóÿ¶Ÿîÿ³YûÀYø‡âO\h^*´ºðÕ·öCJÊøug®Yë×ze¶–š½Õ›¾¬žl­å*§ú:'þ9¿ïW«üGñ&•¢ø6êöúŵ‹%dF²‰Qž_ž²¼%ãm3[ñ.±gm¡Ï¦ËåA,·sD±$ÿ">ÏøyßÄX¼Y¨Øh âëM'ÉXšX6JßñÿóùIòÿÝ›¿‡ï|ÔïéÞ&Ó´ÏÂ1.–®Ëºé_çÔ‹fÿáûßìW¤xãÆV~ƒGœémâ&žñ|ˆ E+þšÿÀ¿Uüâû=v-i“NOÛÛ]²¿šÊž÷çÿwýº²O/ñÆ—®ÜøŠÝµ¦Ò´þʱi“yr²/Éþ”í·þ·}nøKDñ,^Hü+}¥Ûh¿l_±ù°2mƒ{ù®Û·³n®Åž>³Ðµý:Þ 15§’)ekÕ•_ìÉ·ø¿Þ«¾ñµÿ…mo5 ðÜ»ü¯ìÉeTò¿¹þîÿ÷* <‹ÄZ]Ô¾+Ö¿µžÊk†:úá wݦnM«þ÷Üÿâë°Ò´dxìÚ½—Ù¤‹ìÛ6A·ývTþ-ø—.›ªk6Ú,Z•½¯ü|$©²[ÿñïþ×ûŸ{ýŠÞ¶ñ¶Ÿae=ÝÍ¥íÒÇ¢N¯²]›ž/÷’€Ø"M¶¿òÊ×}E¯xWU†ÊÒG¾›Zò§–V´x•üÝßwï|¿/þÏVt/ÝÍ«¬¤¶V𤠛dÜÿlÿž_çä¦x“â réж…<7…Ä­i(ù[oߤñ…ák•{·k»¸î'·i[jýªvßûßööTz‡ƒ®å¹· yq{7Ù–5vÚ¾S/Þ•?Új“HñÊ<÷‹¨\[}•{höû·´K÷ٿ¬xæ)¯4ø´ûÈ>Ëå}¢ååVù ÿf€ _O}£m{›-%‘Z‹ï¢¯Þÿ¾«3RÑîmµMI‘¯nm7}©÷7ß_ù÷ßüUnÃÆÑYé/>¯<kFýïÙ×~Åo¹TµÞ^_êd¼‚{_ôtG‹çyê@é|%äxy<ÛëÕn%±ž/*ù·¥¼²ìÙ*´›>_÷éÞ¼‚i+|’ù¨»ûÉT¼1öÏïŠÆ ïî ³–êéÑv|‘ló_æþž³/õYt}sDž »ÒñQ·ÿµ÷ÿñÚ¯°c(û§êŸí†û> Þ·ñíÿÛW¯¸+áÛ?oü)CûžSé+×ÝRøbmKá?8¾?Ú~ hñ,SÿiÝkÚé—ö©{.›xÒÅåjgo•–/ïÿúðÿÚçM¹ñV±à_øFkq_ßÛßjÚÅœZlZ¾£¢½êªþëý#vôweݳøŸe}%û>x{Kñ?Âã¤_‹™4»ÿ·Ûßy_ÇgºßÍù÷+#}Ϲ^kû@§ào¶µc¢}Š+«;ÿgK+ïÒ>ÕÇ7æóv}êâѶ/øò>l‡ö{øß üºö–Ÿ÷µÿãµô¯ì÷àÿø'á¥Ý޽¯hÖ~(m[í }pÖ÷[­v.ôù]öÿy¯‹tج4›‰ôÍ-WP‹ýU¢*&úÇ{mCû[J‹þè¾Éuû«“e»ÿsîWÑáñt°òæ?ü›þÉR’©T}[xú½úùSø³Dx¿¸ñ@ÿúW‘xÿÀÚž½â;½Ñ6¥dê‘,Úvµgeßö"ù+Ëá›UM'[¹ÿ„V$–Ö]–vû×}×ϳÜÿËZYê ©hð/‡ {{¨·ßÜnM–¯ýϹóãµµlÂŽ"<²þMÿ˜á%Gtnø3à#fÝÝ߈ŸÊTßüh¶ÿÜ®Sâuž¯4Z, —6<òý¦kÝ—oÈŸ2·ñW*šŒÑ¿á#ñ7ûé_üji†ÿŸù7ü”¹O?ø¦x¿à·‹m4x²MV[«e½û_‡¯Úâ$Vw]Ÿ2'Íû§ùܬû?ÇâϦ•iãÝ~ÎÒí’$—V±i~òüîé¿Ë¿û¨Õõ½¶½£n–Ío.¢µß²o“íªü¶ü%¯AâߣjVŸmqt¯åŒ?:/þÍ\u=ù{¿ ¡ìŸ²<7ÿf=EôÅÓ|}uxð>‡ccsö7Ö~E‹b}©SçýÔ¿.Ïùe_<þß±Iþlñ-ïŒ.-t›«Ø¯µA.ž ´,·Åº/•¶#ºí¯£?g½ÇÅ_³÷…ôÍ*+øL¬.n?±õk½1oâÑ®¢º¸ùßû­±ßoûõó¿íÙgá×±hšð®™e§Ü}ºÝ,ÉåŸí¶¯,±'Ýmÿïÿ³Q!r›ÿ4½[]ðö©§è·ö£:í†ý×r@ÛÓÿdù+çߊñ.›âí ÒûÅ—zÞµ}c:ežŒ’­Œñ"}¢]ßíl¹ó|ÿìÖµ‡íWgâ{Èm¬lu û·Oõ6ö»÷ÿÀ7ÑûQb<¾mÜ/÷&TGÿÐé O†ÿ¼Kãß_^èÞ1½ðVŸsx©c§ 7Èò–/õ¯µ?¿»ø?‰uaüBð¿‰tOk¨kzöøŸT]B)%ò¬}–ïöþEdûŸwäù«µ°ý¤%Öô8µ¨,âû;·•þ—«ZÅ/ßÙþ©¥Ý·ç¬{ÿÚÅ´­_û=´ø>ѹ~xu>ÏÿUöÐQ©à…æµá½ R—ÆÚî… j?Ú¿ÙRÚ¬M¿ðZìßÿØíþ óío¾#ð®·¬@±x£Äé£Oö©ožÍ6j‹>Í‘åOÿ‹øþE®šoÛ MIówoæþåâËÿ Töµv‹x¨‰s¥Û/ý#¸Ð繃R»·‹|öúËö…öÒX¾U¯`¶ðÝ…¯ïü/ª_Ëÿ=®î¶|¿ðÛ^µ ¶¥XóFG-Jüžéò¯Œ¾é³iýõöµy{s$W‘Z}´.ö‰>X¿àß®Wà õ½cÄ6ÿði:…Ä¿ÛW×Ú_r}Íå[¢ÿwîµÿ|W´þÓž&ÿ…cà ëÚfŠÚn¡¨ßKou¤ÜÞ}¡â‹çØÿ/Ýû›¿àuóSþÓ>%tE]¹÷Z¸±XyajrÈÚOkc¾ñ'Á«m DŠó@‚ÿWÕìõÔ`·žïbK,»?ô •Ÿàσ’&³,åŒé¥iÐ:Y˧½çžtýïü>›åÿ×ÿ´oЦ_—Eû¿ÜŠZ‰ÿhÌÿò _ûðÕÇâ‚6¶–Ú,^ÓþÑ,q>—;꬛`—{Ë/ûß;ÿñxkàå¥Ý¶ª¾#ÓVÝ/ìÛ‚õ™þÆ­ò³µ÷kÍ_ã—Ž?‡Jdÿ·V¦¿ÆoÌŸñã?÷>KW§îè>*øMÚúÚéMªi70*ê qxû¶ÀŸºEÿ¾­xcá.Ÿs ¤þ(Óí®u[«Å½-%mŠË¿bãÿ2·^S7ÅÌÿñí/þÕøY~=Û·È•>oùáKÜÐSä¯ûw,ÿû-|ÿºv‘¥xnÛJºÔ¥fI­åýÔÕ®\7ð)óbåûù~Ãß‘÷.½þ'ÿ­½ö]ø±àÈ5´2ê·óÅþ‡p›'H¼¿-|ÿào¼Uaä猦´F—kùë²Ußò~õ¢ÚÛ6¿Ü®£þ×Çïú ø¿ÿ"ÿãUϧñöræÿ·Og'Ä,o¬º‘Œ¿–Qrü‘îw?~%ßÙ½öŸ}snÿz¬mÝÿ®SRý–¾"Mq}i¥j–Ñ[À‘y6-kkæ£?϶%Oš¼ßþ×Çïú ø¿ÿ"ÿãTÂÔøùÿA?àrñªã¡…§J\ÑŒ¿ÚÅæONT刽þ?ò7|+ûx¾o¤±xWÅö¤ÿº»Ôu8’/ãùßä—ýöëÐîd/‰®›`¹žþ}b-ëÿ’õãŸðµ><îÿ‡Œ¿ð9?øÕ^Ö>-|k¿¸F³oØD‘Dö¶ýÌ©ó¿ú¯ãûõëûowá—õó>_ê”y¿üÿ‘èS~Ç?Ý÷[x–뮢Ïÿ Ä•~ÄŸ.YÖçÅö[?éÓ£ÿ觯/ÿ…‘ñÑÿæ!ãOü§ÿGü,_ŽóýãŸüöÛû’ü?Ì¿ªPÿ ˜ÿà/üE›ö øê÷ñ5¯í¡´ÿ–©4ìîßù ºoøa/‰o§^¯ü%[ïe]Lú´»"ù>û¢ÅóWŠÂñßç¹ñÓÿÜuÿøŠ|Þ6øÁ2n_øOömþKÿÄT{i$¿ó/êXoú þÿÈì&ÿ‚}|{…ö·Œt½I?¿öùbýZºoü‹â|×ñJÞ1ƒJD‰¥K¦y|Ýï¿fßáÛ^Tþ-ø²ïóEñ!ÿî;?ÿ¬Ö>8LûšçÆŸøyÿÅÖÑ«)}™~æcS Bòÿ›þÝä~•þÊÿõÙÛÀz—‡gž-cí—Ïz×i/Ͻ“çÝò|ß=`þÔÿ²åçí%«h÷3Ëmgoafö­ IJ·Ÿ¹Õþ}ŸÃ¹¿;^çã;ýæñ“ÿÛõÿÿ¬ËÏüFó^)ïµØeO‘“ûZó~ÿöÿ{U)©|J_×̈ѡÿ?òV}yÿÁñg…oÓPðý÷†î_s§’‹qo-º2Ï_7æþícÃÿÍø‰©OºòYüÿën>ÑpûÏûuáVÚ÷ïkêz¢|¿~]ZëÿŽÓóÅ÷?Z•ÿî-?ÿ¬ý¯÷/ó6Ž ÿ?ÿòSêkø%¬ëý«Å^ó¶üþV€»?à«üO‡ýŠ´oøWÈ_cñSýëÆ÷õþ.­j¶~#Ö剖ÆÒÛd ËK©ö>Ôûïûß¼ÿÇG´ËùÕ°œßÇÿÉO®?áÚÞDO7ÅúüJþ ×àèU_Z&ÏîN‹_'„¼C7üÃà›þÛËÿÅÔ3x3^ݵ|=ßî3ÿñuÝÿ/ämõl¿þËÿ>Ë›öøv›_Û'÷¿âg÷¿ñú¡©~¿ þѺçâµµ·û­?ÿ$%|ˆž׿èPÿàMÿÇj–·ðÇÅ•¼¿eðœv×CEòD¯¿wýuwÛÿÛUN·<¹eü˜Æ½ $)sR¯)Kü'Øöß°¯Â¿³ÄÑ|bd´Üȯo¨üŽÿ{fÿ´U+ŸØçàUœþEßÇY~Ñ»îlA½?à õàÿ±ìÞGÇ/…ú¯…¨Ÿí5û,Údëû¯‘÷¤±'Ëæÿ´ë¿äÛ\/Æ?†÷×ÿ´'Ä‹í#T‹MÔ.¼Myk§iðÀûçÿHÚï¿îÄ©½?нXÕöQ´e._ñ?/<½ãëÿ~̳w‡–á®~0jù»vùºµ¿Ëþål–ý—!ùeø‰hÿ÷‹ÿˆ¯ˆ¦ý—~##»7Š´Ôÿ~Wÿâ*øfß'üÎZ*ÛþƸêÉÎ_ý·üÑ¥O ËûÎcî{Ÿ†?²_î¼ßiÿ"ìù5ÿÇö¥Eÿì‰ üÞ1´ûˆ¿ÿ_¿ì÷ãôûþ:ÒSþßÿˆ­=ö~ñÌMöï‰ðX\'÷e‰ÿÜ5[þûE¬íßü›þÑìòïï~Ù©á_ÙÍÛˆ`¹î%ÕÃÿè)L{oØúùŒ[?ýµºÿâ+ä‹OZÞ›:Kkñµm¦Oºñ.×ÿÒŠÌÕ?g;FX¤Ô>,E5¯•¿ ÿÇh‰œ£‚û1—à}ˆ÷ÿ±í·ü¼ÄÿðÆ¥‡Å¿²%œ¨ð.÷_¹²Æö¾)Ù³AO½ñR?ûçÿ³¨ŸöuðâÍV_ûçÿ³«å#ý“þ}Ëÿÿ€}»ÿ ÿìó¬ZD÷?õÇGºz‹þ¿ì¡m÷|5w7ûšÅ|>ÿ<*ó|VÿÈÿÅÓÁ[>ù~'µê'ü»¦û}ÿð=’íÿ¾ŽPÿdÿŸrÿÀ¿às?ÆÿÙrýׂu'þïüH%ªðþÐ?³f›ª&§cà nAbò–îÓEx¥ÛýÍûëâË?…? >·xÛT‡û¿dÔ<ßûëuºSßá¯Â$fÝã¯ßø¿øŠ=ù›Gê?óê_øüî/økƒ~VØ<⹑Wþ|ø©k6çö´ø6ÿóMüI7ûöiÿÇkâ—ø{ð‰>÷ŽæÄþý|G{ª|û"Ⱦ¾Hn7$W ªÏ÷¿ÙÝò×#¤øí|â}ÿ«²öK…ší‰_rÀ~Z댹#ïDòq>ί½J<§ê/í½gsgðoUŽåtù¶}£lÑ@Èñm‰ÿÛ¯ÐZüüý¶ïþÙð2âñ‘Qî¬å¸ÙþÓZïÿÙëô”Œað£â/ØçþEËFÿ¦·éÿ¤õò?üÓ^ºðÇí#oªÙÿÇÜVºvÝÿq¾I~GOâ_ökëßÙ->Í¡ÛÅò¿ïoþçý»×ÇßðT{æøÛw+.ç‹KÓ6ÿ³û×Jã¡/ÜR4ÅGšÛ|uø— ­ìO¥§öl¶ñ,)ì6_)6|Ÿv±Óö¢ø—çÜ'úËyZ&*-Ÿ/ßþ ÍÐfóŸÄk sp÷Ÿ3¾×EH¥ù>Oï|õç—:¯Ù“P¼–/¿?•±äÜÎíÿ²W«S—ìœñæ=nÏö“ø›s.ÖŸO¶M¬ê÷Dˆÿøåu¶þ0Md—M>‰lŒ¿òñ#ÿèãÿ usGMN_ô{©e¸Ùü"þûëÿ@®÷^{ŸÜ\4JÏiÿ)î:ÿ~±(ÛÐ~0|Vñ “ÜÛj"~õ“d±'ðÿÀ+3Æß¾+x›PŸM7î¤V¨ßøþÊ¥à4Õï<ö8%o²[Î÷'ËòÊß}Ówû•¡ãŸ³x«á|Q_A³Uóü¯¾ëïÛòUÿ„\Çuû_üHK8¦ŠâÓÉgû¿e‹z·û_%jèÿ´ÏÄVÁ/U±…Èö±ñåúmüWž}`WûËwÿ_¿òº•ØxbmkÃz\V:C,6𔽷–—ÍIßOý±I}£ZŸÝ5Sö¢ø›sòý²ÉvÆ!oþ9V4¯Ú7ân±¨¥‹jv6n˽f–ÙÿÚ•ÁkZkx[IžyàgŠ+ϳ·ïWÍo¾ßwþ]¯Â‡¶›ÄÚ¡yg•:Ëp°Ë/ßò¾TßÿÞÿð Ö2‘—1ÞÍã?‹0ùMuâ]"Ûð<_qÿÛù*–•ñ â~·nŠ´´wgÚžW÷_o÷+ÕtßZ¯Œ4´ñº…•š_þöÎ?çŠ/àù?…ž¹/‚µï‰ÞIlï-,ôÿ>]¿hºØñ>ÿÑ*¹ƒ˜óÏü]ø£ðõQîµÈ.wýß&“o÷÷m¬[ÿß4KˆbþÓTºþ5…“äܛӿÿm^½ â¾›öLðÖ§µ·ˆ-õo즗wß}ïýó¿cÀ+ç]çÔ—SŠvùà³kŸûñl¬ù¤Yë¶þ,ÞYý¥¼Qwm.Ý쉻åþ*æ¬ÿiÿŠW›÷x–æ¢Vy_sü«ýúÚðÞƒ¯Ùø{L³³þ×þÌÖbK*Ò&ò¥ùÿï–oöîWžøŸÃðEªÅ.Øb‹S}=·ýôÛ½¶ã‰G0ǃþ<|Kñ†¯öøJ5 gãMòÿ¸›+Ò?´¾)[*,¿®~Ñ·ýMºÊÿúÞ¯<øý•áíSí7lÿjµkˆ<æÿogþÈÿ÷ÝzÝž·¡ÛxyçþÓ¶þÛ¿Y^óΗä‰7¿•À6nÿjª<Äsg†ÕûÜ|ˆÍümü[~Jå¼1a¥C¥ºêºõ¶*nu·—›»û)òÓ|âiz²Asvžm­ä©ºóí‰ûß'÷+›H¶{÷óežwoo)›g”µÕXx2[.âyo4´ß?˳Q‰ö¢¦ÏŸç«~!ÑÖf¸¹–ëO{²£ª%åºE÷Ñ?¿XˆãüáYüUâv`m’¿ú¨Y¶"ÿsüÿr½µ>iSE¬-¶‹§ÜÝÚª<îòýÛåMˆ¿úWà9®´y^ú%´w–wI~Ï}ÿÉ÷_ýúÝÿ„ªóM¿x¾ÃöŸ7ç•ÒZÒ<¤JG9£è:,> ÔóLŽòÞ/“b+ì‹çûõWÆÞ‹A_"ÆÚ7²Õ?{íÞÿ/ðoûßÅ]ø‘´­^öûL±WûGðmwûõ…â\Þ_è_l³Ùn·ßjØêßwzoDOûê—ºYÆÙÙÚ_i!]¢]êÿìÿþËWôKkk%'h£Móýž+t]ò»ª&ÿ’¶oÍÏ¿ø*%Ë„"s6¶¿Ø’ê7rÄ¢x÷E2îÚÍü_ðÝ]ýïµ^ÜEtdX˜íM›~÷ûÍü?÷Ýgx…"¹–á ¶dvŸæy›{ýÏã­?[jw–gØÁ5º*?ÎßÅóüõÄ–Ñ&—iPiðÅq:§•¾]ŸßÿgîìÕWA†Õô¿*ûOì·lûFß«)!Õ]ßw‘òýï¿Wv_^X"Á<Ù'ÜO)êýÁš~ñÿˆ>ê7zŸ%³£¿•]¯È»¾ã|¿íW i5Ͷº·—é‹ÿ5Ò;ûÛ~÷þ?I~÷C[Ô[•{ˆ"Hšh¾çðãÕùn"‰eŸÍx™R'áÚŸû-sÇF•IT§zG¡[ˆ¯F8zµ9£†&ÇŠ®[û.ßw—û©|ÕØ¿}™ßþýnÿyÞ«ü:ð‡ü,¿‰þÐ%¼kí)âµûB.ÿ+t»wmÿT¾-yÿá´iü·w•vºE³øþåu³J+þÐÿ™WgüLíô©+¢R”/á‰úwû[Ø-·ÃË+õÑ[ï·ùÿ-µ÷^káÏÛþDؿ뼩ÿŽWÜUÜÞ>"ý‘Sf—n¿ÁçÞÿèõò¯ü ¾7YÒ¦–k_nVûÈ¥ƒð"ýßö·×GàÔÖUð¿Š4Ÿ³Ä¾oö'‰%HŸþÙnù[þõ™¡wGÓlïôd¼¼V{ÛæoøÈ´ÿ[h:&›¡Xùwpë±n½Õî¼ÔŠ%}ÿ" lùÞ®}OüÿC©ø~£ýãÀµ‰§ÕbñW•.ô‹Q[¯&oÞîùÞ-ïýæùÓçÿmëCD³Zè—×ÒËö6éâ—ìë±íâ—çß÷~mûëŸÑïÃÞ!u¼ƒ|M¾ÞòÝÿ~ã¥zDЯ„¢Ñ ¹‚ û}e¶Z¼¿râù]åþîÏî}íÉDBGÒºWĽzçÁZ>Ÿ¯JñZÁ¶Ç•±¢ÿgäûÕ‰ðã6¹ð®×L¼¶H>Åkxßñ,´‚$–ãûèŸ%|ïá»ø¬5ˆèP|1øcÿ ·Ã}?P‹ÄvšjZéÉQ"´¾mÒÿ­{Ÿå_àDMµó~±yý¤|F¶Ò¬ÒÁyö…GŸl^V÷‰þoî£:W¿| ð§yðÞÑ~ÆÛõv—È‹rotd}›Óþõòü?lø{âk‹këfw·il¯­&þ$û®Ÿçý†¢@nø'X±K{-WQ³[ËKY^ßQ†eû©/Ï¿ðÞŸ÷Å{Wön•ýþ‡£Ûí*á ]ÿÄדÃá…ø{=½Ì ·ï©DéSEòA}ø®þ{ÿ±ü?z¶aÑÛA¸¸—Cñ¥á„XYa†'¸‰7#ìOï÷*â[à—–mtQEy*K/É*¦Å]ÿ}ݾêןøóÄ–:•îí)VïLÐ`d[¸¢ÿËÉ~_—þÿøåWšÿLšÕ ÕüK«^"O¿þë¶E¿b|ï+>ߟï[¶¼•î4ìé`Ò­-eþеšßäM.U¿pÿÄ¿"}ÿø"O9Ò¦ûƒ{}ýÿ*Ö/öŸ~çÿÇÿ¯KÓfµO†š³nK¸´ï5×äù‘ö|ÿwsÿr¸­rÊçZñjiÐC˜¢¼‘SÏwmïq±~UVÿÇWmzˆ|-Ÿ„µYv¬×kcK6ퟺ‰Ñ¥ÿÐ7Ó‰Gmû.ßÚ‹Á ÿSm¯ÉÿnÖ_í‹ÿ ¨#+¤kZ¥»:µ©=zwì™ðºîÓö†ðªÚ®“å\jºúÅöõóV/³ÜAå2ÿÏ}ß7•ýÚòÿÚgÍOܰ+=Žþ³qÏŸ÷«¨>ÏüeZ/»""q:Þ¼ßð˜yºœRÜý¡mí_º&ý•ÊèúÆ¥a¯^éúœþOÌÖë³äKyU÷Äÿ÷ÚãõÞøóÂW:$ïâ)¥›Êù.¡ÿ¦_ß®~³šÝ'¹_øœ$KöX®äò¿åOïlûŸð ôTø½Ð‰èº'Œ×Už&߇ˆíWÊ–Þïäßþå6ÂÚ+;û¹uYWMÛ,²³¼è‰÷"þ=ÿúêáõ·Ò?²ôöÔç‰îå•‘¦¾iwª*nùö£µcý³C¶ÒôùÛJmJ/µ]$IqtþVåH·»ü›™_þD¹‚&‡Œ5¸µä{—û ÕþÕ}}å2%Ãÿ'û?Ýÿ¾«ŒK›—¿»¹¼‰¡•?Ò¥Oîq?ô õ9¿·¾'xrëS[,4ý!¢Š+»H¾Ë¤Úü›<§þó:|ßÅ+2W ­Ã§ÜÛùºBËý™ïnž_õ²Ëÿ=_ýŸîTH³CÁèÖqZ4¶ßiò¥ûG’ÿ:;ìÛYþ!íj ´vÖØ¥HWäß÷ÿô=•Þüð{x’òö}KÏDž$•a‰¶:.ôùþãÿ·Éü_%a|Eð­Ï†üsvº,RßÛÝy[­ßï¾è‘·ÿãõ¡Ìsþ†óJWû/înTx“ûÒ¯ðßÖ»ˆ|U¤x’_6{È4}Z/õö÷m±þ\|Ú¬ ep°O×jÞT³#{øýŸý ýÚÂÔ®m“Wò ŠI´õUÚšŒ÷>ºÿû=Q'u¦ø«ÃÚ î«}sþ“¬é'Îìûÿƒø¹XZÜ:­ÌQxS¶k>/+I±¾±Ï_÷~ÿÏüMV<yc¨Ým“ìÚ ¼­?ÜùÓzºlùïU [;{­gP×ÊtŠYþMÒüÉûϱÛä­[ÏYÙø¿SÒ§Ô×Mð­”òÝ |Ï´Kïû‘ÏY_å_ü{øiú?‹|émþÌ­ý™`òýŽÅåÞöèϽÿàOüoW„ŒûÿhïÄìÒÙÞº¶ëybù‹moP¹ð寙¡ÅÚâÿZò²£ÊÛþä_Þ®_UÔ¯<ÝÖÖlŽÛÞ_7ý!%vþ4ÜŸ/ÉZºn¤öI,±6Ëy~TÚ‰ßþ7þ*É×l-´xtý+M¹]^öV }woó£Ïü0Eýí¿Þþ&­=;Dò5/"VWû/î§ØÛ÷Küiÿû¿ð ³çEâÝOJÓþÍwu/Ú7ÂÌ©kýÿ+ýÿïÿßwÃÞŠo*>8nݶE ͱ6}ýôÏÙ¶›áï¬ñ/š×—^lOÇ_)Ñ6?÷¾ãÿßu·û4óö‡øi·øµ;Wÿɤ¬O"äiö¿jŽo*VÛñÄÍ÷ÿô Ýý˜÷?í'ð×þÂ6¿?ý½%]IDŽ_tý;ý°¿á‹þ¾¥ür¾ÞÍ|Iû^¦ÿ moùëuÿ¢«íªã©ñ1þO‰ÿeOø÷Mÿóù{ÿ¤ñWÏÿðP½JçJý£¼)=ž¡ý›w®›uÛ¶GÚßq¬ü4øky?Œµ‹»¥xeKÇk—çFû¨Û¿ØW®öÿá_Ý<³êºƒË÷>îW¡ÍÄåæ>oÔ¦Ö¼1~özåšÜÛËóµßú¯÷âuû¿ð étGðÖ¶“Ùêú–ª¬¿½±Õ­VâÝÿܸ‹æÿ¾Ò½Vo€šeä¿¿žægþüÐoÿÙ)©û7é_>ÕÿíÏÿ°¨æŒC˜ðù ³ñ Þ§ˆgÒ®.¾v·±Š_5Wýÿ’«é^måÓÛhqGaò¶ëë¹SÍÛþÇ÷àš¾Ž¼ýœ­µ+6ågš]ª›þÃýßø1?eÛmÈÑZÜïþø—=Gµ/š'›øKáëxæóOÓ™šþâ×ç–úoôÝq÷}åÿmþí}kðº¯<¨D¿b°¸Óbólí%¼D–ý_)Ò$Ùó/É»þø¯'ÙïZ¼Ô¢¾VÔ>×n»"™,eGDþçËþýhYüñT2Å<Ú›âVòŸì2üˆß~¶JhŽcø©ðZY´›XØÚ^:£Ý[½Òl–u)7ÿµ»ø?оyOj÷­xËsö©Ó¬u5Þ’¿ûiü,ŸßM¬µõmÿìýãnÂÒÆú ^þÒÕ‘à†k;‘6ýÿr¢ñ'ìµâ_k—Ö¹¡êš–¡pÞl²½Œé½ÿà5—4~Ì‹æ>mÑæð-åÂ5̺òZE¥üsÄßút~*Ô¼9meo§©êmµºóVÆÆÕÿÕ'Þ•ßoücÀ«î~žMßÏø;¥½Ç»¦—ÄW‰.ïïìþÖ‡ö?ðæ¥¿í? 4I¥_ùmq­^ïür«˜gæä:’ëÑK¦éòÛx{Jٲߴ·w ýÇ—ø¿ÜM«ýú÷/ÙÃöy^9м'w$v6V¶ï{æên‰w-ª¶Ý‘D¿3E¿ýïãþ ôŸ~ÃwŸð”^ÿex[;-ߺ‹OŠêê%ÿuÙþjéfý™¾"i¾*²Ö ƒ[¿Ö4è"·³×!±–+ˆSb"3|˳{ÑGí ˜ëlì,þÀúU¶½¤Xj <±hö3}ûÿâ—g÷v*oØõó¿ÆYßøgJø‘¥K¤Yêr³Y-½Ã2~÷{¢:nùY“gÊÿîW­¿ì»ñþñ/'Ò<@÷hÎépö«½¾þÇþ¨ÿ±çŒïÙ"ŸÃZÜÈ¿u&Š-‰þç÷iÊTØø^cSðf³wçŸ ²Ëþ™c|¿ëßFþ/öéo5x“Pyõ +PI[åW±¾ßþçúÔjûªoØÃų\y³ø_W¹ùí4ññu*~Æ~(ÿ¡NûþyìõŸ´cãy¯ü9 Þê±_xWRÖ5×m‹5Æ¢ÖöQ|‰³÷QE¹¾Oöê…žÿ*YÞùzfž’«-¥³Åïïomÿ÷Ûîjû}?c„äúí¨ÅÿÅÓáýµäo›Âv)þþ£ÿWÌ3ç}Dð÷†ô»{›=jÆmUWÊû;¬®›?7²Àê߯?E¢xìËci©¢ì–úÅ‘6«;¦Çþó}ÍÕôz~Ç:¿•¹t='ÍþçÛ ÿâë#â_ìUâ¯x]4­!t‹7óVVwÔâ‹c/ð}ú|Ñ3Œ'ý”l5ý¤þËýŸsöFñËö“fÕK¤ùÿïêWûH=ô?<[}ý˜ßb²¾ÖbY¾IÛíËþõ~ˆ| ø ü7ð¿„§Ö–ñ†—x÷óÝÚ_ÁövÿÚe؉òy+Çþ.þÊ>(ø…©x£ìwž†ßT¼º¸Š[Mw¢Jïü?¸õ\Æžñâþø]âørËU³¹ÓïâÕíÄú¼RÄ¿Ü5þïÉ\¿Ä/ØÃÆoþÐÒ­´¸e¸—k$ºý®Ævþãù¿z¾¸øoû-[xWºf•­i^Õn, Hšá5§‹vßøuwÿ³—…fû?‘¡évÛ%W—þ'LþjÿsýUDŠ??îd/Œ÷0[îÐôg‰WoïµkÿÙêëþÊÿ¬ôm*Ö èÏq÷ .ûË'EÝåltÝ.ßàzûÏþïÂsDŸñMhHÿÄñkOÿ²PŸ³—‚^$ݤihû¾w†úáÿö•@Ÿ÷?³¯ÅiŸÊÔô6Ô¢ƒýB>¿eåEþä^nÕ_÷6ÔÏû?|A¶²²¹þÅ‚òù7yM¥å¬Inürüÿ½oö>eþûµ}úÿ³_åû ÿë¼ïÿ´ª£þÌ ûÛWýÍ·üj¯˜Ÿ|ø’ÏÁ>4ðÃݲøOθŸN–×ö²þé™?Öü²ýäûÉü5çþ$øuâôÕåž]Ío+ª+½äNíò÷«ô9ÿeß üŒ“ìÞ¿Ág;ÿí*?á•<+³æ¹Ÿþ§KWÍ~^x“àψá¼Û§èw3Mµ]‘6¦ßü~¹Çð—Š´ͼ±¾°tÚÛ<Ô¯Õ¹¿eO ù»¿´'DUû‰£¿þ‡¾©\þÊþß»û_RDÿcG‹ÿfzį|üÏד\ÕZÒxš_7æÜ‰*#¢où7ÿãõgg­i²îþÊýëËo5Ò¿Qá˜ü È_Yÿ€i–©ÿ³Ô©û6x3äÿ‰ŸˆŸýË[4ÿÙèç¾~yl6›¢ZYø{N¹þØ¿Úúî·¨|÷®äÿG·_º°|Ÿï7ñ>Ï–¢{{ìZ¶”¿d½ºŠâ_ô?Ÿ÷[öË÷ßîWè—ü(ýZçÄÏ·ý«T©¿áK|>Eù¿á$÷ï-ÓÿdªöŒÏ’gæ}·„µäiUôY&Gÿ¦N›ܨføcâ›ÖÚUÌ)ýÏ*¿NáøKà 9~[;·÷õÿãUü(ðÎßðks¿¬:í*Ëœ¸Â©ùað‹ÅöÓ¤«¦I³þŸû=iMð‹ÅW7WÅc$¬î¾k+:×éü+?üÊwÏÿ]uùøŠ?á]x ŸñD¯÷?}®ÜñŸ9|•Ψ~øÇz3}›z}Ýì¿'ü®Ãð»Å[ÿ{=¦ÍÛÿzWèÞ ðŸÝð.šÿ÷¸z«ý›àxæBÑ?àw’¿þÏOÚÄeTüéñÏÂ+ë;7¾‹Ï¿¸ÛûÔ‡ø[ýökØÿcÏ Eyã‡÷×–Ëö¸%1òôãéU.î¦>Y¤_£E¤JûF ëâoøþ¹ÿ¿­þ5 ëÚŸÏÿ¿½ÿ=Ûüh¢µ,‚Tù¿âewÿÛüh}Tÿ •ßýÿoñ¢Š¨•öH¤×õ=©ÿ¿¹ÿ=ÛüiÓkz”Ÿé÷_{þ{7øÑEkK ª^lÿ¹ÿïãIsu?Ú¿×I÷¿¼h¢˜å±bÉŒ‘|Ä·Ëߚз‚)"}Ñ£|ÝÔ(¨k-*É’ÙÀ~±/øVÄ:»þAö¿÷åŠ*¥ð‡Ú.ÛhfßùZü°_ð¦>¦}ž/ø–Úß…ÿ (¬‹.I éŸgOø—Z}Ïùà¿áL“BÓ~ÌŸñ.´ÿ¿ þQU‘Sú]Ÿuþ‰ýú_ðªÓZAóþæ?½ýÁEœ„gOkâ5½ì¢›aþ¢Š)H¨–··Ëóδ²~NMT·îÛåùßnõBây6ÿ¬oûèÑE_Ù6‰O{oûÇó¬«Ço2_˜ÿz(¬‹‘Ìê·Sy¶Ÿ¾“î·ñt—s¬QbiÑÍQˆ¸œ^­ªÞ«¾/'I[ük™»Ö/þoôëŸûüßãE¤jd>·¨ÿÏý×ýþoñ©?µï¼¥ÿM¸ûßóÕ¿¹õ¢Šä‘q(Üê·¿'úeÇýýoñ¥þÓ¼ò—ý.ûøÆŠ+)&¡u7•þºOûè×;s<›ÿÖ7ýôh¢²4ËÆ8^OúÚÏši<×ùÛó¢ŠÎEÞÛ¾ñû¾´Ç'ÔÑE`1&ûÿð*Þð÷ÞJ(®z¥DÚÔ¿Õ=~QEtåÿO—äqcvÿÙ endstream endobj 6 0 obj <> stream ÿØÿàJFIFÿÛC     ÿÛC   ÿÀ"ÿÄ ÿĵ}!1AQa"q2‘¡#B±ÁRÑð$3br‚ %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyzƒ„…†‡ˆ‰Š’“”•–—˜™š¢£¤¥¦§¨©ª²³´µ¶·¸¹ºÂÃÄÅÆÇÈÉÊÒÓÔÕÖרÙÚáâãäåæçèéêñòóôõö÷øùúÿÄ ÿĵw!1AQaq"2B‘¡±Á #3RðbrÑ $4á%ñ&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz‚ƒ„…†‡ˆ‰Š’“”•–—˜™š¢£¤¥¦§¨©ª²³´µ¶·¸¹ºÂÃÄÅÆÇÈÉÊÒÓÔÕÖרÙÚâãäåæçèéêòóôõö÷øùúÿÚ ?ýP¢Š(¢Š(¢Š(¢Š(¢Šfÿ›m>Š)›èôQEQ¿æ¢€ (¢€ )2Ç÷š˜÷#mi”À¨j*/¶Aÿ=Sþú¨_U¶FÛæ­[¢¨¾±&íÛÿܪ¯âHî¬ÿ 9Š+&/,ŸòɩϬº}ØWþú ŽcRŠÁ›Ä7(¿º¶WÿS_Z¾x“jà ·÷èc ù©›?Þ¬TÕnQvÊÑ»ÿ°µ ×—?óÕ¿àAÌt?Þ£gûuË¿Ÿÿ?2Õy¬%›ï\Ïÿ}PÇa³ýºnø¿ç¯þ?\¼6Í íÜÏL{e¼µ!Ìuy}éÕ?àTÏí‹?7ËûL[ÿÞ®_ìk îU¡áÞûš¨Žc«û|óÕiÆæé"×%öfß¶ }5]¾}ÔÇœ¿ÞZ7§÷–¸¿%¼­ªÛ*8lå…÷òÿßU!Ìw[×ûËL®á¹wýÔí³ýº›÷ŸóÖ_ûê¨9ŽÖŠâ·ÎŸry?ïº>ÓxŸ7Ÿ'ýõEƒ˜íiŸûÕÆý¾ûþzµ95+Í»¼Öÿr‹1ØmjÍ\}·ˆu ¯º%O›øêSâäþÿêè®eÙüõZ9K%ÙEEöÈ?çªÐ“+ÿдS|åþòÒ$Ëýå `QFê\ÔsH9ÀOø*üŸOÄÏû†é²ÒŠOø*7üŸ_ÄÏû†é®Òа?(ßE–!Ô?ð)êõ‡Š¼K ùPx‡WÿodíG³köeµ‹]ßk„/®êƒþM3þ"ÿ¾«ñÖÛÇž/³Üx‡Yÿ¿®õ«ÆŸX'Ëâ ïøµÌ=¤OÖ©¼ac }Ù_ýŨ¥ñ…š õùu£üxø4-̯óÿÿ[¶µwm¾YnbwO‘·«ñt{0ö‘?GSÇ.ó²ý‹÷?Âû©ïãoúvÿÇ«óÞÛöÆñ·Üh,_ýýõ±mûlxªÙ6Ë¡é·?ð'£=¤O¼?á0þì QMâ{çWò¢%þõñ=·íÏ®'úß ØÿÀ%­ oÛªñÿÖøNøÿý…¡í"}†šÞªö»geGÿ¦+Eµåòof¼gÿaëäÄý¹"õ¾•?ÜŸÿ°­;oÛ{Jÿ–¾¾OûkG({CêT¿ÿå«P÷2ïù§jù²ÛKÓ­Ðï¡ÿV…Ÿíá ›æ‚ú÷öTrËí´>ƒŸþ[ï¦<*í¹—~ÚñÛ?Ú‹Á7?zñ“þºìJضý¡<7üÅâO÷Ù(cÒ//â³Df‰Ÿw÷¬$ÛÓw•³þ\`…ÿ‡þR¦×û»kŸøyÕÕ®e}µ7Åi«µb’o›ûÔ{94NïgûJ•^gÍe‰ßýºá.~=éVkû­)Ÿýö¬¤ý¢•þeÐㆯÙÈ=¬M†æ –ùYªÛÃýÕjðýKöŠÔÒXUlâ…ûZVßµ=KK¸ž%Øñ}¨öAí`zòYÊßòÉ¿ïš!°i¾Vƒgûõà?ð²5«Ÿ5§¾dM¿ÀÕ]<ðö•þþæåÓï%yì:õä1mhoøqÿØöûÙüõO=·­mJ¬Ïj³ø‘¤\¾è —ýÇ–´ÿá?‰×jéñ¿ûõàéö›?ùn»ÿÝ«Ûw)ÿ/’ü¿Ü«öQk#Ø5‰ÖÚt¾DCµ»^‰àÝBmSÃ67W_<²Ç¹«æ;i“R}Ó³?ûõôÿ†vÅáí5þx%qׄcðxyJª÷Áïø* ãöèø™ÿpÏý6ZQIÿCÿ“éø™ÿpÏý6ZQ\gQû÷EZòäYÀó³ªEîwoîÐäÇí›þ6x·þ¿åÿÐë̶+¿Ë÷ë¥øãý+Çÿ|Wy§´¯i-ô®¯·ï¢½qWšÜ½–)á‰×åwZì3ŽF‚mO½Z^×›ÃÚ§Û fÙ·ÊÙþõs°ëÖΛâÜéBx†ÎgÚ¬ÈÿîUÆ™™Úèþ*ŸMm)"fßg,¯ó¯÷ª“ëlþЂV]·òý¢_Ýs‰ªØ¦ÿßüÿÅ÷ªÒkÓlýüI·ûô{1û§C ë:T¯•s-·ˆ6ªißóËýº®“j-ºú }¿~ݾýg¤Ö{7y±>úµû¯“Êò‘?ߣÙÄÏÝ,À¿à"od]´lWù•–„ù%O÷¨å4Jðè_Å-äW6ÖÞS2,/ÿ»ÿ­t­qà‰¼ý?d¿uö²V<Þ!¹Ðe–Åt;»ôvwY­öÿüŸÿ "x^Ýo4]Ißþ™EòãôrˆèÓDÖž/ù‡¿Í÷Ñ™?öJ´šV®ˆŸè–ÿmßÿˆ®i>4øy.¶ÜÁ©BÿíÁòVí‡Å¯ Ü¢m¾–÷àj9GÌ[þÍÕÓïX«ÿ¹-=,57ßÿÉßø>úUˆ|m¢Ü¦èµÿÇ«°ð7<'¦Ëo=ö«p—K.÷ŸïEýÍ”Gßc‡û5ô*.ŸvˆŸîñtä¹–W–{9ÿ~ñÿÄøÛC–xV S»q¹Q?ñÊá,Ñ]~iàßìoÞ¥D¢mÌyâx†Å÷¾zÛ*·a¯XÞ~ê Ûæþú½z+Û~ër²¿ü +X‡÷ .ÕGÝ÷£”9Œ˜~O•¥Ùÿ­ i§HŸmÌ¿ð kŸÔ­¬înŸíÛ^(¬n¥‰6ýéV/“ÿ®^ÎóÃW6ñ5Íäö×~dò6RcÕ’óP…ÿãòçg÷üÚ»m¯küË«ßßÚà¼<šÚ­ç[Éo-ѾkwžTÝ]V± Z®£qs¥@¶ÿìÿjwÙZr‡1ÕÛxóĶßó»Oûk¾¶ìþ'x³oË«·ü}y'Ø5­è±\¯ýýßGØüT÷}›SŽÚ/âO)_}cËï1îß¼_mÿ/ÑMþþê»Ç_où¥‰ÿïºò/ %ä1\/‰u«¿7þY}žÎ'ÿÙêî›âM*Âþíµ5¾¿ÓöþáÒ$Gÿüõr£ÊDZÃûBx>ýµ£ÿßuvÚCWû²éVΟì5y=œÑ^YÛÜĬ‘\*J›þþÊlȰ¦æ¨å4=–ÚN_ùk¤ßÖ‚~Òlýî‡"¶’×›ø3á£xÛK½¾‹W´°Š×nä•~æêìæý›hom'•%ŠX¶¿ü‰F&<ÇÚi¦´É¹®U¿¹Uîa¶‡åkæÿ€-c¢O6i?›û×7ßÈ·1mdýï÷êÕ(‘íM'¿ÓÓåógøʉïô¤ºIeóþXI£¶ç¢kÙó.ú¿fG´6¯m°iñÕ)­•þ]«²±ïí–+äJ¿g=¤ ÏŠú‚#ùVÊŸð*uŸÄ]FþÂᙕWåÙ\ƒÂ»éЧ“÷~J9bÓ4ÓÅZ…ãþövGÛüu™sâ{èt9b–ååj³îS÷Oò­Yæ3Os{ûÙåÙ]ƒø†ÅìÚ%“{¯ñ×.ólùj›çÝG)Å‹9¥°‚â U]åþ4¬ìÖ‡fæÿ€VŸËO}¯V=Í´¿ò×îU±ªjܺÖ{í  ÿfåó[ï¯Ý«pí…÷/üµªŽûhI¨åê:§Ìµ47;ÿ†²a›cUèfTz9@Õ†mˆ•±m6õ®}&ùëBÚçÉþ*¾`4³î_}hË-ÛwÖ=ã˱Ûnôþ9€‰ÝvVdÓ*U{›ÆF¬÷¼ÞÕdsF‰s¾x¿Þ¯¯´ùéÿõÁ?ôø»A¹ß{oÿ]V¾Óпä§ÿ×ÿÐkÏÄ¿xïÂ|'à—üþO§â_ÓKÿÓ]¥ÁPÿäú>%ý4¿ý5ÚQ\'yûû_9þÝ%Õü9ðUÿ±ï¤°–úém%–ÚþS#+æOÛûþHÝ—ý…"ÿÐ}“ó6ÃAƒÂ»ïôuÓgþÏ^(þ*ƒU½¸‹P¹Ô&·oõ¤¬ûkècM[ýö&_ù`û߯•ì/Îéî|ÞÁ-{£îž]Y…‡†×Äšö~‹¨^Û]íßþÛÿC¬ù´x{Ä×,º’¥ì,¬û·¦Ö®—Gñ=Ž«­éíö†X"wÓøëWÎñ5Ä¿ë·íï%_)—º^†ÃÆ{‘¿´íûëÿØVÇ“ãkkÛ{iìì¦{…w‰þ_šg­ÙÛ<+xÍå7ÈßìµR4>4·ûK´ÑYy©# @s7Š-¢ýî‘ms·û’Ôךö¯¦ÚÚK?†¿ãé¶E²â­(|[g7ÙÕ—cʯYú¯‹n_\Ó4¦ŸýÂéßþúG¨,ŠˆW–Ð~ÿÃS§ûi-2çã„_éš}õ·ûÖíÁyåyR¯ïþH‘×øë âŒà¶ÐWËmm5ÅÔ±Köç‹çM¯÷?ñÊŠÛã5²2·ÙµD]¿'ËZßôÇùZ[Ø_þš­iYë3XE;4{íÕ¾ZÏñæ±ga¤%´övÎ÷R®Ý‹þÝXú œ¾D·’y¿ßò·¥[¶ø»áëÅܺš¿Í³g‘Rÿ Íoi<úE¦Ï)]¾ZÊñ?…|#a¡ê²Ï¥5¶È7ÀðÿH¿ð±|8î‘5õ·Î»þ{Zг×<+~è«ý›rû]÷ù[køoð÷ÃZ÷‚4ûëÍ#ý-·#~õ«BoƒžšTX –Á¿Ö£?ËKආ<»~ÍbèÿÜm• ž ÐoÑ%þÏ?ç•ÕxÏÃO…ŽtVvÕnÐï%ûÿ-oÃ=ì—t^(»¶ÛþÿÿWñ—Ôá¾íû¨¯aÿ®:‹ÿñu¡¥x3þíSí1K©MðÃ-ÓºèuàúÇÃè?í<&¾8Ÿ÷öhY¡•þO¿]/ü*/Ø&Ûoˆ—.‰÷žVj‰D£Õ|C êÅ­ºØê²è÷qoÛ40oߺ¹Ù¼%ãß5ÿâ½Wþ÷¦%p:õ‡Åoiq\Ëâ…¿·–x¢‹ûïó×@šWÇ[?5–X/-ÛýRy©½*9@ìôoˆ:%í½ÊøI¼x›z¤¶(Ÿû%hx’ÏÅž'Õî5 í´$–_žÞV‹ýóyÕÿ>2xV×ÏÕtæ·‰~gM¯Rø{öñÆ·§}²ÇÁßl´Ý²_™iÙãøªÛb®•i2mÿ–:œ©ÿ²V†‰¥x–ÃQóntï-<­j?Å\}Ïí'«ØKæß|>—b.ʱmû`h eq-Ï„çIb•Wb}ú\£æ=i wýÿƒ5´úw¾Oþ.©Ms¤[+íÐüL’¢ýÇŸzoÿ¿µÆYþÙž výÿ‡5(k«ðßí?à/ßýší ivïýòÿý÷Q(Ê#æ=7JE¶Òôý˱ÖGOîmJ|Óo•kÊSö¥øas½›Z¾¶Þß7›^¶ø÷ðÞý“Èñ‹&ÿàx³6>øo¬xjÃÚ®™®Aròß´O¾Ý>îׯ]›ã…ßR·º‰.üë8bG‹äujøêÛ⧃¦Ù·ŒàMÿß‚º ?éZ—ËЬ¦þëýÊ =·âïŒ4ÿE¢^iŒÐº+¤¶ÿÝþå|…ñSz|F–%ùßl_ú{´Êû<‹È®_øž¯ø‹­Û[|U»Šóø?ô ÒŸÄD¾ŸQ¿á<Õ~OºÏ^ײWò¾óþö$ÿÇÒ¾qð¯Æh><Õg¼Ôå†Ý.™%Ùÿã¯`ð÷ÆŸxŸTÓí´]qnnçº]°ù ŸÇDŒ~É÷FŽ›4»MßóÁ~OøŸ6Únšíýo¹·þé(wùëcÒ"¾ÊŠñ?†ˆf¡ß{UeLû7Ö%ûïG­[ôýëÖæíï@³:$´Çu¦Lÿ=Tó¨÷ðUÍ»‡¹ª÷/û§ ƒãýmB›ªÝÊlªHÿ%JO{•ÙU7Õy¦ Í7ÍT|íôÙ¦ªèÿ%\@&}íLß²àªO6ʰ-C7ÍVç÷µŽ—-¾¦I¾zëlþuFþ è,ô¦ûCÅ,°Bñ/ͽ«³ÔµWÔmìô­ûb_¿*yª¿'÷ë¾Õ_J¶µx"U³¸‹äŸgϽënSVgÓ4¤O¶_Dûÿ‚g©¯ô}2¼Ùg¹¹ÿ¦(¿ý:Âm*ÏMIeÕ`O´*|Ž¿v²µŠ>Ò¬¼©u]ò£ìÙNô)Êx“Mûí–±¼­òÅ7ß®}ìö|¿Ç^—áíKOñ樟ið¼÷öñZ¼««Jû6À+’šMê»¶;oMÿÝ­¹ŽiD¯áëfû}§ýuJûSCù4K/úà•ò†áWÕ,¿ëª×ØjlÓm×þ™-pb~#¿ ðŸÿðT?ù>‰M/ÿMv”TßðSÿù>o‰÷ ÿÓe¥ÆwŸ¾ÃïWÌßðP/ù#šý…bÿо™z¾eý¿¹øE§¯ýDâÿд?;õäßáýOoüû=|« -äïÜ7ï×ÕºöÄðæ°Í÷ÍÞ¾Jù¦—ll»ßç¯b”½ÓÇ©otõß ü=þÁ׬µ¶Ayop¯'ûuKÅZ%µ‡Ä›Õ³_&Ý$òSîodùë'ºÄý”«;=ÜLûßuu~0MÿuUþ~ïö(”‹Œy"gêP­µÒ3.Ï›gÉ÷Þ³l4HWKå’-‰äºüÿ2~µõ$i¯QWsýÿ¹òSô¨[}Âþ÷æh·|ߺû•"Öì¾]Ûö¾ïûïøê§ö ¿j·¾k˜>Fû¿}lxždH¥VÝò+ÿÀ>tÿ¾©–¿gui×ï}É¢ÿÙè­¯iP[$Mümóÿã•ÃëÞ¼Ö4Ûyí™fx›ïîÙ·mz/‹ÕZ3Eû­¿6ÿ¸õÏÂð%º/‘»,»_vÇEØÿ"Pzhí Vé·ýl í½¾O¿Y^$K›•´oÞoƒçÞ÷?{]Eâ DÛbDò¢þ-û>îT:RÄÒáWäu±—äOŸøèg¹¾û•öÉ>É,I+'ñýúÁñmýÍ΃¶wi¢‰>WO÷öüõÜ%„³i¶û Wt‰]¾mŸÇX¶n¾|KrÑlyv3Ü&ýÿ½û›?özÌðMΡmá«yí¯'ù¢tò>àÿj´/<[}…î-.emŒ¿,Ïó»ÿ¿[¾LikqµU"YåÚ‘}Åùë—ò[|«»ø_ïÿìôoá_ˆu  ‰m®ÑÒéž[ùøù»9¾+ÞYµßÛ­¼ç•¿tÿÀ‰³øë?GÓm¬ç–-¢Mÿ>ôùÿƒûÿÃ\ÿ‰-¶\\?Êéónwùîbh>'ºÿ…“o¨,L÷{]×ÍÿsøëØïþ.Ä—öó¶Ÿ"iñnKÉ·}ÖÙü \<>¶³×4Ëå¶•%–VFÞß#¦Ä£^³ò|Ö—võÿ–»~x¿ÜOã |Tñ„ZÆ©£ÅÏmi«q<»ö¾ÿŸÿ@¯h‡ãf‡a£ZOr·hwû?Ùÿýÿ÷kÁ/üý±[ó gŠXR}’»ÿ}ÿd¨öqi#é9¾"éWþ½Õt«Ÿ·Å¦ÊÑNŽ¿}×ï¥yìÙâ}+^øãinlmÞñ‘àK´GÙó¿È•æ‰y-´Z›ÚÏDë*yÐïŠ-ßí§÷ª†>¹ÓuWûCO’iuqùvlûÿ½OïTû8‡1ölÞ Ðf¸um#O™Ñw¶û8·×Î>3Ô¼­ü_𕟅í’Þ ZßQ·ò‘ßzW?âÝsDK}N-zûíwM©»;ù¨Ûÿuå qW/rþ?ÒVX§Ó^y~æíîÛŸø”b_7)öÝÏìýðîæ_ÞøOKÙ÷ö$I^CûB|"øeð÷Âi]¬5 ÿãÍ-"ÿZÿÜzÇÔ¼mâ« gLŠMrt´°m–±'ð~éþK‡ÿö«Í_¶oµÙö¥Ø·¿ø©ÚßÇ_龊(58!¸K­í¯\}Çýïú¯+ef”N¯àƒµŸør d¹K ï)^i]öýúæ¾+ü:¾ñoõ¶³¾[;‹†Š%wþ’«øc⤠—Å~%ÔìÚgÕ5h­|˜›î»oùëºÖßÎñ¼¬¿'ïâÿÐ+x›{³7xHÔ%¶šöÿQ‹l¶ÿÜß__yË6õo¿¶¼ Æo~Ø? <ßõ[—äÿ¾êâsT§È~’Ã6ÄÛ»îü”;ÖzMçJì¿ÆÕa7ÿ{eY‰a&«£;nò›û•ŸöËo¶Kb·QhyÖ/î·Z¨“¤Vë³»¬I»æù7T‡)^kò™Y>}îÕŸ7†'¹‰%ßÏáwjݼ°¹¹²F¹o“výŽõVke¹ºó~TØ¿.Êãïü=²X¬üøžîQ+™¿¶–Ú_*½:e¶¸I[ç—kí—oεEô­ÄžÔµ->všâ×øÝvRæå^sË^fO½Pùß=X¹ÚîíY®û%­¹H,^?ÏY“>Ê–i™ÿŠ©;ÔýíUæ›cÔ¯T¦ïPH?ÏP»í¨žmŸv¢y™è •æßY÷3lZ±Un>ý3Îd©aùö5TGß÷«BÏnÄ­OCÿ„a¯þ}»H¹þÇÖé"kïö~zóÉ´M—²Áy­3ýžWF—s|ï]Þ•3^|4ñ…²³¢Ëo*§÷+Ξe›åU®n_xÛ›Ý-`ø^Ú)gžêîòâY~mŸþÝoxcJÑRáÕ´¼·þš°m¾ö틾ºmfùoûÕrºDeïõ¦ÍÓ½´,)o£¯ÈŸÃ÷+ÁïîvJêßÁ^çàýâßoÿU™lÿ€%|å¯_캸ÿ®¿-cB%Ô‘ÕxJå_[ÓÿëºÿèuöUŸüyÃþê×üßâ½w}ëÈ¿ô:û®Ù*ÿv£ña>ð'þ ‡ÿ'Óñ3þáŸúl´¢¤ÿ‚ŸÿÉó|Kÿ¸gþ›-(®3¼ýö+æ/ÛýÿâÓé©ýíEô¯§GJùsþ ÿñk´û¯þƒWˆ$~}ø†åSÚ®åûÖ®Ÿv¼3ÁúÞ™©_Ù[_h¶Ïå}ïÝ'Ì•ì~9Öí¼=á{¹î—ä•<¥ÿz¾wðÝÌ¿ðË/ñÿ zQºyR—¾{EçÃM?UÒ"ñeµ†Ÿo|–²¤MóüÛÛîwä®_^×´ýW⮪ö;žÊTW‰ßøÑR»_í[gøUöZ ÿÛQ>÷ÿ[þª_¹þÍxjj»ü[vÐ7ð¾ßöþzŠ~ùµMŽêýâûSù¿:nm©»eWÒ¯ K¤±òÛÍ•¢u}ß'ʟܬ¯¶/›¹›gÌû¿ÚªO©[mÙ*+¸ŸîUœÇk⢙>÷ϵö³ó¥w1mò¾Ó,.íýÝèÕËßê[â›÷¿Âÿð/ž¢¼¿‰JeÝæ¤¯¹êË=+ų*E•µb_Ÿgþ‡\ì×+ Z+KnŠ_’Uûß#ýÇþuþ±öŸ•¾ÝoGþçÉ\¿‰õ/'F´ù¼›¿òPasµímö²ïò"ùÑ~¾”Ýüífíb]éöWùýú̳¼ûJÚ+y“?‘¯ý÷Y÷šÃYµÃE,‰+®Åtù?å­AG jIäØ"´JŸ,_}¿Û¬$FK¯•Y%Þ›¦ûïþ·ûŸÝ©u-WýÕ·l—lI½þŸ}bjZ”¶ z±JÐÝÄžlIß_ÞÿÓ°wÿC¸‹ïËæºW53ù3ݬ»“j¿É÷ü¯“øÿ½Vôy¯ü4í>ç»ÜÏ+Õɾk¶~x•Ýv}Åù?‚¨“»Ñî~Ùç4¬Ë·ætMŸÁ\¿ˆãõÙ¿å—š3ÿÉýÏ⫾ ñRë^«w<»¢ó¶ÿ±üuK^š/¶?”ÌŽÊÌ¿ó×îû5t¯fÖg›göoßÊÿëüÔoÝ%Rñ&ß·¤ ÉZ-ë²]òÿ¾•KM׬fñ¦”±@—ó»ùзÉþ©?ñê—^Ý5üVÑ:»ºï[tþ/öÑÿ†€,xJeš-A fEò%Fx¾x¾çû_Å]_‰ÓɳÓ×Ê‘þïÉ»çÿ~¸x†ÏMK¥žùwϱE2/É¿gÜÙýêì¼NŒööQ, s.Ø“vÏ“ç ËdGºf¶šÑÕw§î·ÿßz½ÙíºÄDOæÝJþSË÷¾çÏ¿økÏ|æ†Ãí>|å"ݼ_#ÿ±³ÿg¯@G‹n±òÚlþÓ•þy?ÜÿǪ@âfÔ¿â]©ÜËsìimþÝ4Q¿ƒÊþ/÷ëׯ!o·éHÐluÒ`vGü}+Æu‹–¶‹P®¤ßæ¼_h¸‹{¢sgþÏ^ÇylÖ×Z?Ë.Úu¾Ýí½ïýÏö¨ÏkÝX²Ësm*KoóÃóÜÉ/û5Òé¿&eÌ›ï-]bO?î=TJ4<[ä=ïË*¦ÉwËò|‰ò?úßïVÃ{ {Åigy?Ûì§X¼«ybÿGOÝ?ú¯òµÒø’i_{nT{]ÿ;¯Éoò÷«?á-Œ4¦k–ýú«ïuýÔ¿èïþ©?‡ÿ¬d8È~ƒl°éÀ¾TÑE+ùVòE°ÿÅ\¦½Ïh7Ù“Í•âþÓ¸]èÿ½ûŸgÿÙë³Ó|§ÑÍhß÷¬þLßê“ýÏö«†×®U4®Z³Jíµu »åŸî<_û=G)q,ø¶Î_ø@b_•<ßDžOýý¯pÔ‘SÇ.Ë÷x¿ôS×xª‡À::ü¨íâo™îËZöÿŸÇ— ÿOIÿ =3?´z+º¤®Õàž0F¹ý±¾/ðnOýž½ÍÓ÷»kÃõè^çöÙøo÷vÿèULÒGèo²yU~â5mèè×—Q@¿òÕ¶W>ÿ%ÕÂÿÓV®ƒÂ³lÖì¿Þ­¥ðœÐø‰u/økÁþ(‹Wm?ÎÖå‹ìë2}ý•b*]yPX·ü ªß‰õ/'^•š™íÿÕo®Jÿ[ŸÍyV-YÇà:eËjmoS¿¼û qÂûwï¹¶ª¤:¬ÞjùŠ›>êW97‰õ4ÞÑ\´?ÁòVzkw*y³Îÿßù©Äææ; h“Í©Y^^^3Êòü±ÊíüG§ÛYxKRH-£·F‰™Ö%®ÀësªXíVþ/¾õè~.ÿ‘GPÿ® \ÒøÎÊ óâlù~ZǛ䖶5/¿X—/óר8äW™ê'zdÏQo¨„ϲ³æz±3Õ ‰D®ïQ;Ô¯U]è2%Iª¥ÌÔ<ß%gÜÍDJŒK 2£V…„Êê»ä¬/9êÂ^lTX¾ú/Ü­Mð7›s§xÖÙ~åÕŒRÅ¿ý—JáÓçŸ÷PHÿ/ðDõìvzoˆu†škhm£h2ºü××üò§÷䪞9øÓ©ø'Ñ}…´KB-±OöEÞÿïüÉXó)Ëè>×µ„Ýg¥Néÿ|W¡è? |@—ÿi¶‚Ù?Û–¼_Gøßñ#âˆâÓ4­e“{oò¢T‹åÿ€×¥øÃâDZ ÿg·Ú´{ö‹Ç¸Ûÿ}UóJcå‰Õh/â? ÞxÃU×,í,íï( ýþ÷uTÙü5ó¾«r³\|«÷¾zê/>0Fž}ÏH†|Öóu7ÿZÛž¼þæçý½û?¿÷Þ¢äŽÃáÓùÞ-жÿä_ú~€lùv×çïÂ_ßxëÃëÿOJÿøý~‚×6'â:pŸ øÿ?ÿ“æø—ÿpÏý6ZQIÿCÿ“éø™ÿpÏý6ZQ\gyûñ_+ÁB¿ä–èê¿{ûMôú¦¾Aÿ‚•ëÑx{ൕ㜲ߪ§ûÛ®÷ˆ—Â~Vüoñ'ö–¯ocþÿ÷ëi´Éµ}´X<•û }«gñËüuÏê»a•%¼fšîVwù꿃÷ÿmíÚÈŸì5{Ï–•(ûǬx·ÄöÚoÂËÝ?í-öÙu.>Éä+º¢£¯úßøy&Žñ;¼±K¾áþò=^ñÎ¥ý¥zñ|¿g·mŸð*ç4×—íîË÷‚¢…0”¹Îá/ó/%×çjåí®ZæòãPfù"o‘+cÄ3o²·¶_’_ùjõÊ&Ô—åjÛ”ææ=hb¹µî"ïùÿ߬{ho5‹û»›f]7šßî}ʱªÞKm¤ÛùM¾â]È©ýÔ®]&¼Ò·í•’+…ØÛ?k§˜ô¸n~ÙùMçmùÙë’ñUûMx–p&È—çoïÖÕµÌVz7Û72m_à¯?¼¼–k§¹Vÿ[ýöùêãp=JÝ5•º+üïÖf·~»Ò]û[æß÷?¿F‰r°èÞjÉûÕ‹ï×>šÄ©ª%Ìëç#3îÞ¿'Ü¢$žm~×1ZJ¯û¯#gÏ÷þÿþƒY¾!Õb¶µò•¾wûÛgñÑáë—š$•[dL¯ÿ¡×/âKÿ;Rÿ[½ÿ‹¢2çÜx?UgÐ^–dIÙö=X¼³+϶4‰¾Oþ"¹ÿ ÜÅ7Él¿ºþæÚŸÆz®ËÍ¿òɾwó—çû•›>Ö"K}Wnäß¿çþçÉZÝÏ“z‹ºT߯³øßäûûÿ‡ýÊä|1y2Å·˜ïqöãßþÅtÞ$¿û4·÷·"º7î·lþ?öª æ2mµ%ˆ6“À¿sägO÷+°Ô¦WºH<ÕÙ*ïÙú¦ÿ}ÿ½^[£í{ÔÔÚ_%ÖuO&ô$¹Šm/ÏiYw÷WÊÿ§÷ªùB'5â™ÖÊçvù ŸýnÝŽéýÊõ½nñ¯"²ù•Ñ•ço‘?Üÿj¼?X¼–ÿVx,_í·zù­ó×qm­µý…¾Ù-ŸæDùÓ÷þMŸÃþýD‚$ºÆ«,: ÄðO>ù`T[‰Wçþ?¾•·àµç‚Ý|õýÕÖÆw‹zÀÓûßí×ã=n]5(¥‘<Ø6lݽÿàoýÚ»ðÓR[k9m·]ý¿~÷û?»@n¥yö9n%óïaù_ý»›ÿe­?ø®óRñ§cyr×/•Üh—ÉþÍsZ­ÿØínÚyå³—Ê)-åwÿÇþ÷ü¹ÿ‡¾!dñì¾nÇh‘>Oâÿ~ˆÇÝÓoæ—ûR%hzýŸä†_ÞÅ÷þûÿÕ{?Ëm¬øsLÝþ‰:Å,¾S~éŸýŠÏ¿¼DƒLeXݢݾVH¢ûÿêŸø«Ïÿ¶îoõÍ1¥–'H'ؾJìDO÷(ˆJ\§Ð¾'¿o´K¹›e«·ï¿çßýÄÿ–«\¾ã6ð6©i«®Ÿç>èw·ü~n·þYVýâͪi’ùW;%fþ/ÞýÏùw¯<×¼©®/bÚ©/žŽ¿½ßpÿ#ÿÇÇ÷[ýÊÇ›šEÇÝ=cGÔ¢¿ð†Ÿxª°¥ÃoÙ2ï‰ÜOïW­ÜýŽÉï>ÒÐùûQfŠ-÷ßî?û?ð:Öø]s¿À¶K+Cû×HŸnýéóüŸ7ݪè‹s©\EÚÝö¦ë{’ùý¹‰ØßZ1¥¬|þð×ͽ?á&o“þþׯ^?üW÷{¿†óÿdzò}JÿüóoI|S.ßü‹^»rŸñq%ÿ¯¯ý‘ëRùNîÙ×wÝþòŸë/ü4ïÃÍ1­â ûtWkÛÿ.þS®Êö=›vßᯜµ‰™ÿn/÷U_îÿ°õtÊ—Â~ŠÍú|­»Ìõ§£¿“ªY7ý7Oý³üïÞÊßǺ­[?ïíû³Åÿ¡ÕËá9!ñ8Oø©/?àÉ\ÂÎÏ]ï‹,ó^–H•Ÿr'ÜZÄ>Ô.gÛ¤û?Û¨Œ¹bmR<ç5³U/³?÷+ÑáÕfOõqBÿíµ3þ›k7FÔ5[dî#|õq‘,ŠŸ m›û^ßû‰^›âyþæíå5roöœ©i¥j/z߯‘öÇšÄZWïÕ¤mì›eZæåæ‘ÙòDð=U×sÖ%Ë­>òóÎwù·ÖdÏó×aÁ)ÏUÑé“?ÏMÿr‚â:ëµgÍWŸuQzEwªSLÕvmµJm´£¾ê¤õvå6}Ú¥5•ßïÔ[éÎô×­¹€wÛÙÊÜÛ?Þªïr¨®ßߦºS±ß~üŸÀÖð›Oyc ¤¶jêÿÇ÷+Ã|IâGÖ5ÍCP—vû‰Ýê¼Úö¦úBX¶¡vöI÷mÞwò¿ïŠÉw󿆮$T&K–ù*T¹ùÒ«¤?/Ý¡þJ³cÒþ Íç|FðâÿÓÒWèm~süvÿ…«áÅþ>¿F+ƒñ–á?ÿà¨ò}??îÿ¦ËJ)ŸðT?ù>Ÿ‰Ÿ÷ ÿÓe¥ÆwŸ¿uù÷ÿfÖ¥ðƒª‘]ÞK4¨ßÅ·gÿ_ •òüOÀz‰|á­ORµi®ì5H?‡ÿ³WÈ—À~Qø3à âñö§jΖ¶noMŸ5sÿ ¬Öñ¿{÷ÑZ¾“Ö4Ø“ÃÚšÅP§ÿ$K_:|4†_²Ü,~ÐìÉç?ðýÊõy¿vy¦f¥gý«­ÛéK¤¿òÕ?Û¦éZ ?ŽeÒ¢‰w¢ü¨•ô>Ñt߇öZªÛ+ꯨÅo=÷”þoÜãûµåö ý•ñ»UeUýÔ/ËQJFÞÌå€Ñõ&¹]?Ïݾ-îÛ¼×ÿ®Oü5Çß—>#¸h"ßçË|íûæ_»óÿµWl5±ØDÒÊУ«|›~õgé[o.­ÿåÚÝï»lwÿÖ<†ÜDZë~_†þ#ÿ„z)nnmâ‰%YŸø÷&úçÏx“oŸ½Ö'kvÙ³ý¿´ÿ±¾¦¼šçý}ÍåÍã²ìón%Üÿ÷ÝQ°†[È¢¢’å6ÄñCæùQ'É÷Ò_ãÿsu2κåüà-­¿w‰'ùþæÿõµê·¿â#ª¯Ïö§ÿÐ+̶K7…þ«|îÚýÓ³ÿýmz”;ác;ÓÓPmÒ-¿|Ÿ2ÿ |åªÃÿçàÏ™~H—ÿEWÒÐ˽ÛýšùÊæ›öëð¿Í½Õ~çý»½gLº¿ úç~õÿÞ­íÛí,RÅ ¿Âó}Ä®F¶;üßÅVÒóøZ¶8"zÝž«smkºëP²šãû赃ã?êÙùºV¯óÿ"%q_Û ‘}í”ÈuXݼßà¬yŸhh>·âýå‹PŸí Û>à­ètØ<-¢Y_jûo56]ß½ù·U èú…ý›ODöþoÍóVůùÚ•½ŒL¯¬_;§÷ª¹CûÁ©|T¼³ÚÎ +6Ûò¼Q|õÁxŸÆÚ¯ŠP»i‘ƒî%cÞ\ï—vêÏšf§Êc*² ÿ;ü¿÷Åÿ%WI©ï6ú³Œ†gÞÔÔMCÓ7üôXt¬û®Õ¡¿zÕ+®Ô“s6ǪNû­Þ|ïTf ".¯Yó}ʼõ]è,Ïw¦;ÿ³RÌ•½3fõÝQ=Kç|•Vg  ÷/²-µ]&dûÛh¼zÌy›ûÕq1¨n¥Ê¼U]þ}õ› Ë}Ú»m&÷«$ô_€ÿòUü5ÿ_[?ñÊý¯ÎÙù7ü]ðçý}?þ€õú1\Ÿˆõ0Ÿ øÿCÿ“éø™ÿpÏý6ZQLÿ‚¡ÿÉôüLÿ¸gþ›-(®3°ýú=+æ/ÛãþIv•ÿa4ÿо=+æ_ÛãþIFšßõOýªâ)|'ÀºªoÐõÿ¦ _6|%O9^/ïO/ûŸÁ_Jê_&‡¨×¯œ¾y^j|ì‘yòüÿÜû•ß„òå¹ô^¤žOÁ»Ev¹ØÚÒ?ÏòÅ÷%þ:ð{ûf‡ã^·é~kTŸþ^Û©:Þ|*ÓâU•Ý5…ÝûÝèß$¿r*ñ+Ç—þvºÓ«#¬ ‹½¿ƒä¨ tÔøMÝUz|­ò×? 3ø£Ló|׋Èû›¾Oàû•»ª»=ÆÝ˳uaX|þ4ÓÕ¾çÙ~ú7ÏüÁ]'1ÒëÐìµÿ}_ÿC®væÛ‰tvFsoýÓoÿ¾ë¥ñ#¶ÇU_¸¯·þû¬Çùõ} sO³t»Qâý×ý÷W 5µ[³][Ê«³ÿþ?ï×#âMÛô¥eŸb^/ú–ÿn»_ýø·}ÿ—ï·É÷ëŠñSï—GmÑÇâ}Æt¿üŒ@Û׬7ßý±Õ¦¸m©½Ûøë2ñæT‰Wféâþ/újŸÁ]ˆ_b#/É÷>ÿûõÍ?ÈÿÿÏO÷þýX.·¥4ÉRË/Ù"þ ¿{çÿÐkŒñ=šÙøKPX–8Q·üˆß"üÿßþ*ôëô_°n_3ýŸš¼ëÆÛ_Âw«òïÚß$¿$_ð €5ü0“Ùø â³òÒYâ‹÷ο>Ï‘ë?û 6õÚ$“÷±Jó|ïò÷«£ðÂ7ü z|¿ºÿ_ã_ö+?R}úº»/Éüê¿å—÷(ŸáŠÛF‹P–)fŠÞwo»³þûªSh-©^Ú^^+YÊòÛÿÀëwà´?ñE}é_÷òýö«wŸwvÙQþWØŸ?ñÿ Ð% é°\øßÄ2Çò,[|¦ß]/Äë.V]?Ch¦—ìq|‘7É÷Þ²¼ Íã}aŸÊwÛü{űÿîWEªÛE y°,HïåoùvDß?÷þõE5ƒCuàõÚ¿ëö6Æù7o¯PÔ´m7ÃÏ;6Ég¾Dùÿ»²¸ýyüïø_r·Ït¿:*#ýÿîìõé¾-Ò–h´õò>E_c·Éÿÿj¯˜{ ±5»Ëè#Iv§‘ö„û‰ó×¥ü7ðJë~ûs+l°Ó>Ôï¶±üaÿ"õì±nùà‹sËßûÿÁü5Úø&óP³øin¶w1B÷ökk>ÿõO'ÜOö¨”½Ñ;­é±\øƒL±vÿGYQ+cÁ>þØÕ5;k;— yöx¾Ÿeu¿ÙVÖrù°Eûß“÷ÓE¾ãûiýÚÀÔ–ÏTÖï"^[]OÍò¥—ï°üUrùNs^Ð[D½Ô ‰[{Ëö}‰ýŬûoiéâ2ÅUånšþ®×UÓnu+ùeÔÿ×\O¾$´þßÍþí[Ñí¾ÙñBVÛåflÙ ýߟûÿÅG0r•ÓËù3OåZ}ÇÿTûþ÷ûÔhúRÞx7B‰ Wò­bûŸÁû¯üz±ììÕííÙâŠmíúæÿDoÝ?ú¤þ¬€ïm¶¥‡Âø7oí«Çmÿøþýz5‚Å|ÿõù/þÏ^slëæü'Ý»çÔo¼ï¿ü~½'Muÿ„é7ÏÕÅŸlûZù¶ÛþOÿBoúuoý'zú)æ_áûí_:èÿ¾ý¿tOö-[ÿIÞ³‰¤¾îuÿ\ô÷ž¢OŸæ§ìßZd3MTžfGÜ­V&O‘Ú³Ý*€Õ¶ñ å»Åäðîþm‰\íýÏÚevûïünõißäªSPñÕIªÛ¿ÏU€*»üôÍôù‘j~úfúlϲZ¯¾€.£ü•ˮߚ¡ÜÕϽ~j%+ÇØÿ-gÍ÷êíÎʨûh6‘]Þ«Í6Êšj£3ÐAÓUwzê/9(ÞuUšoÞÐóT?ź¶•ËüõIêÕÎÝõ]ҀܭH~ýgC±*ò:Ñ =cöuMÿü8¿ôÕßÿzý ¯ÏÙ›lßü8ßź_ýëô"¼ÜOÄz~ð#þ ÿ'Ïñ/þáŸúl´¢¡ÿ‚¢ÉôüKúiúk´¢¹Žƒ÷ñºWÌ¿·Ä-7Â=?jÿÌE?ô¯¦›¥|#ÿVñ޵áŸø. 2ëìÖ÷Z“yÿ/ÞÚ\>1Ká>YÔŸþ$:‡Ëÿ,ï×Íß öÍk2³2'Ÿ.çþ?àû•è> ø—}â};ÄÚ¬ð'•gûàß\Á˜Vòé,Y–o5þv¯JPåºyÞéíig=·€bž]C}»_$QC þö)YøëÅôÛ9ì>)kpOx×÷WÏ3µu·?bO éþwʺŠ\3¢ìFÛ¿øÿàuÄ_Ï¿âΫ"î}ÿ"cN3ˆJGe©;=Âmþöÿür°¬æÿŠÊÉ™¢Øð>ÝŸë¿øš/5/°j2Û_n°u—bïþ*ϳ¼øItõÛ÷"o“mnfw^!¹ýÖïî+nÿ¾ë5æTÔt-ÞúÙ~ä¿'ýñUõV)¬¥mÛçûÿïÖ}ÍüVÚÞòÇÌÿ>ïŸþøª÷‡î—‰7ýª/»¿oûÿÇýÊâ¼`ŸòdEÿ^Ÿ}_ûÿß®—U¿[Y)ãóR$ùýjüõâ©¥û™¶vÙö¤vG_“vÿ¿RO­»$3ýý©÷?ß®vgd–'“îyéü?'úßïÖÆ«y½"ûÛ>DÞŸïÿa^LÎé»vĺO¿÷?ÖÕÞê[“KM»w§ÝMÿí×ãó¼5«nÝö„_›Í_ý“øk¸ÖîUì“jÆÿ7ü¸üþÖl»öþ÷gÎÿð:ìü%·þÞŸ¹[zA¿~ßö+ýÙÿ´%ù_b¿Éüê¿ÿ‚¶<1r©à%ÜÈŸeþ÷û‰~éåjk¹‘_ïÿªÿUÿ-½QÊ·Á˜Uü%òÿòíwožrí5«³*ïÜ¿$RþéþûëuEðMöx#ï.ÿ=öÿÓ._÷_òÃï.çû‘}ÿî~€á¿ùõ½²Îè±[îó Xž¶õ½»R%fÞíß5s÷ÿ¹ýêÄÐwÂy­«}¥m¿ü}²Öî¶ÿ½ù’]Ñ|ó|ÿ&ÿ¹³ÿg 7ÖÒ/øJ¼%¹eÙ竳Ü|’§ïôõ>Ä´‹ÊßÍ_¾ß'üýªò]{kø¯Á‘JÛÓÏOÝ\­Eó¿üK^Áã=¿èÿ4IšŸ&Ú9@á×¹OÝ/Ü_6ïøþÿðíªÿR/°x¥XÑßQû³ãü-VÞÙRêßÍŠæÛýžÑ¿{ü;¿ñ-Tø!òi¾(ù Ø×͹Ñ~Gÿâh(Õñ"3Þ\4^fÏ“þ=þGþ?øø«¶Tñ¿†–(¥D]'{"/î¾ú}ÇþíÆ×¼–YYŸÊÛòDÛ<¯úëÿ=Wþú§è?òP|?å,èŸØÿöîÿ?ü²ÿfóŸÄ·‰4Û†fT}¯ÿ ºÝ~tÿ[ýêñŸŠó*x*_5§ßæ§ü||ŸøþÍ{7Ä„•û‰å®x·¤_:ñW|`ÜžÔÍmÏZzÖƒaÿG†™V?ÝY®íÿ"Eû¯àþõqN’Ã䪭§›æÅµæÞéqû§ÿ–_òÉ¿à ^‹áíÉà+|ÿè±mI‡÷_Á\%·ú7ˆÞuò!w–$k‡ùå¸ýÓü›?å—þ;A'AˆtÔ¿øi·Ñ'Ø/§{­íóÁ¹ï׬i[fñ„SÅóÛ´òºÌŸqëä¤ðܾ$ñGŒôûh¿ÕAö¨‘%ùíÝ]?þ_P|v¹øm£ÞK¹îÚïJFÑ=VÙÕî¼ ¿¾ý¿ô÷O¸–rÿé;׸i»·î¯ðÆ«þÜ:=œP*K¬¯+ÿÛ'¨¦T¾íX~å?îSÓgÞ¨¦zØá!™þW¬÷J±3Õ'z‰êŒ¿qêÜÏT®_ä  ù“çªîõ,ÏTè"@õ]ÝiÎõWÏ@sϽªô÷¨ž€ˆíô٦ޔʯ3ìZ +ܽWžŸ3ï¦PY^jÏš´.»V|ÔRj¥2|õvjªô íÛU÷5=Þ«»ÖÀErUÝê[™¿ÚªNõ@JŸ;UÿÃT¡ž­§úÚ™쿲×Ïñ»Ã«ÿ]ôS×èm~w~ʯ¿ã–þô¿ú)ëôF¼ÜOÄz~ð þ ‰ÿ'Óñ/é¥ÿé®ÒŠ?ਟò}?þš_þší(®c ýý¯¿à§>Äÿ¬¥X÷ÞÙê), ÿzû¾lý¼¿äYµ©Åÿ =\~2*ü'â-ý̻ݬÿÐþVIißoþÇâh¥ó[îíg®¯âïƒÛÃzãË^M¥Ò»¯ûÕÊxJ—è«µëØææ‰ãûÑ÷Eñ·ØõUûé+:Ö|:¼÷:ÌW—s²\3+´ÕÝ|Eð”¿ð‹Ùxø_³Êéýïò•çZl-yyµ—zµ\jFQ÷B¤e­ø…s-þ©ws,¾s¼¾j»ÿu«+Mñ$©¬éó³|‰òV¯ˆakÍ+ï+}Ü åNŸìqöϾx—wÝù÷Ò2=ÅW‹5ýßÝtIÝÚþ Õ…­¬×d°4O/ño_kC^¶ÿE‹P_’+¯’wþë/Ü®?÷^|J«±÷|Ôó›ã È’[KË8¾Íwöv•>û>úçïüI΃iûÙ<Ô•TþóoßZÚ}³Á¾~Ý÷­ólÿžUçþwÍòÿÝJ˜õ]Wn›Ÿ}Ë\Åukö)ÿ÷ÖT×ñ=„S´¿zTw}ßíÿr¢›eχ4˦o‘WìïþÇÏ\MÍË[K,[ÙÖŸ({Sׯï5?²ÚOºÛû>_ÞïÝóýúÄñ%úÍáýoìÍ÷—fÈ[çÿÑmr·> ÓÚIÕ3ÛËþÏñWs©K­ÞŸ'ú©_šŸoûõ¥ûSÔ<7y<Þ ‰b¶i’ÞyÙM›*¯<énæwò÷§Ï·äþçñVo€üI-†ƒ©ÙÛO¾+«_)·ÿÏ\ÓëØš½ÂÊÒ¢K$Snÿb ¾cÐ>ëqXx#kìÛöÕ‹køµ(¼ÿ=fGeÚó/Ï÷ÿ¹\ÏÁÍn+ ËH®`[›DŸæ…ÿu:—ömú^6ØQ%ù¾_¸»êâG7Ú:? jKÿ –»+yh›bÿ–¾jßÃ[—-y«?”Òì_)Ûbï¿üì×hšÜIâA–8áŠëgúŸîWañ.m?Ãõľ¹Ÿìïå|îßäÿÐj æ9ÍI"}GÁ,Ê¿ñù÷çDýï÷ÿöJö\®Ë}­ÿ-Ž/’¼2óU‰î¼ÌË•/›,0üñ­þö«ÐüO6¡s£E­EyÙóÊû;·Ï÷(c?Ä—;ü3zÍ_=œH©æìÛ÷ÿø«­ð¬Û<£Å¶´EOûŸ¾‹³øÿÙ¯/ñ&±ÿ‡.ÕV'رD±?ü²ožºÝ6þúé“Ä­4QEK-»}ßöèå"2ç-½ä°ÅdËûwx¾O?bÜ}ÿ?û•gà³ïÒ<[óoÿL‘"ØŸð?î×<óE5½¥·î¿u=¿înÛdHÿ?ú¯öªß½VXlâ׈üZ›ƒµ,î…ñ>ÿÍæ·÷›ûŸî|µê*ñ þ£h°^O3Ä®Œšs¤'Οr¼Ÿâsªx+SÚ»<ÝG~È_~ÿŸïËýÖ ~ðõÊÃà¿ÄÞoš¶k·zïþà¯<Ò¿äk½vòáÜÑntùî÷OòJŸÃ]E†«äø_D‹÷¾jZ®çþ÷ÉüÝ®kMšÛûfïæo5¼¯žýïú§ÿ‡ûµ pöÞ*ÿ„c^ñ®§­·ŸØ¢H›z|ÏÿØWÔïÖo…¶v\AmJò{?èzÅ×ÂËôøž-I®%¼H~DŸjW­h)‡ˆmìl×É´‰åH¡þâo ¸Èô‹á¯ðgï¿o¨¿ëÅÿôU{­…Îùb_ö«Â¾º¿íñ»û–rÿèªÎ&²øOºþâmªó=ZM®¯T¦uß[%Ižª»Ô·;‚ª;ÐïÕ+ʰïUnfß@óUG«=T ‰ z©üubmÛê¿ñÐHǦÑ3Ô;è:#wª·2oJ•Þ«»Ð)¨zþzcÍ@ wÛT¦z–i¾Z¥ç/ñ5E3ÕIž¥›oðÕ+—]•| DïTf¹ßòÔÎÿ%T}µ`DïLy–™3Ö{Íó±Tœ.¯òÕ;gËYöΩ÷jê"Í÷ª@öÙ&3㾊ßÝŠVÿÇ¿DëóßöE‡þ/v˜Ûå„¿ú~„W™[â= ?øÿDÿ“éø—ôÒÿô×iE/üþO¯âgýÃ?ô×iEsïàûÕóoíáÿ$ŽËþÂqè_IWÍÿ·oü’[û Åÿ =‘ù¿ãÿ Eâß Ê³¶ÉmSz½|åàk}Eâo’á7|•õn¶ŠþÕ~mä>ß÷ëÂ|¢}ƒTóþü· æ¶úô¹½ÃÎå÷ÏSÕm›þž•lÒËþ‘©¢KÁò}Éå¯Ý¯š¡Ñå°ñ]ÝŒ»·ÄϷ寬/í¾Óð«BŠ%•û[ï»o‰~I‚¼2óDoøX7pN­æÚ¼©½ÿŽ¢„‹­¾`·—íä¥×ÈßìyÓé©m¯Kg·î7ËþÕzÛØy/·øüÝû?à©h‘^kÚdñDÈÌ»%ùk§˜æåö(®l.-®~{yô-õÁ&”ÖÚËÁ/üõÙ¾½VÿMû5¯Ýþÿýõ¾²µ-µô˘›÷³Êþj:}Ê9ƒ”-¾D{f‰f·•v7Í^s¬iM¥k3Aålò§ù]ÿ¹^Á5‚Ãuå3|îßÝÿn¹è-så\¯Ï+˱¿ÛùöQ̤Z>›ö.âÙ¿Õ]DûSû¯ýúáïìçÓn¾ÌÊÎèÛöרXYË •ºígò—åÿ~¹Ïèò=ý¾ »ŸÍdFÙüÃW){Ãr½…ÅšE¿í‘lmÿsûõÃëvÒé··O»Í‰¼¦Oï×¥YÙµ´ ¹Z‹¿ÎvÿÙ+ñþްìÕ`•“å_=øˆ‡)cÀЬ)hÒ«lù÷&ßö+Ä–k£Þ=´²ùßgmëþÝv~‡‡™™ÞVwùïüŸøíEñGþÒµ}MeóžÝ¶6ÅÙD~0‘Ëø'sÜ<ÿ2Kæ¦ÔÝ[<}—ªÅû«„Wß»z-Wðš·1Jû~t—åG®‹Ä:?ö–‚ð,^sÁ›ö„ûŸîTCâ2û'™h¯³R·XÙ“ý¿½^‡âÉïô»KË”ßö¨6yÈ»>u®ÃpÿÄÒ%ÜÉóv½6ÛGŠçÃWp3Hóyâ™þæú%ñ€ò]5Ûìò»*:Ëò¢Ï^žú”·ž•YW|R¬¯þíy—ØÙ/Z]’«ldÛüu곞(¢dÒõ’)^fûëóü‰@Gâ8K›ùìî.à_*h®¾vß]·‚u‰õ/ëgŸ²(¼©v°»ÿøºóÿXO¢j“[K»Þ‹÷kwáìÍ »‚Ý7û[¿‚®_Sø‹>-ŸÃÚ¶ï!nb•–]’ÿì•Ð|ñ éºô­¹fIçÞ©7ßù«„ñ=´ún¤ð^+'•þ«zÿ ?À×-öÇW÷¨ÛÕ?½U(—Ìuz­ÿ“þµš)ƒïïÿb´´¯Asãx®m¼‡O³$M+ü›¿ß¬/ˆP¬7¯ÿ,Ré¾Ð¿ì7÷+’Òž+m]&dGûÈë÷ë(Ä9zñU‚ÃâÛ¶ŠÏì<î¾Koûɽö5rÿlÙü%kEÿSï_³ÿìÿíVÝþ¶ßÙz~¡, 6Åû<ïýïîWKá$ƒ}ÅÌ·1"Aø×~Úˆ–U°óÓAÓ×÷©æÀ¨¨ÿì§ñÓ´×kŸ²[yò¼Q4[­á‹äµýÓÿüµ«s;MåO+/Ï¿÷»¾Gÿâj•„/ºÓÍó]"eu‰>D·ýÓüñ?üµ©µð«¬Þ(ø?üû º}ÿð ï´ù?àsÿèuÃx Ù<_ð«tžvû;§_—gðWq ¿üTÑ7ý|ètzš*Ko³ûÕà¿ 6¿íÚì­½ÚÖ]ßì~éëÝlc¿_?üÝÿ ר?ßEµ—ÿ@¬â\¼·ü¿-R™u]…-Ñj/%ž_»]'žéT¦ù+Jå65fÝv¨>æož¨ÌõfãïÕgMÔVgÿj¡©ž†‚$E2UG«ÏU‚J“=WßþÅM3­Wšm”Êçz¨óP÷;ê“Í@s¿ÏL¹Uü÷?/Þ¤\d6i·Ö{ÿ½Nšoš©}§gñU–=æÛü5Fççþ*&¼ª³\Õ€;Õwzfú‰Þ¨f“uU’¥™÷ÅUÓç  Ç{VÜ)±«&Ù6|Õ­ Îø¶ÐDxý?}ñ†É¶ÿË _ÿ¯Ð ø#ö;…ánÁþÅ“×Þ•äWøNÀ~ÿÁQ¿äúþ&Ü3ÿMv”QÿFÿ“ëø™ÿpÏý5ÚQXïÙé_9~ÝòH¬ÿì#þ‚õôié_8þÝÜÍðŠÕ­à’`šŠ4»î.Çùªã¸¥ðŸë?òÔ¿ëƒW‹è?ël—wüºýÿûâ½—R›f‡¨nÚˆö¯óÿz¼K·–ב[Å»ü¨ÿ®èüŸÌ{æ•|4ðýʵ§Ú?µ¾úKûßãþ õ庯ÉãÍu•[þ>¾âzÆ«4ðƒÃ‘4ÿ½mM·CåltûÿÇ^9©:ÿÂk¬*²º4ÿ6Çù+*&µ¤]}ßÚé/šÈí.õ}¿{ä¹Yö>¥/î¼çf‹vÏãù?ެyÊú“îÜ›åÿo䨴w_¶¼¾jïù>M¿wäÿÇ«¤æ.ꨩ+·”ÛöËó§ßûõ0¬ÒÙy²¶È÷Q:ü‰þãÿ?[Eò¾òïùþOø2ÁåvMßsríto‘ÿÜþíiø’RãÊÛò|±þã|õÌëvlÔ¢YQ_åGwFÙ¿÷µÔx6jé»ä‰âMÏþÞÿîW;yåMyi¹`ÝüR¾ýéûÚ±©[/É·îmÙ÷«2óMkÿ´/‘¿kDþnïŸï§ðVÞ°‘}öeÞß#oþ4¦i®¯op«òlÙò}ý©½(¹Ób°ógû,[ñÖ&½aÚ ÜVôuÞ±#}Ï’ºÛý¿`Ý»çùÓgûšðÅö Œ±M³w”‰ò"üŸÁ@ôM+ì~Š&]åodãù?û´ÍVÍnn6Üùû§O9þO+äþ4®ÿänÞRü‘}ýßsä¬+”ÿ–¾S$­»ø·¾Ïö(—ÃÝìÞ¾YYv5Òìwþ*¾¶÷—rï}¨Ó¦ÿ¹²»XAm¥ê$L‘4©ü?%sðü÷I+­ùžo¿·{ýÿöhÏm´x¿á>‰–%û?Èêû«²°yáóg_7ÍÚŸ;¯Ï/Îÿ&ʱ èñ[]$íVß°îß¹7ýÊ{Ù¯•pÒÅ/›µÊvùöoþ?öhËzô‡Ó~ÀÈ»U7ª'ýuÿa?»Y‰¢Oªéºz*«ÚYÏÜû‘n—ø»Ÿ£[Oæ£|ò쉟oÞOöèÊ~"é¿oÑ´û›ei¥‰WzrŸðÞÙí­ÒX¥hw2;&ÝûÚº VÛe¯Ù•UÒ]‰±?å—ßÿ¾«CÃ~—JðæžÛ|——ÊûŸÇ÷þF _ÇþŠmOžÚ)ÒâÞ-òÛÍóºn®ÀÖqjI{¶›l_q>þêôÝWä°Óí¢¶¹t•bF·Ýþ«wñïþ%®ᧇ¼˜¼F¾S>Æx¶?Ü—þü5¤>å/xÃDmbÂávùÒÅ÷^ßø?߯1ÐtØÑw7š½bÿÙëÚ>ÓäÞ<«/ä4¨ÎŸ"[¯ÉòKýêåtßÅySyRſųø—}fD¢u¶ß`H¯.Z)÷\:þë~ÿ¸õ«ð—Mðóø¾+ùO¡~÷ÍI§ò‘¾GÙóÿ¿²‹ø~Ç/ÌÛ"Eô¹—|_}>M•ÂüKÜþ½¬îav—fÏï|ÿ}?Ù¨‰´OEÒ¬>Íeiå[/Ùö~ë{ýÄÿnª[[2j‘7”Û—l²·È¿ºø÷þÿþ=[zm²Ùø?BùV¶¨þo÷~OîcÛ$O­Ë<ñK±ÛzÜ;|—ºžÝ?†™gàÄoøK~ÎÊÛ¾Çu»þø®×Aø¨ÿÞóÿô:áü%7üU¿ ¢]ÞRi×óÿ¸•Úøm?â OûxÿÐè5;¿;d©^iðJkoÚ·ÅwÓÁäù¶>lÿÝÞ‹^Œî»âÝýêáþÃy7íã «Ï5"ŠÏʳޟ'•½7ÿãûéSøÉ‘ö3yÊíE2TŠ¢{›÷WIÈT¼uókæo¿RÞ\þ÷åjϹ¹ZÄ¢¼Óoj®ïMšçûµEî[Þ«å$°õžïVÞo’©Mò-YçlZ£ssò½6i›ûÕFi¨šoš©M52iª/¾¯TS\¾ê©5Ëm©Ž¢™6Pw›û¿~«¼Ìô?É÷h’¤‚¼ÎÈ•™rõ­6÷¬Ë˜wÐ2”ÏòUwz±2Uy¶ÿv¨Ew›eWšj°ðµWš¹ú|¢æ‘MGjwØÙþêµhi¾Ôõ'H¬ìg¹—ûž¢2‰~ñ^ÙÚµ­“çOö«ºð¯ìßñÄ2§‘á˸Q×ïݯ”Ÿøõ}àOØrQ½ÏˆuǶ—ïµ¥².õÿÖ2«jT*œÿìs¦ìø–“üßñæõ÷ô5Àxà·‡>Içé±H÷[v}¢fËW^l¥Î{$OÀŸø*üŸOÄÏû†é²ÒŠoüþO§âgýÃ?ôÙiEAgï¸éYž"Ð,üS£^é—±oµº‰¢”V˜éKDBGãgÆm)¼ ¬ø·E³ŸÎ´²ž[X·ÿukæÿØ_?šÖÊß½fùüªú»ã•´Z—ÄOˆKÚ_ûFtTݳ毟<s«øcD–ÛUÑgÿ_¹^Ýw½wÆ^ï)Á(ûÇGý·â;ŸYhsÎÉ¥E;Ü@žWÏ¿çþ:ò› ™_ƺ„ìÍç3¾çÿj½NoéO­ÏÚáOî<›?ñÊóÿ¾ŸmâÝn{ï3û>UýÄοíÕÆ<†2—4[i®f¿–_±ìwmŸºùÝ×eRÑõ‹äñ PJÑù^WÜáÛ^aâ ÚÏP´óSîïjâ­´M>ÿÆïÛ#¼I`w–¥û­òQs‡Ú,jº’ÞDêÒï‰~_¼Ûê¶·ö¤Qy<¿<³}ÏŸû›+ÐÃÖ(ñ7ͽU“ep÷ž Ôïÿ߬yµ‹e´YïÌ‹oåo¿ü]Þg•í;âùŸþšï®Äú<ö(Ò ~쪊û‹ýú:]Vå¾÷Îß{åþöéº",6·­¿uv*'Üûÿß©fð–«û«™bÙ+ϱ¡Ýþ©¿\׉,ï4¯¤ ÍólûŸq¨­¿ø”Ĭß}¾oöÛªˆër²´¬¾WÜYv#þëûŸÃTµ$–çîÙ¶Í»oàwÿcýªÄÔµOAµ¸ò7[[¾ÍׯÏ÷>’€=Ò$Ñ-t{öìÿ€lþ çw‘½Sø<”mï³ûèÿÁVÓ[WÑ-"óÿzÊ®©å}ÿ“ï¥cÞkC¥ÝÉ¿iþ?&%ù%ÿÿ PG¼znŽí kŸå?ñíù>çñ×5g2‰÷·¿•ûŸ¾ê¾kÿ÷iÞ ñ'ödž~ÙÉó6ÍŽßsÿŠ¬Û —ì[·y(’Äê‰ó§úß¿¿ÿd©,ÒÐRÝ*ùwå{¹÷Þ¢Ô’/*-ª¯³Ê܉/ú¯ŸûÿÄ´húÜ”±$„wnß½• ò¶üÿÆ•üÑ|‹±ù),OþÂüÿ}?½þåZðÏáëØ™•ϵ۱w£~÷ø+{Äé³ìûUïlÿÙëŸð”Êú6°ÑJ¯¾[WWO“Ïýï÷?†µ|fÿ-–Ø™Ý%GÞþ«ý¿öª€ÂÙö›ý q2E,‘þO#ïÿªþõt¯üJtö‰Y÷mÝþÇûÿì×/m6ËË'ß³töû^eÿ[÷ÿÕWW4Ìú6ŽŒªþV×ûÛ>ÏþßûTËëpïµðü^TO RÛüžÈŸõÉÿ‹ýÊê<7¦ÛX[øŽÚvÜŽ¿#¿ýÚäuo)çÓ%X#tf·uwo’WùÿÕµ]öˆû?¶'YYßÍ—Íw_»þýd¾cŸ¼†ÚòãÍ–çÎH¼ÝÓ<[>Ë÷?ƒþZÖ‡†ôH¯öjHkÐýšòYóìoä<_kò¼×ûéòy_û=pž<°–óÁÁ›¿Í•Ú+†ÿ¦¿÷kÐüg2ù÷3[J‘®…wË÷Óø?»\ÕæÔðÍÄ[U7,¯ä¿ÎûÔù÷ÿì”v)öohRù¬›-UW_ž/“øø«°H!Õõ6f]÷ü®í¿í#üèŸòÊ»-Vmž²Ü¬ŽÑ~éÿ¿Ü®*Í?Óî×l æ¶ÿ‘·¼ÿ#ÿ­ÿžMYó{Ãå; 'üV¿ ÿì/þ€•èÿ廳/þ‡\'†6Í㯆Œ¿ô —vÏàù»½+äÕ"oöeÿÐêänuÍç]DýêÇøâõïŽ~(³U"Òà{x¶/ûhûÿñú»líæÅòüûª—ìߦÛi¿|kymx×2Ü+y©ÿ<›äù*)|F¨Ósüß߬Ëù¾g­ÿUµ+2ý>g®ÈœÆ<ÓoŸmU¼uD©o>O™k*æfþ*=‘Åy¦ùª»¥9þý=çª$eU¼›bV†ÊÏ¿OîÐc¾ê¥7ÏZ&ʢ麀*ü©Pï«o WòRƒ^R-ŸíÐðï©|•þõ6T’f:.ú®ÿ~µf°ÞµUíªùy€Ï™6"®ú¥sÍ•Ô[xzóUo*ÎÆæñÿ¹nŒõÚøoölñ¶¼Û¿±g³OïÜ|Ÿúc)ÆöR‘âó[6ÿþÆ«ÿf³§î•¦î"WÚ^ý‰¬[dšö³;ŸùãnŠ•ëýž|à’’ØéžuÂÿË[†ÝXýb'M,7óŸŸ¿xŸgög‡¯®wÓÙÿ}×°x'ö*ñ/‰66¸ßØ12ïþûÿ¹_wÃm²ypF°öŸ³Ÿ½ó×4±5¸áéŸ:xoöð>Ž«öéïu)‹smZö ü:ðÿƒmÒ +M†Ù6í麺O›oËO¬9¤oË›>J6Sè©,fÏžŸEøÿCÿ“éø™ÿpÏý6ZQGüþO§âgýÃ?ôÙiE~üS?½O¦<*ôù%ñi%Oо5vVOø›\mù~ÿÏ\gü|Å÷vm¯ÕO‹ÿt?‹Þ]*éßMÛsö¯´Z"ïg¯Ÿõoø'šìo°x½×?óñk»ÿA­£(˜Ê'Å×6Ë4©,¬¯òüߺ¬ÍcÁ-sj’Þi[ì›î»®Íõôï‰?aÿˆ6×Lx5$Ýò¿ÈŸû=iÍðÇâ'‡­tø.ü&«Ql–Ý%ÞŸøåEJ’û'^ BPæ¨|_sà<éäil›ýKoª¯ð¯Hó|Ø®nìÿé²Wֺݚºî×þêVÑ'ÞòlçOŸýúòO[A³q.Ÿ¦K¦éïþªÝâtÙÿ}×Le_tó#KSË_áìºkĿij¿ývг.|+âmZ-NÏU[›Ô]Š÷+Ðßo÷–oö)žJ¿ÊÑ·WÌ)=ΫãÝ5<ùô[i­åÿž?~±õ¿ø«UKMÚ*¤V·KqåmùþZõÒ­·ïÜÉVûË+#ÿmÄržuÿ .óý}æ‡$;›c|Õ­ø“JÖüG¦_Ké/ž¯/÷"UM•ì³M;éßcóàtvÞÛâ¬KŸAyÅ=œ#ÿrˆÈ9Jóký¯•¡i2¯Ïϳç®?âv•m¡ýº+ëHeƒÊû’ïÞûënçáG†®b—ÌÑdóvìW†WM•Iþ xyÓÊoíbM»e_0r‰àý=ü3 «4ßh‰®7|û¿Ø¬Ÿø>ÚâêÇÌGH¾h‘~G©¬þÿ¥LÚŠ'°Ú»|_ÃU5_ x²òÂâÇþ8îb¸]òª>Ú±|(ð3k~²ûL²¥£üñ'Ütez»sðÞúÛM–Yvý¡v¼èŸsj¾íéUü7ÿ ÿ„´»}ÇJƒR··ßå;Ê¿=Z¹ñç‹]C ’§É±7:P àk=BóWÔà¶¶ó¥‰6"üñ¶õÙßøK\†òU—mËÚüòݤ_&ßï§ûUŸàÿOáíS[Õu=gÛömKuo‘»x~-xrçcO,önÿÁå5òžª¥Í‡‹ôÈYÝUÜŽ»7¦ýÿ=w¾!¼’þöÓývDË*Ü;èÞ¬ßêZ.·ñkGu¾ß§Ë/ïfu؉^ÕsmáËø­â¶žÒh¬åI`Ù:ü”Ožµ-b}ÊYìÛý!'‰þŸÍûÿ÷Íw¯©+é ²´I+ùN»ÿ…¿¿÷ª¿ÆŸ éðø~ïS±ƒeíÃ<·_½ùýÊï|ð¯L›Â–©ù¯,±+Áóoû;ÿ}h.1ç<£R¿‹bܵͲDíÊïÿ/ »ÿï–®·Áž*ƒU·Õo­§•>iS~ßž/÷Óø«cÇ? ìü=áǹ‚Y~×µR_—Ú?¹\WÀßj$ÒÝb­¢wm×{~x›û”–ÍÔ×ÈžÙÕ®6£üï/Üù⮯ÂWžv½nÐ\ÁæªÊŒé÷ÿƒï§÷ªü+{ì~ ‚(šžYu÷Þãý´þíq¿ ÷XxßP•e‘ßÈÙç¿÷*"9Dï|fûå—jÊî«÷-ÿ֧Οøíf&äðä±Dz;Jû-þx›÷¿÷ªohú½æ—ýŸs¤\ÜÝ«y­§Ú|’¯Ï÷÷ÿv¸OßÏm¥Ú5œžJ$²îû?ÜÝæÕò„O[Ö.Y<8‘.íÒÄ¿"|ï?ûŸÝ®RÂeIîÕ¥¶O7ï$?î?ü|u¿ïšØÖü×Ðâ¶û4“}ª%u·FÙöö÷ÿ b}§Î––U›Ê]Œˆ»ßj}ˇþ*Ç—Þ(î<ÿ#ÏÃÏ•vcËó§û‰]î•ÿ!(Ý—ÿC®ÁŽÓxëáâÅÿ@Y~çû‰]®©Eý¥ûÙcMˆè»ÛgñÕüf§VäÜDÕû0%Ïü-¯¬°4?h—͉öýôù*ïÚVmŸ:ÿßÚÕý“¯çñWÄoOuµÃý-‹ü%D~# žñôµ†õª:®›÷ë«Ke…>ZÌÔŽ»9ŽcÍõ$Ù½khw×K¬C¾YZ±<Ÿž®<Ó$Ïû7ÍVá¶ù*Ç“óÕˆQvÑÊeÌ;±æû•Ð^#VÊ/÷ª3æOž«ºU鼤]Þjÿ¾ëPÛYÞjW Ÿc=ã·üûÄïT_¾gºUwE¯Mð÷ÀOx†UitìÛïÜ7Ïÿ|W¬h?±îšˆ²êúåÍãÿrݹå^0:#NS>Z¶¶ó›jÿã•Ôi¿ QÕÿàŸ>ŸþAþ Õm›Ö]’ÿìµÊê_ðNû¸w¶ã5î¥ÅŸÿg_lÓ>fo™VŽbyO€µ/Ø'ǶèÿeÕt»¿í:n® Ä?²ïÄO<ªÚ—îŸóã¹÷ÿã•úu³æÝüT÷MëDf§äeçïèíÿ jöhŸÇ-³ÖkÃ=·Ë›x‹ü ¿}pZÇÁiJë/†®æDÿŸH™êùƒ”ð›ÿ†úTɶ}'ÝýÉÚ¹ûσžòŸÍÒ5»kÛÖkIþOý½®çÃzÕƒí¼Ðõ(ë´ LMÐÿ­VÿÑÌcžÿôû_!µëèbùÑb¾]õÖø{Ášæ›VzgŽ­!·Š/Ý$Ñ-z:»}åÿ¾iÉmmxïæÛA6ß“çZ9‚Qä<ÿRÓ~"^Aÿ!=ýQv/ËX¾¹ñí ôûï Iªþ÷ÍWÓ¾G¯ROXîÚ¶q"±òUY¼1Ïå\ÞÃþä´sNRóã•Λuåj>Öô{½¿ì»ëÏþxÃÚ?õ[Ëë;6ÝâD‹íï×¹ÿfß|ÿñ:žmßóñóÕ‡³ÔæOß®Ÿ~ŸÜš ¸ÈÚQ(Ø|Wð¾¥qû­VÑåÛóooŸg÷+Éhÿ LšzØÏ¥,L–ÿ?Þù÷×­j^Ó/ô¿³\øCDšá[{\C÷ßÿ®*o…Þ¹gI|=}mµ·ïO¹WÌcÊzm·„´]KÂÙ «5¥ê£ÊðËó¿ñÀk?^ø{áçµ²¹h%…4è6#|’ü›ÍþõpV 49®"ÿЇYÒ‘wºïþ‹Rø]ªêºkÛYøþçc¯ü¶_þαæÚøÃÓ[øk^f‘.,ôçŠ(¿ÙdJó{ÿmµêÏ;B‘3º:¿^ËàËoì¯ i–3ËçKkf±<ßßÚ•åï7îµVV_ºÿú\@ÅÑ<â‰-œûíÿÞ¯¡c Wð÷ĽwÏ•R+­;Íh]~ûïOž¼ëÀ³M‰¿m{GÀÙñBîVfù´Ïýž®?2>¥Ùû¯›ï×9¬#|ÿ-tß~$¬L°Å¶¬ç<ÿUO¾©Y/Å®™ô­C[•ÖÏO¹›ý´Šº}#à6½ªD’]]C¦Äß÷Ý\ªÆ{ “<«z¥7íÿ½ò _:_áDùëèönÑm'ê×:“«}ÇûµézG„ôŠÇO‚Ûoñ$uŒ±&ÐÂËí&蟼Uâ©Ñ`Ó$¶‰ÿå­Úº%vúì§wzé.¯®G ÏH¿öjúFŠæ•yHéžK þ̾ ÑäK‰mçÔ®î½Ä¿üMzf›¡iÚ<) ¤P¢öU­´`V<ÌèåŒFìù·S袠aEPEPEPEPEPEPEPEPà?üþO§âgýÃ?ôÙiEðT?ù>Ÿ‰Ÿ÷ ÿÓe¥ûñEPEPEPEPEPEPEPEPEPEPEPw†'oš%÷Ö³¯ü+¢ê!þÕ¦ZM»ûñ-lÑ@}®| ðN´Ÿ½Ðl¡ÿ®0ª×žk_±‚µi|Ø.u þí¼«¶¾„Í£˜9O–o?a»ßö?Oïùëÿýž°µØ£^¶OôÚ\ÿ×X¶×ØtUóËá­cöQñÆŽ›Ñl¯?ëÝž¸}Ká_‹ô­þo†µ-‘|Œéì¯ÑÚ?Þ£˜9OË÷°¼¶m³ØÝÛ:Ïh¶S?à_?÷+ôöK+i—kCÿ¼µyà ßîûN‡c6î»àZ9ƒ”üÛtI—o;«ýwíò—ýúýÖÿgÿëcþ@ñYŸï[Æ©\V«ûxVý_ÈÔ5+7ÿaÖ¯œ9O!Ýó¢¢üªõÀø«Á–Ú?ƒeÔ핞[ûWyw¯ÜùÒ¾Û¼ý‹bDÿCñD°¿÷Þ×þÏV4دGDÚ~¹â-CU·‘v"'î–>wUÆ©Ìø+á»Êöÿ7ÝX«ßgçÄŸ.,lÖ8n?³7ùßìyµîCö ðŠ2éš¾¡mþþ×®çàÏìïkð‡[½Ô ÔÍû\Eå ðìeZ%T#LßÓ~ÊŠŸlÔäþk§Ó|¥éÁvÛ¬®ŸÇ*Öý4‹öq!HV–%TOö¦¢Š‚Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Àø*üŸOÄÏû†é²ÒŠ?à¨ò}??îÿ¦ËJ(êoø~WýQOüºÿûŠø~WýQOüºÿûŠŠ(ÿ‡åÕÿ˯ÿ¸¨ÿ‡åÕÿ˯ÿ¸¨¢€ø~WýQOüºÿûŠø~WýQOüºÿûŠŠ(ÿ‡åÕÿ˯ÿ¸¨ÿ‡åÕÿ˯ÿ¸¨¢€ø~WýQOüºÿûŠø~WýQOüºÿûŠŠ(ÿ‡åÕÿ˯ÿ¸¨ÿ‡åÕÿ˯ÿ¸¨¢€ø~WýQOüºÿûŠø~WýQOüºÿûŠŠ(ÿ‡åÕÿ˯ÿ¸¨ÿ‡åÕÿ˯ÿ¸¨¢€ø~WýQOüºÿûŠø~WýQOüºÿûŠŠ(ÿ‡åÕÿ˯ÿ¸¨ÿ‡åÕÿ˯ÿ¸¨¢€ø~WýQOüºÿûŠø~WýQOüºÿûŠŠ(ÿ‡åÕÿ˯ÿ¸¨ÿ‡åÕÿ˯ÿ¸¨¢€ø~WýQOüºÿûŠø~WýQOüºÿûŠŠ(ÿ‡åÕÿ˯ÿ¸©áùgþˆ§þ]ýÅEÃòÏýOüºÿûŠ“þ•ÿTSÿ.¿þ⢊?áù_õE?òëÿî*?áù_õE?òëÿî*( þ•ÿTSÿ.¿þâ£þ•ÿTSÿ.¿þ⢊gü?+þ¨§þ]ýÅGü?+þ¨§þ]ýÅEÿø~WýQOüºÿûŠ™ÿÈù¿äŠå×ÿÜTQ@ü?+þ¨§þ]ýÅOÿ‡åÕÿ˯ÿ¸¨¢€ø~WýQOüºÿûŠø~WýQOüºÿûŠŠ(ÿ‡åÕÿ˯ÿ¸¨ÿ‡åÕÿ˯ÿ¸¨¢€ø~WýQOüºÿûŠø~WýQOüºÿûŠŠ(ÿ‡åÕÿ˯ÿ¸¨ÿ‡åÕÿ˯ÿ¸¨¢€ø~WýQOüºÿûŠø~WýQOüºÿûŠŠ(ÿ‡åÕÿ˯ÿ¸¨ÿ‡åÕÿ˯ÿ¸¨¢€ø~WýQOüºÿûŠø~WýQOüºÿûŠŠ(ÿ‡åÕÿ˯ÿ¸¨ÿ‡åÕÿ˯ÿ¸¨¢€ø~WýQOüºÿûŠø~WýQOüºÿûŠŠ(ÿ‡åÕÿ˯ÿ¸¨ÿ‡åÕÿ˯ÿ¸¨¢€ø~WýQOüºÿûŠø~WýQOüºÿûŠŠ(ÿ‡åÕÿ˯ÿ¸¨ÿ‡åÕÿ˯ÿ¸¨¢€ø~WýQOüºÿûŠø~WýQOüºÿûŠŠ(àoÚ‹ãˆý¢¾:x“âÑ_ÃßÛKhßÙ«{öŸ'ʵ†õžZnÏ•»î½øÑEÿÙ endstream endobj 5 0 obj <> stream ÿØÿàJFIFÿÛC     ÿÛC   ÿÀåF"ÿÄ ÿĵ}!1AQa"q2‘¡#B±ÁRÑð$3br‚ %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyzƒ„…†‡ˆ‰Š’“”•–—˜™š¢£¤¥¦§¨©ª²³´µ¶·¸¹ºÂÃÄÅÆÇÈÉÊÒÓÔÕÖרÙÚáâãäåæçèéêñòóôõö÷øùúÿÄ ÿĵw!1AQaq"2B‘¡±Á #3RðbrÑ $4á%ñ&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz‚ƒ„…†‡ˆ‰Š’“”•–—˜™š¢£¤¥¦§¨©ª²³´µ¶·¸¹ºÂÃÄÅÆÇÈÉÊÒÓÔÕÖרÙÚâãäåæçèéêòóôõö÷øùúÿÚ ?ýS¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢›$‰ m$Œfc€êI®wTø‰áÝ 7ªBìvØ™Ÿl®@?R(¤¢¼ÚóãM›©þα’q·‡™ÂßAœŽÅ`^|S×nœ¥†Ì°Ä>ÿ6hÏh¢¾jñ³ø³N’ÇRÔ5 ||ÐßÍ‹‚Ë$n¬½pFG‚Er#ávŸøÿñ'þŸÿ$V‘öm{í¯•ÿTC”º#ì:+ãõøc¤cCÄ£þæOÿ’*Å·€,¬œµ¾±â¸ŒÅš¢œzqsWj?ÌþåÿÉ š]¿ø×WÉÿðˆ¯ý ~1÷8jßü“Kÿ‚Ÿù˜üeÿ…†­ÿÉ4Zó?¹òAÍ.ßüêú+åàåÏüŒ~2ÿÂÃUÿäšpðrÐÅã#ÿsŽ­ÿÉ4Zó?¹òAÍ.ßüêÊ+åeðtô0xÀý|c«òUHž„u×<\ß_ëü•E¨ÿ3û—ÿ$ÒíøÿÀ>¥¢¾_O [º¯ŠÛëã-gÿ“*tðÝû×Þ)oû5±ÿ·”ùhÿ3û—ÿ$ÒíøÿÀ>™¢¾m]LzûõÁÿ·•*èZ7wñYúxç[ûwG-ærÿ䃚]—ßÿú6Šùá4-ýãâóôñæµÿÉU:h>ÇÎ|gøxóYÿäª9hÿ3û—ÿ$Òì¾ÿøÐW‚/‡ü$~óøÜ}5_¯Œõ¿þK©WÀžùxÄ}|i®òU´™ýËÿ’iv_üØh¯#_‡žnž"ñoããmlíÕG{ðÃÂS@§Mñ¿Œt[èåŽho¡ñ~¡rѲ:¾ WRÍ ŠÛv²É)V#èå¢ôæwü¼»/¿þìW–¤¿ß§Ä?á)uÿËJ•cøÝ> xÿÜ«sÿËJ=”çâÿÉ¿È9Ÿòþ_æzmæ¢Óâctñï‚Ó—?ü´©™ñEºxçÁGéá+¯þZQì¡ÿ?þMþCæÊÿó=ŠóÁãè?¹Õ¼ Èl×5ßøE.GÊ`ñºéûœ}õŠITG>ÓÁh^ES¸†RuÀ RàÑÏMüPû¿;‡¼¶fÖ•ñþúÞÚúÖþßQ²ž5–#E*0ʲ²õA´ábê_óÂ×?î7ÿ^Q{ð£Ãw“ÞC§Ë£ÝÜÈÒÝO¡^O¦Ivä’Zv¶xÌÇ%ˆ/¸ÍŒn9‡þ…ÿ?Þ'ÿ³Uÿäš9hÿ3û—ùšÓÿ€zïü,]G?ê-‡ü¿øªwü,=GþxZŸø ñUä?ð¨ô,Ç÷Š?ð¬Õù&ð‹BÿŸÿÿáYªÿòM´™ýËÿ’iÿ_ðÇ´AñAØ£ÉÝ’R£ò ÿ:“þ1Ïüƒ¿ò?ÿc^+ÿ ‹BÿŸïáYªÿòM(øC¡ùñ?þš¯ÿ$ÑËGùŸÜ¿ù ç©Ûúûjÿ…‰ÿPÿüÿØÖ„Þ:Óáp¾\ï•VÊ#>÷Qœpk ý?ÅøVj¿ü“@øC¡ÏÿŠ?ð¬Õù&—-ærÿäŠæŸe÷ÿÀ=Óþí?þx]ß+ÿÅRÿÂ}§ÿÏ Ÿûåøªð±ð‡BÏüø£ÿ ÝWÿ’iG þ¼Qÿ…n«ÿÉ4¹hÿ3û—ÿ$>iö_üÜÿá=Óÿç…×ýò¿üUmÚêV×Ö¦æÞO:!œ•RO±ŒçÛó—ü* þüQÿ…n«ÿÉ5a~i‘Á䦱âå„‚<±ã [n^>ÕG-ærÿä‡Í>Ëïÿ€}msÜ 4D˜ÜeIR¹¸5-|åÃ-6Þ1Z׋âEè‰ãXø ª“þÅ—ý|cÿ…ž¯ÿÉTrÑþg÷/þHwŸoÇþô$W0Îò$r¤ê0%O¡ôèjZùÅ~ik;LºÇ‹„Ì0ÒêÁˆô'íYì?*”|8±?óñþz¿ÿ%QËGùŸÜ¿ù!sO²ûÿàDÑ_;ÿ·±ÿ ïŒ¿ð²Õÿù*ÿ ÞÃþƒ¾1?÷9êÿü•G-ærÿ䃚]¿øÐÔWÏ?ð­ì?è9ãü,õþJ§ø}>&øJÈé¶>?±Öôè¶-´Þ+ÐÚòþ4XÑ6<ð\Û‰yVmî…És¹›­”¤´½Sý/ú<–ëúü è¯ÿ„‹â·ý ¾ÿÂZïÿ–U¥ÅïèˆcÖ|úñdW~¾€™vðd– ·ƒÈßV4–ã8gùU{+ü2OçoÎÃç‘ë´WœÁûAx+®ë)àÛ•;¯öhiúĆYqÎÀÍnò ܇qWBÒÃDü)ÿ¢›àïüÚñÊW­üîiç¡QU´íFÓXÓíoì.¡½±º‰g·º¶IѰ ®Œ2H ‚8 ÕšçÛFhQEQEQEQEQEQEQEV~­¯éÚ .¡{ ª(Ü|Æç u4hí§‰t‹}JÅÌ–³î(Ǿ©ýA§n¢¹¡ERQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEaj:ðþ–›®5{AÎݱH$lÿº¹?¥nÑ^q©üpÑí·­•­Íó†Àf$aê ÉüÅsZ—ÆíZëÌ[+K{8ÚÍ™]é@ÙUou;=1U¯.à´ ¦y3댚ùãPñÞ¿«gí­ÆÒ» DÞR‘èBà½ë±c’rORM¹ï—ÿ¼9d™K©.Û8Ùogë–Àýk›Ô>7ŒH¶:_9ù$¸—ߺéþÕyGãPÏĘL‘Žû“qþbjvÚŸÅ?ß™7‘Y+Œm‚Çà¶H>ù®fmSVÔBÿijs_•'F$ úN:U´@c˜ïÜâ¹^žœäT–ö±Û&ÈÁ ybMô¨eû@eò„XÏ;ÉÎ=ª`)i DÝ»ïŠxù¤Å.pipçì})›°{wÞ¦±J?Î)£?JpÈÎi€¹æ”h✽NSG4½½¨àþ´ ÓE8v©g­=OãM¥ŒS$péÖšfx¥\CÁ¸§g­D)øÉ u¥úÓ@Å(ÓáÓNŠAùP)p§Í%(Îj€QŠ\Žô”´îÔQüéqL—”´¸¥›Úœ84 Q×€Ò‚E8t¥i™4àHúP"Aô¥éÞ˜¿Jvy±[ùßÞÃÙDZÉÿ±Óûë~1ÿÂÏXÿäªÃ-;þƒ~1÷9ëü•]Y8ÆM(`{‚=©ýb·ó¿½‡$;™øe§qÿ¿ÿág«ÿòU6o†Úl1³ãFÇ𧌵‚ÇðûUv¯­¾±[ùßÞÃ’Ž6ßáΛp›†¯ãhùé'Œu…?úUS±Óè7ã/ü,õþJ®šygD>L"VôgÚ?:}˜º¸@^wÃåGãÅX­üïïaÉÇ*>éÝõ¯§ŒõþJªðü3Ž[‚¿Ú~-ÙØ¯õ‚ß—Úk_Ä>ð÷…·-î “\/ü°€äþ5çzïÆ=_]WƒGƒû:Ôñæãæ"«Û×ë7÷²yaÑ&¹á? xf&©â¯ÛÑêìçðûUy§ˆ¼Ecu/Ùü?{ã>¸óåñ–°}«LèÆúàÜßÍ%ÔÇ’]‰ÍhÁvɶ4`)ªõºMýì\°ìs²ü>·Õ—TÕüEvïó/ˆõçÜ™Í{—€,<ð¯ÂZ摪xšÖù¨Á¦Ö®bÀÀÍäüsôÍö©e¥¢½íÜŠÙÃO* ?™®WUø½á3r‹ã{"¶Ò–‘—üC)|ÚÎemÎÅØõf94 öÏåUbn{F©ñþ ]4Ý%ߦÉnä õÊ.}ÿй]Sã/‰uˆ§†Á í+müòÛˆ?LWNJvhêÞ£¬•û}ýÍàRv‰¦g ž¸àtžtÛg“Ìhƒ?L’iÃŒR‚¸ïŽ”¨¡('ÿ×Q®AëOžhâœÐiÃÖÍ‚µÚíâeB8š¡ŸiàMGUÓˆ/oDÖÐ]¬-mmz‚GqšúQÿ’ñàlõÿ„W\ÿÒ­"¾BÐïîeñÙ¼×û9œc‚~•õþª6ü{ð@ôð¶¹ÿ¥ZEiOãùKòcNñù¯Í‹EWÒQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQESe•!ä‘Ö8Ðgc€ u$×/ª|RðžŒÁnuÛLã?¹c6>»ÅuTW‘_þÒÞUÛ§[Ü_ÏŸºÎ‘©ÎrOé\ƧûAë·‹*ØÙÙØ«}×!¥uõ$ÿ|Ó°BUMCW±ÒQ^úöÞÉ[;ZâUŒuÆM|·ªüIñ6³Ÿ´ëW!Jì)y*G¡ €z÷®u˜ÈÙv,O$±É4…séOãO…4ä%/ÞõÁÇ—k 1úäáZäõoÚ*%óLÑÝúl–òP¿\¢çßø¿Â¼KŠCëùÓÏAÕ~7ø£RȆâ = í+kçß/¸ƒôÅr:—ˆµMkoÔ®ï' 4Ìʹë€NfÇ4àhv©€¥ 'ÝU^ü P:4€wJQ'8ƒò§b˜^}éãœTtþqLšpÇÒ˜¢ŸÈâ “ž§½H à• Hƒ·cL †=©û±Q.Aöôáó… ¹(8¥ žôÀ:SÀïHƒÅ(=3úS”f’ŒãÞØsQŠpȤ€RãÀi€gÖ€h¤…Öb”PƒŽÔàxüi´îôçÚ‘IœRŽ´Àv1ùRö¤ñ¥£4à)›±Öœ=Zp8&œ'úÓ0O4¸'·JAaÿZ_¥ ¿8×ÇKMÏ@‡Š\Šo¥úS¸Ü(jhÖ”†š~:Zª©qç92 ‹bˆþl÷ÉÝÓ®0*ÆNh@piÙéN®ÁãH SìûSïLÍ.x¢àÇf”SG´ QAçŠN”@ÅÅ-%/zZ:t¤£'8¤";‘pcýÁ_ÖPHü…U]Œß‘ÁãÈg@Óu^ÉéÖ¨És¨¬ØK(,ýç¹!¿ ‡ùÓ@ËÑB°¢¢‚Œ ’Iœw ÄÐÛ›‹‡KKqÉšvÚ W—øÛöšøà@Pêqj÷Ÿu!·>afô¹'ñ¡EËb[KsÕ ‚k‚|´,V<ø×ãøe:汜ýÛX_s“øWÎþ'øýñ+âl¿fÑl‡…ôwÈÜßõT?åôŸ‚–M~5fæ}^øÍ-ãnÉúVª o©››é¡Üø»ö¹ñ_‰$“Nð'‡¾Ë û‘µqë\^Ÿà­ÆvÐ]øË[¼Ôf,ìö†R!VÞz¤ckЭtËk8ÔG®ÑÇJ±íZ+ÚËC7g¹GFÐ,tHV+;xá@8¸©XZЬ´çò·™çí#s~•@I®ëíµTiV­ÜüÒŸè)hƒs{Q×,´µÿHCˆ9côšº®­­¶Vßb·?òÚqóì¿ãVô¯ YiÍæ²™çêe”îcøÖê(Q€1ô  kÛÇ(žíÚöãþzJs è+¡Š$‰pŠ{STñOW‡»‘b¾‹»#§qNÀ{5óN©ñÿÅ7à cg§ž`ƒ{©rÃò¹ [Æzö»¼_ê÷—(í¸ÆÒ‘}aG^‹ çÕÚ¿‹´]xÔ5[KG@ G$£?ìõ=}+Ô¾=øRÂ@°Ëu¨ddµ´Ûç+_3Ž§Æ”éŠvÏgÔÿhû¹04íqœµÔ¦Lþ ·™®GVøÅâÍ_x:™³‰›pŽÍ{}ƒ}ì~5Ä _¥Ëš†§y«Ld½»žòSÕî%g'ñ$ÕC°ÁPG½Z\Þ†ˆ"Äh gb¤cŠ@2)@ ûÒûÒ~´¸æ€´½ºÒÍ.)\ȧ LP>´ ]¹ïJ½íïGAÒ€(€RÿZzŽ)àÓñO=M0¸êpôÍ äRŠ¡\p©ç§ZŒ{ÓÐóךH&œ£'¯áMSíORqÛš@8r)Ê@¦ƒþ41àZP{ÓA§ R Ï4¹8¦´ðyîhÀûS»õ¦cîô 3Nšh¥ê\ÒQš@<éKÔ{ÓCcµ.sš:S¦÷£<ô¢âÏZx=ª>niàŒ{Ðãñ§+`sLþTå sLc÷ZplµsÒ— ëJÄØ~{ã­(&£Ö‘óƒ†"nLJpã5Z<ªà–$œî$äsÓüú •[·Zb^”àF1LÎ{Ð1Ò¬IœR†ö5ɧʨ7$ ׌}iAïL æ€$Í8:Ó(Ï>敆?=)E4dûÐ ùÓàûRŽ´Ày¥ Í!Í8g½F½(jbisùÓ '½âÜ~qŠ\Ó3NÒ˜‡ÏJvi™È¥ÈÅ1ŽïN~E(4/ZF2zq¥p$Cÿë§øÔ=úÓÃïLð´mæ‘wrh HäÐçŸjvG­0ž)AÏojaýýh¤\vü¨ÛëüèÀãµ8v¦ƒÒœÐ"œŠb¶3K¼g4ñúÑ׿4™ ŒÐ68rI£wlR‡:Q¸Ç¥8Œ¶Oµ(löÅH /jf@>”¹÷¤1ÔSwâ™-Ê@¡›'Ð(,Oà9¥`&í¼g­fÙëV×òùq ÷`d¶–5#Ù™@?kÚ[O~vÛÄÒã©}OACÐh‡4äV‘Â"³¹èª2MSñ7‰ü/à->[ßk–Ö±Ä xÒ@1ìXñùWÎþ1ý¸.5c.ð³Ãrj8ÊN@b€{—nZ­BO]‘ii¹ôÝí¼=«\ê×é°¨ÜDŒ7‘ôíø×…øëöÉðw…îäÒü)o/‰õ±ò„±_8ƒîßukçÛï x×â¥Ó\øïÄ—W»n:eŒ†+aìOV®ßÞÒ|1j¶ö6pÛF:¤?SÔþ5j1[jfäß‘Îx§Äþ4É"뺗ü#ºDŸòádÛæ`{;ô…hø'á&‹áƒCl¯rÜ´òüò±÷cÓð®Õc\*…€Ku¬&IdXYŽ«³{‘{G pðŠ©Ç5!ubp;œ×'qãaqr-´›9u HÏŸ°¯üõü)ÃÚŽ´wêׇÊÿŸ[‘?çñ£AuYÃrm-MFóòàQõn‚«G¦ë> 9¾¸û¿üð¶8${·_ʶôý&ÓMŒ%¼)Ž+B.xņˆ£¥ørÇIP!…Cwn¤þ5¨€SAù©à÷¢Ö ÉÏÖ…>ôÀiCsLDêMIž*ÓÒ´›HɤRdÀŽ3ÍS½aäÉCVÆj† @·—èiƒØÆøTžw4Õäî¾ÿCõÖ·ÿ'à¿ûõßý+Ò+äσ çüCÑ€çv¡þ†+ë=oþNÁö+ë¿úW¤S§ñü¥ù2×Áó_¡èTQEr!EPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEejÞ+Ñt"ãQÕ¬¬™â“ÎªØÆxRrk‹Õh?iÁ|›»MŽr¶–íòþ/´~Dô I¢¼Uý¨gt+¦h)ç‰/',1þêÿ¡W«|wñŽ«æ(Ô’Æ'?rÎR£®°üéØW>²®gUø—ámj×lñIæ°ú„Éò&©â K\u}CR»¿p6ƒq3>§&©)§ì>˜ÕhßZ VÊÚ÷Q‘N„b8ßž¹c?à5Çê´~µtÒ.¥ÙÙFà ӳLêq×£ôüëÆÑ°@ôëV׿§d+V¯ñOÅú°U›^¸‰Tœ ¼RƒÏZfGãJiˆx>ÿ<1ÍDi˜Ñ&ìPàçÌ瞟…;üóHcëš_ÇŠh¥ê}¨û½©w´ÌÒQp$b”Ö˜;ö¥Èõ¦ÃÆ—5iݾ”íÇÿ¯K¸Ó§u¢à.ê]Æ’€)€ðøáNúñQ÷§hû(n˜Í3$ PǯJ1÷¥,qÍG»ÚÔ ”7¨¥Wã­D °úPÁˆöÍ8ÜT!½©UÎy¦+ç¥.â}ê0Û‡^})sךvìqŸÖ•Oµ0`Rçµ$ @~)€‘K§<æ’ç§ãK¿Š‡¯øS‡C@\74 â¡À?ýzrµ¹)>‚ÙíM@dp¨ ¹èª2OáVîlSLƒÏÕ.¢Ó¢ë¶B ‡è´¯ÐeS SÏr 6y¢30[[~óNÛWÿ¯^/ñö»ð7û‡Óô•ms\è¶öËö‰‹º8_ÄŠñ/üLø³ñŠá¼ûÁà­þê¡óo’~Y|­|Z~d9.‡Óß>;|>øOhdÖ5X®îñ”ƒwß?ì ùš¾qñ÷íEñ;â‹?XIáMŸøÿºQÈ¿ì§P?_¥døcàæ¡Ü›é"}GSc—Ô53LÇ×-Ò»»{mŽU2OsT´øQ›¼·<ÇMø6ÚåÌZ‡‹µ;ß_C_Ê|”?ìÇÒ½Oðý¦†(”F EPª£Ø ШjZõ–”™¸UD±ú «ub½´4TÀà«^êVºlF[™’Øâ°ZÕµŸ–ÆÔYBå½ÀËì¿ãRÙøJ0¸½‘ï®:ï˜çAÐQ~ÀC7Н5"bÑì™Ôñö›€U¸OéIgá oJK¬ÞI¨K×aùcÙGÓ¨P=)ÊÀsN×ÜÂ[ZEf‹h¨£ ¬Q³d޹4ðIV þ4gНœV'5÷ð¿€üE¬Fq-ŽŸ=ÄgÑ• _×éCc×Öœ p_u˯|*ðÝýüÒ\ÝÏj Í)Ë9 A$þ݃ùP7Øx§t÷¦ƒ@<Ò ‰ÃWãoÉ¥ßYˆÛ d ÀµØƒÇô¯ŸµMVëVñf¥ ìH‚ñ‚ŽÁsÇéEì?#è{y|ËtqÝAªš© i&jvŽÙÓ-‰äùcùT:Ãi'®([„¶"ø þ$h|ËòŸÈ澬Öÿäà|ÿbÆ»ÿ¥zE|³ûy03û›¸[ûìS怽ãíëOèÓ·Öô{Ê@Xõ{rwc²$ÎsÎ…iZÈ—, V屜C4rïò±¯€§ðŒ`Îð–¦FpvIJ"jŒš½fG›áR ÷:sÿE¢ðî/xýþÌÔîué¢ÙÈýE$RÅþ² ¢Ç÷áaý+óŸû_RÓÙR½CøÔË+ cñ¯m¿j_ õ-:àcþ[h¶mŸÊ kBÚÇÆíÚxzëÚ^Ìÿß¹‹yÿ_p^ç×Ë3‚¤šx˜õÁ¯•íÿkíeó|'áɽYò#úNGéZ–µô€ÿ¦x2ЃÓìz´ñãþûW¥`>•S¼ÜŽ+çø¿kí¤Þ Ô÷0ë‘·þ…mýkFÛö³ðœ€yÚ'ˆmýJMk0žÌÑÊÿ«îJPàבAûQü?—ψíÇv“JÀÿ¾njõ¿í#ðî~ºÍüÒãF”è ÔYŽç¨oôaé\ ¿Ç?‡w‡2ÓáÿfâÎö6ùÖ´`ø­à‰ÿÔxÓÃÎOcvñüˆ‹K•ö †Gnhü+ xvãW‰¼;/ûší ý €ÕûmVÖô³]ÙÝc¯ÙoíæÇýó!¥fEíÜÒçÖ›µÜÀ˜ì®¥_Xâ.?1šÞâ!™-n£íÛºÿ1JÀ<`Ó°=?:¬'8Œ·‘üêT¼¶'æ6ÿ C$Û@R)Ë,N>Yþ4å ç}h1×sýjR¹¨ÆÑÈ ðM(¤Ô¸Èô÷ DA°pA¥ ‘Ner yàäÐu ;  ŠCœ@:SÇáŠA 8êzÓFsíO©åÁ=i ¿SN­!¼QÇcL 2WŒâœ%_LS8ÔR«#ASí@‡Rzþå`z‰D~¦¤ ˜àÒù(8@£=h `àÒû½éwg8¨ÆiÙ8àf€ /N˜ü)ƒœñN{Rùçš]ØÐ3øÒ<ûP¹Í&x梚×íƾd‘“~øŽÿ²{öÇãS‘’HrsÐ}(n£uO¨ ÐäqýiAô¤¥ ZOj_Æ 8Ó ¥Ÿð¤!ààÓ‡'úTyÁ¥þE0$Î)A¨÷S”æ€J úÓA✿^(sŠUoZ1űÅÐx>” óƒMœR¥!4gu¤ã½àiÀãéQƒÅ/˜üóJ?JŒšU'¥±(lŽôíß…E‚;Ò†¦=I7 PÞæ˜=Mh@}è.ì `IFO­7w­;<ýi p4à{T`Òƒï@çÐPL-@n:йâŒÔyϵ.áøQp$Îi¢ íJ˜éJ 0P I‘F@¦dv¥æ˜gýz3Í7 ñŠsŠ1#­9[·_¥34ddu  9 Ç4ÌŠ]ÙlÐ"@qÞ€ÜÓ3‘ÚÀž”À“©ëNbYA‘€Ý×Ü{Õ«=îí<Í‚;Í1ظþ¿…sÞ/ø—à†öou«ê\²L’âÈürhW—Â7hî[Óü9ut¦ Fþçknh±ŒBvdÇ>õk_Ö|=à«)®üA¬A D»ž(œ|¿Vè+æ¯þ×¾"ñÚËaðûEylÇËöû€m¬×܆Ãç²ü5ÕˆöO~Úút6ŸðÿG¸Ö'ÁKDÂÿÀ¥n•äšä~?ø± Ãx«[m2Îi#NÒ\ä&ð[|§’pÀãší4oØèvikkm ´ 0"…¨ü«N4 ÑéV®´Z½^ºœ·…¾èÞ€&™§Ãf?ŠE]Ò7Õ&ºx­Ò?º ï´æ`€’p:Ö=çŠ-ãÃh}8ãd<õn‚‹$3kpçµeê^%²Ó[c9š~ÐÂ77ä:~5ö-[Y?éwc€ÿË ~§êÝ*ÑÓ´+=1vé<–ÆI>æªý‰2Úmk]È\i–Ç¿Þä*æ›á{;óLóžZYNæ?‰­€¸RôïNÝÁ NÀô L''éIœýiˆ²Ã9ª5´»óz@Fi’!??½L½ª´‡ß­$ÕîJñç€O¾kÖåN=+_Mð'ö/„ZòeÄ×,Óœö¥Key™hò¬¡CÙETÖÛý ó×zÙúJÍÖ‰û ™ôª±¡û5åþ&hüËWÿо Öÿäà|ÿbÆ»ÿ¥zE|Çû/Ædø“¥d•¤'þýµ}9­ÿÉÀø/þÅ}wÿJôŠ)|)~LÛì/Uù£Ð¨¢Šå7 (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€?7~:Û·ü-á¶Õ¥ÛëÐÀuüë…¶ÈæDVèú ïÿhüŸŒ^1ù‰Æ¦X®;ã=ókX³"²íns¸uôíþ942·Æ&O ]‚Û‘|·ÎÜt•ç]ýÈ Ì„¶=èkÌ[Y|››7;FÄeXA#Њç¿iŸ…v_t6éµm?@Ôlf1Ãy©¹XdúÄÅA9Ü7/¾µç¾ð†±ð2ÃÃú5ޝkˆ|c­%´º¼̶¶µ‹(Þ obäò2*´jÖ!¶™îþ?ñÞ‘ðÏÃ/®k ¶ó(ã·¥’F<*ƒÐ1<ö¬ßüQÐ>'éwº×mdÏ Ôa$V#*p È88>ƪþÕµx/O‡Dž[ÝGO”Ío ξv@Yœ`N:0ï^ð×Þ#ø¡jÚùZ½üðé:V•<ÊÑÝJí¹ö1ùT.:ç“E•­Ô{ŸMÞjÚ&“y«ê7‹e¦Ú§™=ÄÙÂ^:õ>•WÁž<мv'“Úݮ¨ÖÛLéthÁÎ zzVWí/ð»Ä¿Ái-m%YõPb¹žÒÊ2«+'/ ä’ÝI_R˜ï_2þÏ–úßÃok^)Õ­otKÓdûdWP4Fè¹8WpbÃ9íŠ/]Áɦ}¢o. o™¶ƒœî!@õ'8¨-5‹=~~Åc«ÀvŠ ãœ¨Î9ž3^ß´?|âÏè:}Ήâ7Ó$–ÌM:¸¸ A–4ÚÇ¿S^)û2jú†›ñkKm1ÄV¿ÛU-B“#1í€úUÈ­¨sö>àŸDÒ®ÈûN“§NÌOúË8ÛóÊÕ)¾øfïÌ3øCJ1ã%þ¨oá¸í'öŽð¯ŒÛQÓ¼5=Äþ%6—XÚÝ@cŽyR6`¹œqëÒ¾Gøeñ ÄšGÄ]þÞêúúõï•Ŧr. µã+œs“ô©ök¨9Ûcí¹~ø ”xfÑJ­å´‰»þùn1UeøàI3³I¹·so}0?N[³oñ ÂWž%m x‡N—ZóÍ·ötrfbý6x/Ÿs_#OûHøÖkº Ôîm­-.<ÈôiòQ`¦&R?º>äšj rHúZ€> àÆúÔYÇ }œßHj”ÿ³¾‚Oî5Íf:—1IÏû‚½&×W¶ÕlìïVH­Eå¼wA<¡fT‘CØNztí_4øëö¡Ô¼=ñCQÑ4ù µðýƒ}•å{!<­*õl3·w J-éÄ|É+ôÿ³µ¨fTñ]àr:=Œl?0ªMû<_+#Å–Òí5ƒ ÿß.kÕ¼/­CãoiÚÎEÍê €Àí#žx ŽkË>8~ÐvõûMÓGZ½kq=ОvŒBþí~^ä|ݱÅ$›vj×3¤øâ›l^ ѦÈܳ Çäj”¿¼[a.4[ž«xéÿ¡'êß|MįÙø‹O€Û‹€Döì 4R)äg©0{ƒQüLø‡¡üÒ4ëÝj»™µ L6ö¶!L§,ØnÃåüñM^öÿ!ikžPÿ |u4ë9×>V£?÷Ö*¼¿|w «·‡.]Xða¸…Áüž½¯á÷Žl~$h²êšU½ä)†í¯£òåVÀ#åÉÈ#§=_ñ«cámã\Ö.£±Òí±çHQŽ2@ÉäŽ-v›Ÿ;IàÿÇ)I<#«³gn×ÌçÓå&©M¡kv±»\øoSG$˦Mý¾“øñÃ_-ï_Ú¤Z§Ø•Zæ1£ 'ƒ†‚xãÓÞ»¸¼XÕã¸eF;Õ¼Ì*(÷à ’ßúüD’{5ÿÙXù‘µ«>x2ä+JÇÇwVy!¹³î<­AãÇäâ¾µÐ|ugâ’=Ä֜腤ŠÖùfm£œ+ž¸©§›ÍÄ3ÁÁbI"Wu#•éUÏ%¸$š,>6ø¾Ï×ÇzâÐ&³1ðÞkV/ßcOëwÄ“‰Gþ< {…߆tû‘+Oá­éCccX@/“5Mþø2õA—Áº'˜XåÍ>¿w})sËúÿ†Tym¿í!ñ Øý·ÃÖçI´—õ1Uø¿j?FA–Màz>‘ èk²¸øEà6dfð•¢È-ÅÄ\ÿ²Aèj¼< r«þ¨[18Û¥:öäY¿È§Íåù Æ]·íkâX@2èÞ˜ûÃuþƒ8­[ÚçPR<ÿ iž¿g¾¹òÜÏUßözð}æZÏD„½O^ÍÇëYW?³ŽŒë‹_ë0•$·¼¡~¸AK›Ëò …¿íwqsá9@õ‡Yÿâ­Ïó­ÿkm±»ÃÚ¼\t[ëyš%y£þÍPˆüÈüq ¯™¦#~<:ÕY?g UHx¯N•Ü<í>DÎ}ÖCO™u_˜YžÍgûUxJr<ûmrØw"ÖÞ_å:Õø¿iÿÈÁ~Ñ«F3Ö]+üvV¯ŸöwñD@mÖœ‡öˆð<ËŸíÅ„c9šÂìè1µ[ƒã¿î¨ñNšÿž‹qþ‡¯“eø+ñ J qÚ Z݇á’3T¥øcãÛ@wøKRb" ”ÿã²R¼Gf}§mñ[Â7C1x§Ao÷µ8c?øû-jÛøÇEºÃ¬éSƒÞNÙÿ”•ðtÞñ»0“Áþ"á¶éìàz”š¥ua©Ú®otZÝOñO¤Îþ€h¼{þ"³?C`Õ­®›l3$Çþ˜º¾ï’jò‡q¶¹×È|*üÓmBÊ™‘a#¯›héÍiÑxšÎ7ÄZÄßîÜÏóI ³?JM–,¿ï)ΛöȆtüXWç…Œï`eû'‹.¡=¶­"ŸÒJèm¾"x¤(ø×\ûŠÌÿÍÍB>ñY‘º:¡ oNkâ>*øÒ6ø»SöóŠKÿ¡!­¾5xæÜqâ=øÿžš}«~¾Vh² O´A'µ(,„Œšøößö‚ñÄ'çÔ¬'Ç÷ìUôZ»oûIxÑ3óéç {yW”ÔYwõºÌÃ"ÌSÍ|ŸíEâÔ>›£Íù–­(?jÍb0<ïYÌ:Ÿ*õ—ùÄh·˜µ>¢CR‰:WÍ–ÿµ»†o…f¹Šþ6þhµ§ím¤m~ªÇëå¬2íQK”w>‚¯qŠvå"¼"ÚßÂŒûeÓõ˜G÷ÚÈ0ÿÇ]«R×ö¦ðÇß¼»¶>’Ø\壕Šèö0:óI“ÜטÛþÒå Ÿ[EŸùì’Çÿ¡ ­‹_Þ¼ Eâ%½ôKüØRä—aݸlSƒ+—·ø—áK£ˆ|A¥È}þþOZÖšöŸ}ƒkr·÷„ïþY©å}‡tioÇÒ—w®*´ 견L?¥!½·P}X VarÈaK‘UVêŸã^ãŸÚÁßɆæ9ï†J‰1$­þìcŸÓñ¯œõ-sâOÄöy5@x^ÎCþ¢Å·Ü°÷sÂþ¡áO†º/…åk‹kO2õÎd½ºo6w>¥ôªå©Mí¡WÄ?>.üXR4ø ðæžã‹» K‘ؤ|öõ¬ཛྷױêž$¼ºñ>®aq¨ÈYÿ³Ýó¯LŽŒüª*NjÛoFBV+Aa ²„DUU   8çåQ]ÞÃg’i%Øâ²Nµs|ÅtëRTÿËÄàªþ©ý)l3jIc·Œ´ŽRÇ/‰>ÐÆ=:ݮߧ™Ò1ø÷ü)©áÿ´¸“Pîß9 Ü"ýµâ!PBØ ~‚1‹uª6íJè²Ï¾T^çñ­{M>ÞÊ Ä±¨ì¢§'ãJE4„ ŸJ çŠ3ŸÂ““ÇJ bçj&x£ÓúS¼vÅ'8úÐ:zMþTÄØðçÏJU|8犯ssœM3¬q Ë;O‰·ª·f¹“cqquâ½] …b…A « Ü1Ó¯9ôô­½©$¨’)<Ò¼ ÆUn.ÛTÍ€2}Nö¹ÏÜKÝ«FÅN$L{•%Oýô¢“Ø¥k¤XÑ'Ù­ß[JrW?Ÿø×BœW'¡+ u¤oãëÅu ~jQw@ôv% 3RzÔ+Â¥$qýj„<t§/5éRFrh*…O¡¯Mñî«xRÒ+»$Hª3ÏNkÌSI}5ÌqDìLqôÉéSdVêÄv÷P]ÄÏo4s fŒ´lV*Ë‘Ü0 ŽÄÚ³5æÛ§ÊÙ5¬çd2HxŽ5ÞíÙG©ö¬ývÞc¦Ê‰l—Ïlïé•U@Rw“œpàõ§§@hØý˜¯Ä/ăÿ!µ}ð»N´‹â7Æ+ôµ…/§ñ¬Ý,`K$i£é̈ÍÔª™$ vÇS_!ü3ñ­×µHõ Eœ |ë“øÕõßÁû¦½ñ'ņZo[HG¡:&–j¡u úíÈÕ4ì¼ÿFz]Q\g@QEQEQEQEQEQEQEQEQEQEQEQEQEùáûP„°øåâð‹±|ûg9'ø­!$ÄŸjòHgˆ(æ—,;ÿ<~5ë_µpCñëÅ¡²-H'‘ÿþ5ãmp6ª&A€ý°=AïALè4Ó\µÖa¾Fž¢êˆÙ$VÏ"î ƒŽøæº+Ⱦa&]ë‘þγ|9k½NKèÚ¬{¯ú ǧn•zÖUk8þl±@vñœc‚{ÖòIROÔÊ?_ÚãÇ–>8¸¾]FEÐÒôŸìYc_- WÿR8Ê£Ö§Š¿f?^ø»TŸÂ6Ð^xc[+=œ·q¤ÐC6Ù’6!ò™ ñÎ8£ÔŸC„øÉcâMG㟈!ºiÖd»imM«adƒ hIê¾^Ò¸¯Fø¡áOëú¦‘ªxßÅsø7ÆWÚU´Ú¥®œnË·kFÇe Y}jωþ4[é6_ X轤ørôøïõ{5Ìí…fÞyp8€¬Ïˆþ¹ñÄÉ|džÕ¼_à¯Û­ÛO§Æï-‹0 èAÃÄê@`Ž;Ó{j·b¯Æ_ˆ¿Ã¯ˆ:áùçµð¾‰§Z2•Ò BMæw Fï1‹èGµoøãÁúwÇO øcÇk®i~Ô¤ˆØÏˆnY?´$e“±Pvq$Õj^ øygá?x«B_ivLæò[‡³–Ò di"„…9$)ƒ÷IÀ¬‹º­ÝçÃÏXéQÝx´ñem£H -›ÆJÏnìKüÁÃõ9µ¥ØŸÆ_uÏ€ºw…|;¢ë[¶¦§¨ê¶ ³[É>È‸ ¢"uÆrk©ø½à_|mÐ4}gJ+sâÍ ×Ë :F·6’|èÁ˜…Þ¬¾Ûƒ{W¨hžÐþiv;¾¾½Ò©4Þ¸ÒMѵtRû·q°1ÁC)Åf|V× ?ü ¾¼¿»ðŠ_Éo{uw„ºYÑG—„!b¼óF½CÐõ=WâFµðÁY¸Ó§‰µË„³‹I¿˜MU¥›än'wqÉã5•ñGĺ¿Ç/êÞ„ñFˆÑjé¥éèÛo­ùVP™'zÞpjÖ£á}ÇŸ u(5Ímt­Ú;[ûMbHüȬ¥Ú±ƒï‘~òzŒ×-àøQðÛÅž-𯋣ñ†¹¨O—&·bé°¶Y‰ I åUCtÀ£È;?g/ÄuŸx×ÄZn££hZN˜ñÜ[Ý@Ð5ô’!…7ŽNì6@8Å{ßï¾-ü5ÖtD} YÖt‰ÛM»[´¹K†‹™íŽå1  ŒWŠ|,ñλñ™u¿‡¾+Õîõ{mZÅæ°º¼¿Ø. D“=BžU³ë]ŸÂÿ‡:‡ÁYñ^µ¤êÖz<¨E©ý§30U@*»›–LÁÇEÈü);/ˆ¶ÇÞ5ñf•ñ Ma®¯!ñ$:‰’H÷°?hr…}3òã+ô&÷âÏl5X4­gÄÖ7‰$,út¥‹@î ùlÁvän¯nÕóçí)੾*É©KðïE¸µ]PHž!ÚEñPÿñðßÂÏÆîkʾ/xÄ:GĽv+¨¯5csv×jQÂηqÊwFá”cÀqÞ›þð-6=#ã¯ÇÏè_5ë;B÷KÓô¹þǘÎDnˆ2Ž o½Ÿq_U|2ñÜ7øqá¯]½¦q¨Ç™-®®V/1•Š4ˆ‚ÊH'#Ö¾jøðöÞûIÓ~ hZ÷ˆ<_¤éÐk:ž‡p!ÁÕC2‚ªXã°¯?ý§d’_h7¶’B|-q£Z¶€Öü"[*…)ŒðáÁÝïCÕj ÙÝùûOþÑúÿÂÿé¾ðĶÑÜ‹Eº½¹žÙeY7çb¦î1€I#¹ö¯@ý›> Ý|^øy.¥j«­ZÎö·¶G(?2º¯L‡œ¾õó½¾áß|ð,ßu›Í Wóî-tKË+_µ\ÞÚnYû¢BÁ[üiŸu›ü1ð–•àÝNìhÝ\›­NkI^î3·ìï;£Ø¿ÂO''Ö–út »Üú+ã·Ä˜~ xFÃRû^ë:ÈŠÎÎbÈ­Œ,G @ëÕ…[ø7ñN÷â—Öz¾™i¢êvñ¬±%•ßž“'ñÉ ©Ç\õÏ­|ïáXaý >j6æ·›©h¥ÄZÆ©+y6ÌØR®Ç²¯aÑ’º½[]Õ>|¼×íõ3^×BC¦YêZ4­*B%ye  !‘’yäÓQV°]½O¤üM­ØøoÚž·¨\ÖÈêî£;A_â#$qÛ•çÚ/Š5ŸŠ~ÁÞ)×[XOY²X^2 Ñ^"ùÈß((+µ³Ó9®áÇìïâχþ4²ñWŒm‘áÿçU¹º·¼ŽV'æH×c70=4¬–ƒ»zŸqÂîÒ5ØBc¯¦zðO§ÿ®¼ªãö‰ð 2o?ˆd[Ôºo$–íän˜ œgõ¯-øoûbê^2ñ\ºoˆml¬¬ï‹DgI6ÏCœo‚8ä¯Jñ¨þëþñíþ›¨øcXñGta±¸¶†AkxÅð²< p„rH#¾håQÜ9ï±ú<“¤‘(r[8%x?O¥`xŸâ>—àÛ›kM[ÄÖUìЉ‹‘2gÇqœõô5â>+ý±ô߇^%Ÿ #µ¸Ô¡¼$™P 6)S•2{W€þÕw¨üR—Ä-wöÝ]´†ÿI¹ öb€úœ2A¿Z9lîÛCôIuË·Óí®!¿0Ίc–'.Œ„dlüÙ^µ[QºcKsoi,[‚ù—¡¿%¿.µóWŸŽoÁo~³ñ³_Iu~f¹Ó­ìâW–;=ÿ»gÉïÛßí\·íqñE~$xÁZ¯†¤šOO4âfu1ÉêàyR®N0œ¯=Í.E¿AóYV¿‡ô-@?†ô;„eÜe“N·aÛýŒv÷5ŸyðçÀ·Š†Oè9˜î,¿ üëæOØûâ\¾Ð|`¾!ºø>É"™¯®Ë2ÛO#m I`3€?ƒÞ½SâoÇ="oƒž"×<«¦¯©[yP\=°!ì–S·Î*@ €ö$RäWÑh5=¶„y@>³ˆã9ŠY£Ïýòâ ›à&F+¥ßZ¹ÛS¸ø‘_/~Í¿MLŸý µI7ìÿ¥­iâ_F‡d6òŒ~(+Žýžþ'xŸã‹5Ë«ÍB4hœý—MŽÞ1´»–Û¸€1ß9Í}º<ò[+ˆ ˆs·hÈÿë~”š¶ƒM3ÇŸà"€d·ñ¥ðEêfÓ ÆA/ÀÍWi6Þ1´œtýö–ʯ+/×ò®kã7íE/ßÉáýLÓõSkûeÅÁq‰Xgbí# ÇQÞ½;á/Ží¾*ø"ÛÄ6°ù7, W6ˆKeC‚¹ôÆõŽVµÕìp÷_üKm!ëºÂæÔ“bت¿ð­|^¨ÞSè7xunfŒãÔn‹ë´ø«ñ/IøIáh5N'¿šæ&ÚÎ $sÕ›$p1Xÿ>1hߤ,-®4ÝBÔ)x.$VbÆàGUÏŽ§Þ›N×ÿ º½Žr_xÎÚt{)0»³­ÜÀ”sP øÉI ái¤9#÷¶Ògƒx&½Žâ(b¶–YgKh S,³HÜ*ެ}03\ƒ¾8xÆÚÔ:>™¨Îu ˜ˆÖâŒJG$éÈÏé+½†í{´šGŠã“ÂzØ~Kuã®j•ÁÕS&çÚì[¿¥ÌÜþ×½Jv+i/øqXã ø»ã5C³ÅºÁ_ö®ÌŸújü?|onF|Cs&9ýý­¼ƒõŠ´¥øcá;µF_ iÑ¡ãÌK,õR9íéY·_ <"¼‰ yaGü°¾ã¯Óühæb±r?ÚÇ0oí¸;dÓ`ÿQZ¶¿´ÇŒ¡å®4©Ç£ZÈ¿ú ¢¹7ø[áw Á5{L‘¥1 è>fjŽïá.Š ó!Ö5å ÷ »W‘J9¿­Ç CûSø³w6z<ƒÐ…'ó”Ö·í[¯DGŸ£ÚJ?é•ë!ÿÇ£jò7øKi¾&ÕcÎB«Ç ‡?Š ¬ß ¯%0ø®R¤óæéñ>¤0¢è,Ïz·ý¬îGúßHqýÍF6þp­iEûYÛ¾w‡ï”w(ð¾?ñõÍ|Üÿ õ¸W1øŽÆR8ýæžêzûIL>ñ\%‚_èÓ؉ÿZzWõ5¿í[¡¸ÌÚV©ý»FßÊcZÿµ„åâQ{oÿ]l¤ÿÙCWÈãÃ>/4yømxÏ=¾hê?ì"m ýè5(Î~€KݧÙÖÿ´‚gB[UX[²Ëmr¤ÿäV…¿Ç¿N3ý¿b¿ïÊcÇýö«_ˆüUáü3}Ïʸ…úz â›ý¥âˆøkYSᷠǯ sE¡ý0Õ{Ûü^ð…ÐD?G¾ÝmœãÝ€§-Ü Àž#ìWçîŸñZþ -·ŠuAÀêòŸý©Z¶ÿ|JSÅ:Ãcû׆_ѳG" Ÿy)¡èsO_Ãñ—ÅÇÄ7Dvóm`“?œu£ÇDã:Ô ;ÓáÿÙTRå]ÇÐûK-žsB±­|ƒoûCø²'Á¼ÓåèG™m"çÛå”V”?´·Š#4z[c¸7 ŸüˆqK“Ì5>­ÞÜôcí_0Û~Óúêñ.›g'?ÁxËÿ¡FÕ§íMx¤oÐ÷ö/ÿ8E.O0×±ôfXœS‡OzùúÚ¢?ùm¡Þ)éò´/ÿ³-^ƒö¦Ò]?{¦ê· µFþSÿJ=›ÏvV uüéÊÄg¾}kÄí¿iÿË2؉8Ì–Œ1ÿ|–­8?hÿ JëÏ/Ùà¸ûHÑÈÂç­‰N(û W™ÛþÐ> —ƒ«Û©3²ÿèH+FßãOƒî[ ®XçÓíÿWrK°\ïƒ3Œ~4ÝÁrP|MðÔäˆõkF=öÜÄßÉÍ_‡Æš4äywñ¾zmË,Òä—`º7óŲƿbN<ü}Q‡ó Ö¬ ÇÚàï8ΕŸ`ÐÑãÔ~tõÖ¨.©g'Ý»„óÚUÿš;ˆäÎ×V#Ѥ2ש¥ó¨ƒü'ò¤ßƒ÷H?JKŸÂŒŸÂ  œü  ääçòÍW:‘ûSÛýšMêÉ )Ï¡=x3áÄ$$±Iwü-9Üäÿ²ƒŸÒ¼KÄñ¼)à{wšþþ;·Œe²á"_©¯ñ?íU¨x¦GÓ¼§K{O:òm—ܹëø~uçvŸ "Ô/ûÄw×>"¾‘ö–Ä þìcŠí¬ôøm!Hâb‰8XãPª>€U¤–ȇ&Î.ÿºÿ® ž)×g’Õ†N™§¹ŽìÍÕ«£Ðü-¦x~Ü[éöPÙÅЈ“ýOSøÖÐ=©¤á©½w«§ÝÀ¥#Š¥y¬[Ù¿–\É1écs~]¿¦ßÚz À"ÂûêCý;zóU¶±ÿ]*¡ì£–?AT þ¡©dZÀ-c?òÖq–üüjÍž‡mfÛöù’ž²9ËÄÖŠ Es&ÓÃð¤¢k—k¹ÿ礼þCµj*ÈÀÏ^”ìzPr(¤ÛÐëIƒžhÏ&ñŽiƒxô£v;õ¦“NÇ?¥2oq8£ð )¤ñLC±ŠCCRžh—âM.}oJkhÚY&–5(ƒ'ÆzöIì=«N"¦r) hqA#¿*ÏÕíDÓäkfU{Œ$ù|c+Ž£ïýêºÇ<âºø&çÅš“ÉDÁh¦Y_ÝQø–ý )ìTnÙÍA§›KÈœ¯$WÛCÚ·|g§3P†0rIúb¹ðÙ>”©«D$õ'9éšynzf¢CŠ\÷"´$•‰ÛÓûb sP¶v“Ž•%«äŸ\f—A“H}éÑž9æ£~¾Ôøþï=i)ø‚ËûFÂ8Y%’24±Á AÉ]Ä;v5‡©hvºv•p©±‘Œ»œ·cÏ¥u¬~\b¹ß¾4ɇå4=ŽfÅNè”÷`}»û3é°i¿³÷ÃãšÏ{¢ÛjW2Ï3Í$×7(..%grX—–YóÕ¸ÀÀ¯‚5›«ØtXŸp¶—·6Ö‘\<~`„Ë:üEµÓ< n÷š^ßßk? µ;ïkíe-‡‡­%º‰tÛÕ¸3LFÄS³¹lœö¯xñ‘âdý›®"Эo¬RM3̱²»¹óæŠ,new˜÷c$þuòÇìãus/Ä;k(Q'Ò¯í®-õhälGö=™‘›ÓnõI'Ô—¢Gkðûã=ÏÄbëÂZÕŽ‘¤·ˆí¥Ó`Õ4Ë5·š)ä» ê‘ïX? >xçÿ´‹ÍSI¾ðí–—t/.uycÄ0Å]ˆn‡p\ õÍt¿ |'ðÿKñ<ú§„¼MuâoéÖ—7šfybbW™#bŒ?1^ cž+‚øiñgÅ ãý.;»íG_µÔî~É}¤Í3È—QÌvºl'¯ÌHô"Ÿà'¶ºžàoŒÔ¾*Ûͬü?{yw"Yëñ\¹ki¤Ü±ÌÑŸ—ï0'3^;…üW£|NƒFŽ ˆüQ¨±FûH&àIÃçП›>†½{Ã?³>kñBqã SÓlï]ŸM†söæD$ùA1Ëàpk þÖ¾3‹Æ²^Ëvƒö¿ŸH’!-÷`ÆÀ…ïœæMù7ˆÓྡñžáu4×èÔÇÛžÄÆtÙf <ÂùÄEòN;f¼Ó↫®éÿ:øsÃ~=‹SÒ4MfþÜÙêë7_e²Âv-ÄDŒ6å7¸¨¼[ã~Î~ðÿ‚t[Ëo¶Ëjz×’'†i%l*G¼a•UÜ\×5ûB]E©MàícHQƒ'Ò#‡Gˆ }›Ë8š'ÿ¦ù'¾A®ãijx3Åß¼}ã«íGKÔ L–WmºË4¨pn±î=I¤?# ^ÒüAûJø+K×ô›}â}FÓµ+m±$·ÏȤ…ª°°ô«š,w¿³ïÃ[•ñF‡gªjž#¿-¼9¬*Ën‘Â2ÓÈá²à. cüI—Oð×ÃOYøJòîO ß]\O{¨®bž[µ!vH ü¥Pd.qƒšêôiž5øm¼EâxtÉô»¸. Ôõò}œÎ™1ÝÀ!†qŠvîÉ~ 'ü,‚³ØxcM´Ónô[Ô¿¼ÐôbYn"a³rÇ’Ù¹ÇLr´É|3¢ø÷WñfsƒWJû%õ•ÄmÞLî¾LqîÆNáÒ»Ÿ꺟„’ëš_‰ ñ>·s™ˆ´è0,¡Ì+¼Û˜ >‡½r~ñŸˆh_ð‰uYµKù­Ž££^\à {˜y*ìÂ:–ž‡Šõ5<¨øCWðGâøe¡êš7ŠŸHÄ‹¨Ý “% `n*ÅAÈç á?f3{qñNÊÖÖîôËËyíõhe8‡ìF3æ³úm#Ü ôO‡¿ µß€ÚF«ãOÁQiqµÍ±²¾Že»—ËŠ#°œ(g,ÙÆxSáçÇ[¿‰…ï‚õ«Dÿ„’ÖM:_I±[Y¢ÇîÃ2õFo”z=¹Ðü+ðÏÃë;Óqá=vûÄ·VwÝéšV«`#G¼Ž'hÄrçž$`îÂæ¼OÁÿ<]¥øòËV}BÿQ¹7ÁçÓ¦™Ìw› L㜑Œq]?߃m|y C¨iZŸ‡tý*óí2ê²ÀR dC½ä~S§¹ÛxOâ¯Ã½{ã 7¶ßíìg}I¥‹][‡fV,qpÐä'S¸Ž”ÓþPÞ3üMû0è—_o4ëx{N±šýAÑ®.H¾·W`L µ˜dÏ¥AâÚGÆ:OÅBÔgÐü7§] >ÛJ’5*‘B6 Á9m¹<÷¯"ñ÷‡üC |LÕôýCÏŸ_MEñ:ƒºyKå}ÙR>µíß“áU϶xÒmr-½²ê׌Z5ÀD™ûÄ~T–ÝÔ™cÆ?¼eâ/Gãÿ‡±,–¾ o.-d»Ž7Yˆ"d(äoŒ²’8#³âOˆ|7Ö4/.‹áùþÃbúŽ®/­>ѼÒ/$VÁÏËÇ2xâ¼ö“½Ô¡ø¥qš`Ò`µ4u¶r#ûÀb+ƒßœ÷ÍwóiZ/Œ<ðûÅþ/ñZø'ÅQÛ´0\Ïln´­á`±JÊ+ÆWŸ¼)Úàc|VÓõOŽÚ† ñ«i–þ Ò|©jö÷6ºæœ[}¼Ò£Èo”HŒc>”õ西|ð-‡Å)l|yc®ZÛ_²Å¤›i#–Y,°,›¶–ù@Èë\Ü~!x—ÅúÆ£§x‹P°Ôà»kˆt4ˆ$n` ÐïÏzóíÂ>1_iZ-¥•ížµ h9ƒŒÉ¸ösŸA^߯kÿ 5OŒ÷RÉ£kjÑ_ .u[ ÅŠÎY6R‡$) “ƒÏ>´/îƒó1>"~ÏŠüLºÿ†%Ò´û zµ%Òµ+ô·¸µy”3¦Æä®âH>†µ1xµ‰Î’P`xN­ŸììÛúפx¿Ã¾ñw‡ü¨xë^»ðÏŒ.t”W[K´›¨ˆ†YFAW)¨¢ß1;•~)øw\ý¡tâ†4‹»û©"m/SÓm¾so,8+"/@ެ8­DºÓþü&±Óu¿ ý³WñâM7‡|FÛá„D  MÅÆs…®kã–¥?€ôx{º…ÂxelöNÕÌ-¨NîD²0S• ¨ON+CÃ!øçðj8õÝ~ÛJÔ¼;åÛkÚÔå´Rä›w~X@eõ§`f¯ôÛ|¼·ð÷†ìü>4½Iu+› š[mJP‚t',Z6©èâ¸ÿÙÆÒ]TñVµ®Ã,´ÑçƒWŠxÈBA¶(Tã/ÈôÚMuk£û;ü(Õ5M/ÄvzÖ­¬_¥…¥ö1žÖÅw»G? t«?u_¸ðV¹}}©¾¯o$ún¥s±^¡Õ>PVÎq‘C_p¯Ü»ðžoÏkâ¾Øj:OŒ_I¸ŽÕ5;ß´*¶Þˆ‚¨l‘Î+Áþkºí§ÄŸ^h¥×c½Š;xO%ض6±ƒg¶s^³ð¯à—‹~x±|aâ‹vÑ<=¢ÛI}s<QHgÚ¿,+µ,Ä}*×…¿i5ÿ„ÛNUðׇôÛ+×hޱi§¬WvbL§˜²IRÀ’y<ÒZü!êw tßxgã6´Þñ^ ³½Ó‹½)4¿:Ö5,K*Í‘òƒc¥xGÆÏ‰-Ô>-ø‚K›ûý[[“6\º,1§ã+†Ï}Õì_³—¨|)ø¡¯h> Òo M)ŽßS’Iퟔ‡ A 9éÏ5•ñ×â/ÃCñ/U³Õ¼ÿ -ݦËyµK{÷™•@1áN/ÝÉëjwÐomL¿ü4‹â®•áoÝx“EðŽµ¬iëöÛmbS¼• ƒ€êœ÷æ£ñß‹uÙçÃðw„5V·žê#ªê:Õž ^É!Údƒ”PõéÒ¹ÚêK¯iÚÒ¼rxwTÓ!“Gh—lqÀ/–N ° zêtËO Éð;£âdºµ»]Ü6.”Ü‹s€Ûƒ˜÷ƒÂ…¦«qyò¼AûNøâÊIVïÆ»Ì3Îëw6²ä'C©LŒ‘‘OðW„õßÙ§I×Ö.L~›Oûl÷Ó’ÃOš6\Ã'Ô@ê=ÝØy·…?h-oãU®±à dYisk–rCc{d†,ÜŒ2£ä‘µöãÔúמü1øCã)x¶ßÅzjkÅþ»£\Ü {½.i ¤±Hv²ªö?7¡§èžß?í©¡Zøºk?øFÞ]!o<•ÔägÉßû ôÆO^ëçߌú&©/Æ nNê’öãíQ_JÛ {wãp{(B¦1]®§û$kÏã9ôûOH]%¯ hÏx>Ñ%»ÅŒ– Û¾hø·ö‹Ô<9ã ¼9¡›ko iAtë¶Z,²„ó¶N2¹ b’×mÞšžŸÅÏ |ð_„4_]jzŽ«ýš=µ¸°“û£"–ùHÀ$œœW˜~Ôþ:oøÁzž‹$¯á+¸¥d•ÆÖûR±޹8*¸ÀúÕŒÿ|Gñ/T±ñ¯‡ô»½f-NÑ>Ý ±óM¥Ä`+ÏÜnO½[Òå·ø-ðËKÑ|Y£Újº®½¨ÖÑõ•>V €‚FP <’>”´OMÆÛkSköEñÌžðÿ‹åÖî’ßÂö+âîé‰Ü1Ûå¯Só/'ƒÖ½/Ç?´kŸ†$Ö|ªA¬jv1*”·RÕ]¶ùÌ àÈÏn•âþ4Ö4ψ ¯¬üg›‹|—·úM„%é\mó•I,v‘ü«˜ýŸ4ùì"èQ]ê7úÝÕÂÚÉa<­(pçh`§º’ð5ö²ê:mήúzjvp¹‰âYоGlnÜO¶+æï„ÚåÔF­á êËÄ-opºÛïÄËo1F º/¼ ÏÊÜŽ{WÎ0Üê–ž'Iâ󆽨eÀýïÚ7ôúî↯ñ}bñÇí7âØ¼]¨E£O Ž›o3A ´¶¨Ä;ImÃ9$~õ€¼AgñÀzN¿,†â-ò F%$WOq¹N=»×‚|FøkàMÆ:Þ¯â[½]òa¸Ömí,ÖkkiÝWwÏ‘‚Xž;`×ûBøRм_aáí&[+ÃÚ=„1iIm3*Ë(o7 ÅŽr} _F$Ú=ûãwÅ6øh4m.ÂÒÒûYÔ›ÎÙu»dpƒÇœ°#ð5¡ð§âþ9±¿µ¿²²¶Õ-ˆ.×~ÝŒ88p9çB=kÁôëã/Âm+RÕµ«}UÐ/ÞÆ×ZÕ¤`—p‘¿Ë/É,¬xú×E®ÞÞ|øw«ÙßAuâ ná,Åõ‹4°Ú‡o™”a‰ãœ``Ð’jû¹ïþ!ž×BÒ¯u;鼋+8ysÆßíqŠó_|r°ñuý…­Æ‡>“ ÃíŠþâåg$\uä×%¤xšûâ&/„u­J]Bß[·6ñÝ o.åG˜ò #%9ê0zä<3ðÆM­ix¢ôÿ içÝ_[ÝÆçËOŸ µ‰ÜqÇÏjVKq)6ô>¦ºÓ[Ìr~rqÎ1ë×üó^}â¿‹¾øyâÒ5‹ù–ò0E‚FA‘ÐãÛ½y=ï탮Gâ;—¶ÓtûÎarÆÞi‹pþ ybZå¾,|<Öu¯O­ip^ꚸSP·ÔÖ•%ÚÅò¼ŒÚ‹%¹\Ï¡õ]¦¥¹¥ZêmȺ³¹O:ÔòÈzïíÚ©kZöûû¸ìtø˜+ÝL~@IÇJñ‹ŸZþÏžð燂]kwÓ+^MјÛ!và•û§žN}+—ø»ã–ø­ð¾ËYÒãk(4ëæ‹SÓËî*X*C€2½GN9£—¯@sì} ¡xËOñ‘«[jInÃÌX[%7w ~=kQîæ—…’GÉÚcžyç5ò‡ìÍ4úwˆµíeç[}NÓžKù$û­Ÿõh=\Hö ^ÉáÏŽ¾ñœÒéz0ºMyíå{%½‹bI*©!w<œtÅ·ÕújzišÞRÑù–ï)å£Y#Žã9éÚ ¼³³•ÄSéöSîûÍ$(ÿ™#Ú¾ŸVÔ—\’ùæ™5ApdfÉÞ% ŸÏ=«ìññOCðØ´·ñ>¥‘­½´RÏg&ìÄÌ ¶x#׎1øRqO`RînIàÝ錡é²î8­øâª7ß J¥dðýªz8JüˆüëÃi‰z«ëÚMŽ“w=žš-æ+›i }¨¿ñ cÒ~Îõ {ÃÚ½®µw,°é²£ÿhÝ?ÊL-PA#ØûSåBLô+Ÿ†¾EWw–§§“u2që÷©"øo¢°ÂI©@Ù¨LŽÝÏZoŽÔ—§Š&){›?– W kñ€SÄVަÈUîâ†@Ãäy€ê{ ý)…Ê0|BðáP]²œó1B?/ñ/ ½~Ùà´ïüs^r|; Üüòèšqm»F,ÑG¦?Zoü!ÜÛ4‹pÉϲJ.ûŠéô=CþŸÄ8ñÚñŸüMz/‚ôO‹þ&²mU¼L|=áØ—tºÆ¯² uÈ,î; ùOU’O†RYx¯Ã¡­5 6u–4™žx&ù°UâWŽ•æÿi¿ˆ?µ9_ÅüóÙ#òí¢Px à)Ù¿´Kš]¡¼Iûhx³Ã^3Ö†‚EëÅ i üi¥1‘^]Çh!2ºÇçJ 'ï9°=𬠛¨ÍaëÚ¶¹¥],nÑXv'+÷²s“ÐmÏ|ñ[ƒ˜Í2CÇJöÙÿ]ŠÎ×]±vUv)2‚9a‚§ŸoOzñòxÒÚê·šßÚ¬¹r 2nÆài5q§c§ø©Ç⹄d‰q{“\è<ÕDyf昃<§szjµ³°U!+’ ƒÀ«Û´¤:Õë¥‹Ï™Ö qÖIáëô"ëö¶aãÓ2#k‰GÌêôΦ÷Ø«w':,VV¾eì†Ãå‰Féèµnñ¸BI‰ÆTž¸«vJu=B%ŸRy’Aºúe2¿Ú rkIF‘ukh¬%ˆ³F²Ž7c¿>´Ì׎*D< †Bx54|h`‡±â¹Ÿ1þË›Ý<×HÇŠæübátçà:HR8k´ó£Ð`_šiµ}<$c–}·Q;`wÂ+±ô O@kõ ¿1|>‚‰þ…¾höM*¡ä+‰m”0Þ î¹ë‡aÜ×éÕUm)Áz¿Æß¡­-\˜QEÈtQ@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@yí-ñz/*ðö½©µžmjpke¤M6én¹Ã‚T¨ë_Hürñõ‡| wuyek«½Û‹HôëÄÝäòCêϯJùî?ZüTøgâÃÞ°ðƱo$:¡Ó´„mº”1’® ’ë¸0‚«íä)YÈö¯ˆß.-þ ]ê:³i¯jB iu5›0;ü¢gV^„£-Ö¼sá§Ž5ïŒöZß|MªÜj)}kçé÷SÆÒê,º;ü6zšÊø- ºø›Pñ ¬Öþ·Òd‡T´¹…Ýï EdŸwÌl[žÕ<}àÏAðïGÕ4oI¥’WP»[`êfXH«íû€iî´Ø…®çÒR|Q¼ð¯ÀÃwâíçÔ´»gûÌw #.<$Œ±L’¯œ<ñ~_ˆ÷·žÕôíF“Ä“éðjš]šÛL“°ÊaÕX€§ë\Gìñu<¾<(¢ãF¾²žßW‰Û÷bÌ¡Þíé´… ú]ÿÃ_ø JÖïuø–ëÅ:þeuu¦è÷¶@yV3µƒdî* wÀ£N‚»µŽcáoÂOx_â.“«i—ÞµÒçûmΧ<%cŽ(Á/†èr×uu^ ø§àWâTÚø"ßÃ:Ž¡q j&{Ùµx.ŸUSp 6IKàÆ[9>æ°-¿j¿Œ…ÍÛÀú Ý|úsÀ¿%¹llÀ…=}j¯ˆ?f?7ŠäƒGÓÞ÷Dº¸ m¨ù¨ÂäÒÙR ó‘Ú‡æ5äcø§XñHøÃ¯Ëyqsiâ(ïdù-ŽBm9P£ mÚí^ñÀ>×¼^Ú¦£ãokúµŒ7:–%“J©$‘ƒ#‡RîûØ#‚iš—Å ãâÖøgFÖ Ñ•-¢Õo#cyt`7nÎÝ$gµqß<3¬ÅñZÕà³Ô5+[ˆÝÚßClÒ†IW„%FCòþÍV¶WbÓ[Ä?‰$ð7ĶðÆ{¢hZ,ZYج¬±ÜF) Û÷¸Åmx‹Â:¯Žõ|HÒ.4}?T¾ƒf£c©^-¢ÜÏòÙã Õ]Bç¦ -ÒøqµoøkÄÚ=æ©ã=3Iˆ\ê–7ÿfû(tŽA´ïdR£=yÅ`|}ÕgÑ>#h:ÑŠ;ôµ] Ȉ¨*àúȲO®A¡7¢wÅ>4Õ>ézôxln®ÌSÔMä uË9ʤ[¸ÚªÜ:‘U¾ øsļ%áßé:=ÅÆ±aišž›gÄ@ hæ…:`Ľױð߈>x2ˆzµî‹~s“ucn'šk À"à»iÎy5Kâ½ÀðOÃïXx;Qº“Ã7¾}ãjèÍ ·wA¶²È å6.R}Å ܽ§øS_ ¾ÅãÅ«êö¤&·ðî¬5·Ž%ØglÁ˜¶NhüLÒÿá(ø!¦Ëá}2 6ßN¼ûf¡£iò´û’E ’òYŽÒ0AèV7…t³ñ“á%Ä:ö±o¤Ýx{QU²×õi Òe%íݹc‚¡‡\gÞ·µ‹›¿€ß «¡kpjZþ³p¶?Û:syÐCcyÚYF‰cøO4Wáî·æü4×åñ´R?ø­±°IÝIvÓ#'–?…Æ‚{gµUÓ§ðWü*ïˆ|/ƒW¶×~ÉÛ“W•Q§ïý÷Wþ»¾*Ö—â KöˆðF­àýRòâ_[¢jºl—¥d(0Ê\»Y°[¡Ç5[Àž×¾ kÇ)Òm¬“K±h,¡Žd•/§—÷akS'=i;_]Ál’9ï€7-¨øŠÓD“mï‡õ-.òr&|$6ã-æ±<RªËõÒü5ð'€´ÜëÞñ{xËXÒlno¬4ilM¼’LˆJ¾IÃmûØH«>øŠ>#èú‡… øZÿÄú}Žþh-™î#`ˇº¾ükø#ðïÄÚ'ÄÍ"óQÒõo 2V¼¹¿»¶híá†0L‹.+‘œç¥'ýá¯#+áßÇ/[xßKmKTÔ|A¦]܈/4™¥i#¹ŽS±Ð!ï†8ô8¯Vð‡ìä<9ñ òÞßÄ¥¤=ϔ֢ìý¾Þ ùÚc ûFÜf³<ñá>£ñ6ÖkIáýVk©ާ-ÛKn“¾ááFâ;f¼çÂvºž—ñUÓõh;|&ÔôKm×FñŸ4zµ¾™¤Z#ÔW$SP Š#“éMøOáÛ߇^Õ¼Uâ{Ý*ÎÊÒâ ËØü±x²/–¶ûdîcœŽ´;_]Ál‘Æüñîµã˜<%ww}®øwÄVoe{ks)#1–2Œœ.ìŽÂºo†?4íÆqkrx»AñmŽ×Ϧé33]NbRU|¶¸ÆjßüKá}qµ]Â~¶ð_Œ5a¦ÞÁz÷*䌘b|·uVÁôåáÖâv‘ŒM¾¸·1¬I*( ¾g¢„ œúSzî4:ö²ñÅ¿ŠíïµQï4F¹ßq¦2.Ï!ÍœdaOÖ¶µû0xÊjQøjÚÚÿÃú›«ZßÉwÉC èÄ8 6â´­4ïšÅè¾Ï}¬Å;êÙ[iãû:I<Îìeb-޽«Çþ"x‹Ä‰ñ+^¼Õng²×a¿‘¥ò¤ Dêß.Üv {bo®ƒÒÚž±ñã<ñ,^²Ð4?iÞ¶‹M7zÝži¤@ï<…Ýj¯ñ+Ãú¶·ãÇ–š%æ³áýbÎ)$‚8qbê¡&U*‘•‚ ]ñçÃïx£_ÒüE«x»Lðw‰5K {ëýPœ™~g,¤m €H<òjçÄêÞø—£xSMÕît}ÆÂ6Ym¦òÓQg]þa`yRN=±M+’üɼsâ_ øSÁŸã/·‰&¼šKë--Ic¬|ðÕï„´ÿìo Ú^Ⱥ†˜e2¼w.3Ò99p@e é]Ä?^|mðþ•â ›(5½>VÒîæÔn„1ÝÇ€ñ¸vàºî Æ–çQÕÿgφúe‚=ñ'ˆn‚ï,—V‘[Fq’~ë\}/̯Èâþ Áf|ãÈüRd6ð4ÏQy¼y&xó6îÏ·Zêü#á­áøuªêÚŽ±-«G%­³>Ée‡oÞm¤è9­Ïiº·Å¯‡º†ƒ .·§Ê5+Hl Xð²D(¸°r§ð®áÃß|2ÖµOø¯L½Ð´}'O˜ÉÚšùä_--ÆAÈbÃ>„sõ­]>'iZLk6©eª–Óï,$‘š9mäRNÑógýšô/ |ð¶©ã>Ñ%þÙ;ncäl'`·ÆbÙþÎÜ~9¥mue=è^,ø¡{ðq´Ÿ‡Þ[ È4kAöéõE¸ó®_ç“fáò¨-Æ;V´kãß„<9âÝ M–ÿU°FÒõM*Â?–¿2KvVÅY×¼9áßøSÀúÏ ñ^¥çéÚü gÄq„x®1¹*9#ÐÖ?…¿g/Â]§¦¯§É¤é\ .uQ*Ž4;‹.9;p8êFiJWw`—c‹½×õÅšÝÝãËŠ>Ôé! ù‰6ÿ›ùjöŠÞð^©â‘{â?/ƒüOwiú–˜¶Fxã£Îå#žJöªº—í'¤·Žæ½ÿ„B¿²KÏ1/ç·ð¨ly›ñËw…r_|©ÿÂμ»”^jZ.©*ßÁ«GºIo Ü9åǰ¦üÅèuµ­%£M67CéÖîû£…È?1ÇcÓšæ~0_Øj_|?† 6ŠI¢{I|°]îË›ø‰ Ñ«Vè½¾“wû9ü>¾Öíu+;ÿëWÂÖûN: hWÇ$csÄvKÂ?5ßú·¼K~næÔíÙôÛ•@ž]Ì8 ´r¬>•³àýA“áw‰-u›É#ð¦!–KÕ!.³òTpnr9ãª~Ó¼#áO xÇ\ð­{âÛiû^Ûù2YÂìIó–«Aé¹GÀÐͼÚl„Œ.öÿV£‘¿Ÿ–äúOÅ/x—Mñ–µpßë}õÇÛb½‚‘.UÆä%€Á 61Ú½ ÅÞ🇼áŸèø«ÄVzh’i!º0=š9Þnæ!p9èEs>øùâû?jhz¥Î…¥ØÍöK{PkÈ :œsZþ,øe­ü\MÇžµG“R´V¿·žu‡mÄgc÷cr¶ÞÔu×QôÐÉøÉo«ü6ðUï†í̓á3Aö<堻ݖóOñ1î=Þøs4Zÿ¯ËâÉfÂi)$äfE¹6y9êØëìGcOÔµ«ÙãÁvÚ2AkuâMj鯯-®Ô\Akû¥Ž ܧ¿µ–£«|løCt¶Údv:–™v/!³Ó 1Cx˜ÚûS.8<J6^BÜÓð¼žð·üKuà}BûV× ÓÌG¨À#–'é´rB±ú­x·Ã/ë:O´9ìZãQšK¤„ÙX‹•íhÏÔ1ç·Zôß…¾Ö<7®Eâ}zÒ÷BÒt{In/ Ä œ2ì€À¸‘ø “á·ÅÍã‹ôÿYxkU¸w‚ÏV éo#©T%í$ ær)ßùX/2¾±û>ønãÇ׺u¯t›HÙQ¦¶Zæ5-ÌjAÁ`2áY_þ.ë¾ñ½Ö¡Ý]èZ.‘¶Â n0ãêÇ®~•Ã3jñ· à”øŸÎkE\æGb‡¹ÎûÕëŸ-<³aŽ'Õ[ÅÑiÖɨK£íò¼Ðƒ!ÃwÁÅ%§Â=Ö¥øQøã¢èÞ.ÒšÔe evo¦¬Þ_ cÁ<àûƒéO´·¼ýž| +\Ii'‰µû¤@ð[Åœœ•›-œP+#ã&°ºtž ƒLá·ÓM()ܲ÷Ëç‚ẃܚ“Â17ĆúúøªüiÚ]•ìSZëÞL¬0ñ*ñ¸· tÈ¢ÝCs¢‡Çücðö³àëf6úŒÐ}® ã…-£¹’.|³v#=I®'á¯ÂCã2ïUÓ5éÚ|¢òëQ¸ˆÆ"Hþr›ÞºCÑþø/Å^'ðu5‚;Hf‚#±Y åI<ã7`ï\wÃoŠšòxÃN²Õ¯ïõÝ"ùþÅsa4†]é/ÊJƒüC9JZz ü-ïÞxÕµ‰ü§Í÷ššf2Ÿ>ií¸pF+Ͼ4é:•—Ä}^kɤ¿K¹>Õoz•šBÓŒ{Wqÿ ݬ&¿>™o¬hòé_jÚ%ûjùÑÇ»êñ’Øíôõ¤ñ§Ç}WÃ^)ŸCðÓ;ÃúfÛ(`’ ïû°³g©8çÖŸ¦„ëÔž 3F¶ðƒtÙßj:´ÂK›+m=ÂOklø($' À-ƒÓ"©|F»ÒíþÚYø1d‹@]NA©,Îv˜°ÈÀFn>µgÇÚˆ~%ǦøÇÃ)w¨Ü]Ú›J;få022~ë8ÅAáû6ø3ðßS¾ñŸ«kw+o‡zŒG –E瓸ì=ééóºœ×À˜&Ôuý[M”ÐntÙŽ¦Îp‘ƪJ¾¼}Mv¿ ¼/àË/Ãu¥x–_ÜÚ¤“[irÚù^t¡ PXœ8Ç5WIñ”^;ð׉<7£èvÔn¬ÅÄ_Ù«·í¢>Z6÷#'zá¾x{[¿ñÆ— œ3ÙÈ%=ÄѰ"òÎÀö?\â•­¸:WµM[W¹¿—P¼‹SkÃ+'˜DqŽr¸ÏNœc¨®ÇÅ n5}[Oñ ®³¦xv÷W²Žæ{-FcoeÉqÁàðy¨ï¼OðÛþ‹Û£ ^Ë"ޒבܕŠR–1ƒ¾£¿ã\Ç9/åø‘©I"K¸’ÑãŒÀGÉ·¶1Ç•NýIZŒõëïƒ^Ѽ9¡jê7;õíZÜenY¸ŽTÿ]géÖ±ñ¯ÃZ¦};]ë`_ÙI€‚@VFÇø'Ö­iÚFª|Ðfñž¡>“]ÌšTÖñ‰&x8ÎT»»v>”ûèt¿|$Õn<6«ý£x–÷º›ÇåI @¨2=ÇzmäWq¿>_øGWø²Òm6ÃHF»B²§ïFTd1=zNüÓôïÚkXMVueeý™ç Ûc"E=sžHµÏüñ6£{ã;=ãÎÔôýI^Ò{Y²ùENæäàm9ö­­'à.wâx­O‹´«›%Ÿ÷¶°³¾ç¦ìqœã¯4m¶¡êrß|®Ûxªþk{+Ý^ÒêO´C}*ʯó@ëÏJôÍ/ÇÒ|ðv…¢ßÀúޝ:=Ä–æ@¿dFlªg‘éêO¥rž øÍª[x“SûÝÞ•em/‘k¦Û‰'Ê7dg j¬uO _ý“O›P€ýž[XDEå^B6 º…ìz†~!i¾(T–Ö ¨ãg*²J +à½? ùwÇz•ï‹uY5-Éz³²ºdü˜8{b½çány§Ùi÷Öé³FJHf…‘B¯WÎ1Œ{ÿ:«%ÿ‡|yã-a"𥖡oo&Ïí ©XI&8ÁÇÓ¼ÐÞ¶5|ãh´Ïx}üArúUp¥Xµâeúõ¦ ôï Ýå‚KŸº1^ƒ§9œ‚ˆqêO§·s^má§*Þ­z” €rtÝœŒÓ×s¥ŽeÙû’ÇåÛò¯cŒW¯£Ø0f ó×[n²¡Rø#¸ý9®[ÄR#øÒÁvå1†,1ÎúÍìh·GÝŸ mÒÛÀš2¨ÿ–9ÏÔ’Zë3ÀþµÍü;x'Gcýk¢šÎ*È%¸îÔÒißÃLŸ|Z·>..$À' Ï¿oÆ£šBf$ r@ŸJrÈ_ç-´·QŸOoðªäîܸPÝr8ÿzS$òoÚ'ÅMgáû=~Þtÿ981€}‹è&½“Á7B_ i Ð}ŠKäýÁÀÅyn»ð&ëân«}¯·‰mlekU´’ÚFdXÎÞãžOã^µáÍ)ô}&ÆÕ¤Vx Žeä«·#Øâœšµ‘)>kœ·Æé>+ø©Á­êivñí5 Wp¶‘O ‚r R'w°¯ ðO€¤ð_‡¼A®xYÆþ#‘#Óí_F¶“̱Y /)F²BàÓ&½wöŽðþ§âφ·–ºI’[‹ic¹’Ò,×*¹@’2ÊÒÿÁ-ô=gGý næ¹·»Ó-Ž•snâbmd–G‰ü´Œ¾>|‚AíN6k}E=Ö‡‘hw¾4ñáÖ¾üA¹¿ {hg±›UR†Îæ?š6b@·*sëëQü;øa­ü“Tñ®¶l¦²Ò,ÞXO¾K´NÇb#l$…ËdçWêoÆÏY|EÒ®ü9¨«.§ªøwJ³º³Ô®£{ôA¬E̳säÇ\ñ\­Ïì]ðÃá¿'ÕtV“L—J†ÚçÃV2™|ã%ç”Ó8•K2*€Äc©ÈÀ­d•Åh·có{Áîþ$ÿjv:6ˆÚõ¤–Pjze’[H“7(®Ê2ÈÄm úÖÂoƒÞ(ðÇ‹í5jÇUðÄzDÂõµ mÊÛùQäÉóžT|×è_‰ÿb¿Yëþ.ñ;¡â×5+2Î5‰l Ž9¼¿)aÀ;°X‚¼)ÛÅv^<ø-¦üQÓõŸ‡ÚV‹má´ÝetÛ}L‰ÜZíQ'Úrq'œ¬YsŒ1F±ÖÖCäM´ÝÏÍüIð©ñ ‡ƒbðÆ«}$ÑYk+xï¼Ò+vˆü£,ÑÓKK_´Éuf®fT$ w9äPoˆ×þ;xoÃ4ðæ‘6£wmntOGÓ¢%lÞ"Y4í«ô«‡W²øSðªÓLñ·†—^—WÔêÓÃú‹4 e i°Ìqó+;g¸ñST¹ð†ü ¢øG[¸‹Ã÷1Kwý·líÛ.¼Â¿iùv£i'榶ðÖ¡ñ—á“/‰5[}ÄÔ>DZ®JR;¨eRþK> ,¤<5-¿È:”ð*€3ÔV+&©û5|8kÍ'R´¼×¼C}䮩`Â{h­á\”ŒbÙÁ*-;ÄZÿí/àW÷….¼Y¤Êšžžñ*À—ŸÝËã n1ÇÖŽƒê™rùü3kðwų|9mFK¸ÒÞ=EõVAuo`Îr`)}»\Jåg¹ç×õÍwÃ:›IqáSJ›ûJI¥m–kÜ—= ¶>½+·ð®‰¬üð®±âéfðÛ>-*eŒÁ$¼ûs½@œšË𗎬~(è^+ðŽ•á#Âî©`^Ò]&=Ÿmx˜HmÛ##p Œ´zl ýMx_¾Ó5{@ñe·uÚ\j6Ù42G3(Q+nc¹W–Àã5Æ|0øåâSÆV:?‰umCÄžÖØ^iÒ¹“zL6nAŽKdcÒ—özð÷ˆ<=ñ*ûÝ:ïGÒ­-¦ŸQŸP·x£[uS½NáÉ?tù®¯á‰¾_|A„øS÷Ú‰f[…Ò®¯îüëD¸daÈNT’xôÍ ÿ(m¹Ÿ¢~ÉÚ¥¯ŽbKÝkI›Ãö—{æ’Îù^èÂŒN]w¸ÇcZ:'íQ¨jŸüëë-4hBð›e’Í<èÐ.eûÙÇ|äé^eðâßSÿ„ÌÛÛ´ñÝŽ '¶2œæWÄ9íž_Zôí{Àÿ'ø­yÏ‹/,nfÔ6ÜéqÚj%gãY{)$ŒöÉ£mµ×Èä~#~ÎÞ2oê2è:&¡¯è—ó›«=Exxäù†óž݃ôÍtÿ>#xOšŅõßéÞ:¿Ð¬!Óîõ{©ž9^d2\eT£5ÂüUø›ã /Šè•ö†öWFÞ{†H Ž>#AÁ@9ïšì¼uð‘~!ßé^-·×tO ßëöß]i:¼æ <ò6´ˆ0~W+»×š-óÚØ§ñ‚êæoˆZ'Œ-¢“PðÖ¯¦Eö&ËhŠ› €QC[Ç„aø[á(~)Ûj’ê3µÍÆ—–ËÍ­›7Ȳî©9 T¾)xà]æào j/cm¥ØÅ%ÕÁ\^O'ï ƒ#”ç¢ñ/ƒ5ÿÚ3Ã'tx’ÿÄQÓµ‹W™ ñüÉ4{È^Cr«íïO¦¢ëæf|fŸO¶øUà¤ðH¸‹À¦k†‘çâàßnäNG¶coµ'ÂÛKü ñ™ã-JMÃzmü7ë!™­n_!âDÎX2€Hc­uZžªg†š~‘¬hV¶¿­Ü©ô}Uð[ÇÊ€J–$ðAàVˆu©~7|š?è–úEÿ‡µus è±b+˜e|õŒ –VõàûQù}ÍI-~|"×u?øŽO^ÜMo§MªCÀÚ|LÁØÌNçÀÆ:Pü3ÔÐÓÈ£÷jÊ*›ˆ$ûVÃßÚO\ñŠ%µñSZI£ÞÄð\Kif‘O r|¥–E¸ÝŸ|WðþæŠþ‡Lµ‰íÞ¶Ô¢â)- 7žÎ{ ¹?P+Ð~øOáE¿Ä›6ÐüI¨kWèò›=öÐE Τ^o9âÄ:v9˜~|HмNt;}Í¥›Ók2ÛG,=Øó‹HppkoâÇ Ÿ]+øHñ<3$Ûw;–îçÊ ¦CŽ*q‘^`Ÿü[§xÚ]rMRõ5½3Ëhò·–X?1Î1ü8ÅzÄÙÿOÖümwy§ø«ÃþƒGxú£+GqbePÌ›@#±Ç4Ÿž£ë¡Î|W´¼_‹7šµÈ¦‘âŠúËT¸·2*[º‚ p¥1°ŒñŠîüIeáì¿ø{Æz}þ±âí­åÒææÞÕ›tB]Û²€zï\ßÄß~$øoâ©|á ë@Ð#]:;y#V32òÓ0aÕ‰ÈöÅhê^ ñ?ÆY¡s#©H†ìWimçŸàí_Â~ Ñ&¶°Å¹¸Ô`ÌžbýõVíŸÖª|ÔçñÆ]zëÄ—ǪyÎE›HÁ#`Ä`.„ZøÕðWGÕ¼wu¨ÛxÓAðýåük<ö«ºðdVPFÁÇ9¨Òû\¾‡ñŽÏPñfµ£øËJµºÔ4-WOb[xZAfÑÚ>]§‘ž¹­Û Ÿx?ྉgñI¸Öþö[½;L†SŬu¤-@bÊ*o¼w¬|¿Ñ¼ámFm2ËM±Wžî%íóH7´™ årN¦jž×ÿhéZõ©K¯éR¶Ÿz÷ˆRæ#—8]Ã@ÇZ}5ßB·ï4­Cà¡ µ›OÑíµ|ë6—2ù·Ù“#¿tàéXÿ³äj?ð–ÙjÄ/ƒdÒžMZ\ñ ÷NG™»8öÍuðÚßþÎÞÖ5}RÖÝüE¯Ï­–Ÿ#¥ÍºC Ò8RU‰'éõª:OŽnþ3øCÄÞK 7EÖ¥‰/톗n æKÂáz±#éMùl%æXøs¡xB¾ÕµŸë7Þ'ñŸ¦Ïqc§ßÚˆ0ÛpÎ?¾Ê¤œzó/‡ß'|:oˆV2Zx" ú[’¶º³Ý<‘Á#d$8‘ô'ŠKû£õ+ø“övÒæñõ凌ô]>ÞK݃M¹˜­Õº³ÝãHÎ>”ÿ|mñ'‡—§ÌׂòÝ£ûHuÚ°Ã ¸õôºÝp\üøe}{¥ëï®êÚ¥ÚYZßvÛÀÝ»•f=ý…Tð_‹“âbj^ Ô¼I«ë©«Û2[%ý²ÿ¢ÌƒzËæû ¯9)¾ã6~k¹¿·“Ãþÿ„WU¿†hl®íæŠYF*N<{f¾t6:¼*±Ç3x/<µy—íøÇ¾îs_Aü6øeâo]Ásâ+Í4xoOG¹™­'ŠâGXÁ`Š>ðÉ{ ¡¥~Ð> Ô5íb<4t±tOÙnvGz°îìÇœã¡æ‹v}Ç|NÒ>ÝxÂáÔ|)5­/O]´ –².Û„HPg œdç ö§§@ÛsEÐm¾%üÒçñ&±‚úN öv½èßçÆFæˆò aˆÁÏ¿â­a¾|3ºÔ´~oQÔ$LKý- [X@ƒqNÖb'9öEwkçé³G‹{Åól}£0ü¶× ðûàωìü[a}®i÷z“`ßm¸¿µcù¶©üÄŒ~gµ7¦âZž|²jsjÓÞ e]f;“#ÿÏC(lþ{«Ù>%ø/š§Š#¼ñ‰×Âþ º¶†[ûµó‘&(76A>£ÛÞ›¦üeÒ/üa.¤žÒcºóñ!Äáw}þ wæ¼ûâׇu=?Çz”“‰ï¢¼awÚÆÌ²Æãràãg…'ýᣭø±®]xsþÿ xzêâÏD²ÓÖ{{˜%)ö×~ZbGrsÇlâ¡ðµÿÅÿ‡º†£z©y¢Ý$¶º¦¡&# ÃÄîÝVðð÷…¾xGMñÕæ£©{¨`³—É–ÎÝÈ(¬Ýò9ÁéœU/ÞXIð’Ê?ÛKgáøµŒS>ùüÖÆÒàŒÛO[ySK¾ ÿ…M£êÞ-ÔçÓõ‹«8|6;9I~S#ñÆ:îOjÎðGÆŸë~ ‹LÖ.ßPÒnÕ ºTˆ+"2íÝ•§kàLR^kšÅ•ÀQ O¦ÊÚ“É÷c@>GínÀSé]Ãm Àún½o.â½rý—ÚeŰ„O2!1å¿‹ ‚h^BµŽaþøºË\»°µÓdº³YÊAzJ2nÀfç zäv5¹ã¯‰:w‚õ+o YhÚg‰ Ò-ãµ’÷T‹Ìw}à¤ô\ö¯3¼ñÆ¿>µsª¾¥uéœÌéæ°U`zmÎ01ŒW¤xÛájx¶ïO××WÓ$9ƒxIm¦€ìÚ¹¡ñDøw⛆Õõ‹ý7[(Ÿm[(ÁæíŠœÖ±>2jŸeÕ´M#Mc‡l¬PiÍ|²©ûÎHêIëîO­gk¾¾±ñ®¢oíµ Ý9ØÜÅw æ_œŽé]ÿŒ¯|;àíÃú¿ G®_à \R‚Éä&AÏÔg®i«=bKÚÌõߨŸMðÄ/‡$Ñ|qc¢kmo¨Âtøµ¨µ˜3+nXžÔätßÒ½ZøyðC¾?ðñ‚? è×Ñ^{ ¾µ~-š7È.mñ “·÷ƒqzäyìí¬Yk¾,ð,þ°‹FѬ5i ý›Ëv6Êc%žÛ3`ú¯|vGãµÒ^þÕWÒÏx—zwöb ÉZêæáL^IÈ:¬½p0ÃŽÙr§«Üèæ²Lú¶/ÿ ~Ým:ÚÏóFñü@°h$¦Ä ‘é“^8có࿉Ú4zf¦Ñø#[¼[b†ÿOº½I˜3lCÂ6/Šg§¦~»ðwƒ~)ü ð^…¯k]èÖöv“[ãÅútnŒ©„š5eêFÂxèrFkçßÛÛÅW^ðWƒüclÿ٥î¡,zk¾!E[‹BXŸ˜îŒàj9uêm%jí¡Ò|pýu/xUÖü0¾&šãI€Ü›{ÿ ÆÖò¢œ±kˆîd …ÉÎÜqÚ¼;á‡Â‹ŸÚÀÓk:‹ø~_ܬbDÒ.®í'/ÎßôxÜ©g‘_fx/Ã6ú§ÂO‡Ðj~kæÖ4¸­EÄžy Îг MÊ—$)9#$ â¹?ƒß Wàׂ£ðíݲÙê:…ååÛÉ}e¯ió”BBdÛeYvÙÆW4¾`tâå}þ_¡ò¯ŽlSàþ»¤Cueâ/KÄ¢Æ «v€ãzÜC#‘÷sÓµužÓ"{ä’çp…`‡¯¥pÞ2ñ†©¯þÑZ—‡µ}RïÄ:E­ÄɧÛÜÞÜ^Cfvݸ@¿/%€=3Ò½IO%–(J»PNp§œsß§aÇZ§ª9ôLÄøúÑ/ƒäÍƸÆ×üõ¯.ø]ðãGÖüâ~ëÏûvš‹ä…a°î$Àƒúb»ïò7ü"–2fh׸ ôíXÿ‰_ƒ¥I0Jç…j4O|kðχ´k‘}ŒÏs=Äg÷{€(?Åߥ}6 ‰¸»m«ç [ÁÞ Ð¿iùn¾ø~òÇÂÐn <Àì‹jpÛŽGï° z>¥âƹ˜Å§¡šSÁs÷GÓÖ¢ú²ùZŠ:mkÅ né ?y«’ºÕoõÂëbgþZ¼­XøUµ)í¥¹–Yå1–œÉÑ_{ z êŸì¶PSÌ”Œ$1Œ»~¾-‡eÏøÁ¡+ÀÅÚ¡‘®­Ã ÁOɸœö$’=ˆ®ËÂÑìñƒ—§üK5üïSü+?öÔîuoÛÜ^É,·snÊû˜T(Ï|à+OÂùÿ„«Âc¨E÷þ—-KZ¢ ïÌίÆ/e½Ò>lj»½ò2+¨ðƒïðý®y b¼ËÄzsßüA¸t+B3ï†"½CÂÑ4ˆÐŒ'ŠÐ„îPß1¯7ø­)½¸ÒôÀ™Íô®{GÆÀ)þñ‘áê0W â½ ç9í^eñ ùÞ0ÓDgy‡MºóBóåïšßfïMÞ\˜Ï]ކ·¡¤ïÙ?ËOÄŠŸ ŽÃàêîø—á!ÿQ+sÿŠý¯ÏÏ‚œüRð˜<ÿ§Åüëô¸§¹ÕO`¢Š+3P¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¯Ÿ¿n%ÏÀ¹[8Ù©Ú6q‘÷ˆçó¯ kÃlû7ºø«Hª ÛÝÚJäœ`yè¹üØSC[Ÿž þPËœ}:R[ÉÂOÌÇ¥ÄUØŒ•<€\úÒ³° ¬û½ŸJd–¼ë¦¦¹ÝþŸ1#`€zúVâ[˜£%C>yàž+ÂQíW*6 ½sžãäLýúõ¿-ãÁnJýåÙ§zCZ#Ï>=ø·QðOÃ=GPÓCxdйŒsk¸\÷ö±5óç߈>%ø®u?kºååì×¶Æm2òy K˜²êI„a¹OÔúÕt©~$x1$—KµºÓu›@Ïk%èWòÛœ0Ú0zt<+žðìáiðÿQ¸¾Ñt ¥º¸‹Èv“QŠp©œ¹aŒ3ô«æqV3”yšhðï ø3ÅŸ .µø®áZ=*Ѥ·ŽÚ÷Î7¶0Øè ¶N}lxö¶ñÏŽ5«½*ûÄ¢jú•œ–v:僼J~dFpßqŠ…#ß5ôWˆ|wªh—š~¡áíBâÊæ†THÄ™SÇð“ÏÀW‰øöc±ðŠáÕšMoQx„0ÞémG#ò3œqÀæš«.¬NèsÞñçÇ ï4/kž$Ò¼{<šŽ½ý¢î`¸ óÊYÎw6€p~n3šô þ âoˆ¶…áÙ®n´–´¹ ¤j p®åU…»N ƒ"ƒ†$ ô5ÖjšU•ö›sg¨ÄÍeqÅ4sDê 0 õ®+æ¿þË·šoŠí./5›ÝÚàLVÝŸÎuS•mœZj«ê-|'Y7í…ñƾ6¹ðüæÆÎûT¹´±žÆ×MŽÑí®|åe S¿qfî¾ÀWѾý¾tx|yý˜»¿]OP’K·„Ço7ÚØyÑ Ã"oUeaó$W:-¾Ø™™·äb@݆À=GÚ¾V¶øã? ü@u±ÓÚïGŽój-*l1náÜnÈÀëÇóªU/¸š’Øõ¯ˆ·—‹¯|I6•{¡Úh÷:oˆ.¯î’áâW¶ÆÜîl¿ ääïôÅ}#¢~ÛPxsÄ^ ±×uË=?ìš<ÖºÎqs"Ë,÷xÜavRʧqÎ3ë^;ªx'ÃÚž«ý^êa’Qw5¸ó2¸Ús׌ g5ò'ÆOëÚ_Äl\Aw©}¦àÜEy,ÂTs•ä :Û*šÝŽ\ÏS[ÄßïNñ߆Æ×­âëO¼½Kiäe%dFäb»2kÓ.~èž2Ñô[ÏÛÝÉâX´ø-®î,®| åxÃe€ÂçƒÅxOío¨éÿÄ1ˆ4Ä´‰4¨Ð‘Zªí 3ÜÀûÑÏÌõ!«+ØéüYñçà–¢x×NÒµ©tëA6¡&«h·H.%>aX·}ÕÇZ£ñ'DÖþ5i>ñ¿†ô»D›OìíGMÓ¡.,&‡ûˆ£å•ù®·Gø.ÿ<á}g[Ô.4ÍbÞÓì¢xá}ªÙXù,ù*A#<ñŠæ>2Ýjÿí¼3áß]éú}µ³Ý¶¡næ&½¸v"F85]Nê±Ó4ûÿ¶VöT–ÐÆU—bpõÅ7¾»‚Ñ+l\øiñŸÄž5ñ^ñv±w®h:ú6›,saš&a$Rr­ƒôÍ^ð—ìÉâÆ7úå͈ðö1»¹¼±½I$1Ä à ùƒ6Ð:q“W>ê?Ä7-àm/V°ñØnF–5{…–;aÚ‡Ævç5åŸ õíkJø…£.9nu‰¯V&‚By¹°èÃÜnÍîÐôý/ö®žçÇ‘^ê:Ž4¹n°×qÙ¨½†&$oõÞÎO½s7ß³ç‰äñž«`moÞÖIYôýlZ¼–×›ruåA–è^9|_ >_|Mh-<`Ò•ÔI} ÚŸ&›8+ž2GJóï|jñ¥¯u;Á©Þé¢Öÿ‰g˜DQ*6Ezc}c½ø“ñáý—‹Ž™®ø@x¶ÿM† ;½q.Ú'žXÑUòဠ|W ûA}±>%¶°Ò‹.þ/4›…\Gö]£ËEì6`©¢»ü›ÆZø×´MOGÑ Ö!Žý´ÍNëÈš $PXÁÈÉÈ繩> |eÖ¾êvžðɶ^ƒkœ¦þÑf3ÎFéç–8ŒQè ]ZËÂ~$ð—€mþ"I©Ûx²['ka£¢o…ɈO¼`rFb|d¾³ð¦à7Ay¥ðPK4W6òì–êà¹qó—J>!øÄ? Ñ|yá6mR[ëAk©YZ ­Ä?! ¤‘†Í]¾Ô­¾|2ðþ⯠Zx‹WÔneÔßGÕ>îÜc•vÚIúûQæ·Kt%‡Á6Þ8øD±xÄÖúm–•¨†ÑÆ©Mk'ÀO…¯†uØ5S_¿[C®éŠBZÃßå‚y íÿ ûU?ˆÚ’üIøEáí_ÃZ2éZN‹}-½÷‡ìP²DÒÉ8#’\ö§|3¹µ·øuãkßÚÎÞ ™ím`ÓáýÜÒ^+e<‚~éD''ßš?0ü…ðgŠüEñóÞ ð>¿©I©j@Õt«ë¢†X~ôr>8FV<ž‡Öø+ÁšÇÁï]øÃÅ0¿ö}šÊÖé'[‰[䌄ü¿7 ã¥s±^øE~øí¾Úê6š—nº Õ¦Y.>ÿçòJòîÛ»¾)ß4¿í…¸±kˆfðLš¼LÄâ²OûhÊÖžºÜ4Ðo€>9ÉãmVëš֙¢è±ø‚Ú]=um*ÉmçŠg\G¹‡T,\O…~øêÛÇúM”ºEö‹$WK!Õ$…–R6ËL¯ŒÈçž+»øiðûÁZ'ˆŸ_Ðü\¾2Ô´›[‹ë #ì O{·ZdÒŽxÜíd}˜à}*mòßêþ^üJ:­ÇÃøä„j™:êÝ828p|æ‹îïmÇ5æ_ÿµ|3ño[—Yc¨\IvÒ4¤·pIÊö(F+Òn?f‹Øüa¨h–Ú¾‹&…{u²8¤¿Xï-T·ÊLD}õS÷sÍ3ÅŸ´†¥¡x“SÒtˆ­ÛÃÚ^Û;ÛUwo(ÞìÃ#;IÀõKËA=µ.|P±øv×ú0ñÖ¡­Aâ¿ìØÌš\I ØîÄá†|ЛAÇ¥r¿õ·ÒuOYh¼^²Òâ—E’'8™IÌ’7û{ÁÈ=+cÅž×¼a☼s xvïÅñ5²ÜOmÎð¹ùd‹“Uí#Ò¶|K>•ðûIð×€æðÄ>2ÕK¨}“W”G&œ²á„ Ë›Œ‘ŸÖ…¾›ƒì̳a§ü^øG¥ê>%Öì¼/q¥ß½…ޝy2Ý#.÷‰‚œü­Ènœš›]Ôçø5ð‡NO ë¶úæ¯|ðÉâ- °X’,7”¬y IÉÏaÅe|n‚÷Äþð¶­a¥M£éº{Kcu ª1ûÃÂAÆJȽúj¿Âø4ý+á?‰dñÍ½ÛøRîòÝ,lí~K™ow<,x^×Eõ×p¶…ïkºïÇ_ðV½©M©jBí=+Q¼lùÅ÷’Gí+“œïZÞøa©ü{ïø–;6·Ñ­Þ[uÓï’>á†ÈÐì<['Ÿ4±1Ì_dÆ]ØŸºÈv°>¼w£}ÉEÿüz»ñO‰ÿ±uë=J‡YŠM<êºm‚[Ü@Ò)T;Ôgnâþµ¥üñ”^$M+ûP²¾–á-?´Ýż!_™¼Ìc‡>•Óü?ø}à;?Ǫé2‹ÅךT2ßZèÆÉ {©cRÈ7‚ã¾+‰Óþ<øÛDñM–«>³{yjÓ‰åÓžV0L…¾h¶zc€;qF¾ƒ~g¯øwÅ~ñ¯ÅëõÓ|õå¬ß½ñÚä†[‚Ÿ)vT;rدý¢l5KŠºäú«™Rð‹‹Y¶á avq´PkÖü+ðÏQøwñ>âûDÔ4–Ño˜H¶WË Ü ø`Êçg8¬Œ´gˆ4_êzF…öHôÝ5¾Ìc¼´Y¼ÉWï?ÍÓ“Ž; Jý {jSÕl¼*ß¼ Äy5H¼D¶lÛLÁ•,Ëf!0lô;ŒÖÆ+Û=?áß‚ì¼#-Éð{™æ7³Iy»çíÀÜöúUßxg^øÊº/|7¦Ïª5å¢ÛjV–Ü›[ˆþVáaÈ8«-sÁ_†Zg‰ômkVÖ/óûRå,âA°3Ê»OÔ½7·)øÂ?xÅz/ˆµ¦xM¸‚îÛZ¸ùÅà ÀêÁ”d¨=½êö‰£è¿ ¼âŸxoÄx·ZXVÆÞâÎÓÒS‡•ƒÉ:~5[Å:¬_>_ÚøcGƒDþÄÔîÿH°ù„ñ:…Y†~fÚpæ°~XKcsâmKW…áð½¾—"j‘Ì…VpØÆ3›w#Ó©ï®à¶Ð±ð§â†½â?Aáj7ºî‰®«i³[LÆVC ÂȃûÊpjþ‰û.k£Åöðß_i“hO¾ææÎõd›ÉBXâ1ón!zcƒZŸ î¼ «}7‚ôÍRßů§\e®­p²F$ÙÈ\¿Œã9ïõ¯ðV¯¬iž7Ò¯4±$úÊß!Ž#’e¶ 0ïœ~´4þÖ€šèz®µûWø€x²{›-5ôhîw[Á=š´Â Ü|ýC:ÖoÄ/†ºæµã;½AÓµ{@×cðÞAJ@•rQ±“•|;¾ø‰øÝ4ye»Ýq¥­¡u˜‚Ѭ¹Æ2q“Ó>ÕÎü^ø‰âm⣤鷷ް҈±´°¶™‘c‰ p:’9Ͻ=Dìô:/x‡HøYá xKÄÞ³ñv¯on×SÇ{!S`%mË •ç uÍPø…¯§‰| àßxwNŠÃ@Òîd¶ŸD·ŬùÜ÷`ÊxcÞ­kžºø×á¿øµ/´íWš³½þÔ›È[ƈíY£89Èàý*mGXÔfÏØizMͼž&Ög{»»ø€š |ˆˆHÁêy÷>Õ+úcõ4|+>›qàoj'Y¦ðƒÅsG–KÀÆ"'øÀÏÓ5›áIükáŸÜü9‹U&]8š«+DGç[> ø{©ü[Òôi÷–Z>£¨Zùw±ßÜý˜Ï$gg›0`9éÚ¯|OÕ~ÛxÖk_ØêZ¦·oPj†—:¤SJC„uõ=sô®#ãíÜ×^(Ò¼’±øtéÐb?"Ûíéþð9¯¦¤®ç{w«êŸ|7áÿ ÚߤÞ&ÖnÕî äÏpçjEnõ#©'Ú—Å:†©ñ·ÃºÎ„¦i5í ÖöÖ‚1qv:•‚F3ëY:_‡tÍgàÞ’|a«6…kc|bÒõŒË+î¥@½J)Æ9àçÒ¬ë·:g€~jš‡ƒµ{róV¼ŽÖÿY*R[tr§<©c“œòqéH£Sáæƒªø2üEâ]2ãEµÑ­Ú{µZBs)V8ä »9#=;Ö'ÃÏŒ¾¸ñ¬ð‡èþ»¼-mµf˜{fpT6Ç$€O½dü)ñ¥âoÞøCY¾¹ñ«ÛIls;J°8]âu-Óiž+KÁŸ³œ1ëö÷Ú¯Š4MGH±f¸¹µÓîK‰V1»`M½Èœð3CûÁs¨hwF·£j¾¼ÔuÃzÑ ¨n ¹l) “ÎsÞ½câ5×€¬¼Ii§ø²ËSÕ&×$øðÂÇPÐtÈtäÐ/ÿÓ4+Ìx~Re@9èAüM.‚6­ôíáç€üG®x_Z“Ä:ªB–¢áíŒ g¶ðIÉ< Šã>ø›]ŸÅÚmµÎ¬um>ùŭΙqxY§I>R·VÍu¿XÇý¯¯j‹%¦„‘ê0ÍqqòÂîH϶=ꆚÿ€ĤøkA¾Ó(Òã°;6 œ],{ºÈ ¸³Ö¨øïãˆ4ÿÝéÞ»:v‘§?Ù`¶h”çgÊ]³Ô“šóÝïW_œÍæk¥ÏÎúÏ47#×;«Ô¾%ø[Á7~*’]wÄ“hZì°Æ÷Ð[[ùñ ŠÇ#¿¨ö£m€Èño…5ÏŒ:~“âÍÊ]Böx>Í©B¬ªVhÎ7($pA;Ö•±¸ø9áÛÍ~Â)õ­]ã‚-èÇÿY"‚A'<~µñgW¸Ñ®|= x~y­4{8䱚 ›çæ‘Õ‰Î} «Ú>›7Å?j–:òZ>‡w´Õo˜ùcÌ xNþëÆzÞá¯jjör_êöׯ¡†Ô’ÕYFIÉϨ÷®ËÇž øWñ'â.‡ªÝkš~»¨j×+c%·Œ¥w–ÜDåC´öàĹUùòÝ—ä|]á]5ü}ðûP¶Ô/……¶•t¯o«^ÈŒàî‹Ôä`ûf¶´)¾hº¿ˆåÕà×î-¡ÚÇjå–&”ÈàóÐà}I©Iln§k]¢^=øc üWðf™á-OS¿“EÓ FÎ+Oh÷”¥PÑÆØãטüfðç…>#Þx7á!Ô§KÑuâ×GÒî.„(ŽÛ›i~w$QØg9<Ÿ”¼â=NâÎÚ]Bþkñ/ßV~OUâ£ðׂµŸ øƒR¶Š&Ÿç–·œJל`‚ÙãúRq‰~Óº>»ýªÛþÃ__®‡$1èšµŒIq¨øZm;ÎŽ<ü¯†êrƒÈÏJF%E09Þ‡Ö‘‰Ç“Þš‡Žhdû¼b‘FzR‘Ö„éT€k}êdŽ¢±ÆòB繜SÛ“Åb]YÏ?Š­&ûDooonH·Øåј°g  ‘H'$…À 5ñ‘@ëJ 'ÿ­IŸÊ˜ƒ<{ÒÇõ¥#ñ¤üMõäSJ8úS''Ò“ùÓ›94Þ”Ñ,Pyç¥V»Òb×®4­>bDW¥œgiÇuÏéšž¬i ?‰|6§§ö½©üŸ?Ò”¾TwGŒèž“\±MKÍ ßÞ]±ŒtUg'ê\þUÞhÞ´ÑíüÙvƪ2YŽ+7ÀÜ/ð÷ÃÖ––0Í}r3Émb]Éýã÷Æ8²}k¥·ÑžwYõ >Ñ û±Ž>ƒ¿ÔÖqZji'®„—ZÞ¡¯ÅionLv¶±yO*€U7«“ëMƒG‚ÉÀ2Lß~Y9f­@€.1aQÜàF~•¥»™¾§ŠþÑ ?á²½ì#Ÿ÷Åox_ŸøD£D½8ÿ¸Ò¹ÿÚ%±á}=G{èqÿ}Šè<*?â®ð ÏMóÿNOþ2ø‘tög«i{ë­CU’#³ýZ¶88ëάé‘ùvÄv.kÔWÈ´ømjFш˜Œ{³Ÿ|“úWšZ.ÛdÈç­4O[!Òp+Ì®ÂO¬x±å;umÕÏUŒZ[¸@{(i$lt˱êMzt™Û^Co}ýµe­k1A<6¦¢·mp›hV"êŒLWp©5ÓM~îo¥’üWù2&õHô¯k¿â¿…‡¥âŸË5÷õ| ðnø³áúùÏþ:kïšàžç]?„(¢ŠƒP¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¯ý®ašÙëÅk\È>Èþ\(]¶­Ü%Ž<Oá^Á^WûMx¿WðOÂOPÐï_NÔh-–îV’!$ª¬Spe݃€H8Îzâ­ÏÍ+­KFãŠKèm% ~îY¶}ÁÇ4ø^ÞE"Ø.GcƒýkSÅ^—â=Ù»ñ|Q}z˷ι’Þg°ËE=†+…ºý—ôiv˜¼o­@§’&Ó ›žäWùÖ‹—©ç_á\ÜkP“¸¥îFx1GÆ>µ§w§Ìd‹pÀf 8ëÉýk–Ѽÿ ´KÏ'Å3ê°î7 ðü³JF'÷S£Ž­XWþ#YAð»]¾´Ý¾;›{g×±Û‡Çã&•µ½Ãeª*x+]¹‡Ãz4H^=¶¨£€@Èþ•ØEâÛèj\H2~n+Λâððõ½½¾¥ðŸ[Ó­`V7µ—åêx%sŽsIíày›z«§ö`mØ~?xWJ”Z×ô9œdž‡«§Ä-N8” ‰ íóu«ßõXz\8 ñ¸ó^SoñÏá|ò`ß]Ù?j[üOøo|B§‰Už7üÒŽTöBN]ÏTµsnP]I–ﺛyªÉ¯ZX\ÊÂGS$gx䌩ä×kâ?Þañ=›qÇï¶·‡[²²Ôb·rñ/Ÿ,LŒFŒàzŽ*m2Í¥ÿ„Œ).bÖ°ãu¼¯%‹7#xJJ Àæî3ð𦉓¥ØÃma%bJÙ$ä’[’O¹¬oˆß¬~#x}4F+˜áŽa43Ú4m$L8äŽAÁ¶lÜÆ£hÙ ÑìÒv`ü,øQ¤ü3²½‚ÔÞÝÉvêÒ]]njF02OÔÕω~µñÿ„o´K‡xĸ’ “ b —î¶2:ƒÏBkD+ö'ó­+/9,®Ð–à ã<}áIÂÚÜ¥.–<‹áÁþê£PÕ5+ Bê(Ú;VY `ÞÙë^™ã]?xSVЮod1^Û˜ƒù¥¶0ä7¸Üüé–óZø‹ZÓ[+-Î8%D—<õÇåWT¸•\JÑÈ£§™ 7ó(9kpæQÒÇÌ¿ ?g/iŸt{ÝZÞ; 9ÖæK¨.Ñ‹l9U]§#qg3_KËá 2;©¯“G±´¿?üL­­£YÑœX6ÍÎsTdÕY†Vàw N}ñ@ñ Û/ÊŒ¯÷·¸?£U{&ÈSŠÙ\|,ñ~•ãÓ“M¿7IyåE¨¤å9Ýľf1Žœ×Ô·ÿ<'â-cû[VҾݪ3£Mr’º Ý@Ë:Ç8çÖ·¶²±G.«ÝD¬ACWôï­¥ÌhÌæÙ˜ÚWp ‘C„ØÔâ|iñúÇR°ø±®.²êd’A%¼€mV·#÷e=€ãê {œ?íþ+øgÃω/®ô¯ÿfÅïiIçªÿªic ³h8>ž•ëšü–ÚLZZÜÇyyöf–ê—b”‘òg©AéÖµ’â i ûvƒº_䯒RÛŠzŸ%~Ð3êÿµøWIžïKÑ4ëk9`˜Æn]Éóeb§–ÝÆ;qZz'€uO¿t›‹›¡i­h³Édº¥ò´‹yÃb¹$¡ldúšú Æð÷`¶·ÖtÝ;VKmÆ#,®­nÒ=‡Ç7‡ô{ i¶šna•…¶BC À#’IåˆÉ$õ4í+ZÄÞ7½Ïñ3ë³Gí-´›ðþ#×/çÕíã>TPÄ£d)½G'yc‘ިǬø£ö‚ð6¥áýmšãÄú\‰©éR2–â3òKc žCkèˆ^Ó>!è?Ùµ×Ù<Ñq¶“!’'üÀ’@È8#Ö_ÆšWÃ+{ÈtÃ+ݲ™./PQ £äœzý){ÉZÀ¹o£¿ïíæÔ|Sµgiú ¡ˆÇ3ræ'¦r0q“Jëª*Öµ™ã|3âKOˆš!kíìý®{»›w Š?šBI·#ó]„|eð’÷â„Ö>¹Òu&½cg}5Ù{O<“åÈÑò‚ÄcŠúùmu6ëO½¹7—Q4"K‚Q†zù§@øã-;Z]<=¼<÷yšñ|‰&çï(a¼1P0àš9“ø†âã±åzäš¾“ñR}G{xšö/·—7ø#×'úŠö?‰^øªxÁ®ÑçNw‹â?»˜Iêv‘ß5×èŸ/~ Á¨xÂöþÏ^m&ÖI¬íl¡u>yùVY7BdœzéCµìÁ]«£„øQ¡ë’x·DÓì,ßBÔí®ÖY領dhàCºBì@c<ôï]U—‹þÝüM¶oì ûlê%¡¸{€ÖBC'Ë#Fy[€x¬¯ühñ.§¬ZZø›ÄªèwÅ­o4ù”— +”!z‚ÙöÅRÔfÏâl¡·‹û7í&©,ñà@‰ gp!{c­9YnJòá—Oøå¬cûgíRi:ÜpAôÆ1]wÆß |>Ô|Wֻ⋠kב½Ä6Ö_hÇ!ñʱ\d{Þ¥üX|EŸKÓô-ûI´e†;ÍFÅe»t È~l’¿…pþøŠˆ:ޱmc¨k:–.㸂”Gž2T €=1S¥îËZìZøÅ®Þx*çÃ^ðÝäö^´Ó’k;»IŠý¸ÉËÌÄw'·j±¦øzçãGÃK­WT¶Òõ-õ¬âÖ5y ÇuþQ|ΤŽyàÕíVÿþøsàÍÇš¾#ÕÄRÝ¥²ÎÖòéÐHÙHË’xÎLÖ'ÅRËZøiá;Ÿ [6Ÿáyæ†]9œ»ÁvNs#dî,§†4Õín„õ7§³ºøà›íwOÔ­/|K­] +{í2O6 8o›ÞÇùVo…¼{¯|lÓõkúº»¼ƒí:mÛn"ùö¹U†z÷æ©|"¶´¾ø}ã(#Ô®t½"-Sn•Ù5kÆ1¶ø£h¾ ³Ó¬µû¨¯/†³Ü,/.F¼`cÔpz÷¬O__|\ø¡ëZö{y-o4}*#²s¹&CG®ÁnÆ–­i¢ü;øO®ÞxS¹Õä¾»‡OÔµ'ŒÁ-¤xÜ©³9ˆëÓò®sà߈µOë·^Õnnõ]Z´–i ý™•K¤ÀŸ»´“ô®À7Zžáj~>µžãA’Þ;5°ºù&¾˜¸!Cuù@<ö$zS¼)â/ êþñm§€´ ü=â‰tÆÚn.Lí4æTˆ’pÛy=3øQé°ýGøà……Ž­m{«xŸG×4í3}ëÙé“—ša.a*3íU´ŸÚWÄ ¨I¨êád·'f‘ JGŸâ8 qÁÏZâ¾ø«X>+ðÚYÛ\}¦$&(4Ã#y•úãnIçWqàïƒ÷%¼ImH«Ø¬Û6_˜ÖLd!—¥x‚}*ÍäÔ'Ôáæs»Ê‡='WñÄzæ«ñ+YŠñît¹a˜ÛÇmm!E·8@ c9÷®¿ÅžƒÇÚf¯]ë6>Õ/-ü©?´ÉOµùVqŒõž)hµÜZ½ 5 Š<5®hÖÞÛLy4û­O‹)m!;–EEwÇõ« ´ô🀼Y©xºÒfÐ'Ž;?ì×î}Á—a<‚£<Ž›ªMY¼øàHðÝú¶­«Ju ½bÓçŽ@¹DŽ2x }3Ͻ]Iuï^Õ4=Rswâ-;ËÔ-gÔñµâsÀ¸&„7Ø·ámcÂ÷Þñ-Ÿ4;Äòéry_k¸óÙâV#Ô6ÑžùÅx·ÃyõX> hRhiæêßkA vn~`ßìíÎ}³^©ào‡:¿Ã«³âÿÀúmž“¢$ÈZâb»R?•¶OåÞ¢ð_Ǹ/dÚ÷þ]xöú¼U{eþ˜|û­wD·Ì‹.8RxÎ3ÓŠå>3xÇ^õ+q=Æ‘ ƒ-­µ­¬ÍG ( ·¦1Ísš¯€d„¡Û"Å{òiÞ´Òõ…Éñ,¯aáÄÔb6÷0 i’àœDPF7z-ר¯÷¼5ã­sãN‘«ø;^¾{»¹áûN1BMÌU±”ŒÕ|ñâ{-OÄ–o¤hšs Û›´íO˜*íbrÄcØfµ­-ü;àïø§RðEý汫ù o<×py2Ú[³rʽóŽHéŠà>x·Xµñ®—kæÝêvײ‹I¬Va*Iò°Á=@$çÚ›ó®ÇrŸc“ÄÚ³xOD{&»Ü.E°ûHMùß»æÇ9®â…5kOê7F;­NÒöOµÛêÂΓFÿ09Æ=«³¶ødÞ$“M_hßa7žYµYOÚBnåTc±ÇZoˆ>/kvž)Ô-tM¼= é[m¡°©v6ާ“õëJ×ÙX¶ãµ+Âð–—ã 2ãXÔÄr\Ç Sd³‰Û(„ƒŸÀúŸJÏñÞ«c«ü'Óäðµ£iÚ ½ó­ý¬Ž^Q3r#g{~?‹¼ªü^ÓôŸhVŸi¹ºŒÛ_Â]SÆp]wF3ŠŸG¶Ô>øFWÔ,à›]×.V(´ËÀ4…?‰×¡$ž=8£ÉÌÃø§F}}/ ¯‡žÅÆ¢Ìpª ­þð8ÇÔ×CàÁVšÌ7Z.¯y­jvjóÙØÝÀ#W•TIÇ8ê)WÅÃÇÚˆü-aac¤ê&¸û61Þ4ë×ÛÛ5Å|5ð^¿yã9£µºÓ’ÚUž{©")äF§,Üã·-Ã}ŒKkrj—‹êwQÞ<Æg_5€Ýœà®qŽØ¯JñǸ¼EªÙêßÛ:_‡.õKX®î4ýFBŒ£qã8®:Ó.žôíi´Ï ü+¹>¾›PƒP½Xïõ Ë™\¤xÀëÈêI£¦›ëqß¾ê>ÕÛÄž'¶û›£ÆnÐ U¼éq„Lxç'=xê=ããC¯Û=Ö…¦Ahe*×E¶hѲ ëƒÉïÍsÿõkíSÅK Ü4÷úv­Û\ÀîX*à·™Éãn:ÖÞ‡ðJÂã]·Y|Q¥ßY¤ß=¬ Lòÿ,Àõ8ÁüizÔÅ×|/®è~"ÔíåôÌdŽò+wu”7 ‚RJí|_q¡øCHðþ…â]#û{U‚ÜÍ&ÙŒfÕ\îTÊžzãžà×#â>#ÿ„ŠîM.þ]6Æ71ÁhƒåD^ÁïÅiøÁš·ÄxôÏè¶±Ì×ðm»„ʱ•• Va¸€sŒñU}5&݆xÃY´Õ>éMáÛCc¡Y^°¼²,YÖSÊ»žù矧¥]øq»Ô/œ¼rh­a*ê;þ錗èÁ°GÐÒÛ[ËðgÀî/à‚ës‚,f"Hà…2ð 9'Û#šm—Œ'ø…¡ë^Km.úXöÑéñ¬kpS–GsòçúЯòÜÙøk®øGJ¾‚ËMÔîïîT¹¶·¼ˆ.ù%~lc¯8ïŠò[Ä®­â›Ë˩淹2³¼i#(…ô ³àkZ׋´Û%µ¼Ó˜Ìîe”BªrÏÈÇtîq]‰¼aà6ñUä—–ô ʽÚ\3`à’ €zsëB}Šf¨Ó?´áñ]Ƨg£_ÝZ…¸¶½}¿hQ¸Ç#pò;Š·ñCÆ’øOÃzmž“q²âø´ÒßZ¸hÛoQ»ãúšóßwW7Þ+[Ù™³®`Ytý€ž€ÀǧҴü3casð¡›Äw/o§ïø—´ ºeÀýá\ñ´ž??JW³ÓpÝ_>"êz牲u›¹õž&òC“PIüÍ{¤{(ÊûÛ>¿×ž¸¯'ø3¦xbÊ]NãCÔ&¿½uXÝ®ÐFðÆy!@ê 'ýœw¯ZÓg 0˜'q ƒ“ÅD¯ÔÒ'ñÊvo gæ¸VrÝrI=?!_+HrÄ×Ô¿®”x-#Vå§MÃp<€zãüñ_-õcéUЇñ11ƒŠ–ÊÀ޵‚ƧŒ õЙµ§øŸQÓÊùR/|È t–?µ{^±Z>}c#ùâ‘}FjuLr*®esГâÅéáôëVÀÎC8þµ¥áÍyüIâ]2ñáKvóQ6£ÎsÏÖ¼¼Ë÷lb½À›]{M‹G*ä^õøY­6î®~x=vx[Jqlœþ³ŒžkÂ9ÿ„cJÜ0MºùV»{VKcI=E<ãÎýiÄæšH¦H§§Z¶•qéL`qŠb1|-­&¶o.#‰#A+((rd£~O«tŒñY>ðô^ÓE¼rÅ4™e0ÆUP“ÂsÔ…“êÆµ›å'Ö’¸h RFàŠN£¥0©@ÈâóÞu÷¦„œó@‘Ö6Œ1± W<:3HH$ÐW׊bëI’@⤖ÎJ |dab,sÒ—šR´ÑÍ0[‘ŠwéM'…Î=sH@ÙÜsMAëÎEc½Q#sSé#wŠ<4=u[æj<ú ›Glx¯ÃXàÿiFGà¥ìÂ?9?…Ñ"xDØ»sn 8êwë× þuË|3Èð‡ýìÐ×R:zӎȧ¸ïJ¯wÄmÏj±žj¥ëb>ƨODxíÿñ"ÒSÖþýWKá\ŸxXg?ñ!º?ùR–¹Ú.`ºn‚;½êÈ×eàøËx¿ÂòÇöëøÿhÌ‘œµ’.—ÂÏo}râ]4Ýߺ ŸÃÒ«/à7½N§5B'¼³Jþx@sÿ Ë>ŸõÉ+Ôæûµåš?? ¼!œÿÈ2ÓÿD­oàËÕ~LÎ_þ»©û4D²üfððuWP'l0Ï" ?¯º«ãÙKÁúž«ñ&r(ÕtÍ&73ÌíÍ$nˆª;žIôzä€~Ï®îvSVˆQEEPEPEPEPEPEPEPEPEPEPEPEP^?û[.ÿÙûÄãý»#ϵ콂¼ö°Èø⢸Ȥdãþ^¡¦†·??ãž3¸ÊÞÉŒTë:°`êw©ÎC'¶xªRn‰“c°áˆ<Ý,Ui/š=ªÑ²ä÷<ÿ/ò*‘B=v奟PÙ(äÑ®W#9àŒŸíw®GÔ è:w8e¶ˆöô®*õØjœ€7é—j2OË÷1È>ÿ¥p'íCáû{kH.–â'‚4FÚ¨I ×pôªårØždµg¿Gª^ÆùK‡ ÁáØ?:¶ÚýíÀýó´èxÄä±ýz׋ÁûOø>vÞâ= ä´yÏÓÖŒ´'ƒ®6íÔ¶ó»îùRörì?iç£Ko¥_·z—r$Íaçß,™ª:Çï<5h/3(n4øW!†GÜÅ`Y|dð}ØRºÕ—<ñ2£~¸®>%xwUhöê¶%–5÷s¨ÎÑ€zòk' '¶†ªqåzêsw?¾Ý/ï|§®Fso$ðàÿÀdúV-ÿìÛð¢ï>V‹}a¸à5®¥:cØn,?z9Ö4«”ÛÔRduY7üª¥Åý˜au‡ úr*¬×B.žçž§ì³ðû`6z¿‹4ùF‹WÇäb þËö°ÌßÙÿ¼Ud¼­Scë‡Zõ[+ÛEÎéãS»C ®{i[½»[n Ï>¢ªòîþñZ="?³‹ MúoƶQƒþ¦qžÜ¬Büø¿b –_´´Çü¼ZL…½Žν¡ùhÇ'Aÿê­zÝ|Èã,måܬy÷<Î3Œâ³u’MîkJQ”×CçŸø@þ:XÊÍ׃õ7Æ0n ,xÿi¤oÇ«X™åð>ƒ|u¾±8öZ÷¥p¤–eãüâ¥¾ØØÈA„|ß©­y¥ßðFVKcçøµ¯‹Úónø?ª+ÎâIdÒå‡8 (H' }…:çãŒô•Xøcâë@¼3Idî3ø­{òÏ$ °rÀCt¤›Y¾€+Arñ‘Éd'ðô£ÿ_ðâQO_ëò>q“ö Ñ-€[ýXÓ˜u:p®>Ûö—øuzßé‹<‰í™OéÅ{Ûø—Y„¹ûTì§¥ÉB=1ÓóÏÒ«_¦ë;k›Ý3IºŽç!|ë8% ŒpwEÇP8ãœuâ‡VÚ>¥*.Wå[Emñ·á¶ @MRÊ5=˺ÿ3[PüLðMÍ„ööš¶ŸæH¸×cŽAà§­uW~ð]ôOö¯øná‰É¤ÂŒ§þýzÖSüøU|éöŸ†úGîû:\&}yŽ@¾øëÅS÷_ü9-ýÁ9«I´ËÍ^{•Õ-|‰l¢…9U˜:Ë#FqŒ?¯ZÖMÁûJSÑŒmý3RÞþÍŸµ™áð¥Í“c$éºÂÿ}3Ã9öª°þË_ vbÞ÷Æz{ò5päÀL\þ54•­ù Âïq²ø2Rê«©Ù8~Fwòü ›ÀW’ŒEydíÙ|à¤ÿßX«‡öRðªÍ—ÄoéÎOÜšH¤ úϵNß²Ýí³°Ó~3ëªG/t¸Ü¯þEâ«Ú®©‘ì¯×úûŽb_걺âåoö'BF¦Cá ^MFÙtû¤UÊ!`9õé[òþÏ?‡wØþ*éW 7MCEuÝÓœ©lþÁð‡ãÞ#ðV¢;(“ïÌxÉúÓö«ú¿ù س?DzE.‹ú ¤~¼˜§ü+]3P.@9È>•Ò·‚¾6X”’_x[Vá×ÉÕÐãøÁ÷ê)nÛâÞžÌ× åº\uÓõh&ǸÃTÂj=G:nZœ«Z_@Ãx$úš‚Y/bfÇ+וÑÉâ¿AníðÅ*‹÷ž;/8ÅAüë*_Š66„‹ÿxžÇŒæ]Q׿¯´Šêcìeت5èã séÚ›ý­z±°rÁ»sRŒ~WÅä÷v/ýÙì¥\еÅ/†÷MˆüCd„ã岓ùŠ|ר^É£OL¹7½yº˜&?7”ŒVf—âéí|=£&ü*X[¨SÈÿTµ´Þ2ð}í‹ÛØkÚxFOÚ“«3Ér*3FФÒ4Ë_íh$¸¶µ†xeŽD‘–0¤¯ÌÜÔ­ÝÑrWŠH͸ñ¬ì>x¢‘züÑ)þ•Eõû7`òÙÄ€÷UÆ*êÁö“ñÌgÃ×ÜTn>µÓKˆ·c€ æ*ù¢gË$b§Œ-"RÝT›]†?Z¹§øžÉŸs ÔÎ'nŸEuðšèHvÍîÃv*¬Ÿ õHÂãŒç#ŸÖuô¾¶=Ú÷E¹ÒÌ–³\ Փ呯Ügžç>‡5ZÌÛkz¶±gvÿe‚Í-Œ{àYC™MÅãø§zÁÐü=¥²£O&›3].·¯} “KŽ ~üåX¸Ç˜ÙJ\äZ5­´qÅ©Zcû‘‹m€wÆqYφ ×ìnlïņ£c8 %´¡‚8=ÁôJá%žøÁ¥ÁéÁ¤}KQU,G¹æµ8ØÉÕšgUំºoƒ~×ý‡£Øi_jÇœÖó¶X@ù»döÅi]hs^[ËG,R#G$BxØ2AÏq\ ÚÆ¡>m£©ÍU> ºV#qÀôÍÎ;‚«-„ðÇìÕ¡ø_ÄÖz½¥¦«w%«ùÃ,‘ÈŠøùOÊ;O=}+ÑãÓ ’\³@ˆØrçfÒN9÷ÏW¥ø¾à:¨,1ÏqŠÓñÍûÜxKQw;wùN[Ôù©XÊ)ÂwèyµÏÁuÓ¾"_øƒH×­4˜®%2>ŸqnÄ!'ç‚8ÎN1ÆkÙ,Ú%V ‘ 2à÷ëõ5Ëͬ]]ê“ÅÑdaœûñZ?o’8ñ(ßøÅ_³O©›©n‡”üzø#}ãÏÚë>–Ö[£“uÄâ=ûOÈÀ·àí#ØWCð[áe×€<#q¨Ï©_N'¸€•šÕ~T‚¬q’O¸ô®½ÎrCÛÆÙÿ` —u¼D.:aÏô§ì›ÒáíUîÑÂ|xø}¨x£À+m£ÛfâÎà\ÇcgAq‘µ†Õȯ7øð¿Ä:g‹nïum6óKÓá´’íî¢)ö¿0mòö‘ÈêO¦­}Œ&`ÎÒ7­l]%¤VÉåù¦g#!ÜàÔºrŠ)TŒ™ÀÛü/Ò4+=JçÃE¾‹¬Ég,6—€±1³)nbO¾•ò†ìux¼c§Ågðk1ß*)U;ÖPø9úsŸÆ¾åŸÅñêZ…ÔŸe‚ÞÞÕíÌ`e·™Cçw_¸1Ó½eM¬érc¼ˆË‚75ºïüÁÍJŒí ÛŠzœæ™ðãOÒ¼qâ½SÕ´MeæwûF8‡¸b˜å7sÉêk矎:Ö´¿u'’[íBCk•QQ°Œ㟮kê»kÛd8Këw’YYH¬¯hñ%ןªézn«r‰å¬ò³+„ÎpÇÕrÍ Ê/fy5¯Ã+¯þðεyvºF±oY½ÌÑï°£b99ÝÉ9Î*¯Ž`¼ýŸ¼¦hZÓ¦§«Ü=Õî·à0L… O®s^ùawca 0E 0A„Žu €gxïÃ'Ä}ßLÔ£¸–Þ9„¨öòƲFÜ”äñƒÏþ6’wh»ÆÖLðíë]øÛàMcBÕõ(uM^ÑÒÿM¸y”H¤|ƒ AcÐÒxá–©ð‹P»ñ¯‰BÁo£Û´–ðZήÓÎãbƒ´ýÁ»Ÿ^{7‚>é?ã¼L·¸F¸ÚÓIvù”÷@ÀÆÞsõæ¶µ»}'_ðì¶W&°¿€«9Sµ2ž˜ä}…&îÁ+-ÏŸüñæçUñZ~¡¤étÁ­ŸQÓ¬Ö+‹pë´8@HÍp­ðsÄÃÄSiÒé—ŒR).R3åËó`8~{îí^§áŸÙÿIðö»cwâõ[{I¼ß²ù;Œ9PrOÁ>¸÷¯l°¸óAÅÄa ß´È:çÒ†ü‡gÕŸ?|EñÏ‚4ÏKc©xgþ›Ë(c´ŸUoNè¸nŒóÞ¹Ž—ªø‡KÔâ`tÛŽ˜|ƪˆÅOQô®ÏÆ_µãâíJûBûi—®gXæ™w+–]§¶rAô5ë¾ ð¤:…ì4© ¶·÷¥â ¬íó1U àgÀQuÐJ-½O ðÆŸ¥Ü|·o\\YiƒSc£Íh\tÄ»Tç)¸~u©¯]éÞøM­?„5½Q¯/c·Õof\ðÄA(¸Œž2;Ÿjé?h‡š¶»g¢ê:E´×ÂË0>l™ ‡2¢û‚=ªŸÁ¯ÜIc­M¬è²ÙXÝÆ¶­kp_mÇ9l©ç_SM5o14ïcœøq«ŸêöÞ+-æ¨ÚÉÔ>pt‰626@Â?…3ÁŸtüIku?‹4ízÖЛ†Ó,C5ÅÁ@X&Èã¶kÖ5Ÿ‡–š?ƒµØüa—©ÝÙ´ £;3 å'àôîE|Çà%½>+ц“çG­-ÚIQ±p~bÝðsíšwRÕŠÍ%ÇÇŸÝx’{›=RXíäœÈ–®~éÈéÍt~/øE¯ø§]>#ðÅ ¸Ó5˜R÷Êk¤ŽDweÑœ}+½¿øáWÄ3_o¼‹íù²Û«ªÄAl°eAüz׊übÕµ‰¾!j6÷RI§‹@°[C²ª@îöã¶ ¸5mÎÏÄ^&?|?£øBM?YÔ€kíDßÄ'Ž)$†#©Ï­fx§[¼ø½ðî :Á-¯4K¦ûF•¦B&ŽO»*Æ£¨ ƒõ­‹‡7Ÿü áýVâñ4í^Ù$´ûMÄeÅä(pŽps‘ÊçÚ ñ6ŸyðÁ1Yé·[µ½bãtÚ­²‰÷bBÜŽ¹?SEï ìÌ¿„¶ZŸ‡›ZÖ|AÍ®ƒabé<1”7&O”D¯_´¾ø³Áw>!ht ¾ƒ¯Om´:v‡o{"_Y3—‘&8(îÄœ‚¡m¨¬ih¶øY¡k~+‹U²ñ¡ BÚÑôòY-šN žøà~5OáÿÅëzšéÚ¾¡>£¥^k$,€±/ÆåÀÎFsY_mMÅþº.JÂ9ýžçRg?(òÏíg8öÍu¿¬ü§kiq jºŽ©«ÁÒYÙÞB ›9“×ýj=ùœúüñlz´¶YÇ%ŸŸåÇtÓ¦nÀf\ç§$c5©ã/‹Qø[S‹@Ót½;W²ÒaKO´j0 ^F@rsÆGJä4Ïê+ö o¤‡RIÌïæäüÝp9ãÅuþ9øg‰µX5ƒ­išî¥kÕÆŸ&ÖYrHÇLõ¡éæÉø˜oþ"iZŠl –âÝâ6“Xڦ岑:…U*Ò§ðšøGÀ~!Õô†_𦯡]izòøSÃÒhzÜÖKq1”È.#Éàã==yG‡î¯d×´èôäΡç¢À«÷¼Ì÷þ¿zW¼¨xR›Äž&ì­4xhc«yòUWå'd“ëÀïLÐ>:3ëöæûFÒ­ ’O-®íí•f…[Àþ<þ4ý¾åè_eñ^¡öÍ^úÎô8ûJÚDø¶œg®kâΫ=§ˆì´Ëö:=•ª-ŠÂä+ÆFwdc?ZÀñGƒ5í/Äwñ+ëÝÓ[ˆàg9 IÍw¾$½Ð<)¥è‰ôƒ¯jöÖÙ™Òc9ògŽ}(Mt i©›á}"oˆ¿îaÕ/áÓ×J¼_³j·ÇŒ8%£'«c¦áZºFkðßDÕ¼N5;MwPŽol,Nä€ÉÁwÏCŽ:w5‘ãm^Îÿáî…>…d-¼9ks"ÜØ;–+19Îrr\úT_ ¨j–òÛÛÙøml¤:‹BB©^{±=3žôôêô,x[âv±cujúæ±&¡oxDFɱØÿ)bqÁàj޵ðÅPëQXiþušÎcŠI'E Æà[#þ•Ðø@ð*¶¹Òµ›Ý[Q¶GžÒÎî<ʤ¯8êÈ¢¼×PñF·¨ë×wrÞ]Çu,¥Ü$Œ60=0lRzî MHñŒ#ðe凅t»;-J *Ýažæþ!.rì¹è '¥dxÛTŸâ7…ôíKN¶(t÷k[:Î,$@œ£"€ëZ¾)ð ø¥´ýb]ZÇÃ÷ú•šK=® å †\g†8ê*ž¹{7Â? Øé:5Ú¾¥¨ww©A÷_PˆHû qï“OÐ^¢| ðÖ©‰nµ)cžÊÒÚ# ¤±”3;ýÔÁ±¸Ÿaë_DÙ,+;Åò[å‘nœœylà‘íÍt²$° ª$m SNió@ ‹yVÞN†àËŠƒ[\óøBÒôñwidÐÊ0•ÈÎîàšÏð`Ûâ Fw“øà×eã¤+áÉ>l–•:gŸ˜u®GÁj?á"´ãænà&“z ?ú5áoù´ÃŸùvAŸÃ©Œ ÌðÁχtÖÆ3qÓV¡¤q:R”cŸZUrhŒFzc±Q»¯júu…âÝB}?L_³ùË$¬Ã}ºå”*3“Ðü¿&ÿtž”ÛC·—ï磇ýR¯ ÅKŽ£ÀM ¬ä(±=hiúL×Ìâ4§Ììß(QêIà©«-}§é‹uKûï°>Hüð_ñÀö4‚Á‡˜ÙµÅÌéeoÿ=¥éø¬}†}ñYˆ–Cä;Kð»®ÒÃÔŒœ~tšÎ»xíÏm>³4LŒ,â奇ȠNÀS­lÒçÏûi-ãwØÍÁ ã>ãü(O[Î×!ÇZAŽ3N0È4Òj²Eo|AcÓ­#|ÓA$úÓÿ”žsMãëô¥#9¤^ÞÔÒ»ŽE&:~4åèi@ô ©:On§"šTgÐUDN}êM,gÅžºŠŸÉšÃšv”Û|[á¿kÆ?”OS'£/yïÃSx{Œ±FxúWN­ƒŽõËü8<ááœÿ ÅÈÿtWDd%¶¨$ú ¥°7©?˜¯4ûyY6ßh\ò§¡§Á¦1_:å„QŽNjkùàÒô¥½½¼]HvØ—…çºoî[Ä9v?•Q7ocÉhO ^ü@Ô¼3¤økJOí$¹2 Ë* Á.äžç“]ÕΟ Áã;%ðõ¬‹e§iÐéÒß´…’öç-$ïè3m㌃Y~"ñWØloíM£iv¾_šÚ,rfòßL9Psþ¥}yÅni×ýlg±Ç¹£DEÚ«·+…€;VnÉ›EZ6FòàµN¼TJ>j™zSdœ¿ÄMzMD…-oÒÂúöê D¸ò<ö·Y'Ž&˜G‘¿h Á`â³5ëk NÓì&¸ŽÆÌÇ•©Œìò‚”ÜÌÇp`¡9çž9µñ+OŽm6Îá‚–›%~` ôÁôö¨¼`ʲÀõ8­ßðW«ü‘âûª¿dM>+‡·÷J–{òé…ÿÐ{xÏì »~Ëï'þ‹Ž½š¼÷¹Ü¶ (¢ÂŠ( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( ¼‡öµC'ìñã3•ŠãÚâ#ý+׫ȿimGOÕþx«C†öÝõ»c p‡Î:œ1ÛÓ¾)­·?9šY"#I¸`Žr7sÀ§dÀ n<Ëœ\ãJÞÿ„FCp–óÍ rg*ªê€þ.Fq]m§Á‰`„M©\Xéq ÌâF#·â®÷1m&y}¹‰5ûMÊZ#û¼¥é“ÏN:W…x§öRðÍÁ¹›ÃÞ,Õ/¯åvhôùtꤓ€eIz{í¯±uKŸx&Ýåî5©ó´• _rG~5Ðxz9õí2 Ý#J†ÓKœf;ˆ<»xd^ÄJçæÿ€ƒUio±›¨ž‡Âš_ìW­užíšÆY¯…GÐdŸÌ×âO‡–^Ô¦°vŽíÓ£[­}wûQÚxÇöv)¢ÚÙjÒ_o Ÿ(òU@Á- MÜžÜqÞ¾iµÒ]¬líô¬yÒ/Ù3Âe“ìɶÖBGúÇrà3Si?ð”ÞÈÂ}Jr§îÀÎBþ#_]øwöPØñÏul–qŒ;V•Fàÿ*î­þxcA²Ä¯}®>?Ô[Ä ƒ=€Î¯J®i=‰ä¶çÆÖð|CÓð¥l|‹pfoÈZ0øãÇ›//®Ù€à](S¡+ëk ¹!º–ÃFðô….#´·3\ùc‚îHÂŽG=9¯ øëዲַ—Ê<öBHáä#?ìü¢®ò[‚×cË“ã÷Œô÷ÂÝÛÊ£¯ì~#£gûRø¶(úvŸ(õ"E?úq×z|¡¸¶9|Õ@X‹©Ä7ጞLQîãéIÈ=å¥ÏSOÚÿRÀ›IxÿŸ{“ȃZ¶ß¶… `.4{˜øä¬ŠÙ?Š×œ]h_t .ãÔ/õE%̶:®ž°ZÈ™ŽãÌÏ^5ÇøÃÆ¾Ôa¶·²ðý…Œ.Æ}<Ì çûÏæHüÿº{S»ìUÚê}!í‹á˱\ÆÇ†ßŸäkR?Ú‡Ã70¡YeXXíPѧ×úW˾ øYã‰Öw—žÒlþËk ‰äº»†_®Õón#Œã¥^Õÿg‹óº›¯ êZŒmE·™.ETcÀTÞ=QiÍêª-þ=øZæ<åõ9ÿ¾zŠÚÿ…Ýá½NÒ _¶ÙE z²¶Ó#cn[‘ƒ€;`ãšøoRø%ñDžïÁ~"µUÆæm>`â¹Û+Ä:c=¦§jGüõŠDþb†©I¢ÕJ°M.§è}—Ä/HÊÐjvÀÖ#÷BóÇåÛ¶ì¿ç6ÛL[¸d'î—sÆ=Ðx†kó&×âω,@_¿ÊxäŒ}0kN×ã¿‹¢#ý:Vç©•ùýhpqûGØý&·û5°ÎÏQófLñýÜÓñ#ÔkrÂûN“G¸ŽYB^3/ÙbmÄ*23Î8Ï·Jü×´ý¤µ·mûZøjæhËÊêŠ „$c§qýi{9ÚDú_íoò´lÀ€FzïZz=Χ(¶‚þHNÜ‚™ÉÇ`9'Ú¾x³ý©¼-x µÙÉ<îŒ~|1®—Hý¥|/ ŠþÔ¶Ò6Ï2çñSÏz‰S©otºs§Ì¹ö=bûT¼•^9äÞ‰òþý }k”Õô"è“yá­Pfï>{÷Œþ<æ± ø×á«§,5;VcÎæ”O±||GðüåDz²œãT|ë“ýZ9TJú3ïáÃJç<=#uýÄFøJãÿÕTn~ü$º$¿`´ïæé÷×HŸái'ë·±ô&»;oéWB8pÇ? <ý9ÉéÈ?J¶o-^BDì s’X}pOLãÖŽ[t ùžasû4ü*’RЯ‰tÐßtÚk.Gþ<­Ï×ùfû2xj6+¦üBñ®ž}¡&vÏÈ=ûרG5´€®!dVsóÔŸåDpCç/ï®p6¾xïŒõïJíwûØ+6yrþΚŒAañ§Z]Ãþ^ôÈäçП0Quð;â*8ŠÃâÞ“t«ŒCIx½ÿ‡u{_ˆ–Öòú&³Pb€6ò¨cŽ dãëÓŠË¡™¾Q“ó§½L*JJûU§rqNçOðÃâì$,~*ðN°qŒ”¸?‰Ž«'ƒþ4Y»:è^ÔA‡–ßVò˜œ¼SôÉéšöô´ª„†?qyÏኰó0H÷åŒm^¹íþZÑ7ý[üŒl{?‹VÇ÷ÿ á½ œýV¶”7Ðoæ©Ë©øµ$Ù{ð‹Å Çþ}àÿ|f¾ƒk¦Õ˜¾Ñ÷Ž QÛÿ×ïN[¼òÄ`‘»m>y ’,ù¢ëÆÖö\j>ñV”;´ÚT¤{㊢¿<­ÚßZ>:OdëƒøŠúÎÂKŸ³ÜHo%¡]áS?1$®O¥2_^’<Ë©dQÔ;äúƒIUoNÕ¬ßSæ7âÃpMVظä,»“ñ«šÇŠ<+âM&òÆÏÄv} .Öi×jêÜŒçøq^÷5ž—~În´=*ä†?4ú|ùå aêžð^®®<áÉ8ûÃM…1ù(ëšnWÝ_q )lq)7„¯Ií¯íËÊåÏ—"7Sž™¤¼Ñ´éAÙv­‘Böú֤߾Ý3xLRO “Bß’8ª×?³§ÃYXô}FÀ‘ÂÙê· @ú3µZ©äO²]ÌXü($‘ZTî鸚lš ŠI•çå=:ÔoÙ»Âp‚mµÏÚ·U1jÊÀßQ«7À ®¢ÇâwŠ,ÀÉ qSr:s•Í5Vß×ü]‘°¹ðACïŠt–×­*3í*‡#㊚O‚>*¶ˆŠÞfÒ/´eþjäúU ¯†?4÷ kão ê[Ž’ÖhN=ð§jn­ÕRQw<ëâ|W­â‹Å´Gf6VÛöòócŠàE®¨Ž ‰2ÛW¼§Ãÿ‹fguÓü%ª`gKã#’\SU®|/ñN ÿÒ~Z^7÷¬õ8lµ ¢µ˜:m»£ÅþÕ¨B„&zàƒÍgϨêJÇæ‘}°kÚ§‹ÆÌZ÷àî¼ì¼mÌ¿øé¬Ëíz Wáωôóœ’Ú\¸ò5¢«ÔÉÒ–ö<„kš‚/.çñ56Ÿâ›Ñ(̬= w÷>1ð/úV`ýÍÍœŠôЍu_†×+˜õkx%Î~t*?ÆŸ5Éöm§„5KKÃï4Ì^VRÿMµËi>/žÓ@Òàó_lv‘¤ôtzŒ|%’[[ë¶8£Ìª9úÖ¿ƒ´{‹+HÓ^²™à‰!g†uˆdz”ìÛf’މ!Æ&B„…¨­_¹CÏQåð¤‡áõ›®èïV@ŸÄެëW$ð!RJ\(\uÇ_ך»¦cË"&ñM¼¤–²¶ÉãˆÀþU%·‰aÎÔ…b8fÖ¡“ÁwÉ´Ä ɦ/†. `]W±ÉÁ§ {Ç_¢Ëmª0ûO™´r³0ª~*ÔHD”09¼†Ì7a@§>ø=}jχtÑÛ$‘ÄGbàVÄèeþÃ}¹,/mÊûŸ5Ec$´7ƒvw6WV¶hð·e9Èb©™mDædkS/_0@¡ýþ`A¯>’=H“…aìEf¹Ô e\VÜ0ö’îzå½ú ½’?.¸¬?x+Dñmê^êº=­ýÐQ¤!ÊŽÙ® µMAÌHî*³xŽúÙ‚—aþÖi8C¡J¤úž·¦Ú-ŒQ[Cj°[À‚(¢‰”*(èÍSñσm|m 7SµœB\J%…“z0èAçßµyþŸâË÷“!¦kµÑõ‹»Í±»3ÔzŠÍÁt4UÑœÿ„~x{á•ÌòÅy3ÝÞ/–²]ã!ªí¸ÉöÙÿkè³[K·pIªUãf0<ƒë\Å{Ù-[@hÔ‚&™zàrƒü+‘]‘°ÌT‘ëDi©+„ª8»"±ýžmΩ½÷MX%Iu,E<µ^Iäsž˜÷¯kðçŠ/ou‹Xd¹‘áv;ÕŽìñïVøŸVŒýÜg¶8úƒ^П.ãP Q¾:nSþ5ßÄ_·07U•ÎßßDãñ«–Kby¢÷0¼-ðØøûáÖ‡ý¹$Ö²Û™>Ç,@y†ÜŸ”6Aã9#Û_â†ßáoÃãa¥4ò-ýÐ[»é0$ Êœt~yõ®ÂŠ(@YmÚ ’` tããícÇš?ˆôùlµ-2Iìådx óœö9Ϧ)rËq·Xñÿ…7zψ¤ÐîZ]BÃR·’ã‘Ëyj°dñ·­u:'ìï5¦¯kq©ê×z\R $‚$o2U„éŽqƒÏ­tþÔ|!ák‰¦Òô™,¤˜lydm½p2Ç8Q€IïÐε°šfHÑGn%°ïZ)kk¤å¯Hš~ÖоH?í¸ÈEÉ÷ψ%ž²­¥»ŽV#ó8ÿiºŸ§OjÍf$üèdúŽ¥>¡j–(í¡œBláùDe‘X®sÎÒ2rN:Övr:U—°ÒbŠK¸"u{†T¹v—1º >^ÔÇnlœóš­´ïàB¸;t,A=Ŭ‹5´òÛ\FwG4QÐú«A«~’1vöaYwFX>^#êsŸÎ³e½ŽʧszÕR/k ¬xcÄ{e‚Äê2XHrTKHÀc¾$çÜâ”Ý¢]5y#NX¼‡xÏN*ô­ Uq>½T[€=ûÕÇTCÜŒõäs@È£¿­/?ãTH‡9©U—¡ëHN~”˜æŠÑädÓJuÆ9┑Îx¥VüEIÓK óO/ji ­1 '4Û#øs´Kÿ¢ZžÀUÏiÉ}â«îWìÖ×—*ÎæXNã“S/…Ž+Þ9_†ßxûWj}‚›þ+¼Ó´¿ô‘oc_^`’¢Žå@©®Þ6Ñ<%ð¯Â3k¯]éñ­Ž‘¦Ççêì£aƒî®àFæÀàõK]6Ê=‘'² ê}IÉ=Í{ÃÙëRñG•w¬«éÚqÁÉ$íßJ‰M#HŽŠ?¾i7ûq¸º’k±4RÉò–¡a»Ö»‰^°ðF©£è¶rZÛvîXòÄýX±¯OºÖ<7ð‹K:t}¬.1c÷ô¯Öõ›kSj7Mºi죰‹¿<‚RZF%E^sÞ¤^”Õ랤Ԋ3ÍhÉ9ˆ¼è£þ¢Úgþ—AY>4oô¨ûBµþ"Œè¿öÓ?ôº ÇñŸü~Aþõt?àÇÕþQ3ÝúŸ_þÊC [þ¿¤ÿÐ#¯e¯ý•×oÂÅ>·’üu+Ø+Ï{Ë`¢Š) (¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¬MOÆš&'—u©B²TÇde#¨!A#ñ®3Tøßkôí:K‡*pfp¤7o•w:w®P^_[iñ n®"¶Œ»æpƒ>™5áúÏÄÏÝ,žlñép>?‰aÇN‡—ýk„Ô|Ug$¯%Ö¥-줒æ”gÝÛ$ÓW{"\¢·g¿jß´ 6,Ç3ݾ.Àl—Ç_lת|l¿½4Ë!‘þ°0ƒž¡›jN†¼†ÙÌdm>×ír(éoO'ýöÜ GŸ]ÕY˜Çﮥó$Çû«…‰ªä}Y›«ü¨êuÏk×™öýYU™”ƒŒ´aå\U߈4ÂÁ$Ý}rX*Ç;´§>ѧ$Ú~¨#Ôuµ‘ÔÅ!3þê`ãÆ¼7ã§íOsð/ÄÖz‡|cr¯j·RËt]v†$(QŽwn犵-nr$ý¦üâŠz}¶ƒiª[èºK[Izl¯l¢WžhvÆÃ÷ˆ6¿Ì Úp WË:‰þ$ØhhÞº‹TuC,]ì–KdèÛ<÷Ž>حߊŸ¶µñJãC’÷CgKy˜E ÄFÞb;Bª•;A“œþ|‡>2Iá{Ùî,´¤c$&2nàœƒž1éŠÖü¯FfìÒ„> _†ñF¡{ó¶6K.ð>€ƒ ¯±>ø[Å_ü1kk‹à[@!ŠÚòa°uTab^N'õ¯ŽuŸŽZö¶H}N{HØc˵_(cÓ#ŸÖ¹Tñ 2»‹é¢cÕƒ°&µ¥8E·Qs|ô&I¿…Øýñ6¥ òÿ·4O k- ù®n-Üûå$šç‡ü0í§¡xRÞf&o,´ïo]§qÈíè~•ñ¶Ÿñ«ÅÖšt:]·uèì‘<˜ìâÔfX¶“7cöÇZôoþ×~<ðn„ú5´jê1C¨ÞÙ .“ ü¤ƒžYI¬§Ë)^)/ëæiÏd•î}-¢|?ñhio´ÏÍâÍKcý£îtÝOZÓè÷ÓGò»CåXbBX‚ ¯''Žy¡·²ÐIi}ÏAø«û%ØþÏpiúìsÏsu«´yÑþÓ-¼½v3;–áºpk“â~¯ ¤v«s©ùp¡n¬mîW#ŽŒ‡A_Lø“Ä·Ÿ¼ w¦‹/jy,G¶Jí$œË~¹x+Â^-tÆÔfN†éüˆ‰ïò!goÅ…(¹EYkëÿÒMuÐñÝ|UâÙ[ÀúF¸Ò ­Íæ‹ ¦³!\ýqY¾)ø1©ØøŒØêxgIÔ#!&Ò´‹±4ñdn£RÌ8#“€r1_HÜx®{|$ (‘?Ôi±-º`ú‘—?RÕ‡u1I°<¼– –n1’zŸNhäo_ÈŽtÓ¾GKHÝ:™5"Sÿ¹ü…d|`ðfá†:íÄ:6”ufBÞ[Y,F5ÊŒ.I9=KuçµzåΨ$fgc¹GNßy?Çëõ?ulL±ŽO#9=èTã}EíËC‡ý”fŒü=¾gRïý§0ÎåÈ^í^Ñ…šw !˜þó8Ûí‘×'Ú¼+öR¸ò>ê³V$†þiÜáRXç‚:ñÇ~kÙtišÌ i…¾£±mös J“ÈÎ9ÉÆ:çùÕ+ô.CfÖö{IcØòD8ù„Œƒ$uè8µ¢5ígÈ?ñ1»)ŒíyÜ‚=qŸÏŽÞÕŽŠY¼¨ðà*±RFAç9ô³oŒN¼–TË c?1$mà ¾¥©n~Úd{¸lîÝN3sc™>‡ržOÒ¾Uý±4M6ÔørúËK´Ó¦•fŽG±³ŽÙe‚2b2yÆpy¯§ÞY6–duT‡B>ÝÏN:×ζKµÆ…áéw_µ\Ià±’ê?jBmÛS‰ý•þx_â±®ŸiójpZC‘w/ Ìrį'Àükè Ù[áEÌn[JÖì˜df mp^Äx®}Zñÿز]š¿Š•™@6ðc=IÞØÁíÞ¾¥·|’ 1ÆT¨ÚƒýìäŽ3Ð`çŠ9Swee©ä7ß±ŸÃ÷`mõïÙ©ò–ÓŽzÄ #ò¬‹ß؃AeÿBñæ ’“ÂÞh‹´r“ŸÏ÷¯~¶»Y& $h2r¹ÉP1ÎsÈïÔóS—ÌAd$&AV`ƒÊŽ@Ï\úéZÛ§cæŸØcQv?Ùþ9Ñç\ni²ºˆãŸî£úW ñ7öYñWÃ? OâõYÒíÙVwÓ®\ÉæÚ ŽDFÆH3_k¤Ëæ•lü²ä.ãÏq€Üöõµç¿´3JßS³ý¡ügl]J^; _©­kOÚ‹ÅÖÌ7Ëæãx†éõ¾†›ö\øQ$Œ$Ò5Ë3ަ°oG…¸ïÖ²o?cŸ‡÷`ý›Uñ=ƒÿ-üßM©ÿÖïKõ_ùsÊ´ÿÚûÄv®áW pv&GäoY~ÚŠgíJsüJ¬èõ»wûøaÔ›OjP’x::8üÒoéXrþijÊÙø÷J }Ñsar›¿ï•z|ëª,—SrËöÖ¶lºt‰žl®3úÝÓÿl¯ž&YÑO8.¤gñ^kä߉ž¿øcâ»­þ{{¹` ËshÌb•Xd2ÃO„Þ&ø½©ÝØønÒ‰m"N÷7QÛÆŠ[hù¤` ' œJmÆÛ¹¶¹öU·íoቆÓtÊíÎæD8Ïr7ŸjÓ³ý¥<30_/Qœ«EÇá‚yü+å{ŸÙ#⥆âž’ð.A6Wvóôë÷\Ö=÷ì÷ñ6Á\xÄq¯÷†™+Ì-Méõ+÷‡Ü:Ç¿¼F5Õ­JI‚Àï^+ýkFŠ~]Jȱû¤\(?ˆlb¿9o¼âMÙn´mVÉ“ï m%L}r8ª?kÔlúÜ]Aï3-¦ö<ú£ôâÏÆºeÛîKÔ›'#£6~›³úUÄ×àšE!˜©ç*œ˯ùƒŠ5x¸RŸ›óV¡ø‰¯ÙŸÝêRd{ð§ÉyÙúk6£k°äc^3ùçH.í†Yâo_›¿éùg5ùÁiñ»Æ6§÷Z¤€˜fÈÖí§íã[pj2H=F?Ìš\‰õ=·Gèt7$‘~órdo$‚Ï?^½ëGÄ×öWwáàhåF~à!AÉèXÜgaÀÍ~z[~ÔÞ,‡‰6IÎs…ÏþƒZöߵƼ¼Ëgg¯È¿ýjÍÐNJWØÚ8‡8[F}¾»Jù…BîêORi†¦l}öä` L×Ƕ_¶-ÄADºv1ü@¾O¯ñÖÍ¿í‘jíûÛIc†ÚÄ~ þu~Í™{D}M%¿Ì6ÆTÐ÷ü:{Ò¾ñµ–I7{šù×Oý¯´ æA4-žðöQï[v?µo†næì®F~dSß?Þ{9 MÚnnp·2±Ûݳ߯?…_Ñ—T¾óþË}&ôPÛFNî¿äöÈõ¯‡öðÍâ…Ѐ}A 'ŠÙÓ~=hq™ßP·Œ¸Á-’zvÊ}G5œáS–ÑÑ›R%4ê+ÄîßÄú´Èè×2<`t‘÷ } fÜ^GrŠ×zv™pXœ}¢Æ&Sê~e#Ú¹ˆ¾%hWCå½¶äóN gñÅZ_éS’Våž YU½øÃSå}Qô-OáÿÝ0ó¼ Ëòà±Ó ç×€™¬Ë…¹oôèdc‘¹ˆÿã¬8ÅkÅ®Ûcäq¸,œñíÉ«X¶Ÿ01ó `þT­ns• äÂ$-†KZßÝ#(ǧ™éTeýžü²)¼EcœcìúËñì+f»˜õ;F^'‰‰ç€üjC{ ®|©ãÛœ9ç)«‹N§ËðGù¾Åã?ØÅ’¿¼¸Š\qÓ”_þ¾¥nYüIÔÐã .tØdøqùýkÝ-u«+!i⤠Œ `y¸xà°9üs\¼›aåp>žÕ•:’“wV±ÓVŒ)¨¸É;þ•Kð¿ÆP6-üw¥Þ®:]iL€ÿß,j»|=ø‘÷N£ákå\;Ïï®R½Q“!T–Î[qàž˜ý).d˺GoåŸ\Ö·g5#—Áÿ-[iðç‡ïT¾ªˆÓxST§Ñ|u leøq-Æ YßC/凯i\sûÅÛ»æ p?Æ«Í&ÔeWÆìÿŸJ®f‰qG†ê3jöj>Ýð×ÄV™òÎɤç*Nk ïÄÞŠP·úµb£©¹°‘ÿÇkèV¼¾Šé 7fHLð™ç¾1éWuýK[ÐgZkÀá†c…Ãcœ÷=*—ZÒQoVi;”\ÒÑo±ó2x¿À¾`oíµ$ô’SúŠÜÒ¼ká(›|Zí£c8F;Oó¯`›Å³£ ãµ¹@¹\g¿U9ïY7 ¢]Ç×…´;pY¿³a$þ;x­9Ù³Hò¯G£xÜéëµd‹lÎägr€1ùVBü2IA6ú…´£ŒùÏå^¡uá?ßÌ|ïhîùäÇ‹ôF_óéYן þË 0ð£X’xû-üÈGÓæ4Ôì'O›SÌo~_yláãaìⱦø_¬Ær–ò9Èæ½e¾x%W0?ˆ¬þ˜êlAÿ¾¦Ÿ†Ú$%b´ñ?Š­ØŒ”ûBIN©OÚ_Ó#Ù#Ç®| ¬[®ï³KÈþ骫á}^Û:žÙ¯pÿ…s:0H¼y«DqÂÜÚE!zò´©àoD6Áã«i9!|ý7Uzj`éW4K›M^ÒyŽÒŒz7= Iñ&ŸZÓ6i¼ÄŸøv'Áþ4€+G®ørsŽ Ñ·ÐáOZ¡uῼ¨Òé¢Ë¬·{HÏP7(ÇÿZ§›[•ËecÌ$´™AÊÆ©I ƒ'?Jõ4Ÿ!ÿHðTrœý–þ"áš«u§_…?iø}¬BHËü‰­9Ñ—³g™ùns‘ÍG±ùâ»ë´±·cö¯ ø†Ëh佃þ¼Vd÷ÞÆ×–þÐ÷ûE«.?J~Ñ Ù³,ê98ö­ŸHçÄZj³yëÍ_|+>1â XÎ~ìˆAþu±£Øèv·Ö÷Pë¶ùN``7{ šMܸÆÏQÿ k[JÝ– o3:uAÀ¯7½ùN+Öõ¸¡Öoìç·¼µ™bŽXÊ™€,[nÿ¾Ms—¾ ¸ºRðy.9Û:’? Ô­7\Ç›5ËFs’÷¥„‹÷fqþë]5çÃÍe‰1Ù´ƒ¦PƒübÏàrÜ’4ˆ$•Œœô«RDòØ…|I{o€—·+Ž˜•¸ýjä:Õ£;†­t¼¤ÿ:ƺе;pº}Ô_ïBÃúU mç‡!ãt?í)Ìï-~%k‰{~íÝ$sÚ²™´V…Þ ÉæIŽÏ õüÿ¥]Kí|î?‡¿LÒèL‚A°œäÊ çpY2wpù?–?ÏJ‚ÉÈBYƒ+ ‚y=þ¾õæ?Àÿ„fטOŒçý–íøW¢ù¬Ð2’QŒ‘Þ¾õ柙WAµ¾ôÄàtû­N;“=Ÿ@8cí[þ P÷ÿJÀè­ô®‹ÁCý7=öªFH÷-•¶^˜éÍo’eŒ²•F`21ŽsÀÊ¹Ý ˆ„rHÆvŽõ¸³`¡UÉ·ó¨{›ÿB&†˜%Ẋ ÔŒ×àä?ðÛ`‘Þ?Ü5ÕüCv,‚ó©ù{ç|m%ߊ,¡Š6–W,ªˆ2X• )IÙ\qÖgèi6™àˆ— úâ§æ™gÁe N0QŸÊŸšD½ÀÓ 8çš{)‡§^´nF×ÉÚ¯?øMy®jº§«hºgöÞ¡w®Í/ØŠ—n¬~Qî>Ø®³Å:ýŸ…]ÅìÓ'Ìsµ‚0¯Jº]û°±¤ ¤D4JÄ#z¯cùb”¨ ŸÖšfDMÌÀÉ'µQ›PiâamòI•Çõö÷µ™m¦jZÍÒÌQ¯¯:C ò¿…0:p0=j[®ÌŸŠž,Ôt_›­)äÓe{ÈíÄüy¥HÜJõ ž9>õè?/./|yò¼¢/À1è>É+ìÆ¸ÚziFiöÂÆîMB7¸¶"~PéÿmÃð®ûàÜ[|!xßßñ‚ûæÁõ¨›÷Qµ%ïKúìtz¶¡sé¼Õ&Å]ÕùÔ®øÿ–‡š¤Çå­£²2{ŒãÔ™ì)ÛAÓH«'a^ÔÍÎŽüu¦ 4€sJO=iÔiô£Ò†ëF0)ˆiª£Æ_ðø›BÖLæ8d”I8.¥ Æ­“ŒW+ãÛSršbòÄ»…Df?/w¡ì ÷ÐÊÕ|A£Å­_]ø?B] îËnºy ×(ŒÅŒq1âòÌvGŽIɦxGÁ·Œu³éV­räâK‡ÿUÔ÷>½Ságìã¨ø™¢¹Öbkr-‡ßqþÑíô¯¡§ŸÂÿ´¤¶†¼ô_’Ö,gþŽŸÎ°ærv·*޳8ÿ‡´_‡ö£TÖg½-q7ðû(íNñ—ÅÜ«ÙhcÊ„|¦nçé\W‹þ!ê~1º&i<«a÷!C…¹Ü`V‘‚Ž»²œü‘-ÅÄ—s4²»Hìyf4ø×b e8Qжƒ€É©@â£Z”t¨ ·ÄAÿ oû iŸú]bøÈâþv­¿ˆÜx~ØöþÖÓ?ôº ÂñƒÿÄ  þ•ÐÿƒWùDÍü_wê}—û.®ß…p{ÝIü–½r¼£öd]¿ lýçÿ*õzà{áER¢Š(¢Š(¢Š(¢Š(¢ŠòŸŠŸµ/Âô/ŒüWªM¸[qiqpDd £`¹ ðH=úSI½€ñ¿Û#ö©ø›û7ëQº>­ Þ[¤ÖºÔ7yeN&IB:Œ‚PŒÃ¼ãgö=ý·´¯Ú`M¡jZzè^5´®e¶…‹ZÝD¥AxI;†PäÈ,3ý¹ÿiχ<5á-3Á~?·›}äñê-›Kw‹Ì €•'¯ýŽ>,xcáïÆÏêz¦¥½¾‰{oyvøfRÊ q£“¹@é‘“Þ›R¶Â“WM3õöŠù‡Ä_·_‡¡ ¾ÐîµO”âk©Ò Û…ÞHéé^Eâ¯Û[Ç÷ ‹Y¬t;dS”·´+sÕšMÇ?LjOMÊJçßtW姈?mêzŒ­y©¾°$É60´ñBÇ›d2 ÝÇ^~•Ó|'ý©u]7ÄMywáGG·•‹„Õnf‰@çþ=摲I¹ü©iÜGÜþÓ_£¹¹ÓfƒÅVèv%½Ž—%µÊ¶å§™#(…KW7û@üzñ×Âï G®]xêám’這‹HYà&@8Êà∾V“HÎQçZ2·ÅýWÆz:Ø èÚ±©Ý³†æöDKuãi$€ÒsÀÇNõ忾=ÛøŸN¼×õ¸4èÑ’àXiZLRBéèDÃ÷ƒ¨ù¸=ëÚÿd¯Úvµ¤êZ÷ˆí-ã½¹”½¹Š>P^ äãÈéé^«ñgW¸ø·¢Ú§‡ufÐu+Y7Cyl­pYHå ª•<½Áå9ôvû…ÁžQáÏx§IÐV-SAKùù|Ž-¶!Œ~¬éÚí—‰¯Š^hºÄw|w+v§×î)ÇãŠèt =CÁp³ø«Ç‘ݱÎê(a ôDÉúš±{ã½:â6[;MKYLg͘}–Üý rKšRZFÅZžßJ°°#å¡}¡Õ[þùòWíÙƒ®é^šÛX‚[ènž"©*€•ËTdüÀpIü+;ö­ñ‰®µôˆ|[ymc¨D°ÇáË9¿ÑOâÞãvOÆkã‹ýJK/"ò_š)–ÝÞB[ÊÉœääyÅ¥gÌÊ•T£Ê‘é^ øk k>ñ&½5Æ¥q.‰%±1XCç™RRë¬Ë÷J‚[wŽîÖÞRÏleC„H8ÉëÍv6 ¯¼OcÎ¥™W0ŲX‘†7¬ÁŠ®FX «‘’+žÓ´sâ]rÇN´UY¯nc†/0홀>žµõÖ“û3øÇÂ>²ºŠÿÂ^ û,’y^lWXüÜ bRvŒ6:õ;JäÒ””~"# I´µ>>½²ºø{âˆ<øšÛS²•&Ím„a•‡P{0<ƒÁæ¹»xõ u»›HÚ{÷i‹ ŠZG rX÷àOã^óñ×àω|>ãX×ìLA 0C¶ Q¤q¢ÌÜ O¼rs’y¯ÓÝ“Åw;N[œ`ãøZi«Ä‰AÅÙ‰y,:}ýÄV¢;„ŽFE–EÆðÆxª“^Ï:áå+ŽËÅSiO™œgÚžÌ\ã÷¡®ÆGÜ?ðN=6 ½;Ç7R¦dI,ãq11#ùW«x»ÁšN«ûSü;ûUœol-u;É¡(6ÎÑGMÿÞœ’]ÙÛIâ(m ™|e&Ÿr4»¹&_( ¿¼@„q!ŒIµ³×€3Š“áÝÓê¾ñNâÙ¯G…Öç’î@dšÎå[˜•º³n`W# Ú¤ÙZÇYñoâ×ÅŸÚ_h×Vöû5 4”¼ªY?u ÚÉèÔü$øÉoð÷᎞|iuzïsq2éáTË+À6ä¶z(}ÀyÏLW›Í©Ûü;ð ÚŸÃínþçíwéo¨j­µž´p• ØV;Žìó·â–æÂóã/ƒ´ío\ñŽ™­ÙÜÉb/u©Ú5¿‹h@?2A8çpî Õ‡~¦ïƯŽ~%µñeœ¾Õî´Í [(®,Úù.U³¹ØáR;5?íã›?ø#Â;Ù × +uwdF$„:.2;÷€ô5•â/Gð›OÐü%k¦h>,ŠÒÌ]My©Ù%Ò4“ä[»tŒ r:œ×+ñ׬[7Ÿ kÛn­egPñPL,™Ü6@8Ú@4nô/ØóRHÔüYs+€b±I ;ª3ÛAÏá]ŸÃÏÚ£þßÙèzž“•¥ã´V—1Jåƒó°z–éׂzWÎ? ìuGÆZ'ö=ä1³JP˜£RÀ!詌äž1^£¡Z|:›Åz”¾MboÁäºuž "{•U°b È]Ì€ç)z§ÔÞ3ñ}¿<3¨kš©aie)@ $bÀ*óëžýëáÆ¿ü]Q]*Þ}:òÉUä·» åNFñŽÝ§ã_$ü3Öo|dÚï‡uýZå´ >Iî®n\È,^29‚“Ô6†"¶t–µøGá]gÄž ñ\zþ«,¶ö&öÖÞH „nYÉd~¥Êd Zz[AÝî}uãøsáþ™÷‰¯RÞ“Ê„¬~s;cõà ç§Jä¾-xKñwÀ_êš%í¾£§O+pŒÙ%eŒwàî„gŸ¡¯žâ¼ñOí+á'ƒPÔmN±¡]‡Š÷Q¸K;ib™pbg8A(hÁÁ##°ªþ#»Ö¾ü;“À÷Émq}â×·a%Å …ŒFë•,J%Il‚íœßìúÅ~2øl3¸ŽîÛ׊û²MkK±¹6'T¶Šþb¬–2Ü¢HÄŽ ÙÉÏúñ_þñUÇüSaâ+kdºšÂO1b—; ©ý w¾=ðŒ|}â–ño‡ô-OXÒ51Ý¥õ•³Ë° -ÝW Q8éžô•º‰n}¾ø ¤¹‚áÛ(ŸÆsÆAõ8ëõéV¼ª%hIS]¤ pÇN3œöé^ oûMéVž*µðÍämq¨Äée.·ƒìïs€¬øžg~ +Ã>xÓÆoÆ‹8î.îžðßÈ·ö·30Œ&X͸P³Û’Ü|ݸ·¼Û¼¦S(;K!\œIÇ~ücðRRQCˆ<—Œv^xê¥xÞµûDøwSð—ˆ[Á÷’^ëöv2ÜCnö¾[VÜdí`‹–àÆztóïÙÛö„ñ·âë3Åz’êyµ’çí÷JªmvK3Œ‡==qŽ´Y¯P¹à^%QîÀà&¢@ç=%=ëôX—žÝ)p¿ ôîFxÀÏ\qœãùÏâ™â›Ç7³Bñ´-~ίÊí2’>˜¯¬¾1þÐgásè¶še•ž±w{Úgw˜ü®Š/rAè{~­¨¯mm ±¾SË-ÁÞ£Ðsߌõ¦Å BÅ« aÑHŽ‹~N?:å~øý>$x>×ıI“"{x¾ì2†Ã¡=ÇCÛŒgÛŽñÏí%ះ~0}RÓo5 -¶›‰mÙ6DO;v·RçùRå×BïdzëJ<Ш6²rwΣuêFqÛéOóÀ) É…*‘³ó»ŸNzúÖ~w£cÄNóÛJHU2«±”p:'>ÝkŒ ›Åmá¨õw[[£lH”[ûÁ#ôê)¥Ø²>ný®ÂŸŠb³¸’ÎËõèk§ý‰]XñVçÚÂyÆpíü³œûW7û]sñÙ±ŒÙEÉbsËsÏO¥o~ÅA¤×¼OæÚ ªcs ì8äzŽù¥»%ŸX‰Ê´ŒQ>lps„§'÷ÎI>ÕdÞa‚DŽXÈ£޾™íŒžku›9$û%¦§ üÑó ¶¸LÆ3Ï ÇrïéÒ§r±Ë'` RsÈ÷ïM®Q§s OkDVNü2 ŠáÂþÐûçÚ¢º×®ïÓÌš‚g.#ç# óÿ>Õ—,2,BI#dd:®ìõ#ϯSïP-Ä’G$‘Ï,IFÄÙêÜŽzÒjàˆ«>oÙ‹át®ìuëÛ€mõT~{ü­ 8÷¯Iùž Iiw°Âcë€F?§j UNbØÎlôn7?ÐT¨¤6ôפ®Ò}ŠÊOé^òyNäFMäìVSÓ“ÁíéÔÓ&lá3ó…9—'§ ƒÆëE» }ÑóƒþÆ×ÈËmã­ ÞâÎæ?ä^GñWáf§ð§S·³¿»²Ôâ3$W6.Ì„‚eR±÷;ËòªÌêêùýáÀQ“Мuç§á_8~Ø…´IC¶U$®z{.*•Éiá_ ë:ñ ¦‰¡XK©ê·lDVÐŒ–À,ÄöI'€&»«Ù›âuƒ ø'T¹ÈÎëHÖqÿŽKû3+¿Å»­åŸ²] Ù#(‚8çd~5ö3{áPë&:'ÊqèKëíÚ“¾èv¹ðæ§ð›ÆºP?lð–·m€I/§Ê0>»kmUÓÿ×Yß[ãç‰ÓùŠý†þú Wò.¦µ…Ç(’“æc·œ{ð*ÒxU;ɾ¼rà|¯3:äÁ$óÐ úSÕuþ¾ñr£ó¥u+ÛVÀ»ž":‚äb¬'‰µdÆÍJÅó_ 77³]F¿jŽÎõKàµí”R¿lðÊJ÷Æ:t¬{D»F3øsÃ׆B?Öi&3Û!ã®E>i*GÄp|Añ §ÜÔäð­ oŒ¾)µ+åêOÁȈçð5³ûCxoNðçŽY4»(´ëi¢Gû5º•p 8éœf½GàßÁïx“áΕwªèWz†«uË5Òê/9*…¨UêrO4ܤJHó/þ1P?Ó™Êú»çZp~Ó'·b²,Rö9U9ÿÇkØ_örøksoæCmâ øÁMV'ã¿ ONk*ûöSðSK OøƒOa‰-½¼Á²zd´¯\t£™öüƒ—­Îßö§ÕTæM>OR þX­[Ú­÷+I¦lõÎ3ÿÿõ«BãöEÐäG6~?“ à €ÆH9+!Æ=½ëóöEÔ#æÓÆz•$`º‹ðÿVÃõç¶iówA«êoÛþÕö.G™i2óDŸÌƒÇµj[~Ôz+®Ò÷zÊzõþ^Gâ¯Ù³ÅÑîõD½Ñõk[HŒÒ‹ ³æ„ËynªÄ Ž•åº^—}â ZÏKÓ­e¼Ô/&[{{hWsË#*êIÅ+­ì;;Øû×ö”Ð&UÚ,1€ªÈ¸óÑ«F×㶇+‚5ßqäºvôà×Îw_²ïÄ»wxZk¶ƒö;ˆgÁžÍdÞüø¦ôŸk±vÏØ$aù€i^qÞHúæ/ŒºìÎn -ŒËÓo?\¼ø¥¦jþP–îÆâ[Í\–c’Hãüñ_ Ýx_^Òóö+S´Û×̶‘1ùj©ö»ûSÌ÷1qœ30©µ7©Ju"œWSïHõý.å°’«``lu?Ÿ'ò¥7–ò°d݆¡<þ¯„#ñ§)¨Kÿ}æ­Ãã}z܆]FQŽù«Q‰Ìû‘çµ$Ÿ=Gr¤`ñíïI$V®ùˆÍŸ”nÉÇ­|SůÛ·QvÁÏ$õüëNÛãŠWÜïûÌir®ås;l}xñ[JÎVEpNrØÏ€«¾žÛHÕ¬ga "»†@Ø©Ç=«ä˜¾?ø@ó#‰Àã ÿ ½iûE_Àêï§ÂÌ=øRé©+2¡QŦºck³ZË¢éñCq Ü ’UT«GŸàÆÑÇrÙ9?`}m$&rØ/*=‡ç_6GûI’Û›MòÏûÀüxÖ¬?´žœÑ¢KkpP Ï·³§GÙG•3jøŸo.v¬{ÙqJМýãžÿÊ¡`WÊž{Ž{õëé^/oûBè’.Ò÷1ÉÇÿ*ý·Çœ¿7*Ÿ¯ñV¼ŒçæGªòÛr9`§§ÿ<Ó¾×0PË#ät*x9¯:âþ‘9!u(Ènì3Çn‰[ð—6?ˆ’3ôâŽV5$z.‘-Ö¡©ÛYÖµI*Èr@Ïr'òæ­êiwkcà½[±,†&GˆŸ,Ž{õê9ü³Ö¼ê×â×)q Ű’6 ˜”g ðy­;¿ˆo«Ù‹i&‡ÊÈbc#{°\ÄuÀâ°”js§¡×Nt9)¯{¡¥s5¼± šÒÊä5ºÉÈõȬkŸøzõüëÿ hÓ1ù|¿²*Œçý‘ךbêðK€° ãëŠrê0ͰgvÓ‡+øÖ¶ò9nP›À¹÷xVÆ<‘$‘œþ 1TçøWà‰FcÓ¯mAç6÷òãõcZæþVÚéœôêú´£;zªägߟ­=„a7ÂßÂ1k©ø†ÍÉê·Û€ü Ÿnõ\ü7Š?gñ–³#n&Ž92=z èä+¸ÜªÅpOsži-¯„QË$Øwë¹I¸è~†›m+ I6“1Á:ë*_ÈêFT\Y.qÿzoü"þ0û." ¥¶³HŠçô=1ùP?C“‡ãç‡çÁ-,d°Ýòv®Kâ/4ïYB-nbJcÂ@ükÑ/,ô×VûN“¦Iƒœµ¬džþ€þ5Â|FÑôH4v{MÒÊažÊÇ×=zU+ö!í¹ä )€†:ŽÕ¯áíF]:o1l®.¿–„ÿ*ÉäŒv­ÿ ê7V· Cq$-¸Qˆ¡vúwň,bÜi—Qz’„qZÐ|iÐÜ·œÎÙYK«}q1}ªGG ¹bqÔ“žp? ³ku"‰ ÉŠ@Ç >~™÷§b®bø“âF•â x#†õAU¸ýkÚdMG»ø Öµsqep‘9²¶k]ÆFÚy‚Á€sâÏn|ŸY’ Amyimokz³anmàDuùOP9Åzì¤ZŒ–²»4öy™™ÎI8îk–Q4§ñXûŒžsÒšißΚGù¥4(?xezœ{ÓÛ·5—â}E4 j÷ÒRÚÒIH$áx Œ¿jo„ÿ&V±ãR ;=^6»Ó4U˜ˆâ‡?( 2 `Œ“Í{çìÇn,~ hŠ.à³xè£úU¿ŒÞÆvöú6·w+^Øéö–fi‹4°n‹Ï•–Ä4áI8Œ9Êø/C—Àž´ðÆšfŽ <¦ù˜´€úg·ó÷¤åÍb¹TSHíu]VÖÁŠÎÆY‡Hr>¹á}ª…µµÏŠ4ýRYf޳,.–HH;Ê™9`9å»b“MðÞYZQ–êMt†ÞÇN³Y^Ã~é®Ì§çˆÂ%1߆ÎxÆ1Îi;½‰µ¹‰¥øu ä®I­%··•mU ×'ƒ_À?Ú?ÃôëC½Õø+66Ý7g÷Î>¿Â>œûÕ‹ 8lÙV$ 3øš«X“É¿hØ– H‰F^À€uãx¯Xø?_3ËøÂOüwNã^QûIåìtqžº¸ÿÈ‚½[àÌáü‘`‡ÿ„ºéºpq§'JÊ¡½Ýÿ]ÍSJóþº¤ãW5Oøÿºÿ®†ª1[Gdd÷œRô£ž½1TH‡ž("–‚G­1 #O§½<€B¤àS4gŠB3N"†PXù±^‘ðrÃB¸Õ..uƒIj›àyFqŸ¼íÛ¥yÓ U‹iÚ0áIPF)4š³Ü^‡´xÓãdv‘½‡†ÐB€l7Dsÿ«Ç//'Ô.{‰ZY’ÌsPªädsÍ;ª[Y ÍŽˆ`ûTÙãÒ¢y9ÐXÑÚ¬§AP Æjpp• D€=*Uè) ` ‘¨’øšÁ|9o¸íSªé¹#¯üA\߉$^ZÊöõèk£ø¨ðÕ³cq®šqÿo°×=âHñ}lºðcêÿ(™?îýO¹?g[tƒàþ‚ȸiD®ç=Ošã?é5石øÇÂ×9ôsס×ÜôŠ(¤EPEPEPEP_œ¿ðS߇Þðž¿¡xêçJmGQñ k „i]T<1¨Á—å#Â\×èÕ~ÿÁ_d„ü;ø{˜>Ù&­;E?3(„aì &~¢.®i Úò‘ù¹¤ø/WñÃ\j:.‹9Ò­§X.<—ó<–a‘œãŽ=Oš‡Ä~¼[}ZY´¹eS$Q]Û´nɹ—vÓÈ•‡á_Eü:ý“¾*Gà½SÃZÃËëÍ[ºµ¾’æížÑ“ÊW Sœþó?2‘ŽÝÎøùû8øÛ]¶Òõ-6ÒÆæÓÃ:8Óî’Æíä0G‘ƒ"©b# ¶~V8VªpzÜäörkmOž´­2 BöHbÖâµÚ¹³R}È®‘4ÿiqÓ¼U#GŽ|›×_еyD¶ÏóÛ’³`à‘^Ùð´øPøoLŽý4%’9n~غ¤Ï4’Ÿøöe–1à2“ÙŽ *F½LW¡‡|Sã-?U¶úõä!ó,›D…Àçj’-ÐÀ'šÕ“ö’º:4¬ë ¶¼“2=”–/åB€ðÆS''Ûonµç?­c·ñM̺Òš8x¶›;ÉC8ˆ¿%¾fÜó·F[(Ï–Þî1y©H®N$ÌjpO^ôœQ¥Üvg_¬üCñV®Jßk2C0ÛQÇÝúÖÚáeC(’g ¹''ñ¬ë¹ów'rßuöúT?i;ºå{ ~†.Mê} û%x›PÒ>9øEôË‘bò^­·ÉÞ$€«+Áàþx¯Ð_Œßaøµà»'ÄWwwvÌé>DÅYYFÞÃò¯ÌŸÙjõ‡Çÿg%¶`êØ¯Ö=h¥O–ꦢڄdÓ>ýœ|ã][Áž*ŸCÕî¼!£izœúrëÝ´sÉ Ú¯"ƒ½F+‚G=E} ©x§TÔìì-¯5«ûãmk »É-¾ÒÈL®Sæ,ä<õjÏýmUg½} k%צH¹ª²Kæ· ¹ãý‘õ¨‚Ý›IÛBTºŠÉL–öQA1?ëÂîû—9?Žj ï..d¥o›žO§z¥}+yHÉÁïšÎšr±?ïIqÏ¡µHɶϛ¿j6•ü[¡\œÓ ’9ú×Ë:ü,ž1yù¤dýÍ}gûE[GGŠïÜ[ɸ`×ÌÚüßj¶º„r¼,®=Åïa½‡ÅpÁœqÀQVäÔçžÜE<óIœª3– øV|D¤óŠxeÝšÙ™3JÑF³C+E"²²:G"»[okZc‰-5BÑÉݺ ©'×ןß1™N»‡_­t3ÈO–yÔ\¥ÜÜñ¿ÄŸxêµÖüCy©GD§Ú_wL ïø× f¾_‹J‚ y$ÿ«·sZ‰\\‡Úab›ñöÏ ªPÈÆ>Ðí”àñ³­;»}̰@8ÆFx§îeë÷{b˜N±žOZàŒñíëPž–%Ÿ¢?ðN}Ïð›ÄÛGMk¯ý°Ž½SÅ·fý <W$¾“¬Fì|¸OþË^Qÿß“ÂÿÇŒíÖ‘œu½oŰ,ŸüÇ‚šnªsõŠ!Kr¢rZð0j3¸Éo1³ÜŽzÕ)š@Ã+Áç5?ˆ_v³:©ÜCüØç&³æ™Ë·€q“éV&DApNA'ŽO¥A$…ãÚx?NinWd€‚3{Uy®ÆÀ¥K1CNÂ*Ü:¡w#¡¥y¿Ærgðf¤è@ùN<× ^PüüdÐWñbê&ð6ª¸ÃlÀ,yÎ{SòÄ´†óXÖ–éçñ.—o<únœcÂ9Qþ´>yd˜&9Ç^ÕsÁþ"Õ¾+éº÷‡¼A¬³Ûµ¸Ô#Ôï¤"+Ic`7ÊTUƒÆ Î1Ò³þÙˆµ‹ÏK5·• $³>7+qq€v¸å2~cž™­ÅW?ôsÃiÚ^«]·Vòi¶Éj—F#¸Ã.0¸ ’ ÀsRl‰-àÿ…3àûÛû[ÍÅ3j×Kf<µv ˆ7’èê?xIw0H¨uM;VøÏá*÷CÓ­cºÒ¦–ÖëI³ÛB¡ðé,jÄO ÏÖ/C›ág…5„ñΈ×6zŒð­®Žó…È›‰˜I»T‘Áçw¥gxªH|Eà&_éWvzEµÜÂïO‰žâXg` »8e(03ÓiŠ4¼U&‹àíÃ^ñ~‹>·­ÙZ³Ëå]›w³Ü²[äçÛ$\÷Æî¯|Ký« Jþ¼·€é“*À#"ÏM邤uÈ'½nê¶Þ½ð†¤ñµþ£§k¢Õâ·’Ê+½²¹›€Ä˜ sX5+»MR/[\0ð奼/§Á»¢’2€‰½Ý²Ù>¹¨+Àºö¡ ø›J:SI<÷ ¶HH[¤fÄØê+Ò¼?àxoǺæâhõ»½\Þ[iÐ8™ž%fU®61§çÿ-è:çÄ9c_ é:c_K-¥¿ˆ6ûd/"´i3ÅKeb<’0iꀭá/…ÏðëZ¸ñ6§­èºž‘£C4Í™~“MrÛ ¤Où•° ‘€2)úw‰tïŠÞñ‡|?àÝ+ž%ž¹ŒhÅñ©$M¹íö»‡8Ú@;qƒÅex#ᧉüâ¶ÔZÈpç4xŸáî­ñb]7ÅÖ7>­lsk}»¬©ò1‰\Ñ Œp2GjèÖå¿|rñW•3[hZ+Gim¦É°–P2ÄrLƒœƒü\TÒþÏšü&cR¶×4è4´ ò¨(Ô ‹ýi_$ጀqÆyç¥E®|Gðç„<[e¥^x?Kñèimg.¯vdѹ°¦G@fßø'Çãëv°]\Ks© û}t@E»FÌJÄp)Á¡ù‡¡É|Sø—wñCÄo©Ü[Ç(òàTÎD@ ç©ÁäÖçÀ߉‹ð×Ä7ÖÒÁZëQ%œ×2nr²@$gÛ5ÎüN¿ðÖ¡â»É¼1gqghÒ¹“Í”:HûÎ^1€USœzšµðžßÃ÷^5±_æýìfÖÜmòg—?*LÇ•BvŒŠ]Ftüã |RÓõôëí,Y^4·z½Í¼‹h±.L®eÆÖR»±ƒÎF+Øî¿im;ÆZGˆôÏ XÝØkM§ÎÖM3gÍÚ>lü[71ÎÚñï |Oñ†»ãïì-fóPÔ´Ûë©mo´&œˆ‘²¸U<&Á’¶Ú¿áox{Áº¥ç‰t¿Xx¢çE‚k«}Þ £¹iåÙ]¥vã†ÉÇLfšûÁ’~Οµ»_^hê·W^ŠÆIõ¹™¤[xÓ\dõ,Bßv+Ù¾"~ÐZRü5ÔõjnÕ`x"–QnU­‰VVÈáA^>ažk´/‰ÏÅ;}OÂZ«ÙGý£lÏmwmg&ŒùŠ%tPZ2_˜àdÕsÂÞ¸øQ¥k¾'ñZizŽš-~Å—k©Euü®ã '’Ä¢¥²JœƒM?˜ŽÿàGÇmgÅ‘xŽÓÅWpΖv_jMBd…¶lv\u,={t¯š!ãĶĺxxý+Õ5=WKø•àSOðG„#ðÞ¡ouåö—§Ë%ɾ‡C&ì°± 'ïgµxò/“+,‘†FÜr ]ÃÐûCãÇX~Ýi¶XE©ê7jÓÊØÜ/#wÌÇ?€÷®·á·­|}á[mjÈ=¸%²|Æ'VÃ# ð:c§o–´½@¿øk ÏãíRûGÿJž-*{8ÅÃ[ð\ Õ¯-¼5-¡¼ƒQ‰¼§Ô%g"G‘A;YJ…ÙÛ]|€ú'Çßü-ðãÄi¼w×XÉö4V)< ’9ëüë®ÒuX5Í:BÒfûÌbx<¥Á*FTúôàŽƒ“šù+Ä>‡â‡‡üE­x“Nðî·fá5c&ë¡K€Q[he9ôÈëW¼Oñ_øW©ÙxWÃòĺfobKˆ›¢Fó&O;w¦;sJȤÙôGˆ>%øGAÖ%ÑoõȬµ1°$2*›¹`1Î{×þÖù{?IÆOœ2§ƒÊôÿ=«ñ'ÁïüHÖωtHašÃZT¼_µÞÇr‘#*§8#¨Åc|aø„þ"šÓ@\Ûèƒì©|äù—  +»r§Ôô&÷û6cþÞœ-î##ýY¯±nœ> TÛÔdn'oÆ{óééðÏÂß[ü:ñ­ž¹qk%äÇ$o Nˆu*pMnü`×õÍKâ=Ö¥·"ÞàE&šÖÅÂr£Ê üˆõÍM–ì«ö>ËO%É2°2œ'Žz²ýz c¼˜P¤¦Å.Œпþc=«Îàø×¡x~îÃCñáµÖÔEöØ`„˜¡™RþIÏf¼?Åüs¥|DÔ¢÷VéoxÑ ,a£6…Æ>eôëšv¶äÜú¶VÜìS$ •Ÿyއdõþ´Æ¹û<Êë˹Sk‘N8ÿ¯Çƒiãm u(ôã©Û¦¢1¾ÇÌ]Ø åã<7ã>™¯ µý§µ—ñjÁsolt»)ä˜14q–Ær9ÈëúQgb®›)~Õ2É/ŒìžBÅÍš}îܵ{Àû”? ¼9¡ +Æ0¾c¹½sëí^9ûOɾ-±òÙ_m¢«c¨mÍGo¥zg‚¼eiðëöÐ5«¸å|†DG˜æW ‘ÆxïŠ{2z¢òpaß3œ@ƒœþœö?ÃÅ"NÓ‘‘©pAê@Î9'Üç§Ašà¾|ZÓ¾(jqEúeíº+dpÞjgøHÁÎqšè|Wâ½3ÁöëÌgn$H|¨c1~ãèzsÀ¢Ýô[›†_2eI„’HX;(ËâÀÀŸÀñžµ‘>Ì‹&øÜ1óDD†9'#‚9ÏAüëŸðßÄ ÇšlòèÓ5ÀùsCp»J¿+Äñ×Ôpx«ÚÝ퟇,ãUž(çÝþíX‘Ðq– >§Öž¢¹ŒÝ×Âú»•—Ê6s¤`Œ• ‡’1Ç'©üë䯅Jßð¶ü2ö8Ô#!ùàúñÏõ.µªYkÞÖdÓfƒP´û¸šÞ@W"2H ÜcðòÇíñWÀŸ”ê‚@Ï/D|Ò>ÖVŠˆä)Œí^1é“Ô“ž=úU›k˸Õe‚g³?uäFëŸöGOAU÷"³á™¶¸Ç¦9<}=b‰•ÙDûC€pÀàu#‘Òž¥hhÛkú”[Q/¯P"˜ÂÇpÞ§ß¹$ãÞ’ç]Ô.!“Ι.À)wÊ¿ðqódw›ÀÜŠ$÷UºäØþu†><âYÀÐòÇ“ÏÐp;ô4·1g±Ón¦&ãGЯr6ùrhðgݸŒg¾2sÏJð_ÚSº=†›¦ê~‘a¤\<Œ’¦Ÿ”ŽÈàpF2¯tœˆ!Þ¬Š™yÁÏvü1Óú×’þÓ’]xCMf#ËûAب0£äíÛ½+$'{#ðÃ:g‹¾!iznµö–Òœ¼— há%eT-µX‚H88ÏC_@Íû?øìŠßX²e@NÍE$‰û¸1ä`ùWˆ|e´òP8ògOLùm_SÌ©öR…•¶«©?*€:Œwÿâ’W<ÎëömðsdëV*T²™`†PÃ8ã•÷ü»VDÿ³.šØþ,™Ç¿ý'MÀ^ ížÃ‘ëí^ʼnPÏeî²8$)À'® è?$iY-u= í”â÷Ëãþ¢½õ˜:”ù¹»#Œ~çœòI÷b‘gÜÃÌEQÈv䣀M¾Þ‹yŽÇÉþ6øm®ü?òµà€$Ĉ嶸IБÔnRqø×-km>£uµ¬\ÜÊÁ#†$,ÎÇ rM}ûBÛ$>²Ô‘/ÜÉ%NÞO_zòß7Vt{›)^ ¸DÒE,mµ‘„MÈ=»ÿˆëCB[œýß‚uÝ(Ÿ¶hš»Aómd\pzZ ð\@pË,G=ÁZû& ^þÖ2Âæé@‹nÅÎÑ×$vïÓÖžºî£qn³·‘z7 =xÜA®h³]AÙŸ%åÊ%Ô‹ƒÿ= XMkQîÞMÿ}f¾±qo)ˆÜØéòí\O§DÄòIÎSžxÏ^1T§ðþƒt®.<-£\¹d[P1ÉdÞž¢G̱x·Z·#eô£õ¡ÄŸÀ>[ö#©Ïÿ®½Þãáç„å+#ø^ÈEŒºÁ<ѰbxŸÀÒ¸/Š_ô#A7ºEœö¤€{†•s·##Ž}é݉£‹âþ¿ oi–G=Xõ«|nÖPÐÆû{àé\_†´„ñ‰4Ý2KkÝÊBó•Ýå)lÇ| œW¬]|ðá25‡ˆµ?(gË{«Ô°Î`%àŸN{R»eÙ$d¯ÆÛ¢Å¦³W'¸ÀÇÓ«Ð|t ¸’Õù98ÿõÔSü _.6‹ÄÖ¹u,{IN„õªíð UxÄ–ºÞq1Eß$±d÷£üißÈŸ#fÖZ)ŠXÊžzœŠ»mñ‹Iò”ot>¬.ÕÇIðÅq t].`AÂÇ©C“€°õþ~†³fø?âøICšlÏ #”qÁV9çŒ _!Ýž§ÅMáNoŠ}ÜŸAÖ¹¯„÷‰¨øßÆwC-¶ÅÁS×3)¯:Õ¼¯hP™µúÎÿ-&€…üúWi𺟈:(FO3(ü(v{zÜöfa Û¸–ù‚Žä{ëY—s)šdÚŽ211ç¿Ò¬ßÉäFäŒpK(\}Hü+›Ôïò…pİÆÀ<~§ƒùÐÛ©›ˆÚ/1QÍ·nÝÞœõé\.7éæ YÓiü¾•»zâ{V”¡ [!~×Þ¹_’lù€€ã x<Õlfö<ÝÕ?áZþ»m£¹Î+%9ÿ ×ðÐÍÎ:8àdþ#=*ÏX!\ uãóÏ¿5£91§1¡ãàšËÓD…J… “‚:䎃õ­?+–1¶Õºð>¤ûf¨e-v]Öö©ÀË(¨ ש~È`ÍñesÚÎ_é^G«áD •b_9†ÓÅzïìn¥¾+9ÆBÙËŸüv°«ð›QÒGÜ úu Œ \`}hj Æñ“XÞ-‡í>¼€‚Âs $á§­lqÖªjɾÌ(ïqkÓþ¾b¤öeGâE/Ù_ÏñWÆ—šuÕ/ ×$k{-¥¼çD„*`rrW¥^ºÓã¸Õïå†"¨ó»…nª¹Ï?JM{Q“Oø§ãq¶gó5‰¥…­ÎÖ;J“‘Ž}úS%†}G?keH³Ÿ³GÂgý¯ï~<{TÅž–o|»[‡wº_§÷éõ§ÚéãÏ3ÎíspG2IÏàaì*Ôq,*€ éOEùóVI€oãŠlx –u*ب*ýi“ÔñïÚ<â=ö¥¿þ†+Õ¾ Œø?OnÍâÝ@ÂÂ1^QûEòøm:nÕ­‡þ>+Ö> .ïérsƒâSOô8«›Ñëýv75 BïŸùjÕL¯NàU»öÍíÑõ•¿U# ÿZÙldÈñœúÓHíOãjÉ@Ûý)S½(ÛœâXAA{Ó¶`gµ c1ó~µ£pö6Ïfi X–,݆'œp*ÑIqšBXÊ1VàŽA÷¦(é²É5”M·ÍeùŠ .rz{UÕâD±áQ²¯E• JÕNÞ)Ê™§F8ð)ŽÝÂ5ÚjLqB/&ž}èÕS÷~´È×½L£‘I°%UÈÀïOˆ‚XÓ­>ܪ8fÆ'5—¦ß‹­nú1£ ¨*Æ/ʼn×ÁW7¢¹O¸µÔ&Ž"¡ŒP\Å4¸Ü@$$lqžqŠæ¼Ewåõ¬Öò¤ðL‚H¥ƒ+© ¤pAƒ^¥r21^ cge£ø£Ä:E†È-¬µñY£ä[¤–ðÈB®~D24¤Øé]Q´è¸õŽ¿'eþF2Òi÷?E>.ß„^?u'þzô á> |'ðïýpoýÕÝמÎð¢Š)QEQEQEQEñü·Æú§„ü1à›kMBþËO½¹¼k•ÓîšÝäxâO',¤bqßJüñׯ|DºÒй¢Ç…t¹í¥`Âi&O,s´¯Ë¸Ã 28ÁåÍpÏãkl“äÀïúæ+—ÊGW@’ƒâ%·& |ŸÃvIY!99jÙbü…™ÆwO$vªÑ¼â¥Ôý®aŒaÈÁúÔ1å˜Ï­%g¹›Üõ?ÙŽ@?h‡`aA×-FHëóŠýkÕ¶>|Ž6 üŒý›ÜEñãáì„áW^³çþÚ¨é_®Ú°ÎŸ8Ïð7'éQÔHñ?€Rþø¹ºñ†¶¿ù[#ó¬'›k1 …$QŠ×øD|z9Üž3Öß«B­a1sò‘“‘·wó¢=Me°“̹ ’TçÖmÀ£¼’C*{µ`ã9ÀÏB* w,E°Lð*¶$ñŠp}§L¾óC7îóƒô¯‘Yd¶Ô&v•ŽßNk쿉0,–Wä.£b?Jù\³0ÞûªA¦´+Æ@UïRÝ’GN*žâò©ÖQü@ã=h$IÕM»õúVÙg–Þ''pdðXV,„<7(É-Æ+nY4ûiwdHõ¢à¼ÌMra–B]U”  ߟåÅVÓœŸÚÆèÿ»Š¹®*„Ú쥛…×üæªÄ·ˆ,YÈ@°)r[ uæ†4Uu!˜gÓFw¹õ§Ìù”°ÎæÔTc;†ôëÖ³»HúÿÞgÿ…ãR?ä)$õÿR+Û|Ii#ügð܇,SLÔzz„W‡Á6>ñº†ÆÍJݹÿ®-þô&±Šº+Ž6é·ß1Î9ò©Žže¯mnì 1Æ¥Q– »=G×JÞÖ4àšÕÞkobO¨Íb×ôÚø[ÃïáÿIi¹V;™.Ì!Á–8Ãd£mçƒÈR+áõ½Å׎cnkSSyTù܆óc»œwÎ1[BxkE²×õ_êZ¥Þ³ihíßÀ˜",åB¬w0Sõ摢أá+qá ~ýºÃE@Öò¬¸[­ÇýZ¾2 nÝÛwÅ\Õõõð/ƒìO5ËÕ°»½Ýj%~ÍteU]‘:©8\F<úS<;ªÝ|Oðε¦x“^ò¢±ò¯-u}EšD·mÛ3·$‡ Ðr¹«+|ßüi—:_‰N±v|Ë“mö‹HÖ%»Û*ÞÙðçƒõ{ý¾,__èÐKwkblÞÞTe8»q °ÜuÆqŒÔZG§Ÿi2j—±éÐ,?hºqr\L±F„ž2ÌBîxê^ ñn‘à{½/ÃZ·…t¿ÜhÖ±Û\^Þ<‚MÄù…cda•MÛW9Üò‹ )u ޼÷w“‘0@…ÝØö 9'ØW­ëíàË ]LñÍŽ¯?‰-´ø£¹¸Ó.ßÈ%"™6Þè„ASÛµ au(øƒÀ^0Õ¼z¾"Ñl5+í>úé/4ým`c ¡*ÊYÇ °ž6×E¦êßoþ%ù¶zv¡ˆä½v¶º{˜ÿ³$»9ÚÞNÍê¦LóñßÒ¸ïø£ÄšĶ]>ñâ)4'O¶²b-æ‡ ä…NŒ¬¸#œœ÷®žO‡¾ 9—IKq‡ôÛ‘hº\‘'’˜B˜Ü”gp9æ«mV‚ÝÄ DÐèšî‘ã“ý©aqoesTßBë·ÚD™$`“ü8êÅqOÔ~†ï‡¼O¤ø¿Oñ‹áÏiþñþŸ"ÛMe4Ò…F<ÍvŲ́pWãë+áׇît[Ïâ»Ý?Ã_Ùþ]ÔW0´2M)``ïëÙìÏZ×ð£x7I³ÖõÜk7~*¶Ó¦{huH£UŠ<,‘2³„,p@ã=Meø^Ô~!éÞ"Ð|G­\\i?`kž½‘¥[ c`Qúä$¡®zq@ƒíZ&—ðïZºð\ÚŠß5Ä1ê^ClrWa@>Bø }BúךC+™ÄÆL8;ƒ“Î{õM.Þ…^ÕµÝ]°ñ&¡tcÓĶp»Cf–c*Ê€m .A{×–#5ÍÙ“ËVlï*Ê{šÝž¥}myñkÀÚVµ­kvÖz®Ÿq&œ/5YŠ­ìX¡H—BH'¦ô«牥øO¡h^µ·Òuï6Ô'žúÕnà&Vá!.>è 2F2MQÕôí_âÿ†ô‹¿èj?³L–·:V—H¢bw‰UÚžIȫڜz/‚<)áíÇZ%Ö¯«Æ&š;[kϳIa°*Ž@9$‚ÛHã=iuó†øÃž!øÀ4Ÿè¶kŽîÑ`žÎŽ$µ–#°¤JÅ~B (ã8©|O¬xSÂSéZˆü4|Kªév)Õâ^¼%\’Þ^á¶gÒ±>+\Í©ŸÞè‘M†Nœ«c‰· ‘*HWø÷ä’z‚ kx‹Kð¾¢ÚÞ4ÕoôOI§Cö”±´Y•”d#Ë’ ¹M¹Æ}zÓÐÌø°5í_Ç««YA3ØÝÅo.•-ŒL"Xv(A©>àš«ñ”èÏâ7’5¦—Ã>¤òm'‘5£ÈŠìm¥˜ãœã­Øæ4-[W·¶Õ5A¤Y? xЙDðƒ^½ã^&øqâ—м3?ön‹¦E [2,‹pª ù¤~ø9Èõ¯#ð÷‡o<]«Ûévg[©TìûLé p2rì@Ÿ5é^1ñ¾áÍrÃEºðÝŽ½.‡ 6SêM'#G÷‚@Ú:ŠØýgá Þ0ñbßYë:^›i«²^}Jô%͸‘C0(A-‚NÑÔñÅ3Wø±§é8*žÓ¯,ôé’Ù/®­‡ÛJÅ„ó wü¹èj‡>x«Äþ3¼Õô­2÷T°¿•.-u;{vò\@X .ÜãÛmmkš§€Äº½•õö¦“EÕõµÊ-œ³( ÌSi%wH<óOÐ[îc7ÂÞøèKkevðËx“¦°ãªä:ÈÍÛä×Gˆ>ÉñÊB˜êbù’XÝ‘fÓç +ÃÏË¿œ zô®*ûZñ]¯ÅiáI¦—YžÒ9Å+nàÎ ‘À×HþðeÏÄÉm ñ /[þ%MÚòO’’ƒŒã$¸Å/@õ<ÃÄjvºåüZ²ÌšŠÎâq0 ï w}ó]—Ã{7ñ.‘â]7R»’ [[%Ä÷ŒK¥”¡ÀÕ{’IGQšæ±mâ=.æÖóZs®™t¦9UYd˜ƒÈ䨸>•ç>ñ xgÅúf¶Ñ<Éer³˜•°Ì`{èb¼—Åži4ëx“áv‡©À~K¹|àœü ¡ädàîö®gÅPøCC¼Ó4ÿZj–· „îãIºXöœd#n À'®G⬷Ån˜éÆ›OŠ&!jPy{Np8'ÔWî;t4>©?¬0FD7 23œDÇ{gþ1h¾ Ö›F¾ŠæY„éPåäê; œzŠùoOÕ.ô[¨¯,.¤´»%&…¶²þ5êž øpÞ/¿²Õ¯Á¤¢ÁæÝBîr_=@$œcµfx«Áš×Žu¨5Ý.ÚK¸uˆ£¸Y‘]\Œ2ᘹҨϣíî^òxÈHp LÙ.?Ãײðìvé«6› Cqrd+¾A÷•GL™ëï\OÄ{mSÄž'›V·‚ïQ°»T’Öx g *£¯#Ô;-XÕÞˆõ/ ÿ¯8e¸Ã}‡‘ÏNç^]ðQö|FÓŽð™I—$ãƒqšßø—â׋ÂÚg…µfÖ¬‘í€á$Û‚‡<î÷Ï¥r_ µÛ øÒÎÿQ*Ñc•M¥¶–”BE'ºésê7fŽÝ°5PÌ# ßÏ\ñÓÐsÞ¢ˆ¼ÈªÿèÛÔ!Îx àŒüëÃþ)üKÖ,|\ÖúMì¶¶ñ¡€ðÞheÝæÎr>ƒèþñ„¾Òo5*Êîòô™B™í¥aN:ú´[[ újt¢O%7³™$—©R9àd~TŒ cI +“ÀrI õã¿ÿZ¥†ém‘ä–æs½~yB».3§ãƨ€Æ# Ÿ$¢ ¼€03é‚8óÒ£ŸaŠWHò“Íè=}Æ}:Sf’(•<¦$£z2*¿™ÎNßäUQRƒ9ÈR[ôÀ÷ÏÓÕŒMnH“~¢ThÚÙã¸Üq’9®àKµ:,,ãO|ʹüº×eâ9Óû3Pƒ$2ÄåC À g޹§kŠød]OĬ„¶±$ñ8sRÁjÙêš”ìUœ³G¸µTnϾkŸšÚAv“>ЖÝNpNyB}ë^ô¼‘ã22º®‡-Ï=ûšÊ¾·Ü¶Ü¤Y@_‘Ç$ýúLÓÐOC*dÞÅP™R¡B€ß_nÜ×7ãg/¥Gón'=±ØþuÓN²Ü!c‡Ïƒ÷nOjæüo .˜Œ1¾[1ÇÊ5¡æ£>[çÚ¶<0¬×'zjÈÆ#~=+cÃ$­ÁÁÁêVàz5œ€ÀëÕÔn#n=_Š5xFYOgŒŸZÍÓÝ dì$ƒÁ~¼V”nÑmÜÎ à»··¥2ŒÝpôPWÌsÓî×°~Æ‹ÿBb8Å”ŸÍkÈ5ŒâÐ’Y·¾Kuû§ó¯gýŒ—?ïxÇúÿèKXUøMi|_yöÁäzSy§®6úÓHéèjˆÖ«Ýò¶Ã±½³ÿ·¨ªÁàtæˆK{¦«`ƒ¨Ùqëþ• Kب"DoøŠL ͩܒí£U#ÆqVµ›ÄÙõÔ®¿ôsÕcÈÖĈ:f•~Qš?‡Ò Šb#¸5|Ê*V ±2‚ GŒ~Ñ2âÿà {êÖçÿ¯^ø"ÉàMiûþ%ÕßÂÚýkÃ?hë¾"ð¬çPŠ@=Í{gÀ†øGÃÖájú¼î¸Æ3·ÿ+‹DmAïýv:+Ïøý¹Ï¼oçUÈÅYº¹œÿÓFþuVñÙ‘míA\ Sÿ ‘T"A³á¿ÄP:ê\S ¡þµÈÜÛ²»¨ƒó sþ£»6‘žCÉÆß˜~Gš†hÿÑ_†Çaò¬Hû½p8ïÍU»û­!8íÇLÕ´B<ÛÆ1Kycr¤»“žOkå?A…õ± æ,°c_]xº0ö÷E1Ê‘¸|{ñìÿmZD+.@úQu¸=ŒëkXf×­ô†¶2]L7¢£c#qÉ8Æ)‚;)Õ–Ò;¦ ”uhI$ñŠ4”–o››‰|Û”´Ý tv ÂûñZZv¡ý¸×\•ŒßDàNˆ7+ýå'F@Øš4…y|5Þ—su ìkoÏ6P¥¼½Ç N3€Njݵ¥ºèðCmv—2BpÆ0vªãï1=9«^†ëÂvZ¦£oÙËoö9m]ÕÒãyû‡¦FsÛŠ—J·±ñvºvŸöY ž9®,¡g”ËnRr~VÁ#Ðçµ™«h“ËH²A#'ð#n8=øíYwzUÍõÔB?žáí¼¸àPY¦l‘…¿5ê>$ŸN‹Â-i¬G:éi2Ëi%–x¥Ù¶@ ä#nAîq^5·];áÞ…¨øvi$Ó^yažíÀ¬àgcã ÚF;})m¨í}Žnko²[Ù[³ù³Gn‚LºÜ’¿‡ó¨GP+[]Ó”šXiI汎ivò“ž;ãe8äPä‘ ûûþ ¯ ÿ„7Çkœ·Ú¨òŸü+é-IHø‡§IÙl.¿ô(«æOø&Ä›ü5ãÈóÒòÌçþÙË_Q_'—ã8¤â=:rI÷’!R¶*žw­Ê¥pêÊrØùG$çÖ¹kÉHvÚ»NyÇzÞÕ${vÁ0»Èƒ5ÏÞycxn0:wjÒÂlΞr²œ $ã¯ãTæ•emû@Á<àÓ§!ˆ#9Îr;b VD`Ç8' ª$eÈ$d þ÷zàþ-Þù Õ² Œ ã«·»,ë•F~ökϾ*ÿ¤øOTgÚb RNi ù/áþ±uiã8tx^[½;Y™­otø›b>TŸL¨%íŠè4ßYü9þÕñ&™â7Äòi–íåÁ§îÝ9Øe#FNFpMs¾ ×.t_I¦EI³#Z»ÇkˆËEhØ ÊFþ@ûíjø_Â:ŸÃ}GSÕõ³M¦YÚÍÄΓ-Öï‘bu!XI8é×4VÃì5­Sã&©h™e©A²ú)­áŠÊB¬“…6CãêK[Sð³Á“Ûx³H¶×#Ô®ÒKM5®÷B»º‰mÐæ ªäoܹÏ'œsšóoxfïÆºÍ¶•i5µ£³ón&X°2ÚXòÜð£“^»kñcÂ÷>û ð¾›m'Ú ¤>-a'ÛÕ‚˜Äî»¶3äñž}y¥è&‹ð¾óá¾½q®Ýk:EþŸ£$³2é÷é4³ ˆÞ!ó(mÀ6F ÕM+_·ø…¦kÚá½7úÅÕ¸šÝ4„pov8f€îcŒ©$c*3SøKá_‹üâãªø‹D¼Ó´(á¯o¯-Ø[ÜÁ±·¨n„¸ òjͳ¹ðÖ¡¦k àí+RÓ5Å´yº¼‡€ȱ€†ÛêN@=(^@ÃAðô¾ ðö³ÿ ¶‹¨C£^˜’+Qû‰d[!ãbáwpF‰.ôÖð»x=5 M3íÄjPÝÈ$œM³÷E2»ÀàƒëKðö8|QáïØx“SšÃÃðn¢êfk[ûP*–ÜPGö­ a£øgàá/„5ѬZk3Éms¬CnÐ>mб$d9'±£N€y¬ïlÍ:\5¼ñüÑÈŒUÃz‚:zõm{ÃOŠ­4 _Äž*µðι`<3Z¼æp¤¤s¾Ï¸Î¡r'»×—é×:eüz«¤w6¬%U€aÓå<¡¯ZÕ~ë¿­ôïio¦ÛO}hê×Q¿ŠÕžXþFxQÈÌm€@G¥ê3]øÇâ/xˆxrÍ‘ü?¢¼vÑY\BŽ^5,Œ‚à’?Ä1Qÿ™½·ñŒZ¾­c’³ ðEüoŠ/õ›L9ßæ1Œz•>¿ñ Cð§ˆít[ß ézûèë ¤ÚÅâH·lÑãsä ÀðäVtß|skñk¶–7—0‹å½]HÛÉÜ$f*íê:CóBþñ#Gñoˆ5 >×ÂzFƒ¨ë =½¦³h]fIdfðÌSp¬@nàŠÈð„µ¿j—º‰´Ký7ßaš-D]Û´itŒ¸#‚ìÛJ‘œcwjÔÐ.¼ }ã¿øGìu+]u¼öÓd¹¹F¶iðÅ0¡7)'îŒðHÍs_õSÄž£¢jÚ•Ãè÷V“}¼]LJÛ„„¸9ëªàONôv ßSŽÔå²}NwÒãžÚÍœ˜c¸<ˆ¹àdß½XÖ¡ð—ô§ðV¥} µÍÛ¶¡~ø†ä\*±¶ÓÂX®<÷çú¥½®ªOŸz5+h؈nL^Yvb„œ}2kÓcÔÇÂÛK¦I¦k÷zåÙ’[©-…ż Ý‘p$Ëœû  õ°ø™ám[ñˆítN'–À_j!ݯ£R]Š‚IRÌ»`j·âj_ -ô i+¦jVZ “u{b—1]¼Ä³IðHNÃÃ&Ÿo#Gj¡@’3†V9ëÖ·¤5idk¨çe1³¨à(ì1ŒU¯xÇWðW‰-æÑ¦™ÍÑK{›8y0Ì-Ž ô¥ÔzØô›] á´¿'þǾ½ºÖbº•í4¹àC¦ÜΠ•U•`…ÇÊ¥y®wÁß|Sâÿ¯‡5WPÔôO̵º±–Ré ráI˜ñ¸ÛkV?ƒÚ_'-âM/ìÚ}Ë\¾™Ã@*fO((\`á½y¦i¿¥ñæµ>•{¤ésjé%¤ZŽ§Ç Ìlÿs.«–à7r:š¥÷ 0Ñ<§ü;¸½ñ.ŸâÍ'ųi–’K®˜“WlF «"(*@Èã Ò|aª|]±Õ¼5=¶›e}-·ÚmdÓ,a³I"¤Å¥s‚Ü4ßü<×~ëW:߉¬MŽ‹em(ºhä[ÀË´@6±ÎòÃ'°õË-oÃÚç…µý?Â~—@מÔHíöÉ.MÌÀËn9CŒ1;¶öÅ-ŒÑ|3©|2Ð5½SÄÚjM¦Þ*X¦—$Áã¼¶ðKFÙPsAÉã½y“ØšŒ²\Üjöñ”IY>QGåvƒ“‘“ŸJ‹WÒõO‹Ú>™â .lmu÷i÷{:Û¤å0Êéž3†Áû¹=iˆˆüuªü7]'Hðv¯sg¤-˜/¡ ûHNùsß+·'Å&½à©üzºgˆŽ¯¤i7º¥¢¼¶º•É…×)æ'ÊFÖÛž£“Å?X×-¾iš7†µé>&º·‰®§’ûsªNDq:‘ò€3pIª^2ðŽ·ã™¬üA éºž“ui¢ZÄÒ FAµ¡8èÄPöÔv5¼Qñ x[ƒÃ±húf­6²\êv‹4ò: ±Wa Ÿ” \—Ä­ö=Yõò³K¤ënm.§ ³«Û[¾T0À•ÔxžûÁ¶7V›â]6ÿR×-,àƒP¿³ºØ€ÿVP˜ª¤ägoã\oÄio¤ñE×Úµ¾Ú˜ÿÕ˜ ƒÞßtŽ;PöÔKts°ZÍ}.“V>!° I´òžRÉŽU÷wcˆ#­y^—­_xsP‡PÒïe±½ˆ“ÀÛY3Ôgé^£â‡úw‹u[MRûÅšg†õ=ZÞ+»‹ E%Þ$p`UH¾ði%1³#Çþ6ñ‰ñétûù¬"µxÒÂÞÎF˜VÑüJÃ\Öιð÷ÃZŸŒ¤ûgˆí´;»™b’çCòYš7|‰%ÎÐrO^™¨¼AñsTð_‰Nagiý›£²ZG£eÓ•‹ÛؤòFªzçÁÿëôÚŽž‚âÂõ–ñ.e¹A4qɆˡmÙ\úsŽ*¯ÜKȳqñ·]Ò¼[5™C‹ É·m1ãÄ@ì*PØïLÿ…1¨ÃâÆuÔ¬ãÓbº34¢é>×@ïÉ‹ïÇoZ–_ˆž‡ÇÍ?†mn„(?µËÈ&%0<Ò¹ H#8Çj“¾-Óþ ­É¶»Ÿo.š™…ü‡çq“yÛ´ç¯J˜z¾;ñ=·Šuû«Ëm>$y]ƒF0ò‚ÄîV9ë]‡¯àÕ>ë:&¥-·ˆG-ÕÄ,ï.¡l®K RHR¤©ÂŽ@ö¬ˆ  \íNöó<Ül/¸ò€àûÖ熯ìü?à[UÑg¼“Å%—d ¶Vìß3ÆÀäî!“ŒdŽsK¨tà½0ØøoÄ_ð“Å}cáÇ«/–Rg¹”1ÜvO@ÜVåö…¢|<Õ¦ð4š‘’[˜cÔâpJØŸ9>  ­¡ëš×Å-UÒ|A¬M=¥„qÝÁ©_Èω iÇ!\`£5bÒÑ~øj÷W²Ô´ÏÞßJ–‘½°3Û[¨ùÏšŽ bÈŸ^òûÃÔ©á˜äñï‚õxuíWìvz}Ä2Ûj÷¥¤X¤|«E˼àr6е3Åð¿Áms j–úÝÖ©wäKªÛÆÂ(£r!ÚàÍ’Ä‘Ót5(Õ5>¸Ó­íl­õ*hçKk"³†â7ʱp6®ðBàžHãµV‡Jo†¾Ôm¼U¥Åy&£qƒMiÁÛåîÝ/™§œ`žôuµÅÎ¥ñGÁm+ýš+ÝRÎĬ̓ c…Þ ¤jàôÝ2ëUÔ!ÓíbónîEe‚åA’@‰®ã_½·ñ¡ÒÆ—gixÍ{§C#Í!v_’RÄ–e‘þÏã^|¹ç·ö ×5,hõ_êZoƒ4-Ãî…·«ØÀï3ÉpËöO4î!CƒÉÎyW¶ƒ‚O|æ¯jzW‡î|7áÛêwÚf³%¡U[Kq3´±JŒ¼ø%Ô<;¤ju‡ˆô»kU°¶†Éí®üvõ|œ .î¼V/Äû›Ûï5ä?%…Ì1I`-w,i"xÆ1Œö­ÿxgGÕï¬/|Câ¼9«ÝÙC%Í©µirøÆæ ü¥€ûÔ>-øƒ­x+_þÈÐ.$Ó4Ý>(á‚>J $$ŽCgpúÕ>ä¡|I¢xnâòÍüK®]išãÙÄ׉oj%O0Ž2sÃ}þ•B|ä¯Ìã¨*Äg’ÍÒ¹}/Gº×o£²³D’áÁÚ¯" 8êÄ é>#ÙÏ}¬6»¼ÚN ‰5¼½V0W˜‰õRǵr!B%w|t@Iý*]Š[­â{ÃÞ½³Ñnô_Ïej‘\Ü]HèVNK"<¨Îî1ëX_âÔ¼[®&µgk5æyFÝ-!fKeÆÑ`ÛŒV—Œl<>ÿÙ_ÛºÕ®¼,b[‘io½Ùn9ÞÀì>µCÇ>#Ô|;­[Xè÷·]½´MeäÊFô+‘'I$Õ2úËAH¢ŽÍfŠ;ý:ö>Õ…y¸'÷€EÎÌ籨’ÔÕlywŽü=c£<3Y¡kiãóce$‡py>õå¾5->›Lì̃û‡CÈÿ=«Þ>&YÃ¥Xèzu¾&¶†! 1€HÎzþ•áÞ._ô(FÕ\;Œdðy5Q3’¹är¦ÅqèEjøq$iI¿Ýªú”JBŒ— WG5Ì”–vÀyÌ/rOaFÌͺuÍÜŠvç§RMtún‰¬j¤y6BfhùñŠë¿f/i~7ñÍ•–¨7Ù¤2\É<˰|±ç°$äû_wZivz}¢ÛZÙÛÛ[ ÂÅJª¦¬[ÚGJPŠWW>‡àŸãŒ-¼Yâ[øwÁZI1Üjó¯7ƒ“ 0e“¢ð¹Š×®ü8ñ—޼Lº†‰¢Éáÿ Yiéa¤[Ì¡d»]ÃÌ»qݜƋžs°òqšó}á´šëxƒâ©Œ5ëC‹}&=§HÓQƸI ÿqˆÿ-:×AðŸÆWþ!ø™}Èy¼½6Ýå¸cÕÉ;T€ì8 Ê«V×õùú4UŸ*þ¿¯»Ôô Že”ç¬üê…K'2?¦æþf£#ŠÑld3n:Ò`}iç¥ 1OpÆ”/µ =é˜ ŽMsÏjv9¥ ùPx¤=}ê`„Ó]qïô W" óÔÑ/"š5,+óÓeÕ"ŠP˜§Í@†ãéBàÓ±Šr®M0y©PsÅ"/OZ•‘H³£xm5]XÞÊ>Kh.{±?ášÊ°· ªj8‚]†¨të;¡ýõ㓤ÀËnò8ùårç4t½ã›ø–¸ðõ¯_ù éú_o\§ˆÀ>$÷þ•×üNñNÚžŸñ7Òÿô¾Þ¹ æñ:ž½˜®‡üú¿Ê$ËÏëÌýðÛàOM6ÛÿE-oVF<ááÿPëýµ¹\s (¢Q@Q@Q@Q@|×ÿð¾£âÏÙCÅ–ºe¤—·0Ëkrcˆe‚$èY±èIôžÕô¥r§[_…^3™Ø"G¢Þ»1èÎi=‹ƒ´‘üëêþÖlddŸN¸‡]Èy¬Ylnbùd‚T=·)¯^ñmíå¯ÄO ÙÏu£l IîmüòÈß3îÜG!ŠŒ~"©_i+=åú[ê¦úÒ4É . &X)à ã®ÒzéW¶§┹Qå,Ò «Î:‘KåQ\ `íÎO¥zŸ‚ÚÓÄ×Óéש7ÚIö+†Pc[€»£ê¬FÜñÙíUŸJº‚Úx5=&ÞÈ,‰•hÁi$9P ‚p9'¯jwfv]7[¦}Ê¡pÁ#Òµ.åsu¥È¸vŽÕv‚?»ž·Þ/Û;½3Sº6þ[ÙvŽ]œoUî# r3œ`eOmk¥èqÞ\iÖÒ[µ·Ø–kÅáÞáım<¸®p¥ ”‘Œ· ©Ú%ó­+ÊGã#¦•Ûƒð«y_cm =ˆf0ù‡/Î9o|ÛµD‹¹IÛîh1:¿„³_‰þ˜íÄzÅ›’zß§Zý–ÔË:ôûÊüdøu)¶ñ߆¥~ïTµ`牒¿hoFažw0Í-˜ºžOð«÷>øŠ9þ»¶éëmf¥qWˆeÜêKŒŽþõß|9O'Á_vãþFK†>àÚZW,bYK…Ç¡4£»7žÈϘFq¸tô9ǵS¿$À]xlp=jíÚàã9=fÝ+2œä®2ã´ì=º×É:}¯ö÷Äm©óç\àP ÏÕ¢¹OiÎVŠk4IÚcåàî&º='È×5 ˜ìàK[»Èå6§yØd 0~îî@ì ÕÉk×× ñNItÿ’ìÄ‹Žå û+ªÐ¬`k»²ï{ˆc–K[b¼;('hló€|TXƒ|2 0jð_[ʺkÚ•¹IF[ Ž[~]ë[ÃVÖ¶º%åæ•q4²­Ä)s$‹²Hbl€FBûTžÛ‡­eh:ŒúÔwºuíÌ“ÚÝÀIšRXBëó$™ô`û[¾² éêÏ ÚÜÏŸ"Ûþò2²á†1òðëŠב¯â+{?xZûO¼¾‹LžÛËš×Qº,Ѹ~$ˆÉçj¸ GzâõK»ÿ†¿ím-&·Ô­u{Ÿ´I8O6Ü<\(Rˆgõ÷«Zµ×Žü9¨XY¢.¡§]ùÂÀE¹ŒåOü HzéQ<Ïà†ƒGñ.šo#¾½–Ö2¶Æ„ Ú[#@<ñè({Ø»Üæõ:{+m2æáÑå¾µ%U²S,F¡ã8¬¡“À­MYîîá±¾¸R°ÜÀ<…+€‘© õÖ³€Á$`J»™3îßø&¿øÝþ“bGýñ5}_z k³1ùGöt£ya¯“àšÍÿŸˆ+ƒÄöÿß3×Ö÷«æk$ut€ëæÃFÉä×±âúè%UÎí\íÚ8™¹ã®s[—ñ4WW8fbpOëX3“±™”‘מõ`gÜFpI g…gLIúŒv­î¬ñƒÎxt|° lzŠ¢H.f6JýsÞ¸Š7¼5ªE´•ò¾ö}H®Þé÷Ì tÿóÏŠr§ü"×è3–N½ÏJÆ|³àR×Bñ\â{XÅÕÛ<6šŒ„æÒB «¨èy#žÝªß¼1­xgÄ7wþ™wi¢-¬ë©=Äl©,EH!XŒ,Wiõæ³üÚ|^2s|²Kt$o°p°‰ðvù™íœcç­OàÍ[Z×¼Ew¢ê×W3ÙÜC4wÑÜHJÛ¨å¤Á?Œ]k®÷K$ú³ýÁ¸8f„L€_»ßõ;Íx?P×Ç’iú¸šæ9šxu;[Æo,G†9ÏM½Aõag øf=KUðî»>¯¨ZÛæžÓìÏ $+HvÝŒþ¹íZZÅ/ø¯ÅE×îî®t½Aä´žÑP4+>Nà¡çð5‡áGø}5î¾ú¾‘¬ÃenêÖö3yÞa|&ÉQ”|¿7=Gª_x¬C¦kzÏÅ=TÒµ}S|–¢;È/o$Ûd6²6:ÜÜU…ü.ðUÌWQé~ Y¸+e…ͬ[# È:m”oã#ƒQØê2üLÐuIÐl4Ý\yw1Ã¥@"ûb©!‘†qŒg–š+ü?ðž©gãmñ"¼ž7²Ó™¼‰|ÕVÌÁ¹Â€Àü^ØÍ'¾¥l´<ÿM•!¾Žâ[D¼†=´¹Ù"ŽªØ àôà×{ã]+YñóéÖ‡¤O6ÖqÚÛÚØ#:Ù4|<#©å‡qaðCÆúWŒàÖMÜ:,Wkÿ„†@<±wyÉ •ìGSŠ~‡âßøšå<7áwÒµÙÄé§ÞÍ|ÒÃæ•;O–ßtžÄ ¬[}[Æü\f¹iç¾›Po: ™¾Ë*1!²ÊcØ*Ûд_i¾'{ÏjÚ–µ­Z´ÒÙé:zG ’¨b›dÁO çš¡Éx J ~ê ^¸´™mfS7Q¶"9nˆ6Ü{âµ´H¼=¡hÚÞ³áMOQ¼×l­ÃF·–ë[ÆÍµåBî Ø`j¿…|qâjáíkU¼¿Òo£”Ê’9e·`¥„Ø'¤ ŸN*÷„4_‡gQñ<ú¾™¯ ;GHlläÉ'È<àȸŒgž¹àQø‰â-{⾪h¾!ÖÞ{[HÖúKQrÑÙ¸`§srv°l9¼âX~Éxð£Ç>Ö(NQ»d{w¯S·×¥ø»áíG@Òü?¥hÚâ2]Ãj°-úƒµÑýÔ0#85år[½…Ô°ÜFVHØ£ Â3Ó­îz„ðÚü,ðe†»¤éþ$Ô5+–¼ŽÚ[ƒ$Ñ( •hÛ–cמ0*Ÿ‰t»ßˆÚ&‡}ám Í•²Im6‘¦ÆÒ‹ICnÝ݈pÀî<ðkCEÑ4#áÜ ñ=Jξs¦[ÚÆíA@]ˆqþ¬œuêzVwŽu8´? xkþ9îm|?"ÌÂíœ$òÜîÉvã ¸˜¡Xz–µ8´-Ã:›ã{-NMj_ÊKR)-­Ù·"JNæê@ãõ¬ß‰:ÍÞ•y£.‹sq§ø|iѶš`œ‚Pœ¹ËïÝš¹y¤ØxÃÃZ¯âO V–'‚9g¶iä(ØIc®yÎZñ7u?†‰aá Ý¡Ó-í–fºxC Ö“çó0s…ä€(ó ñ7†t nãK¾×|Gÿö¿{e ·ÖfeB0°a´²…cœòk˜ø­ÞÿjI òt½)¼‹kU ª€ß‘Ô°ÁÝÞºý{áVµñ:koè¯jbÕ-Òi¡¿ºH$I±µÂ†À)‘‘ŽÝ«—ø«ÙBÖÞΓÙ¶«´¬÷%T[Ø㎔S›ðî¹'…õ{}E,¬µEaö}Bšc•™iªA.±c6¡§`ù–ðMå;qÁ Ûšëþ)]j—~,[Û%œio i†Ð1Dƒh؃n`QK úš¾ ×¼%§ø† gCmfòÊ8mï58î ’ ŽÑò°ï׉âý;Äq|BšæÙ.ng–é$²º¶¼§S†‹i`£°k¥ñ&á Ï ñN±w¤k’¬P·²·Y`7‚ùʓ߃‚Mdø—â_‰ü9âû»+;Ë­;O²ŸÉ‡KŠC冨÷.9êsTÑ75u=ÀSxõã¼Ô®âÔé ö°Â¦É§$nA&wÝÁ8=Mb\|Jñoü'W sus$¯xÐK¤îýÛ)m¦ §€1Àü jê ,îü^ü$}ŒS ßN–V7£åpinp9ô¨¦øÈóx®C>‘`,LþQ—ìŠ.ã@6dIÛÀïÖ¼…¿™Çøãö^×n-¬u¯ ÞØŽ2KB7#aˆäq]7ƒ­âðg…5/K-Ž¡qs²´±Ž]ævùžâ21«€A-žÕÉø¿Âz„õy­µ‹I†óW<73èq]oÃýi¾×µ¿Asmák‹1F©Ô%Ý”X˜ð •$·8éÞ–Ì®…«=nóâ·‡/ô ;G²°Õb)y:M²[­â§ÊÂ@0 À©÷>´ÝÃ’ü7Ñ5kè’ý†í£‚à´R\¸92+)ùB7ÉlzÔ ¨h àhø>ÇP°¿P¾7—Bi ǘöªàÆî½ª§ƒ"$ð¶¹½zöÚ»E"êN¦g‚rp#våÎW#¦iú‹bÖ³¨éºÇ¯‡„t©4[x¯Kû3;Ï+©\FáÏ%ÈÇbÞõ[ÃVwÞÔ[Ä×7ZZ^Æ,ncŒÉ7Ÿ·÷ªªp íÛ»‘‚EiA¨Zü;ðmæ¡áVmGP»ºŽÞ}U`ò ¤`nXÂî',À’ßì€;Ô)©k?¼=4®£Ô4¹­ï/¤ÄÑ¿ÊѳtÈ#púŸZWÔç³ð¯£ êÝ¥õÛG}¨<^L©µ~HväáH,Ú?JátÝJëJÔ"¿³™ ¼·q$S.2¬:]ýÅŒ¿ ¼)òÝÇiVÙmh‚ŽŠ8Çj—[Ô|7¦G¤i¾$Ò®uNÎÍ"¸žÒèÀÑõ"3ÁÜT2}+/â&¥s¥ßé+¥ÝÍk¡ý…M0ÊW1Ÿ¼N?‹plûÖLj<9¤ëɤêZïˆaðæ±{e“Á5³M¿ !*FÒÊàþtwÐÅøŸ}s7ˆ ¹²iaÒÖìÓà«Pñü@‚½;â-­¤‰g}{xÃÄ÷D×¶‰ØÜn-Ÿ¿ÂäcÖµ¼Wñ Yðf¡m è·ÓIÓ­âŽ$dV[‘þsqÎâÄÛ5ã½"K¶ƒÄjñÇ©\5³¸£wa:ìÈÈ>â˜#ŸÐô¸µ­N )õm.'ý*ï>Zqžp ç¥z'‹~"_x;RÃú2Ûÿgé±Gû›uÜ0Œ™<€KcµyÞ‰ j>(ÔcÓ´›oïÖF]‚‚XãØO°®ÿÅš‡‡´[û='\Ñ›[Ôl-£·ºº†é¡mÀ}ÎhÀÉô©Cd~'ð>·ã«è¼C¦Åðj¤þT÷iÆßu—0%r2ÈÁ¥ñˆtêhú†‡iâk:Ù-%½¹‘Ão_áR¤eW Îx¬?‰Ýßø•¯aYM–ÞÅ B ÆF:c}EmëÚg…î.,_Äz¦¡§k²ZF׫gn²¦üp[$Åqžµ]ì-Ò3> iš¾½®ÿk[ZÝê67Ç-¬¶öìʈF|£ AcÚ¶ô¾/´C£hwœ¦-iì×tcæ-?»2gî¶ÞÝÆ+CÄÞ*ºðe妠\¬m-ЉÂö–`Éß‚}ø¬¿ØÝköV¾$eXÅÌj&I$Ã3‚T²©ä‚A>”ÍiÖ°ÞÞÛÁqv–0HÛ^æE,±R$}+¶ñgˆ&ðŸØô-u{xRCp#âéÝAi=Aìpö6ä6–±™®%m±  n>œñ]ö¼Ú7…—£ëoöÝý­¸7%.L~K7Ì" ½vç“ë*QOtPÔ4]Oljaª@°$²ÇåH.&H”;w)r׌³ªKgà; 7I»°³Öµ¦âè\$Q9„{c$N+;Ç—'Y“M¼Óí| Û¶µ€ÁI „ú眞¹Í\½Ó4Øü?¡ÂEuqk|ð³F-¢ „·îüÀ}²G|ëO¯˜—AÊ"ÂÙƒ`É;·Éëš|öš?‚t¨ê¬dŽÃ©õ­ƒ²*6´Xíbmžßy³þphêRÔõï xv}Å:N™ ¢Ùïäû1£,Qv36Fzü¸í^Ÿ?Àk‹Kvòµû)‡s"•#CÅrßbß¼'ݵ®¥Ýœ’qm)Ïùþ•럣±ƒö†ð΋ Qý’m*gž%û’JÆB¬}HØ9¬›|ÌÙ-/cÃ|cá;ï ÜÃoss´ŠY$;^mãxž• &'§?tŽÝ¿úõôǸ#·Ö4݇¤,é›Ö¾}ø:ÿc P8“$òHùOsÛ5q1—‘æÓÜ(¹Ž0®¤ŸÆ®]ÚKvÒùH\ƒ»šÀ™÷!=y×ÒŸ±‚4O‰ž1ŸOÕ.aK¨£-´ÎÌÊgïc¸÷éCzhL3±SöTñµ¯‡>#i“^J"ˆ†^ 9Æ P9b§¨ä®ìp+ôM"[ˆ–kI¡Ô,ߘî¬äC õV_äpGp |7ûYþ̺_ÃmsûgÁœwVr×Ib&‚Níªûg"²þüZ} î4ÖîD|€Ï“ø°äþt­}Gä}÷ùmÛ©6öiö‰› Uuúœ©®/áÔ›´+Ä +.©0p£6Èò1]•ñ‹ÂïÂýBÒhÞOq ò„© S“‚äçÖ¹¿ÞÛ]®¾-¯m¯YuëÂÒ[J®¬ \0Áè{VRO–íŤìŽÀ/ËœSOµ8ýÚ àæ¬Îãâ¬h‹Ÿøw+»µ—_úøŽ ~jÖ€¤øŸÃÜà^ÈgþÞÿJRÑdŒç8žë¿úLÿú9ê'”±Ú£qô©-즽¸¸TRíÞŸ½jÕ²²Tº[;QÔ[¤Q.ì{œt¡lC(Ã¥…λqcžM-þ¥–‘&¡=Äz.‡!õ …$È@åbAÌì½;•×-⯉ún¨É¤hömãÿŸ– +O̶p6yÞÈs)^áHAÝúŠãÏ€çÕµ…ñÄýQ|câ%`Р“þ%zrç"7Ù&ü²Œr_‘ZYGëü¿­•ÕÞß×ßùy„ž5ñ?Å[+ˆ<æøÀR3AyâÝAwßêCø£A眤d(Ïï$5kBÑt¿é2é>²k yÀK»ù˜=õÿßJù}#L ÀàžkOXÕ¤»as:¬q Ž5ÀT ‘ *ŽTcÚºü$×¾"ɈåÒt‡é.1<ëþÈþïúŠÎS¶ÿ×õÜÑE½õýv#ð¿†c×t»ÊéPx›¥–2GV#§ÿZ½Ã?­þxnïÄ2HYïæw…\a–ÂûЕ]ß{7„>øwánˆ¥–œòXûŸâ?¥yÏÅO‰ð–±Y¡[D?{<±õ¬”õ{ä©®Xîy¨$¨=}hd#&žÀàsÖ‘þàýk Ä‡ Ž âŒÒcŸzc¸ÜcåZP¿­=WŽ”Âãöž‹¸Ó¶àäR¨Àõ¤!Ž;sHGT»H?Jo–1L€Å\‡No±=é'jðVe zÕÛ^ðò˜›1 R õ¦NÅ®¢Ç‡EaÐŒÔxãòªú4žv› õãwm±Δà S‚çµ=W9ÔsÅL«ùR"Ô¨™ hB™#ƒÚ¦¨P«ÍJÎ3âµÿ°¾—ÿ¥öõÇë¼ø zˆ®Çâ‡>´ÇOí}/ÿNõÇë#>)?縭åüêÿ(˜ÿËÏëÌý ðbíð~„=, ù kf²|$»|+£ÚÊÿŽ Ö®¹îQE (¢€ (¢€ (¢€ (¢€ òÚêöm;ögø<ƽz¼{ö¿–¿f_ˆ¢á¶Ç&•$ ÿ¶ä"Å™E'±tþ5ê~!x‡RÓü)ñ@¼¾¶Ù^D#¹e_¹RéþÐ>•*øoVðв² Æv–-Ièg‰ND ô*Ë‚Aõ Õ/‹gÅJ»eºtVðHÇ8@vÝô/ÏÒŸ¤]\é>+U»¶OÓCudÿ2È7$dzœ{`×IÃ=^¤¾¶³ÕäÔàÒ­ ¦£%¤¯gI•,æDôb¡‚\ «à[ÅeÕ-n‰m:â×29šV ‰Ÿâ Ô;Õ«*ÒÓP¼›KÔ ð³†[ˆ#1”„ãÐ9¦—ÛkmÓ¯eP×Q‚àáBN„:n?Ýl9é»=©ìGc®Ûtš\·0I$a$XÞT[ÆŒ× Ì¡r Æïq\õõœ~1ðt¶wr¢j0ÛǨ[ÝNáUØ’²!$÷þéënóÅi éW•VŠX¾Çñ¾§š=:USîûbÿÙé±nÒ<·JÖÇÄöw¬¾pi˜¿Þ ~oç^…¢§öv«–Ò°çGBD›S,8õÀçñ¯:Ñ.­ôÿé²ÝdÛ‰@rJ‚q;‘^™n—:>£kµÕ¥³±œÑºŒåb¬;{â¦=Fõeå<[s¨i¯­åüöi bQó„nÀ6 çÔŠÔð×Ú<1§^E©ÙI{-žÚ`P»—R˜=а ‘Ó‹¡Ãcz5!¦C,‡Ù¤’Ò)p8å•8Îí›±œô­/O Æ™yÖÙmš55†ãŠêÉ"ó×#n;†"“^E'w«+kÐÛÏà­j])ášÚüI^Mòyg!YHåÝ×ê*=3TÓ5¿ƒ—ZwŠ&’Ð[j >—¨*o—$bX¹ä©#Я¹«WÒÜøS@×5½ ù渖õm®æ‰ }˜X+OR¤ÓŠÏYeø§ðÖñ/]"Ö´›°ð]JÂ8æŽAó#™ ?ªÅ-ÎoYÔ›RƒOÚ£ìVðy­À,-ïÏ5’ #Þ¶µÛËuÓ´}:ÝWnŸŠIP ³I¼åxtÁ¬Vl‘Æ=(·s7Øû§þ ¨ÿ迆ŽÀç׋ŠúßV½ŠÇTi&}‹%£Ä„ÿxÉÇ䦾@ÿ‚k>é<~€‹duë8¯­¼PJjy<AúVr—,[ER\ÓQ<ßYM·ssótǽs—KµÁn޽kj—žs² çàóŒVuÒ’ŠXfµ‹º¸¤¬Ú0ç“nUs‚ˆô¬»æVÛ€=Íh_(Y’Þ£úŠÉžEC‚Ä·§h‚¨)—ÊçŒñßÒ¼ëâ€I<)©ìNüwýkÐæ*¨J°^>éô¯=ø¨Û|-ªbØBqøŠ]G¡ò…4»MgÅÛ/o3Â[kGCþ”àçË Ÿ—8zô­â»ã­NãÃúœÛìõD’ GV¶l§#¢‚G¦k ÃÚ$¾!ñ9hm"²”\ÈÅöÊê$ þ&ã õ®‡Iñ¥‹õ«ëôm;C»Ôaš]BÒ-’ |¡û|Ý ÷¤j¶"Ó¼+qðÞËQÖµ #Z´k³‹K;Ÿ´G;9À‚ c<÷]ZOˆþ¼±ðþƒm§_[M̶hl\¦6çæ=TœãÞ¢ð׆5?&«wâ-2âÓEkF†â)ß´–#b!õÏ!‡LSo.4» j/áÛ2³Dשs7*Å‚«(nãÈÇ¥ h2Üv~ð¤ZoŽt½@Loš[;(ŸÈ¸v#À¬Bà`ò3XÞ7–‘Žg‹Ã’[–·I,_wï¤ †Ç8éŒUí*ÖÃ^ðŠÉâNçK[k–ŽÆímüù%ÈËÆT²ü €sž2jjrx@²ðþ‘z÷ZÊ}©î l[©7`¹8ÚF1O ÿ†üK}àýB-OM¹0]¡ÚBÿ¼§ØŽ+Ñ®¾&¥âØïíµí6Ò ¹RôéÒ\°¿€0cWæ`Ižy¿‡u%Ð5ulmuâlk¥Ü­ïQØú×yuðËÅzÇ‹#ñ“ks6™ur—–ú± ‘ˆ}ÍÎFÜàñÚ§ uv-XüN³ñŠn-›Ãú^—.¡æÚŪÁnÔNàª37©$n8Ï&©øoáþ¹àMFïQñN“%®†–’‹¡#K¥ mJ±ä’¤ØÍ^±×<ªxÖa¦èÓZëSM(³Ôï6ípAæ"0¹csšæ| üºõõž²— ¦Ëm2ê_iÜHKŒÿ°R=M>º†×±ªº–‰¨x[]ÁšMö“¨ãk˜gºûKÉn-å §nzäsT|>!Ô|ªÛøžâîÛN·¹ì®„~l©pTîUˆùYqžxàûUý>MÁún¯¬ø3ZÔ5 JR?:æÕmeµG|4‹µÛ=ÏϽE«ª|VðåúëúØZ[¤Ö×ú‹Œ*Ñ3I'L`ÎÄF÷‰ —f·‘‚É?—¿bž­·©ãœW¤ë~:Õ~Á¥h¾Ô ifÑn~Øb\_3’L»NváÛž1Ï5æ–Ñ»\‹u1ï‘„aäl*’q’{zô½S^¶øu¦é>Ô4-Å70Dn$šøcŒHÛ‚BèÃ)Ær &¤}Gkÿõ/ˆZ¯ˆ,ï4ËOíˆ#¸’Þúõ –9ÚÄ#uRT•Ç®*Õ÷Ľ&ÇÇ) LJôûñi ]#O‚ï´9–A(E†ÞƒNñ†’5KËÛ·¸¶ÓZà¯Ùc+J²FÄeŽ8ç¥eøÖ)üI£x~ïÃzmÔZ0ÉY[îí¦ ™7°É;²'·Ò—Aõ4¶Ñü;®è6þ!Ô´ÛAó¼ì­ f/å+#a‚‚N}¸¬è:þ¡âTÕt»+ËÛ+¤Šk ›H£T*6&@•Æö­JÛÂòhºñlúµž¿öLHlcFÌ;”d Îý¿¦*·ük­øcÄÉi¤_M¦é0C°‚ÚcåÉÀQÏ©aœû’)±-ÌïŠ-£·ˆ¦k‘5<ÿÄÀ)SlgÚ7˜€»vAÏ=*‡´½[×à·×µ l b‚0‘1`<¶bFÀGñsJ¹ñ@²Òµ?´Û^Â&¼yôÀ̳vUb¬O–8ÇNõCÁž“ƺÜV+{i§… Åî$ØÌ»€"1ƒ½ùÈ^ø¥×a­·:Ø>)xžµœ¦g´–èÙ6ùV"vyJ;`tüêÖ“ðÆ/ ø¢MDxƒL¿²ÒK£Ã}©Äy*›Hž œ Ô°|Y°6òΦÃmöƒnº£[§F§äê_½Tð¯Ã/xcÇ6ºæŸ=…ÃOqªM{sä³pC€F]ÔïÜD:%ñ¥íΉ¤iWš¥»ÛÁucl°H[•€É ŒÜ‘šO ø'[ð0Õ5_i7:Øä·™eÆÛ¢ÿ*ƤÎâGL{ÕXð­ÅÝøðƃ{câ&µ˜YË=ç62J&ÐU¶îÛÉÅaü:Yõ+bÃTšTÑ^ÂV½yŽZ0RE üa±€1œ‘š;\:2äWZ=ÿ„µÕð®w§_¢G%ÒÍ8•žØ7Ͱõb¤ã¨úWŸ¦LÄÈH=ËuÍzvŸàV×¼®Ük:¤he³û<–1»`ÈæÉ'jç¶O­y¤³Ë¨ÝI5ĆIdbîìyby$ÒsÑ-läñ×û{ïkqiÆÂõ­lµ íÒÑ3EÇ$) Î*kŸß|)Ð4»= îÞú;ò÷RêW›Ø;B*¸ÀÛŽxÎM2xu¯Œ^°kHaûv+[=¼[-áhÙAWáwü¤^µbëÈøiá ?Eñ>‹o®^]Î÷Ée4ä-šp¹ rÍ·‘’Çza±µáýgâæ¦xŽÔÛ‹£´¹†y£µˆ2þу^ŽÏk}ƒh‘!Ü|¥˜:Ÿ˜/Ob3O}t)üCÒõjš~¯¤Ø]ßiÙÂ,VÎql mòNÜáƒë‚zÔ_§Ó%¼¶¤ßð•$1&©$e~ÌÒÀ /PãqÎ Í3Æž*Õ|=ªÙ[èÚ…Ö›£ÅiÓÄ3¯Þ}ImÙ÷ÍEñ'M³3ÙêÂä[êz…¼Wš[)ߌ¹/»¦óŽ£4»‚ès:¶Ÿ}«[C¬jéºsdIusF1ÆrçŸzõüS×¼ «Cáï]gè–Ð,ªŽ.FÐÞin~ösí^]¢h³ø—VµÓ­åµ·–bUd»”EÀ'æcÒ½Ç*Ò¼1©Ùxytmtkxíe¼¾ d’@2ûHÆ'HºçÃFñ¦¼š®³¦éŸÚ¢;—³ÕnJ\DÎn Ã9#œ‘K©üT·ÐBz ‡‚zq[¾§àhüa kº}Þ¡ —·vó¬vÒH ,€ËsÈ$f«ÐFf«ðÇÅ—~-}KO·žöÖk¡=¾®¸ ´Ê䑌Œv®Ž_øüBÞt‰gÖàÛ©›€,^ã yM›¹ãJáüK©xŠÃâ4ìUÔØ6ñÂXÆëŸÝì •Æ=t3øGÁ·Þ8‘»$N÷;Ž—±*ïÁò’\ŒÄŒ•àqÍêyï‰cÔb×oÓSó>Ú'4¿BÛŽHö®»á­«øšÇÄ-ýà·Ð#´S^M–[V]W#’Nܹ®wÆ~*Õ†Ô:fðÃúž¿á[ø›Q>]¨º´·xÅŠ±Éf žX¨ÿRµ×uÿŒº§§jWè×Z—w ÌøŠ¥¶2ÈÃŽà‚} Wðö‰sðëHÕu}vÎÞúÊt[8ôó0’—'wÎQ²‘Ïz–ï]ƒÆþÔôÿ øn×ÃóÆñ\\Øi¦YZõAØ1½™¾RÙÚ8ç¦hA¸Èti¾øböëVNÕÿµ †Æ9Öâ“æHTà0ΜÎj¼×3|Aða°ÐtH­.lnüù´í66fdCÉb³Lðæ”º?„5Áâ»[ËM2i¢Ž ® êI-qÐ.A$ U™µk À7³ø-¯aÞ¤w÷÷R(º‰pLh¥ÂœžäQÐ:ù”í´/øEürž.°¾µIîXØ:4 Áå‡  ñÎ=k‹ÓE—öŒ"øÜ ?xó¾<ÝöçŒýk³²‘¼uáK‰¼E­Y,f×Q¼ )”%¡ã“Œ) ÝÖ¸Í6Íou-^î8æq\ÏŸ. OÞlp=… [ï|Qu¢[øzÏ×—vK!%œ‹6Ç™Éýã¾Üe÷pxâ¦Ö¼?oâË VÖõ»_êwvcy¾ÛíJ¤ªMòôÜ1ÔsŒÖ§ˆé?‡4Ë];Z-jn®/îíüè¦21 ø .3×ñ¬Ïxo\ø«%ˆ´‹q{çÛ$S[ #‹È‘>Rˆ¬W+ÀÆ3éC¾Ä’x§ÆW¿®-|7 Mšm¬Èf¹…%NÀ1œ)$à ‹ÄÞ Ö> ›OéæSP·¤Šîæ8]ekFäÊðGÓ¼G{£xFÛMðþ½¢Ã¯ê¶Vá..̈mÉ;„(U€;AÆyïŠÉø”·Úέi¨XÚ¿ö4¶‘µŠY#4pEŒy|gƒži½µäjx›ÄZ?†®,4+íËÄ“évËm5äîêÌÙÜT#*2@ö®oâ µÝÞ­ý°!•ô»ÔW´Ÿf# ¸à Œ{W[â-'Â×é2ø³R¼Ò5é,bó×O„J¤ …if#ç·Jç¾(êw)¯eÄc£ÚÁÙY‰7'’PBX“êM.…#ŠYZ7dqÎä8#ñ¯NñW†t[‹>ã_ñ Ñõ›«H亅- ø;FŽá†#Zà4=z÷Ô:ŽŸ*Åu°Ve 0F úƒ^…â‡zïŽnWÄÖž[&£ O"^Üä†Úªädz]÷3ü[âÝcÂ:ÒiU̶:uŒH¶ÉÆ%B \îÎjOx.o\[ëV÷º~.£ sIe¨\ùR ù™Aä=G9æ¦ñ>¿¥xOW‡F—H±ñ1Ó`ŽÚ[ËÀK;– Aû œ ö³üw k¾.×.5ë->÷UÓ¯&Š{kvdˆ/…ÚAéÇOÌ”»!ñ¥¯…õ }M×bÓ Ksu©Û‰F$‚y 3ÀéŠÌñ_…5Ïêë«éö7:¦¥O ƹ*ÆÌvÚF¶+WÅÑxwN¼µ²ñ<²ø†Þá½–ÂUDFQ¬9`JÁø‹«_ÙøÂHÚ} Š6²ŠÝÊÆ #äÛŽ¼RèpN'µ&TtGUã¯ê_‰Z *êm7N·Š5´X¨h¶‚ú“ÔÓõï'ˆ$³Õ®5K=.þþšk{¢ÊK縆ŸZ¿âïÚøcT‹D³ÒtÝR 65ç¿·óZW’ ržÒ³%¹ð“鶺’ÖÂq$w‘¯v[–•ºõ9g€¢ç@½ñõ¥ž³.£imy2²Jú”Æ11CêH9ÏO¨5&µyaàûK- ÷KµÖ¯`‰šæYd$Dîs²6SÑF9ç''¥føÀÜø‰4Ûûw}?ìâ(­mÑ™mœøÎI9=sžôßbWs_SÖâð6‘¦è‰ie¬Ìª×7y–%‘ÿ†,ÿr1’Iôª~"MCÆÚ™©XÚ!¶ i%•¤-¹_˜mQÑH9úæ¬_iºfá}/=äwÒFòÁ _6v? 7¯,zÕ?ë c¤èÖÚ·Ú2£¿ëÛ4{( \f¨ÈˆŽ{ ×ðf.£âÍÊO0[ê×R ¶8äVsøk,€GµhhððÖ¥ ÄˆÑ‚HÞˆÄ)8Ç8ÍWV*-'sÄž3Ðü >¡â]Y4}0Ü\E6àI{~ë+nÇ‘ÀîìBŽçÝr$æMCU@z(ùZa‘Ôì„´G=o‰|!à4ñÕωìm¯üA©HY¡[—Ͱ±,æFò-Èç.Ìß9* «ëz¼·O-ö¥tÒHßzi›$úð©K—oëü¿?@Óúþµü½Jz-†‘à½.}/ÂÚwöU¤Ã7Nþmíï¼óà?Ø]¨?»Þ µ[½_Q]7F²}ORn‘F>T÷sØ ê<ð¿^ø“4F$—LÑä'ý ¯ïç®Åì=ÉÜt¯¨ü ð»Ãÿ tU&(mÔœgs;z»Xûp£Ó½bå}|½dy—¿٩b–WÄ’¦£z0Ã+ûˆ}‘ˆÿ´xÿz½s]ñ¦àk‚Ól—X ä’=}•r^:ø»æ£ÙéŸ* ©aÞ¼žîæké̳»;ŸST¡gyæÞ‘Ѿ+ñ¦¡âIÙ§™„yá3Ås 1lš–\y™ôý)þ5¡ Xn29¦ãò©x¤ÛøPl ´›985&Ú]¾ÔÀŒ.G©§"Ÿ­8­8.Ñ@ ‘ëNŠx\v§(-´…jm¼ô¤Ù@Ú¥ÜznŸuy)"+x^g#²ª–? ®CJ¾šãÂÖÈ[æäfÃS]'´Ùõo k–6Ä,÷V3Á0Í(?­gèzÂøz9n2Í!ÜIï€0iI솺G†W:,õçùÖ _j©áø¼½"ë“úšÐÇFµ8-<-8/µ ^*eJj©úTª)€¡iåxãš@Ô¨ Œži08¯Š(Ãvœqý±¥éÂÞ¸½Xâ³èHþuÜüSðݯý†4®¿ö·®*üñqÈãpøõtKøõ’#þ^}ß©úáÅÛáí,zZÄ?ñÁZ5[L¶k-6ÒÝÈ/I+Ó ÅY®±…Q@‚Š( Š( Š( Š( ¾fý½u–ÿ…eáï G++ø‡]·†X×£Áe|ú€ËôÍ|+ÿñq´ñ>“kÂ.ƒáOXßÜI0òb?ƒEÇÖ‚ã½ÏÉ_ÂyñJöç!QÕ$dÖ“åðÀ®ïE×ã‡ÅP¶±­aç›kªÄq«l1Þ£$Ü^>†gÔ­Ïæ ™æ½…õ{mkÅQ]ÞÛÇ ’Ì‚[…m±³€©æ2ýṈêrqÍt®§ž·DÃ:‡…µ¶>lRÃ`ï*ÞÃ"º3c‚3Î Káeª›ûkk?"ùà2ArÂEL;Ä ôf@Ø÷ÀïTü-{s£xÆ?µ[¥ÌË4–÷¶²}ÉQ²²¡ö žG±cKÒìྺ›BÔ./ ¬M<[áòäE—àœì\±ÇeÍ!uº5f¿°hõØÜ[¦½gâ7Qºwƒz-½ÄÎXÅ A"1=Õˆe=q¸ÕÇøV[ÿ‡º6»ªôW‹mƒ a•\çÛŒp 6¾ñ®…a¦»øÇ[¼¸óoon]UHÉ( eÉõɵˀ?ZÖU»ñ‡Û^šÝm,Òaopácà<œ}y¬ÿ(‚NI¡o©›¹sI¥í©`v‰QˆüGJý¶a¸1$çžÕø…fÀMXèköêÚmöp?]ñ«qîGRzœŸ†â+£xÁGFÔ 9íþ¯,ÔStŒ8$ûשèso´ñœþîïvL§å^Oç»NÛ—žœjksyl3p‰;qƒŒÖF³ºeùwÊä7SŽ•§v”©ÏB:Ö~¦É¾«¹ûµfW±òíA;@–váó¹Ù˜@úàtW6_Þ\hI§^é—ª÷ZE¶YeÆEÉ$ínì Z öwñTšÍ¼Ë Ü2QÄÙÊ4{‡ÞŽ ªº†œ– /uÍ7Ù¡¾Hu9dqöˆËåœÂ‘Ü{Š×.7Z~±kg¦hº%‚+.¥Oöäl†ŽRçä ô žõŒãŽ1ïÞµo´ÁaáOÝM#=õòI3†ÇÜÝ…>¤žzÖP<÷¤ôÓ¡“>Ýÿ‚jnü~:Ÿ"ÌñþôÕõ¿‹Hºyižkäø&Ì¥5_Ä&ÖÌãpòsú××>2R—vp[ÍÎ3Ö³©ð?Cjĩ㳇k›— 9'=ù5^yÊÆP±'óéL»¹1ÉvŸ2¨‘8ÏsYó]ø96šÖ &kÞ~¤w¬Î£Œú†ëX—¹ÀÜÝ ^”»Fìç$·¥eÝ¿ äóÖµ1êf]±\Ÿ¦zWñ6á“ÂÚˆ“9'ŸÊ»é€’7ÜyÆô5ço_ª®vDOZ”õ+cåÿé:޽â«uÒáužÚág–è}ØS#.Þ€W]c­xNûÄןØEŦ·1œYO,û yXLeIíÎk‰Òî/`ñ=«i $š‡ÚW¨Ê6H[Ø÷ÏßXx[Á¶ž&¹ŸFÕfÔukO>X´vŒ¼ÔV ,½ÈN(êj•ÑËx,ÜÞK«iúì—Qèíhív÷!‰·e £¨oâ Àg8­ {‹/膫á VçQºy"‚KÉ-ü™-#<ò¹#æ`sÛÞ£Ð|]«üBkÝ\Ôæž ¨’âcòÛH§pw=vpAúÓ´«AðßHÔõCu¦k­q²Í-£{s“»t”Œpzä>(îþ+øjK½SXµ³Ô´ÉÄKy¨ÊÉÄrv’|Ê@#NOJËñÿÂ)áËOË–¡<¥îMò¯˜3<—=ŽÎH©¥^–=G➆±hš%¥¬ÚkïžËMaYCð$ÇpÆ1ïÀ¨5¸bð´}zÅä×Qækt2{É_¼†!ON óGæ- ¾o~“ës_iÃ"H¡“Ëlž„n¸ï]f¼Þ!µøˆ.4常F¸ì HþDœy@›vàõ®GC·Óï5¢Õ¯'±ÓØ‘$Öñ‰N8ùI¯å]þ±ñ;Å>ñcèúuýžjñC—™†x8wŽr:æ¥hƒ©~- Á1xÖYôÝNâçVŠy&H{QöV˜ÁMÇ* #œb²ü3ãßøöþ_ëš­åæ™} ÈRY¥£mÜ%Ç`¥FG¥\ÿ…cieâ™/à×ôö··¹7'LI_í¨ßåmÛ‚ÃÈ5“ñøÏR»Ñÿ±ô½2]Z)-á½²´XæYæMÌH$`Ÿ|ÓÛÈ7£èð­-õ~=_GñÇÙ– &i£&Bï‘Ð ¼t9ÉÅW—Ÿ4;û; ?MÓ/ìÝoÖÆ8í!¹î“Ž:ð{dg½;@ð†¥ðõ/õé,š4¶Íٙ׌HÚ‘Ž0FsÔ`U[Ë­?^ðÍü^Ñ%ÒæŽhÞêÙ'’æi¢9©9;U±=rh[Sˆµäºë Ëq#yiu,xù¯F¸@Ð4=#LñΙªÜêðFû"±¸[y-a/•I#dçqŒf¼ÚFgr޾kÑ—¢ø“ÃzïŠ5ù4-KÊxc“ì†àÜ@¬|·|0 䕜€=)n‡Ô¥ñ UÔ4ßÙK¤Ï=¦’-`m/ìîÁ|¬ 8/»;½ó]«à¯ jÞ.ˆjñÓµ‹§€ÝèñÚ—V‚ïE—p X“ÔpN=꿉~!kŸîít ÷ËÑ-­bxL‘«-Úºï2s÷²}ÇJ[ï…w¾'ñ­¶¡ago©4WfÞêñRê/0 !å\c¯^BüÅñkÄŠFÔ%”hÏrÖÙÊŸ5º±1á;†\ç¯8÷¥Ñþ^ü<ÖλsªiW¶zbË+%•ÚË#àñõPÙÏ(ø™¥_xÁ¢“úe©’á MhD~ר•ˆ!Xç“‘T<;ð÷Å^ñêºÞ‹um£Ã½¯nîPˆ'„ƒ¸nÏÌp=sK¨tÐá5}F=_Q’âßO·ÓR\£Ú‚#SìJí7&·ðêKi·×–·1>©o<Ït6•Y€€ ¨ÍqºäúdÚ¤Òh¶÷v$þê+™¼Ù{¶*ì¬uxü%àYµ j‰ª\MZ¥Ó–Ü<£7ñ~„6\Ò,ôÉ< xêmJÆïÙtö¶Œ5ØGš6¿ü³ÎÓ\ã½3Äþ"“ÁZ.‰ƒ5Këmu’_·nò¥ž}ØuQ´mô"ŸMñCÁ1\kº¼vºeÙ†WPcåÎ’ Æ"@ÎT€sއš}î¹?Â}KÓtó¦ëf÷̽’îkqqlÙùÆc+ŽN3š?«‹ÈQðõ·Ž´í'[Ö|Ki¡j÷vådþÒŽFûPBU%Æ@Ç#’*}câEï€õ M ÆÒÂòÇI†8D—öi3ÍülêÌ U;¾\tªºÏ…u¯Š6Úˆ4˜-™ßÈ–ÐÏ ÆH+v©8Î*m[]ð÷†æ±ÑõßÁâ=FÂá¹Ô ̱°#Ÿ,m`( dç8⟘#›øƒá›­7Qþ×gó´ýTýªÚG•ZR!ר#v2@Î+/ÃZ­âm^ÞßCµžkضÈ O•†¼'²ƒ‚Oj·ãè/¥ñ ÕôêòZÝ7™mpˆž2P½¸R;VV•y¦ê¶sirÈ·Ë"ù~Y ³da}Á¡I ØÈ¨´Ÿ§ŒâÔ´m/@Ó4-RòÑ’ 4Èü¶¸ÚC›$˜)Æ;FÞCüI4Ï KðÇMÔõëËÍ'[…âQ[YÏöˆfiH˜` /CÔ×›\Ê/¯$•aŽì[ʈa'8°ö®ÿÃþÔ|m¬ËâýòÇHšÓÊkk”0É;–<¢GQ‚sÛñ®å¡k©  ’82v+¶XÀŸëRQÞkÒ¯ˆ¼¥ÿÂ3§=¥•¥Ë­í…»<ÒyÌ£l¤òH §N*Äznš~éMã‹ËêUÓ…´j×>QûûÕ¹ØtëM¼×Á~ ²“ÁÚÐŽöèý¶ùE:ʨ1p¼’z²lî>+x_OÔõÍv×J½´¸{%Ô56aÒ´¹I œcšd”üUâ)ü%¥h6žÔ®­ôW…¦KÔýÔ—2–;üÀ:àcÓýC@µñ¶“¤ëº§ˆì´]Vê&Iÿ´VV7;X…˜lSŒŽ¸©µeþéš^‹dtíxÈ­}-ÕŸžÝËœñ÷~^N5[ZðÖ³ñ.ßN×t‹8dY!û4–qKK ÇÁ¬Ãå9Ïô-x‡ÇW~¸´ðö• å„:þÑ&ûC‘¼ºîKcµsž=Òî¯.Ä›„–Zª¬êZEÞŽWæR¹ÎÆ+wZÔô?E¤hþ Ñ¿©iöÂ;‰Vé£òòwACó÷®wâwkfù#q¥ÜÆdè¤F°•ùP™\F{.ýžs«ÜÅgck5åËçl0¡w|rp5é^$_Ú_iö¾)MNã[‚Ò¯eÓäU@U@ÚÙ– €Hô¯2‚úm:hî-nÚá9ÄÛJŸc^›â/éž"»ÓµCÄ^Õu+X§¸³ž6c¼¿~]ÃÖ–å3ÇÞ!Õ4ÿN¶w2YÛÄ#0ÚJv6ƒ\uàÿ:ÛÖüáËÏÅý«âDѯ®Lr^éëndòÝ€.ªà€ '§lÓ|UñPðˆ?±t»x"Ó4–é Ì+!—o;Ë‘»9ãÚªk_ uk/¨iÏlÖ—á.“íI¨$à£ÜgòÞ¤­jõÝ+ÄÓ[A¾×N·˜Bºq2Ƹ]¹ë’Z|ßo[Ä›àÕ,b°3ù»äºUº‰3¸æ/½¼z óS^|CÑ,¼_MáÍ>öKI#µGßç3&›·vÒAåNqXמ ñ[øÝå·´¼½¹kŸ´&£.bu'p”¶8\rsÚ›óÝ~;ñD>)×n.á°‚ÕK°ó#]¯7?~LucëZº£߃µ]'IÓ…®´Ð©žæ'w’öùdÛ’Œ¯ qÍdxæ]]våôu•‘Œ»ˆ1—Ï%08_c[þº°Ð|©jú5ÅÍlj È–5E²F“Hˆ$¶@PInOZàöà% ÐüFÞ#ŠêÓÃâWÜ…e7¿wåx|Ùã§Ö®Ç>— x3V¿ðeÆ£5ç›w·W(©-¬ü»vög·¨¼?®jÿ4[EÖõw–a[¸//¥>]´Šã©ç† x9«šf–Ÿ ¼7ªkFûMÖîîLvElZxæÜÞr²…9 À9ïI!™º —?|?ªA®k&ì9àÔow:#1ÃFHç‘ȸ«Bøkቯ4ûû-zãPaiážÞQ¸#''§ðŒw§&£«üWðõÞ™a§ÙA}k:\›M:í’å[åÉ Ü¤ÀûS4ýþ ßi3IìÑ4¹Ëi6çt‚E$¯P8ëïLE;™o~#øaä···ŠûJ—2ÛÛF!I"pNþÃp*G©¸»->ãP¼ŠÊÚžîwÅ}æbxÞ»o_Xj¾ ÂÚtú]„7 ßÙ´æyYÈù$-Œ•à€;së\r´'ÌѸåYN>¹íI”®z‰mô_ø@ÑÙ#µ.µáÿÁ§x….ì­nµG›õÀ€»+mÞ™à©ëè9¤ñ6½iàùl¼“ÆsiÚÒjzm…æ¥m·÷÷>YgiqׂlqŒô¬¿kBÚ; ÇǦ"Âod÷ÎÀẄù¸8/Š<1­ø¶ö-gLÓ®u;ÈQãû,%¼ŸáòÊŽ˜ ût¤ø‡-œ+ca{ KâK;h໺ŠOÝ’ ü„weÃҎ຾ƒ¨Yizœ7:†™¯h¡ƒÙÍ#¢ÉǪF:ðk­ø§&£¯ëðjVñO>™5¬_bò";"Œ.<¾:9•rZ ¾—uªÁ³y=–œsæOm‘׎0§Þ»ˆ>8Õt¯¥Ž‘s&—¥YÛÅœPâÚ È}Kg$ýjz÷YÃËbö1’+;Çž#Ôt¿y|²ézt ±Š';|œeg®G$úÖŽ¹àåñMƪÿiiú5Þ£I=®¡++Á̃ƒò¶ÔúTÿŒ?áÔbÒml,ï`Ó¢H·öë#¹$óÐsǵYÛ¨í–:ÅÔ7÷ZÍ®uo³XÞ£»ù„|Íò”<Õ­{â߃¯`Ðô»{g²ÓâH³{”ÈØÎឃž1YÞ0ðî±ã-uµ½>µHuE[€Ì˽Y‡*Ù#¡ŸLSõíSA²¼²±ÕôÉ5k»#·¸¸‚çËÞW9æ8Ï\´†µ²3¼u¦Ý_ÝŸ#Éqg©›Í™Ç˜‡ÌÎzƒƒÓÍXiwšÍÒÚXYÏ{rÀ‘™€äàšÜñìWG\óß g4I%£Ä?wä‘òØcG®kŸ¶¿ŸN™n-g{iÔq,lU‡ãIîTv=CÆV>Ò.-,üD÷·ZâZD.$°eUN>ërÀ`gڹωÕÀñ*½©þÎÓ¾ÏØ"·“°0F2}O®k[Æž[ûë+ëýVËIÔïmb–{[‚s’ ÈÎ  VÕÇ=¦\ÚZ_E-í—ÛíW>e¹‘£Þ1Ù”ä×ð®«â>£w¯jV7P+¶˜-"K8¡ Ëo¨WÕq~µÊé–ö·wÐÅ}xlmX×#&Î8;AçÞ»ÿx×QðmížáËÉl¬!µdÈ¡MÎá“!ë×üi-†÷F~¡¦é"ÃHÿ„ŽîîÏP6Ãp´‰d}™ù7äŽv‘ýj?ø†M=7OÐ'š×JŠñL§kÜ÷ñܑӶ1Rj½ñâÙêâîÎÚîæ,Lº…ÚÃæ:œ\ö>ô¾ ½¶ð„Z~†mm5iícÝq4ÃÍŒ»Åc=”tÈëÉïOÌŸ"¥æ•'‰´« Ræò+;¹Äò^9hÚxaÁ÷éW/õ$ðŸ§iöŸdÕe–1wpóÄ%‰]ÇÝ@ðg¹ÍRñ,z‡‹m´íNÒͤ·ò~Ì-­cÊÁåàm £Ž2jìš~›£xkIÄÑÏ%Ì…ä†ÚÕÂMG¦òs€zŽôºlR×®îüc¦Ú_ÅnжˆmžÞÙG0*:`ƒ“ß&¶¾4t´™mø'Ç™ùÿõûÖе+S§i°h©-¦Œ•Y$Üí7ñ—8ŸAÆ1[¿ ®c‡LÕÖEÞh3Î00ù?­>¢èvÚŽ—q¬Z[ÃjØt!‚9?7xïž}+=ü;«E¥\éæ( M"ÈNÿ›+Ó»Õíjí¬­­ç·ibpå1í8 qÈü=ª‡ÛõPÆ5Ô#kÅàÛ»’àŸáÜTÇÓ4ÑsÁúmÆ…ê\F#yYJü\Æø–é+÷1¼à©äq÷qZþÖn5‹k£rI18ÀeäqÎqïX_¤FÒÐ(á]‚žØ<ãõ¥Ôoc̈ýÑ>a[~Hw\Ö±HýÑíóV¿‡ˆó0I#®=iõ!fãÉáw0þ?nÕu7ˆädÛ¹ð2q{㊣h¹ä”XJÐ9;$Œç úPhQ¼Ø×vÞXÀ ÃÔçŠú'ö2ñTkÙÿŸhú¾kç™Ð,öÁ_q;Ë~:WÑ¿±¢øHõâzˆbøóVv4§»ùŸ\céŠ àtÅ< uíC Œô晑çOXMÚEÆ89NàB¯ùU›ÝxÙ_I´¹kY&(Í$i¹ö– =O¯õ¡»WÑr­-Þ šv›k&£¨Èp°D2WÝa^ÓðÃöo{ÙâÕ|HËy:òˆFmáöUþ3ïÓÜô¯PðÂMáΖ¥áHxÌŒçsÈ}]¿‹éÓëÖªø×âôv‘½ž–îWÌ•’N^†­ÆŸ›:]W\Ñ~زE±îq·¨,p8çÐzx¯‹|}âk–Ù!°õ FçT™¥¹‘œŸSU6ç âµIGc'y=DAƒ’ÞÍ/SÇ${Pqõ {ÒÇ­<&OJxŽ˜ˆä{S„~Õ>ÌñŒÞœÆ‹•b©ŒúRmÀ÷«…3Ò˜#é@X¯·õ^)û9§*~4`J]?L¥8F9 d^h1àc8LÒ•¦+¢²7Ó%ºýé–2p2xçó®¯â>—e¥Y­½Ž>ÍkÛÆÃø‚¨¿“ø×:€Æèイjω5¬Ëml¼®C9ö¦·½¬ˆl-ü›#þê ±·š”(ã§’h,Œ'=)ÁiáiÁr}¨ªµ"§4äZ-!\jA½¾ƒ4–R £$v85CQÖÎf¶Î$ò¼ÃôÎ*/ ]ý² £œ'ô¤ZÔÁøÃ+Úxîý`’æ=:æÓRš8Ї0ÛÜÅ<¥w 23ŒW“Ã⨮m¥K‹y¼·ŽX˜2:’`GsšöK <–íÁ¯Ÿþ¯™¦xHÿ0ëýµÓ{Ðôšÿø™%ûÕý[Ÿ§ÔQEpaEPEPEPEPEP_–ßðQM'Œ¾+db–vF‰';D¥.J@ræ¿RkñŸöñÕÞmCâ+3äßøåà<íµ“òÅT~$VÑlønK‡µ¸Šh Yc2‘×=«Ù%³µñµ ³u·–ùÕÚÁc#Ë•”D8³Ø0«Æ¥›ìòE(ö8m§¡Åz´vws°ÐLË,M¸n@Ø8=ò§#ð²Üó¬_ÐüQ+ë‹®ì¦i-gM¿½…\Î]Éœê(𵆣áVkå’/ôÚF–7VWO»‚=6 žÄƒR?‰-5ϵíÕ¼ sq3o¾Ëòž®:àœÜÖ…¥»ÑüI$w1,~lÉʺË(>ÄÏÐŽÔìætQhxŽé–H-5†3@X¬ï·w’'¢°¥@ï\_®n4;_[êðËsiä]Ç,g9Ü 0##ñõ®•¦½³‹^rÉ-âÛE1 0 0­œòÁIlCX~ Öÿá'ÓõÝ_ÜÅqoæA{1æÒd?+gû§$ïžÔZÛ{ÚåEÕþßáË}3N’GѬdgA*bMí÷‰ÇAïYíòü¼ëRÞî=ÁãCÈ»oµ}¢[Ø”?)2~¿¥eHìì¶n3A ¡Ð1C¹F;’köÓH3C°wZÄÜñÕ~&!Ìyþ ò¯ÚÏ Hdð¶Šs÷¬-Î{óÔõ#©‹  ò¼d3µÍÒ Ýð`á^WrÇí‡)ûÇ©¯RÒbؾ.$ÍÄ}ý25åƒ~ýÐÁÏÌE jÍߊ×lÀ§péòç°u0ÆO•LŒHùqZí#0FÑÜzVtãË.2Ae (ëô­Q‰ðïí'sçxæàç­`xžBŸôxÇ}C'ž¸‹ùóWÿh –—ÆÚ*ZC&0Íbxžãí&#‘‹¢ûOýs“Ü®§žêêÞ$áÚ@ê6Ó,÷1\Ï6èÞR`wtÞGCÏ&¼Á’ãÍG·ÿvÁÌŠËϽlfÕZŒKoÌ ¾Â¡7’cÐýI¨Qž[Í+Å MH±ù‰v.H°Dœ÷R çéZ¶pÚÿdj³ø~[¦šÚ#,\ãx@~v ¸ÉUç àÚ²´-^éüUŸ}÷}Æû{¸›pÛ¸$t©þU?…í®<-¯©AªÛêm§¡tK|ïù~e#Ï?SMìRO¡§ý¢Þ(Oh:½Ó ¢K›KÙ‰qk2ãnO]Œ cYz|wŸü¬jš}Ä:¬Wó-Œï —·UÁ`9;Iáö­SÇ–^%ðÂG–¨m£¾²’X–á£ëãæ pOu½cènø{áÛëö2}‡SD¶û ŸõŒàêAà¯?QëRïó.ÉÚÆŵÍׇ´ýbçh{é%Â' G csÚ¨a‡cùÕ뛹õ-Æé#{}1ZH-mØ’±€r@cׯ5G8Æ5V¾¦GÙðN Hñ?޽alÜûJßã_`ø¹‹ÜX ÿËC_ÿÁ9%?ð—xÙ8Ó­Ï¿úã_cx·}‘ÆO™Ò²ŸÁ&]â/SÅu@>ÑpÍ+1ÇAɬ—‘¢n>ðéÏjÕ¿„Çu¸äïløÉ¬k·UBQO¾*éì*nýHÌÆÖÉš£9$ôÛÎ*a*®IÃnÆ8íUnr —ÜUFWh­Ž{7ˆùaÀ~<×|F>O‡uÏ"XJô{‹wy اœH㿽y×Ęvx~ûy!„Dä{ž”–ãhùOK×.ü=âî¬&c4“{të*>SõþuØiÃ>8’þfÚTÓ$’ìZ[ÊMßÈ¥¼½ {lõ®KIÖáñj&nPHÒUÁOV_FuZÃkIñjj­,GK†ct÷¢t."åŽøó¸¹"•®h¶+i~-›ÇÚÚ:éÚ~Ÿ{¨[±‚kî¤>ÇaÔ0}j @ºðV•«\øŸJit™–8~ÇççMœ¦ã'4šn¯¢jrjÖúŠúv­s ‚ÎQ;I¸g%žŒTôª>°xlõ[Ç}g£•œ¼e]% òÁ?x~4–åjK©j÷ÞÛá=>óMnÞ@³´Ò“‘·Î~i·égwàk+jkˆu˜žH¬þ]Í<@©ýé<€§pSV.µ _ è2Ýø;Q¿hn.W7w¬SDÊ¡ÚHÁäç¾*®¨'ñw…£Öõ=@&¡nín­tX›Õëò1•Îp*¼„sš5‡öÍìV&öÛNŠVÁ¸º$D¾›ˆþ•é÷ßlü'«Á¡iZ…¦˜b¶:å¹{Ò\ž=WŽyv•§Ýkw)¦Ø[¬÷3¶K*’G8Ëwº¦µá½'^±³Öty5Kûá†ïPK†MΠgäÆ^¾* êO?Âïi¾1¼ &ÒÖïíKª‰£,"Îíî›·)ÛØŠm—ˆ<5«ë±è Ò5©ã˜YÞ}©ÝÊ“Â1–Æ:gŸ>—â»_ˆ"ìAwqæ^[±›iccw}Ý¥<Öµ‚,u‹‹¯]ê—½¢Í,—I…¤PH1¸äíêã­5®Âk¹à}*äKªÛx‰.ì49,ØÞIqhÃc.õÎ hÍ&“àý÷Wð&·©ÝÌZ.®î`³Y†,@]¬r¨†:c›£x£\ñû\èÚ¾³=Õœ°4žuä¬ÉjWæôÏ÷©ì ô»ýNÏPÓõÓpÔ¬q™!\ß¼GPÝ⟚†·šCuöƒ YTùÏ÷‡#ñÍz|žÖþ1èö![» {åV´¹}Rõ-–à¡È’=؆ÃÜ{ט@Í5Ø“ËF ÛÌd|§ã•Ýkún©ñJÒ5-HßimZI§ØGˆíd'hÎpÁÍOAõ4õÏYxôÿÞx{Kñº}ª,—7ÈK+¶\ˆØ”¸ìjˆ<â­{_]{J°»½°¼1ÜÛj'ÉÜGÝÙÐö«ÚÝ,ô7ÆUõö»md‘Ëqesä´+’Qw°R9ü+Åš¶µcâåk)§[eò†ž!'Êx°<°C‘€}óOmĵØé†¥à{¯~îÆìëfàl¾{•[&¹þù‹fB—ä|Üzq\·…õSPñ¡°Õe–XønX•E ùŒGm¼œûWG/…<ÿ Vù5¹RÿϾˆ,ò‚O¼bYƒúñ÷h°ø½âê/áÍfçþ$š„·Ž%SjJ…HN2;ŒÓ×Ð;×,ì4ÍZH´­Eµ[DÆË™!òKs”Ët9yÆxÎ+·ðõÐðƒ/5ø.,µ[íUãµÅ<Øí€Ë°™cqÀÀé\>³£ÉáýJK9æ·¹’#ö²‰#?FÚø6ÖÛÃ~Õ5¯Y-î‹|"ŠßMY@7Rn'p å6(nzóÓ¤m–&:§Åï ¤Zu•¥µî™s¹ì­U-á•d_¾ ¸Æ3“štÆÏÀ^Óôohk«ß=Ä·1YµÁŒÚFp¿~3’X‚qœ OIkâO¡ðn‘q§Ø[_¾±GiçÜÈHXrW‚1Ž*´vZtÞÓ‡Œ%½ÓåŽyOx" ;Äq¸8oà œRiØ Þ6Šó^²Ñ/t+‘ %¯•ooj¯!µeoÞ,…GÞ,s“ÔV޵eá[‹M(ø¦ïV²ñ,–‰ö“k2¾Y7;¶mÎ1ÀSÄ^(»ðe®‰ká]JîËJ{µGp²yåfùÙ€èAc¶*{ïŸGg¯ê#Ó´½KQ|°j Áå í Ã`uÅ? NÇ=ñS¿mz]6i,¬•#´¶W-ôleöeÁÏ|Õ/ ø·PðF­¡§JB»%LgÌL‚Pýp+[â¾^â-U,´¥[t’X×ÏvUÃ1|gi9ÀÎÅdøGZ´ðÖ·m{¥Ûê–ý wœ@?xcŒñê)uØîÇÁëÛŸµÝ¾«§ÛØùëw¶[å‘!ýæß/ï8ç½:Ç↗¬x²@¾Ó4»‹¹$†baq8*®Üà“œ3Íe·€<['WT²³½š¼[˜u¥…¼ŒÙ蟦+^ÒëÀ³xÂWÓlï×[ûC›F’e6o>IVÛ· nÆzⅫЙ™à¯ø“Ã>$:ޝ¥ÝéúLÏöë™âa°”*è¡-œ®{TºMÿ…ÖÛV›Â6:•–¿ ”Û®–e)ÿ- x@CíÉäô²|­ë:Ç‹³u™îmn¼Ø¯à¸”Ž2˜ä›zçÔV¶‡¤hžúöâñ£§Û»Ãl-Z#8_5²H`»NýF(ZìÌÆðMÛx’ WOÖõ ÿ±~ÏçËvÇÌ6²)ýÛ€O$’FÜŒ×%t±ÚÞJ¶³}¦%bR›K/c·œdvɯCÓ¼]â‹×¾Õ5, ][Ë!X£Yù‡¦ÈÉèq^{yfú]üÖò˜¥xY‘š' „ƒŒ†G¡ïCèÖºøUá(Ì'K×®5‰„¥ž!sm"}ÐÞ|ç|²À”°À H<Òx‡ÅW¾¶Òtÿ êº_Ù¼á{ÚoÎÄvÇolSýSJðüÖzKx¯P¿ÒµÙ-ȶ¶ë(1ÿË6“$Å1ïÒ±> ë Gû"Õä‡BµDû¹?+&Þ$Ç÷›$Ÿ©­[¯ã{KÉ«éš]íô_¼¶¿•ã2:»× Ü63ÎMcøãP[¶ðò[ÂÃM‰b{£ó¤~Iùºíù°Li°] X¸ðî¥o¨[,OJ¥ÄK,g#2žã]ç‰|®xâ{oiðÀöú¼rùRÝ":¾0ʨNvåN01ÍpZ5ÍžŸ©[\j:ö•'}¯šÑùƒûÃ‘Ž¿…tþ=ƒRÔ5{}JÊÞéôÉí¢k·¶Ç1Щ~µ=5+®‡C®ø³Ã𝛩øjßÄWvÅms¨ÜÍ"ÈÒ ÀVÐgÓšç¼_¢ëú—‹§¿µ·º½[¦K‹k›XXÇå¶<¾@ÂãŽÕ½â› Ýëv­âKûË jH!7ëa¼&CÔ’y F2Edø£Æþ!ð÷Šn,ìï'±µ·dŽÞÎ'>[D y|#\Óüjj–žoµV¾]EdD¹®†ÒI€¹Û¤õÁîkóÆ~%‡ÆsBgŸíjò?³‘òŒ3´F¦À¹{ðÏMÔ|N¾ µÓÔ±É.—*¹ºŒ>Ôq´·-€H¨¥øÃ{gâ&T²´Ke0¡–Ò7¹ÉŸ0®K€:úúSWô'ñ9oè6Zµ4Vwñ]¡b|”Îè~ãäzŠÙð”Ká]ïŽ÷™¶‡O $ù˜àùèG À=r+ž¾ðÖ©$wƒ"BdŽBÀ´ˆO€r Ž+kÂ;ØišŽ¯¬Z\ÅáË‹cq·ío¸XÛ¦A“Ûº¡~ßÄ?Ð5]"ÓKÓôëåU»TÓ-µ*° ´™Èúb¤Ð<5uà­Y¸ñ~•q‘p±Æš|Œc{™wVB:`dnÿj¡[ÝO kgÂzuå•â¤mv×W"WùÁòð£v3Ôôª~ ˆkþ×mõ{×·Ñí„r¥Ü™så°¯ñewer8§Ô:2Þ¡ªé“ø*ù|%§\éJ.#:ŠKsçJɃ°«`€äêFj Ci­øGRÄ—óYéV÷Qµ½â'*ÌAª¤Œ‚¸'‘ÐV„2Úü=ðÕÆ«á}eõKéî#·}B;cØÆ å,G_öj(/5ÏŒ:]ÔZ†£ߨ:H—7²ùq˜ÛåÚÌxu7Q¹²ðO†øWXšüê4w:‡“䃥/‰u ?Àú~‘áíOG¶×õK}×tíˆ7â8™OA“Y¾8¶»ñ=®‰¨èºmÈÑ~Êc†ÖÖ7•lÙ[„Œ÷ äòsZZ•·‡±<>¾2¹ÔaÖЯüKÕKˆw(K¼¶?J:‹µÌŸi·Þ(»Óõ]+O¸¹Òg´E·‚Ö6”ZìhŽÜã¬jÇÃÑZéÞ'ƒRþ׆ÕRf±‘Pªd”NXLñ׈®4 CO¶ðíÕÆ¡%ª5“Å!u<³±[vsèiu/ Ûø’=7QÔµ»}S¼·2j !óyÂÈ ƒÃ. 0íØ«ãÿ^YkVé§Lúv’¶±}‚;ySц<òÄ‚N{ÕiöòÁeªKtj—VñÉq`PîÝŒoÏAǽkkž4ºð]安¥Çm5¦œŠ[»d“Îcóà“ÀôÅdøãM½ÔäOŸžÏTmÌãr9ÎåÇ\1Š`]GÒ&×µ¬ šÚÞG¬—Rˆãåzî|Kâ«/ ê0éD°ÕÆŸBó_ǽ݀Éñ…É8ö¯>´°¹Ôç[{;Y®ç ‘]Î:àkÑüTžŠòÆI&°–±­ÜÖ;UTã…`s–Ÿj”SÜËñƪø§XmoO³¸Ô¬/¢Žhä†#ÈÁ¦#Ž*çˆ&ðÖw§ÙëÖWZŽ¥mow“ÚOåe‡T<\ûUˆšõý‡‰K–²°‚þÁöwÚ­Vã©þ¢®øƒÃvZÆ¡iw©ëèZ•ݼrÝ[]FÌw‘÷¾^›†ïUbokuK¶ñ™H³²’ÚÊ+f"5ƒ _\rr9­xkG’îÙµ½Y´-jX"{»e¶ó@b,~aµˆ ‘ëPk>:Õ|'©.•¥Î"³°AAãxê[žÇ­.¹àGÅ—öÚµ‹ÂÃUE˜¥íÒFêíÃ}â>\ô'µºž:Öe[çÑíLèÖaRÞ9Êßrr=kÃúä¾Õa¿†ÞÚêHÁ+¸„‘œúƒÆ}ûV×nímgHÅuq`‚ÝõÒÏÕyãð¬M]. EX¶¸º±ÚÁ£¶—Ë|ö9Áàzw¤÷v:ßø_]ñ†¶úÍ…•Æ£ú$Á—£‚œžÄŸÄwÚ‘wc¥ëzsëWº|KÍÌ7&<ã?»OÌzõ8ëŠËø‘ªjx™Ø]4V‚46fÞBÉÀÛŽ}¾¼V—Š4 :öâÂëVÕbѵK«XžxV1wt,H<0HúÑÔ]Ì_\]\jÉw¼zt°!µ0‚GŒ=Á~©âm2Á¦ÓψnçÓµ†µŒÜ¤1=>RãŒ>ݹ½i|MâÝCÂÚªiZ<íie`ˆí÷˜Ü’sš‹ZðÕß‹&´Ö!»¶YµD³-õÐÄœ‚rÝAÆGÖ¨N…ø–ÿCÔa´Ò®.,lmâAm†™>ðbG短Eâ‹í; tÎÜ]Â{y˜ïwÜG˜œr§ëZ>$Ö,<6ðhKei®-”)—7Hsæ}æžPIÔVWZï[»‡YòËYÝD¦3a"Ûò˜À cPüĺZf•q¬ßEgj#3É‚YV58ûÌ@;×iâíCLÐVÃC{(µy¬ak™\ü®ß3"ü ’;ç¨ë\#Hv¢³7\ Éý+¾×tm´Á®ê6š£ÛFòý–!&ôÜ>m¸ïR¶-ù™>/†ãY’ÆúÎÚI4ù-ÔEY`ÛÁCŽ˜«š®§iÚ^™oâw¨-Ë·òê2é ý «˜®9Ï¥;Ø¥âXÙ¦—“$–ú\pƒ†rN\±e²yüIw`5ÏiW·—Y^“$biÛþ>#mn;çpÉëƒVuma<#ee£Z‹]LF¦If–èÌÇ$&á÷z~^õ©¦ê¾7µ°Ô,-ä•hÚÝ@lÇÝP‡æ ȃQ¼“Ã:LZU³Å:\§4ÀW-ÇÊ{` VçÂÐí¦ë;1óaÉî8ÓŸåXºÍÐt=7V†A©Ò¤u­•ºõÏ\vÍt_ÀN¶üs4+´÷áýéuÔéàääœÁã8¯Qð_„.¼u©Á¤ÙX\ÂÓ&ÎÑ´r“’k¯Õ¿g¿B˜Ž2uÎvÇqŒñþÒŠ‡Q'fh ìxGƒ®~Úº¬àónL'ÉÆcüGsý›o$+7È„ÿJôoøVëÂW“YËh-®bº¾}ËÁ¯6ø‚Té‘€»$0ÏÞÇ~½yª‹¾¤KEcÎúüÕµáÍÆ^Ï`kÀò}NêÙð÷Ë&@æ…¹š;í9v•,7:‘€Åhýõ2‡«±É'éYºyC×vHÇ?Öµ|Ù;íˆ ×hØúSF¦tª£Q€+gä~ÜŽ•ôÇìfuß·ûÕ«æ¹ðú¬<œ…qü«éØÕâ{¯óü1ìÕ…]¾ãJ{¿CëdÒ2óR…:£29ÅmxG\“úÌW‘6×PF}eÈ .ô ‡gâ߈Wþ#“o˜cˆ ax®@Ü““êhPp3×ÚŸŽ:c4 !˜Ïò (Á© â- #¨þTá[ëRñOúQqØËü)Ûy©Š]™< ab=¥JRµ(J]¼ô JHƒSì8¦íäŠb#ŠxŒc§50Ú—Ë"€#1N ŽÕ.ÊpŒ‘L6RmÍOåàRùtLš’ÚÜ,¬ýÿ•<'54K€)€¡sJª*EN:ưzP" ‡=¸§„ §€)ÁsÍ4˜T@•óÏÁyÖåô6SÞšÐi—p³+§„ˆÝNÒGUÈçAï[Å~âOÍ~L_òú?×côòŠ­§%ÜZ}ª_Ï ÍòÄ¢âkhL1I&æD,圥˜ÆãÖ¬× ÔQEQEQEQEQEøkûgkCV´ß-÷‹µëæÇ̱¨?¡¯Üªüý¤¯þ×§øh)ž]Fv=²÷'ÿ‰ªÅ¨KH?ë¹óüŒŠñù¹dâ½IKi÷q½¬ È­ÖòÆ1• #éÐûƒ^Wp€®v‚Àè;׬[C>Œ°Æ¥”Û*m¹R †V÷ sïZÇs€Ô}?L×|XؼWså¬vžsrQ_= àc8ªÞ×ÚMsÈÖƒ½…Æûk˜G¶T•ôd8 wÛƒÖª\èK«ï±e{Y¥F|ÑæDæ Œç‚HÏ|UÛMvÏÅ>&&â;[¯$xÆ¡‚¿¼l…•Æq÷°IÔÕ­Þ†µïÚt‹[Qy­nc[x˜Éo rJdgoP#¯@MsÞû'­5ý+xôÍbâßγû2€.eFɈÿ¼ Æ:zè4Û–Ñ|C%å‹AÓÒ` ©Q•‘ ôÆyúåü1ca}6²ÞiÛT[f’®H Ëm8äÏáAHn‹¥E¡ø&æÚú ×n.Õ– PîŽ È²qÖ±Ÿ–pw=k[Ã6³Þø+V×o¯™îEÒZÄ$ù¤cŒžs¬vù¸$ŠD2`wDÄp6œœõ5ûAàI„ÞðÌœ|úM›õõ+ñp ¨A^pkögá£yŸ <"ßÞÑlNOý{¥-™ôµÙŠÈ8o´FzÿÓ&¯Ôã}3+G|dö(ˆ ñ3c,n#ÿ¶O^?ª:Ü\È@òO-õ¢;³¡Û•Û`-Æ{¥eÝ|Žån¯ñ­i }‡éœVT–À‚d@ã=G¦jÌ™ðÅ×añ:bFGœNIöë\¯Œ§èvùå¼óó׊ì>3DÄk™~èóO^Ã¥qþ(ˆ<ÀJ9=;Ú˜^“Q@åÙŽµzm–«oªh¶º,6ÅR¦Ï*Yƒ²c¹É`9ί"µÕFŽg%C,MÀéžæ½U¬ä’}å&†\`Œ€§Â–âêji>2Ò¦Ô’Úê+ˆõYæòZèí0ì—s5ýÖ••µ¤­ãÄ3Ò³¹*yäaÂe^õŸs§k~1ßäÅõÜ®#ºfÄ&fáXŽÀ¹Ï§=*? 3éú…ݶ­nñÍm¨A ù‚Cœ)äÄ L¥êSg¾Ó|Io¡Û½¦³ö$™‹Ê]¤€]SÜ  5[À:½½Ç€¼Q¤ø˜Iý‘?–ÐÝ•ß-­ÊŸ•“'œŒ« ò¨¯.™k£A¬ëþ¿ŸP¿±±Œ…h|§‚&!|Ò»Ðñš¥á]_þ7ƒ•§©I‡‡´ý/.V´–Wšæc•Û€N9yéÖz˜ŸaÁ9ˆÿ„çÆ(N3¥Dqë‰Çø×Ù~0,ùkÐWÅßðNr[â7‹º*œúøükíO¡Úmà™‡AQ-`Ë¥¥Húž/©GþŸsºB‘†$á«ô´JÛ~QžIëŽõ¯¯;®§2¯?½‘™»îÜx¬-NB“n@÷ª§¤W¡uoÍ/S>Y3*©1êO¥DοpÎF;úÓ™Ñ$P;yã5YÙdÜÉ»w''Œÿž+S¹Ç’2wçn{ן|H…®|9}#áYb*WÐ×upU¡\}ñœñÉÄxò0|?¨.à”MOQúŸ#i×VG‰–ëS±ÖK"‚ PäãdŒt<Ú°ÑüI§üA[‡ŽYVKò]ÊöYanK36>µ… zkxŸÃÎ, €1‹ŸâÏðú÷­´ñWˆd°žy^9n|‰,LFÑž0=¶œƒLµ±>ž|1§_j¾šýõ{X¤’Ò+½¡YÈÀ=ª§‡õ‹ïØjZV¹¬JÖ‘@.#¼ºbélêxÏ|6HÀ«VÒ|7©ÞjV:å¶³&˜²L–1ÆÁò8ç† žqוˆuˆÖ÷Ú<Ég Ü‘yÐKo [©(rVB00Aêz(ü dÊbømáù.ôÍKOñºŒ‚t„É *£v$xçƒíÇzÌÕEÿŽ´ªÇ®œÍöñl†1»æ ‹Ç'¸°«VšOü :Mܺõ¦©áD‚ÍnD‘³’û£nc óTµ¹ˆ´(&д™,¬mÚòÚØ¼‹’1$¸ã,x£ u9[h䜘 †Yîü‹%¿95èš½¯…ïõ¢ßx÷Ä–^8ŸN{©ÚÑn…¹Ò㔈ž/ºª=ŠA«¶ Ñü/âõ+_Øê¯¦´“Ǧ@’yĨ$+;àý*+zo‰_L’ÆÜé¶®¶{d¶CrŠ &á&7nã={Ót߇:Ï…•©Ьõ?HhCH²ÂÑËæû³q×9öÆhÛqœˆhå»ÊÆVÛ¼°Ü…ÏLý+²ñmæýA—éug¡/îVFi"¸ óùŒ eˆÚAÀãé\nä[’!‘ÄDà96Úïµ/]øGÒí¼%«\®›x$ïÂyOpû°Q—'@ïïIRÅîáíkKѯ|O®Üèúäö£xŽ×íjDo!,6±QԚÇÅ?x/T•}qo¡Y,qÇ`IÙ:ò¾­œƒïPjžºø‡—®¶¥¦é××å‡PœÂehÎß18# øsRêž<ƒÂZ•®Žú—©.8íÞúòØ=Áeä•sÈ?/áOÍ}»øSq'ˆšìk:jÂò ¶¶Y½E'y_/¿'«gã+ {^šÒ NÓe½/ñ&ÙcfÈRÄúœdûÓõ†¾-“ÄgZ¶Óîî4éf[¨õdLƱ¶{ÐpsŽ•r=_Á·^!oìM&îÃ])‚êkÀö²K´ãlÊäç62E-:Ï9Õ´Kÿßµž©k-Ê`¼R 6 þ#šë¼gmuá¿ vIìü?¶'ŠeR\\nÂù`ð~]Ùö®.îK‰nœ]´†`Ä?šNàsÎs]·„7ø¿CÔô ýDZév1­Õ½íÁýÕ£îÆë‡Éäf’.K©Ûø;Á-uàíJåÍÕè†öýE4AW);+eŽ{ãƶ“â7…lµ cZƒO½³¸{T»Ô7m¹B ƒÊœŽêóÚÅð·Â77Vwúo‰$Õ.RÜKf[dXÆó•p0üñUnìõo‹~´ŸK°·K2f‚{K]BC€Ë"‚@ÜpAçž*­m·wCïüI/Ã=#JѬSLÖ’XÍä·76«qo<*oŽzsT5¿ 럦»¦Ù ‹{˜– ËyNŸ)DV#åÏ# Õ»±aà]LÑüWáõÕµ2Î 7M·F Ýç;IêG5“ãHo59tûÝ"Òèhmj¢Î8È-À$4lGñÏ^¹“Øk Ÿõ {+n&Ö,íã†÷Ró ó]T ˜éòð7O­cøI´DÖ툡º›N$-¤s‘ËW®@çÜV·m,`6RM$‹â )„ƒis¿Ü=k#Ã]–¿«Ag©ê‹¦[0ÂÌñ—ä|œtϯAÞŽ ¶:ýcǾ.‹Ç³ZµíËCöÅDÒã˜ý™ãà"ª—iLsøÕäðO…-¼Rf±ñÜÜ[NÓ ­ˆbÉ–$¡°Ý1œ «©|RÖtŸÉcä$:}¤ÂÐY< dTL&c;°:ûÕˆ¾êzO‰þØ5;±´¸óÞAx¿jï99ÝŽ>´÷ßRvò+é5ßê£j—¬µ0ÖÙŽ $ˆœí!€ÎÆG¦jo xçÀwsëÚÕÕ…ÆŸgo'™Ÿ}Í>åÛå°S #9§éÞ=ÒüC«Íg§x[KÒ5+¤š+MJÕ\J]ÁÆà[n[¦qÆx¬ x7[ÐõIîuý*ÿLÑ–ÞA}%Ü ¼e~ê–'üéz£²4Ä:oŒ´CKðÿ…,¼=¬7Ÿìö–F¾E`Z0ŽñŒà×›´-m;G ºoj2éZe¥â-û'˜þc)ßSË.“ŽŸ\Õµeøoá­=<«IuíÄq¬G—æ2`‚’p^zæ©ØGªüLðSÁqv‚}á3Ýɲ7G]¾YcüCh#Ú¬ÏÃOGe}ia®M©Ü™Ö ±5¼Hƒnå#øÉ=ºbŽ· CO½ø™¡Xk7WÖöÚŒ.ö“K7–—ÊÉÇQ’ð¥Õ5˜¼¥é:¶:wˆ#7R½Ü~lkæìŒörF95»a¨üAÐt›íJÌ¡íeÓìSåÁݸ/\0=j[ø´}BÑ,|_¦ß]j‰2ÇoqäÉolª6AÉêyfޤô*x—DÖ~ M»¤hï.Ÿ,KÛY¨ÙlÊ0cUÏOJ­ã–°µ·Ó¬®#7ý½¬iuvŽB©â2½ÙA·µ3ÅúÔÐ5tyç³ÑVÔ aŒ_Ÿyã.éKãkkK›-7TžçÊ×.íÑîm»¨óY³Ã6Gã@×C›Ò"±ŸP·MRækK$I4ùŽƒar3Î;×uãêžÖ-týþ}?Hµ´„ZˆÛt+Ÿ0ú’IÍpzm‘Õo`µ70Z$ n X×ê@'ô¯Mñ-< l|8š®­…¬bKN äÈÃqòÏ÷>aÒ’î7fìR×<œ`ýÛKÔÄ$ÏœŽèÓ m¹Äx’-B=jóûD8º2±vlínz¯¨úVǃØjÖš¶™{rSI[o9¦o˜[º‘µ”g©ÉïšÏñˆ/õíj鯃Bc‘‘-À·ã`±ŠÜð­Æ¥âÝëÂêìûM·”Ie9"FWòßwñ¥Ô:t¸l|¡jZÖ‰­G¬ê;RÛ÷vìŸeG<³nÏ'qKc­kô{íæhå¶/!¶Ä„–CÓ¸Á5%Ÿ‚õ†ºv§©x’Ò%Šh,LÉ"Ü30?0RJ€#8<ÕíX7ð¼–~ÐbÓç‚äIq§é‘»µÂ°Â¿$±ÁÚ8Ï­Wðæ”,|;ªÃyg¢´‘ˆÐ&ÉšpzÆv\äãR^j:~ƒá9¦ðÅò¬× —·W[Vhø%mèyî :ÆØèÇ@ðÒx³N¾µ¶šPÖº˜&ó6üλ—î}ÐxçW§¥¤—ð¥ä³Cb\ ¤…H¹PN öÍu6OøvñõP[›)TÃtYÁÜbÀäôzf¹[ 6½½ŠÐM g çLØ3ÜžÃÞ“éa®§sâ¯^x^ÓFÓü7¨Ü[h¿fó¡ƹbÇ{8çæcªÖ» Ÿiº6½u¨Úi:Õ¹ŽeÔÆ'1ü«"`t#kzäô­#ÃâÏNÖåŽ#s<×1‰¢Ý!ÎØÏ¦çÖ©ø—EÕþ C¦k:>%Õ«Aä¶t$Ž;ŠomD‹:ߊ%ø|öZ­µ†¨¶pe®/-–dÉóŒ6@^p>•GÄÖ|w£ªÚÛbCopahU‰+w1Y>¿ïì§³i£›dû„•UŒ ãø·œ÷¥ÐCgÄšƒö#\Ò¿·u++tŠ{»k·aëåŒ6ÜíÏ·ñîmC^ûR'—§KfÍ"Ï—;p¨=Æ?JÜÕô} P¶Óîõýj}#\¸¶Fš´©ì¬çpÁ*÷¬kv³E E+®“`аFNUò3æ~;‰¦Ð.‡3e¨Üé ugs%­Ê‰bb¬¹ëÍzˆü!m­Og¨^k¶ZF¥{m“YÜ«o.F7äp2<ú× ¡ë2øQŠú;{k¦Ueò®áYc`FTñô=º×Yâ k~,ÔbÖtÛo­õ’UD+˜Î0SŽÕ=÷.ëþ;¼ðf©¦[Ú›]6$ƒ7vë1•‡%²ÀðI8ÇÕOøGYñ®¨5½>/µ¦£º"YÑ2x*K‘žzcÖ§ñ.£ X]XÙkVë:…­´q\]C9$s´€yÀ8çž+ÇbõµÕ¸·IVÂhÑì~ÎjÄGÊ£Áâ©ù‰t±±âgEÑu m/PÒ-õù¬!Ky®ÙÞ6f•ùXdH÷Þ±¼qk©jáÔ#†{‹K˜Ò[Y-âm‹*ŒÆ1íZÞ"ÑtAwn5ëë­/[{xÍÔ0B²"É·«rñ‘ÛšƒÅ~6ÔôMzk-yô}.×j[ZÇ.W`+щÎIõ'¦öébŸŽl­,å‚;¹$ HQo"LÃã¹þ÷@}Á¬M·Õµ·»Ô¡Ò¢e'í3£2: /<ÖÇŒ4¶Á¬›ˆ–MB5žKW™‘ˆù‰t$dwæ±4}ûÄWËe§Ûý¦ä£8r®Tu<*^åGmÎçÄÞ>¿ðÞ°º^— ¼661¬Q¤Ð«ùœgy>ùÈô¨üEà­OÅúœ:Îo© \îgHŒ‡###ƒïNñ&µáí:ö:÷GµÅ¤I×ÂfGb @8Î9«'âß]x„\Ä$šÆh‘ìš%DX@ÇB:b›}É],hx“TÓ4 FßI¼ÓíüA. ÛItî˹†r©Qœ ú Èñu…ö¥}¡mg,š}ÌAí¾Ï2¢ôÙÀà‚1ZšÅ†‹%ÅŸü$—–¨¶Qt¶Ð‡&NÛ³Œ6:ÕOx’óKÖßI–M6Æ‘mÒ&#rm|÷'©>¤Ð4ö,ëÖšM¿öu·ˆî-^(U.~ÈåB¶GßàŸ_¥fxÖø& –Ö öÚBÆ¿dˆ¾íÑÿxNs“Íhjþ:Üvš›ßÚi×—p,²ZÞ3FÌÝx<0ÃvÕßA¥ù: Ÿ—woe©»tù¤sË2’2’p=1LK¡Îiz½î… öŸu-äY1Ï meÈÁÁú+­×<5qâiíõ5¸´³žæ%2Å{?–KŒ˞ǯµr:mäV‘Í5¤WÑ®wA6v¿×ÚñD:‡ˆuC} ¼×PÉ”ñ3,J6p8ÇJ•¶¥=ô5µý^ÏÃ"ÏD:}ްÖ1í’âáKbK§?wž1ÛSÄ6Ú—Œe¶Ôlle¸¶x¶ˆ-aù-È8(ª½NÕ-ôËd±·×…äz„6â9E±PËÉ+» ä€qŠ«âZK9¬áÓKM0DØ+`¸îÄ÷9ûæ¨IíbÖ¡m¦é:U–¹kpuXã9H_ËhAl€ù;{ûUojm®˜ºsÉo¤ˆ³ßóÏÎŒe³ÏãS>³a§__ê–ú\÷“›•fóTùrFyíÛÞ¥¿×_¶ºf˜ðÜ C$·Bffê@aÀè~(ô*ÞÛCÂÖ7÷×"̺Ddùšæ1ПLŒŸJê>íV´I„ÑÄý×Ïó®k^ûo‰ô»Moj0U0IaD{1ȇ#[ÿ 'Vß>.‡ü­ÅKÜgײ—©ñ&âêéSH¬@ùãý{Ljü9iiãûËø§Fc¥Eja7 M#nÛ× gÚ¾/ðWŒ5^‹ÍþKÉb0Ë**Ñî©r2 ý@æ»H?h¿Gt÷3Ûé7s´b&¸x%e¤«täœ{Ö.ÝÍùì¬GûAÅ.dÈal„àwíüëç_ˆ N™ý»¹é×ê¾<ñ­çu‡Ô§Ž y‚"ì·$¯u=ÏÖ¼£â f¡ÞHöã¬U•Œdî?#÷ð?é[›‚FOŽÙòG»V߆ˆ ÷4ÈG Ú?î”0%õÕËU&1þÏ䎿—½gÙ:”V*‚dÃÒµ<Å„– ¹áîÿ…—(ÿ‰¥¸$±ù¯"¾›ýP k_<à¿“WÌèukqÕü·Î:G5õìj™ÔüB}â£VvF´÷~‡Õ gµ.Ïzr¦;h¹•ˆ¶ûS•y§‘“OTçŸÒ˜ N9âžT x ]§é@ÈödÒª:T»:ÓÂ{~4ˆ‚û~t¡sÚ¥Ùê)Á=)ŒŒ%*¥L”%"ÙÅN*m¦—g `Cåç>ôyâ§ÛMØXœ `0/8§„ö©¶c€9õ §­d{x¥ÙÆj]¸íAN ."-¼gõ ®>µ0JF^(¸ªŒÔÑ­5$Ô±ýütÍ<Ô¡=¿:~Úp\t©Ê]£ƒNϧ4õ 3NÛíJ:šr½MII×vpXÙj7G™.9=° b£ð½¹¶Ñ¢ÈÁr_ó5cU´7Ðw`“VâˆC h8 1M½,(«6ÊÚŠƒ é^ áö§µa3Cª<Ñ“°¢ÉX¥0ùM¹ç#ïr:W¼ê>}1^/á FÔ?h¿ Û¡¥IÐÓ&{NµÕAé(÷Oð×óDKã‹ó?G(¢Šá:BŠ( Š( Š( Š( Š( OâŸÄíàç5?x’y Ò4õS'’›ävfª‹Ý‹0©À×à?ÆLê:w†¨³Ù™õ¯Øßø(żý‘üa(Æ-e²œŒõj‰xÿ¾ëñ_ÇÓ´Ú^†½Dpºþ³Íi \ή^¡ÁÊ.Ÿ"&ÂÍ"ŒíëþÓïu=É¥…o–KPÙ"B܃Îã?ʼïÃm‹©Ðu1Ùõ¯EðGŒåÒ´ÛÇ–ê‘4„Ç•b›‚¿\ƒ´àýi³9Iµ7PÐïÙt×Î.–â+œm܇kDW>€€GbíK'‡"‹ÇCPŽÊKIuo3ȱ[~Ñ–ÆÕÜ~SÛ#—ƥ׆58cXÅÔÊKÏ „²ÆÅÉFLuWcç¾óWüMâ=WÇWÚE§Û^îÃH€ÛØE<Åç¶¶e„{®Ð Ž •V*ú»~Ôb»ñ Yêlói÷V&;ˆœd©c´°™IÈ÷\V.‡ ÜøOS¾Ötûøu§DÒ!³$’2X09æµlo—ZñÇtÉlÚ«»ß¢ñ³ä>Ù ·~¦±¼­à/^]Ȇ+8måŽä¿1O.ÖOpÀÐôª¶åm"K¿i:¦¢ÐCmodT„lL±àÜóTŒœõ•{O½‚÷MÔ-t8n­´µe¸¹ŠC¿sB’@àØªíaŒ|¿­"Ô”7'#ߥ~Æü(?ÂÆt;íÝ+ñÁ>fÇ$¿b~ J³üð+¯ è6'Óþ]Ò“ZmXCƾ{ #lÁýÛ×\BâæFÈl’:`u¯mÓ¹‡Ä*s‚ÑŒƒÌr…x­Ðc}($€ Q“ïBÜÙü(«qP ç¸Ç&³¯¬¤¸R£9Îãè jy9+–äv#9÷©ÌGlŠÃ„’5W3>øõnƒÅwÀc!ñÇJá.ìd¸ðÜ1*Á•¹ãŒ~˜¯Dø÷ Ãâ½Hƒ¸œzqR|F±†/Cn±ªÛ4`(£k[AŸÐšì¥KÚBþbnÆ¿ÃOØ£^ñ§†à×µÍ@øwKºA%´MùæSѶœaOlšâ¼eáIþxšûG{„¹º² 7›w)ãéÔWèÆ+o_ë¾ E•-tk+¢u%VÚ º¡ÛÁ$ð;ã¦+âÚv´ø­©Ì¸(·c”þízׯˆÂR§‡sŠÕÔê9JÌó‹M.ÇQñÒþöIE² ·÷|´lóÏOʯhzÜþ$’k-ZâW¶¿…íä~KÅ‘ò‘ßå qè eÇ£íñ›9‚[ LñãÍ~öë¸tü+_AÕ£ñ«r‚84ëB)bKÄ@wiaÐdã$2M|ëGRº)Ãcwá9µ }¤†âÞÓN  bÃgÌðZÏðÔöÞ=ð¿ˆ4½3OƒIÕcŒ]¬Vƒ tˆôäõÇ ¸­µç†5©fÕ,¥þÆ;Újvó«( ®Àq÷ÁSγ´=?OºðljïünæÖ$šâ+¶ ´ÿ‚u’ßøí]/ˆ®Qnî†Ï˜çwÝ\ÕëÈI;yÈj©ü(ª¿½Læq+uˆä“œuª2FîvwcƒëVŸÊòÃc¡ª¬¬BrØéÀ5³2*Ì쑜 éŸÒ¸ß¿™áûà ’b9 ð8í]eÜ¥W…ŽkŠñåÊþ41_½Óµ%¸6|•¾±â/±ßêNµv•а'°ã¡>½«¦¸ø‘«GâVÒe‰WMŽaf-Œ*ÒÆŸpm|gv9Írë¥Ï¯k­§C5¼ )É’áÂ=ÏAÞºi¼i§ZxmßI´‘­Ým†¨èEÀe|Â8ƒëA¢Ø]'Àw¾ Õ›Z¸»²¸Ó¬ ’H¶÷K$®¸ +GÔg89ªúv¥kâÛKKÑ4 }'Wž䥉wk ¬ G‚NŽ˜ÆqŠv‰àOh~"[ýJÆX4°dk‹ù0ËÓ¿žû‡O­%•燗Nդ𵦡i¬%»ûTâ_Üäo1áA\ñž”’ì7ÝiºžÓ5+_iz•‹Þ(] 3ù¹#1ïÆ2 ÁôªzåõžŸ Bžšö=6âvûHºeó €aUŠ€1‚qøÓü?0ñF•k¯jr[ØÛmš;ÙÌÑ?Mй LŽ™§Ý^èS[h×ñêVÚ›”–óÉÚ ª€Si'æ<çéL}N_M¼“LºKØŒfx2$¨Xû©à­vZŸƒµOO·e%³}¾5wŠ{”‰ãqòªÄ^21ëŠãt©£´½ŽêâÒ+èa`ïm;2¤£û¤‚±®«Å­â)íu­Nº¹Ò¥‚?$Û¡uµ#å1:m ò{j:©¥qâËÄimw¡ÁwqléêÎïæo\)¨;[wV³ð—‰´oCq¨YÜ¥¬³±—P–û4Ñï`øÁIÇáWï—ÁâHWQ’ýµehDòÂTÚË(;”Þ¤Zʲñ>¼þ:k Éff¹k{=¤Â9 è^A튯Rl^´o ZÍ{sáCªbÞ¾hÙ8êc* î85á½^óÆvÚŽ›®jÓI§,h½ºf”Z:U€ÏñrsZšg‡4o êWz®™â5ÉôÕ–XìVŽL¨ 19ÃÎN:ãÒ«ZxŸWøš·z5ìö°Ï$^l3,)BÙ6õäô4mä ê-nÞ8¤Že UeåaëÖ»«­A>èZ~šmô¿½Ó5ëµÄ_h·@~P#Èü¿1Jáçµ}:þ[yBI$lPˆÜ2œd0ê=ë¶šÚÓÁÞ³Ó&Ðuéth®® Ò-¤[ì”så<`8îXsŸzzü3:?ˆ>ÜÚæŸö{iMÃÚÇ97‘…ù¶”Û‚ÝŽ õö§ø‹ð8]{ćŠu9/µÅÔ§æv@?•Öøi®ücá{ï ZA]Û*ÞA,H±™Â™%~3÷ò¥c½r¾$×WÄz´—‹cm`$?ê­c§ÜÆOsÞºOÈ—žÕô­ÆH|A±$âvw»€1,ª½ˆÊœ/P¥/R¶5tí"O‡¾¿>,ÒÅÝ®¡Qû@›B+ŽFÞµ%ö±ƒ¼-o7ƒu;ÁourÂîý”E:º’& Á$zóFë@ë¨ -o hÿð–Ïaz¯*[½º• Î~un€6ìw¦x«Å·^›N°ð®©ui¡¥ªÉo*-® }÷pÞÎA¨¸·oˆ:ŸªkÕ¾›¨Bïjnõíö´ûÀüªNW$ßJ~¥âi|eg ÚA§j¨‘ý¢K›«D$/Ïî˯ øzÓþ®/#Æ:\s[Ykow wz„+4Ö Ÿ5[_ÓiÆqïY>ðåß‹µ(ôë'¶†b¬Á®&X†\ è:žÕ¯ãM>ûVø Â«§ß…Û‡Pc`6• œíN1Ú¹í3M¾Õï ¶Ó-g¹¼ÎåX³dÏãžÔŸ˜ÖÇ¡ÝøóB¶ñz,Þ³¸ŽÚT„ê²n$¦Í ¤Œgv¬ëoø§OñÂ^=ÎÑuæ6¥$,`hÉÉrØÁR¹­öð\ž1Ûª ù5"%̶Í´’pbA‚–ëƒÏ=+xÃÄKã™íåžgyîÌ3iáÏ–êNݸôÇÆQz“wà´ñÌž³Ôƺ¦f±ûTè`ó0ØØ¡Aû¹'ñ®sÁÚö¥â-Z]#R¾ž}:ò9ëÎmÂL€…Hʶ4ÿhZ&½-õ—‰!Ô¦ÓÝç‹LŽY™“$ ßt€G8ê&™ñYøy&…övŒm 3Cl‘Éã+—%9ÿctí+NðDúæ¯ÛøŽêÞÛb¤ï€¹Û½Ãp÷§5ç÷wsj·ÒÜM´Í+rªdòN»ý/ÁßšçY×ᲺӒÝãû5½ô3‹‡n0‰Q߫ϯ&ŽêíÚ uµ‰Ø•€öóïI©ÛCߎü›¢i¨—ZtâK‹5æåXmã»0G¿m4X¼-à²xÆÆú?2û̲²CåMɉ 8Sòýp*Œú­¯ÃðÞVr}¥?µ™åË– „*@BwqÏ=j]1"ñ_‚Cx‡Tk¬ï Yê2©™ŸråâÛHÈSœñ@t+ø¶þÚÛÚ#xtÜZèÅ¥æ?ï…Æy0À<`o¥NÚ~›âh·ž"ÖŸI½)$I)·3´Ð©ù áœôb÷]›áÎ…§[xrú;¸¯î&Ô>Ó4Ï%ðö|–ŽëˆØÜ~ï ¿9ê1œ˾ðW‰Äßk‚Öæd{‘4ZžÆ1$0· TüÁy^5ñþ³4–öpÛD„¢º.$—Äç»WAá U$𦷤i:jZø‚K\µìo#Ksl¼`g vú+Ç2é2ë—Ù‘¸e‘„òïÌr¾îYjûV·…nm4o êš®›q<ž#Š ¯¢„·‰›HÛ9cŒƒº¡„lÙua¯%Ô: „K)ÏÉåîÝ×ð­u£èÔï|#w¨Kræ8n&¼UI-ã' ®Þ¹`n;õ‡5Oâ ž§¤êú¤’ZÅÚ–òíÉKfS€Xú6qŠ»c¥ÅðßJ½Ö¢ÕtÍzyBÚà ¸ib°Å¤WPLsI ™Ú=Å÷Ä *öÓWÕYb³+4Z…ë3G 'Œœ’EhZ}›ážƒu{ku§x‚ööD†7[x‚üÇrº€[؃LþÖÕ>)h÷zuŽ›go ©pÐiÖÑÛ%œ®X( ‘­Wµðô¾ Ðo_Åzl¢ ÆAm`Òlwe92‚ ÀŒ÷ü)€šÆ»ñ/E …­ÆžÛž×N·ŽÚŒõ…F|ŽOR+ˆ´³šòå-a…æ¹”„Ž$fcÐë]&§5•χ hVÓÚB“µÆî]¹!ÝéÔc·ã\ºJbbáŠ8ä0ê 'æ5äz}Þ™ hЭ¼³Ò´YŒ6V°Ç*Q\NÌ7<IééQkº¥ãˆ¬uø’ê-’Å,ëWO”í GÊ{b­kÚž™áC§èº†g¯ÝÙ[ªÜ\K#XgËVR2«œßS­á]cÇÒ§ˆa’×}ò†’;›o <Чã»ÛK!g¡Çn“Ýið$3ßJ¸”¸Édì‚p*Û_ë·j6Vwé¯,g€•ˆ‚Ÿ.pAϹâŸã8l’ËMû[LÝÍÁÌqÇË‘^‰âŸˆþ ¿ƒEÑl¬í㦅dó˜®ï0g¦sÆ([ îS×¹¬WžÒ9.!y€±1 Œ1Î{Ô"ñž±áMQ4Í*y4û8’8c$\æ]Ý})úÿƒõÍo¯ÚI.£ÈñÝ\,nЀªñž=E7ÄzÞ—¢][éRéVúܶ0¬2^\˜@Áè3Æi’¯‚¯‚³¼_a}«êk¨[E=õ•Ì*ð¼Q1¸ÿWÇ÷qŠÑÖ­´;[› _=Úê1Ã]Í`U¶L¼À`zŠ;‡bé狯›\·³ºÔm.bY±E•Œ˜¥HÐU_Çiicegy­ÃI¥…@>êÇÞ‚}¨ñ¦»$ZØN–KM2ÔYD²,xàç¹õ>¹¤ñf’놡y"Zß^[¤²Z‘óc+ûn8÷ ;\ÅÑ¢ÓfÔ#]Z{‹k|¶±‡u8ãÏZé¼gâÝ+\ºdòYØA -±ˆæGŽã©=O½rÚN•&³}œRÁ ’gkÜÈ#OÅJí”»jM§ÒŒ`u ,E·µ1Æ*l`“šM¹ v¦"$_–šDa1;PœëS¸ 9À¾•_U¿Ah¨¤r +ؤ‹ØïA'ø?{mê Ó™;ùR¸ìB8'š˜ uý(UùE=F;qJã°¥ÛJ8 °Î9®1ŒÓñŠG©Ÿªôv㱯#øq–ý¦ü‘ÿ=¿ô}zþ¦¿è²wâ¼—áŠîý¦¼"Ù¸ÿÑöuÕCwé/ý%™Kâ^«ó?B¨¢Šã:Š( Š( Š( Š( Š( #ý¬¾ë??g¯øOÃÐÇq¬êÃöheF®ÑÜE)]ÍÀÈBxÍ~xþÂM>8&e¥…×9ÚÊØaùƒ_ÑÍ<_,Ojqù¡Ô¯½±+u«§w+!TÖŸ£üÿáŒ_ü*ñŸˆü3«ø§@ðÍö»¤iîmîf±O3É}»¾e60AÎ1SéAqáý5íöÃp`U¹·•ðÆE%w.{Ž;kѾþÉž7×tko6­/„4éG›gpÛÅÄÞŽˆ!Ú$gµqž'ð…炵ëÝ`×FÕPý¢$;YHëí×<× ðµ¡k%îœñ—º·&½ñ)·Ôí­¯¬íïÆ›åÀÏ4yªcäÝÁ*:{p1U.4ËýÅísfï&ÛŸ´ZßD…UÁ;‘‡aÔ;E:ýôëûÛczÓAv"Ž+‡Œ­Ã0ë»núôÆšûBñDÖ÷*­fÃ[9ÌNœ=Õ”Ž}¹­Ô«÷4Jéþ"ñ:6c%ž¡|’­AörÌÙTN2ª[OP3\ßývæO§kVïau¶÷–²õ@TüÃЩÁLVøÓU§{¦¡dññÖÿŽK^+~@¼“k. 1žkÛtÓº]yNI+ àvÄ™¯ Ô`W¾b¼aˆ{ŸZæÏáCàQ+‚G rÖ¦”‰É`R8©öÑ€ÁÁ+Ï œqõ§^Dî@vqƒßÖ‚Oƒ?hXHñuø#Ãñ£â›lñu«ú~’ÿù)«ß´-³Ý1P3À U¾,CŸiYÎdÑ4‡ÆéÒý+ÖÃ?ÜËÕ~fø¾GÝÿ7Öí¸•d…ö猋…Ç®ðçí±Eñvþæd"¥¾ä‚@A_qøÕiìB)v6ñ¶ ¸Œ“ø ×Á¿õkâ–±5µÑ{H+i `‚ê0Ø?§á^ö5ÿ²?—ærPVŸÈáfÒ5 ?Å)%³¼Ëö6ÞùAëÁ³Ûƒ‚=EixvßNÔõ[¥ÓQÓP•e6°ÈG’eÁ*«Æy<(÷§u¦x/îû19ÓŒ wqùÖ安ig­\Üi7¢â;c%ÄVˆe‚g¡#È=ºWÇHô—‘‰¥^Os—¨—šÂ÷Iµ90¸$‰=ˆ }y†4©¼¡kÞ!Ñ5(µimâXíPíŠ7ùIÜíô9÷®†ÃÄòxÚUÒ5‰b…õ­>R—éGIÁ%K°(J€sÐkžðŽ«ðÕ5ÍSR·VÓØÚÏk¼<¸Ónõmj[ Wº¼c½v˜ÉÇó®Íï|$ÈÓ€Üqךâu¢Ñê³DßkÈ1´]¹ç§5ÓI¤øzãÅm¨jÛê3žêÐA˜¼Ò#p9=xêh½ÍÆv—&µ/Œ^ÏRóÙg•Òî)‹Ês¸ú`GáVôû}'Ã&ïVðö±q©_ÙÄÌ‘Ël"1v™2çöõ«<×õŸË£jM%äÍm.Ÿ¸åFßM¿Ò Ñ|><ww¬½ý†« ”N6²–21ù@t |œóOñÛ‘Ùj:·ÄÛK6òéâ'†êvƃ8`íØðOqQ^ißð隌­ÕãþéRO:(—o.¬§ï䊑u{é׺f›¥Yi׬FƒM„D.ÑO*á {Ux4ÄðÖy‰tËŒ¼ ZB$òÝ$Úrùç+ÈÈïKp98[µìr^Å4ÖHÀ̸G)Ü+@>ø?JèüM«^ézwöUÔÖšaµG²0É´•Ï;±Õ·dæm9®%™­íÙ€yUwm^çúWxß5Ek¥hWÿfˆC—–Âëvrüô${b’Ø}Iõ h:¶³ú‡ˆSLÕ.DR\é’[ Œà²+`g¯ `šEø•«_xéWQìÓeœÚý™ S4J~Qµñ»#ëPk“Ä:Õ­µ=>Ú+Ý“µ¥ÍÇ—sà20ù±Î0Nx©Ǻi׌C°Fó I«2µ#}Ð䃂~£ò¦Lð÷‚õ­ÝÞéÓéÖEË‹kØä•ÆÓ…hÜèxâ ‡Z´ñe…xn×GÕdˆ²6žÒ3\¨`L{Yˆ6ã8ïQhž×ô%Ʊ¦ÝZi ·Úù/Ÿ›¡Ü:sS<¾ŽÒþoūũ$$‘*1@ª@ç“Ò…`láž²»x®£’)#b¯ 2°ìG­vV–ÚmÇ…­SÅSÞØ8Ý2Ìe’ëæQ‘¡=»mÚhë¨-´2è X_i¾"mFà7ÚR#-²_»²@>˜õ:T6ÚŽ£ñ;FºÒ¡‚ÎÚöÙ–éVÚ$¶Žq¤9}iWGÿ…áÉãñ6Ÿ ù»¸_³iâáYFÕù¦ßuýiù‹ÈK½/Uø©¥Yßé¶¶âæÕ䂿Ö6ŠÚI ­b«““•”]Ýi¾Ó4ýĺÕµpùQrbkt-›£?7sÜzUo1ñ‡´Ù<5¥Ok¦Û¼‹=•±yÚ)ˆ»7,C„ôé@·Ñn4M/þ«‹û;äC&Î%g†ùLŠÃ$Œœr1B—ãC-åÌ–°KŒðªÚ(Üc‰@å2{ƒŸzİÔn4«˜n,.$·»SÃFp~žùô­Ïj“ÛGk£ÚÜ9Ñâ…‰AÞG®IúVw‡¼AuáMB-BÈÂÓ…d)4aÔ©ê#Œúõžã[ï‚tMCÄ(.uØ4»™ÙãL’2]]€,ŠãåÉ$àc4‘üQÕ¾ö/ I`òý”¶êg3´|n >¾Õ÷ÃmO\Õ¿´l§·—e.BËr‹qp,Ä©$ qW£ñLJ_ÄäÁÀ¸Ù®eq*·ÝÊÓƒÏJ~‚!°øgªxc_SžòÎM6ÎVšImîãyŒkœ†‹;aÁÈîi4ïiZÓÝXi²ÐõYátµ½¶’RîØû„3•‡p5 øsÄš?‹¢žæÊæ(Dî·7SÂßgxùØÁR3õÈ­-<'k¨]Ýxuõ)u›t–K;{͆"@<© ’@ÉúR^@üÌÏ è–—5ëkÚ~¡a¢=«}¨ÜDño^6ì,0[v1\à·[É>ÂÒ›}ÇË3c~ÞÙÇ®£Ãúö§âö¸ÒuMR{‹ ay “ÈYmÙFD˜úðG|×1{n–ÒE ÄwˆŒBÏ!\v`#ñ£ ú³·Ó¯‡¼Ú–{õî£2Á<Â.-B®ï,«g$“×¾*i­ñ_ñÍ$Öñ^i“y[¦e·…ãeÈž7óQh°/<'>£«YYêñjæ5¶°’Q$L,]ö« àZf©,ž7ðÌKáýìiksþ“¦X+È `6ÉÉ$ô#¨{…‹áÖ…k§ë:e¦¹ws+\¬J^P|¹FCÉ$sƒÚªx’ÒëÆš^“{¡ir(‘ “N±‰ä[ICgÜÀ‚ ç­Kg¤øRÖÓÆVú…¼©tÆÒÚ5ò®cŒŸ!Ç [1Öªx§RM'HÑLJ§¸µÑ¥Ydi1+Ê æc c·J:_2{Ë]ÃHÓmüS º²FB­«ªºõÏXèWvzUÖg®É¦Ãwu¸¹Ç;Tƒ÷Fx¬ßø{[ñ¿6§agw©[Ý– ¨b,0 ½=±Võ¤ðâOi¹öáª%º-ËÙ°ŒÎG#Ò³|Uâ OOñ ŽÖéí­¢T±Û±´_À@ïš+Èèµ üþ)„êð^5Ú–é­]DJ6†$N9Á…sšÇŠ5¤ñ„ì';í8KHÛ÷l3ò¨^›HÆõ­KÂÚV§®+ÜëéW%^{%˜Äìå œdœý3N›â†§¦ë+ Géö®"Xd…LŠ‹ÇÞ뻨§øþf4{-Xž+K´›-–„)<”ÎyÇ5¯á;uðö‘wây'´¼"·ŽÄ1gVc·2¦1·Ç'5‰â¯Ýèwì×%. •pÏ‚sóŽªyèk_ÁºkØZjΧm2x}íZ8ÀºbpO¨ œöÅ.£é¹OÖgñÞ‹ªh¶zeŽ¤Ê·(4øV´ª™pGãLÐô Ÿiº­ÏŠ4ˈ´«ˆÖ%³g×g*Tç£<û⛫¢ÅáÍXxfÆòÇQh‚Î×W"VhIù¼¼(Çlõ¬ÿ ±×4ÍVÏU½’=*(Ä¿hr\à ?.ÐzçœAG¨ÍÍ[M¹ð…ô>Ó'ÓH•ðIpf–D9 ƒòƒÛÞ¨xf+}gB¿‹]¾–ÓM‚Dh®‚y®’ž €HÈ+ÔgÒ¯ÛËkà]&}WÚԚûÈ›¨á0›QÔq“É `ûQ¥­|TÒ¦´¾¼Y.lY$ŠâæAAXULç'ÒŸ†_Íeá VðÖ§.¢—“ùrßÉn t 2#Ù¹±œç9çð®.Öê[k¥ºB¾llw(# úw®ÚM'þæ‰xºœZ~­q~Â8a†án UåË!ûÙ#Jâ-¦†;¸å–ÜM °f€±—<ŒŽFi1®§«xWø•§éšåšDÓ:Y gXUYqi èE;^};ÁúN¢kZZjúŒ1´ÎLå|•sŠW‚8¬ßÎÚµ†y£ÚKk¢¬TVÑ³Ê Þ d’I9ÉëWu+m*ó@ÑÅ—v:°’6‚?1Þß!”7 ÓÚ›üD¿7Æ¢}aôëý6Òo쇶U‚(˜[•á£$g{žµnþÃBi‹âKFÓTû0ó¾Ë¹?&àǨ\S¼Kâ{ï ¶›aáëé¬ô¤¶Y`–#ƒp[ïHÞsÛµ.§á™ö1ÓÒ›ãjöZóÚÙNö6p"Go xÛåò°ã¿\Ñ®xZMræÓQVv3ßB’Ëos.ÆW<Ç¡À?>¬K¡SÅž$¾³ÕE½Œ­§ØÃ%¼P¶ÇŽÜžæ¯k>Mbk;ùõ;-"æöÙ&{[²à©ÛÃpÞÀ {Š^ñЯ`Ó"³¶¼‹OaÝyrÇ©ëÚ¢ñ>‹­ø»TmbÚÎãPŽú5œLícüJ—KÖ¼B|7,zMœ0ÜÛ[F ½Ü!‹“‚HÏAYÞ'µºÔÞ=mcsiv¡²FmШÏaÚ´õá£i[Øj°K¨ê0D‰qqm1P§ºz6:gÛŠÇñl²µÜ Éaä«Z¢1*#<ãëž´?1¯#ÖÂãQ”Ako-Ô¥Kyp¡v rNϽ/Å?†t«‹$w°D7ÜMap͆f‡ OAéÖ«jz>±ã¥¶Õí k—™ H›‘u8!A c‘ÀéKª®›¡ÚXéúÅœ—Ú„1üæ)¶A$ì$}ìU?êRÜæµ˜{m$Eþ;„pÀžíCäIâøFôû]P‰&Ôã #ì”7Ù·`„È8'ׯ'ڤЖ3àMU³'š/£GÜÇ–Ý}øãñ¬ËØVm*Ú{¹ÌWepˆW&DÏžÝêî‚Gü" çwÚPð8ÆÓÔÿJ:‰ìÌ­±rœþuí:TÚ»M‘€­±cc†v8zõã~|ès‚s^óá¶ht«áä<ˆ¤ÈY#Îì®1žÝsÇlÒnÈ¥»<ßÄ?òÑNzÝ Ïâ*ˆÿê#%òÌÌpp3ÿ먵JÉt¸Q¸síùt­,áL`ùœà`€9ïý)´ÎuÅÇ$ÂsŸ¨¯­ÿcˆJ¾¾qÖXÿô¯“tк¤’I·"¾¹ýŽSþCGÖTøé®z iõ>›1óÒœ©¥JšvÜž•V3#ãü*e “NhäÓˆÀÇAF€CÆ•<žµ'—‘OTÛÎ:Ђ§¦3òóƒš~ÓqÅ?n=ÿ¥!Š¡G4…I©väóÒ,‘@¬4&§=©Á­* 1@$4(ÝN(1Ï4õÒô€„ƒôúФ#&”.)ˆa=©qOíHpOJ.@Ïõ¦‘ŽÇéRž”«ïEĈ‚ëÖ¶¥„EÇcIJ´KÖ\†ò˜ {ŒZâÄŸÚe³n%Ú5V'××]ã†xô)Jß0Ý»û½Íy¶‰lÃG¶r0 ȪìJz³Ú4ì› rz˜Ôþ•>:ÔviåÙÀ¾‘¨ý*lRh4.E*ŒŠUà(§Åà3@Æž´0¥Ç"ŸJfêƒýo\W“ü,þÒþ'û·?ú>ν_VÿI¿Ý5åŸ ”7í)á3ÿLîÿôutÐÝúKÿIf2ø—Ëó?@袊ã:Š( Š( Š( Š( Š( ¿ 5m Ï[ý ­´kÈ·Ø^xÍ­']ܹý¥5MãMËA´1Ú›—W÷0["‚ÊqÜä€1׿¯ˆ¾?†·ø•q"JñJÖ‘7ÊÄde‡ã_wü`žxüc”ˆÚº…õiJ°÷b¾ý¤ â:ÊU[e¢|¤uùÚ¾«`¥¯cȦï5èyö¯aìÖ×6òÇo5ÌQ›ˆd$b_ºÎ§qØ“R[ÉñŽîr,ÜBÌãœOéžØ¨õÝyÚßR³ŽK›K»tbdÛÈ>VŒÐddá¾µµi¡?ˆ®íÄM[,pÝ\« ®È W©!p žµñ×Ks½&Þ…X.4?iòÚ´’ F•­ïT`6 d“=B}9KF'“Ôé€äGÒ¿%bûÀ¶Iíï_¬Ÿ²k™¿gŸK^;byGô©{ÏQÓH[Ýhwòa'·ïxÞ«•s#<1ùSÖ½‡N_øœêˆsóÛDztÃ7ø×‘êà4² –Þù¤ž¦½a•”§@¨ÍL³#BÀɵ±üUBgŒ•‚3.N9?øU ë•Å”Žý¾•D.|wÒÚ÷Ä—n~nk®ø‘ð_]ñ÷‡¾êÞÑÍÿüI­à¼ž'{ Ž=*·Å;]@Ü`e’xë^{yâwº;˦ëZ†œåVÞéРèa+Æ4f®™œâÝš>½ý£|Wÿ ÷áöµâ‘QàÓM¥°n žGP˜ú`·ü¿7´˜¥»…ÝÙSí,Ì„ç'¿½?Æÿ¼kãHàÓµß^ë6˾;kÉ<ÄÝÐ~ ]m2HÙ„Jò}¥QŠä~é‡~ãZã1jºŒ!²&œ9jÃY{?Ákyl$··¸::˜(;H G=3[Z†×ÃÚ•ÅÜwrÈör<ÐÌŠ1å©Èv9뎠ZÈ“W²¸ÖíÖæÍ%š&H^éKb¿.YsÉ=ñ^…¤^Áo§G ,FöÙØKr% üÇч?C^D®uÁ&õg#ž­«6cm™¬ßØNl32nå¼¥ü¥ˆÀ#ŒšáþOs¡\k¶zýµÈÑ¥´x¯`¸Oð•ÝÝXø{×_u¦F·ñ]Ù»Ë}me<Ú}¬€)!yá³ÉQÓ¿ÏxÅxêëVÑüWu5åµÍ£ì½‘‰kI(ä÷\àèOz÷ÔÄkØÏ‡›¥±ŸH·¹óZi#Û+ÈWûzVbÛŠÜóWAðtº EzòÞ%ÕÅݳîŒa,|ÈÉ't¬%lœþ”ù^ Û> ÿ‚}¹ã}×<ã>ÿgk²½¬wkl¢êr‹¸œõÍgèžÔü#©\Þë6ªš\¼w ’£­Â‘€©=O­j/м;wâ‡4hàÔ ›"ÕÖGɘ ¡Ú=Ûp[Û=ëÃÚF±c¬\Á¬Ú]C§4R-ë\£*lîT‘ŒçÅ?Qô$7ºf¡£êÂÚTú]âB¿hîLÏ4{¾cyùrj¡§Â—º×öõÅå¼6î>ÊÛ7?˜AÊáˆùxô«ñ¶¢Yj‡…/5«¨¢Uy/!XÞÝIÁu*N{ àc5^ûÏéRÇ«j«Ù2ËÖbœŒò98ãëŠ÷9{HÞ{…¶Ic„JÁ ’œ Éêǰ÷®³QÕa𽽎“6c«ÉeäžuÞã#oîâ¹;XåžqkbY¦"5^ä“€v2B³±Ó¼S¥Ý^ê+¶× Žc×·)-†÷#Õ<)âj)¬év3ÞZÜ*KñD<µ°~P¤~U«=ÿ„gñ:¡°¹²È«öµœ}–YÇŒ{xú¼Ö‰æÔ¹úzÌ–-fËÈÎÏ/*ç¦s}ë{þ _kÌ&Ö¥¶ÕÌÁ›NËä™q’‹&î2ÜtïFîÁÓSG»Õn|Lú~£-ÀŠw’+Èå'j©Îöü:çØUý*×OðÓ^êÚµ&¡g xÔCå2 €_©ÈÓáøƒ®ø“ZþÌÔÒåšÔÂßzrm§úÓôÿ ?n'Ö%Ôt½bÚÞ'F‚ÎV“ÌÝòí‘YFžiþ qÜM«_´³H Ó9gvã$žI®®{]GÇÚ$ZÃÍa!‚H#Ùl\tŽ?r××CUÔ¥–+X¬ÄÎXAl1g²ŽÂº=Ad×|9n4-:X ¶˜‹»;bò·˜@ħ©ÁÁÇŠ]ú«w7Zo…ô=7KñˆšÅò«º´¼OjŒÜ(dl7¯9›âØu+©¬¯ôè.Fð ´6ªì±ꄎŒsŸ­[v•ƒ¥¯‹%Ôl.ÿx 6Ñ—ÉÏÕñÆs­÷Œµ/ ÜXÙøwS¹°ÒRÝ^ܤ›Lá³¹Ü2Nr;t ]KZ†‰ák½JÝ5}RöÃY™PÝÁ º¼aå\÷댚’óâ׉›Y—G–êXô4Úf.6¬YÛ´cõúÔ:§‚müCsk¨wO°¹Ô#ŽYtû’ë23q…+Éè3Þ™?ÐøŒA6™f–ñÈ-ÍÁ€}¡@7ï#;»ÓÛ`èrÞ#Ñ#Ð5&·Šö B!ÊË <î¶@Ãý½ë£ðMƒé¶wÞ#ÔàWÐ –é"æå‰FTÊ3ƒ’µs~$ðÝÿ†µ&‚þ=¬ùxäÜJ¹8n ëŒóÍkx:,Ú„·M€ö®·2Èà » ãxlKf ©¯l{ø^éu­PEýŸ4~F£xÅ‚†Ž9#€GSBSUO èV-á‹Û¸ì®evšîBV‘p:9µnËñI²ÕµbÓJºË[}£Rvïià®3ÈÎ Æ:SÓT“á–… 鳨jÓj»Éuå‰àؼ ë€ÝÏ•¯e«üLÓìõK;h‰·ÖpùpEgvè×* 0?u{Š=~àó(ø¾ùtk+o  ºŠÚ5i.ü°ZI c”r7çß½aè7öÚEüWwºl:¥¶ZÞrÁN‹å äuÖ¶üP-ô­OÒ¯¬„šÜ0‚×"B (I+á¸îkDi¿ˆëiþÏ9mHn ñëK¨ÖÇQ­x_Äš¯‰_RÓì¯oà•Òx5`sC‚¤°P¹öµ,~—Ålµª‹÷Y ”³zôÜ·lþ=«+Zñ÷ˆ´_½½•ä¶¶ˆcX,!ܼ8^„ίÏà]üH_þ(c›ÏóG0¿žÞ1«”žÝ©þ"¾†V‹âwTñ€Óo'¸ºŽîᢹÓÌ¥S!¸è02síZ:g„´Ÿ_I«Ûø–ËW“O0Ó­£O2Jí wçš,~*jzž°ÚtðÛÇcvín¢;Tóá •_² çžôßü:Õ|5®Ç©êm•gº[‰á»Š]Ñàåv†''¡qžhßÌ~„6>2Ô¼uÆ…<61Ks´3[ÛG ïQ¸+:¨%H\`œµÄÝØÍ¥_Ior‹æÄÅYQà û0$î wɯx{Yµ½µðφ›DÖe„ˆäûKËæ/ñ"‚p =;`Wž„”˜·†tø¬|%©Kâ[{¸´Yä‰í’1åË$¿ßŒ°äm''sI©êVz?…O Ky³Üâòâvep>E%@ÂõÇ©§øVÝüiáGOÕ5³±ÓJKo¨]±)lOËåãÐŽÃ¥^–eø]¡4}FÏZ¹¿œ+_Bžd¨3°þ.yÈíÅ ¸"·oøVÞû^Õ…ƒ[NÖöú…Ú™<õ ˜§œûâ¬ßk²|5Ól,´+ë]InC\K|mÃÅ)8U\qŒ`Ó.ãÕþ*h]Çöeº±™¢–2c¶…ƒ Á—8¸9¨çÞÑmtÍwK·Õ®Ÿ+n‡‡¹$ŒõÇãL^Cu-Sø®³f¶âVS ðÉ4vëæ©äÆ‘ÀéÍføšK}/L³Ñî-#ŸT¶OÞÞÉLœùc0¿•IâXæ×-´Û½ÊeÓÚÛÛ¸?0cÉç äúÓ|Kem¦>£$é¯=ºæ1‚¢0H_3¸lÇçHsO[Cy¿3‹"Ø”ÛãÌÇû9ã5ÔøÏ\¹Ó/ì¡Òn¦´ÒÕ –É0Y;–ì[9Írúuª_Þ[ÛÏw”2>Óq0%#÷ s¥w"ñLþ šËEÒÄ[Z@¤Ï4EÏÌ]wv犅2ׇ,u™¬îoõË}òî’X®bfùºòôÜ9æ©øÒûÃ:©Ó¬Ö/²Ù"Û,JåÀ{'8Ï^)ú§‚µŸM±bÌ—ñ Oq,¡PŒŒŽ1Rjú¾…¡jÖöWúD^ ’Î4ŽâêI2ìÊáXd/Až½é“¹£àW\¿“R°0Ëks‰×íqÇ*‚9F`Üg{sOèë .´+{é‘Ô6¡+¸bãqU`èEfxŽ×X¸ñ_[Ãq*Êé%µÄ1±€1ÇVý—†/5Æ—wi¨ÈàÊ‘*v”ã#=”¶y¨ôšœ¿ˆío­õk†¾ŽPò9q#ƒ‰ò'¨Æ+SÁÐRMBÆæWRÛ4³¹n!#\{äôïYÞ#Õïµ=Je»‘”æ5ˆœˆÀàíÅoø_RÔ¹¨ßS´ñ>‰¨YèZ$z=àU–Xmey>ÒŠp@ IÈÎp=èä–š3øÂöëVŽÇTŽä$QZÅ8š;²åOãƒÉ¨¯5!ã í4= 6æ9U¦²ÓQÛíäÁ$’Ïéo§i:¼~#¶»³ÒTì’#­0?/—¸uý±Nš÷LÑ|5ssáyï|Ù]b¼šëh’%ê¡vò“ÞŸ _¹ ¦‡&‰ Þ/‰ì¯l­ÝÔÚÃ"f2`å€a÷zgŽk”·Hê5šWŽØ¸H‹– žHϵt¶rÜø¿Fº:¦¥³ìL­ÝÓ–7XýOLJæííZ{¤·I"V‘‚o‘°ƒ'©=‡½&5ÔîÆ xÝ߃Œ×¥ÞǦ^Ås-œñ®sop2Æ9®«ÅžÕüI|𽆛uw§Ü¯‚"ë>:`ÈŠžš”÷б®x– Ío£6ËW|i \^G¼±¤ô^xOÄz±âÍTjZmÖ¥kw4fËlã8ôÁw^_[½•¾¸·²jÑ[¢ÜËfÊ}Ör@ÀÈô¬¯kvz´qZÝ=¾Ÿ(-<—*†,pqëëTö55©¼=kqik®Ú\ÜjVÖëÔ¶r… ñë’8“ãrêoÉ,5­˜U‰ mE‹(ã¥hk³Ôîín5V þæ(Ú{i!fÚH9Áã#ÝkÅ÷~¾þÊÓJ‹,$~|jÌÿíÏ\çÛ4 jPñuŒ!­®å”[êÀ’Oi·£×=²0qïXú6‘&¹¨GiŽ»¸$=Ì›éœu­oé·wnºë|Ö×àJ¥ÜoŽA^¸È<ô¬KFu†ÖÞK‰q¸$HYˆõÀ©{•ŽãÄ~)¶Ñ5UÓ“e©G§ ·ón”³1H'·¥Pñ~‘©xƒV••¬×¶7q£ÂaBÂ0Gú³Á5wÄQør-RÖRKÉ/"‰î[bfG óŽ3Y~,Öï,µ£ ¥Ä–v‘"‹Xâr—”ûýjŸ™+È¿®a[\Z[ëIus¨Ãis5œ€@èsÔÁ>Õ“âíNâXyÒËËSj±1 #ÇËŠÔÕ|9o©Ïmy{ªÚè×WP¤’Áp¬Ç8Æî:gƒzMcÅW^¾L±XÞÚÉqµÔA™†3»ž€ç4mä  Ýo@·¸’Î}KQJÔ® GšÞX‹c#†àñ•ÁÁõªÞ+ÖdµH´[E0éÖÑ Ç>kc&LûäŸlÒëºF©â›³¬Á¸[Ü9Ý"† Ü`‘ÆA¨¼Qöm>;]6T[«ûXBKr¯À=vŒp@Î3íGqv1tLé7©r-m¯6‚<›¨ÃÆÞº?hšÇˆµa¨ÛÙ\ßGz‹$~\YëÆÐ¡W?£6šš„gUŽæ["uµp¯žÄý+[ÆZÕßöëçx-ÑZˆÜ€"åÅOBÞúºßö”l¬5{i¯õ{uK‰m¦Ùµ¿»ï·¦}fx×U-©[µŽl´Áý’8ä8 _\õ«ÚÆ…k©½…Ýþ§‘yw¼±Ì…†znã¦F=éÚçŠ.|1q‘¥J¦ÊѬ’¤͟›y=IÏ_J¦J©h–wvz|ú¶©ý—¨Ën¥£’û†~VnFÒW£×uƒá±—£Îe°HÃùòƞ͂[8è2hÔôMSƱlá§Aæ$“¢0pv¡ˆÈÏ¥-ì¶~ŠÛMÕ4èµK¨ïÌÌdó´2œ}iy‚(jð]kº¹D êcaœr§úûzTº+ÿÅ'¨ ´«g'?s¦*/ÜB++«hLZhˆ$Q ;a#ªdçŸs×5>ÿ"^¢qÿ/`dÿ¹O¨žÆ†×7 é½kè? :G§jÅ|ͧ’1Ç©ü‡Ö¾~ðÖLËþø¯d°Óï/Á6ðÚÛFÑÎpO€5-hŠ[³ˆñRlÔ´UEÕüyï’ IúuëRø¯rëÚ"È 2ݨaŒr3øÒ|Eeh£üyüi­‰zÝ.8äÖ߇B™î{Ö#ÿªSîkk@ûã9£¨¢wšx,  îÎyëùV¢¡d¸Ç9öÍdÚ3m\žø޵­åí8 ôÿõÒZš‘é ¸p0D<úGJúïö5εëç¨ÿÇ |‘¤ÆS]pÃÞ¾õõïìb™]_ž~Óÿ´ëž¦–6§×Ðú…cè*M¸µJtð”Ìírüâž#Áýª‘{ê»FAŠ\ q)sÇJF‚cŠ1ëJ4»zP4¸Æ) \c­n iÀsJÃ4Š2õøó—ýÓ^]ð…w~Ò>çþY^Ê{*õ=h¡Kë´×›|¦ý¤|*K‘k~Ø< lÉ?5ÕCwé/ý%™Kâ_/ÌûÖŠ(®3 (¢Š(¢Š(¢Š(¢Š(¢Š+ðÿâ]¤Úwí)ªŒ«[xÖD`¼…aÈÈúWî~SþÓ?Dý¨’ãK¹º¾k«´?–ÝÉi9@ÁlñÁükÑÁ&ç§MLk[Ù´zÿÆ|¯u3ŽDv­ø ¿úõð¿í$?I¹‚ÔG ’ f8?˜¯ÑOøVãÆ£Ó­‘³} qyroÜÍø(fü+ó¯ö™³Ðbý¤>"ÛxYV "ßU{XÕ¥.„ U}¬I'÷ñÉà×ÐãqQ§‡²Hó(Ònõ;k«M-…ݸ·‘’ÙàI u'æêñ 5èzV¸ßc’òÚÕI»Ù%Ìh…V)Ê…gÈÚØŽ0Y»b¸+é¦Ó$ŽÆH’DTYÇš¹ _º“ÛŒdwÒ»Ïêº~™§Ý.é%´½u>LáŒa^B¼àŠùi½6¹Ý %®…¤³ó´;-Fót—+q,2Æ@ ˆ‡nÌã;€©ãŠò›ê¾ñôÚeÛí'3Á©Bq•^wzŽ:æ½"i'¹Ó¡»º¼ð\Ý´ordu ¬øïÓÎÒkˬî5¯ üI„JwÝCtw£e¢uÏ' ‘úKÔ©j­bÙ×íüQªjèškéï8’{¹!Éór3…PFqïXEüÌõ,G8®ŠMCOѵtè¬Ï©£Å%¾Â´g’»œä}saH t&ªìÆDÑeqÆ3ÐWêÏì{7™û5ø#Õ`¸_~.¦¯ÊtÎõçñ_ª±£îýšüò©t?òjj–õ%žÃ§ÈsS9à %`Iÿoÿ¯^7©’.î9bç ç­{™Çˆ¯óŽl?ö¢×‰k—~N«(”ï$íîp)-Íoî”/€bg°k6IžGlc 0AïïVg›Î]ÉäänëôªRÆé–ÜTã?™«±ŸxãF—QC`¢¹&¼ƒâ^—ö]*EfëÖ¾Ô [JKl0 vÏ5óÿÅeݦ\® Ú¤å€Éæ…¸÷>Yº‘-µ•ybD” Ew·Ö“ZNóeŒ7 BT”‚¹õŸÄW v#M] îcˆ>K(Î? ô ›Ë»{§öÂÐÇ,.§‰ÎIQŒSdôÔšù´ýW_‚idk+×1ùâ5[H¿Ù'Ÿzîô;khôئº…¦š9.¢v9ûÅdÛŽúóÓ¢‹Ý^)­æLÎŽÖ®Çz±ëŒO={×¢ÚBšµ´w×rm’ŽbC¢W'Õ”üñŠÊLÞîr:Ž”Ö×ÖzŒwɨC£Eq2´„²Ü¸þ‚FEsþÕtÿˆM­èSÚÚhZ휆ÒêÕ %_™c“Ð7Lö$v®‡I´Õ<)­h—1¥§¹’e °cáõ®gÂ#C×'×#ðŬºv²öÒ=ºÝ͹H3*pp3ì*¿!lﱉoa†<u§ß[yZÝÕÒJ‡1ÀþgŠ˜f`xÅjhöâOjw÷×%óÝÅ 1Èùl`–b8¬ ~nE4ô3húWöcÿ î?‹J¼Ï?ì­~øÄgHn‰~z~ÁÒlý ´åÝ´¶Ÿx¼Ž¿»Ïô¯Ð¿¶4yp ËøsRúŠ?de<«‡ÛÙÝéÇÇz}†«¬ZiÚ‹)‚GÔ‡Ú¶·óÏ9ô©A³¬øËZðÐÑôËémô¸âM+e'R3¸Žù«w?ÖÿÄ]A©YÁÃ%ÃÙ4¬·1n ÎqƒéQê>- <!°°Ôà´MulŽìOÌv9 Ï5§à½jóÄ?ÚÖ1´–sH·1]ï\Ƨ ÈÎFß§j§æ%¡nÓÇpëóÚ>•§X½Ë´)©Glæ6 ¨f`2yëÇ­fi¾Ö|)}-ε§Kk¦ˆgiGÉ2÷AÎF?:Ó‡WðÅ׈›ìZlÖú«HÂ+ápL-.ÏåöÉ÷ã5á†ÔàÕç¶Õ#º3Ã"^-°P˜å†{ƒŒP>‡9©Kk5ü§A-­«ÝÃ,›ÙG¡l ×Quª¯‡|?ks᛫»h¥›mÕ˰YVP£ ‘Ñy$W1¨¥­¾¡(Ó§–âØ7v¹²×km©ÉðûÃpÝéWpêRjs2g‡1¡EɈ«-×ÛŠHlC`<}¤Yêz߈ Òõg€]jßíj9åädŒÔ×~0›ÀQÚhövš~¥n–Áž[Ûd™f,I,…‡ ×ÛÝ+Qø¥¦Újvbθ7AqlòÇmlä4aˆƒÈ§w¦xsOÓtmwG]ZúÚ"]üæ¡VmÁ)Ã}éˆ5ë^.Ô·¤À“Z^*ι¸^€®ÂÁ¾SÓ§J³qâ u`¸Ñ’MB9UXYäÃÊ7´e¶‘»Øt¬[j×zäWút7sXÌ‘µœ¶ñ>Å\ &GR1øVÍöá[ÿ"ϨÜÁ«Ë"yö¢%û)”9ž¼qš]tšœ6µ ôZŒãPYVs#2†9ä®z¥nø>Yu‰n´¸q¤Í I#9ùmŠóæãê}k#Äš¶£ªjRǨHåí¢H\äB? ô·àëËNÞëÂðˆöÞÄæ)QB²Èl;ã;>\œ´_Q³NÓN³ð&©júf±iâ •RÝ 0H·žYÑÇ#ŒÔß¶ê_t;¨-mïl¥IÊD‘ÛC2°+É(aŒõæ—GðÕ߀mõO[‚ÖêÅ¡û8´Žá&K–cÀ%à g<JŠkˆŠË’Oò­=žã¡µƒÀº vþ%ÒãÕ ÕÇ œ¨Œ(Á}ñ·ñgëT¼HZÒôû¯éòÛi¤Sck¾V·“<ïnIÈ ‚jÞ›¦ÚÁá}¾2…ª]f"L\ç?>ïN½ê¶¯­Ÿ éV×–úlò<†î@Y$ qï@ʾ ³µ‹@ÓdÔ¤¹Ä ýÓ/ÊaÏÉægØéíXzE”¥ô6·Z‚i¶îNn%FeSŽ8óÓ5»âdñm¯__Ç¢È"hfÝæ]8/nsŒãŒÖ&‰¢ÝxŽö-:Ì@&}Ì¿h•b^NYˆ=ù¤Á^«ãÛÍW°@l,B@±Í »2¨ûÛ9=Aµcþ†±y¯}¾ÚæÙ,ÚQqö™.ÐM6Ldï${ÔKâ½EÕ µÔ|=m­Íf‘Ã%ôòÈ®Y@°.8®*…ï‡üK'‹¾Ý ­ÔÉ-ÊÉúBßge$;ñ´ ¤d=EèlÛxË÷¾%qmáÛkKÉdd¶ÕÒn…‘“vÌ“íÆkÃ:6±§x©F§iwog—[縉Äm?'ƒžØö­ËKOâ7×ÕVwh` ´’Q’ d ØÆO5‹¡x»\×ußì»ûÛ›»KÆxgµ’BV0s“ŽÛzþýtAúl¢êZ ÕýÆ¥mËn—*©´ó2‘Ô…çó®>k¹µ+³=ÌÍ4’Ï,‡$ú’kºÓ¼3gá &Öí¼Ac®5”nÂÚÑd“òeÃ.6üÜàšâµ-BMoR’æH¡ŠY[%-ã¦}”pÒ§ÈØi7Z¼'>&ÓsÀUR•ÚVFã$g ±Ï5•Ÿü ~¹þßÓ¢ÔúáVdÌe|ÒnC@aßëYöR kÁ÷n¦˜µ8ím÷É%ÜcÀdò  *ƤÇiá{øüWåŠÝGötí¹àïÚ®8]¸Ïúƒ_˜x“ÂVRxLk++[‡[› mò•‘€"BI$‚áŠm½––<)`|U-í´¢YÍmÄYù·†wvqRêúµ¿†ü)mÿ•åÚYÏvÍ=ä»Rq QµoA‚O½5-$ñög{¬kPé÷VóT½ÔKž>¸ü§<â€$×üU7„ôý&×ÂWwVZK«N/ -Ì›°wã é´zÖ_‰mŽ·¥Zx‚êò8ïîWÛËŸ2b§jñŒ¯ZÐÔµcà+ m×ìÊ9k‡º–ßÍ…óÇî÷€qÇ'³¼Qiw¯éÖ~ †ÒÅ¢4Q¢RA ½H=rëÍ»œîas¬^[XZƯq<›#V`›˜ú’@z.±w xZÓJÒ͇Âääó3ÎqÇÒ‘E/C©êšœ7Öv÷éÒÀŸd6±1XÓ òô ƒüëC^Ó<=£kww–Ú±Š/¶%”hcWÇ#žý3Ä~,Ôü3¨ÚÙè·óXéöð#[4'h˜“!É$®øQu›ûkÏí6{øcžK{ÉY]‡'€x{µŸêÚ.½-µÌ––¶¬+xÛä(>é÷ÈïZz‡Ãcu©ùÍ©ÙiÆp· c<¤\"·$ç®öÍ6ÿǧÃÚªØÁ¦X]ZØí„=íªM+m¶æžãÓŠ¥¯xG^Ôõù5!šò+§[ˆ¯:NNF:~¯Ü‘—âíy5}EÒtŠÞ)yaeeé—#©â´|=~³è7ÚMŒPjï 0¼BÞmÄyÉ‹ÇN˜œw¬ÿÜiÓj’ 8 L§lÒ†ÊÊýÈ_áç5¯á»-'GÔoôóq'‰b·lËŠ2FdŒõ,\ô採ЋÂúö0êRk–wvz1·>o›DÎÙù<½Ã«iu£hú¥uá‹›é/J¬s5⪼1ÉB½yÆOÒ¡Ò¼EªøÞÖïIÖuYî,Ö/:;‹’]m™HçèsÏáVml-|e{ªZêÖ:ôì¢~ÊŽcŒ±É.®£ÓÏzîC¢]ßxïGÔmumJF¶´Ëý䥒ؖÆrÏК˜ZÅðïNšþÏUÓõéî™aF¶Gx¢ÁÝó‰OaÏJ#Öu?ˆúMÞ— ¥¬7‘2Ü*ÚA 0-‚Œ äŒ>ÜQ¢xxxGN¿¹ñnŸ7öt»R+”+ÜHr¤€zmõÀ«u©ßüAÑÚ­-!¸°!ÌV‘$ *7Ž0 Üó\|6òÍ0‚8šY¤!5$ž€õ×k:†•w HžÓî´ø¼ànã–S,Œ?€ätQÓÈG+DÞ`r’/*ÀóŸ\Ò~c^G}}k¦iÑlüQïöЉ(¡`’[Â[…p}òp@ëYþ/ÕÚÆ )tIg²Ñ<’Öì$!™óóï#`kQôñ—†ô[UÖmt«ÆÝn'¾b~Òªx'¸Ç­3Sñ5Ç€-4ý'Gx."òÌò]Éu¸,z®sòñþ4z Éê:4Zþ›£jz殚EíÔCÜFd3Ƨ !ÁÈãß­M¬x¶ëÀMm£è1KeJís$ Âé‰Ý¿ œ ô[\ÑõoCe®[¬OçEå¼léWC‚2¼ö¦êWVµ³Òum.^öÞ/žC+$1ÜJœg­1ù Õü=¨øÖh5‹â"î0^)§HÈpûw0H$}j‡‰gµ³¶µÒÞÙ&¿µŒ$·¹Ï]¾„ ã4x­g¿º·º±ŠS§< `X0…@ÁCèAãš_YÛÅie%ä².³%º4‘.6òcÔ6ãó¥Ü:+˜šP°7ðÿj…±95®<ÁèFx®¯Ç>!¿Óõ¨!Ó®æ³ÒÒÝ>ıH@1O«g¯½rºU‚ê—ÐÚÉy оGŸrO–Ÿ\yúWkâOKá‹Ë}ÆÚÒ{{• ][‰<ÆêXnìIâ… =ìE©øfÓ[–ÆöûZ´Ñoo-ÖI¡ºF?7Mß/®¦ë~-»ðž¡“§¤ „b ó²y§©lžÇ}Äq°r9; ®Aç¥G¨êÚNžöözž’ºµÝ´K ³´Î„ü#iǽPñÅÕö±ö¨ÒÊH‘­„¶$xáF=:cÚ®êÖšUíÔëòÙj2ĆámáWPqŒžG8ñÎhˆÌñ”ÓÞë vÈVÒdV·1ƒåˆñ¯Ӧ+Òþ}:tžÖw·™zH‡{VÏŠuK:éˆå4ûU @‚1Œîúœæ³´}Yô[ø®ÒÞÞååÜÄ$CÏ¡ïïIîRØìöO#9ª¾$Ð5_jí¨[[Mt—¡eSÆA=°z ƒj—S»Ð­/-muk ¯îmáX®f·¸1îaÛßýêE®xsTñ> º–Ÿk%̨%E,N9^Hàc­M­Üèú]Ô™Ö.­cH床vLà}ÁƒÐtϵfxÊús­o…Þ;-‰öA!Dxù@ÇzÕÔô]*æ[y5Qô}FHc3D–Þhé÷›ælcåGV.×2¼gu=ήn¢O"ÊDW¶[|„Hû(ç·Nyâ¥ñ6Ÿoµœ×s´ZÄ«Ol8à“ÙˆÚqïSjÞ"Ô¼3v4Ý>f¶¶·@å¼gqúƒúÕOÙÜ_¬:ÓH_'˜É#åÃtÑn²ÇV;êråtÿ_½ŽÏOµ’îåԲňN+ª×æÐtýR =BÖmJ[h–)¦·›ËË£Œç3ß—Þå-WCÔüQ}õ”]­Ú+¨,SЯ'Ö¥Ô¦Òô‘ic©XJîÞ=’ÉÅ0»‘×? Ïñ}ü²j¾dLa²(¦Õc$(ô«÷úE„ñZ˪j_Ùú„°+°ù¡½ r0qŠl]Š>*¹’æêÞkdh¬ +öu8Eé‚}F*ôšv™uc§K¬êRXÝ4'ýL"V+Ÿ°ÈíïNÕ¼E{á{ˆtý"âK{XcR²`flòþ$ŸlÓ/t[ÿɧ£Ü¯ïòuˆ C1Æ æ€ìEâ Oì–úN™;1cd*ÜrY†O~Ù㣦|¨Éÿazs÷3Ö™®Ç‰e,pÝÝ I:0a'8Vx{Òi ÿðç?iÿØ£¨žÌ«ápLëþø¯£ü8¾n“l®|À%PQNã÷_ áÏ×5ó—…T´êüôìVZ•Å" y Ñ?*ÜÏàH©’¼Qqvlå<+Ïã "ÑûC•È;NáÞ©üBFU—iô©¼_3Üx‹I°d–ð? ’8ªþ>pð¡ O'åëŽE ö8¦ÿV¿S[:ààžÕŠßêãúšÙÐ>ÿ'ÓNúÄ M½GAô­DØ"ã~8ÈãŸjÍÓ8œô<žkZ#HB²n-Ç>™¤hE¢D_”ŸÜúcô¯°ÿcñ¬x?é'Ÿûg_ x}kòäñädéšûö/¸Õ: Üž?๪tõ:)ìÏ©Ui긧*þ4õ^9ŒÞœ~cŒP äó@Ðm¥#ž”ð3ô¥ÿn”ð3í@ QNÛøRŽ(è´`úSˆ%¨"˜ {R2î§šNô&áïQØÙ¤F 9É#½YÛíJ£Š¥ QÔÐ £¡¥ Œãë@ Œšpc½.8P=…žÔ`3Þ—a=8¥Ûê) ÊÖ¸±˜çøMp?mÍÇí'áu ?U|” ½¡ÆÓ¯n½«Ð5À„ÿîšâ¾&ßÚKÂßö ÕÏþ=k]47~’ÿÒY”¾%òüÏ·h¢Šä:BŠ( Š( Š( Š( Š( ¹½À?ˆîÍÜܽ Á'÷1]%qœ ïa4¥£8hþhQßÞ^ošâæÒK2â`†5uÚÌ…@*ûIçŒ×ã_íMðNÇàwÆ¿øWH½»Õ,m¤GY.ðÓíš$™K÷ˆÞP·r àgû‡ªEw6™w„Ém|ðºÁ4‰½c©ÚÅ{€pqÞ¿?j‡þ0øñO[‹Æ:”:¾µ%ÑkÛûg%ešDYQð@Ú¬ŒvŒ aÚ©Ô•I§7v'©4–‡’ß\ÄÖ––·±® Cå¸r8˰ûg'ž™>µÞøVÒÇìWPÌbÙ2¤ÖÌ@ÀSâEpqÜ}+‰¾6ú¦c%ÄËm{n¶Ìý¢=Ù\œõ\‘ŸB=+³ð·‡}>ê‹«Û4B ã ¯ñ'¸$ãðõ§-µ0†’ÐÁÖmšâëM‘eÛÇríGf ¿Äá»`±ÉÚøöò/[ZjмúlS›wµa‰#Œ¤ìEvž,†c-„6 '²ŽðÜÖQ\Ñ0êpáñþÉ^õÉÛø—CÖ\òc1ínû»cµ`3OjL‰_©dmþø$+õö$“Íý›¼5Éùf¼_ü˜ñ¯Ë4íêJýAý…¤-û8èÃ?vúñGýþ'úÒjÆGºØ6ÏÜÀ6-××ÌJð¯9m^pàH Ïÿ®½Âá&#œ=›®Go x§ˆ—ÊÔ.þ`­“ÀÈ9ÏZæ¿dË‘UÔlBN£Š¨ñ3§ ,sÛêÀªW`cüF¡¸*GŸéÀdîcê³²XË‚6°ÎáÐ׆|T ÚmÖFr˜Èïô¯iÖÛý€ 9Tuâ¼Gâ"°³Ÿ%™‚:BåBßÍÕÄLêª[’íÇ^õèW‘ó Cˆ"G@˹@nÊOn+Ö`{LŠÏ#¹MwrÍk ·¶d|Û@£!þ`¤ô?ŽO¶i=X“쎋q&¨—vBIí.vJ² f2@Ü„F LW¡Z‹‹èõHg‘™×~VFè_ã$dóê{לkqÜiÚÔRÄäC*G5¬‘‚ŒôPAÜWu§´·º’ Yî#·w ÙùAb>rg»gð¹ÅfÍ!»º9½6òúÊÿF¶¿gy/.íµ;WÀÝlú3´×= x{NÒu-_Sð¾¦úÔÖ6ï40˜ü¹#©#'8öô®„k;ië©,’ BòæÂåþö!´þò知s¾ ðÞ©à~ó]I¢š : $ͬ‚Q"ôÃØç}qCZ•äcÚ ßxwV×uOôYb‚6DÛ–bIPldþ†8n?:Ý·¸›Äš6©wibºf›fÑ´Û±ò‹³ dòÜœ{V*ðyíëO}“Gп°»mý¢4n ›+Ð}ÿrÇúW诋þÈ—€Aäõæ¿9?aç ûEø|Fû{ÅÏý»¹þ•ú3â ‰qžœ:4°£ñCâÔÏpJç2±Ü:ôÍMµT‡Ï#µmx–ìC¨\DªrŸ~ÕÏÍ'ÈQŽ=_òjhüÞ·ñ$fܶ<0=Çò¬«™ƒ–Ú1ÀQÒµ¥ÆÜ2sŽ3X×Qœœ/#±­ŒQ™})Xõãžr¾ ˜ {¨ÀÈhÎqÓ8®¦ìyjK¨9"¹ñTz½­¼ÒXÜÌ·0êL@‡$öÀãf+Ï Þx†ì[ ˆu†y ¼³M›w—WžG8£Ðff‰áSÃÏvþ#Ó/l´imØNfB¾g÷vÁ`pi>cáûë¿ ½âÊ¥íîß dñ·eK`§áù¯5K‹Í?Tžu²hÝ®\þàŽwà㜎êüFßÁ6òêžÖF§+m‡Îò<£y;”³g8ÆzP¼†÷ÔãíäÙqçÈÊYNðgqàŠí®ƒ¯x<ÚZCw4wü$i µ¨lyEvóŽ3¿Ç8¥Ô{"×…´;­>TxŠÊöËC6ٛΣrÙ<½Ã³VZïMÐ|/}{àûGÏ/w·7;VHc=ÚÊ[ŸZ¥á}VóÅ‘jN«¨Hö nd73ÂÕ”‚¯ôÏVµ¥¤?tkí_KÕm5ù¦)l²EòàÉÝ—Vêxã¨üi©FÄ7|1$ºæ¬-&²¸ o©^nu0æ#N{f¤“X‡:M½žŸ=ž±ö·i¤à@@ÀÂ94÷¸Ôþ+é>DBÎÞúÎ`þJ”¶…ÕÆ7s… ïPË> Ñ"Ó¼A§ÃªNó´©iç±.0X:79ö4üáWÅ©uâû~`íÏ^0OZçí/æÓ]g¶íîådŒà¯ãHkcе ? iÚA¯Ë}°aˆ]=™O#ÌÀáRG6+/Tñ†¿§x²k5¹™"Že‰4ôùMÀUÐŒ~uwRð¦âB ËÍr×G¿½Š9f°™±b0J°ànÇCëV/~(ßizáÓ­¼šm¤«IíÕ§U\ ‡ûÀñš­zeêøK‹Åeá×-¥Heiÿ³p¹Êü zÛ ô¨t߈×~!Õ_Nº·³·Žü¼ u¢-ÄLà |À7Ó#<óQ/ífËÄ‚õ&lâ¸óÅé7ª»%3»8튳¦x‡ÃšŽ¼é§hcOÕeóÚøNÅ<Âa8žý³H~¥ 3ÀÚß„/ßQÕìþͧCù²oIe+ƒýì¥r:Œö—WÎöV¦ÊÜŸ–åöûn<šé<+i«YkŨÛÝÃa,-à¹G åc’3ÆsŒW7©Ge ü‹§M,Ö»¿w$êãßf—BšÔëô}FÛÃþ ¿½Ðf¸]h˜¢½šL)·BO1c¤ày©´››Ÿˆ^¾‹^Õšì$Ymõ;Â]U›ƒÇ'#‘ŠO ¼~ðÅçˆ-îm5;Û¥Ke·òÌ‹jKdù¡†ÒNÑŽ¢¥ÚÅOcomkýŒ«qäÛF–ñ̇ ç Ü¯ZdùŽ–oøVÞAeqc­¶©>æœFe· ƒ6°nIéžj «Gâ~‘e>—gÜX–‚k8JAÏÌrBóÐÔÖúrxÃSAâ­,^µìêÖúy›6ŽdܧŒä gµSñ©«øWM—ö2ÚiPË"Ïi4²G)9Þç©cÛt ëų𮋧é~$ÓþõIŸc[#Àe89 œtæ³¼kv5ôÉ´è^ -U!…K0„‚w+RÜäõÍhÃ¥iw>Óeñ=ÅÞ™s—[I"{ËF7ƒÐ»Þ«xÊïûÖÏGÒ.ÞMHo0p.œŸ™˜zƒÛµ¶§%kw-„Ñ\[Jð]Dû’D8*{}k¾¿ðœž0±ÓõÛÝfÃK¼¼€nKùÊü¡×ã8ç=ë„°»:}ÔK34RNѱٔðGµvþ"ðö»ãø4ísNÓžæÚ[q †ª°2¥T>^˜Å.š•×AÚ÷ˆÿá º·Ñ ±±ÔRÎŽIï-ÒS#7ÌJ4º¾ìwO:Ø£û C»o– >£¦üÉ^FŽ£á‹=Mmõ}2mNòÒ)®à¹1£H•Ç wõ¬]n}Z?’ÎfóT[ˆ òØl ØŒ[z¶ \j9Ö5‰´ÝVUFžÚÞÔJ‚Bà[rí'ñÁª—Ÿ5Xh,ç’ÚÖÕ„In?º¼~dw§°#7ÆÚfŸ¦ëGgtf—vg‹oËñ¸+Îyâ®øU"Ѭ®<@×V÷3CD– Ÿ0ùC8Æ6þ'=Ågx«B“L½išXÙ.ȱ‡Ì‘çœ8ìy­ h·6–sk÷ÖŒºŠH ‡gnžXç9Ï~Ôº‡AÖZÍÏŠí/4´µµ·º’?1ڌɷ’¬GcVôŸ ÞøBËP½ñ‰M6XDbÕ¥éNO'pNr)-õ]ãEÔ ðþ.Ÿª´YyeºiKD̨CÓÔœV_†mšú×T‡R–X4Ôˆ<“:–1¾~] ÷<ñí@ý ÔtÛ¿ _EáÝ2}>ë*×a§išH³ÆÞàyúÕOD—Ú«±<¶ö*Qâ™”³,ÙÆös‘ZB=3ºEÞ«á½Væþè2BÓI ÂÖÊÜäÄ’HëÛÖ«Áªj¿m.-5@<öáfŽêîB¨pUŽ\ñL^h¬^ i2]èš„—2Í'“%ÀO-¢\d2zóÍsv×R[Ü­Êmó#a"îPA ädwúW[ý˜ÞÓn¤¾©»+pÇ š0Û‰õç§Ö¹^?´¬øƒhƒ•Ï#=ªXÑÛëvz·ÄMMÕíàF’-öÒÛDz†Eàsž@ô¦^Ocá­LÓ5½-u;À­.Çs[ÆÇ…O9Áëš§âv}OLҦѬæ‡ITeEºC ¹ùƒIìrjÔºv›q hÒø’öæÂé•Ö&‚!,?)pHïœsÒ˜‘SÆRO©Ç¦]Ø@ñéfÙo ˆ· pÈÇ×=Ï\Õ‹›-ãNÒdñ õÕ¥ûÀ6‘¬‡Ê„.>l{Ñâ zçÃPiv:%ÔØ 1'\9bw1üGNÔ·Ú%ß–ËU–þÖÚîæ=’}¾o/Ì+Æàpx4ľ ñ}׆šÃOðô²YiÂ9Š÷YäÈý p+Är_Á´ò¢½Úî’÷…‡€î+CUÕ¡ðìÚ3ÙYêÍl§|ó©a–9ÂîÕZÝ_-¾¯ ý›»·Óô›“oim22Œ‰IßÏÖ™­ø^÷^šÛT†HTßB³4w3„`ǃ׷Æ©’ºëž%¾Ðoÿ³ô¹žÖÂÝTD‡xÆCŸ\æ¤Õ|%â!Õ ò [øÄ».æÅ¿ˆŒõÿ“R×,´ ‹]:mÏW{$T–KÀNöêT#åôç¥QñxÔµýN=A#–êÚh”ÁäFJĽ6:`ö¡½5äCâ›»H :t1$æÖ%îÝq#0§?¥eéiñ_FÚœOi‚`“cg±Î hø† h’ÜNd¯”¾x\l¶}ñŠÍÒlmµ Ô†êý4øŠ“çÈ…€# Àçš—¸ÖÆ·/ïˆ$c!†=ªmÄlBùxùqøU½WB°š{g¿Ô†™}&?i ŸúƒjÇÿ´®¿Ä#ýcþÍrÿ´g…‰ÿ &®ò%tQÝúKòd½þïÌûBŠ(®C (¢Š(¢Š(¢Š(¢Š(¢Š(¢ŠŠêI"¶™á‹Ï™P²E¸.ö…Ééž™¯Ä¯Ú—Æ>3Öþ/ëwÞ0Ògðþ¯u+‡Ó®˜bLq“üXF\…q޵ûu_‹¶Æ}3â÷Æjšu©:L’¤ ÁYìñˆÄ pW9n=¥\>!JÜŽç‚ßYM©[Û]Ûaš50MàÁʲƒØäƒŽâ»o ZßÜè“bé-ŸOU€ÈIVUmÒ'8Ú9<ôÝ\&¡nð[ÙÞ@ù‚O2&UÎbqŒîÿyHÁö5Öè:ôºá`¢ŽØ-ÓJ¿$Š7ùnܘ)aîô­v9¡ñux൱ÓαÊ×Âåe„n2Âê»JöpTú}kšñ=ž‡¯øØOæÊòyÔÏh,bS×f:yÇl×Y~ÒÁb›ÚïíÉ ÷YU•±ž‡9àvÇjã¼Uà…—Ä‰s¦ÝFm®%ly3$LOΤ{6p{ŒSC¶1ë^!ñÌú¯3ÛEf²É%¼£"%EêqÜ æÝpäŽW¸®~DÚÎÓŠ«Û©”—aŒO<ƒ_§?°\žgìíb¿ÜÔïÛæSýkó ¼{w¯Òïø'ü»¿gÝ çf³v3Ÿöb?Ö¡êÈ>ƒ‡Å0äpm%Áÿ!¯ñiòµ‹È3ÉÉí^Ü€¯Š-1ÔÛÊ8ÿ€×‰ø® Þ"»\Œ‰ gó4Öæ«á1¢›p9P$=ÉéU®˜¯ ‘žqV|¢$PG ó“P]($ü»IëTA«aà\1cÈç¹ï^/ñisœà)ãÛíº hì÷ðTç“Ö¼Kâ.^Þð*dì9`O¥43å?ß?—û¾R:ŠïgKy ²Ý8Çl±´¨›¼ÅÎA<Ž„°ÏøW®Í%¶¨dˆ‘*¶U½ w²X«ÛÚ\«§Ûd€Gq±PqÈeÏÈ#Ú“ÜDz†«s§Þ‹8Í´!þë‚ÝøÿJëòê6ßeO Å›œI`K/—܆b7s¸ÛB;[´·¸´ŠäÛRîluÀ>œ×e”Vº¥´Ûü½ÒÅx±Y\îR\gi€6ý*$kÚ(Zø’ÇÄWw7qÃks{=¬WÁH1ÌPbVã,HÉÆ{ó\ÛoxÇW3jRGh°ÍêÜ¡O8ÉàƒžúŠëÖ-3WÔmͼ>\²ê›xY€…®Êtd)=q“\7€|O}qã ´Ý{;Ӯ°ÝÛÈÜļå—Ѓü¨ê/R´š‹éš†ŸáÕ™t¯5n®™™!@8( §šÂàóèk~µðÖ‘­éVE¨›©žî#ÊáH=sÁö¬ÐÝx[$¬Cwg¼þÄ®öŽðÀ=â»´•úEâž4yòAà~5ù©û³Ú/Â=†ë…?ø -~•xœÄžàc·?I+â‘Eh”x€qõz[éÚëjëV³Gk!¹k(Ù¾Òù¶tÁ==üÆRµñ–»ñ Gѵ+æš9cc¿Ý€ŽrqÑxÁ¨SD—Àö×W—ßaÕ"p°¬¿“ÏÏÓ"¥³ñ[xž[Ë4ûM:òòЬáTgﱈì@Æj #@ŸÂöº„ž#Ó¤Mh×ýŸcNû†ÝŒ¹Áó@3“Eû]ËmB’ŰïŠêõ½`i6™'†æº±Òäi7;Kûß4äÛã¥rd,×. WH‹|«Ôõ®êÇÅ×_ 4ÈSÃ×PÞ-ñw’îhC#´!'w©Eu6‹§x£M°ÔµOE£ê³E‡K˜YÄê§ û”ðHõÔ×ÿ¯¼-|4{x­¦Óm"ÿI¶IÔw ‘ž£GÃ7Ÿ’×[µºÓí§š-³Á{t–ÃÌRA1†À ú }÷ŠômÛiZ†¬u{»8ã†MNGL¬=6°1zU Ô«7€µeÖÿµb•~ÀnÿiiÓÎDÎì´{·gÔáâ V½’ßMÐ`ÓõGÞ°jÍ'Îüà”,W'Ø´Ùü/â·ñ*jööóZKr¦-H@ÿge$c/ `à‚jYmü"š”ÙuXC²CpTÛ<ƒ9ÙÀ<ƒž”—?3†¹µ¸²º0ßC5¼È~x§R®;ò5Ôhéo®èk²ØØZÌÚí“Ìdb0cÛ‘‘Œ¼W-=äÚ•Ç›q1•ÉæF5ÚhÖ÷ÿ4Ïìc{ϧ”û$÷’˜ár6ƒQBÚÔž°„x{Q_j‘ï„[Cc›I8õæ•ü;©|E†ßT†æÆÊ´R¥ÝÂ[†e=SvÎzU‹˜Ã+?°jvzf¼÷Ry¢2Þ|  c*ÃóÛSPÐuZÛßø{Cž{(‘’KM6u¶`yàdà‚9£¦¢[—.uýà m¤êž´×®í Mu4®3ÉÚ…{æ²µ}]ºÕ_TÓìo®l «Áw b €@,ÑŽ„U»Øt(a´‡Ä§PMYmÕì›WËœ )$ã0j–­â}_H× WRÛÛ¨D‚\„’< `wÍŠ~.]oÓLÿh%¾Ô²`Ä?òÏ uëžj߃¢·³2ëMt³^Ø«IS¹°¼>}==ª—Šô›M2ø›{¥‘¤%¤µ*CÛ·÷Iïõ­iò-à×®&…,4ü™cÞ<Çœ.Î¥NpOJ:‡M©¥x“Vø‡ö‡pöé<ð™b™#X†S@û¤qÏJ}—‡fø{¦jzì6z…µÒ$1ÙÁt“G+nÏÌPåp±æ™gâ ?Øj:n‹ ZhºœðhX´ê¤3GËpHºÕ/èÓiv¯ü$¶w¶zG–¡£‘ Rw|»7£žÞÔzКþí|Y¡˜<3¢IÃϧؙ&wȲä³Ç# ¨íôÛ[M ñtZ…‹Ç9ÁSdê1ó®Ëœ”ëë½7HðÔ×>{ÄV™Rîâé—ÍA” “Þ¢³„øçJKkZ[¶—ÉKë°Ò .‡ð«—֚߃¯¢ð¾•&œér’]ÚÄï,’&0¤NÐ{U?ÙÅ6•¬¶¶f¶ðóD¬d wy»¾CF ëíZlÓ¼%á‹ÍKÂ7×sÜIpÏupŠ’[§$b{ÒR¾‹aksàûŸøJ¥º²µŠéE¤Á O¸ƒ½B·ðô'56­¬§ƒ<5§¯„¯î µÔÒ4ú‹#Œ…{`S¡žÿâ†äm_RŽ ‹ ”Xõ ç+ÈÄg¦20;Ô³Î>h1[ìßK}9›s'ŸjFÝÊ2yçŠjáäÊwV7ô;-VûR‚Òþ'{wšùʤàrÀ<ŒàñT|Gp<9£Zø}ã·¾˜/œ×EwlÜrMýß_Z·ªØê_4›+Ý'O]¶Å šÂÐŽ&êG®j®¿káÍ?OÖm¥:ÔjÆ=¯´ÛÆ[„qß¡úPŽZÁ­¡º‚[ÈæÐH<Ø£}ŒëÜì}ë©ñ­ä× ¤Ë¥-žˆ-BÚG1òð~ucýìõ5ÊØCo5Ô u3[Û4d™yEîBñŸ¦k»×ü[}౦éÞ¿uÒÖØIÎÀ>Ӹ嘎yÈÆ3Å.…15]H¿·Ò®g¬>ŸA%ÍÚ!n¤zž2HuÏ\kº¬wð]ÚÛ-ú%ÃÃ{>ÙbÜ2räzw©o|k§išÒZˤÙêIfÉÔ&ˆئìžÀŽRñ?†uÿkRêöVW:µÊ¤ñ\ÁeE=#îàÔÚÃxnMacÔ–áï±Ï5»| äcש sÅZmå®­<÷ íÙbœ–U<‚~µ{Á‘ë»›[“ ÒžÙþÐÍÊÆ!‡lç¥PñEåäÚÅÄLWÊm«?"¯l{c¶<'ªÞê¶3ø]î\é³ÄòF™ùa—Þ}Ž0iuBÝ•® ØÞjº.§>§xD–ÜEä†8ß÷Žî?*ŽÓÄ:ÇÄ k­/S¿{–H|è'¸s¶2§£Cš›IðÔþ ŽïY¾šÆòÞ8Lk ¼âe•› AõïQC«Åâ3Q²Ó´‹]+P1 خߴ(?2ãבŒSBa£7ô»ýJüÙj"lZÅm¢hßIqŽœ }MEöçñ†‹qa¤höö7q”‘ítôb×KÓ8$’À‘ÀõéPèz=Æ‘e¨¶¿euk¤ÈªŽ®†7wòò:üêinô;@»ºðËßGrVâK—_24'›@ã=Mƒ)ØésiZUòëÖwV¶nÊ9#1ÊdÓpôà×;À×J­#ÇlXp2ÁsÉÇsŽÕÒi÷³x§H¾‹U¿m–åeŠîoŸc ûäW7 ±–é Y#Ø wl ÉÆIì=é0]NûYñDþ Ñô{? _OŒ¨óð¡á÷A;qÀÛ“Pju×´‹fâúÞÖùC[ÈoËí<2œuçš±©_[ø @Óôk;NÖîžæY%ýìK¸àØ{¢¨ø’Öÿƺn—¨iZ{=œ1v³´+làä€csO –äšÅô~°ÓôK>ÏUž43Êó~ñAs#oLc¥W×´mKÆmg¨hÚd÷vmE¶µˆ·ÙÊðÈíV.­ô­+DÓl¼OmzÚš+[y<1ˆàƒÏSŽÕOÆZ¤–GLM*I,ô³)µÙ'-ýâÇ›9Í^Dº¤ze•¦iâ¯T† öw Ñ.rªÙ$Egø×Ró¯-a´ÌZ["ÚD#f9Ï©ÎI>¦´.´+MkNÓﯵ8ô}Bh@1Ü¡a>€ºÅTñeçöJÇ¡Z•’ÎF2ºŒÊÄd°=†Iâ#ŸÓõ)ô‹¸ní$òîc$«c8®ËXðn­â™"Ö#kxþÙÊcº¸X˜œs·wPzצÝAey÷6qßÂ¤î·•Š«ñÜ‚ t~3‡QÖîíµ kIäÓä·O A ˆœ0hé©]KºÎ£cák‹m*ïIµÖ§³€G4·;²ó…Á ñY^+µ¾Õï¢Ô-íæ¸²š$hZ‰T6qœA­MjÏHŠ+¼A-ݾ° O9­v¶øw‚>ö=ꟊuëÍ'S‚×Nºx, ÔÆÜ:u }ýhd®ƒõ M­c×e¼Žü@¢±m8=È<ã­gkšÕåÜvÖ³Ikghù “ß5§¨øhk’A¨\êVzMÅÜK+ÁvXHꃀx<úÕ GX]ál!† ¸m€O2x/ƒœò8ÔÁx‹N [ßK*GssÊöÍë‘×ñ8÷¬½7K¹ÖnãµµŒK3B– ÇÔ+GÄQÝêw'Wui º¼ÓŽ9ü+1!tòÃo‚™ÍKÜ¥±×x‡SÒ­îá´ŸO7sÛF±Ip&!‰¸àâ²üLn®õO>ÝfkFE6æ0HXñÀÈî+w_дD¾_í]VkMJHÕ¦H`Þ¡ˆçvHÁª~ ñ5ö…¬5ž•q%•¼kK#ÌLu>¹¦HkÖgÚm?´o$¶¿h#7+ {€nù÷ÅWÕ|Q¨iZ„Pé—rÙ[Û*ˆ M´ÇsÖ¤Õ|1uªMo|’ÛÂפÆ+‰v²’:óØðeî­k¢]ÇftëmKì¨#gº\înøç¥=w–‰6¼ÐjIso—h㸛 »¡?CÖ©ë³Gd‘i¾\sIn»^r>bzàAš~»§ÞêwI{\Û\ hÌQ«Ûh¦EMâË+}8ÚÚÝo:Ìp(¹ÚFÕn¡O«€O¨4»…¶1ô›«+KÔ’úÈ_Ûí!¡22dö9R­ã;»éõƸiË‘ h‰ ³N•‘¥ÛZ]^ÅåÓZ@~ô¢=ûOÓ"º-{Å·ÖZ¡·²o³ÚÛQí¨î}I¤¶)î-\É šÎ£sc$(Ò!YFìu9aŽ1Qjþ%¾ÐÓ'’ÎÚÝbØq¼CýOZ.ü1{¯Î—°Ëm\Ƴyw3ˆÈ'Ó=¸ýiú®¥a¢Ïo§½¶®mQUæH,G%FvöúÕ^dèG©h—ž!òõ14+-ÄbGŽâm®ä’ \õÎ3Vµ Í7ÃC¦M§ÚëWq¡ÎÎJ¡' !þµ›â [Íjí/m,å–ÒT$¶‰™b6qœc¥YÔí´èí4øµIn#ÔRIå¨8ùC{еÊ^!¼“Y’;È­¼«1DŠýÜ q´zU0ŸøDo9ãíwìzÕ]jeµ[Z3-‰Œ2ù鞤ûæ®é€Âwòœ›¢7öẉìCáøø_÷Çó¯S^ƒ#3¸×–xCþ>zoêÅÌONÆŽˆkvs^&9ñ†3çõª~9¼QòjÞ¾ÛüM¡‡ŸÐwª¾:FDL@úÐfqì—µ¹  Ö# Ç~µ» )ãÜö¡·°•€P½HžœV‹ec˜dò¿eZ©`!@ëõ«ñ;,, žHÇQïRkbÿ…v¹sŽ‚ÓêkìïØ´ľüãþ^$éþè¯|£ûføàä©äûšû7ö-BtëãÛÏ—ù 空:)ìý¨Ôu4í¿þª]¼ S±Í#2=™#4ìt©øÁ Œ‘íLcqøRíàR‘€)G=h„P9¥ãÓŠ1@ ¯¥.)ÁqÖ—µ0Å(SÍ.3õ¥Ç>”n?*B)ÀqAéšb#=å¤QÇ4ð(¸â—Å)RàÀ c@ síNëJW°â€Í" ‘Jx âÚsF9éJ„Šp9þt 1ÇZ6ät§¸)¬v7¨ ÁÚÀ@qJ¼ŠËëŠb\qÓÜÓ±ƒ@è?¥)8 LL`ú})Øã¯çHì|´â>4éŽ?†¹¯ ŸÚ+Ã$öÐuoýe]/‰¸Ófçµf~Ïp©øû¥³*’¾ÕYIÁûVœ2?Gã]w~’ü™/ü¿3ëš(¢¹€¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¯ÇÏø(>³á-{öÕ›Ãïo#"B.®¬°Q®‚.qûcºg©5û_Ÿ·¯Á¿ü4øÁ%„V=1g´Šù¬Œ®bŽG.%ˆÉ£';Uö |>Y½’ïJ´²x’Þíd>r$e >›r?ÚÕø{_XôyÆFû˜|©Â ,`’x «œŽÅ} sj ¦ØgÜE Ä3Hn9m„ »Áê Î8ü{Waàéím´›™SÉ»ƒb/x…жôo÷·£\Ú¶–Ç$¥¦†¹f¬î²\…º[c““ü167qõ5Ãø«LÔôÏGq³¼’$±I8Qžô#>â½U¾[íœKqf!ò£’vDPÌ7l$vm¼pz®Äzþ­á¯¼N„G£ˆœYTáƒg¾àsøÐ½G3^ë_Ó_Ç7š•†ûm~áZ0Æ>Î’2íúò2F:\¬‘4r2°!ÁõÜ=¾›áˆð”éOvì<ëm,9Ç+©:+gõ®*iIÜîĶ}sÍQ› žq_¤ÿðOwÝðçžšåÏþ‹†¿7¶ýá‘×9+ôkþ àá¾êj ùuéøíƒ T¾æ}O¤â{~S Àÿß5ãþ3/ˆoäeÉõ&½‡"?éÇŽÙqÿ|òþ#¼%íÇæ¥%¹¯Ù9`ù'ãÞ¡š@ÀoVÚ¾¼Õ’ž^< dþU^òÚUNâyPFJ²LM]MÂ9B0yé‚+Ƽ}}‚ìdƒ¸çó¯c¿P-Ü>HÀ Ð z׎ü@p,¦(,§øÓ@|—âäêlûDН¯Ð×d¶s5â«”šØ!€så¼:àƒ×Ú¸ÿ˜ÓTmèÍ|¶$w®¼É3Yé÷{ÏØ§·afùƒ)ð#iqZãï6iuŸjŠ%G–6ê¹%C rFzúcÒ»-6{k+„³0£]±2ù…Î,Œ=A®ïJäu;[=F;ä™,¯’¡L¬Nò:1; ìôm&òP’¡äÙ³FmfŒ8¨ Øs‘ØŠÎ[jkNíès2èpÜÞ¤6“k ×QD¥‹‡’¾¤c×¥døKÇÃÆÞ-“Lñ vö–ú‚ÉÛ­àË á”e€ã=ú×Q®x~kg±M*ë1Zê?mKÁ"î…Ý–Èq÷HÆ28®gÃ:¾ƒãÝ[ÙiÐèúµè™`¾27”òqò“…Ü}8£pz=ìaØè£ÁZ6¿k¨ mJì¤6,‹å¬Ÿ;Ëœ zæ¹íØ8ÍoxsHþÌмUq¬–MB=–¶ðLåYäó0ìûÛqÛ¥a)œŒŠ­3g´~Ç’y´WƒrJ†že<úÁ ¯Ó/4{ž2vpé_˜¿²kù_´7XÛŠàóÖ'Ö¿O¼Dßñ'¹É¡8Å+Ü•¹â.•Þúl/®xÿdw®bñÃB‘Ûñ®»Å'ý"}«—%xSÛo_Ò¹k½Ó G_þ¹¬èüé¯üFcÎFsŒŽ½«.t Næž+^åLg8ã5—pr¯zö~u¹ÎŒ‹–É;Çô®Víf ñ´ŒwÅt7;²G$w5Îê¿-”¼œ€ÃÀ#Ð3äÏö]pϹâ‘Y™3ʶx5£w£Ûø®ËLÔµ=fßIÔ.!ÚæéK} )ÂÈ1Ó#ŽzÕOJ-¼@'W4RRË»r8«ú—‡µˆV–:Õ»Û$í†xg™bÐõŒ0Aè;ƒI£H’j6—ÃZ´ZWØ­®,ì|¸ÃÜBRr¿Qž£šDð±§xŽ=L¼O`&ûA»3!o,üIJgwCŒb¨x‡GÒ5[ ý RêÉ#Š[÷fWܱÁßÒ©Üi!´ñ_Û©-¥¸Þ.v°†HÏ^zci eëmsB¾žé|9£6—¬¥XfóÄ Œ˜…lg kC·žHïí5绳ÓDbIdo1” n§“ÅjYÁáËKû› këJÚ7’' ³ @Ð{U-'X¾ñÒ]iÚ¾¦í Äf[¹~e€©êØþ¼h–g÷N¶’³&J¬„`²ý;q]D­ƒô¨-n`±ÖÚy ëÏ™ cål ŸZæeO°ÞH‘Iû Q(+Qšì¢³·ð¦„–^.ÒæœÉ)–ÚÕ%òåˆ}ÀýÓ‘Ç ñI ‘êÖ[+y|é<›× ¼¶2Î8=G=iî#ŒÕµ‹Ÿjîëa™ð¤¢žÕÑD—&ðüºN›e ^Zl¬Hù†#åµno_|<µ¶¶ð¶§7Ø® J×Û6}§œW$ `|¹4ú\:Ù•äÐtÍjÆÚûZñѵ9¡R"’ÔËæŽØ†r1ØÔ·¿o¼70Ñm&ÒmB¦ÙáWwàeƒvç¶)ÒxJÿâ$pëQêm¬óE‰"Ô.„ÝIfF0zöª·úþ¤ÜÛé÷š=½üÖŠ‘I{&D™}ˆô‰âãJ¹É‘],x”4€~qÕO=úÕïX^M«E~-û& Åy1Sä„*IVn€‘œjÏñ6¨Úß½ÍäryW,d†á‡É*ú©ï€@«>–KzÛOYí.”Çq6¡s{`sŸj]GÐéì$ð͵¶¡yá#©&·«² ÇR:3&;€>¦²<9ysã =FÃVÔ[ìqÂ'×,\[0aÏ©ÎHÅ\Ðôë ^Þjú^±¯qao#ÇDc`O˸äò<Òéúö«ñÞóF¹–çhüø¥±!(rC‘Øúúдã š‡Zd÷Ú6¥m®KtË `>\Xùв7R*‚uÖ>*[‰`ŠÜ]Ú±E¤°# ¨ Ü–ßC‡ú]ÝÆ¹mi¨ÃtËk(’9—%z`UFüë¾H´-?ìQGr^âÎÐ;¹;~WÎI#¨ö§aúêvká­4íRÍ&Ô$,ñ3?g\ŽT©ÁίzÁÒEÛa}M'}<6%ÌM¿ì’ð5¹%½ºø^3­}¢+ÔiÌ/G÷†vç=0y¬-2ÚëØ­ç¼[ W`áÔ²Æ=Hš@Ž—Å%ÔtmZ´Ë¹,tå‚3iR|¯úœä|Ö­ç‚4cRŽ{ÛiW·*’Í§Í Va’Ž2{ŽMZ¸ø—¨|>0hz]µÅŒÆYïm–V˜‘¸²“ÑNxªz¿ÃWĺ”ú¾™5£Y]m¸_´ÞÅèþ­˜1ǰ=)ù1.àß/aÖÇìö˧ù¢µª4èËän ô5NÓáþµ¦jé¨Ìž^ ÆG¼2¡;A9%wnŽØïZSx·Ã'[Ëá¸%»YBkå\7²ÚyäV5ž‘âDñLrÏixEÅÃ#Ï4N!•s‡ù±‚1C}Ãеk¬èí%¾“¡gk Œ¶÷j‘•›ø 1ŠâfI¢›mÊ˃ï, †æ»È4ÿ XÞOq¤^^êöÑ»Çiq¬eÀê®0NÓÈçk‰¾Ôîµ›¿´^\5ÄÍŒÉ!Éöæ“Øhë<$÷/Ò¯ü?y~`Ó­aûM¼óŸÝÚÝ¢¶OãZ¶¶‘ü3ðýþ¡îŸâ oZ;eX•¤·Eq.¬[ŽføvêïÅž¼ðÅœ0Gu~l jr²RGã?{‚Oj¹§ønhú«x»M°]ãŠÉf]ÓJ!•”¸óÖ =ΡñCÃo§ÚÛÞXN$’ÎÂ$‚9•†à`n~4G§C௠¥§‹ôÙ.|û“-¶ž³l’!· å”ðGñUoï­n<"ø^ÒâÆ1r¦ö3)’c‘òŽvŸÎŸ£YYëð“ßͦÃÖÛ[¯,É1Èù×i#+øõ£¨Êþ'Ôb“HÓ[Ã6÷V@g-•žE›ŒïaíÓÚ¡Ô­íµ/ Yßj×ok«d·7›¤ 1¼ämÇ8<æ¯ßkïà H¼)©Í%½Ë4ͨÄm)l* Æ=3T|@·¾3Ò`ñ Äñ … ᵦ*~òÿ{Ÿ¥1­¥³_\Ãj²Ç› @Ò¶ÔR{±ì+¿Öµ»OØéÚº]†¹5¼fI¦¹S"ncœF»Šóûki¯¥ŠÖÞ4òÈ4A–v<w·ÖÚ‹£èö^(³½—U|vÒˆ¤†=ß*>AçÓŽ*PÙˆü9­xÚâËTÑt»›ë)­ÔG œE¾ÎWådÀéÈâ¬jçóÚ[ø– FçUKHÒâ[–0¯èÁ•³Æ+'ƺÜö—ZxÓ&–ÏFËöG mïž™mÙϽ^ÕnœT‹¥Eâ éÚ†¯¬E§\‡x"¸¹üøÁÏ8çƒÆjÍö½/ý;NÓ´É-õ”5Ó\Ëøä,qòÐ Qkj"´Ú-·ˆô=/RÕ5hô«éCG¾áKý¡á_ïÏz~³â7ðuµ†¥ù76É–I§ˆ:ÎìrYAè=)Ú¦‰«|H‡OÕtûty)`2$(®§’›Š®z müÚw†´ý;K×t´Õï`FffO$1á7# Øúâ€*ëºV¥ãAi¬[´âÛ$O"Ç岸]ÄdU½½–Ÿg¦ÝCçjvñíiëÈLt8ÏZwŠšâôÙ\éðÊš[B>Ω",}å$wÖ™¯[E&›a=ó¼:«D7GŒ‡PN»ƒŒQÜ;ºdv2^Bº„³ÁfIó%·@î8ãðy®¯Åž*Ô´«ÛK]2òkM:tÞ[½1Çýk”Óì¥{¨¸†ÛÌb— V4÷'Úë~)Ãmk£¦™a¨ÇiF’ê áØòJ“Ú’Ðl‹VðËø‘luYuK «ØUž Ç*Io3I®x•<5äèvÖv—ðY VšîÌìy8$p¹éQø—AÕüc{mªéöSj]»Ë#å(tÁcY}Æ=:Ï\µ¹ºÔà· q-´»6žHSê@=i‡b§Š÷|‡i‡c/Äz½Õ–¢°Ú»ÙÙ¤jm£GàÆz÷úÓ5Û,×óL‘\ϳÛ7ßéÃ}ÇçZÚψWó"Î(oí-ÑQ¤»„“¿Î5“âu¹Õ.—WËMÒ†óð¶0Tý1CèPÑ4+¯_¥™‹Ïe.<éV5Àëó1º}CÄF“©¥´ú¶¯öeX¤’v`\Ï*Gq°[Í<ˆG$’u5%¾¼Wg®éú j NòæÚý£SqöxÃ.ì{ô>µ(os'Å1^꺫ÞÅo$¶³¨xM´M±Pô^:c¦=ªÖ£c¤£ÀºÅÍÕ¾¢`_4@€…lq»Ž¸Æ5ï_èú©¶Ó'šÂÎ q¿TÇžùÿf¡áùµ§†ù.-­ä¹]¢¸”©Üx$pxïT.Á¯ëWz.¢–úUĶvI ù;$²œ’8$õ>ô·:Þ †Öý®í­g¸O™.œ©b27Ž.¯«[ø~æßMK+]IlÐ#ÉsðíÎHÏðäð>•SZÓµ/4z¥œ—6¯!m¢%`Çp:t¡ù‚ò]–="Ò !+¦‰7=Áå°ØSŒ€:~í7wü!wxû¿i?žÁPjöÿd³µ·¿š”I˜ÁE쯞â¥Óøð}Ð ÜN?Ùº‡Až?¿¯Oçi }+Í<£ÍÎy+ÒJälûÑÑ nÎk^ ø“DÁ9ój«ãpDI–ÜOøÕTŸøJ4L­æ1È>ÕWÇ œcëIl)lrþ®/Æ·48ëXnr‘} nè²ç$qÀ¦LNÆÍYUO1Íh,f\e†áÎü‘Tí”* ¼sÇÒ®„_%ælm'¹¤jjø0ÄÛP!·~å?™¯³¿b±*ôùí7ô¯<†Õõ,‘ ëÛ'½}Ÿû/üJoý5˜þ¢¹ªnŽˆlý¨@àRãæÇëJ£Š\Pgq6ÒcÒŸŒw¥Ûš@3Rãð¥ÆiÄcé€Ý§8­ ìgÚŸ·Öª÷¥Ú1O”¯ ã6ÐPóOdžô”ÄFGôm8õžÕô¯M«ž(ãM—>•_àü—} 㯅õ_ý*Ó+¢ŽïÒ_úKÿ/Ìú¾Š(®C (¢Š(¢Š(¢Š(¢Š(¢Š(¢Š+ñóöèø+«|5ø±}5ψ®¼Rú¢&«æ\§úAŽG’<8>[F ýƒ¯ÇÏÛÎËâ>›ñ–þóÆ‹o]0–ÁôéwB–™hâ#ø&<܂ڨîµ+ìHù…þÎö)éx™eg†T\q†=Ëø]—ƒt›H¬®d•ZT’ÔIlUˆóHfðUÄ|µžõËK Z¾– ’¬öÓ³JNÙcaÊg {ö®“Á3ê6×rO±bˆN>]ܹ+òÓîœã¯µ“Ðâ‡Ä¬fëö¯©èh ò®ñÍ<2HHY@+¹Hà†P¹äa”à\·‹|f±kÑÚ^éÐMö&Uó¤Œ g%Tã;FxÍzU“ØèR_ØÞÑdHÌD§Ü*J”öÈ!ÿhúWžøþûÃz®½n“­Ä7¨6•ØÑçz…ÀϵwèTמ¢ÜøRßMøŸm¨ÝÜ5æ‚ê·vTí*Ë™x®vêtžêiUvrÀŠ é[7:³?Å{? ÝܲÛ<ÈQ#“÷F»ƒŒðFÞk#Q[uÔn¸>@•‚sÉâ©XÎI‘íÈ`xÇLz×è‡ü¤±øAâ=\b?x¿Â¿<6ásžž§­~„Á8äßð»ÅÿsYRGÖÿ –fϨÜâ3¶|ßýÕå_Ò8µû¢0s';»s^°ø#ÒsÈß Çý³jòŸˆó®Ü¯ î!JŽ§Ò…¹ªØåREêsƒTgr ²~ö)êX9Š9&ã’{Õfê*M»`@ 0’kÇ~ Û2XÜÌä.ƒžýkÙµ(ȳ“.“œ×ˆ|M¾ÉvR6çœS@|™â|TÆÏ¶=ø-Œàg­wê}šÂ4 ÖŸeýÜ¡~GÚ@ÀÓ©úןøt𛡠1le¾µÞ[]¤:u†›å«"CçyÁi _è(ê!×ÚTºˆµºµÚÆXÂÉ È‘Á#*ð‘Äô]ÞêêÁ¤Ên³2(A‚gŒàdg•罜Ó[»e’[gˆا÷N¤†Cïѳïí^‡£ÝÞÉhóÈÛ#[§À*X. ×vݹëœg­g-añ:Ã_èÒiðÙ¨—P‡TY2íž23»?Ü*Esz^ƒáKâÇö³ÉzWƒL‘@A&ø†ry®‡W×.4X¢—l“Mª–·…‰Ê0?(úŒû×5mà+mǨéšÌv–²½ÌVð;}©ä…e#ïbzQµŠnûÚSê-·ñ î³9)¥Á„FO¹#8G§=Ma¢–Æ@­ÛmVëdzk— k„6Ð½Üæ#°ÊK oþñÏo­`†ÛœqÆ)ßæc+\õÙqÊ~Ð= ÔÐzåXWêˆÈ:=×oô¯ËÙ‰Â|ðwþÕ‹¯ã_¨þ"´›Ÿà4–§x°vÇv‚žzJå.†N1ÉàJëÇ¥M«é:—-4ýGEÓíb„Äö–ƒ‹g È9 äo­Ãx–D æF%b@8ÈÏ<ý*¶·s;YéÒhKw”¨Û2ÌѾï˜9ONi4\nhê§Cûe¬òÜ]aŽ;‰`qå‚pÇ'ÉBã\Õ­|YöV‘Ú(mÌmà`ÛNjî«£éZ¯Ø§Ôu'Ó5™áÍ·h·+ö [?)# þ3Ôlõ¦0Ýe‚ÝauËè>½érÆŸ éš­.£k¬Å~Ö;å[%Œ‰rÀ9È`;ý*;OÞxñnôÉÅ­µÜ°–†XbXƒ9Øç SêiÖ^ ¹ðæ´º„·¶sÙZ––_.]Òü¬„u=^µ j¶~%K»]#DƒIÔ¥‹¥¡bg畞N´ äÞ&Ó¯^)‘ZHØ©PÙ\qÔ{ŠëtÛ++Ï Åÿ EÅÞ›w -&Šò¾TnR¬GÊ0;÷®RKy4íBK{ø&ŠXœ¤°8Û"°à©¡Ïc]m¢KñFGÕµ˜ì¥±—ÊŽúü»$Š@Ägh'#œt©Có,Ëã-Gáí­•¿…5Kˆ,n#gk6ý “‚s€G§½%Ï‚çñœvÚÂêºu•ÅÜ!žÖþfŽFaÁ)òAã"¥›Ä'áæ›c¦E™¯¤›îï-–â“åï^:sPj¾×|säëš6žnìÞ8ìì …$8À¦û2Qr_éú>®º}Χ^ý›e³ês ʕÀ.ÔvÏaTSÁ^&Ó¼Nš„¶3ý§2BUÌ2DrwÓsÁ«—Ú„â½K][J¸ºÖF²êPÝ•ÌAÝ`1ÏLÖWÛõû¹Iñ-ÁG·`ÞKÆN¶í4ýF¶0|E.“.¦çE‚{k3Ñ'Hs܃Áì1ǽtzuå¿…¼0Ú¾…wpu‚c†îIP!µ-ž#ä–æÀ5Îø†ÇOÓµI#Ó/>Ûc‡)·iÏ+×;õÐè³èrkÑÜÚêwWA"­˜’I"eeÚNG=sHlµgoñSNVÔµkkKËI¶-ö§#$R«¸Xó uÇCK.¢Ÿ, Óf´Ò|G$’<Åçíê:~ì°qÉÀ4Ö‡Pø›¡”ÓlìíîìçÝ%•°Kxå 0…Ü1ƒÏ9¡¬l<¤[éÞ0Ò'º¼;ÅkÇ“-ºqœ°È9#ÏZa±£á}oÇÿa¿ðþ=å«Eå KÝä8Îå ;wíV/…­š+OÚ_Ë®,*“\YÝ“ ¥Np:àŒÖ_‰n§H¬$Ñê BL"2ÌQ³ó cvqWõFÖ•楬+Xº†6šÙ­÷£`6àÃi`9ãŠÚç5â{›ÇÕ® œ•HÛ ?*®>\{c©à\YÞ7v²Õ‘:Æ¿8, †S×#5_ÆZååÕßö\¥…–žLVп%ŽsþÖ«>Ö-ôÝAm%·¶ó¯?wû.é-‚ ¯ $Œþ·aÓS_FðMÏ„ngÖo®ìç±³ŽMÑ[N$yxÚ—žsQÙêÐx¯LÔ´ÝB¶ÒuI¢ ¶Ì±7§,€Áö¨ü1á-kÃÚ³ÝjöYé^T«w,êvK ä’1V,®´´ÍVo Úß[ëÛç7“e#y 9Å Èo}Jú&‡&§j1xÂÊþÏI ÆÀÇ+Kž{ÇÏ£Õµ ?EÐÚo Éu¬ó¯Ÿ=ËŠ$Ò`uúž¯¦hme¥ßi0k7p¬rÜ3•`rNÕ#¨ëÞ¡ñâ OY“VÓ¬/nì$*ö×vð1‰S¨$ wÏ¥^¿‡Ã–v–6¾)‹PMn8${' Qrv‰)ËÇn•Ÿâ/jºˆZÞÂî[K8Õ¼¹ $Xxî½7æ$lÜØø'þ—j ª‰T¼qùcyxÊôÜœäæ²!ñ׈/|@tû›Û™­¥œÂöaÚœluü+JãÀZMö¦eÿ„†ÚÎîWY[Its*“‚T?ÝÏ'®1Hß®nïŸMšÊÁ,žS̶q‹ˆòpI·vsך{y ñ)ØxRßBÕûû^Òö-ÓmØù§ùHÇçŠåµmUµÝA®ZÞ v| –ñˆÓÀÀíÉïֺˇzï†õ8õ+è"]6&{”¸ŠU+‚J¬NHìGæ¹-^âÆêø¾ŸfÖVíŒB\¾¨'žzâ¥ìWS¦Ðï¡ÿ„cS³Òl¶ºþþå$fkˆ·å‚.p¤ tŠ<7ÿ=UµñÅÌdb9æE/,Rç(n¹Èö§xj[=Ú–§¥Ï<ž Š-’FÈ[¡~dCÕ¸>”í&ÿPøƒ¦ê6•è&—1ß\p‘ãGcŸBx W,ý¾ÛÁ:÷¾Ô®.¥¹™ašõâЀ Žqžy¦‡Ô~)èÍ6¡¨Â—öû]ô…DaÂçæôéRAd~èw7sI§ëO"ÂÆ|ë|/ÌK>œS.ÅßÄm(t-";y,æ->b +nIÛЊæ=¥´ø{¡ÛÙßÙØx†æêV›Êrd†$VÇR}=+3ı\x§I´ÕtÍâ—@{“k^-¼ðGØôM"He±·ˆH'–Âä±Ý»žÜô_Xðž£ã)­õ›G€-ôJì——+ ˆÊñÅúÅ—‡ì4ý'SÑíµ‹»h‰yff0ÄŠTòj‰ì5M~æJÂÊ{=á_'ì‘°ÆÃ´pAãò§ÐJæ…ÿˆô}.ê +ý jkX’.§wWÈÿtŒã¶sXÚí®¯>¸níá¹™$`ÖÓAm+ü8#ŠÖ×­tO´[¦·%ÔÏ“¹û6Ò±ü\}ìc'>µˆ˜nAÜw«—Ú¤ŽÛI›O°ÖeI’K„''8C»î:ÖoŠV}U ÕmíÊéϪ,c䀎 {sš~C0í,nu+˜m-`k‹‰[lqF2Î}®×[mN·Ó¬µ›[«JuY¤·“Ë1Ÿî¹"¸T¸x ȎѺœ‰à¡®×RÐl58ôëÍKYL¼¹ZQ$fMÞÁÈëR†Ê^/Ö.lï­E„òZi‚Ý>È#b §õ9ëZ:†ƒ§k/ey«kèw·Ë$©$ .ãÐ)$sÍ&«ã ï][éº<‹­¬*Y"V2ç’üç‚j [Ú—‹æ·Õ­Uo" Ë4«Ö7ÅQ=™.±âËï ]G¥éŒÚÚ%@Ó s&FsÏ@sÚ©jÔwZ\òÙØÁVNYOr{Ÿþ½X¿ÐWUŽÖö[ûk «ˆÕšÞã “ý쎀õÅ;P×?áiAÚBƒ{ÜÄ9ëÆzM/0ZèPÕ¢kÝ>×QšP·r'ÎÕÀ8 >¢¬Ø!_\1îº`za·â)¾#†ëZ‚=r8÷ÚÊ¡d UºmÀÀŽ0*}<Çÿ Ç'Íûcœc`ïO¨žÅo6.S¾\W¦?̯1ð‰ÅÂÿ¾+Óà{R{·g3¬Œx›G*só±ÀúUI½“Њ½~_hjNçÏ·Ê}k3ÆgçP cþ4"^Ìæ$ábúè|>›±Î1ÍsÒ}ØÏµt~Æ5ŸNmkEY,"csi1ó­#Ý$QÔ• ƒìÀú×GàdÔÞØZÆ»&¶Û}kÊüá=:ûYI-5mš¸ópìF?×AâßÝ¡¸*Š`‘TG^xÊŸø þ•Èü@ð…Ô÷¶š–Ÿ›•ẕ̌©ÉµpPût ú7±¤£mYs’z5M[U»ñ§†#·Tehì•§OÞ•ÏMÝBÖn±j,u[«Eí¼­Aààâ¶¼CâÛyðÎ=}k‰ø}ð0|m±Õ¯%×I‚ …´XƒÍ26ÝÌ~ðÀ_ε¥ T—,Q.J*íŸøYõ7ã%Ýï]Η,0hÖNëˆâ-æÚêHùǸéǨ¯¡~*ÿÁ;uýI¾Ö´Ïéú«B¬éfÖòC,„ÛW¨Î¯¥|צm ¬LÆ[¨‘·Hv†êߌùÖ“¡:~ô–€¤žÆž¥,öqؘ’ÚH‹Æêq½ƒaÁ÷µ¼g{¨m£‡Q[5™æ±bÀ´‡å.§Áù¬ µ9ì-ãµB r¨˜‡PÊrHùsÓ¦+RãDžöæ×T³ÿHµ¹ˆ3ÆoÇÊÊG\qz`×<‘kW Ë¯-½ÄÓ^Ûüš~£gŒy¨»HÝîÃgµdéž ñ‚¾#Å©Äî¶°Ü´ñêªT¤©÷·u=GP}륺ÕôRçþ&P(0ÞÛ[]]+’Êj»¯NÁ#¯S“\n¯ø_âד}Úš+²³ÚI–‚XûB¥zê1Y²ôõ5›bã\ƒÃ–XÃr¯szwoIX0 1ò(9?ˆ®o+’H-îk¦šçNÐï¹aÈÈâšÙ\‡cÒÿfù |Ãþ'6Àý ×ꦶ¥ô‹‚ü³"¿(ÿg©<ŸÞaÔkvŸú0Wêî´AÒ®3ÿ<Ï…BÔ•¹âþ,Rnö¨ áî<äb¸»ÂË;Û@ìsø×câÉ W‘¥¿pžÃ¿5ÆÎŠù$f玔QøšÿÄftï¼pIíÀïT¤TÎIažÀµvfaòç+íßÖ¨Mžý$v­Y‰Ÿxû˜ƒÆz‚+PeÁlds[·®Hlöô®Sµ2IÀ;àt¡Ï“þ$BOˆ¤A»a™¹qÞ«^ëw>±ÓâÑ/fŽÊui~ѦVÎ#Û*çÄ´xüE*+a1‡lКëx ÆÞÖÑ,5qºfšæÜMÀØpxæ—[¢ã°š‡†ŸÅØê§R´´º¼ˆy–÷NÊ䃷rðFÇ-ÿŒmáÕ#Ó›K²‘-™ Ò@¾xeãvìdóëPë>Ô¼T,õ}2$– ­Ô˜–EŒÀËÃ*© ÏfúÿË­[Û^éÒI©DR9ï’b"y9dïÏž¥\‡MðWˆ4}rFþÊTÓ Î&½õR. a‘ê;Tiq 4óxrÒîßPŽ*—2 ÜüÌœd;T6¯¯/RêX癣š97yL‡® ãr>•~ßOÐt4»Õ4^çQ¾´‰˜[Ín#ò²@ÜqÞOaëÞ’ìpÞa¹¸ónec¸üÎy&»h­¯¾$èPÁg¬7šs„xÁŽÚ)#+…rN˃Üç5Ç]ÞO¬j\ÝÍæO3n’fþ#Üšéeñ‡c·ÐtùVH&êÖÍ^GíÂË“ŽGlÒCêi;Øø/M¶ÒüO¢C¬ÜwŽ%¹*`CýÙ#lžz‘YÞ$MGPk;½Öôi l¾HµGq>ò±ÁîjÌVZlZ”~.þѵdt·û8eŒîW3œt¨µo_øKì¶¾Ô®m4©`߈û~Ñ’wo‚sÁ)ú¿}¢ø^þþ#«j—š~±:#Oo ñÈ#=ý3NOŠ~"þ×þŸ¾»þÄó~ÊÚošØHó·ß½^·ñ4±êrxNÓ/o%“N¼órÄrT„+ƒŽ2EI7Ä•ME4™t½=l`›ËŸb‰oýÒæm»Ï® Å=ž‚Ñùœo‰4øFõG´–×ê9Ymœ°Ç£d 0ï]ƒfÚ‡q¬ëVPÞi7è« ™—‰Ü7Sµ·&ܸ<úW7¯hÞ¿òoãÚî<ÄpÁ„ŠO O_CÍt>‚&Ó5S­ÇqmáÙc÷"üæ@ØS a‚~ö}ªz•¹=ü靸mÇ…t‰¬bK ×VvìóI’¿+’Åx?JM?OÒîô Qâû«ý-¢–Híd†$̼\”ù©o5 ?Ãkß__5ÂÇsuuµ&‹*£oO­,ÒüJÓ-ï5­~ 6îÞV„_ê†FK…88ʆ9:¯_¸_Ò,tß G¬èšÑÕïm``±ˆ|³c‚än;†)ºW5Ÿj'HÕn¥’Êð<yƒ ãÃÒ#Âóx2[½^êîÆòÖÚS¬Â_4·Ê†8óOñ A®êß-/tëÛ¨þÕ‹ˆç“÷hppUÏNsÁ>”Ø4æð&tu›[]N;Éa´oŠä—ܧ¨Qm|<_¦ßiÚ.‹o§j.ªæ+0GÚO+ÉëÈâ£Òtuдëø|[ay€tòáË—ÍÏT$Ó9ë@ ÕCø—Ë>‡¦}’ÎÒVk«+bÏå’2$9ÉÛŒòzf¹+{–³Ì‘»Å:RD8+ïšêu«›M;ÃÈÞ’æ=>âà¬í;7p*¶ããŽkÒu9ô{Èïí¦òo-Ø<$¨o›èxüèØÞèZ~¿m§ßêúäZ¥qn›¢–ظ˜ !!† ê*Ö£ñ/RðËèz|VͦZ¢BêÝ%v ²³ ®sÔUmGÂÚ—Äk­ÛÜYC%Ô I åÒÀw®T” ÁSŽ*Ωâ}D»·Ó5Ùë“ÙÂI3:ÊÛX·¶sïš~‚D_ õ½OTþÒ³x$´™–äJ÷q‰‘NLeƒdg ªí¯Šü/7‰%ðôÞ¼¾\Z¡šL,œ!vÓ펆±u­IJx–MJÖÒöâ™d‚ö(\ÂTà¯ÌÐ0y­¦Ó¼.¾û.uÖãx¶Û´–Lçh8 xêyô¡o újsÚ5†·Š/ín¼¹ÅȸW²s¼äŒc"±5Ë}2ÛQtÒ.g¹µÛ%Ê|ãžÏOjé´ïkÚÖº4Ûû»‹›;© ¼–LdžÈàvÛšæµíhZ›[%í½ø^D¶ìJý@äwíIÒxRÒ?è÷¾%{›kÙ&€X ÌêÌvæQŒmüNsVmµkhwúM…¥ú¸Xl¢X…Ê©ÃéÈÎEVð^“%…ž¡­êÑ0Ðe·’Áé-/<yÉ«QÞéw^ÕÇ…l'ÓïF×),ÆY Üùg¨äŒŠ;Kðü¾ðþ¢|[§Hš}Ĉ°Ù +È9.¤g½WÕ5(|+æxR« Ö/7ÈÏ.@ù #øzþ5†cWеK\\Úé±4oã!wŠRqµCuÈíVÞþßÀz#ÝøcR–õ®çò¤¼xÂl 2®N'špõ*YCmâ,Þ ÔÞÂ[yŒV÷o˜ed©ß5¹z|-¢Ã¤i—k{exi.ü¬ `N1´w«RCñ/EK©.`Q³œÄíq Š9U†F?Ú9úŠVEð†ãÑõkmFòwy•·‡[u8FI#ùÐ#µ-æŠy!Žá#1‚Oºàuu¾&´½ñež•¤i²}a0‹;HÙ…»©ù‡rAÏó\ºÂeG¸W6âEó<³†ÛÜ{⺯ë¥ÚiI \\Yèû fyŒû¾mä7JKbº“ê6M¦oâf¼‡TH0ÂÓãLåÃÈõª~ ñî}k•u%¥„p¡µÚxu<î>§9Í]ºÐ­¼G§iš–¥«Ã£ßO ö¤fóÀ8Wã¦EK¬xª_<6œ"¼³·‰O›uo5%†zNW˜¼†ÝxBßÄr[ßË­ÙiwW±,­kt¶â:ü ã8õ[TñZè÷é`š}­Í½¢¤E®¡#HcÓÚ“Yð¶­â«”Õì¢0]Ʋ Ò¢²…pHî8ÅO¨êš7QZêÚc_^Ĉ“ÞE+&XrÁÇô¤?SÅ:Eݽٿ‘Yí.Ï™ Ä‚H êUŸYÜ=ûÍ$.’`‘nee>QLr3Ó9#޵OÅizº¼í8(àÄØ; `mÇn˜«~½¹¾”èm<ͦܣ™! òFØÏ˜LŒiu…½>=ÂËÝêêâþÞéÂÚ2aޤf—GÖµ,ÚF¥«\\Z¬-*Iu34pÇ'®n*{? [ø]î5Q«Ùj«kÄ6»·<|àŒmõëQÅâKŸZO¤¥••­Ü¨Z9,í’7˜ƒ’ŒT}³Ò©] G®åˆ4;ÚÝjÚºnºY<˜¢³.é’FLÑxãõ¨&ñ×,/lítë++¶Sku¤"ÇäÓtÏ ßøao'ñ=¶—$%Y県`HÈÎsïK}¨ho¥^Ká>ëM¸P<á=מŠê‡hÛŽýzŠHe7I}ÚóûvÎh¬‰_ôrÞ[»‚>éíÇã½`îpÒÜ·Õ‚çõ VÖŒÇ]±½ƒR¼xí`Û ¹œÄÙÆ1žr;{V(·ÿI1$ÊT¢CÀÆzý(©Ü_ø™ü¢éñxZöàYÌòHײ¢¬ŽAÆÆQ1éQ^ÙÞ|DÓíuK«ë{{øË[Ê÷²Y±ÈeàóÎ „Ðø'A³Óž-f[‡{†‚ñÐl$}ÅRÔl/<]¦X\i:{³9㨤t}:ê+MnÒâòúÄS½½ÀL0<Œ€AãŒó@½JÚŽ‡ªø²õ/4û)¯Vå*D£+Ž ãê*Åòi:LvÖzí¥ÍÖ£[$0M嘎~éà䎕ŸâbhõÍ«µ‰~Ínp#Ç÷5=Þ•¨–w7ºŒZ}ÔÑ Ë*»œ8éÇ=èÜ}_ÅWq½Ì d†ÛN1)·Œ1?.9Éîs֬؂þ˜ŽqpÄÿß"£×®×JA¤YÈ'µHÀiŠÿ­$ä°Ï ÍMjsà"à\ÉÇühê.…_®nÓýñÅzq&NGæ^SöÈÿßé2&3Ó¥d5k³žÔ\i*_ÿA5•ã |ÉG9äZÐÔÓÌñF˜ª1Ãð~†¨x½0ÈIÉl§Zög;!â Ooë]€~N;W?*àCë·úÖþ„¸ ˜Üí­%eLvãà»%Ê•eo»YP¾"äØúýjçA8n†¥‚Â˨$®Äú÷¯¶b•Ûá»®:É7ÓïŠø§áê¼ÕwuPƒŽëíÏØµqá‹‚?¿7þ†+š¦èÚ?CéuZv=©Bç­)ŒF‘J@ë@^”¿J`&r}¨À&—ëK€ ~cåÆ)@çÚõÇj`˜§£0 RqÎ:Ó±Ÿoz1Å1 ÆýTSñŠL i  Ó±ÇZ;P1F)øiJLsÏ„çáÓ¥!δõ¥àvâŒ`0sK’84g “Ú˜… ÇJR;*U=ñøÒúPOAÖŒIƒž´üg4À3ùÓ¶#1<MqPê’y:}ÄJÆOJÎj-TݼLx/Î+¬ˆb!JòÏj‚òò$åGàkÕ€ÂãÚ›V)»¤s¾.ÿ{qRü\|sÑN?æZÕÿô«K¨ïÍOÑEÊnQEQEQEQEQEQEùÿ;Ò<%eñI[K bâÄÜj‘ Ìd&9%UÁf#z’Ü•uë_§5ù}ÿ1ø/áïø×LñN—},:§‰ ÷Vwï_:3 –$¢Èð>èdãQ·2ºß+³è|?$³iVþlLK/”]W(1ór:žÃØÓî-†±¥ÛOj¤\Û»¤Öê@‘"¨ þ†°Y\Ãsš †@"fçzœ‡R;ŽF}ÈïUo#ÿ‰M½Í¸?gIŒsóó#‘”'Ø€À{Šè<ÿ"Ρsoƒimª@ÓˆUš#›^$c÷O± >§½sž?–•w¦\Ç$‘Ø\Û,–¬¬~`7ûA}+cRTÔ4;fšU·™7Åæ°Ïš™ÚÇj©âßêZ8±²DW¶0G)óS)/QÛ…Æ}hè4Ëz½î’u¯ë²´z¼¼ö¸†ù[ŽÄŸ¡¬jâKÍfîâã‰f•¤lz“šÑÖ|-o©øƒH×­dgÒg†;«Å‘†èJŸzçuØÕO]Áâ Ûˆ#òá’V(›vì^ø£ä y”kÛsÏ5÷übRÚÆq‹«Õ&ÿ ø8¿)9=kîŸø&œ¤iÿp<ÛkRÌϯõ¶Ùs¦°8ÅÜG'ýá^oñ>cý½qÓŽ7a^‹âú{ž»‡#þ+Í~-£§ŠîØ`\Ó[š­ŽB6ù²®08äõú œ²²üÄdô}Ú­d»Tžœ}M[òðAþ"qTÉ8Œ:Ëé~»1±c;[§SŠñX|R«û4ê:l˜Õ®5ÆžVM²4ion½5Þ~Ò¸²ÐþÊIDqé_6E¹ü3§HŠK‘ù2×n³ å4µ±”áÏd}ÙðgSžãövø{-ÄóK*‚Ò;¹fc¾\äŸlÀWÉÿ´Ã+xÂß^ÒXGi­‰&k2ÁDNB³ö9²kê/‚òn~Çý4×I«Ã¿jòÏÁ¬Ã÷{$ õQ⾚´#<,¹ºjqÓmNݞ丷Kx"¸„NÃs¨ U£¶G®3ñ«:­Ä…ÄjÂÆâki¸2ŸöƒŸÀ÷¨'–Ö]>Ù.¬ñ—K>d$0=ι«7•î‘}gk›D’Ä3•”7Vôê#Ú¾>G ijºv—«\Ïí¬,¿ý‡Fþu—] º•âÑàø}âFÒù.á’ÖÁÕ•Ùc$î½Wå8úæ¹Fu, äÚº[O ¿ƒµÏ¾¾<Ó S[ÚLKywSm*GPƒzt®f& ·®?*ž–D»÷ÀrÆ¿üNí;ñþµkõw[b4Ë“þÁ¯ÉŸ‚²ù?¼ý1­Yœú~ùkõ›\?è@Œ|ŒVÄ-ÏñéušÑ“vÓáGA‚ƹÒHsŒÇ#Œjî¼rªÓZeŠ'8ñšâæ Á%{c½gGá:ëüqBå•Õ°Ç=–ï_þΚÖmÚSmâÙ~Ñ? bØÉ5RÇÁÚ¯ƒoÚûTŠ!§,n')2H%BÚ@$©ÐÒÜÛ¬©+1ꛇ—û?Sø§¦[Ü,ÖV×–lÑ?Ú%[h¤æÆîݺR\ê6 ´²Ò5Ï_¹‰YÜË#b Ìp¨èÃ#¾sŠ~ad.£à oŲ®»¦%¼–w’¨{¨£x¸è˜1Ž °uß >°mn´UŸTWÿk‹‡ÒŽ74yÚFF:{Ö^½£øƒ\½ƒVÒtëéôÃbÖ[8]ã…@á Q€AÏZÑ—OðÅljSí“Üë4ˆf·@¦Ù¦À%wc ëB×`{jq:͵ý½ëF9¢•ذ2©'æ\õ_qÅt^ωì/ô{»Óm¥Ûij­Üùd³`ÝH›'X> ÖoõRf¿‘Œ‘»(Ïs÷G Ñh7W~)Ñn¼3±¯—šÞLkndvôù² ï@2úªü5Ñ¥¼Òõ;=yï%ùðÄZ 2C+¼sÜT7ÚŸÅ-&;›+{8®l]’kXLvѰ è¿(Ï sÞ§°Ó[áöƒw&¿akªÛ]ÏÃbfߌ¹%‹¡ÈÀ8àƒU53Åz¼žÑå¶µ†w7!åhØ•³ËÇô£ "v“Gð¦™e¦ø«Cm^õC°HnÌ/n¤ð»”ÝýG¥fxªKÙ.ìî´˜îbÒlüÌ#^áˆþ sœÖ’i1д×ñÎ¥¦^üñÂ-¡)Œ<Ä|ÔÎi/¼s¬x{[ ê76:a·WGFÛöµl埈ÇnhAêfxæÒÄ47mq"k“ª½í—–q±QÈlõ=HÀǽVðf†úÖ©­{¼vL'eg"GU9"1ŽOkÆú:Mkíp¬š†Ù›ObÞ|9Pw1´žœ“êSðv‘«jú½´úr,]%–àcl »ï7µpé¡Òéž:ƒ_Õd²M"ÃNšôI öð„™Yó·sÎsɪ~ð–­áBæã]Ó¦µÑÄ.·~aÂ̸áAÉè{V¦›¨xFç\tÑ4»¨u²Òýšæ[ŒÀòa±„ížÞ•ÏøF[íCWŸMÔÞá¬."]ù¤þé@ÎðpE£l¹ý££®•©Íák+ËÁù«<þc,Yù™ôÍSðù_é„Ö¥%½¶É#¼uó<·'q‘œzÐÓ¡Ó¼#m¬h:ÉÖ.á‹ËU6Æ/(9»Çp¡u½[â­­Å•ýÜ_n€$±\Kˆãaœmvüx&€ó*ÜÊ<£±ÑõÔRýÚ6»Xö¦Ð¸)´“‚rk–ÓnRÖñ.f¶†î(˜3[LNÉF~éÇ8>ÕÙ\i­à h5h,5g½!Žq4HBó e?{æéùŠã4ÕµkÔ{Èå{%`fX[³<í'½ ;h:·ŒZÏUÐt››­5íÕRÞÂqhÀcÀÉê2>µsTƒÂÑÍi‰P[ñ­Ä–2 @ØÀO8ÆH"²üU¯\é'KE»žËHû(kRµ›$î/ŒeÃdÒÔ¼1§xŽkKíKÄú©{rMiq 6æÆ7‚ÃÞ®#?Yñž¹¤x¢KH.å†Ú)8ìbݼx@ò1ùÖ‰ø{§ÿo´‘xŽÍ$ó͉ö…ÇͰ`·ãN»ø¡¨xwQ:L0[I¦Z2ŲâÙ\.2CH=ø¤ üE.¸5Ks°û@Ÿí¿i|iÛŒ{·dÓýA}Ķß§ñ¬4û‹ >Ú+’öñÞCcÝF[!XÈq9#<× ­h7þÔ^ÏP€Ãp¸;wÜ äÖ½×ÄÞ¾ÖV %ލdAª›—dy;Y£-´OŽ+Íï’î¦[åš9³–¹¤üÁy7€â7Òêv÷ÌÐè’Z»\ÈÀín ²öÝ»+^ÐiÒu-cÂúΣ{${çˆFÖÊÇ–ÀëÐsYÞÔnõëkÏ ÉpÃKš&Œ9ÂÛÈ£vÿ¡ÆÖ´ôÍ|?ÓõbMBÃX¡û:ÛÚ9’9 ž’Qŵީ¨|JÒ/týBñ>Óm¶x.§;Ps‚ŒG®r)ÑÚ‡ZÏö„V:É¿•Q-Ãù°ay,N>÷4[]MãíûLÑô›k-D:ÎÖ¶(¨.Pp}9Ž)º^†4+ø|a§]%±™›¼¹wã–SéŒSBØ®ÕWÅÐÝj–ú]ö‘k*èí"‚ÑY„ Î­Ž‡$rzÔ×öZ=ÅžšÞ#»»°Õ¸!@Ä®~Bàò(@º¾,:„º”w–±L–Ä­jm‘‚*zqÀ äV–©¥è7w¶íªê3iÚ”°Æn!†É¿Îx'Œþ5¹â½G×ñXiWOk§ÛÄ¢‘HÎãëš~¡áñ¦§£ck%äk3ZÝHR@Ç®8#dtëOñàex»Y»¸½:{–K;LG ~ ~•{šä²XËáõŠÝ~ÔåÝ, ç«‘žf7m;GÀÍVñ~¸·Oœ-âo±(‹íEšBsu#ŽéÍXðõ•­¥ÄPÙ0×Þ ½ÛK”*WîlèÃ{â—PèK£xGSðõÄ÷šÍ£Ù驉K2‘0#„Éàûb¤]KAžÂëþÝ&ëOÕV]æº2†OâØ1ÅfxMn/5ìïLßa’7BFÅ;†{çZÓ±³Ñ´{­WIÕ¥Õ/`ŠC%·”a€$$9ÉëÆ8÷¡y ™ž2j©e}s$v"2YçÊ`~SƒøñZö°i~Ò®5mY“TÔÁ°y"Ø1ûÇæ;‰Ç¶1QYøŸXñեƋ{uæ’<.çhV'qô5-¯†æð$77Ú³X_ZÍ-íî’tœî6Ó;Œâžú†ÅuÖµOˆV2é÷w›«`%…ÛlhFï˜;}[9>õÈýžT˜Å·2gnsÓŠêÞþÛÄ=í¾¤G§^$xm·9–>árIàž‚¹Ï°pÊã#‚ &5äw ¦ZxsÃÖ¶ž*±¼K–¤ŠÙXG,iГžÄöªÞ&ÕRÓHÒŽƒæÙi>¿ï ¹ù·‘Žz~û=./xVÎïUÔÓOòçx¡¹™w™¸ÆFp{Õ‹½fOiV6š<ñÝ ËO%ãG””ôƒÐŠw'ȉ´È|M é×ú¾¨ºeßÍs\&ñq<<Œ÷©nüI7€ììôÍ*Ho#u3Éu, ¬»E?(Åšv«ñ&ÎËR‚Hæ måŠYV\t+¸ŽGË©4ÿ i¶:~³§EªÝ©iv,¥|…oàÊžzzÐ?"[IÔ|wÅœI!u),;Ö0Ž;AÀÁÏATõÔƒKÒ­4ËÛ_3T‰NéCó'!88\P–&' ú÷ühÖmm¥Ðl.u eƒWhʈñ‘"ò³wƒ§‘ƒ§Åg%Ü {,°Z"YbPΣë]gмOy¥Ëcg¥Ü¼:tVÈ"u÷Ürçß5ÉXXFî ež( ­·Ì¶Æ¾äààW]ªëvþzYÓ¬uCmK:V'Ÿ”‘œP¶k•¯<;sâD²Ô|û{Y®a’êO/q—¯­O¨kVþúLº}¦¬mâIJ\ nIΑÀ¨–±Xêwöì0ª=ÂLɵ»Ž8Î9ÏJÏñV¡,÷ím›}<Ä ¼P± «éõôߘ.–%ñ¬Z]­¦s¶ãP†!½ãn!$çË=Ž:Síp<Á[#ΓÁjž£l’éÖ÷w˜ož?õ%?Öp{qW­ÆßW>|‡óÐRê"¿„ 1‘Þ@+ÒˆÊðç^gá6Û:žŸ5z* Ç×­dRݘ‹mñ^–qü/Çàk7Æ-¹£ÉÉãúÖ•òâÍ4GþUãANF;~´¥±ÎÈÕ»ýkEÎÅÁÅaL8‡Ý3úÖæŒ>QÏoZ6&'Wjà ôÍXŒì%Hž„㪶€í§µZåsƒÁëRluÿ Àiõf F1Ÿc_oþÅè…¥ã’f?ùWÄ_ Ô™µ~9C_q~Æ)ÊÝrfùW=MѼ~è}  (? 3Ò”t$ž=¨0CF2)Ý(#8¥Á"€®½( ƒNúS éëFÐ=éA£Þ€ž)0yüiy R‘šhÇ¥Á÷ (^œÒûÓhã§z\R½(:qÒ—šyqH}h€`Ó±ÏqF3KÐPc­! dóJzb€·ž´`Rõ÷£„{S‰ãJ£=©ˆTëÖœ&…_œ?áHcÁ¥ÆiázÑŒæ˜ ÇŸâ71hWì"À­,g5å°ºµ’¤ž¨ó hæ×U³„yo¯S^¤Zæ´.DÖfšAƒh5ÔàúSoQ¥¡JþÎ;«iÔõ/ÃXÂ|zÐ&ØÇ†u0:ŸµiYþb¼ËRø½7Š.ï4χ¶)âK˜Þ+oí¶ž5Ò šN~yCï”F„Hë¹ÁUÈfãèo…ŸÀúö£â=sY>"ñ%Æø-î [‹[K;WK`ðEj÷"–’ÕdgfcŽ€ êTý…åWGg§]Wn›ß_”¹ôõýXõ(¢¸N€¢Š(¢Š(¢Š(¢Š(¢Š(¨®.¡´@óÍ(NHÁA>œÔµó÷íñ[þ'ƒa×?³ST6΋öy%òÃù­·®1³Ðõ®Œ=ˆª©®¦u'É+þ޲"²°eaÀä_–ÿðRÿ…Þ+Ó|kâcÄkZF¦³ÿfYº˜MŒg„ºÇrØlŒã>ߦü[ÿ„óá‡â»+ÒS¸ÚaY·¼Af10<ÝòGíïñÆ?|Yá»bÔÚx{O¶X­î rË4ßòÒF?ÂíÆG¢­z3˪S´‹ºêsSÅFw‹GÎVm>›}mta%$†æ0 †@};†‚>‡µD×3hVqKg;ºfF•8S´°^sÏ¥0D×ös[!Û:H³FÒ6ã†BOG¸©üæÑôé-om’â+§ fÈ ƒï‚nÇ_â®6ˆCo,[Ä: SYì7qƒ ð¼7 îG@~¤=¬ßx‡MM?LÒõ=0O%¼fÖÚðƒŒŒ÷‚Øíš±¬Ä« [ÜÚ–ä¼lªIh¥È<ŸB½û&¢ñ]®«hº,—÷Ïc¨-°E—ËÏš¾Ïð’@>ŸJž…lôe_øjwñW‡Þ •—EÔb†H%„.$à:°ìÊAÎ~´ïý”xŠ÷ìLdµó’Àq»ñ¦ø‡PÖ|?.“¢iîcÓ®£A à7Ÿ»‘ééøRø»LMÄW–QÊ“#¼@…,ÝŒóŒÔõª3±‚xÅ}ËÿÖeÇÄùÉ[×™ÿƾRvŒ®;×ÛŸðMiq©xö.™¶³~ž(þ´KRöGŠÎË[wì·1ü|W ñ‚2kÄ¿kX’+"1h‘¥E|õZ`þ8®ÿàÖ±á¯þËv>—Ä6–žTÖ—Q½Â$±9›8, qϽyí7âý V»ðׇô[ȵìàñ¼°–40ª¥†Al.kë*JØY_kKŸMîÏÔ!†òÂÖBëÜEâváeL‚¿B lûb‡Ô$³km5ãŠàD *dÇ?!<ô¬ýNÞkÛXZÕ †ÑKàc¸aõè~”·:ý¥·ö]ôI~ˆ$‰ðQ Ç~§•ñíØîÓss_Ð5&†öóN2ÜÅ{5µÅ¼ñÿË"ÜýÒ‡ŽzŽES‘ü3®|A„0’ fIÀ–RàZI7÷±Œ®[¯QœÔz¥åöˆ×ÓDÞ\ÂKilÂr3žž¹è}éuo躎¢ŸO¿[y.&YŸH+‰"r(­œ0'8èk&ﶦ VuâÛø’âhN“mrÏàG˜>UE¶qÈíÍs1Œ@Æ»í;Æþ#ñmï‰|;:Ái§É O}çB<â¶à”Ì„¸9À®"I9 ñéKçq;t:Ï…y|%(þ^Ðóÿ]’¿\u…ó,îGm­ƒ_‘_ Ô§Ž|97SSµ?ùkõçU;­®0F¦·!nx·Ž¬¶ Ü©‹>ÕÈJ¦r̪6— ÇNµØøðŽÀu%qøWÑ–r>é:΋÷>ó«¤þH¥q³òw™ŸsòQw¥Ò´n&ýçû8=y¬«€[$gç¥ns£6éò¤d!Œõ®~ù™Q¶‘žzô¿z(÷¬KËS–ÆH4 hùSâãøHeg]ÀKÐw¬û->Ï^ðüö¦úSG;CmpÑŒ‰Ô©\ŽïšØøÐ#ÿ„ŠRxA(û¿NÕ“µÇÄ .)nõ(,å²s Ü_±T•H.@<ŒÝ({•}OÄ×¾†ÓIÒg‚æÈÂe3Ét¹.NXg8½©5/ê>'¼X²žÕRõRa ×*“FO\!äŽ1N½Õí|¦iúMæ•a¯L±´­-À,¨Ž&¸ëPkž×u½@kºM…ÍÖ˜ËÁs e )ÇLIù–¼øJôY|IådCêÈQ5RÌ¥hg\㯵`éšN³k©H5Kk»{;„qs$ñ²£§RA#œŠÝ™|(Þ$ «vu…”ù×ì’MŒ‘Œd|ÞõÏ[ëú¶±ªKa¨ÜÏ4S—ŽX]Ž#õ vÆ)ˆÈÕÆŸ¤ÿÙ2ÜÉd1±®€ôç8ã®k¨Óðg‡e¾¸[-a52ˆ–r~ò5ÆI2 pãÒ¹MBÚ6ý£¶»KèЗ¥CÀOJétkhômæçÄ6Os¦]”’P+äüêÃîðjFõ,ÝÚ^ü@Ñ­¿áÑö Y_ínž„ª$œò2=©÷Vº>‘¤iö~+´¿þÕŒ6Ñm G†,ð®œç•OZÔmÛC·“Ã6÷Zu‡žßh¦2J$Ç˹€\ggû?N×´-:÷ÄÃé7ûZäh æâ5<3üÀŒdŒóœSòø£RÐõ hô«¹l4¿³ÆÖ©•I[I9Íh\ø7JÔµxg:õµåÎÉ_K‘ÎW ªÀmÉ9#&£½ñΫàvƒGÒ®"—O‚%mÓB²,û†íãp8qSjõU]kOšÚ;kÖŽác–åVâ-Ø'“¸€slSßAÇŒ•{D{[ ê-§C<~!H³$†LƒnL` ‚^M.£íb¦‹£_Çã+KûM(ÉG¯•peäf=ÀŒc©ÁS5mbÛÃÚ ¼Þº¾·²–äù×7 ¢pà ¨Û@êA¨<ÎþÐÚ »bÖó[I4vÉÔ0dÜBóž@=©ÚÞ—áK;Fñ„5FÚ"L‰tј˜á†;þTÁž1Ñï.™¼DªK¼*brë¹I_¹·9ÂàŒã›á¹¯ÓX°:lR„ª¤.J°'7·^µ{ÆÐÝK~.ãŠC¤IbÖTVò‚mÈLôÜ9ÈëU¼)â{Ïêpµ™‘£–;‹d<\&~ç§½.¡­Ž¶Ë@ðͯŠfm?R’òêÝÞHl+:ä…WÏ8#Ž9ÅSÑÕ£eðæÛHñ¼ ±l¦išÆ'µ¨\¶Ò6àž0pjž—ãñEýÆ•§é·—‘ɵݴ!$Üz+×wLûÓØ_ˆÛ IàHïµk«Í;T¶XŒE¬¾jÊ[Œ8 ajîô{½?EÑmôýEvHÖ– sv€öÞçéú„µO=íLj´Ùm4‰-YfŽB?|ÝA?6zÔ5Þ•ÿÖ§qá[K«+”.„óù’¤Yå€8Π}u+[hí¡h–Þ*²¼µf͵±TÂR§æ‡Ýû¤úâ¹]> {«è¡žå­-À’}›¼µÏ-·#8ôÍu:A'ðåôZíô–ÑYʯo(2fàÇŒ‚Awâ¹k+9.ïRÎbF™ÄbIjdž¤žƒÞ—`;ÝCÆwŸ-4ý#AšíÜN÷3À®· äÊvŽØúÓ5oêž;uÝ>K1ä 3ÃuvÈ÷Jª±€#ÖuûÿßBwžaòƒ'%è¿AÓÚAà+k?¼ðë²Gm1Ÿìˆì.UWæÛÓà`ó\—‰[åøu¥3ø{VMSí²€×« UGÜÚIÁÉ=ê® —¾?ÐÓR ]Y3¥Â3,HÃ(èXôÀ©ÒËþî™$zŵ޲.¥VŠÌKæÂ@±eïÎ0 Uñ Ïü$º¬ú–,m-ÚCscf®âë¼’IÚFy'Š6ßaõ9ÑÛ1$eݘ( 2Äç€w¯a¤Ãá}?ɨYÞ¡•aXyËxtÎqÞ¸8¥ks½K$¨Á•Áû¤µÞ6‰/4]/TÔõ›m:ïç·7ƒ6.NTð#$d>$׿ðÄ]¯‡o'¶ÒÞ69Õ€yØ“¸·¸éŠ’ÿËã +=fm^ÏL½¹‡oz\ŠœoRz“TÖÇ€l,´Khl5O%Ìðù±I¸ñåî ÅT×ôOÆÆ×WÒl^êÖXBbÚ¢2…Èã=1Tû y «x¡<<¶ú0Ó¬õí"Ty.¢\õ8b2=ªž·á}c]»]RÆÊkË;ˆÖH^<|Š6ã9Åh_ÍáÝ6+ _X]_jq[*Nö·3' ܰ¬_]ߨj±yd†×ÊCk䱨StàŸZ]5òËbÓ*fÕUT\έò;¾¾õgÁÖÖ0Ãq¨‹™$Õícy °d8ïïÏoîãñ¨|_§ÚÇ*Ý} G:«Íe³ý[äîÏsÛêOéÍ ƒ]šh¥bð‰1+azmþï<Ÿ­DÞ…­3Æ:Ç‹ 躅ü“[Ý#'‘ã ý8Á§éޛ‹6­{uash‘2m®!n²õÜúTšŠ-uµ¹Óìô=?K¿¸„¤6¨C³cîžqÈöëTü?á½OIžîm[N¹³Ò|†K—š"ªÀŒ€¬F gcÞŸ¨w,G­ÁâK+Ë=+B´Òu‹ X†Ìê+‚O?LUOèóØ ßíû Ûm ¦ÙZHÚ6 nëVÅχ­,/.¼6š”zŠE†’£mRy)µAãÜš£¡Þ_xº­:úýšÕSÎ3±)nAûÇAéëÅ^žMJÒ¯¯¼+.¢n„rIzÉæCî6ÔŽOÒ¸áw#Oç;æ\îÞÜäõ®á4ËZÜêvz͇ˆÕaU¶…ÌK““æ,Š2x#“Íqq=ËJÑ ÉÜQxZOAïæv’Øjß´‹[Åx~×o#C!•Öß<‚3€ozlÉoàí ;\²‹S¸yZd€IÄ Ó†SÔÔ:ÌâØ6‡§Img¬’ØÚï‘–LgrAúS£±³ÿ„ZÏþF¹²‘fqlñ¦f)Ü2·ðç¥D¶ò*ø†GÕ4½>}"ÒHtäܦÞfòdÎNHÉ9ÍHÖV:žúõÕÅç̱:&öhûnž¹§jz±ð®Ÿa‡®æ[Y÷J×M…i_8ÁJuÖ™sãM.×U¸¾·¶º¡oµ9Q6Þ…p<ãð¦cuMvãÂÐXYèw’-‘C2Ü9‰ä‘Û â¡×,åñ¾÷Q‹–\ÐÌØynAß®OJžçQOX[iw–Z¼ƒt­ç(’4ÝÙáÖ¨xŒK¬[Zjí±l1B¸Kv~9¤õ±¹Ôf†ÖÚ¸žVÛQ®çsèzìu]ÂÓMƒ^Kè-¸¶ì£ƒdEqqÎð’7hÝ["E8"»}CÃöÚΟ¥ßê:Ìeìöà~ù y pàñŸZHlÏñn±q§Ïa3Zi‚ÝM¯”Ø ½É÷Îsõ«š®·gc¨^êÑiw·壸ŒŸ3ëÆxüêMSÄRøE-t› ÔÆÍqa!cœ€z ­«hº‡‹¾«cœ“F¢*˜Ùx GýEèIªxŽO ¼e‚Åq¼c÷—1.O$ŒöäÕM_E¾ñ$¶úŒ qÌc(0<·äŽ3V54Í*+^Åïo`n§A^u$më…>½G>Õ—¥[é÷±¦¡s%¥©VÝ4Qï öã#Š×ÖílæÓ-.®&{}YãáÛ•sóØãVF—¤K¬]ÇmÐDì¬Á®$§²{šÖÛˆ¼W©hú¹¶°™­m UX‡rã†8ãš]W—ZôÐj0Ío^ij4WSl`ǯ^ÝÿŸÄ晥ߥŒšL—Ù£<³gvqÎ¥gx¦ÃQÕõ%¿·‚{ËkˆÕáx"$(Ç ÐŒt¡ù‰.ÅÝsV°Ñn"Òä±¶ÕÍœk]J¸f#“ƒ×™¬ßÚ_êWÉyoo4ÖÓÆm*‹»ÇLsZ:¤ û"kOw§öuóšØ©»n<ôýjŸˆ5ûÍ7Q[}>W²²Ž5GeJuž´0D·öúC A«Ëso¨yJ&òãýàAçâ+¹-æŽÊu²Š0"øÔóŸsÍ_Ô4C®½¥ðº¶´–ê ÒGq!7MÃŽ‡­A¯ß¥”é(©8·@­;¨ÝžNöÐŒ½#[¹ÑoâÔ )C½ ÏŽÕ·¬øWSÕï^öÚ/´¥Á7È¡Á=°HüëD¼ÓìQ°:…®Ò "VŒç<6TçJ¿ã «Ö×%›{ˆ˜+ÂbÜ.8éÓð¥ÓQõн©ÞhúmäVš…Õ&9¦YZ2ÄG·ëŠÌñMÝÌš’ÌŒÑÚÔÛùd…XñÀ±}¡iq6¯«6•|ð£MvþpÝþÐÁõªú—Нü;z¶:dÍoklÆûøä1þuD®„—zN™|–ó꺣i—ÒÂ…¢Ko0Ó-ó qƒÞ¢ÖµÉt “MÓ¤ÝeáXÇïAçqã=qš5/j$º·¾·Xɼ_lÓ*OïÆ{ÕNãMðëÛé·ÖPks[ YfW#9(¬§‘Ôg¸é@Ñ™®Z\jVÐë_.hÁtc‚¬ê2*xþ(…$`ùÒŸ~Õ_Äò<òZÜEM=ágTÎÔ çÔµŒ| ñ·Î“’~”º‡B¯…ë¤êõé§ÉÓS^}àˆ„÷á<Ñ}’0È•êØíšõ=Eà¸+umc&™o"&Ûi\»‚$’O''ñ㊺C]N6ÿXsŸÝIôéXÞ*l·ü ¿ãZºƒâ›/úæãô¬ŸÞžà~†„KØÅqÄ_îÿZßѸUϵ`1û¿Öºî bDé­À Üt5ofÜgÿœUKS„zw« ä&àÜõ5&ÇmðµIÇ®P~•÷ìf›|çæoý_|*15‚zîN¿Jû›ö7P¾ aÿ]ômsTÝÇgè}£=iØ‚—ëAˆÓ׊v9éŸJB~aÍ('v1ë@X=éqÍãŠz hÆsé@\}iGzh‡ÞJy w㔀u¸§Rv öéùÐE8w¤=H¦!§úRš\QÓÚ€.)1“ŒSýižhŒb¡‘öÊ«Œç­N++S¸¸Kû£‰ &ùæþ5!IèFsô\¤®Í§ÓŠQÒ‚~`)Øãè'ÐJxt¤SÓ¦€?*U¤m¯xOPøÙâX®ž'´ðÕ“n‚9_új㻞ðüMt¹ÃxÓÖ]ú/Oóûº2cSYmÛüÿÈÐø ðÖçÄX_MjÚ‡tÈ£µ±²gfBŠG’rÍ´ ±9÷韩j–£Úè:|VVq Œ`äúŸz»\-¹;³¥+h‚Š(¤0¢Š(¢Š(¢Š(¢Š(¢Š(¯Îïø*Ä‹Û?i^1¨Ò.t…ÔåxÔy¯0šUwˆ ’qÉÏZý¯Ìø*Œ[~.øb@9“Ã¥?øªèÃÎP¨¥¨¤“‹¹©ð>s7ìÁàµ#nËÙÿ&Éþµå?´”"_…·¡ÂÊÂe+æsÿ-ȧéÿÛoì·àÆé›ùGãö¢+Ë¿iR_á-öÕl™†C´ûú?Á—Ïò>u|KÔùV 9.ôÛ¤µRÓÀRG…-$`àíïÁ ‘éŸJžÒâÙô;‹]Otp‰ÖKyÐeÒLTÔ0<`{UHZk]>âê7a4E8;Z%'¿< öÍX†5×´»ˆfb¾·‘e‚y˜„e9Œ}Olw¯†v=4ÆÜ_I¡iQ=„Î<àíöŒcq|˜öÆ©ø¯Ãâ}GÔí¦ˆjB —;í :«®}‰zŒ÷©î#få]ÅÖö3,e²£.AùÅexÏC¼½ðéÑÉ%ŽÆàˆ`|ç'C>Äv¬ËÖã5_.‹k¤ésÚ-õݤ`Å;±S 7÷OQéOñ›6™¬MotYnxy– Ã8'¹æ¦ÕµM:]3ï¯oMRΰB™iT “èJÄ—·Z޵uy|C\];²¦Ðr3ÀíFþ‚{Pªõ>µöwüj@¾*ñ¼{¿ænqޏ˜ÿë_£ãÁôÏ­}ÿݘøÆ<›HDZѼDšmÞ«o>«¤»[I{b¶÷aƒƒÎ Æáj–·}©]é6_ér¤Qn‚v,ˆ‹”sŒ-öÉ¥k7Ô¬,çŠtÞ–Xf.H<2Ç#jnÏ@M¦&©¯\èiO,IobЕI—>`o˜°ôµQ×<t<_¥¦]$Úuĉr’—Έ0 Uר#‘ÓV޳wkl“Å}j·?Ù¾JÈäÄ3·Ü/lúÖ¯¤ëúOí¯­¼éi£žÖê4>K¡Á\œ1ê*›—º4®|D›:ñ?ü‘›.ÝÝ=ª”±ì »=Hãõ­×,ÙyãŸëUf̪ П¯½tœ¦5Ì{ø (ý+*ꀃœÎtSD¯ŽzwëY÷¶êbqÉÏ¥-Š>@øáOIómMã$ŽœW;›}ã­4Ëh¼Ë <V$pFC券Æ3]Gí‹_›iÊ’¸öâ²üAá;Éü7¥`XÏ,N·öjò9}£ç dúý3Cz² ŸBŒÇKðþ™§Øx—Lžöú0åR)ü¶·Œ·#ƒ““Qx›TÕ ÕmfÒÞâ-5a‹ìkï/o÷Olç9®ƒÃ¾‹Å^ŠMnK»;ËpñBñ…ÞTŠüðr;Í×ÓX$°ÖÖöMŒ~lQÏ >÷>”ýONÔ¾#i–WºV-CÃ=•¶ÈÒ3w*’>ð=,Ó4ýSX×môJXŠn¾Woµ*Ÿ–L®qéÈí@~8Ôç·»H·•—H†ͼJÙInD˜õ99ªÞñ@𾢓˜ ¸I0’aWh†GÍ íaê9«¾0ÕM·‹Ãq,RÚZ¢;F ÈØ'r¿P¿1ÀéYþ¼ÒôíR 5[?µÂÌ!_%²>rÞÐÑwpٟßé¾"ShŠØÅ?œú‘t+åõ,ËÜŽ0GzŸMÖ|7wt4]?Zd—ì·Ü›¢ŸºÄg¬ûX|Imãe‘ổnnŒnÌ®-挞F~é]¼ûVžŸ¤x[OÕ®/4MNïPÔ¬„³Ee,²ƒ®ͧ8 NýL/µÍõÕ톬÷ ¥Énír÷¿s•qžá±ÇzÖ²þÌðf“©kÕdÕnÀKq$¶â#nä±\œôÀ5âísǯ>ƒªjrÞAs yRNÙ2üÀç²ñ‚=ê}7ÃãÀwÚ­ýƬÂÑVÒÖ:)Y›'Œâÿkêÿ4Ùíµ Ø¾ßhë2Ý]H"ü¥]½GQ\L6sÉwöHbó®$>Z¢rX“Œ 즾oè·6:&‰m§Þ$‰4–Zr.q»“ÔÒ¸¤ßm)Àe•zc‚§Ö–½Fw—öúF¥iZ‹ì¯ÿµ`Fm$Xå‚-ß*Hž¸ª—ŠüO¨hš…¤Z=ôÖP¶ŒÚd :Õ½Nr½Y}'Oñ¥_ëúØÑo^6‰d{s7žŠp®ÀG¦yÎ*}[Æš$·Ñtia“O†2{u\ù¼Á¸žVÚ¢D¿ð~“­jv÷Úý¾{x±Ë>,L\3c 0ã'°=*ÝÏÅ«Í#[}>; ?ìËi¼•7q½Ôj>]ÂR¥ÁïÖ³µê¾*¾Öžax5[…I®R9P‘ÈÚÄΫ³x¯Ã1ëñèhÞÜDñÇ&¬³º1u(VÁÇ=è°Sá·ˆ´ï.¢«þƒÞöš„yyÉb¹ÝÓŒb¹oßiWú›¾“bl`É÷¥üÓóó÷sè8­”²×­ééUü¦¦œ“ø–{˜%†É$ÍßHJí—pî保iþ$oZ_èöšNŸ¥j7~êK„f}¼˜Û·#8¦!4½!üc¨jWÍcªA4kn¶ÐÊ&ŠbN~~8Æ*).ÿá3ðåÕ®‹£A§Ý[ȳMib„™ÐñŸ^j~‡á{¿ ÙjÏâ‹ í4™! `c‡–Mß/–z0y¦My¦[xkP¸ð¤w–ÒŒ]™CM}Š•åÏ’Q,4dÑ|=<>-µ¼¶´3«[ƃ˸ ˜®à~R1ž* nâÛIðäxjK¤Ón¦ežyØy»ÀÀðÆ2GÔšDð˜xjåuDY­œèaÔ®rànÈhÈžÇÚ¥¾tð/‡¼6ößXR•·]ˆ‰‹j®Ý¡[£|Çž´ÿ«‡“8ˆgh$Y¸2#‡ ã sÈî+ºÖ¬uˆú.Ÿ«YÚ#´M$[[ªE¶s½a@9é\,Nžg™" # 8Ü3ÈÏjëüK#êš“6ƒg5¾”<Àm-ËÈÐËŸ›q䜌M.š®…›Ó¦xwIÓ4ßé’jÑ}‘Îbx#-Â= ük?ÅÓ\Ó%Ò’{} Û³K|¼üÁˆþ,ñÍ^ŸMÓ®ü=£Ëâ;ë6÷k¤LùŽñò—ƒÇ8£WñUÿƒRÇMÐo^™fQÅÁnKã·Ò Ô4½'Q|ÚÖ§.‘¨Ën¾r­¿™¸ºÌ20HÆi—þ2Õ|z4í&sogj 0L1ÞàäÔšŸ†nüi%¦¯å¤ÞÄ ±ÞÏåàà‘r3øÓµOiÚÐéwZ5–¶ö‘,2]\†Þ\)p3Æi‹â½2Y$þÙŸg¾"EˆÉ™S#'+׆§ðN{u©C{öv]20éqpTˆ¶í%‘›¦HíPxÎÆäê|Kapªöóª›ùWЃÅ'ƒî%—X‚Ãç{;„džØR¥N[ðþ”º¡¹§Kሖî]-Cû^8Â/$VNŸ1Pã8ɬŸ êW¾ š}2îîi¬%‰ŒŒí¹`Ç!ý°p=óWtÃF¹¸Ô­uxu±å[xÔ«žÜƒÔ óSXxÇTñ„Rèsýš3q Hd‚‰²¿0Ve#ƒÖ…÷ûÆØéV^ŠïV´Ömu©!bGn»K`npÃíJßE´–;ËfO5®L|K¸õLòÌÙ_I§ÜÁqÓ,/½VD ¿ˆ<¥v:Þ«xÑ,µ‹x£c¹¡l7¾…ýZm?C²Ó´ÍbÄjW–ñ|ì’1r2žqëY¾({‰¤µ¸Óâ–-0Â<í±ŽàŸP}jÝÕ†Ÿy¦éÓkwÒØ_´{~H÷–@~VaAů‰/|-öm?F»–$Œ:È8ó·s¸ŠbBjvwea>«¨=–¥,#xX÷‚3…-ÓœSu/^x] Óô«–ŽÖ8ò$ÇúìóºŸqá»ßÇkªÁ=²Ip»dK©ÄXpq‘žÇ­6ÿQµðü6š]æmªÏn¤I$§;I9Ú¤v¥æ3?^·›VŠ\õÑ5dlÂ@î c[Y\ßKðI<¯±Ä¥˜þšÚñLr]ËoymgI ˜‚)ÛèPú`Ö5­õΟ4sÛLöó&vȇ})=Ưcµ×íü=Ü1ëÞhˆLö¤`7£8⳺‡KŠÖÞö(Ö=÷Q‡,G9Ž=*¼É]ˆuxÛßµõµÍÌJÒArJœôÜ0­&©®®ƒ%¾˜¶v·éf ÜǸ±êpHÎ=©šï‡õON5k+W¼µž0ãa\§b»sž=…?U}"Ùm-õ8'šþ8Uf–0AÏB;œqH}ŠÚÖ‘¨kó&¡gm%Õ´Ñ‚¢0—Ø®>´šùµ‚ÆÖÖò"uh£ ò£`(çåaÜôçÚ¢ñüÖwp¥¤¯ob"ßËs‚¾§ÔÓu«auok{+¬2 Äz¹ÅøŒPMÏN¼¿HµçÓíÊŸß$^oÍ‘ŒŒ¼çŠè|CãGKÖd¶°sgmnUR. àpß\×9¢èW:õüV–Ï ÊÀ°3Ê#P3êx®›Y×t½?T[Y´˜5O³Ï)`Ì@Çb8ô-êÈußø‚öË7€‹Ôyw¬M#<î cÐѨêz^‘qocy¦E«Éjˆ’JîT±W*Gÿ*£â˜oï5?µÇÒÛÌŠÐI ¡àqÐûVŽ¥¦èí4#\¼¹°Ôü…ó’ÃàqƒÓ4z©™âuº»½K˜V³x”ÀbV*«ŒöÆ1øUÍFÃNšÚÊMVî[MIá]â8À[ÐãºÇ‰¯ôB;m.âK;ktQÆûèlþ4ëßÝx¢4Õã»·Y'Œ<‘ÝO±Ùóƒ·=sÖ˜®UñÑÓÒ.ÒRÚrFXô—<îüóR©xÕK&ëÚ›â‡I´‡FxἸ·\5Ð9(Ç’¨{¯ó©aÇü €ùONüfŽ¢ÒÄ^ Ù˜öd\­Â¶qò´x!—ëœø× 3–F¯ZŸöDðf›ãïŒz‰¬@×tòHÓ"9F!!‘†r9þ촷 ᱠţÝ^Ϩ“»Åzêæ2…ÚÁFGÍßÒºVs¥íÈ9’v>m¹\øªÌÉúý+?Å‹µÔqœŽŸCZW)»ÅöƒÒ9AÿSöÿYÇý¶5ÏStl¶~‡Ð}…)䑚ùi0IëHÈ3‚(Áϵ`Šqõ¦ ?­¥Æ{Ñï@:ñF) Zw ’=)qø 0sKÚ€F8£ð¥šdŒ'§R’=)GÖˆ(ÀÆH¥Ï4b€óFG–ô☃§j­<“‹— •\õh“õ¬ýu®Kœ[J±3a[pÎõ$eG¹8 krïzp4Õ]§Í?®(ìRM$.K•aƒŒÔwT1JŠÒëí4W/4К¡r@Í1 `S‡N¼T`óRPN yo‰®þ(YèŠúŠh>Ú:¬ˆ|‹I5`–Î'~A•~@L;‰?-v;ñ•§ü9wª\Åqp±lD·³„Í4Ò;„Ž8Ðr]Ý•@é– s^OðÏÃ:Ç‹4Ë_Â÷—WúŒ‹âKùæ=Ýó" "V_‘a`@ ¶5Æ@Éë¥û¨J¯]—¯Wò_si×3Pù¾™¥ß|jñZn𮾵“y‘²ÓÌþÀì?©¾ªð¿†­<'£Ã§Y®#NYºnl œvè*€¼ià]->ÙT¿WUÆN:aÛ>§ÖºJá:R°QE (¢Š(¢Š(¢Š(¢Š(¢Š(¢Š+óoþ «fG¼ qÀi71dŽ»eSÿ³Wé%~yÁYáŽ9~ÜÄ®ºœlÙ<öRþ Õ<45k [‰e‚â-ÔHÅ™*A'ó®Wâgí1?Æ+«mÓKMOæ~ö_1À;UŽ·N¤WØÓÆQ…ytØð9ûK´qÖš£YEqsòd4n7+îþn?J|Q¶½£]µ”j³ZʲËm ó$d¹Gû'CžÔø­–úg­h䌫ǭ“ÓàóøVn ¥øcQ»ÑKy°L‘Ï/ñħ8lzÆ}Ç­|£w=jC,/áDzÔÖe‰&imÞ>3·0G*~\P+Åž£ éZCé×%„±²­À#.Tࡱžžõ«£Kм jæ÷:¼ÅÌ÷jÎߺÈp±¶Ú"«ëzüžð查ÜÚ[ßG:y…d£+cïuéS¶Å$ºìK}£é¾5Òô-ZYâÓ.Ò&[ï=°³ì?!Ov)ÙïU¼aª¾·â îÞn$ #9ÙPgèAâO ŸøsAÖ4Ç2¤®ÖÒØÆ2mŠ€KñØäòGðŸJ·ãôù5ƒ™‡³·Š8RNxUFæçÔçŠVB{aH •ýkëïø&üÅ>&x©¶ˆ =ø¸‹ükä3€GµõÇü˜•øµâÐ óø\CC û«ÆÃ:ÀÆ8ô¬2º-\ÐŽ‡ÔWEã(ÉÐnQŽÕÌ|fƒÌ‡Mî<„8=3Incðžj®Èˆ»º­E;¸VÃ*©\ýj@ÌmÔ#¹ëI•’)Ýñ#­Y;Ÿ?þÓŽ²øJ5'”|qÒ¾jÒŽtÅ"6§¾ ý£,×…¤s•óŒq_+xešñ}}¯fyëH`a"½F}«¨ðEâêÝ=ÎMÔ3¬ÑKŽ #k)Ç·O¥s(7¸'¹®“ÀsG-¤‘r’Á8—hé*AüG¡^àìtÆðÃj#eWI¤2y2 ®WŒýyüªÕÞ™5åµ–¡kËh¨c–8“>CƒÈ s‚9úŽÕX¼M,Ñ>÷ÆÀíuã“ô<~U5Ñ’Ñ4÷…ž;9Tì“v78?8oq‘Ç¡ªõ%ÀÒµ >d¾ómåD.匂w·—¸ppH=1\Æ­â}kÃ~:ŽÉص¤ÆÃvèž>0GÔäz×Oâ 6jÂè¤ÑZÍ{ p ¬B¸Ç0Àç¸>µ‡ªøÝ´¿Á¦ÝXC=¥ƒ¤I¢p†ëJ{š½+‹-;Á¾,Õu]*Hî äRÃka¸ùÖ¾b|Ì{¹ zñ\+µÚÂ5ƒ¼s}¬j¶£¥´r=¤Ç‘,΄ #9ã'>â¸Çbæö["þ‚q®iÄ‘ÅÌGÓøÅ~Èj'ýr8?~5im³P¶~»eFÇüWì…ënµ•ÏB¦„BÜòI²ÊÁ°bËœõäW@býpO žEvž8„>™§¡YØ‚:à à̲|àd/æ± ´~¬ìÄ;Iz!]º¹ö#Þ©J3&Ó•3ÍÓ'$œæ¡,›ˆ$êMt‚y`ŽrÃ8 p*Ä@ÆB’7uã UÝ劲Œ¨ääàU;»€±ŒzÐ4|ƒûID#ñ Àw k¢ð¤¥t8¡*ÞBGâ°¿i'ZÏRÃ:½¾‰¦ÛËuS}ž3±ä¹qF츻ntRI–wl;ž»Ï_z öpß;,¶¶×8ýìJçð$*·²;•7Yr@ê?±‚DYÎâü;Þ ÕãËÂ`¯rBôô¬àï H_[é ürLâv*Äç?»<Îx®Šv ~ñ]£†ÁäúS"E#çùàriØ«žñ?Ÿ€>AÀ®“MðÄÞ,ø}akjðÛܨ܆B±$„ŽüzžXñ\ßÄÕ âî«Ñ¾)> °$ŒÀþñ š(xáì¶1^Ùø’ ëG‘Y-~ѹw€Fðñ7{ÜÖoÄß Þi±Ø[héI½ü‹C$¬’e˜òÄc&½6ݶẀyµiÆ][tr²?ª +ØvG•hß ñž…c{¬Ý]éú‚ÅåïŠ%“ÌPp…ÃAÇsXÚߎõ¿êçC±™âÓ,Â"Ú?̲[ñ¯k‘ –%òy'’j­Îa|ÝiöwLqóÏnŽã0Än¢â²>ñ§…çÑn~ÜÌmzLÑ®òdPÜáÆ8ëŽý*σì.mâŸ\¼€a$2A9$bn0#9ÎH9ÇÖ|i‹Ë´²ÓV¾éVúÏîìïS̵šgVïtê·1Xæ!½Ó&ðî®þ±ºÓ¯ÀŒM“™¡ÝÉB#œf¡Ñ-×_ðÝÒxŠþ{+[„0Þ:y®®Àî@¤‚GC׊ôÿ |;Óü«CN¿½ž}¡b’á7‹œä'žœñÒ¤ø™áKïˆ6¶Ê5 ÞBùÞHÅJž»Ž úS¸[©çGÄSü6ÑíÃZŠÞ ÙIoL?#ãËØÙéß4Ûý Uø¡mg­@ö‰8ŒÃq ó¥¸,§¬jp0A•Ûø#áòhdöšÜ:®é¼Õ‰Ç ü¸ÊäMs?|«_jV£BÒfŸN޲ÚÂaÏ< žsJëä{œßŒ¤¶Òím4ií}VÖ$Y/ƒÊ9"?B#šÈðÕ¦—u©[®±4°[;€­1Èá³Ð{×_â_à›M[PóãÖcau$(3·z‘ØÀë\¯‚¼(Þ3ÕÚÇí‰f3)y› òŒt'=O´ïp±¾þ>×íüVú|³L,þÑä6–­„ØNР}¯é³Ð5¶ÔF¿gvš{<Íen[íP~R1ƒï‚i³üM– 4ûDÓb›ÈV{T7Qòîó1¸·ëI¥ü4×ü=¯Áª]ùqiqÈò=ð™tc;· mÃpì@ëU~ä¯"-?Æ?ð—}¯K‹JÓô»Ë«gŽÞæÊ¹6Æ#®@#=sLÑ<¨xRFÙIe£Ëj ‘3)i‰#`B¤áüªÖ“«ørúK´ðî.™®ýšQo,— "JØç OÊØÎ1Y>ŽïQMNËZk´ÒM¿›<³†ÝnAùwwÏïKÔ]]é1ønúo Eyk6ôK¯´HE‹œm t'­r6—“Z]¥ÊÊÉqúÃk¼†M3Á:5î­á}R}Jñš8>Ñ,"&µÉݹ9ɸXoY¯þÕ2Ç#ó|¯ÎpG¡ ÂÿJÔ~#ZÙk wkë+A7Ûn"FS÷ÔžsϽOªjúw…ÃFÔôK=~æÒ²Í;°)¸–ØŒ¤d ðj¦·§j:²°Ô4m1žÚ4hŸO±Œ²Ú¸98_Vï¢Ð-tý&èk¤;Yº«$y;ÃóGæwŠôcUÖ[TÓ¬¯.4é9-g¶…™"L|ªX 1Ž}+^ëMð…ψ£MRîöIÚ3q ¦Ý¥ n\õPOSïYÞ+ñn¥¡ëÉ—y%¦šÆmbþI"À ŸRyÏãZw_ôÝ_ZY¦ñ–—stRi4¹Õüå-‚UX¹äã$SßÌ6ò(7Ä=}ðgõ®²OˆÙ×¾É.—d-%.d¶Ss>PÛñ’GZãüCáíC@¿hïãd.K$„ƒæ.OÍÁïïCdløIºûdšÅÌ%tH£‘.æ l‘vóÔäVæ€ú^§'†l¯,õ¤·8ûTþgî²7˜øá±úV/‚>Ñu­=›†þθ‰Òé‹Þ[Ó €ksH°Ñ<9öÝ_DÖ$Ö/¬í™’ -¼­„ü¥úÀBòex^i¼Ai©Øjײ®œ° šæb_ìîÊ@'œäŒV¯Ù¼ ¥ÝjÚ±³q#%¸”@P@Í–RO'S¬üO¬|J²¾Ñïî·>Pž Ê„¡å\ŽÇ4¶ž‡Ú~£w­Çe©ÛN«v\‰c™÷g%—¦>üз:¿Å=K`":œÂVÆØc•–=7 u5Z]4ø+A–Ó^²Šö[™wAj&DBàÈ;Ž3Ûš}ö£‰<7s‡t…ÒÙ'Gº±´g‘¤\aXd’Fzz§cg øjuñ»µŠ)¿Ñ0˜—yS¹pÃî}ÒiärѬrK— °îˆäªçŸÇÜjÞ$ é:]·…¯îbÓä/7ÛXå•ó‚¬ cŠá’5–mŠáT°]ÍÀ=Oµw·:Œ^Ñ,lëÎírd•<Ø1œar=¹8¤†ÆO¤\üDÓlõ{½VÖÊûæßQ ¸ÚFHžyúQªë6þ µ±Ñ%Ól5Ç‚2ï5ÚoP\çŸîúSuÍ/Tø‰Ž£¢iM%ºFa{4-œBŽ8 ƒIxšF‘¦é–~'±½ŸQŠ6ÊÛN"xŸ•[ äJ­ÅЭâ TñSÛêºUŒ×v2@»c·LýœŽ `{ƒWõáØå´‹ÄK|ú²Ú¢\=“ª…nÛ²HÏJÇñFµ>›ubº]ÄÖšZÀ­k²B2R}[9Íiê~´× ¦£¨kvº5ýä*ò[ÜFÌYºnã¦p:úÒòÆŒïg]]ìÑöÙDˆ-ãCòö¬>¹©ü#­Î ÐÃi~J±TÑÊ7\zŠo‹uV…×EGØì€EgA½Ž:îëŽx'ƒµh‹Ù‹([R¸V·ÌX´M´á@Î9õ#4u›tßxzýµç€iöªÆI!$ §åÀ9çéÅ>ß^Ò5n Ñ´ôU eŽhæwó9PˆŒò+7Ã:F§²îÒâ 9þÒ÷²¡‹qÉ>Þõ¥§Aá˺¾Ðï5 ÝNÖ’8n¡DU=Ôƒ“€}(^C~e éW³É¡ði‰nMËÜ«/–3ò•ÈûÙè>µ¥·‡t=:ûRðþ§}©ê —6Ë’§‚ü1Ýù U Ä:ŸŠŒÚ>¡¨M<1±W‘²#p2ûzýjþ›á§ðd7ZÌú†›©E&5‚Ê7yl 8ÀÂóFþbîQÓõGÆ–—:UåÈvÙçC4§j«)ä1ô þ•ÌÍg-ä–äÇ#«ÝnFí{×Y¸¾%Òï¬4íÏJ¾dÂ2 ʃÊrOLä­qï¶s´3DÑÊ„«FÃO¡˜×‘Ú:ÛÃ~û‰ì®EÄ—>e½²8Y#ylú¥®ßŇì_Có­´ó+ K?ïD½ƒÛ*Æ™am®xJ u½DéñAvb‚èÇæ;)²ã# wã5fûSOèÖ±è7‹|·r´¯zÑaN6í$àŠ¯1z• °ƒÄ^µ¹Ö51§Ï ­3.ñ2c8ëžz’ûVXXZi7QÞ¤Ù¸k¦‹)!é€zt§M§ê_´›[È<•¹¶v‚XÝÖÛ<†\àgIr¶þÑm4ínÂ=Få¥iÖ7ˆW¦)ç8¤7ºn¥ãÛK]FÒ4{º) Þ‘(aÎåÜ@ç=*¶«Z‘©Ú‰õ Fó9¶]Ùƒƒž}¹â¤ñ3>¥§i—E«C¦Ê¶Öû™¢˜7Rzõ¤Ô-íî|1§ËªHöº’+¤?.ZXÁùwç¦9ç¯J§‘ÎØEi5ä {,–ö­&%š$ÞȾ¡r2}²+°ÖüQwátÓm4+¹"´X7¥ÎÐ|ž¤s‚1Ó5ÇéöQ¼·µYâ·3I°I;í=Øó]~³©ZøjÃOÑî4ëMRx|’; “Ñc Іõ+ßé¾3ŠÓU70Gu2”•n¦ØYÆážÇ4š…í¯†­ìôË» mVx´/;2s…aÚ«ëöWzì67ºuœ²X˜v¬6ñ–8e8÷ïVn­´¨´Ý>=xÝE¨,doÁ3ò‡@ :jSñ•Þ´ö—–’Ig,XŠXˈá—8Á©çƒK¶ ¯=Ü¢<j}¹ãxnøúT~!Õ¥Ò§´‹Iš[]d§žüŠà{gìoç|Ò˜r"¶»“ò·Zö¿Û•Äž2ð=¾ð Xܹ$tÌŠ?¥|çû"|PÒ~üK‹ZÕ­®îãxd´D´Ù‘æ)RÇqŽ8ÈÏ<ŠõŸÚOÇúÆø~÷ërÖ–zs@ÿlˆD|Ó)m£æ ñŽsŠõéN+ %}LÝD|é+ñu©ï丕gxÀ20qœóZmOYêbý+3Æ2¡÷þ†¼~¦­h`<¼zWI£vý sŸÜÇ÷k¥ÑTQIŠ'Kls´‘ƒßÞ­äÀþõV%<ûñV•¸#‘ÜTšß‚^ \ãŸ1G§ð×Ý_²cÁØþøÿÈÍ_ ü' [êã'ýjÿè5÷ìˆü ’ tgÿÑ\óݯ…úõF8¥p>´F"`äS½(ÅçÞ€ \c4ƒ­)ýiˆ1Í擹ô¥è(œçÚœ)¸ç'ò¥Šw¾”bÖŽÇÖ¨@))sŠBx¤0Áâ”ò)3KLCS$œŽ;Sc$PŒ d‘‡ÆáœóRT7LDXûns€?xí¸^ÂO:Òç%sÍYúÐ3œñ%ᶸ±@Ää·¸Á§x~s5צkñþ¨Ö×ë,~^ÂzÙÏò§àiÄÎÞ‚›CŽÌì€Ýõ¥ïíF9÷§Øv ‘T Žæo)0 ³žŽô“\‹uòÇ ¯2ø³ñ7þ .âÚÅn.ug²}Š#4°ùŒ8ãAÖi•Tv, ÇZqNmF;±è•ÞÇâëüaø«sá[IÚhW £±‘Œ—×{#™LŒÂF]BÆ3—RÌN³¾ü7´øwáøíÒÖñÔyŽ£•ÝÏóÇë\gì¹ðdü-øi¢kY´>%šÕ%¾ËçIò óe²rÆF|O\ öšÖ¼Ó—$~è¿Ïç¿á²C¦¬®÷×àQEs…Q@Q@Q@Q@Q@Q@Q@~_ÁQþ&6½ñkþ K4Š?Ù=Ѻc–•îBè¬Kø“_¨5ùÿ&ˆÚ²ð~m&ПûàéWÇÑŸ_ŸÞ¶:dñøÖ敦ÄÞ!Ób†!ûøÚ yrx÷Æx¬ CwÚecæ=>µÓfÎ/´[’Æ#¤( ’x­[Làiž´ïg£Ë¥iåyqºùN>è ã¨#*G£õ»¯xïÁz͆˜ºN…‡"¸‹R»ŠS:ßLÈ^$e`B&õ ‚?‹?Ã^uk ß anL{­Û ªÒ+vÃr2{ãµW¶M‹S[ËA¼ê©5º»ß9R¤t ó‘ïëN˨&÷C'DÔ4FV…šÖ4quåÔ¸`GÑõª7WzT> Ó¬µè.C«»Aå²!<19+Âñê*ûÆ–ú ×VÒ/—33|èJ“#øNŸ\U;Ý2ËÄ^ ³–òù-u8™¼»‰)'1“ØŒ¹ÍO«3|RºŽ h’éWš=â2Å,/ƒ$€üÊØèyéïZž/ÓáÑõ(lÒc=Ì6Ñ,ïÁiPX:œf©jšÅÿ€ôM.ÆÞ8®#•q4щ#,N—ž2:f¬x‹G“HžÎ9%ÄÖÑÏ".~RË»>ÄR^ ö2‰ßœqŸ¥}cÿê•Sã³p_B˜(Ï\O¯“„{O ãó5õ7üÝöüq¸ h· ßqéHÍÝŸøÀì+œ’~^+7ãM¹ŸOÑ'áIÓíŽqÈ>BsZÞ.M àvÇ­Tøß範ü6ó6ÅþË·Uò—=?Ú-ÖŽ¨Þ Õ­â[ »mQº„™ ¹´€[y@“¬§rFÏ>àŠÈ×4½ZñžonZÃY•!ûL  Å#àÙþp2=sQ¹l²t›Š„zýém>Í$fȆuØZ!xùÁ\½kŽ|%OÊNFk³Q­kÞ?ŸÃÚ£½–Ÿfdš[fˆâ·{ü¹#žüWüÉòŽ3Æ})ú1Hµb¼Œ‘Ñýkö6æ_2Çp8 =sÔWãu¹ØÊÝ9Í~ÃÃ0}Õ—€ÖÈÛE4µ3êyïŒrÚ]ŽYý³À¯=’@"ÎpÝ8 ôoþÆ´-÷ƒ°±^}w „ ·và ¬hìýNÌFëѳü»HÏÌpµD¥IÈãƒíV¦]£i9öªS¡8<óÅtŒd³aJœíê@5ŸrŠ[#[—9ÏUþ•R소¯U'8¡-þÒ˜}P0 `óõ¯*Õ‰:֌ǃö{^Oá^­ûG©‚‚I".•äú³¢0ÿŸk|þtšH¨›¿neŽ[7ŽF¾aû²G§¥sv¾&Õ­e_/Q¹EÜ )9­ïˆ?d=²Ý ã uúƒCms»Õ|s­išíôÞ rmT‘`cÞµü=ñT½¼Š „ ²„ªm?^ q^"çÄšýtÿ£áP©lOgήú‘Ô_Šðù>!Qƒœfº¯ø³Lðß„ô¸µ Z7™]ˆË n#ŸJæþ.€‘Ê?ñúÏflÏuþßÓ!´—q[£ð¦c´5kÁ¬éó…ò5 gn>T•Oõ¯ñ¹ ¡Ù¿:ÿè5Á?パқI ìú¹O˜ [ýÚ‘@Îz°â¾nÖïîíµ¹Dw3Cû¸Î#ᕽà¿êòkvI©\É È‘ä$øÓqH\ìÝøÜ€YYà–<š»ðLቲ &å‡è(øñǦY`cæõÍr¾ñœþ ð\SCmÑžúDe” F*w-è{r.àAù}Úœ€èkˆÿ…˜-4(5+‹UÕIHŸ‘ŸLÔ0ükФP$‚îެ›±ù9C#½xÈ9©<½Ç$dzŠæÿácø}Yßy%Ð:¬¨FTô5©§øŸJÔ0–ú•¼¬ÜÔ¹_`æ[\ç>+Ƿ—9ë¸dWœüb¾.|~ÌÿÌW¦|XbÞ¸ |»‡5æ?üV zÛÉý)ƒÔöI¼#áûÛ¶M£A&¥æ …èg¸c]ÛãºÖ“Ú%Å»Ç!Y×kFÂ;Ôˆ™a—×¾~•2‡G 9nô$T–púÂ]+ÃúÊjV÷S\˜·2A4K¶6=aƒÇn+ ñŽ‹?‹t;5®d èrHÌBr ÿgØVþÒPn€:õÇN*cqÜã4ó/ü*¸ðµýãjw:~§g4!<¸7IüÙùÕÕO†;וêpµ¶Á»\„Ù)nƒÒ¾ {rÈq…<×̺–WƧ#¼\þð¦¶ÓüIÒî|(Ö0i"âÏGPÛ%%¼ÃËoaŒœc©§ü;?t‹WPÔ›H¿hd½©˜\HY ü¸ìs^³mu=›9†Y Wá•ì}i¬š]¹-×46 .‡Šëž3¾ðV¢š„PÉe`¨„]@$2°ä¸Ü3“J]Cáž»â;öÖôóZ]¹GšåhÁýÆ!ŽßP;W¬ßx[GÕ® ×ú=üì»|ÙÕ‹ìU‡JºyK±8@ÛÛ ¢÷Ð9z£Çÿá&ð«øœ$Ú kÑ8OíA;íy:oh󷯵p:Ò_Å©Ü @J·cnóÁ9äŒöúWµÝüÑo57¿óï#‘æó^Ü1sŽÄ~µÉümɼ±ÜI*›FNp2xÔïqZÇ9à­Næòôè Ò5†¢&z£ûãéŽ}«WH𔾞mjæÿOÔ--amÐØÜyŒå†ÐޏàsÍj|.Ò“Rðv®°ÇZƒ»EáŒy©”êî*ƒ>xƒL×#mOKžÏM¸…Òi'OÝÌ„}ÐzÈ#Ó­îM·± —ˆ#ñ>—©éz^‹e£ê2ÄEŠnNY>¸éŠ‹FðÝÞƒ§êðøªÊóMÓ !h¦ŒÇ)“wÊc :ã<×a¯ø2Ç£¨xrÞåo [çóJ.~vC´qõ®GÁÑj>=²¿Òo.ä–ÙUeK™[ÙäޤOÔ\m¸Ô´ÝÃ×wž’î3$É÷eLÐ.2!@Á=ñUa7^:ðܓ꺊BÚ|¸Žöè’²÷|u9^knûA›á&—uwÜzÕÓ¬Â#Uë–VïY—wúŸÄÍ„0@/l¥ó%‚ÝR‘ûøàd`ýi§÷áRg1!™‚à§l®˜I(lóšH¦Wñ5ù]'I}Og£•r$%Ö\üÁÈêz~rçF°×4­.û^Ö‹$%’!™Tá]†AJ/üAsà+ ß»Zܯ„aLÇ8ÛŽqŒ3O¼Ð5O‰VÖzº\ZÅtÑ´S-íÀ„HÊz¦x9ÏOcUäJ©x¶óÁdÒt‡†[X ÞfšO¿$°ÝÐsÅC«øOVñŒk6,ñ]Ä„Ç$Š… ˆÈÈâ¬ê:–›á+{ +TÑ­õÛÈ-ñ#ÎÄy[ŽB¡gµCÅV¶³so¦Z]Ϧ=ºsg2Ä£‚§oB '¶£W{ü[5µºÁ¦½ºË©ZƱÏzîfîã¦G>Ôx5tèæó¤¶¯é-b|§Âž½÷g§n*YÙÃä=Ôξ hc7P¢/vrzîéŸÆ«ø7J‚Y¿´¤¾D{#æ‹!Ÿ:P9N1€zÑÔ] :е~øh÷—×V›£’s¶<ƒóÛn?*µ¤øb?O.®Ú­–¥ ”læGbìHÚËÏ4i2—]¼m:KK+g¼W†›{eIQ˜| °äƒÐýi¾ðV¯¢jÞj–Ok¦Ãý¢F*RE#A’N?*wï¨[{hGgâ'ñ]iöÚm……õÄMåËgäÇ%=@?•/‡ š_èv3hö „2º=¢³ùRsÆNîimíl$ðí¢øšK»)G­y”§£wvjM_T_ i#Ã7·Ieq#Èׄ‘œqµ±Ó…Ó®ü}¤[^]jö÷pÊÖÆâþ]‰0êpyÁ BêÚܾÓôØ<=y,v’ŸíŠ6¼¯œ}㊧ªÅqâÝ&ßXšâ4ºŒ4Syïƒ6C'©çŸ¥h]ÜAàm"×NžÖËZ¸•Úvóy òùÇZÌךãÄš}®¡cg²Êd–ÞÝ0–ìO  Š@»¯¼çmí'¼–;h"i¥‘ö¤h¹fo@;×mªÙi:n£[x/“QŽ­¾H“?(pïµpÉ4–ì²FÍ£dH§í.4¼E¦i:…ö­o§]Ï–ïw“æ€pŽz*ßB·Š5§ÓO‹Eš[=(þ†|Ÿ˜±îsÖ¤»ÐLjì´íF÷S·Ó.猫 ¼þô)áÆ=EYÔõÙ<¶‘aö{åDóežx„‰#1ÎS=Š«ªèú¯RÏU°¶k¯5 <1•Q/\Gغ–°|(,´Èb·¿éæ."¬[Ÿ—#¥G­hº—‹šÓQÓ­^î)â#ÊŒå2ðÊ}*[³¦èú}Ž¿c-åüHÜE.à “¤ƒÉòª^-¿h‡ØàÒ¼m¶1ïî £^BëËok¦XÙê;jÐÄTºœl\üªÞ¤+K²µ¼»Ž+»Ña7 p8u­bÕ/ô«Bòám¯ž-¾[.LÊç±Åciz=Ƴw¥®Ç™Ã²H¨8÷b& Wˆ¼Y{£^Ŧڤ"ÚÑ/mügw=UÖ<9â)aÕ,áó#º‰\ÆÒ*”=#Ž*ö¿ªiMí½æ™«=¬+Óy¥~aØy¥eø¯í—×ñ]ZC)°x”Ûýj/÷xèA¡ù‰yµ[Ý3NŽÒÃQ°þÑ»·…RI’B…yÎÞ8Î3YÞ)y徂{th¬ä‰ZÙaÈU_Aô5§ªézd¦Éµ‹ù,u7„yÉB@} ä`ã¨u^xvî M.f‚ÖÁ‰ø>fyÝøûS¸ëÍ7M»[)5‹é4Ëׄy!ó sÃ0ÈÁÅQñäšZ¦•nÄY¤jÀ°ÿ[žwþµ¡©xvëÄíi©[É Fî-ηSà ìqÅT×§‡N´¶Òç….®­âÚg-ÊdçÔPN“ª¦™v³=½òí)å\&å#‘ïèkgÅún£©kú8e»·¡–$$(Ç ÇLV>Žt϶Gý¦³ý”‚ ·`vx<ƒÅkø§]ÔìõÙ+‡µŽ5_%bl)Lp}ét] wé ,ð®¶oÿ’¢f³+·v;‚ãU¼Sâ»=e¢Ó¤k ÕE¼Q7^>Sïõ«×¾Mrâ;Éõk-*ææ4‘íï7¸ŽHÀ?—½E©x•t ˜4øì-o£²A븃–=úö§°¬½Fê}rK[ã}ia5Ü+#Ezå>n™ÁëO¼×“’Ŧ-•ž¬°E±Þö"¶N~]Ãù‡Ä&­â‹ÅÔ¬læÔ-®YE¼yòÉþ £§ ð?]³²ÓÍ–º'MNDrùÜœð®p8 k¡OÅrÜkRǪÇúÆ¡V5!í³ SÆ[Àñú“÷ÕAâ[£o%½­«•Ó¼Ðàýðz“ïšÜÐt„Ö¼+m ’ù d“.«¸õ㌊]D–†„²u(þýzihÈ-ÇR+…Ô¼2þ‰o­oÕÙ[„ØAúœñí]^ƒ¨É©h¶÷‘溒ØH¤R3&Bþ0³¯‘!𬯠®€Žr8ôëZÒ10²ÇìòVGŒ ó†Flþ4É{3rcúWM¡©!@Çã\ÒŒ˜þ•Ó胅…Κ<{U£d$±u«Á²;UйCÁÇ~zÒ5;…m¦¿¯¦×‚`UZkrã½Äë÷6ÚŒ¤ ””‘Çp}*Ö…«ê7¾1ƒRk–’â2dg˜îP1È öǦx–?+[½B1¶g?Z­á«¦´ñ-±ùñ>RX‡ñ!"·zXó¥»=$+­´â8Ç%Ö5b~QËc=ÂçJ—Mû=ýí½ÖVŒIÈò$mcêÊ‘ïíK½¼Os +[¦ðBá‚ð7aœœUˆs®YÞÛXîÛlÑ6B¬¬§”o¨'Ô ¦.Ã,¥ŸÃ–RÉm:Ê.I‰˜)1²¨ÝµêO¡ô¬ßxnëÅž²Ô­1y¯¾Æ,(t$þñ±RëÈÅkÚ[gé·PêP“o+äù‹®He#ÐÈìHïX>$†ê?YÞé|Zz\²LA;Õ¹Ù’?‡†Ç¸4[«-_oÀ†MJ×Jðž“§øŽÞk¿%Þk[tm­O9ç¡Àâ­jòÍyöMBá¦wº…dVŸ®ÑÀúŒµûˆ¼ b5«…°½†àˆï¥´‘wSÜóV|Cª¾¯%œû;u·Ž2JìA´{žN=éY‰»+9È nŸá_MÁ?ÜJ¹Ç™¤Ý‚>þUó.pzø×Ñß°T¡?h}=@Æý:õxÿ®yþ”™“?EüTö-ÆyãšÎøÈ_þ‘r?³í{dÜGZ¾&ôk€ÆÞ”ß‹P¥Ï€ü%wÂ6™3íÀfT GNHÆ?*]Q¼âÏ…@Œ’ ÷¦Æ@.ÙÎãó«$dî :äàšªÖA‚vœâ¬OCñ˜¿ÑîW òÉ#¯õ¯‡µ a‹VÓ­§’á-®á-2ƒ¶têGBy÷«~BDš®£{¤ØêÏ2G œïž$̘cÌVWˆ|»«Øê–7Ð[½òÇ,ÖS9Y¢sÛF9¨úûVö©¬ -6úÞKd»[ XîvÍ*KÈ HÎ1ÏÖ¹¯øWVÔ5ÛMoKInì¯)¡¸Aþ àf6ôÚLTz—èjjúõÇŒü\ºv 'B¶ïxøIÝ#R0Dz€;ö¸™#2Ž@8Ϩ®óYñ­ï‹Yt˜f_OÚ\\Áƒ„©W!zî#©ö'½p’Fc•“¡•=n&$m€qºM~¿hÎeðž•!9/c ã§úµ¯È$O­~¼øeƒø'Bd9ΙnGýùZ}LÎ;Å‹æh–¹%ÛhÎ3òŸð®QVHÊôã®;×¥ø7èVàs‡cÇo×›ÝCæç*6®0{Vzú˜ãèŒÍÁ€ôã4ÉSh ¶r1Çz¼Öá›QÉ=>ŸJ§u#¿<îŠé8Ú3§ùábw+qY3¾âÀóÈqZÒFääç€P¸·XѤá³Ð´™Hù›ö!¯b úŽNkǵ–+.ˆqœÚBsÿ5ìß´Da®¢?ôÈó^/®“C8ãì1þŒÔ‡oÇŽ v­þÓÒ¸ÉXJé¼qqæ5²À¶+•4KsX­.oëÒ†ñù ²à"§Òu5±¹ŠB3´ƒƒXN÷4ó;c$÷«‘Iq*¢ ÌN§}H”NâEçö…Å…Ö0%‡püë'UñMè‡Vn~Œ*÷me´´Ò"˜m‘-ö°÷ÍSÕX·…4í›ý i>¥tGKâì7‡,ÏûIÿ ×qÀ=²+¶ñLÀxrÓ¾vè5ÄLûþ˜¢AMÿŸøÈ}`„óþà­ÿÈÃd騬våeÕ™Ç ÃçýÁFŸ©¾Ÿqð‘æ#óÍZÜÍ£Õ¾•ÝÜ6s’#Oý ¸9øÇ\–¦Æ²3=‘õ²Š¯øGÄ?õÕPÖÓëÂ/ëW¼&Á5Ë"N•yüj–ä3Ùþ08 uþðÉü+Å~ÜÉi¬ÞO š+ ‰‡f kÙ¾,þcp§úW‰øU¼Îl.F?à¡t6—S·ð_ÄgQŠèÜÎ’´@m>X½ª8¾:jp’³iÖ²ö,¬Ê~½ëžøtIŽüuÈ_äk—ºâF㣫ègmOb´øÛšiº¸ÒÙWÍŠ@OLç‘ZV4K†@ñÝ[䌆MÃ>¼ñˆ>b;^¯þƒM´ÿ\ŸQMkÐMµ³>¢O2òÓ|jÅwxàJù›Y]ž5p{]¯O÷…};¢¿üH­ÀòÀüv¾dñÉãg=ÅÒŸüxVhÙŸF $uÏÍž;â@H# ŽMxEÅÌ©ñFýD® ÜÉò†8éQø‹ÅºÎ—¬Ü¥®§q@ùJ¾Tf¤Ï|\Ç€ÊØ= «sŽkÂt‰Þ"1ß3Þ‰Œ0Q$`ó*ýŸÆ}`mó­mfþR¿Ö—/™\ýÑí‘ 8ËqØý+Æ>9¦Ëë!ÇÝíõ5êžÔ&ñ‹ áTƒÌÿ–`œ òÿy¶C‚Bò:I¾¤ÿ ð®AÿÇEzPù£çŒúô¯.ø?¨Ûišü×SGfè(y[j–+Ó'½zmž¡e:#Åq ˆˆ0`~œÑfÅtYÂÈ3ò`çÜýh’Ø.æÙdä˜Ð þ#“øÓÄ@ò8^ËÔš—rª7ƒŒCþZVi™WšM–µla¿·[«bAh¤ÎŒàä~A<7¦hZuèÓ,RÅ%RÏ»¸È¬Iü3] .8ägr‘Èü?‡VÂi7!~mÈݱBÜoM—¤$k^âáô!^Ëñ Áw¾=º´¸‚ñìjRF¾™¶•ÆGÍ‚sÀ+Æn5‚é¸ÿЫèøI/Ø)žÔû’ºß„|ƒ¥ ?Zµ³Õ¥YZO.AçB™ãäMvK˜µàØÝ‚0\ü¢@êr@íÅr¾4ÖµkiºUÄÚm•¼*! ßëv>¤šöÉÔ¡—Æ{qQÉ,k[i‰À&â—O™N)ê-áÞ.ðì×Z|>$.±-â£ÉlàïV#’8Æ>µCÁZ%ýõòjqG>Á÷\Ü3¨¸$‚3“‘ÇNõé¡X|7µÔÜ\Ò°~[¥Ö«E*†F•T‚;éG˜¼ŒÍQðýÞ¬ãLÒå²ÕvHmf’à¼m&>^Äö¬¿ \j7ÚÛY\´ò[\G ºI˜áS/Ï¡ÅwÚwÂ'LÕaÔc¾ºœDæEµ’U°Þ’Ðfºïý·ÄzÆ›-ìÆ9#ØŠÒŒz¥;Ø9O'Òt½A7Z¶¬ZæÎémäÙIãqää ô¤±ñ–±ã›k½útv¸ˆ¼2,j‡zó‡`2TŒŽzVŸ„¾jz>³ æ ößeUed‚á]Ÿ ¥qœzšè¼Oá«8Å®Kw#Mæ2y(oˑ֪jP_xóK°—IÓ‡îá’ÂÍHÛïQî*Ì:m·…48­|]§Ï6û–hlc—Ë–1Œ3nÀ'ÕWÄ:ŒV~°yözSÊæBÒfQ'÷]‡^:R¾cÛN²Ò|?imâx®b¹YȆ,Ñ'pÙíœñT1Èô«ÙÁâmÎëYÔ¿³¦ŽFŠ+©PÈ'¯<ƒÇ<Ñ­ÝGáMÛJ°’+ø®•¦–ñ£ÊÈ Æº8ôíÔNÊùì.¡¹‰Q¥‰÷ªÈ¡ÔŸpx5×jº.¯ã›{ JÊÜNÍ—$(V5Œ¯÷A `ŽÂ¹I¡Šâ).!óíÕÁxƒmÞ;ŒŽ•Ðøšæk;J“NŠX4¯(¬qÆI(àüÁ¯½.š”÷ÐкþËÐt½:ÃÄz|·ú„jÇd3ùf'*¤Ž§ük3Å—;Fžúp{}$ÛuW$©Ï͸úçÖ®?TÑôÉõÍAôÛ­8‹ÌicåfÇ<Õ[Ä“ø>-?CŸu¡‹ÍûK >~ãÉǧ*‰ò+ËXÓtÛ½cW]&êHʆ–#'š€ü®pEI©xŠoÁe¦io¬bVžHà Kägµ%xí-5Ks›*•g•bPêq•Ï9ÍòéúŸa§j¶?ÚW‘¡-‰vù@œ…u¤F~»oyâ+XµµÃ!M’©`6°8;Gpzñ\òÅ+Y›œÉ?¥ox¦Ap,§±‰¢ÒÌ?ºrDg?0cëŸZDZԮ´»…¸´™àr‹×¨¤ÊW±×júN-͙յ tûÉ!OöGLðp}i‹±ŒüAt5”k9ÂÄB‚Ò8\…cåÇ­O{¡C®Çc{u©[iW—†‘.÷~ðô0 äsO¿ñTž¸MÓÒ «{dd»¶Y<Ã× 08Šr së\ÈçËõÛ].ˆ QNÄÄêí”`sßµ^hèTö9ª–*=È8«Û” À|‡ <óRju¿ †luCÛíÿA÷×옻~ÅîÏÿ£^¾ øh»¬5?{ý”Wß?²Šmøin:rÝë£×4÷GDWºÏmSÒœzcµ6—¥Iˆ7QEsšJ\bŽ¿Z=©€wÓ÷‰§i öí@>ÿ @¥ý*…Ç=)G#Òwô Š:´rKn‚)¼†+ûÀ<§ãҬƅSÏÖ•Àn£§5´ââ2yáŠF1Š-­Ê¾–,G4c=i§­2EšZn9Å;©ö ?­.:Òu<Žô¤óŠQPAÀfla¤»ç=úp*~4Ž84^HeÚÀyÅX@#ˆg€åF8¬ÍkZ³ÒtÙï¯eòìíþö:¹ìª;’xù¼Uâ+oé¦öìBv[Û!ùî$ì 3Ú—á7ÃkÿkÄ:êù—rãbcå‰D_@+?á÷‚õ‰~"MX„Åü¶–Vý=Éîkê-G‡H´H£@¸â‘¢GžxÇLŸTø‘à‰`‡@hnüE „´·RXOeöXÕÃ-V{˜ç$XÛª•œT¯$ýžluh·¿uæ„k^:ŠÓPŠÒÖy¥‡NÓVlíÈpYD’Ê쨥¸—Œ5ëuÓ_Üj’û:|úÿ•ú¤ˆ†«›¸QEÊjQEQEQEQEQEQEQEQEó·íó gömÖn?âYyiyƒÔ9c8ü%ÏÐú&¼Ûö‘ðññOÀië‚Í¥M:ƒÝ¢hš ÄçÃ⸶ñn§ KÇšÇðäñ[xŠÝe äËò;'ÞPx${޵Öüb±6þ,yùf…ztÇô®SÂñÂ|GiαHeº„ð ö®‹Üâš³g§é×fÒapy…H(ÊFÒ§Ù³Œ{Óã‰nlua“p±‰ K–Ý ¸NùŸ 4iÒù7F)"†x\q°‚òꨤ†amu}aq$ïj‚Wk ,sëŒÎ¯búé‘¥þ™qÌ)Æ3å¿ ®;‚3ŸÀö¬íKÄþð½¢é³¬ÐÉ,ˆÓÌxÎâ„§'<ÖþšÏâ[K¨YÕo¡ÄÑ;¶Ôqʺ±õÁÈ>£ë&ïR‡Ã^K_OKµy›l¾÷9ÞøeºçH´ÁõÁ+ò3Gr9¯Ö¿†“¾xEº†ÑlóÏOÜ%=Ä-ÌÍ]?âSœá¤Æ@ÎÖ®úÉ É$žN+ÑuN4´ÈÆ%þ‡¥p7Ÿ¼–DëÜf°£×ÔíÄ}ŸDe´`¶~ñ`vªsDÇy ü3ZmÚzòz)þuð‹œA]78Ò0gAœXcè+"÷rE#ØWIw”G¡éXZ’¨F$ƒ×$š/~ÐdµÔG)Fãñ¯××nŸ ¾1›/äí^ßûAaä¶9‚1íšãü?à­;Å~Óì³Z‘o²Ȇó‡o¾œnCÆqÈÆFzõ*êyž­~×ó ãʨ+®ñ?Âïø^¼šÌÞé[°º†f·>™`2‡ý—ûW%ÔdQS{›¥eaÛ²ÄúÕ»)Ú‘Ôàƒš¥Š¿§é×wáÚÚ•c]îÀp£×?ˆ¡2e±Ò|B—í6úTÝÞ.k#Rçš)ô’à~«ZÞ7…áÐü>$!¤òâ|šÌÔ#'Á:<–êu?’‘Mè.Äþ'ºß¥éñÎÅ$~Ìb­]ݵÒÄø/åUhnìqÑj<–gùŽN;Õí6Åïîâ…\)v “Ú³òKg<Õ›iZ9‘а9Kp–ÇsâOKáßIm4É3 ûÁP?¥sjÙð1†¢?ô]v~3™îü$½º<äòNÞµÅDßñEJ½Æ¢­ûfj‰é¡µsp±ø'–UQõÍqNû±šÜÔ/wxvÂÜğΰheGSJþõf{BÄvÉü3MŠè‚ ’¾àÕÁëš»¦¤2]Ä'?º,öïBz“$’;M3[ºÕ|'¬ZÜLòÇjñ†9ÆN+À#:äËýë+Çýs5ÚjZ5ާêi`ËžÍ\îlƒ†ÿë×àŸØÚÎ?òSní0µ“FŸÃ½{î«ýk—¾Àš^z9þu»à‘lnݺRZæ¯&2\J{'õ¥}×f³cÃrÿ×âtÿtÑj@•IàTRïnžÖüó(“ôÅÜ’:Pš¢Ùõ?†5‹Ký ‚xå+ ªÙ â¾sñP+ãYëáô!Ká½vãMÔ`hghAp§iìM/Œ†ßOŒN§ %°âÛÑš—k³â­à'þ^[§ûµ•ãuÛ“êùVÆ¢ä|Sºü¢å±ÿ|V?ŒÈþܸï•_åL’ŽŽÙ·ÕG¥«søŠ†.1ÏaOÑÈú¯ýz·þ„*8˜¿JHúGá²úç^wñü–¿µ$qŽ mü1ñþo§[is¹†eà3}Ó“ëXdYn­H ޤÓLµ$ÒG jÇþõâÿö”gþY­Y2>ÀAÁùyïVM©Ï€oí¨Eÿ Ø›áì<ô#ÿB¦‰g)«{juwq#îJítW0×4ýJhâÔî®›p{×'1*Çkc[_ø\tèŸú¡6&•ZøiâMGÄ3L—ó öŽÀã]æ«`«§ÎYË€v¯.ø<¸¸Éì1^³«ÚUÏýs5-ê\~å+µÆ²Ã¯ïÇóîÒøËJ³Ö[K–v[Ș#FÑ»±ž½ëµj@?ç¸þbº]Y™þ%Ü’rMÇ<ÿ°)ƒ=†?hûŒ/©À’¯ðJÁpU”Öô¼1Kè&8¤™'ò¯Ÿ¼X?âu7àqTmÐ:õÁ ©NGÔÓÐWgÓBúÂY ýâ€ú⤄GÎIÚÍÇ>ýëço^\%ô O(RÀ¸ô¯ 4ëThc6ä•b;T»!ŹÆ ž8謸®sàÙÿAÔ‡ù¨ñÚé¾/ƉárÉ/œžµÁø_O xsU¿x Ê‹˜£òÃmê4÷°ö=Š4ê>î={S0CàüØôé\¤¬—GŠþ[)£ŽSŒ+"ˆ>*hã|³!8áŠ,Ù€Œ2ð½5£ÆwpGJÁ‹Çz,­µo”6~ëbµ-uk{Ѻ ˆØŒçŠhjIìY—|±mgfQÈ ÇÞ¾~ñÊìñâú1­}Òb3ƒ•=‡Jù÷Ç£$¼'‚I8üM ê{5Γa®éöÖÚ•¿ÚmÂ#ìÞQ²þ!È©´ÝNТh4»ciní½–I ’qŒî<‘N²_ô[s‘“p;ü¢¯fÈ÷vç“íCÜ:ï‹|mâÔ…èZM %g Œr1‘ާ𗆢ð}‡‘ Ë<Îååœ!Mý€ÚIÆ3[‘Èw…l `/$¨Jq•Îp?<¨ø¢kI4åš*м‹€yg5‚^ÃÁÓA¬À¯ww‰D€ù ã€Êp}{ŽkÒ]Jg“×5â¨@ðõËq÷01E…ÐðM#OMOY´³wh£šatPÅA=@ÈÉ®ãÅ:­÷Ãÿ±i:%ÔðÛ"3§Œ#ÎIä0€?Zã¼9ÿ#>Ÿÿ_+üëÛ®,,u }cú!;áwÏ\r(ZlîyËøSø‘kkªC$+w††´Ê"F+Ñ”ž9ÏéKwueàËK-3SÓ-uË•FwY˜í„1èŒôëîkÓ£µ‚ÛÛÄ–vÈ0°ÄDè:Ö/ˆ|§øšd’êi­¥ˆ­·NG=éß« icϽMY¸²ÓJÒÛÄS]Y_yeU PÌÑ `G^•éº>›g™uŠ0~r»ZBz³c¹ÿ å|kà¿j1ÞZÜAìÛ ¹r àñ‚¢ác‘ñ> ÚM½¦™¦Hë¦4"@ä ÜnêÇñÏi×ÂÂå&{x®Õr 3Œ©Íz=÷…—Ið‡Ù¯D7w¶_¼'¢7\Wàý.ÓXñ·¢Slá‹\#p¤Œ•õ4|I£êšÝÌZ…µ¤÷v²B…<˜Ëˆ†1´àqSßE£Ç”zù¼]A! !µÚ Ð6AÉ“Æúþ¬Åkm4¶VD©n¨øÊŽä÷9«§Á—>0·¶ÔÚæ+æ„y«p­ó°à0Ú29æ_C;Ä~ ¼Òï- Òîd²°HTÛùmË×>椼ðóø-u/­¬g¸ˆ3¥ÛÞÃÃðzÕO_ÿ„>Hôˆ--oÖ‚È×ÜOÌvî úUM{GÔ|NðjZ}¤·v’Â>HWw’W†\}i°CõMVßÃÑÚéco©4üò\ŒŒžp¾ÕCÄqMªù:´X4@~XH௷5§¨Ç¥X[X[kö÷ê í¤Úʿ­î?¥PñeôIkkhZ 4@¦Vûàõ'ÔÒ`s±Ë-»«£´d†Sƒ]†±áÝ>ëRVºÕâÒï&Dy!–"à1<Ž•ÍhúåÞ…|—Vn#œ¹e =°k Ö<©ë¦öÊ>+…2*²“یѥîI­xªçA¿M6ÎM­š¬H·ß÷¹õªúæ©ø‚ïûRÒÙî`ºfÀ ÏUÁ>µoU¾Ñlgµ´Õ,$ÔníâH渊]„:{ã¥fø¾úäê¢há³h”ÛI  oÌK} ú¤š.žÖVº­¤××[ªM,l õǾ…Rñ~³#_Û›,ØéË }–8\€Ïsëš½¡é÷âÖãSÕWI¿ši#’ã8ûÇ#¹ÿÐÞ¾ øKûÍ3S8 ý§ÿe÷Ï쾸øcgî?ð7®Yð³Ø©#Þ—5&!GéíFH4€tô ¢ŠÍ0BzOZü¨'#®hÆiE!=¨Ï4À\ÑÚ‘¹ü:»ðv©âÝoY¾Ó5ox’þ+»»í7K6*#ŠÖx¡ÚÓLåTDî2ä™ðNzé%I{iü—wµýÜÚ·s9>gȾgSáߨxOÃúf‡¥Aö]/LµŠÊÒ ìþ\1 D]ÌK*’I8äÖW#m»³m´AER¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¨/l¡Ô¬®-.cÛÏE,g£+ øƒSÑ@Ïí?á ø™ìî#h§°ºžÂe#4nG?•y…¬Ö÷Å16€½».O©â¾÷ÿ‚œ|1o|H×ï!‡l’ŬÂAÎKe%éþڹǸ¯€ô[W½×¬ãFòÈmÙFx÷âµZ¤Ì1 Þºêz”GÏýÑ,Èc#œ¡?à{{U­5§Ð–kËÆ"0º‚&Þ6”>Çš[w]^ñrÉÍÊ0K…]¿9ilzœ}óI£«[=Ü…´‘Û< —0È¥Yb?Ú =ëSÜ–ÔÃ}¦Þµ”fhмÐÅ–/O—¿‚GøVb&—uà·Õ¦’ßLÉ> Û<;‚3ŸÀÖ•«A¦Ú\ÝéóLì¤`B§ø®N}ê•ÆšÞ3ðQ’æî$¿†æC“ªÀmNSœƒìhhktdÝÉwáZÜh· =´òŸ6ùWå Ùpz;ÕRÎX4í!îÝZòæØ\HTs†'n}ñPZjø#Âe{j w>ï²ÈÄÅ…îHëRß[NÚv—¨Ï/£/{ò c¸GáK Ÿ¡·iþ5îß±L?hÿNíJÖÚZðìóŽ žµí±Û”ý¢üxóæRG¼Ô³3ô÷Ä e\ çä=½ªO:·À ?v žã‚[‰¤˜õü=*=qs¦Ož…?*’Y>Ûû>¬l ý—Qš%.ïÈÎ ùª_ÄŽškÝgÏó@#~Cc°=ê¥ØX†G=ºV¥Á D@ëÛ…W¸¶Ê.öÚ×ð­.c±Ï\°yÃŽs\§ˆbóc™%Áãœ×kPiѤj™q" z•ç½iêZ}Æ¥a-ݬo,RØ›co äE ‘[§£síTµˆô™N›o¬G;j‘AoqnÃnÞÁÆ9 µ/} z/ÔK½ m>"Z꺼’M ·"á€Si*ƒ9ùkŒ¸“͸‘ö…ÞŶÓ'µwzžsñÏGÔ®E–’Z9—÷ Eö}»ƒx$¯ëÅp÷Lu1€v*]¹à~UH™ˆ(RqÏ8¯Õÿ„-çü"ðkŒÈÐgé é_“уBçÚ¿V>Ê'ø!à–ÿ¨E¸'è˜þ”­fGR]HfÄ.å¨9ëÜ× ¨ÇåM/ϹÁÏk¼Ô×eа8̧'Û5ç÷ÎÒK ínƒ¹µÍGyzž†!éA‘FÍSçUî+m?wÓÖ¯@«`2’øëŽŸZ«(ÁF#;{u®“ˆ¥qn«ãp<€k‘Ö`?1'øŠíne;zaOsÖ¹Mj7™\rxàwªÐ•>>Ÿø˜F,: וÜx§SÐt]tûÉ-”Ã#2®$9ê {'Æýyn£%B’ e›Œzñ¯x{RÑ´ÝOM¸°")B´ª6É—ÏÊGŠGÌö¿jw6ð[^ØÞ\i÷²Â¥å¶r›²9¿Jv§em¬9“PÑtMJ^óI`‘¹ú” I¯Gý•—ÀzÏ‚µáâýbÖÂçP´þ˵Žur`h&pÛH ¸.9þØ× slÖsOlòÇ<‘;GæÄw$˜8ܧºœd{Útœ`¦ú— ©6–ç4þÒâux|=¥ÀêÛƒóÏ9+èÂx4qÛÿÏ(h¯/ʘî;Š…N[ ×9©åßíãµ]2—lh¤Zß tK}sÂ>Uݲ^Û‰¥WŽÒCmå³ dG±¬ïŒ­–ÓdzW.ogµðE‡“,âö\˜Ø¯UÇÒR_‘Õë?ï.¤’_ \ Y“§ÎË â{'ÀIݬÒ%k IÝ‘Âàcð¬/M›PðV£äFÒÉäo±FN66xúsøW¤üV²·²ð ŠÚ%™ v®{á5ýž›¦j7·Ke\FRbÄm}¤æEVä4‘æ­)hÕ Ê¯J޽ÓSðO…¼d†ëÍTÀÔ´ØÄ–Ò7ý4‹#onW§÷Mr÷ß¼BK¤\é~ ·u¬¯£IÖ) ¿èj]Öå«=3©b8nµØ¿ÁoE÷ü#«ªÿy­˜/ýõÓõ©"øE®Aµµ´Óœ$ë$ƒþ„þ¤R½öØÔ†úCF¼Hæ¼:r† :Àb¹_‡Ã>(·\d¥ÿ¶m]}‡¢Ñ´­ìÞl¶Íĸž0®Ø>Üzœ ä~|Þ.±\ 6õ>ãi«{¢²eèZÚ^sËF ~µ”çs±õ5¥¬h·¾¹H®âhÖdDýVT<†R8#ùŽÕ˜zšWèRZÜ8ǽM(a‘œv¨=N "š=Sþ̹ð¦›uikS •]€Ùf¹ï‚¾7¸#÷ÊyúÔPkP®…ˆW3 Ã“Ø Ö¦øòøÊ~‰MSZEë©kW“Ëø™zùé9?øà®{Ä­yªÏ)îqùV¯‰.Ä^8¾œð<ÌòØÎ\¹’foSCØkp†á¡Y@é"l?LÒFÌSŠ`aƒÅ:7Á⤶(-op —ÉÿžN?:ßñEÓ^x?E•سeÔ–9<1£ ë­qà}Jͯ’Ó܃Y:Ñ'Àú?=$”}>sZ+ÛS.¨¥dOü šŸ ¾„‘ÿ5®\¾œcÿ¾«"ÀçÀº¯‹ÈM¼»øF­ … äzóIÌ9ŽXÖ¦¯(mbá·nLø¬‚sO’WžBìrçý*nS‰Ûx3ÆÃw$´bD~§=+جüYg¯é3}žEÞc9Ry󯕤^jŽËkòƒ'žÕ³áig±ñ%¤¤Ê—5zKs=c¶Æ§Æ¹/´ãù×I«œ|L¸ëÿù?pW7«q®OÇü¶þµÑk$Âȸ9ÿ–Àóþà©)þ†gŠùÕf>ªXs¤ê£Ú<{|Õ?Š' ªËƒ@RÒE]3Q˜GšŸP[>Aý£oþð¯ ôw;ãh+æËKónêèpËÈ5é^ø¡å†ýFE΋]hL_+Ôè>1óá‘Ç95äúcÅ ¬)}®žùæ½3âf©§áA,¬Š?ºs^g¦sàmdàä]ÛóžÜÒ-»ê]™3àKcèÇÆ¹ñ>Ð¥'þ…^ê‘âN9lã ¯ ðèÅZh<µ¦ïªî,üc©Ïâ»ë&•ZÚ7—b˜À )àfšD·cÐV-É'=*HìÌÙgÏVnõæ ñgP·•’KH&ã •5~/‹Ñº†ŸM 1ÁØàÿ:vóüBž3ÇH9㡪0 ©CÔ~µ‡áÏÚøšGŠ%Ysµðç] ‰ym­¸žM ÌOÇÿüýÉå_ñÿ ]¶q÷_ÿA5ê¾2IAºb§rqŠòŸäxª×èÿú ¥Ø/«=v%ŠFKx&=?}¿qóŽiâ5ÌFÐTp=‡ ¦B£9¹©Ä` î#xçð  }[Â:^·8šöŒè0 /°ã=ëJÞÕ,¢†—d1 HÔò¾§½M2ƒ€NNOZtÉóm8ܽv÷¢Ã8ßü?> Ô>ÛävlT+ù¨Ìö ð-¾»|nEËÚÈTˆÃ>§‘G˜w‹¦ßwnm×ËÓÚ0¬|(ÇÖºÿ(oÙdã;ù#ý£Lñ™‰áf²·wh}æ.s’Hϯj›ÁXO Øç¡‘Ž>ñ¢Â]ŠþiÄþ¬qÿjäžçBø_ÈõÅàsÖƒÅfƒHÈCëFy¤&€¹ãµ8`ÑÖÆhï’iŠà)OùÍiÐíAÒƒN<Š@)[§©¤h< b?3FGJ)ÀÁ :€¥'ŒÐ>ï4¼m Ò`ŒúÓÎ@éH£<÷¦!'^íåX$h`[‡â68ã¹Ï°Éü*Éæ«Ý•!cs¿GzOa­Èšf(‘GÌ„sì=Mp7?hø—¬ÿaiLÇE‰ñwt¿òòÀýиæjLjµKŸjmámÙ²vjWÑöõ‰ó?…{ïÂφ–¾Ò¡U‰T…ˆÕø{àK_ é‘F‘*•\t­OøâÃáÇ„oüA©Cyumkå¢ZiÖÍqss4’,PÃkË<’:"ŽXd’: ñÑ⟎ž*ðèРûGÂ멵 Íw0ɱwiÙîŽûHc(Éîä{ûVÞ‰ºI½‡S²‘læ‹Ëž 2¬I#nÓÙƒíX×Ò½„nîô .>ÍÞ&yß a×Ó€3FãH¥¤Ü[GàY,|@²­·ÚƒÛÀóC¼{ŸÒ­j—ªZióƒ!³H¾Ïj²¨#Rp8àõëQiqÇãOÌ·³Çm©YÌ+ÉÎÔ‘OÞBzg¡YÖn[-.Þ%ˆZÙÛ›xÞܲijgÔ“@–Úa1œc·^Õì_²C4_´WIã7Å3ž¹ŠA^Bí½ñɯWý–åþÐ~nwjF¹>á‡õ¤ö¹ÒÇên³ói³ gä?N•ŽÛ¾ë Ã"=^^>¨õ©µUÿ‰|ÙêPÿ*ƒàY>øÍêYSÝs±ãþú?g/‰ÒٞѴ—0ùzúær‹ÝäûsSMˆä\üÅNsœ{ÕvrÀ³ŽO9©žÆãä²}ÖŒãüGf¦6`»· àv®Îæ6 H]Àž1Ö¹¼:~qu<‹¤lw1Æß­2O”~"¯Ú~"[¤!!™Î%‡SÚ¸Ζ¶:±¶œO#^2…ÁsÎ{¯?­m|IÔ@°›Pw/¨_0GТŸ¸¹ö_˜ûšå~N"ÓoÃÄ2+³ăò„#Г’}…p;),Mý¤–ñ2Gqo ‘ˆD‘O 黡÷¨‘!´Ó£·¿„˾S*F­µ“¹Å3Ķ÷z~t,Ï*üåTì§Žü? ðdO¬x^õ4–Úê)›É”®N1†RðžÔTÝ1Ùîh^4}’x£Ò^ÑãR§•”:– ½ŒìjkÝ2Æù­æ–î;K¹‘|Ø¥_¾GÁ à÷§ý·PЮ Ó­·›k‹v”ÈGÉ#ç=N}j-sÃ7Z¬‰{WóÑ|Øš@')ÚU8ŽœÒЫ²r[Ý[Äv^T!•-ÊΘo,|Ù-×ozà.‘îu‰·Ä²0Sê3Åz¿‰#Kø´¡ ²\ø€cOó` ²".Ð2ÝrÊ;áyí^Uyjlo.-Ën0ÈÑ’:dSL™!¨IaŒqÍ~¦~Ï3y¿üÙçû.5ü‰Ò¿,Ó àƒÍ~¢~Ìî%ýž|sœX²þR¸§ÔÍnnj)»Kbç±óÄÏfêSpêr0qŸJíµ%ÿ‰T¼ËÁÎûµÈÇæÉ!f\‚˜®Z_½Núß } Û­Ì Ž òsUç¸Ú´­×4ë©Ò5’IæXbQ’Y°GROa^UâïŽf“tÖžƒûwR'b˃äíÝÏÓÜ×W©Ê“nÈô[»ˆíÓ͸•!ŠÃæcì:šñŸˆ4=F²±˜]Þ®U»d?í0È_ ÉúVW‰¾8‰í¼Cá[@’(†tÒî§²2(êæcÛ Àö®O|"ÔÝ ø—Er>õž¥êœÿuãRïªWk¥ÿ¯‘|·ª¥Ï:ø­ã Ï= Y®eHضÖjóœ`ûÖoØ®|m¤Úƒ{k Ü,Þds¹=Ò½E¾ |=»cý›ñYÒ˜ò«©i;”}Z9ò¦Åû?ܬôŸˆÞÕÀ?êuhý|è€ÿÇ©óù?ëï³}ûíùØ«á­;û+Lµƒz¬‘ ËnøæµòI%‰qÜ“YÚ‡ìùñQY›KÒ4JómÐõ&Ïà’gô®sSð'Å !}GÁúý¬`}öµ®>¸!ø­µëm,iS܉usù«,‹$ÎÕ •Ú¤s æ¶äƒ¦åÍïv!J\Ö¶‡ Ú-¬‡‚ø=¤MÆ#»ÊŸ¾I«&\€@ÁïÞš¥‹c<y®{³cÆJƒÃÈ .#þ†¼?áãù^3Ó®ñëòšöÏÆáÔ6õòÉÉë^à_ùôÀ{ÈGþ:iö%õ={OñO‡üXH†8ï 9s¦ÞÄBðy1¿T>àŠÎÕ~ xsPbÖ­ç‡'lbÛS€ÜAŸiSæþßZá>H`ñ’±èQ“Ò¾ž×ü«x_ÃÖï¡Ç]ŽFƒ¹B¼ª¸ÿi~uõúU(¹j–ÂNÚ\ùö€ZÒ±6úχ®£êu/#ý×E?¥:wp¡}KÄz5š¯! y.]¹çT/æÂ½q¬-›¡ëŒS•k‚!8È$f£Bõþ¿áÏ0?4ûsoš³ßÜ 7Iw9ظôUß9&¹?‰ ³ÆSç©+šúF‹ ê1^ñG ã;Œtùi’jøßÀ··zŒú…„mq™ Q™ȸ`;ƒÏN˜¯ ]7.õÌV½Æ¹wÛš×ñ»›OÝ8$FÃèc¶×î0u)<˦læ«î;H;â–W.äÓsÆ)7vZVV&´·72¢±Ç5µ«xjçDHÞIQÕúmÍ`Ç!Fjéoïä¼ÐìD„»!#$óM"% û ^O jªÇ*¬ŸÈÕm)ÀðN¶¿Än-Ïêj],çÃÏ_½÷ÕUÓIÿ„SXã6qÀäÕ1-‹×Kƒm"'æg'‰®]ß/šÑ¾“þ%V ž±Çü ²ÇZ–TWRþ¡r¯¨Ü8à3dcéZ:Нt+%¬Ì‹œ”ÏÊßQXrEužð•¶»§\Î÷†¢Î@9ëBot'z‡†¾(Øê‘¬WDZÜ0Çå'ë^KñcĘϔÀÛÌB·CÖµ[{¢©G[¢yº3Ét,ØÓíIœ¼+KñΧìÓÿ:çôB‰ìIéö´Ïýô+¡°ù|wªs‘ºoçB9KÐêPGñnÙ£#¦ãO¿?éRÿ¼i ÿC€cv©ê5²;Ï„c:µÉíåç^¼˜Ç¥x×ÂÛØlõi„Ò¤aãÀÞq“šödWQ´‚=»ÓÌOœxvp:Ÿzñ¿x¢ÜžË'_÷M{/ް|?0ë^1à¥ÄП,Ÿú§Ø;šú‰õ6¶ÔïF…Bø894È>'ëÜ8‚`?¼˜?¥gè ºÓXÿ®cùšÁ~äd .Ò%%s¾‹â­ÀÀšÂ6Ü2v1×a¡xuë12Ûùy8Án•â²õ]¾ZõO‡é·FŒú±¥v4ެ³ÖÉ=Esþ3›B¸b ®k¦A”VŽFÍ`;ИKcÏ>Þ$p:›wÇé^¢°º My7X®§|ËEŒØü©Ú^­}‡îåŽòe‘%Py$ tæšv=bRNp1Ïjh;Xg#ž•ä°xï[· Ï0ÓD´aø•©ÄàI ªEwÇ¥ ö¦òŽwVn“¨M¨ÚG9UR뤜 ½›…´JG³RгÆØoNp;}ECàqŸ ØžIÀãï_L[AZ6N8Éž“g†¬ò2l_˜Ó'©Ð"ðT޾´ÉrZ­«Zi¬©q)Œ°ì ÇÖ™µ§\*˜ï£ºp cº¸é@@pk†ñ™ÿIŒž¼õúWw„‘wG*H£º×ã2~Ø™÷þ”lD¶2dœ¨=k®ÑW÷`湆$·Ê+¯Ò>àëHQ7â Ž„f§<)=}êyzв¹\ÐzÐjÏOø9Ψú›–ëþ诽f°ËðÇLÿ®KÇâÕðwÁ„χõ ÜtÜŸ÷E}Ùû2\ÛÜ|1´ò.’àÄ|™#PCDÀžG|äÁÉ=Î…ð¿‘ëãŠCH8Qß4Œ€ Ó‡š Í(÷Æ(8 @A4`öäú ÍÑïc½7MÉq|$ÑýÖŸPrÒ˜XÓ¸¤ö¥? æ Ž/S±Å1¸¦ i[µ ê8¥lãÀ8Ïìw<Ôc&^eaÒLÙƒKM¨Íy¨2|ÐÀ‹$mŽRè‘‚[+¥:R«.X/ë»ì‡)(«³?Çþ ñ/Äß_ü9ðeÅ燬,|µñGŒcC–k$k"ÙXk¹#tf”e`GVæFP=Kþ°ðŸ‡ôÍJƒìº^™k•¤Ùü¸c@ˆ»˜–8U$’qÉ®{ágïøVþ¸¶¹Ö/THÑy ±ì«ZÕ#¥: ü_Wþ]—É„_Å-ØQEÊhQEQEQEQEQEQEQEQEQEQEQEbxâÂ-WÁ^ ²<Èntûˆd_UhØùüמy¾)h‚+u»kØv•~±ª–%”öàWô$i4mŠeaAê¯ççÆA¦ø÷E‰¤íã’&#iÞF:ƒÐÖ‘ | >Áu¤ê1©a"#·Y>»›Ðíê|Ôvvöå.ßLÒá wŠ#–Ûß;sVtû‰­õD‚åYRFŠ{sʸÎúxúÔvÖ±h÷3ÜZÜ5ä6‘¼ˆH— >¸Oµhrúh³kZÝYÜI˜Ú?6+‡9ò]yVú„z­ ôþ ðµëÅ%½ð¸ºd_,oŒä Á¿0z»ójÖ÷‘¨E¼ Q£@¾iS’§ê3øâ¨øz!¤è:Õ¶¯a"Ãu8ýÓ¬ýÛîÎÆ‚WFgoøL¼#;Ø[¬Vs %³€|²Æà=ªÖ£¶›£it04sÁkÆuÁ31åyì,úD–~–}ÉF`',Ø•A(ã·½:æÂ;/è¡î¾Ñwp’O),`Ý€¿^ çÚ…k•©”îÉúרþÍDGñ÷À€?¶mÿVÅy–Ò ÀÉõÍzGìë 㯀ðF·h1îd†fö?Võ!ÿù}”ã&§ð.É~xâ ˸j ÅsÈÞל}AüªD¡ÍŸî‘ŸÂ«ü8>gƒ~#D~îëGÇÖû-g=âoGfxµàÛpÊ«ž{õ¨&Œ>l0è=jÔùŽéÉ.pE&[kàâµ3±—4LЕÈÉns^7ûFêiž û:Þ_Ü-°*1Áå‡ä {Œç‚O$f¾uý¤/ZãžÓî·W’å”uQüÍR%£åŠ7Moâ#c!,mÑw÷ùØ,øT? ’m¨Îùø·Ê¡;ÿ{vúV_ŽoßZñ6¯¨;îiîdn½³Àü±ùWGðóF]CA¸¶[dÊ@uÿ–oœ«ß·¥'¸n΂æîIí%/rÊ‘Iq ÑÎã¹ϸõ­[ÅݪL“umÝ3L¬3ŒÿxâkOL…ÒÃM³{X ¶¦ÞiQk¢Ï¸³är:qŠ«¯øràØÁ&—™ä;µ²‘÷Æz‘ŒcÐÔ=Í]µ=üqÕÜi)U3€Ìsï—(Ã×o?ANx|bÏRxä—KhÕ£òаoÊÈØèsÎO]Õ‘á÷×4˜ÛQY­n"f:®ª…##8­+O xš[Ëø´{9®tý:Ñ.fd#.A‘½· ö-¤4¤ú•ÊxŽ/‡÷:–‘ö>p•Z{TyžDÀ%‚GÈJõë_3êVòÚ^ͼL®Cç®kÞ.üg¨x{B³¿‚Cqol<Ñcq+ìB[,ªEbKu“ë^q,·×Í)Þò¹b}ÉÍTn*›lEù—Ó5úkû*Ì_özð˜Á;a™)ä¯ÌõC ]Üg×Ò¿Jÿd›ˆæýž¼1µÃl(þÍö‰õú˜[S°Õä‰t›™e• &.òJÁU@Û’Ià­|åãoÚcÂÄÖzf¡kâ AI¸˜y(ÞïÑ¿à9®ãö‹ñ%Þ“ðûWÓn-#5+¥µT¹@ÂxYIrã«×Ö¾3ºð_‡. Ø?Å4XúlaŠÆ”y\Ÿsº£RQ]Ž“Äÿ5_ÊÏ}¨ ÎVÚÛeÅÒխ®fó¼„pdû3ì¯p­Ø‘XÏðÃÃŽ1 ½õœŸÞ¶¾?ÉÁþuXü80û'‰µ[i¡I@ü™•m+IYõ"PjK¡ÑøƒQ¾·w{“¶gÜ2H†?ÌÕd9þ.=+ ü!âkq›XÝáVòFO§;Hýi‹aã[p1a¦ßŸK{Ä "”cEEl‡R¤êÍÎKVt‹nÿIåôÉã¥së%ÓÞÔ“¾aŒÊ?5ª‰vVìîÞîɇQ<%qùÕ|È¿‘ÜÂ<¬ÉCþÉÅoøÅ^!°»‚ 3]¾Ó™ß c½xPÜÀ^qiñ E¹ÆÛä\ÿ{ŠÛÓÇ©_|YñÆ“y>ŸªêÃSh[cŨÃÚÿmäsY—^9ÓuœgÀ¾Ôr:®˜-Øû“Zäõ_6½¨Í} Œ<˜ùc$Ž©$ð:““UÄëô¬£â¹Ò¹¼å6¨Éòôס·}§ü-Õ”‹Ÿ†æÉˆåô^X°Ý8ªið»á5̱Íg}ã Êm߸»UaÏ1“ÍRóÏJPÁ€ç§j®Tº~f|Òïø'ù¢æ¿ð?JñdË=ŸÆä™°6kvøú”óV!ý—ütŒ‰âß ë@Œm­Gþì›Mh/ñïOŽ3,ŠŠ ;ªsÚWÚ×ÈRvq_èÌ+¿‚Ÿt%-ÿ¾¥}Œù–H.WXÉ®WRÕ¼uáé5]þÕ‡_>ÕÓùŠö}f×Tð>¨¶Éqâ$‘Œ.Ñí$d¯làñŸjÒÓþ3xÛMEâmEÐ lžc*ãÜ6A¥ Žkš2MzÁ.¥JnƒMyÿÀ>f×¼sy­Ø5¥Ìm'æ%j—†u/´Z^D·6·I Åpçqë_WÍñzÿRÕôO ëK›íº4›êʪ߭f\ß|<ÖAþÓø_£«7Y4Ë«‹fÏÓ{/éWÍ>ËúùòC£rÿ3É4‰¬¼5nñǶ…šVI•³ŸNMiZx§O‘É ®âóáçÁ}p~óLñ^‡/f¶¾†íèPãñ¬«ŸÙÏáÍé'Iø—¨XÑ5]”øR?ò¢ýâÿåÒÊkîkôkªZÝF»g½· ´&DÉ 8Îx¬i¿eCqþÄøáMMºªIzö® QGëTäý›>0Y#5†ššÔC‚úUü7CòG4^n¾Cå›ÚÏѢ犮c}ñC†ÝëÆþYØ\ëoöÙ&ŽEPmþÏ(Ëç©Ï±]w‰< ñ/Ãñ<ׄõË4#æ2ÙH£]¸®&›EÔ ¸Ki­§…Ã*¢š”Ò¹2…D½è³WHÓYswç)ÔäÍ}oâ?zÿ¼ÿö²štÖ`ÄÑb°hÖX>`xÀ _`øá5çŒþx‡Å¶žcIfscøùXÎgü—îúE|£ã}.3«Û›[hŒ¨®cˆªqƒéÐ×¾xÇ^(ðF‘m§é~"Ô¬mmÆ(nXF¼äáTd’zw5½'MK÷‹C9)ÛÝ*¬™ AŒ¹àŠS³gÜU"…!(ƒÐŠk0$ιúèmÐC.ævŽO­yŸÆ³ºÂÏ'æÜx¯IVPäcšóoƒ}…– ;XŠbg'àÏá­Z½·Ti–HT F ÿ:ô/x®çÅ·J©¦ÜÄþSy$´r‚?‰Onد%ÒŒgÂúÊd/ T'–äæ½3öoðõÏ‹üQmá»#þ•¨]( ìP¹g>Ê ŸÂª)ÊÉÚM¶oßøCÃú©-¨øjÝÜ’Ís¥LÖ’1>ª2ŸøådÍðÃÁ;ò¶^%ŒÊ›ØXcëöz÷_Ž¿ ÇÃ/ýšÕ$ü"âÁåÉ#h ,d÷!¾o£Šóò¤úÓ©MÓ—,–¥BwW‰ÉZø7Âv?ñááK›ù?箯zÒÇ÷c_Ï5jãH¸Ô/í®îü«h,Ól6¶ñªG‚N@ œœu®„8QÔ)ëj¥ÛF8'¯"£`ßsç¶írðކBkÓ<]àCâM·VìÝ‚9ŽÉW`O÷H óß>Õæ^!?ñ;»ã¼‰q;&~ԟζa’æÆ7MJÓ¼9ö|!ƒØÉËŸÅ ³½Ã3¼„bxïÅsÿ ¬¾ß­Ôr|£²Q•l18>Ç¥Q8&/ hOÝÎ*ïçN“˹‚Hv‘JÔŠÝëcÃ7i¨î (ÀäñÒ²0Ojr†ÝœžM ÛPjúgb]½køõ k$.@úQ‚u¯ìû{û:â×Oš_)'™6oîv†Ály{Ó¾!ýºÁs·ËP¹8ÅUî›%+4‹>'m¾$ÓXœÿ¢[œŸ÷k™¿m÷R7©Ít^9ã¾Ò§ÃØAƒîsÏŸZèZÜhžÍbkˆÄÇ–¾•^Ö¤»‡Šô]2 Y´æfI;‹dUO1¬ “ƒm/òªßyºU¬&L”-òúUÿãûaýí¥ÿÐkEº±‹»Z™šSmñ™óôß¼÷ÓÆºÄ¸Î֛ƹë5ûoúú_ý V¶´þWеœðwÈ0zõ‘R0.eó'v铚i—0¢ÿt“Ms–=)1À¨4H|r²A"»|B½ÒÅ)ûDøò>†²¼"ÚY¿)¨ tqµw¨”|gÒ,|?â]>ÃN¶6ë¤XÜyK’­$¶é$’ ú“ϸ¤ñ³bsÏü³?ʵÿhÈZ/èñ±ðö˜  8ÿuÅe6ÔÒ.6ä—ªýH<9fš~© – Gk6îHÍ`øÏ?lAׯô®M`ºî :~âý¹Ïô¸ÿé[3±“ÞýÑ]ŽŽ?t£ÐW! ùã?ìŠì4¶ Oë@âmÇ×äSÛ<Ó5 â¥a†8è)z¯Âÿ¾ Aÿ—–ÿÐE}eûÜLº€1òd·žV_V[¦U?€-ù×É¿N<'ëö—ÿÐE}]û4ÅëÅ„ßLý±ÿ¹g£:cÖý¦ÔæŒñH:tÅçµ#!O$RûR´´(7/ 9³<=¦C¥Y4Vöëi rRl„™ïÎOãZx?Z¯$ñ¥Ô0yˆ%`Ì"'æ*0 `YAúŠ-vh³Þ—ŠNô¸æ˜€óM=G4ãÒtÍóCt£§ãJÔЄ_Êž>þÔÕâžhsŒÓCgÿ¯KO¡ÏJk2ƬÌp=M1 ,¢%,ÇW%âß'‡í£aÚu+Ÿ–ÎÏ?y¿¼ÞŠ;šµâÛè:s_]åm–ÖË÷ç~Ê?©íRü%øi}âmY¼E®2òlmR>X—²(ì"Ò5¾ ü(ž[†Öµ‚×:Ëy’Ë ê} ¯¢--RÒ®'Å>5‹Àwú‡t½ó^ñ&¶'û •²ì‚4…TÉqs9aHU˜reP‘Èß-Qºø)iãií.þ$ÝÃã¹­%3ÛirÙ‹}ÚBt³,þcn·2NU·ü ÅkhÓVR¨ìžÝ[ô^½Úò½ƒ›¤Q㌠¯xÇNøðÿSÓ5_ÝK1Ö/mu y‡¬à’4¹•ãùÏÚs*Çl…|ÂYÆÈÙ[ºð'Ãß |1ðü:…tK= Kȳˆ'˜Á<ÉïI!TP]ÉfÀÉ5±§iÖš>Ÿkaak •¬K½­´b8¡@UDQ€ªÀ¬ÓDâ¡e×Í÷§o›޼ÒÜ(¢Šç,(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š­©êVÚ>u{2ÛYÚÄóÏ3œ,q¨,Ì}€×óýãë Ïøzö NÜ2ÉC¼®\€ Á8Í~žÿÁK¾:Ÿü4·ð1MOÄñ»^¼o†‚Á>ö}òû…qÞ¿|/r—¾<±žkUº‚)ƒ‹v}‚@:}3Œþ5¬U£vgR\ªÇ«ÙݤòG-Äl±xߌd©Ñ€ªÑÙK¢\:HåŽÁ®# ¤‰ÈéÛpì}jÔP¥Ë-úJ2ìIl¬GØwÁ¥gÚŬ5å•Ûi2O¢Äo©;° ¬rœçŒƒCUs+]w-G¦¬Z}áÓãu™cä–,Dc— ß;r~€Ö/„Z=N×U†öbw $Ë–ž?C’÷ö®“ÈŸM¶0ÌÒG©Žb¸p 3`öÈäU[tÔõ)/c»R.aIË´LIîpx÷Åk´^QiÖfY¡Wµ˜˜[Êù£8änϯP¥dø’É>Éi©6ß;¼K³ °`{cv@úèü?k>«,úl¶^b]Ÿ,[º•,ÃÃ#£Ö±©·ø×àFî5Ë"OOùlµÃdÿ:í> Iä|Xð\Œq·Z²?ù)½ŒZº?[µÍ¬ÃØôæ™ð… ºĘþR~Åk&Ö]À~æQÇ¿ËÁìj}E@Š`:`ŠgÁTfoˆYVÒí0? °•eSx›QÙž#uó]ŽNyQQˆ¼ÇVa€kvîÙãÀ‘ƒ×ƒT6îFI³[¶Th7uÈþuá>^xŸÅMö˜àÊòÛ#ø³kêßü/Ö¼fÈ֖ͱ8{™>XÀú÷ê85î¾øá¯ Í ÝÕºëŒ_r{¤¯ÝNG§\ò21Y¹ö4Œ^ìü½øOÿ÷ñ¿4kéïtH¢‚á%wº¼mª PB@,ìHÇÊÉ‘^;áï §…m¾Åæ¥ÖÒYfOºàô#ðÅ~õWàö“|Ÿj¹´žd‰C±ˆÈÁTrr2}j#w«7´mbê ÎOt:' c5,z|òЧž§ø¡`ÿʃ°dI§®å"®öC•q‘Ñi×*.­Ì"ËPŽ Œþ?J@äs“ôíR('§Oj ±Îøâ ž»P a8ÇÔW‹¸mÛA&½ËÆ&ÞëHžÁ%¯ž2VÃyx{ñ6]ò t`“ÀFOÌäsT»3 ½ Æ]Ì2q´c9¯¦>~ÕÚÃ_ƒv>±-¨x¤ËrÐÛVÞ&v% ß×hüÅ|³á]uBX¥K–-¯wá²}@«º„4ˆo<øu‘{%³ ¤qáˆ\œg<‘ФŒ¹OMð?Åèüa¦ëv>¹žûÄÆàϧß:‘IUÃFƒíš‚ßÀ¾ ´¿Iã…¢‚)‡úVñ‚3÷±œÑhÇSKÉèzÇÁÁÿ ËÄ/.§%¦­§I·Fàûjí¯ÓO·Öÿ³l/WRØ‹V…·¼Ê9ã¶=ªzìhŸvq²|-ÐK“gw­éàž<«´”(ÿ ?­Dßµ uÃÆ3†þíí—Ëù«·ò­Tñ]üBÒ<,·±é¦ùÄfêxË";d >ÄŒ~5Öjú%ö©Oc©ybò‡x³µýÆhr³²`’zØóÃá[8Ú¦‹© îîðÿ}ªÔeüoiþ·Ã_kQüvW 'èšëo5¸´ýBÊÍ"k›ËéDP[Åî݀ϩÀ­¶˜HÑÜZOgsÃÁr›Hö4îÅdöGKã{ëÿê¶#zKgÇ犒Ûâf3oé*•Åz2ß5Šñí£ü€sQÉ$:²ncm¨£u3ÃØÿ¾¥ Û©ÌŸÚê¾[IªGrQj^\£ æ¬&¡«”uaìÙ©o< _±ó|?§;±Éxb17þ8T~•œÿ |7ÀKmBÅFµÔÁÕ©.U²rníšIt‡½ ëG7^Ö4y ùŽ“­åÑe¿S\Ú\©'š‘eSŽk>Xöý?#Nyÿ3~ºþeùþü Õ7/ø«BnÂ÷M†å¶cÇ•sû-éw⿇çd&¥ Í›cº2¿­vv ¤?¯ü‘ª,¥ƒ» øÊUÏ9“ Çö®\7šÎœ”œ’º·õÖçEjNœa)8Ë™_m½mc)ÿdω¨Íýu¢kázfkVîÍô]áå\Ÿˆÿg¯Šš¼Ú¯€µµƒ:ÙÉ"ÿßKkЄ˜ÁÏÒµôÏkz´ÝfþÁ±ÁµºxÈÿ¾H­¯/æûÕÿÈä´ñû¿;žA¡kšÎ‹¶ZÙ¸Ó„æ5»¶`\áçÓ×âܰ {ïM¼þ׿¯ÇùKLj®5(Ç“©ÇÚ¨•Z©^üA´ÖÉþÛðG„µU ‚N’–ÌsßtiÞ^Oïÿ‚.XtºûŸù;mñ{N“h’&޵-~%hÓ“ûó¼+·¹Òþë ‹Ï‡ÙíÞMUš?©Û&ñTï~|Õ£Ýi¨x»Ãò“÷eK{ÄŽc4swñAËÚz¢f-¿Šô›‘y{ ⸋Z…½ænʲ>쀧5è~ÌÔrÚ'ÅküòÖtùí˜}J_Ö³nd¶N‘­økÄ 9×W‰X÷dÚߥÑì×È\’è×ßþgœx6ayá‹ë²K™b•ò•·œ|¹âµ¾èwZ}ýÕÌñOk„Võ' AEFÍ ’m· áž¯½'𠾏Q»ž¡Ž;S|Ïóé\æÇ3ñ¿â”»8ÇJóO ßOcáŸIm+Ã.Øq$g|Õé?¿…®¸ô5æz Ì<+­"ÛM ¹Ø‘É2§,áŠgiðÇUŸ^³½‹R™ï H»S–\ƒÐõ®êy­PÇûá$ Ìk4y÷VÄWœü k9¼Uk¦j«¦Ø^\F./%l1¼ÜzWÕ_´‡…n.twÂZžwk$)§ÜÚZL¬ñ˜ÓÊW¯(61ÇU\òk¢e8:ŒÝHÆJ=Ïm2Ôòøg׌O-%€B~»6Š·þ¥`4Ë D Ñì4ØR@}D› ƒïº¤.sǵ4¾¿±®ëc™™s¤>§tgÔï&Ô'ëæLÄäû“ɯ#ø–øŠP8qŠöò[¸5â?äfsœ µš=ßG·×ü?kÊ™c{hAˆ™YW ëï†#ñ®'UøY¨¬’¶˜é“ˆ™‚L> àôü«7Å׳A.–ÑÊñ‘c©¯aÐíRÓm\Æe”@®dÁ,Ü’H팒hÑ’®x6©¢j$æ-BÆæÆAü70²1ÍP ¤ýåüÅ}9Æ¡aKmFxƒ”fÊ}»Ó†·¬Á1–+›xåòÕ-cWû‚çõ¥bùÐ< â“ý•¢ÞÞÆÍ4p‘½!¯âk¥Ò|!wánæ¹m¥š8Iµ˜J™dɇ8Îy5ꚦ£­x„(Ôõ»ËÀ íY¦g ì7±®ôØ,¬ndQ™ d#$ñëM+-z!dH×m¿ëå?ô1Z~5†KOêe•€’fecѬÛ>Ù®O5$3Ÿ ‘ô¡yŽKM ¥Hvð+gØ6š¨#þXƒÿVðN}ksÃ'÷ Çü°úRÜÍì/‚ò.uLuû£ùUgdÑ%Œty?€«¾ $Oª׌½¾•²bÀ®yߟÐP¶ܪOåJÌY³M§nÃdT“DòÄCËÜ•Òi>7»°P’5@zþt‘ë±^xuíZ!‘ƒ×p®qˆÉ=ªÖ†.Ògªx–Ã×HŠÊñ(,½kx%Kø^ǰÚÙÇo˜×¢¿üJõ`s‰Ì×¾| Ò–oÚOÆi/îÂ{O 1H‚2«1À 1=±·9Æhnà¼Ï$ñÞR`¿ÄPà›ãµiâ ~ÃVÓnâÆãK³·$7+,¤R+/Uù—Œõê8­¯øQµvõty>×§A3ÅÓ2£Ê€­·#¨ôõ©þkþ)øA«ê7VþÑ5ÈnáMiâ-4_[­Ê ­ÛpçúÔIku¹p¶ª[?ëÈÏÑ®a¼Öu·‘'‹Ê‹'#;yÎøÛþ?cõ9¯@Õ¼W?¼Uªk-á©*Eö~…ŽÔ:‚ ª’H-ÔöÏa\rocÏ¡çòªWkR$’ØÊ„ñõû£¥v:N6/Oǽqð/ïbíòŠìt€<±Š®ÆÔkžØ©È#9ëQÄ ‘R°ä{b‘g«ü$¼%|}nœ²+ë/ØêÝÿ±|ͧÊû©=·ɸúàWÌ4{wIþʹκ½¾0Äž¬Øð¯Ð¯x MøuáËm'NO–4Y»ÈýY½bÇõÉ7­Ž•¢»:P(à BvãÖ—­# éJ9 Š8â ÅS{8$Ôãº6Ên≡Kœò±³düJ¡éü"®fŽh½€\ãŠ\óMÎiséL t4Ssך3NÏÆi‹šx¦ ^M8œS3Í8=©€n 'É5‡¯k–š]„×ײùVPòqË;vUÉ«¦¥ ´·¬0©yecÀQ^k¨êpjzv§ã‡±ðŽ…ÜÃl̪Îãï¦YT‘’Ê£“N1s’ŒwcÛVu¿¼¨|GñkúÄ&8G–‡•‚>Ãê{šô xãÄ_L´øu¤]èž”¼ñ¶µb`ó`hãþͶ—I#†'š?!|¦;gÈSK@ø%â_ˆñi-ñ*-3H𭬉x¾ÒÝ®–æP‘4cQº;VuŽQ)ò#ŒDXFYå Šúº_%Ò—à¿Íþ½¼ü—âÿËóô9ï xAðGÚßH°ò¯/6}³Q¹šK«ÛÍ™òüû™Y¥›`b«½Ûjü«€®†Š+–R”ÝäîÍRIYQR0¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢ŠÃñÖ¸þðGˆu˜ÈiÚuÅÚ’23LãùPŸ¿·×Äã?ø§_Þ%Š÷SmN*IÒÐì¹èÎïø¯Žtâ½ñ„r™"‰eI#²ozõÚÁÔcðµ‘$ýšÁ¦qݤ’Vf'ßkÍü§Ë6¿F¿0<=9®•Žz­JVGª¯™w"ÚÆT3fxW‘¼˜ƒü;ˆÉ'S¬® Öl¢†æ4ŒH¯ ’F„M–à‚sÎÓÐ;ç5©¦¡ðíÍüV1ù–·‘‹(ù¡‘€Ý¸ô àŽØ§aÇq+È6Aw*°Y±€¼Gr}^aìE¡%µ°ŠêP«å;dåÜ6mÇ=ûUë¨L‰mÙåX]â,[lCïmÎOì s6RKw9Òî­%„•¥=®¡¦À^dº‘!Õ0WqÆHÏSÀüih+Hô/‡ú¹âOh–¾³MWZ¼f–ÁÇ–ûwnÜÙ\+ä’:gµsô¿é~1¸±ñh…uK]­ ¶UTÄŠHÚH#?»]Ç‚µ|Öm¼I˜Ú&¯4E¼€>6P²€§ø±Œ7b=ëÎ>'øÖçÆzŒr]CqØ%¦’âo5äÏÝçÐæiAëtô4µ•šÔàäñšé~Ëö_ˆ™Á+©jüuâd¬n}Åox.3ÿ v†§)þo‚;~õjÞªÇ?söùAó‡ðå†)ŸÃI®øºÂ6 %ÖncŒ’$º^¹ãïÓñåÚ˜%ÓWq-Ú¹O׺‡ÅKk±nö‘ìžÕ›÷ðg8é¿iÇøÖU:Q½™™£x Xñž³$VŒc²IÜsÕn‡ßÐöïü Ñ´Iµ0ºµßRޏ…Omþ,òx ýÚô›{x­bX ‰!‰z$jG~‚¤¤äÙ¢ŠZŒŠ$‚$Ž4Xã@QFÐØS袤°¯Àßè:—†¡5­ü’2ÝPwdÔsG õ[èaxƒCÕ Ön%Kk«„y·Åt‘1VÉÊœJêžëÃöZòÉ}5Ä:³*‰ÚƒàgËS{x€’K¨÷a;Tõš©âíkKNÔô$ºU{p¶ÿaVÝnG™^Ÿ×55þ™£êöÚmαªÍ¤êû°‰¨û¬Ã ƒŠ‡Ä>)Ô<-ž£]¼0$"S:Œ Ëܵ1µ}#L¸ñEÝÕ–¬ŒþT°¨i¶È.py hx£â&§£¢_iO­ÂÒ^êõ‹¼66?|ãÞ¹ýWJÔþ!XZk‘}¢ñTÁuð¿2Ÿ¼¹<ç5bÚkohVvÚö›£tó4Ég1ÿR½:ƒßÒ•Á£CS’ïâD©ªXÅ›¨X\aUeòâ†RŒÝ8â»ÿˆu+ù´Ëí{Lµ´Ô’¬ž`u\o—9Æy$ ã5å7Õ¢Ôt=>ïKµNÓZV2ZÜG/ÎIíÓš4k[}{ÃÓ&§¨,­§Só&H,>dÛž}h²ù…ßFu_üKiâ]<ÉákÙï-,§Y%ó­ü¹0~éd¸¯&½#UøàÝoÃvµ§[C¥_EnŸÚÖð@ÑÆ²ã¡ÉÉ{ñ뿱|:ÓåÔ<7©I¨Mtâ»hÂyX €O5Zß[Õ¾$h·–3Ÿ?Q·ež…ó”pTûŒäR²oQ¦ÖÌôÿˆº½Ï†¼,/-£îbŽX^9Qö£ôc´§Øà‚yÔiÞ††úŒluYï­5ò§·ºUÝo:ñ"†pB x~‘áKÁ¢öïÄQmÒžÔ«[4¡üâÄaF5-¦±§I£j‘ø~ »+Ñneò&¹2(LüÅ÷€¡«­{=Qêzާm¤Y\ÝÈëå@›É¬ø~cZ𥟉¿³âm亭Ä3«ìppUתœúûz׎øwÇzLj-4ï ^˜î´H£x‘DJ4 ’Åñ“ƒÏ&»/x¯SðG…5mÏ[ÓµW7’ÀˆMÀu\” ý&½ÐRW÷ŽÕ’£iê ¬ë]kNy„vó”“q@S*7 õÆèŸôÍCB6:µäzÌ÷c¼ŠUñÄÜ(òöçpäîÝøWCð_ÆÒü?ÑüOá?é7º†Ÿ¨0’ÆXíÄ‹Æv–ÜHÚ¬ Ž…E 8¡ÆI¿#¡–Y壒g™0>I˜¸ú6Eg^xgGÔûV‹¦]×ý þi´Òh"ÓuÈõpº¥•›i¬Ë»›Ë{‚s‘ÇÍŒs’:Œf¨ü›EñÄ@ñŒ²éòMɧ]Çw䤤Ÿ”†NF{zM5«’{2 þx^w/ý’ödôûì±ôµS? ìU‰³Öõ» ~è-Ê?0¤×Yqyge%¬·‘ˆBXëž^k€ñ—Å ëŸ`³†)Ò <ß3<“ÏéT®&×Räž ×mN-ËÞ‹°\¶8©5?Z)7^¿*½^Û/þ;šªß--[mí­íƒ×ìŸÎ½#¸óo5´ˆpÑËÔûƒ‚*Ó^ÜFŒZîELcç”à~ÒRkãýï]üY=˜àּݴÃ1\Äàú85¯w£išš>¦^ç«IiOâÖ±®¾xfìähÉj}lç–/ý˜ÒüƒæZ[åaÔ¡§ ¥5‘7Âí.6ÏRÖl¢\,À~Aýj/ø@µˆ3öOôKëüзò£FŸ…µ¨ô­nÖæIš(U±)P²w\zôüj•þ¢u Ë‹™Q¥rå#Urs€W(úŒìñ±ômMOM—úáÂÔR\ø¦ÌqáK¹TËK'YÔý6“QÉnn¦ÞÖ~ÏÙt½Î§ÏÎÌÔ‹9#¯á\<ž9‚Ë?n±Ô4ãÐý¢Õ”~¢­ZøûG¹#f¡>ŒqZ$ú¶–ç{aâGK”Igsk"Ÿ•ᙯâ tö¼qi”|E{wÿ–WŽ.òpEy…¾¹ipK˜Ÿ?ÝqWEâ°È ƒÞ›¾Ä®[èz ߆£]_¾ÖCu7Z[Y¬ÚUüöäû€ÅÇJä„àä×UâoZk^Ѭ¢³Y.ÒxbƒÎNrW<€{žkš§»(¨Â÷ßÈ¡7*4´]Ì˯…ŸõaˆŠ¼?)¤†õüBǹý›¼!x¤èÿbûE«é“AÆ=âæ†`Iæ7Áæµå]??ó9®úÙü—èd_~Ê>&ºùt¯øg\@pZ´q1ÿ€Ë´Õ{_€ÿ<*’‰|#©ê¢å>Ä|ø¾¹Œž>†·Ìøèsè Y³Õîì›Ìµ»šÙÇ!¢‘þ†šO£þ¿}Ö¾ºÿðO0Õõ蕾ðõÞ˜ËVxdúª–ÿo­p%¶Q_@Úü\ñ…œB!â+ù¢>]ÄÆd>Û_"¬ÁãëývGŽûÃZˆ[næ["åWœîU¾§4sIn×åþcPŒ’wò×ü‡âÜRcÍ·Ûô=kJ‰šdì7#¢žÃרOÿ ïXÏöŸÃM:=dÒïg¶oÈ–¥dÜü/øAª¶/èDõhç†íGÑX!ýió?åû™<«¤¾õþW<ëž-±Õtíí˼À\W7àiešÒûMYâŠud )À$œ0'èz÷ì÷á À:7Ä&€“Äz®™$GíqY’~Ëšë¹—Iñ7†õb§šŠÀçð—m>eÙ‹‘÷OçoÎÇ?á/Ýè·7R\ˆÙ›7‰÷ w®µn. È'©ª·~*èQ7Ùü=幄¶Ÿé\z†F"¸}Nh34zŽ•}fêpV{w\ÄRæ…þ!òÍ/„ô¨oÑÁÖ¦Yz|בÅã˸r$¹ZÓ·ø’p¢‘îHÅ_/fgÍmÑéÞn{vï^)ñ."Þ(p.  ×gÄx'P x?ì°5Ãø¶åõ}M¯ "ŽŠN-\wŒ4û•6-qhÐ,véo»z°f^§ ×Ô_²¼áËkûÿÍ"\ËØ­ãkW–/%—î+Ÿ¼>\c¡>µóëÛ§Œ´‹_+R‚'29Ϙ:œŽ‚»]É4ë xD&4v “[SŸ²š®C:彎«Ä:f•â-BÏJ»–‹ÄY](e/ Lä¹AÚr:­eº;þíÙÆOlBÅzgžç¥g7ÌÛµb¬†9ÚsÓ5C\b4»Œñ„8…^ s‘œúÕmMDÚ}ŸùæÃô©‡Ú±:Ý»ùøOýVÞ·téñá·°ÿL\à㸬›+g›ÄÅ ÿhã89ëøV—ˆ£ Ôíu=Bkï4¹R>`y÷ ÿw¡ôb¼¿ûtRPâbÇýhdœ~µÑø5¿â™Óóž†àF´ìcb¿ˆõ«› ñ ˆ×nâȦx›T×~ê±éšÍœvú ‰&–äûŠà4d2’TƒíÒ¨xÒ@“’yýÙþUÒ~Ô1y_.Y%3Eqc§L¤ö&Ö @öÈÏãY¹5$‹QN.]nE£ø‚ãUV×Mm$KÅ#2{ýk•ñ¯ü~CÏcý+ª·ñN¶½"øè®WÆË‹è¾‡úV†} Èd?ÝÙi ”öö®:Ùq,yþè5ÙiêÇ⇰D܃îæ¬''·aÚ«@Ä(ó«*xaïÉ&‡×?°FŽ—úÍåã®FŸ²®îÎûc£5}¸NÓï_!ÿÁ>`ÿ‰'‹%#.$‰ö%ÉÿÐE}vp£žO­r=Í¥ÐF$ÆsN<Ò?pã‰Býhã4i3@ ž‚ƒÅ­!¦„(<Ó†*0rÔìòE4¸¨óÁ§ô¤ÿ`"õëOÍF>Ô@€ÅQ¿ºÜ’uHÑKI#©'ÒytA1G’ç®+ƒ»’ëâ^­ý¤–$NåÂËËŽ¨÷üè).¦&»â‹Og6§w%Ÿ…c¼ŠÖÙR %›Rº‘¶Æ±Ã³ÈÄýÔU'¶0=“à× Çâ_è>&Ñ•õ{=GDÒ5]bx0Cmg$M-”&au¯²EÜ7xŸ´=3Ç¿N·£ÝÛßø?ÀðýŽÂêÆåd·½Õî! <ªÑLUÖ iR!¾?½u>R¾™®é7†\±ÒmkåÖËð¿Ý¡ {M^ߘQEÀnQEQEQEQEQEQEQEQEQEQEQEQEQEQEÏ|CðÜÞ1ð‰´ iRÞãUÓ.¬c–LíF–&@ÇàÍt4P5¡ùð‹þ ·âsãFñGJ„x&ÂܼРøÙ¯\å9e\ļ “\OíOûCû _øD|>à0{¤ÍĨpr‘õä‚ØÖ¿B¾ ~Í>øb«áí&7ÔŠâMZíD—-Æ 9<.:óœT9ßHRKâdÉðÎiwkyvö2\FB‹; œ†Á$sÆ1È žEuøy¢ø!Y´øîÞ1——^WQÎ3ÑFy!@óŠé¨¨zêÇʬ‚Š( aEP^ûp.ÿÙ_ÇÃþ ?•ÌF½Î¼SöÑÍý—~!¸°VãÚT?ÒšÜkVÆ9Þǰ4ÓµÏ {ÒJÄHFG^Õ쌃]çw¸L‚9ÕÀÇðÔ‘C5¬‰'12ÀôÇz•òOp@ªšŒnÓî-·óP®åìH =Óô Þÿí:}ü׳[«H¶²Æbb:â¢Ñ¼o{t-/îd’Òà˜™{ nLÔg…5]/Y·šh¼1>æ¸uïÜV†“©èW:¶-´ÓozYŒ34„¡|eIõ¦¼Œß˜íÁÚ¶…¨»¿–¶§ƒp’«aAÎH#L±×t[ÝtmÓ"·¤>]ғݘ¯NMdxsQ½ƒÄ'xiäf)$,x$œEmCà1µr Ö¡}²–6{ÎÐsŒÐµØ;ô9Û ¯lüE’\^¬ßwŸÞ6ìøó]$žÑnuó:²¤æšÉ£ïœ•VÍCgñéuP“$bÈÉ´‚ƒz.qœúŠ¥qàvÛV2Ci4°³⌦ á‰íFAyŸâF©oª²3‘c›~ÌÃî¨8#ëUµ?kêÜY[=Ť²oŽpêH È$g#­[ËÏ ]ë¦;›)~Õæ€÷qJB;ç’W¦3\ö·­ê–>&¹s4ϼFŒvàtô#?0^GC«ê¾“Sû=ö˜n®"Ú“_Ç!RìÏø¾öòÛÅS–”Ç´©ƒËl/)Ø­ýOÀðjš‰ºƒU³±šà,¦Æã!a–ŒŽ¹àѪxîMôiZ[ÜØÙ…ˆ‹¨ƒ1 `œš?üDÕü1i«Ëo}>­—©\Â’Ikqù›{ ñŸ¥?Vñ}ÿ„®bÑìJ KdUo57 Œ–ÁíÏâ½RÔ56Õ­-®o´û”YD±F]ccaÇLZšªè o¦Áâ1xºšÛ¨ym«ü!'£ÐZér‡‰4]GÄWvú¾›k5ì3Ä»Ò!“ ãÓÒ¬]ˤiúF™gâ)îîÕK(†C!?uª§‹µiô›Ë m:Y!Ó£¶F·hØ4¬}NjÅÆ7Ž4Ý?Tv¶—ÅLý­Ê vžº<]v¶vZ8ÒYáÒ^&xŽã»~pÁ¨â¬Á£xfÚ{Ëøl®-¥h#º¹'lë×nzäõjóSÿ„I´Ò§´³Õ.eÍÄ«p¢HÌn¢¨ø™åñ>¦Þé¶~U¼%á–ÊÒ2DRuÝ€:G¨í¯™ ×Sü8Ñ­aŽ[kÛ«ÙK™ToˆF¼pO~jÏŒà—ÅZz®”©s=«‰&·³ CxêF*Ž™k§OàÔ^k‹[U¸Ù¢_Þ†ÇÏ€{TÞ!·_xz?ìIîís2ò@Ed'zÐ%r‡mÃIÕOˆ­n!Òäd_$©ŽV”t)‘éÞ¥–ãJÓ¼-¨Üøe®„­"Gp× ûÈç¦Lãšm”·ß4›­:[6öÑ–âÞyßj~R¬ÝãV4­ëáí…ýþ±´ñJ‚­VU–9É?ÅŒð1ÐÑÔ:Þ»ºñ\WÚ%õÓÉÑy±Ï3!tä1ö=+SJðŒ¾’mrîúÎòÞÚ&òÅ”Å÷¹à+4ÄÕ,õïjÐhúE¶“©ybF[ROŸ?:€Ox¬o‡Ñ½Ö­ug*·ö|¶Î/sÀHÀÈo¨8Å»‡¦ÇK¥øêçÅ–Sé"ÒÓO• d¶–Ýá±÷zgž•Ëx:ÏS‡Å6 [ÉV"C2_/à“Û®ƒDÒt].K«ý+X}^KXZu³0l}À}î¼ãØU Çú–¥} †£vóÙÞñÊàLŠ?½üÍíÃÁê>Uœ—sê))x’V7#$(ã§§5Ïiþ>Ö«$²ÜÊËæî{F?)\ò˜¢ÇῈ4ýfÝ͹ŠÚ9CÔu*ªwŽC[øƒÂº‡‰ ¾²_´d^¤‡k6xf\ã¡y]—?ïõ »™-/láƒw™Í6ÙvžpWÔg§|Rkž4Ñ­5?±ÜèvÚ¸¶ ÞHH•Ê€ ÈëŒW¯_êVž(¼y¦t¾IÉ;òsÆ=F1]nµàË[PYßY¶Ò¯®[)ÐüŽ@ÏÌsÛ½5®…}^á—Ç+u;ï²VKi:/”Gðé[~+Ò4MJòÒ{ÝU´Û¹avÃæoQБ‘ŠÉÖ«â ¨5­2ÚâîâŸ,baÃ/°ïUæÅfôGJ„zMOW»ñî³gâ ZK§^i—A£´î0•!Ы±°V\SiZ&‘¤Câ[)¯®w;Ç m¯dôÇk~"øAuâ+=cFÕÔFÉ5Ú£BA!eÛÉÈRAçJ_üEð­åÖ³o¬ëènàYyvfxîíÌç,Ûe]Xè[Z[Ý6¢bfÿ–FSŒ} ª7úu¦ Aº°±¼ã¬ö‘9?ŽÜþµÎü6ñîàï‹·/⸬ï¼3ªÀPÉwn&H×£uÈ8Á8ìk¸Š{={ÅÿÙ^ˆßË|$žÊÚÙNL@dí –·üõ8»¯øvîL6…o uÿD’XOèØý*&ø_£ÖûZÓ08Ùt³ ýAýk7⧉5_ ø‚ÛK‰eÓîŸ8È¿0 ࡦ;×UáJ[ë$ûK‡ŸhÍVÛ ÷vfü>Õ-Iû‹]‡d¾±þªÇùR`xÆÑö¤ú&¨:·&ÿÈGë]‰üKká=,ÝN»‰`¨ƒ‚ÇÚ›áoÅâ‹y»ÛÆ’yd¹Ï8Ïõ§w¸´ÚÇ6çÅ–ÌVo ÝNñÙJ“Ãi5Fo¥–Eþ›¨éäp~ÑlÊâEzP·6Žr}>µ$ŒÞBËÕÏÙå#o`’éØÒæ»goãÝ耷è§ý¾+^ß\³¹Åu™ôa]Mí•® ]ØY][‹H¤8ú•Íc^|=ðÝÞàÚ œŽÑ¥…ÓÒÂÞcVà‘í]ƒ•Ç7à 6m/u8ùåv²þŒ£ùÕy¼ ªÚ“ö/ÊòÞÙgõV?ʳœ#R.Ù›Q«R…ER›Õõ軽¸¸ åù²4›}2sÖ /Ö¹·Ò¼ajáR}Q_Q1„ÿãà Cyâ›Cûÿ Ï:ã%ì¤Y‡þ:M\RŠIÊRœœžìèËg8¦´„m'$ãŽzW(þ=‚ÔâûO¿° óçÛ²ùбoã­äá/£ön*­}‰½·:«]ZêÒMÐÜM / ÆåHü«¤°ø¥â»Ù¿}$}sÊeLºÙÁC«XÜÅsýsWVue·Ú‡}…î³Ð®¼W«ÝÚ4úÇ…ômVÕHÒÞh±r¤õP@$sX¯€5uo·ü9ÓãcœÉ¦^MlÃè 8ý*ý§Ä v1M+Áo$1²¾CîYÏeÿv¹ 95ÉKžN^Ò v=B¥ÁШÝÖ©ôe›¿†ß µ%Sx£Cs÷‚K Ú¦B¡?ìÿá;£'â0‡wDÕtÉb÷Ô{ÅK»>ŸzBüzWG*[~æpݽí÷"Œ³¾¿e)}+[ð·ˆC6.¡mÿ|ÌÕmOáÅ‹(sÿt³Â8é¶ë"= DƒZåŽ1ÛÒ¬Ûj·–O¾ © n¢©ý =VÏòÿ€M£Ö?ŸüË.ï%;`Iä°s•5ro‹«Y#[dfe8Ù(#ùעπµ\ý·áýœÿ—}5¹Ïü¸ýe\|9øa©7Éÿ ˆÇ?uá»Uüö|Ϭ#>UÒ_ü žë6—¨Åy 1°—xÇךì5*/ÜGs§@2Dàä/Ívð'÷¨³~ C v-JÂhOÓ+¼Qoð;Åzs¤jžÖŸª”¼€¸ú,¸4]vaÊû§óO+°öô«þ`-s\æ½ðçâ…¢¯|/q4xæk;}Éÿ}GÅq÷Þ Ñ¤1ÝÙ_ٸꮌ?B)©G¸ùgü§¨–*{¯~i<Â3é^_Žî£8yœúi•hÃãé274õÊfª×Ù‘ÍmÑØëª$Ònº`ÆF+Çü'ÿð‘BÐ"Èðî“k62=ÿî/<_%ý‹Å²32 H®'L“û \·–ä:&ìH@ÇÊzÒjÀ¤ì'Ùî4y^XöL$Þœç>Ÿ}¯àoˆ nþ¿‚5'Ô,¯.áónoËx[Ω*•$áP8詯““HŠûT·»:¬(„rGaÖ»=¼·â@qÜè£YГi_Ô™GZåõÝ·çp;zRÐñëK‘ƒü鯔Èäzç5sgæÉ5‘â‰1¢]1çj÷­äüë+Ę“Gºø—µLóÿ0YõLŽ~Å&§J<0‹Z硌÷úT^‚y_P0Ëy>YW$gqíǵ%´¶Üq²"¤/ó¥ØosÙ.t9—IµÔç³o±ÝHðÃpË€îK(> 2þu›ÝËAs5¹Çü³Š÷wâw€ýÆ1ÅLÒ·ZHÐûŸþ ì?â“ñiõº‡‘ÿm+ë3ï_(ÿÁ>üQž*<ô¨:}$¯«øÅr=Ù«è'ò§t÷ö¦çš\Ô‹aGOzCF{Q‘š`.i çŠCIŒf˜„ï§ŠAÔ÷¥É â˜O^Ôî½i¤à`!8U[«ß) ƒógëÛÁoûg€=+†ñ>»u-âhZ9߬Üs4ÉȵCßýò:zuô iu®jw~'ÔO†tVo1›÷‘Ÿõcþy)þñî{t®Ú/…¶²øÀž¹Òlo¼?¨%Öµ­C}ÊÜ[ÙPØwfêæÒC–PVVÞ®TɦxNóწ£ðý…–£ãbåtý"ßS‘ã·’å‘äw™Ô²8bžf”S½Ôaøqð«Høhº¼ö“ÞjÚÞ³tnõMsUt’öõÆDaÙUcNÈãETE(%‰ê¥jKÚ·®¶õïåmÓî­ÞÓ/yòýÿäuZvi£éö¶°ÙXÚİ[ÚÛF#ŠÔTE  *ÍW&ú³`¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¬ë­áoëšÒÂn[N±žðB “!Ž6} NqŠØ¢£òƒà/À_|uø‹¥Z_Û^èÞÓe7:¾£4bMÌ£WèÒ7ŒíÉ$q_£šçìõð×ÄXûo‚tbqŒÛÚ¬ómz·øŠæ³¼t>~×a„ÚÔ…âÒ¯t¢{Y^¾?ò&úàuÏø&ï„î¦fÒ|Sªiщu w~#fkëú(°ý¤ºŸŸž,ÿ‚gx‚òÊê×Iñžœë(Ú²ÜÃ$zü»ðk蟀±ÿƒþ h¶soˆ|IcÍÔ®“r«wòçhç©Éã\Ý $y_„EÜqí]X˜F^Xí§ägå³Âr[ê~‘&æs¹d,y$õ®vÏÀ^Eè¹[ø§´÷ºÆðœzÆ+°Ñg}E–æ5†mÛLq€W®}j¯ƒMÅŽ—-µõ»Æé#(vS†÷ϧ½sÚy¼9xРù;Žv©¬Êu4»ËHŠimØâŒq ó)ÿѹÒluíJ»Õ5!¤ê3´±ïF§åcÈ ûѪk·~‚ÏLÒ®w+ÇçKpRmÇ··Øm4ÝWÂÚsëw²Ø4nék2&òñûƒÛ9§Þj²xI±‹B½iåÚw¾v—Ç}°;Um^ÚÿÇZ}®£i\\C˜. ˆõ ¾zT¶‰k xr;_éòÜ,— ñZo1É-‘ÐJþaÓÈ–vÔ¾%hɘéVì,ÓÅ~šÞòílÖÙÖXone<=ði‚ò"Ôµ ¿^Ðéè“¡½ˆÈ]Šã À“÷sT¼×4ý_O¾œÇ§yK1¹o˜@àðGמ+VÒÓþÆ•w©Cyk©ÜÝ‚ƒ/ޤ°#¯±¦ÝxïB¿°KH!Ô”¬ê¶q7 :©r{ÒM'Jµðe¥ö»e«C«M~\gR Lǘ”ý?Å÷Þ1¶¸ÑïfA%ì +G;XŽ â³<¦]iwz™ÕmeµÓE« ´ S÷@Ï|Õí'ûÚ BóÃÆöMFÚÝž8/;GFuÀ P¼­uàý]е¨_R±¸Óí Gye0ž^F{æ§Ð$ð´ÚÔo¥Ù\Á©€ïl³Í˜ðqÇcéX¾ñ%þ£ª¦•yqq{e~­nñ3nÆG >kGJøu}¥jð^Ï}g%£ùÏ%´û¤Ú¼ýÜdg4tîúþñݾ·“5ÌÓ¼Å^&Cäà©Sõ®ˆü3 ¬Ê¶zͶi>{rÇÏ3¸Æ Þ™aãí?Qño6‰ao#ÊDWѦ%Bs†'¿Zåf‹TÓ5¹"d—í¿hùdÚ~vÏù¡¿æaèŽÁþ!¬Ú¬°‹m9¬ "}²È@ãpl+œñv©6³yt–÷7¶— æÇr‘3+)är8Î+¡Õ¼?á[ývA>±5†¡#©–ˆ4;Î2u9õ¬ÍsÇZÖ‰®Oic<–6ö¤B–üchõúÿZoÏ@[÷4ï´÷ìpëR^¦¶¶Éç=ÇzU_ë—^Õm¬ld’­T@á±¼°ÿX}óQk^Õÿ¼A/Ÿ»ý+°½ð.ªê—>·›u6$EA1¹ œúÓì¾$E¨j‰4h.mÒQåʶÊò¢ç†-Ôâ¼]¥_Ûë÷o:K8y<Èî +ƒIí¨Ek¡Óêž>¾ðñÒtÁ´³A[ˆÃù„u'5§a¬ø¯R²Ö´˜¦–;ˆ”7•À׆Löö©µ+@»–Ðkw×Z¸µCpmÕY3ޤâÆ3T¼S­Ýøb{M;G¸{[`WŠXÿå¸nKŸ^iê3Jê;km"Ú‹©îõºÆøš5àÄöÈþTž6¿“JðæŸ—-ÊÚLä¼Ò·ï…$c޵^}+QñΕ¦jÖáf¿ƒ0Î$&ð9 ã=Emëú¬>Ðà‡XÓ"¸šVm$`Ãøò>´ N»ׇ¾×ãûLº¹/5©[˜.níCЫ7`Ev:£{ðçÁZ¤kkqló$ÑÉ ›˜È8UàýÞ{×)ªjöº¯‚îäѬ—LòçCy 1bËŽzfŸàÔm_J¼°»ù4ljšIXªaŒ6}±G¨zzw¯¼W¦ßXyIku,E,g«ž‹Ï¯5Ðx?ã³74ÿ^é¦ê;i6[\°!ãPrý9çÒ¹/Ã~³—VƒS]NâûBÄ"*Í´ü¬9è æ²tOˆº…íôpê#[NLlê€2g€AöÈ¢Éî­N±ñÞ‘utlcºÿJV(AúÒðóÇžÕÄv%–m7RŽléónmŠ Tß8<ç9ö¯%ƒÁ!Óoe a4ƒ~Ô˜tÆx|úw­}cRð¢ëEm<—h'º…†Ç`'iÏæ)µ%aÞQw=bÆñ.¡Y<ÅpßuÇô§hRøÖßÃ6óÅ åÄOæÎNÕ2ŽçœW†xÃZ»·ñ)U–Kkh#Ql°¹ S)â´áÓõXéZݽü:~¦Šai.$1ù»Nñ‘øT¸«i¸)=ÏbÔl§Òu ‹¤ <-µ€<qTç’+xÌ’•€§Ôž¯;Õ|[ªxCM€_\E©j—$¹rÅÕPp=ë?Pñ†¡âÍ\[ƒmy§Ü$Ïœ®~Vø"’V•ú±9¼² ¿i¶n¾T»—÷MgÏik©'ú^ev鵤múíÍR›ã§ã˜¡—Z³Š±ˆ´·a6îzŸJ¤¾9Ónô룧±šî(šU€‚€=èI½Ç̓гsà]®_CŠ'ïÙË$D b?J¨ß 4´æÓRÖ,`“¬ËŸøεü'ãÿ ꡊëͲñL ï™f;‰g@éÅk[²23ƒI&†Úg"þÖ­Ák?¤ª:%õ™þ*MDÚ'ŒíŽ4Izæ+Ÿ,ŸÁÂÒjßí´½fK%¶{„ŒíyÀ縻?P‹RµIá'Ë•r çÒ­ß¹7]ĵ߉¬Á7^¾e^²[beü×5_þ«q‹è/4÷¥Ì ¿ÌW££G Ä0’|ù_Ë–vë€z³qq=¼†’EqÆÉ2qøW´º<âÛÆZ=ßú½Bÿ´qZQßÛÍÌwÉÇð°5½w¡éz†Ö“§]vÝ%¢?¬«Ÿ†þœø“5³gïÙ]IHý(¸|É´ÛöÓï-î£'|R+§ÁÎ3WüI¯·ˆn`Õ•ã‹Ëmí»?;0çÐð®i¾X&M®·¬Øcî‚é2þ»MBÞ×-ú/Šíä_îßZ:ÍwVnrSkTl«T7M=©¸þ4c'Ðb±ÛHñ¥ ÊÁ¤êkŒÿ£Þ*±GÚJ…õ?XÂ%¼ðž¥]|Èb2/æ3èkM uìoîàv÷£8äv®[þ›¹[‹7=§ˆ¯ó«¶¾.Ò®ˆòï¡$öfÅRW}ΖÏU½Óäßmu4AÊœþÑi¾7ñÔr­¾¥}K½Òc碎™!²=+‰†þ €1ÌŽ÷XÙеã£Érræ)àh]c}§žÿQÚ³¨æ¢ùufÔ#JU¨ìº´ljþ'¸7¿áî`äºÒÒüÓi¬KËoji‹¯ÃlÝ|Í6úX¿FÜ*ÏŠõ»}jþ)-„‰kB(£” È2O''qÉ'>ý« ˜ŒäÔS÷¢œãf]uTq¥6ãÐ.~|:Ô\´>!ÑP®‘]¯æ £/Á]5Îí3Ç–‹Âê6ÓBsé~µ|9â—vsÜÕªK¡Ï~úü¿È¡oð£ÆºndÒnô ]€á ¹¶‘È>͆‹­ø+âi/ü)x«že·¶m§èS"º}ƒvp28«VÚåÝkwqnqÝJËü=z?ëð*{¯ëñ<¨ëšžžÛ. ½µ#³çÿf<^9˜`5ÓÛX³úŠö«/x¢ê2RêãQ…HW­ÈðÞ^•FûU´ºg‹Uð®‡u08böfë^i)ÝÚèn£Íf—õèyŒ>5iïÛIÿ)üé×úô×öRC fqŒ¬€Ò»[À·ã÷Þ¸±cÕôýE€üÕ¿gMðÃÀ×lßgÖu­-ÈV{XçP~ªÀþ•\Ϫ#—ûß™æzÑèÚœ±Ý³B’ÆP¹u»ßÒ4›UÔ~×ý§Ë#“ëÖ¶î~(E};ÆZmÉéå] mØßk·õ§Û|<ñ¾š¾ni¥j[†<Ëg·™Èô뺋«Xi;ô/Û²…pÀZ|½pµÉkZ'Œ4·s©xfò؃ó2Û:ùqXÇÄSÚL—–ÍèOøŠIÇk‡¾µq=ÔúS‘Nq\4^/lcígé,_àjõ·‹œ$¶“Ø9SúÕ[°¹»£gÅüè7úRø8gÃ:xÿ¦dÿãÆ±u}rmGO–Ý-ò\cr¸aúV÷„âht+(Ûï"ƒÛ“IŽ-6I{£ÙßîûM¿œÄ`Äcòâ³_Á[–"ªGFð}ºbº&]ÄŸÔÓB•õ¤Y™¡øn 9Œ Ìò•ÁÂÓ©5ÉøÏ‹èþ‡ù× ƒ‚zr+ÏülÔ"㦂$S´ÿ[µÙ餘—·jãm%Óbÿ*ìôÂ<±Ö›Ø#±©QëSˆÉçÈy…Y‰wžx¤Y÷'üé·x/ÅÏÚâÿÚ•õojùGþ ö¿ñFx¥‡OµÂ8ÿ¶µõpéÅrËsin£9R~8©$\úý(À÷Í =)zs@19ÑšSêi0)’*ƒŠR}hõ¤$cÚˆ[&«ÝÝ-´LÌFqÀõ§ÜL°¦æéé\—мHº²JéöFv)gf?Œú·¢ŠŠ>(ñΖégg‹jðæºù+ÓÌooAÜþ5éÿ~.‘½½kÉ™,²rÌÇ’I¬ƒ 'žåõ­`ý£P¹o2I~€v Üüañ-¾øOV_ö(O'¹Æk+Ø}t2ávÑä¸k{’ašMâ&O¹žÃš.ìyMôú•‡Š$rÎoVã#ùŽxü tº—„tkÍl¯öºZÜÉ 2Y2p êªÙë×µzk[©@®ªáykÈ5ßkqë3É ­ÅÄM6äºQrr =±ý)zŠÝQfûâ&¥¦êÏoÆòþÌ럕xü¹à_P¿šþÂÒKË+“ç$ªÀœœñŸJïgøw¥ê….o#v½*¦I"…vd•÷¯9ñN³©éþ(¹Y-š\q± }Þ=1N÷Ü-mMbÿÃ]Åi«XË{yi×pÊPäxÎ+ŕŗˆŽÆÅ°Eû:©!LXàŒV¶±àÏíÉ£Ô!¿³²¸»e{;–*áˆäŽ1ƒKªx°xrh´hlm¯¡³bv»ˆ31ÆN è9⟡:u«xrßÄkk¨É¨[é7w1)k{røãvG¨Çj]GÅ^ û>b°ÌƦFž0âF<ägµgxÃO½ÕïbÕ--渱¹‰Y Q–à`¡Àã´om4q¤ékâ9®àÔV¶‘~]àŽN(ëævWØ£âKÿ­ž¯ci5Ì2Ä#x BÞK¯p;ÕcÊÓmt6ErÓ|æ¶ÉѳïÚ¢ñ6©?‡Æk¤ÜI ‘æÅ:‰<“ïíRO¤ÞxëK²Ôc’¾‹0Lg“ËÑõæ€+øŽñt+LG’Xì%ß ”¶$y3‚äTØKã})$¸Š »9<¡5ËmYóŒúŠš]¾ Ò!²Ô­-õ+›‰ Æ Hxã^€‚=}j·ˆçMSÖWm²ÚÚE+$Ö‚DrC{‚(üoæhCøu£2Ü%µü÷ÒÝ·ïaØ£¯¹æâ •ñ7…·i_g0NâÒÚ?¼À`¥SÐí-5/ O³pö–\)‚t]ήGÌ £¥h]ßÂ'á‘s£jR_ù³Vè CœcÔúÑèW„í¢m+YM]e·ÒBÌ²ç‚ Ž¸«‘.‘áýÿQðíåÅíÙ <ñ…{u$äŒuíÍ:+íGâ.‘q§É)¸Ô!+q bxcÓ¿¨ô÷Áßں噆ÏÉ0µ´„0¸$ð ƒúÑÕ[]  kz »Ðµ ©.x‹Á$‡ý[¯#'ÓÖ§ð÷„õ/^É©êi VvÈÎòG2È%ã8=|Ól5=*ãHÕÎ…`Úv§äd†Éº<üÁ2x VWn[PÔ›Ofg¶º…â¸RÙP˜ûþÄSõ'm­Äz^«yqŸ¢Zé:´±:ÛM 8,GLg5Ëx^îîßĶqÄ…æ2yrBOÞSÃü3]&‘àûíµHõ«mU,AœAnHHé‘éš4¯‰𦢖·ÂÉhüä‰CÆ[ Zú ÛÔX<¡K¯b×\IDr—6F#¸àçb¶yô¨Åma5R^@l¼Í¦Ù“î&yÒ²­|#¯Xëpes¤à-ÓFÛ?{wLq[×àû¿2²]ÅrÓ€Ò#!ß<ñŽ4'ü£Þ3µ/ë?ÚÒ\ÚØM{e4žd3®!ŽAnr1žséZþ"Ôü0·ÂÓXÓæ¼Ô!"žþÚb™`1Ó¡ÇÒ¹gÅůˆ.¤ûL¶Ï¤y*Çb€xôÅnë_îµ»¡¨YOgoöÄI¥ÌÞ\ˆÌ2xÇLÿ:Bü ïê—V~#!$1Ú¤(- Bñò‘Zsøkþ;LÔæÔm´ÝBHv:]d§Á8¥Ö†­øwÁú‚®§Õµ9-ÖÆÞ&mÖó¬‚GÇ Î9ô¨âÔôÍGú¹Ð4¡¥ji@‘ŸÌ‹?6Ü“|V7ÃùÚ÷U{Ý5•Ô.— O ˜ÎïlSz½IZ+#©Ðuý?W”ý—E°Ó59ãxá¹·Lmr:Óšáü9%Ý—‰­‚+ á8Vlòüë¬Ðëž!Óu)¡ŠÆêty±ÚDÅ'†ÝŒ{ÖÖº|+q­Èº™¼[áµg¹µp#fÀÏ?‰£ü ÓûE=kL±—Q´½E›åб©zн¬M£èúv™aâ 9¯¯ã‡qò˜Íº·!8<â²µ£{á«ÏÙiú¼S[[ÝÏ—2]Éåy…N©Ç9Ê—â‡ÅW±Ecáñ¦+[茤Æ7|Þf~`ǹ®‹Xðõ·‰¼9kæ^ÅbÖî \NIPåN=x¬ù¯tÍ?F¹¶´Ônåo:U“D€ð6þ]E7âSÝx~ÂkKt·µÏol˜PÍѱúSé¨-ôŸÃ]&ëPK¨5;‹¦Xah¾x€êI÷ö«Ä^5ðæ¥§$0[ÞyBXþËO8¨qÖ±Ôz†¯c6/ˆ:Õ¶¦÷Oy.<íÒ[“ò‘žW¥jë_ 5K«ùî´õŠK[ƒæÇHŠœ2œ3WÓÄ>½×ÿ{¢Æã"èJB»g†eÎ1šä¼I¨j0x–ýî%’+””‘±ˆ=±Š˜Õ—Âu—ˆôÏ K™>›±5¤ —œ6îê=‡øV?îùÒ®­Wf™%¸ñ¨áûËõÍkjþO›mR]FÓJ¼»d’Öä•,ØÆà{gÞ—PÖ›ÀPXè–‚ äXüÛ‰n#ÞŒÍÏËžÔÊúf—e­xF#ªÝý† yöAtÜ–|ËL÷«3Già MCG¿÷’Vå@+‘õªž*–ëÆ…å¤!´ ö¶‘áPžCàv5…tØàðþ®uÄ’ (º*¨âC.z§áG_0[ypêw¾/Ñîôée]ÊžlNª˜Ã’§ëY¾ð¶·§êö——v’Y[À Í,«…ÙÎAõÏLV”hú>ª_x~K›‹ÈãTo´p`RpXÿZÈðÿ‰ï5;¸´»Ë©®,ï”ÀèÍ’¬z7áM’mhcÃw±½µ”é6òщÙ²qÆ2>™¬ïjwW'¹ûl²G?˜wFXŒzb¥Ò>kV7%û8´Y7<É:’Š;ã9϶*Yüi¢]®&ÐíçQ6Óv Ú8<Òô]Åñ'¼Ö'¹±º¶ŒÍ‰<™dÚá\JŸQñ•Ç€¢µÒmü»ÉâM×>q¸ó…ö®WÅ“]EâÙå¸bù!Ñ”ðb?w…o^h¶:Å–™uªêK§O$EA#&T ÇÓŠ-Ø=K·¾=ÕfŸAñN˜íöR2¼H7ä÷õr9®È|W»ñrÍ«kVñÙÇl6™GúÖôu?ã\¥©‡Zeµ®t.ì™ÞïnU‡@2ëPÔ|oá£EmBÙÄâ dÛæFxÎÑÜ,º‡¡ÝëÞ8·o^ÝéÒyÓD¸ lϰ­«/ˆ>Õ¼7`¶¦kmuR4•drÂVÀ zñ““^Qá}'PÒnn§Õ£’ÛL[g¬ë&xÚ?Ïj—íᖿi´¨nÿ´¡…Þ.X2¨8ÎiY1ûÈõèŽAvüª_B¾8ME¬®­ÙM䘥‡ã$Ž:vü+ç­;Åšì—fîix&rCsÈÇé],Þ Õ­õYçÒ.¥"E_8$‹‘œ>™¡¤ö“Nç¬:ÒFÊ©Á^àúSýTÈÉ;œ$h>f8Ïë^s¨|B—Âs%‚ªê2ÀƒÎ–V ³õ8¨¯þ ê–z¦‰â2O,*M>âÉ{;ÇüuS?"‡?añ©lOÝY¢Y—óOé]E¯Ž‹g¸óºh˜ÿß*¡/ý'oú;jLzy[”qèÀÿ:.÷:ïø€i0ÝÛÊ÷ ÁŒ“᫆Ü=ðüiž,Ö!Öµ™.­ËìdIeÛ’¨2p8é“\oü!×0¾'¹bê×xꬕ5´_[±ßiZ‚û»DOýô£ùÖ>ÊÓÚu:ž&«£ì÷M–sŽô¸°Lž(¶ù¥ðäӨ佛¬£ÿ& —Æ‚Åö_é·Ö,§M \~b¶Ó¹Ë¯c¤Ø;õô¦_LZÅ·ñ¾‘u‚.• ìÀŠÑV³ººº‰þŽ)ÙŠèÖ²×5-4/Ù/îmðr<¹™@kKþÝjê2óÈ·Ñ ý®Ý&PGñ)õ®}]\0}ë{Þ#‡F¶¼¶»…îì® nÖÊÛCpÜŸ #ñ¬ê9F7Š»ìtP…9ÔQœ¹WrŒÏ¤ßcíþÒ.9,‘4 ï†ô¬Û x*ì–}P°o[KÐÀqÙ]­nx³V·Ö¼Cw{ha˜«êƒ´Àã¨5‘Æy<ÑÍÚ°ª¥ Ž1—2]{ýç)â_èn•u{§jWâX—r[ÜÛ¨Ýí¹[úVƒÉmÄ’[÷|“õ5/ŠÐÞÿ×3QøO+áëhÿ©«1ÜÚh÷}) '`Rî$ ž)»±@Ãn9=+ƒñ¼gíp¶;]ël×?â}(Þé2N-„dz`PL–‡)h34C?À¼×[¦¶3\­œM$ñ¨ùùW øOÃï¬Üy&Q  ¾Üž{b‰l$‚BŠI«ÏŒqùWÑ>ý‡üEã}-MuË]2Ö_õ_m÷8õIâ§Õÿ`ŸˆZhݧÞèZÀþìwOäDõ¬}¬v:}œ¿¦zßüñqðÿÄ’~ú1úI_Tf¼?öPøK¯| ð.¡eâ(¡‚þêèJ!‚e”*ÝYxçu{h;‡§ ¬[»¸å£°âh'w¦œ®zížh!4Ö4™ŽÙëšÇ©8<æŒþtÕ$Œg¤,V˜/M–U71À½5Ü($îkWÖ-ím&¿½Á§ÛŒ“ž\ç…¤ñǽ†ëþ!¶Ñô×Ôïrñb··O¿4”ŸåV>|7¾ñV°Þ"×WuÔßr<|±'d_aúšËøyà­CâWˆS\Õa1Z¡Å¥¦>X“ÿŠ=Í}®x›Ã<9k{®^ y®a±·H¡’y®n%m±Ã 1«I,Œs…E'Ž0 ¹µ«¶^‹VOâoøsá>m{®Þ‹iîa±·Há’y®n%m±Ã 1«I,Œz*)8㑃ð'áå߃¼1>³â+xG¼M/ö¯ˆ®S,Âw%’Ô1’OÝ[##Ur¡c,Þs[áÏuýoWµñ×ĈlÛÅqùÇGÑ­Ö9 ðռʊðG0PÓNëy³ŒîX‚¡o3Ôë¦rT éAݽßM:/.ýµ¶MÄW3ækÐ(¢Šä5 (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ Íñ޾ Ðoô×ÆË¨Z& ÷X‚­ê§¡Á5¥E|ãØI¹¼v´Ðn¬÷ ¯Ø&wQϦX¥xçŠbô•˜Û_ßBÈH1϶íÚ¿V*½öŸm©Û5½Ü q uGíŒCÏQBÓbœœ·?¾$xïÀú…½¥ËùŽw•m»r;W,ªv‚qÅ}§ûm|ÔO‰b¸ÓmüÁhÒ#!ÂV †útÏzù÷æš?}§Ü*÷!7Ìf´S]X6ÕÒ1CžÈ<}{dÔ3/–yÜ„vaŠ’ÔdnÝžßZ½ KQ¯Î»¶Ÿj{Æpi#ÃíÆ O¥J!Ü=ï@_Q¾Zˆ×'¨Ï´ß%vƒŸ›²ûSÊã=ª6%ûCÖ€ëЊ§y£Øj,MÝ•¼î@ÃI$zsÖ­!ù‰Ç^´â:rO;Ñ 'ãÍ"úßÄ—2É Ó[¶%T;UqÀÈàb´õ=/G¾6O«ßOeª5ºùžRз¾1Sø¯Çú¦—â9íby-íâÂùC?OÖ³µoj>$ž-kM·7ÜÆ£Þ#žGª½Y—]íwÄz‡†ïíôÝ.åí- …2$Ï;Ö¤Õü7¨øÑ-5{4ŽI¥dèò„ù׌®zæ§¹¼Òtë{-7YÓ’þñaÃLÒ˜Úœ…çšÌñ}Ùµ»Ó¬ž^™ä³„~ßÅ’;柩>hОêÇÂú]Ž™«éê—KºC­þ 1áTƒY^0eÓ´™¬Á¥”eX—?»“<‚}}ëZïE·ñ6›¦Ý\êQX]`Ä*–ó”t b¹is,³lÌnÑa”l4ë}{Âöͪ^<Ã+%½Ë.ÿ1%Hô¬\ÞÉàÜi—ks5ã³›´_¨à(½'‰m¯|U¦ÙÝY@]íËG4ëÀÏ!‚ŠK+Kk/¼A ë —¸€|’)ÆóÐQ×Ì:y žãPø… Dóµ+)Ahb ‡ÞǨÅO¦Y DÔGˆ,ä³Qjß#»ŽwÛ½G¬½¾‡á”} ÌÍq‰å‘¿x¤”;TZZ\xËCº²¹œ -Ùf‚êá¾UÏIô4m¸½ .n4ë ßÍáèf·fd[¯6MΨz`úf«x]ßÄ–—Ú]ÌçÈx¼Á4¬JÀëѾ‡¥_²°›ÀºuÕõçÙ¯<ÅEN$ŽLœß—Juqâ R‚ÇNƒO½*²0´\yè#¢˜z“èþ ûf·%í®£´Ebû#– íÀÜ1À§i^/›Å?mÓ^ÖÎÊöêXn ˆFÌÄ\b²< B椒=:Kv¡Á\'cÏ|ô­MËBÒïSÒ/çÔn­`wŽÞx‚•=7{àJKÈl¥à»{û=rÞ­>X•Cn’x™6&ìœr=«CGÓ¼)&´’é×oy4ÚΖî2@^•Ÿ¢xÏRÕ.ƨÝË=¥Ø0`žP·Æ›§xY°Õ­ç‘VÐK½®’E!UyÎ3žžÔiê5~…m?Çz¼:ºÉqs,°I.&¶'‚ Á«Ú‡ÂÝSûEþÊÐ=£I•o8yˆ¤÷^¹~ËÄž½×â_ìHàœÏ”¾Y–'‚Ëœuö®JïPÔì|E;¼Ž/ãŸ%A<¶xüŸ›òG[}ã=Fh.4;Kô›ÙóIÁõâ¹ïËu‰®e•÷,›d†AÐÆFW»­x/OÔui$Å®u9YÁÔüŒÃ$©4š§o4K×Ò¬’!ah>Tñî-·©9ª³ô üɵKÕãÓï5mYt}Rkd2DñïWþë1`‘O½ñ=Çîìt}:iRÒ(„Œñc3³ó¸—âmR×/F³§ÙÜ^Ø]Ư˜¸ˆã1ƒZ £YézM¿ˆá¹’ù"% ³íx£' 7­.ºnÛ]ƒÄš6©ã´Ô´è$½ž`žð ‘È` î8ïQÛÛ[x[ÆÛÄ–N'¹/ ƒ1ŽH°0[ ‚3Qx§Tlzé±ò‚Þ•†ø§H¿Ò¯n|¨¢ :â'Yg‚Ñ0&N™Ç±¤2ÙÝëM}i©ÔÅ´bÀ³qóä j]'ÅÏâk{Ý1 ´±½¼–‹h–2Ì9Øp:Çð\båµ®Á‹N{b.ÉÛºÃý¬Ö®¥h:TwÚ¶—¨ËªÝYÂÒGm,A3ÆóÏ8Ï¥ Ý×C Â>©mâ{2-ä¶xß÷¦â2 GüYÏlWA¦é »×“ì—wr²–[9‚ùR0ä(lgªñö«¨ßG¦jWÒÍayû–аÀaŽx&£³øo¯Yk1n¶)o ‹Õ`QT¼pr8ìih=zµ»]jKµJª%ËÛò€+Š¿¬ü=Ô®oÚóOnl®™Pʪêd‚¤ç5rã]ðµïˆ¤iô·24ãý-e!\ç«.qŠç|S}¨Ûx–üÍ3Gp²|¦6 wØÅW¨—’:MwÄZ>™5¾›{£Á¬Ii Å%ÄŒUÁî ‚8•ã‹Á=ör€&•%º›T^ê¿PkKXðŠxíoÛQ³Òï®íÒIm.²¤¶0X8ÏíKijøÚÛC³Ž …‚=ó™ã²3rpjæGc§ÛøÃv­ÿö\ðÌñÛÜ:oóS¨Èè{Ö¿‰|Csá Ê;;”¸¸œ’.Q>@£·=ëY{¿ØéZ¥«È‘ Ö¶±’!`s p®‹XT¾‹ûe'‚-à*Æ»e :àÒÌ?#]_Qø‰áû«fýî¥k"̱Ä6ùËÐñÜŠµá=:ãF‹QŸZ³’ µ)0™J‰3ÑG½Aq> xZêëÃ’Í3\L°Ï< ˆuñ=êMêóÆZ]î•qtóˆIçc¯LûQêN ­ÛI‡HŸQðýÂ\ y'›xR8'ëÍq>ñ%üz½°i¦ºŽWòå·f-¼7cñ®ÃúN¥á­8ÿi,YZþùæŠPÇ‚(Ç®1ôª¾ñf{ªD±èVš}ä…„ˆOÈädtç>”Õúk©J„·FöU¶ÔlÞßÎ#jÌ<ÈÓ=×ÔLÔú§Ä;85V·þƳ¿µ·+–dÌ´c9êzt®cLº¼Óõ›——ÌûrLA8<ÉŸñ®£^ðn{«Ìç\‡N¾˜«ËhéŽ@݆×ÚŸ.‰­J¾¶zï–yµÙ.~i­.cY`p¿(Ltü9­³¦é×¾Ñ%ñ ãé÷Aa*›ËÅŸ”°Ï.©ã;ß êãEÓ˜[ÙÚ(ƒlŠöÇÞ>ÕCÅZ~£ã²Öl­¤º/•q)‘ ‰ÁÀKî?"æ·~Þ Ñ,“C½iEó´Ï~£ñÀ\vÀªñßê¼?qg$sªÙºÍ8óðG¦EKe¦“á8añ=¬Ï Ü·¶BRTå½³éMÔ/tý;Â7xmfHç¹ s$§÷‘ eW#±õ£Wè-žÚ–|9¤ßøz »ÍnÖKk )"Èï÷q´Tš5îq,çGÒžËWîÖâI © tïU|9||[ay£ÜÌòy±V‘²"uä7Ò—Dð=æ«qll¬ÌÏm0rH/® §ø‹ð9ÿ ê’A¨C/Ú&7>nÓ¬™8 ó[·ß –}Ft¶Õì‘ZL‹Vcæ ôÆ0}¹«Ú/‹´ýFõ$“H³¶•Ü칉pÈÇ¡=«„ÔÍݦ¯43» ´œÃ«6x#ëÅ5¾‡YªxÕô«ó¦ÚXÛÝÚ٪ŋ˜ƒ±ÛÁäÖwŽc»Öï-uX"y­naB)+^N:sZÚ¾‡¦_j‘Íw« 3Sš$i¢ò÷.â9ç#‰|S{áK»]3L™’!RÒ0Î'ÔŸ˜'g¡“g`þ…MNÉàßÈIx‹ô=ñéRßxþÞ-FKuÒlîíTˆÄ³&e!xÎî´kè;üÉõo Câ²¼ŸQ·Ó®gL‘\#ÜtÈÅ6ÿPo‡ö¶š]ƒEs<¤Í,ò.ô|ð0jÀñÈ–çZjZ[KˆÖH8 ŽŸ­[]:ÖÿÂúkkwO§ì‘–Ö@›™ã÷™£®›‡O"Æ¿}uâ¿«E‹‹Ys,ñ킊£á*êÆâõõ 0Û0¹ó2ÝǾzUÝFxü%áô›I¾ûl—’mk° lÇðÚªiþ"ÔiïnbùU¹àž½kfÿ…¦Ei,pÞ^]¿œé0¨֪ϫÿoøbôYÙÅa%¼‚Y¡€ad_\{Rµõez3½»ñ%¥¦=ÜS,Â4ÜUy­ ÄþÔ|-¬Ío®yAž ×÷m'p08ö9¯&𰺽ԑÀÈ~Ð`Ç<Õ½3Ãz%Ýêªj«;#û3G†|s€sý(²{ ™õ=BÜùÊå Ž¢³ïüQc¦Ü˜&VieŒc Ó5Åè>'»¿Ö¦O=¡‹qÛà(ª§Š4mIu‰îlâšd”%í½±NËv“ØôÛK¨/ãYc`Pò8æ¯Es>©u/•ýÃ!+ùW›h> “Ãzd'P ,ó9)0Q}Nj}kÇóG[>0DW &YAœ€}AÆ?:,>knvךm†ª7\ÙX܃Èó-“?˜Ö%çt [?Ù(¼pmn$ŒþY#ô¥âÌ>*{[¡Aet_"æÐcŒs¸w°šŒ†A"HÀv=*lW29ŸøWV%É´Õ5K×–P=¿†£“ÁÚí¢“gâ®Gð¥Ì,‡“Öº_ø—B×"¸ûfµ™p&dD’2T¨èI÷9«\¤È|·(?yH!½Á§ªâÎ4ÙxÆÑOú-•øÆq:gò$‚Oë7Þ½‰GWHË/çŒWræ?2Jy—¶ØÑFY›Ó¸§Ë ¶’)-³ž”¡úŠ.Ðì·<ÏWñ­–¡¤Ý[4H…Ud^õ?†|W§Úé6–ÓÊb’5Úw)ÇSÞ½_ß©l”wYãY?ô kïÚEÁýö•jØã1©ˆŸÅH£QX† rÂçýUÜNÞdH²QÔçÒ±nü¢Lr–×6§?òÎpÃÿÖªŸ‡«ÿ£kZ¶xÄqªŸéEÃS¨s“ÅWº¿‚ßD½ŽvŒÄåµsø{ÄúteíµK{¸Æ~Q.ò`?bÝ›ÝB4}NAÇ+ ð>¦‹ ·aÐë$alÕ¦¸ ÀP;æ½Cáž´±Á³í$J ˜î漺Há¶& ¹Žà?JÐðδÚ|ï2w oUf$ù]ÑûcàmFÓSð†“q`Êö¦Ýì<+p6+ó7àÇí-â_ض—a~>ÊàmY@,Ž„‘ÇLAÓé¢þÓ#‰.N x¢Õ/q=¥Ã:‚®}±\§;nö>½êyéJ0 y_Á–?N­f4{ÍZÒV6¼±»!‚‡ÎÒöä1‘Ö½Hž2;Öm4ìË]ÇnëM'ž(#ÓÁ=éñÒ“vx€áy¦näö¤ õ¦ÌsÓ®h ¬›«Ï´HaFUæ’CÐ/sU¸ÐÍCQY#žW™`°¶]òÌÇb°<)áûÏ‹Zý½Ä¼ £¢Û‘ÿôч©íéŸRj­•œÿµ¨tí=? ZI÷¿çéÁûÇÕ}=*úƒÃÓ<áÙnï&·°²´…§žæáÖ8¡Ws;±ÀUI8SµôEž ñ'‡¾x(jÚ·šWÌK[; (¼ë»û§â+kx‡2Jç…QîI Š^øs®xº‰:µò¼VÖ¢/A7Kwmá¨^5G ª*É<¬ –|gD¬Q7Ià;­G㟴¯ˆsZM¥øDŠqák{“4W¬Ó(µI"ܪ‘y&XàI»,òHvnA^×]“W³Äþ//îÿŸ^šk|×ï3Û§ùÿ—ÞQEqQ@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@¯>hž9†¡nä`Lzq‘Ð׎µãºçìo¡ÞÖÓÂY³»ÍŒ¦=1Œæ¾Œ¢€>4ñì)îD[\‚3•aíób¼Óİ5ÒHèšC3ðFX~kÅ~‹Q@“ºÇìa}fXÀ—{+?Zãu?ÙÄšxo)ä#ÑãÍ~É:,¨Èêa•†A†³.¼+£^ÄÑÍ¥Ú2·R!U?˜æØ¬~+j?¼U`y¶Yã€Wúço<®Ù±ó´¹°;¦¿kuƒþÔcÚÚbÂs’ñ±Éöç"¹]_öe𦢔¯ çvôWÏÓÅ>fGã=ŕůÛOÿn2*»H§##u~µk±Žxßè³ÀÊG&T(sô¯:ñì.du†ÖÚävpÊÿ¾°j¹ÅÊ~`jþÒ5é¼ûÛfyöíó#£cðâ´m,¢²·H"@±F¡U}¯·uïØ:ò$’H´«„U—HÝ@¼Wšë_±þ­f[É7 ÇùŠ9¬Ïü_ðåüE¨‹Û[˜-¤*ÒUl1TÛðç†ãÑtˆ-%H®Y2_Ì@êIë€Ã¥{~«û8øŸNÝååÿ߈ÿJåµ…^'±cºÄH÷ õWLž[jxWÄ S´Õ¬ï´¨î ƘQiÌ-ž (àÕÃx»GŽM}®<õ‘¼©8IBôÃ=GLW©\x{X±$˧\)õUÏò¬ùU¢'ÍŽHÏý4R ;Ü\½lyŠÌþ‚ÂÖÍækfs#Ê_kHGð’:qéP=­ÏÄm76ÑyWvo€g“åen~ö;b½*÷N±Õ¢òo!†æ0r« Ψ#¥;NÒlôˆ;HÞ"ÛŠ)'ŸÄšw{Ë­ÑçŒ$ð^ˆë«ÚÛÜÉq D¶fFÀXãëUµùíõ ÉýVÞ\ª÷0[äîSÀ8<ã5ßø«Ãþ*Ó– e02¶ä•WyCÜc#ƒT¼%à˜ü-<¯ö³vò¡öÀëŒdóNýÅËÛc‡ðÚZjš&¡ܾEˆPÒÉ·&'µj-&ÛÁÚe毧޾£&ÁLðùf-ßÄFNk²ñöƒ>¹ K  -r]Qp ˜þä|á­`jWºµ½Ä-ŽH®AóЧZ/Ü\­h¶!Óõ½GÆVZuÝǘÓÄD-Œuä)ö8ª¾ð棡j_iÔ¬ZÎÖv–gÁ ¸åx89®·Sð…·…t{ûÍ)EÒÂ@J_¹^88®;Âúóê’G£ÜÆÓÅt¦mÅ›‘÷¹ô¦KVп£]øzêø¾•¦Ëi©ˆÜÀ^RÑ—ÇÐ×?áNçûj!%˳<ž[Àùa <0ú×I¦x÷×Kwus–PfVhKoyÆí'ÅÖ¥Îé­,­nÙb™!ĈO Kw<Ó^@ôܤß!˜ò5‹I-Ĺh"dPzc'ñ©ãñåÍþ®"L†òÖ©0†•8È=s\õ…õž¼‘Í ëv³á$ØpÍŸ_C]Að·‡õ-jgPº‚äK™¢Ž0bÜy*‚3Iyog¡Ëx—Ãú¥¾µs#[ÝOɾ;…‰Š°<ŽqÁ½­Xè3ÜD5{»‹}TAí€)¸×#­Cwãmb=~æ yšÖ¤(¶§îícâ¤Õ<)¬\ê’jºM°ž ¤ìfBÃpåpÝh²ê;·¢)x£_¿Ñµ(ì´û‰,í-âE‡ËnHÈo|Õ»ŸßøâÞÇW´òDï•:Ï(s/—<ÕGSÓ,E¶›ªiQj×õäV(b'ªTŽ•—ã‘æ–Ñ!þÊ0³Â®WÞ\Žsš=E§MÍ{íJ i¶šn«§[jw.Í3[Îw, ñÁÎ:Ö_‹oã¾Ð4ùôÛhìtä‘„–ÐçÈyç9È«Òi0x³D²žòñtybf†)ns'šqž<Ô³ê³|>Óma´¹‚k‹¦,×pǘÌcŽëÖŸõqÿV2ü=ko®xvî-JèÙXE2¼W{wìð@Žõf;[oéw:¦—©.§4¬-ã#Ø"Ï'#'“Š“X¹¼ñΆ¢ ‹ÛYwI¤;<Å#ïlÆ*Ÿ†´ÏìëQµ»YíôæEY!• nÏŸ—n{ûÒëæ o"ůŠ5?é·š=åÃKtÈ$¶+Æò½PýEÑ5-S3êšt¶vðÄÍ,³.ÐS+ž‡5'ÙôÍH¿Ô4Eº7^X_ô–V1©<²+3ÃÕæ¯u&‘yq5ŵìmîØØÈoÃuÔ[ìtZøbiEÞ‘e-¾ªŠí3N]K`à€G_NkŽÒ-Òl怵Ýä'î³½O|ž2+&Ú+3A±´×m¥¸w•¥·¤ƒÁÉ÷#¥Mã{É,4[°óᴑϘdr\0 úQÐ:ùhzTžÒu;~Ì›Yö–Rñç6sž; °nôÖðö¯.ƒdÚ}á‰Lˆd.LYù¶šÌðñŸÅú6¡¥ÝÜüÐí¸‚æá‰XÛ¡öfµôíoÚ\ê—··°¤^T+o&õ‘‰ÆÐ}EÄðEí¾¡¤­“‘pdO&X‹d…/Ë~ŸÂ¡Ó>[Áx³®·g{mnÞl‘Â[ÌÂóŒcÛ®kOGÔW_ÓnšÚÎËOÔn-˜,ÐFäãÖ¸ éZø‚ÀÁ­Ïœ$R3ógÛ§¢Üzô:{?Š-q©“wmkö1&QÚdEÏPÞµÍx—@Ô ÖoÉšæ&“ÌK€¿+«r=+¥›Âþ¾×Þ(u†Þã›fåÎîQHíÚ³õ?ˆzÅ®µr–²µµ´Ryki·åxÆ? «]yµ›] Ab5Û››}_ì¨%6êG¦ì÷ª~.Ön4Ó¬´©žÚÉ Y#š6æbz±÷¦k¾Ô¼E|5]6ÚK«[ÈÖbAÉFî¤uíVnŽ™¢èúf¯Y½õÜjϵ$(Ð)<.E/Azì2K Gâ‹ksfÔ-$0Èò8Ut# äñ‘SiÚkøHÔ®5»U]†+l¬˜9,qÛÒ©ø²ê|?¥®Š¯m¤36Ar\KÜ1ïG†m%ñ~ƒ¨i÷w"/²²O åË|‘’pTŸCFwؽ³a©ø{YMLM2üDÕX±’0~m¾˜«Á7³Ë®Z[G\[ÜFñOð˜È9?‡\Öæ— '`¸×%»·½hPÅ[¾õfn>n:{TšWŒN½,Ö&ÎÎÎöîHní¢ÛûCO_Bn½JÚ_,ž÷l:í½Ý¼o½­£ÊÊÀuP9ç·Z®ß®ãÔ\ùÉeæäDñÁAõõ¬MÔíõ«V··xî’pñŒyÏ·Zê/ô _k²§ö¬Ö×K‡‡`òËÈSØzIö)ïï:ö‰¨>µq{k×¶Ó:•I0àgÔVìE¶—¥[øÜ&¢‘aZ؂Ȅä9 UoÆZ¶—­ÏŒòXCl|¨á^€•6¯áûÿ}XÓmÚcq'pÊ:ðqž ûPøŸQCÑ´Ë}YO›tßiïœÞ˜ô©/|g£Idóy×våe‚IƒÁRÝ)[O èÚë–&êIe.–»Š˜€ãv}I¨µëðÇ Û=´+p¿kŠG.ßìäúO§¿1ú7‡ï<$n5P"ÛE(d%cÆ8íOÑ›³Þ«ëzÄž³Ó¬tYÙ e7 tœyå¿Â¨_˜ºEŒ6Þ½:äSAa,ª"‹e.:•þTø"Òô}#RÔ46¹–åc~Ô 4*O,¼ Ñr÷ßt5X™®uYTÎ ¿¨¤ÐôMOßk»Öb’ …‘á—þZ–à)ipW±—áÞK~–7W3\ÙÜæŽìnÈ©ÛáÆ³ç‹p‘yN'µ}HÎzV¶‡y¡]NçLÒþÅ©$La/!u'ol÷®BÇZ»³¿IÄ’™ÖMÅwŸ˜ç¦?J=X_²:WÅZ*êMoq£Å©,[ck¢Å]öŒv¬o\Éq«Á(`,Þ6»x1Óó­m[áóÞêSKe{išC‹Iä+"ddŽ˜êjMWÄ1x] ÑÒÚÞùm£ )¹p,y8ô[ä=­Ô©§iiâ ÛBñ,>Ï;%½Ôã!×#׃Vá·OèÓÞÇw õÄî"†H~dAÔçßü+;Å7‡YÒtëÛ8–;Xɉí¡_–'ëÓЊ_ Cæ‹©A|L:`´ÃªÉž6\Qù‰Ý¯#WOñψ ½Ó¥’n.£"9Qv³·¡®CNÑ5A«[G¬ÐÜÖt*““ØW_¤ÙiÚ ­ö¡c¨¶ ðBY h€*¼k+Mñþ¤·° «—žÍÈITŽ€ðphkä Mµ4îWÑëÓJonmîD˜‘£QåäõÅcø¿_¿¶×%†å·Š o¼1×Þ«j> Ö »ºŽî ßòÌ‹A<þ5·¬É¡Ø‹;Z)oo RIà}»O¡õÅì4­¹I´«ïè–·ð2î6heÜÁCÈ#¹®‹DÐçðû½ö¢ñ}–Õ )÷on€Ré>(²¸½‰¤Ómaw;VtA”'¡ªD»u+ßx*+­Fq¡k fÜ ‘ˆd'’8ªø¦ M›§ª”¶]ŽÒd–n¤×;xÒÙê÷QÞ1óć-ëô®›Wðýž¢,¦¾¾]>òHWr²nÜ;ÈÁÅO /=ˆ/üA¨jö¶:½¤’E=»2H°”oï s‚+SÃþ-ÖoÞiõKÆŸOµC‡”啎8—©]é–¶º\ÁæŸ3Ivû`{ñªñëWÞ,Ò®¬åpר–0ƒÇqŠ«ôan¨í#ñ¦Ÿ}mpÖ²y·Æ\DAYÚOÅ="-) Ô4™d» GÚ£œƒ¸ž:~ÅøH¾MfòžØDwHÒ©/p~½+^(¼3=â«}¦&yqÀÆÇ=ò8J•¯A½¬ïl¯òÖ9WîÈ¡ƒr859ˆê@¨ÀUP àÅ9~ïµ2…Ÿlvòâ*qÎkÍu‰Úvg¦zEÁÎ ×—kÿi²ûä("E«7ú1ýÙn}{†f™þ!øLêeÇ‘ª$fHÑÆý?>™¯±PnN@<ó^Ûðóã.¿à]"Ýb¼ÓÜ~ïÍÊͲ8íÏB±¤Õú•eª¹çú:¯‡5étÝfc£j6Òä[€|²G£ þµôßÂÏYMJÖ~ß»™[?‘¯ž5˜[Ä7ï{|«,²å¤¿s[ ð¯‡ÛZ³}fF²Ó÷ƒ+¢ÇaÀÈϨÉÇJMµëcôàÜ6ÃâÍÝÔZ›¯(q€\‹²w’:ôÆkÞTmü}kÇ?go†öžÓï5ûmr=~-NÞ+{Y"Õ-¡Œ±h—v7œòkØ dõ®OS¥ôC³þE4’i@Ï~)®ÙçéHB†ùp BÏ’;c½0ÊIÀý*¥õé–‡™;íL¤7I!¶ƒæ•ò ì8õ®"X®|q¬6¤;=’¶ÛÛÄÿ–„qå©ôõ?…Y×5­VüøgCbo&âúò?ùd§Š½ü¿—»|4ø}¥|<ðÜ—×ÒÛØYÚBÓÜ]\¸Ž8cUÜîìØ  I< 5K]†t ~ÚøWL…%Rª: ä~ ¦µñ¿Äú·Ã« y´ŸéÒ¥·Š5i”n¾lXÝ >Ù¢ºIcYmç•%‘£+´•$ÕmcÇz¿Ç«ËÏ |4Ô³¼'otlõψuí¼ØO&ZÛMòäv3ºÎªguU‡k•Þáqêž ðàkøt„¼ÿOºûmÔÚ†£q}<ÓyQŹ¥¸‘Üâ8£P7`Ýõ_~_EÛÍö}—Íô2½Ñmù Q\áEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPPÜÚA{Žâç@s¶T 3ëƒSQ@þðþ¤Á®4›f8ÇÈ»丮oSøá NFf±xU¿‚6˜&½ŠðWöIðåüo²eW à0 úçŠà5ÿØ~Úâ2Ð}šbN6!ÁúüÀ úÚŠüýñ/ìp¸+¦ 7gR‰ã·8ükËüCû_iòº Y­Ý‡æR;ô¯Õ*)ÜÆý[öX×´ýÞQqê¹þ•Çê|O§?ú¿0ï)¿kîü;¥ßyž~k+IÌЮ㞧8Î}럿øIá]B&GÒ’6?òѲ?2GéMI¡YŠžñ‰>fœÍô9þu—&›yiÄÖsGÇ9BqùWì¶±û2xORÊW„󸺫çéŒb¸mkö/Ò/do³Ím°ôi©ü€?Ο;*?%ätÆÖ=z‡¬ë}L·»ûe­•¼`‚Р^°â¿MµßØBK–‘`¶†Q’ î2Eywˆÿa{Ø"y²åH׫ùE@üqOšâå>)’4–&R¡ úµÂGð®Î×RŽáoex@þCF9ïÀôü+ìmoö?Ôí7£1ýÒ­q:§ìãâ-?"?4ýøóO™ ”òc½¡xŒŽ#¡ÞxM®ouxvÑÂP uq9n6äW´û:æÊõ´}*=?QxÅ*»0#º€OáýF_ ´i­•"–"DÈX„eû­‚kVËÃ7> †[Û«È.­mÔº,!ƒíGŸSMXZîs>Ôî_P·µRgŽF1É nOÞ­Ë?XŨU´¼·ÜY­ü²$ 8SžOÍ^Òüao®[y3Íi¡2Ñ–Ûc£€Ï_Zæ4(õ; N+g´™f€Žñ°Ï<ã¥ubÿ ·mñ2íq“ˆš YTÇ®k ^ðåêëw3½µåÕœ¯æ%Ì“¸7#œc½ux7GÖ¯.níN¦«åeh!ßo¿©]Øà~=ë(xÂþvò/>[UFØ)À 8Æ>”njYÕí|==Å´³Þ.¡º¬’ÛÏN7Èâ³üGªÏ¥^ÙXÙLöÖÀ¦V#Ì«ÜԚׄõ Züêšu¸¹‚ä  ª¬¸ÃOJ½,ºe…µŽ—©ØÅwu{Îö Å“…t¶».t{¯XY^Ã,Fö0ÈÒÉ´H½A÷­{Vú¼Z•„³JF-݃¡ø‰Ïx²E´M'ìiäé‡!18“<‚{šÜÖ´{=wÃöÆ[謼¦&—3Õh0õ ZßVð•ãiVé­Ê÷pÇÎô=>™íQx0M/ìn¦Ÿ-±3H~ìd}Öúæ®Cj>é³ê0]Aq;b’ Z5îrzDñ5׌4Ëý=’(¯Z1$ma ÁNJœu ¡¢éºf…iueª UmãóBr¤ŽÀOJ££üLÔ¯o£¶Ô.ZNLLá@hóÀ ûfªx+OÔ4íT´öò[BÈDÆt*ÅœúŠÐÒ,¼%>¢`×Ms2GÆ ÈÀdF;ô¦Ÿ`k¹ÏËàzÞüªYLq.#¸Ûò·<0>ë¢Öåð¤Ú䩨}¤Ý©5ÄyeÀœZç­üy«Úêfv»—g™™-Ë|¤g•Åijõ»Ë›«ŽKIH’5yT8 Î “ž3KOQëèWñ~³{g₞ÒÞTal˜àûæ¯]øvïÆö:~« CÃ!†c;„ó žsÖ¦Õ5­+I’ÛM½ÓW¸³ˆG%Îò¬?ÙcY~6ºó®t×¶]š[Û³D€üŸÞQOÔžºnjÀV—ööúÝܦf¶—j8Ó5»ªE­ø>I4ËH´ôŠ`n­¡ÉÜ1Ã}3M²Òcñ… þмKµ£·»œ½HÉO^ X'ÃÍ"kËK¸µ «ÇG,ctj£“ש¤3#ÀÖÏ<š…­ÊÓ&¶c<Ñ1÷X{æµôMHÒ¤:­¾ªš»YFÓ-²FUƒÃuçؼMuãmPÓ"Šûgöýä8¬Ïèú•¯ˆ ’Ki-a‰XÜЪˆñóŸZ4CÕÝ¢þñ/Ršö8¯æYlæmò ÈÚ²uk°_J±ØÜOšV;•BUùàƒ]&§x:çWCi-Ó]«—ŠÚ|äaÈÇN:W?ÿ Þ«oªMr÷“F|ÒZØ—åqOuï´~î¦î¹/†£Ô„œWßÇ G=͹ÊÁïY>5Ô§Ó/í-¬%x4øíÔÛ4m€Ê{ñÞ­ëÔõ{ç¿ÒáY-nÕfTyU]K ‘´qS_jw†-ôí/S°MbæÚ2]™ÊùEŽv©çŠ=êS‡Lºñ߇ín Ñ­õ¬¦ÜËrûUÆGÍê*Ü[|?Ónf¿Xîžô¬)lÌ6’N ÍQñµê]i:Dšz m%· žR\ò îqÞ¥Ð,¿·ü;}ey/ÙmíÙ%†êl‘ž£ñ¿0ôØ¿6§¯¡j0éÖ0i׆=ä[Œyª zq\—‚¥œøŽÒ;pe’ <Èù³ôØÛé°øGM¹ÕVöÛS0 Ž·›Œ¶j¦‘ã{­fìé÷io]ÆÑÇwa\1}úSk^À—p±ð^‡6¬«m¯Ç1œÚ„ÑýÐ{úUK߉ºÅ¶§2ÛºÇjµm™caYèzĬ ¬±\‰‚£²7×>žõ×k:w…/5»qy=½Û8´k˜Kw#¡­%·º7§ÄexF¾Õuík+k‹Û ØÖBÈ…¶r§èEYÚv™áË E;HÒ;Ã'l‘¡õöö¨|]âGE×~Åa3ØÛY¢Ç BxeÇ ïš’ûM¾ñæŸa©ZÆg½@mîA`»ˆ9 2} \¹±Ó<-xu¦[k‰ÈšY÷Š@àb©ørúóĶ÷š-Ôï:Ë™ ÈÙòÝ9úV…¶ÿ^uý·l'N¡,\õÇñCþ¿Úº}燵3¡Ø}‚í#S0,Yš<òTѨh7DðV¡¢ÞÁ}{,1YÛŸ6I!•\ñØ ÷¥µñ¦s«ÆÒèvГ'Ër£æž‡Bk Á×·ë–ðaæ·¹Ì2Ü‚„rqíÖµãøn³ÞíTµ–ÿ2«þð.zc¹íGMüÝŒ i§ÄfíËL²$gæˆöÆ+£Õ4;}r×O¾ÔutËù­Æä”æМt8¨¯¼p`¼tŠÆÞæÎòÂL›Œäý+;ÆÑO}©Ei­.¡Y" pƒºþ‡æ%¾†Íí÷ü+ý6ÒÊÂT¸šã3Ét«•~À ö¨nu+ÏønT}ºÙ„Þ\)*t<â›e§ØMàû?í»‰-#ó˜ÛKå¶÷=³VþÓkáO K6x÷¦æpr)„c¦;5ù®æ_„,/ãÕÚIãx-c‰É¸B£aÇ=MhhvžmR³Kt×—Š ±±Û¨¥ÒµëÏEq¤]ÝI:]!HØXr3õÅcYø'^]FÛ}”ÖÁ\7Ú|ªëŸÂ-vÐkø¯U7·“ýªH¤WÏ•žLUÝWúåÌzžŸlfŽî%™£f«Î#г}á{­fdšÎrí&t|+™ÅdxÆþî-vHüƆ8•V6cŒPüÁ%Ð×–[_ h¶¶z¥‚_\HæVµ‘¸ˆtê>•ZÿP¶¸ð¬­¤[8„ÃíQn$ôàçÒ‘4›Ÿh–·^lqÝÂLK‡Ú%QÓ×µOghþÒîîoVî.HŠ8CŒ¨ç'Ö@é©CÂ%îïd³É–Þâ&¡<(ÇÞü*î•à¥7ÈdÔí§³BYÖ6;Èà }†»¯c¨Eicoc¨I;à@ Ôq\þ‹y*ßÚˆnƒáS×ÚQkÑ·>žKéLv–ÒÚ«ü«"Øùª>)yäÕþ݇¸·¸Œ:0…‡èjýï†tɵ|a-ei>xZ=Á~‡4ýKÄóhºƒXXŸ&ÞÝBmew¹§¨iêEmkmwሟV™­¡iËZ”\¾;ñèNiTXø{Fº»Ò®^òYHˆÌWiˆzcõÍWÕæºñNm}n,бŠXbí=˜¥/†mJZjRêk$:—±ÕÔ«3çŒg¸æ.=mäVÒqšs½ž3‚zR(ý@ý™gÀ¿ ƒìíÓýó^ž0kÊÿf FÞóே`†@ÒÚDb™;£¼~jÃõ¯S gÒ¸™¼ž¢’ À5ÜôýirA'=jµåضŒ±å»Zb!½¼i…ù¥qò äõÝbãO¹]3Lý÷ˆ/W G"Õ¿§øu—ÄZÛhkÞ·vHµ¶?òÏý¶ôÿ­ôô‚ŸšÔSRÍÍýÁó%šN¬ÔälüøG‡lRyÓ}Ãüï#òÌO$“ëT5=RçöšþÌÑ´=k…†[mGPÖ¼E¢´!¸±»‚ÞÒfŽC«æ«Í$  …ÝœÔÚ¿Ž¯>7êSx/ánµöo Áµ ý‡ ˜³­¼å³Â61õÜy¯‰`ëÄrL32<´Ìf¿B( ÊMö,¼³ylž'RAP }+„Õ¿e­nÃw–³¨?ÌWìµe]øSF½‰£›K´en¤Dª1ȧvâ~¡ð?Äzq?»-ïGå\íï€uÛ3‡±$»O_οlµ/ƒžÔ£ÚÚZÂsñ±ÏӜҹ cö]ð¦¤ù‹t G!ãsõ§ÌÅd~4\iöÜIc2ã¦?ʨËüÉ4XS÷’TàýA¯ÖÍoö(Ò¯dqm=±NÍ*•?ù×›kÿ°­ÃDŽÈÊÇò&«œžT~kÛiÖvîïmimnì>co¡aïÍ:êÉ/`š B¼n¥XØ×Úþ$ý‡¯ìã26™$HNÝíPO×ZómköGÕ,ÙŒQΘþé?ÖŸ2ò>Ÿð¾ÇLÔ!º³],Gp†H”dö䟅v‚&žÝ¡28Và¨b+Ôµ?ÙÿÄzy;Èáãÿ W5{ðÛÄxmÖBB?»‘T¤…ÊÏž¤ðŸ‹t JXô潆Ýå*·Ó•Fõ`ç‘]½ÇÃý7S+=Ü-5Ú¢ù“Ç+!$¸í®4=FßåšÆâ0U¥S`b?¼Æ˜¤Sß©6ÖÇ”^ø¢_ x¶ì_i6ú¬RŽĒF!”¡=¹ÍK¨h2xäÇ®iñG¥»äYäf Cãž;‘^}¥iÚ®ÓumovÃå *‚@ö=iöö©j¡0¨(QÑG¥P¬8»Õf𥽮Ÿ,V÷R$¡×|j:qŸçLñÜ7†e<0…‰[ç‚Ý8ÉèÀ ë|Iàû4-$o,'),j#û¤8­ 3M}61œÎÈH¢ácË|'b·:n¥m¨ aÓÜ VUùÄÙÀ Sí]©áøWV×׉çÛÒ0Š·ùOc‚ØïZÞ?Ñnµ½%M±yn¢: <¿ÿ^±´=?ÄºŽ¦ñøŠ[Ù­RK×fÜRßNÔ„ïÐÇÑ<[¨ëÒK¤ê7’OÚ4hXòŽGô¦i¾׬oí¥š²EÚà0` sž=Eu—ž±ðý¼÷ÚU³­ÜP¶ÕyKŒã¨ÈÈ?ržñŒP,V·2\I/îÚQ;Û¸$¡È={Uo»­²/G«øbÿX´¶ŽFŸ?jW;Y³Ô¯L}+ÕõèüAvÓÍ$3Ç'X€1ÓðÆ+t|7¿·¸fŽKgµ/À2ê¹ëŒuÇ¥t:N©¢ë771ÜÜi6Æ QÿhnW•Bãvð1׌/ØVèÌ]K ®Üé}ºÚÂâê‘í¦m¬[{Ó‹ÍsþĶѡ†ÞöD]ó4èX·?.z ÆñcO‰çi΂P)•)Ûô­¦Ðm¼Ag¦Ë}u%¥ï”Jùqãå,;z4è-v(ø²æé}嵸Ž˜Å%œ Äm×p±õ§x~ÆÚoj0ê†KM4H…\rË'ûõã­Z¿Ô§ð5­¥¥Á2\1–K ¸Èè})šœ÷Þ4Ñ<´Ýq{já„qŒyˆ}½E;u 쉡‹KðÎyªè—/}t©äï’0¦Çïc'óªÚ‹um|¾•u5ÅÜf ùæ7#å?Óñ¦è:LúBßK«ÛImd )::‘æg ïW4ÿìH"žëE¶¸Q†h㙃œq’qG¦Àÿ½¹§ü?×­õ g{vµ ´uUçvG§CZ·ׄïuÉ>Ó¥H]æù®RRÎz•é¥aøÄ—°ßDÏ<“Fí¶H™ÉÜŠ»7ûï·J°-½Å³9 ™öº/¸¥d;Ýö(x·QÔWÄ×¥åxä± øHÇlVÍç†äñm®Ÿª­Íµ•ÔÑm‘._a”¯×êz’ëÅ:]­ñ¶—K‡Pè"3Ê>vÀÇ^+ÆòKu©ÛËÝg4*Öʃ€¸åqìiú‰yww‡áî—m`ñA¨]ܱ¸—Í]ñ…è1Û·_­WÖ5ŸøH¼*%±·K7µœ4öÖëÃ÷\¯ZŠÏJZð½©ÔÐJÑÛË"î2'R|Þ¬7—àM#í:}ÒÝÜ^H\F2ˆœr:ÒÔ4!ðœBGÔc¹‰á°šÜ›“&6§¡ù«Z.‡¡ÙÌú…ž¢ú£YÆgKY#ØÅ€êFy¢ÿ„“Pñ†›{§\8k¶O2&peÛÕO¯™á}R‹[µ•à’Ö8²f’e*¡?‹ ûqF—{]4߉º¼wÑý²èÍc¼…‡Iç˜ÍWÕ¼ ¬GrÖö’ÝZ—ÝÈ7SÈä}{Ö¦iá;íR5…nÞieŽR ns3޵`ê*ÕâÖ.%RÛȲå…\˜£üE+}“¢Ôî´KW±³Ö¡–òú9n |cÐ`ðqô¬ßÞ›H´ÈtÂðif-ð²¥›?6qÜTú¯„/|G4z¶Ÿ´7q‰Z6p_#­M=Í·„´«-7R³R¸,Ó4NqägŒëÅõ*i¶·3Ð^Ö[…’ÅÃapÝT·ëV4ÝoGq«_¶ÒnFªú•¾¡oh Û-˜ä‘Ó#°Í.—ñ f¿I.íí<†r»Ö $@{ƒíš,ý´¼ÇjÞÒ®õyÏöÌ:}Ü„-r¨Çz‹[ñUÏ…ïIÓsœb2sæ¥Ö¹íkM¼³Õ.¼Ø¤—s–YJœ8'‚zèõ?K–=S2F.zÖWƒaiu ¡5œ°°¹ÝÀUÇûæ´tÿ imv­°—‘G—haۺм¾ìç®­î,/îpìCŸœ†>ƺ-RÃK¸¿Ú—’YߘFï-CmÞõJ_ê)|ïQüˆŠô¡ñ™u¨^‹ëXg¹·¹Q"´h[n{Q¢ ;£CVÔ‡4«+M.bb—3¥2ÔV×÷¾+Òn,f‘¥»÷Ñs÷€ê*[{[ ÛÇ­ù¨d”¼§"ûþ9àÓLÖZVƒu.ŽòÈò¸ŽIdÆôœ”õùµüÊžðî§o¬E4ÖòÙÃ^Id_”OCš¹e7†gÔÐKm:3Iò>ÿ“vx$z{UëwWwßÙ÷—Mmt¦;IèE'ü º»]$~N"fÇžQŸ¼psSЭnzƯ|“ϽApqo åN)aˆ8·3lP»›©Ç4Û¦ ‹ßiæªÂÜó}jV{Ù@$4Xú‘Фò›“„îu!X÷#<~°æ=Vr9º{bªÃ/Ù§eô=¦ec¯ÒáÚ;’NMoÛ’ ÕÈZx¦8ÈUÏUæ¶­|Sc3 ÎÑóœ0¢Ìµ$ŽÚCN9 }Áª‘jv× pè7U†yeÝÁïCE&™ú?û(ÞÚÃðýb{ˆ£™¢·ýÙpágˆ¯qgÜ8ç5ù‰¯éúŒ6zN¥aªMgµ‰&€”`‚·å_oþÏZî©á ÓU½’üB°<2ÍËíx÷'¾09®F’:5m¶zÍÊÚ¦÷ €æ¹½_Äqh6gQºO>êRÎÐu•û~ÿ¯éK¬ëÙ[M¨ß1[8Ž5ë#vAêIÿ=kkàÿÂÛÿˆZáñ.¾†+e8Š/á‰z„_~™?ýaR3càÁÛ­bñ¼SâLË4çp ÆïE_E¿×$_ð¿ÃïkRøž-þÝÒôhòcWÐüAåC®ßª[ÅnEÄoé]u#«,CÍ “(Ufú(’Ò8ÑcUE @:·§YÒ½–ÿ†ëO¼™AJÆw‡|?aá?éš•Ùt½2Ö++H7³ùpÆw1,pªI$ã“Z4QX¶Û»4ÛDQE (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ «u¥Ù_0k›H. ,JÇœŠµEs7 |3|ìÓhð1bIÁe€Šå5OÙÓÂZŒN2G!è͵€ü0?zóηûèÑ“oÔ¤sg¢´AÈüAʼû\ýˆìîbv­]»"’ üÀ­W;,OÊ(ã?ÂES‹CÒã•^ xdCñ¦9õëŒû×é‰?`û¯,ºØ,ªN0›d?ɯ+ñ/ìCya! §I‘ 2=qÅ>"y<ÏŽÙ `€kˆÔþ¥åýÅÌ7‚Ý$mÂ6B0{ô¾¶ÖdÍ^ȱnW?ˆ~µÅjŸüI§“….÷£ þ•\é‹‘žYc`¶61ZÄ£ÊD †‚¨5Äx kJ×ãÔ´™nÑš?/}¦íÑŽãåì*ökï‡^ ²'̲Ýî“ýEbÜhÚ…™&[+ˆÈîÿ1O™tdò>¨óí'Hºñn²ø†I¥LZ&ád率éUüGj<¦/Ø<÷K‰—Ì‘ØUÀéžy®õä X1esÔ¸Áýj½õ•®­jö÷H’ÀÄ|æ*®C]u¸|ig6•W1NÈd‹Î”:†_|>´š?‡u/Ý¥Åú$6Ö »Ê’÷F:æ»?ÃvDï-¥¨ÜmbX·°ÏJšúÊ-FÎ{i€)*”§v++Xå4?ì«ÕŽêßN³‚á²ñºOóFÝ·!= â­ï® Ô¥3HñÞG.IÏñg¥t–_ ®¢º‚I¯a1#†"2wàsÜu®öM6Õä%¤H|ÃîÏ®qŸÎ‹¾‚å¾ìàõŨêR\G¨ÛYÏ*‡{Y² ±ô­2÷_o O‘kS,âCÔ~Ý;ióÄ wÊ#L€?ÞöÍN{¾ÆWŒo.ã×ä_0Å*ˆLU|¼eqZK¡Éâý"Âõîaµ¹MгÜ6ß8/B=êΣâ -6x´ùl!Õ^Ò1Í!Ã:€GjÌñ•Á¼m6hcÛ¦¼XŠèüKõ¦üÂý‹íü S™7—wŽ6£aã½ý æ¢MU¸Ö¦Yï§·¸gfÄ=Ýð{sU|QâÝ'Xk;{{dXâHÏqÃ{çÖ‡w¸½ oe¦øfÊG)g•¥‚ŽÙ"SëžÇ®)××–:g…š]JiÕ.$‘¿x¸äâªÞXÞøßI³Ô Fžö"mç^™Ç!†jm3Lo é7²ë–çÊœ¬idü0s»Úš}ƒÔDÔçÖÆ“<­<7HBdçË déïM²ð§ÄM1Š;tmï”íÔZZÆu£#\Ë¥ZM¦±e“pÆ9ǽs6šÝåêN—qBÇ Ï#³¡økPÒõD¼¼…­mí²ï&àCq÷Fzè´ÝM¼)x–§w˜sŒöÈéK[i ô¾§GÉ–Ü©RÊäS.þx\óÀëKÎG4Ë‚LüG¨Gšk`j\}Gòª±Ä$˜5o\ÈÕ.3ýïéP[ciúÐgÐzX<Ÿu‡ãSÇ¥\¯H÷} Oh~aŠÞ°¸ßÒ›VCZî`Çk<$n‰ÇÔUëiåŒ ¬Êsë]4@p:Ÿz´–±É÷£RÞëšI²¹Q麊ÄÞqâÛlRíŒûgàÔ:g‚å¹¼—ɳ†ÞÕ³ÛÉÈÔäšüùð¢ io#ˆâÜÊ:0Çó¯ÑÙóáíÏÄk2Ñ2ÖvñÛK2tLù*oaÏçô¬'duBú÷Ã?‡úůÅ©ßDÖÚ=©Í¼>X×ûÄwséÿ×5õž›i­¬K¼Kµ#AÀ[CÐìü9¦Cac†Þ!€;±îIîkB±,(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢ŠÏºðö—}æyúu¬¦Lîf‰wõ9Æsï\þ¡ð“ºŒL¥"3ËDc‘ù’?Jì(  Öf/ ê`yJðwE|ý1ŒW®~ÅZMìŽ-§¶Øz4ªTþ@ç_NQ@ ø‹öžHžHì–E••ÏàÍyO‰ÿaË»?™ôLJvv“LãÒ¿O¨ w?5¯ÙT±f1GÖ|5câ‹íŠÙˆåNÐûSôŸ ÙèK*Z®<ù˜ŽO¥}?­~Ⱥ•“7• Éþé?Ö¸m[öwñ ƒ1_0ã¦øóúÕs¡r>‡ˆø§DmsFšÙI}èÉC$óË ‘ ž€ ½z`¼¨ùï\ωüoâ{ˆçyÚÞH”È›·èéëLV¹ËxÍÓTÒ-fÓ¤‚x`“Çf¤.OCŒ UO Y$ÖÚ”Wa °h|Ì1†þ¾§­w¾𭿇-ä‰%3´Œä#:è*iêšñÛgÎJz¾;S@¬s6>±ðô’êI,×RÚÆdŽ ¢(s޾ø¬Ý'Ç©¹C=ËOj͉## >ŸJ¹á£â‹F K¹¯ ’ó,wD•ÛÓoÊ·Sáîhés›zþQqµˆü:{S½¶MîpúŸƒµXog0ZMqlÎLs*ä8<ÿZÛÕÛF„YZjÐÍuoÇ$ÖïŒz늊ÇDZÙOpºÔ“y¬D–÷; îí Ž*=CÃWºåòêºu¹–Þé†9+éÉþT‡©‹5²³Ó-ô°ði… ˆUˆfló¸úÓtÈ®|_¢ÜX¼›®mXK ³7<&¶m---a²Ò5Hí„ò3M‹©¶$P=+¡ÓÄZÓ_ÛÃ$öWˆ%ãøIíWn|¥^\I)ó‘Ý·6×O>˜ãó¨¬nüívêÒPa€‘Çœ £¦*•ú‰Û¡oYû%ëÚEsnd™ÛzÆk/½Wñ,ï¦hñýž6HŒ€MºBÇ_J5Íéõ ;Û1¾DùX3€ þ5oU»HôÐ/-ÔyÇbÄä|ß•õ%[h5-, !£™0N{UOZÞé°‹iÄrB¬q"¸8_qÖŸ5´–:Dïin±ÊSåÚÇ`(ðœð^iQ°+æŽÈ4­0 çn¾3M¸LÛ¿|.y¡ÈRr3ŠdÌL/ÐŒEÞð ÇüQt„½½Œ?¼–p„‚>Pzdû×?â=>#Äúµ•²”··¹h£RrBzú?á ðçVÿkQoýkço6|i®ûÞÉÓë^­\<)áá5»9y¯7¥®K[öL@äâ°-9uç8®‚Ä`WœÙª5!]Äuõ«Ðg995NôçëZ0.çØVf¨ÜðÖ ÜýÔŸø×ë_ì'Ïêl@ ±'ß÷M_’Þ\ÝÝ û?ñõ¯Öߨ`cÁŠ÷X¬‡þBcýk ›4ögÓTQEdPQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEVïK²¿`×6\0X•Ž=9ƒðËÃ:—˜eÒa ùù•Á=ÀÎåŠê( *Õÿfÿ jQá"xœžY¸ÇÓù× ®þƺðfž';¼ØÊcÓÎkèê(â¿~Âo4’-´0ν™dPýõƒ^OâoØ^ö(ä”éR,kÕÌ$øâ¿K( w? õÏÙR³$ÃÑã¦Òqùáu_Ù×ÄzhaóïÇ_µ×z}­øQum È\íÆëŒÖÿà jR3Ühöì[¨@P~J@ªRk¨¬»ˆWß üI§ÌKÛ##ùŠÃ»Ðµ[N&ÓæP;ªæ¿jõ_ÙÏÂZ”N2G)è͵€ü0?pºïìo¡ßm§„“œù±”ÇÓÍW;!Â,ü~˜ø:cødcó¦±Y×õ•úyâØKí:ÛÁëÙ•Ôÿ}`þ•äÞ&ý„®bŠI¿²dH׫ùE@üiªÉök¡ðß‚ô‹»§¸’ßtÎrÌ®FïÃ¥j-¸(ª…WÓ:ïìo¨Y–0Ç<î’Gäk‚Ö?f¯éäìióÒ<Õ)Ä\ŒùãÆ¾›^–ìÌi2Œ%m ¯n}i¾ðTÚU½Ñ¿XØÌBy ‡LçÖ½zÿáW‰´æ%ìV\tkãÃÚµ›>›p€z.EU×ryZÒÇâmô+ÏìÛt‚fO›Ë,£¨ü«™Ó<{¯ê?dÓÖò+×…rµŽ0+ÒDd‰QÔôéΡH-CïB¯Œ#ñªärÛsŒ_‡ Ä’Á{@ïŸ*HIÀô¬YøÛH±»¹²¿Žâ8a"8|”V!«¬Îô=k˜Ö¼o«Þ½Ð¡wr…gÖ€±Ðhú­®­›k/™ۃǷjžææ;U;íç:‚¨èúL:š[@ÕêärÌz“Qkgu¬õÙ?ô!LxÜÆN #ÜŒSYO•@j'$" f\œ¢ŸÂ„8cžN+6çA´–ø]Iï±´2±zT ¨é¹~ŒhÜø!f`?Ú aåÊ0p£u¬ßh‡UÓÑa N„Vôâ¹h›wâ1>Òœ)Çd¿BÒrîjÙœ·®Moéý¸®rÓ ƒÒº-<àWô5FÜÁã5v>ÄþµFÓŽƒŽµ¡Ì@<åRhoø\¥\zùCÿCZýpý‡÷¨“œyvxÈÿ¦F¿$<,Úîaÿèb¿]ÿb… àkÐ $Giœž?Õ•…MΊ{3èÚ(¢²,(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š(¢Š¯w§Úß…6ÐÜÎÑ,a±ôÍb_|;ðÞ¥#<úE»ê’+£¢€<»Uý|'©DàC$rŒÛXÃù× ®þÇ:ðfš"NsæÆSLg5ôUñoˆ¿a!s#¬ð\/fWPýõƒ^KâoØBâ(¤—û&DŒu“Ê*ã_¥”Pä»û꛼”¸Œv ÄÖ¸-_öhñ›»Ë.øè$Ž¿lîôû[ð¢æÚ€¹À–0ØõÆkûá׆õ)çÒ-Ø·P€ ü”UÌКOsðçRøKâm?p{/4g¤ç\¾­àíWj¤ö3ÁµÕ÷ˆ÷ƒžƒé_¸¯ìëá=J#ôcµ€ü0?pº÷ìq¡ßmf„“œù±”Ǧ1œÕ)²y"~5M±BóÀ`Pþ£~J«wRùWꇈÿa´Èë½½Âö`êÿ¾°kÈüOû\E“dHˆ½dñªU<‰ök£> *§;O£ :_'8ÚÀŠú‹]ýŽ5;ÞGÚc²±#õ®Výš¼I§Ú ùk?˜æ«Ú"\CÆÌD „–\óŠï5„Þ#Ó‹ 4³(õ†R¿¡ÍswžÕ,›ØÝEÏ,bÞ劾dú’ã%ÐÉRÅOj" Ž "žÊÑY_÷SùKj##׃L‘Œ£Ž¹ª×¹1Î8«ÇdóíU¯ãÝnäÙ GškGþ&w'ÇTãlƺü1©x£ÄÇJ´’òîVÈŽ1œR{zìì¹ñ,AæÅáãt„g΄þDŠM¥¸”[[wi.XWC`ÙaÎ*{<Ð 7ÞÖ AÕ…«:þkš‚ÞÖæÉÕn­g¶#¨š&CúŠi«Œ»ÖÙ´íÆx'+&ÉÕ ‚?:ضÆàWŽœÐYÐxiC\\ñÿ,׿ûb¿^ÿb»)!øm-ÎͶò‹xã9ä•…KèB¿2¿eÿ‡¶~+ØøcQšh-5°¼Ðcz ÙÊçŒñ_³~ðF—ðëÂöZ޶V‹µZR ޼ēøtv®i½ltÁZ7îoÑE (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€ (¢€+Ýéö·áEÍ´7!s´Klg®3Xwÿ<5©HÏq£Û±n¡Aù)ºJ(Ë5_ÙÇÂZ”.2G!è͵€ü0?pš÷ìk¢_mg„“ÞleôÆ3šú:Šø›Äß°œeò­ ¹EÜ…NxÏàŸÊ¼›Ä¿°\ñÅ$ߨò"²™@ükôÊŠü€Öb›èŒ+sÿdçù×;ÿ e¯ÞÎ!û\±ÆÇ´98öæ¿fîm ¼Œ%Ä1΀çlŠgתiJr4Ë0}D þ\ÍuIŸþᆬ–Y-D*øi®î/1Î:÷Ç<+ê[Oµ·Hü©IÀ¨Éúb½Š‘žg¨|ðíÔx…¦…óÉ|8ÇÐüë”Öÿe/P@©-½Êœî[˜pþ…š÷z(ä/þÂz¢ä7‡´‹½Ã%â‰þxS\­ÿíðú²Ÿì ˆÍÓ~E±_|ÑFû>dý›ÿbŸ |ññH·¾›VXöZ¥õÈ‘aÏW |Ø8'ñœúnŠ( …Q@‚Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( ÿÙ endstream endobj 8 0 obj <> stream xœíÝO„dçúð!„ßâB!‹.ár!„B!„KY„!„!dBBaa²Â0 C/š¦iš¦MÓ4M/Š¢(Š¢EQœ_×ôôd&ÓªºÎsžª·>ŸÅýMîTÕóÔy¿¿÷ÔyÏ{ª àoãa¿Ûít:íN§Ûíözý^0ŽÆãì°ðV«ucie·Xeãþr'èÙMVÔ¨×^ú¨®þ5’ S™Älv ;­£ãìdkØÓùjvë¥×ïäZ"“R`ƒöÑÁê&èS•®aÜk¯ÜYüä(0›Q·u|”] eøôÿ ‡#7—vLA/5˜8‰Óá`8šüÇðÉ?œüY¾sÐyœ&êh4šÌXGãOþy<šü9û»¢ ÚG‡‡Ù9T®áé„u’°Ã'©:ž¤ë(û[j1îìgçÌ*:™¢N²ttš«çÈ>4€+»Ç‡4ÍIŠ^ú??ÍQy ‹iÜm9‰ÏurZù_8‹Ñ—¾;¹ Éúã#’ß…sQ1 yN¦ GtEdlPœ~ÛtÅdrPŽA÷øÐÏ «.û(„%5êœÃ PlQ×àžœî›š}X^`4Ìþð‚AçÈ9<çYÌ9é°½w˜ýàÌd1ýåb/>{*û€<ñxûÆìýöÑ oNÏ5å´£ÎéÿÏßÎýP ]‡§Ùãˆ5î¶ö¶³¨Aö`b :Çöd¢ÙŠÕ2îµ\F¢0Ù£ŠÕ1p‰"e,V¸w|èÇ*{xQ<‰§pÙCŒ’&;Ó»ŽDá²Ç¥´(+!{¬Q Q÷hO‚²*²…´O4û¨†&e:Ê1žLA%(+&{ÜQŠAë`o7ûp†Ùct÷w%(«*{ü±ä†íƒÝ{Š°Ê²!K¬s(@AŠr-£“Ý– pCŠ2»þÑž…g²G$KeÔ9 ð¢ìaÉÒèïû^–=4Y£ÎþöÖVö± ‹){|²èúG;Û[Ù‡),°ì1Êu¶7·²QXpÙ•Õ?ÜÝÞÌ>:adVϸ}°³)AaJÙ#–ÅÒ?ÚÝÜÈ>(a©dZÆÉt[‚Â̲‡. ¡¼»%@áZ²‡/ÙÆƒ­ ×–=†ÉÔ?ÞqsÊÇ$·÷·6ײ?(@ö`&Aÿȯ P›ìM³FýÍõõì£J’=ªiNïpgC€BݲG6¶ö¶$(„ÈÞ„ëìl¸Œa²‡8‘Ç;›ëBes‚Œ;û[=Ø Ð?r “=à©×¨µ·év$hRö¨§>Ýým—‘ qÙ#ŸZ Žv7×$(dÈþÌkÜv7dÊÎæÑ;Ø ,;¸¦AkÏRPXÙaÀìFí=KAaad'³él®=Î>h€çd§Sïn¬=Ê>`€Èަ1nïYÈ *;¸Jÿ`[€ÂËÎ.1jíú]vPpîÁ–…e¼lp´³öØe$XÙ‰Á FíÝM K%;6x¦ç–Qvt01lí¬?2…¥”töœÃÃ2ËΕÖ?ÜZ{ô0ûæ’$«jp|r/@¡Ùi²Š:{(”";QVLÿÈ9<&;VVÇèäþáƒìï¨[v¶¬†îÞÆc eÊΗâ ·?¸Ÿý5a²C¦híÝu ¥ËšRõ6ûVAvÚhØÚY{ @aUdGNaº{(¬”ìØ)Çä2Òÿ²¿O iÙÙS„QËRPXYÙ´ô&·sšÂ Ë¡eÖÛß|ô—•L°â²“hIŽ·=0¤èìÆ­]7#ÏdgÒréîm<ü3û+Jv.-ÑÑæ£¿$(ðOÙá´:»(p¾ì€Ztýý“sø{Ùß°¸²Sj·Þ Àå²£jAõö×P` Ùqµ€ÚÛïÝÍþ^€e‘Y cÐ:ÜßßÛ]ð§f^:·Þ{åÆ×ÞúàËïýsm÷°3<ÿïõ6Ü»ûGö7,§fƒ­I{oœSîo¿ÿþ'_Þüá·{·º£É_ÛzÜxÓ‚dg]œŸ³[ ¬„쬋#E&dg]œ_²[ ¬„쬋#E&dg]œß³[ ¬„쬋cÙ'Є쬋ãN  ÙYÇvô@²³.Žšuq¤(Ð„ì¬‹ó »µÀ ¨ NчÙÍVAvÔ²É/;é"­e7XÙIi3»¹À ÈNºHëÙÍV@vÒErFÄËNºHÙÍV@vÒEÚÉn.°²“.Ònvst‘¤(/;é"d7XÙIé8»¹À ÈNºH­ìæ+ ;é"u³› ¬€ì¤‹ÔËn.°²“.Ò »¹@ñJÞ]´ªFÙíÊ—t¡Æd·(^vÐÅú4»½@é²c.ØÇÙýJ—sÁ¤(,;æ‚}”Ý_ tÙ1ì³ìþ¥Ë޹`_f÷(]vÌû"»¿@é²c.ØçÙýÊv¯ôµ^ˆ•rѾÊn0P¸ì”‹&EP²S.š«K@¨ÇÙ)Í\µ–rѾÎî0P¶õ씋öMv‡²md§\´›Ùʶ™rѾÍî0P¶âSôVv‡²me§\4) „ÚÉN¹h?fw([ñ)úSv‡²íe§\4sQ Ô~vÊEû-»Ã@Ù²S.Ú½ìe+>Eïgw(ÛQvÊEs歹rѲ ®rÁ¶² ®“sÁÞËn0P¸nvÌËî/Pº^vÌÅrm VxŠf·(^Ù)ú(»½@ñ†ÙAêìöÅ+:EÙÝŠ÷ó(;é"}™Ý^ x·³ƒ.Tvwò¢6"Âý’t‘<Š÷kvÒEú.»»@ù~ËNºHŸgw(ß줋ôYvwò¢_dw(_Ñ)úUvwòýžt‘þ—Ý] |R`E§¨kô@¸»ÙIÉÍ@¸{ÙIéëìî廟t‘Ü»„{t‘new(_Ñ)úCvwò=ÌNºH?gw(_Ñ)úKvwò=ÊNºH¿ew(ßzvÒEº›Ý] |›ÙIÉC€pE§è_ÙÝÊ·t‘fw(ßVvÒEzÝ] |EÏEew(Ÿ˜ÇNvÒEZËî.P¾½ì¤‹ô8»»@ù²“.’¹(î0;é"mdw(ßQvÒEÚÊî.P¾VvÒEÚÊî.P¾vvÒEÚÉî.P¾NvÒE:Ìî.P¾nvÒE’¢@¸^vÒE:Êî.P¾~vÒEêdw(_Ñ)ÚÍî.P¾AvÒEêgw(_ÑsÑчÙíŠWô\´ú$»½@ñ†ÙAêýìöÅe]() û©ìý(»¿@éngç\,) +Ín1P´‡Ù!îËìE{”ráþ—Ýb hå§èÍìE+?EÍEH³C.ÜWÙ-ж–rá¾Én1P´òç¢Rˆ´žrá¤(©üõ»(i#;äÂYuD’¢ó(?E¿Ën1P´òSôVv‹¢•Ÿ¢?d·(ÚfvÈ…û5»Å@ÑÊOÑ;Ù-ж•ráîf·(ÚvvÈ…»ŸÝb h;Ù!îAv‹¢•Ÿ¢ëÙ-ж—rá¤(é ;äÂd·(Zé)Ú?ÞÉn1P´Ã옋Ôk·ZÙ  w”tQF] 4 Ìíw:ÝìΫá8;ðj7ê´»"hJa)Úo·³[ ¬”VvîÕgØ9>je÷X5¥¤h¿}ÜÊî%°ŠJHÑQ§ÝrähgGà¼ú $êd§à<Æ'ÚÊî °ÚzÙIxmƒv§“Ý=€åLÑqÏy<°–0E.Ç‹£Ÿ‰³µ޲{ð·Av.Î`p|x˜Ý/€-KŠŽ;GG&¡ÀâfÇã4úm ,¨qvB^¥×:nYÑ,¬QvJ^ªë4Xl.î\´·¿½¹•Ý€ËýÙL"Þyÿ×nÜxu}†¥}7»7Wk*EŸ¾ÝÇÓÿ+¿§ö`:÷ã’óo½áÔ;ñ}›Ù€)5•¢[ÏÞqÊaçÛOóº0­¦R´º}öŽ[ÓþƒÌ¾LçAdr>oûì×.ú½ãã£Î³»Fý̾L§±}vÅý÷óþ×ã{ßÝ9½uó`’£ÃnË:Q`4Ÿ¢ß½ð_üúýÏ¿þñø¯ç>Ò°×>¶é°$KÑ{gïøÙ³ÿª»þÓ×_f0·‡M¥èŸgïøá“ì¬ýrK‚ËïQS)úÇÙ;¾_õÖùêóÌ¢jó88€X®Þ¬Ç[W€eœ¢ÿÍ® ÖFlŠŽßÏ. ÔflŠVm³Q hÑ)Z}]!@¤ðý"»B€HSïSw]æ¢@ÑÂSô‡ì "íD§èÙDÚ‹NÑß²+ˆ´¢\ý–Wø\ô~v…‘ö£SôAv…‘ÂSôQv…‘ÂSôVv…‘¢S4»@€P‡añ9~ð¨m* ”.,E“Wͯ¢@ᎣRôÛìʚЊJѲ+hB;*EßË®   a)êQ!ÀJèF¥è§Ù•4!,EíÎ ¬„~TŠþš]@Q)º]@ÂRt”]@†Q)Zý_vi ˆKÑϲKhÀ(,E·²Kh@\ŠÚXãRô»ìâÂ=ˆ Q“Q`„¦èÙÕD{™¢ÕkÙå{š¢›Ùå{š¢Õ­W³ œ¢v¼ ¢Õ²+ˆ´¢f£@ÑâS´z;»F€8ñ)úSvq¤(À<6ãSô·ìâHQ€y4pFÿ{vqHчÙ5ÄiàŒ~=»F€8Ûñ)ê‘Ê@ÁHÑýìâ4¢GÙ5ÄÙOÑVvqöâS´›]#@œýøíg×ç >E=} (Øa)Ú}/»J€(M¤hu;»J€(¤èÙUDiâwÑêÛì*¢42•¢@±Iѯ³«ˆb. 0ã&Rô“ì*¢´šHÑ7²«ˆÒn"E³‹Ói DmÓ ”«Û@Šþ•]$@˜&Rônv‘aúR`M¤èÙE„4¢÷²‹3l Ed fÔ@Š>Ê. LsÑõì"ÂŒHÑ­ì"Â4‘¢{ÙE„i"E²‹ˆò¨‰]Ë® ÊÃB´º™]%@”FRô¿ÙUDi$E_É® ÊãBt?»H€0k ¤è/ÙE„i"E?Î. L)úVv‘aÖãCtäâP®æ¢[Ù5Äi`.úkvq6âSô‹ìâ4¢ïd×g3>E]\ ¶¢GÙ%ÚOQJ¶ž¢¶ÅJ?µ-P²ø¹èkÙ%ŠOÑW³K´¢6Šž¢fWi?:E¿É® RxŠ~˜]!@¤ð}3»B€HÑ)ê=P´ÃèÍ. Tô\´] @¨è¹èzv¡ŽƒSÔŽN@Ù¢Sôvv¡ŽnĦ¨}ñ€²EÏE?Î. T+8Eÿ“] @¨vpо] @¨NpŠÚ£([78EÝ ”-x.:ή VpŠv³ëˆ|Fœ]@¬^lŠzêP¸à]Ë® V?6Eïf×k›¢?g×k›¢ße×k›¢ž£ .8E?Ï® Ö86EmŒ”m-8E?Ì. ÔzlˆVïgj#8Em/ ”m38E_Ï. TtŠþ+»@€P[Á)úJv¡¢S4»>€XR`±)Úÿ,»>€XÛ¡)êWQ t¡)ê¡K@ñv"Sô »:€h»‘)ê¡K@ñö"SÔ@â…¦h?»:€h¡):ή ZhŠZso_ŠÌAŠÌCŠÌã@ŠÌÁ\`R`±gôod—ì04E·³Ë›¢UõAv¡b­*›Ýe;’¢s¢óˆNÑϳ ¢_eªœ¢ßd*:E¿Í. T;8EÊ. TtŠÞÉ. TôýïÙ„ŠNÑÙ„ŠNÑÇÙ„ŠNÑìBE§èVv¡ºÁ)j‡Q l=) 0sQ€yHQ€y8£˜G?8Ew² 5NѽìB ƒSô »@€PR`£àmei+:EÛÙDÚ Ѫ“]!@¤qpŠö²+ˆ´¢Õ0»B€HÛÑsQ) mWŠÌa/8D«Qv…‘­²+ˆ>•¢@Ѥ(À<öNÑïo¿šS(@ˆø}ç…÷û±ZKª BüýÖ ï·Vus ?}a©Óí±Í§è sÏûUõUV©ÃS´ÿÜ»ý~TU®.%‰OÑás1zÏ®Í@aâSôùF7ªþ[yµÔï¨míwgP}šZ-@ÝHѪ{vgÿᎇÙ¥9n"E_ðßì’jÔ|Šº±(IBŠþ_vÍõi7Ÿ¢¯g× PŸ„};»f€útÑß³K¨Qã)Úw(P’¦ÏèÞÌ® NMÏEof P«¦StøQvÅuê6œ¢Uµã‡Q  ͧè?İԚ_éT}œ]3@}zͧ¨G†é7¢í[Ù5Ô§ù½]2@†M‡hÇf$@IšNÑÞÙÔiÔpж¯þHK¤é­6?²ê(Hã)ZUïe× PŸ„µ! Pqó)úcvÍõi>D+«î‚$¤¨½ñ€‚4¢³K¨Qã!:°ì(Iã)jwQ (§èÙÔ©ñ­þÊ. FͧhõIvÍõIHÑVvÍõIHÑ~vÍõIHÑìšê“¢¿g× PŸæC´mÙ=PÆCtçÍì’jÔxо–]1@OÑ»ÙÔ©ñõÄ ( )zä¤(GBŠVÙ5Ô'#Eÿ•]4@mB´ûïì¢j“¢î] Ò|ˆ¶^Í® >‡è‘…N@IOÑ/²+¨Sã):ú4»d€5ž¢Uõà•ì¢j“¢Õÿe P›ŒµÁ(PŽŒ}?»h€Ú$„èÁçÙEÔ&!EÈ® >͇ènvÉ5jE­ºJ’‘¢6$Ê‘‘¢–:åÈHÑÛÙEÔ&#E?Ì. 6 !ú0»f€ú4¢[¶t Òxˆö³+¨Sã)Zy(P’æS´ú#»f€ú$¤hõIvѵÉHÑ¿²‹¨˜GFŠºw (GFŠÞÌ. 6 !zÇZ' ͇èú›Ù5Ô§ù5JÒ|Šþ”]2@šOѪòà% )ú8»h€Úd¤h/»h€Úd¤èFvѵÉHÑ;ÙEÔ&#EÝ»”#!D]\ Ò|ˆ®½–]3@}šOÑϲK¨Qó)ZÝÊ® . zânvÙ5ÉIÑê_ÙuÔ )B¥(P†¼­ÞË®`nGƒ´Ýy#»x€ùõÒRôÛìÒjÐÏ Ñ‡Ù•Ôàx˜¢¿gWP‡nRˆZt¡5ÊJÑjãÃìâæu˜w…þDvõsÚO»´ôÄ;ÙõÌe¯éEƒáø¹ü »sé4¢ÝÓéÃí'“à²0öøªØ«Yûï÷þcTUkî–Y«é­ZϽûZU½ŸU9@ –Û=÷ö¿µ,»–ÙQó!:êf P—Ä5NÃì¢êr±Pt]5@MöS¶Ã“¢@!_mª—]7@=š^mÿT?»n€Z4¾Ú^Š%IÛ ïvvå5HÛܾz3»t€ù%¬¶?óZvísËÜ–ùõìâ敲Ú^Š¥ÈYmÆï¢À’KZmæÝìúæ“´ÚþÌ¿³ë˜KÖjû3³,µæ÷¶ÿ‡Ï³;0‡ã¬[–žù,»×—¸ÚþÌÙ=¸¶ÌÕögnf7àºRWÛŸù>» ×´—ºÚþÌoÙm¸žäÕögîf÷àz’WÛŸ¹ŸÝ€kÉ^mf=»ב¾ÚþÌfv'®!µý™½ìVÌîhŠ>ÕÎîÀÌaµýÏ–ÎB¬¶?3ÌîÀŒr÷¶Iv;f³»«íŸÉîÀldµý3Ùý˜É¢¬¶&»!3Y˜…¢g²0‹… ÑÐ=÷"_X=ù{Û¿$²ÜËQZ-Ðjûg^ ¬w¯¾:°z²ó<‘)º#E:eæyF¼íÖ( >ÝELÑnhÉ›Õ8ôõÕ’˜ç¹ZñF5 }}`µd'æybºa. Ô';0ÏõshɛըúÀ*ÉÌsŦèFô¯À*ÉÌsÝ-y½ªÌEzT‹™¢¿‡½VݼÔ$;/Ïw/´æG®.µÉÎËóÝ ­ù±U÷@]²ãò±)º^lêÔaA­ªû¡eoT–ÝõÈNË‹<­ú$EmGÔ";-/²Zõɽõ¢@²ÃòBÛ¡e¯»ºÔaa­ªvháî£ê‘•—ø4²îMsQ ÙQy™›u;£j‘”—ú5°ð5) Ô!;(/¹bô±ßE:då¥6 _“¢Àüø ýÄn`é'sQëE¹eçäå+TUvÆæ–“—‹Ü.DŠ5ÈŽÉ«–þ°òÃ(0·ì”¼Êkq¥?´§0·ì¼Ò{qµ›‹sËÎÈ«ý7®øû£jÔŠ{y`dgäÕ>¬~½ß P¼ìŒ¼ÚWÕªñqàË+ ;#¯ös`õ}7ÒsÊÎÈ«E>À®ï=0ŸìˆœBäô½jìwQ`Ù 9Þ«qõw«ÊôÀõeät^k@Ûãë€9dÇã”ÞŠë@ÏôÀ²ãqJÅu ãôÀ²ãqJßÄuàHŠ×—ŽÓú)®‡•£Àue‡ãÔÇõ`×v$Àµe‡ãÔw»ß±5pmÙá8µÑ›a=Ø”¢Àõd'ãLâöÆÛô»(p þÔÏ—|Ö‰ sQà:²cqF?†5â±®#;gô0¬k')ù¨f LÙ©8«ã°;é׫ØÞeÊNÅ™½Õ‰“3úÊf÷ÀŒ²3qvawÒOj. Ì&;¯áû¨^LRô(êÅ2e'âu„Ýz’¢Îè™dâµô£¶½ï=0›ì<¼¦‚Úq×ï¢ÀL²Ó𺾠êÇIŠV_L/; ¯ëAP?þ<™‹ú]˜Ö²Ý?ÿ·aУ')Zub^(Qv^_Њѻ#) Ì ; ¯ï— Ž <˜^vÎáà˜–ô=J˜Nuc©S´z?¦-) L);çt+¦+R˜Vv Îiçí®´¤(0ìœ[Ì)ýaU B^(MvÎífH[v=2˜JvÎo#ä*ý¦¹(0ì¬Ã"³n. L!;k²UóZU#^(JvþÕã â^úu) \);þêq/ýCgôÀU²Ã¯6¿4篓Ýx]  ÙáW›µ€æL¶Æ“¢À¥²Ã¯6Íùõäu^(GvöÕ'âI ·O^·ðº@1²£¯F ù¡ò(eà2ÙÉW§Gý‘¢À¥²ƒ¯V¿‹þtòºG¯ ”!;÷êuøïú;4IQsQàÙ±W·€Íñ&)Úªÿedg^ý¾«¿I·N^¶]ÿËËnyŸ<™€F¥(pž2C´:¬¿S7+RΑw1&ßž¼l§þ—–]vÞÅHÑÉÕ¥^ý/ ,¹ì¸ 0iü¹òÈà%Ùi%à™Ç?ÍEçUOþ£PÀ†õ]]^t¡^©¿_) ûÈ‘fi>‰hääñu—=Ïéуý¿?Á¿">!-ÉÅ<6þëK_ym£ýüGØ™H‘”c¹ÞiågÕśݯo·^üæ¢Pˆ”˶ÓË/ª St«õÏÏ E¡ ¶ÖŠNܬ.xèæáø¥ÏðzÌgšÔ||-†iVÆ_Ç)º¾÷r†š‹B š¯…ó«èé5ú—–P=Úžû!Þú@sš®Åöl¤/«—Rt}­sÁ§x+êSMi2¸Ê÷Qý_õG)oì .üÏ}šÕ\l-˜°ë:ŸW/ÌE×vÚ—|Š +\@3š ¬E·ýãçRtmãèÒ!Ea©5X éÛ°®N®Ñ?}”òúæå*EaÉ5‘V‹*îÉN梣' Ù:¸òcØ–Zaµ¨:¯Äµur-iÿÆýÑÕŸãqÜÇ¢…'Õ"»ØØÉ ´½³ßŸêƒüòjà'ņÔÂû,°µ·O^pñâ¦øÒ¶N°”j)¼ØÛ_º3}”¨{¨€PAá´,úWwhfú,Ý÷B? "(œ–FЦxO=žíÃl¼úi€1Ù´<~ íîæŒŸæWûãÁ² I¦e·æ~bwÖónèÇêLK%òý‡³~kïaÉDäÒr ½.¾Ñ›õãHQX2¹´\"O¡ï>œùãHQX*¡´tÎ6G~­öUF¿mÌþq,…¥QÉÐ'žÞ/t»úñãúšÛévîß™ùl~âÃú>¬î8ZRï<ëÆŸÖÔÙ^wTõf¾:ªÆ(‚ÕšEËëç'{€ü8ùãíêèk«=ÅNªå#¨)…–ÞÍOþ}ã›Ó?Þ®c§änUM½ÿÈË>©á¨'‚ ssþ¾¾>>ïaóS«ëW \]ÁS”Ѽ7`¾öÁƒù>Áÿjùrp®ÐŸo¾åN¯þûî¼àËš¾` Z‘S ûóì7ÿÁó€ojû†Pó÷Bݹö~óÿý¥SÃûWç· Ä¨„è%®ùÃä{?¶jyûêý®µ ÷R®3}ïÖÕOJžÎOµÛ@ýjð…š}{’w¾½æJçø9àûjåêünÍØÐwoκ¡ýe~ ùÒ:Õ8ä‹´9[;ÿ·^ë»ß‰ùÒÕ:è ôt6øÅw7?¹z›ºÿ=˜ç¦ùsüüíó«wÔ—ç‹Ó6½qòÇþáÚÝ?ÿ迵òË{ýºßý~S‡p]uûâ<Ý*ïË¿ÿ›ÑñæÝï¿ùìýìCÿæ÷õ,nzÁƒæ`6õü²ô.îÓñæŸ?Ýüß³óüï"ÞþaÖqL+bè—äé)õñÅcp¸~ïöçïÏ}Ëü¹ÖràJ!C¿$§[ÓÝÉzûWËJ‡¥ñæ¤K?¦½ýVòñ\!-–ÆÏ·n~µŸ÷ö;ÙGp¹¼x`*{ÙGp©ìŒà*‡Ù‡p™ìˆàJÇÙÇp‰ì„àj­ìƒ¸DvBpµvöA\,; ˜B7û(.b_ѥлú›’dçÓèg&ÀE²ã© ²àÙéÀt†Ù p¾ìp`Jãì#8Wv60µìC8Wv40µìC8Ov20½ìcx™•¢Ë$ûhΑ Ì û`^– Ìâ•ìÃø§ìX`&R‹ßD—Í¿²àEÙ¡ÀŒ^Ï>b€dg³z;ûž— Ìì½ìcxÆo¢ËèýìÃø[v p d5À3ÙyÀu|›}Øg²ã€ëµ²à©ì8àZFì8•\“Ç×Á"pu~y¦`¥dxêç””=à‰àžPhLöp'ÄØÚ{hHöh'Ȩ³Ÿ}lÁjÈì„é·³.XÙ#HÃ~·},J!Tö8'Üd³§NK˜BˆìNs„)DÈÙ4îi˜fyP†ìMšñhò“iËÒ|˜OöP&Ûx4èw;®+{ ³ ž„©™)Ì.{ð²X„)Ì${Ȳ¨&n²Ì®”=TYtã'ó²TXPÙC”eab çÊš,™‘‰)GÏI>‹/{¬À¥N÷„¦,®ì1S±Ã ‹*{lÀ,ìpÂÂÉp v8aad˜ÇäSëõIÐ?ûcö(€ùYEÓZãêôÙ?ÔÈþú4æxT¦höQƶ1%ÚѰš¤h%E)˜«OÄ9œe7¤(峿>õÛïe×дÉÄ´cbJ=ö„(+Ëz}j°ÛÍ>!ÙdYT×Mù\W'û†ñdYTK–2£ö8ûÐ……≤Ìf²Px‰õúLçx˜}¬Â"»úÄåΊ—p#)¢0ƒ“,íyˆÏ;°PföôêSöðeXm׿Þ'NBÔj{˜×d·([B¯,«í¡&ONòMLWŽÕöP³‘‰éJiYm!ž.1=Èã³ÚbYbZ¸# E¡ ¶„.•ÕöÐ$Ï*)ÎA?û ‚UäêS1< ÞûtìêÓ³Ú€«OKÌj{XvÞ[FVÛâyrS¾%¦ËÂÞö°¨œä/…¶5N°Øœä/¶GNça)<=ÉÏŽ ^²ž}h3x²\ßóHÊZöAÌέO Ä\–Ö“[Ÿdi¶ìã˜Ïi–úÁ4…"ŒŸìe^š`+û»êcQT‚Íìo¨›G;7JŠB¡diC¶³¿i ’;òÃídÇ@&YÚ6/ ±›ýåMŸf©yi½œÑê±ST½œÑÃjrãS]¤(¬2Y:?) Lë·ÝøtMR8eéõ¸F÷ß? ÓÁI˜¶_üÛ½QÃe¤]õ¸§ÖàòŸœè÷ONôŸÄi·o[Q`Ÿ\{:ï÷Ò£îùÑs_d4šú/èÉ>QÏo`zÜu~0«ÉÌ´×ëöúCSK fÿ‹Œ_ endstream endobj 9 0 obj 10864 endobj 4 0 obj <> stream ÿØÿàJFIFÿÛC     ÿÛC   ÿÀOÂ"ÿÄ ÿĵ}!1AQa"q2‘¡#B±ÁRÑð$3br‚ %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyzƒ„…†‡ˆ‰Š’“”•–—˜™š¢£¤¥¦§¨©ª²³´µ¶·¸¹ºÂÃÄÅÆÇÈÉÊÒÓÔÕÖרÙÚáâãäåæçèéêñòóôõö÷øùúÿÄ ÿĵw!1AQaq"2B‘¡±Á #3RðbrÑ $4á%ñ&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz‚ƒ„…†‡ˆ‰Š’“”•–—˜™š¢£¤¥¦§¨©ª²³´µ¶·¸¹ºÂÃÄÅÆÇÈÉÊÒÓÔÕÖרÙÚâãäåæçèéêòóôõö÷øùúÿÚ ?ýS¢Š(¢Š(¢Š(¢“ŸJ†[Ø!Ï™¥‰¨ct”•WWƒ†ÉáEÂÇ­Mâ.!“{üçùU9|u¥Fx‘ßýÔ&¼Ð'#Œþ4ªIb ?½Æ?*W)ßÍñÍxŽ ¤úá­@>#FIÅ‹ãþºð®/¤ÑµÃd³Ó4\vGn¿b=lœ}?Ò”|C¶ïi/æ+ŠH÷`ñšp„Äç±äQrt;Qñ Ðÿˬÿ˜ÿzüB²8Ì3ƒéòŸë\PˆÔ›W¦zÕŒîì;Ã8çû£üißð°´±œ‰øÿ¦ýzáL({dþŸdNO–õ 4;ÏøX:Iî”}Sÿ¯Nÿ„ÿG=guú¡¯;khÈË ÆqÉ}•:Ôu89¤…¡èãÇz; ý¡ñÿ\›ü)ëãm³þ™¬oþædsœPȪ|²0n>RHj¨@û||ûò_².ì}CÒ›$7ôõ [+ÑÏMBΜ¾(Ò¦£nàb¼‚;b²0tP?„«r —ìàpú“@hzðñ–Ý5 ûú)Ã]ÓKûcÿm—ükÇšÙ]FT;€8¦Ž6îõ#$Ð4®{8Ö,[¥í¿á*ÔŸÚV‡þ^aÿ¿ƒükÄšÔ±{ q…Í7ì˜èì? «ãöËsÿ-£?ð!N’/ýõ^ö#»™ºjXḟsÉ =ÀJ§£øŠp óž+Ùq´…ÇR¦fe9ûK&zrq@4{©ÏjJðÀ÷c¥ä£ñ4°Üj9ɽ¹tÃuþt ǹsõ£?xÂjWÑqöéÏü ªOíEpEíÀúJ€±ìy÷µãk¯j ó¨Ýo0Óÿá"Õ×þb7þ@Xö+ÈŠ5~×ÓçßœW ¯¤ÍîÚ¤)Ïç_8ÿÁL®¬ì¼ à·¹eŒJeW “+1ß¡ü+ó²óÆ}­Ìh²ÄbeÜÓ0q´ç§OAY94ìRW?fgøÅfGîo4znÖ¡'ôªrüR½¸[^è9ÿbþ'ú~9_øæÖÊÜOo5–£y÷›]û¬*Œ_Ñ×|ZUÛ©ç廞zÑÌÔý•oø†ïˆõ??ôÂæêÕº—‰¦äÞ±uŽî0?G¯È½7Çßnr£OÔ!ÁåŒÉŒú}êØ_Ü$°Ä°jM(ÝpÏöûü­¸ícõB]?[¼Æö¹“$–pAÿÇ©£AÕ¤ÈûÔ„z)bkò÷QñŒúÑÁww{Ë(u‚)ZVöùO_aY§ãΙbdß®êÖ¦2DŠË2²ŸB;5ZØÕoøFõ\ó¦Þg¯0¶>”jk’tËÏÂÝ~[ézæ¥{áôÖáÕuÓÄVæáodÉ)Ê nÈïÐVï€4Ï|Añ_Ší´-O^¼M6MòlÔåX­!¤³|Ø“B•úÇéZh‘é—¨cnç?¥5ô»¨y{;”Ǭ?¥~oøãSñ¿€f•-üK©ê2ÃW -¦µ9¢~êÛºœÒ¹ø¾=|CY'Dñ&¸ I‘b‘5ÉH–9|Ü€x¢ï°¯æ~Ÿ5ÙÃ%¬Êž­šs[ȧ ƒ¡Fý+ó.–QŸø›aZ”€œâO½Óµ^´ý¢¾$¡ˆø–0ÌU¿âi!ÚF0y=ïÒÆ¬ÒF‹r࣌ÿ²A¥M‰ÆHíd×çEŸí7ñ@˜€ñ—‰cóä@üŒ¹ùyî@Í^´ýª¾+*DWÆ> ÜÑ1$êß0¯ àðNZ.Gèfô#€üqJ$ˆw¨>Äf¿?“ö»ø¯ÿ ޲ÄEæýÈÛ#¸û½}©í«ñbÚFFñ.© [oµk(2ñÀÊryéÖ‹Œý3F@ùöÝM>S¸sã£d+à‘ûiüQPÌuÛ‚R5”“¥Ûƒßîúªñý·þ(Ù‰„š¼ˆ‚³t{~Œ¹È÷íEÀû»z·B1Øç Ð'BNYsÓ–¯íŸñrmQõˆÄÑ*ÂѶ•„FfÞûU´ß·?ÄLÞ}Ζå$UË£ÄcМÖ‹öø¸N›—ó§Çr’œXŽÀ_ÃyxÖâA¡“‚& £¨Ã€óÅ_·ý¿Ñ,ÇþY¶>”ß-Ðe\;õ¯Žâÿ‚€xˆe¿²¼4q'”Û¬\aý>ÿZ¹üXSÍÑ<2á¥X8µ™~sÐ}þ=hæAcë %* *©>‡4ôÊÈ ¸c•Î>•ò?ðQ ‰¼¼h^>eÓY®!¸\ÊÊýþOz×þ ³ª¹ðþ&n>Ëò™ÆéGU?©âŽarŸRÍaç.†s‚H¥€q“_-ø(5š´*þÐ7K9µŒ-Ôùy‡Uu÷5j/ø(.Œè¼?¡º›Ÿ±üº”«™Æ~@6õâŸ0ùO¦%…%B§î÷‚>¿þºH¢Ű’ĸÇô¯±ý§µFÉ/!øX÷Nv­Ä³<ãù|œÔÃö™Ôcž yþ]‹™ÁÙ¾˜;cÚ<®zŽ{QÌ+¸ëÇ=)08Áçé^>¿µJ47·Ã+± icÕ\¤GÑÏ•…>Ʊìÿm¿ Þjé¥Íà«ûk×F“Ê®XF?Œü §Ì=à(Î:w¤dó^\?iÏ ùBWðΰƒòÞ)?ðAûMx(6çÐuÐ=®U€£™Qe |§o¹Ôe<Woaƒ^bjO)Ãèºð_ï c9ý(‡ö¤øy$Á'Ó¼Aoþ5XßÓQÌ…fzs® dö(f\” }5æíûQü.“â4ÿ·Xÿøª¿j_…óßĉõ²ŒÿìÔs ³=%âbFÖÛöA¥#dW—¿íOð³µçˆ—>¶öziý¨¾1çP××ÄÚjãôz.‹=@B’ëÞ“hÎr+Í#ý¥þË*!ÖõhCo“MGך߃⇼K¢\j¾Õιmi:ZÝ… ò”ºŸ›¨!OJNH­€ìsMÎX(u$vï^w/µY\ˆ’Pÿ‚Hüë*ëÅÚ„« 7o‰dòÔ¡¾zcšŸh#Öd•b$¼«ÿh€k:_ÙBO›wÜ6ïÐ ò»‹™åy]Ï}ìM!a´c‚)sŠÇwãÝ:#ˆÞYX“‚ª'ӚιøŽê¸†Ôýé['ò¯>HdýÑ` £±8ç¯~jrØ$g#êTÛÑ]x÷TŸ;eXí€kï[¿»âk¹œåÎ*ƒ€9üi‡­l4…ÎI$ôɨËNOjãŽõ‡o9Í@Å ÆkÔÿgOŸÇÄõ i&~¹åùkÖ?f¥Ýã›’G dÿú¢‰»£éÚ(¢ºÌ‰ÿà¦ÙøvFüM.?õÀ×ç~¡ãïØÜÞÛÝNCÚÎL¾Al;ýߨÏzýÿ‚˜¨>ø|N05iÇ?õîkó Æ³=׈îÅ´w–¢ÑE¼Â8 ÝÔ„”zíÎsÚ²µÝŠz#rOxVYü§xKý¨ÙäÛ@ëÓÏZ–ßľž8=± B‡·eÆÌîíÇCõ¯;:…奪Z ËŸµ$ßaûI´%Ù ‰~˜ã=}kcL¶²Ô´„½¶¸–I‰1”–©Ž%Ø;nÁÉ=sUÊÇ­øÈÇ-ºFa™ŒŠ` øôÅTñè—Ãút~/Ó¤[MWC“Ì·51K»¨‘{Ž>µcáûÇÿÅ …6Å”F§µ3â‰áˆ3ÁÌdc¹æ”[‹º-««3±ðítÚ¦•h×¾ ¶¸£ #Á>ÐO¨{gŠæ¾?ø¦Óã>ƒm¶€4DÓ#šêlH\¼rè}kɾ¿™¥Ú;AÏ@+ÐõG)áí_‚l¦SŽãiâ½ ˜êõ!ìäôôG$0Ôá.tµ<ËÃ÷úž‰m£ÛYÌ´ÖñLÑȹ“^©¤ø¯Ä¾Ô<~<)©¶—w¨:ÚʨåRxŒkº6Çcè{× áß Ï©ižÔxÑVÆ1°äàÔšßdð¯ŒõØ“O“PI¥ó [ÈEõê1\ìt¯3¤˜xši'­%#Ž;u•ÉP¸ùÓ˜Íg ]Û†X,töŽ#å[‰$l½³¬ý¬“Šæï~%Ûë2é–³Ûk>´žPe¿†ØÌÑÆîÆ <Ž tZMï‚´«™eÿ…Ÿâ+””ßøUÝGþ?ÁÀ¨w[”•ö)i³E¨ëÍa6œb´1=’íc•d#,ÙÎì€ßNjéðÍýÌŠ’X[¢L<‹’—lHHòÝ}8϶kPxŸÁBV’?ˆq$Œ0LÞ”1ãÔ=Å^’@±|MÑrF6ÍáË¥9çÑë.v·Eò£Âº•úºÝiñÆn°× ÖS ýÞß÷¸ÉúÒ·„õ ÷Èús$— ·rïò#3µý–ÀÏÖµc×4 F⟄Ž›I½Oä}êuÔôÖʯÄÿÏá½LéT¦.C)ü5{#‡:TžU½ /àõcýž:Öf¥¦Üèq ûÍ?PŠÚÚo¶$‹v=Ãá|ƒê¹=k°ÓþNµÝ'ó^*ÑЮõKw…üQðæòWcGý¹*äz`¥'Q³g áË—Ô-ÃÕÕÝœ¯,vöóÞ©l4d· ®= i®}hªb²Õn±fLJž¯Õ>«ŸÒº7Àzš·Ø/| .á‚Ñø« @è2ÉúV”~ ñtØX­|3sÀ EâÈ?ï (UÜ9æŸ}b›]fa”\?hGïõOzrZßX¢o‹W-×È…í(ÿvAþîkÔÇÁoŒ §¥ü_fŸNeóö×Y…àdþð“¡N+Ž_†_´ ëÊúO­5;Hت›{¸å`?ºJ>3Š¥R=ÅÊÎtG{Q)Õä/Ù¥+oŸ8»7¾ßSQ^jgG¶ioﵿc1¼M̼”•Ku ×'¦+ÐÓÁÿm\Csà R ¡dŒßÚ«)î6´€Ÿ^Õ¯ü3ñ߈­â‚÷áæº¦&G$sÚ¹B8ã÷œ‚ î*\âö)ËÁyúU– 5;©a¹ì³¬vÞiY¹)1#‚9þbæìÁg"ÜÍ8•Ü[I!±ÜEÎNÙ±Üp>nØ®‡Eð'ü7gö+o‡Þ"Us–Â@KãŒ`IÀ°­c£xþ0VOx¤‡PˆÙœ= HYçTxÎ.µ9"Òì6œFëñ÷'ú{ýjuÕ·)IµMîßg˜›1~1¶N8ëõ®úH‡ÜÑ%s7¼S²Aµ‹hRžn?>d·81ªãâÿM!È‚plˆ#PÚãЙ÷­-ÒïÄ“IÒï%Qþ‘VÙe¾Ã(Ç óÈà×Q>¯«|þwƒüF¥€ÝæhÿëïIiâ²\J×þÖä·ž·šÑî gV\pÊž‡¨æ“–—CQWÔúŸá—ñþÏÚ\0K4Ä~!‹Î‚9ÄF8A× Ðy„w<×¼x– xx§Ã‘ém|“¶¸òN.&™­|¯œÛ€r°î#®kói~& Vr©­ZD6Ÿ-­/0¡Fd§$O4³üq];ý*MGVóáS´Æ³‰ž¡r½xéëUé¨8ö>ìø›umÿ ›ÆçÁ±ËæßM£©… „Šl™Tç Wžµñ÷ÃÝOÀÚÅkVñ¹¼_°øudÓV 4O cÄœôû f£ÅwßÙî«s½Ôj%Ì H½·ÿCÞ¼ŸÇ&+êñ¢¥ÀþÉ·V@ücBW§Ò®ä¥­üpÓµtÖ¼B¶BßH²Š)^ÎÖ`Åq…ôëžx«¶>>Óµ+n¾Ï{ Ï‘TÂÎv‘ê¼f¼ƒÅ6––?üqqkl–1Ë*°ÆÌʃpùwOLûW°|ð½Ç‰üiå\‹Sic†IAòÀÛüXä~ŠMj Tð•iòœ†L½»éK5ôEAÅ"‘VT'Lõ¬}wU›LH‘˜g›É‘þðõUVH¥È–äÞXÉ>´¬±”\3ˆQæ1ýñnÛõÛœU—™Êèÿ»õ¯ñ†±©üñeì³êú…Õž£"²Aa!Œ¢‘À#¾®Š?Ënš¨‘üHWN1‡aÈ¿¦~èúõíO”/c¼¸Ôå„Úméç´cŸA÷ª¼zæé–3§ß!møÀèyž:Ô—Ÿ,§ŽþÒçRÖ#´[‰³h hÛoÊ;çæÝhå±W7_]‚&ÁŽàg¦#àþ¼þ5õ/ìÁuoyðcÄòBÈ5è•·©RÙÉüzŸÆ¾0Ð¤ð†µ¨Á¤Äú„²ÝÛ­ÆÉ‘Ñv‘зföõ¯²¿f2ß@ø-â}*ÅZ++oF"˜¶ÝÖ¡'“ÉÍKV&úª²61U–ÜD6‡,8ïÏ?­ZèIíQÉú~µWœü¦ŒñïCr9çëL&‹ØHGR:TLÀö§;~&¢cVÄTlÔ3TlÔ×ÇqÎ*9¤ ;µA9j5,.¤$e0&‡ýäeAà‚ d¡˜K 8èê¨ì?³"ñ–¢ã¢Ù¾îµãJ¢4Uôô¯iý—>ë-ž÷óøUGâB{IþtS¨®³3âßø)¨Çƒþ7¦³/þ“½~axò{¹uÙ]ìæ&Ê?"×ÊŸ`¹òñê¹Î}«ôûþ j3࿇üôÖä?ù.õùyñ ]®¶Zá,œˆñ§¬ìAhÈýòŸø aY¯ˆ®‡?1Œà_ùJ¿ÙѺܩßlý£ëž3ÓJ[Ÿ·|°ê\³”gEå$?ïþµ£eâ¿_ÇäÏ` µò G-­Ò°xR§îª‘ŒuÏÒ¬ø~ÙÈܼP¤·ih¦, kþ­‡±_έù‚=+À-CÁ9ÅWø¤~ø€’Hù ç¨çгàV-¡Å»U_ŠD²ñ9Îà{f³4¶‡˜|*pÚU™ÁQ債躴…¼;«(á¾Ç63Óîšó…²)Ó-’?vȯHÔÔÉ¡j€àÙÌ=¾í[ܘì_øká ÍKá÷‡®â¹µX¤³FUypÝNxü+•Ò6EñGĤª’¬6³ ‘Â…hø$ž ÒßËt³ŒÆ ’ç§·™¦b_Š>(ÀOî¥rÓSN\Һ饿áͦàÔyU»êWŸâF­oªÞY·‡×݈Q¤p¥âç2sÛéÍ4üR½[”GðÔ…d¾6àÆÁ‰Þ{~•ðÍÖµâË»Ïéo%¢±´¶šÖ`ä09b3ÏjµmàÜÛ4šf·lâÑôÓ,wJp2J¸ôVàzÖ×K¡›7¼âTñ}„÷m¥½€Šv‡lñ¿Ä8éúVÛÚ[0Á¶€œçýXæ³<)rE¶…l/tä¶_³ˆ¯°\…‘ޫӓɭw<ç¿°¢ýŠµŠ¿Ùt¹-ajwuÌ TcÂú4¹i6€Lc¥t’\ø}t 6á!¾K¸®^NáîU"ÿoiÆ;œU„…ñ"K†18Ṳ́yk“ÌŸÝ=¥K’]AY茟øB¼8À¢Y–õÙÍcøŸDð?„¬WPÕ4è,áy^b+˜ò8ÝMupÜ`ŒœœdŒŒž‡§aX¾àÄ’I¸ °î{W?ñ^C Ï‚ä$€u”;»}ßåWoLrüJØYm¡è^¦Û\ѶQñ¶­àMkÄš¾¡â[»‹½n-²ÞÜ\\Je|œu“Û•BK…À^¥Î‚Ö4yofÆÜ|Üœ‘\÷Ä}VÖçÅÓGd f 5[qe曽Älíc¯jÁd¼Ó4¸¯5]bÊ[XG©DÖÙ’t|rJŒž0zÕ¥¦¤¹;ž§¦øÁ:ÅìöÖ·òÏlªÒ$Z”Ù À`ýîœÖ¯ü*$01j:êö5Y†?ñêçþ ÞÙ]6¥g=Ä~'PÝ\Á @ðyc>ÜqJõ=†>ðOZ–†®qÿð­¡„‰ ø†++uDaëó× |Kù|m•å­œ>U±•§‘‘€ùT‘íÐ×ûKicOø9¬sâG‰vÄr~÷_νOöq¼ºˆyÞ|¶P¢ù ?/9'€?ZÎ#RÐØ©ÁÂ\²ZžwãIMB̰Pæõ‰ Âçž úÔ£÷Žpsžz}*¿Œäs«Z«¶¾F8ÎMH2(S‘éZOý§d âÍ, À|‹û¾§(z{ó\Õ„’h°Ç$’kr&Š |¹b^‡¿Ý÷ϵlþÓóñ†û§œ‚ÇÚq³·¡Ç5 Z]‚(­5yN” ´/öê9 ýæ}½²=qZ/†æN×#ûuΆ@—SÖ&‹@a-Ø{`~פmN»ŸâÈlt®–úþ]1P^þ94à—w'ìÅŒð¶ßÝŸnO“éVôÏ…÷v¿ÙFßV¾´ÆvX¥™GÚƒsµ½;Žr+V–ÿ×Çu6´ãFo¶ÌÞH"ê6eWÐ\Œn8 óáŒã›\6¡pÚ†¥<îÒä[y`[·!IìÀ=+í¯ÙÜîøUâìðO‰cךWÂßüC¶¿.‡?Ûï¯/!ö÷—VÁQ0Vg¨àôÎ21_sþμ|&ñCcåo‘ø‹H¿ÄÔKaô;òœ~µ ‡ŸzÀ ÄóUœÖVµBæžç¯µC!RÜÉüê'oœÍïQIÈë@ g¦3ÔL_Ï$1#©|ÿ*×8¤˜çÿÕL2g¨ÏãQ³í’@äÓRPê‚2µ++’3uÏ·¥{wì±óxY'¯ÙWÿBᥰx¯pý•>맸µÿCÿëUGâ +#éj(¢ºÌO‹¿à¦£þ(g㌟ñï%~aüD´º]_h¿e’ñ3b~ϼ[m¼ìr=ëõþ l™ø}àFþî¼Gço-~`øçNGÖ#ží›PP“%Y•Á^;nÆ8ÇZÍ|L¾–8¸ W$ɰGo*4°Fö8)f¤ùÐôîyÇ=ù®¯ÃŒfû3ÍÀÆаõcÜŽeDeo6âtÔã2ƒz¶ÙRC&A€zoÆqÆxàÓR{ó§RâãPز›µ€@¥¶0¸Çªç<ã5£ÔKMið;7ö •Îy ÓÿÕU¾*d|7×}ÕHüÔß Ø·†-÷4Œ –eÚÇ>£±æ£øªAø{­ ùG§zË©¡ä¿ É}*бÕé·?>©¯­¤ÃÓø+ÌþÚu¨Î0¼}3^Ÿpé:€ê~É)ãýÃT÷%lTøy´þÑÞ[“¢ÝvÅå¯~ÕÏ&«.›ñ'[œ[IvnDÀAE?w©­_àø/DÏO³¦MI èV:׎¼Q-Ü ÒÅ<*²Ç!I2.B°éYÇwržËBGǯ¤7ÞÖmÎQæµÚ[žÞµ>ŸãÝ?R€H–÷Èù­˜àëW¾1h~ðoÅŸx6ÛNÖu[M%a’«ÝL±)$1¿s×.zvª–~ µ‚0`Ñî#æ+ày<ÿxsUd$Û'>6ÒTÓË<.ð§§Œ´ÉЛwk²¼0H*æ|egq¡-ª[iÚ§›3>JÞ0o˜ú×+l56ukë_Ì€’¦9£ ËŸÆ‹\W=ãÅ0<Áä]$“Î1äìY8ùÇ£eTäzUȾ$ÞCe{k÷B í¦éY7yåOs“\Z_évæ ÚwŒÎýÜ,?Zlž6ÒìQÌZ~½«R{uÉ÷àúÖr§/y&²wGa‹â0‹~‰æy§tGq8¯§ÅY:õ•èX'n²â)b,»¤rxÍr?"¬Q[K,ŒÕe*Oû?Z³sñÔx_Ä>Ôo´+›;:ò;衸”È‘ƒÆ@9ëZÓIÉ'°¤ìެMg ÎϤÞFÈÿd!ٱÎN8æ¡Yt;IÚå4È-ç3†• 1±“¦òG|qÍvGþ 8š…ÉÂYûÇ^2{ó”ý+Ÿñ—íݦøÛÁºÎŽ| g—ð5ºÜÃub'Œ 8ã­z’Âá¹[]}%ZµÒpüN⦻¡„ R¤¡5¥k‚Em´©Å9&žEŠ -LJìÀÙé^Gájþ,¼Ò5Ô6ñiÐÜ&¹°u=JwéŽ+ÕüKàë­OÅÐ_\êz|‚5[ÎÞRLàô½½+ÊjÍ#º÷;Èî´ø$,’Ú¬í€òMÄ~§÷²Òµ1–ÖÖáæJY·¨<ëŒæ¼³Å ÑA§i>³Ú¥|Ë}AÉsëÉàÖf“à-G@KÙç‡L’ »°nå&0=6°É4ì;žÛkegasqqokD’ÄYÀŽ£%ÅЊ#$ލŠpK_8\xÒ+`…´ÌI!Õ'‡¿< ØÑµ WX8±ÑâW\ßkáЃê½¸&i:Í¢Œ›˜8ûâý¯m Èž0:pÃç–¾ñ…ÜhãÃÖ.˜É+«[ò?:Yü9¯Z"}«Ã.“¸Ãsãö[šZŽéñÕC7ÊÊ@醭ÙjÈœ’ç­yt¶vŽ¢ïH½‰Çú¶?ÈóøVÄ/𥩠¾]CuµÄm»[ÉJÍæ)íèIüj;ï¾¾M@'Ûã7wkvÁ'à2çìsÔò3Åtÿ¾!|¶±ñüA½»Žéµýœ¯ÀÛÊ^›G÷·y®Ùþ"þË×\Eâim‰ëºk…ÇýôµéÓÁʤ”â¯æqO¡'VþGà¯èþ ×µ]GN’çÎÔä (¸›r€ 8§'©®?á•À¼| xÏ œõü«[ã§< ia¢Ið¿ÅrjR<’}¶##JÈ0G?Jàÿg uKÿ‰^"¿ÕÑ¡¹¼…&vdÀpO…rU¥ì¤ã&»jtSŸ=šV¿sÔÿiTŽ/…ºÊ[¹–!%¸ßÀÉÝ]ÏÃ_êÑ [Ë«H£\rT÷Ocï^}ûHùq|*Ô2™U® •ÛÎîœ×G¡’º=€Î@·OýW4~sY|E?JÓêšt„2\I!³Ž ëß­X‰°ã8ê*§ˆFýCKðϿݫ1Æ2ƒÐj˜ý¤%i¼qf<†”“µ£ ·+°sÛŠ×ðNššrÅVL ´ýÕ£ý§› KûõíÀ¬oÚIöøþÓlqËÛÒv˜ö Äœð:ûÖÇ‚DK‹kK*~Ä#¹Ýæ[y#¿9äàûVŸdÏí3½‚0"‘•‡ûÊO§øV¼É4h5ÓϤ:É 6톕3ѽF>§Ú­Â#†DC ÈŒ y çÃKÅ7³izA’ÖÒk»ˆÊ¼6ÑMµ¦ç:žøÔ—¸Ÿ u•Óõ)t(¬oöMÛþÕvCl.lÏnN> ð+íßÙÕü)Íuû7‹&•¬?ã_ |{½S¾Ð#Ó/¿³Y~ßý¡u7˜¢F ˜ýSõ æ¾çýTÿÂÕŒnñeÑÿÉh*e°ŽÆnõUñéV%a3Éü…UqïP2»óº¡‘³Oº™-¢.äÎ=OOçP½@µA!<ÔŽO­DçŠL —÷ÖÚY±ƒ8'¯ÿ^†8ë×úÖ7ŽÜ j8-¸„\ƒ‚á[l¬©¤kÇòí¦l•䃌â¨è7Ow iÓÉÄ’[FÌ=Êñ«sâH䌖Ã)N:à÷ýjµ¥¼z}œ¨Ä¤,JORÆ~¸‹Œàw¯xý“T6«â=D1.àGξ~gô/ìŽsqâ>9 ?÷Õ\>!Mh}!EWQ‰ñ§üÝGü+?±ç _ý%~`øßL³¼Õ¥1E ¼ñ…ÔYå*È£”aøíæ¿P¿à¦«ÿ»Á¬Nñ gþüË_œzšÅ6¤P VEÄ„Æ>pzsߎÌÑlyËèWkÜXÄóÈ|ùžÞä®.#Ï”„Qߟ£ ëÌeMðȬu,%ÙÃÎØ »ß9í^­á} _ßY#D'•îz¨ IŸÇõ¯Qo Ú»£¥½òA´\,NrÞí»·'\Â<ïáÖôðͨtt/̮ۙy÷9¥øŸ†ø}­óü‹Ç©ÏJÑÑ-Þæ #YÝT8ÃcqëéÅUñüŽž ÔäŠ?2EhÊ .Á†¸à –Yå? 4‹ýZÆÒ:Í®î\1#m!Te=÷¯RÔ|?©ÙøJ}Zk)b°žÖEŽå—ä-´ñžçŒWðóûsZ¸q´°ê·2É#ÛZ~é£`>p¤ôêQ^‘­ØxŽ/†ßh½{¥ðëC*ZE,£Ë µ¾ê÷äi_Þf“ö’WV]:œ_Û§‹ÀºR¨VÚ`Ã$|ƯxE±ãîê'·<Ž~ટ lþÕà-!ÅŬE-†VyB1äôé<5v‘øïÅêXÜàsÆÁÒ’³m#¡§£f‡í(ÿ†§ñlDï“û2ÎBÝ ¤#üæºËT) |ÃÊ^Š}_νKø}àoŠ?5¹üKuogÆ™MN;øàód[xUPÈä®2ÀÁãkдßÙ“À·ñÄ ñ¤±’ÛÊÕíQ0TŒ—mÁx‰5[¤$¬|•ñ ³q¦9ùÎNAíU¬½Ggã&™?‚¼D4»ûmCP½´–H˜é®—1 `çrðAr œ×!¦xŸW•ˆ‡Áþ ˜(ÈÛh ?‘¤“k@½·;è¤É&µ´Öýàç=p+Ï¿á.Ö-á'‚•ÙiŸ´ž“i[T· 93BT*òŸŠŸt¿øjVÚÆ—gX’Ö{c(.eÀãŒf¶¦ù[ºèLÝÖŒà-e›Reu}=œ‘þ¾5Ì֪隔1ɪÅi£=¢æ1J†?/¯\ŸÎ®E{¦ÇO6¯¤_¢®Ó Õ«F=øÉ«êV6wÓ¬6V^7 ÷Ö9Øï'~è瞔۹;Íá}7R±ÐtçÔü9‹2Ë^Úm®<1wCס¬ÏÚ5£šÇè©ÂšŠžyÉýØÈ]ÿw`ŒŠÞø‰à+¯Ë¥Aos Þí.˜]²ưÙêhõF§ƒô{§_±¶ô¢hPðÓ¥O­èšsé·£ìVày-÷aµz™û:üNÐæ“NŸÂSÏu$æ@–÷Øw×—ž¼×7ã¿ ëžµ{m[G¹Ó®n­ Ä1NÊ ±œËÏLŒT²ÖÇ‹ižÐ/ S>‘jç¸==«b?†þuÁÒâ F1“ƒõ¤ÒæªN­ àö둚ܴ½¶~— ä†ãj‰Ð§Âß O¾•÷Ö¡¨DÖR²Í6?|ß­|¬Êš‡Š5]B)u«X®gycȶFO±çƒ[E+_©œˆ¦ÔDö¸ê©n0‚X6–P9üjm6]:þx–÷ľVéÕL²ÁÂ&2O¹ÈÅiC©Kg |Cdàr`Ô,núgÓŽõcGÔgñóÁkoáÝNi×÷qºµ·”AÆàKs냜Ð%Ø÷-É—Çþ1Ý麪Gì·6„dï ÜÖ³|Šß>!¾cËLŽëÓÓéZ^k†ø…á±rt©žÞ ÕßKM¦6Ú¹ó~Q{c5“ðíËügø‚ääy©œóž+>憷í‡øOy–;ݸ6sóŠë4~4› xÄ?ñÑ\—í'ðâyƒß[Š;n×W§ºÿgÛvm‰NXÆÑþsI6Ö£v¾…y³©iƒÞCúUÛU&d2+#UÔ­¯µ-1à•eP$;c¿Ô}+ZÝKJ˜dqIII]Mn|ñûFÈGÄkr)s r‚=ª>ØãŽ}*Ž—¨Ág"6›.ƒ ‘ƒ-‹K#/›eó2B6“†ù¸j±ûANÃâTn$Ž1g”È›ŒÜ1ƒÛŒw¬›i‚1ò5=¦eûU¯fWËÓ°þdD•À=¶òxl75ºIÇS'ñõ¿‹î¥ó%³‡I¼vý柺è)žÜnóž…qßç­s×څΫ¨­ýµñ´K¤¯7\â\ËíÏA·ïSi³i÷m¶:©*»iq22lµ!ƒ«g¡Èèç# ƒT´­ɺ÷M³Ðe·³ù´o.ç†b%ܬێ9?>íR¬>§¦|'šêgÓ­ôàš _=.Öq(óÞMÃŽG×Ûÿ³«“ð*ô±Á>+½çé¾ø? ÝŒ×XÙÚGá]¢[{˜&.^~7àžHÈ#§ï_müb?géÝOü$º“zò#‹ŸÒ²‘}®Öñ/¬âž1û©W*[©¦=PðŒïqáy ³Éi1•?:¾æ¤ ­}ÊénF21ƒÏñŠšB7f­l÷–M2£—F' À`xü©dnIõ¨¼É¨dl t™Éüj9Áê*@«{wQ¦Ex‰ Мð:d’3O\æ©x–ù4ý-¥pÄcŒëËã?NjÔä«°ÎpHÏã@Ò¹WP¸ÖW—cŸq¢·ŸÏ¶‚]Û„‘«†éœ€­C­‡ŸEÔ#ˆ3ÈÐHRvô÷¦ØÆÑiÖHÙ –ñ©± þT†Ùd·Ò¾ŽýÆSÄâ„~_6³{×ÒŸ±ð&ÇÄÍŽ<èGþ:ßãZCâ%ì}E éEuÿÁLÓþ-…‚JøŠǼ2׿O‹u‹›+÷ÙÜH-â#FF'-€FOB3šý9ÿ‚˜|ðÙ-ÿ ¸¿º—Šü´ø†/ßQ€-½¤«§‰&1´³ÿžFÜžÝ:úçmKÙ4ïÜé<±< A a,±nù›@wqWGÆo,ø7Qïý”‡Ò¤T2ÿså~!<ü£¡ï^n¶›J¦™d’¥º‘n°j,¢Oõíí°ñÇãšÒÑb—DÔbKç‡ a“t® C$OŽÃ$Nj¬‘7=‡ÁwÏ¥-Ô¤y³1w©U ž@ ’}rißn/êrÄvÍG˜t`ræ*¯ .elå‡<·SR|E\ü;ÖÀ'!Ö³5KKœwÁëox²àGaç\ëŒó±ˆˆÜ¶>b è1ƽ;ÄŠ“á¹Óµ8¯‡‡Är5«]@vPÃjIŒœñÎMxŸÂ}~úÇKµk{Û‹fÇË,Rmt=8=†8Åz]Ö©yw¡Ïi%åÝÅ´vò”¶–vtiä)8œäW:e^NVä²·{õ¿–Ö.Ô}šqOŸ¯fº~§?ðéð>†IòàžOå\÷†t‹/x‡Å—Zª³Ëovª&Žf‹ ñm##×5Õ|,¿žÓãG(žÓÊÞã%>n£ßµax¸Ö|aÚn”F}y÷é])¾i\ÍÚȲ¿ ¼-®Z¤ÇNºKe?#4ÒÆsÈÏPpyïTn~øBÅãÌš„2¹ùc†òF®8õí>?´×ÚMæ¤Öˆ³X(†&b˜ùrÍ»¡Î8 ñTþZÝÚxžþëK²¶Ônî¬Yon„KQãÁíâH§vM{ð‡JHPO\X“UoKëÐ}+—×ü/…ä˯ëö– ÏŸÓ3Ù“€èJŽÝkØâÔç±Ó¤¼»¹f`WMØ9<Øvü+Ÿñ$ÖÚV‹§êÍe-ì¶Óβ[F¹.¾Bž·¯4)°qLòÉîõ i­§ñ–­jöȳ\©NÛ"m»yb]AAÓ?{ЗÄzÄLþouA;µûºÃ¼~ìýßœ6F@û¹ç¹®ÓÊŠÂ0·ŒúŠØÆ᥀1ºŽf3ž«=ÐŽ}2ȉmî„2G·Lº–KPÞ|ÎÃ1ÏU\Ž`ּə$s?Ûz¸ |a,SDë‹<ÊþT‡8Fõ-ƒ‚¹Äb’âm]¦Âx®‘eå1ŸŸ?êÛž_®È>µ§â›[D¸ìâˆLlo ¶AÌ÷j¤$8rN1¸`ç'µŠu7Óh÷$¡'ŒÛº 5’­¹@ÂãŒ.z­OThíµ«–|j:Mßï< $†"ÌÝãÆï¾?»úÕ Ï ëjƒD¹9Àh¡œvOÌøŠÖam#=­—‡HWýÔq‡5À“Œ¯OÊxªQiÖ¢tm:×GrKfé{̨™H,2Àà`šW¾Á·CKHÄ:&†–6Z-”sG(“í°Ü͆;'Ëå[ÐÈïŠê‡ÄOA"K&‰§3C(a–r ŽTçºäÆ«Zø#H·M º“k+Ím¶å€0¿ú×÷Ç#½M%—€4­:M<ÛEt‰g$‰ KÂq™Ý/¿^ƒÖ¡Ù—ve¶ý»>0[ûƒü/p1Rùv©B>îH^ é‘\ÿÅÚ÷^ø­ ¶›â‡v6ÂZ%ºÓ^8] ©[9ÈPFMyäZø8èséjW3ZÜýŽ(ïz˜$<ÌBŽ@Î~^|Wg¢x—íÑ!‹X”ÜNUÕ1¤A‚LÃø3œ€zàsQ&“W-jx8ƒL÷ ^Ë&ï)¼ÍE«àb†ÀéÔúV•ž§ Û3¼ž Ô€˜˜ä1k2)8<©ëƒÇN¸¯Y¾²ñ2‰ Ö®^yT[ÛÆâ_!OúRúǹÛÖ¤¾Ui„“Ú^Ÿ´”‘V%4°!/v8á[8ÏPVŸ9<‡˜¶½á³Âá/Æ#CzÓ`¤r=AàóQA¬øJ6-‡âëG#y-¨$œzò?Ï¥z†£kw#‚tß³ À.a_ìPøž%-%ÐÀáõZ­$Ì„ØÚB'–)cvÒÈåifã#/ôRUùO6—Ä4ë‘yâ‹`ÌUfÓ ÈúÕ /ÙA;=¶¿¯Û–çÛFãê9à{Šõ/²ZÉl±Ò„—WB[YE´‰ÚTîsï¦~\ñL‚2îVZDòÍvÏ *!¹áÚ6$ÿ«)“ŽW;}M aÊyÝ׉LŸh'Åä¼À.,W î`ð:uâ±ç×"ºDŽ[ýT+"ÓÀbb8àöœd~5뉧hQ8·Ó´¹KÜ lÌWÎLJæÏðmÜØ}ÑÜÓfð·…î­çXm­V¸2Y˜5! ip1nF>ëÀ/|{ÓRî ¾×´¤ñÖ‰$“ø~Ý~Ï7–t‹¤ØÔÊÉÀç=÷¤øXŸløµã׃7IãØc ‚1úŠï<ð›Â^$ðäú–¹à"ÇQŠ+ØÇnûˆúƒÍyÁ]6Çž9²‚á‚Úá"D‰p LóÞ›ÖíßS¦ý¢ãšßáàŠttc¨[Œ2ãø«Ð!Ö$ŸÀçÃ×6VI¦ÞÂÞ- @c’ý{W›~ÑÂl ÎíJÛ¯?Ä+Õõ¦·ðƽ©·ÝnbmApeŒññïÓ­.š”÷Ðã5a®£ðÖÓÙ]ÛéPIo ö±lfQŒÞõ÷«°dÜ'<–Îǧ¾•y¢Ùcß©­ëWhBÇõˆ¡O MS¥-_Þîÿʽ\Köµ¾'úhøÍ0‹â[JKb-ò±UÜJ ¹ïéƒ[ž´‹RhÄw+3ʾ|m’†[vÏîºp¸=Ëï\Æ™ŸþY‘äÛ³Î~Ê2î—ÛõúWOàÙi’yw7Zš¼ÑÿiumÕr¹éžØÕØÓJæWÔõM+áUë$ï§[ éÚ{¸gµ·ŽG íQÓñ;“Ö¤Še¹Ž9Àu Žã¥FýI¨$«pþZƒ´·!q×ñýj¼œ5v"ÙJ±SæÇÈôÝÓò¤•¾cÏzw¸œÕwb^Õ4§Ž•RY1Û­@þ*±ŸTÓ£‚Üëu „gPàŸåVç<ŽG±?­=Û‚sÍUsùR)! ÎzÔLxÓµ9ˆÉüj­ÜÆ8òNà? b±!lŸlt¯§cõ?Ø~"|pnbøé¯—œ•$žÙ¯©ÿcèÈð®ºÙÈ7Š?$ÿëÕÃâ%ì}:Q@t͹™ò'üÉ3ðGÃÏ»âK_NñË_–_£¼[ëg7vþT¸ŠÅf·/å\Œ|ÙÇCÈç#Ú¿Tÿà¥ü|јô#´çÓ÷r×åwÄäS%Íè7©öQ³gìù#ã±ãúÔý¢ºðªøfãJ´·²ÔlF¡)pðm1™_£ªÁc’sŽƒ‘Ågj¾Œk2ØÜÁk¢)FæÜ°“¼¸sšåÃ]Þ° &¥i,íåÂÆÕXÂÑ/ï#ó1ÛuzÓÝZ›™¤˜‰z‰àÚÉ~áöã5o@G x ¶Ð¢‰ ¡e ’xÏsߎõ7Äoù'zàæ>ß'‚Xc¦~a¹‡ ž”|?Ö°ýß×Ú³±¢Øñ¿…Å›IµvBdôäש3îÓî€%O‘' ã)¯-øXÅ´ûBÿxƒ‘é^¤qö;‘ÛÈ“ÿA5r܈ìgü-¶–çÁTˆð_vY äçžMdø_x¬NV"×HËæ8çŸÿU[øuƒàç?ºlg¯Þ5V "ÏŠ­ä¥ƒ[Å Ž1Êî)Õ—¿ëP“»»+¶‡ Ýø‰õ˜ ëxmãòáýâ‹‘Çøë×Þ¬hZôúÓÝÛy+FcÄÑïR§¾~ùê5ÌøƒIŸÄ0ªKu¸Œ|¦;(”© 3ø×!l·šm¡X®.ƒÍx!ÚÖÊÀ1¸îžxúÓhB9$sJå|G«_i÷°>_\Ã+ºÚ†*]Ì ÷á[ZåáñëEQ:·Ä—:xàF>`ÛXuêx浦C}j—7«o9Ùö‚lá¶í8+ðØ-ÀÏímXs&e&¡y¥ºGca}s”ROlædýóH{ùNYI'<°ÛéV$º»Ò¬ÃK+˜¬í d/:ÉÏ<|¬„’Hä ÖÆ—á« ôhõIí­-­cxÒl³¥nñ·9çéVm´÷¶2ÛØ-«ÛAj× ±¬¥ƒ*îaƒ’W©ÈÉž”ÛŽq仼²”Ïu*Áj«dòÉå´ÉÑ$ Xü˹OÍÉÛÁ*¤šf§}(_·å~Ïÿð%À'8-À×-ÜèošâÛDƒV¾ÐâþΚSl³´ŠÈdíÉ^OÌ8ëÉÔ“éDš¤úzèƒP¸Œ †6ЫdíÝœpIœút¤›BiÖ> ñ@Þawͯ˜|Û—÷£é]y g¯¨¨î<¯[„6úDQ4j·6í&šß$§äm €ŽùŽsè*ç•£}BÊbæqŒœJ\Ž»wŒ~>ÕÖ|)ƒ@±ø—¥ZxÂÖú}X%{ˆŒ2ª³²ƒ Îá•á¥oFÖj.I_¹œß$[µÎbyõØŒ…4eP#Qñb÷ã|¡Ú§’¤ç>ÔÆÕnÔÈ•&P¬$Löý]HdHê ‘Ø×Ô¶úŸìÝyk%õõ’+ˆdr/Ï€Oc=+ã‡þ'ÃK{ÚÕìš«ÈOûEÕÓ,ŒÂÊ?…s×í^…LµÂj¬]»3â9š\­|›o5Iä½³½´Óííœè-g7GÛŒ¸`¯?xóØõ=Sã7ˆoäÔDºŒWÚRÄ×AŠƒ%¼YÌ}ÚaÎpkÄ #‹Än"ʆF¸\>æw¾Õ«gñ}Qõ{¹Íùºt2¹ŒS¡9S“ÇCøWŠâ祎å.^¦õÏÆ-oSMD] y¥r— c‹ý\Ý8hÜŠ»/ÆmoQk³=µ :…úK1XPl‘¶eÀùblT|§wZóÍwÅÓÍux¿e+àS'2±;qƒ¿6:äð;Õiõáy Á– YåH|È}¸Çnœ:qÈ©ö/±^Ñ¹Æ íoí&]ÎÜÞß Ü,|•Œt\}دCšµ'ÅnœðõœMªj;‘cR‚LçåÁÆ:œšò'ñ¤vSºÛÚO1T øÈ•WQ´î—Ö‹½kU¿{‡>ºŠ µÂÝãpŠÁV ÈÀ Àüj]6º TOcÖ#ø×§jŠ/ %¹Ôu0°.¢SíG‡¥2OA —ÍÒõËG›Î`›÷ 1ÓÆIûÃæ÷àP龃ç=Ž×â7‚µ-¢ÓÃq@o/BØ…@|»DÚ$ƒæï‚ H~a»®3þOE¥\Ëáým5+ÙÌù(B[„fÒŸ3‚T‰<ã"¼}|y¢"Ë¥dó0 L.¾@¯Ýãv:ýîp*øYÞšjM æ@`óp ¹nûœtpç‘ÅJƒêƒýàzÿLðÄöÚ¸UÕ.âT™­Æcg“שqÆ{WŠü"Ùÿ 'Çí)% ¡›¾?ýUÔh?ü5%¥²\x–Êêáeß´¶Qšä~ Þ%绀:AˆãHÀÕŠå[sãæ·õ÷aÝj¿ÅÓ|Vp¬óG™ ¥Ø$H~\’3ô⤲Ðˬ6:LÒj1Io¨d=×ñCž!†Þ­Ó²DînéÏyö­÷Þ$´–T¤[”ۭǨ÷8åùjÕLjîA‰-ï¯Râá^úÜÏcæ,p.ýñ`t_2e>\€ãËÛž ÆprH¬]FÞÎîнĶ/c6ÓpÍ¡mýÇN„g88&«¤1,/ öúoÛÞq,å&dQt3åÇB9ãŠÒÉŠÏ¡î^“ÌÐc“ 'Þþ”ÿˆ$Ÿë8?À:þ5OáËøE­„RNw"¶BžàzŠ·ãì·€õž˜ÍdYãß ae°³áÝŽ8ëËžµï~5ø{}à[+g½š9â¿´’XBd:§ïŽpyè ¯øVGÙm™ 6p¼ãšú›ãBY>“¡Ü[Ko=ËÚÈ.^ ¼ÖËá\ö8ço8õ§&ù„´G‹|+¿ŽÏÀVí–àÍjñ)~vÇçúÔY?ð°uуÿÐäœñR|,±–÷ÀºiˆÅ±Uƒ $ q¸ôóS–IãýXÚJò¸µ…f-€ ó÷GeÆ=ꔥbÝì»7‘Å5”ñÜ>ÈHvÈZäoe7 ¶ÒÁ²®#ŽiVç¹Û&ãÐwÇ~•ÕjóÚ[is_k4Œ™€\½ÿJã|5§[xŽÑô»£i<‡ýD,P´ýÖsÐóÔsT‰zž¥ðgD³Õ| oõ]+ì×/xJÛÞï˜Ü…QQ èTIÇ®zW£ÝøFO^øs~ƒiif Fê'iˆ"pÃ$²¹í…oSYÞ ¹½ð·‡`Ó4[»‘R<ö1£!çdÜ#z-çÓ#“]ׄõ§Ð|I>³§^›‘öHôÛT–ÁdÙ¶áñê››“éÎEKcMXù‡LÒï Óg¼žú{‹g½hż¸% d/÷~\çŽÜS„Wq2ϦšjÚ‡’{™AUªN{€NçŽõ×kÿaðDRɦúŒwŽÖêñ:! ~üûÊOCžÕÎÝNÚ|2Ȱ€¿»ÚpI >ðÏCß=¨Ü–;ZÔdi-Íâytyôæ[ˆìE½«â••w~®X©Æàzæ×QX“NÍw¡Ñ'ðBÙ7Û%ýÖô¹þ=ÝÃù¸ä⺠¿á.—A—QÔ4˜.üiieZmÄ(7؉%N98“ŠÎ è oÿúè’M.¡q¡¦ÒÆÒ[&ÒÌ>œg–ç=ªøÕ<7w¨éÞ#¼}nítiEŠÚÜ~îWµ*ʾT¸r2:Çz+R=& ñ¨¿‡ÓDµ±Ðµ;x§s[Fï—çÊ99È ×oà;ëWQוèn´½ž1Ó®ŠAm—)µžì¬óNc`è°€»¹ì*ùˆµÙéÿbðg†ú2ê>H—ÄÞ\–wÚUØy „Æ«p¯‘ò³à¶FO מ§Ã¿ <éà´‰gñ=ÍìW6šã@›¼–‹Ì äãaÊbC¹@õô>¨4y¼gouªxKJ¸ÖmaÕ ½¹µ2‹ˆcUÅ9ÉcÏ8xiRÒH’w£Gµ@#7q^‘aàíjÛÄZ–ñxsUÐ/-ÓR×,4VŽ(]@O69œ‘°†ÂŽ…°Aªx3ÅzåÞµi¨èchö‹}¢X]…‹ìÐ ˜àË~ý`ÛFH Ÿj`p2|/ðœöÐhvÕÅ·ˆl®fi¶{aó@Ìe@I(Øà‚«xOÁwsÛëvþ/Š?AvÖRÃo,¯tË´…s¶:àà6àp=+¸¹‹Äú쵘<-&¡ã©ìå}JòXus`áT AŸ$:« Ä‘œóTí~âDúDþ¼ÓüwöÔÓY¢5Á·Ú]X¸Î~`þØ(Ký60¾kYؤ0Ý +¦äÊçßÃþÍFk+¯°aæ‹°VA‘ŒóíÇWÒÖɧh©âû+{¦½€)†Úv`žz Œíq€r+ç?ÙÒ??Rñ\Nä Ôvì£<þçMèî%º7¾>\Iw è+—vÕ 5Ü ó©Åpÿ­ÒÛMÐáI<ÕþÚ‰C¯ñZíÔíÚéÐzûÑ… ß™¦dÜüÞ&Œ-Éúr+JÉwßC“´nb³§ŒÿÂF§&ß?øõhÙ©iÎHaýiˆù—â|R\|S”ÃöWºu¨º8V“ÌéŽçއŒ×màÛkk5¶¶B2<åò'ng y‹ÉäsÀè;â>#³·ÄéVm༠F¸MÈ$ÞOáõ5ÞøR[[Û(^Ñ´é oš‰J0Ì>Ü玞ÕOáD-Ùi·RÛÌM¤M‘¹Z;ž Ç)ïÔðy÷®kÇ:SF.`°™^IEË¥´ÁwÍœ&‚Ì3×è+fQ<¨`8ÃÆC`oïøqÓ¥gxÞÂ-GKH ¤NÎD± ½ƒp:F =ñŽÃ½ILèþD×6×:ÓÉuº‹ƒ&vÀµ³)è{óÉçWÚ?gƒÕîµ7úæé¿Â¾$ø;áø4ë{ýU£’ÛUÔ¦2_X›"Û¸cÀôÉ$óž8é_m| ãöoøx1‚´ó»ð©[C¢—®=j¬‡¯ãV%<ãµU”øÖleYIæªÈGz³7Bjœ¤àÔ0+ÊÜgµT•ºŸZ±)?J¥+qõ¤v'$vªïŒTîq“Už±ÃsQ1äúS܃֢fǽ2‘>ƒ Ïr‰ Hì\Lä,¡?tïg=q_[þÈv†ׯÎdÔdcŸ÷R¾Gµ¾khn&UÆp3_a~Éj¦#ŒßÌ? µT—¼)ì{OñE-Õcå/ø)`ÏìÜœ׬þ<ßã_•1’òóS‚Ê k!UºûD"AžaúWë/ü[N“Rý›.–'Dxµ[9²çáÏø×äµÌúýœŽ·³]K9óm­vϪ孌Ë-6äÊ–²Í#£H¥ÍÄ#k+”e'©ô­y>M8Bo­ÙL•V>bžú°=Eg¿ˆ%Hƒùc|à­ÆžàõÅMŠxÙwjH9ÌÐgñZwÚx¶Ðb‰ÛÌ*Hó0ìÒ­xç2x'W\²€÷ö®wÃ^+°³‚x.®í q&Ty»g9úÕ‰~>ŠßÃBÊÂKKÖ¿ÆÎeɈ÷†>½èÜ{ÃKY,âŠÂèØ‘%yëïÇ5ôO´Í^×Ãuæ¡©M{er&û s’XF#ûÄ]§ãpÞj¿a£Ú´Òë Ò-íâþþRØ\)#§næ¡ø_r¶ ·ŽkhæfŠXˆ”œÆÛÈÈÇR+Fó§$,rc»× Oj‹êÊKDÇ[Eí¡‘%’Kv;AeÈaÏ<õTs-¦—å<³Å|"eT1Ç@1Ú»¯‰7ÚÝæ•5ö“Ø¡‚ ww|öýÞÞõCá² /ßݼEq5£´Qª©6ÛWï ÝW®Hä zl*jÚyWKÙ"(r¥AcßñûojÚn£¦CÉ“Í3Ç{™B¦ÕfÁ‰Ç±æ£þÒH´Ë˜ç.%œÞt yéíÏæ+"ëJ’î=*{[‡¶»”ÞA î1Ž2¤ø'ò©Ð}.t^'øa§ÚGž^[ÂZÖÔêW QÑûŒÉ-Èa€ÇZ£§ÏyâÉí–ø@–Q*{và0`}@$ýkÌõ˜ŸNŽÒ9õˆ¤•˜ZæK Äjü³N8ÏèkgÁCWñÔöºv·gnþQS#[ãʹh%N7g$ߌ ¤’W3»nÖ>“Ð4]:ÞÚIÒ n€Žêg´lY*ó™ÿ¦œzƒ]]—‡t-_Mknt­.-X«›I-ÝÉáé=  u=ëËÃ߉öÖ×àk1È‘¥¹œ9ܱ¡ÆÆ|˜Œ÷I¹.‰ñ~ÒmI.Ì…Ò굉”1Š\$HprÌíÇ VNq4ågqaðÿÃRÃÙ“G€\Àu¡œÊÖÑÆ0ÖdŸã`2 Áç¥\ ´fYŸÈÓÞ/ ë³$:Ž3bs›^z8<ç§·5ÀM¨|]ŠIÚ{–I5urÙIK¤*·ËÄö Dž/ø“në$Ú £´w¯¨:½šq6PŒrpÔþ”sÄv‘Û_üѤKwm8liªÉ-­ôlÐXI‡wG€AÀôªiðQðf‘{o <º§‹q­_.CYÌwEòÙ‰Œy®E¾)x·JÍàë"†y/$2”à|™9á3•ôÍYþÕ0ÛɤÁqáµùòÜ+« @¹QÒ)ÎyD< >”þ-‰z§û-êV Ðmô糹Χ<–²Kä ˜²“‡ùž\ã#…¨“öXšÉä´¹#OŠ(¤±»ÝæÅ›˜á`¤îgÈÃ.@õ¨4Ú¢ÊòÞÌÜørîD»ŠY.{Éb{Єì2ú¸+ޏ«¶¶r-ÅÚê“ýºº»?n*ײÄO—1$|†<ÞÇ4Ø®u¾3ø{ªøÃÖ:.¤Ö‘}™P=Áá–Òd€D-[ Aw@§9# ƒ\«ü<ñ-·tÿÛYiË=µ¬jtÉ/ @‚(¤ÊdLTgË<±Ï<ŠÚ³ý­<=¨ÞïRÖ%7Q Jîdž67Qãʸ\•S¾*Ä?µG‡¯mzà5ÁMvë6Ñ17ÈWd©éÊÏËOq]4¿„÷ðè×vÑIjËyd5³\ä¢FNbã~H#ï:T²ü/Ô/4ý"7(úu”zžèîÖAöpÅsa—'±äWMíá›´/&´ˆ^d×X¾›|6,mÿ—s€7uÎêы㿅&!—TÒ% uý¹²m9”=ÑkO—þY0ç‚qëKD3˜ñâC®xSÐíuéZ¥ƒÞÆ,λµ°—#ÎÓàž01Ц¾×l<&ŠË©Á=¼i¨ùÀ¶ZÁ³Ë má·6 œàô¯D·ø¯áio4)L7Y!„Ñ´ûߥû×'å"xbßË\hWk¯}"Å©:™ìÜ6tµ >fN·hÇZ{ÀÝÉãi`CýŽå#gžé­µ´a.”Ûñb3΀Ýîã<Ö´z¾›‚.>Ó$ˆ¯ z”—Ñÿ.IæE£æ[ÔQ`>O´iç²îaÜ´ež ÙT89¯#ýŸŽÉü^X€¤zÿ*öïɤRþÁ®ˆecd.>øœnÏSÛšñ_ÙêAž'(—‹d¯²Ç»FÇÆÑÿÿ Œc:¼]ð+¹G'óÓð®#ãd¢á|,UV0Ú¼cl}:Whà÷ÇéMjîSº‘‰%F-T`}kB̽LrsŸ§¸¾p1n£ùÖ­ƒƒv¹G¿Jb>bñÎû‰óÁ ÛYÞNª-ço(ÁÉ8ÇNQ[ú‰Å„¶®5KTƒRP¶òØ”"e*$fÛ÷CyÎGÏø¶7¹øyl“ÝBó¨ 5ªî1Iü¸ÇrÚêó\x¥‹PÔ,¥ÕIK$–̱ÉÝÌmÃ#+ƒÉÏJÖ׊¹—VÎæˆšeý¬Mgu§È÷,aµÞŒ»®T ¯N#æVÞ3€i³c¨èj}b ò…ê1UÝêiœ–,NNrMU‘éLhcâ cŒÒ»š¯,Øã<Ò, „HNxþ5öŸì•ÏÂ8ÏM×ÓŸýü+â'˜ää×ܲz‘ðrÄ‘×3î7õ«ZØö:)Ð`|Óÿ ¹K?ÙŸU•¢yñfGÔ“(Ö¿(µ‰õß´Úµ»Ãoó ‚U]³Æ ú÷¯ÕÏø(Šný˜µsÙu}ÿ~¿ã_“Þ&ñö‹¨àÓæÕà,’™ï›b6zŽOÒ½ Â:¡Ô£»¼„ÍK)P².ÓÆqÚ¬øšÈ^X-ó»-Ö• ¾µ‘T%^›‡ñ/±¤­xvÐóýOÄ:~‡öd“×<ªÑlôë×ðª’ü@ðôÑÏmu¥\Ù>Ý¥«$‰î=z÷OþÙzΧcÕ¼¥ßÜíÚ÷¸Päw AÛÇaNø·ã›µÒ[ÂPé—1LníIu ~\¨µz5(á£hU»íc’5+9(Ê^§ à¿´øƒO’HŒsË!ŒŒ±±\|­Žç󿢷»Ž8#Fp î 7AÜÜõëœøga>¶˜ÆFqósŒ1þ€ ·o£Zju9çBÆÞÞ- Êòr;×™gwvvßE¦§G¬øîmu,ÖêA7Ùbòa* ¹}Oš<9ãÄð•Ü÷‚Ñ/wBÑ2JÄ/Íü\w¨¬OX½¿‡nïâ‚Æ3kà±Á´·8õ÷¯4ð÷'Z”w’½Äfη ±`{g*’@HÔBö=_Û¦B,„(ÎæçÒ§:Ÿü$¶m²»ÚX\Ïx¦æ<+©1 ëÛsøVŸ¨MyK½%@óÎ3Œâ¶ä±±¼´ŠÞX;xÉ‘bÐ<KD˜öZÄ× ¹ÔÑ!Œéþ{*ÝJÜ{ô?­vQésiÑ"Ü걓cå•K™—ø¸èXrAëëY1xoOtP³ËcÑoŠàÜŽ*ì›HeK½¸çœ3}3ÆE&Ó@¢ÎâÒÃ\»ðþµ©Ùê±Ã¥,±¥ÑYJyÎN|µ“ÐŽ˜«‘ø‹Ä-}%óêÏpc0™íN7àasî09ê¯=:ä®0YœwrO®3QϧkQ)DŠúã's¢Ê 'ž¾µŠŠ}JØõ1â¿iÚDÚtÌi¢/%|Ì÷LÇÜz0r{Ö¥¯ÅoÚëöÚšÜO(†ô\5¤³#Ç%ö ¤cïæ¼³ÃöZ­ÙæîêÐ';n$·®{‘êzW{ðßÁ–ÿŽaÓuÝpizZZKp·Kò“p%ºœs[ÒúÓTãk²'S’<Ï¡ŽükâŸ|8—ÂÚ¬RKm>¡-Ü·Q(YD¯È¬¾ý«š²HtƒeEÉ1ƱË#“¾y€À$÷ãÓñ¯££ýž¼+p±}‹âIIC,eÚ&ÃyÆá“^oñãàóü$ð-®¿kâèõÈc¿ŽÝmB„mÒ“™ Rr:+Ñ«”biAÍ¥eæsÇNR²çI2Ÿ$Ï¥]‰@2A 'eáLû1–ØO¤Ü/–½ÄHv±?p{Æ*ŽãB.;–åábF”ª’~ñ9ý+¤°Å·QÆÐéÖÊ–á’1qp ¸n®F:Œñ^7²Gb“hóè4kˆ¼ÔûD§šZä²EÎø¾‡Òº ïhZ}ÄÒ¹±0CCü–¥•¦óUè3•ǹ5¼–šåœ®%Ò"ŸÊGó·1êÞõ¥i$Ω Δf¶HÙ¼’@Wœ®<Î:ñÆ}+FÙ |<¿Ð4 ;­SHƒZmAŠÃ ’¢=«ÆÙÌß÷â!þd ôïþj7züW-µ¤zmºÝÄÓZ ·Y¶@§‹sœ„ê1Ö¼ú9tÚ>¯e³JŽç¼q¬‡>OEêxW9‹t׸ehׄH9¹(¥Ž0þýqʳq¹|Ö=šóIønóiЛ2.u¾Ô¶ñ@AKÌ>Ã.Óû¸Îß•ù?v²@øe¤Þê;î ŽÍÒI¡–)c”ÊİÆ9ÉçqŒ×#m¨èeCndˆ †ÐK\g¿?w§Ò¯­¾‰"²Ç,Äíü·JK\ÿÏ>½:r9©öaÌwZ‡ÁÿXkQéFü½üÖ£YˆA1m¾Âæ=UQç¯Lrk‘ñ‡€¼-cá+ýOBñ}¼÷K‰-K\n‰Ém¾J®ÔòÄqŽhH±W–[{»Å"/;ppÅåç÷c v=* W–W:[Ø.§0€©»É„„Nœ7{Ó³êØÈÓšæ >$»‘f»Xÿzè¤+6Þqé^oû9Û½âø‚°e—SePÇ NkС"ÖÝ".HT(õÎø×œþÏë‹•,OöƒòN;õ®•¬]ˆºæW6>4ï·ºð¬,G˜º¸S·H×Tu×9õÅwðïÃ?³ˆRªÏo2¾™›‡ˆ†ÇÌ~^§ë]$ß ~ jeÚÓÅ’Û09Ú·À‘ÿ}kס—T¯MN3޽±ÃSsqqqã¶² µÙX)ó­KBäÇΰ|Cmcðëâ%þŠºÍ®¯§Ë\ZßFxÁÏîÛœŠKÿéÚ5¬×îâê8PŸ*Ûè;šó'NnݱjQMâM2]gâ6¡c7r …]ÒZ:Éö=+«Ñ4‰õ˜„—êútº²ãk’L^ÆìCɪzF¿6›â»ÝPè—òCpÜ(Ü1Þ½ Ï≄ö„nùÐ>´›ÒÄ¥ÔK_K¨­Ü©¬L‚H×ibG\rœpÜ7#““Zßð¨õs)ûU¬â8ãk*•I0?x?Û8nEeEñƒÃ’Œ†¹Dä«5¹#=ϵjYüIÐ/W庑wÞhY@8ëŸ^j7rô:Û-OØ¢Om K•Œ âöë_[ü*~Ïß F8:oÎyM|coâÝ"òÆY¢Ôc’2­¶L’¤àñùŒq_i|4ŒCðá4Gr¸ðìD‚9É–Oñ4¥¶ \“’xéUf'Œ22xçÓò¦ëº‹é¶’Ážæ(–HáÁ;ó"¯áÄÕF´ºm^öwœ›mâŠ(:`öúóYíC6ÐïØda´ì^à°×5GY²ƒQ·žÚQº##=úV”­ÂŽ ? qúU)Fâ? L 3 3-Œ98ªçõ­)—9ÏÓFdÎx>•#3¤j´×'æ´"Éïš©,)äŒEQ‘Çcš£1,ÀçŽE^’€£ ÅU{vÎ:Ši ²Œ­HÍ}ãû*¡_‚š9îÒLGýü?á_ F#s_xþÌp˜~ è*zþôÿäV­©­I“ÐõAÒŠZ+s#æÿø(0Ïì¹â#·vÛ«#ûyŽ¿ þ"$í%‹Lm €aä‰ò Ý‚v:Óú×ìügöWñQþìÖMÿ“QWä?læO³]ý²DÇÙVÕ!VÈI½‚’9¨ûE­Ž*ßMk©û&ÒÒy v•|»† öƒ…˜?°#úÔɧɠÝ@ö±O9·>T#í¤ù¹&G>»Iü±é]gƒðßMzð]^ÛÁ³ÏuAŸ—¸èsßž+?ZµÓµØÍ¥Å嬑ù‘Ê °0C®{ƒj˜Ž¿Á¯çZÌÃ8ó¶ì_ë[Ú“ j r~ÎÕ…à{X¬¬d·· ¾ÔTÉqÅojüèšªŽ¦Ý¿*K[5ð¿&Ñ9Ã$óÔ×®ZLðîulŒ2?Ý5ä \µ %J‘#Œ{×­Àw!ªÝ?ݦɎÆ«´²ð\Eí£¹YxWqÁV,yúŠ“HÇü'Ø çìÖà’:ðj…út·þ €A±¼¦“pw ~ùõëSé*GŽ5¾ ?g€qÓ<çùVjÜÎÏÔѶҹcÇÀÿ ¬ã“äôüzW‡xvÒiï'ž+[‹¨-cM,HYb]Ê2qÐn sÜ×·üD/ÀšÛt+àg"¼[À>&ºÓµ[‹Ki¥ßBñÍkm[€0ÊŒ;ÀžüÖ©\ÍÚúž…¤ë6`€d+Œ“¹OZêìüA`ãö1Ž1¸ŒJó$›Än‚q©H#YÈ[q3„ÉÌC×½ªûxÿW†9­ç}:VòÑ&'N>h#cGâç zRÕÙ”º¬¤í¹ˆç¶áŠz›IÀâ ^@'5æ°xâê8+í'F–à•Fu‰Ð#€pƒò°ÆOcšÕѼe¡µÊOÃpM¸£³»òÙ€ûð)#¯9Ó¶)5d;¦vfÊÒO»Dû ºE²±":«CXž&ð„·!çÒõ5¶óÝ‚Z]!‘ãÇ®Xe×¹èFjµÇŠ4âƒÈÓµ÷e%'’9U•É'kEó|Ê>PÄô9ëSò*éu:_ì¤l|÷AÈÅÃŒ~µ?öy@o/qèf,?ñì×0ƒh3s´ýŸSš-‘ÿÏNOÚ¤ðÍ­íë'ŸS¶›í.ê"¼ó¾=zšö£éò–&Ú@än™ŽÆ©^i¶VÙÍ:¿™‚Y³Øû{U\i+ø{_ ¨N·š›42y–æI”)P9Èîj?ÙÚµÓu϶,“‘|áš'Ãõ÷=+Ñ®¯KZÊ£²·ÝúW›þÏVÒÝhú¤qeæ}F@ª;úÐþp[«WŽ5É4MkÃÿa¶Ižâáà tÃpR;z:Ñ?‰op‰qáØX¨ î w÷•ñ%¤]Á‘²àÿhIûÃñí^Æ|{ÿBx•5ŠÜ»!†y 4Œü³þÿ¸4tÔç“Éâ¨m¾vðäq½Œ†±îÙ—@)ÎAŸK,sé^ái2¾•­Úi)sk<ªÖ!@Éɓ޻øsP0ª.”Z{sp©¶XÛ`êNƒÁ¡¡'®å-oÄÿµ»¦º¶›9£µxâ{v⟡KàFiÞï[76’ ¢6šH’&õŒ}ëjÛ]ðõêÛ„†ÉÄfHÀºpBþÖpF_J†ù,u{{X´÷µ†)þeC2Ê%+üX+îihgWá_ÁÚF˜–Z>¡cŸ i88Py$näò{×Ýzi‰þ|>ò‡A€¡ig?Ö¿7îüoìVâÊ}--  $¡mQšPY7Á¯Ñ_ ²7Âo†aT>²eŽH ý L¶“Œ\æí+¿¹ŸŸ5N@xÏ8èjô‹Ðõ"«ºñœf³°¥gY֮ȪξԬ#ÍDЃÔUâ b˜S?þªV$[³G—ONx¤k!’s×ÖµDd!iLYе0ÚÀq¹'1Á'Óß½BÚqÅZÖàÍþ„„r×ÀñÐa ëéÅi |cz«$ém)Úˆ]±Øgñ¯¶gëCeð“@Œõ)#cÓ25|±±`PVÎØHfn:¹þíÖ¾´ø+‹áw‡‡ÀOîÆˆ;¶)+#¸´VægÎÿ·âoý•|aس9ÿ·¨«ñÿÇÖÑy–÷ò=ù‰ 0G>Â`l^Õûûq[ ¿Ù—۱;Y®OA›¨…~9üHKH/ ¶)ÕWpWISϘ=‰gö‹Z#‰‚ÚíÉ$Õ!W b³%ʰ©.G±dvÏ5Ðø{Íòe•ÅÒmÂaQ°ãûØÝþ5h4¨ãsvÚ|6b2ª#•Õ™?!Çc’NHî*έ¯ÚDÆÎÚÐã ·àGú {àþµ[»µÏFð£~æã’|ò1Ž:VΩ–Ñõ ÿ*³ð›PM?ÂêÒÛGv$“€¤±Ãpy¨¬ÑÓâóÁ^Â,6Î ¬ÓnNè«h¬Íc·Ö…u`ÚÕìèQ–XÓk ð ‘Ô óm/áî“oo=ÔKÑÜ-º««/ÏœÓ;yá¹úW°]F—VrÅ#˜‘—Ôão¾k•Þ}æ ×Í,±Ä¬i?8ö õô«½´%­N 6ÚO±›-^G–æw[hÝŠy¡r$ê>V<žã©­ŸøEî-˜DšìBS+–Lõ\öÇcŽæ½ßáo4©¼#±©YÛÝ]ðÁs*,â&ÜEtV …Û'8uï×´Ÿá¦¤ü@ƒÁÚ†"¹Ô­l„ÒCr¤K$ì>Îèù2‚©85<ÁÊÙó>•àcR¶yŽ«h‘¤{_Ì*0GÝ}KG¦95§­xò{‹»mÞ;èÖ8îc¸»d À Ѫ¡*Í’Oàt­íN»´Ò®üùa{(îÚ4ò£ C ÁF{ާOSššâáÙpoM—“*L&Vec"²œ!ÉãŒÓAcÌEÖ¼è#NŠi'%áT…a¸†>RÁ´·º¯¥Ý\[\èAd± ç*1À¸üW'z›\ÙY^ëúž§s§>½ÂdeùÃ31e ”ŒpT”É$œRêšdº§‡ìôdñ©¹ÑnfšÒV` r Q)Qæ*ò6·##ƒ‘I{+¨¬¢º—F,ÜQ2¶Ç÷ôä(hnVw¶’Âþ œ,G¸«¸Âã·ý+è­ÞlêÔôG÷‘¶›nÚ†Èb^È猦3æ,2j„ñ4Z: mFÃSñY»û+ØA²]Y¢\à»giˆäî`AÚ=(¹6x‚Ê÷ÂÒÙ%ÉÐgû Chý¤Ü•\}íÄöÎi_¹v±óV£ã;·°• xm¤`¸cæªò9ÚGÍTׯºœ k@c^âŘí<çÒª»lTtò”›eéM—Xù"' Þƒ?Q[Þ ðÌ^!×lmoôÁik#(¼¾†á]lÉl$“ÃVþ.½Hn­¡¼""Œ3y†FÀÁU-Ž˜îzSM¦Xñ¦`ßxžÛ2ù¼·ŽAï}=êX|oa•Ùâ]NÒycíZNOÅÇoz½©|ž+8µ3Äp^èdýžãP—÷KȈIå²6Y•†v²ä0”i¿¼]ªé6w­%µ¤úªƒ¤ØÜʾv§ó”Û2:Œ€H'ðÅ=j-Ží§‘ì1ã=¨°jv“Â$‰Æ?å›túWšþϳ½®…¨Ë1ºj2è9¯E¹»¸²…Þ}>ö(ÌnÛžÙÂí ’sŒy÷ìúm§ðÅü²Jb…ï¦ee]ÙçÓŠ_eܵ~ecCâ>eño‚Él¹¾vÉ=NÓ^éoý²žˆ‹Ë7ÓÒmº{LUÈ,3!fô$ð+¾ ²x)co1܇vÒ O8í_Mè×®ÿ/íbŽçËHäi”„ޘ˟ulâ•ôBêxÚÅÈ9#ËAïßš½jAfÏM§†ät5Hø›Ýg¦ÔþF­Å±èB1ý*Ä|ÑâYdÿ„÷Vò® ´‘3™¾5O™1ïèk£ðåí¼±Ê¢êÃÍ1ýºÐËc°ÇhK‹îô##ߚ絈¥›ÇZ³D׫,,.CY®KìQò}O§?Jìü=¥ÞÜ¡¸]VöÙ.^F.-T˜£9ÝëÇC…ÀVšY[S6þh ²“D7% Úrή›-~o5=^ž*M9nàY'Ðì4˨mÁ“JìŸ= ýê°c–#ïcõÖ_ø"çR³¸¹Òu{&¹GCÅ¢‡Ž#ÑÇÇ*r8ç<úÖ÷‘éî,,N™m+’Æ a1”P[ÍVÏ Ó1'Ò ¯3Òô_ìÿøBngÓŒKÛÊò$RD“gιpx¯¿ô8? þ¦3·ÂºhÀéÌúšüøÐF‡w³h†1hm¦fhrWÍÛóŸ~>•ú~G¼8Ùá}0cþÝ×üj$YVNN{Uw¯aûûT*§ ¨š¦|ž•©íNÌ åI8¥ÙíSÉíÏ­?ÊÇQNÈ –»kÐÙ_%í^f8çpp?,•£åý*³ZgÄqO»ìMÐ;ïù Óò=…1\θ±óî-¤vÄåØÏÝ#?­9ÔÇ­¨Kg¬h–hŠRöIUÉ䀑3ð{r\ñV0B»vÎ!•ç•äW*¯Rª0 õú×Ù'ÃOÀû(?©¯nÄ$úWÙÿ SËøqáåóè½h†Œ™mQ[xWíÀ…ÿe¯•áÒO¡1é_ŽÞ<¸šäÛÛGñO&éþÝ 1íŠfäWìoí´¥¿eoˆ˜8"Á?I£?Ò¿SÁïÁ¯8øoáÉà½6×’®œí2ïšQ•‰çÔt¯g¶ð„«áIµÈõ +‹xn×ËI?xø$oUþïj—%{©§'¶<÷áu”·¾AŒå›"IU7ŸSÉ©-c#âþ÷$­”k哜rz{U‡(ÂÑ)Ëÿ¤Mëýþ•¥¦xj+íJóX7SÃu(2©B©>½8zSZ6ÍV55¶}:å.Î-J0ôÂ÷5ÈèºE®­ ú}ÎØâ¹ËQ ÃxT‡ÙŽqÇå]d:Zj?•~·0Qò¡ÔŽýé@{,­Ì*€ªÞ^ÜsÀõö£q´{†õèö¾¶ñ=¤Qi3˜oc7šu¬Z³¶²jƒà °=zŠ.ÐÑòö«§ÚMâ4#O¹ŸÃ:jKŵʵüò°Üc|“òî!sÀt5Ój^(†-O^xfâ_\#YÏáÈt D«ö´lòÊ p'Ú½æ?…^‘CÙiÕµ¤Ëý£n°KÑÏúÌÿÓ@A8äã=jøA£@ÄOq¯iðZá–Õ_ÊÒ[>UÏËÕ³Á‘ÎTR»çïG¦ërMàk»ËÝ8mþЋ[Ô-™a‰Ädù~W9$ÈÁ¹¯bð7Œ¬~"xÄz‡"–Ã[²Óš+;ûëçI,Œpî–AFY‡;TžÍ_‚zD¢¯ùÚ7oS´ìä2àçò¯A³Mçˆ4Í" 3]ðí´·ö“]FMÌ… ”ÚùŽ7Ù>õ_Ãß³ˆá¶¶"m+XŽëNþÖËÍib‰þrÀXàŒpç4“¬ÏAý¡u;-?ÂÖ“ƒý£âûAöO ZkV º]-€+<[‡2€ÜyÆÑ´g5çi¨øšßE²›FÒìSQÕ,M§Šm ´BÖà:yo>r#ÜŒ­æ®ÞTgžkªø“ð“Äÿõ­V¹Ð%½µÓìÿµmí~سÓ·)Hãmá®X`ç;‡k¡Ö´ëSÄ)¯êÚÞ¦·ÂÖK]BÈéû·@`1Äv¾ÉT`IcÒ¤V²ðƬ¥§„´Ï ]ÏcâCº|º•è’{yÀr [# ;—˜t5æ—Ã7·í©Äú¶•¨è°C•m¼\y¦) >d‡Øï,Ãj‘’@ô¨ôë-OÂÿ ¼¾+²7𦠲Gt¨ëeaö£(_Ý ©ÀnJ©'œÔv>ñ§àmJjÝÀÖÚœûM£<— ¤á™ÝÜžøÍ1ìhϧé1[êzüiâ .ãÅÉ$P]¹ rFzÖ¯x—Á:†½>˜¹yuqku|.Ú” éåw–ÜÀ±¸äÒ¸X¿5®ï„zü¦  .G ´ä{ðEx—À ÁN‹©~SÉ''óéš–§$>¿°‰c É·Ë)ÀÝút¯:ýœïfÒ¼$—Vä cºœêäàþ†©ß•Ûq+])¼rKxÓÁqçÈF; ~•ëvÞ>Õm|+/‡ ¬šS)6²1êw =›"¼Æß7޼žI–f>ç»Vã$u•Ìxã̸¹„Z^Åe¨Ì¦H'¸´óxÜeÚq¸ëœsŒ×Orà1Šê-ĹÃã¨ý~µÉøßRžêx,-®õ+9åFºŽê }Án.œrÀ˜ÏË‘Í!½ŽÏKŸKo†·Ï¤À–ÖŸc—äH| dç;{s_£sFÃ~LržÓŸèÉþ5ù¿k­ÛkŸ ¯ní {X^ÒUòž0„0\y¯Ò}F2šg‡ºèzrãÓý:Î[ ÆuëUÜÖ¯J†¡ò‰¡!”D|ôíœdg‚#éD°ÿÄî ÏÙØã±ùÿúÕoËúÓ¨ˆŽÔï.¬ùB‚„S°›*Ìc ¦`›Šç ñŸ¥LW `øâõˆRF›ŽÜyŸýjÚn”Äcêj\ëZMÉ$=¡™Õ{Ñ•þLžu5rV㎠ŸÄU9É 3H WjJ‘ÜœWÚߣò¼  §LYEÿ ŠøªfËg©üÿ*ûwÁI³Áú*ôÅœ?ú¢;„Ê(¢´ ñOÛF?3öYøŒ¿õ 'òt5øõâyM­”L©d¤ —q,~ëWì_튞gì¿ñ qÿ ‰=8 ×ã7ǧÛß,—.ð¿c·`UaŒ…îT{VOrÖÅ;=rÆÎâpÒ@$óV)À, ”õԑߦk¶ÿ…¹¥Nì$ŠîHäAH]#'hU8Ã)“Á+ÉEåÆŸ ‘O5íì‚Ú9ÞØ8.Ù+/@éÇ>ýjäºN±—šæÞÜ< Äh›Á}ˆØ=r«0=)|CŠ/îµ8BìŸhùT*’8Á‰‰kö0"XÙXNr>q€0;àäóÖªxRÇNŸÅrÝëdú¼ß6ÐÁJb”¸”r8Î{TºÆ§w­[ÙCp‹‹8¼¨Œiƒ·Ž½yÀŒ})|-«/‡5¤¾’ÙîB«-e1’J‘÷ºãœã¿JJVcЧ Ì ¦J·VÊÓHØUVÚ¨rxÏÎx“O¸–}&òÆUK¼Í &A•y@®qÔgô®Ž4ÜîÄ$³p ÆN½kœñEÔ·XiÑ1·3K) %¢&¼{Ž´ÕØ:Õ­lñK7¢_2Mò2gQyxÆ88n8JÞøy¡iÚˆ,aÕ'M3DûRÉ=í¥ë1Šñ—÷IÊägó5Ÿg§Ïspmæ¼¹w¶&Þi.,UƒÎ9KŒú€1“šë,4»k8•&Ô,r²€ˆ7ÇåÎIÿëÓ“ÒÆvÔôíá†î?³â;¼°‰.®`¾k–b¶ gÊiIû¹Æ'‚8­m#á,— £¥·Ä»H.o,®.š;©º4g…<õ`zŒ;ãítÛGú½Ìz„O¢\L‡P’Vî%r Û9Î8ç¥YŽòâmVÛQ“Sµ70WíA»ÊXÁX—¼0HÇzæ³îk{t; /áÏŽ„siþ5Óç,ºŠÇö€¥cRD:¹¥iÍáŒ6q\˜õX/tXî˜ ¬‡³'ýOQòƒ“´r:×—êqÜÛxHiW q]¯³DŒ&2I´4l{ (ltç¥iér^Yx±õ©à·¼+ y,Ñû/’S=œd‚sZV—Fv;/øƒãƒìu«½j8žÒ;a{3Î’Ù¹ˆ3ÀÀÁ^xç5ÄÝ~Ø~2×aÕ[Xë_¬ íèr°œPS ³9å…7Ŷ¸þ} É2ß<ÂkAç3<¶ýc¶eÏ(¾ƒ‘XV+m¥ÚÁ–™e|¶¨»".OÞ]¼†ö9¸­ij&“;[¯ÚÇYšM^KßX]¾¥yo¨JÐ4nexñ‰#mLpÙÉô"´_ö·³º’ìÝø*=òêÑ^—·¶ Q6·Í‚üŽO¼âW?h•ï4H't> åNß÷GZ­-–‘*\ "‘”FMº*áOðŒ•q”RR}PÜWsÙí?j_ ‹†i¼1u ¶¯’в§îX Öb8'<.ON•«aûTü:—ÈŠãûRåÔŸO™ælÍ`GüxŒ÷RAÇÑ«åH4'Wpö×Öƒ`Ûkv6¬%¸”zœ}+¹›Â6Vk©ZA¯¸û4¸ÔZ•®ÝU ?ÀNæ\ž¥sÆk[£5séM/ö‘ðV©·Ú|S«m¾žM:ýŒ¡Œº`Ï•ÈÈt, •ù±žOÐY|oðˆ-ï§Aª—ÓõI^[mœeþÌÉ…À|2‚FO-À##çÿßxkÃV^Oøa¼Toî¾Ý+Å…kxB´-ÙÆÖ2ùÈë]¦¢ü1Õ ºšïÂWvðx{T–=BXnU™â•Ú8D\‚ä>Ñ•Æ@'<Ö~ѦZ]™ëCâ&â¼Gâ½Ä[¬µI¥ÓT 8àÝöyÔvó>\ƒ‘’0 °/¼?ã¦d¸—Â0]xŸ÷7 Ö¡N{c”n[¤ Î:ðMxï€>èÚ‡†luˆµÍ.[ˆîﮕxxc €®Tqƒ»Ò©è?~ëg†®äñf§¦[^Ëqo,Ð0Hi0Œ•ä3œöÅ/iÝ/cèáÝÅaM¿‡ü-lj9µXnÌCO{r7©ÀJô»ŠÏ¸øG᯦¡q x3OÒõ_Á»FšÛSØÖÒ”HW ×9èqƒ^?aðGAšûH°ˆm¥j+p·ß#DÖ…3峆Æ[¯c\_Ä ëáo€ô?ÚøÖOGq$ôý6mÓ¡ Ü€s׌ûÓDÅkþ"‚[K=ZÚq‰bŽXä·a€9ç¿ ó\À~ÑàuQ$Pÿ¤JwÊÅAùv:ŒÿjÑ.燛jÎCe23ï\?ÀÁÿú ž^ü¼þu»O”[3OƼ|Aðd`«•y¾d9Zì˜æ¸Ÿ1ˆ^r9àq]¥Û$OÉ$îh˜4¤ôUùÒ‡%y; IÉÙu2³©^®x ¿Ê¬>LÞÑ·òªÂ7‡UÔRThdIv²H¥YHŒ˜¯ú=Ã@òÉý)ÆJJë`i§f|Õu*Ëâí^7{5ón Û}ª"ÁgÛÈÜä{Wgሥ–è%£é9gx¥pVñrXc#+ŽÜ)õÉ(oøJu0.M±¸¹h¡sn$ò¥ÈÃûtÆEuvWïÇ‘wd“οg_6À¨7ƒï9ÂôlýãÁî+W²2WÔÒ¸Öõ Ý­„/«1’EP‹±œEÔàœ9ë÷Ž)­ewu§N±A«ZOv Üße¹ ÑÌ»³ã†è0Ná‘׌Ð[ÍYmôg.ÛÙÖW‹:ŠƒÛ²œuSš»ka=ÔZt^d…§¹{]@nŠõw~ë8ÎOãqÁ©Ð«ÜôHõ—×>Ý^Ée.Ÿ$–r/Ùçá{uëÚ¿Lü@ÑZG£$²,yÓ,"MÌ[ì©Ç×׿¶¡uyà+¹oíM¥ÛÛ,!‰+À{ðkôcâªÔ<-òÜiÀäYŸð¬ŸùöC ÓJÚ§eëéQ ÏM8LBÿÌÇ>VÝÞœš˜ÅŽÕ!uó<¾Ø™§ž‚¨L®PZ‰ç¥Y>ÔÇ!T’@\OÐP˜Š lVñçÈ!£ŽýT²‘%D²¦ :†¾*½ÜÂÞ•°I<´^iõBKŸôÃ"0Ùí׫·GhpqŒöªWCiÜÍÀÈþ_J’ˆfc‘ÀÇ_ç_sxHm𮌲„cþ+á‰AxÉ<qšû¯Ã‰³ÃºZž ÚÄ1ÿCvL:(¢µ òÚæ1/ìÍñOý§?¯Å¯-ŸØl¥Ä2j¨Ùc™Š‚¤ücÞ¿l?jh|ÿÙËâ:zèwGòŒŸé_Š1VÎÆÚ4d¿—æ·ºïayú=k7ñ#HìpY,¸ŠÎk`†Þ7†øäÚ¹æAž¥[ר×Ee{?ölzs¥äL¤Ç‚U•€QÃ1뇯LÔ¾Ò îŸżQ-¤¡Œ"HDEa'”Æ}yÏ¿j{i–¶ÚÕÊ0ƒíq"Ç&ÙO ŒÆ}qTؼΟÁ¡Å¤¥Äˆ]Ëyr€ sÓŽµ»xÃì7y&&á°|¹8 K’T6à kÝl®ºÝ·_¥"‘âÿK£NÄ|é qÆzQ^·`ê0ãÛóÖ¼›ÀjLósÞ¸Çã^µ` (½N?¥) lsGüS¼ãjœ{ýú·eá5MªÉwt“!òÄɈŠQß9ëKðŸPþËÑåsw?¿¹d£ n$gê:־С½ˆ; bË2@ sQw{X»+&1ü3§ß@E”©‘’X&vç¡ù¹5—ÿ¿‰ôñ+Ãâ8 «u ¾ÙÝɯFÕìä²Ó<>©¡®j¶Œ<ÀÊÂìÿ}p8OÍ““Ö²ô]"ÓSñdRjÖWZ–ž!ýÜÈÒ°wòÇÞôèyíT$rR[øÊÍAšMÀé󗯯ǫÜÇn5±kr¶×¦0Ël’ÛxCx¯Eí—L»KØ •ÛlQ«c˸SÓÇøßNÓ§Ñìîu6NY^„=œç+ÔñÔsJã³9X/×$mz[ÉUŒŒqÏD=CëÈ«°ëVw)\¶¥;¹&)æ·*ħSòô+‚rq3ÍR>Ó5E/yy–Ùmn¥‚䀩ò›lg¦àª2yÏãD¾Šâ9ò/­ç¹†10†àÌXÙç¦ìg'5m".ÎŽ?B$Þ&Ÿdß½Xæbªñœ8è:gÖ´"Ö5Û“!]^Öê9XHÂHQ„˜.ÙÀÇ{׫é2ÇÍÄ7‰²ß2 1Bß÷àŒg’AÁ¬»ygyÕžóP¶‹h¾Ïk•KRyƒ#¸=†µO*è;÷=WO\eDó,çL‰•|—{€;WKàÏ kž9ñ¯†¬-lžôÁ.¤¯4»Uʰ »Œã‘€?:ñ6Ö¢ÓÔ“¯ÝªÂ‚âmÖÅFßêñŽËÇLZ]â‰<9¬Å¨Áâ„ÓoíÑ¢»½³¸x¤‰˜ÕìÜç½kF4ÔÓ¨½Þ¶"mÙòî}Rß³‡Ä;#ÝÆácv|Ç|£{^˜Lšâücð·Æ¾Óm¯µ2ëH²‚LKµz·¶»`‘Â\ȇˆPíÉ÷'‘^•XåΓ™>›Zç4>°¤¹­bä:©‘ãP÷ÎÅZI6²’òÁùºï’i[U¸’" Rè:y²8±Þ/< v¹®/x‚Ô8›Nyv¢ÌØ…vüÇýX#a×# zW@¾:Õ4·xž]?È‹,›& ¨ÃålŒç‘‚z ðùQÝvËp>œó™fŠT™cÜÛ­] >Aœý+¬ŠçF×ôF-böT–æÌZ(%¸“h+(+ÈÚ azvæ¸ñ–³u$[E $ëo¸‘vÿVÜŽC`ŠKOxŽå 1iÚK¬Ò˜7­ö?ðõêœ)´hzÜZNˆ³Áefê+{T¸óoeU{‰‰ÈÆáœ…'¦M`>§¦Cy-¤¶3ÛJ·ç„‘Ô8" FGÊHÁŸÎ¼ÚçÄ>%Ö­!ˆèpmºvE1^ÈëÉRÁ¸c‚F:ÕmOWŒ@bÑõ¨Œ¡ä„EvìNÐKsƒÆqÔ“IA63ÚgžÈª ‘zˆ‘u‰‹b%¶ ÏNO#¿§4ÖŠÞKµ¹¼¼Ž8¤Ü!PÉÊV2£¹Çõy 6Ôb$ø‚!"™ã,«&ôÜpÉÆ0O<ÔƒâdÈI}^ùREó€¸Ó‘Ĉ?‹ÔôÅ>Bu=™î¯u CV¼ÔuyV÷Q­õ ç‡s<8PˆÞ¡‚¨ã¥s> м»]2ò$ŽylÁQoo”-'‡B[ƒ\Hø©?’øÖ,'…n,ž30ƒÜŽƒ#5jÃ⻬@$[; ¡rq!†VSŽvôÎzöüèå ÷:MV}ÚEùÚGú4‡“½3\¿ÀIÚÇÀÖsW"Y¸aAb?­gÝxê_쫹.l¢… K U½Œ¾ü6œ>µàE¤÷>´TUr$‘°Ì#qõêkGn]F®å ÿfO‰¾T>ɰÆOÿ®½?⥮۶•o58Î*¾šï)ßœ`ÄØ;ŽäW™xˆ4_|,Ä‹ÇgœOzôˆ¾-¹ñtºULje“L:d‹&Ÿ$qì1IŽ †p$t9öÅDâ§V®˜¹¥OÞŽlrÂî]CPÔngžIåyIi¥]©÷ö§LqiqïþU^ÚQ-Íô¦S;<ìÆR¸,Ç«c·Ó4àý’ã§Ü#éNœT"£dƒšS÷§»Üð­&êC®ß ûR‰îZ2Ùwl9á·nÕêþµ7ñ«;ÈU>ðš *pO±>½}ëÄ,mg¹ÖõFhæxn§{y¤†äFaMÃkŒý:œŠôß ø“X±û167±‘ ’uIV0£å•½CwCZµ¢3î{&à(¯b öK3aoÛ|rÞçÿ¯WáøY¦`²é×I4‹s‰y6ÜfN;Œž9úW¤ü[º¶Xšb1{¤Kk"–äeú£éúÖ¤_´…Ð;Êc1·IÒDz.3äâ3Œg­fõ,­ãÈmmô½RÞÊssk°,r‘À‘þ5ú/ñÈÜë¶Èbó ³Û8ÏUÛ3õí_œ~)/´«§‚Èéé3G¶×Î2ùYuà9×éÄ=F ?ÅÕ–êQo Î#Ýnõ¦Õ™ƒ’ÄžÔÀç±ÆjhÓr:Œ“E´»lŒI5)ŒªÊóHןƜsÞŸ$ ²K.AÜ ^ÿãA•hI w¨¥ ©RcÒ¦qƒZ†UA5 W"„E ªgj©{]Û¼2Œ£Œù…Z~ªÒ“ô4^áÆ{žž• ª¸ôšt€—Œd3[Þø}¬|GÕ~ɧ³ÙFqs~ëòF¾ƒûÍíÛ©¤2ô êž5Õ£Òt‹o6rwI)8Ž$ÏÞfíôê{ ûkNµ6:}µ±mæ–2Àc8gô¬_øJð‡›¥Á±G2LüÉ3ysú é*ã »…QVIç´„^wÀˆië¡^è–¯ÄK,úU­¼p¸¶¸ %¹ŽP à©õ#ñ_·ÿ£ü ñúú èÿÈ_‡~1…ÛÃÐ<é «öåIÊ`cïŸJÍîZØáçûd‡zNÔÌ|öŒJ®#1ç1ÀÇ8=}ëGEºòe–9ÞwóL{|‘}Èò;©íUî좗ÒÔŸ1d‘£œ§ïט¿b¦‘ßM±kŸ²K,¤´ñÛ%Ï/!ǘƒÔ.IÀæÄz‡˜¦ÜT¸äªíñZó6-.sÿ<Ûƒ\Ï€„¿Ù%e–Yˆs¶IJ–eàöëŒâºI×6ÓŒg÷mÇáKbÏø|$¹$™ÜóÏs^·§È©a‚xõæ¼£ÀL­-Ö gqŸ|þ•ô¼7£èú‡î´Ëk„»ºœ® bTvn½)0^G’ü3·7šDè²Å³s3mçé[Ú*´^¦rÂFŒzý+šø~?âGr¤ð/gÿЩ“éqê#2Ë$i’˱[ ç'ƒJÚêWCÔ5jïUÓì­®6˜¬£)ÔÁçáRxW]O kQjÎ#W]‹)ŒàŒ}îÝsÅyN¯«,÷/£XXG#óæDrÁA9;ö«ºD>$µ‰ÅùŽYs¹uñúÓ³ìvlÂæyãYö·8ôúà×+ãMZ;-<ëdºiä@»‹/’ãf;ç$Ô‚ûV^¶¸í¦¨ê’ßj)ºOÇ(™^2 ;F4¬;œªk¶¶ï2Éo4 n²Í$–ι¶b<³ÇVŒ00=êäZ¹eß/Ø ÊD“ºÎˉð tä‘ëÍYM åUBêwê@#l°£Ž{sÔ{t©l- ]ÊóÎ@V!(CùUVÕ­%ÔtRo,$·…¦iãas±Eꟙ3ÆC|§×®kZÏ4±´v—Óý5’ µ#Î 9ã’yÉÅoË%Ãf+m|#UÂzã=Î:õÍ#OâPЍú\è[6•^ç#ø½ê}àv2áÓ/,¶–]P™]ncW+Œ„ç²þU—ula'í·mq Rñ&°ÞgÝ“÷ÙÇÒº8,üT'É‚9rven‰ù;}¿*ê|ðûÇß5Ùt#NïRØÜfº@ !°H8ääô­)Âu%Ë[3“P\Ïcþ9’;Ûkv„F±«£ Šç›§F`T°j–[™ìn-|Ø\›HüÜl˜ÿ®VôÏ8+½Ô?gO‹öˆDÞ k ARbš)pCÛŸå\?Šþx¯ÀâÎç]ðåÎmrrK%Ú'þ¸¹¸Ïk¦¦½5Í84½´çðÈSe§jóXYO{%ŽÜfÚXfË-™7 ó´ó·©®í¾øRIÑôïÅ"FKtue€ Ó°¼üGZòQw§®-Q@a g…SŸ½Œu§^^èÀ¡¸[¶èĉ"…VûÄã·9À® \Ý4zõ¿Áø®E‘µñv—$y.ž‚âPC>[‡ùxˆ%OPM%ÀMvítä³Öt{ùo.%ÓáY%wÜÄÙdé²0A(ǯJòh'°‰WȽDäGˆa€KAɸ«V‘ÏFmõ)[ÊÝP\(ÞŒ>÷°êj5,ô_€>1¿¶°Övš€Ôe‘,ãƒj›˜3Î|…ã“ÃUmþ xÂ8­ž×Dyb¼g¸³û!ô™¡ ¿Ëô IÞ8Èü+LŸ_¶û µÕ/$• µ‹k ÅŽs Î'®kFÛÅþ2Òîm>Íâ ÐÛ¶‹ À¤ä|θ<‚ ãñ¢ì,VÁ>%±duîÒ¦{g‚geÔ’é#•9*Ç ü*»h:Ε+HjE-# »™]XÌÑ'÷ƒnÛ‘Àã5»¥|SñÎ&šmuA¾Ê9mm0[LÙó8ä69޹­?/Ó–a6÷é¶òÛXÇ*)P\~ñ9ë»§9#=©] ±Ã¼†šÒ™ žU²Œ#-ÅŠ2˜å Ïñ­€ªpiMx-좵MF ,r}‰¢X¾íŽÃ€Û 5èÖµ»°†Ñ¬çK I-aÄŒ¾w+ÿyÆ Éö¦ëž6¹ñ&“g¢ÚÙ[i“Åh„ÞD¤;êÄÉýéùF{¥&+õèÚgÂÙõ84»4½º,ešHU˜ 3ôí\ÁÖ'ÀV.@ÜÏ#¼–?—á]Æ·â ®|>‘$d%¼rÈ$ÜrISÁ•ÈüšÒÛÁkÝÀna)(†Æ“‚}yÁ«–‰érc¬’½ŠÚÜ…~)ø\ƒ‡[i\7¡¯æ+Ñüoâ;ÿˆ÷zUÞ³vb¿ÒÙd³»‚ùtÞ}y¯6Öü]OƒÈ“ù×i¸oŒ‘Ž{ÕØ–”“Lȶg3Þ<’y²´ìYÂíÜÇ©Çaš–á±erOAj“p@82±ôü*kÆÙ·\Ë2(Zh $¬ôËXçÔu´Åo%¼³4W~l¥ D_å+éÍnǧ‰É|Öï:‹;³o¨àCÛåËÉàp99ÓšÁðýå¬wº’ÞÉjbYȸK„$”.6êsé]ÆáK-B9›V†ÈI4~MÁµv¢ãÊÇ¡àr:ãš½‰Zê]¼/,Püº¥»]F,œÆÁŒ@c}8ú{ÖbkóFñK-þ¢ ,4Õ†âÓpóÇI~ý}ë§Öü ±¼š}Ì— %º[\,S”d‹#GvÎO®^ÂÖîKµ’xu›T#û5Ѧ (]³}IGõ> îz¼öÓÇ¢ÚÛÜÊg¸óíÒG=ÛÍOÌó_£_”?ĽÂj—'ñî3ú×絘C¥Z”:…¤j  ˆÀ=G=kôŸÇ–ÆãÅwr€“}+G®GáS&Q“°yl?Ù¤Ž?“ëSl>Yãœbœ‰òTØ ÒEòð9\¯5nbU2@@*?:ЊÎ9ªÒð*܃áU¤B¤ R7$wª³2X€ÎO@*ä¸@Ià×µzoÂÏâ&ƒU×âh4ÐCÃfÜ5Ç¡EïŽôZâ9¯† /¾ η7K-OÏ>0ÓàýÔ‡«tô¯§´MÃÚd6u²ZÚD0± ëî}O¹ëW-í¢´‚8`b†5 ± Â¨€©ªÒ°‚Š(ªQEÄ|oÎø1ã´$èWßúNõøqâxYô{)Öiv[…gµˆ3©t©ë޵û¥ñfqð³ÆQ²hת?¿ u6Ó®àÓžî+Ô{2 :#('n=Æ ¬Þå­ŽX .fyHV2Úç.yÇ®5Þ…s"‰Q-%’0d„´l¤Mümô ÕÆþÊ%þиEUe*䌂¥]Xc’,E¨°&0 ’#¿â3L,Í?i©¥imm K +#2¤lHóßß5ÐËŸ&pü³5¡®Èœùži$œŽÃ?:Ò‘KA6ICÇáAkCÉ< ]ÞÔÌà;æ¾—ñwˆ­µÏh6\G3Ù ‰÷¿ÜíÀØãæ¾pð}“}¢ä¨'t¬qӹ⾂ÖfÒ'ð¾—=œðÜj³Ì­xcR¢"©´ VéëÆA5<‹ÀK·H¼SÔ_N?ñêS&ß¾[ntõß1¬«|øk×—†Ò[¥þÓ–2±unµoQŠ[ßÄÖM$Íg €EÎN}ûSÔzå•›k6×7qC0¸Ý¶Lލ9÷5¼ºµ…ÎLWö®ÅG>jƒ\íÿ†5>!i%ðÖ”£|vË þôlV±_WÕá{È{gìŠýÿÙ5 ñÌ9ß=  ýÙ •?*ï5o†š¯‡4ëëè/´ûKåÝk1œ”cGüG xäæ²®êâ&€ù°‹FÆ÷U»Þx#îõïMYì't;Rñý¬ÚÛ5†¡n&âW¸ƒ`’{qS|³žëÀVTJ1;W$ ÇœzW?6Ÿ£à=OTŸN—N¿’ X%˜³8ùˆ>¸Îp+á+´?ô-Ù ŒýÖÁê:·~] V¾¤Zº‘ñ_BSÂÊ^½Žk³ÏÍÖ¸íM·üUÒ É+§Èzç<õ®¸>Hã=i¡£6ÈŸ.\²5>øgNºç!¨í>>c~&—Rliw~›:þóXµ;—k–E17›pë,lü}<ô¯PÒö¢â{›k‚Ÿ,Ža(Y6ÃÛ¥y†®ä±ž{µKéÖbY-Ô2NŽØäwÛø×¬ióùpíyæ”E'%Ѻ*¦gRÊcm:J<€êq##ã#ŒqÛ¯Zå[0ÚpÄ‚>”ÝOLMNÌۻɖ º3ƒÇo¥~ êðO_…Wª~Κµ“ö1Þnð+\–£ÿÒð¤Ùû‹u{OO6$—Ê‹1ù½gá¸4õÅ»*/' ¹$ÕåŠxØ2˜‰ðA¯¹õ?ø&]è'û;ÇQ°íö«2 ÿ¾I®WRÿ‚nxúÚCö?h—ˆ9ŒˆOþ;Jú>Ô¢»ðg…/î-Ö+‰Äþg–ãríÓõëVmŠŸ[É: ‚™`ddN⾞ñ_ìñr;YíÃöº­«ukKèòØï‚Aü+Ï5?Ù?âþ—â{/ÃÍjHØDÏo™ÈnØþ•,.Šþ-×ôgC¶KM&âÊu`É<‘€¯Œ)ïÓ+Äuk8“QœY‰nÍ3³Es‚'U?ºÇ`í}'ã ߈ ô/êþ¸ÒtÍF–£¤Ë̬w¬~ãæ?^=+Ã5/L5f“û: 8%+3K<.…fú W¾ãg3 jÕ`H›í¥‡»ƒ^ªN~•j NþÁQ§zRC!-¼?Üo|gŸLVÌúÙ^J–éñÅ#IÌʲHb3ÚššsÆ€yw!;[pÁþ}qVN¦\Zæ ‰µï­ep¦æÛðf<ƒÓ¦;Ñý³s(9ƒN™Œx\,™ù‡åŸjÕžÎU!Ï»>hÁþö8â«Il$S†‹q%—|aÇ_ÏŸð¥`½ˆW¸òÝãÓ•±´¡Šl†ùàjGñÄd/§Lè’,yp ÿöÍF¶QäIvŽ–PýñõëMþÊ*$•G–W~é?ˆÍ6&\‹ÄZ{0Yô¢ ˜Â|ÈTœý}+Ѿ xçáf“ªêRxÇG·¹´»…a·Yl  :±Ý:qŽkËÓOI»o‘•—vû¯õè?­"YHTóÂ[ ! µ×«}½ ®…EQ$íßc:‘ö‘ågÖ#Wý˜|F‘m¥Z4¹(MlÇCÒ¼ÿ㟃>ÚxsM½ð¬±ßÉvhm57säí9;ð2:׆[ Qà†è¼Ø1ïlÔRÚ@ŽÈ¢®Sæ(ÞIûÕéVÌ}½7J)¾©Xç†ÙÉII—×AyÖ&*Ä]Uøü{T¯àó%ÔW?Ú1¬‘©Q²ÙPG|V+Û#G˜í”ƈ47C-é úzÔ—Zp[ƒ±ÔDN·šYN8Îÿ§lž=ëÅgeͱ¥ÜÀË·Q©8%9þ•nÚ]NÉÞHµVŒ¹Ë´l˼äõõ<÷®dyÎ?w=ä 0û:¬Ðƒ±×1ö8ëM{é¤b"¼„¼êž¤2}ð}8ïß4Xw;Gñ¶·£èæÔj7w DmgœmcθÏ8¤Ö~3êÚÕºC«Í©N‘Ê¥–ë¸8*8À$W&ž"»rïjt‹ƒ0h$\ýç^„ÐþkþË£æ´zFqmh|‰Hß;˜`òFN”X|ÇI«|UðΫm*6´¹€w0t8ù~a–,i p!ýk¯óOa\}ÛñZלÿÄ´êÙ†88¦+&ÄHÁÞßÌÒjÿ‹¼vŒÒÙ©û><±çêj-Y€Ò/?å™ lðO [Êf3[ZMq=´ŒaX®UÏÇSŒçŠêR¹ðùu†-ZKm/¦Ö‹´s×?ìûøW+áØÝ•½½œ÷ˆÌöÉ,Û¡Ï™þ?ʺ‹=>}.$k [¨¬:{CzY¥ŠCûÂ=H'< zжd®ibç|©s}tñX'™u¶ƒë•\v ðsXÞGÖu+í2ìµՑ¤´}žZŽ99#ÈÊúV¼O.ˆ¤„Ö$‡MÃ(|H.QÈÈ÷ œwü( ^‹g¹¹¹KI—1ÜÙna|{•Éã“H£Þ¾­œþ=øpšpSe&¿¦ˆ6—gž„}x¯Ñ}W÷Ú½ñõ™ÎàF¿>þÁ ß~¥´Bsâ J¸ ¢Lù Wè-Ñó5 ’‰úüÇük&SF|à.ÑŽ•0û€vÆqK*@ÆNzUiY¢$ƒœü¸÷¡; Ã.1¨,<7©øŸÄQXÙÃöˆe·e`xÚIûÌ{ ©í[¾ðÆ¡âÛÿ³Y&Øk™R!ýOµ{ç…ü#aá+md™sƒ,ïËÊÞ¤ÿNÔÒL.eøá͇¬FÅù@²\°çÝ_Aí]†=͵©˜QEQEQEQEQEQEQE˜šZ(»}éqîih ÇNj•þ‹§ê€‹Ûk°x"xUò?W¨ ;Sø=àMd§x7A¹8ÆdÓ¡'óÛšãµÙ àî©+I?€ôÕsÞ$_ú ö*( OœµØàõùce»µ¾¡&ýõšåµ_ø&×û”o±kž!³“ª™'ŠP® cù×ÖÔ‡§\R²ÙðÞ¥ÿ¿ÒäBl|wr’J‹­26ö;\W%©Á/¼@Œ¿`ñ~‹s€F.lä‹O—u~ˆàQŽÙ¥`»?1õoø'Ä>Åí¬×Ú£»î7Q^K¸À~ugÇê¿°ÆM08_  Ta­5(‘ßü+õ£Γ9Bçã>«û,üYÑÕÄÞñUlæ!:ƒßîgŠãõO„¾ Óýÿ‡5«c;šçNtǨå8_ns_¹iHÈëŠ\£¹ø5sàp#%RÑ#´yÑq ®{þ<ŠÏ“Áǃ²’£»GrA1g‚=ë÷‡PðÆ«¦Ûí&ÆõOQqlŽýô sÚŸÁ/‡ÚÌ>Uç‚<=q£iŒ~KJÌ“ðêOÜ;È WH¯ˆ¡Ÿ û¬sÚ£m;Q(Iñ4øhÄ‚'\søãõï_´ÿ²GÂFO2_iÑ?÷­ÚHOþ8¹MKö øG~ÄǦj6Yím¨È>¿6iÙŒüƒš n1J‘H„ö8Wï®{g¯=j‘²†3¾(ô÷ù|Ëudd"3÷×õ=y¯ÖMKþ Íðúà²kÞ#³Á,¡®"•Aõæ:ãµ?ø&F›*9³ñÕǘz-Þ—®q܇{QªÏÌ¥Ó’6CoiÑÀ¥b]•-}ïÄsÏoz°Úl¶K°%ðH×ìá ¸ º#Ñþ£ÛúWÞúüÄ‘àÙx›Ã·E~êÜÚKG¡+»jäu_ø&×Ä{ÐAiáýL (¾ ñ’ŸÝùÑx¤?™ñèŽæÞDIg¿ˆövó!V Ÿ»/Ö¤k‚øY§Lÿªq-±H1‡ÿë×Óÿ°OÅ*0„¤¹O,¡û« ½¸Þ9­rúì£ñSMùn¼âf_—#Akö…Àèß&yâÂÇ™ÃçG¥0¸*ó˜Ÿ,™ÛÓ·¥ršVµŸ¦xjÆ]:K§½SÍm ‚r1‘Æps^™¬|:ño†ìeQðÆ¼’1þ÷M˜3Óø}둃Á7ö‡Ãæò'´ŸL,d‚XØ‘ÓÛ­MÊ0¯¼ë_ˆïtðKäEe·Î vžz[ âX[$’ÛÏùô—€>?é^ðŽŸáûÿ> ¶@†•š&¸“­ŸÖ§ñ‡¾|LÑ%ÒuÜik)Ü/,lâŠh˜w G±àׯ.pRuÍÙ¦ŽIU«YÓvûÏ´÷ó,щ`XzŒÿ>j=g+¤^q‘³¨«–:,úzKng[˜£•…»·ÅŸ“>‡ÕmkNÔç´h- ¶•e]§”®Ï~3ŸÒ¼›ÛCµyž=á/ êZ…—Ú- –ô—0­Â|Ë8gÜð¯EÒ< ¶¬Iok$ˆJ£°w/ÞÉÎzœb©hÞñV…Š ìž<ä!R+bK¿XĬ-næÈE¸qëœZmÜ„KD«mömJÑe€I ‰äÙ›ç¯b/ Ý[[Á:5£ÆÌD(nÂ’GÞÜ ã¾z×%ïcp²éC©c˜ãÒ¶"ñjBÑ%Õ´°I+,jW ǰÁöëRQë¢3|tøh„ψ-NÑÈn8¯¿••ÈÉ$þuðoìá—Ÿ¾…Õ¢ÕÖrX€±IÍ}å#xÛ Þ$ô4n}åÔ]}›zý¡âiQ3ÉùŒñZÿ|}ã[[in¬ì”4Áq¹¿ºžþ§µkøá›ø¢ú-kR­¬vŽ3ò¼ëœþ žsœšöË[8¬­ã‚ÖcP¨ˆ0Ô(÷!² 'F´Ð¬#³²„AvQÉ=Éõ>õ~Š+RŠ( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( Š( ›ÎE&:ÐFih À¤*ÇAN¢€ƒŽ¼Õ[­*ÎùJÜZÁp=%ˆ7ó«”P!¨ü!ðF®¬/|!¡Ü%´è²µË겿Â}Q Ïà}1sÞhæ¬+Õè¥`>Ôÿa„ZÜÐî¬ëÚúQÿ¡\Î¥ÿîøqu“i¨ëÖ,}.‘Çê•õ5YìøËPÿ‚lhrlüo¨À;-ÅšIü™k˜Ô¿à›ZÌ`ýƒÆösîÜÙ:Ñš¾ô¤ô¥Ê‡ÌÏÍíoþ ¿ãµ}Ð_xwT9ÎKÉÏü +šÔa?‹:` ‡¬.ÀÆ ¥ìYüŽ?JýG¦ãæŽTÌü×ø û>|Dð7Ç _k¾¿²°‚Yä’ëâLC&2ÊN9 c½}³àré¨k‘tÃbýßßÚ½?o©qB±¡€p)ôQTHQEQEQEQEQEQEÿÙ endstream endobj 11 0 obj <> stream xœí]Énô8¾ç)ê<@g´x $ÿü¹7`^` L_æõ§¼É}¤e¹ä*Ù!äÀ’©ER”ºüïå¿uùE½êK¥ÍõÝvÿÿüçåï¹ü§ÿ±ûûóß/ïŸ/eõZ_j£^‹Ëç?.ý°]]>ÿuùUéß.Ÿ¼huý]u¿ýªÌD©&Š(úÕL”¢§”Wv#¡„ª±H9ê©H3QšžRÍ„ÊgÛN5WÀŵ÷ Z÷>5§¹ÈB©=íççËïÔpUm{m|?\æ¢M?\ZõŸÔsíÃøY×ýÞ WB×Þ'ºK´_ûTÎ%~ŒŸLmÕ¥Ïão~; o,]-ŽðÓo)ÔRsã¡‹âZŠŸë“ m&í¾H_Ž@¾äI8S_NL ”‡¢f´£¸ojuðª)à ‡kˆ#U3Ú™`üOìˆýúF_u/5kpƒÒ1+U ë 6dÇO¡ðÖ·ú9¶Å1õukã½PW¯v©Á¾Æ£ì¤-š¹:¿…S§¸ö¡¦õáÏ(V“Æ×°ÃR3âT/F›k1vì]áWÛ² ƒ¦ûЦ|Ã!¯5Z®¥¸þŠqX®énÔç©ãvŠmºÖ’[å#îo˜‚ùh‘Tôž˜/òˆI ‰¼ZoyãanéÆÊ·Â`éï"w@¸ÁœD€“{Áu` ß¾JYŸ% ’)¹ucš~­Q gi£e&ÛGxá‘nÀ›ôšòR•uØ8É= è ®åa£`öpdª©ˆŠá>MÅí¥Ø8[qÉöÌÇ$ ´‚JYZûÃU±ã7!ß<.#ÈhëÚ6R*ì3L”Ãm_ÛÇšg!h…#L•ša„®‡3‡Áþ ­Ê,¤º7ïRÛc½&]7åßêê /¸ˆ^\…ÝEp…õhÓŽûÌ­Ä·Q.Ëyv¶Ù\W3 v“Ã)7Šñº%F—ÒÒiNüP—¨æ›,St}$çëŽ- Ÿ¤ÿäLL¥/y2•¾Ä•à“¨ËˆiVøî·¨ú`9ß 1Œ%\S‡Œ;ŒÊNsó±/¢ÄkȬE© ´”Bت͠æ7¯Å,%¤„”éÁ}Ë`¨cüÊëÁÐ< ƒ0ü­Àš_C)!%¤Ä9Jð`HȾ1®œCq†á0¬AÐ;s§ ò·¾p°ÎÖâÉÇ›7~ËÐùÃZZÑÅ–V•Ãð‹¹ÓÎaÕÛ×@ûXoG8B#Ï,dpýéZ;¹Vî€ÍÐ+<„‡ðHǃGbóóÈÒG³•ML€#„3>Â-Q‰2¶:IôÊo˜ŽÄ‘ÅS)®˜Gÿ`‰€>šMW¦æ¶r³kJvzïX‰»Rl‘\Ò—< gê‹v'°K TÃ~3@l ãL{aK¥8›Ùæà6"ŽŽ€7Wøƒ†® ݧÈË ÜßËŽl†!T76ÖÃkƒ¹ðà· ±Vø-Óßc/KÂ_pàþ–ýD@'ÞU߈ˆÙ¿¦Ï(@ ñêÀɪAÁ•é²ÂCx|O<$ÂÏ._û+ ÂjïChqçºgÁ#Ñ¢¡ZÍÆk¸SàßÅ“\‡÷.®i:“ 5ã÷¬ÖLýTRBJœ¥Äq˜FWËc!¦BXf ?AËV\½ñ,|ãë•êNÓðõ0ßG8 ¼ŽP¶Ž¦KG—ÜÜÂCx£ðà”ï!ÕÄ}ØðipƒÛ<—Ó ‹¦á(e«Gß÷m4T ƒŽúÊà/ÇÐ3ÿpkÍ8àësŸ®¾l[-ŒâWM> ‚æ´·N¿ZÊegj˜@>#A:þp]¨..µ’ªàòÉy?‰æAŠ~E/BðÌ@÷<ƒHöîò‚‰;)Þl &Û²vu_ÁOýŒ¢¼œ™3ýÁA3ð-˜ôL×`j²¬¶¤(q¦Ò—<™f[­”8k ƒ)‘ l1¸hV„‹ ‡¯¿À%NÈ^ «”'¤g¡oyDØE!¥×¶Ë.³;mÍ9ñQ—]X0¯º.jÖƒÖ7Ш6‰î‚G;˜­NNØú­ÞG†5á” g8PIuůØ-ÑøxH÷«žÎì5ó{.>‘%Uº»ANÄÑê™6ôEBÂ"SBÛGà@þû¢"œá8¾²½!ڕؤ³Ú'8‡¬íÁl¹`WÞï~¥Tô@Ý,9`û멃ÚаùN)ò¥/yòè '© + •”вã-iðÅ…Ïë E\Ù! Ùû£­Ž3­té‹ôå鋞Màô Õà³”Ʋ°„sƒÕ ^'x¾…0ÉÇ¿a§'«'éJª¤ {[2Yv/}³‘rï á!<„‡ðØ@Êh@»¥l™…&¼Œ 0wËËCDïx-öf< e3@€![óR¼7XK¨1¯Tô6ªúæa$ÕƒŒ¨Èò´®=‹yiçÒ÷ÏÔ!áÙß(¹‡ojEÌ| GÑø)/}ø˜_xœßÌ[ñœý^ÑcD,Îzc:D»óÍOgL7µ¥§÷QmÃ`µêTHG_8Y@MõzYÐûl»ÉŽ˜‹9ÅÕ]âøð«É#äÔUƒ7Hîàã È0Öò:Tä >bÃÙøFÝœ ò:)f˃ÙÖä„FA¼­cœÉà÷˜§ˆw6r4¿ˆw?(~¨÷!lg'—ÖcwQ¶·“¤/G­ö<%8L¡¶m¦T[\‘aL ›E½c£ ët²’€¡®]ÁÍ‹o1vÑÍΓ!¦Ðô:cW¿d{óøNŸpðAmJ>)lãW[Ÿè"MìÇz©¶%ȵªèî?ò˜žœÍ0Êe³e®\vÔ˜Å.;cî^·{¯ey[ × z…ƒ©¯ÂQ8 × [ŽÊNÍ >dˆÁÆÙÊc²§%¾{L±¢×Þ QxäÉC>y”>DllL&³Åó¢~x%˜¦—=œØòŸ0|¦K5¡–ÕvGNrXÝe~ ÿ½-<„‡ð9ó Ñ²óQB ¿oËx©6ÝmBxyü¨¤„D}t9ÒY›*úþ˜vɱ·NØ­rbÜbW¹icÜ,î|ÿZåasE²…Ÿ2ÿE§¡‘C“o²й¤/y¤/y¤/y6ã1h¥YN kê-^+»á~µ²£>¨2²cVÖÀËx% ’`sº§T0•¦‡tÙËT´ A‰ßq͉ }É“ }É“°ïÁwÕw9†¾x8ÉÊL Ú:x¬,ÛÃëß#áƒôÖ¼=œèVÇÌ0ì㆗ºšéÜ¡2'ÏOëwžPF?:îmym¹‚RîSá!<„Gö<îÿ„:BÄБƒ,ЕIÒ;táLZøœÕÑ‚¹ÏlB®˜õ«]JdQâ8L¥/y2®–Ç1B¢Dã˜ÝâÇ›ŸßƒHÝt= .AcæW“usû7¶öKø¯ê:D`¯ca-þ•.W‹e{”½‹~ØN «ÓͲ窭ºƒ;¹€ïPUž$„Sx!vP4Œ˜-q'ÜëkQÇ¡ðõþ-ÂùåòÈk³ŠÛZ:i¹@í†ë7^ò%pàõ6 ä0!Ò)³`XÙspf×Vл%/i!˜•ÚÄB¡½|…¤{94ÐvwlY¡¢j¼SÂí9”&N¬ºÍ°ž*VL€qôaM_KbÕñõÅ&+XÙj2«ìI(æ(Pv¥Èõ¼GàñÐùêæÐšRh®>þݺMâ¯5a3v1®)Höìú¼BÌ'-qCæ¯\eíha°³“7ÆA+ûì«%»³8‘‹†Ž¼’;rÂCx‹:Ôæ@þuÝ ázE¦tëmx{I 4„ø`ÆŒ ¡“zz•;ˆ% ¾€Äƒ¤kÊÂç¦C|bìïYHò‰|"ŸÈ'òI¶ŸðXN`Þ8]ί+ô–»–ñäðËÃp™ÂwÑè²Ê⃇,ööäy‡^Áä"±äÐòËBrY ïÂC>‘ONù ÕDCu‰>£0T‡3l{6I—aÛ}oìŒÃóÕD|@]põ®˜|ÝÀ{‘|¸3úRó±–vY Ob*}É“©ô%O¦ÙV›i W «ƒ9Û¢#6œ35ssgSš—,ìgÅ×,¦§ìµåƒÀ04„ݱC¯kûZ‘ö‹»~6CïZ‘Y"—SÓöMBÍx8Þ9&ƒòiÐo›”ϰ(M"õÑó®«Å'¬WEþ`PèŸá«éÐÄæ$Øéëòç‘:v’™®×ðº7»È¬R6L,{ aœy¼‡©ô%O¦çé “SàDÃi".!ˆQ+ $Ùb”3o@¸ÛȇÜBÌXzP·œ0iªéNDba÷D2m7ÈÔrpª_šd±¹Rh“¹¤/y¾S_ø£%Sà(µœä¹%<îá“Ôú 6GÀ 6Bƒ÷Üψî_¨@‹…Z& ÌÔ€ ¡rì T‰ÎBû OÕ߈Ûƒ¤¬–¾„ }É“°Å(ù´Äz£yÙKeÁ'[\º¸­¹jÚÎ6KUÃ6¬íÜ»Ôp óßÄâ[¡UÇ`ЇÓwñï—ÿ‹Ûáž endstream endobj 12 0 obj 3523 endobj 14 0 obj <> stream xœí•ËjÄ0 E÷þ ­ M%Ù‰m:m²ôú€. MœøÅhœ]—!Èõ±®ì áOýÂ#vqx[¿¼/ðö?ëâò\¾ÔiV;–Mæwxšˆaþ„ãæoe;ذt itøUH‰p™ˆ‚¯Ë-šì*‘)ù¨`×g*:à´~ÖwÆÈÉxÈ[^’1g¢&Ô™¬Œ¡QDM©6ìóù"᪯Dq¡,Ä-}ͽd¦·lèùæ>îcòßyAzÆYEA°uÁ¸U¥¼¬'…؉؉"mª7Ë|k¶)9c’Ð 2¨÷Áî6Dž7µ¡ÊÙ€Sr£GºtÃÆcÀ6Û‰yœZ‰ÉAG”FaÉt3 Â%Því ;Ã7ÎJ endstream endobj 15 0 obj 305 endobj 17 0 obj <> stream xœí]K‹ä6¾Ï¯ð9Žõð –ÀÌîö}a  ØC {ÉßÝ-ÉzØ–í¶Ë10µT*É¥ïS•^yöïË?Yžýœ_TV*Ýþ¯šîÿ?²ß~Êþ¾ýØýýøëåíý¥(/UV6öb³÷ß³_®&Seöþgö)ÿòköþý¥¸4mÞö§Oùë-A©V–KùêSŒO)î)ù¥ô)WŸJ•Npá*Ÿ¥ò)õ-¥ìëöe¬OP¨ŒFU¯žö)ŠÁú~¾¥|}ùFöTeZ½o=¥3¥o=¥îSÿ¿Wª¾ÖÒ%xUÕ] s ELßßd•ÃRWP*ä𺛷[‚í»Z"úžÐô Ô’å>‡í+j¼rá“Ý£5)_uÅU­Œ+RÃ^h`Ç¡VîÞ—ªìMŽR¸vÚ-Vèýy$áмoÞoŒÏ_càS—¶M~kÖèÐg7Üñ„$ã42R‘Tdï"$æ4СðÒ1%†•Z‰Cð…W4Ìá2J7^®a+Gí‚bpCǃ2ȃq-£]‡Wlµ^ÓÐo(ÀÛ¢ßɳ½ˆ“8¨«56 …n`;·±eä²±?ä<®bl鲱丫Y#!ÕñÄ:8ü§l ÿUµÕÂ\’Àø?#zæÃì^7<ê!P¸‘Õc=J@ÃåÀîOãð‰"V ¢ìþ@ü…Q3aðwT*Š]°ÂC \M{Ha™$à×gv-ivNew×uþ^èä{#ªæ‚Æß ObeyT÷Cè ¼ç›­™ŽBÇœ˜Šè@zŒOñdMä ÔÏ㜩؂@ï `‹½Î‚â¶ÜŒ†4Ìçb‹G—ú!Øuøà‡T÷FbGQoµh7aÚ1Ã픂p{ö%'£ï£uÁÐi£“q—›©TÌï£Sª€&¡JŒüLešèNÒT§©´N&³Z)BS‘§axŒر4]失‎.lLø`œÚ"3aöJ5œ¢ù£¼ÈkbWŽÄ)^ÆSÎ*ñ²Âv.eßk†?f@“X¡©H*2vˆ!…hÇíÏai§³€žR Çá#n®ÜñºBˆ3^…†û„ZΰN.«|òd"<khë=þ E¢Tä#áyˆ…ÑÞ¿ˆ¯_Ü&ŠŸd$”Á“ 1ТÉ%—³){5$œŽ\^/ÔA|Ä~‹§û1·íH#Ÿ‡X#–‘jIµˆ«…gbÀÄ2Ëý o¡Ì΄G0Ëk‹¼wœÕ:ÀÞ!=¾Øa*˜cüýÈÑ­Úá“ ÖÂß ¶*Íá/NË?Ûƒ:cÙ¼ûêäàÙ6n’rœ$‹ò”‘a”¾nQׂWççTë²µ\r´³8´ÆE…kD—á!”èh-$/ZÆ?—}Ð;áØí1»Âœ€+ë¢QíH«°Ý¥9Š‚»"ΑŠÈØXò”jyà',&øàÅORkëF3š)±¨3aNÉÞÍÑ/s0=$LÙ¹ðî v>xÂéŸiMÕÒ+<¤w$¡©-{=Jž‹ˆaËEEÓVD°Ò€@ŽÜCTÓäm6¢~m´éR Qt0x-TÞÉ#„bŠ|8âý-ûñ’Pý endstream endobj 18 0 obj 2513 endobj 20 0 obj <> stream xœí]ÛŽä8r}ï¯Èg®I]ÅUÕ•~»€×kÀØ1à}Ùß·”IÉ8 J•ÙSclЀ(‰—¸œ¸0¨ì.ÿö¿—îòÏÝ‹»ŒÎ¯ÿOËöÿßþóòïÿtùŸÛÍíïoÿõííÇ·ay/S·\~üùò‡k¸¸á¥¿üøËå®ûÓåÇûøñíöÊì¶>…WºñöÊvÙm7ÿØ} Sjx½58—®ßn×ÓKˆ Îņ1=1ÝßèrËG݇óì:Ü®—$MËõqZ^äU[ý0®«—î¾zqÝ\‰ÍqCwjå =6¦¶ð2¤¶ûtÆÜ0߈¬!Ωç߿̩áNÆ@+tË­aΜøÇH î­K´Oóõ£“K/¥™øõŸ{¿ÏΣóéðùÃì>XìÔWê.C`$£9ÐúÞãN[Lw ÄÖ¸Àè!N„H˜…"pP)jXIŸFvyú0OÊáô±Â{|Ë©Tè#á–¬b|¨ð=6ÍytGäñê)‘*Ý$oîʤ—ú¸ÁtUö Dè3ªÔ ( š¯b]߯óC°‹ƒ¨è8Í›E¨^ñsœFb?輦YªD|Uåi•¹÷$ºôÐ¥pà Ä^P¤ãÊâo ÄŸKÂÅ€FÛàTç«[Çž"«™Ð(Ëlu ³E &õ™ã‹“hTÚÜ ¾X/U~ˆ¯,Ü Ù™&À½Iã {¡A×O‰Q‰Vpê#­àê>YPœ¸A=séÉÖ4Ÿ±ÇP&dÍqQ²æ€2>D„s}îÕx'NC‚ÑàW’J8jAï¸ýÏ^1¥Û%é¦Õ¼3?å&0ÆñA$ÑìI‚U‹'9Pk_ÄÒ”}ˆM•2\ÙS‚Séµòu¼´Š­ˆ‡ýHÛÈìël~/k­pØPói‡fb„Ð]¥fœÅGàÐTß9¾Ibü=v]C@€@XŠ!MMÀÒ2ÄÓ•ðÓ!^©‚Š®šþ=Í.Gà™cÜwe¤°P¨ß‚Þ…N¹ÍÜóð7‘Ž €¥0ü”€˜9³ïƒóÓôôlQD’Íø-ö {©¦·d; 0 ì#qyÚ ºWÚ&I&ìŠÇvQÅöTr†!6؃'}åk¿Æ¦ÈÒ0<íØ&ç=@GUl;„)_ m®Ž®±Ÿ¸¤½Æ—ˆ.£'£ªãú¤K“Ê' 7,™k ôF@!ÙݶÍù“ÐÏÌ0¡§wD©ÉÖì+µšæiˆ ­¨Ïð2ËlÓ##šÏ: @øÌój@Hà Iã°¯Â{p¨3û$>; ü 3¦á ò6ysDÞž’ÑŠgð jfÕÃØí¹Â E*Qç®$)gA ÐõÃúbý w˜U}FÒx±xÏ….m~ÙìQ¦Œ%_V£¿Œ‘–n·\…@LjãPÀ»p.Ã[\9 i½Ö@¹å7ŒÚ€›;»2ª¶f…€xc äOðHpw#¹»ld†HçÿøõÛ¶Wù÷Šÿú/ßnÛ¾Ëå׋óý:âí⯗Sä¿›1Jã®Úq{Z)„ïÙÌ&yz®fkŸgóËDØ´³ªGmxðÄ RÓE¼­eeÕü•š~ÂÑvk¿È…HÄiÇ󤆽–­ûúLÛ5¤¼È?\vHgšîRöбñâc Lΰ,ç@IÀ|Ê£¥ð[3Wê¦eCpmú â¦y1<ž3»I¶ÎŸ±M@¾–d¥ž(Z­n©SYaâ1*ÀZC «8´ÙÞÙ'&#¯´ž“)íê—,L­|Ãù©ê¹Äci“• ‰ EüÎMLTß[6¯PS ç\|´ê&(„%>¡o§ð.œêߢžãe¦lüÛ‚(#iG‘þrÈ Ù7ÛÄÜ›kñ¸¾fJÜrJŠzb¼ë²BÜ4aÌ€Qw„¶¡6a2ÐÍ èt¸ŽËLû5$úÁÖ~BH%¿jlqbŒÆÌÉaåØ [ =mÃÿøÂµÊ¿‡¨F÷ÁÃ}P@‚‰}¦ÖTÍÞ>Å~ö’ÎT-){XA[|ÙV³=9ò8»ºz†š³œt6JxbAÐèÀÕÔiDñv 'wâL4ÒïW > ¬ªû'Wvªï‚;ºÜ<¶GlÑ>¾PêKU<5Šsù•ŠÆ,ùh)$¶Š§­.Ñox´›g|@ÁݱÝ–"t]ù‰0ORþOL»Ù!¤ûɰҢ΃%pµð¸_^ö fƒ>QÓ?ògÔCY¦$ª¿~Fm?¿ÒºKaÏ Õ•ðaÑ4»¢*Ì”ñ†ÆºÏÁQÁzq¾Æ"ªõQ³ÓyëNì40Eëúˆ×58ÌY<ï€ÎjSæ åIx—šñ9VŽGB{n=é2n\§Ë÷úî÷züc~W>º1ÿx\· ‘ÙJç(ÈÐ×øÎ̳yF#X4ôPÌ@¥¢R” ꯜº¸t°Ø±A¹§RL &î" VŸdâDåÅè3SWõtV¨Ã鹤*T×=a‹¾Åê|:œûÉõR çNœEO®. œ?¹æT€ZC̘YXµÚå+ì›­‹:"Š)[¶t)Ã*hÛ­ÊæÅÓ²Ú˜KX¶:Þ¨|¿~ûÃÕ‘kõƧ×q¦œ¸©š4"i’¯ûÈO5ŠWR§´8>…:U‘¥gX®mÔé§í€‰Hõ« ýÔ+pv"¯uBEOŠŒ6’èŽw{ëÓ¾Ÿç3É‘ƒ»Š}Î0È,£'r ©<)Xlf}:l˜îŸøàÑ^áÎ\8–`•L˜N9Ï:7fvþ_U)=®0n±8¨Èê'}![[3]Û~jÁɱ½OlW´%ÿçjó8M±:lPPÑÒiÄä+[.ªVÃ'Q‡ÍÔÑžLPú"CÊs‹ pdÉ÷]7véh´ÏöŽ Ð{Þ4ÐÏÀø ™ž£™õÙ‰>DP6¯!Û>nvÏqÐk8(»’÷ƒ¿¶y<‚¶ ‚õ-‰j»Ÿ'#Ì7¼\ÝÌ1YWùÄÏÎö¹Pƒ •ÃçËB›klàÐñMù3%(Rå[ ‹ª~³D8ž„Qȳ1I,ùÚö,$„´@u°z`Çœ&-Xx.d¬Œºé}蘘8K˜Øžd~&&ª¼è'Œ> Ò¶0Uãa€Ÿ÷gTÿÛaÓSÀBWèöOñà½)Úÿð(vy+•<¶D—R\Œ'^“}·é‡ù× ,¦A¾vZ¶Å–©¨¼z–Í loþö•’ÏÍ?¶ìE¯=#‰z+KXÙˆ•fÁ n4Ÿ²7‚K‡ kïþiÖ˜bf&×Ú¾Ÿ‰ªï‹ÿÓN:|Ãòž[Žÿ~Ä´!?Z®ùG€SD|d:G Ãcj޶4ü_t¨ÞRB^ ¬oç”XK†;‹Ü¬Êƒ×&б/et#ZìØŠq¥-²xÀ§‘Àï„8&ʆkŒ^fzøÍ>³ôLùïƒY@däž}ˆ/Uw™½ÆléÐà‰/øÌOû¦GÃIBé­¤;}§D…‘nK 2¢ukã‚ ºSnªÔ{¶%’€m}þþ¼¾Å)oü|ŒÄ…·8’Æ¿Úó©„ÚM¾A¦åëþ - ðF…³­niA„QŠêñT-ù‰ŒeC¾_àDÕ’ŸÈXQ6äUxQµä'2f” ùþÀèPYœ’wO±ñ7¾¦»Û÷~û•[Ný/äÚg3¾Wù‚XªWDv}*¢ïrÒ1}¶¢Œw½ªÝõ~íLœKú€``­ÅÁ‘8[~Z¡œJ¬­yhYHDpZ·k/é7Æ ÷ðEÇ–˜óê9K=ì0aàÓI'riH|bGF¤zÂ0¸B—¥ÌÝÅkÜÖ¥Úä\b×¥˜†­«xñ>v^T7¯j˜ 7¤-¼ŸWÞð‡æçpr<ñËÕGEÌîÚÁ R:98—Ø”½qyƒ é§ê 6F©/¾¦Äi©j͇í#™ÝÂf ¬v¯‘ÑYQVîó³\ñtb¡LC—Žn¨§o /~ðgx×kÇý^‡×^#Ië‹×ºÙ½Ò®®ƒŠ>gYº8(ÛöËO¬ÝL\\`y0õÙ;üAlÒ:òvò„zT"Óª¢«e µ¬%e‡ˆ<÷Ž‹=µ¡K(„¯ Õ\@U|àO„¨q#Ï´A= ûnAÁŽA~d¯ÄoÐù'b&F$ètSH?;beÁ®-«(+® 4xç—4XPÅä•5CÝÔ q;S¾«<Šà¡îØG¼é]ÚÓÙ±$ôÁÂB³îjJ³,—ñxgÖK¤®åKNƒæ‚âI«ïz&¤?¥þ®óM'LË-å! 7|·¥ßiøÎÖB‹#¦s`tSœc¤Êê?KÕ±õagž@­øb²Ûš“ð¹SçàG]q2ú¢U¬TˆT"J¶K,ž2Y6Ý&»“‘˜¸*ê[\@q¾v£lXGgæLF0eœf+GSæ:;¯™'Y žìqƒ êX&I­M$]ÚN¯xîŽd€|¼!ƒ¸7&{®T°B+øË-O$¢­Üõß#ãUÄ)76IáüFZphðàHEÉöô @ðeòÆb8>DNœ}ú”ÛÙ§j`Í>¯²¯É û«ÐÇàUÞÈŒº>; |5Ô³ÒñÄ4û &¾'hϸ‡ìB¬÷éÊÄgP;Å 69€;þLífµÙþTA¾eUºÜg€áY ÖkL`· !ôaH³Î¶¶§”5M\"k³àáL? ãs·CXÌ\Nü‹{U-ë„R)BñSåo ™Q}…ˆ¤œÄ6Š£1‘å =mz‚©âK—×2…V{1õ)‘¶»;nÏ¢´hZâç-'ZIExµL"âXQ0ê;vç®XÂLŲ¤\ê%Öê&‚@þâêéórw_- °]Xðò40£oJ@9t“Ä)ê¾ï9Få`6Ô²OVj£Li5BRDu ¥Ð~uðlèÖu/ÂnÔá³rÞ`a-®²ëÄ$挫 ¶¤¹ÀäË®ÔÍECGlÅÞ¯ëmKÙrC}þÑîìxÛà‰>(¿ Þ‚¸Ú£Üôˆ)©Bz!ƒÜ—¹ˆüµN©:¬\ÈWÛ¶…w Èüó‚[_FÛÀåÅÁ¿•Yúù·>CS‘Kóœè„¢kG‘\bHÇ#òÂù “£‹"_ÈU\ =[œx3]‰™p¯ÔÕ“®ã[MGÇòkFÏCÒ]¼DZ€5UÒIÝ›ÁñÁ›r®Á[Ò«b,;GmùDÂ\ãmNAœN1á3T‘uád-7ËÈá?dÕ{¾NuŒªš-%`—ÂÄAÙÑäo‰B‡ž–’ëèóŽó싸Ɗßo¤¶„|€ó`€^Ú¼]˜Cƒâçõq(·_Ò‚ M:GØÙù-µN‚j™^ʰ ¥…LGìä)ù»oäš5Z¿É×µ”gµ÷8Œ°gaçZw$ØœùzŒ5P˜¯C:®!–èâ¸7Ä ¸¥.h«í>X†BXრA´aïf'Áú0sàSØ)c0i4~Ž1È›æµ1ðæËfóýÛ o• Þ¥Œ`_æEŽì“ÉÇÈV‹’²á.T{Ã.ÄB¬ò§N Ÿ¹}6¤Ñ¤C,EµÌ‹øöàRœÁ~é]×`ÎrʷȇCœ™«r0®#7Sw¹ù ·-d„ž‡‹’„•Ôëuê•ðèàQ­.ûjàxÃX’Wlx i³/óéä$ܨö!ŽmƒÊ–êì”c܃M!gQmo_Æn*=ýdF•b=uè·´(«…™nYì=½Fc2j2` ¨›ä;;Ù.³w‰œú{VwTVŒEæ~u|¢m5B=%ŠÓʼn}?Ä#mFmU–añ4Ó g˜Õ"‚ƒæ=C™øy (MØe)8<”Q~ÁaÝË%ë[^ ÿÈãœ?ž[gÐà <¾˜¾†ò ExU÷ÁÏÒv²r2†¶ßô­oŒ}´§ôAMBK39mo–cP11µ}zÂðN…µöO¥>žCPÉ êJÛ¦ó×i¥ðáN°Üpº C¡á—÷—I{‹äúÏwÔÝ0Bõ ,n=wÎãgº ƒ°9gj‹Ù톤NíûýôНý–®Öò¢‡ ¶ÜxŽõÐÞÚjjµƒðçôžmT ¡ç[rÎ~„«8Ì×_ý qØ^e gT6õÅBÄ §¯4õxD 6ydãÄKŠ¥½Gpn,KŽÓ9nÉ…>þaÉŸfÉ…Êl©ZbÆ)eŸ6‰‘+>Ûv岦mO<ÈŸxüNõ×ð'Š6úV`ø³< åWhe´ uÀãdû¨ùÈÀR¬ÌX!Œ¶¿ä&uÿ¤g£å?ú<}§N?Å4oe”qŒlCg(äÛsOÔ­Ñ»'{ÛJè*%«ÙºVZƒv6}ᾓx>‡Ïçtòå_Ò–jñÆtV>h³Ÿ·Q¾Õ;‰êgi¬ÇÓœ˜‰Ê{¨åù2<ÒóÛ”^[¹ÕÇëx Œ{"åfžîìÞfé 'ðYtá‰.&§Æqzxž{ÉÏn?—S£>ðƒÝIuƒ-†M>JþhÃÆB㟣ÒÑÄŸDò¯nôŠw÷k)n¿:½Ÿq?¸¾> stream xœí]Ûnä¸}÷Wôs€8âEj XpÛîY×=ýéìúù³o§¾ïž§øç¿Oyê‡ç3½5ËÿçoW¾V-ïãs~îcïá¯Øyz;£×«©wz ãÒkìýþWê=¾ ¥×«Ô{z̤|¶‰2÷?‰2ñmè,½]= ÞYkšyê h~ÿcE²DÏÔ ã†m!¨F’| +ŠÓKË€¨ŒèÙÌ+ž®è– h’×DŸü½O¸ë‡¨>¿œH3.O相Z;Sùão§?\ýÉts·ÿ8ýdÆ?ž>þõ4ÎÓê–—?uo·çð§1·?{zo|øbî‚>šîmæ>C'¯Ýp{ôþñô3›ŒñvîL˜ÍK˜Mì9tsNÃßø4T˜ï¼øð……ɘ.t;ÄGîöÀ¥D2©Û¹—{ÇÆ¤gâ"Ý,Ò~ó"i ózËÒ*JŒèù„ÂB©7}äÕ;Ksî§y°s7Ìy›ršîó½’›uv^axàï£ÐŠÜ §ï;ëÃvì‹°Ç©’š4Ìcì\7†®MzjÞDat Ë ‹î¦Ðw¿–BÖ¹…×…>.+nØ>pÐʼn]­öv}"æ…¢¤’Ö~*K††û"ÜlxÒ¬mÓÂf’s_¯IÊjz;E9¶Òô;íIÖƒå” |Mö#°À§‰ÂŠ")‡HyÞÂú8÷ÜzeÂÚÛ—Ð;‘ÇpZ¼„…e³´á«äB?+b³ù¡K&Ëñ!mÆß™Ãž-t&Foœy™ÿ½€Üðym­ ”’}ç,› Ù3¢‘}¡Ù½ñF|h`<•÷Q WXcÉûż—Lp_7>ÃÔÏ[7™4‰GñèñŸÝŒ½7›¨´ÖœV³Ø˜ÐÈK³1‹îwÁ=’ mt¡VdDÒù›—@¤ôÍ<%®\3Õ.\ßZìàgX >q‡=^´x~܇pÎôIÞ¹”¬])nF6PA‹ŒD®‘Œx+ÊB?‚Öå˜üEÍ’=QŒç9¿ñ•¡½Ÿ¿›i»°#¬ÐÖ:•£4»Ã%…×lĸð³1²û ù¾^wûsgž³f‰2D2=’|„‰'áDŽ$CDD:d·œ¢–Ã3‰È<\Á8Ëï,ŒÁH˜1ùWÝã¹¥±ˆ æˆëJsŽa£q°J¸]X „Ûôº>D9Cæ[‰/ŒóI!y!” 1Ùä‚ÃPjœ½â;¤ ª(EΗ@‰¯ÍãÚ$&ÏáÙ…/ßsõ‚VžÛQtoáþuÅoÜ»¿gÛS¢'Œ2¦¬€Â™)Pi‚…à¡æF¹Ÿù«kÐ ã¯zÊ`¦J[«o¾7ܤM%¿©;À8]X#·)8'«Ün&æ$"Ú»„®41A*ñ&´[5ý9:—Lt<“.ˆ \±êYÑ‘^ÉÙU& ¼€iY=ÎÊÓñz¹¤í£L#HÐËTƒè³'HÉFût«o [͹C¢ {Ÿì£«X?Ñ>[ícú¢b!sŸS³‘{Lœì 6RÖFÛ›Eµü²¼›j QµŒØd˜ÖMHíÊ-´(úFCJ²É³i}!ðÇØŽU° ÐUæ]Ê‹*Ѧ–™‡©¥R÷5SÒ?Tó¥{‡D—–Àh[ø â.ûÇ‚zÄ%ˆ=Kü®*å̲c°I¥RJÜJ¥f¡dÀL=!—6 _[t5K¸yRQòoêàШIµŠAsnÀ Ž¬BM1[ñ¤ëMqœ¨Å4v6GÀvý .\L1ÐÍîaZÍÀòèò{2-¡ÊhÈçôÊF·É6K¦Y’Í‚RUÍ»ÚͶ®c:‰vš\ K`bü(M*4†²Ä§ÿX`FœÎ³²-Ÿœ…#Ý ›ãžÔDÌBæõ,@ì+—i`¦½ ‚Ïq„\#ducð’î]Ç&ì}x™ÌÃÑr¨9¼QÌ­;fà äÊjQÐñ^ÿh°áî BLcúJ:Ä™0 ãë-áׯHkC‹N+Êpˆ™t•„Þ-j[Ð ÍÎö`Ú =zÁ°„9¿q¯Ìÿ2Xƒ"sX”Ô²Á+¢¾dYÛÄs¼écÏsƒxŠ(—,žbj²Oq»­¬² Û„zœ²a×·¶Ùt½mÀ¦ˆÆvÇM%-X~=~XfÖs–-kcNݛɱ•_ ”‚«:?.rÕ$`B}¾{Ä7a,çs Eš¼8‚ªu,K @ ¤+ÜÌ’ ezè©_²Û´,ƒ–ß8!Ç0^’(ÄÄ ¶È³~JßðÃ7ê£ÅyýÙD´¹5ÎËšlOš¹ËrÈ,Î(É)úš@)Z¶Õ*~úVßëÇ´õllît™\ö‰ºWö ¬Èr™É¾ÍÀ¸Ì¾4 çø°q›Œ` ÑM‹þ–:õ}èc\OÌ&zEô›èÎWK‹#¶[¾Z£ÐŒ}ŽÍžF&µ~e¬²"'^ʘM¥‹î6-æÛñ¹A7Á¹Ì0B†²PXÞ©½ðQøF(Rø×uc\_/¶záëó|n|*0Y¤gR‘¦ÚWfÊ…Â]¹PÀ°|b0ì6’TÊÜnfäI~„Úh›[ÔÌ“XnÊÅÒ‚q)w(v÷«h¦—0 ÁË!Ärú"ú*ÒšÓÅ?cYÈ ¼?³ö÷ Œ ÓÎöùóYÍz…b´!ŒBÞų•“MÌò&Öûg–‰Ï>ö«ÎŒèÇ™£r‡]ì°Q¸ü8İÒe…÷íqëyú5¹ä÷]Å{xaÐÀØŒxçµhø äY¸Ä-;ÂЇDи½z¿xá}¬K_¨é¼a‚3ÍZŸxsgy*c`6s'Ô/œØð¤£ƒ8™.c@´ø`WÈiнÒÉ3pŸR£-Œ§›âÔÈæ„ö/£™×˜RL™Ê…yÚu÷¢´cNì,xwYwaFÔ©ïâÎy^s=aÒŽR6žK…‘)sÏkˆ=Çå’DZC”y¶ÆéËï»kš»[³sâþ5M z+án,mï§™’Ux]Ï4&7&‹1<™oZqa$ñ çølßy“¸©v3l<É4H÷`˜'='QIެ#qcÁi&F>LåÌÓ€l²—tÜ & ÉN?Ï(äÀIûA€ÞÈ¢‰Ó{cÄ£>¬4¬¬)ï¶Â6O¤{gàÒö$+ÕÙî'R%ÁøÜ¯˜<”›X&ºyš’…“Óï»Qì)LF±cÜrüAQURö+ç84yeMì•}}t#kBÅ›bÖñ™ã`b“+êå;À4›£™íòȼ±hÎ 2A„”ÞÆÄ:m¸ØÉÇ„“Ž>_CZÑÆ»¸J¦áëŒ(aR1Óc†´Š¸²V!7™9óuŠ⦸¯Mb§¸kØñ()7äßL–"rÃÁ£° {‘æ\Ѱ€‹Tý.›·fš³a­Ù¢×½‹ž²Ùã|S$—â€0îÌ6a…P¡óqƒ9ƒ”7wH¦l7E<²WƒØKõÈßV‘a‘¨© wj«1¤·‰AA7„¥e!"ÒG EÝ:ÅÀÏ\ãl9@RÑ'Šž¦Á9½²&²OdIbF4Ñ'iêМƒÎ’§Úl/$!,îy-•D%»«™j{ŽÀtjÂMK˜Wź¸ýp> "Ô¨"à%,ŠÐY!Z-LVçºÃök^ÙŸW¼žã#ØŠ¶€6À¨-†­! å’‰í»º/ôòìwô¬ œžatQz²ÀdN^jÙ¾]óH8®9Í£fQ;7Ô@ab*•…#4?S‰kâ~½”|rtÚ½»‰ UCtP‹ì6N)u2¸•”šEë™òpQ?ä@*.E…‰Ü\…92’eQðš€Ö»!´>ŒØñZ›îY’ŒàïD´äFÁZá]=CpP¾¶ÕÛh[„³Ù2ì -·½ ™Œ¶ò(©&=ŠÜQi1A,zW´ÂŠáv“…èùÓ¤#Âe!’1t5.ÑÖ­õ¦˜ëÀ­uQÆe`”rq÷ô@£’ÙnàØn‰ÇÇYîMYÚnÜU‚ ~D#[P Ù~›–xG´ºyßÙñ*1êÍl 6î2Y5&^{«+ŠåN±$‘)ñ˜9}s‰ÕY&=íˆJPÅêÂøÈXjÆË¡hã±—¾èŸýìUL¬ò2Ù [b‰ÝCžçÍȲ†kc!nW‰¡ÌoW› i3ÇeãÓÓsÑוBI³ŽTVe lG„:Øa–AÞ Þá=ìJÕMviÆÇœ º;äY”‚R• „Ââƒv¬ÀöÐëƒqa)5›¹YJ4àËļ<. /ç„—¶M`SAÜßÑ!•wé›É+æ åjÛK¿n,t”Ñ TiöËøhÒ´àúv•ÕÇáÁõÌ%ºg*KËfˆ×EëÌA—Dçk te‹zG-by`£lÒ—äD1CP13r ÔGÅ1”BÝæ\Â.¾_´85:‡´ˆsÖƒŠá9.ß鯛Y³r&Œrï6†{22G;ˆ=‘P‹[îÊØCå{¢G3©‚´ÝW,]z/@ÍfZ:Š)GŽYR\˜EfÞqFë{bpk¥\7àDPž qdiֱϒ9­ˆa§4!™l°O—ˆ÷w˜ÒŠHÃgÃÞí˜GC ¿^p´£ÉFaŒN©f<‰‚è4?¥>¤j¦ˆCz>ðʬV‘µàRñ‹j/ô¨ûÔÂÕž[ª¬éŠ}!h¨„§n,§floÎöƒÕ÷¬Æ=Çí<§@%å•눠$^*‚“¨dÇîN£¡&+yƒšJC4ÙXeÏô*MÎÄ!²Ä þé 1‚%\j5¢nšµLœyŽšEŽP±ß3ðéq=‘Ÿƒ…ýíYyB7Žßýš™ÂÕþºî}ýS½œut WÂb!9&ü-Ý)¿ü÷³Γ?™“™¶f|{ÊMЮÃ!š~8À+gÁjžæ"ù˜-‘&Ão„}<Žn¤I[Z±*%½^÷ݰ,·¤X (_¦Ár¨ŸUÔ¦¸Q/5‚¡O·ÓЧ^ëµ|9ˆmðØÇOxŒ¶VI¿Ü`R ÑL÷]áÐÓ—‡–¡ËŸZÊõ‹,d‡xm°QÄEU"Q¤ã¨ Mn91µ‰†bV®‹¨DCùL”—sç¯+¬vBáÁL¯žö×¹â@ÏOEð%;¯(=J ‹3ÄApõc±Áùj®—w¨ƒ¬ò‰ Vo©4 »‡¡åŒ·hüœ¬Ÿf0݉µe»á'ò‰~ƒìç4çß^< WÛèÖTDöwvi n2ŒY®çpÏ ¸vªC±È%#Ò|(졳h:î§îľ—ß§‹ƒ¸gÄ!J%´©‡8øeW“ëØ­Sާ_·Ò7~åêâh9¶‰|ĤÍM¥=èr„q/ßRÕ/ˆ@ɶjæØâµ­þª²‡y8ëÄxfód±À@ô¦#¦ B½}y‡@`"á} á7Z>`²[wSÕC©•^`9´N’<à¡çîÙaù–RS:Èùð)ÓÏŽÔâI[VqPjÔ%ƒÙ¥P¯d 5ëièºéÔ¤}¿V;vî×>¸ÿÿ=õC¨F{Ÿ` ¥F}aƒ 8BÃ=6ëªTç«RÓmä[ïZ tÈø/³ÝuÚéÑPÃIå€ß‚ÞD½³kC¢•€C Ôh¡Œ(ÔåÜc/Ý$Ò~v!ÇËÆL>3p³p–u_1«ÛÎàÇRÒt„CR¯Œ¾PøíΫ²ô¢’V\ñ8èBÍ-š¨ñ¡ñ6Þ+„ÚR´t”W.§7,Ç,nhtEëÙêqˆ?4–¶3`}§lo@mk%s:¾ÒrW¥Z‡Þ (Š…@E;úý«³ê¸¥m´Êü†Ø¬p¢ãY›£è­98òÃø¯¸ùòuFÔ“-«‚{ ÃÚz”¾Gg§ä´ÛCm^z‡ìlë‡i+Î øR2·š…>ŽOkЮ®p6Ê™‘½fùæ„öt¸uû ↠QÅs¨Lq²ò‘X!Ð*î-‰Ö—žÛ²•—NˆÉET‡FÂtdž}é‹ÿûɯò“Ÿìäqwƒ>͘A…\#'óEØpùÌ¢AVløFÿ{ל°ßšÚr÷fãÇ™aæ×†rQIÔm›(è'ˆ«.QÑÝQ? ªºÌ†»£ô0`Ÿ¯«ké–îЫ÷`ïM¬wOÍ쾿¢xì>ôU´­fî«`(ËÚÄ/>ñB,íØYÑÖtr-þº‰¬òÇï=iz*!·¢Þ|ÁÌ_5¨.{Ê_öT|Çø¨V òí,>pš¶²0´HÉ–EJ3/JÉj6óv0(|"…·{@Æyå±î7€Êg¾;ïrʰýÕ¯æ~ÂŽæ÷– eá˜gYæUl±ü•ZDn¤Ÿ£,«Té8V·ôWè”N屟ý»õñó銭¬Û endstream endobj 24 0 obj 5246 endobj 26 0 obj <> stream xœí]ÙŠäÊ}ﯨgƒËÊE\ ]=Uïü^à‚ ¾/þ}KU¹)NFF¦ªj¦Ç.F­”R±œˆŒ­»ÃÞþ}èìŽê0(½üçõçï;üå‡]¹þûýo§Ï·~8އQ‡Ï¿þtÑÕ>ÿ~øE>|þö6Írçò«_´Q“»4ºK¹^賿p[d“¿ ®ÌQû§œÜ’Á]P× á¿ßnÿ=öî‚9›ùzi:Zöµô-ªw÷,_ŸìÿìžíשÑ]`Ÿ¼<èöì9nøF¿Ä²aywz¸í­Ë\1t‘òÎ[:Ñ­gvÚ Y*|¸Û&Ê4ÂÖÛJàá(ðвüÙÒÄÞ€{PZ»}êîÈSÅËNxß›•:u³ku÷vdá g*½[¢¸   ð ß ÊÀYÔ•‘¼•€H¼‚e·ìݶÂ;µNŒ”Š×ü:xP¿ý¾µP6e)y£ÁùóíW —V/OB¼t¯É­¸¬²‹’%€–”òvvR°hðÌÝ„ä'â øcÜ›§([[ F2 *PÇ{õ7`ÏÉ={ {ƒÍ¯c †ÀÞA 4¦ï@³ [1 ãîXÝlæX´N;Ð é¡Ì-Ú­¶h4W "Ê:°náå$HʸÝ%jGVGUoNÔ¢•g¿£DAÇ$Ü¥žÆ.ƒA?3ned+2îë2À6®.Ã0ÛåAW`³…‹ºY½M/@ü§Pri­oôY5ДXë>mæý*°fÎÝL¼›Îmž¡¹gHî85¿C+G£åûY‚Uu÷LQZ©qRÛ.ªÔÐ`œÁ-DÞR<«eûGˆЋªÅ¢ ÐMþ¶e#gGȈq ¡nU<7©~ñAF•(YÆŠLeµhÀ¡Ðgg Ù·©TïÞ“z];}Á”!¶$lß‚!qÅ9KòÉïøD‹$Ã681¢{V˜©z4MʺWÏh© >)ã΂"oYóéÏ‘#Ë!B~å” 2IMï.Þ¼»gøM£,÷hÎN]Æ‚¬!B÷ăDT9­Ý׳q0mÁ {»8Ad|TkÈï3ƒ ¦Š4g˜ÌPv"ú¡Õ‰ˆ+ît"ü‰~¯¿Oq"J¦š=XoMõÈÝÆ›êž£]µ©ÃV¢©æVSÔ.P§ûMu ¤¦šqäÈ ÚÏ ½@¥ïДüvÜõoÑà µ?£{—vÊKؼ…:ÈÏyí·°áDîOËhn»2Ö™ \=5ó¯b0“ªìB>ÁÕÛQ0Ú!&ºøØpÈ2^B˜TÃrÜ¿›+ñ†nE+#̈!®¬èœG=þ­_3”¯-Ëýšò/í÷µÁÀ|so!G«h<Ô¤Nn™V1v­)4ª.ð+°Â‡È‰[¿É©cÄÒÎÍè±èàxM6­¨€ú;ˆ¾…Övµà½ÈÅ~îÀu0ÚÛ*C•)õDç2±þìÑïô¦L‚‡2Q‘>ܧ³`äØRp€\¨7Cýu—  ãlê æ•íŽÿ|Ký¸]1ÉÁ»=‰NHÑErâ°Æ;ÙÁ‰ž9ƒö¾» lRÜG= ,¡ÛòºB¼¤Iú4rö";ÈEP-‘0Ãú¹9ŪŒ'Ì[ñt¡Ù´Õägf!ij# r´í–½x–šäÐÕ˜… )`y\­ÔvÉ>7B6ùpÌ23NÎ)ö½Mç°¨h'xÍÞa'@n™ÈJm¾ºèA´Ú¬-'û­@àU‹ൠô/±áTI-¡±¥ác ß ì9ø‰BrfÍAù8D†<ÊYù¦¾_3Ÿ ¡¢dEô÷žÁ«P„@Ñ·ÓaS 5Á¸–pòi ¼vÖ+F< Y¯~·#ñVᬠ’`CP›îïtÊ|«žÖTeN€øS>_# p.ÿÚA‘79†EeBüRÖ<³z¬MšWÿÞ›· Pù€(DÈIBòH¬·’ 7çK˜D&¹lOîl K¡|¡Q)–,Åî( À²©QCý{Xf»pZ x&—ÂÍQ—§2µŠ7HnTsê]þJŒ6´sª¢~(CYø+#š¹pEuws( æÕ } -rQ8ä’.ÞßÕ”°±v½–ĘñÞøÌWx¡`•]F; Ö%Y±Éu¹W‰ ä‹ûŠ•K‚W«Í ns¯§*â ›‚ŠTwbìK5 ñ#yìM&þP*7ñ'{u騡÷AYZ”ž¶KÚ8Býaºyc)‰¤¢zÈÜ]êP „ï ±¹àûÆ~y‡ãØF‡Š¾-µcyÆlý®ÚÑÜÉÂYü:WÜ[ã^Q´YÓ—³g9×ÈŒ¡ÑŽL=|)ÖÛ~yWA&x ëW°"k2…‚¨p!Ÿè+„Ö4Йš”.1 )¹U{ÚF2†]6x8iu¬dùƒ3¯ Zø¸>RÞSrÆÏ˜fã—ð>¥‚'*rO{±v"¹tM¡È¸5+UÑT´'Ï•µhˆŸ–ùe{¾Dûj:»Ú×›PT†â§HˆàòY1î‰ÁI»FÐ3‹Ë×L°5Qf\Ÿ“}¾T”­Ä«Èé4ØáвNªd‡£ÊTø@¹ÀvPÅÿ Hœ]m+²–tÛ(µEŒJBÂcªVh‡‰C Q )œ@{ÎeÍÂÈ ø_róϾk¹¿{¬3>Û6DŒ¿’}ìT³}ŒK"/ïàé©FÄÁ^©£¦ÁT±AÝfc_ø“FOøš¢-όֳ+³JúÛd”­7azºúÏ7¾}lòNóláI`?zÉÛ°XÌØ+öÄðx{ÕSÎ<øšt®Ãß‚G{‡="`ÊLª>=~¨d ïÀoòÍ*zPhú „½*q_KC>{@ÁÍ„âMyt-×åãòÕ\‹K¢¦Ò9Í#'Ä^TÙ.{òÄVO'÷Ë—òO”ëI-P»2¨R¹6–$í||O<È\V¸št›Sþ=­ÞîÌ”ë ó³Ýp Jc׌æÚ—¦ßL¢á3]“¤x°¹–9 û| YËiþkÈÏÃÚší×µšz’׵܅3d ñ’wÍnk¶žˆe'¯!k¯!k¹hÅkÈÚkÈÚNƒðè!kF5Ä®uTÉŠŸcÈšXô Y«ðÍlð“J>±ñ!3É$c{ñ+ –õ™û±]èб›þ¹íðé!‚‘Ø/Jf‹MÂö Ç]9( “¡²õ2O/‘»?Äe …¹6‹yLêyFñ‹ b÷Ê*üñ‡‡÷. {Øœ}“û|}”5)²ð Y4WI”Uô- 6M™Ö´MeOßrß—¸_Y  Ø ßxÊ&ÅÁp¹¶O@°™EÁn͈å`PBN݃ߋN,üi-á]kAÈ ¡Ïdyïà8 4X¬¨Z„ÍŠm{Šu*ÂH0š»5Ü&"úŽV&a˜©\¾üøˆ í6ŒÛäã!å¶õp¡¥·‡ÿ(ÑnâÃ4ž*{Ë¢+„Ñ*n>?ö ÂlmE,¦êí¤ŽdL>:Ñ ¶ì(P̶æ®Oʱ„ßÊÂ_±ý^‘r«bê—à(í-ÝÚB°}GãèOž·yà Cœ‘¢ã8ú$Ù4ò´!øú ÒZs¡ý@wÚwRèU©É $cukU¥)UÍOØ{Š/È…28TàUfýû29”p³Óè*ËÇn© A<%Mà$*ÃÿaåÄ&ètÜâDYŸt\Ü…HÑBõ:Å ÷š‰]±VväVxñ ߦ(AØ]¨n}^æ¡¡îŽô~\Ÿñëá¿“d,R endstream endobj 27 0 obj 3804 endobj 29 0 obj <> stream xœí]ÛŽãÆ}Ÿ¯Ðs€LØ’"`Øñjòìd€|@œ²âÿ~ØRßX§ª«)i4ãØ0°€¹"ûVuêÔ­w8üüôßÃpøýðl“±ëŸóþüéþîðŸó_†ÿ~úçÓËÛÓ8=χÙN‡·xµ3ÞþqøÎ|ùãáí_Oá/‡ðWß™ï/âÿæü¿îÙ¦>þ˜çô#3ÇøøÀ:sŠ–ôÞ«ùzyÏ–g—÷||püà& tŒ/¤Α‘ãÆ2]€.Ó˜'N|ÉÅU/e®iòGi¶ø :93â¦Àfšq8¥yéGƒ·/éXÒ*ÜåÉéíé" sØòy˜Ö©žÅa:,giˆK`ÞX%kóF )Ƀ+2ô(yòàÕÖè2rHØ1ž¿røø<¦™œÈ/ÒÔèÄFé“Ò ;¤¦}ÚnéÅz¼þ“°ãqŒJηë€|å˜uż _ÓÌÒTp qÕ–‹™9ã¬)/A^Ó+ Î&!ç$',S—¡k^xPO•à~þÈæûb1O\ß×8Ⱥø ÞªHÃââZÜcaOAÊiñäDºã•-ÈJàãÜ—²Ë§(3ÝVf.á¥uo§yŽ9o/ûöÔœs* -=¨O´Ì!Ýï Q)Ÿ 5’/ñÁ,ž-K„eÂpè´\Z‡¬r/q­õi‚ôÓ¬‹Ò¼¤J^±«xÞÌñ:ã×ñQÖ:¬€ò duõ&Ÿ°€’å˜f¿“rToüF9~½”wkŽ ˜õoŠo­?:òoÉÁÈ8ÌþWB dŸ«—ÜQ‚Ð!¢Ó ¿ØC DºÑ f ØËÀ“†h“}85èhÊ9>Ïõz¶Eh[@÷™†&Êw cH*3Ù ßÊkÆÔ‰? ‘/ô°‰íá ÙRU\!-0Á¥Ùxqƒ’ÔpK’6Ù£ýcf³Â­!ÇÙ¸ô:N! ì8ÈŽÌðÉþÂ,Žü;Qå*FaeåñSø£ÚÔѬ‰—–{5íâ×7“õ¡½ØíÒ±ŽÒðv@CÃ1ìÃö§Å$} ˆU!HorLÞõhLµÛ@¡`ûUK|…3ÀÄAy4¨8f…-ò²÷EI€ ÉH¿=©µ@ š‰„ôúøÓ«d›>S•£LcvʼnŃ—ÂéÅ(Š hu×PËýY9ùB½™®Þ—îÂu˜Ô-IíY¨›7bK;o ùkêt—kó‹Óh›ænÐÝÉÒJ(ÓK7o’j6á÷q1’ÀäËc>h P®›SewñAQpÛ…-KçèNC’ø~‘‘7H „…W´°;mËó6¿¿vËN—†ú8wWœÇX⃌ÏSÜ[ý²®‡J [- +¬^%aÑñå=Æ vôœ‚—qÀóLW?ÛÖK;–oØ8ʸ…ùè1xrìG€á%Ž’;T–_¿öïéNÊ 3ý{Gà¤|T†-ÊWo\ìã‘‘)Ø1ªp>¡$nù ¿Ä1ÅIØÎ;͈[eJhí¸ªxòóüL#õþËvuj¦ªÃ‘W½vn&g¢S®$ÑÜˆŽ–;ÅIM" …ígs$ZÍ>d\œrÀÍŒå4€“0é¬ðªéW„?QqB–ÀØ+³Îþ2-;´—‡Bðð•ìëj–L4ÂY+\V6)u&._öÕ4þâÌÄ•îËKÊÜT2בWïq5n&ÌÆçh`È¡#JA¥UƒbÖ&$¬b¬`% ö ^6j†t‘#è®?hËqô,Öm’Gù«†„;Hé~n©ÒÔŽúµ`0=Ñï›í„jÀÆ©«éÅõæH— î¨?˜ŽýþP‡gw¥ò«»0ˆZ±ÉÙPÞ–““ÎŽuUsZ¬`ÒÚräâMH‰öÇ`†)T6ùéˆ8+-Ø-!¨É*>#ð)ýÏdÌòa¼¡S¹³´1ª¼»¸)…4#x492èа“Â¥þ<Ã~Vˆ¥TUáY7¢aaiC|dr§½t)ê¦i9ª“š¨÷= 1fÚ_L—EIÎ>“•aêžýQœÚ¨bxÓâN+¡9 ^ø&Y¯Ú4ÊìwÇæ>KìºÂ–wd;O¶#àq/¶‹EËepœÝá®@ô©;¿0õºû E ô Z¿~‡ET„½â3£9€Œ~Iõ6B9Žºk·—$ïGÕ<ÖI<Ê`RЦ  ¨X‹¹Ë¨§ÓcQ[tÓ³;±bËê”5U¶d7NwÔŽÀ+ºÎIÅAý'«&<;âé­¢39ËtýàzT7©²ë”Þ’(n6xe éu³º¶_éUçNɽa•ö~Õ/ Élưƒ® »ä%¯ì<®àY ÍtHÄ+²½¥æî…¤jgâõP}sLƒ,í 5Ôµ¡Þü¡„íY˜Pï.'°©¹Cmt‡@^oö$:?Î@¨\QOä2$M/,dÍ9n(óVÍOû°&9Ü̬‚ËfÁF”¨ý‡ö[ïPî:3†AÞ#ZߺaÆ•ª°ïêîŽf‹$ëjëÓÔƒÀjž¾ÞY9‚Ñ›åLUÎWe½ØíJu+êûË^Ÿ^Aü«¸hšÃ:Y[eÒÛCzv”9z•ÇP™ËÁ²†äÜŠeÊ+J¾àþõ®{“U7\Nˆ*òèäA«²›#ìè±¼¾]oæm ›Åj“y»‹XA ¢|—µµ~¦XlÅeÖü¸Ê«Ÿ,>v,õUÍU ;‚­ ý4`ø9Þš³£`ÏŠ²s.Øc> Ei6Ö“™R7I©Õ¶6Θô†£¤­…³ð‰ö•1~ ¨þ¶£»z£Ðf¦!îîÊ‹ÄØA7=j„ŽWN Ô x1»s})•\—ÂdU²}ß]¸Ã]Ÿz(¿¾ÓLRlðTúõ¦Š}UÞ»[ªŠsc|°ëê(bþŸ®(µ%|T¨2 ‚ȶ|Y<Ó Ð;´ªÄðû"È3“Ôô£ð7—ú†fÙϸ¾ik‡þsŒ#­z] ©Óé@ÖÛ hÂ>rP7 ®AãÇ»¤x”Pr~ V 7BÉõaÏÖËÿË©f‡XŸzt—¯°é¨p'‹D x9‘RNn¹.7v‹[¢­§<ï³ë­§4ÓˆúeýTOY‹XÉÔ… ­Z¿)Fû’)ï ]fIf˜À îü•2^±hX.¢¹jV ˜¬Þ¢y¥ý]²ý¨÷’A0^ìu©²B4QÀ”Å>´ðùÊšÃ{ ”ôFÒ…˜ 'ì¦Ú¹|kBu)ò宿|eÁªª©=]wÕ òÙcùÀöö±eK¼a)Æúçå·®:Ö*Ï®sŒ:ÒKb`̺ oÕfÊ1ˆÓõ•÷\͇©™—ú¨|®ðïO¾ÏJUf»Z`1¤5¶3t\È¢Ön˜’Ë¿ô$Ù(‡-/àæÐ{ÄÜ.‹p¥W/@Ö¨;*³ZwiÅ“Õp¯3©6î—¬îÀbôæª"U\ÕçNI¡¡$LF rœZ{³Ûv?"‡šÇÒ¶ÿîöZaŠ“S ÕˆPÇæoà p Uã@êKÓŒþÅžX…ÌsÕà‘fÞ?öZ®â1qÙÝM§w5Ãyõ¢ :ç‹Ü9ìÐiÎܸz£œí'}ð%æ·íÜ7^4*#`oÐc_%n$SWÕWe[LV¾{–³nlgù•÷'ÔÊñ¼~x™Ò5“6Ð,NGð†ácܱìÊÚèCVŽ”Ó`؈jÀ–b)%h½ÁkÑGÃ0é° xž)ìúgØ%;^¶i<üíÛSàt?o¶óÏz:ÿË9ËáÛºƒaóÿüûð¦µ*œ‹KrÙ€“°Lƒ?7¢i›Šé¯/Îq3lÇÍErî•Z+¸Í‰Dºà´`Å,G­Q©Ÿ·±˜]v²zU} ™"Š•ÒºY÷Ž<ø-›õ lVwþD-eܽu´MÎ ÷6](%^¦çFn´»C ›Ý{̆YçÞÓÏLÙz.F·K¼)ÜTN2;êU4Ø`>¶“‰t/o|ðöråÖ¹mØÄr>pæE‰LHr!¥-n‹£D@Ñ™F\^â<ó(–‚Ò.î!ßé's ËÔàKg³# ){£tßÏ%¥'*Ø,<2Õaj¡T¯·DZ%y*= !¹•͉ü̶ÇËOëLÇ?^¦æºäQ£J 3ÉÑ{5ÇÈ5j‚‡‡} «³¬n…2›=y{‘á.Õ_ŽÒɶÁpÅr´HúµSã1?Pn:¹µTP©Dë`Y¬þQ’Èï\Q‰ø @û”‘ÆŠ;7±$¿Ä&}áâ|CøóÑð¥§ÑT¡üÿ…ó&Ê endstream endobj 30 0 obj 3353 endobj 32 0 obj <> stream xœíÙŠåºñ}¾ÂÏt¬Í \Ý=}ò|“†ü@™@îK~?^j‘ªT–ݳõ0‡f\.I¥Ú%•|úîþÛõÝïû× Î/ÇyýûÛß»¿þ®ûÏörý÷Û??<½~HóÃÐýܽþ­ûÃ-t.=ÄîõÝ/nøc÷ú¯/¯~M&·öYiÒïMÖÇ~}ù‹7€s#@ú(~Gé©Qÿð9!FBÈ 0Ÿuü(Z=mÏ#¤ºqP¨_I¿þYõBä>oùÁ#`Tù’6x@@€>æül‰# †qXØ;çw ~ÜšLLÙNGäN)ãi™`­Ó>@‚ѳèYb|„éÎ¥„'æáÎç oð~0Þ¢½ëApFçzä0ÒàƒϬC-ºÔÌ€8Ì# BãÆò=ê——WȬZ( öôwºF³“§cÝIÓ.dß¹~ל}"q&ÄræÄï]‘MÄ;ïÇ÷¬ç£èÆÍ0¢ý£Ù=õh-ĵ LÛE¡K0úâ m@X8 h*D&ç9‚Œrâ8°÷.‚á9jusHŸ7YtÉ?á œE-Ì›J0 yžA^ɽ2RtQ¥fVeéEn5éÓ3,»ôIZŒÀ*…ci‰íc’v­„*GjÂ*ç*üa‹g•K–èëLdòˆ“5gÍ×ç‚kUÑEè&Ó}%’²ðì¯x’8ÏGb˜ÝóÄupÑ$ñ‹†šz­'üQÎEqù”)HM8¡ 7˜$·RÁ&c•ŠJ†®ÝVRT,ó£LÄÖ-ÑoCÉü¼E¨â :2”§i8efAJN9Mª4{eWà“öî4;3^QÈçxå¬ ·<@K]´*7åänR¡ÓÏÆü#ÇÔ­$]ÉM1'¼Àô;ê¶ÌCIÖ2@[*`³Ý›Þã-º"#2}êféU§ÚðÃaÑ¢IÉRï·Ì<æ\õ¢†Ѽ|>–Öu‡ ,L»C—0®x=”±™4¾Z¼Rʲ¬6€,ù¦‰^föW jé £ÙËu'ݶS-$!õRÈ ]Û†V8tól Úu6›&T­>ÊNET´?K†ÊôC»µfŽ™IR都ܨE½íAû¹Å#€\÷õ”ŽZ[¿dv “AØI<†Ã9aÔÍÙê+œšÔÝ%f15¯ÖéUÝrÓû•Ùe“ÅóÉå§>ðÊ$œžµV­3©˜fï`/%Ùd­U£Œ'âH#ê·v5Â,Ò¹þ–ŠÕ }Òóœp³ßb÷ÃÎ]ÛÁåÊb”—Ó0ñ‰è Yšók·ªzVÞ·´]XÔ¸¥½›ÁŸÿôì!÷0¦.Íkþ©KaÝŸÜŸþÝýe·|é&÷Rö¶|êüÐ? ùûð© 1k}_>u-ë{L«ÍìÄMøˆÔñk¤†^&Þ&Þ&Þ#`X´0§oÎD$ˆJÓÈ%„©dŒÂt2Bâ¢ù9¡ûsF(" YŒPB˜PÆ(!L(c”&”1²(mÈ ÝŸ3BÉb„„2F aB£„0¡Œ7>ÄœÐý9#,F(!L(c”&”1JÊé¥Í ÝŸ3BÉb„„2F aB£„0¡Œ8¥µ+"ž™PB²2„B„f%„Í0Jša dq²#:ã#ùLzDñûÂd2F a2£„0™’ âfF“òëûCáUÙçn¥GË<ÞöTº‘ÌÍlO¥íf¶½=•“ÔöTji¦ÅÙäD : Ú~¸íÛž§mòm[k+y¦M“ ºg¢^;â´]}ÛǶ[Û«´Í9³›I&g"|;¶¶ƒZ;š´ÝxÛ¶Wæ!¦"/ÌlFd;:‹y†ß2Àë¸)#«X2¤©H!cIÅEK'N¼ŸÇšÒ…gi0%Åì ³gz›¹È@ï3'™è}æ&s½Ïe ÷™«Ì49æÎ¾H8Yö2¯ ÷4­ëš×½¾aÞÖÊ~/‘à£tØm]–·|Ô‹&Zmy¹Šr°F+ ¬êÅ,®qÓ¼ôS¡ ê,² DØåÀG\JÊ#£¬š +îðñÈ3µý2ms›ÁqÓ’óÊBA˜ÞN S›ꬡ2‡W‹y/LvQîhd,›¬9ĸªÓ4‡¬ÜÉLZw ÒæÏ¶9%œVP¸>«sX¯C[FxøÆÛ~–³Eã$€ïƒKý­Ÿü~æ=ï“9Ø¡Qg‚Ù±yãÝT›ŒKÁq9pie?õª|â£ö”½hF"YĈ3Úý”Øy÷m‰µÂ‹†Ÿ»ÔÄz¥ ˆU790°mC2yn×Ê¥œÃ#x’ØM€Ÿ^&}†IÅ´2½FEHrØ£ˆ"¶J§ó¸ˆ¶Öi„»%\Ò‡J¾°Jh°&§ùñX·ƒ”/¦.°ÈKy„%õ2éË0FPq/©çÛ° sl'ÈSSL‚לهÌK€ŒMÍé€M'9F´¦ uYQÎäQÌDl.à š„_Òˆ~ÀZÒTÚx²õ°-µ¦¡’.ÓLå\›‚VÃ*Qª®FÑ}(@²ƒœí("‚æÇ|Â:”šžðno`‰©d¦²+ÝVjØK©NÕ°Q|/çò,gkŠWUäÚJdÆ”xžëMu׆+]¬©8榹kÑÈ~ÓÚÔ‡GÉø¶Î(˜¤$Ϋ*Êcl;gLüD”l¢äC%ÊAÖüÚ^AùE펑'™f» ©š0™Yé@«ôYÒ¡l^5‰ævÜÕ 5 ‚OE\uÒIh‘%{=5)·/XÌü‡´î|R¥©—ü ±–7àÃò*]}j cáŠkö«]§&ï s/Ä70·™jêͨýn/62g²½hIO«‰³Í>.¬MëSqߎÙÔ$‹Ùv¤o:ß/³/,/$ØG±²ê_,:ç°œWi¼Û™îäJ j1(­‚¨¡ã”°íïˆ&öP\v$w3¬5.¯?òÖGjªn¥šð õá>Cp~a[PB>u¡ŸÖúÊ £„|êÊA·ºÒâ祕+øT~ CfïK‘a”""Ã@H LÁò~{#Á›ì‘G…wÙ#ïàÑÍŠM·ñà‘†¤×0Lö¾„ÐØF ! 2 „¤5³!¶'&^âxô¶ðøô¾ðèônë†TžYõd„Â40F a*Ô È‚|ÈŠúï¥bú\q÷GVO µ÷\Øç Ñ!Íê”Ê)f[}Zâ%VʤO™Û‘i´U·¥\$æ!W-¤Î6ué Jã, ·b6Ò°”j ÕêPÑs«+u®p„‘k]a Ô;~äþ3Í+ ŒAô_*dÖ°¹Ö ´†ë¡’¿å–u’;ÔY¶VÖ¿S%»ÚäåäÌŠ™n+M®’eJˆÙ eKxÂD„DˆÕÑÂðIf A4éÕI°ÊU±S:é·Ëj†õÛŒµÙAí4¯NWs¥‚Éê=Y[s§Âúpš;„!n œù¬ÌZ4ÖÙKŽb*^ÝÉWã*3'#>W-Cêüy¯e*ËÁÄ?œÜ·ä|v›‚^n U vb‚\¡9½´Vu~¼ÌMÔ°îY&çBekÞPMb»Áùõc,&÷X4¡ÒkÅdòCÒ¡1’$}°X(ζ²a§–\œ]îÖßÖ¦ÿ$uÌK€’óAb¨ÙÊÉiéËQt§ CYƒ6( B ᲄCŠÒ»dÛPÊ]7–ÅÖAà…á ûNÏ.™1ÝårE.r ó<ÜdXáê­&Z#ˆ2¶Išˆ‚<³…÷¶n ‰ï»Üµã„v(T29Hvž§³†;Ï߯s²7j"èÇ(÷©ÅÑ­-¹8riì]r'$§Ø£$§=%6!_:Úµ_.{?¹‡öªF[ØvÄ_“ýà¹*vg†ŽW˜TŠ^U•A•ì¿YÓ Bqgs¿Ñ)­•å‚@/;ž¤NIJ<ꨜ%kûtÔ¹Õ;W˜xpž½0݇™eaý EüGA•f©\ƒÙ»ï°æÐdê5ÇWµâpÛ®¥âëeŠrÊ¿Hß û¸áí»ì Ï7¿qž–›!²;ªÄ“|RSqÁ©›mÒ&¼\yÙ -yEÕ~¦ufEåï1ø]¬3+Šy—Ìav$Ý…½°Tnu0•c(²—̸oÒE¾åxä·Yö‰¯Zßyþ- Ýœ¸öñ.¹÷³(|7‰Â;XºíêJfÐ/0!2G´—bæù-ÅT!gëÈ {tʸ¾Üº*ÃPKU¥*ªv*+; æÖí©}MJ2µWÔ:\)õ,ôOmW[N¯wdK(ÕDºÖÏYð™[âù‚¬Ÿ™%.÷F‹Ó:â4gXIÇz,W'ã'Iýˆ­Y;ú‰5úÇ诛ÑÖTîÎó"£ÞKæô£HîÛd´ïÇ‹½‡Œ6ÊsëÛ’ÑB ôöaþ… $u8¢~9Žú!‹Ê‰Tlwz![ì×ëWЇ'nýÈ~‰¯«ä–f^¨´IËYmpÀrþíbK'Á.ûƒyÏ(éŸcv­Èòdmn¼a;Êqì£UŒ'JCšG”eR—­,SëØ}ýb„ŽûúåÒúÅS¥íO¹~Qîîžåc±¼y¨,9šáø]qdwŽqüg*š¬9£»v|åÝßßKï>çß|7V­ß'v-‹A/æñ7_y¾¶ÚÁÏfá–_yÍ>ñ×ý)þãe'÷v×Ü/h•a‚yF?¯ß5©†éÏ$¹(>»P]PÎÛà¨Nñ —»ÿÁfCë endstream endobj 33 0 obj 4272 endobj 35 0 obj <> stream xœí]Ý®ãÆ ¾?O¡ëuçO äl{½íúMÙÉM_¿’5¿äŒh¯-Û²ˆvWœ‘H‘ò#G’Eó¿·?ÑüUdÓI5þm‡éï?nþý—æ¿o_›ixÚ wº ƒ¢™þüóî?þúflhÛÆêv<á[Óšá`ýáïÍ¿ÞÚî â°TíaH‡3·F‹þ ÓñŒð­É¸Mãž ûQRÇÞ9î: z^a4#Dæa<#DæaÜ:uºgÏÝöaرKÆsJ ™‘S‚ É Gi‡îÐæ£ ‚tüâhFüãxFÜã¸'ŒÓTÔ€;Œìý°gÇsJ” ÎÈ)Q†8ÃQÌÈËæ£ ‚tüâhFüãxFÜã¸'(=ý¸Ï‡‘½öìâxN‰Ä9%Êg8ŠîåAæ£ ‚tüâhFüãxFÜã¸#¨1ŠôQî0°ÃŽ]2žS‚ÉŒœdHfxJ;$>0EÜ çF3BäÆ3BäÆ=aœ& ̇‘½öìâxN‰Ä9%Êg8ŠL"‘LÃLcÌL£ÌCLãŽÌƒŽÔêÐ%üæÃÈÒ{6q<§DÞqFN‰ÄŽ2¦ª ‚;Š‰Ç :va0=ÌÃhzƒ Ç[|p¾sGi>RI¶:åùB¥ùät˜År•Dúù(‹µ*ŧÃ,ª$JÎGYœRi;f1D%æt”¯q•Æ€ù0]*YóQ¶>Tº~f gJ‘‰F°MúN3L5ÇÓ9˜Ê‘t£r ¨MÇP*ÆÑ1h)RÐë9Y`Ùš †¢À …(°BC *ÙÓ©˜J–t*£’ –Â6V“X—EÕ`¨ê¨#RˆY1j¨!:ˆù0ê¨ !"ˆ™j¨¦€( æ@Y ”‘aΆ94˯(»Áü å^žƒÓL”–b±2‹¹(%„ñ4e”0#ÉG)!Ž')£„INJ q<ÉJ%ÌHòRJãifÊ(qFÌM)!Ž'Ù)£„2W“Lu”Øq®§«åöM(¥ß?ߺqÑ5v¼YÕ|þ§ùÛÑ4R4Ÿ¿4?(%º›ÏßÞ¤ÇÄ4úƒ|?QÚCï í‰0éÒÔ‰åéÐľ¸+ Žà˜||¾}’É~šUÍ®Â:‚¿ªŽod>ELm†ò·âg NÃ|o£.áïðîýE;ÑêÝéNŒ«¦twâèØ(ÈÆ_U´™’Ѹr#À{_AŸ­0CçvKîý½v«fS‹¤dH5Ú[QZñE.V½™.7uAÔvt8aÇKäl›ÞYD~œÎN«‹Ö³øp„Àâ„„3·tmFàzAînèlj@nÑgr«Ÿ€Ü ò”³/ɨo4£u3¼¾õ—ê Výdø‚Bg9Ttñwg¢à‘ $4¢†34̹J¼[ñNqŽÝÜ-% ÃSb(©[L ÁÏPÕkÍì’RD=0Rœ/ËQY·Ö¥¿Gõ¤¡k"-¸#ã’ª˜8 vÙæ%g„6WPqAÒ¶ê´×Ð5 \u›wU=£S:xÊ^¡Ïñ My…WiÏñ [Ó4ºeú‘_)ëdëc6À‘êž HyV?Œk†ˆ&ÕHîÅ /©©Îh¤XEÊÑC¶=<r!oßÊüæMŸûb …B&@ëåK{†KV]-•]e|'(% Ø‡ôýè ]4f¼9LN8›u’àÞ`«Èx›£gØœL€R[wÙTfAïð*0®¬`£ÉôÁÀ„Éwm|}»/`¢¥œzL…*oÕøV Eˆ ¾(š d‹œ*ÌQôX Žœ?Gnh-»ÅQÕx©Æb/iœN…ú¯ã8=ÇTعTØ‘¢–Ý‚NanT„wê$öŽ%ïG'Ç„A’ºÌXMWÈ®X_0Ò²œ™3 ¥âï(Y±w,yG϶fÙ…^ÿ¬sXº³Æ/Ó8Æ‚ºÂhí˜ÖmR(ÍÙ*7¶Š²Ê p­ JpÙºå 6[n1¿UWK½;9Û”¶ùz9^éau@’¾‚Ü}†øÓšD˜ [ ná­¿Ÿ däÖÚ†£ ´K÷å w»á¶$f‹šÖdçIJ¯uÜ\¬ö'Tí”;õ'$†|;êO”¼óÅʈ·àr¬óM +ÁµÊóa«ç‰a86 kÀŒýýɵ ÖÚ~záãóþ`ÂUÁ6Œ«p¼ñJ®ïl!l¶Ê†Úí!Rk§'_ÅrŒˆ)swv¼Ï‡æÔ„V?4T­™Ÿ¦HÒvÏoS”¼ÓÌÊ ¬àr¬óM€2Åï?!${šöoS©apù.Œ‡%‡x¹J“è“…Gè 0á]Aú¢ð£… OL +©hq›Pï ÛwV±\íË‹‰#  Z§ò~C{|£Ú¢spß;Îî >g‡|Œk*pn·æÐƒAŸVØSÍQˆAŒ£–pÔÕ3(º°¾—ô½§w"JÁˆ½cÝ€îÛóh[Wk>*wÝ ý¯­@G>sûŸêÔîgÃ3‘ûíç#âjѹ–í$ù4 —.Cm°tiýá+–.îöµ»òOñ»dC‚È#3£2œ9ž9dû$Ï‘s+2³‹èÈÏýe2º¦W§v˜Ñ])^("¸_³YªXãÜŽtÞQ(0Ø;–¼cOïh£Q²bïXlœB±nò‰–BÌvX¶Ãõ›…¢•u~‘ÎWøDK©Še«ÜØ*«<ÌYªsÙr‹Hã.s>¬"»Á›êzE‚ šU}Ù/xæñ»öäB]á÷äZȸÞ{­¾’SÿjËÕ¯ä´úÒ©«0ÛE.rÕ þüÁåaãQ.‹‹‡uºJ«ˆóݺ˜½är¬ó- CÕq…{™å'Š=ÁË>Êàß¹{)¸I"C¬€ oä/á¾*›+PŸ…|UMõ­× ýCw ûöSn¤ÉŸzaÐ_ c–ÜöÚííRÔb/i|OÛÛ8±o¬\‚+Éï7]§óG•à’þ2ËÝ©¦¸ÁЯÚÓßЯ—ÐèÓç?õÿ›nÿ¥K*æÎøv;YxS½¨­i é”þÝF¼»KËÏ®§¤FO¸¼°æ8ï­Œ .Ç:ßJzç/#½_æÏH®Ø˜$N|š8öðq7rnï§jTͬÿÀ(xÖÆôrt„˜MDµÉ0ˆqZÝBÐ_üM‰v<½$ªÏ·=0TžK—”¶"–b¥›}mþ+ endstream endobj 36 0 obj 3032 endobj 38 0 obj <> stream xœíÙŽ#7¢žÄ«³ X`úpž'i ?°Ù™™—ýý­²)Š"Å’;îÃvWÌŒ.Þ¤H©ÊeºÿÝýÕ™îG³³]oÝüç0-~ÿ½ûí‡îÏ»¯Ý2ìûi7Á¸ïã.à¸é–ÿùþñý?waw1vƒ;ß}ëb˜vCjþÑýzûËÃÖÅÝD‡‹Žo7ãÎÓñ¢ã[W`[ÆS‡gZ=´»ÇÁ„ G‹ŽŒÇ‹ŽŒÇ¡£ïû寄šˆ‡/{2£ìAÈŒÔãý¬'¤áÐÊ$À`‡£EGÆãEGÆŽãÐG»³ ‰èqБñ²) 3ʤÌH=aœq# ‡V&>-:2~/:2v‡Ž0 ;›%MDÃ€ŽŒ—=H™Qö dFêé³,ÿÎè{¢ý4Bšk_èý8F Sdsx„ãc3£Là M/{2î<£ìÉäÐã“ý>5sØIÀ1HA/:?ŸE@°É -” Y‡V4 *Ç&uhGÜýÐ*ÎQ‡<6©38â*G6 cuԘ͞b#£`ܵ«Á¶ [ÁªLZÎÞvÆ5—i6µ²Â°QJ­-§½!´Bv; ¶B^; ­¶sS_+œ¥¤m¼lc®lŠ|ÛäÛØ*› ßvxàgC%(ó°ÍÂhbE€ã!H b^‡‹(Ds±œšå8D;pœF¢¢'Ïȱˆvà8FEOž‘ãíÀq‘Šž<£/( ;_!Åc>«¦»u˜ÇÞ?ßÍ™®ëçç?ŸÿÕýc:kºçw?9gúvÏÿ½³a3ËèOöþÐwcꈇŽ~æ:Ü¡›öÐ yÁ@˜ <=ß}e”Ùq™U%-0¬f€ŽÕÀ‹„—,*Sf¸ÄJša<[b¦#o³,¡ã‘sŸ€ö ¨ÊïÍ.V¹3{@ã8šÕÄBÈbÜN¥8ïæ:üÉÒÁ¾Ôáý^c5Lf©OjŠ4\¢=cÅ \+¯01•™¾Tu…Ô8œfP:c7‚FÌI2/÷PÄDÕ§Åû3P'f0­!_GFŠB@­ûì dâÜ?¨¾ä–PScí  Ec»a¡m8Þa¹8=Ÿáa 4"¯'¶T¸x<^G‹@/à}ÄŠ9a’tΜ¤´g3„€¼Ðœ ýQ*`˜NX`¤kÚ'ö1¬›C?3Eëæà8È\TícâªäzÑE7‡^5‡¦^^`0ºn_Ó`MbB¦ºÁ¨^) FÀž-кÄŒÛh2:$ý|£§907bå¤;. a¥AÁçÐÀé9Ú‘/áXtö½µK*V ÁoqÑ’ù&(°H b†°BŽV„>œ¡m{ªÙ&™‡±X \4Øu‰×¢Ü&ñ5‰Ë Ç7g¿on½ÍýÜ  Ê){S3†áޢʔq ãºuTÂÑfkÖ!·3®“•¢dnR%°ÉüïÉ\$B€n€À8q½)V×Ü`7½½@oB<'Ô=i FÒA÷§0Úåªï£r ³°ÙÆÂsü äÏÕv¿œ©—´KRQ\£œyææŽdÄ ƒ'®’]Qµ9ÞÁÓR$,hX¤ø’RÊvνvžÑ‡¡”¯7\X¢§?¢Èỹ”ïòuqaJމšËAñ ­å¦+ÖöÑ‚ŒsèÀbâå9s†JœôvŪW›ùhD4îD½ùЇÜü?SµYó—mÇ~ãìVÜ&ñ«Èmýv2ó2ͽOv{91¬} Ó"±›Êöª.Éœó;V‚ÝRºüÂÌÖ.‚~~ÿÜVnÌœw=ÕMt4S]©é+¾«“çv­òœR=÷Ey4ÏOˆ¤"Ws_¤ã ²ViÚ[¡ÓúÉ ³°Ñ7\êTâå–¾­¥og_¬UbÔ&ñ5‰ª‹µJ8Ú¬ãmâgh›Ì¯ïð!ŽËë#›æ.îðᣲŠW¸Z‹ƒÑ`ïÊYµ‚›P¶‡Ü,'¯øô+òg™rÄ„< ê7e"GTsÕ3Ïbï¸^ñ]YMý·\Bš=Äek’Èç=/µv«XÞgªÝj¦ºí~oœ+VLn“ùUäŠq;éx™æÞ'W¼œ(vUÑâ¹ÚËM>‘vÿ¥ðæ&~#yÍybES×{ÑTË×^þJ—îbªöäy™:BˆÍ;0¹ñXç¬UnDÊþ¬ô‰­Úàk.¥Úp¦åï7\kTÂÝ–=­Åœsï‰j¡a“øšÄ?Ó=‘ F›m¼qåoÍö ãy2ÿ¨ÊߨÝö*ëVþ•S¼Â-Q{ ¤Hx‰-².÷Ä—ˆÌMC#v«mN[R{êr¥,Ç*\”å" lTr{þT•\Ŷ½ð-+¹šÁmÛ\ÝÛyÅ™2ÿ \ÝÛ¹ÇË4÷N¹úGígçêËWË|tù–Óº#ùð·Dɤè{ÖÙ§HÈ 5‘ÃbÛ*<¿x€ïì¹|j¥–O­ `°‡Ð¿w!Ÿ¯ãÌIy|Ž ²o Ë:ž9Ež9eþHƒÄí^f´M>a'HI¶‰¹óÈÙ±œ[•á0,ªÕ9›|&$ÕØ”õºR@!Ý«F´Ò)4n|ºtàÒJŒ'7 >ðÔ?£ùt´ØÐ°øô3(ìFËxêòÚŒ¦šÐrBå.}3Dn!ü{—ÎÃ'S ë³3[–ö‘Á@ ¬àÏ_aM2kžÏ.92*)í}¢Vuu bîyŽ<¬ e9 ýî(,Ê!Ø¥L¡Øï5™Û˜¼ÊñL hxÊi#芮ã, â$Ï‚ž‡’^Æ _,7Üpæÿ©DŸ »ˆ¤‘Ê™e>)’U—¾0Ü«Òa5pZ€ÁÉ¥ƒdzÎÈ7i"³ÜL’!Ruxç~ò±\êdÉI’íɲ[…0?„›ò1„ëaNŸkáÉ<¢Hcа?ÚÓ×ùµxê—LT£ž€"°›ìŽ/‘Ñ" -hF'³érOûbi˜aµÃòW^yl“ÅiB¹€‚0fVX†ph0\Ì&Ëíèw#¡ÚN(Pý¬3„C“€áb6]¦eZ^liB¹€‚ðËùV†ph0\̦Ëg{ë³ñ@‡Ëéy¯°„øaZþL!¾Ü—ûaÞ8\ÒV>à¬5éžbâûnŠ¡,?øÙ¿é¡‹ åšô€ç@IÊ¥‘Œôxà€¼/›l”ÿLæÃ‚$±ÕG$ƒ˜ž8•‰!âÕ@Kh{ó€ç’Q“¢µ\‚Ô­óe„åÊÅ$4pY Në{®|Uê=ÔníPu8³­HmÔqÎûšgTŸHÛ-zÊT¤…†Ã§kPöPu$¥^Êl-9Î}¹â›·FÖëù8Ÿ'±+óŒ1|³ë_r§׿9ç5Ö&Ȥr»gè‘ÛüV (A®Ý¼›ñ°ÃK¡ P†ùŠît‰¼$S=#¥ÖDÜs΢ì ‰XHFR#–ò8 ' ˜«¦ÍCÁ˜t”⯫’;V#®7Bº¸d/?’Ó‘‰Åó»=ïÙ X¢º“£WÈ—ëNB ÂÆ…IC#pUƒ£FäªÇ™6C·+U¨ÈÛmu¯­ènóÚ›ðZ¯Ä¼vÎì¯Òk+«„„·åKwBRŸì*“.½’›‰ãn*Dò1Ž\QçæÈ·áÈëÙ¬Çü°ê;²Tœð“¶j÷Á˜=àV¼ÔìÁƒ¬Ë œ‚9ÐT˜³0\Ý[ÿv²\ÓÙæ­·á­úóDoìUxk›&±EéÙó‹ÂÂù{aMÆ›wÝ„wÙ•—*ïŠ ºË÷.±MÓ &},MF¦¹bU”œ´sÜì“Íl>y> #©>釫ðÉåó ðAKžkl°"¡Í7nÃ7ûÕáQ²Ë÷ kRáD2DnæÖÇ1ž³µ0÷i¿%ÞT‘éæM·áMúEÄòÇ4îðW>ì-½ '¼¤§‡—ô*0oý= tä´ñ¿—n¢%a#—€ E5¡ ^äÁœxà -ÂÀ”'gÄZ˜ÌãÎs{Ì ñð­Hp;¯½J)œæÓ «&a4­£ñžWÄÛkÇbÇÈ þô}©N$w2ó´ xT$¿hÕßÙ]f­‘š—Í/Cg©•H;(d9NùQ¹¯ÝÿMEº endstream endobj 39 0 obj 3983 endobj 41 0 obj <> stream xœTËjÄ0 ¼ç+t.Ô+ÉvÃRØÝ&÷…@ (´Ð½ô÷;Š“81]Œ%ÍH£á·ú„GT5ñðv>¼ooðòßñ0<·êÜW¶V[å¡…CÇ@ý;éôýgŽ1µÀ€È'ÛøiªÕy(-E@+.Eh#ÀDJML)\&*©˜8¨ÍHé²’ý…$;5Ö®*àXÁ¨æîÆÉJÌàžxµH­ËÝmû·RÛ«ºØð¦ÊFÎzÊÉi{wCLÌŘò6Ìä#ÐÌ£zζŒÎRÛ¥qï Æ™ŸMÓÚ¾ºf+"Pqí¼!G6þ«:t”6Þ q¶ž‹9\GÛfŒ Sï<ÇŽ«<õ…67¡6_ŒØè›Ô¦è´CèÅ(%F%¹º4&Ãz°e÷*èJ9ñö°~‘Á1Clmò_fÑK'@ú‹tÙACظá朊K€¡¯=©Ó*7ÉÐõ•SÞ+rYœÉ Ö¸Âõ4 endstream endobj 42 0 obj 377 endobj 44 0 obj <> stream xœí\[kìF~÷¯ÐóÂNú. BÀcϼ û6YXØ@ò’¿¿’¦ú¢ª.UK3αãã†#KÝÕuùêÒÕ­º?Ÿ~ïT÷OuÒ]ÐfúÝóï?~éþõî·åó¿?þót~{òáÔwat'ß½ý»ûáê:mº·_»õëOÝÛŸ†“™Þþô£2˃ùÍÛ£——·§ŸÑ ÃprÕA•…1tÃÝf‰sô0©ƒZ-ü)Ä·Ø¿¿<è§UÁxJ5Âñõ ŸŒxÐ8† ð‰åëÈFÔ¯g‰+5ÏË'ù$þz´võ‚)«!ô™ãÿM¨}˜Æ^øo:­þ»›ÈBžÃÂRÓÚ{ô†ú²<°‰ðøF\Ù‰Ä)ëxJ¤ß–Ðóë!¿'þkL& ôÀgæ‘O<,~’A×X(P†x–eƳ–a¶rŒ6†6*MFŵ7é÷+¼‘ÕÂ^`õZ§§Š5Ö™AêdB?NfÚ¯¦U€îüïé‡«Žº£Î0QœÌ$³ 4¸XdFù«-<0ë1Òì»øÄ#Ý t¤YÒ [«5–± "* Šn8ؘ5÷ʃ "-ym °‡—¿‡)ãÖ!sS—õ€(L°mÙÚg­%º©‰Y¥±°p’zmÙÍ`ÙU€ æ`¦¡ËzH"X÷©‹‡i%êÂboH¾/}b¯‘›ÑÝ„©m–Ö¨Ÿñ3kÀ!éì^œÒ°Áè<"6 3NžÍâ6…Ÿ$ú%ZbBáË­H†ee\R!rõo‡J¦Ÿñ£¦3¼U2öbmÝÁÿ…5h$vi„Z´Á»$98°l(5ÎZp³{B©É´nëÐ{|õÅbA“0ò^ËT††¡ò×%4¤P[…†À14A’Ë?ëåPô}ùw‰¡^J´Ñð¢Iª.š[2syå7G°@ôzå÷$"çŒ>»áZ0ó‚ݨ›þ½D6%© ƒ¡í•ÄÄ E-É – ë’ÐD È•Îs´ÉìnO³$ÍtO³êSrqÑÀ+ÒdPÙÒüõ¸UÄ8ûCš™iÖI«9š­ Rkvƒ4åggØ…%àöˆÏ| fë#ìŠÁ; ƒi3Î̹­mÅÈè8„÷½šÔiù$±,+× Æ'JE^&¡²d 0Q«¼àg~å\s-6;PüÒ*Vtág =2¯Vk½AÜ+Æ|Ó¹à¡"Îv˜Ëf¬á½™Ö±Èc@ú],À`Õ±°f]”Û<ÚM{L~}õ¸¦>`ÔcÖo?bÊHÄ‘âü€ŒAr‘ÈùŒ,à§å–öXÊHžPa¬Ñè½z;£äç• ™4BRrÛë\‰ “PI„iAXeeXV,à–=³6V¶ú¨luqðSʳ”%Ðó4LÞºqŽcåUh∉ ÀË›p„' 8ì°Çè?£€u¯!÷[ Ë[˜¸D n0&V¸îŒ4®hØzÁo\@  @K[äbXs‘cɘI¤ˆƒ•)Ä¡Á þŠ.ï aëš×+5 Ø"J¢!4Š"ˆRáhšDä4 DR"d‘IÉêñ'°§\(²«çfýLÁ© îk9I‘†h§§ž]˜:S]Pv‡ØÉRo”%É’–Œ`upf’dÿðŒ×+8Y¾g/X#>HöâÌø={yû{f/Në¯Ì_-{±£ýž½Ü›½Ø>ÜXø²—ËꛆJ'ŽÄIÌL‚yB¹YÓ‰#Oº2¾÷ù­J†ä0á½La*5,G¯0êȽabhÚ_Ê‘5ËvÂæJ[?›^ŒÏ"9°mʸ¾‚ˆðPý×É®|Œœ}Fl h|š‚I`kÙ`_°‚EîX†ÈˆŽû$DwêS‡ÊdiÖ=øcm7Ò2*y@–B¼<ãWŒ(ÊVçllCdMv÷ŽåquÇEYD*0d'ÖhÏl˜\ØsflaÑœ×ß²hT—Ë탼E{–Mß$®ß«YÊ-¯ðÕâz3ôßãú{ãzÓ«ˆ¿¹Kí6éÀ6¡î¡µbîè°ìg°žÀÎHèF¡)å&øüE¦™Tñv©e&ñ—m+L^ô Ý».5Ì%a»èn4ioß8-ƒØ(6äÚ˜Q1­re¯@.îs Q¤é IuçáE©• ¾/:™0Ÿh—£BŒqgxƒÌÒ|2"uê"§RÊ2?9²‘»%IÙ’íŸç:³Û» vÊD™$AhÜðFt'aejø ‘LÇ$ÕX¤WÚí&·LÊçΨT¥ÉÜ‘myª‘C^1>²Cµ•´àbjIß)ž™ð YÑEð5”¶³Ë¨Až„’v ÈŽ[zIÿ0Õ3g£LY˜"[ªB£mH†Hbc{ # ¹aqÌ߇@/" פ}ß7ßoŒ ÅŒâõ•;Ö/È×ET(…F'=b(K,Ëö ŸƒBhØ•ú©Ò,ѵ§Ç‹“"éµäiH+‹xÔòD§ÂŸ{J09ýÄb¹G¤ð'ª$8K*ªN†l±Æ8¯#‹ MÙ׬+öP°£yÇ·ÍX‰>(?¢‡ì0÷­_ˤ•'xPb8ˆµàPš²‘6’åˆÆB#wT†%•ˆ½¹O£C¯ÞQP‡› ¿´ ”ôÑÁšù«tP5o¸ˆæAJ%È*¥CÏö‡røÈ ÿ¯<„z$£•ƒÖ¸lÕ‹º*ñÒ•Ô‡Ùçß׫ŒñÈŸxR&Fy™/jÐe¢3¨´BNÂó'má V@eçÈùSjb¦&ûðØ–ä›*'Í“’%ødï³²—´YÕ~áIÔlVsäR ¢á-½¶Ù/ñC!Åðº8)R9îýˆ LŽxF´Ô`îOÛi$¶ïf¢Ò$âÇNbú‰Œ.JŠ¡¼"MŽ·G©èYgÀ$t³GŠÿ0ªSm#V-[jÇGì³eØgGÙM¬¸ÉɆ³^¹* JÀi-Ý æò´­üFé³I1¸õ’¥öL 3°ÓC{Yn"|@¤y<èc÷Íß©–>áJêÝâöTLÅòäxýÈ ¢ùîn'Ø+ï†Ç=åeŒ˜EÇ› ­¤o•*ʺÄç ØþÊ>ÝOìî»p·ˆ^®:Z£š#ë½ÿη—È)©Ü-oËjÀC®èa’m‘ÙÆ\ŽOʲ$ìótC’'ç@t@›„ͱ®Õsrk޵߽Íß®Ô';`GqyYd˜n^Z{Ô¾p;@f¤‹ý„vÌ%ÅÎv¯ËUÑQ×>›SÙúF5¨tÓØ5ü•öûÔœS¯?™|Þˆ g.šà£3¼4T»™ÌlÏþûÞP§ÁôÄÚËn8R—É’8m5t_ùH½òœ:y–[Ûä§kÁ.)Œ1»|âkA@²7ñ´-mPF‡> stream xœíXM‹Û0½çWø\hªÛ²a)4»Î}!Ð?ÐØC¡{é߯b$gž&ãdié¡»°ližÞŒÞŒÆ4¿v?Ó¼7{ÛôÖÅß0ž_¿6Ÿß5?æ—çÿ×ï»Ãi×õûÐ×7§/͇£k¬iNßšûécszÙ_šó«û¸ У±ó£ß»4ÐÍ㾫O°ñó@DäÓXKËôû6 ó@zôžÞçU'²kiÀ-v»õh9¯› ™é­iÕžÛuaÁ½ÒÀÈap\vÁÖtLD¢»ÆZÞ/ðÂui  ¸LkâÙ>1O¸øG$Ø¡l›óÀ€Àºè®KOä÷Ùáœ6îØ]€›Ü¿ ÌdÅõËVM¡9Ý~äNè¤/̱¸3›æ‡>©¬+9œXá0ÇPöì ‰ìˆrŽã†,_áMH¬-¤p(¾£‘Dz óâ{{¤i°é ø@|O§Ý3WÏvŒ°Q>i‘ÚŒYom!0Ååa,+›-nL‚ÑK“X¬ Žñà2ÇJl¨ØPP!Š;Â_ÀšÞ’)‘~~4/èꢼC·qy;šT¼î-E•ˆH—ÚMÉx€” ìNHòf[:`%g˜”FâñÖÕ²*x%ÙFBñ0$+|iÉù¬´Y$Lzõ³ò|\å+ŸÑ’Ãðø@rY±›‹¬cÞ ”RÂݤ“z~½¹ôᵨP A$H¼”ÃTDõö\×VdTS^ãâ/›²ŠåZ¹º½vAŸ²LÍj¥XÚ"Ö ªn ù“K×›Eư/JÚ§ðûƒž MGE¿ÈçÊ'(º8ËùÔú,äÿ‹½ 7:@ª&HéÒ”¡_æÔØU£*_»ÚÂÅĸ¸ùÚÅENDòìH€WiJÉ.¬šŽc/xâ(+í¹¢®Êæu¥íGË'(•\¥BDɽLFR²ºÆ¸xÕ“u^å_Kæ¨A0áÈŸ(©yó¼9¢×Z.×Ôm¢-XÕù»ÙÏAt óZبM‘›¯"[® ˜||Ö£\Yƒ²bÙ¯S¤‹žåV4wuVîˆ0 y@=_-Q4ˆç\QæšøüJj[úÚÞü#¬Ú¬jª¬Èx#:6eûåFº`ÞÕ²r–š¡ö’”›ˆ°L©[œš€¦÷Û/PðE”<,ô0 §¡~½I˾âW~'z{%ƒHî^¯n}³äǪcê gƒòKóöd }µy¯ß26Ëž˜õ^ê*ʶ5”˜¾TÔü/ŠžX¶Ü&•V(D6V7£Qrl­@¼©•ýŽ«ºŠµ{ŠˆT¢»1ÚO í–dòDÇ­4òMjÑ—ÂMNZ£‰ŸUÌP#”»æ“´„5g–jPËY¬íåéQYXŽÁ¢yçæ7kqkø endstream endobj 48 0 obj 1064 endobj 50 0 obj <> stream xœí]Ûnìº }ÏWÌs¦–dùH&IŸO ?Ð Ptèyéï×K”Ì%švf’IvȆ%[¢Hjñ"ÚÓþw÷ßCsø}so±Óß~ ûû᯿;üçÔþýöÏ»Ç×;?Þw‡¾¯;üáÅŒ¿o¯ÿ8übͯÿº{~½û•=2˜0f呦;=.›Ðù‹Œ¹bKãç–æÞ§–ã©e¼·©¡ç·‡I×3iýDylpq Ó$RVhÓ(ãÜb‰Ú ý|3Ì·ø{—n±|nóÂèç×m”†xXÞ`Ýò:ò¬"ßÝ÷‡nlfÙØƒifaöÒ]›oÒí¦9Ýæ™/{^B€èHˆQ{І™+v"o±¦.Ï“²9Z“fIŠa}lplÐ¥ü *XÿÌ––¦´Ã²Ÿ 46q†ž?2CŽë$EÑv¤•ê’lÒþ‘-‹1}3ËÓ´Ä9ÓÇÛò0œÿ|æ#éen[NmŸâò‹-4üGê„™`Gû")pßïÚ”¸;Œ3‰ø5Úå¤öÍq…i¹Ïœ}ˆ\êé‚–su ²®I€aê2Çg ÎÎ4Ú GŽ3¨îÇ8ô°²OŸyÑTÎÐFäZ :‡ÚãÖ9Çt™H¨\L–*Ö$–ÄxW\6gekîg”³$¤QXêYZ·«›™­ø™O¬Ù‰Š‚¦ÀòH¬@mñ6ŠÒxh‘2AÚ2Çdë -…ï’{fú»,Á>3²2¡Õ܇ÖMwÕ°1®M„S?ð¸Ëà@ölíÇé_´KÜãB&?,¦QvþçÒŠvmð±€à0ºsÛ‹ÓòåO›)úÉVc×&ÉÚ<0W Õiy5dÙ ùŠ—ÛØOÙ¼ >U’…õ°QÝ!û ©/pÓÓ¿É€n7À5sÒöZU7šio#?Ƭj‚‡Ì0im’èªÚN”TðQÔ¶ Qõâb…Ó¸§!•Ȫ…eäèµ]ô ’¢Û#F˜¢¹(7Ã1à mTÑdˆÁƒ åëžà!?A!vÌ $‹æ‰óؤÄŠgy÷Û„OEJ¤M›É˜5pûðÌYzäbëcm™Nôn‹™;il€™‡Å~ƒiŒÔ<¶÷™”¤!IÒMgÚ&"D |±œ\³“Áãd8Š7OI÷†º8'òŒÊqÇVÔÁ#‰»i„íÃf©:F‘Š®/¢Àé¼Ë“8Š0îüå<ÇMã—ÄÒ Þ‡Ò1ˆIDÇe£©é Y-‘¤Š`[9%ׄ‘j¡¡Œi“ ȉ¼1š.Slü ÈÓ6¶Xï#c“9qÑ“¾ÏöÃÙH¤é‹ðʤœm/q„o âáÚ–7ì'Ú–{7‡ëÌznÉíNóP|>tÜš¯KŠEæ5Ì?šÕpCƒ3 æ«xjùÄ䇌Kõ`YvÄ1•âš{Ûõc{0ãC¸×û㮌‰Õ܀„›UAõM¦òÒvÍDî×ã%Û©¨‚)8n¶È‚p§:™‹ Âõ]–íÇ "A ÅáçqB Õ'•%HØ©Èm¿W‘Åì#ÚZÛñäN×fÝ(¤h›°Ä÷—‘Ý+£RûW²" Í«çß°EÀSU|èvjóºÃ‡.žÈ>4·ÁÜ›RRbàÏbôÀ™Œñ»–Ùd¼„Ÿ)G uxÿ‰É†G|Ε8im)ÖEï8ö`P´½`¼«>tö³_ Å“ÙV`¬=« E²Ø†ÒØ*êÆ]ÊZ¸ª§ÓµŒžësË⼟!û ›«l4ÙŒCÎÿ;%gôn\^Ž]K(¼Ç9 ¼«…‘ÿÚÁŒì€2…\ßVÜ”Èlëñk f®fú6=(yAÂwø|ø¬*ŸžÐðE=Ûç ˜Þ¾‘=þê‰2`Om¤æ¥›ÁæcRùY=Ý«|uKóÖŠþ®óÝIý±œFT¥ÓÙ¥ëÂ1¯;Î.‹'r"g®±j8DGkkÔ:AÜdÞj ì÷Ÿ/ÕÐP¦’`ÁlúÎAñÂó“ÎjMÈÛw¶ìøîyƒtG:Y:üûa„JìS«Ï/ŒoVÂýAJUuÀM/UšIßâ.PÑÿö˜çBáÇÖŸ³mÈJ%PõíJèâ%x“±òʈó6½ÖcÈ8?q ‡¼èCB âû¹OŸlÌÚ—3pQkÊêù·`‘”ô;ÁCœ8‘Ì”“f–gaUx®°»lŒ•:½à)8^^;ÉebµÙš¾ˆ@{ÂFõfxQû}‹€® ¤È“¤YˆA]l %Š#5{œþÅO± ê’ +,D”{‘ͱæ1ýë!=ö§/Å…/ïÚ&(Yú™yEþÓ-mþÃWå~ÂWZ/ÿ}øËÌËÔk|Gî,¯ìÐ/zËë“šç ½åõ4o³ì×Ýd—}"+]&²|î„äþE‘–û D\î_4yÅüsCþy§«‚ºØi¡ÞòšH£Þòš£ÞòšÈÊóÎסš¦àÚ|YЕú#!¹Ñ@¤åþE—û D^1ÿ©ÁŒáH0‘7_eêRïLKî-¯i¹·¼N„åÞò:‘UÌ;_wc˜žÈš/ ºR$$÷/ˆ´Ü¿h ârÿ¢È+æŸÚðF"ïtUP{#-Ô[^iÔ[^aÔ[^YyÞùÚšû¡àÚ|YЕú#!¹Ñ@¤åþE—û D^1ÿ©a K°vº"T‹}3!ÔU\&ª¨¯¸LQ_q™¨YN—I¥É`ç‹%Ì(tºZ L†‚ÓÅr«;ñDÀb§åípºXª{¡§«…¶e•(–µ4n (¯ã¢Nëø mÒõ}¢)kÖ‘.¦…kÖfò5Ô]‡> }Ö!@Û…y,?-\3£ëÖL3'먮Áê:ºið’w÷Âþ§…Kþó¸¡^šqn'™ƒµ4g`/˜=áÀ½„uŽ› W‹…ÏHºÄýYK2û“g-ùŽÌ›²!÷ÜY´ÐʆÜ_phÑ’ïÈ<*ræÒìfoü5½!„5v1~ b,EN:t,¶JqÅ1LxTD bc›i©‘AQ/;{(¢r¿ £‘?~Ñ„À¤6IŒŠŠŒí[k `‹³ŽÑѯç‹ï—‹‡÷jß{°V ÿô‹&%¾2@ãõ#§­&”ô¢ðË‹üz§q£0ÍJz£ éKÛ7)½‘Ië9ßEAPj‰Òšøk”„œ­õ>UqûÃ0Ó‘¢wÊñăMÙíüÎÁL¦KéËbÎ÷\ÑÀéÀYfŽå_Â1";€,Ï—ŸÎ‚TY'Nú¬-Íòii v\VKmùΩˆ)&ŒŠ_äü"uÉIj~§4îÁb-O±øRy±Þä÷ÄTM¦eËçiñ½4†\>f‡ðý²ëñŒ/Ÿ ¥ÛÌf³uù aq°–Þ¥¢%Ä(Úœ!ø×g¢•–´ê´Ð k*Ìö•'ZÈä¶»±¸$ì%®7—’·ü[&¶ãa`Aä/x4‚r·ì %a;ŒžH¡ËʈŽ]¤ƒË?þSñûm#çX²GÎDn§Ð’ñóȘŒåÊïDÃ5»Î$ßˆÜ ®—éóÃÅo¥€çÓ¼4±¸&ÝóÀ׋‰¥xhé¥Õ‘f žOÛIÓ‚£”¢¿ÀÏ&ŠŠÝdóÇ@=’k¸tKÏj)pcOÒOg=£4,L¼wDXŽĵ¸úBwBRRÏ Cx(«)Ú¾«3y‡õ¸êr/ ´ HäÇÊ,_P”í0ÔQH¶ÀQúÖ¦ª»O/ýÏ" É8¥ …¶oÒÇû Ë>Ie_òõºdÚ êL+FZ û›A,;Ë£‰NHÓó¥ —:0BÓ/Р/ '`)ÉkxÆfÅÀÕÁ¢ß"zv;üÑÕy¿%só[¶ú-E²@dstd®ÅæoåÈ\É7GæRŽ ŠRsdÌ8Ü™ÏéÈTöåudÌàÒ ÑëÈ`ú‰¯ RÀ®Áé °ƒO˘ÆŒME”7ÏçòžÏÕØü<Ÿë3ùæù\Èó©ˆRõ|úöËœ~¹|ŒçSÛ—_Õóñã÷ò|<[ËOäù (ožÏ;x>×bó·ò|®Îä›çs)ÏE©z>¾¹y>ŸÓó©ì˯êù8Ÿ>2Bz …ÐGÍlceo'E/âŵÜÿBvYœ•#´ô]$¶£F88dP~‹.xW¢sIZ™ô‰$-8—5G¨ Éâšd]°ä¥A8fCE3Hʹ=g©—ä„.-€–¯«ì";>È/ì£"X}»ÃAÓK%=•P'Z€£ŽëÉ"[‰E8†Šü4‹ß<=„|eÙe½–üLÛ&‚â!RÃÛrYg#Ìî$ñ½udi@W;­n¶‚‡P9ÛÆß(“À¯áT¢Õâ†P©y5§ ú¶wèö•@1³¦ +.²M·|ù`ÓŜʊMŸÊþfľ—»–üTF ™øF g¹†kì'3bᵋɒÅ/2Yú"Sö¥¶âÝãô2r¦kå+†á ØÊ4éƒ[™ã⬦ _Y«‘šp›½¿ÝªšaN¿™U#Ë2²bCü<ÔÿúêJ endstream endobj 51 0 obj 4712 endobj 53 0 obj <> stream xœí]ÉŽ$¹ ½÷WäÙ€ËZcjKŸÇ.À?à0\f.þ}Ç"Q >1¤Èʬ¬ötº1’BER$E2%uúï·_Nêô{õ O6Ó¿ý8ÿûëßOýÝé?ß~>ÍÍUCh×Ê=xjW§ù¿?ÿ)üϯÿüæ•~èN½õöô~òn|p>ÿ}úË7ß=ôÔª½}ÈóòûÉ ý¦5/¿Ÿìæ™[óò4¯Ú¶†²êfhX±Áò©=’Ú7ZjßTp©}SAàeó/Ý`xk)A[WXRk^Ž ¥Ö¼K­y9‚•Í»–'ê>3”‰šÔIÍ› -µo*¸Ô¾© ðøôø à´µ°¥wFŽ4Ζ M 3ìÓ#â@36-|´Ö>Í6€iaÁ}Nˆ˜×ùî‰C Ü˸ØhËdqèÀS9çoY,— I d“ojÒ4ý*ÃD÷ˉd×ÓÛ·ÁÏ+1öÁœÞþvúÃÙMïôöÓOFýñôö¯oýÔSÍM?©n©è¦ïCE¿~Šúi)úIr† :P…^*^ß¾ýÌ 0Ób| ý‰Ó˜8ª‹`ø ÌÂ$V (¥IÔ9¬ÕÄA^ØZõŠ ÷ÐslÐòíž·ë0°]HPgŒDDZÑslÔ¨ÄÈVïÌS"ÊãÒg@|y_/â4v¦QV죦­y굞&d õï"!ƈÃu5ZUÉ_‚dœEÒØMKXñ§a…ðü¼TØ„¢×PÑm)a ¨P+ù5Q»øðŰ] ±ÇÀ 8N¬>)ÌqV‘/©Ê°Qt3qAš_ÀÄÆ$[¾¼8­y _šÖK¤Õ®›.ÑVܹ+7 ÝÄ[nxåÜpæhçt0gNºˆR/Q Ô¨„/ C=1*hÃ+4£N`_~Xy  êW6¬éø|X yN*í%Œá ðÏá #¡ÇàkÑcYe Qƒ×I]LoDj†q>Ý‹#ªF] ÁÑ‹ÂgÁÅÁZzûX³Û«d… n>ë ñPVƒP *¯„YGá½yd«B,g;-2L€å¡])gh?¸U‹ÂOq(QoqUheä,Rº7Ñàøj:Û [ #€œ‡½Ó®åVdt¶B ”`°ù¶l‚VB•q]Q;Ù-M Jªê ©üÉŠÛÔHUz¡l:ÐÆ:uÏ–r¨«2R&CÐw'ÃQÕ¢ö\Õ³€óºñ\ÑwG¡„¶š3•Õpóe׃‚~dâš,¨lOžÃjFQZ‚îÃÛaY×wÓJ Ø”Å^ €›ÑøÝÀ0†s#³TnI &Ÿhˆ³E•(&¡¿J1;»¾йzÖ/@?:ÁÜ/(*РŒ³Ð`Æ¡ì¨ L£f`–Ö²„H´M ¤Íº–àŒC®KóÉkufaRÃך}!B1ñ¤.BaŸø´.Ì™ÁŠÎÓ±_‚›8¨óa †b“±\8鬎c@GÎ¥ åJbì€ÏK¶òÚžüË€Ã@ë({d]úÀVš6l¨¤’±>ÓQðÇ!€n8èf4c@¢Ñ ܱMÆ%kˆÇ›Ù¶Æx|·¥vVMóýg}?y?»–(:u¯æèkjÝT¼Ÿ¬òs¬*µo*ÞOùTss(w3µ×©µÅëÍq.jÞT¤É©}SA“Ss(›q¶­ë^JiÝ¡1ÎD­›Š45µo*hj6x\vš ž}ÈÐm}J205§‡õ 8ËÖ¡s¤ÅþN·§Îǹ7Ï8ZiäC‘ËÑN=û‡pŽcyªFÄx¤™òYͨYcáZeÞ¼8&Œ:J€°Èfè Â4¤M3\1vê°®+NâF¸Œ¨)ˆg¡Ælg¾Jltfhïu=Ðs"ZÓS| Ñç:HpÈ—oLˆsˆHw³~~;âMdN^Cˆœ{Y޾ɶ$7a1\ùÌ—ÊÇ0`W%„ú B3žË¼ëœ°ØEtJ‹ÑHXx­H°àaµ‚ë[dkcÎ^`'#~!º§ˆí4½âã!¡>;.©ñËixaÙÇcÆyݮÃÌiÁk‘|±UÏ~î¼uSñ~ÊÇZ±×r§Ö¤äyìPJ>œØ‡¢æMMÍky^¨Ïe‚œÚÃhYû¶&NÀ à³Ñ/Ù— +Î7,-ƒ¤Ëñû——¾ELêI˜c}»®œÆ‰ä4ü!J7N=)ú‘ŽÞK§ƒ4d3_÷±0µ¹á-éÑÚÏyV‡µÙ PÏ ö|®ÎÃѯO‚‰`ñ$ä›úw–g §ð;ð[ñI˜×ªJi9·žw²£ ’¾û‡|æ_l稸~œW[Sñ«8~Ж†ã]{ìMξ#1ºXJÑ ¶}íü»@à'‘ Š8òAy¸Ï/0ìgÆØ…ý€˜¯ýXeÄ¥‰~l9ñ bÌ@ñh&Ãq\¿%þ.…”±É(3”ô“ÃkàR”r窄1æ>c?8ä8ä‚TïºÌr{›å¦ŸÇþಛé±úï窖RºäN¥®+Õ9øFùˆ±ó³½•ƒÔ)õÙRªá¤x\GâSåŽÕ:d9»w‹ƒ” hˆƒˆžš…ïKƒ~á8ˆe×Ü7ÙÕTXƒVSa•çKûnrcKìíU´â]äðƒû싸Y?—¸uÎâ+ ª¢ ¨0 iR˜3Ôó¬¾lHãËC²(ÌŽ¿rÁ€%+Õ°[<’×4¡;pƒd$eÔ.î“.­ˆý|U3bM½B¬Oñà¼Oü6°eX<çûlÜ0»ŸØK]Âj˜[3ùªaRòêÊPð.°V\‰‰q zñÅHËíøbS2@ôãfA÷V$Š£~…!ËbH"Î22’• ßhpb‹XžXÕ%¡î¥Éi=02çoªöÍ…ƒ°¸!…0žB§^^’™þL‹Z«õ˜¡'|ªuÒ^̈â(edƒ­RG' | Š…’%—ì?‚Õ(Ù‚²ºÜöû¨ÙR”ÕóF. Þš¬Vc¼'u©ªT³/œøõÅÖ„!ÚŽÐÃic2/®¤"°e¢ {C#{f,‘5†µ&¸£ñÆ~Vo“81ft*:x²Ä¦h’ÌÝéÃéoHËH?`¢óY« CÔèAá›7BßI(þ,Yüìò€ÒG õ8ˆíÈìà/°H#RÛÙpÂÙJ}26L°?´hbâÆ=‹2Ie‘´/Åfo²?,Åj6i]¨•N¯²DÓð=t‰–«sÍUl OQ8è%¦ö l é;JV! –Vý!çç°´ÌÆ/ )Ñ2ùu lI½É–¥RÒ%DÓ]Fé2§ÕuÞPƼ!;Ϊ¢L¨ˆ‘ÁãÁ5iZîU.8JÒÅNå 4‹³ŽF‡Ík’úú5Ò S9š\7舨&4жâíÙAÚU>¬§4A4þR>mXNm­Ò”«žÜ†€k ä$„gå•Üòiɾºäfo“³ÝŽÁêÆÙ=W¦5lè'˜×4rÃ¥é<Ìiq,z4ŠHÂM÷îmÓ¿»6‡KÌK>À™FjCìS?×VÚ¤Ö†P:E’˜ò[’`ïÈVDÊ3’¢["ßߟÙ6™ðë/9wÍÍÑ‘’D­ a5¢§¡bWÕÑWKë¼UÖÈ‚—É‹R÷ØË¿sˆ6‘ìVÏ«$® `.h_& Еéš=ûçʺ暿+hÖ5Ç{چƚ·ÌÇSÍÐήgÖÿ¦ý(Å þº!5^1T=;ÍK2µ"†õ8Ä»ñSˆL»ãÕô‰úñ@îÝ%©ïö5tëlźs‹+ŸéwMî-Õ¡YÞ Ó Ô‹7ÌÚ»ÏÜ.æîÄÈ*‘ºäPùÈÏF@•0̲­ÊнÛð®’¹š¦Gô×·dænX/;–§úÏæ®S¼.×/OµèÞ„ËUgCm-Ñ­°±QO¢65¥ÒûÉLöÏÚòòûÉúùñÓÔš—ßOÎÏ‘ZóòPÞÐZvv½Iv†WS9]ÂK,P¦Ö¬HP§ÖMÁÚ7yjßTìlk…ŽÏ0­°ëü9¤Ô¼€Jm©DpS[^&¨©5/ÌÔš— âÑRž˜Ézb޵DÌgSS*EpS[^Žà¦Ö¼ÁM­y9‚Ë¢µ$耓×–i2º¥arF75~’)ÐáØæ0-\¸OmB¦c[Ë´pð>¯)Û˜¦…û÷9éòÇ–vÛYŒO·\œÆ^eZ¶ë6LœI<’ÙÄyµÓÄÇ®–žã “"Œ®_ùráêåÌñ4os±›+KÏêyžƒ!Þr —›—í«“•‡oVÅ[U$Àäåš^ÏlWXî5ïfC 4 <Ù÷Y×ï}ŽIkÍH–aïü(JCpc¸ãp1ÛÎÓm;×±,7¹É3Ãcâ5­JΆvJ˜fçXªºEŽ 1±.l×ïDÇç×îØÖÖÆ§Éw–UßLjx7®4†.p‡ÿB>·ë%f[X ¼Oá…lp¿“ oM…{âø}bÒC9{·–]psLË»dKÃ<4Š«áÝXxŒ)>>=Jô‡ëãL4È÷´! à­e¸\´ý‰"£ç»¹švħ¼N o³×_–®_¹‡äæ6<ûtœ¥=SRwÝœaûuÈ ©Ð¡P¤þ:¿Xay,E¹øàŽ·Tù²Ô…K£ ëpuµÈÚ.¹„ 9m Åë e§EHÝB¹Œ<¶áöo>,\׋ʳn)‰gРόZ ïuÀ¶uS—Í«{qÀæ𽇸8‘P¤¹bz*{DU6° ²öÎrKk&ájO‚7œèÁÌáooíX[ËÛ¢yts¥öÀ¥cæ$‹^³—Lƒq¾€¸0ŽîLö+ú¢å4G×J F³†ûÚªœ1»YË`V¨Ñ»ÿýPû0 endstream endobj 54 0 obj 5035 endobj 56 0 obj <> stream xœí]ÙŽ%· }ﯸÏÒ.-µF€é-ÏNÈd‚Lû%¿Ÿª{%JÅ#UËí†Û¾µHI‘G$¥j.ÿ{øõÒ\þØ<šKgìô·ç¿¿ýãò·?\þûðËe¾ÝùñцûC—Ýn.ó?ùsøŸßþõÐ6î±½ô®}t—¯—¶m¦o¿þsùëCÛ=ötÓ˜&»•~}½XÓP#ó½ü÷׋kÇÇ!»›ÿþzñ­Ÿþ›îæ¿'‚2ò®Ý~7Ý£o½†~Gг®T¦»ÙO¢:Ý]\ ºÓýÅ¢<Ý_\ Ú3Ú®ºÁ>f´ß~&Òãí™Ôt/ýŠt§{ùïHuº›ÿŽ4§»ùïHqFÑí÷¤M®%í?I=èö•Æt3ûI4§»‹ Duº¿¸@t§û‹ D9'-Ž+£Ôúöc©A™S;¹Ö[M¹dñE¾x6UlN®Ë>1Õ³™fkz]u’D<›¨¶f6¬k^§Ïçyl\˜Jlªâ.Õ:5~Óãl.µ:3‚d³®ó ô:u}³À¢þõB¦÷éý¡s㥷njáýï—ŸÞüeRŽ÷^~¶ÍŸ.ïÿ~è§7›ùÖÏMw½Ð=vñB{"ü4Oןí$¢p¡ /ÐæzáõýáF…1s?w&cX’áéBã®Ü$œÛûbìõ’™¤¯}¹]ièŠaòpmofÅ, ×¼2žÙH}¤­iK½:qƒ™H)uÒ¼žÆ‘4/œô&°Hœ[r]erHP?Më2¡Ösnôœ{¢‰OŒÒP‚‚iÍLBQ,7áȱV䨋Øo„n‚"–Þ™&û¤1ÆL2ÒzÆiÚyb ª²¤%JÆÙ’3¦»Ò^†íO¡›¸µi’¬†0Íhæºð›ªÙµKá¹ÔK¼@Cñ¬[ûÄ»µáB”]cØA…ÑÃìpôFÔY!oXÇøEì‰dÙW®RœÎ ìEƒjË„ÚgÖ­{eÝωÅ#§ã•?•¿“ž³?{â%t;Нte”É«\E·üÛ‡~Fì§“Zñ+ŽìÊwwóš9›­8˜Q|¾øß[q´ ¨‘?cåji{Ì…I>XUÉÕ™y®VÙ Ð;ÈÚ€!8œ>(ÚoVÖ<‘KH‹¬ïEÒ@áAÞ@ü3S`‘>pòÞu•pHg§?Mh4ÄDÛ8Ù6!`›x/88Ã^±}0½C2½£Œ‘f\²ç\ñÀ»£á‰Ö«mÚ²×ðœxâ{Ïu¤—˜è8›¨2´¢î&;Kl¶‰š|åcýÌÁ„“Ùsu彸í®Ðgrý¢$ëܨMÚˆ*6A_m:÷‘À¦ïçhïS£±u_—oÀ²pÐ×W®\ö½BòhEEàC‡°Jè¦ûLÇu]óÆÅh· -…‡2Öª1P?°Ö÷Œµ>K¾+¬U°³wÀZØËç`-nÝ>i]sŽ8cìM‹_J4´ X¼± Áÿ¦QydOˆîvð³ î‰wêC½Ê뱟Y Mú6´ÀÀ åF ‹ÏÁÀFV`FVË.@£Àœ Î NÆà:ï”ÐLDì¤NÃlN±çE§à=aª ·†ÑaG;í°&yNŒµn ؘÝåšØºZ±ºIÃŒ4³qßÄpê¤^èˆl%Ipˆi‰>Én I7¼½É…fâóôTß4K.’,Ádô¡]“º Ý7Üâ÷éBˤ×<¯ò¸ümà–ÚO¡ç©Ò«¸@ ­qœá>2¦gÚh‚l&¨x š’ fö•Æà‚~1MÊRHc ÐH7‘hÚÔwÆ`ÞÛ•¶Ú0Ôv)šÑFuR Їµ‘8›øÙ•óÂyé7³ÿʉ±kg uf8Í6µýÌe>,æ “uVÒªúICœãã†AêR%ý0ë¶+ª8j#ÂW–ÚÒxuPT—‘xm:‰(°1<3±Rè›É IU7¼"NfTçðµ'3„#d%áÒÕ§ )( Çí/ÙZ7Lí :½Úæ~6JËW€ŒÜp8ΠȰÏIò“QxŽí¶’¤@õY¦Êa]A?Q¬2 ÛmMœÉôø«J¾|Aô©]y8“û2ë®kz¥«VÆóï¨\OPŒ­’l^Ù(ÐmkMrtež"K¨¶Â¥íK.‹yU{¹¾ÖÂR•AòŽyÇ¡›#ɨ*IMú•ò7£®’½ÕLt×L—¯èàd£;,ŠÓx;X#Ò¼bWeïæ–È}îñ èËJ‚:~q  v\lfò/sd£bÔÃÆ÷¶z€&‹¬¦ì|¸ŸúÕ ZpuÝJÖzÔLYU°·¸&±ÜBer9mе®q͉¯:ômùºR·ü Yûâ+#[N­ò}« òMµ;Ë  Ý48*šfÓ+ç%[ˆÆ9tOFzäO0iE€`lÅIÝÁa—œA1Ií’s%_ÛÎËn4¬štsJ•½²Ôb°È¾}Ðqt]€'¤No0é>aM±Ùó5&B•£¡Ñµh¹:ÂÐèKè…eïW“&²5q)Å7iúÖ/ZËÍFLó§H–’7Œã8¦˜²bÕ°©]ÛGç;@}x¢:ZÈúÁÅ"cËêŸS)Ê «#qöNJ‹VMá„Öz‡x:Òí¬u4ãz•Üš(›øÎ+Ó‰ Ã."ë—Â’—è+…MÚÁ‚+ôRX€˜aVáféÕíH§dùuQKõˆˆŽ˜vÄ—+µ™w5¡Î®ýÅÜ6Áù~ο}øéͰí=·+sŸCöÍdvÀ4¦!îdÆåò­Í7ÑŒâ@O%4Jæ%“ž ¢$rEΚ~Æ=1K“-†…HɶõŠdÄýÂõÕV5\_mdFßóŽzN™ÈЋ†}d ’§wÇQ@¼C©¶šêVj¹äî–Ù©FÏvz'³zirG£Í*€²åñ“‹FÛ•é„<˜RŽã»&–…§p—¼i1’ÎÇ×—ÃhâìºMUÐXÅÿr\¬™IëŽ@œñ+æ Â\Ý-%AÌ–%œÉùš´èj<`ú‚ÞæyàVh)¦%cý\'S’&°Çµáx”g7RvyÅf_…ˆh¤qU!†encþ¤Ý«†îø úp-„eæGÐIBÕM2ÎZŽ`ÕL?wLÓÄ£êSSŸe3(Š­Þbï@è&éwq;°Y›¢9öD¼ÎX6È®¥°Åµ›ÑÚ-, Ö¸ÔÚ6Ñ­ïX=mLò«v§-l˪ª*# cи2>,›³5,·õdU_ˆeqÈÖO)Ó[Š >à¿'ÂWw°†Z…«>¦Ðöðià)Ç™õ!Áâ: n~­áœ )™6ÍvsÅ{EåbòFße“y! ªG½‹`[ŒF\”‹ÄTø·cz"Öê!(Só݇k³Y=a„BÑI) ]ª\§â™Å ßÜ~Y$„ï¤';Lj4­(ȦìS’\KÛ³Ó…¸œl¯‡ M¦be[0µ[¼ë96D-ON;“¾o‰"ÚSšõ;Se²­zQ«%ZKÕê|u¹ Êx°AuŸN+Ý!lr,h]”‚(Y%^¢™ |½]`Õ¥ïb… nfÒÌÍÖ[Žf§È}k~Åx)ûPDªsIyÉ j6Ô¶ÿÝ%bU±‹·û=wªŽŒªH3Oݶ&*¼¼mm_Àh%QN!£ÚÄm!#q—$6sg¿‰²%M殉÷p޼Íë…³#îã qzîm˜ó¤¥FÃX³¶.LzÛÿ³-,1!Erü‰e6)hŸ‡ÅÒM¼‹P›ÁrJcÒpäù¢¬Ë {^NwFtbcÙb–)³+_(˜¥g‡&A”$g1ñ¹~U¹qL÷ñ]&“í3á’2Ääd¼0;n¶:òŠD·Wy©!ëxW|S”ícbtà­¶eòW3²lÏf!#›¯RFV>I³ãÜå«cxBI¨ÚÎbµØñM]Ïatì4ÏÌ›ü›¾…‰Ã“‚.¸€Š# (¹k6•õLó ›v%JËé ÁÚ±#v>G1¥µ›÷ŒÜW' .¾à)ó?P®mÇ9 ×l3€½a¥ z¥”k—Ì©ÎýÈöŒ‡¡H&®\Ú; ¯d{•¥ mñX—ŠS’Ji‹ó %„¡Å]ž1ÑÒÎ+ £Œqƒ;šµ`ÏÉpú¯BŒÏzÐc}a¿…!³ù+*•sPd~à•M< feS•äyä^`9W,ö,³# ‡úf(Z2¬,W°‘8Ç>bÛ|ÔБÂñlräóƒÓ¿7[á²*n=vHM4Yׯ_–l–fæ,sÊ~za™²âî¤*Fq^TUd§Cå”1”ñ%½á1áC<±)ËFæ„U K»‚Râ Mþ' –`¨;×ve¬¾Ôª¨"ݯÎ1œ|÷¾y¹VîÔåñÒooüylù¼© ¢ý!¶=%° cÏÃDZà¬hÔÛù[ %«®9‚f„½8ŸtK©²^ÙW³xÔ¤_P*÷ŸoYf¼›/œk w©¤U l>Ù¸˜vζa¬ñMœÒ§P¦öL˜Ï6}åczš–æô¢žÉ4„à;u“ò‘¶Yfò¥ôOê-~^®“èwÖ7ñÛ$M†±;‚ÏLü°:Ú鉰ÂZ‰´+Qø´/Z)Ű™qP\±¡®P¾ÿM›ŒaÉû=ìÃñú.ë­ÉCfs†xÏ] 9C‹bqÎ+:áÐPð)‹ÿ=1‹m‡êk»âi{”?ÉZðD‚Ï"={\ýŽCžvœY¡¤dt °ôèxeMö!%Î+_¹ã0‹v}®\(iÍ®wÏà¨võ @øÉU¿»[Áþš”væ7«²c!ŠË°–é&Ã¾ç– öÉÙ¸ÔJ †­Q`ßÎÈ.tïfµ[7ƒ+ZÁ¹•\•CýÞÖ3ŽÄJå}ªkøÝEKÃÛ.;­‘ïË ¿ÍV^pRÈz–é\½"ì ¡á©'€-õü: F)/Nç§­œÉ¸®/»ÆC™ÃéĹ:¤`ÃÎÎ’£Æ‡7ôí8Á 7Ig0ìN%mƳgÀJIÝґƸŸJ<«xKú”°naŸíncJPï*,  CÕúøªh+[ó¨îxß¼xÂ(&pC‚EÉ€¨Ã¯pYw?CwÇ'Õ¯.AåŽvÖ™¾Eð­Ç£úøv/ø׊·‚Q¡¶ªP¼`> '"aäYgç¥T\Á²ðA¸ÐnáHT‡UØLÔbúOÝ•¾¶`:¶ñî̢ϒ‡)|Ó b'©lsý¼f*]mëFü´ÄÊT‘‡8U²P!VÂiÇÃÝõ0è G©ân4Àì8+O7®R„é®Ö¸â;š…ƒ1Õ¼ºVŠ8  Ãh(¨vQeuK¦«"±ª®Ò·î2×Oª¿ÿ@[û¾´¥Ÿ°´õ4´ž<[AÒH…ÈŸb ŸBz*_‚t)_@#, 2M*‚ý¢ “T²ðÍ™­' «›+¢ì@·†va>\ÙªRQ+C·œžºŠ×Dck­`m5˜e@fÇ"¯*¹ÝÒÞÓû×ëêóþì+Ay<¿‡®Ï¦ýÞ%Rälúl‡¼¯[q5ßP££à÷/E†í9•äö«ÕN²‚iü¯!©§ÕÝHÐ `WE-«v.ßö­óOý¯Óbíú¼¾d†Ë=xðÒg. ÅŸ°ç+;ÅGÄú…‚IÓú§pIÔ]÷Ì•Bu\§DÛï¢XrVªôI’ÚHýÚñâñ 5±zy®—ªûAõ¤ —ê‚XŸOmË9&zÁNåiKâÇsÇ Ñ…ƒ2^‚§cåÁY>hëänÆfz¬ÐM8ü!;°@¬N4ÍÌÉ©‘=ìðz¯Þ\q(‘eYáµ_.ÿ`¥, endstream endobj 57 0 obj 5013 endobj 59 0 obj <> stream xœí][oå¸ ~ϯ8ÏšÚòXHf’}Þíý½E§@÷¥¿¶E‘?Ór2“øäììÁH´¥O$Å‹¤#W—ÿÝý÷R]þXÝ×—¾óßaZþþö÷Ë_ÿpùÏJ\þÿíŸw_îºþ~¸ ¡¿|ùÛåOÏáRW—/ÿ¸ü†?_¾üën¸oæ'gÒOU½V4sCTÑÖŸÖªº¾ï©®Žoõ÷]ª׊6½éíý˜è± ~¿¥núûôJýDýªÝZÑ Ú>¨ŸYm:âŠf¢fz¯£º«šØL`.Ìu±·IÞˇ!ãžÌ˜kædàa‡ØêÈÝ@3©_QcXGð»ûÉãT=Q/Czâ3µÁz¤—‹_š óóbu=qëUKj 1ܦ…° Ufƒiµ£¡'&µUËy“CÏÁãvÕÇFª˜W‚žvT³å1¤*ÖçÁ•>L¾g;"ËÜ0É ÿl’!ëå3L¢2/q|ö•™)Ÿ­`Ë3 ×–_xúr÷‹µ“a±§h(©Å­7VËZ·³¨mȺ֊kfâlûúa­J_žh~¦14ôfªh«0Ñ{õÈúÌžY‘ÞKšÐVcžÕ iÛÒÖë/LË›¡‘ÐlØÂoŒì\ÕýæQMń޵›û‘©˜¦4¸–o™Š ÞŽ§³ÐŽ{Ê]îÎpFÏL)zqªe‰5+ŸÍèe' wc&¶ašÛÙšŠ¥Ù[…ùoyöÎû¿„fæÌ—¨uƒóœ™¹ÌóGš;¡æúðÉÌW˜ÀÀ³óI¼cH@óvž®ŸiZžÕÆlùFOƒPé¾õ/™ŠE}ñÜqo[0¾À§ v5ZmBY迬âiµö¦ÐkW±|÷¡–½À¬ƒoB]O~<{…Õ­Ú&Û¢»C)›B2¸[Æb¨c±1ó Æ¢ŸêìègwÝÆy³¥ýðé>ã6Jvf+5:4õ@7ïàq6f8¦‡;ÒAòª9óÉxóD|V‰4æ0ùL7&Ý5Ôr„þ +{ªÓöà—Ë2»ÃÐÏ8. 4ÓâGÒJœù¿þ|Ç&`û,¬¾ïf^½tÝœÇwTü÷å/dˆZwͽ&êò×¹×™ÕšœU|½4C3BȺ<÷¬p¬Çò‡„‹J VÇTÂÁT]\LÎ*“u™qIÏk¹›á•W¢FBÕeÆ%ä¬"á².'\ªçXî—g×ZR¸ˆJ8˜ªË‚‹ÉYãb².3.é9–›é~R ‹E…,Ñ ŠÐ³ 'ä5 OÈ* B+ê^àÍÿVØV á Š”‘T‘ÁIJ #õ´–Ú)(­Š%Á‘¨±o¡ê2£rV‘ Y—*Õs,÷ãlI×ZR¸ˆJ8˜ªË‚‹ÉYãb².3.é9–Ûvi‚Å¢B–èEèY…€“ò†'d P!ˆ¡Rö+–>¢¦ê²€crVÁИ¬Ë Lz^ËÍ4Û3áÓ#EÏ*œz ¯IðÔYE¨ÄŠaI"àZRøˆJh˜ªËŽÉYCc².30é9–Ûñ¾Qœ‹E…,Ñ ŠÐ³ 'ä5 OÈ* B+B;ÿe€kIá#*¡aª. 8&g ɺÌÀ¤çX®ª%¶``±¨%:AzV!à伆áÉYTÖŠ%nRQP,r”¨u™Á 9«HЄ¬Ë ˜éX` ˆÍb! $†Y y"qÄZÈñåk!÷ÕÊ‘®%å*“g[þ™;/ñ/k!s bã×BnÕ]K™·r)·aÊÀ¬¥Ì€È_ ùVl-eHt\I&‹…‹ñè~T¸›•Â#?JÙö}wÉ}îû¯’ Ù·á%3ºoÇJ¦DÍ]›³ÈJ|)’.³{±e)Ò+E\å §y”É—`É•6À&ó,fû9Ø~&TJDüÜ`?Fß”Kê~´X Öö#¦RÀ²5”œ¶ò”ÙA¯–Lšž'ñ,ç©´MYó„òE“Of‰œNñ ™ÊS-›Òä ä&ß0a}ôcLmbnÚæ/Ä•&î´á]üÙØÊÄ^ZŒ1ÚÊÃÃ,úÒ‹R²F%²ÖLWÒÖByë ¡+‰g5òD’¹™¦¤®+„.r×BW’Ïjä ‘½®`º–~V#Oˆüu…Еd5ò„耮ºhA\™™ö`w==ØB²èC—Àw—1b¤^øWg·,í†mhâ>ºœ™¡)ÖäƒS¯<Ó„e#˜Vx¯Älœ5xŒÐ힀^`4ŒÕœUÛ¨¯›u³ì-mð½vçU”TݧÛôÆ´>Ë`üf—/à~“;ܪ¥ ž›£Ç28›Ãã§“ò„å!ª°½ŒÔ7Ëݺ»u@»ë`+Ò,3‡æÔ€£·Z7ÐKê´è“Õ™ÞÚ3‹„&s#&Ðv<÷ÓÙ YÛJó井˜ÆœÅ$à›ÞÞ{÷\Djq4I­:ï˜Þ~½;Z+»ê“'†fX×áNk*ÌLPïÞtÛ&&ÖQÀlêrgÚh]×EC‹ˆ³ Ba¿ ÇèXŒŠ*l4Úβصܤ?Ÿ¦«%Ùù *7´é'|Ôϵ°¯àD/ª\åÚÊ®ZÐnMRËu:¶´qÖÕuŸ~Ä!†ž^ÑÅšt º§ËóuQWr\f7U¶ÂTÁ+èÝ-W(kvQwÄÑÿo ù‡ÿ7þÿ4&½Âÿ£j:6Oy@ žÈ¾‚>^¤ï~>“›Ú6…û“e!¨´sLmeC¨«¥ŸÞ·Ã²Â´!9ßì°‡äW!P“2|Ùá_vfiFÙÀËÐ!Ôvsn6qU Ö¡ÜÅR‡~L‹=nÐà©åÎÐÊB€ÁÏA”=¿‹^L›Ó¬$mÙºw ’üuŠWÇLÝòn>ùA++;”â‚JyôËc•{¤Ÿ‚Äz’Õ)ÏÓÃéòžå²H_1!ÊóЛ~8uº^N½/ ËYLd!ªTšënƱós–h¦°pR`ü=;Í3»7°jX ð-N„Õ.»c¬&2PÖpYLnf Pãsc5ta*j­¿@{<ë ÏVJNN—[¾b¢wþÛ÷ö¶ït1||Û‡,| Û‡½\…í Õ¶¯êŽ-ŒiÂØ:KÛoµ×Î~w “S0¢¾ÏìÂÌ}æõ8wvÃü/¯ÇaRëØßbžÆ³—[LôdG‡¿cBq,C“Θ•ßfžÎÄ,®»…в¦"°g¯,â´“ ´Â@íLÖ>ï¤ØgW˜³1¾'A•x;ç¢h§Þ.‚?ÃmÌî l´…¡¥3ŸêÊ Xƒ°kú>[ÝÍ„°•|ê®ÙIMÂ0p”â†Ø @/ù\/ø\°‡­½ò—Ö••üe7Ìï^…¿ìì+à/'#©wñ—tCþò¬ÑÞ”¿<‰7í/Ûx!2¹t¢mÇ+YŽ¿-‹’8ÇÅ¢x¯ÃÅ6͵¸X›²£‹}4’z{€A7äbÏíM¹ØÓ™xÓ.–˜Úþò ü%êî9þÅ{þ²š®äÇŸœpº;¾7ì,ÌAßþ yóF{SÞðt&þ¼aU}˜Uðä QwÏñ†(Þ«ð†Íx-W!´v÷[Üã«“Å#ü¸÷xÚhoÉ=žÏÄß{Œ?“?{ÜÐÝSÜã†x¯Ã=öá*œ#œöíLß9–Ùu4w,sã†\ã9c½)Çx2 n± f¡ú#¹E«¹ç8Eîu8ÅÆªÜs•®:äV<ÁÏ7ð²´âëŽü`îÓk>YÜšŽÁýÂÅvøc¸ª¦)É!$ÍìhÌoO6¯Ï[Àß —ç5a„3 ð3~¸.äÓöÙâ¶ E•ƒ_ÁŒ|é-7¨„ïtÇ ÍëÝ­ë]Ë®Á¿äÎíû?¡*_{‘~b<•ì‡wzÙßþÁ /[TÜ[‚k>)‚;GCn*‚³,|ƒ_eB'üdeCáÀÓR¬âšÅÊ¢üv?»~aòJ=-Îø± $ÂÖ ào|Š8p´®'v…Ù»½ìxâh 6$óÃýÜŒû©Úâ‚î÷s–ŽÜ”B&¾… Â^ÎpB¨vWà„ÂT]¯Ú@‚7h½iºçÌñÓ½N¦i¶9_HøÂXÁýê7“ðm)âŸ{+>wCu_ásOÓ‘[ò¹L|Ÿ»ÑË >wCíNö¹«ºåeBU‡¨ÇŸ·PtâožMÙd¸É¦³©ÓŠq‰‡¶PÐ8T·-õÂ(¸Ú5-¿ãÙj´í¨ sñE°;€ê[FꪢI6ícvȤ¦Ši±Ií+ƒ^máÒ<•O/Ñ “ |¢3lè!Açdy I=Ô7¡3ûÑ®jÕ|:<°j¥È6¨áv&óÄÚKü~UÝ/7ªÄX­ßùI߯Š~ýùޱ,'Ãg‹_Wé›aõ ¬Ê>¦Êäz¨–oà*z^óuœ— GÔYÅ×KÖßBõÔ,ÍD}—ÊòÙ]~€:Tä5 ‚z «H*f¦Ì‚Xb$bê‹©Y÷Íd]æžMÓ<ôûÁ¨G-ßqEÉàš‰æZzÝcªaº¼NlÖrÏF¯‘ÉÒü‹>Ô6-@xUÑÿx|ïÊ~¦ øä%GÛON÷ZöP-nkWKQ§äF/ø7*§#,&ìmüŠOÅ5Ý’ilë;~®íÆû× U¾YÖ@MÈ{ö?Ø÷‚OÁ-Ù`=6ö^Áíþà2p ql:‡G‡l@xà®køH—Ÿ# 3 w‰îQ—ó°u8ê€Ùßæi$È—^’aâ•þ§„ªE‰o‰ŸåëdË'x ­Å+Ø¡1–3ö|¨¤ K¼xuB’±ÀÑü ˆ  Š :pÏ%,zØÑÂZ *Tqcës7þGA£ì†ö~ÿ æÑöWxÑþËo¹s.v}°öâ{šýÆÂ-Ÿr‰ñf§n2:-÷ÝBq ÷uc‡5÷Ýjô»å¾uE²¨åUÈv) 6ØTâ²é/°R×oIYCSú˼µ+¤¿,èýô·ã_ƒ£\£=‚¨¾/œÂ; eýÕ­©šÛè¦Nßgf¶ù_¶¨–Cù[Pmžì|®å[MÖƒ+XTA™ýÿm”&  endstream endobj 60 0 obj 4169 endobj 62 0 obj <> stream xœí]ݎܺ ¾ÏSøº@§ÖŸ€¢Àn²ÛëÓè ô´@Ñ-ÐsÓׯeSEŠÖììf=3YH"R–(R"?Ñ’§ïþ÷å¿]ßý¾?™n0vù{œãß¿ýÚýíwÝVfüóÛ?¿<~ÿ†ÓØ6œB÷ýïÝž]gúøÿt´Æ„?ußÿõŘ“[XøUšVÊÓ÷/¿°Æçñ䕯ûí!·ô­<Úyk9œlê­_)ÃiBÿÕxã¶jÃ2& Ú•2f‚‡æGlÊLPËŒ§!U{€J^kÈ: „T#ð#Ì”»àO=®,бOý(„{‚FÁX.­O]÷Ø’hÚn„,œ™ Öè¿f{þÒE‹a\¬½M¦!,O¦¹´û/þ‚V÷Ãmnâà_ºìÉ(þ»û+L7àš¥ä “–_:¢…3—–_:Â2+2—–_:*EänåažOŠ•ŠI¬ù› „_’h„_’p„_’x„„Phm+¢Öd ¥Ö$ ¥Öä¥Ö—J‘»E¥e!„%iÍÂ’g(“ÈÏ }†¦ÉðØ<8à dôÔ ÛÚ˜ óÃÉjÅ$+¬HCæç¶Åv¦ãž¢{š7ßêߺ¹íž{ü(º–ÍÙdÏ»y'ô²àâ‡ìŸŒæáÍWRM óı©UÏ|i)f¥;ŨQë¤fn¾ÿÆÆj6mxî!I Wj#‰9•ƒ÷H€Tu³ÓŒâ¹6F®–•ø@Àl1ü4£<€¯ú ª¾¸F{!&InF>]Ú*|H«e¸Êð¼H;LsB¡›`2ôÏ Ø<  ä¾Gó ZÀ€l`HL÷6Ç'^PHÖ“6:Á#H°¬ ѨùmxMx@ÁÊ15%E&˜>“Ì¢k[Õ5—Ð !$›'9K‘\0/øÈÍyž<±V¾uÁ%©å–Õ t¼ô ŸAkÅ=©î)LKÓ‡) 5‚sUqyngpϼ !)—ÉÉ˱_Ïn#¨£å¶£à”9ߊÙA.U1½Ö­7Ìr0-‰`œ çr`mxÕ‘zëê3z„%÷˨nCɰß!«· Ü*ªCÁ&…X¬†®ÀÑ,@á6hG?A¼L‹^{¤½®Å,íU÷ LB3W¯1}´ƒÚ†ˆQJü©(yhŠ.b¥ê–H¨Âp¿LÚ:àý¸u&–e3Dâ‰Ûà¡IÇK°¥ÈëžlÛ²úˆ@a0Æn£$šZØPRûÌ …å£ ƒV¤˜|ÜìU¤p¼[½¤ã&­ÑyŒÛÚJ£>@LÉ–/ÿ29ú4—q¦>2Bï™>lÏá:*DÁÐ?p?óµ8p$8èìq'þÈXŸDYm6eYR¤E 1 G¦iËE·³AS–8¨$+ BÒuaˆëjK!„¨=]g'»fö<¤$â~f+å0 k¾¹ᥣM­™šµæ!¥CÌi©œ“nXš#JJêTÂÓIú­„Ò'fj ¹Ûf£ðƒl•Fj–j9kPT:ªíymÈL%ùaPÕz!9±0rsë¯Ê@ ˦§72'ó’Ù9-Ù3sÎ@Ëv åú¹(-cBt,o—õìÌŒ’?Ë>salŸã!lžò;ц«©y¿œœæ˜þ¬èTäÓ‹ ¥‹²¨ënÒÔ-çÒSÙC;aå¹OM~å5Ê>ôÊš­ Ópf¶JàQ”^­Ô ¦¦D¾Ë”V©-&³‡µ}5ÄfLìß°  &ºôËWúr~&ùÐä>Bl´D#t;ë^noU‰¤fÒt@÷4jÖ·Sˆ âpëÚð…‚Db´²[±Ÿ¹.‘PòTçLu¹8ˆd‘ÿAÛq­Êá C()þüˆhT_ V«¡ïy`ã19¤Ÿk‰G*[~dÖ'•€cÜýq‹ eUR©daý4ýÙ³l˜ŽI´ýä³L±º¢Qž5éñþbfvÚ<Ó2@ÁGðûýà PMŠ32@j˜^3@µFï.K‚Tã ÌD:5G„îÌ1-µsD ” Iµ)£ÊšðSÞÓmÓߘÛRe>÷¬™â9ÙdŸ\†)G7IÇ„5¾†°Æ<ÂâÐTÚ1·`-œ€0SŽ*–nÞ¶ ȼ¾Ñ]3 nЧKv¼-km Ëû“É9(b²Ù&Ä IØᥳk’ð ÂKçÆÅc ””—®h=¹”Ïlb&n+æD\bƒ@È¥e”¹´œ¥CvAȲ!ÎûxŒ eƒr+lÒ~AHò~A@ I…’‚2’‰bb(Ê2®E""°A äÒ2ʇ\ZÎÒ!» dÙ;÷Q$” ÊY8¬°ICø!ÉGø%$J ÊHj$Ê0`žvHE""°A äÒ2ʇ\ZÎÒ!» dÙŸÞÆ²l[™—*€4™_P¾Ì/YÂ\¡¤dsDYV–q- !—–Q>äÒr–Ù!ˆ| ˜ÙY~(gá°Â& á„$á”T()(#©‘(c¿xõ,ãZ$"B.-£|È¥å,² B– ù‰°@µ™êo+áR&ó Ê—ù!K˜+””,c®‘(–DX âÙ9'—P*KcÆÆI½Û"^l<Ò/cžÉ»‹µ€QX[ÏÈ"Å$ òHeA&-£4e “Aˆ’ñÀZ*bmŽÄ±Àb‰…k©ˆ29Åóò$ ¬¥Â¿fï»JÿFüßZ*‘7ñ±Š9οMÄÎ× 9{þ}¢°^ö­äâÛDµNÜTírxµ'z3‹³ÜY0õF’~"çÍ7’¼g/šäýq½‡¿­±ŒÐ‹»:;×™ÄCêñŽö%!¼Î„3Jœy‡ëLo¹ß¤ž¶|ø{÷›â,a¹ÏÛMÄUŽþ(}Þl‚³vãš48Ø8áÞp¯I=ÆòŠ{MبêŽA_.>|kß(Ò.)©s´}ïiç’Ò¦@ß ß†õKJ; äBo_Üѯ)m:3.¿s¿rµ¾ë5%ñõ“ ®)e¼»s¬£ïkhì Û–gšœÐW«Kép,Mðøo@"/ñ›zm2ƒÕjˆËçö‰ÛÖ6F#W¿s—ŒæQM% ÖE“‹Ì…KDã:‘°Xœ‹Š8YKßWm£é}¾¨5Ñ£?¯Í3HÙ]¨’¸™ßKà9Ääl~]AÞ>m%òIè]“2‹Ä^Jþøúuó% ó9b’}Ñãõ\g|ýâ±ÇUT­¾yjƘÆ}ÀES¢ç ÷”Ìé5ö3jsD*@¬^åÞƒ®€ažæ—®ûgµ×ó.]ш>¼0 ×3^0¼t¨* Ï—«Øµ‹%`¾²òƒ*ÜK4§¯g7Æ¿ÄvM9dæeæ3Vï[&oÌG9'âÊÇd¤úgheÖ&{ Oeéï_íIæÎ’>ðœê+RG6ž,¯(yçÊùjË‚ì^OïšÀSÍ"—±pÂïð="=.o鹊Ž?te‚î0}¦èèîÿx3ÜZ’NxÃëÕ×á&5•9ö†ï¯¼"Xæï¯°Kø4b_ïù¿zI&2[Ïé5-¿nq𻨊Š>è¿â'SÌMÿ(/g‹—Ìj¾PM¾:q×¾›z†ïwàÔ×kü=ÊjÄß ’º26ÒàÇëã|ÇþŽúØK¶‹6™å¤M¬Ù–CÇãǾn¨ÿÛ)ãpð·ë®Î¶íïªÖ× M/öë–¨,Ó[ÁV~ƒòc°„ð°b*Ëëó¼ö›iÜfFDf ßá|%òRí{ÅPä/Ú+ù7øç¿Œl{ ùWqù}w7œÆ.@¡¾þÛ!rpB£KW}q]6N/¯ÄóÃT~¶¿ÉÐþœ„ŽðG>¸öqMPòáß±½6%W¾ÙãÓKDŒäéô‚øŽ‰™jè®LoöU^±³ª|NJ;ò€‹¬qä¡b×C|`ÇŒ¼–dö_‰1;¡ ß'YU£|ú;ý}ð 0ÂÀßýÝÀhž‡¸#€! õ 0öÆa»'€q¸¯-öý€áÇ›y£rgCNï#†´ÿý go`4(ÞÀ†úûã0ÝÀ8\‰×û~À°î`0äô>`HûßÀ裳¹Q€Ñ¾{pGCê`ìŒÃ4vOãp%^[ìûÃÌóç{¨c†œÞŒŠýï`˜Éß.ÀhŸÁ¿zÐþÝ¡tÑ­øeqLüªaóNNvREË}ŒW‡ýIÜÒ&—„} a+6Ö{ Ç+ñ¦Ã˜®×1Ü <¨„K7?Mö€ï«IÇ59ïøëJhÿä |¹RŽ€r^ Ø¡‡"ýP&‡¿âo 2 ý‰])¿!ÈÐìiÙO¶O|‚_òI?íƒóÁéÜøPµnLú$ü võûf¦Ëã5QSÅÉ` 3íl»Í¨ˆe™X†|Üû—îÿ5†øM endstream endobj 63 0 obj 3846 endobj 65 0 obj <> stream xœí]ÛŽ¹ }Ÿ¯¨çé”Tw`À³ö쳓òIXdì¾ä÷S‰Q*yìnS-7 Ø&©*‘*’Õ3Ý6ÿ{ú½i›?·ӌƮOËö÷ÿjþñ§æ¿OŸ›Íl†áÒ;û0-—ìm³ýùÛ/î?üúÔ/Óeš©.]óÖ ƒ¹LNúOó÷§añm½owˆ‘ÊoÌÅ+•ßšnê. ½˜)Þ†c³{E;^úÁ!AöØÈ‡íLøÐΈp bÄN3ÎöB0"BôæZ©ìñ¡•Ê€ÍLØÐîÃ|(¶C&àü‡íLøÐΈp bÄ^Óõ—‘`ÜEÑ™ °Rð•ʈÌLØÀî¦Ý !¶C&àü‡íLøÐΈp bÄN3ÌÛc !zó­TöøÐJe@‡f¦lh÷ŠÑnÿ ¶C&àü‡íLøÐΈp bÄ^ÓÍ—™`ÜEÑ™ °Rð•ʈÌLØÀÌÔ‡LÀù Ú™ð¡)!àĈ#œ¦_Ú•dã!"Do>¡•ÊZ© èÐÌ€ í^1ŽÛ0ÄvÈœàР)Ú™â®AŒ8ÂkúŽ ì; ¯Gæõ”UO9÷°øÙ{Æ·‡ÌKa˜…ÒØ!(Îì¦+•X©Œ ÀÌ ìNÑ-Ú̴CDhÞ|@A+•=4´R ¡™)Ú½b½‹!ns2ç84hg À‡v¦@„8€k#Žðš~Zï„w‘@tf¬T|`¥2¢3S 6°{…í.–úï 8?À¡A;S>´3"Ä\ƒq„ÓØe¹gô¢7€ÐJe­Tthf À†v¯˜Ö”™øÏÉœàР)Ú™â®AŒ8ÂkVl=Á¸‹¢3;@`¥2à+•˜™±Ý+ìÄ* 'p~€Cƒv¦|hg Dˆ¸1â¯i;z4"èÌX© øÀJeDf¦@l`w ³V˜´Âp2‚ƒbg Ø™’\ɯYKb_aLN‚úÖ0RЕʈ ÌLÈ‚™Áw£„5ù.ðº—ÔÅ›Ä+N¬GwW|¤"Ü%Vka%¶ ¼Ö!µÐ&ñ*k]àY>©v‰åט}ïÏoIþ»I<³Ä¼sxfG2¿]"Y•Ï·öÿ²$S MàYæ »ÀYžd»ÄøÙw8¿þÛ$Î,È;»ÀOvròï;SñÄÝ~¦‘3o—Øi‚g Ù¡ø8l»’°qºßrÞíÈuÎký\­}^éæ*Íó:/WgW9¹*#韧Ýç™o.ó<Ïûry×yÖ“Ë:Î9?ǹ猗cr³ž ß㹞áyÏ.×1;ïXåúEçýš\·ä¼[‘ëœ×ê¹J9]³žçõ[®z:¯^rµÃyîžËœÏ3×\Þxž·å²&’§ð¶¶ßäùÆw®ùœoýæÚ¯ùæg®™oÿåZpùX® •o5er½‘\ƒ"ßÈ•èù9W¤æKÄ\™–/’r…J¾L ¹9+à™H¾ê _É.Á ù²#|"^9¯$D»?|! ›îAS^6¼Ã–¸h;miÑò ›Â²ñ4feÓ3l‹ÍHÖ¨ ûA¿P6傦lˆ…-3Ñ– ÚV¢%6dc&hÜȦHØ6­‰ u!Ûaã ,΃â=R‡¥3>®V¦å=«QÉ«bxqLªTªðvR§¬¤R¥ °c­Jd°’j•*¼Ô«D+©X©ìX³¬¤j¥ o'u+‘ÁJ*Wª»¯]A V¯DöVR¿¬¤‚¥ °c Kd°’*–*¼Ô±D+©d©ìXˬ¤š¥ °c=KdØÁø —H~šâ÷>&ñüú4oÚVÙ¼þ³ùËKߘ¶yýwó“mÿÚ¼þö4­W¶›é§vÜã:Þ)¦c„Íó.ërŠÁ] ³+>½>}P˜eÞŠì óÉÝÄOcý]{c`0ÌÈ$vÙ›¤}qkµþ&ƒµšÃýeJyÃt܉Å÷ p ‰íÍvY4(}è)ôÆŒhýˆ%µ¸Á˜u{GÃòa¿f–’û˜œf=uâÓ´]òš¶_×<­‡ÚxB1…¡ð.±ÇjÖ“5·bH¶Ãi\Æuoí@†f>bõ³›¥ó·8îi Vnow0‰ÃŠÖ8ÅÀ×b`u/Á,v ýþâ.ÂGY\ÔÎÁÄ«‹N,Á?XüÈÁÇžÿa\±DœØ>‡N´¡Âptሺ{FøÃ‡ßNÝ'·ÁG¾#:|ŽB$ý±E`ùŸ’ÑÔë­ÕÁµ¦Ž¶îd釨tá,rq&¸„øvû’ra7í­{u'v©å‰Kúì´B!f7I`/n½ N¼¸1¸¹m’#_ç.îï?‡X^ïŽsƒ¹Ëu=Ù…ž\Â3΄YÐ5QlãìÓ'zŸö,\û‘_2—˜ä®q(ä®é޳ÅÂÞK3Ìâ™ÎQ¿k‚|ÃÐ%óʃ›'ë‹ïËÍ6dU—¾öîãáw:LPuà°4ÍJÔK³Zk­ŠfÕXÍöcójúœw»; C¬œf*éz ¾ £Y[ö³[v]–- ¶”þ¨—-µÖZ[ª;±J¶”^Ͳe÷¨a¯Â–ÒõlF³ ¶´Ût l)7U¶AÛÚÔ´¶—ðϸ6…ã[X{Ê.׎N³¶ŒK½¬­µÖªX[݉U²¶ôj–µÍp7=ýÂy[:_ƒ·e<Ë`î scvKö¦7 Pé z)Tk­UQ¨º«¤PéÕ…‹yPèu(T:_B#ñ,‚B‡iûÜY™º#Ò/ÙoX…FT-…ª­µ& Õwbñj–BÇénšøeShÄù*ãY…V‡B靖¤ò[2·ŒK½Ì­µÖª˜[݉U2·ôj–¹ûîÁÜ×ané| æ–ñ,ƒ¹íìô¨¸âwJ1æ ?'ñG½Œ©µÖªS݉U2¦ôj–1Ír7}ûÂS:_ƒ1e<Ë`̶×aÌ;ªu“Ì}ËZWÆ¥^æÖZkUÌ­îÄ*™[z5ÇÜý2<˜û:Ì-¯ÀÜ‘xÁÜýÜ®ÎU`nñI¨¯xÑ{ƒZ7âjSm­51¦¾kd̈W³Œ9™»iӗ͘çk0¦ŒgŒ9Œ:ŒYL­û Ì}ÃZ7—z™[k­U1·º«dnéÕ,s÷Óƒ¹¯ÃÜÒùÌ-ãYswv½V¹»çð‚1Ãߥ֕þ¨—1µÖZcª;±JÆ”^Í2¦íî¦M_8cJçk0¦ŒgŒÙÎ:ŒYL­û Ì}ËZWÆ¥^æÖZkUÌ­îÄ*™[z5ÇÜݲ<˜û:Ì-¯ÀÜ‘xÁÜݼ}…s¿ã­íõø0²ÚjùPm­5ñ¡¾käÈW³|8 wÓ„/›#Î×àCÏ2øpluø°˜JV…—¥×ëåe­µVÅËêN¬’—¥W³¼<˜/_‡—¥ó5xYƳ ^îÄ7 }^î§põ¿‰1²üz Rk­U¤º«$HéÕ,AÚén:ê…¤t¾AÊx–AÆê¤ø‘Öw|GÏ»ý“&H¹üz Rk­U¤º«$HéÕ,A¶Ýƒ ¯CÒù)ãYAÚY…‹éëAÓ"Õ’´ÒJk¢hmÖHЧ9z¶Ór7ö²éY¸^œ#Ñ,ƒœG_ õâÆø£ÏaÒ­ÛÖ÷ƒa? ÁRÅ{åZòŒïÏäŸÇ˜ÖÚu”ðhúA?"0 â9ç›M¸S8ˈ´Ä¤¼gCWˆ­äj“÷0|–tÒºâ;`!¯ÊíÅÝvIŸzâtXÅ<½à^q§.Jþª)uQvai© „2Rˆ‹m,lŒ2²™Lä„û±£ò­ ¥Ë)Â@hä52¶eä5½øÞ¦Gf“Ël’ϱËl¤Os¹MgD¯·–ÜF:ã‘Ýœg7j«)¿Qwbi\z‹ ç=‹Kä¤û±ãr¥G†B#Ë‘Ñ-#Ë1Ó#Ëyo–óœÉr¤OsYN;U›åHg<²œó,GÍc5e9êN,Mo‘å¼ç sq‰œt?v\®”åÈPhd92ºEd9f_CöÈr2YN:ÖG–ñi&Ë1sø+ +Éq"®xä8§9ŽžÇ*ÊqôX—Þ Çy×1çâ"ιR£Rö§n"®WÈiD4ËÈhÆE'£ù‚\CìT¡g¬ýŠýêŸÔ<ùø®}å˜_†¡ÚŪ­µ*ÎVwbÕœíÜÞ‰‹ '`¹Y58Œ¦:ï{¬›/ðmoÆÒzvöáœ!üÙ!„ExÏ„#’¹æÜ¯$†Â½ž Óönøuµ}ê¦Ë´Uö‘›öƒ»ÇÌY|`ŽÄ` ùW”âØ§è3ËGèî‘ÃŒ/q­rÿ.|w aú!² \­{R&x&Ý9 9" Ýš`ùv±‹s’5×£ƒÝn³ì_ð¹øœ 6æ)n¼§À,.û,Û—GŦùàn,9–>µÛ§¾b÷ð¹!l42A7ÆLkL#7ugsŠýŸ›ÿÜ») endstream endobj 66 0 obj 3488 endobj 68 0 obj <> stream xœí]ÛŽä¸ }Ÿ¯¨çéH²å °0³=çMÈä™»/ùýøB‘)ZÕÕ»œÆ3#Ò)’Ö¡dÊå.ÿýòëÅ]~ïü¥óaú»ç¿ûû寿»üçË/—™Ýõ¸]|hé.óŸ?ÿ þóÛ?¿´{è.}3_õãcó õïË_¾Äî¡G¦ïÝC7#ü¸4.>ŒœŸ~\¸¨™ m?LZ®¢}„f’‘d!;#pägŽìµÝ í|J‡6‰Ç @» § 슜’t`aê( ñ×?1“4äf’ŽüŒ€²Eç8|¥Ü¾62·ÓX/""B¼Âku«òaFU!^áùº_¸©¸cPD9xòÐÒnn§ÞÁÑ<ö2¿³‡I²?kã½${}üÍÙá× >ùßž¿ŒÍ¥sÏ»ü᩽xwyþÇå'÷ôÇËó¿¾ôÃͬŸ|\³³W‚ë×+ß-ÍùÞa=$‚ûy!|þò‹P*¸æ!–õj—{†‡6õ ×ÑRÄÅ\Ѱ­·kBC¾‹‘‡4¶,ÁuÖ¸šØãzC!mæè¸É©áëBðnŠ;I ¹än è+#ᛥjgs¸~ ‰EÓxEÃÏÐEÒÂ?®ZH§4¨èIçóÁzŒ¿FöáÙ©B°ÄB´P§ ¤©êÔ…—+ö]ÚcÜ4i7Ó½™I›u(‡Ò®Nœ' 1(‡Ú›>xå6tJg½îú û¨wŠƒ² •}¨á+Çê[d,àXâÕƒ «b5Õ~ R5Z¤~;|†qR("«®µŸÈxµŸ”}ÐÆ‰ð¾Od"4^<  iÁ`¾oÊs˜û&C,HBBH´X#¯Pcé¤ èí&Äxê_Ï-²Ë«–À¹aN Od è¡ÁüÂÉ Jé©ì…ÆÜ€l¶QCSö’CScÑb•êßÍœ¡™ó›“\R½}R$ÕzàBOöW9%? ‚ž´i5yEA4ä4?¨DÏ1r~P©„žØ«˜~ÅðbM Nu„5áûx”&ª"JØÎ຾•éÆÇdpJŠ{‚çÄ;óõÜ(XR1¤2Žf ¹Û °]»4Á*óªÆj›€r&{þ?JÁo8«¿PôâäægvcF¶g“ÒÄ·l{Å0ÙÆçØ«‘D2®¦ð()HÕ£œ÷ Z í²½«µh¾I±-HIfG°+sRsËSAL¡WaTFí$b±ÜZYè« X!)Þ$û 1946BY«†>ˆ[”oôøÖ§†í©Œ@ðò oõÏ&Ù(x¡GÃv ž?¥? ”u0¶ã§ë6`;Ýi¿C˜:êüðб-ɵIÛʼní›I»Èù9åÇ%ëo¾ÎÏ—Ñ~ûÚfûíé‚Ô!]SP]°æA8„µ…#HL苸!õ-n&å©+m~©´ÌUãâªd¶ƒŒq »°ÛÁ™Üô™a¸¯ÑõÔý‹v”»qºµ›žÕç|óñ+„«wôðôøØê»Ì=ØBCn;{éÃ2Ì×êzõ>¨ÜmE]Ç\W&C®`:íi*”}hµ%á=w¸—W%›ÂÎ ›åν"öí«žÖ[ùÊßs ʽôP+®Ð]þ,¯ÈeT6¿ãè'ƒ<üÒITƨvÅ’;Ç’·Ô7M1µ ¹ÛKÏk3̳–¶Ø­T9ÊNSÝË>¢¥˜¾Em¶¥[Ð@ùäˇ` M…\èAì¸±Š“kÛbb^¡[Ú8ö–÷Ã'¿ïïýÞ¾^?©¥´­+½¯Ö“*èÞt=‰>¡ÿ;ÓwÒªzxÊj†–Ê«Ní$XWØË%ˆ¡ÁÓBæ3†Þ+†Ô-jpÓ,3B”™AUÛQS¬ŠSåJ÷dï[@„ôóâì3BÎ!ÍSMSmdå}iÓÐCà×ÏC]“²äÏ({G,“6½eƒZºA¿$UÁ]ÅK÷y¬¥šCq¾ö3†>z¦²y[3B:!ý›DȺGÕ°R Ý¶¨KZܰEÝØïÝ–-ê’˜ÃlQ7‚€ûÓ8º¯àÚÑêTÝâT§ƒ¼ÂØ#&)ö–6ÿú-mñº©#‹É±Ü°¥]ïvèY™ãêq¿†ï@ÑšV”mnÊ sei©S—fŸpÐó ^ñV¯Ë¹›$J̨x"0ÇH~èrã°ó{àã´õ v´¼—¾S÷´¦VMÚ<åD­êrY7`žk‡ž¹&·÷h˜¦IËSPê>C*C(o |‡nÝè^Ü¿nt7ý¼Kg¿4‰ÎÏï,ÚnÞ(žwÎý\á½6—õž³}œ‹,ˆËÛ?.¡ïZ?.Íà‡Z“@.„fј4JMÐh 6h@ìŒ:—5A+â±&éÅä®”fÈRÐBµsU‚˜¼½êDÐD…½jÀØaÕ‰qYsÕŠñXõâr™V‘«™>1S&¢&‘©Q‡Èˆ\zÌE7so(|i‘x`‚Hdò6(k“Âóf«ÄΠqY´"k’^L.P¦\ª!½–©LP™¼ :!Z r¨Eú¼•0%/ š)5)IìUâòöªñ¨µ*Dj¡BR êÛ—¸˜Çô2]à„ÄÏÒžLôD9ùD9ÄöZ8ùZ8ðôrÂåäÇŒ‡Ï‡|¶ìÅtÁÚ‰›OÙdÒ‹‡ˆµ‘›=BÙ#Æ<—ç©Ý5IãvúVK¥¶“šZ‚± õ5صapŸ¶á¢6uoO¢µ m{jÁçºÍV]-¹·“ì­T×N9·?;ÛJƒÊ‰‰)Ø ½6„m‰=¡Ã\Úf+¹®¶œ²6[‹ ;ÍßJµí¤w+ñ,'„vvf'J[ÉŠ6lA· ¢€_-Ptˆ¹†•«\½ª«N½º“ë?µÞë1½î‘+#¹+•Š@®DÖžeô*‰I¶ÌjEÖ[È.eþ©ò=‘ê¼Kff2™ùyÍŒ²¼-ËLø&íé°0È(x N > ƒŒBWPpñYdº‚€Ïà £Ð1gGΣ0àâSpòydº‚€ˆÏ £Ð/ªZâ¼MÖâû»n±Z÷™Þk¨ˆºÏÒkŒq.É-©ñ–5š®)ŠPŸP•£v…¥xËQ/y­—ç¶a.b.º¤•¶è¥-Œ:âÏDljú²°™<¼Ä^¦Ö•b¾òŠ®[vv»TÌDŠ©2Öºôgå=æY˜i¢œfÃàe5ƒ>P£^´>jìÝRïoÌzê<лœWêB\u0TÕ¨JSS fãlS±‚}–T°üÇÔ„n)jÌÚ »K¾(ߪ­é¬^»¤«Ÿßöìf$U¯hM¢ÍÆàždJS©‡.”P ªÎÜì#š£5Š-J¨3!ý‘Ü UÞ²¤CÕg¨ Eб¬Ê‚쳯«Å|اÂç‹é’pÙ‡8M\Ÿt}Ï ¾F±Ð5û”Œßr=ÔDQYT5£:ql>¤*äìò×èÚ2”ëB¬W±Oàö.• ØŸkˆB°]z´ä%ÍRÒñú¼Dc½(3•GnðË=˜-È7¼E^¤X} Æ^m,éCÁ@ô|Çɹ0Á¨Õ¿µ6ÐÙ‡ ìRÅJ6±ŸÍ^žMèüêåg,ôà” û&•‰˜óqŒXŸ˜õ¹U»^­*­Ä*gÖ+“í%¹S-Û§‘ÓÜžÎ6a6 L™V˜x¬”&Š–Âûh(j‚f×¾ hê£ê{RêFÕsø&MRC8=šyԺ͒öô,5)ÇÆ¦½F{*l:ŒïrÚ,~–¶/YÕžEÁ1Þ ~©=—i9ûªTn]?¿zÍiÜ™ð¨ÒwƒG­S›ËÕ˜VÏEý“{zIb~µ¾ª3Wd7ì¿|U§-ö¹ª«!çn6;rƈGAÎ÷XÕ5þn6…˜ž¼fU§Ã[ìЪ ÙÂÇTÄÞa£¾SÃríõw½s®°L-¤ªßY¬xQ[TžÏoLèZ±Þw‚õö—(ñ sõjç1ö Õ–õàμÝk´§ÔÃñ.çzk)ª­Z]Šºþn@÷àKQmü=@TûSèíÀ¾Œ‘ WÙÛÆù#¶€þCk]aÿTÍͼ&D†bˆÜm´g‚ÈãñLY°j "ÃÐÜͶù±!²`ü ²àÏc@d§~àì} r¬^ñökÄÂàÎ €{öTx#ž µU«ÕOçÖ@mü=Pûóضò µ³IjßÒWÍqû’Pö̈¸×hO…ˆ‡1â©Q[µŠˆM¼›íëƒ#¢6þˆ¨ýy D îCñ–#žê'8åﵨßõ´N¹\ƒÌºY«­~fdÞk´§BæÃñTȬ­ZEf?gqŽÌÚø{ ³öç!Ùó¶åÈ\={®ù¾¢Vûxטµ**D ú¬Õ­@ñ~6;LjGâw¨ÕõCÿ¹7{¾óŠZÝBxïËÿŸ¦V×÷á= ×¶â§aÞæÅìÍ‹ÝÂhO¼ØÝm´§BØÃñ.'c±[°jm±ë»ænPøØ‹Ý‚ñ÷@UíÏc,vÛAþ¸ì› ¢¬Äµku?õhÏŒˆ{öTˆx#ž µU«ˆØŒw³pDÔÆßµ?ˆ¡}D¼¢îh—%¡Ü™p¯Ñž cÄS ¶j}üÀ·@mü=PûóèÄç‡o¨KzMaî;UQC;3øí3ÖSAßALx*à“6­ÁÞèïfGúà¨'-¿æigî yqþŘ8¦| LÉÁdðÓôÒoìç†ÒïQ©]93ºé²’˜¯ÐIýgk¼‹Óí¥>Ò‹S|-ê3/mÔ󸾬8ž©¨_.ÿ®ûmä endstream endobj 69 0 obj 3941 endobj 71 0 obj <> stream xœí]Ûn$¹ }÷WÔs€8ºÕ Xð̸ó¼‰ü@6‚8@ö%¿ŸRII¤Xª¶w¦ËNÃ@¢TÒIQu±éþûðŸÎt¿7¶¬[~Ç9þþúK÷×ßuÿ^3ã߯ÿxøòòÐc7ºÐ½ü­ûÃÅuÖu/ï~²Oì^þùðüòð3û`ù=}ð¼~Ð?öKÉ%ë'waûm%¸Gc¡DÀ½Öè4ÄnˆFýÞh€6F xÏJxµ kúšl$ôPçTÂL¸¯+ax°gÏ@ÀVÍ>²)_xËǸ}g,1ñOÆ•à‰Å–cwÃJ‡A–àÝ%èØ]Ç¡»ÙÍ ÎRÛ„Î#A•Ū•Ãh–WaR³M«¦¤D˜B6ªM‹¦Õ*5ê á<‘zËfS4k0Í«p%>'<xRxÇfÓ$Jn²˜ÔFŒS;% ;Г•?w‘½™amÆÀ³4‡Æ`ãÏŸÿô@Œ ó¸(Ø"G_»¾·®‡ä¿º¿DÉPúµ³Kög„×Î…E)òü‚ðÚù0/’LÙyúµË¡Ä\HÛ8N¤™§LÄA¹!£ü‚@À(;O0ÊÝÒýàcˆ ’²J–_R]V¢¤ ¾¬@A@„Y>¼_!\S d"Ê- åÂFÙyšQ.¤ 3…ƒtÒ8*€`R’’ð¥%…¦0 Ƚ¡ ‘ÆÌ–ÊÓ%Í‚ åp™dó¦Êu@­ÛªÕnÆÌ‰Øæ­¸-åÉD5•&¡9*[cb_/“ L¹±YÛ­÷ÒÈ±ÆÆ"×ør“ÈÁÍNuLüÇZ•Šî ðVžã˜šH'•«ê °}ˆ )rÃ:N@Å#az^‚ƒñœÉ„æÔßgV ,S; è·OVApd5ëµøgÕÖ†)Ï[1Ip„¬Ñ }";wi"å8<êY¯}±†#u jo¹ì`ÙYƒïÝ „@FU T¡Ü\qâ`ÓŒ¤&÷¬Ž°) Iˆ#ûú¹_>üìƒhP6çò:X׉ߣړ™õD­y—}Ó€›Ó³ÏO¿@Ú'rÄ7µÏ¨Fså×8¢Gsz~é}Ô:ļ£Ì)«¦»=ÿIÂèÔuBoL _ðédy÷¼àY£ÙйqÜi"ˆ Ú7 õº›(<-‡X/AŸð†Ý3ï¯kôFŽ~é_Ù›/4Õ³tê@“ 6®„Æy"Mî8 QH?YK_£m½âªì çÙ¡Þ\øGÜÀíðuîúÞs¦žz!d.ö™µ#F')c¯µãf`«ŠDª€X³ˆ5w¯Y³„¸ÿS“޾‡³H3®T{ E¡ïVã è, b˜ºPTÅò}ŠcÙ[u]Xáñ}]È×…7cÒ}]˜yš7ÂI×…¿¤5-4—X³6pKƒ†ýW0½V‡„ÅÏOQ¥d9»“p~˜¢ÂWx*Ný»‘ŽñFÊd[Òí“tàŠŒ*#įÀJÈ*¿òe;GàæEˆÁÇú/oPWpRÁ6£V‚b³y*™×%Ü[;¿Â·Óá"B/¶¹ô1íãÁÁ WŒw/JˆCr >p®‹®²j¯ô…2ä·G,œÖ5¹I4Ò‚AßÇFTމp+¹˜¨¤Ú£&}7õу¾¹ôG­ûíe˜è­lV¬§Dü^œ¬Qâ÷׬ ÷Œ"2N²ã\•Ý‚PN÷¾!¬µ’õ}G/W¸¾«°ƒáƒøöq†Ö®ëw~?ðê‡æ+L¿‡„ûs+&݃Ŭ}1œ,üptÛ´b1ÏËÀSD#j*÷A|˜0ðͶ»óý}Éõ}Æ³×Ø¥ùnkWó!ÅöÆSÛÑ£9ú;Õ\ìû¬p£Ø¶4¬gRƒ›ÿFHˆð QHîˆMø§Ö€>ò8¸ÿʰz5–f³«’ÃpžVaÞەήòÈÚ‘Ž€*ÇÍ™™ÚoèÁ9¼ôO; Ïywlló_Žxíe—P,ñ‰ròig\1ßuçµçaýÇ%è¹:v>]´ÅW—’,ñÂB²ìúîÀl–bµfž ê¼zê%þ“ð©ZÎ9âšÃ] úªT ùNÜÜýwÐû endstream endobj 72 0 obj 3356 endobj 74 0 obj <> stream xœí]ÍŽä¸ ¾÷Sø ëϲÅÓ3]9OÒ@^ ?@^`÷’×eS¤Dж«ªÓUƒm,0;]Ò'’¢HŠöôÝŸ~íúîýÉtƒ±óŸqJþöîoè~yúÞ%òÒ{²Hî»ôß_þ ùí_O~ò§ºèÂÉuo]þþŸî¯Oa8Y¢™`NC(ÈUÇ[g}8 ¹l¿uÎOóÿ‰Z¶ßº F"çŽ~8ù°3§ ÛÎ=c!z݃ðèª½ê ˆôô$ngÞ­'Þe€!rÕ‘Á¹lghD-ÛŒOM¬+H©V3©Úcœ-טèíÖ« L9ìÑü¨$ƒ¨²ãÒ-ÆX¶©_%[Ü%°chÜuªûó×wÞóëÓ8ÏÙEëæúú÷îOgß™¾{ýg÷“íî^ÿýç_ö‰ôS?,ÃÌ&èˆëÐ4ÏK3œÆÜàø„Y:^^Ÿ¾3f†16a˜6ˆÍ£ú #T0fcmsŠþ +µyˆol¥få…?EÆÕ¼È Çzé;` ˜¾·§©-Ïy9/ödÄBkÀý¤‰äËò›ñ~}S§qƒ2MïthóÆ3fV\,r…S4°úÓËÅ0žµpLÝ0 óY`„n\¥ä`—G—‡ì±/ðJɰ'@lQÁJ ïÏ0ì8+Kµ–bžgøQa žáDrÞ›Xt€¶( ‹qÖÿŠa®g«·_9a\ [›Ôb¾5Pð'Ye™¹'99ýT ~þYCY¨’\t©Åޝe`Ð}^ܤ͢Ö÷„Þ¿ìÉV®VL¸•ãÐ¥ª¿p¤=× Û§Lê“ÆslÛ¶àJpÐ,Y´£\m{U)ý“£(ga+q¸DõDüúVÿd`?1ª/(¤]”Ûü€Ò·`Hçè†<‰±«Ã![Ò@k=³0–[çÀφٷ4 î™OêaŽ,fçØNÕÓ'ƒ$'ñÆdN1Mì,\¶fÍbµ/°ØÙ™gg‘#µæã¢ƒ`Íõ…/Ù°¹ó¹˜è™/€ÿvG1 °^[ñþê@+):m¹ÞOìܰ“@7­A3.Ðõ…ê­ÁWÄ^¡ŸÙ ç>ìhÓ>tiÏ®†-“#ÍíÍQ«Ž9‚-†Zܵmˆ×yiæ±’óXH®:pp$¯íy™'CÀ¡‰È‘ ƒôº'Ï@ðCctd=ɸâÕHlÉ·üûöÊk¾ÐA‚Ókà…€QÜ8ôEû0{i6¹E¯uÔôÔsiD˜ˆ ›ÃÄX«´™ãvU&¸O€ïP :pé ÏZ„râ'"ðÈ?a™&”ëW>¤YmiVŒ!ƒáÐãòÕØNDU""±.ØñVh;†tÀÝYöQ[¼`ϸ^LËeïxÊK¨( z:8 iF鋨%ǹºŸ¶ÐÒ»ô™ P·‡ˆ3ÙY¤jP˜’;ò©Cÿg?‘ H&]©„GÉ7°î¼‡T2YHŸóÔFPÿ鸖ñôi©>^ËôVÇ!åHTKJ’À‰IRÓ3-¹¢!3t·ôV Å5 .u­k‚«5Íï ÅÛÆr‡š‡:ð!=ÿ>áøbFþ„’f¢TÏŠaÚ>gÅ âc³b­}cÆ|Åä³*Á5Vq³œ­*¨W·Aº0i ÚgÓbêŽÒ€1¦diÃ61=75” I&ò-\“ψFê+Õ5Û㜛ékºÇ é¾j«P*¦?%Ý]ÓG67—ìRL)½LN%1%µl¯õ.¾ –íTÍ2¦R'"W©T¥@²Ö²¬ÃR»Ør°D,D®:ÝPUóx¢g8CQ®Sö¡(ÈY{L2aˆpi@ $–mD‡Ô²MØ\u2¤C‡çâ4’W,¹êÈè zÕøŠêDX<‘{f$!\Zˆ‰eÑ!µl6$W„ é¹cÞES =mÚø !zÕøˆ^uBz î!ŒBf^ Hn[hU;'–;km–z ­^¯t'–ºU@©‚9²/·÷ÅžfnkF„göÈ1Û[roKl+eÖÏ-¡9fŠö Âþ†ÜÛ¨‚¾²t¢n ¹µä6‰Ù¬†Eà6CìL¶sbÞ§¥A©7Ey¸ÑYWl‹ª‡ž QvÐÅÖ¨zè \Âe…”!'cŸ¯õïWH94a¼k!eŠJ[“<\)¥×„r¼”’Ý‘ ä~_PL¹øŽM±¼o1eT¦Ù*¦L~¯Fq•ôÑå”Cº*÷ÁÕÙ‘Ò–"j}¥¸¼a±ÕF}å¬ã9%tú(¢:Rä[üxYP)22¼ŠÁ³®È·ˆ+]¤ò"JÕîTgç¤ä>&Of£Í±ꜚ*Œ‘LÚÊÚ(ÀOŒã „È#ùÚÁ kcýò–ýRam6ë«cz%Ü:›j$×ÏêAƒ*)‘º–+ôªã­³q(©Eó-•œ•´¢ùÖU –BºµÃ„T?‡_¡„6Vß"`¹ê\D-š€‹hEquíHÍH°Ö&¢ÊÔËö ‰hÔZ…ZÑ =Ëz̲ƒÉ©0=Ñ«DÔ¢ ˆV4”˜7ó¨DÑP)hV’…èÊјÆü¶ ˆS­¯;*£Ë.smªu|GÍt‰gNO宀ådÊ+´¥Ö%{QÔëZ‘È&€(¤EMøÎwy%©µ}>´ïTI:¥—YZ0Þó;½kNqK){ië‚âÅ:Òtú5Eò±u¤>¦Ï6…¢Ö‘•cû_,Q+@õb\½”‰N‹ômx BŸP|6ý½|5¬WMŠ"Iöòþ}4ó/*½Ó½·z§qÁ½·^‘rsÑhKØŸáÈ$“o{7&}^„Ã15º‡Ã-áê½÷áø™‡f騸LS9j¦ÇÈ%ÞrM.¾`!.ÉU ”Y<ÕÀÁßÐÀ.É/¨+£Kòãip]úëj„ô/Hè# ¿ ]˜ 1ßú qwPõ“8zF¸1ŠÏÙì20Š”íáÂâ˜RZ¼Qð‰‚2×3ùr "5¬W4£…¢ÒT½ÂW}Ÿ &¦DÙ~ññÆÄ²Ö@Tî°]}kñ÷â¢ùño+³UË[.(³U«9ß·ÌÖ§4CCP;e¶fùÇ>jõ¼pã±Êl[Ûá3ºèêèânLúŒ.*_øaÄð`Ñ…Î1i—c?´tìÑâíÔô‘°ßíʾ…âš+{õë¨ë•}kšý+{tõZßCC6{ÆÁ59nÎà⽿¿cèß*SïÎõ6àŠk«M{˵ÿþ'ÒÚ×þ#Gçj.©ŸH›ò¿Îa™Æ$ ø6it¾:!¯Iw“¦t‘Кæ Â|“¦Â¦ë¥ÖÙnˆ»SK¼5¨Iúß4ͼ ì{÷?¶¨_m endstream endobj 75 0 obj 3455 endobj 77 0 obj <> stream xœí\Ùnì6}÷Wè9ÀôpÕ\ðÖyÎŒùdâÉËü~$±ªHV±¬nomû 0.·bm¤È££6Ýÿ¯þìL÷s°]oÝüw˜–¿ýÚýç‡î«Ÿ»¥¹Ìa„öh‘šM·üû×OðŸ¿þwåFwðÝàìü÷±‹Ñ”~ïþ}ûÃ@ÖÇCˆEkUñØ•¢–f(›0k‘DÛE”©eQsUA©9•C§HŠC‘4§fV´×5(Ÿ å iÂ/EOæO°Œ4) £Ñm»k¯àPˆ^áðÚ%Ep)Ô$8eŽšXv”27Wý4œæñ¿tÿ<†Îšîá¿Ý7sm†»‡ß®¬™]b–Öo.Õôó¤©ÂôP=` ­Y‹áÐcE„#VXè.õ¸¸ú™)j£[­|©®ý†®×uàºNµ®Å~­ðó2…·iª2¤Zw¼…”qÏ#=°‡‰•i0Gç~N©¶OÍ-Îê`’I™¤.nGZ8\ºâ¾žA8bà ¬‡yË{ÔsØÍUqšƒØO~ÖõTìÆ”|G“,£¬¸fI`’V–ÐóeaÉ7>;;™º¬&#Öþ÷”ŒB¨õPAuLªã,`Zî!†ÏU¹b\u£/q?.û\ÃÉ7+dœã˜^¨˜ó¼‡Ð´çaà=ìÄ…öíœÍÖ Åä{ÍWGŸRô–‹ä¦‘H§™æ„Œ¦¤¦=7_X+<ƶ¢<$`:Ðò´è»1.O¬‹GÐÌ2„µrZ}/6žtr38=!¼¦©9Rü{5vÜ«Ò<±©så…P}8­‡UwÈ¡q¿çÐç"Œ›w™ ²LM*qHäÛßbýqKSéd}îS7@úO§gÙ0Ÿö÷,{÷,Ó±ºBhdC(-i:Â33oZžµN‹ë-3Ny².eïÑ–$2æÑUØ4Àñ3YÑCÍÓq¹¶´ð7|Ú³ ùÞ³>h³X³ÞNÓ„RÇZUWx̱>'ï5LM;@`.^“rñ…×8…z]†Á”˜¸Pv€vü]8éšÉÁ¢!dœg³À:ò´çhÕxHËâî6± ÙC8ðH+†[â&7]±k ²¾VV]#ÎwÏ”66­1Œ+>ÖnÍ=¼º§~¹·5f1¸¯Sna»²žŇœÒÓŽu³3rƒ&œ4ò{ê 7N«ÍâœEEòCÌÙÌ'“{Þó”»éi¶#×x„­R?ÉÐm†;®Q-¼­ê°ÿ9g9€ ¿ŠÞÎÉ—¬~,ð+‰|†i8ÄØÅùê0$q…Ü ¼fÃò?ê`çU{Uñع°x«h¯*;ÆŠ+:Ô5]­ÒÒkúew¡ŽÔêPcY&í¨µ,gݨ¹ªÈšQ;VÌþ®¼—Ê…÷°h“Û« Ò/·WYÃÜ¡®É: Ðy¥Bø–½Yx7½›yè7}Ÿ EVœšÂ c¯†Ž…–Æc(Ëœ«ýV­”܃f8 KžÅsJ:š¸‰Æâ…Û:¬·¿–¯ˆœÎ7›YJkØLþ éåGE>á¤q:˜ªÃæÁ-({càÞPðý KÔ\P­™‡5ÃrÍŸ÷Û»S§ñƒ2 <´ZcÖW'q0\10«ï(ðP6Òö¦¡¡G¿¼à‹Q€òy—5: 8˜£®n‚¥âÃò¢Å/|ýåø0)ÔY:Þ©RHy«j"n«d'Z(/|Æ”oÓË›¥VdÔu—b¶!aʶ±ÎrSÔUgã2SCó÷*܃¦¼T´fÐ4÷ù§à›^“øEk3ËÞs1' ÀS{@ø'Œ;rBS®‡Äs°Âá]FT­U0¡ÖÛÈhÛ«ìÃ@i'–ªHoŽÑ„nÂ~Ì 6nØSh0”&áØ¦½¥'h ßû¦#Š0R3=—ÜVìôáSû^®ëNîãä¾–Owr_‹Üâ²¹?œ¼¨\>]ð¢C"§/ìØ9À‹<¿Lú_# ;ýï4Å ÿ]>úß©æKÓÿBXäžC;ý{¼ý/øEÞGÈ21íös ²,¨“òE¨ç˜ºÔ_’cQ3m;Øò1®¼ðú"Ôéy%z úd×éA.âÑ|ß§ÞqŸú4Ò`¦¼Å\ üliñ ðÓ«@o?[Ó|uð“¥£&îd‘Ïøê!Hª*Ÿ”O0_ß–Qú¼´±h|?Íc^Ê(5*¿he”¶f‘MéY²1Ñsì ]‚tÏ–‘_4ÇìÁœÒó)¤tÿœR7.HŸC!õóÕ!D8(gŠ!uH4Á¢½ª@*`Ñ^UׯèP×›¯è5vyì …4•ˆBŠ 5–eÒŽZËrÖš«Š¬µCÅâïÒ{PÎÞ£I›¢½ª@ýŠöª‚4,:Ô5¤£PœW*ÔˆoÙ›…wÓ»ÙúMßgCeVœšÂ uÎÀx-t,´y<.„2çj¿U+%¯šá| ©÷—¤¶Ôxu ik’I!måÒfX^ŸBÚ Ì…Ô¯l¦Ú%H¤ÞHpâèê*ðøº„O‹ÜÑpvýº`x°S¯åG«µ$gÍœPýTN¨ ʰ3|¡ÚyœÐ¾åè N¨›¶oýïÁ m¥ÈÎ Í»óÊ ½˜“vNhIi¼|>9'ô”MçÃ8ðƒpB[[û›sBzNèIOõÄ•êú}t1X´¥Ås`Q±Â¢­iNù®Þ‰ïê=îÜæ+¾Æù(ú?Öá+ø,§zr'}>Eú´+]ë Ò§s|Õ¹æÉZ"ª#6c1·VÈKÌÍP¶nýàhŸ©˜‰ŸØŒ²¨¹ª áԜʋ¡>@¡HšS3+Úë”Ïò…4á—¢'óÊO°¬Ð$”~ÃñmËk¿äÁÁÂéµ[ŠS¸Iô¹„Pgü­O}¹®;!”B[>Ý ¡-B¨3N|H¥‚(ì‘ñLE?© Ê›ð;uLE|VËù®[üΖWw~çI‡/Àï¼|ô¿ ÎË—æwÚÉóÏ÷zýúÎùvÜ÷©·ß§Þ”ßµi·÷—±÷ ƒ†°ÿ”ñö©OÃï´‘׋Á˜R‡ç€˜ú»ÆÄ”“|zs§n¾>uÓZú Ù—P7õwö+u³5‹äFÞÁÚf;DñK ð.''l†çô˜=ký€Ù©ò?àBpj§”{ "XஜO±LÙŽž)—Ä2U8˜à}’ó¦ì=¡à—’SF góKU-1L)í †ië·JˆìØ~ž#…TNç#›Äø'¨Ç å¤5Í5¡-O§­˜…×’`ÀðHw/g‡õ÷5…PH ¬TÀ{¿mDÑ) endstream endobj 78 0 obj 2832 endobj 80 0 obj <> stream xœí]Ùn,¹ }÷WÔs€t´Ö ðÖyžÄ@~ “A<ÀÌK~?¥EI¤ØUÝn»ìëÆŒ«¤Hj㑪U÷¿»ß;ÕýYt×k3ÿ¦ð÷_»ü©ûíî—.÷ƒÅòÞ «.üûÛ_á?üûÎMÃÁûn°þ`»×Î{}0)ùßîïw~8 ¹XÏÅei™~íŒóW”–é×κñ0•«Œ×®’$”§ ÕœO²¥$È6æb%W(].¯2²|¹B“%Ì5 'è»Ð^Lfí¥â(P.-ÓI¾\Z¦Qº\\e l”uV^! ·kU¹6¬Ù¢Û¢'ž˜ÞlÑ}ÑWO}Ãl3N©Ê8HC45pA#‡Ê+=–&ŸÌ#ŽHqÀþÞáP|x¹}ðpcç¿/ÿìþrtVÝË¿ºŸŒú¹{ùÏÝ0·T¡è'Õ/ý¡OC¬Iý°$ý£’¨ä½“ÄxæãO/Q±ÏâÂâÂ<¸›’P#88…ÅÊžèÜ‘Ò`’R9,s^ÚÄÄ Æâ³1¹5–ÁšŠµõ!˜Q”×9¯]Eo ïÄŒùTèíS:qð¹B"˜+Ô9È"Wˆ~ o¦.Äö ­\Ze$Ú¤q>“âº)«RÍlêW)J¥;  ô›è¥hÆ,U_)¦´5š>“?+\ÕOsÓ°I©ã÷à¬óž…FÈî…FÈßÑ5좎öféæ[e•‚m,ˆ#9¦ZÖ‚GZ³qx„©ÄK4¸X4ìƒDq&½^ÏJÐ) VÂ5G½(“:¹néõ ìQ,.åH Nò‘Ö¨yœˆÜM³ýäRDíA)”ŠÅ5h°äŒ v…mìØ®T¢WJÉ[ÌA);ój¨YÞFÃŒ~å°€¡¢d›ä¶¢áht‰G¨V §äù̆G£«s6d5`T¥a ¤á%ÁxzÅ&$.Œ®A#¬k,8ÃϰŒÆl'.iO»/‡xXÔ}vR†U¨áýì#û[ºÏÄh°Þr¶ÔúŠz•>\¸¼Þ¯BŽJk©½ÐïZ+ØÔP¨¼V  ‘ð¹0ŒLÚ|zæí²Þ` ôtzƒaZÑ~ç‡ zÁ¨ïçWaH vgÕLtûÇnµR.üòè‡C(:¬ ­@(Î…eñå<…#"ë÷~´»b• c¶epËû‚·ØîWÙŠ€»^Î$%Çjùö ú.€Ð뿯;ˆ÷†è¨Ù'DˆÖ#¯[¢ÆÌ~‹¼^߇~HŒhÚîevÚç™À÷ò²4’}ÈLû¼”ø^>ôu1"§]ždvÈZR\‚­¼@h±YLjð$¬-‡>œ¨$*>Ó‰™öÄDžžOŠ—ñ[÷D¼3ðWYÇrÆñŠhêKˆÿ fA‘”¤I2ÁßÉ’;¿+’%¾ YA²¦a¥‰Ä.½¸z ’eÄ0Ì‚dµ¸¬ƒ76Mœ8Sƒƒad"'í‘ÎO€ º"Дf"׌Çì4¹ŸºÔ„r?K6‘ñQ»‹Á&ÔC¨ ǃšÌÌwÔ¾ b2IX°@’¢¼ÎI@HQ2lÀf|ŠÉ >¥âD ‹« ¤ŽÅ1º; ð1…²§B ”K«ŒDš4F±3%®”¢&ÕȆ.•bTƒöí.× )ƒ uW)Í‹ÖFÚçBOÖâkÛO=½]ÖôD¡§–NoÐS %±FÈKmvÌs=É0s%Ü3 ˆl|ëȎìÐヲ·l¾ ‡ð–šOÃW6_újo€½A>ßòÙßúß"æõ žë½jL~7º¾}s„Ç*sÃ?`¦ú‘3ÙJ¸ÃLõe3 óÑìeg„§%Å%Ï(q‰O‹Í:ÂÃð8p9‚È »|Êg8oaÈ·-N}*jèùÒûâ.äQΉ·Zg /ìÃXì Ñ¥ÈËÆ7DÆÂÓâ7á.b”fÁ]8­×)::…O,}u Ý`(yÃB!˜z:Í"Kòò‡A=«˜Ö0Oþ¼FÛð22†­Ç·[ýá£S|ùp{Læä§âøû\Z¦_;ãÕ¾Çâ*¿MŸË« üî|.‡ =šCŸú’øÓX¥)Š« ”¯¨Pç „E:e,j¤«gm£c2k0ƒHXZ¦³„X\edù°¼ÊÈÒQæ¨ÀBnݪrm^·E¿E_˜ýÝ6”ýe>â¶™¨ÔIe"¤!‘š9ÓHv­|±Òe9tryæqþO èiJ{›½~aĸêO 8É[~ì@Ö©­?Ð4Ê?Ð4Ëõ¡i+¶Y~!øÍ@EÛã'ôÀâ-p%·/ ¨aõ ùìÉ XèœAB.ahâK™õÏîÓžÐoýKß%^GªÄî7ô¹Ó÷äùGWß¼ ñÓþëoz©¿$yÁû„aÄåšÂþf`Á{1ⳋ» 8ûöOònú¢¼YéM¿SLð‚Þ\‚ã2ƒQâ påŸÔU{ûe~Š`Vlèñ±Ä[P·"BMVšf£Žéºai5Ùm Ôº\û%íð>èWP?LÝDÖý÷S?‹›oè¸åt>¨¦¡üU{Y¿®zÉÌD³ ÖŽ#±}ýö'þ´Ek©bkè^^ËïìÙ/}±‹b[ÌÓ‘K½D_v†&ZR\MÈ›åšh±Y‡&`°“yfÁîÕ/lñ`wÜ1 B¸t‚ÃòÌ ëŸÔZÿ8}úAŸ†ÈˆÃÇü8NÁW‰ã{|ªgÈ`È1õt·2;{ Šäq,ÉbRsµ›{ ‚!ž£µòË÷Ä94ð۩º¶wó á:oƒ(LŽ-!ºýÏ­šx endstream endobj 81 0 obj 3242 endobj 83 0 obj <> stream xœuŽË Â0E÷ùŠ»Œ3©I(‚v_ø>À…`7þ¾y"”–À,Μ;„¯ø€°%É0¬Â´.ÎéŽëïÆ7=ÅÉ m¤…vÒÁß°XÁ?ÐÑåÿmøH1ê¨OÀJUÁP€© !N¨÷bœÕ8 kK5Ç"±Ur^S0iÙ.:rkÒìà öÿÛWïb¶R/IYÍ+ 9Fü“Lv endstream endobj 84 0 obj 158 endobj 86 0 obj <> stream xœí]ÛŽã¸}ï¯Ðs€8¢HI°Оi¿/Ð@~ `d_òû‘l^ä:U*’’{º'» 0‰¤ŠU§îtÛü÷å?MÛü¹=™f0Ýüç8-þþæojþ}ûÇåÿßÿõryé§ÓÐŒíÔ¼ÿ½ùËÕ6¦?¹æýŸÍ/ûkóþÛËÛû˯䕳Yæd^i‡Û+Ë_Ûåé^oó&&?ÒŽ÷‘v^Õ\n#ãɆ:‹ù~gYÖ|»¸S^ê¼ñ­«Kš¶»/l,}!.Óö0©ñ›Äuá{Œó [™¯d¯ß$Ú÷Ãil†©½Ó¾kL{£¼±~ѸQ׾݆¦D´¾µá8âcC³§>ŒÝ·7¤óm ~ õßCÎÔÎaàN%OÇZ?eœã¾¹Î0ƽv÷EMŸù†ßÕ@·Iêui 6®ÌIãxÒç™êœˆC7Òõž|8~_iÒnþ/pø÷væ×†yaåðBÚÊÙo6žô7žˆâ9†` i†¸KØÃðxЉ½ºÎÏ2¥gz? l|ÍêI ýÚg Œ˜ ã¡7AšéŽpFzc†Ø‡7¢hv“y òn¤ýÏî–û8Šô¿Rê½úOBÐ#Gvì™Ä9T‘·è¢dÈ+SfSQ¤=ÈÅ]8¿Jâ OëÉ&¿ÓQÚº³„¨°p»m󖛿-â­ôF‚ýWOõðq´@U@o8gþ=þï¼±\&.‘ÏÇg¬q±‘žPUßD9ƒnÄ\LÔî–§Ö1\«oåÇ‹‹¬%Šænó˜1°¿kLw‡V㹆XŽ"(gÄ.j€›Ôïl¥%[ª6}"š¹„éoÑ­àðnޱŒ‡ƒŠœ&Œ$lý1 dyßÖrüݳÈô¸oéúišÿ$úíÍÏA6²!wT¸ƒO ̰¨M\¥Yµ5ÀÒj|(ê)"¾ëÚh{GµLÕ#jÔ‰.‹ŒÂd¿£õTnœëdº¤.˜1S‰ ~U%`Gô`ýPŽ:¯i "µó{óF³¡Ÿè <ᣠ`Øå€(9cø7* `ždà)*IXe‹?tïˆ`ù+eíKu镸K`•ŒcÌó\9̵Ã<-º²^»ãô,Ezœ`ê ~&‚ê’DzR⌴Š+KN´â„îtBÃ!Ž¹Ä F3Xä¦råJ=SΕ¨Ø§Õ}„Ù³ºöÄÀp®iôc¸e#œPÀ/r»%GÈA·†öƒCAð: `µ*êíÇÒŽH`…¨: í§ ÑhÃ]ì›_k>9"²•²IA‘d°&Äûн´ñò´Úó¥4Çú„Dšá C7ç(¢O fs‰›[ =XhÔ–%„3”Ã~9½2gâ¢ÛYe溑a¬]Îb’c½Åì)=BÝ‚DSŒ>‘Êma1™žaÚ~“åÃ^-ÀP“@’lmÚ²õ ËE `¾Â׿ú=†’çàÙÏD˜°=ú¶_8 õXî4""WBü)~ÂW³‘¶ÝØ/f%ùiò‹Þ´p“•BÃY Ž¢Â}KTZ¸ÌdÁ¹%v̉>x‹”ÌCViU¦!å ÌR$–Úoê±R»®"E^šÖFw¡ÊŠ,?M=ôÇ 8¢@V/äþè'êÑõuƒT”[q‹´ ?Z‡ªŽn ´±z@Q݈q¦½©¬Ö-#䊕á‘ñþoü÷#;4µtOEÍ´.v2þŠ&›qµ覱®ÆŠ» Õ‹WÊ+ÖPaYÏîÓŽ¨ËÞ´]é ?¦º¾³þ@’ý“Ñ£5ÎÁ *`m܉ж,Rjàjz¬I îd‡)SŒFlòA±2C‰Òû'/~ÑqÃÖ•N•fn"›|xè„yd½˜ƒ×ûˆ š5Ü/–N«ºjÃØYtPµêˆmQ¹ˆ£û³‡D ÊÝŒZcûFPrBš¨*s­IÉÙÙ(×Ù°rª®«Òƒ9ý%R±PœÔE­‘”Lÿ² êv©îâ0ZƒõÖaåü1×…Øð•Ræ@•ðìËÿRþ7”i:I‡×´IÈu-¢‘]Žf¥-µ5jºM¤gƒŸÂïûû+`w“­….Àžl¦]ãuì`¤_ ¹j!»Å¸Rrwd§P†*«;µ=/~yLwÿ´Ñ'6\3ŠÜ/×~q¬€¶ºPÔ“^ãuà‡ ûì/†ÌÒúªÚjÃ@n1Ñp’fÝ<$/`ݲ!ÐÆÔm“àŽ†Õű²¹³¿¸Wûç•ð=]dG&cžtEã^ÖÙß$Vše:òcwd™áܸ¥“€\Áþs[s™ëW‘¯ Zr weó¡]Ô×h‘“O /¸B%j÷ÉiÎt”¹u¤›é㌈8öËðѵ‚k Ÿâ<èõ85Ñn:ç,o´éÆLA^Ddïõ]Dr‹&650EwÛÕòvX¶õˆƒÝ”(%Wá)HÚ'›S™= š •áˆéµ+ª÷šseŸ m"Œ–öÃaF‡&÷ŠüÕŽ¸²ë¾•ÚÛÆlqMu„e׸_ fþ¤»ø÷dïV½ñ>#‹Ãòyï­/–„R?ZkÊÎÎ>wDñ°©Yœ½#K2òQ ìWLIÀ2W+sYåI¼”AJ°à>ÚAÚ/ºWhz®ñMk®ŠbN^¿@öiÙꬣS Dµ††)‹#:zCÞ%æ‘‘k«¤?ÁW¶èl2ê4t´ËO-¼«±Xz½—æ;è6óñ±— *é¬À©ë)É ñ»øðjÜŸëÊÓWÝ”hí(›;ïžÜUpœyùŒ‚Ó’Û”¹—­RXhÅ"¦²Ý™qöE³nUvŒQ—qm%5‚jBßÌ-MK&ÍoÈҟܺË9'ÂrD ¥ªttEM¨5„jÇÕ³ ‰­Ÿ#9âºÁY³ŸGeî®ýûJ9·ÃÓPZ%dVa>ý®WE>ôF€q ùÍ©¯Tx+dj¼¯êÒ‹3,]j6)Ád­H»Œ­"ܬuÈŸÜkÒ’©‹3׋,‡¼šŸ”•ä€Sýª¥2®Ý¬øâÈèÞG³‚±K]Fn¶Æm‹´€ØÙpÕ˜_Bìà©åäe·JëSš[¥Æñ&6i5pnXòÝÔ¢”W×Ä.˜tÎõk;¸Â¦¬ ³Ê%Ÿk/È_ÌõÝOAÎ}eq\ý@ŠÉg4µ·ß€Ãe^ý$‘Ó7.®[*ʹ9•"¬ʑ⾌Ynd&5Ù˜¸Íñkó?]—·} endstream endobj 87 0 obj 3305 endobj 89 0 obj <> stream xœíÙŽäÆí½¿BÏ2VRF€éÝyÛx€|À$v`ŒxóàßO±n‘¢Jê9ÒŒÝU©E‹Å›%ç߇qøÓx'+¤ÿ{rð÷× ûnøWøþÿúËéüx2ön”1wjxüûðýƒÄ8<þ<ü õŸ‡Ç_O“Òÿðƒø†6 Ç) õÝœoˆpCù‰Ò µP¹+.K„& ÝN7¤:á ”ÃÓäye†›Ã¹€¨DHÁœ°š;—×6¥' »D,žt´žØ &V˜¼éÙË€Š šKšDžÜ BPpnÍdEä›^ß>¿‘6È`*$GB‰Eˆ,kù8·o¾¬Q«Ân´quÝ„»„Ud]”™o?»CÌÚ¨±2©†[J ïÓÉMûÂ=4,уKú›-Ïø9á(¦èœ€¦ºgçD¸«¸ Õ‰6Wõ¯^¹DÝ´›\*>h§—T¬kY³í=Ñ’SZ;Ú²Ëãé ¶íjö²°fÜÖ5˜à´ò/Aúê.U’Wù—E²ÜÈfÞìât)Ôrc}÷vY`‘f%¬ØB*aÄaJˆzbóD-OöT /¤,6·1–—"±è  FŸ©x)¡ÓÒ¼u˜T‹Û–oÂp–CØ‘¤N¸ª…Å»‹»—Š*ï:ºA”Ie”¬ë¢“>™z©Û¥’O”þ²Í ¢=÷ùr^K•¨¬Ú‡%Ô°&R¬[ÈžQUH—Œ¹¨ÌÛcœ¼I‹O‰©*¤Ó£tâ>Ü—¦ò–¸‹{¤JzÈ'ªµéAQã =&b¼”ã’ð›‚N:ÿ'«‘Ÿ·/H=›ÑðsoÆÜ›V¹71ÜS˜{ ¯Â6ÜçÌ?ÃÂÙÊÎrï,?ev–D¦  dˆ¥;{ñù1Àó.«oC¯0‡\°Ï©(MZøuî³L$h^Ó@ )UÁžÎJ؆N ´#¥øÜ£¼ŸôQ‹¬*6~ë.ÈÔeåéÀ:¸±R (y{•ª‡KÝ&ÆŽìÆ%ùð:à–´Qìë–fº{H¶ÌÙŠÝõùVJ„–FÄso`Î'¬ø¾}hîøzííDÖ±akbÃâ?šØ°Äs²}Û%ÖR|Õªm+ €7š¸¬°²(„>™8`(2hÚ §N“žUŸÇhÜêÊò#²€éûÅ#TD«û(ht[{)Œ e¢ã¥yª1䱓†„Gk™ZžéQLzF°ÁIÏHm»²‘U·•µ'«¤•%¶TÇF-×»&®æÍ9&ÖXS·Ä­VmCϜ̆fT¯¹¾Ÿ«;ê舓Zqt\ÚÀ:º•ÈK|¬òÆ–¸0ªk‰‹ôVKÜ·Ã¥huŸ¨ß+:$Þ¾áè"Óјþ+ M¬tÑjcM×´Ý(¶¦î= 1)Ï3‚´× º¥ÃÝyëAsR5³ó[Œ®÷ièãjþŽŠÐƒ"%•횪0ê’èoŒÀJ5´ö~^6Û_ïx…v^ÏŽ?¹ötpº’! J¦9M“ïp#gOK}·Woö•üš’ábˆcán_ÕúA÷áN™:s¶t‚m“Š–Á–ÚÁu¬¯“Kˆšîm"ÖsGñ™DÑÛ»w²©¼k¸ðVÊ#ÐjYæîE£@9-ñF¥¶gr)UmhÞZmR§âpuÔµ8ÌlªÎ ØU4ÂtN7&¼ó¼tu‹«ØÄu+ù;Εõ{ržk9 ôqJY nEÔàHu×síVî|B›@Â'E )x,™§§.Ù&Ön¦þ¬ã¢eSÿ—%dc5O)äæUˆWÖ¼Âk¶(ʶ}°¨°QA«–Û„×9ƒõJ›•£B¬b–eµ$ç`Hù‚8Ñ®Zh±]ç­%-KÕd[ú­jn7ÖÕ,ʪIzêD5kFxT5˾ïPL<9¤˜âÿD17ŽK¶­¸ÛSÖ5ʸٗxP´îÄ× Ô”5W¨©-ý¯<¨hÊ6UQ›#2×ùPád®ìTÕâµU•œèájŒ¢®¨Ü+d©dOp£‘Ë9,CfgU¸«ÑõeÊÝWíÛùJÈ‹Âã£õÚTÖ3máÔf\µ¬'Õ5"&ÁØlQ q6Kh97 ³Š›¶š8å ÜŠíþGÍžäÁè¸øÐì·ÐìG}{Ž:ã²MÐ[g-û¾l‚x°ÒOaCl­·õÓÈÜØÛ«ŸâÆô³–:Õúó\á~5æÛXýž;q8ÝJú‡÷}+ï‹p;¯}Oß[ÑUßÛ z¹ïUâhT]!>tû­tûÃÿ~øßÒbåL•–Qؚϻ*dÍñïò˜Í÷Tm[ôNí?$µÿ<:_«d¨7ï÷ ´z)òiÈÚÆ!j‰c`“D±ízæúXåâ/|SëG8L›°Ôæw©£ìÃÊiÿ¾iâÞ Ý8ñB2à ÎÎ;8Ë¿Š`è H*„¹³Ë•c–äˆ{7‡Û‚)·ƒø+/øpCm¨)Úñ,98Å¿Ž¥GÆÊu‰WâIYr­f±#4ìÚùF{ Ë¸¦k.ãJ>§A®¹i‡= Ç4ªHlô­M“Ï·÷ÍÙ£ñʹ†#s£¨®X·kH4ŠV ‰M\:ÞçÿàõE˜”Öƒvà¡~;) ñf©¨2#O×Îò=å‘ó!Œ/ùyLñêé¤,Hcº?ÃrÒóñ:cŠ£8G€HsšžNÿ<ýüÝ)®û¯?üáÿüÅÿë7@ûOô}€{˜…¦};§½GÁBóÖ yP'$ï¢"›So¤Î‘Å!äºtH §=‡¥˜=àZŽà̧FÓõ |xÊ#7yñy;BŽñÄë§“´Ð¤H¿ÌQ¿¦zqÅQœ%@„¹ EÛ²që”SÉá%3OÍWCöJF²¢¨Ù :Þñ aà_ñ•!O6“jêPÈ+L—æ" ¾A(#Zñ°!À:|/ÀXˆ;;éÐ#$…MRõ:°þ)ìH"„ Y\įŸNÚB@’~™K‚×WÅYDš½¡k[¿•PÖ¡?iÜH:UJª`(¬‘P$Á¼)d1¼DƵ˜«ín gÅõµ%\)¨ ØðÉ!ïÃAº8’êfV»zm!ðzÊ£)¼Ü!fˆ†®pí¡W—~™‚¬Dˆxp¥Q˜%AÄÏ5tuÜø7²‚5gn=k1}©Zá°t¾•£VrœCÊÿGj„p\‡l=]K( =å‘_Ÿ„†•$\áÂ!à^úe®'ˆxqÅQœ%BÄÙºzÁÜ·±‚)/wj NIÁ}ÎwÙ}')@1)¨èÇúöžï§hÞ4'Œû ]%¿ þÕ3°îÙ³TÒðÈË¢ VD>*¡˜ sëøgEä½Á Ùð&ÚóIpêÂJfWäVOGƒ¿³×ïL ¬ !\”Ñ™ÏPc5:Jƒš|¾mÆÀ75ÅÌz ¨9s4„ª^ƒf°F«DOȘm”¶ÿöêß›’•ŒÎÁž˜¦‹weFGý€…NŽdZÞXû&›g›s=É]]–A É"ËKa¨Ý|…l+jA1õšëNTM¦‘¸uØËx‰›•a qX²”ËðE œ­=¾'婹4A´qþucdêPE3J :aBçã’•]HqIqQº4$ÛÈF«¶¡.ÕœEÄc£ ×2‘zò}‡¡„ªž-# ïÕ©zCTo]–J—tXº2!z7ǹpÿ{øÂ'D¡Šh¢ÿ± c¢·‰#ðßàyµ}XŽÒ“ ,ÙK• IôcEÒ$R2 â!Â`]˜4W Qzp#Ïÿeø/Ìâ?< endstream endobj 90 0 obj 3202 endobj 91 0 obj <> stream xœ3´0Ö³0U034Ó3SÈå2±4×3†qs \SS#¢Cˆjt>T9W—Bš·1ˆ endstream endobj 92 0 obj <> endobj 94 0 obj <> stream xœíZÛŠ#7}Ÿ¯èç@œÖ¥/‚ea¼3~_0är<²/ùý•ݺ´ëTuu·ía I``å–Tª:uê"µÍ¿/ÿ4mós{0Molü;„Ëßo¿7¿þÔü}ýñòÿ·?_Žç—Á†f°.þ=ÿÖürê›Ðœÿh>µæssþëåýüò•̈‹Ý̰i¯SlwÒlü6þô©}O! ˜pãÔiÀZ3}=ýfÌ_®å÷ñúOŸWv0ÝÁßîÛ×MŽf˜>êë²]ÙºËó|šiÌAØ. õ™æL ûz¤¦˜¶œ›DÖlQ“T ýžç!ܤyW¾p}²ß Hà³ÖLQXËÓ@9Z6p9¼IûZª UöüÏ·¤ÏNÒg²\ýB—"b"™;oã[gm²m¨œF†²´oúŒ+û·YÂ"Ð1~Ö§lÕ9|˜>Š\Æ¥rú£{ÍX)¦9ó^rÆÉ}[—Üä¾uÆÿîûh÷µ! Eòù9 [E“]Vðê{v¸=¤¿ŒqOç—ƒä „U–ÁT dw-c·›/[cÃŽôò¼è°n¥Ãæ-e‡í.rõc—¼u¿´HÛ9ªë[Ó€ÁõMh(³ñ?ãMÑ|1ÚÌ·:‚*À;Aõ}Š „cG}Z J¸Æ©ºŸ#¢Js€Ù–TgoíQes! ô¼Åàü” UWÑã«ËS6Eh|¥F£.VÌx‘ºjÛàl©6Œ`Ä5¬\~=QMÂv>‰ˆäXÐkxŠVŠg@üÅÿ2€»ª¬@·ùÇdƒ|d‰?fñ\õGôhu ’hŸùÑÏû%ÓIIb­È™Î³”)'9Ë.*CIrö€jf=Õ,B2“Vr5ÃX}s‡µüâ]|áNHð_ÚâÍÈ‹ÉñIhÅžê+º*a mSL„(8‹O œimaÕ^üÞ ´ž—©5 ÖÂ+†JÁ h³eéÜ&Dc1dì`Gé d¾müZóÔʯŸ,1Okéûè0EY–Â/Ž‘5ï-¥ðR’ÈŒù¼­w™‚D–zbê$–—k’§Lž5±FRÞ™GÊeɽTÝìÀ¾uI¡’<죆ŸÔJÓJ:¦¯øÑ,Ý!Ñ2Ý<´ôhšU²Ò+òê0в+Æ ªµfˆ5%é¹5€¨hÓ73.“£Ü ê@)kV_{@’¹J¦!½e Ú(Ól÷FÎÔH¶k!¹~p¦¼®8 ÷ Ø.­©³©:/ð‡ [+‹T‡™ìïSïy¤¬rp\Ûßè$IlŸ#°–è `j1CD= Š ™zîJdóã…'cÔïöwö®Å«Y(16m¸0\Ÿ"mµ7ÇÀ6¬°vL±™~: sp\ÑîÚS"„ë@lø„û…ØÅFÓŠ1õæïÿW“é\ÁÙˆ1 ™¬ä¾‹!:´þãzþ˜–•3ñ-fýù†Ð¿ûñÆÚÎÕAR ü;‹¸6Ëš ÑŽW Sz,¸v]ûª5 Å8x§”éÞ0R Û®õÖ½oÈËJ½‚å"×½Ôú„ëf+nx—õQ Üö`¢ÄwçtZ>×a¨/,¸«ÕÕI\i1È £ÚsÐc‘Z=Gdz±#½¥€N5{J5Õ’· í5ÝÄm^Ó"¥]ÒJK˜¶‹1ž[#Ÿ¶t­ ˸E¯dÉ,j,ÌÌÞ,m¾ôæc, endstream endobj 95 0 obj 1748 endobj 97 0 obj <> stream xœÕ]o$·í}Å<螨¯‘€ €}^è[jý×&E°n‘ëCþ~EŠÒHÔh×nwƒÞηœ¥HФø¥±Z~?ü¶¨åOê‹~®~ýûò×ï–Ò—ø÷ë/‡Ç׃‹G¿¬*.¯[>=›ÜÑ.¯?/ßk÷ÃòúëáôzøI, €4w–(OKTøå÷ú3=utåÉSyüD¹ò¤¬RùIÅx$x=šò@òG^QQx/kV) zz.Ég‰RÙÀ²(f"¼635:\UV£^@‘!À/3cøA•Š0oÕ7–pâ%±à<+^oϲFlet®òŒ‘ˆTÍ[:Ò„ªèJ¨b8VÈ-VÛ|îD©$ç²öeŸ²diý¸¹ªN›;• ‡ Ê5L»<ÇücØDÆñSþ’Ê|Óz¢%Ûhƒï|\±½S ûßÃ*fvf‡aSÒ’ÅKÃLO£­u9ì°™›÷½ñµÅ™a³¸n”Vìv3tuv¯‹ÏL÷¨!ɘIé& º‹lº÷'àQ•@79 #ÑÑ9…fg/†MTÆ Æ,¦Qo ˜2ú¸gx#[há­4ÑÖíD •̨I·¿Ãч/*EŽ¡Õ7Ÿá$U9¨ûù¢&RúU:ë.,ºnGäY&73WxT m‡ h&RÃÿãŒ(—³'jÑRQ§]+](¬É<ïŒtZbú³¨ÄÒo˧Ó/ ÔòË¿—O¯_ÓwOÿZ"±úËÄõ÷ôïÏ ?·] "ßãAÎ ΣšÏ‹3&™°‡±£q^þqxunÓWιaoº½šNÊfkü0â{Tó ÊJ¦zLM 4Å·ì-$Œõ:/ yM[ƒýX@³£‚Jøù»™ÊïÃoT:$#ùÅZß„vS-µžuZóõƒP±}¾¢?»˜É…p‘¡¼Ÿ¸XQw`ˆ1;*×õw{~Sý)Ôðý-Î|HƒzE)"Ư´¡P$3)7&YÏ‹ñ#”[—µw{^£æ´²©þp2’™ÞÍ,GËqOòh»«ÑÀw$ß-8óÍIrî*ÀzX<§Üž˜6àñ—U[—\$Cç…¡˜·Ñá”1;*WÌ{~;&vè°Æ!¸ì„ciV¡áÁÊ\…oçë…цÓ4«¦5ðn8Õõ—Ö•k{/Ây"Wâì—B…IzÕÉ’ž“Î 2„Á!c L§°oï!Æì¨\ö§ûðÛ ¶¨3á!cêÿW!£:Γp­!ôq)=xA#ÅIHÁrÎ’2ö°Æ›¦ÈÈP)2LTZíe̎ʵ¤|~{~â“'™UerѧެƒÊ.†i‡Å·Ænëí°bÿ’ó’I$ËàʈkAúöÜvB´&ZÆ‘NG¡›Á¡¹Ñ÷ûàèŠ2† gh8öIÄøñ ó*†qB0!¸ñâûËeY@êÔóä\JÍAgŽeFå iŒ Æì¨\s‹{ðÛq [ÔÉd´•gèŠ[Œf,$£ÝϨ»y=[¯Xeî6Ù{k<¸öÖÜ7·×6àÌí p—zqìd2zq¼‹tØÅI1bGãJf¿·_3ئzíÇxý‡¶þ¬&šßAŒáÁ˜¼e<¬~>/S¤3½;¦’ï¤ 6ýM6ÍhîÓ×$Wwïˆ0”D².BJò /:Rðp(e1fGeJpšÍdGµ×eÍEЉèÞxBïò> --Îk9À½¯ cÇ0Ó·•gUR³(c —û=s”‘éÇø÷› k”í(ú¯”ë HE^™œ 4¶.=Ĉ}ƒÑ]¥‹ª ý÷µWø˜½Ö™½Ìƒ´hsÑÕÏüåºGp®Ú6̵(ˆl8½ Ö Ûé^ë7ð»>¬XFZMóÚ Â y…Òâ¼ðZ¢ƒ³£²ï3Ö8šÌ›oÌeþ{ƒ90Ý~ßa¬1›Gê‡}ž´á 2+/¨¢£Ï8dŒË—‘}ò ëwK–?9Xýd5aÑ þÌ´2”¹ä̽‘ëËáb…ðì`ôXCwIðgï³7w²RNôõÇ4L•Úaö'b஦—gfE½¹¦ÊRWŠe³ÚÝ m½þ¬RÈ@)_”(a îczÐ ¥6m¢% åD™Æ·^ã=w9íC4RY!õ°àâqÖÒø<Ó–œÚçV†œÒ¹†2è˜=Ę•kÍà=øíTpƒ»µv(Ðÿ˜ži(Øåpxh¡†Úú}ËÝ~1¦À£Ž2ÐÏgvºóÉlbß™ìª9>jÌÜû§ Ycñ@P6Ο­ÂêKŒ¦˜Š+0~¦D+N‘5ެ©L}Qäü™ieˆ¹Ð æÞÈu97|+;Ø©flâEwí"RmÞéJ|‘E„úË™¥ÑJ¿¯6çÛ:K÷’þ( ²„îY*¸éá±N§À-µ8 Ûr4^Àò’Ùº¯ô¡j¯V¨7­—‚6D|aÅxG2Muƒ£J7Cår¯,A@ŒÙQ¹2¿ ¿)8]ÕâåÿÐvÛ™½€æ}V·Ã1v›Ó•5оBÀk.ñ¡ºäŠiC C°‰fØÍ|<ô zØZû5›uÂZg\o€5'Í—×àÉõVÙç­ˆ]e1_{É_¥"ÙáTÀÒû.ç…¡ÀPƒ)ݨe¨ØÐ`¾lÌØkèÕ…T@®¯-ù C–¡S2ËåÃFÅ7˜3³ ñ™¼ &Ï Ò5 C æ>3üÎUf™ÝÚ£î V²CŠ¡s²3ÐÔ±ðΠظ2ã·DÀäcJí6tL3 5˜’yP%Ð ¶£9Q¹ëÑ}ÀÑëzi+¡ƒÌacù;Åêɸ‘™©ÓYD ôΖ§é,–‚ Ô`ŽÌL½vz+„ùr€33v`¨É+w9Üa‹†o)9 wyÇï.žËvÇ  @ R bf¨PɘÁn4¦cp! ,àƒÇÿMj×,êB~­-­Ikv !gCµ]uNŸ3‰ãpN—“àùm"!u³£¥]wæ2ê¸&Že%““ÈYÖFº*káÒkQh¸ÙJ›¥/Ò¶2Hùzk4몴^GšÕà> stream xœ33Ó3T053×3RÈå256Ö36…rs \#C3=KS ß ¤•UÊ•Á¥¦ÅP*1 endstream endobj 100 0 obj <> endobj 102 0 obj <> stream xœí]Ûªì¸}?_ÑÏìXò­ C`öœÓïò¹À@™—ü~ìnI¶kU¹J¶ÜÓçÂÀñnËR©´ê^ª.ÿûôßKuùsõæ.óã¿ý0ýûû?.ûÓå?÷?Nÿýþ¯OïŸÚî­¿t÷|üýò—[sqþòñÏËOþý¯—ß>]ßüøÛñO?Uþþ ykãwðåãÓ¯dÐëõ­a­ê0†‹cį ñÁ/ôŸïúù_Â+M|Ð=Äÿ½…¿wÂß{ò¾«îZéç´‡y×ðà*Ír|é1O×$ Öa\5üöø¸«ç±)Ñ|³šŸïà ýîÓ/ÔC2îµk×$©¥­ðSß<6Þ_\õà¦8Ç:Žð `ÚÃ/Õ‰VäïtݼéuXà P5îÁKÎÍ íÃB¯æa q_‡_tóž SmíS¥¿ô‡ŠÿëzB2÷…®‚¾PÝÂ,†ô ߆Ɨ´ø G>;ŸVXk¾’¨1ÐÅGj8iò01|…Îc¿ž^°hŽð0ÿ¦ ㌸š~ÖÅgõ›º?„¢¬Y ëîgn…9áh§£ÿeÅ'0¨ký5ÂÒ`|G']íÃŽdÖoY9Çü9¼FXÄêæn„aŒ„:‰^͸©”ïqjë/é{hzçIÚKC¿†³Ç!l}—ì±²8~`r7±ìú•º K ñ#…2Éu³¼¡Ç À@( GiWàÐïž”ù“ùŒÐJ“ÞÏ mz¥îÂÔûõ<â<%é1Ï3­´åi©ï¸AÂXEzO<¢yšÂ¾éìûVD|RÑw½]T”f"ŽÚÁ-’l.#i)vJrV& 7ºÐ`ºQ0ôÒdBfg– )„9ÌõÓHèj8ÝVã¿ëW¼Ÿyº‘( Z’Nžåí0q&*H ª_Ä„´û3&¤ß´H¿%&´ÖõªJª1°á¼Î‡,jh­ñ Bä}><Ö;NÐÈ£GsK´kP“×Õ`]˜1ó_ î4F¿#}°Ë«'øRx±—H›4®!ÃLÕ÷cÇ®gKR3V H%H#k ªºPPq$šR×57xD<ª[|•aLÕÒ;û©´¯Ô˜JÌÐJ;¯[ᨚñ¿€±=²T¢_®:—jQ’½( 9öÙpŽâ‹œªÑž jž“Mï…¯³ã3Ä­NâLÆ«ÁÿI–xB¬ÄZŸ cØÜh •ÂzP´¶aãÇqÓ³ý8œÒãç|C_8Ɇc­ú†6 ½{_+kÄW7—)N?ãH%–ò‘=fÕJ—ò…ü¸±¨ê¢¾N²¬_oЯuΦF~˜œg]'.¯FïqªÎ¢>Á#'`ù‚—¥¤¯Ö»dùjC}÷(…;÷])’óþ~žB0gaFØXà¢ê…Ïe:«Ö·»²HþKx jåš÷-I5ƒýLá$å¦m‰°,‡©MËBª†ÂÕ6»Aåk z˜@‘&߈|»¡Õê>(ÎR?'°º†ßå~þ—À“"Œ¢¦E,ð$P+†RÍ@Åô¢zò µ Ýaží›ÁyÒÙF­Á/×cß2æ(‰s@÷šuÅ-žZêRi¿dMJtÓÖñ²«—PÍ£~|Æ¡‰@Þž¾y,ÞN¹|*ˆÛט\2#îù(mœÝt–qšFšdÒ‰X%("×W"²]tªûyÀ—³¨Ø4h˜”ñw„ô¤wÆÐ £\¥TÑ@¯û6v$y.â¢}G?¶Ù’lÒÉiÙåjŽää ”°åýgßPYëtñ#-XœU ¹éP)Wò‹€9Ę ×í ûåŽ}½-Æ:—¥h«n–ërÔ¹?sî$nfò1±ä99K(1Ï—[¯`Š}çmÖ &8¨e@e ƒ˜ÒËr^ïŒÏtKC³PMúÛ“Ü›ÿŠîN2$ØäµcrÝ‚/Q Ô :î_©ƒÑ3jCwÃ|ÅI É|§‡]‡ƒ=m1Y3ÚBE ç[6¤zçGw †0R¾Àx†äP£Þýl9%œ CÝ,+PÓ“ß4_.«Õº © /CÑ’ãõd°« ´÷ és¶&ç½LÁóIòpkRWT©ÒaC­„" ˜ÂþØM ôL€&‹˜(0êý7èbXĈkžô†ö¶Zò¢ê~ßs̘2aCN¯’ZІ m ©  ’?¨ëjg4 Ïí[ÝT-èwp3žeξgÒˆ-©§ûo³’UBÌ/Ìï\vþÕ,†SÔ1õ”Î…î-ÛUή“d®‰÷p´YßĤ<ÃËv¤Žõ;¯‡®Å¢„~Rêk¯é.ƒ¢ˆ ~ýÆŒ@¡‘ÚiNÌÖnPMÈÍo•3éù¥øKÝõzØ7Ð6àÇ™XŸ ô ©¥GHBÈWØT/tgQA~ßß%<¸hÑžîÏHDÓâÅcô$ZÉõG»N­G9Ù„ÐwÚ“œ† Æ¹ùdÓó>9Ý’áNK}FÒD?ô–£aüÙ{j?‹thy Ú$ž¨÷DIž›qè.z~q”Iá¦èw‘“,šö'•¥gÕ3H1´l#ƒ¬R{¼pwA)½SGÔ>Œá«p6Ý7¼ÙBþ­kC2¸[¦vËg«i'„;\‡z‘mx@ôWÖ.ƒ`}G*±ëSð¦©Áw„[$º/ ~såÌ7ÞkM(oÝ ”Ràújí–VBàE}}dž½ _<¦³üÞk¢Ê…jÁì;üôÍ=Êpr]‘©7$¯¥sä©W ’ äHë÷†/»\(ž J Cl± ­®L²5ù ¨…POnHëy9áÝM°Âu F…”éÂÍ™wcê1õIbäÃÊS¿é>ën¶|å€(`yº†êŸàâ;Õ™U½æ»‰T¨é¦Žõºçú]Ò‹v°Ï±ƒþ„f[cÛN­`¸5jhW<ž}‚ÕŸf"À}fë¥ò–°­¹¥YCÐúû–™à&?%°E~*S‡]Àâ—7±QYž8fï÷ ëmÐ)ªsކìÙ»‡FüµŽ­K¡‘Å3Eÿ îç4òØÙ#ˆB´¡Þáh¶(X—ûÞÉw4‘åG…ÝÔª–€§X¸…ÎÅžt?5'Ý”%kö«> b)£¤½ÀL‘# ÝMcv5ƒÎRÛŠÇ;·•œ¬Ë4°B)#6{äïý§„h¨ès~T!š®W®éuªû‡í‚%–ܵ[1w•‘ê %”‡Ásq;ñ"§-Y…‹VŠ­Þã%ƒhµ£fÉ^²eˇ;Þ°Oø¦Aeì&Ò…'(‹$2!ÿx_6ƒ‡UHMÜB\}É€»•×µ˜‚©¹íá+ºÜ÷ð@\+Ÿ’Ç–Oú~^6/ú„26îŠ5OWÍָѥ¿KÄk%ÏçhƒŠ±«k5•6{n®R ,Ň ŠR≜KŽ×3çX4{¶.ôâ.·7XÈZo‰œŽgvÜzySmëËQêìNVm¼ò˜¦À`]Ñ:\j/|9D~84×fI<±ÑdGî{u¥kºN²an.Ëo—\äæ Å#ˆi~`çA †.ÎGl}û¨ËðY³Â`@\ £$ÎI‡BäÑØ7˜QÝì—Ou¢ö¨·æÚi°p é§©1¨€æ½oô‡)Žü¹Q¸Ê8&”òbÙÁùšyMÅíyÖ¨."=ªÏf¨‰^þST_õJe5iT5%-åÏšÞ÷œ®ùuSšõ ònqgè"œ»ÀEj}¼^ùÄÕhêxÈŒÍü^/<»oìsnÁ28f'™ÐcewÆÚ‹t#?~3 Þ#Wrà̹¹¦OΧß/Pë)ƒBE¤ºëÏ\ÑöÇõÝâŒAQ¨Zî^MéÀ¢Ian,)·S¶\3óZ)?UOE:.—è`‚œÖ$[_´]Ô-C1É‘p¤(ÂÌáH)ùÁu“õò‘‘ü°xÃ’¥-]œëÑ´è"@æ¶üAaüGÞG&Âgë>‘f%WQ ^ÝÓ÷#)c}r ;†®fu”—‹åÉVÁ>»•^‹}ÉÀùúœ< *¶›™ñgëÄÐæõùA¢½{¬fªåá@LSë<1†žƒ>ÎÒdô!ÆAeèTª)í§`ªêJÐKatwŽÚsoÍuÅ‚ çù%Pœ¨ÕÅsÛ,™ÔèýU£Íj]’v"g.ŒdKÙSÍv^‘YàXå<Óª1.‚_5‰±H¦€ŸïáØoÔf6„›¨9YyÇÌ©¹<”gJ6 µ&©±Í°ÏmßkÔ¼¸3›AÛ5±ìë–Ê;*‹\5¿ƒºAôÔžµD¬ -Š{ÿ4ȼãÎG¦¾hº¡>;l‡³ÉP}Å`;rz,rOž‘º£´Øšûx;èìk: $ƪŠÍï®ÒcvBŠ2¯´YÞïJò+/AއE(ðâ±IW}.âág8d Átµ•-gfÃ1w»š='+¦¯° >úUBlšwŽåcN‹Èw†¸‹ãë uʘ£ªÝPm 2óx„5ZÕƒ;AÀÀ©mqEÚÖd¬NìvŽýëö55VoS`-ŠüSôŒóO<í|¦íd¯s¹ ªƒÿ^Ìõ!n5Ä­\,Þ‹æVþÁ]ŸÔ£l¡zÝ€¤,9)~ÌgBùN?c}% ᪉DÜT#=’Žê8zqCºÞ:­Åý[¿^þü*–ô endstream endobj 103 0 obj 4702 endobj 105 0 obj <> stream xœí]ÙŠ$»}Ÿ¯¨gƒû¦”R.p1LÏt¿_hðxƒ ¾/þ}gVi«X!eVwÏØ6\˜ê\”RèDĉEÃå?_þ}.žÌe2vûï¼îÿýý¯—?ÿáò¯ë÷ÿÿþ÷/Ïo_f÷4_f;nÿ}ûËå—×é²^Þþvùu0º¼ýãËËÛ—ßÀÛÃîî°3\o¿^o™¶? ûŸ~5ßn?Ä.׺ðOë¯ÿôÛÐn?„WŽO–¾ßŽáŠéi ?v\¯?™1>d O—˜9ÜãÀ0ð{ãvº=sxbŸŠŸ~ˆƒ^À-Ãkxʶ&`èY¶—yðO“r–‹/†xÆL£g€Õ4ßà >=#=e›Èø«yoÆóWø0º5_óš'syZâ…>Ü»ò¯KÒàÙ×ÁÙG @HðtÞ®˜“üÄ!Ã6Ú$é²)þ6>Mpļü¢ñÌáŠ83ãK˜æ9}÷m#-I®Âˆ'î¡ÆÛÛHŒËOî‘§.ïh›/ïq„›ö™qˤ'qÏSøŠDgü~Z°ð8î9ÒH(lÂíÒ«áðøÝˆåZxqÚž}-·4v 7™¡Ø‹i(Ì䃱ã 1‹#KrõÌa¢÷n[ «ÚÊ^¦ÕÁîÕnÿÛ–âö£Y³\Ä}kÌ£ÆðR­§ñ.1+ÝÂlf$ÉH Äâß‚TÜ´ÝÌ?!0ì”Á9:M¨’’|7ÍXóp›ÜCƒ ·[ªAñ8^!jˆß c Ÿ¸—õð $siFWqP:²`Èjæ®*Ššáž€o¹dúÿáU) ¾»ÅO ©½ËnÞ¼5š°…>žàJ²û¯¶1ÎIÔŒÅpœÃk˜åb¸§ÎÌ2ù€ kElŸK{{Ÿ÷3Y³Ø_Ûuw°UJ›ÎÄQ²oǘE¦TøÄ·áIòñFËO-–>8 ñ%LÈ„?7íëYØÃÐ*Mꀤ0°˜BÚ6 œš=v¼wÇ@7ëìÑf…~£aÀL¿y@D ØÝœ.Vp¬ˆøðƒ8¬½£½kì\’v"»ONb¤)ãê{¼2ÌÇ·Ö>8ŒúFXHñ+£]Œ8ð¤"v<ÙÀ ìeå+€‡Ô ™ÝÀ"8‡‰á;ôD+dø²Á>Ç'‘ò* S´.0¶­¶¤qÇñY^€°ÚlNwƒ$ö÷¸(©Û7Êý-J<°wù ßãvïföEÚaVßD9™Ø"CÜ‚È A1$yéËÑvBÚÓå9þ6ó¯:ÓVãÙî9L «Ä†IVb,Á©§­ñ{ ‹g[f<€›êÂ`§Š¡ˆ³ ÛQˆŠP˜É¡<‡™˜ˆÕ»`è d@dF’¾a,‹kã²M'S²Y•Ø3†D4Úcû\Û›$"ÎÚV%¿¸p³-1Œ?¶ïÁ…PØÛPËÀƒF•ˆð"Él#Ü`ÙéM]‰»C²Ã Þ7KÏãWXA D› º³¼U†øÛ‚Hó´îa[.¼ú>Mcžï:ÉI ˆN‹ÏH³·¯göU=aØæÐ¤4!rFÑñÐZÀλ&+‘”ÈÎ7PP(é»aB,¸5I¾í€ã-#”&­2¦ÉÎi3áe+DŸn·?ex²Ó¼º‹¹˜Ùåïüç—_^MšäŠÞ|S|ôp»$½ÓF§.-=Ø€ÖøØì©dûOAœÒLy¸²HaEaæOá¹0Gžý€Lª›3»ì££¤óñ‰‡\óOý2E£K™ZÜ‘ßú ¡¡;ìTljÄ'»†gaV1ÀÏ$K¦gÚêŽóÓ‚ç:Å=ÞY2·ÐúC3,R™')‚té Q ܱ§<52×¼9ŽØ "?ËÎfƒO;Zbòõø$He>^ôˆø;ïáËJìlo貄E¶&ô9 }•0ãgNÃHa Ò¶Ø-l ¶…÷ò¥ÕéTógZê ´ñ16+9íì´™þƒB·…„ç‡fìKlŸgûk”Ø4½rR$œO̵§q~]¡0žÃ¼[¦ô~ÂA6"þýR_uÙÙÆ:žý¢ƒÂÈ{‚-€R[Ð3.4⫾æ'ä¤ Ÿ¹ßW«)ÞŠ7g¶«(ø”×yx“5÷„ULMñ±ˆ´š>‚˜áè%•*—™·`"ÔY$Ìœ”:ʧ"rª%SÆ­3žQÑx•@k¶×Ë*…#©>Eòùk»ärñ#^fºö³*%³•‹ñó¥Òng¾ŸÛ•LÖ¦¡N€ÄqÄ1 ‰˜b}ǨÙ*’í“¡ÚÌ\q-è¯ 3ÇùåÒx‘¤‘eed ²ÌfXnÓuõ-ßtì±Ëý-ÙÌ/Ї&Ȭ´8£G}íÇKÕÑ„õD©TÕªË8*ÞâÖ1_è‰K‚E;L¶{܉ ©5ákÓkOLdà7Å`NÓÆ-̦?`J$¼VvèåŽ Ÿ–8°çÜ8¿ºí›Þ…„Ð ~µìFÀbySÑÐÏ'nÆìb˜å£\rœ:Jç™t®÷ͳ~¾‰dÄÏÈŒðVb×Î ÕªÕÛ‰©b69»½¼"Ï,„¹eÅþ§Ëz½Rð¸¸Ò)HÊÕòjs*‹‹%±‰Wa—c|)HærW)j;RCdJŒ1ñùÌ"läSþÑHÀãLWEɹÈɵmĈÇk¬A %|À¥ï#LÄè W¸ø8ñÉP7ûÝM»wòÖb¿·¤}î|˜g¨ÆŒ‡ˆdWXߨ.÷'éL+)ÿàÄ¡Šãxnéãî­¼c"æ­ôtzð˜ƒÖ½D…I+HZ19eÛòÔ¦J×'”Tœ¾wP•§¬1]<å{„÷61žaá ½™6sÙÚ¤Eůb“'ù`ܬ…„0öÜ„ó×Y+"éF‘²RžDH¹Éoˆ¾j—âÄ8›Ä…GIuý¹g.@ÅV}<`º’Å?C˜à];mÿ}krò-YõBÃ É _S£”öïé½…Fµ¢]Öñ6St{ÕCùgm…­ÂL¡¢¸µHÛlMæl76ÄàaëE¯œG°‚ýà˜BÆ¢ë(ÓÀŠÓ1Ëp¸uÏ3§€CãÂkM‰ý??M~Ë;ñÓì6cwÄ¡äô#Æ8Ê áÓ»yQG_–U 9|œµ ~>,3ª«ˆ¾§Ù&S1Ì÷ïäÝ2†ÚXIø!o°8,SmmÚŽæEcÑ“ìnÆ ²:,o…“{~Œ”€0Û•‡…ÙÁ)°`÷!æUNTà"ò]t‰Y•’ÇkÃàƒç\sÒ$$/‡]Þ3*¤ê€ôCOÒØ‘O×…’à#Ö¸˜å—:s²¡æÓT¡øŸ”O©éY¨ÈS$;÷¼ÊV¾”Íyÿ÷÷(­CÀg¤º ÁµTŸÐç¤búIéºz.JÝ\…àåÀ'Žá3«ÛeŸ¦Ûñóv—. DP™WìøÉ”ÙùU¿%¯®¼:Ê<)Rž‘Z²t©¾%×áM$œZ-Ä&Fóö>‘µ‰È}ý–”ëûÁ´»Ê˜QÁÙGv²Ã' H¢úKbxœ2$âˆ(5Í(]®‘É ©k3n*ÕžjU'[²Ýš{w¦ˆ(ÀgHKž˜m§b½šÝMØÉ…!gÆ8»à3q2t%égÞ9jOðúøÅ%ŠéÛɶñD1çZÝÞxb×û°á}bÕAËipXådë‘Y–¡)Rޤ&ðèë=²+)++²¸¼æ?`,7 “Å:ä~ö¼½0eŸ³¢¤ôu`7vÝõ)/úŽE×ëѺØÚb›U{›ÀØ%.=Æ-*=ˆ‡.{î!õÐðõ¶Å·¤•ÿ¯øö*°–™¹ŸáWeàï3¸?ô„òÜ Æ¤€g¶ZÃ5&ÛºÁ3…œÛð¦Äu™œ¹³0£ƒ3dÝÝßScÇùþþBWíûà;‚ç|PSHÓ§ðÞðU€A‹6‡LI*SÖÄæ·Bƒ·CÑŸÜÅ!èêÐF6­›aîô&çþæ /Ÿ±QûmÔ{_¡GíÑqFÊ-álqÎÇiØãæžFõif^´ºUg’Ø;uEum’Îf¼ot:Úd¨oL PÙ„ù°OT鬂š{–{ × Øõ©ˆŽdÉÒÍ‘JÅǵĪǎ,bñð-±ýÔãƒ^Šš0™ÞÑz¦Ú‡Ú9'`™[B¶]ÙûÍ‘0* ï²³^÷·Èæ˜" p8¢Ù“5&TKüà=@5‚Ë‚¬a×»ñPߨÏÓÒEÈ¡iÏÀÂq?ÅüºLÑä^®\mhù"ÚàÎ.~T¢=˜ß)9ìT·è~¶vÌõä|I˜;›4ï»ë$>u#“GöNæ‰ ´q _®„+ö9Âàæ8…Pò:¼êór+¸&3÷c3ây=€Ëã…+Ù[*»n»Ûï²{¿»Õy‘¬ÒQ K‰Xû†µMÁæþØh– ÿÈ£AšV>[ËCûosIÓ2}èü¦EÂÞûQ—|œF&ï jâqÑ:7í$ …`xKj²…OíÆAfíÕó•ñ² í r{ÐF"ê&Ô-QgÀJo±žl^hdÁ&në»”4 ýU!êí\Ò²x`Nš>1SßÌ«ÒÃÀE#}¨äw¾ÃùÄŸ_÷¼«½ˆ³Â’ >Vl¾Q#£‹:ÝÃg†tEýÕûE,fÄ&”WuòûªZyõ±¼Ã‚qíî=P+¡´Y0sñ?h”]ä ÖãÝÓyC½Bíhv Ým]sƒšOp¸@OŠõ5ôëÖ—½Èû¸£ÿos&D{H<‡ªùà|2S£Z×·ŒRVÌž|ܤˋßuÊsïÖf¡h<• xµ¯…»×_ÔùNyR¤¥ˆ9®EtÈ- !seÕ¢\jÀo ¹~R5:-Û¹Œ¬”ûkpŽOètä¬I¶€Ãšh|‡{„㯭ufö1©§¥îí@~­{ ŠëB,}¸9¾¨!&õƒã±WÅ~ ïÛ=-ô×ð„l^†'¤}ú5âRš‹ïw£ †²ƒƒ„oü±ŠŒŸ1£52yxîGt³d›ËJ~ÆG>©Ou9¤÷¥Ž¢eþ/2«9wM†|¶EWƒ.ª?•Ôq“ȯƒ&­§4 Ù®µzæ3cXj`¡&’j¿ÃŽOe+¹ÙœÉ&µÕÓmO ~d‘²à±ÛÞ¹™SµWl%­í<ê1ýiR"q73¹®€O„)æñ!æUÌ5ÙÀlLIgì!D­€ú6éh!±%-ÊìæÙží Äç~Hü,j±gñt…>ýG.Êï7ZÚ¡«Áb@ú>'R<¨B`¬;šÅ<³šdMö'QÈ)í8∤¦m+Õðö•8…SN‹ÀirÅLú«(Ôl‰|è¤_óDÞçO™àP™Ì¯D§+M¬¢Ù A˘"®˜7ØÕ<ûÛ¨­ÍšÄn[¸6Mús<¾Èå zާ 0"IÕ¹û)ñAsœü¼ºguŽ¡œþæ]þ}ùLÚ]“ ç*Ý«… ö}-¼H”Ì}ÿc‚‹]\šÀ"ŽbbßÂ'¥Yf‰DŠzï+Æ>ÕY7¨±ûÝ?ËÉSé¾…áò:™ÕüÌî¨ýYÙ÷5Cxþð¶ \iHÐOÖ1j6•±¥'ùr¸Bo˜Ê@(O뜆ÆÛ‡ï^ãmŽ~24¶WZƒZ…ßÓA <@w·ßUo8è¾É‘²³ =V¶–è²—+¢¹cœ{ž¾`“»Amâ°wj*öԪ߀t¦8!þ[Ø@9a…ÅOãó‡ÜóC±1H¥OÁž²/r{™ae§rà¾%ábú¨*†ÅR&¾y-ÿ ”†¨Cv¯Ëä„6aTŒ6¦Ž!V´ÆH ³é?äDËž,²QBÇÜ®™Žƒþc³T©)ô ½{K+QQ~³s?»ìòg›ØmuÊþ̆ÚÛøÎEÃ.àðÕÎò¾‚¥_‹{B = ¡d¦#•ž· É×#¼ˆ×„Î}Eõ+»*ÃÞ‘j\ÙÜGlµŠÍköðµf`¦P†¿]þ 4éo2 endstream endobj 106 0 obj 5026 endobj 108 0 obj <> stream xœÍY[«7~÷¯ØçB]n»‚8>—÷€¡ m¡Ð@ò’¿_É;#íÎhŽÖÁ)= ÖjçúÍÕfú~ú:™éWs†)‚ÍŸs*Ÿßþ˜~ÿeúr{Xþ¿ýuº\O!žçi¶>_¸~ž~{óØéúçôÁ^>N׿OËÙæ»ùÑcoþðÀÂíàõzúĈ.ËÙw‰‡4€ˆúÛú«§ƒ¸Ðן;:Xnéœè áHOȳ’D!ð+¡î±¯ª‰™#P«d\ÀƒÔ7q•^ð¥ØqÞðŽ)à˜ °—Ùduz¥b4ô¶zÓºj¹êQ úZ•<ÂlÖãô E„‰bY r\¹…Ýc›eÖ•’fˆ­äqËÖzF‹n*Û0Ö~a6•-ˆG²»sÔ*y'Q!›ðzäÌÿ¿ã,™cU¨M™Ìn”rOq¼„›ØÅ©—(Á°.*ªú0C{,Cq·±|§Œ$5šâö^åÜÅžEK,Bƒïe™9jÓ©ª"3vâùñZ ð‡UÔŽ-‹ãÍÙÆ9åÙpÊq”ý€¦ýç´-g€}TÎRCUA«¶f>¹5ÃJ-ÁÉRÉ‹\nè\ª…m§³¹ØÕÙ¬âíBíŸß´H´c›JôÕ‰U„T/Vë<îjŠ«0ykí²Ž%ÞGŽÑÝÝù[‹<Àœ‡lŽ39Ú$éan±^ Õ5—ƒlY8ô(€Ya·¯B±eSKÞÎ0 ¸ØÜû–âÂjä¡®|2=”bí9HM±`î:jWïž@~å?êË;=ò®¡U{3rah–} Q´Qr›Ió?DP3IU.*†,:=ÿÿ”¡ö‘ɦ&×qzç’A܃ôÀ&ê§O¼ã yÔ Òlmò>e‰ÇÍïÛÇÊqR6¥ßÛÄØƒúŒí ˆúŒ™ÛPJ—A §´Y³÷œU³+SõÂËE´ÕÌaÖÙÖÖFQµfðð~«©?g±W†-ßGŒ 9lò5\°ôÆ(uÊ7i $ml_4Þã¥÷=¬M«˜bèS·J¶þb0䃽ÍÔ /Rƒ™9UWº³d<šFl* >bú”Fü*?¸f­”ù¯Ž²°¹IÃËfš¸sxñÞu£ºîç´TÊOuôþ*ˆ¿¦ñµÙ©ÑίMÈzÆÉ k챋DªÕŒ ¦læ{¢bk¸šÞïå¡"Ü-اé_Yˆh endstream endobj 109 0 obj 1233 endobj 117 0 obj <> stream xœå“ÍkAÆŸÙÍnÚXlR"Ô‹lÄj{0$µ­ ö¤ôPZZŒ¨PÝn7݄ݿƒÅ‹^¼ŠxòâMöÙwfJ^ÙÆ AEØrÌbT°¼ÄH&_I?»úõ$ù-µlÖ67¦Æ.”QÆ3MázãZñ2ã3Y§´y€¡ãã|Á2£˜"*÷øÒs³8‚ËÍx‹/Ã5û½ÿøã׬ÛÅ‚_ŠâAÐ6šý¬-;"ê­ø/ ª€ZÕÓÜ1fþB$‹EbU¿*¨COÿzQÕÒÌÔm¬i{Z Ç™6‘pPçÎFÂgÔq^líl×?Ö÷w÷j;Z­~§¾_ÿ´½³[cO²VkgZ|KÏo<ý~kxîê@ëó쟹^;Úp¯é«]8/˜j¤z†ü½gJ¨êCô´‡hý×°\CÁѾÏwæœJ‡çzVŽv"…ÿ¹,Y¥¾&9@öŽÌbO$ëÔ_u¼Â;É!|–¬0Ã_$«Ô$È?$k<›‡’u„x}TˆÀ`Ó§8&™>ÅÉô)nJ¦O‘“LŸâ¾dúÏ%Ó§xƒqX˜à˜D‚Ï4ie¸l‘cŸ‡|TXK°á°5°À~ q,¡HÍåŒ {Ö92*®‡É¹ýFôÓRT<®cÔüv’«Ï²í3vÜš0&‰icµì‹9Ë+ø¿d;¾±àZñ¥¢í®VœõB~ÅΔó¦×º”²=?Wpd|Öèªÿ^*šg§Uwyæú”?w4¼G endstream endobj 118 0 obj 603 endobj 119 0 obj <> endobj 120 0 obj <> stream xœ]Ak„0…ïùsÜ=,Q¡7ŠeÁC»¥¶? &£ ÔIãÁß1k[è!—÷¾äMtÛ=uä“~å`{L0zrŒKXÙ" 8yReÎÛt¨¼ÛÙD¥…í·%áÜÑêZé7ñ–Äœ]ð¬ô²§ Nm/º_cüÂ)A¡šŽrϳ‰/fF©KçÄöi»òxß"B•uy¯bƒÃ%‹lhBUEõõÚ($÷Ï;ˆa´Ÿ†%YJ²zhïÙãt§ö±~Ú€]™¥Iž=WØ÷„¿ßCÜ©¼¾Šôm£ endstream endobj 121 0 obj <> endobj 122 0 obj <> stream xœÝz XT×¹èÚ³öž÷{†Ù3# òtÄÈ  JD@@IL`Q`Æ™XFS‹6¡IS£y„ZÖ4䣯›ÇiZOZs{Ú´MÛ˜žÞ[jÓsmNkd{þµö^1iÎwîùîwïlfïõø×¿þ÷ÿ¯=Ä£}A¤Eƒ#_{O òî ÇßB½ƒcnïóÃGþÐí_Ã÷PgdcÏÿ²÷áݳocw¢3þOÏý/„X#Bò®` Ã0p#3 æuÁ€_Ø­€~=ôçtõÄ·ý>å_ž~út‡Û§ö~¼!Ö£úžÀ¶Èÿæ",ô[¡Ï÷z‚ëî<‘ ÍAX£„cñÑü«•ƒÌG¢ÁÈÝû›—C !nƸÈG M9éË0ËÉJ•Z£Õé F“Ù’bMµ¥¥Û32YNÞåöÌÉž‹þ?þÈŒÙNîpµ¢O#Ú„t|=ÌÜÊ´Ao܇Q+³9°µèVtºýŒï¤ëÌN¸ŽS|§`䔨‚ñ〡&´íDèo²·²ìv¶“icö1û`ä—dŽ-€+`wÂw;̵‘6SW.êD•(ÂÈ'0Ÿ@1jùûL6ê‚}já{ˆ‘3J å=F/ëd@¿(Æ*„?î=àª%`Ý{ôúú(Á½'O‘}|­‚99ÛŠ>ì[ÐFÍ”àÙ_am-Œ ®˜cH†7-·Â5^•¨ ðˆzDÖ&+aç(Jû è}ô"¥»ÝýtŒÞ¾‚~‚K™N ŸÈ&;ƒÖ+nd\r=S¤Y!¹í”u"'®D1„RЋrŽÅ2åóÆ1Yvuǘom3ÿV‹« V—7*ø1T?¦Kð/_½ZßÌfp-c\æÎVŽ±Ùžß|Þäo òW×7ócïú+%¬þÖJkl†&éÁ0Œû+ ˆ]t ûÙNîD²û´ì9$?Ç(¹‹ŠÎž_€ŒçÇÏ[L.S¶ËäêdÑ•θò‘°_¡ÿë¿Eå¹°²¸l­˜Qšƒ|9ZK¿ç^;îçb™L?²§X´¼Üìq°›GÅgX”“iñÈÜÙÆKãÞ ^²É¶Ä×’¨hÜ £WÆ—¿èœ[?723JJKLžRÏZSäŠ,ƚºp‰wQé¹yŒ)Ùh=}÷1&Æ|ò•ß|,<#<,ì:~ø‰gv Ÿ~ù•“à öÃÄËÿp÷#)Ö7ýêǸsÇλú?uxìñGª@?•§ Zà3ËG•ƒ,•1¥È¨À¥\…Úxé‚÷ÊJÛ•ñbŸÆ©)Ò´j†5cŽÙ]bu‰ôÉÊL„|ù["‘à<Û@ºMW?äX–å ¯ûdÍENcªž›Ë8GõsŸP¦>fJËaF•=æõ6µÄ&+Í2@„õmo®ñÒYŽ×{ÁxÑd¦ÒyãÂEá útþඤؗïœ_–Rn-O-·•§•§/±×͘¯Î³¥Ù´ºý€aÀ9À¸Üš ÌP­g<î¹¥ ]Ï€=n¹ÂSºŒ)áY¦:Ö”T-Ûu@WïýöÓŸN¼rÇà¦XÚ–ÛßÙÂ8•0rwû¦5u ²{&Æ{šêŸþösÏ–ïÜ~SûGn÷ù‰_½× vt#I ] ]-r¡_6ƒL5{È®>”’5ÊêFS"öƒ³ÔaDF}©n©b™ÍëÓ¸táÊÒ¥TêƯŒSŽ—À§øÅrÏ€çiØ…D¶H)—䙌¨Ä›j#*ÁáÖPoËÍ=¡V¦íAAQp0ò[a‚Á¿,8À\f>½røé>;|<±§q-“Ïpxæ¯md®HÚc_í)P& úÜrŒÔF4ª4>¦JQÆCö‘”ˆÃhBË”KTòr›×AìùÒøùwÀk.\7=Q%ûÜ­YYeËbO£ÓòÓŠÓÊÓªÓêsèœüœâœòœêœZKÔBùq0œKäiq‰œõð„!piím·ÔÉÞŸÈþÊÞØ½)‡ó®¢ß ãÂϘBFÇ(»¬ùÇG¿nÞªüÑKwÄ_8Æx= ço _:ø"¥•ûÒÑ7lwbݰéN­j;ŽdèÍZ;JÉ–ë2Œ„zêõ.™ `íºâÌpfŸl{úvûc™r QκD’¼,ȸ$.3Í„Zî“ë… ‚ðU¡šy‰¹ãn†b`ÞŽþüüù_|ëdsì_Í<Á™Næ _…pß«'„ÓÂsp½vøIѹQê+ _¾=E¡³1x”³=¡É0ë13Ê1"Ó–ÌUrC©Å¨«bQ©]n”Ud‰QäÒø#\`.K/^´yÑA¨½ §9b/«ÇÔMÍ'QòÁ†Y(ëêk×™_×òb‘sØ9æÄÉ@c/ð¦ZM¢g‹6*âÛ¾C;ž{éÀÄÝ;ýë6wÜ•À¥‰ý·7ýä‡ï%²Ò=¡G¿+x€|ÁÕñ“ÜdC·ù6µQ‰FYµœˆ\v$ͨ01*ΈÑuiÆKKǽïœ?K¬ÌçÊãÙ‹^°ôb VÓD(¾HN£$§¡´$Éué·§¤ã ‘Ùê2I&#zõzï<ágùe¾e²o©}íýGð÷Ì‹‰‰¾}•ëo~|çÐK€ózÈ‚5 ÷4´Î—RMJ•…á £&î‰ÔjÔtD£^¨”• ã ³Ò¨-ÕW¤C8‰Ÿ§Ò¾x‘ÊÚx–pbé:§½È^n¯³ßn°{mDžç¤|Ùš-òúšøWÏLT=8*c~÷+ζDx}]ã;/·&ˆhO†7«’„5 ÏŸ iåCæm$ /³^¯Zfð¦‘x1.úñbñ‹Æt_zk:¨<Û»Èd”‚„-éIp—Üró–-·ÞºEøWá &éŒY&œizT•§ÏÂ?naò (˜\á§Âß„ËÂ{Ä ×)J ×e€^ T÷Ûî5h÷ë¸XºÕ„™~ JѨíò¥YŸ“ªö!Ù¥)!Ùe&“ÜŒôšªÍûÉRj®$­8ꃎÇO;¸Éœgõ€rŧ(>E ‚}ú'Öôé= °‰"a=WÞ¤E´Å——ÌǺQƒ2¤åÃþ[öÈçBÉx©KOs³îº9Ći¬%®o¼0Nó²w*5'ì­æ 9R´ò©ŒÙåÙÙOg³1µ‰©;; ˆOBØš'ò%˽}SOKKϦۅÈÓ"2œð金‡&ÚÈVAÞû裧ż-¼'| ×ùµÂªµúd=§AVt½/ S™GS޵£z´Z®+Õ-†RSEªha$ßÑÊî´¶³ÙZmö18¡eá"’Rä@3¾^¬­ ‡ëÖF˜]RÁÇ5­ ‡a°÷Ó>·hÌ–p] e'ÊGq_!Ôó™“{È‚FJí‚õJqaŸ´D T%ЬR>Ó`DKç.S¤z HáwI,ü&ý†p–Hš:%ÈÚ—©T§©sÔå…,R" 9ƨJQóJ^5G­¢5ÔÉ ÒÒ’,ð¢˜éň™V<•²ï g„_núyl‹aßÎC{¦JÌßE²ŠÂß»Òú뿸\B¨óÑ7ÓK¦= á!©˜zt_N²9hÀ¶‰ÙœLù|PLæê‘™ÉœærvÍæ$¹ÌÊæW¦Š¿ÿt27}^2‘¡YÉŠö‰×Êæ‡¯~(ó0­`O)>Žª"Z¹ i´Rº4^¼xš™ŽÔÖE"uµ‘ÑÚm’¬A*É]` väõÙmëLCZÕ©½JHíµLî^{]9{å¬Q8[ü¬!"Ñ›Tp¥Ú’ÉTÌõ쮹ø'á‚ð³1‡Û1Þ}`Ç{7ïÔ35/>ÇÌe4¤œ?_øÙž]oýûŸÏ nuƒ?ݪv®"™Õ£Jô;”™>.’¢<¢gJ.O¥Q ¥Èb5U@e»ôìY¨ÇÏRƒ„„YŸC¼æinï ªp ‡¤Šç‹UÅjÙF¤ÙÁ"%éE%¥Th6üAD¹Ú_¿ŠÑùáDÙƒ##¿}Ýh-§®­‰íJ\ùu¨»ŸyÉb!’Ü•@ Ô±¹ŒÂW•ç—S«ÉrʼS£ÕÌ×hy›ÊàîDóRØï´š·Ï‹Ìç5Z—Ci3[ef¤´XÌqX¡x>=]]7N–Š“uïÂød8×ÿš z‡XŽòH,ÿšïñ¼±<²Âb“èßP‹à(PºpÎTaNìÄɈ'f÷œ‘Ç¿œ~x´÷ø¯ß–™Ç¨w1g_xàÁ®üúŸOo ïÞ/üzÓöäáþèÍy‹¯{óå_ý{~¾ðâCÃ;7.^ø‹3¿ýƒWªƒ¸1È­6t“¯P÷€ÆúM‹¦ßð€IñMÕý¸ßt/³Üéܨ5ës•fyŠ9’¨Y …PÚÔ©$ô“ķ p+~¾>=œ.›Ìíô+^ú„<Ï-Û;ñufÏÐí"yNxü§‚ëÔÄ•S‡~*<.¾dÂÎCL‰/h2Ê »S¬)úÝ:½5=­LWõ–ɘÝP ÝŠTà kª5Ý.˨IMµÎ·êˆUÚS9[iøˆÅ ÅÊQ“:#Ýf5ô:‚•1H¯2½#Öã®ÈmZ=`ó*ŒÊ?Š_±÷Ù1b[@÷ß ‹ 2Vk µÖ 5è´z¥KGéœâG†95N­S—©7¥›ì¦Œl”§ÉÓæérõît·Ý±„Y"+—-Áåx‰î:}©±Ô´(}‘½†©–Uãy¥¡2åfæ6Ùmøfy³î¦Œm†mÖë z3ÊÔÏAóõ¥h‰^AR‡…VU*1çićСƒ²s¯îbFîþÌ,½gâÖ¡·Þn<ÀØ…s[eC;e‡%Ô¡w U‰“&üî÷0O&âùN¹ b`1úНœ·[t¬<a£bÞh®ÃøD!Év¥¥h8ÅhîOª ¥[Ô«´¶Út%dk¹µ6Ýhq¯šÏsæ”έX@÷RÈÜä$ ð_"{ñè·””$&³m‰G·Èëó¶z#Þa/9Ž\;|¦3uLyÿÆã±—^80±gà†ÆÛº&XÖp;<¿F2ÿ²Ç{ïʼnMsï’¤Á|òf×}_ø·é-rDܰ¾h÷2Xå÷!z©Q™/ƒÝÍÉ9¼[.çæ³X®dúåÛ‘J‘Æ"™Æxþ,¤àr!9 R;kÊ· +%oã¬pjIÞf¶2×3é öå—¿õÛËC¤Â{òÕb›ŒÊ&),_8ý»‹TÕ× Ì>F¥Qk4t½œøÑ@Þcy§óp®*W«É׿ƒ‹,òø=-ªu‹¦EÛ¢kÑ·8[øW‹»Å³IµI½I³I»I·I¿É¹‰ßäÚäÞä٫ګޫ٫ݫ۫ßËïuíuïõTTÔÔÔÔ人zŽªŽªjŽjêŽêòG]GÝG=KÁ>›•ÌÈᓱynëýþݱêÐýßyàãË·½·s‹jh°;ìk¼ïÝÇ…«ÂŸÛådr·îX]嫲gç¼ë©£N—p©§×¿|Ñ2kvé#ûžÿnÑÆ0äG=XØ|8ͨœ‹ÍÑï´õ™ ¹sûÞnˆ8óx‡'Ke—çªQ–Ç&·Û´)jd¶æ‰ïÏCå!½Y$r?KòáYãô„OŽ÷–E‹JÄ÷°ÅúÒT’š,è!­'+{…gl÷_û¡vq~üõׄ„7ú?JhÙ{àðS-_øÍöÝÕ¿WŸàŽyôéØ/™ŒW‡‡úïe;˜åÙÙÿóŸøÃŸƄ/|1¿ôÔ Ã@uèaäŸtòyRœFkyBi##Ê3ŠÓV¥²FY)ªÒ•ŒšëìähI^xŠï;!x“ï³Ã¤j—¼"/ƒì´Î‚t¬³†3Æ2d3^êÒt)–öÐd/=(ÈËi±Ë\^Þ¼¹}';ïJƒøæJ–—˜øæ›GŽ3ïÓs ¡¼ ªÃäB+}s\VΔ–uH™vHd¢Q}D9bÎX¦Yj‘•ZM¬]çž<~öeí³å†øA²Ožó€PfÚ9Ðúæ¬cž g.'Ï€´.ÿúôsÞžÓ)_!VF8ƒošuÈáÓëú‘¢_>A@mÁz#X4‰uWÈÏ̲¶UNÞXÚðmÂÓÂóÌ*fÝȾ}#™Ì™›ázg÷¶VapDxRØÓ ØmPë|µŽ…}*ŽÑàû1T7¬Y®6+õ9Zʑˌµ/ã¤T"_š|§Íé›nY=f¤ê3^} °Â‰ùÄÓ±ÍgºÝÔjf‡¹aù°bP9¨Tj4¨-&_v™ØÂÆ!î­=BÇ› ö'ãLŸ°oüÓ‚‘AÈ@ž”Cd Ôk,P¼€ ÎzÇ“2°”.2CA4¯”%²è"¬3ë˜já9á̶V&Á43-L¢uÛna¡p®B‚  ï#ŒôÏ#2Ty[yþbôÈ¢+0wêb®¾O|¬^vøÊÔ*™ .Š+=fx»°/‘˜h•=žH\i@”C°|Ä}÷ÖÛ Kÿ‚œJú£ç+§K?Hþ´zõ}Á¡Üò¥ßé:Å.Á1íXÍüÌcˆ:寣V¬FU\jâÀ׆šä·¡õÜ»¨ ?‹°‹Ñõ²·ÁÊÖ£&Å0j•³ µ*ߘ¨ˆ®%ëÞEåw˜ý5á-¨œ{í‘§£VöûP[m˜ûÐeÙ%ô*»5C{¾C°¦ˆâxá.!<»Èo©ìa¢-äF»ÐÓŒ—¹—¹$óËŽc7ÂuÌÞÀö²—¹ÍÜSò|ù7åÏÉ/+š•™ÊnU©ê%ÕÔ.õï5k5ǵ*m»ö~íG:‹nžnå~Zv"þ ްW7cd6•ÑOʨlR^ D›2©-C,ª•ÚâgƒÔf¡½YjsH‹vKm9øç7¤¶ªË#R[ VøS©­Aiè#©­SYС†UA/®6Jmå¨wKmRªKmŒ¼êç¥6 íßIm¥iÒ¤¶jŠ¥¶µjn“ÚJ”©9%µ5@ÆÏ¥¶Îæ½ >ŒÆ`A¸-õ†z7Â>í@8ŒwùÎp/h~"Nâ]€½;Ôì©æ¸«„;uðX,Ü À~|G¸½¯'ØÄ =¡î`ŒÏ!é¾1Ü߈ݹ”’h0 wôµ)šŽ°jë‹) 3äó¡Þöî¾BÉÖP¼+ÜbzBÒF>*JÐöÅž°“Ï÷)ב¾¶îP¬+ÚùdÏ¢p”AR%ögmMˆ´"è¸$:ºÑÖ®pÏg5töE{aà ]Øæcá|>Ö×¶)Ø'#¢Œ»»Ã[ CíáÞŽá#VFÚ“¶pò Ú%aÒzÃqPDL%z‰LÙ€8ÇǺÀV[P’êå38 ÷‚eDùžp4xMÆùx"ì ÀF…I²fÎ÷d‡žpG¨3DŒ-Ðóƒ  ttPîEñÁæ‘@(ëëDéVÁXhc/%dcw"Ò#‹ˆ•ÚIŒ¬HR›½“hu¢ÐÝ×F ­IÒ1… ÈëíNð¡¦ìDƒä_µ(,iĈ(‰n’.» ŠÄo G;b¼{ÒÝdïäï&Îë–„Ú©‘¼¦-þDðö ýáÐ$iÁmqð>‰€“ÚºƒdBäpÏRLW Îwb€1Ø;S*°Ý”wð}½Éî™±Å-òøÅšA”寧#Š ðÝ$Š€Ï$#öÍÀøcox2†|yÓš±. 2ØÝ)’µÊÏWÕÕ6ñuUM7U4øùêF¾¾¡n}u¥¿’wW4BßÏßTÝ´ªn] µM-|]_QÛ¯®®­ÌçýÍõ þÆF¾®¯^S_S퇱êÚ5ë*«kWòËa]m]_S½¦º 6ÕÑ¥ªj#A¶Æß°bt+–W×T7µäóUÕMµg ­àë+šªW¬«©hàë×5Ô×5úG% ­­®­j€]üküÀ ZQWßÒP½rUS>,j‚Á|¾©¡¢Ò¿¦¢au>¡°Xnà)H!P 8xÿz²¸qUEM ¿¼º©±©Á_±†À鬬­[Cd´®¶²¢©º®–_îV*–×øEÚ€•5ÕkòùÊŠ5+ýS›0‰)q+ýµþ†Šš|¾±Þ¿¢š4@ŽÕ þMd’¨¡ä®¨«mô¯]—ܲÊO·*ào¥Œ²_ ì&Aek(FýÒaOXʱ@7l«&¡ fºaYl’Ì™N•LŒ‘h–l†âRø@ŒFCwH)9*¥¬Ù]fÓ Æ"±BýÁîD!ÀFI^£”„z;Ãщu*¾öxY2–Æùy0Žn,D+PEPEQmD](Žx”ƒÚQ.<½PÙ£h‘ÿáäÑr€‰£|£(ˆ¨åÃh5êøBhU n¸x¨ž“¸b´„gÖôý ?‹‡Gë)DZ´B|_žÿ/¬ TvSXB+ç‰Bø_SÏ–‚/¹oˆÊƒ´ât¤fzà…3:ÿ®Œ¯…?9÷N“:¤þÒº$°ÿÝ\“=È·žâì¡cpÃ| Jüm¤;õ>B%ÁÕIgƒ“;¶Ã BÃF˧´…)•½t}„b‹I;„kæBÐ#ß?í’Ä“8ã” ²W˜î-òÝNázRÄžÄ@ EÚ»áÙ+{%ÛËrÕ$7Õ YÛAŸ1JW;¬ Hüñð%#}°K®"3IùtB«›ê`NÒ8µñBm¥ Ò§dBF"pÃ.}”Î)j:(qjsm0§³É=>‡|ª7¢ÝnXÕ1)“­Ôºº®#’é¡cÓ9JâΰM‘Ú>*ÃüiÚ!íªÏ¤®#ÕFqÇ`uþçð‘?Ég`ŠB/FcD÷$î$Õ™Úÿb®“’©LZt|–ÕMq´•Ê£çKíô†Nà!J­5F×LíØAïd|úì£ÿŽâ“0Óí˜ð¦z5ÔN÷î ‡$JË&=´IZ¬a#¦ô0=.MI᳡àã’GÄfÀ&ýeJjÓãÀôu<å; i«M’Ì”½‰ Ñu/Ð)Á,ÆŒ(µ¢°$å/«q“ ôvÒH@p~FZ_´žÈ%1ÉCõÂõédd#ôÇ¥è'ŽˆÔ¹vLÓýtë9Ð]D™õ–]—䪃RKtÖ;M"ŽpÔ%E§ÅÒµ"ц“{Ì–Qìïò4=Öṵ´ÕÓ—§`æ>³åq-Úò%wÓu¡/ˆêQ))]=3ð&Gb“V™ô›ÙY$(Å»à Éo¥\uÐõîkäF÷$ß³Wødæuϲ4Ñwjfåš6êûáiôöIþÔB?̆®!µ ÚFeÝ+yt.1“ht N®˜®{‘î/ö˜.íyúŒI4©5}¾­ˆÜ]+Ž“Ù> 5SÊ×’,?MzÓõø_ñÙ˜Tò7I¯Kz©$º'k‘¨´b&ƵìÍpß(iM̽T¾³ëÿލõù\µI¾—òcç i­B~ºWª…Ù«zMè&¨0è\5ŒñPÛ5ÀÌzèUÂh%ÕO!ónê™7A›`¬Cë(.GÜ î!¸yÚ'½Õ_ ¸ÈZ?j¦{ø[#…l ¸×Àh <ýY±FÖAŸ´W"RŠûÕª&êCd¡E¤´ ƧvIU5Ý1IÙè5þUÒl஦øýùTR¤];Ig•Di•ÁLp®ŠjhŒ®ƒg=À5RyVPžEjk)U0/ò⧈š)ZÏzØ›@¬ºš(d§& 2ŸrHø©¤ëÉ®«é¨HY¤eÒžÂR(ÉR¤ƒÈýäΔÿ¸xÊŒ4QÝTþ$Þ¤í¬¤ÖLÚÑ:Ê_•CÝa9#R$ò¬™„l˜¦•T^Do„òJºS•Hã59Ib›©kYGr‡•”??•T …n9ú¾zrD´ÇjÊë I¶"NÑîE›¨™&Ý”G¢Ùµ°«_²© *»™\ˆBèŸâBÔ@…t_1MfSÚ¯•´»bR×uÔÊ>+•›¨/ú)TÕu㤪¨ÿ®‘(_7ÍÂ’z\'ÙgÝ$e3å›ô£$Ü—‰"®äÞ35XIí©F¢°qRïTüòCŽk§çŸødüž™É§W’SêôZ4ZÌ^ˆÑx%…í™75*Æi1M¦×r_ôN@¬ñ§*ád5"Æpñ¬4½î 5»XÆ&«1„'+•­tv*¿‹§Ã 1ýü£ûŠœõI+fãëÌ­Èn±kHó‹2Õìc„æ~q—­´—ªÂ_ŸKÆï˜uJŽÎ:eý=$yù{òR}G¤3VˆJ˜Ô—…Þ(Jž×¦dB$ÐIçzfi}Êú¶24».%2Ø8òIãaZ_Òß·Åÿ-˜‡>F×ø¼,ô]8'à­Æ?ð;jü¶¿åÅožÀoœÀß¿ŒÏîÇÿ(à3~íôJîµøôJ|ªŸÜ_Õà~EÀÿ à— øE5~ÁŠŸŸ‹ŸSãç|ì³Ïعgìxìi;7–…Ÿ¶ãï=¦ã¾·?§\øøbü] >vÔÄóâ£&|t}²y(‹;"àÃß1s‡ø;f|èÛyÜ¡øÛq÷í<< Ñø‰ÇíÜ~ÜŽÓá‘GOp#~ô‘ Ü£'ð£ƒì#gslÀøØ‡ÛÃÙø¡ƒ&î¡,üÐËW_ó]ešð->àctàýü­ýøþf:¾ÿ¾î~ß[Ü׿1¬á¾‘‚‡5xØÇÞ{Ž»7ߣÃ_ß§æ¾îÅûÔx¯}m7$à¯ÁНíÀ_Õ໳ðnèìöâ]wY¸]¾k‹»Ë‚tÜ €txÀÇÞ w xÇWœÜʼn·ßq‚Û.à;¸;Nà;ÙĶl.±'|ì¶l¼u1î‡ý›q<ú.ã¸ÇÌQo1à-ƒl$\ÈE.Ľîp·o^7©q—€7ªñFÛéÂÁ¸CÀ¾{Ú7ã¶8°· ø¶T¼Acà6ønivp-¸ÙoòâõÜÔhçšöãF;n°ãµõ©ÜÚl\¯7rõ©¸u6\»&“«Ý×Të¸5™x­1dr5 ðj˜^íÅ7Âø;pµ¯Z©æVíÀ+ոʯ㪼Ø_©åü:ìUR©Å+–§q+öãåi¸Â§ç*v`ß"çÓcß [~C.W~/ƒÇ² øØâ†\¼ôú4n©__fæ®OÃeKÔ\™/Qãë¸ëvàŰz±/d©ð"[º0+Ý橸…i¸DåàJöco®Žó xk5\q.š“Ë-Æ….5W˜… òM\Á~œkòM8ßÇæ©ðü¹Jn¾çêp®Í™gâröãy06Ï„çùعJœ (²Oà97'{àá°º÷c¯ä\jìdy%æ}¬fó±ïù,S—U†.œ¹gX±Ý‹Ó½8 ¦ÓlKÍål›q*ôRs±•SsÖ,œ’†- d‹ ›a­y6K¦lél€9C&Ö±~ÕsºËX«ÁZ«1`5€ªO`•+Ny+,Xhå)˜ScÎDzØÌ±6̲˜1pØŒ±•AK&@3ƒ,Òcæe¦ãî{˜¼ÿ7?èÿ6SúÛ¶/ endstream endobj 123 0 obj 10175 endobj 124 0 obj <> endobj 125 0 obj <> stream xœ]’Ínƒ0 €ï> endobj 127 0 obj <> stream xœÕ½ |TÕ½8~Î=÷Þ™;Û½³'“m²’˜ €0HBL²ˆd™ ™l²DPË&›(Z´”V´©RÜ1ê³jm+ê£j­·>J}ïQŸÅäòûž33I@jýÿþÿßçÿÿç2sÏ=÷,ß}9çŒvutû‘­Cyë[kÛ;K'¹Bo „-õ+»Üž€òŸà³«¡}y뛿ã„H´Ù²¼¥·aŽÝô[„xxœúE£¿Ö÷ü®jèïý*&4BE»Ú¦A¨€Ž™ÒØÚµj‚ë¿ÛàyŒWܬ¯]µô«ùÍØ ïµÖ®jÿ½°›y=<»Ûj[ýƒ¨}/†yèoÂø‡Ñ o@Z ŽÂO¾DÈŠ^Ds4sD5kP5¼]MrñbªAkH5ŒPuÛP9~fA6tLxÂaäq+ý\j‰¯ß{ãB÷¿-Jï¹êÑ­hÜý¨¢ßØë>~ùrÅB>FXÔ/Äö“Tm?Ÿšüñ?{ùñxÏÜŠ…îþ× g…G-¬™uU ¡HŸ ê g§|jPwó ÂA°äòøW‘ø*Ö K9e œ9RΜ?s>ÛjN4§&šx4ØIb?UwkLßüW‡˜c¬ý»|Ò";ºÁmÐMu:”4Ø.#Þd1J)ȬOt(ÏŸË9sÞœס¬ó9Ïçd{¥lç<ç:ç~'—¦æº‘YA‰É8/לœ—z—žÅÉx¢úkõƒgÕž'¸J|~B­P×6áR<®âK»›Ô¬®TV¨]¯ËŸð €Ï6ƒÊ½ñœÖÞ‡´÷ ; Q;Ð-[ 5±ZÉîB1Ø%À®3o¶çÏŸWÔsÊK~¶×âŽóÆ­#o¡·ð[Ü[ö·b„¥x)N´Û¹9&æšprÊ»åæ M&”E ¿`ðóGêýqÂ.Ï__üRý;þüŸ˜;#îÜ´ö…CÚ÷Þ_»æ‰~œ«âëÕ÷ž|ö…ÏP»E¡h](ÏëB÷;wãÃ}æÒVRcop!›Kpžyƒ1À¤pf Æbi‡ÓœÌ` ÉÇ¥ÿ±ÿ õ3ìúÂÿoþfû¶;ïÛ»gwÏvž~ø(r_—•­~µuÝçŸ}öÅ­k(4sÒÜÐd£G½n—ÕÈ‹ãÑÄ)ëIz_ƾÔÄ(›^Ðôe’­É E[u7’0]—w’yâ¤E^k–.KŸåÌŠzK÷–þ-ç[Q§r¤¥xÜíæ\{"ˆÎõi”×z¡²³¦|jÞOÛ~vðʨ ®¾ý€ª ß¹Cý¸1÷!ß­‡ÈÂîž·~7ôJS—ú“»ž=ªº äÙ¿1T"ÕšÚÁ )À½ã`‰l(Íö¦& f;Añ»´Q»L¸¬@}¦íVKŒKŸgåº68:‘Bj¦Zì6.9)-ÀÇŒ¥y!„Î?‰~¶zà›oVÿl‚ºîݺmçÎm[ïm¼MC­¾eê¯/]R_[æ;Ô„»O½öç>üÓ¯O†ùKÞþF¡û¼IZÉ*`$÷™‘àØj”úÌûô:-7)‹6Ýà1eG‡xæ¼2°^¸£¾ò ûŠ9ß <›¤ +œB^»âPœJT–Ë‹¼ØËy‰—÷ ³ì^‡×é²ÃÔmìÆnN\:ÂáhÆáh¸BÆ ¾šgäí&¡|î¦ï ½I™4ápßøz>Cýz^ùóý–›MÇÇ!.¹“Ù¤o!tj‚1*0éÑÔa°Àñ:$r’rqà<p»¦)ì¤FþJ?‹’B‰B(1%¸ÂÎí·°zä Õ_>ÅêŸrâ(Â-•À\%ړ͉üCÇïãÆ•w“÷„à¥ÂuÇñÍ”ê—øeô @ë5¤å%-,ˆHÊ™óT=”3o€(8'LÈËËEÍœ[¾¬ÝyÏ«…Ï­O}ìï‹a„-€_9xÃXTæM4ØlD]œÏ寳Íhp"vŠZ“NÁ}àHÍ8HXÈô^øú(Þ<ÖéŠôE†"[‘j]2:Þn‡†)õAì¦áÌa±½ùlã—Ø¤þ&Ê nä‚݃7à—w¯{ð®ûøX—?õϧßWßr»ãêÁV<°ûÛ»öÞNýÌFБ¯9Q²×ŠüÑo j¢*I”õQ ™i»pf§æXÌ È=gV,Î$êÀÈÂ7·åþ½{ï§ŸÿVÿ†Íÿ}+êWE¸Wáj\¡ö««¿Pûëñ^܆ƒx¯Ú¨îTïQ‚ÍÁnA*ª÷&è—‘ßžÐß›ì ØkÒܺx-vƒ( Qú4èüLTCß½@E>U2HF3wQјµVƒÕ¨˜YQÌæ C†±<¡Ü]žhYš:¬©6¡4EvJf¨$‚•¶3縇¶íÝ»mÇî½ÏÌz¼å#LÔ/¿R¿Â3pê¼#KVîh;}¢è­Ó§ßú·^}—ûjîõâŸâ½ø¼ ‰ÿÚߤþ!샣™¼G£™ÞD´ßÉü°SòÃ|TrØ;¨/vQûC±òYÄ_ÈùtûBöÑe1Ô£$†ÀO {b*|r"h$¾„µ÷íÛwŸú óŧÿ„EõÒŸÔW?ç¾yxïýBžø“Oú° …=ñ°6:4ÝæÍŠIÔG#Å€û¢ïÕî°&nOÞ¿#m«µÆÐg⢔8>ÉèqÉ(]/¸’c3¨vž¡¦dׂóœzáëÏa€ÜœOýtŠ268vÕ˜Scù¾1§ð)îà„qÀ>àpžŠ:}Êe¤'oØ/Z™m¡n3-ïú ¹‰!Vi’óB†&믛7lêêÜvü zð†ÍOþöÂYÌÝ»¾íeYÍÓ >ü—¼²/xÇvüüÐï›:ç=à§ÇJz×ûêÞËÈx?WåóŸÖ ȃ¼¹$c«ë&¨/.c—UûưƒOÞ ˜óÆí/×Ä{ܱr:ÊKsi&:ÆŽ§f÷bsÀóçÏQ üãga?´ ˜K(SÉ\›ÙŸ Á6ÛDê(òr㇠7° €Ë»ÞBƒ0¡8"Ô‡ð¹ƒ_N-¬±lXóÈêFþñÍËàFp£º÷Þ­Ûwîܾõ^òüà’Oÿ‘–öQcͯvø–቗.á àNšÕ­'ý§?øókÔ*^orôJ‡VycyŸ Ä' eDä± ´¸I38=ضÁPà7À¼µµ<˜Z>djuÔ¤ê™IÕ#}ؤz%7rã,)KÇS‡¡gm˜9ÖÓ¶¬M"¸J!/l•,/¯¾[îÂ|ÿ‡—î<©¯‰útywôƒ ±^3GàŽ9\Æ¡Ï!L²Þ ¢¥\|#lþ_£€)'s–Cïü£FÙ²¼p VwœçO°vYüN‚œÑ…üi~kƹ㥸ä JE—h°é…’âˆÎ¶(¯P3|!?Û:a^l¢Æß|"pÑœëˆ8ûä¼a¯¯I~µû½[Þÿúð¾ã¯«Ÿ«ßtÔÖ®;òÐýOë_–óÄwoÜxŸ±]ØíÉ|áçŸv»Þ{ìwåä⤻w=ù@ÿÓ ;ï¹s˺Ûwj-|ÌZ˜Q *ô¦Çk‚’] :묷ßfQtŸ" £)†7%:,)2ÛS#Vã õ˜¡ žEñ‡ÔˆÅˆ@ âG#ÆcÜS‡~ú´úŽzpÏžƒ*3!ÿùÓý÷ŸxYýB}¯ißáGÜtÛ¦ÍkBvä™ãë²D½tð¿êOŪ„8 ¼®×"öiWð¨Ã”®!![ “3xŽÉ×àùì£;ôx$ÄÐ1‰ÑÁ’˜ÔáÈ<2ôå“K55Ѹ)b±> Çsó¼i^x.z—1a—ÆÜg…xNScÜÊYÐÜádƒ”¾ÈŽe%¬MèO #ÜŽgÜŽ‡+ÄíÜÑAäwÒ‚jðÿ¤¥ÿÐA•ß_Ó»nÃ&RÙüBKÛ¯ßeÁ?ziçs¿„ø’ÚˆõIº°¢˜FoœS‡ã¯E}"·ÏV¥QÌØ# éeA<3•†Ío0m„ò€¢²ˆ  4R(£˜¥‹BQKg4‚Ö®±kÓ4iÚ¬èµÑ;¢÷Gë–ZAÿÍÔ¶%šGåiy>òÈ3x±zèú¢âÜíöûDžoÆsÔcÍCK7–Î_¶söG)Ì íâfÐöt‹7Ó¹N’õB‚F¡.Ún&ôÝŠl†KLÑZL)YáQJ”ÖÌ%ÆF¾ö/Bý¯§ÂÄi`žãÚãÖÅŒáŽÐ"ßð=Dj6¬EŸ}‚ˆôûÄÐ3'/  Þ<4ÈñÍÍß" óC·1ÛÀ:Íxe´Ú# zÔÔqéd-/‹¦­¬–È)àPÎ œ£ŠÆâ—‹êÔœìHÌ®0òBz&ïÑ3y¹ý†ê%´…¶ 1@Ÿe®1ï00Ÿ4 KàThܳñ¤Z²ZÈ\­–œlâ/~‰kÔ_~kh S˜;ëÑD¯M'µu< rNAf I !Û”3²êaÌ6VkŒíÆuÆýF1lÂÔ×((¡¨M…mRhŸÇAü¼Ã î ËQÄeŸ%¹ä±#ñ35=ÙO¹£ƒÑ Ò££Pgd±Q®qמ=»víÙ{/]ˆþòK­~^ô—sç¾üòܹ¿Ôã\UÅ9êoTU}𛳿yk4êö&9Í¢ÁhãÖKQÆ>í“jxäq‚Ì{ðd“GI7dÑà’&üÌ2ѧ9>u|ÙîbÌq!W$qZÓà +°‹qÆE›…ò­ÄQáãG(Š1'sïà…GÔri~òg‡ð²e} ½|úà̦盂¯½Çå7Ýwúîç‰?‚âj„O€†vTâuÉÒgÛ§@à‰ˆhôÒ­²Çœí±êÌù°#9ó¸ç(Wâ`°9à Áf½>ì»6ë0_™•9sFVÖÌÿ82ô—~00ŠÌY³2³fÌøvL5/0Æ‹—?Á¯£ Í+‘Z©Æ "dPØÏÅóÙG übiþÄòò‰ù¥“ÊË'M,/£Rw¸Ò R—€~áM%bÜ*—_Tºd¿Í/pª3Ô¸ãÌœ.9E)Þ¬“97 ‰à C™‹@Ôs–üÞPö,™Û/3ýp3L!üõÎí·†^2ºi£ò¤ÉDæeAe¬•£e—#ÇÊqr¼A†à7%à,”…Å¥h)¶‡V6¨†B°F"3/U_¿eÁá(õÓËhù¿¯X!ýäÞ‡?ºñæ¼Â;Õê”ȃþªþm¶ïþíK§ßòÎä.Pß ^PŒcYžy¼ÔfÛ¢ ÏL$¦ÉdIMdîo8Í<¶,)˜t ‰PEp2'x½e"€é†È‡Ó˜0)þû¥KÿúÒ¥¯÷^ØÚ^7ø.Äw·A¡߈çà¹øFõ õiõ˜úD3u…±O?ãÚëêÕêO~©~¬«§NQðÇA“ (Í÷z02Ç#¿ËÊ”ßçÖí²muÕ¸ï÷¥$xÆ‘»É§ tcvÊð¢õ‚‘” g8Ðxjmj*uãöQëDéÇYG Ùd|0²ZtüŠu$ qÅðrÑÓ͇F–‘Ô˜ææðêÑ ˆŽbÑ ošÆ,º>-ŠåwD¯U²i÷™$#ŒzM:še7gÇ+<—† ,x`ªi¦ùî+¼…®x툥_qLêâà IݯjP æ¦Çc*9¡…¡8LaD×ró˜¢8ÉŠZ\5oy5ÎPß;?ôxÿ3¿œ¹a†=·|ÅÎÍ̓G˜Þ­?z,*:l³…‰ =vTäM—o7¯3Þ®×HëHP¨³â þ6HRe“M§•M"¸C‹Ü¡#ìÎ+€JNh9ìë ê€rN=—ö~ì¶!¿Ç¿²zhVW¯V¹¿±eê§~§žS•çÂþd–‰È@g½ )‰Ó úø.Î=MoЗé îDÞF„鎇í\`ùÓkƺõ†Ä8­s¼=nš¬M·¥pãeT8–åçBá§%’m ž§âþ5•“PŠcú+5ì{QÒQ÷8`€wazBº;=1=)=y±n±~±a±qqÂb÷âÄÅI “7$lpoHÜ´!ywÂn÷îÄÝI»“%rJ<”t(9Î;ní¸'lOØŸp<á|"ê‰è“¶“ö“Ž“Î“Q'£MÀ¹‰yÃJž…3q˜eöá¥êC¦®³‰ßv×­w,»ýæÕï¾Pýl}¿©»«gñÆ{ö¬ÿüõåS¾éY¹tQÑ‚ëÆ{~ÔpÏ!ÏØ/–wUVμqìø¬mÁ=¿ð°õt„4¯o£°Õ;ÛêÓh5ŸV«±+¢F´)Xf·Z4<Ö‘ V¨s(ƒLà°jˆS+§˜)v³Ù˜"¥èù»ŒR¸D¶ zîÌ9 ,¡ù,gÁ3çâT¶„=²tȇ?t ñ¨ì¢´Ý$i´Ù­‰²$XÆX²,Ö Û$ËtK¾5ßV¢)¶Ì³Ì±Î±-Ô,´,³,¶.¶4– %` Øz4k- ¢ k‰UkshlZ›5M“¢M³¦Ù&hrµyÖ<[‘¦P;ËZd›¯©ÖηVÛ|ŸÖg­·uiºµ]ÖNÛ:×~×®“®àEXP%<¡AÚÌdõ5üKÎÀðÞWO?¡¢m*baÚ·gùt¤ñw|û7Þü-.wù"hÐû@eYÐ#ÞÍý9æDQ°˜9Å' 2«RÀŠVc‚ÞÀ`F'š‚ dZÂÅ:1+²É¨×j FF«D¬Ê™7B ³SÏwBj&±3Gt¦¤Ö22kXUøh>ÆBin#ŒÇǘ<æqq)ŒÁðÁEQ&‰bº¸õÂPñœíçœýÞ¡­Úºæ ǽòm\“Ð|龦&\¬o™J„(úÄ@6<à]¢ßoµYuû% nÓô:º < cÄŽÛO‘Ý0àhf³ŒÅÌY¦†2«­Ù(®OæÑ>=0Ò¢ z¤ÕÐMAY0ÙëÒLÚ£+‚bMú¡À0â5ŠøeȬ°C粦`nŒ5ß Ë·ÎÂst%Ö›t·X}8  X» ãê³Þ¥sˆHƒµœœ ÕH¢N£×D›•­ë[‰5¼ÐéÔ*ZE²èlú(ƒÃjµ¥¡18CJÓ%ëÇ*cÍ© Š“Ñ<›N¦óÓ…éâtÍdí)_7Å0É8É2¤¼âBm¡D×›K ÅÆb¥Ø\l)¡½Uà ®‚TðB…X¡©ÐVH•ºjýBËk•­ÂQ †ó_#Ôˆ5šmT§óé¬u¶G7Z…{¹5d C½b¯¦OëMè•VêVè» ++M+å¥ÇÜcé²öØî’6ëN9VHØ ¶“éj=+Z1y+_=€o_©ܯ^Rÿq¯úrþøñ Ø1åiîíææÁYt÷ò¬æ¡ñdÛi€(ìSˆ82pºw³ÞŠ>l¾Èù^ êÑ–îXk÷¹Ú,ó-Û9i3ìš”¸ $s×6ß¡ågõjó­Dì·Âì·Þ=.{\ŸöqëÆ KG‚µ¹ý6±eÛX46±uÑeèé’uFB†;#1#iðk²~²a²1ß”?9a²{rb~Ò¤ä]‰~Ž¡ÄXœPâ.I,IZ¤[¤_dXd\ä^”¸(©Ijѵè[ ÍÆæ„wKbKR yµnµ~µaµ±×´:aµ{uâê¤Þ䉯õã¨/0;¯ô)Wn[†|];Ñ)ýÐOo}í™×¡þEýëêËŸþɶ-]§œ~ôÄïÇSO?´íöÕÍ}S'ÞðÂþ³äP.ù .<¶ÊŠÚ½ãê4ЬÈeŠƒ ê„:3uRŠÆ’¢èS4²œ¾"s‰¶ð®udíá• 4÷Í¡ùLˆ‘Ì£n;e‚IÐàlû<{»}}¿]1·8œ3Kë{í5¼–¬ý7ÎðZïà¬×˜‰m೚›/õòùöA°7—/©ùüZ°7±˜xáý–M1±œ í—e“^ÇIûM²I ¶µÓ$-æ° rši‡Ë´qœìBœÃ‘‚Q¢ÖFÏï³<ÇÙMÔÒie94Ý‘w泌àü 59 „ft}ÖlùÓ’@-E‚c@|±SY„xæ5²]É2ıº±útSºœ¦,ÄUÜ|¡B˜/VˆUšºúFìã¨2û4+Q^ÅÝFn㻄.±WZeXbÓ-w++Í+]+cVÆŽ" C:*…nlm{x©?[¤vöâ/ãqxÜ~¼£GÎé fÕçÜ"æO8ó¥'Éo@_S¹÷››¿­¾u‰"¿>kÊ —σû¤Â„îñæSÛMCìc¶¬–t’ÑÄ!E§“ʰV'r |Ö1Ø’,èåa?u‘ìJ4J*ðK½IZ0¸<áy­…£¸()ÖkÃ5Ž55ØÓ1YŠ—J\Ø@1”q~ÿ9>¶sè?ºpçš¾ÝÀ÷ÈìšØÁt„ø~°D2£ýÞTÎàcƒ]g@&€¢S œ–‘ÙHd½–³(ÏL€Ðœæ£ŸtÝðdÚŽÝ»·CâÅv1·…÷Q³Ð4oRJñÛ%¼ìˆ¯ÉN‰2X„tƒ0‰1vQLOÔgSr1²ùÉ|ß½@WcF-;“QåÐb}rR „éÓÒò" äÙýwß½Ÿ~2îºuõ–-«o½«åð õëoþGýû‰Çö<üÍÙ³ß<Œ÷xòÉ?ù$Y¹iïÞM›÷î}ÍùæþßòÉï÷¿éŒybÓSo½õÔ¦'(oãRA)RËí'ÖK¯Ó/—_ È5i6‰É‚Á'Z"Ý“¥›bçÙ–à1 ° º+“€¸’À' ñ î„Ä„¤k­Àn}>†í¿› Þ»>œ˜y¤õêeìürËê õƒyG–´ïh=}B=±}ÏžíÛ÷ìåœ;¾ø›Õê#ê*µ2>þ Nå“Þ:}ú·¯½ðê» ‹ñ{Üb®ø¥<Í!âB….:óF¶„}1‡TÄuî g¡¹ ËNTék·^™‡â u]8ÕÊ¢MvDѨ‘˜3çÙª"ݪdy¨2ýTvô<ºøw­Œ”ÞiNztõP%þrR'wbõ•YéŽß©O¡ÈŠ=dúq(èõ¸lcx½~Åÿþz=[üÁ öæ²`Ï–üØ‘—£Vìw°C:ˆ+A|øÑÜï]nV8y¿Ín3í7šìp›&›4¡”dš–Ztï‡ÐíA$¢iÙöh3 4¢ÌnÒ ^ër€|Ùg• DÛgÖÅDÛYê¢`°ð’Å ^õƒpî.aðòßu˜šXJ j\c…bá ×?ñHg²£S*kšJL7¡›4‹L í ¨AÓhj´÷šzíëÑ“M‡%N"’Q”…hÁ%Ƹ°‹s‘h}´Áe´ËÑÑÑ.{Ì_=œ‡¤êS cŒé¦4pÚiæŒè WzL>7Ë'ÓI1*Á³MEòì˜Åx·ˆ,aBãM¦ùòÇ‚è®1M¸‰k"Ë5úFC£q¹É/7ĬB·â[¹[É­b¯±ÇÔ%w)]æ.Û*ûJGwt·«;fÚ¬ÙªßjØlÜlÚ(o´m°oˆÞàÚ³„: kØç3Їnါþh¾›ú .Ý¢Ú7~þÅ]jË6œª¾p'~-·ç67«=êDÈߦ©§á{>Nhøˆú"· ¤Úˆb½F‰+L"Ò™ gR.€2)ƒôì N£+í"[ä¶ý÷7ßü÷6< ¾ØŠÏâzìÃg[ëšÔµêOÔƒêZ&i;aä5lä¯AAÖ “Þ "cqÈ9Øš7®4¦ç9èmç7>pñ›oÔëšðíøfЉۛêZÕtuŸú šÚõä?‡Q£ñZïBç~IëØowHZy¿"k%­i¿$i­6ÎbŸ¦(²<Í$SIuÈZÂ%ûúÄQ6…F€û, DcЉf‡ÆbFÈãÔ¤ ’íRØr=ø=ðmÎüð ½óTtÏ+£7´7œzÂ?üÊôЈ÷­$K­Ó¡uÉ.Gš6CÎpL’óùÎbyö&y¹v¹¼ÜÑèìÑnrì–i£xI §`Œ¢ ™DYkÕÛ4‹dÕYõôdŤ˜ìrŒ-ÊîtŒ‘ÆèÆèÓLòxH9ÇZÆÙ<ö GVÌÃãS¾’gÍ·O)’ffg™ ­‹¤…º…ú›äæH6J †&”Ë•Zs­¥Îê·58jbVI«t«ô}Ê*ó*ËJkŸ}‹u‹m³}³cGÌny·òŒô¬îYýqG5ˆcFxCÛŒG‹%Ö@ì2ghðГýžº|LÀ»îº¸W=½ó5Lƒzü HãC¿9|z£J÷²+Á™Ÿ«dDMÞ$iDïÜ4`g™^â¹>qŸÔ‡$NGÆ ºñƒ€¨ÑUÇϺ ª`æ¯>ª6²³ebÖ¶O¸‰:–fg¡W%÷ÀÐ6‘†¡nFóÒp'/¼ÿEõ_©£Ù‡ ÷æë$N Ó¨ãh‚Û4­†çN¤kedÐR›¨#ûÉ‘±ÈÓÈXÏDƃÿ22Öꨋ‡&]ãÖTiê5+5­V+Åð1‚]²ëÀÐñc…±¤¦I([)F³³Áì-4-G¦•üJ¡G\¥eì4Æ»¯Ìð%µ÷Š¡—eñ,+œYN_lDÙ^—^ÒP,­ÃA$¦hu²œ/Ý5…BæÙ.\€˜X1jç3ä_¹Ù'¸Ã̯6k¾¤n¡ñÎ;—?Á‘^»%xeR+Ùke©&Ê""ŠRhäMé]±ùcU~§lÒ¤²ÒüüÒ²Iù¥¥ù“ÊØ†Ð¤²2n \3]ž¢æã£l§+¼IñŠÓ@$§#f‡U2ô™öYLˆï@DtLÓCvÕ61Ki\õî+Êoh ÞÚ]ãnwòÖ Lºà KW§³3ŠCK¯Ø c›t£Ï#å½I·Ä ²³fŽ?‚^z¬øÎiË4ó+—Ü4¼3¦ö5»âàs‰‰ï×,^};;µƒ?äWq”é)Geý&EÑ”Gƒðn=m÷9ŒÙéó1Œê O8àºøF6äÝfܸ_xgènpáwäkB³$zö%Ëeâ¼Y°˜ ’‹ ,&‹rfpþ…l¡rqê9`±(ÚíÉ&L"Ò_Zøwë&õ¥²ÂÓxÍ&á€÷ðíÓŸøjI½ùÏ% 5ŽGj+@'?6`€.‹ƒç³1ІÚZQx`¤å`ëSÐ-ÞìhÙ®%—b× îÄ8©S:±½Óº"Q'Hªâ@VÎnƒÇ. ©L€À„Ó?š½XBšÇbÄ|zVŽU²[¶`g;©Ã‡‹¨ˆåÚY|:«C7Xyç´<Ú²ý†¶·<úi³¶-ðÝñ£ºÛ> ìús»»]»1÷á½ ·©?´)>iÃêÇÛ^Åo–Á-'ðÚ»>ZÜ|Lg4êL–;Í+øX<ìH*¼vÙìéz~ sÈ Á ?‚Bnš D Á=ŒHr2FE[ç×ÝyGýü­EÓÿñ³–íÓ¦moùÙ?¦zÓvœðà†¤øMá„í75Þû¡ª2ŒTõÃ]TWw’÷IGø„T®×ŤĬ5òuLJ@-’žØ9Ó"숤X#GwS#…åE§ñm›±·” ÊF~ÜôÇï¸áÿµ¤búcL`¨Õý,Ðb˜Õ†³¼…F§÷)fEy¼nŠ^Gs\-'±4W‡!'|Ð(ÖYÀFÌz« rÉ®áÉšb6 (…³+gÎ ž0[Bd£ÿ¿½ø—Y¦kÉG‘ƒ)>;Rag+ˆvd¯ Ž^í Û™i°Ó–¡0Õ§ÑMÐê–ÅæÝ*Ò£Ój$­žˆÑ¥qiƒb««ÍrLÖLÖN”&é¦ëó Ó ùÆéÆé¦éòt¥H*Ñ/é—–V!° k+5+µ«ôt­h‡#ƒ{¶‰1ÚÞÓ#wžTs·rãŽànÜýs|t›:ýdÍ}vÿ w3|{†ÎеýšËŸˆu@÷hÔæM5ˆÑV$­w˜¨öîâŸÅqõ#x1ι—?ñí ÊñoŸäŸý6Ÿ¿™î¿_®VpïQ.£VoŒV–0ÝX°¥ ¾ÎrÝL0¤˜Ì:­&vŒE9ÏNhª¯„Ÿé®¥ÊG³CznªŽ,ç]Íñãá@‡9÷Ç;ÈÂ…=·|Á­8ñʳïUøúÚÝò››/üŸ’¨o>‹nÞç!bE‡kD.ŠGN =$ú¹µ™yØŽóðY»¤ò&2xXÍ:¤fƽì<õvžÚ’Q•w\²Æê$ȽK‡úlî#®]ÊV] ¹Ã¶/…÷8­bºó ¼8—ql ;˜™:™ù=g&‹ ßfºè/GþÙaéo…æfüé?9&>ŸùÄñh¶7É`–ŒAYj³¡µq>Òæ Øjg2˜ãÒÑäLM çTÎ DVº"??€xÌíÎvÏcñX&Nvsì§&šé!h‘OýdŽÞ’ÿøŠªªXTWüf©ú9>·^}ó õˆÀ{ñ¢uØüï|î—êSj¿ú+õȤIøöæ¡·ËÊðÏð2\‡:eªúõ„ô·*Ÿ@Ôª‰Kò*ô×*–Zo—,XˆÙ ²ˆ3ú7+££ÁðïW¦Óà•~"?dáõ“ÊÊ'Býõ)nÞ'±_"ÆyM\;x­€©œhÙaÊá#BðG/&(ôC:ðÍvúG=ÎNÿ8Pòzceg²ØâÚ¤€ Õ$[dä¶Y]&ƒÛDR“Ù9 N„ÖD.øôó±e)Á”)@^H9|HAB<ž‚í™8}ÔA!R£>ª6 RϨßLøqk£ÿé ŸŠÃ?ŵ#§€ÔW['Ïô>£½ïWŸè·\þ„|ÎÖv“ÐT¯Û B”=Ñï·Ë©&YD(Æe±cä´$b—Ìs œ8fpP_ÎNEzB–óô6èì„áCV¸±,t¢¬ìæ“ÕÄøÃV?ùË{nëØi¯œ1ê³2ß=öìù\ûõ¾Íݹšîƒs¥ä#€ÒŒJ¼ã£^'ixp :ƒ–fƒ)`ÑŠ&ƒN4f’BC ¯—Œ”¦ä|g84U.ÂósX4©Öd«žš:Q ¹$•|¤öâ¥êAã&£z°oT{KñÍð€oæß9öÌʳêxÍÙ•¿:Þs¯Qï<9çÍN}ŒñÎR|fE‚@YÏé|²"Û¡EVìv[™]‘6éè)XƒPç0ã éŒzæD‹SL±kÍ|äÈŽs9–üÈb^N8pºrEdÄ÷‡kg>ÑH)EJW&HER±ý&i‘²ÈÞ¨ô)}v£N§£{ìFÑ$Ê¢"š£tv£Ýd—f‡ÅaµÛÆêè:\øªtyŒ2YG—7讹W_dðŠŒ^c‘Ékš!{Í^‹×êµy]Uº…ú…†ùÆù¦ y¡²ÐÐ ~ðK r¹ÆRc­±õê×ê{ kÃ;â½J¯yæÈÞ$ˆÆ¨5 <|\—»óüÕχÖroV:45|b÷u.¾ßÊmâ^ú)Ÿn†¸u:Ëœ[½É’BW3”ÈjÆ:’h¶š¡$šÈ‚!´œ‚;ùIÏ×ß]Ï8*Ë”Œ.æ´œÈQ€ÀB=äÊF$Ï“u üÑ 7“GWóûo!¥}Å‚å#¼¸øÒº˜ÙoÒÑ©´·×-“§þ%hÙïãŸ=:w[ä·ò3Çis!k *üß`¨¦Uý“ú«~b_É¿‰8HïÅ&´‚5ð«Qƒf7š#$ )äm¸;ÑãðžÞ·Àg#|6 uÐöeÔmàùwèçDû„Ñ nšBëÅÔ)¤£9d"š"^B+„ÈF2 ßï O:šíæÀ¸/B¿#âh óq_Ã<Û M êÔ^í^½|Q<‹…Õèq B>~ýåKPwúLE“ÂâD·sO¡ÅÂ{ð óñw¢h’€ÏNþ,šÂOi¿ €í(z‡[}y ým>—‹^ãèw´,81ûÀóN¡øò—â T£ÍG:’w¹Z| eøøP'ôŸCŸ)¼ü´ú& ·T‚Àê%¡ôÖáGð%®…{Žû€\OºÉ9þ:þq!Qèöߊ Ä»ÄO5yš½šÿÒÎÑþD{F²J+¥ÒuºgôÑú5úÓ†fc¼ñ>ÓÃr—ü¦²Vù̼Øüï–i–Ç,§¬&ë [¯ííwöçÇÇ1Ç8ç9ë½Î£ÎW£ÆFmz5úÎèÏ\gc®‹©Žy:Ö[»<ö•¸è¸†øäø®°T¢ëÀO!&Uôœ9—× ·Ð_A›†ådò°ÌÐsí“ÃeˆPy¸ !6ª —y(/—ôÕᲈ¢ÐÆpYƒ²ÑþpY‹Lè­pYm> —’ýBÃKðÔ¥Ó†ËÑÝ.sH§;.¨?.óP~7\P”N —E”­w„ËT£/ —µ(V(\Ö§Ãe£%Mzf°½·#°¼±Ë=¦>Óë®ëuÏtuvuøk[=î’¶úLwAK‹»’¶êtWú;ý+ý¾Ìá6îþŽZw•¿#ÐPl­m»Ö‹k6ö·øk;ýîë2¯Ë~O_³·ã¯5V Ó]ëîê¨õù[k;šÝÁ†«!iOŸ»ºÚ'geõôôdÖE^dÖ[ÒFݵ°6êþ¯‚dÔuþŽÖ@gg ØFÛ7ú;ü0ßòŽÚ¶.¿ÏãnèðûiÇúÆÚŽå~»+è®mëu·û;:¡C°®«6Ðh[óÔà´eW£ßÝlÀjëŸvhNt5Âè-zuLRm‘”ƒùܵÁú@-Ìçöë»[ým]µ]ž†@‹¿Ó=†ŽÈ:¸«‚ ]=µþ¤ I‡¿½#èë®÷³a|@-P×Ýåg0\ÑÁã´Õ·tû($=®Æ`wÓODÛw„¨ ÃvwB{ŠŽÇÝêgX·w×µ:=£æðÐ9³‚îN?°ZÔ0úWMMƒaÛ)¡»Â¤cõ4[¿Û²¡¡»£ &ô³Ž¾ »3èqwv×5ùë»hMˆÆ--ÁŠP}°Í xtN¦ ­†—µuÁ•~†CH–ÂÐìFt†j)_ÚGd ôÎÝÙX hÕùÃt@mîÚ+0 ¶dt¸[ƒþk"îîêm÷7ÔÂD™°®|ßZÛKgh ú *lµ-] ~P€ak}>†}ˆ|0y{m@ÖÝRÛÁ¦òù;ËÛ Ë[zÛ;i'*¥µõ0H'í¨óê™BRç ­¶åÚ„ûDà Àkkéu®u@§ÃOÿ³C¬--tRRRÞDTÄrçßìðuº“†µ1‰ÎyáN¢Ê›&p§4¬5u~Ð':n7ð¢°2Í¿ª ôÆ]ÛÞJV[×â§/BØÃØW1¦±¶ËÝXÛ #úÛ®¤ L7"ã>ww›/ rÒ•¶%)„ã÷s¶3ØBµ›±Ž2ªÖÝB­èL¤a{m}sír@ ô±-8lC~¸h]1.ÒßÒ«¸Ð]4¯¼Ú]5¯¨ú¦‚ÊBwI•»¢rÞ‚’Y…³ÜIUðœäqßTR]ÈjQ+ò@m jƒö™P*€,¡î•Ãcu²'?ÜýÐg%|û åwÇq£¬E-”ªX)€ gÞÕÂø?´ÇÙÒ27d ™ðɾFÿHã0\†?-u±¼¡ý:P3Ôa¬EÓky÷ÿ猾ÿPÞѶÿ§±¦sÐO³•Ø ßAx¿‘½ó‡ñ[Îfjƒñ(”t¬öÖ?´¦fñ³^ôM„> Pja|£#G`™ê…¿ õ0ŠøÙŒ#4¡5íð„Yºœ#Ðø]Læêàm{™ãŸÏàa|£Üm^¾ašô09h„Öݬ¥L+«QdüŽ+d3m7£¡gwh¹•ñ3ÂëvhUÇÆî„Þž‚‡gÏ,©ž:™•h;¦ê•Üÿ~¬#” AÛ>,Ñ]WIÝF=Œ­?h†ˆ64LZ;YŸ‘}ì›ÎáawJ‰&hQÏÆ µ-Çß ãKˆCõlnƒ8†tò°†V‡{Ö¨Af#Fø0Ú.Pỡ Úw…5¢óж}¡Úh;0ºŸ›á]æV]˜2#ò¢H€õ«ýžÒ‘C6£ƒIQ0LåÊqÚ¦—ÁÛÀ,;ó;Ôú¾þ”.½Ã8´2- 0ŽX6 WØú…jBÐRºúFñ~´ô…0og³„hÖ £Ô²~¬| Zʳ¶QYí(FẎQ¶´–IQH†#s\M£Î‰Óh[ç»BÒjŸ~8WÎs5=®›'ÌóÖ/ð=V½#lü ®Ö+ÆÔtKeDo®ö"þ°½ó_Aù†•õOº†oLÆûê´}Äó&]%i!Ý)½Ê×Ô1ÝŽ‚·;¬.¬„·kPÍV1Z·…5º®'«eÖÕ?Üc4ïCp¿Æ42kïf÷Î0Œ~&Mÿ\VBØ]ˎӷݬՕT¾eÝ£¨7šÿwt¶“YшïѺˆFÑH¢e8é÷¸rÄv&ÙÍð½<̵lcô½:ù?aµþ9Vua]é ûdž+¨UŒ Ù\óP9<ѹæÁS5º "ÌJö®êÜÛU›ð4 jg1þ°7ô}ÓÌ› LGœ‡æ³±BcTÂ7{ÔбÝì™>Í…öå0í[ˆ²9 a´*Ö²’]µ¥p/ ·£=fBÍ|x¦åÙˆF§¡ùÊ¡W5Ó!Ú‚´êGf½ª6c²2xª„ñ‹Ão `ì6…ßÃ(EËåÃp…!-`4¢#Ó1gD¥ì‰Ö·{´«bô,`8‡ -g8Áû.… ‚'BÍ„{ÌM[̸ªt¦êpKÃâ3‹õ§³Îeµ!Èæ…¹LË#£d†i‚ƒÒÁðÌU ÿR¸Ü ÿj¨©f¼)€ñ#ãFdg6¡lXŽæ3ü æ±f°w”Š”ž¥Ã-+Gqe&£å…|›©€Q¤êš˜DF»’;×’ŽÈ ³~…ŒR¥¬uбÚ— ׄ䱄á:3LÛИ!¹ÉDé(êÎd8RÎÞ³†eª€ÑîJ,BBáÁ"Ä‚ð÷ÌQ4á~y˜»3‡y=IÙw©rÓÅBÖª€ñºj˜ ELËÂÏ%a>ÎËç¼aÈ®¤oD"í~ˆí™ûJÎbòT†°j˜ÿzÜûU>®žå?]ÃöûJO>:’‰PGÇ¢žQ6wtd²Æ³YÛÖ«ÚÔ†ìtÈä@£c¹ï[Åø#‘p$ ÙðP®4:ö±˜=vG)!?ŽTzØÛÿÊ[Y‹Ñù_'›7„Yw¸ÇÕc…âÌZ9ÐÙ:¯AÍïóTWgŒíÌ÷‡féaå®p”Bñë·¥õ}WeÉWeYÿŠ\þý;¿ÛÃ9V€Q˜Æ—™áq;P$_¡ ¥@{×z×G¤Ž6]—R,¹/Ìñ ‹/2Ù>vèÅ8´þZÿ/‚ãÜ:ïŸ^UÉ+Vòò@Šð²¼ìåRÈKFrúÅtá´¼˜NN-%'×çõä9=yö›ðlyÆFŽç_©ä˜JžVÉ/UrT%OöÏž¼Dúg“'Trd ù…J7‘Ç„Çlä°<šC~î#?‹'sÈOñ ?QÉ#>òðn“ðp*9°J'H%ûç’‡ò`&Ù·)^ا’? ?Ž#(äþ½&áþT²Úí5‘½^~tÜc#{Öñ»Md·—¿/•ìúQ¶°K%÷ÞcîM%÷ì4 ÷XÉ=DZ×+ñ;ïÖ ;dçqŒ¼%üÝ:r÷)~Gp°ã9²ýv½°ÝL¶{ùmPÚ6™lÝòœ°U%[îZ*lyŽlYÇßµ9U¸k)¹ËËo¸6§’Mͦx²éøåSÞËüF3YS¯÷‘e“;äŽÝäv=Yçó ëT²¶EÖF“ÛÖ˜„Ûrȹuµ,Üj%«eÒ·›ôšÉ*éYéz.‘•ݱÂJ7éŽ%]Щ+žtª¤C%+Ú •´I»—®!m­Ó„¶fÒ:´4„…´¬ã› ¤ÙË7Á”M—H ñ9! ’ÆåK…ÆçHã:~yCª°|)YîåR‰ù/ŸÔÛIJjUR³,S¨QɲLr‹J–ªäæ¹dɲX%‹f‘…*¹I% ž#óURå#•6rc©˜' kÈ<™”xgR=™ã#%IZ¡d7)Î!³‰"̶’" )ätBa4™5Ó*Ìj&3g(ÂL+™Q f(¤À+ z╈—Ò±ŠŸ¾›LãÇ ÓÊÈ Sm sÉÔ):aªLõòStdr¾E˜¼”äO2 ù2ÉL&É•ä]oòTr}®U¸ÞFrstB®•ä\' 9:’âÏuÉΊ²g‘¬L»E²Nñ™ñ:!ÓN2×ñã%Ÿ0~7ñŒ³ ž¹d 1ÎFÆyù±úXÉ“-d1ؘl’·t•¤M&©Æ(!u)II¶)U$º%[H²—OÒ’Dw”¸”¸Ì‚;ЏOñ 0Y‚™$¬ããu$ÞËÇ%“X™Ä¤Wt¶àª"Ñ0jt6‰R‰&uªÄ¡»Í&Ø›‰Íjl6bóòV+±@;ËsÄ ä5«D›2ƒÈ¿¼›˜àI%FÀEŒ^Þ =<轓š‰ÚèÖÉG´³ µ™ˆBŽ ®!ôrƒñã Êé®"H%ø8ö­ß†Çýöý¿ À÷þÅ!ô¿Á•Ûä endstream endobj 128 0 obj 16590 endobj 129 0 obj <> endobj 130 0 obj <> stream xœ]”ËŽÚ@E÷þ /'‹‘Ý/š‘ƒÄ"…É»a, ¶eÌ‚¿oÝJ"e:nWUŸ.ww±=ì];?ƾ>¦)?·]3¦[딟ҥí2có¦­'}’ÿúZ Y1ç·)]ݹ_­²âçüî6üiÓô§ô%+¾MÛî’?ýÚççã}>Ó5uS^fëuÞ¤ó\çk5|«®©¬çC3¿n§Çóœò/àý1¤Üʳ¡JÝ7é6Tu«î’²UY®óÕ~¿ÎR×ü÷n©)§sýQs¨™CËÒ–ë™­°÷`'¼`Ovà@Þd ŽÂQx)ì"ø…õ·à Ç%æ•,ónÉ ðN8Èøë𞌚¦d<ÆúïÁôwð4ô÷˜Ë¨?Œúc†þ^âé¿xÓ?J ýýLÿ ãô÷/`ú/Äþ}3ê/1ô·¨oÕ1–þ¹–þk·ÚôÄÒß Ó?ÂÙª?¾…¥¿GO¬ú£W–þAâéïÅþn–þAêÓßa–þ=´ôwèƒSä:í?œî¬Ë©¿ÄÓ? Óß ÓßJíÿ+Xý7`úG¸9õÇwtº$Fû/ [¬×ÑߢnÏqäzúôÜÓ?b^¯ýÇZ¼c¼0ý<=ýÖèéPßkÿáàuÿ£Ï^ýñ]¼úK¼ú˼ºÿe.ÝÿO'žºP?Ðß#7Ð?lä°ë©Æ±Ç½ôç:Éëû8ÎW‰\^r‡àöh»ô÷~úYòû Þ)† endstream endobj 131 0 obj <> endobj 132 0 obj <> stream xœÕüyXGþŽWUßÝsôÜ3 8Ã€Š Šˆ$$´ xEÅ1ހЀQAÔ(£$’¨ñÌB£954Éjîc7Ñ»ÙÄÏ®n>æØÝ°º‰Ñlâ ßwõ ¨{|žßóûãû<_†êªêªî®ã]¯÷ë]UÝ‹–T!jB Òfͯ¬OþåÛB¿E[gݽØÿäè¿\„ðy„Ø™sê«ç_{+ý „øBˆ—WÏkœ#=>÷ÏÉO"4<¥¦ªröŽ·WHî1¨N<]) 4¢(µfþâe·¤Íû â©pÏÁóêfU ç>ÐÄéþ«ù•ËêÉ“ˆ_ƒ¸Aåüªõ{݊ФDxÞÂúºE‹ç ÚN„¦¶Ðôú†ªúGÆ|Yñ0BÒX8‡áGÿ äiœ0,Ç ¢$+£É¬Z¬6»Ãér{¼‰I=|þä”@j0-½g¯Þ}úöËÌê? {`ΠÜÁy·ÜšÛíÚ¡Ã ‹Š‡9jôcÐÿÿ¸È.ÛòßJгÑhÊDÏ£h:ºmEkPjÅŸ¡y ŸàZ´í@p"²Cú6t óE”ƒ!§ˆ´íAÃÐx8ÿ$\ùÜpŠv~ >\Ó¹íè¬ïÜ yt~ˆÑdtº—\FäA ¨Ý¹[±™Iè wžDhœÙ‰Žw>ÙÙw°Ág¡ãèÆÅ¤1ï"‚ŠÑ¨-€Ú<Ïz½„^íüâÊ^޶âQ„#¯wþ×J( ü“ÐP’#è:…×ãVÒ›9ܹJnD&¸?ÔÍAëÐãèsìÆ÷à-øü¾H‚ä×ìXh¹T4M„vX€ÐZ¨ßv´ íCatFÐWè\‚ßÂﲫ:oëÛ9JBïÚõ…ër¡¶ÕhÚŒ…>‰ÎcŒSp&žŽçágñóø,#0N¦‰¹ŸÙÎ|ɺÙHô‡Nogk燀ÑDlðsAzBËd¢,¸ã`T€†£Ñ0°§B_Ì€²Ï…Ò-‚¾X m×5¹=ˆZ UE­Ð‹mP³' èï8üN —Ñ[èSô?èÔ‰ElŨw>.ÆSà77à»q#¾oÀ@[ìÄÏácð{ ŸÆg¡eb%r;y‹ü™ü/£2L>3ùkeDz{Ùß ÷F'FŸŒ¾×¹JO[ØŠ¼(Ý¢—wš¢—y´I ”yZrÖŒ6 ÐF›Ð(ócPÖ'Ð èEø½‰>@_@ ÿ E ÕÒáׂ_”u ‹'áÉPÞ» -×ã]x?ôÛ§øsü7|~¿L$â%=ˆøI2”‘Ñd ™Ffz²ˆÜK¶“¤\$—ÉŒ™q3)L?Fc†Ã¯’¹‹Y¿×X•u°³Ù*vfÏ!®›À•q¹K¼Ìx ?ŸÈoá¿ mPú›þÈ\|ïA—¡­ÿ†^'¯‚|öMC³Ñ:Q¦ÍÇÛð’èf¦“é$ÇÐLŒ ÂNE}™íø+h…‰L"#pa*¹K$ó0ÛÙßájòV„ö8…ï@HËœ;0{@ÿ¬Ì~}ûdôîÕ3=-˜HIöûz$%zEâ 8­"̦FŒèKãJ8QyÃ‰Š°Nßœ'ì¯Ð³ùoΩAÎ9ÿ’S‹åÔºsbÕŸòûöñüá þv£'LM†RŠî÷ÓjL˜ª×nŠÝ™PHzŽV3Váª@=S1×–C5›æV@g%l £ ɇFiÇ;Ï£QEþM“¦’ÃÞ@Yeaâ!;Ú4¡ñÈHÍ?ò放}©–XK2™ãƒñÆ@UwšÒ³Ó”º«©1-Q`$ˆHØ?Ë%™“à`z¨Œ6Í Ù௠C‹ÖBûUlRo¡ÁÕ€Ó!ÐñÝÍg*ãgø ú#¢A*.Ý"é]ápFF¸wo*)Â0èZ(Ùíz<§oŸ»Ã£õª?<š •L…‹ÊnÉ„&ON¦½¼¹]C3!n?5÷£™ÞÃHËÌ( “ šrª+Å1™¦4u¥t_^q~Q'Kް˜ÖýoV¶¢š[ÂØù$WÅÒaøù±\pSÉÔ´ÊM›½i›î/ƒ®)†¡¸iSqÀ_¼©bSe{gÓÌ€_ l:4zô¦ú¢Š®*µwžÚì k÷—Õ`hÔpv¬5¶aS/)‹…ˆ—)ë ˜…ð!.ИCÛŽÓ#^x§C"Æße$ó\;îyŒaÈ(I`i£‘âÔÕêåü1‘ü±ê•ü1j$äÃ1Bý³²-É–`²%¹^}÷ŒþC¿ ¶>õ–Îo™{;h?/zD´:i¿ú’Ê42™] Ó_t ;¶o5™Í¬§TÐC*(ÖËÖRV±;Ìh9^äXŽLØÔN<‡ÍË…ãИ‰ê•ŽH¨ãr‡Åš‡ x¡ Ãš—™YÖ¨¥:½œÅ•fáÌ“‘[qLÆ ’}2Ryëdä4x&c¯‡ŒŒ ê2Ö¬A!Â.ž¤‹jÍ`µÉNgöœœ–žHáÉ©iïl=þÕ7‡žþGî–¶Í}*:-÷¾`ÖýxŠë™ç±K؆“£¢?d9†#› gí£,z4uÔ܉k)N1M$2^·2Nk3/ÌŒF'’â” !“±ÏÓdD9CX…« r©WBù‘ Ðò‘|½ºùùj~A~A‡%¯9©QSmv–³³ÖZÎÆ9jË`5?éõʶd; ÊЃ8,ËÀ4Z‡eÞú¬ÍÓŠ—ŽLÝÖsò๫شSKsËÜYDî[2ïÖ_мBËžÜù=~ÛŒ¥E³ú=YÍSâ©÷4yZ×"Öd§Ùª ¢-ÂíøyÍa´,Gªª®V™-j›J̪O%j;.ÑœFi¹f–}r½Ì4Ée‚dU&2MÊPÆKF5c ”§Íx¢B–­76Ïy‰æ!y´$‡Üþ™šÑ°0t\‚»Ã£Ò€î»/ÐÞ‡¾|­^(Ð[¹ £™ë—aZ©¾ ¾;C¤Q}S|õƒÁа/ - ÙÒAåÊÅÙ6§kP®-›H ¥FíȼÍ.dG¶KIòNl‹2º<¿w´úi5­§éq¶gd×¢µ÷ÜMîúåݸú©ór'bvÎ9é¡™0úš0x‡F²M÷P4¼ ~2)"öÏ’ÉæåkE»çÄÇ=)‚qoAOjæi™DR4^a°"}'žÀë‘-.é`At Mªψ¤@Ä"mþ …!€²P ªJF§ÐXTÁÄêø`U¯@ƒÅPX½¼0t!&ƒ Žq„pÌ,g2Í„7³J-gàÔë8Ñ{Íšnœp !#²'çŒ3 w`æX5‘M{¬~ä-ûÓ‡ÞZ½8ò)ŒŸ@ô*¨ŸèP£ÙV{p®è(es©¤X«y ׆jDáÚƒkÄ:>÷Æ.U´NÆ&Ù0rMÆN!‹xmTà@6»°CGé8Lã-Î*t&±Ùi'ç ¤åÍùæÐ ýúðÁ¿ìx¤®fû#uµÛˆ ÐØý6úSôËè·€ÎÖßûÍo?xï}:ö ™/0µÍe°Z·hÎtk®u¸µÔZm嬊E@¼Ñ0[SÚ±¢I–& Oðl ÑXY-õ&¯gš\nj¼tfŒB6˜KŠ¡Æ8Ò9m®*A.T@³+!Ý«U~zsü£‚k p:?A¥>ô”ÞYx!vrÊe$®ñŸ[ ‡{÷cýjX!õÙg?Ú÷À†´áŽ©wÆ¥ÓAêúEljû¬Ë'µ •T›èM ˆ©Å[S‡Š£R§HÓR«¤¹©&§ÍËÈðÃ(ä,>ð´‘~›ÓÙ3Ã`  ~0¾ •"0î]ݬ´å!‰žm6ÅÀ“6~(DTnF´™Aܲ8:O€^ ?èJÐ&ÿjÖƒæ-:ùLKÉ×oÜ÷^»Ë°u}óƒ;¢0ûøš+l¨‡Î!²a?%Qø82RfÑ S‹Ëjœ7æÇt mP*1]J…Ó4I²åº±àO£ý_ÿ®8'gì_ŽGýd>3&Z¼vÉ¢|ðÚ‘ÈVxLo`zÿ uÐm ’p–T'ÕKmË‘20Ò$rïóä} £Y¨@H ‚õóèâý( ÕéøÎQl'|’‡$Ò¤:T›^ƒ j ãã$8w( >]Ì6pÆçŸÿù(Ñzh]J¤ ¹Z:Ï• Å“ <"bØ2‚‰,•)HøÝ yBÖ” å’ÂìÓˆ•*0-1*Ž ½F†n]…á ?DKA1ÆzÀ €²ÄÜz¦*r Ù©&_r'ž<5>wZ åú ÊeÆ÷k¿VYŸ’d*aË•rS Ûª´šÎ°g¡ŸYƒ"›>eÏ)çL ³|ŒeFGš>U>5œ5ž5ñˆÈc,$Ù|¡Rd¦(S -VÄ#¨–4Ò“é)¤+ƒÈ`¡˜ŒJc•RcZFîV–™8Æ †c¥ÜRKê,[,­–“–ÓÃ:²Q¸Où”ùw–ç·1{ùmJ‹¡Õ¸ÇÄ{»B/ñ𦠓”2“ØÞ9JÓX£Áo2²ÄβD1²„“Â2f³Ñh0È"1š+JŠ*—Ë[äVàN܃üÎÒÌ*[Îna[Ùƒ,·Ø%=—l2ǺøÑIt:‚uJºD@Jb}¢ê}B߃þóÝ´;€8Q×IS—ˆ³]¼‰2@xè•¡ÐÂ…Fp좤 ,À–•qRž#û¿+úø–è“܉_¾ÿ|ünæÚÏÅìo~ÉaÏÿâ§rQÒù »°Ô‹Îh…ž„‚¤d„i”e´wªéNË˲۲+a¯÷YòtÂó^5ô4õ±½¹d°)ß’ã}Ö"eˆæNõÖwR£§¿¦=+XI=h~Ôp Øýõ¸ ·áSX(À €œHO·ft6žq–XÀȈ iƒðAÝ»ð‚ÎÒ*{¢t¦Bm6í7½d:£ ‚Ÿ™ZRË4’F†åEQà$€6ÉÀJN4ð¼h0"$–‹¿;vT^wïXy‹×Õ›;ñs1~%ZH¦áG^^òÀf*Ùmp(ÐmÄ;µB?WÏ5q-\wŠ;Ãç.q’ÊizWAÓ=R)„SDçÔ8cg)[娏&¦cUp]ËÐÎik¥Ï§Ï|0ú'¬¡€›?$ð”v›PYàßkk)!L >E1¹ ázÔ7©,Y¯óM Í:çLÐ fBGÂ5à”Ù`ƒÚy!}РÜЇõêÛ|ðÁÒæÔ1îò” Û@oMÔÙ°ýJ“d–7Ö`f˜§yº5°Œ`ì áXNFX$ˆ/C§qHÆG ˆÝ{JË–|çm¬£É‡€î¡rÐi«ÑÔŠ"ÉŒèÉrˆœD§AA‹™b-Ú ˆ"4ËeèXKL5ëÒ ‘x?S9¦šgëÖ>cÁ$1r•—=ñĶè\¾9vmÔ¾èc„%Û#wAK £..¬HLÐ+9‚½¤`0O)ˤÉÁZ©*hr¹Ð<Œ~Ê…“-&Ê… 68Û+Ùü7½!áí^Àñaöm›Ûz؈L[L§LgLçM—@™T“ßTaª7qM:… ëi¼é8î…úÀÕ©0˜gÿ'ÆxúãÊÉTàŹii9ë§(sõ å» OÌ3ZÆÌËßL†Éì'HáúãGo­’ÕûÑQë°ãŽY þÜ?ûcZNï>~ß0:7ÖÐè ÙÑFMla™j©±°Æ=¯êvP“<[3( Ѳ_š­Œ,j½Q7†œ` Ù— 5²Yñ)DyXЉ)éˆ[B1±¤óXùco6ƒò" ßé#üëv­Kjsoßá­……©SØC­`õÊdØo?Þ÷à†`qŸ½1ß1­ ê³ ¬Bç”´_ëí÷â<Ñí¡„Çd,ÎhkŒ)‹‹"‹D¬€H‹È$¹´Dä1bã@ëGbü`€qtm«Cnd!5iãüGW.}—œf±ªVÂSøfH´ÓF·b«Ä.VÉT‰ì‚;®jz÷îM [€çйVä “éäPòtèöU¸uwIíî)u<ÚÑž¶Œ¼Ærmó5î„7p"úÕëÿŒî{èùªúígÎuf$ÔÃh&*H½=®9üî,·æ.q×»;Ý|“»ÅÝæf í8Y›lR75KØîp`L¶26«•e´Û‰dèh›ý3'ù ²89g(ÖYÐ %ql“b¸ÆPøiA 0U <Õíêâ©Ý4õrþ€L}0‡º¦Èbs8_©t/Õ±££{âÁá cû‘µkÞ5¾`´³_¯¡yÏ<Ãì¾áÊ•C­ÊE•3ï¿6j9°óF`oG=q‚6QQÙ Wµ§üF}ÛþùËgöoÈ_-ߨ®Œ“3Œþ”[’‹’“õd³q“{;ÙcÜíÞ‘²<ã>JN¸ß5¾“òNÏ/Œß¤üÓà–“ý€#µ\ƒlÚfð'3½äÁr±†[¡vPˆ T¯bµ¤©¼}¹£¥Wu Í|OøãDDý㨴©‘ÐB«ù. Ê™úô]~·Ì…:B /w„t¸è³z¼&Õœ¦zŒ“q‚×”`™Œ3h¯@§@› …¡ CH£ƒ=wPnî@}]…‚:J ¤+Æð‚ d’ í ò䨶)¿cÝ}/NÂé¹ ÕsÜù^ oÜÛË–¸ÛeßÕkÆÄqk´µcÆ>¹yúƒ%¶„Ô~óûh“—¸ŸÝ[½óáK×ÖÞž‹ÿÔ3Qí5ºÿwNظ–ÎúGk™ }V6 }®¥­öá0‚”zƒ¢jdÞR°ÎyG©Q¥nÂjqWËí$Aë…È" ¶„b3±1àëš½„¢…ÚÊ1)î¡/ tPŒÄgc íèŠM¼µœ ‚A : nh-.Å1y$ï丢¬ zbË%±ÞZ.ñ_¦šLv›ÙQËÚMfVãi8d‹OæBÃÒ©Ò´t sÃd鼿ËÇU?Uõ¿» ïÎ0mš9ãÁM³ÊŽÖr¯nšrÇòŒþ#z¶X‹üÂ<ùáïræÝÏ RC@ŠC»yÐsš¿Î»Â¼ÂÃl6oö—ay‡IMAéâXe3´a®RV1-7.BËU»í faì`?ÎÂ-1CNÅšn×µè©çñ%,áíÕMB‹ŽŠ¬¾Ð—@ñ B§nb–ÜuCÎmur’“³OFVº¶çà]“‘M´ÄJ]è¦5½ë³Z´)Èþ‡<ï=ðìÏl>ž°ÅQ3rþ–wMZŠ×»~ý.ö`v`ÇÞyw½öñ篯¨…È`Ó@¯®ÔÒ=|O~0ßlÜaäzhfË».§€ò47³ ¨UgȾéø&ÊŠ¤„T0äºóbøvé±!¥\7¸QúÀX‚Vb®“ÈV‹ Žõ¬ŽoÉ9||å+Ûb§øL‚dö¦Òê‡ûoM.Ë›[x˶½Ó¦Õ=³•<9òdݰÒÑï’¼_¾€Z gŽ ‹€sÊ;Æbº'‰kÇs5jšÁ9†%l í x¢ÀÇ9”,†Áú$u&ðCµæ§HgŽ`ë?FÿNqî^`].u9Q‹èÕ.3Èá¤Ì h—¥Q*„&èÛ‹—%`¡ôмÈièšiÒÙØ5tˆÕVQ¶åº¾¶#[ñ©¦.ÂÕƒ±s< °eK3K–UØÎÀAM«•w¬Š¥ÞkâôŠª»d „õùÎ@ò½ø­¶;jîyÿ§èoqîÖ ÃÊï‰þ–;‘˜öá#oÿyŽÁëï+½§´ÚPÃÀ&cP_ÍKfSðo6{³ †èBe®{|ðŠÏyeé,»Y+dƒXÈŒ×2ˆŸ0ÿ#ŠvÆ+–0å"›ËŒ†#²P 0`V2å‚h‘YB$A$‚Dk\ÁÐi+¥›š/6+ ÓY½Ñ:ôi€¸=•×ÜmH!€':ÝCç°eådÙÎ'"¹¿¬aWÿ\Ì6ýÒDû”ÎTìƒ2;áöŸiÙ…ÊóVÒGT‹Ù\nRì&“"In»ÛUøm7ùü´§‘Ói6›DIJtš÷)u¿æHlÌâKøzP/,âý¼ÆW@ÚñyÍüÎXñ/ÅçKâ5H¾©ßõéÚÌ€@zèi}>+Æ{è ›J…§#&Ù GL\…{0pð îUÐXIœ¤FS|á?ƼuÉè\·-Àô#€.#:\&¯!Žý­sžß7,0|ÐÇï¶…ÊËJÚñ”úÅ…÷6E×q'&œ\õÔ‡‰={MªŽ.ÄýÜ“YÂdZ<¦n5´ßäÎoØO¸O‘ %¢Õšÿ%ËK¶vO»—.&¬`ë Er4!®šÍf¬Ïä'Åð²A8‘ ºœn'á¥4cÐÃ:*±M†ƒÅ`®D^'ŸP‰í¢µ©&8$â„ÊëËf ÿ€6e`­t…%ÙŸž_IÓMË2ºÒŠù]Ûžˆþ½òøÖ'/>{°ã¶ÌWë_ü y/Å[_Œ>Ý=ñÁ—ß~ŒÓ@?ü÷ÃÁW·7lŒ~Jåd°ñ‰Ü)ûn4GsÝ":W2œºR6ÚÖ£Œ ¬ìן›µìí7ž;»cã]U6ΟÝL>Á ñ=»OD«£E×â¼7ºç‡+x&žóý·q2è¶ú“69Mƒrši›+æÈƒLÅÐYEòp(HP Ö·[ƒ'ƒ<  #|ͼ³Ù`ЗqU‹%!Áë ,y0«!«ji±K;®Õ¯'!”¨z[¼ÄKã9@(R¡èä}^ä ’TT ³ Ê0Î aœ¾ÚKƒ1™™H>ØWúÑ1Ë9>FbãÂ*pÝž]ß âtÝ@c ¹›*/X×gӄ髽›'¬lÙš<ª_ù²mã‡W-aÓ¶OœV~g(ôÌË‘tòhCùÀGvÃëæ=ñ‡Èç ¹T?VPfõŽ–Ìjœ{5ë…ª÷M v˜‘·Tìj€Ý&ƼF~ÈBé•ÙZ=ô1 ­`1ºêï›Æ¥,J_΢Ê’g‰¨ÄÄ$›“¥4;gŒe8Øx PIâ *Ρ< £Ç*Áà®ÅFÓMJuºã"À¢œŒûº®hX×µÄ20Öj–øEë¹jäî?ÏÞ?gäÊ^Û"Ol)Ÿ±iSmè¾ûÆŒÇ,½¶|L1ý\L¬¾{êõs¼­”Ï Yó£>¸Ÿ64«ß¸~gú1«ûá»É}ä²%œWK5x5{ïá¢dp¥ö.µ 7ŸZj©=I…….üƒUÙܾÈÝŽ×hyR(!¡ÂÓâ!ª{TñrÔ’\]§®V·¨­êAõ¤zZ=§^T¥‹*6«™jœ=§rj´ol.ƒ}(5råB—]Û^'«3ú¤¼IF'š‚‰i‚È‹„·¦ŒÉ“—$A{Û ”bNŒD/;õ±ô¾¾¹ª·Þ]ݳ—ÃÙÓÙ»–ëåH¯ÅN×Í]L“•49µ– **K×­:0!\.glW‡Þ)é`IXõ^ɤS¢7”´È³Ë*9ŒYËFî­¾»æéÚ1«ûo(9Öôô±U›fϾ¿¥zúæ© “'†¦~±¨xÝÎÎg1ZvÇM׿þøQã1Æ÷Ñ©W>x÷7@ãß:P¹VÃ{¢³Ú-“A·YÓ­–²ž=¦ŸL'ééÈ›H5_¤2•ª¾Ñµ;ШÛl~ƒf¨04Ú § ¼¡ôÕœ½“nÐØñ56]çõêÒÚ—C¡Èå}0ß°¶Ö¥ïb*NcÒN;èPri¦´ä áƒi6ѵŠI`\«°ÏX…ÓäÀ*Æ)XAõ¹9ï*œbì± ¥*é«° –YF\ Ò>Š“¤¸&Œ­øâd —1ª°\'ßƒßØØ6gjImãüc­  Ø9·»­jí?pƬÌÂá…‹VDÿʘüâüªÇû§½tßú÷îd&˜³&«íùK›5aé´‰‹rwëb†èë gµæV¶…'#¤©ÒÛÌï™o¥Ÿe~“ ln ³WÚ+³\–q»™ex^dI”9I— <ð"žaÙeœlç8Ê¿!¢`ı¼"ŠœéöhAi°OÀ™–Ì…W‘Ÿ(yË»Èfb5}ŽžRôî5ÎÚg„f€õaqÅ ``Xþu1’ATóE}>ØÔÿj*CpLÕ,8"–ú­xÆÉè¼àhô\ wâÚ+8½;2›ø–GïDúˆ}l ^ …Er»ùíÂÃâCƽ¦­QRE‹Gu[X³-ÓV`k²´¶uÚ„æ/ÐYî,ÿ©ð;ñwÆÏM¢U¥‰R Û"q„%’YƓֲk¥OØO$©Cå{gàˆd2‚ï×f±ÈâGÀ.—ad›@PM¦=’`—$Á()Ê2ƒÑn0©~ÛÃòv–奇XUÅ,‹ Š=Àº‰ÉDɾ,¨ŠA¢Ê5š$ 0^%:çX¦Éþé D2%,µãñš”©â@'º§ bZ«±%,ÃBÖý'1ÆÇñº·)”à‰„Ü€P`&x:B–ìlúoÍÓ5žµ{eèºêƒQbÉËT/ܼBt³"öÖ€ùPC2ζ¹rm±0é 6D¯ìÚ”ÝoÓÎ{û ØÞ½¸ksr˜M‹ì¹p–,ˆìüÍdÎ/_{Ž^; ½v辺îë¾ÐÒVûAñ9M^MH Ь`q”X*Xv–š‹•.xyªªöÒ1³®eu/qRÛ8f._ µéR'¦béû÷9…›Ub‚Ë+¥ Ëص¿ÕmpNF râ¿Î)$õàø\b-—Ä[ka´Ü Âf‡Ø¡³–u˜!UµtÙž@•]sk]ó ŒÝys/oÜš¹täœý³¿ÜqGc’¿`Øl˜u']hüqÄðå?Š~=;n,~dß“S>øíGo~_¿ç>æx‡fu*i á9‹ÙP½«ç 'ˆñĬ%Èëü̦•9Èœd¸f5CÊ!F˜‡ú`\¸T'Òµ¦Âi`óãlL‡jÃŹõ“û_‰Žÿ„}øküùߢ‘èûFýQy·A9Þ×ËQ¨9=¤!¢`AØ&Ö ¨ŒayÓå0Ò©Z›¯¥$¥Wl_ (Pju?ßjMHz6‚ºîý'ÕÏÅà!ÆçŃ0ó·hz4!ú—¨Dùóàh-ÓXÕ1¯k½W÷Àãz€Ù;É A³F{B©,˜x;0'dÂ.#cZ„BfU§N–§NI”"vDò#þÃÔ“7Ñjã$g™Œ¼¬¼”˜Ð=s·G1¸ µœGqÕbƒñf1q8 ã$vÆõ/´ [â´É×Ï7±¦•{/œ _Õo}d_Ëì²M;³9ZKÄÛîÀ=±ñ¯8wâÄÆ<ú7o¼vöwïÐþyš©, •Ù(`ò*~,i?Š8üº¦È‡°A’ ݸ¾ÿ0–Q;.ÐT‚p ¡zÌžA4R9kðJ¤"ñ•Ò+ù]"ÐúcJ/ä ”›Mê¶e?7bùËiìŠü•þŠß¯è²v¦AY¼(ýVK™M“{ÉÄõkA¥X}ÊÊ`Ðã[iáðG±]>íØt”Yé1Љí¸X3;FõÂ'ÐK)kL#{v›E—uÃ(rãföŽ.ú•”jp³¼+ Ú‚©†”*ĺ…*ÜÚX…ý*DÆ`âLJ²ûªp²Ùw£©ÔÝ£ÇÒÒ%9] ¶ã GØ4 3á0–Äë$Ë–K»Éšc½9z÷ÑÍ–”\á×çÎÊLyjTã¤~{ÇoýÝUÿú܆77¶“Ñ÷ßY¾ýÁY37à‰ê·U˜<—ZVƒñ¹¯±´-zŒÆ£‡w¿Ì ~ôÅSm-Ï>G{5À½%ÐDOáçW7º¶ œSô¸8žU¼¦ˆ¹WiFe¥•CÞL âG;^­9Ѩ$Ó óK-Þ6oØËTxë½M^ÆÛNä£ddbwÆB±¦½_ªëˆ\ à©·¬Éf—dÙ&VaÉ®@›á8× :’Ó¬1ºC+›¤vØ ÝœÈŒ¹ö³þÐ馵Õëvª§ŸnuÛéucÜÏ?_‹ÙCþ¹²þÚ>ùÝO¿º?Úùûæ™ýAòAb¦Ä%æ´æ«e™û™½ HŒ!8L”|›D×ÇuqÑÜJç[i3J‰Î˜°˜Gõ¢âsÔyƒÐè¶t×;Ýó]r3 )ÕèæE!hIãÝRò[S@jì‰U(Õ!ÑŬ¨>¦àMRs]hd%]Ö…†KSt¡A71sAEˆm%kl«`|ÆõÆqÏ ÙêèuëÄ5c‡áìÝS¶üî®UǾûþÕÇ#Ç™UºqÃÌŠ-ìDÓ¬â¶MÑï+fE#Ÿo½Ø€GàÕøi\ûòµß·¾v¬uïsÏW.°Ø3Ñ5mÊ"Ñ€¼}‘¡‡Û»²o_kòJžK_i5öXc–ðiéœtQê”XéS³$õ^sÐ|Ò|ÎÌøÌåfbÕß½1øs†9Ï\bXæSä®qŒÌênb —C iK7,ìŽu/Ýc}ŠôŸŠ3{ZzWá4[*4·Ð£ §pî*”€ÝU¤Ÿ+µŠ$*=ª˜>ÆÞUL/5½ ípð‰ÉU8ÀÂÁC¼Ug:ûVaJ’!¢d˜ b4@kçgè‡Ç5èdº; &œqÖ[b¹Ñºqê§•ÝùÖöGÞ™Z6ÉÿxæÇ5Lß°¤¤dQÿ‡ªæ<øðœªoÏíuû?þýÓs·öÊ8õà›W¯¾·õ$ž8¯iÕìêµM×~iÞ×v_ó¾'aôŽÑ[Êíþž§É ê ˜åƒÒއ¿Dß2òk„v,E# ]­©Äü1jG÷îE[N²ƒGL`Õš;†‘_ˆþdßÉÔ½^Ïþüüý_F2¢{Ûñ_ñ+{áiu+¸§PúPsÐ>›™\[1™Bf6 Zm¶v|»æ5™í0ªMf›l4±òJ‡Ãk±v¨f°¸{‰]©yÖO!ïpÍeò[ÔO…5>w¹›œtŸvŸs3îQ>€›‡4ƒñ„é%x#{܀Рô  D-ƒÈà tA"f Å¶)5‹ýâÛG©‘æv&p’ä°æ:âä*Ì{Ø*„º×(ÐõUÚØ‚˜-Ù‘ÌÄF¥XÃöXWOªÝ¹µnØ’”ÍKÈähò»–í8wŸá&õþ¯íôùÑÜäÏEïžíüâ³èŸCk9 o‚%!cNë3‘ÛJßôQDÀÇ›™ ‚0™)¶1{6ÓP`Fj›á¤á’AhåqHö#Œ—ÎN'KÒ2‘³‹"µº(×ç.É2`Àrº'yµÈlÛDb}"_Æ%ú– GñrnŒ¯'L9H"*!äd@˜h}üt‰µDßRu†ã‘¡{«è¾*Aå*Àc$ê“<î86#Å£^Ž™b ñEÔ¯»^¡³^1úO)?µË€äÇ·8iF:ÁoäÅÑ£{_ö»m×wF¥_7oÉ}}¤°ókéS¨úRKšíXB;^"l1))cF‰~Õ°R’Òœ ô1ÛÊG¨`iyÌÊt£á%EIEêšÓIç’.&u&±æ¤qI$)‰_s2õtê¹TÆ—ZžJRGe8O¸téê}³þAŒ¾;/óB÷rEpœåçxÓLVVL š‚V¯Z…Ù4$+FD-‰6¶ p! Q.ÐÃãGqð¸î8’gíģʢ!`úBhg™ÐLMRX™™­a^Ö_biâgk¬¬Èo M™– ú n5ËþË‚–ù†-•’å|ÝÈÉïÞ[øôÕý%·7ˆo3dÊ>øàÚþë› 1ZP­¯?Þ¡™0ÝøÊ!±‚ma ØýŸh@˜›Ób{)»6`ñÝKC¡¥£{Îé®óe­¤„;ñóÏSYãoÈè#-CŸŒ+”k14œ3pw¢2Ë3’PÌŒ>bÿÄó*ëãI{ç4ÍÀòn,¿ »5ƒ¬Ét÷¼È2t·F3<´ù(çjR;~BdŸ†!¤™üÜ9ލ€p§8Ðì-ÍÃ"€bT•ļŽvº&ü<£{YC ͰSß©ñÑ~Ïá¼Tob*.z<Ú›;ñËg÷,n\Êöú¹Z!Ôù {ìÚô†–4Õr§cƒ}§ý€ýiÇ»v¡—#Ï1ÒÁˆÉ êAÚ±OóⲄx“µÓöG× Óc/Ao¤xm­í8E“IJrèÐí$ñ°·Q¦KVúò‰>? }8ÆFuÜÊ×½tõqûY£ô i>.yfr’à­Dn#ülU(QêQ‰We|þ˜6Á Û±s‚ºi™Úµ!Ûéúݰ%;×Õˆ,ùy]8úÝccþȺ·›ü[’¦¶L[ûê¢+oÍxëRðŽœoXÆ:.áÙOÏ|ñѬ{V¯Ž^~-úEôì´Û±…îІVËÖw25kA•UMªõ¨ù% §š}–9BŠ"•¶h¶ ›¾G€J6T¨Ðd’*ù¥K@:©ÀÚ»_j½Û¢ïÚ˜5ÎXÙ4Sš…³Ub³`¨DVF­DF×_{ƒºg[èÎ@ Ö]Ëþƒ,ÌÖ¶‰gŸþ{GëíT=³‹;qíÐq 3îÚáw‡Na' t{†>Ïú±vO/y)»”k”w0í2ÀìÿÈ$Qž.“óF|Ãܪ$‹ïÅfWY†)—9»,súìª0A\»'Wé+½­ÂAá¤pZ8'\D³)Œƒ“'õh§ ú„rÈÁt¥Õ@” ìC­±·_ºæ¾ V阾@_TrÅÖ± âïæÄ(UsüuÏî™Ö`½qzõžV2ùQ˜?ŽNz‹;éE>‹¼pm'ùú¯Q6ŽSô^ýFÛ˜ŽÓÙ^bO¥§)Ýšå¨V–*õއ²]W9Ý GUmfªq`˜ÇÔ ¨U5Z€mÊXUxð ”KyL¹H²ÍVS9ñ7”lºžcY¥}òn³ìFÆ}õ€DÄðgÛ>¨} •ë*ÅêÊCÿ‡&‰½Å¥¾I•†þê+¨ ªDòóã'¨jÉ×wê:¤›ö0ÝùŽEüQtΫg‡%¥þá¹è4üΛÑ<Þ^–èÇäùutÃbml^síŸDé3¨¤GSš†¾dîfß@<ªÖ#¨ÙöØ\1qßÎñv8ÜWüWŒŸ}GãþÄüÉOÞÁ̽<%êƒG w®mÖghÁè@™z‘nì»yv–¾ãCÿ™»¯] K#™D²&Zyàü#Ñ9 <úž ]Ç h˜–ÎÏf™Ù˜geŒþ›Bÿ“B£»öô™Ÿ.%¶´W—Þ¢5GßàOAt›–Ñ9±Æ Œ(³d‡G‚öšvèw†G%ØGñè¼1:~÷ÏrP)¾4ú„‡ûîgúVÊíð3™wÎÔ žÏ òclL”è+¾|l³- ½«ƒÊì¶šrð[¸ýèQ¸Ï SÛõ%ó´Dú–ב¾çÅt¿ç%šòÓrq–&3§ÉEBNRÇ š±–bo£©è""ç®o!¹a›s>àûõÍ7ÿúž×LFd1ù-}Çë–ç#úûÏ};¿!¯Óï_¡­oluóI²ßo|‘?Fß?O°aŽYØp]ÃdW˜cø Úó-,ï~o ¶ ö<’hô}³ \ßÌxœ$![×f Y©9ÛŽÈ™b딜IZ…E#» œö¾ÑâŠmœRõÅľ[øéãóJÍŽÖC=:¦ ·¹ÜS5dóý5Oôû?Ín€¹@5&ÓÝ0ø°¶}™e©³Yj65›wˆ;L;Ìø}Ò~Ó~óK¦—Ì?£UÕïε v·ŒpjîR©ÆRí¨p/5µ¸ ›-ëœgùO¥3òÿXÎZ?u|â”$^8`œ,Z<È©f¹‹¤fq½lx˜ÝÃï¥+@R‹¼×°Ç²ÇºÍ±Í©ðQg¸3 «rª2› <Ì=¬´ÚÀx³h‡œþ¯m‚èoï´i¥ŠEõ‹6‹e¡"ÚET»wî6§s!'ÀÈ®3›Â1N³É/P¢ã´XT€“`Áɉ›Iõ›±jÆ`#WóTN)ìýéGÚNÙ(Á隬Ñ÷d€ì` IZŠ¿nŽ+ðA܉Y3‘V|s’ 'I~ )´^·í¨Uç‰PÓ.Š@°caHçC–›Þÿ¹a•'¶ W q츋-𕦯"‡b Í–m³Æð(5/0xJôµ'^JrúêÔs>Wê«mÑc»¢ik'èÓ‚m;±™ùS$!úŸ¶„™~.fCÏUÜñËT¾§£@Äc€ã4…?+2ó%rVAb;®|‘Wör`VjIÔê-'u`7‘3DÈ‚¡ôi¤!އPé1ôÃ`hë~ÿ¬ }Ó^ø‰èq<ü~<@_dÅ l¨;É(}”¼íyç¬R¼õaFä^™±BÚ`>?­ÏëèŸý"( `:I³ ü|ì h”Äã‘b·Ö¹’2õ)ÿ+±Wâhƒõò5“@3ã@dÏýóyºÃ‘7Þý®Üœÿ#òŠú÷¿öå®ZÔý¾ËÑñ€ŸBPŒ'Q¿N¸':öÆñýˇùÆâOPæ)t ¸yNÆKÐZºÅúsfC¾ùà7 »à\šóÿW—µPßÓ»5‚?S¿‚–¨Zêb½\±6ªÕ¯š¥Ÿ¡m‹ÏEKô².‚<ôn]÷_õ¸^ ? iZÞH[Š&è÷ÀÖÏý{‰ûÞÔ7_ëÿ—«ÿ[¾)z9u×v”'+~ïQpõýIƒPŸîÞʹá^7ÞIǘ®šMýþ4¥n>ûr‰oþÞß âG":ì{¯¢zåCzÚó!?¡à3ñBÔ î ¸“àλ®@UpåàVƒÛÏÉë)ãâ×2$Q˺:È—uU»ZrµþjÓÕ–«mWO]U8QwõÌU]U¯fAZÓU ‡W+®’¼qC j×. î¸óàxº‡ JVA =B. À•ƒ«·Üp­àΑŽe*W® \ ¸6papgÀw œ ˆì»zàIhLš~ Au€¹«Ám× î ¸“˜²¦Ë4|S@‡çAê<83Új@m&[Á…ÁÈÑž)צ§û‰JhA¸p,Ô)ƒ»Á±\=¸&bÑ|¬ÇmáNr¬ÇnaO²lw#ìA–%½'êiC|RlR*KbóZ¤6),’ÎHç¥K’ ™Ÿ)ã„r¡NònœÍé–ëëãz—Ÿdf|L&ÃäŶâœfÎ1™NFXÖŽGk³ð²­xY^¶/+ÃËVàeÍxY)öyÆyˆÏ=ÎMGõx4O½‡CnÕ]àÖÜõnNBPSX,wlqrû;AÕQàÐ,²«ö»f ä âíØ{˜ó½ñ öv^ _ Æo~ñµã·_|A`œSÛñ¸#Y¢îkF âbu«UÔÚñ•£H*[q;d~ìpc2x­‡'ù^Á»pÙ ]1öpc"œ½ãpã-à<ܨ7üpãŸÀ+¦Þ3@óÞŽBÂøx~ ád¤AHÔŒ|«}o¬óý5ÔNvó½×˜å{{ ûNÄÎiî;Ô¨Ÿ9¸æ¸{#7ð˜s\VíâÄ·¡R&Šþg£R,¢[ Ä£f½Þ*%Ð68ÃB¨ú¥ûœ—Êzú:VOø'<ßù]óqÃv²[Sœï”ýÉ÷bÙ$ß¶R½Ü[KÛtd¿se,:…îÍ£1Íé›]ÖÛ7½4:ØY̳ÅÜd‹d‘Z^ƶ´à:í6¡å·BËSBË*¡¥Jh©Z¦-“…T1Eô‹=ÄD1At‹NÑ.ZEU4”ElV$"¥ça3šŒž8Ÿš…FÏô‡¯L ´cyü´0ŠÃÖÑhô¤¡îðàŒÑ ä¹£ÃBÉSaü`Y˜lпõÚŽ=4¾ÞK?óz,æ”õx©ß¹þ²2äÌø÷?ww.i<­7á˜àû^ðÕ pnôD8ÕBOµ|/´è§ÜIáGFOœ~&©,<€:“ÊF‡ë&ú§O=ŽÂWŠ ã«Ô+›zœ üSÑzž Â²²ÑíXÑó¡ |ò¡FêA>nª ùP7 –oL,_®‡|ÕÔƒ|€Õ!=_ˆÝì¦ù­©.*z³:ú¬™»þCò.š<“>k}Ö.ú¬™ÚLýY¸¨–Ž·’©‡D4´lØô˜„(2Œž orÙP§Z»>”nMv¯òž`>€”Œ²°!04lG“úé;„&±HO2Ñï8ǓܫnMöžÀâI*œ¶ÀXŽ7<š±hü/^Üå/éú›±hFF=ÆB4 /Y¼èæš¼xQ¸E±Û…IQM;1Õ„µÍa 0ÌÓÆø‰”@á"„þÂÒw÷ endstream endobj 133 0 obj 17972 endobj 134 0 obj <> endobj 135 0 obj <> stream xœ]”ËŽ›0†÷<ËébœHR&™HYô¢fúœ©DÈ"o_ÿçw[©‹Dp.ŸÆÙî¸?ý’}›Çöä—ôÒÝìïãcn}zö×~H I»¾]â•þ··fJ²{zÞ;—q³I²ïáÙ}™Ÿé˶ÏþS’};?÷Ã5}ù±;…ëÓcš~ù›–4Oê:íü%ÔùÜL_š›Ï4ëõØ…Çýò| )ÿ>ž“OE¯ ª´cçïSÓú¹®>Ùäyn‡:ñC÷ß3ç˜r¾´?›9„!4Ï«²,äw°Qvly .y_¹R.`Çû^1^ï¯K^ìÀ[ƼߘkÀ;²ÖÜ“µï»²U·y¸ÈÉÈ-èoW`úÛL‹šýý%Óß WýµþŠÎÊkÖÑúW˜þNè_©ý+íEÿJ}èïÐWè_!Wèï°F¡¿80ýKþx/B«ç™ ý-f.œ¿Ñ\úWX‹D¬Eè_i/ú[­ýñŽ„þNcè_!ÆÐ_°^CÁœ ýÖkèo”éo4†þFëÄùcž†þFkFô5ô7˜‰ûGãéo0CC§¹ô7ð7qÿà]ú—ȵqÿ ¾¥‰ú6îäÚ8Ô´Ñ3·Ñ ¦¿`æ–þ‚9[ú[í÷ÆÓ¿Ô¾ôíý5&úïõã_)>cœ3އ´}Ìs8ô0Ò3§A?ø¿çÕ4NÈÒßo¢  endstream endobj 136 0 obj <> endobj 137 0 obj <> stream xœåzy\T×õø9÷¾7o6fÞ0Ã,"ÌÀ  ‚¢ JdT "Յ—Tk5%ZÉRÓo–jÓÔ%IãÑŒ&­&5i–&ÚÄ6mVÛM£46Ñ,*Ì÷¼Ç¸¤Ë÷·|>¿¿~ïñÞ=÷Þsï=û=÷1í­5`„ ÀÁ_½¢ª¹ø–qSà·YÝÙîy¼çΑŸk›ëV\}9é=i:€°¸nùšÚÏ~ðÞaÃÓQ³ëkª–î|ý1€ç*Í‘YO ûàÏ@ܪ'Ô¯h_]©·çS½„ê·-oª®Ú2i÷Xª?KõôU«›·k_çT?MuÏʪ5ø ñôo57µµg̨H<©ô7·Ö4oûø•¯©~@;“Únå2¨QêŒ ¢FÒêôc„É,["­¶(;üÿs‰‡Á¥>»`ˆN€ÐYz>UÊe¡3JßÀòÐ'ìlèïâ‹`dï†.ŠGÁú;ªÈñÆú›‹Wû7Ólÿöăóžÿ¤þ >/a;ü.Á9¨…nx¦Âcpôùð$Yå×§Ã'(a<¯Æ.jù1|@£/ÁÕÐq(€ƒ Ãp¸•ÆeÂbx‘°Þ„3è€ù4âC¸Â Á‹` 4C;tÂîПA„D àmꯂe4æ7´Ö…ÐÂEs4ÀxvÂaxNm_±˜ÐyÐAä]Õ°ö!¢e„>"j  nH†B¸ž‚§áz>#οF=NÄéü~þµÐZº/ô ('ÌûˆóŸÂÐ ÏÂsð‘Oæ ù&þc!3ô5X‰«8šaÍ‘M«OƒyPC<.'i¬…ïÁDÍ6â÷ixöÁ ðÝ'á=’ñGp úà$éË( #0‡c&®Ã-¸_óØÏ^æv~€÷ñ>……gC©¡±¡ÛBÏ„Þ õVðÁHÒç4˜ ³`.­=Š¡”(¨…•ÐD’^뉫{` Éuc þŠû±àA<„/àÛø>þ¿ .#™ƒ¹Xñ:†ÍbsX1[È–°jVÇV°­ìQö4{žõq3ç#ù¾„×ñõün~„(ˆ‚Cp áqNŒ‰1Yœ+.o¿/îOhtšÍ6ÍNi¸t§ÖKvû%ùÖw¯Zؤ–Ïaõ¿Ê?&^—’•ïaëq¬XúïÄí0y@"NwÃd/sá8>ŸÃëð4úàA¾µÌ+Ðn€I8fº ~Ïvb-I«6a³æ~ø »êØâa|§àe–Ä_Ä|x^ÇrÜL+ô‘}_„Å$Á1hƒí¸ŒßÃRal.ŸÅû ߀„û¹$Ôð•ü~‰?È^ã[ø8ý…—‰ ðg0BËùù«œþœ™òÅœý9›#÷S•^£Ò3,q–aq–¸Ü4°“þ(Rò4VØ©¬3…2ï=”×Y(ïH„çü¥u1™3thLÌB ¨ ¨f–h,ËMÄ´Äʼn;' ‰‰=´,™!KŽ)K¶€VŸˆÙXˆ¥iÅÊ%¬ßáè˜%¡dwûuÍ´õ¥e!ˆ–Þ$8|¾µòäHåýå}Ùi}>9-‘ŽìrKd6ñàë‡_. –‘Ùiå-È9Ô¹Yé['“rˆ?,ϰÆvØ)üj$õ­ñòŒÑ™™cÇ$&z¯ƒÞ¸)WðÑŸ¬èlm-]vÇñ_=ùËï-Ÿ8² ýÈÞ¿o©/¸­šs8Êó̆;žI}´þ‡gjxcò’ÜŒ[W“’—M™U¦œ?&“š†“¼8¬òÏŽÉl7ÛÍÆyñ ´(Ü'“Žšh«e(¤¬à$e_‚¨¤FñÀÑNúüR4?ÌE"ݤn²Û{…›$ÒÚÒRîË)W¤›fw× >ùÊù«âáËŠÍL}Ê7)sI‡7üž‚dt›$cZB w[$£±Øâ¶Y,nKŠ O|L ñiÿ„ï'àŒ„­ &ð´L¸tGÌŸbXLLJ|­ ™Ìú” ›Á2*Ù-'X2,Í–ç-B®e±åû–ãÁb ²¿Í¡ƒvÄᎶÁ¢ÿÀ(‹Ã2JOJ$clmÔèZùoÄ‹O> ¹}¹9¹ý–ì´–>Bh9­èÒ4Òg"îTÍ+Š9*Z0i"fŒVuª‰²9¼‰I&ôÆ'Ž“•©ÜŠBã­É„Q6{Æè‰˜…Ýg†¿þÈOžŒᵞ6ñ1›§4vÏsdO¶yÒ¸µ/Û½?o¸%mTY¦•}ë|àáÇîYÿé‘éùsÆO,˜¶gËO.Œ´8oIHŸ0°NÒ8çäœUÝBÒ]úT¨&}›);|Â_ÞíÆ’¡ &V¨/Õ—¸VA—kƒûa—4ASè,Úé˜ÃîŒMh(F“ Ñd6ArÄ ƒÄ¬¢Ac’1ç`-®Â{ð>”"0ïFŽdßóëur{¥»µ¨ ²ÊžXtøäÖã©°É rû²éï†Y¨‚Slƒ®8oÖ œäÈŒÑkJG— yýǶÉë¦mzò‹_î+©8wõÌâ¼q³j'g4Îj›1ñ£éäuÿ^6ìÊWíë~бz뢿’ ªÈÂ~FE2øÜŸ\*c’œ%Ê]C»'&=ÆÃwÆ ÄÈmˆéŽ9£¹ƒ1Atû#¡›‘ÍÂmø±ÂâQÄiþô€„•R³´Sâé’_š-QÀ“%Äu ¡¤ Ò ‰+í ÒI”‚øKÒÅZƒaH­EŠq ôV›Fv×6Û°·q·-ׯÜ6´ÙZ¿Û+M“Mݦ&n:Ä*!Vd¿b—åd˜j„éËí/¿ØÚRQ^¡ÈN1F’qNyKK«XÊ1N5¯,Å”x6v ¨&™”¥ˆS#ñú÷/-hŸòÎÄ·6<ùg„3¼ø.–Þ:µÃ†‡£—mxÐ÷Èèûë%ì8÷QCùÐ5í›îRbÈŽÐá´øDÃNZ)+åõŒOcSùTÏÆñq6nÐ9uÉŒë"t¨k«+«Äf‡hú›9ˆ>Td§#eíè!ŸWÂÇJôƒøG¿ÙÕI!¤CgFÔî¡3kŸ:`Þ;Þ„¦ J~ƒ½ãâ¡›^púfÊWËgô]*ï»J¼WôAnÿÅò–Óô>MÎWŽa‰ C#ß92wH#É´4LI&úÛ¢÷_üccv=ÿ­½/ªuQùÓk¶,]ü8“SCtzËA3>öÚWŸ ݸrÓÀË¿ÜÿË)üSØâ§Èž\pÈ?{Œ”‡yÒ|œ+µJQ29쌣Sg0M6£Ñ„Ng± l.DÖŠùO²Áhtºô&#ÈŒXaÜa:€O‘42É6†’mÈÐà;‚ßJÁ-|³IdSÍÅ2Ød$î˜ ™e½b R¤F òpù¨Ì@FY¢±×¢“Õ}ô/ᘉDtd¶ªS ž£¯ÅÍììkº¤X)]Wáù¼k»GO(óx³Ò g&Ž'í½u&öœiXvðÔ@/EÄZŠˆ'*0 ýñr… 9*ô†ˆö€t\ú\â¹Ô*)p(Žid5ùYå×ÙÚgv“J4о”0ÔG„Xå,Õ¤d é¡aÂò̬í¼ë›Ãô}tà/lGõtóüºé•SÊé8+>÷ÚÕ?|3°í2>Ѱºä½ŽUw×nQ¼lnbÙìÊTbý&²¤eD7Ç_ˆ< ÈgäÓ–ŒÑÖ§ÀÇãZðÕ´,öÈÀ9Y:+4Q|Wý‰¾ø㲨NϤ½Îƒ±¯{~÷züÙÈÏÜÆüX¼Ýr·á^ wÇÅY»¤!Âf0Dì24¼oàC’¡ËÀ5`„Û'¸DûY¿c¶ã”ƒïpà6%_ÀWýú³.tuZ9œE%°M;“twœà@mÇö„³ ì §XB‚c¯}èÞ£ò ™}®è÷¦Ù?·cçfû,û= ö ÛìÃI•àQ¤ŒÏmžå-}j&B/¹_-T/V"Ý`ðW¾#›Êkyˆb Xu,£07vLRbÒH ý™jT´BéˆÝKa5ω)µ%­mqq]ûÚrÏüæµû"_­.OñÝõ‹Ö[.¿ûø'óð}sçmc—ÎÉž\X^·½òØgŸ¾ñ§yS'Q°¨æòßvQ´–Oùøó”oà ÿQ«.œˆKÚ2 ˆÄtÑ/VŠT€ ¢Ú²S ˆ'ÄS¢Fu\(Srs½®ÌÚÛ(#y"ŽÇ",£Êjü-¾‡Ÿâ7¨×¡À$ ½úNiPó«t6›ídG™Ð­<¦bA¶Ñ­› •0˜ÃŸ¬œœ ”³.¾×é#›)_P×rßÚߪ@ËÅòÓ>J"3F«I} ¹_¿Zûs,J2ßJÀ͉<¥ñ£úä_á·è_—ÍVŽè¿?ŸõRÒ}i ÷Ò@ë%²ã;Ï.1c+cbdÑ.N2ÙÖq\úX ËŠ6»ü&’“nÀ£xE%G²ôÑᓨo­b¼åƒgQGvKøÖŸ£@ÿÉb‘òm:{ÆÒ!Ä„’ƇYƒÉvR¢1çë+ø·{î/]¶cÅ„};FLnら wöˆ‡gî^sÿ¥Î(×£7–,Nˆºž‘†Ð|Öh]0Y7W·JhÕidaõ""ŠM²Íd’¹r´P¥"H&½­V’ˆW™²Ý é‚‰U˜v˜Ž›>4 NÓ,Ó:J~S"LG?;êèØ±â1<‰zD;ŽC¾àqJÏ•”(ÚäPd¡ìN7§Dʹ-‡¼öŸ2"É$“µŒ "ƒ‡l7çDtã¨sWΗÍïšV·Þ±ìÜ Ë¸Ô c lqâáþ¯fOì^Ÿ{wÿlM]LÖÄQS–Œ}I±ŠB²ŠÃ箳þnI?N3US'¿+Ÿ•5:ƒÞÈt’u‘icd9!-r™´CcÔØ7§Q°«§`·„»ð ü~†ß¢Ñ‰˜I‹°7áCø>‹/Q§QGÒFbc¸òéÂÑ1KۤݦýX+lÓîÓ×~® iEкµL«|̈ü×`¨ØRìÍgøruƒ[’"MÅŽÔ(xýDåX^AyÔàW e[aŠ-y“È“&b$‰Q±¦Â+˜·7§æ¡’²Ÿ=³xâ=÷¬ûAÖÔõ·å¦6o›\~ý‹ƒoœm°Fœ·:„ºgºŸˆ!ׇ2²;íåxÚß´À40C;×J D ê¦A;·s^,èl´ÛÈæÈ sF j~M™ô2*— {ÌÍæ˜¹y+ôÛ×ðEº5šCñBº/ µÂná9á7‚v¢P$T w ‚b”¬S‡ÎÓ§ûO_<]®ŠBÙ›"1ä–‡Ó1ÅšÌt R.éµz)¯œÈ®§ffd'ìzàÜýw%ÜeuMX9}ÅêÔâ±ñQ²!$¾}õi>ÿí6Ý’þ¦×e½­Hñª#ôÇ’ià)Mž€ €ca ÎbÓù4a9R-Ô`n†ø¼ŒK lF’(DˆH$_ÈÐÆ(¥i“aÚYZACÁEfiš54G5á]ýʵ˜51æ&#<„$Cù+2–r—’0SPÍ.§Â;ù•Â÷æuª3Q¡rNѦ|8ò +f°_¿ûõá?.‰‡¯<%?¡O³úÞü‹óxžç(&Å-ph2Y¦9ÓYËj¢Å`ä²Ùd*Žm2’n@ǰHµVm¦Ú#®dÊ—r¾¼PÞ.Ÿ”«¼H®’“ßß—5”GSÔHÖyé¿#ß9ÛÑáØìØîØå8èxÉqÒqÑÁV{Êñ¼ƒ9(™3úu.ʺér©€¸¬~Æ*¿þíBVVòQu‡Q>©Ç 1N¾óƒBI8õˆ´·poVøDñõùåÖìáéi“gºœ;ðó¾=ë†ÒÎroËÐt|ÚCÝxùÊ{Ý{¸#ó õ».ž½ý¥Õ‹Í9— Z«þ[ëçYw­»ñÏ®9d!ïP&¡ ÿ¶@Ò÷fÞÀa…°ô;ÿ!sà;"¼S¨œÌwÁtÁR*«¨mÁ, Ö³­Iý@õZªO*¡Žž|jË#\ƒ+¸4¦ú˨~„ê46ü‡àk´»}ÉÛøeáÚµOЉâJÏÔ|.­•úµuÃu{ô²~J·F)ŸUbéìdƒòûríL²|¥W†W®sw`Cõm¤†GàÅ0ÌÁ ¿ ÃÙÚçaX„!(…a Ø1. KPY4 MÚˆ‡a'¥cƒ0£˜34 s(à£Ã°é|ua ߆5Â?Ñ¡Ík¨khoX[³Ô³´ª½ÊSÝÔ¼¦µ¡®¾Ý3¿¾Æ3£ieSûšæÏ”¦Öæ¦Öªö†¦•žQ”‘¥ÒkìHϤåË=*v›§µ¦­¦µ³f)5¶6T-ßãihóTyÚ[«–Ö¬¨j]æiªýÏ3®ªo¨®÷¬¨ZãYRCÕ5´µ×´E +=Õ5­íUT6v´6´-m¨VðÛFªKxfVµ¶6­šÜ´|©§°½jyCõõÉS=7cxnBùOí jZÛRFL§ÑÓ:VÖx2SVǪ#¤*nšçÿ-“”7@=íô¬…ò=UT¯"¨šh—\­*–òÿţ²†ÊÔ§ü* ú›Õ–)Tk%XyW©3*žð¯FAj #©u,§ÛsÓÜmj­†Ê*;Uj1œ*Â~†j *žB]»ºÎRÂ[Ae+,£¶&¨ý¿¢qh ~ë Vf[Cåu„BQºj»J× ŒÔQÕj‹"«Áz#t¨´¶Ž2ÛµùÛˆ\x`¦Jo+õ­‚Éô^®ÎY¨Î´\ù¯”§~GßÃófù?Å_ òÓv]*£‰îôðÚÓˆ·•*%™r]«coZãæR¯¯póüJ|‚ÐWÓß Õ’žþÍõ\Àz%4a½ßƒŽ!à ¿Fø5^¸„p /Ô"Ôâ… „ ôLŠ`C:=~zfÓSIO3=GÙãþaÒÑΧ:ù½Â½âót.¢…h±H(… Âñ)á)Q@ÔBþSn™»yÏåBö¾áÇùÇüsâ’t²Î£K× Ùݺº€î¨î„î”î‚NÒ™%·”&åJ³¤ÅR“$eïöIG¤ÁCKH¢‘Ùà1¤ü†Ù†Jƒ”ÝmØiŽNN.¤Yînfv»ÝlVìŽXfŽuÇ29ÖìfZÓãbM® .–ëò»è@$SÕyÁÉr~'§ìd:Šð.¦mŠêŽb¹Qþ(FÇÂ(Ödë¶±\›ßÆÀ&ÛÉQ4Ý$ë%qõ’¸zÓSJ{ª›õø£K—º!KÎògÍÎjÎÚ¥IϪÌÚ™È:‘%qXÏ[¢û0ƒ·B_öˆö¿ñ¯=¢[)ü£³D{õZŸ»zm”Ïþ³ÕÑΎ¾Ðþ CFÛs‘ Ò¢õ?Ï<éð=ñî žìéæž$ãqX˜t»8†6¦ß@#Ó“±ÙñehÄXNÐK½_zíA<ÚÛø®Û>I‡Ë  àFò7œAåÒ0Buoã«1TŽê鈢ÙÓz:âÜ“ô˜ —U´$h”ši c4þÜiÿöò¡aï‹czìß46V¾j "óG ³Ùx‡Õ~ª#Éýá Îsö÷”©_鲇{Ü/Zª?Âg±ñr‚ý@‡Ï½÷2uø#Ü» ÞxÍþPcPxÂoÜm¿§ã#÷ÝÉî;iPWï8{u õë´77n·Û›ƒlOo¥}%õNîi¯SVxÎ]©¬¿è²ºZiã¡È‡°/h<Ì&>ÞééLwOŠÆP–ô–*µß’?(y=\¾F¥Âñ+ä-JýÔrNÞŽ+{:‡*o¸>¶Êx…8;.!ì¹äÞvLïéŒ%¦ötn¢"¥§s·ûeêò‰=GÜ“"Ð †ø¡»i ›b…V‹®ÞTû¥Ú «ðë*íïÖ¾o¹,(Ôô>h?Vä?é]kÿuÅ!Í4ôØŸí Rá~¬ìtI©?Z«ˆ1Þ½¹â#÷]¥îå™îekÝ5µß&Û è¤]ÀŠ5:®›´z%ݸJ}TßÑþ R÷Ÿ¥î¤î“R÷SR÷©»DJÐÆk=ÚXíPí­Sk×Ú´‘ZYkÒµz­V«Ñ t&$~„L3›ž©ô¼J€+/bEó&c[Qàh5-ñ¾šç ¢~NY@ôNÆ@dÍŸç+¢27å+ èf/*ÙøÃÒ»Gý1K]J}c´ò;–CäÃ7nVÊÐÆ­¥¥N°ûþõrÞ±höš÷EÉW4oMO7•ΘÀö¢y%'cJ£ SZØ4Ïs[É!Ï<ùy‡XœR”–âo²øü¹J;3¯´´(ˆ3T<ò±x/^)O× 4êZT<öð ^±Šía¼ÈÏ XÅ+Žüì;x Yœ‚ס„g= U¼…ÖÃ7áí¿ÜžŸ·¿½ýÚ\—UœËê\PHPq**§³BÁÙ®‚0öWœSæ¤Þè.S»‘cW¨ST`²Š²öJí O½†ÂS ›I_Î+é)ˆ+È¿7(ãg•Z•ZëéXX_ïͯÌûŸÑÚ‹ÿ·Ð/‡Ñàߨø;þ¯nºj&c~ÙdÑì’ýZ˜\:å¶Á²—ôda•Ñq¥“íróDÕÜôoæFE†_ð€ÁWÐ{' ÞÉ›ëTóic@CM= ö„8çúèÃàÛHÍá®ÔI©“”.Ô.“òÓ¯p—sý„¸èø'Ü%S³…œã&ž ÀòëƒlD~}ÀoeÀãÍ h”_¸!ž@iHl²o^[»Ï×mmêuhCTÞüv{{{ÛÍ7À™=¸ endstream endobj 138 0 obj 8630 endobj 139 0 obj <> endobj 140 0 obj <> stream xœ]’Ënƒ0E÷|…—é"ÈCBH) ‹>TÚ{H‘б Yð÷õÌÐVêtÆž{¹š!,ªKeú9|u£ªa]o´ƒi¼;¢…[o Ý«y­è­†Æ¡×ÖË4ÃP™n̲ |ówÓì±9ë±…‡ |q\onbóQÔ¾®ïÖ~ÁfQçBCç}žûÜ ’j[iÝÏËÖKþÞ "¦Zr5j˜l£À5æAE¹ÈÊ2ÀèwqÌ’¶SŸó­Ò·FQçžcâ}¼c–È s‚œ2§È{Öî|~E>¨ÿÄLþgâ8B~äþ¹àó ò…8%Ï+ûÓ·Jî?y–{sþ=åšÿˆÌùÌ ×ü{dΟsþCJƒZ'‚#Ãþ¬B¨»s~ ´xš?N¾7ðûoØÑ¢ŠžonžŒ endstream endobj 141 0 obj <> endobj 142 0 obj <> stream xœÝ| XUUÚðZ{í}.ûÜç€Èm¢â­Ò J"  ieqäq@Dt°ESÃR°Ì”)3ocæ4f·ÉÉÌl.éÌ8Ù×T66ß9óÙL£°ýÞµö>ܲ¦ÿùÿïùŸÿwsÎY{­w½÷ÛÚç<Ö×5x‘­F¹ÊªÝµ kÜE¡÷Âö²eõÒ”ßþÆ‚Woyí’ê3_½€Ú°¤ª©}J¾Pn]¯­óÖ–_áÏÃ}Bð€0\ôŸ†zÏ^ÐhuzÑ`4™-V›=Èá :2,<"2JŠŽ‰Ÿ0:qÌØ¤qÉ)©·¤¥Gÿ?ýè †ëM´íÀ{஦€™NîZƒ`æ-|¯çÆÁÜt}­è4ÙÏ#|J‡Y„Î ºŠKÐK€c2vàÉZ ø|þ%¾ˆïâ/ñgÐDÞÏŸáKy?N'Ïó…=ðšL~ÉÙÑ)…ºðÇÈŽ‘¿trœŸÁ›ÑÇä Ù>*`o Ñ†v£fàÅ}¨…kæŠ`æ¤pm‡ËëgðNüpw ?ŒÎ¡'ÏÍB;ñ9ë4úz˜”p-à—é\9ðpýÛ‘ŸGÂ9,"™ sÀ=ÐZÌÞ#È8á»®  \‚vkº4m,P¡ÛƒßÂ=š-¨}@î!ñ>–ßËÏBmŠH)jÜÛéM9nÙéÕL±s|)Þþ—jî_R‰€æK\HTŽŽÃ«Qc™nÅkÈzà”®F 3Ú;øØ´«@j„|$-…Q3:„Ž q¤µ&&¯f¢ðعƒÿdnÛ¸ 3d„V9tè¨Fà ‡Q’d=ÌÅåz»æ.ÞY=.iØ­dÕJ‡QáaS“ÔuãFá>LXxX?Lât‡ù¸ØO¾kñ“qI³ H‡û²g¨X³KgÀ\ñÒ;˜†ùìã@%¨\îàË…Ýi´h¤ËÈ_GšëX'´pl,Yð*Š»ñd–8¸\“l'-<‚âñ"Á;?g¤§M€Ñ„[1Ìi"°C£ÄðœÎ‡Lý×¾ªGo¿½íþ}ÿš:cÓü»k|wÍßôÚæ­}µ­¾Íß~å£-m 6}óô£¡aîøfÓ Ózã3þðËô#×m&#g6p‘Q‘:=§¹¨¨È,ÑÅ;1rþıuD»oG[ã³m)¢Â´(&,Ôç N/Â6ÅÚ±qÑi<¸ÀXl‹Å[äMÛ·o’'áw®c,߸.¿+¤ôýêñÖµïùìÃ>í۫Ȇ·}‚&¿Œ^à¨8<2=4®¬4®xWPJÔ¸r™R—P(” mÂ.ACA´kc¾Ñ#Gðù `´üq¼õĉ[ðŒÑ¼ãúäƒmmH¡Ío`zMv95í<׎Ôµó?¬íªŠ=Kw§ôôÐÈO=Å4í„Ü£¼N‘Ã}#©6¹oz§ çöË9ûû>Û¯Z-°ëQ“+RkÃæl­&KËô‚NÐ`-ÎOÐÈ€r'3/쬣8!ÿ%}»E¨»¥Nà&igq3µ•\¹v5§Õ`½Æ‰Gjrp®æN¼@ãÅ•š&Íüˆ¦êÍ.ƒœ,( cƒ·ØSØÊuœ¯ô-=!œ»Årm,ÿÉõ(Ð×5ÐÂ_€O-ºÃeÖPðØÒ»õìÅÞ‹ÌâiÔ"5†¹@8ÒÝxC1FÒG!+ ÒZõ.}­~—^¿ˆPí€çiø¯ú.Ÿî» йvN Å—i½‡yœ Ihº+6µ‹úvûƒ¸]üi”Í ã‚B£dBÓõ(ÜÎG+îw–: Ó’bÉ©G,1˜:_´â|ýðÂ`'K¯à‹±Ñx žñìÓO?+Çc·>öØVÙÀñ—®­^Ùþœ|åzßÜ©¾Z7l\ÕËS}uÔîyãÅõÏ8¤ÓO¼óGÕã3!òl(šàiú‰ùØnÃ?A‡øöH§#µ¡&”ê°Ž¤,ö°ìÉxûÇåÔ—,aQaVò£„lVÜMtšûo‚…„òKÝ@òlÅè¡KåK¿ü±üSy^‹‹×~),>wß½òIùòyùä½÷}0kÞ…!«à]3Uß] ZPœË¨-œLA¼ø ÑsBTŸª-Ô®&«y^Ià¬ïr¿ï½åÜ~%ö…ê% hàCüë8«H#?¾Ð]¥®©¨ý*ä–Ò ¦òtEˆ¸hö aËUœ£äOäÓrpzwÈr¡ìR®7âP’pÈy›¼Zþ‘Üì¼aÇo!$uÉNô°†ð8 œ}UÛÔ‰éNtåƒÝÉå70u½P÷ü`ѨٕŒœAâZ}ÔZ)¨ÓiêÔoÑ„wJ[bÓlt>›„ˆ#4<^²†G”^“hí==ÄUæF@ ‡Uº?_¶² êuòà’Ù‡%wƒ§'2OOD‰O×{"ÝQnÉÍ£E7©tJ§î£ÑfL…YÈ„2í±gå_Ë_Ü{riÉ;Õ¯ì~îÐÑöÏ>QüZÿÔÂ?cã£$.êÄæþ÷Ö-im?nßÓXëoÿ’$ýæÈÊCú™® QqaÁF‹.Ìà µð‚DPè¾0´/ö0Ë>Û‹qá¡#Ì#ÝHg¬G#£œÓ­ÈÀ³Ž& Zµ™¹iOÃ&Õ¾¦?Üã˜âhoÔóæïîuÔgb2îïx‚iƒ3ÐñŒqr6λËç»kÞÆœiÿz¾êÑ©S­zþ_Ó^›ßöÍŽGÃB}ú›GïlÛòÑ•v[ý¶¯>Ú 9ª¼ýóÔ­®ÑÄÆê=æúA8ÈE؆.‹&V §å]d/­že/;óÛ´ºÎª¹RÑ!µ"‘¦ÖÛÎÁep©\ªªËá\œKpéærs…¹:/÷cn g Æ#I”ÉD<‰¸DˆC²œÔŠ»D¤Y’®‡ZùŽ?§Î÷]9 uv;WÞûw¨ 'i¥Yä$næ‚yl A8ŒÄâ$’ ­o#óu õ^ÝRý2]d¨M¤?E¬ºAZDZ¬Àëp ÷K¹å´ÜU®WG¾¹6Vˆê…ÆáÚ'`xÑnÖ9šÐFW6tŠ&è ÚNv†Ø(¢pŽ7š­Î2ᨔÏBU´†ü)îÔ¤ Kf%fd¤Š14ÍB Q%jD m0 2–LÀù¸ÀX`šËq^AÖ`“Ò ’t[º3––Ì ¢‘9,gÈçÎê»WˆëýŒœéMß+wâÒ·ÔŽM()‚P8zÑ•½,56ÂÁÆó$ ŽÜNÂ;ÛõŽvÓƒ^ÐÔÐ`³ ††ò¶i1ÜÈG°zz‚ѦdöÛhSgŸL¯c j»ïФvÌZ„$`]-ïDNìà‚I9Çqñ$A¯×Åë¥È x—ƒs¸ ¡oƒÖiÖiŸÐ<¡ZÄòfHP,IÆ´C´EK´L÷7dSfóÔ3ç_¿cÃò ïâw0ê}¸o½üx{ûãÜñàÍ?’+pKÇâ¾õ¹ßýaÓ1® ïrëï¡:¡g¡¶AÑÕiGJt…["I¸3l«cƒ¢‹³Yíéiv›•K`1ËâÛ°ãé§áï駯c½üÏë×åb½P(Ÿ‘߃×òt<§wÊ~y­Ü*ûñ&Ü„WàM´›¼=Ð¥ƒ®rô6ѧ­Î@?ôÐî Z›F# Ï]‡ÜeÈ2èއxÓkØ 9p4¹pB´ž´›ÇÙ·ãŽG™gÒ\MÝÓÈ’µ.µîÒBÀs¡ºC‚.Á0ž›¤›`˜­[ Ü­+çî×5r†µÜj®UØ [cØÊmæ¶ Oë: aÐsV«‡c Ն警x<šK$ñÂhm‚>Ñ ™2Ø[ù)š[µãõãÅI†i¦YúÓÃ}&/òâ¥d)_!Tj*µUú*q9iÒ4Ááh•¾E\nXVㇹudðcÝÆ6Óf´oÒÛ4íº-†]¦L.õ4Ùêq,üáÏc?n8/K:/ß#/ü#ç„Ä{ŽÛ—Þû ×Ü·†D€àŸ@Üß–Ñl—3‹tò\§ð uêuQšp‚¢0œ{N(‡Ž4vº=3=Zh©30í¥Tí½d!ž[41Ú&dı¶JÆwÈObï»øŽÞÝûyÿ¬®Y´ÁR{Ç à—h²KBBn'aí:ûOl‡œíæÇt#9nϧ5X#i^½Ø{¢¿‡”Ï^†èLƒ”mÓð®‘qÆÇ÷÷“ü[òQÎÞ ÿ¹S~FnÀð½c­¯¶wƒ|Yþaûý{ÏáÇöôµÏÃOâj\ƒŸœ•óûûJå÷åßÈ¿•ß.—‰ è'XÇÙ Hh7oÔ£íºpqÉ2íýÅ)Míûgv–úìÈ®¦¾£QAmA»‚í8Á4°á¢T¯#§½õ‹C§å¡D}. ºáÊ\!zï‘/È¿Ãcð(@ÕÖºtŽžs%„Ž ##Âá(èQ>ËúÛVS§ã1urÈ*rX ± ä3èëÞxæV{ª¾Ay–Å€_g mïîôwŒóHÚióøùÂ|í ~…°,¬5T QÊäÄðz´LÓ0ÒVþZúÐȇ ߋö†ÙÀãÀ2& ‰SñðÖO«Ax=÷foä‰t÷œç×Þ÷Áòg|Ùw‡ÊW÷ïß߈›R½-·±#kú{·¤}ñ‹{ž«ÿJ=矑K|3œ:¦¹ÂÐZ¼Ž7¯5­»m|wH=vØMh–#ŽÇ«|õ²õëËôhf [¶9¬3LÀƒϤ«ÇõøA.å?]ø³·ßþYáÓùsž[Ô&‡5óžá3ŽûÙ™3Ÿ»Ô(<›±O‰…< \ñ Àͳw@ží¶£ncͳvË\bwf˳®Øi¡Í¨YÓ¢mѵ@Œ·š-¦s‹¥ÅÚbk¶w†^ µ‹ö@ƒCÒ±ëÁí[ÜrÛåËWþ&…mäãK§N]úâ“Ù!¿#÷È_Ê'ñdðtžz;.àK¡:Np…="f¬i5Û6Šø¸Ñ¤×ò¡]Ìq0.éóðg(ƒÐü¦¾Têü•NkA¶A~›AÕ¨kåÊöŸvuM±áÍwð1nOŸ{×®×vsÍ×;–—]¡è˜<Ÿß š±‚ßNu…ìFfG· ë2oį’ã6»af´å\«½iŠŽ.^êÖ '}iäêÈÎÈ?EÂQ- cº“:-O@3¿R4„ýÝÝS^l~ïÆ÷š_ä&=ÿøãÏÓ×Þ¾Cq¿Ç-—¿ë¸ÿõô¥K§á:yª ÎżŒ¶q4ÐÿŒÅe²ªÏRj…+‚†cßìêÒ8þÕƒT‹·€\†j]£ êë×êÖ Î}Xè6âWFtÛ»ŒÃܜΩC³9»%;œ)÷‹EêÙñê*;_¹§EÔFtFü:âJ„0 MÃÓ¸iÎiaB’6E—¢O}ȇ}œÏé Ó/z€ºn4;\ š¡!Ö2wÖò-½GŒg^^zrqٯ‚$ö~е]Üsë¶w›¹{ïzíäøñ‡Æ$áIXï˜.tbÛK‡vÒØJÁ¾}Dá‚uû4¸m3kŽ‹\iõ‚Îd1ä›°çÀ'ØI)…>Z³^NSŸø²Ó‘ƒ•\®!§#K-º®$E—³ÐÙé¤ÏJÙ9Hy:›‘ž1~B:÷Íá²98EþM÷áÇ^Õ8ž,¬(këM!¿iËå³øÖ],êFCÔņ#ôöµAÁÝÒÛ•p\ßmyudD|(Ògjìv)›t©ƒS?q±‡y™|î2{X}´tÌê1chw[…X¹³ìí˜z½Ò!‡d¤“gžkßúÜs[ÛŸë’åkîƒsçî,úùK“¬|¿·÷ý•G&wq·¿sáÂ;'/\ø«ü©ü—ˆÈŸ%yõõ»ËÃñ„`OY\ƪá1ÈìcXlv‹pAù4>Yl²ðH¹íâðؤ-£Âtˆóœ»»³~ÖðæÛÜî¾{¸»v¾¶»¯•/=äõ|¥Ð%w]Ju94-²H«¹K\+jàð˜c§êbÙüöì{ÔQ_*„F)*¹s€\¹#*7iÇó…ÇÖ%‡“—ì¶Ó¯õbåe‚Öj†ˆÔD8‡ eћѾM·Ù&­:Þ <ĈBÈ*qÑ9²ãAê÷΂Ŕ§€'.^í…ú6},-:œšÔˆÔÈÔ¨T)5:5fZ‚+ÂéŠrI®hWLaDadaT¡T]S˜P›°&¢5²5ªUj^³9¡3áJBd`k`S`CidiT©T]YU+ÕF¯Ž\µZZ=bÑ ¬|;žÈ„Ô_£×¹`îµ>è{²»«kÚñuO÷]ÇÜóÛJ–x_»ë¿®péåÍ‹ýç_JÌë{p¹ûÍg^}ÃÞ²!9yBBo »Ü‘H³æ$Wh kn4wám„åË™9³#”|MMÔH™G•ŒIس(•=Õeq –—ä™®®)/®<}ãÆé•/ö„\¹w/äKr”»÷_={=n<ëàšá–„ 3˜û»°<¸2 : Ù‡lø¸®U4èôÐë¬vsN =¤©ÏÆ”óâäÔ#/8•‡’äê£ø ì6܈›å5³ý¯¾zî™ÖVa§ü‹¶¾ÎõùÛwý–+mÃSYìn£Eß=¹ÑÒ¶-Ùí3G5º‘ƒªˆª‘·‡hdpÁTHà„™N>¾Gû+É”în.EUW4¨Žxö3 ô#'Á«Ð%õÛ¦bõ˦âÈþ/› OYÏ;Ö:× }J\×À·MEa:³VçˆÉMcíìo› 7}MûÐo›_6¡zú¬à áÆd(I†$ã­ú[Å[ · ’ð(n´8Ú0&(Å‘â<:rtT¢”=*a­¸Ö°Ö¸Öd§_qsœFÔˆ‘˜ˆ™Xˆ•„’‘$Œ„óú„”Äi‰÷%¶$®Nܜؙx%q´u ÿZKûí¯µ&€·‘ ù{ïZ¿~ñÖi'žûçîz«ªüm÷C½\žøÓûå/ñÓ]RâÊ6yrýŽ£±±¯ed,œ;»0Î2ªý¡#Õ³#TÙR¤ÁvWÂð3¢¦áŒ¨¡Ï·^‡ƒ$}Ã#mà{«ï|¸(RZV¤ ¬ )G í†i¬e•JK”&øÑYÜR®™káèð1n7§£ôõDÏŽü#ÉH>Ñç`‰¼¤Ë@x ™Â§êrPÎ%¹|Ž0KãÒÍGóñB²/Ô•£r\I*ù%B…¦T×€êq3i愚5h ^OÖóë…µšÔ·qÛÉüpØÛ+<¯9¬{C÷±î†njàÀ‡co ß‹ï}K¾ç_Ú[B^ï¤ñ2ÐÛhÑX—Yóÿ":Î XÇ£¨’×{éVôÛ‰B}©¾V/(m}â­NW_z½Sãø ÅÍ~‹eøÂßÃüô0à#<Ñ/&ÒÇ5ð‚ÌÈ2+*ë,Æ­pÛn^ázîH©’3×7Û¿©oGßNZà€î|p ð#‡]¹Â< õül£§,;} ¢oæj&æ‡&¸úý°ÿ9…U`Îh¢Š3Þ¸`.Xˆ3Ä\.WÈ]âÝÜÝÂ<±P¬áj„r± µIhZ¹'¹'„­âqî¸ð>w’üJˆ8=ÑðAÔôðatr¡$˜)„éÂôƒÓHŸ[År $šb41Ú8]‚~”mˆ5N&ø ºÉÆTs7‹äð.>Kpi\Z—n†~†8Ãà2»ÌÔÅçs…ü\¡HS¤-ÔëKÄy†2äÁ^n)ñòK…¥š¥Ú½Û°Äè37 ÜÄ­"ËùUàú-šÚír]“¾Eß,.3¬2¶rë„6ó6´ oå¶üS}^ö¤Î•ÒaÜeÞƒöàÝÜnr€? ìÓìÓÐí6¾`þ9÷"y•EèÒ¿n>Á½EÞãßšX¸„aú‡c 8v~ן??ÿçÏ»äÏÿíïç!p:ÈRúºÞI:z—Ò̽%Í<üŒkºVÇémÈ"Ú "B³Í‚,&›Ñ„è‡Ù®d´#e™ z+2­äU³á¸Õl2Šzð…·¬•”'Vê£Û'ŠÃ[œiÊ5çZ\¶4Ïåæ‘B¾P˜¯™§¯»S'8Æ<ãBóBK¡­—sb¥¹ÒRjkÖ-7/·¬Gè×Ö×›Ö›×[žÔ·ÚÛÍÛ-» »Ì,‡m¿²}l»aó‚i3V¾dš†é#°tnKþÖ•[ªòJÒ£å[•ôXñΊí³Ö–ðù½[IhìCH‡ ùÌö2$2ú[ÿÙ¦°iòR2—6ê{ ºË¯±ëGX&Bë4¶FH¤+ìx¨ºf‹N§)´é,…á# ‰e‘{{{”§.·A»Î: šÎ\A©£ GÕŽÚ<ª®×G}<êÆ(=ä7–Ñœƒ³Ü·ÚùÄì7záµîº†¶=Ýu›ötwO;Ü´âY¿rÙןÒä÷“4ùq;ŸyêõgY“¿dñJö#6Dó7šƒ³ò>Ëm_£(ûmÛ±î+]ß¹Ñßh#hCƒtêoÙ>mµ1øçpÃ~—ÁŸAåBF‚µ MȪáÑ)þtŠ»>«`F§„^vãš° ÆÈÏ7 SšD€Ù€v !hÅ0½š<ä×\¸äÚØg«ÐŒn‡ÏO4éÈ/|ˆŽÀ¸ƒ/GðŸ£;:´q“Ñ›|z€û J{:ŒÜŽñ—P3½'±h"…ãÇ"ÝNá¹#è …Ól@óÙÜô¡ö4µ7غÛð#¸ ÃEs8/×Íýä’­ä(ùš·Áõˆ`ª„5ɚǴaÚEº1º%ºcz¬ÿ±þW¢$Þ#îß1¤1\6Ž1ºÿ4M‡¨{ÏÜlaqYËxzWQ__;%%¥±±1yq`!¹ÌWýƒ6‰7“Ø$þ¯²dMb¡·®ºÒï¯ôÕPø oè-©s×Ô{=IRy×K7–U¸ë–x“¤zŸä®i’j½u~Øà[\ﮬ©¬YtÊ€q Y_á•Ê}5À˜» ä©p P_Ø«*˼5 ÕÑ19"&y$·ßï+«t=Éã+k¨öÖÔ»ë)?å•U^¿4šbd¤b_y}£»Î“È8©óÖÖù< e^†ÆS ¢U.n¨÷2†lH’*kʪ<”“ÆÊú _C=0S]©¢ðuŠ6mƒà©8IRµ—I]Û°¸ªÒ_‘4ˆF¥™â«“ü^0@W«ªøÃHSæm-Ut½ª:F¨±ÂWýí Ô å u5@ÐË6z|’ß—$ù/õ–ÕÓEÇUU¾F*P™¯ÆSIåðO¡-E÷bß2/“Añ%ÆB¿#ÔøêÁ~e–Ú¥vÀ”5É_á±{U½#•5’{ˆ¤¾ðŒ:©ÚW罩àR}S­·Ü „’l ]¯v7Q Õ>Oey%u6wU=¸ ­ÛãaÒ+êâµî:ଡÊ]ÇHy¼þÊ%5Œ‘%UMµ~º‰z©» øéŽGþᔯó(JsWݺ'ÀÇ6`¯¦ªIªâê N—þüžÁÒŸª’Ú&"^ð;¯Â|£¯Îã—bú£1†Ò,H14xcT¥uòÔ¨Yì…x¢xÀT„e¾Ê~Ö¼Ëë!n$wm-™{q•—.(Òîa†©p×Kn?`ôÖ Õ ðqÔPãQYŽš[b¿ß²~_nf:j(·TE³ÄL°Ö]v¿{ ˆñXãëÏ!?ܵ†‚ÄLz«Ê¶feK9ù%RqANÉ™EÙRn±TXT0?wFö )&³îc’¤;sKfÌ+‘¢(3¿d¡T#eæ/”fçæÏH’²eKERîœÂ¼Ül˜ËÍŸž7oFnþL) öå”Hy¹srKiIÛª¢ÊÍ.¦ÈædMŸ·™Y¹y¹% “¤œÜ’|Š3fJ…™E%¹ÓçåeI…óŠ Š³Ç @›Ÿ›ŸST²çdƒ€hzAá¢ܙ³J’`S L&I%E™3²çdÍN¢€ÈEI.‡”=Ÿn.ž•™—'eå–—egΡ°T;3ó æPÍËŸ‘Y’[/eeƒ(™YyÙ o Êô¼ÌÜ9IÒŒÌ9™3³‹ˆP0UœuÐ 3³ó³‹2ó’¤âÂìé¹tzÌ-Êž^ A÷ ‰<Æîô‚üâì¹ó`à$À ³²  þ¦3Θøù .ÅSRPTÒÏʹÅÙIRfQn1e!§¨Ø¥ö„TÆy Oj¼|•_j#:÷mï(º[pFvf ,¦l| –ùWöò2om=õo5È•$ɪ’E“˜ç*ÉÜxf „¯2džàÓ_¬)Ynh‡¤&ašFÀá*)IØ³Ì ™ÐOS Ĉ&•ÆJ?‹w(‡Õ>µþùÝU@ võCAÎtWÁ6?›Cƒ*Pkë*aKc]e=¤Éݳu•+Ô’\§–¬áP*Ãù¯óúk¡bU.óV5%l­kŒ“Êšr_]µ*:S_Yý”@.­—–0äÜW·$MG>T‹šPªDKPªGÊ ‡–Pt³©(F‹BBYSüðªƒNتQÌæ¢€O†Q&ª‚K‚Ž9€ËÏî¼ðé…=ËàÝ߯#¡ù  £bx¯Õ"ଚüÅêé:åIB·?·€”ßÞØØ9îsTÉ䦣z6㺯Ýs>Tþouy3üµÿs3!ñÛŒÂþOKMiÐW!ÃYÍ0úáÝëülͫʷ„Qª|”KŠ«œ­zû)–ÁÊØKb¼ù—5l-ÃæW)øk=¬UÂ}-Qå)S5ÀYϸ ´|Œ¶"wƒ«H{…Vx¯‚Ï2ØY£úÞh8çôãˆa¤{=ìÓÏø*ƒ=nU> ^t¦¨xÙ.ºÐO9Œª˜Ý(æh PþëQ#Óˆ—QÐ ©…wPi`|pãaÔ3Ÿ[ «õl5@ã»)$1»QëVÁ.O¿N™TtÛG5SÍæKÀ_7Ä7n˜“Y‡Ž«™=¶®¨Å ·v'}‡Iýr¦¦:¸ó³QÕ»RÕêPë¿ÔÍ)ÜÖö{tý0¯¨‘é£úQDC9ÈPǼÕÏö Pô°wJ#‰}RM,ˆ2†OìÇT^³‹b¡2FÛÃ8®T9Ò¡%êN7`õ±1`‡Áyi@ ßÎ5_¯F„l ^´68 Þ'1¹Ýªµ«šð7E#•lŸû{lJ1+9£Žy‘OÕòµ8…ibü–³L@q'K[ß·Ÿê¥©_†j…•,¦™ò_¯f?eFá–êÕ3Èöƒ½O‘¼–QQtÖXÜl_@*ã–Ú¬fF–•¨B«”KÝ̋Ю#ÿ¿•ip®ó ñ47³Óç`(áú¸oIªÍ«Ø¾ÊïÉêujò2¾ª‡à Ìøû½27ëˆWÍwÞ!šodRyØþ˜›ÔƘ~¹‡ï ðÊ3ÌÓ”ØÉVk³Ø÷ â·A‡€–ÁjåM´æEË™®kÔˆ®…K©dn–]½ý;Û^áûû#¦‚e{‰}úU½Ì›¾ÛWén–Çéjƒªå›iV¤½Ávü߉Y?Ë¢Ú=uˆ¢DU/R§îб–yöýð¾DµšRk˜~‡÷!ÿY뻥Z¬ÆJ½ZˇhkÊf´ P>ÜQZpW‚ˆ­åœ½]¬Ì‡»0;ƒÙ'“­Ðõ™w˜b,@ó.G¼SÜ a†â–Ø=½› ðù€‹îÍF lÀVÌ ‹î90›ŸÙ*Ý1fæÁ=ÏD´;UèåîCtåEá´æ¨å*—Q p6îŠÿ,u5pç2|”ÿ$¦):Îïç3Gå4“éˆb¦8§GyìŽÎ΃ÏB€+fúÌd2+Üæ3r`]‘%›q XBáh:|m 1ø*a\PJ%*d“Ê3ƒí§Tg³Y…³ÕÊt<€%YÕ¥ÂÕÿü~ÊÅLþ<¸$& Ì”0ÛdþÞ€ïÌdæôûÑ<&_&ÓC£ÅÖ¨©>óú!‹Ye:Óµå|£”É4R|SI؆ZçfÞ 0“É—Í4•Ç ‹AÙŸÛ?£øc.“uºª[§â÷ŠOä Òît&#µì\ š­úT&ÓÝP)”¡üH¡X S}Ÿ>HgÖÏW­;½ßÖÌ˾­•;Y,f3¨Lfëâ~-ä°ø£r>o‡ì8OõÏ‚~Άê7G¸’;\ÚC-8ƒùSžÊaq¿6þ=Þü• 5®Œêûó÷ÐJ>¸“èP÷¢IƒrîàÎ@ÉÆ3lõ0¸Y%O+õkà 4¸—û¾gJ?Ð º%‡+g¥Á°‡õìJOèïïR”:âëïTÙê@}WN‡Õ bðùÏÏè*’5¨;†ãRúL7ë(5ÿM´ù}•jø‰±–Õ~…J#׫] •¯A…¥ó+†’놲þ ²ü;ý×1{תg¬J¦aÚ_&«xëPà¼6 ªr¶V=ÌêÞG±MAÃûRªƒ%ƒ8÷¨÷±þ"™}w­üa,j»ÙÿÅÓÅ­vݸ.“kò¯8òMùgù‡™|-“«2ù¯8òw3ù[¹G¾z$SøJ&—;È—¤çùë5òŸ2ùËòE¹$“?§‘Ï/ Ÿw‹x±˜|öiŠðÙ5òi ùD&’ÉÇiä?ä£rA&ÚÉW‘ó¯?Èäwþ»UäÜٙ¹UäìLòÁoÄdòÛ0ò™üZ&¿’Éû29ÓAÞ;)¼'“Ó‘äÝ4rJ&o¯± o‡“_“2yK&¿É›2yC&¯Ëä5™¼*“ã2yE&Çl¤{mœÐ-“®—_ºdòòÑEÂ˯—WóG']äºAŽºøŸÇ‘—dò³rD&/Êä°L^É!ù©™<'ôûíÂ8²ßNöÓû®‘½2y^&{dòœì–ɳϘ…gÓÈ3fòéβK&;Ÿ6 ;eò´‘ìx*TØá!Om· O…’íVò¤HžÉ¶“°M&&Ò›Ú;ÈÖ-faëh²ÅL¿FÛüŠð˜L6·-6¿B6¯æÛÚ‘6ÿhÙ$“’…2ÙL1É$ëׄõ²Î@Za¢ÕCÖ‚¦ÖÆ‘56òc™<üMxX&Ùȃ2Y-“™¸nühÕ*áG2YµŠ¬ôæ§ÐGVȤI&ËͤÑH–‰¤A&õ׈ÿ©»F¸Fjeâ“ILª¢Éý2YjË–“J™T¬"Kà¦\&^™xdR&“Å2qO!¥×ȽF²H&wËä.™,\ ¯‘"¹38T¸3Ì—É< > endobj 145 0 obj <> stream xœ]“ÍŽÛ F÷~ –ÓÅÈb<#E–2ÉDÊ¢?j¦àØ$µÔ`‹8‹¼}ùîG[© [¸W—r{ظ”ßâÔý¢Îc¢¿M÷Ø{uò—1Ú¨aì—<’íæ¢L¹ÇÇmñ×C8OëuQ~Ok·%>ÔÓf˜NþSQ~ƒc¸¨§ÛcïóüË_}XTU´­ü9í󹛿tW_JÖóaHËãòxN)ÿ>³WFÆš*ý4øÛÜõ>váâ‹uUµj½ß·…ÃkµaÊéÜÿìb Õ)´ªš·6±®-Ø ¯4xE~׌©ÀŽó¯à†ó{ð çkð+ù¼aÌ üÆyÞ’åÜy ~'Kü^Ø`^Wd8hú[äjú7;0ýk¸éì7Mÿ•ÄÐßbýá£éoeú׸»¦¿EMtöoÀô¯q_M+ûÐ߉ý ýÄ›\œeèïpGC'1ôwL‡s ýjkèßà\COC‡;ú7ÂôwOÿž†þœ•ýQCC»IléïP›ýácsýoéoàf³ÿN2wZoçOË«þcjwy`Òçèð1ø¿opžfdÉ÷¶8äï endstream endobj 146 0 obj <> endobj 147 0 obj <> stream xœÝ| xUºè9uªª»«÷îlµ:‰  &¨t€0 `wÒ¤ÉÒ!Ý!QqGDEä*ƒË(Ãè¨è88â(.ãx…™ë6ŽO¼3jô:z@*ï?§ª“NÀå~ïÞï~ßKÙU§NóŸ_NFzzÈ„6#‚<;î—ì¾!ôBØÑ¼6"_ó—ð¿Aû/ðûmKwkçë_ßõBä~sckGKÃ[gâ'#4ÑÓðùg¯0f 4¥žOoƒŽ¥K÷á>»­3²®=9Þ÷ý­#ÔìË,Ÿ5¡âÇá~m§o]÷Ÿ…5ïî t}Ï©\¸xB;ôa8èŸ š"½ç/ˆ:½A2šÌ«ÍîpÆÅ'$&¹’SRÓÒ3dwfVvNü 'N*š<¥¸dê´é¥–¡ÿoþp.Â-¸· gÑ'¬çb4Hf èmÁõhoÁù×ùü,:‚>†þ-x—¸R,þ3‹p/–½v¢§ø=üÿ®†yÕh·ÏÁ.<‡{ïÁ3„W…WÑIt/AÀÑÇI0·ÆYèô ΀»iÜ4.ÿ— ÝèMÒÀ·Àj_¡0„“x+ÚÎ'Ñ èCô'èGh5æàœF& 'áøD«ÑúsÂI1Nçæ[¸oÑw€û(äàpà ’V‘×y/ÿ=Ðô€” 2 Î+é´}(¶à~C °Â÷÷÷:z°‡U¹•Ünz?Š`ô\ƒ÷ð è J1z“Q»„Q{#º‘Ñ—¤{ùƒèy›#<*èÖ-h^ ÛJJ¡w:Žb$<¯0B/¦¡]€!ÇmŒr½Žû¹2t7iBw£ø)ô #Ó% <á0*”m‡¸œ*ÿ!Ï¥ òËËÝ ÇÝÊ6|-9dî—Ÿ^ÒÀ§Ë ©‡HŽþŸ“õáw=üpbáÂ% ò¡¿TÎÑ Vzç@_]4étC圉q¨EÙÅ·÷ƒÇСd‰ÿ3ÿŒõÂ¥ŠŽ˜‚l'N LvÚÝö·ÝÝ£³a’röce—ÎòíW=b>ØhøŒ} m E<%ƒ`9@„¢ƒãp9éå¹^¡N‡z HôO‘°žIFÛ‰ÇlGíŽÄ2ú›‚ŠŠOÓåYMøœþì‰eË3ñÂCRýÂCÆúË~ŒÃGaQ#ž í¥.wº‚3ÇMà¸×?£ÜQ‚ƒ¸ës\[ræ3,‘çcqþ™iÊ70iìí$¨ÈÏ € À–£z@„CxÛ‰S¶£ “X$–g:úC¸m¡r'Þªl¤œ[0ü‘¸4Ù‚d4Ãã4ô&‘^«?ÉëF)Žt1%Åì¶8M9xêô€í‹É@ƒ­Ðw3ôÝp¨è㩹Y™È—PR<½ôLdhs:‘Ï‚ÆTGéôl~àÞ;_Vþ¾÷æð/g^T¡à p{hõUÊ=Sþ¤ìêjߌ›ÉšCO)w)_=òœïŠËOqÿ©<¡|ý+åÙ-÷Þƒ`Ó“xÎU{ïFÜð€²LX VâDh—g‘+‰KNã: m‡“³##€§ ƒ§OÊQ²]ˆ#ÉA{\P¿ÝîÅûÉz9‘ÇD@$Ím$2'ÛÞ;ubÀ^VF¥h;uŠ‘lw€XËFøÈd©‰T7"\&âÓÝ7æ7Ü%¸¤8!>NÔYpVf.Îãw¦MÍÅ/…•Ýx"ns×>Þþë÷Í¿üã­áûpÅ 57l;tÅþ¡ÇEéþ¦Æ/ߨrÚåU¤tøµ•Á3ÇZÚ5‰ @š€æ{òPúÝØ´Ã¸[ßjÅ?ÍnMÚnõæ!œbœÎÁdt[Œ)‚ÅaÎ1ž8´Ù©––•©=eSNaû¢l2Ö¹ã4üJ •Zö´©ÓAj%ÅÙä ¦äx’œžÌ¹\nƈÔÈ@iÙyù¡ÒŸEœÑNuCnÀP¦zGJZ#—Vÿé’ÀÕ·4>ªæijoùÌМÅU`ixÙÙvùŒK”cCá+×.œ¯ôs®Ô;ºþ®ü]8y÷¿\ÿ†jqä)·bâF;ã–LÌ£Ü8gŒp«·)o*w‰qÿ=Éþˆÿ¬X¾ýÃÓœž–š’,d¸Àó$â„$¸€As\uzN4F“Ñfåìè0 &“±Ü "Wf¢Å$Ñ®ÄÛÅV{ÖŽÌ[3ZsÁ?›\If“Q2 ½%1•äg‘LbÉ+´;f/‹rôÔé³ÔKóE™ê¨¿ÇW;U32*Ï…%îÉ™³ÝžÌ:÷’Ìf·7óv÷­™÷»÷e>î>”i™–YžUž½0kaöåY—g·gµgÿ4ë§Ùg=œmnD#n}&¯_Ê\ý´©Ùî’ÒïáŒznÿµ×_:¯ëv—oݨìIo8¾÷¼_øOðÆ ¡?ø¦wvå?¿2àoë.½xî5ýùÛ†¶ð_ñÀMü(ÕbfÍž4 ÛSÓ~,óÒh$xäi„Hx“g¡Às"7‰©ç5ÍÐHÏàÒLÔ¯–›ÒÀ["1˜†‚qÞ´íæv«ÍLˆÝd°Êƒ;Ñ,Ó`q*jÁç ƒ£Áï||Í)Öâ°S¯S VNù!e:ð‚ë½áç¾Ë®;t~+‚ƒ MwŽ „U^ol£áŽ;É5üs`ÿh$¤ž”Q K*ZàIµ:Mˆ¤ºz‰ÍÙkòoZªÍЬ )¢9 ˆ°=ugÙ”c* ‹Éf²s¢M´ç§ä§ò±ApÑLL$“ðh:ÿ}ƒÒ£¼¥ìî mÅkNF>í¿ÄûÛÐ_•—>øèæ¹SŠ!?±ý_¼uÏÒ •W«æ(w+_?r¬ªFË*Â^ˆrû=—%æ)L‚çŠãW†\®¸ò8ÁO‚‰x½1ˆÌ‰ É®¤ø8 ¨¿òlŒ,œÝžlƒ$3±ŒÑStlàôEÅc#šî¼©æÂCNzŠ£';=Xú™Œ<€]2J>Êò·Ãùñ,èÁaÁ ¶ÐV%æÌr–8¹/Æ]%Êm+yrñü§K”·ö?$Š+M9|‰°Wùí0Rrm Ò¤¼atÝæT¿ õÄ%ªÇáW‚w°£Û<Ó!y0èyHËDÁ 7›8#\$Á`ЗÛ-Fuˆl³l7¬×%ˆƒÝ«7;À#½fZ:Ø=ÕÃXªcÃ8X´l§ ²”±l‘­²Íƒ<ØcñX=6Ý‹¼ØkñZ½6¯ÝÞˆ©Œcƒ{"Ÿ–³bêõOÈ-,ªO˜wò*çd7)ŠO8t`è,ï=ºz ÏU@üdúžgÑ83SÓ½QsÃhR“ºxÍx½u4uÁ¶@ö’LË”S4qq0‚‹ÏM\l#ÄÆd.£B7ÔSÁ_®IÞDOfz²Ð“ž¬#ŠàДã|Ú9Pc ÖtÚÍ¢Þmú[që“inEh_zn}ìwå+ÝwÔãǹG†ž.[’8sî#wqÎì»ßçÝ{V õVùÊ\¡—ï_U€î÷,/¸€“ó‡}Î̓ TËÁ5-KÍ» nÌÎdì{9Ê% KGF.IÚáÚÚ/MÛmëã÷æI¾Íšá@¼Ý•å¶‹æBÛéc4Ë-S}u^Ê×Ô}•}— ûŽè3Öi%–º ‡À(&8Ô<9&£' ËŸ{Ñü†S[×ÞWšŽƒ¿.W®Vm{~Õ´¥-?üwýÕ­Z±õЪçšV~}bÍGþþM+›œKRþ"»qâôi»ñ‹Ç[Ú?ÿE['å×h´Ö¡OdŒ¼Nx^ܤ\¼­çÛ9‘ƒF‡x³È?}êh4Ù`ÄŽæ·Ñ`n#92ЈNKø¹pÛ»Ê]`meʼ÷Ì>1NyO‹1ÓÀ‚Poä{œb0çã½é·5Ÿ¸“ÌécëÃÃÝ4Qˆe–çñY™ZQAÐûáçÄé+–µ(Ÿ>üŸÊG+—ùq<Ùpö…Õ¡¡cÁ.Œ”w7ýGóÚuÊ»WþÝYúÙÞ¤8âDz.’£Õh¬F~/)€ÑËm6éƒ"nEíq½d2ZˆÙicŽW€bY­æ8Û Õ•ªn¥ø, ^ì(¯Qvi¾ÔòÖǬ'ÅiÖã1xu^}·®[¡E>ÆŠY]O=)¤%|mÑ‹ +Ív\4Eyó ²ûà/ŠÙr>ý71î³ÒÙ‹‡ÑÙ}Ä‹QÍ‘GÔ WX Ù¨-öèÈ s‡L×PÎo¯á¶¡:=ó6PñÒ´×à’X"§%àç«ÔŠ@=p o) OçZˇö°ZÒáO•÷i%€ÑÝP¹<ˆhg±òfX1'Ð ¸.$b+ (ë­ƒ:†Öß<ÒÙN¼¦ñ6ÆséµSA=¡~ª™x.‡›Æñzˆ œ v‡OJ¹é‚²+§ÛIsλqדÜj|óÙ'”iÂÉ3÷ó+!S Ý\ýùϘ”gl iC&³É¤@^(#ÛÍjþc…äR šÿÄT0çËÎÙã9ÆÔú:j`̃håNf.™©UúÊ$·jt½±ùé‹ÖûCûŸ¡ƒ1 «ÌĬ>IDˆµŽDC"rËÑ6CÞ– ‡\ž— BŠÍÀ%º’ÆÒ2Æ%¦¤„¦=Pw¹e>‘tÓÆíævÿòlÆå¯¿¢á;0Päõ5ýìΫ•Qv)«ùÃg×ÖøÑÃ8«òÒKÿzÛ«Ê]ë;WRm‰ƒz`ø‹ è1Oy‹‘ÏH×8ħg¤—KÆô ÇíˆßÔjG;ðn¾5Rý¼t)غ›RhÑ]™Ç¶ëŽ¥N;š¾©nLV…ñÛ2&Ûqަ7yÌ$óP^Ô$Óƒ†ÕÒjãêôÕ«åÕn×éóÆ{BùkãÖÆëh&Ïr>*¸ œag®>«b,zi^_œÀo˜üCãê°gUÅÛ*¿W>¹qºïýÈš¿âèý8ëÂð+ŸO--IÏŽ3MÚ±å…w³³±«¬|úÔì¼xSÞÝ7<óJåV5pëp+•xR-;Ì»¥ Ê•`2p%ÍŒ-HçDq4—¥{7±¼8ýÅdLrµ$[ݶÙ¶–ÂòÊæß4û±?ßpeýþªÒå_®|«|lêÄÉO-=è½7¹ø³'{·OQÞÍÈøüë1׺¦+p²ÇÉ€ü: ýÄ“Àܹø$°÷r! Y¬Æ°ÃÖBÅodM"zG…Å}Ê—8Eù§á–Ü¿¨vÅÂ|qñ”ºíKúê5]gÁntÈëIãé¦ ¡[0å"uŸÎ)ñ 2±Ëæ$.g®¡hìn¨Â)Í.Øek”«ùŒ«ùphû³T¥Ñ•.À¥%ÑBm´H%/­¹RéS^õY[Ùò >øâ®;ïš²ÿž'7õ/}¹£tíÇÝCÿ 9É{Ãß*æäàü©e›Ú—/ÿ¶ÇW½¤ðœ,ËÜñåwPY TNÀ¢góÖŒt}Éã â¯Kêµ#|ß›ãG`L±dd¦KÌ0Æ0¬™”s_ÿîüîà°ÓàrS™¡L*3–™ÊÌe–²´²ô²Œ2¹Ì]e¨’ªŒU¦*s•¥*­*½*£J®r/ׯ0¬VW˜V˜WXV¤­H_‘±B^áî4tJÆNS§¹ÓÒîlëLíLëLïÌè”;Ýý†~©ßØoê7÷[úSûÓúÓû3úå~÷E2`k~ Ná¢nÆpÒÈï`8¡ö’5ïo½o^hïïžV¶+Çw(^ñ5gÖ_ýÀ‚÷<úàIýÃÂ娅¥+–””¥L(þõ®(ïLŸ†+UwÔ—^,O(8rû'Ø•¹À°zzÏ!3ºÏ3›‰ÚÎ Ï J1ž–b|9"F]¯€IÁ(APÅÄ 8Þd?u”¾åPcû ¨@ç ,Ê?רM£oaºiCÕÍ'3ÐBÄ¥# L2°-Ê’EíÇIª‡>Ç{BøWOŸœvrš²sú·‚¿yhyôl­ò Ø» /ˆîVn`11Ýꙟš’L\Ö„Ä„$kbb‚Þa2ê&“Q‚†Áa4Ë] ’õÄ^S]¢”˜êJb "2˜œ‰fq$Ú ÷ÍPôÅšÖÇfõ&¢½j?÷½|î{¡Ó,§¿4v{óûÞ |¿ë­KêÏûZˆ&ô£ï…¶­ sí÷äŽ2­®x­ºZ/1˜ÿ1ÅÕÉÑ0N˜:&LÒE…·™ÛÌqs…eB jÁ«ÅëÉõ¢n´Û‚ìÀpûP—r Hï+b9³ÒR‚Ÿå>ä>@%z$®­á9„éËè×Xâ 6B£N.R6t#÷ÓùáG€þU@¿ {ª  DÒó:¨“xU½ÀCj|!Tþ<¦z jàõjŸ‘ žÇë%µNªöz“`4šl¯ÙŽžãËô1~LΕ±ÍZŸT™‹ÀFYT#«!ÇrH¾X`˜B摆Íd»Á$é$}"/Ä‹P~ðÄ|]þãt4ÌC•x?Wœg˜'Í3¶ Íú6CPÚÎo–’µÈ‡Ýp&Àã•?áÈœ…¯Q8|¡rã!å9ew1—¥<Ž«‡>z7){5[Ñ}DðoœÁÞ¿¸ôî$!>!>Q Óa·`ÖÇ›x FÁ*%ä 1GÊÎb[n'ÎÒÌ”:¶Óý⢋N©Õ`höÄ|ÿs«fr6Ûεq6bãm‚M´¬l›d3ÚL6³Íb³Úl6{ÑD{#yßFZ:}ôÕíy^ã |Ý[=»~n0\£Ü¹†$Ϝ޺ŒöΰÕtIióiÚ[ÝúçZ#ÈÖ®nM_4…±õ'Y¥žïz››¿pQÂ…3»“½æ½ÂÛGe‘ïˆ&iè6O™•OCi 8­œOÖÙVÙãÒ“úþ¸°™[‹êÌÞô4;(p¢“0œ!)lé´’:}—¥¥ùô—rÊÆ¶1csÌ®ïø$+%Yéph˜#ž·­(kðjòëÒ¡µ ¯˜ü1æ”åá‘¡7;ö>wëOê_ˆ@¨úø¯&ó›O+ï(?›RŒ‹æÏyàZïšúõÍð°ám¬²’Ð^O…äÐKP]¢€¢/ºõV°eÉjx»x‚é}¹Ä£^=_'r4¸‚ËÃÈ`‰FÔx©R‰¬1F<ÒCõDOõ$Ý"eHR‘4SÚ.ý½ ×K†C¾t­^diõÚô ä‹¡GnWzI5~ ë•ÛÞ±Û”/ék`.ƒ›ûÖÞ€6z.‹~Ôn\ƒzjóÔzº#Têè~œŽn„Ñ,Àh‚¨¤F7äNŸ>fÈà—ÊÆù¥‘ëqú£I$A‡ :ö╾FÃìÝý£xÙqÜiC­òÐË4¯9ó /A^#ù†â¼WùŠ<': Û—=VÔ¡k· =æuz£‡ þì±2{»`;;0»s¹i`bn޳Ç9¸•Êû5‹Œpæ'OW¾:€gîŸE8_yeè>å]ÊIê±+_qŸ0øé‹®µ[tz„y›Þà=qÌ>=ÁoãˆÛá°Oå ÈYT=¤(ï~òïÓEÇýÊóû”?ýRyO缸xΧßq (̾€h0õxÜÎdZen´¡p‚Nµ…sü©Þ<§˜M§‹83bjè™üñ ÍJ˜YÐ fytGHõÜ./¢Û³^ƒWò½ ÞDo’×åMö¦˜Æl[kÕšöÙ5™Ñ׃ÜÇ=·­X²fggŸ¾lÿ¥GþÝUó@ãSŸ*w*§†•¿ý¤{ž÷ÚªÃ܇ÏÞ¾¼ù雽-ÜëÊ@aáËO”LyçAe@¹$© ‡¯Ý~«L9:cxég_1Lò89º¹H9‡êh* ~ÍuÌv”‘xú˜º{­¯J fØñ·³ýM8ùÏN °p3Û«-ñ$²l´”påxšBA:AÓ‡cªž÷’»uÌ6&ð-Ï>¯l" C 'ß=#òG6$̺Õ©Mèž¹Ô¾%%F€/$fJVÌ zVep-iöU}çŒQO_çëÕO:dŽf2` c*ý8kˆVúã#QÚ¥AÌf ÍÈ ÐyD° U‘#”aVKŠ˜£Ï1Îæ‹s—™Zø6Ó:Ñ÷mѼ†¥6{ãp-NÍÇK°WAÊÕ9Ÿß yŽB¸!Ñ™}„; E5AÁßϾmÍBE(âÉN2]Fb8õe‡þtï䤉)&2Ái58R&:ã‰ÓêžL?_ ZkûÂ>²›1pÊFwp˜ÒÆîŽi™[Ì«†ÉL›'áyõÍÑv(yµÂT7¦M;†;Ô{OKCßÝ­ÊáŽv¼ç`þ‰ƒë#Ê]ÊKÿ©|þWÒ²ayü¸»ïÔùîé­kÚ4ñÖÀ«;´ï–W&ííÿwåô‹‡îý.©¯iN}_SeXm=Xm)Xm XífO†.UB«p#Ÿ–ø°KÊ Ûü.ož.'ÃéÌqšU›µk„£„Z¬ñ|Ë$~¾=]gÈ2…Ì!KÈÊå„rC ¥j\ÓÞU‚ÝG¿DÌÌÅ1ß%ÔO»ŒZnÒ¢ûŸüqê0NüÉšuÊ3¯]ñ8§ï¹í²K×ÜÑàÆq T»Åqا| |ûªró6°[îógw^Þtä&oKôKŒù  ‰(eB-N7…'€\`p&ÅÇ;ÝØÞ‹}I–SLß)–Ž|U'Òÿè·¢#žqþE}y©“âìŽ%õ5k'¤OqØµä®æ€ò}­œéljÅ©‡ÿuŸ¬\>ó¾®å»¦u—_^q iÅži¡vî‹—”ën¹íœ€…c¸ÿ¦»”O´úêÔWzÎS¡ç z¾\„(M¨»€ˆf€‚R/èôPÎsФ_ Iåz°b²µD˜ÀAŸÈ#Y2Ù&‰¯N%ž®ÇlDãµU¡Ís‘‰³+Ýy‚ü]0äë*¹K¹ÒÌõqÝÜZa½x'÷3ÎaäLú ô•\ç‡î^!¬¿ºìí%˘i\ìÄm÷ãð¡^ü¶ÒªÜ±Š~¢tö |çÐàÐü‘’F=íñ‡À‡Ð:O)¥/¤þQDëIP0Я-(aQÉAÎñ’ª²ïM ÄTØUQK>—K¡UŸ¬/2òÌ×èhRŠÝ7§ ÍåfO9›XÄ=;t’÷íFƒ\‹šyð4óP•'…sH _¶ åêf5‡ ½\âè.Ä©ñŸléxšh E³g¾kx˧ÚþÙmçtýæÁWž½ÂzÑ×(CϾÒ?rÄöYô‹ýáÊ\Ýìm´^û÷ lž®“2vôÃþqú—ó¯£aj à¸ãM½ŽG†„N¸F3Åè@xpƒ¨@tÁõ94ŠÎ,á<ÿ- oÁܯ ï0Ú}ùìù&èßpû`Ît7ôÏïGü (ŽUÃz6¡5Á /  aǰ"æ£Ý7°ÌJ¡Ö†ëR‹J„üáGôËà~J§ o 8‘ƒh/98|úZ¸ápݧó£Ãp¿zø-jÑLþàð‚‹J e¢>tßàµøÐã¹³$—ì$¿æ7ðß‹„×ÄRñ_u«u?×ýCß©TưÖð¢´R:`t/3¾bº‚×Kª¥ÙòWk£õëû¶öÙöß8 ×:~å8å¼ÂyµópÜŒ¸ßÄ{âïLˆK&ìÓ8^á€0~slcQ>Yh‡;ú4[FäR>"#Œœp‡µY&´Hk$£åZìõkmÆÜ¥µE¨pÐÚ:Xû·Z[,è+­mDI8º–ÙàÄIóP´£ˆT µ1Ê•îÕÚJ’^ÔÚy¤÷µ6<Æ4­- $c£ÖQ¹±Wkë×ø˜ÖÖ£T“Uk!ùˆ®eväš f‡ºû{‚­m9¯9_.ž<¹Dnê—g#áHOÀ×Y(Wu5O’+::äZ:*,מµÿ¤‘1ò²@O®óu…g…:üò⦎àšÞÀyËÿ•絎€/§Lš2yd,JGN¤#Ï(–}r¤ÇçtúzÚåPËxbFÇÓ»¶H¤»¼¨¨¯¯oRSôÁ¤æPçâ‹Y:cÌÒ%³d––z:ƒáp0ÔEÇ·z°^k¯+ðÊ-=ØÜæëi Ê‘ìëê—»=a˜jŠø‚]Á®VX§§##m¹%ÔˆùšžnNDÚzG°9мÍËœKGdæ0¿ì ‡CÍA¬'ûCͽ®ˆ/Bñi vÂr…È&Èu¡–HŸ¯'™Ï0é t÷„ü½ÍÆÒ‚M½‘ÃaÌ„B9ØÕÜÑ맘ô#m¡Þ ÓÔ¢ã{TnØÞ0Œ§äÊFuw/ˆ<ÜV³F!]³(Ô#‡ T5òÇ-M‘°Ý”Ñul¡¾¶P繨Zz{º`Á›èÉáP¡îmZhŽÐ•Ç¡>JPs¨Ë¤t„Ë©@ëᡯ)´6ÀhPu‰¡0¢]¡"¬öR¹tê€úL·ù€¬¦€Æ7@$Ø%ûÆPêÍè‘;C=ó.Gú»->XhR­±Ï;}ýt…Î?Ø¤Êæëˆ€úAÀúü~F½Ê>X¼ÛטõvøzØRþ@8ØÚÅiíèïn ÓITK}Í$LgD1 _IÕ:¿Ê4_Çùhs¢xŒBôº:úåàUrzô_$²±´¦¬¤²‰šHô. "ßêñ‡åÌk̤kGÈ™Ôx35¦tª5«i €=Q¸½ JÂÚPpµÀºØìëî#ó5uè•z€=N0m¾ˆÜæ Ä@×X®Àr£:î—{»üÊ™c}K¦Jã÷K6LÝ*,CEGå“;¨›‰ìö5·ûZ4°Ç®Ðˆùñª5f)p\€d £EEk~¥VûTÊ»Ù**ÏzŠÍ‹RågØR™uÅp¤ÆQŠÚ´¾ž_êcZ¤êptñ< ÿ M±¾Î?FÓ|LN?ƒ±ëŒçÇùp+ÔdÞÁæ¿Ç«÷h(Àðê7ÚÑʨ݌"Í߯p¾Qågó3Ï3Gè?ƒŽFÞÌqš¦ÚNõ¸XÓÄl?ƒo¯fQ)¬…§Áóp-€Ö1^wiÝ ‡É|Ì»FfÄÊ^Åûû-¦y{™]ÃŽ¦Mß­+*uçóãôi/5–Ëçã¬ýX9þ¿Ølx$ûôiÞKµº¨EÑL¢c$éÑfŒ…ØÍ4»έšÔÔøØÅø;>ùŸðZßMU“f+->¶ŒáÖ|TÉÖZŒjàŽ®µîêÑeaÖ²gUÐ'CnW O–ÁÝèÃäSÁžÐç™Ì2/ƒ6…¸-e°Tµp¦°—#™Á–Ù=½[ãk[‰Ø•­Ž¬e°Ao5\+µqtÆlèY ÷´=ÑìT]¯fÕ3¢ó(.*¦õÐ?ºêX¬ªØŠQÌÁ]-ÀŸ¯=­ØU Å¿qжkFðœ«aZÁxD!S˜³£jvG{—Âu Œ«cü¬`4«ØÖ0æÂs•–J†* £Ùp]kÓó¯z†]©^YÈ(¤ôÌaóéª Y¯ŠÙbMÊ´= e’ÆKÊÿe#+×1ú«áýõÐSÏdSð£p£º3AX4¢GK}Œ‹Ù ³Ø3ÊEÊÏê‘‘µ1R™ÍøEåF1ŸÃVª`©;/%Qhc¥s>툮0ÑWÉ8UÍF×+a|ÕHªUŒÖÙoU˜ªÞ«:QÃÝÙŒF*ÙKaÕJM§*ïÆR¡ZÅ” UÚyv ÏF¥_£Iwöˆ¬3-;—+—1[¬d£*˜¬ëF¸0—Ùï" ó¥1•ãRM?`6–¿Q;ŠŽû1¾C…]{¬ç0}ªÖ0¬áÆÃõ_•ãšYýñßc#yl&9𡯿¢…1>763P½ñ<6¶sܸÑ^ÕO«ñk´ŠÍå¾oO@ÍñG3áh6¢úpµVŠÍ„ý,gWsÂðH–¢Æ‘ÐH¦ÒÇžŽÆwµ:ìd#bë¿0[W¥¬W›1–šgúXæ@W Ÿ‡›ß©ÆWŒÝ,ö««ô±vDËR(}½ÚXÚ¿~\•Ü3®Êú!Diù!þ÷0ywk5Vq˜æ—“4¸=(Z¯ò„r …=ë'õQí£ÐÊÑø¼”ò 5s¿&ñË/&Ñ÷åhøkø¥±ÿ3à9Oq›=ÃVÈûvò^y÷rá]…¼SNÞö“{†üI!L'']ä„BÞRÈ¿*äM…üA!oüÞ"¼¡ß[È«¯l^UÈ+Éñ—oŽ+äøQþå—– /ßD^ÞÌ¿ô»\á¥åä%ÿ»\ò¢BŽ ’òÛAò¼‰<¿™?ªß ’ç6’__BžUÈ‘§ …# yº<¥'5Oxr#ùÕ<òÄ y\!¿TÈa…üârH!¥“GòóG$áç yD"xø‡’„‡‹ÉCyp\ž TÈÏÉAòÜ< ûò/ Ù?HîÛ—$Üç'û’Ƚmé½~²×3|OްwÜ“Cî†Áw’Ÿî‰~š@öÜeöÄ‘»ld÷Fa·Lî4’]wä»É0ðŽrûÎ8áö\²ó6‡°3ŽÜæ ; G¹5Žl¿åa»Bn¹¹Q¸årËfþæ›r„›ÉÍþ¦r£Bnð“ëlÂõ ¹.•l»¶\Ø6H®¤×–“k®N®)&Woµ W'“­WY…­vrÕ“p••l1‘ͰÈf…lRÈ•ñd£ƒüD!²^!ý‰d‹ô%µgí é…Kï ‰ÀøH Ã%¼‘ô(dM.éVHH!] 锈g¸C!í«-B»BV[ÈjÖIÌhK'­pi$-+MBK* (ÄßüŒàWHsS£Ðü iÞÌ7]–#45’&ïSˆ÷ŠI‚W!WL"«`âªtÒe²ÒD.‡ŽË’pY¡å@þòÒ`#—åe Yªz…Ô)¤V!—*dÉâaÉ.²8‡ÔØÈ"…T+d¡B ’ªA2ß@æ{ø¹•„¹ ©<@æÌNæ ’Ù)d¶‡Ÿå'³<|ÅFâQÈÌK …K ÉŃä"…ÌPH¹Bʦš„²br¡BJ‹Éôi’0Ý3¬i™æá§–HÂT)‘H±B¦ðvaÊF2¹(E˜ì'EpW”B&)dâ ),p … Iô¸Èp¹`!ÉϳùI$o‚$äYȉäÚHN¶EÈ)&Ù’•i²âH¦¸­9‚{ÈXäb’‘D2<|zš$¤[IšDR $Õç8Ê…”]$†&û‰K!I~’¨„xgâí$ÎBœ0ƹ‹8`Œ£œØb> endobj 150 0 obj <> stream xœ]“ÍŽ›0F÷<…—ÓÅlž‘"¤ ™HYôGÍô8)RÈ!‹¼}ýÝÏm¥.‚Ží{íãß¼=ìÓ¸æßÂÜýªÎã4›ï¡÷êä/ã”i£†±_ÓH¾ýµ[²<æ·Õ_ÓyÞl²ü{\»­á¡ž¶Ã|òŸ²ük|§‹zúÑãøx_–_þê§UYÓ¨ÁŸã>Ÿ»åKwõ¹d=†¸<®ç˜ò/àã±xed¬©Òσ¿-]ïC7]|¶)ŠFmöû&óÓðßZå˜r:÷?»Cu - «›ÈFؼƒ-¹—Âå\ ;™¯…ë ìÈ’ûÂøð«p%ñ[ο‚ßÈÜ2·ïÈâóN.Á{ÆÛȺ æ5ýöÑôwðÑô¯˜þ5ÎÕô¯qük0ýKaúWÂô¯eÿä/çÒ߉Oò¦¿•xúWO‹CÿJ8Õ1†þr ýË8Õ÷2©þ¸‹Iþ¨³¡¿ƒ³¡¿‘\ú;‰¡-óô·²'ýKÔÜпÄÿhèo$—þçZú[œeéoPOK‹š[ú;aú[ìcéoeú[¼ ›ÞϘþn ¦ÙÊcN¯Ï}÷§]T!¶Š4§ôºcœüßþ]æYòû Éið} endstream endobj 151 0 obj <> endobj 152 0 obj <> stream xœÝ| xUÖè½u«ª»«÷$ÝÙÓ•„B”Ù!$1 šNÒY0IÇtLjˆÀ8î2ê¯ àÂ"ƒˆˆE@E£âŽ ã6èˆËhDãhHŠwî­êl2êÿÞû¿÷}?eWßåÜsÏ~νÏ`{‡™ÐjD§¶ÅÛ6Æ |z!V{ePþtÒþAûc„¸Šú¶†×Ìöƒñ“涆æåõEw/†þa„d®Ñç­krl•Õ óSa DiÕA¿ú£[‚W¥Å,ÿ!7À ýÍþZïÁ]k…þ_¡i‹÷ª¶pý4¡”iЗ[½-¾gÑïwÊB„\\›?ä°|¡ü%t¾­Ý×¶xsM/ô¯AH÷Œaxè?4EÚç/ˆ:½A2šÌ«ÍápFFEÇÄÆÅ'¸äĤäQî”ÑcRÇŽKþþÃõx®G‡Ð? }Ú†z‰ qðÔÃ(ýÞ«PÌ×äþz\ß-üvÄÁü*þ @ÁáI¨]-7¿BÐg°z ^+ —Ph¶Åõƒð"þNÈæ²ÑB¾…¿€ß˯á÷D_ϯA]ðÎæÞâïãWðGùh!¥ —Ð¥mÂsp2ÚÄmÂy8çqo çý³ð&ÁœpBŒÐ%òõܨ_Çíà~Äɘƒ' »@š—’7øjþeþf˜é€ÉM".2ÞK(„po*>ëñr€£Ï ا‡{‘Û<>‹>¾`wn ·‚Û„>Â{ð ¡ëñ¾ZWÃÇ¢Mâ&~!:MeƒÞâÞy”3yÜŠn'¢x}GJp5¿“J ¹…çÁ usÄ0´ÏÑ]œ 2­@0û*FÂóêPz1­çG“€vŽ[’^ŽÞà²I º=wáýè.´Cñ¤(ð„Ã(M¶uqîâº.ÏE åW%ŽOÑ•m:¹ •w™—ËûÏ+_ÈÇ ‹º„¸.âÖwñîäOþÝä'ãÓæ–/”÷ã1ùyÚüê<¬\MÚƒaÏÏO-YYÏ× Û!‚éëâq Ð(â”'±^¸™ãÑ„îã=‘íxÏñžŒp{¢ÝhO¬çQ_€Äö}¦¬×Y~ü¾]L¥±CBHX6¡Cz,"w­åñ4âDÓ=,ï,Îôdfà¹]RÕÜ.KÕâ…Ï ý¹Ã°Rgš}ê´E{=¼4¶ $T+ve•bN(-å÷R?YxîSþ%° ¹Ñýž±E»Œè/‘GÅÍ–cvùu×kq›“Ø7˜Pr$‰2ÌÆ \Ä1#ÅÖ×Ó ûgÚ³³³”SgúÎôØ>?ýÃéì°l{Xv†§dÂè ä gž'ÏK\*/Ml•[¯•¯Ml}›|[âýòý‰Ê&>#?“èÈLÈpå&x\• å®Ú„j×õ «]w%ÜáÚ–°Åµ7¡Ëe[Š—â$Ñ᜔9åì¶'fYprRJÖäQ‰“²&§$'‰:û…x’ÌsÛÚ®X|‘ïܤÜS´oÍž÷°'½}Þø2NiÆ?–ÌÉ›wgKêýkvÔ/}mÛKûãæ—¥§c{\ü·Ô÷Ï}*\*F #ŠCÓ<±âVÓ1+ÚêØ`=û`Ô±h2;Ìe2˜clñ ‚ÌÌ3T§zN1î3ö•%T'px©;sŠJL€°Ld·! x´AP`ùò@`ÅŠsöuÅ’òÃÑŽ}s”M¸þ‹[¶ì|x󿇹5K•§”~xžZZ³ ȽA“ „§Ðƒ6#oc†Ð“á1” ÕB›°ZàUïÆõÊ&1â§MË‚ÄSŸ‹E¹žDäø+6¼®?.l6áw£6‡1mˆ‹upz‡åqfëŒ8Àz¦§Ô¦ œ²)gNÛNggì›?+ØÃŽÄ`jÊT;¨A¦¼%ÊHPõ H}Í÷ÝvÅ7+W±SÃsqÖã ”;:«gã&Õ_{mnžÒ“1gáHˆJÓ•îª_ÙÑ¢t4PjD‘h¼'\܆¶šŽ„mˆ2̶–ÙŽQ@å™Òe;ñäÔðYÑ…ádˆ}€àIˆ&xsÏw®\ÙÙqÍ58ç+•“Êß”§q!YñÈÖ­ÐFÊ+J<¯ài8žiTÚ£!N­i‡£jOœMÀ&ýVoFZÄ'$.\‡tÁlη#lÎìé›Ùݦ:BfЕ êšæ׌`®êšƒMgÓ¯Ö­Öó N\ܱòóe— ¼ÙÓófàØåS§á­Øùpë´©ÊkÅyÊ_~¡ü˜W¬Z©ŒDYž(3¤7郰cŽ#¶',˜3£B»ÙlµQ%ªž3óÔ™S=4†d쫎^Mm œÛ>9e4¥DtP‘8¨9…0eƒÙæ(Jo[M]å¢'[_x•ÛÕ¿Àï½³5&yô£ûßã«·×,=Mµ ÚÛ.<Ú»ÊcôV²ÕŽŸÐoE’Þhà <2ÛÂ,U6PÜ îº{ÎÌ졪Πª³U-žÛe§¯°ó+1jšN« bµYíå\9)wTsÕİQFà‰p΀„*ªX;7 _¡Ü~á’ýÊÇß»Wx@yáRÜ¥SÏ¡Çã ^H©_Q¹d8}èñ˜MœÅ8%Á•ÀjG—¦¸\ nɘàâèu|œxÝq^§ùxAHû¯€ïÊõ}?)×spÉÊ>\Ò²ÿy\£<²ù4ȃµJhŒÇAöðÜa­í1è£Ä‚¢l…ôt«ö á”–”‰vÕ”öÄïp•ò ^Œ[qÕÙ,‘—аXt6KùAѤ⋪§Ýæ€ÈaãÝ–#†'t’hFz[džLVØêë¶³ŒŠ ¯Í…!àCaç3Íá‘¡:’ôLX:á–u4Nç?±2lì2Áéxüý}|õþV¨/nÏÁ>iöе‚å™>ˆ8¹Á†Ÿ9n5Û !_ØbT¿aµ$×Ál»šf/¨¡°œ‘jØð¤”-¸‘³Ø…/h)tÑŸZ^x ïãv·-V¾I¿±369e÷F.õì–mZÆ •pÈ$MõݸjyÝ|\Újç·FB\ÑÍ6£ˆóéE3ö]»*–¹q(œ / €eßU¶þ¡‡ÖWÝã©zôbå-e^€',|âÖ‡™Ýÿc™•\.<;à™êBìª÷t(Ρ'ø9CRµé!s1ý€phñg¨6´VøÁrŸ€ôÃWŸÝ"F(oÆl|`´?…v©…Ä?ºî-jðuÊJ€Ý†ª‹(´Þ“ŠâyÄΨxAàÝB²Üa5î»GqQYôN޵hÛ‡Ý}Ç©ŠìÙVIêÐ4£3µ¥hfKÑ(Z³%O 9Ö96’d‰¢"##£’PRdRTÊŠÌŠšæ‘QVš=(›øB<¬þwDˆ:®”»óì‹\bqÁÚŽKÞ¹úwÊÕØ„S¯=‚c•Ïp,þdöµyM«ç•à¢qã{Þ¾úíÇÁhfn_ÓƒOȨÜãCO[ŸŸŽYkx:JD:–`²¢byq&˜œ›ÎMiCrÀ–ZUe«9Ó J²%MH*O¥`ÐÇa{x¨0$¼TýŒh¶øÒKŸø{°#Øñw®èš›”•wú×p³Á""ëÉ]å¥ó.Rºû5µ^¯²œ‹õÂÚ¿N:Ú²QÍkºl Þ„ÞôL"Stz7szúE8HâxŠ$Ü’Ž#HOÐóFÁ ‡3³ ‰yi"‚ª±OeB ì4ÄŸ/´Ce`%´2¨7pV½Õàâ:—ÞepHã¸Y\WÆ•èJ¤‹¹EºER#ç×ù¥uÜú; s]º.)†Ç_,NMl–±ØM¦ã,R†=¤P¿@¿ÈPniÄ Ä§_f¨¶\¯¿Åp> tN#&Us2¦y÷+\~óåneçe§r—p¢ïâêÇçõ}@Ügiz§²³™&#QºÇÖâÃN=ç”0Þ–Žœ¢ž!ìj=ÄžðDŠ7Hêc÷ü»•Â¥PµÑó× Oüàùëˆeþy"Î^v r_g;ujäÌ=P½j7uáC®“¸0ZI ¹¬ÛX±"ǰmýûDiû«:2•ÞÞi'°h¥@ƒØaÅ9ž\k<²B¤0™‰…ÖP„TpÔâúE8+@AȰº-g´Yÿ>AOج£A/@Ð0@ͧ¥TÁ v0½8 ÊÒFŒ!‡.‹6x´ˆ±þVbƒGæ<\9çã‚Ü Üjînîn ·c‘ƒƒ¨ÁçŽq5¸(ˆ @Ó z'vÑ¡%ŒGéhœ˜F¦ˆStÙ–lk>ÊÇsÈ>_È8Ÿx)B¼É|“ån½°^ÜhÞhÙÉí"»ø‡-[ÿ„‘ý|—¡KzÎø´ùiË+Ükæ×,¯Zßá>ã²C…¶àq8 t2 Gãz<#¨oS Ÿ¹÷hÛâÊH8ìöë¹ÏN9¸îëés]Ôão†šþ4xüT⇻à ë¥ÇÍ»Ey½ëñ¸Ýá]É÷‰RáÑp~v¦ØœÄá’ ©¶¾SÝÔ¸C5ž‚´k“Ópr\V85INΚ:´ëìS¦¨¥(9pÏýÊnå@à‹+šO4l|ð¡7m»ó·\»ôÙKÛ?n†¢&ñâýüº¿}ávãÔ)S—ÕÖ7ý¸xé‚KǦâY~îðu©¿°JBD<£‡âD$RÃÝÔ=éaê:éBåøåùK9Í6ìÌ,tÌ,tðhf‘†˜ItqåNÂ)9ì)Lj‡øuF½6ðsÁþÛ¸“ÊG(tÿ/FüìþÿÁóßÿ÷üúý¿ýWîÿ7Þºÿ#úwÒëœÁ*ƈ.ô„s‡õÏòh­$‚• zëkR ™ÌºfÒ+‡•Xy«`­:«¾Ü\mn3o6Kƒ×)võâ—›F/û_¡Àý/sÙpFYÞ#µûúsŸŠõkè/W™žpqOÚcºþr5Þ:•ŒwŒñ˕Lj¢#ÃmÑ¢gE ôç+õg—°,8L ùùŠÔw½ðB×ã/¼ð8nÄ”Feƒ²QiÀù÷”¾ž¯•>Ì݃y©Ô)ë”õJ¾/×ãûTðŸ0d@ tX|–þˆ¬?,aÁ‚ ¡»;tg‘ñ¤Í\|“\óÖþv®¡#·ýìô·cå+øìRµMo™£¡ÆÑ—#s–›Nþ×sSØùsÓ5ƒ%K- ¸z(Xh¹Ò5¤\9¦•+sßÁ- ›‰Ä;P8Ž#1| …Ç‘T~ šŒ³I6Ÿ¡/@¸˜óÕú«D8¤…›Äõh=ÞH6òë„MâNÇ2j0×¹ ‰ÄNÜ *pÜè%âÙ-ô\X]ŠŠx1ï2ëÌ"—žýIʧ_· þ%ŒR Û>B«Ç¡?ŽhÒ¢Äýs™>“οê…$ õh¡píæžE»…´{´° -$+Ðhá$ÀìE»ÉÛ(–-ãzÑ!€]"¤"—p'ú‚|kö¢-ü³°Ö ½ãÛÄhtH÷:$n‡ÏDØã#èס"áEt—¸—áØ-LEÑ{3›§8ïdŸÄTtH¿í"ÈO÷¦ð"¥µÖM¥61r!úÎ+sñx>ã¦pk¸n’LŽ’¡”H*…uÂGbŠX&úÄu3tpÒÐ?¢ÿÒð¦ä•öEã˦±¦[Mÿižh^cþÁ²Ì²ÆÒmé·X¯²aMRé("”ú×?PÞ‚½ °«‡ GgØ2 Ïé²Å(zX[Å£yZ› (t‘Öæ¡Ý¤µdBk´¶ˆœh­ÖÖ¡ ô ÖÖ# z[kaí'ZÛlG?fÌ ”LZ‚¼´ZksH/íÐÚeH{´6í¿imE-Z[DiÆ­­CÕÆ ­ ¹×¸WkŒ7µ¶9,Åøf®¿my{SCcPS›*gfdL’k–˳›‚`»ÏÛ’&·Ö¦Ë9ÍÍr… Ⱦ€¯ýJ_]úŒ¼À×î•+½­Ùþæºó Ë¿4^áköy>ybúÄŒ B!ÆŸgeS@öÊÁvo¯ÅÛ~¹ì¯Ií <í5ƒmÓ'LèììL¯ M¤×ú[~ãfé|œ›¥ÿ*IfÉ,•ûÚ[š&+…oôµû`¿†vokÐW—&×·û|tam£·½Á—&ý²·u¹ÜækÀMÐÛÔÚÔÚûÔá2Øè“ëý­@˜·øip lìÍMµ¾V꘤ ‘” Èêdo à¯mòÂ~r¿¶£Å×ô)=õM;€<†bd äJ}°ÓÛîKJe”´ûÚÚýuµ>†¦® Xkªéú äÉM­µÍu”’Φ`£¿#Ä´4iQøvUš€¶#ð”4¹ÅǸnë¨in 4¦ Ù#î9Áß.|  €nR5öGlM‰´mTÐAMtl£ÎFËÏP5Ôw´·Â†>¶°Î/üir £f™¯6HGT77û;)CµþÖº&ÊG`:UhLzküWúª-1 ¡ÕEÔQª—¶APçä@£تñirBšZeï0Ný­`ír‹¿Ýw^Æåàò6_½6J‘5|¾Å»œîÐâ¯kªo¢Ææm‚ùAÐzëê÷ªø`ó6o;PÖÑìmg[ÕùM ­Œ†æåmºˆZ©·èŠE‘;©VW§ ÍÛ|~ÚšƒØ€¼ÖæårÓ0SvÚ}ôÏo,m¨(©nB.â»ó©ÄwúÛërÒ€7&ѽCruÞ$Mh Íkj|àOoè²p¥¿i€4ßUAðÙÛÖNæ­iöÑ •{À=B1Þ Üè F_ëp©Àvƒ6^'w´Öi$' -I*¿¬ÙDIðn¦:ª(¯ÜL£øL°Í[{¹·XlõÄßnZö‚ÀDúšëU²Šò傲Ò*¹²¬ ê✊|¹¸R.¯([Pœ—Ÿ''åTB?)M¾¸¸ª¨l~• 9¥U‹ä²9§t‘<·¸4/MÎ_X^‘_Y)—UÈÅóÊKŠóa¬¸4·d~^qi¡<Ö•–UÉ%ÅóŠ«iU[ª¡*ί¤ÈæåWäA7gvqIqÕ¢4¹ ¸ª”â,¤9ryNEUqîü’œ ¹|~EyYe>àÈ´¥Å¥°Kþ¼|`å–•/ª(.,ªJƒEU0˜&WUääåÏË©˜›F),–+d’T9]\Y”SR"Ï.®ª¬ªÈÏ™Ga©t KËæQÍ/ÍË©*.+•gç+9³KòUÚ€•Ü’œâyir^μœÂüÊÁM(˜ÆÎ 8è‚ÂüÒüŠœ’4¹²aåq>È“*¯T£—ꈎýÜ:Š®ÖÌËÏ)„•”ŒŸÁ2ûÊ¿ªÖפö­9¹$Y@U£h³\5€¶‚ûªc¬ 6 þÅ2å†WiZ¦a,²’„ë®ôA$ Ð>â§A¥³)ÀüÒa‹_Ëo3l«  fz›aY`€ÌáNJŒmíM°¤³½)!EövÀh{ÓÕZJn×RÖHè.#éo÷Ú c5]ék^ž°í4¯1JšZëýí-ëL|µÁé¡X”ò:`ÜßÞŽr‘µ¡å¨jÜÔˆ‚HFcP-ÔÒ2Ê„ª6M‚V @Èh6ÀQ>íȇ¼¨¥Áh1jøthå fxdT1€+Àz>øöÁš+á]?Ç#£  ­Jx·Âìl ¬à´ü Oékf”JM 'ß?ÇÂÂ1þ7îÙÄö£­ ©ƒ™ønG—ØÕÿªlχ?4÷ÿNƒf$ýfRØÿn®éôSÎp¶0Œxûa>„¿‘Íù4þØN­€RIqÕ³YßÀ޵°‚ÒÐciŒ6?£²•­ocØÚ~À„¹&èÑOƒÆO­&ñÎ £‚îåg{«|×2¸€T±‡0Ph•öfø®…•­šåAI¨`GÓ ][ǾŒ®ZXãÕø“áCG:`[EgBò©‡V3ÓÅ¢qpê ”þ êdñ±eBGÚàí‡]:ƒÔÔ1‚Ìæj`6ÈfC{üûÒ˜Þ¨v›aUÝ€L:™4t[G%ÓÂÆ†rÂß>Ì6Uj;˜ Ó†h‡¶[˜>Cºn¨†;«Óþ i|NLíÐ °Ñ<€»I“êpíÿ2×!ɩԶ Xtp„Õ rÔÉäÑò›vyC=ðÐά5ÀÖ îXÇÞt4öM%± j>f¨S~ýL/ª†jÙÞuŒâ&ÒéZ¥­ôV?‹ƒz—¥ðóˆÐ ðAÍ#Ã`Cþ2(µ¡q`è:™ñíÕ´U£IfÐÞT‰4±uÞ_Ð)ŬƌvfE~MÊ¿Uãf9£·žEŠ;ýgÒú¥õT.Ëxha^ØÄ|:Ù(ýA-ú©#*µT®uCt?ÔúTÎÛØ.ªÌ:‹—­ qUǨ¥:k"‘€£5jcíCb©—Y‘já=FÊ(ð«< uuÃ,ÍËôôÛ)¾ÏHyœ¶4MçÍl]Ó/Dõv-ù]-Ãð†FVò›‘YħÅ;ß0Éw2®êØú¤ó䯤¾G® ð¡Ì›4ÂÒTß)‘kj˜ïû‡ÐÛ¡ùCH WÂlÓy¤æCW1Y·jݚɼ,ºúV Õ½J÷/{L#‹ö2ûh4ú˜5ý{[Q¹;_§³ j¸”Ï'Yyˆô†êñÿÆgZm(kÜ„¼.äQ´’h¨EÚµÃ1¶1˾Þ šÖÔüØÊä;²ùïˆZÿž«ÍW‚Z~¬&­"”Ïö*C¥Ð£{•A¯ ] f›+†1j» ˜Y½<ÍcúÉa3t>‰yæÅЦËÐ|†KÅQoŠ{ŒPÜ2ëÓÞ\€/\tm>ZÈöÈl• ²‚ឣ%ð¯Áѹ02ú´]ˆhuªîW «ª˜Ñu”•Ò*Üu8UÅlÇeó Wø‹´ÙÀ]ÌðQúÓ˜¤h»t€ÎÒ&#Š™âÌŠJXŽÎ‡ïr€«dòÌa<«Ô–2 `^å%ŸQ jB¥(¾Ëao QtU1*èNUdãò“ÇÖÓ]ç²Q•²2MË´=ˆ%]“¥J•ÿ‚+ÿ%ðÈŒÿ*©bºÉü!¼!Û)dæ ØÑ|Æ_“CÛa6›£R¤ò,€¬¢•\&/ª7JyÛ)‡I¤ò¼œ„° ×Îù¬#´C!ã/ŸIª„AW‚ó¾x`DµÇbÆk®&[§j÷ªM” ‘n.ã‘jö"Ø5_³©&»á\¨BéäBÕ@ŽöÎ"³Aí—jÚÍÐu³²ŸKåbæ‹ù *‡éºr@ Ìçi”Ïba!=Î×ì³l€²áò ùQî·ÄWhïáÌcöT¢QX9 _Ç;¿ò!ÇÕ²óOp ~ÏäC+ÉÁ uh-š6$æ­ Ôh\È`[FÀ ŽªqZÍ_ƒg ¡µÜ/Ý ¨5þ`%ªFÔ®ž•†VÂu¬fWkÂÀ@•¢æÿ@¥ÒÉfó»z:laC϶¯ÊY‡¶b$.µÎô²Êî84)S<1¶±Ü¯îÒÉÚA­J¡üuh°tüê§äö§¬_ÓAˆ—_“;Ów›vÆjb¦õeº†·…Îkƒ2¡¨gs-#´>h}Ût4².¥2hBy¦q?«/ÒÙoÚìß¹xö–øÙ¿œßs«q RÁnd‡÷(œûxê…^2rÂ;IKbp´M°Ìæ]è ¼`_‚ãÙlІw,J€w ‰fï(öŽdo'{;p²VëÑ6Áá¬ÆÞVlA+aÞÊz´M°›Ðm0ffcftñØ„O6C0ýÿÈð؈%”ct†ÀÛct„`[©go2±7]!î½']È Ç"ãK`ožAÆÇF0{#Ϲ•äÜ…DQHßÙ4¡O!gÓH¯B~ú±Pøi%ù±ü«—ü *äŒBþ×Aò½BþS!ß)äÛrZ!ßôHÂ7 é‘H‡ÿú+Iø:“|%‘ô’/ït _*ä‹^òy/ù :Ÿ)ä”B>UÈßò‰B>VÈI…ü­—|ôa”ðQù0Š|°%Aø Ž¼ÿž[x¿—¼ç&}Ë-üµ—¼ûN„𮓼sÂ&¼ANØÈñ·Âq™¼m$ˆ¿ô’·ÿ[nrìn“p,™}3B8šBÞ|#Lx3‚¼F^‡é×ãÉkäÈ«…# yõ•¥Â«É««ùW<ç^v ¯,%¯xø—ÝäÏ y©ŽtßaºòbyA!Ï+äðsӅýä¹Gc…禓gŸ‰žÍ$ϲ ÏÄC­Â!;9xÀ$´’&ò4lö´Bö+ä)y2ŒüI!ûò„BöF’Ç£I—“<xë%{àkO/yà%»ák÷JòˆBv¥‡²S!)d‡Bþ(‘í yp›ExP!Û,d›‡ß ‚ÚÚK¶À’- d3|mî%óÄ‘ûrß½…ûr殮½ɽ«ùM·»…MKÉ&¿Q!À:6(äžt²®Oðœ#ë`é:™Üm"wÁÐ]sÉÀ×(äNÃNr‡Üî&PÈZ…ܦ[r‹BnVÈM7º…›r£›Ü ëòûLrÝzò;…¬QÈêh²J"×*d¥B®QÈŠ^ru/Y®Î+w ¹réÆ ½$K½¤}%¹B!mþ4ÁŸFZ{IK/iî%—+d™BšÒXk3IƒBê3‰¯N| ©“H‡¯­‘„Z©‘ˆ·Ú!xדjlªä2‰\ª¥ Yý% Y|I¬°X!—@ï’X²H! {ÉÅ Y}Ϲ ™¯ªRA*.Š*zÉE0qQ4)/‹Ê{IY©](‹&¥v2/”ÌJdî»07‚Ì)¶sì¤ØBŠzIaA„Pè $¿—äåZ„<+ɵÙ9nav/Éœ9nâ™e< ™u¡E˜e%ZÈ3ÍÂN2ÓLfÔ‘é ÉŽ Ó25œLÉŠ¦¸IÖä!+†dæ'Kfar™¼šŸ”i&EI>ÓD&fì&*$ðgì L$=œŒO›.Œï%i·6Œ«#cëHªBÆ8ÈèH»0:¤ÈÄ@F%ƒÆJ Év’„ÌBR/I´’D/G—DH|\´ï&qÖp!.šÄ퇘q'k&1Ñs…˜•$6žK¢i'NØÍÙK0æp“ˆ:n'a ±Cß®[±Zl‚5œX󱬿Í0cî%¦LbÖŒNb\ÍKf"yxƒBô Ñ)D$ATˆ ÁÃó½„ÔVq D/³€í™ Þë®_‹ÇýÏø‡þðßø/ýo¿‡Å endstream endobj 153 0 obj 11607 endobj 154 0 obj <> endobj 155 0 obj <> stream xœ]“Án£0†ï<…í¡Z)Bj“FÊaÛU³û&)RcCyûõ?ãÝ•z}ÆÿØfÈ×»ÍÎKþ3Lýžsýø2]CÏæÀ§Ñg–Ì0öKɽ?ws–ÇÚýí²ðyçÓj•åq›¹{¦ßgù{8Œþdî~¯÷q¼¿ÎóŸÙ/¦ÈÚÖ |Œëüèæ·î̹T=ì†8=.·‡Xò?ðë6³![Ué§/s×sèü‰³UQ´fµÝ¶ûáÛœ«´äpì?»£6F‹¢rmd®-¸T&°S^ƒ+å \ Snôùü¨\ƒŸ„] ~Öç¯àáFö]+Kf£ù'ð«æ%³ÕÌcd[—ð´êßÀÓª7›ü±¦MþXÓª?ÁÁª)µêï„ÕßmÀÉVýì«þÞÝ&ÿ¬þ•ì«þNöJþÈ“ú7ð!õ/‘'õ¯pn”ü±&© RÿïHê_Á™ÒùÙԟ„տƹQòV‡ïEêïdMõojižÔ%h#ôùßö4ý5„Øšò3HO¢GÏÿþ—yšQ%×èÔm endstream endobj 156 0 obj <> endobj 157 0 obj << /F1 126 0 R /F2 131 0 R /F3 156 0 R /F4 151 0 R /F5 136 0 R /F6 121 0 R /F7 141 0 R /F8 146 0 R >> endobj 158 0 obj <> endobj 159 0 obj <> endobj 160 0 obj <> endobj 1 0 obj <>/Contents 2 0 R>> endobj 10 0 obj <>/Contents 11 0 R>> endobj 13 0 obj <>/Contents 14 0 R>> endobj 16 0 obj <>/Contents 17 0 R>> endobj 19 0 obj <>/Contents 20 0 R>> endobj 22 0 obj <>/Contents 23 0 R>> endobj 25 0 obj <>/Contents 26 0 R>> endobj 28 0 obj <>/Contents 29 0 R>> endobj 31 0 obj <>/Contents 32 0 R>> endobj 34 0 obj <>/Contents 35 0 R>> endobj 37 0 obj <>/Contents 38 0 R>> endobj 40 0 obj <>/Contents 41 0 R>> endobj 43 0 obj <>/Contents 44 0 R>> endobj 46 0 obj <>/Contents 47 0 R>> endobj 49 0 obj <>/Contents 50 0 R>> endobj 52 0 obj <>/Contents 53 0 R>> endobj 55 0 obj <>/Contents 56 0 R>> endobj 58 0 obj <>/Contents 59 0 R>> endobj 61 0 obj <>/Contents 62 0 R>> endobj 64 0 obj <>/Contents 65 0 R>> endobj 67 0 obj <>/Contents 68 0 R>> endobj 70 0 obj <>/Contents 71 0 R>> endobj 73 0 obj <>/Contents 74 0 R>> endobj 76 0 obj <>/Contents 77 0 R>> endobj 79 0 obj <>/Contents 80 0 R>> endobj 82 0 obj <>/Contents 83 0 R>> endobj 85 0 obj <>/Contents 86 0 R>> endobj 88 0 obj <>/Contents 89 0 R>> endobj 93 0 obj <>/Contents 94 0 R>> endobj 96 0 obj <>/Contents 97 0 R>> endobj 101 0 obj <>/Contents 102 0 R>> endobj 104 0 obj <>/Contents 105 0 R>> endobj 107 0 obj <>/Contents 108 0 R>> endobj 161 0 obj <> endobj 162 0 obj < /Dest[19 0 R/XYZ 81.1 723.3 0]/Parent 161 0 R/Next 172 0 R>> endobj 163 0 obj < /Dest[19 0 R/XYZ 88.4 529.5 0]/Parent 162 0 R/Next 164 0 R>> endobj 164 0 obj < /Dest[22 0 R/XYZ 88.4 528.4 0]/Parent 162 0 R/Prev 163 0 R/Next 170 0 R>> endobj 165 0 obj < /Dest[22 0 R/XYZ 97.4 496.4 0]/Parent 164 0 R/Next 166 0 R>> endobj 166 0 obj < /Dest[22 0 R/XYZ 97.4 372.6 0]/Parent 164 0 R/Prev 165 0 R/Next 167 0 R>> endobj 167 0 obj < /Dest[22 0 R/XYZ 97.4 289.8 0]/Parent 164 0 R/Prev 166 0 R/Next 168 0 R>> endobj 168 0 obj < /Dest[25 0 R/XYZ 97.4 618 0]/Parent 164 0 R/Prev 167 0 R/Next 169 0 R>> endobj 169 0 obj < /Dest[25 0 R/XYZ 97.4 211.8 0]/Parent 164 0 R/Prev 168 0 R>> endobj 170 0 obj < /Dest[28 0 R/XYZ 88.4 606.7 0]/Parent 162 0 R/Prev 164 0 R/Next 171 0 R>> endobj 171 0 obj < /Dest[28 0 R/XYZ 88.4 487.1 0]/Parent 162 0 R/Prev 170 0 R>> endobj 172 0 obj < /Dest[31 0 R/XYZ 81.1 723.3 0]/Parent 161 0 R/Prev 162 0 R/Next 178 0 R>> endobj 173 0 obj < /Dest[31 0 R/XYZ 88.4 687.3 0]/Parent 172 0 R/Next 174 0 R>> endobj 174 0 obj < /Dest[31 0 R/XYZ 88.4 378.7 0]/Parent 172 0 R/Prev 173 0 R/Next 175 0 R>> endobj 175 0 obj < /Dest[37 0 R/XYZ 88.4 332.3 0]/Parent 172 0 R/Prev 174 0 R/Next 176 0 R>> endobj 176 0 obj < /Dest[43 0 R/XYZ 88.4 705.6 0]/Parent 172 0 R/Prev 175 0 R/Next 177 0 R>> endobj 177 0 obj < /Dest[43 0 R/XYZ 88.4 197.4 0]/Parent 172 0 R/Prev 176 0 R>> endobj 178 0 obj < /Dest[49 0 R/XYZ 81.1 723.3 0]/Parent 161 0 R/Prev 172 0 R/Next 199 0 R>> endobj 179 0 obj < /Dest[49 0 R/XYZ 88.4 332 0]/Parent 178 0 R/Next 180 0 R>> endobj 180 0 obj < /Dest[52 0 R/XYZ 88.4 361.7 0]/Parent 178 0 R/Prev 179 0 R/Next 184 0 R>> endobj 181 0 obj < /Dest[55 0 R/XYZ 97.4 611.6 0]/Parent 180 0 R/Next 182 0 R>> endobj 182 0 obj < /Dest[55 0 R/XYZ 97.4 511.1 0]/Parent 180 0 R/Prev 181 0 R/Next 183 0 R>> endobj 183 0 obj < /Dest[55 0 R/XYZ 97.4 416.5 0]/Parent 180 0 R/Prev 182 0 R>> endobj 184 0 obj < /Dest[55 0 R/XYZ 88.4 321.9 0]/Parent 178 0 R/Prev 180 0 R/Next 187 0 R>> endobj 185 0 obj < /Dest[55 0 R/XYZ 97.4 290 0]/Parent 184 0 R/Next 186 0 R>> endobj 186 0 obj < /Dest[61 0 R/XYZ 97.4 735.3 0]/Parent 184 0 R/Prev 185 0 R>> endobj 187 0 obj < /Dest[61 0 R/XYZ 88.4 500.1 0]/Parent 178 0 R/Prev 184 0 R/Next 188 0 R>> endobj 188 0 obj < /Dest[67 0 R/XYZ 88.4 498.3 0]/Parent 178 0 R/Prev 187 0 R/Next 189 0 R>> endobj 189 0 obj < /Dest[70 0 R/XYZ 88.4 681.7 0]/Parent 178 0 R/Prev 188 0 R/Next 190 0 R>> endobj 190 0 obj < /Dest[70 0 R/XYZ 88.4 352.4 0]/Parent 178 0 R/Prev 189 0 R/Next 191 0 R>> endobj 191 0 obj < /Dest[73 0 R/XYZ 88.4 529.8 0]/Parent 178 0 R/Prev 190 0 R/Next 192 0 R>> endobj 192 0 obj < /Dest[73 0 R/XYZ 88.4 270.4 0]/Parent 178 0 R/Prev 191 0 R/Next 193 0 R>> endobj 193 0 obj < /Dest[76 0 R/XYZ 96.5 631.4 0]/Parent 178 0 R/Prev 192 0 R/Next 194 0 R>> endobj 194 0 obj < /Dest[76 0 R/XYZ 96.5 381.1 0]/Parent 178 0 R/Prev 193 0 R/Next 195 0 R>> endobj 195 0 obj < /Dest[76 0 R/XYZ 96.5 130.8 0]/Parent 178 0 R/Prev 194 0 R/Next 196 0 R>> endobj 196 0 obj < /Dest[79 0 R/XYZ 96.5 522.6 0]/Parent 178 0 R/Prev 195 0 R/Next 197 0 R>> endobj 197 0 obj < /Dest[79 0 R/XYZ 96.5 385.9 0]/Parent 178 0 R/Prev 196 0 R/Next 198 0 R>> endobj 198 0 obj < /Dest[79 0 R/XYZ 96.5 249.1 0]/Parent 178 0 R/Prev 197 0 R>> endobj 199 0 obj < /Dest[85 0 R/XYZ 81.1 723.3 0]/Parent 161 0 R/Prev 178 0 R/Next 202 0 R>> endobj 200 0 obj < /Dest[85 0 R/XYZ 88.4 629 0]/Parent 199 0 R/Next 201 0 R>> endobj 201 0 obj < /Dest[85 0 R/XYZ 88.4 491.7 0]/Parent 199 0 R/Prev 200 0 R>> endobj 202 0 obj < /Dest[96 0 R/XYZ 81.1 723.3 0]/Parent 161 0 R/Prev 199 0 R>> endobj 203 0 obj < /Dest[101 0 R/XYZ 88.4 703.3 0]/Parent 202 0 R/Next 204 0 R>> endobj 204 0 obj < /Dest[104 0 R/XYZ 88.4 335.5 0]/Parent 202 0 R/Prev 203 0 R/Next 205 0 R>> endobj 205 0 obj < /Dest[104 0 R/XYZ 88.4 186.6 0]/Parent 202 0 R/Prev 204 0 R/Next 206 0 R>> endobj 206 0 obj < /Dest[107 0 R/XYZ 88.4 735.3 0]/Parent 202 0 R/Prev 205 0 R>> endobj 116 0 obj <> endobj 110 0 obj <> >> endobj 111 0 obj <> >> endobj 112 0 obj <> >> endobj 113 0 obj <> endobj 114 0 obj <> endobj 115 0 obj <> endobj 207 0 obj <> endobj 208 0 obj < /Creator /Producer /CreationDate (D:20070125131433-05'00') >> endobj xref 0 209 0000000000 65535 f 0000705803 00000 n 0000000019 00000 n 0000000776 00000 n 0000448959 00000 n 0000122325 00000 n 0000092541 00000 n 0000000796 00000 n 0000437891 00000 n 0000448937 00000 n 0000705949 00000 n 0000496503 00000 n 0000500099 00000 n 0000706097 00000 n 0000500121 00000 n 0000500499 00000 n 0000706245 00000 n 0000500520 00000 n 0000503106 00000 n 0000706393 00000 n 0000503128 00000 n 0000508971 00000 n 0000706560 00000 n 0000508993 00000 n 0000514312 00000 n 0000706708 00000 n 0000514334 00000 n 0000518211 00000 n 0000706856 00000 n 0000518233 00000 n 0000521659 00000 n 0000707031 00000 n 0000521681 00000 n 0000526026 00000 n 0000707198 00000 n 0000526048 00000 n 0000529153 00000 n 0000707346 00000 n 0000529175 00000 n 0000533231 00000 n 0000707494 00000 n 0000533253 00000 n 0000533703 00000 n 0000707642 00000 n 0000533724 00000 n 0000536808 00000 n 0000707790 00000 n 0000536830 00000 n 0000537967 00000 n 0000707938 00000 n 0000537989 00000 n 0000542774 00000 n 0000708086 00000 n 0000542796 00000 n 0000547904 00000 n 0000708234 00000 n 0000547926 00000 n 0000553012 00000 n 0000708382 00000 n 0000553034 00000 n 0000557276 00000 n 0000708530 00000 n 0000557298 00000 n 0000561217 00000 n 0000708678 00000 n 0000561239 00000 n 0000564800 00000 n 0000708826 00000 n 0000564822 00000 n 0000568836 00000 n 0000708974 00000 n 0000568858 00000 n 0000572287 00000 n 0000709122 00000 n 0000572309 00000 n 0000575837 00000 n 0000709270 00000 n 0000575859 00000 n 0000578764 00000 n 0000709418 00000 n 0000578786 00000 n 0000582101 00000 n 0000709566 00000 n 0000582123 00000 n 0000582354 00000 n 0000709714 00000 n 0000582375 00000 n 0000585753 00000 n 0000709889 00000 n 0000585775 00000 n 0000589050 00000 n 0000589072 00000 n 0000589258 00000 n 0000710037 00000 n 0000589301 00000 n 0000591122 00000 n 0000710185 00000 n 0000591144 00000 n 0000593984 00000 n 0000594006 00000 n 0000594191 00000 n 0000710333 00000 n 0000594233 00000 n 0000599010 00000 n 0000710483 00000 n 0000599033 00000 n 0000604134 00000 n 0000710633 00000 n 0000604157 00000 n 0000605465 00000 n 0000721134 00000 n 0000721288 00000 n 0000721451 00000 n 0000721593 00000 n 0000721709 00000 n 0000721827 00000 n 0000720804 00000 n 0000605488 00000 n 0000606179 00000 n 0000606201 00000 n 0000606394 00000 n 0000606687 00000 n 0000606851 00000 n 0000617115 00000 n 0000617139 00000 n 0000617345 00000 n 0000617807 00000 n 0000618135 00000 n 0000634814 00000 n 0000634838 00000 n 0000635045 00000 n 0000635683 00000 n 0000636184 00000 n 0000654245 00000 n 0000654269 00000 n 0000654462 00000 n 0000655087 00000 n 0000655557 00000 n 0000664276 00000 n 0000664299 00000 n 0000664506 00000 n 0000664899 00000 n 0000665160 00000 n 0000677296 00000 n 0000677320 00000 n 0000677526 00000 n 0000678051 00000 n 0000678433 00000 n 0000691460 00000 n 0000691484 00000 n 0000691699 00000 n 0000692241 00000 n 0000692650 00000 n 0000704346 00000 n 0000704370 00000 n 0000704575 00000 n 0000705069 00000 n 0000705423 00000 n 0000705543 00000 n 0000705636 00000 n 0000705690 00000 n 0000710783 00000 n 0000710842 00000 n 0000711028 00000 n 0000711318 00000 n 0000711597 00000 n 0000711887 00000 n 0000712094 00000 n 0000712309 00000 n 0000712522 00000 n 0000712752 00000 n 0000712967 00000 n 0000713117 00000 n 0000713352 00000 n 0000713578 00000 n 0000713749 00000 n 0000714064 00000 n 0000714267 00000 n 0000714477 00000 n 0000714713 00000 n 0000714869 00000 n 0000715064 00000 n 0000715250 00000 n 0000715469 00000 n 0000715675 00000 n 0000715926 00000 n 0000716162 00000 n 0000716404 00000 n 0000716567 00000 n 0000716822 00000 n 0000717005 00000 n 0000717196 00000 n 0000717363 00000 n 0000717546 00000 n 0000717785 00000 n 0000718020 00000 n 0000718295 00000 n 0000718602 00000 n 0000718881 00000 n 0000719107 00000 n 0000719334 00000 n 0000719502 00000 n 0000719692 00000 n 0000719894 00000 n 0000720125 00000 n 0000720369 00000 n 0000720589 00000 n 0000721946 00000 n 0000722015 00000 n trailer < ] >> startxref 722271 %%EOF openhpi-2.14.1/plugins/snmp_bc/Makefile.am0000644000076400007640000000552311302566770015343 0ustar # (C) Copyright IBM Corp 2003, 2006 # All rights reserved. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This # file and program are licensed under a BSD style license. See # the Copying file included with the OpenHPI distribution for # full licensing terms. MAINTAINERCLEANFILES = Makefile.in # Generated files - need to keep in sync with t/Makefile.am GENERATED_EVENT_XML_MAP = event.xml GENERATED_EVENT_CODE = el2event.c GENERATED_CODE = $(GENERATED_EVENT_XML_MAP) $(GENERATED_EVENT_CODE) MOSTLYCLEANFILES = @TEST_CLEAN@ MOSTLYCLEANFILES += $(GENERATED_CODE) SNMPUTILSDIR = $(top_srcdir)/$(SNMPDIR) SNMPUTILBDIR = $(top_builddir)/$(SNMPDIR) SUBDIRS = t INCLUDES = @OPENHPI_INCLUDES@ -I$(top_srcdir)/snmp -I$(SNMPUTILSDIR) AM_CFLAGS = @SNMPFLAGS@ pkglib_LTLIBRARIES = libsnmp_bc.la EXTRA_DIST = \ bc2hpi.pdf \ eventmap2code.pl \ snmp_bc_event.map \ snmp_bc.h \ snmp_bc_annunciator.h \ snmp_bc_control.h \ snmp_bc_discover.h \ snmp_bc_discover_bc.h \ snmp_bc_el.h \ snmp_bc_el2event.h \ snmp_bc_event.h \ snmp_bc_hotswap.h \ snmp_bc_inventory.h \ snmp_bc_plugin.h \ snmp_bc_power.h \ snmp_bc_reset.h \ snmp_bc_resources.h \ snmp_bc_sel.h \ snmp_bc_sensor.h \ snmp_bc_session.h \ snmp_bc_time.h \ snmp_bc_utils.h \ snmp_bc_watchdog.h \ snmp_bc_lock.h \ sim_init.h # Generated files must be listed first libsnmp_bc_la_SOURCES = \ sim_init.c \ snmp_bc.c \ snmp_bc_annunciator.c \ snmp_bc_control.c \ snmp_bc_discover.c \ snmp_bc_discover_bc.c \ snmp_bc_discover_rsa.c \ snmp_bc_event.c \ snmp_bc_hotswap.c \ snmp_bc_inventory.c \ snmp_bc_power.c \ snmp_bc_reset.c \ snmp_bc_resources.c \ snmp_bc_resources_rsa.c \ snmp_bc_sel.c \ snmp_bc_sensor.c \ snmp_bc_session.c \ snmp_bc_time.c \ snmp_bc_utils.c \ snmp_bc_watchdog.c \ snmp_bc_xml2event.c nodist_libsnmp_bc_la_SOURCES = $(GENERATED_EVENT_CODE) libsnmp_bc_la_LIBADD = -luuid @SNMPLIBS@ $(SNMPUTILBDIR)/libopenhpi_snmp.la $(top_builddir)/utils/libopenhpiutils.la libsnmp_bc_la_LDFLAGS = -module -version-info @HPI_LIB_VERSION@ #libsnmp_bc_la_LDFLAGS = -module -avoid-version # Note same rules and files are generated in the t sub-directory - Make sure # you change the t/Makefile.am, if you change these EVENT_MAP_FILE = $(top_srcdir)/plugins/snmp_bc/snmp_bc_event.map EVENT_MAP_SCRIPT = $(top_srcdir)/plugins/snmp_bc/eventmap2code.pl EVENT_XML_MAP_SCRIPT = $(top_srcdir)/scripts/text2cstr.pl $(GENERATED_EVENT_CODE): $(EVENT_MAP_FILE) $(EVENT_MAP_SCRIPT) $(EVENT_XML_MAP_SCRIPT) $(EVENT_MAP_SCRIPT) -xml -idir $(top_srcdir)/plugins/snmp_bc -mapfile snmp_bc_event.map $(EVENT_XML_MAP_SCRIPT) -s eventxml $(GENERATED_EVENT_XML_MAP) > $(GENERATED_EVENT_CODE) openhpi-2.14.1/plugins/snmp_bc/snmp_bc_plugin.h0000644000076400007640000000233011302566770016450 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004, 2006 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * Steve Sherman */ #ifndef __SNMP_BC_PLUGIN_H #define __SNMP_BC_PLUGIN_H /* Order is important */ #include #include #include #include #include #include #include #include /* has to be before discover.h */ #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #endif openhpi-2.14.1/plugins/snmp_bc/eventmap2code.pl0000755000076400007640000004422111302566770016401 0ustar #!/usr/bin/perl ################################################################## # (C) COPYRIGHT IBM Corp 2004, 2006 # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This # file and program are licensed under a BSD style license. See # the Copying file included with the OpenHPI distribution for # full licensing terms. # # Author(s): # Steve Sherman ################################################################### ################################################################### # NOTE!! Parallel make had problems with generated header files. To # get around this, the code in this script that generates the # header files has been commented out. Instead the header files have # been checked into CVS. The HPI_DEF in snmp_bc_event.map have also # been commented out. ################################################################### ################################################################### # Script Description: # # This script takes raw event information contained in # snmp_bc_event.map and generates code that populates the # errlog2event_hash table. This can be done in two ways - # with C code or with XML code. The C code way is simpler # but takes more memory. XML is more complex but takes less space. # # The default way is to generate C code and header files to # populate the hash table. This generates the following files: # # el.h - Error log header file with common #defines # el2event.h - Header file definitions need by generated C file. # el2event.c - Generated C code that adds events to directly to # the errlog2event_hash table. # # The second way is to translate events into XML data which is # (in a later step and script) turned into source code that # populates the hash table. This generates the following files: # # el.h - Error log header file with common #defines # el2event.h - Header file definitions need by generated source. # event.xml - XML formatted events. # # If the XML method is used, another script, scripts/text2cstr.pl, # needs to be invoked to turn the XML formatted events into source # code that populates the hash table. # # Script Input: # # --debug (optional) Turn on debug info. # Default is no. # --idir (optional) Root directory for input file(s). # Default is current directory. # --mapfile (optional) Input file name of the event map file. # Default is snmp_bc_event.map. # --odir (optional) Directory for output file(s). # Default is current directory. # --xml (optional) Generate XML formatted events. # Default is to generate C formatted # events and code. # # Exit codes # - 1 successful # - 0 error occurred #################################################################### use strict; use Getopt::Long; sub check4dups($$); #sub print_h_file_header; #sub print_h_file_ending; sub print_c_file_header; sub print_c_file_ending; sub print_c_file_hash_member($); sub print_xml_file_header; sub print_xml_file_ending; sub print_xml_file_hash_member($); #sub print_err_hfile_header; #sub print_err_hfile_ending; GetOptions( "debug" => \my $debug, "idir=s" => \my $idir, "mapfile=s" => \my $mapfile, "odir=s" => \my $odir, "xml" => \my $xml, ); ########################## # Set directory/file names ########################## if ($idir eq "") { $idir = `pwd`; chomp $idir; } if ($mapfile eq "") { $mapfile = "snmp_bc_event.map"; } my $file_map = $idir . "/$mapfile"; if ($odir eq "") { $odir = `pwd`; chomp $odir; } my $oevent_cfile = "el2event.c"; #my $oerror_hfile = "el.h"; #my $oevent_hfile = "el2event.h"; if ($xml) { $oevent_cfile = "event.xml"; } my $file_c = $odir . "/$oevent_cfile"; #my $file_err_h = $odir . "/$oerror_hfile"; #my $file_h = $odir . "/$oevent_hfile"; unlink $file_c; #unlink $file_h; #unlink $file_err_h; ############ # Open files ############ open (FILE_MAP, $file_map) or die "$0 Error! Cannot open $file_map. $! Stopped"; open (FILE_C, ">>$file_c") or die "$0 Error! Cannot open file $file_c. $! Stopped"; #open (FILE_H, ">>$file_h") or die "$0 Error! Cannot open file $file_h. $! Stopped"; #open (FILE_ERR_H, ">>$file_err_h") or die "$0 Error! Cannot open file $file_err_h. $! Stopped"; ################################################################# # Parse event map file information into internal perl hash tables ################################################################# my $err = 0; my %eventmap = (); #my %defmap = (); while ( ) { # Skip comments/blank lines next if /^\s*\/\// || /^\s*#/ || /^\s*$/; my $line = $_; # (my $hpidef_event, my $hpidef, my $def) = split/\|/,$line; (my $event_name, my $event_hex, my $event_severity, my $override_flags, my $event_msg, my $rest) = split/\|/,$line; # chomp($def); chomp($event_msg); # if ($hpidef_event eq "HPI_DEF") { # if ($hpidef eq "" || $def eq "" || $defmap{$hpidef} ne "") { # print "******************************************************\n"; # print "$0: Error! Definition $hpidef not found or not unique.\n"; # print "******************************************************\n\n"; # $err = 1; # goto CLEANUP; # } # $defmap{$hpidef} = $def; # } # else { if ($event_name eq "" || $event_hex eq "" || $event_severity eq "" || $override_flags eq "" || $event_msg eq "") { print "Line is $_\n"; print "*************************************************************\n"; print "$0: Error! Format for event incomplete for event=$event_name.\n"; print "**************************************************************\n\n"; $err = 1; goto CLEANUP; } # Put message string into internal hash. my $hash_msg = $event_msg; $hash_msg =~ s/\"$//; check4dups($line, $hash_msg); # } } ############################## # Create error log header file ############################## #if (&print_err_hfile_header) { $err = 0; goto CLEANUP; } #foreach my $d (keys %defmap) { # chomp $defmap{$d}; # print FILE_ERR_H "#define $d $defmap{$d}\n"; #} #if (&print_err_hfile_ending) { $err = 0; goto CLEANUP; } ################################################# # Create "Error Log to event" mapping header file ################################################# #if (&print_h_file_header) { $err = 0; goto CLEANUP; } #if (&print_h_file_ending) { $err = 0; goto CLEANUP; } ################################################ # Create "Error Log 2 event" mapping source file ################################################ if ($xml) { if (&print_xml_file_header) { $err = 0; goto CLEANUP; } foreach my $event_message (keys %eventmap) { if (&print_xml_file_hash_member($event_message)) { $err = 0; goto CLEANUP; } } if (&print_xml_file_ending) { $err = 0; goto CLEANUP; } } else { if (&print_c_file_header) { $err = 0; goto CLEANUP; } foreach my $event_message (keys %eventmap) { if (&print_c_file_hash_member($event_message)) { $err = 0; goto CLEANUP; } } if (&print_c_file_ending) { $err = 0; goto CLEANUP; } } CLEANUP: close FILE_MAP; close FILE_C; #close FILE_H; #close FILE_ERR_H; exit ($err); ################################################################## # Check for duplicate event messages. # Add _HPIDUP to both the internal hash_msg name and to the # external event_msg name. HPI code handles stripping the _HPIDUP # string from the external names. # The internal tables thus have hash keys that look like: # - msg # - msg_HPIDUPx ################################################################## sub check4dups($$) { my ($line, $hash_msg) = @_; my ($event_name, $event_hex, $event_severity, $override_flags, $event_msg, $rest) = split/\|/,$line; chomp($event_msg); if ($eventmap{$hash_msg} ne "") { if ($debug) { print "$0: Warning! Event=$event_hex; MSG=$event_name not unique.\n"; } # Update number of dups in original entry my ($num, $entry) = split/\|/,$eventmap{$hash_msg},2; my $dups = $num + 1; chomp($entry); $eventmap{$hash_msg} = $dups . "|$entry"; # Create unique hash entry and HPI string identifier for each duplicate my $hashdup = $hash_msg; my $msgdup = $event_msg; $hashdup =~ s/\"$//; $msgdup =~ s/\"$//; $hashdup = $hashdup . "_HPIDUP" . $dups . "\""; $msgdup = $msgdup . "_HPIDUP" . $dups . "\""; $eventmap{$hashdup} = "0|$event_name|$event_hex|$event_severity|$override_flags|$msgdup|$rest"; # print ("DUPS msg=$hashdup; 0|$event_name|$event_hex|$event_severity|$override_flags|$msgdup|$rest\n"); } else { $eventmap{$hash_msg} = "0|$event_name|$event_hex|$event_severity|$override_flags|$event_msg|$rest"; # print ("NonDUPS msg=$hash_msg; 0|$event_name|$event_hex|$event_severity|$override_flags|$event_msg|$rest\n"); } return 0; } ####################################################### # Print "Error Log to Event" header file's leading text ####################################################### #sub print_h_file_header { # # print FILE_H < #include #include #include #include GHashTable *errlog2event_hash; static void free_hash_data(gpointer key, gpointer value, gpointer user_data); /************************************************************************ * errlog2event_hash_init: * \@custom_handle: Plugin's data pointer. * * Initializes the Error Log to event translation hash table. * * Returns: * SA_OK - Normal operation. * SA_ERR_HPI_OUT_OF_SPACE - No memory to allocate hash table structures. * SA_ERR_HPI_INVALID_PARAMS - \@custom_handle is NULL. ************************************************************************/ SaErrorT errlog2event_hash_init(struct snmp_bc_hnd *custom_handle) { gchar *key; /* gchar *key_exists; */ ErrLog2EventInfoT *strinfo; if (!custom_handle) { dbg("Invalid parameter."); return(SA_ERR_HPI_INVALID_PARAMS); } errlog2event_hash = g_hash_table_new(g_str_hash, g_str_equal); if (errlog2event_hash == NULL) { dbg("No memory."); return(SA_ERR_HPI_OUT_OF_SPACE); } EOF return 0; } ##################################### # Print c file's static trailing text ##################################### sub print_c_file_ending { print FILE_C <event = $event_hex_str; /* $event_name */ $tab strinfo->event_sev = $event_severity; $tab strinfo->event_ovr = $override_flags; $tab strinfo->event_dup = $event_count; $tab g_hash_table_insert(errlog2event_hash, key, strinfo); EOF #$tab #$tab key_exists = g_hash_table_lookup(errlog2event_hash, key); #$tab if (!key_exists) { #$tab strinfo->event = $event_hex_str; /* $event_name */ #$tab strinfo->event_sev = $event_severity; #$tab strinfo->event_ovr = $override_flags; #$tab strinfo->event_dup = $event_count; #$tab g_hash_table_insert(errlog2event_hash, key, strinfo); #$tab } #$tab else { #$tab dbg("Error!: Key %s defined twice", key); #$tab errlog2event_hash_free(); #$tab return -1; #$tab } #EOF print FILE_C "\n"; return 0; } ############################################ # Print error log header file's leading text ############################################ #sub print_err_hfile_header { # print FILE_ERR_H < EOF return 0; } ####################################### # Print XML file's static trailing text ####################################### sub print_xml_file_ending { print FILE_C < EOF return 0; } ############################### # Print XML file's dynamic text ############################### sub print_xml_file_hash_member($) { my ($event_message) = @_; my ($event_count, $event_name, $event_hex, $event_severity, $override_flags, $event_msg, $rest) = split/\|/,$eventmap{$event_message}; chomp($event_msg); my $event_hex_str = "\"$event_hex\""; $event_hex_str =~ s/^\"0x/\"/; # Format override flags if ($override_flags ne "NO_OVR") { $override_flags =~ s/,/ | /g; } print FILE_C < EOF print FILE_C "\n"; return 0; } openhpi-2.14.1/plugins/snmp_bc/snmp_bc_resources.c0000644000076400007640000200573511302566770017175 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2003, 2007 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * Sean Dague * Renier Morales * Steve Sherman */ #include /************************************************************************** * Resource Definitions **************************************************************************/ struct snmp_rpt snmp_bc_rpt_array[] = { /* BladeCenter Chassis */ { .rpt = { .ResourceInfo = { .ManufacturerId = IBM_MANUFACTURING_ID, }, .ResourceEntity = { .Entry[0] = { .EntityType = SAHPI_ENT_ROOT, .EntityLocation = 0, } }, .ResourceCapabilities = SAHPI_CAPABILITY_CONTROL | SAHPI_CAPABILITY_INVENTORY_DATA | SAHPI_CAPABILITY_RDR | SAHPI_CAPABILITY_RESOURCE | SAHPI_CAPABILITY_SENSOR, .ResourceSeverity = SAHPI_CRITICAL, .ResourceFailed = SAHPI_FALSE, }, .res_info = { .mib = { .OidReset = '\0', .OidPowerState = '\0', .OidPowerOnOff = '\0', /* bladeCenterUUID */ .OidUuid = ".1.3.6.1.4.1.2.3.51.2.2.21.1.1.4.0", .OidResourceWidth = '\0', }, .cur_state = 0, .prev_state = 0, .event_array = { {}, }, }, .comment = "BladeCenter Chassis", }, /* Virtual Management Module */ { .rpt = { .ResourceInfo = { .ManufacturerId = IBM_MANUFACTURING_ID, }, .ResourceEntity = { .Entry[0] = { .EntityType = SAHPI_ENT_SYS_MGMNT_MODULE, /* Must be zero for a virtual resource */ .EntityLocation = 0, }, { .EntityType = SAHPI_ENT_ROOT, .EntityLocation = 0, } }, .ResourceCapabilities = SAHPI_CAPABILITY_CONTROL | SAHPI_CAPABILITY_EVENT_LOG | SAHPI_CAPABILITY_RDR | SAHPI_CAPABILITY_RESOURCE | SAHPI_CAPABILITY_SENSOR, .ResourceSeverity = SAHPI_CRITICAL, .ResourceFailed = SAHPI_FALSE, }, .res_info = { .mib = { .OidReset = '\0', .OidPowerState = '\0', .OidPowerOnOff = '\0', .OidUuid = '\0', .OidResourceWidth = '\0', }, .cur_state = SAHPI_HS_STATE_ACTIVE, .prev_state = SAHPI_HS_STATE_NOT_PRESENT, .event_array = { {}, }, }, .comment = "Virtual Management Module", }, /* Management Module */ { .rpt = { .ResourceInfo = { .ManufacturerId = IBM_MANUFACTURING_ID, }, .ResourceEntity = { .Entry[0] = { .EntityType = SAHPI_ENT_SYS_MGMNT_MODULE, .EntityLocation = SNMP_BC_HPI_LOCATION_BASE, }, { .EntityType = BLADECENTER_SYS_MGMNT_MODULE_SLOT, .EntityLocation = SNMP_BC_HPI_LOCATION_BASE, }, { .EntityType = SAHPI_ENT_ROOT, .EntityLocation = 0, } }, .ResourceCapabilities = SAHPI_CAPABILITY_FRU | SAHPI_CAPABILITY_INVENTORY_DATA | SAHPI_CAPABILITY_MANAGED_HOTSWAP | SAHPI_CAPABILITY_RDR | SAHPI_CAPABILITY_RESET | SAHPI_CAPABILITY_RESOURCE | SAHPI_CAPABILITY_SENSOR, .ResourceSeverity = SAHPI_MAJOR, .ResourceFailed = SAHPI_FALSE, }, .res_info = { .mib = { /* restartSPImmediately */ .OidReset = ".1.3.6.1.4.1.2.3.51.2.7.4.0", .OidPowerState = '\0', .OidPowerOnOff = '\0', /* mmHardwareVpdUuid */ .OidUuid = ".1.3.6.1.4.1.2.3.51.2.2.21.2.1.1.6.x", .OidResourceWidth = '\0', }, .cur_state = SAHPI_HS_STATE_NOT_PRESENT, .prev_state = SAHPI_HS_STATE_NOT_PRESENT, .event_array = { { .event = "0028200x", /* EN_MM_x_INSTALLED */ .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_HS_STATE_INSERTION_PENDING, .event_auto_state = 0, .recovery_state = SAHPI_HS_STATE_NOT_PRESENT, .recovery_auto_state = 0, }, { .event = "0028400x", /* EN_MM_x_REMOVED */ .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_HS_STATE_NOT_PRESENT, .event_auto_state = 0, .recovery_state = SAHPI_HS_STATE_ACTIVE, .recovery_auto_state = 0, }, {}, }, }, .comment = "Management Module", }, /* I/O Module */ { .rpt = { .ResourceInfo = { .ManufacturerId = IBM_MANUFACTURING_ID, }, .ResourceEntity = { .Entry[0] = { .EntityType = SAHPI_ENT_SWITCH, .EntityLocation = SNMP_BC_HPI_LOCATION_BASE, }, { .EntityType = BLADECENTER_SWITCH_SLOT, .EntityLocation = SNMP_BC_HPI_LOCATION_BASE, }, { .EntityType = SAHPI_ENT_ROOT, .EntityLocation = 0, } }, .ResourceCapabilities = SAHPI_CAPABILITY_FRU | SAHPI_CAPABILITY_INVENTORY_DATA | SAHPI_CAPABILITY_MANAGED_HOTSWAP | SAHPI_CAPABILITY_POWER | SAHPI_CAPABILITY_RDR | SAHPI_CAPABILITY_RESET | SAHPI_CAPABILITY_RESOURCE | SAHPI_CAPABILITY_SENSOR, .HotSwapCapabilities = SAHPI_HS_CAPABILITY_AUTOEXTRACT_READ_ONLY, .ResourceSeverity = SAHPI_MAJOR, .ResourceFailed = SAHPI_FALSE, }, .res_info = { .mib = { /* smReset */ .OidReset = ".1.3.6.1.4.1.2.3.51.2.22.3.1.7.1.8.x", /* smCurrentIPInfoPowerState */ .OidPowerState = ".1.3.6.1.4.1.2.3.51.2.22.3.2.1.1.1.1.4.x", /* switchModulePowerOnOff */ .OidPowerOnOff = ".1.3.6.1.4.1.2.3.51.2.22.3.1.7.1.7.x", /* smHardwareVpdUuid */ .OidUuid = ".1.3.6.1.4.1.2.3.51.2.2.21.6.1.1.8.x", .OidResourceWidth = '\0', }, .cur_state = SAHPI_HS_STATE_NOT_PRESENT, .prev_state = SAHPI_HS_STATE_NOT_PRESENT, .event_array = { { .event = "0EA0200x", /* EN_SWITCH_x_INSTALLED */ .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_HS_STATE_INACTIVE, .event_auto_state = 0, .recovery_state = 0, .recovery_auto_state = 0, }, { .event = "0EA0800x", /* EN_SWITCH_x_POWERED_ON */ .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_HS_STATE_ACTIVE, .event_auto_state = SAHPI_HS_STATE_INSERTION_PENDING, .recovery_state = 0, .recovery_auto_state = 0, }, { .event = "0EA0600x", /* EN_SWITCH_x_POWERED_OFF */ .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_HS_STATE_INACTIVE, .event_auto_state = SAHPI_HS_STATE_EXTRACTION_PENDING, .recovery_state = 0, .recovery_auto_state = 0, }, { .event = "0EA0400x", /* EN_SWITCH_x_REMOVED */ .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_HS_STATE_NOT_PRESENT, .event_auto_state = 0, .recovery_state = 0, .recovery_auto_state = 0, }, {}, }, }, .comment = "I/0 Module", }, /* Blade */ { .rpt = { .ResourceInfo = { .ManufacturerId = IBM_MANUFACTURING_ID, }, .ResourceEntity = { .Entry[0] = { .EntityType = SAHPI_ENT_SBC_BLADE, .EntityLocation = SNMP_BC_HPI_LOCATION_BASE, }, { .EntityType = SAHPI_ENT_PHYSICAL_SLOT, .EntityLocation = SNMP_BC_HPI_LOCATION_BASE, }, { .EntityType = SAHPI_ENT_ROOT, .EntityLocation = 0, } }, .ResourceCapabilities = SAHPI_CAPABILITY_CONTROL | SAHPI_CAPABILITY_FRU | SAHPI_CAPABILITY_INVENTORY_DATA | SAHPI_CAPABILITY_MANAGED_HOTSWAP | SAHPI_CAPABILITY_POWER | SAHPI_CAPABILITY_RDR | SAHPI_CAPABILITY_RESET | SAHPI_CAPABILITY_RESOURCE | SAHPI_CAPABILITY_SENSOR, .HotSwapCapabilities = SAHPI_HS_CAPABILITY_AUTOEXTRACT_READ_ONLY, .ResourceSeverity = SAHPI_MAJOR, .ResourceFailed = SAHPI_FALSE, }, .res_info = { .mib = { /* restartBlade */ .OidReset = ".1.3.6.1.4.1.2.3.51.2.22.1.6.1.1.8.x", /* powerRestartBladePowerState */ .OidPowerState = ".1.3.6.1.4.1.2.3.51.2.22.1.6.1.1.4.x", /* powerOnOffBlade */ .OidPowerOnOff = ".1.3.6.1.4.1.2.3.51.2.22.1.6.1.1.7.x", /* bladeHardwareVpdUuid */ .OidUuid = ".1.3.6.1.4.1.2.3.51.2.2.21.4.1.1.8.x", /* bladeWidth */ .OidResourceWidth = ".1.3.6.1.4.1.2.3.51.2.22.1.5.1.1.15.x", }, .cur_state = SAHPI_HS_STATE_NOT_PRESENT, .prev_state = SAHPI_HS_STATE_NOT_PRESENT, .event_array = { { .event = "0E00200x", /* EN_BLADE_x_INSTALLED */ .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_HS_STATE_INACTIVE, .event_auto_state = 0, .recovery_state = 0, .recovery_auto_state = 0, }, { .event = "1C000001", /* EN_BLADE_PWR_DWN */ .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_HS_STATE_INACTIVE, .event_auto_state = SAHPI_HS_STATE_EXTRACTION_PENDING, .recovery_state = 0, .recovery_auto_state = 0, }, { .event = "1C000002",/* EN_BLADE_PWR_UP */ .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_HS_STATE_ACTIVE, .event_auto_state = SAHPI_HS_STATE_INSERTION_PENDING, .recovery_state = 0, .recovery_auto_state = 0, }, { .event = "06026080", /* EN_BLADE_PWR_DN_FAN_FAIL */ .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_HS_STATE_INACTIVE, .event_auto_state = SAHPI_HS_STATE_EXTRACTION_PENDING, .recovery_state = SAHPI_HS_STATE_ACTIVE, .recovery_auto_state = SAHPI_HS_STATE_INSERTION_PENDING, }, { .event = "0821C080", /* EN_BLADE_PWR_DN_PM_TEMP */ .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_HS_STATE_INACTIVE, .event_auto_state = SAHPI_HS_STATE_EXTRACTION_PENDING, .recovery_state = SAHPI_HS_STATE_ACTIVE, .recovery_auto_state = SAHPI_HS_STATE_INSERTION_PENDING, }, { .event = "0E00400x", /* EN_BLADE_x_REMOVED */ .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_HS_STATE_NOT_PRESENT, .event_auto_state = 0, .recovery_state = 0, .recovery_auto_state = 0, }, {}, }, }, .comment = "Blade", /* ledBladeName */ .OidResourceTag = ".1.3.6.1.4.1.2.3.51.2.2.8.2.1.1.6.x" }, /* Blade Expansion Module (BEM) */ { .rpt = { .ResourceInfo = { .ManufacturerId = IBM_MANUFACTURING_ID, }, .ResourceEntity = { .Entry[0] = { .EntityType = SAHPI_ENT_SYS_EXPANSION_BOARD, .EntityLocation = SNMP_BC_HPI_LOCATION_BASE, }, { .EntityType = SAHPI_ENT_SBC_BLADE, .EntityLocation = SNMP_BC_HPI_LOCATION_BASE, }, { .EntityType = SAHPI_ENT_PHYSICAL_SLOT, .EntityLocation = SNMP_BC_HPI_LOCATION_BASE, }, { .EntityType = SAHPI_ENT_ROOT, .EntityLocation = 0, } }, .ResourceCapabilities = SAHPI_CAPABILITY_FRU | SAHPI_CAPABILITY_MANAGED_HOTSWAP | SAHPI_CAPABILITY_RDR | SAHPI_CAPABILITY_RESOURCE | SAHPI_CAPABILITY_SENSOR, .ResourceSeverity = SAHPI_MAJOR, .ResourceFailed = SAHPI_FALSE, }, .res_info = { .mib = { .OidReset = '\0', .OidPowerState = '\0', .OidPowerOnOff = '\0', /* bladeExpBoardVpdUuid */ .OidUuid = ".1.3.6.1.4.1.2.3.51.2.2.21.4.3.1.8.x", .OidResourceWidth = '\0', }, .cur_state = 0, .prev_state = 0, .event_array = { {}, }, }, .comment = "Expansion Module", }, /* Media Tray */ { .rpt = { .ResourceInfo = { .ManufacturerId = IBM_MANUFACTURING_ID, }, .ResourceEntity = { .Entry[0] = { .EntityType = SAHPI_ENT_PERIPHERAL_BAY, .EntityLocation = SNMP_BC_HPI_LOCATION_BASE, }, { .EntityType = BLADECENTER_PERIPHERAL_BAY_SLOT, .EntityLocation = SNMP_BC_HPI_LOCATION_BASE, }, { .EntityType = SAHPI_ENT_ROOT, .EntityLocation = 0, } }, .ResourceCapabilities = SAHPI_CAPABILITY_FRU | SAHPI_CAPABILITY_INVENTORY_DATA | SAHPI_CAPABILITY_RDR | SAHPI_CAPABILITY_RESOURCE | SAHPI_CAPABILITY_SENSOR, .ResourceSeverity = SAHPI_MAJOR, .ResourceFailed = SAHPI_FALSE, }, .res_info = { .mib = { .OidReset = '\0', .OidPowerState = '\0', .OidPowerOnOff = '\0', /* mtHardwareVpdUuid */ .OidUuid = ".1.3.6.1.4.1.2.3.51.2.2.21.9.8.0", .OidResourceWidth = '\0', }, .cur_state = SAHPI_HS_STATE_NOT_PRESENT, .prev_state = SAHPI_HS_STATE_NOT_PRESENT, .event_array = { { .event = "06A02001", /* EN_MEDIA_TRAY_INSTALLED */ .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_HS_STATE_INACTIVE, .event_auto_state = 0, .recovery_state = 0, .recovery_auto_state = 0, }, { .event = "06A1E001", /* EN_MEDIA_TRAY_REMOVED */ .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_HS_STATE_NOT_PRESENT, .event_auto_state = 0, /* still needed for old Recovery Media Tray removed messages */ .recovery_state = SAHPI_HS_STATE_ACTIVE, .recovery_auto_state = 0, }, {}, }, }, .comment = "Media Tray", }, /* Media Tray 2 */ { .rpt = { .ResourceInfo = { .ManufacturerId = IBM_MANUFACTURING_ID, }, .ResourceEntity = { .Entry[0] = { .EntityType = SAHPI_ENT_PERIPHERAL_BAY, .EntityLocation = SNMP_BC_HPI_LOCATION_BASE, }, { .EntityType = BLADECENTER_PERIPHERAL_BAY_SLOT, .EntityLocation = SNMP_BC_HPI_LOCATION_BASE, }, { .EntityType = SAHPI_ENT_ROOT, .EntityLocation = 0, } }, .ResourceCapabilities = SAHPI_CAPABILITY_FRU | SAHPI_CAPABILITY_INVENTORY_DATA | SAHPI_CAPABILITY_RDR | SAHPI_CAPABILITY_RESOURCE | SAHPI_CAPABILITY_SENSOR, .ResourceSeverity = SAHPI_MAJOR, .ResourceFailed = SAHPI_FALSE, }, .res_info = { .mib = { .OidReset = '\0', .OidPowerState = '\0', .OidPowerOnOff = '\0', /* mt2HardwareVpdUuid */ .OidUuid = ".1.3.6.1.4.1.2.3.51.2.2.21.10.8.0", .OidResourceWidth = '\0', }, .cur_state = SAHPI_HS_STATE_NOT_PRESENT, .prev_state = SAHPI_HS_STATE_NOT_PRESENT, .event_array = { { .event = "06A02002", /* EN_MEDIA_TRAY_2_INSTALLED */ .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_HS_STATE_INACTIVE, .event_auto_state = 0, .recovery_state = 0, .recovery_auto_state = 0, }, { .event = "06A1E002", /* EN_MEDIA_TRAY_2_REMOVED */ .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_HS_STATE_NOT_PRESENT, .event_auto_state = 0, .recovery_state = 0, .recovery_auto_state = 0, }, {}, }, }, .comment = "Media Tray", }, /* Blower Module */ { .rpt = { .ResourceInfo = { .ManufacturerId = IBM_MANUFACTURING_ID, }, .ResourceEntity = { .Entry[0] = { .EntityType = SAHPI_ENT_FAN, .EntityLocation = SNMP_BC_HPI_LOCATION_BASE, }, { .EntityType = BLADECENTER_BLOWER_SLOT, .EntityLocation = SNMP_BC_HPI_LOCATION_BASE, }, { .EntityType = SAHPI_ENT_ROOT, .EntityLocation = 0, } }, .ResourceCapabilities = SAHPI_CAPABILITY_FRU | SAHPI_CAPABILITY_RDR | SAHPI_CAPABILITY_RESOURCE | SAHPI_CAPABILITY_SENSOR, .ResourceSeverity = SAHPI_MAJOR, .ResourceFailed = SAHPI_FALSE, }, .res_info = { .mib = { .OidReset = '\0', .OidPowerState = '\0', .OidPowerOnOff = '\0', /* blowerHardwareVpdUuid */ .OidUuid = ".1.3.6.1.4.1.2.3.51.2.2.21.13.1.1.8.x", .OidResourceWidth = '\0', }, .cur_state = SAHPI_HS_STATE_NOT_PRESENT, .prev_state = SAHPI_HS_STATE_NOT_PRESENT, .event_array = { { .event = "0A00200x", /* EN_FAN_x_INSTALLED */ .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_HS_STATE_ACTIVE, .event_auto_state = 0, .recovery_state = 0, .recovery_auto_state = 0, }, { .event = "0A02600x", /* EN_FAULT_FANx */ .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_HS_STATE_NOT_PRESENT, .event_auto_state = 0, /* still needed for old Recovery Blower %d Fault messages */ .recovery_state = SAHPI_HS_STATE_ACTIVE, .recovery_auto_state = 0, }, {}, }, }, .comment = "Blower Module", }, /* Power Module */ { .rpt = { .ResourceInfo = { .ManufacturerId = IBM_MANUFACTURING_ID, }, .ResourceEntity = { .Entry[0] = { .EntityType = SAHPI_ENT_POWER_SUPPLY, .EntityLocation = SNMP_BC_HPI_LOCATION_BASE, }, { .EntityType = BLADECENTER_POWER_SUPPLY_SLOT, .EntityLocation = SNMP_BC_HPI_LOCATION_BASE, }, { .EntityType = SAHPI_ENT_ROOT, .EntityLocation = 0, } }, .ResourceCapabilities = SAHPI_CAPABILITY_FRU | SAHPI_CAPABILITY_INVENTORY_DATA | SAHPI_CAPABILITY_RDR | SAHPI_CAPABILITY_RESOURCE | SAHPI_CAPABILITY_SENSOR, .ResourceSeverity = SAHPI_MAJOR, .ResourceFailed = SAHPI_FALSE, }, .res_info = { .mib = { .OidReset = '\0', .OidPowerState = '\0', .OidPowerOnOff = '\0', /* pmHardwareVpdUuid */ .OidUuid = ".1.3.6.1.4.1.2.3.51.2.2.21.8.1.1.8.x", .OidResourceWidth = '\0', }, .cur_state = SAHPI_HS_STATE_NOT_PRESENT, .prev_state = SAHPI_HS_STATE_NOT_PRESENT, .event_array = { { .event = "0821600x", /* EN_PSx_INSTALLED */ .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_HS_STATE_ACTIVE, .event_auto_state = 0, .recovery_state = SAHPI_HS_STATE_NOT_PRESENT, .recovery_auto_state = 0, }, { .event = "0821E00x", /* EN_FAULT_PSx_REMOVED */ .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_HS_STATE_NOT_PRESENT, .event_auto_state = 0, .recovery_state = SAHPI_HS_STATE_ACTIVE, .recovery_auto_state = 0, }, {}, }, }, .comment = "Power Module", }, /* Slot */ { .rpt = { .ResourceInfo = { .ManufacturerId = IBM_MANUFACTURING_ID, }, .ResourceEntity = { .Entry[0] = { /* dummy setting - set during discovery */ .EntityType = SAHPI_ENT_CHASSIS_SPECIFIC, .EntityLocation = SNMP_BC_HPI_LOCATION_BASE, }, { .EntityType = SAHPI_ENT_ROOT, .EntityLocation = 0, } }, .ResourceCapabilities = SAHPI_CAPABILITY_RESOURCE | SAHPI_CAPABILITY_RDR | SAHPI_CAPABILITY_SENSOR, .ResourceSeverity = SAHPI_MAJOR, .ResourceFailed = SAHPI_FALSE, }, .res_info = { .mib = { .OidReset = '\0', .OidPowerState = '\0', .OidPowerOnOff = '\0', .OidUuid = '\0', .OidResourceWidth = '\0', }, .cur_state = SAHPI_HS_STATE_ACTIVE, .prev_state = SAHPI_HS_STATE_ACTIVE, .event_array = { {}, }, }, .comment = "Slot", }, /* BEM DASD */ { .rpt = { .ResourceInfo = { .ManufacturerId = IBM_MANUFACTURING_ID, }, .ResourceEntity = { .Entry[0] = { .EntityType = SAHPI_ENT_DISK_DRIVE, .EntityLocation = SNMP_BC_HPI_LOCATION_BASE, }, { .EntityType = SAHPI_ENT_SYS_EXPANSION_BOARD, .EntityLocation = SNMP_BC_HPI_LOCATION_BASE, }, { .EntityType = SAHPI_ENT_SBC_BLADE, .EntityLocation = SNMP_BC_HPI_LOCATION_BASE, }, { .EntityType = SAHPI_ENT_PHYSICAL_SLOT, .EntityLocation = SNMP_BC_HPI_LOCATION_BASE, }, { .EntityType = SAHPI_ENT_ROOT, .EntityLocation = 0, } }, .ResourceCapabilities = SAHPI_CAPABILITY_FRU | SAHPI_CAPABILITY_RDR | SAHPI_CAPABILITY_RESOURCE | SAHPI_CAPABILITY_SENSOR, .ResourceSeverity = SAHPI_MAJOR, .ResourceFailed = SAHPI_FALSE, }, .res_info = { .mib = { .OidReset = '\0', .OidPowerState = '\0', .OidPowerOnOff = '\0', .OidUuid = '\0', .OidResourceWidth = '\0', }, .cur_state = SAHPI_HS_STATE_ACTIVE, .prev_state = SAHPI_HS_STATE_ACTIVE, .event_array = { /* remove from BEM Operational Sensor, if DASD becomes a resource */ { .event = "0681E00x", /* EN_DASD1_REMOVED_DRIVE_x */ .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_HS_STATE_NOT_PRESENT, .event_auto_state = 0, .recovery_state = SAHPI_HS_STATE_ACTIVE, .recovery_auto_state = 0, }, {}, }, }, .comment = "BEM DASD", }, /* Alarm Panel Module */ { .rpt = { .ResourceInfo = { .ManufacturerId = IBM_MANUFACTURING_ID, }, .ResourceEntity = { .Entry[0] = { .EntityType = SAHPI_ENT_DISPLAY_PANEL, .EntityLocation = SNMP_BC_HPI_LOCATION_BASE, }, { .EntityType = BLADECENTER_ALARM_PANEL_SLOT, .EntityLocation = SNMP_BC_HPI_LOCATION_BASE, }, { .EntityType = SAHPI_ENT_ROOT, .EntityLocation = 0, } }, .ResourceCapabilities = SAHPI_CAPABILITY_FRU | SAHPI_CAPABILITY_INVENTORY_DATA | SAHPI_CAPABILITY_RDR | SAHPI_CAPABILITY_RESOURCE | SAHPI_CAPABILITY_SENSOR, .ResourceSeverity = SAHPI_MAJOR, .ResourceFailed = SAHPI_FALSE, }, .res_info = { .mib = { .OidReset = '\0', .OidPowerState = '\0', .OidPowerOnOff = '\0', /* tapHardwareVpdUuid */ .OidUuid = ".1.3.6.1.4.1.2.3.51.2.2.21.15.8.0", .OidResourceWidth = '\0', }, .cur_state = SAHPI_HS_STATE_ACTIVE, .prev_state = SAHPI_HS_STATE_ACTIVE, .event_array = { { .event = "6F60A001", /* EN_AP_INSTALLED */ .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_HS_STATE_ACTIVE, .event_auto_state = 0, .recovery_state = SAHPI_HS_STATE_NOT_PRESENT, .recovery_auto_state = 0, }, { .event = "6F60A002", /* EN_AP_REMOVED */ .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_HS_STATE_NOT_PRESENT, .event_auto_state = 0, .recovery_state = SAHPI_HS_STATE_ACTIVE, .recovery_auto_state = 0, }, {}, }, }, .comment = "Alarm Panel Module", }, /* Multiplexer Expansion Module */ { .rpt = { .ResourceInfo = { .ManufacturerId = IBM_MANUFACTURING_ID, }, .ResourceEntity = { .Entry[0] = { .EntityType = SAHPI_ENT_OTHER_CHASSIS_BOARD, .EntityLocation = SNMP_BC_HPI_LOCATION_BASE, }, { .EntityType = BLADECENTER_MUX_SLOT, .EntityLocation = SNMP_BC_HPI_LOCATION_BASE, }, { .EntityType = SAHPI_ENT_ROOT, .EntityLocation = 0, } }, .ResourceCapabilities = SAHPI_CAPABILITY_FRU | SAHPI_CAPABILITY_INVENTORY_DATA | SAHPI_CAPABILITY_RDR | SAHPI_CAPABILITY_RESOURCE | SAHPI_CAPABILITY_SENSOR, .ResourceSeverity = SAHPI_MAJOR, .ResourceFailed = SAHPI_FALSE, }, .res_info = { .mib = { .OidReset = '\0', .OidPowerState = '\0', .OidPowerOnOff = '\0', /* mxHardwareVpdUuid */ .OidUuid = ".1.3.6.1.4.1.2.3.51.2.2.21.17.1.1.8.x", .OidResourceWidth = '\0', }, .cur_state = SAHPI_HS_STATE_ACTIVE, .prev_state = SAHPI_HS_STATE_ACTIVE, .event_array = { { .event = "6F60800x", /* EN_MX_x_INSTALLED */ .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_HS_STATE_ACTIVE, .event_auto_state = 0, .recovery_state = SAHPI_HS_STATE_NOT_PRESENT, .recovery_auto_state = 0, }, { .event = "6F60900x", /* EN_MX_x_REMOVED */ .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_HS_STATE_NOT_PRESENT, .event_auto_state = 0, .recovery_state = SAHPI_HS_STATE_ACTIVE, .recovery_auto_state = 0, }, {}, }, }, .comment = "Multiplexer Expansion Module", }, /* Network Clock Module */ { .rpt = { .ResourceInfo = { .ManufacturerId = IBM_MANUFACTURING_ID, }, .ResourceEntity = { .Entry[0] = { /* FIXME:: SAHPI_ENT_CLOCK */ .EntityType = SAHPI_ENT_BATTERY + 13, .EntityLocation = SNMP_BC_HPI_LOCATION_BASE, }, { .EntityType = BLADECENTER_CLOCK_SLOT, .EntityLocation = SNMP_BC_HPI_LOCATION_BASE, }, { .EntityType = SAHPI_ENT_ROOT, .EntityLocation = 0, } }, .ResourceCapabilities = SAHPI_CAPABILITY_FRU | SAHPI_CAPABILITY_INVENTORY_DATA | SAHPI_CAPABILITY_RDR | SAHPI_CAPABILITY_RESOURCE | SAHPI_CAPABILITY_SENSOR, .ResourceSeverity = SAHPI_MAJOR, .ResourceFailed = SAHPI_FALSE, }, .res_info = { .mib = { .OidReset = '\0', .OidPowerState = '\0', .OidPowerOnOff = '\0', /* ncHardwareVpdUuid */ .OidUuid = ".1.3.6.1.4.1.2.3.51.2.2.21.16.1.1.8.x", .OidResourceWidth = '\0', }, .cur_state = SAHPI_HS_STATE_ACTIVE, .prev_state = SAHPI_HS_STATE_ACTIVE, .event_array = { { .event = "6F60600x", /* EN_NC_x_INSTALLED */ .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_HS_STATE_ACTIVE, .event_auto_state = 0, .recovery_state = SAHPI_HS_STATE_NOT_PRESENT, .recovery_auto_state = 0, }, { .event = "6F60700x", /* EN_NC_x_REMOVED */ .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_HS_STATE_NOT_PRESENT, .event_auto_state = 0, .recovery_state = SAHPI_HS_STATE_ACTIVE, .recovery_auto_state = 0, }, {}, }, }, .comment = "Network Clock Module", }, /* Front Bezel */ { .rpt = { .ResourceInfo = { .ManufacturerId = IBM_MANUFACTURING_ID, }, .ResourceEntity = { .Entry[0] = { /* FIXME:: SAHPI_ENT_FILTRATION_UNIT */ .EntityType = SAHPI_ENT_PHYSICAL_SLOT + 3, .EntityLocation = SNMP_BC_HPI_LOCATION_BASE, }, { .EntityType = SAHPI_ENT_ROOT, .EntityLocation = 0, } }, .ResourceCapabilities = SAHPI_CAPABILITY_FRU | SAHPI_CAPABILITY_RDR | SAHPI_CAPABILITY_RESOURCE | SAHPI_CAPABILITY_SENSOR, .ResourceSeverity = SAHPI_MAJOR, .ResourceFailed = SAHPI_FALSE, }, .res_info = { .mib = { .OidReset = '\0', .OidPowerState = '\0', .OidPowerOnOff = '\0', .OidUuid = '\0', .OidResourceWidth = '\0', }, .cur_state = SAHPI_HS_STATE_ACTIVE, .prev_state = SAHPI_HS_STATE_ACTIVE, .event_array = { { .event = "6F60B001", /* EN_FB_INSTALLED */ .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_HS_STATE_ACTIVE, .event_auto_state = 0, .recovery_state = SAHPI_HS_STATE_NOT_PRESENT, .recovery_auto_state = 0, }, { .event = "6F60B101", /* EN_FB_REMOVED */ .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_HS_STATE_NOT_PRESENT, .event_auto_state = 0, .recovery_state = SAHPI_HS_STATE_ACTIVE, .recovery_auto_state = 0, }, {}, }, }, .comment = "Front Bezel", }, /* I/O Module Interposer */ { .rpt = { .ResourceInfo = { .ManufacturerId = IBM_MANUFACTURING_ID, }, .ResourceEntity = { .Entry[0] = { .EntityType = SAHPI_ENT_INTERCONNECT, .EntityLocation = SNMP_BC_HPI_LOCATION_BASE, }, { .EntityType = BLADECENTER_SWITCH_SLOT, .EntityLocation = SNMP_BC_HPI_LOCATION_BASE, }, { .EntityType = SAHPI_ENT_ROOT, .EntityLocation = 0, } }, .ResourceCapabilities = SAHPI_CAPABILITY_FRU | SAHPI_CAPABILITY_INVENTORY_DATA | SAHPI_CAPABILITY_RDR | SAHPI_CAPABILITY_RESOURCE, .ResourceSeverity = SAHPI_MAJOR, .ResourceFailed = SAHPI_FALSE, }, .res_info = { .mib = { .OidReset = '\0', .OidPowerState = '\0', .OidPowerOnOff = '\0', /* smInpHardwareVpdUuid */ .OidUuid = ".1.3.6.1.4.1.2.3.51.2.2.21.6.2.1.8.x", .OidResourceWidth = '\0', }, .cur_state = SAHPI_HS_STATE_ACTIVE, .prev_state = SAHPI_HS_STATE_ACTIVE, .event_array = { { .event = "6F60200x", /* EN_IO_INP_x_INSTALLED */ .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_HS_STATE_ACTIVE, .event_auto_state = 0, .recovery_state = SAHPI_HS_STATE_NOT_PRESENT, .recovery_auto_state = 0, }, { .event = "6F60300x", /* EN_IO_INP_x_REMOVED */ .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_HS_STATE_NOT_PRESENT, .event_auto_state = 0, .recovery_state = SAHPI_HS_STATE_ACTIVE, .recovery_auto_state = 0, }, {}, }, }, .comment = "I/O Module Interposer", }, /* Management Module Interposer */ { .rpt = { .ResourceInfo = { .ManufacturerId = IBM_MANUFACTURING_ID, }, .ResourceEntity = { .Entry[0] = { .EntityType = SAHPI_ENT_INTERCONNECT, .EntityLocation = SNMP_BC_HPI_LOCATION_BASE, }, { .EntityType = BLADECENTER_SYS_MGMNT_MODULE_SLOT, .EntityLocation = SNMP_BC_HPI_LOCATION_BASE, }, { .EntityType = SAHPI_ENT_ROOT, .EntityLocation = 0, } }, .ResourceCapabilities = SAHPI_CAPABILITY_FRU | SAHPI_CAPABILITY_INVENTORY_DATA | SAHPI_CAPABILITY_RDR | SAHPI_CAPABILITY_RESOURCE, .ResourceSeverity = SAHPI_MAJOR, .ResourceFailed = SAHPI_FALSE, }, .res_info = { .mib = { .OidReset = '\0', .OidPowerState = '\0', .OidPowerOnOff = '\0', /* mmInpHardwareVpdUuid */ .OidUuid = ".1.3.6.1.4.1.2.3.51.2.2.21.2.2.1.6.x", .OidResourceWidth = '\0', }, .cur_state = SAHPI_HS_STATE_ACTIVE, .prev_state = SAHPI_HS_STATE_ACTIVE, .event_array = { { .event = "6F60000x", /* EN_MM_INP_x_INSTALLED */ .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_HS_STATE_ACTIVE, .event_auto_state = 0, .recovery_state = SAHPI_HS_STATE_NOT_PRESENT, .recovery_auto_state = 0, }, { .event = "6F60100x", /* EN_MM_INP_x_REMOVED */ .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_HS_STATE_NOT_PRESENT, .event_auto_state = 0, .recovery_state = SAHPI_HS_STATE_ACTIVE, .recovery_auto_state = 0, }, {}, }, }, .comment = "Management Module Interposer", }, {} /* Terminate array with a null element */ }; /************************************************************************* * Sensor Definitions *************************************************************************/ /************************************************************************* * WARNING - WARNING - WARNING - WARNING * Most of the .sensor.num are assigned sequentially. * There are 8 hardcoded, specifically assigned, sensor numbers: * * SAHPI_DEFAGSENS_OPER (SaHpiSensorNumT)0x00000100 * BLADECENTER_SENSOR_NUM_MGMNT_REDUNDANCY (SaHpiSensorNumT) 0x1001 * BLADECENTER_SENSOR_NUM_MGMNT_ACTIVE (SaHpiSensorNumT) 0x1002 * BLADECENTER_SENSOR_NUM_MGMNT_STANDBY (SaHpiSensorNumT) 0x1003 * BLADECENTER_SENSOR_NUM_SLOT_STATE (SaHpiSensorNumT) 0x1010 * BLADECENTER_SENSOR_NUM_MAX_POWER (SaHpiSensorNumT) 0x1012 * BLADECENTER_SENSOR_NUM_ASSIGNED_POWER (SaHpiSensorNumT) 0x1011 * BLADECENTER_SENSOR_NUM_MIN_POWER (SaHpiSensorNumT) 0x1013 *************************************************************************/ /***************** * Chassis Sensors *****************/ struct snmp_bc_sensor snmp_bc_chassis_sensors[] = { /* Ambient Air Temperature Sensor */ { .index = 1, .sensor = { .Num = 1, .Type = SAHPI_TEMPERATURE, .Category = SAHPI_EC_THRESHOLD, .EnableCtrl = SAHPI_FALSE, .EventCtrl = SAHPI_SEC_READ_ONLY, .Events = SAHPI_ES_UPPER_MAJOR | SAHPI_ES_UPPER_CRIT, .DataFormat = { .IsSupported = SAHPI_TRUE, .ReadingType = SAHPI_SENSOR_READING_TYPE_FLOAT64, .BaseUnits = SAHPI_SU_DEGREES_C, .ModifierUnits = SAHPI_SU_UNSPECIFIED, .ModifierUse = SAHPI_SMUU_NONE, .Percentage = SAHPI_FALSE, .Range = { .Flags = SAHPI_SRF_MAX | SAHPI_SRF_MIN, .Max = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, .Value = { .SensorFloat64 = 125, }, }, .Min = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, .Value = { .SensorFloat64 = 0, }, }, }, }, .ThresholdDefn = { .IsAccessible = SAHPI_FALSE, .ReadThold = 0, .WriteThold = 0, }, .Oem = 0, }, .sensor_info = { .mib = { .not_avail_indicator_num = 0, .write_only = SAHPI_FALSE, /* frontPanelTemp */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.1.5.1.0", .loc_offset = 0, }, .cur_state = SAHPI_ES_UNSPECIFIED, .cur_child_rid = SAHPI_UNSPECIFIED_RESOURCE_ID, .sensor_enabled = SAHPI_TRUE, .events_enabled = SAHPI_TRUE, .assert_mask = SAHPI_ES_UPPER_MAJOR | SAHPI_ES_UPPER_CRIT, .deassert_mask = SAHPI_ES_UPPER_MAJOR | SAHPI_ES_UPPER_CRIT, .event_array = { { .event = "6F400000", /* EN_FAULT_CRT_AMBIENT */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_UPPER_CRIT, .recovery_state = SAHPI_ES_UPPER_MAJOR, }, { .event = "0001D500", /* EN_PFA_HI_OVER_TEMP_AMBIENT */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_UPPER_MAJOR, .recovery_state = SAHPI_ES_UNSPECIFIED, }, {}, }, .reading2event = { { .num = 1, .rangemap = { .Flags = SAHPI_SRF_MIN, .Min = { .Value = { .SensorFloat64 = 39.0, }, }, }, .state = SAHPI_ES_UNSPECIFIED, }, { .num = 2, .rangemap = { .Flags = SAHPI_SRF_MAX, .Max = { .Value = { .SensorFloat64 = 39.0, }, }, }, .state = SAHPI_ES_UPPER_MAJOR, }, { .num = 3, .rangemap = { .Flags = SAHPI_SRF_NOMINAL, .Nominal = { .Value = { .SensorFloat64 = 39.0, }, }, }, .state = SAHPI_ES_UNSPECIFIED, }, {}, }, }, .comment = "Ambient Air Temperature Sensor", }, /* I/O Module Redundancy Sensor - event-only */ { .index = 2, .sensor = { .Num = 2, .Type = SAHPI_PLATFORM_ALERT, .Category = SAHPI_EC_REDUNDANCY, .EnableCtrl = SAHPI_FALSE, .EventCtrl = SAHPI_SEC_READ_ONLY, .Events = SAHPI_ES_REDUNDANCY_LOST | SAHPI_ES_FULLY_REDUNDANT, .DataFormat = { .IsSupported = SAHPI_FALSE, }, .ThresholdDefn = { .IsAccessible = SAHPI_FALSE, }, .Oem = 0, }, .sensor_info = { .cur_state = SAHPI_ES_FULLY_REDUNDANT, .cur_child_rid = SAHPI_UNSPECIFIED_RESOURCE_ID, .sensor_enabled = SAHPI_TRUE, .events_enabled = SAHPI_TRUE, .assert_mask = SAHPI_ES_REDUNDANCY_LOST, .deassert_mask = SAHPI_ES_REDUNDANCY_LOST, .event_array = { { .event = "0EA16000", /* EN_SWITCH_NON_REDUNDANT */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_REDUNDANCY_LOST, .recovery_state = SAHPI_ES_FULLY_REDUNDANT, }, {}, }, .reading2event = {}, }, .comment = "I/O Module Redundancy Sensor", }, /* Power Module Redundancy Sensor - event-only */ { .index = 3, .sensor = { .Num = 3, .Type = SAHPI_PLATFORM_ALERT, .Category = SAHPI_EC_REDUNDANCY, .EnableCtrl = SAHPI_FALSE, .EventCtrl = SAHPI_SEC_READ_ONLY, .Events = SAHPI_ES_REDUNDANCY_LOST | SAHPI_ES_FULLY_REDUNDANT, .DataFormat = { .IsSupported = SAHPI_FALSE, }, .ThresholdDefn = { .IsAccessible = SAHPI_FALSE, }, .Oem = 0, }, .sensor_info = { .cur_state = SAHPI_ES_FULLY_REDUNDANT, .cur_child_rid = SAHPI_UNSPECIFIED_RESOURCE_ID, .sensor_enabled = SAHPI_TRUE, .events_enabled = SAHPI_TRUE, .assert_mask = SAHPI_ES_REDUNDANCY_LOST, .deassert_mask = SAHPI_ES_REDUNDANCY_LOST, .event_array = { { .event = "08080001", /* EN_NR_PWR_SUPPLY */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_REDUNDANCY_LOST, .recovery_state = SAHPI_ES_FULLY_REDUNDANT, }, { .event = "08081001", /* EN_NR_PWR_SUPPLY_DOM_1 */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_REDUNDANCY_LOST, .recovery_state = SAHPI_ES_FULLY_REDUNDANT, }, { .event = "08081002", /* EN_NR_PWR_SUPPLY_DOM_2 */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_REDUNDANCY_LOST, .recovery_state = SAHPI_ES_FULLY_REDUNDANT, }, {}, }, .reading2event = {}, }, .comment = "Power Module Redundancy Sensor", }, /* Power Domain 1 Redundancy Sensor - event-only */ { .index = 4, .sensor = { .Num = 4, .Type = SAHPI_PLATFORM_ALERT, .Category = SAHPI_EC_REDUNDANCY, .EnableCtrl = SAHPI_FALSE, .EventCtrl = SAHPI_SEC_READ_ONLY, .Events = SAHPI_ES_REDUNDANCY_LOST | SAHPI_ES_FULLY_REDUNDANT, .DataFormat = { .IsSupported = SAHPI_FALSE, }, .ThresholdDefn = { .IsAccessible = SAHPI_FALSE, }, .Oem = 0, }, .sensor_info = { .cur_state = SAHPI_ES_FULLY_REDUNDANT, .cur_child_rid = SAHPI_UNSPECIFIED_RESOURCE_ID, .sensor_enabled = SAHPI_TRUE, .events_enabled = SAHPI_TRUE, .assert_mask = SAHPI_ES_REDUNDANCY_LOST, .deassert_mask = SAHPI_ES_REDUNDANCY_LOST, .event_array = { { .event = "08008401", /* EN_PWR_DOMAIN_1_OVER_SUBSCRIP */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_REDUNDANCY_LOST, .recovery_state = SAHPI_ES_FULLY_REDUNDANT, }, { .event = "08008401", /* EN_PWR_DOMAIN_1_OVER_SUBSCRIP_NONREC */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_REDUNDANCY_LOST, .recovery_state = SAHPI_ES_FULLY_REDUNDANT, }, {}, }, .reading2event = {}, }, .comment = "Power Domain 1 Redundancy Sensor", }, /* Power Domain 2 Redundancy Sensor - event-only */ { .index = 5, .sensor = { .Num = 5, .Type = SAHPI_PLATFORM_ALERT, .Category = SAHPI_EC_REDUNDANCY, .EnableCtrl = SAHPI_FALSE, .EventCtrl = SAHPI_SEC_READ_ONLY, .Events = SAHPI_ES_REDUNDANCY_LOST | SAHPI_ES_FULLY_REDUNDANT, .DataFormat = { .IsSupported = SAHPI_FALSE, }, .ThresholdDefn = { .IsAccessible = SAHPI_FALSE, }, .Oem = 0, }, .sensor_info = { .cur_state = SAHPI_ES_FULLY_REDUNDANT, .cur_child_rid = SAHPI_UNSPECIFIED_RESOURCE_ID, .sensor_enabled = SAHPI_TRUE, .events_enabled = SAHPI_TRUE, .assert_mask = SAHPI_ES_REDUNDANCY_LOST, .deassert_mask = SAHPI_ES_REDUNDANCY_LOST, .event_array = { { .event = "08008402", /* EN_PWR_DOMAIN_2_OVER_SUBSCRIP_NONREC */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_REDUNDANCY_LOST, .recovery_state = SAHPI_ES_FULLY_REDUNDANT, }, {}, }, .reading2event = {}, }, .comment = "Power Domain 2 Redundancy Sensor", }, /* Chassis Total Maximum Power Capability Sensor */ { .index = 6, .sensor = { .Num = BLADECENTER_SENSOR_NUM_MAX_POWER, .Type = SAHPI_OTHER_UNITS_BASED_SENSOR, .Category = SAHPI_EC_THRESHOLD, .EnableCtrl = SAHPI_FALSE, .EventCtrl = SAHPI_SEC_READ_ONLY, .Events = 0, .DataFormat = { .IsSupported = SAHPI_TRUE, .ReadingType = SAHPI_SENSOR_READING_TYPE_UINT64, .BaseUnits = SAHPI_SU_WATTS, .ModifierUnits = SAHPI_SU_UNSPECIFIED, .ModifierUse = SAHPI_SMUU_NONE, .Percentage = SAHPI_FALSE, .Range = {}, }, .ThresholdDefn = { .IsAccessible = SAHPI_FALSE, }, .Oem = 0, }, .sensor_info = { .mib = { .not_avail_indicator_num = 0, .write_only = SAHPI_FALSE, /* pd1ModuleAllocatedPowerMax */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.10.2.1.1.8.1", .threshold_oids = {}, .threshold_write_oids = {}, }, .cur_state = SAHPI_ES_UNSPECIFIED, .cur_child_rid = SAHPI_UNSPECIFIED_RESOURCE_ID, .sensor_enabled = SAHPI_TRUE, .events_enabled = SAHPI_FALSE, .assert_mask = 0, .deassert_mask = 0, .event_array = { {}, }, .reading2event = {}, }, .comment = "Chassis Total Maximum Power Capability Sensor", }, /* Chassis Total Assigned Power Sensor */ { .index = 7, .sensor = { .Num = BLADECENTER_SENSOR_NUM_ASSIGNED_POWER, .Type = SAHPI_OTHER_UNITS_BASED_SENSOR, .Category = SAHPI_EC_THRESHOLD, .EnableCtrl = SAHPI_FALSE, .EventCtrl = SAHPI_SEC_READ_ONLY, .Events = 0, .DataFormat = { .IsSupported = SAHPI_TRUE, .ReadingType = SAHPI_SENSOR_READING_TYPE_UINT64, .BaseUnits = SAHPI_SU_WATTS, .ModifierUnits = SAHPI_SU_UNSPECIFIED, .ModifierUse = SAHPI_SMUU_NONE, .Percentage = SAHPI_FALSE, .Range = {}, }, .ThresholdDefn = { .IsAccessible = SAHPI_FALSE, .ReadThold = 0, .WriteThold = 0, }, .Oem = 0, }, .sensor_info = { .mib = { .not_avail_indicator_num = 0, .write_only = SAHPI_FALSE, /* pd1ModuleAllocatedPowerCurrent */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.10.2.1.1.7.1", .threshold_oids = {}, .threshold_write_oids = {}, }, .cur_state = SAHPI_ES_UNSPECIFIED, .cur_child_rid = SAHPI_UNSPECIFIED_RESOURCE_ID, .sensor_enabled = SAHPI_TRUE, .events_enabled = SAHPI_FALSE, .assert_mask = 0, .deassert_mask = 0, .event_array = { {}, }, .reading2event = {}, }, .comment = "Chassis Total Assigned Power Sensor", }, /* Chassis Total Minumum Power Capability Sensor */ { .index = 8, .sensor = { .Num = BLADECENTER_SENSOR_NUM_MIN_POWER, .Type = SAHPI_OTHER_UNITS_BASED_SENSOR, .Category = SAHPI_EC_THRESHOLD, .EnableCtrl = SAHPI_FALSE, .EventCtrl = SAHPI_SEC_READ_ONLY, .Events = 0, .DataFormat = { .IsSupported = SAHPI_TRUE, .ReadingType = SAHPI_SENSOR_READING_TYPE_UINT64, .BaseUnits = SAHPI_SU_WATTS, .ModifierUnits = SAHPI_SU_UNSPECIFIED, .ModifierUse = SAHPI_SMUU_NONE, .Percentage = SAHPI_FALSE, .Range = {}, }, .ThresholdDefn = { .IsAccessible = SAHPI_FALSE, .ReadThold = 0, .WriteThold = 0, }, .Oem = 0, }, .sensor_info = { .mib = { .not_avail_indicator_num = 0, .write_only = SAHPI_FALSE, /* pd1ModuleAllocatedPowerMin */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.10.2.1.1.9.1", .threshold_oids = {}, .threshold_write_oids = {}, }, .cur_state = SAHPI_ES_UNSPECIFIED, .cur_child_rid = SAHPI_UNSPECIFIED_RESOURCE_ID, .sensor_enabled = SAHPI_TRUE, .events_enabled = SAHPI_FALSE, .assert_mask = 0, .deassert_mask = 0, .event_array = { {}, }, .reading2event = {}, }, .comment = "Chassis Total Minumum Power Capability Sensor", }, {} /* Terminate array with a null element */ }; #define SNMP_BC_MAX_COMMON_CHASSIS_SENSORS 8 struct snmp_bc_sensor snmp_bc_chassis_sensors_bct_filter[] = { /* Chassis Filter Sensor - event only */ { .index = SNMP_BC_MAX_COMMON_CHASSIS_SENSORS + 1, .sensor = { .Num = SNMP_BC_MAX_COMMON_CHASSIS_SENSORS + 1, .Type = SAHPI_TEMPERATURE, .Category = SAHPI_EC_SEVERITY, .EnableCtrl = SAHPI_FALSE, .EventCtrl = SAHPI_SEC_READ_ONLY, .Events = SAHPI_ES_OK | SAHPI_ES_MINOR_FROM_OK | SAHPI_ES_INFORMATIONAL | SAHPI_ES_MAJOR_FROM_LESS | SAHPI_ES_CRITICAL, .DataFormat = { .IsSupported = SAHPI_FALSE, }, .ThresholdDefn = { .IsAccessible = SAHPI_FALSE, }, .Oem = 0, }, .sensor_info = { .cur_state = SAHPI_ES_OK, .cur_child_rid = SAHPI_UNSPECIFIED_RESOURCE_ID, .sensor_enabled = SAHPI_TRUE, .events_enabled = SAHPI_TRUE, .assert_mask = SAHPI_ES_OK | SAHPI_ES_MINOR_FROM_OK | SAHPI_ES_INFORMATIONAL | SAHPI_ES_MAJOR_FROM_LESS | SAHPI_ES_CRITICAL, .deassert_mask = SAHPI_ES_OK | SAHPI_ES_MINOR_FROM_OK | SAHPI_ES_INFORMATIONAL | SAHPI_ES_MAJOR_FROM_LESS | SAHPI_ES_CRITICAL, .event_array = { { .event = "6F100000", /* EN_FAULT_CRT_FILTER */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_CRITICAL, .recovery_state = SAHPI_ES_MAJOR_FROM_LESS, }, { .event = "6F200000", /* EN_FAULT_MJR_FILTER */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_MAJOR_FROM_LESS, .recovery_state = SAHPI_ES_MINOR_FROM_OK, }, { .event = "6F300000", /* EN_FAULT_MNR_FILTER */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_MINOR_FROM_OK, .recovery_state = SAHPI_ES_OK, }, { .event = "6F500000", /* EN_FAULT_MNR_FILTER_SERVICE */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_INFORMATIONAL, .recovery_state = SAHPI_ES_OK, }, }, .reading2event = {}, }, .comment = "Chassis Filter Sensor", }, {} /* Terminate array with a null element */ }; /*********************************** * Virtual Management Module Sensors ***********************************/ struct snmp_bc_sensor snmp_bc_virtual_mgmnt_sensors[] = { /* MM Air Temperature */ { .index = 1, .sensor = { .Num = 1, .Type = SAHPI_TEMPERATURE, .Category = SAHPI_EC_THRESHOLD, .EnableCtrl = SAHPI_FALSE, .EventCtrl = SAHPI_SEC_READ_ONLY, .Events = SAHPI_ES_UPPER_MAJOR, .DataFormat = { .IsSupported = SAHPI_TRUE, .ReadingType = SAHPI_SENSOR_READING_TYPE_FLOAT64, .BaseUnits = SAHPI_SU_DEGREES_C, .ModifierUnits = SAHPI_SU_UNSPECIFIED, .ModifierUse = SAHPI_SMUU_NONE, .Percentage = SAHPI_FALSE, .Range = { .Flags = SAHPI_SRF_MAX | SAHPI_SRF_MIN, .Max = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, .Value = { .SensorFloat64 = 125, }, }, .Min = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, .Value = { .SensorFloat64 = 0, }, }, }, }, .ThresholdDefn = { .IsAccessible = SAHPI_FALSE, .ReadThold = 0, .WriteThold = 0, }, .Oem = 0, }, .sensor_info = { .mib = { .not_avail_indicator_num = 0, .write_only = SAHPI_FALSE, /* mmTemp */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.1.1.2.0", .loc_offset = 0, }, .cur_state = SAHPI_ES_UNSPECIFIED, .cur_child_rid = SAHPI_UNSPECIFIED_RESOURCE_ID, .sensor_enabled = SAHPI_TRUE, .events_enabled = SAHPI_TRUE, .assert_mask = SAHPI_ES_UPPER_MAJOR, .deassert_mask = SAHPI_ES_UPPER_MAJOR, .event_array = { { .event = "0001D400", /* EN_PFA_HI_OVER_TEMP_SP_CARD */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_UPPER_MAJOR, .recovery_state = SAHPI_ES_UNSPECIFIED, }, {}, }, .reading2event = { { .num = 1, .rangemap = { .Flags = SAHPI_SRF_MIN, .Min = { .Value = { .SensorFloat64 = 60.0, }, }, }, .state = SAHPI_ES_UNSPECIFIED, }, { .num = 2, .rangemap = { .Flags = SAHPI_SRF_MAX, .Max = { .Value = { .SensorFloat64 = 60.0, }, }, }, .state = SAHPI_ES_UPPER_MAJOR, }, { .num = 3, .rangemap = { .Flags = SAHPI_SRF_NOMINAL, .Nominal = { .Value = { .SensorFloat64 = 60.0, }, }, }, .state = SAHPI_ES_UNSPECIFIED, }, {}, }, }, .comment = "MM Air Temperature Sensor", }, /* System 1.8 Volt Sensor */ { .index = 2, .sensor = { .Num = 2, .Type = SAHPI_VOLTAGE, .Category = SAHPI_EC_THRESHOLD, .EnableCtrl = SAHPI_FALSE, .EventCtrl = SAHPI_SEC_READ_ONLY, .Events = SAHPI_ES_LOWER_CRIT | SAHPI_ES_UPPER_CRIT, .DataFormat = { .IsSupported = SAHPI_TRUE, .ReadingType = SAHPI_SENSOR_READING_TYPE_FLOAT64, .BaseUnits = SAHPI_SU_VOLTS, .ModifierUnits = SAHPI_SU_UNSPECIFIED, .ModifierUse = SAHPI_SMUU_NONE, .Percentage = SAHPI_FALSE, .Range = { .Flags = SAHPI_SRF_MAX | SAHPI_SRF_MIN | SAHPI_SRF_NOMINAL, .Max = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, .Value = { .SensorFloat64 = 4.4, }, }, .Nominal = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, .Value = { .SensorFloat64 = 1.8, }, }, .Min = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, .Value = { .SensorFloat64 = 0, }, }, }, }, .ThresholdDefn = { .IsAccessible = SAHPI_TRUE, .ReadThold = SAHPI_STM_LOW_CRIT | SAHPI_STM_UP_CRIT | SAHPI_STM_LOW_HYSTERESIS | SAHPI_STM_UP_HYSTERESIS, .WriteThold = 0, }, .Oem = 0, }, .sensor_info = { .mib = { .not_avail_indicator_num = 0, .write_only = SAHPI_FALSE, /* plus1Pt8Volt */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.2.1.8.0", .loc_offset = 0, .threshold_oids = { /* voltageThresholdEntryWarningLowValue */ .LowCritical = ".1.3.6.1.4.1.2.3.51.2.2.20.2.1.1.10.6", /* voltageThresholdEntryWarningHighValue */ .UpCritical = ".1.3.6.1.4.1.2.3.51.2.2.20.2.1.1.6.6", /* voltageThresholdEntryWarningResetHighValue */ .TotalPosThdHysteresis = ".1.3.6.1.4.1.2.3.51.2.2.20.2.1.1.7.6", /* voltageThresholdEntryWarningResetLowValue */ .TotalNegThdHysteresis = ".1.3.6.1.4.1.2.3.51.2.2.20.2.1.1.11.6", }, .threshold_write_oids = {}, }, .cur_state = SAHPI_ES_UNSPECIFIED, .cur_child_rid = SAHPI_UNSPECIFIED_RESOURCE_ID, .sensor_enabled = SAHPI_TRUE, .events_enabled = SAHPI_TRUE, .assert_mask = SAHPI_ES_LOWER_CRIT | SAHPI_ES_UPPER_CRIT, .deassert_mask = SAHPI_ES_LOWER_CRIT | SAHPI_ES_UPPER_CRIT, .event_array = { { .event = "0807B401", /* EN_I2C_HI_FAULT_1_8V */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_UPPER_CRIT, .recovery_state = SAHPI_ES_UNSPECIFIED, }, { .event = "0807B801", /* EN_I2C_LO_FAULT_1_8V */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_LOWER_CRIT, .recovery_state = SAHPI_ES_UNSPECIFIED, }, {}, }, .reading2event = {}, }, .comment = "System 1.8 Volt Sensor", }, /* System 2.5 Volt Sensor */ { .index = 3, .sensor = { .Num = 3, .Type = SAHPI_VOLTAGE, .Category = SAHPI_EC_THRESHOLD, .EnableCtrl = SAHPI_FALSE, .EventCtrl = SAHPI_SEC_READ_ONLY, .Events = SAHPI_ES_LOWER_CRIT | SAHPI_ES_UPPER_CRIT, .DataFormat = { .IsSupported = SAHPI_TRUE, .ReadingType = SAHPI_SENSOR_READING_TYPE_FLOAT64, .BaseUnits = SAHPI_SU_VOLTS, .ModifierUnits = SAHPI_SU_UNSPECIFIED, .ModifierUse = SAHPI_SMUU_NONE, .Percentage = SAHPI_FALSE, .Range = { .Flags = SAHPI_SRF_MAX | SAHPI_SRF_MIN | SAHPI_SRF_NOMINAL, .Max = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, .Value = { .SensorFloat64 = 4.4, }, }, .Nominal = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, .Value = { .SensorFloat64 = 2.5, }, }, .Min = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, .Value = { .SensorFloat64 = 0, }, }, }, }, .ThresholdDefn = { .IsAccessible = SAHPI_TRUE, .ReadThold = SAHPI_STM_LOW_CRIT | SAHPI_STM_UP_CRIT | SAHPI_STM_LOW_HYSTERESIS | SAHPI_STM_UP_HYSTERESIS, .WriteThold = 0, }, .Oem = 0, }, .sensor_info = { .mib = { .not_avail_indicator_num = 0, .write_only = SAHPI_FALSE, /* plus2Pt5Volt */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.2.1.6.0", .loc_offset = 0, .threshold_oids = { /* voltageThresholdEntryWarningLowValue */ .LowCritical = ".1.3.6.1.4.1.2.3.51.2.2.20.2.1.1.10.5", /* voltageThresholdEntryWarningHighValue */ .UpCritical = ".1.3.6.1.4.1.2.3.51.2.2.20.2.1.1.6.5", /* voltageThresholdEntryWarningResetHighValue */ .TotalPosThdHysteresis = ".1.3.6.1.4.1.2.3.51.2.2.20.2.1.1.7.5", /* voltageThresholdEntryWarningResetLowValue */ .TotalNegThdHysteresis = ".1.3.6.1.4.1.2.3.51.2.2.20.2.1.1.11.5", }, .threshold_write_oids = {}, }, .cur_state = SAHPI_ES_UNSPECIFIED, .cur_child_rid = SAHPI_UNSPECIFIED_RESOURCE_ID, .sensor_enabled = SAHPI_TRUE, .events_enabled = SAHPI_TRUE, .assert_mask = SAHPI_ES_LOWER_CRIT | SAHPI_ES_UPPER_CRIT, .deassert_mask = SAHPI_ES_LOWER_CRIT | SAHPI_ES_UPPER_CRIT, .event_array = { { .event = "08031481", /* EN_I2C_HI_FAULT_2_5V */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_UPPER_CRIT, .recovery_state = SAHPI_ES_UNSPECIFIED, }, { .event = "08031881", /* EN_I2C_LO_FAULT_2_5V */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_LOWER_CRIT, .recovery_state = SAHPI_ES_UNSPECIFIED, }, {}, }, .reading2event = {}, }, .comment = "System 2.5 Volt Sensor", }, /* System 3.3 Volt Sensor */ { .index = 4, .sensor = { .Num = 4, .Type = SAHPI_VOLTAGE, .Category = SAHPI_EC_THRESHOLD, .EnableCtrl = SAHPI_FALSE, .EventCtrl = SAHPI_SEC_READ_ONLY, .Events = SAHPI_ES_LOWER_CRIT | SAHPI_ES_UPPER_CRIT, .DataFormat = { .IsSupported = SAHPI_TRUE, .ReadingType = SAHPI_SENSOR_READING_TYPE_FLOAT64, .BaseUnits = SAHPI_SU_VOLTS, .ModifierUnits = SAHPI_SU_UNSPECIFIED, .ModifierUse = SAHPI_SMUU_NONE, .Percentage = SAHPI_FALSE, .Range = { .Flags = SAHPI_SRF_MAX | SAHPI_SRF_MIN | SAHPI_SRF_NOMINAL, .Max = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, .Value = { .SensorFloat64 = 3.6, }, }, .Nominal = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, .Value = { .SensorFloat64 = 3.3, }, }, .Min = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, .Value = { .SensorFloat64 = 0, }, }, }, }, .ThresholdDefn = { .IsAccessible = SAHPI_TRUE, .ReadThold = SAHPI_STM_LOW_CRIT | SAHPI_STM_UP_CRIT | SAHPI_STM_LOW_HYSTERESIS | SAHPI_STM_UP_HYSTERESIS, .WriteThold = 0, }, .Oem = 0, }, .sensor_info = { .mib = { .not_avail_indicator_num = 0, .write_only = SAHPI_FALSE, /* plus3Pt3Volt */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.2.1.2.0", .loc_offset = 0, .threshold_oids = { /* voltageThresholdEntryWarningLowValue */ .LowCritical = ".1.3.6.1.4.1.2.3.51.2.2.20.2.1.1.10.2", /* voltageThresholdEntryWarningHighValue */ .UpCritical = ".1.3.6.1.4.1.2.3.51.2.2.20.2.1.1.6.2", /* voltageThresholdEntryWarningResetHighValue */ .TotalPosThdHysteresis = ".1.3.6.1.4.1.2.3.51.2.2.20.2.1.1.7.2", /* voltageThresholdEntryWarningResetLowValue */ .TotalNegThdHysteresis = ".1.3.6.1.4.1.2.3.51.2.2.20.2.1.1.11.2", }, .threshold_write_oids = {}, }, .cur_state = SAHPI_ES_UNSPECIFIED, .cur_child_rid = SAHPI_UNSPECIFIED_RESOURCE_ID, .sensor_enabled = SAHPI_TRUE, .events_enabled = SAHPI_TRUE, .assert_mask = SAHPI_ES_LOWER_CRIT | SAHPI_ES_UPPER_CRIT, .deassert_mask = SAHPI_ES_LOWER_CRIT | SAHPI_ES_UPPER_CRIT, .event_array = { { .event = "08033481", /* EN_I2C_HI_FAULT_3_35V */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_UPPER_CRIT, .recovery_state = SAHPI_ES_UNSPECIFIED, }, { .event = "FF000000", /* EN_I2C_LO_FAULT_3_35V */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_LOWER_CRIT, .recovery_state = SAHPI_ES_UNSPECIFIED, }, {}, }, .reading2event = {}, }, .comment = "System 3.3 Volt Sensor", }, /* System 5 Volt Sensor */ { .index = 5, .sensor = { .Num = 5, .Type = SAHPI_VOLTAGE, .Category = SAHPI_EC_THRESHOLD, .EnableCtrl = SAHPI_FALSE, .EventCtrl = SAHPI_SEC_READ_ONLY, .Events = SAHPI_ES_LOWER_CRIT | SAHPI_ES_UPPER_CRIT, .DataFormat = { .IsSupported = SAHPI_TRUE, .ReadingType = SAHPI_SENSOR_READING_TYPE_FLOAT64, .BaseUnits = SAHPI_SU_VOLTS, .ModifierUnits = SAHPI_SU_UNSPECIFIED, .ModifierUse = SAHPI_SMUU_NONE, .Percentage = SAHPI_FALSE, .Range = { .Flags = SAHPI_SRF_MAX | SAHPI_SRF_MIN | SAHPI_SRF_NOMINAL, .Max = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, .Value = { .SensorFloat64 = 6.7, }, }, .Nominal = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, .Value = { .SensorFloat64 = 5, }, }, .Min = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, .Value = { .SensorFloat64 = 0, }, }, }, }, .ThresholdDefn = { .IsAccessible = SAHPI_TRUE, .ReadThold = SAHPI_STM_LOW_CRIT | SAHPI_STM_UP_CRIT | SAHPI_STM_LOW_HYSTERESIS | SAHPI_STM_UP_HYSTERESIS, .WriteThold = 0, }, .Oem = 0, }, .sensor_info = { .mib = { .not_avail_indicator_num = 0, .write_only = SAHPI_FALSE, /* plus5Volt */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.2.1.1.0", .loc_offset = 0, .threshold_oids = { /* voltageThresholdEntryWarningLowValue */ .LowCritical = ".1.3.6.1.4.1.2.3.51.2.2.20.2.1.1.10.1", /* voltageThresholdEntryWarningHighValue */ .UpCritical = ".1.3.6.1.4.1.2.3.51.2.2.20.2.1.1.6.1", /* voltageThresholdEntryWarningResetHighValue */ .TotalPosThdHysteresis = ".1.3.6.1.4.1.2.3.51.2.2.20.2.1.1.7.1", /* voltageThresholdEntryWarningResetLowValue */ .TotalNegThdHysteresis = ".1.3.6.1.4.1.2.3.51.2.2.20.2.1.1.11.1", }, .threshold_write_oids = {}, }, .cur_state = SAHPI_ES_UNSPECIFIED, .cur_child_rid = SAHPI_UNSPECIFIED_RESOURCE_ID, .sensor_enabled = SAHPI_TRUE, .events_enabled = SAHPI_TRUE, .assert_mask = SAHPI_ES_LOWER_CRIT | SAHPI_ES_UPPER_CRIT, .deassert_mask = SAHPI_ES_LOWER_CRIT | SAHPI_ES_UPPER_CRIT, .event_array = { { .event = "FF000001", /* EN_I2C_HI_FAULT_PLANAR_5V */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_UPPER_CRIT, .recovery_state = SAHPI_ES_UNSPECIFIED, }, { .event = "06035801", /* EN_I2C_LO_FAULT_PLANAR_5V */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_LOWER_CRIT, .recovery_state = SAHPI_ES_UNSPECIFIED, }, {}, }, .reading2event = {}, }, .comment = "System 5 Volt Sensor", }, /* System -5 Volt Sensor */ { .index = 6, .sensor = { .Num = 6, .Type = SAHPI_VOLTAGE, .Category = SAHPI_EC_THRESHOLD, .EnableCtrl = SAHPI_FALSE, .EventCtrl = SAHPI_SEC_READ_ONLY, .Events = SAHPI_ES_LOWER_CRIT | SAHPI_ES_UPPER_CRIT, .DataFormat = { .IsSupported = SAHPI_TRUE, .ReadingType = SAHPI_SENSOR_READING_TYPE_FLOAT64, .BaseUnits = SAHPI_SU_VOLTS, .ModifierUnits = SAHPI_SU_UNSPECIFIED, .ModifierUse = SAHPI_SMUU_NONE, .Percentage = SAHPI_FALSE, .Range = { .Flags = SAHPI_SRF_MAX | SAHPI_SRF_MIN | SAHPI_SRF_NOMINAL, .Max = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, .Value = { .SensorFloat64 = 0, }, }, .Nominal = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, .Value = { .SensorFloat64 = -5, }, }, .Min = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, .Value = { .SensorFloat64 = -6.7, }, }, }, }, .ThresholdDefn = { .IsAccessible = SAHPI_TRUE, .ReadThold = SAHPI_STM_LOW_CRIT | SAHPI_STM_UP_CRIT | SAHPI_STM_LOW_HYSTERESIS | SAHPI_STM_UP_HYSTERESIS, .WriteThold = 0, }, .Oem = 0, }, .sensor_info = { .mib = { .not_avail_indicator_num = 0, .write_only = SAHPI_FALSE, /* minus5Volt */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.2.1.5.0", .loc_offset = 0, .threshold_oids = { /* voltageThresholdEntryWarningLowValue */ .LowCritical = ".1.3.6.1.4.1.2.3.51.2.2.20.2.1.1.10.4", /* voltageThresholdEntryWarningHighValue */ .UpCritical = ".1.3.6.1.4.1.2.3.51.2.2.20.2.1.1.6.4", /* voltageThresholdEntryWarningResetHighValue */ .TotalPosThdHysteresis = ".1.3.6.1.4.1.2.3.51.2.2.20.2.1.1.7.4", /* voltageThresholdEntryWarningResetLowValue */ .TotalNegThdHysteresis = ".1.3.6.1.4.1.2.3.51.2.2.20.2.1.1.11.4", }, .threshold_write_oids = {}, }, .cur_state = SAHPI_ES_UNSPECIFIED, .cur_child_rid = SAHPI_UNSPECIFIED_RESOURCE_ID, .sensor_enabled = SAHPI_TRUE, .events_enabled = SAHPI_TRUE, .assert_mask = SAHPI_ES_LOWER_CRIT | SAHPI_ES_UPPER_CRIT, .deassert_mask = SAHPI_ES_LOWER_CRIT | SAHPI_ES_UPPER_CRIT, .event_array = { { .event = "0803D501", /* EN_I2C_HI_FAULT_N5V */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_UPPER_CRIT, .recovery_state = SAHPI_ES_UNSPECIFIED, }, { .event = "0803D801", /* EN_I2C_LO_FAULT_N5V */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_LOWER_CRIT, .recovery_state = SAHPI_ES_UNSPECIFIED, }, {}, }, .reading2event = {}, }, .comment = "System -5 Volt Sensor", }, /* System 12 Volt Sensor */ { .index = 7, .sensor = { .Num = 7, .Type = SAHPI_VOLTAGE, .Category = SAHPI_EC_THRESHOLD, .EnableCtrl = SAHPI_FALSE, .EventCtrl = SAHPI_SEC_READ_ONLY, .Events = SAHPI_ES_LOWER_CRIT | SAHPI_ES_UPPER_CRIT, .DataFormat = { .IsSupported = SAHPI_TRUE, .ReadingType = SAHPI_SENSOR_READING_TYPE_FLOAT64, .BaseUnits = SAHPI_SU_VOLTS, .ModifierUnits = SAHPI_SU_UNSPECIFIED, .ModifierUse = SAHPI_SMUU_NONE, .Percentage = SAHPI_FALSE, .Range = { .Flags = SAHPI_SRF_MAX | SAHPI_SRF_MIN | SAHPI_SRF_NOMINAL, .Max = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, .Value = { .SensorFloat64 = 16, }, }, .Nominal = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, .Value = { .SensorFloat64 = 12, }, }, .Min = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, .Value = { .SensorFloat64 = 0, }, }, }, }, .ThresholdDefn = { .IsAccessible = SAHPI_TRUE, .ReadThold = SAHPI_STM_LOW_CRIT | SAHPI_STM_UP_CRIT | SAHPI_STM_LOW_HYSTERESIS | SAHPI_STM_UP_HYSTERESIS, .WriteThold = 0, }, .Oem = 0, }, .sensor_info = { .mib = { .not_avail_indicator_num = 0, .write_only = SAHPI_FALSE, /* plus12Volt */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.2.1.3.0", .loc_offset = 0, .threshold_oids = { /* voltageThresholdEntryWarningLowValue */ .LowCritical = ".1.3.6.1.4.1.2.3.51.2.2.20.2.1.1.10.3", /* voltageThresholdEntryWarningHighValue */ .UpCritical = ".1.3.6.1.4.1.2.3.51.2.2.20.2.1.1.6.3", /* voltageThresholdEntryWarningResetHighValue */ .TotalPosThdHysteresis = ".1.3.6.1.4.1.2.3.51.2.2.20.2.1.1.7.3", /* voltageThresholdEntryWarningResetLowValue */ .TotalNegThdHysteresis = ".1.3.6.1.4.1.2.3.51.2.2.20.2.1.1.11.3", }, .threshold_write_oids = {}, }, .cur_state = SAHPI_ES_UNSPECIFIED, .cur_child_rid = SAHPI_UNSPECIFIED_RESOURCE_ID, .sensor_enabled = SAHPI_TRUE, .events_enabled = SAHPI_TRUE, .assert_mask = SAHPI_ES_LOWER_CRIT | SAHPI_ES_UPPER_CRIT, .deassert_mask = SAHPI_ES_LOWER_CRIT | SAHPI_ES_UPPER_CRIT, .event_array = { { .event = "06037503", /* EN_I2C_HI_FAULT_12V_PLANAR */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_UPPER_CRIT, .recovery_state = SAHPI_ES_UNSPECIFIED, }, { .event = "06037801", /* EN_I2C_LO_FAULT_12V_PLANAR */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_LOWER_CRIT, .recovery_state = SAHPI_ES_UNSPECIFIED, }, {}, }, .reading2event = {}, }, .comment = "System 12 Volt Sensor", }, /* System Management Bus Operational State Sensor - event only */ { .index = 8, .sensor = { .Num = 8, .Type = SAHPI_OPERATIONAL, .Category = SAHPI_EC_AVAILABILITY, .EnableCtrl = SAHPI_FALSE, .EventCtrl = SAHPI_SEC_READ_ONLY, .Events = SAHPI_ES_RUNNING | SAHPI_ES_DEGRADED | SAHPI_ES_OFF_LINE, .DataFormat = { .IsSupported = SAHPI_FALSE, }, .ThresholdDefn = { .IsAccessible = SAHPI_FALSE, }, .Oem = 0, }, .sensor_info = { .cur_state = SAHPI_ES_RUNNING, .cur_child_rid = SAHPI_UNSPECIFIED_RESOURCE_ID, .sensor_enabled = SAHPI_TRUE, .events_enabled = SAHPI_TRUE, .assert_mask = SAHPI_ES_DEGRADED | SAHPI_ES_OFF_LINE, .deassert_mask = SAHPI_ES_DEGRADED | SAHPI_ES_OFF_LINE, .event_array = { { .event = "00020000", /* EN_I2C_BUS_0_FAIL */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_OFF_LINE, .recovery_state = SAHPI_ES_RUNNING, }, { .event = "00020001", /* EN_I2C_BUS_1_FAIL */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_OFF_LINE, .recovery_state = SAHPI_ES_RUNNING, }, { .event = "00020002", /* EN_I2C_BUS_2_FAIL */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_OFF_LINE, .recovery_state = SAHPI_ES_RUNNING, }, { .event = "00020003", /* EN_I2C_BUS_3_FAIL */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_OFF_LINE, .recovery_state = SAHPI_ES_RUNNING, }, { .event = "00020004", /* EN_I2C_BUS_4_FAIL */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_OFF_LINE, .recovery_state = SAHPI_ES_RUNNING, }, { .event = "00020005", /* EN_I2C_BUS_5_FAIL */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_OFF_LINE, .recovery_state = SAHPI_ES_RUNNING, }, { .event = "00020006", /* EN_I2C_BUS_6_FAIL */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_OFF_LINE, .recovery_state = SAHPI_ES_RUNNING, }, { .event = "00020007", /* EN_I2C_BUS_7_FAIL */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_OFF_LINE, .recovery_state = SAHPI_ES_RUNNING, }, { .event = "00020008", /* EN_I2C_BUS_8_FAIL */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_OFF_LINE, .recovery_state = SAHPI_ES_RUNNING, }, { .event = "00020009", /* EN_I2C_BUS_9_FAIL */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_OFF_LINE, .recovery_state = SAHPI_ES_RUNNING, }, { .event = "0002000A", /* EN_I2C_BUS_10_FAIL */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_OFF_LINE, .recovery_state = SAHPI_ES_RUNNING, }, { .event = "0002000B", /* EN_I2C_BUS_11_FAIL */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_OFF_LINE, .recovery_state = SAHPI_ES_RUNNING, }, { .event = "0002000C", /* EN_I2C_BUS_12_FAIL */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_OFF_LINE, .recovery_state = SAHPI_ES_RUNNING, }, { .event = "0002000D", /* EN_I2C_BUS_13_FAIL */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_OFF_LINE, .recovery_state = SAHPI_ES_RUNNING, }, { .event = "0002000E", /* EN_I2C_BUS_14_FAIL */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_OFF_LINE, .recovery_state = SAHPI_ES_RUNNING, }, { .event = "0002000F", /* EN_I2C_BUS_15_FAIL */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_OFF_LINE, .recovery_state = SAHPI_ES_RUNNING, }, { .event = "00020010", /* EN_I2C_BUS_16_FAIL */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_OFF_LINE, .recovery_state = SAHPI_ES_RUNNING, }, { .event = "00020011", /* EN_I2C_BUS_17_FAIL */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_OFF_LINE, .recovery_state = SAHPI_ES_RUNNING, }, { .event = "00020012", /* EN_I2C_BUS_18_FAIL */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_OFF_LINE, .recovery_state = SAHPI_ES_RUNNING, }, { .event = "00020013", /* EN_I2C_BUS_19_FAIL */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_OFF_LINE, .recovery_state = SAHPI_ES_RUNNING, }, { .event = "00020014", /* EN_I2C_BUS_20_FAIL */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_OFF_LINE, .recovery_state = SAHPI_ES_RUNNING, }, { .event = "00020015", /* EN_I2C_BUS_21_FAIL */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_OFF_LINE, .recovery_state = SAHPI_ES_RUNNING, }, { .event = "00020016", /* EN_I2C_BUS_22_FAIL */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_OFF_LINE, .recovery_state = SAHPI_ES_RUNNING, }, { .event = "00020017", /* EN_I2C_BUS_23_FAIL */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_OFF_LINE, .recovery_state = SAHPI_ES_RUNNING, }, { .event = "00020018", /* EN_I2C_BUS_24_FAIL */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_OFF_LINE, .recovery_state = SAHPI_ES_RUNNING, }, { .event = "00020019", /* EN_I2C_BUS_25_FAIL */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_OFF_LINE, .recovery_state = SAHPI_ES_RUNNING, }, { .event = "0002001A", /* EN_I2C_BUS_26_FAIL */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_OFF_LINE, .recovery_state = SAHPI_ES_RUNNING, }, { .event = "00216015", /* EN_SP_CTRL_OFFLINE */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_OFF_LINE, .recovery_state = SAHPI_ES_RUNNING, }, { .event = "00216016", /* EN_SP_CTRL_UNAVAILABLE */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_OFF_LINE, .recovery_state = SAHPI_ES_RUNNING, }, { .event = "00022014", /* EN_STCONN_FAIL_MIDPLANE */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_OFF_LINE, .recovery_state = SAHPI_ES_RUNNING, }, { .event = "00216014", /* EN_SP_CTRL_DEGRADED */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_DEGRADED, .recovery_state = SAHPI_ES_RUNNING, }, { .event = "00216013", /* EN_SP_SENSOR_DEGRADED */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_DEGRADED, .recovery_state = SAHPI_ES_RUNNING, }, { .event = "00216000", /* EN_IPMI_BMC_COMM_FAIL */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_DEGRADED, .recovery_state = SAHPI_ES_RUNNING, }, { .event = "00101007", /* EN_UNABLE_ISLOATE_BUS */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_DEGRADED, .recovery_state = SAHPI_ES_RUNNING, }, { .event = "00103000", /* EN_MGMT_BUS_FAULT */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_DEGRADED, .recovery_state = SAHPI_ES_RUNNING, }, {}, }, .reading2event = {}, }, .comment = "System Management Bus Operational State Sensor", }, /* MM Redundancy Sensor - event-only */ { .index = 9, .sensor = { .Num = BLADECENTER_SENSOR_NUM_MGMNT_REDUNDANCY, .Type = SAHPI_OPERATIONAL, .Category = SAHPI_EC_REDUNDANCY, .EnableCtrl = SAHPI_FALSE, .EventCtrl = SAHPI_SEC_READ_ONLY, .Events = SAHPI_ES_FULLY_REDUNDANT | SAHPI_ES_NON_REDUNDANT_SUFFICIENT_RESOURCES, .DataFormat = { .IsSupported = SAHPI_FALSE, }, .ThresholdDefn = { .IsAccessible = SAHPI_FALSE, }, .Oem = 0, }, .sensor_info = { .cur_state = SAHPI_ES_UNSPECIFIED, .cur_child_rid = SAHPI_UNSPECIFIED_RESOURCE_ID, .sensor_enabled = SAHPI_TRUE, .events_enabled = SAHPI_TRUE, .assert_mask = SAHPI_ES_NON_REDUNDANT_SUFFICIENT_RESOURCES | SAHPI_ES_FULLY_REDUNDANT, .deassert_mask = SAHPI_ES_NON_REDUNDANT_SUFFICIENT_RESOURCES | SAHPI_ES_FULLY_REDUNDANT, .event_array = { { .event = "00284000", /* EN_MM_NON_REDUNDANT */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_NON_REDUNDANT_SUFFICIENT_RESOURCES, .recovery_state = SAHPI_ES_FULLY_REDUNDANT, }, {}, }, .reading2event = {}, }, .comment = "MM Redundancy Sensor", }, /* Active MM Sensor */ { .index = 10, .sensor = { .Num = BLADECENTER_SENSOR_NUM_MGMNT_ACTIVE, .Type = SAHPI_ENTITY_PRESENCE, .Category = SAHPI_EC_PRESENCE, .EnableCtrl = SAHPI_FALSE, .EventCtrl = SAHPI_SEC_READ_ONLY, .Events = SAHPI_ES_PRESENT | SAHPI_ES_ABSENT, .DataFormat = { .IsSupported = SAHPI_TRUE, .ReadingType = SAHPI_SENSOR_READING_TYPE_UINT64, .BaseUnits = SAHPI_SU_UNSPECIFIED, .ModifierUnits = SAHPI_SU_UNSPECIFIED, .ModifierUse = SAHPI_SMUU_NONE, .Percentage = SAHPI_FALSE, .Range = {} }, .ThresholdDefn = { .IsAccessible = SAHPI_FALSE, }, .Oem = 0, }, .sensor_info = { .mib = { .not_avail_indicator_num = 0, .write_only = SAHPI_FALSE, /* chassisActiveMM */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.4.34.0", .loc_offset = 0, }, .cur_state = SAHPI_ES_PRESENT, .cur_child_rid = SAHPI_UNSPECIFIED_RESOURCE_ID, .sensor_enabled = SAHPI_TRUE, .events_enabled = SAHPI_FALSE, .assert_mask = 0, .deassert_mask = 0, .event_array = { {}, }, .reading2event = {}, }, .comment = "Active MM Sensor", }, /* Standby MM Sensor */ { .index = 11, .sensor = { .Num = BLADECENTER_SENSOR_NUM_MGMNT_STANDBY, .Type = SAHPI_ENTITY_PRESENCE, .Category = SAHPI_EC_PRESENCE, .EnableCtrl = SAHPI_FALSE, .EventCtrl = SAHPI_SEC_READ_ONLY, .Events = SAHPI_ES_PRESENT | SAHPI_ES_ABSENT, .DataFormat = { .IsSupported = SAHPI_TRUE, .ReadingType = SAHPI_SENSOR_READING_TYPE_UINT64, .BaseUnits = SAHPI_SU_UNSPECIFIED, .ModifierUnits = SAHPI_SU_UNSPECIFIED, .ModifierUse = SAHPI_SMUU_NONE, .Percentage = SAHPI_FALSE, .Range = {} }, .ThresholdDefn = { .IsAccessible = SAHPI_FALSE, }, .Oem = 0, }, .sensor_info = { .mib = { .not_avail_indicator_num = 0, .write_only = SAHPI_FALSE, /* chassisActiveMM */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.4.34.0", .loc_offset = 0, }, .cur_state = SAHPI_ES_UNSPECIFIED, .cur_child_rid = SAHPI_UNSPECIFIED_RESOURCE_ID, .sensor_enabled = SAHPI_TRUE, .events_enabled = SAHPI_FALSE, .assert_mask = 0, .deassert_mask = 0, .event_array = { {}, }, .reading2event = {}, }, .comment = "Standby MM Sensor", }, /* Midplane Maximum Power Capability Sensor */ { .index = 12, .sensor = { .Num = BLADECENTER_SENSOR_NUM_MAX_POWER, .Type = SAHPI_OTHER_UNITS_BASED_SENSOR, .Category = SAHPI_EC_THRESHOLD, .EnableCtrl = SAHPI_FALSE, .EventCtrl = SAHPI_SEC_READ_ONLY, .Events = 0, .DataFormat = { .IsSupported = SAHPI_TRUE, .ReadingType = SAHPI_SENSOR_READING_TYPE_UINT64, .BaseUnits = SAHPI_SU_WATTS, .ModifierUnits = SAHPI_SU_UNSPECIFIED, .ModifierUse = SAHPI_SMUU_NONE, .Percentage = SAHPI_FALSE, .Range = {}, }, .ThresholdDefn = { .IsAccessible = SAHPI_FALSE, }, .Oem = 0, }, .sensor_info = { .mib = { .not_avail_indicator_num = 0, .write_only = SAHPI_FALSE, /* pd1ModuleAllocatedPowerMax */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.10.2.1.1.8.1", .threshold_oids = {}, .threshold_write_oids = {}, }, .cur_state = SAHPI_ES_UNSPECIFIED, .cur_child_rid = SAHPI_UNSPECIFIED_RESOURCE_ID, .sensor_enabled = SAHPI_TRUE, .events_enabled = SAHPI_FALSE, .assert_mask = 0, .deassert_mask = 0, .event_array = { {}, }, .reading2event = {}, }, .comment = "Midplane Maximum Power Capability Sensor", }, /* Midplane Assigned Power Sensor */ { .index = 13, .sensor = { .Num = BLADECENTER_SENSOR_NUM_ASSIGNED_POWER, .Type = SAHPI_OTHER_UNITS_BASED_SENSOR, .Category = SAHPI_EC_THRESHOLD, .EnableCtrl = SAHPI_FALSE, .EventCtrl = SAHPI_SEC_READ_ONLY, .Events = 0, .DataFormat = { .IsSupported = SAHPI_TRUE, .ReadingType = SAHPI_SENSOR_READING_TYPE_UINT64, .BaseUnits = SAHPI_SU_WATTS, .ModifierUnits = SAHPI_SU_UNSPECIFIED, .ModifierUse = SAHPI_SMUU_NONE, .Percentage = SAHPI_FALSE, .Range = { .Flags = 0x00, }, }, .ThresholdDefn = { .IsAccessible = SAHPI_FALSE, .ReadThold = 0, .WriteThold = 0, }, .Oem = 0, }, .sensor_info = { .mib = { .not_avail_indicator_num = 0, .write_only = SAHPI_FALSE, /* pd1ModuleAllocatedPowerCurrent */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.10.2.1.1.7.1", .threshold_oids = {}, .threshold_write_oids = {}, }, .cur_state = SAHPI_ES_UNSPECIFIED, .cur_child_rid = SAHPI_UNSPECIFIED_RESOURCE_ID, .sensor_enabled = SAHPI_TRUE, .events_enabled = SAHPI_FALSE, .assert_mask = 0x00, .deassert_mask = 0x00, .event_array = { {}, }, .reading2event = {}, }, .comment = "Midplane Assigned Power Sensor", }, /* Midplane Minumum Power Capability Sensor */ { .index = 14, .sensor = { .Num = BLADECENTER_SENSOR_NUM_MIN_POWER, .Type = SAHPI_OTHER_UNITS_BASED_SENSOR, .Category = SAHPI_EC_THRESHOLD, .EnableCtrl = SAHPI_FALSE, .EventCtrl = SAHPI_SEC_READ_ONLY, .Events = 0, .DataFormat = { .IsSupported = SAHPI_TRUE, .ReadingType = SAHPI_SENSOR_READING_TYPE_UINT64, .BaseUnits = SAHPI_SU_WATTS, .ModifierUnits = SAHPI_SU_UNSPECIFIED, .ModifierUse = SAHPI_SMUU_NONE, .Percentage = SAHPI_FALSE, .Range = {}, }, .ThresholdDefn = { .IsAccessible = SAHPI_FALSE, .ReadThold = 0, .WriteThold = 0, }, .Oem = 0, }, .sensor_info = { .mib = { .not_avail_indicator_num = 0, .write_only = SAHPI_FALSE, /* pd1ModuleAllocatedPowerMin */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.10.2.1.1.9.1", .threshold_oids = {}, .threshold_write_oids = {}, }, .cur_state = SAHPI_ES_UNSPECIFIED, .cur_child_rid = SAHPI_UNSPECIFIED_RESOURCE_ID, .sensor_enabled = SAHPI_TRUE, .events_enabled = SAHPI_FALSE, .assert_mask = 0, .deassert_mask = 0, .event_array = { {}, }, .reading2event = {}, }, .comment = "Midplane Minumum Power Capability Sensor", }, {} /* Terminate array with a null element */ }; /*************************** * Management Module Sensors ***************************/ struct snmp_bc_sensor snmp_bc_mgmnt_sensors[] = { /* MM Operational Status Sensor - event only */ { .index = 1, .sensor = { .Num = 1, .Type = SAHPI_OPERATIONAL, .Category = SAHPI_EC_AVAILABILITY, .EnableCtrl = SAHPI_FALSE, .EventCtrl = SAHPI_SEC_READ_ONLY, .Events = SAHPI_ES_RUNNING | SAHPI_ES_DEGRADED | SAHPI_ES_OFF_LINE | SAHPI_ES_INSTALL_ERROR, .DataFormat = { .IsSupported = SAHPI_FALSE, }, .ThresholdDefn = { .IsAccessible = SAHPI_FALSE, }, .Oem = 0, }, .sensor_info = { .cur_state = SAHPI_ES_RUNNING, .cur_child_rid = SAHPI_UNSPECIFIED_RESOURCE_ID, .sensor_enabled = SAHPI_TRUE, .events_enabled = SAHPI_TRUE, .assert_mask = SAHPI_ES_DEGRADED | SAHPI_ES_OFF_LINE | SAHPI_ES_INSTALL_ERROR, .deassert_mask = SAHPI_ES_DEGRADED | SAHPI_ES_OFF_LINE | SAHPI_ES_INSTALL_ERROR, .event_array = { { .event = "00222000", /* EN_OTHER_I2C */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_OFF_LINE, .recovery_state = SAHPI_ES_RUNNING, }, { .event = "0002201E", /* EN_STCONN_FAIL_OTHERMM */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_OFF_LINE, .recovery_state = SAHPI_ES_RUNNING, }, { .event = "0002201B", /* EN_STBIST_FAIL_R_BOOT_ROM */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_DEGRADED, .recovery_state = SAHPI_ES_RUNNING, }, { .event = "00022052", /* EN_STBIST_FAIL_R_CORE_1 */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_DEGRADED, .recovery_state = SAHPI_ES_RUNNING, }, { .event = "00022053", /* EN_STBIST_FAIL_R_CORE_2 */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_DEGRADED, .recovery_state = SAHPI_ES_RUNNING, }, { .event = "00022019", /* EN_STBIST_FAIL_R_CPLD */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_DEGRADED, .recovery_state = SAHPI_ES_RUNNING, }, { .event = "0002201C", /* EN_STBIST_FAIL_R_ENET_PORT */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_DEGRADED, .recovery_state = SAHPI_ES_RUNNING, }, { .event = "0002201D", /* EN_STBIST_FAIL_R_ENET_SWITCH */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_DEGRADED, .recovery_state = SAHPI_ES_RUNNING, }, { .event = "00022016", /* EN_STBIST_FAIL_R_I2C */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_DEGRADED, .recovery_state = SAHPI_ES_RUNNING, }, { .event = "00022017", /* EN_STBIST_FAIL_R_PRI_FS */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_DEGRADED, .recovery_state = SAHPI_ES_RUNNING, }, { .event = "00022015", /* EN_STBIST_FAIL_R_RTC */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_DEGRADED, .recovery_state = SAHPI_ES_RUNNING, }, { .event = "00022018", /* EN_STBIST_FAIL_R_SEC_FS */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_DEGRADED, .recovery_state = SAHPI_ES_RUNNING, }, { .event = "00014034", /* EN_FAULT_OC_USB_HUB */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_DEGRADED, .recovery_state = SAHPI_ES_RUNNING, }, { .event = "00014033", /* EN_FAULT_OC_USB_PORT */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_DEGRADED, .recovery_state = SAHPI_ES_RUNNING, }, { .event = "0002200B", /* EN_STBIST_FAIL_ADC */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_DEGRADED, .recovery_state = SAHPI_ES_RUNNING, }, { .event = "00022007", /* EN_STBIST_FAIL_BOOT_ROM */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_DEGRADED, .recovery_state = SAHPI_ES_RUNNING, }, { .event = "00022058", /* EN_STBIST_FAIL_CORE_1 */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_DEGRADED, .recovery_state = SAHPI_ES_RUNNING, }, { .event = "00022059", /* EN_STBIST_FAIL_CORE_2 */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_DEGRADED, .recovery_state = SAHPI_ES_RUNNING, }, { .event = "0002205A", /* EN_STBIST_FAIL_CPLD */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_DEGRADED, .recovery_state = SAHPI_ES_RUNNING, }, { .event = "00022008", /* EN_STBIST_FAIL_ENET_PORT */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_DEGRADED, .recovery_state = SAHPI_ES_RUNNING, }, { .event = "0002200A", /* EN_STBIST_FAIL_ENET_SWITCH */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_DEGRADED, .recovery_state = SAHPI_ES_RUNNING, }, { .event = "00022004", /* EN_STBIST_FAIL_I2C */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_DEGRADED, .recovery_state = SAHPI_ES_RUNNING, }, { .event = "00022009", /* EN_STBIST_FAIL_I2C_DEVICE */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_DEGRADED, .recovery_state = SAHPI_ES_RUNNING, }, { .event = "00022005", /* EN_STBIST_FAIL_PRI_FS */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_DEGRADED, .recovery_state = SAHPI_ES_RUNNING, }, { .event = "00022001", /* EN_STBIST_FAIL_R485_1 */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_DEGRADED, .recovery_state = SAHPI_ES_RUNNING, }, { .event = "00022002", /* EN_STBIST_FAIL_R485_2 */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_DEGRADED, .recovery_state = SAHPI_ES_RUNNING, }, { .event = "00022013", /* EN_STBIST_FAIL_RPSERV */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_DEGRADED, .recovery_state = SAHPI_ES_RUNNING, }, { .event = "00022003", /* EN_STBIST_FAIL_RTC */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_DEGRADED, .recovery_state = SAHPI_ES_RUNNING, }, { .event = "00022006", /* EN_STBIST_FAIL_SEC_FS */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_DEGRADED, .recovery_state = SAHPI_ES_RUNNING, }, { .event = "00022011", /* EN_STBIST_FAIL_USB_1 */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_DEGRADED, .recovery_state = SAHPI_ES_RUNNING, }, { .event = "00022012", /* EN_STBIST_FAIL_USB_2 */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_DEGRADED, .recovery_state = SAHPI_ES_RUNNING, }, { .event = "00022054", /* EN_STBIST_FAIL_USB_I2C_1 */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_DEGRADED, .recovery_state = SAHPI_ES_RUNNING, }, { .event = "00022055", /* EN_STBIST_FAIL_USB_I2C_2 */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_DEGRADED, .recovery_state = SAHPI_ES_RUNNING, }, { .event = "06000000", /* EN_SYSTEM_BATTERY_FAILURE */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_DEGRADED, .recovery_state = SAHPI_ES_RUNNING, }, { .event = "00282005", /* EN_MM_MISMATCHED */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_INSTALL_ERROR, .recovery_state = SAHPI_ES_RUNNING, }, {}, }, .reading2event = {}, }, .comment = "MM Operational Status Sensor", }, {} /* Terminate array with a null element */ }; struct snmp_bc_sensor snmp_bc_mgmnt_health_sensors[] = { /* MM Operational Status Sensor for platforms supporting MM Health OID */ { .index = 1, .sensor = { .Num = 1, .Type = SAHPI_OPERATIONAL, .Category = SAHPI_EC_AVAILABILITY, .EnableCtrl = SAHPI_FALSE, .EventCtrl = SAHPI_SEC_READ_ONLY, .Events = SAHPI_ES_RUNNING | SAHPI_ES_DEGRADED | SAHPI_ES_OFF_LINE | SAHPI_ES_INSTALL_ERROR, .DataFormat = { .IsSupported = SAHPI_TRUE, .ReadingType = SAHPI_SENSOR_READING_TYPE_INT64, .BaseUnits = SAHPI_SU_UNSPECIFIED, .ModifierUnits = SAHPI_SU_UNSPECIFIED, .ModifierUse = SAHPI_SMUU_NONE, .Percentage = SAHPI_FALSE, .Range = { .Flags = SAHPI_SRF_MAX | SAHPI_SRF_MIN, .Max = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_INT64, .Value = { .SensorInt64 = 3, }, }, .Min = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_INT64, .Value = { .SensorInt64 = 0, }, }, }, }, .ThresholdDefn = { .IsAccessible = SAHPI_FALSE, }, .Oem = 0, }, .sensor_info = { .mib = { .not_avail_indicator_num = 0, .write_only = SAHPI_FALSE, /* mmHealthState */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.5.1.1.5.x", .loc_offset = 0, }, .cur_state = SAHPI_ES_RUNNING, .cur_child_rid = SAHPI_UNSPECIFIED_RESOURCE_ID, .sensor_enabled = SAHPI_TRUE, .events_enabled = SAHPI_TRUE, .assert_mask = SAHPI_ES_DEGRADED | SAHPI_ES_OFF_LINE | SAHPI_ES_INSTALL_ERROR, .deassert_mask = SAHPI_ES_DEGRADED | SAHPI_ES_OFF_LINE | SAHPI_ES_INSTALL_ERROR, .event_array = { { .event = "00222000", /* EN_OTHER_I2C */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_OFF_LINE, .recovery_state = SAHPI_ES_RUNNING, }, { .event = "0002201E", /* EN_STCONN_FAIL_OTHERMM */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_OFF_LINE, .recovery_state = SAHPI_ES_RUNNING, }, { .event = "0002201B", /* EN_STBIST_FAIL_R_BOOT_ROM */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_DEGRADED, .recovery_state = SAHPI_ES_RUNNING, }, { .event = "00022052", /* EN_STBIST_FAIL_R_CORE_1 */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_DEGRADED, .recovery_state = SAHPI_ES_RUNNING, }, { .event = "00022053", /* EN_STBIST_FAIL_R_CORE_2 */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_DEGRADED, .recovery_state = SAHPI_ES_RUNNING, }, { .event = "00022019", /* EN_STBIST_FAIL_R_CPLD */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_DEGRADED, .recovery_state = SAHPI_ES_RUNNING, }, { .event = "0002201C", /* EN_STBIST_FAIL_R_ENET_PORT */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_DEGRADED, .recovery_state = SAHPI_ES_RUNNING, }, { .event = "0002201D", /* EN_STBIST_FAIL_R_ENET_SWITCH */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_DEGRADED, .recovery_state = SAHPI_ES_RUNNING, }, { .event = "00022016", /* EN_STBIST_FAIL_R_I2C */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_DEGRADED, .recovery_state = SAHPI_ES_RUNNING, }, { .event = "00022017", /* EN_STBIST_FAIL_R_PRI_FS */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_DEGRADED, .recovery_state = SAHPI_ES_RUNNING, }, { .event = "00022015", /* EN_STBIST_FAIL_R_RTC */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_DEGRADED, .recovery_state = SAHPI_ES_RUNNING, }, { .event = "00022018", /* EN_STBIST_FAIL_R_SEC_FS */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_DEGRADED, .recovery_state = SAHPI_ES_RUNNING, }, { .event = "00014034", /* EN_FAULT_OC_USB_HUB */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_DEGRADED, .recovery_state = SAHPI_ES_RUNNING, }, { .event = "00014033", /* EN_FAULT_OC_USB_PORT */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_DEGRADED, .recovery_state = SAHPI_ES_RUNNING, }, { .event = "0002200B", /* EN_STBIST_FAIL_ADC */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_DEGRADED, .recovery_state = SAHPI_ES_RUNNING, }, { .event = "00022007", /* EN_STBIST_FAIL_BOOT_ROM */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_DEGRADED, .recovery_state = SAHPI_ES_RUNNING, }, { .event = "00022058", /* EN_STBIST_FAIL_CORE_1 */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_DEGRADED, .recovery_state = SAHPI_ES_RUNNING, }, { .event = "00022059", /* EN_STBIST_FAIL_CORE_2 */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_DEGRADED, .recovery_state = SAHPI_ES_RUNNING, }, { .event = "0002205A", /* EN_STBIST_FAIL_CPLD */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_DEGRADED, .recovery_state = SAHPI_ES_RUNNING, }, { .event = "00022008", /* EN_STBIST_FAIL_ENET_PORT */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_DEGRADED, .recovery_state = SAHPI_ES_RUNNING, }, { .event = "0002200A", /* EN_STBIST_FAIL_ENET_SWITCH */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_DEGRADED, .recovery_state = SAHPI_ES_RUNNING, }, { .event = "00022004", /* EN_STBIST_FAIL_I2C */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_DEGRADED, .recovery_state = SAHPI_ES_RUNNING, }, { .event = "00022009", /* EN_STBIST_FAIL_I2C_DEVICE */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_DEGRADED, .recovery_state = SAHPI_ES_RUNNING, }, { .event = "00022005", /* EN_STBIST_FAIL_PRI_FS */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_DEGRADED, .recovery_state = SAHPI_ES_RUNNING, }, { .event = "00022001", /* EN_STBIST_FAIL_R485_1 */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_DEGRADED, .recovery_state = SAHPI_ES_RUNNING, }, { .event = "00022002", /* EN_STBIST_FAIL_R485_2 */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_DEGRADED, .recovery_state = SAHPI_ES_RUNNING, }, { .event = "00022013", /* EN_STBIST_FAIL_RPSERV */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_DEGRADED, .recovery_state = SAHPI_ES_RUNNING, }, { .event = "00022003", /* EN_STBIST_FAIL_RTC */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_DEGRADED, .recovery_state = SAHPI_ES_RUNNING, }, { .event = "00022006", /* EN_STBIST_FAIL_SEC_FS */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_DEGRADED, .recovery_state = SAHPI_ES_RUNNING, }, { .event = "00022011", /* EN_STBIST_FAIL_USB_1 */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_DEGRADED, .recovery_state = SAHPI_ES_RUNNING, }, { .event = "00022012", /* EN_STBIST_FAIL_USB_2 */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_DEGRADED, .recovery_state = SAHPI_ES_RUNNING, }, { .event = "00022054", /* EN_STBIST_FAIL_USB_I2C_1 */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_DEGRADED, .recovery_state = SAHPI_ES_RUNNING, }, { .event = "00022055", /* EN_STBIST_FAIL_USB_I2C_2 */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_DEGRADED, .recovery_state = SAHPI_ES_RUNNING, }, { .event = "06000000", /* EN_SYSTEM_BATTERY_FAILURE */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_DEGRADED, .recovery_state = SAHPI_ES_RUNNING, }, { .event = "00282005", /* EN_MM_MISMATCHED */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_INSTALL_ERROR, .recovery_state = SAHPI_ES_RUNNING, }, {}, }, .reading2event = { /* 0 = unknown */ { .num = 1, .rangemap = { .Flags = SAHPI_SRF_MIN, .Min = { .Value = { .SensorInt64 = 1, }, }, }, .state = SAHPI_ES_UNSPECIFIED, }, /* 1 = good */ { .num = 2, .rangemap = { .Flags = SAHPI_SRF_NOMINAL, .Nominal = { .Value = { .SensorInt64 = 1, }, }, }, .state = SAHPI_ES_RUNNING, }, /* 2 = warning */ { .num = 3, .rangemap = { .Flags = SAHPI_SRF_NOMINAL, .Nominal = { .Value = { .SensorInt64 = 2, }, }, }, .state = SAHPI_ES_DEGRADED, }, /* 3 = bad */ { .num = 4, .rangemap = { .Flags = SAHPI_SRF_NOMINAL, .Nominal = { .Value = { .SensorInt64 = 3, }, }, }, .state = SAHPI_ES_OFF_LINE, }, }, }, .comment = "MM Operational Status Sensor", }, {} /* Terminate array with a null element */ }; /*************** * Blade Sensors ***************/ struct snmp_bc_sensor snmp_bc_blade_sensors[] = { /* Blade CPU 1 Temperature Sensor */ { .index = 1, .sensor = { .Num = 1, .Type = SAHPI_TEMPERATURE, .Category = SAHPI_EC_THRESHOLD, .EnableCtrl = SAHPI_FALSE, .EventCtrl = SAHPI_SEC_READ_ONLY, .Events = SAHPI_ES_UPPER_MAJOR | SAHPI_ES_UPPER_CRIT, .DataFormat = { .IsSupported = SAHPI_TRUE, .ReadingType = SAHPI_SENSOR_READING_TYPE_FLOAT64, .BaseUnits = SAHPI_SU_DEGREES_C, .ModifierUnits = SAHPI_SU_UNSPECIFIED, .ModifierUse = SAHPI_SMUU_NONE, .Percentage = SAHPI_FALSE, .Range = { .Flags = SAHPI_SRF_MAX | SAHPI_SRF_MIN, .Max = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, .Value = { .SensorFloat64 = 125, }, }, .Min = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, .Value = { .SensorFloat64 = 0, }, }, }, }, .ThresholdDefn = { .IsAccessible = SAHPI_TRUE, .ReadThold = SAHPI_STM_UP_MAJOR | SAHPI_STM_UP_CRIT, .WriteThold = 0, }, .Oem = 0, }, .sensor_info = { .mib = { .not_avail_indicator_num = 0, .write_only = SAHPI_FALSE, /* temperatureCPU1 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.3.1.6.x", .loc_offset = 0, .threshold_oids = { /* temperatureCPU1HardShutdown */ .UpCritical = ".1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.6.x", /* temperatureCPU1Warning */ .UpMajor = ".1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.7.x", }, .threshold_write_oids = {}, }, .cur_state = SAHPI_ES_UNSPECIFIED, .cur_child_rid = SAHPI_UNSPECIFIED_RESOURCE_ID, .sensor_enabled = SAHPI_TRUE, .events_enabled = SAHPI_TRUE, .assert_mask = SAHPI_ES_UPPER_MAJOR | SAHPI_ES_UPPER_CRIT, .deassert_mask = SAHPI_ES_UPPER_MAJOR | SAHPI_ES_UPPER_CRIT, .event_array = { { .event = "0421C401", /* EN_PROC_HOT_CPU1 */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_UPPER_CRIT, .recovery_state = SAHPI_ES_UPPER_MAJOR, }, { .event = "0421C481", /* EN_CUTOFF_HI_OVER_TEMP_CPU1 */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_UPPER_CRIT, .recovery_state = SAHPI_ES_UPPER_MAJOR, }, { .event = "0421D081", /* EN_THERM_TRIP_CPU1 */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_UPPER_CRIT, .recovery_state = SAHPI_ES_UPPER_MAJOR, }, { .event = "0421D501", /* EN_PFA_HI_OVER_TEMP_CPU1 */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_UPPER_MAJOR, .recovery_state = SAHPI_ES_UNSPECIFIED, }, {}, }, .reading2event = {}, }, .comment = "Blade CPU 1 Temperature Sensor", }, /* Blade CPU 2 Temperature Sensor */ { .index = 2, .sensor = { .Num = 2, .Type = SAHPI_TEMPERATURE, .Category = SAHPI_EC_THRESHOLD, .EnableCtrl = SAHPI_FALSE, .EventCtrl = SAHPI_SEC_READ_ONLY, .Events = SAHPI_ES_UPPER_MAJOR | SAHPI_ES_UPPER_CRIT, .DataFormat = { .IsSupported = SAHPI_TRUE, .ReadingType = SAHPI_SENSOR_READING_TYPE_FLOAT64, .BaseUnits = SAHPI_SU_DEGREES_C, .ModifierUnits = SAHPI_SU_UNSPECIFIED, .ModifierUse = SAHPI_SMUU_NONE, .Percentage = SAHPI_FALSE, .Range = { .Flags = SAHPI_SRF_MAX | SAHPI_SRF_MIN, .Max = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, .Value = { .SensorFloat64 = 125, }, }, .Min = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, .Value = { .SensorFloat64 = 0, }, }, }, }, .ThresholdDefn = { .IsAccessible = SAHPI_TRUE, .ReadThold = SAHPI_STM_UP_MAJOR | SAHPI_STM_UP_CRIT, .WriteThold = 0, }, .Oem = 0, }, .sensor_info = { .mib = { .not_avail_indicator_num = 0, .write_only = SAHPI_FALSE, /* temperatureCPU2 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.3.1.7.x", .loc_offset = 0, .threshold_oids = { /* temperatureCPU2HardShutdown */ .UpCritical = ".1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.9.x", /* temperatureCPU2Warning */ .UpMajor = ".1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.10.x", }, .threshold_write_oids = {}, }, .cur_state = SAHPI_ES_UNSPECIFIED, .cur_child_rid = SAHPI_UNSPECIFIED_RESOURCE_ID, .sensor_enabled = SAHPI_TRUE, .events_enabled = SAHPI_TRUE, .assert_mask = SAHPI_ES_UPPER_MAJOR | SAHPI_ES_UPPER_CRIT, .deassert_mask = SAHPI_ES_UPPER_MAJOR | SAHPI_ES_UPPER_CRIT, .event_array = { { .event = "0421C402", /* EN_PROC_HOT_CPU2 */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_UPPER_CRIT, .recovery_state = SAHPI_ES_UPPER_MAJOR, }, { .event = "0421C482", /* EN_CUTOFF_HI_OVER_TEMP_CPU2 */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_UPPER_CRIT, .recovery_state = SAHPI_ES_UPPER_MAJOR, }, { .event = "0421D082", /* EN_THERM_TRIP_CPU2 */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_UPPER_CRIT, .recovery_state = SAHPI_ES_UPPER_MAJOR, }, { .event = "0421D502", /* EN_PFA_HI_OVER_TEMP_CPU2 */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_UPPER_MAJOR, .recovery_state = SAHPI_ES_UNSPECIFIED, }, {}, }, .reading2event = {}, }, .comment = "Blade CPU 2 Temperature Sensor", }, /* Blade CPU 3 Temperature Sensor */ { .index = 3, .sensor = { .Num = 3, .Type = SAHPI_TEMPERATURE, .Category = SAHPI_EC_THRESHOLD, .EnableCtrl = SAHPI_FALSE, .EventCtrl = SAHPI_SEC_READ_ONLY, .Events = SAHPI_ES_UPPER_MAJOR | SAHPI_ES_UPPER_CRIT, .DataFormat = { .IsSupported = SAHPI_TRUE, .ReadingType = SAHPI_SENSOR_READING_TYPE_FLOAT64, .BaseUnits = SAHPI_SU_DEGREES_C, .ModifierUnits = SAHPI_SU_UNSPECIFIED, .ModifierUse = SAHPI_SMUU_NONE, .Percentage = SAHPI_FALSE, .Range = { .Flags = SAHPI_SRF_MAX | SAHPI_SRF_MIN, .Max = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, .Value = { .SensorFloat64 = 125, }, }, .Min = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, .Value = { .SensorFloat64 = 0, }, }, }, }, .ThresholdDefn = { .IsAccessible = SAHPI_TRUE, .ReadThold = SAHPI_STM_UP_MAJOR | SAHPI_STM_UP_CRIT, .WriteThold = 0, }, .Oem = 0, }, .sensor_info = { .mib = { .not_avail_indicator_num = 0, .write_only = SAHPI_FALSE, /* temperatureCPU3 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.3.1.8.x", .loc_offset = 0, .threshold_oids = { /* temperatureCPU3HardShutdown */ .UpCritical = ".1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.12.x", /* temperatureCPU3Warning */ .UpMajor = ".1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.13.x", }, .threshold_write_oids = {}, }, .cur_state = SAHPI_ES_UNSPECIFIED, .cur_child_rid = SAHPI_UNSPECIFIED_RESOURCE_ID, .sensor_enabled = SAHPI_TRUE, .events_enabled = SAHPI_TRUE, .assert_mask = SAHPI_ES_UPPER_MAJOR | SAHPI_ES_UPPER_CRIT, .deassert_mask = SAHPI_ES_UPPER_MAJOR | SAHPI_ES_UPPER_CRIT, .event_array = { { .event = "0421C403", /* EN_PROC_HOT_CPU3 */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_UPPER_CRIT, .recovery_state = SAHPI_ES_UPPER_MAJOR, }, { .event = "0421C483", /* EN_CUTOFF_HI_OVER_TEMP_CPU3 */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_UPPER_CRIT, .recovery_state = SAHPI_ES_UPPER_MAJOR, }, { .event = "0421D083", /* EN_THERM_TRIP_CPU3 */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_UPPER_CRIT, .recovery_state = SAHPI_ES_UPPER_MAJOR, }, { .event = "0421D503", /* EN_PFA_HI_OVER_TEMP_CPU3 */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_UPPER_MAJOR, .recovery_state = SAHPI_ES_UNSPECIFIED, }, {}, }, .reading2event = {}, }, .comment = "Blade CPU 3 Temperature Sensor", }, /* Blade CPU 4 Temperature Sensor */ { .index = 4, .sensor = { .Num = 4, .Type = SAHPI_TEMPERATURE, .Category = SAHPI_EC_THRESHOLD, .EnableCtrl = SAHPI_FALSE, .EventCtrl = SAHPI_SEC_READ_ONLY, .Events = SAHPI_ES_UPPER_MAJOR | SAHPI_ES_UPPER_CRIT, .DataFormat = { .IsSupported = SAHPI_TRUE, .ReadingType = SAHPI_SENSOR_READING_TYPE_FLOAT64, .BaseUnits = SAHPI_SU_DEGREES_C, .ModifierUnits = SAHPI_SU_UNSPECIFIED, .ModifierUse = SAHPI_SMUU_NONE, .Percentage = SAHPI_FALSE, .Range = { .Flags = SAHPI_SRF_MAX | SAHPI_SRF_MIN, .Max = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, .Value = { .SensorFloat64 = 125, }, }, .Min = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, .Value = { .SensorFloat64 = 0, }, }, }, }, .ThresholdDefn = { .IsAccessible = SAHPI_TRUE, .ReadThold = SAHPI_STM_UP_MAJOR | SAHPI_STM_UP_CRIT, .WriteThold = 0, }, .Oem = 0, }, .sensor_info = { .mib = { .not_avail_indicator_num = 0, .write_only = SAHPI_FALSE, /* temperatureCPU4 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.3.1.9.x", .loc_offset = 0, .threshold_oids = { /* temperatureCPU4HardShutdown */ .UpCritical = ".1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.15.x", /* temperatureCPU4Warning */ .UpMajor = ".1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.16.x", }, .threshold_write_oids = {}, }, .cur_state = SAHPI_ES_UNSPECIFIED, .cur_child_rid = SAHPI_UNSPECIFIED_RESOURCE_ID, .sensor_enabled = SAHPI_TRUE, .events_enabled = SAHPI_TRUE, .assert_mask = SAHPI_ES_UPPER_MAJOR | SAHPI_ES_UPPER_CRIT, .deassert_mask = SAHPI_ES_UPPER_MAJOR | SAHPI_ES_UPPER_CRIT, .event_array = { { .event = "0421C404", /* EN_PROC_HOT_CPU4 */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_UPPER_CRIT, .recovery_state = SAHPI_ES_UPPER_MAJOR, }, { .event = "0421C484", /* EN_CUTOFF_HI_OVER_TEMP_CPU4 */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_UPPER_CRIT, .recovery_state = SAHPI_ES_UPPER_MAJOR, }, { .event = "0421D084", /* EN_THERM_TRIP_CPU4 */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_UPPER_CRIT, .recovery_state = SAHPI_ES_UPPER_MAJOR, }, { .event = "0421D504", /* EN_PFA_HI_OVER_TEMP_CPU4 */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_UPPER_MAJOR, .recovery_state = SAHPI_ES_UNSPECIFIED, }, {}, }, .reading2event = {}, }, .comment = "Blade CPU 4 Temperature Sensor", }, /* Blade 1.25 Volt Sensor */ { .index = 5, .sensor = { .Num = 5, .Type = SAHPI_VOLTAGE, .Category = SAHPI_EC_THRESHOLD, .EnableCtrl = SAHPI_FALSE, .EventCtrl = SAHPI_SEC_READ_ONLY, .Events = SAHPI_ES_LOWER_MAJOR | SAHPI_ES_UPPER_MAJOR, .DataFormat = { .IsSupported = SAHPI_TRUE, .ReadingType = SAHPI_SENSOR_READING_TYPE_FLOAT64, .BaseUnits = SAHPI_SU_VOLTS, .ModifierUnits = SAHPI_SU_UNSPECIFIED, .ModifierUse = SAHPI_SMUU_NONE, .Percentage = SAHPI_FALSE, .Range = { .Flags = SAHPI_SRF_MAX | SAHPI_SRF_MIN | SAHPI_SRF_NOMINAL, .Max = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, .Value = { .SensorFloat64 = 3.3, }, }, .Nominal = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, .Value = { .SensorFloat64 = 1.25, }, }, .Min = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, .Value = { .SensorFloat64 = 0, }, }, }, }, .ThresholdDefn = { .IsAccessible = SAHPI_TRUE, .ReadThold = SAHPI_STM_LOW_MAJOR | SAHPI_STM_UP_MAJOR, .WriteThold = 0, }, .Oem = 0, }, .sensor_info = { .mib = { .not_avail_indicator_num = 0, .write_only = SAHPI_FALSE, /* bladePlus1pt25Volt */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.12.x", .loc_offset = 0, .threshold_oids = { /* bladePlus1pt25VoltHighWarning */ .UpMajor = ".1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.18.x", /* bladePlus1pt25VoltLowWarning */ .LowMajor = ".1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.19.x", }, .threshold_write_oids = {}, }, .cur_state = SAHPI_ES_UNSPECIFIED, .cur_child_rid = SAHPI_UNSPECIFIED_RESOURCE_ID, .sensor_enabled = SAHPI_TRUE, .events_enabled = SAHPI_TRUE, .assert_mask = SAHPI_ES_LOWER_MAJOR | SAHPI_ES_UPPER_MAJOR, .deassert_mask = SAHPI_ES_LOWER_MAJOR | SAHPI_ES_UPPER_MAJOR, .event_array = { { .event = "08001400", /* EN_PFA_HI_FAULT_1_25V */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_UPPER_MAJOR, .recovery_state = SAHPI_ES_UNSPECIFIED, }, { .event = "08001800", /* EN_PFA_LO_FAULT_1_25V */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_LOWER_MAJOR, .recovery_state = SAHPI_ES_UNSPECIFIED, }, {}, }, .reading2event = {}, }, .comment = "Blade 1.25 Volt Sensor", }, /* Blade 1.5 Volt Sensor */ { .index = 6, .sensor = { .Num = 6, .Type = SAHPI_VOLTAGE, .Category = SAHPI_EC_THRESHOLD, .EnableCtrl = SAHPI_FALSE, .EventCtrl = SAHPI_SEC_READ_ONLY, .Events = SAHPI_ES_LOWER_MAJOR | SAHPI_ES_UPPER_MAJOR, .DataFormat = { .IsSupported = SAHPI_TRUE, .ReadingType = SAHPI_SENSOR_READING_TYPE_FLOAT64, .BaseUnits = SAHPI_SU_VOLTS, .ModifierUnits = SAHPI_SU_UNSPECIFIED, .ModifierUse = SAHPI_SMUU_NONE, .Percentage = SAHPI_FALSE, .Range = { .Flags = SAHPI_SRF_MAX | SAHPI_SRF_MIN | SAHPI_SRF_NOMINAL, .Max = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, .Value = { .SensorFloat64 = 4.4, }, }, .Nominal = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, .Value = { .SensorFloat64 = 1.5, }, }, .Min = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, .Value = { .SensorFloat64 = 0, }, }, }, }, .ThresholdDefn = { .IsAccessible = SAHPI_TRUE, .ReadThold = SAHPI_STM_LOW_MAJOR | SAHPI_STM_UP_MAJOR, .WriteThold = 0, }, .Oem = 0, }, .sensor_info = { .mib = { .not_avail_indicator_num = 0, .write_only = SAHPI_FALSE, /* bladePlus1pt5Volt */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.11.x", .loc_offset = 0, .threshold_oids = { /* bladePlus1pt5VoltHighWarning */ .UpMajor = ".1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.16.x", /*bladePlus1pt5VoltLowWarning */ .LowMajor = ".1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.17.x", }, .threshold_write_oids = {}, }, .cur_state = SAHPI_ES_UNSPECIFIED, .cur_child_rid = SAHPI_UNSPECIFIED_RESOURCE_ID, .sensor_enabled = SAHPI_TRUE, .events_enabled = SAHPI_TRUE, .assert_mask = SAHPI_ES_LOWER_MAJOR | SAHPI_ES_UPPER_MAJOR, .deassert_mask = SAHPI_ES_LOWER_MAJOR | SAHPI_ES_UPPER_MAJOR, .event_array = { { .event = "0A041C00", /* EN_IO_1_5V_WARNING_HI */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_UPPER_MAJOR, .recovery_state = SAHPI_ES_UNSPECIFIED, }, { .event = "0A040C00", /* EN_IO_1_5V_WARNING_LOW */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_LOWER_MAJOR, .recovery_state = SAHPI_ES_UNSPECIFIED, }, { .event = "08041400", /* EN_PFA_HI_FAULT_1_5V */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_UPPER_MAJOR, .recovery_state = SAHPI_ES_UNSPECIFIED, }, { .event = "08041800", /* EN_PFA_LO_FAULT_1_5V */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_LOWER_MAJOR, .recovery_state = SAHPI_ES_UNSPECIFIED, }, {}, }, .reading2event = {}, }, .comment = "Blade 1.5 Volt Sensor", }, /* Blade 2.5 Volt Sensor */ { .index = 7, .sensor = { .Num = 7, .Type = SAHPI_VOLTAGE, .Category = SAHPI_EC_THRESHOLD, .EnableCtrl = SAHPI_FALSE, .EventCtrl = SAHPI_SEC_READ_ONLY, .Events = SAHPI_ES_LOWER_MAJOR | SAHPI_ES_UPPER_MAJOR, .DataFormat = { .IsSupported = SAHPI_TRUE, .ReadingType = SAHPI_SENSOR_READING_TYPE_FLOAT64, .BaseUnits = SAHPI_SU_VOLTS, .ModifierUnits = SAHPI_SU_UNSPECIFIED, .ModifierUse = SAHPI_SMUU_NONE, .Percentage = SAHPI_FALSE, .Range = { .Flags = SAHPI_SRF_MAX | SAHPI_SRF_MIN | SAHPI_SRF_NOMINAL, .Max = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, .Value = { .SensorFloat64 = 4.4, }, }, .Nominal = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, .Value = { .SensorFloat64 = 2.5, }, }, .Min = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, .Value = { .SensorFloat64 = 0, }, }, }, }, .ThresholdDefn = { .IsAccessible = SAHPI_TRUE, .ReadThold = SAHPI_STM_LOW_MAJOR | SAHPI_STM_UP_MAJOR, .WriteThold = 0, }, .Oem = 0, }, .sensor_info = { .mib = { .not_avail_indicator_num = 0, .write_only = SAHPI_FALSE, /* bladePlus2pt5Volt */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.10.x", .loc_offset = 0, .threshold_oids = { /* bladePlus2pt5VoltHighWarning */ .UpMajor = ".1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.14.x", /* bladePlus2pt5VoltLowWarning */ .LowMajor = ".1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.15.x", }, .threshold_write_oids = {}, }, .cur_state = SAHPI_ES_UNSPECIFIED, .cur_child_rid = SAHPI_UNSPECIFIED_RESOURCE_ID, .sensor_enabled = SAHPI_TRUE, .events_enabled = SAHPI_TRUE, .assert_mask = SAHPI_ES_LOWER_MAJOR | SAHPI_ES_UPPER_MAJOR, .deassert_mask = SAHPI_ES_LOWER_MAJOR | SAHPI_ES_UPPER_MAJOR, .event_array = { { .event = "0A031C00", /* EN_IO_2_5V_WARNING_HI */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_UPPER_MAJOR, .recovery_state = SAHPI_ES_UNSPECIFIED, }, { .event = "0A030C00", /* EN_IO_2_5V_WARNING_LOW */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_LOWER_MAJOR, .recovery_state = SAHPI_ES_UNSPECIFIED, }, { .event = "08031480", /* EN_PFA_HI_FAULT_2_5V */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_UPPER_MAJOR, .recovery_state = SAHPI_ES_UNSPECIFIED, }, { .event = "08031880", /* EN_PFA_LO_FAULT_2_5V */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_LOWER_MAJOR, .recovery_state = SAHPI_ES_UNSPECIFIED, }, {}, }, .reading2event = {}, }, .comment = "Blade 2.5 Volt Sensor", }, /* Blade 3.3 Volt Sensor */ { .index = 8, .sensor = { .Num = 8, .Type = SAHPI_VOLTAGE, .Category = SAHPI_EC_THRESHOLD, .EnableCtrl = SAHPI_FALSE, .EventCtrl = SAHPI_SEC_READ_ONLY, .Events = SAHPI_ES_LOWER_MAJOR | SAHPI_ES_UPPER_MAJOR, .DataFormat = { .IsSupported = SAHPI_TRUE, .ReadingType = SAHPI_SENSOR_READING_TYPE_FLOAT64, .BaseUnits = SAHPI_SU_VOLTS, .ModifierUnits = SAHPI_SU_UNSPECIFIED, .ModifierUse = SAHPI_SMUU_NONE, .Percentage = SAHPI_FALSE, .Range = { .Flags = SAHPI_SRF_MAX | SAHPI_SRF_MIN | SAHPI_SRF_NOMINAL, .Max = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, .Value = { .SensorFloat64 = 4.4, }, }, .Nominal = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, .Value = { .SensorFloat64 = 3.3, }, }, .Min = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, .Value = { .SensorFloat64 = 0, }, }, }, }, .ThresholdDefn = { .IsAccessible = SAHPI_TRUE, .ReadThold = SAHPI_STM_LOW_MAJOR | SAHPI_STM_UP_MAJOR, .WriteThold = 0, }, .Oem = 0, }, .sensor_info = { .mib = { .not_avail_indicator_num = 0, .write_only = SAHPI_FALSE, /* bladePlus3pt3Volt */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.7.x", .loc_offset = 0, .threshold_oids = { /* bladePlus3pt3VoltHighWarning */ .UpMajor = ".1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.8.x", /* bladePlus3pt3VoltLowWarning */ .LowMajor = ".1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.9.x", }, .threshold_write_oids = {}, }, .cur_state = SAHPI_ES_UNSPECIFIED, .cur_child_rid = SAHPI_UNSPECIFIED_RESOURCE_ID, .sensor_enabled = SAHPI_TRUE, .events_enabled = SAHPI_TRUE, .assert_mask = SAHPI_ES_LOWER_MAJOR | SAHPI_ES_UPPER_MAJOR, .deassert_mask = SAHPI_ES_LOWER_MAJOR | SAHPI_ES_UPPER_MAJOR, .event_array = { { .event = "0A02DC00", /* EN_IO_3_3V_WARNING_HI */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_UPPER_MAJOR, .recovery_state = SAHPI_ES_UNSPECIFIED, }, { .event = "0A02CC00", /* EN_IO_3_3V_WARNING_LOW */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_LOWER_MAJOR, .recovery_state = SAHPI_ES_UNSPECIFIED, }, { .event = "08033480", /* EN_PFA_HI_FAULT_3_35V */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_UPPER_MAJOR, .recovery_state = SAHPI_ES_UNSPECIFIED, }, { .event = "FF032900", /* EN_MAJOR_LO_FAULT_3_35V */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_LOWER_MAJOR, .recovery_state = SAHPI_ES_UNSPECIFIED, }, {}, }, .reading2event = {}, }, .comment = "Blade 3.3 Volt Sensor", }, /* Blade 5 Volt Sensor */ { .index = 9, .sensor = { .Num = 9, .Type = SAHPI_VOLTAGE, .Category = SAHPI_EC_THRESHOLD, .EnableCtrl = SAHPI_FALSE, .EventCtrl = SAHPI_SEC_READ_ONLY, .Events = SAHPI_ES_LOWER_MAJOR | SAHPI_ES_UPPER_MAJOR, .DataFormat = { .IsSupported = SAHPI_TRUE, .ReadingType = SAHPI_SENSOR_READING_TYPE_FLOAT64, .BaseUnits = SAHPI_SU_VOLTS, .ModifierUnits = SAHPI_SU_UNSPECIFIED, .ModifierUse = SAHPI_SMUU_NONE, .Percentage = SAHPI_FALSE, .Range = { .Flags = SAHPI_SRF_MAX | SAHPI_SRF_MIN | SAHPI_SRF_NOMINAL, .Max = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, .Value = { .SensorFloat64 = 6.7, }, }, .Nominal = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, .Value = { .SensorFloat64 = 5, }, }, .Min = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, .Value = { .SensorFloat64 = 0, }, }, }, }, .ThresholdDefn = { .IsAccessible = SAHPI_TRUE, .ReadThold = SAHPI_STM_LOW_MAJOR | SAHPI_STM_UP_MAJOR, .WriteThold = 0, }, .Oem = 0, }, .sensor_info = { .mib = { .not_avail_indicator_num = 0, .write_only = SAHPI_FALSE, /* bladePlus5Volt */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.6.x", .loc_offset = 0, .threshold_oids = { /* bladePlus5VoltHighWarning */ .UpMajor = ".1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.6.x", /* bladePlus5VoltLowWarning */ .LowMajor = ".1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.7.x", }, .threshold_write_oids = {}, }, .cur_state = SAHPI_ES_UNSPECIFIED, .cur_child_rid = SAHPI_UNSPECIFIED_RESOURCE_ID, .sensor_enabled = SAHPI_TRUE, .events_enabled = SAHPI_TRUE, .assert_mask = SAHPI_ES_LOWER_MAJOR | SAHPI_ES_UPPER_MAJOR, .deassert_mask = SAHPI_ES_LOWER_MAJOR | SAHPI_ES_UPPER_MAJOR, .event_array = { { .event = "0A035C00", /* EN_IO_5V_WARNING_HI */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_UPPER_MAJOR, .recovery_state = SAHPI_ES_UNSPECIFIED, }, { .event = "0A034C00", /* EN_IO_5V_WARNING_LOW */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_LOWER_CRIT, .recovery_state = SAHPI_ES_UNSPECIFIED, }, { .event = "08035500", /* EN_PFA_HI_FAULT_5V */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_UPPER_MAJOR, .recovery_state = SAHPI_ES_UNSPECIFIED, }, { .event = "08035800", /* EN_PFA_LO_FAULT_5V */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_LOWER_MAJOR, .recovery_state = SAHPI_ES_UNSPECIFIED, }, {}, }, .reading2event = {}, }, .comment = "Blade 5 Volt Sensor", }, /* Blade 12 Volt Sensor */ { .index = 10, .sensor = { .Num = 10, .Type = SAHPI_VOLTAGE, .Category = SAHPI_EC_THRESHOLD, .EnableCtrl = SAHPI_FALSE, .EventCtrl = SAHPI_SEC_READ_ONLY, .Events = SAHPI_ES_LOWER_MAJOR | SAHPI_ES_UPPER_MAJOR, .DataFormat = { .IsSupported = SAHPI_TRUE, .ReadingType = SAHPI_SENSOR_READING_TYPE_FLOAT64, .BaseUnits = SAHPI_SU_VOLTS, .ModifierUnits = SAHPI_SU_UNSPECIFIED, .ModifierUse = SAHPI_SMUU_NONE, .Percentage = SAHPI_FALSE, .Range = { .Flags = SAHPI_SRF_MAX | SAHPI_SRF_MIN | SAHPI_SRF_NOMINAL, .Max = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, .Value = { .SensorFloat64 = 16, }, }, .Nominal = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, .Value = { .SensorFloat64 = 12, }, }, .Min = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, .Value = { .SensorFloat64 = 0, }, }, }, }, .ThresholdDefn = { .IsAccessible = SAHPI_TRUE, .ReadThold = SAHPI_STM_LOW_MAJOR | SAHPI_STM_UP_MAJOR, .WriteThold = 0, }, .Oem = 0, }, .sensor_info = { .mib = { .not_avail_indicator_num = 0, .write_only = SAHPI_FALSE, /* bladePlus12Volt */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.8.x", .loc_offset = 0, .threshold_oids = { /* bladePlus12VoltHighWarning */ .UpMajor = ".1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.10.x", /*bladePlus12VoltLowWarning */ .LowMajor = ".1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.11.x", }, .threshold_write_oids = {}, }, .cur_state = SAHPI_ES_UNSPECIFIED, .cur_child_rid = SAHPI_UNSPECIFIED_RESOURCE_ID, .sensor_enabled = SAHPI_TRUE, .events_enabled = SAHPI_TRUE, .assert_mask = SAHPI_ES_LOWER_MAJOR | SAHPI_ES_UPPER_MAJOR, .deassert_mask = SAHPI_ES_LOWER_MAJOR | SAHPI_ES_UPPER_MAJOR, .event_array = { { .event = "0A037C00", /* EN_IO_12V_WARNING_HI */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_UPPER_MAJOR, .recovery_state = SAHPI_ES_UNSPECIFIED, }, { .event = "0A036C00", /* EN_IO_12V_WARNING_LOW */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_LOWER_MAJOR, .recovery_state = SAHPI_ES_UNSPECIFIED, }, { .event = "06037500", /* EN_PFA_HI_FAULT_12V_PLANAR */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_UPPER_MAJOR, .recovery_state = SAHPI_ES_UNSPECIFIED, }, { .event = "06037800", /* EN_PFA_LO_FAULT_12V_PLANAR */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_LOWER_MAJOR, .recovery_state = SAHPI_ES_UNSPECIFIED, }, {}, }, .reading2event = {}, }, .comment = "Blade 12 Volt Sensor", }, /* Blade VRM Voltage Sensor */ { .index = 11, .sensor = { .Num = 11, .Type = SAHPI_VOLTAGE, .Category = SAHPI_EC_THRESHOLD, .EnableCtrl = SAHPI_FALSE, .EventCtrl = SAHPI_SEC_READ_ONLY, .Events = SAHPI_ES_LOWER_MAJOR | SAHPI_ES_UPPER_MAJOR, .DataFormat = { .IsSupported = SAHPI_TRUE, .ReadingType = SAHPI_SENSOR_READING_TYPE_FLOAT64, .BaseUnits = SAHPI_SU_VOLTS, .ModifierUnits = SAHPI_SU_UNSPECIFIED, .ModifierUse = SAHPI_SMUU_NONE, .Percentage = SAHPI_FALSE, .Range = { .Flags = SAHPI_SRF_MAX | SAHPI_SRF_MIN, .Max = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, .Value = { .SensorFloat64 = 3.6, }, }, .Min = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, .Value = { .SensorFloat64 = 0, }, }, }, }, .ThresholdDefn = { .IsAccessible = SAHPI_FALSE, .ReadThold = 0, .WriteThold = 0, }, .Oem = 0, }, .sensor_info = { .mib = { .not_avail_indicator_num = 0, .write_only = SAHPI_FALSE, /* bladeVRM1Volt */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.13.x", .loc_offset = 0, }, .cur_state = SAHPI_ES_UNSPECIFIED, .cur_child_rid = SAHPI_UNSPECIFIED_RESOURCE_ID, .sensor_enabled = SAHPI_TRUE, .events_enabled = SAHPI_TRUE, .assert_mask = SAHPI_ES_LOWER_MAJOR | SAHPI_ES_UPPER_MAJOR, .deassert_mask = SAHPI_ES_LOWER_MAJOR | SAHPI_ES_UPPER_MAJOR, .event_array = { { .event = "04401501", /* EN_PFA_HI_FAULT_VRM1 */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_UPPER_MAJOR, .recovery_state = SAHPI_ES_UNSPECIFIED, }, { .event = "04401801", /* EN_PFA_LO_FAULT_VRM1 */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_LOWER_MAJOR, .recovery_state = SAHPI_ES_UNSPECIFIED, }, { .event = "04401502", /* EN_PFA_HI_FAULT_VRM2 */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_UPPER_MAJOR, .recovery_state = SAHPI_ES_UNSPECIFIED, }, { .event = "04401802", /* EN_PFA_LO_FAULT_VRM2 */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_LOWER_MAJOR, .recovery_state = SAHPI_ES_UNSPECIFIED, }, {}, }, .reading2event = {}, }, .comment = "Blade VRM Voltage Sensor", }, /* Blade Operational Status Sensor */ { .index = 12, .sensor = { .Num = 12, .Type = SAHPI_OPERATIONAL, .Category = SAHPI_EC_AVAILABILITY, .EnableCtrl = SAHPI_FALSE, .EventCtrl = SAHPI_SEC_READ_ONLY, .Events = SAHPI_ES_RUNNING | SAHPI_ES_OFF_LINE | SAHPI_ES_DEGRADED | SAHPI_ES_INSTALL_ERROR, .DataFormat = { .IsSupported = SAHPI_TRUE, .ReadingType = SAHPI_SENSOR_READING_TYPE_INT64, .BaseUnits = SAHPI_SU_UNSPECIFIED, .ModifierUnits = SAHPI_SU_UNSPECIFIED, .ModifierUse = SAHPI_SMUU_NONE, .Percentage = SAHPI_FALSE, .Range = { .Flags = SAHPI_SRF_MAX | SAHPI_SRF_MIN, .Max = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_INT64, .Value = { .SensorInt64 = 9, }, }, .Min = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_INT64, .Value = { .SensorInt64 = 0, }, }, }, }, .ThresholdDefn = { .IsAccessible = SAHPI_FALSE, }, .Oem = 0, }, .sensor_info = { .mib = { .not_avail_indicator_num = 0, .write_only = SAHPI_FALSE, /* bladeHealthState */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.1.1.5.x", .loc_offset = 0, }, .cur_state = SAHPI_ES_RUNNING, .cur_child_rid = SAHPI_UNSPECIFIED_RESOURCE_ID, .sensor_enabled = SAHPI_TRUE, .events_enabled = SAHPI_TRUE, .assert_mask = SAHPI_ES_DEGRADED | SAHPI_ES_OFF_LINE | SAHPI_ES_INSTALL_ERROR, .deassert_mask = SAHPI_ES_DEGRADED | SAHPI_ES_OFF_LINE | SAHPI_ES_INSTALL_ERROR, .event_array = { { .event = "0E00A00x", /* EN_BLADE_x_INSUFFICIENT_PWR */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_OFF_LINE, .recovery_state = SAHPI_ES_RUNNING, }, { .event = "0F00C00x", /* EN_BLADE_1_SHUTDOWN_OVER_PWR_BUDGET */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_OFF_LINE, .recovery_state = SAHPI_ES_RUNNING, }, { .event = "0E01200x", /* EN_BLADE_2_UNIDENTIABLE_HW_DENY_POWER */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_OFF_LINE, .recovery_state = SAHPI_ES_RUNNING, }, { .event = "0401A000", /* EN_CPU_BD_POWER_FAULT */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_OFF_LINE, .recovery_state = SAHPI_ES_RUNNING, }, { .event = "04018000", /* EN_CPU_BD_VOLTAGE_FAULT */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_OFF_LINE, .recovery_state = SAHPI_ES_RUNNING, }, { .event = "0401E000", /* EN_CPU_INVALID_CONFIG */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_OFF_LINE, .recovery_state = SAHPI_ES_RUNNING, }, { .event = "04300201", /* EN_IERR_CPU1 */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_OFF_LINE, .recovery_state = SAHPI_ES_RUNNING, }, { .event = "04300202", /* EN_IERR_CPU2 */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_OFF_LINE, .recovery_state = SAHPI_ES_RUNNING, }, { .event = "04300203", /* EN_IERR_CPU3 */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_OFF_LINE, .recovery_state = SAHPI_ES_RUNNING, }, { .event = "04300204", /* EN_IERR_CPU4 */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_OFF_LINE, .recovery_state = SAHPI_ES_RUNNING, }, { .event = "0421C081", /* EN_OVER_TEMP_CPU1 */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_OFF_LINE, .recovery_state = SAHPI_ES_RUNNING, }, { .event = "0421C082", /* EN_OVER_TEMP_CPU2 */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_OFF_LINE, .recovery_state = SAHPI_ES_RUNNING, }, { .event = "0421C083", /* EN_OVER_TEMP_CPU3 */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_OFF_LINE, .recovery_state = SAHPI_ES_RUNNING, }, { .event = "0421C084", /* EN_OVER_TEMP_CPU4 */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_OFF_LINE, .recovery_state = SAHPI_ES_RUNNING, }, { .event = "00000069", /* EN_DASD */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_OFF_LINE, .recovery_state = SAHPI_ES_RUNNING, }, { .event = "06016000", /* EN_IO_BD_FAULT */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_OFF_LINE, .recovery_state = SAHPI_ES_RUNNING, }, { .event = "0601A000", /* EN_IO_BD_POWER_FAULT */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_OFF_LINE, .recovery_state = SAHPI_ES_RUNNING, }, { .event = "06018000", /* EN_IO_BD_VOLTAGE_FAULT */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_OFF_LINE, .recovery_state = SAHPI_ES_RUNNING, }, { .event = "00028000", /* EN_FAULT_POWER_GOOD */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_OFF_LINE, .recovery_state = SAHPI_ES_RUNNING, }, { .event = "00028001", /* EN_FAULT_SYS_POWER_GOOD */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_OFF_LINE, .recovery_state = SAHPI_ES_RUNNING, }, { .event = "04428000", /* EN_FAULT_VRM_POWER_GOOD */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_OFF_LINE, .recovery_state = SAHPI_ES_RUNNING, }, { .event = "04428001", /* EN_FAULT_VRM_POWER_GOOD_1 */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_OFF_LINE, .recovery_state = SAHPI_ES_RUNNING, }, { .event = "04428002", /* EN_FAULT_VRM_POWER_GOOD_2 */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_OFF_LINE, .recovery_state = SAHPI_ES_RUNNING, }, { .event = "04428003", /* EN_FAULT_VRM_POWER_GOOD_3 */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_OFF_LINE, .recovery_state = SAHPI_ES_RUNNING, }, { .event = "04428004", /* EN_FAULT_VRM_POWER_GOOD_4 */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_OFF_LINE, .recovery_state = SAHPI_ES_RUNNING, }, { .event = "04000000", /* EN_AUTO_BIOS_ALERT */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_OFF_LINE, .recovery_state = SAHPI_ES_RUNNING, }, { .event = "0D01E000", /* EN_HSDC_FAULT */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_OFF_LINE, .recovery_state = SAHPI_ES_RUNNING, }, { .event = "00216030", /* EN_IPMI_SM_INIT_FAIL */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_OFF_LINE, .recovery_state = SAHPI_ES_RUNNING, }, { .event = "0021601C", /* EN_IPMI_SYS_BOARD_FAIL */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_OFF_LINE, .recovery_state = SAHPI_ES_RUNNING, }, { .event = "0021603E", /* EN_IPMI_PCI_BUS_TIMEOUT */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_OFF_LINE, .recovery_state = SAHPI_ES_RUNNING, }, { .event = "0021603F", /* EN_IPMI_BIOS_HALTED_UNSPEC */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_OFF_LINE, .recovery_state = SAHPI_ES_RUNNING, }, { .event = "08016080", /* EN_PWR_CONTROLLER_TIMEOUT */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_OFF_LINE, .recovery_state = SAHPI_ES_RUNNING, }, { .event = "05200000", /* EN_MEMORY_FAIL */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_OFF_LINE, .recovery_state = SAHPI_ES_RUNNING, }, { .event = "0A000281", /* EN_UNCORRECT_DIMM_1_ERR */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_OFF_LINE, .recovery_state = SAHPI_ES_RUNNING, }, { .event = "0A000282", /* EN_UNCORRECT_DIMM_2_ERR */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_OFF_LINE, .recovery_state = SAHPI_ES_RUNNING, }, { .event = "0A000283", /* EN_UNCORRECT_DIMM_3_ERR */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_OFF_LINE, .recovery_state = SAHPI_ES_RUNNING, }, { .event = "0A000284", /* EN_UNCORRECT_DIMM_4_ERR */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_OFF_LINE, .recovery_state = SAHPI_ES_RUNNING, }, { .event = "0A000285", /* EN_UNCORRECT_DIMM_5_ERR */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_OFF_LINE, .recovery_state = SAHPI_ES_RUNNING, }, { .event = "0A000286", /* EN_UNCORRECT_DIMM_6_ERR */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_OFF_LINE, .recovery_state = SAHPI_ES_RUNNING, }, { .event = "0A000287", /* EN_UNCORRECT_DIMM_7_ERR */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_OFF_LINE, .recovery_state = SAHPI_ES_RUNNING, }, { .event = "0A000288", /* EN_UNCORRECT_DIMM_8_ERR */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_OFF_LINE, .recovery_state = SAHPI_ES_RUNNING, }, { .event = "00216012", /* EN_IPMI_UNCORRECT_BUS_ERR */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_OFF_LINE, .recovery_state = SAHPI_ES_RUNNING, }, { .event = "00216003", /* EN_IPMI_DIMM_ERR */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_OFF_LINE, .recovery_state = SAHPI_ES_RUNNING, }, { .event = "06C16000", /* EN_MEM_MOD_BUS_UNCORR_ERR */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_OFF_LINE, .recovery_state = SAHPI_ES_RUNNING, }, { .event = "0E00E00x", /* EN_BLADE_x_NO_PWR_VPD */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_DEGRADED, .recovery_state = SAHPI_ES_RUNNING, }, { .event = "0E01000x", /* EN_BLADE_x_NO_MGT_VPD */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_DEGRADED, .recovery_state = SAHPI_ES_RUNNING, }, { .event = "0E00800x", /* EN_BLADE_x_COMM_FAIL */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_DEGRADED, .recovery_state = SAHPI_ES_RUNNING, }, { .event = "0E00C00x", /* EN_BLADE_x_THROTTLED */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_DEGRADED, .recovery_state = SAHPI_ES_RUNNING, }, { .event = "00000077", /* EN_BOOT_FAIL */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_DEGRADED, .recovery_state = SAHPI_ES_RUNNING, }, { .event = "0A000000", /* EN_CKVM_FAULT */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_DEGRADED, .recovery_state = SAHPI_ES_RUNNING, }, { .event = "04204001", /* EN_CPU_1_DISABLED */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_DEGRADED, .recovery_state = SAHPI_ES_RUNNING, }, { .event = "04204002", /* EN_CPU_2_DISABLED */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_DEGRADED, .recovery_state = SAHPI_ES_RUNNING, }, { .event = "04204003", /* EN_CPU_3_DISABLED */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_DEGRADED, .recovery_state = SAHPI_ES_RUNNING, }, { .event = "04204004", /* EN_CPU_4_DISABLED */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_DEGRADED, .recovery_state = SAHPI_ES_RUNNING, }, { .event = "04306201", /* EN_IERR_CPU_RESTART1 */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_DEGRADED, .recovery_state = SAHPI_ES_RUNNING, }, { .event = "04306202", /* EN_IERR_CPU_RESTART2 */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_DEGRADED, .recovery_state = SAHPI_ES_RUNNING, }, { .event = "04306203", /* EN_IERR_CPU_RESTART3 */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_DEGRADED, .recovery_state = SAHPI_ES_RUNNING, }, { .event = "04306204", /* EN_IERR_CPU_RESTART4 */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_DEGRADED, .recovery_state = SAHPI_ES_RUNNING, }, { .event = "0000006F", /* EN_NC_VOLT */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_DEGRADED, .recovery_state = SAHPI_ES_RUNNING, }, { .event = "09025000", /* EN_FP_NP */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_DEGRADED, .recovery_state = SAHPI_ES_RUNNING, }, { .event = "0421D401", /* EN_CPU1_TEMP_WARN */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_DEGRADED, .recovery_state = SAHPI_ES_RUNNING, }, { .event = "0421D402", /* EN_CPU2_TEMP_WARN */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_DEGRADED, .recovery_state = SAHPI_ES_RUNNING, }, { .event = "0801B402", /* EN_PFA_HI_EXCEDED_CUR_12V_A_MAX */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_DEGRADED, .recovery_state = SAHPI_ES_RUNNING, }, { .event = "06802000", /* EN_FAULT_DASD1_HARD_DRIVE_0 */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_DEGRADED, .recovery_state = SAHPI_ES_RUNNING, }, { .event = "06800001", /* EN_FAULT_DASD1_HARD_DRIVE_1 */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_DEGRADED, .recovery_state = SAHPI_ES_RUNNING, }, { .event = "0A07BC00", /* EN_IO_1_8V_WARNING_HI */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_DEGRADED, .recovery_state = SAHPI_ES_RUNNING, }, { .event = "0A07AC00", /* EN_IO_1_8V_WARNING_LOW */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_DEGRADED, .recovery_state = SAHPI_ES_RUNNING, }, { .event = "0A031C01", /* EN_IO_2_5VS_WARNING_HI */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_DEGRADED, .recovery_state = SAHPI_ES_RUNNING, }, { .event = "0A030C01", /* EN_IO_2_5VS_WARNING_LOW */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_DEGRADED, .recovery_state = SAHPI_ES_RUNNING, }, { .event = "0A02DC01", /* EN_IO_3_3VS_WARNING_HI */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_DEGRADED, .recovery_state = SAHPI_ES_RUNNING, }, { .event = "0A02CC01", /* EN_IO_3_3VS_WARNING_LOW */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_DEGRADED, .recovery_state = SAHPI_ES_RUNNING, }, { .event = "0A037C01", /* EN_IO_12VS_WARNING_HI */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_DEGRADED, .recovery_state = SAHPI_ES_RUNNING, }, { .event = "0A036C01", /* EN_IO_12VS_WARNING_LOW */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_DEGRADED, .recovery_state = SAHPI_ES_RUNNING, }, { .event = "0A03DC00", /* EN_IO_N5V_WARNING_HI */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_DEGRADED, .recovery_state = SAHPI_ES_RUNNING, }, { .event = "0A03CC00", /* EN_IO_N5V_WARNING_LOW */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_DEGRADED, .recovery_state = SAHPI_ES_RUNNING, }, { .event = "00216025", /* EN_IPMI_CPU_SPEED_FAIL */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_DEGRADED, .recovery_state = SAHPI_ES_RUNNING, }, { .event = "00216024", /* EN_IPMI_CPU_VOLT_MISMATCH */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_DEGRADED, .recovery_state = SAHPI_ES_RUNNING, }, { .event = "0021603D", /* EN_IPMI_PROC_INIT_FAIL */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_DEGRADED, .recovery_state = SAHPI_ES_RUNNING, }, { .event = "00216028", /* EN_IPMI_SP2_INIT_FAIL */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_DEGRADED, .recovery_state = SAHPI_ES_RUNNING, }, { .event = "00216039", /* EN_IPMI_BOARD_INIT_FAIL */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_DEGRADED, .recovery_state = SAHPI_ES_RUNNING, }, { .event = "00216020", /* EN_IPMI_BOOT_MEDIA_MISSING */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_DEGRADED, .recovery_state = SAHPI_ES_RUNNING, }, { .event = "0021602F", /* EN_IPMI_CACHE_INIT_FAIL */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_DEGRADED, .recovery_state = SAHPI_ES_RUNNING, }, { .event = "0021601E", /* EN_IPMI_DISK_CTRL_FAIL */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_DEGRADED, .recovery_state = SAHPI_ES_RUNNING, }, { .event = "00216027", /* EN_IPMI_DRIVE_INIT_FAIL */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_DEGRADED, .recovery_state = SAHPI_ES_RUNNING, }, { .event = "00216023", /* EN_IPMI_FW_ROM_CORRUPT */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_DEGRADED, .recovery_state = SAHPI_ES_RUNNING, }, { .event = "0021601A", /* EN_IPMI_MEM_FAILED */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_DEGRADED, .recovery_state = SAHPI_ES_RUNNING, }, { .event = "00216026", /* EN_IPMI_MEM_INIT_FAIL */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_DEGRADED, .recovery_state = SAHPI_ES_RUNNING, }, { .event = "00216032", /* EN_IPMI_MGMT_CTRL_INIT_FAIL */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_DEGRADED, .recovery_state = SAHPI_ES_RUNNING, }, { .event = "00216019", /* EN_IPMI_NO_MEM */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_DEGRADED, .recovery_state = SAHPI_ES_RUNNING, }, { .event = "00216038", /* EN_IPMI_OS_BOOT_FAIL */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_DEGRADED, .recovery_state = SAHPI_ES_RUNNING, }, { .event = "0021602B", /* EN_IPMI_PCI_CONF_FAIL */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_DEGRADED, .recovery_state = SAHPI_ES_RUNNING, }, { .event = "00216011", /* EN_IPMI_PCI_SERR */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_DEGRADED, .recovery_state = SAHPI_ES_RUNNING, }, { .event = "0021602D", /* EN_IPMI_ROM_INIT_FAIL */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_DEGRADED, .recovery_state = SAHPI_ES_RUNNING, }, { .event = "0021601B", /* EN_IPMI_STORAGE_DEV_FAIL */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_DEGRADED, .recovery_state = SAHPI_ES_RUNNING, }, { .event = "0021602C", /* EN_IPMI_USB_CONF_FAIL */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_DEGRADED, .recovery_state = SAHPI_ES_RUNNING, }, { .event = "00216037", /* EN_IPMI_WAKEUP_VECTOR_FAIL */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_DEGRADED, .recovery_state = SAHPI_ES_RUNNING, }, { .event = "BBBB0001", /* EN_BIOS_RTC */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_DEGRADED, .recovery_state = SAHPI_ES_RUNNING, }, { .event = "0E00600x", /* EN_BLADE_x_CFG_FAIL */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_INSTALL_ERROR, .recovery_state = SAHPI_ES_RUNNING, }, { .event = "0EC00001", /* EN_BEM_1_FAULT */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_INSTALL_ERROR, .recovery_state = SAHPI_ES_RUNNING, }, { .event = "0EC00002", /* EN_BEM_2_FAULT */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_INSTALL_ERROR, .recovery_state = SAHPI_ES_RUNNING, }, { .event = "08100080", /* EN_PWR_CONTROLLER_MISMATCH */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_INSTALL_ERROR, .recovery_state = SAHPI_ES_RUNNING, }, { .event = "0D000281", /* EN_BSE_LEGACY_DC1_DONT_WORK */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_INSTALL_ERROR, .recovery_state = SAHPI_ES_RUNNING, }, { .event = "0D000282", /* EN_BSE_LEGACY_DC2_DONT_WORK */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_INSTALL_ERROR, .recovery_state = SAHPI_ES_RUNNING, }, { .event = "04000300", /* EN_POWER_JUMPER_NP */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_INSTALL_ERROR, .recovery_state = SAHPI_ES_RUNNING, }, { .event = "04000280", /* EN_BLADE_INCOMPATIABLE */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_INSTALL_ERROR, .recovery_state = SAHPI_ES_RUNNING, }, {}, }, .reading2event = { /* 0 = unknown */ { .num = 1, .rangemap = { .Flags = SAHPI_SRF_MIN, .Min = { .Value = { .SensorInt64 = 1, }, }, }, .state = SAHPI_ES_UNSPECIFIED, }, /* 1 = good */ { .num = 2, .rangemap = { .Flags = SAHPI_SRF_NOMINAL, .Nominal = { .Value = { .SensorInt64 = 1, }, }, }, .state = SAHPI_ES_RUNNING, }, /* 2 = warning */ { .num = 3, .rangemap = { .Flags = SAHPI_SRF_NOMINAL, .Nominal = { .Value = { .SensorInt64 = 2, }, }, }, .state = SAHPI_ES_DEGRADED, }, /* 3 = bad, 4 = kernelMode, 5 = discovering, 6 = commError 7 = noPower, 8 = flashing */ { .num = 4, .rangemap = { .Flags = SAHPI_SRF_MIN | SAHPI_SRF_MAX, .Min = { .Value = { .SensorInt64 = 3, }, }, .Max = { .Value = { .SensorInt64 = 8, }, }, }, .state = SAHPI_ES_OFF_LINE, }, /* 9 = initFailure */ { .num = 5, .rangemap = { .Flags = SAHPI_SRF_NOMINAL, .Nominal = { .Value = { .SensorInt64 = 9, }, }, }, .state = SAHPI_ES_INSTALL_ERROR, }, }, }, .comment = "Blade Operational Status Sensor", }, /* Blade NMI Status Sensor */ { .index = 13, .sensor = { .Num = 13, .Type = SAHPI_CRITICAL_INTERRUPT, .Category = SAHPI_EC_STATE, .EnableCtrl = SAHPI_FALSE, .EventCtrl = SAHPI_SEC_READ_ONLY, .Events = SAHPI_ES_STATE_ASSERTED | SAHPI_ES_STATE_DEASSERTED, .DataFormat = { .IsSupported = SAHPI_FALSE, }, .ThresholdDefn = { .IsAccessible = SAHPI_FALSE, }, .Oem = 0, }, .sensor_info = { .cur_state = SAHPI_ES_STATE_DEASSERTED, .cur_child_rid = SAHPI_UNSPECIFIED_RESOURCE_ID, .sensor_enabled = SAHPI_TRUE, .events_enabled = SAHPI_TRUE, .assert_mask = SAHPI_ES_STATE_ASSERTED, .deassert_mask = SAHPI_ES_STATE_ASSERTED, .event_array = { { .event = "0000007E", /* EN_SYSERR_LED_ONLY */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_STATE_ASSERTED, .recovery_state = SAHPI_ES_STATE_DEASSERTED, }, {}, }, .reading2event = {}, }, .comment = "Blade NMI Status Sensor", }, /* Blade Management Bus Operational Status Sensor - event only */ { .index = 14, .sensor = { .Num = 14, .Type = SAHPI_OPERATIONAL, .Category = SAHPI_EC_AVAILABILITY, .EnableCtrl = SAHPI_FALSE, .EventCtrl = SAHPI_SEC_READ_ONLY, .Events = SAHPI_ES_RUNNING | SAHPI_ES_OFF_LINE, .DataFormat = { .IsSupported = SAHPI_FALSE, }, .ThresholdDefn = { .IsAccessible = SAHPI_FALSE, }, .Oem = 0, }, .sensor_info = { .cur_state = SAHPI_ES_RUNNING, .cur_child_rid = SAHPI_UNSPECIFIED_RESOURCE_ID, .sensor_enabled = SAHPI_TRUE, .events_enabled = SAHPI_TRUE, .assert_mask = SAHPI_ES_OFF_LINE, .deassert_mask = SAHPI_ES_OFF_LINE, .event_array = { { .event = "0E02200x", /* EN_STCONN_FAIL_BLADE_x */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_OFF_LINE, .recovery_state = SAHPI_ES_RUNNING, }, {}, }, .reading2event = {}, }, .comment = "Blade Management Bus Operations Sensor", }, {} /* Terminate array with a null element */ }; /* Blade IPMI Sensors */ /* NOTE: Define IPMI Tags as uppercase */ #define SNMP_BC_LAST_NON_IPMI_BLADE_SENSOR 14 struct snmp_bc_ipmi_sensor snmp_bc_blade_ipmi_sensors[] = { /* Blade CPU 1 Temperature Sensor */ { .ipmi_tag = "CPU1 TEMP", .ipmi_tag_alias1 = "CPU 1 TEMP", .ipmi = { .index = 1, .sensor = { .Num = SNMP_BC_LAST_NON_IPMI_BLADE_SENSOR + 1, .Type = SAHPI_TEMPERATURE, .Category = SAHPI_EC_THRESHOLD, .EnableCtrl = SAHPI_FALSE, .EventCtrl = SAHPI_SEC_READ_ONLY, .Events = SAHPI_ES_UPPER_MAJOR | SAHPI_ES_UPPER_CRIT, .DataFormat = { .IsSupported = SAHPI_TRUE, .ReadingType = SAHPI_SENSOR_READING_TYPE_FLOAT64, .BaseUnits = SAHPI_SU_DEGREES_C, .ModifierUnits = SAHPI_SU_UNSPECIFIED, .ModifierUse = SAHPI_SMUU_NONE, .Percentage = SAHPI_FALSE, .Range = { .Flags = SAHPI_SRF_MAX | SAHPI_SRF_MIN, .Max = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, .Value = { .SensorFloat64 = 125, }, }, .Min = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, .Value = { .SensorFloat64 = 0, }, }, }, }, .ThresholdDefn = { .IsAccessible = SAHPI_TRUE, .ReadThold = SAHPI_STM_UP_MAJOR | SAHPI_STM_UP_CRIT, .WriteThold = 0, }, .Oem = 0, }, .sensor_info = { .mib = { .not_avail_indicator_num = 0, .write_only = SAHPI_FALSE, .oid = "discovered", .loc_offset = 0, .threshold_oids = { .UpCritical = "discovered", .UpMajor = "discovered", }, .threshold_write_oids = {}, }, .cur_state = SAHPI_ES_UNSPECIFIED, .cur_child_rid = SAHPI_UNSPECIFIED_RESOURCE_ID, .sensor_enabled = SAHPI_TRUE, .events_enabled = SAHPI_TRUE, .assert_mask = SAHPI_ES_UPPER_MAJOR | SAHPI_ES_UPPER_CRIT, .deassert_mask = SAHPI_ES_UPPER_MAJOR | SAHPI_ES_UPPER_CRIT, .event_array = { { .event = "FFFFFF1C", /* EN_GENERIC_HI_CRIT_TEMP */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_UPPER_CRIT, .recovery_state = SAHPI_ES_UPPER_MAJOR, }, { .event = "FFFFFF1D", /* EN_GENERIC_HI_WARN_TEMP */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_UPPER_MAJOR, .recovery_state = SAHPI_ES_UNSPECIFIED, }, {}, }, .reading2event = {}, }, .comment = "Blade CPU 1 Temperature Sensor", }, }, /* Blade CPU 2 Temperature Sensor */ { .ipmi_tag = "CPU2 TEMP", .ipmi_tag_alias1 = "CPU 2 TEMP", .ipmi = { .index = 2, .sensor = { .Num = SNMP_BC_LAST_NON_IPMI_BLADE_SENSOR + 2, .Type = SAHPI_TEMPERATURE, .Category = SAHPI_EC_THRESHOLD, .EnableCtrl = SAHPI_FALSE, .EventCtrl = SAHPI_SEC_READ_ONLY, .Events = SAHPI_ES_UPPER_MAJOR | SAHPI_ES_UPPER_CRIT, .DataFormat = { .IsSupported = SAHPI_TRUE, .ReadingType = SAHPI_SENSOR_READING_TYPE_FLOAT64, .BaseUnits = SAHPI_SU_DEGREES_C, .ModifierUnits = SAHPI_SU_UNSPECIFIED, .ModifierUse = SAHPI_SMUU_NONE, .Percentage = SAHPI_FALSE, .Range = { .Flags = SAHPI_SRF_MAX | SAHPI_SRF_MIN, .Max = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, .Value = { .SensorFloat64 = 125, }, }, .Min = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, .Value = { .SensorFloat64 = 0, }, }, }, }, .ThresholdDefn = { .IsAccessible = SAHPI_TRUE, .ReadThold = SAHPI_STM_UP_MAJOR | SAHPI_STM_UP_CRIT, .WriteThold = 0, }, .Oem = 0, }, .sensor_info = { .mib = { .not_avail_indicator_num = 0, .write_only = SAHPI_FALSE, .oid = "discovered", .loc_offset = 0, .threshold_oids = { .UpCritical = "discovered", .UpMajor = "discovered", }, .threshold_write_oids = {}, }, .cur_state = SAHPI_ES_UNSPECIFIED, .cur_child_rid = SAHPI_UNSPECIFIED_RESOURCE_ID, .sensor_enabled = SAHPI_TRUE, .events_enabled = SAHPI_TRUE, .assert_mask = SAHPI_ES_UPPER_MAJOR | SAHPI_ES_UPPER_CRIT, .deassert_mask = SAHPI_ES_UPPER_MAJOR | SAHPI_ES_UPPER_CRIT, .event_array = { { .event = "FFFFFF20", /* EN_GENERIC_HI_CRIT_TEMP */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_UPPER_CRIT, .recovery_state = SAHPI_ES_UPPER_MAJOR, }, { .event = "FFFFFF21", /* EN_GENERIC_HI_WARN_TEMP */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_UPPER_MAJOR, .recovery_state = SAHPI_ES_UNSPECIFIED, }, {}, }, .reading2event = {}, }, .comment = "Blade CPU 2 Temperature Sensor", }, }, /* Blade CPU 3 Temperature Sensor */ { .ipmi_tag = "CPU3 TEMP", .ipmi_tag_alias1 = "CPU 3 TEMP", .ipmi = { .index = 3, .sensor = { .Num = SNMP_BC_LAST_NON_IPMI_BLADE_SENSOR + 3, .Type = SAHPI_TEMPERATURE, .Category = SAHPI_EC_THRESHOLD, .EnableCtrl = SAHPI_FALSE, .EventCtrl = SAHPI_SEC_READ_ONLY, .Events = SAHPI_ES_UPPER_MAJOR | SAHPI_ES_UPPER_CRIT, .DataFormat = { .IsSupported = SAHPI_TRUE, .ReadingType = SAHPI_SENSOR_READING_TYPE_FLOAT64, .BaseUnits = SAHPI_SU_DEGREES_C, .ModifierUnits = SAHPI_SU_UNSPECIFIED, .ModifierUse = SAHPI_SMUU_NONE, .Percentage = SAHPI_FALSE, .Range = { .Flags = SAHPI_SRF_MAX | SAHPI_SRF_MIN, .Max = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, .Value = { .SensorFloat64 = 125, }, }, .Min = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, .Value = { .SensorFloat64 = 0, }, }, }, }, .ThresholdDefn = { .IsAccessible = SAHPI_TRUE, .ReadThold = SAHPI_STM_UP_MAJOR | SAHPI_STM_UP_CRIT, .WriteThold = 0, }, .Oem = 0, }, .sensor_info = { .mib = { .not_avail_indicator_num = 0, .write_only = SAHPI_FALSE, .oid = "discovered", .loc_offset = 0, .threshold_oids = { .UpCritical = "discovered", .UpMajor = "discovered", }, .threshold_write_oids = {}, }, .cur_state = SAHPI_ES_UNSPECIFIED, .cur_child_rid = SAHPI_UNSPECIFIED_RESOURCE_ID, .sensor_enabled = SAHPI_TRUE, .events_enabled = SAHPI_TRUE, .assert_mask = SAHPI_ES_UPPER_MAJOR | SAHPI_ES_UPPER_CRIT, .deassert_mask = SAHPI_ES_UPPER_MAJOR | SAHPI_ES_UPPER_CRIT, .event_array = { { .event = "FFFFFF22", /* EN_GENERIC_HI_CRIT_TEMP */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_UPPER_CRIT, .recovery_state = SAHPI_ES_UPPER_MAJOR, }, { .event = "FFFFFF23", /* EN_GENERIC_HI_WARN_TEMP */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_UPPER_MAJOR, .recovery_state = SAHPI_ES_UNSPECIFIED, }, {}, }, .reading2event = {}, }, .comment = "Blade CPU 3 Temperature Sensor", }, }, /* Blade CPU 4 Temperature Sensor */ { .ipmi_tag = "CPU4 TEMP", .ipmi_tag_alias1 = "CPU 4 TEMP", .ipmi = { .index = 4, .sensor = { .Num = SNMP_BC_LAST_NON_IPMI_BLADE_SENSOR + 4, .Type = SAHPI_TEMPERATURE, .Category = SAHPI_EC_THRESHOLD, .EnableCtrl = SAHPI_FALSE, .EventCtrl = SAHPI_SEC_READ_ONLY, .Events = SAHPI_ES_UPPER_MAJOR | SAHPI_ES_UPPER_CRIT, .DataFormat = { .IsSupported = SAHPI_TRUE, .ReadingType = SAHPI_SENSOR_READING_TYPE_FLOAT64, .BaseUnits = SAHPI_SU_DEGREES_C, .ModifierUnits = SAHPI_SU_UNSPECIFIED, .ModifierUse = SAHPI_SMUU_NONE, .Percentage = SAHPI_FALSE, .Range = { .Flags = SAHPI_SRF_MAX | SAHPI_SRF_MIN, .Max = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, .Value = { .SensorFloat64 = 125, }, }, .Min = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, .Value = { .SensorFloat64 = 0, }, }, }, }, .ThresholdDefn = { .IsAccessible = SAHPI_TRUE, .ReadThold = SAHPI_STM_UP_MAJOR | SAHPI_STM_UP_CRIT, .WriteThold = 0, }, .Oem = 0, }, .sensor_info = { .mib = { .not_avail_indicator_num = 0, .write_only = SAHPI_FALSE, .oid = "discovered", .loc_offset = 0, .threshold_oids = { .UpCritical = "discovered", .UpMajor = "discovered", }, .threshold_write_oids = {}, }, .cur_state = SAHPI_ES_UNSPECIFIED, .cur_child_rid = SAHPI_UNSPECIFIED_RESOURCE_ID, .sensor_enabled = SAHPI_TRUE, .events_enabled = SAHPI_TRUE, .assert_mask = SAHPI_ES_UPPER_MAJOR | SAHPI_ES_UPPER_CRIT, .deassert_mask = SAHPI_ES_UPPER_MAJOR | SAHPI_ES_UPPER_CRIT, .event_array = { { .event = "FFFFFF24", /* EN_GENERIC_HI_CRIT_TEMP */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_UPPER_CRIT, .recovery_state = SAHPI_ES_UPPER_MAJOR, }, { .event = "FFFFFF25", /* EN_GENERIC_HI_WARN_TEMP */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_UPPER_MAJOR, .recovery_state = SAHPI_ES_UNSPECIFIED, }, {}, }, .reading2event = {}, }, .comment = "Blade CPU 4 Temperature Sensor", }, }, /* Blade 0.9 Volt Sensor */ { .ipmi_tag = "PLANAR 0.9V", .ipmi_tag_alias1 = '\0', .ipmi = { .index = 5, .sensor = { .Num = SNMP_BC_LAST_NON_IPMI_BLADE_SENSOR + 5, .Type = SAHPI_VOLTAGE, .Category = SAHPI_EC_THRESHOLD, .EnableCtrl = SAHPI_FALSE, .EventCtrl = SAHPI_SEC_READ_ONLY, .Events = SAHPI_ES_LOWER_MAJOR | SAHPI_ES_UPPER_MAJOR, .DataFormat = { .IsSupported = SAHPI_TRUE, .ReadingType = SAHPI_SENSOR_READING_TYPE_FLOAT64, .BaseUnits = SAHPI_SU_VOLTS, .ModifierUnits = SAHPI_SU_UNSPECIFIED, .ModifierUse = SAHPI_SMUU_NONE, .Percentage = SAHPI_FALSE, .Range = { .Flags = SAHPI_SRF_MAX | SAHPI_SRF_MIN | SAHPI_SRF_NOMINAL, .Max = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, .Value = { .SensorFloat64 = 1.5, }, }, .Nominal = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, .Value = { .SensorFloat64 = 0.9, }, }, .Min = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, .Value = { .SensorFloat64 = 0, }, }, }, }, .ThresholdDefn = { .IsAccessible = SAHPI_TRUE, .ReadThold = SAHPI_STM_LOW_MAJOR | SAHPI_STM_UP_MAJOR, .WriteThold = 0, }, .Oem = 0, }, .sensor_info = { .mib = { .not_avail_indicator_num = 0, .write_only = SAHPI_FALSE, .oid = "discovered", .loc_offset = 0, .threshold_oids = { .UpMajor = "discovered", .LowMajor = "discovered", }, .threshold_write_oids = {}, }, .cur_state = SAHPI_ES_UNSPECIFIED, .cur_child_rid = SAHPI_UNSPECIFIED_RESOURCE_ID, .sensor_enabled = SAHPI_TRUE, .events_enabled = SAHPI_TRUE, .assert_mask = SAHPI_ES_LOWER_MAJOR | SAHPI_ES_UPPER_MAJOR, .deassert_mask = SAHPI_ES_LOWER_MAJOR | SAHPI_ES_UPPER_MAJOR, .event_array = { { .event = "FFFFFFF1", /* EN_GENERIC_UPPER_WARN_VOLT */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_UPPER_MAJOR, .recovery_state = SAHPI_ES_UNSPECIFIED, }, { .event = "FFFFFFF2", /* EN_GENERIC_LOWER_WARN_VOLT */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_LOWER_MAJOR, .recovery_state = SAHPI_ES_UNSPECIFIED, }, {}, }, .reading2event = {}, }, .comment = "Blade 0.9 Volt Sensor", }, }, /* Blade 1.2 Volt Sensor */ { .ipmi_tag = "1.2V SENSE", .ipmi_tag_alias1 = "PLANAR 1.2V", .ipmi = { .index = 6, .sensor = { .Num = SNMP_BC_LAST_NON_IPMI_BLADE_SENSOR + 6, .Type = SAHPI_VOLTAGE, .Category = SAHPI_EC_THRESHOLD, .EnableCtrl = SAHPI_FALSE, .EventCtrl = SAHPI_SEC_READ_ONLY, .Events = SAHPI_ES_LOWER_MAJOR | SAHPI_ES_UPPER_MAJOR, .DataFormat = { .IsSupported = SAHPI_TRUE, .ReadingType = SAHPI_SENSOR_READING_TYPE_FLOAT64, .BaseUnits = SAHPI_SU_VOLTS, .ModifierUnits = SAHPI_SU_UNSPECIFIED, .ModifierUse = SAHPI_SMUU_NONE, .Percentage = SAHPI_FALSE, .Range = { .Flags = SAHPI_SRF_MAX | SAHPI_SRF_MIN | SAHPI_SRF_NOMINAL, .Max = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, .Value = { .SensorFloat64 = 3.3, }, }, .Nominal = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, .Value = { .SensorFloat64 = 1.2, }, }, .Min = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, .Value = { .SensorFloat64 = 0, }, }, }, }, .ThresholdDefn = { .IsAccessible = SAHPI_TRUE, .ReadThold = SAHPI_STM_LOW_MAJOR | SAHPI_STM_UP_MAJOR, .WriteThold = 0, }, .Oem = 0, }, .sensor_info = { .mib = { .not_avail_indicator_num = 0, .write_only = SAHPI_FALSE, .oid = "discovered", .loc_offset = 0, .threshold_oids = { .UpMajor = "discovered", .LowMajor = "discovered", }, .threshold_write_oids = {}, }, .cur_state = SAHPI_ES_UNSPECIFIED, .cur_child_rid = SAHPI_UNSPECIFIED_RESOURCE_ID, .sensor_enabled = SAHPI_TRUE, .events_enabled = SAHPI_TRUE, .assert_mask = SAHPI_ES_LOWER_MAJOR | SAHPI_ES_UPPER_MAJOR, .deassert_mask = SAHPI_ES_LOWER_MAJOR | SAHPI_ES_UPPER_MAJOR, .event_array = { { .event = "08001401", /* EN_PFA_HI_FAULT_1_2V */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_UPPER_MAJOR, .recovery_state = SAHPI_ES_UNSPECIFIED, }, { .event = "08001801", /* EN_PFA_LO_FAULT_1_2V */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_LOWER_MAJOR, .recovery_state = SAHPI_ES_UNSPECIFIED, }, {}, }, .reading2event = {}, }, .comment = "Blade 1.2 Volt Sensor", }, }, /* Blade Standby 1.2 Volt Sensor */ { .ipmi_tag = "1.2VSB SENSE", .ipmi_tag_alias1 = "PLANAR 1.2VSB", .ipmi = { .index = 7, .sensor = { .Num = SNMP_BC_LAST_NON_IPMI_BLADE_SENSOR + 7, .Type = SAHPI_VOLTAGE, .Category = SAHPI_EC_THRESHOLD, .EnableCtrl = SAHPI_FALSE, .EventCtrl = SAHPI_SEC_READ_ONLY, .Events = SAHPI_ES_LOWER_MAJOR | SAHPI_ES_UPPER_MAJOR, .DataFormat = { .IsSupported = SAHPI_TRUE, .ReadingType = SAHPI_SENSOR_READING_TYPE_FLOAT64, .BaseUnits = SAHPI_SU_VOLTS, .ModifierUnits = SAHPI_SU_UNSPECIFIED, .ModifierUse = SAHPI_SMUU_NONE, .Percentage = SAHPI_FALSE, .Range = { .Flags = SAHPI_SRF_MAX | SAHPI_SRF_MIN | SAHPI_SRF_NOMINAL, .Max = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, .Value = { .SensorFloat64 = 3.3, }, }, .Nominal = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, .Value = { .SensorFloat64 = 1.2, }, }, .Min = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, .Value = { .SensorFloat64 = 0, }, }, }, }, .ThresholdDefn = { .IsAccessible = SAHPI_TRUE, .ReadThold = SAHPI_STM_LOW_MAJOR | SAHPI_STM_UP_MAJOR, .WriteThold = 0, }, .Oem = 0, }, .sensor_info = { .mib = { .not_avail_indicator_num = 0, .write_only = SAHPI_FALSE, .oid = "discovered", .loc_offset = 0, .threshold_oids = { .UpMajor = "discovered", .LowMajor = "discovered", }, .threshold_write_oids = {}, }, .cur_state = SAHPI_ES_UNSPECIFIED, .cur_child_rid = SAHPI_UNSPECIFIED_RESOURCE_ID, .sensor_enabled = SAHPI_TRUE, .events_enabled = SAHPI_TRUE, .assert_mask = SAHPI_ES_LOWER_MAJOR | SAHPI_ES_UPPER_MAJOR, .deassert_mask = SAHPI_ES_LOWER_MAJOR | SAHPI_ES_UPPER_MAJOR, .event_array = { { .event = "0A00BC02", /* EN_1_2VS_WARNING_HI */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_UPPER_MAJOR, .recovery_state = SAHPI_ES_UNSPECIFIED, }, { .event = "0A00AC02", /* EN_1_2VS_WARNING_LOW */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_LOWER_MAJOR, .recovery_state = SAHPI_ES_UNSPECIFIED, }, {}, }, .reading2event = {}, }, .comment = "Blade Standby 1.2 Volt Sensor", }, }, /* Blade 1.5 Volt Sensor */ { .ipmi_tag = "1.5V SENSE", .ipmi_tag_alias1 = "PLANAR 1.5V", .ipmi = { .index = 8, .sensor = { .Num = SNMP_BC_LAST_NON_IPMI_BLADE_SENSOR + 8, .Type = SAHPI_VOLTAGE, .Category = SAHPI_EC_THRESHOLD, .EnableCtrl = SAHPI_FALSE, .EventCtrl = SAHPI_SEC_READ_ONLY, .Events = SAHPI_ES_LOWER_MAJOR | SAHPI_ES_UPPER_MAJOR, .DataFormat = { .IsSupported = SAHPI_TRUE, .ReadingType = SAHPI_SENSOR_READING_TYPE_FLOAT64, .BaseUnits = SAHPI_SU_VOLTS, .ModifierUnits = SAHPI_SU_UNSPECIFIED, .ModifierUse = SAHPI_SMUU_NONE, .Percentage = SAHPI_FALSE, .Range = { .Flags = SAHPI_SRF_MAX | SAHPI_SRF_MIN | SAHPI_SRF_NOMINAL, .Max = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, .Value = { .SensorFloat64 = 4.4, }, }, .Nominal = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, .Value = { .SensorFloat64 = 1.5, }, }, .Min = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, .Value = { .SensorFloat64 = 0, }, }, }, }, .ThresholdDefn = { .IsAccessible = SAHPI_TRUE, .ReadThold = SAHPI_STM_LOW_MAJOR | SAHPI_STM_UP_MAJOR, .WriteThold = 0, }, .Oem = 0, }, .sensor_info = { .mib = { .not_avail_indicator_num = 0, .write_only = SAHPI_FALSE, .oid = "discovered", .loc_offset = 0, .threshold_oids = { .UpMajor = "discovered", .LowMajor = "discovered", }, .threshold_write_oids = {}, }, .cur_state = SAHPI_ES_UNSPECIFIED, .cur_child_rid = SAHPI_UNSPECIFIED_RESOURCE_ID, .sensor_enabled = SAHPI_TRUE, .events_enabled = SAHPI_TRUE, .assert_mask = SAHPI_ES_LOWER_MAJOR | SAHPI_ES_UPPER_MAJOR, .deassert_mask = SAHPI_ES_LOWER_MAJOR | SAHPI_ES_UPPER_MAJOR, .event_array = { /* No IPMI unique events */ {}, }, .reading2event = {}, }, .comment = "Blade 1.5 Volt Sensor", }, }, /* Blade Standby 1.5 Volt Sensor */ { .ipmi_tag = "1.5VSB SENSE", .ipmi_tag_alias1 = "PLANAR 1.5VSB", .ipmi = { .index = 9, .sensor = { .Num = SNMP_BC_LAST_NON_IPMI_BLADE_SENSOR + 9, .Type = SAHPI_VOLTAGE, .Category = SAHPI_EC_THRESHOLD, .EnableCtrl = SAHPI_FALSE, .EventCtrl = SAHPI_SEC_READ_ONLY, .Events = SAHPI_ES_LOWER_MAJOR | SAHPI_ES_UPPER_MAJOR, .DataFormat = { .IsSupported = SAHPI_TRUE, .ReadingType = SAHPI_SENSOR_READING_TYPE_FLOAT64, .BaseUnits = SAHPI_SU_VOLTS, .ModifierUnits = SAHPI_SU_UNSPECIFIED, .ModifierUse = SAHPI_SMUU_NONE, .Percentage = SAHPI_FALSE, .Range = { .Flags = SAHPI_SRF_MAX | SAHPI_SRF_MIN | SAHPI_SRF_NOMINAL, .Max = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, .Value = { .SensorFloat64 = 4.4, }, }, .Nominal = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, .Value = { .SensorFloat64 = 1.5, }, }, .Min = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, .Value = { .SensorFloat64 = 0, }, }, }, }, .ThresholdDefn = { .IsAccessible = SAHPI_TRUE, .ReadThold = SAHPI_STM_LOW_MAJOR | SAHPI_STM_UP_MAJOR, .WriteThold = 0, }, .Oem = 0, }, .sensor_info = { .mib = { .not_avail_indicator_num = 0, .write_only = SAHPI_FALSE, .oid = "discovered", .loc_offset = 0, .threshold_oids = { .UpMajor = "discovered", .LowMajor = "discovered", }, .threshold_write_oids = {}, }, .cur_state = SAHPI_ES_UNSPECIFIED, .cur_child_rid = SAHPI_UNSPECIFIED_RESOURCE_ID, .sensor_enabled = SAHPI_TRUE, .events_enabled = SAHPI_TRUE, .assert_mask = SAHPI_ES_LOWER_MAJOR | SAHPI_ES_UPPER_MAJOR, .deassert_mask = SAHPI_ES_LOWER_MAJOR | SAHPI_ES_UPPER_MAJOR, .event_array = { { .event = "0A041C02", /* EN_1_5VS_WARNING_HI */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_UPPER_MAJOR, .recovery_state = SAHPI_ES_UNSPECIFIED, }, { .event = "0A040C02", /* EN_1_5VS_WARNING_LOW */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_LOWER_MAJOR, .recovery_state = SAHPI_ES_UNSPECIFIED, }, {}, }, .reading2event = {}, }, .comment = "Blade Standby 1.5 Volt Sensor", }, }, /* Blade 1.8 Volt Sensor */ { .ipmi_tag = "1.8V SENSE", .ipmi_tag_alias1 = "PLANAR 1.8V", .ipmi = { .index = 10, .sensor = { .Num = SNMP_BC_LAST_NON_IPMI_BLADE_SENSOR + 10, .Type = SAHPI_VOLTAGE, .Category = SAHPI_EC_THRESHOLD, .EnableCtrl = SAHPI_FALSE, .EventCtrl = SAHPI_SEC_READ_ONLY, .Events = SAHPI_ES_LOWER_MAJOR | SAHPI_ES_UPPER_MAJOR, .DataFormat = { .IsSupported = SAHPI_TRUE, .ReadingType = SAHPI_SENSOR_READING_TYPE_FLOAT64, .BaseUnits = SAHPI_SU_VOLTS, .ModifierUnits = SAHPI_SU_UNSPECIFIED, .ModifierUse = SAHPI_SMUU_NONE, .Percentage = SAHPI_FALSE, .Range = { .Flags = SAHPI_SRF_MAX | SAHPI_SRF_MIN | SAHPI_SRF_NOMINAL, .Max = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, .Value = { .SensorFloat64 = 4.4, }, }, .Nominal = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, .Value = { .SensorFloat64 = 1.8, }, }, .Min = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, .Value = { .SensorFloat64 = 0, }, }, }, }, .ThresholdDefn = { .IsAccessible = SAHPI_TRUE, .ReadThold = SAHPI_STM_LOW_MAJOR | SAHPI_STM_UP_MAJOR, .WriteThold = 0, }, .Oem = 0, }, .sensor_info = { .mib = { .not_avail_indicator_num = 0, .write_only = SAHPI_FALSE, .oid = "discovered", .loc_offset = 0, .threshold_oids = { .LowMajor = "discovered", .UpMajor = "discovered", }, .threshold_write_oids = {}, }, .cur_state = SAHPI_ES_UNSPECIFIED, .cur_child_rid = SAHPI_UNSPECIFIED_RESOURCE_ID, .sensor_enabled = SAHPI_TRUE, .events_enabled = SAHPI_TRUE, .assert_mask = SAHPI_ES_LOWER_MAJOR | SAHPI_ES_UPPER_MAJOR, .deassert_mask = SAHPI_ES_LOWER_MAJOR | SAHPI_ES_UPPER_MAJOR, .event_array = { { .event = "0807B400", /* EN_PFA_HI_FAULT_1_8V */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_UPPER_MAJOR, .recovery_state = SAHPI_ES_UNSPECIFIED, }, { .event = "0807B800", /* EN_PFA_LO_FAULT_1_8V */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_LOWER_MAJOR, .recovery_state = SAHPI_ES_UNSPECIFIED, }, {}, }, .reading2event = {}, }, .comment = "Blade 1.8 Volt Sensor", }, }, /* Blade Standby 1.8 Volt Sensor */ { .ipmi_tag = "1.8VSB SENSE", .ipmi_tag_alias1 = "PLANAR 1.8VSB", .ipmi = { .index = 11, .sensor = { .Num = SNMP_BC_LAST_NON_IPMI_BLADE_SENSOR + 11, .Type = SAHPI_VOLTAGE, .Category = SAHPI_EC_THRESHOLD, .EnableCtrl = SAHPI_FALSE, .EventCtrl = SAHPI_SEC_READ_ONLY, .Events = SAHPI_ES_LOWER_MAJOR | SAHPI_ES_UPPER_MAJOR, .DataFormat = { .IsSupported = SAHPI_TRUE, .ReadingType = SAHPI_SENSOR_READING_TYPE_FLOAT64, .BaseUnits = SAHPI_SU_VOLTS, .ModifierUnits = SAHPI_SU_UNSPECIFIED, .ModifierUse = SAHPI_SMUU_NONE, .Percentage = SAHPI_FALSE, .Range = { .Flags = SAHPI_SRF_MAX | SAHPI_SRF_MIN | SAHPI_SRF_NOMINAL, .Max = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, .Value = { .SensorFloat64 = 4.4, }, }, .Nominal = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, .Value = { .SensorFloat64 = 1.8, }, }, .Min = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, .Value = { .SensorFloat64 = 0, }, }, }, }, .ThresholdDefn = { .IsAccessible = SAHPI_TRUE, .ReadThold = SAHPI_STM_LOW_MAJOR | SAHPI_STM_UP_MAJOR, .WriteThold = 0, }, .Oem = 0, }, .sensor_info = { .mib = { .not_avail_indicator_num = 0, .write_only = SAHPI_FALSE, .oid = "discovered", .loc_offset = 0, .threshold_oids = { .LowMajor = "discovered", .UpMajor = "discovered", }, .threshold_write_oids = {}, }, .cur_state = SAHPI_ES_UNSPECIFIED, .cur_child_rid = SAHPI_UNSPECIFIED_RESOURCE_ID, .sensor_enabled = SAHPI_TRUE, .events_enabled = SAHPI_TRUE, .assert_mask = SAHPI_ES_LOWER_MAJOR | SAHPI_ES_UPPER_MAJOR, .deassert_mask = SAHPI_ES_LOWER_MAJOR | SAHPI_ES_UPPER_MAJOR, .event_array = { { .event = "0A07BC02", /* EN_1_8VS_WARNING_HI */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_UPPER_MAJOR, .recovery_state = SAHPI_ES_UNSPECIFIED, }, { .event = "0A07AC02", /* EN_1_8VS_WARNING_LOW */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_LOWER_MAJOR, .recovery_state = SAHPI_ES_UNSPECIFIED, }, {}, }, .reading2event = {}, }, .comment = "Blade Standby 1.8 Volt Sensor", }, }, /* Blade 2.5 Volt Sensor */ { .ipmi_tag = "2.5V SENSE", .ipmi_tag_alias1 = "PLANAR 2.5V", .ipmi = { .index = 12, .sensor = { .Num = SNMP_BC_LAST_NON_IPMI_BLADE_SENSOR + 12, .Type = SAHPI_VOLTAGE, .Category = SAHPI_EC_THRESHOLD, .EnableCtrl = SAHPI_FALSE, .EventCtrl = SAHPI_SEC_READ_ONLY, .Events = SAHPI_ES_LOWER_MAJOR | SAHPI_ES_UPPER_MAJOR, .DataFormat = { .IsSupported = SAHPI_TRUE, .ReadingType = SAHPI_SENSOR_READING_TYPE_FLOAT64, .BaseUnits = SAHPI_SU_VOLTS, .ModifierUnits = SAHPI_SU_UNSPECIFIED, .ModifierUse = SAHPI_SMUU_NONE, .Percentage = SAHPI_FALSE, .Range = { .Flags = SAHPI_SRF_MAX | SAHPI_SRF_MIN | SAHPI_SRF_NOMINAL, .Max = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, .Value = { .SensorFloat64 = 4.4, }, }, .Nominal = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, .Value = { .SensorFloat64 = 2.5, }, }, .Min = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, .Value = { .SensorFloat64 = 0, }, }, }, }, .ThresholdDefn = { .IsAccessible = SAHPI_TRUE, .ReadThold = SAHPI_STM_LOW_MAJOR | SAHPI_STM_UP_MAJOR, .WriteThold = 0, }, .Oem = 0, }, .sensor_info = { .mib = { .not_avail_indicator_num = 0, .write_only = SAHPI_FALSE, .oid = "discovered", .loc_offset = 0, .threshold_oids = { .UpMajor = "discovered", .LowMajor = "discovered", }, .threshold_write_oids = {}, }, .cur_state = SAHPI_ES_UNSPECIFIED, .cur_child_rid = SAHPI_UNSPECIFIED_RESOURCE_ID, .sensor_enabled = SAHPI_TRUE, .events_enabled = SAHPI_TRUE, .assert_mask = SAHPI_ES_LOWER_MAJOR | SAHPI_ES_UPPER_MAJOR, .deassert_mask = SAHPI_ES_LOWER_MAJOR | SAHPI_ES_UPPER_MAJOR, .event_array = { /* No IPMI unique events */ {}, }, .reading2event = {}, }, .comment = "Blade 2.5 Volt Sensor", }, }, /* Blade Standby 2.5 Volt Sensor */ { .ipmi_tag = "2.5VSB SENSE", .ipmi_tag_alias1 = "PLANAR 2.5VSB", .ipmi = { .index = 13, .sensor = { .Num = SNMP_BC_LAST_NON_IPMI_BLADE_SENSOR + 13, .Type = SAHPI_VOLTAGE, .Category = SAHPI_EC_THRESHOLD, .EnableCtrl = SAHPI_FALSE, .EventCtrl = SAHPI_SEC_READ_ONLY, .Events = SAHPI_ES_LOWER_MAJOR | SAHPI_ES_UPPER_MAJOR, .DataFormat = { .IsSupported = SAHPI_TRUE, .ReadingType = SAHPI_SENSOR_READING_TYPE_FLOAT64, .BaseUnits = SAHPI_SU_VOLTS, .ModifierUnits = SAHPI_SU_UNSPECIFIED, .ModifierUse = SAHPI_SMUU_NONE, .Percentage = SAHPI_FALSE, .Range = { .Flags = SAHPI_SRF_MAX | SAHPI_SRF_MIN | SAHPI_SRF_NOMINAL, .Max = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, .Value = { .SensorFloat64 = 4.4, }, }, .Nominal = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, .Value = { .SensorFloat64 = 2.5, }, }, .Min = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, .Value = { .SensorFloat64 = 0, }, }, }, }, .ThresholdDefn = { .IsAccessible = SAHPI_TRUE, .ReadThold = SAHPI_STM_LOW_MAJOR | SAHPI_STM_UP_MAJOR, .WriteThold = 0, }, .Oem = 0, }, .sensor_info = { .mib = { .not_avail_indicator_num = 0, .write_only = SAHPI_FALSE, .oid = "discovered", .loc_offset = 0, .threshold_oids = { .UpMajor = "discovered", .LowMajor = "discovered", }, .threshold_write_oids = {}, }, .cur_state = SAHPI_ES_UNSPECIFIED, .cur_child_rid = SAHPI_UNSPECIFIED_RESOURCE_ID, .sensor_enabled = SAHPI_TRUE, .events_enabled = SAHPI_TRUE, .assert_mask = SAHPI_ES_LOWER_MAJOR | SAHPI_ES_UPPER_MAJOR, .deassert_mask = SAHPI_ES_LOWER_MAJOR | SAHPI_ES_UPPER_MAJOR, .event_array = { { .event = "0A031C02", /* EN_2_5VS_WARNING_HI */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_UPPER_MAJOR, .recovery_state = SAHPI_ES_UNSPECIFIED, }, { .event = "0A030C02", /* EN_2_5VS_WARNING_LOW */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_LOWER_MAJOR, .recovery_state = SAHPI_ES_UNSPECIFIED, }, {}, }, .reading2event = {}, }, .comment = "Blade Standby 2.5 Volt Sensor", }, }, /* Blade 3.3 Volt Sensor */ { .ipmi_tag = "3.3V SENSE", .ipmi_tag_alias1 = "PLANAR 3.3V", .ipmi = { .index = 14, .sensor = { .Num = SNMP_BC_LAST_NON_IPMI_BLADE_SENSOR + 14, .Type = SAHPI_VOLTAGE, .Category = SAHPI_EC_THRESHOLD, .EnableCtrl = SAHPI_FALSE, .EventCtrl = SAHPI_SEC_READ_ONLY, .Events = SAHPI_ES_LOWER_MAJOR | SAHPI_ES_UPPER_MAJOR, .DataFormat = { .IsSupported = SAHPI_TRUE, .ReadingType = SAHPI_SENSOR_READING_TYPE_FLOAT64, .BaseUnits = SAHPI_SU_VOLTS, .ModifierUnits = SAHPI_SU_UNSPECIFIED, .ModifierUse = SAHPI_SMUU_NONE, .Percentage = SAHPI_FALSE, .Range = { .Flags = SAHPI_SRF_MAX | SAHPI_SRF_MIN | SAHPI_SRF_NOMINAL, .Max = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, .Value = { .SensorFloat64 = 4.4, }, }, .Nominal = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, .Value = { .SensorFloat64 = 3.3, }, }, .Min = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, .Value = { .SensorFloat64 = 0, }, }, }, }, .ThresholdDefn = { .IsAccessible = SAHPI_TRUE, .ReadThold = SAHPI_STM_LOW_MAJOR | SAHPI_STM_UP_MAJOR, .WriteThold = 0, }, .Oem = 0, }, .sensor_info = { .mib = { .not_avail_indicator_num = 0, .write_only = SAHPI_FALSE, .oid = "discovered", .loc_offset = 0, .threshold_oids = { .UpMajor = "discovered", .LowMajor = "discovered", }, .threshold_write_oids = {}, }, .cur_state = SAHPI_ES_UNSPECIFIED, .cur_child_rid = SAHPI_UNSPECIFIED_RESOURCE_ID, .sensor_enabled = SAHPI_TRUE, .events_enabled = SAHPI_TRUE, .assert_mask = SAHPI_ES_LOWER_MAJOR | SAHPI_ES_UPPER_MAJOR, .deassert_mask = SAHPI_ES_LOWER_MAJOR | SAHPI_ES_UPPER_MAJOR, .event_array = { { .event = "FFFFFFF3", /* EN_GENERIC_UPPER_WARN_VOLT */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_UPPER_MAJOR, .recovery_state = SAHPI_ES_UNSPECIFIED, }, { .event = "FFFFFFF4", /* EN_GENERIC_UPPER_WARN_VOLT */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_LOWER_MAJOR, .recovery_state = SAHPI_ES_UNSPECIFIED, }, {}, }, .reading2event = {}, }, .comment = "Blade 3.3 Volt Sensor", }, }, /* Blade Standby 3.3 Volt Sensor */ { .ipmi_tag = "3.3VSB SENSE", .ipmi_tag_alias1 = "PLANAR 3.3VSB", .ipmi = { .index = 15, .sensor = { .Num = SNMP_BC_LAST_NON_IPMI_BLADE_SENSOR + 15, .Type = SAHPI_VOLTAGE, .Category = SAHPI_EC_THRESHOLD, .EnableCtrl = SAHPI_FALSE, .EventCtrl = SAHPI_SEC_READ_ONLY, .Events = SAHPI_ES_LOWER_MAJOR | SAHPI_ES_UPPER_MAJOR, .DataFormat = { .IsSupported = SAHPI_TRUE, .ReadingType = SAHPI_SENSOR_READING_TYPE_FLOAT64, .BaseUnits = SAHPI_SU_VOLTS, .ModifierUnits = SAHPI_SU_UNSPECIFIED, .ModifierUse = SAHPI_SMUU_NONE, .Percentage = SAHPI_FALSE, .Range = { .Flags = SAHPI_SRF_MAX | SAHPI_SRF_MIN | SAHPI_SRF_NOMINAL, .Max = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, .Value = { .SensorFloat64 = 4.4, }, }, .Nominal = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, .Value = { .SensorFloat64 = 3.3, }, }, .Min = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, .Value = { .SensorFloat64 = 0, }, }, }, }, .ThresholdDefn = { .IsAccessible = SAHPI_TRUE, .ReadThold = SAHPI_STM_LOW_MAJOR | SAHPI_STM_UP_MAJOR, .WriteThold = 0, }, .Oem = 0, }, .sensor_info = { .mib = { .not_avail_indicator_num = 0, .write_only = SAHPI_FALSE, .oid = "discovered", .loc_offset = 0, .threshold_oids = { .UpMajor = "discovered", .LowMajor = "discovered", }, .threshold_write_oids = {}, }, .cur_state = SAHPI_ES_UNSPECIFIED, .cur_child_rid = SAHPI_UNSPECIFIED_RESOURCE_ID, .sensor_enabled = SAHPI_TRUE, .events_enabled = SAHPI_TRUE, .assert_mask = SAHPI_ES_LOWER_MAJOR | SAHPI_ES_UPPER_MAJOR, .deassert_mask = SAHPI_ES_LOWER_MAJOR | SAHPI_ES_UPPER_MAJOR, .event_array = { { .event = "0A02DC02", /* EN_3_3VS_WARNING_HI */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_UPPER_MAJOR, .recovery_state = SAHPI_ES_UNSPECIFIED, }, { .event = "0A02CC02", /* EN_3_3VS_WARNING_LOW */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_LOWER_MAJOR, .recovery_state = SAHPI_ES_UNSPECIFIED, }, {}, }, .reading2event = {}, }, .comment = "Blade Standby 3.3 Volt Sensor", }, }, /* Blade 5 Volt Sensor */ { .ipmi_tag = "5V SENSE", .ipmi_tag_alias1 = "PLANAR 5V", .ipmi = { .index = 16, .sensor = { .Num = SNMP_BC_LAST_NON_IPMI_BLADE_SENSOR + 16, .Type = SAHPI_VOLTAGE, .Category = SAHPI_EC_THRESHOLD, .EnableCtrl = SAHPI_FALSE, .EventCtrl = SAHPI_SEC_READ_ONLY, .Events = SAHPI_ES_LOWER_MAJOR | SAHPI_ES_UPPER_MAJOR, .DataFormat = { .IsSupported = SAHPI_TRUE, .ReadingType = SAHPI_SENSOR_READING_TYPE_FLOAT64, .BaseUnits = SAHPI_SU_VOLTS, .ModifierUnits = SAHPI_SU_UNSPECIFIED, .ModifierUse = SAHPI_SMUU_NONE, .Percentage = SAHPI_FALSE, .Range = { .Flags = SAHPI_SRF_MAX | SAHPI_SRF_MIN | SAHPI_SRF_NOMINAL, .Max = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, .Value = { .SensorFloat64 = 6.7, }, }, .Nominal = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, .Value = { .SensorFloat64 = 5, }, }, .Min = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, .Value = { .SensorFloat64 = 0, }, }, }, }, .ThresholdDefn = { .IsAccessible = SAHPI_TRUE, .ReadThold = SAHPI_STM_LOW_MAJOR | SAHPI_STM_UP_MAJOR, .WriteThold = 0, }, .Oem = 0, }, .sensor_info = { .mib = { .not_avail_indicator_num = 0, .write_only = SAHPI_FALSE, .oid = "discovered", .loc_offset = 0, .threshold_oids = { .UpMajor = "discovered", .LowMajor = "discovered", }, .threshold_write_oids = {}, }, .cur_state = SAHPI_ES_UNSPECIFIED, .cur_child_rid = SAHPI_UNSPECIFIED_RESOURCE_ID, .sensor_enabled = SAHPI_TRUE, .events_enabled = SAHPI_TRUE, .assert_mask = SAHPI_ES_LOWER_MAJOR | SAHPI_ES_UPPER_MAJOR, .deassert_mask = SAHPI_ES_LOWER_MAJOR | SAHPI_ES_UPPER_MAJOR, .event_array = { { .event = "FFFFFFF5", /* EN_GENERIC_UPPER_WARN_VOLT */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_UPPER_MAJOR, .recovery_state = SAHPI_ES_UNSPECIFIED, }, { .event = "FFFFFFF6", /* EN_GENERIC_UPPER_WARN_VOLT */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_LOWER_MAJOR, .recovery_state = SAHPI_ES_UNSPECIFIED, }, {}, }, .reading2event = {}, }, .comment = "Blade 5 Volt Sensor", }, }, /* Blade Standby 5 Volt Sensor */ { .ipmi_tag = "5VSB SENSE", .ipmi_tag_alias1 = "PLANAR 5VSB", .ipmi = { .index = 17, .sensor = { .Num = SNMP_BC_LAST_NON_IPMI_BLADE_SENSOR + 17, .Type = SAHPI_VOLTAGE, .Category = SAHPI_EC_THRESHOLD, .EnableCtrl = SAHPI_FALSE, .EventCtrl = SAHPI_SEC_READ_ONLY, .Events = SAHPI_ES_LOWER_MAJOR | SAHPI_ES_UPPER_MAJOR, .DataFormat = { .IsSupported = SAHPI_TRUE, .ReadingType = SAHPI_SENSOR_READING_TYPE_FLOAT64, .BaseUnits = SAHPI_SU_VOLTS, .ModifierUnits = SAHPI_SU_UNSPECIFIED, .ModifierUse = SAHPI_SMUU_NONE, .Percentage = SAHPI_FALSE, .Range = { .Flags = SAHPI_SRF_MAX | SAHPI_SRF_MIN | SAHPI_SRF_NOMINAL, .Max = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, .Value = { .SensorFloat64 = 6.7, }, }, .Nominal = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, .Value = { .SensorFloat64 = 5, }, }, .Min = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, .Value = { .SensorFloat64 = 0, }, }, }, }, .ThresholdDefn = { .IsAccessible = SAHPI_TRUE, .ReadThold = SAHPI_STM_LOW_MAJOR | SAHPI_STM_UP_MAJOR, .WriteThold = 0, }, .Oem = 0, }, .sensor_info = { .mib = { .not_avail_indicator_num = 0, .write_only = SAHPI_FALSE, .oid = "discovered", .loc_offset = 0, .threshold_oids = { .UpMajor = "discovered", .LowMajor = "discovered", }, .threshold_write_oids = {}, }, .cur_state = SAHPI_ES_UNSPECIFIED, .cur_child_rid = SAHPI_UNSPECIFIED_RESOURCE_ID, .sensor_enabled = SAHPI_TRUE, .events_enabled = SAHPI_TRUE, .assert_mask = SAHPI_ES_LOWER_MAJOR | SAHPI_ES_UPPER_MAJOR, .deassert_mask = SAHPI_ES_LOWER_MAJOR | SAHPI_ES_UPPER_MAJOR, .event_array = { { .event = "0A035C02", /* EN_5VS_WARNING_HI */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_UPPER_MAJOR, .recovery_state = SAHPI_ES_UNSPECIFIED, }, { .event = "0A034C02", /* EN_5VS_WARNING_LOW */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_LOWER_MAJOR, .recovery_state = SAHPI_ES_UNSPECIFIED, }, {}, }, .reading2event = {}, }, .comment = "Blade Standby 5 Volt Sensor", }, }, /* Blade -5 Volt Sensor */ { .ipmi_tag = "-5V SENSE", .ipmi_tag_alias1 = "PLANAR -5V", .ipmi = { .index = 18, .sensor = { .Num = SNMP_BC_LAST_NON_IPMI_BLADE_SENSOR + 18, .Type = SAHPI_VOLTAGE, .Category = SAHPI_EC_THRESHOLD, .EnableCtrl = SAHPI_FALSE, .EventCtrl = SAHPI_SEC_READ_ONLY, .Events = SAHPI_ES_LOWER_MAJOR | SAHPI_ES_UPPER_MAJOR, .DataFormat = { .IsSupported = SAHPI_TRUE, .ReadingType = SAHPI_SENSOR_READING_TYPE_FLOAT64, .BaseUnits = SAHPI_SU_VOLTS, .ModifierUnits = SAHPI_SU_UNSPECIFIED, .ModifierUse = SAHPI_SMUU_NONE, .Percentage = SAHPI_FALSE, .Range = { .Flags = SAHPI_SRF_MAX | SAHPI_SRF_MIN | SAHPI_SRF_NOMINAL, .Max = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, .Value = { .SensorFloat64 = 0, }, }, .Nominal = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, .Value = { .SensorFloat64 = -5, }, }, .Min = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, .Value = { .SensorFloat64 = -6.7, }, }, }, }, .ThresholdDefn = { .IsAccessible = SAHPI_TRUE, .ReadThold = SAHPI_STM_LOW_MAJOR | SAHPI_STM_UP_MAJOR, .WriteThold = 0, }, .Oem = 0, }, .sensor_info = { .mib = { .not_avail_indicator_num = 0, .write_only = SAHPI_FALSE, .oid = "discovered", .loc_offset = 0, .threshold_oids = { .UpMajor = "discovered", .LowMajor = "discovered", }, .threshold_write_oids = {}, }, .cur_state = SAHPI_ES_UNSPECIFIED, .cur_child_rid = SAHPI_UNSPECIFIED_RESOURCE_ID, .sensor_enabled = SAHPI_TRUE, .events_enabled = SAHPI_TRUE, .assert_mask = SAHPI_ES_LOWER_MAJOR | SAHPI_ES_UPPER_MAJOR, .deassert_mask = SAHPI_ES_LOWER_MAJOR | SAHPI_ES_UPPER_MAJOR, .event_array = { { .event = "0803D500", /* EN_PFA_HI_FAULT_N5V */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_UPPER_MAJOR, .recovery_state = SAHPI_ES_UNSPECIFIED, }, { .event = "0803D800", /* EN_PFA_LO_FAULT_N5V */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_LOWER_MAJOR, .recovery_state = SAHPI_ES_UNSPECIFIED, }, {}, }, .reading2event = {}, }, .comment = "Blade -5 Volt Sensor", }, }, /* Blade 12 Voltage Sensor */ { .ipmi_tag = "12V SENSE", .ipmi_tag_alias1 = "PLANAR 12V", .ipmi = { .index = 19, .sensor = { .Num = SNMP_BC_LAST_NON_IPMI_BLADE_SENSOR + 19, .Type = SAHPI_VOLTAGE, .Category = SAHPI_EC_THRESHOLD, .EnableCtrl = SAHPI_FALSE, .EventCtrl = SAHPI_SEC_READ_ONLY, .Events = SAHPI_ES_LOWER_MAJOR | SAHPI_ES_UPPER_MAJOR, .DataFormat = { .IsSupported = SAHPI_TRUE, .ReadingType = SAHPI_SENSOR_READING_TYPE_FLOAT64, .BaseUnits = SAHPI_SU_VOLTS, .ModifierUnits = SAHPI_SU_UNSPECIFIED, .ModifierUse = SAHPI_SMUU_NONE, .Percentage = SAHPI_FALSE, .Range = { .Flags = SAHPI_SRF_MAX | SAHPI_SRF_MIN | SAHPI_SRF_NOMINAL, .Max = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, .Value = { .SensorFloat64 = 16, }, }, .Nominal = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, .Value = { .SensorFloat64 = 12, }, }, .Min = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, .Value = { .SensorFloat64 = 0, }, }, }, }, .ThresholdDefn = { .IsAccessible = SAHPI_TRUE, .ReadThold = SAHPI_STM_LOW_MAJOR | SAHPI_STM_UP_MAJOR, .WriteThold = 0, }, .Oem = 0, }, .sensor_info = { .mib = { .not_avail_indicator_num = 0, .write_only = SAHPI_FALSE, .oid = "discovered", .loc_offset = 0, .threshold_oids = { .UpMajor = "discovered", .LowMajor = "discovered", }, .threshold_write_oids = {}, }, .cur_state = SAHPI_ES_UNSPECIFIED, .cur_child_rid = SAHPI_UNSPECIFIED_RESOURCE_ID, .sensor_enabled = SAHPI_TRUE, .events_enabled = SAHPI_TRUE, .assert_mask = SAHPI_ES_LOWER_MAJOR | SAHPI_ES_UPPER_MAJOR, .deassert_mask = SAHPI_ES_LOWER_MAJOR | SAHPI_ES_UPPER_MAJOR, .event_array = { { .event = "FFFFFFF7", /* EN_GENERIC_UPPER_WARN_VOLT */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_UPPER_MAJOR, .recovery_state = SAHPI_ES_UNSPECIFIED, }, { .event = "FFFFFFF8", /* EN_GENERIC_UPPER_WARN_VOLT */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_LOWER_MAJOR, .recovery_state = SAHPI_ES_UNSPECIFIED, }, {}, }, .reading2event = {}, }, .comment = "Blade 12 Volt Sensor", }, }, /* Blade Standby 12 Volt Sensor */ { .ipmi_tag = "12VSB SENSE", .ipmi_tag_alias1 = "PLANAR 12VSB", .ipmi = { .index = 20, .sensor = { .Num = SNMP_BC_LAST_NON_IPMI_BLADE_SENSOR + 20, .Type = SAHPI_VOLTAGE, .Category = SAHPI_EC_THRESHOLD, .EnableCtrl = SAHPI_FALSE, .EventCtrl = SAHPI_SEC_READ_ONLY, .Events = SAHPI_ES_LOWER_MAJOR | SAHPI_ES_UPPER_MAJOR, .DataFormat = { .IsSupported = SAHPI_TRUE, .ReadingType = SAHPI_SENSOR_READING_TYPE_FLOAT64, .BaseUnits = SAHPI_SU_VOLTS, .ModifierUnits = SAHPI_SU_UNSPECIFIED, .ModifierUse = SAHPI_SMUU_NONE, .Percentage = SAHPI_FALSE, .Range = { .Flags = SAHPI_SRF_MAX | SAHPI_SRF_MIN | SAHPI_SRF_NOMINAL, .Max = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, .Value = { .SensorFloat64 = 16, }, }, .Nominal = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, .Value = { .SensorFloat64 = 12, }, }, .Min = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, .Value = { .SensorFloat64 = 0, }, }, }, }, .ThresholdDefn = { .IsAccessible = SAHPI_TRUE, .ReadThold = SAHPI_STM_LOW_MAJOR | SAHPI_STM_UP_MAJOR, .WriteThold = 0, }, .Oem = 0, }, .sensor_info = { .mib = { .not_avail_indicator_num = 0, .write_only = SAHPI_FALSE, .oid = "discovered", .loc_offset = 0, .threshold_oids = { .UpMajor = "discovered", .LowMajor = "discovered", }, .threshold_write_oids = {}, }, .cur_state = SAHPI_ES_UNSPECIFIED, .cur_child_rid = SAHPI_UNSPECIFIED_RESOURCE_ID, .sensor_enabled = SAHPI_TRUE, .events_enabled = SAHPI_TRUE, .assert_mask = SAHPI_ES_LOWER_MAJOR | SAHPI_ES_UPPER_MAJOR, .deassert_mask = SAHPI_ES_LOWER_MAJOR | SAHPI_ES_UPPER_MAJOR, .event_array = { { .event = "0A037C02", /* EN_12VS_WARNING_HI */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_UPPER_MAJOR, .recovery_state = SAHPI_ES_UNSPECIFIED, }, { .event = "0A036C02", /* EN_12VS_WARNING_LOW */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_LOWER_MAJOR, .recovery_state = SAHPI_ES_UNSPECIFIED, }, {}, }, .reading2event = {}, }, .comment = "Blade Standby 12 Volt Sensor", }, }, /* Blade CPU 1 Core Voltage Sensor */ { .ipmi_tag = "CPU 1 VCORE", .ipmi_tag_alias1 = "CPU1 VCORE", .ipmi = { .index = 21, .sensor = { .Num = SNMP_BC_LAST_NON_IPMI_BLADE_SENSOR + 21, .Type = SAHPI_VOLTAGE, .Category = SAHPI_EC_THRESHOLD, .EnableCtrl = SAHPI_FALSE, .EventCtrl = SAHPI_SEC_READ_ONLY, .Events = SAHPI_ES_LOWER_MAJOR | SAHPI_ES_UPPER_MAJOR, .DataFormat = { .IsSupported = SAHPI_TRUE, .ReadingType = SAHPI_SENSOR_READING_TYPE_FLOAT64, .BaseUnits = SAHPI_SU_VOLTS, .ModifierUnits = SAHPI_SU_UNSPECIFIED, .ModifierUse = SAHPI_SMUU_NONE, .Percentage = SAHPI_FALSE, .Range = { .Flags = SAHPI_SRF_MAX | SAHPI_SRF_MIN | SAHPI_SRF_NOMINAL, .Max = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, .Value = { .SensorFloat64 = 3.67, }, }, /* No nominal reading - depends on CPU versions and number */ .Min = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, .Value = { .SensorFloat64 = 0, }, }, }, }, .ThresholdDefn = { .IsAccessible = SAHPI_TRUE, .ReadThold = SAHPI_STM_LOW_MAJOR | SAHPI_STM_UP_MAJOR, .WriteThold = 0, }, .Oem = 0, }, .sensor_info = { .mib = { .not_avail_indicator_num = 0, .write_only = SAHPI_FALSE, .oid = "discovered", .loc_offset = 0, .threshold_oids = { .UpMajor = "discovered", .LowMajor = "discovered", }, .threshold_write_oids = {}, }, .cur_state = SAHPI_ES_UNSPECIFIED, .cur_child_rid = SAHPI_UNSPECIFIED_RESOURCE_ID, .sensor_enabled = SAHPI_TRUE, .events_enabled = SAHPI_TRUE, .assert_mask = SAHPI_ES_LOWER_MAJOR | SAHPI_ES_UPPER_MAJOR, .deassert_mask = SAHPI_ES_LOWER_MAJOR | SAHPI_ES_UPPER_MAJOR, .event_array = { { .event = "FFFFFFF9", /* EN_GENERIC_UPPER_WARN_VOLT */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_UPPER_MAJOR, .recovery_state = SAHPI_ES_UNSPECIFIED, }, { .event = "FFFFFFFA", /* EN_GENERIC_UPPER_WARN_VOLT */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_LOWER_MAJOR, .recovery_state = SAHPI_ES_UNSPECIFIED, }, {}, }, .reading2event = {}, }, .comment = "Blade CPU 1 Core Voltage Sensor", }, }, /* Blade CPU 2 Core Voltage Sensor */ { .ipmi_tag = "CPU 2 VCORE", .ipmi_tag_alias1 = "CPU2 VCORE", .ipmi = { .index = 22, .sensor = { .Num = SNMP_BC_LAST_NON_IPMI_BLADE_SENSOR + 22, .Type = SAHPI_VOLTAGE, .Category = SAHPI_EC_THRESHOLD, .EnableCtrl = SAHPI_FALSE, .EventCtrl = SAHPI_SEC_READ_ONLY, .Events = SAHPI_ES_LOWER_MAJOR | SAHPI_ES_UPPER_MAJOR, .DataFormat = { .IsSupported = SAHPI_TRUE, .ReadingType = SAHPI_SENSOR_READING_TYPE_FLOAT64, .BaseUnits = SAHPI_SU_VOLTS, .ModifierUnits = SAHPI_SU_UNSPECIFIED, .ModifierUse = SAHPI_SMUU_NONE, .Percentage = SAHPI_FALSE, .Range = { .Flags = SAHPI_SRF_MAX | SAHPI_SRF_MIN | SAHPI_SRF_NOMINAL, .Max = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, .Value = { .SensorFloat64 = 3.67, }, }, /* No nominal reading - depends on CPU versions and number */ .Min = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, .Value = { .SensorFloat64 = 0, }, }, }, }, .ThresholdDefn = { .IsAccessible = SAHPI_TRUE, .ReadThold = SAHPI_STM_LOW_MAJOR | SAHPI_STM_UP_MAJOR, .WriteThold = 0, }, .Oem = 0, }, .sensor_info = { .mib = { .not_avail_indicator_num = 0, .write_only = SAHPI_FALSE, .oid = "discovered", .loc_offset = 0, .threshold_oids = { .UpMajor = "discovered", .LowMajor = "discovered", }, .threshold_write_oids = {}, }, .cur_state = SAHPI_ES_UNSPECIFIED, .cur_child_rid = SAHPI_UNSPECIFIED_RESOURCE_ID, .sensor_enabled = SAHPI_TRUE, .events_enabled = SAHPI_TRUE, .assert_mask = SAHPI_ES_LOWER_MAJOR | SAHPI_ES_UPPER_MAJOR, .deassert_mask = SAHPI_ES_LOWER_MAJOR | SAHPI_ES_UPPER_MAJOR, .event_array = { { .event = "FFFFFFFB", /* EN_GENERIC_UPPER_WARN_VOLT */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_UPPER_MAJOR, .recovery_state = SAHPI_ES_UNSPECIFIED, }, { .event = "FFFFFFFC", /* EN_GENERIC_UPPER_WARN_VOLT */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_LOWER_MAJOR, .recovery_state = SAHPI_ES_UNSPECIFIED, }, {}, }, .reading2event = {}, }, .comment = "Blade CPU 2 Core Voltage Sensor", }, }, /* Blade CPU 3 Core Voltage Sensor */ { .ipmi_tag = "CPU 3 VCORE", .ipmi_tag_alias1 = '\0', .ipmi = { .index = 23, .sensor = { .Num = SNMP_BC_LAST_NON_IPMI_BLADE_SENSOR + 23, .Type = SAHPI_VOLTAGE, .Category = SAHPI_EC_THRESHOLD, .EnableCtrl = SAHPI_FALSE, .EventCtrl = SAHPI_SEC_READ_ONLY, .Events = SAHPI_ES_LOWER_MAJOR | SAHPI_ES_UPPER_MAJOR, .DataFormat = { .IsSupported = SAHPI_TRUE, .ReadingType = SAHPI_SENSOR_READING_TYPE_FLOAT64, .BaseUnits = SAHPI_SU_VOLTS, .ModifierUnits = SAHPI_SU_UNSPECIFIED, .ModifierUse = SAHPI_SMUU_NONE, .Percentage = SAHPI_FALSE, .Range = { .Flags = SAHPI_SRF_MAX | SAHPI_SRF_MIN | SAHPI_SRF_NOMINAL, .Max = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, .Value = { .SensorFloat64 = 3.67, }, }, /* No nominal reading - depends on CPU versions and number */ .Min = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, .Value = { .SensorFloat64 = 0, }, }, }, }, .ThresholdDefn = { .IsAccessible = SAHPI_TRUE, .ReadThold = SAHPI_STM_LOW_MAJOR | SAHPI_STM_UP_MAJOR, .WriteThold = 0, }, .Oem = 0, }, .sensor_info = { .mib = { .not_avail_indicator_num = 0, .write_only = SAHPI_FALSE, .oid = "discovered", .loc_offset = 0, .threshold_oids = { .UpMajor = "discovered", .LowMajor = "discovered", }, .threshold_write_oids = {}, }, .cur_state = SAHPI_ES_UNSPECIFIED, .cur_child_rid = SAHPI_UNSPECIFIED_RESOURCE_ID, .sensor_enabled = SAHPI_TRUE, .events_enabled = SAHPI_TRUE, .assert_mask = SAHPI_ES_LOWER_MAJOR | SAHPI_ES_UPPER_MAJOR, .deassert_mask = SAHPI_ES_LOWER_MAJOR | SAHPI_ES_UPPER_MAJOR, .event_array = { { .event = "FFFFFFFD", /* EN_GENERIC_UPPER_WARN_VOLT */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_UPPER_MAJOR, .recovery_state = SAHPI_ES_UNSPECIFIED, }, { .event = "FFFFFFFE", /* EN_GENERIC_UPPER_WARN_VOLT */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_LOWER_MAJOR, .recovery_state = SAHPI_ES_UNSPECIFIED, }, {}, }, .reading2event = {}, }, .comment = "Blade CPU 3 Core Voltage Sensor", }, }, /* Blade CPU 4 Core Voltage Sensor */ { .ipmi_tag = "CPU 4 VCORE", .ipmi_tag_alias1 = '\0', .ipmi = { .index = 24, .sensor = { .Num = SNMP_BC_LAST_NON_IPMI_BLADE_SENSOR + 24, .Type = SAHPI_VOLTAGE, .Category = SAHPI_EC_THRESHOLD, .EnableCtrl = SAHPI_FALSE, .EventCtrl = SAHPI_SEC_READ_ONLY, .Events = SAHPI_ES_LOWER_MAJOR | SAHPI_ES_UPPER_MAJOR, .DataFormat = { .IsSupported = SAHPI_TRUE, .ReadingType = SAHPI_SENSOR_READING_TYPE_FLOAT64, .BaseUnits = SAHPI_SU_VOLTS, .ModifierUnits = SAHPI_SU_UNSPECIFIED, .ModifierUse = SAHPI_SMUU_NONE, .Percentage = SAHPI_FALSE, .Range = { .Flags = SAHPI_SRF_MAX | SAHPI_SRF_MIN | SAHPI_SRF_NOMINAL, .Max = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, .Value = { .SensorFloat64 = 3.67, }, }, /* No nominal reading - depends on CPU versions and number */ .Min = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, .Value = { .SensorFloat64 = 0, }, }, }, }, .ThresholdDefn = { .IsAccessible = SAHPI_TRUE, .ReadThold = SAHPI_STM_LOW_MAJOR | SAHPI_STM_UP_MAJOR, .WriteThold = 0, }, .Oem = 0, }, .sensor_info = { .mib = { .not_avail_indicator_num = 0, .write_only = SAHPI_FALSE, .oid = "discovered", .loc_offset = 0, .threshold_oids = { .UpMajor = "discovered", .LowMajor = "discovered", }, .threshold_write_oids = {}, }, .cur_state = SAHPI_ES_UNSPECIFIED, .cur_child_rid = SAHPI_UNSPECIFIED_RESOURCE_ID, .sensor_enabled = SAHPI_TRUE, .events_enabled = SAHPI_TRUE, .assert_mask = SAHPI_ES_LOWER_MAJOR | SAHPI_ES_UPPER_MAJOR, .deassert_mask = SAHPI_ES_LOWER_MAJOR | SAHPI_ES_UPPER_MAJOR, .event_array = { { .event = "FFFFFF10", /* EN_GENERIC_UPPER_WARN_VOLT */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_UPPER_MAJOR, .recovery_state = SAHPI_ES_UNSPECIFIED, }, { .event = "FFFFFF11", /* EN_GENERIC_UPPER_WARN_VOLT */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_LOWER_MAJOR, .recovery_state = SAHPI_ES_UNSPECIFIED, }, {}, }, .reading2event = {}, }, .comment = "Blade CPU 4 Core Voltage Sensor", }, }, /* Blade Battery Voltage Sensor */ { .ipmi_tag = "VBATT SENSE", .ipmi_tag_alias1 = "PLANAR VBAT", .ipmi = { .index = 25, .sensor = { .Num = SNMP_BC_LAST_NON_IPMI_BLADE_SENSOR + 25, .Type = SAHPI_VOLTAGE, .Category = SAHPI_EC_THRESHOLD, .EnableCtrl = SAHPI_FALSE, .EventCtrl = SAHPI_SEC_READ_ONLY, .Events = SAHPI_ES_LOWER_MAJOR | SAHPI_ES_UPPER_MAJOR, .DataFormat = { .IsSupported = SAHPI_TRUE, .ReadingType = SAHPI_SENSOR_READING_TYPE_FLOAT64, .BaseUnits = SAHPI_SU_VOLTS, .ModifierUnits = SAHPI_SU_UNSPECIFIED, .ModifierUse = SAHPI_SMUU_NONE, .Percentage = SAHPI_FALSE, .Range = { .Flags = SAHPI_SRF_MAX | SAHPI_SRF_MIN | SAHPI_SRF_NOMINAL, .Max = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, .Value = { .SensorFloat64 = 4.4, }, }, .Nominal = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, .Value = { .SensorFloat64 = 3.3, }, }, .Min = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, .Value = { .SensorFloat64 = 0, }, }, }, }, .ThresholdDefn = { .IsAccessible = SAHPI_TRUE, .ReadThold = SAHPI_STM_LOW_MAJOR | SAHPI_STM_UP_MAJOR, .WriteThold = 0, }, .Oem = 0, }, .sensor_info = { .mib = { .not_avail_indicator_num = 0, .write_only = SAHPI_FALSE, .oid = "discovered", .loc_offset = 0, .threshold_oids = { .UpMajor = "discovered", .LowMajor = "discovered", }, .threshold_write_oids = {}, }, .cur_state = SAHPI_ES_UNSPECIFIED, .cur_child_rid = SAHPI_UNSPECIFIED_RESOURCE_ID, .sensor_enabled = SAHPI_TRUE, .events_enabled = SAHPI_TRUE, .assert_mask = SAHPI_ES_LOWER_MAJOR | SAHPI_ES_UPPER_MAJOR, .deassert_mask = SAHPI_ES_LOWER_MAJOR | SAHPI_ES_UPPER_MAJOR, .event_array = { { .event = "FFFFFF12", /* EN_GENERIC_UPPER_WARN_VOLT */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_UPPER_MAJOR, .recovery_state = SAHPI_ES_UNSPECIFIED, }, { .event = "FFFFFF13", /* EN_GENERIC_UPPER_WARN_VOLT */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_LOWER_MAJOR, .recovery_state = SAHPI_ES_UNSPECIFIED, }, {}, }, .reading2event = {}, }, .comment = "Blade Battery Voltage Sensor", }, }, /* Blade Memory Bank 1 Temperature Sensor */ { .ipmi_tag = "BANK1 TEMP", .ipmi_tag_alias1 = "BANK 1 TEMP", .ipmi = { .index = 26, .sensor = { .Num = SNMP_BC_LAST_NON_IPMI_BLADE_SENSOR + 26, .Type = SAHPI_TEMPERATURE, .Category = SAHPI_EC_THRESHOLD, .EnableCtrl = SAHPI_FALSE, .EventCtrl = SAHPI_SEC_READ_ONLY, .Events = SAHPI_ES_UPPER_MAJOR | SAHPI_ES_UPPER_CRIT, .DataFormat = { .IsSupported = SAHPI_TRUE, .ReadingType = SAHPI_SENSOR_READING_TYPE_FLOAT64, .BaseUnits = SAHPI_SU_DEGREES_C, .ModifierUnits = SAHPI_SU_UNSPECIFIED, .ModifierUse = SAHPI_SMUU_NONE, .Percentage = SAHPI_FALSE, .Range = { .Flags = SAHPI_SRF_MAX | SAHPI_SRF_MIN, .Max = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, .Value = { .SensorFloat64 = 125, }, }, .Min = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, .Value = { .SensorFloat64 = 0, }, }, }, }, .ThresholdDefn = { .IsAccessible = SAHPI_TRUE, .ReadThold = SAHPI_STM_UP_MAJOR | SAHPI_STM_UP_CRIT, .WriteThold = 0, }, .Oem = 0, }, .sensor_info = { .mib = { .not_avail_indicator_num = 0, .write_only = SAHPI_FALSE, .oid = "discovered", .loc_offset = 0, .threshold_oids = { .UpCritical = "discovered", .UpMajor = "discovered", }, .threshold_write_oids = {}, }, .cur_state = SAHPI_ES_UNSPECIFIED, .sensor_enabled = SAHPI_TRUE, .events_enabled = SAHPI_TRUE, .assert_mask = SAHPI_ES_UPPER_MAJOR | SAHPI_ES_UPPER_CRIT, .deassert_mask = SAHPI_ES_UPPER_MAJOR | SAHPI_ES_UPPER_CRIT, .event_array = { { .event = "FFFFFF14", /* EN_GENERIC_HI_CRIT_TEMP */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_UPPER_CRIT, .recovery_state = SAHPI_ES_UPPER_MAJOR, }, { .event = "FFFFFF15", /* EN_GENERIC_HI_WARN_TEMP */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_UPPER_MAJOR, .recovery_state = SAHPI_ES_UNSPECIFIED, }, {}, }, .reading2event = {}, }, .comment = "Blade Memory Bank 1 Temperature Sensor", }, }, /* Blade Memory Bank 2 Temperature Sensor */ { .ipmi_tag = "BANK2 TEMP", .ipmi_tag_alias1 = "BANK 2 TEMP", .ipmi = { .index = 27, .sensor = { .Num = SNMP_BC_LAST_NON_IPMI_BLADE_SENSOR + 27, .Type = SAHPI_TEMPERATURE, .Category = SAHPI_EC_THRESHOLD, .EnableCtrl = SAHPI_FALSE, .EventCtrl = SAHPI_SEC_READ_ONLY, .Events = SAHPI_ES_UPPER_MAJOR | SAHPI_ES_UPPER_CRIT, .DataFormat = { .IsSupported = SAHPI_TRUE, .ReadingType = SAHPI_SENSOR_READING_TYPE_FLOAT64, .BaseUnits = SAHPI_SU_DEGREES_C, .ModifierUnits = SAHPI_SU_UNSPECIFIED, .ModifierUse = SAHPI_SMUU_NONE, .Percentage = SAHPI_FALSE, .Range = { .Flags = SAHPI_SRF_MAX | SAHPI_SRF_MIN, .Max = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, .Value = { .SensorFloat64 = 125, }, }, .Min = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, .Value = { .SensorFloat64 = 0, }, }, }, }, .ThresholdDefn = { .IsAccessible = SAHPI_TRUE, .ReadThold = SAHPI_STM_UP_MAJOR | SAHPI_STM_UP_CRIT, .WriteThold = 0, }, .Oem = 0, }, .sensor_info = { .mib = { .not_avail_indicator_num = 0, .write_only = SAHPI_FALSE, .oid = "discovered", .loc_offset = 0, .threshold_oids = { .UpCritical = "discovered", .UpMajor = "discovered", }, .threshold_write_oids = {}, }, .cur_state = SAHPI_ES_UNSPECIFIED, .sensor_enabled = SAHPI_TRUE, .events_enabled = SAHPI_TRUE, .assert_mask = SAHPI_ES_UPPER_MAJOR | SAHPI_ES_UPPER_CRIT, .deassert_mask = SAHPI_ES_UPPER_MAJOR | SAHPI_ES_UPPER_CRIT, .event_array = { { .event = "FFFFFF16", /* EN_GENERIC_HI_CRIT_TEMP */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_UPPER_CRIT, .recovery_state = SAHPI_ES_UPPER_MAJOR, }, { .event = "FFFFFF17", /* EN_GENERIC_HI_WARN_TEMP */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_UPPER_MAJOR, .recovery_state = SAHPI_ES_UNSPECIFIED, }, {}, }, .reading2event = {}, }, .comment = "Blade Memory Bank 2 Temperature Sensor", }, }, /* Blade Memory Bank 3 Temperature Sensor */ { .ipmi_tag = "BANK3 TEMP", .ipmi_tag_alias1 = "BANK 3 TEMP", .ipmi = { .index = 28, .sensor = { .Num = SNMP_BC_LAST_NON_IPMI_BLADE_SENSOR + 28, .Type = SAHPI_TEMPERATURE, .Category = SAHPI_EC_THRESHOLD, .EnableCtrl = SAHPI_FALSE, .EventCtrl = SAHPI_SEC_READ_ONLY, .Events = SAHPI_ES_UPPER_MAJOR | SAHPI_ES_UPPER_CRIT, .DataFormat = { .IsSupported = SAHPI_TRUE, .ReadingType = SAHPI_SENSOR_READING_TYPE_FLOAT64, .BaseUnits = SAHPI_SU_DEGREES_C, .ModifierUnits = SAHPI_SU_UNSPECIFIED, .ModifierUse = SAHPI_SMUU_NONE, .Percentage = SAHPI_FALSE, .Range = { .Flags = SAHPI_SRF_MAX | SAHPI_SRF_MIN, .Max = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, .Value = { .SensorFloat64 = 125, }, }, .Min = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, .Value = { .SensorFloat64 = 0, }, }, }, }, .ThresholdDefn = { .IsAccessible = SAHPI_TRUE, .ReadThold = SAHPI_STM_UP_MAJOR | SAHPI_STM_UP_CRIT, .WriteThold = 0, }, .Oem = 0, }, .sensor_info = { .mib = { .not_avail_indicator_num = 0, .write_only = SAHPI_FALSE, .oid = "discovered", .loc_offset = 0, .threshold_oids = { .UpCritical = "discovered", .UpMajor = "discovered", }, .threshold_write_oids = {}, }, .cur_state = SAHPI_ES_UNSPECIFIED, .sensor_enabled = SAHPI_TRUE, .events_enabled = SAHPI_TRUE, .assert_mask = SAHPI_ES_UPPER_MAJOR | SAHPI_ES_UPPER_CRIT, .deassert_mask = SAHPI_ES_UPPER_MAJOR | SAHPI_ES_UPPER_CRIT, .event_array = { { .event = "FFFFFF18", /* EN_GENERIC_HI_CRIT_TEMP */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_UPPER_CRIT, .recovery_state = SAHPI_ES_UPPER_MAJOR, }, { .event = "FFFFFF19", /* EN_GENERIC_HI_WARN_TEMP */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_UPPER_MAJOR, .recovery_state = SAHPI_ES_UNSPECIFIED, }, {}, }, .reading2event = {}, }, .comment = "Blade Memory Bank 3 Temperature Sensor", }, }, /* Blade Memory Bank 4 Temperature Sensor */ { .ipmi_tag = "BANK4 TEMP", .ipmi_tag_alias1 = "BANK 4 TEMP", .ipmi = { .index = 29, .sensor = { .Num = SNMP_BC_LAST_NON_IPMI_BLADE_SENSOR + 29, .Type = SAHPI_TEMPERATURE, .Category = SAHPI_EC_THRESHOLD, .EnableCtrl = SAHPI_FALSE, .EventCtrl = SAHPI_SEC_READ_ONLY, .Events = SAHPI_ES_UPPER_MAJOR | SAHPI_ES_UPPER_CRIT, .DataFormat = { .IsSupported = SAHPI_TRUE, .ReadingType = SAHPI_SENSOR_READING_TYPE_FLOAT64, .BaseUnits = SAHPI_SU_DEGREES_C, .ModifierUnits = SAHPI_SU_UNSPECIFIED, .ModifierUse = SAHPI_SMUU_NONE, .Percentage = SAHPI_FALSE, .Range = { .Flags = SAHPI_SRF_MAX | SAHPI_SRF_MIN, .Max = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, .Value = { .SensorFloat64 = 125, }, }, .Min = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, .Value = { .SensorFloat64 = 0, }, }, }, }, .ThresholdDefn = { .IsAccessible = SAHPI_TRUE, .ReadThold = SAHPI_STM_UP_MAJOR | SAHPI_STM_UP_CRIT, .WriteThold = 0, }, .Oem = 0, }, .sensor_info = { .mib = { .not_avail_indicator_num = 0, .write_only = SAHPI_FALSE, .oid = "discovered", .loc_offset = 0, .threshold_oids = { .UpCritical = "discovered", .UpMajor = "discovered", }, .threshold_write_oids = {}, }, .cur_state = SAHPI_ES_UNSPECIFIED, .sensor_enabled = SAHPI_TRUE, .events_enabled = SAHPI_TRUE, .assert_mask = SAHPI_ES_UPPER_MAJOR | SAHPI_ES_UPPER_CRIT, .deassert_mask = SAHPI_ES_UPPER_MAJOR | SAHPI_ES_UPPER_CRIT, .event_array = { { .event = "FFFFFF1A", /* EN_GENERIC_HI_CRIT_TEMP */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_UPPER_CRIT, .recovery_state = SAHPI_ES_UPPER_MAJOR, }, { .event = "FFFFFF1B", /* EN_GENERIC_HI_WARN_TEMP */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_UPPER_MAJOR, .recovery_state = SAHPI_ES_UNSPECIFIED, }, {}, }, .reading2event = {}, }, .comment = "Blade Memory Bank 4 Temperature Sensor", }, }, {} /* Terminate array with a null element */ }; /************************************** * Blade Expansion Module (BEM) Sensors **************************************/ struct snmp_bc_sensor snmp_bc_bem_sensors[] = { /* BEM Operational Status Sensor - event only */ { .index = 1, .sensor = { .Num = 1, .Type = SAHPI_OPERATIONAL, .Category = SAHPI_EC_AVAILABILITY, .EnableCtrl = SAHPI_FALSE, .EventCtrl = SAHPI_SEC_READ_ONLY, .Events = SAHPI_ES_RUNNING | SAHPI_ES_DEGRADED | SAHPI_ES_OFF_LINE, .DataFormat = { .IsSupported = SAHPI_FALSE, }, .ThresholdDefn = { .IsAccessible = SAHPI_FALSE, }, .Oem = 0, }, .sensor_info = { .cur_state = SAHPI_ES_RUNNING, .cur_child_rid = SAHPI_UNSPECIFIED_RESOURCE_ID, .sensor_enabled = SAHPI_TRUE, .events_enabled = SAHPI_TRUE, .assert_mask = SAHPI_ES_DEGRADED | SAHPI_ES_OFF_LINE, .deassert_mask = SAHPI_ES_DEGRADED | SAHPI_ES_OFF_LINE, .event_array = { { .event = "06800000", /* EN_FAULT_DASD */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_OFF_LINE, .recovery_state = SAHPI_ES_RUNNING, }, { .event = "0681E002", /* EN_DASD1_REMOVED_DRIVE_2 */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_DEGRADED, .recovery_state = SAHPI_ES_RUNNING, }, { .event = "0681E003", /* EN_DASD1_REMOVED_DRIVE_3 */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_DEGRADED, .recovery_state = SAHPI_ES_RUNNING, }, { .event = "0681E004", /* EN_DASD1_REMOVED_DRIVE_4 */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_DEGRADED, .recovery_state = SAHPI_ES_RUNNING, }, { .event = "06801002", /* EN_FAULT_DASD1_SCSI_ID_2 */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_DEGRADED, .recovery_state = SAHPI_ES_RUNNING, }, { .event = "06800002", /* EN_FAULT_DASD1_HARD_DRIVE_2 */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_DEGRADED, .recovery_state = SAHPI_ES_RUNNING, }, { .event = "06801003", /* EN_FAULT_DASD1_SCSI_ID_3 */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_DEGRADED, .recovery_state = SAHPI_ES_RUNNING, }, { .event = "06800003", /* EN_FAULT_DASD1_HARD_DRIVE_3 */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_OFF_LINE, .recovery_state = SAHPI_ES_RUNNING, }, { .event = "06800004", /* EN_FAULT_DASD1_HARD_DRIVE_4 */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_OFF_LINE, .recovery_state = SAHPI_ES_RUNNING, }, { .event = "0EE18000", /* EN_BSE_RAID_BATTERY_FAILURE */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_DEGRADED, .recovery_state = SAHPI_ES_RUNNING, }, { .event = "0EE00000", /* EN_BSE_RAID_FAULT */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_DEGRADED, .recovery_state = SAHPI_ES_RUNNING, }, {}, }, .reading2event = {}, }, .comment = "BEM Operational Status Sensor", }, /* BEM Temperature Sensor - event only */ { .index = 2, .sensor = { .Num = 2, .Type = SAHPI_TEMPERATURE, .Category = SAHPI_EC_THRESHOLD, .EnableCtrl = SAHPI_FALSE, .EventCtrl = SAHPI_SEC_READ_ONLY, .Events = SAHPI_ES_UPPER_MAJOR | SAHPI_ES_UPPER_CRIT, .DataFormat = { .IsSupported = SAHPI_FALSE, }, .ThresholdDefn = { .IsAccessible = SAHPI_FALSE, }, .Oem = 0, }, .sensor_info = { .cur_state = SAHPI_ES_UNSPECIFIED, .cur_child_rid = SAHPI_UNSPECIFIED_RESOURCE_ID, .sensor_enabled = SAHPI_TRUE, .events_enabled = SAHPI_TRUE, .assert_mask = SAHPI_ES_UPPER_MAJOR | SAHPI_ES_UPPER_CRIT, .deassert_mask = SAHPI_ES_UPPER_MAJOR | SAHPI_ES_UPPER_CRIT, .event_array = { { .event = "0621C481", /* EN_CUTOFF_HI_OVER_TEMP_BEM */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_UPPER_CRIT, .recovery_state = SAHPI_ES_UPPER_MAJOR, }, { .event = "0681C482", /* EN_CUTOFF_HI_OVER_TEMP_DASD1_2 */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_UPPER_CRIT, .recovery_state = SAHPI_ES_UPPER_MAJOR, }, { .event = "0621C081", /* EN_OVER_TEMP_BEM */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_UPPER_CRIT, .recovery_state = SAHPI_ES_UPPER_MAJOR, }, { .event = "0621D481", /* EN_PFA_HI_OVER_TEMP_BEM */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_UPPER_MAJOR, .recovery_state = SAHPI_ES_UNSPECIFIED, }, {}, }, .reading2event = {}, }, .comment = "BEM Temperature Sensor", }, /* BEM Voltage Sensor - event only */ { .index = 3, .sensor = { .Num = 3, .Type = SAHPI_VOLTAGE, .Category = SAHPI_EC_THRESHOLD, .EnableCtrl = SAHPI_FALSE, .EventCtrl = SAHPI_SEC_READ_ONLY, .Events = SAHPI_ES_LOWER_MAJOR | SAHPI_ES_UPPER_MAJOR, .DataFormat = { .IsSupported = SAHPI_FALSE, }, .ThresholdDefn = { .IsAccessible = SAHPI_FALSE, }, .Oem = 0, }, .sensor_info = { .cur_state = SAHPI_ES_UNSPECIFIED, .cur_child_rid = SAHPI_UNSPECIFIED_RESOURCE_ID, .sensor_enabled = SAHPI_TRUE, .events_enabled = SAHPI_TRUE, .assert_mask = SAHPI_ES_LOWER_MAJOR | SAHPI_ES_UPPER_MAJOR, .deassert_mask = SAHPI_ES_LOWER_MAJOR | SAHPI_ES_UPPER_MAJOR, .event_array = { { .event = "0E850402", /* EN_BEM_1V_WARNING_HI */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_UPPER_MAJOR, .recovery_state = SAHPI_ES_UNSPECIFIED, }, { .event = "0E850802", /* EN_BEM_1V_WARNING_LOW */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_LOWER_MAJOR, .recovery_state = SAHPI_ES_UNSPECIFIED, }, { .event = "0E840402", /* EN_BEM_1_5V_WARNING_HI */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_UPPER_MAJOR, .recovery_state = SAHPI_ES_UNSPECIFIED, }, { .event = "0E840802", /* EN_BEM_1_5V_WARNING_LOW */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_LOWER_MAJOR, .recovery_state = SAHPI_ES_UNSPECIFIED, }, { .event = "0E87A402", /* EN_BEM_1_8V_WARNING_HI */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_UPPER_MAJOR, .recovery_state = SAHPI_ES_UNSPECIFIED, }, { .event = "0E87A802", /* EN_BEM_1_8V_WARNING_LOW */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_LOWER_MAJOR, .recovery_state = SAHPI_ES_UNSPECIFIED, }, { .event = "0E830402", /* EN_BEM_2_5V_WARNING_HI */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_UPPER_MAJOR, .recovery_state = SAHPI_ES_UNSPECIFIED, }, { .event = "0E830802", /* EN_BEM_2_5V_WARNING_LOW */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_LOWER_MAJOR, .recovery_state = SAHPI_ES_UNSPECIFIED, }, { .event = "0E832402", /* EN_BEM_3_3V_WARNING_HI */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_UPPER_MAJOR, .recovery_state = SAHPI_ES_UNSPECIFIED, }, { .event = "0E832802", /* EN_BEM_3_3V_WARNING_LOW */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_LOWER_MAJOR, .recovery_state = SAHPI_ES_UNSPECIFIED, }, { .event = "0E834402", /* EN_BEM_5V_WARNING_HI */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_UPPER_MAJOR, .recovery_state = SAHPI_ES_UNSPECIFIED, }, { .event = "0E834802", /*EN_BEM_5V_WARNING_LOW */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_LOWER_MAJOR, .recovery_state = SAHPI_ES_UNSPECIFIED, }, { .event = "0E836402", /* EN_BEM_12V_WARNING_HI */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_UPPER_MAJOR, .recovery_state = SAHPI_ES_UNSPECIFIED, }, { .event = "0E836802", /* EN_BEM_12V_WARNING_LOW */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_LOWER_MAJOR, .recovery_state = SAHPI_ES_UNSPECIFIED, }, { .event = "0E860402", /* EN_BEM_12VSB_WARNING_HI */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_UPPER_MAJOR, .recovery_state = SAHPI_ES_UNSPECIFIED, }, { .event = "0E860802", /* EN_BEM_12VSB_WARNING_LOW */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_LOWER_MAJOR, .recovery_state = SAHPI_ES_UNSPECIFIED, }, { .event = "0E83C402", /* EN_BEM_18V_WARNING_HI */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_UPPER_MAJOR, .recovery_state = SAHPI_ES_UNSPECIFIED, }, { .event = "0E83C802", /* EN_BEM_18V_WARNING_LOW */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_LOWER_MAJOR, .recovery_state = SAHPI_ES_UNSPECIFIED, }, {}, }, .reading2event = {}, }, .comment = "BEM Voltage Sensor", }, {} /* Terminate array with a null element */ }; #define SNMP_BC_LAST_NON_IPMI_BEM_SENSOR 3 /* BEM IPMI Sensors */ /* NOTE: Define IPMI tags as uppercase */ struct snmp_bc_ipmi_sensor snmp_bc_bem_ipmi_sensors[] = { /* PEU2 Temperature Sensor */ { .ipmi_tag = "PEU2 TEMP SENSE", .ipmi_tag_alias1 = "PEU2 LOCAL TEMP", .ipmi = { .index = 1, .sensor = { .Num = SNMP_BC_LAST_NON_IPMI_BEM_SENSOR + 1, .Type = SAHPI_TEMPERATURE, .Category = SAHPI_EC_THRESHOLD, .EnableCtrl = SAHPI_FALSE, .EventCtrl = SAHPI_SEC_READ_ONLY, .Events = SAHPI_ES_UPPER_MAJOR | SAHPI_ES_UPPER_CRIT, .DataFormat = { .IsSupported = SAHPI_TRUE, .ReadingType = SAHPI_SENSOR_READING_TYPE_FLOAT64, .BaseUnits = SAHPI_SU_DEGREES_C, .ModifierUnits = SAHPI_SU_UNSPECIFIED, .ModifierUse = SAHPI_SMUU_NONE, .Percentage = SAHPI_FALSE, .Range = { .Flags = SAHPI_SRF_MAX | SAHPI_SRF_MIN, .Max = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, .Value = { .SensorFloat64 = 125, }, }, .Min = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, .Value = { .SensorFloat64 = 0, }, }, }, }, .ThresholdDefn = { .IsAccessible = SAHPI_TRUE, .ReadThold = SAHPI_STM_UP_MAJOR | SAHPI_STM_UP_CRIT, .WriteThold = 0, }, .Oem = 0, }, .sensor_info = { .mib = { .not_avail_indicator_num = 0, .write_only = SAHPI_FALSE, .oid = "discovered", .loc_offset = 0, .threshold_oids = { .UpCritical = "discovered", .UpMajor = "discovered", }, .threshold_write_oids = {}, }, .cur_state = SAHPI_ES_UNSPECIFIED, .sensor_enabled = SAHPI_TRUE, .events_enabled = SAHPI_TRUE, .assert_mask = SAHPI_ES_UPPER_MAJOR | SAHPI_ES_UPPER_CRIT, .deassert_mask = SAHPI_ES_UPPER_MAJOR | SAHPI_ES_UPPER_CRIT, .event_array = { { .event = "FFFFFF26", /* EN_GENERIC_HI_CRIT_TEMP */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_UPPER_CRIT, .recovery_state = SAHPI_ES_UPPER_MAJOR, }, { .event = "FFFFFF27", /* EN_GENERIC_HI_WARN_TEMP */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_UPPER_MAJOR, .recovery_state = SAHPI_ES_UNSPECIFIED, }, {}, }, .reading2event = {}, }, .comment = "PEU2 Temperature Sensor", }, }, /* PEU2 1 Volt Sensor */ { .ipmi_tag = "PEU2 1V SENSE", .ipmi_tag_alias1 = '\0', .ipmi = { .index = 2, .sensor = { .Num = SNMP_BC_LAST_NON_IPMI_BEM_SENSOR + 2, .Type = SAHPI_VOLTAGE, .Category = SAHPI_EC_THRESHOLD, .EnableCtrl = SAHPI_FALSE, .EventCtrl = SAHPI_SEC_READ_ONLY, .Events = SAHPI_ES_LOWER_MAJOR | SAHPI_ES_UPPER_MAJOR, .DataFormat = { .IsSupported = SAHPI_TRUE, .ReadingType = SAHPI_SENSOR_READING_TYPE_FLOAT64, .BaseUnits = SAHPI_SU_VOLTS, .ModifierUnits = SAHPI_SU_UNSPECIFIED, .ModifierUse = SAHPI_SMUU_NONE, .Percentage = SAHPI_FALSE, .Range = { .Flags = SAHPI_SRF_MAX | SAHPI_SRF_MIN | SAHPI_SRF_NOMINAL, .Max = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, .Value = { .SensorFloat64 = 2, }, }, .Nominal = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, .Value = { .SensorFloat64 = 1, }, }, .Min = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, .Value = { .SensorFloat64 = 0, }, }, }, }, .ThresholdDefn = { .IsAccessible = SAHPI_TRUE, .ReadThold = SAHPI_STM_LOW_MAJOR | SAHPI_STM_UP_MAJOR, .WriteThold = 0, }, .Oem = 0, }, .sensor_info = { .mib = { .not_avail_indicator_num = 0, .write_only = SAHPI_FALSE, .oid = "discovered", .loc_offset = 0, .threshold_oids = { .UpMajor = "discovered", .LowMajor = "discovered", }, .threshold_write_oids = {}, }, .cur_state = SAHPI_ES_UNSPECIFIED, .sensor_enabled = SAHPI_TRUE, .events_enabled = SAHPI_TRUE, .assert_mask = SAHPI_ES_LOWER_MAJOR | SAHPI_ES_UPPER_MAJOR, .deassert_mask = SAHPI_ES_LOWER_MAJOR | SAHPI_ES_UPPER_MAJOR, .event_array = { { .event = "FFFFFF28", /* EN_GENERIC_UPPER_WARN_VOLT */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_UPPER_MAJOR, .recovery_state = SAHPI_ES_UNSPECIFIED, }, { .event = "FFFFFF29", /* EN_GENERIC_LOWER_WARN_VOLT */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_LOWER_MAJOR, .recovery_state = SAHPI_ES_UNSPECIFIED, }, {}, }, .reading2event = {}, }, .comment = "PEU2 1 Volt Sensor", }, }, /* PEU2 3.3 Volt Sensor */ { .ipmi_tag = "PEU2 3.3V SENSE", .ipmi_tag_alias1 = '\0', .ipmi = { .index = 3, .sensor = { .Num = SNMP_BC_LAST_NON_IPMI_BEM_SENSOR + 3, .Type = SAHPI_VOLTAGE, .Category = SAHPI_EC_THRESHOLD, .EnableCtrl = SAHPI_FALSE, .EventCtrl = SAHPI_SEC_READ_ONLY, .Events = SAHPI_ES_LOWER_MAJOR | SAHPI_ES_UPPER_MAJOR, .DataFormat = { .IsSupported = SAHPI_TRUE, .ReadingType = SAHPI_SENSOR_READING_TYPE_FLOAT64, .BaseUnits = SAHPI_SU_VOLTS, .ModifierUnits = SAHPI_SU_UNSPECIFIED, .ModifierUse = SAHPI_SMUU_NONE, .Percentage = SAHPI_FALSE, .Range = { .Flags = SAHPI_SRF_MAX | SAHPI_SRF_MIN | SAHPI_SRF_NOMINAL, .Max = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, .Value = { .SensorFloat64 = 3.6, }, }, .Nominal = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, .Value = { .SensorFloat64 = 3.3, }, }, .Min = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, .Value = { .SensorFloat64 = 0, }, }, }, }, .ThresholdDefn = { .IsAccessible = SAHPI_TRUE, .ReadThold = SAHPI_STM_LOW_MAJOR | SAHPI_STM_UP_MAJOR, .WriteThold = 0, }, .Oem = 0, }, .sensor_info = { .mib = { .not_avail_indicator_num = 0, .write_only = SAHPI_FALSE, .oid = "discovered", .loc_offset = 0, .threshold_oids = { .UpMajor = "discovered", .LowMajor = "discovered", }, .threshold_write_oids = {}, }, .cur_state = SAHPI_ES_UNSPECIFIED, .sensor_enabled = SAHPI_TRUE, .events_enabled = SAHPI_TRUE, .assert_mask = SAHPI_ES_LOWER_MAJOR | SAHPI_ES_UPPER_MAJOR, .deassert_mask = SAHPI_ES_LOWER_MAJOR | SAHPI_ES_UPPER_MAJOR, .event_array = { { .event = "FFFFFF2A", /* EN_GENERIC_UPPER_WARN_VOLT */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_UPPER_MAJOR, .recovery_state = SAHPI_ES_UNSPECIFIED, }, { .event = "FFFFFF2B", /* EN_GENERIC_LOWER_WARN_VOLT */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_LOWER_MAJOR, .recovery_state = SAHPI_ES_UNSPECIFIED, }, {}, }, .reading2event = {}, }, .comment = "PEU2 3.3 Volt Sensor", }, }, /* PEU2 5 Volt Sensor */ { .ipmi_tag = "PEU2 5V SENSE", .ipmi_tag_alias1 = '\0', .ipmi = { .index = 4, .sensor = { .Num = SNMP_BC_LAST_NON_IPMI_BEM_SENSOR + 4, .Type = SAHPI_VOLTAGE, .Category = SAHPI_EC_THRESHOLD, .EnableCtrl = SAHPI_FALSE, .EventCtrl = SAHPI_SEC_READ_ONLY, .Events = SAHPI_ES_LOWER_MAJOR | SAHPI_ES_UPPER_MAJOR, .DataFormat = { .IsSupported = SAHPI_TRUE, .ReadingType = SAHPI_SENSOR_READING_TYPE_FLOAT64, .BaseUnits = SAHPI_SU_VOLTS, .ModifierUnits = SAHPI_SU_UNSPECIFIED, .ModifierUse = SAHPI_SMUU_NONE, .Percentage = SAHPI_FALSE, .Range = { .Flags = SAHPI_SRF_MAX | SAHPI_SRF_MIN | SAHPI_SRF_NOMINAL, .Max = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, .Value = { .SensorFloat64 = 6.7, }, }, .Nominal = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, .Value = { .SensorFloat64 = 5, }, }, .Min = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, .Value = { .SensorFloat64 = 0, }, }, }, }, .ThresholdDefn = { .IsAccessible = SAHPI_TRUE, .ReadThold = SAHPI_STM_LOW_MAJOR | SAHPI_STM_UP_MAJOR, .WriteThold = 0, }, .Oem = 0, }, .sensor_info = { .mib = { .not_avail_indicator_num = 0, .write_only = SAHPI_FALSE, .oid = "discovered", .loc_offset = 0, .threshold_oids = { .UpMajor = "discovered", .LowMajor = "discovered", }, .threshold_write_oids = {}, }, .cur_state = SAHPI_ES_UNSPECIFIED, .sensor_enabled = SAHPI_TRUE, .events_enabled = SAHPI_TRUE, .assert_mask = SAHPI_ES_LOWER_MAJOR | SAHPI_ES_UPPER_MAJOR, .deassert_mask = SAHPI_ES_LOWER_MAJOR | SAHPI_ES_UPPER_MAJOR, .event_array = { { .event = "FFFFFF2C", /* EN_GENERIC_UPPER_WARN_VOLT */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_UPPER_MAJOR, .recovery_state = SAHPI_ES_UNSPECIFIED, }, { .event = "FFFFFF2D", /* EN_GENERIC_LOWER_WARN_VOLT */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_LOWER_MAJOR, .recovery_state = SAHPI_ES_UNSPECIFIED, }, {}, }, .reading2event = {}, }, .comment = "PEU2 5 Volt Sensor", }, }, /* PEU2 12 Volt Sensor */ { .ipmi_tag = "PEU2 12V SENSE", .ipmi_tag_alias1 = '\0', .ipmi = { .index = 5, .sensor = { .Num = SNMP_BC_LAST_NON_IPMI_BEM_SENSOR + 5, .Type = SAHPI_VOLTAGE, .Category = SAHPI_EC_THRESHOLD, .EnableCtrl = SAHPI_FALSE, .EventCtrl = SAHPI_SEC_READ_ONLY, .Events = SAHPI_ES_LOWER_MAJOR | SAHPI_ES_UPPER_MAJOR, .DataFormat = { .IsSupported = SAHPI_TRUE, .ReadingType = SAHPI_SENSOR_READING_TYPE_FLOAT64, .BaseUnits = SAHPI_SU_VOLTS, .ModifierUnits = SAHPI_SU_UNSPECIFIED, .ModifierUse = SAHPI_SMUU_NONE, .Percentage = SAHPI_FALSE, .Range = { .Flags = SAHPI_SRF_MAX | SAHPI_SRF_MIN | SAHPI_SRF_NOMINAL, .Max = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, .Value = { .SensorFloat64 = 16, }, }, .Nominal = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, .Value = { .SensorFloat64 = 12, }, }, .Min = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, .Value = { .SensorFloat64 = 0, }, }, }, }, .ThresholdDefn = { .IsAccessible = SAHPI_TRUE, .ReadThold = SAHPI_STM_LOW_MAJOR | SAHPI_STM_UP_MAJOR, .WriteThold = 0, }, .Oem = 0, }, .sensor_info = { .mib = { .not_avail_indicator_num = 0, .write_only = SAHPI_FALSE, .oid = "discovered", .loc_offset = 0, .threshold_oids = { .UpMajor = "discovered", .LowMajor = "discovered", }, .threshold_write_oids = {}, }, .cur_state = SAHPI_ES_UNSPECIFIED, .sensor_enabled = SAHPI_TRUE, .events_enabled = SAHPI_TRUE, .assert_mask = SAHPI_ES_LOWER_MAJOR | SAHPI_ES_UPPER_MAJOR, .deassert_mask = SAHPI_ES_LOWER_MAJOR | SAHPI_ES_UPPER_MAJOR, .event_array = { { .event = "FFFFFF30", /* EN_GENERIC_UPPER_WARN_VOLT */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_UPPER_MAJOR, .recovery_state = SAHPI_ES_UNSPECIFIED, }, { .event = "FFFFFF31", /* EN_GENERIC_LOWER_WARN_VOLT */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_LOWER_MAJOR, .recovery_state = SAHPI_ES_UNSPECIFIED, }, {}, }, .reading2event = {}, }, .comment = "PEU2 12 Volt Sensor", }, }, /* PEU2 Standby 12 Volt Sensor */ { .ipmi_tag = "PEU2 12VSB SENSE", .ipmi_tag_alias1 = '\0', .ipmi = { .index = 6, .sensor = { .Num = SNMP_BC_LAST_NON_IPMI_BEM_SENSOR + 6, .Type = SAHPI_VOLTAGE, .Category = SAHPI_EC_THRESHOLD, .EnableCtrl = SAHPI_FALSE, .EventCtrl = SAHPI_SEC_READ_ONLY, .Events = SAHPI_ES_LOWER_MAJOR | SAHPI_ES_UPPER_MAJOR, .DataFormat = { .IsSupported = SAHPI_TRUE, .ReadingType = SAHPI_SENSOR_READING_TYPE_FLOAT64, .BaseUnits = SAHPI_SU_VOLTS, .ModifierUnits = SAHPI_SU_UNSPECIFIED, .ModifierUse = SAHPI_SMUU_NONE, .Percentage = SAHPI_FALSE, .Range = { .Flags = SAHPI_SRF_MAX | SAHPI_SRF_MIN | SAHPI_SRF_NOMINAL, .Max = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, .Value = { .SensorFloat64 = 16, }, }, .Nominal = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, .Value = { .SensorFloat64 = 12, }, }, .Min = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, .Value = { .SensorFloat64 = 0, }, }, }, }, .ThresholdDefn = { .IsAccessible = SAHPI_TRUE, .ReadThold = SAHPI_STM_LOW_MAJOR | SAHPI_STM_UP_MAJOR, .WriteThold = 0, }, .Oem = 0, }, .sensor_info = { .mib = { .not_avail_indicator_num = 0, .write_only = SAHPI_FALSE, .oid = "discovered", .loc_offset = 0, .threshold_oids = { .UpMajor = "discovered", .LowMajor = "discovered", }, .threshold_write_oids = {}, }, .cur_state = SAHPI_ES_UNSPECIFIED, .sensor_enabled = SAHPI_TRUE, .events_enabled = SAHPI_TRUE, .assert_mask = SAHPI_ES_LOWER_MAJOR | SAHPI_ES_UPPER_MAJOR, .deassert_mask = SAHPI_ES_LOWER_MAJOR | SAHPI_ES_UPPER_MAJOR, .event_array = { { .event = "FFFFFF32", /* EN_GENERIC_UPPER_WARN_VOLT */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_UPPER_MAJOR, .recovery_state = SAHPI_ES_UNSPECIFIED, }, { .event = "FFFFFF33", /* EN_GENERIC_LOWER_WARN_VOLT */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_LOWER_MAJOR, .recovery_state = SAHPI_ES_UNSPECIFIED, }, {}, }, .reading2event = {}, }, .comment = "PEU2 Standby 12 Volt Sensor", }, }, /* BIE Temperature Sensor */ { .ipmi_tag = "BIE LOCAL TEMP", .ipmi_tag_alias1 = '\0', .ipmi = { .index = 7, .sensor = { .Num = SNMP_BC_LAST_NON_IPMI_BEM_SENSOR + 7, .Type = SAHPI_TEMPERATURE, .Category = SAHPI_EC_THRESHOLD, .EnableCtrl = SAHPI_FALSE, .EventCtrl = SAHPI_SEC_READ_ONLY, .Events = SAHPI_ES_UPPER_MAJOR | SAHPI_ES_UPPER_CRIT, .DataFormat = { .IsSupported = SAHPI_TRUE, .ReadingType = SAHPI_SENSOR_READING_TYPE_FLOAT64, .BaseUnits = SAHPI_SU_DEGREES_C, .ModifierUnits = SAHPI_SU_UNSPECIFIED, .ModifierUse = SAHPI_SMUU_NONE, .Percentage = SAHPI_FALSE, .Range = { .Flags = SAHPI_SRF_MAX | SAHPI_SRF_MIN, .Max = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, .Value = { .SensorFloat64 = 125, }, }, .Min = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, .Value = { .SensorFloat64 = 0, }, }, }, }, .ThresholdDefn = { .IsAccessible = SAHPI_TRUE, .ReadThold = SAHPI_STM_UP_MAJOR | SAHPI_STM_UP_CRIT, .WriteThold = 0, }, .Oem = 0, }, .sensor_info = { .mib = { .not_avail_indicator_num = 0, .write_only = SAHPI_FALSE, .oid = "discovered", .loc_offset = 0, .threshold_oids = { .UpCritical = "discovered", .UpMajor = "discovered", }, .threshold_write_oids = {}, }, .cur_state = SAHPI_ES_UNSPECIFIED, .sensor_enabled = SAHPI_TRUE, .events_enabled = SAHPI_TRUE, .assert_mask = SAHPI_ES_UPPER_MAJOR | SAHPI_ES_UPPER_CRIT, .deassert_mask = SAHPI_ES_UPPER_MAJOR | SAHPI_ES_UPPER_CRIT, .event_array = { { .event = "FFFFFF34", /* EN_GENERIC_HI_CRIT_TEMP */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_UPPER_CRIT, .recovery_state = SAHPI_ES_UPPER_MAJOR, }, { .event = "FFFFFF35", /* EN_GENERIC_HI_WARN_TEMP */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_UPPER_MAJOR, .recovery_state = SAHPI_ES_UNSPECIFIED, }, {}, }, .reading2event = {}, }, .comment = "BIE Temperature Sensor", }, }, /* BIE 1.5 Volt Sensor */ { .ipmi_tag = "BIE 1.5V SENSE", .ipmi_tag_alias1 = '\0', .ipmi = { .index = 8, .sensor = { .Num = SNMP_BC_LAST_NON_IPMI_BEM_SENSOR + 8, .Type = SAHPI_VOLTAGE, .Category = SAHPI_EC_THRESHOLD, .EnableCtrl = SAHPI_FALSE, .EventCtrl = SAHPI_SEC_READ_ONLY, .Events = SAHPI_ES_LOWER_MAJOR | SAHPI_ES_UPPER_MAJOR, .DataFormat = { .IsSupported = SAHPI_TRUE, .ReadingType = SAHPI_SENSOR_READING_TYPE_FLOAT64, .BaseUnits = SAHPI_SU_VOLTS, .ModifierUnits = SAHPI_SU_UNSPECIFIED, .ModifierUse = SAHPI_SMUU_NONE, .Percentage = SAHPI_FALSE, .Range = { .Flags = SAHPI_SRF_MAX | SAHPI_SRF_MIN | SAHPI_SRF_NOMINAL, .Max = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, .Value = { .SensorFloat64 = 4.4, }, }, .Nominal = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, .Value = { .SensorFloat64 = 1.5, }, }, .Min = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, .Value = { .SensorFloat64 = 0, }, }, }, }, .ThresholdDefn = { .IsAccessible = SAHPI_TRUE, .ReadThold = SAHPI_STM_LOW_MAJOR | SAHPI_STM_UP_MAJOR, .WriteThold = 0, }, .Oem = 0, }, .sensor_info = { .mib = { .not_avail_indicator_num = 0, .write_only = SAHPI_FALSE, .oid = "discovered", .loc_offset = 0, .threshold_oids = { .UpMajor = "discovered", .LowMajor = "discovered", }, .threshold_write_oids = {}, }, .cur_state = SAHPI_ES_UNSPECIFIED, .sensor_enabled = SAHPI_TRUE, .events_enabled = SAHPI_TRUE, .assert_mask = SAHPI_ES_LOWER_MAJOR | SAHPI_ES_UPPER_MAJOR, .deassert_mask = SAHPI_ES_LOWER_MAJOR | SAHPI_ES_UPPER_MAJOR, .event_array = { { .event = "FFFFFF36", /* EN_GENERIC_UPPER_WARN_VOLT */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_UPPER_MAJOR, .recovery_state = SAHPI_ES_UNSPECIFIED, }, { .event = "FFFFFF37", /* EN_GENERIC_LOWER_WARN_VOLT */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_LOWER_MAJOR, .recovery_state = SAHPI_ES_UNSPECIFIED, }, {}, }, .reading2event = {}, }, .comment = "BIE 1.5 Volt Sensor", }, }, /* BIE 3.3 Volt Sensor */ { .ipmi_tag = "BIE 3.3V SENSE", .ipmi_tag_alias1 = '\0', .ipmi = { .index = 9, .sensor = { .Num = SNMP_BC_LAST_NON_IPMI_BEM_SENSOR + 9, .Type = SAHPI_VOLTAGE, .Category = SAHPI_EC_THRESHOLD, .EnableCtrl = SAHPI_FALSE, .EventCtrl = SAHPI_SEC_READ_ONLY, .Events = SAHPI_ES_LOWER_MAJOR | SAHPI_ES_UPPER_MAJOR, .DataFormat = { .IsSupported = SAHPI_TRUE, .ReadingType = SAHPI_SENSOR_READING_TYPE_FLOAT64, .BaseUnits = SAHPI_SU_VOLTS, .ModifierUnits = SAHPI_SU_UNSPECIFIED, .ModifierUse = SAHPI_SMUU_NONE, .Percentage = SAHPI_FALSE, .Range = { .Flags = SAHPI_SRF_MAX | SAHPI_SRF_MIN | SAHPI_SRF_NOMINAL, .Max = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, .Value = { .SensorFloat64 = 3.6, }, }, .Nominal = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, .Value = { .SensorFloat64 = 3.3, }, }, .Min = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, .Value = { .SensorFloat64 = 0, }, }, }, }, .ThresholdDefn = { .IsAccessible = SAHPI_TRUE, .ReadThold = SAHPI_STM_LOW_MAJOR | SAHPI_STM_UP_MAJOR, .WriteThold = 0, }, .Oem = 0, }, .sensor_info = { .mib = { .not_avail_indicator_num = 0, .write_only = SAHPI_FALSE, .oid = "discovered", .loc_offset = 0, .threshold_oids = { .UpMajor = "discovered", .LowMajor = "discovered", }, .threshold_write_oids = {}, }, .cur_state = SAHPI_ES_UNSPECIFIED, .sensor_enabled = SAHPI_TRUE, .events_enabled = SAHPI_TRUE, .assert_mask = SAHPI_ES_LOWER_MAJOR | SAHPI_ES_UPPER_MAJOR, .deassert_mask = SAHPI_ES_LOWER_MAJOR | SAHPI_ES_UPPER_MAJOR, .event_array = { { .event = "FFFFFF38", /* EN_GENERIC_UPPER_WARN_VOLT */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_UPPER_MAJOR, .recovery_state = SAHPI_ES_UNSPECIFIED, }, { .event = "FFFFFF39", /* EN_GENERIC_LOWER_WARN_VOLT */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_LOWER_MAJOR, .recovery_state = SAHPI_ES_UNSPECIFIED, }, {}, }, .reading2event = {}, }, .comment = "BIE 3.3 Volt Sensor", }, }, /* BIE 5 Volt Sensor */ { .ipmi_tag = "BIE 5V SENSE", .ipmi_tag_alias1 = '\0', .ipmi = { .index = 10, .sensor = { .Num = SNMP_BC_LAST_NON_IPMI_BEM_SENSOR + 10, .Type = SAHPI_VOLTAGE, .Category = SAHPI_EC_THRESHOLD, .EnableCtrl = SAHPI_FALSE, .EventCtrl = SAHPI_SEC_READ_ONLY, .Events = SAHPI_ES_LOWER_MAJOR | SAHPI_ES_UPPER_MAJOR, .DataFormat = { .IsSupported = SAHPI_TRUE, .ReadingType = SAHPI_SENSOR_READING_TYPE_FLOAT64, .BaseUnits = SAHPI_SU_VOLTS, .ModifierUnits = SAHPI_SU_UNSPECIFIED, .ModifierUse = SAHPI_SMUU_NONE, .Percentage = SAHPI_FALSE, .Range = { .Flags = SAHPI_SRF_MAX | SAHPI_SRF_MIN | SAHPI_SRF_NOMINAL, .Max = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, .Value = { .SensorFloat64 = 6.7, }, }, .Nominal = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, .Value = { .SensorFloat64 = 5, }, }, .Min = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, .Value = { .SensorFloat64 = 0, }, }, }, }, .ThresholdDefn = { .IsAccessible = SAHPI_TRUE, .ReadThold = SAHPI_STM_LOW_MAJOR | SAHPI_STM_UP_MAJOR, .WriteThold = 0, }, .Oem = 0, }, .sensor_info = { .mib = { .not_avail_indicator_num = 0, .write_only = SAHPI_FALSE, .oid = "discovered", .loc_offset = 0, .threshold_oids = { .UpMajor = "discovered", .LowMajor = "discovered", }, .threshold_write_oids = {}, }, .cur_state = SAHPI_ES_UNSPECIFIED, .sensor_enabled = SAHPI_TRUE, .events_enabled = SAHPI_TRUE, .assert_mask = SAHPI_ES_LOWER_MAJOR | SAHPI_ES_UPPER_MAJOR, .deassert_mask = SAHPI_ES_LOWER_MAJOR | SAHPI_ES_UPPER_MAJOR, .event_array = { { .event = "FFFFFF3A", /* EN_GENERIC_UPPER_WARN_VOLT */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_UPPER_MAJOR, .recovery_state = SAHPI_ES_UNSPECIFIED, }, { .event = "FFFFFF3B", /* EN_GENERIC_LOWER_WARN_VOLT */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_LOWER_MAJOR, .recovery_state = SAHPI_ES_UNSPECIFIED, }, {}, }, .reading2event = {}, }, .comment = "BIE 5 Volt Sensor", }, }, /* BIE 12 Volt Sensor */ { .ipmi_tag = "BIE 12V SENSE", .ipmi_tag_alias1 = '\0', .ipmi = { .index = 11, .sensor = { .Num = SNMP_BC_LAST_NON_IPMI_BEM_SENSOR + 11, .Type = SAHPI_VOLTAGE, .Category = SAHPI_EC_THRESHOLD, .EnableCtrl = SAHPI_FALSE, .EventCtrl = SAHPI_SEC_READ_ONLY, .Events = SAHPI_ES_LOWER_MAJOR | SAHPI_ES_UPPER_MAJOR, .DataFormat = { .IsSupported = SAHPI_TRUE, .ReadingType = SAHPI_SENSOR_READING_TYPE_FLOAT64, .BaseUnits = SAHPI_SU_VOLTS, .ModifierUnits = SAHPI_SU_UNSPECIFIED, .ModifierUse = SAHPI_SMUU_NONE, .Percentage = SAHPI_FALSE, .Range = { .Flags = SAHPI_SRF_MAX | SAHPI_SRF_MIN | SAHPI_SRF_NOMINAL, .Max = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, .Value = { .SensorFloat64 = 16, }, }, .Nominal = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, .Value = { .SensorFloat64 = 12, }, }, .Min = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, .Value = { .SensorFloat64 = 0, }, }, }, }, .ThresholdDefn = { .IsAccessible = SAHPI_TRUE, .ReadThold = SAHPI_STM_LOW_MAJOR | SAHPI_STM_UP_MAJOR, .WriteThold = 0, }, .Oem = 0, }, .sensor_info = { .mib = { .not_avail_indicator_num = 0, .write_only = SAHPI_FALSE, .oid = "discovered", .loc_offset = 0, .threshold_oids = { .UpMajor = "discovered", .LowMajor = "discovered", }, .threshold_write_oids = {}, }, .cur_state = SAHPI_ES_UNSPECIFIED, .sensor_enabled = SAHPI_TRUE, .events_enabled = SAHPI_TRUE, .assert_mask = SAHPI_ES_LOWER_MAJOR | SAHPI_ES_UPPER_MAJOR, .deassert_mask = SAHPI_ES_LOWER_MAJOR | SAHPI_ES_UPPER_MAJOR, .event_array = { { .event = "FFFFFF3C", /* EN_GENERIC_UPPER_WARN_VOLT */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_UPPER_MAJOR, .recovery_state = SAHPI_ES_UNSPECIFIED, }, { .event = "FFFFFF3D", /* EN_GENERIC_LOWER_WARN_VOLT */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_LOWER_MAJOR, .recovery_state = SAHPI_ES_UNSPECIFIED, }, {}, }, .reading2event = {}, }, .comment = "BIE 12 Volt Sensor", }, }, {} /* Terminate array with a null element */ }; #if 0 /* BEM DASD Sensors */ struct snmp_bc_sensor snmp_bc_bse_dasd_sensors[] = { /* BEM DASD 1 Operational Sensor - event only */ { .index = 1, .sensor = { .Num = 1, .Type = SAHPI_OPERATIONAL, .Category = SAHPI_EC_AVAILABILITY, .EnableCtrl = SAHPI_FALSE, .EventCtrl = SAHPI_SEC_READ_ONLY, .Events = SAHPI_ES_RUNNING | SAHPI_ES_OFF_LINE, .DataFormat = { .IsSupported = SAHPI_FALSE, }, .ThresholdDefn = { .IsAccessible = SAHPI_FALSE, }, .Oem = 0, }, .sensor_info = { .cur_state = SAHPI_ES_RUNNING, .cur_child_rid = SAHPI_UNSPECIFIED_RESOURCE_ID, .sensor_enabled = SAHPI_TRUE, .events_enabled = SAHPI_TRUE, .assert_mask = SAHPI_ES_OFF_LINE, .deassert_mask = SAHPI_ES_OFF_LINE, .event_array = { { .event = "06801002", /* EN_FAULT_DASD1_SCSI_ID_2 */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_OFF_LINE, .recovery_state = SAHPI_ES_RUNNING, }, { .event = "06800002", /* EN_FAULT_DASD1_HARD_DRIVE_2 */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_OFF_LINE, .recovery_state = SAHPI_ES_RUNNING, }, {}, }, .reading2event = {}, }, .comment = "BEM DASD 1 Operational Sensor", }, /* BEM DASD 2 Operational Sensor - event only */ { .index = 2, .sensor = { .Num = 2, .Type = SAHPI_OPERATIONAL, .Category = SAHPI_EC_AVAILABILITY, .EnableCtrl = SAHPI_FALSE, .EventCtrl = SAHPI_SEC_READ_ONLY, .Events = SAHPI_ES_RUNNING | SAHPI_ES_OFF_LINE, .DataFormat = { .IsSupported = SAHPI_FALSE, }, .ThresholdDefn = { .IsAccessible = SAHPI_FALSE, }, .Oem = 0, }, .sensor_info = { .cur_state = SAHPI_ES_RUNNING, .cur_child_rid = SAHPI_UNSPECIFIED_RESOURCE_ID, .sensor_enabled = SAHPI_TRUE, .events_enabled = SAHPI_TRUE, .assert_mask = SAHPI_ES_OFF_LINE, .deassert_mask = SAHPI_ES_OFF_LINE, .event_array = { { .event = "06801003", /* EN_FAULT_DASD1_SCSI_ID_3 */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_OFF_LINE, .recovery_state = SAHPI_ES_RUNNING, }, { .event = "06800003", /* EN_FAULT_DASD1_HARD_DRIVE_3 */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_OFF_LINE, .recovery_state = SAHPI_ES_RUNNING, }, {}, }, .reading2event = {}, }, .comment = "BEM DASD 2 Operational Sensor", }, {} /* Terminate array with a null element */ }; struct snmp_bc_sensor snmp_bc_bse3_dasd_sensors[] = { /* BEM DASD 3 Operational Sensor - event only */ { .index = 1, .sensor = { .Num = 3, .Type = SAHPI_OPERATIONAL, .Category = SAHPI_EC_AVAILABILITY, .EnableCtrl = SAHPI_FALSE, .EventCtrl = SAHPI_SEC_READ_ONLY, .Events = SAHPI_ES_RUNNING | SAHPI_ES_OFF_LINE, .DataFormat = { .IsSupported = SAHPI_FALSE, }, .ThresholdDefn = { .IsAccessible = SAHPI_FALSE, }, .Oem = 0, }, .sensor_info = { .cur_state = SAHPI_ES_RUNNING, .cur_child_rid = SAHPI_UNSPECIFIED_RESOURCE_ID, .sensor_enabled = SAHPI_TRUE, .events_enabled = SAHPI_TRUE, .assert_mask = SAHPI_ES_OFF_LINE, .deassert_mask = SAHPI_ES_OFF_LINE, .event_array = { { .event = "06800004", /* EN_FAULT_DASD1_HARD_DRIVE_4 */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_OFF_LINE, .recovery_state = SAHPI_ES_RUNNING, }, {}, }, .reading2event = {}, }, .comment = "BEM DASD 3 Operational Sensor", }, {} /* Terminate array with a null element */ }; #endif /******************** * Media Tray Sensors ********************/ struct snmp_bc_sensor snmp_bc_mediatray_sensors_faultled[] = { /* Media Tray Operational Status Sensor - Readable Fault LED (BCHT) */ /* Media Trays without readable Fault LED are supported in snmp_bc_mediatray_sensors_nofaultled as an event-only sensor */ { .index = 1, .sensor = { .Num = 1, .Type = SAHPI_OPERATIONAL, .Category = SAHPI_EC_AVAILABILITY, .EnableCtrl = SAHPI_FALSE, .EventCtrl = SAHPI_SEC_READ_ONLY, .Events = SAHPI_ES_RUNNING | SAHPI_ES_OFF_LINE, .DataFormat = { .IsSupported = SAHPI_TRUE, .ReadingType = SAHPI_SENSOR_READING_TYPE_INT64, .BaseUnits = SAHPI_SU_UNSPECIFIED, .ModifierUnits = SAHPI_SU_UNSPECIFIED, .ModifierUse = SAHPI_SMUU_NONE, .Percentage = SAHPI_FALSE, .Range = { .Flags = SAHPI_SRF_MAX | SAHPI_SRF_MIN, .Max = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_INT64, .Value = { .SensorInt64 = 1, }, }, .Min = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_INT64, .Value = { .SensorInt64 = 0, }, }, }, }, .ThresholdDefn = { .IsAccessible = SAHPI_FALSE, }, .Oem = 0, }, .sensor_info = { .mib = { .not_avail_indicator_num = 0, .write_only = SAHPI_FALSE, /* ledMediaTrayFault for Media Tray 1 */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.8.7.1.1.5.1", .loc_offset = 0, }, .cur_state = SAHPI_ES_RUNNING, .cur_child_rid = SAHPI_UNSPECIFIED_RESOURCE_ID, .sensor_enabled = SAHPI_TRUE, .events_enabled = SAHPI_TRUE, .assert_mask = SAHPI_ES_OFF_LINE, .deassert_mask = SAHPI_ES_OFF_LINE, .event_array = { { .event = "6F60C001", /* EN_MT_1_HW_FAILURE */ .event_assertion = SAHPI_TRUE, .event_state = SAHPI_ES_OFF_LINE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .recovery_state = SAHPI_ES_RUNNING, }, { .event = "06A2E001", /* EN_FRONT_PANEL_TEMP_FAIL */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_OFF_LINE, .recovery_state = SAHPI_ES_RUNNING, }, {}, }, .reading2event = { /* 0 = Fault LED is off - ok */ { .num = 1, .rangemap = { .Flags = SAHPI_SRF_NOMINAL, .Min = { .Value = { .SensorInt64 = 0, }, }, }, .state = SAHPI_ES_RUNNING, }, /* 1 = Fault LED is on - fault */ { .num = 2, .rangemap = { .Flags = SAHPI_SRF_NOMINAL, .Nominal = { .Value = { .SensorInt64 = 1, }, }, }, .state = SAHPI_ES_OFF_LINE, }, }, }, .comment = "Media Tray Operational Status Sensor", }, {} /* Terminate array with a null element */ }; struct snmp_bc_sensor snmp_bc_mediatray_sensors_nofaultled[] = { /* Media Tray Operational Status Sensor - event only */ { .index = 1, .sensor = { .Num = 1, .Type = SAHPI_OPERATIONAL, .Category = SAHPI_EC_AVAILABILITY, .EnableCtrl = SAHPI_FALSE, .EventCtrl = SAHPI_SEC_READ_ONLY, .Events = SAHPI_ES_RUNNING | SAHPI_ES_OFF_LINE, .DataFormat = { .IsSupported = SAHPI_FALSE, }, .ThresholdDefn = { .IsAccessible = SAHPI_FALSE, }, .Oem = 0, }, .sensor_info = { .cur_state = SAHPI_ES_RUNNING, .cur_child_rid = SAHPI_UNSPECIFIED_RESOURCE_ID, .sensor_enabled = SAHPI_TRUE, .events_enabled = SAHPI_TRUE, .assert_mask = SAHPI_ES_OFF_LINE, .deassert_mask = SAHPI_ES_OFF_LINE, .event_array = { { .event = "6F60C001", /* EN_MT_1_HW_FAILURE */ .event_assertion = SAHPI_TRUE, .event_state = SAHPI_ES_OFF_LINE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .recovery_state = SAHPI_ES_RUNNING, }, { .event = "06A2E001", /* EN_FRONT_PANEL_TEMP_FAIL */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_OFF_LINE, .recovery_state = SAHPI_ES_RUNNING, }, {}, }, .reading2event = {}, }, .comment = "Media Tray Operational Status Sensor", }, {} /* Terminate array with a null element */ }; /* This structure is for all common Media Tray 1 (all types) sensors */ struct snmp_bc_sensor snmp_bc_mediatray_sensors[] = { /* Media Tray Management Bus Operational Status Sensor - event only */ { .index = 2, /* Sensor 1 is the Operational Status Sensor above */ .sensor = { .Num = 2, .Type = SAHPI_OPERATIONAL, .Category = SAHPI_EC_AVAILABILITY, .EnableCtrl = SAHPI_FALSE, .EventCtrl = SAHPI_SEC_READ_ONLY, .Events = SAHPI_ES_RUNNING | SAHPI_ES_OFF_LINE, .DataFormat = { .IsSupported = SAHPI_FALSE, }, .ThresholdDefn = { .IsAccessible = SAHPI_FALSE, }, .Oem = 0, }, .sensor_info = { .cur_state = SAHPI_ES_RUNNING, .cur_child_rid = SAHPI_UNSPECIFIED_RESOURCE_ID, .sensor_enabled = SAHPI_TRUE, .events_enabled = SAHPI_TRUE, .assert_mask = SAHPI_ES_OFF_LINE, .deassert_mask = SAHPI_ES_OFF_LINE, .event_array = { { .event = "0002205B", /* EN_STCONN_FAIL_MEDIATRAY */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_OFF_LINE, .recovery_state = SAHPI_ES_RUNNING, }, {}, }, .reading2event = {}, }, .comment = "Media Tray Management Bus Operational Status Sensor", }, {} /* Terminate array with a null element */ }; struct snmp_bc_sensor snmp_bc_mediatray2_sensors[] = { /* Media Tray Operational Status Sensor - Readable Fault LED (BCHT) */ { .index = 1, .sensor = { .Num = 1, .Type = SAHPI_OPERATIONAL, .Category = SAHPI_EC_AVAILABILITY, .EnableCtrl = SAHPI_FALSE, .EventCtrl = SAHPI_SEC_READ_ONLY, .Events = SAHPI_ES_RUNNING | SAHPI_ES_OFF_LINE, .DataFormat = { .IsSupported = SAHPI_TRUE, .ReadingType = SAHPI_SENSOR_READING_TYPE_INT64, .BaseUnits = SAHPI_SU_UNSPECIFIED, .ModifierUnits = SAHPI_SU_UNSPECIFIED, .ModifierUse = SAHPI_SMUU_NONE, .Percentage = SAHPI_FALSE, .Range = { .Flags = SAHPI_SRF_MAX | SAHPI_SRF_MIN, .Max = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_INT64, .Value = { .SensorInt64 = 1, }, }, .Min = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_INT64, .Value = { .SensorInt64 = 0, }, }, }, }, .ThresholdDefn = { .IsAccessible = SAHPI_FALSE, }, .Oem = 0, }, .sensor_info = { .mib = { .not_avail_indicator_num = 0, .write_only = SAHPI_FALSE, /* ledMediaTrayFault for Media Tray 2 */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.8.7.1.1.5.2", .loc_offset = 0, }, .cur_state = SAHPI_ES_RUNNING, .cur_child_rid = SAHPI_UNSPECIFIED_RESOURCE_ID, .sensor_enabled = SAHPI_TRUE, .events_enabled = SAHPI_TRUE, .assert_mask = SAHPI_ES_OFF_LINE, .deassert_mask = SAHPI_ES_OFF_LINE, .event_array = { { .event = "6F60C002", /* EN_MT_2_HW_FAILURE */ .event_assertion = SAHPI_TRUE, .event_state = SAHPI_ES_OFF_LINE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .recovery_state = SAHPI_ES_RUNNING, }, { .event = "06A2E002", /* EN_FRONT_PANEL_B_TEMP_FAIL */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_OFF_LINE, .recovery_state = SAHPI_ES_RUNNING, }, {}, }, .reading2event = { /* 0 = Fault LED is off - ok */ { .num = 1, .rangemap = { .Flags = SAHPI_SRF_NOMINAL, .Min = { .Value = { .SensorInt64 = 0, }, }, }, .state = SAHPI_ES_RUNNING, }, /* 1 = Fault LED is on - fault */ { .num = 2, .rangemap = { .Flags = SAHPI_SRF_NOMINAL, .Nominal = { .Value = { .SensorInt64 = 1, }, }, }, .state = SAHPI_ES_OFF_LINE, }, }, }, .comment = "Media Tray Operational Status Sensor", }, /* Media Tray Management Bus Operational Status Sensor - event only */ { .index = 2, .sensor = { .Num = 2, .Type = SAHPI_OPERATIONAL, .Category = SAHPI_EC_AVAILABILITY, .EnableCtrl = SAHPI_FALSE, .EventCtrl = SAHPI_SEC_READ_ONLY, .Events = SAHPI_ES_RUNNING | SAHPI_ES_OFF_LINE, .DataFormat = { .IsSupported = SAHPI_FALSE, }, .ThresholdDefn = { .IsAccessible = SAHPI_FALSE, }, .Oem = 0, }, .sensor_info = { .cur_state = SAHPI_ES_RUNNING, .cur_child_rid = SAHPI_UNSPECIFIED_RESOURCE_ID, .sensor_enabled = SAHPI_TRUE, .events_enabled = SAHPI_TRUE, .assert_mask = SAHPI_ES_OFF_LINE, .deassert_mask = SAHPI_ES_OFF_LINE, .event_array = { { .event = "0002205C", /* EN_STCONN_FAIL_MEDIATRAYB */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_OFF_LINE, .recovery_state = SAHPI_ES_RUNNING, }, {}, }, .reading2event = {}, }, .comment = "Media Tray Management Bus Operational Status Sensor", }, {} /* Terminate array with a null element */ }; /**************** * Blower Sensors ****************/ struct snmp_bc_sensor snmp_bc_blower_sensors[] = { /* Blower Operational Status Sensor */ { .index = 1, .sensor = { .Num = 1, .Type = SAHPI_OPERATIONAL, .Category = SAHPI_EC_AVAILABILITY, .EnableCtrl = SAHPI_FALSE, .EventCtrl = SAHPI_SEC_READ_ONLY, .Events = SAHPI_ES_RUNNING | SAHPI_ES_OFF_LINE, .DataFormat = { .IsSupported = SAHPI_TRUE, .ReadingType = SAHPI_SENSOR_READING_TYPE_INT64, .BaseUnits = SAHPI_SU_UNSPECIFIED, .ModifierUnits = SAHPI_SU_UNSPECIFIED, .ModifierUse = SAHPI_SMUU_NONE, .Percentage = SAHPI_FALSE, .Range = { .Flags = SAHPI_SRF_MAX | SAHPI_SRF_MIN, .Max = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_INT64, .Value = { .SensorInt64 = 3, }, }, .Min = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_INT64, .Value = { .SensorInt64 = 0, }, }, }, }, .ThresholdDefn = { .IsAccessible = SAHPI_FALSE, }, .Oem = 0, }, .sensor_info = { .mib = { .not_avail_indicator_num = 0, .write_only = SAHPI_FALSE, /* blower1State - blower4State */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.3.x.0", .loc_offset = (10 - 1), }, .cur_state = SAHPI_ES_RUNNING, .cur_child_rid = SAHPI_UNSPECIFIED_RESOURCE_ID, .sensor_enabled = SAHPI_TRUE, .events_enabled = SAHPI_TRUE, .assert_mask = SAHPI_ES_OFF_LINE, .deassert_mask = SAHPI_ES_OFF_LINE, .event_array = { { .event = "0002680x", /* EN_FAN1_SPEED */ .event_assertion = SAHPI_TRUE, .event_state = SAHPI_ES_OFF_LINE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .recovery_state = SAHPI_ES_RUNNING, }, { .event = "0B02600x", /* EN_UNREC_FANx */ .event_assertion = SAHPI_TRUE, .event_state = SAHPI_ES_OFF_LINE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .recovery_state = SAHPI_ES_RUNNING, }, {}, }, .reading2event = { /* 0 = unknown */ { .num = 1, .rangemap = { .Flags = SAHPI_SRF_MIN, .Min = { .Value = { .SensorInt64 = 1, }, }, }, .state = SAHPI_ES_UNSPECIFIED, }, /* 1 = good */ { .num = 2, .rangemap = { .Flags = SAHPI_SRF_NOMINAL, .Nominal = { .Value = { .SensorInt64 = 1, }, }, }, .state = SAHPI_ES_RUNNING, }, /* 2 = warning */ { .num = 3, .rangemap = { .Flags = SAHPI_SRF_NOMINAL, .Nominal = { .Value = { .SensorInt64 = 2, }, }, }, .state = SAHPI_ES_DEGRADED, }, /* 3 = bad */ { .num = 4, .rangemap = { .Flags = SAHPI_SRF_NOMINAL, .Nominal = { .Value = { .SensorInt64 = 3, }, }, }, .state = SAHPI_ES_OFF_LINE, }, }, }, .comment = "Blower Operational Status Sensor", }, /* Blower Speed (Percent of Max) Sensor */ { .index = 2, .sensor = { .Num = 2, .Type = SAHPI_FAN, .Category = SAHPI_EC_THRESHOLD, .EnableCtrl = SAHPI_FALSE, .EventCtrl = SAHPI_SEC_READ_ONLY, .Events = SAHPI_ES_UPPER_MAJOR, .DataFormat = { .IsSupported = SAHPI_TRUE, .ReadingType = SAHPI_SENSOR_READING_TYPE_FLOAT64, .BaseUnits = SAHPI_SU_RPM, .ModifierUnits = SAHPI_SU_UNSPECIFIED, .ModifierUse = SAHPI_SMUU_NONE, .Percentage = SAHPI_TRUE, .Range = { .Flags = SAHPI_SRF_MAX | SAHPI_SRF_MIN, .Max = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, .Value = { .SensorFloat64 = 100, }, }, .Min = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, .Value = { .SensorFloat64 = 0, }, }, }, }, .ThresholdDefn = { .IsAccessible = SAHPI_FALSE, .ReadThold = 0, .WriteThold = 0, }, .Oem = 0, }, .sensor_info = { .mib = { .not_avail_indicator_num = 0, .write_only = SAHPI_FALSE, /* blower1speed - blower4speed */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.3.x.0", .loc_offset = 0, }, .cur_state = SAHPI_ES_UNSPECIFIED, .cur_child_rid = SAHPI_UNSPECIFIED_RESOURCE_ID, .sensor_enabled = SAHPI_TRUE, .events_enabled = SAHPI_TRUE, .assert_mask = SAHPI_ES_UPPER_MAJOR, .deassert_mask = SAHPI_ES_UPPER_MAJOR, .event_array = { { .event = "000A600x", /* EN_FAN1_PFA */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_UPPER_MAJOR, .recovery_state = SAHPI_ES_UNSPECIFIED, }, {}, }, .reading2event = {}, }, .comment = "Blower Speed (Percent of Max) Sensor", }, /* Blower Management Bus Operational Status Sensor - event only */ { .index = 3, .sensor = { .Num = 3, .Type = SAHPI_OPERATIONAL, .Category = SAHPI_EC_AVAILABILITY, .EnableCtrl = SAHPI_FALSE, .EventCtrl = SAHPI_SEC_READ_ONLY, .Events = SAHPI_ES_RUNNING | SAHPI_ES_OFF_LINE, .DataFormat = { .IsSupported = SAHPI_FALSE, }, .ThresholdDefn = { .IsAccessible = SAHPI_FALSE, }, .Oem = 0, }, .sensor_info = { .cur_state = SAHPI_ES_RUNNING, .cur_child_rid = SAHPI_UNSPECIFIED_RESOURCE_ID, .sensor_enabled = SAHPI_TRUE, .events_enabled = SAHPI_TRUE, .assert_mask = SAHPI_ES_OFF_LINE, .deassert_mask = SAHPI_ES_OFF_LINE, .event_array = { { .event = "000A200x", /* EN_STCONN_FAIL_BLOWER_x */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_OFF_LINE, .recovery_state = SAHPI_ES_RUNNING, }, {}, }, .reading2event = {}, }, .comment = "Blower Management Bus Operational Status Sensor", }, {} /* Terminate array with a null element */ }; /* BladeCenter H specific blower sensors */ #define SNMP_BC_LAST_COMMON_BLOWER_SENSOR 3 struct snmp_bc_sensor snmp_bc_blower_sensors_bch[] = { /* Blower RPM Speed Sensor */ { .index = 1, .sensor = { .Num = SNMP_BC_LAST_COMMON_BLOWER_SENSOR + 1, .Type = SAHPI_FAN, .Category = SAHPI_EC_UNSPECIFIED, .EnableCtrl = SAHPI_FALSE, .EventCtrl = SAHPI_SEC_READ_ONLY, .Events = 0x00, .DataFormat = { .IsSupported = SAHPI_TRUE, .ReadingType = SAHPI_SENSOR_READING_TYPE_FLOAT64, .BaseUnits = SAHPI_SU_RPM, .ModifierUnits = SAHPI_SU_UNSPECIFIED, .ModifierUse = SAHPI_SMUU_NONE, .Percentage = SAHPI_FALSE, .Range = { .Flags = SAHPI_SRF_MAX | SAHPI_SRF_MIN, .Max = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, .Value = { .SensorFloat64 = 4000, }, }, .Min = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, .Value = { .SensorFloat64 = 0, }, }, }, }, .ThresholdDefn = { .IsAccessible = SAHPI_FALSE, }, .Oem = 0, }, .sensor_info = { .mib = { .not_avail_indicator_num = 0, .write_only = SAHPI_FALSE, /* blower1speedRPM - blower2speedRPM */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.3.x.0", .loc_offset = (20 - 1), }, .cur_state = SAHPI_ES_UNSPECIFIED, .cur_child_rid = SAHPI_UNSPECIFIED_RESOURCE_ID, .sensor_enabled = SAHPI_TRUE, .events_enabled = SAHPI_TRUE, .assert_mask = 0x00, .deassert_mask = 0x00, .event_array = { {}, }, .reading2event = {}, }, .comment = "Blower RPM Speed Sensor", }, {} /* Terminate array with a null element */ }; /*************** * Power Sensors ***************/ struct snmp_bc_sensor snmp_bc_power_sensors[] = { /* Power Module Operational Status Sensor */ { .index = 1, .sensor = { .Num = 1, .Type = SAHPI_OPERATIONAL, .Category = SAHPI_EC_AVAILABILITY, .EnableCtrl = SAHPI_FALSE, .EventCtrl = SAHPI_SEC_READ_ONLY, .Events = SAHPI_ES_RUNNING | SAHPI_ES_DEGRADED | SAHPI_ES_OFF_LINE, .DataFormat = { .IsSupported = SAHPI_TRUE, .ReadingType = SAHPI_SENSOR_READING_TYPE_INT64, .BaseUnits = SAHPI_SU_UNSPECIFIED, .ModifierUnits = SAHPI_SU_UNSPECIFIED, .ModifierUse = SAHPI_SMUU_NONE, .Percentage = SAHPI_FALSE, .Range = { .Flags = SAHPI_SRF_MAX | SAHPI_SRF_MIN, .Max = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_INT64, .Value = { .SensorInt64 = 3, }, }, .Min = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_INT64, .Value = { .SensorInt64 = 0, }, }, }, }, .ThresholdDefn = { .IsAccessible = SAHPI_FALSE, }, .Oem = 0, }, .sensor_info = { .mib = { .not_avail_indicator_num = 0, .write_only = SAHPI_FALSE, /* powerModuleState */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.4.1.1.3.x", .loc_offset = 0, }, .cur_state = SAHPI_ES_RUNNING, .cur_child_rid = SAHPI_UNSPECIFIED_RESOURCE_ID, .sensor_enabled = SAHPI_TRUE, .events_enabled = SAHPI_TRUE, .assert_mask = SAHPI_ES_DEGRADED | SAHPI_ES_OFF_LINE, .deassert_mask = SAHPI_ES_DEGRADED | SAHPI_ES_OFF_LINE, .event_array = { { .event = "0820000x", /* EN_FAULT_PSx */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_OFF_LINE, .recovery_state = SAHPI_ES_RUNNING, }, { .event = "0823600x", /* EN_FAULT_PSx_12V_OVR_CUR */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_OFF_LINE, .recovery_state = SAHPI_ES_RUNNING, }, { .event = "0802800x", /* EN_FAULT_PSx_DC_GOOD */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_OFF_LINE, .recovery_state = SAHPI_ES_RUNNING, }, { .event = "0823648x", /* EN_FAULT_PSx_12V_OVER */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_OFF_LINE, .recovery_state = SAHPI_ES_RUNNING, }, { .event = "0823680x", /* EN_FAULT_PSx_12V_UNDER */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_OFF_LINE, .recovery_state = SAHPI_ES_RUNNING, }, { .event = "0818000x", /* EN_FAULT_PSx_EPOW */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_OFF_LINE, .recovery_state = SAHPI_ES_RUNNING, }, { .event = "0821A00x", /* EN_FAULT_PSx_CUR_FAIL */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_DEGRADED, .recovery_state = SAHPI_ES_RUNNING, }, {}, }, .reading2event = { /* 0 = unknown */ { .num = 1, .rangemap = { .Flags = SAHPI_SRF_MIN, .Min = { .Value = { .SensorInt64 = 1, }, }, }, .state = SAHPI_ES_UNSPECIFIED, }, /* 1 = good */ { .num = 2, .rangemap = { .Flags = SAHPI_SRF_NOMINAL, .Nominal = { .Value = { .SensorInt64 = 1, }, }, }, .state = SAHPI_ES_RUNNING, }, /* 2 = warning */ { .num = 3, .rangemap = { .Flags = SAHPI_SRF_NOMINAL, .Nominal = { .Value = { .SensorInt64 = 2, }, }, }, .state = SAHPI_ES_DEGRADED, }, /* 3 = bad */ { .num = 4, .rangemap = { .Flags = SAHPI_SRF_NOMINAL, .Nominal = { .Value = { .SensorInt64 = 3, }, }, }, .state = SAHPI_ES_OFF_LINE, }, }, }, .comment = "Power Module Operational Status Sensor", }, /* Power Module Temperature Sensor - event-only */ { .index = 2, .sensor = { .Num = 2, .Type = SAHPI_TEMPERATURE, .Category = SAHPI_EC_THRESHOLD, .EnableCtrl = SAHPI_FALSE, .EventCtrl = SAHPI_SEC_READ_ONLY, .Events = SAHPI_ES_UPPER_MAJOR | SAHPI_ES_UPPER_CRIT, .DataFormat = { .IsSupported = SAHPI_FALSE, }, .ThresholdDefn = { .IsAccessible = SAHPI_FALSE, .ReadThold = 0, .WriteThold = 0, }, .Oem = 0, }, .sensor_info = { .cur_state = SAHPI_ES_UNSPECIFIED, .cur_child_rid = SAHPI_UNSPECIFIED_RESOURCE_ID, .sensor_enabled = SAHPI_TRUE, .events_enabled = SAHPI_TRUE, .assert_mask = SAHPI_ES_UPPER_MAJOR | SAHPI_ES_UPPER_CRIT, .deassert_mask = SAHPI_ES_UPPER_MAJOR | SAHPI_ES_UPPER_CRIT, .event_array = { { .event = "0821C08x", /* EN_FAULT_PSx_OVR_TEMP */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_UPPER_CRIT, .recovery_state = SAHPI_ES_UPPER_MAJOR, }, { .event = "0821C00x", /* EN_FAULT_PS1_TEMP_WARN */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_UPPER_MAJOR, .recovery_state = SAHPI_ES_UNSPECIFIED, }, {}, }, .reading2event = {}, }, .comment = "Power Module Temperature Sensor", }, /* Power Module Management Bus Operational Status Sensor - event only */ { .index = 3, .sensor = { .Num = 3, .Type = SAHPI_OPERATIONAL, .Category = SAHPI_EC_AVAILABILITY, .EnableCtrl = SAHPI_FALSE, .EventCtrl = SAHPI_SEC_READ_ONLY, .Events = SAHPI_ES_RUNNING | SAHPI_ES_OFF_LINE, .DataFormat = { .IsSupported = SAHPI_FALSE, }, .ThresholdDefn = { .IsAccessible = SAHPI_FALSE, }, .Oem = 0, }, .sensor_info = { .cur_state = SAHPI_ES_RUNNING, .cur_child_rid = SAHPI_UNSPECIFIED_RESOURCE_ID, .sensor_enabled = SAHPI_TRUE, .events_enabled = SAHPI_TRUE, .assert_mask = SAHPI_ES_OFF_LINE, .deassert_mask = SAHPI_ES_OFF_LINE, .event_array = { { .event = "0822200x", /* EN_STCONN_FAIL_POWER_x */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_OFF_LINE, .recovery_state = SAHPI_ES_RUNNING, }, {}, }, .reading2event = {}, }, .comment = "Power Module Management Bus Operational Status Sensor", }, {} /* Terminate array with a null element */ }; #define SNMP_BC_LAST_COMMON_POWER_MODULE_SENSOR 3 /* BladeCenter H specific power module sensors */ struct snmp_bc_sensor snmp_bc_power_sensors_bch[] = { /* Power Module Fan Pack Operational Status Sensor */ { .index = 1, .sensor = { .Num = SNMP_BC_LAST_COMMON_POWER_MODULE_SENSOR + 1, .Type = SAHPI_OPERATIONAL, .Category = SAHPI_EC_AVAILABILITY, .EnableCtrl = SAHPI_FALSE, .EventCtrl = SAHPI_SEC_READ_ONLY, .Events = SAHPI_ES_RUNNING | SAHPI_ES_OFF_LINE, .DataFormat = { .IsSupported = SAHPI_TRUE, .ReadingType = SAHPI_SENSOR_READING_TYPE_INT64, .BaseUnits = SAHPI_SU_UNSPECIFIED, .ModifierUnits = SAHPI_SU_UNSPECIFIED, .ModifierUse = SAHPI_SMUU_NONE, .Percentage = SAHPI_FALSE, .Range = { .Flags = SAHPI_SRF_MAX | SAHPI_SRF_MIN, .Max = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_INT64, .Value = { .SensorInt64 = 3, }, }, .Min = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_INT64, .Value = { .SensorInt64 = 0, }, }, }, }, .ThresholdDefn = { .IsAccessible = SAHPI_FALSE, }, .Oem = 0, }, .sensor_info = { .mib = { .not_avail_indicator_num = 0, .write_only = SAHPI_FALSE, /* fanPackState */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.6.1.1.3.x", .loc_offset = 0, }, .cur_state = SAHPI_ES_RUNNING, .cur_child_rid = SAHPI_UNSPECIFIED_RESOURCE_ID, .sensor_enabled = SAHPI_TRUE, .events_enabled = SAHPI_TRUE, .assert_mask = SAHPI_ES_OFF_LINE, .deassert_mask = SAHPI_ES_OFF_LINE, .event_array = { { .event = "0003680x", /* EN_FAN_PACKx_SPEED */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_OFF_LINE, .recovery_state = SAHPI_ES_RUNNING, }, { .event = "000A7001", /* EN_FAN_PACK1_NOT_PRESENT */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_OFF_LINE, .recovery_state = SAHPI_ES_RUNNING, }, {}, }, .reading2event = { /* 0 = unknown */ { .num = 1, .rangemap = { .Flags = SAHPI_SRF_MIN, .Min = { .Value = { .SensorInt64 = 1, }, }, }, .state = SAHPI_ES_UNSPECIFIED, }, /* 1 = good */ { .num = 2, .rangemap = { .Flags = SAHPI_SRF_NOMINAL, .Nominal = { .Value = { .SensorInt64 = 1, }, }, }, .state = SAHPI_ES_RUNNING, }, /* 2 = warning */ { .num = 3, .rangemap = { .Flags = SAHPI_SRF_NOMINAL, .Nominal = { .Value = { .SensorInt64 = 2, }, }, }, .state = SAHPI_ES_DEGRADED, }, /* 3 = bad */ { .num = 4, .rangemap = { .Flags = SAHPI_SRF_NOMINAL, .Nominal = { .Value = { .SensorInt64 = 3, }, }, }, .state = SAHPI_ES_OFF_LINE, }, }, }, .comment = "Power Module Fan Pack Operational Status Sensor", }, /* Power Module Fan Pack Average Speed (Percent of Max) Sensor */ { .index = 2, .sensor = { .Num = SNMP_BC_LAST_COMMON_POWER_MODULE_SENSOR + 2, .Type = SAHPI_FAN, .Category = SAHPI_EC_THRESHOLD, .EnableCtrl = SAHPI_FALSE, .EventCtrl = SAHPI_SEC_READ_ONLY, .Events = SAHPI_ES_UPPER_MAJOR, .DataFormat = { .IsSupported = SAHPI_TRUE, .ReadingType = SAHPI_SENSOR_READING_TYPE_FLOAT64, .BaseUnits = SAHPI_SU_RPM, .ModifierUnits = SAHPI_SU_UNSPECIFIED, .ModifierUse = SAHPI_SMUU_NONE, .Percentage = SAHPI_TRUE, .Range = { .Flags = SAHPI_SRF_MAX | SAHPI_SRF_MIN, .Max = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, .Value = { .SensorFloat64 = 100, }, }, .Min = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, .Value = { .SensorFloat64 = 0, }, }, }, }, .ThresholdDefn = { .IsAccessible = SAHPI_FALSE, .ReadThold = 0, .WriteThold = 0, }, .Oem = 0, }, .sensor_info = { .mib = { .not_avail_indicator_num = 0, .write_only = SAHPI_FALSE, /* fanPackAverageSpeed */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.6.1.1.5.x", .loc_offset = 0, }, .cur_state = SAHPI_ES_UNSPECIFIED, .cur_child_rid = SAHPI_UNSPECIFIED_RESOURCE_ID, .sensor_enabled = SAHPI_TRUE, .events_enabled = SAHPI_TRUE, .assert_mask = SAHPI_ES_UPPER_MAJOR, .deassert_mask = SAHPI_ES_UPPER_MAJOR, .event_array = { { .event = "000B600x", /* EN_FAN_PACKx_PFA */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_UPPER_MAJOR, .recovery_state = SAHPI_ES_UNSPECIFIED, }, {}, }, .reading2event = {}, }, .comment = "Power Module Fan Pack Average Speed (Percent of Max) Sensor", }, /* Power Module Fan Pack Average RPM Speed Sensor */ { .index = 3, .sensor = { .Num = SNMP_BC_LAST_COMMON_POWER_MODULE_SENSOR + 3, .Type = SAHPI_FAN, .Category = SAHPI_EC_UNSPECIFIED, .EnableCtrl = SAHPI_FALSE, .EventCtrl = SAHPI_SEC_READ_ONLY, .Events = 0x00, .DataFormat = { .IsSupported = SAHPI_TRUE, .ReadingType = SAHPI_SENSOR_READING_TYPE_FLOAT64, .BaseUnits = SAHPI_SU_RPM, .ModifierUnits = SAHPI_SU_UNSPECIFIED, .ModifierUse = SAHPI_SMUU_NONE, .Percentage = SAHPI_FALSE, .Range = { .Flags = SAHPI_SRF_MAX | SAHPI_SRF_MIN, .Max = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, .Value = { .SensorFloat64 = 13000, }, }, .Min = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, .Value = { .SensorFloat64 = 0, }, }, }, }, .ThresholdDefn = { .IsAccessible = SAHPI_FALSE, }, .Oem = 0, }, .sensor_info = { .mib = { .not_avail_indicator_num = 0, .write_only = SAHPI_FALSE, /* fanPackAverageSpeedRPM */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.6.1.1.6.x", .loc_offset = 0, }, .cur_state = SAHPI_ES_UNSPECIFIED, .cur_child_rid = SAHPI_UNSPECIFIED_RESOURCE_ID, .sensor_enabled = SAHPI_TRUE, .events_enabled = SAHPI_TRUE, .assert_mask = 0x00, .deassert_mask = 0x00, .event_array = { {}, }, .reading2event = {}, }, .comment = "Power Module Fan Pack Average RPM Speed Sensor", }, {} /* Terminate array with a null element */ }; /******************** * I/O Module Sensors ********************/ struct snmp_bc_sensor snmp_bc_switch_sensors[] = { /* I/O Module Operational Status Sensor */ { .index = 1, .sensor = { .Num = 1, .Type = SAHPI_OPERATIONAL, .Category = SAHPI_EC_AVAILABILITY, .EnableCtrl = SAHPI_FALSE, .EventCtrl = SAHPI_SEC_READ_ONLY, .Events = SAHPI_ES_RUNNING | SAHPI_ES_OFF_LINE | SAHPI_ES_DEGRADED | SAHPI_ES_INSTALL_ERROR, .DataFormat = { .IsSupported = SAHPI_TRUE, .ReadingType = SAHPI_SENSOR_READING_TYPE_INT64, .BaseUnits = SAHPI_SU_UNSPECIFIED, .ModifierUnits = SAHPI_SU_UNSPECIFIED, .ModifierUse = SAHPI_SMUU_NONE, .Percentage = SAHPI_FALSE, .Range = { .Flags = SAHPI_SRF_MAX | SAHPI_SRF_MIN, .Max = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_INT64, .Value = { .SensorInt64 = 3, }, }, .Min = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_INT64, .Value = { .SensorInt64 = 0, }, }, }, }, .ThresholdDefn = { .IsAccessible = SAHPI_FALSE, }, .Oem = 0, }, .sensor_info = { .mib = { .not_avail_indicator_num = 0, .write_only = SAHPI_FALSE, /* smHealthState */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.3.1.1.1.15.x", .loc_offset = 0, }, .cur_state = SAHPI_ES_RUNNING, .cur_child_rid = SAHPI_UNSPECIFIED_RESOURCE_ID, .sensor_enabled = SAHPI_TRUE, .events_enabled = SAHPI_TRUE, .assert_mask = SAHPI_ES_DEGRADED | SAHPI_ES_OFF_LINE | SAHPI_ES_INSTALL_ERROR, .deassert_mask = SAHPI_ES_DEGRADED | SAHPI_ES_OFF_LINE | SAHPI_ES_INSTALL_ERROR, .event_array = { { .event = "0EA0000x", /* EN_FAULT_SWITCH_x */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_OFF_LINE, .recovery_state = SAHPI_ES_RUNNING, }, { .event = "0E00B00x", /* EN_SWITCH_x_INSUFFICIENT_PWR */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_OFF_LINE, .recovery_state = SAHPI_ES_RUNNING, }, { .event = "0EA0C00x", /* EN_SWITCH_x_CFG_ERROR */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_INSTALL_ERROR, .recovery_state = SAHPI_ES_RUNNING, }, { .event = "0EA0E00x", /* EN_SWITCH_x_POST_ERROR */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_INSTALL_ERROR, .recovery_state = SAHPI_ES_RUNNING, }, { .event = "0EA0D00x", /* EN_SWITCH_x_POST_TIMEOUT */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_INSTALL_ERROR, .recovery_state = SAHPI_ES_RUNNING, }, { .event = "0EA1A40x", /* EN_OVER_CURRENT_SWITCH_x */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_DEGRADED, .recovery_state = SAHPI_ES_RUNNING, }, {}, }, .reading2event = { /* 0 = unknown */ { .num = 1, .rangemap = { .Flags = SAHPI_SRF_MIN, .Min = { .Value = { .SensorInt64 = 1, }, }, }, .state = SAHPI_ES_UNSPECIFIED, }, /* 1 = good */ { .num = 2, .rangemap = { .Flags = SAHPI_SRF_NOMINAL, .Nominal = { .Value = { .SensorInt64 = 1, }, }, }, .state = SAHPI_ES_RUNNING, }, /* 2 = warning */ { .num = 3, .rangemap = { .Flags = SAHPI_SRF_NOMINAL, .Nominal = { .Value = { .SensorInt64 = 2, }, }, }, .state = SAHPI_ES_DEGRADED, }, /* 3 = bad */ { .num = 4, .rangemap = { .Flags = SAHPI_SRF_NOMINAL, .Nominal = { .Value = { .SensorInt64 = 3, }, }, }, .state = SAHPI_ES_OFF_LINE, }, }, }, .comment = "I/O Module Operational Status Sensor", }, /* I/O Module Temperature Sensor - event-only */ { .index = 2, .sensor = { .Num = 2, .Type = SAHPI_TEMPERATURE, .Category = SAHPI_EC_THRESHOLD, .EnableCtrl = SAHPI_FALSE, .EventCtrl = SAHPI_SEC_READ_ONLY, .Events = SAHPI_ES_UPPER_MAJOR | SAHPI_ES_UPPER_CRIT, .DataFormat = { .IsSupported = SAHPI_FALSE, }, .ThresholdDefn = { .IsAccessible = SAHPI_FALSE, .ReadThold = 0, .WriteThold = 0, }, .Oem = 0, }, .sensor_info = { .cur_state = SAHPI_ES_UNSPECIFIED, .cur_child_rid = SAHPI_UNSPECIFIED_RESOURCE_ID, .sensor_enabled = SAHPI_TRUE, .events_enabled = SAHPI_TRUE, .assert_mask = SAHPI_ES_UPPER_MAJOR | SAHPI_ES_UPPER_CRIT, .deassert_mask = SAHPI_ES_UPPER_MAJOR | SAHPI_ES_UPPER_CRIT, .event_array = { { .event = "0EA1C40x", /* EN_OVER_TEMP_SWITCH_x */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_UPPER_CRIT, .recovery_state = SAHPI_ES_UPPER_MAJOR, }, { .event = "0EA1D40x", /* EN_OVER_TEMP_WARN_SWITCH_x */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_UPPER_MAJOR, .recovery_state = SAHPI_ES_UNSPECIFIED, }, {}, }, .reading2event = {}, }, .comment = "I/O Module Temperature Sensor", }, /* I/O Module Management Bus Operational Status Sensor - event only */ { .index = 3, .sensor = { .Num = 3, .Type = SAHPI_OPERATIONAL, .Category = SAHPI_EC_AVAILABILITY, .EnableCtrl = SAHPI_FALSE, .EventCtrl = SAHPI_SEC_READ_ONLY, .Events = SAHPI_ES_RUNNING | SAHPI_ES_OFF_LINE, .DataFormat = { .IsSupported = SAHPI_FALSE, }, .ThresholdDefn = { .IsAccessible = SAHPI_FALSE, }, .Oem = 0, }, .sensor_info = { .cur_state = SAHPI_ES_RUNNING, .cur_child_rid = SAHPI_UNSPECIFIED_RESOURCE_ID, .sensor_enabled = SAHPI_TRUE, .events_enabled = SAHPI_TRUE, .assert_mask = SAHPI_ES_OFF_LINE, .deassert_mask = SAHPI_ES_OFF_LINE, .event_array = { { .event = "0EA2200x", /* EN_STCONN_FAIL_SWITCH_x */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_OFF_LINE, .recovery_state = SAHPI_ES_RUNNING, }, {}, }, .reading2event = {}, }, .comment = "I/O Module Management Bus 0perations Sensor", }, {} /* Terminate array with a null element */ }; /*********************************** * BladeCenter Physical Slot Sensors ***********************************/ struct snmp_bc_sensor snmp_bc_slot_sensors[] = { /* Slot State Sensor */ { .index = 1, .sensor = { .Num = BLADECENTER_SENSOR_NUM_SLOT_STATE, .Type = SAHPI_ENTITY_PRESENCE, .Category = SAHPI_EC_PRESENCE, .EnableCtrl = SAHPI_FALSE, .EventCtrl = SAHPI_SEC_READ_ONLY, .Events = SAHPI_ES_PRESENT | SAHPI_ES_ABSENT, .DataFormat = { .IsSupported = SAHPI_TRUE, .ReadingType = SAHPI_SENSOR_READING_TYPE_UINT64, .BaseUnits = SAHPI_SU_UNSPECIFIED, .ModifierUnits = SAHPI_SU_UNSPECIFIED, .ModifierUse = SAHPI_SMUU_NONE, .Percentage = SAHPI_FALSE, .Range = { .Flags = 0x00, } }, .ThresholdDefn = { .IsAccessible = SAHPI_FALSE, }, .Oem = 0, }, .sensor_info = { .mib = { .not_avail_indicator_num = 0, .write_only = SAHPI_FALSE, /* Dummy OID to bypass test */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.10.2.1.1.8.1", .loc_offset = 0, }, .cur_state = SAHPI_ES_ABSENT, .cur_child_rid = SAHPI_UNSPECIFIED_RESOURCE_ID, .sensor_enabled = SAHPI_TRUE, .events_enabled = SAHPI_FALSE, .assert_mask = 0, .deassert_mask = 0, .event_array = { {}, }, .reading2event = {}, }, .comment = "Slot State Sensor", }, /* Slot Maximum Power Capability Sensor */ { .index = 2, .sensor = { .Num = BLADECENTER_SENSOR_NUM_MAX_POWER, .Type = SAHPI_OTHER_UNITS_BASED_SENSOR, .Category = SAHPI_EC_THRESHOLD, .EnableCtrl = SAHPI_FALSE, .EventCtrl = SAHPI_SEC_READ_ONLY, .Events = 0x00, /* No event state */ .DataFormat = { .IsSupported = SAHPI_TRUE, .ReadingType = SAHPI_SENSOR_READING_TYPE_UINT64, .BaseUnits = SAHPI_SU_WATTS, .ModifierUnits = SAHPI_SU_UNSPECIFIED, .ModifierUse = SAHPI_SMUU_NONE, .Percentage = SAHPI_FALSE, .Range = { .Flags = 0x00, }, }, .ThresholdDefn = { .IsAccessible = SAHPI_FALSE, }, .Oem = 0, }, .sensor_info = { .mib = { .not_avail_indicator_num = 0, .write_only = SAHPI_FALSE, /* pd1ModuleAllocatedPowerMax */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.10.2.1.1.8.1", .loc_offset = 0, .threshold_oids = {}, .threshold_write_oids = {}, }, .cur_state = SAHPI_ES_UNSPECIFIED, .cur_child_rid = SAHPI_UNSPECIFIED_RESOURCE_ID, .sensor_enabled = SAHPI_TRUE, .events_enabled = SAHPI_FALSE, .assert_mask = 0x00, .deassert_mask = 0x00, .event_array = { {}, }, .reading2event = {}, }, .comment = "Slot Maximum Power Capability Sensor", }, /* Slot Assigned Power Sensor */ { .index = 3, .sensor = { .Num = BLADECENTER_SENSOR_NUM_ASSIGNED_POWER, .Type = SAHPI_OTHER_UNITS_BASED_SENSOR, .Category = SAHPI_EC_THRESHOLD, .EnableCtrl = SAHPI_FALSE, .EventCtrl = SAHPI_SEC_READ_ONLY, .Events = 0, .DataFormat = { .IsSupported = SAHPI_TRUE, .ReadingType = SAHPI_SENSOR_READING_TYPE_UINT64, .BaseUnits = SAHPI_SU_WATTS, .ModifierUnits = SAHPI_SU_UNSPECIFIED, .ModifierUse = SAHPI_SMUU_NONE, .Percentage = SAHPI_FALSE, .Range = { .Flags = 0x00, }, }, .ThresholdDefn = { .IsAccessible = SAHPI_FALSE, .ReadThold = 0, .WriteThold = 0, }, .Oem = 0, }, .sensor_info = { .mib = { .not_avail_indicator_num = 0, .write_only = SAHPI_FALSE, /* pd1ModuleAllocatedPowerCurrent */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.10.2.1.1.7.1", .loc_offset = 0, .threshold_oids = {}, .threshold_write_oids = {}, }, .cur_state = SAHPI_ES_UNSPECIFIED, .cur_child_rid = SAHPI_UNSPECIFIED_RESOURCE_ID, .sensor_enabled = SAHPI_TRUE, .events_enabled = SAHPI_FALSE, .assert_mask = 0x00, .deassert_mask = 0x00, .event_array = { {}, }, .reading2event = {}, }, .comment = "Slot Assigned Power Sensor", }, /* Slot Minumum Power Capability Sensor */ { .index = 4, .sensor = { .Num = BLADECENTER_SENSOR_NUM_MIN_POWER, .Type = SAHPI_OTHER_UNITS_BASED_SENSOR, .Category = SAHPI_EC_THRESHOLD, .EnableCtrl = SAHPI_FALSE, .EventCtrl = SAHPI_SEC_READ_ONLY, .Events = 0, .DataFormat = { .IsSupported = SAHPI_TRUE, .ReadingType = SAHPI_SENSOR_READING_TYPE_UINT64, .BaseUnits = SAHPI_SU_WATTS, .ModifierUnits = SAHPI_SU_UNSPECIFIED, .ModifierUse = SAHPI_SMUU_NONE, .Percentage = SAHPI_FALSE, .Range = {}, }, .ThresholdDefn = { .IsAccessible = SAHPI_FALSE, .ReadThold = 0, .WriteThold = 0, }, .Oem = 0, }, .sensor_info = { .mib = { .not_avail_indicator_num = 0, .write_only = SAHPI_FALSE, /* pd1ModuleAllocatedPowerMin */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.10.2.1.1.9.1", .loc_offset = 0, .threshold_oids = {}, .threshold_write_oids = {}, }, .cur_state = SAHPI_ES_UNSPECIFIED, .cur_child_rid = SAHPI_UNSPECIFIED_RESOURCE_ID, .sensor_enabled = SAHPI_TRUE, .events_enabled = SAHPI_FALSE, .assert_mask = 0, .deassert_mask = 0, .event_array = { {}, }, .reading2event = {}, }, .comment = "Slot Minumum Power Capability Sensor", }, {} /* Terminate array with a null element */ }; /********************* * Alarm Panel Sensors *********************/ struct snmp_bc_sensor snmp_bc_alarm_sensors[] = { /* Alarm Panel Operational Status Sensor */ { .index = 1, .sensor = { .Num = 1, .Type = SAHPI_OPERATIONAL, .Category = SAHPI_EC_AVAILABILITY, .EnableCtrl = SAHPI_FALSE, .EventCtrl = SAHPI_SEC_READ_ONLY, .Events = SAHPI_ES_RUNNING | SAHPI_ES_OFF_LINE, .DataFormat = { .IsSupported = SAHPI_TRUE, .ReadingType = SAHPI_SENSOR_READING_TYPE_INT64, .BaseUnits = SAHPI_SU_UNSPECIFIED, .ModifierUnits = SAHPI_SU_UNSPECIFIED, .ModifierUse = SAHPI_SMUU_NONE, .Percentage = SAHPI_FALSE, .Range = { .Flags = SAHPI_SRF_MAX | SAHPI_SRF_MIN, .Max = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_INT64, .Value = { .SensorInt64 = 1, }, }, .Min = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_INT64, .Value = { .SensorInt64 = 0, }, }, }, }, .ThresholdDefn = { .IsAccessible = SAHPI_FALSE, }, .Oem = 0, }, .sensor_info = { .mib = { .not_avail_indicator_num = 0, .write_only = SAHPI_FALSE, /* tapFaultLED */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.8.8.5.0", .loc_offset = 0, }, .cur_state = SAHPI_ES_RUNNING, .cur_child_rid = SAHPI_UNSPECIFIED_RESOURCE_ID, .sensor_enabled = SAHPI_TRUE, .events_enabled = SAHPI_TRUE, .assert_mask = SAHPI_ES_OFF_LINE, .deassert_mask = SAHPI_ES_OFF_LINE, .event_array = { { .event = "6F60A101", /* EN_AP_HW_FAILURE */ .event_assertion = SAHPI_TRUE, .event_state = SAHPI_ES_OFF_LINE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .recovery_state = SAHPI_ES_RUNNING, }, {}, }, .reading2event = { /* 0 = Fault LED is off - ok */ { .num = 1, .rangemap = { .Flags = SAHPI_SRF_NOMINAL, .Min = { .Value = { .SensorInt64 = 0, }, }, }, .state = SAHPI_ES_RUNNING, }, /* 1 = Fault LED is on - fault */ { .num = 2, .rangemap = { .Flags = SAHPI_SRF_NOMINAL, .Nominal = { .Value = { .SensorInt64 = 1, }, }, }, .state = SAHPI_ES_OFF_LINE, }, }, }, .comment = "Alarm Panel Operational Status Sensor", }, {} /* Terminate array with a null element */ }; /******************************************** * Multiplexer Expansion Module (Mux) Sensors ********************************************/ struct snmp_bc_sensor snmp_bc_mux_sensors[] = { { .index = 1, .sensor = { .Num = 1, .Type = SAHPI_OPERATIONAL, .Category = SAHPI_EC_AVAILABILITY, .EnableCtrl = SAHPI_FALSE, .EventCtrl = SAHPI_SEC_READ_ONLY, .Events = SAHPI_ES_RUNNING | SAHPI_ES_OFF_LINE, .DataFormat = { .IsSupported = SAHPI_TRUE, .ReadingType = SAHPI_SENSOR_READING_TYPE_INT64, .BaseUnits = SAHPI_SU_UNSPECIFIED, .ModifierUnits = SAHPI_SU_UNSPECIFIED, .ModifierUse = SAHPI_SMUU_NONE, .Percentage = SAHPI_FALSE, .Range = { .Flags = SAHPI_SRF_MAX | SAHPI_SRF_MIN, .Max = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_INT64, .Value = { .SensorInt64 = 1, }, }, .Min = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_INT64, .Value = { .SensorInt64 = 0, }, }, }, }, .ThresholdDefn = { .IsAccessible = SAHPI_FALSE, }, .Oem = 0, }, .sensor_info = { .mib = { .not_avail_indicator_num = 0, .write_only = SAHPI_FALSE, /* ledMuxFault */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.8.10.1.1.5.x", .loc_offset = 0, }, .cur_state = SAHPI_ES_RUNNING, .cur_child_rid = SAHPI_UNSPECIFIED_RESOURCE_ID, .sensor_enabled = SAHPI_TRUE, .events_enabled = SAHPI_TRUE, .assert_mask = SAHPI_ES_OFF_LINE, .deassert_mask = SAHPI_ES_OFF_LINE, .event_array = { { .event = "6F60D00x", /* EN_MX_1_HW_FAILURE */ .event_assertion = SAHPI_TRUE, .event_state = SAHPI_ES_OFF_LINE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .recovery_state = SAHPI_ES_RUNNING, }, {}, }, .reading2event = { /* 0 = Fault LED is off - ok */ { .num = 1, .rangemap = { .Flags = SAHPI_SRF_NOMINAL, .Min = { .Value = { .SensorInt64 = 0, }, }, }, .state = SAHPI_ES_RUNNING, }, /* 1 = Fault LED is on - fault */ { .num = 2, .rangemap = { .Flags = SAHPI_SRF_NOMINAL, .Nominal = { .Value = { .SensorInt64 = 1, }, }, }, .state = SAHPI_ES_OFF_LINE, }, }, }, .comment = "Mux Module Operational Status Sensor", }, {} /* Terminate array with a null element */ }; /****************************** * Network Clock Module Sensors ******************************/ struct snmp_bc_sensor snmp_bc_clock_sensors[] = { { .index = 1, .sensor = { .Num = 1, .Type = SAHPI_OPERATIONAL, .Category = SAHPI_EC_AVAILABILITY, .EnableCtrl = SAHPI_FALSE, .EventCtrl = SAHPI_SEC_READ_ONLY, .Events = SAHPI_ES_RUNNING | SAHPI_ES_OFF_LINE, .DataFormat = { .IsSupported = SAHPI_TRUE, .ReadingType = SAHPI_SENSOR_READING_TYPE_INT64, .BaseUnits = SAHPI_SU_UNSPECIFIED, .ModifierUnits = SAHPI_SU_UNSPECIFIED, .ModifierUse = SAHPI_SMUU_NONE, .Percentage = SAHPI_FALSE, .Range = { .Flags = SAHPI_SRF_MAX | SAHPI_SRF_MIN, .Max = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_INT64, .Value = { .SensorInt64 = 1, }, }, .Min = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_INT64, .Value = { .SensorInt64 = 0, }, }, }, }, .ThresholdDefn = { .IsAccessible = SAHPI_FALSE, }, .Oem = 0, }, .sensor_info = { .mib = { .not_avail_indicator_num = 0, .write_only = SAHPI_FALSE, /* ledNetworkClockFault */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.8.9.1.1.5.x", .loc_offset = 0, }, .cur_state = SAHPI_ES_RUNNING, .cur_child_rid = SAHPI_UNSPECIFIED_RESOURCE_ID, .sensor_enabled = SAHPI_TRUE, .events_enabled = SAHPI_TRUE, .assert_mask = SAHPI_ES_OFF_LINE, .deassert_mask = SAHPI_ES_OFF_LINE, .event_array = { { .event = "6F60710x", /* EN_NC_x_HW_FAILURE */ .event_assertion = SAHPI_TRUE, .event_state = SAHPI_ES_OFF_LINE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .recovery_state = SAHPI_ES_RUNNING, }, {}, }, .reading2event = { /* 0 = Fault LED is off - ok */ { .num = 1, .rangemap = { .Flags = SAHPI_SRF_NOMINAL, .Min = { .Value = { .SensorInt64 = 0, }, }, }, .state = SAHPI_ES_RUNNING, }, /* 1 = Fault LED is on - fault */ { .num = 2, .rangemap = { .Flags = SAHPI_SRF_NOMINAL, .Nominal = { .Value = { .SensorInt64 = 1, }, }, }, .state = SAHPI_ES_OFF_LINE, }, }, }, .comment = "Alarm Panel Operational Status Sensor", }, {} /* Terminate array with a null element */ }; /**************************** * Front Bezel Filter Sensors ****************************/ struct snmp_bc_sensor snmp_bc_filter_sensors[] = { /* Front Bezel Filter Sensor - event only */ { .index = 1, .sensor = { .Num = 1, .Type = SAHPI_TEMPERATURE, .Category = SAHPI_EC_SEVERITY, .EnableCtrl = SAHPI_FALSE, .EventCtrl = SAHPI_SEC_READ_ONLY, .Events = SAHPI_ES_OK | SAHPI_ES_MINOR_FROM_OK | SAHPI_ES_INFORMATIONAL | SAHPI_ES_MAJOR_FROM_LESS | SAHPI_ES_CRITICAL, .DataFormat = { .IsSupported = SAHPI_FALSE, }, .ThresholdDefn = { .IsAccessible = SAHPI_FALSE, }, .Oem = 0, }, .sensor_info = { .cur_state = SAHPI_ES_OK, .cur_child_rid = SAHPI_UNSPECIFIED_RESOURCE_ID, .sensor_enabled = SAHPI_TRUE, .events_enabled = SAHPI_TRUE, .assert_mask = SAHPI_ES_OK | SAHPI_ES_MINOR_FROM_OK | SAHPI_ES_INFORMATIONAL | SAHPI_ES_MAJOR_FROM_LESS | SAHPI_ES_CRITICAL, .deassert_mask = SAHPI_ES_OK | SAHPI_ES_MINOR_FROM_OK | SAHPI_ES_INFORMATIONAL | SAHPI_ES_MAJOR_FROM_LESS | SAHPI_ES_CRITICAL, .event_array = { { .event = "6F100000", /* EN_FAULT_CRT_FILTER */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_CRITICAL, .recovery_state = SAHPI_ES_MAJOR_FROM_LESS, }, { .event = "6F200000", /* EN_FAULT_MJR_FILTER */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_MAJOR_FROM_LESS, .recovery_state = SAHPI_ES_MINOR_FROM_OK, }, { .event = "6F300000", /* EN_FAULT_MNR_FILTER */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_MINOR_FROM_OK, .recovery_state = SAHPI_ES_OK, }, { .event = "6F500000", /* EN_FAULT_MNR_FILTER_SERVICE */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_INFORMATIONAL, .recovery_state = SAHPI_ES_OK, }, }, .reading2event = {}, }, .comment = "Front Bezel Filter Sensor", }, {} /* Terminate array with a null element */ }; /************************************************************************* * Control Definitions *************************************************************************/ /************************************************************************* * WARNING - WARNING - WARNING - WARNING * Most of the .control.num are assigned sequentially. * There is 1 hardcoded control number: * BLADECENTER_CTRL_NUM_MGMNT_FAILOVER *************************************************************************/ /****************** * Chassis Controls ******************/ struct snmp_bc_control snmp_bc_chassis_controls_bc[] = { /* Chassis Location LED */ /* 0 is Off; 1 is solid on; 2 is blinking */ { .index = 1, .control = { .Num = 1, .OutputType = SAHPI_CTRL_LED, .Type = SAHPI_CTRL_TYPE_DISCRETE, .TypeUnion.Discrete.Default = 0, .DefaultMode = { .Mode = SAHPI_CTRL_MODE_MANUAL, .ReadOnly = SAHPI_TRUE, }, .WriteOnly = SAHPI_FALSE, .Oem = 0, }, .control_info = { .mib = { .not_avail_indicator_num = 3, .write_only = SAHPI_FALSE, /* identityLED */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.8.1.4.0", .loc_offset = 0, }, .cur_mode = SAHPI_CTRL_MODE_MANUAL, }, .comment = "Chassis Location LED", }, {} /* Terminate array with a null element */ }; struct snmp_bc_control snmp_bc_chassis_controls_bct[] = { /* Chassis Location LED */ /* 0 is Off; 1 is solid on; 2 is blinking */ { .index = 1, .control = { .Num = 1, .OutputType = SAHPI_CTRL_LED, .Type = SAHPI_CTRL_TYPE_DISCRETE, .TypeUnion.Discrete.Default = 0, .DefaultMode = { .Mode = SAHPI_CTRL_MODE_MANUAL, .ReadOnly = SAHPI_TRUE, }, .WriteOnly = SAHPI_FALSE, .Oem = 0, }, .control_info = { .mib = { .not_avail_indicator_num = 3, .write_only = SAHPI_FALSE, /* telcoIdentityLED */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.8.3.4.0", .loc_offset = 0, }, .cur_mode = SAHPI_CTRL_MODE_MANUAL, }, .comment = "Chassis Location LED", }, {} /* Terminate array with a null element */ }; /**************** * Blade Controls ****************/ struct snmp_bc_control snmp_bc_blade_controls[] = { /* Blade Location LED */ /* 0 is Off; 1 is solid on; 2 is blinking */ { .index = 1, .control = { .Num = 1, .OutputType = SAHPI_CTRL_LED, .Type = SAHPI_CTRL_TYPE_DISCRETE, .TypeUnion.Discrete.Default = 0, .DefaultMode = { .Mode = SAHPI_CTRL_MODE_MANUAL, .ReadOnly = SAHPI_TRUE, }, .WriteOnly = SAHPI_FALSE, .Oem = 0, }, .control_info = { .mib = { .not_avail_indicator_num = 0, .write_only = SAHPI_FALSE, /* ledBladeIdentity */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.8.2.1.1.11.x", .loc_offset = 0, }, .cur_mode = SAHPI_CTRL_MODE_MANUAL, }, .comment = "Blade Location LED", }, /* Blade BMC Reset */ /* 1 = reset */ { .index = 2, .control = { .Num = 2, .OutputType = SAHPI_CTRL_GENERIC, .Type = SAHPI_CTRL_TYPE_DISCRETE, .TypeUnion.Discrete.Default = 1, .DefaultMode = { .Mode = SAHPI_CTRL_MODE_MANUAL, .ReadOnly = SAHPI_TRUE, }, .WriteOnly = SAHPI_TRUE, .Oem = 0, }, .control_info = { .mib = { .not_avail_indicator_num = 0, .write_only = SAHPI_FALSE, /*restartBladeSMP */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.6.1.1.9.x", .loc_offset = 0, }, .cur_mode = SAHPI_CTRL_MODE_MANUAL, }, .comment = "Blade BMC Reset", }, {} /* Terminate array with a null element */ }; /*************************************** * Blade Expansion Module (BEM) Controls ***************************************/ struct snmp_bc_control snmp_bc_bem_controls[] = { {} /* Terminate array with a null element */ }; /************************************ * Virtual Management Module Controls ************************************/ struct snmp_bc_control snmp_bc_virtual_mgmnt_controls[] = { /* MM Failover Control */ { .index = 1, .control = { .Num = BLADECENTER_CTRL_NUM_MGMNT_FAILOVER, .OutputType = SAHPI_CTRL_GENERIC, .Type = SAHPI_CTRL_TYPE_DIGITAL, .TypeUnion.Digital.Default = SAHPI_CTRL_STATE_OFF, .DefaultMode = { .Mode = SAHPI_CTRL_MODE_MANUAL, .ReadOnly = SAHPI_TRUE, }, .WriteOnly = SAHPI_FALSE, .Oem = 0, }, .control_info = { .mib = { .not_avail_indicator_num = 0, .write_only = SAHPI_FALSE, /* switchOverRedundantMM */ .oid = ".1.3.6.1.4.1.2.3.51.2.7.7.0", .loc_offset = 0, /* Read values */ .digitalmap[0] = -1, /* Always return SAHPI_CTRL_STATE_OFF */ .digitalmap[1] = -1, /* Always return SAHPI_CTRL_STATE_OFF */ .digitalmap[2] = -1, /* Always return SAHPI_CTRL_STATE_OFF */ .digitalmap[3] = -1, /* Always return SAHPI_CTRL_STATE_OFF */ /* Write values */ .digitalwmap[0] = -1, /* SAHPI_CTRL_STATE_OFF - Invalid */ .digitalwmap[1] = -1, /* SAHPI_CTRL_STATE_ON - Invalid */ .digitalwmap[2] = -1, /* SAHPI_CTRL_STATE_PULSE_OF - Invalid */ .digitalwmap[3] = 1, /* SAHPI_CTRL_STATE_PULSE_ON */ /* Constant read state */ .isDigitalReadStateConstant = SAHPI_TRUE, .DigitalStateConstantValue = SAHPI_CTRL_STATE_OFF, }, .cur_mode = SAHPI_CTRL_MODE_MANUAL, }, .comment = "MM Failover Control", }, {} /* Terminate array with a null element */ }; /**************************** * Management Module Controls ****************************/ struct snmp_bc_control snmp_bc_mgmnt_controls[] = { {} /* Terminate array with a null element */ }; /********************* * Media Tray Controls *********************/ struct snmp_bc_control snmp_bc_mediatray_controls[] = { {} /* Terminate array with a null element */ }; struct snmp_bc_control snmp_bc_mediatray2_controls[] = { {} /* Terminate array with a null element */ }; /***************** * Blower Controls *****************/ struct snmp_bc_control snmp_bc_blower_controls[] = { {} /* Terminate array with a null element */ }; /**************** * Power Controls ****************/ struct snmp_bc_control snmp_bc_power_controls[] = { {} /* Terminate array with a null element */ }; /************************ * Switch Module Controls ************************/ struct snmp_bc_control snmp_bc_switch_controls[] = { {} /* Terminate array with a null element */ }; /************************ * Physical Slot Controls ************************/ struct snmp_bc_control snmp_bc_slot_controls[] = { {} /* Terminate array with a null element */ }; /******************* * BEM DASD Controls *******************/ struct snmp_bc_control snmp_bc_bem_dasd_controls[] = { {} /* Terminate array with a null element */ }; /********************** * Alarm Panel Controls **********************/ struct snmp_bc_control snmp_bc_alarm_controls[] = { {} /* Terminate array with a null element */ }; /*************************************** * Multiplexer Expansion Module Controls ***************************************/ struct snmp_bc_control snmp_bc_mux_controls[] = { {} /* Terminate array with a null element */ }; /******************************* * Network Clock Module Controls *******************************/ struct snmp_bc_control snmp_bc_clock_controls[] = { {} /* Terminate array with a null element */ }; /********************* * Air Filter Controls *********************/ struct snmp_bc_control snmp_bc_filter_controls[] = { {} /* Terminate array with a null element */ }; /************************************************************************* * Inventory Definitions *************************************************************************/ /************* * Chassis VPD *************/ struct snmp_bc_inventory snmp_bc_chassis_inventories[] = { { .inventory = { .IdrId = 1, .Oem = 0, }, .inventory_info = { .hardware_mib = { .not_avail_indicator_num = 0, .write_only = SAHPI_FALSE, .area_type = SAHPI_IDR_AREATYPE_CHASSIS_INFO, .oid = { /* bladeCenterVpdMachineModel */ .OidChassisType = ".1.3.6.1.4.1.2.3.51.2.2.21.1.1.2.0", .OidMfgDateTime = '\0', /* Set to SAHPI_TIME_UNSPECIFIED */ /* bladeCenterManufacturingId */ .OidManufacturer = ".1.3.6.1.4.1.2.3.51.2.2.21.1.1.5.0", /* bladeCenterVpdMachineType */ .OidProductName = ".1.3.6.1.4.1.2.3.51.2.2.21.1.1.1.0", /* bladeCenterHardwareRevision */ .OidProductVersion = ".1.3.6.1.4.1.2.3.51.2.2.21.1.1.6.0", /* bladeCenterSerialNumber */ .OidSerialNumber = ".1.3.6.1.4.1.2.3.51.2.2.21.1.1.3.0", /* bladeCenterFruNumber */ .OidPartNumber = ".1.3.6.1.4.1.2.3.51.2.2.21.1.1.7.0", .OidFileId = '\0', .OidAssetTag = '\0', } }, .firmware_mib = { .not_avail_indicator_num = 0, .write_only = SAHPI_FALSE, .area_type = SAHPI_IDR_AREATYPE_PRODUCT_INFO, .oid = { .OidChassisType = '\0', .OidMfgDateTime = '\0', /* Set to SAHPI_TIME_UNSPECIFIED */ .OidManufacturer = '\0', .OidProductName = '\0', .OidProductVersion = '\0', .OidSerialNumber = '\0', .OidPartNumber = '\0', .OidFileId = '\0', .OidAssetTag = '\0', } }, }, .comment = "Chassis VPD", }, {} /* Terminate array with a null element */ }; /************ * Blower VPD ************/ struct snmp_bc_inventory snmp_bc_blower_inventories[] = { { .inventory = { .IdrId = 6, .Oem = 0, }, .inventory_info = { .hardware_mib = { .not_avail_indicator_num = 0, .write_only = SAHPI_FALSE, .area_type = SAHPI_IDR_AREATYPE_BOARD_INFO, .oid = { .OidChassisType = '\0', .OidMfgDateTime = '\0', /* Set to SAHPI_TIME_UNSPECIFIED */ /* blowerHardwareVpdManufacturingId */ .OidManufacturer = ".1.3.6.1.4.1.2.3.51.2.2.21.13.1.1.3.x", /* blowerHardwareVpdMachineType */ .OidProductName = "\0", /* blowerHardwareVpdHardwareRevision */ .OidProductVersion = ".1.3.6.1.4.1.2.3.51.2.2.21.13.1.1.5.x", /* blowerHardwareVpdFruSerial */ .OidSerialNumber = ".1.3.6.1.4.1.2.3.51.2.2.21.13.1.1.11.x", /* blowerHardwareVpdFruNumber */ .OidPartNumber = ".1.3.6.1.4.1.2.3.51.2.2.21.13.1.1.4.x", .OidFileId = '\0', .OidAssetTag = '\0', } }, .firmware_mib = { .not_avail_indicator_num = 0, .write_only = SAHPI_FALSE, .area_type = SAHPI_IDR_AREATYPE_PRODUCT_INFO, .oid = { .OidChassisType = '\0', .OidMfgDateTime = '\0', /* Set to SAHPI_TIME_UNSPECIFIED */ .OidManufacturer = '\0', .OidProductName = '\0', .OidProductVersion = '\0', .OidSerialNumber = '\0', .OidPartNumber = '\0', .OidFileId = '\0', .OidAssetTag = '\0', } }, }, .comment = "Blower VPD", }, {} /* Terminate array with a null element */ }; /******************************* * Virtual Management Module VPD *******************************/ struct snmp_bc_inventory snmp_bc_virtual_mgmnt_inventories[] = { {} /* Terminate array with a null element */ }; /*********************** * Management Module VPD ***********************/ struct snmp_bc_inventory snmp_bc_mgmnt_inventories[] = { { .inventory = { .IdrId = 4, .Oem = 0, }, .inventory_info = { .hardware_mib = { .not_avail_indicator_num = 0, .write_only = SAHPI_FALSE, .area_type = SAHPI_IDR_AREATYPE_BOARD_INFO, .oid = { .OidChassisType = '\0', .OidMfgDateTime = '\0', /* Set to SAHPI_TIME_UNSPECIFIED */ /* mmHardwareVpdManufacturingId */ .OidManufacturer = ".1.3.6.1.4.1.2.3.51.2.2.21.2.1.1.3.x", .OidProductName = '\0', /* mmHardwareVpdHardwareRevision */ .OidProductVersion = ".1.3.6.1.4.1.2.3.51.2.2.21.2.1.1.5.x", .OidSerialNumber = '\0', /* mmHardwareVpdFruNumber */ .OidPartNumber = ".1.3.6.1.4.1.2.3.51.2.2.21.2.1.1.4.x", .OidFileId = '\0', .OidAssetTag = '\0', } }, .firmware_mib = { .not_avail_indicator_num = 0, .write_only = SAHPI_FALSE, .area_type = SAHPI_IDR_AREATYPE_PRODUCT_INFO, .oid = { .OidChassisType = '\0', /* mmMainApplVpdBuildDate */ .OidMfgDateTime = ".1.3.6.1.4.1.2.3.51.2.2.21.3.1.1.6.x", .OidManufacturer = '\0', .OidProductName = '\0', /* mmMainApplVpdBuildId */ .OidProductVersion = ".1.3.6.1.4.1.2.3.51.2.2.21.3.1.1.3.x", .OidSerialNumber = '\0', .OidPartNumber = '\0', /* mmMainApplVpdFilename */ .OidFileId = ".1.3.6.1.4.1.2.3.51.2.2.21.3.1.1.5.x", /* mmMainApplVpdName */ .OidAssetTag = ".1.3.6.1.4.1.2.3.51.2.2.21.3.1.1.2.x", } }, }, .comment = "MM VPD", }, {} /* Terminate array with a null element */ }; /**************** * I/O Module VPD ****************/ struct snmp_bc_inventory snmp_bc_switch_inventories[] = { { .inventory = { .IdrId = 5, .Oem = 0, }, .inventory_info = { .hardware_mib = { .not_avail_indicator_num = 0, .write_only = SAHPI_FALSE, .area_type = SAHPI_IDR_AREATYPE_BOARD_INFO, .oid = { .OidChassisType = '\0', .OidMfgDateTime = '\0', /* Set to SAHPI_TIME_UNSPECIFIED */ /* smHardwareVpdManufacturingId */ .OidManufacturer = ".1.3.6.1.4.1.2.3.51.2.2.21.6.1.1.3.x", .OidProductName = '\0', /* smHardwareVpdHardwareRevision */ .OidProductVersion = ".1.3.6.1.4.1.2.3.51.2.2.21.6.1.1.5.x", .OidSerialNumber = '\0', /* smHardwareVpdFruNumber */ .OidPartNumber = ".1.3.6.1.4.1.2.3.51.2.2.21.6.1.1.4.x", .OidFileId = '\0', .OidAssetTag = '\0', } }, .firmware_mib = { .not_avail_indicator_num = 0, .write_only = SAHPI_FALSE, .area_type = SAHPI_IDR_AREATYPE_PRODUCT_INFO, .oid = { .OidChassisType = '\0', /* smBootRomVpdBuildDate */ .OidMfgDateTime = ".1.3.6.1.4.1.2.3.51.2.2.21.7.2.1.6.x", .OidManufacturer = '\0', /* smMainApp1VpdBuildId */ .OidProductName = ".1.3.6.1.4.1.2.3.51.2.2.21.7.1.1.5.x", /* smMainApp1VpdRevisionNumber */ .OidProductVersion = ".1.3.6.1.4.1.2.3.51.2.2.21.7.1.1.7.x", .OidSerialNumber = '\0', .OidPartNumber = '\0', .OidFileId = '\0', .OidAssetTag = '\0', } }, }, .comment = "I/O Module VPD", }, {} /* Terminate array with a null element */ }; /*********** * Blade VPD ***********/ struct snmp_bc_inventory snmp_bc_blade_inventories[] = { { .inventory = { .IdrId = 6, .Oem = 0, }, .inventory_info = { .hardware_mib = { .not_avail_indicator_num = 0, .write_only = SAHPI_FALSE, .area_type = SAHPI_IDR_AREATYPE_BOARD_INFO, .oid = { .OidChassisType = '\0', .OidMfgDateTime = '\0', /* Set to SAHPI_TIME_UNSPECIFIED */ /* bladeHardwareVpdManufacturingId */ .OidManufacturer = ".1.3.6.1.4.1.2.3.51.2.2.21.4.1.1.3.x", /* bladeHardwareVpdMachineType */ .OidProductName = ".1.3.6.1.4.1.2.3.51.2.2.21.4.1.1.7.x", /* bladeHardwareVpdHardwareRevision */ .OidProductVersion = ".1.3.6.1.4.1.2.3.51.2.2.21.4.1.1.5.x", /* bladeHardwareVpdSerialNumber */ .OidSerialNumber = ".1.3.6.1.4.1.2.3.51.2.2.21.4.1.1.6.x", /* bladeHardwareVpdFruNumber */ .OidPartNumber = ".1.3.6.1.4.1.2.3.51.2.2.21.4.1.1.4.x", .OidFileId = '\0', .OidAssetTag = '\0', } }, .firmware_mib = { .not_avail_indicator_num = 0, .write_only = SAHPI_FALSE, .area_type = SAHPI_IDR_AREATYPE_PRODUCT_INFO, .oid = { .OidChassisType = '\0', /* bladeBiosVpdDate */ .OidMfgDateTime = ".1.3.6.1.4.1.2.3.51.2.2.21.5.1.1.8.x", .OidManufacturer = '\0', /* bladeBiosVpdBuildId */ .OidProductName = ".1.3.6.1.4.1.2.3.51.2.2.21.5.1.1.6.x", /* bladeBiosVpdRevision */ .OidProductVersion = ".1.3.6.1.4.1.2.3.51.2.2.21.5.1.1.7.x", .OidSerialNumber = '\0', .OidPartNumber = '\0', .OidFileId = '\0', .OidAssetTag = '\0', } }, }, .comment = "Blade VPD", }, {} /* Terminate array with a null element */ }; /********************************** * Blade Expansion Module (BEM) VPD **********************************/ struct snmp_bc_inventory snmp_bc_bem_inventories[] = { {} /* Terminate array with a null element */ }; /**************** * Media Tray VPD ****************/ struct snmp_bc_inventory snmp_bc_mediatray_inventories[] = { { .inventory = { .IdrId = 8, .Oem = 0, }, .inventory_info = { .hardware_mib = { .not_avail_indicator_num = 0, .write_only = SAHPI_FALSE, .area_type = SAHPI_IDR_AREATYPE_BOARD_INFO, .oid = { .OidChassisType = '\0', .OidMfgDateTime = '\0', /* Set to SAHPI_TIME_UNSPECIFIED */ /* mtHardwareVpdManufacturingId */ .OidManufacturer = ".1.3.6.1.4.1.2.3.51.2.2.21.9.3.0", .OidProductName = '\0', /* mtHardwareVpdHardwareRevision */ .OidProductVersion = ".1.3.6.1.4.1.2.3.51.2.2.21.9.5.0", .OidSerialNumber = '\0', /* mtHardwareVpdFruNumber */ .OidPartNumber = ".1.3.6.1.4.1.2.3.51.2.2.21.9.4.0", .OidFileId = '\0', .OidAssetTag = '\0', } }, .firmware_mib = { .not_avail_indicator_num = 0, .write_only = SAHPI_FALSE, .area_type = SAHPI_IDR_AREATYPE_PRODUCT_INFO, .oid = { .OidChassisType = '\0', .OidMfgDateTime = '\0', /* Set to SAHPI_TIME_UNSPECIFIED */ .OidManufacturer = '\0', .OidProductName = '\0', .OidProductVersion = '\0', .OidSerialNumber = '\0', .OidPartNumber = '\0', .OidFileId = '\0', .OidAssetTag = '\0', } }, }, .comment = "Media Tray VPD", }, {} /* Terminate array with a null element */ }; struct snmp_bc_inventory snmp_bc_mediatray2_inventories[] = { { .inventory = { .IdrId = 82, .Oem = 0, }, .inventory_info = { .hardware_mib = { .not_avail_indicator_num = 0, .write_only = SAHPI_FALSE, .area_type = SAHPI_IDR_AREATYPE_BOARD_INFO, .oid = { .OidChassisType = '\0', .OidMfgDateTime = '\0', /* Set to SAHPI_TIME_UNSPECIFIED */ /* mt2HardwareVpdManufacturingId */ .OidManufacturer = ".1.3.6.1.4.1.2.3.51.2.2.21.10.3.0", .OidProductName = '\0', /* mt2HardwareVpdHardwareRevision */ .OidProductVersion = ".1.3.6.1.4.1.2.3.51.2.2.21.10.5.0", .OidSerialNumber = '\0', /* mt2HardwareVpdFruNumber */ .OidPartNumber = ".1.3.6.1.4.1.2.3.51.2.2.21.10.4.0", .OidFileId = '\0', .OidAssetTag = '\0', } }, .firmware_mib = { .not_avail_indicator_num = 0, .write_only = SAHPI_FALSE, .area_type = SAHPI_IDR_AREATYPE_PRODUCT_INFO, .oid = { .OidChassisType = '\0', .OidMfgDateTime = '\0', /* Set to SAHPI_TIME_UNSPECIFIED */ .OidManufacturer = '\0', .OidProductName = '\0', .OidProductVersion = '\0', .OidSerialNumber = '\0', .OidPartNumber = '\0', .OidFileId = '\0', .OidAssetTag = '\0', } }, }, .comment = "Media Tray 2 VPD", }, {} /* Terminate array with a null element */ }; /****************** * Power Module VPD ******************/ struct snmp_bc_inventory snmp_bc_power_inventories[] = { { .inventory = { .IdrId = 10, .Oem = 0, }, .inventory_info = { .hardware_mib = { .not_avail_indicator_num = 0, .write_only = SAHPI_FALSE, .area_type = SAHPI_IDR_AREATYPE_BOARD_INFO, .oid = { .OidChassisType = '\0', .OidMfgDateTime = '\0', /* Set to SAHPI_TIME_UNSPECIFIED */ /* pmHardwareVpdManufacturingId */ .OidManufacturer = ".1.3.6.1.4.1.2.3.51.2.2.21.8.1.1.3.x", .OidProductName = '\0', /* pmHardwareVpdHardwareRevision */ .OidProductVersion = ".1.3.6.1.4.1.2.3.51.2.2.21.8.1.1.5.x", .OidSerialNumber = '\0', /* pmHardwareVpdFruNumber */ .OidPartNumber = ".1.3.6.1.4.1.2.3.51.2.2.21.8.1.1.4.x", .OidFileId = '\0', .OidAssetTag = '\0', } }, .firmware_mib = { .not_avail_indicator_num = 0, .write_only = SAHPI_FALSE, .area_type = SAHPI_IDR_AREATYPE_PRODUCT_INFO, .oid = { .OidChassisType = '\0', .OidMfgDateTime = '\0', /* Set to SAHPI_TIME_UNSPECIFIED */ .OidManufacturer = '\0', .OidProductName = '\0', .OidProductVersion = '\0', .OidSerialNumber = '\0', .OidPartNumber = '\0', .OidFileId = '\0', .OidAssetTag = '\0', } }, }, .comment = "Power Module VPD", }, {} /* Terminate array with a null element */ }; /******************* * Physical Slot VPD *******************/ struct snmp_bc_inventory snmp_bc_slot_inventories[] = { {} /* Terminate array with a null element */ }; /************** * BEM DASD VPD **************/ struct snmp_bc_inventory snmp_bc_bem_dasd_inventories[] = { {} /* Terminate array with a null element */ }; /***************** * Alarm Panel VPD *****************/ struct snmp_bc_inventory snmp_bc_alarm_inventories[] = { { .inventory = { .IdrId = 14, .Oem = 0, }, .inventory_info = { .hardware_mib = { .not_avail_indicator_num = 0, .write_only = SAHPI_FALSE, .area_type = SAHPI_IDR_AREATYPE_BOARD_INFO, .oid = { .OidChassisType = '\0', .OidMfgDateTime = '\0', /* Set to SAHPI_TIME_UNSPECIFIED */ /* tapHardwareVpdManufacturingId */ .OidManufacturer = ".1.3.6.1.4.1.2.3.51.2.2.21.15.3.0", .OidProductName = '\0', /* tapHardwareVpdHardwareRevision */ .OidProductVersion = ".1.3.6.1.4.1.2.3.51.2.2.21.15.5.0", /* tapHardwareVpdFruSerial */ .OidSerialNumber = ".1.3.6.1.4.1.2.3.51.2.2.21.15.11.0", /* tapHardwareVpdFruNumber */ .OidPartNumber = ".1.3.6.1.4.1.2.3.51.2.2.21.15.4.0", .OidFileId = '\0', .OidAssetTag = '\0', } }, .firmware_mib = { .not_avail_indicator_num = 0, .write_only = SAHPI_FALSE, .area_type = SAHPI_IDR_AREATYPE_PRODUCT_INFO, .oid = { .OidChassisType = '\0', .OidMfgDateTime = '\0', .OidManufacturer = '\0', .OidProductName = '\0', .OidProductVersion = '\0', .OidSerialNumber = '\0', .OidPartNumber = '\0', .OidFileId = '\0', .OidAssetTag = '\0', } }, }, .comment = "Alarm Panel VPD", }, {} /* Terminate array with a null element */ }; /********************************** * Multiplexer Expansion Module VPD **********************************/ struct snmp_bc_inventory snmp_bc_mux_inventories[] = { { .inventory = { .IdrId = 15, .Oem = 0, }, .inventory_info = { .hardware_mib = { .not_avail_indicator_num = 0, .write_only = SAHPI_FALSE, .area_type = SAHPI_IDR_AREATYPE_BOARD_INFO, .oid = { .OidChassisType = '\0', .OidMfgDateTime = '\0', /* Set to SAHPI_TIME_UNSPECIFIED */ /* mxHardwareVpdManufacturingId */ .OidManufacturer = ".1.3.6.1.4.1.2.3.51.2.2.21.17.1.1.3.x", .OidProductName = '\0', /* mxHardwareVpdHardwareRevision */ .OidProductVersion = ".1.3.6.1.4.1.2.3.51.2.2.21.17.1.1.5.x", /* mxHardwareVpdFruSerial */ .OidSerialNumber = ".1.3.6.1.4.1.2.3.51.2.2.21.17.1.1.11.x", /* mxHardwareVpdFruNumber */ .OidPartNumber = ".1.3.6.1.4.1.2.3.51.2.2.21.17.1.1.4.x", .OidFileId = '\0', .OidAssetTag = '\0', } }, .firmware_mib = { .not_avail_indicator_num = 0, .write_only = SAHPI_FALSE, .area_type = SAHPI_IDR_AREATYPE_PRODUCT_INFO, .oid = { .OidChassisType = '\0', .OidMfgDateTime = '\0', /* Set to SAHPI_TIME_UNSPECIFIED */ .OidManufacturer = '\0', .OidProductName = '\0', .OidProductVersion = '\0', .OidSerialNumber = '\0', .OidPartNumber = '\0', .OidFileId = '\0', .OidAssetTag = '\0', } }, }, .comment = "Multiplexer Expansion Module VPD", }, {} /* Terminate array with a null element */ }; /************************** * Network Clock Module VPD **************************/ struct snmp_bc_inventory snmp_bc_clock_inventories[] = { { .inventory = { .IdrId = 16, .Oem = 0, }, .inventory_info = { .hardware_mib = { .not_avail_indicator_num = 0, .write_only = SAHPI_FALSE, .area_type = SAHPI_IDR_AREATYPE_BOARD_INFO, .oid = { .OidChassisType = '\0', .OidMfgDateTime = '\0', /* Set to SAHPI_TIME_UNSPECIFIED */ /* ncHardwareVpdManufacturingId */ .OidManufacturer = ".1.3.6.1.4.1.2.3.51.2.2.21.16.1.1.3.x", .OidProductName = '\0', /* ncHardwareVpdHardwareRevision */ .OidProductVersion = ".1.3.6.1.4.1.2.3.51.2.2.21.16.1.1.5.x", /* ncHardwareVpdFruSerial */ .OidSerialNumber = ".1.3.6.1.4.1.2.3.51.2.2.21.16.1.1.11.x", /* ncHardwareVpdFruNumber */ .OidPartNumber = ".1.3.6.1.4.1.2.3.51.2.2.21.16.1.1.4.x", .OidFileId = '\0', .OidAssetTag = '\0', } }, .firmware_mib = { .not_avail_indicator_num = 0, .write_only = SAHPI_FALSE, .area_type = SAHPI_IDR_AREATYPE_PRODUCT_INFO, .oid = { .OidChassisType = '\0', .OidMfgDateTime = '\0', /* Set to SAHPI_TIME_UNSPECIFIED */ .OidManufacturer = '\0', .OidProductName = '\0', .OidProductVersion = '\0', .OidSerialNumber = '\0', .OidPartNumber = '\0', .OidFileId = '\0', .OidAssetTag = '\0', } }, }, .comment = "Network Clock Module VPD", }, {} /* Terminate array with a null element */ }; /**************** * Air Filter VPD ****************/ struct snmp_bc_inventory snmp_bc_filter_inventories[] = { {} /* Terminate array with a null element */ }; /*********************** * Switch Interposer VPD ***********************/ struct snmp_bc_inventory snmp_bc_interposer_switch_inventories[] = { { .inventory = { .IdrId = 18, .Oem = 0, }, .inventory_info = { .hardware_mib = { .not_avail_indicator_num = 0, .write_only = SAHPI_FALSE, .area_type = SAHPI_IDR_AREATYPE_BOARD_INFO, .oid = { .OidChassisType = '\0', .OidMfgDateTime = '\0', /* Set to SAHPI_TIME_UNSPECIFIED */ /* smInpHardwareVpdManufacturingId */ .OidManufacturer = ".1.3.6.1.4.1.2.3.51.2.2.21.6.2.1.3.x", .OidProductName = '\0', /* smInpHardwareVpdHardwareRevision */ .OidProductVersion = ".1.3.6.1.4.1.2.3.51.2.2.21.6.2.1.5.x", /* smInpHardwareVpdFruSerial */ .OidSerialNumber = ".1.3.6.1.4.1.2.3.51.2.2.21.6.2.1.11.x", /* smInpHardwareVpdFruNumber */ .OidPartNumber = ".1.3.6.1.4.1.2.3.51.2.2.21.6.2.1.4.x", .OidFileId = '\0', .OidAssetTag = '\0', } }, .firmware_mib = { .not_avail_indicator_num = 0, .write_only = SAHPI_FALSE, .area_type = SAHPI_IDR_AREATYPE_PRODUCT_INFO, .oid = { .OidChassisType = '\0', .OidMfgDateTime = '\0', /* Set to SAHPI_TIME_UNSPECIFIED */ .OidManufacturer = '\0', .OidProductName = '\0', .OidProductVersion = '\0', .OidSerialNumber = '\0', .OidPartNumber = '\0', .OidFileId = '\0', .OidAssetTag = '\0', } }, }, .comment = "Switch Interposer VPD", }, {} /* Terminate array with a null element */ }; /******************* * MM Interposer VPD *******************/ struct snmp_bc_inventory snmp_bc_interposer_mm_inventories[] = { { .inventory = { .IdrId = 19, .Oem = 0, }, .inventory_info = { .hardware_mib = { .not_avail_indicator_num = 0, .write_only = SAHPI_FALSE, .area_type = SAHPI_IDR_AREATYPE_BOARD_INFO, .oid = { .OidChassisType = '\0', .OidMfgDateTime = '\0', /* Set to SAHPI_TIME_UNSPECIFIED */ /* mmInpHardwareVpdManufacturingId */ .OidManufacturer = ".1.3.6.1.4.1.2.3.51.2.2.21.2.2.1.3.x", .OidProductName = '\0', /* mmInpHardwareVpdHardwareRevision */ .OidProductVersion = ".1.3.6.1.4.1.2.3.51.2.2.21.2.2.1.5.x", /* mmInpHardwareVpdFruSerial */ .OidSerialNumber = ".1.3.6.1.4.1.2.3.51.2.2.21.2.2.1.9.x", /* mmInpHardwareVpdFruNumber */ .OidPartNumber = ".1.3.6.1.4.1.2.3.51.2.2.21.2.2.1.4.x", .OidFileId = '\0', .OidAssetTag = '\0', } }, .firmware_mib = { .not_avail_indicator_num = 0, .write_only = SAHPI_FALSE, .area_type = SAHPI_IDR_AREATYPE_PRODUCT_INFO, .oid = { .OidChassisType = '\0', .OidMfgDateTime = '\0', /* Set to SAHPI_TIME_UNSPECIFIED */ .OidManufacturer = '\0', .OidProductName = '\0', .OidProductVersion = '\0', .OidSerialNumber = '\0', .OidPartNumber = '\0', .OidFileId = '\0', .OidAssetTag = '\0', } }, }, .comment = "Management Module Interposer VPD", }, {} /* Terminate array with a null element */ }; openhpi-2.14.1/plugins/snmp_bc/sim_init.h0000644000076400007640000000126111302566770015266 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * Steve Sherman */ #ifndef __SIM_INIT_H #define __SIM_INIT_H SaHpiBoolT is_simulator(void); SaErrorT sim_banner(struct snmp_bc_hnd *custom_handle); SaErrorT sim_init(void); SaErrorT sim_close(void); SaErrorT sim_file(void); #endif openhpi-2.14.1/plugins/snmp_bc/snmp_bc_discover.c0000644000076400007640000004557611302566770017006 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004, 2006 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * Renier Morales * Steve Sherman */ #include #include /** * snmp_bc_discover_resources: * @hnd: Handler data pointer. * * Discover all the resources, sensors, controls, etc. for this instance * of the plugin. Found entities are compared with what the HPI * Infra-structure thinks is there and any new, deleted, or changed * entities are updated. * * Return values: * Builds/updates internal RPT cache - normal operation. * SA_ERR_HPI_OUT_OF_MEMORY - Cannot allocate space for internal memory **/ SaErrorT snmp_bc_discover_resources(void *hnd) { char *root_tuple; SaErrorT err, err1; SaHpiEntityPathT ep_root; SaHpiEventLogInfoT elinfo; struct oh_handler_state *handle; struct snmp_bc_hnd *custom_handle; if (!hnd) { err("Invalid parameter."); return(SA_ERR_HPI_INVALID_PARAMS); } err = SA_OK; err1 = SA_OK; handle = (struct oh_handler_state *)hnd; custom_handle = (struct snmp_bc_hnd *)handle->data; if (!custom_handle) { err("Invalid parameter."); return(SA_ERR_HPI_INVALID_PARAMS); } snmp_bc_lock_handler(custom_handle); /* Find root Entity Path */ root_tuple = (char *)g_hash_table_lookup(handle->config, "entity_root"); if (root_tuple == NULL) { err("Cannot find configuration parameter."); snmp_bc_unlock_handler(custom_handle); return(SA_ERR_HPI_INTERNAL_ERROR); } err = oh_encode_entitypath(root_tuple, &ep_root); if (err) { err("Cannot convert entity path to string. Error=%s.", oh_lookup_error(err)); snmp_bc_unlock_handler(custom_handle); return(SA_ERR_HPI_INTERNAL_ERROR); } /* --------------------------------------------------------------- */ /* tmpcache and tmpqueue are no longer used. pdphan 08/16/06 */ /* Allocate space for temporary RPT cache */ /*custom_handle->tmpcache = (RPTable *)g_malloc0(sizeof(RPTable)); */ /*if (custom_handle->tmpcache == NULL) { */ /* err("Out of memory."); */ /* snmp_bc_unlock_handler(custom_handle); */ /* return(SA_ERR_HPI_OUT_OF_MEMORY); */ /*} */ /* */ /* Initialize tmpqueue */ /*custom_handle->tmpqueue = NULL; */ /* --------------------------------------------------------------- */ /* Individual platform discovery */ if (custom_handle->platform == SNMP_BC_PLATFORM_RSA) { err = snmp_bc_discover_rsa(handle, &ep_root); } else { err = snmp_bc_discover(handle, &ep_root); } if (err) { if (err == SA_ERR_HPI_DUPLICATE) { /* Special case: * snmp_bc_discover() has found there is * no changes in any of the BladeCenter * resource masks, so there is nothing to do. * Setting returncode to SA_OK then return. */ err = SA_OK; } else { err("Discovery failed. Error=%s.", oh_lookup_error(err)); } goto CLEANUP; } /* Build cache copy of SEL. RID == 1 (2nd parm) is a dummy id */ /** * This design depends on the BladeCenter management of the Event Log. * That is, * (a) The BC Event Log will always have at least one entry. It *never* has zero entry. * (b) If a Clear Event Log command is received, the BC clears the log, then creates * "Event Log has just been cleared by xxx" entry * So, if the cache copy of the Event Log is empty, this is the first invocation of OpenHPI/snmp_bc. * Otherwise, only processes newer entries for (re) discovery. **/ oh_el_info(handle->elcache, &elinfo); if (elinfo.Entries == 0) err1 = snmp_bc_build_selcache(handle, 1); else err1 = snmp_bc_check_selcache(handle, 1, SAHPI_NEWEST_ENTRY); if (err1) { /* --------------------------------------------------------------- */ /* If an error is encounterred during building of snmp_bc elcache, */ /* only log the error. Do not do any recovery because log entries */ /* are still kept in bc mm. We'll pick them up during synch. */ /* --------------------------------------------------------------- */ dbg("snmp_bc_discover, Error %s when building elcache.\n", oh_lookup_error(err1)); } if (custom_handle->isFirstDiscovery == SAHPI_TRUE) custom_handle->isFirstDiscovery = SAHPI_FALSE; CLEANUP: snmp_bc_unlock_handler(custom_handle); return(err); } /** * snmp_bc_discover_sensors: * @handler: Pointer to handler's data. * @sensor_array: Pointer to resource's static sensor data array. * @parent_res_event: Pointer to resource's event structure. * * Discovers resource's available sensors and their events. * * Return values: * Adds sensor RDRs to internal Infra-structure queues - normal case * SA_ERR_HPI_OUT_OF_MEMORY - Cannot allocate space for internal memory **/ SaErrorT snmp_bc_discover_sensors(struct oh_handler_state *handle, struct snmp_bc_sensor *sensor_array, struct oh_event *res_oh_event) { int i; SaErrorT err; SaHpiBoolT valid_sensor; SaHpiRdrT *rdrptr; struct snmp_bc_hnd *custom_handle; struct SensorInfo *sensor_info_ptr; custom_handle = (struct snmp_bc_hnd *)handle->data; for (i=0; sensor_array[i].index != 0; i++) { rdrptr = (SaHpiRdrT *)g_malloc0(sizeof(SaHpiRdrT)); if (rdrptr == NULL) { err("Out of memory."); return(SA_ERR_HPI_OUT_OF_MEMORY); } valid_sensor = SAHPI_FALSE; /* Check for event-only sensor */ if (sensor_array[i].sensor.DataFormat.IsSupported == SAHPI_FALSE) { valid_sensor = SAHPI_TRUE; } else { if (sensor_array[i].sensor_info.mib.oid != NULL) { valid_sensor = rdr_exists(custom_handle, &(res_oh_event->resource.ResourceEntity), sensor_array[i].sensor_info.mib.loc_offset, sensor_array[i].sensor_info.mib.oid, sensor_array[i].sensor_info.mib.not_avail_indicator_num, sensor_array[i].sensor_info.mib.write_only); } else { err("Sensor %s cannot be read.", sensor_array[i].comment); g_free(rdrptr); return(SA_ERR_HPI_INTERNAL_ERROR); } } /* Add sensor RDR, if sensor is event-only or can be read */ if (valid_sensor) { rdrptr->RdrType = SAHPI_SENSOR_RDR; rdrptr->Entity = res_oh_event->resource.ResourceEntity; err = snmp_bc_mod_sensor_ep(rdrptr, sensor_array, i); rdrptr->RdrTypeUnion.SensorRec = sensor_array[i].sensor; oh_init_textbuffer(&(rdrptr->IdString)); oh_append_textbuffer(&(rdrptr->IdString), sensor_array[i].comment); dbg("Discovered sensor: %s.", rdrptr->IdString.Data); sensor_info_ptr = g_memdup(&(sensor_array[i].sensor_info), sizeof(struct SensorInfo)); err = oh_add_rdr(handle->rptcache, res_oh_event->resource.ResourceId, rdrptr, sensor_info_ptr, 0); if (err) { err("Cannot add RDR. Error=%s.", oh_lookup_error(err)); g_free(rdrptr); } else { res_oh_event->rdrs = g_slist_append(res_oh_event->rdrs, rdrptr); snmp_bc_discover_sensor_events(handle, &(res_oh_event->resource.ResourceEntity), sensor_array[i].sensor.Num, &(sensor_array[i])); } } else { g_free(rdrptr); } } return(SA_OK); } /** * snmp_bc_discover_controls: * @handler: Pointer to handler's data. * @control_array: Pointer to resource's static control data array. * @res_oh_event: Pointer to resource's event structure. * * Discovers resource's available controls. * * Return values: * Adds control RDRs to internal Infra-structure queues - normal case * SA_ERR_HPI_OUT_OF_MEMORY - Cannot allocate space for internal memory **/ SaErrorT snmp_bc_discover_controls(struct oh_handler_state *handle, struct snmp_bc_control *control_array, struct oh_event *res_oh_event) { int i; SaErrorT err; SaHpiBoolT valid_control; SaHpiRdrT *rdrptr; struct snmp_bc_hnd *custom_handle; struct ControlInfo *control_info_ptr; custom_handle = (struct snmp_bc_hnd *)handle->data; for (i=0; control_array[i].index != 0; i++) { rdrptr = (SaHpiRdrT *)g_malloc0(sizeof(SaHpiRdrT)); if (rdrptr == NULL) { err("Out of memory."); return(SA_ERR_HPI_OUT_OF_MEMORY); } valid_control = rdr_exists(custom_handle, &(res_oh_event->resource.ResourceEntity), control_array[i].control_info.mib.loc_offset, control_array[i].control_info.mib.oid, control_array[i].control_info.mib.not_avail_indicator_num, control_array[i].control_info.mib.write_only); /* Add control RDR, if control can be read */ if (valid_control) { rdrptr->RdrType = SAHPI_CTRL_RDR; rdrptr->Entity = res_oh_event->resource.ResourceEntity; rdrptr->RdrTypeUnion.CtrlRec = control_array[i].control; oh_init_textbuffer(&(rdrptr->IdString)); oh_append_textbuffer(&(rdrptr->IdString), control_array[i].comment); dbg("Discovered control: %s.", rdrptr->IdString.Data); control_info_ptr = g_memdup(&(control_array[i].control_info), sizeof(struct ControlInfo)); err = oh_add_rdr(handle->rptcache, res_oh_event->resource.ResourceId, rdrptr, control_info_ptr, 0); if (err) { err("Cannot add RDR. Error=%s.", oh_lookup_error(err)); g_free(rdrptr); } else { res_oh_event->rdrs = g_slist_append(res_oh_event->rdrs, rdrptr); } } else { g_free(rdrptr); } } return(SA_OK); } /** * snmp_bc_discover_inventory: * @handler: Pointer to handler's data. * @inventory_array: Pointer to resource's static inventory data array. * @res_oh_event: Pointer to resource's event structure. * * Discovers resource's available inventory data records. * * Return values: * Adds inventory RDRs to internal Infra-structure queues - normal case * SA_ERR_HPI_OUT_OF_MEMORY - Cannot allocate space for internal memory **/ SaErrorT snmp_bc_discover_inventories(struct oh_handler_state *handle, struct snmp_bc_inventory *inventory_array, struct oh_event *res_oh_event) { int i; SaHpiBoolT valid_idr; SaErrorT err; SaHpiRdrT *rdrptr; struct snmp_bc_hnd *custom_handle; struct InventoryInfo *inventory_info_ptr; custom_handle = (struct snmp_bc_hnd *)handle->data; /* Assumming OidManufacturer is defined and determines readable of other VPD */ for (i=0; inventory_array[i].inventory_info.hardware_mib.oid.OidManufacturer != NULL; i++) { rdrptr = (SaHpiRdrT *)g_malloc0(sizeof(SaHpiRdrT)); if (rdrptr == NULL) { err("Out of memory."); return(SA_ERR_HPI_OUT_OF_MEMORY); } valid_idr = rdr_exists(custom_handle, &(res_oh_event->resource.ResourceEntity), 0, inventory_array[i].inventory_info.hardware_mib.oid.OidManufacturer, 0, 0); /* Add inventory RDR, if inventory can be read */ if (valid_idr) { rdrptr->RdrType = SAHPI_INVENTORY_RDR; rdrptr->Entity = res_oh_event->resource.ResourceEntity; rdrptr->RdrTypeUnion.InventoryRec = inventory_array[i].inventory; oh_init_textbuffer(&(rdrptr->IdString)); oh_append_textbuffer(&(rdrptr->IdString), inventory_array[i].comment); dbg("Discovered inventory: %s.", rdrptr->IdString.Data); inventory_info_ptr = g_memdup(&(inventory_array[i].inventory_info), sizeof(struct InventoryInfo)); err = oh_add_rdr(handle->rptcache, res_oh_event->resource.ResourceId, rdrptr, inventory_info_ptr, 0); if (err) { err("Cannot add RDR. Error=%s.", oh_lookup_error(err)); g_free(rdrptr); } else { res_oh_event->rdrs = g_slist_append(res_oh_event->rdrs, rdrptr); } } else { g_free(rdrptr); } } return(SA_OK); } /** * snmp_bc_create_resourcetag: * @buffer: Location of Resource Tag buffer. * @str: Resource name. * @location: Resource location. * * Creates a user friendly Resource Tag. Takes the comment found in the * Resource's static definition, appends a trailing string (can be NULL) * plus the resource's location. * * Return values: * SaHpiTextBufferT - normal operation. * SA_ERR_HPI_INVALID_PARAMS - @buffer is NULL; or @loc not valid * SA_ERR_HPI_OUT_OF_MEMORY - Cannot allocate space for internal memory. **/ SaErrorT snmp_bc_create_resourcetag(SaHpiTextBufferT *buffer, const char *str, SaHpiEntityLocationT loc) { SaErrorT err; SaHpiTextBufferT working; if (!buffer || loc < 0 || loc > (pow(10, OH_MAX_LOCATION_DIGITS) - 1)) { return(SA_ERR_HPI_INVALID_PARAMS); } err = oh_init_textbuffer(&working); if (err) { return(err); } if (str) { err = oh_append_textbuffer(&working, str); } if (err) { return(err); } if (loc) { char *locstr; locstr = (gchar *)g_malloc0(OH_MAX_LOCATION_DIGITS + 1); if (locstr == NULL) { err("Out of memory."); return(SA_ERR_HPI_OUT_OF_MEMORY); } if (loc != SNMP_BC_NOT_VALID) { snprintf(locstr, OH_MAX_LOCATION_DIGITS + 1, " %d", loc); } err = oh_append_textbuffer(&working, locstr); g_free(locstr); if (err) { return(err); } } err = oh_copy_textbuffer(buffer, &working); return(err); } /** * rdr_exists: * @custom_handle: Custom handler data pointer. * @ep: Pointer to Entity Path * @loc_offset: Entity Path location offset * @oidstr: SNMP OID string * @na: Not available integer, if applicable * @write-only: SNMP OID write-only indicator * * Determines if an SNMP OID is available to be read. OID may not exist, or if * it does exist may be write-only or indicate that it's value is non-existant. * * Return values: * SAHPI_TRUE - if OID is valid and readable. * SAHPI_FALSE - if OID's value cannot be read. **/ SaHpiBoolT rdr_exists(struct snmp_bc_hnd *custom_handle, SaHpiEntityPathT *ep, SaHpiEntityLocationT loc_offset, const gchar *oidstr, unsigned int na, SaHpiBoolT write_only) { SaErrorT err; struct snmp_value get_value; if (write_only == SAHPI_TRUE) { return(SAHPI_FALSE); }; /* Can't check it if its non-readable */ err = snmp_bc_oid_snmp_get(custom_handle, ep, loc_offset, oidstr, &get_value, SAHPI_TRUE); if (err || (get_value.type == ASN_INTEGER && na && na == get_value.integer)) { return(SAHPI_FALSE); } return(SAHPI_TRUE); } /** * snmp_bc_validate_ep: * @org_ep: Pointer to entity path contained within SaHpiRdrT structure. * @val_ep: Pointer to returned entity path that has been validated. * * Remove entity path entries that is not a snmp resource in entity path structures (SaHpiEntityPathT). * The validated entity path is returned in val_ep structure. * This is used for CPU sensors. We wish to have CPU in entity path. But snmp_bc does not have CPU as a * resource. * * Returns: * SA_OK - normal operations. * SA_ERR_HPI_INVALID_PARAMS - @org_ep or @val_ep is NULL. **/ SaErrorT snmp_bc_validate_ep(SaHpiEntityPathT *org_ep, SaHpiEntityPathT *val_ep) { int i, j; if (!org_ep || !val_ep) { err("Invalid parameter."); return(SA_ERR_HPI_INVALID_PARAMS); } i = 0; for (j=0; iEntry[i].EntityType != SAHPI_ENT_PROCESSOR) { val_ep->Entry[j].EntityLocation = org_ep->Entry[i].EntityLocation; val_ep->Entry[j].EntityType = org_ep->Entry[i].EntityType; j++; } if (org_ep->Entry[i].EntityType == SAHPI_ENT_ROOT) break; } return(SA_OK); } /** * snmp_bc_mod_sensor_ep: * @e: Pointer to event structure for this sensor. * @sensor_array: Pointer to resource's static sensor data array. * @index: index in the static sensor data array for the current sensor. * * If the sensor being discoverred is belong to blade CPU, then add CPU tuple * to sensor entity path. Else, do nothing. * * Returns: * SA_OK - normal operations. * SA_ERR_HPI_INVALID_PARAMS - @e or @sensor is NULL. **/ SaErrorT snmp_bc_mod_sensor_ep(SaHpiRdrT *rdrptr, void *sensor_array_in, int index) { int j; gchar *pch; struct snmp_bc_sensor *sensor_array; struct snmp_bc_ipmi_sensor *sensor_array_ipmi; SaHpiEntityPathT ep_add = { .Entry[0] = { .EntityType = SAHPI_ENT_PROCESSOR, .EntityLocation = 0, }, }; sensor_array = (struct snmp_bc_sensor *)sensor_array_in; sensor_array_ipmi = (struct snmp_bc_ipmi_sensor *)sensor_array_in; if (!rdrptr || !sensor_array) { err("Invalid parameter."); return(SA_ERR_HPI_INVALID_PARAMS); } if (((struct snmp_bc_sensor *)sensor_array_in == (struct snmp_bc_sensor *)snmp_bc_blade_sensors)) { for (j=0; j < 3; j++) { if (sensor_array[index].sensor_info.mib.oid != NULL) { if ((g_ascii_strncasecmp(sensor_array[index].sensor_info.mib.oid, snmp_bc_blade_sensors[j].sensor_info.mib.oid, 34) == 0)) { ep_add.Entry[0].EntityLocation = j + 1; snmp_bc_add_ep(rdrptr, &ep_add); break; } } } } else if ((struct snmp_bc_ipmi_sensor *)sensor_array_in == (struct snmp_bc_ipmi_sensor *)snmp_bc_blade_ipmi_sensors) { if ( (pch = strstr(sensor_array_ipmi[index].ipmi_tag, "CPU")) != NULL) { ep_add.Entry[0].EntityLocation = atoi(&pch[3]); snmp_bc_add_ep(rdrptr,&ep_add); } } else { dbg("This not one of the Blade sensor.\n"); } return(SA_OK); } /** * snmp_bc_add_ep: * @e: Pointer to event structure for this sensor. * @ep_add: Pointer to entity path tuple to be prepended. * * Prepend an entity path tuple to the existing (parent) * entity path in oh_event struct. * * Returns: * SA_OK - normal operations. * SA_ERR_HPI_INVALID_PARAMS - @e or @ep_add is NULL. **/ SaErrorT snmp_bc_add_ep(SaHpiRdrT *rdrptr, SaHpiEntityPathT *ep_add) { int i, j; SaHpiEntityPathT ep_copy; if ( !rdrptr || !ep_add) { err("Invalid parameter."); return(SA_ERR_HPI_INVALID_PARAMS); } for (i=0; iEntity.Entry[i]; if (ep_copy.Entry[i].EntityType == SAHPI_ENT_ROOT) break; } for (i=0; iEntry[i].EntityType == SAHPI_ENT_ROOT) break; rdrptr->Entity.Entry[i] = ep_add->Entry[i]; } for (j=0; iEntity.Entry[i] = ep_copy.Entry[j]; if (ep_copy.Entry[j].EntityType == SAHPI_ENT_ROOT) break; } return(SA_OK); } /** * Aliasing **/ void * oh_discover_resources (void *) __attribute__ ((weak, alias("snmp_bc_discover_resources"))); openhpi-2.14.1/plugins/snmp_bc/snmp_bc_resources.h0000644000076400007640000005272311302566770017177 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2003, 2006 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * Sean Dague * Renier Morales * Steve Sherman */ /************************************************************************* * This header file stubs resource and RDR static infomation that are used * in constructing RPTs and RDRs for IBM BladeCenter chassis and * RSA (Integrated and separate adapter models). * * Differences between the models are discovered dynamically by this * plugin at run-time during resource discovery. *************************************************************************/ #ifndef __SNMP_BC_RESOURCES_H #define __SNMP_BC_RESOURCES_H /* Start HPI location numbers from 1 */ #define SNMP_BC_HPI_LOCATION_BASE 1 /* An invalid snmp_bc index */ #define SNMP_BC_NOT_VALID 0xFF /* IBM Manufacturing Number - Use IANA number for "Modular Blade Server" */ #define IBM_MANUFACTURING_ID 20944 /* Maximum OID string length */ #define SNMP_BC_MAX_OID_LENGTH 50 /* OIDs to determine platform types */ #define SNMP_BC_CHASSIS_TYPE_OID ".1.3.6.1.4.1.2.3.51.2.22.4.38.0" /* chassisType */ #define SNMP_BC_CHASSIS_SUBTYPE_OID ".1.3.6.1.4.1.2.3.51.2.22.4.39.0" /* chassisSubtype */ #define SNMP_BC_CHASSIS_TYPE_BC 97 #define SNMP_BC_CHASSIS_TYPE_BCT 98 #define SNMP_BC_CHASSIS_SUBTYPE_ORIG 0 #define SNMP_BC_CHASSIS_SUBTYPE_H 2 /* Original models don't have chassis type/subtype OIDs - just health OIDs */ #define SNMP_BC_PLATFORM_OID_BC ".1.3.6.1.4.1.2.3.51.2.2.7.1.0" /* systemHealthStat, BC System Health */ #define SNMP_BC_PLATFORM_OID_BCT ".1.3.6.1.4.1.2.3.51.2.2.9.1.0" /* telcoSystemHealthStat, BCT System Health */ #define SNMP_BC_PLATFORM_OID_RSA ".1.3.6.1.4.1.2.3.51.1.2.7.1.0" /* RSA System Health */ /* Run-time variables to distinguish platform types */ #define SNMP_BC_PLATFORM_BCT 0x0001 #define SNMP_BC_PLATFORM_BC 0x0002 #define SNMP_BC_PLATFORM_RSA 0x0004 #define SNMP_BC_PLATFORM_BCH 0x0008 #define SNMP_BC_PLATFORM_BCHT 0x0009 #define SNMP_BC_PLATFORM_ALL 0xFFFF /* Resource indexes to snmp_rpt array in discovery */ typedef enum { BC_RPT_ENTRY_CHASSIS = 0, BC_RPT_ENTRY_VIRTUAL_MGMNT_MODULE, BC_RPT_ENTRY_MGMNT_MODULE, BC_RPT_ENTRY_SWITCH_MODULE, BC_RPT_ENTRY_BLADE, BC_RPT_ENTRY_BLADE_EXPANSION_CARD, BC_RPT_ENTRY_MEDIA_TRAY, BC_RPT_ENTRY_MEDIA_TRAY_2, BC_RPT_ENTRY_BLOWER_MODULE, BC_RPT_ENTRY_POWER_MODULE, BC_RPT_ENTRY_PHYSICAL_SLOT, BC_RPT_ENTRY_BEM_DASD, BC_RPT_ENTRY_ALARM_PANEL, BC_RPT_ENTRY_MUX_MODULE, BC_RPT_ENTRY_CLOCK_MODULE, BC_RPT_ENTRY_AIR_FILTER, BC_RPT_ENTRY_INTERPOSER_SWITCH, BC_RPT_ENTRY_INTERPOSER_MM } BCRptEntryT; /* Matching mmblade.mib definitions */ /* storageExpansion(1), */ /* pciExpansion(2) */ typedef enum { DEFAULT_BLADE_EXPANSION_CARD_TYPE = 0, BLADE_STORAGE_EXPANSION, BLADE_PCI_EXPANSION } BCExpansionTypeT; typedef enum { RSA_RPT_ENTRY_CHASSIS = 0, RSA_RPT_ENTRY_CPU, RSA_RPT_ENTRY_DASD, RSA_RPT_ENTRY_FAN } RSARptEntryT; /* Maximum number of RSA resources */ #define RSA_MAX_CPU 8 #define RSA_MAX_FAN 8 #define RSA_MAX_DASD 4 /* Maximum entries in eventlog, approximate */ #define BC_EL_MAX_SIZE 768 /* 512 */ /* OIDs definitions for Blade Center Chassis Topology */ #define SNMP_BC_NOS_FP_SUPPORTED ".1.3.6.1.4.1.2.3.51.2.22.4.18.0" /* chassisNoOfFPsSupported, FanPack */ #define SNMP_BC_NOS_PB_SUPPORTED ".1.3.6.1.4.1.2.3.51.2.22.4.19.0" /* chassisNoOfPBsSupported, ProcessorBlade */ #define SNMP_BC_NOS_SM_SUPPORTED ".1.3.6.1.4.1.2.3.51.2.22.4.20.0" /* chassisNoOfSMsSupported, SwitchModule */ #define SNMP_BC_NOS_MM_SUPPORTED ".1.3.6.1.4.1.2.3.51.2.22.4.21.0" /* chassisNoOfMMsSupported, ManagementModule */ #define SNMP_BC_NOS_PM_SUPPORTED ".1.3.6.1.4.1.2.3.51.2.22.4.22.0" /* chassisNoOfPMsSupported, PowerModule */ #define SNMP_BC_NOS_MT_SUPPORTED ".1.3.6.1.4.1.2.3.51.2.22.4.23.0" /* chassisNoOfMTsSupported, MediaTray */ #define SNMP_BC_NOS_BLOWER_SUPPORTED ".1.3.6.1.4.1.2.3.51.2.22.4.24.0" /* chassisNoOfBlowersSupported, Blower */ #define SNMP_BC_NOS_FILTER_SUPPORTED ".1.3.6.1.4.1.2.3.51.2.22.4.40.0" /* chassisNoOfFBsSupported, Front Bezel */ #define SNMP_BC_NOS_AP_SUPPORTED ".1.3.6.1.4.1.2.3.51.2.22.4.41.0" /* chassisNoOfAPsSupported, AlarmPanel */ #define SNMP_BC_NOS_NC_SUPPORTED ".1.3.6.1.4.1.2.3.51.2.22.4.42.0" /* chassisNoOfNCsSupported, NetworkClock Card */ #define SNMP_BC_NOS_MX_SUPPORTED ".1.3.6.1.4.1.2.3.51.2.22.4.43.0" /* chassisNoOfMXsSupported, Multiplexer Expansion Mod */ #define SNMP_BC_NOS_MMI_SUPPORTED ".1.3.6.1.4.1.2.3.51.2.22.4.44.0" /* chassisNoOfMMIsSupported, MM Interposer */ #define SNMP_BC_NOS_SMI_SUPPORTED ".1.3.6.1.4.1.2.3.51.2.22.4.45.0" /* chassisNoOfSMIsSupported, Switch Interposer */ #define SNMP_BC_PB_INSTALLED ".1.3.6.1.4.1.2.3.51.2.22.4.25.0" /* chassisPBsInstalled, ProcessorBlade */ #define SNMP_BC_SM_INSTALLED ".1.3.6.1.4.1.2.3.51.2.22.4.29.0" /* chassisSMsInstalled, SwitchModule */ #define SNMP_BC_MM_INSTALLED ".1.3.6.1.4.1.2.3.51.2.22.4.30.0" /* chassisMMsInstalled, ManagementModule */ #define SNMP_BC_PM_INSTALLED ".1.3.6.1.4.1.2.3.51.2.22.4.31.0" /* chassisPMsInstalled, PowerModule */ #define SNMP_BC_MT_INSTALLED ".1.3.6.1.4.1.2.3.51.2.22.4.32.0" /* chassisMTInstalled, MediaTray */ #define SNMP_BC_NOS_MT_INSTALLED ".1.3.6.1.4.1.2.3.51.2.22.4.52.0" /* chassisNoOfMTsInstalled, MediaTray */ #define SNMP_BC_BLOWER_INSTALLED ".1.3.6.1.4.1.2.3.51.2.22.4.33.0" /* chassisBlowersInstalled, Blower */ #define SNMP_BC_FP_INSTALLED ".1.3.6.1.4.1.2.3.51.2.22.4.37.0" /* chassisFPsinstalled, FanPack */ #define SNMP_BC_FILTER_INSTALLED ".1.3.6.1.4.1.2.3.51.2.22.4.46.0" /* chassisNoOfFBsInstalled, FrontBezel (Filter) */ #define SNMP_BC_AP_INSTALLED ".1.3.6.1.4.1.2.3.51.2.22.4.47.0" /* chassisNoOfAPsInstalled, AlarmPanel */ #define SNMP_BC_NC_INSTALLED ".1.3.6.1.4.1.2.3.51.2.22.4.48.0" /* chassisNoOfNCsInstalled, NetworkClock Card */ #define SNMP_BC_MX_INSTALLED ".1.3.6.1.4.1.2.3.51.2.22.4.49.0" /* chassisNoOfMXsInstalled, Multiplexer Expansion Mod */ #define SNMP_BC_MMI_INSTALLED ".1.3.6.1.4.1.2.3.51.2.22.4.50.0" /* chassisNoOfMMIsInstalled. MM Interposer*/ #define SNMP_BC_SMI_INSTALLED ".1.3.6.1.4.1.2.3.51.2.22.4.51.0" /* chassisNoOfSMIsInstalled, Switch Interposer */ #define SNMP_BC_NC_VPD_BAY_NUMBER ".1.3.6.1.4.1.2.3.51.2.2.21.16.1.1.2.x" /* ncHardwareVpdBayNumber, */ #define SNMP_BC_MX_VPD_BAY_NUMBER ".1.3.6.1.4.1.2.3.51.2.2.21.17.1.1.2.x" /* mxHardwareVpdBayNumber, */ #define SNMP_BC_SMI_VPD_BAY_NUMBER ".1.3.6.1.4.1.2.3.51.2.2.21.6.2.1.2.x" /* smInpHardwareVpdBayNumber, Switch Interposer VpsBayNumber */ #define SNMP_BC_BLADE_EXPANSION_VECTOR ".1.3.6.1.4.1.2.3.51.2.22.1.5.1.1.14.x" /* bladeServerExpansion */ #define SNMP_BC_BLADE_EXP_BLADE_BAY ".1.3.6.1.4.1.2.3.51.2.2.21.4.3.1.19.x" /* bladeExpBoardVpdBladeBayNumber */ #define SNMP_BC_BLADE_EXP_TYPE ".1.3.6.1.4.1.2.3.51.2.2.21.4.3.1.20.x" /* bladeExpBoardVpdCardType */ #define SNMP_BC_MGMNT_ACTIVE ".1.3.6.1.4.1.2.3.51.2.22.4.34.0" /* chassisActiveMM */ #define SNMP_BC_DST ".1.3.6.1.4.1.2.3.51.2.4.4.2.0" /* spClockTimezoneSetting */ #define SNMP_BC_DST_RSA ".1.3.6.1.4.1.2.3.51.1.4.4.2.0" #define SNMP_BC_CPU_OID_RSA ".1.3.6.1.4.1.2.3.51.1.2.20.1.5.1.1.3.x" #define SNMP_BC_DASD_OID_RSA ".1.3.6.1.4.1.2.3.51.1.2.20.1.6.1.1.3.x" #define SNMP_BC_FAN_OID_RSA ".1.3.6.1.4.1.2.3.51.1.2.3.x.0" /* OID definitions for System Event Log */ #define SNMP_BC_DATETIME_OID ".1.3.6.1.4.1.2.3.51.2.4.4.1.0" /* spClockDateAndTimeSetting */ #define SNMP_BC_DATETIME_OID_RSA ".1.3.6.1.4.1.2.3.51.1.4.4.1.0" #define SNMP_BC_SEL_INDEX_OID ".1.3.6.1.4.1.2.3.51.2.3.4.2.1.1" /* readEventLogIndex */ #define SNMP_BC_SEL_INDEX_OID_RSA ".1.3.6.1.4.1.2.3.51.1.3.4.2.1.1" #define SNMP_BC_SEL_ENTRY_OID ".1.3.6.1.4.1.2.3.51.2.3.4.2.1.2" /* readEventLogString */ #define SNMP_BC_SEL_ENTRY_OID_RSA ".1.3.6.1.4.1.2.3.51.1.3.4.2.1.2" #define SNMP_BC_SEL_CLEAR_OID ".1.3.6.1.4.1.2.3.51.2.3.4.3.0" /* clearEventLog */ #define SNMP_BC_SEL_CLEAR_OID_RSA ".1.3.6.1.4.1.2.3.51.1.3.4.3.0" /* mmHeathState OID */ #define SNMP_BC_MM_HEALTH_OID ".1.3.6.1.4.1.2.3.51.2.22.5.1.1.5.1" /* mmHealthState */ /* Slot ResourceTag */ #define SNMP_BC_PHYSICAL_SLOT "Blade Slot" #define SNMP_BC_SWITCH_SLOT "I/O Module Slot" #define SNMP_BC_POWER_SUPPLY_SLOT "Power Module Slot" #define SNMP_BC_PERIPHERAL_BAY_SLOT "Media Tray Slot" #define SNMP_BC_SYS_MGMNT_MODULE_SLOT "Management Module Slot" #define SNMP_BC_BLOWER_SLOT "Blower Slot" #define SNMP_BC_ALARM_PANEL_SLOT "Alarm Panel Slot" #define SNMP_BC_MUX_SLOT "Multiplexer Expansion Module Slot" #define SNMP_BC_CLOCK_SLOT "Network Clock Module Slot" /* Slot Power OIDs */ #define SNMP_BC_PD1POWERCURRENT ".1.3.6.1.4.1.2.3.51.2.2.10.2.1.1.7" /* pd1ModuleAllocatedPowerCurrent */ #define SNMP_BC_PD1POWERMAX ".1.3.6.1.4.1.2.3.51.2.2.10.2.1.1.8" /* pd1ModuleAllocatedPowerMax */ #define SNMP_BC_PD1POWERMIN ".1.3.6.1.4.1.2.3.51.2.2.10.2.1.1.9" /* pd1ModuleAllocatedPowerMin */ #define SNMP_BC_PD2POWERCURRENT ".1.3.6.1.4.1.2.3.51.2.2.10.3.1.1.7" /* pd2ModuleAllocatedPowerCurrent */ #define SNMP_BC_PD2POWERMAX ".1.3.6.1.4.1.2.3.51.2.2.10.3.1.1.8" /* pd2ModuleAllocatedPowerMax */ #define SNMP_BC_PD2POWERMIN ".1.3.6.1.4.1.2.3.51.2.2.10.3.1.1.9" /* pd2ModuleAllocatedPowerMin */ #define SNMP_BC_PD1STATE ".1.3.6.1.4.1.2.3.51.2.2.10.2.1.1.6" /* pd1ModuleState */ #define SNMP_BC_PD2STATE ".1.3.6.1.4.1.2.3.51.2.2.10.3.1.1.6" /* pd2ModuleState: standby(0), on(1), notPresent(2),notApplicable(255)*/ #define SNMP_BC_PMSTATE ".1.3.6.1.4.1.2.3.51.2.2.4.1.1.3" /* powerModuleState: unknown(0), good(1), warning(2), not available(3) */ /* Sensor and Control Numbers defined for Redundancy MM Implementation */ #define BLADECENTER_SENSOR_NUM_MGMNT_REDUNDANCY (SaHpiSensorNumT) 0x1001 #define BLADECENTER_SENSOR_NUM_MGMNT_ACTIVE (SaHpiSensorNumT) 0x1002 #define BLADECENTER_SENSOR_NUM_MGMNT_STANDBY (SaHpiSensorNumT) 0x1003 #define BLADECENTER_CTRL_NUM_MGMNT_FAILOVER (SaHpiCtrlNumT) 0x1010 #define BLADECENTER_CTRL_NUM_FAILED_RESOURCE_EXTRACT (SaHpiCtrlNumT) 0x101E /********************** * Resource Definitions **********************/ struct ResourceMibInfo { const char *OidReset; const char *OidPowerState; const char *OidPowerOnOff; const char *OidUuid; const char *OidResourceWidth; /* OID specifying how many physical slots a blade occupies */ }; /* SNMP_BC_MAX_RESOURCE_EVENT_ARRAY_SIZE includes an ending NULL entry */ #define SNMP_BC_MAX_EVENTS_PER_RESOURCE 10 #define SNMP_BC_MAX_RESOURCE_EVENT_ARRAY_SIZE (SNMP_BC_MAX_EVENTS_PER_RESOURCE + 1) /* For BladeCenter resources, some managed hot swap state events (e.g. INSERTION_PENDING and EXTRACTION_PENDING) are automatically generated. The "auto" fields below determine the auto-generated events. It's assummed that the INACTIVE state (0) never needs to be auto generated. */ struct res_event_map { char *event; SaHpiBoolT event_res_failure; SaHpiBoolT event_res_failure_unexpected; SaHpiHsStateT event_state; SaHpiHsStateT event_auto_state; SaHpiHsStateT recovery_state; SaHpiHsStateT recovery_auto_state; }; struct ResourceInfo { struct ResourceMibInfo mib; unsigned int resourcewidth; SaHpiHsStateT cur_state; SaHpiHsStateT prev_state; /* Needed to handle events that re-announce current hot swap state */ struct res_event_map event_array[SNMP_BC_MAX_RESOURCE_EVENT_ARRAY_SIZE]; }; struct snmp_rpt { SaHpiRptEntryT rpt; struct ResourceInfo res_info; const char *comment; const char *OidResourceTag; }; extern struct snmp_rpt snmp_bc_rpt_array[]; extern struct snmp_rpt snmp_bc_rpt_array_rsa[]; /******************** * Sensor Definitions ********************/ struct SnmpSensorThresholdOids { const char *LowMinor; const char *LowMajor; const char *LowCritical; const char *UpMinor; const char *UpMajor; const char *UpCritical; const char *PosThdHysteresis; const char *NegThdHysteresis; const char *TotalPosThdHysteresis; const char *TotalNegThdHysteresis; }; struct SnmpSensorWritableThresholdOids { const char *LowMinor; const char *LowMajor; const char *LowCritical; const char *UpMinor; const char *UpMajor; const char *UpCritical; const char *PosThdHysteresis; const char *NegThdHysteresis; }; struct SensorMibInfo { unsigned int not_avail_indicator_num; /* 0 for none, n>0 otherwise */ SaHpiBoolT write_only; /* TRUE - Write-only SNMP command */ const char *oid; SaHpiEntityLocationT loc_offset; struct SnmpSensorThresholdOids threshold_oids; struct SnmpSensorWritableThresholdOids threshold_write_oids; }; /* Size definitions include an ending NULL entry */ #define SNMP_BC_MAX_EVENTS_PER_SENSOR 128 #define SNMP_BC_MAX_READING_MAPS_PER_SENSOR 6 #define SNMP_BC_MAX_SENSOR_EVENT_ARRAY_SIZE (SNMP_BC_MAX_EVENTS_PER_SENSOR + 1) #define SNMP_BC_MAX_SENSOR_READING_MAP_ARRAY_SIZE (SNMP_BC_MAX_READING_MAPS_PER_SENSOR + 1) /* If you add to this structure, you may also have to change EventMapInfoT and event discovery in snmp_bc_event.c */ struct sensor_event_map { char *event; SaHpiBoolT event_assertion; SaHpiBoolT event_res_failure; SaHpiBoolT event_res_failure_unexpected; SaHpiEventStateT event_state; SaHpiEventStateT recovery_state; }; struct sensor_reading_map { int num; SaHpiSensorRangeT rangemap; SaHpiEventStateT state; }; struct SensorInfo { struct SensorMibInfo mib; SaHpiEventStateT cur_state; /* This really records the last state read from the SEL */ /* Which may not be the current state of the sensor */ SaHpiResourceIdT cur_child_rid; SaHpiBoolT sensor_enabled; SaHpiBoolT events_enabled; SaHpiEventStateT assert_mask; SaHpiEventStateT deassert_mask; struct sensor_event_map event_array[SNMP_BC_MAX_SENSOR_EVENT_ARRAY_SIZE]; struct sensor_reading_map reading2event[SNMP_BC_MAX_SENSOR_READING_MAP_ARRAY_SIZE]; }; /* Usually sensor.Num = index in snmp_bc_resources.c. But to support HPI-defined sensor numbers (e.g. aggregate sensors), they can be different. sensor.Num supports the HPI sensor number while index is used to search through the plugin's sensor definition arrays */ struct snmp_bc_sensor { int index; SaHpiSensorRecT sensor; struct SensorInfo sensor_info; const char *comment; }; struct snmp_bc_ipmi_sensor { const char *ipmi_tag; const char *ipmi_tag_alias1; struct snmp_bc_sensor ipmi; }; extern struct snmp_bc_sensor snmp_bc_chassis_sensors[]; extern struct snmp_bc_sensor snmp_bc_chassis_sensors_bct_filter[]; extern struct snmp_bc_sensor snmp_bc_blade_sensors[]; extern struct snmp_bc_ipmi_sensor snmp_bc_blade_ipmi_sensors[]; extern struct snmp_bc_sensor snmp_bc_bem_sensors[]; extern struct snmp_bc_ipmi_sensor snmp_bc_bem_ipmi_sensors[]; extern struct snmp_bc_sensor snmp_bc_bse_dasd_sensors[]; extern struct snmp_bc_sensor snmp_bc_bse3_dasd_sensors[]; extern struct snmp_bc_sensor snmp_bc_mgmnt_sensors[]; extern struct snmp_bc_sensor snmp_bc_mgmnt_health_sensors[]; extern struct snmp_bc_sensor snmp_bc_virtual_mgmnt_sensors[]; extern struct snmp_bc_sensor snmp_bc_mediatray_sensors[]; extern struct snmp_bc_sensor snmp_bc_mediatray_sensors_faultled[]; extern struct snmp_bc_sensor snmp_bc_mediatray_sensors_nofaultled[]; extern struct snmp_bc_sensor snmp_bc_mediatray2_sensors[]; extern struct snmp_bc_sensor snmp_bc_blower_sensors[]; extern struct snmp_bc_sensor snmp_bc_blower_sensors_bch[]; extern struct snmp_bc_sensor snmp_bc_power_sensors[]; extern struct snmp_bc_sensor snmp_bc_power_sensors_bch[]; extern struct snmp_bc_sensor snmp_bc_switch_sensors[]; extern struct snmp_bc_sensor snmp_bc_slot_sensors[]; extern struct snmp_bc_sensor snmp_bc_alarm_sensors[]; extern struct snmp_bc_sensor snmp_bc_mux_sensors[]; extern struct snmp_bc_sensor snmp_bc_clock_sensors[]; extern struct snmp_bc_sensor snmp_bc_filter_sensors[]; extern struct snmp_bc_sensor snmp_bc_chassis_sensors_rsa[]; extern struct snmp_bc_sensor snmp_bc_cpu_sensors_rsa[]; extern struct snmp_bc_sensor snmp_bc_dasd_sensors_rsa[]; extern struct snmp_bc_sensor snmp_bc_fan_sensors_rsa[]; /********************* * Control Definitions *********************/ struct ControlMibInfo { unsigned int not_avail_indicator_num; /* 0 for none, n>0 otherwise */ int write_only; /* Write-only SNMP command; 0 no; 1 yes */ const char *oid; SaHpiEntityLocationT loc_offset; int digitalmap[OH_MAX_CTRLSTATEDIGITAL]; /* Readable digital controls */ int digitalwmap[OH_MAX_CTRLSTATEDIGITAL]; /* Writable digital controls */ SaHpiBoolT isDigitalReadStateConstant; SaHpiCtrlStateDigitalT DigitalStateConstantValue; }; struct ControlInfo { struct ControlMibInfo mib; SaHpiCtrlModeT cur_mode; SaHpiCtrlStateUnionT valid_states_get; /* Only meaningful for Digital Controls */ SaHpiCtrlStateUnionT allowed_states_set; /* Only meaningful for Digital Controls */ }; /* Usually control.Num = index in snmp_bc_resources.c. But to support ATCA/HPI defined control numbers, they can be different. control.Num supports the HPI control number while index is used to search through the plugin's control definition arrays */ struct snmp_bc_control { int index; SaHpiCtrlRecT control; struct ControlInfo control_info; const char *comment; }; extern struct snmp_bc_control snmp_bc_chassis_controls_bc[]; extern struct snmp_bc_control snmp_bc_chassis_controls_bct[]; extern struct snmp_bc_control snmp_bc_blade_controls[]; extern struct snmp_bc_control snmp_bc_bem_controls[]; extern struct snmp_bc_control snmp_bc_mgmnt_controls[]; extern struct snmp_bc_control snmp_bc_virtual_mgmnt_controls[]; extern struct snmp_bc_control snmp_bc_mediatray_controls[]; extern struct snmp_bc_control snmp_bc_mediatray2_controls[]; extern struct snmp_bc_control snmp_bc_blower_controls[]; extern struct snmp_bc_control snmp_bc_power_controls[]; extern struct snmp_bc_control snmp_bc_switch_controls[]; extern struct snmp_bc_control snmp_bc_slot_controls[]; extern struct snmp_bc_control snmp_bc_bem_dasd_controls[]; extern struct snmp_bc_control snmp_bc_alarm_controls[]; extern struct snmp_bc_control snmp_bc_mux_controls[]; extern struct snmp_bc_control snmp_bc_clock_controls[]; extern struct snmp_bc_control snmp_bc_filter_controls[]; extern struct snmp_bc_control snmp_bc_chassis_controls_rsa[]; extern struct snmp_bc_control snmp_bc_cpu_controls_rsa[]; extern struct snmp_bc_control snmp_bc_dasd_controls_rsa[]; extern struct snmp_bc_control snmp_bc_fan_controls_rsa[]; /*********************** * Inventory Definitions ***********************/ struct SnmpInventoryOids { const char *OidChassisType; const char *OidMfgDateTime; const char *OidManufacturer; const char *OidProductName; const char *OidProductVersion; const char *OidSerialNumber; const char *OidPartNumber; const char *OidFileId; const char *OidAssetTag; }; struct InventoryMibInfo { unsigned int not_avail_indicator_num; /* 0 for none, n>0 otherwise */ int write_only; /* Write-only SNMP command; 0 no; 1 yes */ SaHpiIdrAreaTypeT area_type; struct SnmpInventoryOids oid; }; struct InventoryInfo { struct InventoryMibInfo hardware_mib; struct InventoryMibInfo firmware_mib; }; struct snmp_bc_inventory { SaHpiInventoryRecT inventory; struct InventoryInfo inventory_info; const char *comment; }; extern struct snmp_bc_inventory snmp_bc_chassis_inventories[]; extern struct snmp_bc_inventory snmp_bc_blower_inventories[]; extern struct snmp_bc_inventory snmp_bc_mgmnt_inventories[]; extern struct snmp_bc_inventory snmp_bc_virtual_mgmnt_inventories[]; extern struct snmp_bc_inventory snmp_bc_switch_inventories[]; extern struct snmp_bc_inventory snmp_bc_blade_inventories[]; extern struct snmp_bc_inventory snmp_bc_bem_inventories[]; extern struct snmp_bc_inventory snmp_bc_mediatray_inventories[]; extern struct snmp_bc_inventory snmp_bc_mediatray2_inventories[]; extern struct snmp_bc_inventory snmp_bc_power_inventories[]; extern struct snmp_bc_inventory snmp_bc_slot_inventories[]; extern struct snmp_bc_inventory snmp_bc_bem_dasd_inventories[]; extern struct snmp_bc_inventory snmp_bc_alarm_inventories[]; extern struct snmp_bc_inventory snmp_bc_mux_inventories[]; extern struct snmp_bc_inventory snmp_bc_clock_inventories[]; extern struct snmp_bc_inventory snmp_bc_filter_inventories[]; extern struct snmp_bc_inventory snmp_bc_interposer_switch_inventories[]; extern struct snmp_bc_inventory snmp_bc_interposer_mm_inventories[]; extern struct snmp_bc_inventory snmp_bc_chassis_inventories_rsa[]; extern struct snmp_bc_inventory snmp_bc_cpu_inventories_rsa[]; extern struct snmp_bc_inventory snmp_bc_dasd_inventories_rsa[]; extern struct snmp_bc_inventory snmp_bc_fan_inventories_rsa[]; #endif openhpi-2.14.1/plugins/snmp_bc/snmp_bc_el2event.h0000644000076400007640000000345411302566770016706 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004, 2006 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. */ #ifndef __EL2EVENT_H #define __EL2EVENT_H #define HPIDUP_STRING "_HPIDUP" #define NO_OVR 0x0000000000000000 /* No overrides */ #define OVR_SEV 0x0000000000000001 /* Override Error Log's severity */ #define OVR_RID 0x0000000000000010 /* Override Error Log's source */ #define OVR_EXP 0x0000000000000100 /* Override Error Log's source for expansion cards */ #define OVR_VMM 0x0000000000001000 /* Override Error Log's source for VMM */ #define OVR_MM1 0x0000000000010000 /* Override Error Log's source for MM 1 */ #define OVR_MM2 0x0000000000100000 /* Override Error Log's source for MM 2 */ #define OVR_MM_STBY 0x0000000001000000 /* Override Error Log's source - set resource to standby MM */ #define OVR_MM_PRIME 0x0000000010000000 /* Override Error Log's source - set resource to primary MM */ typedef struct { gchar *event; SaHpiSeverityT event_sev; unsigned long long event_ovr; short event_dup; } ErrLog2EventInfoT; /* Global "Error Log to Event" mapping hash table and usage count */ extern GHashTable *errlog2event_hash; extern unsigned int errlog2event_hash_use_count; SaErrorT errlog2event_hash_init(struct snmp_bc_hnd *custom_handle); SaErrorT errlog2event_hash_free(void); /* XML event code and mapping structures */ extern char *eventxml; struct errlog2event_hash_info { GHashTable *hashtable; }; #endif openhpi-2.14.1/plugins/snmp_bc/snmp_bc_discover_bc.c0000644000076400007640000053410211302566770017436 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004, 2006 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * Peter Phan * Steve Sherman */ #include #include #include static void free_hash_data(gpointer key, gpointer value, gpointer user_data); struct SensorMibInfo snmp_bc_ipmi_sensors_temp[SNMP_BC_MAX_IPMI_TEMP_SENSORS] = { { /* Generic IPMI Temp Sensor 1 */ .not_avail_indicator_num = 0, .write_only = SAHPI_FALSE, .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.3.1.12.x", .threshold_oids = { .UpCritical = ".1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.22.x", .UpMajor = ".1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.23.x", }, .threshold_write_oids = {}, }, { /* Generic IPMI Temp Sensor 2 */ .not_avail_indicator_num = 0, .write_only = SAHPI_FALSE, .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.3.1.13.x", .threshold_oids = { .UpCritical = ".1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.25.x", .UpMajor = ".1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.26.x", }, .threshold_write_oids = {}, }, { /* Generic IPMI Temp Sensor 3 */ .not_avail_indicator_num = 0, .write_only = SAHPI_FALSE, .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.3.1.14.x", .threshold_oids = { .UpCritical = ".1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.28.x", .UpMajor = ".1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.29.x", }, .threshold_write_oids = {}, }, { /* Generic IPMI Temp Sensor 4 */ .not_avail_indicator_num = 0, .write_only = SAHPI_FALSE, .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.3.1.15.x", .threshold_oids = { .UpCritical = ".1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.31.x", .UpMajor = ".1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.32.x", }, .threshold_write_oids = {}, }, { /* Generic IPMI Temp Sensor 5 */ .not_avail_indicator_num = 0, .write_only = SAHPI_FALSE, .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.3.1.16.x", .threshold_oids = { .UpCritical = ".1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.34.x", .UpMajor = ".1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.35.x", }, .threshold_write_oids = {}, }, { /* Generic IPMI Temp Sensor 6 */ .not_avail_indicator_num = 0, .write_only = SAHPI_FALSE, .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.3.1.17.x", .threshold_oids = { .UpCritical = ".1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.37.x", .UpMajor = ".1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.38.x", }, .threshold_write_oids = {}, }, }; struct SensorMibInfo snmp_bc_ipmi_sensors_voltage[SNMP_BC_MAX_IPMI_VOLTAGE_SENSORS] = { { /* Generic IPMI Voltage Sensor 1 */ .not_avail_indicator_num = 0, .write_only = SAHPI_FALSE, .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.15.x", .threshold_oids = { .UpMajor = ".1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.23.x", .LowMajor = ".1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.24.x", }, .threshold_write_oids = {}, }, { /* Generic IPMI Voltage Sensor 2 */ .not_avail_indicator_num = 0, .write_only = SAHPI_FALSE, .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.16.x", .threshold_oids = { .UpMajor = ".1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.25.x", .LowMajor = ".1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.26.x", }, .threshold_write_oids = {}, }, { /* Generic IPMI Voltage Sensor 3 */ .not_avail_indicator_num = 0, .write_only = SAHPI_FALSE, .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.17.x", .threshold_oids = { .UpMajor = ".1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.27.x", .LowMajor = ".1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.28.x", }, .threshold_write_oids = {}, }, { /* Generic IPMI Voltage Sensor 4 */ .not_avail_indicator_num = 0, .write_only = SAHPI_FALSE, .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.18.x", .threshold_oids = { .UpMajor = ".1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.29.x", .LowMajor = ".1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.30.x", }, .threshold_write_oids = {}, }, { /* Generic IPMI Voltage Sensor 5 */ .not_avail_indicator_num = 0, .write_only = SAHPI_FALSE, .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.19.x", .threshold_oids = { .UpMajor = ".1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.31.x", .LowMajor = ".1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.32.x", }, .threshold_write_oids = {}, }, { /* Generic IPMI Voltage Sensor 6 */ .not_avail_indicator_num = 0, .write_only = SAHPI_FALSE, .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.20.x", .threshold_oids = { .UpMajor = ".1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.33.x", .LowMajor = ".1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.34.x", }, .threshold_write_oids = {}, }, { /* Generic IPMI Voltage Sensor 7 */ .not_avail_indicator_num = 0, .write_only = SAHPI_FALSE, .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.21.x", .threshold_oids = { .UpMajor = ".1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.35.x", .LowMajor = ".1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.36.x", }, .threshold_write_oids = {}, }, { /* Generic IPMI Voltage Sensor 8 */ .not_avail_indicator_num = 0, .write_only = SAHPI_FALSE, .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.22.x", .threshold_oids = { .UpMajor = ".1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.37.x", .LowMajor = ".1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.38.x", }, .threshold_write_oids = {}, }, { /* Generic IPMI Voltage Sensor 9 */ .not_avail_indicator_num = 0, .write_only = SAHPI_FALSE, .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.23.x", .threshold_oids = { .UpMajor = ".1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.39.x", .LowMajor = ".1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.40.x", }, .threshold_write_oids = {}, }, { /* Generic IPMI Voltage Sensor 10 */ .not_avail_indicator_num = 0, .write_only = SAHPI_FALSE, .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.24.x", .threshold_oids = { .UpMajor = ".1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.41.x", .LowMajor = ".1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.42.x", }, .threshold_write_oids = {}, }, { /* Generic IPMI Voltage Sensor 11 */ .not_avail_indicator_num = 0, .write_only = SAHPI_FALSE, .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.25.x", .threshold_oids = { .UpMajor = ".1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.43.x", .LowMajor = ".1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.44.x", }, .threshold_write_oids = {}, }, { /* Generic IPMI Voltage Sensor 12 */ .not_avail_indicator_num = 0, .write_only = SAHPI_FALSE, .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.26.x", .threshold_oids = { .UpMajor = ".1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.45.x", .LowMajor = ".1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.46.x", }, .threshold_write_oids = {}, }, { /* Generic IPMI Voltage Sensor 13 */ .not_avail_indicator_num = 0, .write_only = SAHPI_FALSE, .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.27.x", .threshold_oids = { .UpMajor = ".1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.47.x", .LowMajor = ".1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.48.x", }, .threshold_write_oids = {}, }, { /* Generic IPMI Voltage Sensor 14 */ .not_avail_indicator_num = 0, .write_only = SAHPI_FALSE, .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.28.x", .threshold_oids = { .UpMajor = ".1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.49.x", .LowMajor = ".1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.50.x", }, .threshold_write_oids = {}, }, { /* Generic IPMI Voltage Sensor 15 */ .not_avail_indicator_num = 0, .write_only = SAHPI_FALSE, .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.29.x", .threshold_oids = { .UpMajor = ".1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.51.x", .LowMajor = ".1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.52.x", }, .threshold_write_oids = {}, }, { /* Generic IPMI Voltage Sensor 16 */ .not_avail_indicator_num = 0, .write_only = SAHPI_FALSE, .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.30.x", .threshold_oids = { .UpMajor = ".1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.53.x", .LowMajor = ".1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.54.x", }, .threshold_write_oids = {}, }, { /* Generic IPMI Voltage Sensor 17 */ .not_avail_indicator_num = 0, .write_only = SAHPI_FALSE, .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.31.x", .threshold_oids = { .UpMajor = ".1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.55.x", .LowMajor = ".1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.56.x", }, .threshold_write_oids = {}, }, { /* Generic IPMI Voltage Sensor 18 */ .not_avail_indicator_num = 0, .write_only = SAHPI_FALSE, .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.32.x", .threshold_oids = { .UpMajor = ".1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.57.x", .LowMajor = ".1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.58.x", }, .threshold_write_oids = {}, }, { /* Generic IPMI Voltage Sensor 19 */ .not_avail_indicator_num = 0, .write_only = SAHPI_FALSE, .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.33.x", .threshold_oids = { .UpMajor = ".1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.59.x", .LowMajor = ".1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.60.x", }, .threshold_write_oids = {}, }, { /* Generic IPMI Voltage Sensor 20 */ .not_avail_indicator_num = 0, .write_only = SAHPI_FALSE, .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.34.x", .threshold_oids = { .UpMajor = ".1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.61.x", .LowMajor = ".1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.62.x", }, .threshold_write_oids = {}, }, { /* Generic IPMI Voltage Sensor 21 */ .not_avail_indicator_num = 0, .write_only = SAHPI_FALSE, .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.35.x", .threshold_oids = { .UpMajor = ".1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.63.x", .LowMajor = ".1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.64.x", }, .threshold_write_oids = {}, }, { /* Generic IPMI Voltage Sensor 22 */ .not_avail_indicator_num = 0, .write_only = SAHPI_FALSE, .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.36.x", .threshold_oids = { .UpMajor = ".1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.65.x", .LowMajor = ".1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.66.x", }, .threshold_write_oids = {}, }, { /* Generic IPMI Voltage Sensor 23 */ .not_avail_indicator_num = 0, .write_only = SAHPI_FALSE, .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.37.x", .threshold_oids = { .UpMajor = ".1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.67.x", .LowMajor = ".1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.68.x", }, .threshold_write_oids = {}, }, { /* Generic IPMI Voltage Sensor 24 */ .not_avail_indicator_num = 0, .write_only = SAHPI_FALSE, .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.38.x", .threshold_oids = { .UpMajor = ".1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.69.x", .LowMajor = ".1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.70.x", }, .threshold_write_oids = {}, }, { /* Generic IPMI Voltage Sensor 25 */ .not_avail_indicator_num = 0, .write_only = SAHPI_FALSE, .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.39.x", .threshold_oids = { .UpMajor = ".1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.71.x", .LowMajor = ".1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.72.x", }, .threshold_write_oids = {}, }, { /* Generic IPMI Voltage Sensor 26 */ .not_avail_indicator_num = 0, .write_only = SAHPI_FALSE, .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.40.x", .threshold_oids = { .UpMajor = ".1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.73.x", .LowMajor = ".1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.74.x", }, .threshold_write_oids = {}, }, { /* Generic IPMI Voltage Sensor 27 */ .not_avail_indicator_num = 0, .write_only = SAHPI_FALSE, .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.41.x", .threshold_oids = { .UpMajor = ".1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.75.x", .LowMajor = ".1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.76.x", }, .threshold_write_oids = {}, }, { /* Generic IPMI Voltage Sensor 28 */ .not_avail_indicator_num = 0, .write_only = SAHPI_FALSE, .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.42.x", .threshold_oids = { .UpMajor = ".1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.77.x", .LowMajor = ".1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.78.x", }, .threshold_write_oids = {}, }, { /* Generic IPMI Voltage Sensor 29 */ .not_avail_indicator_num = 0, .write_only = SAHPI_FALSE, .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.43.x", .threshold_oids = { .UpMajor = ".1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.79.x", .LowMajor = ".1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.80.x", }, .threshold_write_oids = {}, }, { /* Generic IPMI Voltage Sensor 30 */ .not_avail_indicator_num = 0, .write_only = SAHPI_FALSE, .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.44.x", .threshold_oids = { .UpMajor = ".1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.81.x", .LowMajor = ".1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.82.x", }, .threshold_write_oids = {}, }, }; static SaErrorT snmp_bc_discover_ipmi_sensors(struct oh_handler_state *handle, struct snmp_bc_ipmi_sensor *sensor_array, struct oh_event *res_oh_event); /* Matching mmblade.mib definitions */ /* storageExpansion(1), */ /* pciExpansion(2) */ char *bladeexpansiondesc[] = { "Blade Expansion Module, BEM", "Blade Storage Expansion, BSE", "Blade PCI I/O Expansion, PEU" }; /** * snmp_bc_discover: * @handler: Pointer to handler's data. * @ep_root: Pointer to chassis Root Entity Path which comes from openhpi.conf. * * Discovers IBM BladeCenter resources and RDRs. * * Return values: * SA_OK - normal case * SA_ERR_HPI_DUPLICATE - There is no changes to BladeCenter resource masks; normal case for re-discovery. * SA_ERR_HPI_OUT_OF_MEMORY - Cannot allocate space for internal memory. * SA_ERR_HPI_INVALID_PARAMS - Pointer parameter(s) NULL. **/ SaErrorT snmp_bc_discover(struct oh_handler_state *handle, SaHpiEntityPathT *ep_root) { SaErrorT err; struct snmp_value get_value_blade, get_value_blower, get_value_power_module, get_value_switch, get_value_media, get_value_mm, get_value_tap, get_value_nc, get_value_mx, get_value_smi, get_value_filter, get_value_mmi; struct snmp_bc_hnd *custom_handle; if (!handle || !ep_root) { err("Invalid parameter."); return(SA_ERR_HPI_INVALID_PARAMS); } custom_handle = (struct snmp_bc_hnd *)handle->data; if (!custom_handle) { err("Invalid parameter."); return(SA_ERR_HPI_INVALID_PARAMS); } /* If this is a rediscovery, then sync event log before all else. */ /* If event log synchronization process finds any hotswap event, */ /* eventlog synchronization process will kick off a targeted discovery*/ /* for the hotswap resource. This is for both removal and installation*/ if (custom_handle->isFirstDiscovery == SAHPI_FALSE) err = snmp_bc_check_selcache(handle, 1, SAHPI_NEWEST_ENTRY); /************************************************************** * Fetch various resource installation vectors from BladeCenter **************************************************************/ /* Fetch blade installed vector */ get_installed_mask(SNMP_BC_PB_INSTALLED, get_value_blade); /* Fetch switch installed vector */ get_installed_mask(SNMP_BC_SM_INSTALLED, get_value_switch); /* Fetch MM installed vector */ get_installed_mask(SNMP_BC_MM_INSTALLED, get_value_mm); /* Fetch power module installed vector */ get_installed_mask(SNMP_BC_PM_INSTALLED, get_value_power_module); /* Fetch media tray installed vector */ /* get_dualmode_object(SNMP_BC_MT_INSTALLED, get_value_media); */ snmp_bc_fetch_MT_install_mask(handle, &get_value_media); /* Fetch filter (front bezel) installed vector */ get_dualmode_object(SNMP_BC_FILTER_INSTALLED, get_value_filter); /* Fetch blower installed vector */ get_installed_mask(SNMP_BC_BLOWER_INSTALLED, get_value_blower); /* Fetch telco-alarm-panel installed vector */ get_installed_mask(SNMP_BC_AP_INSTALLED, get_value_tap); /* Fetch network-clock-card installed vector */ get_installed_mask(SNMP_BC_NC_INSTALLED, get_value_nc); /* Fetch mux-card installed vector */ get_installed_mask(SNMP_BC_MX_INSTALLED, get_value_mx); /* Fetch switch interposer-card installed vector */ get_installed_mask(SNMP_BC_SMI_INSTALLED, get_value_smi); /* Fetch mm interposer-card installed vector */ get_installed_mask(SNMP_BC_MMI_INSTALLED, get_value_mmi); if ( (g_ascii_strncasecmp(get_value_blade.string, custom_handle->installed_pb_mask, get_value_blade.str_len) == 0) && (g_ascii_strncasecmp(get_value_blower.string, custom_handle->installed_blower_mask, get_value_blower.str_len) == 0) && (g_ascii_strncasecmp(get_value_power_module.string, custom_handle->installed_pm_mask, get_value_power_module.str_len) == 0) && (g_ascii_strncasecmp(get_value_switch.string, custom_handle->installed_sm_mask, get_value_switch.str_len) == 0) && (g_ascii_strncasecmp(get_value_mm.string, custom_handle->installed_mm_mask, get_value_mm.str_len) == 0) && (g_ascii_strncasecmp(get_value_tap.string, custom_handle->installed_tap_mask, get_value_tap.str_len) == 0) && (g_ascii_strncasecmp(get_value_nc.string, custom_handle->installed_nc_mask, get_value_nc.str_len) == 0) && (g_ascii_strncasecmp(get_value_mx.string, custom_handle->installed_mx_mask, get_value_mx.str_len) == 0) && (g_ascii_strncasecmp(get_value_mmi.string, custom_handle->installed_mmi_mask, get_value_smi.str_len) == 0) && (g_ascii_strncasecmp(get_value_smi.string, custom_handle->installed_smi_mask, get_value_smi.str_len) == 0) && (get_value_filter.integer == custom_handle->installed_filter_mask) && (get_value_media.integer == custom_handle->installed_mt_mask) ) { /**************************************************** * If **ALL** the resource masks are still the same, * do not rediscover, return with special return code ****************************************************/ return(SA_ERR_HPI_DUPLICATE); } else { /************************************************************* * Set saved masks to the newly read values * Use strcpy() instead of strncpy(), counting on snmp_utils.c * to NULL terminate strings read from snmp agent *************************************************************/ err = snmp_bc_update_chassis_topo(handle); if (err != SA_OK) return (err); strncpy(custom_handle->installed_pb_mask, get_value_blade.string, SNMP_BC_MAX_RESOURCES_MASK); strncpy(custom_handle->installed_blower_mask, get_value_blower.string, SNMP_BC_MAX_RESOURCES_MASK); strncpy(custom_handle->installed_pm_mask, get_value_power_module.string, SNMP_BC_MAX_RESOURCES_MASK); strncpy(custom_handle->installed_smi_mask, get_value_smi.string, SNMP_BC_MAX_RESOURCES_MASK); strncpy(custom_handle->installed_sm_mask, get_value_switch.string, SNMP_BC_MAX_RESOURCES_MASK); strncpy(custom_handle->installed_mmi_mask, get_value_mmi.string, SNMP_BC_MAX_RESOURCES_MASK); strncpy(custom_handle->installed_mm_mask, get_value_mm.string, SNMP_BC_MAX_RESOURCES_MASK); strncpy(custom_handle->installed_tap_mask, get_value_tap.string, SNMP_BC_MAX_RESOURCES_MASK); strncpy(custom_handle->installed_nc_mask, get_value_nc.string, SNMP_BC_MAX_RESOURCES_MASK); strncpy(custom_handle->installed_mx_mask, get_value_mx.string, SNMP_BC_MAX_RESOURCES_MASK); custom_handle->installed_mt_mask = get_value_media.integer; custom_handle->installed_filter_mask = get_value_filter.integer; } /****************************** * Discover BladeCenter Chassis ******************************/ err = snmp_bc_discover_chassis(handle, ep_root); if (err != SA_OK) return(err); /****************************** * Discover ALL BladeCenter Slots * Warning: * Discovery of Physical Slots must come **before** discovery of sloted resources. * Discovery of slots sets Slot State Sensor to empty. * Subsequent resource discovery changes state of Slot State Sensor accordingly. ******************************/ err = snmp_bc_discover_all_slots(handle, ep_root); if (err != SA_OK) return(err); /***************** * Discover Blades *****************/ err = snmp_bc_discover_blade(handle, ep_root,get_value_blade.string); if (err != SA_OK) return(err); /****************** * Discover Blowers ******************/ err = snmp_bc_discover_blowers(handle, ep_root, get_value_blower.string); if (err != SA_OK) return(err); /************************ * Discover Power Modules ************************/ err = snmp_bc_discover_power_module(handle, ep_root, get_value_power_module.string); if (err != SA_OK) return(err); /*********************************** * Discover Switch Module Interposers (smi) * It is **important** to update custom_handle->installed_smi_mask * **prior** to switch discovery (discover_sm) ***********************************/ err = snmp_bc_discover_smi(handle, ep_root, get_value_smi.string); if (err != SA_OK) return(err); /******************* * Discover Switches *******************/ err = snmp_bc_discover_switch(handle, ep_root, get_value_switch.string); if (err != SA_OK) return(err); /********************** * Discover Media Trays **********************/ err = snmp_bc_discover_media_tray(handle, ep_root, get_value_media.integer); if (err != SA_OK) return(err); /********************** * Discover Filter (Front Bezel) **********************/ err = snmp_bc_discover_filter(handle, ep_root, get_value_filter.integer); if (err != SA_OK) return(err); /*********************************** * Discover Management Module Interposers (mmi) * It is **important** to update custom_handle->installed_mmi_mask * **prior** to mm discovery (discover_mm) ***********************************/ err = snmp_bc_discover_mmi(handle, ep_root, get_value_mmi.string); if (err != SA_OK) return(err); /*********************************** * Discover Management Modules (MMs) ***********************************/ err = snmp_bc_discover_mm(handle, ep_root, get_value_mm.string, SAHPI_TRUE); if (err != SA_OK) return(err); /*********************************** * Discover Telco Alarm Panel (TAPs) ***********************************/ err = snmp_bc_discover_tap(handle, ep_root, get_value_tap.string); if (err != SA_OK) return(err); /*********************************** * Discover Network Clock Cards (nc) ***********************************/ err = snmp_bc_discover_nc(handle, ep_root, get_value_nc.string); if (err != SA_OK) return(err); /*********************************** * Discover Mux Cards (mx) ***********************************/ err = snmp_bc_discover_mx(handle, ep_root, get_value_mx.string); if (err != SA_OK) return(err); return(SA_OK); } /** * snmp_bc_update_chassis_topo: * @handler: Pointer to handler's data. * * Update OpenHPI snmp_bc chassis topology from BladeCenter. * * Return values: * SA_OK - normal case. **/ SaErrorT snmp_bc_update_chassis_topo(struct oh_handler_state *handle) { SaErrorT err; struct snmp_value get_value; struct snmp_bc_hnd *custom_handle; if (!handle) { err("Invalid parameter."); return(SA_ERR_HPI_INVALID_PARAMS); } custom_handle = (struct snmp_bc_hnd *)handle->data; if (!custom_handle) { err("Invalid parameter."); return(SA_ERR_HPI_INVALID_PARAMS); } if (custom_handle->isFirstDiscovery == SAHPI_TRUE) { get_integer_object(SNMP_BC_NOS_PB_SUPPORTED, get_value); custom_handle->max_pb_supported = get_value.integer; /* pb - processor blade */ get_integer_object(SNMP_BC_NOS_SMI_SUPPORTED, get_value); custom_handle->max_smi_supported = get_value.integer; /* smi - switch interposer */ get_integer_object(SNMP_BC_NOS_SM_SUPPORTED, get_value); custom_handle->max_sm_supported = get_value.integer; /* sm - switch module */ get_integer_object(SNMP_BC_NOS_MMI_SUPPORTED, get_value); custom_handle->max_mmi_supported = get_value.integer; /* mmi - mm interposer */ get_integer_object(SNMP_BC_NOS_MM_SUPPORTED, get_value); custom_handle->max_mm_supported = get_value.integer; /* mm - management module */ get_integer_object(SNMP_BC_NOS_PM_SUPPORTED, get_value); custom_handle->max_pm_supported = get_value.integer; /* pm - power module */ get_integer_object(SNMP_BC_NOS_MT_SUPPORTED, get_value); custom_handle->max_mt_supported = get_value.integer; /* mt - media tray */ get_integer_object(SNMP_BC_NOS_BLOWER_SUPPORTED, get_value); custom_handle->max_blower_supported = get_value.integer; /* blower - blower */ get_integer_object(SNMP_BC_NOS_FILTER_SUPPORTED, get_value); custom_handle->max_filter_supported = get_value.integer; /* filter - front bezel */ get_integer_object(SNMP_BC_NOS_AP_SUPPORTED, get_value); custom_handle->max_tap_supported = get_value.integer; /* ap - alarm panel */ get_integer_object(SNMP_BC_NOS_NC_SUPPORTED, get_value); custom_handle->max_nc_supported = get_value.integer; /* nc - network clock */ get_integer_object(SNMP_BC_NOS_MX_SUPPORTED, get_value); custom_handle->max_mx_supported = get_value.integer; /* mx - multiplex (mux) */ } return(SA_OK); } /** * snmp_bc_discover_media_tray: * @handler: Pointer to handler's data. * @ep_root: Pointer to chassis Root Entity Path which comes from openhpi.conf. * @media_tray_installed: Media tray installed flag. * * Discovers media tray resources and their RDRs. * * Return values: * SA_OK - normal case. * SA_ERR_HPI_OUT_OF_MEMORY - Cannot allocate space for internal memory. * SA_ERR_HPI_INVALID_PARAMS - Pointer parameters are NULL. **/ SaErrorT snmp_bc_discover_media_tray(struct oh_handler_state *handle, SaHpiEntityPathT *ep_root, int media_tray_installed) { SaErrorT err; guint mt_width; struct oh_event *e; struct snmp_value get_value; struct ResourceInfo *res_info_ptr; struct snmp_bc_hnd *custom_handle; if (!handle || !ep_root) { err("Invalid parameter."); return(SA_ERR_HPI_INVALID_PARAMS); } custom_handle = (struct snmp_bc_hnd *)handle->data; if (!custom_handle) { err("Invalid parameter."); return(SA_ERR_HPI_INVALID_PARAMS); } e = snmp_bc_alloc_oh_event(); if (e == NULL) { err("Out of memory."); return(SA_ERR_HPI_OUT_OF_MEMORY); } /* ---------------------------------------- */ /* Construct .resource of struct oh_event */ /* ---------------------------------------- */ e->resource = snmp_bc_rpt_array[BC_RPT_ENTRY_MEDIA_TRAY].rpt; oh_concat_ep(&(e->resource.ResourceEntity), ep_root); oh_set_ep_location(&(e->resource.ResourceEntity), BLADECENTER_PERIPHERAL_BAY_SLOT, SNMP_BC_HPI_LOCATION_BASE); oh_set_ep_location(&(e->resource.ResourceEntity), SAHPI_ENT_PERIPHERAL_BAY, SNMP_BC_HPI_LOCATION_BASE); e->resource.ResourceId = oh_uid_from_entity_path(&(e->resource.ResourceEntity)); snmp_bc_create_resourcetag(&(e->resource.ResourceTag), snmp_bc_rpt_array[BC_RPT_ENTRY_MEDIA_TRAY].comment, SNMP_BC_HPI_LOCATION_BASE); dbg("Discovered resource=%s; ID=%d", e->resource.ResourceTag.Data, e->resource.ResourceId); /* Create platform-specific info space to add to infra-structure */ res_info_ptr = g_memdup(&(snmp_bc_rpt_array[BC_RPT_ENTRY_MEDIA_TRAY].res_info), sizeof(struct ResourceInfo)); if (!res_info_ptr) { err("Out of memory."); snmp_bc_free_oh_event(e); return(SA_ERR_HPI_OUT_OF_MEMORY); } if (media_tray_installed < 10) { res_info_ptr->cur_state = SAHPI_HS_STATE_NOT_PRESENT; snmp_bc_discover_res_events(handle, &(e->resource.ResourceEntity), res_info_ptr); snmp_bc_free_oh_event(e); g_free(res_info_ptr); } else if (media_tray_installed >= 10 ) { res_info_ptr->cur_state = SAHPI_HS_STATE_ACTIVE; /* Get UUID and convert to GUID */ err = snmp_bc_get_guid(custom_handle, e, res_info_ptr); /* Add resource to resource */ err = oh_add_resource(handle->rptcache, &(e->resource), res_info_ptr, 0); if (err) { err("Failed to add resource. Error=%s.", oh_lookup_error(err)); snmp_bc_free_oh_event(e); return(err); } /* Add resource event entries to event2hpi_hash table */ snmp_bc_discover_res_events(handle, &(e->resource.ResourceEntity), res_info_ptr); /* ---------------------------------------- */ /* Construct .rdrs of struct oh_event */ /* ---------------------------------------- */ /* Find resource's rdrs: sensors, controls, etc. */ if (custom_handle->platform == SNMP_BC_PLATFORM_BCHT) { snmp_bc_discover_sensors(handle, snmp_bc_mediatray_sensors_faultled, e); } else { snmp_bc_discover_sensors(handle, snmp_bc_mediatray_sensors_nofaultled, e); } snmp_bc_discover_sensors(handle, snmp_bc_mediatray_sensors, e); snmp_bc_discover_controls(handle, snmp_bc_mediatray_controls, e); snmp_bc_discover_inventories(handle, snmp_bc_mediatray_inventories, e); mt_width = 1; /* Default to 1-wide */ if (res_info_ptr->mib.OidResourceWidth != NULL) { err = snmp_bc_oid_snmp_get(custom_handle, &(e->resource.ResourceEntity), 0, res_info_ptr->mib.OidResourceWidth, &get_value, SAHPI_TRUE); if (!err && (get_value.type == ASN_INTEGER)) { mt_width = get_value.integer; } } res_info_ptr->resourcewidth = mt_width; err = snmp_bc_set_resource_slot_state_sensor(handle, e, mt_width); /* ---------------------------------------- */ /* Construct .event of struct oh_event */ /* ---------------------------------------- */ snmp_bc_set_resource_add_oh_event(e, res_info_ptr); /* ---------------------------------------- */ /* Place the event in tmpqueue */ /* ---------------------------------------- */ /*custom_handle->eventq = g_slist_append(custom_handle->eventq, e);*/ e->hid = handle->hid; oh_evt_queue_push(handle->eventq, e); } /* ------------------------------------------------ */ /* For BC-HT, we have to examine the 2nd media tray */ /* ------------------------------------------------ */ if (custom_handle->platform == SNMP_BC_PLATFORM_BCHT) { e = snmp_bc_alloc_oh_event(); if (e == NULL) { err("Out of memory."); return(SA_ERR_HPI_OUT_OF_MEMORY); } /* ---------------------------------------- */ /* Construct .resource of struct oh_event */ /* ---------------------------------------- */ e->resource = snmp_bc_rpt_array[BC_RPT_ENTRY_MEDIA_TRAY_2].rpt; oh_concat_ep(&(e->resource.ResourceEntity), ep_root); oh_set_ep_location(&(e->resource.ResourceEntity), BLADECENTER_PERIPHERAL_BAY_SLOT, SNMP_BC_HPI_LOCATION_BASE+1); oh_set_ep_location(&(e->resource.ResourceEntity), SAHPI_ENT_PERIPHERAL_BAY, SNMP_BC_HPI_LOCATION_BASE + 1); e->resource.ResourceId = oh_uid_from_entity_path(&(e->resource.ResourceEntity)); snmp_bc_create_resourcetag(&(e->resource.ResourceTag), snmp_bc_rpt_array[BC_RPT_ENTRY_MEDIA_TRAY_2].comment, SNMP_BC_HPI_LOCATION_BASE + 1); dbg("Discovered resource=%s; ID=%d", e->resource.ResourceTag.Data, e->resource.ResourceId); /* Create platform-specific info space to add to infra-structure */ res_info_ptr = g_memdup(&(snmp_bc_rpt_array[BC_RPT_ENTRY_MEDIA_TRAY_2].res_info), sizeof(struct ResourceInfo)); if (!res_info_ptr) { err("Out of memory."); snmp_bc_free_oh_event(e); return(SA_ERR_HPI_OUT_OF_MEMORY); } if ((media_tray_installed != 01) && (media_tray_installed != 11)) { res_info_ptr->cur_state = SAHPI_HS_STATE_NOT_PRESENT; snmp_bc_discover_res_events(handle, &(e->resource.ResourceEntity), res_info_ptr); snmp_bc_free_oh_event(e); g_free(res_info_ptr); } else { res_info_ptr->cur_state = SAHPI_HS_STATE_ACTIVE; /* Get UUID and convert to GUID */ err = snmp_bc_get_guid(custom_handle, e, res_info_ptr); /* Add resource to resource */ err = oh_add_resource(handle->rptcache, &(e->resource), res_info_ptr, 0); if (err) { err("Failed to add resource. Error=%s.", oh_lookup_error(err)); snmp_bc_free_oh_event(e); return(err); } /* Add resource event entries to event2hpi_hash table */ snmp_bc_discover_res_events(handle, &(e->resource.ResourceEntity), res_info_ptr); /* --------------------------------------------- */ /* Construct .rdrs of struct oh_event */ /* --------------------------------------------- */ /* Find resource's rdrs: sensors, controls, etc. */ snmp_bc_discover_sensors(handle, snmp_bc_mediatray2_sensors, e); snmp_bc_discover_controls(handle, snmp_bc_mediatray2_controls, e); snmp_bc_discover_inventories(handle, snmp_bc_mediatray2_inventories, e); mt_width = 1; /* Default to 1-wide */ if (res_info_ptr->mib.OidResourceWidth != NULL) { err = snmp_bc_oid_snmp_get(custom_handle, &(e->resource.ResourceEntity), 0, res_info_ptr->mib.OidResourceWidth, &get_value, SAHPI_TRUE); if (!err && (get_value.type == ASN_INTEGER)) { mt_width = get_value.integer; } } res_info_ptr->resourcewidth = mt_width; err = snmp_bc_set_resource_slot_state_sensor(handle, e, mt_width); /* ---------------------------------------- */ /* Construct .event of struct oh_event */ /* ---------------------------------------- */ snmp_bc_set_resource_add_oh_event(e, res_info_ptr); /* ---------------------------------------- */ /* Place the event in tmpqueue */ /* ---------------------------------------- */ /*handle->eventq = g_slist_append(handle->eventq, e);*/ e->hid = handle->hid; oh_evt_queue_push(handle->eventq, e); } } /* ---------------------------------------- */ return(SA_OK); } /** * snmp_bc_discover_filter: * @handler: Pointer to handler's data. * @ep_root: Pointer to chassis Root Entity Path which comes from openhpi.conf. * @media_tray_installed: Filter installed flag. * * Discovers filter resources and their RDRs. * * Return values: * SA_OK - normal case. * SA_ERR_HPI_OUT_OF_MEMORY - Cannot allocate space for internal memory. * SA_ERR_HPI_INVALID_PARAMS - Pointer parameters are NULL. **/ SaErrorT snmp_bc_discover_filter(struct oh_handler_state *handle, SaHpiEntityPathT *ep_root, int filter_installed) { SaErrorT err; struct oh_event *e; struct ResourceInfo *res_info_ptr; struct snmp_bc_hnd *custom_handle; if (!handle || !ep_root) { err("Invalid parameter."); return(SA_ERR_HPI_INVALID_PARAMS); } custom_handle = (struct snmp_bc_hnd *)handle->data; if (!custom_handle) { err("Invalid parameter."); return(SA_ERR_HPI_INVALID_PARAMS); } e = snmp_bc_alloc_oh_event(); if (e == NULL) { err("Out of memory."); return(SA_ERR_HPI_OUT_OF_MEMORY); } /* ---------------------------------------- */ /* Construct .resource of struct oh_event */ /* ---------------------------------------- */ e->resource = snmp_bc_rpt_array[BC_RPT_ENTRY_AIR_FILTER].rpt; oh_concat_ep(&(e->resource.ResourceEntity), ep_root); oh_set_ep_location(&(e->resource.ResourceEntity), (SAHPI_ENT_PHYSICAL_SLOT + 16), SNMP_BC_HPI_LOCATION_BASE); e->resource.ResourceId = oh_uid_from_entity_path(&(e->resource.ResourceEntity)); snmp_bc_create_resourcetag(&(e->resource.ResourceTag), snmp_bc_rpt_array[BC_RPT_ENTRY_AIR_FILTER].comment, SNMP_BC_HPI_LOCATION_BASE); dbg("Discovered resource=%s; ID=%d", e->resource.ResourceTag.Data, e->resource.ResourceId); /* Create platform-specific info space to add to infra-structure */ res_info_ptr = g_memdup(&(snmp_bc_rpt_array[BC_RPT_ENTRY_AIR_FILTER].res_info), sizeof(struct ResourceInfo)); if (!res_info_ptr) { err("Out of memory."); snmp_bc_free_oh_event(e); return(SA_ERR_HPI_OUT_OF_MEMORY); } if (filter_installed == 0) { res_info_ptr->cur_state = SAHPI_HS_STATE_NOT_PRESENT; snmp_bc_discover_res_events(handle, &(e->resource.ResourceEntity), res_info_ptr); snmp_bc_free_oh_event(e); g_free(res_info_ptr); } else { res_info_ptr->cur_state = SAHPI_HS_STATE_ACTIVE; /* Get UUID and convert to GUID */ err = snmp_bc_get_guid(custom_handle, e, res_info_ptr); /* Add resource to resource */ err = oh_add_resource(handle->rptcache, &(e->resource), res_info_ptr, 0); if (err) { err("Failed to add resource. Error=%s.", oh_lookup_error(err)); snmp_bc_free_oh_event(e); return(err); } /* Add resource event entries to event2hpi_hash table */ snmp_bc_discover_res_events(handle, &(e->resource.ResourceEntity), res_info_ptr); /* ---------------------------------------- */ /* Construct .rdrs of struct oh_event */ /* ---------------------------------------- */ /* Find resource's rdrs: sensors, controls, etc. */ snmp_bc_discover_sensors(handle, snmp_bc_filter_sensors, e); snmp_bc_discover_controls(handle, snmp_bc_filter_controls, e); snmp_bc_discover_inventories(handle, snmp_bc_filter_inventories, e); /* ---------------------------------------- */ /* Construct .event of struct oh_event */ /* ---------------------------------------- */ snmp_bc_set_resource_add_oh_event(e, res_info_ptr); /* ---------------------------------------- */ /* Place the event in tmpqueue */ /* ---------------------------------------- */ /*custom_handle->eventq = g_slist_append(custom_handle->eventq, e);*/ e->hid = handle->hid; oh_evt_queue_push(handle->eventq, e); } /* ---------------------------------------- */ return(SA_OK); } /** * snmp_bc_discover_chassis: * @handler: Pointer to handler's data. * @ep_root: Pointer to chassis Root Entity Path which comes from openhpi.conf. * * Discovers the BladeCenter chassis resource and its RDRs. * * Return values: * SA_OK - normal case. * SA_ERR_HPI_OUT_OF_MEMORY - Cannot allocate space for internal memory. * SA_ERR_HPI_INVALID_PARAMS - Pointer parameter(s) NULL. **/ SaErrorT snmp_bc_discover_chassis(struct oh_handler_state *handle, SaHpiEntityPathT *ep_root) { SaErrorT err; struct oh_event *e; struct ResourceInfo *res_info_ptr; struct snmp_bc_hnd *custom_handle; if (!handle || !ep_root) { err("Invalid parameter."); return(SA_ERR_HPI_INVALID_PARAMS); } custom_handle = (struct snmp_bc_hnd *)handle->data; if (!custom_handle) { err("Invalid parameter."); return(SA_ERR_HPI_INVALID_PARAMS); } /****************** * Discover Chassis ******************/ e = snmp_bc_alloc_oh_event(); if (e == NULL) { err("Out of memory."); return(SA_ERR_HPI_OUT_OF_MEMORY); } e->resource = snmp_bc_rpt_array[BC_RPT_ENTRY_CHASSIS].rpt; /* ---------------------------------------- */ /* Construct .resource of struct oh_event */ /* ---------------------------------------- */ e->resource.ResourceEntity = *ep_root; e->resource.ResourceId = oh_uid_from_entity_path(&(e->resource.ResourceEntity)); { /* Generate Chassis Resource Tag */ SaHpiTextBufferT build_name; oh_init_textbuffer(&build_name); switch (custom_handle->platform) { case SNMP_BC_PLATFORM_BC: oh_append_textbuffer(&build_name, "BladeCenter Chassis"); break; case SNMP_BC_PLATFORM_BCH: oh_append_textbuffer(&build_name, "BladeCenter H Chassis"); break; case SNMP_BC_PLATFORM_BCT: oh_append_textbuffer(&build_name, "BladeCenter T Chassis"); break; case SNMP_BC_PLATFORM_BCHT: oh_append_textbuffer(&build_name, "BladeCenter HT Chassis"); break; default: oh_append_textbuffer(&build_name, "BladeCenter Chassis"); } snmp_bc_create_resourcetag(&(e->resource.ResourceTag), (char *)build_name.Data, ep_root->Entry[0].EntityLocation); } dbg("Discovered resource=%s; ID=%d", e->resource.ResourceTag.Data, e->resource.ResourceId); /* Create platform-specific info space */ res_info_ptr = g_memdup(&(snmp_bc_rpt_array[BC_RPT_ENTRY_CHASSIS].res_info), sizeof(struct ResourceInfo)); if (!res_info_ptr) { err("Out of memory."); snmp_bc_free_oh_event(e); return(SA_ERR_HPI_OUT_OF_MEMORY); } res_info_ptr->cur_state = SAHPI_HS_STATE_ACTIVE; /* Get UUID and convert to GUID */ err = snmp_bc_get_guid(custom_handle, e, res_info_ptr); /* Add resource to resource */ err = oh_add_resource(handle->rptcache, &(e->resource), res_info_ptr, 0); if (err) { err("Cannot add resource. Error=%s.", oh_lookup_error(err)); snmp_bc_free_oh_event(e); return(err); } /* Add resource event entries to event2hpi_hash table */ snmp_bc_discover_res_events(handle, &(e->resource.ResourceEntity), res_info_ptr); /* ---------------------------------------- */ /* Construct .rdrs of struct oh_event */ /* ---------------------------------------- */ /* Find resource's rdrs: sensors, controls, etc. */ snmp_bc_discover_sensors(handle, snmp_bc_chassis_sensors, e); if ( (custom_handle->platform == SNMP_BC_PLATFORM_BCT) ) { snmp_bc_discover_sensors(handle, snmp_bc_chassis_sensors_bct_filter, e); } if ( (custom_handle->platform == SNMP_BC_PLATFORM_BCT) || (custom_handle->platform == SNMP_BC_PLATFORM_BCHT) ){ snmp_bc_discover_controls(handle, snmp_bc_chassis_controls_bct, e); } else if ( (custom_handle->platform == SNMP_BC_PLATFORM_BC) || (custom_handle->platform == SNMP_BC_PLATFORM_BCH) ) { snmp_bc_discover_controls(handle, snmp_bc_chassis_controls_bc, e); } snmp_bc_discover_inventories(handle, snmp_bc_chassis_inventories, e); /* ---------------------------------------- */ /* Construct .event of struct oh_event */ /* ---------------------------------------- */ snmp_bc_set_resource_add_oh_event(e, res_info_ptr); /* ---------------------------------------- */ /* Place the event in queue */ /* ---------------------------------------- */ /*custom_handle->eventq = g_slist_append(custom_handle->eventq, e);*/ e->hid = handle->hid; oh_evt_queue_push(handle->eventq, e); /* ---------------------------------------- */ /* ---------------------------------------- */ return(SA_OK); } /** * snmp_bc_discover_blade: * @handler: Pointer to handler's data. * @ep_root: Pointer to chassis Root Entity Path which comes from openhpi.conf. * @blade_vector: Bitmap vector of installed blades. * * Discovers blade resources and their RDRs. * * Return values: * SA_OK - normal case. * SA_ERR_HPI_OUT_OF_MEMORY - Cannot allocate space for internal memory. * SA_ERR_HPI_INVALID_PARAMS - Pointer parameter(s) NULL. **/ SaErrorT snmp_bc_discover_blade(struct oh_handler_state *handle, SaHpiEntityPathT *ep_root, char *blade_vector) { guint i; SaErrorT err; struct oh_event *e; struct ResourceInfo *res_info_ptr; struct snmp_bc_hnd *custom_handle; if (!handle || !blade_vector) { err("Invalid parameter."); return(SA_ERR_HPI_INVALID_PARAMS); } custom_handle = (struct snmp_bc_hnd *)handle->data; if (!custom_handle) { err("Invalid parameter."); return(SA_ERR_HPI_INVALID_PARAMS); } e = NULL; res_info_ptr = NULL; for (i=0; i < strlen(blade_vector); i++) { if ((blade_vector[i] == '1') || (custom_handle->isFirstDiscovery == SAHPI_TRUE)) { e = snmp_bc_alloc_oh_event(); if (e == NULL) { err("Out of memory."); return(SA_ERR_HPI_OUT_OF_MEMORY); } /* ---------------------------------------- */ /* Construct .resource of struct oh_event */ /* res_info is malloc in the construcion */ /* ---------------------------------------- */ err = snmp_bc_construct_blade_rpt(e, &res_info_ptr, ep_root, i); if (err) { snmp_bc_free_oh_event(e); return(err); } } if ((blade_vector[i] == '0') && (custom_handle->isFirstDiscovery == SAHPI_TRUE)) { /* Make sure that we have static infomation * for this **empty** blade slot in hash during HPI initialization */ res_info_ptr->cur_state = SAHPI_HS_STATE_NOT_PRESENT; snmp_bc_discover_res_events(handle, &(e->resource.ResourceEntity), res_info_ptr); snmp_bc_free_oh_event(e); g_free(res_info_ptr); } else if (blade_vector[i] == '1') { err = snmp_bc_add_blade_rptcache(handle, e, res_info_ptr, i); if (err == SA_OK) { /* ---------------------------------------- */ /* Construct .event of struct oh_event */ /* ---------------------------------------- */ snmp_bc_set_resource_add_oh_event(e, res_info_ptr); /* ---------------------------------------- */ /* Place the event in tmpqueue */ /* ---------------------------------------- */ /*custom_handle->eventq = g_slist_append(custom_handle->eventq, e);*/ if (e) e->hid = handle->hid; oh_evt_queue_push(handle->eventq, e); /********************************** * Discover Blade Expansion Modules **********************************/ err = snmp_bc_discover_blade_expansion(handle, ep_root, i); } else { snmp_bc_free_oh_event(e); } } } return(SA_OK); } /** * snmp_bc_discover_blade_expansion: * @handler: Pointer to handler's data. * @ep_root: Pointer to chassis Root Entity Path which comes from openhpi.conf. * @blade_index: Index of the main blade * * Discovers blade expansion resources and their RDRs, if any. * * Return values: * SA_OK - normal case. * SA_ERR_HPI_OUT_OF_MEMORY - Cannot allocate space for internal memory. * SA_ERR_HPI_INVALID_PARAMS - Pointer parameter(s) NULL. **/ SaErrorT snmp_bc_discover_blade_expansion(struct oh_handler_state *handle, SaHpiEntityPathT *ep_root, guint blade_index) { SaErrorT err; gint i, j; SaHpiEntityPathT ep; struct snmp_value get_value; BCExpansionTypeT expansionType; struct snmp_bc_hnd *custom_handle; if (!handle) { err("Invalid parameter."); return(SA_ERR_HPI_INVALID_PARAMS); } custom_handle = (struct snmp_bc_hnd *)handle->data; if (!custom_handle) { err("Invalid parameter."); return(SA_ERR_HPI_INVALID_PARAMS); } ep = snmp_bc_rpt_array[BC_RPT_ENTRY_BLADE_EXPANSION_CARD].rpt.ResourceEntity; oh_concat_ep(&ep, ep_root); oh_set_ep_location(&ep, SAHPI_ENT_PHYSICAL_SLOT, blade_index + SNMP_BC_HPI_LOCATION_BASE); oh_set_ep_location(&ep, SAHPI_ENT_SBC_BLADE, blade_index + SNMP_BC_HPI_LOCATION_BASE); /* Determine which scheme to detect blade expansion */ /* Set entity_path index to the first entry (SNMP_BC_HPI_LOCATION_BASE) in table */ oh_set_ep_location(&ep, SAHPI_ENT_SYS_EXPANSION_BOARD, SNMP_BC_HPI_LOCATION_BASE); /* Go get value at (SNMP_BC_HPI_LOCATION_BASE + offset 0) */ err = snmp_bc_oid_snmp_get(custom_handle, &ep, 0, SNMP_BC_BLADE_EXP_BLADE_BAY, &get_value, SAHPI_TRUE); j = 0; if (err == SA_ERR_HPI_NOT_PRESENT) { /* No object exists with SNMP_BC_BLADE_EXP_BLADE_BAY oid */ /* Ether the target is running with older MM mib version,*/ /* or there is no expansion board at all in system. */ /* Use old scheme to discover BladeExpandion resource. */ /* Set entity_path index to the desired entry */ /* (blade_index + SNMP_BC_HPI_LOCATION_BASE) in table */ oh_set_ep_location(&ep, SAHPI_ENT_SYS_EXPANSION_BOARD, blade_index + SNMP_BC_HPI_LOCATION_BASE); /* Go get value at (SNMP_BC_HPI_LOCATION_BASE + offset 0) */ err = snmp_bc_oid_snmp_get(custom_handle, &ep, 0, SNMP_BC_BLADE_EXPANSION_VECTOR, &get_value, SAHPI_TRUE); /* With the old scheme, we can only detect one of the blade expansion board */ /* For example, if a blade has BSE and PEU, we see only one with this scheme*/ oh_set_ep_location(&ep, SAHPI_ENT_SYS_EXPANSION_BOARD, j + SNMP_BC_HPI_LOCATION_BASE); if (!err && get_value.integer != 0) { err = snmp_bc_add_blade_expansion_resource(handle, &ep, blade_index, DEFAULT_BLADE_EXPANSION_CARD_TYPE, j); } } else if(err == SA_OK) { /* New scheme; i == index for Processor Blade, j == index for Blade Expansion for each Processor Blade */ for (i=0; i < (custom_handle->max_pb_supported ); i++) { /* Set entity_path index to the first entry (SNMP_BC_HPI_LOCATION_BASE) in table */ oh_set_ep_location(&ep, SAHPI_ENT_SYS_EXPANSION_BOARD, SNMP_BC_HPI_LOCATION_BASE); /* Go get value at (SNMP_BC_HPI_LOCATION_BASE + offset i) */ err = snmp_bc_oid_snmp_get(custom_handle, &ep, i, SNMP_BC_BLADE_EXP_BLADE_BAY, &get_value, SAHPI_TRUE); if (err == SA_OK) { if (get_value.type != ASN_OCTET_STR) continue; if ( atoi(get_value.string) == (blade_index + SNMP_BC_HPI_LOCATION_BASE)) { /* Go get value at (SNMP_BC_HPI_LOCATION_BASE + offset i) */ err = snmp_bc_oid_snmp_get(custom_handle, &ep, i, SNMP_BC_BLADE_EXP_TYPE, &get_value, SAHPI_TRUE); if ((err == SA_OK) && (get_value.type == ASN_INTEGER)) { /* storageExpansion(1), pciExpansion(2) */ expansionType = get_value.integer; } else { err(" Error reading Expansion Board Type\n"); expansionType = DEFAULT_BLADE_EXPANSION_CARD_TYPE; } oh_set_ep_location(&ep, SAHPI_ENT_SYS_EXPANSION_BOARD, j + SNMP_BC_HPI_LOCATION_BASE); err = snmp_bc_add_blade_expansion_resource(handle, &ep, blade_index, expansionType, j); j++; } } } /* end for custom_handle->max_pb_supported */ } return(SA_OK); } /** * snmp_bc_add_blade_expansion_resource: * @handler: Pointer to handler's data. * @ep_root: Pointer to chassis Root Entity Path which comes from openhpi.conf. * @blade_index: Index of the main blade * * Discovers blade expansion resources and their RDRs, if any. * * Return values: * SA_OK - normal case. * SA_ERR_HPI_OUT_OF_MEMORY - Cannot allocate space for internal memory. * SA_ERR_HPI_INVALID_PARAMS - Pointer parameter(s) NULL. **/ SaErrorT snmp_bc_add_blade_expansion_resource(struct oh_handler_state *handle, SaHpiEntityPathT *ep, guint blade_index, BCExpansionTypeT expansionType, guint expansionindex) { SaErrorT err; struct oh_event *e; struct ResourceInfo *res_info_ptr; struct snmp_bc_hnd *custom_handle; if (!handle) { err("Invalid parameter."); return(SA_ERR_HPI_INVALID_PARAMS); } custom_handle = (struct snmp_bc_hnd *)handle->data; if (!custom_handle) { err("Invalid parameter."); return(SA_ERR_HPI_INVALID_PARAMS); } { e = snmp_bc_alloc_oh_event(); if (e == NULL) { err("Out of memory."); return(SA_ERR_HPI_OUT_OF_MEMORY); } /* ---------------------------------------- */ /* Construct .resource of struct oh_event */ /* ---------------------------------------- */ e->resource = snmp_bc_rpt_array[BC_RPT_ENTRY_BLADE_EXPANSION_CARD].rpt; e->resource.ResourceEntity = *ep; e->resource.ResourceId = oh_uid_from_entity_path(ep); { SaHpiTextBufferT working, working2; snmp_bc_create_resourcetag(&working, "Blade", blade_index + SNMP_BC_HPI_LOCATION_BASE); snmp_bc_create_resourcetag(&working2, bladeexpansiondesc[expansionType], SNMP_BC_HPI_LOCATION_BASE + expansionindex); oh_init_textbuffer(&(e->resource.ResourceTag)); oh_append_textbuffer(&(e->resource.ResourceTag), (char *)working.Data); oh_append_textbuffer(&(e->resource.ResourceTag), " "); oh_append_textbuffer(&(e->resource.ResourceTag), (char *)working2.Data); } dbg("Discovered resource=%s; ID=%d", e->resource.ResourceTag.Data, e->resource.ResourceId); /* Create platform-specific info space to add to infra-structure */ res_info_ptr = g_memdup(&(snmp_bc_rpt_array[BC_RPT_ENTRY_BLADE_EXPANSION_CARD].res_info), sizeof(struct ResourceInfo)); if (!res_info_ptr) { err("Out of memory."); snmp_bc_free_oh_event(e); return(SA_ERR_HPI_OUT_OF_MEMORY); } res_info_ptr->cur_state = SAHPI_HS_STATE_ACTIVE; /* Get UUID and convert to GUID */ err = snmp_bc_get_guid(custom_handle, e, res_info_ptr); /* Add resource to resource cache */ err = oh_add_resource(handle->rptcache, &(e->resource), res_info_ptr, 0); if (err) { err("Failed to add resource. Error=%s.", oh_lookup_error(err)); snmp_bc_free_oh_event(e); return(err); } /* ---------------------------------------- */ /* Construct .rdrs of struct oh_event */ /* ---------------------------------------- */ /* Find resource's events, sensors, controls, etc. */ snmp_bc_discover_res_events(handle, &(e->resource.ResourceEntity), res_info_ptr); snmp_bc_discover_sensors(handle, snmp_bc_bem_sensors, e); snmp_bc_discover_ipmi_sensors(handle, snmp_bc_bem_ipmi_sensors, e); snmp_bc_discover_controls(handle, snmp_bc_bem_controls, e); snmp_bc_discover_inventories(handle, snmp_bc_bem_inventories, e); /* ---------------------------------------- */ /* Construct .event of struct oh_event */ /* ---------------------------------------- */ snmp_bc_set_resource_add_oh_event(e, res_info_ptr); /* ---------------------------------------- */ /* Place the event in queue */ /* ---------------------------------------- */ /*custom_handle->eventq = g_slist_append(custom_handle->eventq, e);*/ e->hid = handle->hid; oh_evt_queue_push(handle->eventq, e); } return(SA_OK); } /** * snmp_bc_discover_blowers: * @handler: Pointer to handler's data. * @ep_root: Pointer to chassis Root Entity Path which comes from openhpi.conf. * @blower_vector: Bitmap vector of installed blowers. * * Discovers blower resources and their RDRs. * * Return values: * SA_OK - normal case. * SA_ERR_HPI_OUT_OF_MEMORY - Cannot allocate space for internal memory. * SA_ERR_HPI_INVALID_PARAMS - Pointer paramter(s) NULL. **/ SaErrorT snmp_bc_discover_blowers(struct oh_handler_state *handle, SaHpiEntityPathT *ep_root, char *blower_vector) { guint i; SaErrorT err; struct oh_event *e; struct ResourceInfo *res_info_ptr; struct snmp_bc_hnd *custom_handle; if (!handle || !blower_vector) { err("Invalid parameter."); return(SA_ERR_HPI_INVALID_PARAMS); } custom_handle = (struct snmp_bc_hnd *)handle->data; if (!custom_handle) { err("Invalid parameter."); return(SA_ERR_HPI_INVALID_PARAMS); } e= NULL; res_info_ptr = NULL; for (i=0; i < strlen(blower_vector); i++) { if ((blower_vector[i] == '1') || (custom_handle->isFirstDiscovery == SAHPI_TRUE)) { e = snmp_bc_alloc_oh_event(); if (e == NULL) { err("Out of memory."); return(SA_ERR_HPI_OUT_OF_MEMORY); } /* ---------------------------------------- */ /* Construct .resource of struct oh_event */ /* ---------------------------------------- */ err = snmp_bc_construct_blower_rpt(e, &res_info_ptr, ep_root, i); if (err) { snmp_bc_free_oh_event(e); return(err); } } if ((blower_vector[i] == '0') && (custom_handle->isFirstDiscovery == SAHPI_TRUE)) { res_info_ptr->cur_state = SAHPI_HS_STATE_NOT_PRESENT; snmp_bc_discover_res_events(handle, &(e->resource.ResourceEntity), res_info_ptr); snmp_bc_free_oh_event(e); g_free(res_info_ptr); } else if (blower_vector[i] == '1') { err = snmp_bc_add_blower_rptcache(handle, e, res_info_ptr, i); if (err == SA_OK) { /* ---------------------------------------- */ /* Construct .event of struct oh_event */ /* ---------------------------------------- */ snmp_bc_set_resource_add_oh_event(e, res_info_ptr); /* ---------------------------------------- */ /* Place the event in tmpqueue */ /* ---------------------------------------- */ /*custom_handle->eventq = g_slist_append(custom_handle->eventq, e);*/ if (e) e->hid = handle->hid; oh_evt_queue_push(handle->eventq, e); } else { snmp_bc_free_oh_event(e); } } } return(SA_OK); } /** * snmp_bc_discover_tap: * @handler: Pointer to handler's data. * @ep_root: Pointer to chassis Root Entity Path which comes from openhpi.conf. * @blower_vector: Bitmap vector of installed Telco Alarm Panel. * * Discovers Telco Alarm Panel resources and their RDRs. * * Return values: * SA_OK - normal case. * SA_ERR_HPI_OUT_OF_MEMORY - Cannot allocate space for internal memory. * SA_ERR_HPI_INVALID_PARAMS - Pointer paramter(s) NULL. **/ SaErrorT snmp_bc_discover_tap(struct oh_handler_state *handle, SaHpiEntityPathT *ep_root, char *tap_vector) { guint i; SaErrorT err; struct oh_event *e; struct ResourceInfo *res_info_ptr; struct snmp_bc_hnd *custom_handle; if (!handle || !tap_vector) { err("Invalid parameter."); return(SA_ERR_HPI_INVALID_PARAMS); } custom_handle = (struct snmp_bc_hnd *)handle->data; if (!custom_handle) { err("Invalid parameter."); return(SA_ERR_HPI_INVALID_PARAMS); } e= NULL; res_info_ptr = NULL; for (i=0; i < strlen(tap_vector); i++) { if ((tap_vector[i] == '1') || (custom_handle->isFirstDiscovery == SAHPI_TRUE)) { e = snmp_bc_alloc_oh_event(); if (e == NULL) { err("Out of memory."); return(SA_ERR_HPI_OUT_OF_MEMORY); } /* ---------------------------------------- */ /* Construct .resource of struct oh_event */ /* ---------------------------------------- */ err = snmp_bc_construct_tap_rpt(e, &res_info_ptr, ep_root, i); if (err) { snmp_bc_free_oh_event(e); return(err); } } if ((tap_vector[i] == '0') && (custom_handle->isFirstDiscovery == SAHPI_TRUE)) { res_info_ptr->cur_state = SAHPI_HS_STATE_NOT_PRESENT; snmp_bc_discover_res_events(handle, &(e->resource.ResourceEntity), res_info_ptr); snmp_bc_free_oh_event(e); g_free(res_info_ptr); } else if (tap_vector[i] == '1') { err = snmp_bc_add_tap_rptcache(handle, e, res_info_ptr, i); if (err == SA_OK) { /* ---------------------------------------- */ /* Construct .event of struct oh_event */ /* ---------------------------------------- */ snmp_bc_set_resource_add_oh_event(e, res_info_ptr); /* ---------------------------------------- */ /* Place the event in tmpqueue */ /* ---------------------------------------- */ /*custom_handle->eventq = g_slist_append(custom_handle->eventq, e);*/ if (e) e->hid = handle->hid; oh_evt_queue_push(handle->eventq, e); } else { snmp_bc_free_oh_event(e); } } } return(SA_OK); } /** * snmp_bc_construct_tap_rpt: * @e: Pointer to oh_event struct. * @res_info_ptr: Pointer to pointer of res_info_ptr * @ep_root: Pointer to chassis Root Entity Path which comes from openhpi.conf. * @tap_index: Index of discovered tap. * * Build rpt structure for a blade resource using model data * * Return values: * SA_OK - normal case. * SA_ERR_HPI_OUT_OF_MEMORY - Cannot allocate space for internal memory. * SA_ERR_HPI_INVALID_PARAMS - Pointer parameter(s) NULL. **/ SaErrorT snmp_bc_construct_tap_rpt(struct oh_event* e, struct ResourceInfo **res_info_ptr, SaHpiEntityPathT *ep_root, guint tap_index) { if (!e || !res_info_ptr) return (SA_ERR_HPI_INVALID_PARAMS); e->resource = snmp_bc_rpt_array[BC_RPT_ENTRY_ALARM_PANEL].rpt; oh_concat_ep(&(e->resource.ResourceEntity), ep_root); oh_set_ep_location(&(e->resource.ResourceEntity), BLADECENTER_ALARM_PANEL_SLOT, tap_index + SNMP_BC_HPI_LOCATION_BASE); oh_set_ep_location(&(e->resource.ResourceEntity), SAHPI_ENT_DISPLAY_PANEL, tap_index + SNMP_BC_HPI_LOCATION_BASE); e->resource.ResourceId = oh_uid_from_entity_path(&(e->resource.ResourceEntity)); snmp_bc_create_resourcetag(&(e->resource.ResourceTag), snmp_bc_rpt_array[BC_RPT_ENTRY_ALARM_PANEL].comment, tap_index + SNMP_BC_HPI_LOCATION_BASE); dbg("Discovered resource=%s; ID=%d", e->resource.ResourceTag.Data, e->resource.ResourceId); /* Create platform-specific info space to add to infra-structure */ *res_info_ptr = g_memdup(&(snmp_bc_rpt_array[BC_RPT_ENTRY_ALARM_PANEL].res_info), sizeof(struct ResourceInfo)); if (!(*res_info_ptr)) { err("Out of memory."); return(SA_ERR_HPI_OUT_OF_MEMORY); } return(SA_OK); } /** * snmp_bc_add_tap_rptcache: * @handle: Pointer to hpi handle * @e: Pointer to oh_event struct. * @res_info_ptr: Pointer to pointer of res_info_ptr * @tap_index: Index of discovered tap. * * Build rpt and rdrs for a tap (Telco Alarm Panel) then add to rptcache * * Return values: * SA_OK - normal case. * SA_ERR_HPI_OUT_OF_MEMORY - Cannot allocate space for internal memory. * SA_ERR_HPI_INVALID_PARAMS - Pointer parameter(s) NULL. **/ SaErrorT snmp_bc_add_tap_rptcache(struct oh_handler_state *handle, struct oh_event *e, struct ResourceInfo *res_info_ptr, guint tap_index) { SaErrorT err; guint tap_width; struct snmp_value get_value; struct snmp_bc_hnd *custom_handle; if (!handle || !e || !res_info_ptr) { err("Invalid parameter."); return(SA_ERR_HPI_INVALID_PARAMS); } custom_handle = (struct snmp_bc_hnd *)handle->data; if (!custom_handle) { err("Invalid parameter."); return(SA_ERR_HPI_INVALID_PARAMS); } dbg("Discovering Telco Alarm Panel %d resource.\n", tap_index); res_info_ptr->cur_state = SAHPI_HS_STATE_ACTIVE; /* Get UUID and convert to GUID */ err = snmp_bc_get_guid(custom_handle, e, res_info_ptr); /* Add resource to temporary event cache/queue */ err = oh_add_resource(handle->rptcache, &(e->resource), res_info_ptr, 0); if (err) { err("Failed to add resource. Error=%s.", oh_lookup_error(err)); return(err); } /* ---------------------------------------- */ /* Construct .rdrs of struct oh_event */ /* ---------------------------------------- */ /* Find resource's events, sensors, controls, etc. */ snmp_bc_discover_res_events(handle, &(e->resource.ResourceEntity), res_info_ptr); snmp_bc_discover_sensors(handle, snmp_bc_alarm_sensors, e); snmp_bc_discover_controls(handle, snmp_bc_alarm_controls, e); snmp_bc_discover_inventories(handle, snmp_bc_alarm_inventories, e); tap_width = 1; /* Default to 1-wide blade */ if (res_info_ptr->mib.OidResourceWidth != NULL) { err = snmp_bc_oid_snmp_get(custom_handle, &(e->resource.ResourceEntity), 0, res_info_ptr->mib.OidResourceWidth, &get_value, SAHPI_TRUE); if (!err && (get_value.type == ASN_INTEGER)) { tap_width = get_value.integer; } } res_info_ptr->resourcewidth = tap_width; err = snmp_bc_set_resource_slot_state_sensor(handle, e, tap_width); return(err); } /** * snmp_bc_discover_tap_i: * @handle: Pointer to hpi handle * @ep_root: Pointer to . * @tap_index: Index of discovered tap. * * Discover a particular Telco Alarm Card at index tap_index. * This routine is used to rediscover a Telco Alarm Panel (tap). * Blower rpt and rdrs will be added to rptcache. * No event will be generated. The event is handled separately in log2event. * * Return values: * SA_OK - normal case. * SA_ERR_HPI_OUT_OF_MEMORY - Cannot allocate space for internal memory. * SA_ERR_HPI_INVALID_PARAMS - Pointer parameter(s) NULL. **/ SaErrorT snmp_bc_discover_tap_i(struct oh_handler_state *handle, SaHpiEntityPathT *ep_root, guint tap_index) { SaErrorT err; struct oh_event *e; struct ResourceInfo *res_info_ptr; if (!handle) { err("Invalid parameter."); return(SA_ERR_HPI_INVALID_PARAMS); } e= NULL; res_info_ptr = NULL; e = snmp_bc_alloc_oh_event(); if (e == NULL) { err("Out of memory."); return(SA_ERR_HPI_OUT_OF_MEMORY); } /* ---------------------------------------- */ /* Construct .resource of struct oh_event */ /* ---------------------------------------- */ err = snmp_bc_construct_tap_rpt(e, &res_info_ptr, ep_root, tap_index); if (err) { snmp_bc_free_oh_event(e); return(err); } /* ---------------------------------------- */ /* Discover rdrs. */ /* Add rpt and rdrs to rptcache. */ /* ---------------------------------------- */ err = snmp_bc_add_tap_rptcache(handle, e, res_info_ptr, tap_index); snmp_bc_free_oh_event(e); return(SA_OK); } /** * snmp_bc_discover_smi: * @handler: Pointer to handler's data. * @ep_root: Pointer to chassis Root Entity Path which comes from openhpi.conf. * @smi_vector: Bitmap vector of installed Switch Module Interposers (smi). * * Discovers Switch Module Interposers resources and their RDRs. * * Return values: * SA_OK - normal case. * SA_ERR_HPI_OUT_OF_MEMORY - Cannot allocate space for internal memory. * SA_ERR_HPI_INVALID_PARAMS - Pointer paramter(s) NULL. **/ SaErrorT snmp_bc_discover_smi(struct oh_handler_state *handle, SaHpiEntityPathT *ep_root, char *smi_vector) { guint i; SaErrorT err; struct oh_event *e; struct ResourceInfo *res_info_ptr; struct snmp_bc_hnd *custom_handle; if (!handle || !smi_vector) { err("Invalid parameter."); return(SA_ERR_HPI_INVALID_PARAMS); } custom_handle = (struct snmp_bc_hnd *)handle->data; if (!custom_handle) { err("Invalid parameter."); return(SA_ERR_HPI_INVALID_PARAMS); } e= NULL; res_info_ptr = NULL; for (i=0; i < strlen(smi_vector); i++) { if ((smi_vector[i] == '1') || (custom_handle->isFirstDiscovery == SAHPI_TRUE)) { e = snmp_bc_alloc_oh_event(); if (e == NULL) { err("Out of memory."); return(SA_ERR_HPI_OUT_OF_MEMORY); } /* ---------------------------------------- */ /* Construct .resource of struct oh_event */ /* ---------------------------------------- */ err = snmp_bc_construct_smi_rpt(e, &res_info_ptr, ep_root, i); if (err) { snmp_bc_free_oh_event(e); return(err); } } if ((smi_vector[i] == '0') && (custom_handle->isFirstDiscovery == SAHPI_TRUE)) { res_info_ptr->cur_state = SAHPI_HS_STATE_NOT_PRESENT; snmp_bc_discover_res_events(handle, &(e->resource.ResourceEntity), res_info_ptr); snmp_bc_free_oh_event(e); g_free(res_info_ptr); } else if (smi_vector[i] == '1') { err = snmp_bc_add_smi_rptcache(handle, e, res_info_ptr, i); if (err == SA_OK) { /* ---------------------------------------- */ /* Construct .event of struct oh_event */ /* ---------------------------------------- */ snmp_bc_set_resource_add_oh_event(e, res_info_ptr); /* ---------------------------------------- */ /* Place the event in tmpqueue */ /* ---------------------------------------- */ /*custom_handle->eventq = g_slist_append(custom_handle->eventq, e);*/ if (e) e->hid = handle->hid; oh_evt_queue_push(handle->eventq, e); } else { snmp_bc_free_oh_event(e); } } } return(SA_OK); } /** * snmp_bc_construct_smi_rpt: * @e: Pointer to oh_event struct. * @res_info_ptr: Pointer to pointer of res_info_ptr * @ep_root: Pointer to chassis Root Entity Path which comes from openhpi.conf. * @smi_index: Index of discovered smi. * * Build rpt structure for a blade resource using model data * * Return values: * SA_OK - normal case. * SA_ERR_HPI_OUT_OF_MEMORY - Cannot allocate space for internal memory. * SA_ERR_HPI_INVALID_PARAMS - Pointer parameter(s) NULL. **/ SaErrorT snmp_bc_construct_smi_rpt(struct oh_event* e, struct ResourceInfo **res_info_ptr, SaHpiEntityPathT *ep_root, guint smi_index) { if (!e || !res_info_ptr) return (SA_ERR_HPI_INVALID_PARAMS); e->resource = snmp_bc_rpt_array[BC_RPT_ENTRY_INTERPOSER_SWITCH].rpt; oh_concat_ep(&(e->resource.ResourceEntity), ep_root); oh_set_ep_location(&(e->resource.ResourceEntity), BLADECENTER_SWITCH_SLOT, smi_index + SNMP_BC_HPI_LOCATION_BASE); oh_set_ep_location(&(e->resource.ResourceEntity), SAHPI_ENT_INTERCONNECT, smi_index + SNMP_BC_HPI_LOCATION_BASE); e->resource.ResourceId = oh_uid_from_entity_path(&(e->resource.ResourceEntity)); snmp_bc_create_resourcetag(&(e->resource.ResourceTag), snmp_bc_rpt_array[BC_RPT_ENTRY_INTERPOSER_SWITCH].comment, smi_index + SNMP_BC_HPI_LOCATION_BASE); dbg("Discovered resource=%s; ID=%d", e->resource.ResourceTag.Data, e->resource.ResourceId); /* Create platform-specific info space to add to infra-structure */ *res_info_ptr = g_memdup(&(snmp_bc_rpt_array[BC_RPT_ENTRY_INTERPOSER_SWITCH].res_info), sizeof(struct ResourceInfo)); if (!(*res_info_ptr)) { err("Out of memory."); return(SA_ERR_HPI_OUT_OF_MEMORY); } return(SA_OK); } /** * snmp_bc_add_smi_rptcache: * @handle: Pointer to hpi handle * @e: Pointer to oh_event struct. * @res_info_ptr: Pointer to pointer of res_info_ptr * @smi_index: Index of discovered smi. * * Build rpt and rdrs for a smi (Switch Module interposer) then add to rptcache * * Return values: * SA_OK - normal case. * SA_ERR_HPI_OUT_OF_MEMORY - Cannot allocate space for internal memory. * SA_ERR_HPI_INVALID_PARAMS - Pointer parameter(s) NULL. **/ SaErrorT snmp_bc_add_smi_rptcache(struct oh_handler_state *handle, struct oh_event *e, struct ResourceInfo *res_info_ptr, guint smi_index) { SaErrorT err; struct snmp_bc_hnd *custom_handle; if (!handle || !e || !res_info_ptr) { err("Invalid parameter."); return(SA_ERR_HPI_INVALID_PARAMS); } custom_handle = (struct snmp_bc_hnd *)handle->data; if (!custom_handle) { err("Invalid parameter."); return(SA_ERR_HPI_INVALID_PARAMS); } dbg("Discovering Switch Module Interposer %d resource.\n", smi_index); res_info_ptr->cur_state = SAHPI_HS_STATE_ACTIVE; /* Get UUID and convert to GUID */ err = snmp_bc_get_guid(custom_handle, e, res_info_ptr); /* Add resource to temporary event cache/queue */ err = oh_add_resource(handle->rptcache, &(e->resource), res_info_ptr, 0); if (err) { err("Failed to add resource. Error=%s.", oh_lookup_error(err)); return(err); } /* ---------------------------------------- */ /* Construct .rdrs of struct oh_event */ /* ---------------------------------------- */ /* Find resource's events, sensors, controls, etc. */ snmp_bc_discover_res_events(handle, &(e->resource.ResourceEntity), res_info_ptr); //snmp_bc_discover_sensors(handle, snmp_bc_alarm_sensors, e); //snmp_bc_discover_controls(handle, snmp_bc_alarm_controls, e); snmp_bc_discover_inventories(handle, snmp_bc_interposer_switch_inventories, e); return(err); } /** * snmp_bc_discover_smi_i: * @handle: Pointer to hpi handle * @ep_root: Pointer to . * @smi_index: Index of discovered smi. * * Discover a Switch Module Interposer card at index mmi_index. * This routine is used to rediscover a Network Clock card (nc). * Blower rpt and rdrs will be added to rptcache. * No event will be generated. The event is handled separately in log2event. * * Return values: * SA_OK - normal case. * SA_ERR_HPI_OUT_OF_MEMORY - Cannot allocate space for internal memory. * SA_ERR_HPI_INVALID_PARAMS - Pointer parameter(s) NULL. **/ SaErrorT snmp_bc_discover_smi_i(struct oh_handler_state *handle, SaHpiEntityPathT *ep_root, guint smi_index) { SaErrorT err; struct oh_event *e; struct ResourceInfo *res_info_ptr; if (!handle) { err("Invalid parameter."); return(SA_ERR_HPI_INVALID_PARAMS); } e= NULL; res_info_ptr = NULL; e = snmp_bc_alloc_oh_event(); if (e == NULL) { err("Out of memory."); return(SA_ERR_HPI_OUT_OF_MEMORY); } /* ---------------------------------------- */ /* Construct .resource of struct oh_event */ /* ---------------------------------------- */ err = snmp_bc_construct_smi_rpt(e, &res_info_ptr, ep_root, smi_index); if (err) { snmp_bc_free_oh_event(e); return(err); } /* ---------------------------------------- */ /* Discover rdrs. */ /* Add rpt and rdrs to rptcache. */ /* ---------------------------------------- */ err = snmp_bc_add_smi_rptcache(handle, e, res_info_ptr, smi_index); snmp_bc_free_oh_event(e); return(SA_OK); } /** * snmp_bc_discover_mmi: * @handler: Pointer to handler's data. * @ep_root: Pointer to chassis Root Entity Path which comes from openhpi.conf. * @mmi_vector: Bitmap vector of installed Management Module Interposers (mmi). * * Discovers Management Module Interposers resources and their RDRs. * * Return values: * SA_OK - normal case. * SA_ERR_HPI_OUT_OF_MEMORY - Cannot allocate space for internal memory. * SA_ERR_HPI_INVALID_PARAMS - Pointer paramter(s) NULL. **/ SaErrorT snmp_bc_discover_mmi(struct oh_handler_state *handle, SaHpiEntityPathT *ep_root, char *mmi_vector) { guint i; SaErrorT err; struct oh_event *e; struct ResourceInfo *res_info_ptr; struct snmp_bc_hnd *custom_handle; if (!handle || !mmi_vector) { err("Invalid parameter."); return(SA_ERR_HPI_INVALID_PARAMS); } custom_handle = (struct snmp_bc_hnd *)handle->data; if (!custom_handle) { err("Invalid parameter."); return(SA_ERR_HPI_INVALID_PARAMS); } e= NULL; res_info_ptr = NULL; for (i=0; i < strlen(mmi_vector); i++) { if ((mmi_vector[i] == '1') || (custom_handle->isFirstDiscovery == SAHPI_TRUE)) { e = snmp_bc_alloc_oh_event(); if (e == NULL) { err("Out of memory."); return(SA_ERR_HPI_OUT_OF_MEMORY); } /* ---------------------------------------- */ /* Construct .resource of struct oh_event */ /* ---------------------------------------- */ err = snmp_bc_construct_mmi_rpt(e, &res_info_ptr, ep_root, i); if (err) { snmp_bc_free_oh_event(e); return(err); } } if ((mmi_vector[i] == '0') && (custom_handle->isFirstDiscovery == SAHPI_TRUE)) { res_info_ptr->cur_state = SAHPI_HS_STATE_NOT_PRESENT; snmp_bc_discover_res_events(handle, &(e->resource.ResourceEntity), res_info_ptr); snmp_bc_free_oh_event(e); g_free(res_info_ptr); } else if (mmi_vector[i] == '1') { err = snmp_bc_add_mmi_rptcache(handle, e, res_info_ptr, i); if (err == SA_OK) { /* ---------------------------------------- */ /* Construct .event of struct oh_event */ /* ---------------------------------------- */ snmp_bc_set_resource_add_oh_event(e, res_info_ptr); /* ---------------------------------------- */ /* Place the event in tmpqueue */ /* ---------------------------------------- */ /*custom_handle->eventq = g_slist_append(custom_handle->eventq, e);*/ if (e) e->hid = handle->hid; oh_evt_queue_push(handle->eventq, e); } else { snmp_bc_free_oh_event(e); } } } return(SA_OK); } /** * snmp_bc_construct_mmi_rpt: * @e: Pointer to oh_event struct. * @res_info_ptr: Pointer to pointer of res_info_ptr * @ep_root: Pointer to chassis Root Entity Path which comes from openhpi.conf. * @mmi_index: Index of discovered mmi. * * Build rpt structure for a blade resource using model data * * Return values: * SA_OK - normal case. * SA_ERR_HPI_OUT_OF_MEMORY - Cannot allocate space for internal memory. * SA_ERR_HPI_INVALID_PARAMS - Pointer parameter(s) NULL. **/ SaErrorT snmp_bc_construct_mmi_rpt(struct oh_event* e, struct ResourceInfo **res_info_ptr, SaHpiEntityPathT *ep_root, guint mmi_index) { if (!e || !res_info_ptr) return (SA_ERR_HPI_INVALID_PARAMS); e->resource = snmp_bc_rpt_array[BC_RPT_ENTRY_INTERPOSER_MM].rpt; oh_concat_ep(&(e->resource.ResourceEntity), ep_root); oh_set_ep_location(&(e->resource.ResourceEntity), BLADECENTER_SYS_MGMNT_MODULE_SLOT, mmi_index + SNMP_BC_HPI_LOCATION_BASE); oh_set_ep_location(&(e->resource.ResourceEntity), SAHPI_ENT_INTERCONNECT, mmi_index + SNMP_BC_HPI_LOCATION_BASE); e->resource.ResourceId = oh_uid_from_entity_path(&(e->resource.ResourceEntity)); snmp_bc_create_resourcetag(&(e->resource.ResourceTag), snmp_bc_rpt_array[BC_RPT_ENTRY_INTERPOSER_MM].comment, mmi_index + SNMP_BC_HPI_LOCATION_BASE); dbg("Discovered resource=%s; ID=%d", e->resource.ResourceTag.Data, e->resource.ResourceId); /* Create platform-specific info space to add to infra-structure */ *res_info_ptr = g_memdup(&(snmp_bc_rpt_array[BC_RPT_ENTRY_INTERPOSER_MM].res_info), sizeof(struct ResourceInfo)); if (!(*res_info_ptr)) { err("Out of memory."); return(SA_ERR_HPI_OUT_OF_MEMORY); } return(SA_OK); } /** * snmp_bc_add_mmi_rptcache: * @handle: Pointer to hpi handle * @e: Pointer to oh_event struct. * @res_info_ptr: Pointer to pointer of res_info_ptr * @mmi_index: Index of discovered mmi. * * Build rpt and rdrs for a mmi (Management Module interposer) then add to rptcache * * Return values: * SA_OK - normal case. * SA_ERR_HPI_OUT_OF_MEMORY - Cannot allocate space for internal memory. * SA_ERR_HPI_INVALID_PARAMS - Pointer parameter(s) NULL. **/ SaErrorT snmp_bc_add_mmi_rptcache(struct oh_handler_state *handle, struct oh_event *e, struct ResourceInfo *res_info_ptr, guint mmi_index) { SaErrorT err; struct snmp_bc_hnd *custom_handle; if (!handle || !e || !res_info_ptr) { err("Invalid parameter."); return(SA_ERR_HPI_INVALID_PARAMS); } custom_handle = (struct snmp_bc_hnd *)handle->data; if (!custom_handle) { err("Invalid parameter."); return(SA_ERR_HPI_INVALID_PARAMS); } dbg("Discovering Management Module Interposer %d resource.\n", mmi_index); res_info_ptr->cur_state = SAHPI_HS_STATE_ACTIVE; /* Get UUID and convert to GUID */ err = snmp_bc_get_guid(custom_handle, e, res_info_ptr); /* Add resource to temporary event cache/queue */ err = oh_add_resource(handle->rptcache, &(e->resource), res_info_ptr, 0); if (err) { err("Failed to add resource. Error=%s.", oh_lookup_error(err)); return(err); } /* ---------------------------------------- */ /* Construct .rdrs of struct oh_event */ /* ---------------------------------------- */ /* Find resource's events, sensors, controls, etc. */ snmp_bc_discover_res_events(handle, &(e->resource.ResourceEntity), res_info_ptr); //snmp_bc_discover_sensors(handle, snmp_bc_alarm_sensors, e); //snmp_bc_discover_controls(handle, snmp_bc_alarm_controls, e); snmp_bc_discover_inventories(handle, snmp_bc_interposer_mm_inventories, e); return(err); } /** * snmp_bc_discover_mmi_i: * @handle: Pointer to hpi handle * @ep_root: Pointer to . * @mmi_index: Index of discovered mmi. * * Discover a Management Module Interposer card at index mmi_index. * This routine is used to rediscover a Network Clock card (nc). * Blower rpt and rdrs will be added to rptcache. * No event will be generated. The event is handled separately in log2event. * * Return values: * SA_OK - normal case. * SA_ERR_HPI_OUT_OF_MEMORY - Cannot allocate space for internal memory. * SA_ERR_HPI_INVALID_PARAMS - Pointer parameter(s) NULL. **/ SaErrorT snmp_bc_discover_mmi_i(struct oh_handler_state *handle, SaHpiEntityPathT *ep_root, guint mmi_index) { SaErrorT err; struct oh_event *e; struct ResourceInfo *res_info_ptr; if (!handle) { err("Invalid parameter."); return(SA_ERR_HPI_INVALID_PARAMS); } e= NULL; res_info_ptr = NULL; e = snmp_bc_alloc_oh_event(); if (e == NULL) { err("Out of memory."); return(SA_ERR_HPI_OUT_OF_MEMORY); } /* ---------------------------------------- */ /* Construct .resource of struct oh_event */ /* ---------------------------------------- */ err = snmp_bc_construct_mmi_rpt(e, &res_info_ptr, ep_root, mmi_index); if (err) { snmp_bc_free_oh_event(e); return(err); } /* ---------------------------------------- */ /* Discover rdrs. */ /* Add rpt and rdrs to rptcache. */ /* ---------------------------------------- */ err = snmp_bc_add_mmi_rptcache(handle, e, res_info_ptr, mmi_index); snmp_bc_free_oh_event(e); return(SA_OK); } /** * snmp_bc_discover_nc: * @handler: Pointer to handler's data. * @ep_root: Pointer to chassis Root Entity Path which comes from openhpi.conf. * @nc_vector: Bitmap vector of installed Network Clock (nc) cards. * * Discovers Network Clock Card resources and their RDRs. * * Return values: * SA_OK - normal case. * SA_ERR_HPI_OUT_OF_MEMORY - Cannot allocate space for internal memory. * SA_ERR_HPI_INVALID_PARAMS - Pointer paramter(s) NULL. **/ SaErrorT snmp_bc_discover_nc(struct oh_handler_state *handle, SaHpiEntityPathT *ep_root, char *nc_vector) { guint i; SaErrorT err; struct oh_event *e; struct ResourceInfo *res_info_ptr; struct snmp_bc_hnd *custom_handle; if (!handle || !nc_vector) { err("Invalid parameter."); return(SA_ERR_HPI_INVALID_PARAMS); } custom_handle = (struct snmp_bc_hnd *)handle->data; if (!custom_handle) { err("Invalid parameter."); return(SA_ERR_HPI_INVALID_PARAMS); } e= NULL; res_info_ptr = NULL; for (i=0; i < strlen(nc_vector); i++) { if ((nc_vector[i] == '1') || (custom_handle->isFirstDiscovery == SAHPI_TRUE)) { e = snmp_bc_alloc_oh_event(); if (e == NULL) { err("Out of memory."); return(SA_ERR_HPI_OUT_OF_MEMORY); } /* ---------------------------------------- */ /* Construct .resource of struct oh_event */ /* ---------------------------------------- */ err = snmp_bc_construct_nc_rpt(e, &res_info_ptr, ep_root, i); if (err) { snmp_bc_free_oh_event(e); return(err); } } if ((nc_vector[i] == '0') && (custom_handle->isFirstDiscovery == SAHPI_TRUE)) { res_info_ptr->cur_state = SAHPI_HS_STATE_NOT_PRESENT; snmp_bc_discover_res_events(handle, &(e->resource.ResourceEntity), res_info_ptr); snmp_bc_free_oh_event(e); g_free(res_info_ptr); } else if (nc_vector[i] == '1') { err = snmp_bc_add_nc_rptcache(handle, e, res_info_ptr, i); if (err == SA_OK) { /* ---------------------------------------- */ /* Construct .event of struct oh_event */ /* ---------------------------------------- */ snmp_bc_set_resource_add_oh_event(e, res_info_ptr); /* ---------------------------------------- */ /* Place the event in tmpqueue */ /* ---------------------------------------- */ /*custom_handle->eventq = g_slist_append(custom_handle->eventq, e);*/ if (e) e->hid = handle->hid; oh_evt_queue_push(handle->eventq, e); } else { snmp_bc_free_oh_event(e); } } } return(SA_OK); } /** * snmp_bc_construct_nc_rpt: * @e: Pointer to oh_event struct. * @res_info_ptr: Pointer to pointer of res_info_ptr * @ep_root: Pointer to chassis Root Entity Path which comes from openhpi.conf. * @nc_index: Index of discovered nc. * * Build rpt structure for a blade resource using model data * * Return values: * SA_OK - normal case. * SA_ERR_HPI_OUT_OF_MEMORY - Cannot allocate space for internal memory. * SA_ERR_HPI_INVALID_PARAMS - Pointer parameter(s) NULL. **/ SaErrorT snmp_bc_construct_nc_rpt(struct oh_event* e, struct ResourceInfo **res_info_ptr, SaHpiEntityPathT *ep_root, guint nc_index) { if (!e || !res_info_ptr) return (SA_ERR_HPI_INVALID_PARAMS); e->resource = snmp_bc_rpt_array[BC_RPT_ENTRY_CLOCK_MODULE].rpt; oh_concat_ep(&(e->resource.ResourceEntity), ep_root); oh_set_ep_location(&(e->resource.ResourceEntity), BLADECENTER_CLOCK_SLOT, nc_index + SNMP_BC_HPI_LOCATION_BASE); oh_set_ep_location(&(e->resource.ResourceEntity), (SAHPI_ENT_BATTERY + 13), nc_index + SNMP_BC_HPI_LOCATION_BASE); e->resource.ResourceId = oh_uid_from_entity_path(&(e->resource.ResourceEntity)); snmp_bc_create_resourcetag(&(e->resource.ResourceTag), snmp_bc_rpt_array[BC_RPT_ENTRY_CLOCK_MODULE].comment, nc_index + SNMP_BC_HPI_LOCATION_BASE); dbg("Discovered resource=%s; ID=%d", e->resource.ResourceTag.Data, e->resource.ResourceId); /* Create platform-specific info space to add to infra-structure */ *res_info_ptr = g_memdup(&(snmp_bc_rpt_array[BC_RPT_ENTRY_CLOCK_MODULE].res_info), sizeof(struct ResourceInfo)); if (!(*res_info_ptr)) { err("Out of memory."); return(SA_ERR_HPI_OUT_OF_MEMORY); } return(SA_OK); } /** * snmp_bc_add_nc_rptcache: * @handle: Pointer to hpi handle * @e: Pointer to oh_event struct. * @res_info_ptr: Pointer to pointer of res_info_ptr * @nc_index: Index of discovered nc. * * Build rpt and rdrs for a nc (Network Clock Card) then add to rptcache * * Return values: * SA_OK - normal case. * SA_ERR_HPI_OUT_OF_MEMORY - Cannot allocate space for internal memory. * SA_ERR_HPI_INVALID_PARAMS - Pointer parameter(s) NULL. **/ SaErrorT snmp_bc_add_nc_rptcache(struct oh_handler_state *handle, struct oh_event *e, struct ResourceInfo *res_info_ptr, guint nc_index) { SaErrorT err; guint nc_width; struct snmp_value get_value; struct snmp_bc_hnd *custom_handle; if (!handle || !e || !res_info_ptr) { err("Invalid parameter."); return(SA_ERR_HPI_INVALID_PARAMS); } custom_handle = (struct snmp_bc_hnd *)handle->data; if (!custom_handle) { err("Invalid parameter."); return(SA_ERR_HPI_INVALID_PARAMS); } dbg("Discovering Network Clocd Card %d resource.\n", nc_index); res_info_ptr->cur_state = SAHPI_HS_STATE_ACTIVE; /* Get UUID and convert to GUID */ err = snmp_bc_get_guid(custom_handle, e, res_info_ptr); /* Add resource to temporary event cache/queue */ err = oh_add_resource(handle->rptcache, &(e->resource), res_info_ptr, 0); if (err) { err("Failed to add resource. Error=%s.", oh_lookup_error(err)); return(err); } /* ---------------------------------------- */ /* Construct .rdrs of struct oh_event */ /* ---------------------------------------- */ /* Find resource's events, sensors, controls, etc. */ snmp_bc_discover_res_events(handle, &(e->resource.ResourceEntity), res_info_ptr); snmp_bc_discover_sensors(handle, snmp_bc_clock_sensors, e); snmp_bc_discover_controls(handle, snmp_bc_clock_controls, e); snmp_bc_discover_inventories(handle, snmp_bc_clock_inventories, e); nc_width = 1; /* Default to 1-wide blade */ if (res_info_ptr->mib.OidResourceWidth != NULL) { err = snmp_bc_oid_snmp_get(custom_handle, &(e->resource.ResourceEntity), 0, res_info_ptr->mib.OidResourceWidth, &get_value, SAHPI_TRUE); if (!err && (get_value.type == ASN_INTEGER)) { nc_width = get_value.integer; } } res_info_ptr->resourcewidth = nc_width; err = snmp_bc_set_resource_slot_state_sensor(handle, e, nc_width); return(err); } /** * snmp_bc_discover_nc_i: * @handle: Pointer to hpi handle * @ep_root: Pointer to . * @nc_index: Index of discovered nc. * * Discover a Network Clock card at index nc_index. * This routine is used to rediscover a Network Clock card (nc). * Blower rpt and rdrs will be added to rptcache. * No event will be generated. The event is handled separately in log2event. * * Return values: * SA_OK - normal case. * SA_ERR_HPI_OUT_OF_MEMORY - Cannot allocate space for internal memory. * SA_ERR_HPI_INVALID_PARAMS - Pointer parameter(s) NULL. **/ SaErrorT snmp_bc_discover_nc_i(struct oh_handler_state *handle, SaHpiEntityPathT *ep_root, guint nc_index) { SaErrorT err; struct oh_event *e; struct ResourceInfo *res_info_ptr; if (!handle) { err("Invalid parameter."); return(SA_ERR_HPI_INVALID_PARAMS); } e= NULL; res_info_ptr = NULL; e = snmp_bc_alloc_oh_event(); if (e == NULL) { err("Out of memory."); return(SA_ERR_HPI_OUT_OF_MEMORY); } /* ---------------------------------------- */ /* Construct .resource of struct oh_event */ /* ---------------------------------------- */ err = snmp_bc_construct_nc_rpt(e, &res_info_ptr, ep_root, nc_index); if (err) { snmp_bc_free_oh_event(e); return(err); } /* ---------------------------------------- */ /* Discover rdrs. */ /* Add rpt and rdrs to rptcache. */ /* ---------------------------------------- */ err = snmp_bc_add_nc_rptcache(handle, e, res_info_ptr, nc_index); snmp_bc_free_oh_event(e); return(SA_OK); } /** * snmp_bc_discover_mx: * @handler: Pointer to handler's data. * @ep_root: Pointer to chassis Root Entity Path which comes from openhpi.conf. * @blower_vector: Bitmap vector of installed Multiplex (mx) cards. * * Discovers Multiplex Card resources and their RDRs. * * Return values: * SA_OK - normal case. * SA_ERR_HPI_OUT_OF_MEMORY - Cannot allocate space for internal memory. * SA_ERR_HPI_INVALID_PARAMS - Pointer paramter(s) NULL. **/ SaErrorT snmp_bc_discover_mx(struct oh_handler_state *handle, SaHpiEntityPathT *ep_root, char *mx_vector) { guint i; SaErrorT err; struct oh_event *e; struct ResourceInfo *res_info_ptr; struct snmp_bc_hnd *custom_handle; if (!handle || !mx_vector) { err("Invalid parameter."); return(SA_ERR_HPI_INVALID_PARAMS); } custom_handle = (struct snmp_bc_hnd *)handle->data; if (!custom_handle) { err("Invalid parameter."); return(SA_ERR_HPI_INVALID_PARAMS); } e= NULL; res_info_ptr = NULL; for (i=0; i < strlen(mx_vector); i++) { if ((mx_vector[i] == '1') || (custom_handle->isFirstDiscovery == SAHPI_TRUE)) { e = snmp_bc_alloc_oh_event(); if (e == NULL) { err("Out of memory."); return(SA_ERR_HPI_OUT_OF_MEMORY); } /* ---------------------------------------- */ /* Construct .resource of struct oh_event */ /* ---------------------------------------- */ err = snmp_bc_construct_mx_rpt(e, &res_info_ptr, ep_root, i); if (err) { snmp_bc_free_oh_event(e); return(err); } } if ((mx_vector[i] == '0') && (custom_handle->isFirstDiscovery == SAHPI_TRUE)) { res_info_ptr->cur_state = SAHPI_HS_STATE_NOT_PRESENT; snmp_bc_discover_res_events(handle, &(e->resource.ResourceEntity), res_info_ptr); snmp_bc_free_oh_event(e); g_free(res_info_ptr); } else if (mx_vector[i] == '1') { err = snmp_bc_add_mx_rptcache(handle, e, res_info_ptr, i); if (err == SA_OK) { /* ---------------------------------------- */ /* Construct .event of struct oh_event */ /* ---------------------------------------- */ snmp_bc_set_resource_add_oh_event(e, res_info_ptr); /* ---------------------------------------- */ /* Place the event in tmpqueue */ /* ---------------------------------------- */ /*custom_handle->eventq = g_slist_append(custom_handle->eventq, e);*/ if (e) e->hid = handle->hid; oh_evt_queue_push(handle->eventq, e); } else { snmp_bc_free_oh_event(e); } } } return(SA_OK); } /** * snmp_bc_construct_mx_rpt: * @e: Pointer to oh_event struct. * @res_info_ptr: Pointer to pointer of res_info_ptr * @ep_root: Pointer to chassis Root Entity Path which comes from openhpi.conf. * @blower_index: Index of discovered mx. * * Build rpt structure for a blade resource using model data * * Return values: * SA_OK - normal case. * SA_ERR_HPI_OUT_OF_MEMORY - Cannot allocate space for internal memory. * SA_ERR_HPI_INVALID_PARAMS - Pointer parameter(s) NULL. **/ SaErrorT snmp_bc_construct_mx_rpt(struct oh_event* e, struct ResourceInfo **res_info_ptr, SaHpiEntityPathT *ep_root, guint mx_index) { if (!e || !res_info_ptr) return (SA_ERR_HPI_INVALID_PARAMS); e->resource = snmp_bc_rpt_array[BC_RPT_ENTRY_MUX_MODULE].rpt; oh_concat_ep(&(e->resource.ResourceEntity), ep_root); oh_set_ep_location(&(e->resource.ResourceEntity), BLADECENTER_MUX_SLOT, mx_index + SNMP_BC_HPI_LOCATION_BASE); oh_set_ep_location(&(e->resource.ResourceEntity), SAHPI_ENT_OTHER_CHASSIS_BOARD, mx_index + SNMP_BC_HPI_LOCATION_BASE); e->resource.ResourceId = oh_uid_from_entity_path(&(e->resource.ResourceEntity)); snmp_bc_create_resourcetag(&(e->resource.ResourceTag), snmp_bc_rpt_array[BC_RPT_ENTRY_MUX_MODULE].comment, mx_index + SNMP_BC_HPI_LOCATION_BASE); dbg("Discovered resource=%s; ID=%d", e->resource.ResourceTag.Data, e->resource.ResourceId); /* Create platform-specific info space to add to infra-structure */ *res_info_ptr = g_memdup(&(snmp_bc_rpt_array[BC_RPT_ENTRY_MUX_MODULE].res_info), sizeof(struct ResourceInfo)); if (!(*res_info_ptr)) { err("Out of memory."); return(SA_ERR_HPI_OUT_OF_MEMORY); } return(SA_OK); } /** * snmp_bc_add_mx_rptcache: * @handle: Pointer to hpi handle * @e: Pointer to oh_event struct. * @res_info_ptr: Pointer to pointer of res_info_ptr * @blower_index: Index of discovered mx. * * Build rpt and rdrs for a mx (Multiplex Card) then add to rptcache * * Return values: * SA_OK - normal case. * SA_ERR_HPI_OUT_OF_MEMORY - Cannot allocate space for internal memory. * SA_ERR_HPI_INVALID_PARAMS - Pointer parameter(s) NULL. **/ SaErrorT snmp_bc_add_mx_rptcache(struct oh_handler_state *handle, struct oh_event *e, struct ResourceInfo *res_info_ptr, guint mx_index) { SaErrorT err; guint mx_width; struct snmp_value get_value; struct snmp_bc_hnd *custom_handle; if (!handle || !e || !res_info_ptr) { err("Invalid parameter."); return(SA_ERR_HPI_INVALID_PARAMS); } custom_handle = (struct snmp_bc_hnd *)handle->data; if (!custom_handle) { err("Invalid parameter."); return(SA_ERR_HPI_INVALID_PARAMS); } dbg("Discovering Mux Card %d resource.\n", mx_index); res_info_ptr->cur_state = SAHPI_HS_STATE_ACTIVE; /* Get UUID and convert to GUID */ err = snmp_bc_get_guid(custom_handle, e, res_info_ptr); /* Add resource to temporary event cache/queue */ err = oh_add_resource(handle->rptcache, &(e->resource), res_info_ptr, 0); if (err) { err("Failed to add resource. Error=%s.", oh_lookup_error(err)); return(err); } /* ---------------------------------------- */ /* Construct .rdrs of struct oh_event */ /* ---------------------------------------- */ /* Find resource's events, sensors, controls, etc. */ snmp_bc_discover_res_events(handle, &(e->resource.ResourceEntity), res_info_ptr); snmp_bc_discover_sensors(handle, snmp_bc_mux_sensors, e); snmp_bc_discover_controls(handle, snmp_bc_mux_controls, e); snmp_bc_discover_inventories(handle, snmp_bc_mux_inventories, e); mx_width = 1; /* Default to 1-wide blade */ if (res_info_ptr->mib.OidResourceWidth != NULL) { err = snmp_bc_oid_snmp_get(custom_handle, &(e->resource.ResourceEntity), 0, res_info_ptr->mib.OidResourceWidth, &get_value, SAHPI_TRUE); if (!err && (get_value.type == ASN_INTEGER)) { mx_width = get_value.integer; } } res_info_ptr->resourcewidth = mx_width; err = snmp_bc_set_resource_slot_state_sensor(handle, e, mx_width); return(err); } /** * snmp_bc_discover_mx_i: * @handle: Pointer to hpi handle * @ep_root: Pointer to . * @blower_index: Index of discovered mx. * * Discover a particular MUX at index mx_index. * This routine is used to rediscover a Multiplexer Card (mx). * Blower rpt and rdrs will be added to rptcache. * No event will be generated. The event is handled separately in log2event. * * Return values: * SA_OK - normal case. * SA_ERR_HPI_OUT_OF_MEMORY - Cannot allocate space for internal memory. * SA_ERR_HPI_INVALID_PARAMS - Pointer parameter(s) NULL. **/ SaErrorT snmp_bc_discover_mx_i(struct oh_handler_state *handle, SaHpiEntityPathT *ep_root, guint mx_index) { SaErrorT err; struct oh_event *e; struct ResourceInfo *res_info_ptr; if (!handle) { err("Invalid parameter."); return(SA_ERR_HPI_INVALID_PARAMS); } e= NULL; res_info_ptr = NULL; e = snmp_bc_alloc_oh_event(); if (e == NULL) { err("Out of memory."); return(SA_ERR_HPI_OUT_OF_MEMORY); } /* ---------------------------------------- */ /* Construct .resource of struct oh_event */ /* ---------------------------------------- */ err = snmp_bc_construct_mx_rpt(e, &res_info_ptr, ep_root, mx_index); if (err) { snmp_bc_free_oh_event(e); return(err); } /* ---------------------------------------- */ /* Discover rdrs. */ /* Add rpt and rdrs to rptcache. */ /* ---------------------------------------- */ err = snmp_bc_add_mx_rptcache(handle, e, res_info_ptr, mx_index); snmp_bc_free_oh_event(e); return(SA_OK); } /** * snmp_bc_discover_power_module: * @handler: Pointer to handler's data. * @ep_root: Pointer to chassis Root Entity Path which comes from openhpi.conf. * @power_module_vector: Bitmap vector of installed power modules. * * Discovers power module resources and their RDRs. * * Return values: * SA_OK - normal case. * SA_ERR_HPI_OUT_OF_MEMORY - Cannot allocate space for internal memory. * SA_ERR_HPI_INVALID_PARAMS - Pointer parameter(s) NULL. **/ SaErrorT snmp_bc_discover_power_module(struct oh_handler_state *handle, SaHpiEntityPathT *ep_root, char *power_module_vector) { int i; SaErrorT err; struct oh_event *e; struct ResourceInfo *res_info_ptr; struct snmp_bc_hnd *custom_handle; if (!handle || !power_module_vector) { err("Invalid parameter."); return(SA_ERR_HPI_INVALID_PARAMS); } custom_handle = (struct snmp_bc_hnd *)handle->data; if (!custom_handle) { err("Invalid parameter."); return(SA_ERR_HPI_INVALID_PARAMS); } e = NULL; res_info_ptr = NULL; for (i=0; i < strlen(power_module_vector); i++) { if ((power_module_vector[i] == '1') || (custom_handle->isFirstDiscovery == SAHPI_TRUE)) { e = snmp_bc_alloc_oh_event(); if (e == NULL) { err("Out of memory."); return(SA_ERR_HPI_OUT_OF_MEMORY); } /* ---------------------------------------- */ /* Construct .resource of struct oh_event */ /* ---------------------------------------- */ err = snmp_bc_construct_pm_rpt(e, &res_info_ptr, ep_root, i); if (err) { snmp_bc_free_oh_event(e); return(err); } } if ((power_module_vector[i] == '0') && (custom_handle->isFirstDiscovery == SAHPI_TRUE)) { res_info_ptr->cur_state = SAHPI_HS_STATE_NOT_PRESENT; snmp_bc_discover_res_events(handle, &(e->resource.ResourceEntity), res_info_ptr); snmp_bc_free_oh_event(e); g_free(res_info_ptr); } else if (power_module_vector[i] == '1') { err = snmp_bc_add_pm_rptcache(handle, e, res_info_ptr, i); if (err == SA_OK) { /* ---------------------------------------- */ /* Construct .event of struct oh_event */ /* ---------------------------------------- */ snmp_bc_set_resource_add_oh_event(e, res_info_ptr); /* ---------------------------------------- */ /* Place the event in tmpqueue */ /* ---------------------------------------- */ /*custom_handle->eventq = g_slist_append(custom_handle->eventq, e);*/ e->hid = handle->hid; oh_evt_queue_push(handle->eventq, e); } else { snmp_bc_free_oh_event(e); } } } return(SA_OK); } /** * snmp_bc_discover_switch: * @handler: Pointer to handler's data. * @ep_root: Pointer to chassis Root Entity Path which comes from openhpi.conf. * @switch_vector: Bitmap vector of installed I/O modules. * * Discovers I/O module resources and their RDRs. * * Return values: * SA_OK - normal case. * SA_ERR_HPI_OUT_OF_MEMORY - Cannot allocate space for internal memory. * SA_ERR_HPI_INVALID_PARAMS - Pointer parameter(s) NULL. **/ SaErrorT snmp_bc_discover_switch(struct oh_handler_state *handle, SaHpiEntityPathT *ep_root, char *switch_vector) { int i; SaErrorT err; struct oh_event *e; struct ResourceInfo *res_info_ptr; struct snmp_bc_hnd *custom_handle; if (!handle || !switch_vector) { err("Invalid parameter."); return(SA_ERR_HPI_INVALID_PARAMS); } custom_handle = (struct snmp_bc_hnd *)handle->data; if (!custom_handle) { err("Invalid parameter."); return(SA_ERR_HPI_INVALID_PARAMS); } e = NULL; res_info_ptr = NULL; for (i=0; i < strlen(switch_vector); i++) { if ((switch_vector[i] == '1') || (custom_handle->isFirstDiscovery == SAHPI_TRUE)) { e = snmp_bc_alloc_oh_event(); if (e == NULL) { err("Out of memory."); return(SA_ERR_HPI_OUT_OF_MEMORY); } /* ---------------------------------------- */ /* Construct .resource of struct oh_event */ /* ---------------------------------------- */ err = snmp_bc_construct_sm_rpt(e, &res_info_ptr, ep_root, i, custom_handle->installed_smi_mask); if (err) { snmp_bc_free_oh_event(e); return(err); } } if ((switch_vector[i] == '0') && (custom_handle->isFirstDiscovery == SAHPI_TRUE)) { res_info_ptr->cur_state = SAHPI_HS_STATE_NOT_PRESENT; snmp_bc_discover_res_events(handle, &(e->resource.ResourceEntity), res_info_ptr); snmp_bc_free_oh_event(e); g_free(res_info_ptr); } else if (switch_vector[i] == '1') { err = snmp_bc_add_switch_rptcache(handle, e, res_info_ptr, i); if (err == SA_OK) { /* ---------------------------------------- */ /* Construct .event of struct oh_event */ /* ---------------------------------------- */ snmp_bc_set_resource_add_oh_event(e, res_info_ptr); /* ---------------------------------------- */ /* Place the event in tmpqueue */ /* ---------------------------------------- */ /*custom_handle->eventq = g_slist_append(custom_handle->eventq, e);*/ if (e) e->hid = handle->hid; oh_evt_queue_push(handle->eventq, e); } else { snmp_bc_free_oh_event(e); } } } return(SA_OK); } /** * snmp_bc_discover_mm: * @handler: Pointer to handler's data. * @ep_root: Pointer to chassis Root Entity Path which comes from openhpi.conf. * @mm_vector: Bitmap vector of installed MMs. * @global_discovery: Also include Virtual MM in the discovery * * Discovers management module (MM) resources and their RDRs. * * Return values: * SA_OK - normal case. * SA_ERR_HPI_OUT_OF_MEMORY - Cannot allocate space for internal memory. * SA_ERR_HPI_INVALID_PARAMS - Pointer parameter(s) NULL. **/ SaErrorT snmp_bc_discover_mm(struct oh_handler_state *handle, SaHpiEntityPathT *ep_root, char *mm_vector, SaHpiBoolT global_discovery) { guint i; SaErrorT err; struct oh_event *e; struct snmp_value get_value; SaHpiRdrT *rdr; struct SensorInfo *sinfo; struct ResourceInfo *res_info_ptr; struct snmp_bc_hnd *custom_handle; if (!handle || !mm_vector) { err("Invalid parameter."); return(SA_ERR_HPI_INVALID_PARAMS); } custom_handle = (struct snmp_bc_hnd *)handle->data; if (!custom_handle) { err("Invalid parameter."); return(SA_ERR_HPI_INVALID_PARAMS); } e = NULL; res_info_ptr = NULL; /* Discover Virtual MM */ if (global_discovery == SAHPI_TRUE) { e = snmp_bc_alloc_oh_event(); if (e == NULL) { err("Out of memory."); return(SA_ERR_HPI_OUT_OF_MEMORY); } /* ---------------------------------------- */ /* Construct .resource of struct oh_event */ /* ---------------------------------------- */ e->resource = snmp_bc_rpt_array[BC_RPT_ENTRY_VIRTUAL_MGMNT_MODULE].rpt; oh_concat_ep(&(e->resource.ResourceEntity), ep_root); oh_set_ep_location(&(e->resource.ResourceEntity), SAHPI_ENT_SYS_MGMNT_MODULE, 0); e->resource.ResourceId = oh_uid_from_entity_path(&(e->resource.ResourceEntity)); snmp_bc_create_resourcetag(&(e->resource.ResourceTag), snmp_bc_rpt_array[BC_RPT_ENTRY_VIRTUAL_MGMNT_MODULE].comment, 0); dbg("Discovered resource=%s; ID=%d", e->resource.ResourceTag.Data, e->resource.ResourceId); /* Create platform-specific info space to add to infra-structure */ res_info_ptr = g_memdup(&(snmp_bc_rpt_array[BC_RPT_ENTRY_VIRTUAL_MGMNT_MODULE].res_info), sizeof(struct ResourceInfo)); if (!res_info_ptr) { err("Out of memory."); snmp_bc_free_oh_event(e); return(SA_ERR_HPI_OUT_OF_MEMORY); } /* Add resource to resource cache */ err = oh_add_resource(handle->rptcache, &(e->resource), res_info_ptr, 0); if (err) { err("Failed to add resource. Error=%s.", oh_lookup_error(err)); snmp_bc_free_oh_event(e); return(err); } /* ---------------------------------------- */ /* Construct .rdrs of struct oh_event */ /* ---------------------------------------- */ /* Find resource's events, sensors, controls, etc. */ snmp_bc_discover_res_events(handle, &(e->resource.ResourceEntity), res_info_ptr); snmp_bc_discover_sensors(handle, snmp_bc_virtual_mgmnt_sensors, e); snmp_bc_discover_controls(handle, snmp_bc_virtual_mgmnt_controls, e); snmp_bc_discover_inventories(handle, snmp_bc_virtual_mgmnt_inventories, e); /* -------------------------------------------- */ /* Adjust initial state of VMM Redudancy Sensor */ /* -------------------------------------------- */ rdr = oh_get_rdr_by_type(handle->rptcache, e->resource.ResourceId, SAHPI_SENSOR_RDR, BLADECENTER_SENSOR_NUM_MGMNT_REDUNDANCY); if (rdr) { sinfo = (struct SensorInfo *)oh_get_rdr_data(handle->rptcache, e->resource.ResourceId, rdr->RecordId); if ((strncmp(mm_vector, "11", 2) == 0)) { sinfo->cur_state = SAHPI_ES_FULLY_REDUNDANT; } else { sinfo->cur_state = SAHPI_ES_NON_REDUNDANT_INSUFFICIENT_RESOURCES; } sinfo->cur_child_rid = e->resource.ResourceId; err = oh_add_rdr(handle->rptcache, e->resource.ResourceId, rdr, sinfo, 0); } rdr = oh_get_rdr_by_type(handle->rptcache, e->resource.ResourceId, SAHPI_SENSOR_RDR, BLADECENTER_SENSOR_NUM_MGMNT_STANDBY); if (rdr) { sinfo = (struct SensorInfo *)oh_get_rdr_data(handle->rptcache, e->resource.ResourceId, rdr->RecordId); if ((strncmp(mm_vector, "11", 2) == 0)) { sinfo->cur_state = SAHPI_ES_PRESENT; } else { sinfo->cur_state = SAHPI_ES_ABSENT; } sinfo->cur_child_rid = e->resource.ResourceId; err = oh_add_rdr(handle->rptcache, e->resource.ResourceId, rdr, sinfo, 0); } /* ---------------------------------------- */ /* Construct .event of struct oh_event */ /* ---------------------------------------- */ snmp_bc_set_resource_add_oh_event(e, res_info_ptr); /* ---------------------------------------- */ /* Place the event in tmpqueue */ /* ---------------------------------------- */ /*custom_handle->eventq = g_slist_append(custom_handle->eventq, e);*/ e->hid = handle->hid; oh_evt_queue_push(handle->eventq, e); } /* Discover Physical MM */ for (i=0; i < strlen(mm_vector); i++) { dbg("Management Module installed bit map %s", get_value.string); if ((mm_vector[i] == '1') || (custom_handle->isFirstDiscovery == SAHPI_TRUE)) { e = snmp_bc_alloc_oh_event(); if (e == NULL) { err("Out of memory."); return(SA_ERR_HPI_OUT_OF_MEMORY); } /* ---------------------------------------- */ /* Construct .resource of struct oh_event */ /* ---------------------------------------- */ err = snmp_bc_construct_mm_rpt(e, &res_info_ptr, ep_root, i, custom_handle->installed_mmi_mask); if (err) { snmp_bc_free_oh_event(e); return(err); } } if ((mm_vector[i] == '0') && (custom_handle->isFirstDiscovery == SAHPI_TRUE)) { res_info_ptr->cur_state = SAHPI_HS_STATE_NOT_PRESENT; snmp_bc_discover_res_events(handle, &(e->resource.ResourceEntity), res_info_ptr); snmp_bc_free_oh_event(e); g_free(res_info_ptr); } else if (mm_vector[i] == '1'){ err = snmp_bc_add_mm_rptcache(handle, e, res_info_ptr, i); if (err == SA_OK) { /* ---------------------------------------- */ /* Construct .event of struct oh_event */ /* ---------------------------------------- */ snmp_bc_set_resource_add_oh_event(e, res_info_ptr); /* ---------------------------------------- */ /* Place the event in tmpqueue */ /* ---------------------------------------- */ /*custom_handle->eventq = g_slist_append(custom_handle->eventq, e);*/ if (e) e->hid = handle->hid; oh_evt_queue_push(handle->eventq, e); } else snmp_bc_free_oh_event(e); } } return(SA_OK); } /** * snmp_bc_discover_ipmi_sensors: * @handler: Pointer to handler's data. * @sensor_array: Pointer to resource's static sensor data array. * @parent_res_event: Pointer to resource's event structure. * * Discovers resource's available IPMI sensors and their events. * * Return values: * Adds sensor RDRs to internal Infra-structure queues - normal case * SA_ERR_HPI_OUT_OF_MEMORY - Cannot allocate space for internal memory **/ static SaErrorT snmp_bc_discover_ipmi_sensors(struct oh_handler_state *handle, struct snmp_bc_ipmi_sensor *sensor_array, struct oh_event *res_oh_event) { int i; GHashTable *ipmi_sensor_hash; SaErrorT err, rtn_code = SA_OK; struct SensorMibInfo *mib_info; struct snmp_bc_hnd *custom_handle; struct snmp_value get_value; SaHpiRdrT *rdrptr; struct SensorInfo *sinfo; custom_handle = (struct snmp_bc_hnd *)handle->data; /* Check if this is an IPMI blade */ err = snmp_bc_oid_snmp_get(custom_handle, &(res_oh_event->resource.ResourceEntity), 0, SNMP_BC_IPMI_TEMP_BLADE_OID, &get_value, SAHPI_FALSE); if (err || get_value.type != ASN_INTEGER) { err("Cannot get OID=%s; Received Type=%d; Error=%s.", SNMP_BC_IPMI_TEMP_BLADE_OID, get_value.type, oh_lookup_error(err)); if (err) { return(err); } else { return(SA_ERR_HPI_INTERNAL_ERROR); } } if (get_value.integer == 0) return(SA_OK); /* Not an IPMI Blade */ /* Create an temporary hash table and populate with all of the blade's active IPMI sensors */ ipmi_sensor_hash = g_hash_table_new(g_str_hash, g_str_equal); if (ipmi_sensor_hash == NULL) { err("Out of memory."); return(SA_ERR_HPI_OUT_OF_MEMORY); } /***************************************** * Search for all the defined IPMI sensors *****************************************/ /* Find blade's defined temperature IPMI sensors */ for (i=0; iresource.ResourceEntity), 0, snmp_bc_ipmi_sensors_temp[i].oid, &get_value, SAHPI_FALSE); if (!err) { char *hash_existing_key, *hash_value; gchar **strparts = NULL; gchar *s, *ipmi_tag; /* Find IPMI tag in returned value */ strparts = g_strsplit(get_value.string, SNMP_BC_IPMI_STRING_DELIMITER, -1); if (strparts == NULL || strparts[0] == '\0') { err("Cannot split IPMI temp returned value=%s.", get_value.string); g_strfreev(strparts); continue; } ipmi_tag = g_strstrip(g_strdup(strparts[0])); g_strfreev(strparts); if (ipmi_tag == NULL || ipmi_tag[0] == '\0') { err("Stripped IPMI tag is NULL"); g_free(ipmi_tag); continue; } /* Change IPMI Tag to upper case */ for (s=ipmi_tag; *s; s++) { *s = g_ascii_toupper(*s); } dbg("Found OID IPMI sensor=%s", ipmi_tag); /* Insert tag and OID info in temporary hash */ if (!g_hash_table_lookup_extended(ipmi_sensor_hash, ipmi_tag, (gpointer)&hash_existing_key, (gpointer)&hash_value)) { mib_info = g_memdup(&(snmp_bc_ipmi_sensors_temp[i]), sizeof(struct SensorMibInfo)); if (!mib_info) { err("Out of memory."); g_free(ipmi_tag); rtn_code = SA_ERR_HPI_OUT_OF_MEMORY; goto CLEANUP; } g_hash_table_insert(ipmi_sensor_hash, ipmi_tag, mib_info); } else { /* Already exists */ err("Duplicate IPMI OID=%s.", snmp_bc_ipmi_sensors_temp[i].oid); g_free(ipmi_tag); } } } /* Find blade's voltage IPMI sensors */ for (i=0; iresource.ResourceEntity), 0, snmp_bc_ipmi_sensors_voltage[i].oid, &get_value, SAHPI_FALSE); if (!err) { char *hash_existing_key, *hash_value; gchar **strparts = NULL; gchar *s, *ipmi_tag; /* Find IPMI tag in returned value */ strparts = g_strsplit(get_value.string, SNMP_BC_IPMI_STRING_DELIMITER, -1); if (strparts == NULL || strparts[0] == '\0') { err("Cannot split IPMI voltage returned value=%s.", get_value.string); g_strfreev(strparts); continue; } ipmi_tag = g_strstrip(g_strdup(strparts[0])); g_strfreev(strparts); if (ipmi_tag == NULL || ipmi_tag[0] == '\0') { err("Stripped IPMI tag is NULL"); g_free(ipmi_tag); continue; } /* Change IPMI Tag to upper case */ for (s=ipmi_tag; *s; s++) { *s = g_ascii_toupper(*s); } dbg("Found OID IPMI sensor=%s", ipmi_tag); /* Insert tag and OID info in temporary hash */ if (!g_hash_table_lookup_extended(ipmi_sensor_hash, ipmi_tag, (gpointer)&hash_existing_key, (gpointer)&hash_value)) { mib_info = g_memdup(&(snmp_bc_ipmi_sensors_voltage[i]), sizeof(struct SensorMibInfo)); if (!mib_info) { err("Out of memory."); g_free(ipmi_tag); rtn_code = SA_ERR_HPI_OUT_OF_MEMORY; goto CLEANUP; } g_hash_table_insert(ipmi_sensor_hash, ipmi_tag, mib_info); } else { /* Already exists */ dbg("Duplicate IPMI OID=%s.", snmp_bc_ipmi_sensors_voltage[i].oid); g_free(ipmi_tag); } } } /* Iterate thru all the possible IPMI sensors, if it's defined for this blade, push up its RDR info to Infra-structure */ for (i=0; sensor_array[i].ipmi.index != 0; i++) { mib_info = (struct SensorMibInfo *)g_hash_table_lookup(ipmi_sensor_hash, sensor_array[i].ipmi_tag); /* See if the tag has an alias */ if (!mib_info && (sensor_array[i].ipmi_tag_alias1 && sensor_array[i].ipmi_tag_alias1[0] != '\0')) { mib_info = (struct SensorMibInfo *)g_hash_table_lookup(ipmi_sensor_hash, sensor_array[i].ipmi_tag_alias1); } if (mib_info) { rdrptr = (SaHpiRdrT *)g_malloc0(sizeof(SaHpiRdrT)); if (rdrptr == NULL) { err("Out of memory."); rtn_code = SA_ERR_HPI_OUT_OF_MEMORY; goto CLEANUP; } rdrptr->RdrType = SAHPI_SENSOR_RDR; rdrptr->Entity = res_oh_event->resource.ResourceEntity; err = snmp_bc_mod_sensor_ep(rdrptr, sensor_array, i); rdrptr->RdrTypeUnion.SensorRec = sensor_array[i].ipmi.sensor; dbg("Blade Found IPMI Sensor=%s", sensor_array[i].ipmi.comment); oh_init_textbuffer(&(rdrptr->IdString)); oh_append_textbuffer(&(rdrptr->IdString), sensor_array[i].ipmi.comment); sinfo = g_memdup(&(sensor_array[i].ipmi.sensor_info), sizeof(struct SensorInfo)); if (!sinfo) { err("Out of memory."); rtn_code = SA_ERR_HPI_OUT_OF_MEMORY; g_free(rdrptr); goto CLEANUP; } sinfo->mib = *mib_info; /* Add rdr to resource cache */ err = oh_add_rdr(handle->rptcache, res_oh_event->resource.ResourceId, rdrptr, sinfo, 0); if (err) { err("Cannot add RDR. Error=%s.", oh_lookup_error(err)); g_free(rdrptr); } else { res_oh_event->rdrs = g_slist_append(res_oh_event->rdrs, rdrptr); snmp_bc_discover_sensor_events(handle, &(res_oh_event->resource.ResourceEntity), sensor_array[i].ipmi.sensor.Num, &(sensor_array[i].ipmi)); } } } CLEANUP: /* Destroy temporary hash table */ g_hash_table_foreach(ipmi_sensor_hash, free_hash_data, NULL); g_hash_table_destroy(ipmi_sensor_hash); return(rtn_code); } static void free_hash_data(gpointer key, gpointer value, gpointer user_data) { g_free(key); g_free(value); } /** * snmp_bc_rediscover: * @handler: Pointer to handler's data. * @event: Pointer to event being processed. * * Check install masks and target discovery * -- If resource is removed, then remove rpt and associated rdr's * -- In resource is newly installed, then rediscover ... * * Return values: * **/ SaErrorT snmp_bc_rediscover(struct oh_handler_state *handle, SaHpiEventT *working_event, LogSource2ResourceT *logsrc2res) { SaErrorT err; gint i, j; SaHpiRptEntryT *res; guint rediscovertype; SaHpiBoolT foundit, isSMI; struct snmp_value get_value; struct snmp_bc_hnd *custom_handle; char *root_tuple; struct ResourceInfo *resinfo; char resource_mask[SNMP_BC_MAX_RESOURCES_MASK]; SaHpiEntityPathT ep_root; SaHpiEntityTypeT hotswap_entitytype; SaHpiEntityLocationT hotswap_entitylocation; if (!handle) { err("Invalid parameter."); return(SA_ERR_HPI_INVALID_PARAMS); } custom_handle = (struct snmp_bc_hnd *)handle->data; if (!custom_handle) { err("Invalid parameter."); return(SA_ERR_HPI_INVALID_PARAMS); } memset(&resource_mask, 0, SNMP_BC_MAX_RESOURCES_MASK); rediscovertype = snmp_bc_isrediscover(working_event); /* ------------------------------------------------------------------ */ /* Parse EntityPath to find out the type of resource being hotswapped */ /* ------------------------------------------------------------------ */ memset(resource_mask, '\0', SNMP_BC_MAX_RESOURCES_MASK); isSMI = SAHPI_FALSE; foundit = SAHPI_FALSE; hotswap_entitytype = SAHPI_ENT_UNKNOWN; hotswap_entitylocation = SNMP_BC_NOT_VALID; /* Invalid location */ /* Do not use 0 for invalid location */ /* because virtual resource has loc 0 */ for (i=0; logsrc2res->ep.Entry[i].EntityType != SAHPI_ENT_SYSTEM_CHASSIS; i++) { switch (logsrc2res->ep.Entry[i].EntityType) { case SAHPI_ENT_SBC_BLADE: case SAHPI_ENT_FAN: case SAHPI_ENT_POWER_SUPPLY: case SAHPI_ENT_SWITCH: case SAHPI_ENT_SYS_MGMNT_MODULE: case SAHPI_ENT_PERIPHERAL_BAY: case SAHPI_ENT_DISPLAY_PANEL: case SAHPI_ENT_OTHER_CHASSIS_BOARD: case (SAHPI_ENT_BATTERY + 13): case (SAHPI_ENT_PHYSICAL_SLOT + 16): case SAHPI_ENT_INTERCONNECT: foundit = SAHPI_TRUE; hotswap_entitytype = logsrc2res->ep.Entry[i].EntityType; hotswap_entitylocation = logsrc2res->ep.Entry[i].EntityLocation; for (j=0; j < SNMP_BC_MAX_RESOURCES_MASK; j++) { if ( j != (hotswap_entitylocation - 1) ) resource_mask[j] = '0'; else resource_mask[j] = '1'; } isSMI = SAHPI_TRUE; if ( logsrc2res->ep.Entry[i].EntityType == SAHPI_ENT_INTERCONNECT) { if (logsrc2res->ep.Entry[i+1].EntityType == BLADECENTER_SYS_MGMNT_MODULE_SLOT) { isSMI = SAHPI_FALSE; } } break; default: break; } if (foundit) break; } if ( (!foundit) || ( hotswap_entitylocation == 0xFF) ) { err("Hotswap event for non hotswap-able resource\n"); return(SA_OK); } /* ------------------------------------------------------------------ */ /* Hotswap: removal ... */ /* remove rpt and associated rdrs of the removed resource */ /* ------------------------------------------------------------------ */ if (rediscovertype == SNMP_BC_RESOURCE_REMOVED ) { res = oh_get_resource_by_id(handle->rptcache, working_event->Source); resinfo = (struct ResourceInfo *)oh_get_resource_data(handle->rptcache, working_event->Source); if (res) { /* Remove resource, rpt and rdr's, from plugin copy of rptcache */ /* No longer need to generate OH_ET_RESOURCE_DEL event, */ /* because the new oh_event struct handler will remove infrastru*/ /* rpt and rdr's based on hotswap event state. */ if (resinfo) resinfo->cur_state = SAHPI_HS_STATE_NOT_PRESENT; err = snmp_bc_reset_resource_slot_state_sensor(handle, res); oh_remove_resource(handle->rptcache, res->ResourceId); switch (hotswap_entitytype) { case SAHPI_ENT_SBC_BLADE: /* Fetch blade installed vector */ get_installed_mask(SNMP_BC_PB_INSTALLED, get_value); strncpy(custom_handle->installed_pb_mask, get_value.string, SNMP_BC_MAX_RESOURCES_MASK); break; case SAHPI_ENT_FAN: /* Fetch blower installed vector */ get_installed_mask(SNMP_BC_BLOWER_INSTALLED, get_value); strncpy(custom_handle->installed_blower_mask, get_value.string, SNMP_BC_MAX_RESOURCES_MASK); break; case SAHPI_ENT_POWER_SUPPLY: /* Fetch power module installed vector */ get_installed_mask(SNMP_BC_PM_INSTALLED, get_value); strncpy(custom_handle->installed_pm_mask, get_value.string, SNMP_BC_MAX_RESOURCES_MASK); break; case SAHPI_ENT_SWITCH: /* Fetch switch installed vector */ get_installed_mask(SNMP_BC_SM_INSTALLED, get_value); strncpy(custom_handle->installed_sm_mask, get_value.string, SNMP_BC_MAX_RESOURCES_MASK); break; case SAHPI_ENT_SYS_MGMNT_MODULE: /* Fetch MMs installed vector */ get_installed_mask(SNMP_BC_MM_INSTALLED, get_value); strncpy(custom_handle->installed_mm_mask, get_value.string, SNMP_BC_MAX_RESOURCES_MASK); break; case SAHPI_ENT_PERIPHERAL_BAY: /* get_dualmode_object(SNMP_BC_MT_INSTALLED, get_value); */ snmp_bc_fetch_MT_install_mask(handle, &get_value); custom_handle->installed_mt_mask = get_value.integer; break; case (SAHPI_ENT_PHYSICAL_SLOT + 16): /* Fetch filter (front bezel) installed vector */ get_dualmode_object(SNMP_BC_FILTER_INSTALLED, get_value); custom_handle->installed_filter_mask = get_value.integer; break; case SAHPI_ENT_DISPLAY_PANEL: /* Fetch telco-alarm-panel installed vector */ get_installed_mask(SNMP_BC_AP_INSTALLED, get_value); strncpy(custom_handle->installed_tap_mask, get_value.string, SNMP_BC_MAX_RESOURCES_MASK); break; case (SAHPI_ENT_BATTERY + 13): /* Fetch network-clock-card installed vector */ get_installed_mask(SNMP_BC_NC_INSTALLED, get_value); strncpy(custom_handle->installed_nc_mask, get_value.string, SNMP_BC_MAX_RESOURCES_MASK); break; case SAHPI_ENT_OTHER_CHASSIS_BOARD: /* Fetch mux-card installed vector */ get_installed_mask(SNMP_BC_MX_INSTALLED, get_value); strncpy(custom_handle->installed_mx_mask, get_value.string, SNMP_BC_MAX_RESOURCES_MASK); break; case SAHPI_ENT_INTERCONNECT: /* Fetch new interposer-card installed vector */ if(isSMI) { get_installed_mask(SNMP_BC_SMI_INSTALLED, get_value); strncpy(custom_handle->installed_smi_mask, get_value.string, SNMP_BC_MAX_RESOURCES_MASK); } else { get_installed_mask(SNMP_BC_MMI_INSTALLED, get_value); strncpy(custom_handle->installed_mmi_mask, get_value.string, SNMP_BC_MAX_RESOURCES_MASK); } break; default: err("Unrecognize Hotswap Entity %d\n", hotswap_entitytype); break; } } else err("No valid resource at hand. Could not remove resource."); return(SA_OK); } if ( rediscovertype == SNMP_BC_RESOURCE_INSTALLED) { oh_init_ep(&ep_root); root_tuple = (gchar *)g_hash_table_lookup(handle->config, "entity_root"); oh_encode_entitypath(root_tuple, &ep_root); /* Initialize tmpqueue for temporary RDR cache */ /* tmpqueue is no longer used, 08/16/06 */ /* custom_handle->tmpqueue = NULL; */ /* --------------------------------------------------------- */ /* Fetch various resource installation maps from BladeCenter */ /* --------------------------------------------------------- */ switch (hotswap_entitytype) { case SAHPI_ENT_SBC_BLADE: /* Fetch blade installed vector */ get_installed_mask(SNMP_BC_PB_INSTALLED, get_value); for (i=0; i < strlen(get_value.string); i++) { if ( custom_handle->installed_pb_mask[i] != get_value.string[i] ) { err = snmp_bc_discover_blade_i(handle, &ep_root,i); } } strncpy(custom_handle->installed_pb_mask, get_value.string, SNMP_BC_MAX_RESOURCES_MASK); break; case SAHPI_ENT_FAN: /* Fetch blower installed vector */ get_installed_mask(SNMP_BC_BLOWER_INSTALLED, get_value); for (i=0; i < strlen(get_value.string); i++) { if ( custom_handle->installed_blower_mask[i] != get_value.string[i] ) { err = snmp_bc_discover_blower_i(handle, &ep_root,i); } } strncpy(custom_handle->installed_blower_mask, get_value.string, SNMP_BC_MAX_RESOURCES_MASK); break; case SAHPI_ENT_POWER_SUPPLY: /* Fetch power module installed vector */ get_installed_mask(SNMP_BC_PM_INSTALLED, get_value); for (i=0; i < strlen(get_value.string); i++) { if ( custom_handle->installed_pm_mask[i] != get_value.string[i] ) { err = snmp_bc_discover_pm_i(handle, &ep_root,i); } } strncpy(custom_handle->installed_pm_mask, get_value.string, SNMP_BC_MAX_RESOURCES_MASK); break; case SAHPI_ENT_SWITCH: /* Fetch switch installed vector */ get_installed_mask(SNMP_BC_SM_INSTALLED, get_value); for (i=0; i < strlen(get_value.string); i++) { if ( custom_handle->installed_sm_mask[i] != get_value.string[i] ) { err = snmp_bc_discover_switch_i(handle, &ep_root,i); } } strncpy(custom_handle->installed_sm_mask, get_value.string, SNMP_BC_MAX_RESOURCES_MASK); break; case SAHPI_ENT_SYS_MGMNT_MODULE: /* Fetch MMs installed vector */ get_installed_mask(SNMP_BC_MM_INSTALLED, get_value); for (i=0; i < strlen(get_value.string); i++) { if ( custom_handle->installed_mm_mask[i] != get_value.string[i] ) { err = snmp_bc_discover_mm_i(handle, &ep_root,i); } } strncpy(custom_handle->installed_mm_mask, get_value.string, SNMP_BC_MAX_RESOURCES_MASK); break; case SAHPI_ENT_PERIPHERAL_BAY: /* get_dualmode_object(SNMP_BC_MT_INSTALLED, get_value); */ snmp_bc_fetch_MT_install_mask(handle, &get_value); custom_handle->installed_mt_mask = get_value.integer; switch (hotswap_entitylocation) { case 1: err = snmp_bc_discover_media_tray(handle, &ep_root, 10); break; case 2: err = snmp_bc_discover_media_tray(handle, &ep_root, 01); break; default: break; } break; case SAHPI_ENT_DISPLAY_PANEL: get_installed_mask(SNMP_BC_AP_INSTALLED, get_value); for (i=0; i < strlen(get_value.string); i++) { if ( custom_handle->installed_tap_mask[i] != get_value.string[i] ) { err = snmp_bc_discover_tap_i(handle, &ep_root,i); } } strncpy(custom_handle->installed_tap_mask, get_value.string, SNMP_BC_MAX_RESOURCES_MASK); break; case SAHPI_ENT_OTHER_CHASSIS_BOARD: /* Fetch mux-card installed vector */ get_installed_mask(SNMP_BC_MX_INSTALLED, get_value); for (i=0; i < strlen(get_value.string); i++) { if ( custom_handle->installed_mx_mask[i] != get_value.string[i] ) { err = snmp_bc_discover_mx_i(handle, &ep_root,i); } } strncpy(custom_handle->installed_mx_mask, get_value.string, SNMP_BC_MAX_RESOURCES_MASK); break; case (SAHPI_ENT_BATTERY + 13): /* Fetch network-clock-card installed vector */ get_installed_mask(SNMP_BC_NC_INSTALLED, get_value); for (i=0; i < strlen(get_value.string); i++) { if ( custom_handle->installed_nc_mask[i] != get_value.string[i] ) { err = snmp_bc_discover_nc_i(handle, &ep_root,i); } } strncpy(custom_handle->installed_nc_mask, get_value.string, SNMP_BC_MAX_RESOURCES_MASK); break; case (SAHPI_ENT_PHYSICAL_SLOT + 16): /* Fetch filter (front bezel) installed vector */ get_dualmode_object(SNMP_BC_FILTER_INSTALLED, get_value); err = snmp_bc_discover_filter(handle, &ep_root, get_value.integer); custom_handle->installed_filter_mask = get_value.integer; break; case SAHPI_ENT_INTERCONNECT: if (isSMI) { /* Fetch Switch Module Interposer installed vector */ get_installed_mask(SNMP_BC_SMI_INSTALLED, get_value); for (i=0; i < strlen(get_value.string); i++) { if ( custom_handle->installed_smi_mask[i] != get_value.string[i] ) { err = snmp_bc_discover_smi_i(handle, &ep_root,i); } } strncpy(custom_handle->installed_smi_mask, get_value.string, SNMP_BC_MAX_RESOURCES_MASK); } else { /* Fetch Management Module Interposer installed vector */ get_installed_mask(SNMP_BC_MMI_INSTALLED, get_value); for (i=0; i < strlen(get_value.string); i++) { if ( custom_handle->installed_mmi_mask[i] != get_value.string[i] ) { err = snmp_bc_discover_mmi_i(handle, &ep_root,i); } } strncpy(custom_handle->installed_mmi_mask, get_value.string, SNMP_BC_MAX_RESOURCES_MASK); } break; default: err("Unrecognize Hotswap Entity %d\n", hotswap_entitytype); break; } /** ** Before returning, see if we need to readjust current Hotswap state. ** (1) Previously, snmp_bc_log2event()/snmp_bc_set_cur_prev_event_states() set ** HotSwapState = SAHPI_HS_STATE_INACTIVE by default if there **was** no rpt, ** no resinfo. ** (2) Now that rediscovery is complete, check handle->rptcache for this resource ** CAPABILITY. If it is Managed Hotswap, then INACTIVE HotSwapState is OK. ** If it is Simple Hotswap, then HotSwapState needs to be set to ACTIVE in both event ** and resinfo. **/ res = oh_get_resource_by_ep(handle->rptcache, &logsrc2res->ep); if (res) { if ( (working_event->EventType == SAHPI_ET_HOTSWAP) && (working_event->EventDataUnion.HotSwapEvent.HotSwapState == SAHPI_HS_STATE_INACTIVE) ) { if (!(res->ResourceCapabilities & SAHPI_CAPABILITY_MANAGED_HOTSWAP)) { resinfo = (struct ResourceInfo *)oh_get_resource_data(handle->rptcache, working_event->Source); resinfo->cur_state = working_event->EventDataUnion.HotSwapEvent.HotSwapState = SAHPI_HS_STATE_ACTIVE; } } } } return(SA_OK); } /** * snmp_bc_discover_all_slots * @handler: Pointer to handler's data. * @ep_root: Pointer to chassis Root Entity Path which comes from openhpi.conf. * * Discovers all BladeCenter physical slots. * * Return values: * SA_OK - normal case. * SA_ERR_HPI_OUT_OF_MEMORY - Cannot allocate space for internal memory. * SA_ERR_HPI_INVALID_PARAMS - Pointer parameter(s) NULL. **/ SaErrorT snmp_bc_discover_all_slots(struct oh_handler_state *handle, SaHpiEntityPathT *ep_root) { guint i; SaErrorT err; struct snmp_bc_hnd *custom_handle; if (!handle || !ep_root) { err("Invalid parameter."); return(SA_ERR_HPI_INVALID_PARAMS); } custom_handle = (struct snmp_bc_hnd *)handle->data; if (!custom_handle) { err("Invalid parameter."); return(SA_ERR_HPI_INVALID_PARAMS); } for (i = 0; i < custom_handle->max_pb_supported; i++) { err = snmp_bc_discover_slot(handle, ep_root, SAHPI_ENT_PHYSICAL_SLOT,i); } for (i = 0; i < custom_handle->max_blower_supported; i++) { err = snmp_bc_discover_slot(handle, ep_root, BLADECENTER_BLOWER_SLOT,i); } for (i = 0; i < custom_handle->max_pm_supported; i++) { err = snmp_bc_discover_slot(handle, ep_root, BLADECENTER_POWER_SUPPLY_SLOT,i); } for (i = 0; i < custom_handle->max_sm_supported; i++) { err = snmp_bc_discover_slot(handle, ep_root, BLADECENTER_SWITCH_SLOT,i); } for (i = 0; i < custom_handle->max_mm_supported; i++) { err = snmp_bc_discover_slot(handle, ep_root, BLADECENTER_SYS_MGMNT_MODULE_SLOT,i); } for (i = 0; i < custom_handle->max_mt_supported; i++) { err = snmp_bc_discover_slot(handle, ep_root, BLADECENTER_PERIPHERAL_BAY_SLOT,i); } for (i = 0; i < custom_handle->max_tap_supported; i++) { err = snmp_bc_discover_slot(handle, ep_root, BLADECENTER_ALARM_PANEL_SLOT,i); } for (i = 0; i < custom_handle->max_nc_supported; i++) { err = snmp_bc_discover_slot(handle, ep_root, BLADECENTER_CLOCK_SLOT,i); } for (i = 0; i < custom_handle->max_mx_supported; i++) { err = snmp_bc_discover_slot(handle, ep_root, BLADECENTER_MUX_SLOT,i); } return(SA_OK); } /** * snmp_bc_discovery_slot: * @handler: Pointer to handler's data. * @ep_root: Pointer to chassis Root Entity Path which comes from openhpi.conf. * @entitytype: Resource type of the slot. * @entitylocation: Slot location of the resource. * * Discovers slot resources and their RDRs. * * Return values: * SA_OK - normal case. * SA_ERR_HPI_OUT_OF_MEMORY - Cannot allocate space for internal memory. * SA_ERR_HPI_INVALID_PARAMS - Pointer parameter(s) NULL. **/ SaErrorT snmp_bc_discover_slot( struct oh_handler_state *handle, SaHpiEntityPathT *ep_root, SaHpiEntityTypeT entitytype, guint entitylocation) { SaErrorT err; char *comment; struct oh_event *e; struct snmp_bc_hnd *custom_handle; struct ResourceInfo *res_info_ptr; if (!handle) { err("Invalid parameter."); return(SA_ERR_HPI_INVALID_PARAMS); } custom_handle = (struct snmp_bc_hnd *)handle->data; if (!custom_handle) { err("Invalid parameter."); return(SA_ERR_HPI_INVALID_PARAMS); } e = NULL; res_info_ptr = NULL; e = snmp_bc_alloc_oh_event(); if (e == NULL) { err("Out of memory."); return(SA_ERR_HPI_OUT_OF_MEMORY); } /* ---------------------------------------- */ /* Construct .resource of struct oh_event */ /* ---------------------------------------- */ e->resource = snmp_bc_rpt_array[BC_RPT_ENTRY_PHYSICAL_SLOT].rpt; oh_concat_ep(&(e->resource.ResourceEntity), ep_root); oh_set_ep_location(&(e->resource.ResourceEntity), SAHPI_ENT_CHASSIS_SPECIFIC, entitylocation + SNMP_BC_HPI_LOCATION_BASE); switch (entitytype) { case SAHPI_ENT_PHYSICAL_SLOT: e->resource.ResourceEntity.Entry[0].EntityType = SAHPI_ENT_PHYSICAL_SLOT; comment = SNMP_BC_PHYSICAL_SLOT; break; case BLADECENTER_SWITCH_SLOT: e->resource.ResourceEntity.Entry[0].EntityType = BLADECENTER_SWITCH_SLOT; comment = SNMP_BC_SWITCH_SLOT; break; case BLADECENTER_POWER_SUPPLY_SLOT: e->resource.ResourceEntity.Entry[0].EntityType = BLADECENTER_POWER_SUPPLY_SLOT; comment = SNMP_BC_POWER_SUPPLY_SLOT; break; case BLADECENTER_PERIPHERAL_BAY_SLOT: e->resource.ResourceEntity.Entry[0].EntityType = BLADECENTER_PERIPHERAL_BAY_SLOT; comment = SNMP_BC_PERIPHERAL_BAY_SLOT; break; case BLADECENTER_SYS_MGMNT_MODULE_SLOT: e->resource.ResourceEntity.Entry[0].EntityType = BLADECENTER_SYS_MGMNT_MODULE_SLOT; comment = SNMP_BC_SYS_MGMNT_MODULE_SLOT; break; case BLADECENTER_BLOWER_SLOT: e->resource.ResourceEntity.Entry[0].EntityType = BLADECENTER_BLOWER_SLOT; comment = SNMP_BC_BLOWER_SLOT; break; case BLADECENTER_ALARM_PANEL_SLOT: e->resource.ResourceEntity.Entry[0].EntityType = BLADECENTER_ALARM_PANEL_SLOT; comment = SNMP_BC_ALARM_PANEL_SLOT; break; case BLADECENTER_CLOCK_SLOT: e->resource.ResourceEntity.Entry[0].EntityType = BLADECENTER_CLOCK_SLOT; comment = SNMP_BC_CLOCK_SLOT; break; case BLADECENTER_MUX_SLOT: e->resource.ResourceEntity.Entry[0].EntityType = BLADECENTER_MUX_SLOT; comment = SNMP_BC_MUX_SLOT; break; default: err("Invalid slot resource type\n"); return(SA_ERR_HPI_INVALID_PARAMS); } e->resource.ResourceId = oh_uid_from_entity_path(&(e->resource.ResourceEntity)); snmp_bc_create_resourcetag(&(e->resource.ResourceTag), comment, entitylocation + SNMP_BC_HPI_LOCATION_BASE); res_info_ptr = g_memdup(&(snmp_bc_rpt_array[BC_RPT_ENTRY_PHYSICAL_SLOT].res_info), sizeof(struct ResourceInfo)); if (!res_info_ptr) { err("Out of memory."); g_free(e); return(SA_ERR_HPI_OUT_OF_MEMORY); } err = oh_add_resource(handle->rptcache, &(e->resource), res_info_ptr, 0); if (err) { err("Failed to add resource. Error=%s.", oh_lookup_error(err)); g_free(e); return(err); } /* ---------------------------------------- */ /* Construct .rdrs of struct oh_event */ /* ---------------------------------------- */ /* Find resource's rdrs: sensors, controls, etc. */ snmp_bc_discover_res_events(handle, &(e->resource.ResourceEntity), res_info_ptr); snmp_bc_discover_sensors(handle, snmp_bc_slot_sensors, e); snmp_bc_discover_controls(handle, snmp_bc_slot_controls, e); snmp_bc_discover_inventories(handle, snmp_bc_slot_inventories, e); /* ---------------------------------------- */ /* Construct .event of struct oh_event */ /* ---------------------------------------- */ snmp_bc_set_resource_add_oh_event(e, res_info_ptr); /* ---------------------------------------- */ /* Place the event in event queue */ /* ---------------------------------------- */ /*custom_handle->eventq = g_slist_append(custom_handle->eventq, e);*/ e->hid = handle->hid; oh_evt_queue_push(handle->eventq, e); /* ---------------------------------------- */ /* ---------------------------------------- */ return(SA_OK); } /** * snmp_bc_isrediscover: * @e: Pointer to event structure. * * Examine event and determine if this is hotswap install, remove or none * * Return values: * 0 - Neither hotswap install not remove. * SNMP_BC_RESOURCE_INSTALLED - This is a hotswap install event. * SNMP_BC_RESOURCE_REMOVED - This is a hotswap remove event. **/ guint snmp_bc_isrediscover(SaHpiEventT *working_event) { guint rediscovertype; rediscovertype = 0; /* Default - do nothing */ if (working_event->EventType == SAHPI_ET_HOTSWAP) { if (working_event->EventDataUnion.HotSwapEvent.PreviousHotSwapState == SAHPI_HS_STATE_NOT_PRESENT) { if (working_event->EventDataUnion.HotSwapEvent.HotSwapState == SAHPI_HS_STATE_NOT_PRESENT) err("Sanity check FAILED! PreviousHotSwapState = HotSwapState == SAHPI_HS_STATE_NOT_PRESENT\n"); rediscovertype = SNMP_BC_RESOURCE_INSTALLED; /* New resource is installed */ } else if (working_event->EventDataUnion.HotSwapEvent.HotSwapState == SAHPI_HS_STATE_NOT_PRESENT) { if (working_event->EventDataUnion.HotSwapEvent.PreviousHotSwapState == SAHPI_HS_STATE_NOT_PRESENT) err("Sanity check FAILED! PreviousHotSwapState = HotSwapState == SAHPI_HS_STATE_NOT_PRESENT\n"); rediscovertype = SNMP_BC_RESOURCE_REMOVED; /* resource is removed */ } } return(rediscovertype); } /** * snmp_bc_construct_blade_rpt: * @e: Pointer to oh_event struct. * @res_info_ptr: Pointer to pointer of res_info_ptr * @ep_root: Pointer to chassis Root Entity Path which comes from openhpi.conf. * @blade_index: Index of discovered blade. * * Build rpt structure for a blade resource using model data * * Return values: * SA_OK - normal case. * SA_ERR_HPI_OUT_OF_MEMORY - Cannot allocate space for internal memory. * SA_ERR_HPI_INVALID_PARAMS - Pointer parameter(s) NULL. **/ SaErrorT snmp_bc_construct_blade_rpt(struct oh_event *e, struct ResourceInfo **res_info_ptr, SaHpiEntityPathT *ep_root, guint blade_index) { if (!e || !res_info_ptr) return (SA_ERR_HPI_INVALID_PARAMS); e->resource = snmp_bc_rpt_array[BC_RPT_ENTRY_BLADE].rpt; oh_concat_ep(&(e->resource.ResourceEntity), ep_root); oh_set_ep_location(&(e->resource.ResourceEntity), SAHPI_ENT_PHYSICAL_SLOT, blade_index + SNMP_BC_HPI_LOCATION_BASE); oh_set_ep_location(&(e->resource.ResourceEntity), SAHPI_ENT_SBC_BLADE, blade_index + SNMP_BC_HPI_LOCATION_BASE); e->resource.ResourceId = oh_uid_from_entity_path(&(e->resource.ResourceEntity)); *res_info_ptr = g_memdup(&(snmp_bc_rpt_array[BC_RPT_ENTRY_BLADE].res_info), sizeof(struct ResourceInfo)); if (!(*res_info_ptr)) { err("Out of memory."); return(SA_ERR_HPI_OUT_OF_MEMORY); } return(SA_OK); } /** * snmp_bc_construct_blower_rpt: * @e: Pointer to oh_event struct. * @res_info_ptr: Pointer to pointer of res_info_ptr * @ep_root: Pointer to chassis Root Entity Path which comes from openhpi.conf. * @blower_index: Index of discovered blower. * * Build rpt structure for a blade resource using model data * * Return values: * SA_OK - normal case. * SA_ERR_HPI_OUT_OF_MEMORY - Cannot allocate space for internal memory. * SA_ERR_HPI_INVALID_PARAMS - Pointer parameter(s) NULL. **/ SaErrorT snmp_bc_construct_blower_rpt(struct oh_event* e, struct ResourceInfo **res_info_ptr, SaHpiEntityPathT *ep_root, guint blower_index) { if (!e || !res_info_ptr) return (SA_ERR_HPI_INVALID_PARAMS); e->resource = snmp_bc_rpt_array[BC_RPT_ENTRY_BLOWER_MODULE].rpt; oh_concat_ep(&(e->resource.ResourceEntity), ep_root); oh_set_ep_location(&(e->resource.ResourceEntity), BLADECENTER_BLOWER_SLOT, blower_index + SNMP_BC_HPI_LOCATION_BASE); oh_set_ep_location(&(e->resource.ResourceEntity), SAHPI_ENT_FAN, blower_index + SNMP_BC_HPI_LOCATION_BASE); e->resource.ResourceId = oh_uid_from_entity_path(&(e->resource.ResourceEntity)); snmp_bc_create_resourcetag(&(e->resource.ResourceTag), snmp_bc_rpt_array[BC_RPT_ENTRY_BLOWER_MODULE].comment, blower_index + SNMP_BC_HPI_LOCATION_BASE); dbg("Discovered resource=%s; ID=%d", e->resource.ResourceTag.Data, e->resource.ResourceId); /* Create platform-specific info space to add to infra-structure */ *res_info_ptr = g_memdup(&(snmp_bc_rpt_array[BC_RPT_ENTRY_BLOWER_MODULE].res_info), sizeof(struct ResourceInfo)); if (!(*res_info_ptr)) { err("Out of memory."); return(SA_ERR_HPI_OUT_OF_MEMORY); } return(SA_OK); } /** * snmp_bc_construct_pm_rpt: * @e: Pointer to oh_event struct. * @res_info_ptr: Pointer to pointer of res_info_ptr * @ep_root: Pointer to chassis Root Entity Path which comes from openhpi.conf. * @pm_index: Index of discovered power module. * * Build rpt structure for a power module resource using model data * * Return values: * SA_OK - normal case. * SA_ERR_HPI_OUT_OF_MEMORY - Cannot allocate space for internal memory. * SA_ERR_HPI_INVALID_PARAMS - Pointer parameter(s) NULL. **/ SaErrorT snmp_bc_construct_pm_rpt(struct oh_event *e, struct ResourceInfo **res_info_ptr, SaHpiEntityPathT *ep_root, guint pm_index) { if (!e || !res_info_ptr) return(SA_ERR_HPI_INVALID_PARAMS); e->resource = snmp_bc_rpt_array[BC_RPT_ENTRY_POWER_MODULE].rpt; oh_concat_ep(&(e->resource.ResourceEntity), ep_root); oh_set_ep_location(&(e->resource.ResourceEntity), BLADECENTER_POWER_SUPPLY_SLOT, pm_index + SNMP_BC_HPI_LOCATION_BASE); oh_set_ep_location(&(e->resource.ResourceEntity), SAHPI_ENT_POWER_SUPPLY, pm_index + SNMP_BC_HPI_LOCATION_BASE); e->resource.ResourceId = oh_uid_from_entity_path(&(e->resource.ResourceEntity)); snmp_bc_create_resourcetag(&(e->resource.ResourceTag), snmp_bc_rpt_array[BC_RPT_ENTRY_POWER_MODULE].comment, pm_index + SNMP_BC_HPI_LOCATION_BASE); dbg("Discovered resource=%s; ID=%d", e->resource.ResourceTag.Data, e->resource.ResourceId); /* Create platform-specific info space to add to infra-structure */ *res_info_ptr = g_memdup(&(snmp_bc_rpt_array[BC_RPT_ENTRY_POWER_MODULE].res_info), sizeof(struct ResourceInfo)); if (!(*res_info_ptr)) { err("Out of memory."); return(SA_ERR_HPI_OUT_OF_MEMORY); } return(SA_OK); } /** * snmp_bc_construct_sm_rpt: * @e: Pointer to oh_event struct. * @res_info_ptr: Pointer to pointer of res_info_ptr * @ep_root: Pointer to chassis Root Entity Path which comes from openhpi.conf. * @sm_index: Index of discovered switch module. * * Build rpt structure for a switch module resource using model data * * Return values: * SA_OK - normal case. * SA_ERR_HPI_OUT_OF_MEMORY - Cannot allocate space for internal memory. * SA_ERR_HPI_INVALID_PARAMS - Pointer parameter(s) NULL. **/ SaErrorT snmp_bc_construct_sm_rpt(struct oh_event *e, struct ResourceInfo **res_info_ptr, SaHpiEntityPathT *ep_root, guint sm_index, char *interposer_install_mask) { if (!e || !res_info_ptr) return(SA_ERR_HPI_INVALID_PARAMS); e->resource = snmp_bc_rpt_array[BC_RPT_ENTRY_SWITCH_MODULE].rpt; /* Adjust entity path, if there is a switch interposer installed in this slot */ snmp_bc_extend_ep(e, sm_index, interposer_install_mask); /* Setting entity path for this instance */ /* oh_set_ep_location() does nothing if it can not */ /* find the specified entity type in ep structure */ oh_concat_ep(&(e->resource.ResourceEntity), ep_root); oh_set_ep_location(&(e->resource.ResourceEntity), BLADECENTER_SWITCH_SLOT, sm_index + SNMP_BC_HPI_LOCATION_BASE); oh_set_ep_location(&(e->resource.ResourceEntity), SAHPI_ENT_INTERCONNECT, sm_index + SNMP_BC_HPI_LOCATION_BASE); oh_set_ep_location(&(e->resource.ResourceEntity), SAHPI_ENT_SWITCH, sm_index + SNMP_BC_HPI_LOCATION_BASE); e->resource.ResourceId = oh_uid_from_entity_path(&(e->resource.ResourceEntity)); snmp_bc_create_resourcetag(&(e->resource.ResourceTag), snmp_bc_rpt_array[BC_RPT_ENTRY_SWITCH_MODULE].comment, sm_index + SNMP_BC_HPI_LOCATION_BASE); dbg("Discovered resource=%s; ID=%d", e->resource.ResourceTag.Data, e->resource.ResourceId); /* Create platform-specific info space to add to infra-structure */ *res_info_ptr = g_memdup(&(snmp_bc_rpt_array[BC_RPT_ENTRY_SWITCH_MODULE].res_info), sizeof(struct ResourceInfo)); if (!(*res_info_ptr)) { err("Out of memory."); return(SA_ERR_HPI_OUT_OF_MEMORY); } return(SA_OK); } /** * snmp_bc_construct_mm_rpt: * @e: Pointer to oh_event struct. * @res_info_ptr: Pointer to pointer of res_info_ptr * @ep_root: Pointer to chassis Root Entity Path which comes from openhpi.conf. * @mm_index: Index of discovered management module. * * Build rpt structure for a management module resource using model data * * Return values: * SA_OK - normal case. * SA_ERR_HPI_OUT_OF_MEMORY - Cannot allocate space for internal memory. * SA_ERR_HPI_INVALID_PARAMS - Pointer parameter(s) NULL. **/ SaErrorT snmp_bc_construct_mm_rpt(struct oh_event *e, struct ResourceInfo **res_info_ptr, SaHpiEntityPathT *ep_root, guint mm_index, char *interposer_install_mask) { if (!e || !res_info_ptr) return(SA_ERR_HPI_INVALID_PARAMS); e->resource = snmp_bc_rpt_array[BC_RPT_ENTRY_MGMNT_MODULE].rpt; /* Adjust entity path, if there is a switch interposer installed in this slot */ snmp_bc_extend_ep(e, mm_index, interposer_install_mask); /* Setting entity path for this instance */ /* oh_set_ep_location() does nothing if it can not */ /* find the specified entity type in ep structure */ oh_concat_ep(&(e->resource.ResourceEntity), ep_root); oh_set_ep_location(&(e->resource.ResourceEntity), BLADECENTER_SYS_MGMNT_MODULE_SLOT, mm_index + SNMP_BC_HPI_LOCATION_BASE); oh_set_ep_location(&(e->resource.ResourceEntity), SAHPI_ENT_INTERCONNECT, mm_index + SNMP_BC_HPI_LOCATION_BASE); oh_set_ep_location(&(e->resource.ResourceEntity), SAHPI_ENT_SYS_MGMNT_MODULE, mm_index + SNMP_BC_HPI_LOCATION_BASE); e->resource.ResourceId = oh_uid_from_entity_path(&(e->resource.ResourceEntity)); snmp_bc_create_resourcetag(&(e->resource.ResourceTag), snmp_bc_rpt_array[BC_RPT_ENTRY_MGMNT_MODULE].comment, mm_index + SNMP_BC_HPI_LOCATION_BASE); dbg("Discovered resource=%s; ID=%d", e->resource.ResourceTag.Data, e->resource.ResourceId); /* Create platform-specific info space to add to infra-structure */ *res_info_ptr = g_memdup(&(snmp_bc_rpt_array[BC_RPT_ENTRY_MGMNT_MODULE].res_info), sizeof(struct ResourceInfo)); if (!(*res_info_ptr)) { err("Out of memory."); return(SA_ERR_HPI_OUT_OF_MEMORY); } return(SA_OK); } /** * snmp_bc_add_blade_rptcache: * @handle: Pointer to hpi handle * @e: Pointer to oh_event struct. * @res_info_ptr: Pointer to pointer of res_info_ptr * @blade_index: Index of discovered blade. * * Build rpt and rdrs for a blade then add to rptcache * * Return values: * SA_OK - normal case. * SA_ERR_HPI_OUT_OF_MEMORY - Cannot allocate space for internal memory. * SA_ERR_HPI_INVALID_PARAMS - Pointer parameter(s) NULL. **/ SaErrorT snmp_bc_add_blade_rptcache(struct oh_handler_state *handle, struct oh_event *e, struct ResourceInfo *res_info_ptr, guint blade_index) { SaErrorT err; guint blade_width; guint local_retry; struct snmp_value get_value, get_blade_resourcetag; struct snmp_bc_hnd *custom_handle; if (!handle) { err("Invalid parameter."); return(SA_ERR_HPI_INVALID_PARAMS); } custom_handle = (struct snmp_bc_hnd *)handle->data; if (!custom_handle) { err("Invalid parameter."); return(SA_ERR_HPI_INVALID_PARAMS); } local_retry = 0; while(1) { err = snmp_bc_oid_snmp_get(custom_handle, &(e->resource.ResourceEntity), 0, snmp_bc_rpt_array[BC_RPT_ENTRY_BLADE].OidResourceTag, &get_blade_resourcetag, SAHPI_TRUE); /* If MM is busy discovering blade, we gives MM */ /* 3 seconds to collect blade info then try again*/ if ( (get_blade_resourcetag.type == ASN_OCTET_STR) && ( g_ascii_strncasecmp(get_blade_resourcetag.string, LOG_DISCOVERING, sizeof(LOG_DISCOVERING)) == 0 ) ) { /* Give the AMM 12 sec max to discover this resource */ /* Give up on this resource if AMM can not find it after 12 sec */ if (local_retry < 4) local_retry++; else break; sleep(3); } else break; } snmp_bc_create_resourcetag(&(e->resource.ResourceTag), snmp_bc_rpt_array[BC_RPT_ENTRY_BLADE].comment, blade_index + SNMP_BC_HPI_LOCATION_BASE); /* Tack on MM's defined blade name */ if (!err && (get_blade_resourcetag.type == ASN_OCTET_STR)) { oh_append_textbuffer(&(e->resource.ResourceTag), " - "); oh_append_textbuffer(&(e->resource.ResourceTag), get_blade_resourcetag.string); } dbg("Discovered resource=%s; ID=%d", e->resource.ResourceTag.Data, e->resource.ResourceId); /* Create platform-specific info space to add to infra-structure */ /* Determine and set current resource state */ res_info_ptr->cur_state = SAHPI_HS_STATE_ACTIVE; /* Default to ACTIVE */ if (res_info_ptr->mib.OidPowerState != NULL) { /* Read power state of resource */ err = snmp_bc_oid_snmp_get(custom_handle, &(e->resource.ResourceEntity), 0, res_info_ptr->mib.OidPowerState, &get_value, SAHPI_TRUE); if (!err && (get_value.type == ASN_INTEGER)) { if (get_value.integer == 0) /* state = SAHPI_POWER_OFF */ res_info_ptr->cur_state = SAHPI_HS_STATE_INACTIVE; } } /* Get UUID and convert to GUID */ err = snmp_bc_get_guid(custom_handle, e, res_info_ptr); /* Add resource to resource */ err = oh_add_resource(handle->rptcache, &(e->resource), res_info_ptr, 0); if (err) { err("Failed to add resource. Error=%s.", oh_lookup_error(err)); return(err); } /* ---------------------------------------- */ /* Construct .rdrs of struct oh_event */ /* ---------------------------------------- */ /* Find resource's events, sensors, controls, etc. */ snmp_bc_discover_res_events(handle, &(e->resource.ResourceEntity), res_info_ptr); snmp_bc_discover_sensors(handle, snmp_bc_blade_sensors, e); snmp_bc_discover_ipmi_sensors(handle, snmp_bc_blade_ipmi_sensors, e); snmp_bc_discover_controls(handle, snmp_bc_blade_controls, e); snmp_bc_discover_inventories(handle, snmp_bc_blade_inventories, e); blade_width = 1; /* Default to 1-wide blade */ if (res_info_ptr->mib.OidResourceWidth != NULL) { err = snmp_bc_oid_snmp_get(custom_handle, &(e->resource.ResourceEntity), 0, res_info_ptr->mib.OidResourceWidth, &get_value, SAHPI_TRUE); if (!err && (get_value.type == ASN_INTEGER)) { blade_width = get_value.integer; } } res_info_ptr->resourcewidth = blade_width; err = snmp_bc_set_resource_slot_state_sensor(handle, e, blade_width); /********************************** * Discover Blade Expansion Modules * err = snmp_bc_discover_blade_expansion(handle, * ep_root, * blade_index); **********************************/ return(err); } /** * snmp_bc_add_blower_rptcache: * @handle: Pointer to hpi handle * @e: Pointer to oh_event struct. * @res_info_ptr: Pointer to pointer of res_info_ptr * @blower_index: Index of discovered blower. * * Build rpt and rdrs for a blower then add to rptcache * * Return values: * SA_OK - normal case. * SA_ERR_HPI_OUT_OF_MEMORY - Cannot allocate space for internal memory. * SA_ERR_HPI_INVALID_PARAMS - Pointer parameter(s) NULL. **/ SaErrorT snmp_bc_add_blower_rptcache(struct oh_handler_state *handle, struct oh_event *e, struct ResourceInfo *res_info_ptr, guint blower_index) { SaErrorT err; guint blower_width; struct snmp_value get_value; struct snmp_bc_hnd *custom_handle; if (!handle || !e || !res_info_ptr) { err("Invalid parameter."); return(SA_ERR_HPI_INVALID_PARAMS); } custom_handle = (struct snmp_bc_hnd *)handle->data; if (!custom_handle) { err("Invalid parameter."); return(SA_ERR_HPI_INVALID_PARAMS); } dbg("Discovering blower %d resource.\n", blower_index); res_info_ptr->cur_state = SAHPI_HS_STATE_ACTIVE; /* Get UUID and convert to GUID */ err = snmp_bc_get_guid(custom_handle, e, res_info_ptr); /* Add resource to temporary event cache/queue */ err = oh_add_resource(handle->rptcache, &(e->resource), res_info_ptr, 0); if (err) { err("Failed to add resource. Error=%s.", oh_lookup_error(err)); return(err); } /* ---------------------------------------- */ /* Construct .rdrs of struct oh_event */ /* ---------------------------------------- */ /* Find resource's events, sensors, controls, etc. */ snmp_bc_discover_res_events(handle, &(e->resource.ResourceEntity), res_info_ptr); snmp_bc_discover_sensors(handle, snmp_bc_blower_sensors, e); if ( (custom_handle->platform == SNMP_BC_PLATFORM_BCH) || (custom_handle->platform == SNMP_BC_PLATFORM_BCHT) ){ snmp_bc_discover_sensors(handle, snmp_bc_blower_sensors_bch, e); } snmp_bc_discover_controls(handle, snmp_bc_blower_controls, e); snmp_bc_discover_inventories(handle, snmp_bc_blower_inventories, e); blower_width = 1; /* Default to 1-wide blade */ if (res_info_ptr->mib.OidResourceWidth != NULL) { err = snmp_bc_oid_snmp_get(custom_handle, &(e->resource.ResourceEntity), 0, res_info_ptr->mib.OidResourceWidth, &get_value, SAHPI_TRUE); if (!err && (get_value.type == ASN_INTEGER)) { blower_width = get_value.integer; } } res_info_ptr->resourcewidth = blower_width; err = snmp_bc_set_resource_slot_state_sensor(handle, e, blower_width); return(err); } /** * snmp_bc_add_pm_rptcache: * @handle: Pointer to hpi handle * @e: Pointer to oh_event struct. * @res_info_ptr: Pointer to pointer of res_info_ptr * @pm_index: Index of discovered power module. * * Build rpt and rdrs for a power module then add to rptcache * * Return values: * SA_OK - normal case. * SA_ERR_HPI_OUT_OF_MEMORY - Cannot allocate space for internal memory. * SA_ERR_HPI_INVALID_PARAMS - Pointer parameter(s) NULL. **/ SaErrorT snmp_bc_add_pm_rptcache(struct oh_handler_state *handle, struct oh_event *e, struct ResourceInfo *res_info_ptr, guint pm_index) { SaErrorT err; guint pm_width; struct snmp_value get_value; struct snmp_bc_hnd *custom_handle; if (!handle || !e || !res_info_ptr) { err("Invalid parameter."); return(SA_ERR_HPI_INVALID_PARAMS); } custom_handle = (struct snmp_bc_hnd *)handle->data; if (!custom_handle) { err("Invalid parameter."); return(SA_ERR_HPI_INVALID_PARAMS); } dbg("Discovering power module %d resource.\n", pm_index); res_info_ptr->cur_state = SAHPI_HS_STATE_ACTIVE; /* Get UUID and convert to GUID */ err = snmp_bc_get_guid(custom_handle, e, res_info_ptr); /* Add resource to temporary event cache/queue */ err = oh_add_resource(handle->rptcache, &(e->resource), res_info_ptr, 0); if (err) { err("Failed to add resource. Error=%s.", oh_lookup_error(err)); return(err); } /* ---------------------------------------- */ /* Construct .rdrs of struct oh_event */ /* ---------------------------------------- */ /* Find resource's events, sensors, controls, etc. */ snmp_bc_discover_res_events(handle, &(e->resource.ResourceEntity), res_info_ptr); snmp_bc_discover_sensors(handle, snmp_bc_power_sensors, e); if ( (custom_handle->platform == SNMP_BC_PLATFORM_BCH) || (custom_handle->platform == SNMP_BC_PLATFORM_BCHT) ){ snmp_bc_discover_sensors(handle, snmp_bc_power_sensors_bch, e); } snmp_bc_discover_controls(handle, snmp_bc_power_controls, e); snmp_bc_discover_inventories(handle, snmp_bc_power_inventories, e); pm_width = 1; /* Default to 1-wide */ if (res_info_ptr->mib.OidResourceWidth != NULL) { err = snmp_bc_oid_snmp_get(custom_handle, &(e->resource.ResourceEntity), 0, res_info_ptr->mib.OidResourceWidth, &get_value, SAHPI_TRUE); if (!err && (get_value.type == ASN_INTEGER)) { pm_width = get_value.integer; } } res_info_ptr->resourcewidth = pm_width; err = snmp_bc_set_resource_slot_state_sensor(handle, e, pm_width); return(err); } /** * snmp_bc_add_switch_rptcache: * @handle: Pointer to hpi handle * @e: Pointer to oh_event struct. * @res_info_ptr: Pointer to pointer of res_info_ptr * @switch_index: Index of discovered power module. * * Build rpt and rdrs for a switch module then add to rptcache * * Return values: * SA_OK - normal case. * SA_ERR_HPI_OUT_OF_MEMORY - Cannot allocate space for internal memory. * SA_ERR_HPI_INVALID_PARAMS - Pointer parameter(s) NULL. **/ SaErrorT snmp_bc_add_switch_rptcache(struct oh_handler_state *handle, struct oh_event *e, struct ResourceInfo *res_info_ptr, guint switch_index) { SaErrorT err; guint sw_width; struct snmp_value get_value; struct snmp_bc_hnd *custom_handle; if (!handle || !e || !res_info_ptr) { err("Invalid parameter."); return(SA_ERR_HPI_INVALID_PARAMS); } custom_handle = (struct snmp_bc_hnd *)handle->data; if (!custom_handle) { err("Invalid parameter."); return(SA_ERR_HPI_INVALID_PARAMS); } dbg("Discovering switch module %d resource.\n", switch_index); res_info_ptr->cur_state = SAHPI_HS_STATE_ACTIVE; /* Default to ACTIVE */ if (res_info_ptr->mib.OidPowerState != NULL) { /* Read power state of resource */ err = snmp_bc_oid_snmp_get(custom_handle, &(e->resource.ResourceEntity), 0, res_info_ptr->mib.OidPowerState, &get_value, SAHPI_TRUE); if (!err && (get_value.type == ASN_INTEGER)) { if (get_value.integer == 0) /* state = SAHPI_POWER_OFF */ res_info_ptr->cur_state = SAHPI_HS_STATE_INACTIVE; } } /* Get UUID and convert to GUID */ err = snmp_bc_get_guid(custom_handle, e, res_info_ptr); /* Add resource to temporary event cache */ err = oh_add_resource(handle->rptcache, &(e->resource), res_info_ptr, 0); if (err) { err("Failed to add resource. Error=%s.", oh_lookup_error(err)); return(err); } /* ---------------------------------------- */ /* Construct .rdrs of struct oh_event */ /* ---------------------------------------- */ /* Find resource's events, sensors, controls, etc. */ snmp_bc_discover_res_events(handle, &(e->resource.ResourceEntity), res_info_ptr); snmp_bc_discover_sensors(handle, snmp_bc_switch_sensors, e); snmp_bc_discover_controls(handle, snmp_bc_switch_controls, e); snmp_bc_discover_inventories(handle, snmp_bc_switch_inventories, e); sw_width = 1; /* Default to 1-wide */ if (res_info_ptr->mib.OidResourceWidth != NULL) { err = snmp_bc_oid_snmp_get(custom_handle, &(e->resource.ResourceEntity), 0, res_info_ptr->mib.OidResourceWidth, &get_value, SAHPI_TRUE); if (!err && (get_value.type == ASN_INTEGER)) { sw_width = get_value.integer; } } res_info_ptr->resourcewidth = sw_width; err = snmp_bc_set_resource_slot_state_sensor(handle, e, sw_width); return(err); } /** * snmp_bc_add_mm_rptcache: * @handle: Pointer to hpi handle * @e: Pointer to oh_event struct. * @res_info_ptr: Pointer to pointer of res_info_ptr * @mm_index: Index of discovered management module. * * Build rpt and rdrs for a management module then add to rptcache * * Return values: * SA_OK - normal case. * SA_ERR_HPI_OUT_OF_MEMORY - Cannot allocate space for internal memory. * SA_ERR_HPI_INVALID_PARAMS - Pointer parameter(s) NULL. **/ SaErrorT snmp_bc_add_mm_rptcache(struct oh_handler_state *handle, struct oh_event *e, struct ResourceInfo *res_info_ptr, guint mm_index) { SaErrorT err; guint mm_width; struct snmp_value get_value, get_active; struct snmp_bc_hnd *custom_handle; if (!handle || !e || !res_info_ptr) { err("Invalid parameter."); return(SA_ERR_HPI_INVALID_PARAMS); } custom_handle = (struct snmp_bc_hnd *)handle->data; if (!custom_handle) { err("Invalid parameter."); return(SA_ERR_HPI_INVALID_PARAMS); } dbg("Discovering management module %d resource.\n", mm_index); err = snmp_bc_snmp_get(custom_handle, SNMP_BC_MGMNT_ACTIVE, &get_active, SAHPI_TRUE); if (err || get_active.type != ASN_INTEGER) { err("Cannot get OID=%s; Received Type=%d; Error=%s.", SNMP_BC_MGMNT_ACTIVE, get_active.type, oh_lookup_error(err)); if (err) { return(err); } else { return(SA_ERR_HPI_INTERNAL_ERROR); } } /* Set active MM location in handler's custom data */ /* - used to override duplicate MM events in snmp_bc_event.c */ custom_handle->active_mm = get_active.integer; if (custom_handle->active_mm == mm_index+1) res_info_ptr->cur_state = SAHPI_HS_STATE_ACTIVE; else res_info_ptr->cur_state = SAHPI_HS_STATE_INACTIVE; /* Get UUID and convert to GUID */ err = snmp_bc_get_guid(custom_handle, e, res_info_ptr); /* Add resource to resource */ err = oh_add_resource(handle->rptcache, &(e->resource), res_info_ptr, 0); if (err) { err("Failed to add resource. Error=%s.", oh_lookup_error(err)); return(err); } /* Find resource's events, sensors, controls, etc. */ snmp_bc_discover_res_events(handle, &(e->resource.ResourceEntity), res_info_ptr); /* ---------------------------------------- */ /* Construct .rdrs of struct oh_event */ /* ---------------------------------------- */ /* See if mmHeathState OID is supported; If it is a readable Operational State sensor is supported; else the Operational State sensor is event only */ { struct snmp_value value; err = snmp_bc_snmp_get(custom_handle, SNMP_BC_MM_HEALTH_OID, &value, SAHPI_TRUE); if (err) { snmp_bc_discover_sensors(handle, snmp_bc_mgmnt_sensors, e); } else { snmp_bc_discover_sensors(handle, snmp_bc_mgmnt_health_sensors, e); } } snmp_bc_discover_controls(handle, snmp_bc_mgmnt_controls, e); snmp_bc_discover_inventories(handle, snmp_bc_mgmnt_inventories, e); mm_width = 1; /* Default to 1-wide */ if (res_info_ptr->mib.OidResourceWidth != NULL) { err = snmp_bc_oid_snmp_get(custom_handle, &(e->resource.ResourceEntity), 0, res_info_ptr->mib.OidResourceWidth, &get_value, SAHPI_TRUE); if (!err && (get_value.type == ASN_INTEGER)) { mm_width = get_value.integer; } } res_info_ptr->resourcewidth = mm_width; err = snmp_bc_set_resource_slot_state_sensor(handle, e, mm_width); return(err); } /** * snmp_bc_discover_blade_i: * @handle: Pointer to hpi handle * @ep_root: Pointer to . * @blade_index: Index of discovered blade. * * Discover a particular blade at index blade_index. * This routine is used to rediscover a blade. * Blade rpt and rdrs will be added to rptcache. * No event will be generated. The event is handled separately in log2event. * * Return values: * SA_OK - normal case. * SA_ERR_HPI_OUT_OF_MEMORY - Cannot allocate space for internal memory. * SA_ERR_HPI_INVALID_PARAMS - Pointer parameter(s) NULL. **/ SaErrorT snmp_bc_discover_blade_i(struct oh_handler_state *handle, SaHpiEntityPathT *ep_root, guint blade_index) { SaErrorT err; struct oh_event *e; struct ResourceInfo *res_info_ptr; if (!handle) { err("Invalid parameter."); return(SA_ERR_HPI_INVALID_PARAMS); } e = NULL; res_info_ptr = NULL; e = snmp_bc_alloc_oh_event(); if (e == NULL) { err("Out of memory."); return(SA_ERR_HPI_OUT_OF_MEMORY); } /* ---------------------------------------- */ /* Construct .resource of struct oh_event */ /* ---------------------------------------- */ err = snmp_bc_construct_blade_rpt(e, &res_info_ptr, ep_root, blade_index); if (err) { snmp_bc_free_oh_event(e); return(err); } /* ---------------------------------------- */ /* Discover rdrs. */ /* Add rpt and rdrs to rptcache. */ /* ---------------------------------------- */ err = snmp_bc_add_blade_rptcache(handle, e, res_info_ptr, blade_index); snmp_bc_free_oh_event(e); /********************************** * Discover Blade Expansion Modules **********************************/ err = snmp_bc_discover_blade_expansion(handle, ep_root, blade_index); return(SA_OK); } /** * snmp_bc_discover_blower_i: * @handle: Pointer to hpi handle * @ep_root: Pointer to . * @blower_index: Index of discovered blower. * * Discover a particular blower at index blower_index. * This routine is used to rediscover a blower. * Blower rpt and rdrs will be added to rptcache. * No event will be generated. The event is handled separately in log2event. * * Return values: * SA_OK - normal case. * SA_ERR_HPI_OUT_OF_MEMORY - Cannot allocate space for internal memory. * SA_ERR_HPI_INVALID_PARAMS - Pointer parameter(s) NULL. **/ SaErrorT snmp_bc_discover_blower_i(struct oh_handler_state *handle, SaHpiEntityPathT *ep_root, guint blower_index) { SaErrorT err; struct oh_event *e; struct ResourceInfo *res_info_ptr; if (!handle) { err("Invalid parameter."); return(SA_ERR_HPI_INVALID_PARAMS); } e= NULL; res_info_ptr = NULL; e = snmp_bc_alloc_oh_event(); if (e == NULL) { err("Out of memory."); return(SA_ERR_HPI_OUT_OF_MEMORY); } /* ---------------------------------------- */ /* Construct .resource of struct oh_event */ /* ---------------------------------------- */ err = snmp_bc_construct_blower_rpt(e, &res_info_ptr, ep_root, blower_index); if (err) { snmp_bc_free_oh_event(e); return(err); } /* ---------------------------------------- */ /* Discover rdrs. */ /* Add rpt and rdrs to rptcache. */ /* ---------------------------------------- */ err = snmp_bc_add_blower_rptcache(handle, e, res_info_ptr, blower_index); snmp_bc_free_oh_event(e); return(SA_OK); } /** * snmp_bc_discover_pm_i: * @handle: Pointer to hpi handle * @ep_root: Pointer to . * @pm_index: Index of discovered power module. * * Discover a particular power module at index pm_index. * This routine is used to rediscover a power module. * Power module rpt and rdrs will be added to rptcache. * No event will be generated. The event is handled separately in log2event. * * Return values: * SA_OK - normal case. * SA_ERR_HPI_OUT_OF_MEMORY - Cannot allocate space for internal memory. * SA_ERR_HPI_INVALID_PARAMS - Pointer parameter(s) NULL. **/ SaErrorT snmp_bc_discover_pm_i(struct oh_handler_state *handle, SaHpiEntityPathT *ep_root, guint pm_index) { SaErrorT err; struct oh_event *e; struct ResourceInfo *res_info_ptr; if (!handle) { err("Invalid parameter."); return(SA_ERR_HPI_INVALID_PARAMS); } e = NULL; res_info_ptr = NULL; e = snmp_bc_alloc_oh_event(); if (e == NULL) { err("Out of memory."); return(SA_ERR_HPI_OUT_OF_MEMORY); } /* ---------------------------------------- */ /* Construct .resource of struct oh_event */ /* ---------------------------------------- */ err = snmp_bc_construct_pm_rpt(e, &res_info_ptr, ep_root, pm_index); if (err) { snmp_bc_free_oh_event(e); return(err); } /* ---------------------------------------- */ /* Discover rdrs. */ /* Add rpt and rdrs to rptcache. */ /* ---------------------------------------- */ err = snmp_bc_add_pm_rptcache(handle, e, res_info_ptr, pm_index); snmp_bc_free_oh_event(e); return(SA_OK); } /** * snmp_bc_discover_switch_i: * @handle: Pointer to hpi handle * @ep_root: Pointer to . * @sm_index: Index of discovered switch module. * * Discover a particular switch module at index sm_index. * This routine is used to rediscover a switch module. * Switch module rpt and rdrs will be added to rptcache. * No event will be generated. The event is handled separately in log2event. * * Return values: * SA_OK - normal case. * SA_ERR_HPI_OUT_OF_MEMORY - Cannot allocate space for internal memory. * SA_ERR_HPI_INVALID_PARAMS - Pointer parameter(s) NULL. **/ SaErrorT snmp_bc_discover_switch_i(struct oh_handler_state *handle, SaHpiEntityPathT *ep_root, guint sm_index) { SaErrorT err; struct oh_event *e; struct ResourceInfo *res_info_ptr; struct snmp_bc_hnd *custom_handle; struct snmp_value get_value; if (!handle) { err("Invalid parameter."); return(SA_ERR_HPI_INVALID_PARAMS); } custom_handle = (struct snmp_bc_hnd *)handle->data; if (!custom_handle) { err("Invalid parameter."); return(SA_ERR_HPI_INVALID_PARAMS); } e = NULL; res_info_ptr = NULL; e = snmp_bc_alloc_oh_event(); if (e == NULL) { err("Out of memory."); return(SA_ERR_HPI_OUT_OF_MEMORY); } /* ---------------------------------------- */ /* Construct .resource of struct oh_event */ /* ---------------------------------------- */ /* Fetch switch interposer-card installed vector */ /* Have to fetch from hardware in case we have yet to rediscover the SMI */ get_installed_mask(SNMP_BC_SMI_INSTALLED, get_value); err = snmp_bc_construct_sm_rpt(e, &res_info_ptr, ep_root, sm_index, get_value.string); if (err) { snmp_bc_free_oh_event(e); return(err); } /* ---------------------------------------- */ /* Discover rdrs. */ /* Add rpt and rdrs to rptcache. */ /* ---------------------------------------- */ err = snmp_bc_add_switch_rptcache(handle, e, res_info_ptr, sm_index); snmp_bc_free_oh_event(e); return(SA_OK); } /** * snmp_bc_discover_mm_i: * @handle: Pointer to hpi handle * @ep_root: Pointer to . * @mm_index: Index of discovered management module. * * Discover a particular management module at index mm_index. * This routine is used to rediscover a management module. * Management module rpt and rdrs will be added to rptcache. * No event will be generated. The event is handled separately in log2event. * * Return values: * SA_OK - normal case. * SA_ERR_HPI_OUT_OF_MEMORY - Cannot allocate space for internal memory. * SA_ERR_HPI_INVALID_PARAMS - Pointer parameter(s) NULL. **/ SaErrorT snmp_bc_discover_mm_i(struct oh_handler_state *handle, SaHpiEntityPathT *ep_root, guint mm_index) { SaErrorT err; struct oh_event *e; struct ResourceInfo *res_info_ptr; struct snmp_bc_hnd *custom_handle; struct snmp_value get_value; if (!handle) { err("Invalid parameter."); return(SA_ERR_HPI_INVALID_PARAMS); } custom_handle = (struct snmp_bc_hnd *)handle->data; if (!custom_handle) { err("Invalid parameter."); return(SA_ERR_HPI_INVALID_PARAMS); } e = NULL; res_info_ptr = NULL; e = snmp_bc_alloc_oh_event(); if (e == NULL) { err("Out of memory."); return(SA_ERR_HPI_OUT_OF_MEMORY); } /* ---------------------------------------- */ /* Construct .resource of struct oh_event */ /* ---------------------------------------- */ /* Fetch mm interposer-card installed vector */ /* Have to fetch from hardware in case we have yet to rediscover the MMI */ get_installed_mask(SNMP_BC_MMI_INSTALLED, get_value); err = snmp_bc_construct_mm_rpt(e, &res_info_ptr, ep_root, mm_index, get_value.string); if (err) { snmp_bc_free_oh_event(e); return(err); } /* ---------------------------------------- */ /* Discover rdrs. */ /* Add rpt and rdrs to rptcache. */ /* ---------------------------------------- */ err = snmp_bc_add_mm_rptcache(handle, e, res_info_ptr, mm_index); snmp_bc_free_oh_event(e); return(SA_OK); } /** * snmp_bc_fetch_MT_install_mask: * @handle: Pointer to hpi handle * @getintvalue: Pointer to a struct snmp_value * * The MM presents MediaTray Installed Mask in three different ways, * depending on the code level. * * Older code: chassisMTInstalled is an integer. * It is either 0 (no media tray) or 1 (one media tray) * * Intermediate Code: chassisMTInstalled is an OCT_STR bitmap of installed mediatray * * Later Code: chassisMTInstalled is an integer. 0 (no media tray), 1(yes media tray) * chassisMTInstalled is qualified by chassisNoOfMTsInstalled, a media tray installed bitmap * * This module is designed to work with any of the Media Tray repesentation above * * Return values: * SA_OK - normal case. * SA_ERR_HPI_INVALID_PARAMS - Pointer parameter(s) NULL. **/ SaErrorT snmp_bc_fetch_MT_install_mask(struct oh_handler_state *handle, struct snmp_value *getintvalue) { SaErrorT err; struct snmp_value get_value, get_value2; struct snmp_bc_hnd *custom_handle; if (!handle) { err("Invalid parameter."); return(SA_ERR_HPI_INVALID_PARAMS); } custom_handle = (struct snmp_bc_hnd *)handle->data; if (!custom_handle) { err("Invalid parameter."); return(SA_ERR_HPI_INVALID_PARAMS); } err = SA_OK; getintvalue->type = ASN_INTEGER; err = snmp_bc_snmp_get(custom_handle, SNMP_BC_MT_INSTALLED, &get_value, SAHPI_TRUE); if (err == SA_ERR_HPI_NOT_PRESENT) {getintvalue->type = ASN_INTEGER; getintvalue->integer = 0;} else if (err != SA_OK) { dbg("Cannot get OID=%s; Received Type=%d; Error=%s.", SNMP_BC_MT_INSTALLED, get_value.type, oh_lookup_error(err)); if (err) { return(err); } else { return(SA_ERR_HPI_INTERNAL_ERROR); } } else { if (get_value.type == ASN_OCTET_STR) { getintvalue->integer = atoi(get_value.string); } else if (get_value.type == ASN_INTEGER) { if (get_value.integer == 0) { getintvalue->integer = 0; } else { err = snmp_bc_snmp_get(custom_handle, SNMP_BC_NOS_MT_INSTALLED, &get_value2, SAHPI_TRUE); if (err == SA_ERR_HPI_NOT_PRESENT) { getintvalue->integer = get_value.integer; if (getintvalue->integer == 1) getintvalue->integer = 10; } else if (err != SA_OK) { if (err) { return(err); } else { return(SA_ERR_HPI_INTERNAL_ERROR); } } else { if (get_value2.type == ASN_OCTET_STR) getintvalue->integer = atoi(get_value2.string); else getintvalue->integer = 0; } } } } return(err); } openhpi-2.14.1/plugins/snmp_bc/snmp_bc_utils.c0000644000076400007640000003022011302566770016304 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2003, 2006 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * Chris Chia */ #include #include #include SaErrorT snmp_bc_get_guid(struct snmp_bc_hnd *custom_handle, struct oh_event *e, struct ResourceInfo *res_info_ptr) { SaErrorT status; gchar *UUID; gchar *BC_UUID; gchar **tmpstr; SaHpiGuidT guid; struct snmp_value get_value; const gchar *UUID_delimiter1; const gchar *UUID_delimiter2; const gchar *UUID_delimiter; const gchar *NA; /* not case sensitive */ guint UUID_cnt, i; uuid_t UUID_val; UUID_delimiter1 = " "; UUID_delimiter2 = "-"; UUID_delimiter = "-"; NA = "NOT AVAILABLE"; UUID_cnt = 0; i = 0; UUID = NULL; BC_UUID = NULL; tmpstr = NULL; if ( (custom_handle == NULL) || (e == NULL) || (res_info_ptr == NULL)) { err("Invalid parameter."); status = SA_ERR_HPI_INVALID_PARAMS; goto CLEANUP2; } memset(&guid, 0, sizeof(SaHpiGuidT)); /* default to zero */ if (res_info_ptr->mib.OidUuid == NULL) { dbg("NULL UUID OID"); status = SA_OK; goto CLEANUP; } status = snmp_bc_oid_snmp_get(custom_handle, &(e->resource.ResourceEntity), 0, res_info_ptr->mib.OidUuid, &get_value, SAHPI_TRUE); if(( status != SA_OK) || (get_value.type != ASN_OCTET_STR)) { dbg("Cannot get OID rc=%d; oid=%s type=%d.", status, res_info_ptr->mib.OidUuid, get_value.type); if ( status != SA_ERR_HPI_BUSY) status = SA_ERR_HPI_NO_RESPONSE; goto CLEANUP; } dbg("UUID=%s.", get_value.string); /* rid lead+trail blanks */ BC_UUID = g_strstrip(g_strdup(get_value.string)); if (BC_UUID == NULL || BC_UUID[0] == '\0') { err("UUID is NULL."); status = SA_ERR_HPI_ERROR; goto CLEANUP; } if (g_ascii_strcasecmp( BC_UUID, NA ) == 0) { dbg("UUID is N/A %s, set GUID to zeros.", BC_UUID); for ( i=0; i<16; i++ ) UUID_val[i] = 0; memmove ( guid, &UUID_val, sizeof(uuid_t)); status = SA_OK; goto CLEANUP; } /* separate substrings */ tmpstr = g_strsplit(BC_UUID, UUID_delimiter1, -1); for ( UUID_cnt=0; tmpstr[UUID_cnt] != NULL; UUID_cnt++ ); /* dbg("number of UUID substrings = %d, strings =", UUID_cnt); */ /* for (i=0; iresource.ResourceInfo.Guid, guid, sizeof(SaHpiGuidT)); CLEANUP2: g_free(UUID); g_free(BC_UUID); g_strfreev(tmpstr); /* dbg("get_guid exit status %d.", status); */ return(status); } /** * snmp_bc_discover_resources: * @resource_ep: Pointer to full FRU Resource Entity Path. * @slot_ep : Pointer to Slot Entity Path extracted from resource_ep * * Extract Slot Entity Path portion from the full FRU Entity Path * * Return values: * Slot Entity Path - normal operation. * SA_ERR_HPI_INVALID_PARAMS - Invalid input pointer or data **/ SaErrorT snmp_bc_extract_slot_ep(SaHpiEntityPathT *resource_ep, SaHpiEntityPathT *slot_ep) { guint i,j; if (!resource_ep || !slot_ep) { err("Invalid parameter."); return(SA_ERR_HPI_INVALID_PARAMS); } for (i = 0; i < SAHPI_MAX_ENTITY_PATH ; i++) { if ( (resource_ep->Entry[i].EntityType == SAHPI_ENT_PHYSICAL_SLOT) || (resource_ep->Entry[i].EntityType == BLADECENTER_SWITCH_SLOT) || (resource_ep->Entry[i].EntityType == BLADECENTER_POWER_SUPPLY_SLOT) || (resource_ep->Entry[i].EntityType == BLADECENTER_PERIPHERAL_BAY_SLOT) || (resource_ep->Entry[i].EntityType == BLADECENTER_SYS_MGMNT_MODULE_SLOT) || (resource_ep->Entry[i].EntityType == BLADECENTER_ALARM_PANEL_SLOT) || (resource_ep->Entry[i].EntityType == BLADECENTER_MUX_SLOT) || (resource_ep->Entry[i].EntityType == BLADECENTER_CLOCK_SLOT) || (resource_ep->Entry[i].EntityType == BLADECENTER_BLOWER_SLOT) ) break; } /* There must alway be a SAHPI_ENT_ROOT, so xx_SLOT entry index must always be less than SAHPI_MAX_ENTITY_PATH */ if ( i == SAHPI_MAX_ENTITY_PATH) return(SA_ERR_HPI_INVALID_PARAMS); for ( j = 0; i < SAHPI_MAX_ENTITY_PATH; i++) { slot_ep->Entry[j].EntityType = resource_ep->Entry[i].EntityType; slot_ep->Entry[j].EntityLocation = resource_ep->Entry[i].EntityLocation; if (resource_ep->Entry[i].EntityType == SAHPI_ENT_ROOT) break; j++; } return(SA_OK); } /** * snmp_bc_copy_oh_event: * @new_event: Pointer to new oh_event. * @old_event: Pointer to old oh_event. * * Allocate and create a duplicate copy of old_event * * Return values: **/ SaErrorT snmp_bc_copy_oh_event(struct oh_event *new_event, struct oh_event *old_event) { GSList *node; if (!new_event || !old_event) return(SA_ERR_HPI_INVALID_PARAMS); node = NULL; *new_event = *old_event; new_event->rdrs = NULL; for (node = old_event->rdrs; node; node = node->next) { new_event->rdrs = g_slist_append(new_event->rdrs, g_memdup(node->data, sizeof(SaHpiRdrT))); } return(SA_OK); } /** * snmp_bc_alloc_oh_event: * * Allocate and create a copy of oh_event with default data * * Return values: * NULL - No space or invalid parm * (oh_event *) - Normal **/ struct oh_event *snmp_bc_alloc_oh_event() { struct oh_event *e = NULL; e = (struct oh_event *)g_malloc0(sizeof(struct oh_event)); if (e == NULL) return(e); e->rdrs = NULL; return e; } /** * snmp_bc_free_oh_event: * @event: Pointer to oh_event. * * Free oh_event space * * Return values: * NULL - No space or invalid parm * (oh_event *) - Normal **/ void snmp_bc_free_oh_event(struct oh_event *e) { if (!e) return; g_slist_free(e->rdrs); g_free(e); return; } /** * snmp_bc_set_resource_add_oh_event: * @e: Pointer to oh_event. * @res_info_ptr * * Initialize (oh_event *).event to default value for resource_add * e->resource must be initialized prior to using this util. * * Return values: * NULL - No space or invalid parm * (oh_event *) - Normal **/ SaErrorT snmp_bc_set_resource_add_oh_event(struct oh_event *e, struct ResourceInfo *res_info_ptr) { if (!e || !res_info_ptr) return(SA_ERR_HPI_INVALID_PARAMS); e->event.Severity = e->resource.ResourceSeverity; e->event.Source = e->resource.ResourceId; if (oh_gettimeofday(&e->event.Timestamp) != SA_OK) e->event.Timestamp = SAHPI_TIME_UNSPECIFIED; if (e->resource.ResourceCapabilities & SAHPI_CAPABILITY_FRU) { e->event.EventType = SAHPI_ET_HOTSWAP; e->event.EventDataUnion.HotSwapEvent.HotSwapState = e->event.EventDataUnion.HotSwapEvent.HotSwapState = res_info_ptr->cur_state; } else { e->event.EventType = SAHPI_ET_RESOURCE; e->event.EventDataUnion.ResourceEvent.ResourceEventType = SAHPI_RESE_RESOURCE_ADDED; } return(SA_OK); } /** * snmp_bc_extend_ep: * @e: Pointer to oh_event. * @resource_index: * @interposer_installed_mask: * * If there is an interposer installed in this resource slot, * insert interposer into entitypath between physical slot and resource entity. * * Currently there are 2 types of interposer cards, Switch (smi) and Management Module (mmi) * interposers. * * Return values: * * SA_OK - Normal **/ SaErrorT snmp_bc_extend_ep(struct oh_event *e, guint resource_index, gchar *interposer_install_mask) { guint i; if (interposer_install_mask[resource_index] == '1') { for (i=0; iresource.ResourceEntity.Entry[i].EntityType == SAHPI_ENT_ROOT) break; } do { e->resource.ResourceEntity.Entry[i+1].EntityType = e->resource.ResourceEntity.Entry[i].EntityType; e->resource.ResourceEntity.Entry[i+1].EntityLocation = e->resource.ResourceEntity.Entry[i].EntityLocation; i--; } while (i > 0); /* i == 0 at this point; setting ep Entry[1] */ e->resource.ResourceEntity.Entry[i+1].EntityType = SAHPI_ENT_INTERCONNECT; e->resource.ResourceEntity.Entry[i+1].EntityLocation = SNMP_BC_HPI_LOCATION_BASE + resource_index; /* Entry[0] remains untouched */ } return(SA_OK); } openhpi-2.14.1/plugins/snmp_bc/snmp_bc_power.h0000644000076400007640000000134411302566770016312 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * Steve Sherman */ #ifndef __SNMP_BC_POWER_H #define __SNMP_BC_POWER_H SaErrorT snmp_bc_get_power_state(void *hnd, SaHpiResourceIdT rid, SaHpiPowerStateT *state); SaErrorT snmp_bc_set_power_state(void *hnd, SaHpiResourceIdT rid, SaHpiPowerStateT state); #endif openhpi-2.14.1/plugins/snmp_bc/t/0000755000076400007640000000000011405006365013536 5ustar openhpi-2.14.1/plugins/snmp_bc/t/Makefile.am0000644000076400007640000004564611302566764015623 0ustar # (C) Copyright IBM Corp 2003, 2006 # All rights reserved. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This # file and program are licensed under a BSD style license. See # the Copying file included with the OpenHPI distribution for # full licensing terms. # Generated files - need to keep in sync with parent directory's Makefile.am GENERATED_EVENT_XML_MAP = event.xml GENERATED_EVENT_CODE = el2event.c GENERATED_CODE = $(GENERATED_EVENT_XML_MAP) $(GENERATED_EVENT_CODE) REMOTE_SIM_SOURCES = \ snmp_bc.c \ snmp_bc_annunciator.c \ snmp_bc_control.c \ snmp_bc_discover.c \ snmp_bc_discover_bc.c \ snmp_bc_discover_rsa.c \ snmp_bc_event.c \ snmp_bc_inventory.c \ snmp_bc_hotswap.c \ snmp_bc_power.c \ snmp_bc_reset.c \ snmp_bc_resources.c \ snmp_bc_resources_rsa.c \ snmp_bc_sel.c \ snmp_bc_sensor.c \ snmp_bc_session.c \ snmp_bc_time.c \ snmp_bc_utils.c \ snmp_bc_watchdog.c \ snmp_bc_xml2event.c MOSTLYCLEANFILES = @TEST_CLEAN@ $(REMOTE_SIM_SOURCES) uid_map MOSTLYCLEANFILES += $(GENERATED_CODE) MAINTAINERCLEANFILES = Makefile.in SNMPUTILSDIR = $(top_srcdir)/$(SNMPDIR) INCLUDES = \ @OPENHPI_INCLUDES@ \ -I$(top_srcdir)/snmp \ -I$(top_srcdir)/include \ -I$(SNMPUTILSDIR) \ -I$(top_srcdir)/plugins/snmp_bc AM_CFLAGS = @SNMPFLAGS@ # AM_CFLAGS = @CFLAGS@ -I$(top_srcdir)/include @SNMPFLAGS@ EXTRA_DIST = sim_resources.h openhpi.conf tsetup.h sim_test_file noinst_LTLIBRARIES = libsnmp_bc.la $(REMOTE_SIM_SOURCES): if test ! -f $@ -a ! -L $@; then \ $(LN_S) $(top_srcdir)/plugins/snmp_bc/$@; \ fi libsnmp_bc_la_SOURCES = \ sim_init.c \ sim_resources.c \ sim_file.c \ snmp_utils.c \ tsetup.c nodist_libsnmp_bc_la_SOURCES = $(GENERATED_EVENT_CODE) $(REMOTE_SIM_SOURCES) # libopenhpi_la_LIBADD = @STATIC_PLUGIN_LIBS@ @STATIC_PLUGIN_EXTRA_LIBS@ $(top_builddir)/utils/libopenhpiutils.la # libopenhpi_la_LDFLAGS = -L$(top_builddir)/utils -version-info @HPI_LIB_VERSION@ -export-symbols $(top_srcdir)/src/hpi.sym libsnmp_bc_la_LIBADD = -luuid @SNMPLIBS@ $(top_builddir)/utils/libopenhpiutils.la libsnmp_bc_la_LDFLAGS = -L$(top_builddir)/utils -module -version-info @HPI_LIB_VERSION@ # libsnmp_bc_la_LDFLAGS = -version 0:0:0 libsnmp_bc.la: $(libsnmp_bc_la_OBJECTS) $(libsnmp_bc_la_DEPENDENCIES) $(LINK) -rpath $(pkglibdir) $(libsnmp_bc_la_LDFLAGS) $(libsnmp_bc_la_OBJECTS) $(libsnmp_bc_la_LIBADD) $(LIBS) # Keep in sync with parent directory's Makefile.am # FIXME:: Be nice if auto-generation rules where just in snmp_bc/Makefile.am # and not repeated here; but t directory is done first. EVENT_MAP_FILE = $(top_srcdir)/plugins/snmp_bc/snmp_bc_event.map EVENT_MAP_SCRIPT = $(top_srcdir)/plugins/snmp_bc/eventmap2code.pl EVENT_XML_MAP_SCRIPT = $(top_srcdir)/scripts/text2cstr.pl $(GENERATED_EVENT_CODE): $(EVENT_MAP_FILE) $(EVENT_MAP_SCRIPT) $(EVENT_XML_MAP_SCRIPT) $(EVENT_MAP_SCRIPT) -xml -idir $(top_srcdir)/plugins/snmp_bc -mapfile snmp_bc_event.map $(EVENT_XML_MAP_SCRIPT) -s eventxml $(GENERATED_EVENT_XML_MAP) > $(GENERATED_EVENT_CODE) # Setup environment variables for TESTS programs TESTS_ENVIRONMENT = OPENHPI_CONF=$(srcdir)/openhpi.conf TESTS_ENVIRONMENT += OPENHPI_SIMTEST_FILE=$(srcdir)/sim_test_file #TESTS_ENVIRONMENT += OPENHPI_ERROR=YES #TESTS_ENVIRONMENT += OPENHPI_DEBUG=YES TESTS_ENVIRONMENT += LD_LIBRARY_PATH=$(top_srcdir)/src/.libs:$(top_srcdir)/ssl/.libs:$(top_srcdir)/utils/.libs:$(top_srcdir)/plugins/snmp/.libs:$(top_srcdir)/plugins/snmp_bc/t/.libs TESTS_ENVIRONMENT += OPENHPI_UID_MAP=$(shell pwd)/uid_map TESTS_ENVIRONMENT += OPENHPI_PATH=$(shell pwd) TESTS = \ tsim_file \ tevent \ tcontrol_parms \ tset_resource_tag \ tset_resource_sev \ tsnmp_bc_getset \ tsensorget001 \ tsensorget002 \ tsensorget003 \ tsensorget004 \ tsensorget005 \ tsensorget010 \ tsensorget013 \ tsensorget016 \ tsensorget031 \ tsensorget033 \ tsensorget034 \ tsensorget035 \ tsensorget036 \ tsensorget040 \ tsensorget041 \ tcontrol001 \ tcontrol002 \ tcontrol003 \ tcontrolfailover \ tdiscover001 \ tel001 \ tel002 \ tel003 \ tel004 \ tel005 \ tel006 \ tel007 \ thotswap001 \ thotswap-mhs001 \ thotswap-simple001 \ tinv001 \ tinv002 \ tinv003 \ tinv004 \ tinv005 \ tinv006 \ tinv007 \ tpower001 \ treset001 \ tsptime001 \ tsptime002 \ tsensorset001 \ tsensorset002 \ tsensorset003 \ tsensorset004 \ tsensorset005 \ tsensorset006 \ tsensorset007 \ tsensorset008 \ tsensorset009 \ tsensorset010 \ tsensorset011 \ tsensorset012 \ tsensorset013 \ tsensorset015 \ tsensorset017 \ tsensorset018 \ tsensorset019 \ tsensorset020 \ tsensorset021 \ tsensorset022 \ tsensorset023 \ tsensorset024 # tdiscover002 # tsnmp_bc_get_guid # Need to put expected test failures in BOTH TESTS and XFAIL_TESTS # XFAIL_TESTS = thotswap_reset check_PROGRAMS = $(TESTS) # Unit test using normal IF calls and simulation library tsim_file_SOURCES = tsim_file.c tsim_file_LDADD = $(top_builddir)/utils/libopenhpiutils.la \ $(top_builddir)/src/libopenhpi.la \ $(top_builddir)/plugins/snmp_bc/t/libsnmp_bc.la # Unit test using normal IF calls and simulation library tevent_SOURCES = tevent.c tevent_LDADD = $(top_builddir)/utils/libopenhpiutils.la \ $(top_builddir)/src/libopenhpi.la \ $(top_builddir)/plugins/snmp_bc/t/libsnmp_bc.la # Unit test using normal IF calls and simulation library tcontrol_parms_SOURCES = tcontrol_parms.c tcontrol_parms_LDADD = $(top_builddir)/utils/libopenhpiutils.la \ $(top_builddir)/src/libopenhpi.la \ $(top_builddir)/plugins/snmp_bc/t/libsnmp_bc.la # Unit test using normal IF calls and simulation library tset_resource_tag_SOURCES = tset_resource_tag.c tset_resource_tag_LDADD = $(top_builddir)/utils/libopenhpiutils.la \ $(top_builddir)/src/libopenhpi.la \ $(top_builddir)/plugins/snmp_bc/t/libsnmp_bc.la # Unit test using normal IF calls and simulation library tset_resource_sev_SOURCES = tset_resource_sev.c tset_resource_sev_LDADD = $(top_builddir)/utils/libopenhpiutils.la \ $(top_builddir)/src/libopenhpi.la \ $(top_builddir)/plugins/snmp_bc/t/libsnmp_bc.la # Unit test using normal IF calls and simulation library tsnmp_bc_getset_SOURCES = tsnmp_bc_getset.c tsnmp_bc_getset_LDADD = $(top_builddir)/utils/libopenhpiutils.la \ $(top_builddir)/src/libopenhpi.la \ $(top_builddir)/plugins/snmp_bc/t/libsnmp_bc.la # tsensorget001_SOURCES = tsensorget001.c tsensorget001_LDADD = $(top_builddir)/utils/libopenhpiutils.la \ $(top_builddir)/src/libopenhpi.la \ $(top_builddir)/plugins/snmp_bc/t/libsnmp_bc.la # tsensorget002_SOURCES = tsensorget002.c tsensorget002_LDADD = $(top_builddir)/utils/libopenhpiutils.la \ $(top_builddir)/src/libopenhpi.la \ $(top_builddir)/plugins/snmp_bc/t/libsnmp_bc.la # tsensorget003_SOURCES = tsensorget003.c tsensorget003_LDADD = $(top_builddir)/utils/libopenhpiutils.la \ $(top_builddir)/src/libopenhpi.la \ $(top_builddir)/plugins/snmp_bc/t/libsnmp_bc.la # tsensorget004_SOURCES = tsensorget004.c tsensorget004_LDADD = $(top_builddir)/utils/libopenhpiutils.la \ $(top_builddir)/src/libopenhpi.la \ $(top_builddir)/plugins/snmp_bc/t/libsnmp_bc.la # tsensorget005_SOURCES = tsensorget005.c tsensorget005_LDADD = $(top_builddir)/utils/libopenhpiutils.la \ $(top_builddir)/src/libopenhpi.la \ $(top_builddir)/plugins/snmp_bc/t/libsnmp_bc.la # tsensorget010_SOURCES = tsensorget010.c tsensorget010_LDADD = $(top_builddir)/utils/libopenhpiutils.la \ $(top_builddir)/src/libopenhpi.la \ $(top_builddir)/plugins/snmp_bc/t/libsnmp_bc.la # tsensorget013_SOURCES = tsensorget013.c tsensorget013_LDADD = $(top_builddir)/utils/libopenhpiutils.la \ $(top_builddir)/src/libopenhpi.la \ $(top_builddir)/plugins/snmp_bc/t/libsnmp_bc.la # tsensorget016_SOURCES = tsensorget016.c tsensorget016_LDADD = $(top_builddir)/utils/libopenhpiutils.la \ $(top_builddir)/src/libopenhpi.la \ $(top_builddir)/plugins/snmp_bc/t/libsnmp_bc.la # tsensorget031_SOURCES = tsensorget031.c tsensorget031_LDADD = $(top_builddir)/utils/libopenhpiutils.la \ $(top_builddir)/src/libopenhpi.la \ $(top_builddir)/plugins/snmp_bc/t/libsnmp_bc.la # tsensorget033_SOURCES = tsensorget033.c tsensorget033_LDADD = $(top_builddir)/utils/libopenhpiutils.la \ $(top_builddir)/src/libopenhpi.la \ $(top_builddir)/plugins/snmp_bc/t/libsnmp_bc.la # tsensorget034_SOURCES = tsensorget034.c tsensorget034_LDADD = $(top_builddir)/utils/libopenhpiutils.la \ $(top_builddir)/src/libopenhpi.la \ $(top_builddir)/plugins/snmp_bc/t/libsnmp_bc.la # tsensorget035_SOURCES = tsensorget035.c tsensorget035_LDADD = $(top_builddir)/utils/libopenhpiutils.la \ $(top_builddir)/src/libopenhpi.la \ $(top_builddir)/plugins/snmp_bc/t/libsnmp_bc.la # tsensorget036_SOURCES = tsensorget036.c tsensorget036_LDADD = $(top_builddir)/utils/libopenhpiutils.la \ $(top_builddir)/src/libopenhpi.la \ $(top_builddir)/plugins/snmp_bc/t/libsnmp_bc.la # tsensorget040_SOURCES = tsensorget040.c tsensorget040_LDADD = $(top_builddir)/utils/libopenhpiutils.la \ $(top_builddir)/src/libopenhpi.la \ $(top_builddir)/plugins/snmp_bc/t/libsnmp_bc.la # tsensorget041_SOURCES = tsensorget041.c tsensorget041_LDADD = $(top_builddir)/utils/libopenhpiutils.la \ $(top_builddir)/src/libopenhpi.la \ $(top_builddir)/plugins/snmp_bc/t/libsnmp_bc.la # tsensorset001_SOURCES = tsensorset001.c tsensorset001_LDADD = $(top_builddir)/utils/libopenhpiutils.la \ $(top_builddir)/src/libopenhpi.la \ $(top_builddir)/plugins/snmp_bc/t/libsnmp_bc.la # tsensorset002_SOURCES = tsensorset002.c tsensorset002_LDADD = $(top_builddir)/utils/libopenhpiutils.la \ $(top_builddir)/src/libopenhpi.la \ $(top_builddir)/plugins/snmp_bc/t/libsnmp_bc.la # tsensorset003_SOURCES = tsensorset003.c tsensorset003_LDADD = $(top_builddir)/utils/libopenhpiutils.la \ $(top_builddir)/src/libopenhpi.la \ $(top_builddir)/plugins/snmp_bc/t/libsnmp_bc.la # tsensorset004_SOURCES = tsensorset004.c tsensorset004_LDADD = $(top_builddir)/utils/libopenhpiutils.la \ $(top_builddir)/src/libopenhpi.la \ $(top_builddir)/plugins/snmp_bc/t/libsnmp_bc.la # tsensorset005_SOURCES = tsensorset005.c tsensorset005_LDADD = $(top_builddir)/utils/libopenhpiutils.la \ $(top_builddir)/src/libopenhpi.la \ $(top_builddir)/plugins/snmp_bc/t/libsnmp_bc.la # tsensorset006_SOURCES = tsensorset006.c tsensorset006_LDADD = $(top_builddir)/utils/libopenhpiutils.la \ $(top_builddir)/src/libopenhpi.la \ $(top_builddir)/plugins/snmp_bc/t/libsnmp_bc.la # tsensorset007_SOURCES = tsensorset007.c tsensorset007_LDADD = $(top_builddir)/utils/libopenhpiutils.la \ $(top_builddir)/src/libopenhpi.la \ $(top_builddir)/plugins/snmp_bc/t/libsnmp_bc.la # tsensorset008_SOURCES = tsensorset008.c tsensorset008_LDADD = $(top_builddir)/utils/libopenhpiutils.la \ $(top_builddir)/src/libopenhpi.la \ $(top_builddir)/plugins/snmp_bc/t/libsnmp_bc.la # tsensorset009_SOURCES = tsensorset009.c tsensorset009_LDADD = $(top_builddir)/utils/libopenhpiutils.la \ $(top_builddir)/src/libopenhpi.la \ $(top_builddir)/plugins/snmp_bc/t/libsnmp_bc.la # tsensorset010_SOURCES = tsensorset010.c tsensorset010_LDADD = $(top_builddir)/utils/libopenhpiutils.la \ $(top_builddir)/src/libopenhpi.la \ $(top_builddir)/plugins/snmp_bc/t/libsnmp_bc.la # tsensorset011_SOURCES = tsensorset011.c tsensorset011_LDADD = $(top_builddir)/utils/libopenhpiutils.la \ $(top_builddir)/src/libopenhpi.la \ $(top_builddir)/plugins/snmp_bc/t/libsnmp_bc.la # tsensorset012_SOURCES = tsensorset012.c tsensorset012_LDADD = $(top_builddir)/utils/libopenhpiutils.la \ $(top_builddir)/src/libopenhpi.la \ $(top_builddir)/plugins/snmp_bc/t/libsnmp_bc.la # tsensorset013_SOURCES = tsensorset013.c tsensorset013_LDADD = $(top_builddir)/utils/libopenhpiutils.la \ $(top_builddir)/src/libopenhpi.la \ $(top_builddir)/plugins/snmp_bc/t/libsnmp_bc.la # tsensorset015_SOURCES = tsensorset015.c tsensorset015_LDADD = $(top_builddir)/utils/libopenhpiutils.la \ $(top_builddir)/src/libopenhpi.la \ $(top_builddir)/plugins/snmp_bc/t/libsnmp_bc.la # tsensorset017_SOURCES = tsensorset017.c tsensorset017_LDADD = $(top_builddir)/utils/libopenhpiutils.la \ $(top_builddir)/src/libopenhpi.la \ $(top_builddir)/plugins/snmp_bc/t/libsnmp_bc.la # tsensorset018_SOURCES = tsensorset018.c tsensorset018_LDADD = $(top_builddir)/utils/libopenhpiutils.la \ $(top_builddir)/src/libopenhpi.la \ $(top_builddir)/plugins/snmp_bc/t/libsnmp_bc.la # tsensorset019_SOURCES = tsensorset019.c tsensorset019_LDADD = $(top_builddir)/utils/libopenhpiutils.la \ $(top_builddir)/src/libopenhpi.la \ $(top_builddir)/plugins/snmp_bc/t/libsnmp_bc.la # tsensorset020_SOURCES = tsensorset020.c tsensorset020_LDADD = $(top_builddir)/utils/libopenhpiutils.la \ $(top_builddir)/src/libopenhpi.la \ $(top_builddir)/plugins/snmp_bc/t/libsnmp_bc.la # tsensorset021_SOURCES = tsensorset021.c tsensorset021_LDADD = $(top_builddir)/utils/libopenhpiutils.la \ $(top_builddir)/src/libopenhpi.la \ $(top_builddir)/plugins/snmp_bc/t/libsnmp_bc.la # tsensorset022_SOURCES = tsensorset022.c tsensorset022_LDADD = $(top_builddir)/utils/libopenhpiutils.la \ $(top_builddir)/src/libopenhpi.la \ $(top_builddir)/plugins/snmp_bc/t/libsnmp_bc.la # tsensorset023_SOURCES = tsensorset023.c tsensorset023_LDADD = $(top_builddir)/utils/libopenhpiutils.la \ $(top_builddir)/src/libopenhpi.la \ $(top_builddir)/plugins/snmp_bc/t/libsnmp_bc.la # tsensorset024_SOURCES = tsensorset024.c tsensorset024_LDADD = $(top_builddir)/utils/libopenhpiutils.la \ $(top_builddir)/src/libopenhpi.la \ $(top_builddir)/plugins/snmp_bc/t/libsnmp_bc.la # tel001_SOURCES = tel001.c tel001_LDADD = $(top_builddir)/utils/libopenhpiutils.la \ $(top_builddir)/src/libopenhpi.la \ $(top_builddir)/plugins/snmp_bc/t/libsnmp_bc.la # tel002_SOURCES = tel002.c tel002_LDADD = $(top_builddir)/utils/libopenhpiutils.la \ $(top_builddir)/src/libopenhpi.la \ $(top_builddir)/plugins/snmp_bc/t/libsnmp_bc.la # tel003_SOURCES = tel003.c tel003_LDADD = $(top_builddir)/utils/libopenhpiutils.la \ $(top_builddir)/src/libopenhpi.la \ $(top_builddir)/plugins/snmp_bc/t/libsnmp_bc.la # tel004_SOURCES = tel004.c tel004_LDADD = $(top_builddir)/utils/libopenhpiutils.la \ $(top_builddir)/src/libopenhpi.la \ $(top_builddir)/plugins/snmp_bc/t/libsnmp_bc.la # tel005_SOURCES = tel005.c tel005_LDADD = $(top_builddir)/utils/libopenhpiutils.la \ $(top_builddir)/src/libopenhpi.la \ $(top_builddir)/plugins/snmp_bc/t/libsnmp_bc.la # tel006_SOURCES = tel006.c tel006_LDADD = $(top_builddir)/utils/libopenhpiutils.la \ $(top_builddir)/src/libopenhpi.la \ $(top_builddir)/plugins/snmp_bc/t/libsnmp_bc.la # tel007_SOURCES = tel007.c tel007_LDADD = $(top_builddir)/utils/libopenhpiutils.la \ $(top_builddir)/src/libopenhpi.la \ $(top_builddir)/plugins/snmp_bc/t/libsnmp_bc.la # tinv001_SOURCES = tinv001.c tinv001_LDADD = $(top_builddir)/utils/libopenhpiutils.la \ $(top_builddir)/src/libopenhpi.la \ $(top_builddir)/plugins/snmp_bc/t/libsnmp_bc.la # tinv002_SOURCES = tinv002.c tinv002_LDADD = $(top_builddir)/utils/libopenhpiutils.la \ $(top_builddir)/src/libopenhpi.la \ $(top_builddir)/plugins/snmp_bc/t/libsnmp_bc.la # tinv003_SOURCES = tinv003.c tinv003_LDADD = $(top_builddir)/utils/libopenhpiutils.la \ $(top_builddir)/src/libopenhpi.la \ $(top_builddir)/plugins/snmp_bc/t/libsnmp_bc.la # tinv004_SOURCES = tinv004.c tinv004_LDADD = $(top_builddir)/utils/libopenhpiutils.la \ $(top_builddir)/src/libopenhpi.la \ $(top_builddir)/plugins/snmp_bc/t/libsnmp_bc.la # tinv005_SOURCES = tinv005.c tinv005_LDADD = $(top_builddir)/utils/libopenhpiutils.la \ $(top_builddir)/src/libopenhpi.la \ $(top_builddir)/plugins/snmp_bc/t/libsnmp_bc.la # tinv006_SOURCES = tinv006.c tinv006_LDADD = $(top_builddir)/utils/libopenhpiutils.la \ $(top_builddir)/src/libopenhpi.la \ $(top_builddir)/plugins/snmp_bc/t/libsnmp_bc.la # tinv007_SOURCES = tinv007.c tinv007_LDADD = $(top_builddir)/utils/libopenhpiutils.la \ $(top_builddir)/src/libopenhpi.la \ $(top_builddir)/plugins/snmp_bc/t/libsnmp_bc.la # thotswap001_SOURCES = thotswap001.c thotswap001_LDADD = $(top_builddir)/utils/libopenhpiutils.la \ $(top_builddir)/src/libopenhpi.la \ $(top_builddir)/plugins/snmp_bc/t/libsnmp_bc.la # thotswap_mhs001_SOURCES = thotswap-mhs001.c thotswap_mhs001_LDADD = $(top_builddir)/utils/libopenhpiutils.la \ $(top_builddir)/src/libopenhpi.la \ $(top_builddir)/plugins/snmp_bc/t/libsnmp_bc.la # thotswap_simple001_SOURCES = thotswap-simple001.c thotswap_simple001_LDADD = $(top_builddir)/utils/libopenhpiutils.la \ $(top_builddir)/src/libopenhpi.la \ $(top_builddir)/plugins/snmp_bc/t/libsnmp_bc.la # tpower001_SOURCES = tpower001.c tpower001_LDADD = $(top_builddir)/utils/libopenhpiutils.la \ $(top_builddir)/src/libopenhpi.la \ $(top_builddir)/plugins/snmp_bc/t/libsnmp_bc.la # treset001_SOURCES = treset001.c treset001_LDADD = $(top_builddir)/utils/libopenhpiutils.la \ $(top_builddir)/src/libopenhpi.la \ $(top_builddir)/plugins/snmp_bc/t/libsnmp_bc.la # tsptime001_SOURCES = tsptime001.c tsptime001_LDADD = $(top_builddir)/utils/libopenhpiutils.la \ $(top_builddir)/src/libopenhpi.la \ $(top_builddir)/plugins/snmp_bc/t/libsnmp_bc.la # tsptime002_SOURCES = tsptime002.c tsptime002_LDADD = $(top_builddir)/utils/libopenhpiutils.la \ $(top_builddir)/src/libopenhpi.la \ $(top_builddir)/plugins/snmp_bc/t/libsnmp_bc.la # tdiscover001_SOURCES = tdiscover001.c tdiscover001_LDADD = $(top_builddir)/utils/libopenhpiutils.la \ $(top_builddir)/src/libopenhpi.la \ $(top_builddir)/plugins/snmp_bc/t/libsnmp_bc.la # #tdiscover002_SOURCES = tdiscover002.c #tdiscover002_LDADD = $(top_builddir)/utils/libopenhpiutils.la \ # $(top_builddir)/src/libopenhpi.la \ # $(top_builddir)/plugins/snmp_bc/t/libsnmp_bc.la # tcontrol001_SOURCES = tcontrol001.c tcontrol001_LDADD = $(top_builddir)/utils/libopenhpiutils.la \ $(top_builddir)/src/libopenhpi.la \ $(top_builddir)/plugins/snmp_bc/t/libsnmp_bc.la # tcontrol002_SOURCES = tcontrol002.c tcontrol002_LDADD = $(top_builddir)/utils/libopenhpiutils.la \ $(top_builddir)/src/libopenhpi.la \ $(top_builddir)/plugins/snmp_bc/t/libsnmp_bc.la # tcontrol003_SOURCES = tcontrol003.c tcontrol003_LDADD = $(top_builddir)/utils/libopenhpiutils.la \ $(top_builddir)/src/libopenhpi.la \ $(top_builddir)/plugins/snmp_bc/t/libsnmp_bc.la tcontrolfailover_SOURCES = tcontrolfailover.c tcontrolfailover_LDADD = $(top_builddir)/utils/libopenhpiutils.la \ $(top_builddir)/src/libopenhpi.la \ $(top_builddir)/plugins/snmp_bc/t/libsnmp_bc.la # Unit test using normal IF calls and simulation library #tsnmp_bc_get_guid_SOURCES = tsnmp_bc_get_guid.c #tsnmp_bc_get_guid_LDADD = $(top_builddir)/utils/libopenhpiutils.la \ # $(top_builddir)/src/libopenhpi.la \ # $(top_builddir)/plugins/snmp_bc/t/libsnmp_bc.la openhpi-2.14.1/plugins/snmp_bc/t/tsensorset007.c0000644000076400007640000000540011302566763016352 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * Peter D Phan */ #include #include #include int main(int argc, char **argv) { /* ************************ * Local variables * ***********************/ int testfail = 0; SaErrorT err; SaErrorT expected_err; SaHpiRptEntryT rptentry; SaHpiRdrT rdr; SaHpiResourceIdT id; SaHpiSessionIdT sessionid; SaHpiBoolT enable = SAHPI_FALSE; SaHpiSensorNumT sid = 0; SaHpiEntryIdT entryid; SaHpiEntryIdT nextentryid; SaHpiBoolT foundSensor; /* ************************************* * Find a resource with Sensor type rdr * ************************************* */ err = tsetup(&sessionid); if (err != SA_OK) { printf("Error! Can not open session for test environment\n"); printf(" File=%s, Line=%d\n", __FILE__, __LINE__); return -1; } err = tfind_resource(&sessionid,SAHPI_CAPABILITY_SENSOR,SAHPI_FIRST_ENTRY, &rptentry, SAHPI_TRUE); if (err != SA_OK) { printf("Error! Can not find resources for test environment\n"); printf(" File=%s, Line=%d\n", __FILE__, __LINE__); err = tcleanup(&sessionid); return SA_OK; } id = rptentry.ResourceId; /************************** * Test: find a sensor with desired property **************************/ entryid = SAHPI_FIRST_ENTRY; foundSensor = SAHPI_FALSE; do { err = saHpiRdrGet(sessionid,id,entryid,&nextentryid, &rdr); if (err == SA_OK) { if ((rdr.RdrType == SAHPI_SENSOR_RDR) && (rdr.RdrTypeUnion.SensorRec.EventCtrl != SAHPI_SEC_PER_EVENT) && (rdr.RdrTypeUnion.SensorRec.EventCtrl != SAHPI_SEC_READ_ONLY_MASKS)) { foundSensor = SAHPI_TRUE; break; } entryid = nextentryid; } } while ((err == SA_OK) && (entryid != SAHPI_LAST_ENTRY)) ; if (!foundSensor) { err("Did not find desired resource for test\n"); return(SA_OK); } else { sid = rdr.RdrTypeUnion.SensorRec.Num; } /************************** * Test: Setting a read-only sensor **************************/ expected_err = SA_ERR_HPI_READ_ONLY; err = saHpiSensorEventEnableSet(sessionid, id, sid, enable); checkstatus(err, expected_err, testfail); /*************************** * Cleanup after all tests ***************************/ err = tcleanup(&sessionid); return testfail; } #include openhpi-2.14.1/plugins/snmp_bc/t/tcontrol001.c0000644000076400007640000000764411302566764016014 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * Peter D Phan */ #include #include #include int main(int argc, char **argv) { /* ************************ * Local variables * ***********************/ int testfail = 0; SaErrorT err; SaErrorT expected_err; SaHpiRptEntryT rptentry; SaHpiResourceIdT id; SaHpiSessionIdT sessionid; SaHpiRdrT rdr; SaHpiCtrlNumT cid = 1; SaHpiCtrlModeT mode; SaHpiCtrlStateT state; SaHpiEntryIdT entryid; SaHpiEntryIdT nextentryid; SaHpiBoolT foundControl; struct oh_handler_state l_handle; /* ************************************* * Find a resource with Control type rdr * ************************************* */ err = tsetup(&sessionid); if (err != SA_OK) { printf("Error! Can not open session for test environment\n"); printf(" File=%s, Line=%d\n", __FILE__, __LINE__); return -1; } err = tfind_resource(&sessionid, SAHPI_CAPABILITY_CONTROL, SAHPI_FIRST_ENTRY, &rptentry, SAHPI_TRUE); if (err != SA_OK) { printf("Can not find a control resource for test environment\n"); printf(" File=%s, Line=%d\n", __FILE__, __LINE__); err = tcleanup(&sessionid); return SA_OK; } id = rptentry.ResourceId; /************************** * Test: find a control RDR **************************/ entryid = SAHPI_FIRST_ENTRY; foundControl = SAHPI_FALSE; do { err = saHpiRdrGet(sessionid,id,entryid,&nextentryid, &rdr); if (err == SA_OK) { if (rdr.RdrType == SAHPI_CTRL_RDR) { foundControl = SAHPI_TRUE; break; } entryid = nextentryid; } } while ((err == SA_OK) && (entryid != SAHPI_LAST_ENTRY)) ; if (!foundControl) { err("Did not find desired resource for test\n"); return(SA_OK); } else { cid = rdr.RdrTypeUnion.CtrlRec.Num; } /************************** * Test 1: Invalid Handle *************************/ memset(&l_handle, 0, sizeof(struct oh_handler_state)); expected_err = SA_ERR_HPI_INVALID_PARAMS; err = snmp_bc_get_control_state(NULL, id, cid, &mode, &state); checkstatus(err, expected_err, testfail); /************************** * Test 2: Resource ID with no RPT *************************/ expected_err = SA_ERR_HPI_INVALID_RESOURCE; err = saHpiControlGet(sessionid, 5000, cid, &mode, &state); checkstatus(err, expected_err, testfail); /************************** * Test 3: Control ID with no RDR *************************/ expected_err = SA_ERR_HPI_NOT_PRESENT; err = saHpiControlGet(sessionid, id, 5000, &mode, &state); checkstatus(err, expected_err, testfail); /************************** * Test 4: NULL mode and state *************************/ expected_err = SA_OK; err = saHpiControlGet(sessionid, id, cid, NULL, NULL); checkstatus(err, expected_err, testfail); /************************** * Test: resource without SAHPI_CAPABILITY_CONTROL *************************/ err = tfind_resource(&sessionid, SAHPI_CAPABILITY_CONTROL, SAHPI_FIRST_ENTRY, &rptentry, SAHPI_FALSE); if (err != SA_OK) { printf("Error! Can not find resources for test environment\n"); printf(" File=%s, Line=%d\n", __FILE__, __LINE__); err = tcleanup(&sessionid); return SA_OK; } expected_err = SA_ERR_HPI_CAPABILITY; err = saHpiControlGet(sessionid, rptentry.ResourceId, cid, &mode, &state); checkstatus(err, expected_err, testfail); /*************************** * Cleanup after all tests ***************************/ err = tcleanup(&sessionid); return testfail; } #include openhpi-2.14.1/plugins/snmp_bc/t/tsnmp_bc_getset.c0000644000076400007640000000750011302566763017075 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * Peter D Phan */ #include #include #include int main(int argc, char **argv) { /* ************************ * Local variables * ***********************/ // gchar *BUSY_OID = ".1.3.6.1.4.1.2.3.51.2.4.4.1.7777"; int testfail = 0; SaErrorT err; SaErrorT expected_err; SaHpiRptEntryT rptentry; SaHpiSessionIdT sessionid; struct snmp_value value; struct snmp_bc_hnd custom_handle; /* ************************ * Find a resource with Control type rdr * ***********************/ err = tsetup(&sessionid); if (err != SA_OK) { printf("Error! Can not open session for test environment\n"); printf(" File=%s, Line=%d\n", __FILE__, __LINE__); return -1; } err = tfind_resource(&sessionid, SAHPI_CAPABILITY_CONTROL, SAHPI_FIRST_ENTRY, &rptentry, SAHPI_TRUE); if (err != SA_OK) { printf("Error! Can not find resources for test environment\n"); printf(" File=%s, Line=%d\n", __FILE__, __LINE__); err = tcleanup(&sessionid); return -1; } memset (&custom_handle, 0, sizeof(struct snmp_bc_hnd)); /************************** * Test 1: Test Busy Status * Under simulation it is ok for custom_handle == NULL **************************/ // expected_err = SA_ERR_HPI_BUSY; // err = snmp_bc_snmp_get(&custom_handle, BUSY_OID, &value, SAHPI_FALSE); // checkstatus(err, expected_err, testfail); /************************** * Test 2: Test Timeout Status **************************/ // custom_handle.handler_retries = SNMP_BC_MAX_SNMP_RETRY_ATTEMPTED; // expected_err = SA_ERR_HPI_NO_RESPONSE; // err = snmp_bc_snmp_get(&custom_handle, BUSY_OID, &value, SAHPI_TRUE); // checkstatus(err, expected_err, testfail); /************************** * Test 3: Valid case **************************/ expected_err = SA_OK; err = snmp_bc_snmp_get(&custom_handle, SNMP_BC_DATETIME_OID, &value, SAHPI_TRUE); checkstatus(err, expected_err, testfail); /************************** * Test 4: validate field **************************/ if (custom_handle.handler_retries != 0) { printf("Error! handler_retries does not get cleared after a successful snmp_get, Line=%d\n", __LINE__); testfail = -1; } /************************** * Test 5: Test Busy Status, snmp_set **************************/ // expected_err = SA_ERR_HPI_BUSY; // err = snmp_bc_snmp_set(&custom_handle, BUSY_OID, value); // checkstatus(err, expected_err, testfail); /************************** * Test 6: Test Timeout Status, snmp_set **************************/ // custom_handle.handler_retries = SNMP_BC_MAX_SNMP_RETRY_ATTEMPTED; // expected_err = SA_ERR_HPI_NO_RESPONSE; // err = snmp_bc_snmp_set(&custom_handle, BUSY_OID, value); // checkstatus(err, expected_err, testfail); /************************** * Test 7: Valid case **************************/ expected_err = SA_OK; err = snmp_bc_snmp_set(&custom_handle, SNMP_BC_DATETIME_OID, value); checkstatus(err, expected_err, testfail); /************************** * Test 8: validate field **************************/ if (custom_handle.handler_retries != 0) { printf("Error! handler_retries does not get cleared after a successful snmp_set, Line=%d\n", __LINE__); testfail = -1; } /*************************** * Cleanup after all tests ***************************/ err = tcleanup(&sessionid); return testfail; } #include openhpi-2.14.1/plugins/snmp_bc/t/tinv001.c0000644000076400007640000000736111302566763015123 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * Peter D Phan */ #include #include #include int main(int argc, char **argv) { /* ************************ * Local variables * ***********************/ int testfail = 0; SaErrorT err; SaErrorT expected_err; SaHpiRptEntryT rptentry; SaHpiRdrT rdr; SaHpiResourceIdT id = 0; SaHpiSessionIdT sessionid; SaHpiIdrIdT idrId = 0; SaHpiEntryIdT areaId = 0; SaHpiEntryIdT fieldId = 0; SaHpiIdrFieldT field; SaHpiEntryIdT entryid; SaHpiEntryIdT nextentryid; SaHpiBoolT foundControl; memset (&field, 0, sizeof(SaHpiIdrFieldT)); /* ************************************* * Find a resource with inventory capability * ************************************* */ err = tsetup(&sessionid); if (err != SA_OK) { printf("Error! Can not open session for test environment\n"); printf(" File=%s, Line=%d\n", __FILE__, __LINE__); return -1; } err = tfind_resource(&sessionid, SAHPI_CAPABILITY_INVENTORY_DATA, SAHPI_FIRST_ENTRY, &rptentry, SAHPI_TRUE); if (err != SA_OK) { printf("Can not find an Inventory resource for test environment\n"); printf(" File=%s, Line=%d\n", __FILE__, __LINE__); err = tcleanup(&sessionid); return SA_OK; } id = rptentry.ResourceId; /************************** * Test: find an Inventory RDR **************************/ entryid = SAHPI_FIRST_ENTRY; foundControl = SAHPI_FALSE; do { err = saHpiRdrGet(sessionid,id,entryid,&nextentryid, &rdr); if (err == SA_OK) { if (rdr.RdrType == SAHPI_INVENTORY_RDR) { foundControl = SAHPI_TRUE; break; } entryid = nextentryid; } } while ((err == SA_OK) && (entryid != SAHPI_LAST_ENTRY)) ; if (!foundControl) { err("Did not find desired resource for test\n"); return(SA_OK); } else { idrId = rdr.RdrTypeUnion.InventoryRec.IdrId; } /************************** * Test: Add to a read-only Idr Area **************************/ expected_err = SA_ERR_HPI_READ_ONLY; err = saHpiIdrAreaAdd(sessionid, id, idrId, SAHPI_IDR_AREATYPE_CHASSIS_INFO, &areaId); checkstatus(err, expected_err, testfail); /************************** * Test: Add to a read-only Idr Field * expected_err = SA_ERR_HPI_READ_ONLY; **************************/ err = saHpiIdrFieldAdd(sessionid, id, idrId, &field); checkstatus(err, expected_err, testfail); /************************** * Test: Del a read-only Idr Area * expected_err = SA_ERR_HPI_READ_ONLY; **************************/ err = saHpiIdrAreaDelete(sessionid, id, idrId, areaId); checkstatus(err, expected_err, testfail); /************************** * Test: Del a read-only Idr Field * expected_err = SA_ERR_HPI_READ_ONLY; **************************/ err = saHpiIdrFieldDelete(sessionid, id, idrId, areaId, fieldId); checkstatus(err, expected_err, testfail); /************************** * Test: Set a read-only Idr Field * expected_err = SA_ERR_HPI_READ_ONLY; **************************/ err = saHpiIdrFieldSet(sessionid, id, idrId, &field); checkstatus(err, expected_err, testfail); /**************************&* * Cleanup after all tests ***************************/ err = tcleanup(&sessionid); return testfail; } #include openhpi-2.14.1/plugins/snmp_bc/t/tel006.c0000644000076400007640000000513111302566764014726 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * Peter D Phan */ #include #include #include #include #include #include int main(int argc, char **argv) { /* ************************ * Local variables * ***********************/ int testfail = 0; SaErrorT err; SaErrorT expected_err; SaHpiEventLogEntryIdT current = 0; SaHpiEventLogEntryIdT previd; SaHpiEventLogEntryIdT nextid; SaHpiEventLogEntryT entry; SaHpiRdrT rdr; SaHpiRptEntryT rptentry; SaHpiResourceIdT id; // DECLARE_HANDLE(); SaHpiSessionIdT sessionid; SaHpiDomainIdT did; struct oh_handler *h = NULL; struct oh_domain *d = NULL; unsigned int *hid = NULL; struct oh_handler_state *handle; /* ************************************* * Find a resource with EventLog type rdr * ************************************* */ err = tsetup(&sessionid); if (err != SA_OK) { printf("Error! Can not open session for test environment\n"); printf(" File=%s, Line=%d\n", __FILE__, __LINE__); return -1; } err = tfind_resource(&sessionid, SAHPI_CAPABILITY_EVENT_LOG, SAHPI_FIRST_ENTRY, &rptentry, SAHPI_TRUE); if (err != SA_OK) { printf("Can not find a control resource for test environment\n"); printf(" File=%s, Line=%d\n", __FILE__, __LINE__); err = tcleanup(&sessionid); return SA_OK; } id = rptentry.ResourceId; INIT_HANDLE(did, d, hid, h, handle); #if 0 did = oh_get_session_domain(sessionid); d = oh_get_domain(did); hid = oh_get_resource_data(&(d->rpt), id); h = oh_get_handler(*hid); handle = (struct oh_handler_state *) h->hnd; #endif /************************** * Test: NULL EventLog cache **************************/ handle->elcache = NULL; expected_err = SA_ERR_HPI_INTERNAL_ERROR; err = snmp_bc_get_sel_entry(handle, id, current, &previd, &nextid, &entry, &rdr, &rptentry); checkstatus(err, expected_err, testfail); /*************************** * Cleanup after all tests ***************************/ err = tcleanup(&sessionid); return testfail; } #include openhpi-2.14.1/plugins/snmp_bc/t/tsensorset001.c0000644000076400007640000000464411302566763016355 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * Peter D Phan */ #include #include #include int main(int argc, char **argv) { /* ************************ * Local variables * ***********************/ int testfail = 0; SaErrorT err; SaErrorT expected_err; SaHpiRptEntryT rptentry; SaHpiResourceIdT id = 0; SaHpiSessionIdT sessionid; SaHpiSensorNumT sid = 0; SaHpiBoolT enable = SAHPI_FALSE; /* ************************************* * Find a resource with Sensor type rdr * ************************************* */ err = tsetup(&sessionid); if (err != SA_OK) { printf("Error! Can not open session for test environment\n"); printf(" File=%s, Line=%d\n", __FILE__, __LINE__); return -1; } err = tfind_resource(&sessionid,SAHPI_CAPABILITY_SENSOR,SAHPI_FIRST_ENTRY, &rptentry, SAHPI_TRUE); if (err != SA_OK) { printf("Error! Can not find resources for test environment\n"); printf(" File=%s, Line=%d\n", __FILE__, __LINE__); err = tcleanup(&sessionid); return SA_OK; } id = rptentry.ResourceId; /************************** * Test: Invalid handle **************************/ expected_err = SA_ERR_HPI_INVALID_PARAMS; err = snmp_bc_set_sensor_enable(NULL, id, sid, enable); checkstatus(err, expected_err, testfail); /************************** * Test:Invalid resoruce id **************************/ expected_err = SA_ERR_HPI_INVALID_RESOURCE; err = saHpiSensorEnableSet(sessionid, 5000, sid, enable); checkstatus(err, expected_err, testfail); /************************** * Test: invalid sensor Id **************************/ expected_err = SA_ERR_HPI_NOT_PRESENT; err = saHpiSensorEnableSet(sessionid, id, 5000, enable); checkstatus(err, expected_err, testfail); /*************************** * Cleanup after all tests ***************************/ err = tcleanup(&sessionid); return testfail; } #include openhpi-2.14.1/plugins/snmp_bc/t/tsensorget002.c0000644000076400007640000000262511302566764016340 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * Peter D Phan */ #include #include #include int main(int argc, char **argv) { /* ************************ * Local variables * ***********************/ int testfail = 0; SaErrorT err; SaErrorT expected_err; SaHpiResourceIdT id =0; SaHpiSensorNumT sid = 0; SaHpiEventStateT state; SaHpiSensorReadingT reading; struct oh_handler_state dd_hnd = { .rptcache = (RPTable *)NULL, .eventq = NULL, .config = NULL, .data = (void *)NULL }; /************************** * Test NULL cache **************************/ expected_err = SA_ERR_HPI_INVALID_PARAMS; err = snmp_bc_get_sensor_reading(&dd_hnd, id, sid, &reading, &state); checkstatus(err, expected_err, testfail); /*************************** * Cleanup after all tests ***************************/ return testfail; } #include openhpi-2.14.1/plugins/snmp_bc/t/thotswap001.c0000644000076400007640000001150311302566764016006 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004, 2006 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * Peter D Phan * Steve Sherman */ #include #include #include int main(int argc, char **argv) { int testfail = 0; SaErrorT err, expected_err; SaHpiHsIndicatorStateT hs_ind_state = SAHPI_HS_INDICATOR_OFF; SaHpiHsStateT hs_state = SAHPI_HS_STATE_INACTIVE; SaHpiHsActionT act = 0; SaHpiResourceIdT id = 0; SaHpiRptEntryT rptentry; SaHpiSessionIdT sessionid; SaHpiTimeoutT timeout = SAHPI_TIMEOUT_IMMEDIATE; /***************************************** * Find a resource with hotswap capability *****************************************/ err = tsetup(&sessionid); if (err != SA_OK) { printf("Error! Cannot open session\n"); printf(" File=%s, Line=%d\n", __FILE__, __LINE__); return -1; } err = tfind_resource(&sessionid, SAHPI_CAPABILITY_FRU, SAHPI_FIRST_ENTRY, &rptentry, SAHPI_TRUE); if (err != SA_OK) { dbg("Cannot find a hotswap resource\n"); dbg(" File=%s, Line=%d\n", __FILE__, __LINE__); err = tcleanup(&sessionid); return SA_OK; } id = rptentry.ResourceId; /****************************** * Test: Bad parameter checking ******************************/ expected_err = SA_ERR_HPI_INVALID_PARAMS; err = saHpiAutoInsertTimeoutGet(sessionid, NULL); checkstatus(err, expected_err, testfail); err = saHpiAutoInsertTimeoutSet(sessionid, -5); checkstatus(err, expected_err, testfail); err = saHpiAutoExtractTimeoutGet(sessionid, id, NULL); checkstatus(err, expected_err, testfail); err = saHpiAutoExtractTimeoutSet(sessionid, id, -5); checkstatus(err, expected_err, testfail); err = saHpiHotSwapStateGet(sessionid, id, NULL); checkstatus(err, expected_err, testfail); err = saHpiHotSwapActionRequest(sessionid, id, -1); checkstatus(err, expected_err, testfail); err = saHpiHotSwapIndicatorStateGet(sessionid, id, NULL); checkstatus(err, expected_err, testfail); err = saHpiHotSwapIndicatorStateSet(sessionid, id, -1); checkstatus(err, expected_err, testfail); /******************************* * Test: Invalid session checking *******************************/ expected_err = SA_ERR_HPI_INVALID_SESSION; err = saHpiHotSwapPolicyCancel(-1, id); checkstatus(err, expected_err, testfail); err = saHpiResourceActiveSet(-1, id); checkstatus(err, expected_err, testfail); err = saHpiResourceInactiveSet(-1, id); checkstatus(err, expected_err, testfail); err = saHpiAutoInsertTimeoutGet(-1, &timeout); checkstatus(err, expected_err, testfail); err = saHpiAutoInsertTimeoutSet(-1, timeout); checkstatus(err, expected_err, testfail); err = saHpiAutoExtractTimeoutGet(-1, id, &timeout); checkstatus(err, expected_err, testfail); err = saHpiAutoExtractTimeoutSet(-1, id, timeout); checkstatus(err, expected_err, testfail); err = saHpiHotSwapStateGet(-1, id, &hs_state); checkstatus(err, expected_err, testfail); err = saHpiHotSwapActionRequest(-1, id, act); checkstatus(err, expected_err, testfail); err = saHpiHotSwapIndicatorStateGet(-1, id, &hs_ind_state); checkstatus(err, expected_err, testfail); err = saHpiHotSwapIndicatorStateSet(-1, id, hs_ind_state); checkstatus(err, expected_err, testfail); /**************************** * Test: Invalid RID checking ****************************/ expected_err = SA_ERR_HPI_INVALID_RESOURCE; err = saHpiHotSwapPolicyCancel(sessionid, -1); checkstatus(err, expected_err, testfail); err = saHpiResourceActiveSet(sessionid, -1); checkstatus(err, expected_err, testfail); err = saHpiResourceInactiveSet(sessionid, -1); checkstatus(err, expected_err, testfail); err = saHpiAutoExtractTimeoutGet(sessionid, -1, &timeout); checkstatus(err, expected_err, testfail); err = saHpiAutoExtractTimeoutSet(sessionid, -1, timeout); checkstatus(err, expected_err, testfail); err = saHpiHotSwapStateGet(sessionid, -1, &hs_state); checkstatus(err, expected_err, testfail); err = saHpiHotSwapActionRequest(sessionid, -1, act); checkstatus(err, expected_err, testfail); err = saHpiHotSwapIndicatorStateGet(sessionid, -1, &hs_ind_state); checkstatus(err, expected_err, testfail); err = saHpiHotSwapIndicatorStateSet(sessionid, -1, hs_ind_state); checkstatus(err, expected_err, testfail); /************************* * Cleanup after all tests *************************/ err = tcleanup(&sessionid); return testfail; } #include openhpi-2.14.1/plugins/snmp_bc/t/tinv006.c0000644000076400007640000000553411302566764015131 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * Peter D Phan */ #include #include #include int main(int argc, char **argv) { /* ************************ * Local variables * ***********************/ int testfail = 0; SaErrorT err; SaErrorT expected_err; SaHpiRptEntryT rptentry; SaHpiRdrT rdr; SaHpiResourceIdT id = 0; SaHpiSessionIdT sessionid; SaHpiIdrIdT idrId = 0; SaHpiIdrInfoT info; SaHpiEntryIdT entryid; SaHpiEntryIdT nextentryid; SaHpiBoolT foundControl; /* ************************************* * Find a resource with inventory capability * ************************************* */ err = tsetup(&sessionid); if (err != SA_OK) { printf("Error! Can not open session for test environment\n"); printf(" File=%s, Line=%d\n", __FILE__, __LINE__); return -1; } err = tfind_resource(&sessionid, SAHPI_CAPABILITY_INVENTORY_DATA, SAHPI_FIRST_ENTRY, &rptentry, SAHPI_TRUE); if (err != SA_OK) { printf("Can not find an Inventory resource for test environment\n"); printf(" File=%s, Line=%d\n", __FILE__, __LINE__); err = tcleanup(&sessionid); return SA_OK; } id = rptentry.ResourceId; /************************** * Test: find an Inventory RDR **************************/ entryid = SAHPI_FIRST_ENTRY; foundControl = SAHPI_FALSE; do { err = saHpiRdrGet(sessionid,id,entryid,&nextentryid, &rdr); if (err == SA_OK) { if (rdr.RdrType == SAHPI_INVENTORY_RDR) { foundControl = SAHPI_TRUE; break; } entryid = nextentryid; } } while ((err == SA_OK) && (entryid != SAHPI_LAST_ENTRY)) ; if (!foundControl) { err("Did not find desired resource for test\n"); return(SA_OK); } else { idrId = rdr.RdrTypeUnion.InventoryRec.IdrId; } /************************** * Test : Invalid handle **************************/ expected_err = SA_ERR_HPI_INVALID_PARAMS; err = snmp_bc_get_idr_info(NULL , id, idrId, &info); checkstatus(err, expected_err, testfail); /************************** * Test : Invalid info pointer * expected_err = SA_ERR_HPI_INVALID_PARAMS; **************************/ err = saHpiIdrInfoGet(sessionid, id, idrId, NULL); checkstatus(err, expected_err, testfail); /**************************&* * Cleanup after all tests ***************************/ err = tcleanup(&sessionid); return testfail; } #include openhpi-2.14.1/plugins/snmp_bc/t/tsensorget005.c0000644000076400007640000000370111302566763016336 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * Peter D Phan */ #include #include #include int main(int argc, char **argv) { /* ************************ * Local variables * ***********************/ int testfail = 0; SaErrorT err; SaErrorT expected_err; SaHpiResourceIdT id; SaHpiSessionIdT sessionid; SaHpiRptEntryT rptentry; SaHpiSensorNumT sid = 0; SaHpiEventStateT state; SaHpiSensorReadingT reading; /* ************************************* * Find a resource with Sensor type rdr * ************************************* */ err = tsetup(&sessionid); if (err != SA_OK) { printf("Error! Can not open session for test environment\n"); printf(" File=%s, Line=%d\n", __FILE__, __LINE__); return -1; } err = tfind_resource(&sessionid, SAHPI_CAPABILITY_SENSOR,SAHPI_FIRST_ENTRY, &rptentry, SAHPI_TRUE); if (err != SA_OK) { printf("Error! Can not find resources for test environment\n"); printf(" File=%s, Line=%d\n", __FILE__, __LINE__); err = tcleanup(&sessionid); return -1; } id = rptentry.ResourceId; /************************** * Test: Invalid sensor id **************************/ sid = 5000; expected_err = SA_ERR_HPI_NOT_PRESENT; err = saHpiSensorReadingGet(sessionid, id, sid, &reading, &state); checkstatus(err, expected_err, testfail); /*************************** * Cleanup after all tests ***************************/ err = tcleanup(&sessionid); return testfail; } #include openhpi-2.14.1/plugins/snmp_bc/t/tinv003.c0000644000076400007640000000662411302566763015126 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * Peter D Phan */ #include #include #include int main(int argc, char **argv) { /* ************************ * Local variables * ***********************/ int testfail = 0; SaErrorT err; SaErrorT expected_err; SaHpiRptEntryT rptentry; SaHpiRdrT rdr; SaHpiResourceIdT id = 0; SaHpiSessionIdT sessionid; SaHpiIdrIdT idrId= 0; SaHpiEntryIdT areaId = 0; /* SaHpiIdrAreaTypeT areatype; */ SaHpiEntryIdT nextAreaId; SaHpiIdrAreaHeaderT header; SaHpiEntryIdT entryid; SaHpiEntryIdT nextentryid; SaHpiBoolT foundControl; /* ************************************* * Find a resource with inventory capability * ************************************* */ err = tsetup(&sessionid); if (err != SA_OK) { printf("Error! Can not open session for test environment\n"); printf(" File=%s, Line=%d\n", __FILE__, __LINE__); return -1; } err = tfind_resource(&sessionid, SAHPI_CAPABILITY_INVENTORY_DATA, SAHPI_FIRST_ENTRY, &rptentry, SAHPI_TRUE); if (err != SA_OK) { printf("Can not find an Inventory resource for test environment\n"); printf(" File=%s, Line=%d\n", __FILE__, __LINE__); err = tcleanup(&sessionid); return SA_OK; } id = rptentry.ResourceId; /************************** * Test: find an Inventory RDR **************************/ entryid = SAHPI_FIRST_ENTRY; foundControl = SAHPI_FALSE; do { err = saHpiRdrGet(sessionid,id,entryid,&nextentryid, &rdr); if (err == SA_OK) { if (rdr.RdrType == SAHPI_INVENTORY_RDR) { foundControl = SAHPI_TRUE; break; } entryid = nextentryid; } } while ((err == SA_OK) && (entryid != SAHPI_LAST_ENTRY)) ; if (!foundControl) { err("Did not find desired resource for test\n"); return(SA_OK); } else { idrId = rdr.RdrTypeUnion.InventoryRec.IdrId; } /************************** * Test: Invalid IdrId **************************/ expected_err = SA_ERR_HPI_NOT_PRESENT; err = saHpiIdrAreaHeaderGet(sessionid , id, 5000, SAHPI_IDR_AREATYPE_UNSPECIFIED, areaId, &nextAreaId, &header); checkstatus(err, expected_err, testfail); /************************** * Test: Invalid AreaType **************************/ expected_err = SA_OK; err = saHpiIdrAreaHeaderGet(sessionid , id, idrId, SAHPI_IDR_AREATYPE_UNSPECIFIED, areaId, &nextAreaId, &header); checkstatus(err, expected_err, testfail); /************************** * Test: Normal code path **************************/ expected_err = SA_OK; err = saHpiIdrAreaHeaderGet(sessionid , id, idrId, SAHPI_IDR_AREATYPE_UNSPECIFIED, SAHPI_FIRST_ENTRY, &nextAreaId, &header); checkstatus(err, expected_err, testfail); /**************************&* * Cleanup after all tests ***************************/ err = tcleanup(&sessionid); return testfail; } #include openhpi-2.14.1/plugins/snmp_bc/t/tsensorset018.c0000644000076400007640000000634111302566764016362 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * Peter D Phan */ #include #include #include int main(int argc, char **argv) { /* ************************ * Local variables * ***********************/ int testfail = 0; SaErrorT err; SaErrorT expected_err; SaHpiRptEntryT rptentry; SaHpiRdrT rdr; SaHpiResourceIdT id; SaHpiSessionIdT sessionid; SaHpiEntryIdT entryid; SaHpiEntryIdT nextentryid; SaHpiBoolT foundSensor; SaHpiSensorNumT sid = 0; SaHpiSensorEventMaskActionT act = SAHPI_SENS_ADD_EVENTS_TO_MASKS; SaHpiEventStateT assertMask = SAHPI_ES_UPPER_MINOR; SaHpiEventStateT deassertMask = SAHPI_ES_UPPER_CRIT; /* ************************************* * Find a resource with Sensor type rdr * ************************************* */ err = tsetup(&sessionid); if (err != SA_OK) { printf("Error! Can not open session for test environment\n"); printf(" File=%s, Line=%d\n", __FILE__, __LINE__); return -1; } err = tfind_resource(&sessionid,SAHPI_CAPABILITY_SENSOR,SAHPI_FIRST_ENTRY, &rptentry, SAHPI_TRUE); if (err != SA_OK) { printf("Error! Can not find resources for test environment\n"); printf(" File=%s, Line=%d\n", __FILE__, __LINE__); err = tcleanup(&sessionid); return SA_OK; } id = rptentry.ResourceId; /************************** * Test: find a sensor with desired property **************************/ entryid = SAHPI_FIRST_ENTRY; foundSensor = SAHPI_FALSE; do { err = saHpiRdrGet(sessionid,id,entryid,&nextentryid, &rdr); if (err == SA_OK) { if ((rdr.RdrType == SAHPI_SENSOR_RDR) && (rdr.RdrTypeUnion.SensorRec.EventCtrl == SAHPI_SEC_PER_EVENT)) { foundSensor = SAHPI_TRUE; break; } entryid = nextentryid; } } while ((err == SA_OK) && (entryid != SAHPI_LAST_ENTRY)) ; if (!foundSensor) { err("Did not find desired resource for test\n"); return(SA_OK); } else { sid = rdr.RdrTypeUnion.SensorRec.Num; } /************************** * Test **************************/ act = SAHPI_SENS_REMOVE_EVENTS_FROM_MASKS; deassertMask = SAHPI_ALL_EVENT_STATES; assertMask = SAHPI_ALL_EVENT_STATES; expected_err = SA_OK; err = saHpiSensorEventMasksSet(sessionid, id, sid, act, assertMask, deassertMask); checkstatus(err, expected_err, testfail); /************************** * Test * expected_err = SA_OK; **************************/ deassertMask = rdr.RdrTypeUnion.SensorRec.Events; err = saHpiSensorEventMasksSet(sessionid, id, sid, act, assertMask, deassertMask); checkstatus(err, expected_err, testfail); /*************************** * Cleanup after all tests ***************************/ err = tcleanup(&sessionid); return testfail; } #include openhpi-2.14.1/plugins/snmp_bc/t/tsensorget034.c0000644000076400007640000000556711302566764016355 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * Peter D Phan */ #include #include #include int main(int argc, char **argv) { /* ************************ * Local variables * ***********************/ int testfail = 0; SaErrorT err; SaErrorT expected_err; SaHpiRptEntryT rptentry; SaHpiRdrT rdr; SaHpiResourceIdT id; SaHpiSessionIdT sessionid; SaHpiSensorNumT sid = 0; SaHpiBoolT enable; SaHpiEntryIdT entryid; SaHpiEntryIdT nextentryid; SaHpiBoolT foundSensor; /* ************************************* * Find a resource with Sensor type rdr * ************************************* */ err = tsetup(&sessionid); if (err != SA_OK) { printf("Error! Can not open session for test environment\n"); printf(" File=%s, Line=%d\n", __FILE__, __LINE__); return -1; } err = tfind_resource(&sessionid,SAHPI_CAPABILITY_SENSOR,SAHPI_FIRST_ENTRY, &rptentry, SAHPI_TRUE); if (err != SA_OK) { printf("Error! Can not find resources for test environment\n"); printf(" File=%s, Line=%d\n", __FILE__, __LINE__); err = tcleanup(&sessionid); return SA_OK; } id = rptentry.ResourceId; /************************** * Test: find a sensor with desired property **************************/ entryid = SAHPI_FIRST_ENTRY; foundSensor = SAHPI_FALSE; do { err = saHpiRdrGet(sessionid,id,entryid,&nextentryid, &rdr); if (err == SA_OK) { if ((rdr.RdrType == SAHPI_SENSOR_RDR) && (rdr.RdrTypeUnion.SensorRec.DataFormat.IsSupported == SAHPI_FALSE)) { foundSensor = SAHPI_TRUE; break; } entryid = nextentryid; } } while ((err == SA_OK) && (entryid != SAHPI_LAST_ENTRY)) ; if (!foundSensor) { err("Did not find desired resource for test\n"); return(SA_OK); } else { sid = rdr.RdrTypeUnion.SensorRec.Num; } /************************** * Test:Invalid SensorId **************************/ expected_err = SA_ERR_HPI_NOT_PRESENT; err = saHpiSensorEventEnableGet(sessionid, id, 5000, &enable); checkstatus(err, expected_err, testfail); /************************** * Test: Normal Path **************************/ expected_err = SA_OK; err = saHpiSensorEventEnableGet(sessionid, id, sid, &enable); checkstatus(err, expected_err, testfail); /*************************** * Cleanup after all tests ***************************/ err = tcleanup(&sessionid); return testfail; } #include openhpi-2.14.1/plugins/snmp_bc/t/tsensorset003.c0000644000076400007640000000525611302566763016357 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * Peter D Phan */ #include #include #include int main(int argc, char **argv) { /* ************************ * Local variables * ***********************/ int testfail = 0; SaErrorT err; SaErrorT expected_err; SaHpiRptEntryT rptentry; SaHpiRdrT rdr; SaHpiResourceIdT id; SaHpiSessionIdT sessionid; SaHpiEntryIdT entryid; SaHpiEntryIdT nextentryid; SaHpiBoolT foundSensor; SaHpiSensorNumT sid = 0; SaHpiBoolT enable = SAHPI_FALSE; /* ************************************* * Find a resource with Sensor type rdr * ************************************* */ err = tsetup(&sessionid); if (err != SA_OK) { printf("Error! Can not open session for test environment\n"); printf(" File=%s, Line=%d\n", __FILE__, __LINE__); return -1; } err = tfind_resource(&sessionid,SAHPI_CAPABILITY_SENSOR,SAHPI_FIRST_ENTRY, &rptentry, SAHPI_TRUE); if (err != SA_OK) { printf("Error! Can not find resources for test environment\n"); printf(" File=%s, Line=%d\n", __FILE__, __LINE__); err = tcleanup(&sessionid); return SA_OK; } id = rptentry.ResourceId; /************************** * Test: find a sensor with desired property **************************/ entryid = SAHPI_FIRST_ENTRY; foundSensor = SAHPI_FALSE; do { err = saHpiRdrGet(sessionid,id,entryid,&nextentryid, &rdr); if (err == SA_OK) { if ((rdr.RdrType == SAHPI_SENSOR_RDR) && (rdr.RdrTypeUnion.SensorRec.EnableCtrl == SAHPI_FALSE)) { foundSensor = SAHPI_TRUE; break; } entryid = nextentryid; } } while ((err == SA_OK) && (entryid != SAHPI_LAST_ENTRY)) ; if (!foundSensor) { err("Did not find desired resource for test\n"); return(SA_OK); } else { sid = rdr.RdrTypeUnion.SensorRec.Num; } /************************** * Test: Setting a sensor with EnableCtrl == FALSE **************************/ expected_err = SA_ERR_HPI_READ_ONLY; err = saHpiSensorEnableSet(sessionid, id, sid, enable); checkstatus(err,expected_err, testfail); /*************************** * Cleanup after all tests ***************************/ err = tcleanup(&sessionid); return testfail; } #include openhpi-2.14.1/plugins/snmp_bc/t/tel003.c0000644000076400007640000000353011302566763014723 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * Peter D Phan */ #include #include #include int main(int argc, char **argv) { /* ************************ * Local variables * ***********************/ int testfail = 0; SaErrorT err; SaErrorT expected_err; SaHpiRptEntryT rptentry; SaHpiResourceIdT id = 0; SaHpiSessionIdT sessionid; /* ************************************* * Find a resource with EventLog type rdr * ************************************* */ err = tsetup(&sessionid); if (err != SA_OK) { printf("Error! Can not open session for test environment\n"); printf(" File=%s, Line=%d\n", __FILE__, __LINE__); return -1; } err = tfind_resource(&sessionid, SAHPI_CAPABILITY_EVENT_LOG, SAHPI_FIRST_ENTRY, &rptentry, SAHPI_TRUE); if (err != SA_OK) { printf("Can not find a control resource for test environment\n"); printf(" File=%s, Line=%d\n", __FILE__, __LINE__); err = tcleanup(&sessionid); return SA_OK; } id = rptentry.ResourceId; /************************** * Test 001: snmp_bc_get_sel_info() **************************/ expected_err = SA_ERR_HPI_INVALID_PARAMS; err = snmp_bc_clear_sel(NULL, id); checkstatus(err, expected_err, testfail); /*************************** * Cleanup after all tests ***************************/ err = tcleanup(&sessionid); return testfail; } #include openhpi-2.14.1/plugins/snmp_bc/t/tcontrol003.c0000644000076400007640000001027111302566764016004 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * Peter D Phan */ #include #include #include int main(int argc, char **argv) { /* ************************ * Local variables * ***********************/ int testfail = 0; SaErrorT err; SaErrorT expected_err; SaHpiResourceIdT id; SaHpiSessionIdT sessionid; SaHpiRptEntryT rptentry; SaHpiRdrT rdr; SaHpiCtrlNumT cid = 1; SaHpiCtrlModeT mode = SAHPI_CTRL_MODE_AUTO; SaHpiCtrlStateT state; SaHpiEntryIdT entryid; SaHpiEntryIdT nextentryid; SaHpiBoolT foundControl; struct oh_handler_state l_handle; /* ************************************* * Find a resource with Control type rdr * ************************************* */ err = tsetup(&sessionid); if (err != SA_OK) { printf("Error! Can not open session for test environment\n"); printf(" File=%s, Line=%d\n", __FILE__, __LINE__); return -1; } err = tfind_resource(&sessionid, SAHPI_CAPABILITY_CONTROL, SAHPI_FIRST_ENTRY, &rptentry, SAHPI_TRUE); if (err != SA_OK) { printf("Can not find a control resource for test environment\n"); printf(" File=%s, Line=%d\n", __FILE__, __LINE__); err = tcleanup(&sessionid); return SA_OK; } id = rptentry.ResourceId; /************************** * Test: find a control RDR **************************/ entryid = SAHPI_FIRST_ENTRY; foundControl = SAHPI_FALSE; do { err = saHpiRdrGet(sessionid,id,entryid,&nextentryid, &rdr); if (err == SA_OK) { if (rdr.RdrType == SAHPI_CTRL_RDR) { foundControl = SAHPI_TRUE; break; } entryid = nextentryid; } } while ((err == SA_OK) && (entryid != SAHPI_LAST_ENTRY)) ; if (!foundControl) { err("Did not find desired resource for test\n"); return(SA_OK); } else { cid = rdr.RdrTypeUnion.CtrlRec.Num; } /************************** * Test 1: Invalid Handle *************************/ memset(&l_handle, 0, sizeof(struct oh_handler_state)); expected_err = SA_ERR_HPI_INVALID_PARAMS; err = snmp_bc_set_control_state(NULL, id, cid, mode, &state); checkstatus(err, expected_err, testfail); /************************** * Test 2: Resource ID with no RPT *************************/ expected_err = SA_ERR_HPI_INVALID_RESOURCE; err = saHpiControlSet(sessionid, 5000, cid, mode, &state); checkstatus(err, expected_err, testfail); /************************** * Test 3: Control ID with no RDR *************************/ expected_err = SA_ERR_HPI_NOT_PRESENT; err = saHpiControlSet(sessionid, id, 5000, mode, &state); checkstatus(err, expected_err, testfail); /************************** * Test 4: NULL state with AUTO mode *************************/ expected_err = SA_ERR_HPI_READ_ONLY; err = saHpiControlSet(sessionid, id, cid, mode, NULL); checkstatus(err, expected_err, testfail); /************************** * Test 5: NULL state with AUTO mode *************************/ expected_err = SA_ERR_HPI_INVALID_PARAMS; err = saHpiControlSet(sessionid, id, cid, SAHPI_CTRL_MODE_MANUAL, NULL); checkstatus(err, expected_err, testfail); /************************** * Test 6: Invalid Capability *************************/ err = tfind_resource(&sessionid, SAHPI_CAPABILITY_CONTROL, SAHPI_FIRST_ENTRY, &rptentry, SAHPI_FALSE); if (err != SA_OK) { printf("Error! Can not find resources for test environment\n"); printf(" File=%s, Line=%d\n", __FILE__, __LINE__); err = tcleanup(&sessionid); return SA_OK; } expected_err = SA_ERR_HPI_CAPABILITY; err = saHpiControlSet(sessionid, rptentry.ResourceId, cid, mode, &state); checkstatus(err, expected_err, testfail); /*************************** * Cleanup after all tests ***************************/ err = tcleanup(&sessionid); return testfail; } #include openhpi-2.14.1/plugins/snmp_bc/t/sim_resources.c0000644000076400007640000131664411302566764016615 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2003, 2006 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * Steve Sherman */ /************************************************************************** * This source file defines the resource arrays declared in sim_resources.h *************************************************************************/ #include #include #include struct snmp_bc_data sim_resource_array[] = { { /* TIMEOUT * This OID is used to force a SNMP Access timeout condition. * It is used to test Device Busy/Device Not Respond */ .oid = ".1.3.6.1.4.1.2.3.51.2.4.4.1.7777", .mib = { .type = ASN_INTEGER, .value = { .integer = SNMP_FORCE_TIMEOUT, }, }, }, { /* DATETIME */ .oid = ".1.3.6.1.4.1.2.3.51.2.4.4.1.0", .mib = { .type = ASN_OCTET_STR, .value = { .string = "12/25/2003,06:30:00", }, }, }, { /* Chassis Type * * This OID is used to determine if the chassis type. Only available on * newer levels of BladeCenter code. * If integer == 97 system is a BC; if integer = 98 system in BCT */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.4.38.0", .mib = { .type = ASN_INTEGER, .value = { .integer = 98, }, }, }, { /* Chassis Subtype * * This OID is used to determine if the chassis subtype. Only available on * newer levels of BladeCenter code. * If integer == 0, its the orignal system; 2 its the H models */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.4.39.0", .mib = { .type = ASN_INTEGER, .value = { .integer = 0, }, }, }, { /* RSA Health * * This OID is used to determine if the system is a RSA or not * If integer == SA_ERR_SNMP_NOSUCHOBJECT, platform is not an RSA. * Code checks for RSA platform before it checks for BC platform * type. */ .oid = ".1.3.6.1.4.1.2.3.51.1.2.7.1.0", .mib = { .type = ASN_INTEGER, .value = { .integer = SA_ERR_SNMP_NOSUCHOBJECT, /* 255 = RSA */ }, }, }, { /* BCT System Health Status * * This OID is used to determine if the system is a BCT or not. * If integer == 255 system is a BCT; if integer = SA_ERR_SNMP_NOSUCHOBJECT * system is not a BCT; Need to coordinate with BCI Health value below. */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.9.1.0", .mib = { .type = ASN_INTEGER, .value = { .integer = SA_ERR_SNMP_NOSUCHOBJECT, /* .integer = 255, BCT */ }, }, }, { /* TimeZone - DayLight Savings Time */ .oid = ".1.3.6.1.4.1.2.3.51.2.4.4.2.0", .mib = { .type = ASN_OCTET_STR, .value = { .string = "+0:00,no", }, }, }, /* * OIDs definitions for Blade Center Chassis Topology */ { /* SNMP_BC_NOS_FP_SUPPORTED mmblade.mib - chassisNoOfFPsSupported, FanPack */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.4.18.0", .mib = { .type = ASN_INTEGER, .value = { .integer = 2, }, }, }, { /* SNMP_BC_NOS_PB_SUPPORTED mmblade.mib - chassisNoOfPBsSupported, ProcessorBlade */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.4.19.0", .mib = { .type = ASN_INTEGER, .value = { .integer = 14, }, }, }, { /* SNMP_BC_NOS_SM_SUPPORTED mmblade.mib - chassisNoOfSMsSupported, SwitchModule */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.4.20.0", .mib = { .type = ASN_INTEGER, .value = { .integer = 4, }, }, }, { /* SNMP_BC_NOS_MM_SUPPORTED mmblade.mib - chassisNoOfMMsSupported, ManagementModule */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.4.21.0", .mib = { .type = ASN_INTEGER, .value = { .integer = 2, }, }, }, { /* SNMP_BC_NOS_PM_SUPPORTED mmblade.mib - chassisNoOfPMsSupported, PowerModule */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.4.22.0", .mib = { .type = ASN_INTEGER, .value = { .integer = 4, }, }, }, { /* SNMP_BC_NOS_MT_SUPPORTED mmblade.mib - chassisNoOfMTsSupported, MediaTray */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.4.23.0", .mib = { .type = ASN_INTEGER, .value = { .integer = 1, }, }, }, { /* SNMP_BC_NOS_BLOWER_SUPPORTED mmblade.mib - chassisNoOfBlowersSupported, Blower */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.4.24.0", .mib = { .type = ASN_INTEGER, .value = { .integer = 4, }, }, }, { /* SNMP_BC_PB_INSTALLED mmblade.mib - chassisPBsInstalled, ProcessorBlade */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.4.25.0", .mib = { .type = ASN_OCTET_STR, .value = { .string = "10101010101010", }, }, }, { /* SNMP_BC_SM_INSTALLED mmblade.mib - chassisSMsInstalled, SwitchModule */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.4.29.0", .mib = { .type = ASN_OCTET_STR, .value = { .string = "1111", }, }, }, { /* SNMP_BC_MM_INSTALLED mmblade.mib - chassisMMsInstalled, ManagementModule */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.4.30.0", .mib = { .type = ASN_OCTET_STR, .value = { .string = "11", }, }, }, { /* SNMP_BC_PM_INSTALLED mmblade.mib - chassisPMsInstalled, PowerModule */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.4.31.0", .mib = { .type = ASN_OCTET_STR, .value = { .string = "1111", }, }, }, { /* SNMP_BC_MT_INSTALLED mmblade.mib - chassisMTsInstalled, MediaTray */ .oid = ",1.3.6.1.4.1.2.3.51.2.22.4.32.0", .mib = { .type = ASN_INTEGER, .value = { .integer = 1, }, }, }, { /* SNMP_BC_BLOWER_INSTALLED mmblade.mib - chassisBlowersInstalled, Blower */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.4.33.0", .mib = { .type = ASN_OCTET_STR, .value = { .string = "1111", }, }, }, { /* SNMP_BC_FP_INSTALLED mmblade.mib - chassisFPsinstalled, FanPack */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.4.37.0", .mib = { .type = ASN_OCTET_STR, .value = { .string = "11", }, }, }, /* NOTE:: Must have one plus the END of Log Entry for each event in the simulator's event log */ { /* Event Log Index Number for Event 1 */ .oid = ".1.3.6.1.4.1.2.3.51.2.3.4.2.1.1.1", .mib = { .type = ASN_INTEGER, .value = { .integer = 1, }, }, }, { /* Event Log Index Number for Event 2 */ .oid = ".1.3.6.1.4.1.2.3.51.2.3.4.2.1.1.2", .mib = { .type = ASN_INTEGER, .value = { .integer = 1, }, }, }, { /* Event Log Index Number for Event 3 */ .oid = ".1.3.6.1.4.1.2.3.51.2.3.4.2.1.1.3", .mib = { .type = ASN_INTEGER, .value = { .integer = 1, }, }, }, { /* Event Log Index Number for Event 4 */ .oid = ".1.3.6.1.4.1.2.3.51.2.3.4.2.1.1.4", .mib = { .type = ASN_INTEGER, .value = { .integer = 1, }, }, }, /* Event Log Index Number for Event 5 */ { .oid = ".1.3.6.1.4.1.2.3.51.2.3.4.2.1.1.5", .mib = { .type = ASN_INTEGER, .value = { .integer = 1, }, }, }, /* * Special End of Log Entry - Simulator ONLY * Code always reads one SNMP OID past end of log. When * snmp_get returns a negative value, the code knows its read * the entire error log. This entry allows the simulator to * force the snmp_get to return a negative value */ { .oid = ".1.3.6.1.4.1.2.3.51.2.3.4.2.1.1.6", .mib = { .type = ASN_INTEGER, .value = { .integer = SNMP_FORCE_ERROR, /* Force negative return */ }, }, }, { /* Event Log Message */ .oid = ".1.3.6.1.4.1.2.3.51.2.3.4.2.1.2.1", .mib = { .type = ASN_OCTET_STR, .value = { .string = "Severity:ERR Source:BLADE_01 Name:SN#ZJ1R6G5932JX Date:11/19/05 Time:14:13:15 Text:CPU 3 ", }, }, }, { /* Event Log Message */ .oid = ".1.3.6.1.4.1.2.3.51.2.3.4.2.1.2.2", .mib = { .type = ASN_OCTET_STR, .value = { .string = "Severity:WARN Source:BLADE_01 Name:SN#ZJ1R6G5932JX Date:11/19/05 Time:16:49:42 Text:System shutoff due to VRM 1 over voltage. Read value 247.01. Threshold value. 0.", }, }, }, { /* Event Log Message */ .oid = ".1.3.6.1.4.1.2.3.51.2.3.4.2.1.2.3", .mib = { .type = ASN_OCTET_STR, .value = { .string = "Severity:WARN Source:BLADE_01 Name:SN#ZJ1R6G5932JX Date:11/19/05 Time:16:49:42 Text:System shutoff due to VRM 1 over voltage. Read value 247.01. Threshold value. 0.", }, }, }, { /* Event Log Message */ .oid = ".1.3.6.1.4.1.2.3.51.2.3.4.2.1.2.4", .mib = { .type = ASN_OCTET_STR, .value = { .string = "Severity:WARN Source:BLADE_01 Name:SN#ZJ1R6G5932JX Date:11/19/05 Time:16:49:42 Text:System shutoff due to VRM 1 over voltage. Read value 247.01. Threshold value. 0.", }, }, }, { /* Event Log Message */ .oid = ".1.3.6.1.4.1.2.3.51.2.3.4.2.1.2.5", .mib = { .type = ASN_OCTET_STR, .value = { .string = "Severity:WARN Source:BLADE_01 Name:SN#ZJ1R6G5932JX Date:11/19/05 Time:16:49:42 Text:System shutoff due to VRM 1 over voltage. Read value 247.01. Threshold value. 0.", }, }, }, { .oid = ".1.3.6.1.4.1.2.3.51.2.3.4.2.1.2.6", .mib = { .type = ASN_INTEGER, .value = { .integer = SNMP_FORCE_ERROR, /* Force negative return */ }, }, }, #if 0 .string = "Severity:ERR Source:BLADE_02 Name:SN#ZJ1R6G5931XY Date:11/19/05 Time:17:26:32 Text:Critical Interrupt - Front panel NMI", .string = "Severity:WARN Source:BLADE_01 Name:SN#ZJ1R6G5932JX Date:11/19/05 Time:16:49:42 Text:System shutoff due to VRM 1 over voltage. Read value 247.01. Threshold value. 0.", .string = "Severity:INFO Source:SERVPROC Name:SN# Date:11/19/05 Time:15:34:05 Text:Management Module 2 was removed.", .string = "Severity:ERR Source:BLADE_01 Name:SN#ZJ1R6G5932JX Date:11/19/05 Time:14:13:15 Text:CPU 3 shut off due to over temperature ", .string = "Severity:ERR Source:SERVPROC Name:SN# Date:11/19/05 Time:12:27:43 Text:Blower 1 Fault Single blower failure", .string = "Severity:INFO Source:SERVPROC Name:SN# Date:11/19/05 Time:12:17:51 Text:Management Module 2 was removed.", .string "Severity:WARN Source:SERVPROC Name:SN# Date:11/19/05 Time:10:56:35 Text:Management Module network uplink loss.", . .string = "Severity:ERR Source:SERVPROC Name:SN# Date:11/18/05 Time:21:46:49 Text:Blower 1 Failure Single blower failure", .string = "Severity:WARN Source:BLADE_01 Name:SN#ZJ1R6G5932JX Date:11/18/05 Time:18:15:47 Text:System over temperature for CPU 4. Read value. 0. Threshold value. 0.", .string = "Severity:INFO Source:SERVPROC Name:SN# Date:11/18/05 Time:18:15:47 Text:TAM MNR alert for Event (ID = 0x0421d504) System over temperature for CPU 4.", .string = "Severity:ERR Source:BLADE_01 Name:SN#ZJ1R6G5932JX Date:11/18/05 Time:18:14:37 Text:System shutoff due to CPU 3 over temperature. Read value 247.01. Threshold value. 0.", .string = "Severity:ERR Source:SERVPROC Name:SN# Date:11/18/05 Time:17:44:41 Text:CPU 1 shut off due to over temperature ", . .string = "Severity:ERR Source:BLADE_01 Name:SN#ZJ1R6G5932JX Date:11/18/05 Time:17:15:15 Text:Planar voltage fault. Read value. 0. Threshold value. 0.", .string = "Severity:ERR Source:BLADE_01 Name:SN#ZJ1R6G5932JX Date:11/18/05 Time:16:43:46 Text:IO Board voltage fault. Read value. 0. Threshold value. 0.", .string = "Severity:WARN Source:BLADE_01 Name:SN#ZJ1R6G5932JX Date:11/18/05 Time:15:26:02 Text:System shutoff due to VRM 1 over voltage. Read value 247.01. Threshold value. 0.", .string = "Severity:ERR Source:BLADE_01 Name:SN#ZJ1R6G5932JX Date:11/17/05 Time:14:08:22 Text:BEM +1.5V Fault. Read value 247.01. Threshold value. 0.", .string = "Severity:ERR Source:BLADE_01 Name:SN#ZJ1R6G5932JX Date:11/17/05 Time:14:08:10 Text:BEM Option failure ", .string = "Severity:ERR Source:BLADE_01 Name:SN#ZJ1R6G5932JX Date:11/17/05 Time:14:08:22 Text:BEM +1.5V Fault. Read value 247.01. Threshold value. 0.", .string = "Severity:ERR Source:BLADE_01 Name:SN#ZJ1R6G5932JX Date:11/17/05 Time:14:08:10 Text:BEM Option failure ", .string = "Severity:INFO Source:SERVPROC Name:SN# Date:11/12/05 Time:21:39:10 Text:Management Module in bay 1 is Active.", .string = "Severity:ERR Source:SERVPROC Name:bct-33 Date:11/12/05 Time:21:29:08 Text:Blower 1 Fault Single blower failure", .string = "Severity:WARN Source:SERVPROC Name:SN# Date:11/13/05 Time:16:19:07 Text:Power modules are nonredundant in domain 2", .string = "Severity:ERR Source:SERVPROC Name:SN# Date:11/13/05 Time:16:19:07 Text:Power Supply 4 Removed.", #endif { /* Clear Event Log */ .oid = ".1.3.6.1.4.1.2.3.51.2.3.4.3.0", .mib = { .type = ASN_INTEGER, .value = { .integer = 1, /* write-only */ }, }, }, { /* SNMP_BC_BLADE_VECTOR */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.4.25.0", .mib = { .type = ASN_OCTET_STR, .value = { .string = "10101010101010", }, }, }, { /* SNMP_BC_FAN_VECTOR */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.4.33.0", .mib = { .type = ASN_OCTET_STR, .value = { .string = "1111", }, }, }, { /* SNMP_BC_MGMNT_VECTOR */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.4.30.0", .mib = { .type = ASN_OCTET_STR, .value = { .string = "11", }, }, }, { /* SNMP_BC_MGMNT_ACTIVE */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.4.34.0", .mib = { .type = ASN_INTEGER, .value = { .integer = 1, /* number of active MM */ }, }, }, { /* SNMP_BC_MEDIA_TRAY_EXISTS */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.4.32.0", .mib = { .type = ASN_INTEGER, .value = { .integer = 1, /* 0=no; 1=yes */ }, }, }, { /* SNMP_BC_POWER_VECTOR */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.4.31.0", .mib = { .type = ASN_OCTET_STR, .value = { .string = "1111", }, }, }, { /* SNMP_BC_SWITCH_VECTOR */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.4.29.0", .mib = { .type = ASN_OCTET_STR, .value = { .string = "1111", }, }, }, { /* Management module - Reset */ .oid = ".1.3.6.1.4.1.2.3.51.2.7.4.0", .mib = { .type = ASN_INTEGER, .value = { .integer = 1, /* 1=execute */ }, }, }, { /* Management module - Failover */ .oid = ".1.3.6.1.4.1.2.3.51.2.7.7.0", .mib = { .type = ASN_INTEGER, .value = { .integer = 0, /* 1=execute */ }, }, }, { /* Management module 1 UUID */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.21.2.1.1.6.1", .mib = { .type = ASN_OCTET_STR, .value = { .string = "0000 0000 0000 0000 0000 0000 0000 0000" }, }, }, { /* Management module 2 UUID */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.21.2.1.1.6.2", .mib = { .type = ASN_OCTET_STR, .value = { .string = "Not available" }, }, }, { /* Switch Reset - Switch 1 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.3.1.7.1.8.1", /* write-only */ .mib = { .type = ASN_INTEGER, .value = { .integer = 1, /* 1=execute */ }, }, }, { /* Switch 1 UUID */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.21.6.1.1.8.1", .mib = { .type = ASN_OCTET_STR, .value = { .string = "EC4E 1D7C 704B 11D7 B69E 0005 5D89 A738 " }, }, }, { /* Switch Reset - Switch 2 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.3.1.7.1.8.2", /* write-only */ .mib = { .type = ASN_INTEGER, .value = { .integer = 1, /* 1=execute */ }, }, }, { /* Switch 2 UUID */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.21.6.1.1.8.2", .mib = { .type = ASN_OCTET_STR, .value = { // intentional error .string = "No value available" }, }, }, { /* Switch Reset - Switch 3 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.3.1.7.1.8.3", /* write-only */ .mib = { .type = ASN_INTEGER, .value = { .integer = 1, /* 1=execute */ }, }, }, { /* Switch 3 UUID */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.21.6.1.1.8.3", .mib = { .type = ASN_OCTET_STR, .value = { .string = "21DA E982 1B9E 95B8 7821 00C0 DD01 C65A " }, }, }, { /* Switch Reset - Switch 4 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.3.1.7.1.8.4", /* write-only */ .mib = { .type = ASN_INTEGER, .value = { .integer = 1, /* 1=execute */ }, }, }, { /* Switch 4 UUID */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.21.6.1.1.8.4", .mib = { .type = ASN_OCTET_STR, .value = { // intentional error .string = " " }, }, }, { /* Switch Power State - Switch 1 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.3.1.1.1.7.1", .mib = { .type = ASN_INTEGER, .value = { .integer = 1, /* poweroff=0; poweron=1 */ }, }, }, { /* Switch Power State - Switch 2 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.3.1.1.1.7.2", .mib = { .type = ASN_INTEGER, .value = { .integer = 1, /* poweroff=0; poweron=1 */ }, }, }, { /* Switch Power State - Switch 3 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.3.1.1.1.7.3", .mib = { .type = ASN_INTEGER, .value = { .integer = 1, /* poweroff=0; poweron=1 */ }, }, }, { /* Switch Power State - Switch 4 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.3.1.1.1.7.4", .mib = { .type = ASN_INTEGER, .value = { .integer = 1, /* poweroff=0; poweron=1 */ }, }, }, { /* Blade 1 UUID */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.21.4.1.1.8.1", .mib = { .type = ASN_OCTET_STR, .value = { .string = "D63F A294 1BB4 4A12 9D42 48D0 BE6A 3A20 " }, }, }, { /* Blade 2 UUID */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.21.4.1.1.8.2", .mib = { .type = ASN_OCTET_STR, .value = { .string = "Not available" }, }, }, { /* Blade 3 UUID */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.21.4.1.1.8.3", .mib = { .type = ASN_OCTET_STR, .value = { // intentional error .string = "06DC 3B85 D61D B211 8576 8CF2 8F52 " }, }, }, { /* Blade 4 UUID */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.21.4.1.1.8.4", .mib = { .type = ASN_OCTET_STR, .value = { .string = "21DA-E8E3-8C36-22E2-92E1-00C0-DD01-C53C " }, }, }, { /* Blade 5 UUID */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.21.4.1.1.8.5", .mib = { .type = ASN_OCTET_STR, .value = { // intentional error .string = " Z4EE EE02 24B4 4A12 9B01 D094 209B 532C " }, }, }, { /* Blade 6 UUID */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.21.4.1.1.8.6", .mib = { .type = ASN_OCTET_STR, .value = { .string = "Not available" }, }, }, { /* Blade 7 UUID */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.21.4.1.1.8.7", .mib = { .type = ASN_OCTET_STR, .value = { .string = "64EE EE02 24B4 4A12 9B01 D094 209B 532C " }, }, }, { /* Blade 8 UUID */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.21.4.1.1.8.8", .mib = { .type = ASN_OCTET_STR, .value = { .string = "Not available" }, }, }, { /* Blade 9 UUID */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.21.4.1.1.8.9", .mib = { .type = ASN_OCTET_STR, .value = { .string = "Not available" }, }, }, { /* Blade 10 UUID */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.21.4.1.1.8.10", .mib = { .type = ASN_OCTET_STR, .value = { .string = "Not available" }, }, }, { /* Blade 11 UUID */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.21.4.1.1.8.11", .mib = { .type = ASN_OCTET_STR, .value = { .string = "Not available" }, }, }, { /* Blade 12 UUID */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.21.4.1.1.8.12", .mib = { .type = ASN_OCTET_STR, .value = { .string = "Not available" }, }, }, { /* Blade 13 UUID */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.21.4.1.1.8.13", .mib = { .type = ASN_OCTET_STR, .value = { .string = "Not available" }, }, }, { /* Blade 14 UUID */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.21.4.1.1.8.14", .mib = { .type = ASN_OCTET_STR, .value = { .string = "Not available" }, }, }, { /* Media Tray UUID */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.21.9.8.0", .mib = { .type = ASN_OCTET_STR, .value = { .string = "0000 0000 0000 0000 0000 0000 0000 0000 " }, }, }, { /* Power module 1 UUID */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.21.8.1.1.8.1", .mib = { .type = ASN_OCTET_STR, .value = { .string = "22C2 2ADF 51A4 11D7 004B 0090 0005 0047 " }, }, }, { /* Power module 2 UUID */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.21.8.1.1.8.2", .mib = { .type = ASN_OCTET_STR, .value = { .string = " B62965A8 6EB2 11D7 00D5 007400B00020 " }, }, }, { /* Power module 3 UUID */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.21.8.1.1.8.3", .mib = { .type = ASN_OCTET_STR, .value = { .string = "B62965A8-6EB2-11D7-00D5-007400B00020 " }, }, }, { /* Power module 4 UUID */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.21.8.1.1.8.4", .mib = { .type = ASN_OCTET_STR, .value = { .string = "3D2E 1265 6EB2 11D7 001C 007F 00C7 00A5 " }, }, }, #if 0 /* Simulator currently checks for duplicate OIDs - same as Power State */ { /* Switch Power On/Off - Switch 1 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.3.1.1.1.7.1", .mib = { .type = ASN_INTEGER, .value = { .integer = 1, /* poweroff=0; poweron=1 */ }, }, }, { /* Switch Power On/Off - Switch 2 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.3.1.1.1.7.2", .mib = { .type = ASN_INTEGER, .value = { .integer = 1, /* poweroff=0; poweron=1 */ }, }, }, { /* Switch Power On/Off - Switch 3 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.3.1.1.1.7.3", .mib = { .type = ASN_INTEGER, .value = { .integer = 1, /* poweroff=0; poweron=1 */ }, }, }, { /* Switch Power On/Off - Switch 4 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.3.1.1.1.7.4", .mib = { .type = ASN_INTEGER, .value = { .integer = 1, /* poweroff=0; poweron=1 */ }, }, }, #endif { /* BCT ONLY (BC will add on its next release) * * Blade 1 Number of reboots - bootCountPowerOnTimeBoots */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.10.1.1.3.1", .mib = { .type = ASN_INTEGER, .value = { .integer = 1, }, }, }, { /* BCT ONLY (BC will add on its next release) * * Blade 2 Number of reboots - bootCountPowerOnTimeBoots */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.10.1.1.3.2", .mib = { .type = ASN_INTEGER, .value = { .integer = 2, }, }, }, { /* BCT ONLY (BC will add on its next release) * * Blade 3 Number of reboots - bootCountPowerOnTimeBoots */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.10.1.1.3.3", .mib = { .type = ASN_INTEGER, .value = { .integer = 3, }, }, }, { /* BCT ONLY (BC will add on its next release) * * Blade 4 Number of reboots - bootCountPowerOnTimeBoots */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.10.1.1.3.4", .mib = { .type = ASN_INTEGER, .value = { .integer = 4, }, }, }, { /* BCT ONLY (BC will add on its next release) * * Blade 5 Number of reboots - bootCountPowerOnTimeBoots */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.10.1.1.3.5", .mib = { .type = ASN_INTEGER, .value = { .integer = 5, }, }, }, { /* BCT ONLY (BC will add on its next release) * * Blade 6 Number of reboots - bootCountPowerOnTimeBoots */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.10.1.1.3.6", .mib = { .type = ASN_INTEGER, .value = { .integer = 6, }, }, }, { /* BCT ONLY (BC will add on its next release) * * Blade 7 Number of reboots - bootCountPowerOnTimeBoots */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.10.1.1.3.7", .mib = { .type = ASN_INTEGER, .value = { .integer = 7, }, }, }, { /* BCT ONLY (BC will add on its next release) * * Blade 8 Number of reboots - bootCountPowerOnTimeBoots */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.10.1.1.3.8", .mib = { .type = ASN_INTEGER, .value = { .integer = 8, }, }, }, { /* BCT ONLY (BC will add on its next release) * * Blade 9 Number of reboots - bootCountPowerOnTimeBoots */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.10.1.1.3.9", .mib = { .type = ASN_INTEGER, .value = { .integer = 9, }, }, }, { /* BCT ONLY (BC will add on its next release) * * Blade 10 Number of reboots - bootCountPowerOnTimeBoots */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.10.1.1.3.10", .mib = { .type = ASN_INTEGER, .value = { .integer = 10, }, }, }, { /* BCT ONLY (BC will add on its next release) * * Blade 11 Number of reboots - bootCountPowerOnTimeBoots */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.10.1.1.3.11", .mib = { .type = ASN_INTEGER, .value = { .integer = 11, }, }, }, { /* BCT ONLY (BC will add on its next release) * * Blade 12 Number of reboots - bootCountPowerOnTimeBoots */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.10.1.1.3.12", .mib = { .type = ASN_INTEGER, .value = { .integer = 12, }, }, }, { /* BCT ONLY (BC will add on its next release) * * Blade 13 Number of reboots - bootCountPowerOnTimeBoots */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.10.1.1.3.13", .mib = { .type = ASN_INTEGER, .value = { .integer = 13, }, }, }, { /* BCT ONLY (BC will add on its next release) * * Blade 14 Number of reboots - bootCountPowerOnTimeBoots */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.10.1.1.3.14", .mib = { .type = ASN_INTEGER, .value = { .integer = 14, }, }, }, { /* Blade Health - Blade 1 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.1.1.5.1", .mib = { .type = ASN_INTEGER, .value = { .integer = 1, /* unknown=0; good=1; warning=2; bad=3 */ }, }, }, { /* Blade Health - Blade 2 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.1.1.5.2", .mib = { .type = ASN_INTEGER, .value = { .integer = 1, /* unknown=0; good=1; warning=2; bad=3 */ }, }, }, { /* Blade Health - Blade 3 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.1.1.5.3", .mib = { .type = ASN_INTEGER, .value = { .integer = 1, /* unknown=0; good=1; warning=2; bad=3 */ }, }, }, { /* Blade Health - Blade 4 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.1.1.5.4", .mib = { .type = ASN_INTEGER, .value = { .integer = 1, /* unknown=0; good=1; warning=2; bad=3 */ }, }, }, { /* Blade Health - Blade 5 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.1.1.5.5", .mib = { .type = ASN_INTEGER, .value = { .integer = 1, /* unknown=0; good=1; warning=2; bad=3 */ }, }, }, { /* Blade Health - Blade 6 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.1.1.5.6", .mib = { .type = ASN_INTEGER, .value = { .integer = 1, /* unknown=0; good=1; warning=2; bad=3 */ }, }, }, { /* Blade Health - Blade 7 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.1.1.5.7", .mib = { .type = ASN_INTEGER, .value = { .integer = 1, /* unknown=0; good=1; warning=2; bad=3 */ }, }, }, { /* Blade Health - Blade 8 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.1.1.5.8", .mib = { .type = ASN_INTEGER, .value = { .integer = 1, /* unknown=0; good=1; warning=2; bad=3 */ }, }, }, { /* Blade Health - Blade 9 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.1.1.5.9", .mib = { .type = ASN_INTEGER, .value = { .integer = 1, /* unknown=0; good=1; warning=2; bad=3 */ }, }, }, { /* Blade Health - Blade 10 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.1.1.5.10", .mib = { .type = ASN_INTEGER, .value = { .integer = 1, /* unknown=0; good=1; warning=2; bad=3 */ }, }, }, { /* Blade Health - Blade 11 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.1.1.5.11", .mib = { .type = ASN_INTEGER, .value = { .integer = 1, /* unknown=0; good=1; warning=2; bad=3 */ }, }, }, { /* Blade Health - Blade 12 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.1.1.5.12", .mib = { .type = ASN_INTEGER, .value = { .integer = 1, /* unknown=0; good=1; warning=2; bad=3 */ }, }, }, { /* Blade Health - Blade 13 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.1.1.5.13", .mib = { .type = ASN_INTEGER, .value = { .integer = 1, /* unknown=0; good=1; warning=2; bad=3 */ }, }, }, { /* Blade Health - Blade 14 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.1.1.5.14", .mib = { .type = ASN_INTEGER, .value = { .integer = 1, /* unknown=0; good=1; warning=2; bad=3 */ }, }, }, { /* Blade Restart - Blade 1 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.6.1.1.8.1", /* write-only */ .mib = { .type = ASN_INTEGER, .value = { .integer = 1, /* execute=1 */ }, }, }, { /* Blade Restart - Blade 2 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.6.1.1.8.2", /* write-only */ .mib = { .type = ASN_INTEGER, .value = { .integer = 1, /* execute=1 */ }, }, }, { /* Blade Restart - Blade 3 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.6.1.1.8.3", /* write-only */ .mib = { .type = ASN_INTEGER, .value = { .integer = 1, /* execute=1 */ }, }, }, { /* Blade Restart - Blade 4 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.6.1.1.8.4", /* write-only */ .mib = { .type = ASN_INTEGER, .value = { .integer = 1, /* execute=1 */ }, }, }, { /* Blade Restart - Blade 5 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.6.1.1.8.5", /* write-only */ .mib = { .type = ASN_INTEGER, .value = { .integer = 1, /* execute=1 */ }, }, }, { /* Blade Restart - Blade 6 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.6.1.1.8.6", /* write-only */ .mib = { .type = ASN_INTEGER, .value = { .integer = 1, /* execute=1 */ }, }, }, { /* Blade Restart - Blade 7 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.6.1.1.8.7", /* write-only */ .mib = { .type = ASN_INTEGER, .value = { .integer = 1, /* execute=1 */ }, }, }, { /* Blade Restart - Blade 8 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.6.1.1.8.8", /* write-only */ .mib = { .type = ASN_INTEGER, .value = { .integer = 1, /* execute=1 */ }, }, }, { /* Blade Restart - Blade 9 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.6.1.1.8.9", /* write-only */ .mib = { .type = ASN_INTEGER, .value = { .integer = 1, /* execute=1 */ }, }, }, { /* Blade Restart - Blade 10 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.6.1.1.8.10", /* write-only */ .mib = { .type = ASN_INTEGER, .value = { .integer = 1, /* execute=1 */ }, }, }, { /* Blade Restart - Blade 11 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.6.1.1.8.11", /* write-only */ .mib = { .type = ASN_INTEGER, .value = { .integer = 1, /* execute=1 */ }, }, }, { /* Blade Restart - Blade 12 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.6.1.1.8.12", /* write-only */ .mib = { .type = ASN_INTEGER, .value = { .integer = 1, /* execute=1 */ }, }, }, { /* Blade Restart - Blade 13 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.6.1.1.8.13", /* write-only */ .mib = { .type = ASN_INTEGER, .value = { .integer = 1, /* execute=1 */ }, }, }, { /* Blade Restart - Blade 14 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.6.1.1.8.14", /* write-only */ .mib = { .type = ASN_INTEGER, .value = { .integer = 1, /* execute=1 */ }, }, }, { /* Blade Power State - Blade 1 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.6.1.1.4.1", .mib = { .type = ASN_INTEGER, .value = { .integer = 1, /* off=0; on=1 */ }, }, }, { /* Blade Power State - Blade 2 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.6.1.1.4.2", .mib = { .type = ASN_INTEGER, .value = { .integer = 1, /* off=0; on=1 */ }, }, }, { /* Blade Power State - Blade 3 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.6.1.1.4.3", .mib = { .type = ASN_INTEGER, .value = { .integer = 1, /* off=0; on=1 */ }, }, }, { /* Blade Power State - Blade 4 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.6.1.1.4.4", .mib = { .type = ASN_INTEGER, .value = { .integer = 1, /* off=0; on=1 */ }, }, }, { /* Blade Power State - Blade 5 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.6.1.1.4.5", .mib = { .type = ASN_INTEGER, .value = { .integer = 1, /* off=0; on=1 */ }, }, }, { /* Blade Power State - Blade 6 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.6.1.1.4.6", .mib = { .type = ASN_INTEGER, .value = { .integer = 1, /* off=0; on=1 */ }, }, }, { /* Blade Power State - Blade 7 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.6.1.1.4.7", .mib = { .type = ASN_INTEGER, .value = { .integer = 1, /* off=0; on=1 */ }, }, }, { /* Blade Power State - Blade 8 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.6.1.1.4.8", .mib = { .type = ASN_INTEGER, .value = { .integer = 1, /* off=0; on=1 */ }, }, }, { /* Blade Power State - Blade 9 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.6.1.1.4.9", .mib = { .type = ASN_INTEGER, .value = { .integer = 1, /* off=0; on=1 */ }, }, }, { /* Blade Power State - Blade 10 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.6.1.1.4.10", .mib = { .type = ASN_INTEGER, .value = { .integer = 1, /* off=0; on=1 */ }, }, }, { /* Blade Power State - Blade 11 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.6.1.1.4.11", .mib = { .type = ASN_INTEGER, .value = { .integer = 1, /* off=0; on=1 */ }, }, }, { /* Blade Power State - Blade 12 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.6.1.1.4.12", .mib = { .type = ASN_INTEGER, .value = { .integer = 1, /* off=0; on=1 */ }, }, }, { /* Blade Power State - Blade 13 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.6.1.1.4.13", .mib = { .type = ASN_INTEGER, .value = { .integer = 1, /* off=0; on=1 */ }, }, }, { /* Blade Power State - Blade 14 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.6.1.1.4.14", .mib = { .type = ASN_INTEGER, .value = { .integer = 1, /* off=0; on=1 */ }, }, }, { /* Blade Power On/Off - Blade 1 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.6.1.1.7.1", /* write-only */ .mib = { .type = ASN_INTEGER, .value = { .integer = 1, /* off=0; on=1 */ }, }, }, { /* Blade Power On/Off - Blade 2 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.6.1.1.7.2", /* write-only */ .mib = { .type = ASN_INTEGER, .value = { .integer = 1, /* off=0; on=1 */ }, }, }, { /* Blade Power On/Off - Blade 3 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.6.1.1.7.3", /* write-only */ .mib = { .type = ASN_INTEGER, .value = { .integer = 1, /* off=0; on=1 */ }, }, }, { /* Blade Power On/Off - Blade 4 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.6.1.1.7.4", /* write-only */ .mib = { .type = ASN_INTEGER, .value = { .integer = 1, /* off=0; on=1 */ }, }, }, { /* Blade Power On/Off - Blade 5 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.6.1.1.7.5", /* write-only */ .mib = { .type = ASN_INTEGER, .value = { .integer = 1, /* off=0; on=1 */ }, }, }, { /* Blade Power On/Off - Blade 6 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.6.1.1.7.6", /* write-only */ .mib = { .type = ASN_INTEGER, .value = { .integer = 1, /* off=0; on=1 */ }, }, }, { /* Blade Power On/Off - Blade 7 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.6.1.1.7.7", /* write-only */ .mib = { .type = ASN_INTEGER, .value = { .integer = 1, /* off=0; on=1 */ }, }, }, { /* Blade Power On/Off - Blade 8 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.6.1.1.7.8", /* write-only */ .mib = { .type = ASN_INTEGER, .value = { .integer = 1, /* off=0; on=1 */ }, }, }, { /* Blade Power On/Off - Blade 9 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.6.1.1.7.9", /* write-only */ .mib = { .type = ASN_INTEGER, .value = { .integer = 1, /* off=0; on=1 */ }, }, }, { /* Blade Power On/Off - Blade 10 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.6.1.1.7.10", /* write-only */ .mib = { .type = ASN_INTEGER, .value = { .integer = 1, /* off=0; on=1 */ }, }, }, { /* Blade Power On/Off - Blade 11 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.6.1.1.7.11", /* write-only */ .mib = { .type = ASN_INTEGER, .value = { .integer = 1, /* off=0; on=1 */ }, }, }, { /* Blade Power On/Off - Blade 12 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.6.1.1.7.12", /* write-only */ .mib = { .type = ASN_INTEGER, .value = { .integer = 1, /* off=0; on=1 */ }, }, }, { /* Blade Power On/Off - Blade 13 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.6.1.1.7.13", /* write-only */ .mib = { .type = ASN_INTEGER, .value = { .integer = 1, /* off=0; on=1 */ }, }, }, { /* Blade Power On/Off - Blade 14 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.6.1.1.7.14", /* write-only */ .mib = { .type = ASN_INTEGER, .value = { .integer = 1, /* off=0; on=1 */ }, }, }, { /* Front Panel LED - System Error */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.8.1.1.0", .mib = { .type = ASN_INTEGER, .value = { .integer = 0, /* off=0; on=1 */ }, }, }, { /* Front Panel LED - Temperature */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.8.1.3.0", .mib = { .type = ASN_INTEGER, .value = { .integer = 0, /* off=0; on=1 */ }, }, }, { /* Ambient temperature */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.1.5.1.0", .mib = { .type = ASN_OCTET_STR, .value = { .string = " 50.00 Centigrade", }, }, }, { /* Management module temperature */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.1.1.2.0", .mib = { .type = ASN_OCTET_STR, .value = { .string = " 50.00 Centigrade", }, }, }, { /* Chassis Plus 1.8 Volt */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.2.1.8.0", .mib = { .type = ASN_OCTET_STR, .value = { .string = "+ 1.80 Volts", }, }, }, { /* Chassis Plus 1.8 Volt - Low Major */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.20.2.1.1.10.6", .mib = { .type = ASN_OCTET_STR, .value = { .string = "+ 1.62 Volts", }, }, }, { /* Chassis Plus 1.8 Volt - Up Major */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.20.2.1.1.6.6", .mib = { .type = ASN_OCTET_STR, .value = { .string = "+ 1.89 Volts", }, }, }, { /* Chassis Plus 1.8 Volt - Low Hysteresis */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.20.2.1.1.11.6", .mib = { .type = ASN_OCTET_STR, .value = { .string = "+ 1.74 Volts", }, }, }, { /* Chassis Plus 1.8 Volt - Up Hysteresis */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.20.2.1.1.7.6", .mib = { .type = ASN_OCTET_STR, .value = { .string = "+ 1.86 Volts", }, }, }, { /* Chassis Plus 2.5 Volt */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.2.1.6.0", .mib = { .type = ASN_OCTET_STR, .value = { .string = "+ 2.50 Volts", }, }, }, { /* Chassis Plus 2.5 Volt - Low Major */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.20.2.1.1.10.5", .mib = { .type = ASN_OCTET_STR, .value = { .string = "+ 2.25 Volts", }, }, }, { /* Chassis Plus 2.5 Volt - Up Major */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.20.2.1.1.6.5", .mib = { .type = ASN_OCTET_STR, .value = { .string = "+ 2.63 Volts", }, }, }, { /* Chassis Plus 2.5 Volt - Low Hysteresis */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.20.2.1.1.11.5", .mib = { .type = ASN_OCTET_STR, .value = { .string = "+ 2.42 Volts", }, }, }, { /* Chassis Plus 2.5 Volt - Up Hysteresis */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.20.2.1.1.7.5", .mib = { .type = ASN_OCTET_STR, .value = { .string = "+ 2.58 Volts", }, }, }, { /* Chassis Plus 3.3 Volt */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.2.1.2.0", .mib = { .type = ASN_OCTET_STR, .value = { .string = "+ 3.30 Volts", }, }, }, { /* Chassis Plus 3.3 Volt - Low Major */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.20.2.1.1.10.2", .mib = { .type = ASN_OCTET_STR, .value = { .string = "+ 3.00 Volts", }, }, }, { /* Chassis Plus 3.3 Volt - Up Major */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.20.2.1.1.6.2", .mib = { .type = ASN_OCTET_STR, .value = { .string = "+ 3.47 Volts", }, }, }, { /* Chassis Plus 3.3 Volt - Low Hysteresis */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.20.2.1.1.11.2", .mib = { .type = ASN_OCTET_STR, .value = { .string = "+ 3.20 Volts", }, }, }, { /* Chassis Plus 3.3 Volt - Up Hysteresis */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.20.2.1.1.7.2", .mib = { .type = ASN_OCTET_STR, .value = { .string = "+ 3.40 Volts", }, }, }, { /* Chassis Plus 5 Volt */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.2.1.1.0", .mib = { .type = ASN_OCTET_STR, .value = { .string = "+ 5.00 Volts", }, }, }, { /* Chassis Plus 5 Volt - Low Major */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.20.2.1.1.10.1", .mib = { .type = ASN_OCTET_STR, .value = { .string = "+ 4.50 Volts", }, }, }, { /* Chassis Plus 5 Volt - Up Major */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.20.2.1.1.6.1", .mib = { .type = ASN_OCTET_STR, .value = { .string = "+ 5.25 Volts", }, }, }, { /* Chassis Plus 5 Volt - Low Hysteresis */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.20.2.1.1.11.1", .mib = { .type = ASN_OCTET_STR, .value = { .string = "+ 4.85 Volts", }, }, }, { /* Chassis Plus 5 Volt - Up Hysteresis */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.20.2.1.1.7.1", .mib = { .type = ASN_OCTET_STR, .value = { .string = "+ 5.15 Volts", }, }, }, { /* Chassis Negative 5 Volt */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.2.1.5.0", .mib = { .type = ASN_OCTET_STR, .value = { .string = "- 5.00 Volts", }, }, }, { /* Chassis Negative 5 Volt - Low Major */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.20.2.1.1.10.4", .mib = { .type = ASN_OCTET_STR, .value = { .string = "- 5.50 Volts", }, }, }, { /* Chassis Negative 5 Volt - Up Major */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.20.2.1.1.6.4", .mib = { .type = ASN_OCTET_STR, .value = { .string = "- 4.75 Volts", }, }, }, { /* Chassis Negative 5 Volt - Low Hysteresis */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.20.2.1.1.11.4", .mib = { .type = ASN_OCTET_STR, .value = { .string = "- 5.15 Volts", }, }, }, { /* Chassis Negitive 5 Volt - Up Hysteresis */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.20.2.1.1.7.4", .mib = { .type = ASN_OCTET_STR, .value = { .string = "- 4.85 Volts", }, }, }, { /* Chassis Plus 12 Volt */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.2.1.3.0", .mib = { .type = ASN_OCTET_STR, .value = { .string = "+12.00 Volts", }, }, }, { /* Chassis Plus 12 Volt - Low Major */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.20.2.1.1.10.3", .mib = { .type = ASN_OCTET_STR, .value = { .string = "+10.80 Volts", }, }, }, { /* Chassis Plus 12 Volt - Up Major */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.20.2.1.1.6.3", .mib = { .type = ASN_OCTET_STR, .value = { .string = "+12.60 Volts", }, }, }, { /* Chassis Plus 12 Volt - Low Hysteresis */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.20.2.1.1.11.3", .mib = { .type = ASN_OCTET_STR, .value = { .string = "+11.64 Volts", }, }, }, { /* Chassis Plus 12 Volt - Up Hysteresis */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.20.2.1.1.7.3", .mib = { .type = ASN_OCTET_STR, .value = { .string = "+12.36 Volts", }, }, }, { /* Chassis Health */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.7.1.0", .mib = { .type = ASN_INTEGER, .value = { .integer = 255, /* critical=0; nonCritical=2; systemLevel=4; normal=255 */ }, }, }, { /* Chassis UUID */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.21.1.1.4.0", .mib = { .type = ASN_OCTET_STR, .value = { .string = "F161 42C1 6593 11D7 8D0E F738 156C AAAC " }, }, }, { /* Blade Error LED - Blade 1 */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.8.2.1.1.7.1", .mib = { .type = ASN_INTEGER, .value = { .integer = 0, /* off=0; on=1 */ }, }, }, { /* Blade Error LED - Blade 2 */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.8.2.1.1.7.2", .mib = { .type = ASN_INTEGER, .value = { .integer = 0, /* off=0; on=1 */ }, }, }, { /* Blade Error LED - Blade 3 */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.8.2.1.1.7.3", .mib = { .type = ASN_INTEGER, .value = { .integer = 0, /* off=0; on=1 */ }, }, }, { /* Blade Error LED - Blade 4 */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.8.2.1.1.7.4", .mib = { .type = ASN_INTEGER, .value = { .integer = 0, /* off=0; on=1 */ }, }, }, { /* Blade Error LED - Blade 5 */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.8.2.1.1.7.5", .mib = { .type = ASN_INTEGER, .value = { .integer = 0, /* off=0; on=1 */ }, }, }, { /* Blade Error LED - Blade 6 */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.8.2.1.1.7.6", .mib = { .type = ASN_INTEGER, .value = { .integer = 0, /* off=0; on=1 */ }, }, }, { /* Blade Error LED - Blade 7 */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.8.2.1.1.7.7", .mib = { .type = ASN_INTEGER, .value = { .integer = 0, /* off=0; on=1 */ }, }, }, { /* Blade Error LED - Blade 8 */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.8.2.1.1.7.8", .mib = { .type = ASN_INTEGER, .value = { .integer = 0, /* off=0; on=1 */ }, }, }, { /* Blade Error LED - Blade 9 */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.8.2.1.1.7.9", .mib = { .type = ASN_INTEGER, .value = { .integer = 0, /* off=0; on=1 */ }, }, }, { /* Blade Error LED - Blade 10 */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.8.2.1.1.7.10", .mib = { .type = ASN_INTEGER, .value = { .integer = 0, /* off=0; on=1 */ }, }, }, { /* Blade Error LED - Blade 11 */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.8.2.1.1.7.11", .mib = { .type = ASN_INTEGER, .value = { .integer = 0, /* off=0; on=1 */ }, }, }, { /* Blade Error LED - Blade 12 */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.8.2.1.1.7.12", .mib = { .type = ASN_INTEGER, .value = { .integer = 0, /* off=0; on=1 */ }, }, }, { /* Blade Error LED - Blade 13 */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.8.2.1.1.7.13", .mib = { .type = ASN_INTEGER, .value = { .integer = 0, /* off=0; on=1 */ }, }, }, { /* Blade Error LED - Blade 14 */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.8.2.1.1.7.14", .mib = { .type = ASN_INTEGER, .value = { .integer = 0, /* off=0; on=1 */ }, }, }, { /* Blade KVM Usage LED - Blade 1 */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.8.2.1.1.9.1", .mib = { .type = ASN_INTEGER, .value = { .integer = 0, /* off=0; on=1; blinking=2 */ }, }, }, { /* Blade KVM Usage LED - Blade 2 */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.8.2.1.1.9.2", .mib = { .type = ASN_INTEGER, .value = { .integer = 0, /* off=0; on=1; blinking=2 */ }, }, }, { /* Blade KVM Usage LED - Blade 3 */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.8.2.1.1.9.3", .mib = { .type = ASN_INTEGER, .value = { .integer = 0, /* off=0; on=1; blinking=2 */ }, }, }, { /* Blade KVM Usage LED - Blade 4 */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.8.2.1.1.9.4", .mib = { .type = ASN_INTEGER, .value = { .integer = 0, /* off=0; on=1; blinking=2 */ }, }, }, { /* Blade KVM Usage LED - Blade 5 */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.8.2.1.1.9.5", .mib = { .type = ASN_INTEGER, .value = { .integer = 0, /* off=0; on=1; blinking=2 */ }, }, }, { /* Blade KVM Usage LED - Blade 6 */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.8.2.1.1.9.6", .mib = { .type = ASN_INTEGER, .value = { .integer = 0, /* off=0; on=1; blinking=2 */ }, }, }, { /* Blade KVM Usage LED - Blade 7 */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.8.2.1.1.9.7", .mib = { .type = ASN_INTEGER, .value = { .integer = 0, /* off=0; on=1; blinking=2 */ }, }, }, { /* Blade KVM Usage LED - Blade 8 */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.8.2.1.1.9.8", .mib = { .type = ASN_INTEGER, .value = { .integer = 0, /* off=0; on=1; blinking=2 */ }, }, }, { /* Blade KVM Usage LED - Blade 9 */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.8.2.1.1.9.9", .mib = { .type = ASN_INTEGER, .value = { .integer = 0, /* off=0; on=1; blinking=2 */ }, }, }, { /* Blade KVM Usage LED - Blade 10 */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.8.2.1.1.9.10", .mib = { .type = ASN_INTEGER, .value = { .integer = 0, /* off=0; on=1; blinking=2 */ }, }, }, { /* Blade KVM Usage LED - Blade 11 */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.8.2.1.1.9.11", .mib = { .type = ASN_INTEGER, .value = { .integer = 0, /* off=0; on=1; blinking=2 */ }, }, }, { /* Blade KVM Usage LED - Blade 12 */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.8.2.1.1.9.12", .mib = { .type = ASN_INTEGER, .value = { .integer = 0, /* off=0; on=1; blinking=2 */ }, }, }, { /* Blade KVM Usage LED - Blade 13 */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.8.2.1.1.9.13", .mib = { .type = ASN_INTEGER, .value = { .integer = 0, /* off=0; on=1; blinking=2 */ }, }, }, { /* Blade KVM Usage LED - Blade 14 */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.8.2.1.1.9.14", .mib = { .type = ASN_INTEGER, .value = { .integer = 0, /* off=0; on=1; blinking=2 */ }, }, }, { /* Blade Media Tray Usage - Blade 1 */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.8.2.1.1.10.1", .mib = { .type = ASN_INTEGER, .value = { .integer = 0, /* off=0; on=1; blinking=2 */ }, }, }, { /* Blade Media Tray Usage - Blade 2 */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.8.2.1.1.10.2", .mib = { .type = ASN_INTEGER, .value = { .integer = 0, /* off=0; on=1; blinking=2 */ }, }, }, { /* Blade Media Tray Usage - Blade 3 */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.8.2.1.1.10.3", .mib = { .type = ASN_INTEGER, .value = { .integer = 0, /* off=0; on=1; blinking=2 */ }, }, }, { /* Blade Media Tray Usage - Blade 4 */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.8.2.1.1.10.4", .mib = { .type = ASN_INTEGER, .value = { .integer = 0, /* off=0; on=1; blinking=2 */ }, }, }, { /* Blade Media Tray Usage - Blade 5 */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.8.2.1.1.10.5", .mib = { .type = ASN_INTEGER, .value = { .integer = 0, /* off=0; on=1; blinking=2 */ }, }, }, { /* Blade Media Tray Usage - Blade 6 */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.8.2.1.1.10.6", .mib = { .type = ASN_INTEGER, .value = { .integer = 0, /* off=0; on=1; blinking=2 */ }, }, }, { /* Blade Media Tray Usage - Blade 7 */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.8.2.1.1.10.7", .mib = { .type = ASN_INTEGER, .value = { .integer = 0, /* off=0; on=1; blinking=2 */ }, }, }, { /* Blade Media Tray Usage - Blade 8 */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.8.2.1.1.10.8", .mib = { .type = ASN_INTEGER, .value = { .integer = 0, /* off=0; on=1; blinking=2 */ }, }, }, { /* Blade Media Tray Usage - Blade 9 */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.8.2.1.1.10.9", .mib = { .type = ASN_INTEGER, .value = { .integer = 0, /* off=0; on=1; blinking=2 */ }, }, }, { /* Blade Media Tray Usage - Blade 10 */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.8.2.1.1.10.10", .mib = { .type = ASN_INTEGER, .value = { .integer = 0, /* off=0; on=1; blinking=2 */ }, }, }, { /* Blade Media Tray Usage - Blade 11 */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.8.2.1.1.10.11", .mib = { .type = ASN_INTEGER, .value = { .integer = 0, /* off=0; on=1; blinking=2 */ }, }, }, { /* Blade Media Tray Usage - Blade 12 */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.8.2.1.1.10.12", .mib = { .type = ASN_INTEGER, .value = { .integer = 0, /* off=0; on=1; blinking=2 */ }, }, }, { /* Blade Media Tray Usage - Blade 13 */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.8.2.1.1.10.13", .mib = { .type = ASN_INTEGER, .value = { .integer = 0, /* off=0; on=1; blinking=2 */ }, }, }, { /* Blade Media Tray Usage - Blade 14 */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.8.2.1.1.10.14", .mib = { .type = ASN_INTEGER, .value = { .integer = 0, /* off=0; on=1; blinking=2 */ }, }, }, { /* Blade CPU 1 temperature - Blade 1 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.3.1.6.1", .mib = { .type = ASN_OCTET_STR, .value = { .string = " 50.00 Centigrade", }, }, }, { /* Blade CPU 1 temperature - Blade 2 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.3.1.6.2", .mib = { .type = ASN_OCTET_STR, .value = { .string = " 50.00 Centigrade", }, }, }, { /* Blade CPU 1 temperature - Blade 3 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.3.1.6.3", .mib = { .type = ASN_OCTET_STR, .value = { .string = " 50.00 Centigrade", }, }, }, { /* Blade CPU 1 temperature - Blade 4 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.3.1.6.4", .mib = { .type = ASN_OCTET_STR, .value = { .string = " 50.00 Centigrade", }, }, }, { /* Blade CPU 1 temperature - Blade 5 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.3.1.6.5", .mib = { .type = ASN_OCTET_STR, .value = { .string = " 50.00 Centigrade", }, }, }, { /* Blade CPU 1 temperature - Blade 6 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.3.1.6.6", .mib = { .type = ASN_OCTET_STR, .value = { .string = " 50.00 Centigrade", }, }, }, { /* Blade CPU 1 temperature - Blade 7 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.3.1.6.7", .mib = { .type = ASN_OCTET_STR, .value = { .string = " 50.00 Centigrade", }, }, }, { /* Blade CPU 1 temperature - Blade 8 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.3.1.6.8", .mib = { .type = ASN_OCTET_STR, .value = { .string = " 50.00 Centigrade", }, }, }, { /* Blade CPU 1 temperature - Blade 9 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.3.1.6.9", .mib = { .type = ASN_OCTET_STR, .value = { .string = " 50.00 Centigrade", }, }, }, { /* Blade CPU 1 temperature - Blade 10 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.3.1.6.10", .mib = { .type = ASN_OCTET_STR, .value = { .string = " 50.00 Centigrade", }, }, }, { /* Blade CPU 1 temperature - Blade 11 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.3.1.6.11", .mib = { .type = ASN_OCTET_STR, .value = { .string = " 50.00 Centigrade", }, }, }, { /* Blade CPU 1 temperature - Blade 12 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.3.1.6.12", .mib = { .type = ASN_OCTET_STR, .value = { .string = " 50.00 Centigrade", }, }, }, { /* Blade CPU 1 temperature - Blade 13 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.3.1.6.13", .mib = { .type = ASN_OCTET_STR, .value = { .string = " 50.00 Centigrade", }, }, }, { /* Blade CPU 1 temperature - Blade 14 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.3.1.6.14", .mib = { .type = ASN_OCTET_STR, .value = { .string = " 50.00 Centigrade", }, }, }, { /* Blade CPU 1 Up Critical temperature - Blade 1 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.6.1", .mib = { .type = ASN_OCTET_STR, .value = { .string = " 95.00 Centigrade", }, }, }, { /* Blade CPU 1 Up Critical temperature - Blade 2 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.6.2", .mib = { .type = ASN_OCTET_STR, .value = { .string = " 95.00 Centigrade", }, }, }, { /* Blade CPU 1 Up Critical temperature - Blade 3 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.6.3", .mib = { .type = ASN_OCTET_STR, .value = { .string = " 95.00 Centigrade", }, }, }, { /* Blade CPU 1 Up Critical temperature - Blade 4 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.6.4", .mib = { .type = ASN_OCTET_STR, .value = { .string = " 95.00 Centigrade", }, }, }, { /* Blade CPU 1 Up Critical temperature - Blade 5 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.6.5", .mib = { .type = ASN_OCTET_STR, .value = { .string = " 95.00 Centigrade", }, }, }, { /* Blade CPU 1 Up Critical temperature - Blade 6 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.6.6", .mib = { .type = ASN_OCTET_STR, .value = { .string = " 95.00 Centigrade", }, }, }, { /* Blade CPU 1 Up Critical temperature - Blade 7 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.6.7", .mib = { .type = ASN_OCTET_STR, .value = { .string = " 95.00 Centigrade", }, }, }, { /* Blade CPU 1 Up Critical temperature - Blade 8 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.6.8", .mib = { .type = ASN_OCTET_STR, .value = { .string = " 95.00 Centigrade", }, }, }, { /* Blade CPU 1 Up Critical temperature - Blade 9 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.6.9", .mib = { .type = ASN_OCTET_STR, .value = { .string = " 95.00 Centigrade", }, }, }, { /* Blade CPU 1 Up Critical temperature - Blade 10 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.6.10", .mib = { .type = ASN_OCTET_STR, .value = { .string = " 95.00 Centigrade", }, }, }, { /* Blade CPU 1 Up Critical temperature - Blade 11 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.6.11", .mib = { .type = ASN_OCTET_STR, .value = { .string = " 95.00 Centigrade", }, }, }, { /* Blade CPU 1 Up Critical temperature - Blade 12 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.6.12", .mib = { .type = ASN_OCTET_STR, .value = { .string = " 95.00 Centigrade", }, }, }, { /* Blade CPU 1 Up Critical temperature - Blade 13 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.6.13", .mib = { .type = ASN_OCTET_STR, .value = { .string = " 95.00 Centigrade", }, }, }, { /* Blade CPU 1 Up Critical temperature - Blade 14 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.6.14", .mib = { .type = ASN_OCTET_STR, .value = { .string = " 95.00 Centigrade", }, }, }, { /* Blade CPU 1 Up Major temperature - Blade 1 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.7.1", .mib = { .type = ASN_OCTET_STR, .value = { .string = " 85.00 Centigrade", }, }, }, { /* Blade CPU 1 Up Major temperature - Blade 2 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.7.2", .mib = { .type = ASN_OCTET_STR, .value = { .string = " 85.00 Centigrade", }, }, }, { /* Blade CPU 1 Up Major temperature - Blade 3 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.7.3", .mib = { .type = ASN_OCTET_STR, .value = { .string = " 85.00 Centigrade", }, }, }, { /* Blade CPU 1 Up Major temperature - Blade 4 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.7.4", .mib = { .type = ASN_OCTET_STR, .value = { .string = " 85.00 Centigrade", }, }, }, { /* Blade CPU 1 Up Major temperature - Blade 5 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.7.5", .mib = { .type = ASN_OCTET_STR, .value = { .string = " 85.00 Centigrade", }, }, }, { /* Blade CPU 1 Up Major temperature - Blade 6 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.7.6", .mib = { .type = ASN_OCTET_STR, .value = { .string = " 85.00 Centigrade", }, }, }, { /* Blade CPU 1 Up Major temperature - Blade 7 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.7.7", .mib = { .type = ASN_OCTET_STR, .value = { .string = " 85.00 Centigrade", }, }, }, { /* Blade CPU 1 Up Major temperature - Blade 8 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.7.8", .mib = { .type = ASN_OCTET_STR, .value = { .string = " 85.00 Centigrade", }, }, }, { /* Blade CPU 1 Up Major temperature - Blade 9 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.7.9", .mib = { .type = ASN_OCTET_STR, .value = { .string = " 85.00 Centigrade", }, }, }, { /* Blade CPU 1 Up Major temperature - Blade 10 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.7.10", .mib = { .type = ASN_OCTET_STR, .value = { .string = " 85.00 Centigrade", }, }, }, { /* Blade CPU 1 Up Major temperature - Blade 11 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.7.11", .mib = { .type = ASN_OCTET_STR, .value = { .string = " 85.00 Centigrade", }, }, }, { /* Blade CPU 1 Up Major temperature - Blade 12 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.7.12", .mib = { .type = ASN_OCTET_STR, .value = { .string = " 85.00 Centigrade", }, }, }, { /* Blade CPU 1 Up Major temperature - Blade 13 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.7.13", .mib = { .type = ASN_OCTET_STR, .value = { .string = " 85.00 Centigrade", }, }, }, { /* Blade CPU 1 Up Major temperature - Blade 14 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.7.14", .mib = { .type = ASN_OCTET_STR, .value = { .string = " 85.00 Centigrade", }, }, }, { /* Blade CPU 2 temperature - Blade 1 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.3.1.7.1", .mib = { .type = ASN_OCTET_STR, .value = { .string = " 50.00 Centigrade", }, }, }, { /* Blade CPU 2 temperature - Blade 2 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.3.1.7.2", .mib = { .type = ASN_OCTET_STR, .value = { .string = " 50.00 Centigrade", }, }, }, { /* Blade CPU 2 temperature - Blade 3 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.3.1.7.3", .mib = { .type = ASN_OCTET_STR, .value = { .string = " 50.00 Centigrade", }, }, }, { /* Blade CPU 2 temperature - Blade 4 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.3.1.7.4", .mib = { .type = ASN_OCTET_STR, .value = { .string = " 50.00 Centigrade", }, }, }, { /* Blade CPU 2 temperature - Blade 5 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.3.1.7.5", .mib = { .type = ASN_OCTET_STR, .value = { .string = " 50.00 Centigrade", }, }, }, { /* Blade CPU 2 temperature - Blade 6 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.3.1.7.6", .mib = { .type = ASN_OCTET_STR, .value = { .string = " 50.00 Centigrade", }, }, }, { /* Blade CPU 2 temperature - Blade 7 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.3.1.7.7", .mib = { .type = ASN_OCTET_STR, .value = { .string = " 50.00 Centigrade", }, }, }, { /* Blade CPU 2 temperature - Blade 8 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.3.1.7.8", .mib = { .type = ASN_OCTET_STR, .value = { .string = " 50.00 Centigrade", }, }, }, { /* Blade CPU 2 temperature - Blade 9 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.3.1.7.9", .mib = { .type = ASN_OCTET_STR, .value = { .string = " 50.00 Centigrade", }, }, }, { /* Blade CPU 2 temperature - Blade 10 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.3.1.7.10", .mib = { .type = ASN_OCTET_STR, .value = { .string = " 50.00 Centigrade", }, }, }, { /* Blade CPU 2 temperature - Blade 11 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.3.1.7.11", .mib = { .type = ASN_OCTET_STR, .value = { .string = " 50.00 Centigrade", }, }, }, { /* Blade CPU 2 temperature - Blade 12 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.3.1.7.12", .mib = { .type = ASN_OCTET_STR, .value = { .string = " 50.00 Centigrade", }, }, }, { /* Blade CPU 2 temperature - Blade 13 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.3.1.7.13", .mib = { .type = ASN_OCTET_STR, .value = { .string = " 50.00 Centigrade", }, }, }, { /* Blade CPU 2 temperature - Blade 14 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.3.1.7.14", .mib = { .type = ASN_OCTET_STR, .value = { .string = " 50.00 Centigrade", }, }, }, { /* Blade CPU 2 Up Critical temperature - Blade 1 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.9.1", .mib = { .type = ASN_OCTET_STR, .value = { .string = " 95.00 Centigrade", }, }, }, { /* Blade CPU 2 Up Critical temperature - Blade 2 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.9.2", .mib = { .type = ASN_OCTET_STR, .value = { .string = " 95.00 Centigrade", }, }, }, { /* Blade CPU 2 Up Critical temperature - Blade 3 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.9.3", .mib = { .type = ASN_OCTET_STR, .value = { .string = " 95.00 Centigrade", }, }, }, { /* Blade CPU 2 Up Critical temperature - Blade 4 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.9.4", .mib = { .type = ASN_OCTET_STR, .value = { .string = " 95.00 Centigrade", }, }, }, { /* Blade CPU 2 Up Critical temperature - Blade 5 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.9.5", .mib = { .type = ASN_OCTET_STR, .value = { .string = " 95.00 Centigrade", }, }, }, { /* Blade CPU 2 Up Critical temperature - Blade 6 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.9.6", .mib = { .type = ASN_OCTET_STR, .value = { .string = " 95.00 Centigrade", }, }, }, { /* Blade CPU 2 Up Critical temperature - Blade 7 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.9.7", .mib = { .type = ASN_OCTET_STR, .value = { .string = " 95.00 Centigrade", }, }, }, { /* Blade CPU 2 Up Critical temperature - Blade 8 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.9.8", .mib = { .type = ASN_OCTET_STR, .value = { .string = " 95.00 Centigrade", }, }, }, { /* Blade CPU 2 Up Critical temperature - Blade 9 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.9.9", .mib = { .type = ASN_OCTET_STR, .value = { .string = " 95.00 Centigrade", }, }, }, { /* Blade CPU 2 Up Critical temperature - Blade 10 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.9.10", .mib = { .type = ASN_OCTET_STR, .value = { .string = " 95.00 Centigrade", }, }, }, { /* Blade CPU 2 Up Critical temperature - Blade 11 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.9.11", .mib = { .type = ASN_OCTET_STR, .value = { .string = " 95.00 Centigrade", }, }, }, { /* Blade CPU 2 Up Critical temperature - Blade 12 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.9.12", .mib = { .type = ASN_OCTET_STR, .value = { .string = " 95.00 Centigrade", }, }, }, { /* Blade CPU 2 Up Critical temperature - Blade 13 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.9.13", .mib = { .type = ASN_OCTET_STR, .value = { .string = " 95.00 Centigrade", }, }, }, { /* Blade CPU 2 Up Critical temperature - Blade 14 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.9.14", .mib = { .type = ASN_OCTET_STR, .value = { .string = " 95.00 Centigrade", }, }, }, { /* Blade CPU 2 Up Major temperature - Blade 1 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.10.1", .mib = { .type = ASN_OCTET_STR, .value = { .string = " 85.00 Centigrade", }, }, }, { /* Blade CPU 2 Up Major temperature - Blade 2 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.10.2", .mib = { .type = ASN_OCTET_STR, .value = { .string = " 85.00 Centigrade", }, }, }, { /* Blade CPU 2 Up Major temperature - Blade 3 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.10.3", .mib = { .type = ASN_OCTET_STR, .value = { .string = " 85.00 Centigrade", }, }, }, { /* Blade CPU 2 Up Major temperature - Blade 4 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.10.4", .mib = { .type = ASN_OCTET_STR, .value = { .string = " 85.00 Centigrade", }, }, }, { /* Blade CPU 2 Up Major temperature - Blade 5 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.10.5", .mib = { .type = ASN_OCTET_STR, .value = { .string = " 85.00 Centigrade", }, }, }, { /* Blade CPU 2 Up Major temperature - Blade 6 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.10.6", .mib = { .type = ASN_OCTET_STR, .value = { .string = " 85.00 Centigrade", }, }, }, { /* Blade CPU 2 Up Major temperature - Blade 7 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.10.7", .mib = { .type = ASN_OCTET_STR, .value = { .string = " 85.00 Centigrade", }, }, }, { /* Blade CPU 2 Up Major temperature - Blade 8 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.10.8", .mib = { .type = ASN_OCTET_STR, .value = { .string = " 85.00 Centigrade", }, }, }, { /* Blade CPU 2 Up Major temperature - Blade 9 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.10.9", .mib = { .type = ASN_OCTET_STR, .value = { .string = " 85.00 Centigrade", }, }, }, { /* Blade CPU 2 Up Major temperature - Blade 10 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.10.10", .mib = { .type = ASN_OCTET_STR, .value = { .string = " 85.00 Centigrade", }, }, }, { /* Blade CPU 2 Up Major temperature - Blade 11 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.10.11", .mib = { .type = ASN_OCTET_STR, .value = { .string = " 85.00 Centigrade", }, }, }, { /* Blade CPU 2 Up Major temperature - Blade 12 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.10.12", .mib = { .type = ASN_OCTET_STR, .value = { .string = " 85.00 Centigrade", }, }, }, { /* Blade CPU 2 Up Major temperature - Blade 13 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.10.13", .mib = { .type = ASN_OCTET_STR, .value = { .string = " 85.00 Centigrade", }, }, }, { /* Blade CPU 2 Up Major temperature - Blade 14 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.10.14", .mib = { .type = ASN_OCTET_STR, .value = { .string = " 85.00 Centigrade", }, }, }, { /* Blade CPU 3 temperature - Blade 1 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.3.1.8.1", .mib = { .type = ASN_OCTET_STR, .value = { .string = " 50.00 Centigrade", }, }, }, { /* Blade CPU 3 temperature - Blade 2 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.3.1.8.2", .mib = { .type = ASN_OCTET_STR, .value = { .string = " 50.00 Centigrade", }, }, }, { /* Blade CPU 3 temperature - Blade 3 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.3.1.8.3", .mib = { .type = ASN_OCTET_STR, .value = { .string = " 50.00 Centigrade", }, }, }, { /* Blade CPU 3 temperature - Blade 4 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.3.1.8.4", .mib = { .type = ASN_OCTET_STR, .value = { .string = " 50.00 Centigrade", }, }, }, { /* Blade CPU 3 temperature - Blade 5 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.3.1.8.5", .mib = { .type = ASN_OCTET_STR, .value = { .string = " 50.00 Centigrade", }, }, }, { /* Blade CPU 3 temperature - Blade 6 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.3.1.8.6", .mib = { .type = ASN_OCTET_STR, .value = { .string = " 50.00 Centigrade", }, }, }, { /* Blade CPU 3 temperature - Blade 7 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.3.1.8.7", .mib = { .type = ASN_OCTET_STR, .value = { .string = " 50.00 Centigrade", }, }, }, { /* Blade CPU 3 temperature - Blade 8 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.3.1.8.8", .mib = { .type = ASN_OCTET_STR, .value = { .string = " 50.00 Centigrade", }, }, }, { /* Blade CPU 3 temperature - Blade 9 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.3.1.8.9", .mib = { .type = ASN_OCTET_STR, .value = { .string = " 50.00 Centigrade", }, }, }, { /* Blade CPU 3 temperature - Blade 10 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.3.1.8.10", .mib = { .type = ASN_OCTET_STR, .value = { .string = " 50.00 Centigrade", }, }, }, { /* Blade CPU 3 temperature - Blade 11 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.3.1.8.11", .mib = { .type = ASN_OCTET_STR, .value = { .string = " 50.00 Centigrade", }, }, }, { /* Blade CPU 3 temperature - Blade 12 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.3.1.8.12", .mib = { .type = ASN_OCTET_STR, .value = { .string = " 50.00 Centigrade", }, }, }, { /* Blade CPU 3 temperature - Blade 13 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.3.1.8.13", .mib = { .type = ASN_OCTET_STR, .value = { .string = " 50.00 Centigrade", }, }, }, { /* Blade CPU 3 temperature - Blade 14 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.3.1.8.14", .mib = { .type = ASN_OCTET_STR, .value = { .string = " 50.00 Centigrade", }, }, }, { /* Blade CPU 3 Up Critical temperature - Blade 1 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.12.1", .mib = { .type = ASN_OCTET_STR, .value = { .string = " 95.00 Centigrade", }, }, }, { /* Blade CPU 3 Up Critical temperature - Blade 2 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.12.2", .mib = { .type = ASN_OCTET_STR, .value = { .string = " 95.00 Centigrade", }, }, }, { /* Blade CPU 3 Up Critical temperature - Blade 3 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.12.3", .mib = { .type = ASN_OCTET_STR, .value = { .string = " 95.00 Centigrade", }, }, }, { /* Blade CPU 3 Up Critical temperature - Blade 4 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.12.4", .mib = { .type = ASN_OCTET_STR, .value = { .string = " 95.00 Centigrade", }, }, }, { /* Blade CPU 3 Up Critical temperature - Blade 5 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.12.5", .mib = { .type = ASN_OCTET_STR, .value = { .string = " 95.00 Centigrade", }, }, }, { /* Blade CPU 3 Up Critical temperature - Blade 6 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.12.6", .mib = { .type = ASN_OCTET_STR, .value = { .string = " 95.00 Centigrade", }, }, }, { /* Blade CPU 3 Up Critical temperature - Blade 7 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.12.7", .mib = { .type = ASN_OCTET_STR, .value = { .string = " 95.00 Centigrade", }, }, }, { /* Blade CPU 3 Up Critical temperature - Blade 8 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.12.8", .mib = { .type = ASN_OCTET_STR, .value = { .string = " 95.00 Centigrade", }, }, }, { /* Blade CPU 3 Up Critical temperature - Blade 9 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.12.9", .mib = { .type = ASN_OCTET_STR, .value = { .string = " 95.00 Centigrade", }, }, }, { /* Blade CPU 3 Up Critical temperature - Blade 10 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.12.10", .mib = { .type = ASN_OCTET_STR, .value = { .string = " 95.00 Centigrade", }, }, }, { /* Blade CPU 3 Up Critical temperature - Blade 11 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.12.11", .mib = { .type = ASN_OCTET_STR, .value = { .string = " 95.00 Centigrade", }, }, }, { /* Blade CPU 3 Up Critical temperature - Blade 12 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.12.12", .mib = { .type = ASN_OCTET_STR, .value = { .string = " 95.00 Centigrade", }, }, }, { /* Blade CPU 3 Up Critical temperature - Blade 13 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.12.13", .mib = { .type = ASN_OCTET_STR, .value = { .string = " 95.00 Centigrade", }, }, }, { /* Blade CPU 3 Up Critical temperature - Blade 14 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.12.14", .mib = { .type = ASN_OCTET_STR, .value = { .string = " 95.00 Centigrade", }, }, }, { /* Blade CPU 3 Up Major temperature - Blade 1 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.13.1", .mib = { .type = ASN_OCTET_STR, .value = { .string = " 85.00 Centigrade", }, }, }, { /* Blade CPU 3 Up Major temperature - Blade 2 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.13.2", .mib = { .type = ASN_OCTET_STR, .value = { .string = " 85.00 Centigrade", }, }, }, { /* Blade CPU 3 Up Major temperature - Blade 3 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.13.3", .mib = { .type = ASN_OCTET_STR, .value = { .string = " 85.00 Centigrade", }, }, }, { /* Blade CPU 3 Up Major temperature - Blade 4 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.13.4", .mib = { .type = ASN_OCTET_STR, .value = { .string = " 85.00 Centigrade", }, }, }, { /* Blade CPU 3 Up Major temperature - Blade 5 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.13.5", .mib = { .type = ASN_OCTET_STR, .value = { .string = " 85.00 Centigrade", }, }, }, { /* Blade CPU 3 Up Major temperature - Blade 6 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.13.6", .mib = { .type = ASN_OCTET_STR, .value = { .string = " 85.00 Centigrade", }, }, }, { /* Blade CPU 3 Up Major temperature - Blade 7 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.13.7", .mib = { .type = ASN_OCTET_STR, .value = { .string = " 85.00 Centigrade", }, }, }, { /* Blade CPU 3 Up Major temperature - Blade 8 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.13.8", .mib = { .type = ASN_OCTET_STR, .value = { .string = " 85.00 Centigrade", }, }, }, { /* Blade CPU 3 Up Major temperature - Blade 9 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.13.9", .mib = { .type = ASN_OCTET_STR, .value = { .string = " 85.00 Centigrade", }, }, }, { /* Blade CPU 3 Up Major temperature - Blade 10 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.13.10", .mib = { .type = ASN_OCTET_STR, .value = { .string = " 85.00 Centigrade", }, }, }, { /* Blade CPU 3 Up Major temperature - Blade 11 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.13.11", .mib = { .type = ASN_OCTET_STR, .value = { .string = " 85.00 Centigrade", }, }, }, { /* Blade CPU 3 Up Major temperature - Blade 12 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.13.12", .mib = { .type = ASN_OCTET_STR, .value = { .string = " 85.00 Centigrade", }, }, }, { /* Blade CPU 3 Up Major temperature - Blade 13 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.13.13", .mib = { .type = ASN_OCTET_STR, .value = { .string = " 85.00 Centigrade", }, }, }, { /* Blade CPU 3 Up Major temperature - Blade 14 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.13.14", .mib = { .type = ASN_OCTET_STR, .value = { .string = " 85.00 Centigrade", }, }, }, { /* Blade CPU 4 temperature - Blade 1 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.3.1.9.1", .mib = { .type = ASN_OCTET_STR, .value = { .string = " 50.00 Centigrade", }, }, }, { /* Blade CPU 4 temperature - Blade 2 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.3.1.9.2", .mib = { .type = ASN_OCTET_STR, .value = { .string = " 50.00 Centigrade", }, }, }, { /* Blade CPU 4 temperature - Blade 3 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.3.1.9.3", .mib = { .type = ASN_OCTET_STR, .value = { .string = " 50.00 Centigrade", }, }, }, { /* Blade CPU 4 temperature - Blade 4 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.3.1.9.4", .mib = { .type = ASN_OCTET_STR, .value = { .string = " 50.00 Centigrade", }, }, }, { /* Blade CPU 4 temperature - Blade 5 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.3.1.9.5", .mib = { .type = ASN_OCTET_STR, .value = { .string = " 50.00 Centigrade", }, }, }, { /* Blade CPU 4 temperature - Blade 6 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.3.1.9.6", .mib = { .type = ASN_OCTET_STR, .value = { .string = " 50.00 Centigrade", }, }, }, { /* Blade CPU 4 temperature - Blade 7 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.3.1.9.7", .mib = { .type = ASN_OCTET_STR, .value = { .string = " 50.00 Centigrade", }, }, }, { /* Blade CPU 4 temperature - Blade 8 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.3.1.9.8", .mib = { .type = ASN_OCTET_STR, .value = { .string = " 50.00 Centigrade", }, }, }, { /* Blade CPU 4 temperature - Blade 9 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.3.1.9.9", .mib = { .type = ASN_OCTET_STR, .value = { .string = " 50.00 Centigrade", }, }, }, { /* Blade CPU 4 temperature - Blade 10 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.3.1.9.10", .mib = { .type = ASN_OCTET_STR, .value = { .string = " 50.00 Centigrade", }, }, }, { /* Blade CPU 4 temperature - Blade 11 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.3.1.9.11", .mib = { .type = ASN_OCTET_STR, .value = { .string = " 50.00 Centigrade", }, }, }, { /* Blade CPU 4 temperature - Blade 12 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.3.1.9.12", .mib = { .type = ASN_OCTET_STR, .value = { .string = " 50.00 Centigrade", }, }, }, { /* Blade CPU 4 temperature - Blade 13 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.3.1.9.13", .mib = { .type = ASN_OCTET_STR, .value = { .string = " 50.00 Centigrade", }, }, }, { /* Blade CPU 4 temperature - Blade 14 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.3.1.9.14", .mib = { .type = ASN_OCTET_STR, .value = { .string = " 50.00 Centigrade", }, }, }, { /* Blade CPU 4 Up Critical temperature - Blade 1 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.15.1", .mib = { .type = ASN_OCTET_STR, .value = { .string = " 95.00 Centigrade", }, }, }, { /* Blade CPU 4 Up Critical temperature - Blade 2 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.15.2", .mib = { .type = ASN_OCTET_STR, .value = { .string = " 95.00 Centigrade", }, }, }, { /* Blade CPU 4 Up Critical temperature - Blade 3 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.15.3", .mib = { .type = ASN_OCTET_STR, .value = { .string = " 95.00 Centigrade", }, }, }, { /* Blade CPU 4 Up Critical temperature - Blade 4 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.15.4", .mib = { .type = ASN_OCTET_STR, .value = { .string = " 95.00 Centigrade", }, }, }, { /* Blade CPU 4 Up Critical temperature - Blade 5 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.15.5", .mib = { .type = ASN_OCTET_STR, .value = { .string = " 95.00 Centigrade", }, }, }, { /* Blade CPU 4 Up Critical temperature - Blade 6 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.15.6", .mib = { .type = ASN_OCTET_STR, .value = { .string = " 95.00 Centigrade", }, }, }, { /* Blade CPU 4 Up Critical temperature - Blade 7 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.15.7", .mib = { .type = ASN_OCTET_STR, .value = { .string = " 95.00 Centigrade", }, }, }, { /* Blade CPU 4 Up Critical temperature - Blade 8 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.15.8", .mib = { .type = ASN_OCTET_STR, .value = { .string = " 95.00 Centigrade", }, }, }, { /* Blade CPU 4 Up Critical temperature - Blade 9 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.15.9", .mib = { .type = ASN_OCTET_STR, .value = { .string = " 95.00 Centigrade", }, }, }, { /* Blade CPU 4 Up Critical temperature - Blade 10 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.15.10", .mib = { .type = ASN_OCTET_STR, .value = { .string = " 95.00 Centigrade", }, }, }, { /* Blade CPU 4 Up Critical temperature - Blade 11 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.15.11", .mib = { .type = ASN_OCTET_STR, .value = { .string = " 95.00 Centigrade", }, }, }, { /* Blade CPU 4 Up Critical temperature - Blade 12 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.15.12", .mib = { .type = ASN_OCTET_STR, .value = { .string = " 95.00 Centigrade", }, }, }, { /* Blade CPU 4 Up Critical temperature - Blade 13 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.15.13", .mib = { .type = ASN_OCTET_STR, .value = { .string = " 95.00 Centigrade", }, }, }, { /* Blade CPU 4 Up Critical temperature - Blade 14 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.15.14", .mib = { .type = ASN_OCTET_STR, .value = { .string = " 95.00 Centigrade", }, }, }, { /* Blade CPU 4 Up Major temperature - Blade 1 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.16.1", .mib = { .type = ASN_OCTET_STR, .value = { .string = " 85.00 Centigrade", }, }, }, { /* Blade CPU 4 Up Major temperature - Blade 2 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.16.2", .mib = { .type = ASN_OCTET_STR, .value = { .string = " 85.00 Centigrade", }, }, }, { /* Blade CPU 4 Up Major temperature - Blade 3 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.16.3", .mib = { .type = ASN_OCTET_STR, .value = { .string = " 85.00 Centigrade", }, }, }, { /* Blade CPU 4 Up Major temperature - Blade 4 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.16.4", .mib = { .type = ASN_OCTET_STR, .value = { .string = " 85.00 Centigrade", }, }, }, { /* Blade CPU 4 Up Major temperature - Blade 5 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.16.5", .mib = { .type = ASN_OCTET_STR, .value = { .string = " 85.00 Centigrade", }, }, }, { /* Blade CPU 4 Up Major temperature - Blade 6 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.16.6", .mib = { .type = ASN_OCTET_STR, .value = { .string = " 85.00 Centigrade", }, }, }, { /* Blade CPU 4 Up Major temperature - Blade 7 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.16.7", .mib = { .type = ASN_OCTET_STR, .value = { .string = " 85.00 Centigrade", }, }, }, { /* Blade CPU 4 Up Major temperature - Blade 8 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.16.8", .mib = { .type = ASN_OCTET_STR, .value = { .string = " 85.00 Centigrade", }, }, }, { /* Blade CPU 4 Up Major temperature - Blade 9 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.16.9", .mib = { .type = ASN_OCTET_STR, .value = { .string = " 85.00 Centigrade", }, }, }, { /* Blade CPU 4 Up Major temperature - Blade 10 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.16.10", .mib = { .type = ASN_OCTET_STR, .value = { .string = " 85.00 Centigrade", }, }, }, { /* Blade CPU 4 Up Major temperature - Blade 11 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.16.11", .mib = { .type = ASN_OCTET_STR, .value = { .string = " 85.00 Centigrade", }, }, }, { /* Blade CPU 4 Up Major temperature - Blade 12 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.16.12", .mib = { .type = ASN_OCTET_STR, .value = { .string = " 85.00 Centigrade", }, }, }, { /* Blade CPU 4 Up Major temperature - Blade 13 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.16.13", .mib = { .type = ASN_OCTET_STR, .value = { .string = " 85.00 Centigrade", }, }, }, { /* Blade CPU 4 Up Major temperature - Blade 14 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.16.14", .mib = { .type = ASN_OCTET_STR, .value = { .string = " 85.00 Centigrade", }, }, }, { /* Blade DASD1 Temperature - Blade 1 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.3.1.10.1", .mib = { .type = ASN_OCTET_STR, .value = { .string = " 199.99 Centigrade", }, }, }, { /* Blade DASD1 Temperature - Blade 2 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.3.1.10.2", .mib = { .type = ASN_OCTET_STR, .value = { .string = " 9.99 Centigrade", }, }, }, { /* Blade DASD1 Temperature - Blade 3 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.3.1.10.3", .mib = { .type = ASN_OCTET_STR, .value = { .string = "-199.99 Centigrade", }, }, }, { /* Blade DASD1 Temperature - Blade 4 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.3.1.10.4", .mib = { .type = ASN_OCTET_STR, .value = { .string = "- 9.99 Centigrade", }, }, }, { /* Blade DASD1 Temperature - Blade 5 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.3.1.10.5", .mib = { .type = ASN_OCTET_STR, .value = { .string = " 0.00 Centigrade", }, }, }, { /* Blade DASD1 Temperature - Blade 6 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.3.1.10.6", .mib = { .type = ASN_OCTET_STR, .value = { .string = "- 0.00 Centigrade", }, }, }, { /* Blade DASD1 Temperature - Blade 7 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.3.1.10.7", .mib = { .type = ASN_OCTET_STR, .value = { .string = " 0.00 Centigrade", }, }, }, { /* Blade DASD1 Temperature - Blade 8 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.3.1.10.8", .mib = { .type = ASN_OCTET_STR, .value = { .string = " 0.00 Centigrade", }, }, }, { /* Blade DASD1 Temperature - Blade 9 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.3.1.10.9", .mib = { .type = ASN_OCTET_STR, .value = { .string = " 0.00 Centigrade", }, }, }, { /* Blade DASD1 Temperature - Blade 10 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.3.1.10.10", .mib = { .type = ASN_OCTET_STR, .value = { .string = " 0.00 Centigrade", }, }, }, { /* Blade DASD1 Temperature - Blade 11 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.3.1.10.11", .mib = { .type = ASN_OCTET_STR, .value = { .string = " 0.00 Centigrade", }, }, }, { /* Blade DASD1 Temperature - Blade 12 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.3.1.10.12", .mib = { .type = ASN_OCTET_STR, .value = { .string = " 0.00 Centigrade", }, }, }, { /* Blade DASD1 Temperature - Blade 13 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.3.1.10.13", .mib = { .type = ASN_OCTET_STR, .value = { .string = " 0.00 Centigrade", }, }, }, { /* Blade DASD1 Temperature - Blade 14 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.3.1.10.14", .mib = { .type = ASN_OCTET_STR, .value = { .string = " 0.00 Centigrade", }, }, }, { /* Blade IPMI Temperature Capability - Blade 1 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.3.1.11.1", .mib = { .type = ASN_INTEGER, .value = { .integer = 1, }, }, }, { /* Blade IPMI Temperature Capability - Blade 2 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.3.1.11.2", .mib = { .type = ASN_INTEGER, .value = { .integer = 0, }, }, }, { /* Blade IPMI Temperature Capability - Blade 3 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.3.1.11.3", .mib = { .type = ASN_INTEGER, .value = { .integer = 1, }, }, }, { /* Blade IPMI Temperature Capability - Blade 4 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.3.1.11.4", .mib = { .type = ASN_INTEGER, .value = { .integer = 0, }, }, }, { /* Blade IPMI Temperature Capability - Blade 5 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.3.1.11.5", .mib = { .type = ASN_INTEGER, .value = { .integer = 0, }, }, }, { /* Blade IPMI Temperature Capability - Blade 6 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.3.1.11.6", .mib = { .type = ASN_INTEGER, .value = { .integer = 0, }, }, }, { /* Blade IPMI Temperature Capability - Blade 7 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.3.1.11.7", .mib = { .type = ASN_INTEGER, .value = { .integer = 0, }, }, }, { /* Blade IPMI Temperature Capability - Blade 8 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.3.1.11.8", .mib = { .type = ASN_INTEGER, .value = { .integer = 0, }, }, }, { /* Blade IPMI Temperature Capability - Blade 9 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.3.1.11.9", .mib = { .type = ASN_INTEGER, .value = { .integer = 0, }, }, }, { /* Blade IPMI Temperature Capability - Blade 10 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.3.1.11.10", .mib = { .type = ASN_INTEGER, .value = { .integer = 0, }, }, }, { /* Blade IPMI Temperature Capability - Blade 11 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.3.1.11.11", .mib = { .type = ASN_INTEGER, .value = { .integer = 0, }, }, }, { /* Blade IPMI Temperature Capability - Blade 12 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.3.1.11.12", .mib = { .type = ASN_INTEGER, .value = { .integer = 0, }, }, }, { /* Blade IPMI Temperature Capability - Blade 13 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.3.1.11.13", .mib = { .type = ASN_INTEGER, .value = { .integer = 0, }, }, }, { /* Blade IPMI Temperature Capability - Blade 14 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.3.1.11.14", .mib = { .type = ASN_INTEGER, .value = { .integer = 0, }, }, }, { /* Blade IPMI Temperature Sensor 1 - Blade 1 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.3.1.12.1", .mib = { .type = ASN_OCTET_STR, .value = { .string = "CPU 1 TeMP = +37.00 Centigrade", }, }, }, { /* Blade IPMI Temperature Sensor 1 - Blade 3 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.3.1.12.3", .mib = { .type = ASN_OCTET_STR, .value = { .string = "Not Readable!", }, }, }, { /* Blade IPMI Temperature Sensor 2 - Blade 1 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.3.1.13.1", .mib = { .type = ASN_OCTET_STR, .value = { .string = "Not Readable!", }, }, }, { /* Blade IPMI Temperature Sensor 2 - Blade 3 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.3.1.13.3", .mib = { .type = ASN_OCTET_STR, .value = { .string = "Not Readable!", }, }, }, { /* Blade IPMI Temperature Sensor 3 - Blade 1 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.3.1.14.1", .mib = { .type = ASN_OCTET_STR, .value = { .string = " CPU2 temp = +90.00 Centigrade ", }, }, }, { /* Blade IPMI Temperature Sensor 3 - Blade 3 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.3.1.14.3", .mib = { .type = ASN_OCTET_STR, .value = { .string = "(No temperature)", }, }, }, { /* Blade IPMI Temperature Sensor 4 - Blade 1 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.3.1.15.1", .mib = { .type = ASN_OCTET_STR, .value = { .string = "GARBAGE", }, }, }, { /* Blade IPMI Temperature Sensor 4 - Blade 3 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.3.1.15.3", .mib = { .type = ASN_OCTET_STR, .value = { .string = "GARBAGE", }, }, }, { /* Blade IPMI Temperature Sensor 5 - Blade 1 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.3.1.16.1", .mib = { .type = ASN_OCTET_STR, .value = { .string = "(No temperature)", }, }, }, { /* Blade IPMI Temperature Sensor 5 - Blade 3 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.3.1.16.3", .mib = { .type = ASN_OCTET_STR, .value = { .string = "(No temperature)", }, }, }, { /* Blade IPMI Temperature Sensor 6 - Blade 1 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.3.1.17.1", .mib = { .type = ASN_OCTET_STR, .value = { .string = "(No temperature)", }, }, }, { /* Blade IPMI Temperature Sensor 6 - Blade 3 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.3.1.17.3", .mib = { .type = ASN_OCTET_STR, .value = { .string = "(No temperature)", }, }, }, { /* Blade DASD1 Up Critical temperature - Blade 1 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.18.1", .mib = { .type = ASN_OCTET_STR, .value = { .string = " 95.00 Centigrade", }, }, }, { /* Blade DASD1 Up Critical temperature - Blade 2 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.18.2", .mib = { .type = ASN_OCTET_STR, .value = { .string = " 95.00 Centigrade", }, }, }, { /* Blade DASD1 Up Critical temperature - Blade 3 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.18.3", .mib = { .type = ASN_OCTET_STR, .value = { .string = " 95.00 Centigrade", }, }, }, { /* Blade DASD1 Up Critical temperature - Blade 4 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.18.4", .mib = { .type = ASN_OCTET_STR, .value = { .string = " 95.00 Centigrade", }, }, }, { /* Blade DASD1 Up Critical temperature - Blade 5 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.18.5", .mib = { .type = ASN_OCTET_STR, .value = { .string = " 95.00 Centigrade", }, }, }, { /* Blade DASD1 Up Critical temperature - Blade 6 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.18.6", .mib = { .type = ASN_OCTET_STR, .value = { .string = " 95.00 Centigrade", }, }, }, { /* Blade DASD1 Up Critical temperature - Blade 7 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.18.7", .mib = { .type = ASN_OCTET_STR, .value = { .string = " 95.00 Centigrade", }, }, }, { /* Blade DASD1 Up Critical temperature - Blade 8 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.18.8", .mib = { .type = ASN_OCTET_STR, .value = { .string = " 95.00 Centigrade", }, }, }, { /* Blade DASD1 Up Critical temperature - Blade 9 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.18.9", .mib = { .type = ASN_OCTET_STR, .value = { .string = " 95.00 Centigrade", }, }, }, { /* Blade DASD1 Up Critical temperature - Blade 10 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.18.10", .mib = { .type = ASN_OCTET_STR, .value = { .string = " 95.00 Centigrade", }, }, }, { /* Blade DASD1 Up Critical temperature - Blade 11 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.18.11", .mib = { .type = ASN_OCTET_STR, .value = { .string = " 95.00 Centigrade", }, }, }, { /* Blade DASD1 Up Critical temperature - Blade 12 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.18.12", .mib = { .type = ASN_OCTET_STR, .value = { .string = " 95.00 Centigrade", }, }, }, { /* Blade DASD1 Up Critical temperature - Blade 13 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.18.13", .mib = { .type = ASN_OCTET_STR, .value = { .string = " 95.00 Centigrade", }, }, }, { /* Blade DASD1 Up Critical temperature - Blade 14 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.18.14", .mib = { .type = ASN_OCTET_STR, .value = { .string = " 95.00 Centigrade", }, }, }, { /* Blade DASD1 Up Major temperature - Blade 1 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.19.1", .mib = { .type = ASN_OCTET_STR, .value = { .string = " 85.00 Centigrade", }, }, }, { /* Blade DASD1 Up Major temperature - Blade 2 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.19.2", .mib = { .type = ASN_OCTET_STR, .value = { .string = " 85.00 Centigrade", }, }, }, { /* Blade DASD1 Up Major temperature - Blade 3 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.19.3", .mib = { .type = ASN_OCTET_STR, .value = { .string = " 85.00 Centigrade", }, }, }, { /* Blade DASD1 Up Major temperature - Blade 4 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.19.4", .mib = { .type = ASN_OCTET_STR, .value = { .string = " 85.00 Centigrade", }, }, }, { /* Blade DASD1 Up Major temperature - Blade 5 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.19.5", .mib = { .type = ASN_OCTET_STR, .value = { .string = " 85.00 Centigrade", }, }, }, { /* Blade DASD1 Up Major temperature - Blade 6 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.19.6", .mib = { .type = ASN_OCTET_STR, .value = { .string = " 85.00 Centigrade", }, }, }, { /* Blade DASD1 Up Major temperature - Blade 7 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.19.7", .mib = { .type = ASN_OCTET_STR, .value = { .string = " 85.00 Centigrade", }, }, }, { /* Blade DASD1 Up Major temperature - Blade 8 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.19.8", .mib = { .type = ASN_OCTET_STR, .value = { .string = " 85.00 Centigrade", }, }, }, { /* Blade DASD1 Up Major temperature - Blade 9 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.19.9", .mib = { .type = ASN_OCTET_STR, .value = { .string = " 85.00 Centigrade", }, }, }, { /* Blade DASD1 Up Major temperature - Blade 10 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.19.10", .mib = { .type = ASN_OCTET_STR, .value = { .string = " 85.00 Centigrade", }, }, }, { /* Blade DASD1 Up Major temperature - Blade 11 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.19.11", .mib = { .type = ASN_OCTET_STR, .value = { .string = " 85.00 Centigrade", }, }, }, { /* Blade DASD1 Up Major temperature - Blade 12 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.19.12", .mib = { .type = ASN_OCTET_STR, .value = { .string = " 85.00 Centigrade", }, }, }, { /* Blade DASD1 Up Major temperature - Blade 13 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.19.13", .mib = { .type = ASN_OCTET_STR, .value = { .string = " 85.00 Centigrade", }, }, }, { /* Blade DASD1 Up Major temperature - Blade 14 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.19.14", .mib = { .type = ASN_OCTET_STR, .value = { .string = " 85.00 Centigrade", }, }, }, { /* Blade IPMI Temperature Sensor 1 Up Critical - Blade 1 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.22.1", .mib = { .type = ASN_OCTET_STR, .value = { .string = " +95.00 Centigrade", }, }, }, { /* Blade IPMI Temperature Sensor 1 Up Major - Blade 1 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.23.1", .mib = { .type = ASN_OCTET_STR, .value = { .string = " +85.00 Centigrade", }, }, }, { /* Blade IPMI Temperature Sensor 3 Up Critical - Blade 1 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.28.1", .mib = { .type = ASN_OCTET_STR, .value = { .string = " +95.00 Centigrade", }, }, }, { /* Blade IPMI Temperature Sensor 3 Up Major - Blade 1 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.29.1", .mib = { .type = ASN_OCTET_STR, .value = { .string = " +85.00 Centigrade", }, }, }, { /* Blade 5V - Blade 1 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.6.1", .mib = { .type = ASN_OCTET_STR, .value = { .string = "+ 5.00 Volts", }, }, }, { /* Blade 5V - Blade 2 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.6.2", .mib = { .type = ASN_OCTET_STR, .value = { .string = "+ 5.00 Volts", }, }, }, { /* Blade 5V - Blade 3 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.6.3", .mib = { .type = ASN_OCTET_STR, .value = { .string = "+ 5.00 Volts", }, }, }, { /* Blade 5V - Blade 4 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.6.4", .mib = { .type = ASN_OCTET_STR, .value = { .string = "+ 5.00 Volts", }, }, }, { /* Blade 5V - Blade 5 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.6.5", .mib = { .type = ASN_OCTET_STR, .value = { .string = "+ 5.00 Volts", }, }, }, { /* Blade 5V - Blade 6 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.6.6", .mib = { .type = ASN_OCTET_STR, .value = { .string = "+ 5.00 Volts", }, }, }, { /* Blade 5V - Blade 7 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.6.7", .mib = { .type = ASN_OCTET_STR, .value = { .string = "+ 5.00 Volts", }, }, }, { /* Blade 5V - Blade 8 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.6.8", .mib = { .type = ASN_OCTET_STR, .value = { .string = "+ 5.00 Volts", }, }, }, { /* Blade 5V - Blade 9 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.6.9", .mib = { .type = ASN_OCTET_STR, .value = { .string = "+ 5.00 Volts", }, }, }, { /* Blade 5V - Blade 10 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.6.10", .mib = { .type = ASN_OCTET_STR, .value = { .string = "+ 5.00 Volts", }, }, }, { /* Blade 5V - Blade 11 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.6.11", .mib = { .type = ASN_OCTET_STR, .value = { .string = "+ 5.00 Volts", }, }, }, { /* Blade 5V - Blade 12 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.6.12", .mib = { .type = ASN_OCTET_STR, .value = { .string = "+ 5.00 Volts", }, }, }, { /* Blade 5V - Blade 13 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.6.13", .mib = { .type = ASN_OCTET_STR, .value = { .string = "+ 5.00 Volts", }, }, }, { /* Blade 5V - Blade 14 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.6.14", .mib = { .type = ASN_OCTET_STR, .value = { .string = "+ 5.00 Volts", }, }, }, { /* Blade 5V Low Major - Blade 1 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.7.1", .mib = { .type = ASN_OCTET_STR, .value = { .string = "+ 4.40 Volts", }, }, }, { /* Blade 5V Low Major - Blade 2 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.7.2", .mib = { .type = ASN_OCTET_STR, .value = { .string = "+ 4.40 Volts", }, }, }, { /* Blade 5V Low Major - Blade 3 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.7.3", .mib = { .type = ASN_OCTET_STR, .value = { .string = "+ 4.40 Volts", }, }, }, { /* Blade 5V Low Major - Blade 4 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.7.4", .mib = { .type = ASN_OCTET_STR, .value = { .string = "+ 4.40 Volts", }, }, }, { /* Blade 5V Low Major - Blade 5 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.7.5", .mib = { .type = ASN_OCTET_STR, .value = { .string = "+ 4.40 Volts", }, }, }, { /* Blade 5V Low Major - Blade 6 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.7.6", .mib = { .type = ASN_OCTET_STR, .value = { .string = "+ 4.40 Volts", }, }, }, { /* Blade 5V Low Major - Blade 7 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.7.7", .mib = { .type = ASN_OCTET_STR, .value = { .string = "+ 4.40 Volts", }, }, }, { /* Blade 5V Low Major - Blade 8 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.7.8", .mib = { .type = ASN_OCTET_STR, .value = { .string = "+ 4.40 Volts", }, }, }, { /* Blade 5V Low Major - Blade 9 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.7.9", .mib = { .type = ASN_OCTET_STR, .value = { .string = "+ 4.40 Volts", }, }, }, { /* Blade 5V Low Major - Blade 10 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.7.10", .mib = { .type = ASN_OCTET_STR, .value = { .string = "+ 4.40 Volts", }, }, }, { /* Blade 5V Low Major - Blade 11 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.7.11", .mib = { .type = ASN_OCTET_STR, .value = { .string = "+ 4.40 Volts", }, }, }, { /* Blade 5V Low Major - Blade 12 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.7.12", .mib = { .type = ASN_OCTET_STR, .value = { .string = "+ 4.40 Volts", }, }, }, { /* Blade 5V Low Major - Blade 13 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.7.13", .mib = { .type = ASN_OCTET_STR, .value = { .string = "+ 4.40 Volts", }, }, }, { /* Blade 5V Low Major - Blade 14 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.7.14", .mib = { .type = ASN_OCTET_STR, .value = { .string = "+ 4.40 Volts", }, }, }, { /* Blade 5V Up Major - Blade 1 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.6.1", .mib = { .type = ASN_OCTET_STR, .value = { .string = "+ 5.50 Volts", }, }, }, { /* Blade 5V Up Major - Blade 2 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.6.2", .mib = { .type = ASN_OCTET_STR, .value = { .string = "+ 5.50 Volts", }, }, }, { /* Blade 5V Up Major - Blade 3 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.6.3", .mib = { .type = ASN_OCTET_STR, .value = { .string = "+ 5.50 Volts", }, }, }, { /* Blade 5V Up Major - Blade 4 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.6.4", .mib = { .type = ASN_OCTET_STR, .value = { .string = "+ 5.50 Volts", }, }, }, { /* Blade 5V Up Major - Blade 5 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.6.5", .mib = { .type = ASN_OCTET_STR, .value = { .string = "+ 5.50 Volts", }, }, }, { /* Blade 5V Up Major - Blade 6 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.6.6", .mib = { .type = ASN_OCTET_STR, .value = { .string = "+ 5.50 Volts", }, }, }, { /* Blade 5V Up Major - Blade 7 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.6.7", .mib = { .type = ASN_OCTET_STR, .value = { .string = "+ 5.50 Volts", }, }, }, { /* Blade 5V Up Major - Blade 8 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.6.8", .mib = { .type = ASN_OCTET_STR, .value = { .string = "+ 5.50 Volts", }, }, }, { /* Blade 5V Up Major - Blade 9 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.6.9", .mib = { .type = ASN_OCTET_STR, .value = { .string = "+ 5.50 Volts", }, }, }, { /* Blade 5V Up Major - Blade 10 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.6.10", .mib = { .type = ASN_OCTET_STR, .value = { .string = "+ 5.50 Volts", }, }, }, { /* Blade 5V Up Major - Blade 11 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.6.11", .mib = { .type = ASN_OCTET_STR, .value = { .string = "+ 5.50 Volts", }, }, }, { /* Blade 5V Up Major - Blade 12 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.6.12", .mib = { .type = ASN_OCTET_STR, .value = { .string = "+ 5.50 Volts", }, }, }, { /* Blade 5V Up Major - Blade 13 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.6.13", .mib = { .type = ASN_OCTET_STR, .value = { .string = "+ 5.50 Volts", }, }, }, { /* Blade 5V Up Major - Blade 14 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.6.14", .mib = { .type = ASN_OCTET_STR, .value = { .string = "+ 5.50 Volts", }, }, }, { /* Blade 3.3 Volts - Blade 1 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.7.1", .mib = { .type = ASN_OCTET_STR, .value = { .string = "+ 3.30 Volts", }, }, }, { /* Blade 3.3 Volts - Blade 2 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.7.2", .mib = { .type = ASN_OCTET_STR, .value = { .string = "+ 3.30 Volts", }, }, }, { /* Blade 3.3 Volts - Blade 3 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.7.3", .mib = { .type = ASN_OCTET_STR, .value = { .string = "+ 3.30 Volts", }, }, }, { /* Blade 3.3 Volts - Blade 4 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.7.4", .mib = { .type = ASN_OCTET_STR, .value = { .string = "+ 3.30 Volts", }, }, }, { /* Blade 3.3 Volts - Blade 5 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.7.5", .mib = { .type = ASN_OCTET_STR, .value = { .string = "+ 3.30 Volts", }, }, }, { /* Blade 3.3 Volts - Blade 6 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.7.6", .mib = { .type = ASN_OCTET_STR, .value = { .string = "+ 3.30 Volts", }, }, }, { /* Blade 3.3 Volts - Blade 7 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.7.7", .mib = { .type = ASN_OCTET_STR, .value = { .string = "+ 3.30 Volts", }, }, }, { /* Blade 3.3 Volts - Blade 8 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.7.8", .mib = { .type = ASN_OCTET_STR, .value = { .string = "+ 3.30 Volts", }, }, }, { /* Blade 3.3 Volts - Blade 9 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.7.9", .mib = { .type = ASN_OCTET_STR, .value = { .string = "+ 3.30 Volts", }, }, }, { /* Blade 3.3 Volts - Blade 10 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.7.10", .mib = { .type = ASN_OCTET_STR, .value = { .string = "+ 3.30 Volts", }, }, }, { /* Blade 3.3 Volts - Blade 11 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.7.11", .mib = { .type = ASN_OCTET_STR, .value = { .string = "+ 3.30 Volts", }, }, }, { /* Blade 3.3 Volts - Blade 12 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.7.12", .mib = { .type = ASN_OCTET_STR, .value = { .string = "+ 3.30 Volts", }, }, }, { /* Blade 3.3 Volts - Blade 13 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.7.13", .mib = { .type = ASN_OCTET_STR, .value = { .string = "+ 3.30 Volts", }, }, }, { /* Blade 3.3 Volts - Blade 14 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.7.14", .mib = { .type = ASN_OCTET_STR, .value = { .string = "+ 3.30 Volts", }, }, }, { /* Blade 3.3 Volts Low Major - Blade 1 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.9.1", .mib = { .type = ASN_OCTET_STR, .value = { .string = "+ 2.97 Volts", }, }, }, { /* Blade 3.3 Volts Low Major - Blade 2 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.9.2", .mib = { .type = ASN_OCTET_STR, .value = { .string = "+ 2.97 Volts", }, }, }, { /* Blade 3.3 Volts Low Major - Blade 3 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.9.3", .mib = { .type = ASN_OCTET_STR, .value = { .string = "+ 2.97 Volts", }, }, }, { /* Blade 3.3 Volts Low Major - Blade 4 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.9.4", .mib = { .type = ASN_OCTET_STR, .value = { .string = "+ 2.97 Volts", }, }, }, { /* Blade 3.3 Volts Low Major - Blade 5 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.9.5", .mib = { .type = ASN_OCTET_STR, .value = { .string = "+ 2.97 Volts", }, }, }, { /* Blade 3.3 Volts Low Major - Blade 6 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.9.6", .mib = { .type = ASN_OCTET_STR, .value = { .string = "+ 2.97 Volts", }, }, }, { /* Blade 3.3 Volts Low Major - Blade 7 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.9.7", .mib = { .type = ASN_OCTET_STR, .value = { .string = "+ 2.97 Volts", }, }, }, { /* Blade 3.3 Volts Low Major - Blade 8 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.9.8", .mib = { .type = ASN_OCTET_STR, .value = { .string = "+ 2.97 Volts", }, }, }, { /* Blade 3.3 Volts Low Major - Blade 9 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.9.9", .mib = { .type = ASN_OCTET_STR, .value = { .string = "+ 2.97 Volts", }, }, }, { /* Blade 3.3 Volts Low Major - Blade 10 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.9.10", .mib = { .type = ASN_OCTET_STR, .value = { .string = "+ 2.97 Volts", }, }, }, { /* Blade 3.3 Volts Low Major - Blade 11 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.9.11", .mib = { .type = ASN_OCTET_STR, .value = { .string = "+ 2.97 Volts", }, }, }, { /* Blade 3.3 Volts Low Major - Blade 12 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.9.12", .mib = { .type = ASN_OCTET_STR, .value = { .string = "+ 2.97 Volts", }, }, }, { /* Blade 3.3 Volts Low Major - Blade 13 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.9.13", .mib = { .type = ASN_OCTET_STR, .value = { .string = "+ 2.97 Volts", }, }, }, { /* Blade 3.3 Volts Low Major - Blade 14 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.9.14", .mib = { .type = ASN_OCTET_STR, .value = { .string = "+ 2.97 Volts", }, }, }, { /* Blade 3.3 Volts Up Major - Blade 1 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.8.1", .mib = { .type = ASN_OCTET_STR, .value = { .string = "+ 3.63 Volts", }, }, }, { /* Blade 3.3 Volts Up Major - Blade 2 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.8.2", .mib = { .type = ASN_OCTET_STR, .value = { .string = "+ 3.63 Volts", }, }, }, { /* Blade 3.3 Volts Up Major - Blade 3 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.8.3", .mib = { .type = ASN_OCTET_STR, .value = { .string = "+ 3.63 Volts", }, }, }, { /* Blade 3.3 Volts Up Major - Blade 4 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.8.4", .mib = { .type = ASN_OCTET_STR, .value = { .string = "+ 3.63 Volts", }, }, }, { /* Blade 3.3 Volts Up Major - Blade 5 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.8.5", .mib = { .type = ASN_OCTET_STR, .value = { .string = "+ 3.63 Volts", }, }, }, { /* Blade 3.3 Volts Up Major - Blade 6 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.8.6", .mib = { .type = ASN_OCTET_STR, .value = { .string = "+ 3.63 Volts", }, }, }, { /* Blade 3.3 Volts Up Major - Blade 7 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.8.7", .mib = { .type = ASN_OCTET_STR, .value = { .string = "+ 3.63 Volts", }, }, }, { /* Blade 3.3 Volts Up Major - Blade 8 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.8.8", .mib = { .type = ASN_OCTET_STR, .value = { .string = "+ 3.63 Volts", }, }, }, { /* Blade 3.3 Volts Up Major - Blade 9 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.8.9", .mib = { .type = ASN_OCTET_STR, .value = { .string = "+ 3.63 Volts", }, }, }, { /* Blade 3.3 Volts Up Major - Blade 10 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.8.10", .mib = { .type = ASN_OCTET_STR, .value = { .string = "+ 3.63 Volts", }, }, }, { /* Blade 3.3 Volts Up Major - Blade 11 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.8.11", .mib = { .type = ASN_OCTET_STR, .value = { .string = "+ 3.63 Volts", }, }, }, { /* Blade 3.3 Volts Up Major - Blade 12 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.8.12", .mib = { .type = ASN_OCTET_STR, .value = { .string = "+ 3.63 Volts", }, }, }, { /* Blade 3.3 Volts Up Major - Blade 13 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.8.13", .mib = { .type = ASN_OCTET_STR, .value = { .string = "+ 3.63 Volts", }, }, }, { /* Blade 3.3 Volts Up Major - Blade 14 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.8.14", .mib = { .type = ASN_OCTET_STR, .value = { .string = "+ 3.63 Volts", }, }, }, { /* Blade 12 Volts - Blade 1 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.8.1", .mib = { .type = ASN_OCTET_STR, .value = { .string = "+12.00 Volts", }, }, }, { /* Blade 12 Volts - Blade 2 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.8.2", .mib = { .type = ASN_OCTET_STR, .value = { .string = "+12.00 Volts", }, }, }, { /* Blade 12 Volts - Blade 3 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.8.3", .mib = { .type = ASN_OCTET_STR, .value = { .string = "+12.00 Volts", }, }, }, { /* Blade 12 Volts - Blade 4 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.8.4", .mib = { .type = ASN_OCTET_STR, .value = { .string = "+12.00 Volts", }, }, }, { /* Blade 12 Volts - Blade 5 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.8.5", .mib = { .type = ASN_OCTET_STR, .value = { .string = "+12.00 Volts", }, }, }, { /* Blade 12 Volts - Blade 6 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.8.6", .mib = { .type = ASN_OCTET_STR, .value = { .string = "+12.00 Volts", }, }, }, { /* Blade 12 Volts - Blade 7 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.8.7", .mib = { .type = ASN_OCTET_STR, .value = { .string = "+12.00 Volts", }, }, }, { /* Blade 12 Volts - Blade 8 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.8.8", .mib = { .type = ASN_OCTET_STR, .value = { .string = "+12.00 Volts", }, }, }, { /* Blade 12 Volts - Blade 9 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.8.9", .mib = { .type = ASN_OCTET_STR, .value = { .string = "+12.00 Volts", }, }, }, { /* Blade 12 Volts - Blade 10 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.8.10", .mib = { .type = ASN_OCTET_STR, .value = { .string = "+12.00 Volts", }, }, }, { /* Blade 12 Volts - Blade 11 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.8.11", .mib = { .type = ASN_OCTET_STR, .value = { .string = "+12.00 Volts", }, }, }, { /* Blade 12 Volts - Blade 12 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.8.12", .mib = { .type = ASN_OCTET_STR, .value = { .string = "+12.00 Volts", }, }, }, { /* Blade 12 Volts - Blade 13 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.8.13", .mib = { .type = ASN_OCTET_STR, .value = { .string = "+12.00 Volts", }, }, }, { /* Blade 12 Volts - Blade 14 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.8.14", .mib = { .type = ASN_OCTET_STR, .value = { .string = "+12.00 Volts", }, }, }, { /* Blade 12 Volts Low Major - Blade 1 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.11.1", .mib = { .type = ASN_OCTET_STR, .value = { .string = "+10.80 Volts", }, }, }, { /* Blade 12 Volts Low Major - Blade 2 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.11.2", .mib = { .type = ASN_OCTET_STR, .value = { .string = "+10.80 Volts", }, }, }, { /* Blade 12 Volts Low Major - Blade 3 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.11.3", .mib = { .type = ASN_OCTET_STR, .value = { .string = "+10.80 Volts", }, }, }, { /* Blade 12 Volts Low Major - Blade 4 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.11.4", .mib = { .type = ASN_OCTET_STR, .value = { .string = "+10.80 Volts", }, }, }, { /* Blade 12 Volts Low Major - Blade 5 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.11.5", .mib = { .type = ASN_OCTET_STR, .value = { .string = "+10.80 Volts", }, }, }, { /* Blade 12 Volts Low Major - Blade 6 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.11.6", .mib = { .type = ASN_OCTET_STR, .value = { .string = "+10.80 Volts", }, }, }, { /* Blade 12 Volts Low Major - Blade 7 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.11.7", .mib = { .type = ASN_OCTET_STR, .value = { .string = "+10.80 Volts", }, }, }, { /* Blade 12 Volts Low Major - Blade 8 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.11.8", .mib = { .type = ASN_OCTET_STR, .value = { .string = "+10.80 Volts", }, }, }, { /* Blade 12 Volts Low Major - Blade 9 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.11.9", .mib = { .type = ASN_OCTET_STR, .value = { .string = "+10.80 Volts", }, }, }, { /* Blade 12 Volts Low Major - Blade 10 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.11.10", .mib = { .type = ASN_OCTET_STR, .value = { .string = "+10.80 Volts", }, }, }, { /* Blade 12 Volts Low Major - Blade 11 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.11.11", .mib = { .type = ASN_OCTET_STR, .value = { .string = "+10.80 Volts", }, }, }, { /* Blade 12 Volts Low Major - Blade 12 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.11.12", .mib = { .type = ASN_OCTET_STR, .value = { .string = "+10.80 Volts", }, }, }, { /* Blade 12 Volts Low Major - Blade 13 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.11.13", .mib = { .type = ASN_OCTET_STR, .value = { .string = "+10.80 Volts", }, }, }, { /* Blade 12 Volts Low Major - Blade 14 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.11.14", .mib = { .type = ASN_OCTET_STR, .value = { .string = "+10.80 Volts", }, }, }, { /* Blade 12 Volts Up Major - Blade 1 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.10.1", .mib = { .type = ASN_OCTET_STR, .value = { .string = "+13.20 Volts", }, }, }, { /* Blade 12 Volts Up Major - Blade 2 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.10.2", .mib = { .type = ASN_OCTET_STR, .value = { .string = "+13.20 Volts", }, }, }, { /* Blade 12 Volts Up Major - Blade 3 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.10.3", .mib = { .type = ASN_OCTET_STR, .value = { .string = "+13.20 Volts", }, }, }, { /* Blade 12 Volts Up Major - Blade 4 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.10.4", .mib = { .type = ASN_OCTET_STR, .value = { .string = "+13.20 Volts", }, }, }, { /* Blade 12 Volts Up Major - Blade 5 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.10.5", .mib = { .type = ASN_OCTET_STR, .value = { .string = "+13.20 Volts", }, }, }, { /* Blade 12 Volts Up Major - Blade 6 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.10.6", .mib = { .type = ASN_OCTET_STR, .value = { .string = "+13.20 Volts", }, }, }, { /* Blade 12 Volts Up Major - Blade 7 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.10.7", .mib = { .type = ASN_OCTET_STR, .value = { .string = "+13.20 Volts", }, }, }, { /* Blade 12 Volts Up Major - Blade 8 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.10.8", .mib = { .type = ASN_OCTET_STR, .value = { .string = "+13.20 Volts", }, }, }, { /* Blade 12 Volts Up Major - Blade 9 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.10.9", .mib = { .type = ASN_OCTET_STR, .value = { .string = "+13.20 Volts", }, }, }, { /* Blade 12 Volts Up Major - Blade 10 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.10.10", .mib = { .type = ASN_OCTET_STR, .value = { .string = "+13.20 Volts", }, }, }, { /* Blade 12 Volts Up Major - Blade 11 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.10.11", .mib = { .type = ASN_OCTET_STR, .value = { .string = "+13.20 Volts", }, }, }, { /* Blade 12 Volts Up Major - Blade 12 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.10.12", .mib = { .type = ASN_OCTET_STR, .value = { .string = "+13.20 Volts", }, }, }, { /* Blade 12 Volts Up Major - Blade 13 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.10.13", .mib = { .type = ASN_OCTET_STR, .value = { .string = "+13.20 Volts", }, }, }, { /* Blade 12 Volts Up Major - Blade 14 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.10.14", .mib = { .type = ASN_OCTET_STR, .value = { .string = "+13.20 Volts", }, }, }, { /* Blade 2.5 Volts - Blade 1 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.10.1", .mib = { .type = ASN_OCTET_STR, .value = { .string = "+ 2.50 Volts", }, }, }, { /* Blade 2.5 Volts - Blade 2 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.10.2", .mib = { .type = ASN_OCTET_STR, .value = { .string = "+ 2.50 Volts", }, }, }, { /* Blade 2.5 Volts - Blade 3 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.10.3", .mib = { .type = ASN_OCTET_STR, .value = { .string = "+ 2.50 Volts", }, }, }, { /* Blade 2.5 Volts - Blade 4 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.10.4", .mib = { .type = ASN_OCTET_STR, .value = { .string = "+ 2.50 Volts", }, }, }, { /* Blade 2.5 Volts - Blade 5 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.10.5", .mib = { .type = ASN_OCTET_STR, .value = { .string = "+ 2.50 Volts", }, }, }, { /* Blade 2.5 Volts - Blade 6 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.10.6", .mib = { .type = ASN_OCTET_STR, .value = { .string = "+ 2.50 Volts", }, }, }, { /* Blade 2.5 Volts - Blade 7 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.10.7", .mib = { .type = ASN_OCTET_STR, .value = { .string = "+ 2.50 Volts", }, }, }, { /* Blade 2.5 Volts - Blade 8 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.10.8", .mib = { .type = ASN_OCTET_STR, .value = { .string = "+ 2.50 Volts", }, }, }, { /* Blade 2.5 Volts - Blade 9 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.10.9", .mib = { .type = ASN_OCTET_STR, .value = { .string = "+ 2.50 Volts", }, }, }, { /* Blade 2.5 Volts - Blade 10 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.10.10", .mib = { .type = ASN_OCTET_STR, .value = { .string = "+ 2.50 Volts", }, }, }, { /* Blade 2.5 Volts - Blade 11 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.10.11", .mib = { .type = ASN_OCTET_STR, .value = { .string = "+ 2.50 Volts", }, }, }, { /* Blade 2.5 Volts - Blade 12 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.10.12", .mib = { .type = ASN_OCTET_STR, .value = { .string = "+ 2.50 Volts", }, }, }, { /* Blade 2.5 Volts - Blade 13 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.10.13", .mib = { .type = ASN_OCTET_STR, .value = { .string = "+ 2.50 Volts", }, }, }, { /* Blade 2.5 Volts - Blade 14 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.10.14", .mib = { .type = ASN_OCTET_STR, .value = { .string = "+ 2.50 Volts", }, }, }, { /* Blade 2.5 Volts Low Major - Blade 1 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.15.1", .mib = { .type = ASN_OCTET_STR, .value = { .string = "+ 2.25 Volts", }, }, }, { /* Blade 2.5 Volts Low Major - Blade 2 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.15.2", .mib = { .type = ASN_OCTET_STR, .value = { .string = "+ 2.25 Volts", }, }, }, { /* Blade 2.5 Volts Low Major - Blade 3 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.15.3", .mib = { .type = ASN_OCTET_STR, .value = { .string = "+ 2.25 Volts", }, }, }, { /* Blade 2.5 Volts Low Major - Blade 4 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.15.4", .mib = { .type = ASN_OCTET_STR, .value = { .string = "+ 2.25 Volts", }, }, }, { /* Blade 2.5 Volts Low Major - Blade 5 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.15.5", .mib = { .type = ASN_OCTET_STR, .value = { .string = "+ 2.25 Volts", }, }, }, { /* Blade 2.5 Volts Low Major - Blade 6 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.15.6", .mib = { .type = ASN_OCTET_STR, .value = { .string = "+ 2.25 Volts", }, }, }, { /* Blade 2.5 Volts Low Major - Blade 7 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.15.7", .mib = { .type = ASN_OCTET_STR, .value = { .string = "+ 2.25 Volts", }, }, }, { /* Blade 2.5 Volts Low Major - Blade 8 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.15.8", .mib = { .type = ASN_OCTET_STR, .value = { .string = "+ 2.25 Volts", }, }, }, { /* Blade 2.5 Volts Low Major - Blade 9 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.15.9", .mib = { .type = ASN_OCTET_STR, .value = { .string = "+ 2.25 Volts", }, }, }, { /* Blade 2.5 Volts Low Major - Blade 10 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.15.10", .mib = { .type = ASN_OCTET_STR, .value = { .string = "+ 2.25 Volts", }, }, }, { /* Blade 2.5 Volts Low Major - Blade 11 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.15.11", .mib = { .type = ASN_OCTET_STR, .value = { .string = "+ 2.25 Volts", }, }, }, { /* Blade 2.5 Volts Low Major - Blade 12 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.15.12", .mib = { .type = ASN_OCTET_STR, .value = { .string = "+ 2.25 Volts", }, }, }, { /* Blade 2.5 Volts Low Major - Blade 13 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.15.13", .mib = { .type = ASN_OCTET_STR, .value = { .string = "+ 2.25 Volts", }, }, }, { /* Blade 2.5 Volts Low Major - Blade 14 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.15.14", .mib = { .type = ASN_OCTET_STR, .value = { .string = "+ 2.25 Volts", }, }, }, { /* Blade 2.5 Volts Up Major - Blade 1 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.14.1", .mib = { .type = ASN_OCTET_STR, .value = { .string = "+ 2.95 Volts", }, }, }, { /* Blade 2.5 Volts Up Major - Blade 2 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.14.2", .mib = { .type = ASN_OCTET_STR, .value = { .string = "+ 2.95 Volts", }, }, }, { /* Blade 2.5 Volts Up Major - Blade 3 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.14.3", .mib = { .type = ASN_OCTET_STR, .value = { .string = "+ 2.95 Volts", }, }, }, { /* Blade 2.5 Volts Up Major - Blade 4 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.14.4", .mib = { .type = ASN_OCTET_STR, .value = { .string = "+ 2.95 Volts", }, }, }, { /* Blade 2.5 Volts Up Major - Blade 5 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.14.5", .mib = { .type = ASN_OCTET_STR, .value = { .string = "+ 2.95 Volts", }, }, }, { /* Blade 2.5 Volts Up Major - Blade 6 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.14.6", .mib = { .type = ASN_OCTET_STR, .value = { .string = "+ 2.95 Volts", }, }, }, { /* Blade 2.5 Volts Up Major - Blade 7 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.14.7", .mib = { .type = ASN_OCTET_STR, .value = { .string = "+ 2.95 Volts", }, }, }, { /* Blade 2.5 Volts Up Major - Blade 8 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.14.8", .mib = { .type = ASN_OCTET_STR, .value = { .string = "+ 2.95 Volts", }, }, }, { /* Blade 2.5 Volts Up Major - Blade 9 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.14.9", .mib = { .type = ASN_OCTET_STR, .value = { .string = "+ 2.95 Volts", }, }, }, { /* Blade 2.5 Volts Up Major - Blade 10 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.14.10", .mib = { .type = ASN_OCTET_STR, .value = { .string = "+ 2.95 Volts", }, }, }, { /* Blade 2.5 Volts Up Major - Blade 11 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.14.11", .mib = { .type = ASN_OCTET_STR, .value = { .string = "+ 2.95 Volts", }, }, }, { /* Blade 2.5 Volts Up Major - Blade 12 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.14.12", .mib = { .type = ASN_OCTET_STR, .value = { .string = "+ 2.95 Volts", }, }, }, { /* Blade 2.5 Volts Up Major - Blade 13 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.14.13", .mib = { .type = ASN_OCTET_STR, .value = { .string = "+ 2.95 Volts", }, }, }, { /* Blade 2.5 Volts Up Major - Blade 14 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.14.14", .mib = { .type = ASN_OCTET_STR, .value = { .string = "+ 2.95 Volts", }, }, }, { /* Blade IPMI Voltage Sensor 1 Up Major - Blade 1 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.23.1", .mib = { .type = ASN_OCTET_STR, .value = { .string = "+ 2.95 Volts", }, }, }, { /* Blade IPMI Voltage Sensor 1 Low Major - Blade 1 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.24.1", .mib = { .type = ASN_OCTET_STR, .value = { .string = "+ 1.6 Volts", }, }, }, { /* Blade IPMI Voltage Sensor 25 Up Major - Blade 3 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.71.3", .mib = { .type = ASN_OCTET_STR, .value = { .string = "+ 3.95 Volts", }, }, }, { /* Blade IPMI Voltage Sensor 25 Low Major - Blade 3 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.72.3", .mib = { .type = ASN_OCTET_STR, .value = { .string = "+ 2.5 Volts", }, }, }, { /* Blade 1.5 Volts - Blade 1 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.11.1", .mib = { .type = ASN_OCTET_STR, .value = { .string = "+ 1.50 Volts", }, }, }, { /* Blade 1.5 Volts - Blade 2 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.11.2", .mib = { .type = ASN_OCTET_STR, .value = { .string = "+ 1.50 Volts", }, }, }, { /* Blade 1.5 Volts - Blade 3 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.11.3", .mib = { .type = ASN_OCTET_STR, .value = { .string = "+ 1.50 Volts", }, }, }, { /* Blade 1.5 Volts - Blade 4 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.11.4", .mib = { .type = ASN_OCTET_STR, .value = { .string = "+ 1.50 Volts", }, }, }, { /* Blade 1.5 Volts - Blade 5 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.11.5", .mib = { .type = ASN_OCTET_STR, .value = { .string = "+ 1.50 Volts", }, }, }, { /* Blade 1.5 Volts - Blade 6 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.11.6", .mib = { .type = ASN_OCTET_STR, .value = { .string = "+ 1.50 Volts", }, }, }, { /* Blade 1.5 Volts - Blade 7 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.11.7", .mib = { .type = ASN_OCTET_STR, .value = { .string = "+ 1.50 Volts", }, }, }, { /* Blade 1.5 Volts - Blade 8 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.11.8", .mib = { .type = ASN_OCTET_STR, .value = { .string = "+ 1.50 Volts", }, }, }, { /* Blade 1.5 Volts - Blade 9 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.11.9", .mib = { .type = ASN_OCTET_STR, .value = { .string = "+ 1.50 Volts", }, }, }, { /* Blade 1.5 Volts - Blade 10 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.11.10", .mib = { .type = ASN_OCTET_STR, .value = { .string = "+ 1.50 Volts", }, }, }, { /* Blade 1.5 Volts - Blade 11 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.11.11", .mib = { .type = ASN_OCTET_STR, .value = { .string = "+ 1.50 Volts", }, }, }, { /* Blade 1.5 Volts - Blade 12 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.11.12", .mib = { .type = ASN_OCTET_STR, .value = { .string = "+ 1.50 Volts", }, }, }, { /* Blade 1.5 Volts - Blade 13 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.11.13", .mib = { .type = ASN_OCTET_STR, .value = { .string = "+ 1.50 Volts", }, }, }, { /* Blade 1.5 Volts - Blade 14 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.11.14", .mib = { .type = ASN_OCTET_STR, .value = { .string = "+ 1.50 Volts", }, }, }, { /* Blade 1.5 Volts Low Major - Blade 1 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.17.1", .mib = { .type = ASN_OCTET_STR, .value = { .string = "+ 1.32 Volts", }, }, }, { /* Blade 1.5 Volts Low Major - Blade 2 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.17.2", .mib = { .type = ASN_OCTET_STR, .value = { .string = "+ 1.32 Volts", }, }, }, { /* Blade 1.5 Volts Low Major - Blade 3 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.17.3", .mib = { .type = ASN_OCTET_STR, .value = { .string = "+ 1.32 Volts", }, }, }, { /* Blade 1.5 Volts Low Major - Blade 4 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.17.4", .mib = { .type = ASN_OCTET_STR, .value = { .string = "+ 1.32 Volts", }, }, }, { /* Blade 1.5 Volts Low Major - Blade 5 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.17.5", .mib = { .type = ASN_OCTET_STR, .value = { .string = "+ 1.32 Volts", }, }, }, { /* Blade 1.5 Volts Low Major - Blade 6 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.17.6", .mib = { .type = ASN_OCTET_STR, .value = { .string = "+ 1.32 Volts", }, }, }, { /* Blade 1.5 Volts Low Major - Blade 7 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.17.7", .mib = { .type = ASN_OCTET_STR, .value = { .string = "+ 1.32 Volts", }, }, }, { /* Blade 1.5 Volts Low Major - Blade 8 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.17.8", .mib = { .type = ASN_OCTET_STR, .value = { .string = "+ 1.32 Volts", }, }, }, { /* Blade 1.5 Volts Low Major - Blade 9 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.17.9", .mib = { .type = ASN_OCTET_STR, .value = { .string = "+ 1.32 Volts", }, }, }, { /* Blade 1.5 Volts Low Major - Blade 10 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.17.10", .mib = { .type = ASN_OCTET_STR, .value = { .string = "+ 1.32 Volts", }, }, }, { /* Blade 1.5 Volts Low Major - Blade 11 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.17.11", .mib = { .type = ASN_OCTET_STR, .value = { .string = "+ 1.32 Volts", }, }, }, { /* Blade 1.5 Volts Low Major - Blade 12 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.17.12", .mib = { .type = ASN_OCTET_STR, .value = { .string = "+ 1.32 Volts", }, }, }, { /* Blade 1.5 Volts Low Major - Blade 13 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.17.13", .mib = { .type = ASN_OCTET_STR, .value = { .string = "+ 1.32 Volts", }, }, }, { /* Blade 1.5 Volts Low Major - Blade 14 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.17.14", .mib = { .type = ASN_OCTET_STR, .value = { .string = "+ 1.32 Volts", }, }, }, { /* Blade 1.5 Volts Up Major - Blade 1 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.16.1", .mib = { .type = ASN_OCTET_STR, .value = { .string = "+ 1.68 Volts", }, }, }, { /* Blade 1.5 Volts Up Major - Blade 2 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.16.2", .mib = { .type = ASN_OCTET_STR, .value = { .string = "+ 1.68 Volts", }, }, }, { /* Blade 1.5 Volts Up Major - Blade 3 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.16.3", .mib = { .type = ASN_OCTET_STR, .value = { .string = "+ 1.68 Volts", }, }, }, { /* Blade 1.5 Volts Up Major - Blade 4 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.16.4", .mib = { .type = ASN_OCTET_STR, .value = { .string = "+ 1.68 Volts", }, }, }, { /* Blade 1.5 Volts Up Major - Blade 5 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.16.5", .mib = { .type = ASN_OCTET_STR, .value = { .string = "+ 1.68 Volts", }, }, }, { /* Blade 1.5 Volts Up Major - Blade 6 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.16.6", .mib = { .type = ASN_OCTET_STR, .value = { .string = "+ 1.68 Volts", }, }, }, { /* Blade 1.5 Volts Up Major - Blade 7 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.16.7", .mib = { .type = ASN_OCTET_STR, .value = { .string = "+ 1.68 Volts", }, }, }, { /* Blade 1.5 Volts Up Major - Blade 8 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.16.8", .mib = { .type = ASN_OCTET_STR, .value = { .string = "+ 1.68 Volts", }, }, }, { /* Blade 1.5 Volts Up Major - Blade 9 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.16.9", .mib = { .type = ASN_OCTET_STR, .value = { .string = "+ 1.68 Volts", }, }, }, { /* Blade 1.5 Volts Up Major - Blade 10 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.16.10", .mib = { .type = ASN_OCTET_STR, .value = { .string = "+ 1.68 Volts", }, }, }, { /* Blade 1.5 Volts Up Major - Blade 11 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.16.11", .mib = { .type = ASN_OCTET_STR, .value = { .string = "+ 1.68 Volts", }, }, }, { /* Blade 1.5 Volts Up Major - Blade 12 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.16.12", .mib = { .type = ASN_OCTET_STR, .value = { .string = "+ 1.68 Volts", }, }, }, { /* Blade 1.5 Volts Up Major - Blade 13 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.16.13", .mib = { .type = ASN_OCTET_STR, .value = { .string = "+ 1.68 Volts", }, }, }, { /* Blade 1.5 Volts Up Major - Blade 14 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.16.14", .mib = { .type = ASN_OCTET_STR, .value = { .string = "+ 1.68 Volts", }, }, }, { /* Blade 1.25 Volts - Blade 1 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.12.1", .mib = { .type = ASN_OCTET_STR, .value = { .string = "+ 1.25 Volts", }, }, }, { /* Blade 1.25 Volts - Blade 2 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.12.2", .mib = { .type = ASN_OCTET_STR, .value = { .string = "+ 1.25 Volts", }, }, }, { /* Blade 1.25 Volts - Blade 3 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.12.3", .mib = { .type = ASN_OCTET_STR, .value = { .string = "+ 1.25 Volts", }, }, }, { /* Blade 1.25 Volts - Blade 4 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.12.4", .mib = { .type = ASN_OCTET_STR, .value = { .string = "+ 1.25 Volts", }, }, }, { /* Blade 1.25 Volts - Blade 5 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.12.5", .mib = { .type = ASN_OCTET_STR, .value = { .string = "+ 1.25 Volts", }, }, }, { /* Blade 1.25 Volts - Blade 6 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.12.6", .mib = { .type = ASN_OCTET_STR, .value = { .string = "+ 1.25 Volts", }, }, }, { /* Blade 1.25 Volts - Blade 7 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.12.7", .mib = { .type = ASN_OCTET_STR, .value = { .string = "+ 1.25 Volts", }, }, }, { /* Blade 1.25 Volts - Blade 8 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.12.8", .mib = { .type = ASN_OCTET_STR, .value = { .string = "+ 1.25 Volts", }, }, }, { /* Blade 1.25 Volts - Blade 9 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.12.9", .mib = { .type = ASN_OCTET_STR, .value = { .string = "+ 1.25 Volts", }, }, }, { /* Blade 1.25 Volts - Blade 10 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.12.10", .mib = { .type = ASN_OCTET_STR, .value = { .string = "+ 1.25 Volts", }, }, }, { /* Blade 1.25 Volts - Blade 11 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.12.11", .mib = { .type = ASN_OCTET_STR, .value = { .string = "+ 1.25 Volts", }, }, }, { /* Blade 1.25 Volts - Blade 12 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.12.12", .mib = { .type = ASN_OCTET_STR, .value = { .string = "+ 1.25 Volts", }, }, }, { /* Blade 1.25 Volts - Blade 13 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.12.13", .mib = { .type = ASN_OCTET_STR, .value = { .string = "+ 1.25 Volts", }, }, }, { /* Blade 1.25 Volts - Blade 14 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.12.14", .mib = { .type = ASN_OCTET_STR, .value = { .string = "+ 1.25 Volts", }, }, }, { /* Blade 1.25 Volts Low Major - Blade 1 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.19.1", .mib = { .type = ASN_OCTET_STR, .value = { .string = "+ 1.10 Volts", }, }, }, { /* Blade 1.25 Volts Low Major - Blade 2 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.19.2", .mib = { .type = ASN_OCTET_STR, .value = { .string = "+ 1.10 Volts", }, }, }, { /* Blade 1.25 Volts Low Major - Blade 3 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.19.3", .mib = { .type = ASN_OCTET_STR, .value = { .string = "+ 1.10 Volts", }, }, }, { /* Blade 1.25 Volts Low Major - Blade 4 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.19.4", .mib = { .type = ASN_OCTET_STR, .value = { .string = "+ 1.10 Volts", }, }, }, { /* Blade 1.25 Volts Low Major - Blade 5 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.19.5", .mib = { .type = ASN_OCTET_STR, .value = { .string = "+ 1.10 Volts", }, }, }, { /* Blade 1.25 Volts Low Major - Blade 6 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.19.6", .mib = { .type = ASN_OCTET_STR, .value = { .string = "+ 1.10 Volts", }, }, }, { /* Blade 1.25 Volts Low Major - Blade 7 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.19.7", .mib = { .type = ASN_OCTET_STR, .value = { .string = "+ 1.10 Volts", }, }, }, { /* Blade 1.25 Volts Low Major - Blade 8 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.19.8", .mib = { .type = ASN_OCTET_STR, .value = { .string = "+ 1.10 Volts", }, }, }, { /* Blade 1.25 Volts Low Major - Blade 9 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.19.9", .mib = { .type = ASN_OCTET_STR, .value = { .string = "+ 1.10 Volts", }, }, }, { /* Blade 1.25 Volts Low Major - Blade 10 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.19.10", .mib = { .type = ASN_OCTET_STR, .value = { .string = "+ 1.10 Volts", }, }, }, { /* Blade 1.25 Volts Low Major - Blade 11 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.19.11", .mib = { .type = ASN_OCTET_STR, .value = { .string = "+ 1.10 Volts", }, }, }, { /* Blade 1.25 Volts Low Major - Blade 12 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.19.12", .mib = { .type = ASN_OCTET_STR, .value = { .string = "+ 1.10 Volts", }, }, }, { /* Blade 1.25 Volts Low Major - Blade 13 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.19.13", .mib = { .type = ASN_OCTET_STR, .value = { .string = "+ 1.10 Volts", }, }, }, { /* Blade 1.25 Volts Low Major - Blade 14 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.19.14", .mib = { .type = ASN_OCTET_STR, .value = { .string = "+ 1.10 Volts", }, }, }, { /* Blade 1.25 Volts Up Major - Blade 1 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.18.1", .mib = { .type = ASN_OCTET_STR, .value = { .string = "+ 1.40 Volts", }, }, }, { /* Blade 1.25 Volts Up Major - Blade 2 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.18.2", .mib = { .type = ASN_OCTET_STR, .value = { .string = "+ 1.40 Volts", }, }, }, { /* Blade 1.25 Volts Up Major - Blade 3 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.18.3", .mib = { .type = ASN_OCTET_STR, .value = { .string = "+ 1.40 Volts", }, }, }, { /* Blade 1.25 Volts Up Major - Blade 4 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.18.4", .mib = { .type = ASN_OCTET_STR, .value = { .string = "+ 1.40 Volts", }, }, }, { /* Blade 1.25 Volts Up Major - Blade 5 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.18.5", .mib = { .type = ASN_OCTET_STR, .value = { .string = "+ 1.40 Volts", }, }, }, { /* Blade 1.25 Volts Up Major - Blade 6 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.18.6", .mib = { .type = ASN_OCTET_STR, .value = { .string = "+ 1.40 Volts", }, }, }, { /* Blade 1.25 Volts Up Major - Blade 7 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.18.7", .mib = { .type = ASN_OCTET_STR, .value = { .string = "+ 1.40 Volts", }, }, }, { /* Blade 1.25 Volts Up Major - Blade 8 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.18.8", .mib = { .type = ASN_OCTET_STR, .value = { .string = "+ 1.40 Volts", }, }, }, { /* Blade 1.25 Volts Up Major - Blade 9 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.18.9", .mib = { .type = ASN_OCTET_STR, .value = { .string = "+ 1.40 Volts", }, }, }, { /* Blade 1.25 Volts Up Major - Blade 10 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.18.10", .mib = { .type = ASN_OCTET_STR, .value = { .string = "+ 1.40 Volts", }, }, }, { /* Blade 1.25 Volts Up Major - Blade 11 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.18.11", .mib = { .type = ASN_OCTET_STR, .value = { .string = "+ 1.40 Volts", }, }, }, { /* Blade 1.25 Volts Up Major - Blade 12 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.18.12", .mib = { .type = ASN_OCTET_STR, .value = { .string = "+ 1.40 Volts", }, }, }, { /* Blade 1.25 Volts Up Major - Blade 13 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.18.13", .mib = { .type = ASN_OCTET_STR, .value = { .string = "+ 1.40 Volts", }, }, }, { /* Blade 1.25 Volts Up Major - Blade 14 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.18.14", .mib = { .type = ASN_OCTET_STR, .value = { .string = "+ 1.40 Volts", }, }, }, { /* Blade VRM 1 Volts - Blade 1 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.13.1", .mib = { .type = ASN_OCTET_STR, .value = { .string = "+ 1.49 Volts", }, }, }, { /* Blade VRM 1 Volts - Blade 2 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.13.2", .mib = { .type = ASN_OCTET_STR, .value = { .string = "+ 1.49 Volts", }, }, }, { /* Blade VRM 1 Volts - Blade 3 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.13.3", .mib = { .type = ASN_OCTET_STR, .value = { .string = "+ 1.49 Volts", }, }, }, { /* Blade VRM 1 Volts - Blade 4 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.13.4", .mib = { .type = ASN_OCTET_STR, .value = { .string = "+ 1.49 Volts", }, }, }, { /* Blade VRM 1 Volts - Blade 5 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.13.5", .mib = { .type = ASN_OCTET_STR, .value = { .string = "+ 1.49 Volts", }, }, }, { /* Blade VRM 1 Volts - Blade 6 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.13.6", .mib = { .type = ASN_OCTET_STR, .value = { .string = "+ 1.49 Volts", }, }, }, { /* Blade VRM 1 Volts - Blade 7 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.13.7", .mib = { .type = ASN_OCTET_STR, .value = { .string = "+ 1.49 Volts", }, }, }, { /* Blade VRM 1 Volts - Blade 8 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.13.8", .mib = { .type = ASN_OCTET_STR, .value = { .string = "+ 1.49 Volts", }, }, }, { /* Blade VRM 1 Volts - Blade 9 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.13.9", .mib = { .type = ASN_OCTET_STR, .value = { .string = "+ 1.49 Volts", }, }, }, { /* Blade VRM 1 Volts - Blade 10 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.13.10", .mib = { .type = ASN_OCTET_STR, .value = { .string = "+ 1.49 Volts", }, }, }, { /* Blade VRM 1 Volts - Blade 11 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.13.11", .mib = { .type = ASN_OCTET_STR, .value = { .string = "+ 1.49 Volts", }, }, }, { /* Blade VRM 1 Volts - Blade 12 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.13.12", .mib = { .type = ASN_OCTET_STR, .value = { .string = "+ 1.49 Volts", }, }, }, { /* Blade VRM 1 Volts - Blade 13 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.13.13", .mib = { .type = ASN_OCTET_STR, .value = { .string = "+ 1.49 Volts", }, }, }, { /* Blade VRM 1 Volts - Blade 14 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.13.14", .mib = { .type = ASN_OCTET_STR, .value = { .string = "+ 1.49 Volts", }, }, }, { /* Blade IPMI Voltage Capability - Blade 1 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.14.1", .mib = { .type = ASN_INTEGER, .value = { .integer = 0, }, }, }, { /* Blade IPMI Voltage Capability - Blade 2 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.14.2", .mib = { .type = ASN_INTEGER, .value = { .integer = 0, }, }, }, { /* Blade IPMI Voltage Capability - Blade 3 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.14.3", .mib = { .type = ASN_INTEGER, .value = { .integer = 1, }, }, }, { /* Blade IPMI Voltage Capability - Blade 4 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.14.4", .mib = { .type = ASN_INTEGER, .value = { .integer = 0, }, }, }, { /* Blade IPMI Voltage Capability - Blade 5 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.14.5", .mib = { .type = ASN_INTEGER, .value = { .integer = 0, }, }, }, { /* Blade IPMI Voltage Capability - Blade 6 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.14.6", .mib = { .type = ASN_INTEGER, .value = { .integer = 0, }, }, }, { /* Blade IPMI Voltage Capability - Blade 7 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.14.7", .mib = { .type = ASN_INTEGER, .value = { .integer = 0, }, }, }, { /* Blade IPMI Voltage Capability - Blade 8 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.14.8", .mib = { .type = ASN_INTEGER, .value = { .integer = 0, }, }, }, { /* Blade IPMI Voltage Capability - Blade 9 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.14.9", .mib = { .type = ASN_INTEGER, .value = { .integer = 0, }, }, }, { /* Blade IPMI Voltage Capability - Blade 10 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.14.10", .mib = { .type = ASN_INTEGER, .value = { .integer = 0, }, }, }, { /* Blade IPMI Voltage Capability - Blade 11 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.14.11", .mib = { .type = ASN_INTEGER, .value = { .integer = 0, }, }, }, { /* Blade IPMI Voltage Capability - Blade 12 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.14.12", .mib = { .type = ASN_INTEGER, .value = { .integer = 0, }, }, }, { /* Blade IPMI Voltage Capability - Blade 13 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.14.13", .mib = { .type = ASN_INTEGER, .value = { .integer = 0, }, }, }, { /* Blade IPMI Voltage Capability - Blade 14 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.14.14", .mib = { .type = ASN_INTEGER, .value = { .integer = 0, }, }, }, { /* Blade IPMI Voltage Sensor 1 - Blade 1 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.15.1", .mib = { .type = ASN_OCTET_STR, .value = { .string = "1.8VSB Sense = +3.2 Volts", }, }, }, { /* Blade IPMI Voltage Sensor 2 - Blade 1 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.16.1", .mib = { .type = ASN_OCTET_STR, .value = { .string = "(No voltage)", }, }, }, { /* Blade IPMI Voltage Sensor 3 - Blade 1 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.17.1", .mib = { .type = ASN_OCTET_STR, .value = { .string = "(No voltage)", }, }, }, { /* Blade IPMI Voltage Sensor 4 - Blade 1 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.18.1", .mib = { .type = ASN_OCTET_STR, .value = { .string = "(No voltage)", }, }, }, { /* Blade IPMI Voltage Sensor 5 - Blade 1 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.19.1", .mib = { .type = ASN_OCTET_STR, .value = { .string = "(No voltage)", }, }, }, { /* Blade IPMI Voltage Sensor 6 - Blade 1 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.20.1", .mib = { .type = ASN_OCTET_STR, .value = { .string = "(No voltage)", }, }, }, { /* Blade IPMI Voltage Sensor 7 - Blade 1 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.21.1", .mib = { .type = ASN_OCTET_STR, .value = { .string = "(No voltage)", }, }, }, { /* Blade IPMI Voltage Sensor 8 - Blade 1 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.22.1", .mib = { .type = ASN_OCTET_STR, .value = { .string = "(No voltage)", }, }, }, { /* Blade IPMI Voltage Sensor 9 - Blade 1 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.23.1", .mib = { .type = ASN_OCTET_STR, .value = { .string = "(No voltage)", }, }, }, { /* Blade IPMI Voltage Sensor 10 - Blade 1 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.24.1", .mib = { .type = ASN_OCTET_STR, .value = { .string = "(No voltage)", }, }, }, { /* Blade IPMI Voltage Sensor 11 - Blade 1 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.25.1", .mib = { .type = ASN_OCTET_STR, .value = { .string = "(No voltage)", }, }, }, { /* Blade IPMI Voltage Sensor 12 - Blade 1 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.26.1", .mib = { .type = ASN_OCTET_STR, .value = { .string = "(No voltage)", }, }, }, { /* Blade IPMI Voltage Sensor 13 - Blade 1 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.27.1", .mib = { .type = ASN_OCTET_STR, .value = { .string = "(No voltage)", }, }, }, { /* Blade IPMI Voltage Sensor 14 - Blade 1 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.28.1", .mib = { .type = ASN_OCTET_STR, .value = { .string = "(No voltage)", }, }, }, { /* Blade IPMI Voltage Sensor 15 - Blade 1 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.29.1", .mib = { .type = ASN_OCTET_STR, .value = { .string = "(No voltage)", }, }, }, { /* Blade IPMI Voltage Sensor 16 - Blade 1 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.30.1", .mib = { .type = ASN_OCTET_STR, .value = { .string = "(No voltage)", }, }, }, { /* Blade IPMI Voltage Sensor 17 - Blade 1 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.31.1", .mib = { .type = ASN_OCTET_STR, .value = { .string = "(No voltage)", }, }, }, { /* Blade IPMI Voltage Sensor 18 - Blade 1 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.32.1", .mib = { .type = ASN_OCTET_STR, .value = { .string = "(No voltage)", }, }, }, { /* Blade IPMI Voltage Sensor 19 - Blade 1 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.33.1", .mib = { .type = ASN_OCTET_STR, .value = { .string = "(No voltage)", }, }, }, { /* Blade IPMI Voltage Sensor 20 - Blade 1 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.34.1", .mib = { .type = ASN_OCTET_STR, .value = { .string = "(No voltage)", }, }, }, { /* Blade IPMI Voltage Sensor 21 - Blade 1 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.35.1", .mib = { .type = ASN_OCTET_STR, .value = { .string = "(No voltage)", }, }, }, { /* Blade IPMI Voltage Sensor 22 - Blade 1 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.36.1", .mib = { .type = ASN_OCTET_STR, .value = { .string = "(No voltage)", }, }, }, { /* Blade IPMI Voltage Sensor 23 - Blade 1 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.37.1", .mib = { .type = ASN_OCTET_STR, .value = { .string = "(No voltage)", }, }, }, { /* Blade IPMI Voltage Sensor 24 - Blade 1 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.38.1", .mib = { .type = ASN_OCTET_STR, .value = { .string = "(No voltage)", }, }, }, { /* Blade IPMI Voltage Sensor 25 - Blade 1 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.39.1", .mib = { .type = ASN_OCTET_STR, .value = { .string = "(No voltage)", }, }, }, { /* Blade IPMI Voltage Sensor 1 - Blade 3 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.15.3", .mib = { .type = ASN_OCTET_STR, .value = { .string = "2.5V Sense = +2.50 Volts", }, }, }, { /* Blade IPMI Voltage Sensor 2 - Blade 3 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.16.3", .mib = { .type = ASN_OCTET_STR, .value = { .string = "(No voltage)", }, }, }, { /* Blade IPMI Voltage Sensor 3 - Blade 3 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.17.3", .mib = { .type = ASN_OCTET_STR, .value = { .string = "(No voltage)", }, }, }, { /* Blade IPMI Voltage Sensor 4 - Blade 3 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.18.3", .mib = { .type = ASN_OCTET_STR, .value = { .string = "(No voltage)", }, }, }, { /* Blade IPMI Voltage Sensor 5 - Blade 3 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.19.3", .mib = { .type = ASN_OCTET_STR, .value = { .string = "(No voltage)", }, }, }, { /* Blade IPMI Voltage Sensor 6 - Blade 3 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.20.3", .mib = { .type = ASN_OCTET_STR, .value = { .string = "(No voltage)", }, }, }, { /* Blade IPMI Voltage Sensor 7 - Blade 3 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.21.3", .mib = { .type = ASN_OCTET_STR, .value = { .string = "(No voltage)", }, }, }, { /* Blade IPMI Voltage Sensor 8 - Blade 3 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.22.3", .mib = { .type = ASN_OCTET_STR, .value = { .string = "(No voltage)", }, }, }, { /* Blade IPMI Voltage Sensor 9 - Blade 3 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.23.3", .mib = { .type = ASN_OCTET_STR, .value = { .string = "(No voltage)", }, }, }, { /* Blade IPMI Voltage Sensor 10 - Blade 3 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.24.3", .mib = { .type = ASN_OCTET_STR, .value = { .string = "(No voltage)", }, }, }, { /* Blade IPMI Voltage Sensor 11 - Blade 3 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.25.3", .mib = { .type = ASN_OCTET_STR, .value = { .string = "(No voltage)", }, }, }, { /* Blade IPMI Voltage Sensor 12 - Blade 3 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.26.3", .mib = { .type = ASN_OCTET_STR, .value = { .string = "(No voltage)", }, }, }, { /* Blade IPMI Voltage Sensor 13 - Blade 3 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.27.3", .mib = { .type = ASN_OCTET_STR, .value = { .string = "(No voltage)", }, }, }, { /* Blade IPMI Voltage Sensor 14 - Blade 3 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.28.3", .mib = { .type = ASN_OCTET_STR, .value = { .string = "(No voltage)", }, }, }, { /* Blade IPMI Voltage Sensor 15 - Blade 3 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.29.3", .mib = { .type = ASN_OCTET_STR, .value = { .string = "(No voltage)", }, }, }, { /* Blade IPMI Voltage Sensor 16 - Blade 3 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.30.3", .mib = { .type = ASN_OCTET_STR, .value = { .string = "(No voltage)", }, }, }, { /* Blade IPMI Voltage Sensor 17 - Blade 3 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.31.3", .mib = { .type = ASN_OCTET_STR, .value = { .string = "(No voltage)", }, }, }, { /* Blade IPMI Voltage Sensor 18 - Blade 3 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.32.3", .mib = { .type = ASN_OCTET_STR, .value = { .string = "(No voltage)", }, }, }, { /* Blade IPMI Voltage Sensor 19 - Blade 3 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.33.3", .mib = { .type = ASN_OCTET_STR, .value = { .string = "(No voltage)", }, }, }, { /* Blade IPMI Voltage Sensor 20 - Blade 3 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.34.3", .mib = { .type = ASN_OCTET_STR, .value = { .string = "(No voltage)", }, }, }, { /* Blade IPMI Voltage Sensor 21 - Blade 3 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.35.3", .mib = { .type = ASN_OCTET_STR, .value = { .string = "(No voltage)", }, }, }, { /* Blade IPMI Voltage Sensor 22 - Blade 3 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.36.3", .mib = { .type = ASN_OCTET_STR, .value = { .string = "(No voltage)", }, }, }, { /* Blade IPMI Voltage Sensor 23 - Blade 3 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.37.3", .mib = { .type = ASN_OCTET_STR, .value = { .string = "(No voltage)", }, }, }, { /* Blade IPMI Voltage Sensor 24 - Blade 3 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.38.3", .mib = { .type = ASN_OCTET_STR, .value = { .string = "(No voltage)", }, }, }, { /* Blade IPMI Voltage Sensor 25 - Blade 3 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.39.3", .mib = { .type = ASN_OCTET_STR, .value = { .string = "3.3VSB Sense = + 3.33 Volts", }, }, }, { /* Bower Fan Speed - Blower 1 */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.3.1.0", .mib = { .type = ASN_OCTET_STR, .value = { .string = " 67% of maximum", }, }, }, { /* Bower Fan Speed - Blower 2 */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.3.2.0", .mib = { .type = ASN_OCTET_STR, .value = { .string = "100% of maximum", }, }, }, { /* Bower Fan Speed - Blower 3 */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.3.3.0", .mib = { .type = ASN_OCTET_STR, .value = { .string = " 7% of maximum", }, }, }, { /* Bower Fan Speed - Blower 4 */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.3.4.0", .mib = { .type = ASN_OCTET_STR, .value = { .string = "Not Readable!", }, }, }, { /* Chassis Information LED */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.8.1.2.0", .mib = { .type = ASN_INTEGER, .value = { .integer = 0, /* off=0; on=1 */ }, }, }, { /* Chassis Identity LED - BC */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.8.1.4.0", .mib = { .type = ASN_INTEGER, .value = { .integer = 0, /* off=0; on=1; blinking=2; NA=3 */ }, }, }, { /* Chassis Identity LED - BCT */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.8.3.4.0", .mib = { .type = ASN_INTEGER, .value = { .integer = 0, /* off=0; on=1; blinking=2; NA=3 */ }, }, }, { /* Blade Information LED - Blade 1 */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.8.2.1.1.8.1", .mib = { .type = ASN_INTEGER, .value = { .integer = 0, /* off=0; on=1 */ }, }, }, { /* Blade Information LED - Blade 2 */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.8.2.1.1.8.2", .mib = { .type = ASN_INTEGER, .value = { .integer = 0, /* off=0; on=1 */ }, }, }, { /* Blade Information LED - Blade 3 */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.8.2.1.1.8.3", .mib = { .type = ASN_INTEGER, .value = { .integer = 0, /* off=0; on=1 */ }, }, }, { /* Blade Information LED - Blade 4 */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.8.2.1.1.8.4", .mib = { .type = ASN_INTEGER, .value = { .integer = 0, /* off=0; on=1 */ }, }, }, { /* Blade Information LED - Blade 5 */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.8.2.1.1.8.5", .mib = { .type = ASN_INTEGER, .value = { .integer = 0, /* off=0; on=1 */ }, }, }, { /* Blade Information LED - Blade 6 */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.8.2.1.1.8.6", .mib = { .type = ASN_INTEGER, .value = { .integer = 0, /* off=0; on=1 */ }, }, }, { /* Blade Information LED - Blade 7 */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.8.2.1.1.8.7", .mib = { .type = ASN_INTEGER, .value = { .integer = 0, /* off=0; on=1 */ }, }, }, { /* Blade Information LED - Blade 8 */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.8.2.1.1.8.8", .mib = { .type = ASN_INTEGER, .value = { .integer = 0, /* off=0; on=1 */ }, }, }, { /* Blade Information LED - Blade 9 */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.8.2.1.1.8.9", .mib = { .type = ASN_INTEGER, .value = { .integer = 0, /* off=0; on=1 */ }, }, }, { /* Blade Information LED - Blade 10 */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.8.2.1.1.8.10", .mib = { .type = ASN_INTEGER, .value = { .integer = 0, /* off=0; on=1 */ }, }, }, { /* Blade Information LED - Blade 11 */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.8.2.1.1.8.11", .mib = { .type = ASN_INTEGER, .value = { .integer = 0, /* off=0; on=1 */ }, }, }, { /* Blade Information LED - Blade 12 */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.8.2.1.1.8.12", .mib = { .type = ASN_INTEGER, .value = { .integer = 0, /* off=0; on=1 */ }, }, }, { /* Blade Information LED - Blade 13 */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.8.2.1.1.8.13", .mib = { .type = ASN_INTEGER, .value = { .integer = 0, /* off=0; on=1 */ }, }, }, { /* Blade Information LED - Blade 14 */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.8.2.1.1.8.14", .mib = { .type = ASN_INTEGER, .value = { .integer = 0, /* off=0; on=1 */ }, }, }, { /* Blade Identity LED - Blade 1 */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.8.2.1.1.11.1", .mib = { .type = ASN_INTEGER, .value = { .integer = 0, /* off=0; on=1; blinking=2; NA=3 */ }, }, }, { /* Blade Identity LED - Blade 2 */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.8.2.1.1.11.2", .mib = { .type = ASN_INTEGER, .value = { .integer = 0, /* off=0; on=1; blinking=2; NA=3 */ }, }, }, { /* Blade Identity LED - Blade 3 */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.8.2.1.1.11.3", .mib = { .type = ASN_INTEGER, .value = { .integer = 0, /* off=0; on=1; blinking=2; NA=3 */ }, }, }, { /* Blade Identity LED - Blade 4 */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.8.2.1.1.11.4", .mib = { .type = ASN_INTEGER, .value = { .integer = 0, /* off=0; on=1; blinking=2; NA=3 */ }, }, }, { /* Blade Identity LED - Blade 5 */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.8.2.1.1.11.5", .mib = { .type = ASN_INTEGER, .value = { .integer = 0, /* off=0; on=1; blinking=2; NA=3 */ }, }, }, { /* Blade Identity LED - Blade 6 */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.8.2.1.1.11.6", .mib = { .type = ASN_INTEGER, .value = { .integer = 0, /* off=0; on=1; blinking=2; NA=3 */ }, }, }, { /* Blade Identity LED - Blade 7 */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.8.2.1.1.11.7", .mib = { .type = ASN_INTEGER, .value = { .integer = 0, /* off=0; on=1; blinking=2; NA=3 */ }, }, }, { /* Blade Identity LED - Blade 8 */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.8.2.1.1.11.8", .mib = { .type = ASN_INTEGER, .value = { .integer = 0, /* off=0; on=1; blinking=2; NA=3 */ }, }, }, { /* Blade Identity LED - Blade 9 */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.8.2.1.1.11.9", .mib = { .type = ASN_INTEGER, .value = { .integer = 0, /* off=0; on=1; blinking=2; NA=3 */ }, }, }, { /* Blade Identity LED - Blade 10 */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.8.2.1.1.11.10", .mib = { .type = ASN_INTEGER, .value = { .integer = 0, /* off=0; on=1; blinking=2; NA=3 */ }, }, }, { /* Blade Identity LED - Blade 11 */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.8.2.1.1.11.11", .mib = { .type = ASN_INTEGER, .value = { .integer = 0, /* off=0; on=1; blinking=2; NA=3 */ }, }, }, { /* Blade Identity LED - Blade 12 */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.8.2.1.1.11.12", .mib = { .type = ASN_INTEGER, .value = { .integer = 0, /* off=0; on=1; blinking=2; NA=3 */ }, }, }, { /* Blade Identity LED - Blade 13 */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.8.2.1.1.11.13", .mib = { .type = ASN_INTEGER, .value = { .integer = 0, /* off=0; on=1; blinking=2; NA=3 */ }, }, }, { /* Blade Identity LED - Blade 14 */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.8.2.1.1.11.14", .mib = { .type = ASN_INTEGER, .value = { .integer = 0, /* off=0; on=1; blinking=2; NA=3 */ }, }, }, /* Need to test 0 length, maximum, and max +1 strings here */ { /* Chassis Manufacturer VPD */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.21.1.1.5.0", .mib = { .type = ASN_OCTET_STR, .value = { .string = "SLRM", }, }, }, { /* Chassis Product Name VPD */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.21.1.1.1.0", .mib = { .type = ASN_OCTET_STR, .value = { .string = "8677", /* 8677 (BCE); 8720 (BCT DC); 8730 (BCT AC) */ }, }, }, { /* Chassis Product Version VPD */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.21.1.1.6.0", .mib = { .type = ASN_INTEGER, .value = { .integer = 5, }, }, }, { /* Chassis Model Number VPD */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.21.1.1.2.0", .mib = { .type = ASN_OCTET_STR, .value = { .string = "1XX", }, }, }, { /* Chassis Serial Number VPD */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.21.1.1.3.0", .mib = { .type = ASN_OCTET_STR, .value = { .string = "78F9128", }, }, }, { /* Chassis Part Number VPD */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.21.1.1.7.0", .mib = { .type = ASN_OCTET_STR, .value = { .string = "59P6609", }, }, }, { /* Management Module Manufacturer VPD - MM 1 */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.21.2.1.1.3.1", .mib = { .type = ASN_OCTET_STR, .value = { .string = "SLRM", }, }, }, { /* Management Module Manufacturer VPD - MM 2 */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.21.2.1.1.3.2", .mib = { .type = ASN_OCTET_STR, .value = { .string = "SLRM", }, }, }, { /* Management Module Product Version VPD - MM 1 */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.21.2.1.1.5.1", .mib = { .type = ASN_INTEGER, .value = { .integer = 4, }, }, }, { /* Management Module Product Version VPD - MM 2 */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.21.2.1.1.5.2", .mib = { .type = ASN_INTEGER, .value = { .integer = 4, }, }, }, { /* Management Module Part Number VPD - MM 1 */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.21.2.1.1.4.1", .mib = { .type = ASN_OCTET_STR, .value = { .string = "73P9273", }, }, }, { /* Management Module Part Number VPD - MM 2 */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.21.2.1.1.4.2", .mib = { .type = ASN_OCTET_STR, .value = { .string = "73P9273", }, }, }, { /* Switch Manufacturer VPD - Switch 1 */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.21.6.1.1.3.1", .mib = { .type = ASN_OCTET_STR, .value = { .string = "DLNK", }, }, }, { /* Switch Manufacturer VPD - Switch 2 */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.21.6.1.1.3.2", .mib = { .type = ASN_OCTET_STR, .value = { .string = "DLNK", }, }, }, { /* Switch Manufacturer VPD - Switch 3 */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.21.6.1.1.3.3", .mib = { .type = ASN_OCTET_STR, .value = { .string = "DLNK", }, }, }, { /* Switch Manufacturer VPD - Switch 4 */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.21.6.1.1.3.4", .mib = { .type = ASN_OCTET_STR, .value = { .string = "DLNK", }, }, }, { /* Switch Product Version VPD - Switch 1 */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.21.6.1.1.5.1", .mib = { .type = ASN_INTEGER, .value = { .integer = 2, }, }, }, { /* Switch Product Version VPD - Switch 2 */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.21.6.1.1.5.2", .mib = { .type = ASN_INTEGER, .value = { .integer = 2, }, }, }, { /* Switch Product Version VPD - Switch 3 */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.21.6.1.1.5.3", .mib = { .type = ASN_INTEGER, .value = { .integer = 2, }, }, }, { /* Switch Product Version VPD - Switch 4 */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.21.6.1.1.5.4", .mib = { .type = ASN_INTEGER, .value = { .integer = 2, }, }, }, { /* Switch Part Number VPD - Switch 1 */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.21.6.1.1.4.1", .mib = { .type = ASN_OCTET_STR, .value = { .string = "59P6620", }, }, }, { /* Switch Part Number VPD - Switch 2 */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.21.6.1.1.4.2", .mib = { .type = ASN_OCTET_STR, .value = { .string = "59P6620", }, }, }, { /* Switch Part Number VPD - Switch 3 */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.21.6.1.1.4.3", .mib = { .type = ASN_OCTET_STR, .value = { .string = "59P6620", }, }, }, { /* Switch Part Number VPD - Switch 4 */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.21.6.1.1.4.4", .mib = { .type = ASN_OCTET_STR, .value = { .string = "59P6620", }, }, }, { /* Blade Manufacturer VPD - Blade 1 */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.21.4.1.1.3.1", .mib = { .type = ASN_OCTET_STR, .value = { .string = "SLRM", }, }, }, { /* Blade Manufacturer VPD - Blade 2 */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.21.4.1.1.3.2", .mib = { .type = ASN_OCTET_STR, .value = { .string = "SLRM", }, }, }, { /* Blade Manufacturer VPD - Blade 3 */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.21.4.1.1.3.3", .mib = { .type = ASN_OCTET_STR, .value = { .string = "SLRM", }, }, }, { /* Blade Manufacturer VPD - Blade 4 */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.21.4.1.1.3.4", .mib = { .type = ASN_OCTET_STR, .value = { .string = "SLRM", }, }, }, { /* Blade Manufacturer VPD - Blade 5 */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.21.4.1.1.3.5", .mib = { .type = ASN_OCTET_STR, .value = { .string = "SLRM", }, }, }, { /* Blade Manufacturer VPD - Blade 6 */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.21.4.1.1.3.6", .mib = { .type = ASN_OCTET_STR, .value = { .string = "SLRM", }, }, }, { /* Blade Manufacturer VPD - Blade 7 */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.21.4.1.1.3.7", .mib = { .type = ASN_OCTET_STR, .value = { .string = "SLRM", }, }, }, { /* Blade Manufacturer VPD - Blade 8 */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.21.4.1.1.3.8", .mib = { .type = ASN_OCTET_STR, .value = { .string = "SLRM", }, }, }, { /* Blade Manufacturer VPD - Blade 9 */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.21.4.1.1.3.9", .mib = { .type = ASN_OCTET_STR, .value = { .string = "SLRM", }, }, }, { /* Blade Manufacturer VPD - Blade 10 */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.21.4.1.1.3.10", .mib = { .type = ASN_OCTET_STR, .value = { .string = "SLRM", }, }, }, { /* Blade Manufacturer VPD - Blade 11 */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.21.4.1.1.3.11", .mib = { .type = ASN_OCTET_STR, .value = { .string = "SLRM", }, }, }, { /* Blade Manufacturer VPD - Blade 12 */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.21.4.1.1.3.12", .mib = { .type = ASN_OCTET_STR, .value = { .string = "SLRM", }, }, }, { /* Blade Manufacturer VPD - Blade 13 */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.21.4.1.1.3.13", .mib = { .type = ASN_OCTET_STR, .value = { .string = "SLRM", }, }, }, { /* Blade Manufacturer VPD - Blade 14 */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.21.4.1.1.3.14", .mib = { .type = ASN_OCTET_STR, .value = { .string = "SLRM", }, }, }, { /* Blade Product Name VPD - Blade 1 */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.21.4.1.1.7.1", .mib = { .type = ASN_OCTET_STR, .value = { .string = "867821Z", }, }, }, { /* Blade Product Name VPD - Blade 2 */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.21.4.1.1.7.2", .mib = { .type = ASN_OCTET_STR, .value = { .string = "867821Z", }, }, }, { /* Blade Product Name VPD - Blade 3 */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.21.4.1.1.7.3", .mib = { .type = ASN_OCTET_STR, .value = { .string = "867821Z", }, }, }, { /* Blade Product Name VPD - Blade 4 */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.21.4.1.1.7.4", .mib = { .type = ASN_OCTET_STR, .value = { .string = "867821Z", }, }, }, { /* Blade Product Name VPD - Blade 5 */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.21.4.1.1.7.5", .mib = { .type = ASN_OCTET_STR, .value = { .string = "867821Z", }, }, }, { /* Blade Product Name VPD - Blade 6 */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.21.4.1.1.7.6", .mib = { .type = ASN_OCTET_STR, .value = { .string = "867821Z", }, }, }, { /* Blade Product Name VPD - Blade 7 */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.21.4.1.1.7.7", .mib = { .type = ASN_OCTET_STR, .value = { .string = "867821Z", }, }, }, { /* Blade Product Name VPD - Blade 8 */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.21.4.1.1.7.8", .mib = { .type = ASN_OCTET_STR, .value = { .string = "867821Z", }, }, }, { /* Blade Product Name VPD - Blade 9 */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.21.4.1.1.7.9", .mib = { .type = ASN_OCTET_STR, .value = { .string = "867821Z", }, }, }, { /* Blade Product Name VPD - Blade 10 */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.21.4.1.1.7.10", .mib = { .type = ASN_OCTET_STR, .value = { .string = "867821Z", }, }, }, { /* Blade Product Name VPD - Blade 11 */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.21.4.1.1.7.11", .mib = { .type = ASN_OCTET_STR, .value = { .string = "867821Z", }, }, }, { /* Blade Product Name VPD - Blade 12 */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.21.4.1.1.7.12", .mib = { .type = ASN_OCTET_STR, .value = { .string = "867821Z", }, }, }, { /* Blade Product Name VPD - Blade 13 */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.21.4.1.1.7.13", .mib = { .type = ASN_OCTET_STR, .value = { .string = "867821Z", }, }, }, { /* Blade Product Name VPD - Blade 14 */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.21.4.1.1.7.14", .mib = { .type = ASN_OCTET_STR, .value = { .string = "867821Z", }, }, }, { /* Blade Product Version VPD - Blade 1 */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.21.4.1.1.5.1", .mib = { .type = ASN_INTEGER, .value = { .integer = 0, }, }, }, { /* Blade Product Version VPD - Blade 2 */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.21.4.1.1.5.2", .mib = { .type = ASN_INTEGER, .value = { .integer = 0, }, }, }, { /* Blade Product Version VPD - Blade 3 */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.21.4.1.1.5.3", .mib = { .type = ASN_INTEGER, .value = { .integer = 0, }, }, }, { /* Blade Product Version VPD - Blade 4 */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.21.4.1.1.5.4", .mib = { .type = ASN_INTEGER, .value = { .integer = 0, }, }, }, { /* Blade Product Version VPD - Blade 5 */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.21.4.1.1.5.5", .mib = { .type = ASN_INTEGER, .value = { .integer = 0, }, }, }, { /* Blade Product Version VPD - Blade 6 */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.21.4.1.1.5.6", .mib = { .type = ASN_INTEGER, .value = { .integer = 0, }, }, }, { /* Blade Product Version VPD - Blade 7 */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.21.4.1.1.5.7", .mib = { .type = ASN_INTEGER, .value = { .integer = 0, }, }, }, { /* Blade Product Version VPD - Blade 8 */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.21.4.1.1.5.8", .mib = { .type = ASN_INTEGER, .value = { .integer = 0, }, }, }, { /* Blade Product Version VPD - Blade 9 */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.21.4.1.1.5.9", .mib = { .type = ASN_INTEGER, .value = { .integer = 0, }, }, }, { /* Blade Product Version VPD - Blade 10 */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.21.4.1.1.5.10", .mib = { .type = ASN_INTEGER, .value = { .integer = 0, }, }, }, { /* Blade Product Version VPD - Blade 11 */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.21.4.1.1.5.11", .mib = { .type = ASN_INTEGER, .value = { .integer = 0, }, }, }, { /* Blade Product Version VPD - Blade 12 */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.21.4.1.1.5.12", .mib = { .type = ASN_INTEGER, .value = { .integer = 0, }, }, }, { /* Blade Product Version VPD - Blade 13 */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.21.4.1.1.5.13", .mib = { .type = ASN_INTEGER, .value = { .integer = 0, }, }, }, { /* Blade Product Version VPD - Blade 14 */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.21.4.1.1.5.14", .mib = { .type = ASN_INTEGER, .value = { .integer = 0, }, }, }, { /* Blade Serial Number VPD - Blade 1 */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.21.4.1.1.6.1", .mib = { .type = ASN_OCTET_STR, .value = { .string = "J1P4A28Y192", }, }, }, { /* Blade Serial Number VPD - Blade 2 */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.21.4.1.1.6.2", .mib = { .type = ASN_OCTET_STR, .value = { .string = "J1P4A28Y192", }, }, }, { /* Blade Serial Number VPD - Blade 3 */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.21.4.1.1.6.3", .mib = { .type = ASN_OCTET_STR, .value = { .string = "J1P4A28Y192", }, }, }, { /* Blade Serial Number VPD - Blade 4 */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.21.4.1.1.6.4", .mib = { .type = ASN_OCTET_STR, .value = { .string = "J1P4A28Y192", }, }, }, { /* Blade Serial Number VPD - Blade 5 */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.21.4.1.1.6.5", .mib = { .type = ASN_OCTET_STR, .value = { .string = "J1P4A28Y192", }, }, }, { /* Blade Serial Number VPD - Blade 6 */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.21.4.1.1.6.6", .mib = { .type = ASN_OCTET_STR, .value = { .string = "J1P4A28Y192", }, }, }, { /* Blade Serial Number VPD - Blade 7 */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.21.4.1.1.6.7", .mib = { .type = ASN_OCTET_STR, .value = { .string = "J1P4A28Y192", }, }, }, { /* Blade Serial Number VPD - Blade 8 */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.21.4.1.1.6.8", .mib = { .type = ASN_OCTET_STR, .value = { .string = "J1P4A28Y192", }, }, }, { /* Blade Serial Number VPD - Blade 9 */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.21.4.1.1.6.9", .mib = { .type = ASN_OCTET_STR, .value = { .string = "J1P4A28Y192", }, }, }, { /* Blade Serial Number VPD - Blade 10 */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.21.4.1.1.6.10", .mib = { .type = ASN_OCTET_STR, .value = { .string = "J1P4A28Y192", }, }, }, { /* Blade Serial Number VPD - Blade 11 */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.21.4.1.1.6.11", .mib = { .type = ASN_OCTET_STR, .value = { .string = "J1P4A28Y192", }, }, }, { /* Blade Serial Number VPD - Blade 12 */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.21.4.1.1.6.12", .mib = { .type = ASN_OCTET_STR, .value = { .string = "J1P4A28Y192", }, }, }, { /* Blade Serial Number VPD - Blade 13 */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.21.4.1.1.6.13", .mib = { .type = ASN_OCTET_STR, .value = { .string = "J1P4A28Y192", }, }, }, { /* Blade Serial Number VPD - Blade 14 */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.21.4.1.1.6.14", .mib = { .type = ASN_OCTET_STR, .value = { .string = "J1P4A28Y192", }, }, }, { /* Blade Part Number VPD - Blade 1 */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.21.4.1.1.4.1", .mib = { .type = ASN_OCTET_STR, .value = { .string = "596610", }, }, }, { /* Blade Part Number VPD - Blade 2 */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.21.4.1.1.4.2", .mib = { .type = ASN_OCTET_STR, .value = { .string = "596610", }, }, }, { /* Blade Part Number VPD - Blade 3 */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.21.4.1.1.4.3", .mib = { .type = ASN_OCTET_STR, .value = { .string = "596610", }, }, }, { /* Blade Part Number VPD - Blade 4 */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.21.4.1.1.4.4", .mib = { .type = ASN_OCTET_STR, .value = { .string = "596610", }, }, }, { /* Blade Part Number VPD - Blade 5 */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.21.4.1.1.4.5", .mib = { .type = ASN_OCTET_STR, .value = { .string = "596610", }, }, }, { /* Blade Part Number VPD - Blade 6 */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.21.4.1.1.4.6", .mib = { .type = ASN_OCTET_STR, .value = { .string = "596610", }, }, }, { /* Blade Part Number VPD - Blade 7 */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.21.4.1.1.4.7", .mib = { .type = ASN_OCTET_STR, .value = { .string = "596610", }, }, }, { /* Blade Part Number VPD - Blade 8 */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.21.4.1.1.4.8", .mib = { .type = ASN_OCTET_STR, .value = { .string = "596610", }, }, }, { /* Blade Part Number VPD - Blade 9 */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.21.4.1.1.4.9", .mib = { .type = ASN_OCTET_STR, .value = { .string = "596610", }, }, }, { /* Blade Part Number VPD - Blade 10 */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.21.4.1.1.4.10", .mib = { .type = ASN_OCTET_STR, .value = { .string = "596610", }, }, }, { /* Blade Part Number VPD - Blade 11 */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.21.4.1.1.4.11", .mib = { .type = ASN_OCTET_STR, .value = { .string = "596610", }, }, }, { /* Blade Part Number VPD - Blade 12 */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.21.4.1.1.4.12", .mib = { .type = ASN_OCTET_STR, .value = { .string = "596610", }, }, }, { /* Blade Part Number VPD - Blade 13 */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.21.4.1.1.4.13", .mib = { .type = ASN_OCTET_STR, .value = { .string = "596610", }, }, }, { /* Blade Part Number VPD - Blade 14 */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.21.4.1.1.4.14", .mib = { .type = ASN_OCTET_STR, .value = { .string = "596610", }, }, }, /* Used to determine if expansion card attached to blade */ { /* BladeServerExpansion - bladeExpBoardVpdBladeBayNumber */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.21.4.3.1.19.1", .mib = { .type = ASN_INTEGER, .value = { .integer = SA_ERR_SNMP_NOSUCHOBJECT, /* .integer = 255, BCT */ }, }, }, { /* BladeServerExpansion - bladeExpBoardVpdCardType */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.21.4.3.1.20.1", .mib = { .type = ASN_INTEGER, .value = { .integer = SA_ERR_SNMP_NOSUCHOBJECT, /* .integer = 255, BCT */ }, }, }, { /* BladeServerExpansion - Blade Add-on 2 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.1.1.14.2", .mib = { .type = ASN_INTEGER, .value = { .integer = 0, }, }, }, { /* BladeServerExpansion - Blade Add-on 3 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.1.1.14.3", .mib = { .type = ASN_INTEGER, .value = { .integer = 1, }, }, }, { /* BladeServerExpansion - Blade Add-on 4 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.1.1.14.4", .mib = { .type = ASN_INTEGER, .value = { .integer = 0, }, }, }, { /* BladeServerExpansion - Blade Add-on 5 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.1.1.14.5", .mib = { .type = ASN_INTEGER, .value = { .integer = 1, }, }, }, { /* BladeServerExpansion - Blade Add-on 6 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.1.1.14.6", .mib = { .type = ASN_INTEGER, .value = { .integer = 0, }, }, }, { /* BladeServerExpansion - Blade Add-on 7 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.1.1.14.7", .mib = { .type = ASN_INTEGER, .value = { .integer = 1, }, }, }, { /* BladeServerExpansion - Blade Add-on 8 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.1.1.14.8", .mib = { .type = ASN_INTEGER, .value = { .integer = 0, }, }, }, { /* BladeServerExpansion - Blade Add-on 9 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.1.1.14.9", .mib = { .type = ASN_INTEGER, .value = { .integer = 1, }, }, }, { /* BladeServerExpansion - Blade Add-on 10 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.1.1.14.10", .mib = { .type = ASN_INTEGER, .value = { .integer = 0, }, }, }, { /* BladeServerExpansion - Blade Add-on 11 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.1.1.14.11", .mib = { .type = ASN_INTEGER, .value = { .integer = 1, }, }, }, { /* BladeServerExpansion - Blade Add-on 12 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.1.1.14.12", .mib = { .type = ASN_INTEGER, .value = { .integer = 0, }, }, }, { /* BladeServerExpansion - Blade Add-on 13 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.1.1.14.13", .mib = { .type = ASN_INTEGER, .value = { .integer = 1, }, }, }, { /* BladeServerExpansion - Blade Add-on 14 */ .oid = ".1.3.6.1.4.1.2.3.51.2.22.1.5.1.1.14.14", .mib = { .type = ASN_INTEGER, .value = { .integer = 0, }, }, }, { /* Blade Add-on Product Name VPD - Blade Add-on 1 */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.21.4.1.1.25.1", .mib = { .type = ASN_OCTET_STR, .value = { .string = "867821Z", }, }, }, { /* Blade Add-on Product Name VPD - Blade Add-on 2 */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.21.4.1.1.25.2", .mib = { .type = ASN_OCTET_STR, .value = { .string = "867821Z", }, }, }, { /* Blade Add-on Product Name VPD - Blade Add-on 3 */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.21.4.1.1.25.3", .mib = { .type = ASN_OCTET_STR, .value = { .string = "867821Z", }, }, }, { /* Blade Add-on Product Name VPD - Blade Add-on 4 */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.21.4.1.1.25.4", .mib = { .type = ASN_OCTET_STR, .value = { .string = "867821Z", }, }, }, { /* Blade Add-on Product Name VPD - Blade Add-on 5 */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.21.4.1.1.25.5", .mib = { .type = ASN_OCTET_STR, .value = { .string = "867821Z", }, }, }, { /* Blade Add-on Product Name VPD - Blade Add-on 6 */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.21.4.1.1.25.6", .mib = { .type = ASN_OCTET_STR, .value = { .string = "867821Z", }, }, }, { /* Blade Add-on Product Name VPD - Blade Add-on 7 */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.21.4.1.1.25.7", .mib = { .type = ASN_OCTET_STR, .value = { .string = "867821Z", }, }, }, { /* Blade Add-on Product Name VPD - Blade Add-on 8 */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.21.4.1.1.25.8", .mib = { .type = ASN_OCTET_STR, .value = { .string = "867821Z", }, }, }, { /* Blade Add-on Product Name VPD - Blade Add-on 9 */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.21.4.1.1.25.9", .mib = { .type = ASN_OCTET_STR, .value = { .string = "867821Z", }, }, }, { /* Blade Add-on Product Name VPD - Blade Add-on 10 */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.21.4.1.1.25.10", .mib = { .type = ASN_OCTET_STR, .value = { .string = "867821Z", }, }, }, { /* Blade Add-on Product Name VPD - Blade Add-on 11 */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.21.4.1.1.25.11", .mib = { .type = ASN_OCTET_STR, .value = { .string = "867821Z", }, }, }, { /* Blade Add-on Product Name VPD - Blade Add-on 12 */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.21.4.1.1.25.12", .mib = { .type = ASN_OCTET_STR, .value = { .string = "867821Z", }, }, }, { /* Blade Add-on Product Name VPD - Blade Add-on 13 */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.21.4.1.1.25.13", .mib = { .type = ASN_OCTET_STR, .value = { .string = "867821Z", }, }, }, { /* Blade Add-on Product Name VPD - Blade Add-on 14 */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.21.4.1.1.25.14", .mib = { .type = ASN_OCTET_STR, .value = { .string = "867821Z", }, }, }, { /* Blade Add-on Product Version VPD - Blade Add-on 1 */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.21.4.1.1.23.1", .mib = { .type = ASN_INTEGER, .value = { .integer = 0, }, }, }, { /* Blade Add-on Product Version VPD - Blade Add-on 2 */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.21.4.1.1.23.2", .mib = { .type = ASN_INTEGER, .value = { .integer = 0, }, }, }, { /* Blade Add-on Product Version VPD - Blade Add-on 3 */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.21.4.1.1.23.3", .mib = { .type = ASN_INTEGER, .value = { .integer = 0, }, }, }, { /* Blade Add-on Product Version VPD - Blade Add-on 4 */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.21.4.1.1.23.4", .mib = { .type = ASN_INTEGER, .value = { .integer = 0, }, }, }, { /* Blade Add-on Product Version VPD - Blade Add-on 5 */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.21.4.1.1.23.5", .mib = { .type = ASN_INTEGER, .value = { .integer = 0, }, }, }, { /* Blade Add-on Product Version VPD - Blade Add-on 6 */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.21.4.1.1.23.6", .mib = { .type = ASN_INTEGER, .value = { .integer = 0, }, }, }, { /* Blade Add-on Product Version VPD - Blade Add-on 7 */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.21.4.1.1.23.7", .mib = { .type = ASN_INTEGER, .value = { .integer = 0, }, }, }, { /* Blade Add-on Product Version VPD - Blade Add-on 8 */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.21.4.1.1.23.8", .mib = { .type = ASN_INTEGER, .value = { .integer = 0, }, }, }, { /* Blade Add-on Product Version VPD - Blade Add-on 9 */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.21.4.1.1.23.9", .mib = { .type = ASN_INTEGER, .value = { .integer = 0, }, }, }, { /* Blade Add-on Product Version VPD - Blade Add-on 10 */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.21.4.1.1.23.10", .mib = { .type = ASN_INTEGER, .value = { .integer = 0, }, }, }, { /* Blade Add-on Product Version VPD - Blade Add-on 11 */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.21.4.1.1.23.11", .mib = { .type = ASN_INTEGER, .value = { .integer = 0, }, }, }, { /* Blade Add-on Product Version VPD - Blade Add-on 12 */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.21.4.1.1.23.12", .mib = { .type = ASN_INTEGER, .value = { .integer = 0, }, }, }, { /* Blade Add-on Product Version VPD - Blade Add-on 13 */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.21.4.1.1.23.13", .mib = { .type = ASN_INTEGER, .value = { .integer = 0, }, }, }, { /* Blade Add-on Product Version VPD - Blade Add-on 14 */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.21.4.1.1.23.14", .mib = { .type = ASN_INTEGER, .value = { .integer = 0, }, }, }, { /* Blade Add-on Part Number VPD - Blade Add-on 1 */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.21.4.1.1.22.1", .mib = { .type = ASN_OCTET_STR, .value = { .string = "596610", }, }, }, { /* Blade Add-on Part Number VPD - Blade Add-on 2 */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.21.4.1.1.22.2", .mib = { .type = ASN_OCTET_STR, .value = { .string = "596610", }, }, }, { /* Blade Add-on Part Number VPD - Blade Add-on 3 */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.21.4.1.1.22.3", .mib = { .type = ASN_OCTET_STR, .value = { .string = "596610", }, }, }, { /* Blade Add-on Part Number VPD - Blade Add-on 4 */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.21.4.1.1.22.4", .mib = { .type = ASN_OCTET_STR, .value = { .string = "596610", }, }, }, { /* Blade Add-on Part Number VPD - Blade Add-on 5 */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.21.4.1.1.22.5", .mib = { .type = ASN_OCTET_STR, .value = { .string = "596610", }, }, }, { /* Blade Add-on Part Number VPD - Blade Add-on 6 */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.21.4.1.1.22.6", .mib = { .type = ASN_OCTET_STR, .value = { .string = "596610", }, }, }, { /* Blade Add-on Part Number VPD - Blade Add-on 7 */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.21.4.1.1.22.7", .mib = { .type = ASN_OCTET_STR, .value = { .string = "596610", }, }, }, { /* Blade Add-on Part Number VPD - Blade Add-on 8 */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.21.4.1.1.22.8", .mib = { .type = ASN_OCTET_STR, .value = { .string = "596610", }, }, }, { /* Blade Add-on Part Number VPD - Blade Add-on 9 */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.21.4.1.1.22.9", .mib = { .type = ASN_OCTET_STR, .value = { .string = "596610", }, }, }, { /* Blade Add-on Part Number VPD - Blade Add-on 10 */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.21.4.1.1.22.10", .mib = { .type = ASN_OCTET_STR, .value = { .string = "596610", }, }, }, { /* Blade Add-on Part Number VPD - Blade Add-on 11 */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.21.4.1.1.22.11", .mib = { .type = ASN_OCTET_STR, .value = { .string = "596610", }, }, }, { /* Blade Add-on Part Number VPD - Blade Add-on 12 */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.21.4.1.1.22.12", .mib = { .type = ASN_OCTET_STR, .value = { .string = "596610", }, }, }, { /* Blade Add-on Part Number VPD - Blade Add-on 13 */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.21.4.1.1.22.13", .mib = { .type = ASN_OCTET_STR, .value = { .string = "596610", }, }, }, { /* Blade Add-on Part Number VPD - Blade Add-on 14 */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.21.4.1.1.22.14", .mib = { .type = ASN_OCTET_STR, .value = { .string = "596610", }, }, }, { /* Media Tray Manufacturer VPD */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.21.9.3.0", .mib = { .type = ASN_OCTET_STR, .value = { .string = "SLRM", }, }, }, { /* Media Tray Product Version VPD */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.21.9.5.0", .mib = { .type = ASN_INTEGER, .value = { .integer = 5, }, }, }, { /* Media Tray Part Number VPD */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.21.9.4.0", .mib = { .type = ASN_OCTET_STR, .value = { .string = "59P6609", }, }, }, { /* Power Module Manufacturer VPD - PM 1 */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.21.8.1.1.3.1", .mib = { .type = ASN_OCTET_STR, .value = { .string = "SLRM", }, }, }, { /* Power Module Manufacturer VPD - PM 2 */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.21.8.1.1.3.2", .mib = { .type = ASN_OCTET_STR, .value = { .string = "SLRM", }, }, }, { /* Power Module Manufacturer VPD - PM 3 */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.21.8.1.1.3.3", .mib = { .type = ASN_OCTET_STR, .value = { .string = "SLRM", }, }, }, { /* Power Module Manufacturer VPD - PM 4 */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.21.8.1.1.3.4", .mib = { .type = ASN_OCTET_STR, .value = { .string = "SLRM", }, }, }, { /* Power Module Product Version VPD - PM 1 */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.21.8.1.1.5.1", .mib = { .type = ASN_INTEGER, .value = { .integer = 5, }, }, }, { /* Power Module Product Version VPD - PM 2 */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.21.8.1.1.5.2", .mib = { .type = ASN_INTEGER, .value = { .integer = 5, }, }, }, { /* Power Module Product Version VPD - PM 3 */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.21.8.1.1.5.3", .mib = { .type = ASN_INTEGER, .value = { .integer = 5, }, }, }, { /* Power Module Product Version VPD - PM 4 */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.21.8.1.1.5.4", .mib = { .type = ASN_INTEGER, .value = { .integer = 5, }, }, }, { /* Power Module Part Number VPD - PM 1 */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.21.8.1.1.4.1", .mib = { .type = ASN_OCTET_STR, .value = { .string = "59P6609", }, }, }, { /* Power Module Part Number VPD - PM 2 */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.21.8.1.1.4.2", .mib = { .type = ASN_OCTET_STR, .value = { .string = "59P6609", }, }, }, { /* Power Module Part Number VPD - PM 3 */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.21.8.1.1.4.3", .mib = { .type = ASN_OCTET_STR, .value = { .string = "59P6609", }, }, }, { /* Power Module Part Number VPD - PM 4 */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.21.8.1.1.4.4", .mib = { .type = ASN_OCTET_STR, .value = { .string = "59P6609", }, }, }, { /* Blade Name - Blade 1 */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.8.2.1.1.6.1", .mib = { .type = ASN_OCTET_STR, .value = { .string = "Blade 1", }, }, }, { /* Blade Name - Blade 2 */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.8.2.1.1.6.2", .mib = { .type = ASN_OCTET_STR, .value = { .string = "Blade 2", }, }, }, { /* Blade Name - Blade 3 */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.8.2.1.1.6.3", .mib = { .type = ASN_OCTET_STR, .value = { .string = "Blade 3", }, }, }, { /* Blade Name - Blade 4 */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.8.2.1.1.6.4", .mib = { .type = ASN_OCTET_STR, .value = { .string = "Blade 4", }, }, }, { /* Blade Name - Blade 5 */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.8.2.1.1.6.5", .mib = { .type = ASN_OCTET_STR, .value = { .string = "Blade 5", }, }, }, { /* Blade Name - Blade 6 */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.8.2.1.1.6.6", .mib = { .type = ASN_OCTET_STR, .value = { .string = "Blade 6", }, }, }, { /* Blade Name - Blade 7 */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.8.2.1.1.6.7", .mib = { .type = ASN_OCTET_STR, .value = { .string = "Blade 7", }, }, }, { /* Blade Name - Blade 8 */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.8.2.1.1.6.8", .mib = { .type = ASN_OCTET_STR, .value = { .string = "Blade 8", }, }, }, { /* Blade Name - Blade 9 */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.8.2.1.1.6.9", .mib = { .type = ASN_OCTET_STR, .value = { .string = "Blade 9", }, }, }, { /* Blade Name - Blade 10 */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.8.2.1.1.6.10", .mib = { .type = ASN_OCTET_STR, .value = { .string = "Blade 10", }, }, }, { /* Blade Name - Blade 11 */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.8.2.1.1.6.11", .mib = { .type = ASN_OCTET_STR, .value = { .string = "Blade 11", }, }, }, { /* Blade Name - Blade 12 */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.8.2.1.1.6.12", .mib = { .type = ASN_OCTET_STR, .value = { .string = "Blade 12", }, }, }, { /* Blade Name - Blade 13 */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.8.2.1.1.6.13", .mib = { .type = ASN_OCTET_STR, .value = { .string = "Blade 13", }, }, }, { /* Blade Name - Blade 14 */ .oid = ".1.3.6.1.4.1.2.3.51.2.2.8.2.1.1.6.14", .mib = { .type = ASN_OCTET_STR, .value = { .string = "Blade 14", }, }, }, {} /* Terminate array with a null element */ }; openhpi-2.14.1/plugins/snmp_bc/t/tsensorset020.c0000644000076400007640000000365411302566763016356 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * Peter D Phan */ #include #include #include int main(int argc, char **argv) { /* ************************ * Local variables * ***********************/ int testfail = 0; SaErrorT err; SaErrorT expected_err; SaHpiRptEntryT rptentry; SaHpiResourceIdT id = 0; SaHpiSessionIdT sessionid; SaHpiSensorNumT sid = 0; SaHpiSensorThresholdsT thres; /* *************************************** * Find a resource with No Sensor type rdr * ***************************************/ err = tsetup(&sessionid); if (err != SA_OK) { printf("Error! Can not open session for test environment\n"); printf(" File=%s, Line=%d\n", __FILE__, __LINE__); return -1; } err = tfind_resource(&sessionid,SAHPI_CAPABILITY_SENSOR,SAHPI_FIRST_ENTRY, &rptentry, SAHPI_FALSE); if (err != SA_OK) { dbg("Error! Can not find resources for test environment\n"); dbg(" File=%s, Line=%d\n", __FILE__, __LINE__); err = tcleanup(&sessionid); return SA_OK; } id = rptentry.ResourceId; /*************************** * Test : Invalid capability **************************/ expected_err = SA_ERR_HPI_CAPABILITY; err = saHpiSensorThresholdsSet(sessionid, id, sid, &thres); checkstatus(err, expected_err, testfail); /*************************** * Cleanup after all tests ***************************/ err = tcleanup(&sessionid); return testfail; } #include openhpi-2.14.1/plugins/snmp_bc/t/tel002.c0000644000076400007640000000356711302566764014735 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * Peter D Phan */ #include #include #include int main(int argc, char **argv) { /* ************************ * Local variables * ***********************/ int testfail = 0; SaErrorT err; SaErrorT expected_err; SaHpiRptEntryT rptentry; SaHpiResourceIdT id = 0; SaHpiSessionIdT sessionid; SaHpiEventLogInfoT info; /* ************************************* * Find a resource with EventLog type rdr * ************************************* */ err = tsetup(&sessionid); if (err != SA_OK) { printf("Error! Can not open session for test environment\n"); printf(" File=%s, Line=%d\n", __FILE__, __LINE__); return -1; } err = tfind_resource(&sessionid, SAHPI_CAPABILITY_EVENT_LOG, SAHPI_FIRST_ENTRY, &rptentry, SAHPI_TRUE); if (err != SA_OK) { printf("Can not find a control resource for test environment\n"); printf(" File=%s, Line=%d\n", __FILE__, __LINE__); err = tcleanup(&sessionid); return SA_OK; } id = rptentry.ResourceId; /************************** * Test: valid snmp_bc_get_eventlog_info **************************/ expected_err = SA_OK; err = saHpiEventLogInfoGet(sessionid, id, &info); checkstatus(err, expected_err, testfail); /*************************** * Cleanup after all tests ***************************/ err = tcleanup(&sessionid); return testfail; } #include openhpi-2.14.1/plugins/snmp_bc/t/tset_resource_tag.c0000644000076400007640000000523011302566764017435 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004, 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * Peter D Phan */ #include #include #include #define SAHPI_LANG_NONSENSE (SaHpiLanguageT)0xFFFFFFFF int main(int argc, char **argv) { /* ************************ * Local variables * ***********************/ int testfail = 0; SaHpiResourceIdT id; SaErrorT err; SaErrorT expected_err; SaHpiTextBufferT tag; SaHpiRptEntryT rptentry; // DECLARE_HANDLE(); SaHpiSessionIdT sessionid; SaHpiDomainIdT did; struct oh_handler *h = NULL; struct oh_domain *d = NULL; unsigned int *hid = NULL; struct oh_handler_state *handle; /* ************************ * Find a resource with Control type rdr * ***********************/ err = tsetup(&sessionid); if (err != SA_OK) { printf("Error! Can not open session for test environment\n"); printf(" File=%s, Line=%d\n", __FILE__, __LINE__); return -1; } err = tfind_resource(&sessionid, SAHPI_CAPABILITY_CONTROL, SAHPI_FIRST_ENTRY, &rptentry, SAHPI_TRUE); if (err != SA_OK) { printf("Error! Can not find resources for test environment\n"); printf(" File=%s, Line=%d\n", __FILE__, __LINE__); err = tcleanup(&sessionid); return -1; } id = rptentry.ResourceId; INIT_HANDLE(did, d, hid, h, handle); oh_init_textbuffer(&tag); /************************** * Test 1: Invalid Tag **************************/ tag.Language = SAHPI_LANG_NONSENSE; expected_err = SA_ERR_HPI_INVALID_PARAMS; err = snmp_bc_set_resource_tag(handle, id, &tag); checkstatus(err, expected_err, testfail); /************************** * Test 2: Invalid ResourceId **************************/ oh_init_textbuffer(&tag); expected_err = SA_ERR_HPI_INVALID_RESOURCE; err = snmp_bc_set_resource_tag(handle, 5000, &tag); checkstatus(err, expected_err, testfail); /************************** * Test 3: Valid case **************************/ oh_init_textbuffer(&tag); expected_err = SA_OK; err = saHpiResourceTagSet(sessionid, id, &tag); checkstatus(err, expected_err, testfail); /*************************** * Cleanup after all tests ***************************/ err = tcleanup(&sessionid); return testfail; } #include openhpi-2.14.1/plugins/snmp_bc/t/tsensorget001.c0000644000076400007640000000221211302566763016326 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * Peter D Phan */ #include #include #include int main(int argc, char **argv) { /* ************************ * Local variables * ***********************/ int testfail = 0; SaErrorT err; SaErrorT expected_err; SaHpiResourceIdT id =0; SaHpiSensorNumT sid = 0; SaHpiEventStateT state; SaHpiSensorReadingT reading; /************************** * Test : NULL handle **************************/ expected_err = SA_ERR_HPI_INVALID_PARAMS; err = snmp_bc_get_sensor_reading(NULL, id, sid, &reading, &state); checkstatus(err, expected_err, testfail); return testfail; } #include openhpi-2.14.1/plugins/snmp_bc/t/tsensorset004.c0000644000076400007640000000560411302566764016356 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * Peter D Phan */ #include #include #include int main(int argc, char **argv) { /* ************************ * Local variables * ***********************/ int testfail = 0; SaErrorT err; SaErrorT expected_err; SaHpiRptEntryT rptentry; SaHpiRdrT rdr; SaHpiResourceIdT id; SaHpiSessionIdT sessionid; SaHpiEntryIdT entryid; SaHpiEntryIdT nextentryid; SaHpiBoolT foundSensor; SaHpiBoolT enable = SAHPI_TRUE; SaHpiSensorNumT sid = 0; /* ************************************* * Find a resource with Sensor type rdr * ************************************* */ err = tsetup(&sessionid); if (err != SA_OK) { printf("Error! Can not open session for test environment\n"); printf(" File=%s, Line=%d\n", __FILE__, __LINE__); return -1; } err = tfind_resource(&sessionid,SAHPI_CAPABILITY_SENSOR,SAHPI_FIRST_ENTRY, &rptentry, SAHPI_TRUE); if (err != SA_OK) { printf("Error! Can not find resources for test environment\n"); printf(" File=%s, Line=%d\n", __FILE__, __LINE__); err = tcleanup(&sessionid); return SA_OK; } id = rptentry.ResourceId; /************************** * Test: find a sensor with desired property **************************/ entryid = SAHPI_FIRST_ENTRY; foundSensor = SAHPI_FALSE; do { err = saHpiRdrGet(sessionid,id,entryid,&nextentryid, &rdr); if (err == SA_OK) { if ((rdr.RdrType == SAHPI_SENSOR_RDR) && (rdr.RdrTypeUnion.SensorRec.EnableCtrl == SAHPI_TRUE)) { foundSensor = SAHPI_TRUE; break; } entryid = nextentryid; } } while ((err == SA_OK) && (entryid != SAHPI_LAST_ENTRY)) ; if (!foundSensor) { err("Did not find desired resource for test\n"); return(SA_OK); } else { sid = rdr.RdrTypeUnion.SensorRec.Num; } /************************** * Test **************************/ expected_err = SA_OK; err = saHpiSensorEnableSet(sessionid, id, sid, enable); checkstatus(err, expected_err, testfail); /************************** * Test **************************/ enable = SAHPI_FALSE; expected_err = SA_OK; err = saHpiSensorEnableSet(sessionid, id, sid, enable); checkstatus(err, expected_err, testfail); /*************************** * Cleanup after all tests ***************************/ err = tcleanup(&sessionid); return testfail; } #include openhpi-2.14.1/plugins/snmp_bc/t/tsensorget016.c0000644000076400007640000000426311302566764016345 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * Peter D Phan */ #include #include #include int main(int argc, char **argv) { /* ************************ * Local variables * ***********************/ int testfail = 0; SaErrorT err; SaErrorT expected_err; SaHpiResourceIdT id = 1; SaHpiSensorNumT sid = 1; SaHpiEventStateT state; SaHpiSensorReadingT reading; /* ************************************* * Find a resource with Sensor type rdr * ************************************* */ struct oh_handler_state handle; memset(&handle, 0, sizeof(struct oh_handler_state)); /************************** * Test: snmp_bc_get_sensor_eventstate() * NULL handle pointer **************************/ expected_err = SA_ERR_HPI_INVALID_PARAMS; err = snmp_bc_get_sensor_eventstate(NULL, id, sid, &reading, &state); checkstatus(err, expected_err, testfail); /************************** * Test: NULL Reading pointer * expected_err = SA_ERR_HPI_INVALID_PARAMS; **************************/ err = snmp_bc_get_sensor_eventstate(&handle, id, sid, NULL, &state); checkstatus(err, expected_err, testfail); /************************** * Test: NULL State pointer * expected_err = SA_ERR_HPI_INVALID_PARAMS; **************************/ err = snmp_bc_get_sensor_eventstate(&handle, id, sid, &reading, NULL); checkstatus(err, expected_err, testfail); /************************** * Test: Multiple NULL pointers * expected_err = SA_ERR_HPI_INVALID_PARAMS; **************************/ err = snmp_bc_get_sensor_eventstate(NULL , id, sid, NULL, NULL); checkstatus(err, expected_err, testfail); return testfail; } #include openhpi-2.14.1/plugins/snmp_bc/t/tset_resource_sev.c0000644000076400007640000000507411302566763017464 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004, 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * Peter D Phan */ #include #include #include int main(int argc, char **argv) { /* ************************ * Local variables * ***********************/ int testfail = 0; SaHpiResourceIdT id; SaErrorT err; SaErrorT expected_err; SaHpiSeverityT sev; SaHpiRptEntryT rptentry; // DECLARE_HANDLE(); SaHpiSessionIdT sessionid; SaHpiDomainIdT did; struct oh_handler *h = NULL; struct oh_domain *d = NULL; unsigned int *hid = NULL; struct oh_handler_state *handle; /* ************************ * Find a resource with Control type rdr * ***********************/ err = tsetup(&sessionid); if (err != SA_OK) { printf("Error! Can not open session for test environment\n"); printf(" File=%s, Line=%d\n", __FILE__, __LINE__); return -1; } err = tfind_resource(&sessionid, SAHPI_CAPABILITY_CONTROL, SAHPI_FIRST_ENTRY, &rptentry, SAHPI_TRUE); if (err != SA_OK) { printf("Error! Can not find resources for test environment\n"); printf(" File=%s, Line=%d\n", __FILE__, __LINE__); err = tcleanup(&sessionid); return -1; } id = rptentry.ResourceId; INIT_HANDLE(did, d, hid, h, handle); /************************** * Test 1: Invalid severity **************************/ sev = 0xFE; expected_err = SA_ERR_HPI_INVALID_PARAMS; err = snmp_bc_set_resource_severity(handle, id, sev); checkstatus(err, expected_err, testfail); /************************** * Test 2: Invalid ResourceId **************************/ sev = SAHPI_INFORMATIONAL; expected_err = SA_ERR_HPI_INVALID_RESOURCE; err = snmp_bc_set_resource_severity(handle, 5000, sev); checkstatus(err, expected_err, testfail); /************************** * Test 3: Valid case **************************/ sev = SAHPI_INFORMATIONAL; expected_err = SA_OK; err = saHpiResourceSeveritySet(sessionid, id, sev); checkstatus(err, expected_err, testfail); /*************************** * Cleanup after all tests ***************************/ err = tcleanup(&sessionid); return testfail; } #include openhpi-2.14.1/plugins/snmp_bc/t/tel001.c0000644000076400007640000000261111302566763014720 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * Peter D Phan */ #include #include #include int main(int argc, char **argv) { /* ************************ * Local variables * ***********************/ int testfail = 0; SaErrorT err; SaErrorT expected_err; SaHpiResourceIdT id = 0; SaHpiEventLogInfoT info; struct oh_handler_state l_handle; memset(&l_handle, 0, sizeof(struct oh_handler_state)); /************************** * Test: Invalid handle **************************/ expected_err = SA_ERR_HPI_INVALID_PARAMS; err = snmp_bc_get_sel_info(NULL, id, &info); checkstatus(err, expected_err, testfail); /************************** * Test: Invalid info space * expected_err = SA_ERR_HPI_INVALID_PARAMS; **************************/ err = snmp_bc_get_sel_info(&l_handle, id, NULL); checkstatus(err, expected_err, testfail); return testfail; } #include openhpi-2.14.1/plugins/snmp_bc/t/thotswap-mhs001.c0000644000076400007640000001212711302566764016576 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004, 2006 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * Peter D Phan * Steve Sherman */ #include #include #include int main(int argc, char **argv) { int testfail = 0; SaErrorT err, expected_err; SaHpiCapabilitiesT cap_mask; SaHpiHsIndicatorStateT hs_ind_state = 0; SaHpiHsStateT hs_state; SaHpiResourceIdT id = 0; SaHpiRptEntryT rptentry; SaHpiSessionIdT sessionid; SaHpiTimeoutT timeout; /************************************************ * Find a resource with simple hotswap capability ************************************************/ err = tsetup(&sessionid); if (err != SA_OK) { printf("Error! Cannot open session\n"); printf(" File=%s, Line=%d\n", __FILE__, __LINE__); return -1; } cap_mask = SAHPI_CAPABILITY_FRU | SAHPI_CAPABILITY_MANAGED_HOTSWAP; err = tfind_resource(&sessionid, cap_mask, SAHPI_FIRST_ENTRY, &rptentry, SAHPI_TRUE); if (err != SA_OK) { dbg("Cannot find a managed hotswap resource\n"); dbg(" File=%s, Line=%d\n", __FILE__, __LINE__); err = tcleanup(&sessionid); return SA_OK; } id = rptentry.ResourceId; #if 0 printf("Found resource = %s\n", rptentry.ResourceTag.Data); #endif /*************************************************************** * Test: Capability checking * No BladeCenter resource currently supports hotswap indicators ***************************************************************/ expected_err = SA_ERR_HPI_CAPABILITY; err = saHpiHotSwapIndicatorStateGet(sessionid, id, &hs_ind_state); checkstatus(err, expected_err, testfail); err = saHpiHotSwapIndicatorStateSet(sessionid, id, hs_ind_state); checkstatus(err, expected_err, testfail); /*********************************************** * Test: Immediate Auto-insert/extraction policy * BladeCenter only supports immediate read-only * auto-insert/extraction policies. ***********************************************/ expected_err = SA_ERR_HPI_INVALID_REQUEST; err = saHpiHotSwapPolicyCancel(sessionid, id); checkstatus(err, expected_err, testfail); err = saHpiResourceActiveSet(sessionid, id); checkstatus(err, expected_err, testfail); err = saHpiResourceInactiveSet(sessionid, id); checkstatus(err, expected_err, testfail); #if 0 /* Currently defined by domain */ /* Timeouts are READ-ONLY */ expected_err = SA_ERR_HPI_READ_ONLY; err = saHpiAutoInsertTimeoutSet(sessionid, timeout); checkstatus(err, expected_err, testfail); err = saHpiAutoExtractTimeoutSet(sessionid, id, timeout); checkstatus(err, expected_err, testfail); #endif /* Timeouts are IMMEDIATE */ expected_err = SA_OK; err = saHpiAutoInsertTimeoutGet(sessionid, &timeout); checkstatus(err, expected_err, testfail); if (timeout != SAHPI_TIMEOUT_IMMEDIATE) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); return -1; } err = saHpiAutoExtractTimeoutGet(sessionid, id, &timeout); checkstatus(err, expected_err, testfail); if (timeout != SAHPI_TIMEOUT_IMMEDIATE) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); return -1; } /************************* * Test: Normal Operations *************************/ expected_err = SA_OK; /* Assume resource is in ACTIVE state; else can't test saHpiHotSwapActionRequest Simulator needs to be setup to ensure this */ err = saHpiHotSwapStateGet(sessionid, id, &hs_state); checkstatus(err, expected_err, testfail); if (hs_state != SAHPI_HS_STATE_ACTIVE) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Hotswap resource needs to be in ACTIVE state\n"); printf(" Current state = %s\n", oh_lookup_hsstate(hs_state)); return -1; } err = saHpiHotSwapActionRequest(sessionid, id, SAHPI_HS_ACTION_EXTRACTION); checkstatus(err, expected_err, testfail); #if 0 err = saHpiHotSwapStateGet(sessionid, id, &hs_state); checkstatus(err, expected_err, testfail); if (hs_state != SAHPI_HS_STATE_INACTIVE) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Current state = %s\n", oh_lookup_hsstate(hs_state)); return -1; } err = saHpiHotSwapActionRequest(sessionid, id, SAHPI_HS_ACTION_INSERTION); checkstatus(err, expected_err, testfail); err = saHpiHotSwapStateGet(sessionid, id, &hs_state); checkstatus(err, expected_err, testfail); if (hs_state != SAHPI_HS_STATE_ACTIVE) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Current state = %s\n", oh_lookup_hsstate(hs_state)); return -1; } #endif /************************* * Cleanup after all tests *************************/ err = tcleanup(&sessionid); return testfail; } #include openhpi-2.14.1/plugins/snmp_bc/t/sim_test_file0000644000076400007640000131705511302566763016334 0ustar .1.3.6.1.2.1.1.2.0 = OID: .1.3.6.1.4.1.2.6.158.3 .1.3.6.1.2.1.1.3.0 = Timeticks: (52347100) 6 days, 1:24:31.00 .1.3.6.1.2.1.1.4.0 = STRING: MrBladeCenter .1.3.6.1.2.1.1.5.0 = STRING: BladeCenter Management Module .1.3.6.1.2.1.1.6.0 = STRING: USA .1.3.6.1.2.1.1.7.0 = INTEGER: 31 .1.3.6.1.4.1.2.3.51.2.2.1.1.2.0 = STRING: "26.00 Centigrade" .1.3.6.1.4.1.2.3.51.2.2.1.5.1.0 = STRING: "23.50 Centigrade" .1.3.6.1.4.1.2.3.51.2.2.2.1.1.0 = STRING: "+5.13 Volts" .1.3.6.1.4.1.2.3.51.2.2.2.1.2.0 = STRING: "+3.31 Volts" .1.3.6.1.4.1.2.3.51.2.2.2.1.3.0 = STRING: "+11.81 Volts" .1.3.6.1.4.1.2.3.51.2.2.2.1.5.0 = STRING: "-5.23 Volts" .1.3.6.1.4.1.2.3.51.2.2.2.1.6.0 = STRING: "+2.46 Volts" .1.3.6.1.4.1.2.3.51.2.2.2.1.8.0 = STRING: "+1.77 Volts" .1.3.6.1.4.1.2.3.51.2.2.3.1.0 = STRING: " 46% of maximum" .1.3.6.1.4.1.2.3.51.2.2.3.2.0 = STRING: " 46% of maximum" .1.3.6.1.4.1.2.3.51.2.2.3.3.0 = STRING: " 48% of maximum" .1.3.6.1.4.1.2.3.51.2.2.3.4.0 = STRING: " 54% of maximum" .1.3.6.1.4.1.2.3.51.2.2.3.10.0 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.2.3.11.0 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.2.3.12.0 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.2.3.13.0 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.2.4.1.1.1.1 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.2.4.1.1.1.2 = INTEGER: 2 .1.3.6.1.4.1.2.3.51.2.2.4.1.1.1.3 = INTEGER: 3 .1.3.6.1.4.1.2.3.51.2.2.4.1.1.1.4 = INTEGER: 4 .1.3.6.1.4.1.2.3.51.2.2.4.1.1.2.1 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.2.4.1.1.2.2 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.2.4.1.1.2.3 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.2.4.1.1.2.4 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.2.4.1.1.3.1 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.2.4.1.1.3.2 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.2.4.1.1.3.3 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.2.4.1.1.3.4 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.2.4.1.1.4.1 = STRING: "Power module status OK" .1.3.6.1.4.1.2.3.51.2.2.4.1.1.4.2 = STRING: "Power module status OK" .1.3.6.1.4.1.2.3.51.2.2.4.1.1.4.3 = STRING: "Power module status OK" .1.3.6.1.4.1.2.3.51.2.2.4.1.1.4.4 = STRING: "Power module status OK" .1.3.6.1.4.1.2.3.51.2.2.5.2.1.0 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.2.5.2.2.0 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.2.5.2.3.0 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.2.5.2.4.0 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.2.5.2.5.0 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.2.5.2.7.0 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.2.5.2.8.0 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.2.5.2.9.0 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.2.5.2.10.0 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.2.5.2.11.0 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.2.5.2.12.0 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.2.5.2.13.0 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.2.5.2.14.0 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.2.5.2.15.0 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.2.5.2.16.0 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.2.5.2.17.0 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.2.5.2.18.0 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.2.5.2.19.0 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.2.5.2.33.0 = STRING: "10111001000000" .1.3.6.1.4.1.2.3.51.2.2.5.2.49.0 = STRING: "10111001000000" .1.3.6.1.4.1.2.3.51.2.2.5.2.65.0 = STRING: "11" .1.3.6.1.4.1.2.3.51.2.2.5.2.73.0 = STRING: "11" .1.3.6.1.4.1.2.3.51.2.2.5.2.74.0 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.2.5.2.75.0 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.2.5.2.81.0 = STRING: "1111" .1.3.6.1.4.1.2.3.51.2.2.5.2.89.0 = STRING: "1111" .1.3.6.1.4.1.2.3.51.2.2.5.2.97.0 = STRING: "1111" .1.3.6.1.4.1.2.3.51.2.2.5.2.113.0 = STRING: "1111" .1.3.6.1.4.1.2.3.51.2.2.8.2.1.1.1.1 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.2.8.2.1.1.1.2 = INTEGER: 2 .1.3.6.1.4.1.2.3.51.2.2.8.2.1.1.1.3 = INTEGER: 3 .1.3.6.1.4.1.2.3.51.2.2.8.2.1.1.1.4 = INTEGER: 4 .1.3.6.1.4.1.2.3.51.2.2.8.2.1.1.1.5 = INTEGER: 5 .1.3.6.1.4.1.2.3.51.2.2.8.2.1.1.1.6 = INTEGER: 6 .1.3.6.1.4.1.2.3.51.2.2.8.2.1.1.1.7 = INTEGER: 7 .1.3.6.1.4.1.2.3.51.2.2.8.2.1.1.1.8 = INTEGER: 8 .1.3.6.1.4.1.2.3.51.2.2.8.2.1.1.2.1 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.2.8.2.1.1.2.2 = INTEGER: 2 .1.3.6.1.4.1.2.3.51.2.2.8.2.1.1.2.3 = INTEGER: 3 .1.3.6.1.4.1.2.3.51.2.2.8.2.1.1.2.4 = INTEGER: 4 .1.3.6.1.4.1.2.3.51.2.2.8.2.1.1.2.5 = INTEGER: 5 .1.3.6.1.4.1.2.3.51.2.2.8.2.1.1.2.6 = INTEGER: 6 .1.3.6.1.4.1.2.3.51.2.2.8.2.1.1.2.7 = INTEGER: 7 .1.3.6.1.4.1.2.3.51.2.2.8.2.1.1.2.8 = INTEGER: 8 .1.3.6.1.4.1.2.3.51.2.2.8.2.1.1.3.1 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.2.8.2.1.1.3.2 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.2.8.2.1.1.3.3 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.2.8.2.1.1.3.4 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.2.8.2.1.1.3.5 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.2.8.2.1.1.3.6 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.2.8.2.1.1.3.7 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.2.8.2.1.1.3.8 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.2.8.2.1.1.4.1 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.2.8.2.1.1.4.2 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.2.8.2.1.1.4.3 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.2.8.2.1.1.4.4 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.2.8.2.1.1.4.5 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.2.8.2.1.1.4.6 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.2.8.2.1.1.4.7 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.2.8.2.1.1.4.8 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.2.8.2.1.1.5.1 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.2.8.2.1.1.5.2 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.2.8.2.1.1.5.3 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.2.8.2.1.1.5.4 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.2.8.2.1.1.5.5 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.2.8.2.1.1.5.6 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.2.8.2.1.1.5.7 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.2.8.2.1.1.5.8 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.2.8.2.1.1.6.1 = STRING: "Mor38____FC3" .1.3.6.1.4.1.2.3.51.2.2.8.2.1.1.6.2 = STRING: "(No name)" .1.3.6.1.4.1.2.3.51.2.2.8.2.1.1.6.3 = STRING: "L99_P_____FC" .1.3.6.1.4.1.2.3.51.2.2.8.2.1.1.6.4 = STRING: "G71______SU" .1.3.6.1.4.1.2.3.51.2.2.8.2.1.1.6.5 = STRING: "J52_Lin_p64" .1.3.6.1.4.1.2.3.51.2.2.8.2.1.1.6.6 = STRING: "(No name)" .1.3.6.1.4.1.2.3.51.2.2.8.2.1.1.6.7 = STRING: "(No name)" .1.3.6.1.4.1.2.3.51.2.2.8.2.1.1.6.8 = STRING: "M01____RHEL4" .1.3.6.1.4.1.2.3.51.2.2.8.2.1.1.7.1 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.2.8.2.1.1.7.2 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.2.8.2.1.1.7.3 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.2.8.2.1.1.7.4 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.2.8.2.1.1.7.5 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.2.8.2.1.1.7.6 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.2.8.2.1.1.7.7 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.2.8.2.1.1.7.8 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.2.8.2.1.1.8.1 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.2.8.2.1.1.8.2 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.2.8.2.1.1.8.3 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.2.8.2.1.1.8.4 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.2.8.2.1.1.8.5 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.2.8.2.1.1.8.6 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.2.8.2.1.1.8.7 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.2.8.2.1.1.8.8 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.2.8.2.1.1.9.1 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.2.8.2.1.1.9.2 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.2.8.2.1.1.9.3 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.2.8.2.1.1.9.4 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.2.8.2.1.1.9.5 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.2.8.2.1.1.9.6 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.2.8.2.1.1.9.7 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.2.8.2.1.1.9.8 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.2.8.2.1.1.10.1 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.2.8.2.1.1.10.2 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.2.8.2.1.1.10.3 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.2.8.2.1.1.10.4 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.2.8.2.1.1.10.5 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.2.8.2.1.1.10.6 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.2.8.2.1.1.10.7 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.2.8.2.1.1.10.8 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.2.8.2.1.1.11.1 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.2.8.2.1.1.11.2 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.2.8.2.1.1.11.3 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.2.8.2.1.1.11.4 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.2.8.2.1.1.11.5 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.2.8.2.1.1.11.6 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.2.8.2.1.1.11.7 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.2.8.2.1.1.11.8 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.2.8.3.1.0 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.2.8.3.2.0 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.2.8.3.3.0 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.2.8.3.4.0 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.2.8.3.5.0 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.2.8.3.6.0 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.2.8.4.1.1.1.1 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.2.8.4.1.1.1.2 = INTEGER: 2 .1.3.6.1.4.1.2.3.51.2.2.8.4.1.1.1.3 = INTEGER: 3 .1.3.6.1.4.1.2.3.51.2.2.8.4.1.1.1.4 = INTEGER: 4 .1.3.6.1.4.1.2.3.51.2.2.8.4.1.1.2.1 = STRING: "(Not Readable)" .1.3.6.1.4.1.2.3.51.2.2.8.4.1.1.2.2 = STRING: "(Not Readable)" .1.3.6.1.4.1.2.3.51.2.2.8.4.1.1.2.3 = STRING: "(Not Readable)" .1.3.6.1.4.1.2.3.51.2.2.8.4.1.1.2.4 = STRING: "(Not Readable)" .1.3.6.1.4.1.2.3.51.2.2.9.1.0 = INTEGER: 255 .1.3.6.1.4.1.2.3.51.2.2.9.2.1.1.1 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.2.9.2.1.2.1 = STRING: "Good" .1.3.6.1.4.1.2.3.51.2.2.9.2.1.3.1 = STRING: "No alarm events" .1.3.6.1.4.1.2.3.51.2.2.9.2.1.4.1 = INTEGER: 1315905633 .1.3.6.1.4.1.2.3.51.2.2.9.2.1.5.1 = STRING: "No alarm events" .1.3.6.1.4.1.2.3.51.2.2.9.2.1.6.1 = INTEGER: 1315905633 .1.3.6.1.4.1.2.3.51.2.2.10.1.1.1.1.1 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.2.10.1.1.1.1.2 = INTEGER: 2 .1.3.6.1.4.1.2.3.51.2.2.10.1.1.1.2.1 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.2.10.1.1.1.2.2 = INTEGER: 2 .1.3.6.1.4.1.2.3.51.2.2.10.1.1.1.3.1 = STRING: "1 - Power domain status is good." .1.3.6.1.4.1.2.3.51.2.2.10.1.1.1.3.2 = STRING: "1 - Power domain status is good." .1.3.6.1.4.1.2.3.51.2.2.10.1.1.1.4.1 = STRING: "Bay 1: 1300W" .1.3.6.1.4.1.2.3.51.2.2.10.1.1.1.4.2 = STRING: "Bay 3: 1300W" .1.3.6.1.4.1.2.3.51.2.2.10.1.1.1.5.1 = STRING: "Bay 2: 1300W" .1.3.6.1.4.1.2.3.51.2.2.10.1.1.1.5.2 = STRING: "Bay 4: 1300W" .1.3.6.1.4.1.2.3.51.2.2.10.1.1.1.6.1 = INTEGER: 2 .1.3.6.1.4.1.2.3.51.2.2.10.1.1.1.6.2 = INTEGER: 2 .1.3.6.1.4.1.2.3.51.2.2.10.1.1.1.7.1 = STRING: "1500W" .1.3.6.1.4.1.2.3.51.2.2.10.1.1.1.7.2 = STRING: "2240W" .1.3.6.1.4.1.2.3.51.2.2.10.1.1.1.8.1 = STRING: "1060W" .1.3.6.1.4.1.2.3.51.2.2.10.1.1.1.8.2 = STRING: "916W" .1.3.6.1.4.1.2.3.51.2.2.10.1.1.1.9.1 = STRING: "440W" .1.3.6.1.4.1.2.3.51.2.2.10.1.1.1.9.2 = STRING: "1324W" .1.3.6.1.4.1.2.3.51.2.2.10.1.1.1.10.1 = STRING: "980W" .1.3.6.1.4.1.2.3.51.2.2.10.1.1.1.10.2 = STRING: "916W" .1.3.6.1.4.1.2.3.51.2.2.10.2.1.1.1.1 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.2.10.2.1.1.1.2 = INTEGER: 2 .1.3.6.1.4.1.2.3.51.2.2.10.2.1.1.1.3 = INTEGER: 3 .1.3.6.1.4.1.2.3.51.2.2.10.2.1.1.1.4 = INTEGER: 4 .1.3.6.1.4.1.2.3.51.2.2.10.2.1.1.1.5 = INTEGER: 5 .1.3.6.1.4.1.2.3.51.2.2.10.2.1.1.1.6 = INTEGER: 6 .1.3.6.1.4.1.2.3.51.2.2.10.2.1.1.1.7 = INTEGER: 7 .1.3.6.1.4.1.2.3.51.2.2.10.2.1.1.1.8 = INTEGER: 8 .1.3.6.1.4.1.2.3.51.2.2.10.2.1.1.1.9 = INTEGER: 9 .1.3.6.1.4.1.2.3.51.2.2.10.2.1.1.1.10 = INTEGER: 10 .1.3.6.1.4.1.2.3.51.2.2.10.2.1.1.1.11 = INTEGER: 11 .1.3.6.1.4.1.2.3.51.2.2.10.2.1.1.1.12 = INTEGER: 12 .1.3.6.1.4.1.2.3.51.2.2.10.2.1.1.1.13 = INTEGER: 13 .1.3.6.1.4.1.2.3.51.2.2.10.2.1.1.1.14 = INTEGER: 14 .1.3.6.1.4.1.2.3.51.2.2.10.2.1.1.1.15 = INTEGER: 15 .1.3.6.1.4.1.2.3.51.2.2.10.2.1.1.1.16 = INTEGER: 16 .1.3.6.1.4.1.2.3.51.2.2.10.2.1.1.1.17 = INTEGER: 17 .1.3.6.1.4.1.2.3.51.2.2.10.2.1.1.2.1 = STRING: "notApplicable(1)" .1.3.6.1.4.1.2.3.51.2.2.10.2.1.1.2.2 = STRING: "notApplicable(2)" .1.3.6.1.4.1.2.3.51.2.2.10.2.1.1.2.3 = STRING: "blowerBay1(3)" .1.3.6.1.4.1.2.3.51.2.2.10.2.1.1.2.4 = STRING: "blowerBay2(4)" .1.3.6.1.4.1.2.3.51.2.2.10.2.1.1.2.5 = STRING: "blowerBay3(5)" .1.3.6.1.4.1.2.3.51.2.2.10.2.1.1.2.6 = STRING: "blowerBay4(6)" .1.3.6.1.4.1.2.3.51.2.2.10.2.1.1.2.7 = STRING: "managementModuleBay1(7)" .1.3.6.1.4.1.2.3.51.2.2.10.2.1.1.2.8 = STRING: "managementModuleBay2(8)" .1.3.6.1.4.1.2.3.51.2.2.10.2.1.1.2.9 = STRING: "switchModuleBay1(9)" .1.3.6.1.4.1.2.3.51.2.2.10.2.1.1.2.10 = STRING: "switchModuleBay2(10)" .1.3.6.1.4.1.2.3.51.2.2.10.2.1.1.2.11 = STRING: "switchModuleBay3(11)" .1.3.6.1.4.1.2.3.51.2.2.10.2.1.1.2.12 = STRING: "switchModuleBay4(12)" .1.3.6.1.4.1.2.3.51.2.2.10.2.1.1.2.13 = STRING: "serverBladeBay1(13)" .1.3.6.1.4.1.2.3.51.2.2.10.2.1.1.2.14 = STRING: "serverBladeBay2(14)" .1.3.6.1.4.1.2.3.51.2.2.10.2.1.1.2.15 = STRING: "serverBladeBay3(15)" .1.3.6.1.4.1.2.3.51.2.2.10.2.1.1.2.16 = STRING: "serverBladeBay4(16)" .1.3.6.1.4.1.2.3.51.2.2.10.2.1.1.2.17 = STRING: "notApplicable(17)" .1.3.6.1.4.1.2.3.51.2.2.10.2.1.1.3.1 = INTEGER: 255 .1.3.6.1.4.1.2.3.51.2.2.10.2.1.1.3.2 = INTEGER: 255 .1.3.6.1.4.1.2.3.51.2.2.10.2.1.1.3.3 = INTEGER: 255 .1.3.6.1.4.1.2.3.51.2.2.10.2.1.1.3.4 = INTEGER: 255 .1.3.6.1.4.1.2.3.51.2.2.10.2.1.1.3.5 = INTEGER: 255 .1.3.6.1.4.1.2.3.51.2.2.10.2.1.1.3.6 = INTEGER: 255 .1.3.6.1.4.1.2.3.51.2.2.10.2.1.1.3.7 = INTEGER: 255 .1.3.6.1.4.1.2.3.51.2.2.10.2.1.1.3.8 = INTEGER: 255 .1.3.6.1.4.1.2.3.51.2.2.10.2.1.1.3.9 = INTEGER: 255 .1.3.6.1.4.1.2.3.51.2.2.10.2.1.1.3.10 = INTEGER: 255 .1.3.6.1.4.1.2.3.51.2.2.10.2.1.1.3.11 = INTEGER: 255 .1.3.6.1.4.1.2.3.51.2.2.10.2.1.1.3.12 = INTEGER: 255 .1.3.6.1.4.1.2.3.51.2.2.10.2.1.1.3.13 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.2.10.2.1.1.3.14 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.2.10.2.1.1.3.15 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.2.10.2.1.1.3.16 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.2.10.2.1.1.3.17 = INTEGER: 255 .1.3.6.1.4.1.2.3.51.2.2.10.2.1.1.4.1 = INTEGER: 255 .1.3.6.1.4.1.2.3.51.2.2.10.2.1.1.4.2 = INTEGER: 255 .1.3.6.1.4.1.2.3.51.2.2.10.2.1.1.4.3 = INTEGER: 255 .1.3.6.1.4.1.2.3.51.2.2.10.2.1.1.4.4 = INTEGER: 255 .1.3.6.1.4.1.2.3.51.2.2.10.2.1.1.4.5 = INTEGER: 255 .1.3.6.1.4.1.2.3.51.2.2.10.2.1.1.4.6 = INTEGER: 255 .1.3.6.1.4.1.2.3.51.2.2.10.2.1.1.4.7 = INTEGER: 255 .1.3.6.1.4.1.2.3.51.2.2.10.2.1.1.4.8 = INTEGER: 255 .1.3.6.1.4.1.2.3.51.2.2.10.2.1.1.4.9 = INTEGER: 2 .1.3.6.1.4.1.2.3.51.2.2.10.2.1.1.4.10 = INTEGER: 2 .1.3.6.1.4.1.2.3.51.2.2.10.2.1.1.4.11 = INTEGER: 2 .1.3.6.1.4.1.2.3.51.2.2.10.2.1.1.4.12 = INTEGER: 2 .1.3.6.1.4.1.2.3.51.2.2.10.2.1.1.4.13 = INTEGER: 2 .1.3.6.1.4.1.2.3.51.2.2.10.2.1.1.4.14 = INTEGER: 2 .1.3.6.1.4.1.2.3.51.2.2.10.2.1.1.4.15 = INTEGER: 2 .1.3.6.1.4.1.2.3.51.2.2.10.2.1.1.4.16 = INTEGER: 2 .1.3.6.1.4.1.2.3.51.2.2.10.2.1.1.4.17 = INTEGER: 255 .1.3.6.1.4.1.2.3.51.2.2.10.2.1.1.5.1 = STRING: "Midplane" .1.3.6.1.4.1.2.3.51.2.2.10.2.1.1.5.2 = STRING: "Media Tray" .1.3.6.1.4.1.2.3.51.2.2.10.2.1.1.5.3 = STRING: "Blower 1" .1.3.6.1.4.1.2.3.51.2.2.10.2.1.1.5.4 = STRING: "Blower 2" .1.3.6.1.4.1.2.3.51.2.2.10.2.1.1.5.5 = STRING: "Blower 3" .1.3.6.1.4.1.2.3.51.2.2.10.2.1.1.5.6 = STRING: "Blower 4" .1.3.6.1.4.1.2.3.51.2.2.10.2.1.1.5.7 = STRING: "Backup MM" .1.3.6.1.4.1.2.3.51.2.2.10.2.1.1.5.8 = STRING: "BCT-81" .1.3.6.1.4.1.2.3.51.2.2.10.2.1.1.5.9 = STRING: "Ethernet SM" .1.3.6.1.4.1.2.3.51.2.2.10.2.1.1.5.10 = STRING: "Ethernet SM" .1.3.6.1.4.1.2.3.51.2.2.10.2.1.1.5.11 = STRING: "Fibre SM" .1.3.6.1.4.1.2.3.51.2.2.10.2.1.1.5.12 = STRING: "Fibre SM" .1.3.6.1.4.1.2.3.51.2.2.10.2.1.1.5.13 = STRING: "Mor38____FC3" .1.3.6.1.4.1.2.3.51.2.2.10.2.1.1.5.14 = STRING: "Blade Server" .1.3.6.1.4.1.2.3.51.2.2.10.2.1.1.5.15 = STRING: "L99_P_____FC" .1.3.6.1.4.1.2.3.51.2.2.10.2.1.1.5.16 = STRING: "G71______SU" .1.3.6.1.4.1.2.3.51.2.2.10.2.1.1.5.17 = STRING: "Total Power Domain Allocation" .1.3.6.1.4.1.2.3.51.2.2.10.2.1.1.6.1 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.2.10.2.1.1.6.2 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.2.10.2.1.1.6.3 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.2.10.2.1.1.6.4 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.2.10.2.1.1.6.5 = INTEGER: 255 .1.3.6.1.4.1.2.3.51.2.2.10.2.1.1.6.6 = INTEGER: 255 .1.3.6.1.4.1.2.3.51.2.2.10.2.1.1.6.7 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.2.10.2.1.1.6.8 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.2.10.2.1.1.6.9 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.2.10.2.1.1.6.10 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.2.10.2.1.1.6.11 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.2.10.2.1.1.6.12 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.2.10.2.1.1.6.13 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.2.10.2.1.1.6.14 = INTEGER: 2 .1.3.6.1.4.1.2.3.51.2.2.10.2.1.1.6.15 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.2.10.2.1.1.6.16 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.2.10.2.1.1.6.17 = INTEGER: 255 .1.3.6.1.4.1.2.3.51.2.2.10.2.1.1.7.1 = STRING: "0W" .1.3.6.1.4.1.2.3.51.2.2.10.2.1.1.7.2 = STRING: "10W" .1.3.6.1.4.1.2.3.51.2.2.10.2.1.1.7.3 = STRING: "80W" .1.3.6.1.4.1.2.3.51.2.2.10.2.1.1.7.4 = STRING: "80W" .1.3.6.1.4.1.2.3.51.2.2.10.2.1.1.7.5 = STRING: "0W" .1.3.6.1.4.1.2.3.51.2.2.10.2.1.1.7.6 = STRING: "0W" .1.3.6.1.4.1.2.3.51.2.2.10.2.1.1.7.7 = STRING: "15W" .1.3.6.1.4.1.2.3.51.2.2.10.2.1.1.7.8 = STRING: "25W" .1.3.6.1.4.1.2.3.51.2.2.10.2.1.1.7.9 = STRING: "45W" .1.3.6.1.4.1.2.3.51.2.2.10.2.1.1.7.10 = STRING: "45W" .1.3.6.1.4.1.2.3.51.2.2.10.2.1.1.7.11 = STRING: "45W" .1.3.6.1.4.1.2.3.51.2.2.10.2.1.1.7.12 = STRING: "45W" .1.3.6.1.4.1.2.3.51.2.2.10.2.1.1.7.13 = STRING: "125W" .1.3.6.1.4.1.2.3.51.2.2.10.2.1.1.7.14 = STRING: "50W" .1.3.6.1.4.1.2.3.51.2.2.10.2.1.1.7.15 = STRING: "220W" .1.3.6.1.4.1.2.3.51.2.2.10.2.1.1.7.16 = STRING: "285W" .1.3.6.1.4.1.2.3.51.2.2.10.2.1.1.7.17 = STRING: "1070W" .1.3.6.1.4.1.2.3.51.2.2.10.2.1.1.8.1 = STRING: "0W" .1.3.6.1.4.1.2.3.51.2.2.10.2.1.1.8.2 = STRING: "10W" .1.3.6.1.4.1.2.3.51.2.2.10.2.1.1.8.3 = STRING: "80W" .1.3.6.1.4.1.2.3.51.2.2.10.2.1.1.8.4 = STRING: "80W" .1.3.6.1.4.1.2.3.51.2.2.10.2.1.1.8.5 = STRING: "0W" .1.3.6.1.4.1.2.3.51.2.2.10.2.1.1.8.6 = STRING: "0W" .1.3.6.1.4.1.2.3.51.2.2.10.2.1.1.8.7 = STRING: "15W" .1.3.6.1.4.1.2.3.51.2.2.10.2.1.1.8.8 = STRING: "25W" .1.3.6.1.4.1.2.3.51.2.2.10.2.1.1.8.9 = STRING: "45W" .1.3.6.1.4.1.2.3.51.2.2.10.2.1.1.8.10 = STRING: "45W" .1.3.6.1.4.1.2.3.51.2.2.10.2.1.1.8.11 = STRING: "45W" .1.3.6.1.4.1.2.3.51.2.2.10.2.1.1.8.12 = STRING: "45W" .1.3.6.1.4.1.2.3.51.2.2.10.2.1.1.8.13 = STRING: "125W" .1.3.6.1.4.1.2.3.51.2.2.10.2.1.1.8.14 = STRING: "50W" .1.3.6.1.4.1.2.3.51.2.2.10.2.1.1.8.15 = STRING: "220W" .1.3.6.1.4.1.2.3.51.2.2.10.2.1.1.8.16 = STRING: "285W" .1.3.6.1.4.1.2.3.51.2.2.10.2.1.1.8.17 = STRING: "1070W" .1.3.6.1.4.1.2.3.51.2.2.10.2.1.1.9.1 = STRING: "0W" .1.3.6.1.4.1.2.3.51.2.2.10.2.1.1.9.2 = STRING: "10W" .1.3.6.1.4.1.2.3.51.2.2.10.2.1.1.9.3 = STRING: "80W" .1.3.6.1.4.1.2.3.51.2.2.10.2.1.1.9.4 = STRING: "80W" .1.3.6.1.4.1.2.3.51.2.2.10.2.1.1.9.5 = STRING: "0W" .1.3.6.1.4.1.2.3.51.2.2.10.2.1.1.9.6 = STRING: "0W" .1.3.6.1.4.1.2.3.51.2.2.10.2.1.1.9.7 = STRING: "15W" .1.3.6.1.4.1.2.3.51.2.2.10.2.1.1.9.8 = STRING: "25W" .1.3.6.1.4.1.2.3.51.2.2.10.2.1.1.9.9 = STRING: "45W" .1.3.6.1.4.1.2.3.51.2.2.10.2.1.1.9.10 = STRING: "45W" .1.3.6.1.4.1.2.3.51.2.2.10.2.1.1.9.11 = STRING: "45W" .1.3.6.1.4.1.2.3.51.2.2.10.2.1.1.9.12 = STRING: "45W" .1.3.6.1.4.1.2.3.51.2.2.10.2.1.1.9.13 = STRING: "85W" .1.3.6.1.4.1.2.3.51.2.2.10.2.1.1.9.14 = STRING: "50W" .1.3.6.1.4.1.2.3.51.2.2.10.2.1.1.9.15 = STRING: "220W" .1.3.6.1.4.1.2.3.51.2.2.10.2.1.1.9.16 = STRING: "179W" .1.3.6.1.4.1.2.3.51.2.2.10.2.1.1.9.17 = STRING: "924W" .1.3.6.1.4.1.2.3.51.2.2.10.2.1.1.10.1 = STRING: "notApplicable" .1.3.6.1.4.1.2.3.51.2.2.10.2.1.1.10.2 = STRING: "notApplicable" .1.3.6.1.4.1.2.3.51.2.2.10.2.1.1.10.3 = STRING: "notApplicable" .1.3.6.1.4.1.2.3.51.2.2.10.2.1.1.10.4 = STRING: "notApplicable" .1.3.6.1.4.1.2.3.51.2.2.10.2.1.1.10.5 = STRING: "notApplicable" .1.3.6.1.4.1.2.3.51.2.2.10.2.1.1.10.6 = STRING: "notApplicable" .1.3.6.1.4.1.2.3.51.2.2.10.2.1.1.10.7 = STRING: "notApplicable" .1.3.6.1.4.1.2.3.51.2.2.10.2.1.1.10.8 = STRING: "notApplicable" .1.3.6.1.4.1.2.3.51.2.2.10.2.1.1.10.9 = STRING: "notApplicable" .1.3.6.1.4.1.2.3.51.2.2.10.2.1.1.10.10 = STRING: "notApplicable" .1.3.6.1.4.1.2.3.51.2.2.10.2.1.1.10.11 = STRING: "notApplicable" .1.3.6.1.4.1.2.3.51.2.2.10.2.1.1.10.12 = STRING: "notApplicable" .1.3.6.1.4.1.2.3.51.2.2.10.2.1.1.10.13 = STRING: "100% ,0%" .1.3.6.1.4.1.2.3.51.2.2.10.2.1.1.10.14 = STRING: "notApplicable" .1.3.6.1.4.1.2.3.51.2.2.10.2.1.1.10.15 = STRING: "notApplicable" .1.3.6.1.4.1.2.3.51.2.2.10.2.1.1.10.16 = STRING: "100% ,100%" .1.3.6.1.4.1.2.3.51.2.2.10.2.1.1.10.17 = STRING: "notApplicable" .1.3.6.1.4.1.2.3.51.2.2.10.2.1.1.11.1 = INTEGER: 255 .1.3.6.1.4.1.2.3.51.2.2.10.2.1.1.11.2 = INTEGER: 255 .1.3.6.1.4.1.2.3.51.2.2.10.2.1.1.11.3 = INTEGER: 255 .1.3.6.1.4.1.2.3.51.2.2.10.2.1.1.11.4 = INTEGER: 255 .1.3.6.1.4.1.2.3.51.2.2.10.2.1.1.11.5 = INTEGER: 255 .1.3.6.1.4.1.2.3.51.2.2.10.2.1.1.11.6 = INTEGER: 255 .1.3.6.1.4.1.2.3.51.2.2.10.2.1.1.11.7 = INTEGER: 255 .1.3.6.1.4.1.2.3.51.2.2.10.2.1.1.11.8 = INTEGER: 255 .1.3.6.1.4.1.2.3.51.2.2.10.2.1.1.11.9 = INTEGER: 255 .1.3.6.1.4.1.2.3.51.2.2.10.2.1.1.11.10 = INTEGER: 255 .1.3.6.1.4.1.2.3.51.2.2.10.2.1.1.11.11 = INTEGER: 255 .1.3.6.1.4.1.2.3.51.2.2.10.2.1.1.11.12 = INTEGER: 255 .1.3.6.1.4.1.2.3.51.2.2.10.2.1.1.11.13 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.2.10.2.1.1.11.14 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.2.10.2.1.1.11.15 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.2.10.2.1.1.11.16 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.2.10.2.1.1.11.17 = INTEGER: 255 .1.3.6.1.4.1.2.3.51.2.2.10.3.1.1.1.1 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.2.10.3.1.1.1.2 = INTEGER: 2 .1.3.6.1.4.1.2.3.51.2.2.10.3.1.1.1.3 = INTEGER: 3 .1.3.6.1.4.1.2.3.51.2.2.10.3.1.1.1.4 = INTEGER: 4 .1.3.6.1.4.1.2.3.51.2.2.10.3.1.1.1.5 = INTEGER: 5 .1.3.6.1.4.1.2.3.51.2.2.10.3.1.1.1.6 = INTEGER: 6 .1.3.6.1.4.1.2.3.51.2.2.10.3.1.1.1.7 = INTEGER: 7 .1.3.6.1.4.1.2.3.51.2.2.10.3.1.1.2.1 = STRING: "blowerBay3(1)" .1.3.6.1.4.1.2.3.51.2.2.10.3.1.1.2.2 = STRING: "blowerBay4(2)" .1.3.6.1.4.1.2.3.51.2.2.10.3.1.1.2.3 = STRING: "serverBladeBay5(3)" .1.3.6.1.4.1.2.3.51.2.2.10.3.1.1.2.4 = STRING: "serverBladeBay6(4)" .1.3.6.1.4.1.2.3.51.2.2.10.3.1.1.2.5 = STRING: "serverBladeBay7(5)" .1.3.6.1.4.1.2.3.51.2.2.10.3.1.1.2.6 = STRING: "serverBladeBay8(6)" .1.3.6.1.4.1.2.3.51.2.2.10.3.1.1.2.7 = STRING: "notApplicable(7)" .1.3.6.1.4.1.2.3.51.2.2.10.3.1.1.3.1 = INTEGER: 255 .1.3.6.1.4.1.2.3.51.2.2.10.3.1.1.3.2 = INTEGER: 255 .1.3.6.1.4.1.2.3.51.2.2.10.3.1.1.3.3 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.2.10.3.1.1.3.4 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.2.10.3.1.1.3.5 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.2.10.3.1.1.3.6 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.2.10.3.1.1.3.7 = INTEGER: 255 .1.3.6.1.4.1.2.3.51.2.2.10.3.1.1.4.1 = INTEGER: 255 .1.3.6.1.4.1.2.3.51.2.2.10.3.1.1.4.2 = INTEGER: 255 .1.3.6.1.4.1.2.3.51.2.2.10.3.1.1.4.3 = INTEGER: 2 .1.3.6.1.4.1.2.3.51.2.2.10.3.1.1.4.4 = INTEGER: 2 .1.3.6.1.4.1.2.3.51.2.2.10.3.1.1.4.5 = INTEGER: 2 .1.3.6.1.4.1.2.3.51.2.2.10.3.1.1.4.6 = INTEGER: 2 .1.3.6.1.4.1.2.3.51.2.2.10.3.1.1.4.7 = INTEGER: 255 .1.3.6.1.4.1.2.3.51.2.2.10.3.1.1.5.1 = STRING: "Blower 3" .1.3.6.1.4.1.2.3.51.2.2.10.3.1.1.5.2 = STRING: "Blower 4" .1.3.6.1.4.1.2.3.51.2.2.10.3.1.1.5.3 = STRING: "J52_Lin_p64" .1.3.6.1.4.1.2.3.51.2.2.10.3.1.1.5.4 = STRING: "Blade Server 06" .1.3.6.1.4.1.2.3.51.2.2.10.3.1.1.5.5 = STRING: "Blade Server 07" .1.3.6.1.4.1.2.3.51.2.2.10.3.1.1.5.6 = STRING: "M01____RHEL4" .1.3.6.1.4.1.2.3.51.2.2.10.3.1.1.5.7 = STRING: "Total Power Domain Allocation" .1.3.6.1.4.1.2.3.51.2.2.10.3.1.1.6.1 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.2.10.3.1.1.6.2 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.2.10.3.1.1.6.3 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.2.10.3.1.1.6.4 = INTEGER: 2 .1.3.6.1.4.1.2.3.51.2.2.10.3.1.1.6.5 = INTEGER: 2 .1.3.6.1.4.1.2.3.51.2.2.10.3.1.1.6.6 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.2.10.3.1.1.6.7 = INTEGER: 255 .1.3.6.1.4.1.2.3.51.2.2.10.3.1.1.7.1 = STRING: "80W" .1.3.6.1.4.1.2.3.51.2.2.10.3.1.1.7.2 = STRING: "80W" .1.3.6.1.4.1.2.3.51.2.2.10.3.1.1.7.3 = STRING: "210W" .1.3.6.1.4.1.2.3.51.2.2.10.3.1.1.7.4 = STRING: "50W" .1.3.6.1.4.1.2.3.51.2.2.10.3.1.1.7.5 = STRING: "203W" .1.3.6.1.4.1.2.3.51.2.2.10.3.1.1.7.6 = STRING: "203W" .1.3.6.1.4.1.2.3.51.2.2.10.3.1.1.7.7 = STRING: "826W" .1.3.6.1.4.1.2.3.51.2.2.10.3.1.1.8.1 = STRING: "80W" .1.3.6.1.4.1.2.3.51.2.2.10.3.1.1.8.2 = STRING: "80W" .1.3.6.1.4.1.2.3.51.2.2.10.3.1.1.8.3 = STRING: "210W" .1.3.6.1.4.1.2.3.51.2.2.10.3.1.1.8.4 = STRING: "50W" .1.3.6.1.4.1.2.3.51.2.2.10.3.1.1.8.5 = STRING: "203W" .1.3.6.1.4.1.2.3.51.2.2.10.3.1.1.8.6 = STRING: "203W" .1.3.6.1.4.1.2.3.51.2.2.10.3.1.1.8.7 = STRING: "826W" .1.3.6.1.4.1.2.3.51.2.2.10.3.1.1.9.1 = STRING: "80W" .1.3.6.1.4.1.2.3.51.2.2.10.3.1.1.9.2 = STRING: "80W" .1.3.6.1.4.1.2.3.51.2.2.10.3.1.1.9.3 = STRING: "210W" .1.3.6.1.4.1.2.3.51.2.2.10.3.1.1.9.4 = STRING: "50W" .1.3.6.1.4.1.2.3.51.2.2.10.3.1.1.9.5 = STRING: "203W" .1.3.6.1.4.1.2.3.51.2.2.10.3.1.1.9.6 = STRING: "203W" .1.3.6.1.4.1.2.3.51.2.2.10.3.1.1.9.7 = STRING: "826W" .1.3.6.1.4.1.2.3.51.2.2.10.3.1.1.10.1 = STRING: "notApplicable" .1.3.6.1.4.1.2.3.51.2.2.10.3.1.1.10.2 = STRING: "notApplicable" .1.3.6.1.4.1.2.3.51.2.2.10.3.1.1.10.3 = STRING: "notApplicable" .1.3.6.1.4.1.2.3.51.2.2.10.3.1.1.10.4 = STRING: "notApplicable" .1.3.6.1.4.1.2.3.51.2.2.10.3.1.1.10.5 = STRING: "notApplicable" .1.3.6.1.4.1.2.3.51.2.2.10.3.1.1.10.6 = STRING: "notApplicable" .1.3.6.1.4.1.2.3.51.2.2.10.3.1.1.10.7 = STRING: "notApplicable" .1.3.6.1.4.1.2.3.51.2.2.10.3.1.1.11.1 = INTEGER: 255 .1.3.6.1.4.1.2.3.51.2.2.10.3.1.1.11.2 = INTEGER: 255 .1.3.6.1.4.1.2.3.51.2.2.10.3.1.1.11.3 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.2.10.3.1.1.11.4 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.2.10.3.1.1.11.5 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.2.10.3.1.1.11.6 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.2.10.3.1.1.11.7 = INTEGER: 255 .1.3.6.1.4.1.2.3.51.2.2.20.2.1.1.1.1 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.2.20.2.1.1.1.2 = INTEGER: 2 .1.3.6.1.4.1.2.3.51.2.2.20.2.1.1.1.3 = INTEGER: 3 .1.3.6.1.4.1.2.3.51.2.2.20.2.1.1.1.4 = INTEGER: 4 .1.3.6.1.4.1.2.3.51.2.2.20.2.1.1.1.5 = INTEGER: 5 .1.3.6.1.4.1.2.3.51.2.2.20.2.1.1.1.6 = INTEGER: 6 .1.3.6.1.4.1.2.3.51.2.2.20.2.1.1.2.1 = STRING: "+5v" .1.3.6.1.4.1.2.3.51.2.2.20.2.1.1.2.2 = STRING: "+3.3v" .1.3.6.1.4.1.2.3.51.2.2.20.2.1.1.2.3 = STRING: "+12v" .1.3.6.1.4.1.2.3.51.2.2.20.2.1.1.2.4 = STRING: "-5v" .1.3.6.1.4.1.2.3.51.2.2.20.2.1.1.2.5 = STRING: "+2.5v" .1.3.6.1.4.1.2.3.51.2.2.20.2.1.1.2.6 = STRING: "+1.8v" .1.3.6.1.4.1.2.3.51.2.2.20.2.1.1.3.1 = STRING: "+5.15 Volts" .1.3.6.1.4.1.2.3.51.2.2.20.2.1.1.3.2 = STRING: "+3.31 Volts" .1.3.6.1.4.1.2.3.51.2.2.20.2.1.1.3.3 = STRING: "+11.81 Volts" .1.3.6.1.4.1.2.3.51.2.2.20.2.1.1.3.4 = STRING: "-5.23 Volts" .1.3.6.1.4.1.2.3.51.2.2.20.2.1.1.3.5 = STRING: "+2.46 Volts" .1.3.6.1.4.1.2.3.51.2.2.20.2.1.1.3.6 = STRING: "+1.77 Volts" .1.3.6.1.4.1.2.3.51.2.2.20.2.1.1.6.1 = STRING: "+5.25 Volts" .1.3.6.1.4.1.2.3.51.2.2.20.2.1.1.6.2 = STRING: "+3.47 Volts" .1.3.6.1.4.1.2.3.51.2.2.20.2.1.1.6.3 = STRING: "+12.24 Volts" .1.3.6.1.4.1.2.3.51.2.2.20.2.1.1.6.4 = STRING: "-4.50 Volts" .1.3.6.1.4.1.2.3.51.2.2.20.2.1.1.6.5 = STRING: "+2.58 Volts" .1.3.6.1.4.1.2.3.51.2.2.20.2.1.1.6.6 = STRING: "+1.85 Volts" .1.3.6.1.4.1.2.3.51.2.2.20.2.1.1.7.1 = STRING: "+5.13 Volts" .1.3.6.1.4.1.2.3.51.2.2.20.2.1.1.7.2 = STRING: "+3.38 Volts" .1.3.6.1.4.1.2.3.51.2.2.20.2.1.1.7.3 = STRING: "+12.06 Volts" .1.3.6.1.4.1.2.3.51.2.2.20.2.1.1.7.4 = STRING: "-4.75 Volts" .1.3.6.1.4.1.2.3.51.2.2.20.2.1.1.7.5 = STRING: "+2.54 Volts" .1.3.6.1.4.1.2.3.51.2.2.20.2.1.1.7.6 = STRING: "+1.82 Volts" .1.3.6.1.4.1.2.3.51.2.2.20.2.1.1.10.1 = STRING: "+4.75 Volts" .1.3.6.1.4.1.2.3.51.2.2.20.2.1.1.10.2 = STRING: "+3.14 Volts" .1.3.6.1.4.1.2.3.51.2.2.20.2.1.1.10.3 = STRING: "+11.53 Volts" .1.3.6.1.4.1.2.3.51.2.2.20.2.1.1.10.4 = STRING: "-5.50 Volts" .1.3.6.1.4.1.2.3.51.2.2.20.2.1.1.10.5 = STRING: "+2.43 Volts" .1.3.6.1.4.1.2.3.51.2.2.20.2.1.1.10.6 = STRING: "+1.75 Volts" .1.3.6.1.4.1.2.3.51.2.2.20.2.1.1.11.1 = STRING: "+4.88 Volts" .1.3.6.1.4.1.2.3.51.2.2.20.2.1.1.11.2 = STRING: "+3.22 Volts" .1.3.6.1.4.1.2.3.51.2.2.20.2.1.1.11.3 = STRING: "+11.70 Volts" .1.3.6.1.4.1.2.3.51.2.2.20.2.1.1.11.4 = STRING: "-5.25 Volts" .1.3.6.1.4.1.2.3.51.2.2.20.2.1.1.11.5 = STRING: "+2.46 Volts" .1.3.6.1.4.1.2.3.51.2.2.20.2.1.1.11.6 = STRING: "+1.78 Volts" .1.3.6.1.4.1.2.3.51.2.2.21.1.1.1.0 = STRING: "0000" .1.3.6.1.4.1.2.3.51.2.2.21.1.1.2.0 = STRING: "000" .1.3.6.1.4.1.2.3.51.2.2.21.1.1.3.0 = STRING: "0000000" .1.3.6.1.4.1.2.3.51.2.2.21.1.1.4.0 = STRING: "A1B7 F231 6F85 11D8 B22B 0010 8303 6DC3" .1.3.6.1.4.1.2.3.51.2.2.21.1.1.5.0 = STRING: "Not Available" .1.3.6.1.4.1.2.3.51.2.2.21.1.1.6.0 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.2.21.1.1.7.0 = STRING: "Not Available" .1.3.6.1.4.1.2.3.51.2.2.21.1.1.8.0 = STRING: "Not Available" .1.3.6.1.4.1.2.3.51.2.2.21.1.1.9.0 = STRING: "Not Available" .1.3.6.1.4.1.2.3.51.2.2.21.1.1.10.0 = STRING: "Not Available" .1.3.6.1.4.1.2.3.51.2.2.21.2.1.1.1.1 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.2.21.2.1.1.1.2 = INTEGER: 2 .1.3.6.1.4.1.2.3.51.2.2.21.2.1.1.2.1 = STRING: "1" .1.3.6.1.4.1.2.3.51.2.2.21.2.1.1.2.2 = STRING: "2" .1.3.6.1.4.1.2.3.51.2.2.21.2.1.1.3.1 = STRING: "IBM" .1.3.6.1.4.1.2.3.51.2.2.21.2.1.1.3.2 = STRING: "IBM" .1.3.6.1.4.1.2.3.51.2.2.21.2.1.1.4.1 = STRING: "90P3696" .1.3.6.1.4.1.2.3.51.2.2.21.2.1.1.4.2 = STRING: "90P3793" .1.3.6.1.4.1.2.3.51.2.2.21.2.1.1.5.1 = INTEGER: 2 .1.3.6.1.4.1.2.3.51.2.2.21.2.1.1.5.2 = INTEGER: 4 .1.3.6.1.4.1.2.3.51.2.2.21.2.1.1.6.1 = STRING: "0000 0000 0000 0000 0000 0000 0000 0000 " .1.3.6.1.4.1.2.3.51.2.2.21.2.1.1.6.2 = STRING: "0074 50C1 5932 11D9 AE84 0010 8335 FCF9 " .1.3.6.1.4.1.2.3.51.2.2.21.2.1.1.7.1 = STRING: "4003" .1.3.6.1.4.1.2.3.51.2.2.21.2.1.1.7.2 = STRING: "0105" .1.3.6.1.4.1.2.3.51.2.2.21.2.1.1.8.1 = STRING: "90P3678" .1.3.6.1.4.1.2.3.51.2.2.21.2.1.1.8.2 = STRING: "90P3685" .1.3.6.1.4.1.2.3.51.2.2.21.2.1.1.9.1 = STRING: "Not available" .1.3.6.1.4.1.2.3.51.2.2.21.2.1.1.9.2 = STRING: "ZJ1UKR4CW00K" .1.3.6.1.4.1.2.3.51.2.2.21.3.1.1.1.1 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.2.21.3.1.1.1.2 = INTEGER: 2 .1.3.6.1.4.1.2.3.51.2.2.21.3.1.1.2.1 = STRING: "Management Module 1" .1.3.6.1.4.1.2.3.51.2.2.21.3.1.1.2.2 = STRING: "Management Module 2" .1.3.6.1.4.1.2.3.51.2.2.21.3.1.1.3.1 = STRING: "BVET43J" .1.3.6.1.4.1.2.3.51.2.2.21.3.1.1.3.2 = STRING: "BVET43J" .1.3.6.1.4.1.2.3.51.2.2.21.3.1.1.4.1 = STRING: " 16" .1.3.6.1.4.1.2.3.51.2.2.21.3.1.1.4.2 = STRING: " 16" .1.3.6.1.4.1.2.3.51.2.2.21.3.1.1.5.1 = STRING: "CNETMNUS.PKT" .1.3.6.1.4.1.2.3.51.2.2.21.3.1.1.5.2 = STRING: "CNETMNUS.PKT" .1.3.6.1.4.1.2.3.51.2.2.21.3.1.1.6.1 = STRING: "06-27-06" .1.3.6.1.4.1.2.3.51.2.2.21.3.1.1.6.2 = STRING: "06-27-06" .1.3.6.1.4.1.2.3.51.2.2.21.3.2.1.1.1 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.2.21.3.2.1.1.2 = INTEGER: 2 .1.3.6.1.4.1.2.3.51.2.2.21.3.2.1.2.1 = STRING: "Management Module 1" .1.3.6.1.4.1.2.3.51.2.2.21.3.2.1.2.2 = STRING: "Management Module 2" .1.3.6.1.4.1.2.3.51.2.2.21.3.2.1.3.1 = STRING: "BVBR33D" .1.3.6.1.4.1.2.3.51.2.2.21.3.2.1.3.2 = STRING: "BVBR33D" .1.3.6.1.4.1.2.3.51.2.2.21.3.2.1.4.1 = STRING: " 16" .1.3.6.1.4.1.2.3.51.2.2.21.3.2.1.4.2 = STRING: " 16" .1.3.6.1.4.1.2.3.51.2.2.21.3.2.1.5.1 = STRING: "CNETBRUS.PKT" .1.3.6.1.4.1.2.3.51.2.2.21.3.2.1.5.2 = STRING: "CNETBRUS.PKT" .1.3.6.1.4.1.2.3.51.2.2.21.3.2.1.6.1 = STRING: "04-12-05" .1.3.6.1.4.1.2.3.51.2.2.21.3.2.1.6.2 = STRING: "04-12-05" .1.3.6.1.4.1.2.3.51.2.2.21.3.3.1.1.1 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.2.21.3.3.1.1.2 = INTEGER: 2 .1.3.6.1.4.1.2.3.51.2.2.21.3.3.1.2.1 = STRING: "Management Module 1" .1.3.6.1.4.1.2.3.51.2.2.21.3.3.1.2.2 = STRING: "Management Module 2" .1.3.6.1.4.1.2.3.51.2.2.21.3.3.1.3.1 = STRING: "BVRG43J" .1.3.6.1.4.1.2.3.51.2.2.21.3.3.1.3.2 = STRING: "BVRG43J" .1.3.6.1.4.1.2.3.51.2.2.21.3.3.1.4.1 = STRING: " 16" .1.3.6.1.4.1.2.3.51.2.2.21.3.3.1.4.2 = STRING: " 16" .1.3.6.1.4.1.2.3.51.2.2.21.3.3.1.5.1 = STRING: "CNETRGUS.PKT" .1.3.6.1.4.1.2.3.51.2.2.21.3.3.1.5.2 = STRING: "CNETRGUS.PKT" .1.3.6.1.4.1.2.3.51.2.2.21.3.3.1.6.1 = STRING: "06-27-06" .1.3.6.1.4.1.2.3.51.2.2.21.3.3.1.6.2 = STRING: "06-27-06" .1.3.6.1.4.1.2.3.51.2.2.21.3.4.1.1.1 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.2.21.3.4.1.1.2 = INTEGER: 2 .1.3.6.1.4.1.2.3.51.2.2.21.3.4.1.2.1 = STRING: "Management Module 1" .1.3.6.1.4.1.2.3.51.2.2.21.3.4.1.2.2 = STRING: "Management Module 2" .1.3.6.1.4.1.2.3.51.2.2.21.3.4.1.3.1 = STRING: "BREZ15" .1.3.6.1.4.1.2.3.51.2.2.21.3.4.1.3.2 = STRING: "BREZ15" .1.3.6.1.4.1.2.3.51.2.2.21.3.4.1.4.1 = STRING: " 1" .1.3.6.1.4.1.2.3.51.2.2.21.3.4.1.4.2 = STRING: " 1" .1.3.6.1.4.1.2.3.51.2.2.21.3.4.1.5.1 = STRING: "DUALPS2.PKT" .1.3.6.1.4.1.2.3.51.2.2.21.3.4.1.5.2 = STRING: "DUALPS2.PKT" .1.3.6.1.4.1.2.3.51.2.2.21.3.4.1.6.1 = STRING: "12-14-05" .1.3.6.1.4.1.2.3.51.2.2.21.3.4.1.6.2 = STRING: "12-14-05" .1.3.6.1.4.1.2.3.51.2.2.21.3.5.1.1.1 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.2.21.3.5.1.1.2 = INTEGER: 2 .1.3.6.1.4.1.2.3.51.2.2.21.3.5.1.2.1 = STRING: "Management Module 1" .1.3.6.1.4.1.2.3.51.2.2.21.3.5.1.2.2 = STRING: "Management Module 2" .1.3.6.1.4.1.2.3.51.2.2.21.3.5.1.3.1 = STRING: "BRPI33" .1.3.6.1.4.1.2.3.51.2.2.21.3.5.1.3.2 = STRING: "BRPI33" .1.3.6.1.4.1.2.3.51.2.2.21.3.5.1.4.1 = STRING: " 1" .1.3.6.1.4.1.2.3.51.2.2.21.3.5.1.4.2 = STRING: " 1" .1.3.6.1.4.1.2.3.51.2.2.21.3.5.1.5.1 = STRING: "DUALPS2.PKT" .1.3.6.1.4.1.2.3.51.2.2.21.3.5.1.5.2 = STRING: "DUALPS2.PKT" .1.3.6.1.4.1.2.3.51.2.2.21.3.5.1.6.1 = STRING: "01-07-04" .1.3.6.1.4.1.2.3.51.2.2.21.3.5.1.6.2 = STRING: "01-07-04" .1.3.6.1.4.1.2.3.51.2.2.21.4.1.1.1.1 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.2.21.4.1.1.1.2 = INTEGER: 2 .1.3.6.1.4.1.2.3.51.2.2.21.4.1.1.1.3 = INTEGER: 3 .1.3.6.1.4.1.2.3.51.2.2.21.4.1.1.1.4 = INTEGER: 4 .1.3.6.1.4.1.2.3.51.2.2.21.4.1.1.1.5 = INTEGER: 5 .1.3.6.1.4.1.2.3.51.2.2.21.4.1.1.1.6 = INTEGER: 6 .1.3.6.1.4.1.2.3.51.2.2.21.4.1.1.1.7 = INTEGER: 7 .1.3.6.1.4.1.2.3.51.2.2.21.4.1.1.1.8 = INTEGER: 8 .1.3.6.1.4.1.2.3.51.2.2.21.4.1.1.2.1 = STRING: "1" .1.3.6.1.4.1.2.3.51.2.2.21.4.1.1.2.2 = STRING: "2" .1.3.6.1.4.1.2.3.51.2.2.21.4.1.1.2.3 = STRING: "3" .1.3.6.1.4.1.2.3.51.2.2.21.4.1.1.2.4 = STRING: "4" .1.3.6.1.4.1.2.3.51.2.2.21.4.1.1.2.5 = STRING: "5" .1.3.6.1.4.1.2.3.51.2.2.21.4.1.1.2.6 = STRING: "6" .1.3.6.1.4.1.2.3.51.2.2.21.4.1.1.2.7 = STRING: "7" .1.3.6.1.4.1.2.3.51.2.2.21.4.1.1.2.8 = STRING: "8" .1.3.6.1.4.1.2.3.51.2.2.21.4.1.1.3.1 = STRING: "IBM" .1.3.6.1.4.1.2.3.51.2.2.21.4.1.1.3.2 = STRING: "Not available" .1.3.6.1.4.1.2.3.51.2.2.21.4.1.1.3.3 = STRING: "IBM" .1.3.6.1.4.1.2.3.51.2.2.21.4.1.1.3.4 = STRING: "IBM" .1.3.6.1.4.1.2.3.51.2.2.21.4.1.1.3.5 = STRING: "IBM" .1.3.6.1.4.1.2.3.51.2.2.21.4.1.1.3.6 = STRING: "Not available" .1.3.6.1.4.1.2.3.51.2.2.21.4.1.1.3.7 = STRING: "Not available" .1.3.6.1.4.1.2.3.51.2.2.21.4.1.1.3.8 = STRING: "IBM" .1.3.6.1.4.1.2.3.51.2.2.21.4.1.1.4.1 = STRING: "31R3389" .1.3.6.1.4.1.2.3.51.2.2.21.4.1.1.4.2 = STRING: "Not available" .1.3.6.1.4.1.2.3.51.2.2.21.4.1.1.4.3 = STRING: "13N2292" .1.3.6.1.4.1.2.3.51.2.2.21.4.1.1.4.4 = STRING: "13N2346" .1.3.6.1.4.1.2.3.51.2.2.21.4.1.1.4.5 = STRING: "13N0504" .1.3.6.1.4.1.2.3.51.2.2.21.4.1.1.4.6 = STRING: "Not available" .1.3.6.1.4.1.2.3.51.2.2.21.4.1.1.4.7 = STRING: "Not available" .1.3.6.1.4.1.2.3.51.2.2.21.4.1.1.4.8 = STRING: "13N1605" .1.3.6.1.4.1.2.3.51.2.2.21.4.1.1.5.1 = INTEGER: 5 .1.3.6.1.4.1.2.3.51.2.2.21.4.1.1.5.2 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.2.21.4.1.1.5.3 = INTEGER: 39 .1.3.6.1.4.1.2.3.51.2.2.21.4.1.1.5.4 = INTEGER: 4 .1.3.6.1.4.1.2.3.51.2.2.21.4.1.1.5.5 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.2.21.4.1.1.5.6 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.2.21.4.1.1.5.7 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.2.21.4.1.1.5.8 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.2.21.4.1.1.6.1 = STRING: "23A0138" .1.3.6.1.4.1.2.3.51.2.2.21.4.1.1.6.2 = STRING: "Not available" .1.3.6.1.4.1.2.3.51.2.2.21.4.1.1.6.3 = STRING: "23Z9899" .1.3.6.1.4.1.2.3.51.2.2.21.4.1.1.6.4 = STRING: "23A0771" .1.3.6.1.4.1.2.3.51.2.2.21.4.1.1.6.5 = STRING: "RAZ0052" .1.3.6.1.4.1.2.3.51.2.2.21.4.1.1.6.6 = STRING: "Not available" .1.3.6.1.4.1.2.3.51.2.2.21.4.1.1.6.7 = STRING: "Not available" .1.3.6.1.4.1.2.3.51.2.2.21.4.1.1.6.8 = STRING: "23Z9101" .1.3.6.1.4.1.2.3.51.2.2.21.4.1.1.7.1 = STRING: "8850" .1.3.6.1.4.1.2.3.51.2.2.21.4.1.1.7.2 = STRING: "Not available" .1.3.6.1.4.1.2.3.51.2.2.21.4.1.1.7.3 = STRING: "8832" .1.3.6.1.4.1.2.3.51.2.2.21.4.1.1.7.4 = STRING: "8843" .1.3.6.1.4.1.2.3.51.2.2.21.4.1.1.7.5 = STRING: "8842" .1.3.6.1.4.1.2.3.51.2.2.21.4.1.1.7.6 = STRING: "Not available" .1.3.6.1.4.1.2.3.51.2.2.21.4.1.1.7.7 = STRING: "Not available" .1.3.6.1.4.1.2.3.51.2.2.21.4.1.1.7.8 = STRING: "8839" .1.3.6.1.4.1.2.3.51.2.2.21.4.1.1.8.1 = STRING: "8CB6 F79B 0AB4 4A12 9AE5 45EF FB7F 4020 " .1.3.6.1.4.1.2.3.51.2.2.21.4.1.1.8.2 = STRING: "Not available" .1.3.6.1.4.1.2.3.51.2.2.21.4.1.1.8.3 = STRING: "64EE EE02 24B4 4A12 9B01 D094 209B 532C " .1.3.6.1.4.1.2.3.51.2.2.21.4.1.1.8.4 = STRING: "FEC0 A5BF 43B4 4A12 896F 03B6 7345 2997 " .1.3.6.1.4.1.2.3.51.2.2.21.4.1.1.8.5 = STRING: "74B7 6C80 B764 11D5 9FF5 000D 601E 811A " .1.3.6.1.4.1.2.3.51.2.2.21.4.1.1.8.6 = STRING: "Not available" .1.3.6.1.4.1.2.3.51.2.2.21.4.1.1.8.7 = STRING: "Not available" .1.3.6.1.4.1.2.3.51.2.2.21.4.1.1.8.8 = STRING: "D5BF 6A11 CFC8 11D8 A265 0060 B0F9 D9C9 " .1.3.6.1.4.1.2.3.51.2.2.21.4.1.1.9.1 = STRING: "0505" .1.3.6.1.4.1.2.3.51.2.2.21.4.1.1.9.2 = STRING: "Not available" .1.3.6.1.4.1.2.3.51.2.2.21.4.1.1.9.3 = STRING: "0404" .1.3.6.1.4.1.2.3.51.2.2.21.4.1.1.9.4 = STRING: "3204" .1.3.6.1.4.1.2.3.51.2.2.21.4.1.1.9.5 = STRING: "2004" .1.3.6.1.4.1.2.3.51.2.2.21.4.1.1.9.6 = STRING: "Not available" .1.3.6.1.4.1.2.3.51.2.2.21.4.1.1.9.7 = STRING: "Not available" .1.3.6.1.4.1.2.3.51.2.2.21.4.1.1.9.8 = STRING: "2804" .1.3.6.1.4.1.2.3.51.2.2.21.4.1.1.10.1 = STRING: "13M8325" .1.3.6.1.4.1.2.3.51.2.2.21.4.1.1.10.2 = STRING: "Not available" .1.3.6.1.4.1.2.3.51.2.2.21.4.1.1.10.3 = STRING: "13N2290" .1.3.6.1.4.1.2.3.51.2.2.21.4.1.1.10.4 = STRING: "26K9392" .1.3.6.1.4.1.2.3.51.2.2.21.4.1.1.10.5 = STRING: "24P8895" .1.3.6.1.4.1.2.3.51.2.2.21.4.1.1.10.6 = STRING: "Not available" .1.3.6.1.4.1.2.3.51.2.2.21.4.1.1.10.7 = STRING: "Not available" .1.3.6.1.4.1.2.3.51.2.2.21.4.1.1.10.8 = STRING: "13N1604" .1.3.6.1.4.1.2.3.51.2.2.21.4.1.1.11.1 = STRING: "ZJ1Z0051W00B" .1.3.6.1.4.1.2.3.51.2.2.21.4.1.1.11.2 = STRING: "Not available" .1.3.6.1.4.1.2.3.51.2.2.21.4.1.1.11.3 = STRING: "ZJ1TS741T1GG" .1.3.6.1.4.1.2.3.51.2.2.21.4.1.1.11.4 = STRING: "ZJ1WLX48512Y" .1.3.6.1.4.1.2.3.51.2.2.21.4.1.1.11.5 = STRING: "ZJ1W6745E17L" .1.3.6.1.4.1.2.3.51.2.2.21.4.1.1.11.6 = STRING: "Not available" .1.3.6.1.4.1.2.3.51.2.2.21.4.1.1.11.7 = STRING: "Not available" .1.3.6.1.4.1.2.3.51.2.2.21.4.1.1.11.8 = STRING: "YJ1SM045701G" .1.3.6.1.4.1.2.3.51.2.2.21.4.1.1.12.1 = STRING: "01Z" .1.3.6.1.4.1.2.3.51.2.2.21.4.1.1.12.2 = STRING: "Not available" .1.3.6.1.4.1.2.3.51.2.2.21.4.1.1.12.3 = STRING: "9TZ" .1.3.6.1.4.1.2.3.51.2.2.21.4.1.1.12.4 = STRING: "11Z" .1.3.6.1.4.1.2.3.51.2.2.21.4.1.1.12.5 = STRING: "41X" .1.3.6.1.4.1.2.3.51.2.2.21.4.1.1.12.6 = STRING: "Not available" .1.3.6.1.4.1.2.3.51.2.2.21.4.1.1.12.7 = STRING: "Not available" .1.3.6.1.4.1.2.3.51.2.2.21.4.1.1.12.8 = STRING: "6TZ" .1.3.6.1.4.1.2.3.51.2.2.21.4.1.1.20.1 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.2.21.4.1.1.20.2 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.2.21.4.1.1.20.3 = INTEGER: 2 .1.3.6.1.4.1.2.3.51.2.2.21.4.1.1.20.4 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.2.21.4.1.1.20.5 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.2.21.4.1.1.20.6 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.2.21.4.1.1.20.7 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.2.21.4.1.1.20.8 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.2.21.4.1.1.21.1 = STRING: "Not available" .1.3.6.1.4.1.2.3.51.2.2.21.4.1.1.21.2 = STRING: "Not available" .1.3.6.1.4.1.2.3.51.2.2.21.4.1.1.21.3 = STRING: "Not available" .1.3.6.1.4.1.2.3.51.2.2.21.4.1.1.21.4 = STRING: "Not available" .1.3.6.1.4.1.2.3.51.2.2.21.4.1.1.21.5 = STRING: "Not available" .1.3.6.1.4.1.2.3.51.2.2.21.4.1.1.21.6 = STRING: "Not available" .1.3.6.1.4.1.2.3.51.2.2.21.4.1.1.21.7 = STRING: "Not available" .1.3.6.1.4.1.2.3.51.2.2.21.4.1.1.21.8 = STRING: "SLRM" .1.3.6.1.4.1.2.3.51.2.2.21.4.1.1.22.1 = STRING: "Not available" .1.3.6.1.4.1.2.3.51.2.2.21.4.1.1.22.2 = STRING: "Not available" .1.3.6.1.4.1.2.3.51.2.2.21.4.1.1.22.3 = STRING: "Not available" .1.3.6.1.4.1.2.3.51.2.2.21.4.1.1.22.4 = STRING: "Not available" .1.3.6.1.4.1.2.3.51.2.2.21.4.1.1.22.5 = STRING: "Not available" .1.3.6.1.4.1.2.3.51.2.2.21.4.1.1.22.6 = STRING: "Not available" .1.3.6.1.4.1.2.3.51.2.2.21.4.1.1.22.7 = STRING: "Not available" .1.3.6.1.4.1.2.3.51.2.2.21.4.1.1.22.8 = STRING: "59P6624" .1.3.6.1.4.1.2.3.51.2.2.21.4.1.1.23.1 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.2.21.4.1.1.23.2 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.2.21.4.1.1.23.3 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.2.21.4.1.1.23.4 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.2.21.4.1.1.23.5 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.2.21.4.1.1.23.6 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.2.21.4.1.1.23.7 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.2.21.4.1.1.23.8 = INTEGER: 5 .1.3.6.1.4.1.2.3.51.2.2.21.4.1.1.24.1 = STRING: "Not available" .1.3.6.1.4.1.2.3.51.2.2.21.4.1.1.24.2 = STRING: "Not available" .1.3.6.1.4.1.2.3.51.2.2.21.4.1.1.24.3 = STRING: "Not available" .1.3.6.1.4.1.2.3.51.2.2.21.4.1.1.24.4 = STRING: "Not available" .1.3.6.1.4.1.2.3.51.2.2.21.4.1.1.24.5 = STRING: "Not available" .1.3.6.1.4.1.2.3.51.2.2.21.4.1.1.24.6 = STRING: "Not available" .1.3.6.1.4.1.2.3.51.2.2.21.4.1.1.24.7 = STRING: "Not available" .1.3.6.1.4.1.2.3.51.2.2.21.4.1.1.24.8 = STRING: "Not available" .1.3.6.1.4.1.2.3.51.2.2.21.4.1.1.25.1 = STRING: "Not available" .1.3.6.1.4.1.2.3.51.2.2.21.4.1.1.25.2 = STRING: "Not available" .1.3.6.1.4.1.2.3.51.2.2.21.4.1.1.25.3 = STRING: "Not available" .1.3.6.1.4.1.2.3.51.2.2.21.4.1.1.25.4 = STRING: "Not available" .1.3.6.1.4.1.2.3.51.2.2.21.4.1.1.25.5 = STRING: "Not available" .1.3.6.1.4.1.2.3.51.2.2.21.4.1.1.25.6 = STRING: "Not available" .1.3.6.1.4.1.2.3.51.2.2.21.4.1.1.25.7 = STRING: "Not available" .1.3.6.1.4.1.2.3.51.2.2.21.4.1.1.25.8 = STRING: "Not available" .1.3.6.1.4.1.2.3.51.2.2.21.4.1.1.26.1 = STRING: "Not available" .1.3.6.1.4.1.2.3.51.2.2.21.4.1.1.26.2 = STRING: "Not available" .1.3.6.1.4.1.2.3.51.2.2.21.4.1.1.26.3 = STRING: "Not available" .1.3.6.1.4.1.2.3.51.2.2.21.4.1.1.26.4 = STRING: "Not available" .1.3.6.1.4.1.2.3.51.2.2.21.4.1.1.26.5 = STRING: "Not available" .1.3.6.1.4.1.2.3.51.2.2.21.4.1.1.26.6 = STRING: "Not available" .1.3.6.1.4.1.2.3.51.2.2.21.4.1.1.26.7 = STRING: "Not available" .1.3.6.1.4.1.2.3.51.2.2.21.4.1.1.26.8 = STRING: "0000 0000 0000 0000 0000 0000 0000 0000 " .1.3.6.1.4.1.2.3.51.2.2.21.4.1.1.27.1 = STRING: "Not available" .1.3.6.1.4.1.2.3.51.2.2.21.4.1.1.27.2 = STRING: "Not available" .1.3.6.1.4.1.2.3.51.2.2.21.4.1.1.27.3 = STRING: "Not available" .1.3.6.1.4.1.2.3.51.2.2.21.4.1.1.27.4 = STRING: "Not available" .1.3.6.1.4.1.2.3.51.2.2.21.4.1.1.27.5 = STRING: "Not available" .1.3.6.1.4.1.2.3.51.2.2.21.4.1.1.27.6 = STRING: "Not available" .1.3.6.1.4.1.2.3.51.2.2.21.4.1.1.27.7 = STRING: "Not available" .1.3.6.1.4.1.2.3.51.2.2.21.4.1.1.27.8 = STRING: "4603" .1.3.6.1.4.1.2.3.51.2.2.21.4.1.1.28.1 = STRING: "Not available" .1.3.6.1.4.1.2.3.51.2.2.21.4.1.1.28.2 = STRING: "Not available" .1.3.6.1.4.1.2.3.51.2.2.21.4.1.1.28.3 = STRING: "Not available" .1.3.6.1.4.1.2.3.51.2.2.21.4.1.1.28.4 = STRING: "Not available" .1.3.6.1.4.1.2.3.51.2.2.21.4.1.1.28.5 = STRING: "Not available" .1.3.6.1.4.1.2.3.51.2.2.21.4.1.1.28.6 = STRING: "Not available" .1.3.6.1.4.1.2.3.51.2.2.21.4.1.1.28.7 = STRING: "Not available" .1.3.6.1.4.1.2.3.51.2.2.21.4.1.1.28.8 = STRING: "59P6623" .1.3.6.1.4.1.2.3.51.2.2.21.4.1.1.29.1 = STRING: "Not available" .1.3.6.1.4.1.2.3.51.2.2.21.4.1.1.29.2 = STRING: "Not available" .1.3.6.1.4.1.2.3.51.2.2.21.4.1.1.29.3 = STRING: "Not available" .1.3.6.1.4.1.2.3.51.2.2.21.4.1.1.29.4 = STRING: "Not available" .1.3.6.1.4.1.2.3.51.2.2.21.4.1.1.29.5 = STRING: "Not available" .1.3.6.1.4.1.2.3.51.2.2.21.4.1.1.29.6 = STRING: "Not available" .1.3.6.1.4.1.2.3.51.2.2.21.4.1.1.29.7 = STRING: "Not available" .1.3.6.1.4.1.2.3.51.2.2.21.4.1.1.29.8 = STRING: "J1RJH3BH12J" .1.3.6.1.4.1.2.3.51.2.2.21.4.2.1.1.1 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.2.21.4.2.1.1.2 = INTEGER: 2 .1.3.6.1.4.1.2.3.51.2.2.21.4.2.1.1.3 = INTEGER: 3 .1.3.6.1.4.1.2.3.51.2.2.21.4.2.1.1.4 = INTEGER: 4 .1.3.6.1.4.1.2.3.51.2.2.21.4.2.1.1.5 = INTEGER: 5 .1.3.6.1.4.1.2.3.51.2.2.21.4.2.1.1.6 = INTEGER: 6 .1.3.6.1.4.1.2.3.51.2.2.21.4.2.1.1.7 = INTEGER: 7 .1.3.6.1.4.1.2.3.51.2.2.21.4.2.1.1.8 = INTEGER: 8 .1.3.6.1.4.1.2.3.51.2.2.21.4.2.1.2.1 = STRING: "00:11:25:75:00:c2" .1.3.6.1.4.1.2.3.51.2.2.21.4.2.1.2.2 = STRING: "Not Installed" .1.3.6.1.4.1.2.3.51.2.2.21.4.2.1.2.3 = STRING: "00:0d:60:4e:74:be" .1.3.6.1.4.1.2.3.51.2.2.21.4.2.1.2.4 = STRING: "00:0d:60:5b:93:d0" .1.3.6.1.4.1.2.3.51.2.2.21.4.2.1.2.5 = STRING: "00:0d:60:1e:81:1a" .1.3.6.1.4.1.2.3.51.2.2.21.4.2.1.2.6 = STRING: "Not Installed" .1.3.6.1.4.1.2.3.51.2.2.21.4.2.1.2.7 = STRING: "Not Installed" .1.3.6.1.4.1.2.3.51.2.2.21.4.2.1.2.8 = STRING: "00:0e:0c:32:04:2a" .1.3.6.1.4.1.2.3.51.2.2.21.4.2.1.3.1 = STRING: "00:11:25:75:00:c3" .1.3.6.1.4.1.2.3.51.2.2.21.4.2.1.3.2 = STRING: "Not Installed" .1.3.6.1.4.1.2.3.51.2.2.21.4.2.1.3.3 = STRING: "00:0d:60:4e:74:bf" .1.3.6.1.4.1.2.3.51.2.2.21.4.2.1.3.4 = STRING: "00:0d:60:5b:93:d1" .1.3.6.1.4.1.2.3.51.2.2.21.4.2.1.3.5 = STRING: "00:0d:60:1e:81:1b" .1.3.6.1.4.1.2.3.51.2.2.21.4.2.1.3.6 = STRING: "Not Installed" .1.3.6.1.4.1.2.3.51.2.2.21.4.2.1.3.7 = STRING: "Not Installed" .1.3.6.1.4.1.2.3.51.2.2.21.4.2.1.3.8 = STRING: "00:0e:0c:32:04:2b" .1.3.6.1.4.1.2.3.51.2.2.21.4.2.1.4.1 = STRING: "Not Available" .1.3.6.1.4.1.2.3.51.2.2.21.4.2.1.4.2 = STRING: "Not Installed" .1.3.6.1.4.1.2.3.51.2.2.21.4.2.1.4.3 = STRING: "Not Available" .1.3.6.1.4.1.2.3.51.2.2.21.4.2.1.4.4 = STRING: "Not Available" .1.3.6.1.4.1.2.3.51.2.2.21.4.2.1.4.5 = STRING: "Not Available" .1.3.6.1.4.1.2.3.51.2.2.21.4.2.1.4.6 = STRING: "Not Installed" .1.3.6.1.4.1.2.3.51.2.2.21.4.2.1.4.7 = STRING: "Not Installed" .1.3.6.1.4.1.2.3.51.2.2.21.4.2.1.4.8 = STRING: "00:0e:0c:32:04:28" .1.3.6.1.4.1.2.3.51.2.2.21.4.2.1.5.1 = STRING: "Not Available" .1.3.6.1.4.1.2.3.51.2.2.21.4.2.1.5.2 = STRING: "Not Installed" .1.3.6.1.4.1.2.3.51.2.2.21.4.2.1.5.3 = STRING: "Not Available" .1.3.6.1.4.1.2.3.51.2.2.21.4.2.1.5.4 = STRING: "Not Available" .1.3.6.1.4.1.2.3.51.2.2.21.4.2.1.5.5 = STRING: "Not Available" .1.3.6.1.4.1.2.3.51.2.2.21.4.2.1.5.6 = STRING: "Not Installed" .1.3.6.1.4.1.2.3.51.2.2.21.4.2.1.5.7 = STRING: "Not Installed" .1.3.6.1.4.1.2.3.51.2.2.21.4.2.1.5.8 = STRING: "00:0e:0c:32:04:29" .1.3.6.1.4.1.2.3.51.2.2.21.4.2.1.10.1 = STRING: "Not Installed" .1.3.6.1.4.1.2.3.51.2.2.21.4.2.1.10.2 = STRING: "Not Installed" .1.3.6.1.4.1.2.3.51.2.2.21.4.2.1.10.3 = STRING: "Not Installed" .1.3.6.1.4.1.2.3.51.2.2.21.4.2.1.10.4 = STRING: "Not Installed" .1.3.6.1.4.1.2.3.51.2.2.21.4.2.1.10.5 = STRING: "Not Installed" .1.3.6.1.4.1.2.3.51.2.2.21.4.2.1.10.6 = STRING: "Not Installed" .1.3.6.1.4.1.2.3.51.2.2.21.4.2.1.10.7 = STRING: "Not Installed" .1.3.6.1.4.1.2.3.51.2.2.21.4.2.1.10.8 = STRING: "Not Available" .1.3.6.1.4.1.2.3.51.2.2.21.4.2.1.11.1 = STRING: "Not Installed" .1.3.6.1.4.1.2.3.51.2.2.21.4.2.1.11.2 = STRING: "Not Installed" .1.3.6.1.4.1.2.3.51.2.2.21.4.2.1.11.3 = STRING: "Not Installed" .1.3.6.1.4.1.2.3.51.2.2.21.4.2.1.11.4 = STRING: "Not Installed" .1.3.6.1.4.1.2.3.51.2.2.21.4.2.1.11.5 = STRING: "Not Installed" .1.3.6.1.4.1.2.3.51.2.2.21.4.2.1.11.6 = STRING: "Not Installed" .1.3.6.1.4.1.2.3.51.2.2.21.4.2.1.11.7 = STRING: "Not Installed" .1.3.6.1.4.1.2.3.51.2.2.21.4.2.1.11.8 = STRING: "Not Available" .1.3.6.1.4.1.2.3.51.2.2.21.4.2.1.12.1 = STRING: "Not Installed" .1.3.6.1.4.1.2.3.51.2.2.21.4.2.1.12.2 = STRING: "Not Installed" .1.3.6.1.4.1.2.3.51.2.2.21.4.2.1.12.3 = STRING: "Not Installed" .1.3.6.1.4.1.2.3.51.2.2.21.4.2.1.12.4 = STRING: "Not Installed" .1.3.6.1.4.1.2.3.51.2.2.21.4.2.1.12.5 = STRING: "Not Installed" .1.3.6.1.4.1.2.3.51.2.2.21.4.2.1.12.6 = STRING: "Not Installed" .1.3.6.1.4.1.2.3.51.2.2.21.4.2.1.12.7 = STRING: "Not Installed" .1.3.6.1.4.1.2.3.51.2.2.21.4.2.1.12.8 = STRING: "Not Available" .1.3.6.1.4.1.2.3.51.2.2.21.4.2.1.13.1 = STRING: "Not Installed" .1.3.6.1.4.1.2.3.51.2.2.21.4.2.1.13.2 = STRING: "Not Installed" .1.3.6.1.4.1.2.3.51.2.2.21.4.2.1.13.3 = STRING: "Not Installed" .1.3.6.1.4.1.2.3.51.2.2.21.4.2.1.13.4 = STRING: "Not Installed" .1.3.6.1.4.1.2.3.51.2.2.21.4.2.1.13.5 = STRING: "Not Installed" .1.3.6.1.4.1.2.3.51.2.2.21.4.2.1.13.6 = STRING: "Not Installed" .1.3.6.1.4.1.2.3.51.2.2.21.4.2.1.13.7 = STRING: "Not Installed" .1.3.6.1.4.1.2.3.51.2.2.21.4.2.1.13.8 = STRING: "Not Available" .1.3.6.1.4.1.2.3.51.2.2.21.4.2.1.18.1 = STRING: "Not Installed" .1.3.6.1.4.1.2.3.51.2.2.21.4.2.1.18.2 = STRING: "Not Installed" .1.3.6.1.4.1.2.3.51.2.2.21.4.2.1.18.3 = STRING: "Not Installed" .1.3.6.1.4.1.2.3.51.2.2.21.4.2.1.18.4 = STRING: "Not Installed" .1.3.6.1.4.1.2.3.51.2.2.21.4.2.1.18.5 = STRING: "Not Installed" .1.3.6.1.4.1.2.3.51.2.2.21.4.2.1.18.6 = STRING: "Not Installed" .1.3.6.1.4.1.2.3.51.2.2.21.4.2.1.18.7 = STRING: "Not Installed" .1.3.6.1.4.1.2.3.51.2.2.21.4.2.1.18.8 = STRING: "Not Installed" .1.3.6.1.4.1.2.3.51.2.2.21.4.2.1.19.1 = STRING: "Not Installed" .1.3.6.1.4.1.2.3.51.2.2.21.4.2.1.19.2 = STRING: "Not Installed" .1.3.6.1.4.1.2.3.51.2.2.21.4.2.1.19.3 = STRING: "Not Installed" .1.3.6.1.4.1.2.3.51.2.2.21.4.2.1.19.4 = STRING: "Not Installed" .1.3.6.1.4.1.2.3.51.2.2.21.4.2.1.19.5 = STRING: "Not Installed" .1.3.6.1.4.1.2.3.51.2.2.21.4.2.1.19.6 = STRING: "Not Installed" .1.3.6.1.4.1.2.3.51.2.2.21.4.2.1.19.7 = STRING: "Not Installed" .1.3.6.1.4.1.2.3.51.2.2.21.4.2.1.19.8 = STRING: "Not Installed" .1.3.6.1.4.1.2.3.51.2.2.21.4.2.1.20.1 = STRING: "Not Installed" .1.3.6.1.4.1.2.3.51.2.2.21.4.2.1.20.2 = STRING: "Not Installed" .1.3.6.1.4.1.2.3.51.2.2.21.4.2.1.20.3 = STRING: "Not Installed" .1.3.6.1.4.1.2.3.51.2.2.21.4.2.1.20.4 = STRING: "Not Installed" .1.3.6.1.4.1.2.3.51.2.2.21.4.2.1.20.5 = STRING: "Not Installed" .1.3.6.1.4.1.2.3.51.2.2.21.4.2.1.20.6 = STRING: "Not Installed" .1.3.6.1.4.1.2.3.51.2.2.21.4.2.1.20.7 = STRING: "Not Installed" .1.3.6.1.4.1.2.3.51.2.2.21.4.2.1.20.8 = STRING: "Not Installed" .1.3.6.1.4.1.2.3.51.2.2.21.4.2.1.21.1 = STRING: "Not Installed" .1.3.6.1.4.1.2.3.51.2.2.21.4.2.1.21.2 = STRING: "Not Installed" .1.3.6.1.4.1.2.3.51.2.2.21.4.2.1.21.3 = STRING: "Not Installed" .1.3.6.1.4.1.2.3.51.2.2.21.4.2.1.21.4 = STRING: "Not Installed" .1.3.6.1.4.1.2.3.51.2.2.21.4.2.1.21.5 = STRING: "Not Installed" .1.3.6.1.4.1.2.3.51.2.2.21.4.2.1.21.6 = STRING: "Not Installed" .1.3.6.1.4.1.2.3.51.2.2.21.4.2.1.21.7 = STRING: "Not Installed" .1.3.6.1.4.1.2.3.51.2.2.21.4.2.1.21.8 = STRING: "Not Installed" .1.3.6.1.4.1.2.3.51.2.2.21.5.1.1.1.1 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.2.21.5.1.1.1.2 = INTEGER: 2 .1.3.6.1.4.1.2.3.51.2.2.21.5.1.1.1.3 = INTEGER: 3 .1.3.6.1.4.1.2.3.51.2.2.21.5.1.1.1.4 = INTEGER: 4 .1.3.6.1.4.1.2.3.51.2.2.21.5.1.1.1.5 = INTEGER: 5 .1.3.6.1.4.1.2.3.51.2.2.21.5.1.1.1.6 = INTEGER: 6 .1.3.6.1.4.1.2.3.51.2.2.21.5.1.1.1.7 = INTEGER: 7 .1.3.6.1.4.1.2.3.51.2.2.21.5.1.1.1.8 = INTEGER: 8 .1.3.6.1.4.1.2.3.51.2.2.21.5.1.1.2.1 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.2.21.5.1.1.2.2 = INTEGER: 2 .1.3.6.1.4.1.2.3.51.2.2.21.5.1.1.2.3 = INTEGER: 3 .1.3.6.1.4.1.2.3.51.2.2.21.5.1.1.2.4 = INTEGER: 4 .1.3.6.1.4.1.2.3.51.2.2.21.5.1.1.2.5 = INTEGER: 5 .1.3.6.1.4.1.2.3.51.2.2.21.5.1.1.2.6 = INTEGER: 6 .1.3.6.1.4.1.2.3.51.2.2.21.5.1.1.2.7 = INTEGER: 7 .1.3.6.1.4.1.2.3.51.2.2.21.5.1.1.2.8 = INTEGER: 8 .1.3.6.1.4.1.2.3.51.2.2.21.5.1.1.3.1 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.2.21.5.1.1.3.2 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.2.21.5.1.1.3.3 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.2.21.5.1.1.3.4 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.2.21.5.1.1.3.5 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.2.21.5.1.1.3.6 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.2.21.5.1.1.3.7 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.2.21.5.1.1.3.8 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.2.21.5.1.1.4.1 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.2.21.5.1.1.4.2 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.2.21.5.1.1.4.3 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.2.21.5.1.1.4.4 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.2.21.5.1.1.4.5 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.2.21.5.1.1.4.6 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.2.21.5.1.1.4.7 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.2.21.5.1.1.4.8 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.2.21.5.1.1.5.1 = STRING: "Mor38____FC3" .1.3.6.1.4.1.2.3.51.2.2.21.5.1.1.5.2 = STRING: "(No name)" .1.3.6.1.4.1.2.3.51.2.2.21.5.1.1.5.3 = STRING: "L99_P_____FC" .1.3.6.1.4.1.2.3.51.2.2.21.5.1.1.5.4 = STRING: "G71______SU" .1.3.6.1.4.1.2.3.51.2.2.21.5.1.1.5.5 = STRING: "J52_Lin_p64" .1.3.6.1.4.1.2.3.51.2.2.21.5.1.1.5.6 = STRING: "(No name)" .1.3.6.1.4.1.2.3.51.2.2.21.5.1.1.5.7 = STRING: "(No name)" .1.3.6.1.4.1.2.3.51.2.2.21.5.1.1.5.8 = STRING: "M01____RHEL4" .1.3.6.1.4.1.2.3.51.2.2.21.5.1.1.6.1 = STRING: "BKE121AUS " .1.3.6.1.4.1.2.3.51.2.2.21.5.1.1.6.2 = STRING: "(No build ID)" .1.3.6.1.4.1.2.3.51.2.2.21.5.1.1.6.3 = STRING: "(No build ID)" .1.3.6.1.4.1.2.3.51.2.2.21.5.1.1.6.4 = STRING: "BWE124AUS " .1.3.6.1.4.1.2.3.51.2.2.21.5.1.1.6.5 = STRING: "(No build ID)" .1.3.6.1.4.1.2.3.51.2.2.21.5.1.1.6.6 = STRING: "(No build ID)" .1.3.6.1.4.1.2.3.51.2.2.21.5.1.1.6.7 = STRING: "(No build ID)" .1.3.6.1.4.1.2.3.51.2.2.21.5.1.1.6.8 = STRING: "(No build ID)" .1.3.6.1.4.1.2.3.51.2.2.21.5.1.1.7.1 = STRING: "1.08" .1.3.6.1.4.1.2.3.51.2.2.21.5.1.1.7.2 = STRING: "(No revision)" .1.3.6.1.4.1.2.3.51.2.2.21.5.1.1.7.3 = STRING: "(No revision)" .1.3.6.1.4.1.2.3.51.2.2.21.5.1.1.7.4 = STRING: "1.08" .1.3.6.1.4.1.2.3.51.2.2.21.5.1.1.7.5 = STRING: "(No revision)" .1.3.6.1.4.1.2.3.51.2.2.21.5.1.1.7.6 = STRING: "(No revision)" .1.3.6.1.4.1.2.3.51.2.2.21.5.1.1.7.7 = STRING: "(No revision)" .1.3.6.1.4.1.2.3.51.2.2.21.5.1.1.7.8 = STRING: "(No revision)" .1.3.6.1.4.1.2.3.51.2.2.21.5.1.1.8.1 = STRING: "01/12/2006" .1.3.6.1.4.1.2.3.51.2.2.21.5.1.1.8.2 = STRING: "(No build date)" .1.3.6.1.4.1.2.3.51.2.2.21.5.1.1.8.3 = STRING: "(No build date)" .1.3.6.1.4.1.2.3.51.2.2.21.5.1.1.8.4 = STRING: "05/11/2006" .1.3.6.1.4.1.2.3.51.2.2.21.5.1.1.8.5 = STRING: "(No build date)" .1.3.6.1.4.1.2.3.51.2.2.21.5.1.1.8.6 = STRING: "(No build date)" .1.3.6.1.4.1.2.3.51.2.2.21.5.1.1.8.7 = STRING: "(No build date)" .1.3.6.1.4.1.2.3.51.2.2.21.5.1.1.8.8 = STRING: "(No build date)" .1.3.6.1.4.1.2.3.51.2.2.21.5.2.1.1.1 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.2.21.5.2.1.1.2 = INTEGER: 2 .1.3.6.1.4.1.2.3.51.2.2.21.5.2.1.1.3 = INTEGER: 3 .1.3.6.1.4.1.2.3.51.2.2.21.5.2.1.1.4 = INTEGER: 4 .1.3.6.1.4.1.2.3.51.2.2.21.5.2.1.1.5 = INTEGER: 5 .1.3.6.1.4.1.2.3.51.2.2.21.5.2.1.1.6 = INTEGER: 6 .1.3.6.1.4.1.2.3.51.2.2.21.5.2.1.1.7 = INTEGER: 7 .1.3.6.1.4.1.2.3.51.2.2.21.5.2.1.1.8 = INTEGER: 8 .1.3.6.1.4.1.2.3.51.2.2.21.5.2.1.2.1 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.2.21.5.2.1.2.2 = INTEGER: 2 .1.3.6.1.4.1.2.3.51.2.2.21.5.2.1.2.3 = INTEGER: 3 .1.3.6.1.4.1.2.3.51.2.2.21.5.2.1.2.4 = INTEGER: 4 .1.3.6.1.4.1.2.3.51.2.2.21.5.2.1.2.5 = INTEGER: 5 .1.3.6.1.4.1.2.3.51.2.2.21.5.2.1.2.6 = INTEGER: 6 .1.3.6.1.4.1.2.3.51.2.2.21.5.2.1.2.7 = INTEGER: 7 .1.3.6.1.4.1.2.3.51.2.2.21.5.2.1.2.8 = INTEGER: 8 .1.3.6.1.4.1.2.3.51.2.2.21.5.2.1.3.1 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.2.21.5.2.1.3.2 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.2.21.5.2.1.3.3 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.2.21.5.2.1.3.4 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.2.21.5.2.1.3.5 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.2.21.5.2.1.3.6 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.2.21.5.2.1.3.7 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.2.21.5.2.1.3.8 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.2.21.5.2.1.4.1 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.2.21.5.2.1.4.2 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.2.21.5.2.1.4.3 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.2.21.5.2.1.4.4 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.2.21.5.2.1.4.5 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.2.21.5.2.1.4.6 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.2.21.5.2.1.4.7 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.2.21.5.2.1.4.8 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.2.21.5.2.1.5.1 = STRING: "Mor38____FC3" .1.3.6.1.4.1.2.3.51.2.2.21.5.2.1.5.2 = STRING: "(No name)" .1.3.6.1.4.1.2.3.51.2.2.21.5.2.1.5.3 = STRING: "L99_P_____FC" .1.3.6.1.4.1.2.3.51.2.2.21.5.2.1.5.4 = STRING: "G71______SU" .1.3.6.1.4.1.2.3.51.2.2.21.5.2.1.5.5 = STRING: "J52_Lin_p64" .1.3.6.1.4.1.2.3.51.2.2.21.5.2.1.5.6 = STRING: "(No name)" .1.3.6.1.4.1.2.3.51.2.2.21.5.2.1.5.7 = STRING: "(No name)" .1.3.6.1.4.1.2.3.51.2.2.21.5.2.1.5.8 = STRING: "M01____RHEL4" .1.3.6.1.4.1.2.3.51.2.2.21.5.2.1.6.1 = STRING: "BKYT16AUS " .1.3.6.1.4.1.2.3.51.2.2.21.5.2.1.6.2 = STRING: "(No build ID)" .1.3.6.1.4.1.2.3.51.2.2.21.5.2.1.6.3 = STRING: "(No build ID)" .1.3.6.1.4.1.2.3.51.2.2.21.5.2.1.6.4 = STRING: "BWYT01AUS " .1.3.6.1.4.1.2.3.51.2.2.21.5.2.1.6.5 = STRING: "(No build ID)" .1.3.6.1.4.1.2.3.51.2.2.21.5.2.1.6.6 = STRING: "(No build ID)" .1.3.6.1.4.1.2.3.51.2.2.21.5.2.1.6.7 = STRING: "(No build ID)" .1.3.6.1.4.1.2.3.51.2.2.21.5.2.1.6.8 = STRING: "(No build ID)" .1.3.6.1.4.1.2.3.51.2.2.21.5.2.1.7.1 = STRING: "1.03" .1.3.6.1.4.1.2.3.51.2.2.21.5.2.1.7.2 = STRING: "(No revision)" .1.3.6.1.4.1.2.3.51.2.2.21.5.2.1.7.3 = STRING: "1.02" .1.3.6.1.4.1.2.3.51.2.2.21.5.2.1.7.4 = STRING: "1.00" .1.3.6.1.4.1.2.3.51.2.2.21.5.2.1.7.5 = STRING: "(No revision)" .1.3.6.1.4.1.2.3.51.2.2.21.5.2.1.7.6 = STRING: "(No revision)" .1.3.6.1.4.1.2.3.51.2.2.21.5.2.1.7.7 = STRING: "(No revision)" .1.3.6.1.4.1.2.3.51.2.2.21.5.2.1.7.8 = STRING: "(No revision)" .1.3.6.1.4.1.2.3.51.2.2.21.5.2.1.8.1 = STRING: "12/20/2005" .1.3.6.1.4.1.2.3.51.2.2.21.5.2.1.8.2 = STRING: "(No build date)" .1.3.6.1.4.1.2.3.51.2.2.21.5.2.1.8.3 = STRING: "02/11/2004" .1.3.6.1.4.1.2.3.51.2.2.21.5.2.1.8.4 = STRING: "06/11/2004" .1.3.6.1.4.1.2.3.51.2.2.21.5.2.1.8.5 = STRING: "(No build date)" .1.3.6.1.4.1.2.3.51.2.2.21.5.2.1.8.6 = STRING: "(No build date)" .1.3.6.1.4.1.2.3.51.2.2.21.5.2.1.8.7 = STRING: "(No build date)" .1.3.6.1.4.1.2.3.51.2.2.21.5.2.1.8.8 = STRING: "(No build date)" .1.3.6.1.4.1.2.3.51.2.2.21.5.3.1.1.1 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.2.21.5.3.1.1.2 = INTEGER: 2 .1.3.6.1.4.1.2.3.51.2.2.21.5.3.1.1.3 = INTEGER: 3 .1.3.6.1.4.1.2.3.51.2.2.21.5.3.1.1.4 = INTEGER: 4 .1.3.6.1.4.1.2.3.51.2.2.21.5.3.1.1.5 = INTEGER: 5 .1.3.6.1.4.1.2.3.51.2.2.21.5.3.1.1.6 = INTEGER: 6 .1.3.6.1.4.1.2.3.51.2.2.21.5.3.1.1.7 = INTEGER: 7 .1.3.6.1.4.1.2.3.51.2.2.21.5.3.1.1.8 = INTEGER: 8 .1.3.6.1.4.1.2.3.51.2.2.21.5.3.1.2.1 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.2.21.5.3.1.2.2 = INTEGER: 2 .1.3.6.1.4.1.2.3.51.2.2.21.5.3.1.2.3 = INTEGER: 3 .1.3.6.1.4.1.2.3.51.2.2.21.5.3.1.2.4 = INTEGER: 4 .1.3.6.1.4.1.2.3.51.2.2.21.5.3.1.2.5 = INTEGER: 5 .1.3.6.1.4.1.2.3.51.2.2.21.5.3.1.2.6 = INTEGER: 6 .1.3.6.1.4.1.2.3.51.2.2.21.5.3.1.2.7 = INTEGER: 7 .1.3.6.1.4.1.2.3.51.2.2.21.5.3.1.2.8 = INTEGER: 8 .1.3.6.1.4.1.2.3.51.2.2.21.5.3.1.3.1 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.2.21.5.3.1.3.2 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.2.21.5.3.1.3.3 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.2.21.5.3.1.3.4 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.2.21.5.3.1.3.5 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.2.21.5.3.1.3.6 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.2.21.5.3.1.3.7 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.2.21.5.3.1.3.8 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.2.21.5.3.1.4.1 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.2.21.5.3.1.4.2 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.2.21.5.3.1.4.3 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.2.21.5.3.1.4.4 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.2.21.5.3.1.4.5 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.2.21.5.3.1.4.6 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.2.21.5.3.1.4.7 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.2.21.5.3.1.4.8 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.2.21.5.3.1.5.1 = STRING: "Mor38____FC3" .1.3.6.1.4.1.2.3.51.2.2.21.5.3.1.5.2 = STRING: "(No name)" .1.3.6.1.4.1.2.3.51.2.2.21.5.3.1.5.3 = STRING: "L99_P_____FC" .1.3.6.1.4.1.2.3.51.2.2.21.5.3.1.5.4 = STRING: "G71______SU" .1.3.6.1.4.1.2.3.51.2.2.21.5.3.1.5.5 = STRING: "J52_Lin_p64" .1.3.6.1.4.1.2.3.51.2.2.21.5.3.1.5.6 = STRING: "(No name)" .1.3.6.1.4.1.2.3.51.2.2.21.5.3.1.5.7 = STRING: "(No name)" .1.3.6.1.4.1.2.3.51.2.2.21.5.3.1.5.8 = STRING: "M01____RHEL4" .1.3.6.1.4.1.2.3.51.2.2.21.5.3.1.6.1 = Hex-STRING: 02 42 4B 42 54 31 37 43 .1.3.6.1.4.1.2.3.51.2.2.21.5.3.1.6.2 = STRING: "(No build ID)" .1.3.6.1.4.1.2.3.51.2.2.21.5.3.1.6.3 = STRING: "BR8T34A" .1.3.6.1.4.1.2.3.51.2.2.21.5.3.1.6.4 = Hex-STRING: 01 42 57 42 54 32 35 41 .1.3.6.1.4.1.2.3.51.2.2.21.5.3.1.6.5 = STRING: "BQ8T18A" .1.3.6.1.4.1.2.3.51.2.2.21.5.3.1.6.6 = STRING: "(No build ID)" .1.3.6.1.4.1.2.3.51.2.2.21.5.3.1.6.7 = STRING: "(No build ID)" .1.3.6.1.4.1.2.3.51.2.2.21.5.3.1.6.8 = STRING: "BRMK26A" .1.3.6.1.4.1.2.3.51.2.2.21.5.3.1.7.1 = STRING: " 2.04" .1.3.6.1.4.1.2.3.51.2.2.21.5.3.1.7.2 = STRING: "(No revision)" .1.3.6.1.4.1.2.3.51.2.2.21.5.3.1.7.3 = STRING: "34" .1.3.6.1.4.1.2.3.51.2.2.21.5.3.1.7.4 = STRING: " 1.16" .1.3.6.1.4.1.2.3.51.2.2.21.5.3.1.7.5 = STRING: "17" .1.3.6.1.4.1.2.3.51.2.2.21.5.3.1.7.6 = STRING: "(No revision)" .1.3.6.1.4.1.2.3.51.2.2.21.5.3.1.7.7 = STRING: "(No revision)" .1.3.6.1.4.1.2.3.51.2.2.21.5.3.1.7.8 = STRING: "26" .1.3.6.1.4.1.2.3.51.2.2.21.6.1.1.1.1 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.2.21.6.1.1.1.2 = INTEGER: 2 .1.3.6.1.4.1.2.3.51.2.2.21.6.1.1.1.3 = INTEGER: 3 .1.3.6.1.4.1.2.3.51.2.2.21.6.1.1.1.4 = INTEGER: 4 .1.3.6.1.4.1.2.3.51.2.2.21.6.1.1.2.1 = STRING: "1" .1.3.6.1.4.1.2.3.51.2.2.21.6.1.1.2.2 = STRING: "2" .1.3.6.1.4.1.2.3.51.2.2.21.6.1.1.2.3 = STRING: "3" .1.3.6.1.4.1.2.3.51.2.2.21.6.1.1.2.4 = STRING: "4" .1.3.6.1.4.1.2.3.51.2.2.21.6.1.1.3.1 = STRING: "AD " .1.3.6.1.4.1.2.3.51.2.2.21.6.1.1.3.2 = STRING: "AD " .1.3.6.1.4.1.2.3.51.2.2.21.6.1.1.3.3 = STRING: "Qlgc" .1.3.6.1.4.1.2.3.51.2.2.21.6.1.1.3.4 = STRING: "Qlgc" .1.3.6.1.4.1.2.3.51.2.2.21.6.1.1.4.1 = STRING: "90P3711" .1.3.6.1.4.1.2.3.51.2.2.21.6.1.1.4.2 = STRING: "90P3711" .1.3.6.1.4.1.2.3.51.2.2.21.6.1.1.4.3 = STRING: "59P6621" .1.3.6.1.4.1.2.3.51.2.2.21.6.1.1.4.4 = STRING: "59P6621" .1.3.6.1.4.1.2.3.51.2.2.21.6.1.1.5.1 = INTEGER: 6 .1.3.6.1.4.1.2.3.51.2.2.21.6.1.1.5.2 = INTEGER: 6 .1.3.6.1.4.1.2.3.51.2.2.21.6.1.1.5.3 = INTEGER: 13 .1.3.6.1.4.1.2.3.51.2.2.21.6.1.1.5.4 = INTEGER: 13 .1.3.6.1.4.1.2.3.51.2.2.21.6.1.1.8.1 = STRING: "5952 4A32 8CD5 4FB6 B915 75C9 E57A 2251 " .1.3.6.1.4.1.2.3.51.2.2.21.6.1.1.8.2 = STRING: "5CEC 35DE 0FD0 4A5A 9F28 17D7 5ECF 939C " .1.3.6.1.4.1.2.3.51.2.2.21.6.1.1.8.3 = STRING: "21DA E5FC 737A CC18 00D9 00C0 DD02 0AE9 " .1.3.6.1.4.1.2.3.51.2.2.21.6.1.1.8.4 = STRING: "21DA E5F5 D735 7F8E AA36 00C0 DD02 0AB5 " .1.3.6.1.4.1.2.3.51.2.2.21.6.1.1.9.1 = STRING: "4104" .1.3.6.1.4.1.2.3.51.2.2.21.6.1.1.9.2 = STRING: "4104" .1.3.6.1.4.1.2.3.51.2.2.21.6.1.1.9.3 = STRING: "0504" .1.3.6.1.4.1.2.3.51.2.2.21.6.1.1.9.4 = STRING: "0504" .1.3.6.1.4.1.2.3.51.2.2.21.6.1.1.10.1 = STRING: "C56081010" .1.3.6.1.4.1.2.3.51.2.2.21.6.1.1.10.2 = STRING: "C56081010" .1.3.6.1.4.1.2.3.51.2.2.21.6.1.1.10.3 = STRING: "48P7062" .1.3.6.1.4.1.2.3.51.2.2.21.6.1.1.10.4 = STRING: "48P7062" .1.3.6.1.4.1.2.3.51.2.2.21.6.1.1.11.1 = STRING: "000E0C635B52" .1.3.6.1.4.1.2.3.51.2.2.21.6.1.1.11.2 = STRING: "000E0C6356B2" .1.3.6.1.4.1.2.3.51.2.2.21.6.1.1.11.3 = STRING: "Not available" .1.3.6.1.4.1.2.3.51.2.2.21.6.1.1.11.4 = STRING: "Not available" .1.3.6.1.4.1.2.3.51.2.2.21.7.1.1.1.1 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.2.21.7.1.1.1.2 = INTEGER: 2 .1.3.6.1.4.1.2.3.51.2.2.21.7.1.1.1.3 = INTEGER: 3 .1.3.6.1.4.1.2.3.51.2.2.21.7.1.1.1.4 = INTEGER: 4 .1.3.6.1.4.1.2.3.51.2.2.21.7.1.1.2.1 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.2.21.7.1.1.2.2 = INTEGER: 2 .1.3.6.1.4.1.2.3.51.2.2.21.7.1.1.2.3 = INTEGER: 3 .1.3.6.1.4.1.2.3.51.2.2.21.7.1.1.2.4 = INTEGER: 4 .1.3.6.1.4.1.2.3.51.2.2.21.7.1.1.3.1 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.2.21.7.1.1.3.2 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.2.21.7.1.1.3.3 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.2.21.7.1.1.3.4 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.2.21.7.1.1.4.1 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.2.21.7.1.1.4.2 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.2.21.7.1.1.4.3 = INTEGER: 2 .1.3.6.1.4.1.2.3.51.2.2.21.7.1.1.4.4 = INTEGER: 2 .1.3.6.1.4.1.2.3.51.2.2.21.7.1.1.5.1 = STRING: "BRISM43 " .1.3.6.1.4.1.2.3.51.2.2.21.7.1.1.5.2 = STRING: "BRISM43 " .1.3.6.1.4.1.2.3.51.2.2.21.7.1.1.5.3 = STRING: "BRFSM " .1.3.6.1.4.1.2.3.51.2.2.21.7.1.1.5.4 = STRING: "BRFSM " .1.3.6.1.4.1.2.3.51.2.2.21.7.1.1.6.1 = STRING: "10/14/2004" .1.3.6.1.4.1.2.3.51.2.2.21.7.1.1.6.2 = STRING: "10/14/2004" .1.3.6.1.4.1.2.3.51.2.2.21.7.1.1.6.3 = STRING: "06/03/2003" .1.3.6.1.4.1.2.3.51.2.2.21.7.1.1.6.4 = STRING: "06/03/2003" .1.3.6.1.4.1.2.3.51.2.2.21.7.1.1.7.1 = STRING: "1.00" .1.3.6.1.4.1.2.3.51.2.2.21.7.1.1.7.2 = STRING: "1.00" .1.3.6.1.4.1.2.3.51.2.2.21.7.1.1.7.3 = STRING: "1449" .1.3.6.1.4.1.2.3.51.2.2.21.7.1.1.7.4 = STRING: "1449" .1.3.6.1.4.1.2.3.51.2.2.21.7.1.1.8.1 = STRING: "BRISM_MCU " .1.3.6.1.4.1.2.3.51.2.2.21.7.1.1.8.2 = STRING: "BRISM_MCU " .1.3.6.1.4.1.2.3.51.2.2.21.7.1.1.8.3 = STRING: " " .1.3.6.1.4.1.2.3.51.2.2.21.7.1.1.8.4 = STRING: " " .1.3.6.1.4.1.2.3.51.2.2.21.7.1.1.9.1 = STRING: "09/29/2004" .1.3.6.1.4.1.2.3.51.2.2.21.7.1.1.9.2 = STRING: "09/29/2004" .1.3.6.1.4.1.2.3.51.2.2.21.7.1.1.9.3 = STRING: " " .1.3.6.1.4.1.2.3.51.2.2.21.7.1.1.9.4 = STRING: " " .1.3.6.1.4.1.2.3.51.2.2.21.7.1.1.10.1 = STRING: "1.93" .1.3.6.1.4.1.2.3.51.2.2.21.7.1.1.10.2 = STRING: "1.93" .1.3.6.1.4.1.2.3.51.2.2.21.7.1.1.10.3 = STRING: " " .1.3.6.1.4.1.2.3.51.2.2.21.7.1.1.10.4 = STRING: " " .1.3.6.1.4.1.2.3.51.2.2.21.7.2.1.1.1 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.2.21.7.2.1.1.2 = INTEGER: 2 .1.3.6.1.4.1.2.3.51.2.2.21.7.2.1.1.3 = INTEGER: 3 .1.3.6.1.4.1.2.3.51.2.2.21.7.2.1.1.4 = INTEGER: 4 .1.3.6.1.4.1.2.3.51.2.2.21.7.2.1.2.1 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.2.21.7.2.1.2.2 = INTEGER: 2 .1.3.6.1.4.1.2.3.51.2.2.21.7.2.1.2.3 = INTEGER: 3 .1.3.6.1.4.1.2.3.51.2.2.21.7.2.1.2.4 = INTEGER: 4 .1.3.6.1.4.1.2.3.51.2.2.21.7.2.1.3.1 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.2.21.7.2.1.3.2 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.2.21.7.2.1.3.3 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.2.21.7.2.1.3.4 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.2.21.7.2.1.4.1 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.2.21.7.2.1.4.2 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.2.21.7.2.1.4.3 = INTEGER: 2 .1.3.6.1.4.1.2.3.51.2.2.21.7.2.1.4.4 = INTEGER: 2 .1.3.6.1.4.1.2.3.51.2.2.21.7.2.1.5.1 = STRING: "BRISM02 " .1.3.6.1.4.1.2.3.51.2.2.21.7.2.1.5.2 = STRING: "BRISM02 " .1.3.6.1.4.1.2.3.51.2.2.21.7.2.1.5.3 = STRING: " " .1.3.6.1.4.1.2.3.51.2.2.21.7.2.1.5.4 = STRING: " " .1.3.6.1.4.1.2.3.51.2.2.21.7.2.1.6.1 = STRING: "07/02/2004" .1.3.6.1.4.1.2.3.51.2.2.21.7.2.1.6.2 = STRING: "07/02/2004" .1.3.6.1.4.1.2.3.51.2.2.21.7.2.1.6.3 = STRING: " " .1.3.6.1.4.1.2.3.51.2.2.21.7.2.1.6.4 = STRING: " " .1.3.6.1.4.1.2.3.51.2.2.21.7.2.1.7.1 = STRING: "3.05" .1.3.6.1.4.1.2.3.51.2.2.21.7.2.1.7.2 = STRING: "3.05" .1.3.6.1.4.1.2.3.51.2.2.21.7.2.1.7.3 = STRING: " " .1.3.6.1.4.1.2.3.51.2.2.21.7.2.1.7.4 = STRING: " " .1.3.6.1.4.1.2.3.51.2.2.21.8.1.1.1.1 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.2.21.8.1.1.1.2 = INTEGER: 2 .1.3.6.1.4.1.2.3.51.2.2.21.8.1.1.1.3 = INTEGER: 3 .1.3.6.1.4.1.2.3.51.2.2.21.8.1.1.1.4 = INTEGER: 4 .1.3.6.1.4.1.2.3.51.2.2.21.8.1.1.2.1 = STRING: "1" .1.3.6.1.4.1.2.3.51.2.2.21.8.1.1.2.2 = STRING: "2" .1.3.6.1.4.1.2.3.51.2.2.21.8.1.1.2.3 = STRING: "3" .1.3.6.1.4.1.2.3.51.2.2.21.8.1.1.2.4 = STRING: "4" .1.3.6.1.4.1.2.3.51.2.2.21.8.1.1.3.1 = STRING: "DELT" .1.3.6.1.4.1.2.3.51.2.2.21.8.1.1.3.2 = STRING: "DELT" .1.3.6.1.4.1.2.3.51.2.2.21.8.1.1.3.3 = STRING: "Not available" .1.3.6.1.4.1.2.3.51.2.2.21.8.1.1.3.4 = STRING: "Not available" .1.3.6.1.4.1.2.3.51.2.2.21.8.1.1.4.1 = STRING: "90P3714" .1.3.6.1.4.1.2.3.51.2.2.21.8.1.1.4.2 = STRING: "90P3714" .1.3.6.1.4.1.2.3.51.2.2.21.8.1.1.4.3 = STRING: "Not available" .1.3.6.1.4.1.2.3.51.2.2.21.8.1.1.4.4 = STRING: "Not available" .1.3.6.1.4.1.2.3.51.2.2.21.8.1.1.5.1 = INTEGER: 51 .1.3.6.1.4.1.2.3.51.2.2.21.8.1.1.5.2 = INTEGER: 51 .1.3.6.1.4.1.2.3.51.2.2.21.8.1.1.5.3 = INTEGER: 159 .1.3.6.1.4.1.2.3.51.2.2.21.8.1.1.5.4 = INTEGER: 159 .1.3.6.1.4.1.2.3.51.2.2.21.8.1.1.8.1 = STRING: "A3A1 3C00 7C8A 11D8 00DF 0065 0032 0091 " .1.3.6.1.4.1.2.3.51.2.2.21.8.1.1.8.2 = STRING: "8E2B 90C0 7C84 11D8 000E 00A8 005D 00BB " .1.3.6.1.4.1.2.3.51.2.2.21.8.1.1.8.3 = STRING: "FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF " .1.3.6.1.4.1.2.3.51.2.2.21.8.1.1.8.4 = STRING: "FFFF FFFF FFFF FFFF FFFF FFFF FFFF FFFF " .1.3.6.1.4.1.2.3.51.2.2.21.8.1.1.9.1 = STRING: "1204" .1.3.6.1.4.1.2.3.51.2.2.21.8.1.1.9.2 = STRING: "1204" .1.3.6.1.4.1.2.3.51.2.2.21.8.1.1.9.3 = Hex-STRING: D0 07 F0 D2 .1.3.6.1.4.1.2.3.51.2.2.21.8.1.1.9.4 = Hex-STRING: D0 07 F0 D2 .1.3.6.1.4.1.2.3.51.2.2.21.8.1.1.10.1 = STRING: "90P3688" .1.3.6.1.4.1.2.3.51.2.2.21.8.1.1.10.2 = STRING: "90P3688" .1.3.6.1.4.1.2.3.51.2.2.21.8.1.1.10.3 = STRING: "Not available" .1.3.6.1.4.1.2.3.51.2.2.21.8.1.1.10.4 = STRING: "Not available" .1.3.6.1.4.1.2.3.51.2.2.21.8.1.1.11.1 = STRING: "ZJ1UKT43J066" .1.3.6.1.4.1.2.3.51.2.2.21.8.1.1.11.2 = STRING: "ZJ1UKT43J02X" .1.3.6.1.4.1.2.3.51.2.2.21.8.1.1.11.3 = STRING: "Not available" .1.3.6.1.4.1.2.3.51.2.2.21.8.1.1.11.4 = STRING: "Not available" .1.3.6.1.4.1.2.3.51.2.2.21.9.3.0 = STRING: "IBM" .1.3.6.1.4.1.2.3.51.2.2.21.9.4.0 = STRING: "90P3697" .1.3.6.1.4.1.2.3.51.2.2.21.9.5.0 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.2.21.9.8.0 = STRING: "A8A1 21A1 7D1F 11D8 ABB6 0010 8305 F52E " .1.3.6.1.4.1.2.3.51.2.2.21.21.1.1.1 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.2.21.21.1.1.2 = INTEGER: 2 .1.3.6.1.4.1.2.3.51.2.2.21.21.1.1.3 = INTEGER: 3 .1.3.6.1.4.1.2.3.51.2.2.21.21.1.1.4 = INTEGER: 4 .1.3.6.1.4.1.2.3.51.2.2.21.21.1.1.5 = INTEGER: 5 .1.3.6.1.4.1.2.3.51.2.2.21.21.1.1.6 = INTEGER: 6 .1.3.6.1.4.1.2.3.51.2.2.21.21.1.1.7 = INTEGER: 7 .1.3.6.1.4.1.2.3.51.2.2.21.21.1.1.8 = INTEGER: 8 .1.3.6.1.4.1.2.3.51.2.2.21.21.1.1.9 = INTEGER: 9 .1.3.6.1.4.1.2.3.51.2.2.21.21.1.1.10 = INTEGER: 10 .1.3.6.1.4.1.2.3.51.2.2.21.21.1.1.11 = INTEGER: 11 .1.3.6.1.4.1.2.3.51.2.2.21.21.1.1.12 = INTEGER: 12 .1.3.6.1.4.1.2.3.51.2.2.21.21.1.1.13 = INTEGER: 13 .1.3.6.1.4.1.2.3.51.2.2.21.21.1.1.14 = INTEGER: 14 .1.3.6.1.4.1.2.3.51.2.2.21.21.1.1.15 = INTEGER: 15 .1.3.6.1.4.1.2.3.51.2.2.21.21.1.1.16 = INTEGER: 16 .1.3.6.1.4.1.2.3.51.2.2.21.21.1.1.17 = INTEGER: 17 .1.3.6.1.4.1.2.3.51.2.2.21.21.1.1.18 = INTEGER: 18 .1.3.6.1.4.1.2.3.51.2.2.21.21.1.1.19 = INTEGER: 19 .1.3.6.1.4.1.2.3.51.2.2.21.21.1.1.20 = INTEGER: 20 .1.3.6.1.4.1.2.3.51.2.2.21.21.1.1.21 = INTEGER: 21 .1.3.6.1.4.1.2.3.51.2.2.21.21.1.1.22 = INTEGER: 22 .1.3.6.1.4.1.2.3.51.2.2.21.21.1.1.23 = INTEGER: 23 .1.3.6.1.4.1.2.3.51.2.2.21.21.1.1.24 = INTEGER: 24 .1.3.6.1.4.1.2.3.51.2.2.21.21.1.1.25 = INTEGER: 25 .1.3.6.1.4.1.2.3.51.2.2.21.21.1.1.26 = INTEGER: 26 .1.3.6.1.4.1.2.3.51.2.2.21.21.1.1.27 = INTEGER: 27 .1.3.6.1.4.1.2.3.51.2.2.21.21.1.1.28 = INTEGER: 28 .1.3.6.1.4.1.2.3.51.2.2.21.21.1.1.29 = INTEGER: 29 .1.3.6.1.4.1.2.3.51.2.2.21.21.1.1.30 = INTEGER: 30 .1.3.6.1.4.1.2.3.51.2.2.21.21.1.1.31 = INTEGER: 31 .1.3.6.1.4.1.2.3.51.2.2.21.21.1.1.32 = INTEGER: 32 .1.3.6.1.4.1.2.3.51.2.2.21.21.1.1.33 = INTEGER: 33 .1.3.6.1.4.1.2.3.51.2.2.21.21.1.1.34 = INTEGER: 34 .1.3.6.1.4.1.2.3.51.2.2.21.21.1.1.35 = INTEGER: 35 .1.3.6.1.4.1.2.3.51.2.2.21.21.1.1.36 = INTEGER: 36 .1.3.6.1.4.1.2.3.51.2.2.21.21.1.1.37 = INTEGER: 37 .1.3.6.1.4.1.2.3.51.2.2.21.21.1.2.1 = STRING: "13N2292" .1.3.6.1.4.1.2.3.51.2.2.21.21.1.2.2 = STRING: "90P3697" .1.3.6.1.4.1.2.3.51.2.2.21.21.1.2.3 = STRING: "13N1605" .1.3.6.1.4.1.2.3.51.2.2.21.21.1.2.4 = STRING: "13N1607" .1.3.6.1.4.1.2.3.51.2.2.21.21.1.2.5 = STRING: "90P3711" .1.3.6.1.4.1.2.3.51.2.2.21.21.1.2.6 = STRING: "13N2346" .1.3.6.1.4.1.2.3.51.2.2.21.21.1.2.7 = STRING: "59P6624" .1.3.6.1.4.1.2.3.51.2.2.21.21.1.2.8 = STRING: "90P3711" .1.3.6.1.4.1.2.3.51.2.2.21.21.1.2.9 = STRING: "90P3711" .1.3.6.1.4.1.2.3.51.2.2.21.21.1.2.10 = STRING: "90P3711" .1.3.6.1.4.1.2.3.51.2.2.21.21.1.2.11 = STRING: "13N1607" .1.3.6.1.4.1.2.3.51.2.2.21.21.1.2.12 = STRING: "13N1607" .1.3.6.1.4.1.2.3.51.2.2.21.21.1.2.13 = STRING: "90P3696" .1.3.6.1.4.1.2.3.51.2.2.21.21.1.2.14 = STRING: "90P3711" .1.3.6.1.4.1.2.3.51.2.2.21.21.1.2.15 = STRING: "90P3714" .1.3.6.1.4.1.2.3.51.2.2.21.21.1.2.16 = STRING: "90P3714" .1.3.6.1.4.1.2.3.51.2.2.21.21.1.2.17 = STRING: "90P3697" .1.3.6.1.4.1.2.3.51.2.2.21.21.1.2.18 = STRING: "13N0504" .1.3.6.1.4.1.2.3.51.2.2.21.21.1.2.19 = STRING: "13N2292" .1.3.6.1.4.1.2.3.51.2.2.21.21.1.2.20 = STRING: "73P9092" .1.3.6.1.4.1.2.3.51.2.2.21.21.1.2.21 = STRING: "31R3389" .1.3.6.1.4.1.2.3.51.2.2.21.21.1.2.22 = STRING: "13N1605" .1.3.6.1.4.1.2.3.51.2.2.21.21.1.2.23 = STRING: "59P6624" .1.3.6.1.4.1.2.3.51.2.2.21.21.1.2.24 = STRING: "25K8238" .1.3.6.1.4.1.2.3.51.2.2.21.21.1.2.25 = STRING: "13N1607" .1.3.6.1.4.1.2.3.51.2.2.21.21.1.2.26 = STRING: "13N2346" .1.3.6.1.4.1.2.3.51.2.2.21.21.1.2.27 = STRING: "90P3696" .1.3.6.1.4.1.2.3.51.2.2.21.21.1.2.28 = STRING: "13N0497" .1.3.6.1.4.1.2.3.51.2.2.21.21.1.2.29 = STRING: "90P3711" .1.3.6.1.4.1.2.3.51.2.2.21.21.1.2.30 = STRING: "90P3793" .1.3.6.1.4.1.2.3.51.2.2.21.21.1.2.31 = STRING: "13N0497" .1.3.6.1.4.1.2.3.51.2.2.21.21.1.2.32 = STRING: "13N0497" .1.3.6.1.4.1.2.3.51.2.2.21.21.1.2.33 = STRING: "90P3711" .1.3.6.1.4.1.2.3.51.2.2.21.21.1.2.34 = STRING: "J85503A" .1.3.6.1.4.1.2.3.51.2.2.21.21.1.2.35 = STRING: "13N1605" .1.3.6.1.4.1.2.3.51.2.2.21.21.1.2.36 = STRING: "13N1607" .1.3.6.1.4.1.2.3.51.2.2.21.21.1.2.37 = STRING: "90P4769" .1.3.6.1.4.1.2.3.51.2.2.21.21.1.3.1 = STRING: "ZJ1TS741T1GG" .1.3.6.1.4.1.2.3.51.2.2.21.21.1.3.2 = STRING: "348ICHT00091" .1.3.6.1.4.1.2.3.51.2.2.21.21.1.3.3 = STRING: "YJ1SM045703H" .1.3.6.1.4.1.2.3.51.2.2.21.21.1.3.4 = STRING: "YJ1SM1447091" .1.3.6.1.4.1.2.3.51.2.2.21.21.1.3.5 = STRING: "000E0C6356B2" .1.3.6.1.4.1.2.3.51.2.2.21.21.1.3.6 = STRING: "ZJ1WLX48512Y" .1.3.6.1.4.1.2.3.51.2.2.21.21.1.3.7 = STRING: "J1RJH3BH12J" .1.3.6.1.4.1.2.3.51.2.2.21.21.1.3.8 = STRING: "000E0C635C92" .1.3.6.1.4.1.2.3.51.2.2.21.21.1.3.9 = STRING: "000E0C635B52" .1.3.6.1.4.1.2.3.51.2.2.21.21.1.3.10 = STRING: "000E0C6356B2" .1.3.6.1.4.1.2.3.51.2.2.21.21.1.3.11 = STRING: "YJ1SM1447091" .1.3.6.1.4.1.2.3.51.2.2.21.21.1.3.12 = STRING: "YJ1SM14S6013" .1.3.6.1.4.1.2.3.51.2.2.21.21.1.3.13 = STRING: "J1UKP00242" .1.3.6.1.4.1.2.3.51.2.2.21.21.1.3.14 = STRING: "000E0C635B52" .1.3.6.1.4.1.2.3.51.2.2.21.21.1.3.15 = STRING: "ZJ1UKT43J066" .1.3.6.1.4.1.2.3.51.2.2.21.21.1.3.16 = STRING: "ZJ1UKT43J02X" .1.3.6.1.4.1.2.3.51.2.2.21.21.1.3.17 = STRING: "J1UKS43F040" .1.3.6.1.4.1.2.3.51.2.2.21.21.1.3.18 = STRING: "ZJ1W6745E17L" .1.3.6.1.4.1.2.3.51.2.2.21.21.1.3.19 = STRING: "ZJ1TS741T1GG" .1.3.6.1.4.1.2.3.51.2.2.21.21.1.3.20 = STRING: "J1RJW3671EH" .1.3.6.1.4.1.2.3.51.2.2.21.21.1.3.21 = STRING: "ZJ1Z0051W00B" .1.3.6.1.4.1.2.3.51.2.2.21.21.1.3.22 = STRING: "YJ1SM045701G" .1.3.6.1.4.1.2.3.51.2.2.21.21.1.3.23 = STRING: "J1RJH3BH12J" .1.3.6.1.4.1.2.3.51.2.2.21.21.1.3.24 = STRING: "ZJ1VZU45510W" .1.3.6.1.4.1.2.3.51.2.2.21.21.1.3.25 = STRING: "YJ1SM14S601M" .1.3.6.1.4.1.2.3.51.2.2.21.21.1.3.26 = STRING: "ZJ1WLX48512Y" .1.3.6.1.4.1.2.3.51.2.2.21.21.1.3.27 = STRING: "J1UKR438006" .1.3.6.1.4.1.2.3.51.2.2.21.21.1.3.28 = STRING: "ZJ1Z9E53B114" .1.3.6.1.4.1.2.3.51.2.2.21.21.1.3.29 = STRING: "000E0C6356B2" .1.3.6.1.4.1.2.3.51.2.2.21.21.1.3.30 = STRING: "ZJ1UKR4CW00K" .1.3.6.1.4.1.2.3.51.2.2.21.21.1.3.31 = STRING: "ZJ1ZB753A10V" .1.3.6.1.4.1.2.3.51.2.2.21.21.1.3.32 = STRING: "ZJ1Z9E52W101" .1.3.6.1.4.1.2.3.51.2.2.21.21.1.3.33 = STRING: "000E0C6356B2" .1.3.6.1.4.1.2.3.51.2.2.21.21.1.3.34 = STRING: "ZK11SV5AH10P" .1.3.6.1.4.1.2.3.51.2.2.21.21.1.3.35 = STRING: "YJ1SM0457035" .1.3.6.1.4.1.2.3.51.2.2.21.21.1.3.36 = STRING: "YJ1SM14S6013" .1.3.6.1.4.1.2.3.51.2.2.21.21.1.3.37 = STRING: "K10XD3AP1AM" .1.3.6.1.4.1.2.3.51.2.2.21.21.1.4.1 = STRING: "IBM" .1.3.6.1.4.1.2.3.51.2.2.21.21.1.4.2 = STRING: "IBM" .1.3.6.1.4.1.2.3.51.2.2.21.21.1.4.3 = STRING: "IBM" .1.3.6.1.4.1.2.3.51.2.2.21.21.1.4.4 = STRING: "IBM" .1.3.6.1.4.1.2.3.51.2.2.21.21.1.4.5 = STRING: "AD " .1.3.6.1.4.1.2.3.51.2.2.21.21.1.4.6 = STRING: "IBM" .1.3.6.1.4.1.2.3.51.2.2.21.21.1.4.7 = STRING: "SLRM" .1.3.6.1.4.1.2.3.51.2.2.21.21.1.4.8 = STRING: "AD " .1.3.6.1.4.1.2.3.51.2.2.21.21.1.4.9 = STRING: "AD " .1.3.6.1.4.1.2.3.51.2.2.21.21.1.4.10 = STRING: "AD " .1.3.6.1.4.1.2.3.51.2.2.21.21.1.4.11 = STRING: "IBM" .1.3.6.1.4.1.2.3.51.2.2.21.21.1.4.12 = STRING: "IBM" .1.3.6.1.4.1.2.3.51.2.2.21.21.1.4.13 = STRING: "IBM" .1.3.6.1.4.1.2.3.51.2.2.21.21.1.4.14 = STRING: "AD " .1.3.6.1.4.1.2.3.51.2.2.21.21.1.4.15 = STRING: "DELT" .1.3.6.1.4.1.2.3.51.2.2.21.21.1.4.16 = STRING: "DELT" .1.3.6.1.4.1.2.3.51.2.2.21.21.1.4.17 = STRING: "IBM" .1.3.6.1.4.1.2.3.51.2.2.21.21.1.4.18 = STRING: "IBM" .1.3.6.1.4.1.2.3.51.2.2.21.21.1.4.19 = STRING: "IBM" .1.3.6.1.4.1.2.3.51.2.2.21.21.1.4.20 = STRING: "SLRM" .1.3.6.1.4.1.2.3.51.2.2.21.21.1.4.21 = STRING: "IBM" .1.3.6.1.4.1.2.3.51.2.2.21.21.1.4.22 = STRING: "IBM" .1.3.6.1.4.1.2.3.51.2.2.21.21.1.4.23 = STRING: "SLRM" .1.3.6.1.4.1.2.3.51.2.2.21.21.1.4.24 = STRING: "IBM" .1.3.6.1.4.1.2.3.51.2.2.21.21.1.4.25 = STRING: "IBM" .1.3.6.1.4.1.2.3.51.2.2.21.21.1.4.26 = STRING: "IBM" .1.3.6.1.4.1.2.3.51.2.2.21.21.1.4.27 = STRING: "IBM" .1.3.6.1.4.1.2.3.51.2.2.21.21.1.4.28 = STRING: "IBM" .1.3.6.1.4.1.2.3.51.2.2.21.21.1.4.29 = STRING: "AD " .1.3.6.1.4.1.2.3.51.2.2.21.21.1.4.30 = STRING: "IBM" .1.3.6.1.4.1.2.3.51.2.2.21.21.1.4.31 = STRING: "IBM" .1.3.6.1.4.1.2.3.51.2.2.21.21.1.4.32 = STRING: "IBM" .1.3.6.1.4.1.2.3.51.2.2.21.21.1.4.33 = STRING: "AD #" .1.3.6.1.4.1.2.3.51.2.2.21.21.1.4.34 = STRING: "IBM" .1.3.6.1.4.1.2.3.51.2.2.21.21.1.4.35 = STRING: "IBM" .1.3.6.1.4.1.2.3.51.2.2.21.21.1.4.36 = STRING: "IBM" .1.3.6.1.4.1.2.3.51.2.2.21.21.1.4.37 = STRING: "SLRM" .1.3.6.1.4.1.2.3.51.2.2.21.21.1.5.1 = STRING: "3" .1.3.6.1.4.1.2.3.51.2.2.21.21.1.5.2 = STRING: "1" .1.3.6.1.4.1.2.3.51.2.2.21.21.1.5.3 = STRING: "8" .1.3.6.1.4.1.2.3.51.2.2.21.21.1.5.4 = STRING: "8" .1.3.6.1.4.1.2.3.51.2.2.21.21.1.5.5 = STRING: "2" .1.3.6.1.4.1.2.3.51.2.2.21.21.1.5.6 = STRING: "4" .1.3.6.1.4.1.2.3.51.2.2.21.21.1.5.7 = STRING: "8" .1.3.6.1.4.1.2.3.51.2.2.21.21.1.5.8 = STRING: "1" .1.3.6.1.4.1.2.3.51.2.2.21.21.1.5.9 = STRING: "1" .1.3.6.1.4.1.2.3.51.2.2.21.21.1.5.10 = STRING: "2" .1.3.6.1.4.1.2.3.51.2.2.21.21.1.5.11 = STRING: "8" .1.3.6.1.4.1.2.3.51.2.2.21.21.1.5.12 = STRING: "8" .1.3.6.1.4.1.2.3.51.2.2.21.21.1.5.13 = STRING: "1" .1.3.6.1.4.1.2.3.51.2.2.21.21.1.5.14 = STRING: "1" .1.3.6.1.4.1.2.3.51.2.2.21.21.1.5.15 = STRING: "1" .1.3.6.1.4.1.2.3.51.2.2.21.21.1.5.16 = STRING: "2" .1.3.6.1.4.1.2.3.51.2.2.21.21.1.5.17 = STRING: "1" .1.3.6.1.4.1.2.3.51.2.2.21.21.1.5.18 = STRING: "5" .1.3.6.1.4.1.2.3.51.2.2.21.21.1.5.19 = STRING: "3" .1.3.6.1.4.1.2.3.51.2.2.21.21.1.5.20 = STRING: "3" .1.3.6.1.4.1.2.3.51.2.2.21.21.1.5.21 = STRING: "1" .1.3.6.1.4.1.2.3.51.2.2.21.21.1.5.22 = STRING: "8" .1.3.6.1.4.1.2.3.51.2.2.21.21.1.5.23 = STRING: "8" .1.3.6.1.4.1.2.3.51.2.2.21.21.1.5.24 = STRING: "8" .1.3.6.1.4.1.2.3.51.2.2.21.21.1.5.25 = STRING: "8" .1.3.6.1.4.1.2.3.51.2.2.21.21.1.5.26 = STRING: "4" .1.3.6.1.4.1.2.3.51.2.2.21.21.1.5.27 = STRING: "2" .1.3.6.1.4.1.2.3.51.2.2.21.21.1.5.28 = STRING: "1" .1.3.6.1.4.1.2.3.51.2.2.21.21.1.5.29 = STRING: "2" .1.3.6.1.4.1.2.3.51.2.2.21.21.1.5.30 = STRING: "2" .1.3.6.1.4.1.2.3.51.2.2.21.21.1.5.31 = STRING: "8" .1.3.6.1.4.1.2.3.51.2.2.21.21.1.5.32 = STRING: "8" .1.3.6.1.4.1.2.3.51.2.2.21.21.1.5.33 = STRING: "2" .1.3.6.1.4.1.2.3.51.2.2.21.21.1.5.34 = STRING: "7" .1.3.6.1.4.1.2.3.51.2.2.21.21.1.5.35 = STRING: "8" .1.3.6.1.4.1.2.3.51.2.2.21.21.1.5.36 = STRING: "8" .1.3.6.1.4.1.2.3.51.2.2.21.21.1.5.37 = STRING: "8" .1.3.6.1.4.1.2.3.51.2.2.21.21.1.6.1 = INTEGER: 2 .1.3.6.1.4.1.2.3.51.2.2.21.21.1.6.2 = INTEGER: 129 .1.3.6.1.4.1.2.3.51.2.2.21.21.1.6.3 = INTEGER: 4 .1.3.6.1.4.1.2.3.51.2.2.21.21.1.6.4 = INTEGER: 4 .1.3.6.1.4.1.2.3.51.2.2.21.21.1.6.5 = INTEGER: 17 .1.3.6.1.4.1.2.3.51.2.2.21.21.1.6.6 = INTEGER: 2 .1.3.6.1.4.1.2.3.51.2.2.21.21.1.6.7 = INTEGER: 34 .1.3.6.1.4.1.2.3.51.2.2.21.21.1.6.8 = INTEGER: 17 .1.3.6.1.4.1.2.3.51.2.2.21.21.1.6.9 = INTEGER: 17 .1.3.6.1.4.1.2.3.51.2.2.21.21.1.6.10 = INTEGER: 17 .1.3.6.1.4.1.2.3.51.2.2.21.21.1.6.11 = INTEGER: 4 .1.3.6.1.4.1.2.3.51.2.2.21.21.1.6.12 = INTEGER: 4 .1.3.6.1.4.1.2.3.51.2.2.21.21.1.6.13 = INTEGER: 98 .1.3.6.1.4.1.2.3.51.2.2.21.21.1.6.14 = INTEGER: 17 .1.3.6.1.4.1.2.3.51.2.2.21.21.1.6.15 = INTEGER: 113 .1.3.6.1.4.1.2.3.51.2.2.21.21.1.6.16 = INTEGER: 113 .1.3.6.1.4.1.2.3.51.2.2.21.21.1.6.17 = INTEGER: 129 .1.3.6.1.4.1.2.3.51.2.2.21.21.1.6.18 = INTEGER: 6 .1.3.6.1.4.1.2.3.51.2.2.21.21.1.6.19 = INTEGER: 2 .1.3.6.1.4.1.2.3.51.2.2.21.21.1.6.20 = INTEGER: 35 .1.3.6.1.4.1.2.3.51.2.2.21.21.1.6.21 = INTEGER: 2 .1.3.6.1.4.1.2.3.51.2.2.21.21.1.6.22 = INTEGER: 4 .1.3.6.1.4.1.2.3.51.2.2.21.21.1.6.23 = INTEGER: 34 .1.3.6.1.4.1.2.3.51.2.2.21.21.1.6.24 = INTEGER: 39 .1.3.6.1.4.1.2.3.51.2.2.21.21.1.6.25 = INTEGER: 4 .1.3.6.1.4.1.2.3.51.2.2.21.21.1.6.26 = INTEGER: 2 .1.3.6.1.4.1.2.3.51.2.2.21.21.1.6.27 = INTEGER: 98 .1.3.6.1.4.1.2.3.51.2.2.21.21.1.6.28 = INTEGER: 6 .1.3.6.1.4.1.2.3.51.2.2.21.21.1.6.29 = INTEGER: 17 .1.3.6.1.4.1.2.3.51.2.2.21.21.1.6.30 = INTEGER: 81 .1.3.6.1.4.1.2.3.51.2.2.21.21.1.6.31 = INTEGER: 6 .1.3.6.1.4.1.2.3.51.2.2.21.21.1.6.32 = INTEGER: 6 .1.3.6.1.4.1.2.3.51.2.2.21.21.1.6.33 = INTEGER: 255 .1.3.6.1.4.1.2.3.51.2.2.21.21.1.6.34 = INTEGER: 42 .1.3.6.1.4.1.2.3.51.2.2.21.21.1.6.35 = INTEGER: 4 .1.3.6.1.4.1.2.3.51.2.2.21.21.1.6.36 = INTEGER: 4 .1.3.6.1.4.1.2.3.51.2.2.21.21.1.6.37 = INTEGER: 35 .1.3.6.1.4.1.2.3.51.2.2.21.21.1.7.1 = STRING: "88329TZ" .1.3.6.1.4.1.2.3.51.2.2.21.21.1.7.2 = "" .1.3.6.1.4.1.2.3.51.2.2.21.21.1.7.3 = STRING: "88396TZ" .1.3.6.1.4.1.2.3.51.2.2.21.21.1.7.4 = "" .1.3.6.1.4.1.2.3.51.2.2.21.21.1.7.5 = "" .1.3.6.1.4.1.2.3.51.2.2.21.21.1.7.6 = STRING: "884311Z" .1.3.6.1.4.1.2.3.51.2.2.21.21.1.7.7 = "" .1.3.6.1.4.1.2.3.51.2.2.21.21.1.7.8 = "" .1.3.6.1.4.1.2.3.51.2.2.21.21.1.7.9 = "" .1.3.6.1.4.1.2.3.51.2.2.21.21.1.7.10 = "" .1.3.6.1.4.1.2.3.51.2.2.21.21.1.7.11 = "" .1.3.6.1.4.1.2.3.51.2.2.21.21.1.7.12 = "" .1.3.6.1.4.1.2.3.51.2.2.21.21.1.7.13 = "" .1.3.6.1.4.1.2.3.51.2.2.21.21.1.7.14 = "" .1.3.6.1.4.1.2.3.51.2.2.21.21.1.7.15 = "" .1.3.6.1.4.1.2.3.51.2.2.21.21.1.7.16 = "" .1.3.6.1.4.1.2.3.51.2.2.21.21.1.7.17 = "" .1.3.6.1.4.1.2.3.51.2.2.21.21.1.7.18 = STRING: "884241X" .1.3.6.1.4.1.2.3.51.2.2.21.21.1.7.19 = STRING: "88329TZ" .1.3.6.1.4.1.2.3.51.2.2.21.21.1.7.20 = "" .1.3.6.1.4.1.2.3.51.2.2.21.21.1.7.21 = STRING: "885001Z" .1.3.6.1.4.1.2.3.51.2.2.21.21.1.7.22 = STRING: "88396TZ" .1.3.6.1.4.1.2.3.51.2.2.21.21.1.7.23 = "" .1.3.6.1.4.1.2.3.51.2.2.21.21.1.7.24 = "" .1.3.6.1.4.1.2.3.51.2.2.21.21.1.7.25 = "" .1.3.6.1.4.1.2.3.51.2.2.21.21.1.7.26 = STRING: "884311Z" .1.3.6.1.4.1.2.3.51.2.2.21.21.1.7.27 = "" .1.3.6.1.4.1.2.3.51.2.2.21.21.1.7.28 = STRING: "884242X" .1.3.6.1.4.1.2.3.51.2.2.21.21.1.7.29 = "" .1.3.6.1.4.1.2.3.51.2.2.21.21.1.7.30 = "" .1.3.6.1.4.1.2.3.51.2.2.21.21.1.7.31 = STRING: "88424TX" .1.3.6.1.4.1.2.3.51.2.2.21.21.1.7.32 = STRING: "884242x" .1.3.6.1.4.1.2.3.51.2.2.21.21.1.7.33 = "" .1.3.6.1.4.1.2.3.51.2.2.21.21.1.7.34 = "" .1.3.6.1.4.1.2.3.51.2.2.21.21.1.7.35 = STRING: "88396TZ" .1.3.6.1.4.1.2.3.51.2.2.21.21.1.7.36 = "" .1.3.6.1.4.1.2.3.51.2.2.21.21.1.7.37 = "" .1.3.6.1.4.1.2.3.51.2.2.21.21.1.8.1 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.2.21.21.1.8.2 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.2.21.21.1.8.3 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.2.21.21.1.8.4 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.2.21.21.1.8.5 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.2.21.21.1.8.6 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.2.21.21.1.8.7 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.2.21.21.1.8.8 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.2.21.21.1.8.9 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.2.21.21.1.8.10 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.2.21.21.1.8.11 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.2.21.21.1.8.12 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.2.21.21.1.8.13 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.2.21.21.1.8.14 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.2.21.21.1.8.15 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.2.21.21.1.8.16 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.2.21.21.1.8.17 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.2.21.21.1.8.18 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.2.21.21.1.8.19 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.2.21.21.1.8.20 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.2.21.21.1.8.21 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.2.21.21.1.8.22 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.2.21.21.1.8.23 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.2.21.21.1.8.24 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.2.21.21.1.8.25 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.2.21.21.1.8.26 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.2.21.21.1.8.27 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.2.21.21.1.8.28 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.2.21.21.1.8.29 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.2.21.21.1.8.30 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.2.21.21.1.8.31 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.2.21.21.1.8.32 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.2.21.21.1.8.33 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.2.21.21.1.8.34 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.2.21.21.1.8.35 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.2.21.21.1.8.36 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.2.21.21.1.8.37 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.2.21.22.1.1.1 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.2.21.22.1.1.2 = INTEGER: 2 .1.3.6.1.4.1.2.3.51.2.2.21.22.1.1.3 = INTEGER: 3 .1.3.6.1.4.1.2.3.51.2.2.21.22.1.1.4 = INTEGER: 4 .1.3.6.1.4.1.2.3.51.2.2.21.22.1.1.5 = INTEGER: 5 .1.3.6.1.4.1.2.3.51.2.2.21.22.1.1.6 = INTEGER: 6 .1.3.6.1.4.1.2.3.51.2.2.21.22.1.1.7 = INTEGER: 7 .1.3.6.1.4.1.2.3.51.2.2.21.22.1.1.8 = INTEGER: 8 .1.3.6.1.4.1.2.3.51.2.2.21.22.1.1.9 = INTEGER: 9 .1.3.6.1.4.1.2.3.51.2.2.21.22.1.1.10 = INTEGER: 10 .1.3.6.1.4.1.2.3.51.2.2.21.22.1.1.11 = INTEGER: 11 .1.3.6.1.4.1.2.3.51.2.2.21.22.1.1.12 = INTEGER: 12 .1.3.6.1.4.1.2.3.51.2.2.21.22.1.1.13 = INTEGER: 13 .1.3.6.1.4.1.2.3.51.2.2.21.22.1.1.14 = INTEGER: 14 .1.3.6.1.4.1.2.3.51.2.2.21.22.1.1.15 = INTEGER: 15 .1.3.6.1.4.1.2.3.51.2.2.21.22.1.1.16 = INTEGER: 16 .1.3.6.1.4.1.2.3.51.2.2.21.22.1.1.17 = INTEGER: 17 .1.3.6.1.4.1.2.3.51.2.2.21.22.1.1.18 = INTEGER: 18 .1.3.6.1.4.1.2.3.51.2.2.21.22.1.1.19 = INTEGER: 19 .1.3.6.1.4.1.2.3.51.2.2.21.22.1.1.20 = INTEGER: 20 .1.3.6.1.4.1.2.3.51.2.2.21.22.1.1.21 = INTEGER: 21 .1.3.6.1.4.1.2.3.51.2.2.21.22.1.1.22 = INTEGER: 22 .1.3.6.1.4.1.2.3.51.2.2.21.22.1.1.23 = INTEGER: 23 .1.3.6.1.4.1.2.3.51.2.2.21.22.1.1.24 = INTEGER: 24 .1.3.6.1.4.1.2.3.51.2.2.21.22.1.1.25 = INTEGER: 25 .1.3.6.1.4.1.2.3.51.2.2.21.22.1.1.26 = INTEGER: 26 .1.3.6.1.4.1.2.3.51.2.2.21.22.1.1.27 = INTEGER: 27 .1.3.6.1.4.1.2.3.51.2.2.21.22.1.1.28 = INTEGER: 28 .1.3.6.1.4.1.2.3.51.2.2.21.22.1.1.29 = INTEGER: 29 .1.3.6.1.4.1.2.3.51.2.2.21.22.1.1.30 = INTEGER: 30 .1.3.6.1.4.1.2.3.51.2.2.21.22.1.1.31 = INTEGER: 31 .1.3.6.1.4.1.2.3.51.2.2.21.22.1.1.32 = INTEGER: 32 .1.3.6.1.4.1.2.3.51.2.2.21.22.1.1.33 = INTEGER: 33 .1.3.6.1.4.1.2.3.51.2.2.21.22.1.1.34 = INTEGER: 34 .1.3.6.1.4.1.2.3.51.2.2.21.22.1.1.35 = INTEGER: 35 .1.3.6.1.4.1.2.3.51.2.2.21.22.1.1.36 = INTEGER: 36 .1.3.6.1.4.1.2.3.51.2.2.21.22.1.1.37 = INTEGER: 37 .1.3.6.1.4.1.2.3.51.2.2.21.22.1.1.38 = INTEGER: 38 .1.3.6.1.4.1.2.3.51.2.2.21.22.1.1.39 = INTEGER: 39 .1.3.6.1.4.1.2.3.51.2.2.21.22.1.1.40 = INTEGER: 40 .1.3.6.1.4.1.2.3.51.2.2.21.22.1.1.41 = INTEGER: 41 .1.3.6.1.4.1.2.3.51.2.2.21.22.1.1.42 = INTEGER: 42 .1.3.6.1.4.1.2.3.51.2.2.21.22.1.1.43 = INTEGER: 43 .1.3.6.1.4.1.2.3.51.2.2.21.22.1.1.44 = INTEGER: 44 .1.3.6.1.4.1.2.3.51.2.2.21.22.1.1.45 = INTEGER: 45 .1.3.6.1.4.1.2.3.51.2.2.21.22.1.1.46 = INTEGER: 46 .1.3.6.1.4.1.2.3.51.2.2.21.22.1.1.47 = INTEGER: 47 .1.3.6.1.4.1.2.3.51.2.2.21.22.1.1.48 = INTEGER: 48 .1.3.6.1.4.1.2.3.51.2.2.21.22.1.1.49 = INTEGER: 49 .1.3.6.1.4.1.2.3.51.2.2.21.22.1.1.50 = INTEGER: 50 .1.3.6.1.4.1.2.3.51.2.2.21.22.1.1.51 = INTEGER: 51 .1.3.6.1.4.1.2.3.51.2.2.21.22.1.1.52 = INTEGER: 52 .1.3.6.1.4.1.2.3.51.2.2.21.22.1.1.53 = INTEGER: 53 .1.3.6.1.4.1.2.3.51.2.2.21.22.1.1.54 = INTEGER: 54 .1.3.6.1.4.1.2.3.51.2.2.21.22.1.1.55 = INTEGER: 55 .1.3.6.1.4.1.2.3.51.2.2.21.22.1.1.56 = INTEGER: 56 .1.3.6.1.4.1.2.3.51.2.2.21.22.1.1.57 = INTEGER: 57 .1.3.6.1.4.1.2.3.51.2.2.21.22.1.1.58 = INTEGER: 58 .1.3.6.1.4.1.2.3.51.2.2.21.22.1.1.59 = INTEGER: 59 .1.3.6.1.4.1.2.3.51.2.2.21.22.1.1.60 = INTEGER: 60 .1.3.6.1.4.1.2.3.51.2.2.21.22.1.1.61 = INTEGER: 61 .1.3.6.1.4.1.2.3.51.2.2.21.22.1.1.62 = INTEGER: 62 .1.3.6.1.4.1.2.3.51.2.2.21.22.1.1.63 = INTEGER: 63 .1.3.6.1.4.1.2.3.51.2.2.21.22.1.1.64 = INTEGER: 64 .1.3.6.1.4.1.2.3.51.2.2.21.22.1.1.65 = INTEGER: 65 .1.3.6.1.4.1.2.3.51.2.2.21.22.1.1.66 = INTEGER: 66 .1.3.6.1.4.1.2.3.51.2.2.21.22.1.1.67 = INTEGER: 67 .1.3.6.1.4.1.2.3.51.2.2.21.22.1.1.68 = INTEGER: 68 .1.3.6.1.4.1.2.3.51.2.2.21.22.1.1.69 = INTEGER: 69 .1.3.6.1.4.1.2.3.51.2.2.21.22.1.1.70 = INTEGER: 70 .1.3.6.1.4.1.2.3.51.2.2.21.22.1.1.71 = INTEGER: 71 .1.3.6.1.4.1.2.3.51.2.2.21.22.1.1.72 = INTEGER: 72 .1.3.6.1.4.1.2.3.51.2.2.21.22.1.1.73 = INTEGER: 73 .1.3.6.1.4.1.2.3.51.2.2.21.22.1.1.74 = INTEGER: 74 .1.3.6.1.4.1.2.3.51.2.2.21.22.1.1.75 = INTEGER: 75 .1.3.6.1.4.1.2.3.51.2.2.21.22.1.1.76 = INTEGER: 76 .1.3.6.1.4.1.2.3.51.2.2.21.22.1.1.77 = INTEGER: 77 .1.3.6.1.4.1.2.3.51.2.2.21.22.1.1.78 = INTEGER: 78 .1.3.6.1.4.1.2.3.51.2.2.21.22.1.1.79 = INTEGER: 79 .1.3.6.1.4.1.2.3.51.2.2.21.22.1.1.80 = INTEGER: 80 .1.3.6.1.4.1.2.3.51.2.2.21.22.1.1.81 = INTEGER: 81 .1.3.6.1.4.1.2.3.51.2.2.21.22.1.1.82 = INTEGER: 82 .1.3.6.1.4.1.2.3.51.2.2.21.22.1.1.83 = INTEGER: 83 .1.3.6.1.4.1.2.3.51.2.2.21.22.1.1.84 = INTEGER: 84 .1.3.6.1.4.1.2.3.51.2.2.21.22.1.1.85 = INTEGER: 85 .1.3.6.1.4.1.2.3.51.2.2.21.22.1.1.86 = INTEGER: 86 .1.3.6.1.4.1.2.3.51.2.2.21.22.1.1.87 = INTEGER: 87 .1.3.6.1.4.1.2.3.51.2.2.21.22.1.1.88 = INTEGER: 88 .1.3.6.1.4.1.2.3.51.2.2.21.22.1.1.89 = INTEGER: 89 .1.3.6.1.4.1.2.3.51.2.2.21.22.1.1.90 = INTEGER: 90 .1.3.6.1.4.1.2.3.51.2.2.21.22.1.1.91 = INTEGER: 91 .1.3.6.1.4.1.2.3.51.2.2.21.22.1.1.92 = INTEGER: 92 .1.3.6.1.4.1.2.3.51.2.2.21.22.1.1.93 = INTEGER: 93 .1.3.6.1.4.1.2.3.51.2.2.21.22.1.1.94 = INTEGER: 94 .1.3.6.1.4.1.2.3.51.2.2.21.22.1.1.95 = INTEGER: 95 .1.3.6.1.4.1.2.3.51.2.2.21.22.1.1.96 = INTEGER: 96 .1.3.6.1.4.1.2.3.51.2.2.21.22.1.1.97 = INTEGER: 97 .1.3.6.1.4.1.2.3.51.2.2.21.22.1.1.98 = INTEGER: 98 .1.3.6.1.4.1.2.3.51.2.2.21.22.1.1.99 = INTEGER: 99 .1.3.6.1.4.1.2.3.51.2.2.21.22.1.1.100 = INTEGER: 100 .1.3.6.1.4.1.2.3.51.2.2.21.22.1.1.101 = INTEGER: 101 .1.3.6.1.4.1.2.3.51.2.2.21.22.1.1.102 = INTEGER: 102 .1.3.6.1.4.1.2.3.51.2.2.21.22.1.1.103 = INTEGER: 103 .1.3.6.1.4.1.2.3.51.2.2.21.22.1.1.104 = INTEGER: 104 .1.3.6.1.4.1.2.3.51.2.2.21.22.1.1.105 = INTEGER: 105 .1.3.6.1.4.1.2.3.51.2.2.21.22.1.1.106 = INTEGER: 106 .1.3.6.1.4.1.2.3.51.2.2.21.22.1.1.107 = INTEGER: 107 .1.3.6.1.4.1.2.3.51.2.2.21.22.1.1.108 = INTEGER: 108 .1.3.6.1.4.1.2.3.51.2.2.21.22.1.1.109 = INTEGER: 109 .1.3.6.1.4.1.2.3.51.2.2.21.22.1.1.110 = INTEGER: 110 .1.3.6.1.4.1.2.3.51.2.2.21.22.1.1.111 = INTEGER: 111 .1.3.6.1.4.1.2.3.51.2.2.21.22.1.1.112 = INTEGER: 112 .1.3.6.1.4.1.2.3.51.2.2.21.22.1.1.113 = INTEGER: 113 .1.3.6.1.4.1.2.3.51.2.2.21.22.1.1.114 = INTEGER: 114 .1.3.6.1.4.1.2.3.51.2.2.21.22.1.1.115 = INTEGER: 115 .1.3.6.1.4.1.2.3.51.2.2.21.22.1.1.116 = INTEGER: 116 .1.3.6.1.4.1.2.3.51.2.2.21.22.1.1.117 = INTEGER: 117 .1.3.6.1.4.1.2.3.51.2.2.21.22.1.1.118 = INTEGER: 118 .1.3.6.1.4.1.2.3.51.2.2.21.22.1.1.119 = INTEGER: 119 .1.3.6.1.4.1.2.3.51.2.2.21.22.1.1.120 = INTEGER: 120 .1.3.6.1.4.1.2.3.51.2.2.21.22.1.1.121 = INTEGER: 121 .1.3.6.1.4.1.2.3.51.2.2.21.22.1.1.122 = INTEGER: 122 .1.3.6.1.4.1.2.3.51.2.2.21.22.1.1.123 = INTEGER: 123 .1.3.6.1.4.1.2.3.51.2.2.21.22.1.1.124 = INTEGER: 124 .1.3.6.1.4.1.2.3.51.2.2.21.22.1.1.125 = INTEGER: 125 .1.3.6.1.4.1.2.3.51.2.2.21.22.1.1.126 = INTEGER: 126 .1.3.6.1.4.1.2.3.51.2.2.21.22.1.1.127 = INTEGER: 127 .1.3.6.1.4.1.2.3.51.2.2.21.22.1.1.128 = INTEGER: 128 .1.3.6.1.4.1.2.3.51.2.2.21.22.1.1.129 = INTEGER: 129 .1.3.6.1.4.1.2.3.51.2.2.21.22.1.1.130 = INTEGER: 130 .1.3.6.1.4.1.2.3.51.2.2.21.22.1.1.131 = INTEGER: 131 .1.3.6.1.4.1.2.3.51.2.2.21.22.1.1.132 = INTEGER: 132 .1.3.6.1.4.1.2.3.51.2.2.21.22.1.1.133 = INTEGER: 133 .1.3.6.1.4.1.2.3.51.2.2.21.22.1.1.134 = INTEGER: 134 .1.3.6.1.4.1.2.3.51.2.2.21.22.1.1.135 = INTEGER: 135 .1.3.6.1.4.1.2.3.51.2.2.21.22.1.1.136 = INTEGER: 136 .1.3.6.1.4.1.2.3.51.2.2.21.22.1.1.137 = INTEGER: 137 .1.3.6.1.4.1.2.3.51.2.2.21.22.1.1.138 = INTEGER: 138 .1.3.6.1.4.1.2.3.51.2.2.21.22.1.1.139 = INTEGER: 139 .1.3.6.1.4.1.2.3.51.2.2.21.22.1.1.140 = INTEGER: 140 .1.3.6.1.4.1.2.3.51.2.2.21.22.1.1.141 = INTEGER: 141 .1.3.6.1.4.1.2.3.51.2.2.21.22.1.1.142 = INTEGER: 142 .1.3.6.1.4.1.2.3.51.2.2.21.22.1.1.143 = INTEGER: 143 .1.3.6.1.4.1.2.3.51.2.2.21.22.1.1.144 = INTEGER: 144 .1.3.6.1.4.1.2.3.51.2.2.21.22.1.1.145 = INTEGER: 145 .1.3.6.1.4.1.2.3.51.2.2.21.22.1.1.146 = INTEGER: 146 .1.3.6.1.4.1.2.3.51.2.2.21.22.1.1.147 = INTEGER: 147 .1.3.6.1.4.1.2.3.51.2.2.21.22.1.1.148 = INTEGER: 148 .1.3.6.1.4.1.2.3.51.2.2.21.22.1.1.149 = INTEGER: 149 .1.3.6.1.4.1.2.3.51.2.2.21.22.1.1.150 = INTEGER: 150 .1.3.6.1.4.1.2.3.51.2.2.21.22.1.1.151 = INTEGER: 151 .1.3.6.1.4.1.2.3.51.2.2.21.22.1.1.152 = INTEGER: 152 .1.3.6.1.4.1.2.3.51.2.2.21.22.1.1.153 = INTEGER: 153 .1.3.6.1.4.1.2.3.51.2.2.21.22.1.1.154 = INTEGER: 154 .1.3.6.1.4.1.2.3.51.2.2.21.22.1.1.155 = INTEGER: 155 .1.3.6.1.4.1.2.3.51.2.2.21.22.1.1.156 = INTEGER: 156 .1.3.6.1.4.1.2.3.51.2.2.21.22.1.1.157 = INTEGER: 157 .1.3.6.1.4.1.2.3.51.2.2.21.22.1.1.158 = INTEGER: 158 .1.3.6.1.4.1.2.3.51.2.2.21.22.1.1.159 = INTEGER: 159 .1.3.6.1.4.1.2.3.51.2.2.21.22.1.1.160 = INTEGER: 160 .1.3.6.1.4.1.2.3.51.2.2.21.22.1.1.161 = INTEGER: 161 .1.3.6.1.4.1.2.3.51.2.2.21.22.1.1.162 = INTEGER: 162 .1.3.6.1.4.1.2.3.51.2.2.21.22.1.1.163 = INTEGER: 163 .1.3.6.1.4.1.2.3.51.2.2.21.22.1.1.164 = INTEGER: 164 .1.3.6.1.4.1.2.3.51.2.2.21.22.1.1.165 = INTEGER: 165 .1.3.6.1.4.1.2.3.51.2.2.21.22.1.1.166 = INTEGER: 166 .1.3.6.1.4.1.2.3.51.2.2.21.22.1.1.167 = INTEGER: 167 .1.3.6.1.4.1.2.3.51.2.2.21.22.1.1.168 = INTEGER: 168 .1.3.6.1.4.1.2.3.51.2.2.21.22.1.1.169 = INTEGER: 169 .1.3.6.1.4.1.2.3.51.2.2.21.22.1.1.170 = INTEGER: 170 .1.3.6.1.4.1.2.3.51.2.2.21.22.1.1.171 = INTEGER: 171 .1.3.6.1.4.1.2.3.51.2.2.21.22.1.1.172 = INTEGER: 172 .1.3.6.1.4.1.2.3.51.2.2.21.22.1.1.173 = INTEGER: 173 .1.3.6.1.4.1.2.3.51.2.2.21.22.1.1.174 = INTEGER: 174 .1.3.6.1.4.1.2.3.51.2.2.21.22.1.1.175 = INTEGER: 175 .1.3.6.1.4.1.2.3.51.2.2.21.22.1.1.176 = INTEGER: 176 .1.3.6.1.4.1.2.3.51.2.2.21.22.1.1.177 = INTEGER: 177 .1.3.6.1.4.1.2.3.51.2.2.21.22.1.1.178 = INTEGER: 178 .1.3.6.1.4.1.2.3.51.2.2.21.22.1.1.179 = INTEGER: 179 .1.3.6.1.4.1.2.3.51.2.2.21.22.1.1.180 = INTEGER: 180 .1.3.6.1.4.1.2.3.51.2.2.21.22.1.1.181 = INTEGER: 181 .1.3.6.1.4.1.2.3.51.2.2.21.22.1.1.182 = INTEGER: 182 .1.3.6.1.4.1.2.3.51.2.2.21.22.1.1.183 = INTEGER: 183 .1.3.6.1.4.1.2.3.51.2.2.21.22.1.1.184 = INTEGER: 184 .1.3.6.1.4.1.2.3.51.2.2.21.22.1.1.185 = INTEGER: 185 .1.3.6.1.4.1.2.3.51.2.2.21.22.1.1.186 = INTEGER: 186 .1.3.6.1.4.1.2.3.51.2.2.21.22.1.1.187 = INTEGER: 187 .1.3.6.1.4.1.2.3.51.2.2.21.22.1.1.188 = INTEGER: 188 .1.3.6.1.4.1.2.3.51.2.2.21.22.1.1.189 = INTEGER: 189 .1.3.6.1.4.1.2.3.51.2.2.21.22.1.1.190 = INTEGER: 190 .1.3.6.1.4.1.2.3.51.2.2.21.22.1.1.191 = INTEGER: 191 .1.3.6.1.4.1.2.3.51.2.2.21.22.1.1.192 = INTEGER: 192 .1.3.6.1.4.1.2.3.51.2.2.21.22.1.1.193 = INTEGER: 193 .1.3.6.1.4.1.2.3.51.2.2.21.22.1.1.194 = INTEGER: 194 .1.3.6.1.4.1.2.3.51.2.2.21.22.1.1.195 = INTEGER: 195 .1.3.6.1.4.1.2.3.51.2.2.21.22.1.1.196 = INTEGER: 196 .1.3.6.1.4.1.2.3.51.2.2.21.22.1.1.197 = INTEGER: 197 .1.3.6.1.4.1.2.3.51.2.2.21.22.1.1.198 = INTEGER: 198 .1.3.6.1.4.1.2.3.51.2.2.21.22.1.1.199 = INTEGER: 199 .1.3.6.1.4.1.2.3.51.2.2.21.22.1.1.200 = INTEGER: 200 .1.3.6.1.4.1.2.3.51.2.2.21.22.1.1.201 = INTEGER: 201 .1.3.6.1.4.1.2.3.51.2.2.21.22.1.1.202 = INTEGER: 202 .1.3.6.1.4.1.2.3.51.2.2.21.22.1.1.203 = INTEGER: 203 .1.3.6.1.4.1.2.3.51.2.2.21.22.1.1.204 = INTEGER: 204 .1.3.6.1.4.1.2.3.51.2.2.21.22.1.1.205 = INTEGER: 205 .1.3.6.1.4.1.2.3.51.2.2.21.22.1.1.206 = INTEGER: 206 .1.3.6.1.4.1.2.3.51.2.2.21.22.1.1.207 = INTEGER: 207 .1.3.6.1.4.1.2.3.51.2.2.21.22.1.1.208 = INTEGER: 208 .1.3.6.1.4.1.2.3.51.2.2.21.22.1.1.209 = INTEGER: 209 .1.3.6.1.4.1.2.3.51.2.2.21.22.1.1.210 = INTEGER: 210 .1.3.6.1.4.1.2.3.51.2.2.21.22.1.1.211 = INTEGER: 211 .1.3.6.1.4.1.2.3.51.2.2.21.22.1.1.212 = INTEGER: 212 .1.3.6.1.4.1.2.3.51.2.2.21.22.1.1.213 = INTEGER: 213 .1.3.6.1.4.1.2.3.51.2.2.21.22.1.1.214 = INTEGER: 214 .1.3.6.1.4.1.2.3.51.2.2.21.22.1.1.215 = INTEGER: 215 .1.3.6.1.4.1.2.3.51.2.2.21.22.1.1.216 = INTEGER: 216 .1.3.6.1.4.1.2.3.51.2.2.21.22.1.1.217 = INTEGER: 217 .1.3.6.1.4.1.2.3.51.2.2.21.22.1.1.218 = INTEGER: 218 .1.3.6.1.4.1.2.3.51.2.2.21.22.1.1.219 = INTEGER: 219 .1.3.6.1.4.1.2.3.51.2.2.21.22.1.1.220 = INTEGER: 220 .1.3.6.1.4.1.2.3.51.2.2.21.22.1.1.221 = INTEGER: 221 .1.3.6.1.4.1.2.3.51.2.2.21.22.1.1.222 = INTEGER: 222 .1.3.6.1.4.1.2.3.51.2.2.21.22.1.1.223 = INTEGER: 223 .1.3.6.1.4.1.2.3.51.2.2.21.22.1.1.224 = INTEGER: 224 .1.3.6.1.4.1.2.3.51.2.2.21.22.1.1.225 = INTEGER: 225 .1.3.6.1.4.1.2.3.51.2.2.21.22.1.1.226 = INTEGER: 226 .1.3.6.1.4.1.2.3.51.2.2.21.22.1.1.227 = INTEGER: 227 .1.3.6.1.4.1.2.3.51.2.2.21.22.1.1.228 = INTEGER: 228 .1.3.6.1.4.1.2.3.51.2.2.21.22.1.1.229 = INTEGER: 229 .1.3.6.1.4.1.2.3.51.2.2.21.22.1.1.230 = INTEGER: 230 .1.3.6.1.4.1.2.3.51.2.2.21.22.1.1.231 = INTEGER: 231 .1.3.6.1.4.1.2.3.51.2.2.21.22.1.1.232 = INTEGER: 232 .1.3.6.1.4.1.2.3.51.2.2.21.22.1.1.233 = INTEGER: 233 .1.3.6.1.4.1.2.3.51.2.2.21.22.1.1.234 = INTEGER: 234 .1.3.6.1.4.1.2.3.51.2.2.21.22.1.1.235 = INTEGER: 235 .1.3.6.1.4.1.2.3.51.2.2.21.22.1.1.236 = INTEGER: 236 .1.3.6.1.4.1.2.3.51.2.2.21.22.1.1.237 = INTEGER: 237 .1.3.6.1.4.1.2.3.51.2.2.21.22.1.1.238 = INTEGER: 238 .1.3.6.1.4.1.2.3.51.2.2.21.22.1.1.239 = INTEGER: 239 .1.3.6.1.4.1.2.3.51.2.2.21.22.1.2.1 = STRING: "90P3793" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.2.2 = STRING: "90P3697" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.2.3 = STRING: "13N1605" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.2.4 = STRING: "13N1607" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.2.5 = STRING: "39M3420" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.2.6 = STRING: "13N2346" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.2.7 = STRING: "59P6624" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.2.8 = STRING: "90P3711" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.2.9 = STRING: "90P3711" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.2.10 = STRING: "39M3418" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.2.11 = STRING: "13N1605" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.2.12 = STRING: "13N1607" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.2.13 = STRING: "90P3696" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.2.14 = STRING: "90P3711" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.2.15 = STRING: "90P3714" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.2.16 = STRING: "90P3714" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.2.17 = STRING: "90P3697" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.2.18 = STRING: "13N0504" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.2.19 = STRING: "13N2292" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.2.20 = STRING: "73P9092" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.2.21 = STRING: "31R3389" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.2.22 = STRING: "13N1605" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.2.23 = STRING: "59P6624" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.2.24 = STRING: "25K8238" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.2.25 = STRING: "13N1607" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.2.26 = STRING: "13N2346" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.2.27 = STRING: "90P3696" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.2.28 = STRING: "13N0504" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.2.29 = STRING: "13N0504" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.2.30 = STRING: "31R3389" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.2.31 = STRING: "31R3389" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.2.32 = STRING: "13N0497" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.2.33 = STRING: "90P3711" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.2.34 = STRING: "90P3793" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.2.35 = STRING: "13N0497" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.2.36 = STRING: "13N0497" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.2.37 = STRING: "13N2346" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.2.38 = STRING: "59P6624" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.2.39 = STRING: "39M3418" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.2.40 = STRING: "13N1605" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.2.41 = STRING: "13N1607" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.2.42 = STRING: "39M3420" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.2.43 = STRING: "90P3711" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.2.44 = STRING: "90P3711" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.2.45 = STRING: "90P3793" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.2.46 = STRING: "90P3711" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.2.47 = STRING: "90P3711" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.2.48 = STRING: "J85503A" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.2.49 = STRING: "13N1605" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.2.50 = STRING: "13N1607" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.2.51 = STRING: "13N1605" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.2.52 = STRING: "13N1605" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.2.53 = STRING: "90P4769" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.2.54 = STRING: "13N1607" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.2.55 = STRING: "13N1607" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.2.56 = STRING: "13N2346" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.2.57 = STRING: "13N2346" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.2.58 = STRING: "J85503A" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.2.59 = STRING: "J85503A" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.2.60 = STRING: "13N1605" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.2.61 = STRING: "13N1607" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.2.62 = STRING: "59P6624" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.2.63 = STRING: "25K8238" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.2.64 = STRING: "13N1605" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.2.65 = STRING: "59P6624" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.2.66 = STRING: "25K8238" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.2.67 = STRING: "13N1607" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.2.68 = STRING: "J85503A" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.2.69 = STRING: "J85503A" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.2.70 = STRING: "13N2346" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.2.71 = STRING: "13N2346" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.2.72 = STRING: "13N0504" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.2.73 = STRING: "13N0504" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.2.74 = STRING: "90P3793" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.2.75 = STRING: "90P3696" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.2.76 = STRING: "90P3696" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.2.77 = STRING: "90P3696" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.2.78 = STRING: "90P3696" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.2.79 = STRING: "90P3696" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.2.80 = STRING: "90P3696" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.2.81 = STRING: "90P3696" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.2.82 = STRING: "90P3696" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.2.83 = STRING: "90P3696" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.2.84 = STRING: "90P3696" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.2.85 = STRING: "90P3696" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.2.86 = STRING: "90P3696" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.2.87 = STRING: "90P3696" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.2.88 = STRING: "90P3696" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.2.89 = STRING: "90P3696" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.2.90 = STRING: "90P3696" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.2.91 = STRING: "90P3696" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.2.92 = STRING: "90P3696" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.2.93 = STRING: "90P3696" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.2.94 = STRING: "90P3696" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.2.95 = STRING: "90P3696" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.2.96 = STRING: "90P3696" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.2.97 = STRING: "90P3696" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.2.98 = STRING: "90P3696" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.2.99 = STRING: "90P3696" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.2.100 = STRING: "90P3696" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.2.101 = STRING: "90P3696" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.2.102 = STRING: "90P3696" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.2.103 = STRING: "90P3696" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.2.104 = STRING: "90P3696" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.2.105 = STRING: "90P3696" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.2.106 = STRING: "90P3696" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.2.107 = STRING: "90P3696" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.2.108 = STRING: "90P3696" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.2.109 = STRING: "90P3696" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.2.110 = STRING: "90P3696" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.2.111 = STRING: "90P3696" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.2.112 = STRING: "90P3696" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.2.113 = STRING: "90P3696" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.2.114 = STRING: "90P3696" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.2.115 = STRING: "90P3696" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.2.116 = STRING: "90P3696" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.2.117 = STRING: "90P3696" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.2.118 = STRING: "90P3696" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.2.119 = STRING: "90P3696" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.2.120 = STRING: "90P3696" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.2.121 = STRING: "90P3696" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.2.122 = STRING: "90P3696" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.2.123 = STRING: "90P3696" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.2.124 = STRING: "90P3696" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.2.125 = STRING: "90P3696" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.2.126 = STRING: "90P3696" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.2.127 = STRING: "90P3696" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.2.128 = STRING: "90P3696" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.2.129 = STRING: "90P3696" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.2.130 = STRING: "90P3696" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.2.131 = STRING: "90P3696" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.2.132 = STRING: "90P3696" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.2.133 = STRING: "90P3696" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.2.134 = STRING: "90P3696" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.2.135 = STRING: "90P3696" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.2.136 = STRING: "90P3696" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.2.137 = STRING: "90P3696" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.2.138 = STRING: "90P3696" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.2.139 = STRING: "90P3696" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.2.140 = STRING: "90P3696" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.2.141 = STRING: "90P3696" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.2.142 = STRING: "90P3696" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.2.143 = STRING: "90P3696" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.2.144 = STRING: "90P3696" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.2.145 = STRING: "90P3696" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.2.146 = STRING: "90P3696" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.2.147 = STRING: "90P3696" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.2.148 = STRING: "90P3696" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.2.149 = STRING: "90P3696" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.2.150 = STRING: "90P3696" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.2.151 = STRING: "90P3696" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.2.152 = STRING: "90P3696" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.2.153 = STRING: "90P3696" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.2.154 = STRING: "90P3696" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.2.155 = STRING: "90P3696" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.2.156 = STRING: "90P3696" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.2.157 = STRING: "90P3696" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.2.158 = STRING: "90P3696" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.2.159 = STRING: "90P3696" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.2.160 = STRING: "90P3696" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.2.161 = STRING: "90P3696" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.2.162 = STRING: "90P3696" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.2.163 = STRING: "90P3696" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.2.164 = STRING: "90P3696" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.2.165 = STRING: "90P3696" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.2.166 = STRING: "90P3696" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.2.167 = STRING: "90P3696" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.2.168 = STRING: "90P3696" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.2.169 = STRING: "90P3696" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.2.170 = STRING: "90P3696" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.2.171 = STRING: "90P3696" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.2.172 = STRING: "90P3696" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.2.173 = STRING: "90P3696" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.2.174 = STRING: "90P3696" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.2.175 = STRING: "90P3696" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.2.176 = STRING: "90P3696" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.2.177 = STRING: "90P3696" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.2.178 = STRING: "90P3696" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.2.179 = STRING: "90P3696" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.2.180 = STRING: "90P3696" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.2.181 = STRING: "90P3696" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.2.182 = STRING: "90P3696" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.2.183 = STRING: "90P3696" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.2.184 = STRING: "90P3696" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.2.185 = STRING: "90P3696" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.2.186 = STRING: "90P3696" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.2.187 = STRING: "90P3696" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.2.188 = STRING: "90P3696" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.2.189 = STRING: "90P3696" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.2.190 = STRING: "90P3696" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.2.191 = STRING: "90P3696" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.2.192 = STRING: "90P3696" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.2.193 = STRING: "90P3696" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.2.194 = STRING: "90P3696" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.2.195 = STRING: "90P3696" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.2.196 = STRING: "90P3696" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.2.197 = STRING: "90P3696" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.2.198 = STRING: "90P3696" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.2.199 = STRING: "90P3696" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.2.200 = STRING: "90P3696" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.2.201 = STRING: "90P3696" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.2.202 = STRING: "90P3696" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.2.203 = STRING: "90P3696" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.2.204 = STRING: "90P3696" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.2.205 = STRING: "90P3696" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.2.206 = STRING: "90P3696" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.2.207 = STRING: "90P3696" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.2.208 = STRING: "90P3696" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.2.209 = STRING: "90P3696" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.2.210 = STRING: "90P3696" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.2.211 = STRING: "90P3696" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.2.212 = STRING: "90P3696" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.2.213 = STRING: "90P3696" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.2.214 = STRING: "90P3696" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.2.215 = STRING: "90P3696" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.2.216 = STRING: "90P3696" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.2.217 = STRING: "90P3696" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.2.218 = STRING: "90P3696" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.2.219 = STRING: "90P3696" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.2.220 = STRING: "90P3696" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.2.221 = STRING: "90P3696" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.2.222 = STRING: "90P3696" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.2.223 = STRING: "90P3696" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.2.224 = STRING: "90P3696" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.2.225 = STRING: "90P3696" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.2.226 = STRING: "90P3696" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.2.227 = STRING: "90P3696" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.2.228 = STRING: "90P3696" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.2.229 = STRING: "90P3696" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.2.230 = STRING: "90P3696" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.2.231 = STRING: "90P3696" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.2.232 = STRING: "90P3696" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.2.233 = STRING: "90P3696" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.2.234 = STRING: "90P3696" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.2.235 = STRING: "90P3696" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.2.236 = STRING: "90P3696" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.2.237 = STRING: "90P3696" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.2.238 = STRING: "90P3696" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.2.239 = STRING: "90P3696" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.3.1 = STRING: "ZJ1UKR4CW00K" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.3.2 = STRING: "348ICHT00091" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.3.3 = STRING: "YJ1SM045703H" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.3.4 = STRING: "YJ1SM1447091" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.3.5 = STRING: "ZK11LG59XR12" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.3.6 = STRING: "ZJ1WLX48511J" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.3.7 = STRING: "J1RJH33J10Z" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.3.8 = STRING: "000E0C635C92" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.3.9 = STRING: "000E0C635832" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.3.10 = STRING: "ZK11LK5A3131" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.3.11 = STRING: "YJ1SM045703W" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.3.12 = STRING: "YJ1SM14L60N4" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.3.13 = STRING: "J1UKP00242" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.3.14 = STRING: "000E0C635B52" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.3.15 = STRING: "ZJ1UKT43J066" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.3.16 = STRING: "ZJ1UKT43J02X" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.3.17 = STRING: "J1UKS43F040" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.3.18 = STRING: "ZJ1W6745E17L" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.3.19 = STRING: "ZJ1TS741T1GG" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.3.20 = STRING: "J1RJW3671EH" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.3.21 = STRING: "ZJ1Z0051W00B" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.3.22 = STRING: "YJ1SM045701G" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.3.23 = STRING: "J1RJH3BH12J" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.3.24 = STRING: "ZJ1VZU45510W" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.3.25 = STRING: "YJ1SM14S601M" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.3.26 = STRING: "ZJ1WLX48512Y" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.3.27 = STRING: "J1UKR438006" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.3.28 = STRING: "ZJ1W6745E17L" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.3.29 = STRING: "ZJ1W6745E17L" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.3.30 = STRING: "ZJ1Z0051W00B" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.3.31 = STRING: "ZJ1Z0051W00B" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.3.32 = STRING: "ZJ1Z9E53B114" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.3.33 = STRING: "000E0C6356B2" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.3.34 = STRING: "ZJ1UKR4CW00K" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.3.35 = STRING: "ZJ1ZB753A10V" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.3.36 = STRING: "ZJ1Z9E52W101" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.3.37 = STRING: "ZJ1WLX48511J" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.3.38 = STRING: "J1RJH33J10Z" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.3.39 = STRING: "ZK11LK5A3131" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.3.40 = STRING: "YJ1SM045703W" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.3.41 = STRING: "YJ1SM14L60N4" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.3.42 = STRING: "ZK11LG59XR12" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.3.43 = STRING: "000E0C6356B2" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.3.44 = STRING: "000E0C635832" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.3.45 = STRING: "ZJ1UKR4CW00K" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.3.46 = STRING: "000E0C6356B2" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.3.47 = STRING: "000E0C6356B2" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.3.48 = STRING: "ZK11SV5AH10P" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.3.49 = STRING: "YJ1SM0457035" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.3.50 = STRING: "YJ1SM14S6013" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.3.51 = STRING: "YJ1SM0457035" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.3.52 = STRING: "YJ1SM0457035" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.3.53 = STRING: "K10XD3AP1AM" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.3.54 = STRING: "YJ1SM14S6013" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.3.55 = STRING: "YJ1SM14S6013" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.3.56 = STRING: "ZJ1WLX48512Y" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.3.57 = STRING: "ZJ1WLX48512Y" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.3.58 = STRING: "ZK11SV5AH10P" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.3.59 = STRING: "ZK11SV5AH10P" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.3.60 = STRING: "YJ1SM045701G" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.3.61 = STRING: "YJ1SM14S601M" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.3.62 = STRING: "J1RJH3BH12J" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.3.63 = STRING: "ZJ1VZU45510W" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.3.64 = STRING: "YJ1SM045701G" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.3.65 = STRING: "J1RJH3BH12J" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.3.66 = STRING: "ZJ1VZU45510W" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.3.67 = STRING: "YJ1SM14S601M" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.3.68 = STRING: "ZK11SV5AH10P" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.3.69 = STRING: "ZK11SV5AH10P" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.3.70 = STRING: "ZJ1WLX48512Y" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.3.71 = STRING: "ZJ1WLX48512Y" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.3.72 = STRING: "ZJ1W6745E17L" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.3.73 = STRING: "ZJ1W6745E17L" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.3.74 = STRING: "ZJ1UKR4CW00K" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.3.75 = STRING: "352ICHT00018" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.3.76 = STRING: "352ICHT00018" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.3.77 = STRING: "352ICHT00018" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.3.78 = STRING: "352ICHT00018" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.3.79 = STRING: "352ICHT00018" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.3.80 = STRING: "352ICHT00018" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.3.81 = STRING: "352ICHT00018" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.3.82 = STRING: "352ICHT00018" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.3.83 = STRING: "352ICHT00018" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.3.84 = STRING: "352ICHT00018" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.3.85 = STRING: "352ICHT00018" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.3.86 = STRING: "352ICHT00018" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.3.87 = STRING: "352ICHT00018" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.3.88 = STRING: "352ICHT00018" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.3.89 = STRING: "352ICHT00018" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.3.90 = STRING: "352ICHT00018" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.3.91 = STRING: "352ICHT00018" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.3.92 = STRING: "352ICHT00018" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.3.93 = STRING: "352ICHT00018" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.3.94 = STRING: "352ICHT00018" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.3.95 = STRING: "352ICHT00018" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.3.96 = STRING: "352ICHT00018" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.3.97 = STRING: "352ICHT00018" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.3.98 = STRING: "352ICHT00018" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.3.99 = STRING: "352ICHT00018" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.3.100 = STRING: "352ICHT00018" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.3.101 = STRING: "352ICHT00018" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.3.102 = STRING: "352ICHT00018" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.3.103 = STRING: "352ICHT00018" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.3.104 = STRING: "352ICHT00018" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.3.105 = STRING: "352ICHT00018" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.3.106 = STRING: "352ICHT00018" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.3.107 = STRING: "352ICHT00018" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.3.108 = STRING: "352ICHT00018" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.3.109 = STRING: "352ICHT00018" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.3.110 = STRING: "352ICHT00018" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.3.111 = STRING: "352ICHT00018" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.3.112 = STRING: "352ICHT00018" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.3.113 = STRING: "352ICHT00018" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.3.114 = STRING: "352ICHT00018" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.3.115 = STRING: "352ICHT00018" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.3.116 = STRING: "352ICHT00018" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.3.117 = STRING: "352ICHT00018" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.3.118 = STRING: "352ICHT00018" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.3.119 = STRING: "352ICHT00018" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.3.120 = STRING: "352ICHT00018" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.3.121 = STRING: "352ICHT00018" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.3.122 = STRING: "352ICHT00018" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.3.123 = STRING: "352ICHT00018" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.3.124 = STRING: "352ICHT00018" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.3.125 = STRING: "352ICHT00018" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.3.126 = STRING: "352ICHT00018" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.3.127 = STRING: "352ICHT00018" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.3.128 = STRING: "352ICHT00018" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.3.129 = STRING: "352ICHT00018" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.3.130 = STRING: "352ICHT00018" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.3.131 = STRING: "352ICHT00018" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.3.132 = STRING: "352ICHT00018" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.3.133 = STRING: "352ICHT00018" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.3.134 = STRING: "352ICHT00018" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.3.135 = STRING: "352ICHT00018" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.3.136 = STRING: "352ICHT00018" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.3.137 = STRING: "352ICHT00018" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.3.138 = STRING: "352ICHT00018" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.3.139 = STRING: "352ICHT00018" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.3.140 = STRING: "352ICHT00018" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.3.141 = STRING: "352ICHT00018" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.3.142 = STRING: "352ICHT00018" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.3.143 = STRING: "352ICHT00018" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.3.144 = STRING: "352ICHT00018" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.3.145 = STRING: "352ICHT00018" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.3.146 = STRING: "352ICHT00018" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.3.147 = STRING: "352ICHT00018" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.3.148 = STRING: "352ICHT00018" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.3.149 = STRING: "352ICHT00018" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.3.150 = STRING: "352ICHT00018" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.3.151 = STRING: "352ICHT00018" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.3.152 = STRING: "352ICHT00018" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.3.153 = STRING: "352ICHT00018" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.3.154 = STRING: "352ICHT00018" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.3.155 = STRING: "352ICHT00018" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.3.156 = STRING: "352ICHT00018" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.3.157 = STRING: "352ICHT00018" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.3.158 = STRING: "352ICHT00018" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.3.159 = STRING: "352ICHT00018" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.3.160 = STRING: "352ICHT00018" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.3.161 = STRING: "352ICHT00018" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.3.162 = STRING: "352ICHT00018" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.3.163 = STRING: "352ICHT00018" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.3.164 = STRING: "352ICHT00018" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.3.165 = STRING: "352ICHT00018" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.3.166 = STRING: "352ICHT00018" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.3.167 = STRING: "352ICHT00018" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.3.168 = STRING: "352ICHT00018" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.3.169 = STRING: "352ICHT00018" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.3.170 = STRING: "352ICHT00018" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.3.171 = STRING: "352ICHT00018" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.3.172 = STRING: "352ICHT00018" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.3.173 = STRING: "352ICHT00018" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.3.174 = STRING: "352ICHT00018" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.3.175 = STRING: "352ICHT00018" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.3.176 = STRING: "352ICHT00018" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.3.177 = STRING: "352ICHT00018" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.3.178 = STRING: "352ICHT00018" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.3.179 = STRING: "352ICHT00018" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.3.180 = STRING: "352ICHT00018" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.3.181 = STRING: "352ICHT00018" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.3.182 = STRING: "352ICHT00018" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.3.183 = STRING: "352ICHT00018" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.3.184 = STRING: "352ICHT00018" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.3.185 = STRING: "352ICHT00018" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.3.186 = STRING: "352ICHT00018" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.3.187 = STRING: "352ICHT00018" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.3.188 = STRING: "352ICHT00018" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.3.189 = STRING: "352ICHT00018" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.3.190 = STRING: "352ICHT00018" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.3.191 = STRING: "352ICHT00018" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.3.192 = STRING: "352ICHT00018" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.3.193 = STRING: "352ICHT00018" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.3.194 = STRING: "352ICHT00018" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.3.195 = STRING: "352ICHT00018" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.3.196 = STRING: "352ICHT00018" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.3.197 = STRING: "352ICHT00018" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.3.198 = STRING: "352ICHT00018" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.3.199 = STRING: "352ICHT00018" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.3.200 = STRING: "352ICHT00018" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.3.201 = STRING: "352ICHT00018" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.3.202 = STRING: "352ICHT00018" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.3.203 = STRING: "352ICHT00018" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.3.204 = STRING: "352ICHT00018" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.3.205 = STRING: "352ICHT00018" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.3.206 = STRING: "352ICHT00018" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.3.207 = STRING: "352ICHT00018" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.3.208 = STRING: "352ICHT00018" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.3.209 = STRING: "352ICHT00018" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.3.210 = STRING: "352ICHT00018" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.3.211 = STRING: "352ICHT00018" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.3.212 = STRING: "352ICHT00018" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.3.213 = STRING: "352ICHT00018" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.3.214 = STRING: "352ICHT00018" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.3.215 = STRING: "352ICHT00018" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.3.216 = STRING: "352ICHT00018" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.3.217 = STRING: "352ICHT00018" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.3.218 = STRING: "352ICHT00018" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.3.219 = STRING: "352ICHT00018" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.3.220 = STRING: "352ICHT00018" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.3.221 = STRING: "352ICHT00018" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.3.222 = STRING: "352ICHT00018" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.3.223 = STRING: "352ICHT00018" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.3.224 = STRING: "352ICHT00018" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.3.225 = STRING: "352ICHT00018" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.3.226 = STRING: "352ICHT00018" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.3.227 = STRING: "352ICHT00018" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.3.228 = STRING: "352ICHT00018" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.3.229 = STRING: "352ICHT00018" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.3.230 = STRING: "352ICHT00018" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.3.231 = STRING: "352ICHT00018" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.3.232 = STRING: "352ICHT00018" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.3.233 = STRING: "352ICHT00018" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.3.234 = STRING: "352ICHT00018" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.3.235 = STRING: "352ICHT00018" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.3.236 = STRING: "352ICHT00018" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.3.237 = STRING: "352ICHT00018" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.3.238 = STRING: "352ICHT00018" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.3.239 = STRING: "352ICHT00018" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.4.1 = STRING: "IBM" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.4.2 = STRING: "IBM" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.4.3 = STRING: "IBM" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.4.4 = STRING: "IBM" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.4.5 = STRING: "IBM" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.4.6 = STRING: "IBM" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.4.7 = STRING: "SLRM" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.4.8 = STRING: "AD " .1.3.6.1.4.1.2.3.51.2.2.21.22.1.4.9 = STRING: "AD " .1.3.6.1.4.1.2.3.51.2.2.21.22.1.4.10 = STRING: "IBM" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.4.11 = STRING: "IBM" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.4.12 = STRING: "IBM" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.4.13 = STRING: "IBM" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.4.14 = STRING: "AD " .1.3.6.1.4.1.2.3.51.2.2.21.22.1.4.15 = STRING: "DELT" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.4.16 = STRING: "DELT" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.4.17 = STRING: "IBM" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.4.18 = STRING: "IBM" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.4.19 = STRING: "IBM" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.4.20 = STRING: "SLRM" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.4.21 = STRING: "IBM" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.4.22 = STRING: "IBM" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.4.23 = STRING: "SLRM" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.4.24 = STRING: "IBM" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.4.25 = STRING: "IBM" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.4.26 = STRING: "IBM" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.4.27 = STRING: "IBM" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.4.28 = STRING: "IBM" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.4.29 = STRING: "IBM" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.4.30 = STRING: "IBM" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.4.31 = STRING: "IBM" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.4.32 = STRING: "IBM" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.4.33 = STRING: "AD " .1.3.6.1.4.1.2.3.51.2.2.21.22.1.4.34 = STRING: "IBM" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.4.35 = STRING: "IBM" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.4.36 = STRING: "IBM" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.4.37 = STRING: "IBM" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.4.38 = STRING: "SLRM" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.4.39 = STRING: "IBM" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.4.40 = STRING: "IBM" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.4.41 = STRING: "IBM" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.4.42 = STRING: "IBM" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.4.43 = STRING: "AD " .1.3.6.1.4.1.2.3.51.2.2.21.22.1.4.44 = STRING: "AD " .1.3.6.1.4.1.2.3.51.2.2.21.22.1.4.45 = STRING: "IBM" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.4.46 = STRING: "AD " .1.3.6.1.4.1.2.3.51.2.2.21.22.1.4.47 = STRING: "AD #" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.4.48 = STRING: "IBM" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.4.49 = STRING: "IBM" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.4.50 = STRING: "IBM" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.4.51 = STRING: "IBM" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.4.52 = STRING: "IBM" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.4.53 = STRING: "SLRM" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.4.54 = STRING: "IBM" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.4.55 = STRING: "IBM" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.4.56 = STRING: "IBM" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.4.57 = STRING: "IBM" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.4.58 = STRING: "IBM" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.4.59 = STRING: "IBM" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.4.60 = STRING: "IBM" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.4.61 = STRING: "IBM" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.4.62 = STRING: "SLRM" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.4.63 = STRING: "IBM" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.4.64 = STRING: "IBM" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.4.65 = STRING: "SLRM" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.4.66 = STRING: "IBM" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.4.67 = STRING: "IBM" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.4.68 = STRING: "IBM" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.4.69 = STRING: "IBM" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.4.70 = STRING: "IBM" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.4.71 = STRING: "IBM" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.4.72 = STRING: "IBM" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.4.73 = STRING: "IBM" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.4.74 = STRING: "IBM" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.4.75 = STRING: "IBM" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.4.76 = STRING: "IBM" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.4.77 = STRING: "IBM" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.4.78 = STRING: "IBM" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.4.79 = STRING: "IBM" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.4.80 = STRING: "IBM" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.4.81 = STRING: "IBM" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.4.82 = STRING: "IBM" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.4.83 = STRING: "IBM" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.4.84 = STRING: "IBM" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.4.85 = STRING: "IBM" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.4.86 = STRING: "IBM" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.4.87 = STRING: "IBM" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.4.88 = STRING: "IBM" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.4.89 = STRING: "IBM" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.4.90 = STRING: "IBM" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.4.91 = STRING: "IBM" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.4.92 = STRING: "IBM" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.4.93 = STRING: "IBM" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.4.94 = STRING: "IBM" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.4.95 = STRING: "IBM" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.4.96 = STRING: "IBM" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.4.97 = STRING: "IBM" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.4.98 = STRING: "IBM" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.4.99 = STRING: "IBM" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.4.100 = STRING: "IBM" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.4.101 = STRING: "IBM" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.4.102 = STRING: "IBM" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.4.103 = STRING: "IBM" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.4.104 = STRING: "IBM" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.4.105 = STRING: "IBM" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.4.106 = STRING: "IBM" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.4.107 = STRING: "IBM" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.4.108 = STRING: "IBM" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.4.109 = STRING: "IBM" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.4.110 = STRING: "IBM" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.4.111 = STRING: "IBM" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.4.112 = STRING: "IBM" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.4.113 = STRING: "IBM" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.4.114 = STRING: "IBM" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.4.115 = STRING: "IBM" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.4.116 = STRING: "IBM" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.4.117 = STRING: "IBM" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.4.118 = STRING: "IBM" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.4.119 = STRING: "IBM" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.4.120 = STRING: "IBM" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.4.121 = STRING: "IBM" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.4.122 = STRING: "IBM" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.4.123 = STRING: "IBM" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.4.124 = STRING: "IBM" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.4.125 = STRING: "IBM" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.4.126 = STRING: "IBM" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.4.127 = STRING: "IBM" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.4.128 = STRING: "IBM" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.4.129 = STRING: "IBM" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.4.130 = STRING: "IBM" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.4.131 = STRING: "IBM" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.4.132 = STRING: "IBM" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.4.133 = STRING: "IBM" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.4.134 = STRING: "IBM" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.4.135 = STRING: "IBM" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.4.136 = STRING: "IBM" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.4.137 = STRING: "IBM" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.4.138 = STRING: "IBM" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.4.139 = STRING: "IBM" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.4.140 = STRING: "IBM" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.4.141 = STRING: "IBM" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.4.142 = STRING: "IBM" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.4.143 = STRING: "IBM" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.4.144 = STRING: "IBM" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.4.145 = STRING: "IBM" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.4.146 = STRING: "IBM" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.4.147 = STRING: "IBM" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.4.148 = STRING: "IBM" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.4.149 = STRING: "IBM" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.4.150 = STRING: "IBM" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.4.151 = STRING: "IBM" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.4.152 = STRING: "IBM" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.4.153 = STRING: "IBM" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.4.154 = STRING: "IBM" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.4.155 = STRING: "IBM" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.4.156 = STRING: "IBM" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.4.157 = STRING: "IBM" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.4.158 = STRING: "IBM" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.4.159 = STRING: "IBM" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.4.160 = STRING: "IBM" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.4.161 = STRING: "IBM" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.4.162 = STRING: "IBM" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.4.163 = STRING: "IBM" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.4.164 = STRING: "IBM" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.4.165 = STRING: "IBM" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.4.166 = STRING: "IBM" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.4.167 = STRING: "IBM" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.4.168 = STRING: "IBM" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.4.169 = STRING: "IBM" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.4.170 = STRING: "IBM" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.4.171 = STRING: "IBM" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.4.172 = STRING: "IBM" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.4.173 = STRING: "IBM" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.4.174 = STRING: "IBM" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.4.175 = STRING: "IBM" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.4.176 = STRING: "IBM" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.4.177 = STRING: "IBM" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.4.178 = STRING: "IBM" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.4.179 = STRING: "IBM" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.4.180 = STRING: "IBM" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.4.181 = STRING: "IBM" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.4.182 = STRING: "IBM" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.4.183 = STRING: "IBM" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.4.184 = STRING: "IBM" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.4.185 = STRING: "IBM" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.4.186 = STRING: "IBM" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.4.187 = STRING: "IBM" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.4.188 = STRING: "IBM" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.4.189 = STRING: "IBM" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.4.190 = STRING: "IBM" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.4.191 = STRING: "IBM" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.4.192 = STRING: "IBM" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.4.193 = STRING: "IBM" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.4.194 = STRING: "IBM" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.4.195 = STRING: "IBM" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.4.196 = STRING: "IBM" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.4.197 = STRING: "IBM" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.4.198 = STRING: "IBM" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.4.199 = STRING: "IBM" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.4.200 = STRING: "IBM" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.4.201 = STRING: "IBM" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.4.202 = STRING: "IBM" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.4.203 = STRING: "IBM" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.4.204 = STRING: "IBM" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.4.205 = STRING: "IBM" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.4.206 = STRING: "IBM" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.4.207 = STRING: "IBM" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.4.208 = STRING: "IBM" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.4.209 = STRING: "IBM" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.4.210 = STRING: "IBM" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.4.211 = STRING: "IBM" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.4.212 = STRING: "IBM" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.4.213 = STRING: "IBM" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.4.214 = STRING: "IBM" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.4.215 = STRING: "IBM" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.4.216 = STRING: "IBM" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.4.217 = STRING: "IBM" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.4.218 = STRING: "IBM" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.4.219 = STRING: "IBM" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.4.220 = STRING: "IBM" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.4.221 = STRING: "IBM" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.4.222 = STRING: "IBM" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.4.223 = STRING: "IBM" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.4.224 = STRING: "IBM" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.4.225 = STRING: "IBM" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.4.226 = STRING: "IBM" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.4.227 = STRING: "IBM" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.4.228 = STRING: "IBM" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.4.229 = STRING: "IBM" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.4.230 = STRING: "IBM" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.4.231 = STRING: "IBM" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.4.232 = STRING: "IBM" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.4.233 = STRING: "IBM" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.4.234 = STRING: "IBM" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.4.235 = STRING: "IBM" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.4.236 = STRING: "IBM" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.4.237 = STRING: "IBM" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.4.238 = STRING: "IBM" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.4.239 = STRING: "IBM" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.5.1 = STRING: "2" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.5.2 = STRING: "1" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.5.3 = STRING: "8" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.5.4 = STRING: "8" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.5.5 = STRING: "6" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.5.6 = STRING: "2" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.5.7 = STRING: "2" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.5.8 = STRING: "1" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.5.9 = STRING: "2" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.5.10 = STRING: "5" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.5.11 = STRING: "6" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.5.12 = STRING: "6" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.5.13 = STRING: "1" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.5.14 = STRING: "1" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.5.15 = STRING: "1" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.5.16 = STRING: "2" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.5.17 = STRING: "1" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.5.18 = STRING: "5" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.5.19 = STRING: "3" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.5.20 = STRING: "3" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.5.21 = STRING: "1" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.5.22 = STRING: "8" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.5.23 = STRING: "8" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.5.24 = STRING: "8" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.5.25 = STRING: "8" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.5.26 = STRING: "4" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.5.27 = STRING: "2" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.5.28 = STRING: "5" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.5.29 = STRING: "5" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.5.30 = STRING: "1" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.5.31 = STRING: "1" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.5.32 = STRING: "1" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.5.33 = STRING: "2" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.5.34 = STRING: "2" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.5.35 = STRING: "8" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.5.36 = STRING: "8" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.5.37 = STRING: "2" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.5.38 = STRING: "2" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.5.39 = STRING: "5" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.5.40 = STRING: "6" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.5.41 = STRING: "6" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.5.42 = STRING: "6" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.5.43 = STRING: "2" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.5.44 = STRING: "2" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.5.45 = STRING: "2" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.5.46 = STRING: "2" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.5.47 = STRING: "2" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.5.48 = STRING: "7" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.5.49 = STRING: "8" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.5.50 = STRING: "8" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.5.51 = STRING: "8" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.5.52 = STRING: "8" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.5.53 = STRING: "8" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.5.54 = STRING: "8" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.5.55 = STRING: "8" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.5.56 = STRING: "4" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.5.57 = STRING: "4" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.5.58 = STRING: "7" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.5.59 = STRING: "7" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.5.60 = STRING: "8" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.5.61 = STRING: "8" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.5.62 = STRING: "8" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.5.63 = STRING: "8" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.5.64 = STRING: "8" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.5.65 = STRING: "8" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.5.66 = STRING: "8" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.5.67 = STRING: "8" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.5.68 = STRING: "7" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.5.69 = STRING: "7" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.5.70 = STRING: "4" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.5.71 = STRING: "4" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.5.72 = STRING: "5" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.5.73 = STRING: "5" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.5.74 = STRING: "2" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.5.75 = STRING: "1" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.5.76 = STRING: "1" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.5.77 = STRING: "1" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.5.78 = STRING: "1" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.5.79 = STRING: "1" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.5.80 = STRING: "1" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.5.81 = STRING: "1" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.5.82 = STRING: "1" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.5.83 = STRING: "1" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.5.84 = STRING: "1" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.5.85 = STRING: "1" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.5.86 = STRING: "1" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.5.87 = STRING: "1" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.5.88 = STRING: "1" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.5.89 = STRING: "1" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.5.90 = STRING: "1" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.5.91 = STRING: "1" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.5.92 = STRING: "1" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.5.93 = STRING: "1" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.5.94 = STRING: "1" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.5.95 = STRING: "1" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.5.96 = STRING: "1" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.5.97 = STRING: "1" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.5.98 = STRING: "1" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.5.99 = STRING: "1" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.5.100 = STRING: "1" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.5.101 = STRING: "1" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.5.102 = STRING: "1" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.5.103 = STRING: "1" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.5.104 = STRING: "1" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.5.105 = STRING: "1" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.5.106 = STRING: "1" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.5.107 = STRING: "1" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.5.108 = STRING: "1" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.5.109 = STRING: "1" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.5.110 = STRING: "1" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.5.111 = STRING: "1" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.5.112 = STRING: "1" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.5.113 = STRING: "1" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.5.114 = STRING: "1" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.5.115 = STRING: "1" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.5.116 = STRING: "1" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.5.117 = STRING: "1" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.5.118 = STRING: "1" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.5.119 = STRING: "1" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.5.120 = STRING: "1" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.5.121 = STRING: "1" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.5.122 = STRING: "1" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.5.123 = STRING: "1" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.5.124 = STRING: "1" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.5.125 = STRING: "1" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.5.126 = STRING: "1" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.5.127 = STRING: "1" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.5.128 = STRING: "1" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.5.129 = STRING: "1" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.5.130 = STRING: "1" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.5.131 = STRING: "1" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.5.132 = STRING: "1" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.5.133 = STRING: "1" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.5.134 = STRING: "1" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.5.135 = STRING: "1" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.5.136 = STRING: "1" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.5.137 = STRING: "1" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.5.138 = STRING: "1" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.5.139 = STRING: "1" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.5.140 = STRING: "1" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.5.141 = STRING: "1" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.5.142 = STRING: "1" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.5.143 = STRING: "1" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.5.144 = STRING: "1" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.5.145 = STRING: "1" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.5.146 = STRING: "1" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.5.147 = STRING: "1" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.5.148 = STRING: "1" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.5.149 = STRING: "1" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.5.150 = STRING: "1" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.5.151 = STRING: "1" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.5.152 = STRING: "1" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.5.153 = STRING: "1" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.5.154 = STRING: "1" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.5.155 = STRING: "1" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.5.156 = STRING: "1" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.5.157 = STRING: "1" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.5.158 = STRING: "1" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.5.159 = STRING: "1" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.5.160 = STRING: "1" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.5.161 = STRING: "1" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.5.162 = STRING: "1" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.5.163 = STRING: "1" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.5.164 = STRING: "1" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.5.165 = STRING: "1" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.5.166 = STRING: "1" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.5.167 = STRING: "1" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.5.168 = STRING: "1" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.5.169 = STRING: "1" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.5.170 = STRING: "1" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.5.171 = STRING: "1" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.5.172 = STRING: "1" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.5.173 = STRING: "1" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.5.174 = STRING: "1" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.5.175 = STRING: "1" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.5.176 = STRING: "1" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.5.177 = STRING: "1" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.5.178 = STRING: "1" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.5.179 = STRING: "1" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.5.180 = STRING: "1" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.5.181 = STRING: "1" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.5.182 = STRING: "1" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.5.183 = STRING: "1" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.5.184 = STRING: "1" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.5.185 = STRING: "1" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.5.186 = STRING: "1" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.5.187 = STRING: "1" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.5.188 = STRING: "1" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.5.189 = STRING: "1" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.5.190 = STRING: "1" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.5.191 = STRING: "1" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.5.192 = STRING: "1" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.5.193 = STRING: "1" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.5.194 = STRING: "1" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.5.195 = STRING: "1" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.5.196 = STRING: "1" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.5.197 = STRING: "1" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.5.198 = STRING: "1" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.5.199 = STRING: "1" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.5.200 = STRING: "1" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.5.201 = STRING: "1" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.5.202 = STRING: "1" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.5.203 = STRING: "1" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.5.204 = STRING: "1" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.5.205 = STRING: "1" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.5.206 = STRING: "1" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.5.207 = STRING: "1" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.5.208 = STRING: "1" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.5.209 = STRING: "1" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.5.210 = STRING: "1" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.5.211 = STRING: "1" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.5.212 = STRING: "1" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.5.213 = STRING: "1" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.5.214 = STRING: "1" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.5.215 = STRING: "1" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.5.216 = STRING: "1" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.5.217 = STRING: "1" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.5.218 = STRING: "1" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.5.219 = STRING: "1" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.5.220 = STRING: "1" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.5.221 = STRING: "1" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.5.222 = STRING: "1" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.5.223 = STRING: "1" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.5.224 = STRING: "1" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.5.225 = STRING: "1" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.5.226 = STRING: "1" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.5.227 = STRING: "1" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.5.228 = STRING: "1" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.5.229 = STRING: "1" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.5.230 = STRING: "1" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.5.231 = STRING: "1" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.5.232 = STRING: "1" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.5.233 = STRING: "1" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.5.234 = STRING: "1" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.5.235 = STRING: "1" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.5.236 = STRING: "1" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.5.237 = STRING: "1" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.5.238 = STRING: "1" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.5.239 = STRING: "1" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.9.1 = STRING: "Added" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.9.2 = STRING: "Added" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.9.3 = STRING: "Added" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.9.4 = STRING: "Added" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.9.5 = STRING: "Added" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.9.6 = STRING: "Added" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.9.7 = STRING: "Added" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.9.8 = STRING: "Added" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.9.9 = STRING: "Added" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.9.10 = STRING: "Added" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.9.11 = STRING: "Added" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.9.12 = STRING: "Added" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.9.13 = STRING: "Added" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.9.14 = STRING: "Added" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.9.15 = STRING: "Added" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.9.16 = STRING: "Added" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.9.17 = STRING: "Added" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.9.18 = STRING: "Added" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.9.19 = STRING: "Added" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.9.20 = STRING: "Added" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.9.21 = STRING: "Added" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.9.22 = STRING: "Added" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.9.23 = STRING: "Added" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.9.24 = STRING: "Added" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.9.25 = STRING: "Added" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.9.26 = STRING: "Added" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.9.27 = STRING: "Added" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.9.28 = STRING: "Removed" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.9.29 = STRING: "Added" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.9.30 = STRING: "Removed" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.9.31 = STRING: "Added" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.9.32 = STRING: "Added" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.9.33 = STRING: "Added" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.9.34 = STRING: "Added" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.9.35 = STRING: "Added" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.9.36 = STRING: "Added" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.9.37 = STRING: "Removed" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.9.38 = STRING: "Removed" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.9.39 = STRING: "Removed" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.9.40 = STRING: "Removed" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.9.41 = STRING: "Removed" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.9.42 = STRING: "Removed" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.9.43 = STRING: "Removed" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.9.44 = STRING: "Removed" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.9.45 = STRING: "Removed" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.9.46 = STRING: "Added" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.9.47 = STRING: "Added" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.9.48 = STRING: "Added" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.9.49 = STRING: "Added" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.9.50 = STRING: "Added" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.9.51 = STRING: "Removed" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.9.52 = STRING: "Added" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.9.53 = STRING: "Added" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.9.54 = STRING: "Removed" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.9.55 = STRING: "Added" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.9.56 = STRING: "Removed" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.9.57 = STRING: "Added" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.9.58 = STRING: "Removed" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.9.59 = STRING: "Added" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.9.60 = STRING: "Removed" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.9.61 = STRING: "Removed" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.9.62 = STRING: "Removed" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.9.63 = STRING: "Removed" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.9.64 = STRING: "Added" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.9.65 = STRING: "Added" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.9.66 = STRING: "Added" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.9.67 = STRING: "Added" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.9.68 = STRING: "Removed" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.9.69 = STRING: "Added" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.9.70 = STRING: "Removed" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.9.71 = STRING: "Added" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.9.72 = STRING: "Removed" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.9.73 = STRING: "Added" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.9.74 = STRING: "Added" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.9.75 = STRING: "Added" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.9.76 = STRING: "Added" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.9.77 = STRING: "Added" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.9.78 = STRING: "Added" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.9.79 = STRING: "Added" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.9.80 = STRING: "Added" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.9.81 = STRING: "Added" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.9.82 = STRING: "Added" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.9.83 = STRING: "Added" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.9.84 = STRING: "Added" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.9.85 = STRING: "Added" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.9.86 = STRING: "Added" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.9.87 = STRING: "Added" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.9.88 = STRING: "Added" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.9.89 = STRING: "Added" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.9.90 = STRING: "Added" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.9.91 = STRING: "Added" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.9.92 = STRING: "Added" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.9.93 = STRING: "Added" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.9.94 = STRING: "Added" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.9.95 = STRING: "Added" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.9.96 = STRING: "Added" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.9.97 = STRING: "Added" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.9.98 = STRING: "Added" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.9.99 = STRING: "Added" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.9.100 = STRING: "Added" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.9.101 = STRING: "Added" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.9.102 = STRING: "Added" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.9.103 = STRING: "Added" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.9.104 = STRING: "Added" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.9.105 = STRING: "Added" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.9.106 = STRING: "Added" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.9.107 = STRING: "Added" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.9.108 = STRING: "Added" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.9.109 = STRING: "Added" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.9.110 = STRING: "Added" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.9.111 = STRING: "Added" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.9.112 = STRING: "Added" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.9.113 = STRING: "Added" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.9.114 = STRING: "Added" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.9.115 = STRING: "Added" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.9.116 = STRING: "Added" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.9.117 = STRING: "Added" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.9.118 = STRING: "Added" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.9.119 = STRING: "Added" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.9.120 = STRING: "Added" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.9.121 = STRING: "Added" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.9.122 = STRING: "Added" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.9.123 = STRING: "Added" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.9.124 = STRING: "Added" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.9.125 = STRING: "Added" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.9.126 = STRING: "Added" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.9.127 = STRING: "Added" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.9.128 = STRING: "Added" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.9.129 = STRING: "Added" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.9.130 = STRING: "Added" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.9.131 = STRING: "Added" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.9.132 = STRING: "Added" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.9.133 = STRING: "Added" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.9.134 = STRING: "Added" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.9.135 = STRING: "Added" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.9.136 = STRING: "Added" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.9.137 = STRING: "Added" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.9.138 = STRING: "Added" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.9.139 = STRING: "Added" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.9.140 = STRING: "Added" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.9.141 = STRING: "Added" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.9.142 = STRING: "Added" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.9.143 = STRING: "Added" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.9.144 = STRING: "Added" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.9.145 = STRING: "Added" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.9.146 = STRING: "Added" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.9.147 = STRING: "Added" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.9.148 = STRING: "Added" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.9.149 = STRING: "Added" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.9.150 = STRING: "Added" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.9.151 = STRING: "Added" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.9.152 = STRING: "Added" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.9.153 = STRING: "Added" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.9.154 = STRING: "Added" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.9.155 = STRING: "Added" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.9.156 = STRING: "Added" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.9.157 = STRING: "Added" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.9.158 = STRING: "Added" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.9.159 = STRING: "Added" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.9.160 = STRING: "Added" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.9.161 = STRING: "Added" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.9.162 = STRING: "Added" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.9.163 = STRING: "Added" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.9.164 = STRING: "Added" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.9.165 = STRING: "Added" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.9.166 = STRING: "Added" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.9.167 = STRING: "Added" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.9.168 = STRING: "Added" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.9.169 = STRING: "Added" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.9.170 = STRING: "Added" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.9.171 = STRING: "Added" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.9.172 = STRING: "Added" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.9.173 = STRING: "Added" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.9.174 = STRING: "Added" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.9.175 = STRING: "Added" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.9.176 = STRING: "Added" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.9.177 = STRING: "Added" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.9.178 = STRING: "Added" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.9.179 = STRING: "Added" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.9.180 = STRING: "Added" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.9.181 = STRING: "Added" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.9.182 = STRING: "Added" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.9.183 = STRING: "Added" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.9.184 = STRING: "Added" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.9.185 = STRING: "Added" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.9.186 = STRING: "Added" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.9.187 = STRING: "Added" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.9.188 = STRING: "Added" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.9.189 = STRING: "Added" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.9.190 = STRING: "Added" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.9.191 = STRING: "Added" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.9.192 = STRING: "Added" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.9.193 = STRING: "Added" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.9.194 = STRING: "Added" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.9.195 = STRING: "Added" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.9.196 = STRING: "Added" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.9.197 = STRING: "Added" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.9.198 = STRING: "Added" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.9.199 = STRING: "Added" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.9.200 = STRING: "Added" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.9.201 = STRING: "Added" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.9.202 = STRING: "Added" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.9.203 = STRING: "Added" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.9.204 = STRING: "Added" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.9.205 = STRING: "Added" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.9.206 = STRING: "Added" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.9.207 = STRING: "Added" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.9.208 = STRING: "Added" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.9.209 = STRING: "Added" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.9.210 = STRING: "Added" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.9.211 = STRING: "Added" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.9.212 = STRING: "Added" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.9.213 = STRING: "Added" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.9.214 = STRING: "Added" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.9.215 = STRING: "Added" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.9.216 = STRING: "Added" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.9.217 = STRING: "Added" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.9.218 = STRING: "Added" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.9.219 = STRING: "Added" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.9.220 = STRING: "Added" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.9.221 = STRING: "Added" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.9.222 = STRING: "Added" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.9.223 = STRING: "Added" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.9.224 = STRING: "Added" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.9.225 = STRING: "Added" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.9.226 = STRING: "Added" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.9.227 = STRING: "Added" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.9.228 = STRING: "Added" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.9.229 = STRING: "Added" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.9.230 = STRING: "Added" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.9.231 = STRING: "Added" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.9.232 = STRING: "Added" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.9.233 = STRING: "Added" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.9.234 = STRING: "Added" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.9.235 = STRING: "Added" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.9.236 = STRING: "Added" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.9.237 = STRING: "Added" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.9.238 = STRING: "Added" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.9.239 = STRING: "Added" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.10.1 = STRING: "Time:09:16:37,Date:07/26/2006" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.10.2 = STRING: "Time:17:07:35,Date:01/12/2006" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.10.3 = STRING: "Time:17:07:38,Date:01/12/2006" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.10.4 = STRING: "Time:17:07:39,Date:01/12/2006" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.10.5 = STRING: "Time:17:07:48,Date:01/12/2006" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.10.6 = STRING: "Time:17:08:52,Date:01/12/2006" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.10.7 = STRING: "Time:17:08:53,Date:01/12/2006" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.10.8 = STRING: "Time:17:08:57,Date:01/12/2006" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.10.9 = STRING: "Time:17:09:00,Date:01/12/2006" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.10.10 = STRING: "Time:17:27:15,Date:01/12/2006" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.10.11 = STRING: "Time:19:26:55,Date:01/12/2006" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.10.12 = STRING: "Time:19:26:59,Date:01/12/2006" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.10.13 = STRING: "Time:15:50:37,Date:01/13/2006" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.10.14 = STRING: "Time:15:51:01,Date:01/13/2006" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.10.15 = STRING: "Time:15:51:02,Date:01/13/2006" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.10.16 = STRING: "Time:15:51:11,Date:01/13/2006" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.10.17 = STRING: "Time:15:51:13,Date:01/13/2006" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.10.18 = STRING: "Time:15:51:14,Date:01/13/2006" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.10.19 = STRING: "Time:15:51:19,Date:01/13/2006" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.10.20 = STRING: "Time:15:51:23,Date:01/13/2006" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.10.21 = STRING: "Time:15:51:24,Date:01/13/2006" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.10.22 = STRING: "Time:15:51:27,Date:01/13/2006" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.10.23 = STRING: "Time:15:51:28,Date:01/13/2006" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.10.24 = STRING: "Time:15:51:28,Date:01/13/2006" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.10.25 = STRING: "Time:15:51:29,Date:01/13/2006" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.10.26 = STRING: "Time:15:51:30,Date:01/13/2006" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.10.27 = STRING: "Time:19:32:09,Date:01/18/2006" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.10.28 = STRING: "Time:15:47:41,Date:02/06/2006" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.10.29 = STRING: "Time:15:47:41,Date:02/06/2006" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.10.30 = STRING: "Time:15:47:47,Date:02/06/2006" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.10.31 = STRING: "Time:15:47:47,Date:02/06/2006" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.10.32 = STRING: "Time:14:05:02,Date:02/24/2006" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.10.33 = STRING: "Time:08:25:31,Date:03/13/2006" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.10.34 = STRING: "Time:08:51:42,Date:03/23/2006" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.10.35 = STRING: "Time:20:32:22,Date:01/09/2070" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.10.36 = STRING: "Time:20:41:59,Date:01/09/2070" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.10.37 = STRING: "Time:13:00:41,Date:06/19/2006" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.10.38 = STRING: "Time:13:00:41,Date:06/19/2006" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.10.39 = STRING: "Time:13:00:41,Date:06/19/2006" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.10.40 = STRING: "Time:13:00:41,Date:06/19/2006" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.10.41 = STRING: "Time:13:00:41,Date:06/19/2006" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.10.42 = STRING: "Time:13:00:41,Date:06/19/2006" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.10.43 = STRING: "Time:13:00:41,Date:06/19/2006" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.10.44 = STRING: "Time:13:00:41,Date:06/19/2006" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.10.45 = STRING: "Time:13:00:41,Date:06/19/2006" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.10.46 = STRING: "Time:12:23:34,Date:06/20/2006" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.10.47 = STRING: "Time:07:44:20,Date:06/21/2006" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.10.48 = STRING: "Time:10:40:19,Date:06/29/2006" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.10.49 = STRING: "Time:14:32:39,Date:06/29/2006" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.10.50 = STRING: "Time:14:32:42,Date:06/29/2006" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.10.51 = STRING: "Time:08:00:03,Date:06/30/2006" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.10.52 = STRING: "Time:08:00:03,Date:06/30/2006" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.10.53 = STRING: "Time:08:00:07,Date:06/30/2006" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.10.54 = STRING: "Time:08:00:08,Date:06/30/2006" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.10.55 = STRING: "Time:08:00:08,Date:06/30/2006" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.10.56 = STRING: "Time:08:01:57,Date:06/30/2006" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.10.57 = STRING: "Time:08:01:57,Date:06/30/2006" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.10.58 = STRING: "Time:08:27:11,Date:06/30/2006" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.10.59 = STRING: "Time:08:27:11,Date:06/30/2006" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.10.60 = STRING: "Time:10:39:19,Date:06/30/2006" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.10.61 = STRING: "Time:10:39:19,Date:06/30/2006" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.10.62 = STRING: "Time:10:39:19,Date:06/30/2006" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.10.63 = STRING: "Time:10:39:19,Date:06/30/2006" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.10.64 = STRING: "Time:12:57:28,Date:06/30/2006" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.10.65 = STRING: "Time:12:57:32,Date:06/30/2006" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.10.66 = STRING: "Time:12:57:33,Date:06/30/2006" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.10.67 = STRING: "Time:12:57:33,Date:06/30/2006" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.10.68 = STRING: "Time:14:34:26,Date:06/30/2006" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.10.69 = STRING: "Time:14:34:26,Date:06/30/2006" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.10.70 = STRING: "Time:12:55:25,Date:07/19/2006" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.10.71 = STRING: "Time:12:55:25,Date:07/19/2006" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.10.72 = STRING: "Time:12:59:24,Date:07/19/2006" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.10.73 = STRING: "Time:12:59:24,Date:07/19/2006" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.10.74 = STRING: "Time:09:16:37,Date:07/26/2006" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.10.75 = STRING: "Time:00:00:00,Date:01/01/1990" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.10.76 = STRING: "Time:00:00:00,Date:01/01/1990" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.10.77 = STRING: "Time:00:00:00,Date:01/01/1990" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.10.78 = STRING: "Time:00:00:00,Date:01/01/1990" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.10.79 = STRING: "Time:00:00:00,Date:01/01/1990" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.10.80 = STRING: "Time:00:00:00,Date:01/01/1990" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.10.81 = STRING: "Time:00:00:00,Date:01/01/1990" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.10.82 = STRING: "Time:00:00:00,Date:01/01/1990" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.10.83 = STRING: "Time:00:00:00,Date:01/01/1990" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.10.84 = STRING: "Time:00:00:00,Date:01/01/1990" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.10.85 = STRING: "Time:00:00:00,Date:01/01/1990" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.10.86 = STRING: "Time:00:00:00,Date:01/01/1990" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.10.87 = STRING: "Time:00:00:00,Date:01/01/1990" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.10.88 = STRING: "Time:00:00:00,Date:01/01/1990" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.10.89 = STRING: "Time:00:00:00,Date:01/01/1990" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.10.90 = STRING: "Time:00:00:00,Date:01/01/1990" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.10.91 = STRING: "Time:00:00:00,Date:01/01/1990" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.10.92 = STRING: "Time:00:00:00,Date:01/01/1990" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.10.93 = STRING: "Time:00:00:00,Date:01/01/1990" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.10.94 = STRING: "Time:00:00:00,Date:01/01/1990" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.10.95 = STRING: "Time:00:00:00,Date:01/01/1990" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.10.96 = STRING: "Time:00:00:00,Date:01/01/1990" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.10.97 = STRING: "Time:00:00:00,Date:01/01/1990" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.10.98 = STRING: "Time:00:00:00,Date:01/01/1990" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.10.99 = STRING: "Time:00:00:00,Date:01/01/1990" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.10.100 = STRING: "Time:00:00:00,Date:01/01/1990" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.10.101 = STRING: "Time:00:00:00,Date:01/01/1990" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.10.102 = STRING: "Time:00:00:00,Date:01/01/1990" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.10.103 = STRING: "Time:00:00:00,Date:01/01/1990" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.10.104 = STRING: "Time:00:00:00,Date:01/01/1990" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.10.105 = STRING: "Time:00:00:00,Date:01/01/1990" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.10.106 = STRING: "Time:00:00:00,Date:01/01/1990" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.10.107 = STRING: "Time:00:00:00,Date:01/01/1990" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.10.108 = STRING: "Time:00:00:00,Date:01/01/1990" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.10.109 = STRING: "Time:00:00:00,Date:01/01/1990" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.10.110 = STRING: "Time:00:00:00,Date:01/01/1990" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.10.111 = STRING: "Time:00:00:00,Date:01/01/1990" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.10.112 = STRING: "Time:00:00:00,Date:01/01/1990" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.10.113 = STRING: "Time:00:00:00,Date:01/01/1990" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.10.114 = STRING: "Time:00:00:00,Date:01/01/1990" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.10.115 = STRING: "Time:00:00:00,Date:01/01/1990" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.10.116 = STRING: "Time:00:00:00,Date:01/01/1990" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.10.117 = STRING: "Time:00:00:00,Date:01/01/1990" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.10.118 = STRING: "Time:00:00:00,Date:01/01/1990" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.10.119 = STRING: "Time:00:00:00,Date:01/01/1990" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.10.120 = STRING: "Time:00:00:00,Date:01/01/1990" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.10.121 = STRING: "Time:00:00:00,Date:01/01/1990" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.10.122 = STRING: "Time:00:00:00,Date:01/01/1990" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.10.123 = STRING: "Time:00:00:00,Date:01/01/1990" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.10.124 = STRING: "Time:00:00:00,Date:01/01/1990" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.10.125 = STRING: "Time:00:00:00,Date:01/01/1990" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.10.126 = STRING: "Time:00:00:00,Date:01/01/1990" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.10.127 = STRING: "Time:00:00:00,Date:01/01/1990" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.10.128 = STRING: "Time:00:00:00,Date:01/01/1990" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.10.129 = STRING: "Time:00:00:00,Date:01/01/1990" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.10.130 = STRING: "Time:00:00:00,Date:01/01/1990" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.10.131 = STRING: "Time:00:00:00,Date:01/01/1990" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.10.132 = STRING: "Time:00:00:00,Date:01/01/1990" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.10.133 = STRING: "Time:00:00:00,Date:01/01/1990" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.10.134 = STRING: "Time:00:00:00,Date:01/01/1990" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.10.135 = STRING: "Time:00:00:00,Date:01/01/1990" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.10.136 = STRING: "Time:00:00:00,Date:01/01/1990" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.10.137 = STRING: "Time:00:00:00,Date:01/01/1990" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.10.138 = STRING: "Time:00:00:00,Date:01/01/1990" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.10.139 = STRING: "Time:00:00:00,Date:01/01/1990" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.10.140 = STRING: "Time:00:00:00,Date:01/01/1990" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.10.141 = STRING: "Time:00:00:00,Date:01/01/1990" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.10.142 = STRING: "Time:00:00:00,Date:01/01/1990" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.10.143 = STRING: "Time:00:00:00,Date:01/01/1990" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.10.144 = STRING: "Time:00:00:00,Date:01/01/1990" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.10.145 = STRING: "Time:00:00:00,Date:01/01/1990" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.10.146 = STRING: "Time:00:00:00,Date:01/01/1990" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.10.147 = STRING: "Time:00:00:00,Date:01/01/1990" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.10.148 = STRING: "Time:00:00:00,Date:01/01/1990" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.10.149 = STRING: "Time:00:00:00,Date:01/01/1990" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.10.150 = STRING: "Time:00:00:00,Date:01/01/1990" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.10.151 = STRING: "Time:00:00:00,Date:01/01/1990" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.10.152 = STRING: "Time:00:00:00,Date:01/01/1990" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.10.153 = STRING: "Time:00:00:00,Date:01/01/1990" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.10.154 = STRING: "Time:00:00:00,Date:01/01/1990" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.10.155 = STRING: "Time:00:00:00,Date:01/01/1990" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.10.156 = STRING: "Time:00:00:00,Date:01/01/1990" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.10.157 = STRING: "Time:00:00:00,Date:01/01/1990" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.10.158 = STRING: "Time:00:00:00,Date:01/01/1990" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.10.159 = STRING: "Time:00:00:00,Date:01/01/1990" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.10.160 = STRING: "Time:00:00:00,Date:01/01/1990" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.10.161 = STRING: "Time:00:00:00,Date:01/01/1990" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.10.162 = STRING: "Time:00:00:00,Date:01/01/1990" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.10.163 = STRING: "Time:00:00:00,Date:01/01/1990" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.10.164 = STRING: "Time:00:00:00,Date:01/01/1990" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.10.165 = STRING: "Time:00:00:00,Date:01/01/1990" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.10.166 = STRING: "Time:00:00:00,Date:01/01/1990" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.10.167 = STRING: "Time:00:00:00,Date:01/01/1990" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.10.168 = STRING: "Time:00:00:00,Date:01/01/1990" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.10.169 = STRING: "Time:00:00:00,Date:01/01/1990" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.10.170 = STRING: "Time:00:00:00,Date:01/01/1990" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.10.171 = STRING: "Time:00:00:00,Date:01/01/1990" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.10.172 = STRING: "Time:00:00:00,Date:01/01/1990" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.10.173 = STRING: "Time:00:00:00,Date:01/01/1990" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.10.174 = STRING: "Time:00:00:00,Date:01/01/1990" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.10.175 = STRING: "Time:00:00:00,Date:01/01/1990" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.10.176 = STRING: "Time:00:00:00,Date:01/01/1990" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.10.177 = STRING: "Time:00:00:00,Date:01/01/1990" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.10.178 = STRING: "Time:00:00:00,Date:01/01/1990" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.10.179 = STRING: "Time:00:00:00,Date:01/01/1990" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.10.180 = STRING: "Time:00:00:00,Date:01/01/1990" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.10.181 = STRING: "Time:00:00:00,Date:01/01/1990" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.10.182 = STRING: "Time:00:00:00,Date:01/01/1990" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.10.183 = STRING: "Time:00:00:00,Date:01/01/1990" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.10.184 = STRING: "Time:00:00:00,Date:01/01/1990" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.10.185 = STRING: "Time:00:00:00,Date:01/01/1990" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.10.186 = STRING: "Time:00:00:00,Date:01/01/1990" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.10.187 = STRING: "Time:00:00:00,Date:01/01/1990" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.10.188 = STRING: "Time:00:00:00,Date:01/01/1990" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.10.189 = STRING: "Time:00:00:00,Date:01/01/1990" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.10.190 = STRING: "Time:00:00:00,Date:01/01/1990" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.10.191 = STRING: "Time:00:00:00,Date:01/01/1990" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.10.192 = STRING: "Time:00:00:00,Date:01/01/1990" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.10.193 = STRING: "Time:00:00:00,Date:01/01/1990" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.10.194 = STRING: "Time:00:00:00,Date:01/01/1990" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.10.195 = STRING: "Time:00:00:00,Date:01/01/1990" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.10.196 = STRING: "Time:00:00:00,Date:01/01/1990" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.10.197 = STRING: "Time:00:00:00,Date:01/01/1990" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.10.198 = STRING: "Time:00:00:00,Date:01/01/1990" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.10.199 = STRING: "Time:00:00:00,Date:01/01/1990" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.10.200 = STRING: "Time:00:00:00,Date:01/01/1990" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.10.201 = STRING: "Time:00:00:00,Date:01/01/1990" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.10.202 = STRING: "Time:00:00:00,Date:01/01/1990" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.10.203 = STRING: "Time:00:00:00,Date:01/01/1990" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.10.204 = STRING: "Time:00:00:00,Date:01/01/1990" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.10.205 = STRING: "Time:00:00:00,Date:01/01/1990" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.10.206 = STRING: "Time:00:00:00,Date:01/01/1990" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.10.207 = STRING: "Time:00:00:00,Date:01/01/1990" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.10.208 = STRING: "Time:00:00:00,Date:01/01/1990" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.10.209 = STRING: "Time:00:00:00,Date:01/01/1990" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.10.210 = STRING: "Time:00:00:00,Date:01/01/1990" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.10.211 = STRING: "Time:00:00:00,Date:01/01/1990" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.10.212 = STRING: "Time:00:00:00,Date:01/01/1990" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.10.213 = STRING: "Time:00:00:00,Date:01/01/1990" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.10.214 = STRING: "Time:00:00:00,Date:01/01/1990" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.10.215 = STRING: "Time:00:00:00,Date:01/01/1990" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.10.216 = STRING: "Time:00:00:00,Date:01/01/1990" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.10.217 = STRING: "Time:00:00:00,Date:01/01/1990" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.10.218 = STRING: "Time:00:00:00,Date:01/01/1990" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.10.219 = STRING: "Time:00:00:00,Date:01/01/1990" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.10.220 = STRING: "Time:00:00:00,Date:01/01/1990" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.10.221 = STRING: "Time:00:00:00,Date:01/01/1990" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.10.222 = STRING: "Time:00:00:00,Date:01/01/1990" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.10.223 = STRING: "Time:00:00:00,Date:01/01/1990" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.10.224 = STRING: "Time:00:00:00,Date:01/01/1990" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.10.225 = STRING: "Time:00:00:00,Date:01/01/1990" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.10.226 = STRING: "Time:00:00:00,Date:01/01/1990" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.10.227 = STRING: "Time:00:00:00,Date:01/01/1990" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.10.228 = STRING: "Time:00:00:00,Date:01/01/1990" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.10.229 = STRING: "Time:00:00:00,Date:01/01/1990" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.10.230 = STRING: "Time:00:00:00,Date:01/01/1990" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.10.231 = STRING: "Time:00:00:00,Date:01/01/1990" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.10.232 = STRING: "Time:00:00:00,Date:01/01/1990" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.10.233 = STRING: "Time:00:00:00,Date:01/01/1990" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.10.234 = STRING: "Time:00:00:00,Date:01/01/1990" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.10.235 = STRING: "Time:00:00:00,Date:01/01/1990" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.10.236 = STRING: "Time:00:00:00,Date:01/01/1990" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.10.237 = STRING: "Time:00:00:00,Date:01/01/1990" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.10.238 = STRING: "Time:00:00:00,Date:01/01/1990" .1.3.6.1.4.1.2.3.51.2.2.21.22.1.10.239 = STRING: "Time:00:00:00,Date:01/01/1990" .1.3.6.1.4.1.2.3.51.2.3.4.2.1.1.1 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.3.4.2.1.2.1 = STRING: "Severity:INFO Source:SERVPROC Name:BCT-81 Date:08/02/06 Time:09:49:27 Text:System log cleared by user user01." .1.3.6.1.4.1.2.3.51.2.3.4.3.0 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.3.4.4.0 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.3.4.5.0 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.4.1.1.3.0 = INTEGER: 5 .1.3.6.1.4.1.2.3.51.2.4.1.1.4.0 = INTEGER: 5 .1.3.6.1.4.1.2.3.51.2.4.1.1.5.0 = INTEGER: 5 .1.3.6.1.4.1.2.3.51.2.4.1.1.6.0 = INTEGER: 2 .1.3.6.1.4.1.2.3.51.2.4.1.1.7.0 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.3.1.1.1.1 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.4.1.3.1.1.1.2 = INTEGER: 2 .1.3.6.1.4.1.2.3.51.2.4.1.3.1.1.1.3 = INTEGER: 3 .1.3.6.1.4.1.2.3.51.2.4.1.3.1.1.1.4 = INTEGER: 4 .1.3.6.1.4.1.2.3.51.2.4.1.3.1.1.1.5 = INTEGER: 5 .1.3.6.1.4.1.2.3.51.2.4.1.3.1.1.1.6 = INTEGER: 6 .1.3.6.1.4.1.2.3.51.2.4.1.3.1.1.1.7 = INTEGER: 7 .1.3.6.1.4.1.2.3.51.2.4.1.3.1.1.1.8 = INTEGER: 8 .1.3.6.1.4.1.2.3.51.2.4.1.3.1.1.1.9 = INTEGER: 9 .1.3.6.1.4.1.2.3.51.2.4.1.3.1.1.1.10 = INTEGER: 10 .1.3.6.1.4.1.2.3.51.2.4.1.3.1.1.1.11 = INTEGER: 11 .1.3.6.1.4.1.2.3.51.2.4.1.3.1.1.1.12 = INTEGER: 12 .1.3.6.1.4.1.2.3.51.2.4.1.3.1.1.2.1 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.3.1.1.2.2 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.3.1.1.2.3 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.3.1.1.2.4 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.3.1.1.2.5 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.3.1.1.2.6 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.3.1.1.2.7 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.3.1.1.2.8 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.3.1.1.2.9 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.3.1.1.2.10 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.3.1.1.2.11 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.3.1.1.2.12 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.3.1.1.3.1 = STRING: "0.0.0.0" .1.3.6.1.4.1.2.3.51.2.4.1.3.1.1.3.2 = STRING: "0.0.0.0" .1.3.6.1.4.1.2.3.51.2.4.1.3.1.1.3.3 = STRING: "0.0.0.0" .1.3.6.1.4.1.2.3.51.2.4.1.3.1.1.3.4 = STRING: "0.0.0.0" .1.3.6.1.4.1.2.3.51.2.4.1.3.1.1.3.5 = STRING: "0.0.0.0" .1.3.6.1.4.1.2.3.51.2.4.1.3.1.1.3.6 = STRING: "0.0.0.0" .1.3.6.1.4.1.2.3.51.2.4.1.3.1.1.3.7 = STRING: "0.0.0.0" .1.3.6.1.4.1.2.3.51.2.4.1.3.1.1.3.8 = STRING: "0.0.0.0" .1.3.6.1.4.1.2.3.51.2.4.1.3.1.1.3.9 = STRING: "0.0.0.0" .1.3.6.1.4.1.2.3.51.2.4.1.3.1.1.3.10 = STRING: "0.0.0.0" .1.3.6.1.4.1.2.3.51.2.4.1.3.1.1.3.11 = STRING: "0.0.0.0" .1.3.6.1.4.1.2.3.51.2.4.1.3.1.1.3.12 = STRING: "0.0.0.0" .1.3.6.1.4.1.2.3.51.2.4.1.3.1.1.4.1 = STRING: "(No description)" .1.3.6.1.4.1.2.3.51.2.4.1.3.1.1.4.2 = STRING: "(No description)" .1.3.6.1.4.1.2.3.51.2.4.1.3.1.1.4.3 = STRING: "(No description)" .1.3.6.1.4.1.2.3.51.2.4.1.3.1.1.4.4 = STRING: "(No description)" .1.3.6.1.4.1.2.3.51.2.4.1.3.1.1.4.5 = STRING: "(No description)" .1.3.6.1.4.1.2.3.51.2.4.1.3.1.1.4.6 = STRING: "(No description)" .1.3.6.1.4.1.2.3.51.2.4.1.3.1.1.4.7 = STRING: "(No description)" .1.3.6.1.4.1.2.3.51.2.4.1.3.1.1.4.8 = STRING: "(No description)" .1.3.6.1.4.1.2.3.51.2.4.1.3.1.1.4.9 = STRING: "(No description)" .1.3.6.1.4.1.2.3.51.2.4.1.3.1.1.4.10 = STRING: "(No description)" .1.3.6.1.4.1.2.3.51.2.4.1.3.1.1.4.11 = STRING: "(No description)" .1.3.6.1.4.1.2.3.51.2.4.1.3.1.1.4.12 = STRING: "(No description)" .1.3.6.1.4.1.2.3.51.2.4.1.3.1.1.5.1 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.3.1.1.5.2 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.3.1.1.5.3 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.3.1.1.5.4 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.3.1.1.5.5 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.3.1.1.5.6 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.3.1.1.5.7 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.3.1.1.5.8 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.3.1.1.5.9 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.3.1.1.5.10 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.3.1.1.5.11 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.3.1.1.5.12 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.3.1.1.9.1 = STRING: "0.0.0.0" .1.3.6.1.4.1.2.3.51.2.4.1.3.1.1.9.2 = STRING: "0.0.0.0" .1.3.6.1.4.1.2.3.51.2.4.1.3.1.1.9.3 = STRING: "0.0.0.0" .1.3.6.1.4.1.2.3.51.2.4.1.3.1.1.9.4 = STRING: "0.0.0.0" .1.3.6.1.4.1.2.3.51.2.4.1.3.1.1.9.5 = STRING: "0.0.0.0" .1.3.6.1.4.1.2.3.51.2.4.1.3.1.1.9.6 = STRING: "0.0.0.0" .1.3.6.1.4.1.2.3.51.2.4.1.3.1.1.9.7 = STRING: "0.0.0.0" .1.3.6.1.4.1.2.3.51.2.4.1.3.1.1.9.8 = STRING: "0.0.0.0" .1.3.6.1.4.1.2.3.51.2.4.1.3.1.1.9.9 = STRING: "0.0.0.0" .1.3.6.1.4.1.2.3.51.2.4.1.3.1.1.9.10 = STRING: "0.0.0.0" .1.3.6.1.4.1.2.3.51.2.4.1.3.1.1.9.11 = STRING: "0.0.0.0" .1.3.6.1.4.1.2.3.51.2.4.1.3.1.1.9.12 = STRING: "0.0.0.0" .1.3.6.1.4.1.2.3.51.2.4.1.3.1.1.13.1 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.4.1.3.1.1.13.2 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.4.1.3.1.1.13.3 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.4.1.3.1.1.13.4 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.4.1.3.1.1.13.5 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.4.1.3.1.1.13.6 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.4.1.3.1.1.13.7 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.4.1.3.1.1.13.8 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.4.1.3.1.1.13.9 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.4.1.3.1.1.13.10 = INTEGER: 43 .1.3.6.1.4.1.2.3.51.2.4.1.3.1.1.13.11 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.4.1.3.1.1.13.12 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.4.1.3.30.0 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.4.1.1.1.1 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.4.1.4.1.1.1.2 = INTEGER: 2 .1.3.6.1.4.1.2.3.51.2.4.1.4.1.1.1.3 = INTEGER: 3 .1.3.6.1.4.1.2.3.51.2.4.1.4.1.1.1.4 = INTEGER: 4 .1.3.6.1.4.1.2.3.51.2.4.1.4.1.1.1.5 = INTEGER: 5 .1.3.6.1.4.1.2.3.51.2.4.1.4.1.1.1.6 = INTEGER: 6 .1.3.6.1.4.1.2.3.51.2.4.1.4.1.1.1.7 = INTEGER: 7 .1.3.6.1.4.1.2.3.51.2.4.1.4.1.1.1.8 = INTEGER: 8 .1.3.6.1.4.1.2.3.51.2.4.1.4.1.1.1.9 = INTEGER: 9 .1.3.6.1.4.1.2.3.51.2.4.1.4.1.1.1.10 = INTEGER: 10 .1.3.6.1.4.1.2.3.51.2.4.1.4.1.1.1.11 = INTEGER: 11 .1.3.6.1.4.1.2.3.51.2.4.1.4.1.1.1.12 = INTEGER: 12 .1.3.6.1.4.1.2.3.51.2.4.1.4.1.1.2.1 = STRING: "USERID" .1.3.6.1.4.1.2.3.51.2.4.1.4.1.1.2.2 = STRING: "user01" .1.3.6.1.4.1.2.3.51.2.4.1.4.1.1.2.3 = STRING: "user02" .1.3.6.1.4.1.2.3.51.2.4.1.4.1.1.2.4 = STRING: "user03" .1.3.6.1.4.1.2.3.51.2.4.1.4.1.1.2.5 = STRING: "user123" .1.3.6.1.4.1.2.3.51.2.4.1.4.1.1.2.6 = STRING: "(Not configured)" .1.3.6.1.4.1.2.3.51.2.4.1.4.1.1.2.7 = STRING: "(Not configured)" .1.3.6.1.4.1.2.3.51.2.4.1.4.1.1.2.8 = STRING: "(Not configured)" .1.3.6.1.4.1.2.3.51.2.4.1.4.1.1.2.9 = STRING: "(Not configured)" .1.3.6.1.4.1.2.3.51.2.4.1.4.1.1.2.10 = STRING: "(Not configured)" .1.3.6.1.4.1.2.3.51.2.4.1.4.1.1.2.11 = STRING: "(Not configured)" .1.3.6.1.4.1.2.3.51.2.4.1.4.1.1.2.12 = STRING: "user22" .1.3.6.1.4.1.2.3.51.2.4.1.4.1.1.3.1 = "" .1.3.6.1.4.1.2.3.51.2.4.1.4.1.1.3.2 = "" .1.3.6.1.4.1.2.3.51.2.4.1.4.1.1.3.3 = "" .1.3.6.1.4.1.2.3.51.2.4.1.4.1.1.3.4 = "" .1.3.6.1.4.1.2.3.51.2.4.1.4.1.1.3.5 = "" .1.3.6.1.4.1.2.3.51.2.4.1.4.1.1.3.6 = "" .1.3.6.1.4.1.2.3.51.2.4.1.4.1.1.3.7 = "" .1.3.6.1.4.1.2.3.51.2.4.1.4.1.1.3.8 = "" .1.3.6.1.4.1.2.3.51.2.4.1.4.1.1.3.9 = "" .1.3.6.1.4.1.2.3.51.2.4.1.4.1.1.3.10 = "" .1.3.6.1.4.1.2.3.51.2.4.1.4.1.1.3.11 = "" .1.3.6.1.4.1.2.3.51.2.4.1.4.1.1.3.12 = "" .1.3.6.1.4.1.2.3.51.2.4.1.4.1.1.5.1 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.4.1.1.5.2 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.4.1.1.5.3 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.4.1.1.5.4 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.4.1.1.5.5 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.4.1.4.1.1.5.6 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.4.1.4.1.1.5.7 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.4.1.4.1.1.5.8 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.4.1.4.1.1.5.9 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.4.1.4.1.1.5.10 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.4.1.4.1.1.5.11 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.4.1.4.1.1.5.12 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.4.1.1.7.1 = STRING: "VV" .1.3.6.1.4.1.2.3.51.2.4.1.4.1.1.7.2 = STRING: "aH" .1.3.6.1.4.1.2.3.51.2.4.1.4.1.1.7.3 = STRING: "Y2" .1.3.6.1.4.1.2.3.51.2.4.1.4.1.1.7.4 = STRING: "aH" .1.3.6.1.4.1.2.3.51.2.4.1.4.1.1.7.5 = STRING: "dX" .1.3.6.1.4.1.2.3.51.2.4.1.4.1.1.7.6 = STRING: "(Not configured)" .1.3.6.1.4.1.2.3.51.2.4.1.4.1.1.7.7 = STRING: "(Not configured)" .1.3.6.1.4.1.2.3.51.2.4.1.4.1.1.7.8 = STRING: "(Not configured)" .1.3.6.1.4.1.2.3.51.2.4.1.4.1.1.7.9 = STRING: "(Not configured)" .1.3.6.1.4.1.2.3.51.2.4.1.4.1.1.7.10 = STRING: "(Not configured)" .1.3.6.1.4.1.2.3.51.2.4.1.4.1.1.7.11 = STRING: "(Not configured)" .1.3.6.1.4.1.2.3.51.2.4.1.4.1.1.7.12 = STRING: "a2" .1.3.6.1.4.1.2.3.51.2.4.1.4.2.1.1.1 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.4.1.4.2.1.1.2 = INTEGER: 2 .1.3.6.1.4.1.2.3.51.2.4.1.4.2.1.1.3 = INTEGER: 3 .1.3.6.1.4.1.2.3.51.2.4.1.4.2.1.1.4 = INTEGER: 4 .1.3.6.1.4.1.2.3.51.2.4.1.4.2.1.1.5 = INTEGER: 5 .1.3.6.1.4.1.2.3.51.2.4.1.4.2.1.1.6 = INTEGER: 6 .1.3.6.1.4.1.2.3.51.2.4.1.4.2.1.1.7 = INTEGER: 7 .1.3.6.1.4.1.2.3.51.2.4.1.4.2.1.1.8 = INTEGER: 8 .1.3.6.1.4.1.2.3.51.2.4.1.4.2.1.1.9 = INTEGER: 9 .1.3.6.1.4.1.2.3.51.2.4.1.4.2.1.1.10 = INTEGER: 10 .1.3.6.1.4.1.2.3.51.2.4.1.4.2.1.1.11 = INTEGER: 11 .1.3.6.1.4.1.2.3.51.2.4.1.4.2.1.1.12 = INTEGER: 12 .1.3.6.1.4.1.2.3.51.2.4.1.4.2.1.2.1 = STRING: "USERID" .1.3.6.1.4.1.2.3.51.2.4.1.4.2.1.2.2 = STRING: "user01" .1.3.6.1.4.1.2.3.51.2.4.1.4.2.1.2.3 = STRING: "user02" .1.3.6.1.4.1.2.3.51.2.4.1.4.2.1.2.4 = STRING: "user03" .1.3.6.1.4.1.2.3.51.2.4.1.4.2.1.2.5 = STRING: "user123" .1.3.6.1.4.1.2.3.51.2.4.1.4.2.1.2.6 = "" .1.3.6.1.4.1.2.3.51.2.4.1.4.2.1.2.7 = "" .1.3.6.1.4.1.2.3.51.2.4.1.4.2.1.2.8 = "" .1.3.6.1.4.1.2.3.51.2.4.1.4.2.1.2.9 = "" .1.3.6.1.4.1.2.3.51.2.4.1.4.2.1.2.10 = "" .1.3.6.1.4.1.2.3.51.2.4.1.4.2.1.2.11 = "" .1.3.6.1.4.1.2.3.51.2.4.1.4.2.1.2.12 = STRING: "user22" .1.3.6.1.4.1.2.3.51.2.4.1.4.2.1.3.1 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.4.1.4.2.1.3.2 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.4.1.4.2.1.3.3 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.4.1.4.2.1.3.4 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.4.1.4.2.1.3.5 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.4.2.1.3.6 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.4.2.1.3.7 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.4.2.1.3.8 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.4.2.1.3.9 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.4.2.1.3.10 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.4.2.1.3.11 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.4.2.1.3.12 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.4.1.4.2.1.4.1 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.4.2.1.4.2 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.4.2.1.4.3 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.4.2.1.4.4 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.4.2.1.4.5 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.4.1.4.2.1.4.6 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.4.1.4.2.1.4.7 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.4.1.4.2.1.4.8 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.4.1.4.2.1.4.9 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.4.1.4.2.1.4.10 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.4.1.4.2.1.4.11 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.4.1.4.2.1.4.12 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.4.2.1.5.1 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.4.2.1.5.2 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.4.2.1.5.3 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.4.2.1.5.4 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.4.2.1.5.5 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.4.2.1.5.6 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.4.2.1.5.7 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.4.2.1.5.8 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.4.2.1.5.9 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.4.2.1.5.10 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.4.2.1.5.11 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.4.2.1.5.12 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.4.2.1.6.1 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.4.2.1.6.2 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.4.2.1.6.3 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.4.2.1.6.4 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.4.2.1.6.5 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.4.2.1.6.6 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.4.2.1.6.7 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.4.2.1.6.8 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.4.2.1.6.9 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.4.2.1.6.10 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.4.2.1.6.11 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.4.2.1.6.12 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.4.2.1.7.1 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.4.2.1.7.2 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.4.2.1.7.3 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.4.2.1.7.4 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.4.2.1.7.5 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.4.2.1.7.6 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.4.2.1.7.7 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.4.2.1.7.8 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.4.2.1.7.9 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.4.2.1.7.10 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.4.2.1.7.11 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.4.2.1.7.12 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.4.2.1.8.1 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.4.2.1.8.2 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.4.2.1.8.3 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.4.2.1.8.4 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.4.2.1.8.5 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.4.2.1.8.6 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.4.2.1.8.7 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.4.2.1.8.8 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.4.2.1.8.9 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.4.2.1.8.10 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.4.2.1.8.11 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.4.2.1.8.12 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.4.2.1.9.1 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.4.2.1.9.2 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.4.2.1.9.3 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.4.2.1.9.4 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.4.2.1.9.5 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.4.2.1.9.6 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.4.2.1.9.7 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.4.2.1.9.8 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.4.2.1.9.9 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.4.2.1.9.10 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.4.2.1.9.11 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.4.2.1.9.12 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.4.2.1.10.1 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.4.2.1.10.2 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.4.2.1.10.3 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.4.2.1.10.4 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.4.2.1.10.5 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.4.2.1.10.6 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.4.2.1.10.7 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.4.2.1.10.8 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.4.2.1.10.9 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.4.2.1.10.10 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.4.2.1.10.11 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.4.2.1.10.12 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.4.2.1.11.1 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.4.2.1.11.2 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.4.2.1.11.3 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.4.2.1.11.4 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.4.2.1.11.5 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.4.2.1.11.6 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.4.2.1.11.7 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.4.2.1.11.8 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.4.2.1.11.9 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.4.2.1.11.10 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.4.2.1.11.11 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.4.2.1.11.12 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.4.2.1.12.1 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.4.2.1.12.2 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.4.2.1.12.3 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.4.2.1.12.4 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.4.2.1.12.5 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.4.2.1.12.6 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.4.2.1.12.7 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.4.2.1.12.8 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.4.2.1.12.9 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.4.2.1.12.10 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.4.2.1.12.11 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.4.2.1.12.12 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.4.3.1.1.1 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.4.1.4.3.1.1.2 = INTEGER: 2 .1.3.6.1.4.1.2.3.51.2.4.1.4.3.1.1.3 = INTEGER: 3 .1.3.6.1.4.1.2.3.51.2.4.1.4.3.1.1.4 = INTEGER: 4 .1.3.6.1.4.1.2.3.51.2.4.1.4.3.1.1.5 = INTEGER: 5 .1.3.6.1.4.1.2.3.51.2.4.1.4.3.1.1.6 = INTEGER: 6 .1.3.6.1.4.1.2.3.51.2.4.1.4.3.1.1.7 = INTEGER: 7 .1.3.6.1.4.1.2.3.51.2.4.1.4.3.1.1.8 = INTEGER: 8 .1.3.6.1.4.1.2.3.51.2.4.1.4.3.1.1.9 = INTEGER: 9 .1.3.6.1.4.1.2.3.51.2.4.1.4.3.1.1.10 = INTEGER: 10 .1.3.6.1.4.1.2.3.51.2.4.1.4.3.1.1.11 = INTEGER: 11 .1.3.6.1.4.1.2.3.51.2.4.1.4.3.1.1.12 = INTEGER: 12 .1.3.6.1.4.1.2.3.51.2.4.1.4.3.1.2.1 = STRING: "USERID" .1.3.6.1.4.1.2.3.51.2.4.1.4.3.1.2.2 = STRING: "user01" .1.3.6.1.4.1.2.3.51.2.4.1.4.3.1.2.3 = STRING: "user02" .1.3.6.1.4.1.2.3.51.2.4.1.4.3.1.2.4 = STRING: "user03" .1.3.6.1.4.1.2.3.51.2.4.1.4.3.1.2.5 = STRING: "user123" .1.3.6.1.4.1.2.3.51.2.4.1.4.3.1.2.6 = "" .1.3.6.1.4.1.2.3.51.2.4.1.4.3.1.2.7 = "" .1.3.6.1.4.1.2.3.51.2.4.1.4.3.1.2.8 = "" .1.3.6.1.4.1.2.3.51.2.4.1.4.3.1.2.9 = "" .1.3.6.1.4.1.2.3.51.2.4.1.4.3.1.2.10 = "" .1.3.6.1.4.1.2.3.51.2.4.1.4.3.1.2.11 = "" .1.3.6.1.4.1.2.3.51.2.4.1.4.3.1.2.12 = STRING: "user22" .1.3.6.1.4.1.2.3.51.2.4.1.4.3.1.3.1 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.4.1.4.3.1.3.2 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.4.1.4.3.1.3.3 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.4.1.4.3.1.3.4 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.4.1.4.3.1.3.5 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.4.3.1.3.6 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.4.3.1.3.7 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.4.3.1.3.8 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.4.3.1.3.9 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.4.3.1.3.10 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.4.3.1.3.11 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.4.3.1.3.12 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.4.1.4.3.1.4.1 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.4.3.1.4.2 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.4.3.1.4.3 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.4.3.1.4.4 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.4.3.1.4.5 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.4.1.4.3.1.4.6 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.4.1.4.3.1.4.7 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.4.1.4.3.1.4.8 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.4.1.4.3.1.4.9 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.4.1.4.3.1.4.10 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.4.1.4.3.1.4.11 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.4.1.4.3.1.4.12 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.4.3.1.5.1 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.4.3.1.5.2 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.4.3.1.5.3 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.4.3.1.5.4 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.4.3.1.5.5 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.4.3.1.5.6 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.4.3.1.5.7 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.4.3.1.5.8 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.4.3.1.5.9 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.4.3.1.5.10 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.4.3.1.5.11 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.4.3.1.5.12 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.4.3.1.6.1 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.4.3.1.6.2 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.4.3.1.6.3 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.4.3.1.6.4 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.4.3.1.6.5 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.4.3.1.6.6 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.4.3.1.6.7 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.4.3.1.6.8 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.4.3.1.6.9 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.4.3.1.6.10 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.4.3.1.6.11 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.4.3.1.6.12 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.4.3.1.7.1 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.4.3.1.7.2 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.4.3.1.7.3 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.4.3.1.7.4 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.4.3.1.7.5 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.4.3.1.7.6 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.4.3.1.7.7 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.4.3.1.7.8 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.4.3.1.7.9 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.4.3.1.7.10 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.4.3.1.7.11 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.4.3.1.7.12 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.4.3.1.8.1 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.4.3.1.8.2 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.4.3.1.8.3 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.4.3.1.8.4 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.4.3.1.8.5 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.4.3.1.8.6 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.4.3.1.8.7 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.4.3.1.8.8 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.4.3.1.8.9 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.4.3.1.8.10 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.4.3.1.8.11 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.4.3.1.8.12 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.4.3.1.9.1 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.4.3.1.9.2 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.4.3.1.9.3 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.4.3.1.9.4 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.4.3.1.9.5 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.4.3.1.9.6 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.4.3.1.9.7 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.4.3.1.9.8 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.4.3.1.9.9 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.4.3.1.9.10 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.4.3.1.9.11 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.4.3.1.9.12 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.4.3.1.10.1 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.4.3.1.10.2 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.4.3.1.10.3 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.4.3.1.10.4 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.4.3.1.10.5 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.4.3.1.10.6 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.4.3.1.10.7 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.4.3.1.10.8 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.4.3.1.10.9 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.4.3.1.10.10 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.4.3.1.10.11 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.4.3.1.10.12 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.4.3.1.11.1 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.4.3.1.11.2 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.4.3.1.11.3 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.4.3.1.11.4 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.4.3.1.11.5 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.4.3.1.11.6 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.4.3.1.11.7 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.4.3.1.11.8 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.4.3.1.11.9 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.4.3.1.11.10 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.4.3.1.11.11 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.4.3.1.11.12 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.4.3.1.12.1 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.4.3.1.12.2 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.4.3.1.12.3 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.4.3.1.12.4 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.4.3.1.12.5 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.4.3.1.12.6 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.4.3.1.12.7 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.4.3.1.12.8 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.4.3.1.12.9 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.4.3.1.12.10 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.4.3.1.12.11 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.4.3.1.12.12 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.4.3.1.13.1 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.4.3.1.13.2 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.4.3.1.13.3 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.4.3.1.13.4 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.4.3.1.13.5 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.4.3.1.13.6 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.4.3.1.13.7 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.4.3.1.13.8 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.4.3.1.13.9 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.4.3.1.13.10 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.4.3.1.13.11 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.4.3.1.13.12 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.4.3.1.14.1 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.4.3.1.14.2 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.4.3.1.14.3 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.4.3.1.14.4 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.4.3.1.14.5 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.4.3.1.14.6 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.4.3.1.14.7 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.4.3.1.14.8 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.4.3.1.14.9 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.4.3.1.14.10 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.4.3.1.14.11 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.4.3.1.14.12 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.4.3.1.15.1 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.4.3.1.15.2 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.4.3.1.15.3 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.4.3.1.15.4 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.4.3.1.15.5 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.4.3.1.15.6 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.4.3.1.15.7 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.4.3.1.15.8 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.4.3.1.15.9 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.4.3.1.15.10 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.4.3.1.15.11 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.4.3.1.15.12 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.4.3.1.16.1 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.4.3.1.16.2 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.4.3.1.16.3 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.4.3.1.16.4 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.4.3.1.16.5 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.4.3.1.16.6 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.4.3.1.16.7 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.4.3.1.16.8 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.4.3.1.16.9 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.4.3.1.16.10 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.4.3.1.16.11 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.4.3.1.16.12 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.4.4.1.1.1 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.4.1.4.4.1.1.2 = INTEGER: 2 .1.3.6.1.4.1.2.3.51.2.4.1.4.4.1.1.3 = INTEGER: 3 .1.3.6.1.4.1.2.3.51.2.4.1.4.4.1.1.4 = INTEGER: 4 .1.3.6.1.4.1.2.3.51.2.4.1.4.4.1.1.5 = INTEGER: 5 .1.3.6.1.4.1.2.3.51.2.4.1.4.4.1.1.6 = INTEGER: 6 .1.3.6.1.4.1.2.3.51.2.4.1.4.4.1.1.7 = INTEGER: 7 .1.3.6.1.4.1.2.3.51.2.4.1.4.4.1.1.8 = INTEGER: 8 .1.3.6.1.4.1.2.3.51.2.4.1.4.4.1.1.9 = INTEGER: 9 .1.3.6.1.4.1.2.3.51.2.4.1.4.4.1.1.10 = INTEGER: 10 .1.3.6.1.4.1.2.3.51.2.4.1.4.4.1.1.11 = INTEGER: 11 .1.3.6.1.4.1.2.3.51.2.4.1.4.4.1.1.12 = INTEGER: 12 .1.3.6.1.4.1.2.3.51.2.4.1.4.4.1.2.1 = STRING: "USERID" .1.3.6.1.4.1.2.3.51.2.4.1.4.4.1.2.2 = STRING: "user01" .1.3.6.1.4.1.2.3.51.2.4.1.4.4.1.2.3 = STRING: "user02" .1.3.6.1.4.1.2.3.51.2.4.1.4.4.1.2.4 = STRING: "user03" .1.3.6.1.4.1.2.3.51.2.4.1.4.4.1.2.5 = STRING: "user123" .1.3.6.1.4.1.2.3.51.2.4.1.4.4.1.2.6 = "" .1.3.6.1.4.1.2.3.51.2.4.1.4.4.1.2.7 = "" .1.3.6.1.4.1.2.3.51.2.4.1.4.4.1.2.8 = "" .1.3.6.1.4.1.2.3.51.2.4.1.4.4.1.2.9 = "" .1.3.6.1.4.1.2.3.51.2.4.1.4.4.1.2.10 = "" .1.3.6.1.4.1.2.3.51.2.4.1.4.4.1.2.11 = "" .1.3.6.1.4.1.2.3.51.2.4.1.4.4.1.2.12 = STRING: "user12" .1.3.6.1.4.1.2.3.51.2.4.1.4.4.1.3.1 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.4.1.4.4.1.3.2 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.4.1.4.4.1.3.3 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.4.1.4.4.1.3.4 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.4.1.4.4.1.3.5 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.4.4.1.3.6 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.4.1.4.4.1.3.7 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.4.1.4.4.1.3.8 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.4.1.4.4.1.3.9 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.4.1.4.4.1.3.10 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.4.1.4.4.1.3.11 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.4.1.4.4.1.3.12 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.4.1.4.4.1.4.1 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.4.1.4.4.1.4.2 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.4.1.4.4.1.4.3 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.4.1.4.4.1.4.4 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.4.1.4.4.1.4.5 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.4.4.1.4.6 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.4.1.4.4.1.4.7 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.4.1.4.4.1.4.8 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.4.1.4.4.1.4.9 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.4.1.4.4.1.4.10 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.4.1.4.4.1.4.11 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.4.1.4.4.1.4.12 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.4.1.4.4.1.5.1 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.4.1.4.4.1.5.2 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.4.1.4.4.1.5.3 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.4.1.4.4.1.5.4 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.4.1.4.4.1.5.5 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.4.4.1.5.6 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.4.1.4.4.1.5.7 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.4.1.4.4.1.5.8 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.4.1.4.4.1.5.9 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.4.1.4.4.1.5.10 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.4.1.4.4.1.5.11 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.4.1.4.4.1.5.12 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.4.1.4.4.1.6.1 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.4.1.4.4.1.6.2 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.4.1.4.4.1.6.3 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.4.1.4.4.1.6.4 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.4.1.4.4.1.6.5 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.4.4.1.6.6 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.4.1.4.4.1.6.7 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.4.1.4.4.1.6.8 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.4.1.4.4.1.6.9 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.4.1.4.4.1.6.10 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.4.1.4.4.1.6.11 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.4.1.4.4.1.6.12 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.4.1.4.4.1.7.1 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.4.1.4.4.1.7.2 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.4.1.4.4.1.7.3 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.4.1.4.4.1.7.4 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.4.1.4.4.1.7.5 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.4.4.1.7.6 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.4.1.4.4.1.7.7 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.4.1.4.4.1.7.8 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.4.1.4.4.1.7.9 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.4.1.4.4.1.7.10 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.4.1.4.4.1.7.11 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.4.1.4.4.1.7.12 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.4.1.4.4.1.8.1 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.4.1.4.4.1.8.2 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.4.1.4.4.1.8.3 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.4.1.4.4.1.8.4 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.4.1.4.4.1.8.5 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.4.4.1.8.6 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.4.1.4.4.1.8.7 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.4.1.4.4.1.8.8 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.4.1.4.4.1.8.9 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.4.1.4.4.1.8.10 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.4.1.4.4.1.8.11 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.4.1.4.4.1.8.12 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.4.1.4.4.1.9.1 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.4.1.4.4.1.9.2 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.4.1.4.4.1.9.3 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.4.1.4.4.1.9.4 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.4.1.4.4.1.9.5 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.4.4.1.9.6 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.4.1.4.4.1.9.7 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.4.1.4.4.1.9.8 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.4.1.4.4.1.9.9 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.4.1.4.4.1.9.10 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.4.1.4.4.1.9.11 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.4.1.4.4.1.9.12 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.4.1.4.4.1.10.1 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.4.1.4.4.1.10.2 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.4.1.4.4.1.10.3 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.4.1.4.4.1.10.4 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.4.1.4.4.1.10.5 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.4.4.1.10.6 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.4.1.4.4.1.10.7 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.4.1.4.4.1.10.8 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.4.1.4.4.1.10.9 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.4.1.4.4.1.10.10 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.4.1.4.4.1.10.11 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.4.1.4.4.1.10.12 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.4.1.4.4.1.11.1 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.4.1.4.4.1.11.2 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.4.1.4.4.1.11.3 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.4.1.4.4.1.11.4 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.4.1.4.4.1.11.5 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.4.4.1.11.6 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.4.1.4.4.1.11.7 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.4.1.4.4.1.11.8 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.4.1.4.4.1.11.9 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.4.1.4.4.1.11.10 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.4.1.4.4.1.11.11 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.4.1.4.4.1.11.12 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.4.1.4.4.1.12.1 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.4.4.1.12.2 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.4.4.1.12.3 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.4.4.1.12.4 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.4.4.1.12.5 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.4.4.1.12.6 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.4.1.4.4.1.12.7 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.4.1.4.4.1.12.8 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.4.1.4.4.1.12.9 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.4.1.4.4.1.12.10 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.4.1.4.4.1.12.11 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.4.1.4.4.1.12.12 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.4.4.1.13.1 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.4.4.1.13.2 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.4.4.1.13.3 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.4.4.1.13.4 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.4.4.1.13.5 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.4.4.1.13.6 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.4.1.4.4.1.13.7 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.4.1.4.4.1.13.8 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.4.1.4.4.1.13.9 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.4.1.4.4.1.13.10 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.4.1.4.4.1.13.11 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.4.1.4.4.1.13.12 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.4.4.1.14.1 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.4.4.1.14.2 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.4.4.1.14.3 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.4.4.1.14.4 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.4.4.1.14.5 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.4.4.1.14.6 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.4.1.4.4.1.14.7 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.4.1.4.4.1.14.8 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.4.1.4.4.1.14.9 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.4.1.4.4.1.14.10 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.4.1.4.4.1.14.11 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.4.1.4.4.1.14.12 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.4.4.1.15.1 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.4.4.1.15.2 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.4.4.1.15.3 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.4.4.1.15.4 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.4.4.1.15.5 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.4.4.1.15.6 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.4.1.4.4.1.15.7 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.4.1.4.4.1.15.8 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.4.1.4.4.1.15.9 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.4.1.4.4.1.15.10 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.4.1.4.4.1.15.11 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.4.1.4.4.1.15.12 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.4.4.1.16.1 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.4.4.1.16.2 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.4.4.1.16.3 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.4.4.1.16.4 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.4.4.1.16.5 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.4.4.1.16.6 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.4.1.4.4.1.16.7 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.4.1.4.4.1.16.8 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.4.1.4.4.1.16.9 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.4.1.4.4.1.16.10 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.4.1.4.4.1.16.11 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.4.1.4.4.1.16.12 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.4.4.1.17.1 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.4.4.1.17.2 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.4.4.1.17.3 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.4.4.1.17.4 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.4.4.1.17.5 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.4.4.1.17.6 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.4.1.4.4.1.17.7 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.4.1.4.4.1.17.8 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.4.1.4.4.1.17.9 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.4.1.4.4.1.17.10 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.4.1.4.4.1.17.11 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.4.1.4.4.1.17.12 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.4.4.1.18.1 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.4.1.4.4.1.18.2 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.4.1.4.4.1.18.3 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.4.1.4.4.1.18.4 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.4.1.4.4.1.18.5 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.4.4.1.18.6 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.4.1.4.4.1.18.7 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.4.1.4.4.1.18.8 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.4.1.4.4.1.18.9 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.4.1.4.4.1.18.10 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.4.1.4.4.1.18.11 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.4.1.4.4.1.18.12 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.4.1.4.4.1.19.1 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.4.1.4.4.1.19.2 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.4.1.4.4.1.19.3 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.4.1.4.4.1.19.4 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.4.1.4.4.1.19.5 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.4.4.1.19.6 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.4.1.4.4.1.19.7 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.4.1.4.4.1.19.8 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.4.1.4.4.1.19.9 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.4.1.4.4.1.19.10 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.4.1.4.4.1.19.11 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.4.1.4.4.1.19.12 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.4.1.4.4.1.20.1 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.4.1.4.4.1.20.2 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.4.1.4.4.1.20.3 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.4.1.4.4.1.20.4 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.4.1.4.4.1.20.5 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.4.4.1.20.6 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.4.1.4.4.1.20.7 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.4.1.4.4.1.20.8 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.4.1.4.4.1.20.9 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.4.1.4.4.1.20.10 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.4.1.4.4.1.20.11 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.4.1.4.4.1.20.12 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.4.1.4.4.1.21.1 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.4.1.4.4.1.21.2 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.4.1.4.4.1.21.3 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.4.1.4.4.1.21.4 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.4.1.4.4.1.21.5 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.1.4.4.1.21.6 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.4.1.4.4.1.21.7 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.4.1.4.4.1.21.8 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.4.1.4.4.1.21.9 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.4.1.4.4.1.21.10 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.4.1.4.4.1.21.11 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.4.1.4.4.1.21.12 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.4.2.1.1.0 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.2.1.2.0 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.2.1.4.0 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.2.1.5.0 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.2.1.6.0 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.2.1.7.0 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.2.1.8.0 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.2.1.9.0 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.2.2.2.0 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.2.2.3.0 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.2.2.4.0 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.2.2.6.0 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.2.2.7.0 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.2.3.4.0 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.2.3.5.0 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.2.3.8.0 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.2.3.10.0 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.2.3.11.0 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.2.3.12.0 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.2.3.13.0 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.2.3.14.0 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.4.1.0 = STRING: "08/02/2006,09:51:53" .1.3.6.1.4.1.2.3.51.2.4.4.2.0 = STRING: "-6:00,yes" .1.3.6.1.4.1.2.3.51.2.4.5.1.0 = STRING: "BCT-81" .1.3.6.1.4.1.2.3.51.2.4.9.1.1.1.0 = STRING: "ETH_EXT" .1.3.6.1.4.1.2.3.51.2.4.9.1.1.3.0 = STRING: "MM010101010101" .1.3.6.1.4.1.2.3.51.2.4.9.1.1.4.0 = IpAddress: 192.168.70.125 .1.3.6.1.4.1.2.3.51.2.4.9.1.1.5.0 = INTEGER: 5 .1.3.6.1.4.1.2.3.51.2.4.9.1.1.6.0 = INTEGER: 3 .1.3.6.1.4.1.2.3.51.2.4.9.1.1.7.0 = STRING: "01:01:01:01:01:01" .1.3.6.1.4.1.2.3.51.2.4.9.1.1.8.0 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.9.1.1.9.0 = IpAddress: 192.168.70.1 .1.3.6.1.4.1.2.3.51.2.4.9.1.1.10.0 = STRING: "02:02:02:02:02:02" .1.3.6.1.4.1.2.3.51.2.4.9.1.1.13.0 = INTEGER: 1500 .1.3.6.1.4.1.2.3.51.2.4.9.1.1.14.0 = IpAddress: 255.255.255.0 .1.3.6.1.4.1.2.3.51.2.4.9.1.1.16.1.0 = STRING: "(Not configured)" .1.3.6.1.4.1.2.3.51.2.4.9.1.1.16.2.0 = IpAddress: 0.0.0.0 .1.3.6.1.4.1.2.3.51.2.4.9.1.1.16.3.0 = IpAddress: 0.0.0.0 .1.3.6.1.4.1.2.3.51.2.4.9.1.1.16.4.0 = IpAddress: 0.0.0.0 .1.3.6.1.4.1.2.3.51.2.4.9.1.1.16.5.0 = STRING: "(Not configured)" .1.3.6.1.4.1.2.3.51.2.4.9.1.1.16.6.0 = IpAddress: 0.0.0.0 .1.3.6.1.4.1.2.3.51.2.4.9.1.1.16.7.0 = IpAddress: 0.0.0.0 .1.3.6.1.4.1.2.3.51.2.4.9.1.1.16.8.0 = IpAddress: 0.0.0.0 .1.3.6.1.4.1.2.3.51.2.4.9.1.1.16.9.0 = IpAddress: 0.0.0.0 .1.3.6.1.4.1.2.3.51.2.4.9.1.2.1.0 = STRING: "ETH_INT" .1.3.6.1.4.1.2.3.51.2.4.9.1.2.2.0 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.4.9.1.2.4.0 = IpAddress: 192.168.70.126 .1.3.6.1.4.1.2.3.51.2.4.9.1.2.5.0 = INTEGER: 4 .1.3.6.1.4.1.2.3.51.2.4.9.1.2.6.0 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.4.9.1.2.7.0 = STRING: "00:00:00:00:00:00" .1.3.6.1.4.1.2.3.51.2.4.9.1.2.9.0 = IpAddress: 0.0.0.0 .1.3.6.1.4.1.2.3.51.2.4.9.1.2.10.0 = STRING: "03:03:03:03:03:03" .1.3.6.1.4.1.2.3.51.2.4.9.1.2.13.0 = INTEGER: 1500 .1.3.6.1.4.1.2.3.51.2.4.9.1.2.14.0 = IpAddress: 255.255.255.0 .1.3.6.1.4.1.2.3.51.2.4.9.3.1.1.0 = STRING: "MrBladeCenterTelco" .1.3.6.1.4.1.2.3.51.2.4.9.3.1.2.0 = STRING: "USA" .1.3.6.1.4.1.2.3.51.2.4.9.3.1.3.0 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.9.3.1.4.1.1.1.1 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.4.9.3.1.4.1.1.1.2 = INTEGER: 2 .1.3.6.1.4.1.2.3.51.2.4.9.3.1.4.1.1.1.3 = INTEGER: 3 .1.3.6.1.4.1.2.3.51.2.4.9.3.1.4.1.1.2.1 = STRING: "BCT3public" .1.3.6.1.4.1.2.3.51.2.4.9.3.1.4.1.1.2.2 = STRING: "BCT3private" .1.3.6.1.4.1.2.3.51.2.4.9.3.1.4.1.1.2.3 = STRING: "BCT3test" .1.3.6.1.4.1.2.3.51.2.4.9.3.1.4.1.1.3.1 = STRING: "0.0.0.0" .1.3.6.1.4.1.2.3.51.2.4.9.3.1.4.1.1.3.2 = STRING: "0.0.0.0" .1.3.6.1.4.1.2.3.51.2.4.9.3.1.4.1.1.3.3 = STRING: "0.0.0.0" .1.3.6.1.4.1.2.3.51.2.4.9.3.1.4.1.1.4.1 = STRING: "0.0.0.0" .1.3.6.1.4.1.2.3.51.2.4.9.3.1.4.1.1.4.2 = STRING: "0.0.0.0" .1.3.6.1.4.1.2.3.51.2.4.9.3.1.4.1.1.4.3 = STRING: "0.0.0.0" .1.3.6.1.4.1.2.3.51.2.4.9.3.1.4.1.1.5.1 = STRING: "0.0.0.0" " .1.3.6.1.4.1.2.3.51.2.4.9.3.1.4.1.1.5.2 = STRING: "0.0.0.0" .1.3.6.1.4.1.2.3.51.2.4.9.3.1.4.1.1.5.3 = STRING: "0.0.0.0" .1.3.6.1.4.1.2.3.51.2.4.9.3.1.4.1.1.6.1 = INTEGER: 2 .1.3.6.1.4.1.2.3.51.2.4.9.3.1.4.1.1.6.2 = INTEGER: 2 .1.3.6.1.4.1.2.3.51.2.4.9.3.1.4.1.1.6.3 = INTEGER: 2 .1.3.6.1.4.1.2.3.51.2.4.9.3.1.5.0 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.4.9.3.1.6.0 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.4.9.3.1.9.1.1.1.1 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.4.9.3.1.9.1.1.1.2 = INTEGER: 2 .1.3.6.1.4.1.2.3.51.2.4.9.3.1.9.1.1.1.3 = INTEGER: 3 .1.3.6.1.4.1.2.3.51.2.4.9.3.1.9.1.1.1.4 = INTEGER: 4 .1.3.6.1.4.1.2.3.51.2.4.9.3.1.9.1.1.1.5 = INTEGER: 5 .1.3.6.1.4.1.2.3.51.2.4.9.3.1.9.1.1.1.6 = INTEGER: 6 .1.3.6.1.4.1.2.3.51.2.4.9.3.1.9.1.1.1.7 = INTEGER: 7 .1.3.6.1.4.1.2.3.51.2.4.9.3.1.9.1.1.1.8 = INTEGER: 8 .1.3.6.1.4.1.2.3.51.2.4.9.3.1.9.1.1.1.9 = INTEGER: 9 .1.3.6.1.4.1.2.3.51.2.4.9.3.1.9.1.1.1.10 = INTEGER: 10 .1.3.6.1.4.1.2.3.51.2.4.9.3.1.9.1.1.1.11 = INTEGER: 11 .1.3.6.1.4.1.2.3.51.2.4.9.3.1.9.1.1.1.12 = INTEGER: 12 .1.3.6.1.4.1.2.3.51.2.4.9.3.1.9.1.1.2.1 = "" .1.3.6.1.4.1.2.3.51.2.4.9.3.1.9.1.1.2.2 = "" .1.3.6.1.4.1.2.3.51.2.4.9.3.1.9.1.1.2.3 = "" .1.3.6.1.4.1.2.3.51.2.4.9.3.1.9.1.1.2.4 = "" .1.3.6.1.4.1.2.3.51.2.4.9.3.1.9.1.1.2.5 = "" .1.3.6.1.4.1.2.3.51.2.4.9.3.1.9.1.1.2.6 = "" .1.3.6.1.4.1.2.3.51.2.4.9.3.1.9.1.1.2.7 = "" .1.3.6.1.4.1.2.3.51.2.4.9.3.1.9.1.1.2.8 = "" .1.3.6.1.4.1.2.3.51.2.4.9.3.1.9.1.1.2.9 = "" .1.3.6.1.4.1.2.3.51.2.4.9.3.1.9.1.1.2.10 = "" .1.3.6.1.4.1.2.3.51.2.4.9.3.1.9.1.1.2.11 = "" .1.3.6.1.4.1.2.3.51.2.4.9.3.1.9.1.1.2.12 = "" .1.3.6.1.4.1.2.3.51.2.4.9.3.1.9.1.1.3.1 = STRING: "Not configured" .1.3.6.1.4.1.2.3.51.2.4.9.3.1.9.1.1.3.2 = STRING: "Not configured" .1.3.6.1.4.1.2.3.51.2.4.9.3.1.9.1.1.3.3 = STRING: "Not configured" .1.3.6.1.4.1.2.3.51.2.4.9.3.1.9.1.1.3.4 = STRING: "Not configured" .1.3.6.1.4.1.2.3.51.2.4.9.3.1.9.1.1.3.5 = STRING: "Not configured" .1.3.6.1.4.1.2.3.51.2.4.9.3.1.9.1.1.3.6 = STRING: "Not configured" .1.3.6.1.4.1.2.3.51.2.4.9.3.1.9.1.1.3.7 = STRING: "Not configured" .1.3.6.1.4.1.2.3.51.2.4.9.3.1.9.1.1.3.8 = STRING: "Not configured" .1.3.6.1.4.1.2.3.51.2.4.9.3.1.9.1.1.3.9 = STRING: "Not configured" .1.3.6.1.4.1.2.3.51.2.4.9.3.1.9.1.1.3.10 = STRING: "Not configured" .1.3.6.1.4.1.2.3.51.2.4.9.3.1.9.1.1.3.11 = STRING: "Not configured" .1.3.6.1.4.1.2.3.51.2.4.9.3.1.9.1.1.3.12 = STRING: "Not configured" .1.3.6.1.4.1.2.3.51.2.4.9.3.1.9.1.1.4.1 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.4.9.3.1.9.1.1.4.2 = INTEGER: 2 .1.3.6.1.4.1.2.3.51.2.4.9.3.1.9.1.1.4.3 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.9.3.1.9.1.1.4.4 = INTEGER: 2 .1.3.6.1.4.1.2.3.51.2.4.9.3.1.9.1.1.4.5 = INTEGER: 2 .1.3.6.1.4.1.2.3.51.2.4.9.3.1.9.1.1.4.6 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.9.3.1.9.1.1.4.7 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.9.3.1.9.1.1.4.8 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.9.3.1.9.1.1.4.9 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.9.3.1.9.1.1.4.10 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.9.3.1.9.1.1.4.11 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.9.3.1.9.1.1.4.12 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.9.3.1.9.1.1.5.1 = "" .1.3.6.1.4.1.2.3.51.2.4.9.3.1.9.1.1.5.2 = "" .1.3.6.1.4.1.2.3.51.2.4.9.3.1.9.1.1.5.3 = "" .1.3.6.1.4.1.2.3.51.2.4.9.3.1.9.1.1.5.4 = "" .1.3.6.1.4.1.2.3.51.2.4.9.3.1.9.1.1.5.5 = "" .1.3.6.1.4.1.2.3.51.2.4.9.3.1.9.1.1.5.6 = "" .1.3.6.1.4.1.2.3.51.2.4.9.3.1.9.1.1.5.7 = "" .1.3.6.1.4.1.2.3.51.2.4.9.3.1.9.1.1.5.8 = "" .1.3.6.1.4.1.2.3.51.2.4.9.3.1.9.1.1.5.9 = "" .1.3.6.1.4.1.2.3.51.2.4.9.3.1.9.1.1.5.10 = "" .1.3.6.1.4.1.2.3.51.2.4.9.3.1.9.1.1.5.11 = "" .1.3.6.1.4.1.2.3.51.2.4.9.3.1.9.1.1.5.12 = "" .1.3.6.1.4.1.2.3.51.2.4.9.3.1.9.1.1.6.1 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.4.9.3.1.9.1.1.6.2 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.4.9.3.1.9.1.1.6.3 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.9.3.1.9.1.1.6.4 = INTEGER: 2 .1.3.6.1.4.1.2.3.51.2.4.9.3.1.9.1.1.6.5 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.4.9.3.1.9.1.1.6.6 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.9.3.1.9.1.1.6.7 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.9.3.1.9.1.1.6.8 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.9.3.1.9.1.1.6.9 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.9.3.1.9.1.1.6.10 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.9.3.1.9.1.1.6.11 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.9.3.1.9.1.1.6.12 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.9.3.1.9.1.1.7.1 = "" .1.3.6.1.4.1.2.3.51.2.4.9.3.1.9.1.1.7.2 = "" .1.3.6.1.4.1.2.3.51.2.4.9.3.1.9.1.1.7.3 = "" .1.3.6.1.4.1.2.3.51.2.4.9.3.1.9.1.1.7.4 = "" .1.3.6.1.4.1.2.3.51.2.4.9.3.1.9.1.1.7.5 = "" .1.3.6.1.4.1.2.3.51.2.4.9.3.1.9.1.1.7.6 = "" .1.3.6.1.4.1.2.3.51.2.4.9.3.1.9.1.1.7.7 = "" .1.3.6.1.4.1.2.3.51.2.4.9.3.1.9.1.1.7.8 = "" .1.3.6.1.4.1.2.3.51.2.4.9.3.1.9.1.1.7.9 = "" .1.3.6.1.4.1.2.3.51.2.4.9.3.1.9.1.1.7.10 = "" .1.3.6.1.4.1.2.3.51.2.4.9.3.1.9.1.1.7.11 = "" .1.3.6.1.4.1.2.3.51.2.4.9.3.1.9.1.1.7.12 = "" .1.3.6.1.4.1.2.3.51.2.4.9.3.1.9.1.1.8.1 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.4.9.3.1.9.1.1.8.2 = INTEGER: 2 .1.3.6.1.4.1.2.3.51.2.4.9.3.1.9.1.1.8.3 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.9.3.1.9.1.1.8.4 = INTEGER: 2 .1.3.6.1.4.1.2.3.51.2.4.9.3.1.9.1.1.8.5 = INTEGER: 2 .1.3.6.1.4.1.2.3.51.2.4.9.3.1.9.1.1.8.6 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.9.3.1.9.1.1.8.7 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.9.3.1.9.1.1.8.8 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.9.3.1.9.1.1.8.9 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.9.3.1.9.1.1.8.10 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.9.3.1.9.1.1.8.11 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.9.3.1.9.1.1.8.12 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.9.3.1.9.1.1.9.1 = STRING: "0.0.0.0" .1.3.6.1.4.1.2.3.51.2.4.9.3.1.9.1.1.9.2 = STRING: "0.0.0.0" .1.3.6.1.4.1.2.3.51.2.4.9.3.1.9.1.1.9.3 = STRING: "0.0.0.0" .1.3.6.1.4.1.2.3.51.2.4.9.3.1.9.1.1.9.4 = STRING: "0.0.0.0" .1.3.6.1.4.1.2.3.51.2.4.9.3.1.9.1.1.9.5 = STRING: "0.0.0.0" .1.3.6.1.4.1.2.3.51.2.4.9.3.1.9.1.1.9.6 = STRING: "0.0.0.0" .1.3.6.1.4.1.2.3.51.2.4.9.3.1.9.1.1.9.7 = STRING: "0.0.0.0" .1.3.6.1.4.1.2.3.51.2.4.9.3.1.9.1.1.9.8 = STRING: "0.0.0.0" .1.3.6.1.4.1.2.3.51.2.4.9.3.1.9.1.1.9.9 = STRING: "0.0.0.0" .1.3.6.1.4.1.2.3.51.2.4.9.3.1.9.1.1.9.10 = STRING: "0.0.0.0" .1.3.6.1.4.1.2.3.51.2.4.9.3.1.9.1.1.9.11 = STRING: "0.0.0.0" .1.3.6.1.4.1.2.3.51.2.4.9.3.1.9.1.1.9.12 = STRING: "0.0.0.0" .1.3.6.1.4.1.2.3.51.2.4.9.3.2.1.0 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.9.3.2.2.0 = IpAddress: 0.0.0.0 .1.3.6.1.4.1.2.3.51.2.4.9.3.2.3.0 = IpAddress: 0.0.0.0 .1.3.6.1.4.1.2.3.51.2.4.9.3.2.4.0 = IpAddress: 0.0.0.0 .1.3.6.1.4.1.2.3.51.2.4.9.3.3.1.0 = STRING: "(Not configured)" .1.3.6.1.4.1.2.3.51.2.4.9.3.3.2.0 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.9.3.4.1.0 = INTEGER: 6000 .1.3.6.1.4.1.2.3.51.2.4.9.3.4.2.0 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.9.3.4.4.0 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.4.9.3.4.5.0 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.9.3.4.6.0 = IpAddress: 239.255.255.253 .1.3.6.1.4.1.2.3.51.2.4.9.3.5.1.0 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.9.3.5.2.0 = INTEGER: 80 .1.3.6.1.4.1.2.3.51.2.4.9.3.5.3.0 = INTEGER: 443 .1.3.6.1.4.1.2.3.51.2.4.9.3.5.4.0 = INTEGER: 23 .1.3.6.1.4.1.2.3.51.2.4.9.3.5.5.0 = INTEGER: 22 .1.3.6.1.4.1.2.3.51.2.4.9.3.5.6.0 = INTEGER: 161 .1.3.6.1.4.1.2.3.51.2.4.9.3.5.7.0 = INTEGER: 162 .1.3.6.1.4.1.2.3.51.2.4.9.3.6.1.0 = "" .1.3.6.1.4.1.2.3.51.2.4.9.3.6.2.0 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.9.3.6.3.0 = "" .1.3.6.1.4.1.2.3.51.2.4.9.3.6.4.0 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.9.3.6.5.0 = "" .1.3.6.1.4.1.2.3.51.2.4.9.3.6.6.0 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.9.3.6.7.0 = "" .1.3.6.1.4.1.2.3.51.2.4.9.3.6.8.0 = "" .1.3.6.1.4.1.2.3.51.2.4.9.3.6.9.0 = STRING: "RSA*" .1.3.6.1.4.1.2.3.51.2.4.9.3.6.10.0 = INTEGER: 2 .1.3.6.1.4.1.2.3.51.2.4.9.3.6.11.0 = "" .1.3.6.1.4.1.2.3.51.2.4.9.3.6.12.0 = "" .1.3.6.1.4.1.2.3.51.2.4.9.3.6.13.0 = "" .1.3.6.1.4.1.2.3.51.2.4.9.3.6.14.0 = "" .1.3.6.1.4.1.2.3.51.2.4.9.3.6.15.0 = "" .1.3.6.1.4.1.2.3.51.2.4.9.3.6.16.0 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.9.3.6.17.0 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.9.3.6.18.0 = "" .1.3.6.1.4.1.2.3.51.2.4.9.3.6.19.0 = STRING: "ldap" .1.3.6.1.4.1.2.3.51.2.4.9.3.7.1.0 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.9.3.7.2.0 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.4.10.1.1.0 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.4.10.1.2.0 = INTEGER: 4095 .1.3.6.1.4.1.2.3.51.2.4.10.1.3.0 = INTEGER: 50 .1.3.6.1.4.1.2.3.51.2.4.10.1.4.0 = INTEGER: 250 .1.3.6.1.4.1.2.3.51.2.4.10.1.5.0 = INTEGER: 3 .1.3.6.1.4.1.2.3.51.2.4.10.1.6.0 = INTEGER: 250 .1.3.6.1.4.1.2.3.51.2.4.10.1.7.0 = STRING: "^[(" .1.3.6.1.4.1.2.3.51.2.4.10.1.8.0 = STRING: "^[R^[r^[R" .1.3.6.1.4.1.2.3.51.2.4.10.2.1.1.1.1 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.4.10.2.1.1.1.2 = INTEGER: 2 .1.3.6.1.4.1.2.3.51.2.4.10.2.1.1.1.3 = INTEGER: 3 .1.3.6.1.4.1.2.3.51.2.4.10.2.1.1.1.4 = INTEGER: 4 .1.3.6.1.4.1.2.3.51.2.4.10.2.1.1.1.5 = INTEGER: 5 .1.3.6.1.4.1.2.3.51.2.4.10.2.1.1.1.6 = INTEGER: 6 .1.3.6.1.4.1.2.3.51.2.4.10.2.1.1.1.7 = INTEGER: 7 .1.3.6.1.4.1.2.3.51.2.4.10.2.1.1.1.8 = INTEGER: 8 .1.3.6.1.4.1.2.3.51.2.4.10.2.1.1.2.1 = STRING: "Mor38____FC3" .1.3.6.1.4.1.2.3.51.2.4.10.2.1.1.2.2 = STRING: "combo blade" .1.3.6.1.4.1.2.3.51.2.4.10.2.1.1.2.3 = STRING: "L99_P_____FC" .1.3.6.1.4.1.2.3.51.2.4.10.2.1.1.2.4 = STRING: "G71______SU" .1.3.6.1.4.1.2.3.51.2.4.10.2.1.1.2.5 = STRING: "J52_Lin_p64" .1.3.6.1.4.1.2.3.51.2.4.10.2.1.1.2.6 = STRING: "combo blade" .1.3.6.1.4.1.2.3.51.2.4.10.2.1.1.2.7 = STRING: "combo blade" .1.3.6.1.4.1.2.3.51.2.4.10.2.1.1.2.8 = STRING: "M01____RHEL4" .1.3.6.1.4.1.2.3.51.2.4.10.2.1.1.3.1 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.4.10.2.1.1.3.2 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.4.10.2.1.1.3.3 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.4.10.2.1.1.3.4 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.4.10.2.1.1.3.5 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.4.10.2.1.1.3.6 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.4.10.2.1.1.3.7 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.4.10.2.1.1.3.8 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.4.10.2.1.1.4.1 = IpAddress: 10.10.10.80 .1.3.6.1.4.1.2.3.51.2.4.10.2.1.1.4.2 = IpAddress: 10.10.10.81 .1.3.6.1.4.1.2.3.51.2.4.10.2.1.1.4.3 = IpAddress: 10.10.10.82 .1.3.6.1.4.1.2.3.51.2.4.10.2.1.1.4.4 = IpAddress: 10.10.10.83 .1.3.6.1.4.1.2.3.51.2.4.10.2.1.1.4.5 = IpAddress: 10.10.10.84 .1.3.6.1.4.1.2.3.51.2.4.10.2.1.1.4.6 = IpAddress: 10.10.10.85 .1.3.6.1.4.1.2.3.51.2.4.10.2.1.1.4.7 = IpAddress: 10.10.10.86 .1.3.6.1.4.1.2.3.51.2.4.10.2.1.1.4.8 = IpAddress: 10.10.10.87 .1.3.6.1.4.1.2.3.51.2.4.10.2.1.1.5.1 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.10.2.1.1.5.2 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.10.2.1.1.5.3 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.10.2.1.1.5.4 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.4.10.2.1.1.5.5 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.4.10.2.1.1.5.6 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.10.2.1.1.5.7 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.10.2.1.1.5.8 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.4.10.2.1.1.6.1 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.4.10.2.1.1.6.2 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.10.2.1.1.6.3 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.4.10.2.1.1.6.4 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.4.10.2.1.1.6.5 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.4.10.2.1.1.6.6 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.10.2.1.1.6.7 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.4.10.2.1.1.6.8 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.5.1.1.0 = "" .1.3.6.1.4.1.2.3.51.2.5.1.2.0 = "" .1.3.6.1.4.1.2.3.51.2.5.1.3.0 = "" .1.3.6.1.4.1.2.3.51.2.5.127.1.0 = Hex-STRING: 80 .1.3.6.1.4.1.2.3.51.2.5.127.2.1.1.1.1.1 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.5.127.2.1.1.1.1.2 = INTEGER: 2 .1.3.6.1.4.1.2.3.51.2.5.127.2.1.1.1.1.3 = INTEGER: 3 .1.3.6.1.4.1.2.3.51.2.5.127.2.1.1.1.1.4 = INTEGER: 4 .1.3.6.1.4.1.2.3.51.2.5.127.2.1.1.1.2.1 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.5.127.2.1.1.1.2.2 = INTEGER: 2 .1.3.6.1.4.1.2.3.51.2.5.127.2.1.1.1.2.3 = INTEGER: 3 .1.3.6.1.4.1.2.3.51.2.5.127.2.1.1.1.2.4 = INTEGER: 4 .1.3.6.1.4.1.2.3.51.2.5.127.2.1.1.1.3.1 = INTEGER: 2 .1.3.6.1.4.1.2.3.51.2.5.127.2.1.1.1.3.2 = INTEGER: 2 .1.3.6.1.4.1.2.3.51.2.5.127.2.1.1.1.3.3 = INTEGER: 2 .1.3.6.1.4.1.2.3.51.2.5.127.2.1.1.1.3.4 = INTEGER: 2 .1.3.6.1.4.1.2.3.51.2.5.127.2.1.1.1.4.1 = INTEGER: 255 .1.3.6.1.4.1.2.3.51.2.5.127.2.1.1.1.4.2 = INTEGER: 255 .1.3.6.1.4.1.2.3.51.2.5.127.2.1.1.1.4.3 = INTEGER: 255 .1.3.6.1.4.1.2.3.51.2.5.127.2.1.1.1.4.4 = INTEGER: 255 .1.3.6.1.4.1.2.3.51.2.5.127.2.2.1.1.1.1 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.5.127.2.2.1.1.1.2 = INTEGER: 2 .1.3.6.1.4.1.2.3.51.2.5.127.2.2.1.1.1.3 = INTEGER: 3 .1.3.6.1.4.1.2.3.51.2.5.127.2.2.1.1.1.4 = INTEGER: 4 .1.3.6.1.4.1.2.3.51.2.5.127.2.2.1.1.1.5 = INTEGER: 5 .1.3.6.1.4.1.2.3.51.2.5.127.2.2.1.1.1.6 = INTEGER: 6 .1.3.6.1.4.1.2.3.51.2.5.127.2.2.1.1.1.7 = INTEGER: 7 .1.3.6.1.4.1.2.3.51.2.5.127.2.2.1.1.1.8 = INTEGER: 8 .1.3.6.1.4.1.2.3.51.2.5.127.2.2.1.1.2.1 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.5.127.2.2.1.1.2.2 = INTEGER: 2 .1.3.6.1.4.1.2.3.51.2.5.127.2.2.1.1.2.3 = INTEGER: 3 .1.3.6.1.4.1.2.3.51.2.5.127.2.2.1.1.2.4 = INTEGER: 4 .1.3.6.1.4.1.2.3.51.2.5.127.2.2.1.1.2.5 = INTEGER: 5 .1.3.6.1.4.1.2.3.51.2.5.127.2.2.1.1.2.6 = INTEGER: 6 .1.3.6.1.4.1.2.3.51.2.5.127.2.2.1.1.2.7 = INTEGER: 7 .1.3.6.1.4.1.2.3.51.2.5.127.2.2.1.1.2.8 = INTEGER: 8 .1.3.6.1.4.1.2.3.51.2.5.127.2.2.1.1.3.1 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.5.127.2.2.1.1.3.2 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.5.127.2.2.1.1.3.3 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.5.127.2.2.1.1.3.4 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.5.127.2.2.1.1.3.5 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.5.127.2.2.1.1.3.6 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.5.127.2.2.1.1.3.7 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.5.127.2.2.1.1.3.8 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.5.127.2.2.1.1.4.1 = STRING: "(invalid)" .1.3.6.1.4.1.2.3.51.2.5.127.2.2.1.1.4.2 = STRING: "(invalid)" .1.3.6.1.4.1.2.3.51.2.5.127.2.2.1.1.4.3 = STRING: "(invalid)" .1.3.6.1.4.1.2.3.51.2.5.127.2.2.1.1.4.4 = STRING: "(invalid)" .1.3.6.1.4.1.2.3.51.2.5.127.2.2.1.1.4.5 = STRING: "(invalid)" .1.3.6.1.4.1.2.3.51.2.5.127.2.2.1.1.4.6 = STRING: "(invalid)" .1.3.6.1.4.1.2.3.51.2.5.127.2.2.1.1.4.7 = STRING: "(invalid)" .1.3.6.1.4.1.2.3.51.2.5.127.2.2.1.1.4.8 = STRING: "(invalid)" .1.3.6.1.4.1.2.3.51.2.5.127.2.2.1.1.5.1 = STRING: "(invalid)" .1.3.6.1.4.1.2.3.51.2.5.127.2.2.1.1.5.2 = STRING: "(invalid)" .1.3.6.1.4.1.2.3.51.2.5.127.2.2.1.1.5.3 = STRING: "(invalid)" .1.3.6.1.4.1.2.3.51.2.5.127.2.2.1.1.5.4 = STRING: "(invalid)" .1.3.6.1.4.1.2.3.51.2.5.127.2.2.1.1.5.5 = STRING: "(invalid)" .1.3.6.1.4.1.2.3.51.2.5.127.2.2.1.1.5.6 = STRING: "(invalid)" .1.3.6.1.4.1.2.3.51.2.5.127.2.2.1.1.5.7 = STRING: "(invalid)" .1.3.6.1.4.1.2.3.51.2.5.127.2.2.1.1.5.8 = STRING: "(invalid)" .1.3.6.1.4.1.2.3.51.2.5.127.2.2.1.1.6.1 = INTEGER: 2 .1.3.6.1.4.1.2.3.51.2.5.127.2.2.1.1.6.2 = INTEGER: 2 .1.3.6.1.4.1.2.3.51.2.5.127.2.2.1.1.6.3 = INTEGER: 2 .1.3.6.1.4.1.2.3.51.2.5.127.2.2.1.1.6.4 = INTEGER: 2 .1.3.6.1.4.1.2.3.51.2.5.127.2.2.1.1.6.5 = INTEGER: 2 .1.3.6.1.4.1.2.3.51.2.5.127.2.2.1.1.6.6 = INTEGER: 2 .1.3.6.1.4.1.2.3.51.2.5.127.2.2.1.1.6.7 = INTEGER: 2 .1.3.6.1.4.1.2.3.51.2.5.127.2.2.1.1.6.8 = INTEGER: 2 .1.3.6.1.4.1.2.3.51.2.5.127.2.2.1.1.7.1 = STRING: "(invalid)" .1.3.6.1.4.1.2.3.51.2.5.127.2.2.1.1.7.2 = STRING: "(invalid)" .1.3.6.1.4.1.2.3.51.2.5.127.2.2.1.1.7.3 = STRING: "(invalid)" .1.3.6.1.4.1.2.3.51.2.5.127.2.2.1.1.7.4 = STRING: "(invalid)" .1.3.6.1.4.1.2.3.51.2.5.127.2.2.1.1.7.5 = STRING: "(invalid)" .1.3.6.1.4.1.2.3.51.2.5.127.2.2.1.1.7.6 = STRING: "(invalid)" .1.3.6.1.4.1.2.3.51.2.5.127.2.2.1.1.7.7 = STRING: "(invalid)" .1.3.6.1.4.1.2.3.51.2.5.127.2.2.1.1.7.8 = STRING: "0.00 Centigrade" .1.3.6.1.4.1.2.3.51.2.5.127.2.2.1.1.8.1 = STRING: "(invalid)" .1.3.6.1.4.1.2.3.51.2.5.127.2.2.1.1.8.2 = STRING: "(invalid)" .1.3.6.1.4.1.2.3.51.2.5.127.2.2.1.1.8.3 = STRING: "(invalid)" .1.3.6.1.4.1.2.3.51.2.5.127.2.2.1.1.8.4 = STRING: "(invalid)" .1.3.6.1.4.1.2.3.51.2.5.127.2.2.1.1.8.5 = STRING: "(invalid)" .1.3.6.1.4.1.2.3.51.2.5.127.2.2.1.1.8.6 = STRING: "(invalid)" .1.3.6.1.4.1.2.3.51.2.5.127.2.2.1.1.8.7 = STRING: "(invalid)" .1.3.6.1.4.1.2.3.51.2.5.127.2.2.1.1.8.8 = STRING: "(invalid)" .1.3.6.1.4.1.2.3.51.2.5.127.2.2.1.1.9.1 = STRING: "(invalid)" .1.3.6.1.4.1.2.3.51.2.5.127.2.2.1.1.9.2 = STRING: "(invalid)" .1.3.6.1.4.1.2.3.51.2.5.127.2.2.1.1.9.3 = STRING: "(invalid)" .1.3.6.1.4.1.2.3.51.2.5.127.2.2.1.1.9.4 = STRING: "(invalid)" .1.3.6.1.4.1.2.3.51.2.5.127.2.2.1.1.9.5 = STRING: "(invalid)" .1.3.6.1.4.1.2.3.51.2.5.127.2.2.1.1.9.6 = STRING: "(invalid)" .1.3.6.1.4.1.2.3.51.2.5.127.2.2.1.1.9.7 = STRING: "(invalid)" .1.3.6.1.4.1.2.3.51.2.5.127.2.2.1.1.9.8 = STRING: "(invalid)" .1.3.6.1.4.1.2.3.51.2.5.127.2.2.1.1.10.1 = STRING: "(invalid)" .1.3.6.1.4.1.2.3.51.2.5.127.2.2.1.1.10.2 = STRING: "(invalid)" .1.3.6.1.4.1.2.3.51.2.5.127.2.2.1.1.10.3 = STRING: "(invalid)" .1.3.6.1.4.1.2.3.51.2.5.127.2.2.1.1.10.4 = STRING: "(invalid)" .1.3.6.1.4.1.2.3.51.2.5.127.2.2.1.1.10.5 = STRING: "(invalid)" .1.3.6.1.4.1.2.3.51.2.5.127.2.2.1.1.10.6 = STRING: "(invalid)" .1.3.6.1.4.1.2.3.51.2.5.127.2.2.1.1.10.7 = STRING: "(invalid)" .1.3.6.1.4.1.2.3.51.2.5.127.2.2.1.1.10.8 = STRING: "(invalid)" .1.3.6.1.4.1.2.3.51.2.7.4.0 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.7.7.0 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.7.20.0 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.22.1.1.0 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.22.1.2.0 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.22.1.3.1.1.1 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.22.1.3.1.1.2 = INTEGER: 2 .1.3.6.1.4.1.2.3.51.2.22.1.3.1.1.3 = INTEGER: 3 .1.3.6.1.4.1.2.3.51.2.22.1.3.1.1.4 = INTEGER: 4 .1.3.6.1.4.1.2.3.51.2.22.1.3.1.1.5 = INTEGER: 5 .1.3.6.1.4.1.2.3.51.2.22.1.3.1.1.6 = INTEGER: 6 .1.3.6.1.4.1.2.3.51.2.22.1.3.1.1.7 = INTEGER: 7 .1.3.6.1.4.1.2.3.51.2.22.1.3.1.1.8 = INTEGER: 8 .1.3.6.1.4.1.2.3.51.2.22.1.3.1.2.1 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.22.1.3.1.2.2 = INTEGER: 2 .1.3.6.1.4.1.2.3.51.2.22.1.3.1.2.3 = INTEGER: 3 .1.3.6.1.4.1.2.3.51.2.22.1.3.1.2.4 = INTEGER: 4 .1.3.6.1.4.1.2.3.51.2.22.1.3.1.2.5 = INTEGER: 5 .1.3.6.1.4.1.2.3.51.2.22.1.3.1.2.6 = INTEGER: 6 .1.3.6.1.4.1.2.3.51.2.22.1.3.1.2.7 = INTEGER: 7 .1.3.6.1.4.1.2.3.51.2.22.1.3.1.2.8 = INTEGER: 8 .1.3.6.1.4.1.2.3.51.2.22.1.3.1.3.1 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.22.1.3.1.3.2 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.22.1.3.1.3.3 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.22.1.3.1.3.4 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.22.1.3.1.3.5 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.22.1.3.1.3.6 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.22.1.3.1.3.7 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.22.1.3.1.3.8 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.22.1.3.1.4.1 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.22.1.3.1.4.2 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.22.1.3.1.4.3 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.22.1.3.1.4.4 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.22.1.3.1.4.5 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.22.1.3.1.4.6 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.22.1.3.1.4.7 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.22.1.3.1.4.8 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.22.1.3.1.5.1 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.22.1.3.1.5.2 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.22.1.3.1.5.3 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.22.1.3.1.5.4 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.22.1.3.1.5.5 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.22.1.3.1.5.6 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.22.1.3.1.5.7 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.22.1.3.1.5.8 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.22.1.3.1.6.1 = STRING: "Mor38____FC3" .1.3.6.1.4.1.2.3.51.2.22.1.3.1.6.2 = STRING: "(No name)" .1.3.6.1.4.1.2.3.51.2.22.1.3.1.6.3 = STRING: "L99_P_____FC" .1.3.6.1.4.1.2.3.51.2.22.1.3.1.6.4 = STRING: "G71______SU" .1.3.6.1.4.1.2.3.51.2.22.1.3.1.6.5 = STRING: "J52_Lin_p64" .1.3.6.1.4.1.2.3.51.2.22.1.3.1.6.6 = STRING: "(No name)" .1.3.6.1.4.1.2.3.51.2.22.1.3.1.6.7 = STRING: "(No name)" .1.3.6.1.4.1.2.3.51.2.22.1.3.1.6.8 = STRING: "M01____RHEL4" .1.3.6.1.4.1.2.3.51.2.22.1.3.1.7.1 = INTEGER: 2 .1.3.6.1.4.1.2.3.51.2.22.1.3.1.7.2 = INTEGER: 255 .1.3.6.1.4.1.2.3.51.2.22.1.3.1.7.3 = INTEGER: 2 .1.3.6.1.4.1.2.3.51.2.22.1.3.1.7.4 = INTEGER: 3 .1.3.6.1.4.1.2.3.51.2.22.1.3.1.7.5 = INTEGER: 3 .1.3.6.1.4.1.2.3.51.2.22.1.3.1.7.6 = INTEGER: 255 .1.3.6.1.4.1.2.3.51.2.22.1.3.1.7.7 = INTEGER: 255 .1.3.6.1.4.1.2.3.51.2.22.1.3.1.7.8 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.22.1.3.1.8.1 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.22.1.3.1.8.2 = INTEGER: 255 .1.3.6.1.4.1.2.3.51.2.22.1.3.1.8.3 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.22.1.3.1.8.4 = INTEGER: 4 .1.3.6.1.4.1.2.3.51.2.22.1.3.1.8.5 = INTEGER: 2 .1.3.6.1.4.1.2.3.51.2.22.1.3.1.8.6 = INTEGER: 255 .1.3.6.1.4.1.2.3.51.2.22.1.3.1.8.7 = INTEGER: 255 .1.3.6.1.4.1.2.3.51.2.22.1.3.1.8.8 = INTEGER: 255 .1.3.6.1.4.1.2.3.51.2.22.1.3.1.9.1 = INTEGER: 3 .1.3.6.1.4.1.2.3.51.2.22.1.3.1.9.2 = INTEGER: 255 .1.3.6.1.4.1.2.3.51.2.22.1.3.1.9.3 = INTEGER: 3 .1.3.6.1.4.1.2.3.51.2.22.1.3.1.9.4 = INTEGER: 5 .1.3.6.1.4.1.2.3.51.2.22.1.3.1.9.5 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.22.1.3.1.9.6 = INTEGER: 255 .1.3.6.1.4.1.2.3.51.2.22.1.3.1.9.7 = INTEGER: 255 .1.3.6.1.4.1.2.3.51.2.22.1.3.1.9.8 = INTEGER: 2 .1.3.6.1.4.1.2.3.51.2.22.1.3.1.10.1 = INTEGER: 7 .1.3.6.1.4.1.2.3.51.2.22.1.3.1.10.2 = INTEGER: 255 .1.3.6.1.4.1.2.3.51.2.22.1.3.1.10.3 = INTEGER: 7 .1.3.6.1.4.1.2.3.51.2.22.1.3.1.10.4 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.22.1.3.1.10.5 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.22.1.3.1.10.6 = INTEGER: 255 .1.3.6.1.4.1.2.3.51.2.22.1.3.1.10.7 = INTEGER: 255 .1.3.6.1.4.1.2.3.51.2.22.1.3.1.10.8 = INTEGER: 3 .1.3.6.1.4.1.2.3.51.2.22.1.4.1.1.1.1 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.22.1.4.1.1.1.2 = INTEGER: 2 .1.3.6.1.4.1.2.3.51.2.22.1.4.1.1.1.3 = INTEGER: 3 .1.3.6.1.4.1.2.3.51.2.22.1.4.1.1.1.4 = INTEGER: 4 .1.3.6.1.4.1.2.3.51.2.22.1.4.1.1.1.5 = INTEGER: 5 .1.3.6.1.4.1.2.3.51.2.22.1.4.1.1.1.6 = INTEGER: 6 .1.3.6.1.4.1.2.3.51.2.22.1.4.1.1.1.7 = INTEGER: 7 .1.3.6.1.4.1.2.3.51.2.22.1.4.1.1.1.8 = INTEGER: 8 .1.3.6.1.4.1.2.3.51.2.22.1.4.1.1.2.1 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.22.1.4.1.1.2.2 = INTEGER: 2 .1.3.6.1.4.1.2.3.51.2.22.1.4.1.1.2.3 = INTEGER: 3 .1.3.6.1.4.1.2.3.51.2.22.1.4.1.1.2.4 = INTEGER: 4 .1.3.6.1.4.1.2.3.51.2.22.1.4.1.1.2.5 = INTEGER: 5 .1.3.6.1.4.1.2.3.51.2.22.1.4.1.1.2.6 = INTEGER: 6 .1.3.6.1.4.1.2.3.51.2.22.1.4.1.1.2.7 = INTEGER: 7 .1.3.6.1.4.1.2.3.51.2.22.1.4.1.1.2.8 = INTEGER: 8 .1.3.6.1.4.1.2.3.51.2.22.1.4.1.1.3.1 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.22.1.4.1.1.3.2 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.22.1.4.1.1.3.3 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.22.1.4.1.1.3.4 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.22.1.4.1.1.3.5 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.22.1.4.1.1.3.6 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.22.1.4.1.1.3.7 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.22.1.4.1.1.3.8 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.22.1.4.1.1.4.1 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.22.1.4.1.1.4.2 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.22.1.4.1.1.4.3 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.22.1.4.1.1.4.4 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.22.1.4.1.1.4.5 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.22.1.4.1.1.4.6 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.22.1.4.1.1.4.7 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.22.1.4.1.1.4.8 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.22.1.4.1.1.5.1 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.22.1.4.1.1.5.2 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.22.1.4.1.1.5.3 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.22.1.4.1.1.5.4 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.22.1.4.1.1.5.5 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.22.1.4.1.1.5.6 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.22.1.4.1.1.5.7 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.22.1.4.1.1.5.8 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.22.1.4.1.1.6.1 = STRING: "Mor38____FC3" .1.3.6.1.4.1.2.3.51.2.22.1.4.1.1.6.2 = STRING: "(No name)" .1.3.6.1.4.1.2.3.51.2.22.1.4.1.1.6.3 = STRING: "L99_P_____FC" .1.3.6.1.4.1.2.3.51.2.22.1.4.1.1.6.4 = STRING: "G71______SU" .1.3.6.1.4.1.2.3.51.2.22.1.4.1.1.6.5 = STRING: "J52_Lin_p64" .1.3.6.1.4.1.2.3.51.2.22.1.4.1.1.6.6 = STRING: "(No name)" .1.3.6.1.4.1.2.3.51.2.22.1.4.1.1.6.7 = STRING: "(No name)" .1.3.6.1.4.1.2.3.51.2.22.1.4.1.1.6.8 = STRING: "M01____RHEL4" .1.3.6.1.4.1.2.3.51.2.22.1.4.1.1.7.1 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.22.1.4.1.1.7.2 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.22.1.4.1.1.7.3 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.22.1.4.1.1.7.4 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.22.1.4.1.1.7.5 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.22.1.4.1.1.7.6 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.22.1.4.1.1.7.7 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.22.1.4.1.1.7.8 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.22.1.4.1.1.8.1 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.22.1.4.1.1.8.2 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.22.1.4.1.1.8.3 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.22.1.4.1.1.8.4 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.22.1.4.1.1.8.5 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.22.1.4.1.1.8.6 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.22.1.4.1.1.8.7 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.22.1.4.1.1.8.8 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.22.1.4.1.1.9.1 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.22.1.4.1.1.9.2 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.22.1.4.1.1.9.3 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.22.1.4.1.1.9.4 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.22.1.4.1.1.9.5 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.22.1.4.1.1.9.6 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.22.1.4.1.1.9.7 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.22.1.4.1.1.9.8 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.22.1.4.1.1.10.1 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.22.1.4.1.1.10.2 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.22.1.4.1.1.10.3 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.22.1.4.1.1.10.4 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.22.1.4.1.1.10.5 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.22.1.4.1.1.10.6 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.22.1.4.1.1.10.7 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.22.1.4.1.1.10.8 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.22.1.4.2.1.0 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.22.1.4.2.2.0 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.22.1.4.2.3.0 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.22.1.4.2.4.0 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.22.1.5.1.1.1.1 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.22.1.5.1.1.1.2 = INTEGER: 2 .1.3.6.1.4.1.2.3.51.2.22.1.5.1.1.1.3 = INTEGER: 3 .1.3.6.1.4.1.2.3.51.2.22.1.5.1.1.1.4 = INTEGER: 4 .1.3.6.1.4.1.2.3.51.2.22.1.5.1.1.1.5 = INTEGER: 5 .1.3.6.1.4.1.2.3.51.2.22.1.5.1.1.1.6 = INTEGER: 6 .1.3.6.1.4.1.2.3.51.2.22.1.5.1.1.1.7 = INTEGER: 7 .1.3.6.1.4.1.2.3.51.2.22.1.5.1.1.1.8 = INTEGER: 8 .1.3.6.1.4.1.2.3.51.2.22.1.5.1.1.2.1 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.22.1.5.1.1.2.2 = INTEGER: 2 .1.3.6.1.4.1.2.3.51.2.22.1.5.1.1.2.3 = INTEGER: 3 .1.3.6.1.4.1.2.3.51.2.22.1.5.1.1.2.4 = INTEGER: 4 .1.3.6.1.4.1.2.3.51.2.22.1.5.1.1.2.5 = INTEGER: 5 .1.3.6.1.4.1.2.3.51.2.22.1.5.1.1.2.6 = INTEGER: 6 .1.3.6.1.4.1.2.3.51.2.22.1.5.1.1.2.7 = INTEGER: 7 .1.3.6.1.4.1.2.3.51.2.22.1.5.1.1.2.8 = INTEGER: 8 .1.3.6.1.4.1.2.3.51.2.22.1.5.1.1.3.1 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.22.1.5.1.1.3.2 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.22.1.5.1.1.3.3 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.22.1.5.1.1.3.4 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.22.1.5.1.1.3.5 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.22.1.5.1.1.3.6 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.22.1.5.1.1.3.7 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.22.1.5.1.1.3.8 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.22.1.5.1.1.4.1 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.22.1.5.1.1.4.2 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.22.1.5.1.1.4.3 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.22.1.5.1.1.4.4 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.22.1.5.1.1.4.5 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.22.1.5.1.1.4.6 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.22.1.5.1.1.4.7 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.22.1.5.1.1.4.8 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.22.1.5.1.1.5.1 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.22.1.5.1.1.5.2 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.22.1.5.1.1.5.3 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.22.1.5.1.1.5.4 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.22.1.5.1.1.5.5 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.22.1.5.1.1.5.6 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.22.1.5.1.1.5.7 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.22.1.5.1.1.5.8 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.22.1.5.1.1.6.1 = STRING: "Mor38____FC3" .1.3.6.1.4.1.2.3.51.2.22.1.5.1.1.6.2 = STRING: "(No name)" .1.3.6.1.4.1.2.3.51.2.22.1.5.1.1.6.3 = STRING: "L99_P_____FC" .1.3.6.1.4.1.2.3.51.2.22.1.5.1.1.6.4 = STRING: "G71______SU" .1.3.6.1.4.1.2.3.51.2.22.1.5.1.1.6.5 = STRING: "J52_Lin_p64" .1.3.6.1.4.1.2.3.51.2.22.1.5.1.1.6.6 = STRING: "(No name)" .1.3.6.1.4.1.2.3.51.2.22.1.5.1.1.6.7 = STRING: "(No name)" .1.3.6.1.4.1.2.3.51.2.22.1.5.1.1.6.8 = STRING: "M01____RHEL4" .1.3.6.1.4.1.2.3.51.2.22.1.5.1.1.7.1 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.22.1.5.1.1.7.2 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.22.1.5.1.1.7.3 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.22.1.5.1.1.7.4 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.22.1.5.1.1.7.5 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.22.1.5.1.1.7.6 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.22.1.5.1.1.7.7 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.22.1.5.1.1.7.8 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.22.1.5.1.1.8.1 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.22.1.5.1.1.8.2 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.22.1.5.1.1.8.3 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.22.1.5.1.1.8.4 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.22.1.5.1.1.8.5 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.22.1.5.1.1.8.6 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.22.1.5.1.1.8.7 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.22.1.5.1.1.8.8 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.22.1.5.1.1.9.1 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.22.1.5.1.1.9.2 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.22.1.5.1.1.9.3 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.22.1.5.1.1.9.4 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.22.1.5.1.1.9.5 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.22.1.5.1.1.9.6 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.22.1.5.1.1.9.7 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.22.1.5.1.1.9.8 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.22.1.5.1.1.10.1 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.22.1.5.1.1.10.2 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.22.1.5.1.1.10.3 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.22.1.5.1.1.10.4 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.22.1.5.1.1.10.5 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.22.1.5.1.1.10.6 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.22.1.5.1.1.10.7 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.22.1.5.1.1.10.8 = INTEGER: 2 .1.3.6.1.4.1.2.3.51.2.22.1.5.1.1.11.1 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.22.1.5.1.1.11.2 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.22.1.5.1.1.11.3 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.22.1.5.1.1.11.4 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.22.1.5.1.1.11.5 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.22.1.5.1.1.11.6 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.22.1.5.1.1.11.7 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.22.1.5.1.1.11.8 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.22.1.5.1.1.12.1 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.22.1.5.1.1.12.2 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.22.1.5.1.1.12.3 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.22.1.5.1.1.12.4 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.22.1.5.1.1.12.5 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.22.1.5.1.1.12.6 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.22.1.5.1.1.12.7 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.22.1.5.1.1.12.8 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.22.1.5.1.1.13.1 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.22.1.5.1.1.13.2 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.22.1.5.1.1.13.3 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.22.1.5.1.1.13.4 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.22.1.5.1.1.13.5 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.22.1.5.1.1.13.6 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.22.1.5.1.1.13.7 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.22.1.5.1.1.13.8 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.22.1.5.1.1.14.1 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.22.1.5.1.1.14.2 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.22.1.5.1.1.14.3 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.22.1.5.1.1.14.4 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.22.1.5.1.1.14.5 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.22.1.5.1.1.14.6 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.22.1.5.1.1.14.7 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.22.1.5.1.1.14.8 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.22.1.5.1.1.15.1 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.22.1.5.1.1.15.2 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.22.1.5.1.1.15.3 = INTEGER: 2 .1.3.6.1.4.1.2.3.51.2.22.1.5.1.1.15.4 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.22.1.5.1.1.15.5 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.22.1.5.1.1.15.6 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.22.1.5.1.1.15.7 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.22.1.5.1.1.15.8 = INTEGER: 3 .1.3.6.1.4.1.2.3.51.2.22.1.5.1.1.16.1 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.22.1.5.1.1.16.2 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.22.1.5.1.1.16.3 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.22.1.5.1.1.16.4 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.22.1.5.1.1.16.5 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.22.1.5.1.1.16.6 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.22.1.5.1.1.16.7 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.22.1.5.1.1.16.8 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.22.1.5.2.1.1.1 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.22.1.5.2.1.1.2 = INTEGER: 2 .1.3.6.1.4.1.2.3.51.2.22.1.5.2.1.1.3 = INTEGER: 3 .1.3.6.1.4.1.2.3.51.2.22.1.5.2.1.1.4 = INTEGER: 4 .1.3.6.1.4.1.2.3.51.2.22.1.5.2.1.1.5 = INTEGER: 5 .1.3.6.1.4.1.2.3.51.2.22.1.5.2.1.1.6 = INTEGER: 6 .1.3.6.1.4.1.2.3.51.2.22.1.5.2.1.1.7 = INTEGER: 7 .1.3.6.1.4.1.2.3.51.2.22.1.5.2.1.1.8 = INTEGER: 8 .1.3.6.1.4.1.2.3.51.2.22.1.5.2.1.2.1 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.22.1.5.2.1.2.2 = INTEGER: 2 .1.3.6.1.4.1.2.3.51.2.22.1.5.2.1.2.3 = INTEGER: 3 .1.3.6.1.4.1.2.3.51.2.22.1.5.2.1.2.4 = INTEGER: 4 .1.3.6.1.4.1.2.3.51.2.22.1.5.2.1.2.5 = INTEGER: 5 .1.3.6.1.4.1.2.3.51.2.22.1.5.2.1.2.6 = INTEGER: 6 .1.3.6.1.4.1.2.3.51.2.22.1.5.2.1.2.7 = INTEGER: 7 .1.3.6.1.4.1.2.3.51.2.22.1.5.2.1.2.8 = INTEGER: 8 .1.3.6.1.4.1.2.3.51.2.22.1.5.2.1.3.1 = STRING: "Good" .1.3.6.1.4.1.2.3.51.2.22.1.5.2.1.3.2 = STRING: "(No severity)" .1.3.6.1.4.1.2.3.51.2.22.1.5.2.1.3.3 = STRING: "Good" .1.3.6.1.4.1.2.3.51.2.22.1.5.2.1.3.4 = STRING: "Good" .1.3.6.1.4.1.2.3.51.2.22.1.5.2.1.3.5 = STRING: "Good" .1.3.6.1.4.1.2.3.51.2.22.1.5.2.1.3.6 = STRING: "(No severity)" .1.3.6.1.4.1.2.3.51.2.22.1.5.2.1.3.7 = STRING: "(No severity)" .1.3.6.1.4.1.2.3.51.2.22.1.5.2.1.3.8 = STRING: "Good" .1.3.6.1.4.1.2.3.51.2.22.1.5.2.1.4.1 = STRING: "No critical or warning events" .1.3.6.1.4.1.2.3.51.2.22.1.5.2.1.4.2 = STRING: "(No description)" .1.3.6.1.4.1.2.3.51.2.22.1.5.2.1.4.3 = STRING: "No critical or warning events" .1.3.6.1.4.1.2.3.51.2.22.1.5.2.1.4.4 = STRING: "No critical or warning events" .1.3.6.1.4.1.2.3.51.2.22.1.5.2.1.4.5 = STRING: "No critical or warning events" .1.3.6.1.4.1.2.3.51.2.22.1.5.2.1.4.6 = STRING: "(No description)" .1.3.6.1.4.1.2.3.51.2.22.1.5.2.1.4.7 = STRING: "(No description)" .1.3.6.1.4.1.2.3.51.2.22.1.5.2.1.4.8 = STRING: "No critical or warning events" .1.3.6.1.4.1.2.3.51.2.22.1.5.3.1.1.1 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.22.1.5.3.1.1.2 = INTEGER: 2 .1.3.6.1.4.1.2.3.51.2.22.1.5.3.1.1.3 = INTEGER: 3 .1.3.6.1.4.1.2.3.51.2.22.1.5.3.1.1.4 = INTEGER: 4 .1.3.6.1.4.1.2.3.51.2.22.1.5.3.1.1.5 = INTEGER: 5 .1.3.6.1.4.1.2.3.51.2.22.1.5.3.1.1.6 = INTEGER: 6 .1.3.6.1.4.1.2.3.51.2.22.1.5.3.1.1.7 = INTEGER: 7 .1.3.6.1.4.1.2.3.51.2.22.1.5.3.1.1.8 = INTEGER: 8 .1.3.6.1.4.1.2.3.51.2.22.1.5.3.1.2.1 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.22.1.5.3.1.2.2 = INTEGER: 2 .1.3.6.1.4.1.2.3.51.2.22.1.5.3.1.2.3 = INTEGER: 3 .1.3.6.1.4.1.2.3.51.2.22.1.5.3.1.2.4 = INTEGER: 4 .1.3.6.1.4.1.2.3.51.2.22.1.5.3.1.2.5 = INTEGER: 5 .1.3.6.1.4.1.2.3.51.2.22.1.5.3.1.2.6 = INTEGER: 6 .1.3.6.1.4.1.2.3.51.2.22.1.5.3.1.2.7 = INTEGER: 7 .1.3.6.1.4.1.2.3.51.2.22.1.5.3.1.2.8 = INTEGER: 8 .1.3.6.1.4.1.2.3.51.2.22.1.5.3.1.3.1 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.22.1.5.3.1.3.2 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.22.1.5.3.1.3.3 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.22.1.5.3.1.3.4 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.22.1.5.3.1.3.5 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.22.1.5.3.1.3.6 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.22.1.5.3.1.3.7 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.22.1.5.3.1.3.8 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.22.1.5.3.1.4.1 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.22.1.5.3.1.4.2 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.22.1.5.3.1.4.3 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.22.1.5.3.1.4.4 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.22.1.5.3.1.4.5 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.22.1.5.3.1.4.6 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.22.1.5.3.1.4.7 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.22.1.5.3.1.4.8 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.22.1.5.3.1.5.1 = STRING: "Mor38____FC3" .1.3.6.1.4.1.2.3.51.2.22.1.5.3.1.5.2 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.3.1.5.3 = STRING: "L99_P_____FC" .1.3.6.1.4.1.2.3.51.2.22.1.5.3.1.5.4 = STRING: "G71______SU" .1.3.6.1.4.1.2.3.51.2.22.1.5.3.1.5.5 = STRING: "J52_Lin_p64" .1.3.6.1.4.1.2.3.51.2.22.1.5.3.1.5.6 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.3.1.5.7 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.3.1.5.8 = STRING: "M01____RHEL4" .1.3.6.1.4.1.2.3.51.2.22.1.5.3.1.6.1 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.3.1.6.2 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.3.1.6.3 = STRING: "44.00 Centigrade" .1.3.6.1.4.1.2.3.51.2.22.1.5.3.1.6.4 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.3.1.6.5 = STRING: "73.00 Centigrade" .1.3.6.1.4.1.2.3.51.2.22.1.5.3.1.6.6 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.3.1.6.7 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.3.1.6.8 = STRING: "28.00 Centigrade" .1.3.6.1.4.1.2.3.51.2.22.1.5.3.1.7.1 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.3.1.7.2 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.3.1.7.3 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.3.1.7.4 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.3.1.7.5 = STRING: "69.00 Centigrade" .1.3.6.1.4.1.2.3.51.2.22.1.5.3.1.7.6 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.3.1.7.7 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.3.1.7.8 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.3.1.8.1 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.3.1.8.2 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.3.1.8.3 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.3.1.8.4 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.3.1.8.5 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.3.1.8.6 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.3.1.8.7 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.3.1.8.8 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.3.1.9.1 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.3.1.9.2 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.3.1.9.3 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.3.1.9.4 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.3.1.9.5 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.3.1.9.6 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.3.1.9.7 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.3.1.9.8 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.3.1.10.1 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.3.1.10.2 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.3.1.10.3 = STRING: "35.00 Centigrade" .1.3.6.1.4.1.2.3.51.2.22.1.5.3.1.10.4 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.3.1.10.5 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.3.1.10.6 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.3.1.10.7 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.3.1.10.8 = STRING: "44.00 Centigrade" .1.3.6.1.4.1.2.3.51.2.22.1.5.3.1.11.1 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.22.1.5.3.1.11.2 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.22.1.5.3.1.11.3 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.22.1.5.3.1.11.4 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.22.1.5.3.1.11.5 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.22.1.5.3.1.11.6 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.22.1.5.3.1.11.7 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.22.1.5.3.1.11.8 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.22.1.5.3.1.12.1 = STRING: "CPU1 TEMP = +45.00 Centigrade" .1.3.6.1.4.1.2.3.51.2.22.1.5.3.1.12.2 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.3.1.12.3 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.3.1.12.4 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.3.1.12.5 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.3.1.12.6 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.3.1.12.7 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.3.1.12.8 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.3.1.13.1 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.3.1.13.2 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.3.1.13.3 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.3.1.13.4 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.3.1.13.5 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.3.1.13.6 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.3.1.13.7 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.3.1.13.8 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.3.1.14.1 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.3.1.14.2 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.3.1.14.3 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.3.1.14.4 = STRING: "CPU1 TEMP = +67.00 Centigrade" .1.3.6.1.4.1.2.3.51.2.22.1.5.3.1.14.5 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.3.1.14.6 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.3.1.14.7 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.3.1.14.8 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.3.1.15.1 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.3.1.15.2 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.3.1.15.3 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.3.1.15.4 = STRING: "CPU2 TEMP = +55.00 Centigrade" .1.3.6.1.4.1.2.3.51.2.22.1.5.3.1.15.5 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.3.1.15.6 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.3.1.15.7 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.3.1.15.8 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.3.1.16.1 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.3.1.16.2 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.3.1.16.3 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.3.1.16.4 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.3.1.16.5 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.3.1.16.6 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.3.1.16.7 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.3.1.16.8 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.3.1.17.1 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.3.1.17.2 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.3.1.17.3 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.3.1.17.4 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.3.1.17.5 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.3.1.17.6 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.3.1.17.7 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.3.1.17.8 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.1.1 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.1.2 = INTEGER: 2 .1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.1.3 = INTEGER: 3 .1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.1.4 = INTEGER: 4 .1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.1.5 = INTEGER: 5 .1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.1.6 = INTEGER: 6 .1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.1.7 = INTEGER: 7 .1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.1.8 = INTEGER: 8 .1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.2.1 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.2.2 = INTEGER: 2 .1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.2.3 = INTEGER: 3 .1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.2.4 = INTEGER: 4 .1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.2.5 = INTEGER: 5 .1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.2.6 = INTEGER: 6 .1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.2.7 = INTEGER: 7 .1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.2.8 = INTEGER: 8 .1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.3.1 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.3.2 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.3.3 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.3.4 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.3.5 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.3.6 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.3.7 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.3.8 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.4.1 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.4.2 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.4.3 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.4.4 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.4.5 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.4.6 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.4.7 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.4.8 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.5.1 = STRING: "Mor38____FC3" .1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.5.2 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.5.3 = STRING: "L99_P_____FC" .1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.5.4 = STRING: "G71______SU" .1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.5.5 = STRING: "J52_Lin_p64" .1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.5.6 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.5.7 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.5.8 = STRING: "M01____RHEL4" .1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.6.1 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.6.2 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.6.3 = STRING: "95.00 Centigrade" .1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.6.4 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.6.5 = STRING: "105.00 Centigrade" .1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.6.6 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.6.7 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.6.8 = STRING: "80.00 Centigrade" .1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.7.1 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.7.2 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.7.3 = STRING: "85.00 Centigrade" .1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.7.4 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.7.5 = STRING: "90.00 Centigrade" .1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.7.6 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.7.7 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.7.8 = STRING: "73.00 Centigrade" .1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.8.1 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.8.2 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.8.3 = STRING: "78.00 Centigrade" .1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.8.4 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.8.5 = STRING: "88.00 Centigrade" .1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.8.6 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.8.7 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.8.8 = STRING: "71.00 Centigrade" .1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.9.1 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.9.2 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.9.3 = STRING: "95.00 Centigrade" .1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.9.4 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.9.5 = STRING: "105.00 Centigrade" .1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.9.6 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.9.7 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.9.8 = STRING: "80.00 Centigrade" .1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.10.1 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.10.2 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.10.3 = STRING: "85.00 Centigrade" .1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.10.4 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.10.5 = STRING: "90.00 Centigrade" .1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.10.6 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.10.7 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.10.8 = STRING: "73.00 Centigrade" .1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.11.1 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.11.2 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.11.3 = STRING: "78.00 Centigrade" .1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.11.4 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.11.5 = STRING: "88.00 Centigrade" .1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.11.6 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.11.7 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.11.8 = STRING: "71.00 Centigrade" .1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.12.1 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.12.2 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.12.3 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.12.4 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.12.5 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.12.6 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.12.7 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.12.8 = STRING: "80.00 Centigrade" .1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.13.1 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.13.2 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.13.3 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.13.4 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.13.5 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.13.6 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.13.7 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.13.8 = STRING: "73.00 Centigrade" .1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.14.1 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.14.2 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.14.3 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.14.4 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.14.5 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.14.6 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.14.7 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.14.8 = STRING: "71.00 Centigrade" .1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.15.1 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.15.2 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.15.3 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.15.4 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.15.5 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.15.6 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.15.7 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.15.8 = STRING: "80.00 Centigrade" .1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.16.1 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.16.2 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.16.3 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.16.4 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.16.5 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.16.6 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.16.7 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.16.8 = STRING: "73.00 Centigrade" .1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.17.1 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.17.2 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.17.3 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.17.4 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.17.5 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.17.6 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.17.7 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.17.8 = STRING: "71.00 Centigrade" .1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.18.1 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.18.2 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.18.3 = STRING: "64.00 Centigrade" .1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.18.4 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.18.5 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.18.6 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.18.7 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.18.8 = STRING: "65.00 Centigrade" .1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.19.1 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.19.2 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.19.3 = STRING: "56.00 Centigrade" .1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.19.4 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.19.5 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.19.6 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.19.7 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.19.8 = STRING: "57.00 Centigrade" .1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.20.1 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.20.2 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.20.3 = STRING: "49.00 Centigrade" .1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.20.4 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.20.5 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.20.6 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.20.7 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.20.8 = STRING: "55.00 Centigrade" .1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.21.1 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.21.2 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.21.3 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.21.4 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.21.5 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.21.6 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.21.7 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.21.8 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.22.1 = STRING: "CPU1 TEMP = +85.00 Centigrade" .1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.22.2 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.22.3 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.22.4 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.22.5 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.22.6 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.22.7 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.22.8 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.23.1 = STRING: "CPU1 TEMP = +70.00 Centigrade" .1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.23.2 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.23.3 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.23.4 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.23.5 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.23.6 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.23.7 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.23.8 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.24.1 = STRING: "CPU1 TEMP = +66.00 Centigrade" .1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.24.2 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.24.3 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.24.4 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.24.5 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.24.6 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.24.7 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.24.8 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.25.1 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.25.2 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.25.3 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.25.4 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.25.5 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.25.6 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.25.7 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.25.8 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.26.1 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.26.2 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.26.3 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.26.4 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.26.5 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.26.6 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.26.7 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.26.8 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.27.1 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.27.2 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.27.3 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.27.4 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.27.5 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.27.6 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.27.7 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.27.8 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.28.1 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.28.2 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.28.3 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.28.4 = STRING: "CPU1 TEMP = +95.00 Centigrade" .1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.28.5 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.28.6 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.28.7 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.28.8 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.29.1 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.29.2 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.29.3 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.29.4 = STRING: "CPU1 TEMP = +85.00 Centigrade" .1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.29.5 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.29.6 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.29.7 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.29.8 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.30.1 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.30.2 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.30.3 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.30.4 = STRING: "CPU1 TEMP = +78.00 Centigrade" .1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.30.5 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.30.6 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.30.7 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.30.8 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.31.1 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.31.2 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.31.3 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.31.4 = STRING: "CPU2 TEMP = +95.00 Centigrade" .1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.31.5 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.31.6 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.31.7 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.31.8 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.32.1 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.32.2 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.32.3 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.32.4 = STRING: "CPU2 TEMP = +85.00 Centigrade" .1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.32.5 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.32.6 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.32.7 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.32.8 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.33.1 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.33.2 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.33.3 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.33.4 = STRING: "CPU2 TEMP = +78.00 Centigrade" .1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.33.5 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.33.6 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.33.7 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.33.8 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.34.1 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.34.2 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.34.3 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.34.4 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.34.5 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.34.6 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.34.7 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.34.8 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.35.1 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.35.2 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.35.3 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.35.4 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.35.5 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.35.6 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.35.7 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.35.8 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.36.1 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.36.2 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.36.3 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.36.4 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.36.5 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.36.6 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.36.7 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.36.8 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.37.1 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.37.2 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.37.3 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.37.4 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.37.5 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.37.6 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.37.7 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.37.8 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.38.1 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.38.2 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.38.3 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.38.4 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.38.5 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.38.6 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.38.7 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.38.8 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.39.1 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.39.2 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.39.3 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.39.4 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.39.5 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.39.6 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.39.7 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.4.1.39.8 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.1.1 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.1.2 = INTEGER: 2 .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.1.3 = INTEGER: 3 .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.1.4 = INTEGER: 4 .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.1.5 = INTEGER: 5 .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.1.6 = INTEGER: 6 .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.1.7 = INTEGER: 7 .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.1.8 = INTEGER: 8 .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.2.1 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.2.2 = INTEGER: 2 .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.2.3 = INTEGER: 3 .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.2.4 = INTEGER: 4 .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.2.5 = INTEGER: 5 .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.2.6 = INTEGER: 6 .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.2.7 = INTEGER: 7 .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.2.8 = INTEGER: 8 .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.3.1 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.3.2 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.3.3 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.3.4 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.3.5 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.3.6 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.3.7 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.3.8 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.4.1 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.4.2 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.4.3 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.4.4 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.4.5 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.4.6 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.4.7 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.4.8 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.5.1 = STRING: "Mor38____FC3" .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.5.2 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.5.3 = STRING: "L99_P_____FC" .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.5.4 = STRING: "G71______SU" .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.5.5 = STRING: "J52_Lin_p64" .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.5.6 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.5.7 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.5.8 = STRING: "M01____RHEL4" .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.6.1 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.6.2 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.6.3 = STRING: "+5.16 Volts" .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.6.4 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.6.5 = STRING: "+5.04 Volts" .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.6.6 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.6.7 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.6.8 = STRING: "+5.04 Volts" .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.7.1 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.7.2 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.7.3 = STRING: "+3.35 Volts" .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.7.4 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.7.5 = STRING: "+3.33 Volts" .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.7.6 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.7.7 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.7.8 = STRING: "+3.28 Volts" .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.8.1 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.8.2 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.8.3 = STRING: "+12.25 Volts" .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.8.4 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.8.5 = STRING: "+12.28 Volts" .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.8.6 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.8.7 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.8.8 = STRING: "+12.34 Volts" .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.10.1 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.10.2 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.10.3 = STRING: "+2.58 Volts" .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.10.4 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.10.5 = STRING: "+2.50 Volts" .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.10.6 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.10.7 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.10.8 = STRING: "+2.55 Volts" .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.11.1 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.11.2 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.11.3 = STRING: "+1.51 Volts" .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.11.4 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.11.5 = STRING: "+1.61 Volts" .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.11.6 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.11.7 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.11.8 = STRING: "+1.52 Volts" .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.12.1 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.12.2 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.12.3 = STRING: "+1.29 Volts" .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.12.4 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.12.5 = STRING: "+1.25 Volts" .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.12.6 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.12.7 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.12.8 = STRING: "+1.27 Volts" .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.13.1 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.13.2 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.13.3 = STRING: "+1.50 Volts" .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.13.4 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.13.5 = STRING: "(No voltage)" .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.13.6 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.13.7 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.13.8 = STRING: "+1.47 Volts" .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.14.1 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.14.2 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.14.3 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.14.4 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.14.5 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.14.6 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.14.7 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.14.8 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.15.1 = STRING: "12VSB Sense = +12.17 Volts" .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.15.2 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.15.3 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.15.4 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.15.5 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.15.6 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.15.7 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.15.8 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.16.1 = STRING: "1.8VSB Sense = +1.83 Volts" .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.16.2 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.16.3 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.16.4 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.16.5 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.16.6 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.16.7 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.16.8 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.17.1 = STRING: "12V Sense = +12.39 Volts" .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.17.2 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.17.3 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.17.4 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.17.5 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.17.6 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.17.7 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.17.8 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.18.1 = STRING: "5V Sense = +5.06 Volts" .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.18.2 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.18.3 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.18.4 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.18.5 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.18.6 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.18.7 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.18.8 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.19.1 = STRING: "3.3V Sense = +3.33 Volts" .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.19.2 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.19.3 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.19.4 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.19.5 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.19.6 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.19.7 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.19.8 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.20.1 = STRING: "1.8V Sense = +1.80 Volts" .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.20.2 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.20.3 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.20.4 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.20.5 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.20.6 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.20.7 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.20.8 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.21.1 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.21.2 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.21.3 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.21.4 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.21.5 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.21.6 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.21.7 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.21.8 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.22.1 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.22.2 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.22.3 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.22.4 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.22.5 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.22.6 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.22.7 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.22.8 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.23.1 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.23.2 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.23.3 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.23.4 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.23.5 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.23.6 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.23.7 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.23.8 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.24.1 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.24.2 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.24.3 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.24.4 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.24.5 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.24.6 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.24.7 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.24.8 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.25.1 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.25.2 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.25.3 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.25.4 = STRING: "CPU 2 VCore = +1.31 Volts" .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.25.5 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.25.6 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.25.7 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.25.8 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.26.1 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.26.2 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.26.3 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.26.4 = STRING: "CPU 1 VCore = +1.31 Volts" .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.26.5 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.26.6 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.26.7 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.26.8 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.27.1 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.27.2 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.27.3 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.27.4 = STRING: "VBATT Sense = +3.23 Volts" .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.27.5 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.27.6 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.27.7 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.27.8 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.28.1 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.28.2 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.28.3 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.28.4 = STRING: "12VSB Sense = +11.96 Volts" .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.28.5 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.28.6 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.28.7 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.28.8 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.29.1 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.29.2 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.29.3 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.29.4 = STRING: "5VSB Sense = +5.04 Volts" .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.29.5 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.29.6 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.29.7 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.29.8 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.30.1 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.30.2 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.30.3 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.30.4 = STRING: "3.3VSB Sense = +3.32 Volts" .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.30.5 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.30.6 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.30.7 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.30.8 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.31.1 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.31.2 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.31.3 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.31.4 = STRING: "2.5VSB Sense = +2.53 Volts" .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.31.5 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.31.6 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.31.7 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.31.8 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.32.1 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.32.2 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.32.3 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.32.4 = STRING: "1.5VSB Sense = +1.49 Volts" .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.32.5 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.32.6 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.32.7 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.32.8 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.33.1 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.33.2 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.33.3 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.33.4 = STRING: "1.2VSB Sense = +1.23 Volts" .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.33.5 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.33.6 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.33.7 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.33.8 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.34.1 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.34.2 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.34.3 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.34.4 = STRING: "-5V Sense = -4.59 Volts" .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.34.5 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.34.6 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.34.7 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.34.8 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.35.1 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.35.2 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.35.3 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.35.4 = STRING: "12V Sense = +12.27 Volts" .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.35.5 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.35.6 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.35.7 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.35.8 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.36.1 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.36.2 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.36.3 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.36.4 = STRING: "5V Sense = +4.96 Volts" .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.36.5 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.36.6 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.36.7 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.36.8 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.37.1 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.37.2 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.37.3 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.37.4 = STRING: "3.3V Sense = +3.32 Volts" .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.37.5 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.37.6 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.37.7 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.37.8 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.38.1 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.38.2 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.38.3 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.38.4 = STRING: "2.5V Sense = +2.48 Volts" .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.38.5 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.38.6 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.38.7 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.38.8 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.39.1 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.39.2 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.39.3 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.39.4 = STRING: "1.8V Sense = +1.79 Volts" .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.39.5 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.39.6 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.39.7 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.39.8 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.40.1 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.40.2 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.40.3 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.40.4 = STRING: "1.5V Sense = +1.48 Volts" .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.40.5 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.40.6 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.40.7 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.40.8 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.41.1 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.41.2 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.41.3 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.41.4 = STRING: "1.2V Sense = +1.18 Volts" .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.41.5 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.41.6 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.41.7 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.41.8 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.42.1 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.42.2 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.42.3 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.42.4 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.42.5 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.42.6 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.42.7 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.42.8 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.43.1 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.43.2 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.43.3 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.43.4 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.43.5 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.43.6 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.43.7 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.43.8 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.44.1 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.44.2 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.44.3 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.44.4 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.44.5 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.44.6 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.44.7 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.44.8 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.1.1 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.1.2 = INTEGER: 2 .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.1.3 = INTEGER: 3 .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.1.4 = INTEGER: 4 .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.1.5 = INTEGER: 5 .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.1.6 = INTEGER: 6 .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.1.7 = INTEGER: 7 .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.1.8 = INTEGER: 8 .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.2.1 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.2.2 = INTEGER: 2 .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.2.3 = INTEGER: 3 .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.2.4 = INTEGER: 4 .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.2.5 = INTEGER: 5 .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.2.6 = INTEGER: 6 .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.2.7 = INTEGER: 7 .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.2.8 = INTEGER: 8 .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.3.1 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.3.2 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.3.3 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.3.4 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.3.5 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.3.6 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.3.7 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.3.8 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.4.1 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.4.2 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.4.3 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.4.4 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.4.5 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.4.6 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.4.7 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.4.8 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.5.1 = STRING: "Mor38____FC3" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.5.2 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.5.3 = STRING: "L99_P_____FC" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.5.4 = STRING: "G71______SU" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.5.5 = STRING: "J52_Lin_p64" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.5.6 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.5.7 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.5.8 = STRING: "M01____RHEL4" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.6.1 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.6.2 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.6.3 = STRING: "+5.50 Volts" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.6.4 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.6.5 = STRING: "+5.50 Volts" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.6.6 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.6.7 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.6.8 = STRING: "+5.35 Volts" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.7.1 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.7.2 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.7.3 = STRING: "+4.40 Volts" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.7.4 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.7.5 = STRING: "+4.40 Volts" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.7.6 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.7.7 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.7.8 = STRING: "+4.65 Volts" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.8.1 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.8.2 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.8.3 = STRING: "+3.63 Volts" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.8.4 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.8.5 = STRING: "+3.63 Volts" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.8.6 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.8.7 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.8.8 = STRING: "+3.52 Volts" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.9.1 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.9.2 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.9.3 = STRING: "+2.97 Volts" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.9.4 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.9.5 = STRING: "+2.97 Volts" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.9.6 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.9.7 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.9.8 = STRING: "+3.06 Volts" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.10.1 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.10.2 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.10.3 = STRING: "+13.20 Volts" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.10.4 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.10.5 = STRING: "+13.20 Volts" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.10.6 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.10.7 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.10.8 = STRING: "+12.91 Volts" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.11.1 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.11.2 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.11.3 = STRING: "+10.80 Volts" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.11.4 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.11.5 = STRING: "+10.80 Volts" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.11.6 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.11.7 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.11.8 = STRING: "+11.27 Volts" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.14.1 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.14.2 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.14.3 = STRING: "+2.75 Volts" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.14.4 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.14.5 = STRING: "+2.75 Volts" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.14.6 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.14.7 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.14.8 = STRING: "+2.67 Volts" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.15.1 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.15.2 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.15.3 = STRING: "+2.25 Volts" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.15.4 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.15.5 = STRING: "+2.25 Volts" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.15.6 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.15.7 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.15.8 = STRING: "+2.32 Volts" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.16.1 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.16.2 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.16.3 = STRING: "+1.68 Volts" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.16.4 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.16.5 = STRING: "+1.68 Volts" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.16.6 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.16.7 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.16.8 = STRING: "+1.60 Volts" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.17.1 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.17.2 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.17.3 = STRING: "+1.32 Volts" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.17.4 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.17.5 = STRING: "+1.32 Volts" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.17.6 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.17.7 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.17.8 = STRING: "+1.39 Volts" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.18.1 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.18.2 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.18.3 = STRING: "+1.40 Volts" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.18.4 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.18.5 = STRING: "+1.40 Volts" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.18.6 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.18.7 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.18.8 = STRING: "+1.33 Volts" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.19.1 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.19.2 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.19.3 = STRING: "+1.10 Volts" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.19.4 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.19.5 = STRING: "+1.10 Volts" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.19.6 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.19.7 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.19.8 = STRING: "+1.16 Volts" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.22.1 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.22.2 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.22.3 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.22.4 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.22.5 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.22.6 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.22.7 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.22.8 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.23.1 = STRING: "12VSB Sense Hi = +13.19 Volts" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.23.2 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.23.3 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.23.4 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.23.5 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.23.6 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.23.7 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.23.8 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.24.1 = STRING: "12VSB Sense Low = +10.74 Volts" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.24.2 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.24.3 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.24.4 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.24.5 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.24.6 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.24.7 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.24.8 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.25.1 = STRING: "1.8VSB Sense Hi = +1.97 Volts" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.25.2 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.25.3 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.25.4 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.25.5 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.25.6 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.25.7 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.25.8 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.26.1 = STRING: "1.8VSB Sense Low = +1.61 Volts" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.26.2 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.26.3 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.26.4 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.26.5 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.26.6 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.26.7 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.26.8 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.27.1 = STRING: "12V Sense Hi = +13.21 Volts" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.27.2 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.27.3 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.27.4 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.27.5 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.27.6 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.27.7 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.27.8 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.28.1 = STRING: "12V Sense Low = +10.79 Volts" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.28.2 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.28.3 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.28.4 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.28.5 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.28.6 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.28.7 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.28.8 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.29.1 = STRING: "5V Sense Hi = +5.48 Volts" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.29.2 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.29.3 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.29.4 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.29.5 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.29.6 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.29.7 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.29.8 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.30.1 = STRING: "5V Sense Low = +4.39 Volts" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.30.2 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.30.3 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.30.4 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.30.5 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.30.6 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.30.7 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.30.8 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.31.1 = STRING: "3.3V Sense Hi = +3.62 Volts" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.31.2 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.31.3 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.31.4 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.31.5 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.31.6 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.31.7 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.31.8 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.32.1 = STRING: "3.3V Sense Low = +2.96 Volts" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.32.2 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.32.3 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.32.4 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.32.5 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.32.6 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.32.7 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.32.8 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.33.1 = STRING: "1.8V Sense Hi = +1.97 Volts" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.33.2 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.33.3 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.33.4 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.33.5 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.33.6 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.33.7 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.33.8 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.34.1 = STRING: "1.8V Sense Low = +1.61 Volts" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.34.2 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.34.3 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.34.4 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.34.5 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.34.6 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.34.7 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.34.8 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.35.1 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.35.2 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.35.3 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.35.4 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.35.5 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.35.6 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.35.7 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.35.8 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.36.1 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.36.2 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.36.3 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.36.4 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.36.5 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.36.6 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.36.7 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.36.8 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.37.1 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.37.2 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.37.3 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.37.4 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.37.5 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.37.6 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.37.7 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.37.8 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.38.1 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.38.2 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.38.3 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.38.4 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.38.5 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.38.6 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.38.7 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.38.8 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.39.1 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.39.2 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.39.3 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.39.4 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.39.5 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.39.6 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.39.7 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.39.8 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.40.1 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.40.2 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.40.3 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.40.4 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.40.5 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.40.6 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.40.7 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.40.8 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.41.1 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.41.2 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.41.3 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.41.4 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.41.5 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.41.6 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.41.7 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.41.8 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.42.1 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.42.2 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.42.3 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.42.4 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.42.5 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.42.6 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.42.7 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.42.8 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.43.1 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.43.2 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.43.3 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.43.4 = STRING: "CPU 2 VCore Hi = +2.49 Volts" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.43.5 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.43.6 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.43.7 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.43.8 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.44.1 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.44.2 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.44.3 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.44.4 = STRING: "CPU 2 VCore Low = +0.00 Volts" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.44.5 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.44.6 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.44.7 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.44.8 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.45.1 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.45.2 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.45.3 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.45.4 = STRING: "CPU 1 VCore Hi = +2.98 Volts" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.45.5 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.45.6 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.45.7 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.45.8 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.46.1 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.46.2 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.46.3 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.46.4 = STRING: "CPU 1 VCore Low = +0.00 Volts" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.46.5 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.46.6 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.46.7 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.46.8 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.47.1 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.47.2 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.47.3 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.47.4 = STRING: "VBATT Sense Hi = +3.31 Volts" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.47.5 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.47.6 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.47.7 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.47.8 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.48.1 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.48.2 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.48.3 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.48.4 = STRING: "VBATT Sense Low = +2.71 Volts" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.48.5 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.48.6 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.48.7 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.48.8 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.49.1 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.49.2 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.49.3 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.49.4 = STRING: "12VSB Sense Hi = +13.20 Volts" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.49.5 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.49.6 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.49.7 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.49.8 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.50.1 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.50.2 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.50.3 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.50.4 = STRING: "12VSB Sense Low = +10.78 Volts" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.50.5 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.50.6 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.50.7 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.50.8 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.51.1 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.51.2 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.51.3 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.51.4 = STRING: "5VSB Sense Hi = +5.48 Volts" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.51.5 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.51.6 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.51.7 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.51.8 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.52.1 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.52.2 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.52.3 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.52.4 = STRING: "5VSB Sense Low = +4.50 Volts" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.52.5 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.52.6 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.52.7 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.52.8 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.53.1 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.53.2 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.53.3 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.53.4 = STRING: "3.3VSB Sense Hi = +3.65 Volts" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.53.5 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.53.6 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.53.7 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.53.8 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.54.1 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.54.2 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.54.3 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.54.4 = STRING: "3.3VSB Sense Low = +2.97 Volts" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.54.5 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.54.6 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.54.7 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.54.8 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.55.1 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.55.2 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.55.3 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.55.4 = STRING: "2.5VSB Sense Hi = +2.74 Volts" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.55.5 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.55.6 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.55.7 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.55.8 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.56.1 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.56.2 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.56.3 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.56.4 = STRING: "2.5VSB Sense Low = +2.25 Volts" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.56.5 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.56.6 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.56.7 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.56.8 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.57.1 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.57.2 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.57.3 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.57.4 = STRING: "1.5VSB Sense Hi = +1.64 Volts" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.57.5 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.57.6 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.57.7 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.57.8 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.58.1 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.58.2 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.58.3 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.58.4 = STRING: "1.5VSB Sense Low = +1.35 Volts" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.58.5 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.58.6 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.58.7 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.58.8 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.59.1 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.59.2 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.59.3 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.59.4 = STRING: "1.2VSB Sense Hi = +1.49 Volts" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.59.5 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.59.6 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.59.7 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.59.8 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.60.1 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.60.2 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.60.3 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.60.4 = STRING: "1.2VSB Sense Low = +1.12 Volts" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.60.5 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.60.6 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.60.7 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.60.8 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.61.1 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.61.2 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.61.3 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.61.4 = STRING: "-5V Sense Hi = -4.02 Volts" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.61.5 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.61.6 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.61.7 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.61.8 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.62.1 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.62.2 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.62.3 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.62.4 = STRING: "-5V Sense Low = -5.31 Volts" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.62.5 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.62.6 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.62.7 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.62.8 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.63.1 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.63.2 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.63.3 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.63.4 = STRING: "12V Sense Hi = +13.21 Volts" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.63.5 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.63.6 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.63.7 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.63.8 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.64.1 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.64.2 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.64.3 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.64.4 = STRING: "12V Sense Low = +10.79 Volts" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.64.5 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.64.6 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.64.7 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.64.8 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.65.1 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.65.2 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.65.3 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.65.4 = STRING: "5V Sense Hi = +5.48 Volts" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.65.5 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.65.6 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.65.7 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.65.8 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.66.1 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.66.2 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.66.3 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.66.4 = STRING: "5V Sense Low = +4.49 Volts" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.66.5 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.66.6 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.66.7 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.66.8 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.67.1 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.67.2 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.67.3 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.67.4 = STRING: "3.3V Sense Hi = +3.65 Volts" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.67.5 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.67.6 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.67.7 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.67.8 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.68.1 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.68.2 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.68.3 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.68.4 = STRING: "3.3V Sense Low = +2.97 Volts" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.68.5 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.68.6 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.68.7 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.68.8 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.69.1 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.69.2 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.69.3 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.69.4 = STRING: "2.5V Sense Hi = +2.74 Volts" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.69.5 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.69.6 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.69.7 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.69.8 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.70.1 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.70.2 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.70.3 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.70.4 = STRING: "2.5V Sense Low = +2.24 Volts" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.70.5 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.70.6 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.70.7 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.70.8 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.71.1 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.71.2 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.71.3 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.71.4 = STRING: "1.8V Sense Hi = +1.97 Volts" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.71.5 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.71.6 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.71.7 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.71.8 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.72.1 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.72.2 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.72.3 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.72.4 = STRING: "1.8V Sense Low = +1.61 Volts" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.72.5 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.72.6 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.72.7 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.72.8 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.73.1 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.73.2 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.73.3 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.73.4 = STRING: "1.5V Sense Hi = +1.60 Volts" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.73.5 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.73.6 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.73.7 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.73.8 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.74.1 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.74.2 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.74.3 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.74.4 = STRING: "1.5V Sense Low = +1.31 Volts" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.74.5 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.74.6 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.74.7 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.74.8 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.75.1 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.75.2 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.75.3 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.75.4 = STRING: "1.2V Sense Hi = +1.29 Volts" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.75.5 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.75.6 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.75.7 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.75.8 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.76.1 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.76.2 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.76.3 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.76.4 = STRING: "1.2V Sense Low = +1.05 Volts" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.76.5 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.76.6 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.76.7 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.76.8 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.77.1 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.77.2 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.77.3 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.77.4 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.77.5 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.77.6 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.77.7 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.77.8 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.78.1 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.78.2 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.78.3 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.78.4 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.78.5 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.78.6 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.78.7 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.78.8 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.79.1 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.79.2 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.79.3 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.79.4 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.79.5 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.79.6 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.79.7 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.79.8 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.80.1 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.80.2 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.80.3 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.80.4 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.80.5 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.80.6 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.80.7 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.80.8 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.81.1 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.81.2 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.81.3 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.81.4 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.81.5 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.81.6 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.81.7 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.81.8 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.82.1 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.82.2 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.82.3 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.82.4 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.82.5 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.82.6 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.82.7 = "" .1.3.6.1.4.1.2.3.51.2.22.1.5.6.1.82.8 = STRING: "Not Readable" .1.3.6.1.4.1.2.3.51.2.22.1.6.1.1.1.1 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.22.1.6.1.1.1.2 = INTEGER: 2 .1.3.6.1.4.1.2.3.51.2.22.1.6.1.1.1.3 = INTEGER: 3 .1.3.6.1.4.1.2.3.51.2.22.1.6.1.1.1.4 = INTEGER: 4 .1.3.6.1.4.1.2.3.51.2.22.1.6.1.1.1.5 = INTEGER: 5 .1.3.6.1.4.1.2.3.51.2.22.1.6.1.1.1.6 = INTEGER: 6 .1.3.6.1.4.1.2.3.51.2.22.1.6.1.1.1.7 = INTEGER: 7 .1.3.6.1.4.1.2.3.51.2.22.1.6.1.1.1.8 = INTEGER: 8 .1.3.6.1.4.1.2.3.51.2.22.1.6.1.1.2.1 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.22.1.6.1.1.2.2 = INTEGER: 2 .1.3.6.1.4.1.2.3.51.2.22.1.6.1.1.2.3 = INTEGER: 3 .1.3.6.1.4.1.2.3.51.2.22.1.6.1.1.2.4 = INTEGER: 4 .1.3.6.1.4.1.2.3.51.2.22.1.6.1.1.2.5 = INTEGER: 5 .1.3.6.1.4.1.2.3.51.2.22.1.6.1.1.2.6 = INTEGER: 6 .1.3.6.1.4.1.2.3.51.2.22.1.6.1.1.2.7 = INTEGER: 7 .1.3.6.1.4.1.2.3.51.2.22.1.6.1.1.2.8 = INTEGER: 8 .1.3.6.1.4.1.2.3.51.2.22.1.6.1.1.3.1 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.22.1.6.1.1.3.2 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.22.1.6.1.1.3.3 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.22.1.6.1.1.3.4 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.22.1.6.1.1.3.5 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.22.1.6.1.1.3.6 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.22.1.6.1.1.3.7 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.22.1.6.1.1.3.8 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.22.1.6.1.1.4.1 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.22.1.6.1.1.4.2 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.22.1.6.1.1.4.3 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.22.1.6.1.1.4.4 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.22.1.6.1.1.4.5 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.22.1.6.1.1.4.6 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.22.1.6.1.1.4.7 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.22.1.6.1.1.4.8 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.22.1.6.1.1.5.1 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.22.1.6.1.1.5.2 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.22.1.6.1.1.5.3 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.22.1.6.1.1.5.4 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.22.1.6.1.1.5.5 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.22.1.6.1.1.5.6 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.22.1.6.1.1.5.7 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.22.1.6.1.1.5.8 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.22.1.6.1.1.6.1 = STRING: "Mor38____FC3" .1.3.6.1.4.1.2.3.51.2.22.1.6.1.1.6.2 = STRING: "(No name)" .1.3.6.1.4.1.2.3.51.2.22.1.6.1.1.6.3 = STRING: "L99_P_____FC" .1.3.6.1.4.1.2.3.51.2.22.1.6.1.1.6.4 = STRING: "G71______SU" .1.3.6.1.4.1.2.3.51.2.22.1.6.1.1.6.5 = STRING: "J52_Lin_p64" .1.3.6.1.4.1.2.3.51.2.22.1.6.1.1.6.6 = STRING: "(No name)" .1.3.6.1.4.1.2.3.51.2.22.1.6.1.1.6.7 = STRING: "(No name)" .1.3.6.1.4.1.2.3.51.2.22.1.6.1.1.6.8 = STRING: "M01____RHEL4" .1.3.6.1.4.1.2.3.51.2.22.1.6.1.1.7.1 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.22.1.6.1.1.7.2 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.22.1.6.1.1.7.3 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.22.1.6.1.1.7.4 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.22.1.6.1.1.7.5 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.22.1.6.1.1.7.6 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.22.1.6.1.1.7.7 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.22.1.6.1.1.7.8 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.22.1.6.1.1.8.1 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.22.1.6.1.1.8.2 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.22.1.6.1.1.8.3 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.22.1.6.1.1.8.4 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.22.1.6.1.1.8.5 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.22.1.6.1.1.8.6 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.22.1.6.1.1.8.7 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.22.1.6.1.1.8.8 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.22.1.6.1.1.9.1 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.22.1.6.1.1.9.2 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.22.1.6.1.1.9.3 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.22.1.6.1.1.9.4 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.22.1.6.1.1.9.5 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.22.1.6.1.1.9.6 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.22.1.6.1.1.9.7 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.22.1.6.1.1.9.8 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.22.1.6.1.1.10.1 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.22.1.6.1.1.10.2 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.22.1.6.1.1.10.3 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.22.1.6.1.1.10.4 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.22.1.6.1.1.10.5 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.22.1.6.1.1.10.6 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.22.1.6.1.1.10.7 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.22.1.6.1.1.10.8 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.22.1.6.1.1.11.1 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.22.1.6.1.1.11.2 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.22.1.6.1.1.11.3 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.22.1.6.1.1.11.4 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.22.1.6.1.1.11.5 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.22.1.6.1.1.11.6 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.22.1.6.1.1.11.7 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.22.1.6.1.1.11.8 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.22.1.6.1.1.12.1 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.22.1.6.1.1.12.2 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.22.1.6.1.1.12.3 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.22.1.6.1.1.12.4 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.22.1.6.1.1.12.5 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.22.1.6.1.1.12.6 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.22.1.6.1.1.12.7 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.22.1.6.1.1.12.8 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.22.1.6.1.1.13.1 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.22.1.6.1.1.13.2 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.22.1.6.1.1.13.3 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.22.1.6.1.1.13.4 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.22.1.6.1.1.13.5 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.22.1.6.1.1.13.6 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.22.1.6.1.1.13.7 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.22.1.6.1.1.13.8 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.22.1.7.1.1.1.1 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.22.1.7.1.1.1.2 = INTEGER: 2 .1.3.6.1.4.1.2.3.51.2.22.1.7.1.1.1.3 = INTEGER: 3 .1.3.6.1.4.1.2.3.51.2.22.1.7.1.1.1.4 = INTEGER: 4 .1.3.6.1.4.1.2.3.51.2.22.1.7.1.1.1.5 = INTEGER: 5 .1.3.6.1.4.1.2.3.51.2.22.1.7.1.1.1.6 = INTEGER: 6 .1.3.6.1.4.1.2.3.51.2.22.1.7.1.1.1.7 = INTEGER: 7 .1.3.6.1.4.1.2.3.51.2.22.1.7.1.1.1.8 = INTEGER: 8 .1.3.6.1.4.1.2.3.51.2.22.1.7.1.1.2.1 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.22.1.7.1.1.2.2 = INTEGER: 2 .1.3.6.1.4.1.2.3.51.2.22.1.7.1.1.2.3 = INTEGER: 3 .1.3.6.1.4.1.2.3.51.2.22.1.7.1.1.2.4 = INTEGER: 4 .1.3.6.1.4.1.2.3.51.2.22.1.7.1.1.2.5 = INTEGER: 5 .1.3.6.1.4.1.2.3.51.2.22.1.7.1.1.2.6 = INTEGER: 6 .1.3.6.1.4.1.2.3.51.2.22.1.7.1.1.2.7 = INTEGER: 7 .1.3.6.1.4.1.2.3.51.2.22.1.7.1.1.2.8 = INTEGER: 8 .1.3.6.1.4.1.2.3.51.2.22.1.7.1.1.3.1 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.22.1.7.1.1.3.2 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.22.1.7.1.1.3.3 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.22.1.7.1.1.3.4 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.22.1.7.1.1.3.5 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.22.1.7.1.1.3.6 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.22.1.7.1.1.3.7 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.22.1.7.1.1.3.8 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.22.1.7.1.1.4.1 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.22.1.7.1.1.4.2 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.22.1.7.1.1.4.3 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.22.1.7.1.1.4.4 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.22.1.7.1.1.4.5 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.22.1.7.1.1.4.6 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.22.1.7.1.1.4.7 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.22.1.7.1.1.4.8 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.22.1.7.1.1.5.1 = STRING: "Mor38____FC3" .1.3.6.1.4.1.2.3.51.2.22.1.7.1.1.5.2 = STRING: "(No name)" .1.3.6.1.4.1.2.3.51.2.22.1.7.1.1.5.3 = STRING: "L99_P_____FC" .1.3.6.1.4.1.2.3.51.2.22.1.7.1.1.5.4 = STRING: "G71______SU" .1.3.6.1.4.1.2.3.51.2.22.1.7.1.1.5.5 = STRING: "J52_Lin_p64" .1.3.6.1.4.1.2.3.51.2.22.1.7.1.1.5.6 = STRING: "(No name)" .1.3.6.1.4.1.2.3.51.2.22.1.7.1.1.5.7 = STRING: "(No name)" .1.3.6.1.4.1.2.3.51.2.22.1.7.1.1.5.8 = STRING: "M01____RHEL4" .1.3.6.1.4.1.2.3.51.2.22.1.7.2.1.0 = INTEGER: 2 .1.3.6.1.4.1.2.3.51.2.22.1.7.2.2.0 = INTEGER: 2 .1.3.6.1.4.1.2.3.51.2.22.1.7.2.3.0 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.22.1.8.0 = IpAddress: 10.10.10.80 .1.3.6.1.4.1.2.3.51.2.22.1.9.1.1.1.1 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.22.1.9.1.1.1.2 = INTEGER: 2 .1.3.6.1.4.1.2.3.51.2.22.1.9.1.1.1.3 = INTEGER: 3 .1.3.6.1.4.1.2.3.51.2.22.1.9.1.1.1.4 = INTEGER: 4 .1.3.6.1.4.1.2.3.51.2.22.1.9.1.1.1.5 = INTEGER: 5 .1.3.6.1.4.1.2.3.51.2.22.1.9.1.1.1.6 = INTEGER: 6 .1.3.6.1.4.1.2.3.51.2.22.1.9.1.1.1.7 = INTEGER: 7 .1.3.6.1.4.1.2.3.51.2.22.1.9.1.1.1.8 = INTEGER: 8 .1.3.6.1.4.1.2.3.51.2.22.1.9.1.1.2.1 = STRING: "Mor38____FC3" .1.3.6.1.4.1.2.3.51.2.22.1.9.1.1.2.2 = STRING: "(No name)" .1.3.6.1.4.1.2.3.51.2.22.1.9.1.1.2.3 = STRING: "L99_P_____FC" .1.3.6.1.4.1.2.3.51.2.22.1.9.1.1.2.4 = STRING: "G71______SU" .1.3.6.1.4.1.2.3.51.2.22.1.9.1.1.2.5 = STRING: "J52_Lin_p64" .1.3.6.1.4.1.2.3.51.2.22.1.9.1.1.2.6 = STRING: "(No name)" .1.3.6.1.4.1.2.3.51.2.22.1.9.1.1.2.7 = STRING: "(No name)" .1.3.6.1.4.1.2.3.51.2.22.1.9.1.1.2.8 = STRING: "M01____RHEL4" .1.3.6.1.4.1.2.3.51.2.22.1.9.1.1.3.1 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.22.1.9.1.1.3.2 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.22.1.9.1.1.3.3 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.22.1.9.1.1.3.4 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.22.1.9.1.1.3.5 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.22.1.9.1.1.3.6 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.22.1.9.1.1.3.7 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.22.1.9.1.1.3.8 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.22.1.10.1.1.1.1 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.22.1.10.1.1.1.2 = INTEGER: 2 .1.3.6.1.4.1.2.3.51.2.22.1.10.1.1.1.3 = INTEGER: 3 .1.3.6.1.4.1.2.3.51.2.22.1.10.1.1.1.4 = INTEGER: 4 .1.3.6.1.4.1.2.3.51.2.22.1.10.1.1.1.5 = INTEGER: 5 .1.3.6.1.4.1.2.3.51.2.22.1.10.1.1.1.6 = INTEGER: 6 .1.3.6.1.4.1.2.3.51.2.22.1.10.1.1.1.7 = INTEGER: 7 .1.3.6.1.4.1.2.3.51.2.22.1.10.1.1.1.8 = INTEGER: 8 .1.3.6.1.4.1.2.3.51.2.22.1.10.1.1.2.1 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.22.1.10.1.1.2.2 = INTEGER: 2 .1.3.6.1.4.1.2.3.51.2.22.1.10.1.1.2.3 = INTEGER: 3 .1.3.6.1.4.1.2.3.51.2.22.1.10.1.1.2.4 = INTEGER: 4 .1.3.6.1.4.1.2.3.51.2.22.1.10.1.1.2.5 = INTEGER: 5 .1.3.6.1.4.1.2.3.51.2.22.1.10.1.1.2.6 = INTEGER: 6 .1.3.6.1.4.1.2.3.51.2.22.1.10.1.1.2.7 = INTEGER: 7 .1.3.6.1.4.1.2.3.51.2.22.1.10.1.1.2.8 = INTEGER: 8 .1.3.6.1.4.1.2.3.51.2.22.1.10.1.1.3.1 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.22.1.10.1.1.3.2 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.22.1.10.1.1.3.3 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.22.1.10.1.1.3.4 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.22.1.10.1.1.3.5 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.22.1.10.1.1.3.6 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.22.1.10.1.1.3.7 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.22.1.10.1.1.3.8 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.22.1.10.1.1.4.1 = INTEGER: 4823579 .1.3.6.1.4.1.2.3.51.2.22.1.10.1.1.4.2 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.22.1.10.1.1.4.3 = INTEGER: 604582 .1.3.6.1.4.1.2.3.51.2.22.1.10.1.1.4.4 = INTEGER: 521741 .1.3.6.1.4.1.2.3.51.2.22.1.10.1.1.4.5 = INTEGER: 1198372 .1.3.6.1.4.1.2.3.51.2.22.1.10.1.1.4.6 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.22.1.10.1.1.4.7 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.22.1.10.1.1.4.8 = INTEGER: 776659 .1.3.6.1.4.1.2.3.51.2.22.3.1.1.1.1.1 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.22.3.1.1.1.1.2 = INTEGER: 2 .1.3.6.1.4.1.2.3.51.2.22.3.1.1.1.1.3 = INTEGER: 3 .1.3.6.1.4.1.2.3.51.2.22.3.1.1.1.1.4 = INTEGER: 4 .1.3.6.1.4.1.2.3.51.2.22.3.1.1.1.2.1 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.22.3.1.1.1.2.2 = INTEGER: 2 .1.3.6.1.4.1.2.3.51.2.22.3.1.1.1.2.3 = INTEGER: 3 .1.3.6.1.4.1.2.3.51.2.22.3.1.1.1.2.4 = INTEGER: 4 .1.3.6.1.4.1.2.3.51.2.22.3.1.1.1.3.1 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.22.3.1.1.1.3.2 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.22.3.1.1.1.3.3 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.22.3.1.1.1.3.4 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.22.3.1.1.1.4.1 = STRING: "FF: Switch module completed POST successfully." .1.3.6.1.4.1.2.3.51.2.22.3.1.1.1.4.2 = STRING: "FF: Switch module completed POST successfully." .1.3.6.1.4.1.2.3.51.2.22.3.1.1.1.4.3 = STRING: "FF: Switch module completed POST successfully." .1.3.6.1.4.1.2.3.51.2.22.3.1.1.1.4.4 = STRING: "FF: Switch module completed POST successfully." .1.3.6.1.4.1.2.3.51.2.22.3.1.1.1.5.1 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.22.3.1.1.1.5.2 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.22.3.1.1.1.5.3 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.22.3.1.1.1.5.4 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.22.3.1.1.1.6.1 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.22.3.1.1.1.6.2 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.22.3.1.1.1.6.3 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.22.3.1.1.1.6.4 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.22.3.1.1.1.7.1 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.22.3.1.1.1.7.2 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.22.3.1.1.1.7.3 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.22.3.1.1.1.7.4 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.22.3.1.1.1.8.1 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.22.3.1.1.1.8.2 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.22.3.1.1.1.8.3 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.22.3.1.1.1.8.4 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.22.3.1.1.1.9.1 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.22.3.1.1.1.9.2 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.22.3.1.1.1.9.3 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.22.3.1.1.1.9.4 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.22.3.1.1.1.15.1 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.22.3.1.1.1.15.2 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.22.3.1.1.1.15.3 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.22.3.1.1.1.15.4 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.22.3.1.7.1.1.1 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.22.3.1.7.1.1.2 = INTEGER: 2 .1.3.6.1.4.1.2.3.51.2.22.3.1.7.1.1.3 = INTEGER: 3 .1.3.6.1.4.1.2.3.51.2.22.3.1.7.1.1.4 = INTEGER: 4 .1.3.6.1.4.1.2.3.51.2.22.3.1.7.1.2.1 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.22.3.1.7.1.2.2 = INTEGER: 2 .1.3.6.1.4.1.2.3.51.2.22.3.1.7.1.2.3 = INTEGER: 3 .1.3.6.1.4.1.2.3.51.2.22.3.1.7.1.2.4 = INTEGER: 4 .1.3.6.1.4.1.2.3.51.2.22.3.1.7.1.3.1 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.22.3.1.7.1.3.2 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.22.3.1.7.1.3.3 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.22.3.1.7.1.3.4 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.22.3.1.7.1.4.1 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.22.3.1.7.1.4.2 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.22.3.1.7.1.4.3 = INTEGER: 2 .1.3.6.1.4.1.2.3.51.2.22.3.1.7.1.4.4 = INTEGER: 2 .1.3.6.1.4.1.2.3.51.2.22.3.1.7.1.5.1 = STRING: "00:0E:0C:63:5B:52" .1.3.6.1.4.1.2.3.51.2.22.3.1.7.1.5.2 = STRING: "00:0E:0C:63:56:B2" .1.3.6.1.4.1.2.3.51.2.22.3.1.7.1.5.3 = STRING: "00:C0:DD:02:0A:E9" .1.3.6.1.4.1.2.3.51.2.22.3.1.7.1.5.4 = STRING: "00:C0:DD:02:0A:B5" .1.3.6.1.4.1.2.3.51.2.22.3.1.7.1.6.1 = IpAddress: 192.168.70.127 .1.3.6.1.4.1.2.3.51.2.22.3.1.7.1.6.2 = IpAddress: 192.168.70.128 .1.3.6.1.4.1.2.3.51.2.22.3.1.7.1.6.3 = IpAddress: 192.168.70.129 .1.3.6.1.4.1.2.3.51.2.22.3.1.7.1.6.4 = IpAddress: 192.168.70.130 .1.3.6.1.4.1.2.3.51.2.22.3.1.7.1.7.1 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.22.3.1.7.1.7.2 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.22.3.1.7.1.7.3 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.22.3.1.7.1.7.4 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.22.3.1.7.1.8.1 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.22.3.1.7.1.8.2 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.22.3.1.7.1.8.3 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.22.3.1.7.1.8.4 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.22.3.1.7.1.9.1 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.22.3.1.7.1.9.2 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.22.3.1.7.1.9.3 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.22.3.1.7.1.9.4 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.22.3.1.7.1.10.1 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.22.3.1.7.1.10.2 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.22.3.1.7.1.10.3 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.22.3.1.7.1.10.4 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.22.3.1.7.1.11.1 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.22.3.1.7.1.11.2 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.22.3.1.7.1.11.3 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.22.3.1.7.1.11.4 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.22.3.1.7.1.12.1 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.22.3.1.7.1.12.2 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.22.3.1.7.1.12.3 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.22.3.1.7.1.12.4 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.22.3.2.1.1.1.1.1.1 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.22.3.2.1.1.1.1.1.2 = INTEGER: 2 .1.3.6.1.4.1.2.3.51.2.22.3.2.1.1.1.1.1.3 = INTEGER: 3 .1.3.6.1.4.1.2.3.51.2.22.3.2.1.1.1.1.1.4 = INTEGER: 4 .1.3.6.1.4.1.2.3.51.2.22.3.2.1.1.1.1.2.1 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.22.3.2.1.1.1.1.2.2 = INTEGER: 2 .1.3.6.1.4.1.2.3.51.2.22.3.2.1.1.1.1.2.3 = INTEGER: 3 .1.3.6.1.4.1.2.3.51.2.22.3.2.1.1.1.1.2.4 = INTEGER: 4 .1.3.6.1.4.1.2.3.51.2.22.3.2.1.1.1.1.3.1 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.22.3.2.1.1.1.1.3.2 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.22.3.2.1.1.1.1.3.3 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.22.3.2.1.1.1.1.3.4 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.22.3.2.1.1.1.1.4.1 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.22.3.2.1.1.1.1.4.2 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.22.3.2.1.1.1.1.4.3 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.22.3.2.1.1.1.1.4.4 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.22.3.2.1.1.1.1.6.1 = IpAddress: 192.168.70.127 .1.3.6.1.4.1.2.3.51.2.22.3.2.1.1.1.1.6.2 = IpAddress: 192.168.70.128 .1.3.6.1.4.1.2.3.51.2.22.3.2.1.1.1.1.6.3 = IpAddress: 192.168.70.129 .1.3.6.1.4.1.2.3.51.2.22.3.2.1.1.1.1.6.4 = IpAddress: 192.168.70.130 .1.3.6.1.4.1.2.3.51.2.22.3.2.1.1.1.1.7.1 = IpAddress: 255.255.255.0 .1.3.6.1.4.1.2.3.51.2.22.3.2.1.1.1.1.7.2 = IpAddress: 255.255.255.0 .1.3.6.1.4.1.2.3.51.2.22.3.2.1.1.1.1.7.3 = IpAddress: 255.255.255.0 .1.3.6.1.4.1.2.3.51.2.22.3.2.1.1.1.1.7.4 = IpAddress: 255.255.255.0 .1.3.6.1.4.1.2.3.51.2.22.3.2.1.1.1.1.8.1 = IpAddress: 0.0.0.0 .1.3.6.1.4.1.2.3.51.2.22.3.2.1.1.1.1.8.2 = IpAddress: 0.0.0.0 .1.3.6.1.4.1.2.3.51.2.22.3.2.1.1.1.1.8.3 = IpAddress: 0.0.0.0 .1.3.6.1.4.1.2.3.51.2.22.3.2.1.1.1.1.8.4 = IpAddress: 0.0.0.0 .1.3.6.1.4.1.2.3.51.2.22.3.2.1.1.1.1.9.1 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.22.3.2.1.1.1.1.9.2 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.22.3.2.1.1.1.1.9.3 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.22.3.2.1.1.1.1.9.4 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.22.3.2.1.2.1.1.1.1 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.22.3.2.1.2.1.1.1.2 = INTEGER: 2 .1.3.6.1.4.1.2.3.51.2.22.3.2.1.2.1.1.1.3 = INTEGER: 3 .1.3.6.1.4.1.2.3.51.2.22.3.2.1.2.1.1.1.4 = INTEGER: 4 .1.3.6.1.4.1.2.3.51.2.22.3.2.1.2.1.1.2.1 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.22.3.2.1.2.1.1.2.2 = INTEGER: 2 .1.3.6.1.4.1.2.3.51.2.22.3.2.1.2.1.1.2.3 = INTEGER: 3 .1.3.6.1.4.1.2.3.51.2.22.3.2.1.2.1.1.2.4 = INTEGER: 4 .1.3.6.1.4.1.2.3.51.2.22.3.2.1.2.1.1.3.1 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.22.3.2.1.2.1.1.3.2 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.22.3.2.1.2.1.1.3.3 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.22.3.2.1.2.1.1.3.4 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.22.3.2.1.2.1.1.4.1 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.22.3.2.1.2.1.1.4.2 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.22.3.2.1.2.1.1.4.3 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.22.3.2.1.2.1.1.4.4 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.22.3.2.1.2.1.1.6.1 = IpAddress: 192.168.70.127 .1.3.6.1.4.1.2.3.51.2.22.3.2.1.2.1.1.6.2 = IpAddress: 192.168.70.128 .1.3.6.1.4.1.2.3.51.2.22.3.2.1.2.1.1.6.3 = IpAddress: 192.168.70.129 .1.3.6.1.4.1.2.3.51.2.22.3.2.1.2.1.1.6.4 = IpAddress: 192.168.70.130 .1.3.6.1.4.1.2.3.51.2.22.3.2.1.2.1.1.7.1 = IpAddress: 255.255.255.0 .1.3.6.1.4.1.2.3.51.2.22.3.2.1.2.1.1.7.2 = IpAddress: 255.255.255.0 .1.3.6.1.4.1.2.3.51.2.22.3.2.1.2.1.1.7.3 = IpAddress: 255.255.255.0 .1.3.6.1.4.1.2.3.51.2.22.3.2.1.2.1.1.7.4 = IpAddress: 255.255.255.0 .1.3.6.1.4.1.2.3.51.2.22.3.2.1.2.1.1.8.1 = IpAddress: 0.0.0.0 .1.3.6.1.4.1.2.3.51.2.22.3.2.1.2.1.1.8.2 = IpAddress: 0.0.0.0 .1.3.6.1.4.1.2.3.51.2.22.3.2.1.2.1.1.8.3 = IpAddress: 0.0.0.0 .1.3.6.1.4.1.2.3.51.2.22.3.2.1.2.1.1.8.4 = IpAddress: 0.0.0.0 .1.3.6.1.4.1.2.3.51.2.22.3.2.1.2.1.1.9.1 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.22.3.2.1.2.1.1.9.2 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.22.3.2.1.2.1.1.9.3 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.22.3.2.1.2.1.1.9.4 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.22.3.2.1.2.1.1.10.1 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.22.3.2.1.2.1.1.10.2 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.22.3.2.1.2.1.1.10.3 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.22.3.2.1.2.1.1.10.4 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.22.4.1.0 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.22.4.2.0 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.22.4.3.0 = STRING: "BCT-81" .1.3.6.1.4.1.2.3.51.2.22.4.19.0 = INTEGER: 8 .1.3.6.1.4.1.2.3.51.2.22.4.20.0 = INTEGER: 4 .1.3.6.1.4.1.2.3.51.2.22.4.21.0 = INTEGER: 2 .1.3.6.1.4.1.2.3.51.2.22.4.22.0 = INTEGER: 4 .1.3.6.1.4.1.2.3.51.2.22.4.23.0 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.22.4.24.0 = INTEGER: 4 .1.3.6.1.4.1.2.3.51.2.22.4.25.0 = STRING: "10111001" .1.3.6.1.4.1.2.3.51.2.22.4.29.0 = STRING: "1111" .1.3.6.1.4.1.2.3.51.2.22.4.30.0 = STRING: "11" .1.3.6.1.4.1.2.3.51.2.22.4.31.0 = STRING: "1111" .1.3.6.1.4.1.2.3.51.2.22.4.32.0 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.22.4.33.0 = STRING: "1111" .1.3.6.1.4.1.2.3.51.2.22.4.34.0 = INTEGER: 2 .1.3.6.1.4.1.2.3.51.2.22.4.35.0 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.22.4.36.0 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.22.5.1.1.1.1 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.22.5.1.1.1.2 = INTEGER: 2 .1.3.6.1.4.1.2.3.51.2.22.5.1.1.2.1 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.22.5.1.1.2.2 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.22.5.1.1.3.1 = IpAddress: 192.168.70.125 .1.3.6.1.4.1.2.3.51.2.22.5.1.1.3.2 = IpAddress: 192.168.70.125 .1.3.6.1.4.1.2.3.51.2.22.5.1.1.4.1 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.22.5.1.1.4.2 = INTEGER: 1 .1.3.6.1.4.1.2.3.51.2.22.9.1.0 = INTEGER: 255 .1.3.6.1.4.1.2.3.51.2.22.9.2.0 = "" .1.3.6.1.4.1.2.3.51.2.22.9.3.0 = "" .1.3.6.1.4.1.2.3.51.2.22.9.4.0 = INTEGER: 0 .1.3.6.1.4.1.2.3.51.2.22.9.5.0 = STRING: "Flash update fails with 0 percent completion." .1.3.6.1.6.3.10.2.1.1.0 = Hex-STRING: 80 00 04 50 01 09 03 CA 55 .1.3.6.1.6.3.10.2.1.2.0 = INTEGER: 1 .1.3.6.1.6.3.10.2.1.3.0 = INTEGER: 487188 seconds .1.3.6.1.6.3.10.2.1.4.0 = INTEGER: 8192 .1.3.6.1.6.3.11.2.1.1.0 = Counter32: 0 .1.3.6.1.6.3.11.2.1.2.0 = Counter32: 0 .1.3.6.1.6.3.11.2.1.3.0 = Counter32: 0 .1.3.6.1.6.3.12.1.1.0 = INTEGER: 0 .1.3.6.1.6.3.12.1.2.1.2.72.111.115.116.49 = Wrong Type (should be OBJECT IDENTIFIER): INTEGER: 1 .1.3.6.1.6.3.12.1.2.1.2.72.111.115.116.50 = Wrong Type (should be OBJECT IDENTIFIER): INTEGER: 1 .1.3.6.1.6.3.12.1.2.1.2.72.111.115.116.51 = Wrong Type (should be OBJECT IDENTIFIER): INTEGER: 1 .1.3.6.1.6.3.12.1.2.1.2.72.111.115.116.52 = Wrong Type (should be OBJECT IDENTIFIER): INTEGER: 1 .1.3.6.1.6.3.12.1.2.1.2.72.111.115.116.53 = Wrong Type (should be OBJECT IDENTIFIER): INTEGER: 1 .1.3.6.1.6.3.12.1.2.1.2.72.111.115.116.54 = Wrong Type (should be OBJECT IDENTIFIER): INTEGER: 1 .1.3.6.1.6.3.12.1.2.1.2.72.111.115.116.55 = Wrong Type (should be OBJECT IDENTIFIER): INTEGER: 1 .1.3.6.1.6.3.12.1.2.1.2.72.111.115.116.56 = Wrong Type (should be OBJECT IDENTIFIER): INTEGER: 1 .1.3.6.1.6.3.12.1.2.1.2.72.111.115.116.57 = Wrong Type (should be OBJECT IDENTIFIER): INTEGER: 1 .1.3.6.1.6.3.12.1.2.1.3.72.111.115.116.49 = Hex-STRING: 00 00 00 00 .1.3.6.1.6.3.12.1.2.1.3.72.111.115.116.50 = Hex-STRING: 00 00 00 00 .1.3.6.1.6.3.12.1.2.1.3.72.111.115.116.51 = Hex-STRING: 00 00 00 00 .1.3.6.1.6.3.12.1.2.1.3.72.111.115.116.52 = Hex-STRING: 00 00 00 00 .1.3.6.1.6.3.12.1.2.1.3.72.111.115.116.53 = Hex-STRING: 00 00 00 00 .1.3.6.1.6.3.12.1.2.1.3.72.111.115.116.54 = Hex-STRING: 00 00 00 00 .1.3.6.1.6.3.12.1.2.1.3.72.111.115.116.55 = Hex-STRING: 00 00 00 00 .1.3.6.1.6.3.12.1.2.1.3.72.111.115.116.56 = Hex-STRING: 00 00 00 00 .1.3.6.1.6.3.12.1.2.1.3.72.111.115.116.57 = Hex-STRING: 00 00 00 00 .1.3.6.1.6.3.12.1.2.1.4.72.111.115.116.49 = INTEGER: 0 .1.3.6.1.6.3.12.1.2.1.4.72.111.115.116.50 = INTEGER: 0 .1.3.6.1.6.3.12.1.2.1.4.72.111.115.116.51 = INTEGER: 0 .1.3.6.1.6.3.12.1.2.1.4.72.111.115.116.52 = INTEGER: 0 .1.3.6.1.6.3.12.1.2.1.4.72.111.115.116.53 = INTEGER: 0 .1.3.6.1.6.3.12.1.2.1.4.72.111.115.116.54 = INTEGER: 0 .1.3.6.1.6.3.12.1.2.1.4.72.111.115.116.55 = INTEGER: 0 .1.3.6.1.6.3.12.1.2.1.4.72.111.115.116.56 = INTEGER: 0 .1.3.6.1.6.3.12.1.2.1.4.72.111.115.116.57 = INTEGER: 0 .1.3.6.1.6.3.12.1.2.1.5.72.111.115.116.49 = INTEGER: 0 .1.3.6.1.6.3.12.1.2.1.5.72.111.115.116.50 = INTEGER: 0 .1.3.6.1.6.3.12.1.2.1.5.72.111.115.116.51 = INTEGER: 0 .1.3.6.1.6.3.12.1.2.1.5.72.111.115.116.52 = INTEGER: 0 .1.3.6.1.6.3.12.1.2.1.5.72.111.115.116.53 = INTEGER: 0 .1.3.6.1.6.3.12.1.2.1.5.72.111.115.116.54 = INTEGER: 0 .1.3.6.1.6.3.12.1.2.1.5.72.111.115.116.55 = INTEGER: 0 .1.3.6.1.6.3.12.1.2.1.5.72.111.115.116.56 = INTEGER: 0 .1.3.6.1.6.3.12.1.2.1.5.72.111.115.116.57 = INTEGER: 0 .1.3.6.1.6.3.12.1.2.1.6.72.111.115.116.49 = STRING: group1 .1.3.6.1.6.3.12.1.2.1.6.72.111.115.116.50 = STRING: group1 .1.3.6.1.6.3.12.1.2.1.6.72.111.115.116.51 = STRING: group1 .1.3.6.1.6.3.12.1.2.1.6.72.111.115.116.52 = STRING: group1 .1.3.6.1.6.3.12.1.2.1.6.72.111.115.116.53 = STRING: group1 .1.3.6.1.6.3.12.1.2.1.6.72.111.115.116.54 = STRING: group1 .1.3.6.1.6.3.12.1.2.1.6.72.111.115.116.55 = STRING: group1 .1.3.6.1.6.3.12.1.2.1.6.72.111.115.116.56 = STRING: group1 .1.3.6.1.6.3.12.1.2.1.6.72.111.115.116.57 = STRING: group1 .1.3.6.1.6.3.12.1.2.1.7.72.111.115.116.49 = STRING: v3User1 .1.3.6.1.6.3.12.1.2.1.7.72.111.115.116.50 = STRING: v3User2 .1.3.6.1.6.3.12.1.2.1.7.72.111.115.116.51 = STRING: v3User3 .1.3.6.1.6.3.12.1.2.1.7.72.111.115.116.52 = STRING: v3User4 .1.3.6.1.6.3.12.1.2.1.7.72.111.115.116.53 = STRING: v3User5 .1.3.6.1.6.3.12.1.2.1.7.72.111.115.116.54 = STRING: v3User6 .1.3.6.1.6.3.12.1.2.1.7.72.111.115.116.55 = STRING: v3User7 .1.3.6.1.6.3.12.1.2.1.7.72.111.115.116.56 = STRING: v3User8 .1.3.6.1.6.3.12.1.2.1.7.72.111.115.116.57 = STRING: v3User9 .1.3.6.1.6.3.12.1.2.1.8.72.111.115.116.49 = INTEGER: nonVolatile(3) .1.3.6.1.6.3.12.1.2.1.8.72.111.115.116.50 = INTEGER: nonVolatile(3) .1.3.6.1.6.3.12.1.2.1.8.72.111.115.116.51 = INTEGER: nonVolatile(3) .1.3.6.1.6.3.12.1.2.1.8.72.111.115.116.52 = INTEGER: nonVolatile(3) .1.3.6.1.6.3.12.1.2.1.8.72.111.115.116.53 = INTEGER: nonVolatile(3) .1.3.6.1.6.3.12.1.2.1.8.72.111.115.116.54 = INTEGER: nonVolatile(3) .1.3.6.1.6.3.12.1.2.1.8.72.111.115.116.55 = INTEGER: nonVolatile(3) .1.3.6.1.6.3.12.1.2.1.8.72.111.115.116.56 = INTEGER: nonVolatile(3) .1.3.6.1.6.3.12.1.2.1.8.72.111.115.116.57 = INTEGER: nonVolatile(3) .1.3.6.1.6.3.12.1.2.1.9.72.111.115.116.49 = INTEGER: active(1) .1.3.6.1.6.3.12.1.2.1.9.72.111.115.116.50 = INTEGER: active(1) .1.3.6.1.6.3.12.1.2.1.9.72.111.115.116.51 = INTEGER: active(1) .1.3.6.1.6.3.12.1.2.1.9.72.111.115.116.52 = INTEGER: active(1) .1.3.6.1.6.3.12.1.2.1.9.72.111.115.116.53 = INTEGER: active(1) .1.3.6.1.6.3.12.1.2.1.9.72.111.115.116.54 = INTEGER: active(1) .1.3.6.1.6.3.12.1.2.1.9.72.111.115.116.55 = INTEGER: active(1) .1.3.6.1.6.3.12.1.2.1.9.72.111.115.116.56 = INTEGER: active(1) .1.3.6.1.6.3.12.1.2.1.9.72.111.115.116.57 = INTEGER: active(1) .1.3.6.1.6.3.12.1.3.1.2.118.51.85.115.101.114.49 = INTEGER: 3 .1.3.6.1.6.3.12.1.3.1.2.118.51.85.115.101.114.50 = INTEGER: 3 .1.3.6.1.6.3.12.1.3.1.2.118.51.85.115.101.114.51 = INTEGER: 3 .1.3.6.1.6.3.12.1.3.1.2.118.51.85.115.101.114.52 = INTEGER: 3 .1.3.6.1.6.3.12.1.3.1.2.118.51.85.115.101.114.53 = INTEGER: 3 .1.3.6.1.6.3.12.1.3.1.2.118.51.85.115.101.114.54 = INTEGER: 3 .1.3.6.1.6.3.12.1.3.1.2.118.51.85.115.101.114.55 = INTEGER: 3 .1.3.6.1.6.3.12.1.3.1.2.118.51.85.115.101.114.56 = INTEGER: 3 .1.3.6.1.6.3.12.1.3.1.2.118.51.85.115.101.114.57 = INTEGER: 3 .1.3.6.1.6.3.12.1.3.1.3.118.51.85.115.101.114.49 = INTEGER: 3 .1.3.6.1.6.3.12.1.3.1.3.118.51.85.115.101.114.50 = INTEGER: 3 .1.3.6.1.6.3.12.1.3.1.3.118.51.85.115.101.114.51 = INTEGER: 3 .1.3.6.1.6.3.12.1.3.1.3.118.51.85.115.101.114.52 = INTEGER: 3 .1.3.6.1.6.3.12.1.3.1.3.118.51.85.115.101.114.53 = INTEGER: 3 .1.3.6.1.6.3.12.1.3.1.3.118.51.85.115.101.114.54 = INTEGER: 3 .1.3.6.1.6.3.12.1.3.1.3.118.51.85.115.101.114.55 = INTEGER: 3 .1.3.6.1.6.3.12.1.3.1.3.118.51.85.115.101.114.56 = INTEGER: 3 .1.3.6.1.6.3.12.1.3.1.3.118.51.85.115.101.114.57 = INTEGER: 3 .1.3.6.1.6.3.12.1.3.1.4.118.51.85.115.101.114.49 = STRING: USERID .1.3.6.1.6.3.12.1.3.1.4.118.51.85.115.101.114.50 = STRING: .1.3.6.1.6.3.12.1.3.1.4.118.51.85.115.101.114.51 = STRING: .1.3.6.1.6.3.12.1.3.1.4.118.51.85.115.101.114.52 = STRING: .1.3.6.1.6.3.12.1.3.1.4.118.51.85.115.101.114.53 = STRING: .1.3.6.1.6.3.12.1.3.1.4.118.51.85.115.101.114.54 = STRING: .1.3.6.1.6.3.12.1.3.1.4.118.51.85.115.101.114.55 = STRING: .1.3.6.1.6.3.12.1.3.1.4.118.51.85.115.101.114.56 = STRING: .1.3.6.1.6.3.12.1.3.1.4.118.51.85.115.101.114.57 = STRING: .1.3.6.1.6.3.12.1.3.1.5.118.51.85.115.101.114.49 = INTEGER: noAuthNoPriv(1) .1.3.6.1.6.3.12.1.3.1.5.118.51.85.115.101.114.50 = INTEGER: authNoPriv(2) .1.3.6.1.6.3.12.1.3.1.5.118.51.85.115.101.114.51 = INTEGER: noAuthNoPriv(1) .1.3.6.1.6.3.12.1.3.1.5.118.51.85.115.101.114.52 = INTEGER: authPriv(3) .1.3.6.1.6.3.12.1.3.1.5.118.51.85.115.101.114.53 = INTEGER: authNoPriv(2) .1.3.6.1.6.3.12.1.3.1.5.118.51.85.115.101.114.54 = INTEGER: 0 .1.3.6.1.6.3.12.1.3.1.5.118.51.85.115.101.114.55 = INTEGER: 0 .1.3.6.1.6.3.12.1.3.1.5.118.51.85.115.101.114.56 = INTEGER: 0 .1.3.6.1.6.3.12.1.3.1.5.118.51.85.115.101.114.57 = INTEGER: 0 .1.3.6.1.6.3.12.1.3.1.6.118.51.85.115.101.114.49 = INTEGER: 0 .1.3.6.1.6.3.12.1.3.1.6.118.51.85.115.101.114.50 = INTEGER: 0 .1.3.6.1.6.3.12.1.3.1.6.118.51.85.115.101.114.51 = INTEGER: 0 .1.3.6.1.6.3.12.1.3.1.6.118.51.85.115.101.114.52 = INTEGER: 0 .1.3.6.1.6.3.12.1.3.1.6.118.51.85.115.101.114.53 = INTEGER: 0 .1.3.6.1.6.3.12.1.3.1.6.118.51.85.115.101.114.54 = INTEGER: 0 .1.3.6.1.6.3.12.1.3.1.6.118.51.85.115.101.114.55 = INTEGER: 0 .1.3.6.1.6.3.12.1.3.1.6.118.51.85.115.101.114.56 = INTEGER: 0 .1.3.6.1.6.3.12.1.3.1.6.118.51.85.115.101.114.57 = INTEGER: 0 .1.3.6.1.6.3.12.1.3.1.7.118.51.85.115.101.114.49 = INTEGER: 0 .1.3.6.1.6.3.12.1.3.1.7.118.51.85.115.101.114.50 = INTEGER: 0 .1.3.6.1.6.3.12.1.3.1.7.118.51.85.115.101.114.51 = INTEGER: 0 .1.3.6.1.6.3.12.1.3.1.7.118.51.85.115.101.114.52 = INTEGER: 0 .1.3.6.1.6.3.12.1.3.1.7.118.51.85.115.101.114.53 = INTEGER: 0 .1.3.6.1.6.3.12.1.3.1.7.118.51.85.115.101.114.54 = INTEGER: 0 .1.3.6.1.6.3.12.1.3.1.7.118.51.85.115.101.114.55 = INTEGER: 0 .1.3.6.1.6.3.12.1.3.1.7.118.51.85.115.101.114.56 = INTEGER: 0 .1.3.6.1.6.3.12.1.3.1.7.118.51.85.115.101.114.57 = INTEGER: 0 .1.3.6.1.6.3.12.1.4.0 = Wrong Type (should be Counter32): INTEGER: 0 .1.3.6.1.6.3.12.1.5.0 = Wrong Type (should be Counter32): INTEGER: 0 .1.3.6.1.6.3.13.1.1.1.2.103.114.111.117.112.49 = STRING: group1 .1.3.6.1.6.3.13.1.1.1.3.103.114.111.117.112.49 = INTEGER: trap(1) .1.3.6.1.6.3.13.1.1.1.4.103.114.111.117.112.49 = INTEGER: readOnly(5) .1.3.6.1.6.3.13.1.1.1.5.103.114.111.117.112.49 = INTEGER: active(1) .1.3.6.1.6.3.13.1.2.1.1.118.51.85.115.101.114.49 = STRING: filter-2 .1.3.6.1.6.3.13.1.2.1.1.118.51.85.115.101.114.50 = STRING: filter-2 .1.3.6.1.6.3.13.1.2.1.1.118.51.85.115.101.114.51 = STRING: filter-2 .1.3.6.1.6.3.13.1.2.1.1.118.51.85.115.101.114.52 = STRING: filter-2 .1.3.6.1.6.3.13.1.2.1.1.118.51.85.115.101.114.53 = STRING: filter-2 .1.3.6.1.6.3.13.1.2.1.1.118.51.85.115.101.114.54 = STRING: filter-2 .1.3.6.1.6.3.13.1.2.1.1.118.51.85.115.101.114.55 = STRING: filter-2 .1.3.6.1.6.3.13.1.2.1.1.118.51.85.115.101.114.56 = STRING: filter-2 .1.3.6.1.6.3.13.1.2.1.1.118.51.85.115.101.114.57 = STRING: filter-2 .1.3.6.1.6.3.13.1.2.1.2.118.51.85.115.101.114.49 = INTEGER: nonVolatile(3) .1.3.6.1.6.3.13.1.2.1.2.118.51.85.115.101.114.50 = INTEGER: nonVolatile(3) .1.3.6.1.6.3.13.1.2.1.2.118.51.85.115.101.114.51 = INTEGER: nonVolatile(3) .1.3.6.1.6.3.13.1.2.1.2.118.51.85.115.101.114.52 = INTEGER: nonVolatile(3) .1.3.6.1.6.3.13.1.2.1.2.118.51.85.115.101.114.53 = INTEGER: nonVolatile(3) .1.3.6.1.6.3.13.1.2.1.2.118.51.85.115.101.114.54 = INTEGER: nonVolatile(3) .1.3.6.1.6.3.13.1.2.1.2.118.51.85.115.101.114.55 = INTEGER: nonVolatile(3) .1.3.6.1.6.3.13.1.2.1.2.118.51.85.115.101.114.56 = INTEGER: nonVolatile(3) .1.3.6.1.6.3.13.1.2.1.2.118.51.85.115.101.114.57 = INTEGER: nonVolatile(3) .1.3.6.1.6.3.13.1.2.1.3.118.51.85.115.101.114.49 = INTEGER: active(1) .1.3.6.1.6.3.13.1.2.1.3.118.51.85.115.101.114.50 = INTEGER: active(1) .1.3.6.1.6.3.13.1.2.1.3.118.51.85.115.101.114.51 = INTEGER: active(1) .1.3.6.1.6.3.13.1.2.1.3.118.51.85.115.101.114.52 = INTEGER: active(1) .1.3.6.1.6.3.13.1.2.1.3.118.51.85.115.101.114.53 = INTEGER: active(1) .1.3.6.1.6.3.13.1.2.1.3.118.51.85.115.101.114.54 = INTEGER: active(1) .1.3.6.1.6.3.13.1.2.1.3.118.51.85.115.101.114.55 = INTEGER: active(1) .1.3.6.1.6.3.13.1.2.1.3.118.51.85.115.101.114.56 = INTEGER: active(1) .1.3.6.1.6.3.13.1.2.1.3.118.51.85.115.101.114.57 = INTEGER: active(1) .1.3.6.1.6.3.13.1.3.1.2.8.102.105.108.116.101.114.45.49.1.3.6.1 = Hex-STRING: F0 .1.3.6.1.6.3.13.1.3.1.2.8.102.105.108.116.101.114.45.50.1.3.6.1 = Hex-STRING: F0 .1.3.6.1.6.3.13.1.3.1.3.8.102.105.108.116.101.114.45.49.1.3.6.1 = INTEGER: included(1) .1.3.6.1.6.3.13.1.3.1.3.8.102.105.108.116.101.114.45.50.1.3.6.1 = INTEGER: included(1) .1.3.6.1.6.3.13.1.3.1.4.8.102.105.108.116.101.114.45.49.1.3.6.1 = INTEGER: readOnly(5) .1.3.6.1.6.3.13.1.3.1.4.8.102.105.108.116.101.114.45.50.1.3.6.1 = INTEGER: readOnly(5) .1.3.6.1.6.3.13.1.3.1.5.8.102.105.108.116.101.114.45.49.1.3.6.1 = INTEGER: active(1) .1.3.6.1.6.3.13.1.3.1.5.8.102.105.108.116.101.114.45.50.1.3.6.1 = INTEGER: active(1) .1.3.6.1.6.3.15.1.1.1.0 = Counter32: 0 .1.3.6.1.6.3.15.1.1.2.0 = Counter32: 0 .1.3.6.1.6.3.15.1.1.3.0 = Counter32: 0 .1.3.6.1.6.3.15.1.1.4.0 = Counter32: 20 .1.3.6.1.6.3.15.1.1.5.0 = Counter32: 0 .1.3.6.1.6.3.15.1.1.6.0 = Counter32: 0 .1.3.6.1.6.3.15.1.2.1.0 = INTEGER: 0 openhpi-2.14.1/plugins/snmp_bc/t/tsensorget004.c0000644000076400007640000000367311302566764016346 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * Peter D Phan */ #include #include #include int main(int argc, char **argv) { /* ************************ * Local variables * ***********************/ int testfail = 0; SaErrorT err; SaErrorT expected_err; SaHpiResourceIdT id; SaHpiSessionIdT sessionid; SaHpiRptEntryT rptentry; SaHpiSensorNumT sid = 0; SaHpiEventStateT state; SaHpiSensorReadingT reading; /* ************************************* * Find a resource with NO Sensor type rdr * ************************************* */ err = tsetup(&sessionid); if (err != SA_OK) { printf("Error! Can not open session for test environment\n"); printf(" File=%s, Line=%d\n", __FILE__, __LINE__); return -1; } err = tfind_resource(&sessionid, SAHPI_CAPABILITY_SENSOR, SAHPI_FIRST_ENTRY, &rptentry, SAHPI_FALSE); if (err != SA_OK) { dbg("Error! Can not find resources for test environment\n"); dbg(" File=%s, Line=%d\n", __FILE__, __LINE__); err = tcleanup(&sessionid); return SA_OK; } id = rptentry.ResourceId; /************************** * Test 4: Invalid Capability *************************/ expected_err = SA_ERR_HPI_CAPABILITY; err = saHpiSensorReadingGet(sessionid, id, sid, &reading, &state); checkstatus(err, expected_err, testfail); /*************************** * Cleanup after all tests ***************************/ err = tcleanup(&sessionid); return testfail; } #include openhpi-2.14.1/plugins/snmp_bc/t/tsim_file.c0000644000076400007640000000332011302566763015664 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * Chris Chia */ /********************************************************************** * Notes: * * Test depends on companion input file called sim_test_file, any change * in that file needs to be reflected in this test. **********************************************************************/ #include #include #include int main(int argc, char **argv) { SaErrorT err; SaHpiSessionIdT sessionid; err = saHpiSessionOpen(SAHPI_UNSPECIFIED_DOMAIN_ID, &sessionid, NULL); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } // regular sim_init is part of saHpiSessionOpen, here we close it sim_close(); // env variable OPENHPI_SIMTEST_FILE is now defined in Makefile.am // setenv("OPENHPI_SIMTEST_FILE","./sim_test_file", 1); // create hash table based on input file err = sim_file(); if (err != SA_OK) { printf(" Error! sim_file failed\n"); return -1; } /****************** * End of testcases ******************/ err = saHpiSessionClose(sessionid); if (err) { printf("Error! saHpiSessionClose: err=%d\n", err); return -1; } return 0; } openhpi-2.14.1/plugins/snmp_bc/t/tsensorget035.c0000644000076400007640000000221311302566764016337 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * Peter D Phan */ #include #include #include int main(int argc, char **argv) { /* ************************ * Local variables * ***********************/ int testfail = 0; SaErrorT err; SaErrorT expected_err; SaHpiResourceIdT id =0; SaHpiSensorNumT sid = 0; SaHpiEventStateT assertMask; SaHpiEventStateT deassertMask; /************************** * Test Invalid handler **************************/ expected_err = SA_ERR_HPI_INVALID_PARAMS; err = snmp_bc_get_sensor_event_masks(NULL, id, sid, &assertMask, &deassertMask); checkstatus(err, expected_err, testfail); return testfail; } #include openhpi-2.14.1/plugins/snmp_bc/t/tel007.c0000644000076400007640000000546211302566763014735 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * Peter D Phan */ #include #include #include int main(int argc, char **argv) { /* ************************ * Local variables * ***********************/ int testfail = 0; SaErrorT err; SaErrorT expected_err; SaHpiResourceIdT id = 0; SaHpiSessionIdT sessionid; SaHpiEventLogEntryIdT previd; SaHpiEventLogEntryIdT nextid; SaHpiEventLogEntryT entry; SaHpiRdrT rdr; SaHpiRptEntryT rptentry; /* ************************************* * Find a resource with EventLog type rdr * ************************************* */ err = tsetup(&sessionid); if (err != SA_OK) { printf("Error! Can not open session for test environment\n"); printf(" File=%s, Line=%d\n", __FILE__, __LINE__); return -1; } err = tfind_resource(&sessionid, SAHPI_CAPABILITY_EVENT_LOG, SAHPI_FIRST_ENTRY, &rptentry, SAHPI_TRUE); if (err != SA_OK) { printf("Can not find a control resource for test environment\n"); printf(" File=%s, Line=%d\n", __FILE__, __LINE__); err = tcleanup(&sessionid); return SA_OK; } id = rptentry.ResourceId; /************************** * Test **************************/ expected_err = SA_OK; err = saHpiEventLogEntryGet(sessionid, id, SAHPI_NEWEST_ENTRY, &previd, &nextid, &entry, &rdr, &rptentry); checkstatus(err, expected_err, testfail); /************************** * Test: NULL rdr * expected_err = SA_OK; **************************/ err = saHpiEventLogEntryGet(sessionid, id, SAHPI_OLDEST_ENTRY, &previd, &nextid, &entry, NULL, &rptentry); checkstatus(err, expected_err, testfail); /************************** * Test: NULL rpt * expected_err = SA_OK; **************************/ err = saHpiEventLogEntryGet(sessionid, id, SAHPI_NEWEST_ENTRY, &previd, &nextid, &entry, &rdr, NULL); checkstatus(err, expected_err, testfail); /************************** * Test: NULL rpt and rdr * expected_err = SA_OK; **************************/ err = saHpiEventLogEntryGet(sessionid, id, SAHPI_OLDEST_ENTRY, &previd, &nextid, &entry, NULL, NULL); checkstatus(err, expected_err, testfail); /*************************** * Cleanup after all tests ***************************/ err = tcleanup(&sessionid); return testfail; } #include openhpi-2.14.1/plugins/snmp_bc/t/tsensorset024.c0000644000076400007640000000544311302566763016360 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * Peter D Phan */ #include #include #include int main(int argc, char **argv) { /* ************************ * Local variables * ***********************/ int testfail = 0; SaErrorT err; SaErrorT expected_err; SaHpiResourceIdT id = 0; SaHpiSessionIdT sessionid; SaHpiRptEntryT rptentry; SaHpiRdrT rdr; SaHpiSensorNumT sid = 0; SaHpiSensorThresholdsT thres; SaHpiEntryIdT entryid; SaHpiEntryIdT nextentryid; SaHpiBoolT foundSensor; /* ************************************* * Find a resource with Sensor type rdr * ************************************* */ err = tsetup(&sessionid); if (err != SA_OK) { printf("Error! Can not open session for test environment\n"); printf(" File=%s, Line=%d\n", __FILE__, __LINE__); return -1; } err = tfind_resource(&sessionid,SAHPI_CAPABILITY_SENSOR,SAHPI_FIRST_ENTRY, &rptentry, SAHPI_TRUE); if (err != SA_OK) { printf("Error! Can not find resources for test environment\n"); printf(" File=%s, Line=%d\n", __FILE__, __LINE__); err = tcleanup(&sessionid); return SA_OK; } id = rptentry.ResourceId; /************************** * Test: find a sensor with desired property **************************/ entryid = SAHPI_FIRST_ENTRY; foundSensor = SAHPI_FALSE; do { err = saHpiRdrGet(sessionid,id,entryid,&nextentryid, &rdr); if (err == SA_OK) { if ((rdr.RdrType == SAHPI_SENSOR_RDR) && (rdr.RdrTypeUnion.SensorRec.Category == SAHPI_EC_THRESHOLD) && (rdr.RdrTypeUnion.SensorRec.ThresholdDefn.WriteThold == 0xFF) && (rdr.RdrTypeUnion.SensorRec.ThresholdDefn.ReadThold == 0xFF)) { foundSensor = SAHPI_TRUE; break; } entryid = nextentryid; } } while ((err == SA_OK) && (entryid != SAHPI_LAST_ENTRY)) ; if (!foundSensor) { err("Did not find desired resource for test\n"); return(SA_OK); } else { sid = rdr.RdrTypeUnion.SensorRec.Num; } /************************** * Test **************************/ expected_err = SA_ERR_HPI_INTERNAL_ERROR; err = saHpiSensorThresholdsSet(sessionid, id, sid, &thres); checkstatus(err, expected_err, testfail); /*************************** * Cleanup after all tests ***************************/ err = tcleanup(&sessionid); return testfail; } #include openhpi-2.14.1/plugins/snmp_bc/t/tsensorget033.c0000644000076400007640000000361011302566764016337 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * Peter D Phan */ #include #include #include int main(int argc, char **argv) { /* ************************ * Local variables * ***********************/ int testfail = 0; SaErrorT err; SaErrorT expected_err; SaHpiResourceIdT id; SaHpiSessionIdT sessionid; SaHpiSensorNumT sid = 0; SaHpiBoolT enable; SaHpiRptEntryT rptentry; /* ************************************* * Find a resource with NO Sensor type rdr * ************************************* */ err = tsetup(&sessionid); if (err != SA_OK) { printf("Error! Can not open session for test environment\n"); printf(" File=%s, Line=%d\n", __FILE__, __LINE__); return -1; } err = tfind_resource(&sessionid, SAHPI_CAPABILITY_SENSOR, SAHPI_FIRST_ENTRY, &rptentry, SAHPI_FALSE); if (err != SA_OK) { dbg("Error! Can not find resources for test environment\n"); dbg(" File=%s, Line=%d\n", __FILE__, __LINE__); err = tcleanup(&sessionid); return SA_OK; } id = rptentry.ResourceId; /************************** * Test Invalid Capability **************************/ expected_err = SA_ERR_HPI_CAPABILITY; err = saHpiSensorEventEnableGet(sessionid, id, sid, &enable); checkstatus(err, expected_err, testfail); /*************************** * Cleanup after all tests ***************************/ err = tcleanup(&sessionid); return testfail; } #include openhpi-2.14.1/plugins/snmp_bc/t/tpower001.c0000644000076400007640000000752111302566764015462 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004, 2006 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * Peter D Phan * Steve Sherman */ #include #include #include int main(int argc, char **argv) { int testfail = 0; SaErrorT err, expected_err; SaHpiPowerStateT state = 0; SaHpiResourceIdT id = 0; SaHpiRptEntryT rptentry; SaHpiSessionIdT sessionid; /*************************************** * Find a resource with Power capability ***************************************/ err = tsetup(&sessionid); if (err != SA_OK) { printf("Error! Cannot open session\n"); printf(" File=%s, Line=%d\n", __FILE__, __LINE__); return -1; } err = tfind_resource(&sessionid, SAHPI_CAPABILITY_POWER, SAHPI_FIRST_ENTRY, &rptentry, SAHPI_TRUE); if (err != SA_OK) { printf("Cannot find a Power capable resource\n"); printf(" File=%s, Line=%d\n", __FILE__, __LINE__); err = tcleanup(&sessionid); return SA_OK; } id = rptentry.ResourceId; #if 0 printf("Found resource = %s\n", rptentry.ResourceTag.Data); #endif /*********************** * Test: Invalid session ***********************/ expected_err = SA_ERR_HPI_INVALID_SESSION; err = saHpiResourcePowerStateGet(-1, id, &state); checkstatus(err, expected_err, testfail); err = saHpiResourcePowerStateSet(-1, id, state); checkstatus(err, expected_err, testfail); /************************ * Test: Invalid resource ************************/ expected_err = SA_ERR_HPI_INVALID_RESOURCE; err = saHpiResourcePowerStateGet(sessionid, -1, &state); checkstatus(err, expected_err, testfail); err = saHpiResourcePowerStateSet(sessionid, -1, state); checkstatus(err, expected_err, testfail); /************************** * Test: Invalid parameters **************************/ expected_err = SA_ERR_HPI_INVALID_PARAMS; err = saHpiResourcePowerStateGet(sessionid, id, NULL); checkstatus(err, expected_err, testfail); err = saHpiResourcePowerStateSet(sessionid, id, -1); checkstatus(err, expected_err, testfail); /************************* * Test: Normal operations *************************/ expected_err = SA_OK; err = saHpiResourcePowerStateSet(sessionid, id, SAHPI_POWER_ON); checkstatus(err, expected_err, testfail); err = saHpiResourcePowerStateGet(sessionid, id, &state); checkstatus(err, expected_err, testfail); if (state != SAHPI_POWER_ON) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Current state = %s\n", oh_lookup_powerstate(state)); return -1; } err = saHpiResourcePowerStateSet(sessionid, id, SAHPI_POWER_CYCLE); checkstatus(err, expected_err, testfail); err = saHpiResourcePowerStateGet(sessionid, id, &state); checkstatus(err, expected_err, testfail); if (state != SAHPI_POWER_ON) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Current state = %s\n", oh_lookup_powerstate(state)); return -1; } err = saHpiResourcePowerStateSet(sessionid, id, SAHPI_POWER_OFF); checkstatus(err, expected_err, testfail); #if 0 err = saHpiResourcePowerStateGet(sessionid, id, &state); checkstatus(err, expected_err, testfail); if (state != SAHPI_POWER_OFF) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Current state = %s\n", oh_lookup_powerstate(state)); return -1; } #endif /************************* * Cleanup after all tests *************************/ err = tcleanup(&sessionid); return testfail; } #include openhpi-2.14.1/plugins/snmp_bc/t/tsensorget010.c0000644000076400007640000000577311302566764016346 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * Peter D Phan */ #include #include #include int main(int argc, char **argv) { /* ************************ * Local variables * ***********************/ int testfail = 0; SaErrorT err; SaErrorT expected_err; SaHpiResourceIdT id; SaHpiSessionIdT sessionid; SaHpiRptEntryT rptentry; SaHpiRdrT rdr; SaHpiSensorNumT dd_sid = 0; SaHpiEventStateT state; SaHpiSensorReadingT reading; SaHpiEntryIdT entryid; SaHpiEntryIdT nextentryid; SaHpiBoolT foundSensor; /* ************************************* * Find a resource with Sensor type rdr * ************************************* */ err = tsetup(&sessionid); if (err != SA_OK) { printf("Error! Can not open session for test environment\n"); printf(" File=%s, Line=%d\n", __FILE__, __LINE__); return -1; } err = tfind_resource(&sessionid,SAHPI_CAPABILITY_SENSOR,SAHPI_FIRST_ENTRY, &rptentry, SAHPI_TRUE); if (err != SA_OK) { printf("Error! Can not find resources for test environment\n"); printf(" File=%s, Line=%d\n", __FILE__, __LINE__); err = tcleanup(&sessionid); return -1; } id = rptentry.ResourceId; /************************** * Test: find a sensor with desired property **************************/ entryid = SAHPI_FIRST_ENTRY; foundSensor = SAHPI_FALSE; do { err = saHpiRdrGet(sessionid,id,entryid,&nextentryid, &rdr); if (err == SA_OK) { if ((rdr.RdrType == SAHPI_SENSOR_RDR) && (rdr.RdrTypeUnion.SensorRec.DataFormat.IsSupported == SAHPI_FALSE)) { foundSensor = SAHPI_TRUE; break; } entryid = nextentryid; } } while ((err == SA_OK) && (entryid != SAHPI_LAST_ENTRY)) ; if (!foundSensor) { err("Did not find desired resource for test\n"); return(SA_OK); } else { dd_sid = rdr.RdrTypeUnion.SensorRec.Num; } /************************** * Test: Reading sensor with DataFormat.IsSupported == SAHPI_FALSE **************************/ expected_err = SA_OK; err = saHpiSensorReadingGet(sessionid, id, dd_sid, &reading, &state); checkstatus(err, expected_err, testfail); /************************** * Test: Verified returned data **************************/ if (reading.IsSupported ) { printf("Error! Invalid returned data\n"); printf(" File=%s, Line=%d\n", __FILE__, __LINE__); testfail = -1; } /*************************** * Cleanup after all tests ***************************/ err = tcleanup(&sessionid); return testfail; } #include openhpi-2.14.1/plugins/snmp_bc/t/tinv005.c0000644000076400007640000000675511302566763015135 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * Peter D Phan */ #include #include #include int main(int argc, char **argv) { /* ************************ * Local variables * ***********************/ int testfail = 0; SaErrorT err; SaErrorT expected_err; SaHpiRptEntryT rptentry; SaHpiRdrT rdr; SaHpiResourceIdT id = 0; SaHpiSessionIdT sessionid; SaHpiIdrIdT idrId = 0; SaHpiEntryIdT areaId = 0; SaHpiEntryIdT fieldId = 0; SaHpiEntryIdT nextfieldId; SaHpiIdrFieldT field; SaHpiEntryIdT entryid; SaHpiEntryIdT nextentryid; SaHpiBoolT foundControl; /* ************************************* * Find a resource with inventory capability * ************************************* */ err = tsetup(&sessionid); if (err != SA_OK) { printf("Error! Can not open session for test environment\n"); printf(" File=%s, Line=%d\n", __FILE__, __LINE__); return -1; } err = tfind_resource(&sessionid, SAHPI_CAPABILITY_INVENTORY_DATA, SAHPI_FIRST_ENTRY, &rptentry, SAHPI_TRUE); if (err != SA_OK) { printf("Can not find an Inventory resource for test environment\n"); printf(" File=%s, Line=%d\n", __FILE__, __LINE__); err = tcleanup(&sessionid); return SA_OK; } id = rptentry.ResourceId; /************************** * Test: find an Inventory RDR **************************/ entryid = SAHPI_FIRST_ENTRY; foundControl = SAHPI_FALSE; do { err = saHpiRdrGet(sessionid,id,entryid,&nextentryid, &rdr); if (err == SA_OK) { if (rdr.RdrType == SAHPI_INVENTORY_RDR) { foundControl = SAHPI_TRUE; break; } entryid = nextentryid; } } while ((err == SA_OK) && (entryid != SAHPI_LAST_ENTRY)) ; if (!foundControl) { err("Did not find desired resource for test\n"); return(SA_OK); } else { idrId = rdr.RdrTypeUnion.InventoryRec.IdrId; } /************************** * Test: Invalid FieldId **************************/ expected_err = SA_ERR_HPI_NOT_PRESENT; err = saHpiIdrFieldGet(sessionid , id, idrId, areaId, SAHPI_IDR_FIELDTYPE_UNSPECIFIED, fieldId, &nextfieldId, &field); checkstatus(err, expected_err, testfail); /************************** * Test : Normal path, with real ID **************************/ areaId = 1; fieldId = 1; expected_err = SA_OK; err = saHpiIdrFieldGet(sessionid , id, idrId, areaId, SAHPI_IDR_FIELDTYPE_UNSPECIFIED, fieldId, &nextfieldId, &field); checkstatus(err, expected_err, testfail); /************************** * Test :Normal Path with HPI defined ID * expected_err = SA_OK; **************************/ areaId = 1; fieldId = SAHPI_FIRST_ENTRY; err = saHpiIdrFieldGet(sessionid , id, idrId, areaId, SAHPI_IDR_FIELDTYPE_UNSPECIFIED, fieldId, &nextfieldId, &field); checkstatus(err, expected_err, testfail); /**************************&* * Cleanup after all tests ***************************/ err = tcleanup(&sessionid); return testfail; } #include openhpi-2.14.1/plugins/snmp_bc/t/treset001.c0000644000076400007640000000747311302566764015456 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004, 2006 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * Peter D Phan * Steve Sherman */ #include #include #include int main(int argc, char **argv) { int testfail = 0; SaErrorT err, expected_err; SaHpiResetActionT act = 0; SaHpiResourceIdT id = 0; SaHpiRptEntryT rptentry; SaHpiSessionIdT sessionid; /*************************************** * Find a resource with Reset capability ***************************************/ err = tsetup(&sessionid); if (err != SA_OK) { printf("Error! Cannot open session\n"); printf(" File=%s, Line=%d\n", __FILE__, __LINE__); return -1; } err = tfind_resource(&sessionid, SAHPI_CAPABILITY_RESET, SAHPI_FIRST_ENTRY, &rptentry, SAHPI_TRUE); if (err != SA_OK) { printf("Cannot find a Reset capable resource\n"); printf(" File=%s, Line=%d\n", __FILE__, __LINE__); err = tcleanup(&sessionid); return SA_OK; } id = rptentry.ResourceId; #if 0 printf("Found resource = %s\n", rptentry.ResourceTag.Data); #endif /*********************** * Test: Invalid session ***********************/ expected_err = SA_ERR_HPI_INVALID_SESSION; err = saHpiResourceResetStateGet(-1, id, &act); checkstatus(err, expected_err, testfail); err = saHpiResourceResetStateSet(-1, id, act); checkstatus(err, expected_err, testfail); /************************ * Test: Invalid resource ************************/ expected_err = SA_ERR_HPI_INVALID_RESOURCE; err = saHpiResourceResetStateGet(sessionid, -1, &act); checkstatus(err, expected_err, testfail); err = saHpiResourceResetStateSet(sessionid, -1, act); checkstatus(err, expected_err, testfail); /************************** * Test: Invalid parameters **************************/ expected_err = SA_ERR_HPI_INVALID_PARAMS; err = saHpiResourceResetStateGet(sessionid, id, NULL); checkstatus(err, expected_err, testfail); err = saHpiResourceResetStateSet(sessionid, id, -1); checkstatus(err, expected_err, testfail); /*********************** * Test: Invalid command ***********************/ expected_err = SA_ERR_HPI_INVALID_CMD; err = saHpiResourceResetStateSet(sessionid, id, SAHPI_RESET_ASSERT); checkstatus(err, expected_err, testfail); err = saHpiResourceResetStateSet(sessionid, id, SAHPI_RESET_DEASSERT); checkstatus(err, expected_err, testfail); /************************* * Test: Normal operations *************************/ expected_err = SA_OK; act = SAHPI_COLD_RESET; err = saHpiResourceResetStateSet(sessionid, id, act); checkstatus(err, expected_err, testfail); err = saHpiResourceResetStateGet(sessionid, id, &act); checkstatus(err, expected_err, testfail); if (act != SAHPI_RESET_DEASSERT) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Current state = %s\n", oh_lookup_resetaction(act)); return -1; } act = SAHPI_WARM_RESET; err = saHpiResourceResetStateSet(sessionid, id, act); checkstatus(err, expected_err, testfail); err = saHpiResourceResetStateGet(sessionid, id, &act); checkstatus(err, expected_err, testfail); if (act != SAHPI_RESET_DEASSERT) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Current state = %s\n", oh_lookup_resetaction(act)); return -1; } /************************* * Cleanup after all tests *************************/ err = tcleanup(&sessionid); return testfail; } #include openhpi-2.14.1/plugins/snmp_bc/t/tsensorset010.c0000644000076400007640000000554211302566764016354 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * Peter D Phan */ #include #include #include int main(int argc, char **argv) { /* ************************ * Local variables * ***********************/ int testfail = 0; SaErrorT err; SaErrorT expected_err; SaHpiRptEntryT rptentry; SaHpiRdrT rdr; SaHpiResourceIdT id; SaHpiSessionIdT sessionid; SaHpiSensorNumT sid = 0; SaHpiSensorEventMaskActionT act = SAHPI_SENS_ADD_EVENTS_TO_MASKS; SaHpiEventStateT assertMask = SAHPI_ES_UPPER_MINOR; SaHpiEventStateT deassertMask = SAHPI_ES_UPPER_CRIT; SaHpiEntryIdT entryid; SaHpiEntryIdT nextentryid; SaHpiBoolT foundSensor; /* ************************************* * Find a resource with Sensor type rdr * ************************************* */ err = tsetup(&sessionid); if (err != SA_OK) { printf("Error! Can not open session for test environment\n"); printf(" File=%s, Line=%d\n", __FILE__, __LINE__); return -1; } err = tfind_resource(&sessionid,SAHPI_CAPABILITY_SENSOR,SAHPI_FIRST_ENTRY, &rptentry, SAHPI_TRUE); if (err != SA_OK) { printf("Error! Can not find resources for test environment\n"); printf(" File=%s, Line=%d\n", __FILE__, __LINE__); err = tcleanup(&sessionid); return SA_OK; } id = rptentry.ResourceId; /************************** * Test: find a sensor with desired property **************************/ entryid = SAHPI_FIRST_ENTRY; foundSensor = SAHPI_FALSE; do { err = saHpiRdrGet(sessionid,id,entryid,&nextentryid, &rdr); if (err == SA_OK) { if ((rdr.RdrType == SAHPI_SENSOR_RDR) && (rdr.RdrTypeUnion.SensorRec.EventCtrl != SAHPI_SEC_PER_EVENT)) { foundSensor = SAHPI_TRUE; break; } entryid = nextentryid; } } while ((err == SA_OK) && (entryid != SAHPI_LAST_ENTRY)) ; if (!foundSensor) { err("Did not find desired resource for test\n"); return(SA_OK); } else { sid = rdr.RdrTypeUnion.SensorRec.Num; } /************************** * Test: Sensor with !SAHPI_SEC_PER_EVENT **************************/ expected_err = SA_ERR_HPI_READ_ONLY; err = saHpiSensorEventMasksSet(sessionid, id, sid, act, assertMask, deassertMask); checkstatus(err, expected_err, testfail); /*************************** * Cleanup after all tests ***************************/ err = tcleanup(&sessionid); return testfail; } #include openhpi-2.14.1/plugins/snmp_bc/t/tsensorget003.c0000644000076400007640000000247011302566763016336 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * Peter D Phan */ #include #include #include int main(int argc, char **argv) { /* ************************ * Local variables * ***********************/ int testfail = 0; SaErrorT err; SaErrorT expected_err; SaHpiResourceIdT id = 5000; SaHpiSensorNumT sid = 0; SaHpiEventStateT state; SaHpiSensorReadingT reading; struct oh_handler_state handle; memset(&handle, 0, sizeof(struct oh_handler_state)); /************************** * Test 3: Invalid custom_handle pointer **************************/ expected_err = SA_ERR_HPI_INVALID_PARAMS; err = snmp_bc_get_sensor_reading(&handle, id, sid, &reading, &state); checkstatus(err, expected_err, testfail); /*************************** * Cleanup after all tests ***************************/ return testfail; } #include openhpi-2.14.1/plugins/snmp_bc/t/tsensorset017.c0000644000076400007640000000643011302566763016357 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * Peter D Phan */ #include #include #include int main(int argc, char **argv) { /* ************************ * Local variables * ***********************/ int testfail = 0; SaErrorT err; SaErrorT expected_err; SaHpiRptEntryT rptentry; SaHpiRdrT rdr; SaHpiResourceIdT id; SaHpiSessionIdT sessionid; SaHpiEntryIdT entryid; SaHpiEntryIdT nextentryid; SaHpiBoolT foundSensor; SaHpiSensorNumT sid = 0; SaHpiSensorEventMaskActionT act = SAHPI_SENS_ADD_EVENTS_TO_MASKS; SaHpiEventStateT assertMask = SAHPI_ES_UPPER_MINOR; SaHpiEventStateT deassertMask = SAHPI_ES_UPPER_CRIT; /* ************************************* * Find a resource with Sensor type rdr * ************************************* */ err = tsetup(&sessionid); if (err != SA_OK) { printf("Error! Can not open session for test environment\n"); printf(" File=%s, Line=%d\n", __FILE__, __LINE__); return -1; } err = tfind_resource(&sessionid,SAHPI_CAPABILITY_SENSOR,SAHPI_FIRST_ENTRY, &rptentry, SAHPI_TRUE); if (err != SA_OK) { printf("Error! Can not find resources for test environment\n"); printf(" File=%s, Line=%d\n", __FILE__, __LINE__); err = tcleanup(&sessionid); return SA_OK; } id = rptentry.ResourceId; /************************** * Test: find a sensor with desired property **************************/ entryid = SAHPI_FIRST_ENTRY; foundSensor = SAHPI_FALSE; do { err = saHpiRdrGet(sessionid,id,entryid,&nextentryid, &rdr); if (err == SA_OK) { if ((rdr.RdrType == SAHPI_SENSOR_RDR) && (rdr.RdrTypeUnion.SensorRec.EventCtrl == SAHPI_SEC_PER_EVENT)) { foundSensor = SAHPI_TRUE; break; } entryid = nextentryid; } } while ((err == SA_OK) && (entryid != SAHPI_LAST_ENTRY)) ; if (!foundSensor) { err("Did not find desired resource for test\n"); return(SA_OK); } else { sid = rdr.RdrTypeUnion.SensorRec.Num; } /************************** * Test: excercise normal code path **************************/ act = SAHPI_SENS_REMOVE_EVENTS_FROM_MASKS; deassertMask = ~(rdr.RdrTypeUnion.SensorRec.Events); assertMask = SAHPI_ALL_EVENT_STATES; expected_err = SA_OK; err = saHpiSensorEventMasksSet(sessionid, id, sid, act, assertMask, deassertMask); checkstatus(err, expected_err, testfail); /************************** * Test excercise normal code path **************************/ assertMask = rdr.RdrTypeUnion.SensorRec.Events; expected_err = SA_OK; err = saHpiSensorEventMasksSet(sessionid, id, sid, act, assertMask, deassertMask); checkstatus(err, expected_err, testfail); /*************************** * Cleanup after all tests ***************************/ err = tcleanup(&sessionid); return testfail; } #include openhpi-2.14.1/plugins/snmp_bc/t/tsensorset021.c0000644000076400007640000000527711302566764016363 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * Peter D Phan */ #include #include #include int main(int argc, char **argv) { /* ************************ * Local variables * ***********************/ int testfail = 0; SaErrorT err; SaErrorT expected_err; SaHpiResourceIdT id = 0; SaHpiSessionIdT sessionid; SaHpiRptEntryT rptentry; SaHpiRdrT rdr; SaHpiSensorNumT sid = 0; SaHpiSensorThresholdsT thres; SaHpiEntryIdT entryid; SaHpiEntryIdT nextentryid; SaHpiBoolT foundSensor; /* ************************************* * Find a resource with Sensor type rdr * ************************************* */ err = tsetup(&sessionid); if (err != SA_OK) { printf("Error! Can not open session for test environment\n"); printf(" File=%s, Line=%d\n", __FILE__, __LINE__); return -1; } err = tfind_resource(&sessionid,SAHPI_CAPABILITY_SENSOR,SAHPI_FIRST_ENTRY, &rptentry, SAHPI_TRUE); if (err != SA_OK) { printf("Error! Can not find resources for test environment\n"); printf(" File=%s, Line=%d\n", __FILE__, __LINE__); err = tcleanup(&sessionid); return SA_OK; } id = rptentry.ResourceId; /************************** * Test: find a sensor with desired property **************************/ entryid = SAHPI_FIRST_ENTRY; foundSensor = SAHPI_FALSE; do { err = saHpiRdrGet(sessionid,id,entryid,&nextentryid, &rdr); if (err == SA_OK) { if ((rdr.RdrType == SAHPI_SENSOR_RDR) && (rdr.RdrTypeUnion.SensorRec.Category != SAHPI_EC_THRESHOLD)) { foundSensor = SAHPI_TRUE; break; } entryid = nextentryid; } } while ((err == SA_OK) && (entryid != SAHPI_LAST_ENTRY)) ; if (!foundSensor) { err("Did not find desired resource for test\n"); return(SA_OK); } else { sid = rdr.RdrTypeUnion.SensorRec.Num; } /************************** * Test: set theshold to a non-threshold sensor **************************/ expected_err = SA_ERR_HPI_INVALID_CMD; err = saHpiSensorThresholdsSet(sessionid, id, sid, &thres); checkstatus(err, expected_err, testfail); /*************************** * Cleanup after all tests ***************************/ err = tcleanup(&sessionid); return testfail; } #include openhpi-2.14.1/plugins/snmp_bc/t/tinv007.c0000644000076400007640000000547111302566763015131 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * Peter D Phan */ #include #include #include int main(int argc, char **argv) { /* ************************ * Local variables * ***********************/ int testfail = 0; SaErrorT err; SaErrorT expected_err; SaHpiRptEntryT rptentry; SaHpiRdrT rdr; SaHpiResourceIdT id = 0; SaHpiSessionIdT sessionid; SaHpiIdrIdT idrId = 0; SaHpiIdrInfoT info; SaHpiEntryIdT entryid; SaHpiEntryIdT nextentryid; SaHpiBoolT foundControl; /* ************************************* * Find a resource with inventory capability * ************************************* */ err = tsetup(&sessionid); if (err != SA_OK) { printf("Error! Can not open session for test environment\n"); printf(" File=%s, Line=%d\n", __FILE__, __LINE__); return -1; } err = tfind_resource(&sessionid, SAHPI_CAPABILITY_INVENTORY_DATA, SAHPI_FIRST_ENTRY, &rptentry, SAHPI_TRUE); if (err != SA_OK) { printf("Can not find an Inventory resource for test environment\n"); printf(" File=%s, Line=%d\n", __FILE__, __LINE__); err = tcleanup(&sessionid); return SA_OK; } id = rptentry.ResourceId; /************************** * Test: find an Inventory RDR **************************/ entryid = SAHPI_FIRST_ENTRY; foundControl = SAHPI_FALSE; do { err = saHpiRdrGet(sessionid,id,entryid,&nextentryid, &rdr); if (err == SA_OK) { if (rdr.RdrType == SAHPI_INVENTORY_RDR) { foundControl = SAHPI_TRUE; break; } entryid = nextentryid; } } while ((err == SA_OK) && (entryid != SAHPI_LAST_ENTRY)) ; if (!foundControl) { err("Did not find desired resource for test\n"); return(SA_OK); } else { idrId = rdr.RdrTypeUnion.InventoryRec.IdrId; } /************************** * Test : invalid IdrId **************************/ expected_err = SA_ERR_HPI_NOT_PRESENT; err = saHpiIdrInfoGet(sessionid, id, 5000, &info); checkstatus(err, expected_err,testfail); /************************** * Test : Valid case **************************/ expected_err = SA_OK; err = saHpiIdrInfoGet(sessionid, id, idrId, &info); checkstatus(err, expected_err, testfail); /**************************&* * Cleanup after all tests ***************************/ err = tcleanup(&sessionid); return testfail; } #include openhpi-2.14.1/plugins/snmp_bc/t/tsensorget031.c0000644000076400007640000000453611302566764016345 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * Peter D Phan */ #include #include #include int main(int argc, char **argv) { /* ************************ * Local variables * ***********************/ int testfail = 0; SaErrorT err; SaErrorT expected_err; SaHpiRptEntryT rptentry; SaHpiResourceIdT id; SaHpiSessionIdT sessionid; SaHpiSensorNumT sid = 0; SaHpiBoolT enable; /* ************************************* * Find a resource with NO Sensor type rdr * ************************************* */ err = tsetup(&sessionid); if (err != SA_OK) { printf("Error! Can not open session for test environment\n"); printf(" File=%s, Line=%d\n", __FILE__, __LINE__); return -1; } err = tfind_resource(&sessionid, SAHPI_CAPABILITY_SENSOR, SAHPI_FIRST_ENTRY, &rptentry, SAHPI_TRUE); if (err != SA_OK) { printf("Error! Can not find resources for test environment\n"); printf(" File=%s, Line=%d\n", __FILE__, __LINE__); err = tcleanup(&sessionid); return SA_OK; } id = rptentry.ResourceId; /************************** * Test:invalid handler **************************/ expected_err = SA_ERR_HPI_INVALID_PARAMS; err = snmp_bc_get_sensor_event_enable(NULL, id, sid, &enable); checkstatus(err, expected_err, testfail); /************************** * Test: invalid data pointer **************************/ expected_err = SA_ERR_HPI_INVALID_PARAMS; err = saHpiSensorEventEnableGet(sessionid, id, sid, NULL); checkstatus(err, expected_err, testfail); /************************** * Test 32 **************************/ expected_err = SA_ERR_HPI_INVALID_RESOURCE; err = saHpiSensorEventEnableGet(sessionid, 5000, sid, &enable); checkstatus(err, expected_err, testfail); /*************************** * Cleanup after all tests ***************************/ err = tcleanup(&sessionid); return testfail; } #include openhpi-2.14.1/plugins/snmp_bc/t/tsensorset002.c0000644000076400007640000000525311302566764016354 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * Peter D Phan */ #include #include #include int main(int argc, char **argv) { /* ************************ * Local variables * ***********************/ int testfail = 0; SaErrorT err; SaErrorT expected_err; SaHpiRptEntryT rptentry; SaHpiRdrT rdr; SaHpiResourceIdT id; SaHpiSessionIdT sessionid; SaHpiEntryIdT entryid; SaHpiEntryIdT nextentryid; SaHpiBoolT foundSensor; SaHpiSensorNumT sid = 0; SaHpiBoolT enable = SAHPI_FALSE; /* ************************************* * Find a resource with Sensor type rdr * ************************************* */ err = tsetup(&sessionid); if (err != SA_OK) { printf("Error! Can not open session for test environment\n"); printf(" File=%s, Line=%d\n", __FILE__, __LINE__); return -1; } err = tfind_resource(&sessionid,SAHPI_CAPABILITY_SENSOR,SAHPI_FIRST_ENTRY, &rptentry, SAHPI_TRUE); if (err != SA_OK) { printf("Error! Can not find resources for test environment\n"); printf(" File=%s, Line=%d\n", __FILE__, __LINE__); err = tcleanup(&sessionid); return SA_OK; } id = rptentry.ResourceId; /************************** * Test: find a sensor with desired property **************************/ entryid = SAHPI_FIRST_ENTRY; foundSensor = SAHPI_FALSE; do { err = saHpiRdrGet(sessionid,id,entryid,&nextentryid, &rdr); if (err == SA_OK) { if ((rdr.RdrType == SAHPI_SENSOR_RDR) && (rdr.RdrTypeUnion.SensorRec.DataFormat.IsSupported == SAHPI_FALSE)) { foundSensor = SAHPI_TRUE; break; } entryid = nextentryid; } } while ((err == SA_OK) && (entryid != SAHPI_LAST_ENTRY)) ; if (!foundSensor) { err("Did not find desired resource for test\n"); return(SA_OK); } else { sid = rdr.RdrTypeUnion.SensorRec.Num; } /************************** * Test: invalid Capability **************************/ expected_err = SA_ERR_HPI_READ_ONLY; err = saHpiSensorEnableSet(sessionid, id, sid, enable); checkstatus(err, expected_err, testfail); /*************************** * Cleanup after all tests ***************************/ err = tcleanup(&sessionid); return testfail; } #include openhpi-2.14.1/plugins/snmp_bc/t/sim_resources.h0000644000076400007640000000161311302566764016604 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2003, 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * Steve Sherman */ #ifndef __SIM_RESOURCES_H #define __SIM_RESOURCES_H typedef union { char string[MAX_ASN_STR_LEN]; long integer; } SnmpValueT; typedef struct { int type; SnmpValueT value; } SnmpMibInfoT; struct snmp_bc_data { const char *oid; SnmpMibInfoT mib; }; extern GHashTable * sim_hash; extern struct snmp_bc_data sim_resource_array[]; #define SNMP_FORCE_TIMEOUT -7777 #define SNMP_FORCE_ERROR -9999 #endif openhpi-2.14.1/plugins/snmp_bc/t/tsensorset008.c0000644000076400007640000000710311302566764016356 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * Peter D Phan */ #include #include #include int main(int argc, char **argv) { /* ************************ * Local variables * ***********************/ int testfail = 0; SaErrorT err; SaErrorT expected_err; SaHpiRptEntryT rptentry; SaHpiRdrT rdr; SaHpiResourceIdT id; SaHpiSessionIdT sessionid; SaHpiBoolT enable = SAHPI_FALSE; SaHpiSensorNumT sid = 0; SaHpiEntryIdT entryid; SaHpiEntryIdT nextentryid; SaHpiBoolT foundSensor; /* ************************************* * Find a resource with Sensor type rdr * ************************************* */ err = tsetup(&sessionid); if (err != SA_OK) { printf("Error! Can not open session for test environment\n"); printf(" File=%s, Line=%d\n", __FILE__, __LINE__); return -1; } err = tfind_resource(&sessionid,SAHPI_CAPABILITY_SENSOR,SAHPI_FIRST_ENTRY, &rptentry, SAHPI_TRUE); if (err != SA_OK) { printf("Error! Can not find resources for test environment\n"); printf(" File=%s, Line=%d\n", __FILE__, __LINE__); err = tcleanup(&sessionid); return SA_OK; } id = rptentry.ResourceId; /************************** * Test: find a sensor with desired property **************************/ entryid = SAHPI_FIRST_ENTRY; foundSensor = SAHPI_FALSE; do { err = saHpiRdrGet(sessionid,id,entryid,&nextentryid, &rdr); if (err == SA_OK) { if ((rdr.RdrType == SAHPI_SENSOR_RDR) && (rdr.RdrTypeUnion.SensorRec.EventCtrl == SAHPI_SEC_PER_EVENT)) { foundSensor = SAHPI_TRUE; break; } entryid = nextentryid; } } while ((err == SA_OK) && (entryid != SAHPI_LAST_ENTRY)) ; if (!foundSensor) { err("Did not find desired resource for test\n"); return(SA_OK); } else { sid = rdr.RdrTypeUnion.SensorRec.Num; } /************************** * Test **************************/ enable = SAHPI_FALSE; expected_err = SA_OK; err = saHpiSensorEventEnableSet(sessionid, id, sid, enable); checkstatus(err, expected_err, testfail); /************************** * Test: find a sensor with desired property **************************/ entryid = SAHPI_FIRST_ENTRY; foundSensor = SAHPI_FALSE; do { err = saHpiRdrGet(sessionid,id,entryid,&nextentryid, &rdr); if (err == SA_OK) { if ((rdr.RdrType == SAHPI_SENSOR_RDR) && (rdr.RdrTypeUnion.SensorRec.EventCtrl == SAHPI_SEC_READ_ONLY_MASKS)) { foundSensor = SAHPI_TRUE; break; } entryid = nextentryid; } } while ((err == SA_OK) && (entryid != SAHPI_LAST_ENTRY)) ; if (!foundSensor) { err("Did not find desired resource for test\n"); return(SA_OK); } else { sid = rdr.RdrTypeUnion.SensorRec.Num; } /************************** * Test * expected_err = SA_OK; **************************/ enable = SAHPI_TRUE; err = saHpiSensorEventEnableSet(sessionid, id, sid, enable); checkstatus(err, expected_err, testfail); /*************************** * Cleanup after all tests ***************************/ err = tcleanup(&sessionid); return testfail; } #include openhpi-2.14.1/plugins/snmp_bc/t/tdiscover001.c0000644000076400007640000000211411302566764016135 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * Peter D Phan */ #include #include #include int main(int argc, char **argv) { /* ************************ * Local variables * ***********************/ int testfail = 0; SaErrorT err; SaErrorT expected_err; /************************** * Test : Invalid handle **************************/ expected_err = SA_ERR_HPI_INVALID_PARAMS; err = snmp_bc_discover_resources(NULL); checkstatus(err, expected_err, testfail); /************************** * Cleanup after all tests ***************************/ return testfail; } #include openhpi-2.14.1/plugins/snmp_bc/t/tsensorget040.c0000644000076400007640000000366111302566764016343 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * Peter D Phan */ #include #include #include int main(int argc, char **argv) { /* ************************ * Local variables * ***********************/ int testfail = 0; SaErrorT err; SaErrorT expected_err; SaHpiResourceIdT id; SaHpiSessionIdT sessionid; SaHpiRptEntryT rptentry; SaHpiSensorNumT sid = 0; SaHpiEventStateT assertMask; SaHpiEventStateT deassertMask; /* *************************************** * Find a resource with No Sensor type rdr * ***************************************/ err = tsetup(&sessionid); if (err != SA_OK) { printf("Error! Can not open session for test environment\n"); printf(" File=%s, Line=%d\n", __FILE__, __LINE__); return -1; } err = tfind_resource(&sessionid,SAHPI_CAPABILITY_SENSOR,SAHPI_FIRST_ENTRY, &rptentry, SAHPI_FALSE); if (err != SA_OK) { dbg("Error! Can not find resources for test environment\n"); dbg(" File=%s, Line=%d\n", __FILE__, __LINE__); err = tcleanup(&sessionid); return SA_OK; } id = rptentry.ResourceId; /************************** * Test Capability checking **************************/ expected_err = SA_ERR_HPI_CAPABILITY; err = saHpiSensorEventMasksGet(sessionid, id, sid, &assertMask, &deassertMask); checkstatus(err, expected_err, testfail); /*************************** * Cleanup after all tests ***************************/ err = tcleanup(&sessionid); return testfail; } #include openhpi-2.14.1/plugins/snmp_bc/t/openhpi.conf0000644000076400007640000000722311302566764016065 0ustar #File format is outlined here and examples are given ###First section, declare global parameters #example: #global { # OPENHPI_LOG_SEV = "MAJOR" # OPENHPI_ON_EP = "{SYSTEM_CHASSIS,1}" #} #Parameters in the global stanza will be converted to #environment variables. #OPENHPI_LOG_SEV sets which events will be logged in the domain #system event log based on severity: CRITICAL, MAJOR, MINOR, #INFORMATIONAL, OK, and DEBUG. #OPENHPI_ON_EP sets the entity path on wich the application is running. ###Second section, declare plugin to use: #example: #plugin plugin-name #plugin libdummy #Depends on openipmi to be installed on this system: #plugin libipmi #Depends on net-snmp being installed on the system: plugin libsnmp_bc #Depends openhpi being configured #"configure --enable-dummy=static": #plugin dummy #plugin libipmidirect ############################################################################# ##**WARNING** System administrators have to make sure that entity paths are ## unique in a domain. If entity paths are conflicting among handlers, make ## sure the "entity_root" is unique here across handlers. ############################################################################# ###Third section is a handler (instance) declaration with arguments understood by plugin #Strings are enclosed by "", numbers are not. #handler libdummy { # entity_root = "{SYSTEM_CHASSIS,1}" # name = "test" # addr = 0 #} # Dummy allows you open second virtual by addr 1 #handler libdummy { # addr = 1 #} #section for ipmi plugin using SMI -- local interface #handler libipmi { # entity_root = "{SYSTEM_CHASSIS,2}" # name = "smi" # addr = 0 #} #Section for ipmi plugin based on OpenIPMI: #handler libipmi { # entity_root = "{SYSTEM_CHASSIS,3}" # name = "lan" # addr = "x.x.x.x" #ipaddress # port = 999 # auth_type = "straight" # auth_level= "user" # username = "joe" # password = "blow" #} #Section for snmp_bc plugin: #The root entry can be omitted in 'entity_root', #but not the chassis entry. handler libsnmp_bc { entity_root = "{SYSTEM_CHASSIS,1}" # Required host = "1.2.3.4" # Required community = "test" # Version 1 Required. version = "1" # Required. SNMP protocol version (1|3) security_name = "snmpv3_user" # Version 3 Required. passphrase = "opensesame" # Version 3. Required if security_level is authNoPriv or authPriv. auth_type = "MD5" # Version 3. Passphrase encoding (MD5|SHA) security_level = "noAuthNoPriv" # Version 3. (noAuthNoPriv|authNoPriv|authPriv) } #Section for static dummy plugin: #If openhpi configured with #configure --enable-dummy=static #the dummy plugin is compiled in. #It is possible to use dummy and libdummy #at the same time. #handler dummy { # entity_root = "{SYSTEM_CHASSIS,5}" # name = "test" # addr = 2 #} #section for ipmidirect plugin using SMI -- local interface #handler libipmidirect { # entity_root = "{SYSTEM_CHASSIS,6}" # name = "smi" # addr = 0 #} #Section for ipmidirect plugin using RMCP: #handler libipmidirect { # entity_root = "{SYSTEM_CHASSIS,7}" # name = "lan" # RMCP # addr = "localhost" # ipaddress # port = "623" # RMCP port # auth_type = "none" # none, md2, md5 or straight # auth_level = "admin" # none, callback, user, operator or admin # username = "arthur" # password = "pieman" # logflags = "" # logging off # # logflags = "file stdout" # # infos goes to logfile and stdout # # the logfile are log00.log, log01.log ... # # if #logfile_max reached replace the oldest one # logfile = "log" # logfile_max = 10 #} openhpi-2.14.1/plugins/snmp_bc/t/tcontrol002.c0000644000076400007640000000576111302566764016013 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * Peter D Phan */ #include #include #include int main(int argc, char **argv) { /* ************************ * Local variables * ***********************/ int testfail = 0; SaErrorT err; SaErrorT expected_err; SaHpiResourceIdT id; SaHpiSessionIdT sessionid; SaHpiRptEntryT rptentry; SaHpiRdrT rdr; SaHpiCtrlNumT cid = 1; SaHpiCtrlModeT mode; SaHpiCtrlStateT state; SaHpiEntryIdT entryid; SaHpiEntryIdT nextentryid; SaHpiBoolT foundControl; /* ************************************* * Find a resource with Control type rdr * ************************************* */ err = tsetup(&sessionid); if (err != SA_OK) { printf("Error! Can not open session for test environment\n"); printf(" File=%s, Line=%d\n", __FILE__, __LINE__); return -1; } err = tfind_resource(&sessionid, SAHPI_CAPABILITY_CONTROL, SAHPI_FIRST_ENTRY, &rptentry, SAHPI_TRUE); if (err != SA_OK) { printf("Can not find a control resource for test environment\n"); printf(" File=%s, Line=%d\n", __FILE__, __LINE__); err = tcleanup(&sessionid); return SA_OK; } id = rptentry.ResourceId; /************************** * Test: find a control RDR **************************/ entryid = SAHPI_FIRST_ENTRY; foundControl = SAHPI_FALSE; do { err = saHpiRdrGet(sessionid,id,entryid,&nextentryid, &rdr); if (err == SA_OK) { if (rdr.RdrType == SAHPI_CTRL_RDR) { foundControl = SAHPI_TRUE; break; } entryid = nextentryid; } } while ((err == SA_OK) && (entryid != SAHPI_LAST_ENTRY)) ; if (!foundControl) { err("Did not find desired resource for test\n"); return(SA_OK); } else { cid = rdr.RdrTypeUnion.CtrlRec.Num; } /************************** * Test 1: Normal get *************************/ expected_err = SA_OK; err = saHpiControlGet(sessionid, id, cid, &mode, &state); checkstatus(err, expected_err, testfail); /************************** * Test 2: Get with no mode * expected_err = SA_OK; *************************/ err = saHpiControlGet(sessionid, id, cid, NULL, &state); checkstatus(err, expected_err, testfail); /************************** * Test 3: Get with no state * expected_err = SA_OK; *************************/ err = saHpiControlGet(sessionid, id, cid, &mode, NULL); checkstatus(err, expected_err, testfail); /*************************** * Cleanup after all tests ***************************/ err = tcleanup(&sessionid); return testfail; } #include openhpi-2.14.1/plugins/snmp_bc/t/tsetup.h0000644000076400007640000000433711302566764015254 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004, 2006 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * Peter D Phan */ #ifndef TSETUP_H #define TSETUP_H SaErrorT tsetup (SaHpiSessionIdT *sessionid_ptr); SaErrorT tfind_resource(SaHpiSessionIdT *sessionid_ptr, SaHpiCapabilitiesT search_rdr_type, SaHpiEntryIdT i_rptentryid, SaHpiRptEntryT *rptentry, SaHpiBoolT samecap); SaErrorT tfind_resource_by_ep(SaHpiSessionIdT *sessionid_ptr, SaHpiEntityPathT *ep, SaHpiEntryIdT i_rptentryid, SaHpiRptEntryT *rptentry); SaErrorT tfind_rdr_by_name(SaHpiSessionIdT *sessionid_ptr, SaHpiResourceIdT rid, char *rdr_name, SaHpiRdrT *rdr); SaErrorT tcleanup(SaHpiSessionIdT *sessionid_ptr); #define checkstatus(err, expected_err, testfail) \ do { \ if (err != expected_err) { \ printf("Error! Test fails: File=%s, Line=%d\n", __FILE__, __LINE__); \ printf("Returned err=%s, expected=%s\n", \ oh_lookup_error(err), oh_lookup_error(expected_err)); \ testfail = -1; \ } \ } while(0) #define DECLARE_HANDLE() \ do { \ SaHpiSessionIdT sessionid; \ SaHpiDomainIdT did; \ struct oh_handler *h = NULL; \ struct oh_domain *d = NULL; \ unsigned int *hid = NULL; \ struct oh_handler_state *handle; \ } while(0) #define INIT_HANDLE(did, d, hid, h, handle) \ do { \ did = oh_get_session_domain(sessionid); \ d = oh_get_domain(did); \ hid = oh_get_resource_data(&(d->rpt), id); \ h = oh_get_handler(*hid); \ handle = (struct oh_handler_state *) h->hnd; \ } while(0) #endif openhpi-2.14.1/plugins/snmp_bc/t/tsensorset019.c0000644000076400007640000000520711302566763016362 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * Peter D Phan */ #include #include #include int main(int argc, char **argv) { /* ************************ * Local variables * ***********************/ int testfail = 0; SaErrorT err; SaErrorT expected_err; SaHpiRptEntryT rptentry; SaHpiResourceIdT id = 0; SaHpiSessionIdT sessionid; SaHpiSensorNumT sid = 0; SaHpiSensorThresholdsT thres; /* ************************************* * Find a resource with Sensor type rdr * ************************************* */ err = tsetup(&sessionid); if (err != SA_OK) { printf("Error! Can not open session for test environment\n"); printf(" File=%s, Line=%d\n", __FILE__, __LINE__); return -1; } err = tfind_resource(&sessionid,SAHPI_CAPABILITY_SENSOR,SAHPI_FIRST_ENTRY, &rptentry, SAHPI_TRUE); if (err != SA_OK) { printf("Error! Can not find resources for test environment\n"); printf(" File=%s, Line=%d\n", __FILE__, __LINE__); err = tcleanup(&sessionid); return SA_OK; } id = rptentry.ResourceId; /************************** * Test: Invalid handler **************************/ expected_err = SA_ERR_HPI_INVALID_PARAMS; err = snmp_bc_set_sensor_thresholds(NULL, id, sid, &thres); checkstatus(err, expected_err, testfail); /************************** * Test: Invalid pointer **************************/ expected_err = SA_ERR_HPI_INVALID_PARAMS; err = saHpiSensorThresholdsSet(sessionid, id, sid, NULL); checkstatus(err, expected_err, testfail); /************************** * Test: Invalid resource **************************/ expected_err = SA_ERR_HPI_INVALID_RESOURCE; err = saHpiSensorThresholdsSet(sessionid, 5000, sid, &thres); checkstatus(err, expected_err, testfail); /************************** * Test: Invalid sensor id **************************/ expected_err = SA_ERR_HPI_NOT_PRESENT; err = saHpiSensorThresholdsSet(sessionid, id, 5000, &thres); checkstatus(err, expected_err, testfail); /*************************** * Cleanup after all tests ***************************/ err = tcleanup(&sessionid); return testfail; } #include openhpi-2.14.1/plugins/snmp_bc/t/snmp_utils.c0000644000076400007640000000476511302566764016125 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2003 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Steve Sherman */ #include #include #include #include int snmp_get(void *sessp, const char *objid, struct snmp_value *value) { SnmpMibInfoT *hash_data; hash_data = (SnmpMibInfoT *)g_hash_table_lookup(sim_hash, objid); if (hash_data) { value->type = hash_data->type; switch (value->type) { case ASN_INTEGER: value->integer = hash_data->value.integer; if (value->integer == SNMP_FORCE_ERROR) { return -1; } if (value->integer == SNMP_FORCE_TIMEOUT) {return SA_ERR_HPI_TIMEOUT;} if (value->integer == SA_ERR_SNMP_NOSUCHOBJECT) { return SA_ERR_HPI_NOT_PRESENT; } break; case ASN_OCTET_STR: strcpy(value->string, hash_data->value.string); value->str_len = strlen(hash_data->value.string); break; default: err("Unknown SNMP type=%d for oid=%s\n", value->type, objid); return -1; } } else { err("No value in sim_hash for OID = %s\n", objid); return SA_ERR_HPI_NOT_PRESENT; } return 0; } int snmp_set(void *sessp, char *objid, struct snmp_value value) { SnmpMibInfoT *hash_data; hash_data = (SnmpMibInfoT *)g_hash_table_lookup(sim_hash, objid); if (hash_data) { switch (hash_data->type) { case ASN_INTEGER: err("Setting oid=%s with value=%d\n", objid, (int)hash_data->value.integer); if (hash_data->value.integer == SNMP_FORCE_TIMEOUT) {return SA_ERR_HPI_TIMEOUT;} hash_data->value.integer = value.integer; break; case ASN_OCTET_STR: err("Setting oid=%s with value=%s\n", objid, hash_data->value.string); strcpy(hash_data->value.string, value.string); break; default: err("Unknown SNMP type=%d for oid=%s\n", hash_data->type, objid); return -1; } } else { err("No value in sim_hash for OID = %s\n", objid); return SA_ERR_HPI_NOT_PRESENT; } return 0; } int snmp_getn_bulk( void *sessp, oid *bulk_objid, size_t bulk_objid_len, struct snmp_pdu *bulk_pdu, struct snmp_pdu **bulk_response, int num_repetitions ) { return 0; } openhpi-2.14.1/plugins/snmp_bc/t/sim_file.c0000644000076400007640000001647011302566763015512 0ustar /* -*- linux-c -*- * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * Chris Chia * * Main function: * Parse a file, either pointed to by the environmental variable OPENHPI_SIMTEST_FILE * or default file name "test_file", to build a hash table that will be used by * bladecenter/RSA simulator to simulate resource access. * * Each line in input file represents an entry in the hash table * for example: * .1.3.6.1.4.1.2.3.51.2.2.3.1.0 = STRING: " 46% of maximum" * ".1.3.6..." is the key into hash table * STRING and "46% of maximum" are values associated to this key * Sample input file * .1.3.6.1.2.1.1.2.0 = OID: .1.3.6.1.4.1.2.6.158.3 * .1.3.6.1.4.1.2.3.51.2.2.3.1.0 = STRING: " 46% of maximum" * .1.3.6.1.4.1.2.3.51.2.2.5.2.6.0 = INTEGER: 0 * .1.3.6.1.4.1.2.3.51.2.2.21.8.1.1.9.1 = Hex-STRING: D0 07 F0 D2 * .1.3.6.1.4.1.2.3.51.2.2.21.21.1.7.14 = "" * .1.3.6.1.4.1.2.3.51.2.22.5.1.1.3.1 = IpAddress: 9.3.202.71 * .1.3.6.1.6.3.11.2.1.1.0 = Counter32: 0 * .1.3.6.1.6.3.12.1.1.0 = INTEGER: 0 * .1.3.6.1.6.3.12.1.2.1.2.72.111.115.116.49 = Wrong Type (should be OBJECT IDENTIFIER): INTEGER: 1 * * Input file can be hand made or the output of snmp walk, such as: * snmpwalk -v 3 -t 10 -l authNoPriv -A netsnmpv3 -n "" -u $user $host -Of -On .1 * */ #include #include #include #include #include #include #include //static void print_entry(gpointer, gpointer, gpointer); // hash table debug code //static void print_entry (gpointer key, gpointer val, gpointer data) //{ // SnmpMibInfoT* key_val = val; // printf ("\t%s translates to ", (gchar *)key); // if (key_val->type == ASN_INTEGER ) // printf (" integer type: %d \n", (int)key_val->value.integer); // else if (key_val->type == ASN_OCTET_STR ) // printf (" string type: %s \n", key_val->value.string); // else printf(" invalid type: %d\n", key_val->type); //} static void free_hash_data(gpointer key, gpointer value, gpointer user_data); SaErrorT sim_file() { #define MAX_STR_LEN 1024 #define STD_TOKEN_CNT 4 FILE *file; char *file_in; char file_std[] = "./sim_test_file"; char str_in[MAX_STR_LEN]; gchar OID_HDR[] = ".1.3.6.1.4.1.2.3.51.?"; gchar BC_OID_HDR[] = ".1.3.6.1.4.1.2.3.51.2"; gchar RSA_OID_HDR[] = ".1.3.6.1.4.1.2.3.51.1"; gchar STR_TYPE[] = "STRING:"; gchar INT_TYPE[] = "INTEGER:"; gchar **tokens = NULL; gchar *tmpstr = NULL; const gchar *str_delimiter = " "; int valid, invalid, total, token_cnt, ii; int rc; gboolean found_plat = FALSE; gchar *key = NULL; gchar *key_exists = NULL; SnmpMibInfoT *mibinfo; rc = valid = invalid = total = token_cnt = ii = 0; file_in = getenv("OPENHPI_SIMTEST_FILE"); if (!file_in) file_in = file_std; dbg("file to be tested - %s\n", file_in); file = fopen( file_in, "r"); if ( file == NULL ) { printf("file %s open failed\n", file_in); rc = -1; goto cleanup; } clearerr( file ); sim_hash = g_hash_table_new(g_str_hash, g_str_equal); if (sim_hash == NULL) { printf("Cannot allocate simulation hash table"); rc = -1; goto cleanup; } dbg("---- hash table address %p ----\n", sim_hash); while ( !feof(file) ) { // process each line in file dbg("xxx--- hash table size %d ---xxx\n", g_hash_table_size(sim_hash)); //g_hash_table_foreach (sim_hash, print_entry, NULL); if (fgets(str_in, MAX_STR_LEN, file) == NULL) dbg("xxx--- Experience problem, check env OPENHPI_SIMTEST_FILE or ./sim_test_file ---xxx\n"); //dbg("%s", str_in); g_strstrip(str_in); if (str_in[0] == '\0') { //dbg("Skipped a blank line\n"); continue; } total++; tokens = g_strsplit(str_in, str_delimiter, STD_TOKEN_CNT); for (token_cnt=0; tokens[token_cnt]; token_cnt++); //dbg("line has %d tokens\n", token_cnt); if (token_cnt != STD_TOKEN_CNT) { //dbg("Error: tokens (%d) < then expected\n",token_cnt); g_strfreev(tokens); invalid++; continue; } if ( found_plat == FALSE ) { // not knowing which platform to test // first see if this is BladeCenter tmpstr = strstr(tokens[0], BC_OID_HDR); if (tmpstr != tokens[0]) { // then see if it's RSA tmpstr = strstr(tokens[0], RSA_OID_HDR); if (tmpstr != tokens[0]) { // not a valid platform, skip this line //dbg("invalid oid %s\n", tokens[0]); g_strfreev(tokens); invalid++; continue; } else { // we are testing RSA found_plat = TRUE; strcpy( OID_HDR, RSA_OID_HDR ); } } else { // we are testing BladeCenter found_plat = TRUE; strcpy( OID_HDR, BC_OID_HDR ); } } else { // platform has been identified, check against ID tmpstr = strstr(tokens[0], OID_HDR); if (tmpstr != tokens[0]) { g_strfreev(tokens); invalid++; continue; } } key = g_strdup(tokens[0]); //dbg("key = %s\n", key); key_exists = g_hash_table_lookup(sim_hash, key); if (key_exists) { // key already processed, skip this line dbg("=== oid %s already processed ===\n", key); g_free(key); g_strfreev(tokens); invalid++; continue; } mibinfo = g_malloc0(sizeof(SnmpMibInfoT)); if (!mibinfo) { printf("Error: Malloc failed for oid (%s) hash", tmpstr); invalid++; g_free(key); g_strfreev(tokens); rc = -1; goto cleanup; } if (!g_ascii_strcasecmp(tokens[2], INT_TYPE)) { // Integer dbg("=== oid %s got a int type: %d\n", key, atoi(tokens[3])); mibinfo->value.integer = atoi(tokens[3]); mibinfo->type = ASN_INTEGER; g_hash_table_insert(sim_hash, key, mibinfo); g_strfreev(tokens); valid++; } else if (!g_ascii_strcasecmp(tokens[2], STR_TYPE)) { // String // delete quote marks (") at both ends of string tmpstr = tokens[3]; if ( *tmpstr == '\"' ) tmpstr++; ii = strlen( tmpstr ); if (tmpstr[ii -1] == '\"') tmpstr[ii -1] = '\0'; dbg("=== oid %s got a string type: %s\n", key, tmpstr); strcpy(mibinfo->value.string, tmpstr); mibinfo->type = ASN_OCTET_STR; g_hash_table_insert(sim_hash, key, mibinfo); g_strfreev(tokens); valid++; } else { dbg("not a valid type %s\n", tokens[2]); g_free(key); g_strfreev(tokens); g_free(mibinfo); invalid++; } } dbg("%d out of %d lines in file %s got processed\n", valid, total, file_in); fclose( file ); // g_hash_table_foreach (sim_hash, print_entry, NULL); goto done; cleanup: fclose( file ); g_hash_table_foreach(sim_hash, free_hash_data, NULL); g_hash_table_destroy(sim_hash); done: return rc; } static void free_hash_data(gpointer key, gpointer value, gpointer user_data) { g_free(key); g_free(value); } openhpi-2.14.1/plugins/snmp_bc/t/tsensorset015.c0000644000076400007640000000640011302566763016352 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * Peter D Phan */ #include #include #include int main(int argc, char **argv) { /* ************************ * Local variables * ***********************/ int testfail = 0; SaErrorT err; SaErrorT expected_err; SaHpiRptEntryT rptentry; SaHpiRdrT rdr; SaHpiResourceIdT id; SaHpiSessionIdT sessionid; SaHpiEntryIdT entryid; SaHpiEntryIdT nextentryid; SaHpiBoolT foundSensor; SaHpiSensorNumT sid = 0; SaHpiSensorEventMaskActionT act = SAHPI_SENS_ADD_EVENTS_TO_MASKS; SaHpiEventStateT assertMask = SAHPI_ES_UPPER_MINOR; SaHpiEventStateT deassertMask = SAHPI_ES_UPPER_CRIT; /* ************************************* * Find a resource with Sensor type rdr * ************************************* */ err = tsetup(&sessionid); if (err != SA_OK) { printf("Error! Can not open session for test environment\n"); printf(" File=%s, Line=%d\n", __FILE__, __LINE__); return -1; } err = tfind_resource(&sessionid,SAHPI_CAPABILITY_SENSOR,SAHPI_FIRST_ENTRY, &rptentry, SAHPI_TRUE); if (err != SA_OK) { printf("Error! Can not find resources for test environment\n"); printf(" File=%s, Line=%d\n", __FILE__, __LINE__); err = tcleanup(&sessionid); return SA_OK; } id = rptentry.ResourceId; /************************** * Test: find a sensor with desired property **************************/ entryid = SAHPI_FIRST_ENTRY; foundSensor = SAHPI_FALSE; do { err = saHpiRdrGet(sessionid,id,entryid,&nextentryid, &rdr); if (err == SA_OK) { if ((rdr.RdrType == SAHPI_SENSOR_RDR) && (rdr.RdrTypeUnion.SensorRec.EventCtrl == SAHPI_SEC_PER_EVENT)) { foundSensor = SAHPI_TRUE; break; } entryid = nextentryid; } } while ((err == SA_OK) && (entryid != SAHPI_LAST_ENTRY)) ; if (!foundSensor) { err("Did not find desired resource for test\n"); return(SA_OK); } else { sid = rdr.RdrTypeUnion.SensorRec.Num; } /************************** * Test : Normal path **************************/ act = SAHPI_SENS_ADD_EVENTS_TO_MASKS; deassertMask = ~(rdr.RdrTypeUnion.SensorRec.Events); assertMask = SAHPI_ALL_EVENT_STATES; expected_err = SA_OK; err = saHpiSensorEventMasksSet(sessionid, id, sid, act, assertMask, deassertMask); checkstatus(err, expected_err, testfail); /************************** * Test: Normal path **************************/ assertMask = rdr.RdrTypeUnion.SensorRec.Events; expected_err = SA_OK; err = saHpiSensorEventMasksSet(sessionid, id, sid, act, assertMask, deassertMask); checkstatus(err, expected_err, testfail); /*************************** * Cleanup after all tests ***************************/ err = tcleanup(&sessionid); return testfail; } #include openhpi-2.14.1/plugins/snmp_bc/t/tsensorset022.c0000644000076400007640000000541611302566763016356 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * Peter D Phan */ #include #include #include int main(int argc, char **argv) { /* ************************ * Local variables * ***********************/ int testfail = 0; SaErrorT err; SaErrorT expected_err; SaHpiResourceIdT id = 0; SaHpiSessionIdT sessionid; SaHpiRptEntryT rptentry; SaHpiRdrT rdr; SaHpiSensorNumT sid = 0; SaHpiSensorThresholdsT thres; SaHpiEntryIdT entryid; SaHpiEntryIdT nextentryid; SaHpiBoolT foundSensor; /* ************************************* * Find a resource with Sensor type rdr * ************************************* */ err = tsetup(&sessionid); if (err != SA_OK) { printf("Error! Can not open session for test environment\n"); printf(" File=%s, Line=%d\n", __FILE__, __LINE__); return -1; } err = tfind_resource(&sessionid,SAHPI_CAPABILITY_SENSOR,SAHPI_FIRST_ENTRY, &rptentry, SAHPI_TRUE); if (err != SA_OK) { printf("Error! Can not find resources for test environment\n"); printf(" File=%s, Line=%d\n", __FILE__, __LINE__); err = tcleanup(&sessionid); return SA_OK; } id = rptentry.ResourceId; /************************** * Test: find a sensor with desired property **************************/ entryid = SAHPI_FIRST_ENTRY; foundSensor = SAHPI_FALSE; do { err = saHpiRdrGet(sessionid,id,entryid,&nextentryid, &rdr); if (err == SA_OK) { if ((rdr.RdrType == SAHPI_SENSOR_RDR) && (rdr.RdrTypeUnion.SensorRec.Category == SAHPI_EC_THRESHOLD) && (rdr.RdrTypeUnion.SensorRec.ThresholdDefn.IsAccessible == SAHPI_FALSE)) { foundSensor = SAHPI_TRUE; break; } entryid = nextentryid; } } while ((err == SA_OK) && (entryid != SAHPI_LAST_ENTRY)) ; if (!foundSensor) { err("Did not find desired resource for test\n"); return(SA_OK); } else { sid = rdr.RdrTypeUnion.SensorRec.Num; } /************************** * Test: Set threshold to a non-accessible sensor **************************/ expected_err = SA_ERR_HPI_INVALID_CMD; err = saHpiSensorThresholdsSet(sessionid, id, sid, &thres); checkstatus(err, expected_err, testfail); /*************************** * Cleanup after all tests ***************************/ err = tcleanup(&sessionid); return testfail; } #include openhpi-2.14.1/plugins/snmp_bc/t/tinv002.c0000644000076400007640000000540411302566764015121 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * Peter D Phan */ #include #include #include int main(int argc, char **argv) { /* ************************ * Local variables * ***********************/ int testfail = 0; SaErrorT err; SaErrorT expected_err; SaHpiRptEntryT rptentry; SaHpiResourceIdT id = 0; SaHpiSessionIdT sessionid; SaHpiIdrIdT idrId = 0; SaHpiEntryIdT areaId = 0; /* SaHpiIdrAreaTypeT areatype; */ SaHpiEntryIdT nextAreaId; SaHpiIdrAreaHeaderT header; /* ************************************* * Find a resource with inventory capability * ************************************* */ err = tsetup(&sessionid); if (err != SA_OK) { printf("Error! Can not open session for test environment\n"); printf(" File=%s, Line=%d\n", __FILE__, __LINE__); return -1; } err = tfind_resource(&sessionid, SAHPI_CAPABILITY_INVENTORY_DATA, SAHPI_FIRST_ENTRY, &rptentry, SAHPI_TRUE); if (err != SA_OK) { printf("Can not find an Inventory resource for test environment\n"); printf(" File=%s, Line=%d\n", __FILE__, __LINE__); err = tcleanup(&sessionid); return SA_OK; } id = rptentry.ResourceId; /************************** * Test: Invalid handler **************************/ expected_err = SA_ERR_HPI_INVALID_PARAMS; err = snmp_bc_get_idr_area_header(NULL , id, idrId, SAHPI_IDR_AREATYPE_UNSPECIFIED, areaId, &nextAreaId, &header); checkstatus(err, expected_err, testfail); /************************** * Test : Invalid nextAreaId pointer * expected_err = SA_ERR_HPI_INVALID_PARAMS; **************************/ err = saHpiIdrAreaHeaderGet(sessionid, id, idrId, SAHPI_IDR_AREATYPE_UNSPECIFIED, areaId, NULL, &header); checkstatus(err, expected_err, testfail); /************************** * Test : Invalid header pointer * expected_err = SA_ERR_HPI_INVALID_PARAMS; **************************/ err = saHpiIdrAreaHeaderGet(sessionid, id, idrId, SAHPI_IDR_AREATYPE_UNSPECIFIED, areaId, &nextAreaId, NULL); checkstatus(err, expected_err, testfail); /**************************&* * Cleanup after all tests ***************************/ err = tcleanup(&sessionid); return testfail; } #include openhpi-2.14.1/plugins/snmp_bc/t/tel005.c0000644000076400007640000000504311302566763014726 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * Peter D Phan */ #include #include #include int main(int argc, char **argv) { /* ************************ * Local variables * ***********************/ int testfail = 0; SaErrorT err; SaErrorT expected_err; SaHpiResourceIdT id = 0; SaHpiEventLogEntryIdT current = 0; SaHpiEventLogEntryIdT previd; SaHpiEventLogEntryIdT nextid; SaHpiEventLogEntryT entry; SaHpiRdrT rdr; SaHpiRptEntryT rptentry; struct oh_handler_state l_handle; memset(&l_handle, 0, sizeof(struct oh_handler_state)); /************************** * Test: NULL handle, rdr, rpt **************************/ expected_err = SA_ERR_HPI_INVALID_PARAMS; err = snmp_bc_get_sel_entry(NULL, id, current, &previd, &nextid, &entry, NULL, NULL); checkstatus(err, expected_err,testfail); /************************** * Test: NULL previd * expected_err = SA_ERR_HPI_INVALID_PARAMS; **************************/ err = snmp_bc_get_sel_entry(&l_handle, id, current, NULL, &nextid, &entry, NULL, NULL); checkstatus(err, expected_err, testfail); /************************** * Test: NULL nextid * expected_err = SA_ERR_HPI_INVALID_PARAMS; **************************/ err = snmp_bc_get_sel_entry(&l_handle, id, current, &previd, NULL, &entry, NULL, NULL); checkstatus(err, expected_err, testfail); /************************** * Test: NULL nextid * expected_err = SA_ERR_HPI_INVALID_PARAMS; **************************/ err = snmp_bc_get_sel_entry(&l_handle, id, current, &previd, &nextid, NULL, NULL, NULL); checkstatus(err, expected_err, testfail); /************************** * Test: NULL handle * expected_err = SA_ERR_HPI_INVALID_PARAMS; **************************/ err = snmp_bc_get_sel_entry(NULL, id, current, &previd, &nextid, &entry, &rdr, &rptentry); checkstatus(err, expected_err, testfail); return testfail; } #include openhpi-2.14.1/plugins/snmp_bc/t/tinv004.c0000644000076400007640000000667511302566764015136 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * Peter D Phan */ #include #include #include int main(int argc, char **argv) { /* ************************ * Local variables * ***********************/ int testfail = 0; SaErrorT err; SaErrorT expected_err; SaHpiRptEntryT rptentry; SaHpiRdrT rdr; SaHpiResourceIdT id = 0; SaHpiSessionIdT sessionid; SaHpiIdrIdT idrId = 0; SaHpiEntryIdT areaId = 0; SaHpiEntryIdT fieldId = 0; SaHpiEntryIdT nextfieldId; SaHpiIdrFieldT field; SaHpiEntryIdT entryid; SaHpiEntryIdT nextentryid; SaHpiBoolT foundControl; /* ************************************* * Find a resource with inventory capability * ************************************* */ err = tsetup(&sessionid); if (err != SA_OK) { printf("Error! Can not open session for test environment\n"); printf(" File=%s, Line=%d\n", __FILE__, __LINE__); return -1; } err = tfind_resource(&sessionid, SAHPI_CAPABILITY_INVENTORY_DATA, SAHPI_FIRST_ENTRY, &rptentry, SAHPI_TRUE); if (err != SA_OK) { printf("Can not find an Inventory resource for test environment\n"); printf(" File=%s, Line=%d\n", __FILE__, __LINE__); err = tcleanup(&sessionid); return SA_OK; } id = rptentry.ResourceId; /************************** * Test: find an Inventory RDR **************************/ entryid = SAHPI_FIRST_ENTRY; foundControl = SAHPI_FALSE; do { err = saHpiRdrGet(sessionid,id,entryid,&nextentryid, &rdr); if (err == SA_OK) { if (rdr.RdrType == SAHPI_INVENTORY_RDR) { foundControl = SAHPI_TRUE; break; } entryid = nextentryid; } } while ((err == SA_OK) && (entryid != SAHPI_LAST_ENTRY)) ; if (!foundControl) { err("Did not find desired resource for test\n"); return(SA_OK); } else { idrId = rdr.RdrTypeUnion.InventoryRec.IdrId; } /************************** * Test: Invalid handle **************************/ expected_err = SA_ERR_HPI_INVALID_PARAMS; err = snmp_bc_get_idr_field(NULL , id, idrId, areaId, SAHPI_IDR_FIELDTYPE_UNSPECIFIED, fieldId, &nextfieldId, &field); checkstatus(err, expected_err, testfail); /************************** * Test :Invalid NextfieldId * expected_err = SA_ERR_HPI_INVALID_PARAMS; **************************/ err = saHpiIdrFieldGet(sessionid , id, idrId, areaId, SAHPI_IDR_FIELDTYPE_UNSPECIFIED, fieldId, NULL, &field); checkstatus(err, expected_err, testfail); /************************** * Test : Invalid pointer to Field * expected_err = SA_ERR_HPI_INVALID_PARAMS; **************************/ err = saHpiIdrFieldGet(sessionid, id, idrId, areaId, SAHPI_IDR_FIELDTYPE_UNSPECIFIED, fieldId, &nextfieldId, NULL); checkstatus(err, expected_err, testfail); /**************************&* * Cleanup after all tests ***************************/ err = tcleanup(&sessionid); return testfail; } #include openhpi-2.14.1/plugins/snmp_bc/t/thotswap-simple001.c0000644000076400007640000000657611302566763017312 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004, 2006 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * Peter D Phan * Steve Sherman */ #include #include #include int main(int argc, char **argv) { int testfail = 0; SaErrorT err, expected_err; SaHpiHsIndicatorStateT hs_ind_state = 0; SaHpiHsStateT hs_state = 0; SaHpiResetActionT act = 0; SaHpiResourceIdT id = 0; SaHpiEntryIdT rptid, next_rptid; SaHpiRptEntryT rptentry; SaHpiSessionIdT sessionid; SaHpiTimeoutT timeout; /************************************************ * Find a resource with simple hotswap capability ************************************************/ err = tsetup(&sessionid); if (err != SA_OK) { printf("Error! Cannot open session\n"); printf(" File=%s, Line=%d\n", __FILE__, __LINE__); return -1; } /* Can't use tfind_resource(); Need to look for SAHPI_CAPABILITY_FRU and not SAHPI_CAPABILITY_MANAGED_HOTSWAP */ rptid = SAHPI_FIRST_ENTRY; while ((err == SA_OK) && (rptid != SAHPI_LAST_ENTRY)) { err = saHpiRptEntryGet(sessionid, rptid, &next_rptid, &rptentry); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } if ((rptentry.ResourceCapabilities & SAHPI_CAPABILITY_FRU) && !(rptentry.ResourceCapabilities & SAHPI_CAPABILITY_MANAGED_HOTSWAP)) { id = rptentry.ResourceId; break; } else { rptid = next_rptid; continue; } } if (id == 0) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Cannot find a simple hotswap resource\n"); return -1; } #if 0 printf("Found resource = %s\n", rptentry.ResourceTag.Data); #endif /*************************** * Test: Capability checking ***************************/ expected_err = SA_ERR_HPI_CAPABILITY; err = saHpiHotSwapPolicyCancel(sessionid, id); checkstatus(err, expected_err, testfail); err = saHpiResourceActiveSet(sessionid, id); checkstatus(err, expected_err, testfail); err = saHpiResourceInactiveSet(sessionid, id); checkstatus(err, expected_err, testfail); err = saHpiAutoExtractTimeoutGet(sessionid, id, &timeout); checkstatus(err, expected_err, testfail); timeout = SAHPI_TIMEOUT_IMMEDIATE; err = saHpiAutoExtractTimeoutSet(sessionid, id, timeout); checkstatus(err, expected_err, testfail); err = saHpiHotSwapStateGet(sessionid, id, &hs_state); checkstatus(err, expected_err, testfail); err = saHpiHotSwapActionRequest(sessionid, id, act); checkstatus(err, expected_err, testfail); err = saHpiHotSwapIndicatorStateGet(sessionid, id, &hs_ind_state); checkstatus(err, expected_err, testfail); err = saHpiHotSwapIndicatorStateSet(sessionid, id, hs_ind_state); checkstatus(err, expected_err, testfail); /************************* * Cleanup after all tests *************************/ err = tcleanup(&sessionid); return testfail; } #include openhpi-2.14.1/plugins/snmp_bc/t/tsetup.c0000644000076400007640000001502511302566764015243 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004, 2006 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * Peter D Phan */ #include #include #include SaErrorT tsetup (SaHpiSessionIdT *sessionid_ptr) { SaErrorT err; /******************************** * Hook in simulation environment ********************************/ err = saHpiSessionOpen(SAHPI_UNSPECIFIED_DOMAIN_ID, sessionid_ptr, NULL); if (err != SA_OK) { printf("Error! Cannot open session.\n"); printf(" File=%s, Line=%d\n", __FILE__, __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); } if (!err) err = saHpiDiscover(*sessionid_ptr); if (err != SA_OK) { printf("Error! Cannot discover resources.\n"); printf(" File=%s, Line=%d\n", __FILE__, __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); err = saHpiSessionClose(*sessionid_ptr); } return err; } SaErrorT tfind_resource(SaHpiSessionIdT *sessionid_ptr, SaHpiCapabilitiesT search_rdr_type, SaHpiEntryIdT i_rptentryid, SaHpiRptEntryT *rptentry, SaHpiBoolT samecap) { SaErrorT rvRptGet; SaHpiRptEntryT l_rptentry; SaHpiEntryIdT rptentryid; SaHpiEntryIdT nextrptentryid; SaHpiCapabilitiesT cap_mask; if (!sessionid_ptr) { printf("Error! Invalid test setup.\n"); printf(" File=%s, Line=%d\n", __FILE__, __LINE__); return(SA_ERR_HPI_INVALID_PARAMS); } cap_mask = (SAHPI_CAPABILITY_RESOURCE | SAHPI_CAPABILITY_AGGREGATE_STATUS | SAHPI_CAPABILITY_CONFIGURATION | SAHPI_CAPABILITY_MANAGED_HOTSWAP | SAHPI_CAPABILITY_WATCHDOG | SAHPI_CAPABILITY_CONTROL | SAHPI_CAPABILITY_FRU | SAHPI_CAPABILITY_ANNUNCIATOR | SAHPI_CAPABILITY_POWER | SAHPI_CAPABILITY_RESET | SAHPI_CAPABILITY_INVENTORY_DATA | SAHPI_CAPABILITY_EVENT_LOG | SAHPI_CAPABILITY_RDR | SAHPI_CAPABILITY_SENSOR); if ((search_rdr_type & cap_mask) == 0) { printf("Error! Invalid resource type.\n"); printf(" File=%s, Line=%d\n", __FILE__, __LINE__); return(SA_ERR_HPI_INVALID_PARAMS); } /*************** * Find resource ***************/ rptentryid = SAHPI_FIRST_ENTRY; do { rvRptGet = saHpiRptEntryGet(*sessionid_ptr, rptentryid, &nextrptentryid, &l_rptentry); if (rvRptGet != SA_OK) { printf("Cannot get resource; Error=%s\n", oh_lookup_error(rvRptGet)); } else { if (l_rptentry.ResourceFailed == SAHPI_FALSE) { if (samecap) { if ((l_rptentry.ResourceCapabilities & search_rdr_type)) { memcpy(rptentry,&l_rptentry, sizeof(SaHpiRptEntryT)); break; } } else { if (!(l_rptentry.ResourceCapabilities & search_rdr_type)) { memcpy(rptentry,&l_rptentry, sizeof(SaHpiRptEntryT)); break; } } } else { printf("Resource %s is marked failed.\n", l_rptentry.ResourceTag.Data); } } rptentryid = nextrptentryid; } while ((rvRptGet == SA_OK) && (rptentryid != SAHPI_LAST_ENTRY)); if (rptentryid != SAHPI_LAST_ENTRY) return(SA_OK); return(SA_ERR_HPI_NOT_PRESENT); } SaErrorT tfind_resource_by_ep(SaHpiSessionIdT *sessionid_ptr, SaHpiEntityPathT *ep, SaHpiEntryIdT i_rptentryid, SaHpiRptEntryT *rptentry) { SaErrorT err; SaHpiRptEntryT l_rptentry; SaHpiEntryIdT rptentryid; SaHpiEntryIdT nextrptentryid; if (!sessionid_ptr || !ep || !rptentry) { printf("Error! Invalid test setup.\n"); printf(" File=%s, Line=%d\n", __FILE__, __LINE__); return(SA_ERR_HPI_INVALID_PARAMS); } /*************** * Find resource ***************/ rptentryid = SAHPI_FIRST_ENTRY; do { err = saHpiRptEntryGet(*sessionid_ptr, rptentryid, &nextrptentryid, &l_rptentry); if (err) { printf("Cannot get Resource; Error=%s\n", oh_lookup_error(err)); } else { if (l_rptentry.ResourceFailed == SAHPI_FALSE) { if (oh_cmp_ep(ep, &(l_rptentry.ResourceEntity))) { memcpy(rptentry, &l_rptentry, sizeof(SaHpiRptEntryT)); break; } } else { printf("Resource %s is marked failed.\n", l_rptentry.ResourceTag.Data); } } rptentryid = nextrptentryid; } while ((err == SA_OK) && (rptentryid != SAHPI_LAST_ENTRY)); if (rptentryid != SAHPI_LAST_ENTRY) return(SA_OK); return(SA_ERR_HPI_NOT_PRESENT); } SaErrorT tfind_rdr_by_name(SaHpiSessionIdT *sessionid_ptr, SaHpiResourceIdT rid, char *rdr_name, SaHpiRdrT *rdr) { SaErrorT err; SaHpiEntryIdT entryid, nextentryid; SaHpiRdrT working_rdr; if (!sessionid_ptr || !rdr_name || !rdr) { printf("Error! Invalid test setup.\n"); printf(" File=%s, Line=%d\n", __FILE__, __LINE__); return(SA_ERR_HPI_INVALID_PARAMS); } /********** * Find RDR **********/ entryid = SAHPI_FIRST_ENTRY; do { err = saHpiRdrGet(*sessionid_ptr, rid, entryid, &nextentryid, &working_rdr); if (err) { printf("Cannot get RDR; Error=%s\n", oh_lookup_error(err)); } else { if (strncmp((char *)working_rdr.IdString.Data, rdr_name, SAHPI_MAX_TEXT_BUFFER_LENGTH) == 0) { memcpy(rdr, &working_rdr, sizeof(SaHpiRdrT)); break; } entryid = nextentryid; } } while ((err == SA_OK) && (entryid != SAHPI_LAST_ENTRY)); if (entryid != SAHPI_LAST_ENTRY) return(SA_OK); return(SA_ERR_HPI_NOT_PRESENT); } SaErrorT tcleanup(SaHpiSessionIdT *sessionid_ptr) { SaErrorT err = SA_OK; /*************************** * Close session, free memory ***************************/ err = saHpiSessionClose(*sessionid_ptr); return(err); } openhpi-2.14.1/plugins/snmp_bc/t/tcontrol_parms.c0000644000076400007640000000630611302566763016766 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004, 2005, 2006 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * Peter D Phan */ #include #include int main(int argc, char **argv) { /* ************************ * Local variables * ***********************/ int testfail = 0; SaHpiResourceIdT id; SaHpiParmActionT act; SaErrorT err; SaErrorT expected_err; SaHpiSessionIdT sessionid; struct oh_handler_state *handle; // SaHpiDomainIdT did; struct oh_handler *h = NULL; struct oh_domain *d = NULL; unsigned int *hid = NULL; // /* ************************ * Find a resource with Control type rdr * ***********************/ SaHpiRptEntryT rptentry; err = tsetup(&sessionid); if (err != SA_OK) { printf("Error! Can not setup session for test environment.\n"); printf(" File=%s, Line=%d\n", __FILE__, __LINE__); return -1; } err = tfind_resource(&sessionid, SAHPI_CAPABILITY_CONTROL, SAHPI_FIRST_ENTRY, &rptentry, SAHPI_TRUE); if (err != SA_OK) { printf("Error! Can not find resource for test environment.\n"); printf(" File=%s, Line=%d\n", __FILE__, __LINE__); err = tcleanup(&sessionid); return -1; } id = rptentry.ResourceId; act = SAHPI_RESTORE_PARM; // ----------- did = oh_get_session_domain(sessionid); d = oh_get_domain(did); hid = oh_get_resource_data(&(d->rpt), id); h = oh_get_handler(*hid); // ---------- // memset(&handle, 0, sizeof(struct oh_handler_state)); /************************** * Test 1: Invalid Control Action **************************/ expected_err = SA_ERR_HPI_INVALID_PARAMS; act = 0xFF; err = snmp_bc_control_parm(h->hnd, id, act); checkstatus(err, expected_err, testfail); /************************** * Test 2: Invalid ResourceId **************************/ act = SAHPI_DEFAULT_PARM; expected_err = SA_ERR_HPI_INVALID_RESOURCE; err = snmp_bc_control_parm(h->hnd, 5000, act); checkstatus(err, expected_err, testfail); /************************** * Test 3: Resource configuration saving not supported *************************/ handle = (struct oh_handler_state *) h->hnd; rptentry.ResourceCapabilities |= SAHPI_CAPABILITY_CONFIGURATION; oh_add_resource(handle->rptcache, &rptentry, NULL, 0); expected_err = SA_ERR_HPI_INTERNAL_ERROR; err = snmp_bc_control_parm(h->hnd, id, act); checkstatus(err, expected_err, testfail); /************************** * Test 4: Normal Path **************************/ expected_err = SA_ERR_HPI_CAPABILITY; err = saHpiParmControl(sessionid, id, act); checkstatus(err, expected_err, testfail); /*************************** * Cleanup after all tests ***************************/ err = tcleanup(&sessionid); return testfail; } #include openhpi-2.14.1/plugins/snmp_bc/t/tsensorget036.c0000644000076400007640000000532411302566764016346 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * Peter D Phan */ #include #include #include int main(int argc, char **argv) { /* ************************ * Local variables * ***********************/ int testfail = 0; SaErrorT err; SaErrorT expected_err; SaHpiRptEntryT rptentry; SaHpiResourceIdT id; SaHpiSessionIdT sessionid; SaHpiSensorNumT sid = 0; SaHpiEventStateT assertMask; SaHpiEventStateT deassertMask; /* ************************************* * Find a resource with Sensor type rdr * ************************************* */ err = tsetup(&sessionid); if (err != SA_OK) { printf("Error! Can not open session for test environment\n"); printf(" File=%s, Line=%d\n", __FILE__, __LINE__); return -1; } err = tfind_resource(&sessionid,SAHPI_CAPABILITY_SENSOR,SAHPI_FIRST_ENTRY, &rptentry, SAHPI_TRUE); if (err != SA_OK) { printf("Error! Can not find resources for test environment\n"); printf(" File=%s, Line=%d\n", __FILE__, __LINE__); err = tcleanup(&sessionid); return SA_OK; } id = rptentry.ResourceId; /************************** * Test: Invalid assert and deassert masks **************************/ expected_err = SA_ERR_HPI_NOT_PRESENT; err = saHpiSensorEventMasksGet(sessionid, id, sid, NULL, NULL); checkstatus(err, expected_err, testfail); /************************** * Test:Invalid deassert mask * expected_err = SA_ERR_HPI_INVALID_PARAMS; **************************/ err = saHpiSensorEventMasksGet(sessionid, id, sid, &assertMask, NULL); checkstatus(err, expected_err, testfail); /************************** * Test Invalid assert mask * expected_err = SA_ERR_HPI_INVALID_PARAMS; **************************/ err = saHpiSensorEventMasksGet(sessionid, id, sid, NULL, &deassertMask); checkstatus(err, expected_err, testfail); /************************** * Test Invalid resource Id **************************/ expected_err = SA_ERR_HPI_INVALID_RESOURCE; err = saHpiSensorEventMasksGet(sessionid, 5000, sid, &assertMask, &deassertMask); checkstatus(err, expected_err, testfail); /*************************** * Cleanup after all tests ***************************/ err = tcleanup(&sessionid); return testfail; } #include openhpi-2.14.1/plugins/snmp_bc/t/tsensorset013.c0000644000076400007640000000562711302566764016363 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * Peter D Phan */ #include #include #include int main(int argc, char **argv) { /* ************************ * Local variables * ***********************/ int testfail = 0; SaErrorT err; SaErrorT expected_err; SaHpiRptEntryT rptentry; SaHpiRdrT rdr; SaHpiResourceIdT id; SaHpiSessionIdT sessionid; SaHpiEntryIdT entryid; SaHpiEntryIdT nextentryid; SaHpiBoolT foundSensor; SaHpiSensorNumT sid = 0; SaHpiSensorEventMaskActionT act = SAHPI_SENS_ADD_EVENTS_TO_MASKS; SaHpiEventStateT assertMask = SAHPI_ES_UPPER_MINOR; SaHpiEventStateT deassertMask = SAHPI_ES_UPPER_CRIT; /* ************************************* * Find a resource with Sensor type rdr * ************************************* */ err = tsetup(&sessionid); if (err != SA_OK) { printf("Error! Can not open session for test environment\n"); printf(" File=%s, Line=%d\n", __FILE__, __LINE__); return -1; } err = tfind_resource(&sessionid,SAHPI_CAPABILITY_SENSOR,SAHPI_FIRST_ENTRY, &rptentry, SAHPI_TRUE); if (err != SA_OK) { printf("Error! Can not find resources for test environment\n"); printf(" File=%s, Line=%d\n", __FILE__, __LINE__); err = tcleanup(&sessionid); return SA_OK; } id = rptentry.ResourceId; /************************** * Test: find a sensor with desired property **************************/ entryid = SAHPI_FIRST_ENTRY; foundSensor = SAHPI_FALSE; do { err = saHpiRdrGet(sessionid,id,entryid,&nextentryid, &rdr); if (err == SA_OK) { if ((rdr.RdrType == SAHPI_SENSOR_RDR) && (rdr.RdrTypeUnion.SensorRec.EventCtrl == SAHPI_SEC_PER_EVENT)) { foundSensor = SAHPI_TRUE; break; } entryid = nextentryid; } } while ((err == SA_OK) && (entryid != SAHPI_LAST_ENTRY)) ; if (!foundSensor) { err("Did not find desired resource for test\n"); return(SA_OK); } else { sid = rdr.RdrTypeUnion.SensorRec.Num; } /************************** * Test: Request with invlaid data **************************/ assertMask = ~(rdr.RdrTypeUnion.SensorRec.Events); expected_err = SA_ERR_HPI_INVALID_DATA; err = saHpiSensorEventMasksSet(sessionid, id, sid, act, assertMask, deassertMask); checkstatus(err, expected_err, testfail); /*************************** * Cleanup after all tests ***************************/ err = tcleanup(&sessionid); return testfail; } #include openhpi-2.14.1/plugins/snmp_bc/t/tsensorset011.c0000644000076400007640000000555011302566764016354 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * Peter D Phan */ #include #include #include int main(int argc, char **argv) { /* ************************ * Local variables * ***********************/ int testfail = 0; SaErrorT err; SaErrorT expected_err; SaHpiRptEntryT rptentry; SaHpiRdrT rdr; SaHpiResourceIdT id; SaHpiSessionIdT sessionid; SaHpiEntryIdT entryid; SaHpiEntryIdT nextentryid; SaHpiBoolT foundSensor; SaHpiSensorNumT sid = 0; SaHpiSensorEventMaskActionT act = SAHPI_SENS_ADD_EVENTS_TO_MASKS; SaHpiEventStateT assertMask = SAHPI_ES_UPPER_MINOR; SaHpiEventStateT deassertMask = SAHPI_ES_UPPER_CRIT; /* ************************************* * Find a resource with Sensor type rdr * ************************************* */ err = tsetup(&sessionid); if (err != SA_OK) { printf("Error! Can not open session for test environment\n"); printf(" File=%s, Line=%d\n", __FILE__, __LINE__); return -1; } err = tfind_resource(&sessionid,SAHPI_CAPABILITY_SENSOR,SAHPI_FIRST_ENTRY, &rptentry, SAHPI_TRUE); if (err != SA_OK) { printf("Error! Can not find resources for test environment\n"); printf(" File=%s, Line=%d\n", __FILE__, __LINE__); err = tcleanup(&sessionid); return SA_OK; } id = rptentry.ResourceId; /************************** * Test: find a sensor with desired property **************************/ entryid = SAHPI_FIRST_ENTRY; foundSensor = SAHPI_FALSE; do { err = saHpiRdrGet(sessionid,id,entryid,&nextentryid, &rdr); if (err == SA_OK) { if ((rdr.RdrType == SAHPI_SENSOR_RDR) && (rdr.RdrTypeUnion.SensorRec.EventCtrl != SAHPI_SEC_PER_EVENT)) { foundSensor = SAHPI_TRUE; break; } entryid = nextentryid; } } while ((err == SA_OK) && (entryid != SAHPI_LAST_ENTRY)) ; if (!foundSensor) { err("Did not find desired resource for test\n"); return(SA_OK); } else { sid = rdr.RdrTypeUnion.SensorRec.Num; } /************************** * Test: Sensor with !SAHPI_SEC_PER_EVENT **************************/ expected_err = SA_ERR_HPI_READ_ONLY; err = saHpiSensorEventMasksSet(sessionid, id, sid, act, assertMask, deassertMask); checkstatus(err, expected_err, testfail); /*************************** * Cleanup after all tests ***************************/ err = tcleanup(&sessionid); return testfail; } #include openhpi-2.14.1/plugins/snmp_bc/t/tsensorset009.c0000644000076400007640000000517611302566763016366 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * Peter D Phan */ #include #include #include int main(int argc, char **argv) { /* ************************ * Local variables * ***********************/ int testfail = 0; SaErrorT err; SaErrorT expected_err; SaHpiRptEntryT rptentry; SaHpiResourceIdT id = 0; SaHpiSessionIdT sessionid; SaHpiSensorNumT sid = 0; SaHpiEventStateT assertMask = SAHPI_ES_LOWER_MINOR; SaHpiEventStateT deassertMask = SAHPI_ES_LOWER_CRIT; SaHpiSensorEventMaskActionT act = SAHPI_SENS_ADD_EVENTS_TO_MASKS; /* ************************************* * Find a resource with Sensor type rdr * ************************************* */ err = tsetup(&sessionid); if (err != SA_OK) { printf("Error! Can not open session for test environment\n"); printf(" File=%s, Line=%d\n", __FILE__, __LINE__); return -1; } err = tfind_resource(&sessionid,SAHPI_CAPABILITY_SENSOR,SAHPI_FIRST_ENTRY, &rptentry, SAHPI_TRUE); if (err != SA_OK) { printf("Error! Can not find resources for test environment\n"); printf(" File=%s, Line=%d\n", __FILE__, __LINE__); err = tcleanup(&sessionid); return SA_OK; } id = rptentry.ResourceId; /************************** * Test: Invalid handler **************************/ expected_err = SA_ERR_HPI_INVALID_PARAMS; err = snmp_bc_set_sensor_event_masks(NULL, id, sid, act, assertMask, deassertMask); checkstatus(err, expected_err, testfail); /************************** * Test: Invalid resource id **************************/ expected_err = SA_ERR_HPI_INVALID_RESOURCE; err = saHpiSensorEventMasksSet(sessionid, 5000, sid, act, assertMask, deassertMask); checkstatus(err, expected_err, testfail); /************************** * Test: Invalid Sensor Id **************************/ expected_err = SA_ERR_HPI_NOT_PRESENT; err = saHpiSensorEventMasksSet(sessionid, id, 5000, act, assertMask, deassertMask); checkstatus(err, expected_err, testfail); /*************************** * Cleanup after all tests ***************************/ err = tcleanup(&sessionid); return testfail; } #include openhpi-2.14.1/plugins/snmp_bc/t/tsensorset023.c0000644000076400007640000000537211302566764016361 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * Peter D Phan */ #include #include #include int main(int argc, char **argv) { /* ************************ * Local variables * ***********************/ int testfail = 0; SaErrorT err; SaErrorT expected_err; SaHpiResourceIdT id = 0; SaHpiSessionIdT sessionid; SaHpiRptEntryT rptentry; SaHpiRdrT rdr; SaHpiSensorNumT sid = 0; SaHpiSensorThresholdsT thres; SaHpiEntryIdT entryid; SaHpiEntryIdT nextentryid; SaHpiBoolT foundSensor; /* ************************************* * Find a resource with Sensor type rdr * ************************************* */ err = tsetup(&sessionid); if (err != SA_OK) { printf("Error! Can not open session for test environment\n"); printf(" File=%s, Line=%d\n", __FILE__, __LINE__); return -1; } err = tfind_resource(&sessionid,SAHPI_CAPABILITY_SENSOR,SAHPI_FIRST_ENTRY, &rptentry, SAHPI_TRUE); if (err != SA_OK) { printf("Error! Can not find resources for test environment\n"); printf(" File=%s, Line=%d\n", __FILE__, __LINE__); err = tcleanup(&sessionid); return SA_OK; } id = rptentry.ResourceId; /************************** * Test: find a sensor with desired property **************************/ entryid = SAHPI_FIRST_ENTRY; foundSensor = SAHPI_FALSE; do { err = saHpiRdrGet(sessionid,id,entryid,&nextentryid, &rdr); if (err == SA_OK) { if ((rdr.RdrType == SAHPI_SENSOR_RDR) && (rdr.RdrTypeUnion.SensorRec.Category == SAHPI_EC_THRESHOLD) && (rdr.RdrTypeUnion.SensorRec.ThresholdDefn.WriteThold == 0)) { foundSensor = SAHPI_TRUE; break; } entryid = nextentryid; } } while ((err == SA_OK) && (entryid != SAHPI_LAST_ENTRY)) ; if (!foundSensor) { err("Did not find desired resource for test\n"); return(SA_OK); } else { sid = rdr.RdrTypeUnion.SensorRec.Num; } /************************** * Test: setting to a non-writeable sensor **************************/ expected_err = SA_ERR_HPI_INVALID_CMD; err = saHpiSensorThresholdsSet(sessionid, id, sid, &thres); checkstatus(err, expected_err, testfail); /*************************** * Cleanup after all tests ***************************/ err = tcleanup(&sessionid); return testfail; } #include openhpi-2.14.1/plugins/snmp_bc/t/sim_init.c0000644000076400007640000000763211302566763015536 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * Steve Sherman */ #include #include #include #include #include #include #include GHashTable * sim_hash; static void free_hash_data(gpointer key, gpointer value, gpointer user_data); SaHpiBoolT is_simulator(void) { return(SAHPI_TRUE); } SaErrorT sim_banner(struct snmp_bc_hnd *custom_handle) { printf("************************************\n"); printf("************ Simulator *************\n"); if (custom_handle->platform == SNMP_BC_PLATFORM_BC) { printf("****** BladeCenter Integrated ******\n"); } if (custom_handle->platform == SNMP_BC_PLATFORM_BCT) { printf("********** BladeCenter T ***********\n"); } if (custom_handle->platform == SNMP_BC_PLATFORM_BCH) { printf("********** BladeCenter H ***********\n"); } if (custom_handle->platform == SNMP_BC_PLATFORM_BCHT) { printf("********** BladeCenter HT ***********\n"); } if (custom_handle->platform == SNMP_BC_PLATFORM_RSA) { printf("*************** RSA ****************\n"); } printf("************************************\n"); return(SA_OK); } SaErrorT sim_init() { /* ------------------------------------------------ */ /* snmpwalk-based simulator uses */ /* sim_file() and file sim_test_file */ /* sim_test_file is the output of snmpwalk command */ /* snmpwalk $host -On .1 (option -On is important) */ /* ------------------------------------------------ */ sim_file(); /* ------------------------------------------------ */ /* Old snmp_bc simulator uses */ /* followed code and file sim_resources.c */ /* If old method is desired, */ /* 1) comment out sim_file() above */ /* 2) remove #if 0/#endif below */ /* ------------------------------------------------ */ #if 0 int i; sim_hash = g_hash_table_new(g_str_hash, g_str_equal); if (sim_hash == NULL) { err("Cannot allocate simulation hash table"); return(SA_ERR_HPI_INTERNAL_ERROR); } for (i=0; sim_resource_array[i].oid != NULL; i++) { char *key; char *key_exists; SnmpMibInfoT *mibinfo; key = g_strdup(sim_resource_array[i].oid); if (!key) { err("Cannot allocate memory for key for oid=%s", sim_resource_array[i].oid); sim_close(); return(SA_ERR_HPI_INTERNAL_ERROR); } mibinfo = g_malloc0(sizeof(SnmpMibInfoT)); if (!mibinfo) { err("Cannot allocate memory for hash value for oid=%s", sim_resource_array[i].oid); sim_close(); return(SA_ERR_HPI_INTERNAL_ERROR); } key_exists = g_hash_table_lookup(sim_hash, key); if (!key_exists) { mibinfo->type = sim_resource_array[i].mib.type; switch (mibinfo->type) { case ASN_INTEGER: mibinfo->value.integer = sim_resource_array[i].mib.value.integer; break; case ASN_OCTET_STR: strcpy(mibinfo->value.string, sim_resource_array[i].mib.value.string); break; default: err("Unknown SNMP type=%d for oid=%s", mibinfo->type, key); return(SA_ERR_HPI_INTERNAL_ERROR); } g_hash_table_insert(sim_hash, key, mibinfo); } else { err("Oid %s is defined twice", sim_resource_array[i].oid); } } #endif return(SA_OK); } SaErrorT sim_close() { g_hash_table_foreach(sim_hash, free_hash_data, NULL); g_hash_table_destroy(sim_hash); return(SA_OK); } static void free_hash_data(gpointer key, gpointer value, gpointer user_data) { g_free(key); g_free(value); } openhpi-2.14.1/plugins/snmp_bc/t/tcontrolfailover.c0000644000076400007640000000737611302566764017325 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2006 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * Steve Sherman */ #include #include #include int main(int argc, char **argv) { int testfail = 0; gchar *rdr_name; SaErrorT err, expected_err; SaHpiCtrlModeT mode; SaHpiCtrlStateT state; SaHpiEntityPathT ep, vmm_ep; SaHpiRdrT rdr; SaHpiRptEntryT rpt; SaHpiSessionIdT sessionid; vmm_ep.Entry[0].EntityType = SAHPI_ENT_SYS_MGMNT_MODULE; vmm_ep.Entry[0].EntityLocation = 0; vmm_ep.Entry[1].EntityType = SAHPI_ENT_SYSTEM_CHASSIS; vmm_ep.Entry[1].EntityLocation = 1; vmm_ep.Entry[2].EntityType = SAHPI_ENT_ROOT; vmm_ep.Entry[2].EntityLocation = 0; rdr_name = "MM Failover Control"; /*********************** * Find the VMM resource ***********************/ err = tsetup(&sessionid); if (err) { printf("Error! Cannot open session for test environment\n"); printf(" File=%s, Line=%d\n", __FILE__, __LINE__); return -1; } oh_init_ep(&ep); oh_concat_ep(&ep, &vmm_ep); err = tfind_resource_by_ep(&sessionid, &ep, SAHPI_FIRST_ENTRY, &rpt); if (err) { printf("Cannot find resource for test environment\n"); printf(" File=%s, Line=%d\n", __FILE__, __LINE__); err = tcleanup(&sessionid); return -1; } /************************** * Find MM Failover control **************************/ err = tfind_rdr_by_name(&sessionid, rpt.ResourceId, rdr_name, &rdr); if (err) { printf("Cannot find resource for test environment\n"); printf(" File=%s, Line=%d\n", __FILE__, __LINE__); err = tcleanup(&sessionid); return -1; } /*************************** * Test: Write Invalid State ***************************/ expected_err = SA_ERR_HPI_INVALID_REQUEST; state.Type = SAHPI_CTRL_TYPE_DIGITAL; state.StateUnion.Digital = SAHPI_CTRL_STATE_OFF; err = saHpiControlSet(sessionid, rpt.ResourceId, rdr.RdrTypeUnion.CtrlRec.Num, SAHPI_CTRL_MODE_MANUAL, &state); checkstatus(err, expected_err, testfail); /************************** * Test: Write Invalid Mode **************************/ expected_err = SA_ERR_HPI_READ_ONLY; state.Type = SAHPI_CTRL_TYPE_DIGITAL; state.StateUnion.Digital = SAHPI_CTRL_STATE_PULSE_ON; err = saHpiControlSet(sessionid, rpt.ResourceId, rdr.RdrTypeUnion.CtrlRec.Num, SAHPI_CTRL_MODE_AUTO, &state); checkstatus(err, expected_err, testfail); /*************************** * Test: Write Valid State ***************************/ expected_err = SA_OK; state.Type = SAHPI_CTRL_TYPE_DIGITAL; state.StateUnion.Digital = SAHPI_CTRL_STATE_PULSE_ON; err = saHpiControlSet(sessionid, rpt.ResourceId, rdr.RdrTypeUnion.CtrlRec.Num, SAHPI_CTRL_MODE_MANUAL, &state); checkstatus(err, expected_err, testfail); /*********************** * Test: Read State/Mode ***********************/ err = saHpiControlGet(sessionid, rpt.ResourceId, rdr.RdrTypeUnion.CtrlRec.Num, &mode, &state); if (mode != SAHPI_CTRL_MODE_MANUAL || state.StateUnion.Digital != SAHPI_CTRL_STATE_OFF) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf("State=%s; Mode=%s\n", oh_lookup_ctrlmode(mode), oh_lookup_ctrlstatedigital(state.StateUnion.Digital)); return -1; } /*************************** * Cleanup after all tests ***************************/ err = tcleanup(&sessionid); return testfail; } #include openhpi-2.14.1/plugins/snmp_bc/t/tsptime002.c0000644000076400007640000000251511302566764015626 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * Peter D Phan */ #include #include #include int main(int argc, char **argv) { /* ************************ * Local variables * ***********************/ int testfail = 0; SaErrorT err; SaErrorT expected_err; struct tm time; struct snmp_bc_hnd custom_handle; memset(&time, 0, sizeof(struct tm)); /************************** * Test : Invalid handle **************************/ expected_err = SA_ERR_HPI_INVALID_PARAMS; err = snmp_bc_set_sp_time(NULL, &time); checkstatus(err, expected_err, testfail); /************************** * Test : Invalid pointer to struct **************************/ expected_err = SA_ERR_HPI_INVALID_PARAMS; err = snmp_bc_set_sp_time(&custom_handle, NULL); checkstatus(err, expected_err, testfail); return testfail; } #include openhpi-2.14.1/plugins/snmp_bc/t/tsensorset005.c0000644000076400007640000000464111302566763016356 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * Peter D Phan */ #include #include #include int main(int argc, char **argv) { /* ************************ * Local variables * ***********************/ int testfail = 0; SaErrorT err; SaErrorT expected_err; SaHpiRptEntryT rptentry; SaHpiSessionIdT sessionid; SaHpiResourceIdT id = 0; SaHpiSensorNumT sid = 0; SaHpiBoolT enable = SAHPI_FALSE; /* ************************************* * Find a resource with Sensor type rdr * ************************************* */ err = tsetup(&sessionid); if (err != SA_OK) { printf("Error! Can not open session for test environment\n"); printf(" File=%s, Line=%d\n", __FILE__, __LINE__); return -1; } err = tfind_resource(&sessionid,SAHPI_CAPABILITY_SENSOR,SAHPI_FIRST_ENTRY, &rptentry, SAHPI_TRUE); if (err != SA_OK) { printf("Error! Can not find resources for test environment\n"); printf(" File=%s, Line=%d\n", __FILE__, __LINE__); err = tcleanup(&sessionid); return SA_OK; } id = rptentry.ResourceId; /************************** * TestInvalid handler **************************/ expected_err = SA_ERR_HPI_INVALID_PARAMS; err = snmp_bc_set_sensor_event_enable(NULL, id, sid, enable); checkstatus(err, expected_err, testfail); /************************** * Test Invalid resource id **************************/ expected_err = SA_ERR_HPI_INVALID_RESOURCE; err = saHpiSensorEventEnableSet(sessionid, 5000, sid, enable); checkstatus(err, expected_err, testfail); /************************** * Test Invalid sensor id **************************/ expected_err = SA_ERR_HPI_NOT_PRESENT; err = saHpiSensorEventEnableSet(sessionid, id, 5000, enable); checkstatus(err, expected_err, testfail); /*************************** * Cleanup after all tests ***************************/ err = tcleanup(&sessionid); return testfail; } #include openhpi-2.14.1/plugins/snmp_bc/t/tsensorset006.c0000644000076400007640000000526611302566764016364 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * Peter D Phan */ #include #include #include int main(int argc, char **argv) { /* ************************ * Local variables * ***********************/ int testfail = 0; SaErrorT err; SaErrorT expected_err; SaHpiRptEntryT rptentry; SaHpiRdrT rdr; SaHpiResourceIdT id; SaHpiSessionIdT sessionid; SaHpiEntryIdT entryid; SaHpiEntryIdT nextentryid; SaHpiBoolT foundSensor; SaHpiSensorNumT sid = 0; SaHpiBoolT enable = SAHPI_FALSE; /* ************************************* * Find a resource with Sensor type rdr * ************************************* */ err = tsetup(&sessionid); if (err != SA_OK) { printf("Error! Can not open session for test environment\n"); printf(" File=%s, Line=%d\n", __FILE__, __LINE__); return -1; } err = tfind_resource(&sessionid,SAHPI_CAPABILITY_SENSOR,SAHPI_FIRST_ENTRY, &rptentry, SAHPI_TRUE); if (err != SA_OK) { printf("Error! Can not find resources for test environment\n"); printf(" File=%s, Line=%d\n", __FILE__, __LINE__); err = tcleanup(&sessionid); return SA_OK; } id = rptentry.ResourceId; /************************** * Test: find a sensor with desired property **************************/ entryid = SAHPI_FIRST_ENTRY; foundSensor = SAHPI_FALSE; do { err = saHpiRdrGet(sessionid,id,entryid,&nextentryid, &rdr); if (err == SA_OK) { if ((rdr.RdrType == SAHPI_SENSOR_RDR) && (rdr.RdrTypeUnion.SensorRec.DataFormat.IsSupported == SAHPI_FALSE)) { foundSensor = SAHPI_TRUE; break; } entryid = nextentryid; } } while ((err == SA_OK) && (entryid != SAHPI_LAST_ENTRY)) ; if (!foundSensor) { err("Did not find desired resource for test\n"); return(SA_OK); } else { sid = rdr.RdrTypeUnion.SensorRec.Num; } /************************** * Test: enable event for nonsupported capability **************************/ expected_err = SA_ERR_HPI_READ_ONLY; err = saHpiSensorEventEnableSet(sessionid, id, sid, enable); checkstatus(err, expected_err, testfail); /*************************** * Cleanup after all tests ***************************/ err = tcleanup(&sessionid); return testfail; } #include openhpi-2.14.1/plugins/snmp_bc/t/tevent.c0000644000076400007640000016524211302566763015232 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004, 2006 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * Steve Sherman */ /************************************************************************ * Notes: * * All these test cases depend on values defined in errlog2event_hash and * sensor and resource definitions in snmp_bc_resources.c. These are real * hardware events and sensors, which hopefully won't change much. ************************************************************************/ #include #include #include #include #include #include #define SNMP_BC_ERROR_LOG_MSG_OID ".1.3.6.1.4.1.2.3.51.2.3.4.2.1.2.1" #define SNMP_BC_ERROR_LOG_MSG_OID_RSA ".1.3.6.1.4.1.2.3.51.1.3.4.2.1.2.1" #define SNMP_BC_MM_VOLT_3_3_OID ".1.3.6.1.4.1.2.3.51.2.2.2.1.2.0" #define SNMP_BC_CHASSIS_TEMP_OID ".1.3.6.1.4.1.2.3.51.2.2.1.5.1.0" int main(int argc, char **argv) { SaErrorT err; SaHpiRdrT rdr; SaHpiEntryIdT rptid, next_rptid; SaHpiRptEntryT rpt; SaHpiResourceIdT rid_eventlog=0; SaHpiEventLogEntryT logentry; SaHpiEventLogEntryIdT prev_logid, next_logid; SaHpiSessionIdT sessionid; char *hash_key, *logstr; SnmpMibInfoT *hash_value; SnmpMibInfoT *hash_set_value; SnmpMibInfoT * hash_data; err = saHpiSessionOpen(SAHPI_UNSPECIFIED_DOMAIN_ID, &sessionid, NULL); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } err = saHpiDiscover(sessionid); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } /* Find first Event Log capable resource - assume its MM */ rptid = SAHPI_FIRST_ENTRY; while ((err == SA_OK) && (rptid != SAHPI_LAST_ENTRY)) { err = saHpiRptEntryGet(sessionid, rptid, &next_rptid, &rpt); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } if ((rpt.ResourceCapabilities & SAHPI_CAPABILITY_EVENT_LOG)) { rid_eventlog = rpt.ResourceId; break; } else { rptid = next_rptid; continue; } } if (rid_eventlog == 0) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Cannot find Chassis RID\n"); return -1; } /* Determine platform */ hash_data = (SnmpMibInfoT *)g_hash_table_lookup(sim_hash, SNMP_BC_PLATFORM_OID_RSA); if ((hash_data != NULL) && (hash_data->value.integer == 255)) { printf("Executing RSA event tests\n"); goto RSA_TESTS; } else { printf("Executing BladeCenter event tests\n"); } /* If test OID not already in sim hash table; create it */ if (!g_hash_table_lookup_extended(sim_hash, SNMP_BC_ERROR_LOG_MSG_OID, (gpointer)&hash_key, (gpointer)&hash_value)) { hash_key = g_strdup(SNMP_BC_ERROR_LOG_MSG_OID); if (!hash_key) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Cannot allocate memory for OID key=%s.\n", SNMP_BC_ERROR_LOG_MSG_OID); return -1; } hash_value = g_malloc0(sizeof(SnmpMibInfoT)); if (!hash_value) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Cannot allocate memory for hash value for OID=%s.\n", SNMP_BC_ERROR_LOG_MSG_OID); return -1; } } err = saHpiEventLogClear(sessionid, rid_eventlog); if (err) { printf("Error! saHpiEventLogClear: line=%d; err=%d\n", __LINE__, err); return -1; } /************************************************************** * TestCase - Blade 1 is defined as an IPMI blade in simulator. * Test to see that a common event defined in blade_sensors * (as opposed to blade_ipmi_sensors) are mapped to IPMI blade. **************************************************************/ logstr = "Severity:INFO Source:BLADE_01 Name:WMN315702424 Date:10/11/03 Time:09:09:46 Text:CPU 1 shut off due to over temperature"; memset(&logentry, 0 , sizeof(SaHpiEventLogEntryT)); strcpy(hash_value->value.string, logstr); g_hash_table_insert(sim_hash, hash_key, hash_value); err = saHpiEventLogEntryGet(sessionid, rid_eventlog, SAHPI_NEWEST_ENTRY, &prev_logid, &next_logid, &logentry, &rdr, &rpt); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } /* Check expected values */ if (!(!(logentry.Event.Source == rid_eventlog) && (logentry.Event.EventType == SAHPI_ET_SENSOR) && (logentry.Event.Severity == SAHPI_CRITICAL) && (logentry.Event.EventDataUnion.SensorEvent.SensorType == SAHPI_TEMPERATURE) && (logentry.Event.EventDataUnion.SensorEvent.Assertion == SAHPI_TRUE) && (logentry.Event.EventDataUnion.SensorEvent.EventState & SAHPI_ES_UPPER_CRIT) && (!(logentry.Event.EventDataUnion.SensorEvent.EventState & SAHPI_ES_UPPER_MAJOR)) && (!(logentry.Event.EventDataUnion.SensorEvent.EventState & SAHPI_ES_UPPER_MINOR)) && (logentry.Event.EventDataUnion.SensorEvent.PreviousState == SAHPI_ES_UNSPECIFIED) && (logentry.Event.EventDataUnion.SensorEvent.CurrentState == SAHPI_ES_UNSPECIFIED))) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); oh_print_event(&(logentry.Event), (rdr.RdrType != SAHPI_NO_RECORD) ? &rdr.Entity : NULL, 1); return -1; } err = saHpiEventLogClear(sessionid, rid_eventlog); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } /*************************************************************** * TestCase - Blade 1 is defined as an IPMI blade in simulator. * Test to see that an IPMI unique event is mapped correctly. ***************************************************************/ logstr = "Severity:INFO Source:BLADE_01 Name:WMN315702424 Date:10/11/03 Time:09:09:46 Text:1.8V standby over recommended voltage"; memset(&logentry, 0 , sizeof(SaHpiEventLogEntryT)); strcpy(hash_value->value.string, logstr); g_hash_table_insert(sim_hash, hash_key, hash_value); err = saHpiEventLogEntryGet(sessionid, rid_eventlog, SAHPI_NEWEST_ENTRY, &prev_logid, &next_logid, &logentry, &rdr, &rpt); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } #if 0 /* Check expected values */ if (!(!(logentry.Event.Source == rid_eventlog) && (logentry.Event.EventType == SAHPI_ET_SENSOR) && (logentry.Event.Severity == SAHPI_MAJOR) && (logentry.Event.EventDataUnion.SensorEvent.SensorType == SAHPI_VOLTAGE) && (logentry.Event.EventDataUnion.SensorEvent.Assertion == SAHPI_TRUE) && (!(logentry.Event.EventDataUnion.SensorEvent.EventState & SAHPI_ES_UPPER_CRIT)) && ((logentry.Event.EventDataUnion.SensorEvent.EventState & SAHPI_ES_UPPER_MAJOR)) && (!(logentry.Event.EventDataUnion.SensorEvent.EventState & SAHPI_ES_UPPER_MINOR)) && (logentry.Event.EventDataUnion.SensorEvent.PreviousState == SAHPI_ES_UNSPECIFIED) && (logentry.Event.EventDataUnion.SensorEvent.CurrentState & SAHPI_ES_UPPER_MAJOR))) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); oh_print_event(&(logentry.Event), (rdr.RdrType != SAHPI_NO_RECORD) ? &rdr.Entity : NULL, 1); return -1; } #endif err = saHpiEventLogClear(sessionid, rid_eventlog); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } /************************************************************ * TestCase - Mapped OVR_MM_PRIME Event (EN_FAULT_OC_USB_HUB) ************************************************************/ logstr = "Severity:INFO Source:SERVPROC Name:WMN315702424 Date:10/11/03 Time:09:09:46 Text:USB hub over-current failure"; memset(&logentry, 0 , sizeof(SaHpiEventLogEntryT)); strcpy(hash_value->value.string, logstr); g_hash_table_insert(sim_hash, hash_key, hash_value); err = saHpiEventLogEntryGet(sessionid, rid_eventlog, SAHPI_NEWEST_ENTRY, &prev_logid, &next_logid, &logentry, &rdr, &rpt); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } /* Check expected values */ if (!(!(logentry.Event.Source == rid_eventlog) && (logentry.Event.EventType == SAHPI_ET_SENSOR) && (logentry.Event.Severity == SAHPI_MAJOR) && (logentry.Event.EventDataUnion.SensorEvent.SensorType == SAHPI_OPERATIONAL) && (logentry.Event.EventDataUnion.SensorEvent.Assertion == SAHPI_TRUE) && (logentry.Event.EventDataUnion.SensorEvent.EventState & SAHPI_ES_DEGRADED) && (logentry.Event.EventDataUnion.SensorEvent.PreviousState & SAHPI_ES_RUNNING) && (logentry.Event.EventDataUnion.SensorEvent.CurrentState & SAHPI_ES_DEGRADED))) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); oh_print_event(&(logentry.Event), (rdr.RdrType != SAHPI_NO_RECORD) ? &rdr.Entity : NULL, 1); return -1; } err = saHpiEventLogClear(sessionid, rid_eventlog); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } /***************************************************************** * TestCase - Mapped OVR_MM_STBY Event (EN_STBIST_FAIL_R_BOOT_ROM) *****************************************************************/ logstr = "Severity:INFO Source:SERVPROC Name:WMN315702424 Date:10/11/03 Time:09:09:46 Text:BIST standby MM bootrom failed."; memset(&logentry, 0 , sizeof(SaHpiEventLogEntryT)); strcpy(hash_value->value.string, logstr); g_hash_table_insert(sim_hash, hash_key, hash_value); err = saHpiEventLogEntryGet(sessionid, rid_eventlog, SAHPI_NEWEST_ENTRY, &prev_logid, &next_logid, &logentry, &rdr, &rpt); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } #if 0 /* Check expected values */ if (!(!(logentry.Event.Source == rid_eventlog) && (logentry.Event.EventType == SAHPI_ET_SENSOR) && (logentry.Event.Severity == SAHPI_MAJOR) && (logentry.Event.EventDataUnion.SensorEvent.SensorType == SAHPI_OPERATIONAL) && (logentry.Event.EventDataUnion.SensorEvent.Assertion == SAHPI_TRUE) && (logentry.Event.EventDataUnion.SensorEvent.EventState & SAHPI_ES_DEGRADED) && (logentry.Event.EventDataUnion.SensorEvent.PreviousState & SAHPI_ES_RUNNING) && (logentry.Event.EventDataUnion.SensorEvent.CurrentState & SAHPI_ES_DEGRADED))) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); oh_print_event(&(logentry.Event), (rdr.RdrType != SAHPI_NO_RECORD) ? &rdr.Entity : NULL, 1); return -1; } #endif err = saHpiEventLogClear(sessionid, rid_eventlog); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } /*************************************************************** * TestCase - Mapped MM Voltage Event (EN_PFA_HI_FAULT_3_35V) * Event recovered in next testcase. * Also tests double space handling in text ***************************************************************/ logstr = "Severity:INFO Source:SERVPROC Name:WMN315702424 Date:10/11/03 Time:09:09:46 Text:System over recommended voltage on +3.3v. Read value 3.5. Threshold value 3.4"; memset(&logentry, 0 , sizeof(SaHpiEventLogEntryT)); strcpy(hash_value->value.string, logstr); g_hash_table_insert(sim_hash, hash_key, hash_value); err = saHpiEventLogEntryGet(sessionid, rid_eventlog, SAHPI_NEWEST_ENTRY, &prev_logid, &next_logid, &logentry, &rdr, &rpt); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } /* Check expected values */ if (!((logentry.Event.Source == rid_eventlog) && (logentry.Event.EventType == SAHPI_ET_SENSOR) && (logentry.Event.Severity == SAHPI_CRITICAL) && (logentry.Event.EventDataUnion.SensorEvent.SensorType == SAHPI_VOLTAGE) && (logentry.Event.EventDataUnion.SensorEvent.Assertion == SAHPI_TRUE) && (logentry.Event.EventDataUnion.SensorEvent.EventState & SAHPI_ES_UPPER_CRIT) && (!(logentry.Event.EventDataUnion.SensorEvent.EventState & SAHPI_ES_UPPER_MAJOR)) && (!(logentry.Event.EventDataUnion.SensorEvent.EventState & SAHPI_ES_UPPER_MINOR)) && (logentry.Event.EventDataUnion.SensorEvent.PreviousState == SAHPI_ES_UNSPECIFIED) && (logentry.Event.EventDataUnion.SensorEvent.CurrentState == SAHPI_ES_UNSPECIFIED) && (logentry.Event.EventDataUnion.SensorEvent.TriggerReading.Value.SensorFloat64 == (double)3.5) && (logentry.Event.EventDataUnion.SensorEvent.TriggerThreshold.Value.SensorFloat64 == (double)3.4))) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); oh_print_event(&(logentry.Event), (rdr.RdrType != SAHPI_NO_RECORD) ? &rdr.Entity : NULL, 1); return -1; } err = saHpiEventLogClear(sessionid, rid_eventlog); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } /***************************************************************** * TestCase - MM Voltage Recovery Event (EN_PFA_HI_FAULT_3_35V) * Recover event in previous testcase. * Also test BladeCenter alternate threshold format *****************************************************************/ logstr = "Severity:INFO Source:SERVPROC Name:WMN315702424 Date:10/11/03 Time:09:09:46 Text:Recovery System over recommended voltage on +3.3v. Reading: 3.5, Threshold: 3.4."; memset(&logentry, 0 , sizeof(SaHpiEventLogEntryT)); strcpy(hash_value->value.string, logstr); g_hash_table_insert(sim_hash, hash_key, hash_value); err = saHpiEventLogEntryGet(sessionid, rid_eventlog, SAHPI_NEWEST_ENTRY, &prev_logid, &next_logid, &logentry, &rdr, &rpt); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } /* Check expected values */ if (!((logentry.Event.Source == rid_eventlog) && (logentry.Event.EventType == SAHPI_ET_SENSOR) && (logentry.Event.Severity == SAHPI_CRITICAL) && (logentry.Event.EventDataUnion.SensorEvent.SensorType == SAHPI_VOLTAGE) && (logentry.Event.EventDataUnion.SensorEvent.Assertion == SAHPI_FALSE) && (logentry.Event.EventDataUnion.SensorEvent.EventState & SAHPI_ES_UPPER_CRIT) && (!(logentry.Event.EventDataUnion.SensorEvent.EventState & SAHPI_ES_UPPER_MAJOR)) && (!(logentry.Event.EventDataUnion.SensorEvent.EventState & SAHPI_ES_UPPER_MINOR)) && (logentry.Event.EventDataUnion.SensorEvent.PreviousState == SAHPI_ES_UNSPECIFIED) && (logentry.Event.EventDataUnion.SensorEvent.CurrentState == SAHPI_ES_UNSPECIFIED) && (logentry.Event.EventDataUnion.SensorEvent.TriggerReading.Value.SensorFloat64 == (double)3.5) && (logentry.Event.EventDataUnion.SensorEvent.TriggerThreshold.Value.SensorFloat64 == (double)3.4))) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); oh_print_event(&(logentry.Event), (rdr.RdrType != SAHPI_NO_RECORD) ? &rdr.Entity : NULL, 1); return -1; } err = saHpiEventLogClear(sessionid, rid_eventlog); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } /******************************************************** * TestCase - MM Voltage Event (EN_PFA_HI_FAULT_3_35V) * Change current sensor reading to a LOWER CRITICAL value. * Previous state depends upon previous testcase. * Test some possible grammer changes in read/threshold values. ********************************************************/ logstr = "Severity:INFO Source:SERVPROC Name:WMN315702424 Date:10/11/03 Time:09:09:46 Text:System over recommended voltage on +3.3v. Reading: 3.5; Threshold: 3.4."; memset(&logentry, 0 , sizeof(SaHpiEventLogEntryT)); strcpy(hash_value->value.string, logstr); g_hash_table_insert(sim_hash, hash_key, hash_value); /* Change sensor's simulator value */ hash_set_value = (SnmpMibInfoT *)g_hash_table_lookup(sim_hash, SNMP_BC_MM_VOLT_3_3_OID); if (hash_set_value == NULL) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received Null hash value\n"); return -1; } strcpy(hash_set_value->value.string, "2.9 Volts"); err = saHpiEventLogEntryGet(sessionid, rid_eventlog, SAHPI_NEWEST_ENTRY, &prev_logid, &next_logid, &logentry, &rdr, &rpt); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } /* Check expected values */ if (!((logentry.Event.Source == rid_eventlog) && (logentry.Event.EventType == SAHPI_ET_SENSOR) && (logentry.Event.Severity == SAHPI_CRITICAL) && (logentry.Event.EventDataUnion.SensorEvent.SensorType == SAHPI_VOLTAGE) && (logentry.Event.EventDataUnion.SensorEvent.Assertion == SAHPI_TRUE) && (logentry.Event.EventDataUnion.SensorEvent.EventState & SAHPI_ES_UPPER_CRIT) && (!(logentry.Event.EventDataUnion.SensorEvent.EventState & SAHPI_ES_UPPER_MAJOR)) && (!(logentry.Event.EventDataUnion.SensorEvent.EventState & SAHPI_ES_UPPER_MINOR)) && (logentry.Event.EventDataUnion.SensorEvent.PreviousState == SAHPI_ES_UNSPECIFIED) && ((logentry.Event.EventDataUnion.SensorEvent.CurrentState & SAHPI_ES_LOWER_CRIT)) && (!(logentry.Event.EventDataUnion.SensorEvent.CurrentState & SAHPI_ES_LOWER_MAJOR)) && (!(logentry.Event.EventDataUnion.SensorEvent.CurrentState & SAHPI_ES_LOWER_MINOR)) && (logentry.Event.EventDataUnion.SensorEvent.TriggerReading.Value.SensorFloat64 == (double)3.5) && (logentry.Event.EventDataUnion.SensorEvent.TriggerThreshold.Value.SensorFloat64 == (double)3.4))) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); oh_print_event(&(logentry.Event), (rdr.RdrType != SAHPI_NO_RECORD) ? &rdr.Entity : NULL, 1); return -1; } err = saHpiEventLogClear(sessionid, rid_eventlog); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } /* Set sensor's simulator value back to default */ hash_set_value = (SnmpMibInfoT *)g_hash_table_lookup(sim_hash, SNMP_BC_MM_VOLT_3_3_OID); if (hash_set_value == NULL) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received Null hash value\n"); return -1; } strcpy(hash_set_value->value.string, "3.3 Volts"); /******************************************************** * TestCase - MM Voltage Event (EN_PFA_HI_FAULT_3_35V) * Change sensor reading to a UPPER CRITICAL value. * Previous state depends upon previous testcase. ********************************************************/ logstr = "Severity:INFO Source:SERVPROC Name:WMN315702424 Date:10/11/03 Time:09:09:46 Text:System over recommended voltage on +3.3v. Read value 3.5 Threshold value 3.4"; memset(&logentry, 0 , sizeof(SaHpiEventLogEntryT)); strcpy(hash_value->value.string, logstr); g_hash_table_insert(sim_hash, hash_key, hash_value); /* Change sensor's simulator value */ hash_set_value = (SnmpMibInfoT *)g_hash_table_lookup(sim_hash, SNMP_BC_MM_VOLT_3_3_OID); if (hash_set_value == NULL) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received Null hash value\n"); return -1; } strcpy(hash_set_value->value.string, "3.5 Volts"); err = saHpiEventLogEntryGet(sessionid, rid_eventlog, SAHPI_NEWEST_ENTRY, &prev_logid, &next_logid, &logentry, &rdr, &rpt); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } /* Check expected values */ if (!((logentry.Event.Source == rid_eventlog) && (logentry.Event.EventType == SAHPI_ET_SENSOR) && (logentry.Event.Severity == SAHPI_CRITICAL) && (logentry.Event.EventDataUnion.SensorEvent.SensorType == SAHPI_VOLTAGE) && (logentry.Event.EventDataUnion.SensorEvent.Assertion == SAHPI_TRUE) && (logentry.Event.EventDataUnion.SensorEvent.EventState & SAHPI_ES_UPPER_CRIT) && (!(logentry.Event.EventDataUnion.SensorEvent.EventState & SAHPI_ES_UPPER_MAJOR)) && (!(logentry.Event.EventDataUnion.SensorEvent.EventState & SAHPI_ES_UPPER_MINOR)) && ((logentry.Event.EventDataUnion.SensorEvent.PreviousState & SAHPI_ES_LOWER_CRIT)) && (!(logentry.Event.EventDataUnion.SensorEvent.PreviousState & SAHPI_ES_LOWER_MAJOR)) && (!(logentry.Event.EventDataUnion.SensorEvent.PreviousState & SAHPI_ES_LOWER_MINOR)) && ((logentry.Event.EventDataUnion.SensorEvent.CurrentState & SAHPI_ES_UPPER_CRIT)) && (!(logentry.Event.EventDataUnion.SensorEvent.CurrentState & SAHPI_ES_UPPER_MAJOR)) && (!(logentry.Event.EventDataUnion.SensorEvent.CurrentState & SAHPI_ES_UPPER_MINOR)) && (logentry.Event.EventDataUnion.SensorEvent.TriggerReading.Value.SensorFloat64 == (double)3.5) && (logentry.Event.EventDataUnion.SensorEvent.TriggerThreshold.Value.SensorFloat64 == (double)3.4))) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); oh_print_event(&(logentry.Event), (rdr.RdrType != SAHPI_NO_RECORD) ? &rdr.Entity : NULL, 1); return -1; } err = saHpiEventLogClear(sessionid, rid_eventlog); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } /* Set sensor's simulator value back to default */ hash_set_value = (SnmpMibInfoT *)g_hash_table_lookup(sim_hash, SNMP_BC_MM_VOLT_3_3_OID); if (hash_set_value == NULL) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received Null hash value\n"); return -1; } strcpy(hash_set_value->value.string, "3.3 Volts"); /********************************************************** * TestCase - Blade Duplicate Event (EN_PFA_HI_FAULT_3_35V) * Same as previous testcase only for the blade. **********************************************************/ logstr = "Severity:INFO Source:BLADE_11 Name:WMN315702424 Date:10/11/03 Time:09:09:46 Text:System over recommended voltage on +3.3v. Read value 3.5 Threshold value 3.4"; memset(&logentry, 0 , sizeof(SaHpiEventLogEntryT)); strcpy(hash_value->value.string, logstr); g_hash_table_insert(sim_hash, hash_key, hash_value); err = saHpiEventLogEntryGet(sessionid, rid_eventlog, SAHPI_NEWEST_ENTRY, &prev_logid, &next_logid, &logentry, &rdr, &rpt); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } /* Check expected values */ if (!((!(logentry.Event.Source == rid_eventlog)) && (logentry.Event.EventType == SAHPI_ET_SENSOR) && (logentry.Event.Severity == SAHPI_MAJOR) && (logentry.Event.EventDataUnion.SensorEvent.SensorType == SAHPI_VOLTAGE) && (logentry.Event.EventDataUnion.SensorEvent.Assertion == SAHPI_TRUE) && (!(logentry.Event.EventDataUnion.SensorEvent.EventState & SAHPI_ES_UPPER_CRIT)) && (logentry.Event.EventDataUnion.SensorEvent.EventState & SAHPI_ES_UPPER_MAJOR) && (!(logentry.Event.EventDataUnion.SensorEvent.EventState & SAHPI_ES_UPPER_MINOR)) && (logentry.Event.EventDataUnion.SensorEvent.PreviousState == SAHPI_ES_UNSPECIFIED) && (logentry.Event.EventDataUnion.SensorEvent.CurrentState == SAHPI_ES_UNSPECIFIED) && (logentry.Event.EventDataUnion.SensorEvent.TriggerReading.Value.SensorFloat64 == (double)3.5) && (logentry.Event.EventDataUnion.SensorEvent.TriggerThreshold.Value.SensorFloat64 == (double)3.4))) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); oh_print_event(&(logentry.Event), (rdr.RdrType != SAHPI_NO_RECORD) ? &rdr.Entity : NULL, 1); return -1; } err = saHpiEventLogClear(sessionid, rid_eventlog); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } /************************************************************** * TestCase - Chassis Temperature (EN_PFA_HI_OVER_TEMP_AMBIENT) * Set at nominal temperature value. **************************************************************/ logstr = "Severity:INFO Source:SERVPROC Name:WMN315702424 Date:10/11/03 Time:09:09:46 Text:System over recommended ambient temperature."; memset(&logentry, 0 , sizeof(SaHpiEventLogEntryT)); strcpy(hash_value->value.string, logstr); g_hash_table_insert(sim_hash, hash_key, hash_value); /* Change sensor's simulator value */ hash_set_value = (SnmpMibInfoT *)g_hash_table_lookup(sim_hash, SNMP_BC_CHASSIS_TEMP_OID); if (hash_set_value == NULL) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received Null hash value\n"); return -1; } strcpy(hash_set_value->value.string, "39 Centigrade"); err = saHpiEventLogEntryGet(sessionid, rid_eventlog, SAHPI_NEWEST_ENTRY, &prev_logid, &next_logid, &logentry, &rdr, &rpt); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } /* Check expected values */ if (!(!(logentry.Event.Source == rid_eventlog) && (logentry.Event.EventType == SAHPI_ET_SENSOR) && (logentry.Event.Severity == SAHPI_MAJOR) && (logentry.Event.EventDataUnion.SensorEvent.SensorType == SAHPI_TEMPERATURE) && (logentry.Event.EventDataUnion.SensorEvent.Assertion == SAHPI_TRUE) && (!(logentry.Event.EventDataUnion.SensorEvent.EventState & SAHPI_ES_UPPER_CRIT)) && (logentry.Event.EventDataUnion.SensorEvent.EventState & SAHPI_ES_UPPER_MAJOR) && (!(logentry.Event.EventDataUnion.SensorEvent.EventState & SAHPI_ES_UPPER_MINOR)) && (logentry.Event.EventDataUnion.SensorEvent.PreviousState == SAHPI_ES_UNSPECIFIED) && (logentry.Event.EventDataUnion.SensorEvent.CurrentState == SAHPI_ES_UNSPECIFIED))) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); oh_print_event(&(logentry.Event), (rdr.RdrType != SAHPI_NO_RECORD) ? &rdr.Entity : NULL, 1); return -1; } err = saHpiEventLogClear(sessionid, rid_eventlog); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } /************************************************************** * TestCase - Chassis Temperature (EN_PFA_HI_OVER_TEMP_AMBIENT) * Set above warning level. **************************************************************/ logstr = "Severity:INFO Source:SERVPROC Name:WMN315702424 Date:10/11/03 Time:09:09:46 Text:System over recommended ambient temperature."; memset(&logentry, 0 , sizeof(SaHpiEventLogEntryT)); strcpy(hash_value->value.string, logstr); g_hash_table_insert(sim_hash, hash_key, hash_value); /* Change sensor's simulator value */ hash_set_value = (SnmpMibInfoT *)g_hash_table_lookup(sim_hash, SNMP_BC_CHASSIS_TEMP_OID); if (hash_set_value == NULL) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received Null hash value\n"); return -1; } strcpy(hash_set_value->value.string, "61 Centigrade"); err = saHpiEventLogEntryGet(sessionid, rid_eventlog, SAHPI_NEWEST_ENTRY, &prev_logid, &next_logid, &logentry, &rdr, &rpt); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } /* Check expected values */ if (!(!(logentry.Event.Source == rid_eventlog) && (logentry.Event.EventType == SAHPI_ET_SENSOR) && (logentry.Event.Severity == SAHPI_MAJOR) && (logentry.Event.EventDataUnion.SensorEvent.SensorType == SAHPI_TEMPERATURE) && (logentry.Event.EventDataUnion.SensorEvent.Assertion == SAHPI_TRUE) && (!(logentry.Event.EventDataUnion.SensorEvent.EventState & SAHPI_ES_UPPER_CRIT)) && (logentry.Event.EventDataUnion.SensorEvent.EventState & SAHPI_ES_UPPER_MAJOR) && (!(logentry.Event.EventDataUnion.SensorEvent.EventState & SAHPI_ES_UPPER_MINOR)) && (logentry.Event.EventDataUnion.SensorEvent.PreviousState == SAHPI_ES_UNSPECIFIED) && (!(logentry.Event.EventDataUnion.SensorEvent.CurrentState & SAHPI_ES_UPPER_CRIT)) && (logentry.Event.EventDataUnion.SensorEvent.CurrentState & SAHPI_ES_UPPER_MAJOR) && (!(logentry.Event.EventDataUnion.SensorEvent.CurrentState & SAHPI_ES_UPPER_MINOR)))) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); oh_print_event(&(logentry.Event), (rdr.RdrType != SAHPI_NO_RECORD) ? &rdr.Entity : NULL, 1); return -1; } err = saHpiEventLogClear(sessionid, rid_eventlog); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } /************************************************************* * TestCase - Non-mapped Event (Severity=INFO) *************************************************************/ logstr = "Severity:INFO Source:BLADE_01 Name:WMN315702424 Date:10/11/03 Time:09:09:46 Text:Bogus message not in string to event table"; memset(&logentry, 0 , sizeof(SaHpiEventLogEntryT)); strcpy(hash_value->value.string, logstr); g_hash_table_insert(sim_hash, hash_key, hash_value); err = saHpiEventLogEntryGet(sessionid, rid_eventlog, SAHPI_NEWEST_ENTRY, &prev_logid, &next_logid, &logentry, &rdr, &rpt); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } /* Check expected values */ if (!((!(logentry.Event.Source == rid_eventlog)) && (logentry.Event.EventType == SAHPI_ET_OEM) && (logentry.Event.Severity == SAHPI_INFORMATIONAL))) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); oh_print_event(&(logentry.Event), (rdr.RdrType != SAHPI_NO_RECORD) ? &rdr.Entity : NULL, 1); return -1; } err = saHpiEventLogClear(sessionid, rid_eventlog); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } /************************************************************* * TestCase - Expansion Card Event (EN_PFA_HI_OVER_TEMP_DASD1) *************************************************************/ logstr = "Severity:INFO Source:BLADE_03 Name:WMN315702424 Date:10/11/03 Time:09:09:46 Text:BEM Option over recommended temperature. Read value 87 Threshold value 75"; memset(&logentry, 0 , sizeof(SaHpiEventLogEntryT)); strcpy(hash_value->value.string, logstr); g_hash_table_insert(sim_hash, hash_key, hash_value); err = saHpiEventLogEntryGet(sessionid, rid_eventlog, SAHPI_NEWEST_ENTRY, &prev_logid, &next_logid, &logentry, &rdr, &rpt); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } /* Check expected values */ if (!((!(logentry.Event.Source == rid_eventlog)) && (logentry.Event.EventType == SAHPI_ET_SENSOR) && (logentry.Event.Severity == SAHPI_MAJOR) && (logentry.Event.EventDataUnion.SensorEvent.SensorType == SAHPI_TEMPERATURE) && (logentry.Event.EventDataUnion.SensorEvent.Assertion == SAHPI_TRUE) && (!(logentry.Event.EventDataUnion.SensorEvent.EventState & SAHPI_ES_UPPER_CRIT)) && (logentry.Event.EventDataUnion.SensorEvent.EventState & SAHPI_ES_UPPER_MAJOR) && (!(logentry.Event.EventDataUnion.SensorEvent.EventState & SAHPI_ES_UPPER_MINOR)) && (logentry.Event.EventDataUnion.SensorEvent.PreviousState == SAHPI_ES_UNSPECIFIED) && (logentry.Event.EventDataUnion.SensorEvent.CurrentState & SAHPI_ES_UPPER_MAJOR))) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); oh_print_event(&(logentry.Event), (rdr.RdrType != SAHPI_NO_RECORD) ? &rdr.Entity : NULL, 1); return -1; } err = saHpiEventLogClear(sessionid, rid_eventlog); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } /************************************************************* * TestCase - Non-mapped Login Event (Severity=WARN) *************************************************************/ logstr = "Severity:WARN Source:SWITCH_4 Name:WMN315702424 Date:10/11/03 Time:09:09:46 Text:Bogus login message Login ID:\'\'myid\' @ someaddress\'"; memset(&logentry, 0 , sizeof(SaHpiEventLogEntryT)); strcpy(hash_value->value.string, logstr); g_hash_table_insert(sim_hash, hash_key, hash_value); err = saHpiEventLogEntryGet(sessionid, rid_eventlog, SAHPI_NEWEST_ENTRY, &prev_logid, &next_logid, &logentry, &rdr, &rpt); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } /* Check expected values */ if (!((!(logentry.Event.Source == rid_eventlog)) && (logentry.Event.EventType == SAHPI_ET_OEM) && (logentry.Event.Severity == SAHPI_MINOR))) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); oh_print_event(&(logentry.Event), (rdr.RdrType != SAHPI_NO_RECORD) ? &rdr.Entity : NULL, 1); return -1; } err = saHpiEventLogClear(sessionid, rid_eventlog); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } /*********************************************************** * TestCase - Power over temperature (EN_FAULT_PSx_OVR_TEMP) * This is a non-readable sensor. Recover in next testcase. ***********************************************************/ logstr = "Severity:INFO Source:SERVPROC Name:WMN315702424 Date:10/11/03 Time:09:09:46 Text:Power Supply 1 Temperature Fault"; memset(&logentry, 0 , sizeof(SaHpiEventLogEntryT)); strcpy(hash_value->value.string, logstr); g_hash_table_insert(sim_hash, hash_key, hash_value); err = saHpiEventLogEntryGet(sessionid, rid_eventlog, SAHPI_NEWEST_ENTRY, &prev_logid, &next_logid, &logentry, &rdr, &rpt); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } /* Check expected values */ if (!((!(logentry.Event.Source == rid_eventlog)) && (logentry.Event.EventType == SAHPI_ET_SENSOR) && (logentry.Event.Severity == SAHPI_CRITICAL) && (logentry.Event.EventDataUnion.SensorEvent.SensorType == SAHPI_TEMPERATURE) && (logentry.Event.EventDataUnion.SensorEvent.Assertion == SAHPI_TRUE) && (logentry.Event.EventDataUnion.SensorEvent.EventState & SAHPI_ES_UPPER_CRIT) && (logentry.Event.EventDataUnion.SensorEvent.PreviousState == SAHPI_ES_UNSPECIFIED) && ((logentry.Event.EventDataUnion.SensorEvent.CurrentState & SAHPI_ES_UPPER_CRIT)) && (!(logentry.Event.EventDataUnion.SensorEvent.CurrentState & SAHPI_ES_UPPER_MAJOR)) && (!(logentry.Event.EventDataUnion.SensorEvent.CurrentState & SAHPI_ES_UPPER_MINOR)))) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); oh_print_event(&(logentry.Event), (rdr.RdrType != SAHPI_NO_RECORD) ? &rdr.Entity : NULL, 1); return -1; } err = saHpiEventLogClear(sessionid, rid_eventlog); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } /*********************************************************** * TestCase - Power over temperature (EN_FAULT_PSx_OVR_TEMP) * This is a non-readable sensor. Recover previous testcase. ***********************************************************/ logstr = "Severity:INFO Source:SERVPROC Name:WMN315702424 Date:10/11/03 Time:09:09:46 Text:Recovery Power Supply 1 Temperature Fault"; memset(&logentry, 0 , sizeof(SaHpiEventLogEntryT)); strcpy(hash_value->value.string, logstr); g_hash_table_insert(sim_hash, hash_key, hash_value); err = saHpiEventLogEntryGet(sessionid, rid_eventlog, SAHPI_NEWEST_ENTRY, &prev_logid, &next_logid, &logentry, &rdr, &rpt); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } /* Check expected values */ if (!((!(logentry.Event.Source == rid_eventlog)) && (logentry.Event.EventType == SAHPI_ET_SENSOR) && (logentry.Event.Severity == SAHPI_CRITICAL) && (logentry.Event.EventDataUnion.SensorEvent.SensorType == SAHPI_TEMPERATURE) && (logentry.Event.EventDataUnion.SensorEvent.Assertion == SAHPI_FALSE) && (logentry.Event.EventDataUnion.SensorEvent.EventState & SAHPI_ES_UPPER_CRIT) && (!(logentry.Event.EventDataUnion.SensorEvent.EventState & SAHPI_ES_UPPER_MAJOR)) && (!(logentry.Event.EventDataUnion.SensorEvent.EventState & SAHPI_ES_UPPER_MINOR)) && ((logentry.Event.EventDataUnion.SensorEvent.PreviousState & SAHPI_ES_UPPER_CRIT)) && (!(logentry.Event.EventDataUnion.SensorEvent.PreviousState & SAHPI_ES_UPPER_MAJOR)) && (!(logentry.Event.EventDataUnion.SensorEvent.PreviousState & SAHPI_ES_UPPER_MINOR)) && (!(logentry.Event.EventDataUnion.SensorEvent.CurrentState & SAHPI_ES_UPPER_CRIT)) && ((logentry.Event.EventDataUnion.SensorEvent.CurrentState & SAHPI_ES_UPPER_MAJOR)) && (!(logentry.Event.EventDataUnion.SensorEvent.CurrentState & SAHPI_ES_UPPER_MINOR)))) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); oh_print_event(&(logentry.Event), (rdr.RdrType != SAHPI_NO_RECORD) ? &rdr.Entity : NULL, 1); return -1; } err = saHpiEventLogClear(sessionid, rid_eventlog); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } /************************************************************* * TestCase - Hotswap switch installed (EN_SWITCH_3_INSTALLED) *************************************************************/ logstr = "Severity:INFO Source:SWITCH_3 Name:WMN315702424 Date:10/11/03 Time:09:09:46 Text:I/O module 3 was installed."; memset(&logentry, 0 , sizeof(SaHpiEventLogEntryT)); strcpy(hash_value->value.string, logstr); g_hash_table_insert(sim_hash, hash_key, hash_value); err = saHpiEventLogEntryGet(sessionid, rid_eventlog, SAHPI_NEWEST_ENTRY, &prev_logid, &next_logid, &logentry, &rdr, &rpt); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } /* Check expected values */ if (!((!(logentry.Event.Source == rid_eventlog)) && (logentry.Event.EventType == SAHPI_ET_HOTSWAP) && (logentry.Event.Severity == SAHPI_INFORMATIONAL) && (logentry.Event.EventDataUnion.HotSwapEvent.HotSwapState == SAHPI_HS_STATE_INACTIVE) && (logentry.Event.EventDataUnion.HotSwapEvent.PreviousHotSwapState == SAHPI_HS_STATE_ACTIVE))) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); oh_print_event(&(logentry.Event), (rdr.RdrType != SAHPI_NO_RECORD) ? &rdr.Entity : NULL, 1); return -1; } err = saHpiEventLogClear(sessionid, rid_eventlog); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } /**************************************************************** * TestCase - hotswap Media Tray removal (EN_MEDIA_TRAY_REMOVED) * This event is recovered in the next testcase. Should be * MAJOR severity, since this is an unexpected failure. ****************************************************************/ logstr = "Severity:INFO Source:SERVPROC Name:WMN315702424 Date:10/11/03 Time:09:09:46 Text:The media tray was removed."; memset(&logentry, 0 , sizeof(SaHpiEventLogEntryT)); strcpy(hash_value->value.string, logstr); g_hash_table_insert(sim_hash, hash_key, hash_value); err = saHpiEventLogEntryGet(sessionid, rid_eventlog, SAHPI_NEWEST_ENTRY, &prev_logid, &next_logid, &logentry, &rdr, &rpt); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } /* Check expected values */ if (!((!(logentry.Event.Source == rid_eventlog)) && (logentry.Event.EventType == SAHPI_ET_HOTSWAP) && (logentry.Event.Severity == SAHPI_MAJOR) && (logentry.Event.EventDataUnion.HotSwapEvent.HotSwapState == SAHPI_HS_STATE_NOT_PRESENT) && (logentry.Event.EventDataUnion.HotSwapEvent.PreviousHotSwapState == SAHPI_HS_STATE_ACTIVE))) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); oh_print_event(&(logentry.Event), (rdr.RdrType != SAHPI_NO_RECORD) ? &rdr.Entity : NULL, 1); return -1; } err = saHpiEventLogClear(sessionid, rid_eventlog); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } /**************************************************************** * TestCase - hotswap Media Tray recovery (EN_MEDIA_TRAY_REMOVED) * Recovery of previous event. ****************************************************************/ logstr = "Severity:INFO Source:SERVPROC Name:WMN315702424 Date:10/11/03 Time:09:09:46 Text:Recovery The media tray was removed."; memset(&logentry, 0 , sizeof(SaHpiEventLogEntryT)); strcpy(hash_value->value.string, logstr); g_hash_table_insert(sim_hash, hash_key, hash_value); err = saHpiEventLogEntryGet(sessionid, rid_eventlog, SAHPI_NEWEST_ENTRY, &prev_logid, &next_logid, &logentry, &rdr, &rpt); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } /* Check expected values */ if (!((!(logentry.Event.Source == rid_eventlog)) && (logentry.Event.EventType == SAHPI_ET_HOTSWAP) && (logentry.Event.Severity == SAHPI_INFORMATIONAL) && (logentry.Event.EventDataUnion.HotSwapEvent.HotSwapState == SAHPI_HS_STATE_ACTIVE) && (logentry.Event.EventDataUnion.HotSwapEvent.PreviousHotSwapState == SAHPI_HS_STATE_NOT_PRESENT))) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); oh_print_event(&(logentry.Event), (rdr.RdrType != SAHPI_NO_RECORD) ? &rdr.Entity : NULL, 1); return -1; } err = saHpiEventLogClear(sessionid, rid_eventlog); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } goto COMMON_TESTS; RSA_TESTS: /* If test OID not already in sim hash table; create it */ if (!g_hash_table_lookup_extended(sim_hash, SNMP_BC_ERROR_LOG_MSG_OID_RSA, (gpointer)&hash_key, (gpointer)&hash_value)) { hash_key = g_strdup(SNMP_BC_ERROR_LOG_MSG_OID_RSA); if (!hash_key) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Cannot allocate memory for OID key=%s.\n", SNMP_BC_ERROR_LOG_MSG_OID_RSA); return -1; } hash_value = g_malloc0(sizeof(SnmpMibInfoT)); if (!hash_value) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Cannot allocate memory for hash value for OID=%s.\n", SNMP_BC_ERROR_LOG_MSG_OID_RSA); return -1; } } err = saHpiEventLogClear(sessionid, rid_eventlog); if (err) { printf("Error! saHpiEventLogClear: line=%d; err=%d\n", __LINE__, err); return -1; } /************************************************************ * TestCase - Mapped Chassis Event (EN_CUTOFF_HI_FAULT_3_35V) ************************************************************/ logstr = "Severity:INFO Source:SERVPROC Name:WMN08032480 Date:10/11/03 Time:09:09:46 Text:System shutoff due to +3.3v over voltage."; memset(&logentry, 0 , sizeof(SaHpiEventLogEntryT)); strcpy(hash_value->value.string, logstr); g_hash_table_insert(sim_hash, hash_key, hash_value); err = saHpiEventLogEntryGet(sessionid, rid_eventlog, SAHPI_NEWEST_ENTRY, &prev_logid, &next_logid, &logentry, &rdr, &rpt); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } /* Check expected values */ if (!((logentry.Event.Source == rid_eventlog) && (logentry.Event.EventType == SAHPI_ET_SENSOR) && (logentry.Event.Severity == SAHPI_CRITICAL) && (logentry.Event.EventDataUnion.SensorEvent.SensorType == SAHPI_VOLTAGE) && (logentry.Event.EventDataUnion.SensorEvent.Assertion == SAHPI_TRUE) && (logentry.Event.EventDataUnion.SensorEvent.EventState & SAHPI_ES_UPPER_CRIT) && (!(logentry.Event.EventDataUnion.SensorEvent.EventState & SAHPI_ES_UPPER_MAJOR)) && (!(logentry.Event.EventDataUnion.SensorEvent.EventState & SAHPI_ES_UPPER_MINOR) && (logentry.Event.EventDataUnion.SensorEvent.PreviousState == SAHPI_ES_UNSPECIFIED)) && (logentry.Event.EventDataUnion.SensorEvent.CurrentState == SAHPI_ES_UNSPECIFIED) && (logentry.Event.EventDataUnion.SensorEvent.TriggerReading.Value.SensorFloat64 == (double)0) && (logentry.Event.EventDataUnion.SensorEvent.TriggerThreshold.Value.SensorFloat64 == (double)0) )) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); oh_print_event(&(logentry.Event), (rdr.RdrType != SAHPI_NO_RECORD) ? &rdr.Entity : NULL, 1); return -1; } err = saHpiEventLogClear(sessionid, rid_eventlog); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } COMMON_TESTS: /************************************ * Drive some error paths in the code ************************************/ /****************************************************************** * TestCase - Bogus threshold strings ******************************************************************/ logstr = "Severity:INFO Source:SERVPROC Name:WMN315702424 Date:10/11/03 Time:09:09:46 Text:System shutoff due to +3.3v over voltage. Bogus Read value 3.5 Bogus Threshold value 3.4"; memset(&logentry, 0 , sizeof(SaHpiEventLogEntryT)); strcpy(hash_value->value.string, logstr); g_hash_table_insert(sim_hash, hash_key, hash_value); err = saHpiEventLogEntryGet(sessionid, rid_eventlog, SAHPI_NEWEST_ENTRY, &prev_logid, &next_logid, &logentry, &rdr, &rpt); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } /* Check expected values */ if (!((!(logentry.Event.Source == rid_eventlog)) && (logentry.Event.EventType == SAHPI_ET_OEM) && (logentry.Event.Severity == SAHPI_INFORMATIONAL))) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); oh_print_event(&(logentry.Event), (rdr.RdrType != SAHPI_NO_RECORD) ? &rdr.Entity : NULL, 1); return -1; } err = saHpiEventLogClear(sessionid, rid_eventlog); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } /****************************************************************** * TestCase - Recovery string not first character of text string * (blank is first character). Should not treat as a recovery event ******************************************************************/ logstr = "Severity:INFO Source:SERVPROC Name:WMN315702424 Date:10/11/03 Time:09:09:46 Text: Recovery System shutoff due to +3.3v over voltage. Read value 3.5 Threshold value 3.4"; memset(&logentry, 0 , sizeof(SaHpiEventLogEntryT)); strcpy(hash_value->value.string, logstr); g_hash_table_insert(sim_hash, hash_key, hash_value); err = saHpiEventLogEntryGet(sessionid, rid_eventlog, SAHPI_NEWEST_ENTRY, &prev_logid, &next_logid, &logentry, &rdr, &rpt); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } /* Check expected values */ if (!((!(logentry.Event.Source == rid_eventlog)) && (logentry.Event.EventType == SAHPI_ET_OEM) && (logentry.Event.Severity == SAHPI_INFORMATIONAL))) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); oh_print_event(&(logentry.Event), (rdr.RdrType != SAHPI_NO_RECORD) ? &rdr.Entity : NULL, 1); return -1; } err = saHpiEventLogClear(sessionid, rid_eventlog); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } /****************************************************************** * TestCase - In string table but not mapped * Uses special defined Test event in bc_str2event.c ******************************************************************/ logstr = "Severity:INFO Source:SERVPROC Name:WMN315702424 Date:10/11/03 Time:09:09:46 Text:Bogus Test Event."; memset(&logentry, 0 , sizeof(SaHpiEventLogEntryT)); strcpy(hash_value->value.string, logstr); g_hash_table_insert(sim_hash, hash_key, hash_value); err = saHpiEventLogEntryGet(sessionid, rid_eventlog, SAHPI_NEWEST_ENTRY, &prev_logid, &next_logid, &logentry, &rdr, &rpt); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } /* Check expected values */ if (!((!(logentry.Event.Source == rid_eventlog)) && (logentry.Event.EventType == SAHPI_ET_OEM) && (logentry.Event.Severity == SAHPI_INFORMATIONAL))) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); oh_print_event(&(logentry.Event), (rdr.RdrType != SAHPI_NO_RECORD) ? &rdr.Entity : NULL, 1); return -1; } err = saHpiEventLogClear(sessionid, rid_eventlog); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } /****************** * End of testcases ******************/ err = saHpiSessionClose(sessionid); if (err) { printf("Error! saHpiSessionClose: err=%d\n", err); return -1; } return 0; } openhpi-2.14.1/plugins/snmp_bc/t/tsensorget041.c0000644000076400007640000000566111302566763016345 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * Peter D Phan */ #include #include #include int main(int argc, char **argv) { /* ************************ * Local variables * ***********************/ int testfail = 0; SaErrorT err; SaErrorT expected_err; SaHpiRptEntryT rptentry; SaHpiRdrT rdr; SaHpiResourceIdT id; SaHpiSessionIdT sessionid; SaHpiSensorNumT sid = 0; SaHpiEventStateT assertMask; SaHpiEventStateT deassertMask; SaHpiEntryIdT entryid; SaHpiEntryIdT nextentryid; SaHpiBoolT foundSensor; /* ************************************* * Find a resource with Sensor type rdr * ************************************* */ err = tsetup(&sessionid); if (err != SA_OK) { printf("Error! Can not open session for test environment\n"); printf(" File=%s, Line=%d\n", __FILE__, __LINE__); return -1; } err = tfind_resource(&sessionid,SAHPI_CAPABILITY_SENSOR,SAHPI_FIRST_ENTRY, &rptentry, SAHPI_TRUE); if (err != SA_OK) { printf("Error! Can not find resources for test environment\n"); printf(" File=%s, Line=%d\n", __FILE__, __LINE__); err = tcleanup(&sessionid); return SA_OK; } id = rptentry.ResourceId; /************************** * Test: find a sensor with desired property **************************/ entryid = SAHPI_FIRST_ENTRY; foundSensor = SAHPI_FALSE; do { err = saHpiRdrGet(sessionid,id,entryid,&nextentryid, &rdr); if (err == SA_OK) { if ((rdr.RdrType == SAHPI_SENSOR_RDR) && (rdr.RdrTypeUnion.SensorRec.DataFormat.IsSupported == SAHPI_FALSE)) { foundSensor = SAHPI_TRUE; break; } entryid = nextentryid; } } while ((err == SA_OK) && (entryid != SAHPI_LAST_ENTRY)) ; if (!foundSensor) { err("Did not find desired resource for test\n"); return(SA_OK); } else { sid = rdr.RdrTypeUnion.SensorRec.Num; } /************************** * Test: Invalid sensor id **************************/ expected_err = SA_ERR_HPI_NOT_PRESENT; err = saHpiSensorEventMasksGet(sessionid, id, 5000, &assertMask, &deassertMask); checkstatus(err, expected_err, testfail); /************************** * Test: Normal path **************************/ expected_err = SA_OK; err = saHpiSensorEventMasksGet(sessionid, id, sid, &assertMask, &deassertMask); checkstatus(err, expected_err, testfail); /*************************** * Cleanup after all tests ***************************/ err = tcleanup(&sessionid); return testfail; } #include openhpi-2.14.1/plugins/snmp_bc/t/tsptime001.c0000644000076400007640000000273511302566763015630 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * Peter D Phan */ #include #include #include int main(int argc, char **argv) { /* ************************ * Local variables * ***********************/ int testfail = 0; SaErrorT err; SaErrorT expected_err; struct tm time; struct oh_handler_state l_handle; memset(&time, 0, sizeof(struct tm)); memset(&l_handle, 0, sizeof(struct oh_handler_state)); /************************** * Test : Invalid handle **************************/ expected_err = SA_ERR_HPI_INVALID_PARAMS; err = snmp_bc_get_sp_time(NULL, &time); checkstatus(err, expected_err, testfail); /************************** * Test : Invalid pointer to time struct **************************/ expected_err = SA_ERR_HPI_INVALID_PARAMS; err = snmp_bc_get_sp_time(&l_handle, NULL); checkstatus(err, expected_err, testfail); /************************** * Cleanup after all tests ***************************/ return testfail; } #include openhpi-2.14.1/plugins/snmp_bc/t/tsensorset012.c0000644000076400007640000000572711302566764016363 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * Peter D Phan */ #include #include #include #define SAHPI_SENS_NONSENSE_ACTION (SaHpiSensorEventMaskActionT) 0xF0 int main(int argc, char **argv) { /* ************************ * Local variables * ***********************/ int testfail = 0; SaErrorT err; SaErrorT expected_err; SaHpiRptEntryT rptentry; SaHpiRdrT rdr; SaHpiResourceIdT id; SaHpiSessionIdT sessionid; SaHpiEntryIdT entryid; SaHpiEntryIdT nextentryid; SaHpiBoolT foundSensor; SaHpiSensorNumT sid = 1; SaHpiEventStateT assertMask = SAHPI_ES_UPPER_MINOR; SaHpiEventStateT deassertMask = SAHPI_ES_UPPER_CRIT; SaHpiSensorEventMaskActionT act = SAHPI_SENS_NONSENSE_ACTION; /* ************************************* * Find a resource with Sensor type rdr * ************************************* */ err = tsetup(&sessionid); if (err != SA_OK) { printf("Error! Can not open session for test environment\n"); printf(" File=%s, Line=%d\n", __FILE__, __LINE__); return -1; } err = tfind_resource(&sessionid,SAHPI_CAPABILITY_SENSOR,SAHPI_FIRST_ENTRY, &rptentry, SAHPI_TRUE); if (err != SA_OK) { printf("Error! Can not find resources for test environment\n"); printf(" File=%s, Line=%d\n", __FILE__, __LINE__); err = tcleanup(&sessionid); return SA_OK; } id = rptentry.ResourceId; /************************** * Test: find a sensor with desired property **************************/ entryid = SAHPI_FIRST_ENTRY; foundSensor = SAHPI_FALSE; do { err = saHpiRdrGet(sessionid,id,entryid,&nextentryid, &rdr); if (err == SA_OK) { if ((rdr.RdrType == SAHPI_SENSOR_RDR) && (rdr.RdrTypeUnion.SensorRec.EventCtrl == SAHPI_SEC_PER_EVENT)) { foundSensor = SAHPI_TRUE; break; } entryid = nextentryid; } } while ((err == SA_OK) && (entryid != SAHPI_LAST_ENTRY)) ; if (!foundSensor) { err("Did not find desired resource for test\n"); return(SA_OK); } else { sid = rdr.RdrTypeUnion.SensorRec.Num; } /************************** * Test : Invalid data **************************/ act = SAHPI_SENS_NONSENSE_ACTION; expected_err = SA_ERR_HPI_INVALID_DATA; err = saHpiSensorEventMasksSet(sessionid, id, sid, act, assertMask, deassertMask); checkstatus(err, expected_err, testfail); /*************************** * Cleanup after all tests ***************************/ err = tcleanup(&sessionid); return testfail; } #include openhpi-2.14.1/plugins/snmp_bc/t/tel004.c0000644000076400007640000000347211302566764014732 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * Peter D Phan */ #include #include #include int main(int argc, char **argv) { /* ************************ * Local variables * ***********************/ int testfail = 0; SaErrorT err; SaErrorT expected_err; SaHpiRptEntryT rptentry; SaHpiResourceIdT id = 0; SaHpiSessionIdT sessionid; /* ************************************* * Find a resource with EventLog type rdr * ************************************* */ err = tsetup(&sessionid); if (err != SA_OK) { printf("Error! Can not open session for test environment\n"); printf(" File=%s, Line=%d\n", __FILE__, __LINE__); return -1; } err = tfind_resource(&sessionid, SAHPI_CAPABILITY_EVENT_LOG, SAHPI_FIRST_ENTRY, &rptentry, SAHPI_TRUE); if (err != SA_OK) { printf("Can not find a control resource for test environment\n"); printf(" File=%s, Line=%d\n", __FILE__, __LINE__); err = tcleanup(&sessionid); return SA_OK; } id = rptentry.ResourceId; /************************** * Test: valid case **************************/ expected_err = SA_OK; err = saHpiEventLogClear(sessionid, id); checkstatus(err, expected_err, testfail); /*************************** * Cleanup after all tests ***************************/ err = tcleanup(&sessionid); return testfail; } #include openhpi-2.14.1/plugins/snmp_bc/t/tsensorget013.c0000644000076400007640000000630011302566764016334 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * Peter D Phan */ #include #include #include int main(int argc, char **argv) { /* ************************ * Local variables * ***********************/ int testfail = 0; SaErrorT err; SaErrorT expected_err; SaHpiResourceIdT id; SaHpiSessionIdT sessionid; SaHpiRptEntryT rptentry; SaHpiRdrT rdr; SaHpiSensorNumT dd_sid = 0; SaHpiEventStateT state; SaHpiSensorReadingT reading; SaHpiEntryIdT entryid; SaHpiEntryIdT nextentryid; SaHpiBoolT foundSensor; /* ************************************* * Find a resource with Sensor type rdr * ************************************* */ err = tsetup(&sessionid); if (err != SA_OK) { printf("Error! Can not open session for test environment\n"); printf(" File=%s, Line=%d\n", __FILE__, __LINE__); return -1; } err = tfind_resource(&sessionid,SAHPI_CAPABILITY_SENSOR,SAHPI_FIRST_ENTRY, &rptentry, SAHPI_TRUE); if (err != SA_OK) { printf("Error! Can not find resources for test environment\n"); printf(" File=%s, Line=%d\n", __FILE__, __LINE__); err = tcleanup(&sessionid); return -1; } id = rptentry.ResourceId; /************************** * Test: find a sensor with desired property **************************/ entryid = SAHPI_FIRST_ENTRY; foundSensor = SAHPI_FALSE; do { err = saHpiRdrGet(sessionid,id,entryid,&nextentryid, &rdr); if (err == SA_OK) { if ((rdr.RdrType == SAHPI_SENSOR_RDR) && (rdr.RdrTypeUnion.SensorRec.DataFormat.IsSupported == SAHPI_TRUE)) { foundSensor = SAHPI_TRUE; break; } entryid = nextentryid; } } while ((err == SA_OK) && (entryid != SAHPI_LAST_ENTRY)) ; if (!foundSensor) { err("Did not find desired resource for test\n"); return(SA_OK); } else { dd_sid = rdr.RdrTypeUnion.SensorRec.Num; } /************************** * Test : Read sensor with NULL Reading area. State only **************************/ expected_err = SA_OK; err = saHpiSensorReadingGet(sessionid, id, dd_sid, NULL, &state); checkstatus(err, expected_err, testfail); /************************** * Test:Read with NULL State area, Read Value only **************************/ err = saHpiSensorReadingGet(sessionid, id, dd_sid, &reading, NULL); checkstatus(err, expected_err, testfail); /************************** * Test: Both Reading and State are NULL. ie checking for sensor existance **************************/ err = saHpiSensorReadingGet(sessionid, id, dd_sid, NULL, NULL); checkstatus(err, expected_err, testfail); /*************************** * Cleanup after all tests ***************************/ err = tcleanup(&sessionid); return testfail; } #include openhpi-2.14.1/plugins/snmp_bc/snmp_bc_annunciator.c0000644000076400007640000003155111302566770017475 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004, 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * Steve Sherman */ #include /** * snmp_bc_get_next_announce: * @hnd: Handler data pointer. * @rid: Resource ID. * @aid: Annunciator ID. * @sev: Severity. * @unackonly: Boolean to get unacknowledged annunicators only. * * Gets the next annunicator. * * Return values: * SA_OK - Normal case. * SA_ERR_HPI_CAPABILITY - Resource doesn't have SAHPI_CAPABILITY_ANNUNICATOR. * SA_ERR_HPI_INVALID_RESOURCE - Resource doesn't exist. * SA_ERR_HPI_INVALID_PARAMS - Pointer parameter(s) are NULL @sev invalid. **/ SaErrorT snmp_bc_get_next_announce(void *hnd, SaHpiResourceIdT rid, SaHpiAnnunciatorNumT aid, SaHpiSeverityT sev, SaHpiBoolT unackonly, SaHpiAnnouncementT *announcement) { struct oh_handler_state *handle; struct snmp_bc_hnd *custom_handle; SaHpiRptEntryT *rpt; if (!hnd || !announcement || oh_lookup_severity(sev) == NULL) { err("Invalid parameter."); return SA_ERR_HPI_INVALID_PARAMS; } handle = (struct oh_handler_state *)hnd; custom_handle = (struct snmp_bc_hnd *)handle->data; if (!custom_handle) { err("Invalid parameter."); return(SA_ERR_HPI_INVALID_PARAMS); } snmp_bc_lock_handler(custom_handle); /* Check if resource exists and has managed hotswap capabilities */ rpt = oh_get_resource_by_id(handle->rptcache, rid); if (!rpt) { snmp_bc_unlock_handler(custom_handle); return(SA_ERR_HPI_INVALID_RESOURCE); } if (!(rpt->ResourceCapabilities & SAHPI_CAPABILITY_ANNUNCIATOR)) { snmp_bc_unlock_handler(custom_handle); return(SA_ERR_HPI_CAPABILITY); } err("Annunciators not supported by platform"); snmp_bc_unlock_handler(custom_handle); return(SA_ERR_HPI_INTERNAL_ERROR); } /** * snmp_bc_get_announce: * @hnd: Handler data pointer. * @rid: Resource ID. * @aid: Annunciator ID. * @entry: Annunicator's announcement ID. * @announcment: Location to store annunicator's announcement. * * Gets the annunicator's announcement information. * * Return values: * SA_OK - Normal case. * SA_ERR_HPI_CAPABILITY - Resource doesn't have SAHPI_CAPABILITY_ANNUNICATOR. * SA_ERR_HPI_INVALID_RESOURCE - Resource doesn't exist. * SA_ERR_HPI_INVALID_PARAMS - Pointer parameter(s) are NULL. **/ SaErrorT snmp_bc_get_announce(void *hnd, SaHpiResourceIdT rid, SaHpiAnnunciatorNumT aid, SaHpiEntryIdT entry, SaHpiAnnouncementT *announcement) { struct oh_handler_state *handle; struct snmp_bc_hnd *custom_handle; SaHpiRptEntryT *rpt; if (!hnd || !announcement) { err("Invalid parameter."); return SA_ERR_HPI_INVALID_PARAMS; } handle = (struct oh_handler_state *)hnd; custom_handle = (struct snmp_bc_hnd *)handle->data; if (!custom_handle) { err("Invalid parameter."); return(SA_ERR_HPI_INVALID_PARAMS); } snmp_bc_lock_handler(custom_handle); /* Check if resource exists and has managed hotswap capabilities */ rpt = oh_get_resource_by_id(handle->rptcache, rid); if (!rpt) { snmp_bc_unlock_handler(custom_handle); return(SA_ERR_HPI_INVALID_RESOURCE); } if (!(rpt->ResourceCapabilities & SAHPI_CAPABILITY_ANNUNCIATOR)) { snmp_bc_unlock_handler(custom_handle); return(SA_ERR_HPI_CAPABILITY); } err("Annunciators not supported by platform"); snmp_bc_unlock_handler(custom_handle); return(SA_ERR_HPI_INTERNAL_ERROR); } /** * snmp_bc_ack_announce: * @hnd: Handler data pointer. * @rid: Resource ID. * @aid: Annunciator ID. * @entry: Annunicator's announcement ID. * @sev: Severity. * * Acknowledge an annunicator's announcement(s). * * Return values: * SA_OK - Normal case. * SA_ERR_HPI_CAPABILITY - Resource doesn't have SAHPI_CAPABILITY_ANNUNICATOR. * SA_ERR_HPI_INVALID_RESOURCE - Resource doesn't exist. * SA_ERR_HPI_INVALID_PARAMS - Pointer parameter(s) are NULL; @sev invalid. **/ SaErrorT snmp_bc_ack_announce(void *hnd, SaHpiResourceIdT rid, SaHpiAnnunciatorNumT aid, SaHpiEntryIdT entry, SaHpiSeverityT sev) { struct oh_handler_state *handle; struct snmp_bc_hnd *custom_handle; SaHpiRptEntryT *rpt; if (!hnd || oh_lookup_severity(sev) == NULL) { err("Invalid parameter."); return SA_ERR_HPI_INVALID_PARAMS; } handle = (struct oh_handler_state *)hnd; custom_handle = (struct snmp_bc_hnd *)handle->data; if (!custom_handle) { err("Invalid parameter."); return(SA_ERR_HPI_INVALID_PARAMS); } snmp_bc_lock_handler(custom_handle); /* Check if resource exists and has managed hotswap capabilities */ rpt = oh_get_resource_by_id(handle->rptcache, rid); if (!rpt) { snmp_bc_unlock_handler(custom_handle); return(SA_ERR_HPI_INVALID_RESOURCE); } if (!(rpt->ResourceCapabilities & SAHPI_CAPABILITY_ANNUNCIATOR)) { snmp_bc_unlock_handler(custom_handle); return(SA_ERR_HPI_CAPABILITY); } err("Annunciators not supported by platform"); snmp_bc_unlock_handler(custom_handle); return(SA_ERR_HPI_INTERNAL_ERROR); } /** * snmp_bc_add_announce: * @hnd: Handler data pointer. * @rid: Resource ID. * @aid: Annunciator ID. * @announcement: Pointer to annunicator's announcement data. * * Add an announcement to an annunicator. * * Return values: * SA_OK - Normal case. * SA_ERR_HPI_CAPABILITY - Resource doesn't have SAHPI_CAPABILITY_ANNUNICATOR. * SA_ERR_HPI_INVALID_RESOURCE - Resource doesn't exist. * SA_ERR_HPI_INVALID_PARAMS - Pointer parameter(s) are NULL. **/ SaErrorT snmp_bc_add_announce(void *hnd, SaHpiResourceIdT rid, SaHpiAnnunciatorNumT aid, SaHpiAnnouncementT *announcement) { struct oh_handler_state *handle; struct snmp_bc_hnd *custom_handle; SaHpiRptEntryT *rpt; if (!hnd || !announcement) { err("Invalid parameter."); return SA_ERR_HPI_INVALID_PARAMS; } handle = (struct oh_handler_state *)hnd; custom_handle = (struct snmp_bc_hnd *)handle->data; if (!custom_handle) { err("Invalid parameter."); return(SA_ERR_HPI_INVALID_PARAMS); } snmp_bc_lock_handler(custom_handle); /* Check if resource exists and has managed hotswap capabilities */ rpt = oh_get_resource_by_id(handle->rptcache, rid); if (!rpt) { snmp_bc_unlock_handler(custom_handle); return(SA_ERR_HPI_INVALID_RESOURCE); } if (!(rpt->ResourceCapabilities & SAHPI_CAPABILITY_ANNUNCIATOR)) { snmp_bc_unlock_handler(custom_handle); return(SA_ERR_HPI_CAPABILITY); } err("Annunciators not supported by platform"); snmp_bc_unlock_handler(custom_handle); return(SA_ERR_HPI_INTERNAL_ERROR); } /** * snmp_bc_del_announce: * @hnd: Handler data pointer. * @rid: Resource ID. * @aid: Annunciator ID. * @entry: Annunicator's announcement ID. * @sev: Severity. * * Delete announcement(s) from an annunicator. * * Return values: * SA_OK - Normal case. * SA_ERR_HPI_CAPABILITY - Resource doesn't have SAHPI_CAPABILITY_ANNUNICATOR. * SA_ERR_HPI_INVALID_RESOURCE - Resource doesn't exist. * SA_ERR_HPI_INVALID_PARAMS - Pointer parameter(s) are NULL; @sev invalid. **/ SaErrorT snmp_bc_del_announce(void *hnd, SaHpiResourceIdT rid, SaHpiAnnunciatorNumT aid, SaHpiEntryIdT entry, SaHpiSeverityT sev) { struct oh_handler_state *handle; struct snmp_bc_hnd *custom_handle; SaHpiRptEntryT *rpt; if (!hnd || oh_lookup_severity(sev) == NULL) { err("Invalid parameter."); return SA_ERR_HPI_INVALID_PARAMS; } handle = (struct oh_handler_state *)hnd; custom_handle = (struct snmp_bc_hnd *)handle->data; if (!custom_handle) { err("Invalid parameter."); return(SA_ERR_HPI_INVALID_PARAMS); } snmp_bc_lock_handler(custom_handle); /* Check if resource exists and has managed hotswap capabilities */ rpt = oh_get_resource_by_id(handle->rptcache, rid); if (!rpt) { snmp_bc_unlock_handler(custom_handle); return(SA_ERR_HPI_INVALID_RESOURCE); } if (!(rpt->ResourceCapabilities & SAHPI_CAPABILITY_ANNUNCIATOR)) { snmp_bc_unlock_handler(custom_handle); return(SA_ERR_HPI_CAPABILITY); } err("Annunciators not supported by platform"); snmp_bc_unlock_handler(custom_handle); return(SA_ERR_HPI_INTERNAL_ERROR); } /** * snmp_bc_get_annunc_mode: * @hnd: Handler data pointer. * @rid: Resource ID. * @aid: Annunciator ID. * @mode: Location to store mode information. * * Gets an annunciator's current operating mode. * * Return values: * SA_OK - Normal case. * SA_ERR_HPI_CAPABILITY - Resource doesn't have SAHPI_CAPABILITY_ANNUNICATOR. * SA_ERR_HPI_INVALID_RESOURCE - Resource doesn't exist. * SA_ERR_HPI_INVALID_PARAMS - Pointer parameter(s) are NULL. **/ SaErrorT snmp_bc_get_annunc_mode(void *hnd, SaHpiResourceIdT rid, SaHpiAnnunciatorNumT aid, SaHpiAnnunciatorModeT *mode) { struct oh_handler_state *handle; struct snmp_bc_hnd *custom_handle; SaHpiRptEntryT *rpt; if (!hnd || !mode) { err("Invalid parameter."); return SA_ERR_HPI_INVALID_PARAMS; } handle = (struct oh_handler_state *)hnd; custom_handle = (struct snmp_bc_hnd *)handle->data; if (!custom_handle) { err("Invalid parameter."); return(SA_ERR_HPI_INVALID_PARAMS); } snmp_bc_lock_handler(custom_handle); /* Check if resource exists and has managed hotswap capabilities */ rpt = oh_get_resource_by_id(handle->rptcache, rid); if (!rpt) { snmp_bc_unlock_handler(custom_handle); return(SA_ERR_HPI_INVALID_RESOURCE); } if (!(rpt->ResourceCapabilities & SAHPI_CAPABILITY_ANNUNCIATOR)) { snmp_bc_unlock_handler(custom_handle); return(SA_ERR_HPI_CAPABILITY); } err("Annunciators not supported by platform"); snmp_bc_unlock_handler(custom_handle); return(SA_ERR_HPI_INTERNAL_ERROR); } /** * snmp_bc_get_annunc_mode: * @hnd: Handler data pointer. * @rid: Resource ID. * @aid: Annunciator ID. * @mode: Anninciator mode to set. * * Sets an annunciator's current operating mode. * * Return values: * SA_OK - Normal case. * SA_ERR_HPI_CAPABILITY - Resource doesn't have SAHPI_CAPABILITY_ANNUNICATOR. * SA_ERR_HPI_INVALID_RESOURCE - Resource doesn't exist. * SA_ERR_HPI_INVALID_PARAMS - Pointer parameter(s) are NULL; @mode invalid. **/ SaErrorT snmp_bc_set_annunc_mode(void *hnd, SaHpiResourceIdT rid, SaHpiAnnunciatorNumT aid, SaHpiAnnunciatorModeT mode) { struct oh_handler_state *handle; struct snmp_bc_hnd *custom_handle; SaHpiRptEntryT *rpt; if (!hnd || oh_lookup_annunciatormode(mode) == NULL) { err("Invalid parameter."); return SA_ERR_HPI_INVALID_PARAMS; } handle = (struct oh_handler_state *)hnd; custom_handle = (struct snmp_bc_hnd *)handle->data; if (!custom_handle) { err("Invalid parameter."); return(SA_ERR_HPI_INVALID_PARAMS); } snmp_bc_lock_handler(custom_handle); /* Check if resource exists and has managed hotswap capabilities */ rpt = oh_get_resource_by_id(handle->rptcache, rid); if (!rpt) { snmp_bc_unlock_handler(custom_handle); return(SA_ERR_HPI_INVALID_RESOURCE); } if (!(rpt->ResourceCapabilities & SAHPI_CAPABILITY_ANNUNCIATOR)) { snmp_bc_unlock_handler(custom_handle); return(SA_ERR_HPI_CAPABILITY); } err("Annunciators not supported by platform"); snmp_bc_unlock_handler(custom_handle); return(SA_ERR_HPI_INTERNAL_ERROR); } void * oh_get_next_announce (void *, SaHpiResourceIdT, SaHpiAnnunciatorNumT, SaHpiSeverityT, SaHpiBoolT, SaHpiAnnouncementT) __attribute__ ((weak, alias("snmp_bc_get_next_announce"))); void * oh_get_announce (void *, SaHpiResourceIdT, SaHpiAnnunciatorNumT, SaHpiEntryIdT, SaHpiAnnouncementT *) __attribute__ ((weak, alias("snmp_bc_get_announce"))); void * oh_ack_announce (void *, SaHpiResourceIdT, SaHpiAnnunciatorNumT, SaHpiEntryIdT, SaHpiSeverityT) __attribute__ ((weak, alias("snmp_bc_ack_announce"))); void * oh_add_announce (void *, SaHpiResourceIdT, SaHpiAnnunciatorNumT, SaHpiAnnouncementT *) __attribute__ ((weak, alias("snmp_bc_add_announce"))); void * oh_del_announce (void *, SaHpiResourceIdT, SaHpiAnnunciatorNumT, SaHpiEntryIdT, SaHpiSeverityT) __attribute__ ((weak, alias("snmp_bc_del_announce"))); void * oh_get_annunc_mode (void *, SaHpiResourceIdT, SaHpiAnnunciatorNumT, SaHpiAnnunciatorModeT *) __attribute__ ((weak, alias("snmp_bc_get_annunc_mode"))); void * oh_set_annunc_mode (void *, SaHpiResourceIdT, SaHpiAnnunciatorNumT, SaHpiAnnunciatorModeT) __attribute__ ((weak, alias("snmp_bc_set_annunc_mode"))); openhpi-2.14.1/plugins/snmp_bc/snmp_bc_discover_bc.h0000644000076400007640000002005411302566770017437 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004, 2006 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. */ #ifndef __SNMP_BC_DISCOVER_BC_H #define __SNMP_BC_DISCOVER_BC_H #define SNMP_BC_IPMI_STRING_DELIMITER "=" #define SNMP_BC_MAX_IPMI_TEMP_SENSORS 6 #define SNMP_BC_MAX_IPMI_VOLTAGE_SENSORS 30 #define SNMP_BC_IPMI_TEMP_BLADE_OID ".1.3.6.1.4.1.2.3.51.2.22.1.5.3.1.11.x" #define SNMP_BC_IPMI_VOLTAGE_BLADE_OID ".1.3.6.1.4.1.2.3.51.2.22.1.5.5.1.14.x" #define SNMP_BC_RESOURCE_INSTALLED 1 #define SNMP_BC_RESOURCE_REMOVED 2 #define get_installed_mask(maskOID, getvalue) \ do { \ err = snmp_bc_snmp_get(custom_handle, maskOID, &getvalue, SAHPI_TRUE); \ if (err || getvalue.type != ASN_OCTET_STR) { \ dbg("Cannot get OID=%s; Received Type=%d; Error=%s.", \ maskOID, getvalue.type, oh_lookup_error(err)); \ if (err != SA_ERR_HPI_NOT_PRESENT) { return(err); } \ else if (err == SA_ERR_HPI_NOT_PRESENT) {getvalue.type = ASN_OCTET_STR; \ memset(&getvalue.string, '0', SNMP_BC_MAX_RESOURCES_MASK); \ getvalue.string[SNMP_BC_MAX_RESOURCES_MASK -1] = '\0';} \ else { return(SA_ERR_HPI_INTERNAL_ERROR); } \ } else if (getvalue.str_len == 0) {getvalue.type = ASN_OCTET_STR; \ memset(&getvalue.string, '0', SNMP_BC_MAX_RESOURCES_MASK); \ getvalue.string[SNMP_BC_MAX_RESOURCES_MASK -1] = '\0';} \ } while(0) #define get_string_object(maskOID, getvalue) get_installed_mask(maskOID, getvalue) #define get_integer_object(maskOID, getintvalue) \ do { \ err = snmp_bc_snmp_get(custom_handle, maskOID, &getintvalue, SAHPI_TRUE); \ if (err || getintvalue.type != ASN_INTEGER) { \ dbg("Cannot get OID=%s; Received Type=%d; Error=%s.", \ maskOID, getintvalue.type, oh_lookup_error(err)); \ if (err != SA_ERR_HPI_NOT_PRESENT) { return(err); } \ else if (err == SA_ERR_HPI_NOT_PRESENT) {getintvalue.type = ASN_INTEGER; getintvalue.integer = 0;} \ else { return(SA_ERR_HPI_INTERNAL_ERROR); } \ } \ } while(0) #define get_dualmode_object(maskOID, getintvalue) \ do { \ err = snmp_bc_snmp_get(custom_handle, maskOID, &getintvalue, SAHPI_TRUE); \ if (err == SA_ERR_HPI_NOT_PRESENT) {getintvalue.type = ASN_INTEGER; getintvalue.integer = 0;} \ else if (err != SA_OK) { \ dbg("Cannot get OID=%s; Received Type=%d; Error=%s.", \ maskOID, getintvalue.type, oh_lookup_error(err)); \ if (err) { return(err); } \ else { return(SA_ERR_HPI_INTERNAL_ERROR); } \ } else { \ if (getintvalue.type == ASN_OCTET_STR) { \ if (getintvalue.str_len == 0) getintvalue.integer = 0; \ else getintvalue.integer = atoi(getintvalue.string); \ } else if (getintvalue.type == ASN_INTEGER) { \ if (getintvalue.str_len == 0) { getintvalue.integer = 0; \ } else if (getintvalue.integer == 1) getintvalue.integer = 10; \ } \ } \ } while(0) guint snmp_bc_isrediscover(SaHpiEventT *working_event); SaErrorT snmp_bc_construct_blade_rpt(struct oh_event *e, struct ResourceInfo **res_info_ptr, SaHpiEntityPathT *ep_root, guint blade_index); SaErrorT snmp_bc_construct_blower_rpt(struct oh_event* e, struct ResourceInfo **res_info_ptr, SaHpiEntityPathT *ep_root, guint blower_index); SaErrorT snmp_bc_construct_pm_rpt(struct oh_event *e, struct ResourceInfo **res_info_ptr, SaHpiEntityPathT *ep_root, guint pm_index); SaErrorT snmp_bc_construct_sm_rpt(struct oh_event *e, struct ResourceInfo **res_info_ptr, SaHpiEntityPathT *ep_root, guint sm_index, char *interposer_install_mask); SaErrorT snmp_bc_construct_mm_rpt(struct oh_event *e, struct ResourceInfo **res_info_ptr, SaHpiEntityPathT *ep_root, guint mm_index, char *interposer_install_mask); SaErrorT snmp_bc_construct_tap_rpt(struct oh_event *e, struct ResourceInfo **res_info_ptr, SaHpiEntityPathT *ep_root, guint tap_index); SaErrorT snmp_bc_construct_nc_rpt(struct oh_event *e, struct ResourceInfo **res_info_ptr, SaHpiEntityPathT *ep_root, guint nc_index); SaErrorT snmp_bc_construct_mx_rpt(struct oh_event *e, struct ResourceInfo **res_info_ptr, SaHpiEntityPathT *ep_root, guint mx_index); SaErrorT snmp_bc_construct_smi_rpt(struct oh_event *e, struct ResourceInfo **res_info_ptr, SaHpiEntityPathT *ep_root, guint smi_index); SaErrorT snmp_bc_construct_mmi_rpt(struct oh_event *e, struct ResourceInfo **res_info_ptr, SaHpiEntityPathT *ep_root, guint mmi_index); SaErrorT snmp_bc_add_blade_rptcache(struct oh_handler_state *handle, struct oh_event *e, struct ResourceInfo *res_info_ptr, guint blade_index); SaErrorT snmp_bc_add_blower_rptcache(struct oh_handler_state *handle, struct oh_event *e, struct ResourceInfo *res_info_ptr, guint blower_index); SaErrorT snmp_bc_add_pm_rptcache(struct oh_handler_state *handle, struct oh_event *e, struct ResourceInfo *res_info_ptr, guint pm_index); SaErrorT snmp_bc_add_switch_rptcache(struct oh_handler_state *handle, struct oh_event *e, struct ResourceInfo *res_info_ptr, guint switch_index); SaErrorT snmp_bc_add_mm_rptcache(struct oh_handler_state *handle, struct oh_event *e, struct ResourceInfo *res_info_ptr, guint mm_index); SaErrorT snmp_bc_add_tap_rptcache(struct oh_handler_state *handle, struct oh_event *e, struct ResourceInfo *res_info_ptr, guint tap_index); SaErrorT snmp_bc_add_nc_rptcache(struct oh_handler_state *handle, struct oh_event *e, struct ResourceInfo *res_info_ptr, guint nc_index); SaErrorT snmp_bc_add_mx_rptcache(struct oh_handler_state *handle, struct oh_event *e, struct ResourceInfo *res_info_ptr, guint mx_index); SaErrorT snmp_bc_add_smi_rptcache(struct oh_handler_state *handle, struct oh_event *e, struct ResourceInfo *res_info_ptr, guint smi_index); SaErrorT snmp_bc_add_mmi_rptcache(struct oh_handler_state *handle, struct oh_event *e, struct ResourceInfo *res_info_ptr, guint mmi_index); SaErrorT snmp_bc_discover_blade_i(struct oh_handler_state *handle, SaHpiEntityPathT *ep_root, guint blade_index); SaErrorT snmp_bc_discover_blower_i(struct oh_handler_state *handle, SaHpiEntityPathT *ep_root, guint blower_index); SaErrorT snmp_bc_discover_pm_i(struct oh_handler_state *handle, SaHpiEntityPathT *ep_root, guint pm_index); SaErrorT snmp_bc_discover_switch_i(struct oh_handler_state *handle, SaHpiEntityPathT *ep_root, guint sm_index); SaErrorT snmp_bc_discover_mm_i(struct oh_handler_state *handle, SaHpiEntityPathT *ep_root, guint mm_index); SaErrorT snmp_bc_discover_tap_i(struct oh_handler_state *handle, SaHpiEntityPathT *ep_root, guint tap_index); SaErrorT snmp_bc_discover_nc_i(struct oh_handler_state *handle, SaHpiEntityPathT *ep_root, guint nc_index); SaErrorT snmp_bc_discover_mx_i(struct oh_handler_state *handle, SaHpiEntityPathT *ep_root, guint mx_index); SaErrorT snmp_bc_discover_mmi_i(struct oh_handler_state *handle, SaHpiEntityPathT *ep_root, guint mmi_index); SaErrorT snmp_bc_discover_smi_i(struct oh_handler_state *handle, SaHpiEntityPathT *ep_root, guint smi_index); SaErrorT snmp_bc_fetch_MT_install_mask(struct oh_handler_state *handle, struct snmp_value *getintvalue); #endif openhpi-2.14.1/plugins/snmp_bc/snmp_bc_reset.h0000644000076400007640000000134111302566770016275 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * Steve Sherman */ #ifndef __SNMP_BC_RESET_H #define __SNMP_BC_RESET_H SaErrorT snmp_bc_get_reset_state(void *hnd, SaHpiResourceIdT rid, SaHpiResetActionT *act); SaErrorT snmp_bc_set_reset_state(void *hnd, SaHpiResourceIdT rid, SaHpiResetActionT act); #endif openhpi-2.14.1/plugins/snmp_bc/snmp_bc_hotswap.c0000644000076400007640000003306511302566770016643 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004, 2006 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * Steve Sherman */ #include /** * snmp_bc_get_hotswap_state: * @hnd: Handler data pointer. * @rid: Resource ID. * @state: Location to store resource's hotswap state. * * Retrieves a managed hotswap resource's state. * * Return values: * SA_OK - Normal case. * SA_ERR_HPI_CAPABILITY - Resource doesn't have SAHPI_CAPABILITY_MANAGED_HOTSWAP. * SA_ERR_HPI_INVALID_RESOURCE - Resource doesn't exist. * SA_ERR_HPI_INVALID_PARAMS - Pointer parameter(s) are NULL. **/ SaErrorT snmp_bc_get_hotswap_state(void *hnd, SaHpiResourceIdT rid, SaHpiHsStateT *state) { struct oh_handler_state *handle; struct snmp_bc_hnd *custom_handle; struct ResourceInfo *resinfo; SaHpiRptEntryT *rpt; if (!hnd || !state) { err("Invalid parameter."); return SA_ERR_HPI_INVALID_PARAMS; } handle = (struct oh_handler_state *)hnd; custom_handle = (struct snmp_bc_hnd *)handle->data; if (!custom_handle) { err("Invalid parameter."); return(SA_ERR_HPI_INVALID_PARAMS); } snmp_bc_lock_handler(custom_handle); /* Check if resource exists and has managed hotswap capabilities */ rpt = oh_get_resource_by_id(handle->rptcache, rid); if (!rpt) { snmp_bc_unlock_handler(custom_handle); return(SA_ERR_HPI_INVALID_RESOURCE); } if (!(rpt->ResourceCapabilities & SAHPI_CAPABILITY_MANAGED_HOTSWAP)) { snmp_bc_unlock_handler(custom_handle); return(SA_ERR_HPI_CAPABILITY); } resinfo = (struct ResourceInfo *)oh_get_resource_data(handle->rptcache, rid); if (!resinfo) { err("No resource data for %s", rpt->ResourceTag.Data); snmp_bc_unlock_handler(custom_handle); return(SA_ERR_HPI_INTERNAL_ERROR); } /* Set current hot swap state */ *state = resinfo->cur_state; snmp_bc_unlock_handler(custom_handle); return(SA_OK); } /** * snmp_bc_set_hotswap_state: * @hnd: Handler data pointer. * @rid: Resource ID. * @state: Hotswap state to set. * * Sets a managed hotswap resource's state. * * Return values: * SA_OK - Normal case. * SA_ERR_HPI_CAPABILITY - Resource doesn't have SAHPI_CAPABILITY_MANAGED_HOTSWAP. * SA_ERR_HPI_INVALID_REQUEST - @state invalid. * SA_ERR_HPI_INVALID_RESOURCE - Resource doesn't exist. * SA_ERR_HPI_INVALID_PARAMS - Pointer parameter(s) are NULL. **/ SaErrorT snmp_bc_set_hotswap_state(void *hnd, SaHpiResourceIdT rid, SaHpiHsStateT state) { struct oh_handler_state *handle; struct snmp_bc_hnd *custom_handle; struct ResourceInfo *resinfo; SaHpiRptEntryT *rpt; if (!hnd) { err("Invalid parameter."); return(SA_ERR_HPI_INVALID_PARAMS); } if (NULL == oh_lookup_hsstate(state)) { err("Invalid hotswap state."); return(SA_ERR_HPI_INVALID_REQUEST); } handle = (struct oh_handler_state *)hnd; custom_handle = (struct snmp_bc_hnd *)handle->data; if (!custom_handle) { err("Invalid parameter."); return(SA_ERR_HPI_INVALID_PARAMS); } snmp_bc_lock_handler(custom_handle); /* Check if resource exists and has managed hotswap capabilities */ rpt = oh_get_resource_by_id(handle->rptcache, rid); if (!rpt) { snmp_bc_unlock_handler(custom_handle); return(SA_ERR_HPI_INVALID_RESOURCE); } if (!(rpt->ResourceCapabilities & SAHPI_CAPABILITY_MANAGED_HOTSWAP)) { snmp_bc_unlock_handler(custom_handle); return(SA_ERR_HPI_CAPABILITY); } resinfo = (struct ResourceInfo *)oh_get_resource_data(handle->rptcache, rid); if (!resinfo) { err("No resource data for %s", rpt->ResourceTag.Data); snmp_bc_unlock_handler(custom_handle); return(SA_ERR_HPI_INTERNAL_ERROR); } if (resinfo->cur_state != SAHPI_HS_STATE_INSERTION_PENDING || resinfo->cur_state != SAHPI_HS_STATE_EXTRACTION_PENDING) { snmp_bc_unlock_handler(custom_handle); return(SA_ERR_HPI_INVALID_REQUEST); } /* Don't currently support managed hotswap resources that don't have immediate/read-only auto insertion/extraction policies If this type of hardware is supported in the future, need to add: - indicators in resinfo structure for: - auto-insertion timeout not started or cancelled - auto-extraction timeout not started or cancelled - set previous/current hotswap states - generate event for transition to active state */ snmp_bc_unlock_handler(custom_handle); return(SA_ERR_HPI_INVALID_REQUEST); } /** * snmp_bc_request_hotswap_action: * @hnd: Handler data pointer. * @rid: Resource ID. * @act: Hotswap state to set. * * Sets a managed hotswap resource's insertion or extraction action. * * Return values: * SA_OK - Normal case. * SA_ERR_HPI_CAPABILITY - Resource doesn't have SAHPI_CAPABILITY_MANAGED_HOTSWAP. * SA_ERR_HPI_INVALID_REQUEST - @act invalid. * SA_ERR_HPI_INVALID_RESOURCE - Resource doesn't exist. * SA_ERR_HPI_INVALID_PARAMS - Pointer parameter(s) are NULL. **/ SaErrorT snmp_bc_request_hotswap_action(void *hnd, SaHpiResourceIdT rid, SaHpiHsActionT act) { struct oh_handler_state *handle; struct snmp_bc_hnd *custom_handle; struct ResourceInfo *resinfo; SaHpiRptEntryT *rpt; if (!hnd) { err("Invalid parameter."); return(SA_ERR_HPI_INVALID_PARAMS); } if (NULL == oh_lookup_hsaction(act)) { err("Invalid hotswap action."); return(SA_ERR_HPI_INVALID_PARAMS); } handle = (struct oh_handler_state *)hnd; custom_handle = (struct snmp_bc_hnd *)handle->data; if (!custom_handle) { err("Invalid parameter."); return(SA_ERR_HPI_INVALID_PARAMS); } snmp_bc_lock_handler(custom_handle); /* Check if resource exists and has managed hotswap capabilities */ rpt = oh_get_resource_by_id(handle->rptcache, rid); if (!rpt) { snmp_bc_unlock_handler(custom_handle); return(SA_ERR_HPI_INVALID_RESOURCE); } if (!(rpt->ResourceCapabilities & SAHPI_CAPABILITY_MANAGED_HOTSWAP)) { snmp_bc_unlock_handler(custom_handle); return(SA_ERR_HPI_CAPABILITY); } resinfo = (struct ResourceInfo *)oh_get_resource_data(handle->rptcache, rid); if (!resinfo) { err("No resource data for %s", rpt->ResourceTag.Data); snmp_bc_unlock_handler(custom_handle); return(SA_ERR_HPI_INTERNAL_ERROR); } /* Issue power-on command for insertion */ if (act == SAHPI_HS_ACTION_INSERTION) { if (resinfo->cur_state == SAHPI_HS_STATE_INACTIVE) { SaErrorT err; err = snmp_bc_set_power_state(hnd, rid, SAHPI_POWER_ON); if (err) { err("%s resource does not support power on", rpt->ResourceTag.Data); snmp_bc_unlock_handler(custom_handle); return(SA_ERR_HPI_INTERNAL_ERROR); } } else { snmp_bc_unlock_handler(custom_handle); return(SA_ERR_HPI_INVALID_REQUEST); } } /* Issue power-off command for extraction */ if (act == SAHPI_HS_ACTION_EXTRACTION) { if (resinfo->cur_state == SAHPI_HS_STATE_ACTIVE) { SaErrorT err; err = snmp_bc_set_power_state(hnd, rid, SAHPI_POWER_OFF); if (err) { err("%s resource does not support power off", rpt->ResourceTag.Data); snmp_bc_unlock_handler(custom_handle); return(SA_ERR_HPI_INTERNAL_ERROR); } } else { snmp_bc_unlock_handler(custom_handle); return(SA_ERR_HPI_INVALID_REQUEST); } } snmp_bc_unlock_handler(custom_handle); return(SA_OK); } /** * snmp_bc_get_indicator_state: * @hnd: Handler data pointer. * @rid: Resource ID. * @state: Location to store the hotswap indicator state. * * Gets a managed hotswap resource's hotswap indicator state. * * Return values: * SA_OK - Normal case. * SA_ERR_HPI_CAPABILITY - Resource doesn't have SAHPI_CAPABILITY_MANAGED_HOTSWAP. * SA_ERR_HPI_INVALID_RESOURCE - Resource doesn't exist. * SA_ERR_HPI_INVALID_PARAMS - Pointer parameter(s) are NULL. **/ SaErrorT snmp_bc_get_indicator_state(void *hnd, SaHpiResourceIdT rid, SaHpiHsIndicatorStateT *state) { struct oh_handler_state *handle; struct snmp_bc_hnd *custom_handle; SaHpiRptEntryT *rpt; if (!hnd || !state) { err("Invalid parameter."); return(SA_ERR_HPI_INVALID_PARAMS); } handle = (struct oh_handler_state *)hnd; custom_handle = (struct snmp_bc_hnd *)handle->data; if (!custom_handle) { err("Invalid parameter."); return(SA_ERR_HPI_INVALID_PARAMS); } snmp_bc_lock_handler(custom_handle); /* Check if resource exists and has managed hotswap capabilities */ rpt = oh_get_resource_by_id(handle->rptcache, rid); if (!rpt) { snmp_bc_unlock_handler(custom_handle); return(SA_ERR_HPI_INVALID_RESOURCE); } if (!(rpt->ResourceCapabilities & SAHPI_CAPABILITY_MANAGED_HOTSWAP) || !(rpt->HotSwapCapabilities & SAHPI_HS_CAPABILITY_INDICATOR_SUPPORTED)) { snmp_bc_unlock_handler(custom_handle); return(SA_ERR_HPI_CAPABILITY); } err("Hotswap indicators are not supported by platform"); snmp_bc_unlock_handler(custom_handle); return(SA_ERR_HPI_INTERNAL_ERROR); } /** * snmp_bc_set_indicator_state: * @hnd: Handler data pointer. * @rid: Resource ID. * @state: Hotswap indicator state to set. * * Sets a managed hotswap resource's hotswap indicator. * * Return values: * SA_OK - Normal case. * SA_ERR_HPI_CAPABILITY - Resource doesn't have SAHPI_CAPABILITY_MANAGED_HOTSWAP. * SA_ERR_HPI_INVALID_REQUEST - @state invalid. * SA_ERR_HPI_INVALID_RESOURCE - Resource doesn't exist. * SA_ERR_HPI_INVALID_PARAMS - Pointer parameter(s) are NULL. **/ SaErrorT snmp_bc_set_indicator_state(void *hnd, SaHpiResourceIdT rid, SaHpiHsIndicatorStateT state) { struct oh_handler_state *handle; struct snmp_bc_hnd *custom_handle; SaHpiRptEntryT *rpt; if (!hnd) { err("Invalid parameter."); return(SA_ERR_HPI_INVALID_PARAMS); } if (NULL == oh_lookup_hsindicatorstate(state)) { err("Invalid hotswap indicator state."); return(SA_ERR_HPI_INVALID_PARAMS); } handle = (struct oh_handler_state *)hnd; custom_handle = (struct snmp_bc_hnd *)handle->data; if (!custom_handle) { err("Invalid parameter."); return(SA_ERR_HPI_INVALID_PARAMS); } snmp_bc_lock_handler(custom_handle); /* Check if resource exists and has managed hotswap capabilities */ rpt = oh_get_resource_by_id(handle->rptcache, rid); if (!rpt) { snmp_bc_unlock_handler(custom_handle); return(SA_ERR_HPI_INVALID_RESOURCE); } if (!(rpt->ResourceCapabilities & SAHPI_CAPABILITY_MANAGED_HOTSWAP) || !(rpt->HotSwapCapabilities & SAHPI_HS_CAPABILITY_INDICATOR_SUPPORTED)) { snmp_bc_unlock_handler(custom_handle); return(SA_ERR_HPI_CAPABILITY); } err("Hotswap indicators are not supported by platform"); snmp_bc_unlock_handler(custom_handle); return(SA_ERR_HPI_INTERNAL_ERROR); } /** * snmp_bc_set_autoinsert_timeout: * @hnd: Handler data pointer. * @rid: Resource ID. * @timeout: timeout to set. * * Set hotswap autoinsert timeout. * * Return values: * SA_ERR_HPI_READ_ONLY - Normal case. * SA_ERR_HPI_INVALID_PARAMS - Pointer parameter(s) are NULL. **/ SaErrorT snmp_bc_set_autoinsert_timeout(void *hnd, SaHpiTimeoutT Timeout) { if (!hnd) { err("Invalid parameter."); return(SA_ERR_HPI_INVALID_PARAMS); } return(SA_ERR_HPI_READ_ONLY); } /** * snmp_bc_get_autoextract_timeout: * @hnd: Handler data pointer. * @rid: Resource ID. * @timeout: Storage for returned timeout value. * * Get a resource's hotswap autoextract timeout. * * Return values: * SA_OK - Normal case. * SA_ERR_HPI_INVALID_PARAMS - Pointer parameter(s) are NULL. **/ SaErrorT snmp_bc_get_autoextract_timeout(void *hnd, SaHpiResourceIdT rid, SaHpiTimeoutT *Timeout) { if (!hnd || !Timeout) { err("Invalid parameter."); return(SA_ERR_HPI_INVALID_PARAMS); } *Timeout = SAHPI_TIMEOUT_IMMEDIATE; return(SA_OK); } /** * snmp_bc_set_autoextract_timeout: * @hnd: Handler data pointer. * @rid: Resource ID. * @timeout: timeout to set. * * Set a resource hotswap autoextract timeout. * * Return values: * SA_ERR_HPI_READ_ONLY - Normal case. * SA_ERR_HPI_INVALID_PARAMS - Pointer parameter(s) are NULL. **/ SaErrorT snmp_bc_set_autoextract_timeout(void *hnd, SaHpiResourceIdT rid, SaHpiTimeoutT Timeout) { if (!hnd) { err("Invalid parameter."); return(SA_ERR_HPI_INVALID_PARAMS); } return(SA_ERR_HPI_READ_ONLY); } void * oh_get_hotswap_state (void *, SaHpiResourceIdT, SaHpiHsStateT *) __attribute__ ((weak, alias("snmp_bc_get_hotswap_state"))); void * oh_set_hotswap_state (void *, SaHpiResourceIdT, SaHpiHsStateT) __attribute__ ((weak, alias("snmp_bc_set_hotswap_state"))); void * oh_request_hotswap_action (void *, SaHpiResourceIdT, SaHpiHsActionT) __attribute__ ((weak, alias("snmp_bc_request_hotswap_action"))); void * oh_set_indicator_state (void *, SaHpiResourceIdT, SaHpiHsIndicatorStateT) __attribute__ ((weak, alias("snmp_bc_set_indicator_state"))); void * oh_get_indicator_state (void *, SaHpiResourceIdT, SaHpiHsIndicatorStateT) __attribute__ ((weak, alias("snmp_bc_get_indicator_state"))); void * oh_set_autoinsert_timeout (void *, SaHpiTimeoutT) __attribute__ ((weak, alias("snmp_bc_set_autoinsert_timeout"))); void * oh_get_autoextract_timeout (void *, SaHpiResourceIdT, SaHpiTimeoutT *) __attribute__ ((weak, alias("snmp_bc_get_autoextract_timeout"))); void * oh_set_autoextract_timeout (void *, SaHpiResourceIdT, SaHpiTimeoutT) __attribute__ ((weak, alias("snmp_bc_set_autoextract_timeout"))); openhpi-2.14.1/plugins/snmp_bc/snmp_bc_reset.c0000644000076400007640000001176511302566770016303 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004, 2006 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * Steve Sherman */ #include /** * snmp_bc_get_reset_state: * @hnd: Handler data pointer. * @rid: Resource ID. * @act: Location to store resource's reset action state. * * Retrieves a resource's reset action state. * Always return SAHPI_RESET_DEASSERT. * * Return values: * SA_OK - Normal case. * SA_ERR_HPI_CAPABILITY - Resource doesn't have SAHPI_CAPABILITY_RESET. * SA_ERR_HPI_INVALID_RESOURCE - Resource doesn't exist. * SA_ERR_HPI_INVALID_PARAMS - Pointer parameter(s) are NULL. **/ SaErrorT snmp_bc_get_reset_state(void *hnd, SaHpiResourceIdT rid, SaHpiResetActionT *act) { struct oh_handler_state *handle; struct snmp_bc_hnd *custom_handle; SaHpiRptEntryT *rpt; if (!hnd || !act) { err("Invalid parameter."); return(SA_ERR_HPI_INVALID_PARAMS); } handle = (struct oh_handler_state *)hnd; custom_handle = (struct snmp_bc_hnd *)handle->data; if (!custom_handle) { err("Invalid parameter."); return(SA_ERR_HPI_INVALID_PARAMS); } snmp_bc_lock_handler(custom_handle); /* Check if resource exists and has reset capabilities */ rpt = oh_get_resource_by_id(handle->rptcache, rid); if (!rpt) { snmp_bc_unlock_handler(custom_handle); return(SA_ERR_HPI_INVALID_RESOURCE); } if (!(rpt->ResourceCapabilities & SAHPI_CAPABILITY_RESET)) { snmp_bc_unlock_handler(custom_handle); return(SA_ERR_HPI_CAPABILITY); } *act = SAHPI_RESET_DEASSERT; snmp_bc_unlock_handler(custom_handle); return(SA_OK); } /** * snmp_bc_set_reset_state: * @hnd: Handler data pointer. * @rid: Resource ID. * @act: Reset action state to set. * * Sets a resource's reset action state. * * Return values: * SA_OK - Normal case. * SA_ERR_HPI_CAPABILITY - Resource doesn't have SAHPI_CAPABILITY_RESET. * SA_ERR_HPI_INVALID_CMD - Resource doesn't support SAHPI_RESET_ASSERT. * SA_ERR_HPI_INVALID_RESOURCE - Resource doesn't exist. * SA_ERR_HPI_INVALID_PARAMS - Pointer parameter(s) are NULL; @act invalid. **/ SaErrorT snmp_bc_set_reset_state(void *hnd, SaHpiResourceIdT rid, SaHpiResetActionT act) { SaErrorT err; struct ResourceInfo *resinfo; struct snmp_value set_value; struct oh_handler_state *handle; struct snmp_bc_hnd *custom_handle; SaHpiRptEntryT *rpt; if (!hnd || NULL == oh_lookup_resetaction(act)){ err("Invalid parameter."); return(SA_ERR_HPI_INVALID_PARAMS); } if (act == SAHPI_RESET_ASSERT || act == SAHPI_RESET_DEASSERT) return(SA_ERR_HPI_INVALID_CMD); handle = (struct oh_handler_state *)hnd; custom_handle = (struct snmp_bc_hnd *)handle->data; if (!custom_handle) { err("Invalid parameter."); return(SA_ERR_HPI_INVALID_PARAMS); } snmp_bc_lock_handler(custom_handle); /* Check if resource exists and has reset capabilities */ rpt = oh_get_resource_by_id(handle->rptcache, rid); if (!rpt) { snmp_bc_unlock_handler(custom_handle); return(SA_ERR_HPI_INVALID_RESOURCE); } if (!(rpt->ResourceCapabilities & SAHPI_CAPABILITY_RESET)) { snmp_bc_unlock_handler(custom_handle); return(SA_ERR_HPI_CAPABILITY); } resinfo = (struct ResourceInfo *)oh_get_resource_data(handle->rptcache, rid); if (resinfo == NULL) { err("No resource data. Resource=%s", rpt->ResourceTag.Data); snmp_bc_unlock_handler(custom_handle); return(SA_ERR_HPI_INTERNAL_ERROR); } if (resinfo->mib.OidReset == NULL) { err("No Reset OID."); snmp_bc_unlock_handler(custom_handle); return(SA_ERR_HPI_INTERNAL_ERROR); } switch (act) { case SAHPI_COLD_RESET: /* COLD = WARM Reset Action */ case SAHPI_WARM_RESET: set_value.type = ASN_INTEGER; set_value.str_len = 1; set_value.integer = 1; err = snmp_bc_oid_snmp_set(custom_handle, &(rpt->ResourceEntity), 0, resinfo->mib.OidReset, set_value); if (err) { err("Cannot set SNMP OID=%s; Type=%d.", resinfo->mib.OidReset, set_value.type); snmp_bc_unlock_handler(custom_handle); return(err); } break; case SAHPI_RESET_ASSERT: /* RESET_ASSERT = RESET_DEASSERT Action */ case SAHPI_RESET_DEASSERT: snmp_bc_unlock_handler(custom_handle); return(SA_ERR_HPI_INVALID_CMD); default: err("Invalid Reset Action Type=%d.", act); snmp_bc_unlock_handler(custom_handle); return(SA_ERR_HPI_INTERNAL_ERROR); } snmp_bc_unlock_handler(custom_handle); return(SA_OK); } void * oh_get_reset_state (void *, SaHpiResourceIdT, SaHpiResetActionT *) __attribute__ ((weak, alias("snmp_bc_get_reset_state"))); void * oh_set_reset_state (void *, SaHpiResourceIdT, SaHpiResetActionT) __attribute__ ((weak, alias("snmp_bc_set_reset_state"))); openhpi-2.14.1/plugins/snmp_bc/snmp_bc_discover.h0000644000076400007640000001045311302566770016775 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004, 2006 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * Steve Sherman */ #ifndef __SNMP_BC_DISCOVER_H #define __SNMP_BC_DISCOVER_H SaErrorT snmp_bc_discover_resources(void *hnd); SaErrorT snmp_bc_discover(struct oh_handler_state *handle, SaHpiEntityPathT *ep_root); SaErrorT snmp_bc_discover_rsa(struct oh_handler_state *handle, SaHpiEntityPathT *ep_root); SaErrorT snmp_bc_rediscover(struct oh_handler_state *handle, SaHpiEventT *event, LogSource2ResourceT *logsrc2res); SaErrorT snmp_bc_discover_sensors(struct oh_handler_state *handle, struct snmp_bc_sensor *sensor_array, struct oh_event *res_oh_event); SaErrorT snmp_bc_discover_controls(struct oh_handler_state *handle, struct snmp_bc_control *control_array, struct oh_event *res_oh_event); SaErrorT snmp_bc_discover_inventories(struct oh_handler_state *handle, struct snmp_bc_inventory *inventory_array, struct oh_event *res_oh_event); SaErrorT snmp_bc_create_resourcetag(SaHpiTextBufferT *buffer, const char *str, SaHpiEntityLocationT location); SaHpiBoolT rdr_exists(struct snmp_bc_hnd *custom_handle, SaHpiEntityPathT *ep, SaHpiEntityLocationT loc_offset, const gchar *oidstr, unsigned int na, SaHpiBoolT write_only); SaErrorT snmp_bc_validate_ep(SaHpiEntityPathT *org_ep, SaHpiEntityPathT *val_ep); SaErrorT snmp_bc_mod_sensor_ep(SaHpiRdrT *rdrptr, void *sensor_array, int index); SaErrorT snmp_bc_add_ep(SaHpiRdrT *rdrptr, SaHpiEntityPathT *ep_add); SaErrorT snmp_bc_discover_media_tray(struct oh_handler_state *handle, SaHpiEntityPathT *ep_root, int media_tray_installed); SaErrorT snmp_bc_discover_filter(struct oh_handler_state *handle, SaHpiEntityPathT *ep_root, int filter_installed); SaErrorT snmp_bc_discover_chassis(struct oh_handler_state *handle, SaHpiEntityPathT *ep_root); SaErrorT snmp_bc_discover_blade(struct oh_handler_state *handle, SaHpiEntityPathT *ep_root, char *blade_vector); SaErrorT snmp_bc_discover_blowers(struct oh_handler_state *handle, SaHpiEntityPathT *ep_root, char *blower_vector); SaErrorT snmp_bc_discover_tap(struct oh_handler_state *handle, SaHpiEntityPathT *ep_root, char *tap_vector); SaErrorT snmp_bc_discover_nc(struct oh_handler_state *handle, SaHpiEntityPathT *ep_root, char *nc_vector); SaErrorT snmp_bc_discover_mx(struct oh_handler_state *handle, SaHpiEntityPathT *ep_root, char *mx_vector); SaErrorT snmp_bc_discover_smi(struct oh_handler_state *handle, SaHpiEntityPathT *ep_root, char *smi_vector); SaErrorT snmp_bc_discover_mmi(struct oh_handler_state *handle, SaHpiEntityPathT *ep_root, char *mmi_vector); SaErrorT snmp_bc_discover_power_module(struct oh_handler_state *handle, SaHpiEntityPathT *ep_root, char *power_module_vector); SaErrorT snmp_bc_discover_switch(struct oh_handler_state *handle, SaHpiEntityPathT *ep_root, char *switch_vector); SaErrorT snmp_bc_discover_mm(struct oh_handler_state *handle, SaHpiEntityPathT *ep_root, char *mm_vector, SaHpiBoolT global_discovery); SaErrorT snmp_bc_update_chassis_topo(struct oh_handler_state *handle); SaErrorT snmp_bc_discover_all_slots(struct oh_handler_state *handle, SaHpiEntityPathT *ep_root); SaErrorT snmp_bc_discover_slot(struct oh_handler_state *handle, SaHpiEntityPathT *ep_root, SaHpiEntityTypeT entitytype, guint entitylocation); SaErrorT snmp_bc_discover_blade_expansion(struct oh_handler_state *handle, SaHpiEntityPathT *ep_root, guint blade_index); SaErrorT snmp_bc_add_blade_expansion_resource(struct oh_handler_state *handle, SaHpiEntityPathT *ep, guint blade_index, BCExpansionTypeT expansionType, guint expansionindex); #endif openhpi-2.14.1/plugins/snmp_bc/snmp_bc_annunciator.h0000644000076400007640000000324311302566770017477 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * Steve Sherman */ #ifndef __SNMP_BC_ANNUNCIATOR_H #define __SNMP_BC_ANNUNCIATOR_H SaErrorT snmp_bc_get_next_announce(void *hnd, SaHpiResourceIdT rid, SaHpiAnnunciatorNumT aid, SaHpiSeverityT sev, SaHpiBoolT unackonly, SaHpiAnnouncementT *announcement); SaErrorT snmp_bc_get_announce(void *hnd, SaHpiResourceIdT rid, SaHpiAnnunciatorNumT aid, SaHpiEntryIdT entry, SaHpiAnnouncementT *announcement); SaErrorT snmp_bc_ack_announce(void *hnd, SaHpiResourceIdT rid, SaHpiAnnunciatorNumT aid, SaHpiEntryIdT entry, SaHpiSeverityT sev); SaErrorT snmp_bc_add_announce(void *hnd, SaHpiResourceIdT rid, SaHpiAnnunciatorNumT aid, SaHpiAnnouncementT *announcement); SaErrorT snmp_bc_del_announce(void *hnd, SaHpiResourceIdT rid, SaHpiAnnunciatorNumT aid, SaHpiEntryIdT entry, SaHpiSeverityT sev); SaErrorT snmp_bc_get_annunc_mode(void *hnd, SaHpiResourceIdT rid, SaHpiAnnunciatorNumT aid, SaHpiAnnunciatorModeT *mode); SaErrorT snmp_bc_set_annunc_mode(void *hnd, SaHpiResourceIdT rid, SaHpiAnnunciatorNumT aid, SaHpiAnnunciatorModeT mode); #endif openhpi-2.14.1/plugins/snmp_bc/snmp_bc_xml2event.c0000644000076400007640000002621611302566770017102 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004, 2006 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * Steve Sherman * W. David Ashley */ #include #include #include GHashTable *errlog2event_hash = NULL; ohpi_bc_lock snmp_bc_plock = { .lock = G_STATIC_REC_MUTEX_INIT, .count = 0 }; unsigned int errlog2event_hash_use_count = 0; static void free_hash_data(gpointer key, gpointer value, gpointer user_data); static void event_start_element(GMarkupParseContext *context, const gchar *element_name, const gchar **attribute_names, const gchar **attribute_values, gpointer user_data, GError **error); /********************************************************************** * errlog2event_hash_init: * @custom_handle: Plugin's data pointer. * * Initializes the Error Log to event translation hash table. * * Returns: * SA_OK - Normal operation. * SA_ERR_HPI_OUT_OF_MEMORY - No memory to allocate hash table structures. * SA_ERR_HPI_INVALID_PARAMS - @custom_handle NULL **********************************************************************/ SaErrorT errlog2event_hash_init(struct snmp_bc_hnd *custom_handle) { GMarkupParser parser; GMarkupParseContext *pcontext; gboolean rc; GError *err; struct errlog2event_hash_info user_data; if (!custom_handle) { err("Invalid parameter."); return(SA_ERR_HPI_INVALID_PARAMS); } err = NULL; snmp_bc_lock(snmp_bc_plock); /* Initialize hash table */ errlog2event_hash = g_hash_table_new(g_str_hash, g_str_equal); if (errlog2event_hash == NULL) { err("No memory."); snmp_bc_unlock(snmp_bc_plock); return(SA_ERR_HPI_OUT_OF_MEMORY); } /* Initialize user data used in parsing XML events */ user_data.hashtable = errlog2event_hash; /* Initialize XML parser */ memset(&parser, 0, sizeof(parser)); parser.start_element = event_start_element; pcontext = g_markup_parse_context_new(&parser, 0, &user_data, NULL); if (pcontext == NULL) { err("No memory."); snmp_bc_unlock(snmp_bc_plock); return(SA_ERR_HPI_OUT_OF_MEMORY); } /* Parse XML events */ rc = g_markup_parse_context_parse(pcontext, (const gchar *)eventxml, (gssize)strlen(eventxml), &err); if (rc == FALSE || err != NULL) { if (err != NULL) { err("Parse error=%s.", err->message); g_error_free(err); } else { err("Unknown XML parse error."); } g_markup_parse_context_free(pcontext); snmp_bc_unlock(snmp_bc_plock); return(SA_ERR_HPI_INTERNAL_ERROR); } g_markup_parse_context_end_parse(pcontext, &err); g_markup_parse_context_free(pcontext); /* Make sure there are elements in the hash table */ if (g_hash_table_size(errlog2event_hash) == 0) { err("Hash table is empty."); snmp_bc_unlock(snmp_bc_plock); return(SA_ERR_HPI_INTERNAL_ERROR); } snmp_bc_unlock(snmp_bc_plock); return(SA_OK); } /********************************************************************** * errlog2event_hash_free: * * Frees Error Log to event translation hash table. * * Returns: * SA_OK - Normal operation. **********************************************************************/ SaErrorT errlog2event_hash_free() { snmp_bc_lock(snmp_bc_plock); g_hash_table_foreach(errlog2event_hash, free_hash_data, NULL); g_hash_table_destroy(errlog2event_hash); snmp_bc_unlock(snmp_bc_plock); return(SA_OK); } static void free_hash_data(gpointer key, gpointer value, gpointer user_data) { ErrLog2EventInfoT *xmlinfo; g_free(key); xmlinfo = (ErrLog2EventInfoT *)value; g_free(xmlinfo->event); g_free(value); } /* Note: Error messages are passed back to the caller via the GError * mechanism. There is no need for err calls in this function. */ static void event_start_element(GMarkupParseContext *context, const gchar *element_name, const gchar **attribute_names, const gchar **attribute_values, gpointer user_data, GError **error) { int i = 0; gchar *key = NULL; gint line, pos; ErrLog2EventInfoT *xmlinfo, working; struct errlog2event_hash_info *hash_info; memset(&working, 0, sizeof(ErrLog2EventInfoT)); hash_info = (struct errlog2event_hash_info *)user_data; /* Ignore all XML elements except the event tag */ if (g_ascii_strncasecmp(element_name, "event", sizeof("event")) != 0) { /* This is normal - not an error condition! */ return; } /* Fetch XML element attributes and values. Build event info */ while (attribute_names[i] != NULL) { if (g_ascii_strncasecmp(attribute_names[i], "name", sizeof("name")) == 0) { /* Don't use this attribute so ignore it */ } else if (g_ascii_strncasecmp(attribute_names[i], "msg", sizeof("msg")) == 0) { key = g_strdup(attribute_values[i]); if (key == NULL) { g_set_error(error, G_MARKUP_ERROR, G_MARKUP_ERROR_PARSE, "No memory for hash key=%s", attribute_values[i]); return; } } else if (g_ascii_strncasecmp(attribute_names[i], "hex", sizeof("hex")) == 0) { working.event = g_strdup(attribute_values[i]); if (working.event == NULL) { g_set_error(error, G_MARKUP_ERROR, G_MARKUP_ERROR_PARSE, "No memory for hash value=%s", attribute_values[i]); return; } } else if (g_ascii_strncasecmp(attribute_names[i], "severity", sizeof("severity")) == 0) { if (g_ascii_strncasecmp(attribute_values[i], "SAHPI_CRITICAL", sizeof("SAHPI_CRITICAL")) == 0) { working.event_sev = SAHPI_CRITICAL; } else if (g_ascii_strncasecmp(attribute_values[i], "SAHPI_MAJOR", sizeof("SAHPI_MAJOR")) == 0) { working.event_sev = SAHPI_MAJOR; } else if (g_ascii_strncasecmp(attribute_values[i], "SAHPI_MINOR", sizeof("SAHPI_MINOR")) == 0) { working.event_sev = SAHPI_MINOR; } else if (g_ascii_strncasecmp(attribute_values[i], "SAHPI_INFORMATIONAL", sizeof("SAHPI_INFORMATIONAL")) == 0) { working.event_sev = SAHPI_INFORMATIONAL; } else { g_markup_parse_context_get_position(context, &line, &pos); g_set_error(error, G_MARKUP_ERROR, G_MARKUP_ERROR_INVALID_CONTENT, "Bad severity=%s for XML event element line %d", attribute_values[i], line); return; } } else if (g_ascii_strncasecmp(attribute_names[i], "override", sizeof("override")) == 0) { working.event_ovr |= NO_OVR; if (strstr(attribute_values[i], "OVR_SEV") != NULL) { working.event_ovr |= OVR_SEV; } if (strstr(attribute_values[i], "OVR_RID") != NULL) { working.event_ovr |= OVR_RID; } if (strstr(attribute_values[i], "OVR_EXP") != NULL) { working.event_ovr |= OVR_EXP; } if (strstr(attribute_values[i], "OVR_VMM") != NULL) { working.event_ovr |= OVR_VMM; } if (strstr(attribute_values[i], "OVR_MM1") != NULL) { working.event_ovr |= OVR_MM1; } if (strstr(attribute_values[i], "OVR_MM2") != NULL) { working.event_ovr |= OVR_MM2; } if (strstr(attribute_values[i], "OVR_MM_STBY") != NULL) { working.event_ovr |= OVR_MM_STBY; } if (strstr(attribute_values[i], "OVR_MM_PRIME") != NULL) { working.event_ovr |= OVR_MM_PRIME; } /* Ignore any other values */ } else if (g_ascii_strncasecmp(attribute_names[i], "dup", sizeof("dup")) == 0) { working.event_dup = (short)atoi(attribute_values[i]); } else { g_markup_parse_context_get_position(context, &line, &pos); g_set_error(error, G_MARKUP_ERROR, G_MARKUP_ERROR_UNKNOWN_ATTRIBUTE, "Bad name for XML event element line %d", line); return; } i++; } /* Check for valid key */ if (key == NULL) { g_set_error(error, G_MARKUP_ERROR, G_MARKUP_ERROR_INVALID_CONTENT, "No key set from XML event element"); return; } /* Malloc memory for hash value and set values */ xmlinfo = g_malloc0(sizeof(ErrLog2EventInfoT)); if (!xmlinfo) { g_set_error(error, G_MARKUP_ERROR,G_MARKUP_ERROR_PARSE, "No memory for hash value"); return; } *xmlinfo = working; /* Insert event into hash table */ g_hash_table_insert(hash_info->hashtable, key, xmlinfo); dbg("Inserted event=%s into hash table. Sev=%s, OVR=%lld, Dup=%d", xmlinfo->event, oh_lookup_severity(xmlinfo->event_sev), xmlinfo->event_ovr, xmlinfo->event_dup); return; } openhpi-2.14.1/plugins/snmp_bc/snmp_bc_session.h0000644000076400007640000000204511302566770016640 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2003, 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * Renier Morales * Steve Sherman */ #ifndef __SNMP_BC_SESSION_H #define __SNMP_BC_SESSION_H /** * This handle is unique per instance of this plugin. SNMP session data is * stored in the handle along with config file data. **/ void *snmp_bc_open(GHashTable *handler_config, unsigned int hid, oh_evt_queue *eventq); void snmp_bc_close(void *hnd); SaErrorT snmp_bc_manage_snmp_open(struct snmp_bc_hnd *custom_handle, SaHpiBoolT recovery_requested); SaErrorT snmp_bc_recover_snmp_session(struct snmp_bc_hnd *custom_handle); #endif openhpi-2.14.1/plugins/snmp_bc/snmp_bc_inventory.c0000644000076400007640000006107011302566770017210 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2003, 2006 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * Peter Phan * Renier Morales */ #include static SaErrorT snmp_bc_build_idr( void *hnd, SaHpiResourceIdT ResourceId, SaHpiIdrIdT IdrId, struct bc_inventory_record *i_record); static SaErrorT snmp_bc_idr_build_field(struct snmp_bc_hnd *custom_handle, SaHpiEntityPathT *ep, const gchar *oidstr, SaHpiIdrFieldT *thisField, struct bc_idr_area *thisInventoryArea); static SaErrorT snmp_bc_build_area( void *hnd, struct InventoryMibInfo *thisMib, struct bc_idr_area *thisInventoryArea, SaHpiIdrFieldT *thisField, SaHpiEntityPathT *valEntity); /************************************************************************/ /* Inventory functions */ /************************************************************************/ /** * vpd_exists: * @thisMib: Pointer to resource VPD structure * * Verify at least one of the OIDs in VPD structure is defined. * * Return value: * SAHPI_FALSE - None of the OIDs in the VPD structure is defined. * SAHPI_TRUE - At lease one on the OIDs in VPD structure is defined. **/ SaHpiBoolT vpd_exists(struct InventoryMibInfo *thisMib) { if ( (thisMib->oid.OidChassisType == NULL) && (thisMib->oid.OidMfgDateTime == NULL) && (thisMib->oid.OidManufacturer == NULL) && (thisMib->oid.OidProductName == NULL) && (thisMib->oid.OidProductVersion == NULL) && (thisMib->oid.OidSerialNumber == NULL) && (thisMib->oid.OidPartNumber == NULL) && (thisMib->oid.OidFileId == NULL) && (thisMib->oid.OidAssetTag == NULL) ) return(SAHPI_FALSE); else return(SAHPI_TRUE); } /** * snmp_bc_get_idr_info: * @hnd: Pointer to handler's data * @ResourceId: Resource identifier for this operation * @IdrId: Identifier for the Inventory Data Repository * @IdrInfo: Pointer to the information describing the requested Inventory Data Repository * * Build the Inventory Data Record for the inputed resource id, idr id. * Copy the IdrInfo found for the input resource id and idr id * * Return value: * SA_OK - Normal * SA_ERR_HPI_INVALID_PARAMS - NULL input pointers, hnd or IdrInfo * SA_ERR_HPI_NOT_PRESENT - If can not find idr with matched requested IdrId **/ SaErrorT snmp_bc_get_idr_info( void *hnd, SaHpiResourceIdT ResourceId, SaHpiIdrIdT IdrId, SaHpiIdrInfoT *IdrInfo) { SaErrorT rv; struct bc_inventory_record *i_record; struct oh_handler_state *handle; struct snmp_bc_hnd *custom_handle; if (!hnd || !IdrInfo) return(SA_ERR_HPI_INVALID_PARAMS); rv = SA_OK; handle = (struct oh_handler_state *)hnd; custom_handle = (struct snmp_bc_hnd *)handle->data; i_record = (struct bc_inventory_record *)g_malloc0(sizeof(struct bc_inventory_record)); if (!i_record) { err("Cannot allocate memory."); return(SA_ERR_HPI_OUT_OF_MEMORY); } snmp_bc_lock_handler(custom_handle); rv = snmp_bc_build_idr(hnd, ResourceId, IdrId, i_record); if (rv == SA_OK) { if (IdrId == i_record->idrinfo.IdrId) memcpy(IdrInfo, &(i_record->idrinfo), sizeof(SaHpiIdrInfoT)); else rv = SA_ERR_HPI_NOT_PRESENT; } g_free(i_record); snmp_bc_unlock_handler(custom_handle); return rv; } /** * snmp_bc_get_idr_area_header: * @hnd: Pointer to handler's data * @ResourceId: Resource identifier for this operation * @IdrId: Identifier for the Inventory Data Repository * @AreaType: Type of Inventory Data Area * @AreaId: Identifier of Area entry to retrieve from the IDR * @NextAreaId: Pointer to location to store the AreaId of the next area * of the requested type within the IDR * @Header: Pointer to Inventory Data Area Header into which the header information is placed * * Build the Inventory Data Record for the inputed resource id, idr id. * Copy the Inventory Data Area Header to the space provided by user. * * Internal code makes an assumption that there is only one (1) Idr per * resource in snmp_bc plugin. For this to be expanded to more than one * Idr per resource, the base bc_resources.c/h has to be changed together * with the rest of inventory code. * * Return value: * SA_OK - Normal * SA_ERR_HPI_INVALID_PARAMS - NULL input pointers, hnd or NextAreaId or Header * SA_ERR_HPI_OUT_OF_MEMORY - If can not allocate temp work space * SA_ERR_HPI_NOT_PRESENT - If can not find idr area with matched requested AreaId **/ SaErrorT snmp_bc_get_idr_area_header( void *hnd, SaHpiResourceIdT ResourceId, SaHpiIdrIdT IdrId, SaHpiIdrAreaTypeT AreaType, SaHpiEntryIdT AreaId, SaHpiEntryIdT *NextAreaId, SaHpiIdrAreaHeaderT *Header) { SaErrorT rv; gint index, foundit; struct bc_inventory_record *i_record; struct oh_handler_state *handle; struct snmp_bc_hnd *custom_handle; if (!hnd || !NextAreaId || !Header) return(SA_ERR_HPI_INVALID_PARAMS); rv = SA_OK; handle = (struct oh_handler_state *)hnd; custom_handle = (struct snmp_bc_hnd *)handle->data; i_record = (struct bc_inventory_record *)g_malloc0(sizeof(struct bc_inventory_record)); if (!i_record) { err("Cannot allocate memory."); return(SA_ERR_HPI_OUT_OF_MEMORY); } snmp_bc_lock_handler(custom_handle); rv = snmp_bc_build_idr(hnd, ResourceId, IdrId, i_record); if (rv == SA_OK) { rv = SA_ERR_HPI_NOT_PRESENT; foundit = 0; if (IdrId == i_record->idrinfo.IdrId) { for (index = 0; index < i_record->idrinfo.NumAreas; index++) { if ( (i_record->area[index].idrareas.Type == AreaType) || (SAHPI_IDR_AREATYPE_UNSPECIFIED == AreaType) ) { if ( (i_record->area[index].idrareas.AreaId == AreaId) || (SAHPI_FIRST_ENTRY == AreaId) ) { memcpy(Header, &(i_record->area[index].idrareas), sizeof(SaHpiIdrAreaHeaderT)); foundit = 1; } *NextAreaId = SAHPI_LAST_ENTRY; if (foundit) { if (index < (i_record->idrinfo.NumAreas -1)) *NextAreaId = i_record->area[index+1].idrareas.AreaId; rv = SA_OK; break; } } } } } g_free(i_record); snmp_bc_unlock_handler(custom_handle); return (rv); } /** * snmp_bc_add_idr_area: * @hnd: Pointer to handler's data * @ResourceId: Resource identifier for this operation * @IdrId: Identifier for the Inventory Data Repository * @AreaType: Type of Inventory Data Area * @AreaId: Pointer to store the identifier of the newly allocated Inventory Area * * This function is not suported/implemented for snmp_bc plugin * * Return value: * SA_ERR_HPI_READ_ONLY - Normal - snmp_bc does not allow Inventory Update **/ SaErrorT snmp_bc_add_idr_area( void *hnd, SaHpiResourceIdT ResourceId, SaHpiIdrIdT IdrId, SaHpiIdrAreaTypeT AreaType, SaHpiEntryIdT *AreaId) { return SA_ERR_HPI_READ_ONLY; } /** * snmp_bc_del_idr_area: * @hnd: Pointer to handler's data * @ResourceId: Resource identifier for this operation * @IdrId: Identifier for the Inventory Data Repository * @AreaId: Identifier of Area entry to delete from the IDR * * This function is not suported/implemented for snmp_bc plugin * * Return value: * SA_ERR_HPI_READ_ONLY - Normal - snmp_bc does not allow Inventory Update **/ SaErrorT snmp_bc_del_idr_area( void *hnd, SaHpiResourceIdT ResourceId, SaHpiIdrIdT IdrId, SaHpiEntryIdT AreaId) { return SA_ERR_HPI_READ_ONLY; } /** * snmp_bc_get_idr_field: * @hnd: Pointer to handler's data * @ResourceId: Resource identifier for this operation * @IdrId: Identifier for the Inventory Data Repository * @AreaId: Identifier of Area for the IDA * @FieldType: Type of Inventory Data Field * @FieldId: Identier of Field to retrieve from the IDA * @NextFieldId: Pointer to location to store the FieldId * of the next field of the requested type in IDA * @Field: Pointer to Inventory Data Field into which the field information will be placed. * * Return value: * SA_OK - Normal * SA_ERR_HPI_INVALID_PARAMS - NULL input pointers, hnd or IdrInfo * SA_ERR_HPI_NOT_PRESENT - If can not find requested field **/ SaErrorT snmp_bc_get_idr_field( void *hnd, SaHpiResourceIdT ResourceId, SaHpiIdrIdT IdrId, SaHpiEntryIdT AreaId, SaHpiIdrFieldTypeT FieldType, SaHpiEntryIdT FieldId, SaHpiEntryIdT *NextFieldId, SaHpiIdrFieldT *Field) { SaErrorT rv = SA_OK; struct bc_inventory_record *i_record; gint i; gint index; SaHpiBoolT foundit = SAHPI_FALSE; struct oh_handler_state *handle; struct snmp_bc_hnd *custom_handle; if (!hnd || !NextFieldId || !Field) return(SA_ERR_HPI_INVALID_PARAMS); rv = SA_OK; handle = (struct oh_handler_state *)hnd; custom_handle = (struct snmp_bc_hnd *)handle->data; i_record = (struct bc_inventory_record *)g_malloc0(sizeof(struct bc_inventory_record)); if (!i_record) { err("Cannot allocate memory."); return(SA_ERR_HPI_OUT_OF_MEMORY); } snmp_bc_lock_handler(custom_handle); rv = snmp_bc_build_idr(hnd, ResourceId, IdrId, i_record); if (rv == SA_OK) { rv = SA_ERR_HPI_NOT_PRESENT; for (index = 0; index < i_record->idrinfo.NumAreas; index++) { if (i_record->area[index].idrareas.AreaId == AreaId) { /* Search for fieldId here */ for (i=0; i < i_record->area[index].idrareas.NumFields; i++) { if ( ((i_record->area[index].field[i].FieldId == FieldId) || (SAHPI_FIRST_ENTRY == FieldId)) && ((i_record->area[index].field[i].Type == FieldType) || (SAHPI_IDR_FIELDTYPE_UNSPECIFIED == FieldType)) ) { memcpy(Field, &(i_record->area[index].field[i]), sizeof(SaHpiIdrFieldT)); foundit = SAHPI_TRUE; rv = SA_OK; break; } } *NextFieldId = SAHPI_LAST_ENTRY; i++; if (foundit) { if (i < i_record->area[index].idrareas.NumFields) { do { if ((i_record->area[index].field[i].Type == FieldType) || (SAHPI_IDR_FIELDTYPE_UNSPECIFIED == FieldType)) { *NextFieldId = i_record->area[index].field[i].FieldId; break; } i++; } while (i < i_record->area[index].idrareas.NumFields); } } } } } g_free(i_record); snmp_bc_unlock_handler(custom_handle); return rv; } /** * snmp_bc_add_idr_field: * @hnd: Pointer to handler's data * @ResourceId: Resource identifier for this operation * @IdrId: Identifier for the Inventory Data Repository * @Field: Pointer to Inventory Data Field which contains field information to be added. * * This function is not suported/implemented for snmp_bc plugin * * Return value: * SA_ERR_HPI_READ_ONLY - Normal - snmp_bc does not allow Inventory Update **/ SaErrorT snmp_bc_add_idr_field( void *hnd, SaHpiResourceIdT ResourceId, SaHpiIdrIdT IdrId, SaHpiIdrFieldT *Field) { return SA_ERR_HPI_READ_ONLY; } /** * snmp_bc_set_idr_field: * @hnd: Pointer to handler's data * @ResourceId: Resource identifier for this operation * @IdrId: Identifier for the Inventory Data Repository * @Field: Pointer to Inventory Data Field which contains updated field information. * * This function is not suported/implemented for snmp_bc plugin * * Return value: * SA_ERR_HPI_READ_ONLY - Normal - snmp_bc does not allow Inventory Update **/ SaErrorT snmp_bc_set_idr_field( void *hnd, SaHpiResourceIdT ResourceId, SaHpiIdrIdT IdrId, SaHpiIdrFieldT *Field) { return SA_ERR_HPI_READ_ONLY; } /** * snmp_bc_del_idr_field: * @hnd: Pointer to handler's data * @ResourceId: Resource identifier for this operation * @IdrId: Identifier for the Inventory Data Repository * @AreaId: Identifier of Inventory Area whose field is to bo deleted * @FieldId: Identifier of field to be deleted * * This function is not suported/implemented for snmp_bc plugin * * Return value: * SA_ERR_HPI_READ_ONLY - Normal - snmp_bc does not allow Inventory Update **/ SaErrorT snmp_bc_del_idr_field( void *hnd, SaHpiResourceIdT ResourceId, SaHpiIdrIdT IdrId, SaHpiEntryIdT AreaId, SaHpiEntryIdT FieldId) { return SA_ERR_HPI_READ_ONLY; } /** * snmp_bc_build_area: * @hnd: Pointer to handler's data * @thisMib: VPD mib structure to be built * @thisInventoryArea: Pointer into inventory area is stored * @thisField: Pointer into which individual inventory field is stored * @valEntity: Pointer to this resource EntityPath * * Build the complete Inventory Record for the resource identifier * * Return value: * SA_OK - Normal * SA_ERR_HPI_INVALID_PARAMS - If any in pointer is NULL * SA_ERR_HPI_NOT_PRESENT - If Inventory RDR is not found in rptcache **/ static SaErrorT snmp_bc_build_area( void *hnd, struct InventoryMibInfo *thisMib, struct bc_idr_area *thisInventoryArea, SaHpiIdrFieldT *thisField, SaHpiEntityPathT *valEntity) { SaErrorT rv; struct oh_handler_state *handle; struct snmp_bc_hnd *custom_handle; struct snmp_value get_value; handle = (struct oh_handler_state *) hnd; custom_handle = handle->data; thisInventoryArea->idrareas.Type = thisMib->area_type; thisInventoryArea->idrareas.ReadOnly = SAHPI_TRUE; thisInventoryArea->idrareas.NumFields = 0; /* Increment it as we find field */ thisField->AreaId = thisInventoryArea->idrareas.AreaId; thisField->ReadOnly = SAHPI_TRUE; thisField->Field.Language = SAHPI_LANG_ENGLISH; /* SaHpiLanguageT */ /** * **/ thisField->FieldId = 1; thisField->Type = SAHPI_IDR_FIELDTYPE_CHASSIS_TYPE; if(thisMib->oid.OidChassisType != NULL) { rv = snmp_bc_idr_build_field(custom_handle, valEntity, thisMib->oid.OidChassisType, thisField, thisInventoryArea); if (rv != SA_OK) err("Cannot build Chassis Idr Field, continue to next field."); } /** * **/ memset(thisField->Field.Data, 0, SAHPI_MAX_TEXT_BUFFER_LENGTH); thisField->FieldId = 2; thisField->Type = SAHPI_IDR_FIELDTYPE_MFG_DATETIME; thisField->Field.DataLength = 0; /* SaHpiUint8T */ if(thisMib->oid.OidMfgDateTime == NULL){ thisField->Field.DataLength = sizeof("SAHPI_TIME_UNSPECIFIED"); /* SaHpiUint8T */ thisField->Field.DataType = SAHPI_TL_TYPE_TEXT; /* SaHpiTextTypeT */ strncpy((char *)thisField->Field.Data,"SAHPI_TIME_UNSPECIFIED", sizeof("SAHPI_TIME_UNSPECIFIED")); } else { rv = snmp_bc_oid_snmp_get(custom_handle, valEntity, 0, thisMib->oid.OidMfgDateTime, &get_value, SAHPI_TRUE); if(rv != SA_OK) { err("SNMP could not read %s; Type=%d.", thisMib->oid.OidMfgDateTime, get_value.type); return rv; } else if((rv == SA_OK) && (get_value.type == ASN_OCTET_STR )) { thisField->Field.DataLength = get_value.str_len; thisField->Field.DataType = SAHPI_TL_TYPE_TEXT; memcpy(thisField->Field.Data, get_value.string, get_value.str_len); } else err("%s Invalid type for MfgDateTime inventory data", thisMib->oid.OidMfgDateTime); } /** * **/ if (thisField->Field.DataLength != 0) { memcpy(&thisInventoryArea->field[thisInventoryArea->idrareas.NumFields], thisField, sizeof(SaHpiIdrFieldT)); thisInventoryArea->idrareas.NumFields++; } thisField->FieldId = 3; thisField->Type = SAHPI_IDR_FIELDTYPE_MANUFACTURER; if(thisMib->oid.OidManufacturer != NULL) { rv = snmp_bc_idr_build_field(custom_handle, valEntity, thisMib->oid.OidManufacturer, thisField, thisInventoryArea); if (rv != SA_OK) err("Cannot build ManufacturerId Idr Field, continue to next field."); } /** * **/ thisField->FieldId = 4; thisField->Type = SAHPI_IDR_FIELDTYPE_PRODUCT_NAME; if(thisMib->oid.OidProductName != NULL) { rv = snmp_bc_idr_build_field(custom_handle, valEntity, thisMib->oid.OidProductName, thisField, thisInventoryArea); if (rv != SA_OK) err("Cannot build ProductName Idr Field, continue to next field."); } /** * **/ thisField->FieldId = 5; thisField->Type = SAHPI_IDR_FIELDTYPE_PRODUCT_VERSION; if(thisMib->oid.OidProductVersion != NULL) { rv = snmp_bc_idr_build_field(custom_handle, valEntity, thisMib->oid.OidProductVersion, thisField, thisInventoryArea); if (rv != SA_OK) err("Cannot build ProductVersion Idr Field, continue to next field."); } /** * **/ thisField->FieldId = 6; thisField->Type = SAHPI_IDR_FIELDTYPE_SERIAL_NUMBER; if(thisMib->oid.OidSerialNumber != NULL) { rv = snmp_bc_idr_build_field(custom_handle, valEntity, thisMib->oid.OidSerialNumber, thisField, thisInventoryArea); if (rv != SA_OK) err("Cannot build SerialNumber Idr Field, continue to next field."); } /** * **/ thisField->FieldId = 7; thisField->Type = SAHPI_IDR_FIELDTYPE_PART_NUMBER; if(thisMib->oid.OidPartNumber != NULL) { rv = snmp_bc_idr_build_field(custom_handle, valEntity, thisMib->oid.OidPartNumber, thisField, thisInventoryArea); if (rv != SA_OK) err("Cannot build PartNumber Idr Field, continue to next field."); } /** * **/ thisField->FieldId = 8; thisField->Type = SAHPI_IDR_FIELDTYPE_FILE_ID; if(thisMib->oid.OidFileId != NULL) { rv = snmp_bc_idr_build_field(custom_handle, valEntity, thisMib->oid.OidFileId, thisField, thisInventoryArea); if (rv != SA_OK) err("Cannot build FileID Idr Field, continue to next field."); } /** * **/ thisField->FieldId = 9; thisField->Type = SAHPI_IDR_FIELDTYPE_ASSET_TAG; if(thisMib->oid.OidAssetTag != NULL) { rv = snmp_bc_idr_build_field(custom_handle, valEntity, thisMib->oid.OidAssetTag, thisField, thisInventoryArea); if (rv != SA_OK) printf("Cannot build AssetTag Idr Field, continue ..."); } /** * **/ return(SA_OK); } /** * snmp_bc_build_idr: * @hnd: Pointer to handler's data * @ResourceId: Resource identifier for this operation * @IdrId: Identifier for the Inventory Data Repository * @i_record: Pointer into which inventory data is stored * * Build the complete Inventory Record for the resource identifier * * Return value: * SA_OK - Normal * SA_ERR_HPI_INVALID_PARAMS - If any in pointer is NULL * SA_ERR_HPI_NOT_PRESENT - If Inventory RDR is not found in rptcache **/ static SaErrorT snmp_bc_build_idr( void *hnd, SaHpiResourceIdT ResourceId, SaHpiIdrIdT IdrId, struct bc_inventory_record *i_record) { SaErrorT rv; struct oh_handler_state *handle; struct snmp_bc_hnd *custom_handle; SaHpiRdrT *rdr; SaHpiEntityPathT valEntity; //struct snmp_value get_value; /* Local work spaces */ SaHpiIdrFieldT thisField; struct bc_idr_area thisInventoryArea; if (!hnd || !i_record) return(SA_ERR_HPI_INVALID_PARAMS); rv = SA_OK; handle = (struct oh_handler_state *) hnd; custom_handle = handle->data; rdr = oh_get_rdr_by_type(handle->rptcache, ResourceId, SAHPI_INVENTORY_RDR, IdrId); if (rdr != NULL) { struct InventoryInfo *s = (struct InventoryInfo *)oh_get_rdr_data(handle->rptcache, ResourceId, rdr->RecordId); rv = snmp_bc_validate_ep(&(rdr->Entity), &valEntity); i_record->idrinfo.IdrId = IdrId; i_record->idrinfo.UpdateCount = 0; i_record->idrinfo.ReadOnly = SAHPI_TRUE; i_record->idrinfo.NumAreas = 0; /* Build hardware vpd area */ if (vpd_exists(&s->hardware_mib) ) { i_record->idrinfo.NumAreas++; memset(&thisField, '\0', sizeof(SaHpiIdrFieldT)); memset(&thisInventoryArea, '\0', sizeof(struct bc_idr_area)); thisInventoryArea.idrareas.AreaId = i_record->idrinfo.NumAreas; rv = snmp_bc_build_area( hnd, &s->hardware_mib, &thisInventoryArea, &thisField, &valEntity); memcpy( &(i_record->area[i_record->idrinfo.NumAreas - 1]), &thisInventoryArea, sizeof(struct bc_idr_area)); } /* Build firmware vpd area */ if (vpd_exists(&s->firmware_mib) ) { i_record->idrinfo.NumAreas++; memset(&thisField, '\0', sizeof(SaHpiIdrFieldT)); memset(&thisInventoryArea, '\0', sizeof(struct bc_idr_area)); thisInventoryArea.idrareas.AreaId = i_record->idrinfo.NumAreas; rv = snmp_bc_build_area( hnd, &s->firmware_mib, &thisInventoryArea, &thisField, &valEntity); memcpy( &(i_record->area[i_record->idrinfo.NumAreas - 1]), &thisInventoryArea, sizeof(struct bc_idr_area)); } rv = SA_OK; } else { rv = SA_ERR_HPI_NOT_PRESENT; } return rv; } /** * snmp_bc_idr_build_field: * @custom_handle: snmp_bc custom handler data * @oid: SNMP Object Id of the BC Inventory object * @thisField: Pointer to Inventory Field under construction * @thisInventoryArea: Pointer to Inventory Record under contruction * * Get data from target snmp agent for the corresponding oid. * Construct IDR Field for the retrieved data and place in Inventory Record * * Return value: * SA_OK - Normal * SA_ERR_HPI_INVALID_PARAMS - If any in pointer is NULL * SA_ERR_HPI_INTERNAL_ERROR - If can not process get_value.type from bc snmp agent **/ static SaErrorT snmp_bc_idr_build_field(struct snmp_bc_hnd *custom_handle, SaHpiEntityPathT *ep, const gchar *oidstr, SaHpiIdrFieldT *thisField, struct bc_idr_area *thisInventoryArea) { struct snmp_value get_value; SaErrorT rv; if (!custom_handle || !thisField || !thisInventoryArea) return(SA_ERR_HPI_INVALID_PARAMS); rv = SA_OK; memset(thisField->Field.Data, 0, SAHPI_MAX_TEXT_BUFFER_LENGTH); thisField->Field.DataLength = 0; /* SaHpiUint8T */ rv = snmp_bc_oid_snmp_get(custom_handle, ep, 0, oidstr, &get_value, SAHPI_TRUE); if(rv != SA_OK) { err("SNMP could not read %s; Type=%d.", oidstr, get_value.type); return(rv); } else { if( get_value.type == ASN_OCTET_STR ) { thisField->Field.DataLength = get_value.str_len; thisField->Field.DataType = SAHPI_TL_TYPE_TEXT; memcpy(thisField->Field.Data, get_value.string, get_value.str_len); } else if ( get_value.type == ASN_INTEGER ){ thisField->Field.DataLength = sizeof(long); thisField->Field.DataType = SAHPI_TL_TYPE_TEXT; snprintf((char *)thisField->Field.Data, SAHPI_MAX_TEXT_BUFFER_LENGTH, "%ld",get_value.integer ); } else err("%s Invalid data type for Chassis data", oidstr); } if (thisField->Field.DataLength != 0) { memcpy(&thisInventoryArea->field[thisInventoryArea->idrareas.NumFields], thisField, sizeof(SaHpiIdrFieldT)); thisInventoryArea->idrareas.NumFields++; } return(SA_OK); } void * oh_get_idr_info (void *hnd, SaHpiResourceIdT, SaHpiIdrIdT,SaHpiIdrInfoT) __attribute__ ((weak, alias("snmp_bc_get_idr_info"))); void * oh_get_idr_area_header (void *, SaHpiResourceIdT, SaHpiIdrIdT, SaHpiIdrAreaTypeT, SaHpiEntryIdT, SaHpiEntryIdT, SaHpiIdrAreaHeaderT) __attribute__ ((weak, alias("snmp_bc_get_idr_area_header"))); void * oh_add_idr_area (void *, SaHpiResourceIdT, SaHpiIdrIdT, SaHpiIdrAreaTypeT, SaHpiEntryIdT) __attribute__ ((weak, alias("snmp_bc_add_idr_area"))); void * oh_del_idr_area (void *, SaHpiResourceIdT, SaHpiIdrIdT, SaHpiEntryIdT) __attribute__ ((weak, alias("snmp_bc_del_idr_field"))); void * oh_get_idr_field (void *, SaHpiResourceIdT, SaHpiIdrIdT, SaHpiEntryIdT, SaHpiIdrFieldTypeT, SaHpiEntryIdT, SaHpiEntryIdT, SaHpiIdrFieldT) __attribute__ ((weak, alias("snmp_bc_get_idr_field"))); void * oh_add_idr_field (void *, SaHpiResourceIdT, SaHpiIdrIdT, SaHpiIdrFieldT) __attribute__ ((weak, alias("snmp_bc_add_idr_field"))); void * oh_set_idr_field (void *, SaHpiResourceIdT, SaHpiIdrIdT, SaHpiIdrFieldT) __attribute__ ((weak, alias("snmp_bc_set_idr_field"))); void * oh_del_idr_field (void *, SaHpiResourceIdT, SaHpiIdrIdT, SaHpiEntryIdT, SaHpiEntryIdT) __attribute__ ((weak, alias("snmp_bc_del_idr_field"))); openhpi-2.14.1/plugins/snmp_bc/snmp_bc_resources_rsa.c0000644000076400007640000024426611302566770020044 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004, 2006 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * Steve Sherman * W. David Ashley */ #include /************************************************************************* * Resource Definitions *************************************************************************/ struct snmp_rpt snmp_bc_rpt_array_rsa[] = { /* Chassis */ { .rpt = { .ResourceInfo = { .ManufacturerId = IBM_MANUFACTURING_ID, }, .ResourceEntity = { .Entry[0] = { .EntityType = SAHPI_ENT_ROOT, .EntityLocation = 0 } }, .ResourceCapabilities = SAHPI_CAPABILITY_EVENT_LOG | SAHPI_CAPABILITY_EVT_DEASSERTS | SAHPI_CAPABILITY_INVENTORY_DATA | SAHPI_CAPABILITY_RDR | SAHPI_CAPABILITY_RESOURCE | SAHPI_CAPABILITY_SENSOR, .ResourceSeverity = SAHPI_CRITICAL, .ResourceFailed = SAHPI_FALSE, }, .res_info = { .mib = { .OidReset = '\0', .OidPowerState = '\0', .OidPowerOnOff = '\0', .OidUuid = ".1.3.6.1.4.1.2.3.51.1.2.21.2.1.4.0", }, .event_array = {}, }, .comment = "RSA Chassis" }, /* CPUs */ { .rpt = { .ResourceInfo = { .ManufacturerId = IBM_MANUFACTURING_ID, }, .ResourceEntity = { .Entry[0] = { .EntityType = SAHPI_ENT_PROCESSOR, .EntityLocation = SNMP_BC_HPI_LOCATION_BASE }, { .EntityType = SAHPI_ENT_ROOT, .EntityLocation = 0 } }, .ResourceCapabilities = SAHPI_CAPABILITY_EVT_DEASSERTS | SAHPI_CAPABILITY_RDR | SAHPI_CAPABILITY_RESOURCE | SAHPI_CAPABILITY_SENSOR, .ResourceSeverity = SAHPI_MAJOR, .ResourceFailed = SAHPI_FALSE, }, .res_info = { .mib = { .OidReset = '\0', .OidPowerState = '\0', .OidPowerOnOff = '\0', .OidUuid = '\0', }, .event_array = {}, }, .comment = "CPU" }, /* DASD */ { .rpt = { .ResourceInfo = { .ManufacturerId = IBM_MANUFACTURING_ID, }, .ResourceEntity = { .Entry[0] = { .EntityType = SAHPI_ENT_DISK_BAY, .EntityLocation = SNMP_BC_HPI_LOCATION_BASE }, { .EntityType = SAHPI_ENT_ROOT, .EntityLocation = 0 } }, .ResourceCapabilities = SAHPI_CAPABILITY_EVT_DEASSERTS | SAHPI_CAPABILITY_RDR | SAHPI_CAPABILITY_RESOURCE | SAHPI_CAPABILITY_SENSOR, .ResourceSeverity = SAHPI_MAJOR, .ResourceFailed = SAHPI_FALSE, }, .res_info = { .mib = { .OidReset = '\0', .OidPowerState = '\0', .OidPowerOnOff = '\0', .OidUuid = '\0', }, .event_array = {}, }, .comment = "DASD" }, /* Fans */ { .rpt = { .ResourceInfo = { .ManufacturerId = IBM_MANUFACTURING_ID, }, .ResourceEntity = { .Entry[0] = { .EntityType = SAHPI_ENT_FAN, .EntityLocation = SNMP_BC_HPI_LOCATION_BASE }, { .EntityType = SAHPI_ENT_ROOT, .EntityLocation = 0, } }, .ResourceCapabilities = SAHPI_CAPABILITY_EVT_DEASSERTS | SAHPI_CAPABILITY_RESOURCE | SAHPI_CAPABILITY_RDR | SAHPI_CAPABILITY_SENSOR, .ResourceSeverity = SAHPI_MAJOR, .ResourceFailed = SAHPI_FALSE, }, .res_info = { .mib = { .OidReset = '\0', .OidPowerState = '\0', .OidPowerOnOff = '\0', .OidUuid = '\0', }, .event_array = { {}, }, }, .comment = "Fan" }, {} /* Terminate array with a null element */ }; /****************************************************************************** * Sensor Definitions ******************************************************************************/ /***************** * Chassis Sensors *****************/ struct snmp_bc_sensor snmp_bc_chassis_sensors_rsa[] = { /* Thermal sensor on planar */ { .index = 1, .sensor = { .Num = 1, .Type = SAHPI_TEMPERATURE, .Category = SAHPI_EC_THRESHOLD, .EnableCtrl = SAHPI_FALSE, .EventCtrl = SAHPI_SEC_READ_ONLY, .Events = SAHPI_ES_UPPER_MINOR | SAHPI_ES_UPPER_MAJOR | SAHPI_ES_UPPER_CRIT, .DataFormat = { .IsSupported = SAHPI_TRUE, .ReadingType = SAHPI_SENSOR_READING_TYPE_FLOAT64, .BaseUnits = SAHPI_SU_DEGREES_C, .ModifierUnits = SAHPI_SU_UNSPECIFIED, .ModifierUse = SAHPI_SMUU_NONE, .Percentage = SAHPI_FALSE, .Range = { .Flags = SAHPI_SRF_MAX | SAHPI_SRF_MIN, .Max = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, .Value = { .SensorFloat64 = 125, }, }, .Min = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, .Value = { .SensorFloat64 = 0, }, }, }, }, .ThresholdDefn = { .IsAccessible = SAHPI_TRUE, .ReadThold = SAHPI_STM_UP_MAJOR | SAHPI_STM_UP_CRIT | SAHPI_STM_UP_HYSTERESIS, .WriteThold = 0, }, .Oem = 0, }, .sensor_info = { .mib = { .not_avail_indicator_num = 0, .write_only = 0, .oid = ".1.3.6.1.4.1.2.3.51.1.2.20.1.1.1.1.3.1", .loc_offset = 0, .threshold_oids = { .UpCritical = ".1.3.6.1.4.1.2.3.51.1.2.20.1.1.1.1.4.1", .UpMajor = ".1.3.6.1.4.1.2.3.51.1.2.20.1.1.1.1.6.1", .TotalPosThdHysteresis = ".1.3.6.1.4.1.2.3.51.1.2.20.1.1.1.1.7.1", }, }, .cur_state = SAHPI_ES_UNSPECIFIED, .sensor_enabled = SAHPI_TRUE, .events_enabled = SAHPI_TRUE, .assert_mask = SAHPI_ES_UPPER_MINOR | SAHPI_ES_UPPER_MAJOR | SAHPI_ES_UPPER_CRIT, .deassert_mask = SAHPI_ES_UPPER_MINOR | SAHPI_ES_UPPER_MAJOR | SAHPI_ES_UPPER_CRIT, .event_array = { { .event = "0601C480", /* EN_CUTOFF_HI_OVER_TEMP_PLANAR */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_TRUE, .event_res_failure_unexpected = SAHPI_TRUE, .event_state = SAHPI_ES_UPPER_CRIT | SAHPI_ES_UPPER_MAJOR | SAHPI_ES_UPPER_MINOR, .recovery_state = SAHPI_ES_UPPER_MAJOR | SAHPI_ES_UPPER_MINOR, }, { .event = "0601C080", /* EN_OVER_TEMP_PLANAR */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_TRUE, .event_res_failure_unexpected = SAHPI_TRUE, .event_state = SAHPI_ES_UPPER_CRIT | SAHPI_ES_UPPER_MAJOR | SAHPI_ES_UPPER_MINOR, .recovery_state = SAHPI_ES_UPPER_MAJOR | SAHPI_ES_UPPER_MINOR, }, { .event = "0601D500", /* EN_PFA_HI_OVER_TEMP_PLANAR */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_UPPER_MAJOR | SAHPI_ES_UPPER_MINOR, .recovery_state = SAHPI_ES_UNSPECIFIED, }, {}, }, }, .comment = "Planar temperature sensor" }, /* CPU area thermal sensor on planar */ { .index = 2, .sensor = { .Num = 2, .Type = SAHPI_TEMPERATURE, .Category = SAHPI_EC_THRESHOLD, .EnableCtrl = SAHPI_FALSE, .EventCtrl = SAHPI_SEC_READ_ONLY, .Events = SAHPI_ES_UPPER_MINOR | SAHPI_ES_UPPER_MAJOR | SAHPI_ES_UPPER_CRIT, .DataFormat = { .IsSupported = SAHPI_TRUE, .ReadingType = SAHPI_SENSOR_READING_TYPE_FLOAT64, .BaseUnits = SAHPI_SU_DEGREES_C, .ModifierUnits = SAHPI_SU_UNSPECIFIED, .ModifierUse = SAHPI_SMUU_NONE, .Percentage = SAHPI_FALSE, .Range = { .Flags = SAHPI_SRF_MAX | SAHPI_SRF_MIN, .Max = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, .Value = { .SensorFloat64 = 125, }, }, .Min = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, .Value = { .SensorFloat64 = 0, }, }, }, }, .ThresholdDefn = { .IsAccessible = SAHPI_TRUE, .ReadThold = SAHPI_STM_UP_MAJOR | SAHPI_STM_UP_CRIT | SAHPI_STM_UP_HYSTERESIS, .WriteThold = 0, }, .Oem = 0, }, .sensor_info = { .mib = { .not_avail_indicator_num = 0, .write_only = 0, .oid = ".1.3.6.1.4.1.2.3.51.1.2.20.1.1.1.1.3.3", .loc_offset = 0, .threshold_oids = { .UpCritical = ".1.3.6.1.4.1.2.3.51.1.2.20.1.1.1.1.4.3", .UpMajor = ".1.3.6.1.4.1.2.3.51.1.2.20.1.1.1.1.6.3", .TotalPosThdHysteresis = ".1.3.6.1.4.1.2.3.51.1.2.20.1.1.1.1.7.3", }, }, .cur_state = SAHPI_ES_UNSPECIFIED, .sensor_enabled = SAHPI_TRUE, .events_enabled = SAHPI_TRUE, .assert_mask = SAHPI_ES_UPPER_MINOR | SAHPI_ES_UPPER_MAJOR | SAHPI_ES_UPPER_CRIT, .deassert_mask = SAHPI_ES_UPPER_MINOR | SAHPI_ES_UPPER_MAJOR | SAHPI_ES_UPPER_CRIT, .event_array = { { .event = "0401C480", /* EN_CUTOFF_HI_OVER_TEMP_PROC */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_TRUE, .event_res_failure_unexpected = SAHPI_TRUE, .event_state = SAHPI_ES_UPPER_CRIT | SAHPI_ES_UPPER_MAJOR | SAHPI_ES_UPPER_MINOR, .recovery_state = SAHPI_ES_UPPER_MAJOR | SAHPI_ES_UPPER_MINOR, }, { .event = "0401D400", /* EN_PFA_HI_OVER_TEMP_PROC */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_UPPER_MAJOR | SAHPI_ES_UPPER_MINOR, .recovery_state = SAHPI_ES_UNSPECIFIED, }, {}, }, }, .comment = "Planar CPU area temperature sensor" }, /* I/O thermal sensor on planar */ { .index = 3, .sensor = { .Num = 3, .Type = SAHPI_TEMPERATURE, .Category = SAHPI_EC_THRESHOLD, .EnableCtrl = SAHPI_FALSE, .EventCtrl = SAHPI_SEC_READ_ONLY, .Events = SAHPI_ES_UPPER_MINOR | SAHPI_ES_UPPER_MAJOR | SAHPI_ES_UPPER_CRIT, .DataFormat = { .IsSupported = SAHPI_TRUE, .ReadingType = SAHPI_SENSOR_READING_TYPE_FLOAT64, .BaseUnits = SAHPI_SU_DEGREES_C, .ModifierUnits = SAHPI_SU_UNSPECIFIED, .ModifierUse = SAHPI_SMUU_NONE, .Percentage = SAHPI_FALSE, .Range = { .Flags = SAHPI_SRF_MAX | SAHPI_SRF_MIN, .Max = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, .Value = { .SensorFloat64 = 125, }, }, .Min = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, .Value = { .SensorFloat64 = 0, }, }, }, }, .ThresholdDefn = { .IsAccessible = SAHPI_TRUE, .ReadThold = SAHPI_STM_UP_MAJOR | SAHPI_STM_UP_CRIT | SAHPI_STM_UP_HYSTERESIS, .WriteThold = 0, }, .Oem = 0, }, .sensor_info = { .mib = { .not_avail_indicator_num = 0, .write_only = 0, .oid = ".1.3.6.1.4.1.2.3.51.1.2.20.1.1.1.1.3.4", .loc_offset = 0, .threshold_oids = { .UpCritical = ".1.3.6.1.4.1.2.3.51.1.2.20.1.1.1.1.4.4", .UpMajor = ".1.3.6.1.4.1.2.3.51.1.2.20.1.1.1.1.6.4", .TotalPosThdHysteresis = ".1.3.6.1.4.1.2.3.51.1.2.20.1.1.1.1.7.4", }, }, .cur_state = SAHPI_ES_UNSPECIFIED, .sensor_enabled = SAHPI_TRUE, .events_enabled = SAHPI_TRUE, .assert_mask = SAHPI_ES_UPPER_MINOR | SAHPI_ES_UPPER_MAJOR | SAHPI_ES_UPPER_CRIT, .deassert_mask = SAHPI_ES_UPPER_MINOR | SAHPI_ES_UPPER_MAJOR | SAHPI_ES_UPPER_CRIT, .event_array = { {}, }, }, .comment = "Planar I/O area temperature sensor" }, /* System ambient thermal sensor on planar */ { .index = 4, .sensor = { .Num = 4, .Type = SAHPI_TEMPERATURE, .Category = SAHPI_EC_THRESHOLD, .EnableCtrl = SAHPI_FALSE, .EventCtrl = SAHPI_SEC_READ_ONLY, .Events = SAHPI_ES_UPPER_MINOR | SAHPI_ES_UPPER_MAJOR | SAHPI_ES_UPPER_CRIT, .DataFormat = { .IsSupported = SAHPI_TRUE, .ReadingType = SAHPI_SENSOR_READING_TYPE_FLOAT64, .BaseUnits = SAHPI_SU_DEGREES_C, .ModifierUnits = SAHPI_SU_UNSPECIFIED, .ModifierUse = SAHPI_SMUU_NONE, .Percentage = SAHPI_FALSE, .Range = { .Flags = SAHPI_SRF_MAX | SAHPI_SRF_MIN, .Max = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, .Value = { .SensorFloat64 = 125, }, }, .Min = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, .Value = { .SensorFloat64 = 0, }, }, }, }, .ThresholdDefn = { .IsAccessible = SAHPI_TRUE, .ReadThold = SAHPI_STM_UP_MAJOR | SAHPI_STM_UP_CRIT | SAHPI_STM_UP_HYSTERESIS, .WriteThold = 0, }, .Oem = 0, }, .sensor_info = { .mib = { .not_avail_indicator_num = 0, .write_only = 0, .oid = ".1.3.6.1.4.1.2.3.51.1.2.20.1.1.1.1.3.5", .loc_offset = 0, .threshold_oids = { .UpCritical = ".1.3.6.1.4.1.2.3.51.1.2.20.1.1.1.1.4.5", .UpMajor = ".1.3.6.1.4.1.2.3.51.1.2.20.1.1.1.1.6.5", .TotalPosThdHysteresis = ".1.3.6.1.4.1.2.3.51.1.2.20.1.1.1.1.7.5", }, }, .cur_state = SAHPI_ES_UNSPECIFIED, .sensor_enabled = SAHPI_TRUE, .events_enabled = SAHPI_TRUE, .assert_mask = SAHPI_ES_UPPER_MINOR | SAHPI_ES_UPPER_MAJOR | SAHPI_ES_UPPER_CRIT, .deassert_mask = SAHPI_ES_UPPER_MINOR | SAHPI_ES_UPPER_MAJOR | SAHPI_ES_UPPER_CRIT, .event_array = { { .event = "00000064", /* EN_TEMP */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_TRUE, .event_res_failure_unexpected = SAHPI_TRUE, .event_state = SAHPI_ES_UPPER_CRIT | SAHPI_ES_UPPER_MAJOR | SAHPI_ES_UPPER_MINOR, .recovery_state = SAHPI_ES_UPPER_MAJOR | SAHPI_ES_UPPER_MINOR, }, { .event = "0001C000", /* EN_OVER_TEMP */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_TRUE, .event_res_failure_unexpected = SAHPI_TRUE, .event_state = SAHPI_ES_UPPER_CRIT | SAHPI_ES_UPPER_MAJOR | SAHPI_ES_UPPER_MINOR, .recovery_state = SAHPI_ES_UPPER_MAJOR | SAHPI_ES_UPPER_MINOR, }, { .event = "0001C080", /* EN_OVER_TEMP_AMBIENT */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_TRUE, .event_res_failure_unexpected = SAHPI_TRUE, .event_state = SAHPI_ES_UPPER_CRIT | SAHPI_ES_UPPER_MAJOR | SAHPI_ES_UPPER_MINOR, .recovery_state = SAHPI_ES_UPPER_MAJOR | SAHPI_ES_UPPER_MINOR, }, { .event = "0001C480", /* EN_CUTOFF_HI_OVER_TEMP_AMBIENT */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_TRUE, .event_res_failure_unexpected = SAHPI_TRUE, .event_state = SAHPI_ES_UPPER_CRIT | SAHPI_ES_UPPER_MAJOR | SAHPI_ES_UPPER_MINOR, .recovery_state = SAHPI_ES_UPPER_MAJOR | SAHPI_ES_UPPER_MINOR, }, { .event = "0001D500", /* EN_PFA_HI_OVER_TEMP_AMBIENT */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_UPPER_MAJOR | SAHPI_ES_UPPER_MINOR, .recovery_state = SAHPI_ES_UNSPECIFIED, }, { .event = "0000006E", /* EN_NC_TEMP */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_UPPER_MAJOR | SAHPI_ES_UPPER_MINOR, .recovery_state = SAHPI_ES_UNSPECIFIED, }, {}, }, }, .comment = "Planar system ambient temperature sensor" }, /* Memory thermal sensor on planar */ { .index = 5, .sensor = { .Num = 5, .Type = SAHPI_TEMPERATURE, .Category = SAHPI_EC_THRESHOLD, .EnableCtrl = SAHPI_FALSE, .EventCtrl = SAHPI_SEC_READ_ONLY, .Events = SAHPI_ES_UPPER_MINOR | SAHPI_ES_UPPER_MAJOR | SAHPI_ES_UPPER_CRIT, .DataFormat = { .IsSupported = SAHPI_TRUE, .ReadingType = SAHPI_SENSOR_READING_TYPE_FLOAT64, .BaseUnits = SAHPI_SU_DEGREES_C, .ModifierUnits = SAHPI_SU_UNSPECIFIED, .ModifierUse = SAHPI_SMUU_NONE, .Percentage = SAHPI_FALSE, .Range = { .Flags = SAHPI_SRF_MAX | SAHPI_SRF_MIN, .Max = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, .Value = { .SensorFloat64 = 125, }, }, .Min = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, .Value = { .SensorFloat64 = 0, }, }, }, }, .ThresholdDefn = { .IsAccessible = SAHPI_TRUE, .ReadThold = SAHPI_STM_UP_MAJOR | SAHPI_STM_UP_CRIT | SAHPI_STM_UP_HYSTERESIS, .WriteThold = 0, }, .Oem = 0, }, .sensor_info = { .mib = { .not_avail_indicator_num = 0, .write_only = 0, .oid = ".1.3.6.1.4.1.2.3.51.1.2.20.1.1.1.1.3.6", .loc_offset = 0, .threshold_oids = { .UpCritical = ".1.3.6.1.4.1.2.3.51.1.2.20.1.1.1.1.4.6", .UpMajor = ".1.3.6.1.4.1.2.3.51.1.2.20.1.1.1.1.6.6", .TotalPosThdHysteresis = ".1.3.6.1.4.1.2.3.51.1.2.20.1.1.1.1.7.6", }, }, .cur_state = SAHPI_ES_UNSPECIFIED, .sensor_enabled = SAHPI_TRUE, .events_enabled = SAHPI_TRUE, .assert_mask = SAHPI_ES_UPPER_MINOR | SAHPI_ES_UPPER_MAJOR | SAHPI_ES_UPPER_CRIT, .deassert_mask = SAHPI_ES_UPPER_MINOR | SAHPI_ES_UPPER_MAJOR | SAHPI_ES_UPPER_CRIT, .event_array = { { .event = "0501C480", /* EN_CUTOFF_HI_OVER_TEMP_MEM_AREA */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_TRUE, .event_res_failure_unexpected = SAHPI_TRUE, .event_state = SAHPI_ES_UPPER_CRIT | SAHPI_ES_UPPER_MAJOR | SAHPI_ES_UPPER_MINOR, .recovery_state = SAHPI_ES_UPPER_MAJOR | SAHPI_ES_UPPER_MINOR, }, { .event = "0501C481", /* EN_CUTOFF_HI_OVER_TEMP_MEMORY1 */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_TRUE, .event_res_failure_unexpected = SAHPI_TRUE, .event_state = SAHPI_ES_UPPER_CRIT | SAHPI_ES_UPPER_MAJOR | SAHPI_ES_UPPER_MINOR, .recovery_state = SAHPI_ES_UPPER_MAJOR | SAHPI_ES_UPPER_MINOR, }, { .event = "0501C482", /* EN_CUTOFF_HI_OVER_TEMP_MEMORY2 */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_TRUE, .event_res_failure_unexpected = SAHPI_TRUE, .event_state = SAHPI_ES_UPPER_CRIT | SAHPI_ES_UPPER_MAJOR | SAHPI_ES_UPPER_MINOR, .recovery_state = SAHPI_ES_UPPER_MAJOR | SAHPI_ES_UPPER_MINOR, }, { .event = "0501D400", /* EN_PFA_HI_OVER_TEMP_MEM_AREA */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_UPPER_MAJOR | SAHPI_ES_UPPER_MINOR, .recovery_state = SAHPI_ES_UNSPECIFIED, }, { .event = "0501D501", /* EN_PFA_HI_OVER_TEMP_MEMORY1 */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_UPPER_MAJOR | SAHPI_ES_UPPER_MINOR, .recovery_state = SAHPI_ES_UNSPECIFIED, }, { .event = "0501D502", /* EN_PFA_HI_OVER_TEMP_MEMORY2 */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_UPPER_MAJOR | SAHPI_ES_UPPER_MINOR, .recovery_state = SAHPI_ES_UNSPECIFIED, }, {}, }, }, .comment = "Planar memory temperature sensor" }, /* 5V sensor */ { .index = 6, .sensor = { .Num = 6, .Type = SAHPI_VOLTAGE, .Category = SAHPI_EC_THRESHOLD, .EnableCtrl = SAHPI_FALSE, .EventCtrl = SAHPI_SEC_READ_ONLY, .Events = SAHPI_ES_LOWER_MINOR | SAHPI_ES_LOWER_MAJOR | SAHPI_ES_LOWER_CRIT | SAHPI_ES_UPPER_MINOR | SAHPI_ES_UPPER_MAJOR | SAHPI_ES_UPPER_CRIT, .DataFormat = { .IsSupported = SAHPI_TRUE, .ReadingType = SAHPI_SENSOR_READING_TYPE_FLOAT64, .BaseUnits = SAHPI_SU_VOLTS, .ModifierUnits = SAHPI_SU_UNSPECIFIED, .ModifierUse = SAHPI_SMUU_NONE, .Percentage = SAHPI_FALSE, .Range = { .Flags = SAHPI_SRF_MAX | SAHPI_SRF_MIN | SAHPI_SRF_NOMINAL, .Max = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, .Value = { .SensorFloat64 = 6.7, }, }, .Nominal = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, .Value = { .SensorFloat64 = 5, }, }, .Min = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, .Value = { .SensorFloat64 = 0, }, }, }, }, .ThresholdDefn = { .IsAccessible = SAHPI_TRUE, .ReadThold = SAHPI_STM_LOW_MAJOR | SAHPI_STM_LOW_CRIT | SAHPI_STM_UP_MAJOR | SAHPI_STM_UP_CRIT | SAHPI_STM_LOW_HYSTERESIS | SAHPI_STM_UP_HYSTERESIS, .WriteThold = 0, }, .Oem = 0, }, .sensor_info = { .mib = { .not_avail_indicator_num = 0, .write_only = 0, .oid = ".1.3.6.1.4.1.2.3.51.1.2.20.2.1.1.3.1", .loc_offset = 0, .threshold_oids = { .LowCritical = ".1.3.6.1.4.1.2.3.51.1.2.20.2.1.1.8.1", .LowMajor = ".1.3.6.1.4.1.2.3.51.1.2.20.2.1.1.10.1", .UpCritical = ".1.3.6.1.4.1.2.3.51.1.2.20.2.1.1.4.1", .UpMajor = ".1.3.6.1.4.1.2.3.51.1.2.20.2.1.1.6.1", .TotalPosThdHysteresis = ".1.3.6.1.4.1.2.3.51.1.2.20.2.1.1.7.1", .TotalNegThdHysteresis = ".1.3.6.1.4.1.2.3.51.1.2.20.2.1.1.11.1", }, }, .cur_state = SAHPI_ES_UNSPECIFIED, .sensor_enabled = SAHPI_TRUE, .events_enabled = SAHPI_TRUE, .assert_mask = SAHPI_ES_LOWER_MINOR | SAHPI_ES_LOWER_MAJOR | SAHPI_ES_LOWER_CRIT | SAHPI_ES_UPPER_MINOR | SAHPI_ES_UPPER_MAJOR | SAHPI_ES_UPPER_CRIT, .deassert_mask = SAHPI_ES_LOWER_MINOR | SAHPI_ES_LOWER_MAJOR | SAHPI_ES_LOWER_CRIT | SAHPI_ES_UPPER_MINOR | SAHPI_ES_UPPER_MAJOR | SAHPI_ES_UPPER_CRIT, .event_array = { { .event = "06034480", /* EN_CUTOFF_HI_FAULT_PLANAR_5V */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_TRUE, .event_res_failure_unexpected = SAHPI_TRUE, .event_state = SAHPI_ES_UPPER_CRIT, .recovery_state = SAHPI_ES_UPPER_MAJOR | SAHPI_ES_UPPER_MINOR, }, { .event = "06034800", /* EN_CUTOFF_LO_FAULT_PLANAR_5V */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_TRUE, .event_res_failure_unexpected = SAHPI_TRUE, .event_state = SAHPI_ES_LOWER_CRIT, .recovery_state = SAHPI_ES_LOWER_MAJOR | SAHPI_ES_LOWER_MINOR, }, { .event = "08034480", /* EN_CUTOFF_HI_FAULT_5V */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_TRUE, .event_res_failure_unexpected = SAHPI_TRUE, .event_state = SAHPI_ES_UPPER_CRIT, .recovery_state = SAHPI_ES_UPPER_MAJOR | SAHPI_ES_UPPER_MINOR, }, { .event = "08034800", /* EN_CUTOFF_LO_FAULT_5V */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_TRUE, .event_res_failure_unexpected = SAHPI_TRUE, .event_state = SAHPI_ES_LOWER_CRIT, .recovery_state = SAHPI_ES_LOWER_MAJOR | SAHPI_ES_LOWER_MINOR, }, { .event = "06035500", /* EN_PFA_HI_FAULT_PLANAR_5V */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_UPPER_MAJOR, .recovery_state = SAHPI_ES_UNSPECIFIED, }, { .event = "06035800", /* EN_PFA_LO_FAULT_PLANAR_5V */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_LOWER_MAJOR, .recovery_state = SAHPI_ES_UNSPECIFIED, }, {}, }, }, .comment = "5 volt sensor" }, /* 3.3V sensor */ { .index = 7, .sensor = { .Num = 7, .Type = SAHPI_VOLTAGE, .Category = SAHPI_EC_THRESHOLD, .EnableCtrl = SAHPI_FALSE, .EventCtrl = SAHPI_SEC_READ_ONLY, .Events = SAHPI_ES_LOWER_MINOR | SAHPI_ES_LOWER_MAJOR | SAHPI_ES_LOWER_CRIT | SAHPI_ES_UPPER_MINOR | SAHPI_ES_UPPER_MAJOR | SAHPI_ES_UPPER_CRIT, .DataFormat = { .IsSupported = SAHPI_TRUE, .ReadingType = SAHPI_SENSOR_READING_TYPE_FLOAT64, .BaseUnits = SAHPI_SU_VOLTS, .ModifierUnits = SAHPI_SU_UNSPECIFIED, .ModifierUse = SAHPI_SMUU_NONE, .Percentage = SAHPI_FALSE, .Range = { .Flags = SAHPI_SRF_MAX | SAHPI_SRF_MIN | SAHPI_SRF_NOMINAL, .Max = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, .Value = { .SensorFloat64 = 3.6, }, }, .Nominal = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, .Value = { .SensorFloat64 = 3.3, }, }, .Min = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, .Value = { .SensorFloat64 = 0, }, }, }, }, .ThresholdDefn = { .IsAccessible = SAHPI_TRUE, .ReadThold = SAHPI_STM_LOW_MAJOR | SAHPI_STM_LOW_CRIT | SAHPI_STM_UP_MAJOR | SAHPI_STM_UP_CRIT | SAHPI_STM_LOW_HYSTERESIS | SAHPI_STM_UP_HYSTERESIS, .WriteThold = 0, }, .Oem = 0, }, .sensor_info = { .mib = { .not_avail_indicator_num = 0, .write_only = 0, .oid = ".1.3.6.1.4.1.2.3.51.1.2.20.2.1.1.3.2", .loc_offset = 0, .threshold_oids = { .LowCritical = ".1.3.6.1.4.1.2.3.51.1.2.20.2.1.1.8.2", .LowMajor = ".1.3.6.1.4.1.2.3.51.1.2.20.2.1.1.10.2", .UpCritical = ".1.3.6.1.4.1.2.3.51.1.2.20.2.1.1.4.2", .UpMajor = ".1.3.6.1.4.1.2.3.51.1.2.20.2.1.1.6.2", .TotalPosThdHysteresis = ".1.3.6.1.4.1.2.3.51.1.2.20.2.1.1.7.2", .TotalNegThdHysteresis = ".1.3.6.1.4.1.2.3.51.1.2.20.2.1.1.11.2", }, }, .cur_state = SAHPI_ES_UNSPECIFIED, .events_enabled = SAHPI_TRUE, .assert_mask = SAHPI_ES_LOWER_MINOR | SAHPI_ES_LOWER_MAJOR | SAHPI_ES_LOWER_CRIT | SAHPI_ES_UPPER_MINOR | SAHPI_ES_UPPER_MAJOR | SAHPI_ES_UPPER_CRIT, .deassert_mask = SAHPI_ES_LOWER_MINOR | SAHPI_ES_LOWER_MAJOR | SAHPI_ES_LOWER_CRIT | SAHPI_ES_UPPER_MINOR | SAHPI_ES_UPPER_MAJOR | SAHPI_ES_UPPER_CRIT, .event_array = { { .event = "08032480", /* EN_CUTOFF_HI_FAULT_3_35V */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_TRUE, .event_res_failure_unexpected = SAHPI_TRUE, .event_state = SAHPI_ES_UPPER_CRIT, .recovery_state = SAHPI_ES_UPPER_MAJOR | SAHPI_ES_UPPER_MINOR, }, { .event = "08032880", /* EN_CUTOFF_LO_FAULT_3_35V */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_TRUE, .event_res_failure_unexpected = SAHPI_TRUE, .event_state = SAHPI_ES_LOWER_CRIT, .recovery_state = SAHPI_ES_LOWER_MAJOR | SAHPI_ES_LOWER_MINOR, }, { .event = "0002C480", /* EN_CUTOFF_HI_FAULT_3_35V_CONT */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_TRUE, .event_res_failure_unexpected = SAHPI_TRUE, .event_state = SAHPI_ES_UPPER_CRIT, .recovery_state = SAHPI_ES_UPPER_MAJOR | SAHPI_ES_UPPER_MINOR, }, { .event = "0002C880", /* EN_CUTOFF_LO_FAULT_3_35V_CONT */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_TRUE, .event_res_failure_unexpected = SAHPI_TRUE, .event_state = SAHPI_ES_LOWER_CRIT, .recovery_state = SAHPI_ES_LOWER_MAJOR | SAHPI_ES_LOWER_MINOR, }, { .event = "08033480", /* EN_PFA_HI_FAULT_3_35V */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_UPPER_MAJOR, .recovery_state = SAHPI_ES_UNSPECIFIED, }, { .event = "08033880", /* EN_PFA_LO_FAULT_3_35V */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_LOWER_MAJOR, .recovery_state = SAHPI_ES_UNSPECIFIED, }, { .event = "0002D400", /* EN_PFA_HI_FAULT_3_35V_CONT */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_UPPER_MAJOR, .recovery_state = SAHPI_ES_UNSPECIFIED, }, { .event = "0002D800", /* EN_PFA_LO_FAULT_3_35V_CONT */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_LOWER_MAJOR, .recovery_state = SAHPI_ES_UNSPECIFIED, }, {}, }, }, .comment = "3.3 volt sensor" }, /* 12V sensor */ { .index = 8, .sensor = { .Num = 8, .Type = SAHPI_VOLTAGE, .Category = SAHPI_EC_THRESHOLD, .EnableCtrl = SAHPI_FALSE, .EventCtrl = SAHPI_SEC_READ_ONLY, .Events = SAHPI_ES_LOWER_MINOR | SAHPI_ES_LOWER_MAJOR | SAHPI_ES_LOWER_CRIT | SAHPI_ES_UPPER_MINOR | SAHPI_ES_UPPER_MAJOR | SAHPI_ES_UPPER_CRIT, .DataFormat = { .IsSupported = SAHPI_TRUE, .ReadingType = SAHPI_SENSOR_READING_TYPE_FLOAT64, .BaseUnits = SAHPI_SU_VOLTS, .ModifierUnits = SAHPI_SU_UNSPECIFIED, .ModifierUse = SAHPI_SMUU_NONE, .Percentage = SAHPI_FALSE, .Range = { .Flags = SAHPI_SRF_MAX | SAHPI_SRF_MIN | SAHPI_SRF_NOMINAL, .Max = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, .Value = { .SensorFloat64 = 16, }, }, .Nominal = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, .Value = { .SensorFloat64 = 12, }, }, .Min = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, .Value = { .SensorFloat64 = 0, }, }, }, }, .ThresholdDefn = { .IsAccessible = SAHPI_TRUE, .ReadThold = SAHPI_STM_LOW_MAJOR | SAHPI_STM_LOW_CRIT | SAHPI_STM_UP_MAJOR | SAHPI_STM_UP_CRIT | SAHPI_STM_LOW_HYSTERESIS | SAHPI_STM_UP_HYSTERESIS, .WriteThold = 0, }, .Oem = 0, }, .sensor_info = { .mib = { .not_avail_indicator_num = 0, .write_only = 0, .oid = ".1.3.6.1.4.1.2.3.51.1.2.20.2.1.1.3.3", .loc_offset = 0, .threshold_oids = { .LowCritical = ".1.3.6.1.4.1.2.3.51.1.2.20.2.1.1.8.3", .LowMajor = ".1.3.6.1.4.1.2.3.51.1.2.20.2.1.1.10.3", .UpCritical = ".1.3.6.1.4.1.2.3.51.1.2.20.2.1.1.4.3", .UpMajor = ".1.3.6.1.4.1.2.3.51.1.2.20.2.1.1.6.3", .TotalPosThdHysteresis = ".1.3.6.1.4.1.2.3.51.1.2.20.2.1.1.7.3", .TotalNegThdHysteresis = ".1.3.6.1.4.1.2.3.51.1.2.20.2.1.1.11.3", }, }, .cur_state = SAHPI_ES_UNSPECIFIED, .sensor_enabled = SAHPI_TRUE, .events_enabled = SAHPI_TRUE, .assert_mask = SAHPI_ES_LOWER_MINOR | SAHPI_ES_LOWER_MAJOR | SAHPI_ES_LOWER_CRIT | SAHPI_ES_UPPER_MINOR | SAHPI_ES_UPPER_MAJOR | SAHPI_ES_UPPER_CRIT, .deassert_mask = SAHPI_ES_LOWER_MINOR | SAHPI_ES_LOWER_MAJOR | SAHPI_ES_LOWER_CRIT | SAHPI_ES_UPPER_MINOR | SAHPI_ES_UPPER_MAJOR | SAHPI_ES_UPPER_CRIT, .event_array = { { .event = "06036480", /* EN_CUTOFF_HI_FAULT_12V_PLANAR */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_TRUE, .event_res_failure_unexpected = SAHPI_TRUE, .event_state = SAHPI_ES_UPPER_CRIT, .recovery_state = SAHPI_ES_UPPER_MAJOR | SAHPI_ES_UPPER_MINOR, }, { .event = "06036800", /* EN_CUTOFF_LO_FAULT_12V_PLANAR */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_TRUE, .event_res_failure_unexpected = SAHPI_TRUE, .event_state = SAHPI_ES_LOWER_CRIT, .recovery_state = SAHPI_ES_LOWER_MAJOR | SAHPI_ES_LOWER_MINOR, }, { .event = "06037500", /* EN_PFA_HI_FAULT_12V_PLANAR */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_UPPER_MAJOR, .recovery_state = SAHPI_ES_UNSPECIFIED, }, { .event = "06037800", /* EN_PFA_LO_FAULT_12V_PLANAR */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_LOWER_MAJOR, .recovery_state = SAHPI_ES_UNSPECIFIED, }, {}, }, }, .comment = "12 volt sensor" }, /* -12V voltage sensor on Chassis */ { .index = 9, .sensor = { .Num = 9, .Type = SAHPI_VOLTAGE, .Category = SAHPI_EC_THRESHOLD, .EnableCtrl = SAHPI_FALSE, .EventCtrl = SAHPI_SEC_READ_ONLY, .Events = SAHPI_ES_LOWER_MINOR | SAHPI_ES_LOWER_MAJOR | SAHPI_ES_LOWER_CRIT | SAHPI_ES_UPPER_MINOR | SAHPI_ES_UPPER_MAJOR | SAHPI_ES_UPPER_CRIT, .DataFormat = { .IsSupported = SAHPI_TRUE, .ReadingType = SAHPI_SENSOR_READING_TYPE_FLOAT64, .BaseUnits = SAHPI_SU_VOLTS, .ModifierUnits = SAHPI_SU_UNSPECIFIED, .ModifierUse = SAHPI_SMUU_NONE, .Percentage = SAHPI_FALSE, .Range = { .Flags = SAHPI_SRF_MAX | SAHPI_SRF_MIN | SAHPI_SRF_NOMINAL, .Max = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, .Value = { .SensorFloat64 = 0, }, }, .Nominal = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, .Value = { .SensorFloat64 = -12, }, }, .Min = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, .Value = { .SensorFloat64 = -16, }, }, }, }, .ThresholdDefn = { .IsAccessible = SAHPI_TRUE, .ReadThold = SAHPI_STM_LOW_MAJOR | SAHPI_STM_LOW_CRIT | SAHPI_STM_UP_MAJOR | SAHPI_STM_UP_CRIT | SAHPI_STM_LOW_HYSTERESIS | SAHPI_STM_UP_HYSTERESIS, .WriteThold = 0, }, .Oem = 0, }, .sensor_info = { .mib = { .not_avail_indicator_num = 0, .write_only = 0, .oid = ".1.3.6.1.4.1.2.3.51.1.2.20.2.1.1.3.4", .loc_offset = 0, .threshold_oids = { .LowCritical = ".1.3.6.1.4.1.2.3.51.1.2.20.2.1.1.8.4", .LowMajor = ".1.3.6.1.4.1.2.3.51.1.2.20.2.1.1.10.4", .UpCritical = ".1.3.6.1.4.1.2.3.51.1.2.20.2.1.1.4.4", .UpMajor = ".1.3.6.1.4.1.2.3.51.1.2.20.2.1.1.6.4", .TotalPosThdHysteresis = ".1.3.6.1.4.1.2.3.51.1.2.20.2.1.1.7.4", .TotalNegThdHysteresis = ".1.3.6.1.4.1.2.3.51.1.2.20.2.1.1.11.4", }, }, .cur_state = SAHPI_ES_UNSPECIFIED, .sensor_enabled = SAHPI_TRUE, .events_enabled = SAHPI_TRUE, .assert_mask = SAHPI_ES_LOWER_MINOR | SAHPI_ES_LOWER_MAJOR | SAHPI_ES_LOWER_CRIT | SAHPI_ES_UPPER_MINOR | SAHPI_ES_UPPER_MAJOR | SAHPI_ES_UPPER_CRIT, .deassert_mask = SAHPI_ES_LOWER_MINOR | SAHPI_ES_LOWER_MAJOR | SAHPI_ES_LOWER_CRIT | SAHPI_ES_UPPER_MINOR | SAHPI_ES_UPPER_MAJOR | SAHPI_ES_UPPER_CRIT, .event_array = { { .event = "0803E480", /* EN_CUTOFF_HI_FAULT_N12V */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_TRUE, .event_res_failure_unexpected = SAHPI_TRUE, .event_state = SAHPI_ES_UPPER_CRIT, .recovery_state = SAHPI_ES_UPPER_MAJOR | SAHPI_ES_UPPER_MINOR, }, { .event = "0803E800", /* EN_CUTOFF_LO_FAULT_N12V */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_TRUE, .event_res_failure_unexpected = SAHPI_TRUE, .event_state = SAHPI_ES_LOWER_CRIT, .recovery_state = SAHPI_ES_LOWER_MAJOR | SAHPI_ES_LOWER_MINOR, }, { .event = "0803F500", /* EN_PFA_HI_FAULT_N12V */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_UPPER_MAJOR, .recovery_state = SAHPI_ES_UNSPECIFIED, }, { .event = "0803F800", /* EN_PFA_LO_FAULT_N12V */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_LOWER_MAJOR, .recovery_state = SAHPI_ES_UNSPECIFIED, }, {}, }, }, .comment = "-12 volt sensor" }, /* -5V voltage sensor on Chassis */ { .index = 10, .sensor = { .Num = 10, .Type = SAHPI_VOLTAGE, .Category = SAHPI_EC_THRESHOLD, .EnableCtrl = SAHPI_FALSE, .EventCtrl = SAHPI_SEC_READ_ONLY, .Events = SAHPI_ES_LOWER_MINOR | SAHPI_ES_LOWER_MAJOR | SAHPI_ES_LOWER_CRIT | SAHPI_ES_UPPER_MINOR | SAHPI_ES_UPPER_MAJOR | SAHPI_ES_UPPER_CRIT, .DataFormat = { .IsSupported = SAHPI_TRUE, .ReadingType = SAHPI_SENSOR_READING_TYPE_FLOAT64, .BaseUnits = SAHPI_SU_VOLTS, .ModifierUnits = SAHPI_SU_UNSPECIFIED, .ModifierUse = SAHPI_SMUU_NONE, .Percentage = SAHPI_FALSE, .Range = { .Flags = SAHPI_SRF_MAX | SAHPI_SRF_MIN | SAHPI_SRF_NOMINAL, .Max = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, .Value = { .SensorFloat64 = 0, }, }, .Nominal = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, .Value = { .SensorFloat64 = -5, }, }, .Min = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, .Value = { .SensorFloat64 = -6.7, }, }, }, }, .ThresholdDefn = { .IsAccessible = SAHPI_TRUE, .ReadThold = SAHPI_STM_LOW_MAJOR | SAHPI_STM_LOW_CRIT | SAHPI_STM_UP_MAJOR | SAHPI_STM_UP_CRIT | SAHPI_STM_LOW_HYSTERESIS | SAHPI_STM_UP_HYSTERESIS, .WriteThold = 0, }, .Oem = 0, }, .sensor_info = { .mib = { .not_avail_indicator_num = 0, .write_only = 0, .oid = ".1.3.6.1.4.1.2.3.51.1.2.20.2.1.1.3.5", .loc_offset = 0, .threshold_oids = { .LowCritical = ".1.3.6.1.4.1.2.3.51.1.2.20.2.1.1.8.5", .LowMajor = ".1.3.6.1.4.1.2.3.51.1.2.20.2.1.1.10.5", .UpCritical = ".1.3.6.1.4.1.2.3.51.1.2.20.2.1.1.4.5", .UpMajor = ".1.3.6.1.4.1.2.3.51.1.2.20.2.1.1.6.5", .TotalPosThdHysteresis = ".1.3.6.1.4.1.2.3.51.1.2.20.2.1.1.7.5", .TotalNegThdHysteresis = ".1.3.6.1.4.1.2.3.51.1.2.20.2.1.1.11.5", }, }, .cur_state = SAHPI_ES_UNSPECIFIED, .event_array = { { .event = "0803C480", /* EN_CUTOFF_HI_FAULT_N5V */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_TRUE, .event_res_failure_unexpected = SAHPI_TRUE, .event_state = SAHPI_ES_UPPER_CRIT, .recovery_state = SAHPI_ES_UPPER_MAJOR | SAHPI_ES_UPPER_MINOR, }, { .event = "0803C800", /* EN_CUTOFF_LO_FAULT_N5V */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_TRUE, .event_res_failure_unexpected = SAHPI_TRUE, .event_state = SAHPI_ES_LOWER_CRIT, .recovery_state = SAHPI_ES_LOWER_MAJOR | SAHPI_ES_LOWER_MINOR, }, { .event = "0803D500", /* EN_PFA_HI_FAULT_N5V */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_UPPER_MAJOR, .recovery_state = SAHPI_ES_UNSPECIFIED, }, { .event = "0803D800", /* EN_PFA_LO_FAULT_N5V */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_LOWER_MAJOR, .recovery_state = SAHPI_ES_UNSPECIFIED, }, {}, }, }, .comment = "-5 volt sensor" }, /* 2.5V voltage sensor on Chassis */ { .index = 11, .sensor = { .Num = 11, .Type = SAHPI_VOLTAGE, .Category = SAHPI_EC_THRESHOLD, .EnableCtrl = SAHPI_FALSE, .EventCtrl = SAHPI_SEC_READ_ONLY, .Events = SAHPI_ES_LOWER_MINOR | SAHPI_ES_LOWER_MAJOR | SAHPI_ES_LOWER_CRIT | SAHPI_ES_UPPER_MINOR | SAHPI_ES_UPPER_MAJOR | SAHPI_ES_UPPER_CRIT, .DataFormat = { .IsSupported = SAHPI_TRUE, .ReadingType = SAHPI_SENSOR_READING_TYPE_FLOAT64, .BaseUnits = SAHPI_SU_VOLTS, .ModifierUnits = SAHPI_SU_UNSPECIFIED, .ModifierUse = SAHPI_SMUU_NONE, .Percentage = SAHPI_FALSE, .Range = { .Flags = SAHPI_SRF_MAX | SAHPI_SRF_MIN | SAHPI_SRF_NOMINAL, .Max = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, .Value = { .SensorFloat64 = 4.4, }, }, .Nominal = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, .Value = { .SensorFloat64 = 2.5, }, }, .Min = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, .Value = { .SensorFloat64 = 0, }, }, }, }, .ThresholdDefn = { .IsAccessible = SAHPI_TRUE, .ReadThold = SAHPI_STM_LOW_MAJOR | SAHPI_STM_LOW_CRIT | SAHPI_STM_UP_MAJOR | SAHPI_STM_UP_CRIT | SAHPI_STM_LOW_HYSTERESIS | SAHPI_STM_UP_HYSTERESIS, .WriteThold = 0, }, .Oem = 0, }, .sensor_info = { .mib = { .not_avail_indicator_num = 0, .write_only = 0, .oid = ".1.3.6.1.4.1.2.3.51.1.2.20.2.1.1.3.6", .loc_offset = 0, .threshold_oids = { .LowCritical = ".1.3.6.1.4.1.2.3.51.1.2.20.2.1.1.8.6", .LowMajor = ".1.3.6.1.4.1.2.3.51.1.2.20.2.1.1.10.6", .UpCritical = ".1.3.6.1.4.1.2.3.51.1.2.20.2.1.1.4.6", .UpMajor = ".1.3.6.1.4.1.2.3.51.1.2.20.2.1.1.6.6", .TotalPosThdHysteresis = ".1.3.6.1.4.1.2.3.51.1.2.20.2.1.1.7.6", .TotalNegThdHysteresis = ".1.3.6.1.4.1.2.3.51.1.2.20.2.1.1.11.6", }, }, .cur_state = SAHPI_ES_UNSPECIFIED, .sensor_enabled = SAHPI_TRUE, .events_enabled = SAHPI_TRUE, .assert_mask = SAHPI_ES_LOWER_MINOR | SAHPI_ES_LOWER_MAJOR | SAHPI_ES_LOWER_CRIT | SAHPI_ES_UPPER_MINOR | SAHPI_ES_UPPER_MAJOR | SAHPI_ES_UPPER_CRIT, .deassert_mask = SAHPI_ES_LOWER_MINOR | SAHPI_ES_LOWER_MAJOR | SAHPI_ES_LOWER_CRIT | SAHPI_ES_UPPER_MINOR | SAHPI_ES_UPPER_MAJOR | SAHPI_ES_UPPER_CRIT, .event_array = { { .event = "08030480", /* EN_CUTOFF_HI_FAULT_2_5V */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_TRUE, .event_res_failure_unexpected = SAHPI_TRUE, .event_state = SAHPI_ES_UPPER_CRIT, .recovery_state = SAHPI_ES_UPPER_MAJOR | SAHPI_ES_UPPER_MINOR, }, { .event = "08030880", /* EN_CUTOFF_LO_FAULT_2_5V */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_TRUE, .event_res_failure_unexpected = SAHPI_TRUE, .event_state = SAHPI_ES_LOWER_CRIT, .recovery_state = SAHPI_ES_LOWER_MAJOR | SAHPI_ES_LOWER_MINOR, }, { .event = "08031480", /* EN_PFA_HI_FAULT_2_5V */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_UPPER_MAJOR, .recovery_state = SAHPI_ES_UNSPECIFIED, }, { .event = "08031880", /* EN_PFA_LO_FAULT_2_5V */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_LOWER_MAJOR, .recovery_state = SAHPI_ES_UNSPECIFIED, }, {}, }, }, .comment = "2.5 volt sensor" }, /* 1.5V voltage sensor on Chassis */ { .index = 12, .sensor = { .Num = 12, .Type = SAHPI_VOLTAGE, .Category = SAHPI_EC_THRESHOLD, .EnableCtrl = SAHPI_FALSE, .EventCtrl = SAHPI_SEC_READ_ONLY, .Events = SAHPI_ES_LOWER_MINOR | SAHPI_ES_LOWER_MAJOR | SAHPI_ES_LOWER_CRIT | SAHPI_ES_UPPER_MINOR | SAHPI_ES_UPPER_MAJOR | SAHPI_ES_UPPER_CRIT, .DataFormat = { .IsSupported = SAHPI_TRUE, .ReadingType = SAHPI_SENSOR_READING_TYPE_FLOAT64, .BaseUnits = SAHPI_SU_VOLTS, .ModifierUnits = SAHPI_SU_UNSPECIFIED, .ModifierUse = SAHPI_SMUU_NONE, .Percentage = SAHPI_FALSE, .Range = { .Flags = SAHPI_SRF_MAX | SAHPI_SRF_MIN | SAHPI_SRF_NOMINAL, .Max = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, .Value = { .SensorFloat64 = 4.4, }, }, .Nominal = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, .Value = { .SensorFloat64 = 1.5, }, }, .Min = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, .Value = { .SensorFloat64 = 0, }, }, }, }, .ThresholdDefn = { .IsAccessible = SAHPI_TRUE, .ReadThold = SAHPI_STM_LOW_MAJOR | SAHPI_STM_LOW_CRIT | SAHPI_STM_UP_MAJOR | SAHPI_STM_UP_CRIT | SAHPI_STM_LOW_HYSTERESIS | SAHPI_STM_UP_HYSTERESIS, .WriteThold = 0, }, .Oem = 0, }, .sensor_info = { .mib = { .not_avail_indicator_num = 0, .write_only = 0, .oid = ".1.3.6.1.4.1.2.3.51.1.2.20.2.1.1.3.7", .loc_offset = 0, .threshold_oids = { .LowCritical = ".1.3.6.1.4.1.2.3.51.1.2.20.2.1.1.8.7", .LowMajor = ".1.3.6.1.4.1.2.3.51.1.2.20.2.1.1.10.7", .UpCritical = ".1.3.6.1.4.1.2.3.51.1.2.20.2.1.1.4.7", .UpMajor = ".1.3.6.1.4.1.2.3.51.1.2.20.2.1.1.6.7", .TotalPosThdHysteresis = ".1.3.6.1.4.1.2.3.51.1.2.20.2.1.1.7.7", .TotalNegThdHysteresis = ".1.3.6.1.4.1.2.3.51.1.2.20.2.1.1.11.7", }, }, .cur_state = SAHPI_ES_UNSPECIFIED, .sensor_enabled = SAHPI_TRUE, .events_enabled = SAHPI_TRUE, .assert_mask = SAHPI_ES_LOWER_MINOR | SAHPI_ES_LOWER_MAJOR | SAHPI_ES_LOWER_CRIT | SAHPI_ES_UPPER_MINOR | SAHPI_ES_UPPER_MAJOR | SAHPI_ES_UPPER_CRIT, .deassert_mask = SAHPI_ES_LOWER_MINOR | SAHPI_ES_LOWER_MAJOR | SAHPI_ES_LOWER_CRIT | SAHPI_ES_UPPER_MINOR | SAHPI_ES_UPPER_MAJOR | SAHPI_ES_UPPER_CRIT, .event_array = { { .event = "08040480", /* EN_CUTOFF_HI_FAULT_1_5V */ .event_state = SAHPI_ES_UPPER_CRIT, .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_TRUE, .event_res_failure_unexpected = SAHPI_TRUE, .recovery_state = SAHPI_ES_UPPER_MAJOR | SAHPI_ES_UPPER_MINOR, }, { .event = "08040880", /* EN_CUTOFF_LO_FAULT_1_5V */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_TRUE, .event_res_failure_unexpected = SAHPI_TRUE, .event_state = SAHPI_ES_LOWER_CRIT, .recovery_state = SAHPI_ES_LOWER_MAJOR | SAHPI_ES_LOWER_MINOR, }, { .event = "08041400", /* EN_PFA_HI_FAULT_1_5V */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_UPPER_MAJOR, .recovery_state = SAHPI_ES_UNSPECIFIED, }, { .event = "08041800", /* EN_PFA_LO_FAULT_1_5V */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_LOWER_MAJOR, .recovery_state = SAHPI_ES_UNSPECIFIED, }, {}, }, }, .comment = "1.5 volt sensor" }, /* 1.25V sensor on Chassis */ { .index = 13, .sensor = { .Num = 13, .Type = SAHPI_VOLTAGE, .Category = SAHPI_EC_THRESHOLD, .EnableCtrl = SAHPI_FALSE, .EventCtrl = SAHPI_SEC_READ_ONLY, .Events = SAHPI_ES_LOWER_MINOR | SAHPI_ES_LOWER_MAJOR | SAHPI_ES_LOWER_CRIT | SAHPI_ES_UPPER_MINOR | SAHPI_ES_UPPER_MAJOR | SAHPI_ES_UPPER_CRIT, .DataFormat = { .IsSupported = SAHPI_TRUE, .ReadingType = SAHPI_SENSOR_READING_TYPE_FLOAT64, .BaseUnits = SAHPI_SU_VOLTS, .ModifierUnits = SAHPI_SU_UNSPECIFIED, .ModifierUse = SAHPI_SMUU_NONE, .Percentage = SAHPI_FALSE, .Range = { .Flags = SAHPI_SRF_MAX | SAHPI_SRF_MIN | SAHPI_SRF_NOMINAL, .Max = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, .Value = { .SensorFloat64 = 3.3, }, }, .Nominal = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, .Value = { .SensorFloat64 = 1.25, }, }, .Min = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, .Value = { .SensorFloat64 = 0, }, }, }, }, .ThresholdDefn = { .IsAccessible = SAHPI_TRUE, .ReadThold = SAHPI_STM_LOW_MAJOR | SAHPI_STM_LOW_CRIT | SAHPI_STM_UP_MAJOR | SAHPI_STM_UP_CRIT | SAHPI_STM_LOW_HYSTERESIS | SAHPI_STM_UP_HYSTERESIS, .WriteThold = 0, }, .Oem = 0, }, .sensor_info = { .mib = { .not_avail_indicator_num = 0, .write_only = 0, .oid = ".1.3.6.1.4.1.2.3.51.1.2.20.2.1.1.3.8", .loc_offset = 0, .threshold_oids = { .LowCritical = ".1.3.6.1.4.1.2.3.51.1.2.20.2.1.1.8.8", .LowMajor = ".1.3.6.1.4.1.2.3.51.1.2.20.2.1.1.10.8", .UpCritical = ".1.3.6.1.4.1.2.3.51.1.2.20.2.1.1.4.8", .UpMajor = ".1.3.6.1.4.1.2.3.51.1.2.20.2.1.1.6.8", .TotalPosThdHysteresis = ".1.3.6.1.4.1.2.3.51.1.2.20.2.1.1.7.8", .TotalNegThdHysteresis = ".1.3.6.1.4.1.2.3.51.1.2.20.2.1.1.11.8", }, }, .cur_state = SAHPI_ES_UNSPECIFIED, .sensor_enabled = SAHPI_TRUE, .events_enabled = SAHPI_TRUE, .assert_mask = SAHPI_ES_LOWER_MINOR | SAHPI_ES_LOWER_MAJOR | SAHPI_ES_LOWER_CRIT | SAHPI_ES_UPPER_MINOR | SAHPI_ES_UPPER_MAJOR | SAHPI_ES_UPPER_CRIT, .deassert_mask = SAHPI_ES_LOWER_MINOR | SAHPI_ES_LOWER_MAJOR | SAHPI_ES_LOWER_CRIT | SAHPI_ES_UPPER_MINOR | SAHPI_ES_UPPER_MAJOR | SAHPI_ES_UPPER_CRIT, .event_array = { { .event = "08000480", /* EN_CUTOFF_HI_FAULT_1_25V */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_TRUE, .event_res_failure_unexpected = SAHPI_TRUE, .event_state = SAHPI_ES_UPPER_CRIT, .recovery_state = SAHPI_ES_UPPER_MAJOR | SAHPI_ES_UPPER_MINOR, }, { .event = "08000880", /* EN_CUTOFF_LO_FAULT_1_25V */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_TRUE, .event_res_failure_unexpected = SAHPI_TRUE, .event_state = SAHPI_ES_LOWER_CRIT, .recovery_state = SAHPI_ES_LOWER_MAJOR | SAHPI_ES_LOWER_MINOR, }, { .event = "08001401", /* EN_PFA_HI_FAULT_1_25V */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_UPPER_MAJOR, .recovery_state = SAHPI_ES_UNSPECIFIED, }, { .event = "08001801", /* EN_PFA_LO_FAULT_1_25V */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_LOWER_MAJOR, .recovery_state = SAHPI_ES_UNSPECIFIED, }, {}, }, }, .comment = "1.25 volt sensor" }, {} /* Terminate array with a null element */ }; /************* * CPU Sensors *************/ struct snmp_bc_sensor snmp_bc_cpu_sensors_rsa[] = { /* CPU thermal sensor */ { .index = 1, .sensor = { .Num = 1, .Type = SAHPI_TEMPERATURE, .Category = SAHPI_EC_THRESHOLD, .EnableCtrl = SAHPI_FALSE, .EventCtrl = SAHPI_SEC_READ_ONLY, .Events = SAHPI_ES_UPPER_MINOR | SAHPI_ES_UPPER_MAJOR | SAHPI_ES_UPPER_CRIT, .DataFormat = { .IsSupported = SAHPI_TRUE, .ReadingType = SAHPI_SENSOR_READING_TYPE_FLOAT64, .BaseUnits = SAHPI_SU_DEGREES_C, .ModifierUnits = SAHPI_SU_UNSPECIFIED, .ModifierUse = SAHPI_SMUU_NONE, .Percentage = SAHPI_FALSE, .Range = { .Flags = SAHPI_SRF_MAX | SAHPI_SRF_MIN, .Max = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, .Value = { .SensorFloat64 = 125, }, }, .Min = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, .Value = { .SensorFloat64 = 0, }, }, }, }, .ThresholdDefn = { .IsAccessible = SAHPI_TRUE, .ReadThold = SAHPI_STM_UP_MAJOR | SAHPI_STM_UP_CRIT | SAHPI_STM_UP_HYSTERESIS, .WriteThold = 0, }, .Oem = 0, }, .sensor_info = { .mib = { .not_avail_indicator_num = 0, .write_only = 0, .oid = ".1.3.6.1.4.1.2.3.51.1.2.20.1.5.1.1.3.x", .loc_offset = 0, .threshold_oids = { .UpCritical = ".1.3.6.1.4.1.2.3.51.1.2.20.1.5.1.1.4.x", .UpMajor = ".1.3.6.1.4.1.2.3.51.1.2.20.1.5.1.1.6.x", .TotalPosThdHysteresis = ".1.3.6.1.4.1.2.3.51.1.2.20.1.5.1.1.7.x", }, }, .cur_state = SAHPI_ES_UNSPECIFIED, .sensor_enabled = SAHPI_TRUE, .events_enabled = SAHPI_TRUE, .assert_mask = SAHPI_ES_UPPER_MINOR | SAHPI_ES_UPPER_MAJOR | SAHPI_ES_UPPER_CRIT, .deassert_mask = SAHPI_ES_UPPER_MINOR | SAHPI_ES_UPPER_MAJOR | SAHPI_ES_UPPER_CRIT, .event_array = { { .event = "0421C40x", /* EN_PROC_HOT_CPUx */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_TRUE, .event_res_failure_unexpected = SAHPI_TRUE, .event_state = SAHPI_ES_UPPER_CRIT | SAHPI_ES_UPPER_MAJOR | SAHPI_ES_UPPER_MINOR, .recovery_state = SAHPI_ES_UPPER_MAJOR | SAHPI_ES_UPPER_MINOR, }, { .event = "0421C48x", /* EN_CUTOFF_HI_OVER_TEMP_CPUx */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_TRUE, .event_res_failure_unexpected = SAHPI_TRUE, .event_state = SAHPI_ES_UPPER_CRIT | SAHPI_ES_UPPER_MAJOR | SAHPI_ES_UPPER_MINOR, .recovery_state = SAHPI_ES_UPPER_MAJOR | SAHPI_ES_UPPER_MINOR, }, { .event = "0421D08x", /* EN_THERM_TRIP_CPUx */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_TRUE, .event_res_failure_unexpected = SAHPI_TRUE, .event_state = SAHPI_ES_UPPER_CRIT | SAHPI_ES_UPPER_MAJOR | SAHPI_ES_UPPER_MINOR, .recovery_state = SAHPI_ES_UPPER_MAJOR | SAHPI_ES_UPPER_MINOR, }, { .event = "0421D50x", /* EN_PFA_HI_OVER_TEMP_CPUx */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_UPPER_MAJOR | SAHPI_ES_UPPER_MINOR, .recovery_state = SAHPI_ES_UNSPECIFIED, }, {}, }, }, .comment = "CPU temperature sensor" }, {} /* Terminate array with a null element */ }; /************** * DASD Sensors **************/ struct snmp_bc_sensor snmp_bc_dasd_sensors_rsa[] = { /* DASD thermal sensor */ { .index = 1, .sensor = { .Num = 1, .Type = SAHPI_TEMPERATURE, .Category = SAHPI_EC_THRESHOLD, .EnableCtrl = SAHPI_FALSE, .EventCtrl = SAHPI_SEC_READ_ONLY, .Events = SAHPI_ES_UPPER_MINOR | SAHPI_ES_UPPER_MAJOR | SAHPI_ES_UPPER_CRIT, .DataFormat = { .IsSupported = SAHPI_TRUE, .ReadingType = SAHPI_SENSOR_READING_TYPE_FLOAT64, .BaseUnits = SAHPI_SU_DEGREES_C, .ModifierUnits = SAHPI_SU_UNSPECIFIED, .ModifierUse = SAHPI_SMUU_NONE, .Percentage = SAHPI_FALSE, .Range = { .Flags = SAHPI_SRF_MAX | SAHPI_SRF_MIN, .Max = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, .Value = { .SensorFloat64 = 125, }, }, .Min = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, .Value = { .SensorFloat64 = 0, }, }, }, }, .ThresholdDefn = { .IsAccessible = SAHPI_TRUE, .ReadThold = SAHPI_STM_UP_MAJOR | SAHPI_STM_UP_CRIT | SAHPI_STM_UP_HYSTERESIS, .WriteThold = 0, }, .Oem = 0, }, .sensor_info = { .mib = { .not_avail_indicator_num = 0, .write_only = 0, .oid = ".1.3.6.1.4.1.2.3.51.1.2.20.1.6.1.1.3.x", .loc_offset = 0, .threshold_oids = { .UpCritical = ".1.3.6.1.4.1.2.3.51.1.2.20.1.6.1.1.4.x", .UpMajor = ".1.3.6.1.4.1.2.3.51.1.2.20.1.6.1.1.6.x", .TotalPosThdHysteresis = ".1.3.6.1.4.1.2.3.51.1.2.20.1.6.1.1.7.x", }, }, .cur_state = SAHPI_ES_UNSPECIFIED, .sensor_enabled = SAHPI_TRUE, .events_enabled = SAHPI_TRUE, .assert_mask = SAHPI_ES_UPPER_MINOR | SAHPI_ES_UPPER_MAJOR | SAHPI_ES_UPPER_CRIT, .deassert_mask = SAHPI_ES_UPPER_MINOR | SAHPI_ES_UPPER_MAJOR | SAHPI_ES_UPPER_CRIT, .event_array = { { .event = "0681C08x", /* EN_CUTOFF_HI_OVER_TEMP_DASD1 */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_TRUE, .event_res_failure_unexpected = SAHPI_TRUE, .event_state = SAHPI_ES_UPPER_CRIT | SAHPI_ES_UPPER_MAJOR | SAHPI_ES_UPPER_MINOR, .recovery_state = SAHPI_ES_UPPER_MAJOR | SAHPI_ES_UPPER_MINOR, }, { .event = "0681C40x", /* EN_PFA_HI_OVER_TEMP_DASD1 */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_UPPER_MAJOR | SAHPI_ES_UPPER_MINOR, .recovery_state = SAHPI_ES_UNSPECIFIED, }, {}, }, }, .comment = "DASD temperature sensor" }, {} /* Terminate array with a null element */ }; /************* * Fan Sensors *************/ struct snmp_bc_sensor snmp_bc_fan_sensors_rsa[] = { /* Fan speed */ { .index = 1, .sensor = { .Num = 1, .Type = SAHPI_FAN, .Category = SAHPI_EC_PRED_FAIL, .EnableCtrl = SAHPI_FALSE, .EventCtrl = SAHPI_SEC_READ_ONLY, .Events = SAHPI_ES_PRED_FAILURE_ASSERT | SAHPI_ES_PRED_FAILURE_DEASSERT, .DataFormat = { .IsSupported = SAHPI_TRUE, .ReadingType = SAHPI_SENSOR_READING_TYPE_FLOAT64, .BaseUnits = SAHPI_SU_RPM, .ModifierUnits = SAHPI_SU_UNSPECIFIED, .ModifierUse = SAHPI_SMUU_NONE, .Percentage = SAHPI_TRUE, .Range = { .Flags = SAHPI_SRF_MAX | SAHPI_SRF_MIN, .Max = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, .Value = { .SensorFloat64 = 100, }, }, .Min = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, .Value = { .SensorFloat64 = 0, }, }, }, }, .ThresholdDefn = { .IsAccessible = SAHPI_FALSE, }, .Oem = 0, }, .sensor_info = { .mib = { .not_avail_indicator_num = 0, .write_only = 0, .oid = ".1.3.6.1.4.1.2.3.51.1.2.3.x.0", .loc_offset = 0, }, .cur_state = SAHPI_ES_UNSPECIFIED, .sensor_enabled = SAHPI_TRUE, .events_enabled = SAHPI_TRUE, .assert_mask = SAHPI_ES_PRED_FAILURE_ASSERT, .deassert_mask = SAHPI_ES_PRED_FAILURE_ASSERT, .event_array = { { .event = "000A600x", /* EN_FANx_PFA */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_PRED_FAILURE_ASSERT, .recovery_state = SAHPI_ES_PRED_FAILURE_DEASSERT, }, {}, }, }, .comment = "Blower fan speed - percent of maximum RPM" }, /* Blower's global operational sensor - event-only */ { .index = 2, .sensor = { .Num = 2, .Type = SAHPI_OPERATIONAL, .Category = SAHPI_EC_AVAILABILITY, .EnableCtrl = SAHPI_FALSE, .EventCtrl = SAHPI_SEC_READ_ONLY, .Events = SAHPI_ES_RUNNING | SAHPI_ES_OFF_LINE, .DataFormat = { .IsSupported = SAHPI_FALSE, }, .ThresholdDefn = { .IsAccessible = SAHPI_FALSE, }, .Oem = 0, }, .sensor_info = { .cur_state = SAHPI_ES_UNSPECIFIED, .sensor_enabled = SAHPI_TRUE, .events_enabled = SAHPI_TRUE, .assert_mask = SAHPI_ES_OFF_LINE, .deassert_mask = SAHPI_ES_OFF_LINE, .event_array = { { .event = "0002680x", /* EN_FAN1_SPEED */ .event_assertion = SAHPI_TRUE, .event_state = SAHPI_ES_OFF_LINE, .event_res_failure = SAHPI_TRUE, .event_res_failure_unexpected = SAHPI_TRUE, .recovery_state = SAHPI_ES_RUNNING, }, { .event = "0A02600x", /* EN_FAULT_FAN1 */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_TRUE, .event_res_failure_unexpected = SAHPI_TRUE, .event_state = SAHPI_ES_OFF_LINE, .recovery_state = SAHPI_ES_RUNNING, }, { .event = "0602600x", /* EN_FAN_x_NOT_PRESENT */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_TRUE, .event_res_failure_unexpected = SAHPI_TRUE, .event_state = SAHPI_ES_OFF_LINE, .recovery_state = SAHPI_ES_RUNNING, }, {}, }, .reading2event = {}, }, .comment = "Blower global operational sensor" }, {} /* Terminate array with a null element */ }; /************************************************************************* * Control Definitions *************************************************************************/ struct snmp_bc_control snmp_bc_chassis_controls_rsa[] = { {} /* Terminate array with a null element */ }; struct snmp_bc_control snmp_bc_cpu_controls_rsa[] = { {} /* Terminate array with a null element */ }; struct snmp_bc_control snmp_bc_dasd_controls_rsa[] = { {} /* Terminate array with a null element */ }; struct snmp_bc_control snmp_bc_fan_controls_rsa[] = { {} /* Terminate array with a null element */ }; /************************************************************************* * Inventory Definitions *************************************************************************/ /************* * Chassis VPD *************/ struct snmp_bc_inventory snmp_bc_chassis_inventories_rsa[] = { { .inventory = { .IdrId = 1, .Oem = 0, }, .inventory_info = { .hardware_mib = { .not_avail_indicator_num = 0, .write_only = SAHPI_FALSE, .area_type = SAHPI_IDR_AREATYPE_CHASSIS_INFO, .oid = { .OidChassisType = ".1.3.6.1.4.1.2.3.51.1.2.21.2.1.2.0", .OidMfgDateTime = '\0', /* Set to SAHPI_TIME_UNSPECIFIED */ .OidManufacturer = '\0', .OidProductName = '\0', .OidProductVersion = ".1.3.6.1.4.1.2.3.51.1.2.21.1.1.1.0", .OidSerialNumber = ".1.3.6.1.4.1.2.3.51.1.2.21.2.1.3.0", .OidPartNumber = ".1.3.6.1.4.1.2.3.51.1.2.21.2.1.1.0", .OidFileId = '\0', .OidAssetTag = '\0', } }, .firmware_mib = { .not_avail_indicator_num = 0, .write_only = SAHPI_FALSE, .area_type = SAHPI_IDR_AREATYPE_PRODUCT_INFO, .oid = { .OidChassisType = '\0', .OidMfgDateTime = '\0', /* Set to SAHPI_TIME_UNSPECIFIED */ .OidManufacturer = '\0', .OidProductName = '\0', .OidProductVersion = '\0', .OidSerialNumber = '\0', .OidPartNumber = '\0', .OidFileId = '\0', .OidAssetTag = '\0', } }, }, .comment = "RSA VPD", }, {} /* Terminate array with a null element */ }; struct snmp_bc_inventory snmp_bc_cpu_inventories_rsa[] = { {} /* Terminate array with a null element */ }; struct snmp_bc_inventory snmp_bc_dasd_inventories_rsa[] = { {} /* Terminate array with a null element */ }; struct snmp_bc_inventory snmp_bc_fan_inventories_rsa[] = { {} /* Terminate array with a null element */ }; openhpi-2.14.1/plugins/snmp_bc/snmp_bc_el.h0000644000076400007640000000161411302566770015556 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004, 2006 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. */ #ifndef __EL_H #define __EL_H #define LOG_LOGIN_STRING "Login ID:" #define LOG_POST_STRING "(POST Status:" #define EVT_RECOVERY "Recovery " #define LOG_THRESHOLD_VALUE_STRING "Threshold value" #define LOG_THRESHOLD_STRING "Threshold:" #define EVT_EN_LOG_FULL "System error log full" #define ER_STR_POST_LOG_CLEARED "System log cleared." #define LOG_READ_VALUE_STRING "Read value" #define LOG_READ_STRING "Reading:" #define LOG_LOGIN_CHAR "'" #define LOG_DISCOVERING "Discovering" #endif openhpi-2.14.1/plugins/snmp_bc/snmp_bc_power.c0000644000076400007640000001411111302566770016301 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004, 2006 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * Steve Sherman */ #include /** * snmp_bc_get_power_state: * @hnd: Handler data pointer. * @rid: Resource ID. * @state: Location to store resource's power state. * * Retrieves a resource's power state. * * Return values: * SA_OK - Normal case. * SA_ERR_HPI_CAPABILITY - Resource doesn't have SAHPI_CAPABILITY_POWER. * SA_ERR_HPI_INVALID_RESOURCE - Resource doesn't exist. * SA_ERR_HPI_INVALID_PARAMS - Pointer parameter(s) are NULL. **/ SaErrorT snmp_bc_get_power_state(void *hnd, SaHpiResourceIdT rid, SaHpiPowerStateT *state) { SaErrorT err; struct ResourceInfo *resinfo; struct snmp_value get_value; struct oh_handler_state *handle; struct snmp_bc_hnd *custom_handle; SaHpiRptEntryT *rpt; if (!hnd || !state) { err("Invalid parameter"); return SA_ERR_HPI_INVALID_PARAMS; } err = SA_OK; handle = (struct oh_handler_state *)hnd; custom_handle = (struct snmp_bc_hnd *)handle->data; if (!custom_handle) { err("Invalid parameter."); return(SA_ERR_HPI_INVALID_PARAMS); } snmp_bc_lock_handler(custom_handle); /* Check if resource exists and has power capabilities */ rpt = oh_get_resource_by_id(handle->rptcache, rid); if (!rpt) { snmp_bc_unlock_handler(custom_handle); return(SA_ERR_HPI_INVALID_RESOURCE); } if (!(rpt->ResourceCapabilities & SAHPI_CAPABILITY_POWER)) { snmp_bc_unlock_handler(custom_handle); return(SA_ERR_HPI_CAPABILITY); } resinfo = (struct ResourceInfo *)oh_get_resource_data(handle->rptcache, rid); if (resinfo == NULL) { err("No resource data. Resource=%s", rpt->ResourceTag.Data); snmp_bc_unlock_handler(custom_handle); return(SA_ERR_HPI_INTERNAL_ERROR); } if (resinfo->mib.OidPowerState == NULL) { err("No Power OID."); snmp_bc_unlock_handler(custom_handle); return(SA_ERR_HPI_INTERNAL_ERROR); } /* Read power state of resource */ err = snmp_bc_oid_snmp_get(custom_handle, &(rpt->ResourceEntity), 0, resinfo->mib.OidPowerState, &get_value, SAHPI_TRUE); if (!err && (get_value.type == ASN_INTEGER)) { switch (get_value.integer) { case 0: *state = SAHPI_POWER_OFF; break; case 1: *state = SAHPI_POWER_ON; break; default: err("Invalid power state for OID=%s.", resinfo->mib.OidPowerState); err = SA_ERR_HPI_INTERNAL_ERROR; } } else { err("Cannot read SNMP OID=%s; Type=%d.", resinfo->mib.OidPowerState, get_value.type); } snmp_bc_unlock_handler(custom_handle); return(err); } /** * snmp_bc_set_power_state: * @hnd: Handler data pointer. * @rid: Resource ID. * @state: Resource's power state to set. * * Sets a resource's power state. * * Return values: * SA_OK - Normal case. * SA_ERR_HPI_CAPABILITY - Resource doesn't have SAHPI_CAPABILITY_POWER. * SA_ERR_HPI_INVALID_RESOURCE - Resource doesn't exist. * SA_ERR_HPI_INVALID_PARAMS - Pointer parameter(s) are NULL; @state invalid. **/ SaErrorT snmp_bc_set_power_state(void *hnd, SaHpiResourceIdT rid, SaHpiPowerStateT state) { SaErrorT err; struct ResourceInfo *resinfo; struct snmp_value set_value; struct oh_handler_state *handle; struct snmp_bc_hnd *custom_handle; SaHpiRptEntryT *rpt; if (!hnd || NULL == oh_lookup_powerstate(state)) { err("Invalid parameter."); return(SA_ERR_HPI_INVALID_PARAMS); } err = SA_OK; handle = (struct oh_handler_state *)hnd; custom_handle = (struct snmp_bc_hnd *)handle->data; if (!custom_handle) { err("Invalid parameter."); return(SA_ERR_HPI_INVALID_PARAMS); } snmp_bc_lock_handler(custom_handle); /* Check if resource exists and has power capabilities */ rpt = oh_get_resource_by_id(handle->rptcache, rid); if (!rpt) { snmp_bc_unlock_handler(custom_handle); return(SA_ERR_HPI_INVALID_RESOURCE); } if (!(rpt->ResourceCapabilities & SAHPI_CAPABILITY_POWER)) { snmp_bc_unlock_handler(custom_handle); return(SA_ERR_HPI_CAPABILITY); } resinfo = (struct ResourceInfo *)oh_get_resource_data(handle->rptcache, rid); if (resinfo == NULL) { err("No resource data. Resource=%s", rpt->ResourceTag.Data); snmp_bc_unlock_handler(custom_handle); return(SA_ERR_HPI_INTERNAL_ERROR); } if (resinfo->mib.OidPowerOnOff == NULL) { err("No Power OnOff OID."); snmp_bc_unlock_handler(custom_handle); return(SA_ERR_HPI_INTERNAL_ERROR); } /* Set power on/off */ set_value.type = ASN_INTEGER; set_value.str_len = 1; switch (state) { case SAHPI_POWER_OFF: set_value.integer = 0; err = snmp_bc_oid_snmp_set(custom_handle, &(rpt->ResourceEntity), 0, resinfo->mib.OidPowerOnOff, set_value); if (err) { err("Cannot set SNMP OID=%s; Type=%d.", resinfo->mib.OidPowerOnOff, set_value.type); if (err != SA_ERR_HPI_BUSY) err = SA_ERR_HPI_NO_RESPONSE; } break; case SAHPI_POWER_ON: set_value.integer = 1; err = snmp_bc_oid_snmp_set(custom_handle, &(rpt->ResourceEntity), 0, resinfo->mib.OidPowerOnOff, set_value); if (err) { err("Cannot set SNMP OID=%s; Type=%d.", resinfo->mib.OidPowerOnOff, set_value.type); if (err != SA_ERR_HPI_BUSY) err = SA_ERR_HPI_NO_RESPONSE; } break; case SAHPI_POWER_CYCLE: { SaHpiResetActionT act = SAHPI_COLD_RESET; err = snmp_bc_set_reset_state(hnd, rid, act); } break; default: err("Invalid Power Action Type=%d.", state); err = SA_ERR_HPI_INTERNAL_ERROR; } snmp_bc_unlock_handler(custom_handle); return(err); } void * oh_get_power_state (void *, SaHpiResourceIdT, SaHpiPowerStateT *) __attribute__ ((weak, alias("snmp_bc_get_power_state"))); void * oh_set_power_state (void *, SaHpiResourceIdT, SaHpiPowerStateT) __attribute__ ((weak, alias("snmp_bc_set_power_state"))); openhpi-2.14.1/plugins/snmp_bc/snmp_bc_sensor.c0000644000076400007640000022747311302566770016477 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004, 2006 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * Steve Sherman */ #include /** * snmp_bc_get_sensor_reading: * @hnd: Handler data pointer. * @rid: Resource ID. * @sid: Sensor ID. * @data: Location to store sensor's value (may be NULL). * @state: Location to store sensor's state (may be NULL). * * Retrieves a sensor's value and/or state. Both @data and @state * may be NULL, in which case this function can be used to test for * sensor presence. * * Return values: * SA_OK - Normal case. * SA_ERR_HPI_CAPABILITY - Resource doesn't have SAHPI_CAPABILITY_SENSOR. * SA_ERR_HPI_INVALID_REQUEST - Sensor is disabled. * SA_ERR_HPI_NOT_PRESENT - Sensor doesn't exist. * SA_ERR_HPI_INVALID_PARAMS - Pointer parameter(s) are NULL. **/ SaErrorT snmp_bc_get_sensor_reading(void *hnd, SaHpiResourceIdT rid, SaHpiSensorNumT sid, SaHpiSensorReadingT *reading, SaHpiEventStateT *state) { SaErrorT err; SaHpiSensorReadingT working_reading; SaHpiEventStateT working_state; struct SensorInfo *sinfo; struct oh_handler_state *handle; struct snmp_bc_hnd *custom_handle; SaHpiRptEntryT *rpt; SaHpiRdrT *rdr; if (!hnd) { err("Invalid parameter."); return(SA_ERR_HPI_INVALID_PARAMS); } handle = (struct oh_handler_state *)hnd; custom_handle = (struct snmp_bc_hnd *)handle->data; if (!custom_handle) { err("Invalid parameter."); return(SA_ERR_HPI_INVALID_PARAMS); } snmp_bc_lock_handler(custom_handle); /* Check if resource exists and has sensor capabilities */ rpt = oh_get_resource_by_id(handle->rptcache, rid); if (!rpt) { snmp_bc_unlock_handler(custom_handle); return(SA_ERR_HPI_INVALID_RESOURCE); } if (!(rpt->ResourceCapabilities & SAHPI_CAPABILITY_SENSOR)) { snmp_bc_unlock_handler(custom_handle); return(SA_ERR_HPI_CAPABILITY); } /* Check if sensor exists and is enabled */ rdr = oh_get_rdr_by_type(handle->rptcache, rid, SAHPI_SENSOR_RDR, sid); if (rdr == NULL) { snmp_bc_unlock_handler(custom_handle); return(SA_ERR_HPI_NOT_PRESENT); } sinfo = (struct SensorInfo *)oh_get_rdr_data(handle->rptcache, rid, rdr->RecordId); if (sinfo == NULL) { snmp_bc_unlock_handler(custom_handle); err("No sensor data. Sensor=%s", rdr->IdString.Data); return(SA_ERR_HPI_INTERNAL_ERROR); } if (sinfo->sensor_enabled == SAHPI_FALSE) { snmp_bc_unlock_handler(custom_handle); return(SA_ERR_HPI_INVALID_REQUEST); } memset(&working_reading, 0, sizeof(SaHpiSensorReadingT)); working_state = SAHPI_ES_UNSPECIFIED; dbg("Sensor Reading: Resource=%s; RDR=%s", rpt->ResourceTag.Data, rdr->IdString.Data); /************************************************************ * Get sensor's reading. * Need to go through this logic, since user may request just * the event state for a readable sensor. Need to translate * sensor reading to event in this case. ************************************************************/ if (rdr->RdrTypeUnion.SensorRec.DataFormat.IsSupported == SAHPI_TRUE) { err = SA_OK; if ((sid == BLADECENTER_SENSOR_NUM_MGMNT_ACTIVE) || (sid == BLADECENTER_SENSOR_NUM_MGMNT_STANDBY)) { err = snmp_bc_get_logical_sensors(hnd, rid, sid, &working_reading); } else if (sid == BLADECENTER_SENSOR_NUM_SLOT_STATE) { err = snmp_bc_get_slot_state_sensor(hnd, rid, sid, &working_reading); } else if ( (sid == BLADECENTER_SENSOR_NUM_MAX_POWER) || (sid == BLADECENTER_SENSOR_NUM_ASSIGNED_POWER) || (sid == BLADECENTER_SENSOR_NUM_MIN_POWER) ) { err = snmp_bc_get_slot_power_sensor(hnd, rid, sid, &working_reading); } else /* Normal sensors */ { err = snmp_bc_get_sensor_oid_reading(hnd, rid, sid, sinfo->mib.oid, &working_reading); } if (err) { err("Cannot determine sensor's reading. Error=%s", oh_lookup_error(err)); snmp_bc_unlock_handler(custom_handle); return(err); } } else { working_reading.IsSupported = SAHPI_FALSE; } /****************************************************************** * Get sensor's event state. * Always get the event state, to reset the sensor's current state, * whether caller wants to know event state or not. ******************************************************************/ err = snmp_bc_get_sensor_eventstate(hnd, rid, sid, &working_reading, &working_state); if (err) { err("Cannot determine sensor's event state. Error=%s", oh_lookup_error(err)); snmp_bc_unlock_handler(custom_handle); return(err); } #if 0 { /* Debug section */ SaHpiTextBufferT buffer; dbg("Sensor=%s", rdr->IdString.Data); oh_decode_sensorreading(working_reading, rdr->RdrTypeUnion.SensorRec.DataFormat, &buffer); dbg(" Reading: %s.", buffer.Data); oh_decode_eventstate(working_state, rdr->RdrTypeUnion.SensorRec.Category, &buffer); dbg(" Event State: %s\n", buffer.Data); } #endif /* sinfo->cur_state = working_state; */ if (reading) memcpy(reading, &working_reading, sizeof(SaHpiSensorReadingT)); if (state) memcpy(state, &working_state, sizeof(SaHpiEventStateT)); snmp_bc_unlock_handler(custom_handle); return(SA_OK); } /** * snmp_bc_get_sensor_eventstate: * @hnd: Handler data pointer. * @rid: Resource ID. * @sid: Sensor ID. * @reading: Location of sensor's reading * @state: Location to store sensor's state. * * Translates and sensor's reading into an event state(s). * * Return values: * SA_OK - Normal case. * SA_ERR_HPI_CAPABILITY - Resource doesn't have SAHPI_CAPABILITY_SENSOR. * SA_ERR_HPI_INVALID_REQUEST - Sensor is disabled. * SA_ERR_HPI_INVALID_PARAMS - Pointer parameter(s) are NULL. * SA_ERR_HPI_NOT_PRESENT - Sensor doesn't exist. **/ SaErrorT snmp_bc_get_sensor_eventstate(void *hnd, SaHpiResourceIdT rid, SaHpiSensorNumT sid, SaHpiSensorReadingT *reading, SaHpiEventStateT *state) { int i; struct SensorInfo *sinfo; struct oh_handler_state *handle; SaHpiRptEntryT *rpt; SaHpiRdrT *rdr; SaErrorT err; if (!hnd || !reading || !state) { err("Invalid parameter."); return(SA_ERR_HPI_INVALID_PARAMS); } handle = (struct oh_handler_state *)hnd; /* Check if resource exists and has sensor capabilities */ rpt = oh_get_resource_by_id(handle->rptcache, rid); if (!rpt) return(SA_ERR_HPI_INVALID_RESOURCE); if (!(rpt->ResourceCapabilities & SAHPI_CAPABILITY_SENSOR)) return(SA_ERR_HPI_CAPABILITY); /* Check if sensor exist and is enabled */ rdr = oh_get_rdr_by_type(handle->rptcache, rid, SAHPI_SENSOR_RDR, sid); if (rdr == NULL) return(SA_ERR_HPI_NOT_PRESENT); sinfo = (struct SensorInfo *)oh_get_rdr_data(handle->rptcache, rid, rdr->RecordId); if (sinfo == NULL) { err("No sensor data. Sensor=%s", rdr->IdString.Data); return(SA_ERR_HPI_INTERNAL_ERROR); } if (sinfo->sensor_enabled == SAHPI_FALSE) return(SA_ERR_HPI_INVALID_REQUEST); /* If sensor is not readable, return current event state */ if (rdr->RdrTypeUnion.SensorRec.DataFormat.IsSupported == SAHPI_FALSE) { *state = sinfo->cur_state; return(SA_OK); } /*************************************************************************** * Translate reading into event state. Algorithm is: * - If sensor is a threshold and has readable thresholds. * - If so, check from most severe to least * - If not found or (not a threshold value && not present sensor), search reading2event array. * - Check for Ranges supported; return after first match. * - Nominal only - reading must match nominal value * - Max && Min - min value <= reading <= max value * - Max only - reading > max value * - Min only - reading < min value * - else SAHPI_ES_UNSPECIFIED ***************************************************************************/ if (rdr->RdrTypeUnion.SensorRec.Category == SAHPI_EC_THRESHOLD && rdr->RdrTypeUnion.SensorRec.ThresholdDefn.ReadThold != 0) { SaHpiSensorThresholdsT thres; memset(&thres, 0, sizeof(SaHpiSensorThresholdsT)); err = snmp_bc_get_sensor_thresholds(hnd, rid, sid, &thres); if (err) { err("Cannot get sensor thresholds for Sensor=%s. Error=%s", rdr->IdString.Data, oh_lookup_error(err)); return(err); } if (thres.LowCritical.IsSupported == SAHPI_TRUE) { if (oh_compare_sensorreading(reading->Type, reading, &thres.LowCritical) <= 0) { *state = *state | SAHPI_ES_LOWER_CRIT; return(SA_OK); } } if (thres.LowMajor.IsSupported == SAHPI_TRUE) { if (oh_compare_sensorreading(reading->Type, reading, &thres.LowMajor) <= 0) { *state = *state | SAHPI_ES_LOWER_MAJOR; return(SA_OK); } } if (thres.LowMinor.IsSupported == SAHPI_TRUE) { if (oh_compare_sensorreading(reading->Type, reading, &thres.LowMinor) <= 0) { *state = *state | SAHPI_ES_LOWER_MINOR; return(SA_OK); } } if (thres.UpCritical.IsSupported == SAHPI_TRUE) { if (oh_compare_sensorreading(reading->Type, reading, &thres.UpCritical) >= 0) { *state = *state | SAHPI_ES_UPPER_CRIT; return(SA_OK); } } if (thres.UpMajor.IsSupported == SAHPI_TRUE) { if (oh_compare_sensorreading(reading->Type, reading, &thres.UpMajor) >= 0) { *state = *state | SAHPI_ES_UPPER_MAJOR; return(SA_OK); } } if (thres.UpMinor.IsSupported == SAHPI_TRUE) { if (oh_compare_sensorreading(reading->Type, reading, &thres.UpMinor) >= 0) { *state = *state | SAHPI_ES_UPPER_MINOR; return(SA_OK); } } } else if (rdr->RdrTypeUnion.SensorRec.Category == SAHPI_EC_PRESENCE) { if ((sid == BLADECENTER_SENSOR_NUM_SLOT_STATE) || (sid == BLADECENTER_SENSOR_NUM_MGMNT_STANDBY)) *state = sinfo->cur_state; else *state = SAHPI_ES_PRESENT; } else { /* Check reading2event array */ for (i=0; i < SNMP_BC_MAX_SENSOR_READING_MAP_ARRAY_SIZE && sinfo->reading2event[i].num != 0; i++) { /* reading == nominal */ if (sinfo->reading2event[i].rangemap.Flags & SAHPI_SRF_NOMINAL) { if (oh_compare_sensorreading(reading->Type, reading, &sinfo->reading2event[i].rangemap.Nominal) == 0) { *state = sinfo->reading2event[i].state; return(SA_OK); } } /* min <= reading <= max */ if (sinfo->reading2event[i].rangemap.Flags & SAHPI_SRF_MAX && sinfo->reading2event[i].rangemap.Flags & SAHPI_SRF_MIN) { if (oh_compare_sensorreading(reading->Type, reading, &sinfo->reading2event[i].rangemap.Min) >= 0 && oh_compare_sensorreading(reading->Type, reading, &sinfo->reading2event[i].rangemap.Max) <= 0) { *state = sinfo->reading2event[i].state; return(SA_OK); } } /* reading > max */ if (sinfo->reading2event[i].rangemap.Flags & SAHPI_SRF_MAX && !(sinfo->reading2event[i].rangemap.Flags & SAHPI_SRF_MIN)) { if (oh_compare_sensorreading(reading->Type, reading, &sinfo->reading2event[i].rangemap.Max) > 0) { *state = sinfo->reading2event[i].state; return(SA_OK); } } /* reading < min */ if (!(sinfo->reading2event[i].rangemap.Flags & SAHPI_SRF_MAX) && sinfo->reading2event[i].rangemap.Flags & SAHPI_SRF_MIN) { if (oh_compare_sensorreading(reading->Type, reading, &sinfo->reading2event[i].rangemap.Min) < 0) { *state = sinfo->reading2event[i].state; return(SA_OK); } } } /* Unfortunately for thresholds, this also means normal */ *state = SAHPI_ES_UNSPECIFIED; } return(SA_OK); } #define get_threshold(thdmask, thdname) \ do { \ if (rdr->RdrTypeUnion.SensorRec.ThresholdDefn.ReadThold & thdmask) { \ if (sinfo->mib.threshold_oids.thdname == NULL || \ sinfo->mib.threshold_oids.thdname[0] == '\0') { \ err("No OID defined for readable threshold. Sensor=%s", rdr->IdString.Data); \ snmp_bc_unlock_handler(custom_handle); \ return(SA_ERR_HPI_INTERNAL_ERROR); \ } \ err = snmp_bc_get_sensor_oid_reading(hnd, rid, sid, \ sinfo->mib.threshold_oids.thdname, \ &(working.thdname)); \ if (err) { \ snmp_bc_unlock_handler(custom_handle); \ return(err); \ } \ if (working.thdname.Type == SAHPI_SENSOR_READING_TYPE_BUFFER) { \ err("Sensor type SAHPI_SENSOR_READING_TYPE_BUFFER cannot have thresholds. Sensor=%s", \ rdr->IdString.Data); \ snmp_bc_unlock_handler(custom_handle); \ return(SA_ERR_HPI_INTERNAL_ERROR); \ } \ found_thresholds = found_thresholds | thdmask; \ } \ else { \ working.thdname.IsSupported = SAHPI_FALSE; \ } \ } while(0) /** * snmp_bc_get_virtual_MM_sensor: * @hnd: Handler data pointer. * @rid: Resource ID. * @sid: Sensor ID. * @reading: Location of sensor's reading * * Re-direct and read sensors from real physical MM for Virtual MM.. * * Return values: * SA_OK - Normal case. * SA_ERR_HPI_CAPABILITY - Resource doesn't have SAHPI_CAPABILITY_SENSOR. * SA_ERR_HPI_INVALID_REQUEST - Sensor is disabled. * SA_ERR_HPI_INVALID_PARAMS - Pointer parameter(s) are NULL. * SA_ERR_HPI_NOT_PRESENT - Sensor doesn't exist. **/ SaErrorT snmp_bc_get_logical_sensors(void *hnd, SaHpiResourceIdT rid, SaHpiSensorNumT sid, SaHpiSensorReadingT *reading) { struct oh_handler_state *handle; struct snmp_bc_hnd *custom_handle; struct snmp_value mm_install_mask, active_mm_id; SaHpiEntityPathT ep_root, res_ep; char * root_tuple; int mm_id; SaErrorT err; if (!hnd) { err("Invalid parameter."); return(SA_ERR_HPI_INVALID_PARAMS); } err = SA_OK; handle = (struct oh_handler_state *)hnd; custom_handle = (struct snmp_bc_hnd *)handle->data; if (!custom_handle) { err("Invalid parameter."); return(SA_ERR_HPI_INVALID_PARAMS); } /* Fetch MMs installed vector */ get_installed_mask(SNMP_BC_MM_INSTALLED, mm_install_mask); /* Fetch Active MM ID */ err = snmp_bc_snmp_get(custom_handle, SNMP_BC_MGMNT_ACTIVE, &active_mm_id, SAHPI_TRUE); if (err || active_mm_id.type != ASN_INTEGER) { err("Cannot get SNMP_BC_MGMNT_ACTIVE=%s; Received Type=%d; Error=%s.", SNMP_BC_MGMNT_ACTIVE, active_mm_id.type, oh_lookup_error(err)); if (err) { return(err); } else { return(SA_ERR_HPI_INTERNAL_ERROR); } } mm_id = SNMP_BC_NOT_VALID; /* Init it to someting invalid, so we can visually catch error */ switch (sid) { case BLADECENTER_SENSOR_NUM_MGMNT_ACTIVE: mm_id = active_mm_id.integer; break; case BLADECENTER_SENSOR_NUM_MGMNT_STANDBY: if ( atoi(mm_install_mask.string) > 10) { switch(active_mm_id.integer) { case 1: mm_id = 2; break; case 2: mm_id = 1; break; default: err("Internal Error."); break; } } break; default: err("Should not be here. sid is not one of the special sensors."); break; } /* Complete Sensor Read record */ reading->IsSupported = SAHPI_TRUE; reading->Type = SAHPI_SENSOR_READING_TYPE_UINT64; if (mm_id != SNMP_BC_NOT_VALID) { root_tuple = (char *)g_hash_table_lookup(handle->config, "entity_root"); if (root_tuple == NULL) { err("Cannot find configuration parameter."); snmp_bc_unlock_handler(custom_handle); return(SA_ERR_HPI_INTERNAL_ERROR); } err = oh_encode_entitypath(root_tuple, &ep_root); res_ep = snmp_bc_rpt_array[BC_RPT_ENTRY_MGMNT_MODULE].rpt.ResourceEntity; oh_concat_ep(&res_ep, &ep_root); oh_set_ep_location(&res_ep, BLADECENTER_SYS_MGMNT_MODULE_SLOT, mm_id); oh_set_ep_location(&res_ep, SAHPI_ENT_SYS_MGMNT_MODULE, mm_id); reading->Value.SensorUint64 = (SaHpiUint64T) oh_uid_from_entity_path(&res_ep); } else { reading->Value.SensorUint64 = SAHPI_UNSPECIFIED_RESOURCE_ID; } return(err); } /** * snmp_bc_get_sensor_thresholds: * @hnd: Handler data pointer. * @rid: Resource ID. * @sid: Sensor ID. * @thres: Location to store sensor's threshold values. * * Retreives sensor's threshold values, if defined. * * Return values: * SA_OK - Normal case. * SA_ERR_HPI_CAPABILITY - Resource doesn't have SAHPI_CAPABILITY_SENSOR. * SA_ERR_HPI_INVALID_CMD - Sensor is not threshold type, has accessible or readable thresholds. * SA_ERR_HPI_INVALID_PARAMS - Pointer parameter(s) are NULL. * SA_ERR_HPI_NOT_PRESENT - Sensor doesn't exist. **/ SaErrorT snmp_bc_get_sensor_thresholds(void *hnd, SaHpiResourceIdT rid, SaHpiSensorNumT sid, SaHpiSensorThresholdsT *thres) { int upper_thresholds, lower_thresholds; SaHpiSensorThdMaskT found_thresholds; SaHpiSensorThresholdsT working; struct SensorInfo *sinfo; struct oh_handler_state *handle; struct snmp_bc_hnd *custom_handle; SaHpiRptEntryT *rpt; SaHpiRdrT *rdr; SaErrorT err; if (!hnd || !thres) { err("Invalid parameter."); return(SA_ERR_HPI_INVALID_PARAMS); } handle = (struct oh_handler_state *)hnd; custom_handle = (struct snmp_bc_hnd *)handle->data; snmp_bc_lock_handler(custom_handle); /* Check if resource exists and has sensor capabilities */ rpt = oh_get_resource_by_id(handle->rptcache, rid); if (!rpt) { snmp_bc_unlock_handler(custom_handle); return(SA_ERR_HPI_INVALID_RESOURCE); } if (!(rpt->ResourceCapabilities & SAHPI_CAPABILITY_SENSOR)) { snmp_bc_unlock_handler(custom_handle); return(SA_ERR_HPI_CAPABILITY); } /* Check if sensor exits and has readable thresholds */ rdr = oh_get_rdr_by_type(handle->rptcache, rid, SAHPI_SENSOR_RDR, sid); if (rdr == NULL){ snmp_bc_unlock_handler(custom_handle); return(SA_ERR_HPI_NOT_PRESENT); } sinfo = (struct SensorInfo *)oh_get_rdr_data(handle->rptcache, rid, rdr->RecordId); if (sinfo == NULL) { err("No sensor data. Sensor=%s", rdr->IdString.Data); snmp_bc_unlock_handler(custom_handle); return(SA_ERR_HPI_INTERNAL_ERROR); } if (rdr->RdrTypeUnion.SensorRec.Category != SAHPI_EC_THRESHOLD || rdr->RdrTypeUnion.SensorRec.ThresholdDefn.IsAccessible == SAHPI_FALSE || rdr->RdrTypeUnion.SensorRec.ThresholdDefn.ReadThold == 0) { snmp_bc_unlock_handler(custom_handle); return(SA_ERR_HPI_INVALID_CMD); } memset(&working, 0, sizeof(SaHpiSensorThresholdsT)); found_thresholds = lower_thresholds = upper_thresholds = 0; get_threshold(SAHPI_STM_LOW_MINOR, LowMinor); if (found_thresholds & SAHPI_STM_LOW_MINOR) lower_thresholds++; get_threshold(SAHPI_STM_LOW_MAJOR, LowMajor); if (found_thresholds & SAHPI_STM_LOW_MAJOR) lower_thresholds++; get_threshold(SAHPI_STM_LOW_CRIT, LowCritical); if (found_thresholds & SAHPI_STM_LOW_CRIT) lower_thresholds++; get_threshold(SAHPI_STM_UP_MINOR, UpMinor); if (found_thresholds & SAHPI_STM_UP_MINOR) upper_thresholds++; get_threshold(SAHPI_STM_UP_MAJOR, UpMajor); if (found_thresholds & SAHPI_STM_UP_MAJOR) upper_thresholds++; get_threshold(SAHPI_STM_UP_CRIT, UpCritical); if (found_thresholds & SAHPI_STM_UP_CRIT) upper_thresholds++; /************************************************************************ * Find Hysteresis Values * * Hardware can define hysteresis values two ways: * * - As delta values as defined in the spec. In this case, * PosThdHysteresis and/or NegThdHysteresis values are defined * and this routine just returns those values. * * - Total values - as in threshold is 80 degrees; positive hysteresis is * defined to be 78 degrees. In this case, TotalPosThdHysteresis and/or * TotalNegThdHysteresis are defined and this routine needs to make * the required calculations to return to the user a delta value. Total * values can only be used if: * 1) if there is more thanone upper/lower threshold defined, the least * critical threshold is used as the base for calculating delta values. * 2) Total values cannot be of type SAHPI_SENSOR_READING_TYPE_UINT64 or * SAHPI_SENSOR_READING_TYPE_BUFFER. * * Code can support a delta value for one set of thresholds (upper or * lower) and a total value for the opposite set. *************************************************************************/ if (sinfo->mib.threshold_oids.NegThdHysteresis) { get_threshold(SAHPI_STM_LOW_HYSTERESIS, NegThdHysteresis); } if (sinfo->mib.threshold_oids.PosThdHysteresis) { get_threshold(SAHPI_STM_UP_HYSTERESIS, PosThdHysteresis); } /* Negative Total Hysteresis - applies to lower thresholds */ if (sinfo->mib.threshold_oids.TotalNegThdHysteresis) { SaHpiSensorReadingT reading; if (found_thresholds & SAHPI_STM_LOW_HYSTERESIS) { err("Cannot define both delta and total negative hysteresis. Sensor=%s", rdr->IdString.Data); snmp_bc_unlock_handler(custom_handle); return(SA_ERR_HPI_INTERNAL_ERROR); } if (lower_thresholds == 0) { err("No lower thresholds are defined for total negative hysteresis. Sensor=%s", rdr->IdString.Data); snmp_bc_unlock_handler(custom_handle); return(SA_ERR_HPI_INTERNAL_ERROR); } /* Get negative hysteresis value */ err = snmp_bc_get_sensor_oid_reading(hnd, rid, sid, sinfo->mib.threshold_oids.TotalNegThdHysteresis, &reading); if (err) { snmp_bc_unlock_handler(custom_handle); return(err); } switch (rdr->RdrTypeUnion.SensorRec.DataFormat.ReadingType) { case SAHPI_SENSOR_READING_TYPE_INT64: { SaHpiInt64T delta; if (found_thresholds & SAHPI_STM_LOW_MINOR) { delta = reading.Value.SensorInt64 - working.LowMinor.Value.SensorInt64; } else { if (found_thresholds & SAHPI_STM_LOW_MAJOR) { delta = reading.Value.SensorInt64 - working.LowMajor.Value.SensorInt64; } else { delta = reading.Value.SensorInt64 - working.LowCritical.Value.SensorInt64; } } if (delta < 0) { err("Negative hysteresis delta is less than 0"); working.NegThdHysteresis.IsSupported = SAHPI_FALSE; } else { working.NegThdHysteresis.IsSupported = SAHPI_TRUE; working.NegThdHysteresis.Type = SAHPI_SENSOR_READING_TYPE_INT64; working.NegThdHysteresis.Value.SensorInt64 = delta; } break; } case SAHPI_SENSOR_READING_TYPE_FLOAT64: { SaHpiFloat64T delta; if (found_thresholds & SAHPI_STM_LOW_MINOR) { delta = reading.Value.SensorFloat64 - working.LowMinor.Value.SensorFloat64; } else { if (found_thresholds & SAHPI_STM_LOW_MAJOR) { delta = reading.Value.SensorFloat64 - working.LowMajor.Value.SensorFloat64; } else { delta = reading.Value.SensorFloat64 - working.LowCritical.Value.SensorFloat64; } } if (delta < 0) { err("Negative hysteresis delta is less than 0"); working.NegThdHysteresis.IsSupported = SAHPI_FALSE; } else { working.NegThdHysteresis.IsSupported = SAHPI_TRUE; working.NegThdHysteresis.Type = SAHPI_SENSOR_READING_TYPE_FLOAT64; working.NegThdHysteresis.Value.SensorFloat64 = delta; } break; } case SAHPI_SENSOR_READING_TYPE_UINT64: case SAHPI_SENSOR_READING_TYPE_BUFFER: default: err("Invalid reading type for threshold. Sensor=%s", rdr->IdString.Data); snmp_bc_unlock_handler(custom_handle); return(SA_ERR_HPI_INTERNAL_ERROR); } } /* Positive Total Hysteresis - applies to upper thresholds */ if (sinfo->mib.threshold_oids.TotalPosThdHysteresis) { SaHpiSensorReadingT reading; if (found_thresholds & SAHPI_STM_UP_HYSTERESIS) { err("Cannot define both delta and total positive hysteresis. Sensor=%s", rdr->IdString.Data); snmp_bc_unlock_handler(custom_handle); return(SA_ERR_HPI_INTERNAL_ERROR); } if (upper_thresholds == 0) { err("No upper thresholds are defined for total positive hysteresis. Sensor=%s", rdr->IdString.Data); snmp_bc_unlock_handler(custom_handle); return(SA_ERR_HPI_INTERNAL_ERROR); } /* Get positive hysteresis value */ err = snmp_bc_get_sensor_oid_reading(hnd, rid, sid, sinfo->mib.threshold_oids.TotalPosThdHysteresis, &reading); if (err) { snmp_bc_unlock_handler(custom_handle); return(err); } switch (rdr->RdrTypeUnion.SensorRec.DataFormat.ReadingType) { case SAHPI_SENSOR_READING_TYPE_INT64: { SaHpiInt64T delta; if (found_thresholds & SAHPI_STM_UP_MINOR) { delta = working.UpMinor.Value.SensorInt64 - reading.Value.SensorInt64; } else { if (found_thresholds & SAHPI_STM_UP_MAJOR) { delta = working.UpMajor.Value.SensorInt64 - reading.Value.SensorInt64; } else { delta = working.UpCritical.Value.SensorInt64 - reading.Value.SensorInt64; } } if (delta < 0) { err("Positive hysteresis delta is less than 0"); working.PosThdHysteresis.IsSupported = SAHPI_FALSE; } else { working.PosThdHysteresis.IsSupported = SAHPI_TRUE; working.PosThdHysteresis.Type = SAHPI_SENSOR_READING_TYPE_INT64; working.PosThdHysteresis.Value.SensorInt64 = delta; } break; } case SAHPI_SENSOR_READING_TYPE_FLOAT64: { SaHpiFloat64T delta; if (found_thresholds & SAHPI_STM_UP_MINOR) { delta = working.UpMinor.Value.SensorFloat64 - reading.Value.SensorFloat64; } else { if (found_thresholds & SAHPI_STM_UP_MAJOR) { delta = working.UpMajor.Value.SensorFloat64 - reading.Value.SensorFloat64; } else { delta = working.UpCritical.Value.SensorFloat64 - reading.Value.SensorFloat64; } } if (delta < 0) { err("Positive hysteresis delta is less than 0"); working.PosThdHysteresis.IsSupported = SAHPI_FALSE; } else { working.PosThdHysteresis.IsSupported = SAHPI_TRUE; working.PosThdHysteresis.Type = SAHPI_SENSOR_READING_TYPE_FLOAT64; working.PosThdHysteresis.Value.SensorFloat64 = delta; } break; } case SAHPI_SENSOR_READING_TYPE_UINT64: case SAHPI_SENSOR_READING_TYPE_BUFFER: default: err("Invalid reading type for threshold. Sensor=%s", rdr->IdString.Data); snmp_bc_unlock_handler(custom_handle); return(SA_ERR_HPI_INTERNAL_ERROR); } } if (found_thresholds == 0) { err("No readable thresholds found. Sensor=%s", rdr->IdString.Data); snmp_bc_unlock_handler(custom_handle); return(SA_ERR_HPI_INTERNAL_ERROR); } memcpy(thres, &working, sizeof(SaHpiSensorThresholdsT)); snmp_bc_unlock_handler(custom_handle); return(SA_OK); } #define merge_threshold(thdname) \ do { \ if (thres->thdname.IsSupported) { \ working.thdname.IsSupported = SAHPI_TRUE; \ working.thdname.Type = thres->thdname.Type; \ switch(thres->thdname.Type) { \ case SAHPI_SENSOR_READING_TYPE_INT64: \ working.thdname.Value.SensorInt64 = thres->thdname.Value.SensorInt64; \ break; \ case SAHPI_SENSOR_READING_TYPE_FLOAT64: \ working.thdname.Value.SensorFloat64 = thres->thdname.Value.SensorFloat64; \ break; \ case SAHPI_SENSOR_READING_TYPE_UINT64: \ working.thdname.Value.SensorUint64 = thres->thdname.Value.SensorUint64; \ break; \ case SAHPI_SENSOR_READING_TYPE_BUFFER: \ default: \ err("Invalid threshold reading type."); \ snmp_bc_unlock_handler(custom_handle); \ return(SA_ERR_HPI_INVALID_CMD); \ } \ } \ } while(0) #define write_valid_threshold(thdname) \ do { \ if (thres->thdname.IsSupported) { \ if (sinfo->mib.threshold_write_oids.thdname == NULL || \ sinfo->mib.threshold_oids.thdname[0] == '\0') { \ err("No writable threshold OID defined for thdname."); \ snmp_bc_unlock_handler(custom_handle); \ return(SA_ERR_HPI_INTERNAL_ERROR); \ } \ err = snmp_bc_set_threshold_reading(hnd, rid, sid, \ sinfo->mib.threshold_write_oids.thdname, \ &(working.thdname)); \ if (err) { \ snmp_bc_unlock_handler(custom_handle); \ return(err); \ } \ } \ } while(0) /** * snmp_bc_set_sensor_thresholds: * @hnd: Handler data pointer. * @rid: Resource ID. * @sid: Sensor ID. * @thres: Location of sensor's settable threshold values. * * Sets sensor's threshold values. * * Return values: * SA_OK - Normal case. * SA_ERR_HPI_CAPABILITY - Resource doesn't have SAHPI_CAPABILITY_SENSOR. * SA_ERR_HPI_INVALID_CMD - Non-writable thresholds or invalid thresholds. * SA_ERR_HPI_INVALID_DATA - Threshold values out of order; negative hysteresis * SA_ERR_HPI_INVALID_PARAMS - Pointer parameter(s) are NULL. * SA_ERR_HPI_NOT_PRESENT - Sensor doesn't exist. **/ SaErrorT snmp_bc_set_sensor_thresholds(void *hnd, SaHpiResourceIdT rid, SaHpiSensorNumT sid, const SaHpiSensorThresholdsT *thres) { SaErrorT err; SaHpiSensorThresholdsT working; struct oh_handler_state *handle; struct SensorInfo *sinfo; struct snmp_bc_hnd *custom_handle; SaHpiRptEntryT *rpt; SaHpiRdrT *rdr; if (!hnd || !thres) { err("Invalid parameter"); return(SA_ERR_HPI_INVALID_PARAMS); } handle = (struct oh_handler_state *)hnd; custom_handle = (struct snmp_bc_hnd *)handle->data; snmp_bc_lock_handler(custom_handle); /* Check if resource exists and has sensor capabilities */ rpt = oh_get_resource_by_id(handle->rptcache, rid); if (!rpt) { snmp_bc_unlock_handler(custom_handle); return(SA_ERR_HPI_INVALID_RESOURCE); } if (!(rpt->ResourceCapabilities & SAHPI_CAPABILITY_SENSOR)) { snmp_bc_unlock_handler(custom_handle); return(SA_ERR_HPI_CAPABILITY); } /* Check if sensor exists and has writable thresholds */ rdr = oh_get_rdr_by_type(handle->rptcache, rid, SAHPI_SENSOR_RDR, sid); if (rdr == NULL) { snmp_bc_unlock_handler(custom_handle); return(SA_ERR_HPI_NOT_PRESENT); } sinfo = (struct SensorInfo *)oh_get_rdr_data(handle->rptcache, rid, rdr->RecordId); if (sinfo == NULL) { err("No sensor data. Sensor=%s", rdr->IdString.Data); snmp_bc_unlock_handler(custom_handle); return(SA_ERR_HPI_INTERNAL_ERROR); } if (rdr->RdrTypeUnion.SensorRec.Category != SAHPI_EC_THRESHOLD || rdr->RdrTypeUnion.SensorRec.ThresholdDefn.IsAccessible == SAHPI_FALSE || rdr->RdrTypeUnion.SensorRec.ThresholdDefn.WriteThold == 0) { snmp_bc_unlock_handler(custom_handle); return(SA_ERR_HPI_INVALID_CMD); } /* Overlay proposed thresholds on top of existing ones and validate */ err = snmp_bc_get_sensor_thresholds(hnd, rid, sid, &working); if (err) { snmp_bc_unlock_handler(custom_handle); return(err); } merge_threshold(LowCritical); merge_threshold(LowMajor); merge_threshold(LowMinor); merge_threshold(UpCritical); merge_threshold(UpMajor); merge_threshold(UpMinor); merge_threshold(PosThdHysteresis); merge_threshold(NegThdHysteresis); err = oh_valid_thresholds(&working, rdr); if (err) { snmp_bc_unlock_handler(custom_handle); return(err); } /************************ * Write valid thresholds ************************/ write_valid_threshold(UpCritical); write_valid_threshold(UpMajor); write_valid_threshold(UpMinor); write_valid_threshold(LowCritical); write_valid_threshold(LowMajor); write_valid_threshold(LowMinor); /* We don't support writing total value hysteresis only deltas */ write_valid_threshold(NegThdHysteresis); write_valid_threshold(PosThdHysteresis); snmp_bc_unlock_handler(custom_handle); return(SA_OK); } SaErrorT snmp_bc_get_sensor_oid_reading(void *hnd, SaHpiResourceIdT rid, SaHpiSensorNumT sid, const char *raw_oid, SaHpiSensorReadingT *reading) { SaHpiSensorReadingT working; SaErrorT err; struct SensorInfo *sinfo; struct oh_handler_state *handle; struct snmp_bc_hnd *custom_handle; struct snmp_value get_value; SaHpiEntityPathT valEntity; SaHpiRdrT *rdr; handle = (struct oh_handler_state *)hnd; custom_handle = (struct snmp_bc_hnd *)handle->data; rdr = oh_get_rdr_by_type(handle->rptcache, rid, SAHPI_SENSOR_RDR, sid); if (rdr == NULL) return(SA_ERR_HPI_NOT_PRESENT); sinfo = (struct SensorInfo *)oh_get_rdr_data(handle->rptcache, rid, rdr->RecordId); if (sinfo == NULL) { err("No sensor data. Sensor=%s", rdr->IdString.Data); return(SA_ERR_HPI_INTERNAL_ERROR); } /* Normalize and read sensor's raw SNMP OID */ err = snmp_bc_validate_ep(&(rdr->Entity), &valEntity); err = snmp_bc_oid_snmp_get(custom_handle, &valEntity, sinfo->mib.loc_offset, raw_oid, &get_value, SAHPI_TRUE); if (err) { err("SNMP cannot read sensor OID=%s. Type=%d", raw_oid, get_value.type); return(err); } /* Convert SNMP value to HPI reading value */ working.IsSupported = SAHPI_TRUE; if (get_value.type == ASN_INTEGER) { working.Type = SAHPI_SENSOR_READING_TYPE_INT64; working.Value.SensorInt64 = (SaHpiInt64T)get_value.integer; } else { SaHpiTextBufferT buffer; oh_init_textbuffer(&buffer); oh_append_textbuffer(&buffer, get_value.string); err = oh_encode_sensorreading(&buffer, rdr->RdrTypeUnion.SensorRec.DataFormat.ReadingType, &working); if (err) { err("Cannot convert sensor OID=%s value=%s. Error=%s", sinfo->mib.oid, buffer.Data, oh_lookup_error(err)); return(SA_ERR_HPI_INTERNAL_ERROR); } } memcpy(reading, &working, sizeof(SaHpiSensorReadingT)); return(SA_OK); } SaErrorT snmp_bc_set_threshold_reading(void *hnd, SaHpiResourceIdT rid, SaHpiSensorNumT sid, const char *raw_oid, const SaHpiSensorReadingT *reading) { SaErrorT err; SaHpiTextBufferT buffer; SaHpiFloat64T tmp_num; struct SensorInfo *sinfo; struct oh_handler_state *handle; struct snmp_bc_hnd *custom_handle; struct snmp_value set_value; SaHpiEntityPathT valEntity; SaHpiRdrT *rdr; if (!hnd || !reading || !raw_oid) { err("Invalid parameter."); return(SA_ERR_HPI_INTERNAL_ERROR); } handle = (struct oh_handler_state *)hnd; custom_handle = (struct snmp_bc_hnd *)handle->data; rdr = oh_get_rdr_by_type(handle->rptcache, rid, SAHPI_SENSOR_RDR, sid); if (rdr == NULL) return(SA_ERR_HPI_NOT_PRESENT); sinfo = (struct SensorInfo *)oh_get_rdr_data(handle->rptcache, rid, rdr->RecordId); if (sinfo == NULL) { err("No sensor data. Sensor=%s", rdr->IdString.Data); return(SA_ERR_HPI_INTERNAL_ERROR); } /* Convert reading into SNMP string structure */ err = oh_init_textbuffer(&buffer); if (err) return(err); switch (reading->Type) { case SAHPI_SENSOR_READING_TYPE_INT64: tmp_num = (SaHpiFloat64T)reading->Value.SensorInt64; break; case SAHPI_SENSOR_READING_TYPE_FLOAT64: tmp_num = reading->Value.SensorFloat64; break; case SAHPI_SENSOR_READING_TYPE_UINT64: tmp_num = (SaHpiFloat64T)reading->Value.SensorUint64; break; case SAHPI_SENSOR_READING_TYPE_BUFFER: default: err("Invalid type for threshold. Sensor=%s", rdr->IdString.Data); return(SA_ERR_HPI_INTERNAL_ERROR); } /************************************************************* * NOTE! Assuming max format for writable thresholds is ddd.dd *************************************************************/ snprintf((char *)buffer.Data, SAHPI_MAX_TEXT_BUFFER_LENGTH, "%'+3.2f", tmp_num); /* Copy string to SNMP structure */ set_value.type = ASN_OCTET_STR; g_ascii_strncasecmp(set_value.string, (char *)buffer.Data, buffer.DataLength); /* Normalize and read sensor's raw SNMP OID */ err = snmp_bc_validate_ep(&(rdr->Entity), &valEntity); err = snmp_bc_oid_snmp_set(custom_handle, &valEntity, sinfo->mib.loc_offset, raw_oid, set_value); if (err) { err("SNMP cannot set sensor OID=%s.", raw_oid); return(err); } return(SA_OK); } /** * snmp_bc_get_sensor_enable: * @hnd: Handler data pointer. * @rid: Resource ID. * @sid: Sensor ID. * @enable: Location to store sensor's enablement boolean. * * Retrieves a sensor's boolean enablement status. * * Return values: * SA_OK - Normal case. * SA_ERR_HPI_INVALID_PARAMS - @enable is NULL. * SA_ERR_HPI_CAPABILITY - Resource doesn't have SAHPI_CAPABILITY_SENSOR. * SA_ERR_HPI_NOT_PRESENT - Sensor doesn't exist. **/ SaErrorT snmp_bc_get_sensor_enable(void *hnd, SaHpiResourceIdT rid, SaHpiSensorNumT sid, SaHpiBoolT *enable) { struct oh_handler_state *handle; struct SensorInfo *sinfo; struct snmp_bc_hnd *custom_handle; SaHpiRptEntryT *rpt; SaHpiRdrT *rdr; if (!hnd || !enable) { err("Invalid parameter"); return(SA_ERR_HPI_INVALID_PARAMS); } handle = (struct oh_handler_state *)hnd; custom_handle = (struct snmp_bc_hnd *)handle->data; snmp_bc_lock_handler(custom_handle); /* Check if resource exists and has sensor capabilities */ rpt = oh_get_resource_by_id(handle->rptcache, rid); if (!rpt) { snmp_bc_unlock_handler(custom_handle); return(SA_ERR_HPI_INVALID_RESOURCE); } if (!(rpt->ResourceCapabilities & SAHPI_CAPABILITY_SENSOR)) { snmp_bc_unlock_handler(custom_handle); return(SA_ERR_HPI_CAPABILITY); } /* Check if sensor exists and return enablement status */ rdr = oh_get_rdr_by_type(handle->rptcache, rid, SAHPI_SENSOR_RDR, sid); if (rdr == NULL) { snmp_bc_unlock_handler(custom_handle); return(SA_ERR_HPI_NOT_PRESENT); } sinfo = (struct SensorInfo *)oh_get_rdr_data(handle->rptcache, rid, rdr->RecordId); if (sinfo == NULL) { err("No sensor data. Sensor=%s", rdr->IdString.Data); snmp_bc_unlock_handler(custom_handle); return(SA_ERR_HPI_INTERNAL_ERROR); } *enable = sinfo->sensor_enabled; snmp_bc_unlock_handler(custom_handle); return(SA_OK); } /** * snmp_bc_set_sensor_enable: * @hnd: Handler data pointer. * @rid: Resource ID. * @sid: Sensor ID. * @enable: Enable/disable sensor. * * Sets a sensor's boolean enablement status. * * Return values: * SA_OK - Normal case. * SA_ERR_HPI_CAPABILITY - Resource doesn't have SAHPI_CAPABILITY_SENSOR. * SA_ERR_HPI_NOT_PRESENT - Sensor doesn't exist. **/ SaErrorT snmp_bc_set_sensor_enable(void *hnd, SaHpiResourceIdT rid, SaHpiSensorNumT sid, const SaHpiBoolT enable) { struct oh_handler_state *handle; struct snmp_bc_hnd *custom_handle; SaHpiRptEntryT *rpt; SaHpiRdrT *rdr; struct SensorInfo *sinfo; if (!hnd ) { err("Invalid parameter."); return(SA_ERR_HPI_INVALID_PARAMS); } handle = (struct oh_handler_state *)hnd; custom_handle = (struct snmp_bc_hnd *)handle->data; snmp_bc_lock_handler(custom_handle); /* Check if resource exists and has sensor capabilities */ rpt = oh_get_resource_by_id(handle->rptcache, rid); if (!rpt) { snmp_bc_unlock_handler(custom_handle); return(SA_ERR_HPI_INVALID_RESOURCE); } if (!(rpt->ResourceCapabilities & SAHPI_CAPABILITY_SENSOR)) { snmp_bc_unlock_handler(custom_handle); return(SA_ERR_HPI_CAPABILITY); } /* Check if sensor exists and if it supports setting of sensor enablement */ rdr = oh_get_rdr_by_type(handle->rptcache, rid, SAHPI_SENSOR_RDR, sid); if (rdr == NULL) { snmp_bc_unlock_handler(custom_handle); return(SA_ERR_HPI_NOT_PRESENT); } if (rdr->RdrTypeUnion.SensorRec.EnableCtrl == SAHPI_TRUE) { err("BladeCenter/RSA do not support snmp_bc_set_sensor_enable"); sinfo = (struct SensorInfo *)oh_get_rdr_data(handle->rptcache, rid, rdr->RecordId); if (sinfo == NULL) { err("No sensor data. Sensor=%s", rdr->IdString.Data); snmp_bc_unlock_handler(custom_handle); return(SA_ERR_HPI_INTERNAL_ERROR); } if (sinfo->sensor_enabled != enable) { /* Probably need to drive an OID, if hardware supported it */ sinfo->sensor_enabled = enable; /* FIXME:: Add SAHPI_ET_SENSOR_ENABLE_CHANGE event on IF event Q */ } } else { snmp_bc_unlock_handler(custom_handle); return(SA_ERR_HPI_READ_ONLY); } snmp_bc_unlock_handler(custom_handle); return(SA_OK); } /** * snmp_bc_get_sensor_event_enable: * @hnd: Handler data pointer. * @rid: Resource ID. * @sid: Sensor ID. * @enable: Location to store sensor event enablement boolean. * * Retrieves a sensor's boolean event enablement status. * * Return values: * SA_OK - Normal case. * SA_ERR_HPI_CAPABILITY - Resource doesn't have SAHPI_CAPABILITY_SENSOR. * SA_ERR_HPI_NOT_PRESENT - Sensor doesn't exist. **/ SaErrorT snmp_bc_get_sensor_event_enable(void *hnd, SaHpiResourceIdT rid, SaHpiSensorNumT sid, SaHpiBoolT *enable) { struct oh_handler_state *handle; struct SensorInfo *sinfo; struct snmp_bc_hnd *custom_handle; SaHpiRptEntryT *rpt; SaHpiRdrT *rdr; if (!hnd || !enable) { err("Invalid parameter"); return(SA_ERR_HPI_INVALID_PARAMS); } handle = (struct oh_handler_state *)hnd; custom_handle = (struct snmp_bc_hnd *)handle->data; snmp_bc_lock_handler(custom_handle); /* Check if resource exists and has sensor capabilities */ rpt = oh_get_resource_by_id(handle->rptcache, rid); if (!rpt) { snmp_bc_unlock_handler(custom_handle); return(SA_ERR_HPI_INVALID_RESOURCE); } if (!(rpt->ResourceCapabilities & SAHPI_CAPABILITY_SENSOR)) { snmp_bc_unlock_handler(custom_handle); return(SA_ERR_HPI_CAPABILITY); } /* Check if sensor exists and return enablement status */ rdr = oh_get_rdr_by_type(handle->rptcache, rid, SAHPI_SENSOR_RDR, sid); if (rdr == NULL) { snmp_bc_unlock_handler(custom_handle); return(SA_ERR_HPI_NOT_PRESENT); } sinfo = (struct SensorInfo *)oh_get_rdr_data(handle->rptcache, rid, rdr->RecordId); if (sinfo == NULL) { err("No sensor data. Sensor=%s", rdr->IdString.Data); snmp_bc_unlock_handler(custom_handle); return(SA_ERR_HPI_INTERNAL_ERROR); } *enable = sinfo->events_enabled; snmp_bc_unlock_handler(custom_handle); return(SA_OK); } /** * snmp_bc_set_sensor_event_enable: * @hnd: Handler data pointer. * @rid: Resource ID. * @sid: Sensor ID. * @enable: Enable/disable sensor. * * Sets a sensor's boolean event enablement status. * * Return values: * SA_OK - Normal case. * SA_ERR_HPI_CAPABILITY - Resource doesn't have SAHPI_CAPABILITY_SENSOR. * SA_ERR_HPI_NOT_PRESENT - Sensor doesn't exist. **/ SaErrorT snmp_bc_set_sensor_event_enable(void *hnd, SaHpiResourceIdT rid, SaHpiSensorNumT sid, const SaHpiBoolT enable) { struct oh_handler_state *handle; struct snmp_bc_hnd *custom_handle; SaHpiRptEntryT *rpt; SaHpiRdrT *rdr; struct SensorInfo *sinfo; if (!hnd ) { err("Invalid parameter."); return(SA_ERR_HPI_INVALID_PARAMS); } handle = (struct oh_handler_state *)hnd; custom_handle = (struct snmp_bc_hnd *)handle->data; snmp_bc_lock_handler(custom_handle); /* Check if resource exists and has sensor capabilities */ rpt = oh_get_resource_by_id(handle->rptcache, rid); if (!rpt) { snmp_bc_unlock_handler(custom_handle); return(SA_ERR_HPI_INVALID_RESOURCE); } if (!(rpt->ResourceCapabilities & SAHPI_CAPABILITY_SENSOR)) { snmp_bc_unlock_handler(custom_handle); return(SA_ERR_HPI_CAPABILITY); } /* Check if sensor exists and if it supports setting of sensor event enablement */ rdr = oh_get_rdr_by_type(handle->rptcache, rid, SAHPI_SENSOR_RDR, sid); if (rdr == NULL) { snmp_bc_unlock_handler(custom_handle); return(SA_ERR_HPI_NOT_PRESENT); } if (rdr->RdrTypeUnion.SensorRec.EventCtrl == SAHPI_SEC_PER_EVENT || rdr->RdrTypeUnion.SensorRec.EventCtrl == SAHPI_SEC_READ_ONLY_MASKS) { err("BladeCenter/RSA do not support snmp_bc_set_sensor_event_enable."); sinfo = (struct SensorInfo *)oh_get_rdr_data(handle->rptcache, rid, rdr->RecordId); if (sinfo == NULL) { err("No sensor data. Sensor=%s", rdr->IdString.Data); snmp_bc_unlock_handler(custom_handle); return(SA_ERR_HPI_INTERNAL_ERROR); } if (sinfo->events_enabled != enable) { /* Probably need to drive an OID, if hardware supported it */ sinfo->events_enabled = enable; /* FIXME:: Add SAHPI_ET_SENSOR_ENABLE_CHANGE event on IF event Q */ } } else { snmp_bc_unlock_handler(custom_handle); return(SA_ERR_HPI_READ_ONLY); } snmp_bc_unlock_handler(custom_handle); return(SA_OK); } /** * snmp_bc_get_sensor_event_masks: * @hnd: Handler data pointer. * @rid: Resource ID. * @sid: Sensor ID. * @AssertEventMask: Location to store sensor's assert event mask. * @DeassertEventMask: Location to store sensor's deassert event mask. * * Retrieves a sensor's assert and deassert event masks. * * Return values: * SA_OK - Normal case. * SA_ERR_HPI_CAPABILITY - Resource doesn't have SAHPI_CAPABILITY_SENSOR. * SA_ERR_HPI_NOT_PRESENT - Sensor doesn't exist. **/ SaErrorT snmp_bc_get_sensor_event_masks(void *hnd, SaHpiResourceIdT rid, SaHpiSensorNumT sid, SaHpiEventStateT *AssertEventMask, SaHpiEventStateT *DeassertEventMask) { struct oh_handler_state *handle; struct SensorInfo *sinfo; struct snmp_bc_hnd *custom_handle; SaHpiRptEntryT *rpt; SaHpiRdrT *rdr; if (!hnd ) { err("Invalid parameter."); return(SA_ERR_HPI_INVALID_PARAMS); } handle = (struct oh_handler_state *)hnd; custom_handle = (struct snmp_bc_hnd *)handle->data; snmp_bc_lock_handler(custom_handle); /* Check if resource exists and has sensor capabilities */ rpt = oh_get_resource_by_id(handle->rptcache, rid); if (!rpt) { snmp_bc_unlock_handler(custom_handle); return(SA_ERR_HPI_INVALID_RESOURCE); } if (!(rpt->ResourceCapabilities & SAHPI_CAPABILITY_SENSOR)) { snmp_bc_unlock_handler(custom_handle); return(SA_ERR_HPI_CAPABILITY); } /* Check if sensor exists and return enablement status */ rdr = oh_get_rdr_by_type(handle->rptcache, rid, SAHPI_SENSOR_RDR, sid); if (rdr == NULL) { snmp_bc_unlock_handler(custom_handle); return(SA_ERR_HPI_NOT_PRESENT); } sinfo = (struct SensorInfo *)oh_get_rdr_data(handle->rptcache, rid, rdr->RecordId); if (sinfo == NULL) { err("No sensor data. Sensor=%s", rdr->IdString.Data); snmp_bc_unlock_handler(custom_handle); return(SA_ERR_HPI_INTERNAL_ERROR); } if (AssertEventMask) *AssertEventMask = sinfo->assert_mask; if (DeassertEventMask) { if (rpt->ResourceCapabilities & SAHPI_CAPABILITY_EVT_DEASSERTS) { *DeassertEventMask = sinfo->assert_mask; } else { *DeassertEventMask = sinfo->deassert_mask; } } snmp_bc_unlock_handler(custom_handle); return(SA_OK); } /** * snmp_bc_set_sensor_event_masks: * @hnd: Handler data pointer. * @rid: Resource ID. * @sid: Sensor ID. * @act: Add/Remove action to perform on event masks. * @AssertEventMask: Sensor's assert event mask. * @DeassertEventMask: sensor's deassert event mask. * * Sets a sensor's assert and deassert event masks. * * Return values: * SA_OK - Normal case. * SA_ERR_HPI_CAPABILITY - Resource doesn't have SAHPI_CAPABILITY_SENSOR. * SA_ERR_HPI_INVALID_DATA - @act not valid or @AssertEventMask/@DeassertEventMask * contain events not supported by sensor. * SA_ERR_HPI_NOT_PRESENT - Sensor doesn't exist. **/ SaErrorT snmp_bc_set_sensor_event_masks(void *hnd, SaHpiResourceIdT rid, SaHpiSensorNumT sid, SaHpiSensorEventMaskActionT act, const SaHpiEventStateT AssertEventMask, const SaHpiEventStateT DeassertEventMask) { struct oh_handler_state *handle; struct snmp_bc_hnd *custom_handle; SaHpiRptEntryT *rpt; SaHpiRdrT *rdr; struct SensorInfo *sinfo; SaHpiEventStateT orig_assert_mask; SaHpiEventStateT orig_deassert_mask; if (!hnd ) { err("Invalid parameter."); return(SA_ERR_HPI_INVALID_PARAMS); } if (oh_lookup_sensoreventmaskaction(act) == NULL) { return(SA_ERR_HPI_INVALID_DATA); } handle = (struct oh_handler_state *)hnd; custom_handle = (struct snmp_bc_hnd *)handle->data; snmp_bc_lock_handler(custom_handle); /* Check if resource exists and has sensor capabilities */ rpt = oh_get_resource_by_id(handle->rptcache, rid); if (!rpt) { snmp_bc_unlock_handler(custom_handle); return(SA_ERR_HPI_INVALID_RESOURCE); } if (!(rpt->ResourceCapabilities & SAHPI_CAPABILITY_SENSOR)) { snmp_bc_unlock_handler(custom_handle); return(SA_ERR_HPI_CAPABILITY); } /* Check if sensor exists and if it supports setting of sensor event masks */ rdr = oh_get_rdr_by_type(handle->rptcache, rid, SAHPI_SENSOR_RDR, sid); if (rdr == NULL) { snmp_bc_unlock_handler(custom_handle); return(SA_ERR_HPI_NOT_PRESENT); } if (rdr->RdrTypeUnion.SensorRec.EventCtrl == SAHPI_SEC_PER_EVENT) { err("BladeCenter/RSA do not support snmp_bc_set_sensor_event_masks"); /* Probably need to drive an OID, if hardware supported it */ sinfo = (struct SensorInfo *)oh_get_rdr_data(handle->rptcache, rid, rdr->RecordId); if (sinfo == NULL) { err("No sensor data. Sensor=%s", rdr->IdString.Data); snmp_bc_unlock_handler(custom_handle); return(SA_ERR_HPI_INTERNAL_ERROR); } orig_assert_mask = sinfo->assert_mask; orig_deassert_mask = sinfo->deassert_mask; /* Check for invalid data in user masks */ if ( (AssertEventMask != SAHPI_ALL_EVENT_STATES) && (AssertEventMask & ~(rdr->RdrTypeUnion.SensorRec.Events)) ) { snmp_bc_unlock_handler(custom_handle); return(SA_ERR_HPI_INVALID_DATA); } if (!(rpt->ResourceCapabilities & SAHPI_CAPABILITY_EVT_DEASSERTS)) { if ( (DeassertEventMask != SAHPI_ALL_EVENT_STATES) && (DeassertEventMask & ~(rdr->RdrTypeUnion.SensorRec.Events)) ) { snmp_bc_unlock_handler(custom_handle); return(SA_ERR_HPI_INVALID_DATA); } } /* Add to event masks */ if (act == SAHPI_SENS_ADD_EVENTS_TO_MASKS) { if (AssertEventMask == SAHPI_ALL_EVENT_STATES) { sinfo->assert_mask = rdr->RdrTypeUnion.SensorRec.Events; } else { sinfo->assert_mask = sinfo->assert_mask | AssertEventMask; } if (!(rpt->ResourceCapabilities & SAHPI_CAPABILITY_EVT_DEASSERTS)) { if (DeassertEventMask == SAHPI_ALL_EVENT_STATES) { sinfo->deassert_mask = rdr->RdrTypeUnion.SensorRec.Events; } else { sinfo->deassert_mask = sinfo->deassert_mask | DeassertEventMask; } } } else { /* Remove from event masks */ if (AssertEventMask == SAHPI_ALL_EVENT_STATES) { sinfo->assert_mask = 0; } else { sinfo->assert_mask = sinfo->assert_mask & ~AssertEventMask; } if (!(rpt->ResourceCapabilities & SAHPI_CAPABILITY_EVT_DEASSERTS)) { if (DeassertEventMask == SAHPI_ALL_EVENT_STATES) { sinfo->deassert_mask = 0; } else { sinfo->deassert_mask = sinfo->deassert_mask & ~DeassertEventMask; } } } /* Generate event, if needed */ if (sinfo->assert_mask != orig_assert_mask) { /* FIXME:: Add SAHPI_ET_SENSOR_ENABLE_CHANGE event on IF event Q */ } else { if (!(rpt->ResourceCapabilities & SAHPI_CAPABILITY_EVT_DEASSERTS) && sinfo->deassert_mask != orig_deassert_mask) { /* FIXME:: Add SAHPI_ET_SENSOR_ENABLE_CHANGE event on IF event Q */ } } } else { snmp_bc_unlock_handler(custom_handle); return(SA_ERR_HPI_READ_ONLY); } snmp_bc_unlock_handler(custom_handle); return(SA_OK); } /** * snmp_bc_set_slot_state_sensor: * @hnd: Handler data pointer. * @e: Pointer to struct oh_event of the resource * @slot_ep: Pointer to Slot Entity Path of the resource. * * Sets Slot State Sensor values. * * Return values: * SA_OK - Normal case. * SA_ERR_HPI_INVALID_PARAMS - Resource doesn't have SAHPI_CAPABILITY_SENSOR. **/ SaErrorT snmp_bc_set_slot_state_sensor(void *hnd, struct oh_event *e, SaHpiEntityPathT *slot_ep) { SaErrorT err; SaHpiRptEntryT *res; SaHpiRdrT *rdr; struct SensorInfo *sinfo; struct oh_handler_state *handle; struct snmp_bc_hnd *custom_handle; if (!e || !hnd || !slot_ep ) return(SA_ERR_HPI_INVALID_PARAMS); handle = (struct oh_handler_state *) hnd; custom_handle = (struct snmp_bc_hnd *)handle->data; res = oh_get_resource_by_ep(handle->rptcache, slot_ep); if (!res) { err("No valid resource or rdr at hand. Could not process new rdr."); return(SA_ERR_HPI_INVALID_DATA); } rdr = oh_get_rdr_next(handle->rptcache, res->ResourceId, SAHPI_FIRST_ENTRY); while (rdr) { if ((rdr->RdrType == SAHPI_SENSOR_RDR) && (rdr->RdrTypeUnion.SensorRec.Num == BLADECENTER_SENSOR_NUM_SLOT_STATE)) { sinfo = (struct SensorInfo *)oh_get_rdr_data(handle->rptcache, res->ResourceId, rdr->RecordId); sinfo->cur_state = SAHPI_ES_PRESENT; sinfo->cur_child_rid = e->resource.ResourceId; err = oh_add_rdr(handle->rptcache, res->ResourceId, rdr, sinfo, 0); break; } rdr = oh_get_rdr_next(handle->rptcache, res->ResourceId, rdr->RecordId); } return(SA_OK); } /** * snmp_bc_reset_slot_state_sensor: * @hnd: Handler data pointer. * @slot_ep: Pointer to Slot Entity Path of the resource. * * REsets Slot State Sensor values. * * Return values: * SA_OK - Normal case. * SA_ERR_HPI_INVALID_PARAMS - Resource doesn't have SAHPI_CAPABILITY_SENSOR. **/ SaErrorT snmp_bc_reset_slot_state_sensor(void *hnd, SaHpiEntityPathT *slot_ep) { SaErrorT err; SaHpiRptEntryT *res; SaHpiRdrT *rdr; struct SensorInfo *sinfo; struct oh_handler_state *handle; struct snmp_bc_hnd *custom_handle; if (!hnd || !slot_ep ) return(SA_ERR_HPI_INVALID_PARAMS); handle = (struct oh_handler_state *) hnd; custom_handle = (struct snmp_bc_hnd *)handle->data; res = oh_get_resource_by_ep(handle->rptcache, slot_ep); if (!res) { err("No valid resource or rdr at hand. Could not process new rdr."); return(SA_ERR_HPI_INVALID_DATA); } rdr = oh_get_rdr_next(handle->rptcache, res->ResourceId, SAHPI_FIRST_ENTRY); while (rdr) { if ((rdr->RdrType == SAHPI_SENSOR_RDR) && (rdr->RdrTypeUnion.SensorRec.Num == BLADECENTER_SENSOR_NUM_SLOT_STATE)) { sinfo = (struct SensorInfo *)oh_get_rdr_data(handle->rptcache, res->ResourceId, rdr->RecordId); sinfo->cur_state = SAHPI_ES_ABSENT; sinfo->cur_child_rid = SAHPI_UNSPECIFIED_RESOURCE_ID; err = oh_add_rdr(handle->rptcache, res->ResourceId, rdr, sinfo, 0); break; } rdr = oh_get_rdr_next(handle->rptcache, res->ResourceId, rdr->RecordId); } return(SA_OK); } /** * snmp_bc_set_resource_slot_state_sensor: * @hnd: Handler data pointer. * @e: Pointer to struct oh_event of the resource * @resourcewidth: Number of physical slot this resource occupies * * Setting Slot State Sensor values for all slots occupied by this resource. * * Return values: * SA_OK - Normal case. * SA_ERR_HPI_INVALID_PARAMS - Resource doesn't have SAHPI_CAPABILITY_SENSOR. **/ SaErrorT snmp_bc_set_resource_slot_state_sensor(void *hnd, struct oh_event *e, guint resourcewidth) { guint i, j; SaErrorT err; SaHpiEntityPathT slot_ep; struct oh_handler_state *handle; struct snmp_bc_hnd *custom_handle; if (!e) return(SA_ERR_HPI_INVALID_PARAMS); handle = (struct oh_handler_state *) hnd; custom_handle = (struct snmp_bc_hnd *)handle->data; err = snmp_bc_extract_slot_ep( &(e->resource.ResourceEntity), &slot_ep); j = slot_ep.Entry[0].EntityLocation; if ( (custom_handle->platform == SNMP_BC_PLATFORM_BC) || (custom_handle->platform == SNMP_BC_PLATFORM_BCH)) { for (i = 0; i < resourcewidth; i++) { oh_set_ep_location(&slot_ep, slot_ep.Entry[0].EntityType, j+i); err = snmp_bc_set_slot_state_sensor(handle, e, &slot_ep); } } else if ( (custom_handle->platform == SNMP_BC_PLATFORM_BCT) || (custom_handle->platform == SNMP_BC_PLATFORM_BCHT) ){ for (i = 0; i < resourcewidth; i++) { oh_set_ep_location(&slot_ep, slot_ep.Entry[0].EntityType, j - i); err = snmp_bc_set_slot_state_sensor(handle, e, &slot_ep); } } return(SA_OK); } /** * snmp_bc_get_slot_state_sensor: * @hnd: Handler data pointer. * @rid: Resource ID. * @sid: Sensor ID. * @reading: Location of sensor's reading * * * Return values: * SA_OK - Normal case. * SA_ERR_HPI_INVALID_PARAMS - Resource doesn't have SAHPI_CAPABILITY_SENSOR. **/ SaErrorT snmp_bc_get_slot_state_sensor(void *hnd, SaHpiResourceIdT rid, SaHpiSensorNumT sid, SaHpiSensorReadingT *reading) { SaHpiRdrT *rdr; struct SensorInfo *sinfo; struct oh_handler_state *handle; struct snmp_bc_hnd *custom_handle; if (!hnd || !reading) return(SA_ERR_HPI_INVALID_PARAMS); handle = (struct oh_handler_state *) hnd; custom_handle = (struct snmp_bc_hnd *)handle->data; rdr = oh_get_rdr_by_type(handle->rptcache, rid, SAHPI_SENSOR_RDR, sid); if (rdr == NULL) return(SA_ERR_HPI_NOT_PRESENT); sinfo = (struct SensorInfo *)oh_get_rdr_data(handle->rptcache, rid, rdr->RecordId); if (sinfo == NULL) { err("No sensor data. Sensor=%s", rdr->IdString.Data); return(SA_ERR_HPI_INTERNAL_ERROR); } /* Set SensorReading structure using data stored in rptcache */ reading->IsSupported = rdr->RdrTypeUnion.SensorRec.DataFormat.IsSupported; reading->Type = rdr->RdrTypeUnion.SensorRec.DataFormat.ReadingType; reading->Value.SensorUint64 = (SaHpiUint64T) sinfo->cur_child_rid; return(SA_OK); } /** * snmp_bc_clear_resource_slot_state_sensor: * @hnd: Handler data pointer. * @rid: Resource ID. * @sid: Sensor ID. * @reading: Location of sensor's reading * * * * Return values: * SA_OK - Normal case. * SA_ERR_HPI_INVALID_PARAMS - Resource doesn't have SAHPI_CAPABILITY_SENSOR. **/ SaErrorT snmp_bc_reset_resource_slot_state_sensor(void *hnd, SaHpiRptEntryT *res) { guint i, j; SaErrorT err; guint resourcewidth; SaHpiEntityPathT slot_ep; struct oh_handler_state *handler; struct snmp_bc_hnd *custom_handler; struct ResourceInfo *res_info_ptr; if (!hnd || !res ) return(SA_ERR_HPI_INVALID_PARAMS); handler = (struct oh_handler_state *) hnd; custom_handler = (struct snmp_bc_hnd *)handler->data; err = snmp_bc_extract_slot_ep( &(res->ResourceEntity), &slot_ep); res_info_ptr = (struct ResourceInfo *)oh_get_resource_data(handler->rptcache, res->ResourceId); resourcewidth = res_info_ptr->resourcewidth; res_info_ptr->resourcewidth = 1; j = slot_ep.Entry[0].EntityLocation; if ( (custom_handler->platform == SNMP_BC_PLATFORM_BC) || (custom_handler->platform == SNMP_BC_PLATFORM_BCH)) { for (i = 0; i < resourcewidth; i++) { oh_set_ep_location(&slot_ep, slot_ep.Entry[0].EntityType, j+i); err = snmp_bc_reset_slot_state_sensor(handler, &slot_ep); } } else if ( (custom_handler->platform == SNMP_BC_PLATFORM_BCT) || (custom_handler->platform == SNMP_BC_PLATFORM_BCHT) ) { for (i = 0; i < resourcewidth; i++) { oh_set_ep_location(&slot_ep, slot_ep.Entry[0].EntityType, j - i); err = snmp_bc_reset_slot_state_sensor(handler, &slot_ep); } } return(SA_OK); } #define usepowerdomain1 \ do { \ switch(sid) { \ case BLADECENTER_SENSOR_NUM_MAX_POWER: \ thisOID = SNMP_BC_PD1POWERMAX; \ break; \ case BLADECENTER_SENSOR_NUM_ASSIGNED_POWER: \ thisOID = SNMP_BC_PD1POWERCURRENT; \ break; \ case BLADECENTER_SENSOR_NUM_MIN_POWER: \ thisOID = SNMP_BC_PD1POWERMIN; \ break; \ default: \ err("Not one of the Slot Power Sensors."); \ return(SA_ERR_HPI_INTERNAL_ERROR); \ break; \ } \ } while(0) #define usepowerdomain2 \ do { \ switch(sid) { \ case BLADECENTER_SENSOR_NUM_MAX_POWER: \ thisOID = SNMP_BC_PD2POWERMAX; \ break; \ case BLADECENTER_SENSOR_NUM_ASSIGNED_POWER: \ thisOID = SNMP_BC_PD2POWERCURRENT; \ break; \ case BLADECENTER_SENSOR_NUM_MIN_POWER: \ thisOID = SNMP_BC_PD2POWERMIN; \ break; \ default: \ err("Not one of the Slot Power Sensors."); \ return(SA_ERR_HPI_INTERNAL_ERROR); \ break; \ } \ } while(0) /** * snmp_bc_get_slot_power_sensor: * @hnd: Handler data pointer. * @rid: Resource ID. * @sid: Sensor ID. * @reading: Location of sensor's reading * * * Return values: * SA_OK - Normal case. * SA_ERR_HPI_INVALID_PARAMS. **/ SaErrorT snmp_bc_get_slot_power_sensor(void *hnd, SaHpiResourceIdT rid, SaHpiSensorNumT sid, SaHpiSensorReadingT *reading) { #define totalPower 0xEE guint slotnum; guint oidIndex; SaErrorT err; char *thisOID; SaHpiRdrT *rdr; gchar **power_substrs; char oid[SNMP_BC_MAX_OID_LENGTH]; SaHpiRptEntryT *res; struct snmp_value get_value; struct snmp_value pm3_state, pm4_state; struct oh_handler_state *handle; struct snmp_bc_hnd *custom_handle; if (!hnd || !reading ) return(SA_ERR_HPI_INVALID_PARAMS); handle = (struct oh_handler_state *) hnd; custom_handle = (struct snmp_bc_hnd *)handle->data; res = oh_get_resource_by_id(handle->rptcache, rid); slotnum = res->ResourceEntity.Entry[0].EntityLocation; rdr = oh_get_rdr_by_type(handle->rptcache, rid, SAHPI_SENSOR_RDR, sid); if (rdr == NULL) return(SA_ERR_HPI_NOT_PRESENT); oidIndex = SNMP_BC_NOT_VALID; thisOID = NULL; switch (res->ResourceEntity.Entry[0].EntityType) { case BLADECENTER_PERIPHERAL_BAY_SLOT: oidIndex = 2; usepowerdomain1; break; case BLADECENTER_SWITCH_SLOT: if (custom_handle->platform == SNMP_BC_PLATFORM_BCT) { switch (slotnum) { case 1: oidIndex = 9; break; case 2: oidIndex = 10; break; case 3: oidIndex = 11; break; case 4: oidIndex = 12; break; default: err("Not one of the valid BC-T Swich Slots."); return(SA_ERR_HPI_INTERNAL_ERROR); break; } usepowerdomain1; } else if (custom_handle->platform == SNMP_BC_PLATFORM_BC) { switch (slotnum) { case 1: oidIndex = 7; break; case 2: oidIndex = 8; break; case 3: oidIndex = 9; break; case 4: oidIndex = 10; break; default: err("Not one of the valid BC Switch Slots."); return(SA_ERR_HPI_INTERNAL_ERROR); break; } usepowerdomain1; } else if (custom_handle->platform == SNMP_BC_PLATFORM_BCH) { switch (slotnum) { case 1: oidIndex = 9; break; case 2: oidIndex = 10; break; case 3: oidIndex = 11; break; case 4: oidIndex = 12; break; case 5: oidIndex = 11; break; case 6: oidIndex = 12; break; case 7: oidIndex = 13; break; case 8: oidIndex = 14; break; case 9: oidIndex = 15; break; case 10: oidIndex = 16; break; default: err("Not one of the valid BC H Switch Slots."); return(SA_ERR_HPI_INTERNAL_ERROR); break; } if ( (slotnum == 5) || (slotnum == 6)){ usepowerdomain2; } else { usepowerdomain1; } } else if (custom_handle->platform == SNMP_BC_PLATFORM_BCHT) { switch (slotnum) { case 1: oidIndex = 19; break; case 2: oidIndex = 20; break; case 3: oidIndex = 21; break; case 4: oidIndex = 22; break; case 5: case 6: /* Reading is not supported on BC-HT*/ oidIndex = SNMP_BC_NOT_VALID; thisOID = NULL; break; case 7: oidIndex = 9; break; case 8: oidIndex = 10; break; case 9: oidIndex = 11; break; case 10: oidIndex = 12; break; default: err("Not one of the valid BC HT Switch Slots."); return(SA_ERR_HPI_INTERNAL_ERROR); break; } if (slotnum > 6){ usepowerdomain2; } else if (slotnum < 5) { usepowerdomain1; } } else { err("Not one of the supported platform."); return(SA_ERR_HPI_INTERNAL_ERROR); } break; case BLADECENTER_SYS_MGMNT_MODULE_SLOT: if (custom_handle->platform == SNMP_BC_PLATFORM_BCT) { switch (slotnum) { case 1: oidIndex = 7; break; case 2: oidIndex = 8; break; default: err("Not one of the valid BC-T MM Slots."); return(SA_ERR_HPI_INTERNAL_ERROR); break; } usepowerdomain1; } else if (custom_handle->platform == SNMP_BC_PLATFORM_BC) { switch (slotnum) { case 1: oidIndex = 5; break; case 2: oidIndex = 6; break; default: err("Not one of the valid BC MM Slots."); return(SA_ERR_HPI_INTERNAL_ERROR); break; } usepowerdomain1; } else if (custom_handle->platform == SNMP_BC_PLATFORM_BCH) { switch (slotnum) { case 1: oidIndex = 7; break; case 2: oidIndex = 8; break; default: err("Not one of the valid BC H MM Slots."); return(SA_ERR_HPI_INTERNAL_ERROR); break; } usepowerdomain1; } else if (custom_handle->platform == SNMP_BC_PLATFORM_BCHT) { switch (slotnum) { case 1: oidIndex = 17; break; case 2: oidIndex = 18; break; default: err("Not one of the valid BC HT MM Slots."); return(SA_ERR_HPI_INTERNAL_ERROR); break; } usepowerdomain1; } else { err("Not one of the supported platform."); return(SA_ERR_HPI_INTERNAL_ERROR); } break; case BLADECENTER_BLOWER_SLOT: if (custom_handle->platform == SNMP_BC_PLATFORM_BCT) { if ( (slotnum == 3) || (slotnum == 4)) { snprintf(oid, SNMP_BC_MAX_OID_LENGTH, "%s.%d", SNMP_BC_PMSTATE, 3); get_integer_object(oid, pm3_state); // getsnmpvalue(pm3_state); snprintf(oid, SNMP_BC_MAX_OID_LENGTH, "%s.%d", SNMP_BC_PMSTATE, 4); get_integer_object(oid, pm4_state); // getsnmpvalue(pm4_state); } switch (slotnum) { case 1: oidIndex = 3; break; case 2: oidIndex = 4; break; case 3: if ((pm3_state.integer == 3) && (pm4_state.integer == 3)) oidIndex = 5; else oidIndex = 1; break; case 4: if ((pm3_state.integer == 3) && (pm4_state.integer == 3)) oidIndex = 6; else oidIndex = 2; break; default: err("Not one of the valid BC-T Fan Slots."); return(SA_ERR_HPI_INTERNAL_ERROR); break; } if (slotnum < 3) { usepowerdomain1; } else { if ((pm3_state.integer == 3) && (pm4_state.integer == 3)) usepowerdomain1; else usepowerdomain2; } } else if (custom_handle->platform == SNMP_BC_PLATFORM_BC) { switch (slotnum) { case 1: oidIndex = 3; break; case 2: oidIndex = 4; break; default: err("Not one of the valid BC Fan Slots."); return(SA_ERR_HPI_INTERNAL_ERROR); break; } usepowerdomain1; } else if (custom_handle->platform == SNMP_BC_PLATFORM_BCH) { /* Reading is not supported on BC-H */ oidIndex = SNMP_BC_NOT_VALID; thisOID = NULL; } else if (custom_handle->platform == SNMP_BC_PLATFORM_BCHT) { /* pdp - FIX ME - Reading is not supported on BC-H */ oidIndex = SNMP_BC_NOT_VALID; thisOID = NULL; } else { err("Not one of the supported platform."); return(SA_ERR_HPI_INTERNAL_ERROR); } break; case SAHPI_ENT_PHYSICAL_SLOT: if (custom_handle->platform == SNMP_BC_PLATFORM_BCT) { switch (slotnum) { case 1: oidIndex = 13; break; case 2: oidIndex = 14; break; case 3: oidIndex = 15; break; case 4: oidIndex = 16; break; case 5: oidIndex = 3; break; case 6: oidIndex = 4; break; case 7: oidIndex = 5; break; case 8: oidIndex = 6; break; default: err("Not one of the valid BC-T Blade Slots."); return(SA_ERR_HPI_INTERNAL_ERROR); break; } if (slotnum < 5) { usepowerdomain1; } else { usepowerdomain2; } } else if (custom_handle->platform == SNMP_BC_PLATFORM_BC) { switch (slotnum) { case 1: oidIndex = 11; break; case 2: oidIndex = 12; break; case 3: oidIndex = 13; break; case 4: oidIndex = 14; break; case 5: oidIndex = 15; break; case 6: oidIndex = 16; break; case 7: oidIndex = 1; break; case 8: oidIndex = 2; break; case 9: oidIndex = 3; break; case 10: oidIndex = 4; break; case 11: oidIndex = 5; break; case 12: oidIndex = 6; break; case 13: oidIndex = 7; break; case 14: oidIndex = 8; break; default: err("Not one of the valid BC Blade Slots."); return(SA_ERR_HPI_INTERNAL_ERROR); break; } if (slotnum < 7) { usepowerdomain1; } else { usepowerdomain2; } } else if (custom_handle->platform == SNMP_BC_PLATFORM_BCH) { switch (slotnum) { case 1: case 8: oidIndex = 17; break; case 2: case 9: oidIndex = 18; break; case 3: case 10: oidIndex = 19; break; case 4: case 11: oidIndex = 20; break; case 5: case 12: oidIndex = 21; break; case 6: case 13: oidIndex = 22; break; case 7: case 14: oidIndex = 23; break; default: err("Not one of the valid BC H Switch Slots."); return(SA_ERR_HPI_INTERNAL_ERROR); break; } if ( slotnum > 7){ usepowerdomain2; } else { usepowerdomain1; } } else if (custom_handle->platform == SNMP_BC_PLATFORM_BCHT) { switch (slotnum) { case 1: oidIndex = 23; break; case 2: oidIndex = 24; break; case 3: oidIndex = 25; break; case 4: oidIndex = 26; break; case 5: oidIndex = 27; break; case 6: oidIndex = 28; break; case 7: oidIndex = 13; break; case 8: oidIndex = 14; break; case 9: oidIndex = 15; break; case 10: oidIndex = 16; break; case 11: oidIndex = 17; break; case 12: oidIndex = 18; break; default: err("Not one of the valid BC H Switch Slots."); return(SA_ERR_HPI_INTERNAL_ERROR); break; } if ( slotnum > 6){ usepowerdomain2; } else { usepowerdomain1; } } else { err("Not one of the supported platform."); return(SA_ERR_HPI_INTERNAL_ERROR); } break; case BLADECENTER_POWER_SUPPLY_SLOT: if ((custom_handle->platform == SNMP_BC_PLATFORM_BCT) || (custom_handle->platform == SNMP_BC_PLATFORM_BC) || (custom_handle->platform == SNMP_BC_PLATFORM_BCHT)) { /* Reading is not supported on BC, BC-T and BC-HT*/ oidIndex = SNMP_BC_NOT_VALID; thisOID = NULL; } else if (custom_handle->platform == SNMP_BC_PLATFORM_BCH) { switch (slotnum) { case 1: oidIndex = 3; break; case 2: oidIndex = 4; break; case 3: oidIndex = 5; break; case 4: oidIndex = 6; break; default: err("Not one of the valid BC H Power Module Slots."); return(SA_ERR_HPI_INTERNAL_ERROR); break; } usepowerdomain1; } else { err("Not one of the supported platform."); return(SA_ERR_HPI_INTERNAL_ERROR); } break; case SAHPI_ENT_SYS_MGMNT_MODULE: /* Assign Midplane Power reading to Virtual management module */ switch (slotnum) { case 0: oidIndex = 1; break; default: err("Not one of the valid resources."); return(SA_ERR_HPI_INTERNAL_ERROR); break; } usepowerdomain1; break; case SAHPI_ENT_SYSTEM_CHASSIS: usepowerdomain1; oidIndex = totalPower; break; default: thisOID = NULL; oidIndex = SNMP_BC_NOT_VALID; break; } if ( (thisOID == NULL) || (oidIndex == SNMP_BC_NOT_VALID)) { reading->IsSupported = SAHPI_FALSE; return(SA_OK); } else if (oidIndex == totalPower) { if (custom_handle->platform == SNMP_BC_PLATFORM_BCT) { usepowerdomain1; snprintf(oid, SNMP_BC_MAX_OID_LENGTH, "%s.%d", thisOID, 17); get_string_object(oid, pm3_state); usepowerdomain2; snprintf(oid, SNMP_BC_MAX_OID_LENGTH, "%s.%d", thisOID, 7); get_string_object(oid, pm4_state); } else if (custom_handle->platform == SNMP_BC_PLATFORM_BC) { usepowerdomain1; snprintf(oid, SNMP_BC_MAX_OID_LENGTH, "%s.%d", thisOID, 17); get_string_object(oid, pm3_state); usepowerdomain2; snprintf(oid, SNMP_BC_MAX_OID_LENGTH, "%s.%d", thisOID, 9); get_string_object(oid, pm4_state); } else if (custom_handle->platform == SNMP_BC_PLATFORM_BCH) { usepowerdomain1; snprintf(oid, SNMP_BC_MAX_OID_LENGTH, "%s.%d", thisOID, 24); get_string_object(oid, pm3_state); usepowerdomain2; snprintf(oid, SNMP_BC_MAX_OID_LENGTH, "%s.%d", thisOID, 24); get_string_object(oid, pm4_state); } else if (custom_handle->platform == SNMP_BC_PLATFORM_BCHT) { usepowerdomain1; snprintf(oid, SNMP_BC_MAX_OID_LENGTH, "%s.%d", thisOID, 29); get_string_object(oid, pm3_state); usepowerdomain2; snprintf(oid, SNMP_BC_MAX_OID_LENGTH, "%s.%d", thisOID, 19); get_string_object(oid, pm4_state); } else { err("Not one of the supported platform.\n"); return(SA_ERR_HPI_INTERNAL_ERROR); } power_substrs = g_strsplit(pm3_state.string, " ", -1); if (power_substrs[0] == NULL) return(SA_ERR_HPI_INTERNAL_ERROR); reading->Value.SensorUint64 = g_strtod(power_substrs[0], NULL); power_substrs = g_strsplit(pm4_state.string, " ", -1); if (power_substrs[0] == NULL) return(SA_ERR_HPI_INTERNAL_ERROR); reading->Value.SensorUint64 = reading->Value.SensorUint64 + g_strtod(power_substrs[0], NULL); /* Set SensorReading structure */ reading->IsSupported = rdr->RdrTypeUnion.SensorRec.DataFormat.IsSupported; reading->Type = rdr->RdrTypeUnion.SensorRec.DataFormat.ReadingType; return(SA_OK); } snprintf(oid, SNMP_BC_MAX_OID_LENGTH, "%s.%d", thisOID, oidIndex); get_string_object(oid, get_value); /* Set SensorReading structure */ if (g_ascii_strncasecmp(get_value.string, "N/A", sizeof("N/A")) == 0) { reading->Value.SensorUint64 = 0; } else { power_substrs = g_strsplit(get_value.string, " ", -1); if (power_substrs[0] == NULL) return(SA_ERR_HPI_INTERNAL_ERROR); reading->Value.SensorUint64 = g_strtod(power_substrs[0], NULL); } reading->IsSupported = rdr->RdrTypeUnion.SensorRec.DataFormat.IsSupported; reading->Type = rdr->RdrTypeUnion.SensorRec.DataFormat.ReadingType; return(SA_OK); } /** * * Intrastructure to Plugin APIs * **/ void * oh_get_sensor_reading (void *, SaHpiResourceIdT, SaHpiSensorNumT, SaHpiSensorReadingT *, SaHpiEventStateT *) __attribute__ ((weak, alias("snmp_bc_get_sensor_reading"))); void * oh_get_sensor_thresholds (void *, SaHpiResourceIdT, SaHpiSensorNumT, SaHpiSensorThresholdsT *) __attribute__ ((weak, alias("snmp_bc_get_sensor_thresholds"))); void * oh_set_sensor_thresholds (void *, SaHpiResourceIdT, SaHpiSensorNumT, const SaHpiSensorThresholdsT *) __attribute__ ((weak, alias("snmp_bc_set_sensor_thresholds"))); void * oh_get_sensor_enable (void *, SaHpiResourceIdT, SaHpiSensorNumT, SaHpiBoolT *) __attribute__ ((weak, alias("snmp_bc_get_sensor_enable"))); void * oh_set_sensor_enable (void *, SaHpiResourceIdT, SaHpiSensorNumT, SaHpiBoolT) __attribute__ ((weak, alias("snmp_bc_set_sensor_enable"))); void * oh_get_sensor_event_enables (void *, SaHpiResourceIdT, SaHpiSensorNumT, SaHpiBoolT *) __attribute__ ((weak, alias("snmp_bc_get_sensor_event_enable"))); void * oh_set_sensor_event_enables (void *, SaHpiResourceIdT id, SaHpiSensorNumT, SaHpiBoolT *) __attribute__ ((weak, alias("snmp_bc_set_sensor_event_enable"))); void * oh_get_sensor_event_masks (void *, SaHpiResourceIdT, SaHpiSensorNumT, SaHpiEventStateT *, SaHpiEventStateT *) __attribute__ ((weak, alias("snmp_bc_get_sensor_event_masks"))); void * oh_set_sensor_event_masks (void *, SaHpiResourceIdT, SaHpiSensorNumT, SaHpiSensorEventMaskActionT, SaHpiEventStateT, SaHpiEventStateT) __attribute__ ((weak, alias("snmp_bc_set_sensor_event_masks"))); openhpi-2.14.1/plugins/snmp_bc/snmp_bc_sensor.h0000644000076400007640000000666511302566770016502 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004, 2006 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * Steve Sherman */ #ifndef __SNMP_BC_SENSOR_H #define __SNMP_BC_SENSOR_H SaErrorT snmp_bc_get_sensor_reading(void *hnd, SaHpiResourceIdT rid, SaHpiSensorNumT sid, SaHpiSensorReadingT *reading, SaHpiEventStateT *state); SaErrorT snmp_bc_get_sensor_thresholds(void *hnd, SaHpiResourceIdT rid, SaHpiSensorNumT sid, SaHpiSensorThresholdsT *thres); SaErrorT snmp_bc_set_sensor_thresholds(void *hnd, SaHpiResourceIdT rid, SaHpiSensorNumT sid, const SaHpiSensorThresholdsT *thres); SaErrorT snmp_bc_get_sensor_enable(void *hnd, SaHpiResourceIdT rid, SaHpiSensorNumT sid, SaHpiBoolT *enable); SaErrorT snmp_bc_set_sensor_enable(void *hnd, SaHpiResourceIdT rid, SaHpiSensorNumT sid, const SaHpiBoolT enable); SaErrorT snmp_bc_get_sensor_event_enable(void *hnd, SaHpiResourceIdT rid, SaHpiSensorNumT sid, SaHpiBoolT *enable); SaErrorT snmp_bc_set_sensor_event_enable(void *hnd, SaHpiResourceIdT rid, SaHpiSensorNumT sid, const SaHpiBoolT enable); SaErrorT snmp_bc_get_sensor_event_masks(void *hnd, SaHpiResourceIdT rid, SaHpiSensorNumT sid, SaHpiEventStateT *AssertEventMask, SaHpiEventStateT *DeassertEventMask); SaErrorT snmp_bc_set_sensor_event_masks(void *hnd, SaHpiResourceIdT rid, SaHpiSensorNumT sid, SaHpiSensorEventMaskActionT act, const SaHpiEventStateT AssertEventMask, const SaHpiEventStateT DeassertEventMask); SaErrorT snmp_bc_get_sensor_eventstate(void *hnd, SaHpiResourceIdT rid, SaHpiSensorNumT sid, SaHpiSensorReadingT *reading, SaHpiEventStateT *state); SaErrorT snmp_bc_get_sensor_oid_reading(void *hnd, SaHpiResourceIdT rid, SaHpiSensorNumT sid, const char *raw_oid, SaHpiSensorReadingT *reading); SaErrorT snmp_bc_set_threshold_reading(void *hnd, SaHpiResourceIdT rid, SaHpiSensorNumT sid, const char *raw_oid, const SaHpiSensorReadingT *reading); SaErrorT snmp_bc_get_logical_sensors(void *hnd, SaHpiResourceIdT rid, SaHpiSensorNumT sid, SaHpiSensorReadingT *reading); SaErrorT snmp_bc_set_slot_state_sensor(void *hnd, struct oh_event *e, SaHpiEntityPathT *slot_ep); SaErrorT snmp_bc_reset_slot_state_sensor(void *hnd, SaHpiEntityPathT *slot_ep); SaErrorT snmp_bc_set_resource_slot_state_sensor(void *hnd, struct oh_event *e, guint resourcewidth); SaErrorT snmp_bc_reset_resource_slot_state_sensor(void *hnd, SaHpiRptEntryT *res); SaErrorT snmp_bc_get_slot_state_sensor(void *hnd, SaHpiResourceIdT rid, SaHpiSensorNumT sid, SaHpiSensorReadingT *reading); SaErrorT snmp_bc_get_slot_power_sensor(void *hnd, SaHpiResourceIdT rid, SaHpiSensorNumT sid, SaHpiSensorReadingT *reading); #endif openhpi-2.14.1/plugins/snmp_bc/snmp_bc_event.h0000644000076400007640000000407211302566770016300 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004, 2006 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * Steve Sherman */ #ifndef __SNMP_BC_EVENT_H #define __SNMP_BC_EVENT_H typedef enum { EVENT_NOT_MAPPED, EVENT_NOT_ALERTABLE, } OEMReasonCodeT; typedef struct { SaHpiResourceIdT rid; BCRptEntryT rpt; struct snmp_bc_sensor *sensor_array_ptr; SaHpiEntityPathT ep; } LogSource2ResourceT; typedef struct { SaHpiEventT hpievent; SaHpiEntityPathT ep; /* ep that matches hpievent.ResourceID */ SaHpiEventStateT sensor_recovery_state; SaHpiHsStateT hs_event_auto_state; /* Hot swap state in hpievent */ SaHpiHsStateT hs_recovery_state; /* Kill this when BC removes "Recovery" hot swap events */ SaHpiHsStateT hs_recovery_auto_state; /* Kill this when BC removes "Recovery" hot swap events */ SaHpiBoolT event_res_failure; SaHpiBoolT event_res_failure_unexpected; } EventMapInfoT; SaErrorT event2hpi_hash_init(struct oh_handler_state *handle); SaErrorT event2hpi_hash_free(struct oh_handler_state *handle); SaErrorT snmp_bc_discover_res_events(struct oh_handler_state *handle, SaHpiEntityPathT *ep, const struct ResourceInfo *resinfo); SaErrorT snmp_bc_discover_sensor_events(struct oh_handler_state *handle, SaHpiEntityPathT *ep, SaHpiSensorNumT sid, const struct snmp_bc_sensor *sinfo); SaErrorT snmp_bc_log2event(struct oh_handler_state *handle, gchar *logstr, SaHpiEventT *event, int isdst, LogSource2ResourceT *ret_logsrc2res); SaErrorT snmp_bc_add_to_eventq(struct oh_handler_state *handle, SaHpiEventT *thisEvent, SaHpiBoolT prepend); #endif openhpi-2.14.1/plugins/snmp_bc/snmp_bc_hotswap.h0000644000076400007640000000267011302566770016646 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * Steve Sherman */ #ifndef __SNMP_BC_HOTSWAP_H #define __SNMP_BC_HOTSWAP_H SaErrorT snmp_bc_get_hotswap_state(void *hnd, SaHpiResourceIdT rid, SaHpiHsStateT *state); SaErrorT snmp_bc_set_hotswap_state(void *hnd, SaHpiResourceIdT rid, SaHpiHsStateT state); SaErrorT snmp_bc_request_hotswap_action(void *hnd, SaHpiResourceIdT rid, SaHpiHsActionT act); SaErrorT snmp_bc_get_indicator_state(void *hnd, SaHpiResourceIdT rid, SaHpiHsIndicatorStateT *state); SaErrorT snmp_bc_set_indicator_state(void *hnd, SaHpiResourceIdT rid, SaHpiHsIndicatorStateT state); SaErrorT snmp_bc_set_autoinsert_timeout(void *hnd, SaHpiTimeoutT Timeout); SaErrorT snmp_bc_get_autoextract_timeout(void *hnd, SaHpiResourceIdT rid, SaHpiTimeoutT *Timeout); SaErrorT snmp_bc_set_autoextract_timeout(void *hnd, SaHpiResourceIdT rid, SaHpiTimeoutT Timeout); #endif openhpi-2.14.1/plugins/snmp_bc/snmp_bc_control.c0000644000076400007640000002715211302566770016636 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004, 2006 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * Steve Sherman */ #include /** * snmp_bc_get_control_state: * @hnd: Handler data pointer. * @rid: Resource ID. * @cid: Control ID. * @mode: Location to store control's operational mode. * @state: Location to store control's state. * * Retrieves a control's operational mode and/or state. Both @mode and @state * may be NULL (e.g. check for presence). * * Return values: * SA_OK - Normal case. * SA_ERR_HPI_CAPABILITY - Resource doesn't have SAHPI_CAPABILITY_CONTROL. * SA_ERR_HPI_INVALID_CMD - Control is write-only. * SA_ERR_HPI_INVALID_DATA - @state contain invalid text line number. * SA_ERR_HPI_INVALID_RESOURCE - Resource doesn't exist. * SA_ERR_HPI_NOT_PRESENT - Control doesn't exist. **/ SaErrorT snmp_bc_get_control_state(void *hnd, SaHpiResourceIdT rid, SaHpiCtrlNumT cid, SaHpiCtrlModeT *mode, SaHpiCtrlStateT *state) { SaErrorT err; SaHpiCtrlStateT working_state; struct ControlInfo *cinfo; struct snmp_value get_value; struct oh_handler_state *handle; struct snmp_bc_hnd *custom_handle; SaHpiRptEntryT *rpt; SaHpiRdrT *rdr; if (!hnd) { err("Invalid parameter."); return(SA_ERR_HPI_INVALID_PARAMS); } handle = (struct oh_handler_state *)hnd; custom_handle = (struct snmp_bc_hnd *)handle->data; if (!custom_handle) { err("Invalid parameter."); return(SA_ERR_HPI_INVALID_PARAMS); } snmp_bc_lock_handler(custom_handle); memset(&working_state, 0, sizeof(SaHpiCtrlStateT)); /* Check if resource exists and has control capabilities */ rpt = oh_get_resource_by_id(handle->rptcache, rid); if (!rpt) { snmp_bc_unlock_handler(custom_handle); return(SA_ERR_HPI_INVALID_RESOURCE); } if (!(rpt->ResourceCapabilities & SAHPI_CAPABILITY_CONTROL)) { snmp_bc_unlock_handler(custom_handle); return(SA_ERR_HPI_CAPABILITY); } /* Find control and its mapping data - see if it accessable */ rdr = oh_get_rdr_by_type(handle->rptcache, rid, SAHPI_CTRL_RDR, cid); if (rdr == NULL) { snmp_bc_unlock_handler(custom_handle); return(SA_ERR_HPI_NOT_PRESENT); } cinfo = (struct ControlInfo *)oh_get_rdr_data(handle->rptcache, rid, rdr->RecordId); if (cinfo == NULL) { err("No control data. Control=%s", rdr->IdString.Data); snmp_bc_unlock_handler(custom_handle); return(SA_ERR_HPI_INTERNAL_ERROR); } if (rdr->RdrTypeUnion.CtrlRec.WriteOnly) { snmp_bc_unlock_handler(custom_handle); return(SA_ERR_HPI_INVALID_CMD); } if (!mode && !state) { snmp_bc_unlock_handler(custom_handle); return(SA_OK); } if (state) { if (state->Type == SAHPI_CTRL_TYPE_TEXT) { if (state->StateUnion.Text.Line != SAHPI_TLN_ALL_LINES || state->StateUnion.Text.Line > rdr->RdrTypeUnion.CtrlRec.TypeUnion.Text.MaxLines) { snmp_bc_unlock_handler(custom_handle); return(SA_ERR_HPI_INVALID_DATA); } } /* Find control's state */ working_state.Type = rdr->RdrTypeUnion.CtrlRec.Type; err = snmp_bc_oid_snmp_get(custom_handle, &(rdr->Entity), cinfo->mib.loc_offset, cinfo->mib.oid, &get_value, SAHPI_TRUE); if (err || get_value.type != ASN_INTEGER) { err("Cannot read SNMP OID=%s; Type=%d.", cinfo->mib.oid, get_value.type); snmp_bc_unlock_handler(custom_handle); return(err); } switch (rdr->RdrTypeUnion.CtrlRec.Type) { case SAHPI_CTRL_TYPE_DIGITAL: if (cinfo->mib.isDigitalReadStateConstant) { /* If control always returns a constant state */ working_state.StateUnion.Digital = cinfo->mib.DigitalStateConstantValue; } else { /* Translate SNMP reading into digital state */ int i, found; found = 0; for (i=0; imib.digitalmap[i] == get_value.integer) { found++; break; } } if (found) { switch (i) { case 0: working_state.StateUnion.Digital = SAHPI_CTRL_STATE_OFF; break; case 1: working_state.StateUnion.Digital = SAHPI_CTRL_STATE_ON; break; case 2: working_state.StateUnion.Digital = SAHPI_CTRL_STATE_PULSE_OFF; break; case 3: working_state.StateUnion.Digital = SAHPI_CTRL_STATE_PULSE_ON; break; default: err("HPI Spec change: Add control digital states"); snmp_bc_unlock_handler(custom_handle); return(SA_ERR_HPI_INTERNAL_ERROR); } } else { err("Control's value not defined"); snmp_bc_unlock_handler(custom_handle); return(SA_ERR_HPI_INTERNAL_ERROR); } } break; case SAHPI_CTRL_TYPE_DISCRETE: working_state.StateUnion.Discrete = get_value.integer; break; case SAHPI_CTRL_TYPE_ANALOG: snmp_bc_unlock_handler(custom_handle); err("Analog controls not supported."); return(SA_ERR_HPI_INTERNAL_ERROR); case SAHPI_CTRL_TYPE_STREAM: snmp_bc_unlock_handler(custom_handle); err("Stream controls not supported."); return(SA_ERR_HPI_INTERNAL_ERROR); case SAHPI_CTRL_TYPE_TEXT: snmp_bc_unlock_handler(custom_handle); err("Text controls not supported."); return(SA_ERR_HPI_INTERNAL_ERROR); case SAHPI_CTRL_TYPE_OEM: snmp_bc_unlock_handler(custom_handle); err("Oem controls not supported."); return(SA_ERR_HPI_INTERNAL_ERROR); default: err("%s has invalid control state=%d.", cinfo->mib.oid, working_state.Type); snmp_bc_unlock_handler(custom_handle); return(SA_ERR_HPI_INTERNAL_ERROR); } } if (state) memcpy(state, &working_state, sizeof(SaHpiCtrlStateT)); if (mode) *mode = cinfo->cur_mode; snmp_bc_unlock_handler(custom_handle); return(SA_OK); } /** * snmp_bc_set_control_state: * @hnd: Handler data pointer. * @rid: Resource ID. * @cid: Control ID. * @mode: Control's operational mode to set. * @state: Pointer to control's state to set. * * Sets a control's operational mode and/or state. * * Return values: * SA_OK - Normal case. * SA_ERR_HPI_CAPABILITY - Resource doesn't have SAHPI_CAPABILITY_CONTROL. * SA_ERR_HPI_INVALID_REQUEST - @state contains bad text control data. * SA_ERR_HPI_INVALID_RESOURCE - Resource doesn't exist. * SA_ERR_HPI_NOT_PRESENT - Control doesn't exist. * SA_ERR_HPI_READ_ONLY - Change mode of a read-only mode control. * Note this is only returned if the specified mode * is different than the control's default mode. **/ SaErrorT snmp_bc_set_control_state(void *hnd, SaHpiResourceIdT rid, SaHpiCtrlNumT cid, SaHpiCtrlModeT mode, SaHpiCtrlStateT *state) { int value; SaErrorT err; SaHpiRptEntryT *rpt; SaHpiRdrT *rdr; struct ControlInfo *cinfo; struct oh_handler_state *handle; struct snmp_bc_hnd *custom_handle; struct snmp_value set_value; if (!hnd) { err("Invalid parameter."); return(SA_ERR_HPI_INVALID_PARAMS); } handle = (struct oh_handler_state *)hnd; custom_handle = (struct snmp_bc_hnd *)handle->data; if (!custom_handle) { err("Invalid parameter."); return(SA_ERR_HPI_INVALID_PARAMS); } snmp_bc_lock_handler(custom_handle); /* Check if resource exists and has control capabilities */ rpt = oh_get_resource_by_id(handle->rptcache, rid); if (!rpt) { snmp_bc_unlock_handler(custom_handle); return(SA_ERR_HPI_INVALID_RESOURCE); } if (!(rpt->ResourceCapabilities & SAHPI_CAPABILITY_CONTROL)) { snmp_bc_unlock_handler(custom_handle); return(SA_ERR_HPI_CAPABILITY); } /* Find control and its mapping data - see if it accessable */ rdr = oh_get_rdr_by_type(handle->rptcache, rid, SAHPI_CTRL_RDR, cid); if (rdr == NULL) { snmp_bc_unlock_handler(custom_handle); return(SA_ERR_HPI_NOT_PRESENT); } cinfo = (struct ControlInfo *)oh_get_rdr_data(handle->rptcache, rid, rdr->RecordId); if (cinfo == NULL) { err("No control data. Control=%s", rdr->IdString.Data); snmp_bc_unlock_handler(custom_handle); return(SA_ERR_HPI_INTERNAL_ERROR); } /* Validate static control state and mode data */ err = oh_valid_ctrl_state_mode(&(rdr->RdrTypeUnion.CtrlRec), mode, state); if (err) { snmp_bc_unlock_handler(custom_handle); return(err); } /* Write control state */ if (mode != SAHPI_CTRL_MODE_AUTO && state) { switch (state->Type) { case SAHPI_CTRL_TYPE_DIGITAL: /* Code with switch to discover spec changes that need to be reflected in snmp_bc_resources.c digital read/write arrays */ switch (state->StateUnion.Digital) { case SAHPI_CTRL_STATE_OFF: value = cinfo->mib.digitalwmap[SAHPI_CTRL_STATE_OFF]; break; case SAHPI_CTRL_STATE_ON: value = cinfo->mib.digitalwmap[SAHPI_CTRL_STATE_ON]; break; case SAHPI_CTRL_STATE_PULSE_OFF: value = cinfo->mib.digitalwmap[SAHPI_CTRL_STATE_PULSE_OFF]; break; case SAHPI_CTRL_STATE_PULSE_ON: value = cinfo->mib.digitalwmap[SAHPI_CTRL_STATE_PULSE_ON]; break; default: err("HPI Spec change: Add control digital states"); snmp_bc_unlock_handler(custom_handle); return(SA_ERR_HPI_INTERNAL_ERROR); } if (value < 0) { err("Invalid hardware control state - %s", oh_lookup_ctrlstatedigital(state->StateUnion.Digital)); snmp_bc_unlock_handler(custom_handle); return(SA_ERR_HPI_INVALID_REQUEST); } set_value.type = ASN_INTEGER; set_value.str_len = 1; set_value.integer = value; err = snmp_bc_oid_snmp_set(custom_handle, &(rdr->Entity), cinfo->mib.loc_offset, cinfo->mib.oid, set_value); if (err) { err("Cannot set SNMP OID=%s; Value=%d.", cinfo->mib.oid, (int)set_value.integer); snmp_bc_unlock_handler(custom_handle); return(err); } break; case SAHPI_CTRL_TYPE_DISCRETE: set_value.type = ASN_INTEGER; set_value.str_len = 1; set_value.integer = state->StateUnion.Discrete; err = snmp_bc_oid_snmp_set(custom_handle, &(rdr->Entity), cinfo->mib.loc_offset, cinfo->mib.oid, set_value); if (err) { err("Cannot set SNMP OID=%s; Value=%d.", cinfo->mib.oid, (int)set_value.integer); snmp_bc_unlock_handler(custom_handle); return(err); } break; case SAHPI_CTRL_TYPE_ANALOG: err("Analog controls not supported."); snmp_bc_unlock_handler(custom_handle); return(SA_ERR_HPI_INTERNAL_ERROR); case SAHPI_CTRL_TYPE_STREAM: err("Stream controls not supported."); snmp_bc_unlock_handler(custom_handle); return(SA_ERR_HPI_INTERNAL_ERROR); case SAHPI_CTRL_TYPE_TEXT: err("Text controls not supported."); snmp_bc_unlock_handler(custom_handle); return(SA_ERR_HPI_INTERNAL_ERROR); case SAHPI_CTRL_TYPE_OEM: err("OEM controls not supported."); snmp_bc_unlock_handler(custom_handle); return(SA_ERR_HPI_INTERNAL_ERROR); default: err("Invalid control state=%d", state->Type); snmp_bc_unlock_handler(custom_handle); return(SA_ERR_HPI_INTERNAL_ERROR); } } /* Write control mode, if changed */ if (mode != cinfo->cur_mode) { cinfo->cur_mode = mode; } snmp_bc_unlock_handler(custom_handle); return(SA_OK); } void * oh_get_control_state (void *, SaHpiResourceIdT, SaHpiCtrlNumT, SaHpiCtrlModeT *, SaHpiCtrlStateT *) __attribute__ ((weak, alias("snmp_bc_get_control_state"))); void * oh_set_control_state (void *, SaHpiResourceIdT,SaHpiCtrlNumT, SaHpiCtrlModeT, SaHpiCtrlStateT *) __attribute__ ((weak, alias("snmp_bc_set_control_state"))); openhpi-2.14.1/plugins/snmp_bc/snmp_bc_time.h0000644000076400007640000000514511302566770016117 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2003, 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * Peter Phan */ #ifndef __SNMP_BC_TIME_H #define __SNMP_BC_TIME_H /* * Set timezone constants */ typedef enum { DST_NONE = 0, DST_USA, DST_ESA, DST_MID, DST_EEC, DST_EEU, DST_EGT, DST_FLE, DST_IRN, DST_AUS, DST_TAS, DST_NWZ, DST_AUTOMATIC // Must be last in list, used to validate entry } DST_STANDARDS; typedef enum { FIRST_WEEK = 1, SECOND_WEEK, THIRD_WEEK, FOURTH_WEEK, LAST_WEEK } DST_WEEK; typedef enum { SUNDAY = 1, MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY } DST_WEEKDAY; typedef enum { JANUARY = 1, FEBRUARY, MARCH, APRIL, MAY, JUNE, JULY, AUGUST, SEPTEMBER, OCTOBER, NOVEMBER, DECEMBER } DST_MONTH; /* * Daylight saving time standards table entry * * This structure contains the definition of how daylight saving * time is observed for the supported timezones. */ typedef struct tag_DST_ENTRY { unsigned char start_hour; // Hour daylight saving begins unsigned char start_day; // Specific day daylight saving begins unsigned char start_week; // Week number daylight saving begins unsigned char start_weekday; // Day of week daylight saving begins unsigned char start_month; // Month daylight saving begins unsigned char end_hour; // Hour daylight saving ends unsigned char end_day; // Specific day daylight saving ends unsigned char end_week; // Week number daylight saving ends unsigned char end_weekday; // Day of week daylight saving ends unsigned char end_month; // Month daylight saving ends } DST_ENTRY; /* * Function Prototyping */ gboolean is_dst_in_effect(struct tm *, gchar **); gboolean is_leap_year(guchar ); guchar get_day_of_month(guchar, guchar, guchar, guchar); SaErrorT snmp_bc_set_dst(struct oh_handler_state *, struct tm *); SaErrorT snmp_bc_set_sp_time(struct snmp_bc_hnd *, struct tm *); SaErrorT snmp_bc_get_sp_time(struct oh_handler_state *, struct tm *); #endif openhpi-2.14.1/plugins/snmp_bc/snmp_bc.c0000644000076400007640000003507211302566770015076 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2003, 2006 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * Renier Morales * Steve Sherman */ #include /** * snmp_bc_get_event: * @hnd: Handler data pointer. * @event: Infra-structure event pointer. * * Passes plugin events up to the infra-structure for processing. * * Return values: * 1 - events to be processed. * SA_OK - No events to be processed. * SA_ERR_HPI_INVALID_PARAMS - @event is NULL. **/ SaErrorT snmp_bc_get_event(void *hnd) { SaErrorT err; struct oh_handler_state *handle; struct snmp_bc_hnd *custom_handle; if (!hnd) { err("Invalid parameter"); return(SA_ERR_HPI_INVALID_PARAMS); } handle = (struct oh_handler_state *)hnd; custom_handle = (struct snmp_bc_hnd *)handle->data; snmp_bc_lock_handler(custom_handle); err = snmp_bc_check_selcache(handle, 1, SAHPI_NEWEST_ENTRY); /* If err is encountered during el cache sync, */ /* log error but take no corrected action. */ /* New entry will still be there next time */ if (err) { err("Event Log cache build/sync failed. Error=%s", oh_lookup_error(err)); /* return(err); */ } if (g_slist_length(custom_handle->eventq) > 0) { struct oh_event *e = custom_handle->eventq->data; e->hid = handle->hid; oh_evt_queue_push(handle->eventq, e); custom_handle->eventq = g_slist_remove_link(custom_handle->eventq, custom_handle->eventq); snmp_bc_unlock_handler(custom_handle); return(1); } /* No events for infra-structure to process */ snmp_bc_unlock_handler(custom_handle); return(SA_OK); } /** * snmp_bc_set_resource_tag: * @hnd: Handler data pointer. * @rid: Resource ID. * @tag: Pointer to SaHpiTextBufferT. * * Sets resource's tag. * * Return values: * SA_OK - Normal case. * SA_ERR_HPI_INVALID_PARAMS - @tag is NULL or invalid. * SA_ERR_HPI_OUT_OF_MEMORY - No memory to allocate event. **/ SaErrorT snmp_bc_set_resource_tag(void *hnd, SaHpiResourceIdT rid, SaHpiTextBufferT *tag) { SaErrorT err; SaHpiRptEntryT *rpt; struct oh_event *e; struct oh_handler_state *handle; struct snmp_bc_hnd *custom_handle; struct ResourceInfo *res_info_ptr; if (!oh_valid_textbuffer(tag) || !hnd) { err("Invalid parameter"); return(SA_ERR_HPI_INVALID_PARAMS); } handle = (struct oh_handler_state *)hnd; custom_handle = (struct snmp_bc_hnd *)handle->data; snmp_bc_lock_handler(custom_handle); rpt = oh_get_resource_by_id(handle->rptcache, rid); if (!rpt) { snmp_bc_unlock_handler(custom_handle); err("No RID."); return(SA_ERR_HPI_INVALID_RESOURCE); } res_info_ptr = (struct ResourceInfo *)oh_get_resource_data( handle->rptcache, rpt->ResourceId); if (!res_info_ptr) { snmp_bc_unlock_handler(custom_handle); err("No resource information."); return(SA_ERR_HPI_INVALID_RESOURCE); } err = oh_copy_textbuffer(&(rpt->ResourceTag), tag); if (err) { snmp_bc_unlock_handler(custom_handle); err("Cannot copy textbuffer"); return(err); } /* Add changed resource to event queue */ e = snmp_bc_alloc_oh_event(); if (e == NULL) { snmp_bc_unlock_handler(custom_handle); err("Out of memory."); return(SA_ERR_HPI_OUT_OF_MEMORY); } e->resource = *rpt; /* ---------------------------------------- */ /* Construct .event of struct oh_event */ /* ---------------------------------------- */ snmp_bc_set_resource_add_oh_event(e, res_info_ptr); /* ---------------------------------------- */ /* Prime event to evenq */ /* ---------------------------------------- */ e->hid = handle->hid; oh_evt_queue_push(handle->eventq, e); snmp_bc_unlock_handler(custom_handle); return(SA_OK); } /** * snmp_bc_set_resource_severity: * @hnd: Handler data pointer. * @rid: Resource ID. * @tag: Resource's severity. * * Sets severity of events when resource unexpectedly becomes unavailable. * * Return values: * SA_OK - Normal case. * SA_ERR_HPI_INVALID_PARAMS - @sev is invalid. * SA_ERR_HPI_OUT_OF_MEMORY - No memory to allocate event. **/ SaErrorT snmp_bc_set_resource_severity(void *hnd, SaHpiResourceIdT rid, SaHpiSeverityT sev) { SaHpiRptEntryT *rpt; struct oh_handler_state *handle; struct snmp_bc_hnd *custom_handle; struct oh_event *e; struct ResourceInfo *res_info_ptr; if (oh_lookup_severity(sev) == NULL) { err("Invalid parameter"); return(SA_ERR_HPI_INVALID_PARAMS); } handle = (struct oh_handler_state *)hnd; custom_handle = (struct snmp_bc_hnd *)handle->data; snmp_bc_lock_handler(custom_handle); rpt = oh_get_resource_by_id(handle->rptcache, rid); if (!rpt) { snmp_bc_unlock_handler(custom_handle); err("No RID."); return(SA_ERR_HPI_INVALID_RESOURCE); } res_info_ptr = (struct ResourceInfo *)oh_get_resource_data( handle->rptcache, rpt->ResourceId); if (!res_info_ptr) { snmp_bc_unlock_handler(custom_handle); err("No resource information."); return(SA_ERR_HPI_INVALID_RESOURCE); } rpt->ResourceSeverity = sev; /* Add changed resource to event queue */ /* Add changed resource to event queue */ e = snmp_bc_alloc_oh_event(); if (e == NULL) { snmp_bc_unlock_handler(custom_handle); err("Out of memory."); return(SA_ERR_HPI_OUT_OF_MEMORY); } e->resource = *rpt; /* ---------------------------------------- */ /* Construct .event of struct oh_event */ /* ---------------------------------------- */ snmp_bc_set_resource_add_oh_event(e, res_info_ptr); /* ---------------------------------------- */ /* Prime event to evenq */ /* ---------------------------------------- */ e->hid = handle->hid; oh_evt_queue_push(handle->eventq, e); snmp_bc_unlock_handler(custom_handle); return(SA_OK); } /** * snmp_bc_control_parm: * @hnd: Handler data pointer. * @rid: Resource ID. * @act: Configuration action. * * Save and restore saved configuration parameters. * * Return values: * SA_OK - Normal case. * SA_ERR_HPI_INVALID_PARAMS - @act is invalid. **/ SaErrorT snmp_bc_control_parm(void *hnd, SaHpiResourceIdT rid, SaHpiParmActionT act) { SaHpiRptEntryT *rpt; struct oh_handler_state *handle; struct snmp_bc_hnd *custom_handle; if (!hnd) { dbg("Invalid parameter - hnd"); return(SA_ERR_HPI_INVALID_PARAMS); } if (oh_lookup_parmaction(act) == NULL) { dbg("Invalid parameter - act"); return(SA_ERR_HPI_INVALID_PARAMS); } handle = (struct oh_handler_state *)hnd; custom_handle = (struct snmp_bc_hnd *)handle->data; snmp_bc_lock_handler(custom_handle); rpt = oh_get_resource_by_id(handle->rptcache, rid); if (!rpt) { err("No RID."); snmp_bc_unlock_handler(custom_handle); return(SA_ERR_HPI_INVALID_RESOURCE); } if (rpt->ResourceCapabilities & SAHPI_CAPABILITY_CONFIGURATION) { err("Resource configuration saving not supported."); snmp_bc_unlock_handler(custom_handle); return(SA_ERR_HPI_INTERNAL_ERROR); } else { snmp_bc_unlock_handler(custom_handle); return(SA_ERR_HPI_CAPABILITY); } } #define snmp_bc_internal_retry() \ if (l_retry >= 2) { \ custom_handle->handler_retries = SNMP_BC_MAX_SNMP_RETRY_ATTEMPTED; \ err = SA_ERR_HPI_BUSY; \ break; \ } else { \ l_retry++; \ continue; \ } /** * snmp_bc_snmp_get: * @custom_handle: Plugin's data pointer. * @objid: SNMP OID. * loc_offset: Offset to add to location in entity path * @value: Location to store returned SNMP value. * @retry: retry is requested on snmp timeout * * Plugin wrapper for SNMP get call. If SNMP command times out, * this function returns an SA_ERR_HPI_BUSY until a max number * of retries occurs - then it returns SA_ERR_HPI_NO_RESPONSE. * BladeCenter hardware often takes several SNMP attempts before * it responses. User applications should continue to retry on * BUSY and only fail on NO_RESPONSE. * * Return values: * SA_OK - Normal case. **/ SaErrorT snmp_bc_snmp_get(struct snmp_bc_hnd *custom_handle, const char *objid, struct snmp_value *value, SaHpiBoolT retry) { SaErrorT err; /* struct snmp_session *ss = custom_handle->ss; */ int l_retry; if (retry) l_retry = 0; else l_retry = 2; do { err = snmp_get(custom_handle->sessp, objid, value); if ((err == SA_ERR_HPI_TIMEOUT) || (err == SA_ERR_HPI_ERROR)) { if ( (err == SA_ERR_HPI_ERROR) || (custom_handle->handler_retries == SNMP_BC_MAX_SNMP_RETRY_ATTEMPTED)) { err = snmp_bc_recover_snmp_session(custom_handle); if (err) { custom_handle->handler_retries = 0; err = SA_ERR_HPI_NO_RESPONSE; break; } else { if (retry) l_retry = 0; else l_retry = 2; custom_handle->handler_retries = 0; } } else { dbg("HPI_TIMEOUT %s", objid); snmp_bc_internal_retry(); /* l_retry got incremented here */ } } else { custom_handle->handler_retries = 0; if ((err == SA_OK) && (value->type == ASN_OCTET_STR)) { if ((g_ascii_strncasecmp(value->string,"Not Readable!", sizeof("Not Readable!")) == 0) || (g_ascii_strncasecmp(value->string,"Not Readable", sizeof("Not Readable")) == 0) || (g_ascii_strncasecmp(value->string,"(No temperature)", sizeof("(No temperature)")) == 0) || (g_ascii_strncasecmp(value->string,"NO_TEMPERATURE", sizeof("NO_TEMPERATURE")) == 0) || (!value->string) ) /*|| (value->string[0] == '\0'))*/ { custom_handle->handler_retries = 0; dbg("Not readable reading from OID=%s.", objid); err = SA_ERR_HPI_NO_RESPONSE; break; } else { break; } } else break; } } while(l_retry < 3); return(err); } /** * snmp_bc_oid_snmp_get: * @custom_handle: Plugin's data pointer. * @ep: Entity path of the resource * @oidstr: raw SNMP OID. * loc_offset: Offset to add to location in entity path * @value: Location to store returned SNMP value. * @retry: Retry requested on snmp timeout * * Plugin wrapper for SNMP get call. If SNMP command times out, * this function returns an SA_ERR_HPI_BUSY until a max number * of retries occurs - then it returns SA_ERR_HPI_NO_RESPONSE. * BladeCenter hardware often takes several SNMP attempts before * it responses. User applications should continue to retry on * BUSY and only fail on NO_RESPONSE. * * Return values: * SA_OK - Normal case. **/ SaErrorT snmp_bc_oid_snmp_get(struct snmp_bc_hnd *custom_handle, SaHpiEntityPathT *ep, SaHpiEntityLocationT loc_offset, const gchar *oidstr, struct snmp_value *value, SaHpiBoolT retry) { SaErrorT rv; gchar *oid; rv = SA_OK; oid = oh_derive_string(ep, loc_offset, 10, oidstr); if (oid == NULL) { err("Cannot derive %s.", oidstr); return(SA_ERR_HPI_INTERNAL_ERROR); } rv = snmp_bc_snmp_get(custom_handle, oid, value, retry); g_free(oid); return(rv); } /** * snmp_bc_snmp_set: * @custom_handle: Plugin's data pointer. * @objid: SNMP OID. * @value: SNMP value to set. * * Plugin wrapper for SNMP set call. If SNMP command times out, * this function returns an SA_ERR_HPI_BUSY until a max number * of retries occurs - then it returns SA_ERR_HPI_NO_RESPONSE. * BladeCenter hardware often takes several SNMP attempts before * it responses. User applications should continue to retry on * BUSY and only fail on NO_RESPONSE. * * Return values: * SA_OK - Normal case. **/ SaErrorT snmp_bc_snmp_set(struct snmp_bc_hnd *custom_handle, char *objid, struct snmp_value value) { SaErrorT err; /* struct snmp_session *ss = custom_handle->ss; */ err = snmp_set(custom_handle->sessp, objid, value); if (err == SA_ERR_HPI_TIMEOUT) { if (custom_handle->handler_retries == SNMP_BC_MAX_SNMP_RETRY_ATTEMPTED) { custom_handle->handler_retries = 0; err = SA_ERR_HPI_NO_RESPONSE; } else { custom_handle->handler_retries++; err = SA_ERR_HPI_BUSY; } } else { custom_handle->handler_retries = 0; } return(err); } /** * snmp_bc_oid_snmp_set: * @custom_handle: Plugin's data pointer. * @ep: Entity path of the resource * @oidstr: raw SNMP OID. * loc_offset: Offset to add to location in entity path * @value: SNMP value to set. * * Plugin wrapper for SNMP set call. If SNMP command times out, * this function returns an SA_ERR_HPI_BUSY until a max number * of retries occurs - then it returns SA_ERR_HPI_NO_RESPONSE. * BladeCenter hardware often takes several SNMP attempts before * it responses. User applications should continue to retry on * BUSY and only fail on NO_RESPONSE. * * Return values: * SA_OK - Normal case. **/ SaErrorT snmp_bc_oid_snmp_set(struct snmp_bc_hnd *custom_handle, SaHpiEntityPathT *ep, SaHpiEntityLocationT loc_offset, const gchar *oidstr, struct snmp_value value) { SaErrorT rv; gchar *oid; rv = SA_OK; oid = oh_derive_string(ep, loc_offset, 10, oidstr); if (oid == NULL) { err("NULL SNMP OID returned for %s.", oidstr); return(SA_ERR_HPI_INTERNAL_ERROR); } rv = snmp_bc_snmp_set(custom_handle, oid, value); g_free(oid); return(rv); } void * oh_get_event (void *) __attribute__ ((weak, alias("snmp_bc_get_event"))); void * oh_set_resource_tag (void *, SaHpiResourceIdT, SaHpiTextBufferT *) __attribute__ ((weak, alias("snmp_bc_set_resource_tag"))); void * oh_set_resource_severity (void *, SaHpiResourceIdT, SaHpiSeverityT) __attribute__ ((weak, alias("snmp_bc_set_resource_severity"))); void * oh_control_parm (void *, SaHpiResourceIdT, SaHpiParmActionT) __attribute__ ((weak, alias("snmp_bc_control_parm"))); openhpi-2.14.1/plugins/snmp_bc/snmp_bc_event.c0000644000076400007640000015601411302566770016277 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004, 2006 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * Steve Sherman */ #include #include #include #include #include #include static SaErrorT snmp_bc_parse_threshold_str(gchar *str, gchar *root_str, SaHpiTextBufferT *read_value_str, SaHpiTextBufferT *trigger_value_str); static SaErrorT snmp_bc_logsrc2rid(struct oh_handler_state *handle, gchar *src, LogSource2ResourceT *logsrc2res, unsigned long long ovr_flags); static SaErrorT snmp_bc_set_cur_prev_event_states(struct oh_handler_state *handle, EventMapInfoT *eventmap_info, SaHpiEventT *event, int recovery_event); static SaErrorT snmp_bc_set_event_severity(struct oh_handler_state *handle, EventMapInfoT *eventmap_info, SaHpiEventT *event, SaHpiSeverityT *event_severity); static SaErrorT snmp_bc_map2oem(SaHpiEventT *event, sel_entry *sel_entry, OEMReasonCodeT reason); static ErrLog2EventInfoT *snmp_bc_findevent4dupstr(gchar *search_str, ErrLog2EventInfoT *dupstrhash_data, LogSource2ResourceT *logsrc2res); /** * event2hpi_hash_init: * @handle: Pointer to handler's data. * * Return values: * SA_OK - Normal case. * SA_ERR_HPI_INVALID_PARAMS - Pointer parameter(s) or event2hpi_hash_ptr are NULL. * SA_ERR_HPI_OUT_OF_MEMORY - Can not malloc space **/ SaErrorT event2hpi_hash_init(struct oh_handler_state *handle) { struct snmp_bc_hnd *custom_handle; if (!handle) { err("Invalid parameter."); return(SA_ERR_HPI_INVALID_PARAMS); } custom_handle = (struct snmp_bc_hnd *)handle->data; if (!custom_handle) { err("Invalid parameter."); return(SA_ERR_HPI_INVALID_PARAMS); } custom_handle->event2hpi_hash_ptr = g_hash_table_new(g_str_hash, g_str_equal); if (custom_handle->event2hpi_hash_ptr == NULL) { err("Out of memory."); return(SA_ERR_HPI_OUT_OF_MEMORY); } return(SA_OK); } /** * free_hash_data: * @key * @value * @user_data * * Return values: none **/ static void free_hash_data(gpointer key, gpointer value, gpointer user_data) { g_free(key); /* Memory was created for these during normalization process */ g_free(value); } /** * event2hpi_hash_free: * @handle: Pointer to handler's data. * * Return values: * SA_OK - Normal case. * SA_ERR_HPI_INVALID_PARAMS - Pointer parameter(s) or event2hpi_hash_ptr are NULL. **/ SaErrorT event2hpi_hash_free(struct oh_handler_state *handle) { struct snmp_bc_hnd *custom_handle; if (!handle) { err("Invalid parameter."); return(SA_ERR_HPI_INVALID_PARAMS); } custom_handle = (struct snmp_bc_hnd *)handle->data; if (!custom_handle) { err("Invalid parameter."); return(SA_ERR_HPI_INVALID_PARAMS); } if (custom_handle->event2hpi_hash_ptr != NULL) { g_hash_table_foreach(custom_handle->event2hpi_hash_ptr, free_hash_data, NULL); g_hash_table_destroy(custom_handle->event2hpi_hash_ptr); } return(SA_OK); } /** * snmp_bc_discover_res_events: * @handle: Pointer to handler's data. * @ep: Pointer to resource's entity path. * @resinfo: Pointer to a resource's event mapping information. * * Discovers a resource's events and records the static mapping * information needed to translate BladeCenter event log messages * into HPI event types. It is assumed that all resource events are * hot swap events. * * Mapping information is stored in the hash table - event2hpi_hash. * * Return values: * SA_OK - Normal case. * SA_ERR_HPI_INVALID_PARAMS - Pointer parameter(s) or event2hpi_hash_ptr are NULL. **/ SaErrorT snmp_bc_discover_res_events(struct oh_handler_state *handle, SaHpiEntityPathT *ep, const struct ResourceInfo *resinfo) { int i; int max; char *normalized_str; char *hash_existing_key, *hash_value; EventMapInfoT *eventmap_info; SaHpiResourceIdT rid; struct snmp_bc_hnd *custom_handle; if (!handle || !ep || !resinfo) { err("Invalid parameter."); return(SA_ERR_HPI_INVALID_PARAMS); } custom_handle = (struct snmp_bc_hnd *)handle->data; if (!custom_handle || !custom_handle->event2hpi_hash_ptr) { err("Invalid parameter."); return(SA_ERR_HPI_INVALID_PARAMS); } rid = oh_uid_lookup(ep); if (rid == 0) { err("No RID."); return(SA_ERR_HPI_INTERNAL_ERROR); } max = SNMP_BC_MAX_RESOURCE_EVENT_ARRAY_SIZE; for (i=0; resinfo->event_array[i].event != NULL && i < max; i++) { /* Normalized and convert event string */ normalized_str = oh_derive_string(ep, 0, 16, resinfo->event_array[i].event); if (normalized_str == NULL) { err("Cannot derive %s.", resinfo->event_array[i].event); return(SA_ERR_HPI_INTERNAL_ERROR); } /* Add to hash; Set HPI values */ if (!g_hash_table_lookup_extended(custom_handle->event2hpi_hash_ptr, normalized_str, (gpointer)&hash_existing_key, (gpointer)&hash_value)) { eventmap_info = g_malloc0(sizeof(EventMapInfoT)); if (!eventmap_info) { err("Out of memory."); g_free(normalized_str); return(SA_ERR_HPI_OUT_OF_MEMORY); } eventmap_info->hpievent.Source = rid; eventmap_info->ep = *ep; eventmap_info->hpievent.EventType = SAHPI_ET_HOTSWAP; eventmap_info->hpievent.EventDataUnion.HotSwapEvent.HotSwapState = resinfo->event_array[i].event_state; eventmap_info->hs_event_auto_state = resinfo->event_array[i].event_auto_state; eventmap_info->hs_recovery_state = resinfo->event_array[i].recovery_state; eventmap_info->hs_recovery_auto_state = resinfo->event_array[i].recovery_auto_state; eventmap_info->event_res_failure = resinfo->event_array[i].event_res_failure; eventmap_info->event_res_failure_unexpected = resinfo->event_array[i].event_res_failure_unexpected; dbg("Discovered resource event=%s.", normalized_str); g_hash_table_insert(custom_handle->event2hpi_hash_ptr, normalized_str, eventmap_info); /* normalized_str space is recovered when hash is freed */ } else { /* Event already exists (e.g. same event for multiple blades) */ dbg("Event already exists=%s.", normalized_str); g_free(normalized_str); } } return(SA_OK); } /** * snmp_bc_discover_sensor_events: * @handle: Pointer to handler's data. * @ep: Pointer to parent resource's entity path. * @sid: Sensor ID. * @sinfo: Pointer to a sensor's event mapping information. * * Discovers a sensor's events and records the static mapping * information needed to translate BladeCenter event log messages * into HPI event types. * * Mapping information is stored in the hash table - event2hpi_hash. * * Return values: * SA_OK - Normal case. * SA_ERR_HPI_INVALID_PARAMS - Pointer parameter(s) are NULL; sid <= 0. **/ SaErrorT snmp_bc_discover_sensor_events(struct oh_handler_state *handle, SaHpiEntityPathT *ep, SaHpiSensorNumT sid, const struct snmp_bc_sensor *sinfo) { int i; int max = SNMP_BC_MAX_SENSOR_EVENT_ARRAY_SIZE; char *normalized_str; char *hash_existing_key, *hash_value; EventMapInfoT *eventmap_info; SaHpiResourceIdT rid; struct snmp_bc_hnd *custom_handle; if (!handle || !ep || !sinfo || sid <= 0) { err("Invalid parameter."); return(SA_ERR_HPI_INVALID_PARAMS); } max = SNMP_BC_MAX_SENSOR_EVENT_ARRAY_SIZE; custom_handle = (struct snmp_bc_hnd *)handle->data; if (!custom_handle || !custom_handle->event2hpi_hash_ptr) { err("Invalid parameter."); return(SA_ERR_HPI_INVALID_PARAMS); } rid = oh_uid_lookup(ep); if (rid == 0) { err("No RID."); return(SA_ERR_HPI_INTERNAL_ERROR); } for (i=0; sinfo->sensor_info.event_array[i].event != NULL && i < max; i++) { /* Normalized and convert event string */ normalized_str = oh_derive_string(ep, 0, 16, sinfo->sensor_info.event_array[i].event); if (normalized_str == NULL) { err("Cannot derive %s.", sinfo->sensor_info.event_array[i].event); return(SA_ERR_HPI_INTERNAL_ERROR); } /* Add to hash; Set HPI values */ if (!g_hash_table_lookup_extended(custom_handle->event2hpi_hash_ptr, normalized_str, (gpointer)&hash_existing_key, (gpointer)&hash_value)) { eventmap_info = g_malloc0(sizeof(EventMapInfoT)); if (!eventmap_info) { err("Out of memory."); g_free(normalized_str); return(SA_ERR_HPI_OUT_OF_MEMORY); } /* Set default values */ eventmap_info->hpievent.Source = rid; eventmap_info->hpievent.EventType = SAHPI_ET_SENSOR; eventmap_info->hpievent.EventDataUnion.SensorEvent.SensorNum = sid; eventmap_info->hpievent.EventDataUnion.SensorEvent.SensorType = sinfo->sensor.Type; eventmap_info->hpievent.EventDataUnion.SensorEvent.EventCategory = sinfo->sensor.Category; eventmap_info->hpievent.EventDataUnion.SensorEvent.Assertion = sinfo->sensor_info.event_array[i].event_assertion; eventmap_info->hpievent.EventDataUnion.SensorEvent.EventState = eventmap_info->hpievent.EventDataUnion.SensorEvent.CurrentState = sinfo->sensor_info.event_array[i].event_state; eventmap_info->sensor_recovery_state = sinfo->sensor_info.event_array[i].recovery_state; eventmap_info->event_res_failure = sinfo->sensor_info.event_array[i].event_res_failure; eventmap_info->event_res_failure_unexpected = sinfo->sensor_info.event_array[i].event_res_failure_unexpected; /* Setup static trigger info for threshold sensors - some may be event-only */ if (sinfo->sensor.Category == SAHPI_EC_THRESHOLD) { eventmap_info->hpievent.EventDataUnion.SensorEvent.TriggerReading.IsSupported = eventmap_info->hpievent.EventDataUnion.SensorEvent.TriggerThreshold.IsSupported = SAHPI_TRUE; eventmap_info->hpievent.EventDataUnion.SensorEvent.TriggerReading.Type = eventmap_info->hpievent.EventDataUnion.SensorEvent.TriggerThreshold.Type = sinfo->sensor.DataFormat.ReadingType; } dbg("Discovered sensor event=%s.", normalized_str); g_hash_table_insert(custom_handle->event2hpi_hash_ptr, normalized_str, eventmap_info); /* normalized_str space is recovered when hash is freed */ } else { /* Event already exists (e.g. same event for multiple blades) */ dbg("Event already exists=%s.", normalized_str); g_free(normalized_str); } } return(SA_OK); } /** * snmp_bc_log2event: * @handle: Pointer to handler's data. * @logstr: BladeCenter event log string to be mapped to an HPI event. * @event: Location to store mapped HPI event. * @isdst: Is Daylight Savings Time on or off. * * Maps BladeCenter event log messages to HPI events. * * @isdst ("is DayLight Savings Time") parameter is a performance hack. * Design assumes the event's timestamp is the time local to the platform itself. * So instead of forcing platform accesses for each log entry to determine if * DST is in effect, the isdst parameter allows the caller to query the * hardware DST info once then make multiple translation calls. * * Return values: * SA_OK - Normal case. * SA_ERR_HPI_INVALID_PARAMS - Pointer parameter(s) are NULL. **/ SaErrorT snmp_bc_log2event(struct oh_handler_state *handle, gchar *logstr, SaHpiEventT *event, int isdst, LogSource2ResourceT *ret_logsrc2res) { sel_entry log_entry; gchar *recovery_str, *login_str, *post_str; gchar root_str[SNMP_BC_MAX_SEL_ENTRY_LENGTH]; gchar search_str[SNMP_BC_MAX_SEL_ENTRY_LENGTH]; EventMapInfoT *eventmap_info; LogSource2ResourceT logsrc2res; SaErrorT err; SaHpiBoolT is_recovery_event, is_threshold_event; SaHpiEventT working; SaHpiResourceIdT event_rid; SaHpiSeverityT event_severity; SaHpiTextBufferT thresh_read_value, thresh_trigger_value; SaHpiTimeT event_time; ErrLog2EventInfoT *strhash_data; struct snmp_bc_hnd *custom_handle; int dupovrovr; struct oh_event *e; SaHpiHsStateT sav_cur_state; if (!handle || !logstr || !event || !ret_logsrc2res) { err("Invalid parameter."); return(SA_ERR_HPI_INVALID_PARAMS); } custom_handle = (struct snmp_bc_hnd *)handle->data; if (!custom_handle) { err("Invalid parameter."); return(SA_ERR_HPI_INVALID_PARAMS); } memset(&working, 0, sizeof(SaHpiEventT)); is_recovery_event = is_threshold_event = SAHPI_FALSE; dbg("Original event string = %s", logstr); /* Parse hardware log entry into its various components */ err = snmp_bc_parse_sel_entry(handle, logstr, &log_entry); if (err) { err("Cannot parse log entry=%s. Error=%s.", logstr, oh_lookup_error(err)); return(err); } /********************************************************************** * For some types of BladeCenter events (e.g. thresholds), dynamic * data is appended to a root event log string. Need to find this root * string, since its what mapped in the event hash table. **********************************************************************/ /* Set default search string */ strncpy(search_str, log_entry.text, SNMP_BC_MAX_SEL_ENTRY_LENGTH); /* Discover "recovery" event strings */ recovery_str = strstr(search_str, EVT_RECOVERY); if (recovery_str && (recovery_str == search_str)) { is_recovery_event = SAHPI_TRUE; memset(search_str, 0, SNMP_BC_MAX_SEL_ENTRY_LENGTH); strncpy(search_str, (log_entry.text + strlen(EVT_RECOVERY)), SNMP_BC_MAX_SEL_ENTRY_LENGTH - strlen(EVT_RECOVERY)); } /* Adjust "login" event strings - strip username */ login_str = strstr(log_entry.text, LOG_LOGIN_STRING); if (login_str) { gchar *id_str = strstr(log_entry.text, LOG_LOGIN_CHAR); if (id_str != NULL) { memset(search_str, 0, SNMP_BC_MAX_SEL_ENTRY_LENGTH); strncpy(search_str, log_entry.text, (id_str - log_entry.text)); search_str[(id_str - log_entry.text)] = '\0'; } } /* Adjust "POST" event strings - strip post results */ post_str = strstr(log_entry.text, LOG_POST_STRING); if (post_str) { memset(search_str, 0, SNMP_BC_MAX_SEL_ENTRY_LENGTH); strncpy(search_str, log_entry.text, (post_str - log_entry.text)); search_str[(post_str - log_entry.text - 1)] = '\0'; } /* Replace internal double blanks with a single blank */ { gchar *double_blanks; double_blanks = strstr(log_entry.text, " "); if (double_blanks) { gchar *tmp_str; int len; tmp_str = log_entry.text; memset(search_str, 0, SNMP_BC_MAX_SEL_ENTRY_LENGTH); do { strncat(search_str, tmp_str, (double_blanks - tmp_str)); tmp_str = double_blanks + 1; len = strlen(tmp_str); double_blanks = strstr(tmp_str, " "); } while (double_blanks); strncat(search_str, tmp_str, len); } } /* Adjust "threshold" event strings */ if (strstr(log_entry.text, LOG_THRESHOLD_VALUE_STRING) || strstr(log_entry.text, LOG_THRESHOLD_STRING)) { is_threshold_event = SAHPI_TRUE; oh_init_textbuffer(&thresh_read_value); oh_init_textbuffer(&thresh_trigger_value); err = snmp_bc_parse_threshold_str(search_str, root_str, &thresh_read_value, &thresh_trigger_value); if (err) { err("Cannot parse threshold string=%s.", search_str); } else { memset(search_str, 0, SNMP_BC_MAX_SEL_ENTRY_LENGTH); strncpy(search_str, root_str, SNMP_BC_MAX_SEL_ENTRY_LENGTH); } } /* Strip any leading/trailing blanks */ { gchar *tmp_str; tmp_str = g_strstrip(g_strdup(search_str)); strncpy(search_str, tmp_str, SNMP_BC_MAX_SEL_ENTRY_LENGTH); g_free(tmp_str); if ((search_str == NULL || search_str[0] == '\0')) { err("Search string is NULL for log string=%s", log_entry.text); return(SA_ERR_HPI_INTERNAL_ERROR); } } /* Strip any trailing period */ if (search_str[strlen(search_str) - 1] == '.') search_str[strlen(search_str) - 1] = '\0'; dbg("Event search string=%s", search_str); /* Set dynamic event fields with default values from the log string. These may be overwritten in the code below */ event_severity = log_entry.sev; event_time = (SaHpiTimeT)mktime(&log_entry.time) * 1000000000; /* Find default RID from Error Log's "Source" field - need if NOT_ALERTABLE OEM event */ err = snmp_bc_logsrc2rid(handle, log_entry.source, &logsrc2res, 0); if (err) { err("Cannot translate %s to RID. Error=%s", log_entry.source, oh_lookup_error(err)); return(err); } event_rid = logsrc2res.rid; /*********************************************************** * See if adjusted root string is in errlog2event_hash table ***********************************************************/ strhash_data = (ErrLog2EventInfoT *)g_hash_table_lookup(errlog2event_hash, search_str); if (!strhash_data) { if (snmp_bc_map2oem(&working, &log_entry, EVENT_NOT_ALERTABLE)) { err("Cannot map to OEM Event %s.", log_entry.text); return(SA_ERR_HPI_INTERNAL_ERROR); } goto DONE; } /* See if need to override default RID; These are hardcoded exceptions caused by the fact that we have to handle duplicates event strings for resources that the BladeCenter's event log Source field doesn't define. These options must not be used with the OVR_RID option. Note: OVR_EXP messages always assumed to have a SOURCE field = BLADE_0x */ if (strhash_data->event_ovr & OVR_EXP || strhash_data->event_ovr & OVR_VMM || strhash_data->event_ovr & OVR_MM1 || strhash_data->event_ovr & OVR_MM2 || strhash_data->event_ovr & OVR_MM_PRIME || strhash_data->event_ovr & OVR_MM_STBY) { err = snmp_bc_logsrc2rid(handle, log_entry.source, &logsrc2res, strhash_data->event_ovr); if (err) { err("Cannot translate %s to RID. Error=%s.", log_entry.source, oh_lookup_error(err)); return(err); } event_rid = logsrc2res.rid; } /* Handle duplicate strings that have different event numbers */ dupovrovr = 0; if (strhash_data->event_dup) { strhash_data = snmp_bc_findevent4dupstr(search_str, strhash_data, &logsrc2res); if (strhash_data == NULL) { err("Cannot find valid event for duplicate string=%s and RID=%d.", search_str, logsrc2res.rid); if (snmp_bc_map2oem(&working, &log_entry, EVENT_NOT_ALERTABLE)) { err("Cannot map to OEM Event %s.", log_entry.text); return(SA_ERR_HPI_INTERNAL_ERROR); } goto DONE; } if (strhash_data->event_ovr & OVR_RID) { err("Cannot have RID override on duplicate strin;g=%s.", search_str); dupovrovr = 1; } } /* If OVR_SEV, use BCT-level severity calculated in off-line scripts */ if (strhash_data->event_ovr & OVR_SEV) { event_severity = strhash_data->event_sev; } /************************************************** * Find event string's mapped HPI event information **************************************************/ eventmap_info = (EventMapInfoT *)g_hash_table_lookup(custom_handle->event2hpi_hash_ptr, strhash_data->event); if (!eventmap_info) { if (snmp_bc_map2oem(&working, &log_entry, EVENT_NOT_MAPPED)) { err("Cannot map to OEM Event %s.", log_entry.text); return(SA_ERR_HPI_INTERNAL_ERROR); } goto DONE; } /* Set static event data defined during resource discovery */ working = eventmap_info->hpievent; logsrc2res.ep = eventmap_info->ep; logsrc2res.rid = eventmap_info->hpievent.Source; /* Handle OVR_RID - only for non-duplicate event strings */ if ((strhash_data->event_ovr & OVR_RID) && !dupovrovr) { event_rid = eventmap_info->hpievent.Source; } /* Set RID in structure - used in later calls */ working.Source = event_rid; /* Handle sensor events */ if (working.EventType == SAHPI_ET_SENSOR) { if (is_recovery_event == SAHPI_TRUE) { working.EventDataUnion.SensorEvent.Assertion = SAHPI_FALSE; } /* Determine severity of event */ err = snmp_bc_set_event_severity(handle, eventmap_info, &working, &event_severity); /* Set optional event current and previous states, if possible */ err = snmp_bc_set_cur_prev_event_states(handle, eventmap_info, &working, is_recovery_event); /* Set optional event threshold values */ if (is_threshold_event == SAHPI_TRUE) { if (oh_encode_sensorreading(&thresh_read_value, working.EventDataUnion.SensorEvent.TriggerReading.Type, &working.EventDataUnion.SensorEvent.TriggerReading)) { err("Cannot convert trigger reading=%s; text=%s.", thresh_read_value.Data, log_entry.text); return(SA_ERR_HPI_INTERNAL_ERROR); } working.EventDataUnion.SensorEvent.OptionalDataPresent = working.EventDataUnion.SensorEvent.OptionalDataPresent | SAHPI_SOD_TRIGGER_READING; if (oh_encode_sensorreading(&thresh_trigger_value, working.EventDataUnion.SensorEvent.TriggerThreshold.Type, &working.EventDataUnion.SensorEvent.TriggerThreshold)) { err("Cannot convert trigger threshold=%s; text=%s.", thresh_trigger_value.Data, log_entry.text); return(SA_ERR_HPI_INTERNAL_ERROR); } working.EventDataUnion.SensorEvent.OptionalDataPresent = working.EventDataUnion.SensorEvent.OptionalDataPresent | SAHPI_SOD_TRIGGER_THRESHOLD; } } /* Handle hot swap events */ else if (working.EventType == SAHPI_ET_HOTSWAP) { SaHpiHsStateT hs_event_state, hs_event_auto_state; SaHpiRptEntryT *rpt; struct ResourceInfo *resinfo2; rpt = oh_get_resource_by_id(handle->rptcache, event_rid); resinfo2 = (struct ResourceInfo *)oh_get_resource_data(handle->rptcache, event_rid); if ( (custom_handle->isFirstDiscovery == SAHPI_TRUE)||!rpt || !resinfo2) { if (is_recovery_event != SAHPI_TRUE) { snmp_bc_set_event_severity(handle, eventmap_info, &working, &event_severity); } snmp_bc_set_cur_prev_event_states(handle, eventmap_info, &working, is_recovery_event); if (custom_handle->isFirstDiscovery == SAHPI_FALSE) { /* Call rediscover() here to discover newly installed resource */ err = snmp_bc_rediscover(handle, &working, &logsrc2res); } goto RESUME_TO_EXIT; } /* Find hot swap state and any defined hot swap events to generate */ if (is_recovery_event) { hs_event_state = eventmap_info->hs_recovery_state; hs_event_auto_state = eventmap_info->hs_recovery_auto_state; } else { hs_event_state = eventmap_info->hpievent.EventDataUnion.HotSwapEvent.HotSwapState; hs_event_auto_state = eventmap_info->hs_event_auto_state; } /******************************************************************** * Check for reannouncement of current state * - don't auto-generate any events * - reannoucement has same current/previous state as original event ********************************************************************/ if (hs_event_state == resinfo2->cur_state) { working.EventDataUnion.HotSwapEvent.HotSwapState = resinfo2->cur_state; working.EventDataUnion.HotSwapEvent.PreviousHotSwapState = resinfo2->cur_state; event_severity = SAHPI_INFORMATIONAL; } else { /* Generate any automatic hot swap state event */ if (hs_event_auto_state) { if (rpt->ResourceCapabilities & SAHPI_CAPABILITY_MANAGED_HOTSWAP) { SaErrorT err; SaHpiEventT autoevent; /* Build event */ memcpy((void *)&autoevent, (void *)&working, sizeof(SaHpiEventT)); autoevent.Timestamp = event_time; autoevent.Severity = SAHPI_INFORMATIONAL; autoevent.EventDataUnion.HotSwapEvent.PreviousHotSwapState = resinfo2->prev_state = resinfo2->cur_state; autoevent.EventDataUnion.HotSwapEvent.HotSwapState = resinfo2->cur_state = hs_event_auto_state; if (custom_handle->isFirstDiscovery == SAHPI_FALSE) { err = snmp_bc_add_to_eventq(handle, &autoevent, SAHPI_TRUE); if (err) { err("Cannot add entry to eventq. Error=%s.", oh_lookup_error(err)); return(err); } } } else { err("Invalid Hot Swap State for %s", rpt->ResourceTag.Data); return(SA_ERR_HPI_INTERNAL_ERROR); } } /* Normal hot swap event transitions */ sav_cur_state = resinfo2->cur_state; if (is_recovery_event) working.EventDataUnion.HotSwapEvent.HotSwapState = resinfo2->cur_state = eventmap_info->hs_recovery_state; else working.EventDataUnion.HotSwapEvent.HotSwapState = resinfo2->cur_state = eventmap_info->hpievent.EventDataUnion.HotSwapEvent.HotSwapState; if ( (rpt->ResourceCapabilities & SAHPI_CAPABILITY_MANAGED_HOTSWAP) && (resinfo2->cur_state == SAHPI_HS_STATE_NOT_PRESENT)){ working.EventDataUnion.HotSwapEvent.PreviousHotSwapState = sav_cur_state; resinfo2->prev_state = SAHPI_HS_STATE_EXTRACTION_PENDING; } else { working.EventDataUnion.HotSwapEvent.PreviousHotSwapState = resinfo2->prev_state = sav_cur_state; } /* Determine severity */ if (resinfo2->cur_state == SAHPI_HS_STATE_NOT_PRESENT && resinfo2->prev_state != SAHPI_HS_STATE_INACTIVE) { event_severity = rpt->ResourceSeverity; } else { event_severity = SAHPI_INFORMATIONAL; } /* Call rediscover() here to do cleanup for hotswap-remove event */ /* cleanup = removing rpt and rdrs from plugin handle->rptcache */ /* rpt and rdrs will be remove in snmp_bc_add_to_eventq() becasue*/ /* the new oh_event requires rpt present, else infrastructure */ /* drops the event. We have to wait to the very last min to */ /* remove rpt from rptcache. */ /* err = snmp_bc_rediscover(handle, &working, &logsrc2res); */ } } else { err("Platform doesn't support events of type=%s.", oh_lookup_eventtype(working.EventType)); return(SA_ERR_HPI_INTERNAL_ERROR); } /************************************************** * Check to see if need to mark resource as failed. **************************************************/ RESUME_TO_EXIT: if (eventmap_info->event_res_failure) { SaHpiRptEntryT *rpt = oh_get_resource_by_id(handle->rptcache, event->Source); if (rpt) { /* Only notify if change in status */ if (rpt->ResourceFailed == SAHPI_FALSE) { rpt->ResourceFailed = SAHPI_TRUE; /* Add changed resource to event queue */ e = snmp_bc_alloc_oh_event(); if (e == NULL) { err("Out of memory."); return(SA_ERR_HPI_OUT_OF_MEMORY); } e->resource = *rpt; e->event.Severity = e->resource.ResourceSeverity; e->event.Source = e->resource.ResourceId; e->event.EventType = SAHPI_ET_RESOURCE; e->event.EventDataUnion.ResourceEvent.ResourceEventType = SAHPI_RESE_RESOURCE_FAILURE; if (oh_gettimeofday(&e->event.Timestamp) != SA_OK) e->event.Timestamp = SAHPI_TIME_UNSPECIFIED; custom_handle->eventq = g_slist_append(custom_handle->eventq, e); } } } DONE: working.Source = event_rid; working.Timestamp = event_time; working.Severity = event_severity; memcpy((void *)event, (void *)&working, sizeof(SaHpiEventT)); memcpy(ret_logsrc2res, &logsrc2res, sizeof(LogSource2ResourceT)); return(SA_OK); } /** * snmp_bc_findevent4dupstr: * @search_str: Error Log string. * @strhash_data: Pointer to string to event ID mapping information. * @resinfo: Pointer to resource mapping information * * Returns a pointer to the error log event number to HPI event mapping * information. A NULL is returned if the information cannot be found. * * There are several identical Error Log messages strings that are shared by * multiple resources. The scripts that populate errlog2event_hash * create unique entries for these duplicate strings by tacking on * an unique string (HPIDUP_duplicate_number) to the error log message. * This is then stored in errlog2event_hash. So there is a unique mapping * for each resource with a duplicate string. * * This routine goes finds the unique mapping for all the duplicate strings. * Then searches through all the resource's events and all the resource's * sensor events to find a match. It does this for each duplicate string * mapping until it finds a match or runs out of strings to test (in which * case, it returns NULL). * * Return values: * SA_OK - Normal case. * SA_ERR_HPI_INVALID_PARAMS - Parameter pointer(s) are NULL. **/ static ErrLog2EventInfoT *snmp_bc_findevent4dupstr(gchar *search_str, ErrLog2EventInfoT *strhash_data, LogSource2ResourceT *logsrc2res) { gchar dupstr[SNMP_BC_MAX_SEL_ENTRY_LENGTH]; ErrLog2EventInfoT *dupstr_hash_data; short strnum; if (!search_str || !strhash_data || !logsrc2res) { err("Invalid parameter."); return(NULL); } strncpy(dupstr, search_str, SNMP_BC_MAX_SEL_ENTRY_LENGTH); dupstr_hash_data = strhash_data; strnum = strhash_data->event_dup + 1; /* Original string plus dups */ while (strnum && (dupstr_hash_data != NULL)) { int i,j; gchar *normalized_event; /* Search entire sensor array for the duplicate string's event */ for (i=0; (logsrc2res->sensor_array_ptr + i)->sensor.Num != 0; i++) { for (j=0; (logsrc2res->sensor_array_ptr + i)->sensor_info.event_array[j].event != NULL; j++) { normalized_event = oh_derive_string(&(logsrc2res->ep), 0, 16, (logsrc2res->sensor_array_ptr + i)->sensor_info.event_array[j].event); if (!g_ascii_strcasecmp(dupstr_hash_data->event, normalized_event)) { g_free(normalized_event); return(dupstr_hash_data); } g_free(normalized_event); } } /* Search resource array for the duplicate string's event */ for (i=0; snmp_bc_rpt_array[logsrc2res->rpt].res_info.event_array[i].event != NULL; i++) { normalized_event = oh_derive_string(&(logsrc2res->ep), 0, 16, snmp_bc_rpt_array[logsrc2res->rpt].res_info.event_array[i].event); if (!g_ascii_strcasecmp(dupstr_hash_data->event, normalized_event)) { g_free(normalized_event); return(dupstr_hash_data); } g_free(normalized_event); } /* Find next duplicate string */ strnum--; if (strnum) { gchar strnum_str[OH_MAX_LOCATION_DIGITS]; gchar *tmpstr; snprintf(strnum_str, OH_MAX_LOCATION_DIGITS, "%d", strnum); tmpstr = g_strconcat(search_str, HPIDUP_STRING, strnum_str, NULL); strncpy(dupstr, tmpstr, SNMP_BC_MAX_SEL_ENTRY_LENGTH); g_free(tmpstr); dupstr_hash_data = (ErrLog2EventInfoT *)g_hash_table_lookup(errlog2event_hash, dupstr); if (dupstr_hash_data == NULL) { err("Cannot find duplicate string=%s.", dupstr); } } } return(NULL); } /** * snmp_bc_parse_threshold_str: * @str: Input Error Log threshold string. * @root_str: Location to store threshold's root string. * @read_value_str: Location to store threshold's read value string. * @trigger_value_str: Location to store threshold's trigger value string. * * Parses a Error Log threshold string into its root string, read, * and trigger value strings. * * Format is a root string (in the errlog2event_hash table) followed by a * read threshold value string, followed by a trigger threshold value string. * Unfortunately cannot convert directly to sensor values yet because * don't yet know if event is in the event2hpi_hash table or if it is, * what the sensor's threshold data type is. * * Return values: * SA_OK - Normal case. * SA_ERR_HPI_INVALID_PARAMS - Parameter pointer(s) are NULL. **/ static SaErrorT snmp_bc_parse_threshold_str(gchar *str, gchar *root_str, SaHpiTextBufferT *read_value_str, SaHpiTextBufferT *trigger_value_str) { gchar **event_substrs; gchar **thresh_substrs; SaErrorT err; if (!str || !root_str || !read_value_str || !trigger_value_str) { err("Invalid parameter."); return(SA_ERR_HPI_INVALID_PARAMS); } event_substrs = NULL; thresh_substrs = NULL; err = SA_OK; /* Handle BladeCenter's two basic threshold event formats */ if (strstr(str, LOG_READ_VALUE_STRING)) { event_substrs = g_strsplit(str, LOG_READ_VALUE_STRING, -1); thresh_substrs = g_strsplit(event_substrs[1], LOG_THRESHOLD_VALUE_STRING, -1); } else { event_substrs = g_strsplit(str, LOG_READ_STRING, -1); thresh_substrs = g_strsplit(event_substrs[1], LOG_THRESHOLD_STRING, -1); } if (thresh_substrs == NULL || (thresh_substrs[0] == NULL || thresh_substrs[0][0] == '\0') || (thresh_substrs[1] == NULL || thresh_substrs[1][0] == '\0') || (thresh_substrs[2] != NULL)) { err("Cannot split threshold string=%s.", str); err = SA_ERR_HPI_INTERNAL_ERROR; goto CLEANUP; } /* Strip any leading/trailing blanks */ event_substrs[0]= g_strstrip(event_substrs[0]); thresh_substrs[0] = g_strstrip(thresh_substrs[0]); thresh_substrs[1] = g_strstrip(thresh_substrs[1]); if ((event_substrs[0] == NULL || event_substrs[0] == '\0') || (thresh_substrs[0] == NULL || thresh_substrs[0][0] == '\0') || (thresh_substrs[1] == NULL || thresh_substrs[1][0] == '\0')) { err("NULL base string or threshold values=%s.", str); err = SA_ERR_HPI_INTERNAL_ERROR; goto CLEANUP; } /* Change any leading period to a blank. This put here because MM code added a period after the Threadhold Value string and before the threshold value (e.g. "Threshold value. 23.0") */ if (thresh_substrs[0][0] == '.') thresh_substrs[0][0] = ' '; if (thresh_substrs[1][0] == '.') thresh_substrs[1][0] = ' '; /* Strip any leading/trailing blanks - in case of leading period */ thresh_substrs[0] = g_strstrip(thresh_substrs[0]); thresh_substrs[1] = g_strstrip(thresh_substrs[1]); if ((event_substrs[0] == NULL || event_substrs[0] == '\0') || (thresh_substrs[0] == NULL || thresh_substrs[0][0] == '\0') || (thresh_substrs[1] == NULL || thresh_substrs[1][0] == '\0')) { err("NULL base string or threshold values=%s.", str); err = SA_ERR_HPI_INTERNAL_ERROR; goto CLEANUP; } /* Strip any ending periods, commas, colons, or semicolons */ if ((thresh_substrs[0][strlen(thresh_substrs[0]) - 1] == '.') || (thresh_substrs[0][strlen(thresh_substrs[0]) - 1] == ',') || (thresh_substrs[0][strlen(thresh_substrs[0]) - 1] == ':') || (thresh_substrs[0][strlen(thresh_substrs[0]) - 1] == ';')) thresh_substrs[0][strlen(thresh_substrs[0]) - 1] = '\0'; if ((thresh_substrs[1][strlen(thresh_substrs[1]) - 1] == '.') || (thresh_substrs[1][strlen(thresh_substrs[1]) - 1] == ',') || (thresh_substrs[1][strlen(thresh_substrs[1]) - 1] == ':') || (thresh_substrs[1][strlen(thresh_substrs[1]) - 1] == ';')) thresh_substrs[1][strlen(thresh_substrs[1]) - 1] = '\0'; /* Check for valid length */ if ((strlen(thresh_substrs[0]) > SAHPI_MAX_TEXT_BUFFER_LENGTH) || (strlen(thresh_substrs[1]) > SAHPI_MAX_TEXT_BUFFER_LENGTH)) { err("Threshold value string(s) exceed max size for %s.", str); err = SA_ERR_HPI_INTERNAL_ERROR; goto CLEANUP; } dbg("Threshold strings: %s and %s", thresh_substrs[0], thresh_substrs[1]); strcpy(root_str, event_substrs[0]); oh_append_textbuffer(read_value_str, thresh_substrs[0]); oh_append_textbuffer(trigger_value_str, thresh_substrs[1]); if (root_str == NULL) { err("Cannot parse threshold string=%s.", str); err = SA_ERR_HPI_INTERNAL_ERROR; } CLEANUP: g_strfreev(event_substrs); g_strfreev(thresh_substrs); return(err); } /** * snmp_bc_set_event_severity: * @handle: Handler data pointer. * @eventmap_info: Event state and recovery information pointer. * @event: Event pointer. * @event_severity: Location to store severity. * * Overwrites normal severity, if sensor is of type SAHPI_EC_THRESHOLD or * SAHPI_EC_SEVERITY. If event is not one of these types, this routine * checks to see if it's an unexpected resource failure event. * If it is, the resource's severity (user writable) is used. * * Return values: * SA_OK - Normal case. * SA_ERR_HPI_INVALID_PARAMS - Parameter pointer(s) are NULL. **/ static SaErrorT snmp_bc_set_event_severity(struct oh_handler_state *handle, EventMapInfoT *eventmap_info, SaHpiEventT *event, SaHpiSeverityT *event_severity) { int sensor_severity_override; sensor_severity_override = 0; if (!handle || !eventmap_info || !event || !event_severity) { err("Invalid parameter."); return(SA_ERR_HPI_INVALID_PARAMS); } if (event->EventType == SAHPI_ET_SENSOR) { /* Force HPI Threshold and Severity category severities */ if (event->EventDataUnion.SensorEvent.EventCategory == SAHPI_EC_THRESHOLD) { sensor_severity_override = 1; if (event->EventDataUnion.SensorEvent.EventState & SAHPI_ES_LOWER_CRIT || event->EventDataUnion.SensorEvent.EventState & SAHPI_ES_UPPER_CRIT) { *event_severity = SAHPI_CRITICAL; } else { if (event->EventDataUnion.SensorEvent.EventState & SAHPI_ES_LOWER_MAJOR || event->EventDataUnion.SensorEvent.EventState & SAHPI_ES_UPPER_MAJOR) { *event_severity = SAHPI_MAJOR; } else { if (event->EventDataUnion.SensorEvent.EventState & SAHPI_ES_LOWER_MINOR || event->EventDataUnion.SensorEvent.EventState & SAHPI_ES_UPPER_MINOR) { *event_severity = SAHPI_MINOR; } } } } else { if (event->EventDataUnion.SensorEvent.EventCategory == SAHPI_EC_SEVERITY) { sensor_severity_override = 1; if (event->EventDataUnion.SensorEvent.EventState & SAHPI_ES_OK) *event_severity = SAHPI_OK; if (event->EventDataUnion.SensorEvent.EventState & SAHPI_ES_MINOR_FROM_OK) *event_severity = SAHPI_MINOR; if (event->EventDataUnion.SensorEvent.EventState & SAHPI_ES_MAJOR_FROM_LESS) *event_severity = SAHPI_MAJOR; if (event->EventDataUnion.SensorEvent.EventState & SAHPI_ES_CRITICAL_FROM_LESS) *event_severity = SAHPI_CRITICAL; if (event->EventDataUnion.SensorEvent.EventState & SAHPI_ES_MINOR_FROM_MORE) *event_severity = SAHPI_MINOR; if (event->EventDataUnion.SensorEvent.EventState & SAHPI_ES_MAJOR_FROM_CRITICAL) *event_severity = SAHPI_MAJOR; if (event->EventDataUnion.SensorEvent.EventState & SAHPI_ES_CRITICAL) *event_severity = SAHPI_CRITICAL; if (event->EventDataUnion.SensorEvent.EventState & SAHPI_ES_INFORMATIONAL) *event_severity = SAHPI_INFORMATIONAL; } } } /* Use resource's severity, if unexpected failure */ if (!sensor_severity_override && eventmap_info->event_res_failure_unexpected) { SaHpiRptEntryT *rpt = oh_get_resource_by_id(handle->rptcache, event->Source); if (!rpt) return(SA_ERR_HPI_INVALID_RESOURCE); *event_severity = rpt->ResourceSeverity; } return(SA_OK); } /** * snmp_bc_set_cur_prev_event_states: * @handle: Handler data pointer. * @eventmap_info: Event state and recovery information pointer. * @event: Location to store current/previous event infomation. * @recovery_event: Is the event a recovery event or not. * * Attempts to set the optional current and previous state information * in an event. * * NOTES: * A sensor's previous state depends on if it is readable or not. If * the sensor is not readable, then the previous state is just the state * of the sensor's last processed event. If the sensor is readable, * the previous state is set to the sensor's current state when the * last event was processed. That is when an event is processed, * the sensor is read and the info stored to be placed in the previous * state field for the next time an event for that sensor is processed. * * For non-readable sensors, current state is simply the processed * event's state. * * This routine is optional for sensors; but NOT hot swap. * * Return values: * SA_OK - Normal case. * SA_ERR_HPI_INVALID_PARAMS - Pointer parameter(s) are NULL. **/ static SaErrorT snmp_bc_set_cur_prev_event_states(struct oh_handler_state *handle, EventMapInfoT *eventmap_info, SaHpiEventT *event, int recovery_event) { SaErrorT err; SaHpiRdrT *rdr; if (!handle || !eventmap_info || !event) { err("Invalid parameters."); return(SA_ERR_HPI_INVALID_PARAMS); } if ( (((struct snmp_bc_hnd *)handle->data)->isFirstDiscovery == SAHPI_TRUE) && (event->EventType == SAHPI_ET_HOTSWAP) ) { /* This is HPI time zero processing */ /* Discovery routines set proper current state for each resource */ /* Do not override state setting with (stale) data from Event Log processing */ return(SA_OK); } switch (event->EventType) { case SAHPI_ET_SENSOR: { SaHpiSensorReadingT cur_reading; SaHpiEventStateT cur_state, prev_state; struct SensorInfo *sinfo; /* Initialize previous and current state event info */ event->EventDataUnion.SensorEvent.PreviousState = SAHPI_ES_UNSPECIFIED; event->EventDataUnion.SensorEvent.CurrentState = SAHPI_ES_UNSPECIFIED; /* Set previous state to sensor's current state */ rdr = oh_get_rdr_by_type(handle->rptcache, event->Source, SAHPI_SENSOR_RDR, event->EventDataUnion.SensorEvent.SensorNum); if (rdr == NULL) { return(SA_ERR_HPI_NOT_PRESENT); } sinfo = (struct SensorInfo *)oh_get_rdr_data(handle->rptcache, event->Source, rdr->RecordId); if (sinfo == NULL) { err("No sensor data. Sensor=%s.", rdr->IdString.Data); return(SA_ERR_HPI_INTERNAL_ERROR); } /* Record previous state info */ prev_state = sinfo->cur_state; /* Try to read sensor to get and record the current state */ err = snmp_bc_get_sensor_reading((void *)handle, event->Source, event->EventDataUnion.SensorEvent.SensorNum, &cur_reading, &cur_state); /* If can't read sensor (error, sensor disabled, or event-only), use static event state definitions */ if (err || cur_reading.IsSupported == SAHPI_FALSE) { if (recovery_event) { cur_state = sinfo->cur_state = eventmap_info->sensor_recovery_state; } else { cur_state = sinfo->cur_state = event->EventDataUnion.SensorEvent.EventState; } } else { sinfo->cur_state = cur_state; } #if 0 { /* Debug section */ SaHpiTextBufferT buffer; err("Event for Sensor=%s", rdr->IdString.Data); oh_decode_eventstate(prev_state, event->EventDataUnion.SensorEvent.EventCategory, &buffer); err(" Previous Event State: %s.", buffer.Data); oh_decode_eventstate(cur_state, event->EventDataUnion.SensorEvent.EventCategory, &buffer); err(" Current Event State: %s", buffer.Data); } #endif /* Set previous and current state event info */ event->EventDataUnion.SensorEvent.PreviousState = prev_state; event->EventDataUnion.SensorEvent.CurrentState = cur_state; event->EventDataUnion.SensorEvent.OptionalDataPresent = event->EventDataUnion.SensorEvent.OptionalDataPresent | SAHPI_SOD_PREVIOUS_STATE | SAHPI_SOD_CURRENT_STATE; break; } case SAHPI_ET_HOTSWAP: { struct ResourceInfo *resinfo; resinfo = (struct ResourceInfo *)oh_get_resource_data(handle->rptcache, event->Source); if (resinfo == NULL) { /* If there is no resource data in rptcache, ie. no rpt, */ /* this resource either did not exist at HPI time 0, or */ /* has previously been removed from system. */ /* It is safe to assume that it is being Hotswap-Installed */ dbg("No resource data. RID=%x", event->Source); event->EventDataUnion.HotSwapEvent.PreviousHotSwapState = SAHPI_HS_STATE_NOT_PRESENT; event->EventDataUnion.HotSwapEvent.HotSwapState = SAHPI_HS_STATE_INACTIVE; return(SA_OK); } event->EventDataUnion.HotSwapEvent.PreviousHotSwapState = resinfo->cur_state; if (recovery_event) { event->EventDataUnion.HotSwapEvent.HotSwapState = resinfo->cur_state = eventmap_info->hs_recovery_state; } else { event->EventDataUnion.HotSwapEvent.HotSwapState = resinfo->cur_state = eventmap_info->hpievent.EventDataUnion.HotSwapEvent.HotSwapState; } break; } default: err("Unrecognized Event Type=%s.", oh_lookup_eventtype(event->EventType)); return(SA_ERR_HPI_INTERNAL_ERROR); } return(SA_OK); } /** * snmp_bc_map2oem: * @event: Pointer to handler's data. * @sel_entry: Error Log's "Source" field string. * @reason: Location to store HPI mapping data for resource. * * Any event not explicitly recognized is mapped into an HPI * OEM event. This routine performs the mapping. * * NOTE: * A reason code is passed, if in the future we record in some temp file, * non-mapped events. Reason records why the event wasn't mapped. * * Return values: * SA_OK - Normal case. * SA_ERR_HPI_INVALID_PARAMS - Pointer parameter(s) are NULL. **/ static SaErrorT snmp_bc_map2oem(SaHpiEventT *event, sel_entry *sel_entry, OEMReasonCodeT reason) { if (!event || !sel_entry) { err("Invalid parameter."); return(SA_ERR_HPI_INVALID_PARAMS); } dbg("OEM Event Reason Code=%s\n", reason ? "NOT_ALERTABLE" : "NOT MAPPED"); event->EventType = SAHPI_ET_OEM; event->EventDataUnion.OemEvent.MId = IBM_MANUFACTURING_ID; /* Language set to ENGLISH, default */ oh_init_textbuffer(&(event->EventDataUnion.OemEvent.OemEventData)); strncpy((char *)(event->EventDataUnion.OemEvent.OemEventData.Data), sel_entry->text, SAHPI_MAX_TEXT_BUFFER_LENGTH - 1); event->EventDataUnion.OemEvent.OemEventData.Data[SAHPI_MAX_TEXT_BUFFER_LENGTH - 1] = '\0'; event->EventDataUnion.OemEvent.OemEventData.DataLength = strlen(sel_entry->text); return(SA_OK); } /** * snmp_bc_logsrc2rid: * @handle: Pointer to handler's data. * @src: Error Log's "Source" field string. * @resinfo: Location to store HPI resource mapping information. * @ovr_flags: Override flags * * Translates platform error log's "Source" field into an HPI resource ID * and stores HPI mapping info needed by other routines in * @resinfo. Assume "Source" field text is in the following format: * * "BLADE_0x" - map to blade x RID * "SWITCH_x" - map to switch x RID * * All other "Source" field text strings are mapped to the * Chassis's resource ID. * * @ovr_flags is used to indicate exception cases. The two case * supported are: * - OVR_EXP - indicates resource is an expansion card. * - OVR_VMM - indicates resource is Virtual MM * - OVR_MM1 - indicates resource is the MM 1 card. * - OVR_MM2 - indicates resource is the MM 2 card. * - OVR_MM_PRIME - indicates resource is the physical MM of primary MM. * - OVR_MM_STBY - indicates resource is the physical MM of the standby MM. * * Return values: * SA_OK - Normal case. * SA_ERR_HPI_INVALID_PARAMS - Pointer parameter(s) are NULL. **/ static SaErrorT snmp_bc_logsrc2rid(struct oh_handler_state *handle, gchar *src, LogSource2ResourceT *logsrc2res, unsigned long long ovr_flags) { int rpt_index; guint src_loc; gchar **src_parts, *endptr, *root_tuple; SaErrorT err; SaHpiBoolT isblade, isexpansioncard, isswitch, ismm; SaHpiEntityPathT ep, ep_root; SaHpiEntityTypeT entity_type; struct snmp_bc_sensor *array_ptr; struct snmp_bc_hnd *custom_handle; if (!handle || !src || !logsrc2res) { err("Invalid parameter."); return(SA_ERR_HPI_INVALID_PARAMS); } src_parts = NULL; endptr = NULL; custom_handle = (struct snmp_bc_hnd *)handle->data; if (!custom_handle) { err("Invalid parameter."); return(SA_ERR_HPI_INVALID_PARAMS); } /* Find top-level chassis entity path */ oh_init_ep(&ep); oh_init_ep(&ep_root); root_tuple = (gchar *)g_hash_table_lookup(handle->config, "entity_root"); oh_encode_entitypath(root_tuple, &ep_root); /* Assume chassis location/type unless another resource type is discovered */ src_loc = ep_root.Entry[0].EntityLocation; entity_type = ep_root.Entry[0].EntityType; /* Break down "Source" text string to find source's RPT index and location */ src_parts = g_strsplit(src, "_", -1); if (src_parts == NULL) { err("Cannot split Source text string."); g_strfreev(src_parts); return(SA_ERR_HPI_INTERNAL_ERROR); } /* See if resource is something other than the chassis */ isblade = isexpansioncard = isswitch = ismm = SAHPI_FALSE; if (!g_ascii_strncasecmp(src_parts[0], "BLADE", sizeof("BLADE"))) { /* All expansion card events are reported as blade events in the Error Log */ if (ovr_flags & OVR_EXP) { isexpansioncard = SAHPI_TRUE; } else { isblade = SAHPI_TRUE; } } else { if (!g_ascii_strncasecmp(src_parts[0], "SWITCH", sizeof("SWITCH"))) { isswitch = SAHPI_TRUE; } } /* Find the location value from last part of log's source string */ if (isexpansioncard == SAHPI_TRUE || isblade == SAHPI_TRUE || isswitch == SAHPI_TRUE) { if (src_parts[1]) src_loc = strtoul(src_parts[1], &endptr, 10); if (isexpansioncard == SAHPI_TRUE) { rpt_index = BC_RPT_ENTRY_BLADE_EXPANSION_CARD; array_ptr = &snmp_bc_bem_sensors[0]; } else { if (isblade == SAHPI_TRUE) { rpt_index = BC_RPT_ENTRY_BLADE; array_ptr = &snmp_bc_blade_sensors[0]; } else { rpt_index = BC_RPT_ENTRY_SWITCH_MODULE; array_ptr = &snmp_bc_switch_sensors[0]; } } entity_type = snmp_bc_rpt_array[rpt_index].rpt.ResourceEntity.Entry[0].EntityType; } else { /* Check for OVR_MMx overrides, if cannot find explict resource from error logs "Source" field */ if (ovr_flags & OVR_VMM || ovr_flags & OVR_MM1 || ovr_flags & OVR_MM2 || ovr_flags & OVR_MM_PRIME || ovr_flags & OVR_MM_STBY) { if (ovr_flags & OVR_VMM) { rpt_index = BC_RPT_ENTRY_VIRTUAL_MGMNT_MODULE; src_loc = 0; array_ptr = &snmp_bc_virtual_mgmnt_sensors[0]; } else { ismm = SAHPI_TRUE; rpt_index = BC_RPT_ENTRY_MGMNT_MODULE; array_ptr = &snmp_bc_mgmnt_sensors[0]; if (ovr_flags & OVR_MM1 || ovr_flags & OVR_MM2) { if (ovr_flags & OVR_MM1) { src_loc = 1; } else { src_loc = 2; } } else { /* Assign primary/standby events to physical MM */ struct snmp_value value; int primary, standby; err = snmp_bc_snmp_get(custom_handle, SNMP_BC_MGMNT_ACTIVE, &value, SAHPI_TRUE); if (err) { err("Cannot get OID=%s.", SNMP_BC_MGMNT_ACTIVE); return(SA_ERR_HPI_INTERNAL_ERROR); } primary = value.integer; if (value.integer == 1) { standby = 2; } else { standby = 1; } if (ovr_flags & OVR_MM_PRIME) { src_loc = primary; } else { src_loc = standby; } /* Standby override */ } } entity_type = snmp_bc_rpt_array[rpt_index].rpt.ResourceEntity.Entry[0].EntityType; } else { rpt_index = BC_RPT_ENTRY_CHASSIS; array_ptr = &snmp_bc_chassis_sensors[0]; } } g_strfreev(src_parts); /* Find rest of Entity Path and calculate the RID */ err = oh_concat_ep(&ep, &snmp_bc_rpt_array[rpt_index].rpt.ResourceEntity); if (err) { err("Cannot concat Entity Path. Error=%s.", oh_lookup_error(err)); return(SA_ERR_HPI_INTERNAL_ERROR); } err = oh_concat_ep(&ep, &ep_root); if (err) { err("Cannot concat Entity Path. Error=%s.", oh_lookup_error(err)); return(SA_ERR_HPI_INTERNAL_ERROR); } /* FIXME:: Need to rewrite this section when discover multiple BEMs/blade */ /* Also switches aren't currently supported with the Source field - can remove this logic */ if ((isexpansioncard == SAHPI_TRUE)) { err = oh_set_ep_location(&ep, entity_type, 1); } else { err = oh_set_ep_location(&ep, entity_type, src_loc); } if (err) { err("Cannot set location. Type=%s; Location=%d; Error=%s.", oh_lookup_entitytype(entity_type), src_loc, oh_lookup_error(err)); return(SA_ERR_HPI_INTERNAL_ERROR); } if ((isblade == SAHPI_TRUE) || (isexpansioncard == SAHPI_TRUE)) { err = oh_set_ep_location(&ep, SAHPI_ENT_PHYSICAL_SLOT, src_loc); } else if (ismm == SAHPI_TRUE) { err = oh_set_ep_location(&ep, BLADECENTER_SYS_MGMNT_MODULE_SLOT, src_loc); } /* Special case - if Expansion Card set location of parent blade as well */ if (isexpansioncard == SAHPI_TRUE) { err = oh_set_ep_location(&ep, SAHPI_ENT_SBC_BLADE, src_loc); if (err) { err("Cannot set location. Type=%s; Location=%d; Error=%s.", oh_lookup_entitytype(SAHPI_ENT_SBC_BLADE), src_loc, oh_lookup_error(err)); return(SA_ERR_HPI_INTERNAL_ERROR); } } /* Fill in RID and RPT table info about "Source" */ logsrc2res->rpt = rpt_index; logsrc2res->sensor_array_ptr = array_ptr; logsrc2res->ep = ep; logsrc2res->rid = oh_uid_lookup(&ep); /********************************************************************************** * Generate RID, if necessary. * * RID may be zero if resource hasn't ever been discovered since HPI initialization. * In this case, generate a valid RID. Infra-structure always assigns same RID * number to an unique entity path. User app needs to worry about if resource * is actually in the chassis - just as they do for hot swapped resources. **********************************************************************************/ if (logsrc2res->rid == 0) { logsrc2res->rid = oh_uid_from_entity_path(&ep); if (logsrc2res->rid == 0) { err("No RID."); return(SA_ERR_HPI_INTERNAL_ERROR); } } return(SA_OK); } /** * snmp_bc_add_to_eventq * @handle: Pointer to handler's data. * @thisEvent: Location to store event. * * Add event to Infrastructure's event queue. * * Return values: * SA_OK - Normal case. * SA_ERR_HPI_INVALID_PARAMS - Pointer parameter(s) are NULL. **/ SaErrorT snmp_bc_add_to_eventq(struct oh_handler_state *handle, SaHpiEventT *thisEvent, SaHpiBoolT prepend) { SaHpiEntryIdT rdrid; struct oh_event *e = NULL; SaHpiRptEntryT *thisRpt; SaHpiRdrT *thisRdr; LogSource2ResourceT logsrc2res; SaErrorT err; struct snmp_bc_hnd *custom_handle = (struct snmp_bc_hnd *)handle->data; /* Insert entry to eventq for processing */ e = snmp_bc_alloc_oh_event(); if (!e) { err("Out of memory."); return(SA_ERR_HPI_OUT_OF_MEMORY); } thisRpt = oh_get_resource_by_id(handle->rptcache, thisEvent->Source); if (thisRpt) e->resource = *thisRpt; memcpy(&e->event, thisEvent, sizeof(SaHpiEventT)); /* Setting RDR ID to event struct */ switch (thisEvent->EventType) { case SAHPI_ET_HOTSWAP: if (snmp_bc_isrediscover(thisEvent) == SNMP_BC_RESOURCE_INSTALLED) { for (thisRdr = oh_get_rdr_by_id(handle->rptcache, thisEvent->Source, SAHPI_FIRST_ENTRY); thisRdr != NULL; thisRdr = oh_get_rdr_next(handle->rptcache, thisEvent->Source, thisRdr->RecordId)) { e->rdrs = g_slist_append(e->rdrs, g_memdup(thisRdr, sizeof(SaHpiRdrT))); } } else if (snmp_bc_isrediscover(thisEvent) == SNMP_BC_RESOURCE_REMOVED) { /* Call rediscovery to remove rpt and rdrs from rptcache */ if (thisRpt) logsrc2res.ep = thisRpt->ResourceEntity; err = snmp_bc_rediscover(handle, thisEvent, &logsrc2res); } break; case SAHPI_ET_OEM: case SAHPI_ET_USER: /* There is no RDR associated to OEM event */ e->rdrs = NULL; /* Set RDR Type to SAHPI_NO_RECORD, spec B-01.01 */ /* It is redundant because SAHPI_NO_RECORD == 0, Put code here for clarity */ break; case SAHPI_ET_SENSOR: rdrid = oh_get_rdr_uid(SAHPI_SENSOR_RDR, thisEvent->EventDataUnion.SensorEvent.SensorNum); thisRdr = oh_get_rdr_by_id(handle->rptcache, thisEvent->Source, rdrid); if (thisRdr) e->rdrs = g_slist_append(e->rdrs, g_memdup(thisRdr, sizeof(SaHpiRdrT))); else err("Rdr not found for rid %d, rdrid %d\n",thisEvent->Source, rdrid); break; case SAHPI_ET_WATCHDOG: rdrid = oh_get_rdr_uid(SAHPI_WATCHDOG_RDR, thisEvent->EventDataUnion.WatchdogEvent.WatchdogNum); thisRdr = oh_get_rdr_by_id(handle->rptcache, thisEvent->Source, rdrid); if (thisRdr) e->rdrs = g_slist_append(e->rdrs, g_memdup(thisRdr, sizeof(SaHpiRdrT))); else err("Rdr not found for rid %d, rdrid %d\n",thisEvent->Source, rdrid); break; case SAHPI_ET_RESOURCE: case SAHPI_ET_DOMAIN: case SAHPI_ET_SENSOR_ENABLE_CHANGE: case SAHPI_ET_HPI_SW: default: err("Unsupported Event Type=%s.", oh_lookup_eventtype(thisEvent->EventType)); return(SA_ERR_HPI_INTERNAL_ERROR); break; } if (prepend == SAHPI_TRUE) { custom_handle->eventq = g_slist_prepend(custom_handle->eventq, e); } else { custom_handle->eventq = g_slist_append(custom_handle->eventq, e); } return(SA_OK); } openhpi-2.14.1/plugins/snmp_bc/snmp_bc.h0000644000076400007640000001022511302566770015074 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2003, 2006 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * Renier Morales * Steve Sherman */ #ifndef __SNMP_BC_H #define __SNMP_BC_H #define SNMP_BC_MAX_SNMP_RETRY_ATTEMPTED 3 #define SNMP_BC_MAX_RESOURCES_MASK 16 /* 15-char long plus NULL terminated */ #include #include typedef struct { GStaticRecMutex lock; guint32 count; } ohpi_bc_lock; /* This handle is unique per instance of this plugin. * SNMP session data is stored in the handle along with config file data. */ struct snmp_bc_hnd { void *sessp; /* Opaque pointer, not a pointer to struct snmp_session */ struct snmp_session session; struct snmp_session *ss; /* SNMP Session pointer */ guint count_per_getbulk; /* For performance, GETBULK is used with snmpV3. */ /* This value indicates max OIDs per GETBULK request */ GSList *eventq; /* Event queue cache */ GHashTable *event2hpi_hash_ptr; /* Global "Event Number to HPI Event" hash table */ guint platform; guint active_mm; /* Used for duplicate event RID override */ char *host; char *host_alternate; SaHpiBoolT isFirstDiscovery; gchar handler_timezone[10]; guint handler_retries; /* Number of retries attempted on SNMP target (agent) */ ohpi_bc_lock snmp_bc_hlock; guint max_pb_supported; /* pb - processor blade */ guint max_blower_supported; /* blower - fan/blower */ guint max_pm_supported; /* pm - power module */ guint max_sm_supported; /* sm - i/o module */ guint max_mm_supported; /* mm - management module */ guint max_mt_supported; /* mt - media tray */ guint max_filter_supported; /* filter - front bezel */ guint max_tap_supported; /* tap - telco alarm panel */ guint max_nc_supported; /* nc - network clock */ guint max_mx_supported; /* mx - multiplex card */ guint max_mmi_supported; /* mmi - mm interposer */ guint max_smi_supported; /* smi - switch interposer */ gchar installed_pb_mask[SNMP_BC_MAX_RESOURCES_MASK]; gchar installed_blower_mask[SNMP_BC_MAX_RESOURCES_MASK]; gchar installed_pm_mask[SNMP_BC_MAX_RESOURCES_MASK]; gchar installed_sm_mask[SNMP_BC_MAX_RESOURCES_MASK]; gchar installed_mm_mask[SNMP_BC_MAX_RESOURCES_MASK]; gchar installed_tap_mask[SNMP_BC_MAX_RESOURCES_MASK]; gchar installed_nc_mask[SNMP_BC_MAX_RESOURCES_MASK]; gchar installed_mx_mask[SNMP_BC_MAX_RESOURCES_MASK]; gchar installed_mmi_mask[SNMP_BC_MAX_RESOURCES_MASK]; gchar installed_smi_mask[SNMP_BC_MAX_RESOURCES_MASK]; gulong installed_mt_mask; gulong installed_filter_mask; }; SaErrorT snmp_bc_snmp_get(struct snmp_bc_hnd *custom_handle, const char *objid, struct snmp_value *value, SaHpiBoolT retry); SaErrorT snmp_bc_oid_snmp_get(struct snmp_bc_hnd *custom_handle, SaHpiEntityPathT *ep, SaHpiEntityLocationT loc_offset, const gchar *oidstr, struct snmp_value *value, SaHpiBoolT retry); SaErrorT snmp_bc_snmp_set(struct snmp_bc_hnd *custom_handle, char *objid, struct snmp_value value); SaErrorT snmp_bc_oid_snmp_set(struct snmp_bc_hnd *custom_handle, SaHpiEntityPathT *ep, SaHpiEntityLocationT loc_offset, const gchar *oidstr, struct snmp_value value); SaErrorT snmp_bc_get_event(void *hnd); SaErrorT snmp_bc_set_resource_tag(void *hnd, SaHpiResourceIdT rid, SaHpiTextBufferT *tag); SaErrorT snmp_bc_set_resource_severity(void *hnd, SaHpiResourceIdT rid, SaHpiSeverityT sev); SaErrorT snmp_bc_control_parm(void *hnd, SaHpiResourceIdT rid, SaHpiParmActionT act); #endif openhpi-2.14.1/plugins/snmp_bc/snmp_bc_time.c0000644000076400007640000002740311302566770016113 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2003, 2006 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * Sean Dague */ #include /* * Enums and Constants */ /* * Table of days in each month. */ const unsigned short days_in_month[12] = /* Table of days in each month. */ { 31, /* January */ 28, /* February */ 31, /* March */ 30, /* April */ 31, /* May */ 30, /* June */ 31, /* July */ 31, /* August */ 30, /* September */ 31, /* October */ 30, /* November */ 31 /* December */ }; /* * Daylight saving time standards table * * This structure contains the definition of how daylight saving * time is observed for the supported timezones. * * If you add or remove any entries from this table you must also * change DST_STANDARDS (contains the indices for this table). */ const DST_ENTRY DST_TABLE[] = { /* * DST_USA: * Alaskan, Pacific, Mountain, Central, Eastern, * Atlantic, Newfoundland */ { 2, 0, SECOND_WEEK, SUNDAY, MARCH, 2, 0, FIRST_WEEK, SUNDAY, NOVEMBER }, /* * DST_ESA: * E. South America */ { 2, 0, THIRD_WEEK, SUNDAY, OCTOBER, 2, 0, SECOND_WEEK, SUNDAY, FEBRUARY }, /* * DST_MID: * Mid-Atlantic */ { 2, 0, LAST_WEEK, SUNDAY, MARCH, 2, 0, LAST_WEEK, SUNDAY, SEPTEMBER }, /* * DST_EEC: * Azores, GMT, Romance, Central European, GTB, * W. Europe, Arab, Russian, Ekateinburg, Yakutsk */ { 2, 0, LAST_WEEK, SUNDAY, MARCH, 3, 0, LAST_WEEK, SUNDAY, OCTOBER }, /* * DST_EEU: * E. Europe */ { 0, 0, LAST_WEEK, SUNDAY, MARCH, 1, 0, LAST_WEEK, SUNDAY, SEPTEMBER }, /* * DST_EGT: * Egypt */ { 2, 0, FIRST_WEEK, FRIDAY, MAY, 2, 0, LAST_WEEK, WEDNESDAY, SEPTEMBER }, /* * DST_FLE: * FLE */ { 3, 0, LAST_WEEK, SUNDAY, MARCH, 4, 0, LAST_WEEK, SUNDAY, OCTOBER }, /* * DST_IRN: * Iran */ { 2, 0, FIRST_WEEK, SUNDAY, MARCH, 2, 0, LAST_WEEK, TUESDAY, SEPTEMBER }, /* * DST_AUS: * Cen. Australia, AUS Eastern */ { 2, 0, LAST_WEEK, SUNDAY, OCTOBER, 2, 0, LAST_WEEK, SUNDAY, MARCH }, /* * DST_TAS: * Tasmania */ { 2, 0, FIRST_WEEK, SUNDAY, OCTOBER, 2, 0, LAST_WEEK, SUNDAY, MARCH }, /* * DST_NWZ: * New Zealand */ { 2, 0, LAST_WEEK, SUNDAY, MARCH, 3, 0, LAST_WEEK, SUNDAY, OCTOBER } }; /* * Determines if the given year is a leap year */ gboolean is_leap_year(guchar year) { /* * Leap years occur in years exactly divisible by 4, * except that years ending in 00 are leap years ONLY if * they are divisible by 400 */ if ((((year % 4) == 0) && ((year % 100) != 0)) || ((year % 400) == 0)) return(TRUE); else return(FALSE); } // End is_leap_year /* * Calculates day of month given month/year and weekday/week * * Note: This routine does not do any error checking on the inputs. * weekday assumed to be in DST_WEEKDAY * week assumed to be in DST_WEEK * month assumed to be in DST_MONTH * year assumed to be 0-99 */ guchar get_day_of_month(guchar weekday, guchar week, guchar month, guchar year) { guchar month_adj; guchar index; guchar day; /* * Calculate month adjustment */ month_adj = 0; for (index = 0; (index < (month - 1)); index++) month_adj += 35 - days_in_month[index]; if ((month > 2) && (is_leap_year(year) == TRUE)) month_adj--; // Allow for this year's leap day /* * Calculate day */ day = (weekday+14); /* Initialize (+14 to avoid going neg below) */ /* * Century adjustment. 90-99 is 1990-1999. * 00-89 is 2000-2089. Each century moves * day calculation 1 place. */ if (year >= 2) day--; day += month_adj; /* Month adjustment */ day -= (year%7); /* Year adjustment (every year moves day 1 place) */ day -= (((year+3)/4) % 7); /* Add effects of leap year */ day %= 7; /* Convert to weekday (0-6) */ day += ((week-1) * 7); /* Add in whole weeks */ day++; /* Adjust weekday (1-7) */ /* * May go past end if using LAST_WEEK, adjust if needed */ if (day > days_in_month[month-1]) day -= 7; return(day); } // End get_day_of_month gboolean is_dst_in_effect(struct tm *time, gchar **zone_token) { guchar year; guchar start_hour, end_hour; guchar start_day, end_day; guchar start_week, end_week; guchar start_wkday, end_wkday; guchar start_month, end_month; gboolean rc; guchar zone_index; rc = FALSE; year = time->tm_year; if (zone_token[2] == NULL) { zone_index = 1; } else { zone_index = atoi(zone_token[2]); } if (zone_index != 0) zone_index--; start_hour = DST_TABLE[zone_index].start_hour; start_day = DST_TABLE[zone_index].start_day; start_week = DST_TABLE[zone_index].start_week; start_wkday = DST_TABLE[zone_index].start_weekday; start_month = DST_TABLE[zone_index].start_month; end_hour = DST_TABLE[zone_index].end_hour; end_day = DST_TABLE[zone_index].end_day; end_week = DST_TABLE[zone_index].end_week; end_wkday = DST_TABLE[zone_index].end_weekday; end_month = DST_TABLE[zone_index].end_month; /* * If start_day not provided, use information from start_week and * start_weekday to calculate start_day */ if (start_day == 0) start_day = get_day_of_month(start_wkday, start_week, start_month, year); /* * If end_day not provided, use information from end_week and * end_weekday to calculate end_day */ if (end_day == 0) end_day = get_day_of_month(end_wkday, end_week, end_month, year); // It is daylight saving time if: // the month consists entirely of daylight saving days // it is the starting month but after the begin date // it is the begin date but past the starting hour // it is the ending month but before the end date // it is the end date but before the ending hour if (((end_month > start_month) && // Northern hemisphere check (time->tm_mon > start_month) && (time->tm_mon < end_month)) || ((start_month > end_month) && // Southern hemisphere check ((time->tm_mon > start_month) || (time->tm_mon < end_month))) || ((time->tm_mon == start_month) && ((time->tm_mday > start_day) || ((time->tm_mday == start_day) && (time->tm_hour >= start_hour)))) || ((time->tm_mon == end_month) && ((time->tm_mday < end_day) || ((time->tm_mday == end_day) && (time->tm_hour < (end_hour-1)))))) { rc = TRUE; } return(rc); } SaErrorT snmp_bc_set_dst(struct oh_handler_state *handle, struct tm *time) { gchar **zone_token; struct snmp_bc_hnd *custom_handle = handle->data; zone_token = g_strsplit(custom_handle->handler_timezone, ",", 3); if (zone_token[1] == NULL) { /* Daylight Saving Time info is not provided */ time->tm_isdst = -1; } else { if (g_ascii_strncasecmp(zone_token[1], "yes", sizeof("yes")) == 0) { /* Does the timestamp of this particular log */ /* fall within the observes DST period for this timezone? */ if (is_dst_in_effect(time, zone_token) == TRUE) time->tm_isdst = 1; else time->tm_isdst = 0; } else { /* Daylight Saving Time info is not observed */ /* Assuming "Not Observed" == "Not In DST" */ time->tm_isdst = 0; } } g_strfreev(zone_token); return(SA_OK); } /** * snmp_bc_get_sp_time: * @handle: Pointer to handler's state. * @time: Pointer to tm struct to store data. * * Returns SaHpiEventLogInfoT information about Event Log. * * Return values: * SA_OK - normal case. * SA_ERR_HPI_INVALID_PARAMS - Any pointer parameter is NULL. * SA_ERR_HPI_INTERNAL_ERROR - If cannot parse date and time returned from bc **/ SaErrorT snmp_bc_get_sp_time(struct oh_handler_state *handle, struct tm *time) { struct snmp_value get_value; struct tm tmptime; SaErrorT rv = SA_OK; struct snmp_bc_hnd *custom_handle; if (!handle || !time) return(SA_ERR_HPI_INVALID_PARAMS); rv = SA_OK; custom_handle = (struct snmp_bc_hnd *)handle->data; if (custom_handle->platform == SNMP_BC_PLATFORM_RSA) { rv = snmp_bc_snmp_get(custom_handle, SNMP_BC_DATETIME_OID_RSA, &get_value, SAHPI_TRUE); } else { rv = snmp_bc_snmp_get(custom_handle, SNMP_BC_DATETIME_OID, &get_value, SAHPI_TRUE); } if ( (rv == SA_OK) && (get_value.type == ASN_OCTET_STR) ) { if(sscanf(get_value.string,"%2d/%2d/%4d,%2d:%2d:%2d", &tmptime.tm_mon, &tmptime.tm_mday, &tmptime.tm_year, &tmptime.tm_hour, &tmptime.tm_min, &tmptime.tm_sec)) { snmp_bc_set_dst(handle, &tmptime); tmptime.tm_mon--; tmptime.tm_year -= 1900; } else { err("Couldn't parse Date/Time from Blade Center SP"); return(SA_ERR_HPI_INTERNAL_ERROR); } } else { err("Couldn't fetch Blade Center SP Date/Time Entry"); if (rv == SA_OK) rv = SA_ERR_HPI_INTERNAL_ERROR; return(rv); } *time = tmptime; return(SA_OK); } /** * snmp_bc_set_sp_time: * @ss: Pointer to session info. * @time: Pointer to tm struct to store data. * * * * Return values: * SA_OK - normal case. * SA_ERR_HPI_INVALID_PARAMS - Any pointer parameter is NULL. * SA_ERR_HPI_INTERNAL_ERROR - If cannot parse date and time returned from bc * Returncode from snmp_set() **/ SaErrorT snmp_bc_set_sp_time(struct snmp_bc_hnd *custom_handle, struct tm *time) { struct snmp_value set_value; SaErrorT returncode; if (!custom_handle || !time) return(SA_ERR_HPI_INVALID_PARAMS); returncode = SA_OK; set_value.type = ASN_OCTET_STR; strftime(set_value.string, sizeof(set_value.string), "%m/%d/%Y,%H:%M:%S", time); set_value.str_len = 19; if (custom_handle->platform == SNMP_BC_PLATFORM_RSA) { returncode = snmp_bc_snmp_set(custom_handle, SNMP_BC_DATETIME_OID_RSA, set_value); } else { returncode = snmp_bc_snmp_set(custom_handle, SNMP_BC_DATETIME_OID, set_value); } if (returncode != SA_OK) err("snmp_set is NOT successful\n"); return returncode; } openhpi-2.14.1/plugins/snmp_bc/snmp_bc_control.h0000644000076400007640000000154111302566770016635 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * Steve Sherman */ #ifndef __SNMP_BC_CONTROL_H #define __SNMP_BC_CONTROL_H SaErrorT snmp_bc_get_control_state(void *hnd, SaHpiResourceIdT rid, SaHpiCtrlNumT cid, SaHpiCtrlModeT *mode, SaHpiCtrlStateT *state); SaErrorT snmp_bc_set_control_state(void *hnd, SaHpiResourceIdT rid, SaHpiCtrlNumT cid, SaHpiCtrlModeT mode, SaHpiCtrlStateT *state); #endif openhpi-2.14.1/plugins/snmp_bc/snmp_bc_discover_rsa.c0000644000076400007640000002420511302566770017635 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004, 2006 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * W. David Ashley * Steve Sherman */ #include SaErrorT snmp_bc_discover_rsa(struct oh_handler_state *handle, SaHpiEntityPathT *ep_root) { int i; SaErrorT err; struct oh_event *e; struct snmp_value get_value; struct ResourceInfo *res_info_ptr; struct snmp_bc_hnd *custom_handle; if (!handle || !ep_root) { err("Invalid parameter."); return(SA_ERR_HPI_INVALID_PARAMS); } custom_handle = (struct snmp_bc_hnd *)handle->data; if (!custom_handle) { err("Invalid parameter."); return(SA_ERR_HPI_INVALID_PARAMS); } /****************** * Discover chassis ******************/ err = snmp_bc_snmp_get(custom_handle, SNMP_BC_PLATFORM_OID_RSA, &get_value, SAHPI_TRUE); if (err || get_value.type != ASN_INTEGER) { err("Cannot get OID=%s; Received Type=%d; Error=%s.", SNMP_BC_PLATFORM_OID_RSA, get_value.type, oh_lookup_error(err)); if (err) { return(err); } else { return(SA_ERR_HPI_INTERNAL_ERROR); } } e = snmp_bc_alloc_oh_event(); if (e == NULL) { err("Out of memory."); return(SA_ERR_HPI_OUT_OF_MEMORY); } e->resource = snmp_bc_rpt_array_rsa[RSA_RPT_ENTRY_CHASSIS].rpt; e->resource.ResourceEntity = *ep_root; e->resource.ResourceId = oh_uid_from_entity_path(&(e->resource.ResourceEntity)); snmp_bc_create_resourcetag(&(e->resource.ResourceTag), snmp_bc_rpt_array_rsa[RSA_RPT_ENTRY_CHASSIS].comment, ep_root->Entry[0].EntityLocation); dbg("Discovered resource=%s.", e->resource.ResourceTag.Data); /* Create platform-specific info space to add to infra-structure */ res_info_ptr = g_memdup(&(snmp_bc_rpt_array_rsa[RSA_RPT_ENTRY_CHASSIS].res_info), sizeof(struct ResourceInfo)); if (!res_info_ptr) { err("Out of memory."); g_free(e); return(SA_ERR_HPI_OUT_OF_MEMORY); } res_info_ptr->cur_state = SAHPI_HS_STATE_ACTIVE; /* Get UUID and convert to GUID */ err = snmp_bc_get_guid(custom_handle, e, res_info_ptr); /* Add resource to temporary event cache/queue */ err = oh_add_resource(handle->rptcache, &(e->resource), res_info_ptr, 0); if (err) { err("Failed to add resource. Error=%s.", oh_lookup_error(err)); g_free(e); return(err); } /* Find resource's events, sensors, controls, etc. */ snmp_bc_discover_res_events(handle, &(e->resource.ResourceEntity), res_info_ptr); snmp_bc_discover_sensors(handle, snmp_bc_chassis_sensors_rsa, e); snmp_bc_discover_controls(handle, snmp_bc_chassis_controls_rsa, e); snmp_bc_discover_inventories(handle, snmp_bc_chassis_inventories_rsa, e); /* ---------------------------------------- */ /* Construct .event of struct oh_event */ /* ---------------------------------------- */ snmp_bc_set_resource_add_oh_event(e, res_info_ptr); e->hid = handle->hid; oh_evt_queue_push(handle->eventq, e); /*************** * Discover CPUs ***************/ for (i=0; iresource = snmp_bc_rpt_array_rsa[RSA_RPT_ENTRY_CPU].rpt; oh_concat_ep(&(e->resource.ResourceEntity), ep_root); oh_set_ep_location(&(e->resource.ResourceEntity), SAHPI_ENT_PROCESSOR, i + SNMP_BC_HPI_LOCATION_BASE); /* See if CPU exists */ if (!rdr_exists(custom_handle, &(e->resource.ResourceEntity), 0, SNMP_BC_CPU_OID_RSA, 0, 0 )) { snmp_bc_free_oh_event(e); continue; } e->resource.ResourceId = oh_uid_from_entity_path(&(e->resource.ResourceEntity)); snmp_bc_create_resourcetag(&(e->resource.ResourceTag), snmp_bc_rpt_array_rsa[RSA_RPT_ENTRY_CPU].comment, i + SNMP_BC_HPI_LOCATION_BASE); dbg("Discovered resource=%s.", e->resource.ResourceTag.Data); /* Create platform-specific info space to add to infra-structure */ res_info_ptr = g_memdup(&(snmp_bc_rpt_array_rsa[RSA_RPT_ENTRY_CPU].res_info), sizeof(struct ResourceInfo)); if (!res_info_ptr) { err("Out of memory."); snmp_bc_free_oh_event(e); return(SA_ERR_HPI_OUT_OF_MEMORY); } res_info_ptr->cur_state = SAHPI_HS_STATE_ACTIVE; /* Get UUID and convert to GUID */ err = snmp_bc_get_guid(custom_handle, e, res_info_ptr); /* Add resource to temporary event cache/queue */ err = oh_add_resource(handle->rptcache, &(e->resource), res_info_ptr, 0); if (err) { err("Failed to add resource. Error=%s.", oh_lookup_error(err)); snmp_bc_free_oh_event(e); return(err); } /* Find resource's events, sensors, controls, etc. */ snmp_bc_discover_res_events(handle, &(e->resource.ResourceEntity), res_info_ptr); snmp_bc_discover_sensors(handle, snmp_bc_cpu_sensors_rsa, e); snmp_bc_discover_controls(handle, snmp_bc_cpu_controls_rsa, e); snmp_bc_discover_inventories(handle, snmp_bc_cpu_inventories_rsa, e); /* ---------------------------------------- */ /* Construct .event of struct oh_event */ /* ---------------------------------------- */ snmp_bc_set_resource_add_oh_event(e, res_info_ptr); e->hid = handle->hid; oh_evt_queue_push(handle->eventq, e); } /**************** * Discover DASDs ****************/ for (i=0; iresource = snmp_bc_rpt_array_rsa[RSA_RPT_ENTRY_DASD].rpt; oh_concat_ep(&(e->resource.ResourceEntity), ep_root); oh_set_ep_location(&(e->resource.ResourceEntity), SAHPI_ENT_DISK_BAY, i + SNMP_BC_HPI_LOCATION_BASE); /* See if DASD exists */ if (!rdr_exists(custom_handle, &(e->resource.ResourceEntity), 0, SNMP_BC_DASD_OID_RSA, 0, 0 )) { snmp_bc_free_oh_event(e); continue; } e->resource.ResourceId = oh_uid_from_entity_path(&(e->resource.ResourceEntity)); snmp_bc_create_resourcetag(&(e->resource.ResourceTag), snmp_bc_rpt_array_rsa[RSA_RPT_ENTRY_DASD].comment, i + SNMP_BC_HPI_LOCATION_BASE); dbg("Discovered resource=%s.", e->resource.ResourceTag.Data); /* Create platform-specific info space to add to infra-structure */ res_info_ptr = g_memdup(&(snmp_bc_rpt_array_rsa[RSA_RPT_ENTRY_DASD].res_info), sizeof(struct ResourceInfo)); if (!res_info_ptr) { err("Out of memory."); snmp_bc_free_oh_event(e); return(SA_ERR_HPI_OUT_OF_MEMORY); } res_info_ptr->cur_state = SAHPI_HS_STATE_ACTIVE; /* Get UUID and convert to GUID */ err = snmp_bc_get_guid(custom_handle, e, res_info_ptr); /* Add resource to temporary event cache/queue */ err = oh_add_resource(handle->rptcache, &(e->resource), res_info_ptr, 0); if (err) { err("Failed to add resource. Error=%s.", oh_lookup_error(err)); snmp_bc_free_oh_event(e); return(err); } /* Find resource's events, sensors, controls, etc. */ snmp_bc_discover_res_events(handle, &(e->resource.ResourceEntity), res_info_ptr); snmp_bc_discover_sensors(handle, snmp_bc_dasd_sensors_rsa, e); snmp_bc_discover_controls(handle, snmp_bc_dasd_controls_rsa, e); snmp_bc_discover_inventories(handle, snmp_bc_dasd_inventories_rsa, e); /* ---------------------------------------- */ /* Construct .event of struct oh_event */ /* ---------------------------------------- */ snmp_bc_set_resource_add_oh_event(e, res_info_ptr); e->hid = handle->hid; oh_evt_queue_push(handle->eventq, e); } /*************** * Discover Fans ***************/ for (i=0; iresource = snmp_bc_rpt_array_rsa[RSA_RPT_ENTRY_FAN].rpt; oh_concat_ep(&(e->resource.ResourceEntity), ep_root); oh_set_ep_location(&(e->resource.ResourceEntity), SAHPI_ENT_FAN, i + SNMP_BC_HPI_LOCATION_BASE); /* See if fan exists */ if (!rdr_exists(custom_handle, &(e->resource.ResourceEntity), 0, SNMP_BC_FAN_OID_RSA, 0, 0 )) { snmp_bc_free_oh_event(e); continue; } e->resource.ResourceId = oh_uid_from_entity_path(&(e->resource.ResourceEntity)); snmp_bc_create_resourcetag(&(e->resource.ResourceTag), snmp_bc_rpt_array_rsa[RSA_RPT_ENTRY_FAN].comment, i + SNMP_BC_HPI_LOCATION_BASE); dbg("Discovered resource=%s.", e->resource.ResourceTag.Data); /* Create platform-specific info space to add to infra-structure */ res_info_ptr = g_memdup(&(snmp_bc_rpt_array_rsa[RSA_RPT_ENTRY_FAN].res_info), sizeof(struct ResourceInfo)); if (!res_info_ptr) { err("Out of memory."); snmp_bc_free_oh_event(e); return(SA_ERR_HPI_OUT_OF_MEMORY); } res_info_ptr->cur_state = SAHPI_HS_STATE_ACTIVE; /* Get UUID and convert to GUID */ err = snmp_bc_get_guid(custom_handle, e, res_info_ptr); /* Add resource to temporary event cache/queue */ err = oh_add_resource(handle->rptcache, &(e->resource), res_info_ptr, 0); if (err) { err("Failed to add resource. Error=%s.", oh_lookup_error(err)); snmp_bc_free_oh_event(e); return(err); } /* Find resource's events, sensors, controls, etc. */ snmp_bc_discover_res_events(handle, &(e->resource.ResourceEntity), res_info_ptr); snmp_bc_discover_sensors(handle, snmp_bc_fan_sensors_rsa, e); snmp_bc_discover_controls(handle, snmp_bc_fan_controls_rsa, e); snmp_bc_discover_inventories(handle, snmp_bc_fan_inventories_rsa, e); /* ---------------------------------------- */ /* Construct .event of struct oh_event */ /* ---------------------------------------- */ snmp_bc_set_resource_add_oh_event(e, res_info_ptr); e->hid = handle->hid; oh_evt_queue_push(handle->eventq, e); } return(SA_OK); } openhpi-2.14.1/plugins/snmp_bc/snmp_bc_utils.h0000644000076400007640000000236511302566770016322 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2003, 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * Chris Chia */ #ifndef __SNMP_BC_UTILS_H #define __SNMP_BC_UTILS_H #define UUID_SUBSTRINGS_CNT1 8 #define UUID_SUBSTRINGS_CNT2 5 SaErrorT snmp_bc_get_guid(struct snmp_bc_hnd *custom_handle, struct oh_event *e, struct ResourceInfo *res_info_ptr); SaErrorT snmp_bc_extract_slot_ep(SaHpiEntityPathT *resource_ep, SaHpiEntityPathT *slot_ep); SaErrorT snmp_bc_extend_ep(struct oh_event *e, guint resource_index, gchar *interposer_intalled_mask); struct oh_event *snmp_bc_alloc_oh_event(void); void snmp_bc_free_oh_event(struct oh_event *e); SaErrorT snmp_bc_set_resource_add_oh_event(struct oh_event *e, struct ResourceInfo *res_info_ptr); SaErrorT snmp_bc_copy_oh_event(struct oh_event *new_event, struct oh_event *old_event); #endif openhpi-2.14.1/plugins/snmp_bc/snmp_bc_sel.h0000644000076400007640000000515511302566770015745 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2003, 2005, 2006 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * Renier Morales * Sean Dague */ #ifndef __SNMP_BC_SEL_H #define __SNMP_BC_SEL_H #define clearEventLogExecute 1 #define SNMP_BC_MAX_SEL_ID_LENGTH 20 #define SNMP_BC_MAX_SEL_ENTRY_LENGTH 256 typedef struct { struct tm time; SaHpiSeverityT sev; char source[SNMP_BC_MAX_SEL_ID_LENGTH]; char sname[SNMP_BC_MAX_SEL_ID_LENGTH]; char text[SNMP_BC_MAX_SEL_ENTRY_LENGTH]; } sel_entry; /* Function Prototyping */ SaErrorT snmp_bc_parse_sel_entry(struct oh_handler_state *handle, char *logstr, sel_entry *sel); SaErrorT snmp_bc_get_sel_entry(void *hnd, SaHpiResourceIdT id, SaHpiEventLogEntryIdT current, SaHpiEventLogEntryIdT *prev, SaHpiEventLogEntryIdT *next, SaHpiEventLogEntryT *entry, SaHpiRdrT *rdr, SaHpiRptEntryT *rptentry); SaErrorT snmp_bc_get_sel_info(void *hnd, SaHpiResourceIdT id, SaHpiEventLogInfoT *info); SaErrorT snmp_bc_set_sel_time(void *hnd, SaHpiResourceIdT id, SaHpiTimeT time); SaErrorT snmp_bc_add_sel_entry(void *hnd, SaHpiResourceIdT id, const SaHpiEventT *Event); SaErrorT snmp_bc_clear_sel(void *hnd, SaHpiResourceIdT id); SaErrorT snmp_bc_check_selcache(struct oh_handler_state *handle, SaHpiResourceIdT id, SaHpiEventLogEntryIdT entryId); SaErrorT snmp_bc_build_selcache(struct oh_handler_state *handle, SaHpiResourceIdT id); SaErrorT snmp_bc_sel_read_add (struct oh_handler_state *handle, SaHpiResourceIdT id, SaHpiEventLogEntryIdT sid, SaHpiBoolT prepend); SaErrorT snmp_bc_selcache_sync(struct oh_handler_state *handle, SaHpiResourceIdT id, SaHpiEventLogEntryIdT entryId); SaErrorT snmp_bc_sel_overflowreset(void *hnd, SaHpiResourceIdT id); SaErrorT snmp_bc_sel_state_set(void *hnd, SaHpiResourceIdT id, SaHpiBoolT enable); SaErrorT snmp_bc_bulk_selcache( struct oh_handler_state *handle, SaHpiResourceIdT id); SaErrorT snmp_bc_add_entry_to_elcache(struct oh_handler_state *handle, SaHpiEventT *tmpevent, SaHpiBoolT prepend); #endif openhpi-2.14.1/plugins/snmp_bc/sim_init.c0000644000076400007640000000143011302566770015257 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * Steve Sherman */ #include #include #include #include SaHpiBoolT is_simulator() { return(SAHPI_FALSE); } SaErrorT sim_banner(struct snmp_bc_hnd *custom_handle) { return(SA_OK); } SaErrorT sim_init() { return(SA_OK); } SaErrorT sim_close() { return(SA_OK); } openhpi-2.14.1/plugins/snmp_bc/snmp_bc_watchdog.h0000644000076400007640000000161411302566770016756 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * Steve Sherman */ #ifndef __SNMP_BC_WATCHDOG_H #define __SNMP_BC_WATCHDOG_H SaErrorT snmp_bc_get_watchdog_info(void *hnd, SaHpiResourceIdT id, SaHpiWatchdogNumT num, SaHpiWatchdogT *wdt); SaErrorT snmp_bc_set_watchdog_info(void *hnd, SaHpiResourceIdT id, SaHpiWatchdogNumT num, SaHpiWatchdogT *wdt); SaErrorT snmp_bc_reset_watchdog(void *hnd, SaHpiResourceIdT id, SaHpiWatchdogNumT num); #endif openhpi-2.14.1/plugins/snmp_bc/snmp_bc_inventory.h0000644000076400007640000000662211302566770017217 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2003, 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * Peter Phan * Renier Morales */ #ifndef __SNMP_BC_INVENTORY_H #define __SNMP_BC_INVENTORY_H #include #define NOS_BC_INVENTORY_FIELDS 10 /************************************************************************/ /* Resource one inventory data */ /************************************************************************/ struct bc_idr_area { SaHpiIdrAreaHeaderT idrareas; SaHpiIdrFieldT field[NOS_BC_INVENTORY_FIELDS]; }; struct bc_inventory_record { SaHpiIdrInfoT idrinfo; struct bc_idr_area area[3]; }; /* * Functions prototype */ /** * snmp_bc_get_idr_info: * @hnd: * @event: * @timeout: * * Return value: **/ SaErrorT snmp_bc_get_idr_info( void *hnd, SaHpiResourceIdT ResourceId, SaHpiIdrIdT IdrId, SaHpiIdrInfoT *IdrInfo); /** * snmp_bc_get_idr_area_header: * @hnd: * @event: * @timeout: * * Return value: **/ SaErrorT snmp_bc_get_idr_area_header( void *hnd, SaHpiResourceIdT ResourceId, SaHpiIdrIdT IdrId, SaHpiIdrAreaTypeT AreaType, SaHpiEntryIdT AreaId, SaHpiEntryIdT *NextAreaId, SaHpiIdrAreaHeaderT *Header); /** * snmp_bc_add_idr_area: * @hnd: * @event: * @timeout: * * Return value: **/ SaErrorT snmp_bc_add_idr_area( void *hnd, SaHpiResourceIdT ResourceId, SaHpiIdrIdT IdrId, SaHpiIdrAreaTypeT AreaType, SaHpiEntryIdT *AreaId); /** * snmp_bc_del_idr_area: * @hnd: * @event: * @timeout: * * Return value: **/ SaErrorT snmp_bc_del_idr_area( void *hnd, SaHpiResourceIdT ResourceId, SaHpiIdrIdT IdrId, SaHpiEntryIdT AreaId); /** * snmp_bc_get_idr_field: * @hnd: * @event: * @timeout: * * Return value: **/ SaErrorT snmp_bc_get_idr_field( void *hnd, SaHpiResourceIdT ResourceId, SaHpiIdrIdT IdrId, SaHpiEntryIdT AreaId, SaHpiIdrFieldTypeT FieldType, SaHpiEntryIdT FieldId, SaHpiEntryIdT *NextFieldId, SaHpiIdrFieldT *Field); /** * snmp_bc_add_idr_field: * @hnd: * @event: * @timeout: * * Return value: **/ SaErrorT snmp_bc_add_idr_field( void *hnd, SaHpiResourceIdT ResourceId, SaHpiIdrIdT IdrId, SaHpiIdrFieldT *Field); /** * snmp_bc_set_idr_field: * @hnd: * @event: * @timeout: * * Return value: **/ SaErrorT snmp_bc_set_idr_field( void *hnd, SaHpiResourceIdT ResourceId, SaHpiIdrIdT IdrId, SaHpiIdrFieldT *Field); /** * snmp_bc_del_idr_field: * @hnd: * @event: * @timeout: * * Return value: **/ SaErrorT snmp_bc_del_idr_field( void *hnd, SaHpiResourceIdT ResourceId, SaHpiIdrIdT IdrId, SaHpiEntryIdT AreaId, SaHpiEntryIdT FieldId); /** * vpd_exists: * @thisMib: * * Return value: **/ SaHpiBoolT vpd_exists(struct InventoryMibInfo *thisMib); #endif openhpi-2.14.1/plugins/snmp_bc/snmp_bc_session.c0000644000076400007640000004227411302566770016643 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2003, 2006 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * Renier Morales * Steve Sherman */ #include #include #define check_snmp_parm(input_parm) \ do { \ if (input_parm != NULL) { \ if ( (strlen(input_parm) == 0) || \ ( g_ascii_strncasecmp(input_parm, "NONE", 4) == 0 )) { \ input_parm = NULL; \ } \ } \ } while(0) /** * snmp_bc_open: * @handler_config: Pointer to hash table (passed by infrastructure) * * Open an SNMP BladeCenter/RSA plugin handler instance. * * Returns: * Plugin handle - normal operation. * NULL - on error. **/ void *snmp_bc_open(GHashTable *handler_config, unsigned int hid, oh_evt_queue *eventq) { struct oh_handler_state *handle; struct snmp_bc_hnd *custom_handle; char *hostname, *version, *sec_level, *authtype, *user, *pass, *community, *context_name, *count_per_getbulk, *privacy_passwd, *privacy_protocol; char *root_tuple; SaErrorT rv; if (!handler_config) { err("INVALID PARM - NULL handler_config pointer."); return NULL; } else if (!hid) { err("Bad handler id passed."); return NULL; } else if (!eventq) { err("No event queue was passed."); return NULL; } root_tuple = (char *)g_hash_table_lookup(handler_config, "entity_root"); if (!root_tuple) { err("Cannot find \"entity_root\" configuration parameter."); return NULL; } hostname = (char *)g_hash_table_lookup(handler_config, "host"); if (!hostname) { err("Cannot find \"host\" configuration parameter."); return NULL; } handle = (struct oh_handler_state *)g_malloc0(sizeof(struct oh_handler_state)); custom_handle = (struct snmp_bc_hnd *)g_malloc0(sizeof(struct snmp_bc_hnd)); if (!handle || !custom_handle) { err("Out of memory."); return NULL; } handle->data = custom_handle; handle->config = handler_config; handle->hid = hid; handle->eventq = eventq; /* Initialize the lock */ /* g_static_rec_mutex_init(&handle->handler_lock); */ g_static_rec_mutex_init(&custom_handle->snmp_bc_hlock.lock); custom_handle->snmp_bc_hlock.count = 0; /* Initialize resource masks */ /* Set all masks and counts to zero's */ custom_handle->max_pb_supported = 0; /* pb - processor blade */ custom_handle->max_blower_supported = 0; /* blower - blower */ custom_handle->max_pm_supported = 0; /* pm - power module */ custom_handle->max_sm_supported = 0; /* sm - switch module */ custom_handle->max_mm_supported = 0; /* mm - management module */ custom_handle->max_mt_supported = 0; /* mt - media tray */ custom_handle->max_filter_supported = 0; /* filter - front bezel */ custom_handle->max_tap_supported = 0; /* tap-telco alarm panel */ custom_handle->max_nc_supported = 0; /* nc - network clock card*/ custom_handle->max_mx_supported = 0; /* mx - multiplex card */ custom_handle->max_mmi_supported = 0; /* mmi- mm interposer */ custom_handle->max_smi_supported = 0; /* smi- switch interposer */ memset(&custom_handle->installed_pb_mask, '\0', SNMP_BC_MAX_RESOURCES_MASK); memset(&custom_handle->installed_blower_mask, '\0', SNMP_BC_MAX_RESOURCES_MASK); memset(&custom_handle->installed_pm_mask, '\0', SNMP_BC_MAX_RESOURCES_MASK); memset(&custom_handle->installed_sm_mask, '\0', SNMP_BC_MAX_RESOURCES_MASK); memset(&custom_handle->installed_mm_mask, '\0', SNMP_BC_MAX_RESOURCES_MASK); memset(&custom_handle->installed_tap_mask, '\0', SNMP_BC_MAX_RESOURCES_MASK); memset(&custom_handle->installed_nc_mask, '\0', SNMP_BC_MAX_RESOURCES_MASK); memset(&custom_handle->installed_mx_mask, '\0', SNMP_BC_MAX_RESOURCES_MASK); memset(&custom_handle->installed_mmi_mask, '\0', SNMP_BC_MAX_RESOURCES_MASK); memset(&custom_handle->installed_smi_mask, '\0', SNMP_BC_MAX_RESOURCES_MASK); custom_handle->installed_mt_mask = 0; custom_handle->installed_filter_mask = 0; custom_handle->host = NULL; custom_handle->host_alternate = NULL; /* Indicate this is the 1st discovery (T0 discovery) */ /* Use to see if we need to create events for log entries. */ /* Do not report any event from event log entries, for */ /* entries that are created before this instance of OpenHPI */ custom_handle->isFirstDiscovery = SAHPI_TRUE; /* Initialize RPT cache */ handle->rptcache = (RPTable *)g_malloc0(sizeof(RPTable)); oh_init_rpt(handle->rptcache); /* Initialize event log cache */ handle->elcache = oh_el_create(BC_EL_MAX_SIZE); handle->elcache->gentimestamp = FALSE; /* Initialize simulator tables */ if (is_simulator()) { custom_handle->ss = NULL; sim_init(); } else { /* Initialize SNMP library */ init_snmp("oh_snmp_bc"); snmp_sess_init(&(custom_handle->session)); custom_handle->session.peername = hostname; custom_handle->host = hostname; custom_handle->host_alternate = ((char *)g_hash_table_lookup(handle->config, "host_alternate")); /* Set retries/timeouts - based on testing with BC/BCT MM SNMP V3 agent */ custom_handle->session.retries = 3; custom_handle->session.timeout = 15000000; /* 15000000 in microseconds */ version = (char *)g_hash_table_lookup(handle->config, "version"); if (!version) { err("Cannot find \"version\" configuration parameter."); return NULL; } sec_level = (char *)g_hash_table_lookup(handle->config, "security_level"); authtype = (char *)g_hash_table_lookup(handle->config, "auth_type"); user = (char *)g_hash_table_lookup(handle->config, "security_name"); pass = (char *)g_hash_table_lookup(handle->config, "passphrase"); community = (char *)g_hash_table_lookup(handle->config, "community"); context_name = (char *)g_hash_table_lookup(handle->config, "context_name"); count_per_getbulk = (char *)g_hash_table_lookup(handle->config, "count_per_getbulk"); privacy_passwd = (char *)g_hash_table_lookup(handle->config, "privacy_passwd"); privacy_protocol = (char *)g_hash_table_lookup(handle->config, "privacy_protocol"); /* Treating three (3) cases of non-declared parm the same */ /* That is Not-declared-parm, parm = "", parm ="none" */ /* are the same to us */ check_snmp_parm(sec_level); check_snmp_parm(authtype); check_snmp_parm(user); check_snmp_parm(pass); check_snmp_parm(community); check_snmp_parm(context_name); check_snmp_parm(count_per_getbulk); check_snmp_parm(privacy_passwd); check_snmp_parm(privacy_protocol); /* Configure SNMP V3 session */ if (!g_ascii_strncasecmp(version, "3", sizeof("3"))) { if (!user) { err("Cannot find \"security_name\" configuration parameter."); return NULL; } custom_handle->session.version = SNMP_VERSION_3; custom_handle->session.securityName = user; custom_handle->session.securityNameLen = strlen(user); custom_handle->session.securityLevel = SNMP_SEC_LEVEL_NOAUTH; if (!g_ascii_strncasecmp(sec_level, "auth", 4)) { /* If using password */ if (!pass) { err("Cannot find \"passphrase\" configuration parameter."); return NULL; } custom_handle->session.securityLevel = SNMP_SEC_LEVEL_AUTHNOPRIV; if (!authtype || !g_ascii_strncasecmp(authtype, "MD5", sizeof("MD5"))) { custom_handle->session.securityAuthProto = usmHMACMD5AuthProtocol; custom_handle->session.securityAuthProtoLen = USM_AUTH_PROTO_MD5_LEN; } else if (!g_ascii_strncasecmp(authtype, "SHA", sizeof("SHA"))) { custom_handle->session.securityAuthProto = usmHMACSHA1AuthProtocol; custom_handle->session.securityAuthProtoLen = USM_AUTH_PROTO_SHA_LEN; } else { err("Unrecognized authenication type=%s.", authtype); return NULL; } custom_handle->session.securityAuthKeyLen = USM_AUTH_KU_LEN; if (generate_Ku(custom_handle->session.securityAuthProto, custom_handle->session.securityAuthProtoLen, (u_char *) pass, strlen(pass), custom_handle->session.securityAuthKey, &(custom_handle->session.securityAuthKeyLen)) != SNMPERR_SUCCESS) { snmp_perror("snmp_bc"); snmp_log(LOG_ERR, "Error generating Ku from authentication passphrase.\n"); err("Unable to establish SNMP authnopriv session."); return NULL; } if (!g_ascii_strncasecmp(sec_level, "authPriv", sizeof("authPriv"))) { /* if using encryption */ if (!privacy_passwd) { err("Cannot find \"privacy_passwd\" configuration parameter."); return NULL; } custom_handle->session.securityLevel = SNMP_SEC_LEVEL_AUTHPRIV; custom_handle->session.securityPrivProto = usmDESPrivProtocol; custom_handle->session.securityPrivProtoLen = USM_PRIV_PROTO_DES_LEN; custom_handle->session.securityPrivKeyLen = USM_PRIV_KU_LEN; if (generate_Ku(custom_handle->session.securityAuthProto, custom_handle->session.securityAuthProtoLen, (u_char *) privacy_passwd, strlen(privacy_passwd), custom_handle->session.securityPrivKey, &(custom_handle->session.securityPrivKeyLen)) != SNMPERR_SUCCESS) { snmp_perror("snmp_bc"); snmp_log(LOG_ERR, "Error generating Ku from private passphrase.\n"); err("Unable to establish SNMP authpriv session."); return NULL; } } if (context_name != NULL) { custom_handle->session.contextName = (char *)context_name; custom_handle->session.contextNameLen = strlen(context_name); } } if (count_per_getbulk != NULL) { custom_handle->count_per_getbulk = atoi((char *)count_per_getbulk); if (custom_handle->count_per_getbulk != 0) { if (custom_handle->count_per_getbulk <= SNMP_BC_BULK_MIN) custom_handle->count_per_getbulk = SNMP_BC_BULK_MIN; else if (custom_handle->count_per_getbulk > SNMP_BC_MM_BULK_MAX) custom_handle->count_per_getbulk = SNMP_BC_MM_BULK_MAX; } } else { custom_handle->count_per_getbulk = SNMP_BC_BULK_DEFAULT; } /* Configure SNMP V1 session */ } else if (!g_ascii_strncasecmp(version, "1", sizeof("1"))) { if (!community) { err("Cannot find \"community\" configuration parameter."); return NULL; } custom_handle->session.version = SNMP_VERSION_1; custom_handle->session.community = (u_char *)community; custom_handle->session.community_len = strlen(community); } else { err("Unrecognized SNMP version=%s.", version); return NULL; } rv = snmp_bc_manage_snmp_open(custom_handle, SAHPI_TRUE); if (rv != SA_OK) return NULL; } /* Determine BladeCenter chassis type */ { const char *oid; struct snmp_value get_value; SaErrorT err; do { err = snmp_bc_snmp_get(custom_handle, SNMP_BC_CHASSIS_TYPE_OID, &get_value, SAHPI_FALSE); if (err == SA_OK) { int chassis_type, chassis_subtype; chassis_type = get_value.integer; err = snmp_bc_snmp_get(custom_handle, SNMP_BC_CHASSIS_SUBTYPE_OID, &get_value, SAHPI_FALSE); if (err) { err("Cannot read model subtype"); chassis_subtype = SNMP_BC_CHASSIS_SUBTYPE_ORIG; } else { chassis_subtype = get_value.integer; } if (chassis_type == SNMP_BC_CHASSIS_TYPE_BC && chassis_subtype == SNMP_BC_CHASSIS_SUBTYPE_ORIG) { dbg("Found BC"); custom_handle->platform = SNMP_BC_PLATFORM_BC; break; } if (chassis_type == SNMP_BC_CHASSIS_TYPE_BC && chassis_subtype == SNMP_BC_CHASSIS_SUBTYPE_H) { dbg("Found BCH"); custom_handle->platform = SNMP_BC_PLATFORM_BCH; break; } if (chassis_type == SNMP_BC_CHASSIS_TYPE_BCT && chassis_subtype == SNMP_BC_CHASSIS_SUBTYPE_ORIG) { dbg("Found BCT"); custom_handle->platform = SNMP_BC_PLATFORM_BCT; break; } if (chassis_type == SNMP_BC_CHASSIS_TYPE_BCT && chassis_subtype == SNMP_BC_CHASSIS_SUBTYPE_H) { dbg("Found BCHT"); custom_handle->platform = SNMP_BC_PLATFORM_BCHT; break; } err("Unknown BladeCenter model"); return NULL; } else { /* Older MM software doesn't support chassis type and subtype OIDs */ err = snmp_bc_snmp_get(custom_handle, SNMP_BC_PLATFORM_OID_BCT, &get_value, SAHPI_FALSE); if (err == SA_OK) { dbg("Found BCT"); custom_handle->platform = SNMP_BC_PLATFORM_BCT; break; } err = snmp_bc_snmp_get(custom_handle, SNMP_BC_PLATFORM_OID_BC, &get_value, SAHPI_FALSE); if (err == SA_OK) { dbg("Found BC"); custom_handle->platform = SNMP_BC_PLATFORM_BC; break; } err = snmp_bc_snmp_get(custom_handle, SNMP_BC_PLATFORM_OID_RSA, &get_value, SAHPI_FALSE); if (err == SA_OK) { dbg("Found RSA"); custom_handle->platform = SNMP_BC_PLATFORM_RSA; break; } err("Unknown BladeCenter model"); return NULL; } } while(0); /* Determine if daylight savings time (DST) is enabled */ if (custom_handle->platform == SNMP_BC_PLATFORM_RSA) { oid = SNMP_BC_DST_RSA; } else { oid = SNMP_BC_DST; } err = snmp_bc_snmp_get(custom_handle, oid, &get_value, SAHPI_TRUE); if (err == SA_OK) { strncpy(custom_handle->handler_timezone, get_value.string,9); } else { err("Cannot read DST=%s; Error=%d.", oid, get_value.type); return NULL; } } /* Initialize "String to Event" mapping hash table */ if (errlog2event_hash_use_count == 0) { if (errlog2event_hash_init(custom_handle)) { err("Out of memory."); return NULL; } } errlog2event_hash_use_count++; /* Initialize "Event Number to HPI Event" mapping hash table */ if (event2hpi_hash_init(handle)) { err("Out of memory."); return NULL; } if (is_simulator()) { sim_banner(custom_handle); } return handle; } /** * snmp_bc_close: * @hnd: Pointer to handler structure. * * Close an SNMP BladeCenter/RSA plugin handler instance. * * Returns: * Void **/ void snmp_bc_close(void *hnd) { struct oh_handler_state *handle; if (!hnd) { err("INVALID PARM - NULL handle pointer."); return; } handle = (struct oh_handler_state *)hnd; oh_el_close(handle->elcache); if (is_simulator()) { sim_close(); } else { struct snmp_bc_hnd *custom_handle = (struct snmp_bc_hnd *)handle->data; snmp_sess_close(custom_handle->sessp); /* Windows32 specific net-snmp cleanup (noop on unix) */ SOCK_CLEANUP; } /* Cleanup event2hpi hash table */ event2hpi_hash_free(handle); /* Cleanup errlog2event_hash table */ errlog2event_hash_use_count--; if (errlog2event_hash_use_count == 0) { errlog2event_hash_free(); } oh_flush_rpt(handle->rptcache); g_free(handle->rptcache); } /** * snmp_bc_manage_snmp_open: * @hnd: Pointer to handler structure. * * . * * Returns: * SA_OK - able to open a snmp session **/ SaErrorT snmp_bc_manage_snmp_open(struct snmp_bc_hnd *custom_handle, SaHpiBoolT recovery_requested) { SaErrorT rv; rv = SA_OK; /* Windows32 specific net-snmp initialization (noop on unix) */ SOCK_STARTUP; custom_handle->sessp = snmp_sess_open(&(custom_handle->session)); if (custom_handle->sessp == NULL) { // snmp_perror("ack"); // snmp_log(LOG_ERR, "Something horrible happened!!!\n"); if (recovery_requested) { rv = snmp_bc_recover_snmp_session(custom_handle); } else { rv = SA_ERR_HPI_NO_RESPONSE; } } if (rv == SA_OK) custom_handle->ss = snmp_sess_session(custom_handle->sessp); return(rv); } /** * snmp_bc_recover_snmp_session: * @hnd: Pointer to handler structure. * * . * * Returns: * SA_OK - able to open a snmp session **/ SaErrorT snmp_bc_recover_snmp_session(struct snmp_bc_hnd *custom_handle) { SaErrorT rv; rv = SA_OK; if (custom_handle->host_alternate != NULL) { /* This openhpi.conf stanza has 2 different hosts defined */ if (!custom_handle->sessp) { snmp_sess_close(custom_handle->sessp); /* Windows32 specific net-snmp cleanup (noop on unix) */ SOCK_CLEANUP; } if ( strcmp(custom_handle->host, custom_handle->session.peername) == 0 ) { dbg("Attemp recovery with custom_handle->host_alternate %s\n", custom_handle->host_alternate); custom_handle->session.peername = custom_handle->host_alternate; } else { dbg("Attemp recovery with custom_handle->host %s\n", custom_handle->host); custom_handle->session.peername = custom_handle->host; } rv = snmp_bc_manage_snmp_open(custom_handle, SAHPI_FALSE); } else { dbg("No host_alternate defined in openhpi.conf. No recovery on host_alternate.\n"); rv = SA_ERR_HPI_NO_RESPONSE; } return(rv); } /** **/ void * oh_open (GHashTable *, unsigned int, oh_evt_queue *) __attribute__ ((weak, alias("snmp_bc_open"))); void * oh_close (void *) __attribute__ ((weak, alias("snmp_bc_close"))); openhpi-2.14.1/plugins/snmp_bc/snmp_bc_lock.h0000644000076400007640000000771511302566770016116 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * Sean Dague */ #ifndef __SNMP_BC_LOCK_H #define __SNMP_BC_LOCK_H #include #include /* * Define our own lock type, this allows for debuging * */ /* FIXME: turn all this off if there isn't thread safe enabled */ #if 0 typedef struct { GStaticRecMutex lock; guint32 count; } ohpi_bc_lock; #endif #define dbg_snmp_lock(format, ...) \ do { \ if (getenv("OPENHPI_DEBUG_BCLOCK") && !strcmp("YES",getenv("OPENHPI_DEBUG_BCLOCK"))) { \ fprintf(stderr, " BC_LOCK Thread: %p - %s:%d:%s: ", g_thread_self(), __FILE__, __LINE__, __func__); \ fprintf(stderr, format "\n", ## __VA_ARGS__); \ } \ } while(0) #define snmp_bc_lock(bclock) \ do { \ if (!g_static_rec_mutex_trylock(&bclock.lock)) { \ dbg_snmp_lock("Going to block for a lock now. Lockcount %d\n", \ bclock.count); \ g_static_rec_mutex_lock(&bclock.lock); \ bclock.count++; \ dbg_snmp_lock("Got the lock after blocking, Lockcount %d\n", bclock.count); \ } else { \ bclock.count++; \ dbg_snmp_lock("Got the lock because no one had it. Lockcount %d\n", \ bclock.count); \ } \ } while(0) #define snmp_bc_unlock(bclock) \ do { \ bclock.count--; \ g_static_rec_mutex_unlock(&bclock.lock); \ dbg_snmp_lock("Released the lock, lockcount %d\n", bclock.count); \ } while(0) #define snmp_bc_lock_handler(custom_handle) \ do { \ dbg_snmp_lock("Attempt to lock custom_handle %p, lock count %d \n", \ custom_handle, (custom_handle->snmp_bc_hlock.count)); \ snmp_bc_lock( custom_handle->snmp_bc_hlock ); \ dbg_snmp_lock("custom_handle %p got lock, lock count %d \n", \ custom_handle, (custom_handle->snmp_bc_hlock.count)); \ } while(0) #define snmp_bc_unlock_handler(custom_handle) \ do { \ dbg_snmp_lock("Attempt to unlock custom_handle %p, lock count %d \n", \ custom_handle, (custom_handle->snmp_bc_hlock.count)); \ snmp_bc_unlock( custom_handle->snmp_bc_hlock ); \ dbg_snmp_lock("custom_handle %p released lock, lock count %d \n", \ custom_handle, (custom_handle->snmp_bc_hlock.count)); \ } while(0) #endif openhpi-2.14.1/plugins/snmp_bc/snmp_bc_event.map0000644000076400007640000057234611302566770016644 0ustar ######################################################################## # (C) Copyright IBM Corp. 2004, 2007 # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This # file and program are licensed under a BSD style license. See # the Copying file included with the OpenHPI distribution for # full licensing terms. # # Author(s): # Steve Sherman ######################################################################### ######################################################################### # This file serves as input to eventmap2code.pl. # # NOTES: # - Strip ending periods from event strings # - MM's generic threshold event strings are assigned event numbers # starting with FFFF. # - BIOS events start with BBBB. # - Cannot have duplicate events with the chassis and any other resource # that cannot be explicitly derived from the event log's Source field. # - Add FF to beginning of event numbers for duplicate events # (e.g. EN_PFA_HI_FAULT_2_5V). Only need to do this if different resources # have events with the same string text message (don't care if same string # text has multiple event numbers for the same resource). # - OVR_MM1 and OVR_MM2 used to identify MM1 or MM2 for hotswap and # takeover events. # - OVR_VMM is for entities assigned to the virtual MM resource. # - OVR_EXP is used to assign BEM events to the add-in card resource. # They are reported by the SNMP event log's Source field as blade events. ########################################################################### # Test event - used to unit test code EN_TEST_EVENT|0xFFFFFFFF|SAHPI_CRITICAL|NO_OVR|"Bogus Test Event" ###################################################### # BladeCenter, BladeCenter H, and BladeCenter T Events ###################################################### ################## # Chassis Resource ################## # None ################# # Chassis Sensors ################# # Ambient Air Temperature Sensor EN_FAULT_CRT_AMBIENT|0x6F400000|SAHPI_CRITICAL|OVR_SEV|"Telco Ambient Temperature is outside the supported range (4-40)" EN_FAULT_CRT_AMBIENT|0x6F400000|SAHPI_CRITICAL|OVR_SEV|"Ambient temperature is outside of the supported range" EN_PFA_HI_OVER_TEMP_AMBIENT|0x0001D500|SAHPI_MAJOR|OVR_SEV|"System over recommended ambient temperature" EN_PFA_HI_OVER_TEMP_AMBIENT|0x0001D500|SAHPI_MAJOR|OVR_SEV|"Chassis over recommended ambient temperature" # I/O Module Redundancy Sensor - event-only EN_SWITCH_NON_REDUNDANT|0x0EA16000|SAHPI_MINOR|OVR_SEV|"Chassis Running Nonredundant I/O Modules" EN_SWITCH_NON_REDUNDANT|0x0EA16000|SAHPI_MINOR|OVR_SEV|"Chassis running with nonredundant I/O modules" # Power Module Redundancy Sensor - event-only EN_NR_PWR_SUPPLY|0x08080001|SAHPI_INFORMATIONAL|OVR_SEV|"Insufficient chassis power to support redundancy" EN_NR_PWR_SUPPLY_DOM_1|0x08081001|SAHPI_MINOR|OVR_SEV|"Power modules are nonredundant in domain 1" EN_NR_PWR_SUPPLY_DOM_2|0x08081002|SAHPI_MINOR|OVR_SEV|"Power modules are nonredundant in domain 2" # Power Domain 1 Redundancy Sensor - event-only # This string necessary since Recovery string is truncated EN_PWR_DOMAIN_1_OVER_SUBSCRIP|0x08009401|SAHPI_INFORMATIONAL|OVR_SEV|"Demand exceeds a single power module. Throttling can occur in domain 1 if redundancy is lo" EN_PWR_DOMAIN_1_OVER_SUBSCRIP|0x08009401|SAHPI_INFORMATIONAL|OVR_SEV|"Demand exceeds a single power module. Throttling can occur in domain 1 if redundancy is lost" EN_PWR_DOMAIN_1_OVER_SUBSCRIP|0x08009401|SAHPI_INFORMATIONAL|OVR_SEV|"Blades in domain 1 will throttle if a single Power Module fails" # This string necessary since Recovery string is truncated EN_PWR_DOMAIN_1_OVER_SUBSCRIP_NONREC|0x08008401|SAHPI_MINOR|OVR_SEV|"Demand exceeds a single power module. Immediate shutdown in domain 1 may occur if module f" EN_PWR_DOMAIN_1_OVER_SUBSCRIP_NONREC|0x08008401|SAHPI_MINOR|OVR_SEV|"Demand exceeds a single power module. Immediate shutdown in domain 1 may occur if module fails" EN_PWR_DOMAIN_1_OVER_SUBSCRIP_NONREC|0x08008401|SAHPI_MINOR|OVR_SEV|"The budgeted power is more than a what a single Power Module can provide in domain 1" # Power Domain 2 Redundancy Sensor - event-only # This string necessary since Recovery string is truncated EN_PWR_DOMAIN_2_OVER_SUBSCRIP|0x08009402|SAHPI_INFORMATIONAL|OVR_SEV|"Demand exceeds a single power module. Throttling can occur in domain 2 if redundancy is lo" EN_PWR_DOMAIN_2_OVER_SUBSCRIP|0x08009402|SAHPI_INFORMATIONAL|OVR_SEV|"Demand exceeds a single power module. Throttling can occur in domain 2 if redundancy is lost" EN_PWR_DOMAIN_2_OVER_SUBSCRIP|0x08009402|SAHPI_INFORMATIONAL|OVR_SEV|"Blades in domain 2 will throttle if a single Power Module fails" # This string necessary since Recovery string is truncated EN_PWR_DOMAIN_2_OVER_SUBSCRIP_NONREC|0x08008402|SAHPI_MINOR|OVR_SEV|"Demand exceeds a single power module. Immediate shutdown in domain 2 may occur if module f" EN_PWR_DOMAIN_2_OVER_SUBSCRIP_NONREC|0x08008402|SAHPI_MINOR|OVR_SEV|"Demand exceeds a single power module. Immediate shutdown in domain 2 may occur if module fails" EN_PWR_DOMAIN_2_OVER_SUBSCRIP_NONREC|0x08008402|SAHPI_MINOR|OVR_SEV|"The budgeted power is more than a what a single Power Module can provide in domain 2" # Chassis Filter Sensor - event only EN_FAULT_CRT_FILTER|0x6F100000|SAHPI_CRITICAL|OVR_SEV|"Telco Filter is in CRITICAL condition. Replace filter needed" EN_FAULT_CRT_FILTER|0x6F100000|SAHPI_CRITICAL|OVR_SEV|"Air filter needs service" EN_FAULT_CRT_FILTER|0x6F100000|SAHPI_CRITICAL|OVR_SEV|"The air filter needs service" EN_FAULT_MJR_FILTER|0x6F200000|SAHPI_MAJOR|OVR_SEV|"Telco Filter is in BAD condition" EN_FAULT_MJR_FILTER|0x6F200000|SAHPI_MAJOR|OVR_SEV|"The air filter is in bad condition, may need service." EN_FAULT_MNR_FILTER|0x6F300000|SAHPI_MINOR|OVR_SEV|"Telco Filter is in WARNING condition" EN_FAULT_MNR_FILTER|0x6F300000|SAHPI_MINOR|OVR_SEV|"The air filter may need service" EN_FAULT_MNR_FILTER_SERVICE|0x6F500000|SAHPI_INFORMATIONAL|OVR_SEV|"Telco Filter: Routine Service Check is required" ############################ # Management Module Resource ############################ EN_MM_1_INSTALLED|0x00282001|SAHPI_INFORMATIONAL|OVR_SEV,OVR_MM1|"Management Module 1 was installed" EN_MM_1_INSTALLED|0x00282001|SAHPI_INFORMATIONAL|OVR_SEV,OVR_MM1|"Management Module 1 installed" EN_MM_2_INSTALLED|0x00282002|SAHPI_INFORMATIONAL|OVR_SEV,OVR_MM2|"Management Module 2 was installed" EN_MM_2_INSTALLED|0x00282002|SAHPI_INFORMATIONAL|OVR_SEV,OVR_MM2|"Management Module 2 installed" EN_MM_1_REMOVED|0x00284001|SAHPI_INFORMATIONAL|OVR_SEV,OVR_MM1|"Management Module 1 was removed" EN_MM_1_REMOVED|0x00284001|SAHPI_INFORMATIONAL|OVR_SEV,OVR_MM1|"Management Module 1 removed" EN_MM_2_REMOVED|0x00284002|SAHPI_INFORMATIONAL|OVR_SEV,OVR_MM2|"Management Module 2 was removed" EN_MM_2_REMOVED|0x00284002|SAHPI_INFORMATIONAL|OVR_SEV,OVR_MM2|"Management Module 2 removed" ################################### # Virtual Management Module Sensors ################################### # System Management Bus Operational State Sensor - event only #### Mapped to Off-line Operational State EN_I2C_BUS_0_FAIL|0x00020000|SAHPI_CRITICAL|OVR_SEV,OVR_VMM|"Failure reading I2C device. Check devices on bus 0" EN_I2C_BUS_0_FAIL|0x00020000|SAHPI_CRITICAL|OVR_SEV,OVR_VMM|"Failure reading device on system management bus 0" EN_I2C_BUS_1_FAIL|0x00020001|SAHPI_CRITICAL|OVR_SEV,OVR_VMM|"Failure reading I2C device. Check devices on bus 1" EN_I2C_BUS_1_FAIL|0x00020001|SAHPI_CRITICAL|OVR_SEV,OVR_VMM|"Failure reading device on system management bus 1" EN_I2C_BUS_2_FAIL|0x00020002|SAHPI_CRITICAL|OVR_SEV,OVR_VMM|"Failure reading I2C device. Check devices on bus 2" EN_I2C_BUS_2_FAIL|0x00020002|SAHPI_CRITICAL|OVR_SEV,OVR_VMM|"Failure reading device on system management bus 2" EN_I2C_BUS_3_FAIL|0x00020003|SAHPI_CRITICAL|OVR_SEV,OVR_VMM|"Failure reading I2C device. Check devices on bus 3" EN_I2C_BUS_3_FAIL|0x00020003|SAHPI_CRITICAL|OVR_SEV,OVR_VMM|"Failure reading device on system management bus 3" EN_I2C_BUS_4_FAIL|0x00020004|SAHPI_CRITICAL|OVR_SEV,OVR_VMM|"Failure reading I2C device. Check devices on bus 4" EN_I2C_BUS_4_FAIL|0x00020004|SAHPI_CRITICAL|OVR_SEV,OVR_VMM|"Failure reading device on system management bus 4" EN_I2C_BUS_5_FAIL|0x00020005|SAHPI_CRITICAL|OVR_SEV,OVR_VMM|"Failure reading I2C device. Check devices on bus 5" EN_I2C_BUS_5_FAIL|0x00020005|SAHPI_CRITICAL|OVR_SEV,OVR_VMM|"Failure reading device on system management bus 5" EN_I2C_BUS_6_FAIL|0x00020006|SAHPI_CRITICAL|OVR_SEV,OVR_VMM|"Failure reading I2C device. Check devices on bus 6" EN_I2C_BUS_6_FAIL|0x00020006|SAHPI_CRITICAL|OVR_SEV,OVR_VMM|"Failure reading device on system management bus 6" EN_I2C_BUS_7_FAIL|0x00020007|SAHPI_CRITICAL|OVR_SEV,OVR_VMM|"Failure reading I2C device. Check devices on bus 7" EN_I2C_BUS_7_FAIL|0x00020007|SAHPI_CRITICAL|OVR_SEV,OVR_VMM|"Failure reading device on system management bus 7" EN_I2C_BUS_8_FAIL|0x00020008|SAHPI_CRITICAL|OVR_SEV,OVR_VMM|"Failure reading I2C device. Check devices on bus 8" EN_I2C_BUS_8_FAIL|0x00020008|SAHPI_CRITICAL|OVR_SEV,OVR_VMM|"Failure reading device on system management bus 8" EN_I2C_BUS_9_FAIL|0x00020009|SAHPI_CRITICAL|OVR_SEV,OVR_VMM|"Failure reading I2C device. Check devices on bus 9" EN_I2C_BUS_9_FAIL|0x00020009|SAHPI_CRITICAL|OVR_SEV,OVR_VMM|"Failure reading device on system management bus 9" EN_I2C_BUS_10_FAIL|0x0002000A|SAHPI_CRITICAL|OVR_SEV,OVR_VMM|"Failure reading I2C device. Check devices on bus 10" EN_I2C_BUS_10_FAIL|0x0002000A|SAHPI_CRITICAL|OVR_SEV,OVR_VMM|"Failure reading device on system management bus 10" EN_I2C_BUS_11_FAIL|0x0002000B|SAHPI_CRITICAL|OVR_SEV,OVR_VMM|"Failure reading I2C device. Check devices on bus 11" EN_I2C_BUS_11_FAIL|0x0002000B|SAHPI_CRITICAL|OVR_SEV,OVR_VMM|"Failure reading device on system management bus 11" EN_I2C_BUS_12_FAIL|0x0002000C|SAHPI_CRITICAL|OVR_SEV,OVR_VMM|"Failure reading I2C device. Check devices on bus 12" EN_I2C_BUS_12_FAIL|0x0002000C|SAHPI_CRITICAL|OVR_SEV,OVR_VMM|"Failure reading device on system management bus 12" EN_I2C_BUS_13_FAIL|0x0002000D|SAHPI_CRITICAL|OVR_SEV,OVR_VMM|"Failure reading I2C device. Check devices on bus 13" EN_I2C_BUS_13_FAIL|0x0002000D|SAHPI_CRITICAL|OVR_SEV,OVR_VMM|"Failure reading device on system management bus 13" EN_I2C_BUS_14_FAIL|0x0002000E|SAHPI_CRITICAL|OVR_SEV,OVR_VMM|"Failure reading I2C device. Check devices on bus 14" EN_I2C_BUS_14_FAIL|0x0002000E|SAHPI_CRITICAL|OVR_SEV,OVR_VMM|"Failure reading device on system management bus 14" EN_I2C_BUS_15_FAIL|0x0002000F|SAHPI_CRITICAL|OVR_SEV,OVR_VMM|"Failure reading I2C device. Check devices on bus 15" EN_I2C_BUS_15_FAIL|0x0002000F|SAHPI_CRITICAL|OVR_SEV,OVR_VMM|"Failure reading device on system management bus 15" EN_I2C_BUS_16_FAIL|0x00020010|SAHPI_CRITICAL|OVR_SEV,OVR_VMM|"Failure reading I2C device. Check devices on bus 16" EN_I2C_BUS_16_FAIL|0x00020010|SAHPI_CRITICAL|OVR_SEV,OVR_VMM|"Failure reading device on system management bus 16" EN_I2C_BUS_17_FAIL|0x00020011|SAHPI_CRITICAL|OVR_SEV,OVR_VMM|"Failure reading I2C device. Check devices on bus 17" EN_I2C_BUS_17_FAIL|0x00020011|SAHPI_CRITICAL|OVR_SEV,OVR_VMM|"Failure reading device on system management bus 17" EN_I2C_BUS_18_FAIL|0x00020012|SAHPI_CRITICAL|OVR_SEV,OVR_VMM|"Failure reading I2C device. Check devices on bus 18" EN_I2C_BUS_18_FAIL|0x00020012|SAHPI_CRITICAL|OVR_SEV,OVR_VMM|"Failure reading device on system management bus 18" EN_I2C_BUS_19_FAIL|0x00020013|SAHPI_CRITICAL|OVR_SEV,OVR_VMM|"Failure reading I2C device. Check devices on bus 19" EN_I2C_BUS_19_FAIL|0x00020013|SAHPI_CRITICAL|OVR_SEV,OVR_VMM|"Failure reading device on system management bus 19" EN_I2C_BUS_20_FAIL|0x00020014|SAHPI_CRITICAL|OVR_SEV,OVR_VMM|"Failure reading I2C device. Check devices on bus 20" EN_I2C_BUS_20_FAIL|0x00020014|SAHPI_CRITICAL|OVR_SEV,OVR_VMM|"Failure reading device on system management bus 20" EN_I2C_BUS_21_FAIL|0x00020015|SAHPI_CRITICAL|OVR_SEV,OVR_VMM|"Failure reading I2C device. Check devices on bus 21" EN_I2C_BUS_21_FAIL|0x00020015|SAHPI_CRITICAL|OVR_SEV,OVR_VMM|"Failure reading device on system management bus 21" EN_I2C_BUS_22_FAIL|0x00020016|SAHPI_CRITICAL|OVR_SEV,OVR_VMM|"Failure reading I2C device. Check devices on bus 22" EN_I2C_BUS_22_FAIL|0x00020016|SAHPI_CRITICAL|OVR_SEV,OVR_VMM|"Failure reading device on system management bus 22" EN_I2C_BUS_23_FAIL|0x00020017|SAHPI_CRITICAL|OVR_SEV,OVR_VMM|"Failure reading I2C device. Check devices on bus 23" EN_I2C_BUS_23_FAIL|0x00020017|SAHPI_CRITICAL|OVR_SEV,OVR_VMM|"Failure reading device on system management bus 23" EN_I2C_BUS_24_FAIL|0x00020018|SAHPI_CRITICAL|OVR_SEV,OVR_VMM|"Failure reading I2C device. Check devices on bus 24" EN_I2C_BUS_24_FAIL|0x00020018|SAHPI_CRITICAL|OVR_SEV,OVR_VMM|"Failure reading device on system management bus 24" EN_I2C_BUS_25_FAIL|0x00020019|SAHPI_CRITICAL|OVR_SEV,OVR_VMM|"Failure reading device on system management bus 25" EN_I2C_BUS_25_FAIL|0x00020019|SAHPI_CRITICAL|OVR_SEV,OVR_VMM|"Failure reading I2C device. Check devices on bus 25" EN_I2C_BUS_26_FAIL|0x0002001A|SAHPI_CRITICAL|OVR_SEV,OVR_VMM|"Failure reading I2C device. Check devices on bus 26" EN_I2C_BUS_26_FAIL|0x0002001A|SAHPI_CRITICAL|OVR_SEV,OVR_VMM|"Failure reading device on system management bus 26" EN_SP_CTRL_OFFLINE|0x00216015|SAHPI_CRITICAL|OVR_SEV,OVR_VMM|"Service processor controller access off-line" EN_SP_CTRL_UNAVAILABLE|0x00216016|SAHPI_CRITICAL|OVR_SEV,OVR_VMM|"Service processor controller access unavailable" EN_STCONN_FAIL_MIDPLANE|0x00022014|SAHPI_CRITICAL|OVR_SEV,OVR_VMM|"Connectivity status midplane communication failed" #### Mapped to Degraded Operational State EN_SP_CTRL_DEGRADED|0x00216014|SAHPI_MINOR|OVR_SEV,OVR_VMM|"Service processor controller access degraded" EN_SP_SENSOR_DEGRADED|0x00216013|SAHPI_MINOR|OVR_SEV,OVR_VMM|"Service processor sensor access degraded" EN_IPMI_BMC_COMM_FAIL|0x00216000|SAHPI_MINOR|OVR_SEV,OVR_VMM|"Problem communicating with BMC" EN_UNABLE_ISLOATE_BUS|0x00101007|SAHPI_MAJOR|OVR_SEV,OVR_VMM|"Unable to isolate bus fault - bus was not recovered" EN_MGMT_BUS_FAULT|0x00103000|SAHPI_MAJOR|OVR_SEV,OVR_VMM|"Management bus communication fault" # MM Air Temperature Sensor EN_PFA_HI_OVER_TEMP_SP_CARD|0x0001D400|SAHPI_MAJOR|OVR_SEV,OVR_VMM|"Management Module is over recommended temperature" # System 1.8 Volt Sensor EN_I2C_HI_FAULT_1_8V|0x0807B401|SAHPI_CRITICAL|OVR_SEV,OVR_VMM|"System is over recommended voltage for 1.8V CPU" EN_I2C_HI_FAULT_1_8V|0x0807B401|SAHPI_CRITICAL|OVR_SEV,OVR_VMM|"Chassis 1.8V over recommended voltage" EN_I2C_LO_FAULT_1_8V|0x0807B801|SAHPI_CRITICAL|OVR_SEV,OVR_VMM|"System is under recommended voltage for 1.8V CPU" EN_I2C_LO_FAULT_1_8V|0x0807B801|SAHPI_CRITICAL|OVR_SEV,OVR_VMM|"Chassis 1.8V under recommended voltage" # System 2.5 Volt Sensor EN_I2C_HI_FAULT_2_5V|0x08031481|SAHPI_CRITICAL|OVR_SEV,OVR_VMM|"System over recommended voltage on +2.5v" EN_I2C_HI_FAULT_2_5V|0x08031481|SAHPI_CRITICAL|OVR_SEV,OVR_VMM|"Chassis 2.5V over recommended voltage" EN_I2C_LO_FAULT_2_5V|0x08031881|SAHPI_CRITICAL|OVR_SEV,OVR_VMM|"System under recommended voltage on +2.5v" EN_I2C_LO_FAULT_2_5V|0x08031881|SAHPI_CRITICAL|OVR_SEV,OVR_VMM|"Chassis 2.5V under recommended voltage" # System 3.3 Volt Sensor EN_I2C_HI_FAULT_3_35V|0x08033481|SAHPI_CRITICAL|OVR_SEV,OVR_VMM|"System over recommended voltage on +3.3v" EN_I2C_HI_FAULT_3_35V|0x08033481|SAHPI_CRITICAL|OVR_SEV,OVR_VMM|"Chassis 3.3V over recommended voltage" EN_I2C_LO_FAULT_3_35V|0xFF000000|SAHPI_CRITICAL|OVR_SEV,OVR_VMM|"System under recommended voltage on +3.3v" EN_I2C_LO_FAULT_3_35V|0xFF000000|SAHPI_CRITICAL|OVR_SEV,OVR_VMM|"Chassis 3.3V under recommended voltage" # System 5 Volt Sensor EN_I2C_HI_FAULT_PLANAR_5V|0xFF000001|SAHPI_CRITICAL|OVR_SEV,OVR_VMM|"System over recommended voltage for +5v" EN_I2C_HI_FAULT_PLANAR_5V|0xFF000001|SAHPI_CRITICAL|OVR_SEV,OVR_VMM|"Chassis 5V over recommended voltage" EN_I2C_LO_FAULT_PLANAR_5V|0x06035801|SAHPI_CRITICAL|OVR_SEV,OVR_VMM|"System under recommended voltage for +5v" EN_I2C_LO_FAULT_PLANAR_5V|0x06035801|SAHPI_CRITICAL|OVR_SEV,OVR_VMM|"Chassis 5V under recommended voltage" # System -5 Volt Sensor EN_I2C_HI_FAULT_N5V|0x0803D501|SAHPI_CRITICAL|OVR_SEV,OVR_VMM|"System over recommended voltage for -5v" EN_I2C_HI_FAULT_N5V|0x0803D501|SAHPI_CRITICAL|OVR_SEV,OVR_VMM|"Chassis -5V over recommended voltage" EN_I2C_LO_FAULT_N5V|0x0803D801|SAHPI_CRITICAL|OVR_SEV,OVR_VMM|"System under recommended voltage for -5v" EN_I2C_LO_FAULT_N5V|0x0803D801|SAHPI_CRITICAL|OVR_SEV,OVR_VMM|"Chassis -5V under recommended voltage" # System 12 Volt Sensor EN_I2C_HI_FAULT_12V_PLANAR|0x06037503|SAHPI_CRITICAL|OVR_SEV,OVR_VMM|"System over recommended voltage for +12v" EN_I2C_HI_FAULT_12V_PLANAR|0x06037503|SAHPI_CRITICAL|OVR_SEV,OVR_VMM|"Chassis 12V over recommended voltage" EN_I2C_LO_FAULT_12V_PLANAR|0x06037801|SAHPI_CRITICAL|OVR_SEV,OVR_VMM|"System under recommended voltage for +12v" EN_I2C_LO_FAULT_12V_PLANAR|0x06037801|SAHPI_CRITICAL|OVR_SEV,OVR_VMM|"Chassis 12V under recommended voltage" ##################### # Physical MM Sensors ##################### # MM Operational Status Sensor #### Mapped to Off-line Operational State EN_OTHER_I2C|0x00222000|SAHPI_CRITICAL|OVR_SEV,OVR_MM_STBY|"Standby MM failure on system management bus, check devices" EN_STCONN_FAIL_OTHERMM|0x0002201E|SAHPI_CRITICAL|OVR_SEV,OVR_MM_STBY|"Connectivity status alternate MM communication failed" #### Mapped to Degraded Operational State EN_STBIST_FAIL_R_BOOT_ROM|0x0002201B|SAHPI_MAJOR|OVR_SEV,OVR_MM_STBY|"BIST standby MM bootrom failed" EN_STBIST_FAIL_R_CORE_1|0x00022052|SAHPI_MAJOR|OVR_SEV,OVR_MM_STBY|"BIST standby MM primary core Failed" EN_STBIST_FAIL_R_CORE_2|0x00022053|SAHPI_MAJOR|OVR_SEV,OVR_MM_STBY|"BIST standby MM backup core Failed" EN_STBIST_FAIL_R_CPLD|0x00022019|SAHPI_MAJOR|OVR_SEV,OVR_MM_STBY|"BIST standby MM internal I/O expander failed" EN_STBIST_FAIL_R_ENET_PORT|0x0002201C|SAHPI_MAJOR|OVR_SEV,OVR_MM_STBY|"BIST standby MM ethernet port 0 failed" EN_STBIST_FAIL_R_ENET_SWITCH|0x0002201D|SAHPI_MAJOR|OVR_SEV,OVR_MM_STBY|"BIST standby MM internal ethernet switch failed" EN_STBIST_FAIL_R_I2C|0x00022016|SAHPI_MAJOR|OVR_SEV,OVR_MM_STBY|"BIST standby MM local management bus failed" EN_STBIST_FAIL_R_PRI_FS|0x00022017|SAHPI_MAJOR|OVR_SEV,OVR_MM_STBY|"BIST standby MM primary file system failed" EN_STBIST_FAIL_R_RTC|0x00022015|SAHPI_MAJOR|OVR_SEV,OVR_MM_STBY|"BIST standby MM realtime clock failed" EN_STBIST_FAIL_R_SEC_FS|0x00022018|SAHPI_MAJOR|OVR_SEV,OVR_MM_STBY|"BIST standby MM secondary file system failed" EN_FAULT_OC_USB_HUB|0x00014034|SAHPI_MAJOR|OVR_SEV,OVR_MM_PRIME|"USB hub over-current failure" EN_FAULT_OC_USB_PORT|0x00014033|SAHPI_MAJOR|OVR_SEV,OVR_MM_PRIME|"USB port over-current failure" EN_STBIST_FAIL_ADC|0x0002200B|SAHPI_MAJOR|OVR_SEV,OVR_MM_PRIME|"BIST primary MM video capture failed" EN_STBIST_FAIL_BOOT_ROM|0x00022007|SAHPI_MAJOR|OVR_SEV,OVR_MM_PRIME|"BIST primary MM bootrom failed" EN_STBIST_FAIL_CORE_1|0x00022058|SAHPI_MAJOR|OVR_SEV,OVR_MM_PRIME|"BIST primary MM primary core failed" EN_STBIST_FAIL_CORE_2|0x00022059|SAHPI_MAJOR|OVR_SEV,OVR_MM_PRIME|"BIST primary MM backup core failed" EN_STBIST_FAIL_CPLD|0x0002205A|SAHPI_CRITICAL|OVR_SEV,OVR_MM_PRIME|"BIST primary MM internal I/O expander failed" EN_STBIST_FAIL_ENET_PORT|0x00022008|SAHPI_MAJOR|OVR_SEV,OVR_MM_PRIME|"BIST primary MM ethernet port 0 failed" EN_STBIST_FAIL_ENET_SWITCH|0x0002200A|SAHPI_CRITICAL|OVR_SEV,OVR_MM_PRIME|"BIST primary MM internal ethernet switch failed" EN_STBIST_FAIL_I2C|0x00022004|SAHPI_CRITICAL|OVR_SEV,OVR_MM_PRIME|"BIST primary MM local management bus failed" EN_STBIST_FAIL_I2C_DEVICE|0x00022009|SAHPI_CRITICAL|OVR_SEV,OVR_MM_PRIME|"BIST primary MM external management bus failed" EN_STBIST_FAIL_PRI_FS|0x00022005|SAHPI_MAJOR|OVR_SEV,OVR_MM_PRIME|"BIST primary MM primary file system failed" EN_STBIST_FAIL_R485_1|0x00022001|SAHPI_CRITICAL|OVR_SEV,OVR_MM_PRIME|"BIST blade management bus 1 failed" EN_STBIST_FAIL_R485_2|0x00022002|SAHPI_CRITICAL|OVR_SEV,OVR_MM_PRIME|"BIST blade management bus 2 failed" EN_STBIST_FAIL_RPSERV|0x00022013|SAHPI_MAJOR|OVR_SEV,OVR_MM_PRIME|"BIST primary MM remote control firmware failed" EN_STBIST_FAIL_RTC|0x00022003|SAHPI_MAJOR|OVR_SEV,OVR_MM_PRIME|"BIST primary MM realtime clock failed" EN_STBIST_FAIL_SEC_FS|0x00022006|SAHPI_MAJOR|OVR_SEV,OVR_MM_PRIME|"BIST primary MM secondary file system failed" EN_STBIST_FAIL_USB_1|0x00022011|SAHPI_MAJOR|OVR_SEV,OVR_MM_PRIME|"BIST primary MM USB keyboard/mouse emulation failed" EN_STBIST_FAIL_USB_2|0x00022012|SAHPI_MAJOR|OVR_SEV,OVR_MM_PRIME|"BIST primary MM USB mass storage emulation failed" EN_STBIST_FAIL_USB_I2C_1|0x00022054|SAHPI_MAJOR|OVR_SEV,OVR_MM_PRIME|"BIST primary MM USB keyboard/mouse firmware failed" EN_STBIST_FAIL_USB_I2C_2|0x00022055|SAHPI_MAJOR|OVR_SEV,OVR_MM_PRIME|"BIST primary MM USB mass storage firmware failed" EN_SYSTEM_BATTERY_FAILURE|0x06000000|SAHPI_INFORMATIONAL|OVR_SEV,OVR_MM_PRIME|"The real time clock battery in the MM needs service" #### Mapped to Install Error Operational State EN_MM_MISMATCHED|0x00282005|SAHPI_CRITICAL|OVR_SEV,OVR_MM_PRIME|"Configuration of mismatched management modules is not supported" ################ # Blade Resource ################ EN_BLADE_1_INSTALLED|0x0E002001|SAHPI_INFORMATIONAL|OVR_SEV,OVR_RID|"Blade Server 1 was installed" EN_BLADE_1_INSTALLED|0x0E002001|SAHPI_INFORMATIONAL|OVR_SEV,OVR_RID|"Blade 1 installed" EN_BLADE_2_INSTALLED|0x0E002002|SAHPI_INFORMATIONAL|OVR_SEV,OVR_RID|"Blade Server 2 was installed" EN_BLADE_2_INSTALLED|0x0E002002|SAHPI_INFORMATIONAL|OVR_SEV,OVR_RID|"Blade 2 installed" EN_BLADE_3_INSTALLED|0x0E002003|SAHPI_INFORMATIONAL|OVR_SEV,OVR_RID|"Blade Server 3 was installed" EN_BLADE_3_INSTALLED|0x0E002003|SAHPI_INFORMATIONAL|OVR_SEV,OVR_RID|"Blade 3 installed" EN_BLADE_4_INSTALLED|0x0E002004|SAHPI_INFORMATIONAL|OVR_SEV,OVR_RID|"Blade Server 4 was installed" EN_BLADE_4_INSTALLED|0x0E002004|SAHPI_INFORMATIONAL|OVR_SEV,OVR_RID|"Blade 4 installed" EN_BLADE_5_INSTALLED|0x0E002005|SAHPI_INFORMATIONAL|OVR_SEV,OVR_RID|"Blade Server 5 was installed" EN_BLADE_5_INSTALLED|0x0E002005|SAHPI_INFORMATIONAL|OVR_SEV,OVR_RID|"Blade 5 installed" EN_BLADE_6_INSTALLED|0x0E002006|SAHPI_INFORMATIONAL|OVR_SEV,OVR_RID|"Blade Server 6 was installed" EN_BLADE_6_INSTALLED|0x0E002006|SAHPI_INFORMATIONAL|OVR_SEV,OVR_RID|"Blade 6 installed" EN_BLADE_7_INSTALLED|0x0E002007|SAHPI_INFORMATIONAL|OVR_SEV,OVR_RID|"Blade Server 7 was installed" EN_BLADE_7_INSTALLED|0x0E002007|SAHPI_INFORMATIONAL|OVR_SEV,OVR_RID|"Blade 7 installed" EN_BLADE_8_INSTALLED|0x0E002008|SAHPI_INFORMATIONAL|OVR_SEV,OVR_RID|"Blade Server 8 was installed" EN_BLADE_8_INSTALLED|0x0E002008|SAHPI_INFORMATIONAL|OVR_SEV,OVR_RID|"Blade 8 installed" EN_BLADE_9_INSTALLED|0x0E002009|SAHPI_INFORMATIONAL|OVR_SEV,OVR_RID|"Blade Server 9 was installed" EN_BLADE_9_INSTALLED|0x0E002009|SAHPI_INFORMATIONAL|OVR_SEV,OVR_RID|"Blade 9 installed" EN_BLADE_A_INSTALLED|0x0E00200A|SAHPI_INFORMATIONAL|OVR_SEV,OVR_RID|"Blade Server 10 was installed" EN_BLADE_A_INSTALLED|0x0E00200A|SAHPI_INFORMATIONAL|OVR_SEV,OVR_RID|"Blade 10 installed" EN_BLADE_B_INSTALLED|0x0E00200B|SAHPI_INFORMATIONAL|OVR_SEV,OVR_RID|"Blade Server 11 was installed" EN_BLADE_B_INSTALLED|0x0E00200B|SAHPI_INFORMATIONAL|OVR_SEV,OVR_RID|"Blade 11 installed" EN_BLADE_C_INSTALLED|0x0E00200C|SAHPI_INFORMATIONAL|OVR_SEV,OVR_RID|"Blade Server 12 was installed" EN_BLADE_C_INSTALLED|0x0E00200C|SAHPI_INFORMATIONAL|OVR_SEV,OVR_RID|"Blade 12 installed" EN_BLADE_D_INSTALLED|0x0E00200D|SAHPI_INFORMATIONAL|OVR_SEV,OVR_RID|"Blade Server 13 was installed" EN_BLADE_D_INSTALLED|0x0E00200D|SAHPI_INFORMATIONAL|OVR_SEV,OVR_RID|"Blade 13 installed" EN_BLADE_E_INSTALLED|0x0E00200E|SAHPI_INFORMATIONAL|OVR_SEV,OVR_RID|"Blade Server 14 was installed" EN_BLADE_E_INSTALLED|0x0E00200E|SAHPI_INFORMATIONAL|OVR_SEV,OVR_RID|"Blade 14 installed" EN_BLADE_1_REMOVED|0x0E004001|SAHPI_INFORMATIONAL|OVR_SEV,OVR_RID|"Blade Server 1 was removed" EN_BLADE_1_REMOVED|0x0E004001|SAHPI_INFORMATIONAL|OVR_SEV,OVR_RID|"Blade 1 removed" EN_BLADE_2_REMOVED|0x0E004002|SAHPI_INFORMATIONAL|OVR_SEV,OVR_RID|"Blade Server 2 was removed" EN_BLADE_2_REMOVED|0x0E004002|SAHPI_INFORMATIONAL|OVR_SEV,OVR_RID|"Blade 2 removed" EN_BLADE_3_REMOVED|0x0E004003|SAHPI_INFORMATIONAL|OVR_SEV,OVR_RID|"Blade Server 3 was removed" EN_BLADE_3_REMOVED|0x0E004003|SAHPI_INFORMATIONAL|OVR_SEV,OVR_RID|"Blade 3 removed" EN_BLADE_4_REMOVED|0x0E004004|SAHPI_INFORMATIONAL|OVR_SEV,OVR_RID|"Blade Server 4 was removed" EN_BLADE_4_REMOVED|0x0E004004|SAHPI_INFORMATIONAL|OVR_SEV,OVR_RID|"Blade 4 removed" EN_BLADE_5_REMOVED|0x0E004005|SAHPI_INFORMATIONAL|OVR_SEV,OVR_RID|"Blade Server 5 was removed" EN_BLADE_5_REMOVED|0x0E004005|SAHPI_INFORMATIONAL|OVR_SEV,OVR_RID|"Blade 5 removed" EN_BLADE_6_REMOVED|0x0E004006|SAHPI_INFORMATIONAL|OVR_SEV,OVR_RID|"Blade Server 6 was removed" EN_BLADE_6_REMOVED|0x0E004006|SAHPI_INFORMATIONAL|OVR_SEV,OVR_RID|"Blade 6 removed" EN_BLADE_7_REMOVED|0x0E004007|SAHPI_INFORMATIONAL|OVR_SEV,OVR_RID|"Blade Server 7 was removed" EN_BLADE_7_REMOVED|0x0E004007|SAHPI_INFORMATIONAL|OVR_SEV,OVR_RID|"Blade 7 removed" EN_BLADE_8_REMOVED|0x0E004008|SAHPI_INFORMATIONAL|OVR_SEV,OVR_RID|"Blade Server 8 was removed" EN_BLADE_8_REMOVED|0x0E004008|SAHPI_INFORMATIONAL|OVR_SEV,OVR_RID|"Blade 8 removed" EN_BLADE_9_REMOVED|0x0E004009|SAHPI_INFORMATIONAL|OVR_SEV,OVR_RID|"Blade Server 9 was removed" EN_BLADE_9_REMOVED|0x0E004009|SAHPI_INFORMATIONAL|OVR_SEV,OVR_RID|"Blade 9 removed" EN_BLADE_A_REMOVED|0x0E00400A|SAHPI_INFORMATIONAL|OVR_SEV,OVR_RID|"Blade Server 10 was removed" EN_BLADE_A_REMOVED|0x0E00400A|SAHPI_INFORMATIONAL|OVR_SEV,OVR_RID|"Blade 10 removed" EN_BLADE_B_REMOVED|0x0E00400B|SAHPI_INFORMATIONAL|OVR_SEV,OVR_RID|"Blade Server 11 was removed" EN_BLADE_B_REMOVED|0x0E00400B|SAHPI_INFORMATIONAL|OVR_SEV,OVR_RID|"Blade 11 removed" EN_BLADE_C_REMOVED|0x0E00400C|SAHPI_INFORMATIONAL|OVR_SEV,OVR_RID|"Blade Server 12 was removed" EN_BLADE_C_REMOVED|0x0E00400C|SAHPI_INFORMATIONAL|OVR_SEV,OVR_RID|"Blade 12 removed" EN_BLADE_D_REMOVED|0x0E00400D|SAHPI_INFORMATIONAL|OVR_SEV,OVR_RID|"Blade Server 13 was removed" EN_BLADE_D_REMOVED|0x0E00400D|SAHPI_INFORMATIONAL|OVR_SEV,OVR_RID|"Blade 13 removed" EN_BLADE_E_REMOVED|0x0E00400E|SAHPI_INFORMATIONAL|OVR_SEV,OVR_RID|"Blade Server 14 was removed" EN_BLADE_E_REMOVED|0x0E00400E|SAHPI_INFORMATIONAL|OVR_SEV,OVR_RID|"Blade 14 removed" EN_BLADE_PWR_DWN|0x1C000001|SAHPI_INFORMATIONAL|OVR_SEV|"Blade Server Powered Down" EN_BLADE_PWR_DWN|0x1C000001|SAHPI_INFORMATIONAL|OVR_SEV|"Blade powered off" EN_BLADE_PWR_UP|0x1C000002|SAHPI_INFORMATIONAL|OVR_SEV|"Blade Server Powered Up" EN_BLADE_PWR_UP|0x1C000002|SAHPI_INFORMATIONAL|OVR_SEV|"Blade powered on" EN_BLADE_PWR_DN_FAN_FAIL|0x06026080|SAHPI_INFORMATIONAL|OVR_SEV|"Critical Blower Failure, Blade Server Powering Down" EN_BLADE_PWR_DN_FAN_FAIL|0x06026080|SAHPI_INFORMATIONAL|OVR_SEV|"Critical blower failure, blade powered off" EN_BLADE_PWR_DN_PM_TEMP|0x0821C080|SAHPI_INFORMATIONAL|OVR_SEV|"Power Modules are over temperature, Blade Server Powering Down" EN_BLADE_PWR_DN_PM_TEMP|0x0821C080|SAHPI_INFORMATIONAL|OVR_SEV|"Blade powered off due to Power Modules over temperature" ############### # Blade Sensors ############### # Blade CPU 1 Temperature Sensor EN_PROC_HOT_CPU1|0x0421C401|SAHPI_CRITICAL|OVR_SEV|"CPU 1 shut off due to over temperature" EN_CUTOFF_HI_OVER_TEMP_CPU1|0x0421C481|SAHPI_CRITICAL|OVR_SEV|"System shutoff due to CPU 1 over temperature" EN_CUTOFF_HI_OVER_TEMP_CPU1|0x0421C481|SAHPI_CRITICAL|OVR_SEV|"CPU 1 temperature fault" EN_THERM_TRIP_CPU1|0x0421D081|SAHPI_CRITICAL|OVR_SEV|"CPU 1 Over Temperature" EN_THERM_TRIP_CPU1|0x0421D081|SAHPI_CRITICAL|OVR_SEV|"CPU 1 over temperature" EN_PFA_HI_OVER_TEMP_CPU1|0x0421D501|SAHPI_MAJOR|OVR_SEV|"System over temperature for CPU 1" EN_PFA_HI_OVER_TEMP_CPU1|0x0421D501|SAHPI_MAJOR|OVR_SEV|"CPU 1 over recommended temperature" EN_GENERIC_HI_CRIT_TEMP|0xFFFFFF1C|SAHPI_CRITICAL|OVR_SEV|"processor 1 (CPU 1 Temp) over critical temperature" EN_GENERIC_HI_CRIT_TEMP|0xFFFFFF1C|SAHPI_CRITICAL|OVR_SEV|"processor 1 (CPU1 TEMP) over critical temperature" EN_GENERIC_HI_WARN_TEMP|0xFFFFFF1D|SAHPI_MAJOR|OVR_SEV|"processor 1 (CPU 1 Temp) over recommended temperature" EN_GENERIC_HI_WARN_TEMP|0xFFFFFF1D|SAHPI_MAJOR|OVR_SEV|"processor 1 (CPU 1 TEMP) over recommended temperature" # Blade CPU 2 Temperature Sensor EN_PROC_HOT_CPU2|0x0421C402|SAHPI_CRITICAL|OVR_SEV|"CPU 2 shut off due to over temperature" EN_CUTOFF_HI_OVER_TEMP_CPU2|0x0421C482|SAHPI_CRITICAL|OVR_SEV|"System shutoff due to CPU 2 over temperature" EN_CUTOFF_HI_OVER_TEMP_CPU2|0x0421C482|SAHPI_CRITICAL|OVR_SEV|"CPU 2 temperature fault" EN_THERM_TRIP_CPU2|0x0421D082|SAHPI_CRITICAL|OVR_SEV|"CPU 2 Over Temperature" EN_THERM_TRIP_CPU2|0x0421D082|SAHPI_CRITICAL|OVR_SEV|"CPU 2 over temperature" EN_PFA_HI_OVER_TEMP_CPU2|0x0421D502|SAHPI_MAJOR|OVR_SEV|"System over temperature for CPU 2" EN_PFA_HI_OVER_TEMP_CPU2|0x0421D502|SAHPI_MAJOR|OVR_SEV|"CPU 2 over recommended temperature" EN_GENERIC_HI_CRIT_TEMP|0xFFFFFF20|SAHPI_CRITICAL|OVR_SEV|"processor 2 (CPU 2 Temp) over critical temperature" EN_GENERIC_HI_CRIT_TEMP|0xFFFFFF20|SAHPI_CRITICAL|OVR_SEV|"processor 2 (CPU2 TEMP) over critical temperature" EN_GENERIC_HI_WARN_TEMP|0xFFFFFF21|SAHPI_MAJOR|OVR_SEV|"processor 2 (CPU 2 Temp) over recommended temperature" EN_GENERIC_HI_WARN_TEMP|0xFFFFFF21|SAHPI_MAJOR|OVR_SEV|"processor 2 (CPU 2 TEMP) over recommended temperature" # Blade CPU 3 Temperature Sensor EN_PROC_HOT_CPU3|0x0421C403|SAHPI_CRITICAL|OVR_SEV|"CPU 3 shut off due to over temperature" EN_CUTOFF_HI_OVER_TEMP_CPU3|0x0421C483|SAHPI_CRITICAL|OVR_SEV|"System shutoff due to CPU 3 over temperature" EN_CUTOFF_HI_OVER_TEMP_CPU3|0x0421C483|SAHPI_CRITICAL|OVR_SEV|"CPU 3 temperature fault" EN_THERM_TRIP_CPU3|0x0421D083|SAHPI_CRITICAL|OVR_SEV|"CPU 3 Over Temperature" EN_THERM_TRIP_CPU3|0x0421D083|SAHPI_CRITICAL|OVR_SEV|"CPU 3 over temperature" EN_PFA_HI_OVER_TEMP_CPU3|0x0421D503|SAHPI_MAJOR|OVR_SEV|"System over temperature for CPU 3" EN_PFA_HI_OVER_TEMP_CPU3|0x0421D503|SAHPI_MAJOR|OVR_SEV|"CPU 3 over recommended temperature" EN_GENERIC_HI_CRIT_TEMP|0xFFFFFF22|SAHPI_CRITICAL|OVR_SEV|"processor 3 (CPU 3 Temp) over critical temperature" EN_GENERIC_HI_CRIT_TEMP|0xFFFFFF22|SAHPI_CRITICAL|OVR_SEV|"processor 3 (CPU3 TEMP) over critical temperature" EN_GENERIC_HI_WARN_TEMP|0xFFFFFF23|SAHPI_MAJOR|OVR_SEV|"processor 3 (CPU 3 Temp) over recommended temperature" EN_GENERIC_HI_WARN_TEMP|0xFFFFFF23|SAHPI_MAJOR|OVR_SEV|"processor 3 (CPU 3 TEMP) over recommended temperature" # Blade CPU 4 Temperature Sensor EN_PROC_HOT_CPU4|0x0421C404|SAHPI_CRITICAL|OVR_SEV|"CPU 4 shut off due to over temperature" EN_CUTOFF_HI_OVER_TEMP_CPU4|0x0421C484|SAHPI_CRITICAL|OVR_SEV|"System shutoff due to CPU 4 over temperature" EN_CUTOFF_HI_OVER_TEMP_CPU4|0x0421C484|SAHPI_CRITICAL|OVR_SEV|"CPU 4 temperature fault" EN_THERM_TRIP_CPU4|0x0421D084|SAHPI_CRITICAL|OVR_SEV|"CPU 4 Over Temperature" EN_THERM_TRIP_CPU4|0x0421D084|SAHPI_CRITICAL|OVR_SEV|"CPU 4 over temperature" EN_PFA_HI_OVER_TEMP_CPU4|0x0421D504|SAHPI_MAJOR|OVR_SEV|"System over temperature for CPU 4" EN_PFA_HI_OVER_TEMP_CPU4|0x0421D504|SAHPI_MAJOR|OVR_SEV|"CPU 4 over recommended temperature" EN_GENERIC_HI_CRIT_TEMP|0xFFFFFF24|SAHPI_CRITICAL|OVR_SEV|"processor 4 (CPU 4 Temp) over critical temperature" EN_GENERIC_HI_CRIT_TEMP|0xFFFFFF24|SAHPI_CRITICAL|OVR_SEV|"processor 4 (CPU4 TEMP) over critical temperature" EN_GENERIC_HI_WARN_TEMP|0xFFFFFF25|SAHPI_MAJOR|OVR_SEV|"processor 4 (CPU 4 Temp) over recommended temperature" EN_GENERIC_HI_WARN_TEMP|0xFFFFFF25|SAHPI_MAJOR|OVR_SEV|"processor 4 (CPU 4 TEMP) over recommended temperature" # Blade Memory Bank 1 Temperature Sensor EN_GENERIC_HI_CRIT_TEMP|0xFFFFFF14|SAHPI_CRITICAL|OVR_SEV|"memory bank 1 (BANK1 TEMP) over critical temperature" EN_GENERIC_HI_CRIT_TEMP|0xFFFFFF14|SAHPI_CRITICAL|OVR_SEV|"memory bank 1 (BANK 1 Temp) over critical temperature" EN_GENERIC_HI_WARN_TEMP|0xFFFFFF15|SAHPI_MAJOR|OVR_SEV|"memory bank 1 (BANK1 TEMP) over recommended temperature" EN_GENERIC_HI_WARN_TEMP|0xFFFFFF15|SAHPI_MAJOR|OVR_SEV|"memory bank 1 (BANK 1 Temp) over recommended temperature" # Blade Memory Bank 2 Temperature Sensor EN_GENERIC_HI_CRIT_TEMP|0xFFFFFF16|SAHPI_CRITICAL|OVR_SEV|"memory bank 2 (BANK2 TEMP) over critical temperature" EN_GENERIC_HI_CRIT_TEMP|0xFFFFFF16|SAHPI_CRITICAL|OVR_SEV|"memory bank 2 (BANK 2 Temp) over critical temperature" EN_GENERIC_HI_WARN_TEMP|0xFFFFFF17|SAHPI_MAJOR|OVR_SEV|"memory bank 2 (BANK2 TEMP) over recommended temperature" EN_GENERIC_HI_WARN_TEMP|0xFFFFFF17|SAHPI_MAJOR|OVR_SEV|"memory bank 2 (BANK 2 Temp) over recommended temperature" # Blade Memory Bank 3 Temperature Sensor EN_GENERIC_HI_CRIT_TEMP|0xFFFFFF18|SAHPI_CRITICAL|OVR_SEV|"memory bank 3 (BANK3 TEMP) over critical temperature" EN_GENERIC_HI_CRIT_TEMP|0xFFFFFF18|SAHPI_CRITICAL|OVR_SEV|"memory bank 3 (BANK 3 Temp) over critical temperature" EN_GENERIC_HI_WARN_TEMP|0xFFFFFF19|SAHPI_MAJOR|OVR_SEV|"memory bank 3 (BANK3 TEMP) over recommended temperature" EN_GENERIC_HI_WARN_TEMP|0xFFFFFF19|SAHPI_MAJOR|OVR_SEV|"memory bank 3 (BANK 3 Temp) over recommended temperature" # Blade Memory Bank 4 Temperature Sensor EN_GENERIC_HI_CRIT_TEMP|0xFFFFFF1A|SAHPI_CRITICAL|OVR_SEV|"memory bank 4 (BANK4 TEMP) over critical temperature" EN_GENERIC_HI_CRIT_TEMP|0xFFFFFF1A|SAHPI_CRITICAL|OVR_SEV|"memory bank 4 (BANK 4 Temp) over critical temperature" EN_GENERIC_HI_WARN_TEMP|0xFFFFFF1B|SAHPI_MAJOR|OVR_SEV|"memory bank 4 (BANK4 TEMP) over recommended temperature" EN_GENERIC_HI_WARN_TEMP|0xFFFFFF1B|SAHPI_MAJOR|OVR_SEV|"memory bank 4 (BANK 4 Temp) over recommended temperature" # Blade 0.9 Volt Sensor EN_GENERIC_UPPER_WARN_VOLT|0xFFFFFFF1|SAHPI_MAJOR|OVR_SEV|"system board 1 (Planar 0.9V) over recommended voltage" EN_GENERIC_LOWER_WARN_VOLT|0xFFFFFFF2|SAHPI_MAJOR|OVR_SEV|"system board 1 (Planar 0.9V) under recommended voltage" # Blade 1.2 Volt Sensor EN_PFA_HI_FAULT_1_2V|0x08001401|SAHPI_MAJOR|OVR_SEV|"System over recommended voltage on +1.2v" EN_PFA_HI_FAULT_1_2V|0x08001401|SAHPI_MAJOR|OVR_SEV|"Blade 1.2V over recommended voltage" EN_PFA_LO_FAULT_1_2V|0x08001801|SAHPI_MAJOR|OVR_SEV|"System under recommended voltage on +1.2v" EN_PFA_LO_FAULT_1_2V|0x08001801|SAHPI_MAJOR|OVR_SEV|"Blade 1.2V under recommended voltage" # Blade Standby 1.2 Volt Sensor EN_1_2VS_WARNING_HI|0x0A00BC02|SAHPI_MAJOR|OVR_SEV|"Standby +1.2V over recommended voltage" EN_1_2VS_WARNING_HI|0x0A00BC02|SAHPI_MAJOR|OVR_SEV|"1.2V standby over recommended voltage" EN_1_2VS_WARNING_LOW|0x0A00AC02|SAHPI_MAJOR|OVR_SEV|"Standby +1.2V under recommended voltage" EN_1_2VS_WARNING_LOW|0x0A00AC02|SAHPI_MAJOR|OVR_SEV|"1.2V standby under recommended voltage" # Blade 1.25 Volt Sensor EN_PFA_HI_FAULT_1_25V|0x08001400|SAHPI_MAJOR|OVR_SEV|"System over recommended voltage on +1.25v" EN_PFA_HI_FAULT_1_25V|0x08001400|SAHPI_MAJOR|OVR_SEV|"Blade 1.25V over recommended voltage" EN_PFA_LO_FAULT_1_25V|0x08001800|SAHPI_MAJOR|OVR_SEV|"System under recommended voltage on +1.25v" EN_PFA_LO_FAULT_1_25V|0x08001800|SAHPI_MAJOR|OVR_SEV|"Blade 1.25V under recommended voltage" # Blade 1.5 Volt Sensor EN_IO_1_5V_WARNING_HI|0x0A041C00|SAHPI_MAJOR|OVR_SEV|"IO Board +1.5V over recommended voltage" EN_IO_1_5V_WARNING_HI|0x0A041C00|SAHPI_MAJOR|OVR_SEV|"I/O board 1.5V over recommended voltage" EN_IO_1_5V_WARNING_LOW|0x0A040C00|SAHPI_MAJOR|OVR_SEV|"IO Board +1.5V under recommended voltage" EN_IO_1_5V_WARNING_LOW|0x0A040C00|SAHPI_MAJOR|OVR_SEV|"I/O board 1.5V under recommended voltage" EN_PFA_HI_FAULT_1_5V|0x08041400|SAHPI_MAJOR|OVR_SEV|"System over recommended voltage on +1.5v" EN_PFA_HI_FAULT_1_5V|0x08041400|SAHPI_MAJOR|OVR_SEV|"Blade 1.5V over recommended voltage" EN_PFA_LO_FAULT_1_5V|0x08041800|SAHPI_MAJOR|OVR_SEV|"System under recommended voltage on +1.5v" EN_PFA_LO_FAULT_1_5V|0x08041800|SAHPI_MAJOR|OVR_SEV|"Blade 1.5V under recommended voltage" # Blade Standby 1.5 Volt Sensor EN_1_5VS_WARNING_HI|0x0A041C02|SAHPI_MAJOR|OVR_SEV|"Standby +1.5V over recommended voltage" EN_1_5VS_WARNING_HI|0x0A041C02|SAHPI_MAJOR|OVR_SEV|"1.5V standby over recommended voltage" EN_1_5VS_WARNING_LOW|0x0A040C02|SAHPI_MAJOR|OVR_SEV|"Standby +1.5V under recommended voltage" EN_1_5VS_WARNING_LOW|0x0A040C02|SAHPI_MAJOR|OVR_SEV|"1.5V standby under recommended voltage" # Blade 1.8 Volt Sensor EN_PFA_HI_FAULT_1_8V|0x0807B400|SAHPI_MAJOR|OVR_SEV|"System is over recommended voltage for 1.8V CPU" EN_PFA_HI_FAULT_1_8V|0x0807B400|SAHPI_MAJOR|OVR_SEV|"Blade 1.8V over recommended voltage" EN_PFA_LO_FAULT_1_8V|0x0807B800|SAHPI_MAJOR|OVR_SEV|"System is under recommended voltage for 1.8V CPU" EN_PFA_LO_FAULT_1_8V|0x0807B800|SAHPI_MAJOR|OVR_SEV|"Blade 1.8V under recommended voltage" # Blade Standby 1.8 Volt Sensor EN_1_8VS_WARNING_HI|0x0A07BC02|SAHPI_MAJOR|OVR_SEV|"1.8V standby over recommended voltage" EN_1_8VS_WARNING_LOW|0x0A07AC02|SAHPI_MAJOR|OVR_SEV|"1.8V standby under recommended voltage" # Blade 2.5 Volt Sensor EN_IO_2_5V_WARNING_HI|0x0A031C00|SAHPI_MAJOR|OVR_SEV|"IO Board +2.5V over recommended voltage" EN_IO_2_5V_WARNING_HI|0x0A031C00|SAHPI_MAJOR|OVR_SEV|"I/O board 2.5V over recommended voltage" EN_IO_2_5V_WARNING_LOW|0x0A030C00|SAHPI_MAJOR|OVR_SEV|"IO Board 2.5V under recommended voltage" EN_IO_2_5V_WARNING_LOW|0x0A030C00|SAHPI_MAJOR|OVR_SEV|"I/O board 2.5V under recommended voltage" EN_PFA_HI_FAULT_2_5V|0x08031480|SAHPI_MAJOR|OVR_SEV|"System over recommended voltage on +2.5v" EN_PFA_HI_FAULT_2_5V|0x08031480|SAHPI_MAJOR|OVR_SEV|"Blade 2.5V over recommended voltage" EN_PFA_LO_FAULT_2_5V|0x08031880|SAHPI_MAJOR|OVR_SEV|"System under recommended voltage on +2.5v" EN_PFA_LO_FAULT_2_5V|0x08031880|SAHPI_MAJOR|OVR_SEV|"Blade 2.5V under recommended voltage" # Blade Standby 2.5 Volt Sensor EN_2_5VS_WARNING_HI|0x0A031C02|SAHPI_MAJOR|OVR_SEV|"Standby +2.5V over recommended voltage" EN_2_5VS_WARNING_HI|0x0A031C02|SAHPI_MAJOR|OVR_SEV|"2.5V standby over recommended voltage" EN_2_5VS_WARNING_LOW|0x0A030C02|SAHPI_MAJOR|OVR_SEV|"Standby +2.5V under recommended voltage" EN_2_5VS_WARNING_LOW|0x0A030C02|SAHPI_MAJOR|OVR_SEV|"2.5V standby under recommended voltage" # Blade 3.3 Volt Sensor EN_IO_3_3V_WARNING_HI|0x0A02DC00|SAHPI_MAJOR|OVR_SEV|"IO Board +3.3V over recommended voltage" EN_IO_3_3V_WARNING_HI|0x0A02DC00|SAHPI_MAJOR|OVR_SEV|"I/O board 3.3V over recommended voltage" EN_IO_3_3V_WARNING_LOW|0x0A02CC00|SAHPI_MAJOR|OVR_SEV|"IO Board +3.3V under recommended voltage" EN_IO_3_3V_WARNING_LOW|0x0A02CC00|SAHPI_MAJOR|OVR_SEV|"I/O board 3.3V under recommended voltage" EN_PFA_HI_FAULT_3_35V|0x08033480|SAHPI_MAJOR|OVR_SEV|"System over recommended voltage on +3.3v" EN_PFA_HI_FAULT_3_35V|0x08033480|SAHPI_MAJOR|OVR_SEV|"Blade 3.3V over recommended voltage" EN_MAJOR_LO_FAULT_3_35V|0xFF032900|SAHPI_MAJOR|OVR_SEV|"System under recommended voltage on +3.3v" EN_GENERIC_UPPER_WARN_VOLT|0xFFFFFFF3|SAHPI_MAJOR|OVR_SEV|"system board 1 (Planar 3.3V) over recommended voltage" EN_GENERIC_UPPER_WARN_VOLT|0xFFFFFFF3|SAHPI_MAJOR|OVR_SEV|"system board 1 (3.3V Sense) over recommended voltage" EN_GENERIC_LOWER_WARN_VOLT|0xFFFFFFF4|SAHPI_MAJOR|OVR_SEV|"system board 1 (Planar 3.3V) under recommended voltage" EN_GENERIC_LOWER_WARN_VOLT|0xFFFFFFF4|SAHPI_MAJOR|OVR_SEV|"system board 1 (3.3V Sense) under recommended voltage" # Blade Standby 3.3 Volt Sensor EN_3_3VS_WARNING_HI|0x0A02DC02|SAHPI_MAJOR|OVR_SEV|"Standby +3.3V over recommended voltage" EN_3_3VS_WARNING_HI|0x0A02DC02|SAHPI_MAJOR|OVR_SEV|"3.3V standby over recommended voltage" EN_3_3VS_WARNING_LOW|0x0A02CC02|SAHPI_MAJOR|OVR_SEV|"Standby +3.3V under recommended voltage" EN_3_3VS_WARNING_LOW|0x0A02CC02|SAHPI_MAJOR|OVR_SEV|"3.3V standby under recommended voltage" # Blade 5 Volt Sensor EN_IO_5V_WARNING_HI|0x0A035C00|SAHPI_MAJOR|OVR_SEV|"IO Board +5V over recommended voltage" EN_IO_5V_WARNING_HI|0x0A035C00|SAHPI_MAJOR|OVR_SEV|"I/O board 5V over recommended voltage" EN_IO_5V_WARNING_LOW|0x0A034C00|SAHPI_MAJOR|OVR_SEV|"IO Board +5V under recommended voltage" EN_IO_5V_WARNING_LOW|0x0A034C00|SAHPI_MAJOR|OVR_SEV|"I/O board 5V under recommended voltage" EN_PFA_HI_FAULT_5V|0x08035500|SAHPI_MAJOR|OVR_SEV|"System over recommended 5V Fault" EN_PFA_HI_FAULT_5V|0x08035500|SAHPI_MAJOR|OVR_SEV|"Blade 5V over fault" EN_PFA_HI_FAULT_5V|0x08035500|SAHPI_MAJOR|OVR_SEV|"Blade 5V over recommended voltage" EN_PFA_LO_FAULT_5V|0x08035800|SAHPI_MAJOR|OVR_SEV|"System under recommended 5V Fault" EN_PFA_LO_FAULT_5V|0x08035800|SAHPI_MAJOR|OVR_SEV|"Blade 5V under recommended voltage" EN_GENERIC_UPPER_WARN_VOLT|0xFFFFFFF5|SAHPI_MAJOR|OVR_SEV|"system board 1 (Planar 5V) over recommended voltage" EN_GENERIC_UPPER_WARN_VOLT|0xFFFFFFF5|SAHPI_MAJOR|OVR_SEV|"system board 2 (5V Sense) over recommended voltage" EN_GENERIC_UPPER_WARN_VOLT|0xFFFFFFF5|SAHPI_MAJOR|OVR_SEV|"system board 1 (5V Sense) over recommended voltage" EN_GENERIC_LOWER_WARN_VOLT|0xFFFFFFF6|SAHPI_MAJOR|OVR_SEV|"system board 1 (Planar 5V) under recommended voltage" EN_GENERIC_LOWER_WARN_VOLT|0xFFFFFFF6|SAHPI_MAJOR|OVR_SEV|"system board 2 (5V Sense) under recommended voltage" EN_GENERIC_LOWER_WARN_VOLT|0xFFFFFFF6|SAHPI_MAJOR|OVR_SEV|"system board 1 (5V Sense) under recommended voltage" # Blade Standby 5 Volt Sensor EN_5VS_WARNING_HI|0x0A035C02|SAHPI_MAJOR|OVR_SEV|"Standby +5V over recommended voltage" EN_5VS_WARNING_HI|0x0A035C02|SAHPI_MAJOR|OVR_SEV|"5V standby over recommended voltage" EN_5VS_WARNING_LOW|0x0A034C02|SAHPI_MAJOR|OVR_SEV|"Standby +5V under recommended voltage" EN_5VS_WARNING_LOW|0x0A034C02|SAHPI_MAJOR|OVR_SEV|"5V standby under recommended voltage" # Blade -5 Volt Sensor EN_PFA_HI_FAULT_N5V|0x0803D500|SAHPI_MAJOR|OVR_SEV|"Blade -5V over voltage fault" EN_PFA_HI_FAULT_N5V|0x0803D500|SAHPI_MAJOR|OVR_SEV|"Blade -5V over recommended voltage" EN_PFA_LO_FAULT_N5V|0x0803D800|SAHPI_MAJOR|OVR_SEV|"Blade -5V under recommended voltage" # Blade 12 Volt Sensor EN_IO_12V_WARNING_HI|0x0A037C00|SAHPI_MAJOR|OVR_SEV|"IO Board +12V over recommended voltage" EN_IO_12V_WARNING_HI|0x0A037C00|SAHPI_MAJOR|OVR_SEV|"I/O board 12V over recommended voltage" EN_IO_12V_WARNING_LOW|0x0A036C00|SAHPI_MAJOR|OVR_SEV|"IO Board +12V under recommended voltage" EN_IO_12V_WARNING_LOW|0x0A036C00|SAHPI_MAJOR|OVR_SEV|"I/O board 12V under recommended voltage" EN_PFA_HI_FAULT_12V_PLANAR|0x06037500|SAHPI_MAJOR|OVR_SEV|"System over recommended voltage for +12v" EN_PFA_HI_FAULT_12V_PLANAR|0x06037500|SAHPI_MAJOR|OVR_SEV|"Blade 12V over recommended voltage" EN_PFA_LO_FAULT_12V_PLANAR|0x06037800|SAHPI_MAJOR|OVR_SEV|"System under recommended voltage for +12v" EN_PFA_LO_FAULT_12V_PLANAR|0x06037800|SAHPI_MAJOR|OVR_SEV|"Blade 12V under recommended voltage" EN_GENERIC_UPPER_WARN_VOLT|0xFFFFFFF7|SAHPI_MAJOR|OVR_SEV|"system board 1 (Planar 12V) over recommended voltage" EN_GENERIC_UPPER_WARN_VOLT|0xFFFFFFF7|SAHPI_MAJOR|OVR_SEV|"system board 3 (12V Sense) over recommended voltage" EN_GENERIC_UPPER_WARN_VOLT|0xFFFFFFF7|SAHPI_MAJOR|OVR_SEV|"system board 1 (12V Sense) over recommended voltage" EN_GENERIC_LOWER_WARN_VOLT|0xFFFFFFF8|SAHPI_MAJOR|OVR_SEV|"system board 1 (Planar 12V) under recommended voltage" EN_GENERIC_LOWER_WARN_VOLT|0xFFFFFFF8|SAHPI_MAJOR|OVR_SEV|"system board 3 (12V Sense) under recommended voltage" EN_GENERIC_LOWER_WARN_VOLT|0xFFFFFFF8|SAHPI_MAJOR|OVR_SEV|"system board 1 (12V Sense) under recommended voltage" # Blade Standby 12 Volt Sensor EN_12VS_WARNING_HI|0x0A037C02|SAHPI_MAJOR|OVR_SEV|"Standby +12V over recommended voltage" EN_12VS_WARNING_HI|0x0A037C02|SAHPI_MAJOR|OVR_SEV|"12V standby over recommended voltage" EN_12VS_WARNING_LOW|0x0A036C02|SAHPI_MAJOR|OVR_SEV|"Standby +12V under recommended voltage" EN_12VS_WARNING_LOW|0x0A036C02|SAHPI_MAJOR|OVR_SEV|"12V standby under recommended voltage" # Blade VRM Volt Sensor EN_PFA_HI_FAULT_VRM1|0x04401501|SAHPI_MAJOR|OVR_SEV|"System is over recommended voltage on VRM 1" EN_PFA_LO_FAULT_VRM1|0x04401801|SAHPI_MAJOR|OVR_SEV|"System is under recommended voltage on VRM 1" EN_PFA_HI_FAULT_VRM2|0x04401502|SAHPI_MAJOR|OVR_SEV|"System is over recommended voltage on VRM 2" EN_PFA_LO_FAULT_VRM2|0x04401802|SAHPI_MAJOR|OVR_SEV|"System is under recommended voltage on VRM 2" # Blade CPU 1 Core Voltage Sensor EN_GENERIC_UPPER_WARN_VOLT|0xFFFFFFF9|SAHPI_MAJOR|OVR_SEV|"processor 1 (CPU 1 VCore) over recommended voltage" EN_GENERIC_LOWER_WARN_VOLT|0xFFFFFFFA|SAHPI_MAJOR|OVR_SEV|"processor 1 (CPU 1 VCore) under recommended voltage" # Blade CPU 2 Core Voltage Sensor EN_GENERIC_UPPER_WARN_VOLT|0xFFFFFFFB|SAHPI_MAJOR|OVR_SEV|"processor 2 (CPU 2 VCore) over recommended voltage" EN_GENERIC_LOWER_WARN_VOLT|0xFFFFFFFC|SAHPI_MAJOR|OVR_SEV|"processor 2 (CPU 2 VCore) under recommended voltage" # Blade CPU 3 Core Voltage Sensor EN_GENERIC_UPPER_WARN_VOLT|0xFFFFFFFD|SAHPI_MAJOR|OVR_SEV|"processor 3 (CPU 3 VCore) over recommended voltage" EN_GENERIC_LOWER_WARN_VOLT|0xFFFFFFFE|SAHPI_MAJOR|OVR_SEV|"processor 3 (CPU 3 VCore) under recommended voltage" # Blade CPU 4 Core Voltage Sensor EN_GENERIC_UPPER_WARN_VOLT|0xFFFFFF10|SAHPI_MAJOR|OVR_SEV|"processor 4 (CPU 4 VCore) over recommended voltage" EN_GENERIC_LOWER_WARN_VOLT|0xFFFFFF11|SAHPI_MAJOR|OVR_SEV|"processor 4 (CPU 4 VCore) under recommended voltage" # Blade Battery Voltage Sensor EN_GENERIC_UPPER_WARN_VOLT|0xFFFFFF12|SAHPI_MAJOR|OVR_SEV|"battery 1 (Planar VBAT) over recommended voltage" EN_GENERIC_UPPER_WARN_VOLT|0xFFFFFF12|SAHPI_MAJOR|OVR_SEV|"battery 1 (VBATT Sense) over recommended voltage" EN_GENERIC_LOWER_WARN_VOLT|0xFFFFFF13|SAHPI_MAJOR|OVR_SEV|"battery 1 (Planar VBAT) under recommended voltage" EN_GENERIC_LOWER_WARN_VOLT|0xFFFFFF13|SAHPI_MAJOR|OVR_SEV|"battery 1 (VBATT Sense) under recommended voltage" # Blade Operational Status Sensor #### Mapped to Off-line Operational State EN_BLADE_1_INSUFFICIENT_PWR|0x0E00A001|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"Blade 1 is not allowed to power on because of insufficient power" EN_BLADE_1_INSUFFICIENT_PWR|0x0E00A001|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"Blade 1 not allowed to power on due to insufficient power" EN_BLADE_2_INSUFFICIENT_PWR|0x0E00A002|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"Blade 2 is not allowed to power on because of insufficient power" EN_BLADE_2_INSUFFICIENT_PWR|0x0E00A002|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"Blade 2 not allowed to power on due to insufficient power" EN_BLADE_3_INSUFFICIENT_PWR|0x0E00A003|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"Blade 3 is not allowed to power on because of insufficient power" EN_BLADE_3_INSUFFICIENT_PWR|0x0E00A003|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"Blade 3 not allowed to power on due to insufficient power" EN_BLADE_4_INSUFFICIENT_PWR|0x0E00A004|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"Blade 4 is not allowed to power on because of insufficient power" EN_BLADE_4_INSUFFICIENT_PWR|0x0E00A004|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"Blade 4 not allowed to power on due to insufficient power" EN_BLADE_5_INSUFFICIENT_PWR|0x0E00A005|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"Blade 5 is not allowed to power on because of insufficient power" EN_BLADE_5_INSUFFICIENT_PWR|0x0E00A005|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"Blade 5 not allowed to power on due to insufficient power" EN_BLADE_6_INSUFFICIENT_PWR|0x0E00A006|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"Blade 6 is not allowed to power on because of insufficient power" EN_BLADE_6_INSUFFICIENT_PWR|0x0E00A006|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"Blade 6 not allowed to power on due to insufficient power" EN_BLADE_7_INSUFFICIENT_PWR|0x0E00A007|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"Blade 7 is not allowed to power on because of insufficient power" EN_BLADE_7_INSUFFICIENT_PWR|0x0E00A007|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"Blade 7 not allowed to power on due to insufficient power" EN_BLADE_8_INSUFFICIENT_PWR|0x0E00A008|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"Blade 8 is not allowed to power on because of insufficient power" EN_BLADE_8_INSUFFICIENT_PWR|0x0E00A008|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"Blade 8 not allowed to power on due to insufficient power" EN_BLADE_9_INSUFFICIENT_PWR|0x0E00A009|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"Blade 9 is not allowed to power on because of insufficient power" EN_BLADE_9_INSUFFICIENT_PWR|0x0E00A009|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"Blade 9 not allowed to power on due to insufficient power" EN_BLADE_10_INSUFFICIENT_PWR|0x0E00A00A|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"Blade 10 is not allowed to power on because of insufficient power" EN_BLADE_10_INSUFFICIENT_PWR|0x0E00A00A|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"Blade 10 not allowed to power on due to insufficient power" EN_BLADE_11_INSUFFICIENT_PWR|0x0E00A00B|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"Blade 11 is not allowed to power on because of insufficient power" EN_BLADE_11_INSUFFICIENT_PWR|0x0E00A00B|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"Blade 11 not allowed to power on due to insufficient power" EN_BLADE_12_INSUFFICIENT_PWR|0x0E00A00C|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"Blade 12 is not allowed to power on because of insufficient power" EN_BLADE_12_INSUFFICIENT_PWR|0x0E00A00C|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"Blade 12 not allowed to power on due to insufficient power" EN_BLADE_13_INSUFFICIENT_PWR|0x0E00A00D|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"Blade 13 is not allowed to power on because of insufficient power" EN_BLADE_13_INSUFFICIENT_PWR|0x0E00A00D|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"Blade 13 not allowed to power on due to insufficient power" EN_BLADE_14_INSUFFICIENT_PWR|0x0E00A00E|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"Blade 14 is not allowed to power on because of insufficient power" EN_BLADE_14_INSUFFICIENT_PWR|0x0E00A00E|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"Blade 14 not allowed to power on due to insufficient power" EN_BLADE_1_SHUTDOWN_OVER_PWR_BUDGET|0x0F00C001|SAHPI_MAJOR|OVR_SEV,OVR_RID|"Blade 1 not allowed to power on; constrained by power budget" EN_BLADE_2_SHUTDOWN_OVER_PWR_BUDGET|0x0F00C002|SAHPI_MAJOR|OVR_SEV,OVR_RID|"Blade 2 not allowed to power on; constrained by power budget" EN_BLADE_3_SHUTDOWN_OVER_PWR_BUDGET|0x0F00C003|SAHPI_MAJOR|OVR_SEV,OVR_RID|"Blade 3 not allowed to power on; constrained by power budget" EN_BLADE_4_SHUTDOWN_OVER_PWR_BUDGET|0x0F00C004|SAHPI_MAJOR|OVR_SEV,OVR_RID|"Blade 4 not allowed to power on; constrained by power budget" EN_BLADE_5_SHUTDOWN_OVER_PWR_BUDGET|0x0F00C005|SAHPI_MAJOR|OVR_SEV,OVR_RID|"Blade 5 not allowed to power on; constrained by power budget" EN_BLADE_6_SHUTDOWN_OVER_PWR_BUDGET|0x0F00C006|SAHPI_MAJOR|OVR_SEV,OVR_RID|"Blade 6 not allowed to power on; constrained by power budget" EN_BLADE_7_SHUTDOWN_OVER_PWR_BUDGET|0x0F00C007|SAHPI_MAJOR|OVR_SEV,OVR_RID|"Blade 7 not allowed to power on; constrained by power budget" EN_BLADE_8_SHUTDOWN_OVER_PWR_BUDGET|0x0F00C008|SAHPI_MAJOR|OVR_SEV,OVR_RID|"Blade 8 not allowed to power on; constrained by power budget" EN_BLADE_9_SHUTDOWN_OVER_PWR_BUDGET|0x0F00C009|SAHPI_MAJOR|OVR_SEV,OVR_RID|"Blade 9 not allowed to power on; constrained by power budget" EN_BLADE_10_SHUTDOWN_OVER_PWR_BUDGET|0x0F00C00A|SAHPI_MAJOR|OVR_SEV,OVR_RID|"Blade 10 not allowed to power on; constrained by power budget" EN_BLADE_11_SHUTDOWN_OVER_PWR_BUDGET|0x0F00C00B|SAHPI_MAJOR|OVR_SEV,OVR_RID|"Blade 11 not allowed to power on; constrained by power budget" EN_BLADE_12_SHUTDOWN_OVER_PWR_BUDGET|0x0F00C00C|SAHPI_MAJOR|OVR_SEV,OVR_RID|"Blade 12 not allowed to power on; constrained by power budget" EN_BLADE_13_SHUTDOWN_OVER_PWR_BUDGET|0x0F00C00D|SAHPI_MAJOR|OVR_SEV,OVR_RID|"Blade 13 not allowed to power on; constrained by power budget" EN_BLADE_14_SHUTDOWN_OVER_PWR_BUDGET|0x0F00C00E|SAHPI_MAJOR|OVR_SEV,OVR_RID|"Blade 14 not allowed to power on; constrained by power budget" EN_BLADE_1_UNIDENTIABLE_HW_DENY_POWER|0x0E012001|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"Power denied to blade 1 because it has unidentified hardware" EN_BLADE_2_UNIDENTIABLE_HW_DENY_POWER|0x0E012002|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"Power denied to blade 2 because it has unidentified hardware" EN_BLADE_3_UNIDENTIABLE_HW_DENY_POWER|0x0E012003|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"Power denied to blade 3 because it has unidentified hardware" EN_BLADE_4_UNIDENTIABLE_HW_DENY_POWER|0x0E012004|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"Power denied to blade 4 because it has unidentified hardware" EN_BLADE_5_UNIDENTIABLE_HW_DENY_POWER|0x0E012005|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"Power denied to blade 5 because it has unidentified hardware" EN_BLADE_6_UNIDENTIABLE_HW_DENY_POWER|0x0E012006|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"Power denied to blade 6 because it has unidentified hardware" EN_BLADE_7_UNIDENTIABLE_HW_DENY_POWER|0x0E012007|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"Power denied to blade 7 because it has unidentified hardware" EN_BLADE_8_UNIDENTIABLE_HW_DENY_POWER|0x0E012008|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"Power denied to blade 8 because it has unidentified hardware" EN_BLADE_9_UNIDENTIABLE_HW_DENY_POWER|0x0E012009|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"Power denied to blade 9 because it has unidentified hardware" EN_BLADE_10_UNIDENTIABLE_HW_DENY_POWER|0x0E01200A|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"Power denied to blade 10 because it has unidentified hardware" EN_BLADE_11_UNIDENTIABLE_HW_DENY_POWER|0x0E01200B|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"Power denied to blade 11 because it has unidentified hardware" EN_BLADE_12_UNIDENTIABLE_HW_DENY_POWER|0x0E01200C|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"Power denied to blade 12 because it has unidentified hardware" EN_BLADE_13_UNIDENTIABLE_HW_DENY_POWER|0x0E01200D|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"Power denied to blade 13 because it has unidentified hardware" EN_BLADE_14_UNIDENTIABLE_HW_DENY_POWER|0x0E01200E|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"Power denied to blade 14 because it has unidentified hardware" EN_CPU_BD_POWER_FAULT|0x0401A000|SAHPI_CRITICAL|OVR_SEV|"CPU Board power fault" EN_CPU_BD_POWER_FAULT|0x0401A000|SAHPI_CRITICAL|OVR_SEV|"Blade power fault" EN_CPU_BD_POWER_FAULT|0x0401A000|SAHPI_CRITICAL|OVR_SEV|"Planar power fault" EN_CPU_BD_VOLTAGE_FAULT|0x04018000|SAHPI_CRITICAL|OVR_SEV|"CPU Board voltage fault" EN_CPU_BD_VOLTAGE_FAULT|0x04018000|SAHPI_CRITICAL|OVR_SEV|"Blade voltage fault" EN_CPU_INVALID_CONFIG|0x0401E000|SAHPI_CRITICAL|OVR_SEV|"Invalid CPU configuration" EN_IERR_CPU1|0x04300201|SAHPI_CRITICAL|OVR_SEV|"CPU 1 internal fault" EN_IERR_CPU2|0x04300202|SAHPI_CRITICAL|OVR_SEV|"CPU 2 internal fault" EN_IERR_CPU3|0x04300203|SAHPI_CRITICAL|OVR_SEV|"CPU 3 internal fault" EN_IERR_CPU4|0x04300204|SAHPI_CRITICAL|OVR_SEV|"CPU 4 internal fault" EN_OVER_TEMP_CPU1|0x0421C081|SAHPI_CRITICAL|OVR_SEV|"CPU 1 over temperature" EN_OVER_TEMP_CPU2|0x0421C082|SAHPI_CRITICAL|OVR_SEV|"CPU 2 over temperature" EN_OVER_TEMP_CPU3|0x0421C083|SAHPI_CRITICAL|OVR_SEV|"CPU 3 over temperature" EN_OVER_TEMP_CPU4|0x0421C084|SAHPI_CRITICAL|OVR_SEV|"CPU 4 over temperature" EN_DASD|0x00000069|SAHPI_CRITICAL|OVR_SEV|"DASD backplane Failure" EN_IO_BD_FAULT|0x06016000|SAHPI_CRITICAL|OVR_SEV|"I/O Board fault" EN_IO_BD_POWER_FAULT|0x0601A000|SAHPI_CRITICAL|OVR_SEV|"IO Board power fault" EN_IO_BD_POWER_FAULT|0x0601A000|SAHPI_CRITICAL|OVR_SEV|"I/O board power fault" EN_IO_BD_VOLTAGE_FAULT|0x06018000|SAHPI_CRITICAL|OVR_SEV|"IO Board voltage fault" EN_IO_BD_VOLTAGE_FAULT|0x06018000|SAHPI_CRITICAL|OVR_SEV|"I/O board voltage fault" EN_FAULT_POWER_GOOD|0x00028000|SAHPI_CRITICAL|OVR_SEV|"Power Good Fault" EN_FAULT_SYS_POWER_GOOD|0x00028001|SAHPI_CRITICAL|OVR_SEV|"System Power Good Fault" #EN_FAULT_SYS_POWER_GOOD|0x00028001|SAHPI_CRITICAL|OVR_SEV|"Blade power fault" EN_FAULT_VRM_POWER_GOOD|0x04428000|SAHPI_CRITICAL|OVR_SEV|"VRM Power Good Fault" EN_FAULT_VRM_POWER_GOOD|0x04428000|SAHPI_CRITICAL|OVR_SEV|"Voltage regulator fault" EN_FAULT_VRM_POWER_GOOD_1|0x04428001|SAHPI_CRITICAL|OVR_SEV|"CPU voltage regulator 1 fault" EN_FAULT_VRM_POWER_GOOD_2|0x04428002|SAHPI_CRITICAL|OVR_SEV|"CPU voltage regulator 2 fault" EN_FAULT_VRM_POWER_GOOD_3|0x04428003|SAHPI_CRITICAL|OVR_SEV|"CPU voltage regulator 3 fault" EN_FAULT_VRM_POWER_GOOD_4|0x04428004|SAHPI_CRITICAL|OVR_SEV|"CPU voltage regulator 4 fault" EN_AUTO_BIOS_ALERT|0x04000000|SAHPI_MAJOR|OVR_SEV|"Firmware (BIOS) ROM corruption detected" EN_HSDC_FAULT|0x0D01E000|SAHPI_CRITICAL|OVR_SEV|"High speed expansion card fault" EN_IPMI_SM_INIT_FAIL|0x00216030|SAHPI_CRITICAL|OVR_SEV|"Firmware (BIOS) halted, System Management Bus error" EN_IPMI_SYS_BOARD_FAIL|0x0021601C|SAHPI_CRITICAL|OVR_SEV|"Firmware (BIOS) backup ROM corruption. System board failure" EN_IPMI_PCI_BUS_TIMEOUT|0x0021603E|SAHPI_CRITICAL|OVR_SEV|"PCI bus timeout: system error" EN_IPMI_BIOS_HALTED_UNSPEC|0x0021603F|SAHPI_CRITICAL|OVR_SEV|"Firmware (BIOS) halted, unspecified error" EN_PWR_CONTROLLER_TIMEOUT|0x08016080|SAHPI_CRITICAL|OVR_SEV|"Power controller timeout" EN_MEMORY_FAIL|0x05200000|SAHPI_CRITICAL|OVR_SEV|"System Memory Error" EN_MEMORY_FAIL|0x05200000|SAHPI_CRITICAL|OVR_SEV|"Blade memory fault" EN_UNCORRECT_DIMM_1_ERR|0x0A000281|SAHPI_CRITICAL|OVR_SEV|"Uncorrectable DIMM 1 memory error" EN_UNCORRECT_DIMM_2_ERR|0x0A000282|SAHPI_CRITICAL|OVR_SEV|"Uncorrectable DIMM 2 memory error" EN_UNCORRECT_DIMM_3_ERR|0x0A000283|SAHPI_CRITICAL|OVR_SEV|"Uncorrectable DIMM 3 memory error" EN_UNCORRECT_DIMM_4_ERR|0x0A000284|SAHPI_CRITICAL|OVR_SEV|"Uncorrectable DIMM 4 memory error" EN_UNCORRECT_DIMM_5_ERR|0x0A000285|SAHPI_CRITICAL|OVR_SEV|"Uncorrectable DIMM 5 memory error" EN_UNCORRECT_DIMM_6_ERR|0x0A000286|SAHPI_CRITICAL|OVR_SEV|"Uncorrectable DIMM 6 memory error" EN_UNCORRECT_DIMM_7_ERR|0x0A000287|SAHPI_CRITICAL|OVR_SEV|"Uncorrectable DIMM 7 memory error" EN_UNCORRECT_DIMM_8_ERR|0x0A000288|SAHPI_CRITICAL|OVR_SEV|"Uncorrectable DIMM 8 memory error" EN_IPMI_UNCORRECT_BUS_ERR|0x00216012|SAHPI_CRITICAL|OVR_SEV|"Uncorrectable memory/system bus error" EN_IPMI_DIMM_ERR|0x00216003|SAHPI_CRITICAL|OVR_SEV|"DIMM error" EN_IPMI_DIMM_ERR|0x00216003|SAHPI_CRITICAL|OVR_SEV|"DIMM failed: DIMM number unknown" EN_MEM_MOD_BUS_UNCORR_ERR|0x06C16000|SAHPI_CRITICAL|OVR_SEV|"Memory module bus fault" #### Mapped to Degraded Operational State EN_BLADE_1_NO_PWR_VPD|0x0E00E001|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"Can not read power-on VPD for blade 1" EN_BLADE_1_NO_PWR_VPD|0x0E00E001|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"Blade 1 VPD cannot be read" EN_BLADE_2_NO_PWR_VPD|0x0E00E002|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"Can not read power-on VPD for blade 2" EN_BLADE_2_NO_PWR_VPD|0x0E00E002|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"Blade 2 VPD cannot be read" EN_BLADE_3_NO_PWR_VPD|0x0E00E003|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"Can not read power-on VPD for blade 3" EN_BLADE_3_NO_PWR_VPD|0x0E00E003|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"Blade 3 VPD cannot be read" EN_BLADE_4_NO_PWR_VPD|0x0E00E004|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"Can not read power-on VPD for blade 4" EN_BLADE_4_NO_PWR_VPD|0x0E00E004|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"Blade 4 VPD cannot be read" EN_BLADE_5_NO_PWR_VPD|0x0E00E005|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"Can not read power-on VPD for blade 5" EN_BLADE_5_NO_PWR_VPD|0x0E00E005|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"Blade 5 VPD cannot be read" EN_BLADE_6_NO_PWR_VPD|0x0E00E006|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"Can not read power-on VPD for blade 6" EN_BLADE_6_NO_PWR_VPD|0x0E00E006|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"Blade 6 VPD cannot be read" EN_BLADE_7_NO_PWR_VPD|0x0E00E007|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"Can not read power-on VPD for blade 7" EN_BLADE_7_NO_PWR_VPD|0x0E00E007|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"Blade 7 VPD cannot be read" EN_BLADE_8_NO_PWR_VPD|0x0E00E008|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"Can not read power-on VPD for blade 8" EN_BLADE_8_NO_PWR_VPD|0x0E00E008|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"Blade 8 VPD cannot be read" EN_BLADE_9_NO_PWR_VPD|0x0E00E009|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"Can not read power-on VPD for blade 9" EN_BLADE_9_NO_PWR_VPD|0x0E00E009|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"Blade 9 VPD cannot be read" EN_BLADE_A_NO_PWR_VPD|0x0E00E00A|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"Can not read power-on VPD for blade 10" EN_BLADE_A_NO_PWR_VPD|0x0E00E00A|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"Blade 10 VPD cannot be read" EN_BLADE_B_NO_PWR_VPD|0x0E00E00B|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"Can not read power-on VPD for blade 11" EN_BLADE_B_NO_PWR_VPD|0x0E00E00B|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"Blade 11 VPD cannot be read" EN_BLADE_C_NO_PWR_VPD|0x0E00E00C|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"Can not read power-on VPD for blade 12" EN_BLADE_C_NO_PWR_VPD|0x0E00E00C|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"Blade 12 VPD cannot be read" EN_BLADE_D_NO_PWR_VPD|0x0E00E00D|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"Can not read power-on VPD for blade 13" EN_BLADE_D_NO_PWR_VPD|0x0E00E00D|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"Blade 13 VPD cannot be read" EN_BLADE_E_NO_PWR_VPD|0x0E00E00E|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"Can not read power-on VPD for blade 14" EN_BLADE_E_NO_PWR_VPD|0x0E00E00E|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"Blade 14 VPD cannot be read" EN_BLADE_1_NO_MGT_VPD|0x0E010001|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"Can not read VPD for blade 1 management" EN_BLADE_2_NO_MGT_VPD|0x0E010002|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"Can not read VPD for blade 2 management" EN_BLADE_3_NO_MGT_VPD|0x0E010003|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"Can not read VPD for blade 3 management" EN_BLADE_4_NO_MGT_VPD|0x0E010004|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"Can not read VPD for blade 4 management" EN_BLADE_5_NO_MGT_VPD|0x0E010005|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"Can not read VPD for blade 5 management" EN_BLADE_6_NO_MGT_VPD|0x0E010006|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"Can not read VPD for blade 6 management" EN_BLADE_7_NO_MGT_VPD|0x0E010007|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"Can not read VPD for blade 7 management" EN_BLADE_8_NO_MGT_VPD|0x0E010008|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"Can not read VPD for blade 8 management" EN_BLADE_9_NO_MGT_VPD|0x0E010009|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"Can not read VPD for blade 9 management" EN_BLADE_A_NO_MGT_VPD|0x0E01000A|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"Can not read VPD for blade 10 management" EN_BLADE_B_NO_MGT_VPD|0x0E01000B|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"Can not read VPD for blade 11 management" EN_BLADE_C_NO_MGT_VPD|0x0E01000C|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"Can not read VPD for blade 12 management" EN_BLADE_D_NO_MGT_VPD|0x0E01000D|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"Can not read VPD for blade 13 management" EN_BLADE_E_NO_MGT_VPD|0x0E01000E|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"Can not read VPD for blade 14 management" # If this error occurs while blade is up, blade continues to operate; if this error occurs # on power up/restart blade is not allowed to power on EN_BLADE_1_COMM_FAIL|0x0E008001|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"SP Communications Failure on Blade 1" EN_BLADE_1_COMM_FAIL|0x0E008001|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"Blade 1 is not responding on the management bus" EN_BLADE_2_COMM_FAIL|0x0E008002|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"SP Communications Failure on Blade 2" EN_BLADE_2_COMM_FAIL|0x0E008002|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"Blade 2 is not responding on the management bus" EN_BLADE_3_COMM_FAIL|0x0E008003|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"SP Communications Failure on Blade 3" EN_BLADE_3_COMM_FAIL|0x0E008003|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"Blade 3 is not responding on the management bus" EN_BLADE_4_COMM_FAIL|0x0E008004|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"SP Communications Failure on Blade 4" EN_BLADE_4_COMM_FAIL|0x0E008004|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"Blade 4 is not responding on the management bus" EN_BLADE_5_COMM_FAIL|0x0E008005|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"SP Communications Failure on Blade 5" EN_BLADE_5_COMM_FAIL|0x0E008005|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"Blade 5 is not responding on the management bus" EN_BLADE_6_COMM_FAIL|0x0E008006|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"SP Communications Failure on Blade 6" EN_BLADE_6_COMM_FAIL|0x0E008006|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"Blade 6 is not responding on the management bus" EN_BLADE_7_COMM_FAIL|0x0E008007|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"SP Communications Failure on Blade 7" EN_BLADE_7_COMM_FAIL|0x0E008007|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"Blade 7 is not responding on the management bus" EN_BLADE_8_COMM_FAIL|0x0E008008|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"SP Communications Failure on Blade 8" EN_BLADE_8_COMM_FAIL|0x0E008008|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"Blade 8 is not responding on the management bus" EN_BLADE_9_COMM_FAIL|0x0E008009|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"SP Communications Failure on Blade 9" EN_BLADE_9_COMM_FAIL|0x0E008009|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"Blade 9 is not responding on the management bus" EN_BLADE_A_COMM_FAIL|0x0E00800A|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"SP Communications Failure on Blade 10" EN_BLADE_A_COMM_FAIL|0x0E00800A|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"Blade 10 is not responding on the management bus" EN_BLADE_B_COMM_FAIL|0x0E00800B|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"SP Communications Failure on Blade 11" EN_BLADE_B_COMM_FAIL|0x0E00800B|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"Blade 11 is not responding on the management bus" EN_BLADE_C_COMM_FAIL|0x0E00800C|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"SP Communications Failure on Blade 12" EN_BLADE_C_COMM_FAIL|0x0E00800C|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"Blade 12 is not responding on the management bus" EN_BLADE_D_COMM_FAIL|0x0E00800D|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"SP Communications Failure on Blade 13" EN_BLADE_D_COMM_FAIL|0x0E00800D|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"Blade 13 is not responding on the management bus" EN_BLADE_E_COMM_FAIL|0x0E00800E|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"SP Communications Failure on Blade 14" EN_BLADE_E_COMM_FAIL|0x0E00800E|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"Blade 14 is not responding on the management bus" EN_BLADE_1_THROTTLED|0x0E00C001|SAHPI_MINOR|OVR_SEV,OVR_RID|"Blade 1 is throttled" EN_BLADE_1_THROTTLED|0x0E00C001|SAHPI_MINOR|OVR_SEV,OVR_RID|"Blade 1 throttled" EN_BLADE_2_THROTTLED|0x0E00C002|SAHPI_MINOR|OVR_SEV,OVR_RID|"Blade 2 is throttled" EN_BLADE_2_THROTTLED|0x0E00C002|SAHPI_MINOR|OVR_SEV,OVR_RID|"Blade 2 throttled" EN_BLADE_3_THROTTLED|0x0E00C003|SAHPI_MINOR|OVR_SEV,OVR_RID|"Blade 3 is throttled" EN_BLADE_3_THROTTLED|0x0E00C003|SAHPI_MINOR|OVR_SEV,OVR_RID|"Blade 3 throttled" EN_BLADE_4_THROTTLED|0x0E00C004|SAHPI_MINOR|OVR_SEV,OVR_RID|"Blade 4 is throttled" EN_BLADE_4_THROTTLED|0x0E00C004|SAHPI_MINOR|OVR_SEV,OVR_RID|"Blade 4 throttled" EN_BLADE_5_THROTTLED|0x0E00C005|SAHPI_MINOR|OVR_SEV,OVR_RID|"Blade 5 is throttled" EN_BLADE_5_THROTTLED|0x0E00C005|SAHPI_MINOR|OVR_SEV,OVR_RID|"Blade 5 throttled" EN_BLADE_6_THROTTLED|0x0E00C006|SAHPI_MINOR|OVR_SEV,OVR_RID|"Blade 6 is throttled" EN_BLADE_6_THROTTLED|0x0E00C006|SAHPI_MINOR|OVR_SEV,OVR_RID|"Blade 6 throttled" EN_BLADE_7_THROTTLED|0x0E00C007|SAHPI_MINOR|OVR_SEV,OVR_RID|"Blade 7 is throttled" EN_BLADE_7_THROTTLED|0x0E00C007|SAHPI_MINOR|OVR_SEV,OVR_RID|"Blade 7 throttled" EN_BLADE_8_THROTTLED|0x0E00C008|SAHPI_MINOR|OVR_SEV,OVR_RID|"Blade 8 is throttled" EN_BLADE_8_THROTTLED|0x0E00C008|SAHPI_MINOR|OVR_SEV,OVR_RID|"Blade 8 throttled" EN_BLADE_9_THROTTLED|0x0E00C009|SAHPI_MINOR|OVR_SEV,OVR_RID|"Blade 9 is throttled" EN_BLADE_9_THROTTLED|0x0E00C009|SAHPI_MINOR|OVR_SEV,OVR_RID|"Blade 9 throttled" EN_BLADE_10_THROTTLED|0x0E00C00A|SAHPI_MINOR|OVR_SEV,OVR_RID|"Blade 10 is throttled" EN_BLADE_10_THROTTLED|0x0E00C00A|SAHPI_MINOR|OVR_SEV,OVR_RID|"Blade 10 throttled" EN_BLADE_11_THROTTLED|0x0E00C00B|SAHPI_MINOR|OVR_SEV,OVR_RID|"Blade 11 is throttled" EN_BLADE_11_THROTTLED|0x0E00C00B|SAHPI_MINOR|OVR_SEV,OVR_RID|"Blade 11 throttled" EN_BLADE_12_THROTTLED|0x0E00C00C|SAHPI_MINOR|OVR_SEV,OVR_RID|"Blade 12 is throttled" EN_BLADE_12_THROTTLED|0x0E00C00C|SAHPI_MINOR|OVR_SEV,OVR_RID|"Blade 12 throttled" EN_BLADE_13_THROTTLED|0x0E00C00D|SAHPI_MINOR|OVR_SEV,OVR_RID|"Blade 13 is throttled" EN_BLADE_13_THROTTLED|0x0E00C00D|SAHPI_MINOR|OVR_SEV,OVR_RID|"Blade 13 throttled" EN_BLADE_14_THROTTLED|0x0E00C00E|SAHPI_MINOR|OVR_SEV,OVR_RID|"Blade 14 is throttled" EN_BLADE_14_THROTTLED|0x0E00C00E|SAHPI_MINOR|OVR_SEV,OVR_RID|"Blade 14 throttled" EN_CKVM_FAULT|0x0A000000|SAHPI_MINOR|OVR_SEV|"cKVM card fault" EN_BOOT_FAIL|0x00000077|SAHPI_MAJOR|OVR_SEV|"System Boot Failed" EN_CPU_1_DISABLED|0x04204001|SAHPI_MAJOR|OVR_SEV|"CPU 1 disabled" EN_CPU_2_DISABLED|0x04204002|SAHPI_MAJOR|OVR_SEV|"CPU 2 disabled" EN_CPU_3_DISABLED|0x04204003|SAHPI_MAJOR|OVR_SEV|"CPU 3 disabled" EN_CPU_4_DISABLED|0x04204004|SAHPI_MAJOR|OVR_SEV|"CPU 4 disabled" EN_IERR_CPU_RESTART1|0x04306201|SAHPI_MAJOR|OVR_SEV|"CPU 1 halted" EN_IERR_CPU_RESTART2|0x04306202|SAHPI_MAJOR|OVR_SEV|"CPU 2 halted" EN_IERR_CPU_RESTART3|0x04306203|SAHPI_MAJOR|OVR_SEV|"CPU 3 halted" EN_IERR_CPU_RESTART4|0x04306204|SAHPI_MAJOR|OVR_SEV|"CPU 4 halted" EN_NC_VOLT|0x0000006F|SAHPI_MAJOR|OVR_SEV|"System over/under recommended voltage" EN_NC_VOLT|0x0000006F|SAHPI_MAJOR|OVR_SEV|"Blade voltage outside of recommended range" EN_FP_NP|0x09025000|SAHPI_MAJOR|OVR_SEV|"Front panel cable is not connected to system board" EN_CPU1_TEMP_WARN|0x0421D401|SAHPI_MAJOR|OVR_SEV|"CPU 1 temperature warning" EN_CPU2_TEMP_WARN|0x0421D402|SAHPI_MAJOR|OVR_SEV|"CPU 2 temperature warning" EN_PFA_HI_EXCEDED_CUR_12V_A_MAX|0x0801B402|SAHPI_MAJOR|OVR_SEV|"Blade 12V over recommended current" EN_FAULT_DASD1_HARD_DRIVE_0|0x06802000|SAHPI_CRITICAL|OVR_SEV|"Hard drive 0 fault" EN_FAULT_DASD1_HARD_DRIVE_1|0x06800001|SAHPI_CRITICAL|OVR_SEV|"Hard drive 1 fault" # 8839 side board voltage events but these cannot be read through SNMP EN_IO_1_8V_WARNING_HI|0x0A07BC00|SAHPI_MAJOR|OVR_SEV|"IO Board +1.8V over recommended voltage" EN_IO_1_8V_WARNING_HI|0x0A07BC00|SAHPI_MAJOR|OVR_SEV|"I/O board 1.8V over recommended voltage" EN_IO_1_8V_WARNING_LOW|0x0A07AC00|SAHPI_MAJOR|OVR_SEV|"IO Board +1.8V under recommended voltage" EN_IO_1_8V_WARNING_LOW|0x0A07AC00|SAHPI_MAJOR|OVR_SEV|"I/O board 1.8V under recommended voltage" EN_IO_2_5VS_WARNING_HI|0x0A031C01|SAHPI_MAJOR|OVR_SEV|"I/O board 2.5V standby over recommended voltage" EN_IO_2_5VS_WARNING_LOW|0x0A030C01|SAHPI_MAJOR|OVR_SEV|"I/O board 2.5V standby under recommended voltage" EN_IO_3_3VS_WARNING_HI|0x0A02DC01|SAHPI_MAJOR|OVR_SEV|"I/O board 3.3V standby over recommended voltage" EN_IO_3_3VS_WARNING_LOW|0x0A02CC01|SAHPI_MAJOR|OVR_SEV|"I/O board 3.3V standby under recommended voltage" EN_IO_12VS_WARNING_HI|0x0A037C01|SAHPI_MAJOR|OVR_SEV|"I/O board 12V standby over recommended voltage" EN_IO_12VS_WARNING_LOW|0x0A036C01|SAHPI_MAJOR|OVR_SEV|"I/O board 12V standby under recommended voltage" EN_IO_N5V_WARNING_HI|0x0A03DC00|SAHPI_MAJOR|OVR_SEV|"I/O board -5V over recommended voltage" EN_IO_N5V_WARNING_LOW|0x0A03CC00|SAHPI_MAJOR|OVR_SEV|"I/O board -5V under recommended voltage" # IPMI events EN_IPMI_CPU_SPEED_FAIL|0x00216025|SAHPI_MAJOR|OVR_SEV|"CPU speed failure" EN_IPMI_CPU_VOLT_MISMATCH|0x00216024|SAHPI_MAJOR|OVR_SEV|"CPU voltage mismatch" EN_IPMI_PROC_INIT_FAIL|0x0021603D|SAHPI_MAJOR|OVR_SEV|"Failure during processor initialization" EN_IPMI_SP2_INIT_FAIL|0x00216028|SAHPI_MAJOR|OVR_SEV|"Failure during secondary processor initialization" EN_IPMI_BOARD_INIT_FAIL|0x00216039|SAHPI_MAJOR|OVR_SEV|"Failure during board initialization" EN_IPMI_BOOT_MEDIA_MISSING|0x00216020|SAHPI_MAJOR|OVR_SEV|"Removable boot media missing" EN_IPMI_CACHE_INIT_FAIL|0x0021602F|SAHPI_MAJOR|OVR_SEV|"Failure during cache initialization" EN_IPMI_DISK_CTRL_FAIL|0x0021601E|SAHPI_MAJOR|OVR_SEV|"Hard disk controller failure" EN_IPMI_DRIVE_INIT_FAIL|0x00216027|SAHPI_MAJOR|OVR_SEV|"Failure during hard drive initialization" EN_IPMI_FW_ROM_CORRUPT|0x00216023|SAHPI_MAJOR|OVR_SEV|"Firmware ROM corruption" EN_IPMI_MEM_FAILED|0x0021601A|SAHPI_MAJOR|OVR_SEV|"All memory has failed" EN_IPMI_MEM_INIT_FAIL|0x00216026|SAHPI_MAJOR|OVR_SEV|"Failure during memory initialization" EN_IPMI_MGMT_CTRL_INIT_FAIL|0x00216032|SAHPI_MAJOR|OVR_SEV|"Failure during management controller initialization" EN_IPMI_NO_MEM|0x00216019|SAHPI_MAJOR|OVR_SEV|"No memory installed" EN_IPMI_OS_BOOT_FAIL|0x00216038|SAHPI_MAJOR|OVR_SEV|"Failure starting OS boot process" EN_IPMI_PCI_CONF_FAIL|0x0021602B|SAHPI_MAJOR|OVR_SEV|"Failure during PCI configuration" EN_IPMI_PCI_SERR|0x00216011|SAHPI_MAJOR|OVR_SEV|"PCI SERR: system error" EN_IPMI_ROM_INIT_FAIL|0x0021602D|SAHPI_MAJOR|OVR_SEV|"Failure during option ROM initialization" EN_IPMI_STORAGE_DEV_FAIL|0x0021601B|SAHPI_MAJOR|OVR_SEV|"Storage device failure" EN_IPMI_USB_CONF_FAIL|0x0021602C|SAHPI_MAJOR|OVR_SEV|"Failure during USB configuration" EN_WAKEUP_VECTOR_FAIL|0x00216037|SAHPI_MAJOR|OVR_SEV|"Failure calling OS wakeup vector" EN_BIOS_RTC|0xBBBB0001|SAHPI_MAJOR|OVR_SEV|"The System real time clock battery is no longer reliable" #### Mapped to Install Error Operational State # On old MMs (MM and CMM1), the blade is not allowed to power up if an incompatible switch is already installed. # On newer AMMs, the blade is allowed to power up. EN_BLADE_1_CFG_FAIL|0x0E006001|SAHPI_MAJOR|OVR_SEV,OVR_RID|"Blade Server 1 is incompatible with I/O module configuration" EN_BLADE_1_CFG_FAIL|0x0E006001|SAHPI_MAJOR|OVR_SEV,OVR_RID|"Blade 1 incompatible with I/O module configuration" EN_BLADE_2_CFG_FAIL|0x0E006002|SAHPI_MAJOR|OVR_SEV,OVR_RID|"Blade Server 2 is incompatible with I/O module configuration" EN_BLADE_2_CFG_FAIL|0x0E006002|SAHPI_MAJOR|OVR_SEV,OVR_RID|"Blade 2 incompatible with I/O module configuration" EN_BLADE_3_CFG_FAIL|0x0E006003|SAHPI_MAJOR|OVR_SEV,OVR_RID|"Blade Server 3 is incompatible with I/O module configuration" EN_BLADE_3_CFG_FAIL|0x0E006003|SAHPI_MAJOR|OVR_SEV,OVR_RID|"Blade 3 incompatible with I/O module configuration" EN_BLADE_4_CFG_FAIL|0x0E006004|SAHPI_MAJOR|OVR_SEV,OVR_RID|"Blade Server 4 is incompatible with I/O module configuration" EN_BLADE_4_CFG_FAIL|0x0E006004|SAHPI_MAJOR|OVR_SEV,OVR_RID|"Blade 4 incompatible with I/O module configuration" EN_BLADE_5_CFG_FAIL|0x0E006005|SAHPI_MAJOR|OVR_SEV,OVR_RID|"Blade Server 5 is incompatible with I/O module configuration" EN_BLADE_5_CFG_FAIL|0x0E006005|SAHPI_MAJOR|OVR_SEV,OVR_RID|"Blade 5 incompatible with I/O module configuration" EN_BLADE_6_CFG_FAIL|0x0E006006|SAHPI_MAJOR|OVR_SEV,OVR_RID|"Blade Server 6 is incompatible with I/O module configuration" EN_BLADE_6_CFG_FAIL|0x0E006006|SAHPI_MAJOR|OVR_SEV,OVR_RID|"Blade 6 incompatible with I/O module configuration" EN_BLADE_7_CFG_FAIL|0x0E006007|SAHPI_MAJOR|OVR_SEV,OVR_RID|"Blade Server 7 is incompatible with I/O module configuration" EN_BLADE_7_CFG_FAIL|0x0E006007|SAHPI_MAJOR|OVR_SEV,OVR_RID|"Blade 7 incompatible with I/O module configuration" EN_BLADE_8_CFG_FAIL|0x0E006008|SAHPI_MAJOR|OVR_SEV,OVR_RID|"Blade Server 8 is incompatible with I/O module configuration" EN_BLADE_8_CFG_FAIL|0x0E006008|SAHPI_MAJOR|OVR_SEV,OVR_RID|"Blade 8 incompatible with I/O module configuration" EN_BLADE_9_CFG_FAIL|0x0E006009|SAHPI_MAJOR|OVR_SEV,OVR_RID|"Blade Server 9 is incompatible with I/O module configuration" EN_BLADE_9_CFG_FAIL|0x0E006009|SAHPI_MAJOR|OVR_SEV,OVR_RID|"Blade 9 incompatible with I/O module configuration" EN_BLADE_A_CFG_FAIL|0x0E00600A|SAHPI_MAJOR|OVR_SEV,OVR_RID|"Blade Server 10 is incompatible with I/O module configuration" EN_BLADE_A_CFG_FAIL|0x0E00600A|SAHPI_MAJOR|OVR_SEV,OVR_RID|"Blade 10 incompatible with I/O module configuration" EN_BLADE_B_CFG_FAIL|0x0E00600B|SAHPI_MAJOR|OVR_SEV,OVR_RID|"Blade Server 11 is incompatible with I/O module configuration" EN_BLADE_B_CFG_FAIL|0x0E00600B|SAHPI_MAJOR|OVR_SEV,OVR_RID|"Blade 11 incompatible with I/O module configuration" EN_BLADE_C_CFG_FAIL|0x0E00600C|SAHPI_MAJOR|OVR_SEV,OVR_RID|"Blade Server 12 is incompatible with I/O module configuration" EN_BLADE_C_CFG_FAIL|0x0E00600C|SAHPI_MAJOR|OVR_SEV,OVR_RID|"Blade 12 incompatible with I/O module configuration" EN_BLADE_D_CFG_FAIL|0x0E00600D|SAHPI_MAJOR|OVR_SEV,OVR_RID|"Blade Server 13 is incompatible with I/O module configuration" EN_BLADE_D_CFG_FAIL|0x0E00600D|SAHPI_MAJOR|OVR_SEV,OVR_RID|"Blade 13 incompatible with I/O module configuration" EN_BLADE_E_CFG_FAIL|0x0E00600E|SAHPI_MAJOR|OVR_SEV,OVR_RID|"Blade Server 14 is incompatible with I/O module configuration" EN_BLADE_E_CFG_FAIL|0x0E00600E|SAHPI_MAJOR|OVR_SEV,OVR_RID|"Blade 14 incompatible with I/O module configuration" EN_BEM_1_FAULT|0x0EC00001|SAHPI_CRITICAL|OVR_SEV|"BEM 1 fault" EN_BEM_2_FAULT|0x0EC00002|SAHPI_CRITICAL|OVR_SEV|"BEM 2 fault" EN_BLADE_INCOMPATIABLE|0x04000280|SAHPI_CRITICAL|OVR_SEV|"Blade incompatible with chassis" EN_BSE_LEGACY_DC1_DONT_WORK|0x0D000281|SAHPI_CRITICAL|OVR_SEV|"Expansion card in slot 1 is not supported in current BSE configuration" EN_BSE_LEGACY_DC2_DONT_WORK|0x0D000282|SAHPI_CRITICAL|OVR_SEV|"Expansion card in slot 2 is not supported in current BSE configuration" EN_POWER_JUMPER_NP|0x04000300|SAHPI_CRITICAL|OVR_SEV|"Power jumper not present" EN_PWR_CONTROLLER_MISMATCH|0x08100080|SAHPI_CRITICAL|OVR_SEV|"Incompatible power controller firmware" # Blade Management Bus Operational Status Sensor - event only EN_STCONN_FAIL_BLADE_1|0x0E022001|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"Connectivity status blade 1 communication failed" EN_STCONN_FAIL_BLADE_2|0x0E022002|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"Connectivity status blade 2 communication failed" EN_STCONN_FAIL_BLADE_3|0x0E022003|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"Connectivity status blade 3 communication failed" EN_STCONN_FAIL_BLADE_4|0x0E022004|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"Connectivity status blade 4 communication failed" EN_STCONN_FAIL_BLADE_5|0x0E022005|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"Connectivity status blade 5 communication failed" EN_STCONN_FAIL_BLADE_6|0x0E022006|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"Connectivity status blade 6 communication failed" EN_STCONN_FAIL_BLADE_7|0x0E022007|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"Connectivity status blade 7 communication failed" EN_STCONN_FAIL_BLADE_8|0x0E022008|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"Connectivity status blade 8 communication failed" EN_STCONN_FAIL_BLADE_9|0x0E022009|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"Connectivity status blade 9 communication failed" EN_STCONN_FAIL_BLADE_10|0x0E02200A|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"Connectivity status blade 10 communication failed" EN_STCONN_FAIL_BLADE_11|0x0E02200B|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"Connectivity status blade 11 communication failed" EN_STCONN_FAIL_BLADE_12|0x0E02200C|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"Connectivity status blade 12 communication failed" EN_STCONN_FAIL_BLADE_13|0x0E02200D|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"Connectivity status blade 13 communication failed" EN_STCONN_FAIL_BLADE_14|0x0E02200E|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"Connectivity status blade 14 communication failed" # Blade NMI Status Sensor EN_SYSERR_LED_ONLY|0x0000007E|SAHPI_CRITICAL|OVR_SEV|"Critical Interrupt - Front panel NMI" ################################# # Blade Expansion Module Resource ################################# # None ################################ # Blade Expansion Module Sensors ################################ # BEM Operational Sensor - event only EN_FAULT_DASD|0x06800000|SAHPI_CRITICAL|OVR_SEV,OVR_EXP|"BEM Option failure" EN_FAULT_DASD|0x06800000|SAHPI_CRITICAL|OVR_SEV,OVR_EXP|"BEM failure" EN_BSE_RAID_BATTERY_FAILURE|0x0EE18000|SAHPI_CRITICAL|OVR_SEV,OVR_EXP|"BSE RAID battery failure" EN_BSE_RAID_FAULT|0x0EE00000|SAHPI_CRITICAL|OVR_SEV,OVR_EXP|"BSE RAID fault" # First two events are for DASD on blades and aren't currently generated #EN_DASD1_REMOVED_DRIVE_0|0x0681E000|SAHPI_INFORMATIONAL|OVR_SEV,OVR_EXP|"Hard drive 0 removal detected" #EN_DASD1_REMOVED_DRIVE_1|0x0681E001|SAHPI_INFORMATIONAL|OVR_SEV,OVR_EXP|"Hard drive 1 removal detected" EN_DASD1_REMOVED_DRIVE_2|0x0681E002|SAHPI_INFORMATIONAL|OVR_SEV,OVR_EXP|"Hard drive 2 removal detected" EN_DASD1_REMOVED_DRIVE_3|0x0681E003|SAHPI_INFORMATIONAL|OVR_SEV,OVR_EXP|"Hard drive 3 removal detected" EN_DASD1_REMOVED_DRIVE_4|0x0681E004|SAHPI_INFORMATIONAL|OVR_SEV,OVR_EXP|"Hard drive 4 removal detected" EN_FAULT_DASD1_SCSI_ID_2|0x06801002|SAHPI_CRITICAL|OVR_SEV,OVR_EXP|"Hard Drive Fault (SCSI ID 2)" EN_FAULT_DASD1_HARD_DRIVE_2|0x06800002|SAHPI_CRITICAL|OVR_SEV,OVR_EXP|"Hard drive 2 fault" EN_FAULT_DASD1_SCSI_ID_3|0x06801003|SAHPI_CRITICAL|OVR_SEV,OVR_EXP|"Hard Drive Fault (SCSI ID 3)" EN_FAULT_DASD1_HARD_DRIVE_3|0x06800003|SAHPI_CRITICAL|OVR_SEV,OVR_EXP|"Hard drive 3 fault" EN_FAULT_DASD1_HARD_DRIVE_4|0x06800004|SAHPI_CRITICAL|OVR_SEV,OVR_EXP|"Hard drive 4 fault" ###################################### # Blade Storage Expansion (BSE) Module ###################################### # BEM Temperature Sensor - event only EN_CUTOFF_HI_OVER_TEMP_BEM|0x0621C481|SAHPI_CRITICAL|OVR_SEV,OVR_EXP|"System shutoff due to BEM Option temperature" EN_CUTOFF_HI_OVER_TEMP_BEM|0x0621C481|SAHPI_CRITICAL|OVR_SEV,OVR_EXP|"BEM temperature fault" EN_CUTOFF_HI_OVER_TEMP_DASD1_2|0x0681C482|SAHPI_CRITICAL|OVR_SEV,OVR_EXP|"System shutoff due to DASD Option temperature" #EN_CUTOFF_HI_OVER_TEMP_DASD1_3|0x0681C483|SAHPI_CRITICAL|OVR_SEV,OVR_EXP|"System shutoff due to DASD Option temperature" EN_OVER_TEMP_BEM|0x0621C081|SAHPI_CRITICAL|OVR_SEV,OVR_EXP|"BEM 1 Over Temperature" EN_PFA_HI_OVER_TEMP_BEM|0x0621D481|SAHPI_MAJOR|OVR_SEV,OVR_EXP|"BEM over recommended temperature" EN_PFA_HI_OVER_TEMP_BEM|0x0621D481|SAHPI_MAJOR|OVR_SEV,OVR_EXP|"BEM Option over recommended temperature" EN_PFA_HI_OVER_TEMP_BEM|0x0681D481|SAHPI_MAJOR|OVR_SEV,OVR_EXP|"DASD Option over recommended temperature" # BEM Voltage Sensor - event only EN_BEM_1V_WARNING_HI|0x0E850402|SAHPI_MAJOR|OVR_SEV,OVR_EXP|"BEM 1V over recommended voltage" EN_BEM_1V_WARNING_LOW|0x0E850802|SAHPI_MAJOR|OVR_SEV,OVR_EXP|"BEM 1V under recommended voltage" EN_BEM_1_5V_WARNING_HI|0x0E840402|SAHPI_MAJOR|OVR_SEV,OVR_EXP|"BEM +1.5V over recommended voltage" EN_BEM_1_5V_WARNING_HI|0x0E840402|SAHPI_MAJOR|OVR_SEV,OVR_EXP|"BEM 1.5V over recommended voltage" EN_BEM_1_5V_WARNING_LOW|0x0E840802|SAHPI_MAJOR|OVR_SEV,OVR_EXP|"BEM +1.5V under recommended voltage" EN_BEM_1_5V_WARNING_LOW|0x0E840802|SAHPI_MAJOR|OVR_SEV,OVR_EXP|"BEM 1.5V under recommended voltage" EN_BEM_1_8V_WARNING_HI|0x0E87A402|SAHPI_MAJOR|OVR_SEV,OVR_EXP|"BEM +1.8V over recommended voltage" EN_BEM_1_8V_WARNING_HI|0x0E87A402|SAHPI_MAJOR|OVR_SEV,OVR_EXP|"BEM 1.8V over recommended voltage" EN_BEM_1_8V_WARNING_LOW|0x0E87A802|SAHPI_MAJOR|OVR_SEV,OVR_EXP|"BEM +1.8V under recommended voltage" EN_BEM_1_8V_WARNING_LOW|0x0E87A802|SAHPI_MAJOR|OVR_SEV,OVR_EXP|"BEM 1.8V under recommended voltage" EN_BEM_2_5V_WARNING_HI|0x0E830402|SAHPI_MAJOR|OVR_SEV,OVR_EXP|"BEM +2.5V over recommended voltage" EN_BEM_2_5V_WARNING_HI|0x0E830402|SAHPI_MAJOR|OVR_SEV,OVR_EXP|"BEM 2.5V over recommended voltage" EN_BEM_2_5V_WARNING_LOW|0x0E830802|SAHPI_MAJOR|OVR_SEV,OVR_EXP|"BEM +2.5V under recommended voltage" EN_BEM_2_5V_WARNING_LOW|0x0E830802|SAHPI_MAJOR|OVR_SEV,OVR_EXP|"BEM 2.5V under recommended voltage" EN_BEM_3_3V_WARNING_HI|0x0E832402|SAHPI_MAJOR|OVR_SEV,OVR_EXP|"BEM +3.3V over recommended voltage" EN_BEM_3_3V_WARNING_HI|0x0E832402|SAHPI_MAJOR|OVR_SEV,OVR_EXP|"BEM 3.3V over recommended voltage" EN_BEM_3_3V_WARNING_LOW|0x0E832802|SAHPI_MAJOR|OVR_SEV,OVR_EXP|"BEM +3.3V under recommended voltage" EN_BEM_3_3V_WARNING_LOW|0x0E832802|SAHPI_MAJOR|OVR_SEV,OVR_EXP|"BEM 3.3V under recommended voltage" EN_BEM_5V_WARNING_HI|0x0E834402|SAHPI_MAJOR|OVR_SEV,OVR_EXP|"BEM +5V over recommended voltage" EN_BEM_5V_WARNING_HI|0x0E834402|SAHPI_MAJOR|OVR_SEV,OVR_EXP|"BEM 5V over recommended voltage" EN_BEM_5V_WARNING_LOW|0x0E834802|SAHPI_MAJOR|OVR_SEV,OVR_EXP|"BEM +5V under recommended voltage" EN_BEM_5V_WARNING_LOW|0x0E834802|SAHPI_MAJOR|OVR_SEV,OVR_EXP|"BEM 5V under recommended voltage" EN_BEM_12V_WARNING_HI|0x0E836402|SAHPI_MAJOR|OVR_SEV,OVR_EXP|"BEM +12V over recommended voltage" EN_BEM_12V_WARNING_HI|0x0E836402|SAHPI_MAJOR|OVR_SEV,OVR_EXP|"BEM 12V over recommended voltage" EN_BEM_12V_WARNING_LOW|0x0E836802|SAHPI_MAJOR|OVR_SEV,OVR_EXP|"BEM +12V under recommended voltage" EN_BEM_12V_WARNING_LOW|0x0E836802|SAHPI_MAJOR|OVR_SEV,OVR_EXP|"BEM 12V under recommended voltage" EN_BEM_12VSB_WARNING_HI|0x0E860402|SAHPI_MAJOR|OVR_SEV,OVR_EXP|"BEM 12V standby over recommended voltage" EN_BEM_12VSB_WARNING_LOW|0x0E860802|SAHPI_MAJOR|OVR_SEV,OVR_EXP|"BEM 12V standby under recommended voltage" EN_BEM_18V_WARNING_HI|0x0E83C402|SAHPI_MAJOR|OVR_SEV,OVR_EXP|"BEM +18V over recommended voltage" EN_BEM_18V_WARNING_HI|0x0E83C402|SAHPI_MAJOR|OVR_SEV,OVR_EXP|"BEM 18V over recommended voltage" EN_BEM_18V_WARNING_LOW|0x0E83C802|SAHPI_MAJOR|OVR_SEV,OVR_EXP|"BEM +18V under recommended voltage" EN_BEM_18V_WARNING_LOW|0x0E83C802|SAHPI_MAJOR|OVR_SEV,OVR_EXP|"BEM 18V under recommended voltage" ############################# # PCI Expansion (PEU2) Module ############################# # PEU2 Temperature Sensor EN_GENERIC_HI_CRIT_TEMP|0xFFFFFF26|SAHPI_CRITICAL|OVR_SEV|"expansion board 3 (PEU2 Local Temp) over critical temperature" EN_GENERIC_HI_CRIT_TEMP|0xFFFFFF26|SAHPI_CRITICAL|OVR_SEV|"expansion board 2 (PEU2 Local Temp) over critical temperature" EN_GENERIC_HI_WARN_TEMP|0xFFFFFF27|SAHPI_MAJOR|OVR_SEV|"expansion board 3 (PEU2 Local Temp) over recommended temperature" EN_GENERIC_HI_WARN_TEMP|0xFFFFFF27|SAHPI_MAJOR|OVR_SEV|"expansion board 2 (PEU2 Local Temp) over recommended temperature" # PEU2 1 Volt Sensor EN_GENERIC_UPPER_WARN_VOLT|0xFFFFFF28|SAHPI_MAJOR|OVR_SEV|"expansion board 3 (PEU2 1V Sense) over recommended voltage" EN_GENERIC_LOWER_WARN_VOLT|0xFFFFFF29|SAHPI_MAJOR|OVR_SEV|"expansion board 3 (PEU2 1V Sense) under recommended voltage" # PEU2 3.3 Volt Sensor EN_GENERIC_UPPER_WARN_VOLT|0xFFFFFF2A|SAHPI_MAJOR|OVR_SEV|"expansion board 3 (PEU2 3.3V Sense) over recommended voltage" EN_GENERIC_LOWER_WARN_VOLT|0xFFFFFF2B|SAHPI_MAJOR|OVR_SEV|"expansion board 3 (PEU2 3.3V Sense) under recommended voltage" # PEU2 5 Volt Sensor EN_GENERIC_UPPER_WARN_VOLT|0xFFFFFF2C|SAHPI_MAJOR|OVR_SEV|"expansion board 3 (PEU2 5V Sense) over recommended voltage" EN_GENERIC_LOWER_WARN_VOLT|0xFFFFFF2D|SAHPI_MAJOR|OVR_SEV|"expansion board 3 (PEU2 5V Sense) under recommended voltage" # PEU2 12 Volt Sensor EN_GENERIC_UPPER_WARN_VOLT|0xFFFFFF30|SAHPI_MAJOR|OVR_SEV|"expansion board 3 (PEU2 12V Sense) over recommended voltage" EN_GENERIC_LOWER_WARN_VOLT|0xFFFFFF31|SAHPI_MAJOR|OVR_SEV|"expansion board 3 (PEU2 12V Sense) under recommended voltage" # PEU2 Standby 12 Volt Sensor EN_GENERIC_UPPER_WARN_VOLT|0xFFFFFF32|SAHPI_MAJOR|OVR_SEV|"expansion board 3 (PEU2 12VSB Sense) over recommended voltage" EN_GENERIC_LOWER_WARN_VOLT|0xFFFFFF33|SAHPI_MAJOR|OVR_SEV|"expansion board 3 (PEU2 12VSB Sense) under recommended voltage" ################################## # BIE (Blade I/O Expansion) Module ################################## # BIE Temperature Sensor EN_GENERIC_HI_CRIT_TEMP|0xFFFFFF34|SAHPI_CRITICAL|OVR_SEV|"expansion board 1 (BIE Local Temp) over critical temperature" EN_GENERIC_HI_WARN_TEMP|0xFFFFFF35|SAHPI_MAJOR|OVR_SEV|"expansion board 1 (BIE Local Temp) over recommended temperature" # BIE 1.5 Volt Sensor EN_GENERIC_UPPER_WARN_VOLT|0xFFFFFF36|SAHPI_MAJOR|OVR_SEV|"expansion board 1 (BIE 1.5V Sense) over recommended voltage" EN_GENERIC_LOWER_WARN_VOLT|0xFFFFFF37|SAHPI_MAJOR|OVR_SEV|"expansion board 1 (BIE 1.5V Sense) under recommended voltage" # BIE 3.3 Volt Sensor EN_GENERIC_UPPER_WARN_VOLT|0xFFFFFF38|SAHPI_MAJOR|OVR_SEV|"expansion board 1 (BIE 3.3V Sense) over recommended voltage" EN_GENERIC_LOWER_WARN_VOLT|0xFFFFFF39|SAHPI_MAJOR|OVR_SEV|"expansion board 1 (BIE 3.3V Sense) under recommended voltage" # BIE 5 Volt Sensor EN_GENERIC_UPPER_WARN_VOLT|0xFFFFFF3A|SAHPI_MAJOR|OVR_SEV|"expansion board 1 (BIE 5V Sense) over recommended voltage" EN_GENERIC_LOWER_WARN_VOLT|0xFFFFFF3B|SAHPI_MAJOR|OVR_SEV|"expansion board 1 (BIE 5V Sense) under recommended voltage" # BIE 12 Volt Sensor EN_GENERIC_UPPER_WARN_VOLT|0xFFFFFF3C|SAHPI_MAJOR|OVR_SEV|"expansion board 1 (BIE 12V Sense) over recommended voltage" EN_GENERIC_LOWER_WARN_VOLT|0xFFFFFF3D|SAHPI_MAJOR|OVR_SEV|"expansion board 1 (BIE 12V Sense) under recommended voltage" ##################### # Media Tray Resource ##################### # For non-AMM systems, the recovery of the removed event represents an install. EN_MEDIA_TRAY_REMOVED|0x06A1E001|SAHPI_INFORMATIONAL|OVR_SEV,OVR_RID|"The media tray was removed" EN_MEDIA_TRAY_REMOVED|0x06A1E001|SAHPI_INFORMATIONAL|OVR_SEV,OVR_RID|"Media Tray removed" # For AMM, there are separate install/removed events EN_MEDIA_TRAY_INSTALLED|0x06A02001|SAHPI_INFORMATIONAL|OVR_SEV,OVR_RID|"Media Tray 1 installed" EN_MEDIA_TRAY_2_INSTALLED|0x06A02002|SAHPI_INFORMATIONAL|OVR_SEV,OVR_RID|"Media Tray 2 installed" EN_MEDIA_TRAY_REMOVED|0x06A1E001|SAHPI_INFORMATIONAL|OVR_SEV,OVR_RID|"Media Tray 1 removed" EN_MEDIA_TRAY_2_REMOVED|0x06A1E002|SAHPI_INFORMATIONAL|OVR_SEV,OVR_RID|"Media Tray 2 removed" #################### # Media Tray Sensors #################### # Media Tray Operational Status Sensor - event only (except for BCHT, which supports a readable Fault LED) # EN_FAULT_FP_R|0x09020000|SAHPI_MINOR|OVR_SEV,OVR_RID|"System front panel controller not responding" EN_FRONT_PANEL_TEMP_FAIL|0x06A2E001|SAHPI_MAJOR|OVR_SEV,OVR_RID|"Media Tray 1 temperature is unavailable. Cooling capacity set to maximum" EN_FRONT_PANEL_B_TEMP_FAIL|0x06A2E002|SAHPI_MAJOR|OVR_SEV,OVR_RID|"Media Tray 2 temperature is unavailable. Cooling capacity set to maximum" EN_MT_1_HW_FAILURE|0x6F60C001|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"Media Tray module 1 hardware failure" EN_MT_2_HW_FAILURE|0x6F60C002|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"Media Tray module 2 hardware failure" # Media Tray Management Bus Operational Status Sensor - event only EN_STCONN_FAIL_MEDIATRAY|0x0002205B|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"Connectivity status mediatray communication failed" EN_STCONN_FAIL_MEDIATRAY|0x0002205B|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"Connectivity status Media Tray 1 communication failed" EN_STCONN_FAIL_MEDIATRAYB|0x0002205C|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"Connectivity status Media Tray 2 communication failed" ##################### # I/O Module Resource ##################### EN_SWITCH_1_INSTALLED|0x0EA02001|SAHPI_INFORMATIONAL|OVR_SEV,OVR_RID|"I/O module 1 was installed" EN_SWITCH_1_INSTALLED|0x0EA02001|SAHPI_INFORMATIONAL|OVR_SEV,OVR_RID|"I/O Module 1 installed" EN_SWITCH_2_INSTALLED|0x0EA02002|SAHPI_INFORMATIONAL|OVR_SEV,OVR_RID|"I/O module 2 was installed" EN_SWITCH_2_INSTALLED|0x0EA02002|SAHPI_INFORMATIONAL|OVR_SEV,OVR_RID|"I/O Module 2 installed" EN_SWITCH_3_INSTALLED|0x0EA02003|SAHPI_INFORMATIONAL|OVR_SEV,OVR_RID|"I/O module 3 was installed" EN_SWITCH_3_INSTALLED|0x0EA02003|SAHPI_INFORMATIONAL|OVR_SEV,OVR_RID|"I/O Module 3 installed" EN_SWITCH_4_INSTALLED|0x0EA02004|SAHPI_INFORMATIONAL|OVR_SEV,OVR_RID|"I/O module 4 was installed" EN_SWITCH_4_INSTALLED|0x0EA02004|SAHPI_INFORMATIONAL|OVR_SEV,OVR_RID|"I/O Module 4 installed" EN_SWITCH_5_INSTALLED|0x0EA02005|SAHPI_INFORMATIONAL|OVR_SEV,OVR_RID|"I/O Module 5 installed" EN_SWITCH_6_INSTALLED|0x0EA02006|SAHPI_INFORMATIONAL|OVR_SEV,OVR_RID|"I/O Module 6 installed" EN_SWITCH_7_INSTALLED|0x0EA02007|SAHPI_INFORMATIONAL|OVR_SEV,OVR_RID|"I/O Module 7 installed" EN_SWITCH_8_INSTALLED|0x0EA02008|SAHPI_INFORMATIONAL|OVR_SEV,OVR_RID|"I/O Module 8 installed" EN_SWITCH_9_INSTALLED|0x0EA02009|SAHPI_INFORMATIONAL|OVR_SEV,OVR_RID|"I/O Module 9 installed" EN_SWITCH_10_INSTALLED|0x0EA0200A|SAHPI_INFORMATIONAL|OVR_SEV,OVR_RID|"I/O Module 10 installed" EN_SWITCH_1_INSTALLED|0x0EA02001|SAHPI_INFORMATIONAL|OVR_SEV,OVR_RID|"I/O module 1 was installed Multiple I/O module failures" EN_SWITCH_1_INSTALLED|0x0EA02001|SAHPI_INFORMATIONAL|OVR_SEV,OVR_RID|"I/O Module 1 installed Multiple I/O module failures" EN_SWITCH_2_INSTALLED|0x0EA02002|SAHPI_INFORMATIONAL|OVR_SEV,OVR_RID|"I/O module 2 was installed Multiple I/O module failures" EN_SWITCH_2_INSTALLED|0x0EA02002|SAHPI_INFORMATIONAL|OVR_SEV,OVR_RID|"I/O Module 2 installed Multiple I/O module failures" EN_SWITCH_3_INSTALLED|0x0EA02003|SAHPI_INFORMATIONAL|OVR_SEV,OVR_RID|"I/O module 3 was installed Multiple I/O module failures" EN_SWITCH_3_INSTALLED|0x0EA02003|SAHPI_INFORMATIONAL|OVR_SEV,OVR_RID|"I/O Module 3 installed Multiple I/O module failures" EN_SWITCH_4_INSTALLED|0x0EA02004|SAHPI_INFORMATIONAL|OVR_SEV,OVR_RID|"I/O module 4 was installed Multiple I/O module failures" EN_SWITCH_4_INSTALLED|0x0EA02004|SAHPI_INFORMATIONAL|OVR_SEV,OVR_RID|"I/O Module 4 installed Multiple I/O module failures" EN_SWITCH_5_INSTALLED|0x0EA02005|SAHPI_INFORMATIONAL|OVR_SEV,OVR_RID|"I/O Module 5 installed Multiple I/O module failures" EN_SWITCH_6_INSTALLED|0x0EA02006|SAHPI_INFORMATIONAL|OVR_SEV,OVR_RID|"I/O Module 6 installed Multiple I/O module failures" EN_SWITCH_7_INSTALLED|0x0EA02007|SAHPI_INFORMATIONAL|OVR_SEV,OVR_RID|"I/O Module 7 installed Multiple I/O module failures" EN_SWITCH_8_INSTALLED|0x0EA02008|SAHPI_INFORMATIONAL|OVR_SEV,OVR_RID|"I/O Module 8 installed Multiple I/O module failures" EN_SWITCH_9_INSTALLED|0x0EA02009|SAHPI_INFORMATIONAL|OVR_SEV,OVR_RID|"I/O Module 9 installed Multiple I/O module failures" EN_SWITCH_10_INSTALLED|0x0EA0200A|SAHPI_INFORMATIONAL|OVR_SEV,OVR_RID|"I/O Module 10 installed Multiple I/O module failures" EN_SWITCH_1_REMOVED|0x0EA04001|SAHPI_INFORMATIONAL|OVR_SEV,OVR_RID|"I/O module 1 was removed" EN_SWITCH_1_REMOVED|0x0EA04001|SAHPI_INFORMATIONAL|OVR_SEV,OVR_RID|"I/O Module 1 removed" EN_SWITCH_2_REMOVED|0x0EA04002|SAHPI_INFORMATIONAL|OVR_SEV,OVR_RID|"I/O module 2 was removed" EN_SWITCH_2_REMOVED|0x0EA04002|SAHPI_INFORMATIONAL|OVR_SEV,OVR_RID|"I/O Module 2 removed" EN_SWITCH_3_REMOVED|0x0EA04003|SAHPI_INFORMATIONAL|OVR_SEV,OVR_RID|"I/O module 3 was removed" EN_SWITCH_3_REMOVED|0x0EA04003|SAHPI_INFORMATIONAL|OVR_SEV,OVR_RID|"I/O Module 3 removed" EN_SWITCH_4_REMOVED|0x0EA04004|SAHPI_INFORMATIONAL|OVR_SEV,OVR_RID|"I/O module 4 was removed" EN_SWITCH_4_REMOVED|0x0EA04004|SAHPI_INFORMATIONAL|OVR_SEV,OVR_RID|"I/O Module 4 removed" EN_SWITCH_5_REMOVED|0x0EA04005|SAHPI_INFORMATIONAL|OVR_SEV,OVR_RID|"I/O Module 5 removed" EN_SWITCH_6_REMOVED|0x0EA04006|SAHPI_INFORMATIONAL|OVR_SEV,OVR_RID|"I/O Module 6 removed" EN_SWITCH_7_REMOVED|0x0EA04007|SAHPI_INFORMATIONAL|OVR_SEV,OVR_RID|"I/O Module 7 removed" EN_SWITCH_8_REMOVED|0x0EA04008|SAHPI_INFORMATIONAL|OVR_SEV,OVR_RID|"I/O Module 8 removed" EN_SWITCH_9_REMOVED|0x0EA04009|SAHPI_INFORMATIONAL|OVR_SEV,OVR_RID|"I/O Module 9 removed" EN_SWITCH_10_REMOVED|0x0EA0400A|SAHPI_INFORMATIONAL|OVR_SEV,OVR_RID|"I/O Module 10 removed" EN_SWITCH_1_REMOVED|0x0EA04001|SAHPI_INFORMATIONAL|OVR_SEV,OVR_RID|"I/O module 1 was removed Multiple I/O module failures" EN_SWITCH_1_REMOVED|0x0EA04001|SAHPI_INFORMATIONAL|OVR_SEV,OVR_RID|"I/O Module 1 removed Multiple I/O module failures" EN_SWITCH_2_REMOVED|0x0EA04002|SAHPI_INFORMATIONAL|OVR_SEV,OVR_RID|"I/O module 2 was removed Multiple I/O module failures" EN_SWITCH_2_REMOVED|0x0EA04002|SAHPI_INFORMATIONAL|OVR_SEV,OVR_RID|"I/O Module 2 removed Multiple I/O module failures" EN_SWITCH_3_REMOVED|0x0EA04003|SAHPI_INFORMATIONAL|OVR_SEV,OVR_RID|"I/O module 3 was removed Multiple I/O module failures" EN_SWITCH_3_REMOVED|0x0EA04003|SAHPI_INFORMATIONAL|OVR_SEV,OVR_RID|"I/O Module 3 removed Multiple I/O module failures" EN_SWITCH_4_REMOVED|0x0EA04004|SAHPI_INFORMATIONAL|OVR_SEV,OVR_RID|"I/O module 4 was removed Multiple I/O module failures" EN_SWITCH_4_REMOVED|0x0EA04004|SAHPI_INFORMATIONAL|OVR_SEV,OVR_RID|"I/O Module 4 removed Multiple I/O module failures" EN_SWITCH_5_REMOVED|0x0EA04005|SAHPI_INFORMATIONAL|OVR_SEV,OVR_RID|"I/O Module 5 removed Multiple I/O module failures" EN_SWITCH_6_REMOVED|0x0EA04006|SAHPI_INFORMATIONAL|OVR_SEV,OVR_RID|"I/O Module 6 removed Multiple I/O module failures" EN_SWITCH_7_REMOVED|0x0EA04007|SAHPI_INFORMATIONAL|OVR_SEV,OVR_RID|"I/O Module 7 removed Multiple I/O module failures" EN_SWITCH_8_REMOVED|0x0EA04008|SAHPI_INFORMATIONAL|OVR_SEV,OVR_RID|"I/O Module 8 removed Multiple I/O module failures" EN_SWITCH_9_REMOVED|0x0EA04009|SAHPI_INFORMATIONAL|OVR_SEV,OVR_RID|"I/O Module 9 removed Multiple I/O module failures" EN_SWITCH_10_REMOVED|0x0EA0400A|SAHPI_INFORMATIONAL|OVR_SEV,OVR_RID|"I/O Module 10 removed Multiple I/O module failures" EN_SWITCH_1_POWERED_OFF|0x0EA06001|SAHPI_INFORMATIONAL|OVR_SEV,OVR_RID|"I/O module 1 was instructed to power off" EN_SWITCH_2_POWERED_OFF|0x0EA06002|SAHPI_INFORMATIONAL|OVR_SEV,OVR_RID|"I/O module 2 was instructed to power off" EN_SWITCH_3_POWERED_OFF|0x0EA06003|SAHPI_INFORMATIONAL|OVR_SEV,OVR_RID|"I/O module 3 was instructed to power off" EN_SWITCH_4_POWERED_OFF|0x0EA06004|SAHPI_INFORMATIONAL|OVR_SEV,OVR_RID|"I/O module 4 was instructed to power off" EN_SWITCH_5_POWERED_OFF|0x0EA06005|SAHPI_INFORMATIONAL|OVR_SEV,OVR_RID|"I/O module 5 was instructed to power off" EN_SWITCH_6_POWERED_OFF|0x0EA06006|SAHPI_INFORMATIONAL|OVR_SEV,OVR_RID|"I/O module 6 was instructed to power off" EN_SWITCH_7_POWERED_OFF|0x0EA06007|SAHPI_INFORMATIONAL|OVR_SEV,OVR_RID|"I/O module 7 was instructed to power off" EN_SWITCH_8_POWERED_OFF|0x0EA06008|SAHPI_INFORMATIONAL|OVR_SEV,OVR_RID|"I/O module 8 was instructed to power off" EN_SWITCH_9_POWERED_OFF|0x0EA06009|SAHPI_INFORMATIONAL|OVR_SEV,OVR_RID|"I/O module 9 was instructed to power off" EN_SWITCH_10_POWERED_OFF|0x0EA0600A|SAHPI_INFORMATIONAL|OVR_SEV,OVR_RID|"I/O module 10 was instructed to power off" EN_SWITCH_1_POWERED_ON|0x0EA08001|SAHPI_INFORMATIONAL|OVR_SEV,OVR_RID|"I/O module 1 was instructed to power on" EN_SWITCH_2_POWERED_ON|0x0EA08002|SAHPI_INFORMATIONAL|OVR_SEV,OVR_RID|"I/O module 2 was instructed to power on" EN_SWITCH_3_POWERED_ON|0x0EA08003|SAHPI_INFORMATIONAL|OVR_SEV,OVR_RID|"I/O module 3 was instructed to power on" EN_SWITCH_4_POWERED_ON|0x0EA08004|SAHPI_INFORMATIONAL|OVR_SEV,OVR_RID|"I/O module 4 was instructed to power on" EN_SWITCH_5_POWERED_ON|0x0EA08005|SAHPI_INFORMATIONAL|OVR_SEV,OVR_RID|"I/O module 5 was instructed to power on" EN_SWITCH_6_POWERED_ON|0x0EA08006|SAHPI_INFORMATIONAL|OVR_SEV,OVR_RID|"I/O module 6 was instructed to power on" EN_SWITCH_7_POWERED_ON|0x0EA08007|SAHPI_INFORMATIONAL|OVR_SEV,OVR_RID|"I/O module 7 was instructed to power on" EN_SWITCH_8_POWERED_ON|0x0EA08008|SAHPI_INFORMATIONAL|OVR_SEV,OVR_RID|"I/O module 8 was instructed to power on" EN_SWITCH_9_POWERED_ON|0x0EA08009|SAHPI_INFORMATIONAL|OVR_SEV,OVR_RID|"I/O module 9 was instructed to power on" EN_SWITCH_10_POWERED_ON|0x0EA0800A|SAHPI_INFORMATIONAL|OVR_SEV,OVR_RID|"I/O module 10 was instructed to power on" #################### # I/O Module Sensors #################### # I/O Module Operational Status Sensor EN_FAULT_SWITCH_1|0x0EA00001|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"I/O module 1 Fault" EN_FAULT_SWITCH_1|0x0EA00001|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"I/O Module 1 fault" EN_FAULT_SWITCH_1|0x0EA00001|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"I/O module 1 Fault Multiple I/O module failures" EN_FAULT_SWITCH_1|0x0EA00001|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"I/O Module 1 fault Multiple I/O module failures" EN_FAULT_SWITCH_2|0x0EA00002|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"I/O module 2 Fault" EN_FAULT_SWITCH_2|0x0EA00002|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"I/O Module 2 fault" EN_FAULT_SWITCH_2|0x0EA00002|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"I/O module 2 Fault Multiple I/O module failures" EN_FAULT_SWITCH_2|0x0EA00002|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"I/O Module 2 fault Multiple I/O module failures" EN_FAULT_SWITCH_3|0x0EA00003|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"I/O module 3 Fault" EN_FAULT_SWITCH_3|0x0EA00003|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"I/O Module 3 fault" EN_FAULT_SWITCH_3|0x0EA00003|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"I/O module 3 Fault Multiple I/O module failures" EN_FAULT_SWITCH_3|0x0EA00003|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"I/O Module 3 fault Multiple I/O module failures" EN_FAULT_SWITCH_4|0x0EA00004|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"I/O module 4 Fault" EN_FAULT_SWITCH_4|0x0EA00004|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"I/O Module 4 fault" EN_FAULT_SWITCH_4|0x0EA00004|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"I/O module 4 Fault Multiple I/O module failures" EN_FAULT_SWITCH_4|0x0EA00004|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"I/O Module 4 fault Multiple I/O module failures" EN_FAULT_SWITCH_5|0x0EA00005|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"I/O Module 5 fault" EN_FAULT_SWITCH_5|0x0EA00005|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"I/O Module 5 fault Multiple I/O module failures" EN_FAULT_SWITCH_6|0x0EA00006|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"I/O Module 6 fault" EN_FAULT_SWITCH_6|0x0EA00006|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"I/O Module 6 fault Multiple I/O module failures" EN_FAULT_SWITCH_7|0x0EA00007|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"I/O Module 7 fault" EN_FAULT_SWITCH_7|0x0EA00007|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"I/O Module 7 fault Multiple I/O module failures" EN_FAULT_SWITCH_8|0x0EA00008|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"I/O Module 8 fault" EN_FAULT_SWITCH_8|0x0EA00008|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"I/O Module 8 fault Multiple I/O module failures" EN_FAULT_SWITCH_9|0x0EA00009|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"I/O Module 9 fault" EN_FAULT_SWITCH_9|0x0EA00009|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"I/O Module 9 fault Multiple I/O module failures" EN_FAULT_SWITCH_10|0x0EA0000A|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"I/O Module 10 fault" EN_FAULT_SWITCH_10|0x0EA0000A|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"I/O Module 10 fault Multiple I/O module failures" EN_SWITCH_1_INSUFFICIENT_PWR|0x0E00B001|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"Switch 1 is not allowed to power on because of insufficient power" EN_SWITCH_1_INSUFFICIENT_PWR|0x0E00B001|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"I/O Module 1 is not allowed to power on due to insufficient power" EN_SWITCH_2_INSUFFICIENT_PWR|0x0E00B002|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"Switch 2 is not allowed to power on because of insufficient power" EN_SWITCH_2_INSUFFICIENT_PWR|0x0E00B002|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"I/O Module 2 is not allowed to power on due to insufficient power" EN_SWITCH_3_INSUFFICIENT_PWR|0x0E00B003|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"Switch 3 is not allowed to power on because of insufficient power" EN_SWITCH_3_INSUFFICIENT_PWR|0x0E00B003|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"I/O Module 3 is not allowed to power on due to insufficient power" EN_SWITCH_4_INSUFFICIENT_PWR|0x0E00B004|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"Switch 4 is not allowed to power on because of insufficient power" EN_SWITCH_4_INSUFFICIENT_PWR|0x0E00B004|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"I/O Module 4 is not allowed to power on due to insufficient power" EN_SWITCH_5_INSUFFICIENT_PWR|0x0E00B005|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"I/O Module 5 is not allowed to power on due to insufficient power" EN_SWITCH_6_INSUFFICIENT_PWR|0x0E00B006|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"I/O Module 6 is not allowed to power on due to insufficient power" EN_SWITCH_7_INSUFFICIENT_PWR|0x0E00B007|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"I/O Module 7 is not allowed to power on due to insufficient power" EN_SWITCH_8_INSUFFICIENT_PWR|0x0E00B008|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"I/O Module 8 is not allowed to power on due to insufficient power" EN_SWITCH_9_INSUFFICIENT_PWR|0x0E00B009|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"I/O Module 9 is not allowed to power on due to insufficient power" EN_SWITCH_10_INSUFFICIENT_PWR|0x0E00B00A|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"I/O Module 10 is not allowed to power on due to insufficient power" # In old MM code, this condition caused the I/O module not to be powered up. In newer MM2 code, this condition is # just a warning and the I/O module powers on. EN_SWITCH_1_CFG_ERROR|0x0EA0C001|SAHPI_MINOR|OVR_SEV,OVR_RID|"I/O module 1 is incompatible with Blade Server configuration" EN_SWITCH_1_CFG_ERROR|0x0EA0C001|SAHPI_MINOR|OVR_SEV,OVR_RID|"I/O Module 1 incompatible with blade configuration" EN_SWITCH_2_CFG_ERROR|0x0EA0C002|SAHPI_MINOR|OVR_SEV,OVR_RID|"I/O module 2 is incompatible with Blade Server configuration" EN_SWITCH_2_CFG_ERROR|0x0EA0C002|SAHPI_MINOR|OVR_SEV,OVR_RID|"I/O Module 2 incompatible with blade configuration" EN_SWITCH_3_CFG_ERROR|0x0EA0C003|SAHPI_MINOR|OVR_SEV,OVR_RID|"I/O module 3 is incompatible with Blade Server configuration" EN_SWITCH_3_CFG_ERROR|0x0EA0C003|SAHPI_MINOR|OVR_SEV,OVR_RID|"I/O Module 3 incompatible with blade configuration" EN_SWITCH_4_CFG_ERROR|0x0EA0C004|SAHPI_MINOR|OVR_SEV,OVR_RID|"I/O module 4 is incompatible with Blade Server configuration" EN_SWITCH_4_CFG_ERROR|0x0EA0C004|SAHPI_MINOR|OVR_SEV,OVR_RID|"I/O Module 4 incompatible with blade configuration" EN_SWITCH_5_CFG_ERROR|0x0EA0C005|SAHPI_MINOR|OVR_SEV,OVR_RID|"I/O Module 5 incompatible with blade configuration" EN_SWITCH_6_CFG_ERROR|0x0EA0C006|SAHPI_MINOR|OVR_SEV,OVR_RID|"I/O Module 6 incompatible with blade configuration" EN_SWITCH_7_CFG_ERROR|0x0EA0C007|SAHPI_MINOR|OVR_SEV,OVR_RID|"I/O Module 7 incompatible with blade configuration" EN_SWITCH_8_CFG_ERROR|0x0EA0C008|SAHPI_MINOR|OVR_SEV,OVR_RID|"I/O Module 8 incompatible with blade configuration" EN_SWITCH_9_CFG_ERROR|0x0EA0C009|SAHPI_MINOR|OVR_SEV,OVR_RID|"I/O Module 9 incompatible with blade configuration" EN_SWITCH_10_CFG_ERROR|0x0EA0C00A|SAHPI_MINOR|OVR_SEV,OVR_RID|"I/O Module 10 incompatible with blade configuration" EN_SWITCH_1_POST_ERROR|0x0EA0E001|SAHPI_MAJOR|OVR_SEV,OVR_RID|"I/O module 1 POST Error" EN_SWITCH_1_POST_ERROR|0x0EA0E001|SAHPI_MAJOR|OVR_SEV,OVR_RID|"I/O Module 1 POST failure" EN_SWITCH_2_POST_ERROR|0x0EA0E002|SAHPI_MAJOR|OVR_SEV,OVR_RID|"I/O module 2 POST Error" EN_SWITCH_2_POST_ERROR|0x0EA0E002|SAHPI_MAJOR|OVR_SEV,OVR_RID|"I/O Module 2 POST failure" EN_SWITCH_3_POST_ERROR|0x0EA0E003|SAHPI_MAJOR|OVR_SEV,OVR_RID|"I/O module 3 POST Error" EN_SWITCH_3_POST_ERROR|0x0EA0E003|SAHPI_MAJOR|OVR_SEV,OVR_RID|"I/O Module 3 POST failure" EN_SWITCH_4_POST_ERROR|0x0EA0E004|SAHPI_MAJOR|OVR_SEV,OVR_RID|"I/O module 4 POST Error" EN_SWITCH_4_POST_ERROR|0x0EA0E004|SAHPI_MAJOR|OVR_SEV,OVR_RID|"I/O Module 4 POST failure" EN_SWITCH_5_POST_ERROR|0x0EA0E005|SAHPI_MAJOR|OVR_SEV,OVR_RID|"I/O Module 5 POST failure" EN_SWITCH_6_POST_ERROR|0x0EA0E006|SAHPI_MAJOR|OVR_SEV,OVR_RID|"I/O Module 6 POST failure" EN_SWITCH_7_POST_ERROR|0x0EA0E007|SAHPI_MAJOR|OVR_SEV,OVR_RID|"I/O Module 7 POST failure" EN_SWITCH_8_POST_ERROR|0x0EA0E008|SAHPI_MAJOR|OVR_SEV,OVR_RID|"I/O Module 8 POST failure" EN_SWITCH_9_POST_ERROR|0x0EA0E009|SAHPI_MAJOR|OVR_SEV,OVR_RID|"I/O Module 9 POST failure" EN_SWITCH_10_POST_ERROR|0x0EA0E00A|SAHPI_MAJOR|OVR_SEV,OVR_RID|"I/O Module 10 POST failure" EN_SWITCH_1_POST_ERROR|0x0EA0E001|SAHPI_MAJOR|OVR_SEV,OVR_RID|"I/O module 1 POST Error. Multiple I/O module failures" EN_SWITCH_1_POST_ERROR|0x0EA0E001|SAHPI_MAJOR|OVR_SEV,OVR_RID|"I/O Module 1 POST failure Multiple I/O module failures" EN_SWITCH_2_POST_ERROR|0x0EA0E002|SAHPI_MAJOR|OVR_SEV,OVR_RID|"I/O module 2 POST Error. Multiple I/O module failures" EN_SWITCH_2_POST_ERROR|0x0EA0E002|SAHPI_MAJOR|OVR_SEV,OVR_RID|"I/O Module 2 POST failure Multiple I/O module failures" EN_SWITCH_3_POST_ERROR|0x0EA0E003|SAHPI_MAJOR|OVR_SEV,OVR_RID|"I/O module 3 POST Error. Multiple I/O module failures" EN_SWITCH_3_POST_ERROR|0x0EA0E003|SAHPI_MAJOR|OVR_SEV,OVR_RID|"I/O Module 3 POST failure Multiple I/O module failures" EN_SWITCH_4_POST_ERROR|0x0EA0E004|SAHPI_MAJOR|OVR_SEV,OVR_RID|"I/O module 4 POST Error. Multiple I/O module failures" EN_SWITCH_4_POST_ERROR|0x0EA0E004|SAHPI_MAJOR|OVR_SEV,OVR_RID|"I/O Module 4 POST failure Multiple I/O module failures" EN_SWITCH_5_POST_ERROR|0x0EA0E005|SAHPI_MAJOR|OVR_SEV,OVR_RID|"I/O Module 5 POST failure Multiple I/O module failures" EN_SWITCH_6_POST_ERROR|0x0EA0E006|SAHPI_MAJOR|OVR_SEV,OVR_RID|"I/O Module 6 POST failure Multiple I/O module failures" EN_SWITCH_7_POST_ERROR|0x0EA0E007|SAHPI_MAJOR|OVR_SEV,OVR_RID|"I/O Module 7 POST failure Multiple I/O module failures" EN_SWITCH_8_POST_ERROR|0x0EA0E008|SAHPI_MAJOR|OVR_SEV,OVR_RID|"I/O Module 8 POST failure Multiple I/O module failures" EN_SWITCH_9_POST_ERROR|0x0EA0E009|SAHPI_MAJOR|OVR_SEV,OVR_RID|"I/O Module 9 POST failure Multiple I/O module failures" EN_SWITCH_10_POST_ERROR|0x0EA0E00A|SAHPI_MAJOR|OVR_SEV,OVR_RID|"I/O Module 10 POST failure Multiple I/O module failures" EN_SWITCH_1_POST_TIMEOUT|0x0EA0D001|SAHPI_MAJOR|OVR_SEV,OVR_RID|"I/O module 1 POST Timeout" EN_SWITCH_1_POST_TIMEOUT|0x0EA0D001|SAHPI_MAJOR|OVR_SEV,OVR_RID|"I/O module 1 POST timeout" EN_SWITCH_2_POST_TIMEOUT|0x0EA0D002|SAHPI_MAJOR|OVR_SEV,OVR_RID|"I/O module 2 POST Timeout" EN_SWITCH_2_POST_TIMEOUT|0x0EA0D002|SAHPI_MAJOR|OVR_SEV,OVR_RID|"I/O module 2 POST timeout" EN_SWITCH_3_POST_TIMEOUT|0x0EA0D003|SAHPI_MAJOR|OVR_SEV,OVR_RID|"I/O module 3 POST Timeout" EN_SWITCH_3_POST_TIMEOUT|0x0EA0D003|SAHPI_MAJOR|OVR_SEV,OVR_RID|"I/O module 3 POST timeout" EN_SWITCH_4_POST_TIMEOUT|0x0EA0D004|SAHPI_MAJOR|OVR_SEV,OVR_RID|"I/O module 4 POST Timeout" EN_SWITCH_4_POST_TIMEOUT|0x0EA0D004|SAHPI_MAJOR|OVR_SEV,OVR_RID|"I/O module 4 POST timeout" EN_SWITCH_5_POST_TIMEOUT|0x0EA0D005|SAHPI_MAJOR|OVR_SEV,OVR_RID|"I/O module 5 POST timeout" EN_SWITCH_6_POST_TIMEOUT|0x0EA0D006|SAHPI_MAJOR|OVR_SEV,OVR_RID|"I/O module 6 POST timeout" EN_SWITCH_7_POST_TIMEOUT|0x0EA0D007|SAHPI_MAJOR|OVR_SEV,OVR_RID|"I/O module 7 POST timeout" EN_SWITCH_8_POST_TIMEOUT|0x0EA0D008|SAHPI_MAJOR|OVR_SEV,OVR_RID|"I/O module 8 POST timeout" EN_SWITCH_9_POST_TIMEOUT|0x0EA0D009|SAHPI_MAJOR|OVR_SEV,OVR_RID|"I/O module 9 POST timeout" EN_SWITCH_10_POST_TIMEOUT|0x0EA0D00A|SAHPI_MAJOR|OVR_SEV,OVR_RID|"I/O module 10 POST timeout" EN_SWITCH_1_POST_TIMEOUT|0x0EA0D001|SAHPI_MAJOR|OVR_SEV,OVR_RID|"I/O module 1 POST Timeout. Multiple I/O module failures" EN_SWITCH_1_POST_TIMEOUT|0x0EA0D001|SAHPI_MAJOR|OVR_SEV,OVR_RID|"I/O module 1 POST timeout. Multiple I/O module failures" EN_SWITCH_2_POST_TIMEOUT|0x0EA0D002|SAHPI_MAJOR|OVR_SEV,OVR_RID|"I/O module 2 POST Timeout. Multiple I/O module failures" EN_SWITCH_2_POST_TIMEOUT|0x0EA0D002|SAHPI_MAJOR|OVR_SEV,OVR_RID|"I/O module 2 POST timeout. Multiple I/O module failure" EN_SWITCH_3_POST_TIMEOUT|0x0EA0D003|SAHPI_MAJOR|OVR_SEV,OVR_RID|"I/O module 3 POST Timeout. Multiple I/O module failures" EN_SWITCH_3_POST_TIMEOUT|0x0EA0D003|SAHPI_MAJOR|OVR_SEV,OVR_RID|"I/O module 3 POST timeout. Multiple I/O module failures" EN_SWITCH_4_POST_TIMEOUT|0x0EA0D004|SAHPI_MAJOR|OVR_SEV,OVR_RID|"I/O module 4 POST Timeout. Multiple I/O module failures" EN_SWITCH_4_POST_TIMEOUT|0x0EA0D004|SAHPI_MAJOR|OVR_SEV,OVR_RID|"I/O module 4 POST timeout. Multiple I/O module failures" EN_SWITCH_5_POST_TIMEOUT|0x0EA0D005|SAHPI_MAJOR|OVR_SEV,OVR_RID|"I/O module 5 POST timeout. Multiple I/O module failures" EN_SWITCH_6_POST_TIMEOUT|0x0EA0D006|SAHPI_MAJOR|OVR_SEV,OVR_RID|"I/O module 6 POST timeout. Multiple I/O module failures" EN_SWITCH_7_POST_TIMEOUT|0x0EA0D007|SAHPI_MAJOR|OVR_SEV,OVR_RID|"I/O module 7 POST timeout. Multiple I/O module failures" EN_SWITCH_8_POST_TIMEOUT|0x0EA0D008|SAHPI_MAJOR|OVR_SEV,OVR_RID|"I/O module 8 POST timeout. Multiple I/O module failures" EN_SWITCH_9_POST_TIMEOUT|0x0EA0D009|SAHPI_MAJOR|OVR_SEV,OVR_RID|"I/O module 9 POST timeout. Multiple I/O module failures" EN_SWITCH_10_POST_TIMEOUT|0x0EA0D00A|SAHPI_MAJOR|OVR_SEV,OVR_RID|"I/O module 10 POST timeout. Multiple I/O module failures" EN_OVER_CURRENT_SWITCH_1|0x0EA1A401|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"I/O module 1 Current Fault" EN_OVER_CURRENT_SWITCH_1|0x0EA1A401|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"I/O module 1 current fault" EN_OVER_CURRENT_SWITCH_2|0x0EA1A402|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"I/O module 2 Current Fault" EN_OVER_CURRENT_SWITCH_2|0x0EA1A402|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"I/O module 2 current fault" EN_OVER_CURRENT_SWITCH_3|0x0EA1A403|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"I/O module 3 Current Fault" EN_OVER_CURRENT_SWITCH_3|0x0EA1A403|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"I/O module 3 current fault" EN_OVER_CURRENT_SWITCH_4|0x0EA1A404|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"I/O module 4 Current Fault" EN_OVER_CURRENT_SWITCH_4|0x0EA1A404|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"I/O module 4 current fault" EN_OVER_CURRENT_SWITCH_5|0x0EA1A405|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"I/O module 5 current fault" EN_OVER_CURRENT_SWITCH_6|0x0EA1A406|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"I/O module 6 current fault" EN_OVER_CURRENT_SWITCH_7|0x0EA1A407|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"I/O module 7 current fault" EN_OVER_CURRENT_SWITCH_8|0x0EA1A408|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"I/O module 8 current fault" EN_OVER_CURRENT_SWITCH_9|0x0EA1A409|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"I/O module 9 current fault" EN_OVER_CURRENT_SWITCH_10|0x0EA1A40A|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"I/O module 10 current fault" EN_OVER_CURRENT_SWITCH_1|0x0EA1A401|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"I/O module 1 Current Fault Multiple I/O module failures" EN_OVER_CURRENT_SWITCH_1|0x0EA1A401|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"I/O module 1 current fault Multiple I/O module failures" EN_OVER_CURRENT_SWITCH_2|0x0EA1A402|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"I/O module 2 Current Fault Multiple I/O module failures" EN_OVER_CURRENT_SWITCH_2|0x0EA1A402|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"I/O module 2 current fault Multiple I/O module failures" EN_OVER_CURRENT_SWITCH_3|0x0EA1A403|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"I/O module 3 Current Fault Multiple I/O module failures" EN_OVER_CURRENT_SWITCH_3|0x0EA1A403|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"I/O module 3 current fault Multiple I/O module failures" EN_OVER_CURRENT_SWITCH_4|0x0EA1A404|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"I/O module 4 Current Fault Multiple I/O module failures" EN_OVER_CURRENT_SWITCH_4|0x0EA1A404|SAHPI_CRITICAL|OVR_SE,OVR_RIDV|"I/O module 4 current fault Multiple I/O module failures" EN_OVER_CURRENT_SWITCH_5|0x0EA1A405|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"I/O module 5 current fault Multiple I/O module failures" EN_OVER_CURRENT_SWITCH_6|0x0EA1A406|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"I/O module 6 current fault Multiple I/O module failures" EN_OVER_CURRENT_SWITCH_7|0x0EA1A407|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"I/O module 7 current fault Multiple I/O module failures" EN_OVER_CURRENT_SWITCH_8|0x0EA1A408|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"I/O module 8 current fault Multiple I/O module failures" EN_OVER_CURRENT_SWITCH_9|0x0EA1A409|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"I/O module 9 current fault Multiple I/O module failures" EN_OVER_CURRENT_SWITCH_10|0x0EA1A40A|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"I/O module 10 current fault Multiple I/O module failures" # I/O Module Temperature Sensor - event-only EN_OVER_TEMP_SWITCH_1|0x0EA1C401|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"I/O module 1 Temperature Fault" EN_OVER_TEMP_SWITCH_1|0x0EA1C401|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"I/O module 1 temperature fault" EN_OVER_TEMP_SWITCH_2|0x0EA1C402|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"I/O module 2 Temperature Fault" EN_OVER_TEMP_SWITCH_2|0x0EA1C402|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"I/O module 2 temperature fault" EN_OVER_TEMP_SWITCH_3|0x0EA1C403|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"I/O module 3 Temperature Fault" EN_OVER_TEMP_SWITCH_3|0x0EA1C403|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"I/O module 3 temperature fault" EN_OVER_TEMP_SWITCH_4|0x0EA1C404|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"I/O module 4 Temperature Fault" EN_OVER_TEMP_SWITCH_4|0x0EA1C404|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"I/O module 4 temperature fault" EN_OVER_TEMP_SWITCH_5|0x0EA1C405|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"I/O module 5 temperature fault" EN_OVER_TEMP_SWITCH_6|0x0EA1C406|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"I/O module 6 temperature fault" EN_OVER_TEMP_SWITCH_7|0x0EA1C407|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"I/O module 7 temperature fault" EN_OVER_TEMP_SWITCH_8|0x0EA1C408|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"I/O module 8 temperature fault" EN_OVER_TEMP_SWITCH_9|0x0EA1C409|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"I/O module 9 temperature fault" EN_OVER_TEMP_SWITCH_10|0x0EA1C40A|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"I/O module 10 temperature fault" EN_OVER_TEMP_SWITCH_1|0x0EA1C401|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"I/O module 1 Temperature Fault Multiple I/O module failures" EN_OVER_TEMP_SWITCH_1|0x0EA1C401|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"I/O module 1 temperature fault Multiple I/O module failures" EN_OVER_TEMP_SWITCH_2|0x0EA1C402|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"I/O module 2 Temperature Fault Multiple I/O module failures" EN_OVER_TEMP_SWITCH_2|0x0EA1C402|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"I/O module 2 temperature fault Multiple I/O module failures" EN_OVER_TEMP_SWITCH_3|0x0EA1C403|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"I/O module 3 Temperature Fault Multiple I/O module failures" EN_OVER_TEMP_SWITCH_3|0x0EA1C403|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"I/O module 3 temperature fault Multiple I/O module failures" EN_OVER_TEMP_SWITCH_4|0x0EA1C404|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"I/O module 4 Temperature Fault Multiple I/O module failures" EN_OVER_TEMP_SWITCH_4|0x0EA1C404|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"I/O module 4 temperature fault Multiple I/O module failures" EN_OVER_TEMP_SWITCH_5|0x0EA1C405|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"I/O module 5 temperature fault Multiple I/O module failures" EN_OVER_TEMP_SWITCH_6|0x0EA1C406|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"I/O module 6 temperature fault Multiple I/O module failures" EN_OVER_TEMP_SWITCH_7|0x0EA1C407|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"I/O module 7 temperature fault Multiple I/O module failures" EN_OVER_TEMP_SWITCH_8|0x0EA1C408|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"I/O module 8 temperature fault Multiple I/O module failures" EN_OVER_TEMP_SWITCH_9|0x0EA1C409|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"I/O module 9 temperature fault Multiple I/O module failures" EN_OVER_TEMP_SWITCH_10|0x0EA1C40A|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"I/O module 10 temperature fault Multiple I/O module failures" EN_OVER_TEMP_WARN_SWITCH_1|0x0EA1D401|SAHPI_MAJOR|OVR_SEV,OVR_RID|"I/O module 1 Temperature Warning" EN_OVER_TEMP_WARN_SWITCH_1|0x0EA1D401|SAHPI_MAJOR|OVR_SEV,OVR_RID|"I/O Module 1 over recommended temperature" EN_OVER_TEMP_WARN_SWITCH_2|0x0EA1D402|SAHPI_MAJOR|OVR_SEV,OVR_RID|"I/O module 2 Temperature Warning" EN_OVER_TEMP_WARN_SWITCH_2|0x0EA1D402|SAHPI_MAJOR|OVR_SEV,OVR_RID|"I/O Module 2 over recommended temperature" EN_OVER_TEMP_WARN_SWITCH_3|0x0EA1D403|SAHPI_MAJOR|OVR_SEV,OVR_RID|"I/O module 3 Temperature Warning" EN_OVER_TEMP_WARN_SWITCH_3|0x0EA1D403|SAHPI_MAJOR|OVR_SEV,OVR_RID|"I/O Module 3 over recommended temperature" EN_OVER_TEMP_WARN_SWITCH_4|0x0EA1D404|SAHPI_MAJOR|OVR_SEV,OVR_RID|"I/O module 4 Temperature Warning" EN_OVER_TEMP_WARN_SWITCH_4|0x0EA1D404|SAHPI_MAJOR|OVR_SEV,OVR_RID|"I/O Module 4 over recommended temperature" EN_OVER_TEMP_WARN_SWITCH_5|0x0EA1D405|SAHPI_MAJOR|OVR_SEV,OVR_RID|"I/O Module 5 over recommended temperature" EN_OVER_TEMP_WARN_SWITCH_6|0x0EA1D406|SAHPI_MAJOR|OVR_SEV,OVR_RID|"I/O Module 6 over recommended temperature" EN_OVER_TEMP_WARN_SWITCH_7|0x0EA1D407|SAHPI_MAJOR|OVR_SEV,OVR_RID|"I/O Module 7 over recommended temperature" EN_OVER_TEMP_WARN_SWITCH_8|0x0EA1D408|SAHPI_MAJOR|OVR_SEV,OVR_RID|"I/O Module 8 over recommended temperature" EN_OVER_TEMP_WARN_SWITCH_9|0x0EA1D409|SAHPI_MAJOR|OVR_SEV,OVR_RID|"I/O Module 9 over recommended temperature" EN_OVER_TEMP_WARN_SWITCH_10|0x0EA1D40A|SAHPI_MAJOR|OVR_SEV,OVR_RID|"I/O Module 10 over recommended temperature" EN_OVER_TEMP_WARN_SWITCH_1|0x0EA1D401|SAHPI_MAJOR|OVR_SEV,OVR_RID|"I/O module 1 Temperature Warning Multiple I/O module failures" EN_OVER_TEMP_WARN_SWITCH_1|0x0EA1D401|SAHPI_MAJOR|OVR_SEV,OVR_RID|"I/O Module 1 over recommended temperature Multiple I/O module failures" EN_OVER_TEMP_WARN_SWITCH_2|0x0EA1D402|SAHPI_MAJOR|OVR_SEV,OVR_RID|"I/O module 2 Temperature Warning Multiple I/O module failures" EN_OVER_TEMP_WARN_SWITCH_2|0x0EA1D402|SAHPI_MAJOR|OVR_SEV,OVR_RID|"I/O Module 2 over recommended temperature Multiple I/O module failures" EN_OVER_TEMP_WARN_SWITCH_3|0x0EA1D403|SAHPI_MAJOR|OVR_SEV,OVR_RID|"I/O module 3 Temperature Warning Multiple I/O module failures" EN_OVER_TEMP_WARN_SWITCH_3|0x0EA1D403|SAHPI_MAJOR|OVR_SEV,OVR_RID|"I/O Module 3 over recommended temperature Multiple I/O module failures" EN_OVER_TEMP_WARN_SWITCH_4|0x0EA1D404|SAHPI_MAJOR|OVR_SEV,OVR_RID|"I/O module 4 Temperature Warning Multiple I/O module failures" EN_OVER_TEMP_WARN_SWITCH_4|0x0EA1D404|SAHPI_MAJOR|OVR_SEV,OVR_RID|"I/O Module 4 over recommended temperature Multiple I/O module failures" EN_OVER_TEMP_WARN_SWITCH_5|0x0EA1D405|SAHPI_MAJOR|OVR_SEV,OVR_RID|"I/O Module 5 over recommended temperature Multiple I/O module failures" EN_OVER_TEMP_WARN_SWITCH_6|0x0EA1D406|SAHPI_MAJOR|OVR_SEV,OVR_RID|"I/O Module 6 over recommended temperature Multiple I/O module failures" EN_OVER_TEMP_WARN_SWITCH_7|0x0EA1D407|SAHPI_MAJOR|OVR_SEV,OVR_RID|"I/O Module 7 over recommended temperature Multiple I/O module failures" EN_OVER_TEMP_WARN_SWITCH_8|0x0EA1D408|SAHPI_MAJOR|OVR_SEV,OVR_RID|"I/O Module 8 over recommended temperature Multiple I/O module failures" EN_OVER_TEMP_WARN_SWITCH_9|0x0EA1D409|SAHPI_MAJOR|OVR_SEV,OVR_RID|"I/O Module 9 over recommended temperature Multiple I/O module failures" EN_OVER_TEMP_WARN_SWITCH_10|0x0EA1D40A|SAHPI_MAJOR|OVR_SEV,OVR_RID|"I/O Module 10 over recommended temperature Multiple I/O module failures" # I/O Module Management Bus Operational Status Sensor - event only EN_STCONN_FAIL_SWITCH_1|0x0EA22001|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"Connectivity status switch 1 communication failed" EN_STCONN_FAIL_SWITCH_2|0x0EA22002|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"Connectivity status switch 2 communication failed" EN_STCONN_FAIL_SWITCH_3|0x0EA22003|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"Connectivity status switch 3 communication failed" EN_STCONN_FAIL_SWITCH_4|0x0EA22004|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"Connectivity status switch 4 communication failed" EN_STCONN_FAIL_SWITCH_5|0x0EA22005|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"Connectivity status switch 5 communication failed" EN_STCONN_FAIL_SWITCH_6|0x0EA22006|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"Connectivity status switch 6 communication failed" EN_STCONN_FAIL_SWITCH_7|0x0EA22007|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"Connectivity status switch 7 communication failed" EN_STCONN_FAIL_SWITCH_8|0x0EA22008|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"Connectivity status switch 8 communication failed" EN_STCONN_FAIL_SWITCH_9|0x0EA22009|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"Connectivity status switch 9 communication failed" EN_STCONN_FAIL_SWITCH_10|0x0EA2200A|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"Connectivity status switch 10 communication failed" ######################## # Blower Module Resource ######################## # There are not separate hot-swap installed/removed events for fans. # These events represent fan removal; the recovery of these events represent an install. EN_FAULT_FAN1|0x0A026001|SAHPI_INFORMATIONAL|OVR_SEV,OVR_RID|"Blower 1 Fault Multiple blower failures" EN_FAULT_FAN1|0x0A026001|SAHPI_INFORMATIONAL|OVR_SEV,OVR_RID|"Blower 1 Fault Single blower failure" EN_FAULT_FAN1|0x0A026001|SAHPI_INFORMATIONAL|OVR_SEV,OVR_RID|"Blower 1 Fault" EN_FAULT_FAN2|0x0A026002|SAHPI_INFORMATIONAL|OVR_SEV,OVR_RID|"Blower 2 Fault Multiple blower failures" EN_FAULT_FAN2|0x0A026002|SAHPI_INFORMATIONAL|OVR_SEV,OVR_RID|"Blower 2 Fault Single blower failure" EN_FAULT_FAN2|0x0A026002|SAHPI_INFORMATIONAL|OVR_SEV,OVR_RID|"Blower 2 Fault" EN_FAULT_FAN3|0x0A026003|SAHPI_INFORMATIONAL|OVR_SEV,OVR_RID|"Blower 3 Fault Multiple blower failures" EN_FAULT_FAN3|0x0A026003|SAHPI_INFORMATIONAL|OVR_SEV,OVR_RID|"Blower 3 Fault Single blower failure" EN_FAULT_FAN3|0x0A026003|SAHPI_INFORMATIONAL|OVR_SEV,OVR_RID|"Blower 3 Fault" EN_FAULT_FAN4|0x0A026004|SAHPI_INFORMATIONAL|OVR_SEV,OVR_RID|"Blower 4 Fault Multiple blower failures" EN_FAULT_FAN4|0x0A026004|SAHPI_INFORMATIONAL|OVR_SEV,OVR_RID|"Blower 4 Fault Single blower failure" EN_FAULT_FAN4|0x0A026004|SAHPI_INFORMATIONAL|OVR_SEV,OVR_RID|"Blower 4 Fault" # For newer AMM code levels there are installed/removed events EN_FAULT_FAN1|0x0A026001|SAHPI_INFORMATIONAL|OVR_SEV,OVR_RID|"Blower 1 removed Multiple blower failures" EN_FAULT_FAN1|0x0A026001|SAHPI_INFORMATIONAL|OVR_SEV,OVR_RID|"Blower 1 removed Single blower failure" EN_FAULT_FAN1|0x0A026001|SAHPI_INFORMATIONAL|OVR_SEV,OVR_RID|"Blower 1 removed" EN_FAULT_FAN2|0x0A026002|SAHPI_INFORMATIONAL|OVR_SEV,OVR_RID|"Blower 2 removed Multiple blower failures" EN_FAULT_FAN2|0x0A026002|SAHPI_INFORMATIONAL|OVR_SEV,OVR_RID|"Blower 2 removed Single blower failure" EN_FAULT_FAN2|0x0A026002|SAHPI_INFORMATIONAL|OVR_SEV,OVR_RID|"Blower 2 removed" EN_FAULT_FAN3|0x0A026003|SAHPI_INFORMATIONAL|OVR_SEV,OVR_RID|"Blower 3 removed Multiple blower failures" EN_FAULT_FAN3|0x0A026003|SAHPI_INFORMATIONAL|OVR_SEV,OVR_RID|"Blower 3 removed Single blower failure" EN_FAULT_FAN3|0x0A026003|SAHPI_INFORMATIONAL|OVR_SEV,OVR_RID|"Blower 3 removed" EN_FAULT_FAN4|0x0A026004|SAHPI_INFORMATIONAL|OVR_SEV,OVR_RID|"Blower 4 removed Multiple blower failures" EN_FAULT_FAN4|0x0A026004|SAHPI_INFORMATIONAL|OVR_SEV,OVR_RID|"Blower 4 removed Single blower failure" EN_FAULT_FAN4|0x0A026004|SAHPI_INFORMATIONAL|OVR_SEV,OVR_RID|"Blower 4 removed" EN_FAN_1_INSTALLED|0x0A002001|SAHPI_INFORMATIONAL|OVR_SEV,OVR_RID|"Blower 1 installed" EN_FAN_2_INSTALLED|0x0A002002|SAHPI_INFORMATIONAL|OVR_SEV,OVR_RID|"Blower 2 installed" EN_FAN_3_INSTALLED|0x0A002003|SAHPI_INFORMATIONAL|OVR_SEV,OVR_RID|"Blower 3 installed" EN_FAN_4_INSTALLED|0x0A002004|SAHPI_INFORMATIONAL|OVR_SEV,OVR_RID|"Blower 4 installed" ####################### # Blower Module Sensors ####################### # Blower Operational Status Sensor EN_FAN1_SPEED|0x00026801|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"Blower 1 Failure Multiple blower failures" EN_FAN1_SPEED|0x00026801|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"Blower 1 Failure Single blower failure" EN_FAN1_SPEED|0x00026801|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"Blower 1 Failure" EN_FAN1_SPEED|0x00026801|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"Blower 1 failure Multiple blower failures" EN_FAN1_SPEED|0x00026801|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"Blower 1 failure Single blower failure" EN_FAN1_SPEED|0x00026801|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"Blower 1 failure" EN_FAN2_SPEED|0x00026802|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"Blower 2 Failure Multiple blower failures" EN_FAN2_SPEED|0x00026802|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"Blower 2 Failure Single blower failure" EN_FAN2_SPEED|0x00026802|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"Blower 2 Failure" EN_FAN2_SPEED|0x00026802|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"Blower 2 failure Multiple blower failures" EN_FAN2_SPEED|0x00026802|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"Blower 2 failure Single blower failure" EN_FAN2_SPEED|0x00026802|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"Blower 2 failure" EN_FAN3_SPEED|0x00026803|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"Blower 3 Failure Multiple blower failures" EN_FAN3_SPEED|0x00026803|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"Blower 3 Failure Single blower failure" EN_FAN3_SPEED|0x00026803|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"Blower 3 Failure" EN_FAN3_SPEED|0x00026803|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"Blower 3 failure Multiple blower failures" EN_FAN3_SPEED|0x00026803|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"Blower 3 failure Single blower failure" EN_FAN3_SPEED|0x00026803|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"Blower 3 failure" EN_FAN4_SPEED|0x00026804|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"Blower 4 Failure Multiple blower failures" EN_FAN4_SPEED|0x00026804|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"Blower 4 Failure Single blower failure" EN_FAN4_SPEED|0x00026804|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"Blower 4 Failure" EN_FAN4_SPEED|0x00026804|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"Blower 4 failure Multiple blower failures" EN_FAN4_SPEED|0x00026804|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"Blower 4 failure Single blower failure" EN_FAN4_SPEED|0x00026804|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"Blower 4 failure" EN_UNREC_FAN1|0x0B026001|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"Unrecognized Blower 1" EN_UNREC_FAN2|0x0B026002|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"Unrecognized Blower 2" EN_UNREC_FAN3|0x0B026003|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"Unrecognized Blower 3" EN_UNREC_FAN4|0x0B026004|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"Unrecognized Blower 4" EN_UNREC_FAN5|0x0B026005|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"Unrecognized Blower 5" EN_UNREC_FAN6|0x0B026006|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"Unrecognized Blower 6" EN_UNREC_FAN7|0x0B026007|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"Unrecognized Blower 7" EN_UNREC_FAN8|0x0B026008|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"Unrecognized Blower 8" EN_UNREC_FAN9|0x0B026009|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"Unrecognized Blower 9" # Blower Management Bus Operational Status Sensor - event only EN_STCONN_FAIL_BLOWER_1|0x000A2001|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"Connectivity status blower module 1 communication failed" EN_STCONN_FAIL_BLOWER_2|0x000A2002|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"Connectivity status blower module 2 communication failed" EN_STCONN_FAIL_BLOWER_3|0x000A2003|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"Connectivity status blower module 3 communication failed" EN_STCONN_FAIL_BLOWER_4|0x000A2004|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"Connectivity status blower module 4 communication failed" # Blower Speed Percentage (Percent of Max) Sensor EN_FAN1_PFA|0x000A6001|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"Blower 1 Outside Recommended Speed" EN_FAN1_PFA|0x000A6001|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"Blower 1 outside of recommended speed" EN_FAN2_PFA|0x000A6002|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"Blower 2 Outside Recommended Speed" EN_FAN2_PFA|0x000A6002|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"Blower 2 outside of recommended speed" EN_FAN3_PFA|0x000A6003|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"Blower 3 Outside Recommended Speed" EN_FAN3_PFA|0x000A6003|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"Blower 3 outside of recommended speed" EN_FAN4_PFA|0x000A6004|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"Blower 4 Outside Recommended Speed" EN_FAN4_PFA|0x000A6004|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"Blower 4 outside of recommended speed" # Blower RPM Speed Sensor # None ####################### # Power Module Resource ####################### EN_PS1_INSTALLED|0x08216001|SAHPI_INFORMATIONAL|OVR_SEV,OVR_RID|"Power Supply 1 was installed" EN_PS1_INSTALLED|0x08216001|SAHPI_INFORMATIONAL|OVR_SEV,OVR_RID|"Power Module 1 installed" EN_PS2_INSTALLED|0x08216002|SAHPI_INFORMATIONAL|OVR_SEV,OVR_RID|"Power Supply 2 was installed" EN_PS2_INSTALLED|0x08216002|SAHPI_INFORMATIONAL|OVR_SEV,OVR_RID|"Power Module 2 installed" EN_PS3_INSTALLED|0x08216003|SAHPI_INFORMATIONAL|OVR_SEV,OVR_RID|"Power Supply 3 was installed" EN_PS3_INSTALLED|0x08216003|SAHPI_INFORMATIONAL|OVR_SEV,OVR_RID|"Power Module 3 installed" EN_PS4_INSTALLED|0x08216004|SAHPI_INFORMATIONAL|OVR_SEV,OVR_RID|"Power Supply 4 was installed" EN_PS4_INSTALLED|0x08216004|SAHPI_INFORMATIONAL|OVR_SEV,OVR_RID|"Power Module 4 installed" EN_FAULT_PS1_REMOVED|0x0821E001|SAHPI_INFORMATIONAL|OVR_SEV,OVR_RID|"Power Supply 1 Removed" EN_FAULT_PS1_REMOVED|0x0821E001|SAHPI_INFORMATIONAL|OVR_SEV,OVR_RID|"Power Module 1 removed" EN_FAULT_PS1_REMOVED|0x0821E001|SAHPI_INFORMATIONAL|OVR_SEV,OVR_RID|"Power Module 1 Removed" EN_FAULT_PS2_REMOVED|0x0821E002|SAHPI_INFORMATIONAL|OVR_SEV,OVR_RID|"Power Supply 2 Removed" EN_FAULT_PS2_REMOVED|0x0821E002|SAHPI_INFORMATIONAL|OVR_SEV,OVR_RID|"Power Module 2 removed" EN_FAULT_PS2_REMOVED|0x0821E002|SAHPI_INFORMATIONAL|OVR_SEV,OVR_RID|"Power Module 2 Removed" EN_FAULT_PS3_REMOVED|0x0821E003|SAHPI_INFORMATIONAL|OVR_SEV,OVR_RID|"Power Supply 3 Removed" EN_FAULT_PS3_REMOVED|0x0821E003|SAHPI_INFORMATIONAL|OVR_SEV,OVR_RID|"Power Module 3 removed" EN_FAULT_PS3_REMOVED|0x0821E003|SAHPI_INFORMATIONAL|OVR_SEV,OVR_RID|"Power Module 3 Removed" EN_FAULT_PS4_REMOVED|0x0821E004|SAHPI_INFORMATIONAL|OVR_SEV,OVR_RID|"Power Supply 4 Removed" EN_FAULT_PS4_REMOVED|0x0821E004|SAHPI_INFORMATIONAL|OVR_SEV,OVR_RID|"Power Module 4 removed" EN_FAULT_PS4_REMOVED|0x0821E004|SAHPI_INFORMATIONAL|OVR_SEV,OVR_RID|"Power Module 4 Removed" ###################### # Power Module Sensors ###################### # Power Module Operational Status Sensor #### Mapped to Off-line Operational State EN_FAULT_PS1|0x08200001|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"Power Supply 1 Fault" EN_FAULT_PS1|0x08200001|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"Power Module 1 communication failure" EN_FAULT_PS2|0x08200002|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"Power Supply 2 Fault" EN_FAULT_PS2|0x08200002|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"Power Module 2 communication failure" EN_FAULT_PS3|0x08200003|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"Power Supply 3 Fault" EN_FAULT_PS3|0x08200003|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"Power Module 3 communication failure" EN_FAULT_PS4|0x08200004|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"Power Supply 4 Fault" EN_FAULT_PS4|0x08200004|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"Power Module 4 communication failure" EN_FAULT_PS1_12V_OVR_CUR|0x08236001|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"Power Supply 1 12V Over Current Fault" EN_FAULT_PS1_12V_OVR_CUR|0x08236001|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"Power Module 1 over current fault" EN_FAULT_PS2_12V_OVR_CUR|0x08236002|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"Power Supply 2 12V Over Current Fault" EN_FAULT_PS2_12V_OVR_CUR|0x08236002|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"Power Module 2 over current fault" EN_FAULT_PS3_12V_OVR_CUR|0x08236003|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"Power Supply 3 12V Over Current Fault" EN_FAULT_PS3_12V_OVR_CUR|0x08236003|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"Power Module 3 over current fault" EN_FAULT_PS4_12V_OVR_CUR|0x08236004|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"Power Supply 4 12V Over Current Fault" EN_FAULT_PS4_12V_OVR_CUR|0x08236004|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"Power Module 4 over current fault" EN_FAULT_PS1_DC_GOOD|0x08028001|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"Power Supply 1 DC Good Fault" EN_FAULT_PS1_DC_GOOD|0x08028001|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"Power Module 1 is off, DC fault" EN_FAULT_PS2_DC_GOOD|0x08028002|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"Power Supply 2 DC Good Fault" EN_FAULT_PS2_DC_GOOD|0x08028002|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"Power Module 2 is off, DC fault" EN_FAULT_PS3_DC_GOOD|0x08028003|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"Power Supply 3 DC Good Fault" EN_FAULT_PS3_DC_GOOD|0x08028003|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"Power Module 3 is off, DC fault" EN_FAULT_PS4_DC_GOOD|0x08028004|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"Power Supply 4 DC Good Fault" EN_FAULT_PS4_DC_GOOD|0x08028004|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"Power Module 4 is off, DC fault" EN_FAULT_PS1_12V_OVER|0x08236481|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"Power Supply 1 12V Over Voltage Fault" EN_FAULT_PS1_12V_OVER|0x08236481|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"Power Module 1 over voltage fault" EN_FAULT_PS2_12V_OVER|0x08236482|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"Power Supply 2 12V Over Voltage Fault" EN_FAULT_PS2_12V_OVER|0x08236482|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"Power Module 2 over voltage fault" EN_FAULT_PS3_12V_OVER|0x08236483|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"Power Supply 3 12V Over Voltage Fault" EN_FAULT_PS3_12V_OVER|0x08236483|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"Power Module 3 over voltage fault" EN_FAULT_PS4_12V_OVER|0x08236484|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"Power Supply 4 12V Over Voltage Fault" EN_FAULT_PS4_12V_OVER|0x08236484|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"Power Module 4 over voltage fault" EN_FAULT_PS1_12V_UNDER|0x08236801|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"Power Supply 1 12V Under Voltage Fault" EN_FAULT_PS1_12V_UNDER|0x08236801|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"Power Module 1 under voltage fault" EN_FAULT_PS2_12V_UNDER|0x08236802|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"Power Supply 2 12V Under Voltage Fault" EN_FAULT_PS2_12V_UNDER|0x08236802|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"Power Module 2 under voltage fault" EN_FAULT_PS3_12V_UNDER|0x08236803|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"Power Supply 3 12V Under Voltage Fault" EN_FAULT_PS3_12V_UNDER|0x08236803|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"Power Module 3 under voltage fault" EN_FAULT_PS4_12V_UNDER|0x08236804|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"Power Supply 4 12V Under Voltage Fault" EN_FAULT_PS4_12V_UNDER|0x08236804|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"Power Module 4 under voltage fault" EN_FAULT_PS1_EPOW|0x08180001|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"Input Voltage Removed from Power Supply 1" EN_FAULT_PS2_EPOW|0x08180002|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"Input Voltage Removed from Power Supply 2" EN_FAULT_PS3_EPOW|0x08180003|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"Input Voltage Removed from Power Supply 3" EN_FAULT_PS4_EPOW|0x08180004|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"Input Voltage Removed from Power Supply 4" #### Mapped to Degraded Operational State EN_FAULT_PS1_CUR_FAIL|0x0821A001|SAHPI_INFORMATIONAL|OVR_SEV,OVR_RID|"Power Supply 1 Current Fault" EN_FAULT_PS1_CUR_FAIL|0x0821A001|SAHPI_INFORMATIONAL|OVR_SEV,OVR_RID|"Power Module 1 current share mis-match" EN_FAULT_PS2_CUR_FAIL|0x0821A002|SAHPI_INFORMATIONAL|OVR_SEV,OVR_RID|"Power Supply 2 Current Fault" EN_FAULT_PS2_CUR_FAIL|0x0821A002|SAHPI_INFORMATIONAL|OVR_SEV,OVR_RID|"Power Module 2 current share mis-match" EN_FAULT_PS3_CUR_FAIL|0x0821A003|SAHPI_INFORMATIONAL|OVR_SEV,OVR_RID|"Power Supply 3 Current Fault" EN_FAULT_PS3_CUR_FAIL|0x0821A003|SAHPI_INFORMATIONAL|OVR_SEV,OVR_RID|"Power Module 3 current share mis-match" EN_FAULT_PS4_CUR_FAIL|0x0821A004|SAHPI_INFORMATIONAL|OVR_SEV,OVR_RID|"Power Supply 4 Current Fault" EN_FAULT_PS4_CUR_FAIL|0x0821A004|SAHPI_INFORMATIONAL|OVR_SEV,OVR_RID|"Power Module 4 current share mis-match" # Power Module Management Bus Operational Status Sensor - event only EN_STCONN_FAIL_POWER_1|0x08222001|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"Connectivity status power module 1 communication failed" EN_STCONN_FAIL_POWER_2|0x08222002|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"Connectivity status power module 2 communication failed" EN_STCONN_FAIL_POWER_3|0x08222003|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"Connectivity status power module 3 communication failed" EN_STCONN_FAIL_POWER_4|0x08222004|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"Connectivity status power module 4 communication failed" # Power Module Temperature Sensor - event-only EN_FAULT_PS1_OVR_TEMP|0x0821C081|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"Power Supply 1 Temperature Fault" EN_FAULT_PS1_OVR_TEMP|0x0821C081|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"Power Module 1 temperature fault" EN_FAULT_PS2_OVR_TEMP|0x0821C082|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"Power Supply 2 Temperature Fault" EN_FAULT_PS2_OVR_TEMP|0x0821C082|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"Power Module 2 temperature fault" EN_FAULT_PS3_OVR_TEMP|0x0821C083|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"Power Supply 3 Temperature Fault" EN_FAULT_PS3_OVR_TEMP|0x0821C083|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"Power Module 3 temperature fault" EN_FAULT_PS4_OVR_TEMP|0x0821C084|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"Power Supply 4 Temperature Fault" EN_FAULT_PS4_OVR_TEMP|0x0821C084|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"Power Module 4 temperature fault" EN_FAULT_PS1_TEMP_WARN|0x0821C001|SAHPI_MAJOR|OVR_SEV,OVR_RID|"Power Supply 1 Temperature Warning" EN_FAULT_PS1_TEMP_WARN|0x0821C001|SAHPI_MAJOR|OVR_SEV,OVR_RID|"Power Module 1 has exceeded the warning temperature" EN_FAULT_PS2_TEMP_WARN|0x0821C002|SAHPI_MAJOR|OVR_SEV,OVR_RID|"Power Supply 2 Temperature Warning" EN_FAULT_PS2_TEMP_WARN|0x0821C002|SAHPI_MAJOR|OVR_SEV,OVR_RID|"Power Module 2 has exceeded the warning temperature" EN_FAULT_PS3_TEMP_WARN|0x0821C003|SAHPI_MAJOR|OVR_SEV,OVR_RID|"Power Supply 3 Temperature Warning" EN_FAULT_PS3_TEMP_WARN|0x0821C003|SAHPI_MAJOR|OVR_SEV,OVR_RID|"Power Module 3 has exceeded the warning temperature" EN_FAULT_PS4_TEMP_WARN|0x0821C004|SAHPI_MAJOR|OVR_SEV,OVR_RID|"Power Supply 4 Temperature Warning" EN_FAULT_PS4_TEMP_WARN|0x0821C004|SAHPI_MAJOR|OVR_SEV,OVR_RID|"Power Module 4 has exceeded the warning temperature" # Power Module Fan Pack Operational Sensor EN_FAN_PACK1_SPEED|0x00036801|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"Fan Pack 1 failure" EN_FAN_PACK2_SPEED|0x00036002|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"Fan Pack 2 failure" EN_FAN_PACK3_SPEED|0x00036003|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"Fan Pack 3 failure" EN_FAN_PACK4_SPEED|0x00036004|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"Fan Pack 4 failure" EN_FAN_PACK1_NOT_PRESENT|0x000A7001|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"Fan Pack 1 not present" EN_FAN_PACK2_NOT_PRESENT|0x000A7002|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"Fan Pack 2 not present" EN_FAN_PACK3_NOT_PRESENT|0x000A7003|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"Fan Pack 3 not present" EN_FAN_PACK4_NOT_PRESENT|0x000A7004|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"Fan Pack 4 not present" # Power Module Fan Pack Average Speed (Percent of Max) Sensor EN_FAN_PACK1_PFA|0x000B6001|SAHPI_MAJOR|OVR_SEV,OVR_RID|"Fan pack 1 outside recommended speed" EN_FAN_PACK2_PFA|0x000B6002|SAHPI_MAJOR|OVR_SEV,OVR_RID|"Fan pack 2 outside recommended speed" EN_FAN_PACK3_PFA|0x000B6003|SAHPI_MAJOR|OVR_SEV,OVR_RID|"Fan pack 3 outside recommended speed" EN_FAN_PACK4_PFA|0x000B6004|SAHPI_MAJOR|OVR_SEV,OVR_RID|"Fan pack 4 outside recommended speed" # Power Module Fan Pack Average RPM Speed Sensor # None ############################# # Alarm Panel Module Resource ############################# EN_AP_INSTALLED|0x6F60A001|SAHPI_INFORMATIONAL|OVR_SEV,OVR_RID|"Alarm Panel module installed" EN_AP_REMOVED|0x6F60A002|SAHPI_INFORMATIONAL|OVR_SEV,OVR_RID|"Alarm Panel module removed" ############################ # Alarm Panel Module Sensors ############################ # Alarm Panel Module Operational Status Sensor EN_AP_HW_FAILURE|0x6F60A101|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"Alarm Panel hardware failure" ##################### # Mux Module Resource ##################### EN_MX_1_INSTALLED|0x6F608001|SAHPI_INFORMATIONAL|OVR_SEV,OVR_RID|"Multiplexer Expansion Module 1 installed" EN_MX_2_INSTALLED|0x6F608002|SAHPI_INFORMATIONAL|OVR_SEV,OVR_RID|"Multiplexer Expansion Module 2 installed" EN_MX_1_REMOVED|0x6F609001|SAHPI_INFORMATIONAL|OVR_SEV,OVR_RID|"Multiplexer Expansion Module 1 removed" EN_MX_2_REMOVED|0x6F609002|SAHPI_INFORMATIONAL|OVR_SEV,OVR_RID|"Multiplexer Expansion Module 2 removed" #################### # Mux Module Sensors #################### # Mux Module Operational Status Sensor EN_MX_1_HW_FAILURE|0x6F60D001|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"Connectivity to the active Multiplexer Expansion module 1 failed" EN_MX_2_HW_FAILURE|0x6F60D002|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"Connectivity to the active Multiplexer Expansion module 2 failed" ############################### # Network Clock Module Resource ############################### EN_NC_1_INSTALLED|0x6F606001|SAHPI_INFORMATIONAL|OVR_SEV,OVR_RID|"Network Clock module 1 installed" EN_NC_2_INSTALLED|0x6F606002|SAHPI_INFORMATIONAL|OVR_SEV,OVR_RID|"Network Clock module 2 installed" EN_NC_1_REMOVED|0x6F607001|SAHPI_INFORMATIONAL|OVR_SEV,OVR_RID|"Network Clock module 1 removed" EN_NC_2_REMOVED|0x6F607002|SAHPI_INFORMATIONAL|OVR_SEV,OVR_RID|"Network Clock module 2 removed" ############################## # Network Clock Module Sensors ############################## # Network Clock Module Operational Status Sensor EN_NC_1_HW_FAILURE|0x6F607101|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"Network Clock module 1 hardware failure" EN_NC_2_HW_FAILURE|0x6F607102|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"Network Clock module 2 hardware failure" ###################### # Front Bezel Resource ###################### EN_FB_INSTALLED|0x6F60B001|SAHPI_INFORMATIONAL|OVR_SEV,OVR_RID|"Front Bezel installed" EN_FB_REMOVED|0x6F60B101|SAHPI_INFORMATIONAL|OVR_SEV,OVR_RID|"Front Bezel removed" ##################### # Front Bezel Sensors ##################### # FIXME:: ADD filter sensor events here for BCHT only ######################## # MM Interposer Resource ######################## EN_MM_INP_1_INSTALLED|0x6F600001|SAHPI_INFORMATIONAL|OVR_SEV,OVR_RID|"Management Module Interposer 1 installed" EN_MM_INP_2_INSTALLED|0x6F600002|SAHPI_INFORMATIONAL|OVR_SEV,OVR_RID|"Management Module Interposer 2 installed" EN_MM_INP_1_REMOVED|0x6F601001|SAHPI_INFORMATIONAL|OVR_SEV,OVR_RID|"Management Module Interposer 1 removed" EN_MM_INP_2_REMOVED|0x6F601002|SAHPI_INFORMATIONAL|OVR_SEV,OVR_RID|"Management Module Interposer 2 removed" ####################### # MM Interposer Sensors ####################### # None ######################### # I/O Interposer Resource ######################### EN_IO_INP_1_INSTALLED|0x6F602001|SAHPI_INFORMATIONAL|OVR_SEV,OVR_RID|"I/O Module Interposer 1 installed" EN_IO_INP_2_INSTALLED|0x6F602002|SAHPI_INFORMATIONAL|OVR_SEV,OVR_RID|"I/O Module Interposer 2 installed" EN_IO_INP_3_INSTALLED|0x6F602003|SAHPI_INFORMATIONAL|OVR_SEV,OVR_RID|"I/O Module Interposer 3 installed" EN_IO_INP_4_INSTALLED|0x6F602004|SAHPI_INFORMATIONAL|OVR_SEV,OVR_RID|"I/O Module Interposer 4 installed" EN_IO_INP_5_INSTALLED|0x6F602005|SAHPI_INFORMATIONAL|OVR_SEV,OVR_RID|"I/O Module Interposer 5 installed" EN_IO_INP_6_INSTALLED|0x6F602006|SAHPI_INFORMATIONAL|OVR_SEV,OVR_RID|"I/O Module Interposer 6 installed" EN_IO_INP_7_INSTALLED|0x6F602007|SAHPI_INFORMATIONAL|OVR_SEV,OVR_RID|"I/O Module Interposer 7 installed" EN_IO_INP_8_INSTALLED|0x6F602008|SAHPI_INFORMATIONAL|OVR_SEV,OVR_RID|"I/O Module Interposer 8 installed" EN_IO_INP_9_INSTALLED|0x6F602009|SAHPI_INFORMATIONAL|OVR_SEV,OVR_RID|"I/O Module Interposer 9 installed" EN_IO_INP_10_INSTALLED|0x6F60200A|SAHPI_INFORMATIONAL|OVR_SEV,OVR_RID|"I/O Module Interposer 10 installed" EN_IO_INP_1_REMOVED|0x6F603001|SAHPI_INFORMATIONAL|OVR_SEV,OVR_RID|"I/O Module Interposer 1 removed" EN_IO_INP_2_REMOVED|0x6F603002|SAHPI_INFORMATIONAL|OVR_SEV,OVR_RID|"I/O Module Interposer 2 removed" EN_IO_INP_3_REMOVED|0x6F603003|SAHPI_INFORMATIONAL|OVR_SEV,OVR_RID|"I/O Module Interposer 3 removed" EN_IO_INP_4_REMOVED|0x6F603004|SAHPI_INFORMATIONAL|OVR_SEV,OVR_RID|"I/O Module Interposer 4 removed" EN_IO_INP_5_REMOVED|0x6F603005|SAHPI_INFORMATIONAL|OVR_SEV,OVR_RID|"I/O Module Interposer 5 removed" EN_IO_INP_6_REMOVED|0x6F603006|SAHPI_INFORMATIONAL|OVR_SEV,OVR_RID|"I/O Module Interposer 6 removed" EN_IO_INP_7_REMOVED|0x6F603007|SAHPI_INFORMATIONAL|OVR_SEV,OVR_RID|"I/O Module Interposer 7 removed" EN_IO_INP_8_REMOVED|0x6F603008|SAHPI_INFORMATIONAL|OVR_SEV,OVR_RID|"I/O Module Interposer 8 removed" EN_IO_INP_9_REMOVED|0x6F603009|SAHPI_INFORMATIONAL|OVR_SEV,OVR_RID|"I/O Module Interposer 9 removed" EN_IO_INP_10_REMOVED|0x6F60300A|SAHPI_INFORMATIONAL|OVR_SEV,OVR_RID|"I/O Module Interposer 10 removed" ######################## # I/O Interposer Sensors ######################## # None ########################################### # Remote System Adapter (RSA) Unique Events ########################################### ###################### # RSA Chassis Resource ###################### # None ##################### # RSA Chassis Sensors ##################### # RSA planar temperature sensor #EN_CUTOFF_HI_OVER_TEMP_PLANAR|0x0601C480|SAHPI_CRITICAL|OVR_SEV|"System shutoff due to board over temperature" EN_OVER_TEMP_PLANAR|0x0601C080|SAHPI_CRITICAL|OVR_SEV|"PLANAR Over Temperature" #EN_PFA_HI_OVER_TEMP_PLANAR|0x0601D500|SAHPI_MAJOR|OVR_SEV|"System board is over recommended temperature" # RSA CPU area thermal sensor EN_CUTOFF_HI_OVER_TEMP_PROC|0x0401C480|SAHPI_CRITICAL|OVR_SEV|"System shutoff due to Processor area over temperature" EN_PFA_HI_OVER_TEMP_PROC|0x0401D400|SAHPI_MAJOR|OVR_SEV|"System over recommended temperature for Processor area" # RSA I/O thermal sensor # None # RSA system ambient thermal sensor EN_TEMP|0x00000064|SAHPI_CRITICAL|OVR_SEV|"System cutoff temperature exceed" EN_OVER_TEMP|0x0001C000|SAHPI_CRITICAL|OVR_SEV|"Over Temperature" EN_OVER_TEMP_AMBIENT|0x0001C080|SAHPI_CRITICAL|OVR_SEV|"System ambient temperature is too high" #EN_CUTOFF_HI_OVER_TEMP_AMBIENT|0x0001C480|SAHPI_CRITICAL|OVR_SEV|"System shutoff due to high ambient temperature" #EN_PFA_HI_OVER_TEMP_AMBIENT|0x0001D500|SAHPI_MAJOR|OVR_SEV|"System over recommended ambient temperature" EN_NC_TEMP|0x0000006E|SAHPI_MAJOR|OVR_SEV|"System over recommended temperature" # RSA memory thermal sensor EN_CUTOFF_HI_OVER_TEMP_MEM_AREA|0x0501C480|SAHPI_CRITICAL|OVR_SEV|"System shutoff due to Memory area over temperature" EN_CUTOFF_HI_OVER_TEMP_MEMORY1|0x0501C481|SAHPI_CRITICAL|OVR_SEV|"System shutoff due to memory planar 1 over hard shutoff temperature" EN_CUTOFF_HI_OVER_TEMP_MEMORY2|0x0501C482|SAHPI_CRITICAL|OVR_SEV|"System shutoff due to memory planar 2 over hard shutoff temperature" EN_PFA_HI_OVER_TEMP_MEM_AREA|0x0501D400|SAHPI_MAJOR|OVR_SEV|"System over recommended temperature for Memory area" EN_PFA_HI_OVER_TEMP_MEMORY1|0x0501D501|SAHPI_CRITICAL|OVR_SEV|"System over recommended temperature for memory planar 1" EN_PFA_HI_OVER_TEMP_MEMORY2|0x0501D502|SAHPI_CRITICAL|OVR_SEV|"System over recommended temperature for memory planar 2" # RSA planar 5V sensor #EN_CUTOFF_HI_FAULT_PLANAR_5V|0x06034480|SAHPI_CRITICAL|OVR_SEV|"System shutoff due to +5v over voltage" #EN_CUTOFF_LO_FAULT_PLANAR_5V|0x06034800|SAHPI_CRITICAL|OVR_SEV|"System shutoff due to +5v under voltage" EN_CUTOFF_HI_FAULT_5V|0x08034480|SAHPI_CRITICAL|OVR_SEV|"System shutoff due to 5V Fault Over max value" EN_CUTOFF_LO_FAULT_5V|0x08034800|SAHPI_CRITICAL|OVR_SEV|"System shutoff due to 5V Fault under min value" #EN_PFA_HI_FAULT_PLANAR_5V|0x06035500|SAHPI_MAJOR|OVR_SEV|"System over recommended voltage for +5v" #EN_PFA_LO_FAULT_PLANAR_5V|0x06035800|SAHPI_MAJOR|OVR_SEV|"System under recommended voltage for +5v" # RSA planar 3.3V sensor #EN_CUTOFF_HI_FAULT_3_35V|0x08032480|SAHPI_CRITICAL|OVR_SEV|"System shutoff due to +3.3v over voltage" #EN_CUTOFF_LO_FAULT_3_35V|0x08032880|SAHPI_CRITICAL|OVR_SEV|"System shutoff due to +3.3v under voltage" EN_CUTOFF_HI_FAULT_3_35V_CONT|0x0002C480|SAHPI_CRITICAL|OVR_SEV|"System shutoff due to Continuous 3.3V over max allowed" EN_CUTOFF_LO_FAULT_3_35V_CONT|0x0002C880|SAHPI_CRITICAL|OVR_SEV|"System shutoff due to Continuous 3.3V under minimum value" #EN_PFA_HI_FAULT_3_35V|0x08033480|SAHPI_MAJOR|OVR_SEV|"System over recommended voltage on +3.3v" #EN_PFA_LO_FAULT_3_35V|0x08033880|SAHPI_MAJOR|OVR_SEV|"System under recommended voltage on +3.3v" EN_PFA_HI_FAULT_3_35V_CONT|0x0002D400|SAHPI_MAJOR|OVR_SEV|"Continuous 3.3V over recommended value" EN_PFA_LO_FAULT_3_35V_CONT|0x0002D800|SAHPI_MAJOR|OVR_SEV|"Continuous 3.3V under recommended value" # RSA planar 12V sensor #EN_CUTOFF_HI_FAULT_12V_PLANAR|0x06036480|SAHPI_CRITICAL|OVR_SEV|"System shutoff due to +12v over voltage" #EN_CUTOFF_LO_FAULT_12V_PLANAR|0x06036800|SAHPI_CRITICAL|OVR_SEV|"System shutoff due to +12v under voltage" #EN_PFA_HI_FAULT_12V_PLANAR|0x06037500|SAHPI_MAJOR|OVR_SEV|"System over recommended voltage for +12v" #EN_PFA_LO_FAULT_12V_PLANAR|0x06037800|SAHPI_MAJOR|OVR_SEV|"System under recommended voltage for +12v" # RSA planar -12V sensor EN_CUTOFF_HI_FAULT_N12V|0x0803E480|SAHPI_CRITICAL|OVR_SEV|"System shutoff due to -12v over voltage" EN_CUTOFF_LO_FAULT_N12V|0x0803E800|SAHPI_CRITICAL|OVR_SEV|"System shutoff due to -12v under voltage" EN_PFA_HI_FAULT_N12V|0x0803F500|SAHPI_MAJOR|OVR_SEV|"System over recommended voltage for -12v" EN_PFA_LO_FAULT_N12V|0x0803F800|SAHPI_MAJOR|OVR_SEV|"System under recommended voltage for -12v" # RSA planar -5V sensor #EN_CUTOFF_HI_FAULT_N5V|0x0803C480|SAHPI_CRITICAL|OVR_SEV|"System shutoff due to -5v over voltage" #EN_CUTOFF_LO_FAULT_N5V|0x0803C800|SAHPI_CRITICAL|OVR_SEV|"System shutoff due to -5v under voltage" #EN_PFA_HI_FAULT_N5V|0x0803D500|SAHPI_MAJOR|OVR_SEV|"System over recommended voltage for -5v" #EN_PFA_LO_FAULT_N5V|0x803D800|SAHPI_MAJOR|OVR_SEV|"System under recommended voltage for -5v" # RSA planar 2.5V sensor #EN_CUTOFF_HI_FAULT_2_5V|0x08030480|SAHPI_CRITICAL|OVR_SEV|"System shutoff due to +2.5v over voltage" #EN_CUTOFF_LO_FAULT_2_5V|0x08030880|SAHPI_CRITICAL|OVR_SEV|"System shutoff due to +2.5v under voltage" #EN_PFA_HI_FAULT_2_5V|0x08031480|SAHPI_MAJOR|OVR_SEV|"System over recommended voltage on +2.5v" #EN_PFA_LO_FAULT_2_5V|0x08031880|SAHPI_MAJOR|OVR_SEV|"System under recommended voltage on +2.5v" # RSA planar 1.5V sensor EN_CUTOFF_HI_FAULT_1_5V|0x08040480|SAHPI_CRITICAL|OVR_SEV|"System shutoff due to +1.5v over voltage" EN_CUTOFF_LO_FAULT_1_5V|0x08040880|SAHPI_CRITICAL|OVR_SEV|"System shutoff due to +1.5v under voltage" #EN_PFA_HI_FAULT_1_5V|0x08041400|SAHPI_MAJOR|OVR_SEV|"System over recommended voltage on +1.5v" #EN_PFA_LO_FAULT_1_5V|0x08041800|SAHPI_MAJOR|OVR_SEV|"System under recommended voltage on +1.5v" # RSA planar 1.25V sensor EN_CUTOFF_HI_FAULT_1_25V|0x08000480|SAHPI_CRITICAL|OVR_SEV|"System shutoff due to +1.25v over voltage" EN_CUTOFF_LO_FAULT_1_25V|0x08000880|SAHPI_CRITICAL|OVR_SEV|"System shutoff due to +1.25v under voltage" #EN_PFA_HI_FAULT_1_2V|0x08001401|SAHPI_MAJOR|OVR_SEV|"System over recommended voltage on +1.2v" #EN_PFA_LO_FAULT_1_2V|0x08001801|SAHPI_MAJOR|OVR_SEV|"System under recommended voltage on +1.2v" ################## # RSA CPU Resource ################## # None ################# # RSA CPU sensors ################# # RSA CPU thermal sensor #EN_PROC_HOT_CPU1|0x0421C401|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"CPU 1 shut off due to over temperature" #EN_CUTOFF_HI_OVER_TEMP_CPU1|0x0421C481|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"System shutoff due to CPU 1 over temperature" #EN_THERM_TRIP_CPU1|0x0421D081|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"CPU 1 Over Temperature" #EN_PFA_HI_OVER_TEMP_CPU1|0x0421D501|SAHPI_MAJOR|OVR_SEV,OVR_RID|"System over temperature for CPU 1" #EN_PROC_HOT_CPU2|0x0421C402|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"CPU 2 shut off due to over temperature" #EN_CUTOFF_HI_OVER_TEMP_CPU2|0x0421C482|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"System shutoff due to CPU 2 over temperature" #EN_THERM_TRIP_CPU2|0x0421D082|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"CPU 2 Over Temperature" #EN_PFA_HI_OVER_TEMP_CPU2|0x0421D502|SAHPI_MAJOR|OVR_SEV,OVR_RID|"System over temperature for CPU 2" #EN_PROC_HOT_CPU3|0x0421C403|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"CPU 3 shut off due to over temperature" #EN_CUTOFF_HI_OVER_TEMP_CPU3|0x0421C483|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"System shutoff due to CPU 3 over temperature" #EN_THERM_TRIP_CPU3|0x0421D083|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"CPU 3 Over Temperature" #EN_PFA_HI_OVER_TEMP_CPU3|0x0421D503|SAHPI_MAJOR|OVR_SEV,OVR_RID|"System over temperature for CPU 3" #EN_PROC_HOT_CPU4|0x0421C404|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"CPU 4 shut off due to over temperature" #EN_CUTOFF_HI_OVER_TEMP_CPU4|0x0421C484|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"System shutoff due to CPU 4 over temperature" #EN_THERM_TRIP_CPU4|0x0421D084|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"CPU 4 Over Temperature" #EN_PFA_HI_OVER_TEMP_CPU4|0x0421D504|SAHPI_MAJOR|OVR_SEV,OVR_RID|"System over temperature for CPU 4" EN_PROC_HOT_CPU5|0x0421C405|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"CPU 5 shut off due to over temperature" EN_CUTOFF_HI_OVER_TEMP_CPU5|0x0421C485|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"System shutoff due to CPU 5 over temperature" EN_THERM_TRIP_CPU5|0x0421D085|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"CPU 5 Over Temperature" EN_PFA_HI_OVER_TEMP_CPU5|0x0421D505|SAHPI_MAJOR|OVR_SEV,OVR_RID|"System over temperature for CPU 5" EN_PROC_HOT_CPU6|0x0421C406|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"CPU 6 shut off due to over temperature" EN_CUTOFF_HI_OVER_TEMP_CPU6|0x0421C486|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"System shutoff due to CPU 6 over temperature" EN_THERM_TRIP_CPU6|0x0421D086|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"CPU 6 Over Temperature" EN_PFA_HI_OVER_TEMP_CPU6|0x0421D506|SAHPI_MAJOR|OVR_SEV,OVR_RID|"System over temperature for CPU 6" EN_PROC_HOT_CPU7|0x0421C407|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"CPU 7 shut off due to over temperature" EN_CUTOFF_HI_OVER_TEMP_CPU7|0x0421C487|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"System shutoff due to CPU 7 over temperature" EN_THERM_TRIP_CPU7|0x0421D087|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"CPU 7 Over Temperature" EN_PFA_HI_OVER_TEMP_CPU7|0x0421D507|SAHPI_MAJOR|OVR_SEV,OVR_RID|"System over temperature for CPU 7" EN_PROC_HOT_CPU8|0x0421C408|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"CPU 8 shut off due to over temperature" EN_CUTOFF_HI_OVER_TEMP_CPU8|0x0421C488|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"System shutoff due to CPU 8 over temperature" EN_THERM_TRIP_CPU8|0x0421D088|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"CPU 8 Over Temperature" EN_PFA_HI_OVER_TEMP_CPU8|0x0421D508|SAHPI_MAJOR|OVR_SEV,OVR_RID|"System over temperature for CPU 8" ################### # RSA DASD Resource ################### # None ################## # RSA DASD Sensors ################## # Changed # EN_PFA_HI_OVER_TEMP_DASD1 from 0x0681D481 to 0x0681C401 # EN_CUTOFF_HI_OVER_TEMP_DASD1_2 from 0x0681C882 to 0x0681C482 # to allow for oh_derive_string() expansion # RSA DASD thermal sensor #EN_OVER_TEMP_DASD1|0x0681C081|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"DASD 1 Over Temperature" EN_CUTOFF_HI_OVER_TEMP_DASD1|0x0681C481|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"System shutoff due to DASD 1 temperature" EN_PFA_HI_OVER_TEMP_DASD1|0x0681C401|SAHPI_MAJOR|OVR_SEV,OVR_RID|"DASD 1 over recommended temperature" EN_CUTOFF_HI_OVER_TEMP_DASD1_2|0x0681C482|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"System shutoff due to DASD 2 temperature" EN_PFA_HI_OVER_TEMP_DASD1_2|0x0681C402|SAHPI_MAJOR|OVR_SEV,OVR_RID|"DASD 2 over recommended temperature" EN_CUTOFF_HI_OVER_TEMP_DASD1_3|0x0681C483|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"System shutoff due to DASD 3 temperature" EN_PFA_HI_OVER_TEMP_DASD1_3|0x0681C403|SAHPI_MAJOR|OVR_SEV,OVR_RID|"DASD 3 over recommended temperature" EN_CUTOFF_HI_OVER_TEMP_DASD1_4|0x0681C484|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"System shutoff due to DASD 4 temperature" EN_PFA_HI_OVER_TEMP_DASD1_4|0x0681C404|SAHPI_MAJOR|OVR_SEV,OVR_RID|"DASD 4 over recommended temperature" ################## # RSA Fan Resource ################## # None ################# # RSA Fan Sensors ################# # RSA Fan speed sensor #EN_FAN1_PFA|0x000A6001|SAHPI_MAJOR|OVR_SEV,OVR_RID|"Blower 1 Outside Recommended Speed" #EN_FAN2_PFA|0x000A6002|SAHPI_MAJOR|OVR_SEV,OVR_RID|"Blower 2 Outside Recommended Speed" #EN_FAN3_PFA|0x000A6003|SAHPI_MAJOR|OVR_SEV,OVR_RID|"Blower 3 Outside Recommended Speed" #EN_FAN4_PFA|0x000A6004|SAHPI_MAJOR|OVR_SEV,OVR_RID|"Blower 4 Outside Recommended Speed" EN_FAN5_PFA|0x000A6005|SAHPI_MAJOR|OVR_SEV,OVR_RID|"Blower 5 Outside Recommended Speed" EN_FAN6_PFA|0x000A6006|SAHPI_MAJOR|OVR_SEV,OVR_RID|"Blower 6 Outside Recommended Speed" EN_FAN7_PFA|0x000A6007|SAHPI_MAJOR|OVR_SEV,OVR_RID|"Blower 7 Outside Recommended Speed" EN_FAN8_PFA|0x000A6008|SAHPI_MAJOR|OVR_SEV,OVR_RID|"Blower 8 Outside Recommended Speed" # Mapped to operational sensor #EN_FAN1_SPEED|0x00026801|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"Blower 1 Failure Multiple blower failures" #EN_FAN1_SPEED|0x00026801|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"Blower 1 Failure Single blower failure" #EN_FAN2_SPEED|0x00026802|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"Blower 2 Failure Multiple blower failures" #EN_FAN2_SPEED|0x00026802|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"Blower 2 Failure Single blower failure" #EN_FAN3_SPEED|0x00026803|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"Blower 3 Failure Multiple blower failures" #EN_FAN3_SPEED|0x00026803|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"Blower 3 Failure Single blower failure" #EN_FAN4_SPEED|0x00026804|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"Blower 4 Failure Multiple blower failures" #EN_FAN4_SPEED|0x00026804|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"Blower 4 Failure Single blower failure" EN_FAN5_SPEED|0x00026805|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"Blower 5 Failure Multiple blower failures" EN_FAN5_SPEED|0x00026805|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"Blower 5 Failure Single blower failure" EN_FAN6_SPEED|0x00026806|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"Blower 6 Failure Multiple blower failures" EN_FAN6_SPEED|0x00026806|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"Blower 6 Failure Single blower failure" EN_FAN7_SPEED|0x00026807|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"Blower 7 Failure Multiple blower failures" EN_FAN7_SPEED|0x00026807|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"Blower 7 Failure Single blower failure" EN_FAN8_SPEED|0x00026808|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"Blower 8 Failure Multiple blower failures" EN_FAN8_SPEED|0x00026808|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"Blower 8 Failure Single blower failure" EN_FAULT_FAN1|0x0A026001|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"Fan 1 Fault Single fan failure" EN_FAULT_FAN1|0x0A026001|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"Fan 1 Fault Multiple fan failures" EN_FAULT_FAN2|0x0A026002|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"Fan 2 Fault Single fan failure" EN_FAULT_FAN2|0x0A026002|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"Fan 2 Fault Multiple fan failures" EN_FAULT_FAN3|0x0A026003|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"Fan 3 Fault Multiple fan failures" EN_FAULT_FAN3|0x0A026003|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"Fan 3 Fault Single fan failure" EN_FAULT_FAN4|0x0A026004|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"Fan 4 Fault Single fan failure" EN_FAULT_FAN5|0x0A026004|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"Fan 4 Fault Multiple fan failures" EN_FAULT_FAN5|0x0A026005|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"Fan 5 Fault Single fan failure" EN_FAULT_FAN5|0x0A026005|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"Fan 5 Fault Multiple fan failures" EN_FAULT_FAN6|0x0A026006|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"Fan 6 Fault Single fan failure" EN_FAULT_FAN6|0x0A026006|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"Fan 6 Fault Multiple fan failures" EN_FAULT_FAN7|0x0A026007|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"Fan 7 Fault Multiple fan failures" EN_FAULT_FAN7|0x0A026007|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"Fan 7 Fault Single fan failure" EN_FAULT_FAN8|0x0A026008|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"Fan 8 Fault Single fan failure" EN_FAULT_FAN8|0x0A026008|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"Fan 8 Fault Multiple fan failures" EN_FAN_1_NOT_PRESENT|0x06026001|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"Fan 1 not detected Multiple fan failures" EN_FAN_1_NOT_PRESENT|0x06026001|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"Fan 1 not detected Single fan failure" EN_FAN_2_NOT_PRESENT|0x06026002|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"Fan 2 not detected Multiple fan failures" EN_FAN_2_NOT_PRESENT|0x06026002|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"Fan 2 not detected Single fan failure" EN_FAN_3_NOT_PRESENT|0x06026003|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"Fan 3 not detected Multiple fan failures" EN_FAN_3_NOT_PRESENT|0x06026003|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"Fan 3 not detected Single fan failure" EN_FAN_4_NOT_PRESENT|0x06026004|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"Fan 4 not detected Multiple fan failures" EN_FAN_4_NOT_PRESENT|0x06026004|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"Fan 4 not detected Single fan failure" EN_FAN_5_NOT_PRESENT|0x06026005|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"Fan 5 not detected Multiple fan failures" EN_FAN_5_NOT_PRESENT|0x06026005|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"Fan 5 not detected Single fan failure" EN_FAN_6_NOT_PRESENT|0x06026006|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"Fan 6 not detected Multiple fan failures" EN_FAN_6_NOT_PRESENT|0x06026006|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"Fan 6 not detected Single fan failure" EN_FAN_7_NOT_PRESENT|0x06026007|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"Fan 7 not detected Multiple fan failures" EN_FAN_7_NOT_PRESENT|0x06026007|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"Fan 7 not detected Single fan failure" EN_FAN_8_NOT_PRESENT|0x06026008|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"Fan 8 not detected Multiple fan failures" EN_FAN_8_NOT_PRESENT|0x06026008|SAHPI_CRITICAL|OVR_SEV,OVR_RID|"Fan 8 not detected Single fan failure" ############ # OEM Events ############ #EN_KEY_PRESS_ENTER | 0x09002002 | I | R | "" #EN_KEY_PRESS_NEXT | 0x09002001 | I | R | "" #EN_ACCT_MGMT_DISABLED | 0x00016018 | W | | "Account has been disabled manually or because of inactivity for more than the configured limit for user " #EN_ACCT_MGMT_SUPERUSER_NOT_DISABLED | 0x00016019 | W | | "Account has been inactive for more than the configured disable and alert limit for Supervisor " #EN_ACCT_MGMT_INACTIVE | 0x00016017 | W | | "Account has been inactive for more than the configured inactivity alert limit for user " #EN_ACCT_MGMT_ACTIVE | 0x00016016 | W | | "Account has changed to the active user " #EN_DISABLE_ACCOUNT | 0x0001602D | I | | "Account is disabled for user " #EN_ENABLE_ACCOUNT | 0x0001602E | I | | "Account is enabled for user " #EN_UNLOCK_ACCOUNT | 0x0001602F | I | | "Account is unlocked for user " #EN_ACCT_MGMT_PASSWORD_TO_EXPIRE | 0x00016020 | W | | "Account password will expire for user " ###EN_IPMI_MEM_FAILED | 0x0021601A | E | | "All memory has failed." #EN_PWM_PWDS_EXPIRE_ON_FIRSTACCESS | 0x00016028 | I | | "All new account passwords expire on first access setting has been changed" #EN_ACCT_PWD_REQUIRED | 0x00016051 | W | | "A password is required for user " #EN_APP_ALERT | 0x00000014 | E | | "Application Posted Alert to ASM" ###EN_PFA_HI_FAULT_1_6V | 0x08039480 | N | R | "Blade 1.6V over recommended voltage" ###EN_PFA_LO_FAULT_1_6V | 0x08039880 | N | R | "Blade 1.6V under recommended voltage" ###EN_CUTOFF_HI_OVER_TEMP_AMBIENT | 0x0001C480 | E | R | "Blade ambient over temperature" ###EN_CUTOFF_LO_OVER_TEMP_AMBIENT | 0x0001C800 | E | R | "Blade ambient under temperature fault." ###EN_BLADE_10_MISMATCH | 0x0400038A | W | R | "Blade %d incompatible with chassis" ###EN_BLADE_11_MISMATCH | 0x0400038B | W | R | "Blade %d incompatible with chassis" ###EN_BLADE_12_MISMATCH | 0x0400038C | W | R | "Blade %d incompatible with chassis" ###EN_BLADE_13_MISMATCH | 0x0400038D | W | R | "Blade %d incompatible with chassis" ###EN_BLADE_14_MISMATCH | 0x0400038E | W | R | "Blade %d incompatible with chassis" ###EN_BLADE_1_MISMATCH | 0x04000381 | W | R | "Blade %d incompatible with chassis" ###EN_BLADE_2_MISMATCH | 0x04000382 | W | R | "Blade %d incompatible with chassis" ###EN_BLADE_3_MISMATCH | 0x04000383 | W | R | "Blade %d incompatible with chassis" ###EN_BLADE_4_MISMATCH | 0x04000384 | W | R | "Blade %d incompatible with chassis" ###EN_BLADE_5_MISMATCH | 0x04000385 | W | R | "Blade %d incompatible with chassis" ###EN_BLADE_6_MISMATCH | 0x04000386 | W | R | "Blade %d incompatible with chassis" ###EN_BLADE_7_MISMATCH | 0x04000387 | W | R | "Blade %d incompatible with chassis" ###EN_BLADE_8_MISMATCH | 0x04000388 | W | R | "Blade %d incompatible with chassis" ###EN_BLADE_9_MISMATCH | 0x04000389 | W | R | "Blade %d incompatible with chassis" ###EN_PEX_CAR_THRESHOLD_REACHED | 0x0E012047 | I | R | "Blade has been throttled; low clock rate" ###EN_BLADE_INCOMPATIABLE | 0x04000280 | E | R | "Blade incompatible with chassis" ###EN_MEMORY_FAIL | 0x05200000 | E | | "Blade memory fault" #EN_IPMI_BMC_RESET | 0x00216002 | I | | "Blade service processor reset" #EN_IPMI_OUT_OF_DATE_SDR_BMC | 0x10016000 | I | | "Blade sensor data records updated" #EN_COD_BLADE_ACTIVATED | 0x04001001 | I | | "Blade standby capacity activated" #EN_IPMI_BMC_RESET_NOT_SUPPORTED | 0x00216001 | I | R | "BMC reset not supported." ###EN_ADDIN_CABLE | 0x64001000 | N | R | "Cable on add-in card not connected to system board" ###EN_CUTOFF_HI_FAULT_12V_PLANAR | 0x06036480 | E | R | "Chassis 12V over voltage fault" ###EN_CUTOFF_LO_FAULT_12V_PLANAR | 0x06036800 | E | R | "Chassis 12V under voltage fault" ###EN_CUTOFF_HI_FAULT_1_8V | 0x0807A480 | E | R | "Chassis 1.8V over voltage fault." ###EN_CUTOFF_LO_FAULT_1_8V | 0x0807A880 | E | R | "Chassis 1.8V under voltage fault." ###EN_CUTOFF_HI_FAULT_2_5V | 0x08030480 | E | R | "Chassis 2.5V over voltage fault" ###EN_CUTOFF_LO_FAULT_2_5V | 0x08030880 | E | R | "Chassis 2.5V under voltage fault" ###EN_CUTOFF_HI_FAULT_3_35V | 0x08032480 | E | R | "Chassis 3.3V over voltage fault" ###EN_CUTOFF_LO_FAULT_3_35V | 0x08032880 | E | R | "Chassis 3.3V under voltage fault" ###EN_CUTOFF_HI_FAULT_N5V | 0x0803C480 | E | R | "Chassis -5V over voltage fault" ###EN_CUTOFF_HI_FAULT_PLANAR_5V | 0x06034480 | E | R | "Chassis 5V over voltage fault" ###EN_CUTOFF_LO_FAULT_N5V | 0x0803C800 | E | R | "Chassis -5V under voltage fault" ###EN_CUTOFF_LO_FAULT_PLANAR_5V | 0x06034800 | E | R | "Chassis 5V under voltage fault" ###EN_MAJOR_LO_OVER_TEMP_AMBIENT | 0x0011C900 | E | R | "Chassis under recommended ambient temperature" ###EN_PFA_LO_OVER_TEMP_AMBIENT | 0x0001D800 | W | R | "Chassis under recommended ambient temperature" #EN_CMD_MD_ENABLED | 0x0001605E | I | | "Command mode has been changed" #EN_CMD_MD_INACTIV | 0x0001605D | I | | "Command mode inactivity timeout has been changed" #EN_PWM_COMPLEX_PASSWORD_RULES | 0x00016026 | I | | "Complex password rules setting has been changed" #EN_I2C_CONST_FAN_SPEED | 0x000A6000 | N | R | "Constant fan speed override enabled" ###EN_FAULT_CPU1 | 0x04200201 | E | R | "CPU %d Fault" ###EN_FAULT_CPU2 | 0x04200202 | E | R | "CPU %d Fault" ###EN_FAULT_CPU3 | 0x04200203 | E | R | "CPU %d Fault" ###EN_FAULT_CPU4 | 0x04200204 | E | R | "CPU %d Fault" ###EN_FAULT_CPU | 0x04200200 | E | R | "CPU Fault" ###EN_PFA_HI_FAULT_VRM1 | 0x04401501 | W | R | "CPU voltage regulator %d over recommended voltage." ###EN_PFA_HI_FAULT_VRM2 | 0x04401502 | W | R | "CPU voltage regulator %d over recommended voltage." ###EN_PFA_LO_FAULT_VRM1 | 0x04401801 | W | R | "CPU voltage regulator %d under recommended voltage." ###EN_PFA_LO_FAULT_VRM2 | 0x04401802 | W | R | "CPU voltage regulator %d under recommended voltage." #EN_ENABLE_ENCRYPTION | 0x0001604E | I | | "Data encryption has been" #EN_PWM_DFT_PW_EXPIRE_ON_FIRSTACCESS | 0x00016024 | I | | "Default account password expires on first access setting has been changed" #EN_IPMI_DIMM_ERR | 0x00216003 | E | R | "DIMM failed: DIMM number unknown." #EN_LOG75 | 0x00000071 | W | R | "Event log 75%% full" #EN_LOG_CLEARED | 0x0001600B | I | | "Event log cleared" #EN_LOG_FULL | 0x0000006B | W | R | "Event log full" #EN_IPMI_WAKEUP_VECTOR_FAIL | 0x00216037 | E | | "Failure calling OS wakeup vector." #EN_IPMI_DOCK_DISABLE_FAIL | 0x00216036 | E | | "Failure disabling docking station." #EN_IPMI_BOARD_INIT_FAIL | 0x00216039 | E | | "Failure during board initialization." #EN_IPMI_CACHE_INIT_FAIL | 0x0021602F | E | | "Failure during cache initialization." #EN_IPMI_DOCK_ATTACHMENT_FAIL | 0x00216033 | E | | "Failure during docking station attachment." #EN_IPMI_DOCK_EJECTION_FAIL | 0x00216035 | E | | "Failure during docking station ejection." #EN_IPMI_FLOPPY_INIT_FAIL | 0x0021603A | E | | "Failure during floppy initialization." #EN_IPMI_DRIVE_INIT_FAIL | 0x00216027 | E | | "Failure during hard drive initialization." #EN_IPMI_KEY_INIT_FAIL | 0x00216031 | E | | "Failure during keyboard controller initialization." #EN_IPMI_KEY_TEST_FAIL | 0x0021603B | E | | "Failure during keyboard test." #EN_IPMI_MGMT_CTRL_INIT_FAIL | 0x00216032 | E | | "Failure during management controller initialization." #EN_IPMI_MEM_INIT_FAIL | 0x00216026 | E | | "Failure during memory initialization." #EN_IPMI_ROM_INIT_FAIL | 0x0021602D | E | | "Failure during option ROM initialization." #EN_IPMI_PCI_CONF_FAIL | 0x0021602B | E | | "Failure during PCI configuration." #EN_IPMI_POINT_TEST_FAIL | 0x0021603C | E | | "Failure during pointing device test." #EN_IPMI_USB_CONF_FAIL | 0x0021602C | E | | "Failure during USB configuration." #EN_IPMI_USER_AUTH_FAIL | 0x00216029 | E | | "Failure during user authentication." #EN_IPMI_USER_SETUP_FAIL | 0x0021602A | E | | "Failure during user setup." #EN_IPMI_VIDEO_INIT_FAIL | 0x0021602E | E | | "Failure during video initialization." #EN_IPMI_DOCK_ENABLE_FAIL | 0x00216034 | E | | "Failure enabling docking station." #EN_FTPDATA_PORT | 0x0001603C | I | | "FTP Data port has been changed" #EN_FTP_PORT | 0x0001603B | I | | "FTP port has been changed" #EN_FTP_ENABLED | 0x00016058 | I | | "FTP server has been" #EN_FTP_TIMEOUT | 0x0001605C | I | | "FTP timeout has been changed" #EN_HTTP_PORT | 0x00016033 | I | | "HTTP port has been changed" #EN_PWM_INACTIVITY_ALERT_DISABLE | 0x0001602A | I | | "Inactivity alert and disable period setting has been changed" #EN_PWM_INACTIVITY_ALERT | 0x00016029 | I | | "Inactivity alert period setting has been changed" #EN_PEX_POWER_INVENTORY_COMPLETE | 0x0E01204B | I | R | "Initial power inventory has been completed" #EN_SWITCH_1_PMC_WO_PERMIT | 0x0EA0F501 | I | | "I/O module %d controls Protected Mode Capability without MM permision." #EN_SWITCH_2_PMC_WO_PERMIT | 0x0EA0F502 | I | | "I/O module %d controls Protected Mode Capability without MM permision." #EN_SWITCH_3_PMC_WO_PERMIT | 0x0EA0F503 | I | | "I/O module %d controls Protected Mode Capability without MM permision." #EN_SWITCH_4_PMC_WO_PERMIT | 0x0EA0F504 | I | | "I/O module %d controls Protected Mode Capability without MM permision." #EN_SWITCH_5_PMC_WO_PERMIT | 0x0EA0F505 | I | | "I/O module %d controls Protected Mode Capability without MM permision." #EN_SWITCH_6_PMC_WO_PERMIT | 0x0EA0F506 | I | | "I/O module %d controls Protected Mode Capability without MM permision." #EN_SWITCH_7_PMC_WO_PERMIT | 0x0EA0F507 | I | | "I/O module %d controls Protected Mode Capability without MM permision." #EN_SWITCH_8_PMC_WO_PERMIT | 0x0EA0F508 | I | | "I/O module %d controls Protected Mode Capability without MM permision." #EN_SWITCH_9_PMC_WO_PERMIT | 0x0EA0F509 | I | | "I/O module %d controls Protected Mode Capability without MM permision." #EN_SWITCH_10_PMC_WO_PERMIT | 0x0EA0F50A | I | | "I/O module %d controls Protected Mode Capability without MM permision." #EN_SWITCH_1_PMC_EXT_MGT | 0x0EA0F301 | I | | "I/O module %d enters Protected Mode Control of Ext. Management." #EN_SWITCH_2_PMC_EXT_MGT | 0x0EA0F302 | I | | "I/O module %d enters Protected Mode Control of Ext. Management." #EN_SWITCH_3_PMC_EXT_MGT | 0x0EA0F303 | I | | "I/O module %d enters Protected Mode Control of Ext. Management." #EN_SWITCH_4_PMC_EXT_MGT | 0x0EA0F304 | I | | "I/O module %d enters Protected Mode Control of Ext. Management." #EN_SWITCH_5_PMC_EXT_MGT | 0x0EA0F305 | I | | "I/O module %d enters Protected Mode Control of Ext. Management." #EN_SWITCH_6_PMC_EXT_MGT | 0x0EA0F306 | I | | "I/O module %d enters Protected Mode Control of Ext. Management." #EN_SWITCH_7_PMC_EXT_MGT | 0x0EA0F307 | I | | "I/O module %d enters Protected Mode Control of Ext. Management." #EN_SWITCH_8_PMC_EXT_MGT | 0x0EA0F308 | I | | "I/O module %d enters Protected Mode Control of Ext. Management." #EN_SWITCH_9_PMC_EXT_MGT | 0x0EA0F309 | I | | "I/O module %d enters Protected Mode Control of Ext. Management." #EN_SWITCH_10_PMC_EXT_MGT | 0x0EA0F30A | I | | "I/O module %d enters Protected Mode Control of Ext. Management." #EN_SWITCH_1_PMC_EXT_PORTS | 0x0EA0F201 | I | | "I/O module %d enters Protected Mode Control of Ext. Ports." #EN_SWITCH_2_PMC_EXT_PORTS | 0x0EA0F202 | I | | "I/O module %d enters Protected Mode Control of Ext. Ports." #EN_SWITCH_3_PMC_EXT_PORTS | 0x0EA0F203 | I | | "I/O module %d enters Protected Mode Control of Ext. Ports." #EN_SWITCH_4_PMC_EXT_PORTS | 0x0EA0F204 | I | | "I/O module %d enters Protected Mode Control of Ext. Ports." #EN_SWITCH_5_PMC_EXT_PORTS | 0x0EA0F205 | I | | "I/O module %d enters Protected Mode Control of Ext. Ports." #EN_SWITCH_6_PMC_EXT_PORTS | 0x0EA0F206 | I | | "I/O module %d enters Protected Mode Control of Ext. Ports." #EN_SWITCH_7_PMC_EXT_PORTS | 0x0EA0F207 | I | | "I/O module %d enters Protected Mode Control of Ext. Ports." #EN_SWITCH_8_PMC_EXT_PORTS | 0x0EA0F208 | I | | "I/O module %d enters Protected Mode Control of Ext. Ports." #EN_SWITCH_9_PMC_EXT_PORTS | 0x0EA0F209 | I | | "I/O module %d enters Protected Mode Control of Ext. Ports." #EN_SWITCH_10_PMC_EXT_PORTS | 0x0EA0F20A | I | | "I/O module %d enters Protected Mode Control of Ext. Ports." #EN_SWITCH_1_PMC_IP_CFG | 0x0EA0F101 | I | | "I/O module %d enters Protected Mode Control of IP CFG." #EN_SWITCH_2_PMC_IP_CFG | 0x0EA0F102 | I | | "I/O module %d enters Protected Mode Control of IP CFG." #EN_SWITCH_3_PMC_IP_CFG | 0x0EA0F103 | I | | "I/O module %d enters Protected Mode Control of IP CFG." #EN_SWITCH_4_PMC_IP_CFG | 0x0EA0F104 | I | | "I/O module %d enters Protected Mode Control of IP CFG." #EN_SWITCH_5_PMC_IP_CFG | 0x0EA0F105 | I | | "I/O module %d enters Protected Mode Control of IP CFG." #EN_SWITCH_6_PMC_IP_CFG | 0x0EA0F106 | I | | "I/O module %d enters Protected Mode Control of IP CFG." #EN_SWITCH_7_PMC_IP_CFG | 0x0EA0F107 | I | | "I/O module %d enters Protected Mode Control of IP CFG." #EN_SWITCH_8_PMC_IP_CFG | 0x0EA0F108 | I | | "I/O module %d enters Protected Mode Control of IP CFG." #EN_SWITCH_9_PMC_IP_CFG | 0x0EA0F109 | I | | "I/O module %d enters Protected Mode Control of IP CFG." #EN_SWITCH_10_PMC_IP_CFG | 0x0EA0F10A | I | | "I/O module %d enters Protected Mode Control of IP CFG." #EN_SWITCH_1_PMC_RESET_DFLT | 0x0EA0F401 | I | | "I/O module %d enters Protected Mode Control of Reset CFG to Default." #EN_SWITCH_2_PMC_RESET_DFLT | 0x0EA0F402 | I | | "I/O module %d enters Protected Mode Control of Reset CFG to Default." #EN_SWITCH_3_PMC_RESET_DFLT | 0x0EA0F403 | I | | "I/O module %d enters Protected Mode Control of Reset CFG to Default." #EN_SWITCH_4_PMC_RESET_DFLT | 0x0EA0F404 | I | | "I/O module %d enters Protected Mode Control of Reset CFG to Default." #EN_SWITCH_5_PMC_RESET_DFLT | 0x0EA0F405 | I | | "I/O module %d enters Protected Mode Control of Reset CFG to Default." #EN_SWITCH_6_PMC_RESET_DFLT | 0x0EA0F406 | I | | "I/O module %d enters Protected Mode Control of Reset CFG to Default." #EN_SWITCH_7_PMC_RESET_DFLT | 0x0EA0F407 | I | | "I/O module %d enters Protected Mode Control of Reset CFG to Default." #EN_SWITCH_8_PMC_RESET_DFLT | 0x0EA0F408 | I | | "I/O module %d enters Protected Mode Control of Reset CFG to Default." #EN_SWITCH_9_PMC_RESET_DFLT | 0x0EA0F409 | I | | "I/O module %d enters Protected Mode Control of Reset CFG to Default." #EN_SWITCH_10_PMC_RESET_DFLT | 0x0EA0F40A | I | | "I/O module %d enters Protected Mode Control of Reset CFG to Default." #EN_SWITCH_1_IOM_CFG_ERROR | 0x0EA0B001 | I | R | "I/O Module %d incompatible with other I/O modules" #EN_SWITCH_2_IOM_CFG_ERROR | 0x0EA0B002 | I | R | "I/O Module %d incompatible with other I/O modules" #EN_SWITCH_3_IOM_CFG_ERROR | 0x0EA0B003 | I | R | "I/O Module %d incompatible with other I/O modules" #EN_SWITCH_4_IOM_CFG_ERROR | 0x0EA0B004 | I | R | "I/O Module %d incompatible with other I/O modules" #EN_SWITCH_5_IOM_CFG_ERROR | 0x0EA0B005 | I | R | "I/O Module %d incompatible with other I/O modules" #EN_SWITCH_6_IOM_CFG_ERROR | 0x0EA0B006 | I | R | "I/O Module %d incompatible with other I/O modules" #EN_SWITCH_7_IOM_CFG_ERROR | 0x0EA0B007 | I | R | "I/O Module %d incompatible with other I/O modules" #EN_SWITCH_8_IOM_CFG_ERROR | 0x0EA0B008 | I | R | "I/O Module %d incompatible with other I/O modules" #EN_SWITCH_9_IOM_CFG_ERROR | 0x0EA0B009 | I | R | "I/O Module %d incompatible with other I/O modules" #EN_SWITCH_10_IOM_CFG_ERROR | 0x0EA0B00A | I | R | "I/O Module %d incompatible with other I/O modules" #EN_SWITCH_1_HW_CFG_ERROR | 0x0EA05001 | E | R | "I/O Module %d in the interposer is not supported in this configuration." #EN_SWITCH_2_HW_CFG_ERROR | 0x0EA05002 | E | R | "I/O Module %d in the interposer is not supported in this configuration." #EN_SWITCH_3_HW_CFG_ERROR | 0x0EA05003 | E | R | "I/O Module %d in the interposer is not supported in this configuration." #EN_SWITCH_4_HW_CFG_ERROR | 0x0EA05004 | E | R | "I/O Module %d in the interposer is not supported in this configuration." #EN_SWITCH_5_HW_CFG_ERROR | 0x0EA05005 | E | R | "I/O Module %d in the interposer is not supported in this configuration." #EN_SWITCH_6_HW_CFG_ERROR | 0x0EA05006 | E | R | "I/O Module %d in the interposer is not supported in this configuration." #EN_SWITCH_7_HW_CFG_ERROR | 0x0EA05007 | E | R | "I/O Module %d in the interposer is not supported in this configuration." #EN_SWITCH_8_HW_CFG_ERROR | 0x0EA05008 | E | R | "I/O Module %d in the interposer is not supported in this configuration." #EN_SWITCH_9_HW_CFG_ERROR | 0x0EA05009 | E | R | "I/O Module %d in the interposer is not supported in this configuration." #EN_SWITCH_10_HW_CFG_ERROR | 0x0EA0500A | E | R | "I/O Module %d in the interposer is not supported in this configuration." #EN_SWITCH_1_IP_CFG_CHANGE | 0x0EA0A001 | I | | "I/O module %d IP configuration was changed." #EN_SWITCH_2_IP_CFG_CHANGE | 0x0EA0A002 | I | | "I/O module %d IP configuration was changed." #EN_SWITCH_3_IP_CFG_CHANGE | 0x0EA0A003 | I | | "I/O module %d IP configuration was changed." #EN_SWITCH_4_IP_CFG_CHANGE | 0x0EA0A004 | I | | "I/O module %d IP configuration was changed." #EN_SWITCH_5_IP_CFG_CHANGE | 0x0EA0A005 | I | | "I/O module %d IP configuration was changed." #EN_SWITCH_6_IP_CFG_CHANGE | 0x0EA0A006 | I | | "I/O module %d IP configuration was changed." #EN_SWITCH_7_IP_CFG_CHANGE | 0x0EA0A007 | I | | "I/O module %d IP configuration was changed." #EN_SWITCH_8_IP_CFG_CHANGE | 0x0EA0A008 | I | | "I/O module %d IP configuration was changed." #EN_SWITCH_9_IP_CFG_CHANGE | 0x0EA0A009 | I | | "I/O module %d IP configuration was changed." #EN_SWITCH_10_IP_CFG_CHANGE | 0x0EA0A00A | I | | "I/O module %d IP configuration was changed." #EN_SWITCH_1_NAT_ACTIVATE | 0x0EA0F001 | I | | "I/O module %d NAT table is activated." #EN_SWITCH_2_NAT_ACTIVATE | 0x0EA0F002 | I | | "I/O module %d NAT table is activated." #EN_SWITCH_3_NAT_ACTIVATE | 0x0EA0F003 | I | | "I/O module %d NAT table is activated." #EN_SWITCH_4_NAT_ACTIVATE | 0x0EA0F004 | I | | "I/O module %d NAT table is activated." #EN_SWITCH_5_NAT_ACTIVATE | 0x0EA0F005 | I | | "I/O module %d NAT table is activated." #EN_SWITCH_6_NAT_ACTIVATE | 0x0EA0F006 | I | | "I/O module %d NAT table is activated." #EN_SWITCH_7_NAT_ACTIVATE | 0x0EA0F007 | I | | "I/O module %d NAT table is activated." #EN_SWITCH_8_NAT_ACTIVATE | 0x0EA0F008 | I | | "I/O module %d NAT table is activated." #EN_SWITCH_9_NAT_ACTIVATE | 0x0EA0F009 | I | | "I/O module %d NAT table is activated." #EN_SWITCH_10_NAT_ACTIVATE | 0x0EA0F00A | I | | "I/O module %d NAT table is activated." #EN_SWITCH_1_BLOWN_FUSE | 0x0EA0F701 | E | R | "I/O Module %d - Open fuse detected. Power redundancy lost for this module." #EN_SWITCH_2_BLOWN_FUSE | 0x0EA0F702 | E | R | "I/O Module %d - Open fuse detected. Power redundancy lost for this module." #EN_SWITCH_3_BLOWN_FUSE | 0x0EA0F703 | E | R | "I/O Module %d - Open fuse detected. Power redundancy lost for this module." #EN_SWITCH_4_BLOWN_FUSE | 0x0EA0F704 | E | R | "I/O Module %d - Open fuse detected. Power redundancy lost for this module." #EN_SWITCH_5_BLOWN_FUSE | 0x0EA0F705 | E | R | "I/O Module %d - Open fuse detected. Power redundancy lost for this module." #EN_SWITCH_6_BLOWN_FUSE | 0x0EA0F706 | E | R | "I/O Module %d - Open fuse detected. Power redundancy lost for this module." #EN_SWITCH_7_BLOWN_FUSE | 0x0EA0F707 | E | R | "I/O Module %d - Open fuse detected. Power redundancy lost for this module." #EN_SWITCH_8_BLOWN_FUSE | 0x0EA0F708 | E | R | "I/O Module %d - Open fuse detected. Power redundancy lost for this module." #EN_SWITCH_9_BLOWN_FUSE | 0x0EA0F709 | E | R | "I/O Module %d - Open fuse detected. Power redundancy lost for this module." #EN_SWITCH_10_PM_CFG_MISMATCH | 0x0EA0F60A | I | | "I/O module %d Protected Mode Permission and MM configured permission mismatch." #EN_SWITCH_1_PM_CFG_MISMATCH | 0x0EA0F601 | I | | "I/O module %d Protected Mode Permission and MM configured permission mismatch." #EN_SWITCH_2_PM_CFG_MISMATCH | 0x0EA0F602 | I | | "I/O module %d Protected Mode Permission and MM configured permission mismatch." #EN_SWITCH_3_PM_CFG_MISMATCH | 0x0EA0F603 | I | | "I/O module %d Protected Mode Permission and MM configured permission mismatch." #EN_SWITCH_4_PM_CFG_MISMATCH | 0x0EA0F604 | I | | "I/O module %d Protected Mode Permission and MM configured permission mismatch." #EN_SWITCH_5_PM_CFG_MISMATCH | 0x0EA0F605 | I | | "I/O module %d Protected Mode Permission and MM configured permission mismatch." #EN_SWITCH_6_PM_CFG_MISMATCH | 0x0EA0F606 | I | | "I/O module %d Protected Mode Permission and MM configured permission mismatch." #EN_SWITCH_7_PM_CFG_MISMATCH | 0x0EA0F607 | I | | "I/O module %d Protected Mode Permission and MM configured permission mismatch." #EN_SWITCH_8_PM_CFG_MISMATCH | 0x0EA0F608 | I | | "I/O module %d Protected Mode Permission and MM configured permission mismatch." #EN_SWITCH_9_PM_CFG_MISMATCH | 0x0EA0F609 | I | | "I/O module %d Protected Mode Permission and MM configured permission mismatch." #EN_SWITCH_10_BLOWN_FUSE | 0x0EA0F70A | E | R | "I/O Module %d - Open fuse detected. Power redundancy lost for this module." #EN_TCPAPPS_DUPLICATE_IP | 0x00016015 | W | | "IP address of primary MM is the same as the IP address of standby MM. Standby network interface is disabled." #EN_PORT_CFG_RESET | 0x0001604A | I | | "IP port numbers is reset to defaults" #EN_IPMI_KEY_FAIL | 0x0021601F | E | | "Keyboard failure." #EN_FIVE_LOGIN_FAILURES | 0x0001600A | W | | "LAN: Web Server tamper delay triggered. Possible break in attempt." #EN_PWM_LDAP_AUTHMETHOD | 0x00016030 | I | | "LDAP authentication method has been changed" #EN_LOAD_WD | 0x00000078 | E | | "Loader Watchdog Triggered" #EN_PWM_MAX_LOGIN_FAILURE_LOCKOUT | 0x0001602B | I | | "Lockout period after maximum login failures setting has been changed" #EN_MM_NETWORK_LOG_LINK_LOSS | 0x00217001 | W | | "Management Module external network logical link lost." #EN_MM_NETWORK_LOSS | 0x00217000 | W | | "Management Module external network physical link lost." #EN_MM_NETWORK_INIT_CMPLT | 0x00016001 | I | | "Management Module network initialization complete" #EN_PWM_MAX_LOGIN_FAILURES | 0x00016022 | I | | "Max login failures setting has been changed" #EN_PEX_CONSISTENCY_CHECK | 0x0E012044 | I | R | "Measured power of blade is higher than current Power Cap" #EN_PWM_MIN_DIFF_CHARS_IN_PWDS | 0x00016027 | I | | "Minimum different characters in passwords setting has been changed" #EN_PWM_MIN_PW_REUSE_CYCLE | 0x00016025 | I | | "Minimum password reuse cycle setting has been changed" #EN_PWR_DOMAIN_1_MISMATCHED_PS | 0x08006001 | W | R | "Mismatched Power Modules in power domain %d" #EN_PWR_DOMAIN_2_MISMATCHED_PS | 0x08006002 | W | R | "Mismatched Power Modules in power domain %d" #EN_CPK_FET_FAIL | 0x08237080 | N | R | "Multiple +12v FET failures, power domain 2 inoperable." #EN_MPE_BD_FAULT | 0x04000080 | E | R | "Multi Processor Expansion board fault." #EN_PEX_PCAPMIN_GT_PCAP | 0x0E012043 | I | R | "New minimum Power Cap is greater than current Power Cap of blade" #EN_MM_NON_REDUNDANT | 0x00284000 | W | R | "No standby Management Module in chassis" #EN_IPMI_NO_VIDEO | 0x00216022 | E | | "No video device detected." #EN_NTP_ENABLED | 0x0001605B | I | | "NTP server has been" #EN_OS_WD | 0x00000073 | E | | "OS Watchdog Triggered" #EN_PERR | 0x06500000 | E | | "Parity Error PCI Bus" #EN_PWM_PW_EXIRATION | 0x00016023 | I | | "Password expiration setting has been changed" #EN_PWM_PW_REQUIRED | 0x0001602C | I | | "Password required setting has been changed" #EN_FANP1_SPEED | 0x00026A01 | E | R | "Peer Blower %d failure" #EN_FANP2_SPEED | 0x00026A02 | E | R | "Peer Blower %d failure" #EN_FANP3_SPEED | 0x00026A03 | E | R | "Peer Blower %d failure" #EN_FANP4_SPEED | 0x00026A04 | E | R | "Peer Blower %d failure" #EN_FANP1_PFA | 0x000A7801 | E | R | "Peer Blower %d outside of recommended speed" #EN_FANP2_PFA | 0x000A7802 | E | R | "Peer Blower %d outside of recommended speed" #EN_FANP3_PFA | 0x000A7803 | E | R | "Peer Blower %d outside of recommended speed" #EN_FANP4_PFA | 0x000A7804 | E | R | "Peer Blower %d outside of recommended speed" #EN_PFA | 0x0000007B | E | R | "PFA Alert, see preceding error in event log." #EN_SMI_ERROR | 0x00100000 | E | | "PFA Alert, see preceding error in event log." #EN_CPK_FET_NON_REDUNDANT | 0x082A9000 | N | R | "Possible +12v FET failure, make sure chassis power supplies are redundant." #EN_POST_WD | 0x00000072 | E | | "POST Watchdog Triggered" #EN_PEX_PCAPMIN_PCAPMAX_CHANGED | 0x0E012045 | I | R | "Power Cap range of blade has changed" #EN_PEX_PCAP_CHANGED | 0x0E012046 | I | R | "Power Cap value of blade has been changed" #EN_PEX_CAPABILITY_CHANGED | 0x0E012042 | I | R | "PowerExecutive capability of blade has changed" #EN_PEX_HW_ERROR | 0x0E012041 | W | R | "PowerExecutive hardware error has occurred" #EN_PEX_HOST_SYSTEM_WRITE | 0x0E012048 | I | R | "PowerExecutive parameters have been modified by external source" #EN_BLADE_NO_DC_FAULT_DOM1 | 0x00029401 | W | R | "Power module 1 or 2 is required to power blades 1 to 6." #EN_BLADE_NO_DC_FAULT_DOM1 | 0x00029401 | W | R | "Power module 1 or 2 is required to power blades in power domain 1." #EN_BLADE_NO_DC_FAULT | 0x00029402 | W | R | "Power module 3 or 4 is required to power blades 5 to 8." #EN_BLADE_NO_DC_FAULT | 0x00029400 | W | R | "Power module 3 or 4 is required to power blades in power domain 2." #EN_BLADE_NO_DC_FAULT_BCT | 0x00029402 | W | R | "Power module 3 or 4 is required to power blades in power domain 2." #EN_MM_1_ISPRIME | 0x06000201 | I | | "Primary Management Module in bay %d is active." #EN_MM_2_ISPRIME | 0x06000202 | I | | "Primary Management Module in bay %d is active." #EN_READ_THE_LOG | 0x0000007F | I | | "Read the event log" #EN_RDOC_PORT_ENABLED | 0x00016046 | I | | "Remote Disk-on-Card port has been" #EN_RDOC_PORT | 0x00016042 | I | | "Remote Disk-on-Card port has been changed" #EN_RD_PORT_ENABLED | 0x00016045 | I | | "Remote Disk port has been" #EN_RD_PORT | 0x00016041 | I | | "Remote Disk port has been changed" #EN_KVM_PORT_ENABLED | 0x00016047 | I | | "Remote KVM port has been" #EN_KVM_PORT | 0x00016043 | I | | "Remote KVM port has been changed" #EN_LOGIN_FAILED | 0x00200000 | I | | "Remote login failed for user " #EN_RAT_LOGIN | 0x0000007A | I | | "Remote login successful for user " #EN_RAT_LOGOFF | 0x0001601A | I | | "Remote logoff successful for user " #EN_IPMI_BOOT_MEDIA_MISSING | 0x00216020 | E | | "Removable boot media missing." #EN_SDS_PORT | 0x00016056 | I | | "SDS port has been changed" #EN_TCPAPPS_SSL_CMD_MODE_DISABLED | 0x00016005 | I | | "Secure TCP Command Mode disabled." #EN_TCPAPPS_SSL_CMD_MODE_ENABLED | 0x00016004 | I | | "Secure TCP Command Mode enabled." #EN_SEC_TCP_CMDMODE_PORT | 0x0001603A | I | | "Secure TCP Command Mode port has been changed" #EN_TCPAPPS_SSL_CMD_MODE_PORT | 0x00016006 | I | | "Secure TCP Command Mode port number changed. New port number: " #EN_PWM_SECLVL | 0x00016021 | I | | "Security level has been changed" #EN_SNMP_PASSWORD_REQUIRED | 0x00016101 | W | | "Security settings now require passwords. An SNMP v3 authentication protocol must be specified for user " #EN_BAUD_RATE | 0x00016053 | I | | "Serial port baud rate has been changed" #EN_PARITY | 0x00016054 | I | | "Serial port parity has been changed" #EN_STOPBITS | 0x00016055 | I | | "Serial port stop bits number has been changed" #EN_SP_EVT_FULL | 0x00216017 | I | R | "Service processor event log is full." #EN_SFTP_PORT | 0x0001603E | I | | "SFTP port has been changed" #EN_SFTP_ENABLED | 0x0001605A | I | | "SFTP server has been" #EN_NFPORT_CFG_RESET | 0x0001604B | I | | "SLIM port numbers is reset to defaults" #EN_SLP_PORT_ENABLED | 0x00016048 | I | | "SLP port has been" #EN_SLP_PORT | 0x00016044 | I | | "SLP port has been changed" #EN_SMASH_SSH_ENABLEMENT | 0x0001604D | I | | "SMASH SSH port has been" #EN_SMASH_SSH_PORT | 0x00016040 | I | | "SMASH SSH port has been changed" #EN_SMASH_TELNET_ENABLEMENT | 0x0001604C | I | | "SMASH Telnet port has been" #EN_SMASH_TELNET_PORT | 0x0001603F | I | | "SMASH Telnet port has been changed" #EN_SNMP_AGENT_PORT | 0x00016037 | I | | "SNMP Agent port has been changed" #EN_SNMP_TRAP_DISABLED | 0x0001605F | I | | "SNMP trap has been" #EN_SNMP_TRAPS_PORT | 0x00016038 | I | | "SNMP Traps port has been changed" #EN_SNMP1_AGENT_ENABLED | 0x00016060 | I | | "SNMP v1 agent has been" #EN_SNMP_COMM_ACCTYPE1 | 0x00016065 | I | | "SNMP v1 community 1 access type has been changed to" #EN_SNMP_COMM_NAME1 | 0x00016062 | I | | "SNMP v1 community 1 name has been changed to" #EN_SNMP_COMM_ACCTYPE2 | 0x00016066 | I | | "SNMP v1 community 2 access type has been changed to" #EN_SNMP_COMM_NAME2 | 0x00016063 | I | | "SNMP v1 community 2 name has been changed to" #EN_SNMP_COMM_ACCTYPE3 | 0x00016067 | I | | "SNMP v1 community 3 access type has been changed to" #EN_SNMP_COMM_NAME3 | 0x00016064 | I | | "SNMP v1 community 3 name has been changed to" #EN_SNMP3_AGENT_ENABLED | 0x00016061 | I | | "SNMP v3 agent has been" #EN_LOGIN_FAILED_PASSWORD_EXPIRED | 0x00016100 | W | | "SNMP v3 login failed due to expired password for user " #EN_SSH_PORT | 0x00016036 | I | | "SSH port has been changed" #EN_TCPAPPS_SSL_CLIENT_CERT_INVALID | 0x00016010 | E | R | "SSL Client Certificate Error" #EN_SSL_PORT | 0x00016034 | I | | "SSL port has been changed" #EN_TCPAPPS_SSL_SERVER_CERT_INVALID | 0x0001600F | E | R | "SSL Server Certificate Error" #EN_TCPAPPS_SSL_STANDBY_SERVER_CERT_INVALID | 0x00016014 | E | R | "SSL Server Certificate Error" #EN_TCPAPPS_SSL_TRUST1_CERT_INVALID | 0x00016011 | E | R | "SSL Trusted CA Certificate 1 Error" #EN_TCPAPPS_SSL_TRUST2_CERT_INVALID | 0x00016012 | E | R | "SSL Trusted CA Certificate 2 Error" #EN_TCPAPPS_SSL_TRUST3_CERT_INVALID | 0x00016013 | E | R | "SSL Trusted CA Certificate 3 Error" #EN_THRESH_HI_CRIT_TEMP | 0x80010901 | N | R | "%s %s (%s) %s critical %s." #EN_THRESH_HI_CRIT_VOLT | 0x80010902 | N | R | "%s %s (%s) %s critical %s." #EN_THRESH_LO_CRIT_VOLT | 0x80010202 | N | R | "%s %s (%s) %s critical %s." #EN_THRESH_HI_NONRECOV_TEMP | 0x80010B01 | N | R | "%s %s (%s) %s non-recoverable %s fault." #EN_THRESH_HI_NONRECOV_VOLT | 0x80010B02 | N | R | "%s %s (%s) %s non-recoverable %s fault." #EN_THRESH_LO_NONRECOV_VOLT | 0x80010402 | N | R | "%s %s (%s) %s non-recoverable %s fault." #EN_THRESH_HI_WARN_TEMP | 0x80010701 | N | R | "%s %s (%s) %s recommended %s." #EN_THRESH_HI_WARN_VOLT | 0x80010702 | N | R | "%s %s (%s) %s recommended %s." #EN_THRESH_LO_WARN_VOLT | 0x80010002 | N | R | "%s %s (%s) %s recommended %s." #EN_MM_1_ISSTANDBY | 0x06000301 | I | | "Standby Management Module in bay %d is active." #EN_MM_2_ISSTANDBY | 0x06000302 | I | | "Standby Management Module in bay %d is active." #EN_TCPAPPS_CMD_MODE_DISABLED | 0x00016003 | I | | "TCP Command Mode disabled." #EN_TCPAPPS_CMD_MODE_ENABLED | 0x00016002 | I | | "TCP Command Mode enabled." #EN_TCP_CMDMODE_PORT | 0x00016039 | I | | "TCP Command Mode port has been changed" #EN_TCPAPPS_CMD_MODE_PORT | 0x00016007 | I | | "TCP Command Mode port number changed. New port number: " #EN_PWM_TELNET_INACTIV | 0x00016032 | I | | "Telnet inactivity timeout has been changed" #EN_TELNET_PORT | 0x00016035 | I | | "TELNET port has been changed" #EN_TN_MD_ENABLED | 0x00016057 | I | | "Telnet Protocol has been" #EN_TFTP_PORT | 0x0001603D | I | | "TFTP port has been changed" #EN_TFTP_ENABLED | 0x00016059 | I | | "TFTP server has been" #EN_DELETE_ACCOUNT | 0x0001604F | I | | "The account has been deleted for user " #EN_ACCT_LEGACY_PWD_EXPIRED | 0x00016052 | W | | "The password expired for user " #EN_ACCT_PWD_EXPIRED | 0x00016050 | W | | "The password expired for user " #EN_UNSUPPORTED_EVENT | 0x80000000 | N | R | "Unsupported event, sensor = 0x%02X, SEL: 0x%s." #EN_IPMI_VIDEO_CTRL_FAIL | 0x00216021 | E | | "Video controller failure." #EN_PWM_WEB_INACTIVITY_TIMEOUT | 0x00016031 | I | | "Web inactivity timout has been changed" #EN_WEBS_PORT_ENABLED | 0x00016049 | I | | "Web server port has been" # Events Mapped but not in current list - obsolete?? #EN_AUTO_BIOS_ALERT|0x04000000|SAHPI_MAJOR|OVR_SEV|"Firmware (BIOS) ROM corruption detected" #EN_OVER_TEMP_BEM|0x0621C081|SAHPI_CRITICAL|OVR_SEV,OVR_EXP|"BEM 1 Over Temperature" #EN_PFA_HI_OVER_TEMP_DASD1_2|0x0681C402|SAHPI_MAJOR|OVR_SEV,OVR_RID|"DASD 2 over recommended temperature" #EN_PFA_HI_OVER_TEMP_DASD1_3|0x0681C403|SAHPI_MAJOR|OVR_SEV,OVR_RID|"DASD 3 over recommended temperature" #EN_PFA_HI_OVER_TEMP_DASD1_4|0x0681C404|SAHPI_MAJOR|OVR_SEV,OVR_RID|"DASD 4 over recommended temperature" openhpi-2.14.1/plugins/snmp_bc/snmp_bc_watchdog.c0000644000076400007640000000313711302566770016753 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * Steve Sherman */ #include SaErrorT snmp_bc_get_watchdog_info(void *hnd, SaHpiResourceIdT id, SaHpiWatchdogNumT num, SaHpiWatchdogT *wdt) { /* Watchdog not supported */ return SA_ERR_HPI_NOT_PRESENT; } SaErrorT snmp_bc_set_watchdog_info(void *hnd, SaHpiResourceIdT id, SaHpiWatchdogNumT num, SaHpiWatchdogT *wdt) { /* Watchdog not supported */ return SA_ERR_HPI_NOT_PRESENT; } SaErrorT snmp_bc_reset_watchdog(void *hnd, SaHpiResourceIdT id, SaHpiWatchdogNumT num) { /* Watchdog not supported */ return SA_ERR_HPI_NOT_PRESENT; } void * oh_get_watchdog_info (void *, SaHpiResourceIdT, SaHpiWatchdogNumT, SaHpiWatchdogT *) __attribute__ ((weak, alias("snmp_bc_get_watchdog_info"))); void * oh_set_watchdog_info (void *, SaHpiResourceIdT, SaHpiWatchdogNumT, SaHpiWatchdogT *) __attribute__ ((weak, alias("snmp_bc_set_watchdog_info"))); void * oh_reset_watchdog (void *, SaHpiResourceIdT, SaHpiWatchdogNumT) __attribute__ ((weak, alias("snmp_bc_reset_watchdog"))); openhpi-2.14.1/plugins/watchdog/0000755000076400007640000000000011405006365013452 5ustar openhpi-2.14.1/plugins/watchdog/Makefile.am0000644000076400007640000000345011302566625015516 0ustar # # Copyright (c) 2003, Intel Corporation # All rights reserved. # # 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. # # Neither the name of Intel Corporation nor the names # of its contributors may be used to endorse or promote products # derived from this software without specific prior written permission. # # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS # "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT # LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS # FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT # OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, # SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED # TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, # OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY # OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING # NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS # SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. # MAINTAINERCLEANFILES = Makefile.in INCLUDES = @OPENHPI_INCLUDES@ pkglib_LTLIBRARIES = libwatchdog.la libwatchdog_la_SOURCES = watchdog.c libwatchdog_la_LIBADD = -luuid $(top_builddir)/utils/libopenhpiutils.la libwatchdog_la_LDFLAGS = -module -version-info @HPI_LIB_VERSION@ openhpi-2.14.1/plugins/watchdog/watchdog.c0000644000076400007640000004451011302566625015430 0ustar /* -*- watchdog-c -*- * * Copyright (c) 2003 by Intel Corp. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Rusty Lynch * Julie Fleischer * * watchdog.c: This OpenHPI plug-in implements a simple wrapper for the * standard Linux watchdog interface. * * Note: This program is currently only written to the * functionality in drivers/char/watchdog/softdog.c, so * the functionality is limited. * Will be expanded to functionality in Documentation/ * watchdog/watchdog-api.txt eventually. Even then, * functionality is still quite limited. * Need to use IPMI watchdog for full watchdog * functionality. (This is part of the IPMI plugin.) * * Temperature/Fan RDR code has not been created as could * not find a watchdog defined in watchdog-api.txt that * implemented this functionality. */ #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include /* These two IOCTL's were not added to watchdog.h in older kernels */ #define WDIOC_SETTIMEOUT _IOWR(WATCHDOG_IOCTL_BASE, 6, int) #define WDIOC_GETTIMEOUT _IOR(WATCHDOG_IOCTL_BASE, 7, int) #define MAX_PATH 256 #define DEFAULT_TIMEOUT 10; #define WD_CAPS \ SAHPI_CAPABILITY_RESOURCE|SAHPI_CAPABILITY_RDR|SAHPI_CAPABILITY_WATCHDOG SaHpiEntityPathT g_epbase; /* root entity path (from config) */ struct wdtitems { int initialized; int fd; char path[MAX_PATH]; SaHpiWatchdogT data; }; /** * *watchdog_open: * @handler_config: pointer to config file * * This function creates an instance for the watchdog plugin * and returns a handler to the instance. * addr corresponds to the location of the watchdog device **/ static void *watchdog_open(GHashTable *handler_config, unsigned int hid, oh_evt_queue *eventq) { struct oh_handler_state *hnd; struct wdtitems *wdt; char *er; if (!handler_config) { err("empty handler_config"); return NULL; } else if (!hid) { err("Bad handler id passed."); return NULL; } else if (!eventq) { err("No event queue was passed."); return NULL; } /* set up entity root in g_epbase */ er = (char *)g_hash_table_lookup(handler_config,"entity_root"); if (!er) { err("no entity root present"); return NULL; } oh_encode_entitypath(er, &g_epbase); hnd = malloc(sizeof(*hnd)); if (!hnd) { err("unable to allocate main handler"); return NULL; } memset(hnd, '\0', sizeof(*hnd)); /* assign config to handler_config and initialize rptcache */ hnd->config = handler_config; hnd->rptcache = (RPTable *)g_malloc0(sizeof(RPTable)); hnd->hid = hid; hnd->eventq = eventq; wdt = malloc(sizeof(*wdt)); if (!wdt) { err("unable to allocate wdtitems structure"); free(hnd->rptcache); free(hnd); return NULL; } memset(wdt, '\0', sizeof(*wdt)); strncpy(wdt->path, (char *)g_hash_table_lookup(handler_config, "addr"), MAX_PATH); hnd->data = (void *) wdt; return hnd; } /** * watchdog_close: * @hnd: pointer to instance * * Close the instance for the watchdog plugin. * Note: There is currently no way to test this code * as it is not called by the framework. **/ static void watchdog_close(void *hnd) { struct oh_handler_state *tmp = (struct oh_handler_state *)hnd; struct wdtitems *wdt; if (!tmp) { err("no instance to delete"); return; } wdt = tmp->data; if (wdt->data.Running) { if (write(wdt->fd, "V", 1) != 1) { err("write in watchdog failed"); } close(wdt->fd); } free(tmp->data); free(tmp->rptcache); free(tmp); return; } /** * watchdog_get_event: * @hnd: pointer to handler instance * * This function gets a watchdog event from the watchdog event table * in instance.events. * * Return value: 0 if times out, > 0 is event is returned. **/ static int watchdog_get_event(void *hnd) { struct oh_handler_state *tmp = (struct oh_handler_state *) hnd; if (!tmp) { err("no handler given"); return SA_ERR_HPI_INVALID_PARAMS; } return 0; } /** * watchdog_discover_resources: * @hnd: void pointer to handler * * Discover the resources in watchdog. * * Return value: 0 for success | Error code **/ static int watchdog_discover_resources(void *hnd) { struct oh_event *e; struct oh_handler_state *tmp = (struct oh_handler_state *)hnd; int puid, timeout = DEFAULT_TIMEOUT; struct wdtitems *wdt; if (!tmp) { err("no handler given"); return SA_ERR_HPI_INVALID_PARAMS; } wdt = tmp->data; if (!wdt->initialized) { wdt->initialized = 1; /* * Verify we really have a watchdog available that * interacts with the watchdog char device in the standard way * as described in the kernel watchdog-api.txt * documentation. * * If there are any problems with the standard watchdog * interface, consider the watchdog device undetected * and do not return an error, but just do not bubble * up and RPT and RDR entries. */ wdt->fd = open(wdt->path, O_RDWR); if (-1 == wdt->fd) { err("watchdog device is not enabled"); return 0; } /* the clock is ticking... set the default timeout */ /* before it is too late */ if ( -1 == ioctl(wdt->fd, WDIOC_SETTIMEOUT, &timeout)) { err("unable to set watchdog timeout"); if (write(wdt->fd, "V", 1) != 1) { err("write in watchdog failed"); } close(wdt->fd); return 0; } if ( -1 == ioctl(wdt->fd, WDIOC_GETTIMEOUT, &timeout)) { err("unable to read watchdog timeout"); if (write(wdt->fd, "V", 1) != 1) { err("write in watchdog failed"); } close(wdt->fd); return 0; } /* writing "V" and closing the wdt disables it */ if (-1 == write(wdt->fd, "V", 1)) { err("Unable to write to watchdog - cannot close"); return 0; } close(wdt->fd); /* Set wdt to contain watchdog timer information. * Note: Using watchdog-api.txt, pretimer interrupt * and pretimeout interval functionality is not available. * In addition, event notification of a timeout is * unavailable. */ wdt->data.Log = SAHPI_FALSE; /* don't issue event on timeout */ wdt->data.Running = SAHPI_FALSE; /* not currently running */ wdt->data.TimerUse = SAHPI_WTU_SMS_OS; wdt->data.TimerAction = SAHPI_WA_RESET; wdt->data.PretimerInterrupt = SAHPI_WPI_NONE; wdt->data.PreTimeoutInterval = 0; wdt->data.TimerUseExpFlags = 0; /* not used -- cannot set on timeout */ wdt->data.InitialCount = timeout * 1000; wdt->data.PresentCount = 0; /* * Since event notification on timeout is not available, * the only events we can send back to the OpenHPI * infrastructure are the initial RPT and RDR creation * events to populate the domain RPT table. */ /* * create RPT creation event */ e = (struct oh_event *)malloc(sizeof(*e)); if (!e) { err("unable to allocate event"); return SA_ERR_HPI_OUT_OF_SPACE; } memset(e, '\0', sizeof(struct oh_event)); e->hid = tmp->hid; e->event.EventType = SAHPI_ET_RESOURCE; /* Note: .res_event.entry.ResourceInfo currently unassigned */ e->resource.ResourceEntity.Entry[0].EntityType = SAHPI_ENT_SYSTEM_BOARD; e->resource.ResourceEntity.Entry[0].EntityLocation = 0; oh_concat_ep( &(e->resource.ResourceEntity), &g_epbase); puid = oh_uid_from_entity_path(&(e->resource.ResourceEntity)); e->resource.ResourceId = puid; e->event.Source = puid; e->resource.EntryId = puid; e->resource.ResourceCapabilities = WD_CAPS; e->resource.ResourceSeverity = SAHPI_CRITICAL; /* Note e->u.res_event.entry.DomainId as well as e->u.res_event.domainid.ptr not set */ e->resource.ResourceTag.DataType = SAHPI_TL_TYPE_ASCII6; e->resource.ResourceTag.Language = SAHPI_LANG_ENGLISH; e->resource.ResourceTag.DataLength = 12; strcpy((char *)e->resource.ResourceTag.Data, "System-Board"); e->event.Timestamp = SAHPI_TIME_UNSPECIFIED; e->event.Severity = e->resource.ResourceSeverity; e->event.EventDataUnion.ResourceEvent.ResourceEventType = SAHPI_RESE_RESOURCE_ADDED; /* add resource */ if (0 != oh_add_resource(tmp->rptcache, &(e->resource), NULL, 0)) { err("unable to add resource to RPT"); return SA_ERR_HPI_ERROR; } /* * create RDR creation event */ /* note: reusing e; okay so long as we don't do a free(e) before */ SaHpiRdrT *tmprdr = (SaHpiRdrT *)malloc(sizeof(SaHpiRdrT)); if (!tmprdr) { err("unable to allocate event"); return SA_ERR_HPI_OUT_OF_SPACE; } memset(tmprdr, '\0', sizeof(*tmprdr)); tmprdr->RecordId = 0; /* set to 0 b/c first -- and only -- RDR*/ tmprdr->RdrType = SAHPI_WATCHDOG_RDR; tmprdr->RdrTypeUnion.WatchdogRec.WatchdogNum = SAHPI_DEFAULT_WATCHDOG_NUM; /* set to default b/c only wdt */ tmprdr->RdrTypeUnion.WatchdogRec.Oem = 0; /* n/a */ tmprdr->Entity.Entry[0].EntityType = SAHPI_ENT_SYSTEM_BOARD; tmprdr->Entity.Entry[0].EntityLocation = 0; oh_concat_ep( &(tmprdr->Entity), &g_epbase); tmprdr->IdString.DataType = SAHPI_TL_TYPE_ASCII6; tmprdr->IdString.Language = SAHPI_LANG_ENGLISH; tmprdr->IdString.DataLength = 8; strcpy((char *)tmprdr->IdString.Data, "Watchdog"); /* add RDR */ if (oh_add_rdr(tmp->rptcache, puid, tmprdr, NULL, 0)) { err("unable to add RDR to RPT"); return SA_ERR_HPI_ERROR; } /* Add rdr to event */ e->rdrs = g_slist_append(e->rdrs, tmprdr); /* add event to our event queue */ oh_evt_queue_push(tmp->eventq, e); } return 0; } /** * watchdog_get_watchdog_info: * @hnd: void pointer to handler * @id: RDR for watchdog * @wdt: pointer to watchdog info sent back * * Return watchdog information. * * Return value: 0 for success | Error code **/ static int watchdog_get_watchdog_info(void *hnd, SaHpiResourceIdT id, SaHpiWatchdogNumT num, SaHpiWatchdogT *wdt) { struct oh_handler_state *i = (struct oh_handler_state *)hnd; struct wdtitems *wdtitems; if (!i) { err("no handler given"); return SA_ERR_HPI_INVALID_PARAMS; } wdtitems = i->data; if (!wdtitems) { err("no watchdog info with this handler"); return SA_ERR_HPI_INVALID_PARAMS; } /* We only have one possible watchdog: wdtitems->data */ /* Note that software watchdog does not support all watchdog * functionality, so many items below are overwritten with default * values. */ wdtitems->data.Log = SAHPI_FALSE; /* impossible to issue events on timeout */ wdtitems->data.TimerAction = SAHPI_WA_RESET; /* only reset is supported */ wdtitems->data.PretimerInterrupt = SAHPI_WPI_NONE; /* can't do pretimer */ wdtitems->data.PreTimeoutInterval = 0; /* can't do pretimer */ /* Note: No need to ask wdt for timeout value, since this should * be set correctly already during discover and set. */ wdtitems->data.PresentCount = 0; /* can't do current count */ memcpy( wdt, &wdtitems->data, sizeof(SaHpiWatchdogT)); return 0; } /** * watchdog_set_watchdog_info: * @hnd: void pointer to handler * @id: RDR for watchdog * @wdt: pointer to watchdog info sent to fcn * * Set watchdog information in hnd->data to that sent in wdt. * Also, stop or restart the watchdog timer, depending on * the value of wdt->Running. If it is set to TRUE and wdt * is already running, it is restarted. Otherwise, it will stay * stopped. If it is set to FALSE, it will stop the timer. * * Note: Assuming that lines in the SAF HPI spec that discuss * what to do when InitialCount == 0 apply only when * wdt is already running and wdt->Running is TRUE. * * Return value: 0 for success | Error code **/ static int watchdog_set_watchdog_info(void *hnd, SaHpiResourceIdT id, SaHpiWatchdogNumT num, SaHpiWatchdogT *wdt) { int ret = 0; struct oh_handler_state *i = (struct oh_handler_state *)hnd; struct wdtitems *wdtitems; SaHpiWatchdogT w; if (!i) { err("no handler given"); return SA_ERR_HPI_INVALID_PARAMS; } wdtitems = i->data; if (!wdtitems) { err("no watchdog info with this handler"); return SA_ERR_HPI_INVALID_PARAMS; } w = wdtitems->data; /* We only have one possible watchdog: wdtitems->data, or w */ if (SAHPI_FALSE != wdt->Log) { /* impossible to issue events on timeout */ err("Request for unsupported watchdog action"); ret = SA_ERR_HPI_INVALID_PARAMS; } w.Log = SAHPI_FALSE; w.InitialCount = wdt->InitialCount; if (SAHPI_TRUE == wdt->Running) { if (SAHPI_TRUE == w.Running) { /* restart timer */ int timeout; /* reset timeout */ timeout = wdt->InitialCount / 1000; if (0 == wdt->InitialCount) { /* timeout in 1ms ~= immediately */ timeout = 1; } if ( -1 == ioctl(wdtitems->fd, WDIOC_SETTIMEOUT, &timeout)) { err("unable to set watchdog timeout"); ret = SA_ERR_HPI_ERROR; } /* we read the timeout value after writing */ /* because some watchdog device can only be set */ /* to descrete values, so if we want to keep */ /* the InitialCount accurate then we need to */ /* ask the watchdog device what it really set */ /* the timeout too */ if ( -1 == ioctl(wdtitems->fd, WDIOC_GETTIMEOUT, &timeout)) { err("unable to read watchdog timeout"); ret = SA_ERR_HPI_ERROR; } w.InitialCount = timeout * 1000; /* pat the dog to restart the timer from the initial * countdown value */ dbg("reset the watchdog"); if (-1 == write(wdtitems->fd, "1", 1)) { err("could not reset watchdog"); ret = SA_ERR_HPI_ERROR; } } /* if w.Running == SAHPI_FALSE, wdt remains stopped */ } else { if (SAHPI_TRUE == w.Running) { /* stop the watchdog device */ warn("Watchdog timer stopped by OpenHPI"); if (-1 == write(wdtitems->fd, "V", 1)) { err("Unable to write to watchdog"); ret = SA_ERR_HPI_ERROR; } close(wdtitems->fd); w.Running = SAHPI_FALSE; } /* if w.Running == SAHPI_FALSE, wdt remains stopped */ } w.TimerUse = wdt->TimerUse; if (SAHPI_WA_RESET != wdt->TimerAction) { /* only reset is supported */ err("Request for unsupported watchdog action"); ret = SA_ERR_HPI_INVALID_PARAMS; } w.TimerAction = SAHPI_WA_RESET; if (SAHPI_WPI_NONE != wdt->PretimerInterrupt || 0 != wdt->PreTimeoutInterval) { /* we have no way of doing a pre-timeout interrupt */ err("pretimeout functionality is not available"); ret = SA_ERR_HPI_INVALID_PARAMS; } w.PretimerInterrupt = SAHPI_WPI_NONE; w.PreTimeoutInterval = 0; w.TimerUseExpFlags = wdt->TimerUseExpFlags; /* According to SaHpi.h, PresentCount should be ignored in this call */ wdtitems->data = w; return ret; } /** * watchdog_reset_watchdog: * @hnd: void pointer to handler * @id: RDR for watchdog * * Reset the watchdog timer from the initial countdown value. * * Return value: 0 for success | Error code **/ static int watchdog_reset_watchdog(void *hnd, SaHpiResourceIdT id, SaHpiWatchdogNumT num) { struct oh_handler_state *i = (struct oh_handler_state *)hnd; struct wdtitems *wdtitems; if (!i) { err("no handler given"); return SA_ERR_HPI_INVALID_PARAMS; } wdtitems = i->data; if (!wdtitems) { err("no watchdog info with this handler"); return SA_ERR_HPI_INVALID_PARAMS; } if (wdtitems->data.Running == SAHPI_FALSE) { int timeout; warn("Watchdog timer started by OpenHPI"); /* calling reset on stopped watchdog will */ /* cause the watchdog to start */ wdtitems->fd = open(wdtitems->path, O_RDWR); if (-1 == wdtitems->fd) { err("could not open watchdog device"); return SA_ERR_HPI_ERROR; } wdtitems->data.Running = SAHPI_TRUE; timeout = wdtitems->data.InitialCount / 1000; if ( -1 == ioctl(wdtitems->fd, WDIOC_SETTIMEOUT, &timeout)) { err("unable to set watchdog timeout"); return SA_ERR_HPI_ERROR; } /* we read the timeout value after writing */ /* because some watchdog device can only be set */ /* to descrete values, so if we want to keep */ /* the InitialCount accurate then we need to */ /* ask the watchdog device what it really set */ /* the timeout too */ if ( -1 == ioctl(wdtitems->fd, WDIOC_GETTIMEOUT, &timeout)) { err("unable to read watchdog timeout"); return SA_ERR_HPI_ERROR; } wdtitems->data.InitialCount = timeout * 1000; } /* pat the dog to restart the timer from the initial * countdown value */ dbg("reset the watchdog"); if (-1 == write(wdtitems->fd, "1", 1)) { err("unable to reset the watchdog"); return SA_ERR_HPI_ERROR; } return 0; } void * oh_open (GHashTable *, unsigned int, oh_evt_queue *) __attribute__ ((weak, alias("watchdog_open"))); void * oh_close (void *) __attribute__ ((weak, alias("watchdog_close"))); void * oh_get_event (void *) __attribute__ ((weak, alias("watchdog_get_event"))); void * oh_discover_resources (void *) __attribute__ ((weak, alias("watchdog_discover_resources"))); void * oh_get_watchdog_info (void *, SaHpiResourceIdT, SaHpiWatchdogNumT, SaHpiWatchdogT *) __attribute__ ((weak, alias("watchdog_get_watchdog_info"))); void * oh_set_watchdog_info (void *, SaHpiResourceIdT, SaHpiWatchdogNumT, SaHpiWatchdogT *) __attribute__ ((weak, alias("watchdog_set_watchdog_info"))); void * oh_reset_watchdog (void *, SaHpiResourceIdT, SaHpiWatchdogNumT) __attribute__ ((weak, alias("watchdog_reset_watchdog"))); openhpi-2.14.1/plugins/watchdog/README0000644000076400007640000000077111302566625014345 0ustar ################################################################################ In order to use this plugin, you must have a machine with softdog compiled into the kernel. To insert softdog, do: insmod softdog [soft_noboot=1] *Note: The soft_noboot=1 is for testing so that the machine does not reboot. Also, create the watchdog module using: mknod /dev/watchdog c 10 130 as root. To install this code: make make install (as root) Can be verified using program examples/list_resources (as root) openhpi-2.14.1/plugins/ipmidirect/0000755000076400007640000000000011405006365014003 5ustar openhpi-2.14.1/plugins/ipmidirect/Makefile.am0000644000076400007640000000707311302567000016040 0ustar # # Copyright (c) 2003, Intel Corporation # All rights reserved. # # 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. # # Neither the name of Intel Corporation nor the names # of its contributors may be used to endorse or promote products # derived from this software without specific prior written permission. # # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS # "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT # LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS # FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT # OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, # SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED # TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, # OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY # OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING # NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS # SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. # MAINTAINERCLEANFILES = Makefile.in *~ core core.* INCLUDES = @OPENHPI_INCLUDES@ SUBDIRS = t DIST_SUBDIRS = t pkglib_LTLIBRARIES = libipmidirect.la libipmidirect_la_SOURCES= \ array.h \ hotswap.cpp \ ipmi.h \ ipmi.cpp \ ipmi_addr.h \ ipmi_addr.cpp \ ipmi_auth.h \ ipmi_auth.cpp \ ipmi_cmd.h \ ipmi_cmd.cpp \ ipmi_con.h \ ipmi_con.cpp \ ipmi_con_lan.h \ ipmi_con_lan.cpp \ ipmi_con_smi.h \ ipmi_con_smi.cpp \ ipmi_control.h \ ipmi_control.cpp \ ipmi_control_atca_led.h \ ipmi_control_atca_led.cpp \ ipmi_control_fan.h \ ipmi_control_fan.cpp \ ipmi_control_sun_led.h \ ipmi_control_sun_led.cpp \ ipmi_discover.h \ ipmi_discover.cpp \ ipmi_domain.h \ ipmi_domain.cpp \ ipmi_entity.h \ ipmi_entity.cpp \ ipmi_event.h \ ipmi_event.cpp \ ipmi_fru_info.h \ ipmi_fru_info.cpp \ ipmi_inventory.h \ ipmi_inventory.cpp \ ipmi_inventory_parser.h \ ipmi_inventory_parser.cpp \ ipmi_log.h \ ipmi_log.cpp \ ipmi_mc.h \ ipmi_mc.cpp \ ipmi_mc_vendor.h \ ipmi_mc_vendor.cpp \ ipmi_mc_vendor_force.h \ ipmi_mc_vendor_force.cpp \ ipmi_mc_vendor_intel.h \ ipmi_mc_vendor_intel.cpp \ ipmi_mc_vendor_sun.h \ ipmi_mc_vendor_sun.cpp \ ipmi_mc_vendor_fix_sdr.h \ ipmi_mc_vendor_fix_sdr.cpp \ ipmi_msg.h \ ipmi_msg.cpp \ ipmi_rdr.h \ ipmi_rdr.cpp \ ipmi_resource.h \ ipmi_resource.cpp \ ipmi_sdr.h \ ipmi_sdr.cpp \ ipmi_sel.h \ ipmi_sel.cpp \ ipmi_sensor.h \ ipmi_sensor.cpp \ ipmi_sensor_discrete.h \ ipmi_sensor_discrete.cpp \ ipmi_sensor_factors.h \ ipmi_sensor_factors.cpp \ ipmi_sensor_hotswap.h \ ipmi_sensor_hotswap.cpp \ ipmi_sensor_threshold.h \ ipmi_sensor_threshold.cpp \ ipmi_text_buffer.h \ ipmi_text_buffer.cpp \ ipmi_utils.h \ ipmi_utils.cpp \ ipmi_watchdog.h \ ipmi_watchdog.cpp \ thread.h \ thread.cpp libipmidirect_la_LIBADD = @CRYPTO_LIB@ -luuid -lm -lstdc++ $(top_builddir)/utils/libopenhpiutils.la libipmidirect_la_LDFLAGS= -module -version-info @HPI_LIB_VERSION@ clean-local: rm -f *~ openhpi-2.14.1/plugins/ipmidirect/ipmi_con.cpp0000644000076400007640000003134211302567000016301 0ustar /* * ipmi_con.c * * Interface code for handling IPMI connections * * Copyright (c) 2003,2004 by FORCE Computers. * Copyright (c) 2005-2007 by ESO Technologies. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Thomas Kanngieser * Pierre Sangouard */ #include #include #include #include #include #include #include "ipmi_con.h" cIpmiCon::cIpmiCon( unsigned int timeout, int log_level ) : m_is_open( false ), m_fd( -1 ), m_slave_addr( dIpmiBmcSlaveAddr ), m_max_outstanding( 1 ), m_queue( 0 ), m_num_outstanding( 0 ), m_current_seq( 0 ), m_exit( false ), m_log_level( log_level ), m_timeout( timeout ), m_check_connection( false ) { // m_log_level = dIpmiConLogEvent; for( int i = 0; i < dMaxSeq; i++ ) m_outstanding[i] = 0; m_last_receive_timestamp = cTime::Now(); } cIpmiCon::~cIpmiCon() { assert( !IsRunning() ); RequeueOutstanding(); while( m_queue ) { cIpmiRequest *r = (cIpmiRequest *)m_queue->data; delete r; m_queue = g_list_remove( m_queue, r ); } } void cIpmiCon::RequeueOutstanding() { for( int i = 0; i < dMaxSeq; i++ ) { if ( m_outstanding[i] == 0 ) continue; if ( m_outstanding[i]->m_retries_left == 0 ) m_outstanding[i]->m_retries_left = 1; m_queue = g_list_append( m_queue, m_outstanding[i] ); RemOutstanding( i ); } } int cIpmiCon::AddOutstanding( cIpmiRequest *r ) { assert( m_num_outstanding < m_max_outstanding ); // find next free seq while( true ) { if ( m_outstanding[m_current_seq] == 0 ) break; m_current_seq++; m_current_seq %= m_max_seq; } r->m_seq = m_current_seq; m_outstanding[m_current_seq] = r; m_num_outstanding++; m_current_seq++; m_current_seq %= m_max_seq; return r->m_seq; } void cIpmiCon::RemOutstanding( int seq ) { assert( seq >= 0 && seq < dMaxSeq ); if ( m_outstanding[seq] == 0 ) { assert( 0 ); return; } m_outstanding[seq] = 0; m_num_outstanding--; assert( m_num_outstanding >= 0 ); } void cIpmiCon::HandleMsgError( cIpmiRequest *r, SaErrorT err ) { // try again if ( r->m_retries_left > 0 ) { m_log_lock.Lock(); stdlog << "timeout: resending message.\n"; m_log_lock.Unlock(); m_queue = g_list_append( m_queue, r ); // if a check connection is not in progress // initiate a check connection cTime timeout = m_last_receive_timestamp; timeout += m_timeout; if ( !m_check_connection && timeout < cTime::Now() ) { m_check_connection = true; bool check = IfCheckConnection( timeout ); if ( !check ) m_check_connection = false; else m_check_connection_timeout = timeout; } return; } // error while sending command m_log_lock.Lock(); if ( err == SA_ERR_HPI_TIMEOUT ) stdlog << ">tim " << (unsigned char)r->m_seq << "\n"; else stdlog << ">err " << (unsigned char)r->m_seq << " " << err << "\n"; m_log_lock.Unlock(); r->m_error = err; r->m_signal->Lock(); r->m_signal->Signal(); r->m_signal->Unlock(); } SaErrorT cIpmiCon::SendCmd( cIpmiRequest *request ) { assert( m_num_outstanding < m_max_outstanding ); request->m_retries_left--; assert( request->m_retries_left >= 0 ); int seq = AddOutstanding( request ); if ( m_log_level & dIpmiConLogCmd ) { m_log_lock.Lock(); stdlog << ">cmd " << (unsigned char)seq << " "; IpmiLogDataMsg( request->m_addr, request->m_msg ); stdlog << "\n"; m_log_lock.Unlock(); } // message timeout request->m_timeout = cTime::Now(); // add timeout request->m_timeout += m_timeout; // addr translation IfAddrToSendAddr( request->m_addr, request->m_send_addr ); // send message SaErrorT rv = IfSendCmd( request ); if ( rv != SA_OK ) { RemOutstanding( seq ); return rv; } return SA_OK; } void cIpmiCon::SendCmds() { while( m_queue && m_num_outstanding < m_max_outstanding ) { cIpmiRequest *r = (cIpmiRequest *)m_queue->data; m_queue = g_list_remove( m_queue, r ); SaErrorT rv = SendCmd( r ); if ( rv != SA_OK ) HandleMsgError( r, rv ); } } void * cIpmiCon::Run() { stdlog << "starting reader thread.\n"; // create pollfd struct pollfd pfd; pfd.events = POLLIN; // reader loop while( !m_exit ) { // check for check connction timeout if ( m_check_connection ) { cTime now = cTime::Now(); if ( now >= m_check_connection_timeout ) { IfCheckConnectionTimeout(); // if a new connection is established // resend messages m_queue_lock.Lock(); SendCmds(); m_queue_lock.Unlock(); m_check_connection = false; } } assert( m_fd >= 0 ); // do this before every poll(), // because m_fd can change pfd.fd = m_fd; int rv = poll( &pfd, 1, 100 ); if ( rv == 1 ) // read response IfReadResponse(); else if ( rv != 0 ) { if ( errno != EINTR ) { // error stdlog << "poll returns " << rv << ", " << errno << ", " << strerror( errno ) << " !\n"; assert( 0 ); } } // check for expiered ipmi commands cTime now = cTime::Now(); m_queue_lock.Lock(); for( int i = 0; i < m_max_seq; i++ ) { if ( m_outstanding[i] == 0 ) continue; cIpmiRequest *r = m_outstanding[i]; if ( r->m_timeout > now ) continue; stdlog << "IPMI msg timeout: addr " << r->m_addr.m_slave_addr << " " << IpmiCmdToString( r->m_msg.m_netfn, r->m_msg.m_cmd ) << ", seq " << (unsigned char)r->m_seq << ", timeout " << (int)r->m_timeout.m_time.tv_sec << " " << (int)r->m_timeout.m_time.tv_usec << ", now " << (int)now.m_time.tv_sec << " " << (int)now.m_time.tv_usec << "!\n"; // timeout expired RemOutstanding( r->m_seq ); HandleMsgError( r, SA_ERR_HPI_TIMEOUT ); } // send new comands SendCmds(); m_queue_lock.Unlock(); } stdlog << "stop reader thread.\n"; return 0; } void cIpmiCon::IfClose() { } void cIpmiCon::IfAddrToSendAddr( const cIpmiAddr &addr, cIpmiAddr &send_addr ) { // address translation send_addr = addr; if ( addr.m_type == eIpmiAddrTypeIpmb || addr.m_type == eIpmiAddrTypeIpmbBroadcast ) { if ( addr.m_slave_addr == m_slave_addr ) { // Most systems don't handle sending to your own slave // address, so we have to translate here. send_addr.Si(); send_addr.m_lun = addr.m_lun; } } } bool cIpmiCon::IfCheckConnection( cTime & /*timeout*/ ) { // no connection check return false; } void cIpmiCon::IfCheckConnectionTimeout() { } void cIpmiCon::HandleCheckConnection( bool state ) { if ( state ) m_last_receive_timestamp = cTime::Now(); m_check_connection = false; } bool cIpmiCon::Open() { if ( IsOpen() ) return true; m_max_seq = IfGetMaxSeq(); assert( m_max_seq > 0 && m_max_seq <= dMaxSeq ); m_fd = IfOpen(); if ( m_fd == -1 ) return false; m_last_receive_timestamp = cTime::Now(); m_exit = false; // start reader thread if ( !Start() ) return false; m_is_open = true; return true; } void cIpmiCon::Close() { if ( !IsOpen() ) return; assert( IsRunning() ); // signal reader thread to terminate m_exit = true; // wait for reader thread void *rv; Wait( rv ); IfClose(); m_is_open = false; } // send an ipmi command and wait for response. SaErrorT cIpmiCon::Cmd( const cIpmiAddr &addr, const cIpmiMsg &msg, cIpmiAddr &rsp_addr, cIpmiMsg &rsp, int retries ) { assert( retries > 0 ); SaErrorT rv; assert( msg.m_data_len <= dIpmiMaxMsgLength ); assert( IsRunning() ); cThreadCond cond; // create request cIpmiRequest *r = new cIpmiRequest( addr, msg ); r->m_rsp_addr = &rsp_addr; r->m_rsp = &rsp; r->m_signal = &cond; r->m_error = SA_ERR_HPI_INVALID_CMD; r->m_retries_left = retries; // lock queue cond.Lock(); m_queue_lock.Lock(); if ( m_num_outstanding < m_max_outstanding ) { // send the command within this thread context. rv = SendCmd( r ); if ( rv != SA_OK ) { // error delete r; m_queue_lock.Unlock(); cond.Unlock(); return rv; } } else { stdlog << "send queue full.\n"; m_queue = g_list_append( m_queue, r ); } m_queue_lock.Unlock(); // wait for response cond.Wait(); cond.Unlock(); rv = r->m_error; delete r; if ( rv == SA_OK ) { if ( ((tIpmiNetfn)(msg.m_netfn | 1) != rsp.m_netfn) || (msg.m_cmd != rsp.m_cmd) ) { stdlog << "Mismatch send netfn " << msg.m_netfn << " cmd " << msg.m_cmd << ", recv netfn " << rsp.m_netfn << " cmd " << rsp.m_cmd << "\n"; rv = SA_ERR_HPI_INTERNAL_ERROR; } } return rv; } SaErrorT cIpmiCon::ExecuteCmd( const cIpmiAddr &addr, const cIpmiMsg &msg, cIpmiMsg &rsp_msg, int retries ) { cIpmiAddr rsp_addr; return Cmd( addr, msg, rsp_addr, rsp_msg, retries ); } void cIpmiCon::HandleResponse( int seq, const cIpmiAddr &addr, const cIpmiMsg &msg ) { m_last_receive_timestamp = cTime::Now(); m_queue_lock.Lock(); if ( m_outstanding[seq] == 0 ) { m_log_lock.Lock(); stdlog << "reading response without request:\n"; stdlog << "# " << (unsigned char)seq << " "; IpmiLogDataMsg( addr, msg ); stdlog << "\n"; m_log_lock.Unlock(); m_queue_lock.Unlock(); return; } cIpmiRequest *r = m_outstanding[seq]; assert( r->m_seq == seq ); if ( m_log_level & dIpmiConLogCmd ) { m_log_lock.Lock(); stdlog << "m_seq << " "; IpmiLogDataMsg( addr, msg ); stdlog << "\n"; m_log_lock.Unlock(); } RemOutstanding( seq ); // addr translation *r->m_rsp_addr = addr; // convert braodcast to ipmb if ( r->m_rsp_addr->m_type == eIpmiAddrTypeIpmbBroadcast ) r->m_rsp_addr->m_type = eIpmiAddrTypeIpmb; r->m_error = SA_OK; *r->m_rsp = msg; r->m_signal->Lock(); r->m_signal->Signal(); r->m_signal->Unlock(); m_queue_lock.Unlock(); } void cIpmiCon::HandleEvent( const cIpmiAddr &addr, const cIpmiMsg &msg ) { m_last_receive_timestamp = cTime::Now(); if ( m_log_level & dIpmiConLogEvent ) { m_log_lock.Lock(); stdlog << ">evt "; IpmiLogDataMsg( addr, msg ); stdlog << "\n"; m_log_lock.Unlock(); } HandleAsyncEvent( addr, msg ); } void IpmiLogDataMsg( const cIpmiAddr &addr, const cIpmiMsg &msg ) { char str[1024]; char *s = str; int remaining; // addr switch( addr.m_type ) { case eIpmiAddrTypeIpmb: s += snprintf( s, sizeof(str), "%02x %02x %02x %02x", eIpmiAddrTypeIpmb, addr.m_channel, addr.m_lun, addr.m_slave_addr ); break; case eIpmiAddrTypeSystemInterface: s += snprintf( s, sizeof(str), "%02x %02x %02x ", eIpmiAddrTypeSystemInterface, addr.m_channel, addr.m_lun ); break; case eIpmiAddrTypeIpmbBroadcast: s += snprintf( s, sizeof(str), "%02x %02x %02x %02x", eIpmiAddrTypeIpmbBroadcast, addr.m_channel, addr.m_lun, addr.m_slave_addr ); } remaining = sizeof(str) - (s - str); if (remaining > 0) s += snprintf( s, remaining, " %s (%02d) ", IpmiCmdToString( (tIpmiNetfn)(msg.m_netfn & 0xfe), msg.m_cmd ), msg.m_data_len ); const unsigned char *p = msg.m_data; for( int i = 0; i < msg.m_data_len; i++ ) { remaining = sizeof(str) - (s - str); if (remaining > 0) s += snprintf( s, remaining, " %02x", *p++ ); else break; } stdlog << str; } openhpi-2.14.1/plugins/ipmidirect/ipmi_fru_info.cpp0000644000076400007640000001122111302567000017323 0ustar /* * ipmi_fru_info.cpp * * Copyright (c) 2004 by FORCE Computers. * Copyright (c) 2005 by ESO Technologies. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Thomas Kanngieser * Pierre Sangouard */ extern "C" { #include "SaHpiAtca.h" } #include #include "ipmi_fru_info.h" SaHpiEntityTypeT MapAtcaSiteTypeToEntity( tIpmiAtcaSiteType type ) { static SaHpiEntityTypeT et[] = { SAHPI_ENT_PHYSICAL_SLOT, SaHpiEntityTypeT(ATCAHPI_ENT_POWER_ENTRY_MODULE_SLOT), SaHpiEntityTypeT(ATCAHPI_ENT_SHELF_FRU_DEVICE_SLOT), SaHpiEntityTypeT(ATCAHPI_ENT_SHELF_MANAGER_SLOT), SaHpiEntityTypeT(ATCAHPI_ENT_FAN_TRAY_SLOT), SaHpiEntityTypeT(ATCAHPI_ENT_FAN_FILTER_TRAY_SLOT), SaHpiEntityTypeT(ATCAHPI_ENT_ALARM_SLOT), SaHpiEntityTypeT(ATCAHPI_ENT_AMC_SLOT), SaHpiEntityTypeT(ATCAHPI_ENT_PMC_SLOT), SaHpiEntityTypeT(ATCAHPI_ENT_RTM_SLOT), SaHpiEntityTypeT(ATCAHPI_ENT_SHELF_MANAGER_SLOT), SaHpiEntityTypeT(ATCAHPI_ENT_POWER_ENTRY_MODULE_SLOT) }; if ( type >= eIpmiAtcaSiteTypeUnknown ) { return SAHPI_ENT_UNKNOWN; } return et[type]; } cIpmiFruInfo::cIpmiFruInfo( unsigned int addr, unsigned int fru_id, SaHpiEntityTypeT entity, unsigned int slot, tIpmiAtcaSiteType site, unsigned int properties ) : m_addr( addr ), m_fru_id( fru_id ), m_slot( slot ), m_entity( entity ), m_site( site ), m_properties( properties ) { } cIpmiFruInfo::~cIpmiFruInfo() { } cIpmiEntityPath cIpmiFruInfo::CreateEntityPath( const cIpmiEntityPath &top, const cIpmiEntityPath &bottom ) { cIpmiEntityPath middle; middle.SetEntry( 0, m_entity, m_slot ); middle.AppendRoot( 1 ); cIpmiEntityPath ep = bottom; ep += middle; ep += top; return ep; } cIpmiFruInfoContainer::cIpmiFruInfoContainer() : m_fru_info( 0 ) { } cIpmiFruInfoContainer::~cIpmiFruInfoContainer() { while( m_fru_info ) { cIpmiFruInfo *fi = (cIpmiFruInfo *)m_fru_info->data; m_fru_info = g_list_remove( m_fru_info, fi ); delete fi; } } cIpmiFruInfo * cIpmiFruInfoContainer::FindFruInfo( unsigned int addr, unsigned int fru_id ) const { for( GList *list = m_fru_info; list; list = g_list_next( list ) ) { cIpmiFruInfo *fi = (cIpmiFruInfo *)list->data; if ( fi->Address() == addr && fi->FruId() == fru_id ) return fi; } return 0; } bool cIpmiFruInfoContainer::AddFruInfo( cIpmiFruInfo *fru_info ) { if ( FindFruInfo( fru_info->Address(), fru_info->FruId() ) ) { return false; } m_fru_info = g_list_append( m_fru_info, fru_info ); return true; } bool cIpmiFruInfoContainer::RemFruInfo( cIpmiFruInfo *fru_info ) { for( GList *list = m_fru_info; list; list = g_list_next( list ) ) { cIpmiFruInfo *fi = (cIpmiFruInfo *)list->data; if ( fi == fru_info ) { m_fru_info = g_list_remove( m_fru_info, fru_info ); delete fru_info; return true; } } return false; } cIpmiFruInfo * cIpmiFruInfoContainer::NewFruInfo( unsigned int addr, unsigned int fru_id, SaHpiEntityTypeT entity, unsigned int slot, tIpmiAtcaSiteType site, unsigned int properties ) { assert( fru_id == 0 ); cIpmiFruInfo *fi = FindFruInfo( addr, fru_id ); if ( fi ) return fi; fi = new cIpmiFruInfo( addr, fru_id, entity, slot, site, properties ); if ( !AddFruInfo( fi ) ) { delete fi; return 0; } return fi; } cIpmiFruInfo * cIpmiFruInfoContainer::NewFruInfo( unsigned int addr, unsigned int fru_id ) { assert( fru_id != 0 ); cIpmiFruInfo *fi = FindFruInfo( addr, fru_id ); if ( fi ) return fi; cIpmiFruInfo *fi0 = FindFruInfo( addr, 0 ); assert ( fi0 != NULL ); fi = new cIpmiFruInfo( addr, fru_id, fi0->Entity(), fi0->Slot(), fi0->Site(), 0 ); if ( !AddFruInfo( fi ) ) { delete fi; return 0; } return fi; } unsigned int cIpmiFruInfoContainer::GetFreeSlotForOther( unsigned int addr ) { return addr; #if 0 unsigned int slot = 0; for( GList *list = m_fru_info; list; list = g_list_next( list ) ) { cIpmiFruInfo *fi = (cIpmiFruInfo *)list->data; if ( fi->Address() != addr || fi->Entity() ) continue; if ( slot < fi->Slot() ) slot = fi->Slot(); } return slot + 1; #endif } openhpi-2.14.1/plugins/ipmidirect/ipmi_control.h0000644000076400007640000000274211302567000016651 0ustar /* * ipmi_control.h * * Copyright (c) 2004 by FORCE Computers. * Copyright (c) 2005 by ESO Technologies. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Thomas Kanngieser * Pierre Sangouard */ #ifndef dIpmiControl_h #define dIpmiControl_h #ifndef dIpmiRdr_h #include "ipmi_rdr.h" #endif extern "C" { #include "SaHpi.h" } class cIpmiControl : public cIpmiRdr { protected: unsigned int m_num; // control num unsigned int m_oem; SaHpiCtrlOutputTypeT m_output_type; SaHpiCtrlTypeT m_type; public: cIpmiControl( cIpmiMc *mc, unsigned int num, SaHpiCtrlOutputTypeT output_type, SaHpiCtrlTypeT type ); virtual ~cIpmiControl(); virtual unsigned int Num() const { return m_num; } // create an RDR sensor record virtual bool CreateRdr( SaHpiRptEntryT &resource, SaHpiRdrT &rdr ); // hpi virtual SaErrorT SetState( const SaHpiCtrlModeT &mode, const SaHpiCtrlStateT &state ) = 0; virtual SaErrorT GetState( SaHpiCtrlModeT &mode, SaHpiCtrlStateT &state ) = 0; virtual void Dump( cIpmiLog &dump, const char *name ) const = 0; }; #endif openhpi-2.14.1/plugins/ipmidirect/ipmi_event.cpp0000644000076400007640000000773211302567000016651 0ustar /* * ipmi_event.c * * Copyright (c) 2003 by FORCE Computers * Copyright (c) 2007 by ESO Technologies. * * Note that this file is based on parts of OpenIPMI * written by Corey Minyard * of MontaVista Software. Corey's code was helpful * and many thanks go to him. He gave the permission * to use this code in OpenHPI under BSD license. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Thomas Kanngieser * Pierre Sangouard */ #include #include "ipmi_event.h" #include "ipmi_utils.h" #include "ipmi_log.h" #include "ipmi_sensor.h" #include "ipmi_mc.h" static const char *thres_map[] = { "LowerNonCritical", "LowerCritical", "LowerNonRecoverable", "UpperNonCritical", "UpperCritical", "UpperNonRecoverable" }; static int thres_map_num = sizeof( thres_map ) / sizeof( char * ); const char * IpmiThresToString( tIpmiThresh val ) { if ( val >= thres_map_num ) return "invalid"; return thres_map[val]; } void IpmiThresholdMaskToString( unsigned int mask, char *str ) { *str = 0; for( int i = 0; i < 6; i++ ) if ( mask & ( 1 << i ) ) { if ( *str ) strcat( str, " | " ); strcat( str, thres_map[i] ); } } cIpmiEvent::cIpmiEvent() : m_mc( 0 ), m_record_id( 0 ), m_type( 0 ) { memset( m_data, 0, dIpmiMaxSelData ); } int cIpmiEvent::Cmp( const cIpmiEvent &event2 ) const { // if ( event1->mc != event2->mc ) // return 1; if ( m_record_id > event2.m_record_id ) return 1; if ( m_record_id < event2.m_record_id ) return -1; if ( m_type > event2.m_type ) return 1; if ( m_type < event2.m_type ) return -1; return memcmp( m_data, event2.m_data, 13 ); } void cIpmiEvent::Dump( cIpmiLog &dump, const char *name ) const { dump.Begin( "Event", name ); dump.Entry( "RecordId" ) << m_record_id << ";\n"; char str[80]; if ( m_type == 0x02 ) strcpy( str, "SystemEvent" ); else snprintf( str, sizeof(str), "0x%02x", m_type ); dump.Entry( "RecordType" ) << str << ";\n"; unsigned int t = IpmiGetUint32( m_data ); dump.Hex( true ); dump.Entry( "Timestamp" ) << t << ";\n"; dump.Hex( false ); dump.Entry( "SlaveAddr" ) << m_data[4] << ";\n"; dump.Entry( "Channel" ) << (m_data[5] >> 4) << ";\n"; dump.Entry( "Lun" ) << (m_data[5] & 3 ) << ";\n"; dump.Entry( "Revision" ) << (unsigned int)m_data[6] << ";\n"; tIpmiSensorType sensor_type = (tIpmiSensorType)m_data[7]; if ( !strcmp( IpmiSensorTypeToString( sensor_type ), "Invalid" ) ) snprintf( str, sizeof(str), "0x%02x", sensor_type ); else snprintf( str, sizeof(str), "%s", IpmiSensorTypeToString( sensor_type ) ); dump.Entry( "SensorType" ) << str << ";\n"; snprintf( str, sizeof(str), "0x%02x", m_data[8] ); dump.Entry( "SensorNum" ) << str << ";\n"; dump.Entry( "EventDirection" ) << ((m_data[9] & 0x80) ? "Deassertion" : "Assertion" ) << ";\n"; tIpmiEventReadingType reading_type = (tIpmiEventReadingType)(m_data[9] & 0x7f); if ( !strcmp( IpmiEventReadingTypeToString( reading_type ), "Invalid" ) ) snprintf( str, sizeof(str), "0x%02x", reading_type ); else snprintf( str, sizeof(str), "%s", IpmiEventReadingTypeToString( reading_type ) ); dump.Entry( "EventReadingType" ) << str << ";\n"; snprintf( str, sizeof(str), "0x%02x", m_data[10] ); dump.Entry( "EventData1" ) << str << ";\n"; snprintf( str, sizeof(str), "0x%02x", m_data[11] ); dump.Entry( "EventData2" ) << str << ";\n"; snprintf( str, sizeof(str), "0x%02x", m_data[12] ); dump.Entry( "EventData3" ) << str << ";\n"; dump.End(); } openhpi-2.14.1/plugins/ipmidirect/ipmi_utils.cpp0000644000076400007640000000474511302567000016671 0ustar /* * ipmi_utils.cpp * * Copyright (c) 2003 by FORCE Computers * * Note that this file is based on parts of OpenIPMI * written by Corey Minyard * of MontaVista Software. Corey's code was helpful * and many thanks go to him. He gave the permission * to use this code in OpenHPI under BSD license. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Thomas Kanngieser */ #include #include "ipmi_utils.h" static const char *fru_state[] = { "not installed", "inactive", "activation request", "activation in progress", "active", "deactivation request", "deactivation in progress", "communication lost" }; const char * IpmiFruStateToString( tIpmiFruState val ) { if ( val > eIpmiFruStateCommunicationLost ) return "invalid"; return fru_state[val]; } unsigned int IpmiGetUint32( const unsigned char *data ) { return (data[0] | (data[1] << 8) | (data[2] << 16) | (data[3] << 24)); } // Extract a 16-bit integer from the data, IPMI (little-endian) style. unsigned int IpmiGetUint16( const unsigned char *data ) { return data[0] | (data[1] << 8); } // Add a 32-bit integer to the data, IPMI (little-endian) style. void IpmiSetUint32( unsigned char *data, int val ) { data[0] = val & 0xff; data[1] = (val >> 8) & 0xff; data[2] = (val >> 16) & 0xff; data[3] = (val >> 24) & 0xff; } // Add a 16-bit integer to the data, IPMI (little-endian) style. void IpmiSetUint16( unsigned char *data, int val ) { data[0] = val & 0xff; data[1] = (val >> 8) & 0xff; } void IpmiDateToString( unsigned int t, char *str ) { struct tm tmt; time_t dummy = t; localtime_r( &dummy, &tmt ); // 2003.10.30 strftime( str, dDateStringSize, "%Y.%m.%d", &tmt ); } void IpmiTimeToString( unsigned int t, char *str ) { struct tm tmt; time_t dummy = t; localtime_r( &dummy, &tmt ); // 11:11:11 strftime( str, dTimeStringSize, "%H:%M:%S", &tmt ); } void IpmiDateTimeToString( unsigned int t, char *str ) { struct tm tmt; time_t dummy = t; localtime_r( &dummy, &tmt ); // 2003.10.30 11:11:11 strftime( str, dDateTimeStringSize, "%Y.%m.%d %H:%M:%S", &tmt ); } openhpi-2.14.1/plugins/ipmidirect/ipmi_auth.cpp0000644000076400007640000000737411302567000016473 0ustar /* * Copyright (c) 2003,2004 by FORCE Computers * * Note that this file is based on parts of OpenIPMI * written by Corey Minyard * of MontaVista Software. Corey's code was helpful * and many thanks go to him. He gave the permission * to use this code in OpenHPI under BSD license. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Thomas Kanngieser */ #include "ipmi_auth.h" #include #include cIpmiAuth * IpmiAuthFactory( tIpmiAuthType type ) { switch( type ) { case eIpmiAuthTypeNone: return new cIpmiAuthNone; case eIpmiAuthTypeMd2: #ifdef HAVE_OPENSSL_MD2_H return new cIpmiAuthMd2; #else break; #endif case eIpmiAuthTypeMd5: #ifdef HAVE_OPENSSL_MD5_H return new cIpmiAuthMd5; #else break; #endif case eIpmiAuthTypeStraight: return new cIpmiAuthStraight; case eIpmiAuthTypeOem: break; } return 0; } int cIpmiAuthNone::Init( const unsigned char * /*password*/ ) { return 0; } int cIpmiAuthNone::Gen( cIpmiAuthSg /*d*/[], void *output ) { memset( output, 0, 16 ); return 0; } int cIpmiAuthNone::Check( cIpmiAuthSg /*d*/[], void * /*code*/ ) { return 0; } #ifdef HAVE_OPENSSL_MD2_H #include int cIpmiAuthMd2::Init( const unsigned char *password ) { memcpy( data, password, 16 ); return 0; } int cIpmiAuthMd2::Gen( cIpmiAuthSg d[], void *output ) { MD2_CTX ctx; MD2_Init( &ctx ); MD2_Update( &ctx, data, 16 ); for( int i = 0; d[i].data != 0; i++ ) MD2_Update( &ctx, (unsigned char *)d[i].data, d[i].len ); MD2_Update( &ctx, data, 16 ); MD2_Final( (unsigned char *)output, &ctx ); return 0; } int cIpmiAuthMd2::Check( cIpmiAuthSg d[], void *code ) { MD2_CTX ctx; unsigned char md[16]; MD2_Init( &ctx ); MD2_Update( &ctx, data, 16 ); for( int i = 0; d[i].data != 0; i++ ) MD2_Update( &ctx, (unsigned char *)d[i].data, d[i].len ); MD2_Update( &ctx, data, 16 ); MD2_Final( md, &ctx ); if ( memcmp( code, md, 16 ) != 0 ) return EINVAL; return 0; } #endif #ifdef HAVE_OPENSSL_MD5_H #include int cIpmiAuthMd5::Init( const unsigned char *password ) { memcpy( data, password, 16 ); return 0; } int cIpmiAuthMd5::Gen( cIpmiAuthSg d[], void *output ) { MD5_CTX ctx; MD5_Init( &ctx ); MD5_Update( &ctx, data, 16 ); for( int i = 0; d[i].data != 0; i++ ) MD5_Update( &ctx, d[i].data, d[i].len ); MD5_Update( &ctx, data, 16 ); MD5_Final( (unsigned char *)output, &ctx ); return 0; } int cIpmiAuthMd5::Check( cIpmiAuthSg d[], void *code ) { MD5_CTX ctx; unsigned char md[16]; MD5_Init( &ctx ); MD5_Update( &ctx, data, 16 ); for( int i = 0; d[i].data != 0; i++ ) MD5_Update( &ctx, d[i].data, d[i].len ); MD5_Update( &ctx, data, 16 ); MD5_Final( md, &ctx ); if ( memcmp( code, md, 16 ) != 0 ) return EINVAL; return 0; } #endif int cIpmiAuthStraight::Init( const unsigned char *password ) { memcpy( data, password, 16 ); return 0; } int cIpmiAuthStraight::Gen( cIpmiAuthSg /*d*/[], void *output ) { memcpy( output, data, 16 ); return 0; } int cIpmiAuthStraight::Check( cIpmiAuthSg /*d*/[], void *code ) { if ( strncmp( (char *)data, (char *)code, 16 ) != 0 ) return EINVAL; return 0; } openhpi-2.14.1/plugins/ipmidirect/ipmi_mc_vendor.h0000644000076400007640000001417411302567000017147 0ustar /* * ipmi_mc_vendor.h * * Copyright (c) 2004 by FORCE Computers * Copyright (c) 2005-2006 by ESO Technologies. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Thomas Kanngieser * Pierre Sangouard */ #ifndef dIpmiMcVendor_h #define dIpmiMcVendor_h #ifndef dIpmiSensorHotswap_h #include "ipmi_sensor_hotswap.h" #endif #ifndef dIpmiSensorThreshold_h #include "ipmi_sensor_threshold.h" #endif #ifndef dIpmiMsg_h #include "ipmi_msg.h" #endif #ifndef dIpmiFruInfo_h #include "ipmi_fru_info.h" #endif #ifndef dIpmiInventory_h #include "ipmi_inventory.h" #endif class cIpmiMc; class cIpmiMcVendor { static SaHpiEntityLocationT m_unique_instance; public: unsigned int m_manufacturer_id; unsigned int m_product_id; char m_description[80]; cIpmiMcVendor( unsigned int manufacturer_id, unsigned int product_id, const char *desc ); virtual ~cIpmiMcVendor(); SaHpiEntityLocationT GetUniqueInstance() { return m_unique_instance++; } // a new MC is found virtual bool InitMc( cIpmiMc *mc, const cIpmiMsg &devid ); // cleanup code for an MC virtual void CleanupMc( cIpmiMc *mc ); // give vendors a chance to modify the sdrs virtual bool ProcessSdr( cIpmiDomain *domain, cIpmiMc *mc, cIpmiSdrs *sdrs ); virtual bool ProcessFru( cIpmiInventory *inv, cIpmiMc *mc, unsigned int sa, SaHpiEntityTypeT type); // called after reading an SDR to create sensors, controls, frus, sel virtual bool CreateRdrs( cIpmiDomain *domain, cIpmiMc *mc, cIpmiSdrs *sdrs ); // create resources from sdr virtual bool CreateResources( cIpmiDomain *domain, cIpmiMc *source_mc, cIpmiSdrs *sdrs ); // find or create resource virtual cIpmiResource *FindOrCreateResource( cIpmiDomain *domain, cIpmiMc *mc, unsigned int fru_id, cIpmiSdr *sdr, cIpmiSdrs *sdrs ); // find resource virtual cIpmiResource *FindResource( cIpmiDomain *domain, cIpmiMc *mc, unsigned int fru_id, cIpmiSdr *sdr, cIpmiSdrs *sdrs ); virtual cIpmiResource *FindResource( cIpmiDomain *domain, cIpmiMc *mc, unsigned int fru_id, SaHpiEntityTypeT type, SaHpiEntityLocationT instance, cIpmiSdrs *sdrs ); protected: // create a new resource virtual cIpmiResource *CreateResource( cIpmiDomain *domain, cIpmiMc *mc, unsigned int fru_id, cIpmiSdr *sdr, cIpmiSdrs *sdrs ); cIpmiEntityPath CreateEntityPath( cIpmiDomain *domain, unsigned int mc_addr, unsigned int fru_id, SaHpiEntityTypeT type, SaHpiEntityLocationT instance, cIpmiSdrs *sdrs ); public: // create sensors virtual bool CreateSensors( cIpmiDomain *domain, cIpmiMc *source_mc, cIpmiSdrs *sdrs ); protected: virtual GList *GetSensorsFromSdrs( cIpmiDomain *domain, cIpmiMc *source_mc, cIpmiSdrs *sdrs ); virtual GList *CreateSensorFromFullSensorRecord( cIpmiDomain *domain, cIpmiMc *source_mc, cIpmiSdr *sdr, cIpmiSdrs *sdrs ); virtual GList *CreateSensorHotswap( cIpmiDomain *domain, cIpmiMc *mc, cIpmiSdr *sdr, cIpmiSdrs *sdrs ); virtual GList *CreateSensorThreshold( cIpmiDomain *domain, cIpmiMc *mc, cIpmiSdr *sdr, cIpmiSdrs *sdrs ); virtual GList *CreateSensorDiscrete( cIpmiDomain *domain, cIpmiMc *mc, cIpmiSdr *sdr , cIpmiSdrs *sdrs); virtual GList *CreateSensorDefault( cIpmiDomain *domain, cIpmiMc *mc, cIpmiSdr *sdr, cIpmiSdrs *sdrs ); void CreateSensorEntityPath( cIpmiDomain *domain, cIpmiSensor *s, cIpmiMc *source_mc, cIpmiSdr *sdr, cIpmiSdrs *sdrs ); virtual cIpmiMc *FindMcBySdr( cIpmiDomain *domain, cIpmiSdr *sdr ); public: // create controls virtual bool CreateControls( cIpmiDomain *domain, cIpmiMc *mc, cIpmiSdrs *sdrs ); protected: virtual bool CreateControlsAtca( cIpmiDomain *domain, cIpmiMc *mc, cIpmiSdrs *sdrs ); virtual bool CreateControlAtcaFan( cIpmiDomain *domain, cIpmiResource *res, cIpmiSdrs *sdrs ); virtual bool CreateControlAtcaLed( cIpmiDomain *domain, cIpmiResource *res, cIpmiSdrs *sdrs ); public: // create inventory virtual bool CreateInvs( cIpmiDomain *domain, cIpmiMc *mc, cIpmiSdrs *sdrs ); protected: virtual bool CreateInv( cIpmiDomain *domain, cIpmiMc *mc, cIpmiSdr *sdr, cIpmiSdrs *sdrs ); public: // create watchdogs virtual bool CreateWatchdogs( cIpmiDomain *domain, cIpmiMc *mc ); public: // create SEL virtual bool CreateSels( cIpmiDomain *domain, cIpmiMc *source_mc, cIpmiSdrs *sdrs ); }; class cIpmiMcVendorFactory { static cIpmiMcVendorFactory *m_factory; cIpmiMcVendorFactory(); ~cIpmiMcVendorFactory(); public: static void InitFactory(); static void CleanupFactory(); static cIpmiMcVendorFactory *GetFactory() { return m_factory; } protected: // list of all vendor MCs GList *m_mc_vendors; // default mc vendor cIpmiMcVendor *m_default; public: // register a new cIpmiMcVendor bool Register( cIpmiMcVendor *mv ); // unregister cIpmiMcVendor bool Unregister( unsigned int manufacturer_id, unsigned int product_id ); // find a cIpmiMcVendor to a give manufacturer id and product id cIpmiMcVendor *Find( unsigned int manufacturer_id, unsigned int product_id ); // returns the default if not found cIpmiMcVendor *Get( unsigned int manufacturer_id, unsigned int product_id ); cIpmiMcVendor *Default() { return m_default; } }; #endif openhpi-2.14.1/plugins/ipmidirect/ipmi_control_atca_led.h0000644000076400007640000000323211302567000020460 0ustar /* * ipmi_control_atca_led.h * * Copyright (c) 2006 by ESO Technologies. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Pierre Sangouard */ #ifndef dIpmiControlAtcaLed_h #define dIpmiControlAtcaLed_h #ifndef dIpmiControl_h #include "ipmi_control.h" #endif class cIpmiControlAtcaLed : public cIpmiControl { protected: unsigned int m_num; unsigned char m_led_color_capabilities; unsigned char m_led_default_local_color; unsigned char m_led_local_color; unsigned char m_led_default_override_color; unsigned char m_led_override_color; bool m_set_led_state_supported; public: cIpmiControlAtcaLed( cIpmiMc *mc, unsigned int num, unsigned char led_color_capabilities, unsigned char led_color_local_control_state, unsigned char led_color_override_state); virtual ~cIpmiControlAtcaLed(); // create an RDR sensor record virtual bool CreateRdr( SaHpiRptEntryT &resource, SaHpiRdrT &rdr ); // virtual void Log(); virtual SaErrorT SetState( const SaHpiCtrlModeT &mode, const SaHpiCtrlStateT &state ); virtual SaErrorT GetState( SaHpiCtrlModeT &mode, SaHpiCtrlStateT &state ); virtual void Dump( cIpmiLog &dump, const char *name ) const; protected: bool IsSupportedColor(AtcaHpiLedColorT hpi_color); }; #endif openhpi-2.14.1/plugins/ipmidirect/ipmi_inventory.cpp0000644000076400007640000001026211302567000017555 0ustar /* * ipmi_inventory.cpp * * Copyright (c) 2004 by FORCE Computers * Copyright (c) 2005 by ESO Technologies. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Thomas Kanngieser * Pierre Sangouard */ #include #include #include "ipmi_domain.h" #include "ipmi_inventory.h" ////////////////////////////////////////////////// // cIpmiInventory ////////////////////////////////////////////////// cIpmiInventory::cIpmiInventory( cIpmiMc *mc, unsigned int fru_device_id ) : cIpmiRdr( mc, SAHPI_INVENTORY_RDR ), m_fru_device_id( fru_device_id ), m_access( eInventoryAccessModeByte ), m_size( 0 ), m_oem( 0 ), m_addr(eIpmiAddrTypeIpmb, mc->GetChannel(), 0,mc->GetAddress()) { } cIpmiInventory::~cIpmiInventory() { } bool cIpmiInventory::SetAddr(cIpmiAddr addr) { m_addr = addr; return true; } SaErrorT cIpmiInventory::GetFruInventoryAreaInfo( unsigned int &size, tInventoryAccessMode &byte_access ) { cIpmiMsg msg( eIpmiNetfnStorage, eIpmiCmdGetFruInventoryAreaInfo ); msg.m_data[0] = m_fru_device_id; msg.m_data_len = 1; cIpmiMsg rsp; SaErrorT rv = Domain()->SendCommand( m_addr, msg, rsp ); if ( rv != SA_OK ) { stdlog << "cannot GetFruInventoryAreaInfo: " << rv << " !\n"; return rv; } if ( rsp.m_data[0] != eIpmiCcOk ) { stdlog << "cannot GetFruInventoryAreaInfo: " << IpmiCompletionCodeToString( (tIpmiCompletionCode)rsp.m_data[0] ) << " !\n"; return SA_ERR_HPI_INVALID_PARAMS; } byte_access = (rsp.m_data[3] & 1) ? eInventoryAccessModeWord : eInventoryAccessModeByte; size = IpmiGetUint16( rsp.m_data + 1 ) >> byte_access; return SA_OK; } SaErrorT cIpmiInventory::ReadFruData( unsigned short offset, unsigned int num, unsigned int &n, unsigned char *data ) { cIpmiMsg msg( eIpmiNetfnStorage, eIpmiCmdReadFruData ); msg.m_data[0] = m_fru_device_id; IpmiSetUint16( msg.m_data + 1, offset >> m_access ); msg.m_data[3] = num >> m_access; msg.m_data_len = 4; cIpmiMsg rsp; SaErrorT rv = Domain()->SendCommand( m_addr, msg, rsp ); if ( rv != SA_OK ) { stdlog << "cannot ReadFruData: " << rv << " !\n"; return rv; } if ( rsp.m_data[0] != eIpmiCcOk ) { stdlog << "cannot ReadFruData: " << IpmiCompletionCodeToString( (tIpmiCompletionCode)rsp.m_data[0] ) << " !\n"; return SA_ERR_HPI_INVALID_PARAMS; } n = rsp.m_data[1] << m_access; if ( n < 1 ) { stdlog << "ReadFruData: read 0 bytes !\n"; return SA_ERR_HPI_INVALID_PARAMS; } memcpy( data, rsp.m_data + 2, n ); return SA_OK; } SaErrorT cIpmiInventory::Fetch() { m_fetched = false; SaErrorT rv = GetFruInventoryAreaInfo( m_size, m_access ); if ( rv != SA_OK || m_size == 0 ) return rv != SA_OK ? rv : SA_ERR_HPI_INVALID_DATA; unsigned short offset = 0; unsigned char *data = new unsigned char[m_size]; while( offset < m_size ) { unsigned int num = m_size - offset; if ( num > dMaxFruFetchBytes ) num = dMaxFruFetchBytes; unsigned int n; rv = ReadFruData( offset, num, n, data + offset ); if ( rv != SA_OK ) { delete [] data; return rv; } offset += n; } rv = ParseFruInfo( data, m_size, Num() ); delete [] data; m_fetched = ((rv != SA_OK) ? false : true); return rv; } bool cIpmiInventory::CreateRdr( SaHpiRptEntryT &resource, SaHpiRdrT &rdr ) { if ( cIpmiRdr::CreateRdr( resource, rdr ) == false ) return false; // update resource resource.ResourceCapabilities |= SAHPI_CAPABILITY_RDR|SAHPI_CAPABILITY_INVENTORY_DATA; // control record SaHpiInventoryRecT &rec = rdr.RdrTypeUnion.InventoryRec; rec.IdrId = Num(); rec.Oem = m_oem; return true; } openhpi-2.14.1/plugins/ipmidirect/ipmi_mc.cpp0000644000076400007640000004574311302567000016133 0ustar /* * * Copyright (c) 2003,2004 by FORCE Computers * Copyright (c) 2005 by ESO Technologies. * * Note that this file is based on parts of OpenIPMI * written by Corey Minyard * of MontaVista Software. Corey's code was helpful * and many thanks go to him. He gave the permission * to use this code in OpenHPI under BSD license. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Thomas Kanngieser * Pierre Sangouard * Andy Cress */ #include #include #include #include #include #include "ipmi_mc.h" #include "ipmi_inventory.h" #include "ipmi_sensor.h" #include "ipmi_utils.h" #include "ipmi_domain.h" cIpmiMc::cIpmiMc( cIpmiDomain *domain, const cIpmiAddr &addr ) : m_addr( addr ), m_active( true ), m_domain( domain ), m_sensors_in_my_sdr( 0 ), m_sel( 0 ), m_device_id( 0 ), m_device_revision( 0 ), m_provides_device_sdrs( false ), m_device_available( false ), m_device_support ( 0 ), m_chassis_support( false ), m_bridge_support( false ), m_ipmb_event_generator_support( false ), m_ipmb_event_receiver_support( false ), m_fru_inventory_support( false ), m_sel_device_support( false ), m_sdr_repository_support( false ), m_sensor_device_support( false ), m_major_fw_revision( 0 ), m_minor_fw_revision( 0 ), m_major_version( 0 ), m_minor_version( 0 ), m_manufacturer_id( 0 ), m_product_id( 0 ), m_is_tca_mc( false ), m_is_rms_board( false ) { stdlog << "adding MC: " << addr.m_channel << " " << addr.m_slave_addr << "\n"; // use default as long as the manufactorer // and product id is unknown m_vendor = cIpmiMcVendorFactory::GetFactory()->Default(); m_aux_fw_revision[0] = 0; m_aux_fw_revision[1] = 0; m_aux_fw_revision[2] = 0; m_aux_fw_revision[3] = 0; m_sdrs = new cIpmiSdrs( this, true ); m_sel = new cIpmiSel( this, 0 ); } cIpmiMc::~cIpmiMc() { assert( !m_active ); if ( m_sdrs ) { delete m_sdrs; m_sdrs = 0; } if ( m_sel ) { delete m_sel; m_sel = 0; } assert( Num() == 0 ); } cIpmiResource * cIpmiMc::FindResource( cIpmiResource *res ) { for( int i = 0; i < Num(); i++ ) { cIpmiResource *r = operator[]( i ); if ( r == res ) return res; } return 0; } cIpmiResource * cIpmiMc::GetResource( int i ) { if ( i >= Num() ) return 0; cIpmiResource *res = operator[]( i ); return res; } cIpmiResource * cIpmiMc::FindResource( const cIpmiEntityPath &ep ) { for( int i = 0; i < Num(); i++ ) { cIpmiResource *res = operator[]( i ); if ( res->EntityPath() == ep ) return res; } return 0; } void cIpmiMc::AddResource( cIpmiResource *res ) { if ( FindResource( res ) ) { assert( 0 ); return; } Add( res ); } void cIpmiMc::RemResource( cIpmiResource *res ) { int idx = Find( res ); if ( idx == -1 ) { assert( 0 ); return; } Rem( idx ); } bool cIpmiMc::Cleanup() { m_vendor->CleanupMc( this ); // First the device SDR sensors, since they can be there for any MC. while( m_sensors_in_my_sdr ) { cIpmiSensor *sensor = (cIpmiSensor *)m_sensors_in_my_sdr->data; m_sensors_in_my_sdr = g_list_remove( m_sensors_in_my_sdr, sensor ); sensor->Resource()->RemRdr( sensor ); delete sensor; } while( Num() ) { cIpmiResource *res = operator[]( 0 ); res->Destroy(); } m_active = false; stdlog << "removing MC: " << m_addr.m_channel << " " << m_addr.m_slave_addr << "\n"; return true; } SaErrorT cIpmiMc::SendSetEventRcvr( unsigned int addr ) { cIpmiMsg msg( eIpmiNetfnSensorEvent, eIpmiCmdSetEventReceiver ); cIpmiMsg rsp; SaErrorT rv; stdlog << "Send set event receiver: " << addr << ".\n"; msg.m_data_len = 2; msg.m_data[0] = addr; msg.m_data[1] = 0; // LUN is 0 per the spec (section 7.2 of 1.5 spec). stdlog << "SendSetEventRcvr: " << GetChannel() << " " << (unsigned char)GetAddress() << " -> 0 " << (unsigned char)addr << "\n"; rv = SendCommand( msg, rsp ); if ( rv != SA_OK ) return rv; if ( rsp.m_data[0] != 0 ) { // Error setting the event receiver, report it. stdlog << "Could not set event receiver for MC at " << m_addr.m_slave_addr << " !\n"; // Intel ShMc does not like being told where to send events ! if ( rsp.m_data[0] == eIpmiCcInsufficientPrivilege ) return SA_OK; return SA_ERR_HPI_INVALID_DATA; } return SA_OK; } SaErrorT cIpmiMc::HandleNew() { SaErrorT rv; m_active = true; /* fix for SdrRep also - ARCress 09/21/06 */ if ( m_provides_device_sdrs || m_sdr_repository_support ) { rv = m_sdrs->Fetch(); if ( rv ) return rv; if ( m_sdrs->NumSdrs() == 0 ) { stdlog << "WARNING: MC " << m_addr.m_slave_addr << " SDR is empty !!!\n"; return SA_ERR_HPI_INVALID_PARAMS; } if ( m_vendor->ProcessSdr( Domain(), this, m_sdrs ) == false ) return SA_ERR_HPI_INVALID_PARAMS; if ( m_vendor->CreateRdrs( Domain(), this, m_sdrs ) == false ) return SA_ERR_HPI_INVALID_PARAMS; } // read the sel first if ( m_sel_device_support ) { rv = m_sel->GetInfo(); if ( rv != SA_OK ) { m_sel_device_support = false; } else { SaHpiTimeT sel_time; oh_gettimeofday( &sel_time ); m_sel->SetSelTime( sel_time ); m_sel->m_fetched = false; if (IsTcaMc()) { rv = m_sel->ClearSel(); if ( rv != SA_OK ) m_sel_device_support = false; } if ( m_sel_device_support ) { // read old events GList *list = m_sel->GetEvents(); m_sel->ClearList( list ); } } } // We set the event receiver here, so that we know all the SDRs // are installed. That way any incoming events from the device // will have the proper sensor set. unsigned int event_rcvr = 0; if ( m_ipmb_event_generator_support ) { cIpmiMc *er = m_domain->GetEventRcvr(); if ( er ) event_rcvr = er->GetAddress(); } else if ( m_sel_device_support && m_provides_device_sdrs) { // If it is an SEL device and not an event receiver, then // may want to set its event receiver to itself. event_rcvr = GetAddress(); stdlog << "New mc, event_rcvr " << GetAddress() << "\n"; } if ( event_rcvr && IsTcaMc()) { // This is a re-arm of all sensors of the MC // => each sensor sends the pending events again. // because we now which events are old, // we can get the current state. rv = SendSetEventRcvr( event_rcvr ); if ( rv ) return rv; } return 0; } bool cIpmiMc::DeviceDataCompares( const cIpmiMsg &rsp ) const { const unsigned char *rsp_data = rsp.m_data; if ( rsp.m_data_len < 12 ) return false; if ( m_device_id != rsp_data[1] ) return false; if ( m_device_revision != (rsp_data[2] & 0xf) ) return false; if ( m_provides_device_sdrs != ((rsp_data[2] & 0x80) == 0x80) ) ; /* dont return false; ARCress */ if ( m_device_available != ((rsp_data[3] & 0x80) == 0x80) ) return false; if ( m_major_fw_revision != (rsp_data[3] & 0x7f) ) return false; if ( m_minor_fw_revision != (rsp_data[4]) ) return false; if ( m_major_version != (rsp_data[5] & 0xf) ) return false; if ( m_minor_version != ((rsp_data[5] >> 4) & 0xf) ) return false; if ( m_chassis_support != ((rsp_data[6] & 0x80) == 0x80) ) return false; if ( m_bridge_support != ((rsp_data[6] & 0x40) == 0x40) ) return false; if ( m_ipmb_event_generator_support != ((rsp_data[6] & 0x20)==0x20) ) return false; if ( m_ipmb_event_receiver_support != ((rsp_data[6] & 0x10) == 0x10) ) return false; if ( m_fru_inventory_support != ((rsp_data[6] & 0x08) == 0x08) ) return false; if ( m_sel_device_support != ((rsp_data[6] & 0x04) == 0x04) ) return false; if ( m_sdr_repository_support != ((rsp_data[6] & 0x02) == 0x02) ) return false; if ( m_sensor_device_support != ((rsp_data[6] & 0x01) == 0x01) ) return false; if ( m_manufacturer_id != (unsigned int)( (rsp_data[7] | (rsp_data[8] << 8) | (rsp_data[9] << 16))) ) return false; if ( m_product_id != (rsp_data[10] | (rsp_data[11] << 8)) ) return false; if ( rsp.m_data_len < 16 ) { // no aux revision, it should be all zeros. if ( ( m_aux_fw_revision[0] != 0 ) || ( m_aux_fw_revision[1] != 0 ) || ( m_aux_fw_revision[2] != 0 ) || ( m_aux_fw_revision[3] != 0 ) ) return false; } else if ( memcmp( m_aux_fw_revision, rsp_data + 12, 4 ) != 0 ) return false; // Everything's the same. return true; } void cIpmiMc::CheckTca() { cIpmiMsg msg( eIpmiNetfnPicmg, eIpmiCmdGetPicMgProperties ); msg.m_data_len = 1; msg.m_data[0] = dIpmiPicMgId; cIpmiMsg rsp; SaErrorT rv; m_is_tca_mc = false; m_picmg_major = 0; m_picmg_minor = 0; rv = SendCommand( msg, rsp ); if ( rv != SA_OK || rsp.m_data[0] || rsp.m_data[1] != dIpmiPicMgId ) { stdlog << "WARNING: MC " << m_addr.m_slave_addr << " is not a TCA MC !!!\n"; return; } m_picmg_minor = (rsp.m_data[2] >> 4) & 0x0f; m_picmg_major = rsp.m_data[2] & 0x0f; if ( m_picmg_major == 2 ) { stdlog << "MC " << m_addr.m_slave_addr << " is an ATCA MC, PICMG Extension version " << (int)m_picmg_major << "." << (int)m_picmg_minor << "\n"; m_is_tca_mc = true; return; } else if ( m_picmg_major == 5 ) { stdlog << "MC " << m_addr.m_slave_addr << " is a MicroTCA MC, PICMG Extension version " << (int)m_picmg_major << "." << (int)m_picmg_minor << "\n"; m_is_tca_mc = true; return; } stdlog << "WARNING: MC " << m_addr.m_slave_addr << " is not an ATCA MC !!!\n"; return; } int cIpmiMc::GetDeviceIdDataFromRsp( const cIpmiMsg &rsp ) { const unsigned char *rsp_data = rsp.m_data; if ( rsp_data[0] != 0 ) return EINVAL; if ( rsp.m_data_len < 12 ) return EINVAL; m_device_id = rsp_data[1]; m_device_revision = rsp_data[2] & 0xf; m_provides_device_sdrs = (rsp_data[2] & 0x80) == 0x80; m_device_available = (rsp_data[3] & 0x80) == 0x80; m_major_fw_revision = rsp_data[3] & 0x7f; m_minor_fw_revision = (rsp_data[4] & 0x0f) + 10 * ((rsp_data[4] >> 4) & 0x0f); m_major_version = rsp_data[5] & 0xf; m_minor_version = (rsp_data[5] >> 4) & 0xf; m_device_support = rsp_data[6]; m_chassis_support = (rsp_data[6] & 0x80) == 0x80; m_bridge_support = (rsp_data[6] & 0x40) == 0x40; m_ipmb_event_generator_support = (rsp_data[6] & 0x20) == 0x20; m_ipmb_event_receiver_support = (rsp_data[6] & 0x10) == 0x10; m_fru_inventory_support = (rsp_data[6] & 0x08) == 0x08; m_sel_device_support = (rsp_data[6] & 0x04) == 0x04; m_sdr_repository_support = (rsp_data[6] & 0x02) == 0x02; m_sensor_device_support = (rsp_data[6] & 0x01) == 0x01; m_manufacturer_id = (rsp_data[7] | (rsp_data[8] << 8) | (rsp_data[9] << 16)); m_product_id = rsp_data[10] | (rsp_data[11] << 8); if ( rsp.m_data_len < 16 ) // no aux revision. memset( m_aux_fw_revision, 0, 4 ); else memcpy( m_aux_fw_revision, rsp_data + 12, 4 ); return 0; } void cIpmiMc::CheckEventRcvr() { SaErrorT rv; if ( m_ipmb_event_generator_support ) return; // We have an MC that is live (or still live) and generates // events, make sure the event receiver is set properly. cIpmiMc *er = m_domain->GetEventRcvr(); if ( !er ) return; unsigned int event_rcvr = er->GetAddress(); // Don't bother if we have no possible event receivers. if ( !event_rcvr ) return; cIpmiMsg msg( eIpmiNetfnSensorEvent, eIpmiCmdGetEventReceiver ); cIpmiMsg rsp; rv = SendCommand( msg, rsp ); if ( rv != SA_OK ) // No care about return values, if this fails it will be done // again later. return; if ( rsp.m_data[0] != 0 ) { // Error getting the event receiver, report it. stdlog << "Could not get event receiver for MC at " << m_addr.m_slave_addr << " !\n"; return; } if ( rsp.m_data_len < 2 ) { stdlog << "Get event receiver length invalid for MC at " << m_addr.m_slave_addr << " !\n"; return; } cIpmiDomain *domain = m_domain; cIpmiMc *destmc; cIpmiAddr ipmb( eIpmiAddrTypeIpmb, GetChannel(), 0, rsp.m_data[1] ); destmc = domain->FindMcByAddr( ipmb ); if ( !destmc || destmc->m_ipmb_event_receiver_support == 0 ) { // The current event receiver doesn't exist or cannot // receive events, change it. er = m_domain->GetEventRcvr(); if ( er ) SendSetEventRcvr( er->GetAddress() ); } } SaErrorT cIpmiMc::SendCommand( const cIpmiMsg &msg, cIpmiMsg &rsp_msg, unsigned int lun, int retries ) { cIpmiAddr addr = m_addr; addr.m_lun = lun; return m_domain->SendCommand( addr, msg, rsp_msg, retries ); } unsigned int cIpmiMc::GetChannel() const { if ( m_addr.m_type == eIpmiAddrTypeSystemInterface ) return dIpmiBmcChannel; return m_addr.m_channel; } unsigned int cIpmiMc::GetAddress() const { if ( m_addr.m_type == eIpmiAddrTypeIpmb ) return m_addr.m_slave_addr; if ( m_addr.m_type == eIpmiAddrTypeSystemInterface ) return m_addr.m_channel; // Address is ignore for other types. return 0; } cIpmiRdr * cIpmiMc::FindRdr( cIpmiRdr *r ) { for( int i = 0; i < Num(); i++ ) { cIpmiResource *res = operator[]( i ); int idx = res->FindRdr( r ); if ( idx != -1 ) return r; } return 0; } cIpmiSensor * cIpmiMc::FindSensor( unsigned int lun, unsigned int sensor_id ) { for( int i = 0; i < Num(); i++ ) { cIpmiResource *res = operator[]( i ); cIpmiRdr *r = res->FindRdr( this, SAHPI_SENSOR_RDR, sensor_id, lun ); if ( r ) return (cIpmiSensor *)r; } return 0; } cIpmiSensorHotswap * cIpmiMc::FindHotswapSensor() { for( int i = 0; i < Num(); i++ ) { cIpmiResource *res = operator[]( i ); cIpmiSensorHotswap *hs = res->GetHotswapSensor(); if ( hs ) return hs; } return 0; } bool cIpmiMc::DumpControls( cIpmiLog &dump, const char *name ) const { int i; // create a list of controls cArray controls; for( i = 0; i < Num(); i++ ) { cIpmiResource *res = operator[]( i ); for( int j = 0; j < res->NumRdr(); j++ ) { cIpmiRdr *rdr = res->GetRdr( j ); cIpmiControl *control = dynamic_cast( rdr ); if ( control ) controls.Add( control ); } } if ( controls.Num() == 0 ) return false; char control_device_name[80]; snprintf( control_device_name, sizeof(control_device_name), "ControlDevice%02x_", GetAddress() ); // dump controls for( i = 0; i < controls.Num(); i++ ) { cIpmiControl *control = controls[i]; char str[80]; snprintf( str, sizeof(str), "%s%d", control_device_name, control->Num() ); control->Dump( dump, str ); } // dump control device dump.Begin( "Control", name ); dump.Entry( "ControlDevices" ); bool first = true; while( controls.Num() ) { cIpmiControl *control = controls.Rem( 0 ); if ( first ) first = false; else dump << ", "; dump << control_device_name << control->Num(); } dump << ";\n"; dump.End(); return true; } void cIpmiMc::Dump( cIpmiLog &dump, const char *name ) const { char sel_name[80]; snprintf( sel_name, sizeof(sel_name), "Sel%02x", GetAddress() ); char fru_name[80]; snprintf( fru_name, sizeof(fru_name), "Fru%02x", GetAddress() ); bool fru_inventory = false; char control_name[80]; snprintf( control_name, sizeof(control_name), "Control%02x", GetAddress() ); bool control = false; char sdr_name[80]; snprintf( sdr_name, sizeof(sdr_name), "Sdr%02x", GetAddress() ); if ( dump.IsRecursive() ) { if ( m_provides_device_sdrs && m_sdrs ) m_sdrs->Dump( dump, sdr_name ); if ( m_sel && m_sel_device_support ) m_sel->Dump( dump, sel_name ); control = DumpControls( dump, control_name ); } dump.Begin( "Mc", name ); if ( dump.IsRecursive() ) { if ( m_provides_device_sdrs && m_sdrs ) dump.Entry( "Sdr" ) << sdr_name << ";\n"; if ( m_sel && m_sel_device_support ) dump.Entry( "Sel" ) << sel_name << ";\n"; if ( fru_inventory ) dump.Entry( "Fru" ) << fru_name << "\n"; if ( control ) dump.Entry( "Control" ) << control_name << "\n"; } dump.Entry( "DeviceId" ) << (int)m_device_id << ";\n"; dump.Entry( "DeviceRevision" ) << (int)m_device_revision << ";\n"; dump.Entry( "ProvidesDeviceSdr" ) << m_provides_device_sdrs << ";\n"; dump.Entry( "DeviceAvailable" ) << (m_device_available ? "UpdateInProgress" : "NormalOperation" ) << ";\n"; dump.Entry( "ChassisSupport" ) << m_chassis_support << ";\n"; dump.Entry( "BridgeSupport" ) << m_bridge_support << ";\n"; dump.Entry( "IpmbEventGeneratorSupport" ) << m_ipmb_event_generator_support << ";\n"; dump.Entry( "IpmbEventReceiverSupport" ) << m_ipmb_event_receiver_support << ";\n"; dump.Entry( "FruInventorySupport" ) << m_fru_inventory_support << ";\n"; dump.Entry( "SelDeviceSupport" ) << m_sel_device_support << ";\n"; dump.Entry( "SdrRepositorySupport" ) << m_sdr_repository_support << ";\n"; dump.Entry( "SensorDeviceSupport" ) << m_sensor_device_support << ";\n"; dump.Entry( "FwVersion" ) << (int)m_major_fw_revision << ", " << (int)m_minor_fw_revision << ";\n"; dump.Entry( "Version" ) << (int)m_major_version << ", " << (int)m_minor_version << ";\n"; dump.Hex( true ); dump.Entry( "ManufacturerId" ) << m_manufacturer_id << ";\n"; dump.Entry( "ProductId" ) << m_product_id << ";\n"; dump.Hex( false ); dump.End(); } bool cIpmiMc::Populate() { for( int i = 0; i < Num(); i++ ) { cIpmiResource *res = operator[]( i ); if ( res->Populate() == false ) return false; } return true; } openhpi-2.14.1/plugins/ipmidirect/ipmi_sensor_discrete.h0000644000076400007640000000320011302567000020352 0ustar /* * ipmi_sensor_discrete.h * * Copyright (c) 2004 by FORCE Computers * Copyright (c) 2005 by ESO Technologies. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Thomas Kanngieser * Pierre Sangouard */ #ifndef dIpmiSensorDiscrete_h #define dIpmiSensorDiscrete_h #ifndef dIpmiSensor_h #include "ipmi_sensor.h" #endif class cIpmiSensorDiscrete : public cIpmiSensor { public: cIpmiSensorDiscrete( cIpmiMc *mc ); virtual ~cIpmiSensorDiscrete(); // create an hpi event from ipmi event virtual SaErrorT CreateEvent( cIpmiEvent *event, SaHpiEventT &h ); // read sensor parameter from Full Sensor Record virtual bool GetDataFromSdr( cIpmiMc *mc, cIpmiSdr *sdr ); // create an RDR sensor record virtual bool CreateRdr( SaHpiRptEntryT &resource, SaHpiRdrT &rdr ); // get sensor data virtual SaErrorT GetSensorReading( SaHpiSensorReadingT &data, SaHpiEventStateT &state ); virtual SaErrorT GetEventMasksHw( SaHpiEventStateT &AssertEventMask, SaHpiEventStateT &DeassertEventMask ); virtual SaErrorT SetEventMasksHw( const SaHpiEventStateT &AssertEventMask, const SaHpiEventStateT &DeassertEventMask ); }; #endif openhpi-2.14.1/plugins/ipmidirect/ipmi_mc_vendor_intel.cpp0000644000076400007640000002546711302567000020704 0ustar /* * Intel specific code * * Copyright (c) 2004-2006 by Intel Corp. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Andy Cress */ #include "ipmi_mc_vendor_intel.h" #include "ipmi_utils.h" #include "ipmi_log.h" #include "ipmi_mc.h" #include "ipmi_domain.h" // #include #define HSC_SA 0xc0 /*slave address of HSC mc*/ int g_enableHSC = 0; /* flag to detect whether an HSC is present */ /*--------------------------------------- * cIpmiMcVendorIntelBmc object *---------------------------------------*/ cIpmiMcVendorIntelBmc::cIpmiMcVendorIntelBmc( unsigned int product_id ) : cIpmiMcVendor( 0x000157, product_id, "Intel BMC" ) { /* instantiate the cIpmiMcVendorIntelBmc */ } cIpmiMcVendorIntelBmc::~cIpmiMcVendorIntelBmc() { } bool cIpmiMcVendorIntelBmc::InitMc( cIpmiMc *mc, const cIpmiMsg &devid ) { stdlog << "Intel InitMc[" << mc->ManufacturerId() << "," << mc->ProductId() << "]: addr = " << mc->GetAddress() << "\n"; /* Set the m_busid for Leds */ switch(mc->ProductId()) { case 0x0022: m_busid = PRIVATE_BUS_ID5; break; /*TIGI2U*/ case 0x001B: m_busid = PRIVATE_BUS_ID; break; /*TIGPR2U*/ case 0x4311: m_busid = PERIPHERAL_BUS_ID; break; /*TIGPT1U mBMC*/ case 0x0026: case 0x0028: case 0x0811: m_busid = PRIVATE_BUS_ID7; break; /*TIGW1U*/ case 0x0900: /*TIGPR2U HSC*/ case 0x0911: /*TIGI2U HSC*/ case 0x0A0C: /*TIGW1U HSC*/ default: m_busid = PRIVATE_BUS_ID; break; } if (mc->IsTcaMc()) return true; /* * If here, the MC has (manuf_id == 0x000157) Intel, and * product_id == one of these: { 0x000C, 0x001B, 0x0022, 0x4311, * 0x0100, 0x0026, 0x0028, 0x0811 }; * These return GetDeviceID with ProvidesDeviceSdrs() == true, and * use the SDR Repository. */ mc->SetProvidesDeviceSdrs(false); mc->IsRmsBoard() = true; /* * The FRUSDR should be set at the factory, so don't change it here. * Don't clear the SEL here either. */ return true; } bool cIpmiMcVendorIntelBmc::CreateControls(cIpmiDomain *dom, cIpmiMc * mc, cIpmiSdrs * sdrs ) { const char *name; char dstr[80]; int i; if (mc->IsTcaMc()) return true; for ( int j = 0; j < mc->NumResources(); j++ ) { cIpmiResource *res = mc->GetResource( j ); if ( res == 0 ) continue; /* Note that the RPT has not been Populated yet */ if (res->FruId() == 0) { /* Create the alarm LED RDRs for the baseboard */ for (i = 0; i <= LED_IDENT; i++) { cIpmiControlIntelRmsLed *led = new cIpmiControlIntelRmsLed( mc, i); led->EntityPath() = res->EntityPath(); switch (i) { case LED_POWER: name = "Power Alarm LED"; break; case LED_CRIT: name = "Critical Alarm LED"; break; case LED_MAJOR: name = "Major Alarm LED"; break; case LED_MINOR: name = "Minor Alarm LED"; break; case LED_IDENT: name = "Chassis Identify LED"; break; default: snprintf(dstr,sizeof(dstr),"Control LED %d",i); name = dstr; break; } led->IdString().SetAscii(name, SAHPI_TL_TYPE_TEXT, SAHPI_LANG_ENGLISH); res->AddRdr( led ); led->m_busid = m_busid; } break; } } return true; } bool cIpmiMcVendorIntelBmc::ProcessSdr( cIpmiDomain *domain, cIpmiMc *mc, cIpmiSdrs *sdrs ) { if ( mc->GetAddress() != 0x20 ) { stdlog << "Intel MC " << mc->GetAddress() << " skipped\n"; return true; } stdlog << "Intel MC " << mc->GetAddress() << ", ProcessSdr\n"; /* Cannot enable Watchdog here because RPT is not built yet. */ /* * Sort through the SDR DeviceLocatorRecords and handle them. * e.g.: slave address 0xc0 (HSC) or 0x28 (IPMB Bridge), */ for( unsigned int i = 0; i < sdrs->NumSdrs(); i++ ) { cIpmiSdr *sdr = sdrs->Sdr( i ); switch( sdr->m_type ) { case eSdrTypeMcDeviceLocatorRecord: stdlog << "Intel SDR[" << i << "] Locator " << sdr->m_data[5] << "\n"; if (sdr->m_data[5] == HSC_SA) g_enableHSC = 1; break; default: break; } } return true; } bool cIpmiMcVendorIntelBmc::ProcessFru( cIpmiInventory *inv, cIpmiMc *mc, unsigned int sa, SaHpiEntityTypeT type ) { stdlog << "ProcessFru: Intel MC " << sa << " enableHSC " << g_enableHSC << "\n"; if (mc->IsTcaMc()) return true; if (type == SAHPI_ENT_SYSTEM_BOARD) { cIpmiResource *res = inv->Resource(); stdlog << "ProcessFru: found " << inv->IdString() << " id " << res->m_resource_id << "\n"; /* RPTs are not built yet, so we can't enable RESET here */ /* see ipmi_resource.cpp for that. */ } else if ((sa != mc->GetAddress()) && (type != SAHPI_ENT_SYSTEM_BOARD)) { /* g_enableHSC == 1 */ stdlog << "ProcessFru: " << inv->IdString() << " setting addr " << mc->GetAddress() << " to " << sa << " type " << type << "\n"; cIpmiAddr addr(eIpmiAddrTypeIpmb,mc->GetChannel(),0,sa); inv->SetAddr(addr); } return true; } /*--------------------------------------- * cIpmiControlIntelRmsLed object *---------------------------------------*/ cIpmiControlIntelRmsLed::cIpmiControlIntelRmsLed( cIpmiMc *mc, unsigned int num) : cIpmiControl( mc, num, SAHPI_CTRL_LED, SAHPI_CTRL_TYPE_DIGITAL ) { } cIpmiControlIntelRmsLed::~cIpmiControlIntelRmsLed() { } bool cIpmiControlIntelRmsLed::CreateRdr( SaHpiRptEntryT &resource, SaHpiRdrT &rdr ) { int n; if ( cIpmiControl::CreateRdr( resource, rdr ) == false ) return false; n = rdr.RdrTypeUnion.CtrlRec.Num; // rdr->RdrTypeUnion.CtrlRec.Num = n; rdr.RdrTypeUnion.CtrlRec.Oem = OEM_ALARM_BASE + n; rdr.RdrTypeUnion.CtrlRec.Type = SAHPI_CTRL_TYPE_DIGITAL; rdr.RdrTypeUnion.CtrlRec.OutputType = SAHPI_CTRL_LED; if (n == LED_IDENT) /* Identify LED */ rdr.RdrTypeUnion.CtrlRec.WriteOnly = SAHPI_TRUE; else rdr.RdrTypeUnion.CtrlRec.WriteOnly = SAHPI_FALSE; stdlog << "Intel:CreateRdr(Led): num = " << n << " oem_num = " << rdr.RdrTypeUnion.CtrlRec.Oem << "\n"; return true; } SaErrorT cIpmiControlIntelRmsLed::GetState( SaHpiCtrlModeT &mode, SaHpiCtrlStateT &state ) { unsigned char mask = 0x01; int i; SaErrorT rv = SA_OK; /*TODO: add GetAlarmsPicmg() if ATCA */ int idx = m_num; // m_oem - OEM_ALARM_BASE; if (idx == LED_IDENT) { /* Identify LED */ mode = SAHPI_CTRL_MODE_MANUAL; state.Type = SAHPI_CTRL_TYPE_DIGITAL; state.StateUnion.Digital = SAHPI_CTRL_STATE_OFF; return rv; } unsigned char val = GetAlarms(); mode = SAHPI_CTRL_MODE_MANUAL; /* or SAHPI_CTRL_MODE_AUTO */ state.Type = SAHPI_CTRL_TYPE_DIGITAL; for (i = 0; i < idx; i++) mask = mask << 1; if ((val & mask) == 0) state.StateUnion.Digital = SAHPI_CTRL_STATE_ON; else state.StateUnion.Digital = SAHPI_CTRL_STATE_OFF; stdlog << "Led:GetState(" << idx << "): mode = " << mode << " state = " << state.StateUnion.Digital << "\n"; return rv; } SaErrorT cIpmiControlIntelRmsLed::SetState( const SaHpiCtrlModeT &mode, const SaHpiCtrlStateT &state ) { static unsigned char id_time = 20; /*id_time = 20 seconds*/ unsigned char mask = 0x01; unsigned char val, newval; int i; SaErrorT rv = SA_OK; /*TODO: add SetAlarmsPicmg() if ATCA */ int idx = m_num; // m_oem - OEM_ALARM_BASE; if (idx == LED_IDENT) { /* Identify LED */ rv = SetIdentify(id_time); /* turn ID on for id_time seconds */ return rv; } val = GetAlarms(); for (i = 0; i < idx; i++) mask = mask << 1; if (state.StateUnion.Digital == SAHPI_CTRL_STATE_ON) { mask = ~mask; /*NOT*/ newval = val & mask; } else { newval = val | mask; } rv = SetAlarms(newval); stdlog << "Led:SetAlarms(" << idx << ") " << "state = " << state.StateUnion.Digital << " rv = " << rv << "\n"; return rv; } void cIpmiControlIntelRmsLed::Dump( cIpmiLog &dump, const char *name ) const { dump.Begin( "LedControl", name ); dump.End(); } unsigned char cIpmiControlIntelRmsLed::GetAlarms( void ) { cIpmiMsg msg( eIpmiNetfnApp, eIpmiCmdMasterReadWrite ); msg.m_data[0] = m_busid; msg.m_data[1] = ALARMS_PANEL_READ; msg.m_data[2] = 0x01; msg.m_data_len = 3; cIpmiMsg rsp; SaErrorT rv = Resource()->SendCommandReadLock( this, msg, rsp ); if (rv != SA_OK) return(0); // uchar cc = rsp.m_data[0]; return(rsp.m_data[1]); } unsigned char cIpmiControlIntelRmsLed::GetAlarmsPicmg( unsigned char picmg_id, unsigned char fruid) { cIpmiMsg msg( eIpmiNetfnPicmg, eIpmiCmdGetFruLedState ); cIpmiMsg rsp; msg.m_data[0] = picmg_id; msg.m_data[1] = fruid; msg.m_data[2] = 0; /* blue LED */ msg.m_data_len = 3; SaErrorT rv = Resource()->SendCommandReadLock( this, msg, rsp ); if (rv == 0 && rsp.m_data[0] != 0) rv = rsp.m_data[0]; /*comp code*/ if (rv != 0) { stdlog << "GetAlarmsPicmg error rv = " << rv << "\n"; return(0); } return(rsp.m_data[6]); /*status byte*/ } int cIpmiControlIntelRmsLed::SetAlarmsPicmg( unsigned char picmg_id, unsigned char fruid, unsigned char val) { cIpmiMsg msg( eIpmiNetfnPicmg, eIpmiCmdSetFruLedState ); cIpmiMsg rsp; msg.m_data[0] = picmg_id; msg.m_data[1] = fruid; msg.m_data[2] = 0; /* blue LED */ msg.m_data[3] = val; msg.m_data[4] = 0; msg.m_data[5] = 1; /* color blue */ msg.m_data_len = 6; SaErrorT rv = Resource()->SendCommandReadLock( this, msg, rsp ); if (rv != 0) return(rv); if (rsp.m_data[0] != 0) rv = rsp.m_data[0]; /*comp code*/ return(rv); } int cIpmiControlIntelRmsLed::SetAlarms( unsigned char value) { cIpmiMsg msg( eIpmiNetfnApp, eIpmiCmdMasterReadWrite ); msg.m_data[0] = m_busid; msg.m_data[1] = ALARMS_PANEL_WRITE; msg.m_data[2] = 0x01; msg.m_data[3] = value; msg.m_data_len = 4; cIpmiMsg rsp; SaErrorT rv = Resource()->SendCommandReadLock( this, msg, rsp ); if (rv != 0) return(rv); if (rsp.m_data[0] != 0) rv = rsp.m_data[0]; /*comp code*/ return(rv); } int cIpmiControlIntelRmsLed::SetIdentify( unsigned char tval) { cIpmiMsg msg( eIpmiNetfnChassis, eIpmiCmdChassisIdentify ); msg.m_data[0] = tval; /*num seconds*/ msg.m_data_len = 1; cIpmiMsg rsp; SaErrorT rv = Resource()->SendCommandReadLock( this, msg, rsp ); if (rv != 0) return(rv); if (rsp.m_data[0] != 0) rv = rsp.m_data[0]; /*comp code*/ return(rv); } /*end of ipmi_mc_vendor_intel.cpp */ openhpi-2.14.1/plugins/ipmidirect/ipmi_msg.h0000644000076400007640000000225011302567000015751 0ustar /* * * Copyright (c) 2003 by FORCE Computers * * Note that this file is based on parts of OpenIPMI * written by Corey Minyard * of MontaVista Software. Corey's code was helpful * and many thanks go to him. He gave the permission * to use this code in OpenHPI under BSD license. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Thomas Kanngieser */ #ifndef dIpmiMsg_h #define dIpmiMsg_h #ifndef dIpmiCmd_h #include "ipmi_cmd.h" #endif #define dIpmiMaxMsgLength 80 class cIpmiMsg { public: tIpmiNetfn m_netfn; tIpmiCmd m_cmd; unsigned short m_data_len; unsigned char m_data[dIpmiMaxMsgLength]; public: cIpmiMsg(); cIpmiMsg( tIpmiNetfn netfn, tIpmiCmd cmd, unsigned short data_len = 0, unsigned char *data = 0 ); bool Equal( const cIpmiMsg &msg2 ) const; }; #endif openhpi-2.14.1/plugins/ipmidirect/t/0000755000076400007640000000000011405006365014246 5ustar openhpi-2.14.1/plugins/ipmidirect/t/Makefile.am0000644000076400007640000000344111302567000016276 0ustar # # Copyright (c) 2004 by FORCE Computers # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This # file and program are licensed under a BSD style license. See # the Copying file included with the OpenHPI distribution for # full licensing terms. # # Authors: # Thomas Kanngieser # CON_REMOTE_SOURCES = \ ipmi_con.cpp \ ipmi_con_lan.cpp \ ipmi_con_smi.cpp \ ipmi_auth.cpp \ ipmi_cmd.cpp \ ipmi_log.cpp \ ipmi_msg.cpp \ ipmi_addr.cpp \ ipmi_utils.cpp \ thread.cpp THREAD_REMOTE_SOURCES = thread.cpp SENSOR_FACTORS_REMOTE_SOURCES = ipmi_sensor_factors.cpp MOSTLYCLEANFILES = \ $(CON_REMOTE_SOURCES) \ $(THREAD_REMOTE_SOURCES) \ $(SENSOR_FACTORS_REMOTE_SOURCES) \ @TEST_CLEAN@ \ *.log MAINTAINERCLEANFILES = Makefile.in *~ CLEANFILES = @CLEANFILES@ $(MOSTLYCLEANFILES) INCLUDES = @OPENHPI_INCLUDES@ -I$(top_srcdir)/plugins/ipmidirect $(CON_REMOTE_SOURCES): if test ! -f $@ -a ! -L $@; then \ ln -s $(top_srcdir)/plugins/ipmidirect/$@; \ fi $(SENSOR_FACTORS_REMOTE_SOURCES): if test ! -f $@ -a ! -L $@; then \ ln -s $(top_srcdir)/plugins/ipmidirect/$@; \ fi check_PROGRAMS = \ con_000 \ con_001 \ thread_000 \ sensor_factors_000 TESTS = \ thread_000 \ sensor_factors_000 con_000_SOURCES = con_000.cpp nodist_con_000_SOURCES = $(CON_REMOTE_SOURCES) con_000_LDADD = @CRYPTO_LIB@ con_001_SOURCES = con_001.c nodist_con_001_SOURCES = $(CON_REMOTE_SOURCES) con_001_LDADD = @CRYPTO_LIB@ thread_000_SOURCES = thread_000.cpp test.h nodist_thread_000_SOURCES = $(THREAD_REMOTE_SOURCES) sensor_factors_000_SOURCES = sensor_factors_000.cpp test.h nodist_sensor_factors_000_SOURCES = $(SENSOR_FACTORS_REMOTE_SOURCES) openhpi-2.14.1/plugins/ipmidirect/t/thread_000.cpp0000644000076400007640000000243011302567000016571 0ustar /* * Copyright (c) 2004 by FORCE Computers. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Thomas Kanngieser */ #include "thread.h" #include "test.h" #include "ipmi_utils.h" #define dMagic 0x47130815 class cThreadTest : public cThread, public cThreadLock, public cThreadLockRw { public: cThreadTest() : m_magic( dMagic ) {} unsigned int m_magic; protected: virtual void *Run(); }; void * cThreadTest::Run() { cTime tn = cTime::Now(); tn += 1000; cThreadTest *thread = (cThreadTest *)cThread::GetThread(); Test( thread == this ); Test( thread->m_magic == dMagic ); while( tn > cTime::Now() ) usleep( 100000 ); return 0; } int main() { cThread *mt = cThread::GetThread(); Test( mt ); Test( mt->IsRunning() ); Test( mt->IsMain() ); cThreadTest thread; Test( thread.Start() ); Test( thread.IsRunning() ); while( thread.IsRunning() ) usleep( 100000 ); return TestResult(); } openhpi-2.14.1/plugins/ipmidirect/t/con_000.cpp0000644000076400007640000001156711302567000016114 0ustar /* * Stress test for the connection layer * * Copyright (c) 2004 by FORCE Computers * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Thomas Kanngieser * * This test requires: * - IPMI hardware with RMCP * - RMCP configuration like IP address, port, user, password * * So it is not enabled by default. */ #include #include "ipmi_con_lan.h" #include #include #define dNumThreads 30 #define dNumCmdsPerThread 100 static const char *host = "192.168.110.187"; static int port = 623; static const char *user = "kanne"; static const char *passwd = "kanne"; static tIpmiAuthType auth = eIpmiAuthTypeNone; static tIpmiPrivilege priv = eIpmiPrivilegeAdmin; static cIpmiConLan *con = 0; static int num_threads = 0; static int num_cmds = 0; cThreadLockRw lock; class cThreadTest : public cThread { int m_id; cIpmiAddr m_addr; public: cThreadTest( int id, unsigned char slave_addr ) : m_id( id ), m_addr( eIpmiAddrTypeIpmb, 0, 0, slave_addr ) { } int SendCommand( const cIpmiMsg &msg, cIpmiMsg &rsp ) { num_cmds++; return con->ExecuteCmd( m_addr, msg, rsp ); } void ClearSel() { lock.WriteLock(); // get a reservation cIpmiMsg msg( eIpmiNetfnStorage, eIpmiCmdReserveSel ); msg.m_data_len = 0; cIpmiMsg rsp; int rv = SendCommand( msg, rsp ); unsigned short reservation = IpmiGetUint16( rsp.m_data + 1 ); msg.m_netfn = eIpmiNetfnStorage; msg.m_cmd = eIpmiCmdClearSel; IpmiSetUint16( msg.m_data, reservation ); msg.m_data[2] = 'C'; msg.m_data[3] = 'L'; msg.m_data[4] = 'R'; msg.m_data_len = 6; bool first = true; int count = 100; do { msg.m_data[5] = first ? 0xaa : 0; // initiate erase/ erase status first = false; rsp.m_data[0] = 0xff; rv = SendCommand( msg, rsp ); } while( (rsp.m_data[1] & 0x7) != 0x1 && count-- > 0 ); lock.WriteUnlock(); } void Cmd() { cIpmiMsg msg( eIpmiNetfnStorage, eIpmiCmdAddSelEntry ); msg.m_data[0] = 0; msg.m_data[1] = 0; msg.m_data[2] = 0xc0; msg.m_data[3] = 0; msg.m_data[4] = 0; msg.m_data[5] = 0; msg.m_data[6] = 0; msg.m_data[7] = 1; msg.m_data[8] = 2; msg.m_data[9] = 3; msg.m_data[10] = 0; msg.m_data[11] = 0; msg.m_data[12] = 0; msg.m_data[13] = 0; msg.m_data[14] = 0; msg.m_data[15] = 0; msg.m_data_len = 16; cIpmiMsg rsp; lock.ReadLock(); for( int i = 0; i < 10; i++ ) { int rv = SendCommand( msg, rsp ); if ( rv || rsp.m_data[0] ) { lock.ReadUnlock(); ClearSel(); lock.ReadLock(); } } lock.ReadUnlock(); } virtual void *Run() { num_threads++; for( int i = 0; i < dNumCmdsPerThread; i++ ) Cmd(); num_threads--; delete this; return 0; } }; class cIpmiConLanTest : public cIpmiConLan { public: cIpmiConLanTest( unsigned int timeout, struct in_addr addr, int por, tIpmiAuthType aut, tIpmiPrivilege pri, char *u, char *p ) : cIpmiConLan( timeout, 0, addr, por, aut, pri, u, p ) { } virtual ~cIpmiConLanTest() { } virtual void HandleAsyncEvent( const cIpmiAddr & /*addr*/, const cIpmiMsg & /*msg*/ ) { } }; int main( int /*argc*/, char * /*argv*/[] ) { stdlog.Open( dIpmiLogFile|dIpmiLogStdOut ); struct hostent *ent = gethostbyname( host ); if ( !ent ) { stdlog << "unable to resolve IPMI LAN address: " << host << " !\n"; return 1; } struct in_addr lan_addr; memcpy( &lan_addr, ent->h_addr_list[0], ent->h_length ); con = new cIpmiConLanTest( 5000, lan_addr, port, auth, priv, const_cast(user), const_cast(passwd) ); con->SetMaxOutstanding( 4 ); int rv = con->Open() ? 0 : 1; if ( !rv ) { time_t t0 = time( 0 ); for( int i = 0; i < dNumThreads; i++ ) { cThreadTest *t = new cThreadTest( i, 0x20 ); t->Start(); } sleep( 1 ); while( num_threads ) { sleep( 1 ); stdlog << "### " << num_cmds << "\n"; } time_t t = time( 0 ) - t0; stdlog << "time: " << (int)t << "s\n"; } delete con; stdlog << num_cmds << " GetDeviceId\n"; stdlog.Close(); return rv; } openhpi-2.14.1/plugins/ipmidirect/t/con_001.c0000644000076400007640000002112111302567000015540 0ustar /* * Check if async events work. * * Copyright (c) 2004 by FORCE Computers * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Thomas Kanngieser * * This test requires: * - IPMI hardware * - human assistance to generate an event * e.g. eject switch handle * * So it is not enabled by default. */ #include #include #include #include #include #include #include #include #include #include #define dIpmiMaxMsgLength 80 // This is an overlay for all the address types, so it's easy to // determine the actual address type. This is kind of like addresses // work for sockets. #define IPMI_MAX_ADDR_SIZE 32 struct ipmi_addr { // Try to take these from the "Channel Medium Type" table // in section 6.5 of the IPMI 1.5 manual. int addr_type; short channel; char data[IPMI_MAX_ADDR_SIZE]; }; // When the address is not used, the type will be set to this value. // The channel is the BMC's channel number for the channel (usually // 0), or IPMC_BMC_CHANNEL if communicating directly with the BMC. #define IPMI_SYSTEM_INTERFACE_ADDR_TYPE 0x0c struct ipmi_system_interface_addr { int addr_type; short channel; unsigned char lun; }; // An IPMB Address. #define IPMI_IPMB_ADDR_TYPE 0x01 // Used for broadcast get device id as described in section 17.9 of the // IPMI 1.5 manual. #define IPMI_IPMB_BROADCAST_ADDR_TYPE 0x41 struct ipmi_ipmb_addr { int addr_type; short channel; unsigned char slave_addr; unsigned char lun; }; // Channel for talking directly with the BMC. When using this // channel, This is for the system interface address type only. FIXME // - is this right, or should we use -1? #define IPMI_BMC_CHANNEL 0xf #define IPMI_NUM_CHANNELS 0x10 // A raw IPMI message without any addressing. This covers both // commands and responses. The completion code is always the first // byte of data in the response (as the spec shows the messages laid // out). struct ipmi_msg { unsigned char netfn; unsigned char cmd; unsigned short data_len; unsigned char *data; }; // Messages sent to the interface are this format. struct ipmi_req { unsigned char *addr; // Address to send the message to. unsigned int addr_len; long msgid; // The sequence number for the message. This // exact value will be reported back in the // response to this request if it is a command. // If it is a response, this will be used as // the sequence value for the response. struct ipmi_msg msg; }; // Receive types for messages coming from the receive interface. This // is used for the receive in-kernel interface and in the receive // IOCTL. #define IPMI_RESPONSE_RECV_TYPE 1 // A response to a command #define IPMI_ASYNC_EVENT_RECV_TYPE 2 // Something from the event queue #define IPMI_CMD_RECV_TYPE 3 // A command from somewhere else // Note that async events and received commands do not have a completion // code as the first byte of the incoming data, unlike a response. // Messages received from the interface are this format. struct ipmi_recv { int recv_type; // Is this a command, response or an // asyncronous event. unsigned char *addr; // Address the message was from is put // here. The caller must supply the // memory. unsigned int addr_len; // The size of the address buffer. // The caller supplies the full buffer // length, this value is updated to // the actual message length when the // message is received. long msgid; // The sequence number specified in the request // if this is a response. If this is a command, // this will be the sequence number from the // command. struct ipmi_msg msg; // The data field must point to a buffer. // The data_size field must be set to the // size of the message buffer. The // caller supplies the full buffer // length, this value is updated to the // actual message length when the message // is received. }; // Get/set the default timing values for an interface. You shouldn't // generally mess with these. struct ipmi_timing_parms { int retries; unsigned int retry_time_ms; }; // The magic IOCTL value for this interface. #define IPMI_IOC_MAGIC 'i' // Send a message to the interfaces. error values are: // - EFAULT - an address supplied was invalid. // - EINVAL - The address supplied was not valid, or the command // was not allowed. // - EMSGSIZE - The message to was too large. // - ENOMEM - Buffers could not be allocated for the command. #define IPMICTL_SEND_COMMAND _IOR(IPMI_IOC_MAGIC, 13, \ struct ipmi_req) // Like RECEIVE_MSG, but if the message won't fit in the buffer, it // will truncate the contents instead of leaving the data in the // buffer. #define IPMICTL_RECEIVE_MSG_TRUNC _IOWR(IPMI_IOC_MAGIC, 11, \ struct ipmi_recv) // Set whether this interface receives events. Note that the first // user registered for events will get all pending events for the // interface. error values: // - EFAULT - an address supplied was invalid. #define IPMICTL_SET_GETS_EVENTS_CMD _IOR(IPMI_IOC_MAGIC, 16, int) #define IPMICTL_SET_TIMING_PARMS_CMD _IOR(IPMI_IOC_MAGIC, 22, \ struct ipmi_timing_parms) static int OpenSmiFd( int if_num ) { int fd; char devname[30]; sprintf( devname, "/dev/ipmidev/%d", if_num ); fd = open( devname, O_RDWR ); if ( fd >= 0 ) return fd; sprintf( devname, "/dev/ipmi/%d", if_num ); fd = open( devname, O_RDWR ); if ( fd >= 0 ) return fd; sprintf( devname, "/dev/ipmi%d", if_num ); fd = open( devname, O_RDWR ); return fd; } int main( int argc, char *argv[] ) { // set timing and retries struct ipmi_timing_parms parms; int rv; int val; struct pollfd ufds[1]; // open ipmi device int fd = OpenSmiFd( 0 ); if ( fd < 0 ) { fprintf( stderr, "cannot open ipmi device !\n" ); return fd; } // set timing and retries parms.retries = 0; parms.retry_time_ms = 1000; rv = ioctl( fd, IPMICTL_SET_TIMING_PARMS_CMD, &parms ); if ( rv == -1 ) fprintf( stderr, "warning: could not set timing parms !\n" ); // we want async events val = 1; rv = ioctl( fd, IPMICTL_SET_GETS_EVENTS_CMD, &val ); if ( rv == -1 ) fprintf( stderr, "warning: could not set gets events !\n" ); ufds[0].fd = fd; ufds[0].events = POLLIN; while( 1 ) { unsigned char data[dIpmiMaxMsgLength]; struct ipmi_addr addr; struct ipmi_recv recv; rv = poll( ufds, 1, -1 ); if ( rv != 1 ) { fprintf( stderr, "poll: %d, %s !\n", errno, strerror( errno ) ); usleep( 100000 ); continue; } recv.msg.data = data; recv.msg.data_len = dIpmiMaxMsgLength; recv.addr = (unsigned char *)&addr; recv.addr_len = sizeof( struct ipmi_addr ); rv = ioctl( fd, IPMICTL_RECEIVE_MSG_TRUNC, &recv ); if ( rv == -1 ) { if ( errno == EMSGSIZE ) // The message was truncated, handle it as such. data[0] = 0xC8; else continue; } switch( recv.recv_type ) { case IPMI_RESPONSE_RECV_TYPE: printf( "read response: %02x %02x !\n", recv.msg.netfn, recv.msg.cmd ); break; case IPMI_ASYNC_EVENT_RECV_TYPE: // if we can read an event this test is passed printf( "read event: %02x, %02x\n", recv.msg.netfn, recv.msg.cmd ); break; case IPMI_CMD_RECV_TYPE: printf( "read incomming message: %02x, %02x\n", recv.msg.netfn, recv.msg.cmd ); break; default: break; } } return 1; } openhpi-2.14.1/plugins/ipmidirect/t/sensor_factors_000.cpp0000644000076400007640000000464311302567000020364 0ustar /* * Test convertion for raw -> interpreted and interpreted -> raw * * Copyright (c) 2004 by FORCE Computers * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Thomas Kanngieser * */ #include "test.h" #include "ipmi_sensor_factors.h" #define dAnalogDataFormat eIpmiAnalogDataFormatUnsigned #define dLinearization eIpmiLinearizationLinear #define dM 136 #define dTolerance 9 #define dB 0 #define dAccuracy 15 #define dAccuracyExp 0 #define dRExp -4 #define dBExp 0 static cIpmiSdr sdr = { 0, 1, 5, eSdrTypeFullSensorRecord, 60, { 0, 0, // record id 0x51, // ipmi version 0, // record type 0, // length 0, // owner id 0, // lun 0, // num 0, // entity id 0, // instance 0, // initialization 0, // capabilities 0, // type 0, // event reading type 0, 0, // event mask 0, 0, // event mask 0, 0, // event mask dAnalogDataFormat << 6, // units 1 0, // units 2 0, // units 3 eIpmiLinearizationLinear, dM & 0xff, ((dM >> 2) & 0xc0) | (dTolerance & 0x3f), dB & 0xff, ((dB >> 2) & 0xc0) | (dAccuracy & 0x3f), ((dAccuracy >> 2) & 0xf0) | ((dAccuracyExp << 2) & 0x0c), ((dRExp << 4) & 0xf0) | (dBExp & 0x0f ), 0, 0, } }; int main( int /*argc*/, char * /*argv*/[] ) { cIpmiSensorFactors *s = new cIpmiSensorFactors; Test( s->GetDataFromSdr( &sdr ) ); cIpmiSensorFactors c; c.m_analog_data_format = dAnalogDataFormat; c.m_linearization = dLinearization; c.m_m = dM; c.m_tolerance = dTolerance; c.m_b = dB; c.m_r_exp = dRExp; c.m_accuracy_exp = dAccuracyExp; c.m_accuracy = dAccuracy; c.m_b_exp = dBExp; Test( s->Cmp( c ) ); for( unsigned int i = 0; i < 256; i++ ) { double d; unsigned int r; Test( s->ConvertFromRaw( i, d, false ) ); Test( s->ConvertToRaw( cIpmiSensorFactors::eRoundNormal, d, r, false, false ) ); Test( r == i ); } delete s; return TestResult(); } openhpi-2.14.1/plugins/ipmidirect/t/test.h0000644000076400007640000000074411302567000015375 0ustar #ifndef dTest_h #define dTest_h #include static int num_ok = 0; static int num_fail = 0; static void TestFunction( const char *str, const char *file, int line, bool expr ) { if ( expr ) num_ok++; else { printf( "FAIL %s:%d: %s\n", file, line, str ); num_fail++; } } #define Test(expr) TestFunction( __STRING(expr), __FILE__, __LINE__, expr ) static int TestResult() { if ( num_fail ) return 1; return 0; } #endif openhpi-2.14.1/plugins/ipmidirect/ipmi_cmd.cpp0000644000076400007640000004733611302567000016277 0ustar /* * * Copyright (c) 2003 by FORCE Computers. * Copyright (c) 2005 by ESO Technologies. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Thomas Kanngieser * Pierre Sangouard */ #include "ipmi_cmd.h" struct cConvMap { const char *m_name; int m_value; }; const char * ConvIntToString( int flags, const cConvMap *map, const char *def ) { for( int i = 0; map->m_name; i++, map++ ) if ( flags == map->m_value ) return map->m_name; return def; } static cConvMap netfn_map[] = { { "Chassis" , eIpmiNetfnChassis }, { "Bridge" , eIpmiNetfnBridge }, { "SensorEvent", eIpmiNetfnSensorEvent }, { "App" , eIpmiNetfnApp }, { "Firmware" , eIpmiNetfnFirmware }, { "Storage " , eIpmiNetfnStorage }, { "Transport" , eIpmiNetfnTransport }, { "Picmg " , eIpmiNetfnPicmg }, { "Oem" , eIpmiNetfnOem }, { 0, 0 } }; const char * IpmiNetfnToString( tIpmiNetfn netfn ) { return ConvIntToString( netfn, netfn_map, "Invalid" ); } static cConvMap completion_code_map[] = { { "Ok" , eIpmiCcOk }, { "NodeBusy" , eIpmiCcNodeBusy }, { "InvalidCmd" , eIpmiCcInvalidCmd }, { "CommandInvalidForLun" , eIpmiCcCommandInvalidForLun }, { "Timeout" , eIpmiCcTimeout }, { "OutOfSpace" , eIpmiCcOutOfSpace }, { "InvalidReservation" , eIpmiCcInvalidReservation }, { "RequestDataTruncated" , eIpmiCcRequestDataTruncated }, { "RequestDataLengthInvalid" , eIpmiCcRequestDataLengthInvalid }, { "RequestedDataLengthExceeded", eIpmiCcRequestedDataLengthExceeded }, { "ParameterOutOfRange" , eIpmiCcParameterOutOfRange }, { "CannotReturnReqLength" , eIpmiCcCannotReturnReqLength }, { "NotPresent" , eIpmiCcNotPresent }, { "InvalidDataField" , eIpmiCcInvalidDataField }, { "CommandIllegalForSensor" , eIpmiCcCommandIllegalForSensor }, { "CouldNotProvideResponse" , eIpmiCcCouldNotProvideResponse }, { "CannotExecDuplicateRequest" , eIpmiCcCannotExecDuplicateRequest }, { "RepositoryInUpdateMode" , eIpmiCcRepositoryInUpdateMode }, { "DeviceInFirmwareUpdate" , eIpmiCcDeviceInFirmwareUpdate }, { "BmcInitInProgress" , eIpmiCcBmcInitInProgress }, { "DestinationUnavailable" , eIpmiCcDestinationUnavailable }, { "InsufficientPrivilege" , eIpmiCcInsufficientPrivilege }, { "NotSupportedInPresentState" , eIpmiCcNotSupportedInPresentState }, { "UnknownErr" , eIpmiCcUnknownErr }, { 0, 0 } }; const char * IpmiCompletionCodeToString( tIpmiCompletionCode cc ) { return ConvIntToString( cc, completion_code_map, "Invalid" ); } struct cIpmiCmdToClass { const char *m_name; tIpmiNetfn m_netfn; tIpmiCmd m_cmd; }; static cIpmiCmdToClass cmd_class_map[] = { // Chassis netfn { "GetChassisCapabilities" , eIpmiNetfnChassis , eIpmiCmdGetChassisCapabilities }, { "GetChassisStatus" , eIpmiNetfnChassis , eIpmiCmdGetChassisStatus }, { "ChassisControl" , eIpmiNetfnChassis , eIpmiCmdChassisControl }, { "ChassisReset" , eIpmiNetfnChassis , eIpmiCmdChassisReset }, { "ChassisIdentify" , eIpmiNetfnChassis , eIpmiCmdChassisIdentify }, { "SetChassisCapabilities" , eIpmiNetfnChassis , eIpmiCmdSetChassisCapabilities }, { "SetPowerRestorePolicy" , eIpmiNetfnChassis , eIpmiCmdSetPowerRestorePolicy }, { "GetSystemRestartCause" , eIpmiNetfnChassis , eIpmiCmdGetSystemRestartCause }, { "SetSystemBootOptions" , eIpmiNetfnChassis , eIpmiCmdSetSystemBootOptions }, { "GetSystemBootOptions" , eIpmiNetfnChassis , eIpmiCmdGetSystemBootOptions }, { "GetPohCounter" , eIpmiNetfnChassis , eIpmiCmdGetPohCounter }, // Bridge netfn { "GetBridgeState" , eIpmiNetfnBridge , eIpmiCmdGetBridgeState }, { "SetBridgeState" , eIpmiNetfnBridge , eIpmiCmdSetBridgeState }, { "GetIcmbAddress" , eIpmiNetfnBridge , eIpmiCmdGetIcmbAddress }, { "SetIcmbAddress" , eIpmiNetfnBridge , eIpmiCmdSetIcmbAddress }, { "SetBridgeProxyAddress" , eIpmiNetfnBridge , eIpmiCmdSetBridgeProxyAddress }, { "GetBridgeStatistics" , eIpmiNetfnBridge , eIpmiCmdGetBridgeStatistics }, { "GetIcmbCapabilities" , eIpmiNetfnBridge , eIpmiCmdGetIcmbCapabilities }, { "ClearBridgeStatistics" , eIpmiNetfnBridge , eIpmiCmdClearBridgeStatistics }, { "GetBridgeProxyAddress" , eIpmiNetfnBridge , eIpmiCmdGetBridgeProxyAddress }, { "GetIcmbConnectorInfo" , eIpmiNetfnBridge , eIpmiCmdGetIcmbConnectorInfo }, { "SetIcmbConnectorInfo" , eIpmiNetfnBridge , eIpmiCmdSetIcmbConnectorInfo }, { "SendIcmbConnectionId" , eIpmiNetfnBridge , eIpmiCmdSendIcmbConnectionId }, { "PrepareForDiscovery" , eIpmiNetfnBridge , eIpmiCmdPrepareForDiscovery }, { "GetAddresses" , eIpmiNetfnBridge , eIpmiCmdGetAddresses }, { "SetDiscovered" , eIpmiNetfnBridge , eIpmiCmdSetDiscovered }, { "GetChassisDeviceId" , eIpmiNetfnBridge , eIpmiCmdGetChassisDeviceId }, { "SetChassisDeviceId" , eIpmiNetfnBridge , eIpmiCmdSetChassisDeviceId }, { "BridgeRequest" , eIpmiNetfnBridge , eIpmiCmdBridgeRequest }, { "BridgeMessage" , eIpmiNetfnBridge , eIpmiCmdBridgeMessage }, { "GetEventCount" , eIpmiNetfnBridge , eIpmiCmdGetEventCount }, { "SetEventdestination" , eIpmiNetfnBridge , eIpmiCmdSetEventdestination }, { "SetEventReceptionState" , eIpmiNetfnBridge , eIpmiCmdSetEventReceptionState }, { "SendIcmbEventMessage" , eIpmiNetfnBridge , eIpmiCmdSendIcmbEventMessage }, { "GetEventDestiation" , eIpmiNetfnBridge , eIpmiCmdGetEventDestiation }, { "GetEventReceptionState" , eIpmiNetfnBridge , eIpmiCmdGetEventReceptionState }, { "ErrorReport" , eIpmiNetfnBridge , eIpmiCmdErrorReport }, // Sensor/Event netfn { "SetEventReceiver" , eIpmiNetfnSensorEvent, eIpmiCmdSetEventReceiver }, { "GetEventReceiver" , eIpmiNetfnSensorEvent, eIpmiCmdGetEventReceiver }, { "PlatformEvent" , eIpmiNetfnSensorEvent, eIpmiCmdPlatformEvent }, { "GetPefCapabilities" , eIpmiNetfnSensorEvent, eIpmiCmdGetPefCapabilities }, { "ArmPefPostponeTimer" , eIpmiNetfnSensorEvent, eIpmiCmdArmPefPostponeTimer }, { "SetPefConfigParms" , eIpmiNetfnSensorEvent, eIpmiCmdSetPefConfigParms }, { "GetPefConfigParms" , eIpmiNetfnSensorEvent, eIpmiCmdGetPefConfigParms }, { "SetLastProcessedEventId" , eIpmiNetfnSensorEvent, eIpmiCmdSetLastProcessedEventId }, { "GetLastProcessedEventId" , eIpmiNetfnSensorEvent, eIpmiCmdGetLastProcessedEventId }, { "AlertImmediate" , eIpmiNetfnSensorEvent, eIpmiCmdAlertImmediate }, { "PetAcknowledge" , eIpmiNetfnSensorEvent, eIpmiCmdPetAcknowledge }, { "GetDeviceSdrInfo" , eIpmiNetfnSensorEvent, eIpmiCmdGetDeviceSdrInfo }, { "GetDeviceSdr" , eIpmiNetfnSensorEvent, eIpmiCmdGetDeviceSdr }, { "ReserveDeviceSdrRepository", eIpmiNetfnSensorEvent, eIpmiCmdReserveDeviceSdrRepository }, { "GetSensorReadingFactors" , eIpmiNetfnSensorEvent, eIpmiCmdGetSensorReadingFactors }, { "SetSensorHysteresis" , eIpmiNetfnSensorEvent, eIpmiCmdSetSensorHysteresis }, { "GetSensorHysteresis" , eIpmiNetfnSensorEvent, eIpmiCmdGetSensorHysteresis }, { "SetSensorThreshold" , eIpmiNetfnSensorEvent, eIpmiCmdSetSensorThreshold }, { "GetSensorThreshold" , eIpmiNetfnSensorEvent, eIpmiCmdGetSensorThreshold }, { "SetSensorEventEnable" , eIpmiNetfnSensorEvent, eIpmiCmdSetSensorEventEnable }, { "GetSensorEventEnable" , eIpmiNetfnSensorEvent, eIpmiCmdGetSensorEventEnable }, { "RearmSensorEvents" , eIpmiNetfnSensorEvent, eIpmiCmdRearmSensorEvents }, { "GetSensorEventStatus" , eIpmiNetfnSensorEvent, eIpmiCmdGetSensorEventStatus }, { "GetSensorReading" , eIpmiNetfnSensorEvent, eIpmiCmdGetSensorReading }, { "SetSensorType" , eIpmiNetfnSensorEvent, eIpmiCmdSetSensorType }, { "GetSensorType" , eIpmiNetfnSensorEvent, eIpmiCmdGetSensorType }, // App netfn { "GetDeviceId" , eIpmiNetfnApp , eIpmiCmdGetDeviceId }, { "BroadcastGetDeviceId" , eIpmiNetfnApp , eIpmiCmdBroadcastGetDeviceId }, { "ColdReset" , eIpmiNetfnApp , eIpmiCmdColdReset }, { "WarmReset" , eIpmiNetfnApp , eIpmiCmdWarmReset }, { "GetSelfTestResults" , eIpmiNetfnApp , eIpmiCmdGetSelfTestResults }, { "ManufacturingTestOn" , eIpmiNetfnApp , eIpmiCmdManufacturingTestOn }, { "SetAcpiPowerState" , eIpmiNetfnApp , eIpmiCmdSetAcpiPowerState }, { "GetAcpiPowerState" , eIpmiNetfnApp , eIpmiCmdGetAcpiPowerState }, { "GetDeviceGuid" , eIpmiNetfnApp , eIpmiCmdGetDeviceGuid }, { "ResetWatchdogTimer" , eIpmiNetfnApp , eIpmiCmdResetWatchdogTimer }, { "SetWatchdogTimer" , eIpmiNetfnApp , eIpmiCmdSetWatchdogTimer }, { "GetWatchdogTimer" , eIpmiNetfnApp , eIpmiCmdGetWatchdogTimer }, { "SetBmcGlobalEnables" , eIpmiNetfnApp , eIpmiCmdSetBmcGlobalEnables }, { "GetBmcGlobalEnables" , eIpmiNetfnApp , eIpmiCmdGetBmcGlobalEnables }, { "ClearMsgFlags" , eIpmiNetfnApp , eIpmiCmdClearMsgFlags }, { "GetMsgFlags" , eIpmiNetfnApp , eIpmiCmdGetMsgFlags }, { "EnableMessageChannelRcv" , eIpmiNetfnApp , eIpmiCmdEnableMessageChannelRcv }, { "GetMsg" , eIpmiNetfnApp , eIpmiCmdGetMsg }, { "SendMsg" , eIpmiNetfnApp , eIpmiCmdSendMsg }, { "ReadEventMsgBuffer" , eIpmiNetfnApp , eIpmiCmdReadEventMsgBuffer }, { "GetBtInterfaceCapabilities", eIpmiNetfnApp , eIpmiCmdGetBtInterfaceCapabilities }, { "GetSystemGuid" , eIpmiNetfnApp , eIpmiCmdGetSystemGuid }, { "GetChannelAuthCapabilities", eIpmiNetfnApp , eIpmiCmdGetChannelAuthCapabilities }, { "GetSessionChallenge" , eIpmiNetfnApp , eIpmiCmdGetSessionChallenge }, { "ActivateSession" , eIpmiNetfnApp , eIpmiCmdActivateSession }, { "SetSessionPrivilege" , eIpmiNetfnApp , eIpmiCmdSetSessionPrivilege }, { "CloseSession" , eIpmiNetfnApp , eIpmiCmdCloseSession }, { "GetSessionInfo" , eIpmiNetfnApp , eIpmiCmdGetSessionInfo }, { "GetAuthcode" , eIpmiNetfnApp , eIpmiCmdGetAuthcode }, { "SetChannelAccess" , eIpmiNetfnApp , eIpmiCmdSetChannelAccess }, { "GetChannelAccess" , eIpmiNetfnApp , eIpmiCmdGetChannelAccess }, { "GetChannelInfo" , eIpmiNetfnApp , eIpmiCmdGetChannelInfo }, { "SetUserAccess" , eIpmiNetfnApp , eIpmiCmdSetUserAccess }, { "GetUserAccess" , eIpmiNetfnApp , eIpmiCmdGetUserAccess }, { "SetUserName" , eIpmiNetfnApp , eIpmiCmdSetUserName }, { "GetUserName" , eIpmiNetfnApp , eIpmiCmdGetUserName }, { "SetUserPassword" , eIpmiNetfnApp , eIpmiCmdSetUserPassword }, { "MasterReadWrite" , eIpmiNetfnApp , eIpmiCmdMasterReadWrite }, // Storage netfn { "GetFruInventoryAreaInfo" , eIpmiNetfnStorage , eIpmiCmdGetFruInventoryAreaInfo }, { "ReadFruData" , eIpmiNetfnStorage , eIpmiCmdReadFruData }, { "WriteFruData" , eIpmiNetfnStorage , eIpmiCmdWriteFruData }, { "GetSdrRepositoryInfo" , eIpmiNetfnStorage , eIpmiCmdGetSdrRepositoryInfo }, { "GetSdrRepositoryAllocInfo" , eIpmiNetfnStorage , eIpmiCmdGetSdrRepositoryAllocInfo }, { "ReserveSdrRepository" , eIpmiNetfnStorage , eIpmiCmdReserveSdrRepository }, { "GetSdr" , eIpmiNetfnStorage , eIpmiCmdGetSdr }, { "AddSdr" , eIpmiNetfnStorage , eIpmiCmdAddSdr }, { "PartialAddSdr" , eIpmiNetfnStorage , eIpmiCmdPartialAddSdr }, { "DeleteSdr" , eIpmiNetfnStorage , eIpmiCmdDeleteSdr }, { "ClearSdrRepository" , eIpmiNetfnStorage , eIpmiCmdClearSdrRepository }, { "GetSdrRepositoryTime" , eIpmiNetfnStorage , eIpmiCmdGetSdrRepositoryTime }, { "SetSdrRepositoryTime" , eIpmiNetfnStorage , eIpmiCmdSetSdrRepositoryTime }, { "EnterSdrRepositoryUpdate" , eIpmiNetfnStorage , eIpmiCmdEnterSdrRepositoryUpdate }, { "ExitSdrRepositoryUpdate" , eIpmiNetfnStorage , eIpmiCmdExitSdrRepositoryUpdate }, { "RunInitializationAgent" , eIpmiNetfnStorage , eIpmiCmdRunInitializationAgent }, { "GetSelInfo" , eIpmiNetfnStorage , eIpmiCmdGetSelInfo }, { "GetSelAllocationInfo" , eIpmiNetfnStorage , eIpmiCmdGetSelAllocationInfo }, { "ReserveSel" , eIpmiNetfnStorage , eIpmiCmdReserveSel }, { "GetSelEntry" , eIpmiNetfnStorage , eIpmiCmdGetSelEntry }, { "AddSelEntry" , eIpmiNetfnStorage , eIpmiCmdAddSelEntry }, { "PartialAddSelEntry" , eIpmiNetfnStorage , eIpmiCmdPartialAddSelEntry }, { "DeleteSelEntry" , eIpmiNetfnStorage , eIpmiCmdDeleteSelEntry }, { "ClearSel" , eIpmiNetfnStorage , eIpmiCmdClearSel }, { "GetSelTime" , eIpmiNetfnStorage , eIpmiCmdGetSelTime }, { "SetSelTime" , eIpmiNetfnStorage , eIpmiCmdSetSelTime }, { "GetAuxiliaryLogStatus" , eIpmiNetfnStorage , eIpmiCmdGetAuxiliaryLogStatus }, { "SetAuxiliaryLogStatus" , eIpmiNetfnStorage , eIpmiCmdSetAuxiliaryLogStatus }, // Transport netfn { "SetLanConfigParms" , eIpmiNetfnTransport , eIpmiCmdSetLanConfigParms }, { "GetLanConfigParms" , eIpmiNetfnTransport , eIpmiCmdGetLanConfigParms }, { "SuspendBmcArps" , eIpmiNetfnTransport , eIpmiCmdSuspendBmcArps }, { "GetIpUdpRmcpStats" , eIpmiNetfnTransport , eIpmiCmdGetIpUdpRmcpStats }, { "SetSerialModemConfig" , eIpmiNetfnTransport , eIpmiCmdSetSerialModemConfig }, { "GetSerialModemConfig" , eIpmiNetfnTransport , eIpmiCmdGetSerialModemConfig }, { "SetSerialModemMux" , eIpmiNetfnTransport , eIpmiCmdSetSerialModemMux }, { "GetTapResponseCodes" , eIpmiNetfnTransport , eIpmiCmdGetTapResponseCodes }, { "SetPppUdpProxyXmitData" , eIpmiNetfnTransport , eIpmiCmdSetPppUdpProxyXmitData }, { "GetPppUdpProxyXmitData" , eIpmiNetfnTransport , eIpmiCmdGetPppUdpProxyXmitData }, { "SendPppUdpProxyPacket" , eIpmiNetfnTransport , eIpmiCmdSendPppUdpProxyPacket }, { "GetPppUdpProxyRecvData" , eIpmiNetfnTransport , eIpmiCmdGetPppUdpProxyRecvData }, { "SerialModemConnActive" , eIpmiNetfnTransport , eIpmiCmdSerialModemConnActive }, { "Callback" , eIpmiNetfnTransport , eIpmiCmdCallback }, { "SetUserCallbackOptions" , eIpmiNetfnTransport , eIpmiCmdSetUserCallbackOptions }, { "GetUserCallbackOptions" , eIpmiNetfnTransport , eIpmiCmdGetUserCallbackOptions }, // PICMG netfn { "GetPicMgProperties" , eIpmiNetfnPicmg , eIpmiCmdGetPicMgProperties }, { "GetAddressInfo" , eIpmiNetfnPicmg , eIpmiCmdGetAddressInfo }, { "GetShelfAddressInfo" , eIpmiNetfnPicmg , eIpmiCmdGetShelfAddressInfo }, { "SetShelfAddressInfo" , eIpmiNetfnPicmg , eIpmiCmdSetShelfAddressInfo }, { "FruControl" , eIpmiNetfnPicmg , eIpmiCmdFruControl }, { "GetFruLedProperties" , eIpmiNetfnPicmg , eIpmiCmdGetFruLedProperties }, { "GetLedColorCapabilities" , eIpmiNetfnPicmg , eIpmiCmdGetLedColorCapabilities }, { "SetFruLedState" , eIpmiNetfnPicmg , eIpmiCmdSetFruLedState }, { "GetFruLedState" , eIpmiNetfnPicmg , eIpmiCmdGetFruLedState }, { "SetIpmbState" , eIpmiNetfnPicmg , eIpmiCmdSetIpmbState }, { "SetFruActivationPolicy" , eIpmiNetfnPicmg , eIpmiCmdSetFruActivationPolicy }, { "GetFruActivationPolicy" , eIpmiNetfnPicmg , eIpmiCmdGetFruActivationPolicy }, { "SetFruActivation" , eIpmiNetfnPicmg , eIpmiCmdSetFruActivation }, { "GetDeviceLocatorRecordId" , eIpmiNetfnPicmg , eIpmiCmdGetDeviceLocatorRecordId }, { "SetPortState" , eIpmiNetfnPicmg , eIpmiCmdSetPortState }, { "GetPortState" , eIpmiNetfnPicmg , eIpmiCmdGetPortState }, { "ComputePowerProperties" , eIpmiNetfnPicmg , eIpmiCmdComputePowerProperties }, { "SetPowerLevel" , eIpmiNetfnPicmg , eIpmiCmdSetPowerLevel }, { "GetPowerLevel" , eIpmiNetfnPicmg , eIpmiCmdGetPowerLevel }, { "RenegotiatePower" , eIpmiNetfnPicmg , eIpmiCmdRenegotiatePower }, { "GetFanSpeedProperties" , eIpmiNetfnPicmg , eIpmiCmdGetFanSpeedProperties }, { "SetFanLevel" , eIpmiNetfnPicmg , eIpmiCmdSetFanLevel }, { "GetFanLevel" , eIpmiNetfnPicmg , eIpmiCmdGetFanLevel }, { "BusedResource" , eIpmiNetfnPicmg , eIpmiCmdBusedResource }, { "GetIpmbLinkInfo" , eIpmiNetfnPicmg , eIpmiCmdGetIpmbLinkInfo }, { 0 , eIpmiNetfnChassis , eIpmiCmdGetChassisCapabilities } }; const char * IpmiCmdToString( tIpmiNetfn netfn, tIpmiCmd cmd ) { for( int i = 0; cmd_class_map[i].m_name; i++ ) { cIpmiCmdToClass *cc = &cmd_class_map[i]; if ( cc->m_netfn == netfn && cc->m_cmd == cmd ) return cc->m_name; } return "Invalid"; } openhpi-2.14.1/plugins/ipmidirect/ipmi_discover.h0000644000076400007640000000441311302567000017004 0ustar /* * * Copyright (c) 2004 by FORCE Computers * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Thomas Kanngieser */ #ifndef dIpmiDiscover_h #define dIpmiDiscover_h class cIpmiDomain; class cIpmiMcThread; class cIpmiMcTask; // cIpmiMcThread::m_properties #define dIpmiMcThreadInitialDiscover 1 // discover at startup #define dIpmiMcThreadPollAliveMc 2 // poll mc if found #define dIpmiMcThreadPollDeadMc 4 // poll mc if not found #define dIpmiMcThreadCreateM0 8 // create hotswap state M0 typedef void (cIpmiMcThread::*tIpmiMcTask)( void *userdata ); class cIpmiMcThread : public cThread { private: cIpmiDomain *m_domain; void WriteLock(); void WriteUnlock(); unsigned char m_addr; cIpmiMc *m_mc; // properties unsigned int m_properties; // dIpmiMcThreadXXXX public: cIpmiMc *Mc() { return m_mc; } protected: virtual void *Run(); public: // signal to MC thread to exit bool m_exit; cIpmiMcThread( cIpmiDomain *domain, unsigned char addr, unsigned int properties ); ~cIpmiMcThread(); protected: cIpmiMcTask *m_tasks; public: // add a task to MC thread void AddMcTask( tIpmiMcTask task, const cTime &timeout, void *userdata ); // add a task to MC thread void AddMcTask( tIpmiMcTask task, unsigned int diff_ms, void *userdata ); // remove MC task from list bool RemMcTask( void *userdata ); // clear the MC task list void ClearMcTaskList(); protected: // discover MC void Discover( cIpmiMsg *get_device_id_rsp = 0 ); // poll mc task void PollAddr( void *userdata ); cIpmiSel *m_sel; // read SEL task void ReadSel( void *userdata ); GList *m_events; cThreadLock m_events_lock; void HandleEvents(); void HandleEvent( cIpmiEvent *event ); void HandleHotswapEvent( cIpmiSensorHotswap *sensor, cIpmiEvent *event ); public: void AddEvent( cIpmiEvent *event ); }; #endif openhpi-2.14.1/plugins/ipmidirect/ipmi_inventory_parser.h0000644000076400007640000001365211302567000020604 0ustar /* * ipmi_inventory_parser.h * * Copyright (c) 2004 by FORCE Computers * Copyright (c) 2005 by ESO Technologies. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Thomas Kanngieser * Pierre Sangouard */ #ifndef dIpmiInventoryParser_h #define dIpmiInventoryParser_h #ifndef dArray_h #include "array.h" #endif #ifndef dIpmiTextBuffer #include "ipmi_text_buffer.h" #endif unsigned char IpmiChecksum( const unsigned char *data, int size ); unsigned char IpmiChecksumMulti( const unsigned char *data, int size, unsigned char csum ); enum tIpmiInventoryRecordType { eIpmiInventoryRecordTypeInternal, eIpmiInventoryRecordTypeChassis, eIpmiInventoryRecordTypeBoard, eIpmiInventoryRecordTypeProduct, eIpmiInventoryRecordTypeMultiRecord, eIpmiInventoryRecordTypeLast }; const char *IpmiInventoryRecordTypeToString( tIpmiInventoryRecordType ); #define eIpmiInventoryMultiRecordTypeOemFirst 0xc0 #define eIpmiInventoryMultiRecordTypeOemLast 0xff class cIpmiInventoryField { cIpmiTextBuffer m_ipmi_text_buffer; SaHpiIdrFieldT m_idr_field; public: cIpmiInventoryField(SaHpiEntryIdT area_id, SaHpiEntryIdT field_id, SaHpiIdrFieldTypeT field_type); virtual ~cIpmiInventoryField(); void SetAscii( char *str, int size ); void SetBinary( const unsigned char *data, unsigned int size ); SaHpiEntryIdT FieldId() const { return m_idr_field.FieldId; } SaHpiIdrFieldTypeT FieldType() const { return m_idr_field.Type; } SaHpiIdrFieldT Field() const { return m_idr_field; } SaErrorT ReadTextBuffer( const unsigned char *&data, unsigned int &size ); }; class cIpmiInventoryArea { protected: SaHpiEntryIdT m_field_id; SaHpiIdrAreaHeaderT m_area_header; cArray m_field_array; public: cIpmiInventoryArea(SaHpiEntryIdT area_id); virtual ~cIpmiInventoryArea(); cIpmiInventoryField *FindIdrField( SaHpiIdrFieldTypeT fieldtype, SaHpiEntryIdT fieldid ); SaErrorT GetIdrField( SaHpiIdrFieldTypeT &fieldtype, SaHpiEntryIdT &fieldid, SaHpiEntryIdT &nextfieldid, SaHpiIdrFieldT &field ); SaHpiEntryIdT AreaId() const { return m_area_header.AreaId; } SaHpiIdrAreaTypeT AreaType() const { return m_area_header.Type; } SaHpiIdrAreaHeaderT AreaHeader() const { return m_area_header; } virtual SaErrorT ParseFruArea( const unsigned char *data, unsigned int size ) = 0; }; class cIpmiInventoryAreaInternal : public cIpmiInventoryArea { public: cIpmiInventoryAreaInternal(SaHpiEntryIdT area_id); virtual ~cIpmiInventoryAreaInternal(); virtual SaErrorT ParseFruArea( const unsigned char *data, unsigned int size ); }; class cIpmiInventoryAreaMultiRecord : public cIpmiInventoryArea { public: cIpmiInventoryAreaMultiRecord(SaHpiEntryIdT area_id); virtual ~cIpmiInventoryAreaMultiRecord(); virtual SaErrorT ParseFruArea( const unsigned char *data, unsigned int size ); }; class cIpmiInventoryAreaChassis : public cIpmiInventoryArea { public: cIpmiInventoryAreaChassis(SaHpiEntryIdT area_id); virtual ~cIpmiInventoryAreaChassis(); virtual SaErrorT ParseFruArea( const unsigned char *data, unsigned int size ); }; class cIpmiInventoryAreaBoard : public cIpmiInventoryArea { public: cIpmiInventoryAreaBoard(SaHpiEntryIdT area_id); virtual ~cIpmiInventoryAreaBoard(); virtual SaErrorT ParseFruArea( const unsigned char *data, unsigned int size ); }; class cIpmiInventoryAreaProduct : public cIpmiInventoryArea { public: cIpmiInventoryAreaProduct(SaHpiEntryIdT area_id); virtual ~cIpmiInventoryAreaProduct(); virtual SaErrorT ParseFruArea( const unsigned char *data, unsigned int size ); }; class cIpmiInventoryParser { SaHpiIdrInfoT m_idr_info; SaHpiEntryIdT m_area_id; cArray m_area_array; public: cIpmiInventoryParser(); virtual ~cIpmiInventoryParser(); cIpmiInventoryArea *AllocArea( SaHpiEntryIdT area_id, tIpmiInventoryRecordType type ); virtual SaErrorT ParseFruInfo( const unsigned char *data, unsigned int size, unsigned int idr_id ); cIpmiInventoryArea *FindIdrArea( SaHpiIdrAreaTypeT areatype, SaHpiEntryIdT areaid ); virtual SaErrorT GetIdrInfo( SaHpiIdrIdT &idrid, SaHpiIdrInfoT &idrinfo ); virtual SaErrorT GetIdrAreaHeader( SaHpiIdrIdT &idrid, SaHpiIdrAreaTypeT &areatype, SaHpiEntryIdT &areaid, SaHpiEntryIdT &nextareaid, SaHpiIdrAreaHeaderT &header ); virtual SaErrorT AddIdrArea( SaHpiIdrIdT &idrid, SaHpiIdrAreaTypeT &areatype, SaHpiEntryIdT &areaid ); virtual SaErrorT DelIdrArea( SaHpiIdrIdT &idrid, SaHpiEntryIdT &areaid ); virtual SaErrorT GetIdrField( SaHpiIdrIdT &idrid, SaHpiEntryIdT &areaid, SaHpiIdrFieldTypeT &fieldtype, SaHpiEntryIdT &fieldid, SaHpiEntryIdT &nextfieldid, SaHpiIdrFieldT &field ); virtual SaErrorT AddIdrField( SaHpiIdrIdT &idrid, SaHpiIdrFieldT &field ); virtual SaErrorT SetIdrField( SaHpiIdrIdT &idrid, SaHpiIdrFieldT &field ); virtual SaErrorT DelIdrField( SaHpiIdrIdT &idrid, SaHpiEntryIdT &areaid, SaHpiEntryIdT &fieldid ); }; #endif openhpi-2.14.1/plugins/ipmidirect/ipmi_inventory.h0000644000076400007640000000333411302567000017224 0ustar /* * * Copyright (c) 2004 by FORCE Computers. * Copyright (c) 2005 by ESO Technologies. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Thomas Kanngieser * Pierre Sangouard */ #ifndef dIpmiInventory_h #define dIpmiInventory_h #ifndef dIpmiRdr_h #include "ipmi_rdr.h" #endif #ifndef dIpmiInventoryParser_h #include "ipmi_inventory_parser.h" #endif #ifndef dIpmiAddr_h #include "ipmi_addr.h" #endif enum tInventoryAccessMode { eInventoryAccessModeByte = 0, eInventoryAccessModeWord = 1 }; #define dMaxFruFetchBytes 20 class cIpmiInventory : public cIpmiRdr, public cIpmiInventoryParser { protected: unsigned char m_fru_device_id; // fru device id tInventoryAccessMode m_access; unsigned int m_size; bool m_fetched; unsigned int m_oem; cIpmiAddr m_addr; SaErrorT GetFruInventoryAreaInfo( unsigned int &size, tInventoryAccessMode &byte_access ); SaErrorT ReadFruData( unsigned short offset, unsigned int num, unsigned int &n, unsigned char *data ); public: cIpmiInventory( cIpmiMc *mc, unsigned int fru_device_id ); ~cIpmiInventory(); SaErrorT Fetch(); bool SetAddr( cIpmiAddr addr ); virtual unsigned int Num() const { return m_fru_device_id; } unsigned int &Oem() { return m_oem; } // create an RDR inventory record virtual bool CreateRdr( SaHpiRptEntryT &resource, SaHpiRdrT &rdr ); }; #endif openhpi-2.14.1/plugins/ipmidirect/thread.cpp0000644000076400007640000001205011302567000015746 0ustar /* * thread.cpp * * thread classes * * Copyright (c) 2004 by FORCE Computers. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Thomas Kanngieser */ #include "thread.h" #include #include #include ////////////////////////////////////////////////// // cThread ////////////////////////////////////////////////// static pthread_key_t thread_key; class cThreadMain : public cThread { public: cThreadMain( const pthread_t &thread, bool main_thread, tTheadState state ) : cThread( thread, main_thread, state ) {} protected: virtual void *Run() { return 0; } }; class cInit { public: cInit(); ~cInit(); }; cInit::cInit() { pthread_key_create( &thread_key, 0 ); cThreadMain *thread = new cThreadMain( pthread_self(), true, eTsRun ); pthread_setspecific( thread_key, thread ); } cInit::~cInit() { cThreadMain *thread = (cThreadMain *)pthread_getspecific( thread_key ); if ( thread ) { delete thread; pthread_key_delete( thread_key ); } } static cInit init; cThread::cThread() : m_main( false ), m_state( eTsSuspend ) { } cThread::cThread( const pthread_t &thread, bool main_thread, tTheadState state ) : m_thread( thread ), m_main( main_thread ), m_state( state ) { } cThread::~cThread() { } cThread * cThread::GetThread() { cThread *thread = (cThread *)pthread_getspecific( thread_key ); return thread; } void * cThread::Thread( void *param ) { cThread *thread = (cThread *)param; pthread_setspecific( thread_key, thread ); thread->m_state = eTsRun; void *rv = thread->Run(); thread->m_state = eTsExit; return rv; } bool cThread::Start() { if ( m_state == eTsRun ) { return false; } m_state = eTsSuspend; int rv = pthread_create( &m_thread, 0, Thread, this ); if ( rv ) return false; // wait till the thread is runnung while( m_state == eTsSuspend ) // wait 100 ms usleep( 10000 ); return true; } bool cThread::Wait( void *&rv ) { if ( m_state != eTsRun ) return false; void *rr; int r = pthread_join( m_thread, &rr ); if ( r ) return false; rv = rr; return true; } void cThread::Exit( void *rv ) { m_state = eTsExit; pthread_exit( rv ); } ////////////////////////////////////////////////// // cThreadLock ////////////////////////////////////////////////// #if defined(__sun) && defined(__SVR4) cThreadLock::cThreadLock() { pthread_mutexattr_t attr; pthread_mutexattr_init( &attr ); pthread_mutexattr_settype( &attr, PTHREAD_MUTEX_RECURSIVE ); pthread_mutex_init( &m_lock, &attr ); pthread_mutexattr_destroy( &attr ); } #else static pthread_mutex_t lock_tmpl = PTHREAD_RECURSIVE_MUTEX_INITIALIZER_NP; cThreadLock::cThreadLock() : m_lock( lock_tmpl ) { } #endif cThreadLock::~cThreadLock() { pthread_mutex_destroy( &m_lock ); } void cThreadLock::Lock() { pthread_mutex_lock( &m_lock ); } void cThreadLock::Unlock() { pthread_mutex_unlock( &m_lock ); } bool cThreadLock::TryLock() { return pthread_mutex_trylock( &m_lock ) == 0; } ////////////////////////////////////////////////// // cThreadLockRw ////////////////////////////////////////////////// #if defined(__sun) && defined(__SVR4) cThreadLockRw::cThreadLockRw() { pthread_rwlock_init( &m_rwlock, NULL ); } #else static pthread_rwlock_t rwlock_tmpl = PTHREAD_RWLOCK_INITIALIZER; cThreadLockRw::cThreadLockRw() { m_rwlock = rwlock_tmpl; } #endif cThreadLockRw::~cThreadLockRw() { pthread_rwlock_destroy( &m_rwlock ); } void cThreadLockRw::ReadLock() { pthread_rwlock_rdlock( &m_rwlock ); } void cThreadLockRw::ReadUnlock() { pthread_rwlock_unlock( &m_rwlock ); } bool cThreadLockRw::TryReadLock() { int rv = pthread_rwlock_trywrlock( &m_rwlock ); return rv == 0; } void cThreadLockRw::WriteLock() { pthread_rwlock_wrlock( &m_rwlock ); } void cThreadLockRw::WriteUnlock() { pthread_rwlock_unlock( &m_rwlock ); } bool cThreadLockRw::TryWriteLock() { int rv = pthread_rwlock_trywrlock( &m_rwlock ); return rv == 0; } bool cThreadLockRw::CheckLock() { bool rv = TryWriteLock(); if ( rv ) WriteUnlock(); return rv; } ////////////////////////////////////////////////// // cThreadCond ////////////////////////////////////////////////// #if defined(__sun) && defined(__SVR4) cThreadCond::cThreadCond() { pthread_cond_init( &m_cond, NULL ); } #else static pthread_cond_t cond_tmpl = PTHREAD_COND_INITIALIZER; cThreadCond::cThreadCond() { m_cond = cond_tmpl; } #endif cThreadCond::~cThreadCond() { pthread_cond_destroy( &m_cond ); } void cThreadCond::Signal() { pthread_cond_signal( &m_cond ); } void cThreadCond::Wait() { pthread_cond_wait( &m_cond, &m_lock ); } openhpi-2.14.1/plugins/ipmidirect/ipmi_con.h0000644000076400007640000001161011302567000015742 0ustar /* * ipmi_con.h * * abstract interface for handling IPMI connections * * Copyright (c) 2003,2004 by FORCE Computers. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Thomas Kanngieser */ #ifndef dIpmiCon_h #define dIpmiCon_h #ifndef dIpmiLog_h #include "ipmi_log.h" #endif #ifndef dIpmiAddr_h #include "ipmi_addr.h" #endif #ifndef dIpmiMsg_h #include "ipmi_msg.h" #endif #ifndef dIpmiCmd_h #include "ipmi_cmd.h" #endif #ifndef dIpmiUtils_h #include "ipmi_utils.h" #endif #ifndef dThread_h #include "thread.h" #endif extern "C" { #include "SaHpi.h" } #include #define dIpmiConLogCmd 1 #define dIpmiConLogEvent 2 #define dIpmiConLogAll 0xffff // default retries for an IPMI command before timeoue #define dIpmiDefaultRetries 3 // ipmi command class cIpmiRequest { public: cIpmiAddr m_addr; cIpmiAddr m_send_addr; cIpmiMsg m_msg; int m_seq; // seq of msg cIpmiAddr *m_rsp_addr; cIpmiMsg *m_rsp; SaErrorT m_error; // if != 0 => error cThreadCond *m_signal; // the calling thread is waiting for this cTime m_timeout; int m_retries_left; cIpmiRequest( const cIpmiAddr &addr, const cIpmiMsg &msg ) : m_addr( addr ), m_send_addr( addr ), m_msg( msg ), m_rsp_addr( 0 ), m_rsp( 0 ), m_error( SA_OK ), m_signal( 0 ), m_retries_left( -1 ) {} virtual ~cIpmiRequest() {} }; #define dMaxSeq 256 class cIpmiCon : public cThread { protected: bool m_is_open; // file handle returned by IfOpen int m_fd; // address of SMI unsigned char m_slave_addr; cThreadLock m_log_lock; // maximum outstanding requests int m_max_outstanding; // must be <= dMaxSeq // max seq number int m_max_seq; // must be <= dMaxSeq // lock for m_queue and m_outstanding cThreadLock m_queue_lock; GList *m_queue; cIpmiRequest *m_outstanding[dMaxSeq]; int m_num_outstanding; int m_current_seq; void RequeueOutstanding(); int AddOutstanding( cIpmiRequest *r ); void RemOutstanding( int seq ); void HandleMsgError( cIpmiRequest *r, int err ); // send a command SaErrorT SendCmd( cIpmiRequest *request ); // send the first command of the given queue void SendCmds(); // thread entry function virtual void *Run(); // signal the exit of the thread bool m_exit; // log output int m_log_level; public: bool LogLevel( int v ) { return m_log_level & v; } // current timeout in ms unsigned int m_timeout; public: cIpmiCon( unsigned int timeout, int log_level ); virtual ~cIpmiCon(); bool IsOpen() { return m_is_open; } protected: // get number of seq ids virtual int IfGetMaxSeq() = 0; // connection interface functions // open connection return file handle virtual int IfOpen() = 0; // close connection virtual void IfClose(); // convertion from addr to send addr virtual void IfAddrToSendAddr( const cIpmiAddr &addr, cIpmiAddr &send_addr ); // send an ipmi command virtual SaErrorT IfSendCmd( cIpmiRequest *r ) = 0; // read ipmi response virtual void IfReadResponse() = 0; // true => connection check mode bool m_check_connection; cTime m_check_connection_timeout; // called to check the connection // true => going to check connection mode virtual bool IfCheckConnection( cTime &timeout ); // called in case of check connection timeout virtual void IfCheckConnectionTimeout(); protected: cTime m_last_receive_timestamp; // handle response called within IfReadResponse virtual void HandleResponse( int seq, const cIpmiAddr &addr, const cIpmiMsg &msg ); // handle event called within IfReadResponse virtual void HandleEvent( const cIpmiAddr &addr, const cIpmiMsg &msg ); virtual void HandleAsyncEvent( const cIpmiAddr &addr, const cIpmiMsg &msg ) = 0; // handle a check connection response virtual void HandleCheckConnection( bool state ); public: bool Open(); void Close(); SaErrorT Cmd( const cIpmiAddr &addr, const cIpmiMsg &msg, cIpmiAddr &rsp_addr, cIpmiMsg &rsp_msg, int retries = dIpmiDefaultRetries ); SaErrorT ExecuteCmd( const cIpmiAddr &addr, const cIpmiMsg &msg, cIpmiMsg &rsp_msg, int retries = dIpmiDefaultRetries ); int GetMaxOutstanding() { return m_max_outstanding; } bool SetMaxOutstanding( int max ) { if ( max < 1 || max > 32 ) return false; m_max_outstanding = max; return true; } }; void IpmiLogDataMsg( const cIpmiAddr &addr, const cIpmiMsg &msg ); #endif openhpi-2.14.1/plugins/ipmidirect/ipmi_sel.h0000644000076400007640000000752311302567000015756 0ustar /* * ipmi_sel.h * * Copyright (c) 2003 by FORCE Computers * Copyright (c) 2005 by ESO Technologies. * * Note that this file is based on parts of OpenIPMI * written by Corey Minyard * of MontaVista Software. Corey's code was helpful * and many thanks go to him. He gave the permission * to use this code in OpenHPI under BSD license. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Thomas Kanngieser * Pierre Sangouard */ #ifndef dIpmiSel_h #define dIpmiSel_h #ifndef dIpmiEvent_h #include "ipmi_event.h" #endif #ifndef dThread_h #include "thread.h" #endif #include extern "C" { #include "SaHpi.h" } class cIpmiDomain; class cIpmiSdrs; #define dMaxSelFetchRetries 3 class cIpmiSel { protected: cIpmiMc *m_mc; // LUN we are attached with. int m_lun; unsigned char m_major_version; unsigned char m_minor_version; unsigned short m_entries; unsigned int m_last_addition_timestamp; unsigned int m_last_erase_timestamp; bool m_overflow; bool m_supports_delete_sel; bool m_supports_partial_add_sel; bool m_supports_reserve_sel; bool m_supports_get_sel_allocation; public: bool m_fetched; private: // When fetching the data in event-driven mode, these are the // variables that track what is going on. unsigned int m_reservation; bool m_sels_changed; // SEL cThreadLock m_sel_lock; GList *m_sel; unsigned int m_sel_num; // async events cThreadLock m_async_events_lock; GList *m_async_events; unsigned int m_async_events_num; public: SaErrorT GetInfo(); private: SaErrorT Reserve(); int ReadSelRecord( cIpmiEvent &event, unsigned int &next_rec_id ); GList *ReadSel( unsigned int &num, bool &uptodate ); cIpmiEvent *FindEvent( GList *list, unsigned int record_id ); bool CheckEvent( GList *&list, cIpmiEvent *event ); public: cIpmiSel( cIpmiMc *mc, unsigned int lun ); ~cIpmiSel(); // clear a list of cIpmiEvent GList *ClearList( GList *list ); // read SEL and return a list of new events GList *GetEvents(); // add an event to the list of async events int AddAsyncEvent( cIpmiEvent *event ); SaErrorT GetSelInfo( SaHpiEventLogInfoT &info ); // get an event int GetSelEntry( unsigned short rid, unsigned short &prev, unsigned short &next, cIpmiEvent &event ); SaErrorT GetSelEntry( SaHpiEventLogEntryIdT current, SaHpiEventLogEntryIdT &prev, SaHpiEventLogEntryIdT &next, SaHpiEventLogEntryT &entry, SaHpiRdrT &rdr, SaHpiRptEntryT &rptentry ); SaErrorT AddSelEntry( const SaHpiEventT & /*Event*/ ); // delete SEL entry SaErrorT DeleteSelEntry( SaHpiEventLogEntryIdT sid ); // clear the SEL SaErrorT ClearSel(); // set SEL time SaErrorT SetSelTime( SaHpiTimeT t ); // get SEL time SaErrorT GetSelTime( SaHpiTimeT &t ); cIpmiMc *Mc() { return m_mc; } int Lun() { return m_lun; } int SelNum() { return m_sel_num; } unsigned int AdditionTimestamp() { return m_last_addition_timestamp; } unsigned int EraseTimestamp() { return m_last_erase_timestamp; } bool Overflow() { return m_overflow; } bool SupportsDeleteSel() { return m_supports_delete_sel; } void Lock() { m_sel_lock.Lock(); } void Unlock() { m_sel_lock.Unlock(); } void Dump( cIpmiLog &dump, const char *name ); }; #endif openhpi-2.14.1/plugins/ipmidirect/ipmi_con_smi.cpp0000644000076400007640000002556311302567000017161 0ustar /* * * Copyright (c) 2004 by FORCE Computers * Copyright (c) 2007 by ESO Technologies. * * Note that this file is based on parts of OpenIPMI * written by Corey Minyard * of MontaVista Software. Corey's code was helpful * and many thanks go to him. He gave the permission * to use this code in OpenHPI under BSD license. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Thomas Kanngieser * Pierre Sangouard */ #include #include #include #include #include #include #include #include #if defined(__sun) && defined(__SVR4) #include #include #include #endif #include "ipmi_con_smi.h" // This is an overlay for all the address types, so it's easy to // determine the actual address type. This is kind of like addresses // work for sockets. #define IPMI_MAX_ADDR_SIZE 32 struct ipmi_addr { // Try to take these from the "Channel Medium Type" table // in section 6.5 of the IPMI 1.5 manual. int addr_type; short channel; char data[IPMI_MAX_ADDR_SIZE]; }; // When the address is not used, the type will be set to this value. // The channel is the BMC's channel number for the channel (usually // 0), or IPMC_BMC_CHANNEL if communicating directly with the BMC. #define IPMI_SYSTEM_INTERFACE_ADDR_TYPE 0x0c struct ipmi_system_interface_addr { int addr_type; short channel; unsigned char lun; }; // An IPMB Address. #define IPMI_IPMB_ADDR_TYPE 0x01 // Used for broadcast get device id as described in section 17.9 of the // IPMI 1.5 manual. #define IPMI_IPMB_BROADCAST_ADDR_TYPE 0x41 struct ipmi_ipmb_addr { int addr_type; short channel; unsigned char slave_addr; unsigned char lun; }; // Channel for talking directly with the BMC. When using this // channel, This is for the system interface address type only. FIXME // - is this right, or should we use -1? #define IPMI_BMC_CHANNEL 0xf #define IPMI_NUM_CHANNELS 0x10 // A raw IPMI message without any addressing. This covers both // commands and responses. The completion code is always the first // byte of data in the response (as the spec shows the messages laid // out). struct ipmi_msg { unsigned char netfn; unsigned char cmd; unsigned short data_len; unsigned char *data; }; // Messages sent to the interface are this format. struct ipmi_req { unsigned char *addr; // Address to send the message to. unsigned int addr_len; long msgid; // The sequence number for the message. This // exact value will be reported back in the // response to this request if it is a command. // If it is a response, this will be used as // the sequence value for the response. struct ipmi_msg msg; }; // Receive types for messages coming from the receive interface. This // is used for the receive in-kernel interface and in the receive // IOCTL. #define IPMI_RESPONSE_RECV_TYPE 1 // A response to a command #define IPMI_ASYNC_EVENT_RECV_TYPE 2 // Something from the event queue #define IPMI_CMD_RECV_TYPE 3 // A command from somewhere else // Note that async events and received commands do not have a completion // code as the first byte of the incoming data, unlike a response. // Messages received from the interface are this format. struct ipmi_recv { int recv_type; // Is this a command, response or an // asyncronous event. unsigned char *addr; // Address the message was from is put // here. The caller must supply the // memory. unsigned int addr_len; // The size of the address buffer. // The caller supplies the full buffer // length, this value is updated to // the actual message length when the // message is received. long msgid; // The sequence number specified in the request // if this is a response. If this is a command, // this will be the sequence number from the // command. struct ipmi_msg msg; // The data field must point to a buffer. // The data_size field must be set to the // size of the message buffer. The // caller supplies the full buffer // length, this value is updated to the // actual message length when the message // is received. }; // Get/set the default timing values for an interface. You shouldn't // generally mess with these. struct ipmi_timing_parms { int retries; unsigned int retry_time_ms; }; // The magic IOCTL value for this interface. #define IPMI_IOC_MAGIC 'i' // Send a message to the interfaces. error values are: // - EFAULT - an address supplied was invalid. // - EINVAL - The address supplied was not valid, or the command // was not allowed. // - EMSGSIZE - The message to was too large. // - ENOMEM - Buffers could not be allocated for the command. #define IPMICTL_SEND_COMMAND _IOR(IPMI_IOC_MAGIC, 13, \ struct ipmi_req) // Like RECEIVE_MSG, but if the message won't fit in the buffer, it // will truncate the contents instead of leaving the data in the // buffer. #define IPMICTL_RECEIVE_MSG_TRUNC _IOWR(IPMI_IOC_MAGIC, 11, \ struct ipmi_recv) // Set whether this interface receives events. Note that the first // user registered for events will get all pending events for the // interface. error values: // - EFAULT - an address supplied was invalid. #define IPMICTL_SET_GETS_EVENTS_CMD _IOR(IPMI_IOC_MAGIC, 16, int) #define IPMICTL_SET_TIMING_PARMS_CMD _IOR(IPMI_IOC_MAGIC, 22, \ struct ipmi_timing_parms) cIpmiConSmi::cIpmiConSmi( unsigned int timeout, int log_level, int if_num ) : cIpmiCon( timeout, log_level ), m_if_num( if_num ) { } cIpmiConSmi::~cIpmiConSmi() { if ( IsOpen() ) Close(); } int cIpmiConSmi::OpenSmiFd( int if_num ) { int fd; char devname[30]; snprintf( devname, sizeof(devname), "/dev/ipmidev/%d", if_num ); fd = open( devname, O_RDWR ); if ( fd >= 0 ) return fd; snprintf( devname, sizeof(devname), "/dev/ipmi/%d", if_num ); fd = open( devname, O_RDWR ); if ( fd >= 0 ) return fd; snprintf( devname, sizeof(devname), "/dev/ipmi%d", if_num ); fd = open( devname, O_RDWR ); return fd; } int cIpmiConSmi::IfGetMaxSeq() { return dMaxSeq; } int cIpmiConSmi::IfOpen() { int fd = OpenSmiFd( m_if_num ); if ( fd < 0 ) return fd; struct ipmi_timing_parms parms; int rv; parms.retries = 0; parms.retry_time_ms = 1000; rv = ioctl( fd, IPMICTL_SET_TIMING_PARMS_CMD, &parms ); if ( rv == -1 ) stdlog << "Warning: Could not set timing parms !\n"; // we want async events int val = 1; rv = ioctl( fd, IPMICTL_SET_GETS_EVENTS_CMD, &val ); if ( rv == -1 ) stdlog << "Warning: Could not set gets events !\n"; return fd; } void cIpmiConSmi::IfClose() { } SaErrorT cIpmiConSmi::IfSendCmd( cIpmiRequest *r ) { cIpmiAddr send_addr = r->m_send_addr; ipmi_addr addr; unsigned int addr_len = 0; addr.addr_type = (int)send_addr.m_type; // convert addr switch( send_addr.m_type ) { case eIpmiAddrTypeSystemInterface: { ipmi_system_interface_addr *si = (ipmi_system_interface_addr *)&addr; si->channel = send_addr.m_channel; si->lun = send_addr.m_lun; addr_len = sizeof( ipmi_system_interface_addr ); } break; case eIpmiAddrTypeIpmb: case eIpmiAddrTypeIpmbBroadcast: { ipmi_ipmb_addr *ipmb = (ipmi_ipmb_addr *)&addr; ipmb->channel = send_addr.m_channel; ipmb->slave_addr = send_addr.m_slave_addr; ipmb->lun = send_addr.m_lun; addr_len = sizeof( ipmi_ipmb_addr ); } break; default: return SA_ERR_HPI_INVALID_PARAMS; } struct ipmi_req req; req.addr = (unsigned char *)&addr; req.addr_len = addr_len; req.msg.netfn = r->m_msg.m_netfn; req.msg.cmd = r->m_msg.m_cmd; req.msg.data_len = r->m_msg.m_data_len; req.msg.data = r->m_msg.m_data; req.msgid = r->m_seq; int rv = ioctl( m_fd, IPMICTL_SEND_COMMAND, &req ); if ( rv ) return SA_ERR_HPI_INVALID_REQUEST; return SA_OK; } void cIpmiConSmi::IfReadResponse() { unsigned char data[dIpmiMaxMsgLength]; ipmi_addr addr; ipmi_recv recv; recv.msg.data = data; recv.msg.data_len = dIpmiMaxMsgLength; recv.addr = (unsigned char *)&addr; recv.addr_len = sizeof( ipmi_addr ); int rv = ioctl( m_fd, IPMICTL_RECEIVE_MSG_TRUNC, &recv ); if ( rv == -1 ) { if ( errno == EMSGSIZE ) // The message was truncated, handle it as such. data[0] = eIpmiCcRequestedDataLengthExceeded; else return; } // convert addr cIpmiAddr rsp_addr; rsp_addr.m_type = (tIpmiAddrType)addr.addr_type; switch( rsp_addr.m_type ) { case eIpmiAddrTypeSystemInterface: { ipmi_system_interface_addr *si = (ipmi_system_interface_addr *)&addr; rsp_addr.m_channel = si->channel; rsp_addr.m_lun = si->lun; } break; case eIpmiAddrTypeIpmb: case eIpmiAddrTypeIpmbBroadcast: { ipmi_ipmb_addr *ipmb = (ipmi_ipmb_addr *)&addr; rsp_addr.m_channel = ipmb->channel; rsp_addr.m_slave_addr = ipmb->slave_addr; rsp_addr.m_lun = ipmb->lun; } break; default: return; } // convert msg cIpmiMsg rsp; rsp.m_netfn = (tIpmiNetfn)recv.msg.netfn; rsp.m_cmd = (tIpmiCmd)recv.msg.cmd; rsp.m_data_len = recv.msg.data_len; if ( rsp.m_data_len ) memcpy( rsp.m_data, recv.msg.data, rsp.m_data_len ); int seq = (int)recv.msgid; switch( recv.recv_type ) { case IPMI_RESPONSE_RECV_TYPE: HandleResponse( seq, rsp_addr, rsp ); break; case IPMI_ASYNC_EVENT_RECV_TYPE: HandleEvent( rsp_addr, rsp ); break; case IPMI_CMD_RECV_TYPE: // incomming command stdlog << "SMI: incomming ipmi command " << IpmiCmdToString( rsp.m_netfn, rsp.m_cmd ) << ".\n"; break; default: break; } } openhpi-2.14.1/plugins/ipmidirect/ipmi_auth.h0000644000076400007640000000741611302567000016135 0ustar /* * Copyright (c) 2003,2004 by FORCE Computers * * Note that this file is based on parts of OpenIPMI * written by Corey Minyard * of MontaVista Software. Corey's code was helpful * and many thanks go to him. He gave the permission * to use this code in OpenHPI under BSD license. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Thomas Kanngieser */ #ifndef dIpmiAuth_h #define dIpmiAuth_h #include "config.h" /* Data is provided to the authorization code as an array of these items, a "scatter-gather" list. The algorithm will go through the item in the array until "data" is NULL. */ class cIpmiAuthSg { public: void *data; /* NULL to terminate. */ int len; }; class cIpmiAuth { public: virtual ~cIpmiAuth() {}; /* Initialize the authorization engine and return a handle for it. You must pass this handle into the other authorization calls. Return 0 on success or an errno on failure. */ virtual int Init( const unsigned char *password ) = 0; /* Generate a 16-byte authorization code and put it into "output". Returns 0 on success and an errno on failure. */ virtual int Gen( cIpmiAuthSg data[], void *output ) = 0; /* Check that the 16-byte authorization code given in "code" is valid. This will return 0 if it is valid or EINVAL if not. */ virtual int Check( cIpmiAuthSg data[], void *code ) = 0; }; // maximum number of charaters for username #define dIpmiUsernameMax 16 #define dIpmiPasswordMax 16 // Standard IPMI authentication algorithms. enum tIpmiAuthType { eIpmiAuthTypeNone = 0, eIpmiAuthTypeMd2 = 1, eIpmiAuthTypeMd5 = 2, eIpmiAuthTypeStraight = 4, eIpmiAuthTypeOem = 5, }; cIpmiAuth *IpmiAuthFactory( tIpmiAuthType type ); // This is a table of authentication algorithms. #define dMaxIpmiAuths 6 // IPMI privilege levels enum tIpmiPrivilege { eIpmiPrivilegeNone = 0, eIpmiPrivilegeCallback = 1, eIpmiPrivilegeUser = 2, eIpmiPrivilegeOperator = 3, eIpmiPrivilegeAdmin = 4, eIpmiPrivilegeOem = 5 }; // Tell if a specific command is permitted for the given priviledge // level. Returns one of the following. enum tIpmiPriv { eIpmiPrivInvalid = -1, eIpmiPrivDenied = 0, eIpmiPrivPermitted = 1, eIpmiPrivSend = 2, // Special send message handling needed. eIpmiPrivBoot = 3, // Special set system boot options handling. }; class cIpmiAuthNone : public cIpmiAuth { unsigned char data[16]; public: virtual int Init( const unsigned char *password ); virtual int Gen( cIpmiAuthSg data[], void *output ); virtual int Check( cIpmiAuthSg data[], void *code ); }; #ifdef HAVE_OPENSSL_MD2_H class cIpmiAuthMd2 : public cIpmiAuth { unsigned char data[16]; public: virtual int Init( const unsigned char *password ); virtual int Gen( cIpmiAuthSg data[], void *output ); virtual int Check( cIpmiAuthSg data[], void *code ); }; #endif #ifdef HAVE_OPENSSL_MD5_H class cIpmiAuthMd5 : public cIpmiAuth { unsigned char data[16]; public: virtual int Init( const unsigned char *password ); virtual int Gen( cIpmiAuthSg data[], void *output ); virtual int Check( cIpmiAuthSg data[], void *code ); }; #endif class cIpmiAuthStraight : public cIpmiAuth { unsigned char data[16]; public: virtual int Init( const unsigned char *password ); virtual int Gen( cIpmiAuthSg data[], void *output ); virtual int Check( cIpmiAuthSg data[], void *code ); }; #endif openhpi-2.14.1/plugins/ipmidirect/ipmi_entity.cpp0000644000076400007640000001230111302567000017030 0ustar /* * ipmi_entity.cpp * * Copyright (c) 2003,2004 by FORCE Computers * Copyright (c) 2005 by ESO Technologies. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Thomas Kanngieser * Pierre Sangouard */ #include #include #include #include #include #include "ipmi_entity.h" #include "ipmi_log.h" #include static const char *entity_id_types[] = { "Unspecified", "Other", "Unkown", "Processor", "Disk", "Peripheral", "SystemManagementModule", "SystemBoard", "MemoryModule", "ProcessorModule", "PowerSupply", "AddInCard", "FrontPanelBoard", "BackPanelBoard", "PowerSystemBoard", "DriveBackplane", "SystemInternalExpansionBoard", "OtherSystemBoard", "ProcessorBoard", "PowerUnit", "PowerModule", "PowerManagementBoard", "ChassisBackPanelBoard", "SystemChassis", "SubChassis", "OtherChassisBoard", "DiskDriveBay", "PeripheralBay", "DeviceBay", "FanCooling", "CoolingUnit", "CableInterconnect", "MemoryDevice", "SystemManagementSoftware", "Bios", "OperatingSystem", "SystemBus", "Group", "RemoteMgmtCommDevice", "ExternalEnvironment", "Battery", "ProcessingBlade", "ConnectivitySwitch", "ProcessorMemoryModule", "IoModule", "ProcessorIoModule", "ManagementControllerFirmware", }; #define dNumEntityIdTypes (sizeof(entity_id_types)/sizeof(char *)) const char * IpmiEntityIdToString( tIpmiEntityId val ) { if ( (unsigned int)val < dNumEntityIdTypes ) return entity_id_types[val]; switch( val ) { case eIpmiEntityIdPicMgFrontBoard: return "PicmgFrontBoard"; case eIpmiEntityIdPicMgRearTransitionModule: return "PicmgRearTransitionModule"; case eIpmiEntityIdPicMgAdvancedMcModule: return "PicMgAdvancedMcModule"; case eIpmiEntityIdPicMgMicroTcaCarrierHub: return "PicMgMicroTcaCarrierHub"; case eIpmiEntityIdPicmgShelfManager: return "PicmgShelfManager"; case eIpmiEntityIdPicmgFiltrationUnit: return "PicmgFiltrationUnit"; case eIpmiEntityIdPicmgShelfFruInformation: return "PicmgShelfFruInformation"; case eIpmiEntityIdPicmgAlarmPanel: return "PicmgAlarmPanel"; default: break; } return "Invalid"; } cIpmiEntityPath::cIpmiEntityPath() { memset( &m_entity_path, 0, sizeof( SaHpiEntityPathT ) ); } cIpmiEntityPath::cIpmiEntityPath( const SaHpiEntityPathT &entity_path ) { m_entity_path = entity_path; } void cIpmiEntityPath::SetEntry( int idx, SaHpiEntityTypeT type, SaHpiEntityLocationT instance ) { assert( idx >= 0 && idx < SAHPI_MAX_ENTITY_PATH ); m_entity_path.Entry[idx].EntityType = type; m_entity_path.Entry[idx].EntityLocation = instance; } SaHpiEntityTypeT cIpmiEntityPath::GetEntryType( int idx ) { assert( idx >= 0 && idx < SAHPI_MAX_ENTITY_PATH ); return m_entity_path.Entry[idx].EntityType; } void cIpmiEntityPath::SetEntryType( int idx, SaHpiEntityTypeT type ) { assert( idx >= 0 && idx < SAHPI_MAX_ENTITY_PATH ); m_entity_path.Entry[idx].EntityType = type; } SaHpiEntityLocationT cIpmiEntityPath::GetEntryInstance( int idx ) { assert( idx >= 0 && idx < SAHPI_MAX_ENTITY_PATH ); return m_entity_path.Entry[idx].EntityLocation; } void cIpmiEntityPath::SetEntryInstance( int idx, SaHpiEntityLocationT instance ) { assert( idx >= 0 && idx < SAHPI_MAX_ENTITY_PATH ); m_entity_path.Entry[idx].EntityLocation = instance; } cIpmiEntityPath & cIpmiEntityPath::operator+=( const cIpmiEntityPath &epath ) { oh_concat_ep( &m_entity_path, &epath.m_entity_path ); return *this; } bool cIpmiEntityPath::operator==( const cIpmiEntityPath &epath ) const { SaHpiBoolT cmp_result; cmp_result = oh_cmp_ep( &m_entity_path, &epath.m_entity_path ); if ( cmp_result == SAHPI_TRUE ) return true; else return false; } bool cIpmiEntityPath::operator!=( const cIpmiEntityPath &epath ) const { SaHpiBoolT cmp_result; cmp_result = oh_cmp_ep( &m_entity_path, &epath.m_entity_path ); if ( cmp_result == SAHPI_TRUE ) return false; else return true; } void cIpmiEntityPath::AppendRoot( int idx ) { assert( idx >= 0 && idx < SAHPI_MAX_ENTITY_PATH ); m_entity_path.Entry[idx].EntityType = SAHPI_ENT_ROOT; m_entity_path.Entry[idx].EntityLocation = 0; } cIpmiLog & operator<<( cIpmiLog &log, const cIpmiEntityPath &epath ) { oh_big_textbuffer path_text; char str[OH_MAX_TEXT_BUFFER_LENGTH+1]; oh_decode_entitypath( &epath.m_entity_path, &path_text ); memcpy( str, path_text.Data, path_text.DataLength ); str[path_text.DataLength] = 0; log << str; return log; } bool cIpmiEntityPath::FromString( const char *str ) { return oh_encode_entitypath( str, &m_entity_path ) ? false : true; } openhpi-2.14.1/plugins/ipmidirect/ipmi_msg.cpp0000644000076400007640000000240711302567000016310 0ustar /* * * Copyright (c) 2003 by FORCE Computers. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Thomas Kanngieser */ #include #include "ipmi_msg.h" cIpmiMsg::cIpmiMsg() : m_netfn( eIpmiNetfnChassis ), m_cmd( eIpmiCmdGetChassisCapabilities ), m_data_len( 0 ) { } cIpmiMsg::cIpmiMsg( tIpmiNetfn netfn, tIpmiCmd cmd, unsigned short data_len, unsigned char *data ) : m_netfn( netfn ), m_cmd( cmd ) { if ( data_len <= dIpmiMaxMsgLength ) m_data_len = data_len; else m_data_len = dIpmiMaxMsgLength; if ( data ) { memcpy( m_data, data, m_data_len ); } } bool cIpmiMsg::Equal( const cIpmiMsg &msg2 ) const { if ( m_netfn != msg2.m_netfn || m_cmd != msg2.m_cmd || m_data_len != msg2.m_data_len ) return false; if ( m_data_len ) if ( memcmp( m_data, msg2.m_data, m_data_len ) ) return false; return true; } openhpi-2.14.1/plugins/ipmidirect/ipmi_con_lan.h0000644000076400007640000000661611302567000016606 0ustar /* * * Copyright (c) 2003,2004 by FORCE Computers * * Note that this file is based on parts of OpenIPMI * written by Corey Minyard * of MontaVista Software. Corey's code was helpful * and many thanks go to him. He gave the permission * to use this code in OpenHPI under BSD license. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Thomas Kanngieser */ #ifndef dIpmiConLan_h #define dIpmiConLan_h #include #ifndef dIpmiCon_h #include "ipmi_con.h" #endif #ifndef dIpmiAuth_h #include "ipmi_auth.h" #endif // standard RMCP port #define dIpmiConLanStdPort 623 // # of times to try a message before we fail it. #define dLanRspRetries 2 #define dLanPingTimeout 2000 #define dAsfIana 0xbe110000 class cIpmiConLan : public cIpmiCon { protected: struct sockaddr_in m_ip_addr; int m_port; tIpmiAuthType m_auth; tIpmiPrivilege m_priv; cIpmiAuth *m_auth_method; char m_username[dIpmiUsernameMax+1]; char m_passwd[dIpmiPasswordMax+1]; uint32_t m_session_id; tIpmiAuthType m_working_auth; // connection challange unsigned char m_challenge_string[16]; // outstanding pongs int m_ping_count; uint32_t m_outbound_seq_num; uint32_t m_inbound_seq_num; uint16_t m_recv_msg_map; int AuthGen( unsigned char *out, uint8_t *ses_id, uint8_t *seq, unsigned char *data, unsigned int data_len ); int AuthCheck( uint8_t *ses_id, uint8_t *seq, unsigned char *data, unsigned int data_len, unsigned char *code ); int OpenLanFd(); unsigned char Checksum( unsigned char *data, int size ); int SendPing(); bool WaitForPong( unsigned int timeout_ms ); enum tResponseType { eResponseTypeError, eResponseTypePong, eResponseTypeMessage, eResponseTypeEvent, eResponseTypeTimeout }; tResponseType ReadResponse( int &seq, cIpmiAddr &addr, cIpmiMsg &msg ); tResponseType HandleData( int fd, cIpmiAddr &addr, cIpmiMsg &msg ); tResponseType WaitForResponse( unsigned int timeout_ms, int &seq, cIpmiAddr &addr, cIpmiMsg &msg ); SaErrorT SendMsgAndWaitForResponse( const cIpmiAddr &addr, const cIpmiMsg &msg, cIpmiAddr &rsp_addr, cIpmiMsg &rsp_msg ); SaErrorT AuthCap(); SaErrorT SetSessionPriv(); SaErrorT ActiveSession(); SaErrorT Challange(); void Reconnect(); void SendCloseSession(); SaErrorT CreateSession(); public: cIpmiConLan( unsigned int timeout, int log_level, struct in_addr addr, int port, tIpmiAuthType auth, tIpmiPrivilege priv, char *user, char *passwd ); virtual ~cIpmiConLan(); protected: virtual int IfGetMaxSeq(); virtual int IfOpen(); virtual void IfClose(); virtual SaErrorT IfSendCmd( cIpmiRequest *r ); virtual void IfReadResponse(); virtual bool IfCheckConnection( cTime &timeout ); virtual void IfCheckConnectionTimeout(); }; #endif openhpi-2.14.1/plugins/ipmidirect/ipmi_watchdog.cpp0000644000076400007640000001163311302567000017323 0ustar /* * ipmi_watchdog.cpp * * Copyright (c) 2006-2008 by ESO Technologies. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Pierre Sangouard */ #include "ipmi_watchdog.h" #include "ipmi_domain.h" cIpmiWatchdog::cIpmiWatchdog( cIpmiMc *mc, unsigned int num, unsigned int oem ) : cIpmiRdr( mc, SAHPI_WATCHDOG_RDR ), m_num( num ), m_oem( oem ) { } cIpmiWatchdog::~cIpmiWatchdog() { } bool cIpmiWatchdog::CreateRdr( SaHpiRptEntryT &resource, SaHpiRdrT &rdr ) { if ( cIpmiRdr::CreateRdr( resource, rdr ) == false ) return false; // update resource resource.ResourceCapabilities |= SAHPI_CAPABILITY_RDR|SAHPI_CAPABILITY_WATCHDOG; // watchdog record SaHpiWatchdogRecT &rec = rdr.RdrTypeUnion.WatchdogRec; rec.WatchdogNum = m_num; rec.Oem = m_oem; return true; } /* * Watchdog Timer routines * - added 10/10/2006 ARCress * */ SaHpiWatchdogPretimerInterruptT WDPI2Hpi(unsigned char b) { switch(b) { case 0x10: return SAHPI_WPI_SMI; case 0x20: return SAHPI_WPI_NMI; case 0x30: return SAHPI_WPI_MESSAGE_INTERRUPT; case 0x70: return SAHPI_WPI_OEM; default: return SAHPI_WPI_NONE; } } SaHpiWatchdogTimerUseT WDTimerUse2Hpi(unsigned char b) { switch(b) { case 0: return SAHPI_WTU_NONE; case 1: return SAHPI_WTU_BIOS_FRB2; case 2: return SAHPI_WTU_BIOS_POST; case 3: return SAHPI_WTU_OS_LOAD; case 4: return SAHPI_WTU_SMS_OS; case 5: return SAHPI_WTU_OEM; default: return SAHPI_WTU_UNSPECIFIED; } } SaHpiWatchdogActionT WDAction2Hpi(unsigned char b) { switch(b) { case 0: return SAHPI_WA_NO_ACTION; case 1: return SAHPI_WA_RESET; case 2: return SAHPI_WA_POWER_DOWN; case 3: return SAHPI_WA_POWER_CYCLE; default: return SAHPI_WA_RESET; } } SaErrorT cIpmiWatchdog::GetWatchdogInfo( SaHpiWatchdogT &watchdog) { cIpmiMsg msg( eIpmiNetfnApp, eIpmiCmdGetWatchdogTimer ); cIpmiMsg rsp; SaErrorT rv; stdlog << "GetWatchdogInfo: num " << m_num << "\n"; msg.m_data_len = 0; rv = Resource()->SendCommandReadLock( msg, rsp ); if (rv != SA_OK || rsp.m_data[0] != eIpmiCcOk) { stdlog << "GetWatchdogInfo error " << rv << " cc=" << rsp.m_data[0] << "\n"; if (rv == SA_OK) rv = SA_ERR_HPI_INTERNAL_ERROR; } else { if ((rsp.m_data[1] & 0x40) == 0) watchdog.Running = 0; else watchdog.Running = 1; if ((rsp.m_data[1] & 0x80) == 0) watchdog.Log = 1; else watchdog.Log = 0; watchdog.TimerUse = WDTimerUse2Hpi(rsp.m_data[1] & 0x07); watchdog.TimerAction = WDAction2Hpi(rsp.m_data[2] & 0x07); watchdog.PretimerInterrupt = WDPI2Hpi(rsp.m_data[2] & 0x70); watchdog.PreTimeoutInterval = rsp.m_data[3] * 1000; watchdog.TimerUseExpFlags = rsp.m_data[4]; watchdog.InitialCount = (rsp.m_data[5] + (rsp.m_data[6] << 8)) * 100; watchdog.PresentCount = (rsp.m_data[7] + (rsp.m_data[8] << 8)) * 100; } return rv; } SaErrorT cIpmiWatchdog::SetWatchdogInfo( SaHpiWatchdogT &watchdog) { cIpmiMsg msg( eIpmiNetfnApp, eIpmiCmdSetWatchdogTimer ); cIpmiMsg rsp; SaErrorT rv; unsigned char blog; int tval = watchdog.InitialCount / 100; stdlog << "SetWatchdogInfo to " << watchdog.InitialCount << " msec\n"; msg.m_data_len = 6; if (watchdog.Log) blog = 0; else blog = 0x80; /* DontLog bit */ if (watchdog.TimerAction != 0) blog |= 0x40; msg.m_data[0] = blog | (watchdog.TimerUse & 0x07); msg.m_data[1] = (watchdog.TimerAction & 0x07) | ((watchdog.PretimerInterrupt & 0x07) << 4); msg.m_data[2] = (watchdog.PreTimeoutInterval / 1000); msg.m_data[3] = watchdog.TimerUseExpFlags; msg.m_data[4] = tval & 0x00ff; msg.m_data[5] = (tval & 0xff00) >> 8; rv = Resource()->SendCommandReadLock( msg, rsp ); if (rv != SA_OK || rsp.m_data[0] != eIpmiCcOk) { stdlog << "SetWatchdogInfo error " << rv << " cc=" << rsp.m_data[0] << "\n"; if (rv == SA_OK) rv = SA_ERR_HPI_INTERNAL_ERROR; } return (rv); } SaErrorT cIpmiWatchdog::ResetWatchdog() { cIpmiMsg msg( eIpmiNetfnApp, eIpmiCmdResetWatchdogTimer ); cIpmiMsg rsp; SaErrorT rv; stdlog << "ResetWatchdog: num " << m_num << "\n"; /* add functionality here */ msg.m_data_len = 0; rv = Resource()->SendCommandReadLock( msg, rsp ); if (rv != SA_OK || rsp.m_data[0] != eIpmiCcOk) { stdlog << "ResetWatchdog error " << rv << " cc=" << rsp.m_data[0] << "\n"; if (rv == SA_OK) rv = SA_ERR_HPI_INTERNAL_ERROR; } return (rv); } openhpi-2.14.1/plugins/ipmidirect/ipmi_sensor_factors.h0000644000076400007640000000666411302567000020232 0ustar /* * ipmi_sensor_factors.h * * Copyright (c) 2004 by FORCE Computers * Copyright (c) 2005 by ESO Technologies. * * Note that this file is based on parts of OpenIPMI * written by Corey Minyard * of MontaVista Software. Corey's code was helpful * and many thanks go to him. He gave the permission * to use this code in OpenHPI under BSD license. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Thomas Kanngieser * Pierre Sangouard */ #ifndef dIpmiSensorFactors_h #define dIpmiSensorFactors_h extern "C" { #include "SaHpi.h" } #ifndef dIpmiSdr_h #include "ipmi_sdr.h" #endif // analog data format enum tIpmiAnalogeDataFormat { eIpmiAnalogDataFormatUnsigned = 0, eIpmiAnalogDataFormat1Compl = 1, eIpmiAnalogDataFormat2Compl = 2, eIpmiAnalogDataFormatNotAnalog = 3 }; const char *IpmiAnalogeDataFormatToString( tIpmiAnalogeDataFormat fmt ); // raw value linearization enum tIpmiLinearization { eIpmiLinearizationLinear = 0, eIpmiLinearizationLn = 1, eIpmiLinearizationLog10 = 2, eIpmiLinearizationLog2 = 3, eIpmiLinearizationE = 4, eIpmiLinearizationExp10 = 5, eIpmiLinearizationExp2 = 6, eIpmiLinearization1OverX = 7, eIpmiLinearizationSqr = 8, eIpmiLinearizationCube = 9, eIpmiLinearizationSqrt = 10, eIpmiLinearization1OverCube = 11, eIpmiLinearizationNonlinear = 0x70 }; const char *IpmiLinearizationToString( tIpmiLinearization val ); class cIpmiSensorFactors { public: cIpmiSensorFactors(); virtual ~cIpmiSensorFactors(); virtual bool GetDataFromSdr( const cIpmiSdr *sdr ); virtual bool Cmp( const cIpmiSensorFactors &sf ) const; tIpmiAnalogeDataFormat m_analog_data_format; tIpmiLinearization m_linearization; bool m_is_non_linear; int m_m : 10; unsigned int m_tolerance : 6; int m_b : 10; int m_r_exp : 4; unsigned int m_accuracy_exp : 2; int m_accuracy : 10; int m_b_exp : 4; double m_accuracy_factor; public: tIpmiAnalogeDataFormat AnalogDataFormat() const { return m_analog_data_format; } tIpmiLinearization Linearization() const { return m_linearization; } int M() const { return m_m; } unsigned int Tolerance() const { return m_tolerance; } int B() const { return m_b; } int RExp() const { return m_r_exp; } unsigned int AccuracyExp() const { return m_accuracy_exp; } int Accuracy() const { return m_accuracy; } double AccuracyFactor() const { return m_accuracy_factor; } int BExp() const { return m_b_exp; } bool IsNonLinear() const { return m_is_non_linear; } enum tIpmiRound { eRoundNormal, eRoundDown, eRoundUp }; bool ConvertFromRaw( unsigned int val, double &result, bool is_hysteresis ) const; bool ConvertToRaw( tIpmiRound rounding, double val, unsigned int &result, bool is_hysteresis, bool swap_thresholds ) const; }; #endif openhpi-2.14.1/plugins/ipmidirect/ipmi_sensor_hotswap.h0000644000076400007640000000262311302567000020245 0ustar /* * ipmi_sensor_hotswap.h * * Copyright (c) 2004 by FORCE Computers * Copyright (c) 2005 by ESO Technologies. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Thomas Kanngieser * Pierre Sangouard */ #ifndef dIpmiSensorHotswap_h #define dIpmiSensorHotswap_h #ifndef dIpmiSensorDiscrete_h #include "ipmi_sensor_discrete.h" #endif #ifndef dIpmiUtils_h #include "ipmi_utils.h" #endif class cIpmiSensorHotswap : public cIpmiSensorDiscrete { public: static SaHpiHsStateT ConvertIpmiToHpiHotswapState( tIpmiFruState h ); public: cIpmiSensorHotswap( cIpmiMc *mc ); virtual ~cIpmiSensorHotswap(); // handle hotswap sensor events virtual void HandleEvent( cIpmiEvent *event ); // read sensor parameter from Full Sensor Record virtual bool GetDataFromSdr( cIpmiMc *mc, cIpmiSdr *sdr ); // create an RDR sensor record virtual bool CreateRdr( SaHpiRptEntryT &resource, SaHpiRdrT &rdr ); // read hotswap state SaErrorT GetPicmgState( tIpmiFruState &state ); SaErrorT GetHpiState( SaHpiHsStateT &state ); }; #endif openhpi-2.14.1/plugins/ipmidirect/ipmi_addr.h0000644000076400007640000000511711302567000016102 0ustar /* * ipmi_addr.h * * Interface for IPMI file connection * * Copyright (c) 2003,2004 by FORCE Computers. * Copyright (c) 2005 by ESO Technologies. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Thomas Kanngieser * Pierre Sangouard */ #ifndef dIpmiAddr_h #define dIpmiAddr_h // This is an overlay for all the address types, so it's easy to // determine the actual address type. This is kind of like addresses // work for sockets. #define dIpmiMaxAddrSize 32 // When the address is not used, the type will be set to this value. // The channel is the BMC's channel number for the channel (usually // 0), or dIpmcBmcChannel if communicating directly with the BMC. // Channel for talking directly with the BMC. When using this // channel, This is for the system interface address type only. // FIXME - is this right, or should we use -1? #define dIpmiBmcChannel 0xf #define dIpmiNumChannels 0x10 #define dIpmiBmcSlaveAddr 0x20 enum tIpmiAddrType { eIpmiAddrTypeIpmb = 1, eIpmiAddrTypeSystemInterface = 0xc, eIpmiAddrTypeIpmbBroadcast = 0x41, }; #define dIpmiMaxChannel 16 class cIpmiAddr { public: // Try to take these from the "Channel Medium Type" table // in section 6.5 of the IPMI 1.5 manual. tIpmiAddrType m_type; unsigned short m_channel; unsigned char m_lun; unsigned char m_slave_addr; cIpmiAddr( tIpmiAddrType type = eIpmiAddrTypeIpmb, short channel = 0, unsigned char lun = 0, unsigned char slave_addr = dIpmiBmcSlaveAddr ) : m_type( type ), m_channel( channel ), m_lun( lun ), m_slave_addr( slave_addr ) { if ( type == eIpmiAddrTypeSystemInterface ) Si(); } int Cmp( const cIpmiAddr &addr ) const; bool operator==( const cIpmiAddr &addr ) const { return !Cmp( addr ); } bool operator!=( const cIpmiAddr &addr ) const { return Cmp( addr ); } void Log() const; short Channel() const { return m_channel; } bool IsType( tIpmiAddrType type ) const { return m_type == type; } unsigned char Lun() const { return m_lun; } unsigned char SlaveAddr() const { return m_slave_addr; } void Si() { m_type = eIpmiAddrTypeSystemInterface; m_channel = dIpmiBmcChannel; m_lun = 0; } }; #endif openhpi-2.14.1/plugins/ipmidirect/ipmi_fru_info.h0000644000076400007640000000544111302567000016777 0ustar /* * ipmi_fru_info.h * * Copyright (c) 2004 by FORCE Computers. * Copyright (c) 2005 by ESO Technologies. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Thomas Kanngieser * Pierre Sangouard */ #ifndef dIpmiFruInfo_h #define dIpmiFruInfo_h #ifndef dIpmiEntity_h #include "ipmi_entity.h" #endif enum tIpmiAtcaSiteType { eIpmiAtcaSiteTypeAtcaBoard = 0, eIpmiAtcaSiteTypePowerEntryModule = 1, eIpmiAtcaSiteTypeShelfFruInformation = 2, eIpmiAtcaSiteTypeDedicatedShMc = 3, eIpmiAtcaSiteTypeFanTray = 4, eIpmiAtcaSiteTypeFanFilterTray = 5, eIpmiAtcaSiteTypeAlarm = 6, eIpmiAtcaSiteTypeAdvancedMcModule = 7, eIpmiAtcaSiteTypePMC = 8, eIpmiAtcaSiteTypeRearTransitionModule = 9, eIpmiAtcaSiteTypeMicroTcaCarrierHub = 10, eIpmiAtcaSiteTypePowerModule = 11, eIpmiAtcaSiteTypeUnknown }; SaHpiEntityTypeT MapAtcaSiteTypeToEntity( tIpmiAtcaSiteType type ); class cIpmiFruInfo { unsigned int m_addr; unsigned int m_fru_id; unsigned int m_slot; SaHpiEntityTypeT m_entity; tIpmiAtcaSiteType m_site; // only valid if m_fru_id == 0 // dIpmiMcThreadXXXX properties unsigned int m_properties; public: cIpmiFruInfo( unsigned int addr, unsigned int fru_id, SaHpiEntityTypeT entity, unsigned int slot, tIpmiAtcaSiteType site, unsigned int properties ); virtual ~cIpmiFruInfo(); unsigned int Address() { return m_addr; } unsigned int FruId() { return m_fru_id; } SaHpiEntityTypeT &Entity() { return m_entity; } unsigned int &Slot() { return m_slot; } tIpmiAtcaSiteType &Site() { return m_site; } unsigned int Properties() { return m_properties; } virtual cIpmiEntityPath CreateEntityPath( const cIpmiEntityPath &top, const cIpmiEntityPath &bottom ); }; class cIpmiFruInfoContainer { GList *m_fru_info; public: cIpmiFruInfoContainer(); ~cIpmiFruInfoContainer(); cIpmiFruInfo *FindFruInfo( unsigned int addr, unsigned int fru_id ) const; bool AddFruInfo( cIpmiFruInfo *fru_info ); bool RemFruInfo( cIpmiFruInfo *fru_info ); cIpmiFruInfo *NewFruInfo( unsigned int addr, unsigned int fru_id, SaHpiEntityTypeT entity, unsigned int slot, tIpmiAtcaSiteType site, unsigned int properties ); cIpmiFruInfo *NewFruInfo( unsigned int addr, unsigned int fru_id ); unsigned int GetFreeSlotForOther( unsigned int addr ); GList *GetFruInfoList() const { return m_fru_info; } }; #endif openhpi-2.14.1/plugins/ipmidirect/ipmi_control_fan.cpp0000644000076400007640000001001511302567000020020 0ustar /* * ipmi_control_fan.cpp * * Copyright (c) 2004 by FORCE Computers. * Copyright (c) 2005-2006 by ESO Technologies. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Thomas Kanngieser * Pierre Sangouard */ #include "ipmi_control_fan.h" #include "ipmi_resource.h" #include "ipmi_log.h" cIpmiControlFan::cIpmiControlFan( cIpmiMc *mc, unsigned int num, unsigned int minium_speed_level, unsigned int maximum_speed_level, unsigned int default_speed_level, bool local_control_mode ) : cIpmiControl( mc, num, SAHPI_CTRL_FAN_SPEED, SAHPI_CTRL_TYPE_ANALOG ), m_minimum_speed_level( minium_speed_level ), m_maximum_speed_level( maximum_speed_level ), m_default_speed_level( default_speed_level ), m_local_control_mode( local_control_mode ) { } cIpmiControlFan::~cIpmiControlFan() { } bool cIpmiControlFan::CreateRdr( SaHpiRptEntryT &resource, SaHpiRdrT &rdr ) { if ( cIpmiControl::CreateRdr( resource, rdr ) == false ) return false; SaHpiCtrlRecT &rec = rdr.RdrTypeUnion.CtrlRec; SaHpiCtrlRecAnalogT &ana_rec = rec.TypeUnion.Analog; ana_rec.Min = (SaHpiCtrlStateAnalogT)m_minimum_speed_level; ana_rec.Max = (SaHpiCtrlStateAnalogT)m_maximum_speed_level; ana_rec.Default = (SaHpiCtrlStateAnalogT)m_default_speed_level; rec.DefaultMode.Mode = SAHPI_CTRL_MODE_AUTO; rec.DefaultMode.ReadOnly = SAHPI_TRUE; rec.WriteOnly = SAHPI_FALSE; return true; } SaErrorT cIpmiControlFan::SetState( const SaHpiCtrlModeT &mode, const SaHpiCtrlStateT &state ) { if ( mode != SAHPI_CTRL_MODE_AUTO ) { return SA_ERR_HPI_READ_ONLY; } return SA_OK; } SaErrorT cIpmiControlFan::GetState( SaHpiCtrlModeT &mode, SaHpiCtrlStateT &state ) { cIpmiMsg msg( eIpmiNetfnPicmg, eIpmiCmdGetFanLevel ); msg.m_data[0] = dIpmiPicMgId; msg.m_data[1] = Resource()->FruId(); msg.m_data_len = 2; cIpmiMsg rsp; SaErrorT rv = Resource()->SendCommandReadLock( this, msg, rsp ); if ( rv != SA_OK || rsp.m_data_len < 3 || rsp.m_data[0] != eIpmiCcOk || rsp.m_data[1] != dIpmiPicMgId ) { stdlog << "cannot send get fan speed !\n"; return (rv != SA_OK) ? rv : SA_ERR_HPI_INVALID_REQUEST; } if ( &mode != NULL ) { mode = SAHPI_CTRL_MODE_AUTO; } if ( &state != NULL) { state.Type = SAHPI_CTRL_TYPE_ANALOG; if (( rsp.m_data_len >= 5 ) && ( rsp.m_data[4] == 0 )) { state.StateUnion.Analog = (SaHpiCtrlStateAnalogT)rsp.m_data[2]; } else if ( rsp.m_data_len >= 4 ) { if ( rsp.m_data[2] == dIpmiFanLocalControlMode ) { state.StateUnion.Analog = (SaHpiCtrlStateAnalogT)rsp.m_data[3]; } else { if ( rsp.m_data[2] > rsp.m_data[3] ) state.StateUnion.Analog = (SaHpiCtrlStateAnalogT)rsp.m_data[2]; else state.StateUnion.Analog = (SaHpiCtrlStateAnalogT)rsp.m_data[3]; } } else { state.StateUnion.Analog = (SaHpiCtrlStateAnalogT)rsp.m_data[2]; } } return SA_OK; } void cIpmiControlFan::Dump( cIpmiLog &dump, const char *name ) const { dump.Begin( "FanControl", name ); dump.Entry( "ControlNum" ) << m_num << ";\n"; dump.Entry( "Oem" ) << m_oem << ";\n"; dump.Entry( "MinimumSpeedLevel" ) << m_minimum_speed_level << ";\n"; dump.Entry( "MaximumSpeedLevel" ) << m_maximum_speed_level << ";\n"; dump.Entry( "DefaultSpeedLevel" ) << m_default_speed_level << ";\n"; dump.Entry( "LocalControlMode" ) << m_local_control_mode << ";\n"; dump.End(); } openhpi-2.14.1/plugins/ipmidirect/ipmi_sdr.cpp0000644000076400007640000012057111302567000016315 0ustar /* * ipmi_sdr.cpp * * Copyright (c) 2003,2004 by FORCE Computers * Copyright (c) 2005-2007 by ESO Technologies. * * Note that this file is based on parts of OpenIPMI * written by Corey Minyard * of MontaVista Software. Corey's code was helpful * and many thanks go to him. He gave the permission * to use this code in OpenHPI under BSD license. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Thomas Kanngieser * Pierre Sangouard * Andy Cress */ #include #include #include #include #include #include "ipmi_mc.h" #include "ipmi_cmd.h" #include "ipmi_log.h" #include "ipmi_utils.h" #include "ipmi_text_buffer.h" #include "ipmi_sensor_threshold.h" static const char *repository_sdr_update_map[] = { "Unspecified", "NonModal", "Modal", "Both" }; static int repository_sdr_update_num = sizeof( repository_sdr_update_map ) / sizeof( char * ); const char * IpmiRepositorySdrUpdateToString( tIpmiRepositorySdrUpdate val ) { if ( (int)val >= repository_sdr_update_num ) return "Invalid"; return repository_sdr_update_map[val]; } struct cIpmiSdrTypeToName { tIpmiSdrType m_type; const char *m_name; }; static cIpmiSdrTypeToName type_to_name[] = { { eSdrTypeFullSensorRecord , "FullSensor" }, { eSdrTypeCompactSensorRecord , "CompactSensor" }, { eSdrTypeEntityAssociationRecord , "EntityAssociation" }, { eSdrTypeDeviceRelativeEntityAssociationRecord, "DeviceRelativeEntityAssociation" }, { eSdrTypeGenericDeviceLocatorRecord , "GenericDeviceLocator" }, { eSdrTypeFruDeviceLocatorRecord , "FruDeviceLocator" }, { eSdrTypeMcDeviceLocatorRecord , "McDeviceLocator" }, { eSdrTypeMcConfirmationRecord , "McConfirmation" }, { eSdrTypeBmcMessageChannelInfoRecord , "BmcMessageChannelInfo" }, { eSdrTypeOemRecord , "Oem" }, { eSdrTypeUnknown, 0 } }; const char * IpmiSdrTypeToName( tIpmiSdrType type ) { if ( type == eSdrTypeUnknown ) return "Unknown"; for( cIpmiSdrTypeToName *t = type_to_name; t->m_name; t++ ) if ( t->m_type == type ) return t->m_name; return "Invalid"; } static bool Bit( unsigned char v, int bit ) { return v & (1<> 4) << ";\n"; dump.Entry( "Lun" ) << (int)(m_data[6] & 0x3) << ";\n"; dump.Entry( "SensorNum" ) << m_data[7] << ";\n"; tIpmiEntityId id = (tIpmiEntityId)m_data[8]; if ( !strcmp( IpmiEntityIdToString( id ), "Invalid" ) ) snprintf( str, sizeof(str), "0x%02x", id ); else snprintf( str, sizeof(str), "%s", IpmiEntityIdToString( id ) ); dump.Entry( "EntityId" ) << str << ";\n"; dump.Entry( "EntityInstance" ) << (int)m_data[9] << ";\n"; dump.Entry( "InitScanning" ) << Bit( m_data[10], 6 ) << ";\n"; dump.Entry( "InitEvents" ) << Bit( m_data[10], 5 ) << ";\n"; dump.Entry( "InitThresholds" ) << Bit( m_data[10], 4 ) << ";\n"; dump.Entry( "InitHysteresis" ) << Bit( m_data[10], 3 ) << ";\n"; dump.Entry( "InitSensorType" ) << Bit( m_data[10], 2 ) << ";\n"; dump.Entry( "SensorInitPuEvents" ) << Bit( m_data[10], 1 ) << ";\n"; dump.Entry( "SensorInitPuScanning" ) << Bit( m_data[10], 0 ) << ";\n"; dump.Entry( "IgnoreIfNoEntity" ) << Bit( m_data[11], 7 ) << ";\n"; dump.Entry( "SupportsAutoRearm" ) << Bit( m_data[11], 6 ) << ";\n"; tIpmiHysteresisSupport hs = (tIpmiHysteresisSupport)((m_data[11] >> 4) & 3); dump.Entry( "HysteresisSupport" ) << IpmiHysteresisSupportToString( hs ) << ";\n"; tIpmiThresholdAccessSuport ts = (tIpmiThresholdAccessSuport)((m_data[11] >> 2) & 3); dump.Entry( "ThresholdAccess" ) << IpmiThresholdAccessSupportToString( ts ) << ";\n"; tIpmiEventSupport es = (tIpmiEventSupport)(m_data[11] & 3); dump.Entry( "EventSupport" ) << IpmiEventSupportToString( es ) << ";\n"; tIpmiSensorType sensor_type = (tIpmiSensorType)m_data[12]; if ( !strcmp( IpmiSensorTypeToString( sensor_type ), "Invalid" ) ) snprintf( str, sizeof(str), "0x%02x", sensor_type ); else snprintf( str, sizeof(str), "%s", IpmiSensorTypeToString( sensor_type ) ); dump.Entry( "SensorType" ) << str << ";\n"; tIpmiEventReadingType reading_type = (tIpmiEventReadingType)m_data[13]; if ( !strcmp( IpmiEventReadingTypeToString( reading_type ), "Invalid" ) ) snprintf( str, sizeof(str), "0x%02x", reading_type ); else snprintf( str, sizeof(str), "%s", IpmiEventReadingTypeToString( reading_type ) ); dump.Entry( "EventReadingType" ) << str << ";\n"; if ( reading_type == eIpmiEventReadingTypeThreshold ) { // assertion unsigned short em = IpmiGetUint16( m_data + 14 ); IpmiThresholdEventMaskToString( em, str ); if ( str[0] == 0 ) strcat( str, "0" ); dump.Entry( "AssertionEventMask" ) << str << ";\n"; snprintf( str, sizeof(str), "0x%04x", em >> 12 ); dump.Entry( "LowerThresholdReadingMask" ) << str << ";\n"; // deassertion em = IpmiGetUint16( m_data + 16 ); IpmiThresholdEventMaskToString( em, str ); if ( str[0] == 0 ) strcat( str, "0" ); dump.Entry( "DeassertionEventMask" ) << str << ";\n"; snprintf( str, sizeof(str), "0x%04x", em >> 12 ); dump.Entry( "UpperThresholdReadingMask" ) << str << ";\n"; // settable threshold em = IpmiGetUint16( m_data + 18 ); IpmiThresholdMaskToString( em >> 8, str ); if ( str[0] == 0 ) strcat( str, "0" ); dump.Entry( "SettableThresholdsMask" ) << str << ";\n"; IpmiThresholdMaskToString( em & 0xff, str ); if ( str[0] == 0 ) strcat( str, "0" ); dump.Entry( "ReadableThresholdsMask" ) << str << ";\n"; tIpmiRateUnit ru = (tIpmiRateUnit)((m_data[20] >> 3) & 7); dump.Entry( "RateUnit" ) << IpmiRateUnitToString( ru ) << ";\n"; tIpmiModifierUnit mu = (tIpmiModifierUnit)( (m_data[20] >> 1) & 3); dump.Entry( "ModifierUnit" ) << IpmiModifierUnitToString( mu ) << ";\n"; dump.Entry( "Percentage" ) << ((m_data[20] & 1) == 1) << ";\n"; dump.Entry( "BaseUnit" ) << IpmiUnitTypeToString( (tIpmiUnitType)m_data[21] ) << ";\n"; dump.Entry( "ModifierUnit2" ) << IpmiUnitTypeToString( (tIpmiUnitType)m_data[22] ) << ";\n"; cIpmiSensorFactors sf; sf.GetDataFromSdr( this ); dump.Entry( "AnalogDataFormat" ) << IpmiAnalogeDataFormatToString( sf.AnalogDataFormat() ) << ";\n"; dump.Entry( "Linearization" ) << IpmiLinearizationToString( sf.Linearization() ) << ";\n"; dump.Entry( "M" ) << sf.M() << ";\n"; dump.Entry( "Tolerance" ) << sf.Tolerance() << ";\n"; dump.Entry( "B" ) << sf.B() << ";\n"; dump.Entry( "Accuracy" ) << sf.Accuracy() << ";\n"; dump.Entry( "AccuracyExp" ) << sf.AccuracyExp() << ";\n"; dump.Entry( "RExp" ) << sf.RExp() << ";\n"; dump.Entry( "BExp" ) << sf.BExp() << ";\n"; bool v = m_data[30] & 1; dump.Entry( "NominalReadingSpecified" ) << v << ";\n"; if ( v ) dump.Entry( "NominalReading" ) << m_data[31] << ";\n"; v = m_data[30] & 2; dump.Entry( "NormalMaxSpecified" ) << v << ";\n"; if ( v ) dump.Entry( "NormalMax" ) << m_data[32] << ";\n"; v = m_data[30] & 4; dump.Entry( "NormalMinSpecified" ) << v << ";\n"; if ( v ) dump.Entry( "NormalMin" ) << m_data[33] << ";\n"; dump.Entry( "SensorMax" ) << m_data[34] << ";\n"; dump.Entry( "SensorMin" ) << m_data[35] << ";\n"; dump.Entry( "UpperNonRecoverableThreshold" ) << m_data[36] << ";\n"; dump.Entry( "UpperCriticalThreshold" ) << m_data[37] << ";\n"; dump.Entry( "UpperNonCriticalThreshold" ) << m_data[38] << ";\n"; dump.Entry( "LowerNonRecoverableThreshold" ) << m_data[39] << ";\n"; dump.Entry( "LowerCriticalThreshold" ) << m_data[40] << ";\n"; dump.Entry( "LowerNonCriticalThreshold" ) << m_data[41] << ";\n"; dump.Entry( "PositiveGoingThresholdHysteresis" ) << m_data[42] << ";\n"; dump.Entry( "NegativeGoingThresholdHysteresis" ) << m_data[43] << ";\n"; } else { // assertion unsigned short em = IpmiGetUint16( m_data + 14 ); dump.Hex( true ); dump.Entry( "AssertionEventMask" ) << em << ";\n"; // deassertion em = IpmiGetUint16( m_data + 16 ); dump.Entry( "DeassertionEventMask" ) << em << ";\n"; // event mask em = IpmiGetUint16( m_data + 18 ); dump.Entry( "DiscreteReadingMask" ) << em << ";\n"; dump.Hex( false ); } dump.Entry( "Oem" ) << m_data[46] << ";\n"; cIpmiTextBuffer tb; tb.SetIpmi( m_data + 47 ); tb.GetAscii( str, 80 ); dump.Entry( "Id" ) << "\"" << str << "\";\n"; } void cIpmiSdr::DumpFruDeviceLocator( cIpmiLog &dump ) const { dump.Entry( "DeviceAccessAddress" ) << m_data[5] << ";\n"; if ( m_data[7] & 0x80 ) { // logical FRU device dump.Entry( "FruDeviceId" ) << (int)m_data[6] << ";\n"; } else { // device is directly on IPMB dump.Entry( "SlaveAddress" ) << m_data[6] << ";\n"; dump.Entry( "Lun" ) << (int)((m_data[7] >> 3) & 3) << ";\n"; } dump.Entry( "LogicalDevice" ) << Bit(m_data[7], 7 ) << ";\n"; dump.Entry( "Channel" ) << (int)(m_data[8] >> 4) << ";\n"; dump.Entry( "DeviceType" ) << m_data[10] << ";\n"; dump.Entry( "DeviceTypeModifier" ) << m_data[11] << ";\n"; tIpmiEntityId id = (tIpmiEntityId)m_data[12]; char str[80]; if ( !strcmp( IpmiEntityIdToString( id ), "Invalid" ) ) snprintf( str, sizeof(str), "0x%02x", id ); else snprintf( str, sizeof(str), "%s", IpmiEntityIdToString( id ) ); dump.Entry( "EntityId" ) << str << ";\n"; dump.Entry( "EntityInstance" ) << (int)m_data[13] << ";\n"; dump.Entry( "Oem" ) << m_data[14] << ";\n"; cIpmiTextBuffer tb; tb.SetIpmi( m_data + 15 ); tb.GetAscii( str, 80 ); dump.Entry( "Id" ) << "\"" << str << "\";\n"; } void cIpmiSdr::DumpMcDeviceLocator( cIpmiLog &dump ) const { dump.Entry( "SlaveAddress" ) << m_data[5] << ";\n"; dump.Entry( "Channel" ) << (int)(m_data[6] & 0x0f) << ";\n"; dump.Entry( "AcpiSystemPower" ) << Bit( m_data[7], 7 ) << ";\n"; dump.Entry( "AcpiDevicePower" ) << Bit( m_data[7], 6 ) << ";\n"; dump.Entry( "ControllerLogInitAgentErrors" ) << Bit( m_data[7], 3 ) << ";\n"; dump.Entry( "LogInitializationAgentError" ) << Bit( m_data[7], 2 ) << ";\n"; dump.Entry( "EventMessageGeneration" ) << ( m_data[7] & 3 ) << ";\n"; dump.Entry( "ChassisSupport" ) << Bit( m_data[8], 7 ) << ";\n"; dump.Entry( "BridgeSupport" ) << Bit( m_data[8], 6 ) << ";\n"; dump.Entry( "IpmbEventGeneratorSupport" ) << Bit( m_data[8], 5 ) << ";\n"; dump.Entry( "IpmbEventReceiverSupport" ) << Bit( m_data[8], 4 ) << ";\n"; dump.Entry( "FruInventorySupport" ) << Bit( m_data[8], 3 ) << ";\n"; dump.Entry( "SelDeviceSupport" ) << Bit( m_data[8], 2 ) << ";\n"; dump.Entry( "SdrRepositorySupport" ) << Bit( m_data[8], 1 ) << ";\n"; dump.Entry( "SensorDeviceSupport" ) << Bit( m_data[8], 0 ) << ";\n"; tIpmiEntityId id = (tIpmiEntityId)m_data[12]; char str[80]; if ( !strcmp( IpmiEntityIdToString( id ), "Invalid" ) ) snprintf( str, sizeof(str), "0x%02x", id ); else snprintf( str, sizeof(str), "%s", IpmiEntityIdToString( id ) ); dump.Entry( "EntityId" ) << str << ";\n"; dump.Entry( "EntityInstance" ) << (int)m_data[13] << ";\n"; dump.Entry( "Oem" ) << m_data[14] << ";\n"; cIpmiTextBuffer tb; tb.SetIpmi( m_data + 15 ); tb.GetAscii( str, 80 ); dump.Entry( "Id" ) << "\"" << str << "\";\n"; } void cIpmiSdr::Dump( cIpmiLog &dump, const char *name ) const { char str[80]; snprintf( str, sizeof(str), "%sRecord", IpmiSdrTypeToName( m_type ) ); dump.Begin( str, name ); dump.Entry( "Type" ) << IpmiSdrTypeToName( m_type ) << "\n"; dump.Entry( "RecordId" ) << m_record_id << ";\n"; dump.Entry( "Version" ) << (int)m_major_version << ", " << (int)m_minor_version << ";\n"; switch( m_type ) { case eSdrTypeFullSensorRecord: DumpFullSensor( dump ); break; case eSdrTypeFruDeviceLocatorRecord: DumpFruDeviceLocator( dump ); break; case eSdrTypeMcDeviceLocatorRecord: DumpMcDeviceLocator( dump ); break; default: dump.Entry( "SDR Type " ) << m_type << ";\n"; break; } dump.End(); } static void IpmiSdrDestroyRecords( cIpmiSdr **&sdr, unsigned int &n ) { if ( sdr == 0 ) return; for( unsigned int i = 0; i < n; i++ ) { assert( sdr[i] ); delete sdr[i]; } delete [] sdr; n = 0; sdr = 0; } cIpmiSdrs::cIpmiSdrs( cIpmiMc *mc, bool device_sdr ) : m_mc( mc ), m_device_sdr( device_sdr ), m_fetched( false ), m_major_version( 0 ), m_minor_version( 0 ), m_last_addition_timestamp( 0 ), m_last_erase_timestamp( 0 ), m_overflow( 0 ), m_update_mode( eIpmiRepositorySdrUpdateUnspecified ), m_supports_delete_sdr( false ), m_supports_partial_add_sdr( false ), m_supports_reserve_sdr( false ), m_supports_get_sdr_repository_allocation( false ), m_reservation( 0 ), m_sdr_changed( false ), m_num_sdrs( 0 ), m_sdrs( 0 ) { for( int i = 0; i < 4; i++ ) m_lun_has_sensors[i] = false; } cIpmiSdrs::~cIpmiSdrs() { if ( m_sdrs ) IpmiSdrDestroyRecords( m_sdrs, m_num_sdrs ); } cIpmiSdr * cIpmiSdrs::ReadRecord( unsigned short record_id, unsigned short &next_record_id, tReadRecord &err, unsigned int lun ) { cIpmiMsg msg; cIpmiMsg rsp; SaErrorT rv; int offset = 0; unsigned char data[dMaxSdrData]; int record_size = 0; int read_len = 0; cIpmiSdr *sdr; memset( data, 0xaa, dMaxSdrData ); do { if ( m_device_sdr ) { msg.m_netfn = eIpmiNetfnSensorEvent; msg.m_cmd = eIpmiCmdGetDeviceSdr; } else { msg.m_netfn = eIpmiNetfnStorage; msg.m_cmd = eIpmiCmdGetSdr; } msg.m_data_len = 6; IpmiSetUint16( msg.m_data, m_reservation ); IpmiSetUint16( msg.m_data + 2, record_id ); msg.m_data[4] = offset; if ( offset == 0 ) read_len = dSdrHeaderSize; else { read_len = record_size - offset; if ( read_len > dMaxSdrFetch ) read_len = dMaxSdrFetch; } msg.m_data[5] = read_len; rv = m_mc->SendCommand( msg, rsp, lun ); if ( rv != SA_OK ) { stdlog << "initial_sdr_fetch: Couldn't send GetSdr or GetDeviveSdr fetch: " << rv << " !\n"; err = eReadError; return 0; } if ( rsp.m_data[0] == 0x80 ) { // Data changed during fetch, retry. Only do this so many // times before giving up. stdlog << "SDR reservation lost 1.\n"; err = eReadReservationLost; return 0; } if ( rsp.m_data[0] == eIpmiCcInvalidReservation ) { stdlog << "SDR reservation lost 2.\n"; err = eReadReservationLost; return 0; } if ( record_id == 0 && ( (rsp.m_data[0] == eIpmiCcUnknownErr ) || (rsp.m_data[0] == eIpmiCcNotPresent ) ) ) { // We got an error fetching the first SDR, so the repository is // probably empty. Just go on. stdlog << "SDR reservation lost 3.\n"; err = eReadEndOfSdr; return 0; } if ( rsp.m_data[0] != eIpmiCcOk ) { stdlog << "SDR fetch error getting sdr " << record_id << ": " << rsp.m_data[0] << " !\n"; err = eReadError; return 0; } if ( rsp.m_data_len != read_len + 3 ) { stdlog << "Got an invalid amount of SDR data: " << rsp.m_data_len << ", expected " << read_len + 3 << " !\n"; err = eReadError; return 0; } // copy the data memcpy( data + offset, rsp.m_data + 3, read_len ); // header => get record size if ( offset == 0 ) { record_size = rsp.m_data[7] + dSdrHeaderSize; next_record_id = IpmiGetUint16( rsp.m_data + 1 ); } offset += read_len; } while( offset < record_size ); // create sdr sdr = new cIpmiSdr; memset( sdr, 0, sizeof( cIpmiSdr )); sdr->m_record_id = IpmiGetUint16( data ); sdr->m_major_version = data[2] & 0xf; sdr->m_minor_version = (data[2] >> 4) & 0xf; sdr->m_type = (tIpmiSdrType)data[3]; // Hack to support 1.0 MCs if ( (sdr->m_major_version == 1) && (sdr->m_minor_version == 0) && (sdr->m_type == eSdrTypeMcDeviceLocatorRecord)) { data[8] = data[7]; data[7] = data[6]; data[6] = 0; } sdr->m_length = record_size; memcpy( sdr->m_data, data, record_size ); err = eReadOk; return sdr; } SaErrorT cIpmiSdrs::Reserve(unsigned int lun) { cIpmiMsg msg; cIpmiMsg rsp; SaErrorT rv; if ( !m_supports_reserve_sdr ) { stdlog << "cIpmiSdrs::Reserve: Reserve SDR not supported\n"; return SA_ERR_HPI_INTERNAL_ERROR; } // Now get the reservation. if ( m_device_sdr ) { msg.m_netfn = eIpmiNetfnSensorEvent; msg.m_cmd = eIpmiCmdReserveDeviceSdrRepository; } else { msg.m_netfn = eIpmiNetfnStorage; msg.m_cmd = eIpmiCmdReserveSdrRepository; } msg.m_data_len = 0; rv = m_mc->SendCommand( msg, rsp, lun ); if ( rv != SA_OK ) { stdlog << "Couldn't send SDR reservation: " << rv << " !\n"; return rv; } if ( rsp.m_data[0] != 0) { if ( m_device_sdr && rsp.m_data[0] == eIpmiCcInvalidCmd ) { // This is a special case. We always attempt a // reservation with a device SDR (since there is nothing // telling us if this is supported), if it fails then we // just go on without the reservation. m_supports_reserve_sdr = false; m_reservation = 0; return SA_OK; } stdlog << "Error getting SDR fetch reservation: " << rsp.m_data[0] << " !\n"; return SA_ERR_HPI_INVALID_PARAMS; } if ( rsp.m_data_len < 3 ) { stdlog << "SDR Reservation data not long enough: " << rsp.m_data_len << " bytes!\n"; return SA_ERR_HPI_INVALID_DATA; } m_reservation = IpmiGetUint16( rsp.m_data + 1 ); return SA_OK; } SaErrorT cIpmiSdrs::GetInfo( unsigned short &working_num_sdrs ) { SaErrorT rv; cIpmiMsg msg; cIpmiMsg rsp; unsigned int add_timestamp; unsigned int erase_timestamp; // sdr info if ( m_device_sdr ) { msg.m_netfn = eIpmiNetfnSensorEvent; msg.m_cmd = eIpmiCmdGetDeviceSdrInfo; } else { msg.m_netfn = eIpmiNetfnStorage; msg.m_cmd = eIpmiCmdGetSdrRepositoryInfo; } msg.m_data_len = 0; rv = m_mc->SendCommand( msg, rsp ); if ( rv != SA_OK ) { stdlog << "IpmiSdrsFetch: GetDeviceSdrInfoCmd or GetSdrRepositoryInfoCmd " << rv << ", " << strerror( rv ) << " !\n"; m_sdr_changed = true; IpmiSdrDestroyRecords( m_sdrs, m_num_sdrs ); return rv; } if ( rsp.m_data[0] != 0 ) { if ( m_device_sdr == false ) { // The device doesn't support the get device SDR info // command, so just assume some defaults. working_num_sdrs = 0xfffe; m_dynamic_population = false; // Assume it uses reservations, if the reservation returns // an error, then say that it doesn't. m_supports_reserve_sdr = true; m_lun_has_sensors[0] = true; m_lun_has_sensors[1] = false; m_lun_has_sensors[2] = false; m_lun_has_sensors[3] = false; add_timestamp = 0; erase_timestamp = 0; } else { stdlog << "IPMI Error getting SDR info: " << rsp.m_data[0] << " !\n"; m_sdr_changed = true; IpmiSdrDestroyRecords( m_sdrs, m_num_sdrs ); return SA_ERR_HPI_INVALID_PARAMS; } } else if ( m_device_sdr ) { // device SDR if ( rsp.m_data_len < 3 ) { stdlog << "SDR info is not long enough !\n"; m_sdr_changed = true; IpmiSdrDestroyRecords( m_sdrs, m_num_sdrs ); return SA_ERR_HPI_INVALID_DATA; } working_num_sdrs = rsp.m_data[1]; m_dynamic_population = (rsp.m_data[2] & 0x80) == 0x80; // Assume it uses reservations, if the reservation returns // an error, then say that it doesn't. m_supports_reserve_sdr = true; m_lun_has_sensors[0] = (rsp.m_data[2] & 0x01) == 0x01; m_lun_has_sensors[1] = (rsp.m_data[2] & 0x02) == 0x02; m_lun_has_sensors[2] = (rsp.m_data[2] & 0x04) == 0x04; m_lun_has_sensors[3] = (rsp.m_data[2] & 0x08) == 0x08; if ( m_dynamic_population ) { if ( rsp.m_data_len < 7 ) { stdlog << "SDR info is not long enough !\n"; m_sdr_changed = 1; IpmiSdrDestroyRecords( m_sdrs, m_num_sdrs ); return SA_ERR_HPI_INVALID_DATA; } add_timestamp = IpmiGetUint32( rsp.m_data + 3 ); } else add_timestamp = 0; erase_timestamp = 0; } else { // repository SDR if ( rsp.m_data_len < 15 ) { stdlog << "SDR info is not long enough\n"; m_sdr_changed = true; IpmiSdrDestroyRecords( m_sdrs, m_num_sdrs ); return SA_ERR_HPI_INVALID_DATA; } /* Pull pertinant info from the response. */ m_major_version = rsp.m_data[1] & 0xf; m_minor_version = (rsp.m_data[1] >> 4) & 0xf; working_num_sdrs = IpmiGetUint16( rsp.m_data + 2 ); m_overflow = (rsp.m_data[14] & 0x80) == 0x80; m_update_mode = (tIpmiRepositorySdrUpdate)((rsp.m_data[14] >> 5) & 0x3); m_supports_delete_sdr = (rsp.m_data[14] & 0x08) == 0x08; m_supports_partial_add_sdr = (rsp.m_data[14] & 0x04) == 0x04; m_supports_reserve_sdr = (rsp.m_data[14] & 0x02) == 0x02; m_supports_get_sdr_repository_allocation = (rsp.m_data[14] & 0x01) == 0x01; add_timestamp = IpmiGetUint32( rsp.m_data + 6 ); erase_timestamp = IpmiGetUint32( rsp.m_data + 10 ); } // If the timestamps still match, no need to re-fetch the repository if ( m_fetched && ( add_timestamp == m_last_addition_timestamp ) && ( erase_timestamp == m_last_erase_timestamp ) ) return -1; m_last_addition_timestamp = add_timestamp; m_last_erase_timestamp = erase_timestamp; return SA_OK; } SaErrorT cIpmiSdrs::ReadRecords( cIpmiSdr **&records, unsigned short &working_num_sdrs, unsigned int &num, unsigned int lun ) { int retry_count = 0; bool loop = true; unsigned short save_working = working_num_sdrs; unsigned int save_num = num; struct timespec ts; ts.tv_sec = 0; ts.tv_nsec = 0; while( loop ) { unsigned short next_record_id = 0; working_num_sdrs = save_working; num = save_num; if ( retry_count++ == dMaxSdrFetchRetries ) { stdlog << "Too many retries trying to fetch SDRs\n"; return SA_ERR_HPI_BUSY; } SaErrorT rv = Reserve(lun); if ( rv ) return rv; // read sdr records while( 1 ) { tReadRecord err; unsigned short record_id = next_record_id; cIpmiSdr *sdr = ReadRecord( record_id, next_record_id, err, lun ); if ( sdr == 0 ) { if ( err == eReadReservationLost ) { stdlog << "MC " << (unsigned char)m_mc->GetAddress() << " Lost SDR reservation " << retry_count << " - sleeping\n"; // Most likely the Shelf Manager is trying to access the device SDR too // Give him a break and wait till it's done ts.tv_sec = 5+2*retry_count; nanosleep(&ts, NULL); break; } if ( err != eReadEndOfSdr ) return SA_ERR_HPI_BUSY; // SDR is empty loop = false; break; } GList *list = 0; if ( sdr->m_type == eSdrTypeCompactSensorRecord ) { // convert compact sensor record to full sensor records list = CreateFullSensorRecords( sdr ); delete sdr; } else list = g_list_append( 0, sdr ); while( list ) { sdr = (cIpmiSdr *)list->data; list = g_list_remove( list, sdr ); sdr->Dump( stdlog, "sdr" ); if ( num >= working_num_sdrs ) { // resize records cIpmiSdr **rec = new cIpmiSdr*[ working_num_sdrs + 10 ]; memcpy( rec, records, sizeof( cIpmiSdr * ) * working_num_sdrs ); delete [] records; records = rec; working_num_sdrs += 10; } records[num++] = sdr; } if ( next_record_id == 0xffff ) { // finish loop = false; break; } } } return SA_OK; } GList * cIpmiSdrs::CreateFullSensorRecords( cIpmiSdr *sdr ) { int n = 1; if ( sdr->m_data[23] & 0x0f ) n = sdr->m_data[23] & 0x0f; GList *list = 0; for( int i = 0; i < n; i++ ) { cIpmiSdr *s = new cIpmiSdr; *s = *sdr; s->m_type = eSdrTypeFullSensorRecord; memset( s->m_data + 23, 0, dMaxSdrData - 23 ); // sensor num s->m_data[7] = sdr->m_data[7] + i; // entity instance if ( sdr->m_data[24] & 0x80 ) s->m_data[9] = sdr->m_data[9] + i; // positive-going threshold hysteresis value s->m_data[42] = sdr->m_data[25]; // negativ-going threshold hysteresis value s->m_data[43] = sdr->m_data[26]; // oem s->m_data[46] = sdr->m_data[30]; // id int len = sdr->m_data[31] & 0x3f; int val = (sdr->m_data[24] & 0x7f) + i; memcpy( s->m_data + 47, sdr->m_data + 31, len + 1 ); if (n > 1) { int base = 0; int start = 0; if (( sdr->m_data[23] & 0x30 ) == 0 ) { // numeric base = 10; start = '0'; } else if (( sdr->m_data[23] & 0x30 ) == 0x10 ) { // alpha base = 26; start = 'A'; } if ( base ) { // add id string postfix if ( val / base > 0 ) { s->m_data[48+len] = (val / base) + start; len++; } s->m_data[48+len] = (val % base) + start; len++; s->m_data[48+len] = 0; s->m_data[47] = (sdr->m_data[31] & 0xc0) | len; } } list = g_list_append( list, s ); } return list; } SaErrorT cIpmiSdrs::Fetch() { SaErrorT rv; cIpmiSdr **records; unsigned short working_num_sdrs; m_sdr_changed = false; assert( m_mc ); if ( m_device_sdr ) { m_device_sdr = m_mc->ProvidesDeviceSdrs(); /* added ARCress 09/21/06 */ // if ( !m_mc->ProvidesDeviceSdrs() ) return SA_ERR_HPI_NOT_PRESENT; } else if ( !m_mc->SdrRepositorySupport() ) return SA_ERR_HPI_NOT_PRESENT; // working num sdrs is just an estimation rv = GetInfo( working_num_sdrs ); // sdr records are up to date if ( rv == -1 ) return SA_OK; if ( rv ) return rv; m_sdr_changed = true; IpmiSdrDestroyRecords( m_sdrs, m_num_sdrs ); // because working_num_sdrs is an estimation // read the sdr to get the real number if ( working_num_sdrs == 0 ) working_num_sdrs = 1; // read sdr unsigned int num = 0; records = new cIpmiSdr *[working_num_sdrs]; rv = SA_OK; if ( m_device_sdr ) { for( unsigned int i = 0; rv == SA_OK && i < 4; i++ ) if ( m_lun_has_sensors[i] ) rv = ReadRecords( records, working_num_sdrs, num, i ); } else rv = ReadRecords( records, working_num_sdrs, num, 0 ); if ( rv != SA_OK ) { IpmiSdrDestroyRecords( records, num ); return rv; } if ( num == 0 ) { delete [] records; m_sdrs = 0; m_num_sdrs = 0; return SA_OK; } if ( num == working_num_sdrs ) { m_sdrs = records; m_num_sdrs = working_num_sdrs; return SA_OK; } m_sdrs = new cIpmiSdr *[num]; memcpy( m_sdrs, records, num * sizeof( cIpmiSdr * ) ); m_num_sdrs = num; delete [] records; return SA_OK; } void cIpmiSdrs::Dump( cIpmiLog &dump, const char *name ) const { unsigned int i; char str[80]; if ( dump.IsRecursive() ) { for( i = 0; i < m_num_sdrs; i++ ) { snprintf( str, sizeof(str), "Sdr%02x_%d", m_mc->GetAddress(), i ); m_sdrs[i]->Dump( dump, str ); } } dump.Begin( "Sdr", name ); if ( m_device_sdr ) { dump.Entry( "DynamicPopulation" ) << m_dynamic_population << ";\n"; dump.Entry( "LunHasSensors" ) << m_lun_has_sensors[0] << ", " << m_lun_has_sensors[1] << ", " << m_lun_has_sensors[2] << ", " << m_lun_has_sensors[3] << ";\n"; } else { dump.Entry( "Version" ) << m_major_version << ", " << m_minor_version << ";\n"; dump.Entry( "Overflow" ) << m_overflow << ";\n"; dump.Entry( "UpdateMode" ) << "dMainSdrUpdate" << IpmiRepositorySdrUpdateToString( m_update_mode ) << ";\n"; dump.Entry( "SupportsDeleteSdr" ) << m_supports_delete_sdr << ";\n"; dump.Entry( "SupportsPartialAddSdr" ) << m_supports_partial_add_sdr << ";\n"; dump.Entry( "SupportsReserveSdr" ) << m_supports_reserve_sdr << ";\n"; dump.Entry( "SupportsGetSdrRepositoryAllocation" ) << m_supports_get_sdr_repository_allocation << ";\n"; } if ( dump.IsRecursive() && m_num_sdrs ) { dump.Entry( "Sdr" ); for( i = 0; i < m_num_sdrs; i++ ) { if ( i != 0 ) dump << ", "; snprintf( str, sizeof(str), "Sdr%02x_%d", m_mc->GetAddress(), i ); dump << str; } dump << ";\n"; } dump.End(); } cIpmiSdr * cIpmiSdrs::FindSdr( cIpmiMc *mc ) { for( unsigned int i = 0; i < NumSdrs(); i++ ) { cIpmiSdr *sdr = Sdr( i ); if ( sdr->m_type != eSdrTypeMcDeviceLocatorRecord ) continue; if ( mc->GetAddress() == (unsigned int)sdr->m_data[5] && mc->GetChannel() == (unsigned int)(sdr->m_data[6] & 0x0f) ) return sdr; } return 0; } // Here we try to find the FRU that is the "parent" // of the entity this SDR is attached to // The algorithm here is *not* sophisticated at all // The assumption is that most of the SDR will be attached // directly to a FRU so it was optimized for this case // Also only one level of parenthood is assumed - sorry Grand Pa ! unsigned int cIpmiSdrs::FindParentFru( SaHpiEntityTypeT type, SaHpiEntityLocationT instance, SaHpiEntityTypeT & parent_type, SaHpiEntityLocationT & parent_instance ) { SaHpiEntityTypeT mc_type = SAHPI_ENT_UNSPECIFIED; SaHpiEntityLocationT mc_instance = 0; parent_type = SAHPI_ENT_UNSPECIFIED; parent_instance = 0; // First look for FRUs themselves for( unsigned int i = 0; i < NumSdrs(); i++ ) { cIpmiSdr *sdr = Sdr( i ); if ( sdr->m_type == eSdrTypeMcDeviceLocatorRecord ) { mc_type = (SaHpiEntityTypeT)sdr->m_data[12]; mc_instance = (SaHpiEntityLocationT)sdr->m_data[13]; if ( ( type != (SaHpiEntityTypeT)sdr->m_data[12] ) || ( instance != (SaHpiEntityLocationT)sdr->m_data[13] ) ) continue; parent_type = type; parent_instance = instance; return 0; } else if ( sdr->m_type == eSdrTypeFruDeviceLocatorRecord ) { if ( (( sdr->m_data[7] & 0x80) == 0 ) || ( type != (SaHpiEntityTypeT)sdr->m_data[12] ) || ( instance != (SaHpiEntityLocationT)sdr->m_data[13] ) ) continue; parent_type = type; parent_instance = instance; return sdr->m_data[6]; } } stdlog << "Entity ID " << type << ", Instance " << instance << " is not a FRU\n"; // SDR entity is not a FRU: look for association records for( unsigned int i = 0; i < NumSdrs(); i++ ) { cIpmiSdr *sdr = Sdr( i ); if ( sdr->m_type == eSdrTypeEntityAssociationRecord ) { // Entity range if ( sdr->m_data[7] & 0x80 ) { if (( type == (SaHpiEntityTypeT)sdr->m_data[8] ) && ( type == (SaHpiEntityTypeT)sdr->m_data[10] ) && ( ( instance >= (SaHpiEntityLocationT)sdr->m_data[9] ) && ( instance <= (SaHpiEntityLocationT)sdr->m_data[11] ))) { parent_type = (SaHpiEntityTypeT)sdr->m_data[5]; parent_instance = (SaHpiEntityLocationT)sdr->m_data[6]; break; } if (( type == (SaHpiEntityTypeT)sdr->m_data[12] ) && ( type == (SaHpiEntityTypeT)sdr->m_data[14] ) && ( ( instance >= (SaHpiEntityLocationT)sdr->m_data[13] ) && ( instance <= (SaHpiEntityLocationT)sdr->m_data[15] ))) { parent_type = (SaHpiEntityTypeT)sdr->m_data[5]; parent_instance = (SaHpiEntityLocationT)sdr->m_data[6]; break; } } // Entity list else { if (( type == (SaHpiEntityTypeT)sdr->m_data[8] ) && ( instance == (SaHpiEntityLocationT)sdr->m_data[9] )) { parent_type = (SaHpiEntityTypeT)sdr->m_data[5]; parent_instance = (SaHpiEntityLocationT)sdr->m_data[6]; break; } if (( type == (SaHpiEntityTypeT)sdr->m_data[10] ) && ( instance == (SaHpiEntityLocationT)sdr->m_data[11] )) { parent_type = (SaHpiEntityTypeT)sdr->m_data[5]; parent_instance = (SaHpiEntityLocationT)sdr->m_data[6]; break; } if (( type == (SaHpiEntityTypeT)sdr->m_data[12] ) && ( instance == (SaHpiEntityLocationT)sdr->m_data[13] )) { parent_type = (SaHpiEntityTypeT)sdr->m_data[5]; parent_instance = (SaHpiEntityLocationT)sdr->m_data[6]; break; } if (( type == (SaHpiEntityTypeT)sdr->m_data[14] ) && ( instance == (SaHpiEntityLocationT)sdr->m_data[15] )) { parent_type = (SaHpiEntityTypeT)sdr->m_data[5]; parent_instance = (SaHpiEntityLocationT)sdr->m_data[6]; break; } } } else if ( sdr->m_type == eSdrTypeDeviceRelativeEntityAssociationRecord ) { // Entity range if ( sdr->m_data[9] & 0x80 ) { if (( type == (SaHpiEntityTypeT)sdr->m_data[12] ) && ( type == (SaHpiEntityTypeT)sdr->m_data[16] ) && ( ( instance >= (SaHpiEntityLocationT)sdr->m_data[13] ) && ( instance <= (SaHpiEntityLocationT)sdr->m_data[17] ))) { parent_type = (SaHpiEntityTypeT)sdr->m_data[5]; parent_instance = (SaHpiEntityLocationT)sdr->m_data[6]; break; } if (( type == (SaHpiEntityTypeT)sdr->m_data[20] ) && ( type == (SaHpiEntityTypeT)sdr->m_data[24] ) && ( ( instance >= (SaHpiEntityLocationT)sdr->m_data[21] ) && ( instance <= (SaHpiEntityLocationT)sdr->m_data[25] ))) { parent_type = (SaHpiEntityTypeT)sdr->m_data[5]; parent_instance = (SaHpiEntityLocationT)sdr->m_data[6]; break; } } // Entity list else { if (( type == (SaHpiEntityTypeT)sdr->m_data[12] ) && ( instance == (SaHpiEntityLocationT)sdr->m_data[13] )) { parent_type = (SaHpiEntityTypeT)sdr->m_data[5]; parent_instance = (SaHpiEntityLocationT)sdr->m_data[6]; break; } if (( type == (SaHpiEntityTypeT)sdr->m_data[16] ) && ( instance == (SaHpiEntityLocationT)sdr->m_data[17] )) { parent_type = (SaHpiEntityTypeT)sdr->m_data[5]; parent_instance = (SaHpiEntityLocationT)sdr->m_data[6]; break; } if (( type == (SaHpiEntityTypeT)sdr->m_data[20] ) && ( instance == (SaHpiEntityLocationT)sdr->m_data[21] )) { parent_type = (SaHpiEntityTypeT)sdr->m_data[5]; parent_instance = (SaHpiEntityLocationT)sdr->m_data[6]; break; } if (( type == (SaHpiEntityTypeT)sdr->m_data[24] ) && ( instance == (SaHpiEntityLocationT)sdr->m_data[25] )) { parent_type = (SaHpiEntityTypeT)sdr->m_data[5]; parent_instance = (SaHpiEntityLocationT)sdr->m_data[6]; break; } } } } // Didn't find proper association record if ( parent_type == SAHPI_ENT_UNSPECIFIED ) { stdlog << "WARNING : Entity ID " << type << ", Instance " << instance << " did not find parent FRU\n"; stdlog << "WARNING : Defaulting to FRU 0, Entity ID " << mc_type << ", Instance " << mc_instance << "\n"; // We didn't find an exact match // Since a lot of ATCA boards have wrong SDRs // we default the parent to the MC itself parent_type = mc_type; parent_instance = mc_instance; return 0; } stdlog << "Entity ID " << type << ", Instance " << instance << " parent ID " << parent_type << ", Instance " << parent_instance << "\n"; // We found the parent now we want its FRU number // We already have MC == FRU #0 data if (( parent_type == mc_type ) && ( parent_instance == mc_instance )) return 0; // Now look for FRUs other than #0 for( unsigned int i = 0; i < NumSdrs(); i++ ) { cIpmiSdr *sdr = Sdr( i ); if ( sdr->m_type == eSdrTypeFruDeviceLocatorRecord ) { if ( (( sdr->m_data[7] & 0x80) == 0 ) || ( parent_type != (SaHpiEntityTypeT)sdr->m_data[12] ) || ( parent_instance != (SaHpiEntityLocationT)sdr->m_data[13] ) ) continue; return sdr->m_data[6]; } } stdlog << "WARNING : Entity ID " << type << ", Instance " << instance << " did not find parent FRU\n"; stdlog << "WARNING : Defaulting to FRU 0, Entity ID " << mc_type << ", Instance " << mc_instance << "\n"; // We didn't find an exact match // Since a lot of ATCA boards have wrong SDRs // we default the parent to the MC itself parent_type = mc_type; parent_instance = mc_instance; return 0; } openhpi-2.14.1/plugins/ipmidirect/ipmi_rdr.cpp0000644000076400007640000000444311302567000016313 0ustar /* * ipmi_rdr.cpp * * Copyright (c) 2004 by FORCE Computers. * Copyright (c) 2005 by ESO Technologies. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Thomas Kanngieser * Pierre Sangouard */ #include "ipmi_rdr.h" #include "ipmi_mc.h" #include "ipmi_entity.h" #include "ipmi_resource.h" #include "ipmi_domain.h" cIpmiRdr::cIpmiRdr( cIpmiMc *mc, SaHpiRdrTypeT type ) : m_mc( mc ), m_resource( 0 ), m_type( type ), m_lun( 0 ), m_populate( false ) { } cIpmiRdr::~cIpmiRdr() { } cIpmiDomain * cIpmiRdr::Domain() { return m_mc->Domain(); } bool cIpmiRdr::CreateRdr( SaHpiRptEntryT &resource, SaHpiRdrT &rdr ) { rdr.RecordId = m_record_id; rdr.RdrType = m_type; rdr.Entity = m_entity_path; rdr.IdString = m_id_string; return true; } SaErrorT cIpmiRdr::SendCommand( const cIpmiMsg &msg, cIpmiMsg &rsp, unsigned int lun, int retries ) { return m_mc->SendCommand( msg, rsp, lun, retries ); } bool cIpmiRdr::Populate(GSList **list) { if ( m_populate ) return true; // find resource SaHpiRptEntryT *resource = Domain()->FindResource( Resource()->m_resource_id ); if ( !resource ) { stdlog << "Resource not found: Can't populate RDR !\n"; return false; } // create rdr SaHpiRdrT *rdr = (SaHpiRdrT *)g_malloc0(sizeof(SaHpiRdrT)); CreateRdr( *resource, *rdr ); int rv = oh_add_rdr( Domain()->GetHandler()->rptcache, resource->ResourceId, rdr, this, 1 ); if ( rv != 0 ) { stdlog << "Can't add RDR to plugin cache !\n"; g_free( rdr ); return false; } // assign the hpi record id to sensor, so we can find // the rdr for a given sensor. // the id comes from oh_add_rdr. RecordId() = rdr->RecordId; stdlog << "cIpmiRdr::Populate RDR for resource " << resource->ResourceId << " RDR " << RecordId() << "\n"; *list = g_slist_append(*list, rdr); m_populate = true; return true; } openhpi-2.14.1/plugins/ipmidirect/ipmi_domain.h0000644000076400007640000001353611302567000016443 0ustar /* * * Copyright (c) 2003,2004 by FORCE Computers * Copyright (c) 2005 by ESO Technologies. * * Note that this file is based on parts of OpenIPMI * written by Corey Minyard * of MontaVista Software. Corey's code was helpful * and many thanks go to him. He gave the permission * to use this code in OpenHPI under BSD license. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Thomas Kanngieser * Pierre Sangouard */ #ifndef dIpmiDomain_h #define dIpmiDomain_h #include #include extern "C" { #include "SaHpi.h" } #include #include #ifndef dIpmiCon_h #include "ipmi_con.h" #endif #ifndef dIpmiMc_h #include "ipmi_mc.h" #endif #ifndef dIpmiResource_h #include "ipmi_resource.h" #endif #ifndef dIpmiSensorHotswap_h #include "ipmi_sensor_hotswap.h" #endif #ifndef dIpmiSensorThreshold_h #include "ipmi_sensor_threshold.h" #endif #ifndef dIpmiControl_h #include "ipmi_control.h" #endif #ifndef dIpmiWatchdog_h #include "ipmi_watchdog.h" #endif #ifndef dIpmiDiscover_h #include "ipmi_discover.h" #endif #ifndef dIpmiFruInfo_h #include "ipmi_fru_info.h" #endif // property for site types // found by get address info class cIpmiAtcaSiteProperty { public: unsigned int m_property; int m_max_side_id; unsigned int m_mc_type; // dIpmiMcTypeBitXXX ipmi_discover.cpp }; // Re-query the SEL every 5 seconds by default. #define dIpmiSelQueryInterval 5000 // Default poll interval for MCs #define dIpmiMcPollInterval 1000 class cIpmiDomain : public cIpmiFruInfoContainer { public: unsigned int m_con_ipmi_timeout; unsigned int m_con_atca_timeout; bool m_enable_sel_on_all; unsigned int m_max_outstanding; // 0 => use default bool m_atca_poll_alive_mcs; protected: // ipmi connection cIpmiCon *m_con; SaHpiDomainIdT m_did; cIpmiTextBuffer m_domain_tag; SaHpiTimeoutT m_insert_timeout; SaHpiTimeoutT m_extract_timeout; bool m_own_domain; int m_handler_id; public: SaHpiDomainIdT DomainId() { return m_did; } SaHpiTimeoutT &InsertTimeout() { return m_insert_timeout; } SaHpiTimeoutT &ExtractTimeout() { return m_extract_timeout; } int HandlerId() { return m_handler_id; } bool ConLogLevel( int v ) { return m_con->LogLevel( v ); } // true => TCA bool m_is_tca; public: bool IsTca() { return m_is_tca; } protected: // properties for site types // found by get address info cIpmiAtcaSiteProperty m_atca_site_property[256]; void SetAtcaSiteProperty( tIpmiAtcaSiteType type, unsigned int property, int max_id ) { cIpmiAtcaSiteProperty *p = &m_atca_site_property[type]; p->m_property = property; p->m_max_side_id = max_id; } // The main set of SDRs on a BMC. cIpmiSdrs *m_main_sdrs; // The sensors that came from the main SDR. GList *m_sensors_in_main_sdr; // Major and minor versions of the connection. unsigned int m_major_version; unsigned int m_minor_version; bool m_sdr_repository_support; // A special MC used to represent the system interface. cIpmiMc *m_si_mc; public: cIpmiMc *SiMc() { return m_si_mc; } protected: // global lock for reading/writing: // mcs, entities, sensors, frus, sels cThreadLockRw m_lock; cArray m_mcs; // list of all MCs public: void ReadLock() { m_lock.ReadLock(); } void ReadUnlock() { m_lock.ReadUnlock(); } void WriteLock() { m_lock.WriteLock(); } void WriteUnlock() { m_lock.WriteUnlock(); } bool CheckLock() { return m_lock.CheckLock(); } // lock m_initial_discover cThreadLock m_initial_discover_lock; // > 0 => initial discover in progress int m_initial_discover; protected: // array of mc threads cIpmiMcThread *m_mc_thread[256]; public: int m_num_mc_threads; cThreadLock m_mc_thread_lock; public: // time between mc poll in ms unsigned int m_mc_poll_interval; // time between sel rescan in ms unsigned int m_sel_rescan_interval; bool m_bmc_discovered; SaErrorT CheckTca(); public: void AddMc( cIpmiMc *mc ); bool CleanupMc( cIpmiMc *mc ); public: cIpmiDomain(); virtual ~cIpmiDomain(); bool Init( cIpmiCon *c ); void Cleanup(); cIpmiMc *FindMcByAddr( const cIpmiAddr &addr ); //cIpmiMc *FindOrCreateMcBySlaveAddr( unsigned int slave_addr ); SaErrorT SendCommand( const cIpmiAddr &addr, const cIpmiMsg &msg, cIpmiMsg &rsp_msg, int retries = dIpmiDefaultRetries ); GList *GetSdrSensors( cIpmiMc *mc ); void SetSdrSensors( cIpmiMc *mc, GList *sensors ); cIpmiMc *GetEventRcvr(); // called from cIpmiCon to handle async events void HandleAsyncEvent( const cIpmiAddr &addr, const cIpmiMsg &msg ); // called with a list of events to handle from cIpmiMcThread void HandleEvents( GList *list ); // handle a single event void HandleEvent( cIpmiEvent *event ); cIpmiResource *VerifyResource( cIpmiResource *res ); cIpmiMc *VerifyMc( cIpmiMc *mc ); cIpmiRdr *VerifyRdr( cIpmiRdr *rdr ); cIpmiSensor *VerifySensor( cIpmiSensor *s ); cIpmiControl *VerifyControl( cIpmiControl *c ); cIpmiWatchdog *VerifyWatchdog( cIpmiWatchdog *c ); cIpmiInventory *VerifyInventory( cIpmiInventory *i ); virtual void AddHpiEvent( oh_event *event ) = 0; virtual oh_evt_queue *GetHpiEventList() = 0; virtual const cIpmiEntityPath &EntityRoot() = 0; virtual oh_handler_state *GetHandler() = 0; virtual SaHpiRptEntryT *FindResource( SaHpiResourceIdT id ) = 0; void Dump( cIpmiLog &dump ) const; }; #endif openhpi-2.14.1/plugins/ipmidirect/ipmi_mc_vendor_sun.cpp0000644000076400007640000000467411302567000020373 0ustar /* * Copyright (c) 2009 by Sun Microsystems, Inc. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Chris Rinaldo */ #include #include "ipmi_control_sun_led.h" #include "ipmi_entity.h" #include "ipmi_log.h" #include "ipmi_mc_vendor.h" #include "ipmi_mc_vendor_sun.h" #include "ipmi_resource.h" #include "ipmi_sdr.h" #include "ipmi_text_buffer.h" #include "SaHpi.h" cIpmiMcVendorSunBmc::cIpmiMcVendorSunBmc(unsigned int product_id) : cIpmiMcVendor(0x2a, product_id, "Sun BMC") { } cIpmiMcVendorSunBmc::~cIpmiMcVendorSunBmc() { } bool cIpmiMcVendorSunBmc::InitMc(cIpmiMc *mc, const cIpmiMsg &dvid) { stdlog << "Sun BMC Init[" << mc->ManufacturerId() << "," << mc->ProductId() << "]: addr = " << mc->GetAddress() << "\n"; mc->IsRmsBoard() = true; return true; } bool cIpmiMcVendorSunBmc::CreateControls(cIpmiDomain *dom, cIpmiMc *mc, cIpmiSdrs *sdrs) { cIpmiSdr *sdr; for (unsigned int i = 0; i < sdrs->NumSdrs(); i++) { sdr = sdrs->Sdr(i); if (sdr->m_type != eSdrTypeGenericDeviceLocatorRecord) continue; SaHpiEntityTypeT type = (SaHpiEntityTypeT) sdr->m_data[12]; SaHpiEntityLocationT instance = (SaHpiEntityLocationT) sdr->m_data[13]; SaHpiEntityTypeT parent_type; SaHpiEntityLocationT parent_instance; unsigned int parent_fru_id; parent_fru_id = sdrs->FindParentFru(type, instance, parent_type, parent_instance); cIpmiResource *res = FindResource(dom, mc, parent_fru_id, parent_type, parent_instance, sdrs); uint8_t dev_slave_addr = sdr->m_data[6]; uint8_t dev_access_addr = sdr->m_data[5]; uint8_t oem = sdr->m_data[14]; uint8_t entity_id = sdr->m_data[12]; uint8_t entity_inst = sdr->m_data[13]; cIpmiTextBuffer tb; tb.SetIpmi(sdr->m_data + 15); char id[16]; tb.GetAscii(id, sizeof (id)); cIpmiControlSunLed *led = new cIpmiControlSunLed(mc, i, dev_access_addr, dev_slave_addr, entity_id, entity_inst, oem, SAHPI_FALSE); led->EntityPath() = res->EntityPath(); led->IdString().SetAscii(id, SAHPI_TL_TYPE_TEXT, SAHPI_LANG_ENGLISH); res->AddRdr(led); } return true; } openhpi-2.14.1/plugins/ipmidirect/array.h0000644000076400007640000000776611302567000015304 0ustar /* * * Copyright (c) 2004 by FORCE Computers. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Thomas Kanngieser */ #ifndef dArray_h #define dArray_h #include template class cArray { T **m_array; int m_num; int m_size; int m_resize; public: cArray( int r = 1 ) : m_array( 0 ), m_num( 0 ), m_size( 0 ), m_resize( r ) { assert( r > 0 ); } cArray( const cArray &array ) : m_array( 0 ), m_num( 0 ), m_size( 0 ), m_resize( array.m_resize ) { } ~cArray() { Clear(); } int Add( T *t ) { if ( m_num == m_size ) { T **newa = new T *[m_size+m_resize]; if ( m_num ) memcpy( newa, m_array, sizeof( T * ) * m_num ); delete[] m_array; m_array = newa; m_size += m_resize; } m_array[m_num++] = t; return m_num-1; } T *Rem( int idx ) { assert( idx >= 0 && idx < m_num ); T *rv = m_array[idx]; m_num--; if ( m_num == 0 ) return rv; int n = m_num/m_resize*m_resize+m_resize-1; if ( m_size > n ) { m_size = n; T **newa = new T *[n]; if ( idx != 0 ) memcpy( newa, m_array, sizeof( T * ) * idx ); if ( idx != m_num ) memcpy( newa+idx, m_array+idx+1, (m_num - idx)*sizeof( T * ) ); delete[] m_array; m_array = newa; return rv; } if ( idx != m_num ) memmove( m_array+idx, m_array+idx+1, (m_num - idx)*sizeof( T * ) ); return rv; } void RemAll() { if ( m_array ) { delete[] m_array; m_num = 0; m_array = 0; m_size = 0; } } T *operator[]( int idx ) const { assert( idx >= 0 && idx < m_num ); return m_array[idx]; } T * & operator[]( int idx ) { assert( idx >= 0 && idx < m_num ); return m_array[idx]; } cArray &operator+=( T *t ) { Add( t ); return *this; } cArray &operator-=( T *t ) { int idx = Find( t ); assert( idx != -1 ); if ( idx != -1 ) Rem( idx ); return *this; } int Num() const { return m_num; } int Find( T *t ) const { for( int i = 0; i < m_num; i++ ) if ( m_array[i] == t ) return i; return -1; } void Sort( int (*cmp)( T **t1, T **t2 ) ) { qsort( m_array, m_num, sizeof( T * ), (int (*)(const void *, const void *) )cmp ); } int Search( T *key, int (*cmp)( T **t1, T **t2 ), int mmax = -1 ) const { int n = m_num; if ( mmax >= 0 && mmax < m_num ) n = mmax; T **e = (T **)bsearch( &key, m_array, n, sizeof( T * ), (int (*)(const void *, const void *) )cmp ); if ( e == 0 ) return -1; int idx = (e - m_array); assert( idx >= 0 && idx < n ); return idx; } void Clear() { if ( m_array ) { for( int i = 0; i < m_num; i++ ) delete m_array[i]; delete[] m_array; m_num = 0; m_array = 0; m_size = 0; } } int Insert( int befor, T *t ) { assert( befor <= m_num ); if ( befor == -1 || befor == m_num ) return Add( t ); if ( m_num == m_size ) { T **newa = new T *[m_size+m_resize]; if ( m_num ) memcpy( newa, m_array, sizeof( T * ) * m_num ); delete[] m_array; m_array = newa; m_size += m_resize; } for( int i = m_num-1; i >= befor; i-- ) m_array[i+1] = m_array[i]; m_num++; m_array[befor] = t; return befor; } cArray &operator=( const cArray & /*array*/ ) { // this is not a real copy operator ! Clear(); return *this; } }; #endif openhpi-2.14.1/plugins/ipmidirect/ipmi_sensor_factors.cpp0000644000076400007640000002411011302567000020547 0ustar /* * ipmi_sensor_factors.cpp * * Copyright (c) 2004 by FORCE Computers * Copyright (c) 2005 by ESO Technologies. * * Note that this file is based on parts of OpenIPMI * written by Corey Minyard * of MontaVista Software. Corey's code was helpful * and many thanks go to him. He gave the permission * to use this code in OpenHPI under BSD license. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Thomas Kanngieser * Pierre Sangouard */ #include "ipmi_sensor_factors.h" #include static const char *analoge_data_format[] = { "Unsigned", "1Compl", "2Compl", "Analog" }; const char * IpmiAnalogeDataFormatToString( tIpmiAnalogeDataFormat fmt ) { if ( (int)fmt <= eIpmiAnalogDataFormatNotAnalog ) return analoge_data_format[fmt]; return "Invalid"; } static const char *linearization_map[] = { "Linear", "Ln", "Log10", "Log2", "E", "Exp10", "Exp2", "1OverX", "Sqr", "Cube", "Sqrt", "1OverCube" }; const char * IpmiLinearizationToString( tIpmiLinearization val ) { if ( val == eIpmiLinearizationNonlinear ) return "NonLinear"; if ( val <= eIpmiLinearization1OverCube ) return linearization_map[val]; return "Invalid"; } cIpmiSensorFactors::cIpmiSensorFactors() : m_analog_data_format( eIpmiAnalogDataFormatUnsigned ), m_linearization( eIpmiLinearizationLinear ), m_is_non_linear( false ), m_m( 0 ), m_tolerance( 0 ), m_b( 0 ), m_r_exp( 0 ), m_accuracy_exp( 0 ), m_accuracy( 0 ), m_b_exp( 0 ) { } cIpmiSensorFactors::~cIpmiSensorFactors() { } bool cIpmiSensorFactors::GetDataFromSdr( const cIpmiSdr *sdr ) { m_analog_data_format = (tIpmiAnalogeDataFormat)((sdr->m_data[20] >> 6) & 3); m_linearization = (tIpmiLinearization)(sdr->m_data[23] & 0x7f); if ( m_linearization <= 11 ) { m_m = sdr->m_data[24] | ((sdr->m_data[25] & 0xc0) << 2); m_tolerance = sdr->m_data[25] & 0x3f; m_b = sdr->m_data[26] | ((sdr->m_data[27] & 0xc0) << 2); m_accuracy = ((sdr->m_data[27] & 0x3f) | ((sdr->m_data[28] & 0xf0) << 2)); m_accuracy_exp = (sdr->m_data[28] >> 2) & 0x3; m_r_exp = (sdr->m_data[29] >> 4) & 0xf; m_b_exp = sdr->m_data[29] & 0xf; m_accuracy_factor = (m_accuracy * pow( 10.0, m_accuracy_exp)) / 100.0; } if ( m_linearization == eIpmiLinearizationLinear ) m_is_non_linear = false; else m_is_non_linear = true; return true; } bool cIpmiSensorFactors::Cmp( const cIpmiSensorFactors &sf ) const { if ( m_analog_data_format != sf.m_analog_data_format ) return false; if ( m_linearization != sf.m_linearization ) return false; if ( m_linearization <= 11 ) { if ( m_m != sf.m_m ) return false; if ( m_tolerance != sf.m_tolerance ) return false; if ( m_b != sf.m_b ) return false; if ( m_accuracy != sf.m_accuracy ) return false; if ( m_accuracy_exp != sf.m_accuracy_exp ) return false; if ( m_r_exp != sf.m_r_exp ) return false; if ( m_b_exp != sf.m_b_exp ) return false; } return true; } static double c_linear( double val ) { return val; } static double c_exp10( double val ) { return pow( 10.0, val ); } static double c_exp2( double val ) { return pow( 2.0, val ); } static double c_1_over_x( double val ) { return 1.0 / val; } static double c_sqr( double val ) { return pow( val, 2.0 ); } static double c_cube( double val ) { return pow( val, 3.0 ); } static double c_1_over_cube( double val ) { return 1.0 / pow( val, 3.0 ); } typedef double (*linearizer)( double val ); static linearizer linearize[12] = { c_linear, log, log10, log2, exp, c_exp10, c_exp2, c_1_over_x, c_sqr, c_cube, sqrt, c_1_over_cube }; static int sign_extend( int m, int bits ) { if ( m & (1 << (bits-1)) ) return m | (-1 << bits); else return m & (~(-1 << bits)); } bool cIpmiSensorFactors::ConvertFromRaw( unsigned int val, double &result, bool is_hysteresis) const { double m, b, b_exp, r_exp, fval; linearizer c_func; if ( m_linearization == eIpmiLinearizationNonlinear ) c_func = c_linear; else if ( m_linearization <= 11 ) c_func = linearize[m_linearization]; else return false; val &= 0xff; m = m_m; b = m_b; r_exp = m_r_exp; b_exp = m_b_exp; if ( is_hysteresis == true ) { if ( val == 0 ) { result = 0; return true; } // For hysteresis : no offset + abs value b = 0; if ( m < 0 ) m = -m; } switch( m_analog_data_format ) { case eIpmiAnalogDataFormatUnsigned: fval = val; break; case eIpmiAnalogDataFormat1Compl: val = sign_extend( val, 8 ); if ( val == 0xffffffff ) val += 1; fval = val; break; case eIpmiAnalogDataFormat2Compl: fval = sign_extend( val, 8 ); break; default: return false; } result = c_func( ((m * fval) + (b * pow(10, b_exp))) * pow(10, r_exp) ); return true; } bool cIpmiSensorFactors::ConvertToRaw( tIpmiRound rounding, double val, unsigned int &result, bool is_hysteresis, bool swap_thresholds ) const { bool rv; bool swap; double cval; int lowraw, highraw, raw, maxraw, minraw, next_raw; if (is_hysteresis == true) swap = false; else swap = swap_thresholds; switch( m_analog_data_format ) { case eIpmiAnalogDataFormatUnsigned: lowraw = 0; highraw = 255; minraw = 0; maxraw = 255; next_raw = 128; break; case eIpmiAnalogDataFormat1Compl: lowraw = -127; highraw = 127; minraw = -127; maxraw = 127; next_raw = 0; break; case eIpmiAnalogDataFormat2Compl: lowraw = -128; highraw = 127; minraw = -128; maxraw = 127; next_raw = 0; break; default: return false; } // We do a binary search for the right value. Yuck, but I don't // have a better plan that will work with non-linear sensors. do { raw = next_raw; rv = ConvertFromRaw( raw, cval, is_hysteresis ); if ( !rv ) return false; // If swap == true, when raw value increases // the corresponding interpreted value decreases // so we have to take that into account when searching if ((( swap == false) && ( cval < val )) || (( swap == true) && ( cval > val ))) { next_raw = ((highraw - raw) / 2) + raw; lowraw = raw; } else { next_raw = ((raw - lowraw) / 2) + lowraw; highraw = raw; } } while( raw != next_raw ); // The above loop gets us to within 1 of what it should be, we // have to look at rounding to make the final decision. switch( rounding ) { case eRoundNormal: // If swap == true, when raw value increases // the corresponding interpreted value decreases // so we have to take that into account when searching if ((( swap == false ) && ( val > cval )) || (( swap == true ) && ( val < cval ))) { if ( raw < maxraw ) { double nval; rv = ConvertFromRaw( raw + 1, nval, is_hysteresis ); if ( !rv ) return false; nval = cval + ((nval - cval) / 2.0); if ((( swap == false ) && ( val >= nval )) || (( swap == true ) && ( val <= nval ))) raw++; } } else { if ( raw > minraw ) { double pval; rv = ConvertFromRaw( raw-1, pval, is_hysteresis ); if ( !rv ) return false; pval = pval + ((cval - pval) / 2.0); if ((( swap == false ) && ( val < pval )) || (( swap == true ) && ( val > pval ))) raw--; } } break; case eRoundUp: // If swap == true, when raw value increases // the corresponding interpreted value decreases // so we have to take that into account when searching if ( swap == false ) { if ((val > cval) && (raw < maxraw)) raw++; } else { if ((val < cval) && (raw < maxraw)) raw++; }; break; case eRoundDown: // If swap == true, when raw value increases // the corresponding interpreted value decreases // so we have to take that into account when searching if ( swap == false ) { if ( ( val < cval) && (raw > minraw ) ) raw--; } else { if ( ( val > cval) && (raw > minraw ) ) raw--; }; break; } if ( m_analog_data_format == eIpmiAnalogDataFormat1Compl ) if ( raw < 0 ) raw -= 1; result = raw & 0xff; return true; } openhpi-2.14.1/plugins/ipmidirect/ipmi_control_sun_led.h0000644000076400007640000000323211302567000020355 0ustar /* * Copyright (c) 2009 by Sun Microsystems, Inc. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Chris Rinaldo */ #ifndef dIpmiControlSunLed_h #define dIpmiControlSunLed_h #include #include "ipmi_control.h" #include "ipmi_log.h" #include "ipmi_mc.h" #include "SaHpi.h" class cIpmiControlSunLed : public cIpmiControl { protected: uint8_t m_dev_access_addr; uint8_t m_dev_slave_addr; uint8_t m_entity_id; uint8_t m_entity_inst; uint8_t m_oem; SaHpiBoolT m_read_only; public: cIpmiControlSunLed(cIpmiMc *mc, unsigned int num, uint8_t dev_access_addr, uint8_t dev_slave_addr, uint8_t entity_id, uint8_t entity_inst, uint8_t oem, SaHpiBoolT read_only); virtual ~cIpmiControlSunLed(); virtual bool CreateRdr(SaHpiRptEntryT &resource, SaHpiRdrT &rdr); virtual SaErrorT SetState(const SaHpiCtrlModeT &mode, const SaHpiCtrlStateT &state); virtual SaErrorT GetState(SaHpiCtrlModeT &mode, SaHpiCtrlStateT &state); virtual void Dump(cIpmiLog &dump, const char *name) const; private: static const tIpmiCmd eIpmiCmdSunOemLedGet = static_cast (0x21); static const tIpmiCmd eIpmiCmdSunOemLedSet = static_cast (0x22); enum tLedState { eLedStateOff, eLedStateOn, eLedStateStandByBlink, eLedStateSlowBlink, eLedStateFastBlink }; }; #endif openhpi-2.14.1/plugins/ipmidirect/ipmi_mc_vendor_force.h0000644000076400007640000000162211302567000020317 0ustar /* * Force specific code * * Copyright (c) 2004 by FORCE Computers. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Thomas Kanngieser */ #ifndef dIpmiMcVendorForce_h #define dIpmiMcVendorForce_h #ifndef dIpmiMcVendor_h #include "ipmi_mc_vendor.h" #endif class cIpmiMcVendorForceShMc : public cIpmiMcVendor { public: cIpmiMcVendorForceShMc( unsigned int product_id ); virtual ~cIpmiMcVendorForceShMc(); virtual bool InitMc( cIpmiMc *mc, const cIpmiMsg &devid ); bool ProcessSdr( cIpmiDomain *domain, cIpmiMc *mc, cIpmiSdrs *sdrs ); }; #endif openhpi-2.14.1/plugins/ipmidirect/ipmi_text_buffer.cpp0000644000076400007640000003053511302567000020042 0ustar /* * ipmi_text_buffer.cpp * * Copyright (c) 2003,2004 by FORCE Computers * Copyright (c) 2005 by ESO Technologies. * * Note that this file is based on parts of OpenIPMI * written by Corey Minyard * of MontaVista Software. Corey's code was helpful * and many thanks go to him. He gave the permission * to use this code in OpenHPI under BSD license. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Thomas Kanngieser * Pierre Sangouard */ #include #include "ipmi_text_buffer.h" cIpmiTextBuffer::cIpmiTextBuffer() { Clear(); } cIpmiTextBuffer::cIpmiTextBuffer( const char *string, SaHpiTextTypeT type, SaHpiLanguageT l ) { m_buffer.DataType = type; m_buffer.Language = l; SetAscii( string, type, l ); } cIpmiTextBuffer::cIpmiTextBuffer( const unsigned char *data, SaHpiLanguageT l ) { SetIpmi( data, false, l ); } cIpmiTextBuffer::cIpmiTextBuffer( const SaHpiTextBufferT &buf ) { m_buffer = buf; } void cIpmiTextBuffer::Clear() { m_buffer.DataType = SAHPI_TL_TYPE_TEXT; m_buffer.Language = SAHPI_LANG_ENGLISH; m_buffer.DataLength = 0; memset( m_buffer.Data, 0, SAHPI_MAX_TEXT_BUFFER_LENGTH ); } const unsigned char * cIpmiTextBuffer::SetIpmi( const unsigned char *data, bool is_fru, SaHpiLanguageT l ) { Clear(); m_buffer.Language = l; if ( *data == 0xc1 ) return 0; // end mark m_buffer.DataType = (SaHpiTextTypeT)((*data >> 6) & 3); if (( is_fru == true ) && ( m_buffer.DataType == SAHPI_TL_TYPE_UNICODE )) { m_buffer.DataType = SAHPI_TL_TYPE_BINARY; } m_buffer.DataLength = *data & 0x3f; data++; memcpy( m_buffer.Data, data, m_buffer.DataLength ); data += m_buffer.DataLength; if (( m_buffer.DataType == SAHPI_TL_TYPE_BCDPLUS ) || ( m_buffer.DataType == SAHPI_TL_TYPE_ASCII6 )) { char tmpstr[SAHPI_MAX_TEXT_BUFFER_LENGTH]; int len; len = GetAscii( tmpstr, sizeof (tmpstr) ); if ( len == -1 ) return 0; m_buffer.DataLength = len; memcpy( m_buffer.Data, tmpstr, m_buffer.DataLength ); } return data; } // Element will be zero if not present, n-1 if present. static SaHpiUint8T table_4_bit[256] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 0x0c, 0x0d, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }; int cIpmiTextBuffer::AsciiToBcdPlus( const char *s ) { m_buffer.DataType = SAHPI_TL_TYPE_BCDPLUS; m_buffer.DataLength = 0; SaHpiUint8T *p = m_buffer.Data; int bit = 0; while( *s ) { if ( m_buffer.DataLength == SAHPI_MAX_TEXT_BUFFER_LENGTH ) break; switch( bit ) { case 0: m_buffer.DataLength++; *p = table_4_bit[(unsigned int)*s]; bit = 4; break; case 4: *p |= table_4_bit[(unsigned int)*s++] << 4; p++; bit = 0; break; } } return m_buffer.DataLength; } // Element will be zero if not present, n-1 if present. static SaHpiUint8T table_6_bit[256] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x21, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, 0x20, 0x00, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }; //////// // 0 1 2 3 // 0123456789012345678901234567890 // 000000111111222222333333444444 int cIpmiTextBuffer::AsciiToAscii6( const char *s ) { m_buffer.DataType = SAHPI_TL_TYPE_ASCII6; m_buffer.DataLength = 0; SaHpiUint8T *p = m_buffer.Data; int bit = 0; while( *s ) { if ( m_buffer.DataLength == SAHPI_MAX_TEXT_BUFFER_LENGTH ) break; switch( bit ) { case 0: *p = table_6_bit[(unsigned int)*s++]; m_buffer.DataLength++; bit = 6; break; case 2: *p |= (table_6_bit[(unsigned int)*s] << 2); bit = 0; break; case 4: *p |= table_4_bit[(unsigned int)*s] << 4; p++; *p = (table_4_bit[(unsigned int)*s++] >> 4) & 0x3; m_buffer.DataLength++; bit = 2; break; case 6: *p |= table_4_bit[(unsigned int)*s] << 6; p++; *p = (table_4_bit[(unsigned int)*s++] >> 2) & 0xf; m_buffer.DataLength++; bit = 4; break; } } return m_buffer.DataLength; } int cIpmiTextBuffer::AsciiToLanguage( const char *s ) { m_buffer.DataType = SAHPI_TL_TYPE_TEXT; int l = strlen( s ); if ( l > SAHPI_MAX_TEXT_BUFFER_LENGTH ) l = SAHPI_MAX_TEXT_BUFFER_LENGTH; m_buffer.DataLength = l; strncpy( ( char *)m_buffer.Data, s, SAHPI_MAX_TEXT_BUFFER_LENGTH ); return l; } bool cIpmiTextBuffer::SetAscii( const char *string, SaHpiTextTypeT type, SaHpiLanguageT l ) { m_buffer.Language = l; switch( type ) { case SAHPI_TL_TYPE_BCDPLUS: AsciiToBcdPlus( string ); return true; case SAHPI_TL_TYPE_ASCII6: AsciiToAscii6( string ); return true; case SAHPI_TL_TYPE_TEXT: AsciiToLanguage( string ); return true; default: break; } return false; } SaHpiTextTypeT cIpmiTextBuffer::CheckAscii( const char *s ) { SaHpiTextTypeT type = SAHPI_TL_TYPE_BCDPLUS; while( *s ) { if ( type == SAHPI_TL_TYPE_BCDPLUS && table_4_bit[(int)*s] == 0 ) type = SAHPI_TL_TYPE_ASCII6; if ( type == SAHPI_TL_TYPE_ASCII6 && table_6_bit[(int) *s] == 0 ) { type = SAHPI_TL_TYPE_TEXT; break; } } return type; } int cIpmiTextBuffer::BinaryToAscii( char *buffer, unsigned int len ) const { unsigned int l = m_buffer.DataLength; if ( l >= len ) l = len - 1; memcpy( buffer, m_buffer.Data, l ); buffer[l] = 0; return len; } int cIpmiTextBuffer::BcdPlusToAscii( char *buffer, unsigned int len ) const { static char table[] = "0123456789 -.:,_"; unsigned int real_length = 2 * m_buffer.DataLength; if ( len > real_length ) len = real_length; bool first = true; const unsigned char *d = m_buffer.Data; for( unsigned int i = 0; i < len; i++ ) { int val = 0; if ( first ) val = *d & 0xf; else val = (*d++ >> 4) & 0xf; first = !first; *buffer++ = table[val]; } *buffer = 0; return len; } int cIpmiTextBuffer::Ascii6ToAscii( char *buffer, unsigned int len ) const { static char table[64] = { ' ', '!', '"', '#', '$', '%', '&', '\'', '(', ')', '*', '+', ',', '-', '.', '/', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', ':', ';', '<', '=', '>', '?', '&', 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', '[', '\\', ']', '^', '_' }; unsigned int real_length = (m_buffer.DataLength * 8) / 6; if ( len >= real_length ) len = real_length; const unsigned char *d = m_buffer.Data; int bo = 0; for( unsigned int i =0; i < len; i++ ) { int val = 0; switch( bo ) { case 0: val = *d & 0x3f; bo = 6; break; case 2: val = (*d >> 2) & 0x3f; d++; bo = 0; break; case 4: val = (*d >> 4) & 0xf; d++; val |= (*d & 0x3) << 4; bo = 2; break; case 6: val = (*d >> 6) & 0x3; d++; val |= (*d & 0xf) << 2; bo = 4; break; } *buffer++ = table[val]; } *buffer = 0; return len; } int cIpmiTextBuffer::LanguageToAscii( char *buffer, unsigned int len ) const { if ( m_buffer.Language == SAHPI_LANG_ENGLISH ) return BinaryToAscii( buffer, len ); // unicode not supported return -1; } int cIpmiTextBuffer::GetAscii( char *buffer, unsigned int len ) const { switch( m_buffer.DataType ) { case SAHPI_TL_TYPE_BINARY: return BinaryToAscii( buffer, len ); case SAHPI_TL_TYPE_BCDPLUS: return BcdPlusToAscii( buffer, len ); case SAHPI_TL_TYPE_ASCII6: return Ascii6ToAscii( buffer, len ); case SAHPI_TL_TYPE_TEXT: return LanguageToAscii( buffer, len ); default: return -1; } } bool cIpmiTextBuffer::operator==( const cIpmiTextBuffer &tb ) const { if ( m_buffer.DataType != tb.m_buffer.DataType ) return false; if ( m_buffer.Language != tb.m_buffer.Language ) return false; if ( m_buffer.DataLength != tb.m_buffer.DataLength ) return false; if ( m_buffer.DataLength ) return memcmp( m_buffer.Data, m_buffer.Data, tb.m_buffer.DataLength ) == 0; return true; } bool cIpmiTextBuffer::operator!=( const cIpmiTextBuffer &tb ) const { return !operator==( tb ); } cIpmiLog & operator<<( cIpmiLog &dump, const cIpmiTextBuffer &tb ) { char str[2*SAHPI_MAX_TEXT_BUFFER_LENGTH+1] = ""; tb.GetAscii( str, 2*SAHPI_MAX_TEXT_BUFFER_LENGTH+1 ); dump << str; return dump; } openhpi-2.14.1/plugins/ipmidirect/ipmi_log.h0000644000076400007640000000425611302567000015754 0ustar /* * * Copyright (c) 2003,2004 by FORCE Computers. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Thomas Kanngieser */ #ifndef dIpmiLog_h #define dIpmiLog_h #ifndef dThread_h #include "thread.h" #endif #include #include #define dDefaultLogfile "log" /* log file properties */ #define dIpmiLogPropNone 0 #define dIpmiLogStdOut 1 // use stdout #define dIpmiLogStdErr 2 // use stderr #define dIpmiLogLogFile 4 // use a log file #define dIpmiLogFile 8 // use a file class cIpmiLog { protected: cThreadLock m_lock; int m_lock_count; int m_open_count; bool m_hex; // true => print int in hex bool m_time; // with time bool m_recursive; bool m_std_out; bool m_std_err; bool m_nl; FILE *m_fd; void Start(); void Output( const char *str ); public: cIpmiLog(); virtual ~cIpmiLog(); bool Open( int properties, const char *filename = "", int max_log_files = 1 ); void Close(); void Lock() { m_lock.Lock(); m_lock_count++; } void Unlock() { m_lock_count--; assert( m_lock_count >= 0 ); m_lock.Unlock(); } void Hex( bool hex = true ) { m_hex = hex; } bool IsHex() { return m_hex; } void Time( bool t = true ) { m_time = t; } bool WithTime() { return m_time; } void Recursive( bool r ) { m_recursive = true; } bool IsRecursive() { return m_recursive; } cIpmiLog &operator<<( bool b ); cIpmiLog &operator<<( unsigned char c ); cIpmiLog &operator<<( int i ); cIpmiLog &operator<<( unsigned int i ); cIpmiLog &operator<<( double d ); cIpmiLog &operator<<( const char *str ); void Log( const char *fmt, ... ); void Hex( const unsigned char *data, int size ); void Begin( const char *section, const char *name ); void End(); cIpmiLog &Entry( const char *entry ); }; extern cIpmiLog stdlog; #endif openhpi-2.14.1/plugins/ipmidirect/ipmi_sensor.h0000644000076400007640000002400311302567000016474 0ustar /* * ipmi_sensor.h * * Copyright (c) 2003,2004 by FORCE Computers * Copyright (c) 2005 by ESO Technologies. * * Note that this file is based on parts of OpenIPMI * written by Corey Minyard * of MontaVista Software. Corey's code was helpful * and many thanks go to him. He gave the permission * to use this code in OpenHPI under BSD license. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Thomas Kanngieser * Pierre Sangouard */ #ifndef dIpmiSensor_h #define dIpmiSensor_h extern "C" { #include "SaHpi.h" } #ifndef dIpmiMsg_h #include "ipmi_msg.h" #endif #ifndef dIpmiEvent_h #include "ipmi_event.h" #endif #ifndef dIpmiSdr_h #include "ipmi_sdr.h" #endif #ifndef dIpmiRdr_h #include "ipmi_rdr.h" #endif struct tIpmiEntity; class cIpmiDomain; enum tIpmiSensorType { eIpmiSensorTypeInvalid = 0x00, eIpmiSensorTypeTemperature = 0x01, eIpmiSensorTypeVoltage = 0x02, eIpmiSensorTypeCurrent = 0x03, eIpmiSensorTypeFan = 0x04, eIpmiSensorTypePhysicalSecurity = 0x05, eIpmiSensorTypePlatformSecurity = 0x06, eIpmiSensorTypeProcessor = 0x07, eIpmiSensorTypePowerSupply = 0x08, eIpmiSensorTypePowerUnit = 0x09, eIpmiSensorTypeCoolingDevice = 0x0a, eIpmiSensorTypeOtherUnitsBasedSensor = 0x0b, eIpmiSensorTypeMemory = 0x0c, eIpmiSensorTypeDriveSlot = 0x0d, eIpmiSensorTypePowerMemoryResize = 0x0e, eIpmiSensorTypeSystemFirmwareProgress = 0x0f, eIpmiSensorTypeEventLoggingDisabled = 0x10, eIpmiSensorTypeWatchdog1 = 0x11, eIpmiSensorTypeSystemEvent = 0x12, eIpmiSensorTypeCriticalInterrupt = 0x13, eIpmiSensorTypeButton = 0x14, eIpmiSensorTypeModuleBoard = 0x15, eIpmiSensorTypeMicrocontrollerCoprocessor = 0x16, eIpmiSensorTypeAddInCard = 0x17, eIpmiSensorTypeChassis = 0x18, eIpmiSensorTypeChipSet = 0x19, eIpmiSensorTypeOtherFru = 0x1a, eIpmiSensorTypeCableInterconnect = 0x1b, eIpmiSensorTypeTerminator = 0x1c, eIpmiSensorTypeSystemBootInitiated = 0x1d, eIpmiSensorTypeBootError = 0x1e, eIpmiSensorTypeOsBoot = 0x1f, eIpmiSensorTypeOsCriticalStop = 0x20, eIpmiSensorTypeSlotConnector = 0x21, eIpmiSensorTypeSystemAcpiPowerState = 0x22, eIpmiSensorTypeWatchdog2 = 0x23, eIpmiSensorTypePlatformAlert = 0x24, eIpmiSensorTypeEntityPresence = 0x25, eIpmiSensorTypeMonitorAsicIc = 0x26, eIpmiSensorTypeLan = 0x27, eIpmiSensorTypeManagementSubsystemHealth = 0x28, eIpmiSensorTypeBattery = 0x29, eIpmiSensorTypeOemFirst = 0xc0, eIpmiSensorTypeOemLast = 0xef, eIpmiSensorTypeAtcaHotSwap = 0xf0, eIpmiSensorTypeAtcaIpmb = 0xf1, eIpmiSensorTypeAtcaAmcHotSwap = 0xf2, eIpmiSensorTypeAtcaLast = 0xff }; const char *IpmiSensorTypeToString( tIpmiSensorType type ); enum tIpmiEventReadingType { eIpmiEventReadingTypeInvalid = 0x00, eIpmiEventReadingTypeThreshold = 0x01, eIpmiEventReadingTypeDiscreteUsage = 0x02, eIpmiEventReadingTypeDiscreteState = 0x03, eIpmiEventReadingTypeDiscretePredictiveFailure = 0x04, eIpmiEventReadingTypeDiscreteLimitExceeded = 0x05, eIpmiEventReadingTypeDiscretePerformanceMet = 0x06, eIpmiEventReadingTypeDiscreteSeverity = 0x07, eIpmiEventReadingTypeDiscreteDevicePresence = 0x08, eIpmiEventReadingTypeDiscreteDeviceEnable = 0x09, eIpmiEventReadingTypeDiscreteAvailability = 0x0a, eIpmiEventReadingTypeDiscreteRedundancy = 0x0b, eIpmiEventReadingTypeDiscreteAcpiPower = 0x0c, eIpmiEventReadingTypeSensorSpecific = 0x6f, eIpmiEventReadingTypeOemFirst = 0x70, eIpmiEventReadingTypeOemLast = 0x7f }; const char *IpmiEventReadingTypeToString( tIpmiEventReadingType type ); enum tIpmiEventSupport { eIpmiEventSupportPerState = 0, eIpmiEventSupportEntireSensor = 1, eIpmiEventSupportGlobalEnable = 2, eIpmiEventSupportNone = 3 }; const char *IpmiEventSupportToString( tIpmiEventSupport val ); enum tIpmiValuePresent { eIpmiNoValuesPresent, eIpmiRawValuePresent, eIpmiBothValuesPresent }; #define dSensorIdLen 32 class cIpmiSensor : public cIpmiRdr { protected: cIpmiMc *m_source_mc; // If the sensor came from the main SDR, // this will be NULL. Otherwise, it // will be the MC that owned the device // SDR this came from. bool m_destroyed; int m_use_count; unsigned char m_owner; unsigned char m_channel; unsigned char m_num; unsigned int m_virtual_num; // virtual sensor number bool m_sensor_init_scanning; bool m_sensor_init_events; bool m_sensor_init_type; bool m_sensor_init_pu_events; bool m_sensor_init_pu_scanning; bool m_ignore_if_no_entity; bool m_supports_auto_rearm; unsigned int m_assertion_event_mask; unsigned int m_deassertion_event_mask; unsigned int m_reading_mask; SaHpiBoolT m_enabled; SaHpiBoolT m_events_enabled; SaHpiEventStateT m_current_hpi_assert_mask; SaHpiEventStateT m_current_hpi_deassert_mask; SaHpiEventStateT m_hpi_assert_mask; SaHpiEventStateT m_hpi_deassert_mask; SaHpiSensorEventCtrlT m_event_control; tIpmiEventSupport m_event_support; tIpmiSensorType m_sensor_type; tIpmiEventReadingType m_event_reading_type; unsigned int m_oem; const char *m_sensor_type_string; const char *m_event_reading_type_string; const char *m_rate_unit_string; const char *m_base_unit_string; const char *m_modifier_unit_string; cIpmiSdr *m_sdr; // full sensor record or 0 public: cIpmiSensor( cIpmiMc *mc ); virtual ~cIpmiSensor(); cIpmiMc *&SourceMc() { return m_source_mc; } virtual unsigned int Num() const { return m_num; } cIpmiSdr *GetSdr() { return m_sdr; } void SetSdr( cIpmiSdr *sdr ) { m_sdr = sdr; } tIpmiSensorType SensorType() const { return m_sensor_type; } tIpmiEventReadingType EventReadingType() const { return m_event_reading_type; } bool IgnoreIfNoEntity() const { return m_ignore_if_no_entity; } tIpmiEventSupport EventSupport() const { return m_event_support; } virtual void HandleNew( cIpmiDomain *domain ); virtual bool Cmp( const cIpmiSensor &s2 ) const; unsigned int GetOem() { return m_oem; } // create an HPI event from ipmi event virtual SaErrorT CreateEvent( cIpmiEvent *event, SaHpiEventT &h ); // create and send HPI sensor enable change event void CreateEnableChangeEvent(); // handle all incoming sensor events virtual void HandleEvent( cIpmiEvent *event ); virtual void Dump( cIpmiLog &dump ) const; // read sensor parameter from Full Sensor Record virtual bool GetDataFromSdr( cIpmiMc *mc, cIpmiSdr *sdr ); // create an RDR sensor record virtual bool CreateRdr( SaHpiRptEntryT &resource, SaHpiRdrT &rdr ); SaHpiEventCategoryT HpiEventCategory(tIpmiEventReadingType reading_type); SaHpiSensorTypeT HpiSensorType(tIpmiSensorType sensor_type); // read sensor. must be called with a global read lock held. SaErrorT GetSensorData( cIpmiMsg &rsp ); // get sensor data. this function must called with the global read lock held virtual SaErrorT GetSensorReading( SaHpiSensorReadingT &data, SaHpiEventStateT &state ) = 0; // this function must called with the global read lock held SaErrorT GetEnable( SaHpiBoolT &enable ); // this function must called with the global read lock held SaErrorT GetEventEnables( SaHpiBoolT &enables ); SaErrorT GetEventEnableHw( SaHpiBoolT &enables ); // this function must called with the global read lock held SaErrorT GetEventMasks( SaHpiEventStateT &AssertEventMask, SaHpiEventStateT &DeassertEventMask ); // this function must called with the global read lock held virtual SaErrorT GetEventMasksHw( SaHpiEventStateT &AssertEventMask, SaHpiEventStateT &DeassertEventMask ) = 0; protected: // this function must called with the global read lock held virtual SaErrorT GetEventMasksHw( cIpmiMsg &rsp ); public: // this function must called with the global read lock held SaErrorT SetEnable( const SaHpiBoolT &enable ); // this function must called with the global read lock held SaErrorT SetEventEnables( const SaHpiBoolT &enables ); SaErrorT SetEventEnableHw( const SaHpiBoolT &enables ); // this function must called with the global read lock held SaErrorT SetEventMasks( const SaHpiSensorEventMaskActionT &act, SaHpiEventStateT &AssertEventMask, SaHpiEventStateT &DeassertEventMask ); // this function must called with the global read lock held virtual SaErrorT SetEventMasksHw( const SaHpiEventStateT &AssertEventMask, const SaHpiEventStateT &DeassertEventMask ) = 0; protected: // this function must called with the global read lock held virtual SaErrorT SetEventMasksHw( cIpmiMsg &msg, bool evt_enable ); }; #endif openhpi-2.14.1/plugins/ipmidirect/ipmi_sdr.h0000644000076400007640000001070611302567000015760 0ustar /* * ipmi_sdr.h * * Copyright (c) 2003,2004 by FORCE Computers * Copyright (c) 2005 by ESO Technologies. * * Note that this file is based on parts of OpenIPMI * written by Corey Minyard * of MontaVista Software. Corey's code was helpful * and many thanks go to him. He gave the permission * to use this code in OpenHPI under BSD license. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Thomas Kanngieser * Pierre Sangouard */ #ifndef dIpmiSdr_h #define dIpmiSdr_h #include extern "C" { #include "SaHpi.h" } #include "glib.h" #ifndef dIpmiLog_h #include "ipmi_log.h" #endif #define dMaxSdrData 255 #define dSdrHeaderSize 5 // Max bytes to try to get at a time. #define dMaxSdrFetch 20 // Do up to this many retries when the reservation is lost. #define dMaxSdrFetchRetries 10 enum tIpmiSdrType { eSdrTypeUnknown = 0, eSdrTypeFullSensorRecord = 0x01, eSdrTypeCompactSensorRecord = 0x02, eSdrTypeEntityAssociationRecord = 0x08, eSdrTypeDeviceRelativeEntityAssociationRecord = 0x09, eSdrTypeGenericDeviceLocatorRecord = 0x10, eSdrTypeFruDeviceLocatorRecord = 0x11, eSdrTypeMcDeviceLocatorRecord = 0x12, eSdrTypeMcConfirmationRecord = 0x13, eSdrTypeBmcMessageChannelInfoRecord = 0x14, eSdrTypeOemRecord = 0xc0 }; const char *IpmiSdrTypeToName( tIpmiSdrType type ); class cIpmiSdr { public: unsigned short m_record_id; unsigned char m_major_version; unsigned char m_minor_version; tIpmiSdrType m_type; unsigned char m_length; unsigned char m_data[dMaxSdrData]; void Dump( cIpmiLog &dump, const char *name ) const; protected: void DumpFullSensor( cIpmiLog &dump ) const; void DumpFruDeviceLocator( cIpmiLog &dump ) const; void DumpMcDeviceLocator( cIpmiLog &dump ) const; }; enum tIpmiRepositorySdrUpdate { eIpmiRepositorySdrUpdateUnspecified = 0, eIpmiRepositorySdrUpdateNonModal = 1, eIpmiRepositorySdrUpdateModal = 2, eIpmiRepositorySdrUpdatBoth = 3 }; const char *IpmiRepositorySdrUpdateToString( tIpmiRepositorySdrUpdate val ); class cIpmiMc; class cIpmiSdrs { protected: cIpmiMc *m_mc; bool m_device_sdr; // Have the SDRs previously been fetched? bool m_fetched; // Information from the SDR Repository Info command, non-sensor // mode only. unsigned char m_major_version; unsigned char m_minor_version; unsigned int m_last_addition_timestamp; unsigned int m_last_erase_timestamp; bool m_overflow; tIpmiRepositorySdrUpdate m_update_mode; bool m_supports_delete_sdr; bool m_supports_partial_add_sdr; bool m_supports_reserve_sdr; bool m_supports_get_sdr_repository_allocation; // device SDR bool m_dynamic_population; bool m_lun_has_sensors[4]; unsigned int m_reservation; bool m_sdr_changed; // The actual current copy of the SDR repository. unsigned int m_num_sdrs; cIpmiSdr **m_sdrs; private: enum tReadRecord { eReadOk, eReadEndOfSdr, eReadReservationLost, eReadError }; SaErrorT ReadRecords( cIpmiSdr **&records, unsigned short &working_num_sdrs, unsigned int &num, unsigned int lun ); cIpmiSdr *ReadRecord( unsigned short record_id, unsigned short &next_record_id, tReadRecord &err, unsigned int lun ); GList *CreateFullSensorRecords( cIpmiSdr *sdr ); SaErrorT Reserve(unsigned int lun); int GetInfo( unsigned short &working_num_sdrs ); public: cIpmiSdrs( cIpmiMc *mc, bool device_sdr ); ~cIpmiSdrs(); unsigned int NumSdrs() const { return m_num_sdrs; } cIpmiSdr *Sdr( unsigned int i ) { assert( i < m_num_sdrs ); return m_sdrs[i]; } SaErrorT Fetch(); void Dump( cIpmiLog &dump, const char *name ) const; cIpmiSdr *FindSdr( cIpmiMc *mc ); unsigned int FindParentFru( SaHpiEntityTypeT type, SaHpiEntityLocationT instance, SaHpiEntityTypeT & parent_type, SaHpiEntityLocationT & parent_instance ); }; #endif openhpi-2.14.1/plugins/ipmidirect/ipmi_discover.cpp0000644000076400007640000004452311302567000017345 0ustar /* * ipmi_discover.cpp * * discover MCs * * Copyright (c) 2004 by FORCE Computers. * Copyright (c) 2005 by ESO Technologies. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Thomas Kanngieser * Pierre Sangouard * * This file contains: * 1. discover of MCs * 2. periodic polling of MCs * 3. periodic reading SEL * 4. handling of events */ #include "ipmi_domain.h" #include #include class cIpmiMcTask { public: cIpmiMcTask *m_next; tIpmiMcTask m_task; cTime m_timeout; void *m_userdata; cIpmiMcTask( tIpmiMcTask task, const cTime &timeout, void *userdata ) : m_next( 0 ), m_task( task ), m_timeout( timeout ), m_userdata( userdata ) {} }; cIpmiMcThread::cIpmiMcThread( cIpmiDomain *domain, unsigned char addr, unsigned int properties ) : m_domain( domain ), m_addr( addr ), m_mc( 0 ), m_properties( properties ), m_exit( false ), m_tasks( 0 ), m_sel( 0 ), m_events( 0 ) { } cIpmiMcThread::~cIpmiMcThread() { ClearMcTaskList(); } void cIpmiMcThread::WriteLock() { m_domain->WriteLock(); } void cIpmiMcThread::WriteUnlock() { m_domain->WriteUnlock(); } void cIpmiMcThread::AddMcTask( tIpmiMcTask task, const cTime &timeout, void *userdata ) { cIpmiMcTask *dt = new cIpmiMcTask( task, timeout, userdata ); cIpmiMcTask *prev = 0; cIpmiMcTask *current = m_tasks; // loop to right position while( current && current->m_timeout <= dt->m_timeout ) { prev = current; current = current->m_next; } if ( prev == 0 ) { // insert dt at first position m_tasks = dt; dt->m_next = current; } else { dt->m_next = current; prev->m_next = dt; } } void cIpmiMcThread::AddMcTask( tIpmiMcTask task, unsigned int ms, void *userdata ) { cTime timeout = cTime::Now(); timeout += ms; AddMcTask( task, timeout, userdata ); } bool cIpmiMcThread::RemMcTask( void *userdata ) { bool rv = false; cIpmiMcTask *prev = 0; cIpmiMcTask *current = m_tasks; // loop to right position while( current && current->m_userdata != userdata ) { prev = current; current = current->m_next; } if ( current && current->m_userdata ) { if ( prev == 0 ) m_tasks = current->m_next; else prev->m_next = current->m_next; delete current; rv = true; } else assert( 0 ); return rv; } void cIpmiMcThread::ClearMcTaskList() { while( m_tasks ) { cIpmiMcTask *dt = m_tasks; m_tasks = m_tasks->m_next; delete dt; } } void * cIpmiMcThread::Run() { stdlog << "starting MC thread " << m_addr << ".\n"; m_domain->m_mc_thread_lock.Lock(); m_domain->m_num_mc_threads++; m_domain->m_mc_thread_lock.Unlock(); if ( m_properties & dIpmiMcThreadInitialDiscover ) { if ( m_addr != dIpmiBmcSlaveAddr ) { stdlog << "Waiting for BMC discovery (" << m_addr << ").\n"; while ( m_domain->m_bmc_discovered == false ) { usleep( 100000 ); } stdlog << "BMC Discovery done, let's go (" << m_addr << ").\n"; } else { stdlog << "BMC Discovery Start\n"; } Discover(); m_domain->m_initial_discover_lock.Lock(); m_domain->m_initial_discover--; m_domain->m_initial_discover_lock.Unlock(); // clear initial discover flag m_properties &= ~dIpmiMcThreadInitialDiscover; if ( m_addr == dIpmiBmcSlaveAddr ) { stdlog << "BMC Discovery done\n"; m_domain->m_bmc_discovered = true; } } if ( ( m_mc && (m_properties & dIpmiMcThreadPollAliveMc ) ) || ( !m_mc && (m_properties & dIpmiMcThreadPollDeadMc ) ) ) PollAddr( m_mc ); // this is a hack, because // of the usleep calls and polling // of event queue and task list. while( !m_exit ) { // handling all events in the event // in the event queue HandleEvents(); usleep( 100000 ); // check for tasks to do while( m_tasks ) { cTime now = cTime::Now(); if ( now < m_tasks->m_timeout ) break; // timeout cIpmiMcTask *dt = m_tasks; m_tasks = m_tasks->m_next; (this->*dt->m_task)( dt->m_userdata ); delete dt; } } stdlog << "stop MC thread " << m_addr << ".\n"; m_domain->m_mc_thread_lock.Lock(); assert( m_domain->m_num_mc_threads > 0 ); m_domain->m_num_mc_threads--; m_domain->m_mc_thread_lock.Unlock(); return 0; } void cIpmiMcThread::Discover( cIpmiMsg *get_device_id_rsp ) { cIpmiAddr addr( eIpmiAddrTypeIpmb, 0, 0, m_addr ); cIpmiMsg gdi_rsp; if ( !get_device_id_rsp ) { // send a get device id cIpmiMsg msg( eIpmiNetfnApp, eIpmiCmdGetDeviceId ); // try sending the command only one time SaErrorT rv = m_domain->SendCommand( addr, msg, gdi_rsp, 1 ); if ( rv != SA_OK || gdi_rsp.m_data[0] != 0 ) return; get_device_id_rsp = &gdi_rsp; } stdlog << "MC at " << m_addr << " found:\n"; stdlog << "\tdevice id : " << get_device_id_rsp->m_data[1] << "\n"; stdlog << "\tdevice SDR : " << ((get_device_id_rsp->m_data[2] & 0x80) ? "yes" : "no") << "\n"; stdlog << "\tdevice revision : " << (get_device_id_rsp->m_data[2] & 0x0f ) << "\n"; stdlog << "\tdevice available : " << ((get_device_id_rsp->m_data[3] & 0x80) ? "update" : "normal operation" ) << "\n"; stdlog << "\tmajor FW revision : " << (get_device_id_rsp->m_data[3] & 0x7f) << "\n"; stdlog << "\tminor FW revision : " << (int)((get_device_id_rsp->m_data[4] >>4) & 0xf) << (int)(get_device_id_rsp->m_data[4] & 0xf) << "\n"; stdlog << "\tIPMI version : " << (int)(get_device_id_rsp->m_data[5] & 0xf) << "." << ((get_device_id_rsp->m_data[5] >> 4) & 0xf) << "\n"; stdlog << "\tchassis device : " << ((get_device_id_rsp->m_data[6] & 0x80) ? "yes" : "no") << "\n"; stdlog << "\tbridge : " << ((get_device_id_rsp->m_data[6] & 0x40) ? "yes" : "no") << "\n"; stdlog << "\tIPMB event generator : " << ((get_device_id_rsp->m_data[6] & 0x20) ? "yes" : "no") << "\n"; stdlog << "\tIPMB event receiver : " << ((get_device_id_rsp->m_data[6] & 0x10) ? "yes" : "no") << "\n"; stdlog << "\tFRU inventory data : " << ((get_device_id_rsp->m_data[6] & 0x08) ? "yes" : "no") << "\n"; stdlog << "\tSEL device : " << ((get_device_id_rsp->m_data[6] & 0x04) ? "yes" : "no") << "\n"; stdlog << "\tSDR repository device : " << ((get_device_id_rsp->m_data[6] & 0x02) ? "yes" : "no") << "\n"; stdlog << "\tsensor device : " << ((get_device_id_rsp->m_data[6] & 0x01) ? "yes" : "no") << "\n"; unsigned int mid = get_device_id_rsp->m_data[7] | (get_device_id_rsp->m_data[8] << 8) | (get_device_id_rsp->m_data[9] << 16); stdlog.Hex(); stdlog << "\tmanufacturer id : " << mid << "\n"; unsigned int pid = IpmiGetUint16( get_device_id_rsp->m_data + 10 ); stdlog << "\tproduct id : " << pid << "\n"; if ( m_mc ) { // m_mc should be NULL here // Let's clean up this mess stdlog << "m_mc not NULL !\n"; m_mc->Cleanup(); delete m_mc; m_mc = 0; return; } m_mc = new cIpmiMc( m_domain, addr ); int rrv = m_mc->GetDeviceIdDataFromRsp( *get_device_id_rsp ); if ( rrv ) { // If we couldn't handle the device data, just clean // it up stdlog << "couldn't handle the device data !\n"; m_mc->Cleanup(); delete m_mc; m_mc = 0; return; } m_mc->CheckTca(); if ( m_domain->IsTca() ) { // If board is not ATCA, just give up if (!m_mc->IsTcaMc()) { m_mc->Cleanup(); delete m_mc; m_mc = 0; return; } } if (( m_domain->m_enable_sel_on_all == false ) && ( addr.SlaveAddr() != dIpmiBmcSlaveAddr )) { stdlog << "Disabling SEL for MC " << addr.SlaveAddr() << "\n"; m_mc->SetSel(false); } cIpmiMcVendor *mv = cIpmiMcVendorFactory::GetFactory()->Get( mid, pid ); m_mc->SetVendor( mv ); if ( mv->InitMc( m_mc, *get_device_id_rsp ) == false ) { stdlog << "cannot initialize MC: " << (unsigned char)m_mc->GetAddress() << " !\n"; m_mc->Cleanup(); delete m_mc; m_mc = 0; return; } SaErrorT rv = m_mc->HandleNew(); if ( rv != SA_OK ) { stdlog << "ERROR while discover MC " << m_addr << ", giving up !\n"; m_mc->Cleanup(); delete m_mc; m_mc = 0; return; } WriteLock(); m_domain->AddMc( m_mc ); m_mc->Populate(); WriteUnlock(); if ( m_mc->SelDeviceSupport() ) { GList *new_events = m_mc->Sel()->GetEvents(); // We only care for events from the BMC SEL if (( m_addr == dIpmiBmcSlaveAddr ) && ( new_events )) m_domain->HandleEvents( new_events ); } if ( m_mc->SelDeviceSupport() ) { assert( m_sel == 0 ); stdlog << "addr " << m_addr << ": add read sel. cIpmiMcThread::Discover\n"; m_sel = m_mc->Sel(); AddMcTask( &cIpmiMcThread::ReadSel, m_domain->m_sel_rescan_interval, m_sel ); } } void cIpmiMcThread::HandleEvents() { bool loop = true; while( loop ) { cIpmiEvent *event = 0; m_events_lock.Lock(); if ( m_events ) { event = (cIpmiEvent *)m_events->data; m_events = g_list_remove( m_events, event ); } loop = m_events ? true : false; m_events_lock.Unlock(); if ( event ) { HandleEvent( event ); delete event; } } } void cIpmiMcThread::HandleEvent( cIpmiEvent *event ) { // can handle only events for that mc thread assert( event->m_data[4] == m_addr ); stdlog << "event: "; event->Dump( stdlog, "event" ); if ( event->m_type != 0x02 ) { stdlog << "remove event: unknown event type " << (unsigned char)event->m_type << " !\n"; return; } if ( (event->m_data[4] & 0x01) != 0 ) { stdlog << "remove event: system software event.\n"; return; } // reveive an event from an unknown MC // => discover if ( !m_mc ) { assert( m_sel == 0 ); // remove old task if ( ( m_mc && (m_properties & dIpmiMcThreadPollAliveMc ) ) || ( !m_mc && (m_properties & dIpmiMcThreadPollDeadMc ) ) ) { stdlog << "addr " << m_addr << ": rem poll. cIpmiMcThread::HandleEvent\n"; RemMcTask( m_mc ); } Discover(); // add new poll task if ( ( m_mc && (m_properties & dIpmiMcThreadPollAliveMc ) ) || ( !m_mc && (m_properties & dIpmiMcThreadPollDeadMc ) ) ) { stdlog << "addr " << m_addr << ": add poll. cIpmiMcThread::HandleEvent\n"; AddMcTask( &cIpmiMcThread::PollAddr, m_domain->m_mc_poll_interval, m_mc ); } } if ( m_mc == 0 ) { stdlog << "hotswap event without a MC !\n"; return; } cIpmiSensor *sensor = m_mc->FindSensor( (event->m_data[5] & 0x3), event->m_data[8] ); if ( sensor == 0 ) { stdlog << "sensor of event not found !\n"; return; } // hotswap event if ( event->m_data[7] == eIpmiSensorTypeAtcaHotSwap ) { cIpmiSensorHotswap *hs = dynamic_cast( sensor ); if ( !hs ) { stdlog << "Not a hotswap sensor !\n"; return; } HandleHotswapEvent( hs, event ); return; } sensor->HandleEvent( event ); } void cIpmiMcThread::HandleHotswapEvent( cIpmiSensorHotswap *sensor, cIpmiEvent *event ) { tIpmiFruState current_state = (tIpmiFruState)(event->m_data[10] & 0x0f); tIpmiFruState prev_state = (tIpmiFruState)(event->m_data[11] & 0x0f); unsigned int fru_id = event->m_data[12] & 0xff; stdlog << "hot swap event at MC " << m_addr << ", sensor " << sensor->Num() << ",FRU " << fru_id << ",M" << (int)prev_state << " -> M" << (int)current_state << ".\n"; if (sensor->Resource()->GetHotswapSensor() != sensor) { stdlog << "WARNING: sensor NOT resource hot swap sensor, discard event\n"; return; } if (sensor->Resource()->FruId() != fru_id) { stdlog << "WARNING: FRU id NOT resource FRU id, discard event\n"; return; } // remove old task if ( ( m_mc && (m_properties & dIpmiMcThreadPollAliveMc ) ) || ( !m_mc && (m_properties & dIpmiMcThreadPollDeadMc ) ) ) { stdlog << "addr " << m_addr << ": rem poll. cIpmiMcThread::HandleHotswapEvent\n"; RemMcTask( m_mc ); } sensor->Resource()->PicmgFruState() = current_state; sensor->HandleEvent( event ); switch (current_state) { case eIpmiFruStateNotInstalled: // We care only if it's the MC itself if ( sensor->Resource()->FruId() == 0 ) { // remove mc WriteLock(); if ( m_mc ) m_domain->CleanupMc( m_mc ); WriteUnlock(); m_mc = 0; } break; case eIpmiFruStateActivationRequest: if (sensor->Resource()->Domain()->InsertTimeout() == SAHPI_TIMEOUT_IMMEDIATE) { sensor->Resource()->Activate(); } else { sensor->Resource()->PolicyCanceled() = false; } break; case eIpmiFruStateDeactivationRequest: if (sensor->Resource()->ExtractTimeout() == SAHPI_TIMEOUT_IMMEDIATE) { sensor->Resource()->Deactivate(); } else { sensor->Resource()->PolicyCanceled() = false; } break; default: break; } if ( m_mc == 0 && m_sel ) { RemMcTask( m_sel ); m_sel = 0; } // add new poll task if ( ( m_mc && (m_properties & dIpmiMcThreadPollAliveMc ) ) || ( !m_mc && (m_properties & dIpmiMcThreadPollDeadMc ) ) ) { stdlog << "addr " << m_addr << ": add poll. cIpmiMcThread::HandleHotswapEvent\n"; AddMcTask( &cIpmiMcThread::PollAddr, m_domain->m_mc_poll_interval, m_mc ); } } void cIpmiMcThread::AddEvent( cIpmiEvent *event ) { m_events_lock.Lock(); m_events = g_list_append( m_events, event ); m_events_lock.Unlock(); } void cIpmiMcThread::PollAddr( void *userdata ) { cIpmiMc *mc = (cIpmiMc *)userdata; if ( m_domain->ConLogLevel( dIpmiConLogCmd ) ) stdlog << "poll MC at " << m_addr << ".\n"; // send a get device id cIpmiAddr addr( eIpmiAddrTypeIpmb, 0, 0, m_addr ); cIpmiMsg msg( eIpmiNetfnApp, eIpmiCmdGetDeviceId ); cIpmiMsg rsp; SaErrorT rv = m_domain->SendCommand( addr, msg, rsp, 3 ); if ( rv != SA_OK ) { if ( m_mc ) { stdlog << "communication lost: " << m_addr << " !\n"; if ( m_properties & dIpmiMcThreadCreateM0 ) { cIpmiSensorHotswap *hs = m_mc->FindHotswapSensor(); if ( hs ) { // generate an event hotswap event M0 cIpmiEvent *event = new cIpmiEvent; event->m_mc = m_mc; event->m_data[0] = 0; // timestamp event->m_data[1] = 0; event->m_data[2] = 0; event->m_data[3] = 0; event->m_data[4] = m_mc->GetAddress(); event->m_data[5] = 0; event->m_data[6] = 0x04; // message format event->m_data[7] = hs->SensorType(); event->m_data[8] = hs->Num(); event->m_data[9] = 0; // assertion event->m_data[10] = 0; // M0 event->m_data[11] = hs->Resource()->PicmgFruState() | (7 << 4); // communication lost event->m_data[12] = 0; // this is because HandleHotswapEvent first removes the PollAddr task if ( ( m_mc && (m_properties & dIpmiMcThreadPollAliveMc ) ) || ( !m_mc && (m_properties & dIpmiMcThreadPollDeadMc ) ) ) { stdlog << "addr " << m_addr << ": add poll. cIpmiMcThread::PollAddr\n"; AddMcTask( &cIpmiMcThread::PollAddr, m_domain->m_mc_poll_interval, m_mc ); } HandleHotswapEvent( hs, event ); delete event; return; } } m_domain->CleanupMc( mc ); m_mc = 0; } } else { if ( !mc ) // MC found. Discover( &rsp ); // else if ( m_mc ) // Periodically check the event receiver for existing MCs. // m_mc->CheckEventRcvr(); } if ( m_mc == 0 && m_sel ) { RemMcTask( m_sel ); m_sel = 0; } if ( ( m_mc && (m_properties & dIpmiMcThreadPollAliveMc ) ) || ( !m_mc && (m_properties & dIpmiMcThreadPollDeadMc ) ) ) { if ( m_domain->ConLogLevel( dIpmiConLogCmd ) ) stdlog << "addr " << m_addr << ": add poll. cIpmiMcThread::PollAddr\n"; AddMcTask( &cIpmiMcThread::PollAddr, m_domain->m_mc_poll_interval, m_mc ); } } void cIpmiMcThread::ReadSel( void *userdata ) { cIpmiSel *sel = (cIpmiSel *)userdata; GList *new_events = sel->GetEvents(); if ( m_domain->ConLogLevel( dIpmiConLogCmd ) ) stdlog << "addr " << m_addr << ": add sel reading. cIpmiMcThread::ReadSel\n"; // add myself to task list AddMcTask( &cIpmiMcThread::ReadSel, m_domain->m_sel_rescan_interval, userdata ); // We only care for events from the BMC SEL if (( m_addr == dIpmiBmcSlaveAddr ) && ( new_events )) m_domain->HandleEvents( new_events ); } openhpi-2.14.1/plugins/ipmidirect/ipmi_resource.cpp0000644000076400007640000003164111302567000017353 0ustar /* * ipmi_resource.cpp * * Copyright (c) 2004 by FORCE Computers. * Copyright (c) 2005 by ESO Technologies. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Thomas Kanngieser * Pierre Sangouard */ #include #include #include #include #include "ipmi_domain.h" cIpmiResource::cIpmiResource( cIpmiMc *mc, unsigned int fru_id ) : m_sel( false ), m_mc( mc ), m_fru_id( fru_id ), m_is_fru( false ), m_hotswap_sensor( 0 ), m_picmg_fru_state( eIpmiFruStateNotInstalled ), m_policy_canceled( true ), m_prev_prev_fru_state( eIpmiFruStateNotInstalled ), m_oem( 0 ), m_current_control_id( 0 ), m_populate( false ) { m_extract_timeout = Domain()->ExtractTimeout(); for( int i = 0; i < 256; i++ ) m_sensor_num[i] = -1; } cIpmiResource::~cIpmiResource() { } cIpmiDomain * cIpmiResource::Domain() const { return m_mc->Domain(); } SaErrorT cIpmiResource::SendCommand( const cIpmiMsg &msg, cIpmiMsg &rsp, unsigned int lun, int retries ) { return m_mc->SendCommand( msg, rsp, lun, retries ); } SaErrorT cIpmiResource::SendCommandReadLock( const cIpmiMsg &msg, cIpmiMsg &rsp, unsigned int lun, int retries ) { cIpmiResource *resource = this; cIpmiDomain *domain = Domain(); domain->ReadUnlock(); SaErrorT rv = SendCommand( msg, rsp, lun, retries ); domain->ReadLock(); if ( domain->VerifyResource( resource ) == false ) return SA_ERR_HPI_NOT_PRESENT; return rv; } SaErrorT cIpmiResource::SendCommandReadLock( cIpmiRdr *rdr, const cIpmiMsg &msg, cIpmiMsg &rsp, unsigned int lun, int retries ) { cIpmiDomain *domain = Domain(); domain->ReadUnlock(); SaErrorT rv = SendCommand( msg, rsp, lun, retries ); domain->ReadLock(); if ( domain->VerifyRdr( rdr ) == false ) return SA_ERR_HPI_NOT_PRESENT; return rv; } int cIpmiResource::CreateSensorNum( SaHpiSensorNumT num ) { int v = num; if ( m_sensor_num[v] != -1 ) { for( int i = 0xff; i >= 0; i-- ) if ( m_sensor_num[i] == -1 ) { v = i; break; } if ( m_sensor_num[v] != -1 ) { assert( 0 ); return -1; } } m_sensor_num[v] = num; return v; } bool cIpmiResource::Create( SaHpiRptEntryT &entry ) { stdlog << "add resource: " << m_entity_path << ".\n"; entry.EntryId = 0; // resource info SaHpiResourceInfoT &info = entry.ResourceInfo; memset( &info, 0, sizeof( SaHpiResourceInfoT ) ); entry.ResourceEntity = m_entity_path; entry.ResourceId = oh_uid_from_entity_path( &entry.ResourceEntity ); entry.ResourceCapabilities = SAHPI_CAPABILITY_RESOURCE; if ( m_sel ) entry.ResourceCapabilities |= SAHPI_CAPABILITY_EVENT_LOG; if ( m_is_fru == true ) { entry.ResourceCapabilities |= SAHPI_CAPABILITY_FRU; if ( m_fru_id == 0 ) { info.ResourceRev = (SaHpiUint8T)m_mc->DeviceRevision(); info.DeviceSupport = (SaHpiUint8T)m_mc->DeviceSupport(); info.ManufacturerId = (SaHpiManufacturerIdT)m_mc->ManufacturerId(); info.ProductId = (SaHpiUint16T)m_mc->ProductId(); info.FirmwareMajorRev = (SaHpiUint8T)m_mc->MajorFwRevision(); info.FirmwareMinorRev = (SaHpiUint8T)m_mc->MinorFwRevision(); info.AuxFirmwareRev = (SaHpiUint8T)m_mc->AuxFwRevision( 0 ); } // Reset supported on ATCA FRUs - Don't allow it on fru #0 of the active ShMC if ( m_mc->IsTcaMc() ) { if (!( (m_mc->GetAddress() == dIpmiBmcSlaveAddr) && (m_fru_id == 0) )) { entry.ResourceCapabilities |= SAHPI_CAPABILITY_RESET; } } else if ( m_mc->IsRmsBoard() ) { /*Rms enabling - 11/09/06 ARCress */ SaHpiEntityTypeT type = cIpmiEntityPath(m_entity_path).GetEntryType(0); if (type == SAHPI_ENT_SYSTEM_BOARD) { stdlog << "Enabling Reset on RMS type " << type << "\n"; entry.ResourceCapabilities |= SAHPI_CAPABILITY_RESET; entry.ResourceCapabilities |= SAHPI_CAPABILITY_POWER; } } } entry.HotSwapCapabilities = 0; entry.ResourceSeverity = SAHPI_OK; entry.ResourceFailed = SAHPI_FALSE; entry.ResourceTag = ResourceTag(); return true; } void cIpmiResource::Destroy() { SaHpiRptEntryT *rptentry; stdlog << "removing resource: " << m_entity_path << ").\n"; while( Num() ) { cIpmiRdr *rdr = GetRdr( 0 ); RemRdr( rdr ); delete rdr; } rptentry = oh_get_resource_by_id( Domain()->GetHandler()->rptcache, m_resource_id ); if ( !rptentry ) { stdlog << "Can't find resource in plugin cache !\n"; } else { // create remove event oh_event *e = (oh_event *)g_malloc0( sizeof( oh_event ) ); // remove sensors only if resource is FRU if ( rptentry->ResourceCapabilities & SAHPI_CAPABILITY_FRU ) { e->event.EventType = SAHPI_ET_HOTSWAP; if (e->resource.ResourceCapabilities & SAHPI_CAPABILITY_MANAGED_HOTSWAP) { e->event.EventDataUnion.HotSwapEvent.HotSwapState = SAHPI_HS_STATE_NOT_PRESENT; e->event.EventDataUnion.HotSwapEvent.PreviousHotSwapState = SAHPI_HS_STATE_NOT_PRESENT; } else { e->event.EventDataUnion.HotSwapEvent.HotSwapState = SAHPI_HS_STATE_NOT_PRESENT; e->event.EventDataUnion.HotSwapEvent.PreviousHotSwapState = SAHPI_HS_STATE_ACTIVE; } } else { e->event.EventType = SAHPI_ET_RESOURCE; e->event.EventDataUnion.ResourceEvent.ResourceEventType = SAHPI_RESE_RESOURCE_FAILURE; rptentry->ResourceFailed = SAHPI_TRUE; } e->event.Source = rptentry->ResourceId; oh_gettimeofday(&e->event.Timestamp); e->event.Severity = rptentry->ResourceSeverity; e->resource = *rptentry; stdlog << "cIpmiResource::Destroy OH_ET_RESOURCE_DEL Event resource " << m_resource_id << "\n"; Domain()->AddHpiEvent( e ); // remove resource from local cache int rv = oh_remove_resource( Domain()->GetHandler()->rptcache, m_resource_id ); if ( rv != 0 ) { stdlog << "Can't remove resource from plugin cache !\n"; } } m_mc->RemResource( this ); delete this; } cIpmiRdr * cIpmiResource::FindRdr( cIpmiMc *mc, SaHpiRdrTypeT type, unsigned int num, unsigned int lun ) { for( int i = 0; i < NumRdr(); i++ ) { cIpmiRdr *r = GetRdr( i ); if ( r->Mc() == mc && r->Type() == type && r->Num() == num && r->Lun() == lun ) return r; } return 0; } bool cIpmiResource::AddRdr( cIpmiRdr *rdr ) { stdlog << "adding rdr: " << rdr->EntityPath(); stdlog << " " << rdr->Num(); stdlog << " " << rdr->IdString() << "\n"; // set resource rdr->Resource() = this; // add rdr to resource Add( rdr ); // check for hotswap sensor cIpmiSensorHotswap *hs = dynamic_cast( rdr ); if ( hs ) { if (hs->EntityPath() == EntityPath()) { if ( m_hotswap_sensor ) stdlog << "WARNING: found a second hotswap sensor, discard it !\n"; else m_hotswap_sensor = hs; } else { stdlog << "WARNING: hotswap sensor ep " << hs->EntityPath() << "!= resource ep " << EntityPath() <<", discard it \n"; } } return true; } bool cIpmiResource::RemRdr( cIpmiRdr *rdr ) { int idx = Find( rdr ); if ( idx == -1 ) { stdlog << "user requested removal of a control" " from a resource, but the control was not there !\n"; return false; } if ( rdr == m_hotswap_sensor ) m_hotswap_sensor = 0; Rem( idx ); return true; } bool cIpmiResource::Populate() { if ( m_populate == false ) { // create rpt entry stdlog << "populate resource: " << EntityPath() << ".\n"; struct oh_event *e = (struct oh_event *)g_malloc0( sizeof( struct oh_event ) ); if ( Create( e->resource ) == false ) { g_free( e ); return false; } // assign the hpi resource id to ent, so we can find // the resource for a given entity m_resource_id = e->resource.ResourceId; // add the resource to the resource cache int rv = oh_add_resource( Domain()->GetHandler()->rptcache, &(e->resource), this, 1 ); if ( rv != 0 ) { stdlog << "Can't add resource to plugin cache !\n"; g_free( e ); return false; } for( int i = 0; i < NumRdr(); i++ ) { cIpmiRdr *rdr = GetRdr( i ); if ( rdr->Populate(&e->rdrs) == false ) return false; } // find updated resource in plugin cache SaHpiRptEntryT *resource = oh_get_resource_by_id( Domain()->GetHandler()->rptcache, m_resource_id ); if (!resource) return false; // Update resource in event accordingly memcpy(&e->resource, resource, sizeof (SaHpiRptEntryT)); if (e->resource.ResourceCapabilities & SAHPI_CAPABILITY_FRU) { e->event.EventType = SAHPI_ET_HOTSWAP; if (e->resource.ResourceCapabilities & SAHPI_CAPABILITY_MANAGED_HOTSWAP) { SaHpiHsStateT hpi_state = GetHpiState(); e->event.EventDataUnion.HotSwapEvent.HotSwapState = hpi_state; e->event.EventDataUnion.HotSwapEvent.PreviousHotSwapState = hpi_state; stdlog << "cIpmiResource::Populate SAHPI_ET_HOTSWAP Managed FRU Event resource " << m_resource_id << " State " << hpi_state << "\n"; } else { e->event.EventDataUnion.HotSwapEvent.HotSwapState = SAHPI_HS_STATE_ACTIVE; e->event.EventDataUnion.HotSwapEvent.PreviousHotSwapState = SAHPI_HS_STATE_ACTIVE; stdlog << "cIpmiResource::Populate SAHPI_ET_HOTSWAP FRU Event resource " << m_resource_id << "\n"; } } else { e->event.EventType = SAHPI_ET_RESOURCE; e->event.EventDataUnion.ResourceEvent.ResourceEventType = SAHPI_RESE_RESOURCE_ADDED; stdlog << "cIpmiResource::Populate SAHPI_ET_RESOURCE Event resource " << m_resource_id << "\n"; } e->event.Source = e->resource.ResourceId; e->event.Severity = e->resource.ResourceSeverity; oh_gettimeofday(&e->event.Timestamp); Domain()->AddHpiEvent( e ); m_populate = true; } return true; } void cIpmiResource::Activate() { cIpmiMsg msg( eIpmiNetfnPicmg, eIpmiCmdSetFruActivation ); msg.m_data_len = 3; msg.m_data[0] = dIpmiPicMgId; msg.m_data[1] = FruId(); msg.m_data[2] = dIpmiActivateFru; cIpmiMsg rsp; SaErrorT rv = SendCommand( msg, rsp ); if ( rv != SA_OK ) { stdlog << "Activate: could not send set FRU Activation: " << rv << " !\n"; } else if ( rsp.m_data_len < 2 || rsp.m_data[0] != eIpmiCcOk || rsp.m_data[1] != dIpmiPicMgId ) { stdlog << "Activate: IPMI error set FRU Activation: " << rsp.m_data[0] << " !\n"; } } void cIpmiResource::Deactivate() { cIpmiMsg msg( eIpmiNetfnPicmg, eIpmiCmdSetFruActivation ); msg.m_data_len = 3; msg.m_data[0] = dIpmiPicMgId; msg.m_data[1] = FruId(); msg.m_data[2] = dIpmiDeactivateFru; cIpmiMsg rsp; SaErrorT rv = SendCommand( msg, rsp ); if ( rv != SA_OK ) { stdlog << "Deactivate: could not send set FRU deactivation: " << rv << " !\n"; } else if ( rsp.m_data_len < 2 || rsp.m_data[0] != eIpmiCcOk || rsp.m_data[1] != dIpmiPicMgId ) { stdlog << "Deactivate: IPMI error set FRU deactivation: " << rsp.m_data[0] << " !\n"; } } SaHpiHsStateT cIpmiResource::GetHpiState() { cIpmiSensorHotswap *hs = GetHotswapSensor(); if ( hs == 0 ) return SAHPI_HS_STATE_NOT_PRESENT; tIpmiFruState picmg_state; SaErrorT rv = hs->GetPicmgState( picmg_state ); if ( rv != SA_OK ) return SAHPI_HS_STATE_NOT_PRESENT; PicmgFruState() = picmg_state; SaHpiHsStateT hpi_state; rv = hs->GetHpiState( hpi_state ); if ( rv != SA_OK ) return SAHPI_HS_STATE_NOT_PRESENT; return hpi_state; } openhpi-2.14.1/plugins/ipmidirect/ipmi_inventory_parser.cpp0000644000076400007640000005164211302567000021140 0ustar /* * ipmi_inventory_parser.cpp * * Copyright (c) 2004 by FORCE Computers * Copyright (c) 2005 by ESO Technologies. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Thomas Kanngieser * Pierre Sangouard */ #include "ipmi_inventory_parser.h" #include "ipmi_utils.h" #include #include unsigned char IpmiChecksum( const unsigned char *data, int size ) { unsigned char c = 0; while( size-- ) c += *data++; return c; } unsigned char IpmiChecksumMulti( const unsigned char *data, int size, unsigned char csum ) { unsigned char c = 0; while( size-- ) c += *data++; c += csum; return c; } static const char *inventory_record_type_map[] = { "Internal", "Chassis", "Board", "Product", "MultiRecord" }; const char * IpmiInventoryRecordTypeToString( tIpmiInventoryRecordType type ) { if ( type >= eIpmiInventoryRecordTypeLast ) return "Invalid"; return inventory_record_type_map[type]; } //////////////////////////////////////////////////////////// // cIpmiInventoryField //////////////////////////////////////////////////////////// cIpmiInventoryField::cIpmiInventoryField(SaHpiEntryIdT area_id, SaHpiEntryIdT field_id, SaHpiIdrFieldTypeT field_type) { m_idr_field.AreaId = area_id; m_idr_field.FieldId = field_id; m_idr_field.Type = field_type; m_idr_field.ReadOnly = SAHPI_TRUE; } cIpmiInventoryField::~cIpmiInventoryField() { } SaErrorT cIpmiInventoryField::ReadTextBuffer( const unsigned char *&data, unsigned int &size ) { if ( size < 1 ) return SA_ERR_HPI_INVALID_DATA; const unsigned char *d = m_ipmi_text_buffer.SetIpmi( data, true ); if ( d == 0 ) return SA_ERR_HPI_INVALID_DATA; m_idr_field.Field = m_ipmi_text_buffer; size -= d - data; data = d; return SA_OK; } void cIpmiInventoryField::SetAscii( char *str, int size ) { m_idr_field.Field.DataType = SAHPI_TL_TYPE_TEXT; m_idr_field.Field.Language = SAHPI_LANG_ENGLISH; m_idr_field.Field.DataLength = size; memcpy( m_idr_field.Field.Data, str, size ); } void cIpmiInventoryField::SetBinary( const unsigned char *data, unsigned int size ) { m_idr_field.Field.DataType = SAHPI_TL_TYPE_BINARY; m_idr_field.Field.Language = SAHPI_LANG_UNDEF; m_idr_field.Field.DataLength = size; memcpy( m_idr_field.Field.Data, data, size ); } //////////////////////////////////////////////////////////// // cIpmiInventoryAreaInternal //////////////////////////////////////////////////////////// cIpmiInventoryAreaInternal::cIpmiInventoryAreaInternal(SaHpiEntryIdT area_id) : cIpmiInventoryArea(area_id) { m_area_header.Type = SAHPI_IDR_AREATYPE_INTERNAL_USE; } cIpmiInventoryAreaInternal::~cIpmiInventoryAreaInternal() { } SaErrorT cIpmiInventoryAreaInternal::ParseFruArea( const unsigned char *data, unsigned int size ) { return SA_ERR_HPI_INVALID_DATA; } //////////////////////////////////////////////////////////// // cIpmiInventoryAreaMultiRecord //////////////////////////////////////////////////////////// cIpmiInventoryAreaMultiRecord::cIpmiInventoryAreaMultiRecord(SaHpiEntryIdT area_id) : cIpmiInventoryArea(area_id) { m_area_header.Type = SAHPI_IDR_AREATYPE_OEM; } cIpmiInventoryAreaMultiRecord::~cIpmiInventoryAreaMultiRecord() { } SaErrorT cIpmiInventoryAreaMultiRecord::ParseFruArea( const unsigned char *data, unsigned int size ) { cIpmiInventoryField *iif; unsigned int record_size; bool end_of_list = false; unsigned char record_type; unsigned char record_csum; do { if ( size < 5 ) return SA_ERR_HPI_INVALID_DATA; if ( IpmiChecksum(data, 5 )) { stdlog << "wrong Multirecord header area checksum !\n"; return SA_ERR_HPI_INVALID_DATA; } record_size = *(data+2); end_of_list = *(data+1) & 0x80; record_type = *data; record_csum = *(data+3); stdlog << "Multirecord type " << record_type << " size " << record_size << " EOL " << end_of_list << "\n"; data += 5; size -= 5; if ( record_size > size ) { stdlog << "wrong Multirecord area checksum !\n"; return SA_ERR_HPI_INVALID_DATA; } if ( IpmiChecksumMulti( data, record_size, record_csum ) ) { stdlog << "wrong Multirecord area checksum !\n"; return SA_ERR_HPI_INVALID_DATA; } if ( record_type >= eIpmiInventoryMultiRecordTypeOemFirst ) { iif = new cIpmiInventoryField( m_area_header.AreaId, m_field_id++, SAHPI_IDR_FIELDTYPE_CUSTOM); m_field_array.Add( iif ); iif->SetBinary( data, record_size ); } data += record_size; size -= record_size; } while (end_of_list == false); m_area_header.NumFields = m_field_array.Num(); return SA_OK; } //////////////////////////////////////////////////////////// // cIpmiInventoryAreaChassis //////////////////////////////////////////////////////////// cIpmiInventoryAreaChassis::cIpmiInventoryAreaChassis(SaHpiEntryIdT area_id) : cIpmiInventoryArea(area_id) { m_area_header.Type = SAHPI_IDR_AREATYPE_CHASSIS_INFO; } cIpmiInventoryAreaChassis::~cIpmiInventoryAreaChassis() { } static SaHpiIdrFieldTypeT ChassisInfoAreaFields[] = { SAHPI_IDR_FIELDTYPE_PART_NUMBER, SAHPI_IDR_FIELDTYPE_SERIAL_NUMBER, }; SaErrorT cIpmiInventoryAreaChassis::ParseFruArea( const unsigned char *data, unsigned int size ) { cIpmiInventoryField *iif; SaErrorT rv; unsigned int area_size = *(data+1)*8; if ( area_size > size ) { stdlog << "wrong chassis area length !\n"; return SA_ERR_HPI_INVALID_DATA; } if ( IpmiChecksum( data, *(data+1)*8 ) ) { stdlog << "wrong chassis area checksum !\n"; return SA_ERR_HPI_INVALID_DATA; } data += 2; size -= 2; if ( size < 1 ) return SA_ERR_HPI_INVALID_DATA; // Skip Chassis type data++; size--; for ( unsigned int i = 0; i < sizeof(ChassisInfoAreaFields)/sizeof(ChassisInfoAreaFields[0]); i++ ) { iif = new cIpmiInventoryField( m_area_header.AreaId, m_field_id++, ChassisInfoAreaFields[i]); m_field_array.Add( iif ); rv = iif->ReadTextBuffer( data, size ); if ( rv != SA_OK ) return rv; } while( true ) { if ( size < 1 ) return SA_ERR_HPI_INVALID_DATA; if ( *data == 0xc1 ) break; iif = new cIpmiInventoryField( m_area_header.AreaId, m_field_id++, SAHPI_IDR_FIELDTYPE_CUSTOM); m_field_array.Add( iif ); rv = iif->ReadTextBuffer( data, size ); if ( rv != SA_OK ) return rv; } m_area_header.NumFields = m_field_array.Num(); return SA_OK; } //////////////////////////////////////////////////////////// // cIpmiInventoryAreaBoard //////////////////////////////////////////////////////////// cIpmiInventoryAreaBoard::cIpmiInventoryAreaBoard(SaHpiEntryIdT area_id) : cIpmiInventoryArea(area_id) { m_area_header.Type = SAHPI_IDR_AREATYPE_BOARD_INFO; } cIpmiInventoryAreaBoard::~cIpmiInventoryAreaBoard() { } static SaHpiIdrFieldTypeT BoardInfoAreaFields[] = { SAHPI_IDR_FIELDTYPE_MANUFACTURER, SAHPI_IDR_FIELDTYPE_PRODUCT_NAME, SAHPI_IDR_FIELDTYPE_SERIAL_NUMBER, SAHPI_IDR_FIELDTYPE_PART_NUMBER, SAHPI_IDR_FIELDTYPE_FILE_ID, }; SaErrorT cIpmiInventoryAreaBoard::ParseFruArea( const unsigned char *data, unsigned int size ) { cIpmiInventoryField *iif; SaErrorT rv; unsigned int area_size = *(data+1)*8; if ( area_size > size ) { stdlog << "wrong board area length !\n"; return SA_ERR_HPI_INVALID_DATA; } if ( IpmiChecksum( data, *(data+1)*8 ) ) { stdlog << "wrong board area checksum !\n"; return SA_ERR_HPI_INVALID_DATA; } data += 2; size -= 2; if ( size < 4 ) return SA_ERR_HPI_INVALID_DATA; // Skip Language data++; size--; time_t mfg_time = (SaHpiTimeT)data[0] + (SaHpiTimeT)data[1] * 256 + (SaHpiTimeT)data[2] * 65536; size -= 3; data += 3; mfg_time *= 60; // create date offset struct tm tmt; tmt.tm_sec = 0; tmt.tm_min = 0; tmt.tm_hour = 0; tmt.tm_mday = 1; tmt.tm_mon = 0; tmt.tm_year = 96; tmt.tm_isdst = 0; mfg_time += mktime( &tmt ); char str[80]; IpmiDateTimeToString( mfg_time, str ); iif = new cIpmiInventoryField( m_area_header.AreaId, m_field_id++, SAHPI_IDR_FIELDTYPE_MFG_DATETIME); m_field_array.Add( iif ); iif->SetAscii ( str, strlen( str ) + 1 ); for ( unsigned int i = 0; i < sizeof(BoardInfoAreaFields)/sizeof(BoardInfoAreaFields[0]); i++ ) { iif = new cIpmiInventoryField( m_area_header.AreaId, m_field_id++, BoardInfoAreaFields[i]); m_field_array.Add( iif ); rv = iif->ReadTextBuffer( data, size ); if ( rv != SA_OK ) return rv; } while( true ) { if ( size < 1 ) return SA_ERR_HPI_INVALID_DATA; if ( *data == 0xc1 ) break; iif = new cIpmiInventoryField( m_area_header.AreaId, m_field_id++, SAHPI_IDR_FIELDTYPE_CUSTOM); m_field_array.Add( iif ); rv = iif->ReadTextBuffer( data, size ); if ( rv != SA_OK ) return rv; } m_area_header.NumFields = m_field_array.Num(); return SA_OK; } //////////////////////////////////////////////////////////// // cIpmiInventoryAreaProduct //////////////////////////////////////////////////////////// cIpmiInventoryAreaProduct::cIpmiInventoryAreaProduct(SaHpiEntryIdT area_id) : cIpmiInventoryArea(area_id) { m_area_header.Type = SAHPI_IDR_AREATYPE_PRODUCT_INFO; } cIpmiInventoryAreaProduct::~cIpmiInventoryAreaProduct() { } static SaHpiIdrFieldTypeT ProductInfoAreaFields[] = { SAHPI_IDR_FIELDTYPE_MANUFACTURER, SAHPI_IDR_FIELDTYPE_PRODUCT_NAME, SAHPI_IDR_FIELDTYPE_PART_NUMBER, SAHPI_IDR_FIELDTYPE_PRODUCT_VERSION, SAHPI_IDR_FIELDTYPE_SERIAL_NUMBER, SAHPI_IDR_FIELDTYPE_ASSET_TAG, SAHPI_IDR_FIELDTYPE_FILE_ID, }; SaErrorT cIpmiInventoryAreaProduct::ParseFruArea( const unsigned char *data, unsigned int size ) { cIpmiInventoryField *iif; SaErrorT rv; unsigned int area_size = *(data+1)*8; if ( area_size > size ) { stdlog << "wrong product area length !\n"; return SA_ERR_HPI_INVALID_DATA; } if ( IpmiChecksum( data, *(data+1)*8 ) ) { stdlog << "wrong product area checksum !\n"; return SA_ERR_HPI_INVALID_DATA; } data += 2; size -= 2; if ( size < 1 ) return SA_ERR_HPI_INVALID_DATA; // Skip Language data++; size--; for ( unsigned int i = 0; i < sizeof(ProductInfoAreaFields)/sizeof(ProductInfoAreaFields[0]); i++ ) { iif = new cIpmiInventoryField( m_area_header.AreaId, m_field_id++, ProductInfoAreaFields[i]); m_field_array.Add( iif ); rv = iif->ReadTextBuffer( data, size ); if ( rv != SA_OK ) return rv; } while( true ) { if ( size < 1 ) return SA_ERR_HPI_INVALID_DATA; if ( *data == 0xc1 ) break; iif = new cIpmiInventoryField( m_area_header.AreaId, m_field_id++, SAHPI_IDR_FIELDTYPE_CUSTOM); m_field_array.Add( iif ); rv = iif->ReadTextBuffer( data, size ); if ( rv != SA_OK ) return rv; } m_area_header.NumFields = m_field_array.Num(); return SA_OK; } //////////////////////////////////////////////////////////// // cIpmiInventoryArea //////////////////////////////////////////////////////////// cIpmiInventoryArea::cIpmiInventoryArea(SaHpiEntryIdT area_id) { m_area_header.AreaId = area_id; m_area_header.Type = SAHPI_IDR_AREATYPE_UNSPECIFIED; m_area_header.ReadOnly = SAHPI_TRUE; m_area_header.NumFields = 0; m_field_id = 1; } cIpmiInventoryArea::~cIpmiInventoryArea() { } cIpmiInventoryField * cIpmiInventoryArea::FindIdrField( SaHpiIdrFieldTypeT fieldtype, SaHpiEntryIdT fieldid ) { cIpmiInventoryField *iif; if ( fieldid == SAHPI_FIRST_ENTRY ) { for ( int i = 0; i < m_field_array.Num(); i++ ) { iif = m_field_array[i]; if (( fieldtype == SAHPI_IDR_FIELDTYPE_UNSPECIFIED ) || ( fieldtype == iif->FieldType() )) return iif; } } else { for( int i = 0; i < m_field_array.Num(); i++ ) { iif = m_field_array[i]; if ( iif->FieldId() == fieldid ) { if (( fieldtype == SAHPI_IDR_FIELDTYPE_UNSPECIFIED ) || ( fieldtype == iif->FieldType() )) return iif; break; } } } return NULL; } SaErrorT cIpmiInventoryArea::GetIdrField( SaHpiIdrFieldTypeT &fieldtype, SaHpiEntryIdT &fieldid, SaHpiEntryIdT &nextfieldid, SaHpiIdrFieldT &field ) { cIpmiInventoryField *iif = FindIdrField( fieldtype, fieldid ); if ( iif == NULL ) return SA_ERR_HPI_NOT_PRESENT; field = iif->Field(); int idx = m_field_array.Find( iif ); idx++; nextfieldid = SAHPI_LAST_ENTRY; for ( ; idx < m_field_array.Num(); idx++ ) { iif = m_field_array[idx]; if (( fieldtype == SAHPI_IDR_FIELDTYPE_UNSPECIFIED ) || ( fieldtype == iif->FieldType() )) { nextfieldid = iif->FieldId(); break; } } return SA_OK; } //////////////////////////////////////////////////////////// // cIpmiInventoryParser //////////////////////////////////////////////////////////// cIpmiInventoryParser::cIpmiInventoryParser() { m_idr_info.IdrId = 0; m_idr_info.UpdateCount = 0; m_idr_info.ReadOnly = SAHPI_TRUE; m_idr_info.NumAreas = 0; m_area_id = 1; } cIpmiInventoryParser::~cIpmiInventoryParser() { } cIpmiInventoryArea * cIpmiInventoryParser::AllocArea( SaHpiEntryIdT area_id, tIpmiInventoryRecordType type ) { switch( type ) { case eIpmiInventoryRecordTypeInternal: return new cIpmiInventoryAreaInternal( area_id ); case eIpmiInventoryRecordTypeChassis: return new cIpmiInventoryAreaChassis( area_id ); case eIpmiInventoryRecordTypeBoard: return new cIpmiInventoryAreaBoard( area_id ); case eIpmiInventoryRecordTypeProduct: return new cIpmiInventoryAreaProduct( area_id ); case eIpmiInventoryRecordTypeMultiRecord: return new cIpmiInventoryAreaMultiRecord( area_id ); default: break; } return NULL; } SaErrorT cIpmiInventoryParser::ParseFruInfo( const unsigned char *data, unsigned int size, unsigned int idr_id ) { cIpmiInventoryArea *ia; if ( size < 8 ) { stdlog << "Inventory data too short (" << size << " < 8) !\n"; return SA_ERR_HPI_INVALID_DATA; } // checksum of common header if ( IpmiChecksum( data, 8 ) ) { stdlog << "wrong common header checksum !\n"; stdlog.Hex( data, 8 ); stdlog << "\n"; return SA_ERR_HPI_INVALID_DATA; } // clear old m_area_array.Clear(); unsigned int pos = size; // No Internal support for now for( int i = 5; i >= 2; i-- ) { if ( data[i] == 0 ) continue; tIpmiInventoryRecordType type = (tIpmiInventoryRecordType)(i - 1); unsigned int offset = data[i] * 8; unsigned int len = pos - offset; stdlog << IpmiInventoryRecordTypeToString( type ) << ": offset " << offset << ", len " << len << "\n"; ia = AllocArea( m_area_id, type ); if ( ia ) { SaErrorT rv = ia->ParseFruArea( data + offset, len ); // If a FRU area is wrong just ignore it if ( rv ) delete ia; else { m_area_id++; m_area_array.Add( ia ); } } pos -= len; } m_idr_info.IdrId = idr_id; m_idr_info.UpdateCount++; m_idr_info.ReadOnly = SAHPI_TRUE; m_idr_info.NumAreas = m_area_array.Num(); return SA_OK; } cIpmiInventoryArea * cIpmiInventoryParser::FindIdrArea( SaHpiIdrAreaTypeT areatype, SaHpiEntryIdT areaid ) { cIpmiInventoryArea *ia; if ( areaid == SAHPI_FIRST_ENTRY ) { for ( int i = 0; i < m_area_array.Num(); i++ ) { ia = m_area_array[i]; if (( areatype == SAHPI_IDR_AREATYPE_UNSPECIFIED ) || ( areatype == ia->AreaType() )) return ia; } } else { for( int i = 0; i < m_area_array.Num(); i++ ) { ia = m_area_array[i]; if ( ia->AreaId() == areaid ) { if (( areatype == SAHPI_IDR_AREATYPE_UNSPECIFIED ) || ( areatype == ia->AreaType() )) return ia; break; } } } return NULL; } SaErrorT cIpmiInventoryParser::GetIdrInfo( SaHpiIdrIdT &idrid, SaHpiIdrInfoT &idrinfo ) { if ( m_idr_info.IdrId != idrid ) return SA_ERR_HPI_NOT_PRESENT; idrinfo = m_idr_info; return SA_OK; } SaErrorT cIpmiInventoryParser::GetIdrAreaHeader( SaHpiIdrIdT &idrid, SaHpiIdrAreaTypeT &areatype, SaHpiEntryIdT &areaid, SaHpiEntryIdT &nextareaid, SaHpiIdrAreaHeaderT &header ) { if ( m_idr_info.IdrId != idrid ) return SA_ERR_HPI_NOT_PRESENT; cIpmiInventoryArea *ia = FindIdrArea( areatype, areaid ); if ( ia == NULL ) return SA_ERR_HPI_NOT_PRESENT; header = ia->AreaHeader(); int idx = m_area_array.Find( ia ); idx++; nextareaid = SAHPI_LAST_ENTRY; for ( ; idx < m_area_array.Num(); idx++ ) { ia = m_area_array[idx]; if (( areatype == SAHPI_IDR_AREATYPE_UNSPECIFIED ) || ( areatype == ia->AreaType() )) { nextareaid = ia->AreaId(); break; } } return SA_OK; } SaErrorT cIpmiInventoryParser::AddIdrArea( SaHpiIdrIdT &idrid, SaHpiIdrAreaTypeT &areatype, SaHpiEntryIdT &areaid ) { if ( m_idr_info.IdrId != idrid ) return SA_ERR_HPI_NOT_PRESENT; // Read only support for the moment return SA_ERR_HPI_READ_ONLY; } SaErrorT cIpmiInventoryParser::DelIdrArea( SaHpiIdrIdT &idrid, SaHpiEntryIdT &areaid ) { if ( m_idr_info.IdrId != idrid ) return SA_ERR_HPI_NOT_PRESENT; cIpmiInventoryArea *ia = FindIdrArea( SAHPI_IDR_AREATYPE_UNSPECIFIED, areaid ); if ( ia == NULL ) return SA_ERR_HPI_NOT_PRESENT; // Read only support for the moment return SA_ERR_HPI_READ_ONLY; } SaErrorT cIpmiInventoryParser::GetIdrField( SaHpiIdrIdT &idrid, SaHpiEntryIdT &areaid, SaHpiIdrFieldTypeT &fieldtype, SaHpiEntryIdT &fieldid, SaHpiEntryIdT &nextfieldid, SaHpiIdrFieldT &field ) { if ( m_idr_info.IdrId != idrid ) return SA_ERR_HPI_NOT_PRESENT; cIpmiInventoryArea *ia = FindIdrArea( SAHPI_IDR_AREATYPE_UNSPECIFIED, areaid ); if ( ia == NULL ) return SA_ERR_HPI_NOT_PRESENT; return ia->GetIdrField( fieldtype, fieldid, nextfieldid, field ); } SaErrorT cIpmiInventoryParser::AddIdrField( SaHpiIdrIdT &idrid, SaHpiIdrFieldT &field ) { if ( m_idr_info.IdrId != idrid ) return SA_ERR_HPI_NOT_PRESENT; cIpmiInventoryArea *ia = FindIdrArea( SAHPI_IDR_AREATYPE_UNSPECIFIED, field.AreaId ); if ( ia == NULL ) return SA_ERR_HPI_NOT_PRESENT; // Read only support for the moment return SA_ERR_HPI_READ_ONLY; } SaErrorT cIpmiInventoryParser::SetIdrField( SaHpiIdrIdT &idrid, SaHpiIdrFieldT &field ) { if ( m_idr_info.IdrId != idrid ) return SA_ERR_HPI_NOT_PRESENT; cIpmiInventoryArea *ia = FindIdrArea( SAHPI_IDR_AREATYPE_UNSPECIFIED, field.AreaId ); if ( ia == NULL ) return SA_ERR_HPI_NOT_PRESENT; // Read only support for the moment return SA_ERR_HPI_READ_ONLY; } SaErrorT cIpmiInventoryParser::DelIdrField( SaHpiIdrIdT &idrid, SaHpiEntryIdT &areaid, SaHpiEntryIdT &fieldid ) { if ( m_idr_info.IdrId != idrid ) return SA_ERR_HPI_NOT_PRESENT; cIpmiInventoryArea *ia = FindIdrArea( SAHPI_IDR_AREATYPE_UNSPECIFIED, areaid ); if ( ia == NULL ) return SA_ERR_HPI_NOT_PRESENT; // Read only support for the moment return SA_ERR_HPI_READ_ONLY; } openhpi-2.14.1/plugins/ipmidirect/ipmi_event.h0000644000076400007640000000403411302567000016306 0ustar /* * * Copyright (c) 2003 by FORCE Computers * * Note that this file is based on parts of OpenIPMI * written by Corey Minyard * of MontaVista Software. Corey's code was helpful * and many thanks go to him. He gave the permission * to use this code in OpenHPI under BSD license. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Thomas Kanngieser */ #ifndef dIpmiEvent_h #define dIpmiEvent_h #ifndef dIpmiLog_h #include "ipmi_log.h" #endif enum tIpmiEventType { eIpmiEventData0 = 0, eIpmiEventData1, eIpmiEventData2, eIpmiEventData3 }; // Event types and directions for sensors. enum tIpmiThresh { eIpmiLowerNonCritical = 0, eIpmiLowerCritical, eIpmiLowerNonRecoverable, eIpmiUpperNonCritical, eIpmiUpperCritical, eIpmiUpperNonRecoverable }; const char *IpmiThresToString( tIpmiThresh val ); void IpmiThresholdMaskToString( unsigned int mask, char *str ); // The event state is which events are set and cleared for the given // sensor. Events are enumerated for threshold events and numbered // for discrete events. Use the provided functions to initialize, // read, and modify an event state. #define dIpmiSensorEventsEnabled 0x80 #define dIpmiSensorScanningEnabled 0x40 #define dIpmiSensorBusy 0x20 // Maximum amount of data allowed in a SEL. #define dIpmiMaxSelData 13 class cIpmiMc; // An entry from the system event log. class cIpmiEvent { public: cIpmiMc *m_mc; // The MC this event is stored in. unsigned int m_record_id; unsigned int m_type; unsigned char m_data[dIpmiMaxSelData]; public: cIpmiEvent(); int Cmp( const cIpmiEvent &event ) const; void Dump( cIpmiLog &dump, const char *name ) const; }; #endif openhpi-2.14.1/plugins/ipmidirect/ipmi_sensor_threshold.cpp0000644000076400007640000011277611302567000021122 0ustar /* * ipmi_sensor_threshold.cpp * * Copyright (c) 2004 by FORCE Computers * Copyright (c) 2005 by ESO Technologies. * * Note that this file is based on parts of OpenIPMI * written by Corey Minyard * of MontaVista Software. Corey's code was helpful * and many thanks go to him. He gave the permission * to use this code in OpenHPI under BSD license. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Thomas Kanngieser * Pierre Sangouard */ #include "ipmi_sensor_threshold.h" #include "ipmi_log.h" #include "ipmi_domain.h" #include #include #include #include #include static const char *hysteresis_support_types[] = { "None", "Readable", "Settable", "Fixed", }; const char * IpmiHysteresisSupportToString( tIpmiHysteresisSupport val ) { if ( val > eIpmiHysteresisSupportFixed ) return "Invalid"; return hysteresis_support_types[val]; } static const char *threshold_access_support_types[] = { "None", "Readable", "Settable", "Fixed", }; const char * IpmiThresholdAccessSupportToString( tIpmiThresholdAccessSuport val ) { if ( val > eIpmiThresholdAccessSupportFixed ) return "Invalid"; return threshold_access_support_types[val]; } static void AddOrStr( char *str, const char *s ) { if ( *str ) strcat( str, " | " ); strcat( str, s ); } void IpmiThresholdEventMaskToString( unsigned short em, char *str ) { *str = 0; if ( em & dIpmiEventLowerNonCriticalLow ) AddOrStr( str, "LowerNonCriticalLow" ); if ( em & dIpmiEventLowerNonCriticalHigh ) AddOrStr( str, "LowerNonCriticalHigh" ); if ( em & dIpmiEventLowerCriticalLow ) AddOrStr( str, "LowerCriticalLow" ); if ( em & dIpmiEventLowerCriticalHigh ) AddOrStr( str, "LowerCriticalHigh" ); if ( em & dIpmiEventLowerNonRecoverableLow ) AddOrStr( str, "LowerNonRecoverableLow" ); if ( em & dIpmiEventLowerNonRecoverableHigh ) AddOrStr( str, "LowerNonRecoverableHigh" ); if ( em & dIpmiEventUpperNonCriticalLow ) AddOrStr( str, "UpperNonCriticalLow" ); if ( em & dIpmiEventUpperCriticalHigh ) AddOrStr( str, "UpperCriticalHigh" ); if ( em & dIpmiEventUpperNonRecoverableLow ) AddOrStr( str, "UpperNonRecoverableLow" ); if ( em & dIpmiEventUpperNonRecoverableHigh ) AddOrStr( str, "UpperNonRecoverableHigh" ); } static const char *rate_unit[] = { "None", "Us" "Ms" "Second", "Minute", "Hour", "Day" }; #define dNumRateUnit (sizeof(rate_unit)/sizeof(char *)) const char * IpmiRateUnitToString( tIpmiRateUnit val ) { if ( val > (int)dNumRateUnit ) return "Invalid"; return rate_unit[val]; } const char *modifier_unit_map[] = { "None", "BasicDivModifier", "BasicMulModifier" }; #define dNumModifierUnit (sizeof(modifier_unit_map)/sizeof(char *)) const char * IpmiModifierUnitToString( tIpmiModifierUnit unit ) { if ( unit > (int)dNumModifierUnit ) return "Invalid"; return modifier_unit_map[unit]; } static const char *unit_types[] = { "Unspecified", "C", "F", "K", "Volts", "Amps", "Watts", "Joules", "Coulombs", "VA", "Nits", "Lumens", "Lux", "Candela", "Kpa", "Psi", "Newtons", "Cfm", "Rpm", "Hz", "Useconds", "Mseconds", "Seconds", "Minute", "Hour", "Day", "Week", "Mil", "Inches", "Feet", "CubicInchs", "CubicFeet", "Millimeters", "Centimeters", "Meters", "CubicCentimeters" "cubic meters", "Liters", "FluidOunces", "Radians", "Seradians", "Revolutions", "Cycles", "Gravities", "Ounces", "Pounds", "FootPounds", "OunceInches", "Gauss", "Gilberts", "Henries", "Mhenries", "Farads", "Ufarads", "Ohms", "Siemens", "Moles", "Becquerels", "Ppm", "Unspecified", "Decibels", "Dba", "Dbc", "Grays", "Sieverts", "ColorTempDegK", "Bits", "Kbits", "Mbits", "Gbits", "Bytes", "Kbytes", "Mbytes", "Gbytes", "Words", "Dwords", "Qwords", "Lines", "Hits", "Misses", "Retries", "Resets", "Overruns", "Underruns", "Collisions", "Packets", "Messages", "Characters", "Errors", "CorrectableErrors", "UncorrectableErrors" }; #define dNumUnitTypes (sizeof(unit_types)/sizeof(char *)) const char * IpmiUnitTypeToString( tIpmiUnitType val ) { if ( val > (int)dNumUnitTypes ) return "invalid"; return unit_types[val]; } cIpmiSensorThreshold::cIpmiSensorThreshold( cIpmiMc *mc ) : cIpmiSensor( mc ), m_sensor_init_thresholds( false ), m_sensor_init_hysteresis( false ), m_hysteresis_support( eIpmiHysteresisSupportNone ), m_threshold_access( eIpmiThresholdAccessSupportNone ), m_threshold_readable( 0 ), m_threshold_settable( 0 ), m_rate_unit( eIpmRateUnitNone ), m_modifier_unit_use( eIpmiModifierUnitNone ), m_percentage( false ), m_base_unit( eIpmiUnitTypeUnspecified ), m_modifier_unit( eIpmiUnitTypeUnspecified ), m_normal_min_specified( false ), m_normal_max_specified( false ), m_nominal_reading_specified( false ), m_nominal_reading( 0 ), m_normal_max( 0 ), m_normal_min( 0 ), m_sensor_max( 0 ), m_sensor_min( 0 ), m_upper_non_recoverable_threshold( 0 ), m_upper_critical_threshold( 0 ), m_upper_non_critical_threshold( 0 ), m_lower_non_recoverable_threshold( 0 ), m_lower_critical_threshold( 0 ), m_lower_non_critical_threshold( 0 ), m_positive_going_threshold_hysteresis( 0 ), m_negative_going_threshold_hysteresis( 0 ), m_sensor_factors( 0 ) { } cIpmiSensorThreshold::~cIpmiSensorThreshold() { if ( m_sensor_factors ) delete m_sensor_factors; } bool cIpmiSensorThreshold::GetDataFromSdr( cIpmiMc *mc, cIpmiSdr *sdr ) { if ( !cIpmiSensor::GetDataFromSdr( mc, sdr ) ) return false; m_sensor_init_thresholds = (sdr->m_data[10] >> 4) & 1; m_sensor_init_hysteresis = (sdr->m_data[10] >> 3) & 1; m_hysteresis_support = (tIpmiHysteresisSupport)((sdr->m_data[11] >> 4) & 3); m_threshold_access = (tIpmiThresholdAccessSuport)((sdr->m_data[11] >> 2) & 3); // assertion unsigned int val = IpmiGetUint16( sdr->m_data + 14 ); m_assertion_event_mask = val & dIpmiEventMask; m_current_hpi_assert_mask = GetEventMask( m_assertion_event_mask ); m_hpi_assert_mask = m_current_hpi_assert_mask; m_reading_mask = (val >> 12) & 7; // deassertion val = IpmiGetUint16( sdr->m_data + 16 ); m_deassertion_event_mask = val & dIpmiEventMask; m_current_hpi_deassert_mask = GetEventMask( m_deassertion_event_mask ); m_hpi_deassert_mask = m_current_hpi_deassert_mask; m_reading_mask |= ((val >> 12) & 7 ) << 3; val = IpmiGetUint16( sdr->m_data + 18 ); m_threshold_readable = val & 0x3f; m_threshold_settable = (val >> 8) & 0x3f; m_rate_unit = (tIpmiRateUnit)((sdr->m_data[20] >> 3) & 7); m_modifier_unit_use = (tIpmiModifierUnit)((sdr->m_data[20] >> 1) & 3); m_percentage = sdr->m_data[20] & 1; m_base_unit = (tIpmiUnitType)sdr->m_data[21]; m_modifier_unit = (tIpmiUnitType)sdr->m_data[22]; m_sensor_factors = CreateSensorFactors( mc, sdr ); if ( !m_sensor_factors ) return false; m_normal_min_specified = (sdr->m_data[30] >> 2) & 1; m_normal_max_specified = (sdr->m_data[30] >> 1) & 1; m_nominal_reading_specified = sdr->m_data[30] & 1; m_nominal_reading = sdr->m_data[31]; m_normal_max = sdr->m_data[32]; m_normal_min = sdr->m_data[33]; m_sensor_max = sdr->m_data[34]; m_sensor_min = sdr->m_data[35]; m_upper_non_recoverable_threshold = sdr->m_data[36]; m_upper_critical_threshold = sdr->m_data[37]; m_upper_non_critical_threshold = sdr->m_data[38]; m_lower_non_recoverable_threshold = sdr->m_data[39]; m_lower_critical_threshold = sdr->m_data[40]; m_lower_non_critical_threshold = sdr->m_data[41]; m_positive_going_threshold_hysteresis = sdr->m_data[42]; m_current_positive_hysteresis = m_positive_going_threshold_hysteresis; m_negative_going_threshold_hysteresis = sdr->m_data[43]; m_current_negative_hysteresis = m_negative_going_threshold_hysteresis; double d1, d2; m_sensor_factors->ConvertFromRaw( 1, d1, false ); m_sensor_factors->ConvertFromRaw( 2, d2, false ); if (d2 < d1) m_swap_thresholds = true; else m_swap_thresholds = false; return true; } cIpmiSensorFactors * cIpmiSensorThreshold::CreateSensorFactors( cIpmiMc *mc, cIpmiSdr *sdr ) { cIpmiSensorFactors *f= new cIpmiSensorFactors; if ( !f->GetDataFromSdr( sdr ) ) { delete f; return 0; } return f; } void cIpmiSensorThreshold::HandleNew( cIpmiDomain *domain ) { m_rate_unit_string = IpmiRateUnitToString( m_rate_unit ); m_base_unit_string = IpmiUnitTypeToString( m_base_unit ); m_modifier_unit_string = IpmiUnitTypeToString( m_modifier_unit ); cIpmiSensor::HandleNew( domain ); } bool cIpmiSensorThreshold::Cmp( const cIpmiSensor &s2 ) const { if ( cIpmiSensor::Cmp( s2 ) == false ) return false; const cIpmiSensorThreshold *t = dynamic_cast( &s2 ); if ( !t ) return false; if ( m_sensor_init_thresholds != t->m_sensor_init_thresholds ) return false; if ( m_sensor_init_hysteresis != t->m_sensor_init_hysteresis ) return false; if ( m_hysteresis_support != t->m_hysteresis_support ) return false; if ( m_threshold_access != t->m_threshold_access ) return false; if ( m_assertion_event_mask != t->m_assertion_event_mask ) return false; if ( m_deassertion_event_mask != t->m_deassertion_event_mask ) return false; if ( m_reading_mask != t->m_reading_mask ) return false; if ( m_threshold_readable != t->m_threshold_readable ) return false; if ( m_threshold_settable != t->m_threshold_settable ) return false; if ( m_rate_unit != t->m_rate_unit ) return false; if ( m_modifier_unit_use != t->m_modifier_unit_use ) return false; if ( m_percentage != t->m_percentage ) return false; if ( m_base_unit != t->m_base_unit ) return false; if ( m_modifier_unit != t->m_modifier_unit ) return false; bool sf1 = m_sensor_factors ? true : false; bool sf2 = t->m_sensor_factors ? true : false; if ( sf1 != sf2 ) return false; if ( m_sensor_factors ) if ( m_sensor_factors->Cmp( *t->m_sensor_factors ) == false ) return false; if ( m_normal_min_specified != t->m_normal_min_specified ) return false; if ( m_normal_max_specified != t->m_normal_max_specified ) return false; if ( m_nominal_reading_specified != t->m_nominal_reading_specified ) return false; if ( m_nominal_reading != t->m_nominal_reading ) return false; if ( m_normal_max != t->m_normal_max ) return false; if ( m_normal_min != t->m_normal_min ) return false; if ( m_sensor_max != t->m_sensor_max ) return false; if ( m_sensor_min != t->m_sensor_min ) return false; if ( m_upper_non_recoverable_threshold != t->m_upper_non_recoverable_threshold ) return false; if ( m_upper_critical_threshold != t->m_upper_critical_threshold ) return false; if ( m_upper_non_critical_threshold != t->m_upper_non_critical_threshold ) return false; if ( m_lower_non_recoverable_threshold != t->m_lower_non_recoverable_threshold ) return false; if ( m_lower_critical_threshold != t->m_lower_critical_threshold ) return false; if ( m_lower_non_critical_threshold != t->m_lower_non_critical_threshold ) return false; if ( m_positive_going_threshold_hysteresis != t->m_positive_going_threshold_hysteresis ) return false; if ( m_negative_going_threshold_hysteresis != t->m_negative_going_threshold_hysteresis ) return false; return true; } bool cIpmiSensorThreshold::IsThresholdReadable( tIpmiThresh event ) { return m_threshold_readable & ( 1 << event ); } bool cIpmiSensorThreshold::IsThresholdSettable( tIpmiThresh event ) { return m_threshold_settable & ( 1 << event ); } static void SwapEventState( SaHpiEventStateT &event_state ) { switch (event_state) { case SAHPI_ES_LOWER_MINOR: event_state = SAHPI_ES_UPPER_MINOR; break; case SAHPI_ES_LOWER_MAJOR: event_state = SAHPI_ES_UPPER_MAJOR; break; case SAHPI_ES_LOWER_CRIT: event_state = SAHPI_ES_UPPER_CRIT; break; case SAHPI_ES_UPPER_MINOR: event_state = SAHPI_ES_LOWER_MINOR; break; case SAHPI_ES_UPPER_MAJOR: event_state = SAHPI_ES_LOWER_MAJOR; break; case SAHPI_ES_UPPER_CRIT: event_state = SAHPI_ES_LOWER_CRIT; break; } } SaErrorT cIpmiSensorThreshold::CreateEvent( cIpmiEvent *event, SaHpiEventT &h ) { SaErrorT rv = cIpmiSensor::CreateEvent( event, h ); if ( rv != SA_OK ) return rv; // sensor event SaHpiSensorEventT &se = h.EventDataUnion.SensorEvent; se.Assertion = (SaHpiBoolT)!(event->m_data[9] & 0x80); tIpmiThresh threshold = (tIpmiThresh)((event->m_data[10] >> 1) & 0x07); switch( threshold ) { case eIpmiLowerNonCritical: se.EventState = SAHPI_ES_LOWER_MINOR; h.Severity = SAHPI_MINOR; break; case eIpmiLowerCritical: se.EventState = SAHPI_ES_LOWER_MAJOR; h.Severity = SAHPI_MAJOR; break; case eIpmiLowerNonRecoverable: se.EventState = SAHPI_ES_LOWER_CRIT; h.Severity = SAHPI_CRITICAL; break; case eIpmiUpperNonCritical: se.EventState = SAHPI_ES_UPPER_MINOR; h.Severity = SAHPI_MINOR; break; case eIpmiUpperCritical: se.EventState = SAHPI_ES_UPPER_MAJOR; h.Severity = SAHPI_MAJOR; break; case eIpmiUpperNonRecoverable: se.EventState = SAHPI_ES_UPPER_CRIT; h.Severity = SAHPI_CRITICAL; break; default: stdlog << "Invalid threshold giving !\n"; se.EventState = SAHPI_ES_UNSPECIFIED; } if ( SwapThresholds() == true ) { SwapEventState( se.EventState ); } SaHpiSensorOptionalDataT optional_data = 0; // byte 2 tIpmiEventType type = (tIpmiEventType)(event->m_data[10] >> 6); if ( type == eIpmiEventData1 ) { ConvertToInterpreted( event->m_data[11], se.TriggerReading ); optional_data |= SAHPI_SOD_TRIGGER_READING; } else if ( type == eIpmiEventData2 ) { se.Oem = (SaHpiUint32T)event->m_data[11]; optional_data |= SAHPI_SOD_OEM; } else if ( type == eIpmiEventData3 ) { se.SensorSpecific = (SaHpiUint32T)event->m_data[11]; optional_data |= SAHPI_SOD_SENSOR_SPECIFIC; } // byte 3 type = (tIpmiEventType)((event->m_data[10] & 0x30) >> 4); if ( type == eIpmiEventData1 ) { ConvertToInterpreted( event->m_data[12], se.TriggerThreshold ); optional_data |= SAHPI_SOD_TRIGGER_THRESHOLD; } else if ( type == eIpmiEventData2 ) { se.Oem |= (SaHpiUint32T)((event->m_data[12] << 8) & 0xff00); optional_data |= SAHPI_SOD_OEM; } else if ( type == eIpmiEventData3 ) { se.SensorSpecific |= (SaHpiUint32T)((event->m_data[12] << 8) & 0xff00); optional_data |= SAHPI_SOD_SENSOR_SPECIFIC; } se.OptionalDataPresent = optional_data; return SA_OK; } void cIpmiSensorThreshold::Dump( cIpmiLog &dump ) const { cIpmiSensor::Dump( dump ); dump << "\tthreshold_access " << IpmiThresholdAccessSupportToString( m_threshold_access ) << ", hysteresis_support " << IpmiHysteresisSupportToString( m_hysteresis_support ) << " \n"; } unsigned short cIpmiSensorThreshold::GetEventMask(unsigned int ipmi_event_mask) { // convert ipmi event mask to hpi event mask unsigned short amask = ipmi_event_mask; unsigned short mask = 0; for( int i = 0; i < 12; i++ ) if ( amask & (1 <ConvertToRaw( cIpmiSensorFactors::eRoundNormal, (double)r.Value.SensorFloat64, raw, is_hysteresis, SwapThresholds() ) ) return SA_ERR_HPI_INVALID_DATA; v = (unsigned char)raw; return SA_OK; } void cIpmiSensorThreshold::ConvertToInterpreted( unsigned int v, SaHpiSensorReadingT &r ) { ConvertToInterpreted( v, r, false ); } void cIpmiSensorThreshold::ConvertToInterpreted( unsigned int v, SaHpiSensorReadingT &r, bool is_hysteresis) { memset( &r, 0, sizeof( SaHpiSensorReadingT ) ); double d; r.IsSupported = SAHPI_FALSE; if ( m_sensor_factors->ConvertFromRaw( v, d, is_hysteresis ) ) { r.IsSupported = SAHPI_TRUE; r.Type = SAHPI_SENSOR_READING_TYPE_FLOAT64; r.Value.SensorFloat64 = (SaHpiFloat64T)d; } } void static SwapThresholdsMask( SaHpiSensorThdMaskT &threshold_mask ) { SaHpiSensorThdMaskT temp_mask; temp_mask = threshold_mask; threshold_mask = 0; if (temp_mask & SAHPI_STM_LOW_MINOR) threshold_mask |= SAHPI_STM_UP_MINOR; if (temp_mask & SAHPI_STM_LOW_MAJOR) threshold_mask |= SAHPI_STM_UP_MAJOR; if (temp_mask & SAHPI_STM_LOW_CRIT) threshold_mask |= SAHPI_STM_UP_CRIT; if (temp_mask & SAHPI_STM_UP_MINOR) threshold_mask |= SAHPI_STM_LOW_MINOR; if (temp_mask & SAHPI_STM_UP_MAJOR) threshold_mask |= SAHPI_STM_LOW_MAJOR; if (temp_mask & SAHPI_STM_UP_CRIT) threshold_mask |= SAHPI_STM_LOW_CRIT; if (temp_mask & SAHPI_STM_UP_HYSTERESIS) threshold_mask |= SAHPI_STM_LOW_HYSTERESIS; if (temp_mask & SAHPI_STM_LOW_HYSTERESIS) threshold_mask |= SAHPI_STM_UP_HYSTERESIS; } bool cIpmiSensorThreshold::CreateRdr( SaHpiRptEntryT &resource, SaHpiRdrT &rdr ) { if ( cIpmiSensor::CreateRdr( resource, rdr ) == false ) return false; SaHpiSensorRecT &rec = rdr.RdrTypeUnion.SensorRec; // data format rec.DataFormat.IsSupported = SAHPI_TRUE; rec.DataFormat.ReadingType = SAHPI_SENSOR_READING_TYPE_FLOAT64; rec.DataFormat.BaseUnits = (SaHpiSensorUnitsT)BaseUnit(); rec.DataFormat.ModifierUnits = (SaHpiSensorUnitsT)ModifierUnit(); rec.DataFormat.ModifierUse = (SaHpiSensorModUnitUseT)ModifierUnitUse(); rec.DataFormat.Percentage = (SaHpiBoolT)Percentage(); rec.DataFormat.AccuracyFactor = (SaHpiFloat64T)GetFactors()->AccuracyFactor(); rec.DataFormat.Range.Flags = SAHPI_SRF_MAX | SAHPI_SRF_MIN; if ( SwapThresholds() == true ) { ConvertToInterpreted( SensorMax(), rec.DataFormat.Range.Min ); ConvertToInterpreted( SensorMin(), rec.DataFormat.Range.Max ); } else { ConvertToInterpreted( SensorMax(), rec.DataFormat.Range.Max ); ConvertToInterpreted( SensorMin(), rec.DataFormat.Range.Min ); } if ( NominalReadingSpecified() ) { rec.DataFormat.Range.Flags |= SAHPI_SRF_NOMINAL; ConvertToInterpreted( NominalReading(), rec.DataFormat.Range.Nominal ); } if ( NormalMaxSpecified() ) { if ( SwapThresholds() == true ) { rec.DataFormat.Range.Flags |= SAHPI_SRF_NORMAL_MIN; ConvertToInterpreted( NormalMax(), rec.DataFormat.Range.NormalMin ); } else { rec.DataFormat.Range.Flags |= SAHPI_SRF_NORMAL_MAX; ConvertToInterpreted( NormalMax(), rec.DataFormat.Range.NormalMax ); } } if ( NormalMinSpecified() ) { if ( SwapThresholds() == true ) { rec.DataFormat.Range.Flags |= SAHPI_SRF_NORMAL_MAX; ConvertToInterpreted( NormalMin(), rec.DataFormat.Range.NormalMax ); } else { rec.DataFormat.Range.Flags |= SAHPI_SRF_NORMAL_MIN; ConvertToInterpreted( NormalMin(), rec.DataFormat.Range.NormalMin ); } } // thresholds unsigned int acc = ThresholdAccess(); if ( acc >= eIpmiThresholdAccessSupportReadable ) { rec.ThresholdDefn.IsAccessible = SAHPI_TRUE; SaHpiSensorThdMaskT temp = 0; int val = IsThresholdReadable( eIpmiLowerNonCritical ); if ( val ) temp |= SAHPI_STM_LOW_MINOR; val = IsThresholdReadable( eIpmiLowerCritical ); if ( val ) temp |= SAHPI_STM_LOW_MAJOR; val = IsThresholdReadable( eIpmiLowerNonRecoverable ); if ( val ) temp |= SAHPI_STM_LOW_CRIT; val = IsThresholdReadable( eIpmiUpperNonCritical ); if ( val ) temp |= SAHPI_STM_UP_MINOR; val = IsThresholdReadable( eIpmiUpperCritical ); if ( val ) temp |= SAHPI_STM_UP_MAJOR; val = IsThresholdReadable( eIpmiUpperNonRecoverable ); if ( val ) temp |= SAHPI_STM_UP_CRIT; if ( HysteresisSupport() == eIpmiHysteresisSupportReadable || HysteresisSupport() == eIpmiHysteresisSupportSettable ) temp |= SAHPI_STM_UP_HYSTERESIS | SAHPI_STM_LOW_HYSTERESIS; if ( SwapThresholds() == true ) { SwapThresholdsMask( temp ); } rec.ThresholdDefn.ReadThold = temp; } if ( acc == eIpmiThresholdAccessSupportSettable ) { SaHpiSensorThdMaskT temp = 0; int val = IsThresholdSettable( eIpmiLowerNonCritical ); if ( val ) temp |= SAHPI_STM_LOW_MINOR; val = IsThresholdSettable( eIpmiLowerCritical ); if ( val ) temp |= SAHPI_STM_LOW_MAJOR; val = IsThresholdSettable( eIpmiLowerNonRecoverable ); if ( val ) temp |= SAHPI_STM_LOW_CRIT; val = IsThresholdSettable( eIpmiUpperNonCritical ); if ( val ) temp |= SAHPI_STM_UP_MINOR; val = IsThresholdSettable( eIpmiUpperCritical ); if ( val ) temp |= SAHPI_STM_UP_MAJOR; val = IsThresholdSettable( eIpmiUpperNonRecoverable ); if ( val ) temp |= SAHPI_STM_UP_CRIT; if ( HysteresisSupport() == eIpmiHysteresisSupportSettable ) temp |= SAHPI_STM_UP_HYSTERESIS | SAHPI_STM_LOW_HYSTERESIS; if ( SwapThresholds() == true ) { SwapThresholdsMask( temp ); } rec.ThresholdDefn.WriteThold = temp; } if ( SwapThresholds() == true ) { SwapEventState(rec.Events); SwapEventState(m_current_hpi_assert_mask); SwapEventState(m_current_hpi_deassert_mask); SwapEventState(m_hpi_assert_mask); SwapEventState(m_hpi_deassert_mask); } rec.ThresholdDefn.Nonlinear = GetFactors()->IsNonLinear(); return true; } SaErrorT cIpmiSensorThreshold::GetSensorReading( SaHpiSensorReadingT &data, SaHpiEventStateT &state ) { if ( m_enabled == SAHPI_FALSE ) return SA_ERR_HPI_INVALID_REQUEST; cIpmiMsg rsp; SaErrorT rv = GetSensorData( rsp ); if ( rv != SA_OK ) return rv; if ( &data != NULL ) ConvertToInterpreted( rsp.m_data[1], data ); if ( &state != NULL ) { state = rsp.m_data[3] & 0x3f; if ( SwapThresholds() == true ) { SwapEventState( state ); } } return SA_OK; } SaErrorT cIpmiSensorThreshold::GetDefaultThresholds( SaHpiSensorThresholdsT &thres ) { if ( IsThresholdReadable( eIpmiLowerNonRecoverable ) ) ConvertToInterpreted( m_lower_non_recoverable_threshold, thres.LowCritical ); if ( IsThresholdReadable( eIpmiLowerCritical ) ) ConvertToInterpreted( m_lower_critical_threshold, thres.LowMajor ); if ( IsThresholdReadable( eIpmiLowerNonCritical ) ) ConvertToInterpreted( m_lower_non_critical_threshold, thres.LowMinor ); if ( IsThresholdReadable( eIpmiUpperNonRecoverable ) ) ConvertToInterpreted( m_upper_non_recoverable_threshold, thres.UpCritical ); if ( IsThresholdReadable( eIpmiUpperCritical ) ) ConvertToInterpreted( m_upper_critical_threshold, thres.UpMajor ); if ( IsThresholdReadable( eIpmiUpperNonCritical ) ) ConvertToInterpreted( m_upper_non_critical_threshold, thres.UpMinor ); return SA_OK; } SaErrorT cIpmiSensorThreshold::GetThresholds( SaHpiSensorThresholdsT &thres ) { cIpmiResource *res = Resource(); stdlog << "read thresholds for sensor " << EntityPath() << " num " << m_num << " " << IdString() << ".\n"; if ( m_threshold_access == eIpmiThresholdAccessSupportFixed ) // Thresholds are fixed, pull them from the SDR. return GetDefaultThresholds( thres ); cIpmiMsg msg( eIpmiNetfnSensorEvent, eIpmiCmdGetSensorThreshold ); cIpmiMsg rsp; msg.m_data_len = 1; msg.m_data[0] = m_num; SaErrorT rv = res->SendCommandReadLock( this, msg, rsp, m_lun ); if ( rv != SA_OK ) { stdlog << "error getting thresholds: " << rv << " !\n"; return rv; } if ( rsp.m_data[0] ) { stdlog << "IPMI error getting thresholds: " << rsp.m_data[0] << " !\n"; return SA_ERR_HPI_INVALID_DATA; } if ( rsp.m_data[1] & (1 << eIpmiLowerNonRecoverable) ) ConvertToInterpreted( rsp.m_data[4], thres.LowCritical ); if ( rsp.m_data[1] & (1 << eIpmiLowerCritical ) ) ConvertToInterpreted( rsp.m_data[3], thres.LowMajor ); if ( rsp.m_data[1] & (1 << eIpmiLowerNonCritical ) ) ConvertToInterpreted( rsp.m_data[2], thres.LowMinor ); if ( rsp.m_data[1] & (1 << eIpmiUpperNonRecoverable ) ) ConvertToInterpreted( rsp.m_data[7], thres.UpCritical ); if ( rsp.m_data[1] & (1 << eIpmiUpperCritical ) ) ConvertToInterpreted( rsp.m_data[6], thres.UpMajor ); if ( rsp.m_data[1] & (1 << eIpmiUpperNonCritical ) ) ConvertToInterpreted( rsp.m_data[5], thres.UpMinor ); return SA_OK; } SaErrorT cIpmiSensorThreshold::GetHysteresis( SaHpiSensorThresholdsT &thres ) { cIpmiResource *res = Resource(); stdlog << "read hysteresis for sensor " << EntityPath() << " num " << m_num << " " << IdString() << ".\n"; if ( m_hysteresis_support != eIpmiHysteresisSupportReadable && m_hysteresis_support != eIpmiHysteresisSupportSettable) return SA_OK; cIpmiMsg msg( eIpmiNetfnSensorEvent, eIpmiCmdGetSensorHysteresis ); cIpmiMsg rsp; msg.m_data_len = 2; msg.m_data[0] = m_num; msg.m_data[1] = 0xff; SaErrorT rv = res->SendCommandReadLock( this, msg, rsp, m_lun ); if ( rv ) { stdlog << "Error sending hysteresis get command: " << rv << " !\n"; return rv; } if ( rsp.m_data[0] || rsp.m_data_len < 3 ) { stdlog << "IPMI error getting hysteresis: " << rsp.m_data[0] << "!\n"; return SA_ERR_HPI_INVALID_CMD; } m_current_positive_hysteresis = rsp.m_data[1]; m_current_negative_hysteresis = rsp.m_data[2]; ConvertToInterpreted( rsp.m_data[1], thres.PosThdHysteresis, true ); ConvertToInterpreted( rsp.m_data[2], thres.NegThdHysteresis, true ); return SA_OK; } void static SwapThresholdsReading( SaHpiSensorThresholdsT &thres ) { SaHpiSensorThresholdsT tmp_tres; memcpy( &tmp_tres, &thres, sizeof( SaHpiSensorThresholdsT )); memcpy( &thres.LowCritical, &tmp_tres.UpCritical, sizeof( SaHpiSensorReadingT ) ); memcpy( &thres.LowMajor, &tmp_tres.UpMajor, sizeof( SaHpiSensorReadingT ) ); memcpy( &thres.LowMinor, &tmp_tres.UpMinor, sizeof( SaHpiSensorReadingT ) ); memcpy( &thres.UpCritical, &tmp_tres.LowCritical, sizeof( SaHpiSensorReadingT ) ); memcpy( &thres.UpMajor, &tmp_tres.LowMajor, sizeof( SaHpiSensorReadingT ) ); memcpy( &thres.UpMinor, &tmp_tres.LowMinor, sizeof( SaHpiSensorReadingT ) ); memcpy( &thres.PosThdHysteresis, &tmp_tres.NegThdHysteresis, sizeof( SaHpiSensorReadingT ) ); memcpy( &thres.NegThdHysteresis, &tmp_tres.PosThdHysteresis, sizeof( SaHpiSensorReadingT ) ); } SaErrorT cIpmiSensorThreshold::GetThresholdsAndHysteresis( SaHpiSensorThresholdsT &thres ) { SaErrorT rv; memset( &thres, 0, sizeof( SaHpiSensorThresholdsT ) ); bool found = false; if ( ThresholdAccess() == eIpmiThresholdAccessSupportNone ) stdlog << "sensor doesn't support threshold read !\n"; else { rv = GetThresholds( thres ); if ( rv != SA_OK ) return rv; found = true; } if ( HysteresisSupport() == eIpmiHysteresisSupportReadable || HysteresisSupport() == eIpmiHysteresisSupportSettable ) { rv = GetHysteresis( thres ); if ( rv != SA_OK ) return rv; found = true; } else stdlog << "sensor doesn't support hysteresis read !\n"; if ( !found ) return SA_ERR_HPI_INVALID_CMD; if ( SwapThresholds() == true ) { SwapThresholdsReading( thres ); } return SA_OK; } SaErrorT cIpmiSensorThreshold::ConvertThreshold( const SaHpiSensorReadingT &r, tIpmiThresh event, unsigned char &data, unsigned char &mask ) { // convert the interpreted data SaErrorT rv = ConvertFromInterpreted( r, data ); if ( rv != SA_OK ) return rv; if ( r.IsSupported == SAHPI_TRUE ) mask |= (1 << event); return SA_OK; } SaErrorT cIpmiSensorThreshold::SetThresholds( const SaHpiSensorThresholdsT &thres ) { stdlog << "write thresholds for sensor " << EntityPath() << " num " << m_num << " " << IdString() << ".\n"; cIpmiMsg msg( eIpmiNetfnSensorEvent, eIpmiCmdSetSensorThreshold ); memset( msg.m_data, 0, dIpmiMaxMsgLength ); msg.m_data_len = 8; msg.m_data[0] = m_num; msg.m_data[1] = 0; SaErrorT rv; rv = ConvertThreshold( thres.LowMinor, eIpmiLowerNonCritical, msg.m_data[2], msg.m_data[1] ); if ( rv != SA_OK ) return rv; rv = ConvertThreshold( thres.LowMajor, eIpmiLowerCritical, msg.m_data[3], msg.m_data[1] ); if ( rv != SA_OK ) return rv; rv = ConvertThreshold( thres.LowCritical, eIpmiLowerNonRecoverable, msg.m_data[4], msg.m_data[1] ); if ( rv != SA_OK ) return rv; rv = ConvertThreshold( thres.UpMinor, eIpmiUpperNonCritical, msg.m_data[5], msg.m_data[1] ); if ( rv != SA_OK ) return rv; rv = ConvertThreshold( thres.UpMajor, eIpmiUpperCritical, msg.m_data[6], msg.m_data[1] ); if ( rv != SA_OK ) return rv; rv = ConvertThreshold( thres.UpCritical, eIpmiUpperNonRecoverable, msg.m_data[7], msg.m_data[1] ); if ( rv != SA_OK ) return rv; // nothing to do if ( msg.m_data[1] == 0 ) return SA_OK; // settable ? if ( m_threshold_access != eIpmiThresholdAccessSupportSettable ) return SA_ERR_HPI_INVALID_CMD; if ( (m_threshold_settable | msg.m_data[1]) != m_threshold_settable ) return SA_ERR_HPI_INVALID_CMD; // set thresholds cIpmiMsg rsp; rv = Resource()->SendCommandReadLock( this, msg, rsp, m_lun ); if ( rv != SA_OK ) { stdlog << "Error sending thresholds set command: " << rv << " !\n"; return rv; } if ( rsp.m_data[0] ) { stdlog << "IPMI error setting thresholds: " << rsp.m_data[0] << " !\n"; return SA_ERR_HPI_INVALID_CMD; } return SA_OK; } SaErrorT cIpmiSensorThreshold::SetHysteresis( const SaHpiSensorThresholdsT &thres ) { SaErrorT rv; // nothing to do if ( (thres.PosThdHysteresis.IsSupported == SAHPI_FALSE) && (thres.NegThdHysteresis.IsSupported == SAHPI_FALSE) ) return SA_OK; if ( m_hysteresis_support != eIpmiHysteresisSupportSettable ) return SA_ERR_HPI_INVALID_CMD; cIpmiMsg msg( eIpmiNetfnSensorEvent, eIpmiCmdSetSensorHysteresis ); cIpmiMsg rsp; msg.m_data_len = 4; msg.m_data[0] = m_num; msg.m_data[1] = 0xff; if (thres.PosThdHysteresis.IsSupported == SAHPI_FALSE) { msg.m_data[2] = m_current_positive_hysteresis; } else { rv = ConvertFromInterpreted( thres.PosThdHysteresis, msg.m_data[2], true ); if ( rv != SA_OK ) return rv; m_current_positive_hysteresis = msg.m_data[2]; } if (thres.NegThdHysteresis.IsSupported == SAHPI_FALSE) { msg.m_data[3] = m_current_negative_hysteresis; } else { rv = ConvertFromInterpreted( thres.NegThdHysteresis, msg.m_data[3], true ); if ( rv != SA_OK ) return rv; m_current_negative_hysteresis = msg.m_data[3]; } rv = Resource()->SendCommandReadLock( this, msg, rsp, m_lun ); if ( rv != SA_OK ) { stdlog << "Error sending hysteresis set command: " << rv << " !\n"; return rv; } if ( rsp.m_data[0] ) { stdlog << "IPMI error setting hysteresis: " << rsp.m_data[0] << " !\n"; return SA_ERR_HPI_INVALID_CMD; } return SA_OK; } SaErrorT cIpmiSensorThreshold::SetThresholdsAndHysteresis( const SaHpiSensorThresholdsT &thres ) { SaErrorT rv; SaHpiSensorThresholdsT tmp_tres; memcpy( &tmp_tres, &thres, sizeof( SaHpiSensorThresholdsT ) ); if ( SwapThresholds() == true ) { SwapThresholdsReading( tmp_tres ); } if ( ThresholdAccess() == eIpmiThresholdAccessSupportSettable ) { rv = SetThresholds( tmp_tres ); if ( rv != SA_OK ) return rv; } else stdlog << "sensor doesn't support threshold set !\n"; if ( HysteresisSupport() == eIpmiHysteresisSupportSettable ) { rv = SetHysteresis( tmp_tres ); if ( rv != SA_OK ) return rv; } else stdlog << "sensor doesn't support hysteresis set !\n"; return SA_OK; } SaErrorT cIpmiSensorThreshold::GetEventMasksHw( SaHpiEventStateT &AssertEventMask, SaHpiEventStateT &DeassertEventMask ) { AssertEventMask = 0; DeassertEventMask = 0; cIpmiMsg rsp; SaErrorT rv = cIpmiSensor::GetEventMasksHw( rsp ); if ( rv != SA_OK ) return rv; unsigned int amask = IpmiGetUint16( rsp.m_data + 2 ); unsigned int dmask = IpmiGetUint16( rsp.m_data + 4 ); for( int i = 0; i < 6; i++ ) { unsigned int b1 = 1 << (2*i); unsigned int b2 = 1 << (2*i + 1); if ( (amask & b1) || (amask & b2) ) AssertEventMask |= (1 << i); if ( (dmask & b1) || (dmask & b2) ) DeassertEventMask |= (1 << i); } if ( SwapThresholds() == true ) { SwapEventState( AssertEventMask ); SwapEventState( DeassertEventMask ); } return SA_OK; } SaErrorT cIpmiSensorThreshold::SetEventMasksHw( const SaHpiEventStateT &AssertEventMask, const SaHpiEventStateT &DeassertEventMask ) { // create de/assertion event mask unsigned int amask = 0; unsigned int dmask = 0; SaHpiEventStateT assert_mask = AssertEventMask; SaHpiEventStateT deassert_mask = DeassertEventMask; if ( SwapThresholds() == true ) { SwapEventState( assert_mask ); SwapEventState( deassert_mask ); } for( int i = 0; i < 6; i++ ) { unsigned int b1 = 1 << (2*i); unsigned int b2 = 1 << (2*i + 1); unsigned int b = b1 | b2; // this is 3 << (2*i) if ( assert_mask & ( 1 << i ) ) { if ( (m_assertion_event_mask & b) == 0 ) { // this event is not allowed stdlog << "SetEventEnables: assertion event " << IpmiThresToString( (tIpmiThresh)i ) << " not allowed !\n"; return SA_ERR_HPI_INVALID_DATA; } amask |= (m_assertion_event_mask & b); } if ( deassert_mask & ( 1 << i ) ) { if ( (m_deassertion_event_mask & b) == 0 ) { // this event is not allowed stdlog << "SetEventEnables: deassertion event " << IpmiThresToString( (tIpmiThresh)i ) << " not allowed !\n"; return SA_ERR_HPI_INVALID_DATA; } dmask |= (m_deassertion_event_mask & b); } } cIpmiMsg msg; SaErrorT rv = SA_OK; if (( amask != 0 ) || ( dmask != 0 )) { IpmiSetUint16( msg.m_data + 2, amask ); IpmiSetUint16( msg.m_data + 4, dmask ); rv = cIpmiSensor::SetEventMasksHw( msg, true ); } if ( rv != SA_OK ) return rv; amask = ( amask ^ m_assertion_event_mask ) & m_assertion_event_mask; dmask = ( dmask ^ m_deassertion_event_mask ) & m_deassertion_event_mask; if (( amask != 0 ) || ( dmask != 0 )) { IpmiSetUint16( msg.m_data + 2, amask ); IpmiSetUint16( msg.m_data + 4, dmask ); rv = cIpmiSensor::SetEventMasksHw( msg, false ); } return rv; } openhpi-2.14.1/plugins/ipmidirect/ipmi_sensor_threshold.h0000644000076400007640000002720211302567000020554 0ustar /* * ipmi_sensor_threshold.h * * Copyright (c) 2004 by FORCE Computers * Copyright (c) 2005 by ESO Technologies. * * Note that this file is based on parts of OpenIPMI * written by Corey Minyard * of MontaVista Software. Corey's code was helpful * and many thanks go to him. He gave the permission * to use this code in OpenHPI under BSD license. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Thomas Kanngieser * Pierre Sangouard */ #ifndef dIpmiSensorThreshold_h #define dIpmiSensorThreshold_h #ifndef dIpmiSensor_h #include "ipmi_sensor.h" #endif #ifndef dIpmiSensorFactors_h #include "ipmi_sensor_factors.h" #endif enum tIpmiHysteresisSupport { eIpmiHysteresisSupportNone = 0, eIpmiHysteresisSupportReadable = 1, eIpmiHysteresisSupportSettable = 2, eIpmiHysteresisSupportFixed = 3 }; const char *IpmiHysteresisSupportToString( tIpmiHysteresisSupport val ); enum tIpmiThresholdAccessSuport { eIpmiThresholdAccessSupportNone = 0, eIpmiThresholdAccessSupportReadable = 1, eIpmiThresholdAccessSupportSettable = 2, eIpmiThresholdAccessSupportFixed = 3 }; const char *IpmiThresholdAccessSupportToString( tIpmiThresholdAccessSuport val ); // event mask bits for threshold sensors #define dIpmiEventLowerNonCriticalLow 0x0001 #define dIpmiEventLowerNonCriticalHigh 0x0002 #define dIpmiEventLowerCriticalLow 0x0004 #define dIpmiEventLowerCriticalHigh 0x0008 #define dIpmiEventLowerNonRecoverableLow 0x0010 #define dIpmiEventLowerNonRecoverableHigh 0x0020 #define dIpmiEventUpperNonCriticalLow 0x0040 #define dIpmiEventUpperNonCriticalHigh 0x0080 #define dIpmiEventUpperCriticalLow 0x0100 #define dIpmiEventUpperCriticalHigh 0x0200 #define dIpmiEventUpperNonRecoverableLow 0x0400 #define dIpmiEventUpperNonRecoverableHigh 0x0800 #define dIpmiEventMask 0x0fff void IpmiThresholdEventMaskToString( unsigned short em, char *str ); enum tIpmiUnitType { eIpmiUnitTypeUnspecified = 0, eIpmiUnitTypeDegreesC = 1, eIpmiUnitTypeDegreesF = 2, eIpmiUnitTypeDegreesK = 3, eIpmiUnitTypeVolts = 4, eIpmiUnitTypeAmps = 5, eIpmiUnitTypeWatts = 6, eIpmiUnitTypeJoules = 7, eIpmiUnitTypeCoulombs = 8, eIpmiUnitTypeVa = 9, eIpmiUnitTypeNits = 10, eIpmiUnitTypeLumens = 11, eIpmiUnitTypeLux = 12, eIpmiUnitTypeCandela = 13, eIpmiUnitTypeKpa = 14, eIpmiUnitTypePsi = 15, eIpmiUnitTypeNewtons = 16, eIpmiUnitTypeCfm = 17, eIpmiUnitTypeRpm = 18, eIpmiUnitTypeHz = 19, eIpmiUnitTypeUseconds = 20, eIpmiUnitTypeMseconds = 21, eIpmiUnitTypeSeconds = 22, eIpmiUnitTypeMinute = 23, eIpmiUnitTypeHour = 24, eIpmiUnitTypeDay = 25, eIpmiUnitTypeWeek = 26, eIpmiUnitTypeMil = 27, eIpmiUnitTypeInches = 28, eIpmiUnitTypeFeet = 29, eIpmiUnitTypeCubicInchs = 30, eIpmiUnitTypeCubicFeet = 31, eIpmiUnitTypeMillimeters = 32, eIpmiUnitTypeCentimeters = 33, eIpmiUnitTypeMeters = 34, eIpmiUnitTypeCubicCentimeters = 35, eIpmiUnitTypeCubicMeters = 36, eIpmiUnitTypeLiters = 37, eIpmiUnitTypeFlOz = 38, eIpmiUnitTypeRadians = 39, eIpmiUnitTypeSeradians = 40, eIpmiUnitTypeRevolutions = 41, eIpmiUnitTypeCycles = 42, eIpmiUnitTypeGravities = 43, eIpmiUnitTypeOunces = 44, eIpmiUnitTypePounds = 45, eIpmiUnitTypeFootPounds = 46, eIpmiUnitTypeOunceInches = 47, eIpmiUnitTypeGauss = 48, eIpmiUnitTypeGilberts = 49, eIpmiUnitTypeHenries = 50, eIpmiUnitTypeMhenries = 51, eIpmiUnitTypeFarads = 52, eIpmiUnitTypeUfarads = 53, eIpmiUnitTypeOhms = 54, eIpmiUnitTypeSiemens = 55, eIpmiUnitTypeMoles = 56, eIpmiUnitTypeBecquerels = 57, eIpmiUnitTypePpm = 58, eIpmiUnitTypeReserved1 = 59, eIpmiUnitTypeDecibels = 60, eIpmiUnitTypeDbA = 61, eIpmiUnitTypeDbC = 62, eIpmiUnitTypeGrays = 63, eIpmiUnitTypeSieverts = 64, eIpmiUnitTypeColorTempDegK = 65, eIpmiUnitTypeBits = 66, eIpmiUnitTypeKBits = 67, eIpmiUnitTypeMBits = 68, eIpmiUnitTypeGBits = 69, eIpmiUnitTypeBytes = 70, eIpmiUnitTypeKBytes = 71, eIpmiUnitTypeMBytes = 72, eIpmiUnitTypeGBytes = 73, eIpmiUnitTypeWords = 74, eIpmiUnitTypeDWords = 75, eIpmiUnitTypeQWords = 76, eIpmiUnitTypeLines = 77, eIpmiUnitTypeHits = 78, eIpmiUnitTypeMisses = 79, eIpmiUnitTypeRetries = 80, eIpmiUnitTypeResets = 81, eIpmiUnitTypeOverruns = 82, eIpmiUnitTypeUnderruns = 83, eIpmiUnitTypeCollisions = 84, eIpmiUnitTypePackets = 85, eIpmiUnitTypeMessages = 86, eIpmiUnitTypeCharacters = 87, eIpmiUnitTypeErrors = 88, eIpmiUnitTypeCorrectableErrors = 89, eIpmiUnitTypeUncorrectableErrors = 90 }; const char *IpmiUnitTypeToString( tIpmiUnitType val ); enum tIpmiRateUnit { eIpmRateUnitNone = 0, eIpmRateUnitPerUS = 1, eIpmRateUnitPerMs = 2, eIpmRateUnitPerS = 3, eIpmRateUnitPerMinute = 4, eIpmRateUnitPerHour = 5, eIpmRateUnitDay = 6 }; const char *IpmiRateUnitToString( tIpmiRateUnit unit ); enum tIpmiModifierUnit { eIpmiModifierUnitNone = 0, eIpmiModifierUnitBasicDivModifier = 1, eIpmiModifierUnitBasicMulModifier = 2 }; const char *IpmiModifierUnitToString( tIpmiModifierUnit unit ); struct tIpmiThresholds { /* Pay no attention to the implementation here. */ struct { unsigned int m_status; /* Is this threshold enabled? */ double m_val; } m_vals[6]; }; class cIpmiSensorThreshold : public cIpmiSensor { protected: bool m_sensor_init_thresholds; bool m_sensor_init_hysteresis; tIpmiHysteresisSupport m_hysteresis_support; tIpmiThresholdAccessSuport m_threshold_access; unsigned int m_threshold_readable; unsigned int m_threshold_settable; tIpmiRateUnit m_rate_unit; tIpmiModifierUnit m_modifier_unit_use; bool m_percentage; tIpmiUnitType m_base_unit; tIpmiUnitType m_modifier_unit; bool m_normal_min_specified; bool m_normal_max_specified; bool m_nominal_reading_specified; bool m_swap_thresholds; unsigned char m_nominal_reading; unsigned char m_normal_max; unsigned char m_normal_min; unsigned char m_sensor_max; unsigned char m_sensor_min; unsigned char m_upper_non_recoverable_threshold; unsigned char m_upper_critical_threshold; unsigned char m_upper_non_critical_threshold; unsigned char m_lower_non_recoverable_threshold; unsigned char m_lower_critical_threshold; unsigned char m_lower_non_critical_threshold; unsigned char m_positive_going_threshold_hysteresis; unsigned char m_negative_going_threshold_hysteresis; unsigned char m_current_positive_hysteresis; unsigned char m_current_negative_hysteresis; public: cIpmiSensorThreshold( cIpmiMc *mc ); virtual ~cIpmiSensorThreshold(); virtual void HandleNew( cIpmiDomain *domain ); tIpmiHysteresisSupport HysteresisSupport() const { return m_hysteresis_support; } tIpmiThresholdAccessSuport ThresholdAccess() const { return m_threshold_access; } tIpmiUnitType BaseUnit() const { return m_base_unit; } tIpmiUnitType ModifierUnit() const { return m_modifier_unit; } tIpmiModifierUnit ModifierUnitUse() const { return m_modifier_unit_use; } bool Percentage() const { return m_percentage; } unsigned char SensorMax() const { return m_sensor_max; } unsigned char SensorMin() const { return m_sensor_min; } bool NominalReadingSpecified() const { return m_nominal_reading_specified; } unsigned char NominalReading() const { return m_nominal_reading; } bool NormalMaxSpecified() const { return m_normal_max_specified; } unsigned char NormalMax() const { return m_normal_max; } bool NormalMinSpecified() const { return m_normal_min_specified; } unsigned char NormalMin() const { return m_normal_min; } bool SwapThresholds() const { return m_swap_thresholds; } bool IsThresholdReadable( tIpmiThresh event ); bool IsThresholdSettable( tIpmiThresh event ); // create an hpi event from ipmi event virtual SaErrorT CreateEvent( cIpmiEvent *event, SaHpiEventT &h ); virtual void Dump( cIpmiLog &dump ) const; bool Cmp( const cIpmiSensor &s2 ) const; protected: cIpmiSensorFactors *m_sensor_factors; virtual cIpmiSensorFactors *CreateSensorFactors( cIpmiMc *mc, cIpmiSdr *sdr ); // create HPI event mask unsigned short GetEventMask(unsigned int ipmi_event_mask); // convert to HPI interpreted values void ConvertToInterpreted( unsigned int v, SaHpiSensorReadingT &r ); void ConvertToInterpreted( unsigned int v, SaHpiSensorReadingT &r, bool is_hysteresis ); SaErrorT ConvertFromInterpreted( const SaHpiSensorReadingT r, unsigned char &v ); SaErrorT ConvertFromInterpreted( const SaHpiSensorReadingT r, unsigned char &v, bool is_hysteresis); SaErrorT ConvertThreshold( const SaHpiSensorReadingT &r, tIpmiThresh event, unsigned char &data, unsigned char &mask ); public: cIpmiSensorFactors *GetFactors() { return m_sensor_factors; } // read sensor parameter from Full Sensor Record virtual bool GetDataFromSdr( cIpmiMc *mc, cIpmiSdr *sdr ); // create an RDR sensor record virtual bool CreateRdr( SaHpiRptEntryT &resource, SaHpiRdrT &rdr ); // get sensor data SaErrorT GetSensorReading( SaHpiSensorReadingT &data, SaHpiEventStateT &state ); SaErrorT GetThresholdsAndHysteresis( SaHpiSensorThresholdsT &thres ); protected: // helper functions for GetThresholdsAndHysteresis SaErrorT GetThresholds( SaHpiSensorThresholdsT &thres ); SaErrorT GetDefaultThresholds( SaHpiSensorThresholdsT &thres ); SaErrorT GetHysteresis( SaHpiSensorThresholdsT &thres ); public: SaErrorT SetThresholdsAndHysteresis( const SaHpiSensorThresholdsT &thres ); protected: // helper functions for SetThresholdsAndHysteresis SaErrorT SetThresholds( const SaHpiSensorThresholdsT &thres ); SaErrorT SetHysteresis( const SaHpiSensorThresholdsT &thres ); public: virtual SaErrorT GetEventMasksHw( SaHpiEventStateT &AssertEventMask, SaHpiEventStateT &DeassertEventMask ); virtual SaErrorT SetEventMasksHw( const SaHpiEventStateT &AssertEventMask, const SaHpiEventStateT &DeassertEventMask ); }; #endif openhpi-2.14.1/plugins/ipmidirect/ipmi_addr.cpp0000644000076400007640000000261411302567000016434 0ustar /* * * Copyright (c) 2003 by FORCE Computers. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Thomas Kanngieser */ #include "ipmi_addr.h" #include "ipmi_log.h" #include int cIpmiAddr::Cmp( const cIpmiAddr &addr ) const { int v = (int)addr.m_type - (int)m_type; if ( v ) return v; v = (int)addr.m_channel - (int)m_channel; if ( v ) return v; v = (int)addr.m_lun - (int)m_lun; if ( v ) return v; v = (int)addr.m_slave_addr - (int)m_slave_addr; return v; } void cIpmiAddr::Log() const { switch( m_type ) { case eIpmiAddrTypeSystemInterface: stdlog << "si <" << m_channel << " " << m_lun << ">"; break; case eIpmiAddrTypeIpmb: stdlog << "ipmb <" << m_channel << " " << m_lun << " " << (unsigned char)m_slave_addr << ">"; break; case eIpmiAddrTypeIpmbBroadcast: stdlog << "bc <" << m_channel << " " << m_lun << " " << (unsigned char)m_slave_addr << ">"; break; } } openhpi-2.14.1/plugins/ipmidirect/ipmi_mc_vendor_fix_sdr.h0000644000076400007640000000246411302567000020664 0ustar /* * Copyright (c) 2005 by ESO Technologies. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Pierre Sangouard */ #ifndef dIpmiMcVendorFixSdr_h #define dIpmiMcVendorFixSdr_h #ifndef dIpmiMcVendor_h #include "ipmi_mc_vendor.h" #endif #define ENTITY_DONT_CARE 0xff typedef struct { unsigned char old_entity_id; unsigned char old_entity_instance; unsigned char new_entity_id; unsigned char new_entity_instance; bool last_entry; } mc_sdr_patch_t; typedef struct { unsigned int manufacturer_id; unsigned int product_id; mc_sdr_patch_t *sdr_patch; } mc_patch_t; extern mc_patch_t mc_patch[]; class cIpmiMcVendorFixSdr : public cIpmiMcVendor { mc_sdr_patch_t *m_sdr_patch; public: cIpmiMcVendorFixSdr( unsigned int manufacturer_id, unsigned int product_id ); virtual ~cIpmiMcVendorFixSdr(); virtual bool InitMc( cIpmiMc *mc, const cIpmiMsg &devid ); bool ProcessSdr( cIpmiDomain *domain, cIpmiMc *mc, cIpmiSdrs *sdrs ); }; #endif openhpi-2.14.1/plugins/ipmidirect/ipmi_mc_vendor_intel.h0000644000076400007640000000527111302567000020340 0ustar /* * Intel specific code * * Copyright (c) 2004-2006 by Intel Corp. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Andy Cress */ #ifndef dIpmiMcVendorIntel_h #define dIpmiMcVendorIntel_h #ifndef dIpmiMcVendor_h #include "ipmi_mc_vendor.h" #endif #ifndef dIpmiControl_h #include "ipmi_control.h" #endif #define OEM_ALARM_BASE 0x10 #define LED_POWER 0 #define LED_CRIT 1 #define LED_MAJOR 2 #define LED_MINOR 3 #define LED_IDENT 4 #define PRIVATE_BUS_ID 0x03 // w Sahalee, the 8574 is on Private Bus 1 #define PRIVATE_BUS_ID5 0x05 // for Intel TIGI2U #define PRIVATE_BUS_ID7 0x07 // for Intel Harbison #define PERIPHERAL_BUS_ID 0x24 // w mBMC, the 8574 is on the Peripheral Bus #define ALARMS_PANEL_WRITE 0x40 #define ALARMS_PANEL_READ 0x41 #define DISK_LED_WRITE 0x44 // only used for Chesnee mBMC #define DISK_LED_READ 0x45 // only used for Chesnee mBMC #define NETFN_PICMG 0x2c #define PICMG_GET_LED_PROPERTIES 0x05 #define PICMG_SET_LED_STATE 0x07 #define PICMG_GET_LED_STATE 0x08 class cIpmiControlIntelRmsLed : public cIpmiControl { protected: public: cIpmiControlIntelRmsLed( cIpmiMc *mc, unsigned int num ); virtual ~cIpmiControlIntelRmsLed(); virtual bool CreateRdr( SaHpiRptEntryT &resource, SaHpiRdrT &rdr ); virtual SaErrorT GetState( SaHpiCtrlModeT &mode, SaHpiCtrlStateT &state ); virtual SaErrorT SetState( const SaHpiCtrlModeT &mode, const SaHpiCtrlStateT &state ); virtual void Dump( cIpmiLog &dump, const char *name ) const; unsigned char m_busid; private: unsigned char GetAlarms(); int SetAlarms(unsigned char val); int SetIdentify(unsigned char tval); unsigned char GetAlarmsPicmg(unsigned char picmg_id, unsigned char fruid); int SetAlarmsPicmg(unsigned char picmg_id, unsigned char fruid, unsigned char val); }; class cIpmiMcVendorIntelBmc : public cIpmiMcVendor { public: cIpmiMcVendorIntelBmc( unsigned int product_id ); virtual ~cIpmiMcVendorIntelBmc(); virtual bool InitMc( cIpmiMc *mc, const cIpmiMsg &devid ); bool ProcessSdr( cIpmiDomain *domain, cIpmiMc *mc, cIpmiSdrs *sdrs ); bool ProcessFru( cIpmiInventory *inv, cIpmiMc *mc, unsigned int sa, SaHpiEntityTypeT type); bool CreateControls( cIpmiDomain *domain, cIpmiMc *mc, cIpmiSdrs *sdrs ); unsigned char m_busid; private: }; #endif openhpi-2.14.1/plugins/ipmidirect/thread.h0000644000076400007640000000443511302567000015423 0ustar /* * thread.h * * thread classes * * Copyright (c) 2004 by FORCE Computers. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Thomas Kanngieser */ #ifndef dThread_h #define dThread_h #include #include enum tTheadState { eTsUnknown, eTsSuspend, eTsRun, eTsExit }; // thread class class cThread { protected: pthread_t m_thread; bool m_main; // true => main thread tTheadState m_state; static void *Thread( void *param ); public: cThread(); cThread( const pthread_t &thread, bool main_thread, tTheadState state ); virtual ~cThread(); // get the current thread class static cThread *GetThread(); // start thread virtual bool Start(); // wait for thread termination virtual bool Wait( void *&rv ); bool IsRunning() { return m_state == eTsRun; } bool IsMain() { return m_main; } protected: virtual void *Run() = 0; virtual void Exit( void *rv ); }; // simple locks class cThreadLock { protected: pthread_mutex_t m_lock; public: cThreadLock(); virtual ~cThreadLock(); virtual void Lock(); virtual void Unlock(); virtual bool TryLock(); }; class cThreadLockAuto { cThreadLock &m_lock; public: cThreadLockAuto( cThreadLock &lock ) : m_lock( lock ) { m_lock.Lock(); } ~cThreadLockAuto() { m_lock.Unlock(); } }; // read/write locks class cThreadLockRw { protected: pthread_rwlock_t m_rwlock; public: cThreadLockRw(); virtual ~cThreadLockRw(); virtual void ReadLock(); virtual void ReadUnlock(); virtual bool TryReadLock(); virtual void WriteLock(); virtual void WriteUnlock(); virtual bool TryWriteLock(); // true => no lock held bool CheckLock(); }; // condition class class cThreadCond : public cThreadLock { protected: pthread_cond_t m_cond; public: cThreadCond(); virtual ~cThreadCond(); // call Lock before Signal virtual void Signal(); // call Lock before Wait virtual void Wait(); }; #endif openhpi-2.14.1/plugins/ipmidirect/ipmi_control_atca_led.cpp0000644000076400007640000003373611302567000021027 0ustar /* * ipmi_control_atca_led.cpp * * Copyright (c) 2006 by ESO Technologies. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Pierre Sangouard */ extern "C" { #include "SaHpiAtca.h" } #include "ipmi_control_atca_led.h" #include "ipmi_resource.h" #include "ipmi_log.h" cIpmiControlAtcaLed::cIpmiControlAtcaLed( cIpmiMc *mc, unsigned int num, unsigned char led_color_capabilities, unsigned char led_default_local_color, unsigned char led_default_override_color) : cIpmiControl( mc, num, SAHPI_CTRL_LED, SAHPI_CTRL_TYPE_OEM ), m_num( num ), m_led_color_capabilities( led_color_capabilities ), m_led_default_local_color( led_default_local_color ), m_led_local_color( led_default_local_color ), m_led_default_override_color( led_default_override_color ), m_led_override_color( led_default_override_color ), m_set_led_state_supported( false ) { } cIpmiControlAtcaLed::~cIpmiControlAtcaLed() { } bool cIpmiControlAtcaLed::IsSupportedColor(AtcaHpiLedColorT hpi_color) { switch(hpi_color) { case ATCAHPI_LED_COLOR_BLUE: return ((m_led_color_capabilities & ATCAHPI_LED_BLUE) != 0); case ATCAHPI_LED_COLOR_RED: return ((m_led_color_capabilities & ATCAHPI_LED_RED) != 0); case ATCAHPI_LED_COLOR_GREEN: return ((m_led_color_capabilities & ATCAHPI_LED_GREEN) != 0); case ATCAHPI_LED_COLOR_AMBER: return ((m_led_color_capabilities & ATCAHPI_LED_AMBER) != 0); case ATCAHPI_LED_COLOR_ORANGE: return ((m_led_color_capabilities & ATCAHPI_LED_ORANGE) != 0); case ATCAHPI_LED_COLOR_WHITE: return ((m_led_color_capabilities & ATCAHPI_LED_WHITE) != 0); case ATCAHPI_LED_COLOR_NO_CHANGE: return true; case ATCAHPI_LED_COLOR_USE_DEFAULT: return true; case ATCAHPI_LED_COLOR_RESERVED: return false; } return false; } static unsigned char hpi_to_atca_color( AtcaHpiLedColorT hpi_color, unsigned char current_color, unsigned char default_color ) { switch(hpi_color) { case ATCAHPI_LED_COLOR_BLUE: return 0x01; case ATCAHPI_LED_COLOR_RED: return 0x02; case ATCAHPI_LED_COLOR_GREEN: return 0x03; case ATCAHPI_LED_COLOR_AMBER: return 0x04; case ATCAHPI_LED_COLOR_ORANGE: return 0x05; case ATCAHPI_LED_COLOR_WHITE: return 0x06; case ATCAHPI_LED_COLOR_NO_CHANGE: return current_color; case ATCAHPI_LED_COLOR_USE_DEFAULT: return default_color; case ATCAHPI_LED_COLOR_RESERVED: return 0x00; } return 0x00; } static AtcaHpiLedColorT atca_to_hpi_color( unsigned char atca_color ) { switch(atca_color & 0x0F) { case 0x01: return ATCAHPI_LED_COLOR_BLUE; case 0x02: return ATCAHPI_LED_COLOR_RED; case 0x03: return ATCAHPI_LED_COLOR_GREEN; case 0x04: return ATCAHPI_LED_COLOR_AMBER; case 0x05: return ATCAHPI_LED_COLOR_ORANGE; case 0x06: return ATCAHPI_LED_COLOR_WHITE; } return ATCAHPI_LED_COLOR_RESERVED; } bool cIpmiControlAtcaLed::CreateRdr( SaHpiRptEntryT &resource, SaHpiRdrT &rdr ) { if ( cIpmiControl::CreateRdr( resource, rdr ) == false ) return false; SaHpiCtrlRecT &rec = rdr.RdrTypeUnion.CtrlRec; SaHpiCtrlRecOemT &oem_rec = rec.TypeUnion.Oem; oem_rec.MId = ATCAHPI_PICMG_MID; oem_rec.ConfigData[0] = m_led_color_capabilities; oem_rec.ConfigData[1] = atca_to_hpi_color(m_led_default_local_color); oem_rec.ConfigData[2] = atca_to_hpi_color(m_led_default_override_color); oem_rec.Default.MId = ATCAHPI_PICMG_MID; oem_rec.Default.BodyLength = 6; oem_rec.Default.Body[0] = 0; oem_rec.Default.Body[1] = 0; oem_rec.Default.Body[2] = oem_rec.ConfigData[2]; oem_rec.Default.Body[3] = oem_rec.ConfigData[1]; oem_rec.Default.Body[4] = SAHPI_FALSE; oem_rec.Default.Body[5] = 0; cIpmiMsg ledmsg( eIpmiNetfnPicmg, eIpmiCmdSetFruLedState ); ledmsg.m_data[0] = dIpmiPicMgId; ledmsg.m_data[1] = Resource()->FruId(); ledmsg.m_data[2] = m_num; ledmsg.m_data_len = 6; cIpmiMsg ledrsp; /* There seems that there is an issue with ATCA-HPI mapping in that Req 4.5.7.7 says that an LED with a local control state and either an Override or Lamp test state should set the Control Mode Read Only status to SAHPI_FALSE, however there is no atomic way to check for support of the Override State. Therefore, there is no obvious "safe" way to implement the spec as stated, only best alternatives. The approach taken here is to set the Control Mode Read Only status to SAHPI_FALSE automatically if the LED has a local control state. This will allow for issuing the Set FRU LED state commands, however the unsupported states (Override and/or Lamp Test) will return the specified Completion Code of CCh(invalid date field), as stated in the ATCA base spec. */ if ( m_led_default_local_color == 0 ) { rec.DefaultMode.Mode = SAHPI_CTRL_MODE_MANUAL; rec.DefaultMode.ReadOnly = SAHPI_TRUE; m_set_led_state_supported = false; oem_rec.ConfigData[1] = 0; } else { rec.DefaultMode.Mode = SAHPI_CTRL_MODE_AUTO; rec.DefaultMode.ReadOnly = SAHPI_FALSE; m_set_led_state_supported = true; } rec.WriteOnly = SAHPI_FALSE; rec.Oem = ATCAHPI_PICMG_CT_ATCA_LED; return true; } SaErrorT cIpmiControlAtcaLed::SetState( const SaHpiCtrlModeT &mode, const SaHpiCtrlStateT &state ) { cIpmiMsg ledmsg( eIpmiNetfnPicmg, eIpmiCmdSetFruLedState ); ledmsg.m_data[0] = dIpmiPicMgId; ledmsg.m_data[1] = Resource()->FruId(); ledmsg.m_data[2] = m_num; ledmsg.m_data_len = 6; if ( mode == SAHPI_CTRL_MODE_AUTO ) { if ( m_led_default_local_color == 0 ) return SA_ERR_HPI_READ_ONLY; ledmsg.m_data[3] = 0xFC; ledmsg.m_data[4] = 0x00; ledmsg.m_data[5] = m_led_local_color; } else if ( mode != SAHPI_CTRL_MODE_MANUAL ) { return SA_ERR_HPI_INVALID_PARAMS; } else { if ( m_set_led_state_supported == false ) return SA_ERR_HPI_READ_ONLY; if ( &state == NULL ) return SA_ERR_HPI_INVALID_PARAMS; if ( state.Type != SAHPI_CTRL_TYPE_OEM ) return SA_ERR_HPI_INVALID_DATA; if ( state.StateUnion.Oem.MId != ATCAHPI_PICMG_MID ) return SA_ERR_HPI_INVALID_DATA; if ( state.StateUnion.Oem.BodyLength != 6 ) return SA_ERR_HPI_INVALID_DATA; if ( state.StateUnion.Oem.Body[4] == SAHPI_TRUE ) { if ( state.StateUnion.Oem.Body[5] > 127 ) return SA_ERR_HPI_INVALID_PARAMS; } if ( state.StateUnion.Oem.Body[1] == 0xFF ) { if ( state.StateUnion.Oem.Body[0] != 0x00 ) return SA_ERR_HPI_INVALID_PARAMS; } else if ( state.StateUnion.Oem.Body[1] == 0x00 ) { if ( state.StateUnion.Oem.Body[0] != 0x00 ) return SA_ERR_HPI_INVALID_PARAMS; } else if ( state.StateUnion.Oem.Body[1] > 0xFA ) { return SA_ERR_HPI_INVALID_PARAMS; } if ( state.StateUnion.Oem.Body[0] > 0xFA ) { return SA_ERR_HPI_INVALID_PARAMS; } else if ( state.StateUnion.Oem.Body[0] == 0 ) { if (( state.StateUnion.Oem.Body[1] != 0xFF ) && ( state.StateUnion.Oem.Body[1] != 0x00 )) return SA_ERR_HPI_INVALID_PARAMS; } if ( IsSupportedColor((AtcaHpiLedColorT)state.StateUnion.Oem.Body[2]) == false ) return SA_ERR_HPI_INVALID_PARAMS; if ( m_led_default_local_color != 0 ) { if ( IsSupportedColor((AtcaHpiLedColorT)state.StateUnion.Oem.Body[3]) == false ) return SA_ERR_HPI_INVALID_PARAMS; } m_led_override_color = hpi_to_atca_color((AtcaHpiLedColorT)state.StateUnion.Oem.Body[2], m_led_override_color, m_led_default_override_color); if ( m_led_default_local_color != 0 ) m_led_local_color = hpi_to_atca_color((AtcaHpiLedColorT)state.StateUnion.Oem.Body[3], m_led_local_color, m_led_default_local_color); if ( state.StateUnion.Oem.Body[4] == SAHPI_TRUE ) { ledmsg.m_data[3] = 0xFB; ledmsg.m_data[4] = state.StateUnion.Oem.Body[5]; } else { if ( state.StateUnion.Oem.Body[1] == 0xFF ) { ledmsg.m_data[3] = 0xFF; ledmsg.m_data[4] = 0x00; } else if ( state.StateUnion.Oem.Body[1] == 0x00 ) { ledmsg.m_data[3] = 0x00; ledmsg.m_data[4] = 0x00; } else { ledmsg.m_data[3] = state.StateUnion.Oem.Body[0]; ledmsg.m_data[4] = state.StateUnion.Oem.Body[1]; } } ledmsg.m_data[5] = m_led_override_color; } cIpmiMsg ledrsp; SaErrorT rv = Resource()->SendCommandReadLock( this, ledmsg, ledrsp ); if ( rv != SA_OK || ledrsp.m_data_len < 2 || ledrsp.m_data[0] != eIpmiCcOk || ledrsp.m_data[1] != dIpmiPicMgId ) { stdlog << "cannot set FRU LED state !\n"; return (rv != SA_OK) ? rv : SA_ERR_HPI_INVALID_REQUEST; } return SA_OK; } SaErrorT cIpmiControlAtcaLed::GetState( SaHpiCtrlModeT &mode, SaHpiCtrlStateT &state ) { cIpmiMsg ledmsg( eIpmiNetfnPicmg, eIpmiCmdGetFruLedState ); ledmsg.m_data[0] = dIpmiPicMgId; ledmsg.m_data[1] = Resource()->FruId(); ledmsg.m_data[2] = m_num; ledmsg.m_data_len = 3; cIpmiMsg ledrsp; SaErrorT rv = Resource()->SendCommandReadLock( this, ledmsg, ledrsp ); if ( rv != SA_OK || ledrsp.m_data_len < 6 || ledrsp.m_data[0] != eIpmiCcOk || ledrsp.m_data[1] != dIpmiPicMgId ) { stdlog << "cannot get FRU LED state !\n"; return (rv != SA_OK) ? rv : SA_ERR_HPI_INVALID_REQUEST; } if ( &mode != NULL ) { if ( (ledrsp.m_data[2] & 0x06) != 0 ) { mode = SAHPI_CTRL_MODE_MANUAL; } else { mode = SAHPI_CTRL_MODE_AUTO; } } if ( &state != NULL) { state.Type = SAHPI_CTRL_TYPE_OEM; state.StateUnion.Oem.MId = ATCAHPI_PICMG_MID; state.StateUnion.Oem.BodyLength = 6; // Lamp test on if ( (ledrsp.m_data[2] & 0x04) != 0 ) { if ( ledrsp.m_data[6] == 0x00 ) { state.StateUnion.Oem.Body[0] = 0; state.StateUnion.Oem.Body[1] = 0; } else if ( ledrsp.m_data[6] == 0xFF ) { state.StateUnion.Oem.Body[0] = 0; state.StateUnion.Oem.Body[1] = 0xFF; } else { state.StateUnion.Oem.Body[0] = ledrsp.m_data[6]; state.StateUnion.Oem.Body[1] = ledrsp.m_data[7]; } state.StateUnion.Oem.Body[2] = atca_to_hpi_color(ledrsp.m_data[8]); state.StateUnion.Oem.Body[3] = atca_to_hpi_color(ledrsp.m_data[5]); state.StateUnion.Oem.Body[4] = SAHPI_TRUE; state.StateUnion.Oem.Body[5] = ledrsp.m_data[9]; } // Override state on else if ( (ledrsp.m_data[2] & 0x02) != 0 ) { if ( ledrsp.m_data[6] == 0x00 ) { state.StateUnion.Oem.Body[0] = 0; state.StateUnion.Oem.Body[1] = 0; } else if ( ledrsp.m_data[6] == 0xFF ) { state.StateUnion.Oem.Body[0] = 0; state.StateUnion.Oem.Body[1] = 0xFF; } else { state.StateUnion.Oem.Body[0] = ledrsp.m_data[6]; state.StateUnion.Oem.Body[1] = ledrsp.m_data[7]; } state.StateUnion.Oem.Body[2] = atca_to_hpi_color(ledrsp.m_data[8]); state.StateUnion.Oem.Body[3] = atca_to_hpi_color(ledrsp.m_data[5]); state.StateUnion.Oem.Body[4] = SAHPI_FALSE; state.StateUnion.Oem.Body[5] = 0; } else { if ( ledrsp.m_data[3] == 0x00 ) { state.StateUnion.Oem.Body[0] = 0; state.StateUnion.Oem.Body[1] = 0; } else if ( ledrsp.m_data[3] == 0xFF ) { state.StateUnion.Oem.Body[0] = 0; state.StateUnion.Oem.Body[1] = 0xFF; } else { state.StateUnion.Oem.Body[0] = ledrsp.m_data[3]; state.StateUnion.Oem.Body[1] = ledrsp.m_data[4]; } state.StateUnion.Oem.Body[2] = atca_to_hpi_color(m_led_override_color); state.StateUnion.Oem.Body[3] = atca_to_hpi_color(ledrsp.m_data[5]); state.StateUnion.Oem.Body[4] = SAHPI_FALSE; state.StateUnion.Oem.Body[5] = 0; } } return SA_OK; } void cIpmiControlAtcaLed::Dump( cIpmiLog &dump, const char *name ) const { dump.Begin( "AtcaLedControl", name ); dump.Entry( "LedNum" ) << m_num << ";\n"; dump.End(); } openhpi-2.14.1/plugins/ipmidirect/ipmi_log.cpp0000644000076400007640000001465511302567000016313 0ustar /* * * Copyright (c) 2003,2004 by FORCE Computers. * Copyright (c) 2007 by ESO Technologies. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Thomas Kanngieser * Pierre Sangouard */ #include #include #include #include #include #include #include #include #include #include #include "ipmi_log.h" #include "ipmi_utils.h" cIpmiLog stdlog; cIpmiLog::cIpmiLog() : m_lock_count( 0 ), m_open_count( 0 ), m_hex( false ), m_time( false ), m_recursive( false ), m_std_out( false ), m_std_err( false ) { } cIpmiLog::~cIpmiLog() { } bool cIpmiLog::Open( int properties, const char *filename, int max_log_files ) { m_open_count++; if ( m_open_count > 1 ) // already open return true; assert( m_lock_count == 0 ); if ( properties & dIpmiLogStdOut ) m_std_out = true; if ( properties & dIpmiLogStdErr ) m_std_err = true; char file[1024] = ""; if ( properties & dIpmiLogLogFile ) { char tf[1024]; int i; struct stat st1, st2; if ( filename == 0 || *filename == 0 ) { fprintf( stderr, "not filename for logfile !\n" ); return false; } // max numbers of logfiles if ( max_log_files < 1 ) max_log_files = 1; // find a new one or the oldes logfile for( i = 0; i < max_log_files; i++ ) { snprintf( tf, sizeof(tf), "%s%02d.log", filename, i ); if ( file[0] == 0 ) strcpy( file, tf ); if ( !stat( tf, &st1 ) && S_ISREG( st1. st_mode ) ) { if ( !stat( file, &st2 ) && S_ISREG( st1. st_mode ) && st2.st_mtime > st1.st_mtime ) strcpy( file, tf ); } else { strcpy( file, tf ); break; } } } if ( properties & dIpmiLogFile ) { if ( filename == 0 || *filename == 0 ) { fprintf( stderr, "not filename for logfile !\n" ); return false; } strcpy( file, filename ); } if ( file[0] ) { m_fd = fopen( file, "w" ); if ( m_fd == 0 ) { fprintf( stderr, "can not open logfile %s\n", file ); return false; } } m_nl = true; return true; } void cIpmiLog::Close() { m_open_count--; assert( m_open_count >= 0 ); if ( m_open_count > 0 ) return; assert( m_lock_count == 0 ); assert( m_nl ); if ( m_fd ) { fclose( m_fd ); m_fd = 0; } m_std_out = false; m_std_err = false; } void cIpmiLog::Output( const char *str ) { int l = strlen( str ); size_t fwrote; if ( m_fd ) fwrote = fwrite( str, l, 1, m_fd ); if ( m_std_out ) fwrote = fwrite( str, l, 1, stdout ); if ( m_std_err ) fwrote = fwrite( str, l, 1, stderr ); } void cIpmiLog::Start() { //Lock(); if ( m_nl ) { if ( m_time ) { struct timeval tv; gettimeofday( &tv, 0 ); char b[dDateTimeStringSize+5]; IpmiDateTimeToString( tv.tv_sec, b ); #if defined(__sparc) || defined(__sparc__) snprintf( b + dDateTimeStringSize - 1, 6, ".%03ld ", (long)tv.tv_usec / 1000 ); #else snprintf( b + dDateTimeStringSize - 1, 6, ".%03ld ", tv.tv_usec / 1000 ); #endif Output( b ); } } } cIpmiLog & cIpmiLog::operator<<( bool b ) { Start(); Output( b ? "true" : "false" ); return *this; } cIpmiLog & cIpmiLog::operator<<( unsigned char c ) { Start(); char b[5]; snprintf( b, sizeof(b), "0x%02x", c ); Output( b ); return *this; } cIpmiLog & cIpmiLog::operator<<( int i ) { Start(); char b[20]; snprintf( b, sizeof(b), "%d", i ); Output( b ); return *this; } cIpmiLog & cIpmiLog::operator<<( unsigned int i ) { Start(); char b[20]; if ( m_hex ) snprintf( b, sizeof(b), "0x%08x", i ); else snprintf( b, sizeof(b), "%u", i ); Output( b ); return *this; } cIpmiLog & cIpmiLog::operator<<( double d ) { Start(); char b[20]; snprintf( b, sizeof(b), "%f", d ); Output( b ); return *this; } cIpmiLog & cIpmiLog::operator<<( const char *str ) { Log( "%s", str ); return *this; } void cIpmiLog::Log( const char *fmt, ... ) { Start(); va_list ap; va_start( ap, fmt ); char b[10240]; vsnprintf( b, 10240, fmt, ap ); va_end( ap ); char buf[10230] = ""; char *p = b; char *q = buf; m_nl = false; while( *p ) { if ( *p == '\n' ) { m_nl = true; *q++ = *p++; *q = 0; Output( buf ); q = buf; continue; } m_nl = false; *q++ = *p++; } if ( q != b ) { *q = 0; Output( buf ); } if ( m_nl ) { if ( m_fd ) fflush( m_fd ); if ( m_std_out ) fflush( stdout ); if ( m_std_err ) fflush( stderr ); //while( m_lock_count > 0 ) // Unlock(); } } void cIpmiLog::Hex( const unsigned char *data, int size ) { char str[256]; char *s = str; int i, remaining; for( i = 0; i < size; i++ ) { if ( i != 0 && (i % 16) == 0 ) { Log( "%s\n", str ); s = str; } remaining = sizeof(str) - (s - str); if (remaining > 0) s += snprintf( s, remaining, " %02x", *data++ ); } if ( s != str ) Log( "%s\n", str ); } void cIpmiLog::Begin( const char *section, const char *name ) { if ( IsRecursive() ) *this << section << " \"" << name << "\"\n{\n"; } void cIpmiLog::End() { if ( IsRecursive() ) *this << "}\n\n\n"; } cIpmiLog & cIpmiLog::Entry( const char *entry ) { char str[256]; strcpy( str, entry ); int l = 30 - strlen( entry ); if ( l > 0 ) { char *p = str + strlen( entry ); while( l-- > 0 ) *p++ = ' '; *p = 0; } *this << " " << str << " = "; return *this; } openhpi-2.14.1/plugins/ipmidirect/ipmi_con_lan.cpp0000644000076400007640000007251511302567000017142 0ustar /* * * Copyright (c) 2003,2004 by FORCE Computers * Copyright (c) 2005 by ESO Technologies. * * Note that this file is based on parts of OpenIPMI * written by Corey Minyard * of MontaVista Software. Corey's code was helpful * and many thanks go to him. He gave the permission * to use this code in OpenHPI under BSD license. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Thomas Kanngieser * Pierre Sangouard */ #include #include #include #include #include #include #include #include #include "ipmi_con_lan.h" // For Solaris #ifndef timersub #define timersub(a, b, result) \ do { \ (result)->tv_sec = (a)->tv_sec - (b)->tv_sec; \ (result)->tv_usec = (a)->tv_usec - (b)->tv_usec; \ if ((result)->tv_usec < 0) { \ --(result)->tv_sec; \ (result)->tv_usec += 1000000; \ } \ } while (0) #endif #define dIpmiMaxLanLen (dIpmiMaxMsgLength + 42) cIpmiConLan::cIpmiConLan( unsigned int timeout, int log_level, struct in_addr addr, int port, tIpmiAuthType auth, tIpmiPrivilege priv, char *user, char *passwd ) : cIpmiCon( timeout, log_level ), m_port( port ), m_auth( auth ), m_priv( priv ), m_auth_method( 0 ), m_session_id( 0 ), m_working_auth( eIpmiAuthTypeNone ), m_ping_count( 0 ), m_outbound_seq_num( 0 ), m_inbound_seq_num( 0 ), m_recv_msg_map( 0 ) { m_ip_addr.sin_family = AF_INET; m_ip_addr.sin_port = htons( port ); m_ip_addr.sin_addr = addr; m_port = port; memset( m_username, 0, dIpmiUsernameMax ); strncpy( m_username, user, dIpmiUsernameMax ); memset( m_passwd, 0, dIpmiPasswordMax ); strncpy( m_passwd, passwd, dIpmiPasswordMax ); } cIpmiConLan::~cIpmiConLan() { if ( IsOpen() ) Close(); if ( m_auth_method ) delete m_auth_method; } int cIpmiConLan::AuthGen( unsigned char *out, uint8_t *ses_id, uint8_t *seq, unsigned char *data, unsigned int data_len ) { if ( m_auth != m_working_auth ) return SA_ERR_HPI_INVALID_PARAMS; if ( !m_auth_method ) return SA_ERR_HPI_INVALID_PARAMS; int rv; cIpmiAuthSg l[] = { { ses_id, 4 }, { data, data_len }, { seq, 4 }, { NULL, 0 } }; rv = m_auth_method->Gen( l, out ); return rv; } int cIpmiConLan::AuthCheck( uint8_t *ses_id, uint8_t *seq, unsigned char *data, unsigned int data_len, unsigned char *code ) { if ( m_auth != m_working_auth ) return SA_ERR_HPI_INVALID_PARAMS; if ( !m_auth_method ) return SA_ERR_HPI_INVALID_PARAMS; int rv; cIpmiAuthSg l[] = { { ses_id, 4 }, { data, data_len }, { seq, 4 }, { NULL, 0 } }; rv = m_auth_method->Check( l, code ); return rv; } int cIpmiConLan::OpenLanFd() { int fd; struct sockaddr_in addr; int curr_port; int rv; fd = socket( PF_INET, SOCK_DGRAM, IPPROTO_UDP ); if ( fd == -1 ) return fd; curr_port = 7000; do { curr_port++; addr.sin_family = AF_INET; addr.sin_port = htons( curr_port ); addr.sin_addr.s_addr = INADDR_ANY; rv = bind( fd, (struct sockaddr *)&addr, sizeof( addr ) ); } while( curr_port < 7100 && rv == -1 ); if ( rv == -1 ) { int tmp_errno = errno; close( fd ); errno = tmp_errno; return -1; } stdlog << "using port " << curr_port << ".\n"; return fd; } unsigned char cIpmiConLan::Checksum( unsigned char *data, int size ) { unsigned char csum = 0; for( ; size > 0; size--, data++ ) csum += *data; return -csum; } int cIpmiConLan::SendPing() { unsigned char data[dIpmiMaxLanLen]; data[0] = 6; // RMCP version 1.0. data[1] = 0; data[2] = 0xff; // no RMCP ACK data[3] = 0x06; // ASF IpmiSetUint32( data + 4, dAsfIana ); data[8] = 0x80; // presence ping data[9] = 0xff; // ???? data[10] = 0x00; data[11] = 0x00; stdlog << "sending RMCP ping.\n"; int rv = sendto( m_fd, data, 12, 0, (struct sockaddr *)&m_ip_addr, sizeof( struct sockaddr_in ) ); if ( rv == -1 ) return errno; m_ping_count++; return 0; } bool cIpmiConLan::WaitForPong( unsigned int timeout_ms ) { struct pollfd pfd; pfd.fd = m_fd; pfd.events = POLLIN; tResponseType ret; // loop do { int rv = poll( &pfd, 1, timeout_ms ); // timeout if ( !rv ) return false; if ( rv == -1 ) { stdlog << "poll failed while waiting for pong.\n"; return false; } if ( rv != 1 ) stdlog << "poll return != 1 while waiting for pong.\n"; int seq; cIpmiAddr addr; cIpmiMsg msg; ret = ReadResponse( seq, addr, msg ); if ( ret == eResponseTypeMessage ) { stdlog << "reading unexpected message while waiting for pong:\n"; IpmiLogDataMsg( addr, msg ); } } while( ret != eResponseTypePong ); return true; } cIpmiConLan::tResponseType cIpmiConLan::WaitForResponse( unsigned int timeout_ms, int &seq, cIpmiAddr &addr, cIpmiMsg &msg ) { struct timeval tv; struct timeval timeout; struct timeval t0; // create absolute timeout gettimeofday( &timeout, 0 ); timeout.tv_sec += timeout_ms / 1000; timeout.tv_usec += (timeout_ms % 1000) * 1000; while( timeout.tv_usec > 1000000 ) { timeout.tv_sec++; timeout.tv_usec -= 1000000; } tResponseType ret; // loop do { struct pollfd pfd; pfd.fd = m_fd; pfd.events = POLLIN; // relative timeout gettimeofday( &t0, 0 ); timersub( &timeout, &t0, &tv ); if ( tv.tv_sec < 0 || tv.tv_usec < 0 ) { tv.tv_sec = 0; tv.tv_usec = 0; } timeout_ms = tv.tv_sec * 1000 + tv.tv_usec / 1000; int rv = poll( &pfd, 1, timeout_ms ); // timeout if ( !rv ) return eResponseTypeTimeout; if ( rv == -1 ) { stdlog << "poll failed while waiting for response.\n"; return eResponseTypeError; } if ( rv != 1 ) stdlog << "poll return != 1 while waiting for response.\n"; ret = ReadResponse( seq, addr, msg ); } while( ret != eResponseTypeMessage ); if ( m_log_level & dIpmiConLogCmd ) { m_log_lock.Lock(); stdlog << "m_retries_left = dIpmiDefaultRetries; int seq; while( r->m_retries_left > 0 ) { SaErrorT rv = SendCmd( r ); if ( rv != SA_OK ) continue; tResponseType rt; do { rt = WaitForResponse( m_timeout, seq, rsp_addr, rsp_msg ); } while( rt == eResponseTypeEvent || rt == eResponseTypePong ); RemOutstanding( r->m_seq ); if ( rt == eResponseTypeMessage ) { // check seq if ( seq == r->m_seq ) { delete r; return SA_OK; } } // resend message stdlog << "resending RMCP msg.\n"; } return SA_ERR_HPI_TIMEOUT; } SaErrorT cIpmiConLan::AuthCap() { SaErrorT rv; cIpmiAddr addr( eIpmiAddrTypeSystemInterface ); cIpmiMsg msg( eIpmiNetfnApp, eIpmiCmdGetChannelAuthCapabilities ); cIpmiAddr rsp_addr; cIpmiMsg rsp_msg; msg.m_data[0] = 0xe; msg.m_data[1] = m_priv; msg.m_data_len = 2; rv = SendMsgAndWaitForResponse( addr, msg, rsp_addr, rsp_msg ); if ( rv != SA_OK ) return rv; if ( (rsp_msg.m_data[0] != 0 ) || (rsp_msg.m_data_len < 9 ) ) { stdlog << "auth response = " << rsp_msg.m_data[0] << " !\n"; return SA_ERR_HPI_INVALID_DATA; } if ( !( rsp_msg.m_data[2] & (1 << m_auth ) ) ) { stdlog << "Requested authentication not supported !\n"; char str[256] = ""; if ( rsp_msg.m_data[2] & ( 1 << eIpmiAuthTypeNone ) ) strcat( str, " none" ); if ( rsp_msg.m_data[2] & ( 1 << eIpmiAuthTypeMd2 ) ) strcat( str, " md2" ); if ( rsp_msg.m_data[2] & ( 1 << eIpmiAuthTypeMd5 ) ) strcat( str, " md5" ); if ( rsp_msg.m_data[2] & ( 1 << eIpmiAuthTypeStraight ) ) strcat( str, " straight" ); if ( rsp_msg.m_data[2] & ( 1 << eIpmiAuthTypeOem ) ) strcat( str, " oem" ); stdlog << "supported authentication types: " << str << ".\n"; return SA_ERR_HPI_INVALID_DATA; } return SA_OK; } SaErrorT cIpmiConLan::SetSessionPriv() { SaErrorT rv; cIpmiAddr addr( eIpmiAddrTypeSystemInterface ); cIpmiMsg msg( eIpmiNetfnApp, eIpmiCmdSetSessionPrivilege ); cIpmiAddr rsp_addr; cIpmiMsg rsp_msg; msg.m_data[0] = m_priv; msg.m_data_len = 1; rv = SendMsgAndWaitForResponse( addr, msg, rsp_addr, rsp_msg ); if ( rv != SA_OK ) return rv; if ( rsp_msg.m_data[0] != 0 ) { stdlog << "set session priv: " << rsp_msg.m_data[0] << " !\n"; return SA_ERR_HPI_INVALID_DATA; } if ( rsp_msg.m_data_len < 2 ) { stdlog << "set session priv: msg to small: " << rsp_msg.m_data_len << " !\n"; return SA_ERR_HPI_INVALID_DATA; } if ( (unsigned char)m_priv != (rsp_msg.m_data[1] & 0xf)) { // Requested privilege level did not match. stdlog << "set session priv: Requested privilege level did not match: " << m_priv << ", " << (rsp_msg.m_data[1] & 0xf ) << " !\n"; return SA_ERR_HPI_INVALID_DATA; } return SA_OK; } SaErrorT cIpmiConLan::ActiveSession() { SaErrorT rv; cIpmiAddr addr( eIpmiAddrTypeSystemInterface ); cIpmiMsg msg( eIpmiNetfnApp, eIpmiCmdActivateSession ); cIpmiAddr rsp_addr; cIpmiMsg rsp_msg; msg.m_data[0] = m_auth; msg.m_data[1] = m_priv; memcpy( msg.m_data + 2, m_challenge_string, 16 ); IpmiSetUint32( msg.m_data + 18, m_inbound_seq_num ); msg.m_data_len = 22; rv = SendMsgAndWaitForResponse( addr, msg, rsp_addr, rsp_msg ); if ( rv != SA_OK ) return rv; if ( rsp_msg.m_data[0] != 0 ) { stdlog << "active session: " << rsp_msg.m_data[0] << " !\n"; return SA_ERR_HPI_INVALID_DATA; } if ( rsp_msg.m_data_len < 11 ) { stdlog << "active session: msg to small: " << rsp_msg.m_data_len << " !\n"; return SA_ERR_HPI_INVALID_DATA; } m_working_auth = (tIpmiAuthType)(rsp_msg.m_data[1] & 0xf); if ( m_working_auth != eIpmiAuthTypeNone && m_working_auth != m_auth ) { // Eh? It didn't return a valid authtype. stdlog << "active session: wrong auth: " << m_working_auth << " !\n"; return SA_ERR_HPI_INVALID_DATA; } m_session_id = IpmiGetUint32( rsp_msg.m_data + 2 ); m_outbound_seq_num = IpmiGetUint32( rsp_msg.m_data + 6 ); return SA_OK; } SaErrorT cIpmiConLan::Challange() { SaErrorT rv; cIpmiAddr addr( eIpmiAddrTypeSystemInterface ); cIpmiMsg msg( eIpmiNetfnApp, eIpmiCmdGetSessionChallenge ); cIpmiAddr rsp_addr; cIpmiMsg rsp_msg; msg.m_data[0] = m_auth; msg.m_data_len = 1; memcpy( msg.m_data + 1, m_username, dIpmiUsernameMax ); msg.m_data_len += dIpmiUsernameMax; rv = SendMsgAndWaitForResponse( addr, msg, rsp_addr, rsp_msg ); if ( rv != SA_OK ) return rv; if ( rsp_msg.m_data[0] != 0 ) { stdlog << "Challange returns: " << rsp_msg.m_data[0] << " !\n"; return SA_ERR_HPI_INVALID_DATA; } if ( rsp_msg.m_data_len < 21 ) { stdlog << "Challange response to small !\n"; return SA_ERR_HPI_INVALID_DATA; } // Get the temporary session id. m_session_id = IpmiGetUint32( rsp_msg.m_data + 1 ); m_outbound_seq_num = 0; m_working_auth = m_auth; memcpy( m_challenge_string, rsp_msg.m_data + 5, 16 ); // Get a random number of the other end to start sending me sequence // numbers at, but don't let it be zero. while( m_inbound_seq_num == 0 ) m_inbound_seq_num = random(); return SA_OK; } int cIpmiConLan::IfGetMaxSeq() { return 64; } int cIpmiConLan::IfOpen() { m_auth_method = IpmiAuthFactory( m_auth ); if ( m_auth_method == 0 ) { stdlog << "unknown authentication method " << m_auth << " !\n"; return -1; } m_auth_method->Init( (unsigned char *)m_passwd ); m_fd = OpenLanFd(); if ( m_fd < 0 ) return -1; SaErrorT rv = CreateSession(); if ( rv != SA_OK ) { close( m_fd ); m_fd = -1; } return m_fd; } SaErrorT cIpmiConLan::CreateSession() { m_ping_count = 0; m_outbound_seq_num = 0; m_session_id = 0; m_working_auth = eIpmiAuthTypeNone; m_recv_msg_map = 0; m_inbound_seq_num = 0; // start seq with 0 m_current_seq = 0; SaErrorT rv = AuthCap(); if ( rv != SA_OK ) return rv; rv = Challange(); if ( rv != SA_OK ) return rv; rv = ActiveSession(); if ( rv != SA_OK ) return rv; rv = SetSessionPriv(); if ( rv != SA_OK ) return rv; if ( m_num_outstanding != 0 ) return SA_ERR_HPI_INTERNAL_ERROR; // reset seq m_current_seq = 0; stdlog << "RMCP session is up.\n"; return SA_OK; } // Send a final "close session" to shut down the connection. void cIpmiConLan::SendCloseSession() { cIpmiAddr si( eIpmiAddrTypeSystemInterface ); cIpmiMsg msg( eIpmiNetfnApp, eIpmiCmdCloseSession ); IpmiSetUint32( msg.m_data, m_session_id ); msg.m_data_len = 4; cIpmiRequest r( si, msg ); r.m_seq = 1; IfSendCmd( &r ); } void cIpmiConLan::IfClose() { if ( m_fd >= 0 ) { SendCloseSession(); close( m_fd ); m_fd = -1; if ( m_auth_method ) { delete m_auth_method; m_auth_method = 0; } } } void cIpmiConLan::Reconnect() { stdlog << "RMCP reconnection in progress.\n"; RequeueOutstanding(); GList *list = m_queue; m_queue = 0; while( true ) { // send a ping SendPing(); if ( WaitForPong( m_timeout ) == false ) continue; stdlog << "close old RMCP session.\n"; SendCloseSession(); stdlog << "create new RMCP session.\n"; if ( CreateSession() == SA_OK ) break; } m_queue = list; stdlog << "RMCP reconnection done.\n"; } SaErrorT cIpmiConLan::IfSendCmd( cIpmiRequest *r ) { IfAddrToSendAddr( r->m_addr, r->m_send_addr ); unsigned char data[dIpmiMaxLanLen]; unsigned char *tmsg; int pos; int msgstart; switch( r->m_send_addr.m_type ) { case eIpmiAddrTypeSystemInterface: case eIpmiAddrTypeIpmb: case eIpmiAddrTypeIpmbBroadcast: break; default: return SA_ERR_HPI_INVALID_PARAMS; } data[0] = 6; // RMCP version 1.0. data[1] = 0; data[2] = 0xff; data[3] = 0x07; data[4] = m_working_auth; IpmiSetUint32( data+5, m_outbound_seq_num ); IpmiSetUint32( data+9, m_session_id ); if ( m_working_auth == eIpmiAuthTypeNone ) tmsg = data + 14; else tmsg = data + 30; if ( r->m_send_addr.m_type == eIpmiAddrTypeSystemInterface ) { // It's a message straight to the BMC. tmsg[0] = dIpmiBmcSlaveAddr; // To the BMC. tmsg[1] = (r->m_msg.m_netfn << 2) | r->m_send_addr.m_lun; tmsg[2] = Checksum( tmsg, 2 ); tmsg[3] = 0x81; // Remote console IPMI Software ID tmsg[4] = r->m_seq << 2; tmsg[5] = r->m_msg.m_cmd; memcpy( tmsg + 6, r->m_msg.m_data, r->m_msg.m_data_len ); pos = r->m_msg.m_data_len + 6; tmsg[pos] = Checksum( tmsg + 3, pos - 3 ); pos++; } else { // It's an IPMB address, route it using a send message // command. pos = 0; tmsg[pos++] = dIpmiBmcSlaveAddr; // BMC is the bridge. tmsg[pos++] = (eIpmiNetfnApp << 2) | 0; tmsg[pos++] = Checksum( tmsg, 2 ); tmsg[pos++] = 0x81; // Remote console IPMI Software ID tmsg[pos++] = r->m_seq << 2; tmsg[pos++] = eIpmiCmdSendMsg; tmsg[pos++] = (r->m_send_addr.m_channel & 0xf) | (1 << 6); // Turn on tracking if ( r->m_send_addr.m_type == eIpmiAddrTypeIpmbBroadcast ) tmsg[pos++] = 0; // Do a broadcast. msgstart = pos; tmsg[pos++] = r->m_send_addr.m_slave_addr; tmsg[pos++] = (r->m_msg.m_netfn << 2) | r->m_send_addr.m_lun; tmsg[pos++] = Checksum( tmsg + msgstart, 2 ); msgstart = pos; tmsg[pos++] = dIpmiBmcSlaveAddr; tmsg[pos++] = (r->m_seq << 2) | 2; // Add 2 as the SMS Lun tmsg[pos++] = r->m_msg.m_cmd; memcpy( tmsg + pos, r->m_msg.m_data, r->m_msg.m_data_len ); pos += r->m_msg.m_data_len; tmsg[pos] = Checksum( tmsg + msgstart, pos - msgstart ); pos++; tmsg[pos] = Checksum( tmsg + 3, pos - 3 ); pos++; } if ( m_working_auth == eIpmiAuthTypeNone ) { // No authentication, so no authcode. data[13] = pos; pos += 14; // Convert to pos in data } else { data[29] = pos; int rv = AuthGen( data+13, data+9, data+5, tmsg, pos ); if ( rv ) return SA_ERR_HPI_INVALID_PARAMS; pos += 30; // Convert to pos in data } // Increment the outbound number, but make sure it's not zero. If // it's already zero, ignore it, we are in pre-setup. if ( m_outbound_seq_num != 0 ) { m_outbound_seq_num++; if ( m_outbound_seq_num == 0 ) m_outbound_seq_num++; } int rv = sendto( m_fd, data, pos, 0, (struct sockaddr *)&m_ip_addr, sizeof(struct sockaddr_in) ); if ( rv == -1 ) return SA_ERR_HPI_NOT_PRESENT; return SA_OK; } cIpmiConLan::tResponseType cIpmiConLan::ReadResponse( int &seq, cIpmiAddr &addr, cIpmiMsg &msg ) { unsigned char data[dIpmiMaxLanLen]; struct sockaddr ipaddrd; struct sockaddr_in *ipaddr; int len; socklen_t from_len; uint32_t sess_id; unsigned char *tmsg; unsigned int data_len; from_len = sizeof( ipaddrd ); len = recvfrom( m_fd, data, dIpmiMaxLanLen, 0, &ipaddrd, &from_len ); if ( len < 0 ) return eResponseTypeError; // Make sure the source IP matches what we expect the other end to // be. ipaddr = (struct sockaddr_in *)(void *)&ipaddrd; if ( (ipaddr->sin_port != m_ip_addr.sin_port) || (ipaddr->sin_addr.s_addr != m_ip_addr.sin_addr.s_addr) ) { stdlog << "Dropped message due to invalid IP !\n"; return eResponseTypeError; } // Validate the length first, so we know that all the data in the // buffer we will deal with is valid. if ( len < 21 ) { // Minimum size of an IPMI msg. stdlog << "Dropped message because too small(1)\n"; return eResponseTypeError; } // Validate the RMCP portion of the message. if ( data[0] != 6 || data[2] != 0xff ) { stdlog << "Dropped message not valid IPMI/RMCP !\n"; return eResponseTypeError; } if ( data[3] == 0x06 ) { unsigned int asf_iana = IpmiGetUint32( data+4 ); if ( asf_iana != dAsfIana || data[8] != 0x40 ) { stdlog.Log( "Dropped message not valid RMCP pong message %04x, %04x, %02x !\n", asf_iana, dAsfIana, data[8] ); return eResponseTypeError; } m_ping_count--; stdlog << "reading RMCP pong.\n"; return eResponseTypePong; } if ( data[3] != 0x07 ) { stdlog << "Dropped message not valid IPMI/RMCP\n"; return eResponseTypeError; } if ( data[4] == 0 ) { // No authentication. if ( len < data[13] + 14 ) { // Not enough data was supplied, reject the message. stdlog << "Dropped message because too small(2)\n"; return eResponseTypeError; } // not enoough data bytes if ( data[13] <= 0 ) { // Not enough data was supplied, reject the message. stdlog << "Dropped message because data len is <=0 (1)\n"; return eResponseTypeError; } data_len = data[13]; } else { if ( len < 37 ) { // Minimum size of an authenticated IPMI msg. stdlog << "Dropped message because too small(3)\n"; return eResponseTypeError; } // authcode in message, add 16 to the above checks. if ( len < data[29] + 30 ) { // Not enough data was supplied, reject the message. stdlog << "Dropped message because too small(4)\n"; return eResponseTypeError; } // not enoough data bytes if ( data[29] <= 0 ) { // Not enough data was supplied, reject the message. stdlog << "Dropped message because data len is <=0 (2)\n"; return eResponseTypeError; } data_len = data[29]; } // Drop if the authtypes are incompatible. if ( m_working_auth != data[4] ) { stdlog << "Dropped message not valid authtype\n"; return eResponseTypeError; } // Drop if sessions ID's don't match. sess_id = IpmiGetUint32( data+9 ); if ( sess_id != m_session_id ) { stdlog << "Dropped message not valid session id " << sess_id << " != " << m_session_id << " !\n"; return eResponseTypeError; } seq = IpmiGetUint32( data+5 ); if ( data[4] != 0 ) { // Validate the message's authcode. Do this before checking // the session seq num so we know the data is valid. int rv = AuthCheck( data+9, data+5, data+30, data[29], data+13 ); if ( rv ) { stdlog << "Dropped message auth fail !\n"; return eResponseTypeError; } tmsg = data + 30; } else tmsg = data + 14; // Check the sequence number. if ( seq - m_inbound_seq_num <= 8 ) { // It's after the current sequence number, but within 8. We // move the sequence number forward. m_recv_msg_map <<= seq - m_inbound_seq_num; m_recv_msg_map |= 1; m_inbound_seq_num = seq; } else if ( m_inbound_seq_num - seq <= 8 ) { // It's before the current sequence number, but within 8. uint8_t bit = 1 << (m_inbound_seq_num - seq); if ( m_recv_msg_map & bit ) { stdlog << "Dropped message duplicate\n"; return eResponseTypeError; } m_recv_msg_map |= bit; } else { // It's outside the current sequence number range, discard // the packet. stdlog << "Dropped message out of seq range\n"; return eResponseTypeError; } // Now we have an authentic in-sequence message. // We don't check the checksums, because the network layer should // validate all this for us. if ( tmsg[5] == eIpmiCmdReadEventMsgBuffer && (tmsg[1] >> 2) == eIpmiNetfnAppRsp ) { // event if ( tmsg[6] != 0 ) { // An error getting the events, just ignore it. stdlog << "Dropped message err getting event\n"; return eResponseTypeError; } addr.m_type = eIpmiAddrTypeIpmb; addr.m_slave_addr = tmsg[3]; addr.m_lun = tmsg[4] & 0x3; addr.m_channel = 0; msg.m_netfn = (tIpmiNetfn)(tmsg[1] >> 2); msg.m_cmd = (tIpmiCmd)tmsg[5]; msg.m_data_len = data_len - 6 - 2; /* Remove completion code and checksum */ memcpy( msg.m_data, tmsg + 6 + 1, msg.m_data_len ); return eResponseTypeEvent; } seq = tmsg[4] >> 2; if ( m_outstanding[seq] == 0 ) { stdlog << "Dropped message seq not in use: " << (unsigned char)seq << " !\n"; return eResponseTypeError; } if ( tmsg[5] == eIpmiCmdSendMsg && (tmsg[1] >> 2) == eIpmiNetfnAppRsp ) { // It's a response to a sent message. // FIXME - this entire thing is a cheap hack. if ( tmsg[6] != 0 ) { // Got an error from the send message. We don't have any // IPMB information to work with, so just extract it from // the message. addr = m_outstanding[seq]->m_send_addr; // Just in case it's a broadcast. addr.m_type = eIpmiAddrTypeIpmb; msg.m_netfn = (tIpmiNetfn)(m_outstanding[seq]->m_msg.m_netfn | 1); msg.m_cmd = m_outstanding[seq]->m_msg.m_cmd; msg.m_data[0] = tmsg[6]; msg.m_data_len = 1; stdlog << "Read sent message " << tmsg[0] << " error " << tmsg[6] << ".\n"; } else { if ( data_len < 15 ) return eResponseTypeError; if ( tmsg[10] == m_slave_addr ) addr.Si(); else { addr.m_type = eIpmiAddrTypeIpmb; addr.m_channel = m_outstanding[seq]->m_send_addr.m_channel; addr.m_slave_addr = tmsg[10]; } addr.m_lun = tmsg[11] & 0x3; msg.m_netfn = (tIpmiNetfn)(tmsg[8] >> 2); msg.m_cmd = (tIpmiCmd)tmsg[12]; msg.m_data_len = data_len - 15; memcpy( msg.m_data, tmsg + 13, msg.m_data_len ); } } else if ( m_outstanding[seq]->m_send_addr.m_type == eIpmiAddrTypeSystemInterface && tmsg[3] == m_slave_addr ) { // In some cases, a message from the IPMB looks like it came // from the BMC itself, IMHO a misinterpretation of the // errata. IPMIv1_5_rev1_1_0926 markup, section 6.12.4, // didn't clear things up at all. Some manufacturers have // interpreted it this way, but IMHO it is incorrect. addr = m_outstanding[seq]->m_send_addr; msg.m_netfn = (tIpmiNetfn)(tmsg[1] >> 2); msg.m_cmd = (tIpmiCmd)tmsg[5]; msg.m_data_len = data_len - 7; memcpy( msg.m_data, tmsg+6, msg.m_data_len ); } else { // It's not encapsulated in a send message response. if ( tmsg[3] == m_slave_addr ) { // It's directly from the BMC, so it's a system interface // message. addr.Si(); addr.m_lun = tmsg[1] & 3; } else { // A message from the IPMB. addr.m_type = eIpmiAddrTypeIpmb; // This is a hack, but the channel does not come back in the // message. So we use the channel from the original // instead. addr.m_channel = m_outstanding[seq]->m_send_addr.m_channel; addr.m_slave_addr = tmsg[3]; addr.m_lun = tmsg[4] & 0x3; } msg.m_netfn = (tIpmiNetfn)(tmsg[1] >> 2); msg.m_cmd = (tIpmiCmd)tmsg[5]; msg.m_data_len = data_len - 6 - 1; // Remove the checksum memcpy( msg.m_data, tmsg+6, msg.m_data_len ); } if ( (tIpmiNetfn)(m_outstanding[seq]->m_msg.m_netfn | 1) != msg.m_netfn || m_outstanding[seq]->m_msg.m_cmd != msg.m_cmd ) { stdlog << "Message mismatch seq " << (unsigned char)seq << ":\n" << "read "; IpmiLogDataMsg( addr, msg ); stdlog << "\n"; stdlog << "expt "; IpmiLogDataMsg( m_outstanding[seq]->m_send_addr, m_outstanding[seq]->m_msg ); stdlog << "\n"; stdlog.Hex( data, len ); stdlog << "len " << len << ", m_num_outstanding " << m_num_outstanding << ", m_queue " << (m_queue ? "full" : "empty") << "\n"; return eResponseTypeError; } if ( m_outstanding[seq]->m_send_addr != m_outstanding[seq]->m_addr ) addr = m_outstanding[seq]->m_addr; return eResponseTypeMessage; } void cIpmiConLan::IfReadResponse() { int seq; cIpmiAddr addr; cIpmiMsg msg; tResponseType rt = ReadResponse( seq, addr, msg ); switch( rt ) { case eResponseTypeError: break; case eResponseTypePong: stdlog << "connection seems to be ok.\n"; HandleCheckConnection( true ); break; case eResponseTypeTimeout: break; case eResponseTypeMessage: HandleResponse( seq, addr, msg ); break; case eResponseTypeEvent: HandleEvent( addr, msg ); break; } } bool cIpmiConLan::IfCheckConnection( cTime &timeout ) { stdlog << "check connection.\n"; SendPing(); timeout = cTime::Now(); timeout += m_timeout; return true; } void cIpmiConLan::IfCheckConnectionTimeout() { stdlog << "connection timeout !\n"; m_queue_lock.Lock(); Reconnect(); m_queue_lock.Unlock(); } openhpi-2.14.1/plugins/ipmidirect/hotswap.cpp0000644000076400007640000003452411302567000016176 0ustar /* * * Copyright (c) 2003,2004 by FORCE Computers. * Copyright (c) 2005 by ESO Technologies. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Thomas Kanngieser * Pierre Sangouard */ #include #include #include "ipmi_utils.h" #include "ipmi.h" #include "ipmi_sensor_hotswap.h" static const char *hotswap_states[] = { "inactive", "insertion_pending", "active", "extraction_pending", "not_present" }; static int hotswap_states_num = sizeof( hotswap_states ) / sizeof( char * ); const char * HotswapStateToString( SaHpiHsStateT state ) { if ( state >= hotswap_states_num ) return "invalid"; return hotswap_states[state]; } SaErrorT cIpmi::IfGetHotswapState( cIpmiResource *res, SaHpiHsStateT &state ) { // get hotswap sensor cIpmiSensorHotswap *hs = res->GetHotswapSensor(); if ( !hs ) return SA_ERR_HPI_INVALID_PARAMS; // get hotswap state return hs->GetHpiState( state ); } // state == SAHPI_HS_STATE_ACTIVE // => M2 -> M3 // => M5 -> M4 // state == SAHPI_HS_STATE_INACTIVE // => M5 -> M6 // => M2 -> M1 SaErrorT cIpmi::IfSetHotswapState( cIpmiResource *res, SaHpiHsStateT state ) { if ( !m_is_tca ) { stdlog << "ATCA not supported by SI !\n"; return SA_ERR_HPI_INVALID_CMD; } if (res->PolicyCanceled() != true) { return SA_ERR_HPI_INVALID_REQUEST; } cIpmiMsg msg( eIpmiNetfnPicmg, eIpmiCmdSetFruActivation ); msg.m_data_len = 3; msg.m_data[0] = dIpmiPicMgId; msg.m_data[1] = res->FruId(); if ( state == SAHPI_HS_STATE_ACTIVE ) { msg.m_data[2] = dIpmiActivateFru; } else { msg.m_data[2] = dIpmiDeactivateFru; } cIpmiMsg rsp; SaErrorT r = res->SendCommandReadLock( msg, rsp ); if ( r != SA_OK ) { stdlog << "IfSetHotSwapState: could not send set FRU activation: " << r << " !\n"; return r; } if ( rsp.m_data_len < 2 || rsp.m_data[0] != eIpmiCcOk || rsp.m_data[1] != dIpmiPicMgId ) { stdlog << "IfSetHotSwapState: IPMI error set FRU activation: " << rsp.m_data[0] << " !\n"; return SA_ERR_HPI_INTERNAL_ERROR; } return SA_OK; } // act == SAHPI_HS_ACTION_INSERTION => M1->M2 // act == SAHPI_HS_ACTION_EXTRACTION => M4->M5 SaErrorT cIpmi::IfRequestHotswapAction( cIpmiResource *res, SaHpiHsActionT act ) { if ( !m_is_tca ) { stdlog << "ATCA not supported by SI !\n"; return SA_ERR_HPI_INVALID_REQUEST; } cIpmiMsg msg( eIpmiNetfnPicmg, eIpmiCmdSetFruActivationPolicy ); msg.m_data_len = 4; msg.m_data[0] = dIpmiPicMgId; msg.m_data[1] = res->FruId(); if ( act == SAHPI_HS_ACTION_INSERTION ) { // m1 -> m2 msg.m_data[2] = 1; // M1->M2 lock bit msg.m_data[3] = 0; // clear locked bit M1->M2 } else { msg.m_data[2] = 2; // M4->M5 lock bit msg.m_data[3] = 0; // clear lock bit M4->M5 } cIpmiMsg rsp; SaErrorT r = res->SendCommandReadLock( msg, rsp ); if ( r != SA_OK ) { stdlog << "IfRequestHotswapAction: could not send set FRU activation policy: " << r << " !\n"; return r; } if ( rsp.m_data_len != 2 || rsp.m_data[0] != eIpmiCcOk || rsp.m_data[1] != dIpmiPicMgId ) { stdlog << "IfRequestHotswapAction: set FRU activation: " << rsp.m_data[0] << " !\n"; return SA_ERR_HPI_INVALID_CMD; } return SA_OK; } SaErrorT cIpmi::IfHotswapPolicyCancel( cIpmiResource *res, SaHpiTimeoutT timeout ) { if ( !m_is_tca ) { stdlog << "ATCA not supported by SI !\n"; return SA_ERR_HPI_INVALID_REQUEST; } res->PolicyCanceled() = true; return SA_OK; } SaErrorT cIpmi::IfSetAutoInsertTimeout( SaHpiTimeoutT timeout ) { if ( !m_is_tca ) { stdlog << "ATCA not supported by SI !\n"; return SA_ERR_HPI_INVALID_REQUEST; } InsertTimeout() = timeout; return SA_OK; } SaErrorT cIpmi::IfGetAutoExtractTimeout( cIpmiResource *res, SaHpiTimeoutT &timeout ) { if ( !m_is_tca ) { stdlog << "ATCA not supported by SI !\n"; return SA_ERR_HPI_INVALID_REQUEST; } timeout = res->ExtractTimeout(); return SA_OK; } SaErrorT cIpmi::IfSetAutoExtractTimeout( cIpmiResource *res, SaHpiTimeoutT timeout ) { if ( !m_is_tca ) { stdlog << "ATCA not supported by SI !\n"; return SA_ERR_HPI_INVALID_REQUEST; } res->ExtractTimeout() = timeout; return SA_OK; } SaErrorT cIpmi::IfGetPowerState( cIpmiResource *res, SaHpiPowerStateT &state ) { if (res->Mc()->IsRmsBoard()) { cIpmiMsg msg( eIpmiNetfnChassis, eIpmiCmdGetChassisStatus ); cIpmiMsg rsp; msg.m_data_len = 0; SaErrorT rv = res->SendCommandReadLock( msg, rsp ); if (rv != SA_OK) { stdlog << "IfGetPowerState: error " << rv << "\n"; } else if (rsp.m_data[0] != eIpmiCcOk) { stdlog << "IfGetPowerState: ccode " << rsp.m_data[0] << "\n"; return (SA_ERR_HPI_INVALID_DATA); } else { if (rsp.m_data[1] & 0x01) state = SAHPI_POWER_ON; else state = SAHPI_POWER_OFF; // if ((rsp.mdata[1] & 0x1E) != 0) /*power fault*/; } return rv; } // get power level cIpmiMsg msg( eIpmiNetfnPicmg, eIpmiCmdGetPowerLevel ); cIpmiMsg rsp; msg.m_data[0] = dIpmiPicMgId; msg.m_data[1] = res->FruId(); msg.m_data[2] = 0x01; // desired steady power msg.m_data_len = 3; SaErrorT rv = res->SendCommandReadLock( msg, rsp ); if ( rv != SA_OK ) { stdlog << "cannot send get power level: " << rv << " !\n"; return rv; } if ( rsp.m_data_len < 3 || rsp.m_data[0] != eIpmiCcOk || rsp.m_data[0] != dIpmiPicMgId ) { stdlog << "cannot get power level: " << rsp.m_data[0] << " !\n"; return SA_ERR_HPI_INVALID_CMD; } unsigned char power_level = rsp.m_data[2] & 0x1f; // get current power level msg.m_data[2] = 0; // steady state power rv = res->SendCommandReadLock( msg, rsp ); if ( rv != SA_OK ) { stdlog << "IfGetPowerState: could not send get power level: " << rv << " !\n"; return rv; } if ( rsp.m_data_len < 6 || rsp.m_data[0] != eIpmiCcOk || rsp.m_data[1] != dIpmiPicMgId ) { stdlog << "IfGetPowerState: IPMI error get power level: " << rsp.m_data[0] << " !\n"; return SA_ERR_HPI_INVALID_CMD; } unsigned char current_power_level = rsp.m_data[2] & 0x1f; if ( current_power_level >= power_level ) state = SAHPI_POWER_ON; else state = SAHPI_POWER_OFF; return SA_OK; } SaErrorT cIpmi::IfSetPowerState( cIpmiResource *res, SaHpiPowerStateT state ) { SaErrorT rv; unsigned int power_level = 0; if (res->Mc()->IsRmsBoard()) { unsigned char power_state = 0; switch (state) { case SAHPI_POWER_CYCLE: power_state = 0x02; break; case SAHPI_POWER_ON: power_state = 0x01; break; case SAHPI_POWER_OFF: power_state = 0x00; break; default: power_state = 0x02; break; } cIpmiMsg msg( eIpmiNetfnChassis, eIpmiCmdChassisControl ); msg.m_data[0] = power_state; msg.m_data_len = 1; cIpmiMsg rsp; rv = res->SendCommandReadLock( msg, rsp ); if (rv != SA_OK) stdlog << "IfSetPowerState: state " << power_state << " error " << rv << "\n"; return rv; } cIpmiMsg msg( eIpmiNetfnPicmg, eIpmiCmdGetPowerLevel ); msg.m_data[0] = dIpmiPicMgId; msg.m_data[1] = res->FruId(); cIpmiMsg rsp; if ( state == SAHPI_POWER_CYCLE ) { // power off msg.m_cmd = eIpmiCmdSetPowerLevel; msg.m_data[2] = power_level; msg.m_data[3] = 0x01; // copy desierd level to present level msg.m_data_len = 4; rv = res->SendCommandReadLock( msg, rsp ); if ( rv != SA_OK ) { stdlog << "cannot send set power level: " << rv << " !\n"; return rv; } if ( rsp.m_data_len < 2 || rsp.m_data[0] != eIpmiCcOk || rsp.m_data[1] != dIpmiPicMgId ) { stdlog << "cannot set power level: " << rsp.m_data[0] << " !\n"; return SA_ERR_HPI_INVALID_CMD; } // power on state = SAHPI_POWER_ON; } if ( state == SAHPI_POWER_ON ) { // get power level msg.m_cmd = eIpmiCmdGetPowerLevel; msg.m_data[2] = 0x01; // desired steady power msg.m_data_len = 3; rv = res->SendCommandReadLock( msg, rsp ); if ( rv != SA_OK ) { stdlog << "cannot send get power level: " << rv << " !\n"; return SA_ERR_HPI_INVALID_CMD; } if ( rsp.m_data_len < 3 || rsp.m_data[0] != eIpmiCcOk || rsp.m_data[1] != dIpmiPicMgId ) { stdlog << "cannot get power level: " << rsp.m_data[0] << " !\n"; return SA_ERR_HPI_INVALID_CMD; } power_level = rsp.m_data[2] & 0x1f; } else if ( state != SAHPI_POWER_OFF ) return SA_ERR_HPI_INVALID_PARAMS; // set power level msg.m_cmd = eIpmiCmdSetPowerLevel; msg.m_data[2] = power_level; msg.m_data[3] = 0x01; // copy desierd level to present level msg.m_data_len = 4; rv = res->SendCommandReadLock( msg, rsp ); if ( rv != SA_OK ) { stdlog << "cannot send set power level: " << rv << "! \n"; return rv; } if ( rsp.m_data_len < 2 || rsp.m_data[0] != eIpmiCcOk || rsp.m_data[1] != dIpmiPicMgId ) { stdlog << "cannot set power level: " << rsp.m_data[0] << " !\n"; return SA_ERR_HPI_INVALID_CMD; } return SA_OK; } SaErrorT cIpmi::IfGetIndicatorState( cIpmiResource *res, SaHpiHsIndicatorStateT &state ) { cIpmiMsg msg( eIpmiNetfnPicmg, eIpmiCmdGetFruLedState ); cIpmiMsg rsp; msg.m_data_len = 3; msg.m_data[0] = dIpmiPicMgId; msg.m_data[1] = res->FruId(); msg.m_data[2] = 0; // blue led; SaErrorT rv = res->SendCommandReadLock( msg, rsp ); if ( rv != SA_OK ) { stdlog << "IfGetIndicatorState: could not send get FRU LED state: " << rv << " !\n"; return rv; } if ( rsp.m_data_len < 6 || rsp.m_data[0] != 0 || rsp.m_data[1] != dIpmiPicMgId ) { stdlog << "IfGetIndicatorState: IPMI error set FRU LED state: " << rsp.m_data[0] << " !\n"; return SA_ERR_HPI_INVALID_DATA; } // lamp test if ( rsp.m_data[2] & 4 ) { if ( rsp.m_data_len < 10 ) { stdlog << "IfGetIndicatorState: IPMI error (lamp test) message to short: " << rsp.m_data_len << " !\n"; return SA_ERR_HPI_INVALID_DATA; } state = SAHPI_HS_INDICATOR_ON; return SA_OK; } // overwrite state if ( rsp.m_data[2] & 2 ) { if ( rsp.m_data_len < 9 ) { stdlog << "IfGetIndicatorState: IPMI error (overwrite) message to short: " << rsp.m_data_len << " !\n"; return SA_ERR_HPI_INVALID_DATA; } if ( rsp.m_data[6] == 0 ) state = SAHPI_HS_INDICATOR_OFF; else state = SAHPI_HS_INDICATOR_ON; return SA_OK; } // local control state if ( rsp.m_data[3] == 0 ) state = SAHPI_HS_INDICATOR_OFF; else state = SAHPI_HS_INDICATOR_ON; return SA_OK; } SaErrorT cIpmi::IfSetIndicatorState( cIpmiResource *res, SaHpiHsIndicatorStateT state ) { cIpmiMsg msg( eIpmiNetfnPicmg, eIpmiCmdSetFruLedState ); msg.m_data_len = 6; msg.m_data[0] = dIpmiPicMgId; msg.m_data[1] = res->FruId(); msg.m_data[2] = 0; // blue led; msg.m_data[3] = (state == SAHPI_HS_INDICATOR_ON) ? 0xff : 0; msg.m_data[4] = 0; msg.m_data[5] = 1; // blue cIpmiMsg rsp; SaErrorT rv = res->SendCommandReadLock( msg, rsp ); if ( rv != SA_OK ) { stdlog << "IfGetIndicatorState: could not send get FRU LED state: " << rv << " !\n"; return rv; } if ( rsp.m_data_len < 2 || rsp.m_data[0] != 0 || rsp.m_data[1] != dIpmiPicMgId ) { stdlog << "IfGetIndicatorState: IPMI error set FRU LED state: " << rsp.m_data[0] << " !\n"; return SA_ERR_HPI_INVALID_DATA; } return SA_OK; } SaErrorT cIpmi::IfGetResetState( cIpmiResource * /*res*/, SaHpiResetActionT &state ) { state = SAHPI_RESET_DEASSERT; return SA_OK; } SaErrorT cIpmi::IfSetResetState( cIpmiResource *res, SaHpiResetActionT state ) { unsigned char reset_state; unsigned char chassis_state; switch( state ) { case SAHPI_COLD_RESET: reset_state = 0x00; chassis_state = 0x02; break; case SAHPI_WARM_RESET: // There is no way to know whether an ATCA FRU supports // warm reset -> Let's use cold reset all the time for now reset_state = 0x00; chassis_state = 0x03; break; case SAHPI_RESET_DEASSERT: // Reset is *always* deasserted on ATCA return SA_OK; default: stdlog << "IfSetResetState: unsupported state " << state << " !\n"; return SA_ERR_HPI_INVALID_CMD; } if (res->Mc()->IsRmsBoard()) { cIpmiMsg msg( eIpmiNetfnChassis, eIpmiCmdChassisControl ); msg.m_data[0] = chassis_state; msg.m_data_len = 1; cIpmiMsg rsp; SaErrorT rv = res->SendCommandReadLock( msg, rsp ); if (rv != SA_OK) stdlog << "IfSetResetState: could not send Chassis Reset: " << rv << "\n"; return rv; } cIpmiMsg msg( eIpmiNetfnPicmg, eIpmiCmdFruControl ); msg.m_data[0] = dIpmiPicMgId; msg.m_data[1] = res->FruId(); msg.m_data[2] = reset_state; msg.m_data_len = 3; cIpmiMsg rsp; SaErrorT rv = res->SendCommandReadLock( msg, rsp ); if ( rv != SA_OK ) { stdlog << "IfSetResetState: could not send FRU control: " << rv << " !\n"; return rv; } if ( rsp.m_data_len < 2 || rsp.m_data[0] != 0 || rsp.m_data[1] != dIpmiPicMgId ) { stdlog << "IfSetResetState: IPMI error FRU control: " << rsp.m_data[0] << " !\n"; return SA_ERR_HPI_INVALID_CMD; } return SA_OK; } openhpi-2.14.1/plugins/ipmidirect/ipmi_sensor_discrete.cpp0000644000076400007640000001574611302567000020727 0ustar /* * ipmi_sensor_discrete.cpp * * Copyright (c) 2004 by FORCE Computers * Copyright (c) 2005 by ESO Technologies. * * Note that this file is based on parts of OpenIPMI * written by Corey Minyard * of MontaVista Software. Corey's code was helpful * and many thanks go to him. He gave the permission * to use this code in OpenHPI under BSD license. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Thomas Kanngieser * Pierre Sangouard */ #include "ipmi_sensor_discrete.h" #include "ipmi_domain.h" #include #include #include #include #include #include cIpmiSensorDiscrete::cIpmiSensorDiscrete( cIpmiMc *mc ) : cIpmiSensor( mc ) { } cIpmiSensorDiscrete::~cIpmiSensorDiscrete() { } bool cIpmiSensorDiscrete::GetDataFromSdr( cIpmiMc *mc, cIpmiSdr *sdr ) { if ( !cIpmiSensor::GetDataFromSdr( mc, sdr ) ) return false; m_assertion_event_mask = IpmiGetUint16( sdr->m_data + 14 ); m_assertion_event_mask &= 0x7fff; m_current_hpi_assert_mask = m_assertion_event_mask; m_hpi_assert_mask = m_assertion_event_mask; m_deassertion_event_mask = IpmiGetUint16( sdr->m_data + 16 ); m_deassertion_event_mask &= 0x7fff; m_current_hpi_deassert_mask = m_deassertion_event_mask; m_hpi_deassert_mask = m_deassertion_event_mask; m_reading_mask = IpmiGetUint16( sdr->m_data + 18 ); m_reading_mask &= 0x7fff; return true; } bool cIpmiSensorDiscrete::CreateRdr( SaHpiRptEntryT &resource, SaHpiRdrT &rdr ) { if ( cIpmiSensor::CreateRdr( resource, rdr ) == false ) return false; SaHpiSensorRecT &rec = rdr.RdrTypeUnion.SensorRec; rec.DataFormat.IsSupported = SAHPI_FALSE; rec.ThresholdDefn.IsAccessible = SAHPI_FALSE; switch (SensorType()) { // Don't want anybody to mess with these sensors case eIpmiSensorTypeAtcaHotSwap: case eIpmiSensorTypeAtcaIpmb: case eIpmiSensorTypeAtcaAmcHotSwap: rec.EventCtrl = SAHPI_SEC_READ_ONLY; rec.EnableCtrl = SAHPI_FALSE; break; default: break; } return true; } SaErrorT cIpmiSensorDiscrete::GetSensorReading( SaHpiSensorReadingT &data, SaHpiEventStateT &state ) { if ( m_enabled == SAHPI_FALSE ) return SA_ERR_HPI_INVALID_REQUEST; cIpmiMsg rsp; SaErrorT rv = GetSensorData( rsp ); if ( rv != SA_OK ) return rv; if ( &data != NULL ) { memset( &data, 0, sizeof( SaHpiSensorReadingT ) ); data.IsSupported = SAHPI_FALSE; } if ( &state != NULL ) { // only 15 states rsp.m_data[4] &= 0x7f; state = IpmiGetUint16( rsp.m_data + 3 ); } return SA_OK; } SaErrorT cIpmiSensorDiscrete::GetEventMasksHw( SaHpiEventStateT &AssertEventMask, SaHpiEventStateT &DeassertEventMask ) { cIpmiMsg rsp; SaErrorT rv = cIpmiSensor::GetEventMasksHw( rsp ); if ( rv != SA_OK ) return rv; AssertEventMask = IpmiGetUint16( rsp.m_data + 2 ); DeassertEventMask = IpmiGetUint16( rsp.m_data + 4 ); return SA_OK; } SaErrorT cIpmiSensorDiscrete::SetEventMasksHw( const SaHpiEventStateT &AssertEventMask, const SaHpiEventStateT &DeassertEventMask ) { // create de/assertion event mask unsigned int amask; unsigned int dmask; amask = AssertEventMask; dmask = DeassertEventMask; cIpmiMsg msg; SaErrorT rv = SA_OK; if (( amask != 0 ) || ( dmask != 0 )) { IpmiSetUint16( msg.m_data + 2, amask ); IpmiSetUint16( msg.m_data + 4, dmask ); rv = cIpmiSensor::SetEventMasksHw( msg, true ); } if ( rv != SA_OK ) return rv; amask = ( amask ^ m_assertion_event_mask ) & m_assertion_event_mask; dmask = ( dmask ^ m_deassertion_event_mask ) & m_deassertion_event_mask; if (( amask != 0 ) || ( dmask != 0 )) { IpmiSetUint16( msg.m_data + 2, amask ); IpmiSetUint16( msg.m_data + 4, dmask ); rv = cIpmiSensor::SetEventMasksHw( msg, false ); } return rv; } SaErrorT cIpmiSensorDiscrete::CreateEvent( cIpmiEvent *event, SaHpiEventT &h ) { SaErrorT rv = cIpmiSensor::CreateEvent( event, h ); if ( rv != SA_OK ) return rv; // sensor event SaHpiSensorEventT &se = h.EventDataUnion.SensorEvent; se.Assertion = (SaHpiBoolT)!(event->m_data[9] & 0x80); se.EventState = (1 << (event->m_data[10] & 0x0f)); // default value h.Severity = SAHPI_INFORMATIONAL; SaHpiSensorOptionalDataT optional_data = 0; // byte 2 tIpmiEventType type = (tIpmiEventType)(event->m_data[10] >> 6); if ( type == eIpmiEventData1 ) { if ((event->m_data[11] & 0x0f) != 0x0f) { se.PreviousState = (1 << (event->m_data[11] & 0x0f)); optional_data |= SAHPI_SOD_PREVIOUS_STATE; } if ((event->m_data[11] & 0xf0) != 0xf0) { SaHpiEventStateT evt_sec_state = (1 << ((event->m_data[11]>> 4) & 0x0f)); switch (evt_sec_state) { case SAHPI_ES_OK: h.Severity = SAHPI_OK; break; case SAHPI_ES_MINOR_FROM_OK: h.Severity = SAHPI_MINOR; break; case SAHPI_ES_MAJOR_FROM_LESS: h.Severity = SAHPI_MAJOR; break; case SAHPI_ES_CRITICAL_FROM_LESS: h.Severity = SAHPI_CRITICAL; break; case SAHPI_ES_MINOR_FROM_MORE: h.Severity = SAHPI_MINOR; break; case SAHPI_ES_MAJOR_FROM_CRITICAL: h.Severity = SAHPI_MAJOR; break; case SAHPI_ES_CRITICAL: h.Severity = SAHPI_CRITICAL; break; case SAHPI_ES_MONITOR: h.Severity = SAHPI_INFORMATIONAL; break; case SAHPI_ES_INFORMATIONAL: h.Severity = SAHPI_INFORMATIONAL; break; } } } else if ( type == eIpmiEventData2 ) { se.Oem = (SaHpiUint32T)event->m_data[11]; optional_data |= SAHPI_SOD_OEM; } else if ( type == eIpmiEventData3 ) { se.SensorSpecific = (SaHpiUint32T)event->m_data[11]; optional_data |= SAHPI_SOD_SENSOR_SPECIFIC; } // byte 3 type = (tIpmiEventType)((event->m_data[10] & 0x30) >> 4); if ( type == eIpmiEventData2 ) { se.Oem |= (SaHpiUint32T)((event->m_data[12] << 8) & 0xff00); optional_data |= SAHPI_SOD_OEM; } else if ( type == eIpmiEventData3 ) { se.SensorSpecific |= (SaHpiUint32T)((event->m_data[12] << 8) & 0xff00); optional_data |= SAHPI_SOD_SENSOR_SPECIFIC; } se.OptionalDataPresent = optional_data; return SA_OK; } openhpi-2.14.1/plugins/ipmidirect/ipmi.h0000644000076400007640000000640011302567000015104 0ustar /* * * Copyright (c) 2003,2004 by FORCE Computers. * Copyright (c) 2005 by ESO Technologies. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Thomas Kanngieser * Pierre Sangouard */ #ifndef dIpmi_h #define dIpmi_h #include #include #include #include #include #ifndef dIpmiDomain_h #include "ipmi_domain.h" #endif #define dIpmiMagic 0x47110815 class cIpmi : public cIpmiDomain { unsigned int m_magic; oh_handler_state *m_handler; cIpmiEntityPath m_entity_root; bool GetParams( GHashTable *handler_config ); public: bool CheckMagic() { if ( m_magic == dIpmiMagic ) return true; return false; } bool CheckHandler( oh_handler_state *handler ) { if ( handler == m_handler ) return true; return false; } cIpmiCon *AllocConnection( GHashTable *handler_config ); virtual void IfEnter(); virtual void IfLeave(); // openhpi abi interface functions virtual bool IfOpen( GHashTable *handler_config ); virtual void IfClose(); virtual SaErrorT IfGetEvent( oh_event *event ); virtual SaErrorT IfDiscoverResources(); virtual SaErrorT IfSetResourceTag( cIpmiResource *ent, SaHpiTextBufferT *tag ); virtual SaErrorT IfSetResourceSeverity( cIpmiResource *res, SaHpiSeverityT sev ); // hot swap virtual SaErrorT IfGetHotswapState( cIpmiResource *res, SaHpiHsStateT &state ); virtual SaErrorT IfSetHotswapState( cIpmiResource *res, SaHpiHsStateT state ); virtual SaErrorT IfRequestHotswapAction( cIpmiResource *res, SaHpiHsActionT act ); virtual SaErrorT IfHotswapPolicyCancel( cIpmiResource *res, SaHpiTimeoutT timeout ); virtual SaErrorT IfSetAutoInsertTimeout( SaHpiTimeoutT timeout); virtual SaErrorT IfGetAutoExtractTimeout( cIpmiResource *res, SaHpiTimeoutT &timeout); virtual SaErrorT IfSetAutoExtractTimeout( cIpmiResource *res, SaHpiTimeoutT timeout); virtual SaErrorT IfGetPowerState ( cIpmiResource *res, SaHpiPowerStateT &state ); virtual SaErrorT IfSetPowerState ( cIpmiResource *res, SaHpiPowerStateT state ); virtual SaErrorT IfGetIndicatorState( cIpmiResource *res, SaHpiHsIndicatorStateT &state ); virtual SaErrorT IfSetIndicatorState( cIpmiResource *res, SaHpiHsIndicatorStateT state ); virtual SaErrorT IfGetResetState ( cIpmiResource *res, SaHpiResetActionT &state ); virtual SaErrorT IfSetResetState ( cIpmiResource *res, SaHpiResetActionT state ); virtual SaErrorT IfControlParm( cIpmiResource *res, SaHpiParmActionT act ); // lock for the hpi event queue cThreadLock m_event_lock; virtual void AddHpiEvent( oh_event *event ); virtual oh_evt_queue *GetHpiEventList() { return m_handler->eventq; } cIpmi(); ~cIpmi(); void SetHandler( oh_handler_state *handler ); oh_handler_state *GetHandler(); virtual const cIpmiEntityPath &EntityRoot(); virtual SaHpiRptEntryT *FindResource( SaHpiResourceIdT id ); }; #endif openhpi-2.14.1/plugins/ipmidirect/ipmi_sel.cpp0000644000076400007640000005117311302567000016311 0ustar /* * ipmi_sel.cpp * * Copyright (c) 2003 by FORCE Computers * Copyright (c) 2005 by ESO Technologies. * * Note that this file is based on parts of OpenIPMI * written by Corey Minyard * of MontaVista Software. Corey's code was helpful * and many thanks go to him. He gave the permission * to use this code in OpenHPI under BSD license. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Thomas Kanngieser * Pierre Sangouard */ #include #include #include #include "ipmi_cmd.h" #include "ipmi_sel.h" #include "ipmi_mc.h" #include "ipmi_log.h" #include "ipmi_utils.h" #include "ipmi_event.h" #include "ipmi_domain.h" cIpmiSel::cIpmiSel( cIpmiMc *mc, unsigned int lun ) : m_mc( mc ), m_lun( lun ), m_major_version( 0 ), m_minor_version( 0 ), m_entries( 0 ), m_last_addition_timestamp( 0 ), m_last_erase_timestamp( 0 ), m_overflow( false ), m_supports_delete_sel( false ), m_supports_partial_add_sel( false ), m_supports_reserve_sel( false ), m_supports_get_sel_allocation( false ), m_fetched( false ), m_reservation( 0 ), m_sels_changed( false ), m_sel( 0 ), m_sel_num( 0 ), m_async_events( 0 ), m_async_events_num( 0 ) { } cIpmiSel::~cIpmiSel() { m_sel_lock.Lock(); if ( m_sel ) ClearList( m_sel ); if ( m_async_events ) ClearList( m_async_events ); m_sel_lock.Unlock(); } SaErrorT cIpmiSel::ClearSel() { cThreadLockAuto al( m_sel_lock ); SaErrorT rv; // do a reservation only when needed if ( m_supports_reserve_sel && m_reservation == 0 ) { rv = Reserve(); if ( rv != SA_OK ) return rv; } stdlog << "clear SEL.\n"; cIpmiMsg msg( eIpmiNetfnStorage, eIpmiCmdClearSel ); msg.m_data_len = 6; IpmiSetUint16( msg.m_data, m_reservation ); msg.m_data[2] = 'C'; msg.m_data[3] = 'L'; msg.m_data[4] = 'R'; msg.m_data[5] = 0xaa; cIpmiMsg rsp; rv = m_mc->SendCommand( msg, rsp, m_lun ); if ( rv != SA_OK ) return rv; if ( rsp.m_data[0] == 0 ) { m_sel = ClearList( m_sel ); m_sel_num = 0; } return SA_OK; } SaErrorT cIpmiSel::GetInfo() { cIpmiMsg msg( eIpmiNetfnStorage, eIpmiCmdGetSelInfo ); cIpmiMsg rsp; SaErrorT rv; unsigned int add_timestamp; unsigned int erase_timestamp; // Fetch the repository info. rv = m_mc->SendCommand( msg, rsp, m_lun ); if ( rv != SA_OK ) { stdlog << "could not send get sel info: " << rv << " !\n"; return rv; } if ( rsp.m_data[0] != 0 ) { stdlog << "IpmiSelGetInfo: IPMI error from SEL info fetch: " << rsp.m_data[0] << " !\n"; return SA_ERR_HPI_INVALID_PARAMS; } if ( rsp.m_data_len < 15 ) { stdlog << "handle_sel_info: SEL info too short !\n"; return SA_ERR_HPI_INVALID_DATA; } unsigned short num = m_entries; // Pull pertinant info from the response. m_major_version = rsp.m_data[1] & 0xf; m_minor_version = (rsp.m_data[1] >> 4) & 0xf; m_entries = IpmiGetUint16( rsp.m_data + 2 ); m_overflow = (rsp.m_data[14] & 0x80) == 0x80; m_supports_delete_sel = (rsp.m_data[14] & 0x08) == 0x08; m_supports_partial_add_sel = (rsp.m_data[14] & 0x04) == 0x04; m_supports_reserve_sel = (rsp.m_data[14] & 0x02) == 0x02; m_supports_get_sel_allocation = (rsp.m_data[14] & 0x01) == 0x01; add_timestamp = IpmiGetUint32( rsp.m_data + 6 ); erase_timestamp = IpmiGetUint32( rsp.m_data + 10 ); // If the timestamps still match, no need to re-fetch the repository if ( m_fetched && m_entries == num && (add_timestamp == m_last_addition_timestamp ) && (erase_timestamp == m_last_erase_timestamp ) ) { // no need to read sel return -1; } m_last_addition_timestamp = add_timestamp; m_last_erase_timestamp = erase_timestamp; m_sels_changed = true; m_fetched = true; return SA_OK; } SaErrorT cIpmiSel::Reserve() { cIpmiMsg msg( eIpmiNetfnStorage, eIpmiCmdReserveSel ); cIpmiMsg rsp; SaErrorT rv; // Get a reservation. rv = m_mc->SendCommand( msg, rsp, m_lun ); if ( rv != SA_OK ) { stdlog << "cannot send reserve sel: " << rv << " !\n"; return rv; } if ( rsp.m_data[0] != 0 ) { stdlog << "sel_handle_reservation: Failed getting reservation !\n"; return SA_ERR_HPI_INVALID_PARAMS; } if ( rsp.m_data_len < 3 ) { stdlog << "sel_handle_reservation: got invalid reservation length !\n"; return SA_ERR_HPI_INVALID_DATA; } m_reservation = IpmiGetUint16( rsp.m_data + 1 ); return SA_OK; } GList * cIpmiSel::ClearList( GList *list ) { while( list ) { cIpmiEvent *e = (cIpmiEvent *)list->data; list = g_list_remove( list, e ); delete e; } return 0; } int cIpmiSel::ReadSelRecord( cIpmiEvent &event, unsigned int &next_rec_id ) { // read record cIpmiMsg msg( eIpmiNetfnStorage, eIpmiCmdGetSelEntry ); cIpmiMsg rsp; IpmiSetUint16( msg.m_data, m_reservation ); IpmiSetUint16( msg.m_data+2, next_rec_id ); msg.m_data[4] = 0; msg.m_data[5] = 0xff; msg.m_data_len = 6; SaErrorT rv = m_mc->SendCommand( msg, rsp, m_lun ); if ( rv != SA_OK ) { stdlog << "Could not send SEL fetch command: " << rv << " !\n"; return -1; } if ( rsp.m_data[0] == eIpmiCcInvalidReservation ) { stdlog << "SEL reservation lost !\n"; m_reservation = 0; return eIpmiCcInvalidReservation; } if ( rsp.m_data[0] != 0 ) { stdlog << "IPMI error from SEL fetch: " << rsp.m_data[0] << " !\n"; return -1; } next_rec_id = IpmiGetUint16( rsp.m_data + 1 ); event.m_mc = m_mc; event.m_record_id = IpmiGetUint16( rsp.m_data + 3 ); event.m_type = rsp.m_data[5]; memcpy( event.m_data, rsp.m_data + 6, 13 ); return 0; } GList * cIpmiSel::ReadSel( unsigned int &num, bool &uptodate ) { SaErrorT rv = SA_OK; GList *new_events = 0; num = 0; int fetch_retry_count = 0; uptodate = false; while( true ) { if ( fetch_retry_count >= dMaxSelFetchRetries ) { stdlog << "too many lost reservations in SEL fetch !\n"; return 0; } fetch_retry_count++; // get reservation m_reservation = 0; rv = GetInfo(); if ( rv == -1 ) { // no new entries uptodate = true; return 0; } if ( rv != SA_OK || m_entries == 0 ) return 0; if ( m_supports_reserve_sel ) { rv = Reserve(); if ( rv ) continue; } // read records unsigned int next_rec_id = 0; do { cIpmiEvent *event = new cIpmiEvent; rv = ReadSelRecord( *event, next_rec_id ); if ( rv ) { delete event; ClearList( new_events ); new_events = 0; num = 0; if ( rv == eIpmiCcInvalidReservation ) break; return 0; } new_events = g_list_append( new_events, event ); num++; } while( next_rec_id != 0xffff ); if ( next_rec_id == 0xffff ) break; } return new_events; } cIpmiEvent * cIpmiSel::FindEvent( GList *list, unsigned int record_id ) { while( list ) { cIpmiEvent *e = (cIpmiEvent *)list->data; if ( e ->m_record_id == record_id ) return e; list = g_list_next( list ); } return 0; } bool cIpmiSel::CheckEvent( GList *&list, cIpmiEvent *event ) { cIpmiEvent *e = FindEvent( list, event->m_record_id ); if ( !e ) return false; // remove old event from list list = g_list_remove( list, e ); // return true if event is old event bool rv = event->Cmp( *e ) == 0 ? true : false; delete e; return rv; } GList * cIpmiSel::GetEvents() { cThreadLockAuto al( m_sel_lock ); stdlog << "reading SEL.\n"; // read sel bool uptodate = false; unsigned int events_num = 0; GList *events = ReadSel( events_num, uptodate ); if ( uptodate ) { return 0; } // build a list of new events GList *new_events = 0; for( GList *item = events; item; item = g_list_next( item ) ) { cIpmiEvent *current = (cIpmiEvent *)item->data; if ( CheckEvent( m_sel, current ) == false ) { m_async_events_lock.Lock(); bool rv = CheckEvent( m_async_events, current ); m_async_events_lock.Unlock(); if ( rv == false ) { // new event found cIpmiEvent *e = new cIpmiEvent( *current ); new_events = g_list_append( new_events, e ); } } } ClearList( m_sel ); m_sel = events; m_sel_num = events_num; return new_events; } SaErrorT cIpmiSel::GetSelEntry( unsigned short rid, unsigned short &prev, unsigned short &next, cIpmiEvent &event ) { cThreadLockAuto al( m_sel_lock ); // empty sel if ( m_sel == 0 ) { prev = 0; next = 0xffff; return SA_ERR_HPI_NOT_PRESENT; } cIpmiEvent *e = 0; GList *item; GList *i; if ( rid == 0 ) { // first entry e = (cIpmiEvent *)m_sel->data; event = *e; // prev prev = 0; // next item = g_list_next( m_sel ); if ( item ) { e = (cIpmiEvent *)item->data; next = e->m_record_id; } else next = 0xffff; return SA_OK; } if ( rid == 0xffff ) { // last entry item = g_list_last( m_sel ); e = (cIpmiEvent *)item->data; event = *e; // prev item = g_list_previous( item ); if ( item ) { e = (cIpmiEvent *)item->data; prev = e->m_record_id; } else prev = 0; next = 0xffff; return SA_OK; } item = 0; // find rid event for( i = m_sel; i; i = g_list_next( i ) ) { e = (cIpmiEvent *)i->data; if ( e->m_record_id == rid ) { item = i; break; } } if ( item == 0 ) return SA_ERR_HPI_NOT_PRESENT; // event found e = (cIpmiEvent *)item->data; event = *e; // prev i = g_list_previous( item ); if ( i ) { e = (cIpmiEvent *)i->data; prev = e->m_record_id; } else prev = 0; // next i = g_list_next( item ); if ( i ) { e = (cIpmiEvent *)i->data; next = e->m_record_id; } else next = 0xffff; return SA_OK; } SaErrorT cIpmiSel::DeleteSelEntry( SaHpiEventLogEntryIdT sid ) { cThreadLockAuto al( m_sel_lock ); unsigned short rid = (unsigned short)sid; if ( sid == SAHPI_OLDEST_ENTRY ) rid = 0; else if ( sid == SAHPI_NEWEST_ENTRY ) rid = 0xffff; else rid = sid; for( int i = 0; i < dMaxSelFetchRetries; i++ ) { SaErrorT rv = Reserve(); if ( rv != SA_OK ) return rv; cIpmiMsg msg( eIpmiNetfnStorage, eIpmiCmdDeleteSelEntry ); cIpmiMsg rsp; IpmiSetUint16( msg.m_data, m_reservation ); IpmiSetUint16( msg.m_data + 2, rid ); msg.m_data_len = 4; rv = m_mc->SendCommand( msg, rsp ); if ( rv != SA_OK ) { stdlog << "Could not send delete SEL entry: " << rv << " !\n"; return rv; } if ( rsp.m_data[0] != eIpmiCcOk ) { if ( rsp.m_data[0] == eIpmiCcInvalidReservation ) // reservation lost continue; stdlog << "IPMI error from delete SEL entry: " << rsp.m_data[0] << " !\n"; return SA_ERR_HPI_INVALID_CMD; } if ( rsp.m_data_len < 3 ) { stdlog << "IPMI error from delete SEL entry: message to short " << rsp.m_data_len << " !\n"; return SA_ERR_HPI_INVALID_DATA; } // deleted record id rid = IpmiGetUint16( rsp.m_data + 1 ); // remove record from m_sel cIpmiEvent *e = FindEvent( m_sel, rid ); if ( e ) { m_sel = g_list_remove( m_sel, e ); m_sel_num--; } // remove record from async event list m_async_events_lock.Lock(); e = FindEvent( m_async_events, rid ); if ( e ) { m_async_events = g_list_remove( m_async_events, e ); m_async_events_num--; } m_async_events_lock.Unlock(); return SA_OK; } // reservation lost too many times stdlog << "IPMI error from delete SEL entry: reservation lost too many times !\n"; return SA_ERR_HPI_INVALID_CMD; } SaErrorT cIpmiSel::GetSelTime( SaHpiTimeT &ht ) { cIpmiMsg msg( eIpmiNetfnStorage, eIpmiCmdGetSelTime ); cIpmiMsg rsp; SaErrorT rv = m_mc->SendCommand( msg, rsp ); if ( rv != SA_OK ) { stdlog << "Could not send get SEL time: " << rv << " !\n"; return rv; } if ( rsp.m_data[0] != eIpmiCcOk ) { stdlog << "IPMI error from get SEL time: " << rsp.m_data[0] << " !\n"; return SA_ERR_HPI_INVALID_CMD; } if ( rsp.m_data_len < 5 ) { stdlog << "IPMI error from get SEL time: message to short " << rsp.m_data_len << " !\n"; return SA_ERR_HPI_INVALID_DATA; } ht = IpmiGetUint32( rsp.m_data + 1 ); ht *= 1000000000; return SA_OK; } static time_t CovertToAbsTimeT( SaHpiTimeT ti ) { if ( ti <= SAHPI_TIME_MAX_RELATIVE ) { timeval tv; gettimeofday( &tv, 0 ); tv.tv_sec += ti / 1000000000; tv.tv_usec += ti % 1000000000 / 1000; while( tv.tv_usec > 1000000 ) { tv.tv_sec++; tv.tv_usec -= 1000000; } return tv.tv_sec; } return ti / 1000000000; } SaErrorT cIpmiSel::SetSelTime( SaHpiTimeT ht ) { if ( ht == SAHPI_TIME_UNSPECIFIED ) return SA_ERR_HPI_ERROR; // convert HPI time to time_t time_t t = CovertToAbsTimeT( ht ); cIpmiMsg msg( eIpmiNetfnStorage, eIpmiCmdSetSelTime ); cIpmiMsg rsp; IpmiSetUint32( msg.m_data, t ); msg.m_data_len = 4; SaErrorT rv = m_mc->SendCommand( msg, rsp ); if ( rv != SA_OK ) { stdlog << "Could not send set SEL time: " << rv << " !\n"; return rv; } if ( rsp.m_data[0] != eIpmiCcOk ) { stdlog << "IPMI error from set SEL time: " << rsp.m_data[0] << " !\n"; return SA_ERR_HPI_INVALID_CMD; } return SA_OK; } int cIpmiSel::AddAsyncEvent( cIpmiEvent *new_event ) { cIpmiEvent *e = FindEvent( m_sel, new_event->m_record_id ); // event is already in the sel if ( e && new_event->Cmp( *e ) == 0 ) return 0; m_async_events_lock.Lock(); e = FindEvent( m_async_events, new_event->m_record_id ); if ( !e ) { // add new event to list e = new cIpmiEvent; *e = *new_event; m_async_events = g_list_append( m_async_events, e ); m_async_events_num++; m_async_events_lock.Unlock(); return 0; } m_async_events_lock.Unlock(); if ( new_event->Cmp( *e ) == 0 ) // event is already in the list of async events return 0; // overwrite old event *e = *new_event; return 0; } void cIpmiSel::Dump( cIpmiLog &dump, const char *name ) { if ( dump.IsRecursive() ) { // dump events int i = 0; for( GList *list = m_sel; list; list = g_list_next( list ) ) { cIpmiEvent *e = (cIpmiEvent *)list->data; char str[80]; snprintf( str, sizeof(str), "Event%02x_%d", m_mc->GetAddress(), i++ ); e->Dump( dump, str ); } } dump.Begin( "Sel", name ); dump.Entry( "Version" ) << (int)m_major_version << ", " << (int)m_minor_version << ";\n"; dump.Entry( "Overflow" ) << m_overflow << ";\n"; dump.Entry( "SupportsDeleteSel" ) << m_supports_delete_sel << ";\n"; dump.Entry( "SupportsPartialAddSel" ) << m_supports_partial_add_sel << ";\n"; dump.Entry( "SupportsReserveSel" ) << m_supports_reserve_sel << ";\n"; dump.Entry( "SupportsGetSelAllocation" ) << m_supports_get_sel_allocation << ";\n"; // dump events if ( dump.IsRecursive() && m_sel ) { int i = 0; dump.Entry( "Event" ); for( GList *list = m_sel; list; list = g_list_next( list ) ) { if ( i != 0 ) dump << ", "; char str[80]; snprintf( str, sizeof(str), "Event%02x_%d", m_mc->GetAddress(), i++ ); dump << str; } dump << ";\n"; } dump.End(); } SaErrorT cIpmiSel::GetSelInfo( SaHpiEventLogInfoT &info ) { cIpmiMc *mc = Mc(); int lun = Lun(); cIpmiMsg msg( eIpmiNetfnStorage, eIpmiCmdGetSelTime ); cIpmiMsg rsp; SaErrorT rv = mc->SendCommand( msg, rsp, lun ); if ( rv != SA_OK || rsp.m_data[0] != eIpmiCcOk ) return (rv != SA_OK) ? rv : SA_ERR_HPI_INVALID_DATA; Lock(); info.Entries = SelNum(); info.Size = 0xffff; // We don't support adding entries to SEL yet info.UserEventMaxSize = 0; if ( AdditionTimestamp() > EraseTimestamp() ) info.UpdateTimestamp = AdditionTimestamp(); else info.UpdateTimestamp = EraseTimestamp(); info.UpdateTimestamp *= 1000000000; info.CurrentTime = IpmiGetUint32( rsp.m_data + 1 ); info.CurrentTime *= 1000000000; info.Enabled = SAHPI_TRUE; // ????? info.OverflowFlag = Overflow() ? SAHPI_TRUE : SAHPI_FALSE; info.OverflowResetable = SAHPI_FALSE; info.OverflowAction = SAHPI_EL_OVERFLOW_DROP; Unlock(); return SA_OK; } SaErrorT cIpmiSel::AddSelEntry( const SaHpiEventT & /*Event*/ ) { return SA_ERR_HPI_UNSUPPORTED_API; } SaErrorT cIpmiSel::GetSelEntry( SaHpiEventLogEntryIdT current, SaHpiEventLogEntryIdT &prev, SaHpiEventLogEntryIdT &next, SaHpiEventLogEntryT &entry, SaHpiRdrT &rdr, SaHpiRptEntryT &rptentry ) { unsigned short rid = (unsigned short)current; if ( current == SAHPI_OLDEST_ENTRY ) rid = 0; else if ( current == SAHPI_NEWEST_ENTRY ) rid = 0xffff; unsigned short p; unsigned short n; cIpmiEvent e; SaErrorT rv = GetSelEntry( rid, p, n, e ); if ( rv != SA_OK ) return rv; cIpmiMc *mc = 0; cIpmiSensor *sensor = 0; cIpmiAddr addr; addr.m_type = eIpmiAddrTypeIpmb; if ( e.m_data[6] == 0x03 ) addr.m_channel = 0; else addr.m_channel = e.m_data[5] >> 4; addr.m_slave_addr = e.m_data[4]; addr.m_lun = 0; mc = Mc()->Domain()->FindMcByAddr( addr ); if ( mc ) sensor = mc->FindSensor( (e.m_data[5] & 0x3), e.m_data[8] ); prev = p; next = n; if ( prev == 0 ) prev = SAHPI_NO_MORE_ENTRIES; if ( next == 0xffff ) next = SAHPI_NO_MORE_ENTRIES; entry.EntryId = e.m_record_id; entry.Timestamp = IpmiGetUint32( e.m_data ); if ( entry.Timestamp == 0 ) entry.Timestamp = SAHPI_TIME_UNSPECIFIED; else entry.Timestamp *= 1000000000; entry.Event.Timestamp = entry.Timestamp; if ( &rptentry != NULL ) rptentry.ResourceCapabilities = 0; if ( &rdr != NULL ) rdr.RdrType = SAHPI_NO_RECORD; if ( !sensor ) { // this is possible an event of a resource // no longer present. entry.Event.Source = 0; entry.Event.EventType = SAHPI_ET_OEM; entry.Event.Severity = SAHPI_MAJOR; return SA_OK; } if ( &rptentry != NULL ) { SaHpiRptEntryT *selrpt = oh_get_resource_by_id( sensor->Resource()->Domain()->GetHandler()->rptcache, sensor->Resource()->m_resource_id ); if ( selrpt != NULL ) rptentry = *selrpt; } if ( &rdr != NULL ) { SaHpiRdrT *selrdr = oh_get_rdr_by_id( sensor->Resource()->Domain()->GetHandler()->rptcache, sensor->Resource()->m_resource_id, sensor->RecordId() ); if ( selrdr != NULL ) rdr = *selrdr; } rv = sensor->CreateEvent( &e, entry.Event ); if ( rv == SA_ERR_HPI_DUPLICATE ) rv = SA_OK; return rv; } openhpi-2.14.1/plugins/ipmidirect/ipmi_resource.h0000644000076400007640000000733111302567000017017 0ustar /* * ipmi_resource.h * * Copyright (c) 2004 by FORCE Computers. * Copyright (c) 2005 by ESO Technologies. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Thomas Kanngieser * Pierre Sangouard */ #ifndef dIpmiResource_h #define dIpmiResource_h #ifndef dIpmiSensorHotswap_h #include "ipmi_sensor_hotswap.h" #endif #ifndef dIpmiControl_h #include "ipmi_control.h" #endif #ifndef dArray_h #include "array.h" #endif #ifndef dIpmiCon_h #include "ipmi_con.h" #endif class cIpmiResource : cArray { public: bool m_sel; // true if this is a resource, // which provides access to SEL // find a specific rdr cIpmiRdr *FindRdr( cIpmiMc *mc, SaHpiRdrTypeT type, unsigned int num, unsigned int lun = 0 ); cIpmiRdr *FindRdr( cIpmiMc *mc, SaHpiRdrTypeT type, cIpmiRdr *rdr ); bool AddRdr( cIpmiRdr *rdr ); bool RemRdr( cIpmiRdr *rdr ); int FindRdr( cIpmiRdr *rdr ) { return Find( rdr ); } int NumRdr() { return Num(); } cIpmiRdr *GetRdr( int idx ) { return operator[]( idx ); } protected: cIpmiMc *m_mc; unsigned int m_fru_id; cIpmiEntityPath m_entity_path; bool m_is_fru; cIpmiSensorHotswap *m_hotswap_sensor; // state only to create state change Mx -> M0 // where Mx is m_picmg_fru_state tIpmiFruState m_picmg_fru_state; bool m_policy_canceled; SaHpiTimeoutT m_extract_timeout; tIpmiFruState m_prev_prev_fru_state; unsigned int m_oem; // mapping of sensor numbers int m_sensor_num[256]; public: int CreateSensorNum( SaHpiSensorNumT num ); public: cIpmiMc *Mc() const { return m_mc; } unsigned int FruId() const { return m_fru_id; } tIpmiFruState &PicmgFruState() { return m_picmg_fru_state; } bool &PolicyCanceled() { return m_policy_canceled; } SaHpiTimeoutT &ExtractTimeout() { return m_extract_timeout; } tIpmiFruState &PreviousPrevFruState() { return m_prev_prev_fru_state; } cIpmiDomain *Domain() const; unsigned int &Oem() { return m_oem; } cIpmiEntityPath &EntityPath() { return m_entity_path; } bool &IsFru() { return m_is_fru; } protected: cIpmiTextBuffer m_resource_tag; public: cIpmiTextBuffer &ResourceTag() { return m_resource_tag; } public: cIpmiResource( cIpmiMc *mc, unsigned int fru_id ); virtual ~cIpmiResource(); public: // return hotswap sensor if there is one cIpmiSensorHotswap *GetHotswapSensor() { return m_hotswap_sensor; } protected: unsigned int m_current_control_id; public: // get a unique control num for this resource unsigned int GetControlNum() { return ++m_current_control_id; } // HPI resource id SaHpiResourceIdT m_resource_id; virtual bool Create( SaHpiRptEntryT &entry ); virtual void Destroy(); SaErrorT SendCommand( const cIpmiMsg &msg, cIpmiMsg &rsp, unsigned int lun = 0, int retries = dIpmiDefaultRetries ); SaErrorT SendCommandReadLock( cIpmiRdr *rdr, const cIpmiMsg &msg, cIpmiMsg &rsp, unsigned int lun = 0, int retries = dIpmiDefaultRetries ); SaErrorT SendCommandReadLock( const cIpmiMsg &msg, cIpmiMsg &rsp, unsigned int lun = 0, int retries = dIpmiDefaultRetries ); void Activate(); void Deactivate(); SaHpiHsStateT GetHpiState(); private: bool m_populate; public: // create and populate hpi resource virtual bool Populate(); }; #endif openhpi-2.14.1/plugins/ipmidirect/ipmi_sensor.cpp0000644000076400007640000004742111302567000017040 0ustar /* * ipmi_sensor.cpp * * Copyright (c) 2003,2004 by FORCE Computers * Copyright (c) 2005 by ESO Technologies. * * Note that this file is based on parts of OpenIPMI * written by Corey Minyard * of MontaVista Software. Corey's code was helpful * and many thanks go to him. He gave the permission * to use this code in OpenHPI under BSD license. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Thomas Kanngieser * Pierre Sangouard */ #include #include #include #include #include #include #include #include "ipmi_domain.h" #include "ipmi_mc.h" #include "ipmi_sensor.h" #include "ipmi_entity.h" #include "ipmi_utils.h" #include "ipmi_text_buffer.h" static const char *sensor_types[] = { "Unspecified", "Temperature", "Voltage", "Current", "Fan", "PhysicalSecurity", "PlatformSecurity", "Processor", "PowerSupply", "PowerUnit", "CoolingDevice", "OtherUnitsBasedSensor", "Memory", "DriveSlot", "PowerMemoryResize", "SystemFirmwareProgress", "EventLoggingDisabled", "Watchdog1", "SystemEvent", "CriticalInterrupt", "Button", "ModuleBoard", "MicrocontrollerCoprocessor", "AddInCard", "Chassis", "ChipSet", "OtherFru", "CableInterconnect", "Terminator", "SystemBootInitiated", "BootError", "OsBoot", "OsCriticalStop", "SlotConnector", "SystemAcpiPowerState", "Watchdog2", "PlatformAlert", "EntityPresense", "MonitorAsicIc", "Lan", "ManagementSubsystemHealth", "Battery" }; const char * IpmiSensorTypeToString( tIpmiSensorType val ) { if ( val > eIpmiSensorTypeBattery ) { if ( val == eIpmiSensorTypeAtcaHotSwap ) return "AtcaHotswap"; if ( val == eIpmiSensorTypeAtcaIpmb ) return "AtcaIpmb"; return "Invalid"; } return sensor_types[val]; } static const char *event_support_types[] = { "PerState", "EntireSensor", "GlobalDisable", "None", }; const char * IpmiEventSupportToString( tIpmiEventSupport val ) { if ( val > eIpmiEventSupportNone ) return "Invalid"; return event_support_types[val]; } static const char *event_reading_types[] = { "Unspecified", "Threshold", "DiscreteUsage", "DiscreteState", "DiscretePredictiveFailure", "DiscreteLimitExceeded", "DiscretePerformanceMet", "DiscreteSeverity", "DiscreteDevicePresense", "DiscreteDeviceEnable", "DiscreteAvailability", "DiscreteRedundancy", "DiscreteAcpiPower", }; const char * IpmiEventReadingTypeToString( tIpmiEventReadingType val ) { if ( val == eIpmiEventReadingTypeSensorSpecific ) return "SensorSpecific"; if (( val >= eIpmiEventReadingTypeOemFirst ) && ( val <= eIpmiEventReadingTypeOemLast )) return "Oem"; if ( val > eIpmiEventReadingTypeDiscreteAcpiPower ) return "Invalid"; return event_reading_types[val]; } cIpmiSensor::cIpmiSensor( cIpmiMc *mc ) : cIpmiRdr( mc, SAHPI_SENSOR_RDR ), m_source_mc( 0 ), m_destroyed( false ), m_use_count( 0 ), m_owner( 0 ), m_channel( 0 ), m_num( 0 ), m_sensor_init_scanning( false ), m_sensor_init_events( false ), m_sensor_init_type( false ), m_sensor_init_pu_events( false ), m_sensor_init_pu_scanning( false ), m_ignore_if_no_entity( false ), m_supports_auto_rearm( false ), m_assertion_event_mask( 0 ), m_deassertion_event_mask( 0 ), m_reading_mask( 0 ), m_enabled( SAHPI_TRUE ), m_event_support( eIpmiEventSupportPerState ), m_sensor_type( eIpmiSensorTypeInvalid ), m_event_reading_type( eIpmiEventReadingTypeInvalid ), m_oem( 0 ), m_sensor_type_string( 0 ), m_event_reading_type_string( 0 ), m_rate_unit_string( 0 ), m_base_unit_string( 0 ), m_modifier_unit_string( 0 ), m_sdr( 0 ) { } cIpmiSensor::~cIpmiSensor() { } bool cIpmiSensor::GetDataFromSdr( cIpmiMc *mc, cIpmiSdr *sdr ) { m_use_count = 1; m_destroyed = false; m_mc = mc; m_source_mc = mc; m_owner = sdr->m_data[5]; m_channel = sdr->m_data[6] >> 4; m_lun = sdr->m_data[6] & 0x03; m_num = sdr->m_data[7]; m_sensor_init_scanning = (sdr->m_data[10] >> 6) & 1; m_sensor_init_events = (sdr->m_data[10] >> 5) & 1; if ( m_sensor_init_events ) m_events_enabled = SAHPI_TRUE; else m_events_enabled = SAHPI_FALSE; m_sensor_init_type = (sdr->m_data[10] >> 2) & 1; m_sensor_init_pu_events = (sdr->m_data[10] >> 1) & 1; m_sensor_init_pu_scanning = (sdr->m_data[10] >> 0) & 1; m_ignore_if_no_entity = (sdr->m_data[11] >> 7) & 1; m_supports_auto_rearm = (sdr->m_data[11] >> 6) & 1; m_event_support = (tIpmiEventSupport)(sdr->m_data[11] & 3); m_sensor_type = (tIpmiSensorType)sdr->m_data[12]; m_event_reading_type = (tIpmiEventReadingType)(sdr->m_data[13] & 0x7f); m_oem = sdr->m_data[46]; IdString().SetIpmi( sdr->m_data+47 ); if ( m_owner != mc->GetAddress() ) stdlog << "WARNING : SDR " << sdr->m_record_id << " sensor " << m_num << " slave address " << m_owner << " NOT equal to MC slave address " << (unsigned char)mc->GetAddress() << "\n"; if ( m_channel != mc->GetChannel() ) stdlog << "WARNING : SDR " << sdr->m_record_id << " sensor " << m_num << " channel " << m_channel << " NOT equal to MC channel " << (unsigned short)mc->GetChannel() << "\n"; return true; } void cIpmiSensor::HandleNew( cIpmiDomain *domain ) { m_sensor_type_string = IpmiSensorTypeToString( m_sensor_type ); m_event_reading_type_string = IpmiEventReadingTypeToString( m_event_reading_type ); } bool cIpmiSensor::Cmp( const cIpmiSensor &s2 ) const { if ( m_entity_path != s2.m_entity_path ) return false; if ( m_sensor_init_scanning != s2.m_sensor_init_scanning ) return false; if ( m_sensor_init_events != s2.m_sensor_init_events ) return false; if ( m_sensor_init_type != s2.m_sensor_init_type ) return false; if ( m_sensor_init_pu_events != s2.m_sensor_init_pu_events ) return false; if ( m_sensor_init_pu_scanning != s2.m_sensor_init_pu_scanning ) return false; if ( m_ignore_if_no_entity != s2.m_ignore_if_no_entity ) return false; if ( m_supports_auto_rearm != s2.m_supports_auto_rearm ) return false; if ( m_event_support != s2.m_event_support ) return false; if ( m_sensor_type != s2.m_sensor_type ) return false; if ( m_event_reading_type != s2.m_event_reading_type ) return false; if ( m_oem != s2.m_oem ) return false; if ( IdString() != s2.IdString() ) return false; return true; } void cIpmiSensor::Dump( cIpmiLog &dump ) const { char str[256]; IdString().GetAscii( str, 256 ); dump << "Sensor: " << m_num << " " << str << "\n"; } bool cIpmiSensor::CreateRdr( SaHpiRptEntryT &resource, SaHpiRdrT &rdr ) { if ( cIpmiRdr::CreateRdr( resource, rdr ) == false ) return false; // update resource resource.ResourceCapabilities |= SAHPI_CAPABILITY_RDR|SAHPI_CAPABILITY_SENSOR; // sensor record SaHpiSensorRecT &rec = rdr.RdrTypeUnion.SensorRec; int v = Resource()->CreateSensorNum( Num() ); if ( v == -1 ) { stdlog << "too many sensors (> 255) for a resource !\n"; assert( v != -1 ); return false; } m_virtual_num = v; rec.Num = v; rec.Type = HpiSensorType(SensorType()); rec.Category = HpiEventCategory(EventReadingType()); rec.Oem = GetOem(); switch( EventSupport() ) { case eIpmiEventSupportPerState: m_event_control = SAHPI_SEC_PER_EVENT; break; case eIpmiEventSupportEntireSensor: case eIpmiEventSupportGlobalEnable: m_event_control = SAHPI_SEC_READ_ONLY_MASKS; break; case eIpmiEventSupportNone: m_event_control = SAHPI_SEC_READ_ONLY; break; } rec.Events = m_reading_mask; rec.EventCtrl = m_event_control; rec.EnableCtrl = SAHPI_TRUE; return true; } SaErrorT cIpmiSensor::GetSensorData( cIpmiMsg &rsp ) { cIpmiMsg msg( eIpmiNetfnSensorEvent, eIpmiCmdGetSensorReading ); msg.m_data_len = 1; msg.m_data[0] = m_num; SaErrorT rv = Resource()->SendCommandReadLock( this, msg, rsp, m_lun ); if ( rv != SA_OK ) { stdlog << "IPMI error getting states: " << rv << " \n"; return rv; } if ( rsp.m_data[0] != 0 ) { stdlog << "IPMI error getting reading: " << rsp.m_data[0] << " !\n"; return SA_ERR_HPI_INVALID_DATA; } if ( rsp.m_data_len < 4 ) { stdlog << "IPMI error getting reading: data to small " << rsp.m_data_len << " !\n"; return SA_ERR_HPI_INVALID_DATA; } return SA_OK; } SaErrorT cIpmiSensor::GetEnable( SaHpiBoolT &enable ) { enable = m_enabled; return SA_OK; } SaErrorT cIpmiSensor::SetEnable( const SaHpiBoolT &enable ) { if (m_enabled == enable) return SA_OK; m_enabled = enable; CreateEnableChangeEvent(); return SA_OK; } SaErrorT cIpmiSensor::GetEventEnables( SaHpiBoolT &enables ) { SaErrorT rv = GetEventEnableHw( m_events_enabled ); enables = m_events_enabled; return rv; } SaErrorT cIpmiSensor::SetEventEnables( const SaHpiBoolT &enables ) { if ( m_event_control == SAHPI_SEC_READ_ONLY ) return SA_ERR_HPI_READ_ONLY; if ( m_events_enabled == enables ) return SA_OK; m_events_enabled = enables; SaErrorT rv = SetEventEnableHw( m_events_enabled ); if ( rv == SA_OK ) CreateEnableChangeEvent(); return rv; } SaErrorT cIpmiSensor::GetEventMasks( SaHpiEventStateT &AssertEventMask, SaHpiEventStateT &DeassertEventMask ) { SaErrorT rv = GetEventMasksHw( m_current_hpi_assert_mask, m_current_hpi_deassert_mask ); stdlog << "GetEventMasks sensor " << m_num << " assert " << m_current_hpi_assert_mask << " deassert " << m_current_hpi_deassert_mask << "\n"; if (&AssertEventMask) AssertEventMask = m_current_hpi_assert_mask; if (&DeassertEventMask) DeassertEventMask = m_current_hpi_deassert_mask; return rv; } SaErrorT cIpmiSensor::SetEventMasks( const SaHpiSensorEventMaskActionT &act, SaHpiEventStateT &AssertEventMask, SaHpiEventStateT &DeassertEventMask ) { if ( m_event_control != SAHPI_SEC_PER_EVENT ) return SA_ERR_HPI_READ_ONLY; if ( AssertEventMask == SAHPI_ALL_EVENT_STATES ) AssertEventMask = m_hpi_assert_mask; if ( DeassertEventMask == SAHPI_ALL_EVENT_STATES ) DeassertEventMask = m_hpi_deassert_mask; if ( act == SAHPI_SENS_ADD_EVENTS_TO_MASKS ) { if ((( AssertEventMask & ~m_hpi_assert_mask ) != 0 ) || (( DeassertEventMask & ~m_hpi_deassert_mask ) != 0 )) return SA_ERR_HPI_INVALID_DATA; } SaHpiEventStateT save_assert_mask = m_current_hpi_assert_mask; SaHpiEventStateT save_deassert_mask = m_current_hpi_deassert_mask; if ( act == SAHPI_SENS_ADD_EVENTS_TO_MASKS ) { m_current_hpi_assert_mask |= AssertEventMask; m_current_hpi_deassert_mask |= DeassertEventMask; } else if ( act == SAHPI_SENS_REMOVE_EVENTS_FROM_MASKS ) { m_current_hpi_assert_mask &= (AssertEventMask ^ SAHPI_ALL_EVENT_STATES); m_current_hpi_deassert_mask &= (DeassertEventMask ^ SAHPI_ALL_EVENT_STATES); } else return SA_ERR_HPI_INVALID_PARAMS; stdlog << "SetEventMasks sensor " << m_num << " assert " << m_current_hpi_assert_mask << " deassert " << m_current_hpi_deassert_mask << "\n"; if (( save_assert_mask == m_current_hpi_assert_mask ) && ( save_deassert_mask == m_current_hpi_deassert_mask )) return SA_OK; SaErrorT rv = SetEventMasksHw( m_current_hpi_assert_mask, m_current_hpi_deassert_mask ); if ( rv == SA_OK ) CreateEnableChangeEvent(); return rv; } SaErrorT cIpmiSensor::GetEventEnableHw( SaHpiBoolT &enables ) { cIpmiMsg msg( eIpmiNetfnSensorEvent, eIpmiCmdGetSensorEventEnable ); msg.m_data_len = 1; msg.m_data[0] = m_num; cIpmiMsg rsp; stdlog << "get event enables command for sensor : " << m_num << " !\n"; SaErrorT rv = Resource()->SendCommandReadLock( this, msg, rsp, m_lun ); if ( rv != SA_OK ) { stdlog << "Error sending get event enables command: " << rv << " !\n"; return rv; } if ( rsp.m_data[0] ) { stdlog << "IPMI error getting sensor enables: " << rsp.m_data[0] << " !\n"; return SA_ERR_HPI_INVALID_CMD; } enables = (rsp.m_data[1] & 0x80) ? SAHPI_TRUE : SAHPI_FALSE; return SA_OK; } SaErrorT cIpmiSensor::SetEventEnableHw( const SaHpiBoolT &enables ) { cIpmiMsg msg; msg.m_netfn = eIpmiNetfnSensorEvent; msg.m_cmd = eIpmiCmdSetSensorEventEnable; msg.m_data[0] = m_num; msg.m_data[1] = ((m_events_enabled == SAHPI_TRUE) ? 0x80 : 0) | (1<<6); msg.m_data_len = 2; cIpmiMsg rsp; stdlog << "set event enables command for sensor : " << m_num << " !\n"; SaErrorT rv = Resource()->SendCommandReadLock( this, msg, rsp, m_lun ); if ( rv != SA_OK ) { stdlog << "Error sending set event enables command: " << rv << " !\n"; return rv; } if ( rsp.m_data[0] ) { stdlog << "IPMI error setting sensor enables: " << rsp.m_data[0] << " !\n"; return SA_ERR_HPI_INVALID_CMD; } return SA_OK; } SaErrorT cIpmiSensor::GetEventMasksHw( cIpmiMsg &rsp ) { cIpmiMsg msg( eIpmiNetfnSensorEvent, eIpmiCmdGetSensorEventEnable ); msg.m_data_len = 1; msg.m_data[0] = m_num; stdlog << "get event enables command for sensor : " << m_num << " !\n"; SaErrorT rv = Resource()->SendCommandReadLock( this, msg, rsp, m_lun ); if ( rv != SA_OK ) { stdlog << "Error sending get event enables command: " << rv << " !\n"; return rv; } if ( rsp.m_data[0] ) { stdlog << "IPMI error getting sensor enables: " << rsp.m_data[0] << " !\n"; return SA_ERR_HPI_INVALID_CMD; } return SA_OK; } SaErrorT cIpmiSensor::SetEventMasksHw( cIpmiMsg &msg, bool evt_enable) { msg.m_netfn = eIpmiNetfnSensorEvent; msg.m_cmd = eIpmiCmdSetSensorEventEnable; msg.m_data[0] = m_num; msg.m_data[1] = ((m_events_enabled == SAHPI_TRUE) ? 0x80 : 0) | (1<<6); if ( m_event_support == eIpmiEventSupportEntireSensor ) { // We can only turn on/off the entire sensor, just pass the // status to the sensor. msg.m_data_len = 2; } else { if ( evt_enable == true ) msg.m_data[1] |= (1<<4); // enable selected event messages else msg.m_data[1] |= (1<<5); // disable selected event messages msg.m_data_len = 6; } cIpmiMsg rsp; stdlog << "set event enables command for sensor : " << m_num << " !\n"; SaErrorT rv = Resource()->SendCommandReadLock( this, msg, rsp, m_lun ); if ( rv != SA_OK ) { stdlog << "Error sending set event enables command: " << rv << " !\n"; return rv; } if ( rsp.m_data[0] ) { stdlog << "IPMI error setting sensor enables: " << rsp.m_data[0] << " !\n"; return SA_ERR_HPI_INVALID_CMD; } return SA_OK; } SaHpiSensorTypeT cIpmiSensor::HpiSensorType(tIpmiSensorType sensor_type) { if ( sensor_type >= eIpmiSensorTypeOemFirst) return SAHPI_OEM_SENSOR; return (SaHpiSensorTypeT)sensor_type; } SaHpiEventCategoryT cIpmiSensor::HpiEventCategory(tIpmiEventReadingType reading_type) { if ( reading_type == eIpmiEventReadingTypeSensorSpecific ) return SAHPI_EC_SENSOR_SPECIFIC; if (( reading_type >= eIpmiEventReadingTypeOemFirst ) && ( reading_type <= eIpmiEventReadingTypeOemLast )) return SAHPI_EC_GENERIC; return (SaHpiEventCategoryT)reading_type; } void cIpmiSensor::CreateEnableChangeEvent() { cIpmiResource *res = Resource(); if( !res ) { stdlog << "CreateEnableChangeEvent: No resource !\n"; return; } oh_event *e = (oh_event *)g_malloc0( sizeof( struct oh_event ) ); e->event.EventType = SAHPI_ET_SENSOR_ENABLE_CHANGE; SaHpiRptEntryT *rptentry = oh_get_resource_by_id( res->Domain()->GetHandler()->rptcache, res->m_resource_id ); SaHpiRdrT *rdrentry = oh_get_rdr_by_id( res->Domain()->GetHandler()->rptcache, res->m_resource_id, m_record_id ); if ( rptentry ) e->resource = *rptentry; else e->resource.ResourceCapabilities = 0; if ( rdrentry ) e->rdrs = g_slist_append(e->rdrs, g_memdup(rdrentry, sizeof(SaHpiRdrT))); else e->rdrs = NULL; // hpi event e->event.Source = res->m_resource_id; e->event.EventType = SAHPI_ET_SENSOR_ENABLE_CHANGE; e->event.Severity = SAHPI_INFORMATIONAL; oh_gettimeofday(&e->event.Timestamp); // sensor enable event SaHpiSensorEnableChangeEventT *se = &e->event.EventDataUnion.SensorEnableChangeEvent; se->SensorNum = m_num; se->SensorType = HpiSensorType(SensorType()); se->EventCategory = HpiEventCategory(EventReadingType()); se->SensorEnable = m_enabled; se->SensorEventEnable = m_events_enabled; se->AssertEventMask = m_current_hpi_assert_mask; se->DeassertEventMask = m_current_hpi_deassert_mask; stdlog << "cIpmiSensor::CreateEnableChangeEvent OH_ET_HPI Event enable change resource " << res->m_resource_id << "\n"; m_mc->Domain()->AddHpiEvent( e ); return; } SaErrorT cIpmiSensor::CreateEvent( cIpmiEvent *event, SaHpiEventT &h ) { memset( &h, 0, sizeof( SaHpiEventT ) ); cIpmiResource *res = Resource(); if( !res ) { stdlog << "CreateEvent: No resource !\n"; return SA_ERR_HPI_NOT_PRESENT; } h.Source = res->m_resource_id; h.EventType = SAHPI_ET_SENSOR; h.Timestamp = (SaHpiTimeT)IpmiGetUint32( event->m_data ); if ( h.Timestamp == 0 ) h.Timestamp = SAHPI_TIME_UNSPECIFIED; else h.Timestamp *= 1000000000; // sensor event SaHpiSensorEventT &s = h.EventDataUnion.SensorEvent; s.SensorNum = m_num; s.SensorType = HpiSensorType((tIpmiSensorType)event->m_data[7]); tIpmiEventReadingType reading_type = (tIpmiEventReadingType)(event->m_data[9] & 0x7f); s.EventCategory = HpiEventCategory(reading_type); return SA_OK; } void cIpmiSensor::HandleEvent( cIpmiEvent *event ) { cIpmiResource *res = Resource(); if( !res ) { stdlog << "HandleEvent: No resource !\n"; return; } SaHpiRptEntryT *rptentry; SaHpiRdrT *rdrentry; // Sensor disabled -> ignore event if (m_enabled == SAHPI_FALSE) { stdlog << "reading event : Ignore (Sensor disabled).\n"; return; } stdlog << "reading event.\n"; oh_event *e = (oh_event *)g_malloc0( sizeof( struct oh_event ) ); rptentry = oh_get_resource_by_id( res->Domain()->GetHandler()->rptcache, res->m_resource_id ); rdrentry = oh_get_rdr_by_id( res->Domain()->GetHandler()->rptcache, res->m_resource_id, m_record_id ); if ( rptentry ) e->resource = *rptentry; else e->resource.ResourceCapabilities = 0; if ( rdrentry ) e->rdrs = g_slist_append(e->rdrs, g_memdup(rdrentry, sizeof(SaHpiRdrT))); else e->rdrs = NULL; // hpi event SaHpiEventT &he = e->event; int rv = CreateEvent( event, he ); if ( rv != SA_OK ) return; stdlog << "cIpmiSensor::HandleEvent OH_ET_HPI Event resource " << res->m_resource_id << "\n"; m_mc->Domain()->AddHpiEvent( e ); } openhpi-2.14.1/plugins/ipmidirect/ipmi_mc.h0000644000076400007640000001337711302567000015576 0ustar /* * * Copyright (c) 2003,2004 by FORCE Computers * Copyright (c) 2005 by ESO Technologies. * * Note that this file is based on parts of OpenIPMI * written by Corey Minyard * of MontaVista Software. Corey's code was helpful * and many thanks go to him. He gave the permission * to use this code in OpenHPI under BSD license. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Thomas Kanngieser * Pierre Sangouard */ #ifndef dIpmiMc_h #define dIpmiMc_h #include #include #ifndef dIpmiSdr_h #include "ipmi_sdr.h" #endif #ifndef dIpmiAddr_h #include "ipmi_addr.h" #endif #ifndef dIpmiMsg_h #include "ipmi_msg.h" #endif #ifndef dIpmiSensorHotswap_h #include "ipmi_sensor_hotswap.h" #endif #ifndef dIpmiSel_h #include "ipmi_sel.h" #endif #ifndef dIpmiCon_h #include "ipmi_con.h" #endif #ifndef dIpmiMcVendor_h #include "ipmi_mc_vendor.h" #endif #ifndef dIpmiInventory_h #include "ipmi_inventory.h" #endif class cIpmiDomain; class cIpmiMcThread; class cIpmiMc : cArray { protected: cIpmiMcVendor *m_vendor; cIpmiAddr m_addr; // If the MC is known to be good in the system, then active is // true. If active is false, that means that there are sensors // that refer to this MC, but the MC is not currently in the // system. bool m_active; cIpmiDomain *m_domain; cIpmiSdrs *m_sdrs; // The sensors that came from the device SDR on this MC. GList *m_sensors_in_my_sdr; // The system event log, for querying and storing events. cIpmiSel *m_sel; // PICMG version for ATCA boards unsigned char m_picmg_major; unsigned char m_picmg_minor; // The rest is the actual data from the get device id and SDRs. unsigned char m_device_id; unsigned char m_device_revision; bool m_provides_device_sdrs; bool m_device_available; unsigned char m_device_support; bool m_chassis_support; bool m_bridge_support; bool m_ipmb_event_generator_support; bool m_ipmb_event_receiver_support; bool m_fru_inventory_support; bool m_sel_device_support; bool m_sdr_repository_support; bool m_sensor_device_support; unsigned char m_major_fw_revision; unsigned char m_minor_fw_revision; unsigned char m_major_version; unsigned char m_minor_version; unsigned int m_manufacturer_id; unsigned short m_product_id; unsigned char m_aux_fw_revision[4]; bool m_is_tca_mc; bool m_is_rms_board; SaErrorT SendSetEventRcvr( unsigned int addr ); public: void AddResource( cIpmiResource *res ); void RemResource( cIpmiResource *res ); cIpmiResource *FindResource( const cIpmiEntityPath &ep ); cIpmiResource *FindResource( cIpmiResource *res ); cIpmiResource *GetResource( int i ); int NumResources() const { return Num(); } public: cIpmiMc( cIpmiDomain *domain, const cIpmiAddr &addr ); virtual ~cIpmiMc(); cIpmiDomain *Domain() const { return m_domain; } unsigned char DeviceRevision() const { return m_device_revision; } unsigned char DeviceSupport() const { return m_device_support; } unsigned char MajorFwRevision() const { return m_major_fw_revision; } unsigned char MinorFwRevision() const { return m_minor_fw_revision; } unsigned char MajorVersion() const { return m_major_version; } unsigned char MinorVersion() const { return m_minor_version; } unsigned int ManufacturerId() const { return m_manufacturer_id; } unsigned short ProductId() const { return m_product_id; } unsigned char AuxFwRevision( int v ) const { if ( v >= 0 && v < 4 ) return m_aux_fw_revision[v]; else return 0; } const cIpmiAddr &Addr() { return m_addr; } void CheckTca(); bool IsTcaMc() { return m_is_tca_mc; } bool &IsRmsBoard() { return m_is_rms_board; } void SetSel( bool sel ) { m_sel_device_support = sel; } cIpmiSensorHotswap *FindHotswapSensor(); GList *GetSdrSensors() const { return m_sensors_in_my_sdr; } void SetSdrSensors( GList *sensors ) { m_sensors_in_my_sdr = sensors; } bool ProvidesDeviceSdrs() const { return m_provides_device_sdrs; } void SetProvidesDeviceSdrs(bool val) { m_provides_device_sdrs = val; } bool &SdrRepositorySupport() { return m_sdr_repository_support; } bool SelDeviceSupport() const { return m_sel_device_support; } cIpmiSel *Sel() const { return m_sel; } bool Cleanup(); // true => it is safe to destroy mc SaErrorT HandleNew(); bool DeviceDataCompares( const cIpmiMsg &msg ) const; int GetDeviceIdDataFromRsp( const cIpmiMsg &msg ); void CheckEventRcvr(); SaErrorT SendCommand( const cIpmiMsg &msg, cIpmiMsg &rsp_msg, unsigned int lun = 0, int retries = dIpmiDefaultRetries ); unsigned int GetChannel() const; unsigned int GetAddress() const; void SetActive(); cIpmiSensor *FindSensor( unsigned int lun, unsigned int sensor_id ); cIpmiRdr *FindRdr( cIpmiRdr *r ); void SetVendor( cIpmiMcVendor *mv ) { if ( mv ) m_vendor = mv; } cIpmiMcVendor *GetVendor() { return m_vendor; } protected: bool DumpFrus( cIpmiLog &dump, const char *name ) const; bool DumpControls( cIpmiLog &dump, const char *name ) const; public: void Dump( cIpmiLog &dump, const char *name ) const; // create and populate resources and rdrs virtual bool Populate(); }; #endif openhpi-2.14.1/plugins/ipmidirect/ipmi_control.cpp0000644000076400007640000000263511302567000017205 0ustar /* * ipmi_control.cpp * * Copyright (c) 2004 by FORCE Computers. * Copyright (c) 2005 by ESO Technologies. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Thomas Kanngieser * Pierre Sangouard */ #include "ipmi_control.h" #include "ipmi_domain.h" cIpmiControl::cIpmiControl( cIpmiMc *mc, unsigned int num, SaHpiCtrlOutputTypeT output_type, SaHpiCtrlTypeT type ) : cIpmiRdr( mc, SAHPI_CTRL_RDR ), m_num( num ), m_output_type( output_type ), m_type( type ) { } cIpmiControl::~cIpmiControl() { } bool cIpmiControl::CreateRdr( SaHpiRptEntryT &resource, SaHpiRdrT &rdr ) { if ( cIpmiRdr::CreateRdr( resource, rdr ) == false ) return false; // update resource resource.ResourceCapabilities |= SAHPI_CAPABILITY_RDR|SAHPI_CAPABILITY_CONTROL; // control record SaHpiCtrlRecT &rec = rdr.RdrTypeUnion.CtrlRec; rec.Num = (SaHpiCtrlNumT)m_num; rec.OutputType = m_output_type; rec.Type = m_type; rec.Oem = m_oem; return true; } openhpi-2.14.1/plugins/ipmidirect/ipmi_domain.cpp0000644000076400007640000005670611302567000017004 0ustar /* * * Copyright (c) 2003,2004 by FORCE Computers * Copyright (c) 2005 by ESO Technologies. * * Note that this file is based on parts of OpenIPMI * written by Corey Minyard * of MontaVista Software. Corey's code was helpful * and many thanks go to him. He gave the permission * to use this code in OpenHPI under BSD license. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Thomas Kanngieser * Pierre Sangouard */ #include #include "ipmi.h" #include "ipmi_utils.h" cIpmiDomain::cIpmiDomain() : m_con( 0 ), m_is_tca( false ), m_main_sdrs( 0 ), m_sensors_in_main_sdr( 0 ), m_major_version( 0 ), m_minor_version( 0 ), m_sdr_repository_support( false ), m_si_mc( 0 ), m_initial_discover( 0 ), m_mc_poll_interval( dIpmiMcPollInterval ), m_sel_rescan_interval( dIpmiSelQueryInterval ), m_bmc_discovered( false ) { cIpmiMcVendorFactory::InitFactory(); m_did = 0; m_own_domain = false; for( int i = 0; i < 256; i++ ) { m_mc_thread[i] = 0; m_atca_site_property[i].m_property = 0; m_atca_site_property[i].m_max_side_id = 0; m_atca_site_property[i].m_mc_type = 0; } // scan at least at dIpmiBmcSlaveAddr NewFruInfo( dIpmiBmcSlaveAddr, 0, SAHPI_ENT_SHELF_MANAGER, 0, eIpmiAtcaSiteTypeDedicatedShMc, dIpmiMcThreadInitialDiscover | dIpmiMcThreadPollDeadMc | dIpmiMcThreadPollAliveMc ); // default site type properties unsigned int prop = dIpmiMcThreadInitialDiscover | dIpmiMcThreadCreateM0; // atca board SetAtcaSiteProperty( eIpmiAtcaSiteTypeAtcaBoard, prop, 32 ); // power SetAtcaSiteProperty( eIpmiAtcaSiteTypePowerEntryModule, prop, 8 ); // shelf fru information SetAtcaSiteProperty( eIpmiAtcaSiteTypeShelfFruInformation, prop, 4 ); // dedicated ShMc SetAtcaSiteProperty( eIpmiAtcaSiteTypeDedicatedShMc, prop, 2 ); // fan tray SetAtcaSiteProperty( eIpmiAtcaSiteTypeFanTray, prop, 8 ); // fan filter tray SetAtcaSiteProperty( eIpmiAtcaSiteTypeFanFilterTray, prop, 8 ); // alarm SetAtcaSiteProperty( eIpmiAtcaSiteTypeAlarm, prop, 8 ); // AdvancedMC Module SetAtcaSiteProperty( eIpmiAtcaSiteTypeAdvancedMcModule, prop, 32 ); // PMC SetAtcaSiteProperty( eIpmiAtcaSiteTypePMC, prop, 32 ); // rear transition module SetAtcaSiteProperty( eIpmiAtcaSiteTypeRearTransitionModule, prop, 32 ); // MicroTca Carrier Hub SetAtcaSiteProperty( eIpmiAtcaSiteTypeMicroTcaCarrierHub, prop, 8 ); // Power Module SetAtcaSiteProperty( eIpmiAtcaSiteTypePowerModule, prop, 8 ); } cIpmiDomain::~cIpmiDomain() { cIpmiMcVendorFactory::CleanupFactory(); } bool cIpmiDomain::Init( cIpmiCon *con ) { if ( m_con != 0 ) { stdlog << "IPMI Domain already initialized !\n"; return false; } m_con = con; // create system interface cIpmiAddr si( eIpmiAddrTypeSystemInterface); m_si_mc = new cIpmiMc( this, si ); if ( m_si_mc == 0 ) { stdlog << "cannot create system interface !\n"; return false; } // create main sdr m_main_sdrs = new cIpmiSdrs( m_si_mc, false ); // send get device id to system interface cIpmiMsg msg( eIpmiNetfnApp, eIpmiCmdGetDeviceId ); cIpmiMsg rsp; SaErrorT rv = m_si_mc->SendCommand( msg, rsp ); if ( rv != SA_OK ) { stdlog << "cannot send IPMI get device id to system interface: " << rv << ", " << strerror( rv ) << " !\n"; return false; } if ( rsp.m_data[0] != 0 || rsp.m_data_len < 12 ) { // At least the get device id has to work. stdlog << "get device id fails " << rsp.m_data[0] << " !\n"; return false; } m_major_version = rsp.m_data[5] & 0xf; m_minor_version = (rsp.m_data[5] >> 4) & 0xf; m_sdr_repository_support = (rsp.m_data[6] & 0x02) == 0x02; m_si_mc->SdrRepositorySupport() = m_sdr_repository_support; if ( m_major_version < 1 ) { // We only support 1.0 and greater. stdlog << "ipmi version " << m_major_version << "." << m_minor_version << " not supported !\n"; return false; } // set vendor unsigned int mid = rsp.m_data[7] | (rsp.m_data[8] << 8) | (rsp.m_data[9] << 16); unsigned int pid = IpmiGetUint16( rsp.m_data + 10 ); cIpmiMcVendor *mv = cIpmiMcVendorFactory::GetFactory()->Get( mid, pid ); m_si_mc->SetVendor( mv ); // initialize system interface MC if ( mv->InitMc( m_si_mc, rsp ) == false ) { stdlog << "cannot initialize system interface !\n"; return false; } int num = m_max_outstanding; if ( m_max_outstanding == 0 ) { // Check the number of outstanding requests. // This is fine tuning if the BMC/ShMc has // a block transfer interface. // If not supported use the defaults // given in openhpi.conf. msg.m_netfn = eIpmiNetfnApp; msg.m_cmd = eIpmiCmdGetBtInterfaceCapabilities; msg.m_data_len = 0; rv = m_si_mc->SendCommand( msg, rsp, 0, 1 ); // ignore on error if ( rv == SA_OK && rsp.m_data[0] == 0 && rsp.m_data_len >= 6 ) { num = rsp.m_data[1]; stdlog << "reading bt capabilities: max outstanding " << num << ", input " << (int)rsp.m_data[2] << ", output " << (int)rsp.m_data[3] << ", retries " << (int)rsp.m_data[5] << ".\n"; // check if ( num < 1 ) num = 1; if ( num > 32 ) num = 32; } } if ( num == 0 ) { num = 1; } stdlog << "max number of outstanding = " << num << ".\n"; m_con->SetMaxOutstanding( num ); /** Commenting this code block due to the multi-domain ** changes in the infrastructure. ** (Renier Morales 11/21/06) if ( m_own_domain == true ) { SaHpiTextBufferT buf = m_domain_tag; m_did = oh_request_new_domain_aitimeout(m_handler_id, &buf, 0, m_insert_timeout, 0, 0); if ( m_did == 0 ) { stdlog << "Failed to get a Domain ID - using default\n"; m_did = oh_get_default_domain_id(); } } else {*/ m_insert_timeout = SAHPI_TIMEOUT_IMMEDIATE; m_did = 0; /*}*/ stdlog << "Domain ID " << m_did << "\n"; // check for TCA an modify m_mc_to_check CheckTca(); // Non TCA system -> adjust BMC info if ( !m_is_tca ) { cIpmiFruInfo *fi = FindFruInfo( dIpmiBmcSlaveAddr, 0 ); if ( !fi ) return false; fi->Entity() = SAHPI_ENT_SYS_MGMNT_MODULE; fi->Site() = eIpmiAtcaSiteTypeUnknown; fi->Slot() = GetFreeSlotForOther( dIpmiBmcSlaveAddr ); } if ( m_sdr_repository_support ) { stdlog << "reading repository SDR.\n"; rv = m_main_sdrs->Fetch(); if ( rv ) // Just report an error, it shouldn't be a big deal if this // fails. stdlog << "could not get main SDRs, error " << rv << " !\n"; else if ( !m_is_tca ) { // for each mc device locator record in main repository // create an entry in m_mc_to_check. for( unsigned int i = 0; i < m_main_sdrs->NumSdrs(); i++ ) { cIpmiSdr *sdr = m_main_sdrs->Sdr( i ); if ( sdr->m_type != eSdrTypeMcDeviceLocatorRecord ) continue; unsigned char addr = sdr->m_data[5]; cIpmiFruInfo *fi = FindFruInfo( addr, 0 ); if ( fi == 0 ) NewFruInfo( addr, 0, SAHPI_ENT_SYS_MGMNT_MODULE, GetFreeSlotForOther( addr ), eIpmiAtcaSiteTypeUnknown, dIpmiMcThreadInitialDiscover | dIpmiMcThreadPollDeadMc | dIpmiMcThreadPollAliveMc ); } } } // Start all MC threads with the // properties found in m_mc_to_check. m_initial_discover = 0; m_num_mc_threads = 0; for( GList *list = GetFruInfoList(); list; list = g_list_next( list ) ) { cIpmiFruInfo *fi = (cIpmiFruInfo *)list->data; if ( fi->FruId() != 0 ) continue; int addr = fi->Address(); if ( m_mc_thread[addr] != 0 ) { stdlog << "Thread already started for " << addr << " !\n"; continue; } m_mc_thread[addr] = new cIpmiMcThread( this, addr, fi->Properties() /*, m_mc_to_check[i], m_mc_type[i], m_mc_slot[i] */ ); // Count MC thread with initial discover. // This counter is used in cIpmi::IfDiscoverResources // to wait until discover is done if ( fi->Properties() & dIpmiMcThreadInitialDiscover ) { m_initial_discover_lock.Lock(); m_initial_discover++; m_initial_discover_lock.Unlock(); } m_mc_thread[addr]->Start(); } return true; } void cIpmiDomain::Cleanup() { int i; // stop MC threads for( i = 0; i < 256; i++ ) if ( m_mc_thread[i] ) m_mc_thread[i]->m_exit = true; // wait until all threads are finish bool loop = true; while( loop ) { m_mc_thread_lock.Lock(); loop = (bool)m_num_mc_threads; m_mc_thread_lock.Unlock(); usleep( 100000 ); } // wait for threads exit for( i = 0; i < 256; i++ ) if ( m_mc_thread[i] ) { void *rv; m_mc_thread[i]->Wait( rv ); delete m_mc_thread[i]; m_mc_thread[i] = 0; } // stop reader thread if ( m_con && m_con->IsOpen() ) m_con->Close(); // Delete the sensors from the main SDR repository. while( m_sensors_in_main_sdr ) { cIpmiSensor *sensor = (cIpmiSensor *)m_sensors_in_main_sdr->data; m_sensors_in_main_sdr = g_list_remove( m_sensors_in_main_sdr, sensor ); sensor->Resource()->RemRdr( sensor ); delete sensor; } // cleanup all MCs for( i = m_mcs.Num() - 1; i >= 0; i-- ) { cIpmiMc *mc = m_mcs[i]; CleanupMc( mc ); } // now all mc's are ready to destroy while( m_mcs.Num() ) { cIpmiMc *mc = m_mcs[0]; CleanupMc( mc ); } // destroy si if ( m_si_mc ) { m_si_mc->Cleanup(); delete m_si_mc; m_si_mc = 0; } /* Destroy the main SDR repository, if it exists. */ if ( m_main_sdrs ) { delete m_main_sdrs; m_main_sdrs = 0; } } void cIpmiDomain::AddMc( cIpmiMc *mc ) { m_mcs.Add( mc ); } bool cIpmiDomain::CleanupMc( cIpmiMc *mc ) { if ( !mc->Cleanup() ) return false; int idx = m_mcs.Find( mc ); if ( idx == -1 ) { stdlog << "unable to find mc at " << (unsigned char)mc->GetAddress() << " in mc list !\n"; return false; } m_mcs.Rem( idx ); delete mc; return true; } SaErrorT cIpmiDomain::CheckTca() { cIpmiMsg msg( eIpmiNetfnPicmg, eIpmiCmdGetPicMgProperties ); msg.m_data_len = 1; msg.m_data[0] = dIpmiPicMgId; cIpmiMsg rsp; SaErrorT rv; int i; m_is_tca = false; if ( !m_si_mc ) return SA_ERR_HPI_INTERNAL_ERROR; stdlog << "checking for TCA system.\n"; rv = m_si_mc->SendCommand( msg, rsp ); if ( rv != SA_OK || rsp.m_data[0] || rsp.m_data[1] != dIpmiPicMgId ) { stdlog << "not a TCA system.\n"; return (rv != SA_OK) ? rv : SA_ERR_HPI_INVALID_DATA; } unsigned char minor = (rsp.m_data[2] >> 4) & 0x0f; unsigned char major = rsp.m_data[2] & 0x0f; stdlog << "found a PICMG system, Extension Version " << (unsigned int)major << "." << (unsigned int)minor << ".\n"; switch ( major ) { default: return SA_OK; case 2: stdlog << "found an ATCA system.\n"; break; case 5: stdlog << "found a MicroTCA system.\n"; break; } // use atca timeout stdlog << "set timeout to " << m_con_atca_timeout << ".\n"; m_con->m_timeout = m_con_atca_timeout; m_is_tca = true; // MicroTCA systems have 1 to 16 Carriers if ( major == 5 ) { for ( int carrier_number = 1; carrier_number <= 16; carrier_number++ ) { NewFruInfo( 0x80 + (carrier_number*2), 0, SAHPI_ENT_SUBBOARD_CARRIER_BLADE, carrier_number, eIpmiAtcaSiteTypeAtcaBoard, dIpmiMcThreadInitialDiscover ); } return SA_OK; } // read all fru addr msg.m_netfn = eIpmiNetfnPicmg; msg.m_cmd = eIpmiCmdGetAddressInfo; msg.m_data[0] = dIpmiPicMgId; msg.m_data[1] = 0; // fru id 0 msg.m_data[2] = 0x03; // physical addr msg.m_data_len = 5; static const char *map[] = { "ATCA Board", "Power Entry Module", "Shelf FRU Information", "Dedicated ShMc", "Fan Tray", "Fan Filter Tray", "Alarm", "AdvancedMC Module", "PMC", "Rear Transition Module", "MicroTCA Carrier Hub", "Power Module" }; static int map_num = sizeof( map ) / sizeof( char * ); for( i = 0; i < 256; i++ ) { if ( !m_atca_site_property[i].m_property ) continue; if ( m_atca_poll_alive_mcs == true ) m_atca_site_property[i].m_property |= dIpmiMcThreadPollAliveMc; if ( i < map_num ) stdlog << "checking for " << map[i] << ".\n"; else stdlog << "checking for " << (unsigned char)i << ".\n"; SaHpiEntityTypeT entity = MapAtcaSiteTypeToEntity( (tIpmiAtcaSiteType)i ); for( int j = 0; j < m_atca_site_property[i].m_max_side_id; j++ ) { msg.m_data[3] = j + 1; msg.m_data[4] = i; rv = m_si_mc->SendCommand( msg, rsp ); if ( rv != SA_OK ) { stdlog << "cannot send get address info: " << rv << " !\n"; break; } if ( rsp.m_data[0] ) break; if ( i < map_num ) stdlog << "\tfound " << map[i] << " at " << rsp.m_data[3] << ".\n"; else stdlog << "\tfound " << (unsigned char)i << " at " << rsp.m_data[3] << ".\n"; // add MC for initial scan (FRU 0) if (rsp.m_data[5] == 0) NewFruInfo( rsp.m_data[3], rsp.m_data[5], entity, j + 1, (tIpmiAtcaSiteType)i, m_atca_site_property[i].m_property ); } } return SA_OK; } cIpmiMc * cIpmiDomain::FindMcByAddr( const cIpmiAddr &addr ) { if ( ( addr.m_type == eIpmiAddrTypeSystemInterface ) && ( addr.m_channel == dIpmiBmcChannel ) ) return m_si_mc; for( int i = 0; i < m_mcs.Num(); i++ ) { cIpmiMc *mc = m_mcs[i]; if ( addr == mc->Addr() ) return mc; } return 0; } SaErrorT cIpmiDomain::SendCommand( const cIpmiAddr &addr, const cIpmiMsg &msg, cIpmiMsg &rsp_msg, int retries ) { if ( m_con == 0 ) { return SA_ERR_HPI_NOT_PRESENT; } return m_con->ExecuteCmd( addr, msg, rsp_msg, retries ); } GList * cIpmiDomain::GetSdrSensors( cIpmiMc *mc ) { if ( mc ) return mc->GetSdrSensors(); return m_sensors_in_main_sdr; } void cIpmiDomain::SetSdrSensors( cIpmiMc *mc, GList *sensors ) { if ( mc ) mc->SetSdrSensors( sensors ); else m_sensors_in_main_sdr = sensors; } cIpmiMc * cIpmiDomain::GetEventRcvr() { for( int i = 0; i < m_mcs.Num(); i++ ) { cIpmiMc *mc = m_mcs[i]; // Event receiver on TCA must be set to the active ShMc if ( IsTca() ) { if ( mc->GetAddress() == dIpmiBmcSlaveAddr ) return mc; } else if ( mc->SelDeviceSupport() ) { return mc; } } return 0; } void cIpmiDomain::HandleEvents( GList *list ) { while( list ) { cIpmiEvent *event = (cIpmiEvent *)list->data; list = g_list_remove( list, event ); HandleEvent( event ); } } void cIpmiDomain::HandleAsyncEvent( const cIpmiAddr &addr, const cIpmiMsg &msg ) { // It came from an MC, so find the MC. cIpmiMc *mc = FindMcByAddr( addr ); if ( !mc ) { stdlog << "cannot find mc for event !\n"; return; } cIpmiEvent *event = new cIpmiEvent; event->m_mc = mc; event->m_record_id = IpmiGetUint16( msg.m_data ); event->m_type = msg.m_data[2]; memcpy( event->m_data, msg.m_data + 3, dIpmiMaxSelData ); // Add it to the MCs event log. mc->Sel()->AddAsyncEvent( event ); HandleEvent( event ); } void cIpmiDomain::HandleEvent( cIpmiEvent *event ) { // find MC thread unsigned char a = event->m_data[4]; bool hotswap = ( event->m_data[7] == eIpmiSensorTypeAtcaHotSwap ) ? true : false; // if there is no MC thread => create MC thread if ( m_mc_thread[a] == 0 ) { int slot = GetFreeSlotForOther( a ); cIpmiFruInfo *fi = NewFruInfo( a, 0, SAHPI_ENT_SYS_MGMNT_MODULE, slot, eIpmiAtcaSiteTypeUnknown, dIpmiMcThreadInitialDiscover | hotswap ? ( dIpmiMcThreadPollAliveMc | dIpmiMcThreadCreateM0) : 0 ); m_mc_thread[a] = new cIpmiMcThread( this, a, fi->Properties() ); m_mc_thread[a]->Start(); } m_mc_thread[a]->AddEvent( event ); } cIpmiResource * cIpmiDomain::VerifyResource( cIpmiResource *res ) { for( int i = 0; i < m_mcs.Num(); i++ ) { cIpmiMc *mc = m_mcs[i]; if ( mc->FindResource( res ) ) return res; } return 0; } cIpmiMc * cIpmiDomain::VerifyMc( cIpmiMc *mc ) { if ( m_si_mc == mc ) return mc; int idx = m_mcs.Find( mc ); if ( idx == -1 ) return 0; return mc; } cIpmiRdr * cIpmiDomain::VerifyRdr( cIpmiRdr *rdr ) { for( int i = 0; i < m_mcs.Num(); i++ ) { cIpmiMc *mc = m_mcs[i]; if ( mc->FindRdr( rdr ) ) return rdr; } return 0; } cIpmiSensor * cIpmiDomain::VerifySensor( cIpmiSensor *s ) { for( int i = 0; i < m_mcs.Num(); i++ ) { cIpmiMc *mc = m_mcs[i]; if ( mc->FindRdr( s ) ) return s; } return 0; } cIpmiControl * cIpmiDomain::VerifyControl( cIpmiControl *c ) { for( int i = 0; i < m_mcs.Num(); i++ ) { cIpmiMc *mc = m_mcs[i]; if ( mc->FindRdr( c ) ) return c; } return 0; } cIpmiWatchdog * cIpmiDomain::VerifyWatchdog ( cIpmiWatchdog *c ) { for( int i = 0; i < m_mcs.Num(); i++ ) { cIpmiMc *mc = m_mcs[i]; if ( mc->FindRdr( c ) ) return c; } return 0; } cIpmiInventory * cIpmiDomain::VerifyInventory( cIpmiInventory *inv ) { for( int i = 0; i < m_mcs.Num(); i++ ) { cIpmiMc *mc = m_mcs[i]; if ( mc->FindRdr( inv ) ) return inv; } return 0; } void cIpmiDomain::Dump( cIpmiLog &dump ) const { if ( dump.IsRecursive() ) { dump << "#include \"Mc.sim\"\n"; dump << "#include \"Entity.sim\"\n"; dump << "#include \"Sensor.sim\"\n"; dump << "#include \"Sdr.sim\"\n"; dump << "#include \"Sel.sim\"\n"; dump << "#include \"Fru.sim\"\n\n\n"; // main sdr if ( m_main_sdrs ) { dump << "// repository SDR\n"; m_main_sdrs->Dump( dump, "MainSdr1" ); } // dump all MCs for( int i = 0; i < 256; i++ ) { if ( m_mc_thread[i] == 0 || m_mc_thread[i]->Mc() == 0 ) continue; cIpmiMc *mc = m_mc_thread[i]->Mc(); char str[80]; snprintf( str, sizeof(str), "Mc%02x", i ); mc->Dump( dump, str ); } } // sim dump.Begin( "Sim", "Dump" ); for( GList *list = GetFruInfoList(); list; list = g_list_next( list ) ) { cIpmiFruInfo *fi = (cIpmiFruInfo *)list->data; const char *site = 0; switch( fi->Site() ) { case eIpmiAtcaSiteTypeAtcaBoard: site = "AtcaBoard"; break; case eIpmiAtcaSiteTypePowerEntryModule: site = "PowerUnit"; break; case eIpmiAtcaSiteTypeShelfFruInformation: site = "ShelfFruInformation"; break; case eIpmiAtcaSiteTypeDedicatedShMc: site = "ShMc"; break; case eIpmiAtcaSiteTypeFanTray: site = "FanTray"; break; case eIpmiAtcaSiteTypeFanFilterTray: site = "FanFilterTray"; break; case eIpmiAtcaSiteTypeAlarm: site = "Alarm"; break; case eIpmiAtcaSiteTypeAdvancedMcModule: site = "AdvancedMcModule"; break; case eIpmiAtcaSiteTypePMC: site = "PMC"; break; case eIpmiAtcaSiteTypeRearTransitionModule: site = "RearTransitionModule"; break; default: site = "Unknown"; break; } dump.Entry( site ) << fi->Slot() << ", " << (unsigned char)fi->Address() << ";\n"; } if ( dump.IsRecursive() ) { dump << "\n"; if ( m_main_sdrs ) dump.Entry( "MainSdr" ) << "MainSdr1\n"; for( int i = 0; i < 256; i++ ) { if ( m_mc_thread[i] == 0 || m_mc_thread[i]->Mc() == 0 ) continue; cIpmiFruInfo *fi = FindFruInfo( i, 0 ); if ( fi == 0 ) { continue; } const char *type = 0; switch( fi->Site() ) { case eIpmiAtcaSiteTypeAtcaBoard: type = "AtcaBoard"; break; case eIpmiAtcaSiteTypePowerEntryModule: type = "PowerUnit"; break; case eIpmiAtcaSiteTypeShelfFruInformation: type = "ShelfFruInformation"; break; case eIpmiAtcaSiteTypeDedicatedShMc: type = "ShMc"; break; case eIpmiAtcaSiteTypeFanTray: type = "FanTray"; break; case eIpmiAtcaSiteTypeFanFilterTray: type = "FanFilterTray"; break; case eIpmiAtcaSiteTypeAlarm: type = "Alarm"; break; case eIpmiAtcaSiteTypeAdvancedMcModule: type = "AdvancedMcModule"; break; case eIpmiAtcaSiteTypePMC: type = "PMC"; break; case eIpmiAtcaSiteTypeRearTransitionModule: type = "RearTransitionModule"; break; default: type = "Unknown"; break; } char str[30]; snprintf( str, sizeof(str), "Mc%02x", i ); dump.Entry( "Mc" ) << str << ", " << type << ", " << fi->Slot() << ";\n"; } } dump.End(); } openhpi-2.14.1/plugins/ipmidirect/ipmi_control_fan.h0000644000076400007640000000326011302567000017471 0ustar /* * ipmi_control_fan.h * * Copyright (c) 2004 by FORCE Computers. * Copyright (c) 2005 by ESO Technologies. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Thomas Kanngieser * Pierre Sangouard */ #ifndef dIpmiControlFan_h #define dIpmiControlFan_h #ifndef dIpmiControl_h #include "ipmi_control.h" #endif #define dIpmiFanLocalControlMode 0xff #define dIpmiFanEmergencyMode 0xfe class cIpmiControlFan : public cIpmiControl { protected: unsigned int m_minimum_speed_level; unsigned int m_maximum_speed_level; unsigned int m_default_speed_level; // support for automatic speed adjustment bool m_local_control_mode; public: cIpmiControlFan( cIpmiMc *mc, unsigned int num, unsigned int minium_speed_level, unsigned int maximum_speed_level, unsigned int default_speed_level, bool local_control_mode ); virtual ~cIpmiControlFan(); // create an RDR sensor record virtual bool CreateRdr( SaHpiRptEntryT &resource, SaHpiRdrT &rdr ); // virtual void Log(); virtual SaErrorT SetState( const SaHpiCtrlModeT &mode, const SaHpiCtrlStateT &state ); virtual SaErrorT GetState( SaHpiCtrlModeT &mode, SaHpiCtrlStateT &state ); virtual void Dump( cIpmiLog &dump, const char *name ) const; }; #endif openhpi-2.14.1/plugins/ipmidirect/ipmi_cmd.h0000644000076400007640000002501711302567000015734 0ustar /* * ipmi_cmd.h * * Interface for IPMI file connection * * Copyright (c) 2003 by FORCE Computers. * Copyright (c) 2005 by ESO Technologies. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Thomas Kanngieser * Pierre Sangouard */ #ifndef dIpmiCmd_h #define dIpmiCmd_h #define dMaxIpmiDataSize 36 // // IPMI commands // enum tIpmiCmd { // Chassis netfn (0x00) eIpmiCmdGetChassisCapabilities = 0x00, eIpmiCmdGetChassisStatus = 0x01, eIpmiCmdChassisControl = 0x02, eIpmiCmdChassisReset = 0x03, eIpmiCmdChassisIdentify = 0x04, eIpmiCmdSetChassisCapabilities = 0x05, eIpmiCmdSetPowerRestorePolicy = 0x06, eIpmiCmdGetSystemRestartCause = 0x07, eIpmiCmdSetSystemBootOptions = 0x08, eIpmiCmdGetSystemBootOptions = 0x09, eIpmiCmdGetPohCounter = 0x0f, // Bridge netfn (0x00) eIpmiCmdGetBridgeState = 0x00, eIpmiCmdSetBridgeState = 0x01, eIpmiCmdGetIcmbAddress = 0x02, eIpmiCmdSetIcmbAddress = 0x03, eIpmiCmdSetBridgeProxyAddress = 0x04, eIpmiCmdGetBridgeStatistics = 0x05, eIpmiCmdGetIcmbCapabilities = 0x06, eIpmiCmdClearBridgeStatistics = 0x08, eIpmiCmdGetBridgeProxyAddress = 0x09, eIpmiCmdGetIcmbConnectorInfo = 0x0a, eIpmiCmdSetIcmbConnectorInfo = 0x0b, eIpmiCmdSendIcmbConnectionId = 0x0c, eIpmiCmdPrepareForDiscovery = 0x10, eIpmiCmdGetAddresses = 0x11, eIpmiCmdSetDiscovered = 0x12, eIpmiCmdGetChassisDeviceId = 0x13, eIpmiCmdSetChassisDeviceId = 0x14, eIpmiCmdBridgeRequest = 0x20, eIpmiCmdBridgeMessage = 0x21, eIpmiCmdGetEventCount = 0x30, eIpmiCmdSetEventdestination = 0x31, eIpmiCmdSetEventReceptionState = 0x32, eIpmiCmdSendIcmbEventMessage = 0x33, eIpmiCmdGetEventDestiation = 0x34, eIpmiCmdGetEventReceptionState = 0x35, eIpmiCmdErrorReport = 0xff, // Sensor/Event netfn (0x04) eIpmiCmdSetEventReceiver = 0x00, eIpmiCmdGetEventReceiver = 0x01, eIpmiCmdPlatformEvent = 0x02, eIpmiCmdGetPefCapabilities = 0x10, eIpmiCmdArmPefPostponeTimer = 0x11, eIpmiCmdSetPefConfigParms = 0x12, eIpmiCmdGetPefConfigParms = 0x13, eIpmiCmdSetLastProcessedEventId = 0x14, eIpmiCmdGetLastProcessedEventId = 0x15, eIpmiCmdAlertImmediate = 0x16, eIpmiCmdPetAcknowledge = 0x17, eIpmiCmdGetDeviceSdrInfo = 0x20, eIpmiCmdGetDeviceSdr = 0x21, eIpmiCmdReserveDeviceSdrRepository = 0x22, eIpmiCmdGetSensorReadingFactors = 0x23, eIpmiCmdSetSensorHysteresis = 0x24, eIpmiCmdGetSensorHysteresis = 0x25, eIpmiCmdSetSensorThreshold = 0x26, eIpmiCmdGetSensorThreshold = 0x27, eIpmiCmdSetSensorEventEnable = 0x28, eIpmiCmdGetSensorEventEnable = 0x29, eIpmiCmdRearmSensorEvents = 0x2a, eIpmiCmdGetSensorEventStatus = 0x2b, eIpmiCmdGetSensorReading = 0x2d, eIpmiCmdSetSensorType = 0x2e, eIpmiCmdGetSensorType = 0x2f, // App netfn (0x06) eIpmiCmdGetDeviceId = 0x01, eIpmiCmdBroadcastGetDeviceId = 0x01, eIpmiCmdColdReset = 0x02, eIpmiCmdWarmReset = 0x03, eIpmiCmdGetSelfTestResults = 0x04, eIpmiCmdManufacturingTestOn = 0x05, eIpmiCmdSetAcpiPowerState = 0x06, eIpmiCmdGetAcpiPowerState = 0x07, eIpmiCmdGetDeviceGuid = 0x08, eIpmiCmdResetWatchdogTimer = 0x22, eIpmiCmdSetWatchdogTimer = 0x24, eIpmiCmdGetWatchdogTimer = 0x25, eIpmiCmdSetBmcGlobalEnables = 0x2e, eIpmiCmdGetBmcGlobalEnables = 0x2f, eIpmiCmdClearMsgFlags = 0x30, eIpmiCmdGetMsgFlags = 0x31, eIpmiCmdEnableMessageChannelRcv = 0x32, eIpmiCmdGetMsg = 0x33, eIpmiCmdSendMsg = 0x34, eIpmiCmdReadEventMsgBuffer = 0x35, eIpmiCmdGetBtInterfaceCapabilities = 0x36, eIpmiCmdGetSystemGuid = 0x37, eIpmiCmdGetChannelAuthCapabilities = 0x38, eIpmiCmdGetSessionChallenge = 0x39, eIpmiCmdActivateSession = 0x3a, eIpmiCmdSetSessionPrivilege = 0x3b, eIpmiCmdCloseSession = 0x3c, eIpmiCmdGetSessionInfo = 0x3d, eIpmiCmdGetAuthcode = 0x3f, eIpmiCmdSetChannelAccess = 0x40, eIpmiCmdGetChannelAccess = 0x41, eIpmiCmdGetChannelInfo = 0x42, eIpmiCmdSetUserAccess = 0x43, eIpmiCmdGetUserAccess = 0x44, eIpmiCmdSetUserName = 0x45, eIpmiCmdGetUserName = 0x46, eIpmiCmdSetUserPassword = 0x47, eIpmiCmdMasterReadWrite = 0x52, // Storage netfn (0x0a) eIpmiCmdGetFruInventoryAreaInfo = 0x10, eIpmiCmdReadFruData = 0x11, eIpmiCmdWriteFruData = 0x12, eIpmiCmdGetSdrRepositoryInfo = 0x20, eIpmiCmdGetSdrRepositoryAllocInfo = 0x21, eIpmiCmdReserveSdrRepository = 0x22, eIpmiCmdGetSdr = 0x23, eIpmiCmdAddSdr = 0x24, eIpmiCmdPartialAddSdr = 0x25, eIpmiCmdDeleteSdr = 0x26, eIpmiCmdClearSdrRepository = 0x27, eIpmiCmdGetSdrRepositoryTime = 0x28, eIpmiCmdSetSdrRepositoryTime = 0x29, eIpmiCmdEnterSdrRepositoryUpdate = 0x2a, eIpmiCmdExitSdrRepositoryUpdate = 0x2b, eIpmiCmdRunInitializationAgent = 0x2c, eIpmiCmdGetSelInfo = 0x40, eIpmiCmdGetSelAllocationInfo = 0x41, eIpmiCmdReserveSel = 0x42, eIpmiCmdGetSelEntry = 0x43, eIpmiCmdAddSelEntry = 0x44, eIpmiCmdPartialAddSelEntry = 0x45, eIpmiCmdDeleteSelEntry = 0x46, eIpmiCmdClearSel = 0x47, eIpmiCmdGetSelTime = 0x48, eIpmiCmdSetSelTime = 0x49, eIpmiCmdGetAuxiliaryLogStatus = 0x5a, eIpmiCmdSetAuxiliaryLogStatus = 0x5b, // Transport netfn (0x0c) eIpmiCmdSetLanConfigParms = 0x01, eIpmiCmdGetLanConfigParms = 0x02, eIpmiCmdSuspendBmcArps = 0x03, eIpmiCmdGetIpUdpRmcpStats = 0x04, eIpmiCmdSetSerialModemConfig = 0x10, eIpmiCmdGetSerialModemConfig = 0x11, eIpmiCmdSetSerialModemMux = 0x12, eIpmiCmdGetTapResponseCodes = 0x13, eIpmiCmdSetPppUdpProxyXmitData = 0x14, eIpmiCmdGetPppUdpProxyXmitData = 0x15, eIpmiCmdSendPppUdpProxyPacket = 0x16, eIpmiCmdGetPppUdpProxyRecvData = 0x17, eIpmiCmdSerialModemConnActive = 0x18, eIpmiCmdCallback = 0x19, eIpmiCmdSetUserCallbackOptions = 0x1a, eIpmiCmdGetUserCallbackOptions = 0x1b, // PICMG netfn (0x2c) eIpmiCmdGetPicMgProperties = 0x00, eIpmiCmdGetAddressInfo = 0x01, eIpmiCmdGetShelfAddressInfo = 0x02, eIpmiCmdSetShelfAddressInfo = 0x03, eIpmiCmdFruControl = 0x04, eIpmiCmdGetFruLedProperties = 0x05, eIpmiCmdGetLedColorCapabilities = 0x06, eIpmiCmdSetFruLedState = 0x07, eIpmiCmdGetFruLedState = 0x08, eIpmiCmdSetIpmbState = 0x09, eIpmiCmdSetFruActivationPolicy = 0x0a, eIpmiCmdGetFruActivationPolicy = 0x0b, eIpmiCmdSetFruActivation = 0x0c, eIpmiCmdGetDeviceLocatorRecordId = 0x0d, eIpmiCmdSetPortState = 0x0e, eIpmiCmdGetPortState = 0x0f, eIpmiCmdComputePowerProperties = 0x10, eIpmiCmdSetPowerLevel = 0x11, eIpmiCmdGetPowerLevel = 0x12, eIpmiCmdRenegotiatePower = 0x13, eIpmiCmdGetFanSpeedProperties = 0x14, eIpmiCmdSetFanLevel = 0x15, eIpmiCmdGetFanLevel = 0x16, eIpmiCmdBusedResource = 0x17, eIpmiCmdGetIpmbLinkInfo = 0x18, }; // PICMG Identifier. Indicates that this is a PICMG-defined // group extension command. #define dIpmiPicMgId 0 #define dIpmiDeactivateFru 0 #define dIpmiActivateFru 1 // // NetFNs // enum tIpmiNetfn { eIpmiNetfnChassis = 0x00, eIpmiNetfnChassisRsp = 0x01, eIpmiNetfnBridge = 0x02, eIpmiNetfnBridgeRsp = 0x03, eIpmiNetfnSensorEvent = 0x04, eIpmiNetfnSensorEventRsp = 0x05, eIpmiNetfnApp = 0x06, eIpmiNetfnAppRsp = 0x07, eIpmiNetfnFirmware = 0x08, eIpmiNetfnFirmwareRsp = 0x09, eIpmiNetfnStorage = 0x0a, eIpmiNetfnStorageRsp = 0x0b, eIpmiNetfnTransport = 0x0c, eIpmiNetfnTransportRsp = 0x0d, eIpmiNetfnPicmg = 0x2c, eIpmiNetfnPicmgRsp = 0x2d, eIpmiNetfnOem = 0x2e, eIpmiNetfnOemRsp = 0x2f }; const char *IpmiNetfnToString( tIpmiNetfn netfn ); // // Completion codes for IPMI. // enum tIpmiCompletionCode { eIpmiCcOk = 0x00, eIpmiCcNodeBusy = 0xC0, eIpmiCcInvalidCmd = 0xC1, eIpmiCcCommandInvalidForLun = 0xC2, eIpmiCcTimeout = 0xC3, eIpmiCcOutOfSpace = 0xC4, eIpmiCcInvalidReservation = 0xC5, eIpmiCcRequestDataTruncated = 0xC6, eIpmiCcRequestDataLengthInvalid = 0xC7, eIpmiCcRequestedDataLengthExceeded = 0xC8, eIpmiCcParameterOutOfRange = 0xC9, eIpmiCcCannotReturnReqLength = 0xCA, eIpmiCcNotPresent = 0xCB, eIpmiCcInvalidDataField = 0xCC, eIpmiCcCommandIllegalForSensor = 0xCD, eIpmiCcCouldNotProvideResponse = 0xCE, eIpmiCcCannotExecDuplicateRequest = 0xCF, eIpmiCcRepositoryInUpdateMode = 0xD0, eIpmiCcDeviceInFirmwareUpdate = 0xD1, eIpmiCcBmcInitInProgress = 0xD2, eIpmiCcDestinationUnavailable = 0xD3, eIpmiCcInsufficientPrivilege = 0xD4, eIpmiCcNotSupportedInPresentState = 0xD5, eIpmiCcUnknownErr = 0xff }; const char *IpmiCompletionCodeToString( tIpmiCompletionCode cc ); const char *IpmiCmdToString( tIpmiNetfn netfn, tIpmiCmd cmd ); #endif openhpi-2.14.1/plugins/ipmidirect/ipmi_rdr.h0000644000076400007640000000404311302567000015754 0ustar /* * ipmi_rdr.h base class for cIpmiSensor, cIpmiControl * * Copyright (c) 2004 by FORCE Computers. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Thomas Kanngieser */ #ifndef dIpmiRdr_h #define dIpmiRdr_h #ifndef dIpmiTextBuffer_h #include "ipmi_text_buffer.h" #endif #include extern "C" { #include "SaHpi.h" } class cIpmiMc; class cIpmiResource; #ifndef dIpmiEntity_h #include "ipmi_entity.h" #endif #ifndef dIpmiMsg_h #include "ipmi_msg.h" #endif class cIpmiDomain; class cIpmiRdr { protected: cIpmiMc *m_mc; cIpmiResource *m_resource; SaHpiEntryIdT m_record_id; SaHpiRdrTypeT m_type; cIpmiTextBuffer m_id_string; unsigned int m_lun; cIpmiEntityPath m_entity_path; public: cIpmiRdr( cIpmiMc *mc, SaHpiRdrTypeT type ); virtual ~cIpmiRdr(); cIpmiMc *Mc() const { return m_mc; } cIpmiResource *&Resource() { return m_resource; } SaHpiEntryIdT &RecordId() { return m_record_id; } SaHpiRdrTypeT Type() const { return m_type; } cIpmiTextBuffer &IdString() { return m_id_string; } const cIpmiTextBuffer &IdString() const { return m_id_string; } cIpmiEntityPath &EntityPath() { return m_entity_path; } cIpmiDomain *Domain(); // create an RDR sensor record virtual bool CreateRdr( SaHpiRptEntryT &resource, SaHpiRdrT &rdr ); // sensor num, control num, fru device id virtual unsigned int Num() const = 0; virtual unsigned int Lun() const { return m_lun; } //virtual void Dump( cIpmiLog &dump ) = 0; SaErrorT SendCommand( const cIpmiMsg &msg, cIpmiMsg &rsp, unsigned int lun = 0, int retries = 3 ); // populate rdrs private: bool m_populate; public: virtual bool Populate(GSList **); }; #endif openhpi-2.14.1/plugins/ipmidirect/ipmi_utils.h0000644000076400007640000000721211302567000016326 0ustar /* * ipmi_utils.cpp * * Copyright (c) 2003 by FORCE Computers * * Note that this file is based on parts of OpenIPMI * written by Corey Minyard * of MontaVista Software. Corey's code was helpful * and many thanks go to him. He gave the permission * to use this code in OpenHPI under BSD license. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Thomas Kanngieser */ #ifndef dIpmiUtils_h #define dIpmiUtils_h #include enum tIpmiFruState { eIpmiFruStateNotInstalled = 0, eIpmiFruStateInactive = 1, eIpmiFruStateActivationRequest = 2, eIpmiFruStateActivationInProgress = 3, eIpmiFruStateActive = 4, eIpmiFruStateDeactivationRequest = 5, eIpmiFruStateDeactivationInProgress = 6, eIpmiFruStateCommunicationLost = 7 }; const char *IpmiFruStateToString( tIpmiFruState state ); unsigned int IpmiGetUint16( const unsigned char *data ); void IpmiSetUint16( unsigned char *data, int val ); unsigned int IpmiGetUint32( const unsigned char *data ); void IpmiSetUint32( unsigned char *data, int val ); #define dDateStringSize 11 void IpmiDateToString( unsigned int time, char *str ); #define dTimeStringSize 9 void IpmiTimeToString( unsigned int time, char *str ); #define dDateTimeStringSize 20 void IpmiDateTimeToString( unsigned int time, char *str ); class cTime { public: timeval m_time; cTime() { m_time.tv_sec = 0; m_time.tv_usec = 0; } cTime( const struct timeval &tv ) { m_time.tv_sec = tv.tv_sec; m_time.tv_usec = tv.tv_usec; } cTime( const cTime &t ) { m_time.tv_sec = t.m_time.tv_sec; m_time.tv_usec = t.m_time.tv_usec; } cTime( unsigned int s, unsigned int u ) { m_time.tv_sec = s; m_time.tv_usec = u; } void Normalize() { while( m_time.tv_usec > 1000000 ) { m_time.tv_usec -= 1000000; m_time.tv_sec++; } while( m_time.tv_usec < 0 ) { m_time.tv_usec += 1000000; m_time.tv_sec--; } } int Cmp( const cTime &t ) { if ( m_time.tv_sec < t.m_time.tv_sec ) return -1; if ( m_time.tv_sec > t.m_time.tv_sec ) return 1; if ( m_time.tv_usec < t.m_time.tv_usec ) return -1; if ( m_time.tv_usec > t.m_time.tv_usec ) return 1; return 0; } bool operator<( const cTime &t ) { return Cmp( t ) < 0; } bool operator<=( const cTime &t ) { return Cmp( t ) < 0; } bool operator>( const cTime &t ) { return Cmp( t ) > 0; } bool operator>=( const cTime &t ) { return Cmp( t ) >= 0; } bool operator==( const cTime &t ) { return Cmp( t ) == 0; } bool operator!=( const cTime &t ) { return Cmp( t ) == 0; } cTime &operator+=( const cTime &t ) { m_time.tv_sec += t.m_time.tv_sec; m_time.tv_usec += t.m_time.tv_usec; Normalize(); return *this; } cTime &operator+=( int ms ) { m_time.tv_sec += ms / 1000; m_time.tv_usec += (ms % 1000) * 1000; Normalize(); return *this; } cTime &operator-=( int ms ) { m_time.tv_sec -= ms / 1000; m_time.tv_usec -= (ms % 1000) * 1000; Normalize(); return *this; } static cTime Now() { cTime t; gettimeofday( &t.m_time, 0 ); return t; } }; #endif openhpi-2.14.1/plugins/ipmidirect/ipmi_mc_vendor_force.cpp0000644000076400007640000001362411302567000020657 0ustar /* * Force specific code * * Copyright (c) 2004 by FORCE Computers. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Thomas Kanngieser */ #include "ipmi_mc_vendor_force.h" #include "ipmi_utils.h" #include "ipmi_log.h" #include "ipmi_mc.h" #include cIpmiMcVendorForceShMc::cIpmiMcVendorForceShMc( unsigned int product_id ) : cIpmiMcVendor( 0x000e48, product_id, "Force ShMc" ) { } cIpmiMcVendorForceShMc::~cIpmiMcVendorForceShMc() { } bool cIpmiMcVendorForceShMc::InitMc( cIpmiMc *mc, const cIpmiMsg &devid ) { stdlog << "Force ShMc found.\n"; // because we are talking to a ShMC and not the ShM, // we need to do some setup: // 1.) set the MC in ShMc mode // 2.) clear repository SDR if ( mc->Addr().IsType( eIpmiAddrTypeSystemInterface ) ) { // we want to go into BMC mode stdlog << "switch to ShMc mode.\n"; cIpmiMsg msg( (tIpmiNetfn)0x30, (tIpmiCmd)0x03 ); msg.m_data[0] = 0; msg.m_data_len = 1; cIpmiMsg rsp; SaErrorT rv = mc->SendCommand( msg, rsp ); if ( rv != SA_OK ) { stdlog << "cannot send set BMC mode: " << rv << " !\n"; return false; } if ( rsp.m_data_len <= 0 || rsp.m_data[0] != eIpmiCcOk ) { stdlog << "cannot go into BMC mode: " << rsp.m_data[0] << " !\n"; return false; } // check if there is a repository SDR if ( devid.m_data[6] & 2 ) { stdlog << "clear repository SDR.\n"; // clear repository SDR // get a reservation msg.m_netfn = eIpmiNetfnStorage; msg.m_cmd = eIpmiCmdReserveSdrRepository; msg.m_data_len = 0; rv = mc->SendCommand( msg, rsp ); if ( rv != SA_OK ) { stdlog << "cannot send reserve reposotory SDR: " << rv << " !\n"; return true; } if ( rsp.m_data_len != 3 || rsp.m_data[0] != eIpmiCcOk ) { stdlog << "cannot reserve repository SDR: " << rsp.m_data[0] << " !\n"; return true; } unsigned short reservation = IpmiGetUint16( rsp.m_data + 1 ); // create repository SDR and wait until erase completed bool first = true; msg.m_netfn = eIpmiNetfnStorage; msg.m_cmd = eIpmiCmdClearSdrRepository; IpmiSetUint16( msg.m_data, reservation ); msg.m_data[2] = 'C'; msg.m_data[3] = 'L'; msg.m_data[4] = 'R'; msg.m_data_len = 6; do { msg.m_data[5] = first ? 0xaa : 0; // initiate erase/ erase status first = false; rv = mc->SendCommand( msg, rsp ); if ( rv != SA_OK ) { stdlog << "cannot send clear SDR reposotory: " << rv << " !\n"; return true; } if ( rsp.m_data_len != 2 || rsp.m_data[0] != eIpmiCcOk ) { stdlog << "cannot reserve repository SDR: " << rsp.m_data[0] << " !\n"; return true; } } // wait until erase is complete while( (rsp.m_data[1] & 0x7) != 0x1 ); } } // this is for debugging only if ( devid.m_data[6] & 4 ) { stdlog << "clear SEL.\n"; // get a reservation cIpmiMsg msg( eIpmiNetfnStorage, eIpmiCmdReserveSel ); msg.m_data_len = 0; cIpmiMsg rsp; SaErrorT rv = mc->SendCommand( msg, rsp ); if ( rv != SA_OK ) { stdlog << "cannot send reserve SEL: " << rv << " !\n"; return true; } if ( rsp.m_data_len != 3 || rsp.m_data[0] != eIpmiCcOk ) { stdlog << "cannot reserve SEL: " << rsp.m_data[0] << " !\n"; return true; } unsigned short reservation = IpmiGetUint16( rsp.m_data + 1 ); // clear SEL msg.m_netfn = eIpmiNetfnStorage; msg.m_cmd = eIpmiCmdClearSel; IpmiSetUint16( msg.m_data, reservation ); msg.m_data[2] = 'C'; msg.m_data[3] = 'L'; msg.m_data[4] = 'R'; msg.m_data_len = 6; bool first = true; do { msg.m_data[5] = first ? 0xaa : 0; // initiate erase/ erase status first = false; rv = mc->SendCommand( msg, rsp ); if ( rv != SA_OK ) { stdlog << "cannot send clear SDR reposotory: " << rv << " !\n"; return true; } if ( rsp.m_data_len != 2 || rsp.m_data[0] != eIpmiCcOk ) { stdlog << "cannot reserve repository SDR: " << rsp.m_data[0] << " !\n"; return true; } } // wait until erase is complete while( (rsp.m_data[1] & 0x7) != 0x1 ); } return true; } bool cIpmiMcVendorForceShMc::ProcessSdr( cIpmiDomain *domain, cIpmiMc *mc, cIpmiSdrs *sdrs ) { if ( mc->GetAddress() != 0x20 ) return true; // fix slave addr of ShMc at 0x20 // create one resource per mcdlr and fdlr for( unsigned int i = 0; i < sdrs->NumSdrs(); i++ ) { cIpmiSdr *sdr = sdrs->Sdr( i ); switch( sdr->m_type ) { case eSdrTypeMcDeviceLocatorRecord: sdr->m_data[5] = 0x20; break; default: break; } } return true; } openhpi-2.14.1/plugins/ipmidirect/ipmi_mc_vendor.cpp0000644000076400007640000007500411302567000017501 0ustar /* * ipmi_mc_vendor.cpp * * Copyright (c) 2004 by FORCE Computers * Copyright (c) 2005-2006 by ESO Technologies. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Thomas Kanngieser * Pierre Sangouard * Andy Cress */ #include extern "C" { #include "SaHpiAtca.h" } #include "ipmi_mc_vendor.h" #include "ipmi_mc_vendor_force.h" #include "ipmi_mc_vendor_intel.h" #include "ipmi_mc_vendor_sun.h" #include "ipmi_mc_vendor_fix_sdr.h" #include "ipmi_domain.h" #include "ipmi_control_fan.h" #include "ipmi_control_atca_led.h" #include "ipmi_watchdog.h" cIpmiMcVendorFactory *cIpmiMcVendorFactory::m_factory = 0; static int use_count = 0; static cThreadLock lock; cIpmiMcVendorFactory::cIpmiMcVendorFactory() : m_mc_vendors( 0 ), m_default( new cIpmiMcVendor( 0, 0, "default MC vendor" ) ) { } cIpmiMcVendorFactory::~cIpmiMcVendorFactory() { while( m_mc_vendors ) { cIpmiMcVendor *mv = (cIpmiMcVendor *)m_mc_vendors->data; m_mc_vendors = g_list_remove( m_mc_vendors, mv ); delete mv; } if ( m_default ) delete m_default; } void cIpmiMcVendorFactory::InitFactory() { lock.Lock(); if ( m_factory == 0 ) { m_factory = new cIpmiMcVendorFactory; // Force ShMC specific stuff m_factory->Register( new cIpmiMcVendorForceShMc( 0x1011 ) ); m_factory->Register( new cIpmiMcVendorForceShMc( 0x1080 ) ); // Intel BMC specific stuff m_factory->Register( new cIpmiMcVendorIntelBmc( 0x000C ) ); m_factory->Register( new cIpmiMcVendorIntelBmc( 0x001B ) ); m_factory->Register( new cIpmiMcVendorIntelBmc( 0x0022 ) ); m_factory->Register( new cIpmiMcVendorIntelBmc( 0x0026 ) ); m_factory->Register( new cIpmiMcVendorIntelBmc( 0x0028 ) ); m_factory->Register( new cIpmiMcVendorIntelBmc( 0x0100 ) ); m_factory->Register( new cIpmiMcVendorIntelBmc( 0x4311 ) ); m_factory->Register( new cIpmiMcVendorIntelBmc( 0x0811 ) ); m_factory->Register( new cIpmiMcVendorIntelBmc( 0x0900 ) ); /*HSC*/ m_factory->Register( new cIpmiMcVendorIntelBmc( 0x0911 ) ); /*HSC*/ m_factory->Register( new cIpmiMcVendorIntelBmc( 0x0A0C ) ); /*HSC*/ // Sun BMC specific stuff m_factory->Register( new cIpmiMcVendorSunBmc( 0x4701 ) ); // Enabling this code will fix badly formed SDR // found on various boards tested with the plugin // It would be much better if vendors fixed those // This is why this code is not enabled by default #ifdef FIX_BAD_SDR for ( int i = 0; mc_patch[i].sdr_patch != NULL; i++ ) { m_factory->Register( new cIpmiMcVendorFixSdr( mc_patch[i].manufacturer_id, mc_patch[i].product_id ) ); } #endif } use_count++; lock.Unlock(); } void cIpmiMcVendorFactory::CleanupFactory() { lock.Lock(); use_count--; assert( use_count >= 0 ); if ( use_count == 0 ) { delete m_factory; m_factory = 0; } lock.Unlock(); } bool cIpmiMcVendorFactory::Register( cIpmiMcVendor *mv ) { if ( Find( mv->m_manufacturer_id, mv->m_product_id ) ) { assert( 0 ); return false; } m_mc_vendors = g_list_append( m_mc_vendors, mv ); return true; } bool cIpmiMcVendorFactory::Unregister( unsigned int manufacturer_id, unsigned int product_id ) { cIpmiMcVendor *mv = Find( manufacturer_id, product_id ); if ( !mv ) return false; m_mc_vendors = g_list_remove( m_mc_vendors, mv ); return true; } cIpmiMcVendor * cIpmiMcVendorFactory::Find( unsigned int manufacturer_id, unsigned int product_id ) { GList *list = m_mc_vendors; while( list ) { cIpmiMcVendor *mv = (cIpmiMcVendor *)list->data; if ( mv->m_manufacturer_id == manufacturer_id && mv->m_product_id == product_id ) return mv; list = g_list_next( list ); } return 0; } cIpmiMcVendor * cIpmiMcVendorFactory::Get( unsigned int manufacturer_id, unsigned int product_id ) { cIpmiMcVendor *mv = Find( manufacturer_id, product_id ); if ( mv ) return mv; return m_default; } SaHpiEntityLocationT cIpmiMcVendor::m_unique_instance = 256; cIpmiMcVendor::cIpmiMcVendor( unsigned int manufacturer_id, unsigned int product_id, const char *desc ) : m_manufacturer_id( manufacturer_id ), m_product_id( product_id ) { strncpy( m_description, desc, sizeof(m_description) - 1 ); m_description[sizeof(m_description) - 1] = 0; } cIpmiMcVendor::~cIpmiMcVendor() { } bool cIpmiMcVendor::InitMc( cIpmiMc * /*mc*/, const cIpmiMsg & /*devid*/ ) { return true; } void cIpmiMcVendor::CleanupMc( cIpmiMc * /*mc*/ ) { } bool cIpmiMcVendor::ProcessSdr( cIpmiDomain * /*domain*/, cIpmiMc * /*mc*/, cIpmiSdrs * /*sdrs*/ ) { return true; } bool cIpmiMcVendor::ProcessFru( cIpmiInventory * /*inv*/, cIpmiMc * /*mc*/, unsigned int /*sa*/, SaHpiEntityTypeT /*type*/) { return true; } bool cIpmiMcVendor::CreateRdrs( cIpmiDomain *domain, cIpmiMc *source_mc, cIpmiSdrs *sdrs ) { if ( CreateResources( domain, source_mc, sdrs ) == false ) return false; if ( CreateSensors( domain, source_mc, sdrs ) == false ) return false; if ( CreateControls( domain, source_mc, sdrs ) == false ) return false; if ( CreateSels( domain, source_mc, sdrs ) == false ) return false; if ( CreateInvs( domain, source_mc, sdrs ) == false ) return false; if ( CreateWatchdogs( domain, source_mc ) == false ) return false; return true; } bool cIpmiMcVendor::CreateResources( cIpmiDomain *domain, cIpmiMc *source_mc, cIpmiSdrs *sdrs ) { assert( source_mc ); bool found = false; // Make sure that there is a mcdlr for( unsigned int i = 0; i < sdrs->NumSdrs(); i++ ) { cIpmiSdr *sdr = sdrs->Sdr( i ); if ( sdr->m_type == eSdrTypeMcDeviceLocatorRecord ) { found = true; break; } } // there must be a mcdlr ! if ( found == false ) { stdlog << "WARNING : MC " << source_mc->GetAddress() << " NO MC Device Locator Record\n"; return false; } // create one resource per mcdlr and fdlr for( unsigned int i = 0; i < sdrs->NumSdrs(); i++ ) { cIpmiSdr *sdr = sdrs->Sdr( i ); cIpmiAddr addr; unsigned int fru_id; if ( sdr->m_type == eSdrTypeMcDeviceLocatorRecord ) { addr.m_slave_addr = sdr->m_data[5]; addr.m_channel = sdr->m_data[6] & 0xf; fru_id = 0; } else if ( sdr->m_type == eSdrTypeFruDeviceLocatorRecord ) { // We care only about logical FRUs if ( (sdr->m_data[7] & 0x80) == 0 ) continue; addr.m_slave_addr = sdr->m_data[5]; addr.m_channel = (sdr->m_data[8] >> 4) & 0xf; fru_id = sdr->m_data[6]; } else continue; stdlog << "CreateResources FRU " << fru_id << "\n"; if ( addr.m_slave_addr != source_mc->GetAddress() ) stdlog << "WARNING : SDR slave address " << addr.m_slave_addr << " NOT equal to MC slave address " << (unsigned char)source_mc->GetAddress() << "\n"; if ( addr.m_channel != source_mc->GetChannel() ) stdlog << "WARNING : SDR channel " << addr.m_channel << " NOT equal to MC channel " << source_mc->GetChannel() << "\n"; if ( FindOrCreateResource( domain, source_mc, fru_id, sdr, sdrs ) == false ) return false; } return true; } cIpmiResource * cIpmiMcVendor::FindResource( cIpmiDomain *domain, cIpmiMc *mc, unsigned int fru_id, SaHpiEntityTypeT type, SaHpiEntityLocationT instance, cIpmiSdrs *sdrs ) { assert( mc ); stdlog << "FindResource mc " << mc->GetAddress() << " FRU " << fru_id << " type " << type << " instance " << instance << "\n"; cIpmiEntityPath ep = CreateEntityPath( domain, mc->GetAddress(), fru_id, type, instance, sdrs ); stdlog << "Looking for resource: " << ep << ".\n"; cIpmiResource *res = mc->FindResource( ep ); return res; } cIpmiResource * cIpmiMcVendor::FindResource( cIpmiDomain *domain, cIpmiMc *mc, unsigned int fru_id, cIpmiSdr *sdr, cIpmiSdrs *sdrs ) { assert( mc ); SaHpiEntityTypeT type = SAHPI_ENT_UNKNOWN; SaHpiEntityLocationT instance = GetUniqueInstance(); if ( sdr ) { if ( sdr->m_type == eSdrTypeMcDeviceLocatorRecord || sdr->m_type == eSdrTypeFruDeviceLocatorRecord ) { type = (SaHpiEntityTypeT)sdr->m_data[12]; instance = (SaHpiEntityLocationT)sdr->m_data[13]; } else if ( sdr->m_type == eSdrTypeFullSensorRecord ) { type = (SaHpiEntityTypeT)sdr->m_data[8]; instance = (SaHpiEntityLocationT)sdr->m_data[9]; } else assert( 0 ); } stdlog << "FindResource mc " << mc->GetAddress() << " FRU " << fru_id << " type " << type << " instance " << instance << "\n"; cIpmiEntityPath ep = CreateEntityPath( domain, mc->GetAddress(), fru_id, type, instance, sdrs ); stdlog << "Looking for resource: " << ep << ".\n"; cIpmiResource *res = mc->FindResource( ep ); return res; } cIpmiResource * cIpmiMcVendor::FindOrCreateResource( cIpmiDomain *domain, cIpmiMc *mc, unsigned int fru_id, cIpmiSdr *sdr, cIpmiSdrs *sdrs ) { assert( mc ); SaHpiEntityTypeT type = SAHPI_ENT_UNKNOWN; SaHpiEntityLocationT instance = GetUniqueInstance(); if ( sdr ) { if ( sdr->m_type == eSdrTypeMcDeviceLocatorRecord || sdr->m_type == eSdrTypeFruDeviceLocatorRecord ) { type = (SaHpiEntityTypeT)sdr->m_data[12]; instance = (SaHpiEntityLocationT)sdr->m_data[13]; } else if ( sdr->m_type == eSdrTypeFullSensorRecord ) { type = (SaHpiEntityTypeT)sdr->m_data[8]; instance = (SaHpiEntityLocationT)sdr->m_data[9]; } else assert( 0 ); } stdlog << "FindOrCreateResource mc " << mc->GetAddress() << " FRU " << fru_id << " type " << type << " instance " << instance << "\n"; cIpmiEntityPath ep = CreateEntityPath( domain, mc->GetAddress(), fru_id, type, instance, sdrs ); stdlog << "Looking for resource: " << ep << ".\n"; cIpmiResource *res = mc->FindResource( ep ); if ( res ) return res; return CreateResource( domain, mc, fru_id, sdr, sdrs ); } cIpmiResource * cIpmiMcVendor::CreateResource( cIpmiDomain *domain, cIpmiMc *mc, unsigned int fru_id, cIpmiSdr *sdr, cIpmiSdrs *sdrs ) { // create a new resource cIpmiResource *res = new cIpmiResource( mc, fru_id ); SaHpiEntityTypeT type = SAHPI_ENT_UNKNOWN; SaHpiEntityLocationT instance = GetUniqueInstance(); if ( sdr ) { if ( sdr->m_type == eSdrTypeMcDeviceLocatorRecord || sdr->m_type == eSdrTypeFruDeviceLocatorRecord ) { type = (SaHpiEntityTypeT)sdr->m_data[12]; instance = (SaHpiEntityLocationT)sdr->m_data[13]; } else if ( sdr->m_type == eSdrTypeFullSensorRecord ) { type = (SaHpiEntityTypeT)sdr->m_data[8]; instance = (SaHpiEntityLocationT)sdr->m_data[9]; } else assert( 0 ); } res->EntityPath() = CreateEntityPath( domain, mc->GetAddress(), fru_id, type, instance, sdrs ); if ( sdr && ( sdr->m_type == eSdrTypeMcDeviceLocatorRecord || sdr->m_type == eSdrTypeFruDeviceLocatorRecord ) ) { stdlog << "Adding FRU " << fru_id << " "; // set mc id string res->ResourceTag().SetIpmi( sdr->m_data + 15 ); res->Oem() = sdr->m_data[14]; res->IsFru() = true; } // create rpt entry stdlog << "adding resource: " << res->EntityPath() << ".\n"; // add res to mc mc->AddResource( res ); return res; } // TODO: // Handling of entity association records. // This is the reason for the parameter sdrs. cIpmiEntityPath cIpmiMcVendor::CreateEntityPath( cIpmiDomain *domain, unsigned int mc_addr, unsigned int fru_id, SaHpiEntityTypeT type, SaHpiEntityLocationT instance, cIpmiSdrs * /*sdrs*/ ) { // find fru info cIpmiFruInfo *fi = domain->FindFruInfo( mc_addr, fru_id ); if ( ( fi == NULL ) && ( fru_id != 0) ) { fi = domain->NewFruInfo( mc_addr, fru_id ); } cIpmiEntityPath bottom; // clear bit 7 instance &= 0x7f; if ( instance >= 0x60 ) instance -= 0x60; switch (type) { default: break; case eIpmiEntityIdPicMgFrontBoard: type = SaHpiEntityTypeT(ATCAHPI_ENT_PICMG_FRONT_BLADE); break; case eIpmiEntityIdPicMgRearTransitionModule: type = SAHPI_ENT_BACK_PANEL_BOARD; break; case eIpmiEntityIdPicMgAdvancedMcModule: type = SaHpiEntityTypeT(ATCAHPI_ENT_AMC); break; case eIpmiEntityIdPicMgMicroTcaCarrierHub: type = SAHPI_ENT_SWITCH_BLADE; break; case eIpmiEntityIdPicmgShelfManager: type = SAHPI_ENT_SHELF_MANAGER; break; case eIpmiEntityIdPicmgFiltrationUnit: type = SaHpiEntityTypeT(ATCAHPI_ENT_FILTRATION_UNIT); break; case eIpmiEntityIdPicmgShelfFruInformation: type = SaHpiEntityTypeT(ATCAHPI_ENT_SHELF_FRU_DEVICE); break; case eIpmiEntityIdPicmgAlarmPanel: type = SAHPI_ENT_ALARM_MANAGER; break; } bottom.SetEntry( 0, type, instance ); bottom.AppendRoot( 1 ); cIpmiEntityPath top = domain->EntityRoot(); if ( fi ) return fi->CreateEntityPath( top, bottom ); // fru info not found => use default entity path cIpmiEntityPath ep = bottom; ep += top; return ep; } static cIpmiSensor * FindSensor( GList *list, unsigned int num, unsigned char lun ) { for( ; list; list = g_list_next( list ) ) { cIpmiSensor *sensor = (cIpmiSensor *)list->data; if ( sensor->Num() == num && sensor->Lun() == lun ) return sensor; } return 0; } bool cIpmiMcVendor::CreateSensors( cIpmiDomain *domain, cIpmiMc *source_mc, cIpmiSdrs *sdrs ) { GList *old_sensors = domain->GetSdrSensors( source_mc ); GList *new_sensors = 0; GList *sensors = GetSensorsFromSdrs( domain, source_mc, sdrs ); unsigned int parent_fru_id; SaHpiEntityTypeT type, parent_type; SaHpiEntityLocationT instance, parent_instance; while( sensors ) { cIpmiSensor *sensor = (cIpmiSensor *)sensors->data; sensors = g_list_remove( sensors, sensor ); cIpmiSensor *old_sensor = FindSensor( old_sensors, sensor->Num(), sensor->Lun() ); if ( old_sensor && sensor->Cmp( *old_sensor ) ) { // sensor already there, use old one delete sensor; old_sensor->HandleNew( domain ); old_sensors = g_list_remove( old_sensors, old_sensor ); new_sensors = g_list_append( new_sensors, old_sensor ); continue; } if ( old_sensor ) { // remove the old sensor old_sensors = g_list_remove( old_sensors, old_sensor ); old_sensor->Resource()->RemRdr( old_sensor ); delete old_sensor; } // check if the sensor is defined twice if ( FindSensor( new_sensors, sensor->Num(), sensor->Lun() ) ) { stdlog << "sensor " << sensor->IdString() << " defined twice in SDR !\n"; delete sensor; continue; } cIpmiSdr *sdr = sensor->GetSdr(); if ( sdr == 0 ) { sdr = sdrs->FindSdr( sensor->Mc() ); if (!sdr) { delete sensor; continue; } } type = (SaHpiEntityTypeT)sdr->m_data[8]; instance = (SaHpiEntityLocationT)sdr->m_data[9]; parent_fru_id = sdrs->FindParentFru( type, instance, parent_type, parent_instance ); cIpmiResource *res = FindResource( domain, sensor->Mc(), parent_fru_id, parent_type, parent_instance, sdrs ); if (!res ) { delete sensor; continue; } new_sensors = g_list_append( new_sensors, sensor ); sensor->HandleNew( domain ); res->AddRdr( sensor ); } // destry old sensors while( old_sensors ) { cIpmiSensor *sensor = (cIpmiSensor *)old_sensors->data; old_sensors = g_list_remove( old_sensors, sensor ); sensor->Resource()->RemRdr( sensor ); delete sensor; } // set new sdr sensors domain->SetSdrSensors( source_mc, new_sensors ); return true; } GList * cIpmiMcVendor::GetSensorsFromSdrs( cIpmiDomain *domain, cIpmiMc *source_mc, cIpmiSdrs *sdrs ) { GList *sensors = 0; // create a list of full sensor records for( unsigned int i = 0; i < sdrs->NumSdrs(); i++ ) { cIpmiSdr *sdr = sdrs->Sdr( i ); if ( sdr->m_type != eSdrTypeFullSensorRecord ) continue; GList *l = CreateSensorFromFullSensorRecord( domain, source_mc, sdr, sdrs ); if ( l ) sensors = g_list_concat( sensors, l ); } return sensors; } GList * cIpmiMcVendor::CreateSensorFromFullSensorRecord( cIpmiDomain *domain, cIpmiMc *source_mc, cIpmiSdr *sdr, cIpmiSdrs *sdrs ) { GList *list = 0; tIpmiSensorType sensor_type = (tIpmiSensorType)sdr->m_data[12]; if ( sensor_type == eIpmiSensorTypeAtcaHotSwap ) list = CreateSensorHotswap( domain, source_mc, sdr, sdrs ); else { tIpmiEventReadingType reading_type = (tIpmiEventReadingType)sdr->m_data[13]; if ( reading_type == eIpmiEventReadingTypeThreshold ) list = CreateSensorThreshold( domain, source_mc, sdr, sdrs ); else list = CreateSensorDefault( domain, source_mc, sdr, sdrs ); } for( GList *l = list; l; l = g_list_next( l ) ) { cIpmiSensor *s = (cIpmiSensor *)l->data; if ( s->GetSdr() == 0 ) s->SetSdr( sdr ); } return list; } GList * cIpmiMcVendor::CreateSensorHotswap( cIpmiDomain *domain, cIpmiMc *source_mc, cIpmiSdr *sdr, cIpmiSdrs *sdrs ) { cIpmiMc *mc = source_mc; // FindMcBySdr( domain, sdr ); assert( mc ); cIpmiSensorHotswap *hs = new cIpmiSensorHotswap( mc ); hs->SourceMc() = source_mc; if ( !hs->GetDataFromSdr( mc, sdr ) ) { delete hs; return 0; } CreateSensorEntityPath( domain, hs, source_mc, sdr, sdrs ); return g_list_append( 0, hs ); } GList * cIpmiMcVendor::CreateSensorThreshold( cIpmiDomain *domain, cIpmiMc *source_mc, cIpmiSdr *sdr, cIpmiSdrs *sdrs ) { cIpmiMc *mc = source_mc; // FindMcBySdr( domain, sdr ); assert( mc ); cIpmiSensorThreshold *ts = new cIpmiSensorThreshold( mc ); ts->SourceMc() = source_mc; if ( !ts->GetDataFromSdr( mc, sdr ) ) { delete ts; return 0; } CreateSensorEntityPath( domain, ts, source_mc, sdr, sdrs ); return g_list_append( 0, ts ); } GList * cIpmiMcVendor::CreateSensorDiscrete( cIpmiDomain *domain, cIpmiMc *source_mc, cIpmiSdr *sdr, cIpmiSdrs *sdrs ) { cIpmiMc *mc = source_mc; //FindMcBySdr( domain, sdr ); assert( mc ); cIpmiSensorDiscrete *ds = new cIpmiSensorDiscrete( mc ); ds->SourceMc() = source_mc; if ( !ds->GetDataFromSdr( mc, sdr ) ) { delete ds; return 0; } CreateSensorEntityPath( domain, ds, source_mc, sdr, sdrs ); return g_list_append( 0, ds ); } GList * cIpmiMcVendor::CreateSensorDefault( cIpmiDomain *domain, cIpmiMc *source_mc, cIpmiSdr *sdr, cIpmiSdrs *sdrs ) { return CreateSensorDiscrete( domain, source_mc, sdr, sdrs ); } void cIpmiMcVendor::CreateSensorEntityPath( cIpmiDomain *domain, cIpmiSensor *s, cIpmiMc *source_mc, cIpmiSdr *sdr, cIpmiSdrs *sdrs ) { SaHpiEntityTypeT type, parent_type; SaHpiEntityLocationT instance, parent_instance; unsigned int parent_fru_id; if ( sdr ) { type = (SaHpiEntityTypeT)sdr->m_data[8]; instance = (SaHpiEntityLocationT)sdr->m_data[9]; } else { type = SAHPI_ENT_UNKNOWN; instance = GetUniqueInstance(); } parent_fru_id = sdrs->FindParentFru( type, instance, parent_type, parent_instance ); stdlog << "CreateSensorEntityPath mc " << source_mc->GetAddress() << " FRU " << parent_fru_id << " type " << type << " instance " << instance << "\n"; cIpmiEntityPath parent_ep = CreateEntityPath( domain, source_mc->GetAddress(), parent_fru_id, parent_type, parent_instance, sdrs ); if ((type != parent_type) || (instance != parent_instance)) { // clear bit 7 instance &= 0x7f; if ( instance >= 0x60 ) instance -= 0x60; cIpmiEntityPath child_ep; child_ep.SetEntry( 0, type, instance ); child_ep.AppendRoot( 1 ); child_ep += parent_ep; s->EntityPath() = child_ep; } else { s->EntityPath() = parent_ep; } } cIpmiMc * cIpmiMcVendor::FindMcBySdr( cIpmiDomain *domain, cIpmiSdr *sdr ) { switch( sdr->m_type ) { case eSdrTypeCompactSensorRecord: case eSdrTypeFullSensorRecord: case eSdrTypeMcDeviceLocatorRecord: case eSdrTypeFruDeviceLocatorRecord: { cIpmiAddr addr( eIpmiAddrTypeIpmb, 0, 0, sdr->m_data[5] ); return domain->FindMcByAddr( addr ); } default: break; } return 0; } bool cIpmiMcVendor::CreateControls( cIpmiDomain *domain, cIpmiMc *source_mc, cIpmiSdrs *sdrs ) { // controls only for device SDR if ( source_mc == 0 ) return true; if ( source_mc->IsTcaMc() ) { return CreateControlsAtca( domain, source_mc, sdrs ); } return true; } bool cIpmiMcVendor::CreateWatchdogs( cIpmiDomain *domain, cIpmiMc *mc ) { cIpmiResource *res; for ( int i = 0; i < mc->NumResources(); i++ ) { res = mc->GetResource ( i ); if ( res == 0 ) continue; stdlog << "CreateWatchdogs: addr " << mc->GetAddress() << " FruId " << res->FruId() << "\n"; if (res->FruId() == 0) { cIpmiMsg msg( eIpmiNetfnApp, eIpmiCmdGetWatchdogTimer ); cIpmiMsg rsp; if (mc->IsRmsBoard() && res->EntityPath().GetEntryType(0) != SAHPI_ENT_SYSTEM_BOARD) continue; /* Do an IPMI GetWatchdogTimer command to verify this feature. */ msg.m_data_len = 0; SaErrorT rv = res->SendCommand( msg, rsp ); if (rv != 0 || rsp.m_data[0] != 0) { stdlog << "CreateWatchdogs: IPMI error " << rv << " ccode " << rsp.m_data[0] << "\n"; continue; } /* Everything is valid, create the Watchdog RDR */ stdlog << "CreateWatchdogs Resource type " << res->EntityPath().GetEntryType(0) << " instance " << res->EntityPath().GetEntryInstance(0) << "\n"; cIpmiRdr *wd = new cIpmiWatchdog::cIpmiWatchdog( mc, SAHPI_DEFAULT_WATCHDOG_NUM, 0 ); wd->EntityPath() = res->EntityPath(); wd->IdString().SetAscii( "Watchdog", SAHPI_TL_TYPE_TEXT, SAHPI_LANG_ENGLISH ); res->AddRdr( wd ); } } return true; } bool cIpmiMcVendor::CreateControlsAtca( cIpmiDomain *domain, cIpmiMc *mc, cIpmiSdrs *sdrs ) { cIpmiResource *res; for ( int i = 0; i < mc->NumResources(); i++ ) { res = mc->GetResource ( i ); if ( res == 0 ) continue; if ( res->IsFru() ) { stdlog << "CreateControlsAtca Resource type " << res->EntityPath().GetEntryType(0) << " instance " << res->EntityPath().GetEntryInstance(0) << " FRU " << res->FruId() << "\n"; CreateControlAtcaLed( domain, res, sdrs ); CreateControlAtcaFan( domain, res, sdrs ); } } return true; } bool cIpmiMcVendor::CreateControlAtcaLed( cIpmiDomain *domain, cIpmiResource *res, cIpmiSdrs *sdrs ) { cIpmiMsg msg( eIpmiNetfnPicmg, eIpmiCmdGetFruLedProperties ); msg.m_data[0] = dIpmiPicMgId; msg.m_data[1] = res->FruId(); msg.m_data_len = 2; cIpmiMsg rsp; SaErrorT rv = res->SendCommand( msg, rsp ); if ( rv != SA_OK || rsp.m_data_len < 4 || rsp.m_data[0] != eIpmiCcOk || rsp.m_data[1] != dIpmiPicMgId ) { stdlog << "cannot get FRU Led properties !\n"; return true; } unsigned char num_app_leds = rsp.m_data[3]; if ( num_app_leds > 0xFB ) num_app_leds = 0; for (int i = 0; i <= (3+num_app_leds); i++) { if ( ( i <= 3 ) && ( rsp.m_data[2] & (1<FruId(); ledmsg.m_data[2] = i; ledmsg.m_data_len = 3; cIpmiMsg ledrsp; rv = res->SendCommand( ledmsg, ledrsp ); if ( rv != SA_OK || ledrsp.m_data_len < 5 || ledrsp.m_data[0] != eIpmiCcOk || ledrsp.m_data[1] != dIpmiPicMgId ) { stdlog << "cannot get Led color capabilities !\n"; continue; } unsigned char led_color_capabilities = ledrsp.m_data[2] & 0x7E; unsigned char led_default_local_color = ledrsp.m_data[3]; unsigned char led_default_override_color = ledrsp.m_data[4]; ledmsg.m_cmd = eIpmiCmdGetFruLedState; rv = res->SendCommand( ledmsg, ledrsp ); if ( rv != SA_OK || ledrsp.m_data_len < 6 || ledrsp.m_data[0] != eIpmiCcOk || ledrsp.m_data[1] != dIpmiPicMgId ) { continue; } if ( (ledrsp.m_data[2] & 0x01) == 0 ) led_default_local_color = 0; cIpmiControlAtcaLed *l = new cIpmiControlAtcaLed( res->Mc(), ATCAHPI_CTRL_NUM_BLUE_LED+i, led_color_capabilities, led_default_local_color, led_default_override_color ); l->EntityPath() = res->EntityPath(); char ledname[32]; if (i == 0) snprintf (ledname, sizeof(ledname), "Blue LED"); else snprintf (ledname, sizeof(ledname), "LED %d", i); l->IdString().SetAscii( ledname, SAHPI_TL_TYPE_TEXT, SAHPI_LANG_ENGLISH ); res->AddRdr( l ); } return true; } bool cIpmiMcVendor::CreateControlAtcaFan( cIpmiDomain *domain, cIpmiResource *res, cIpmiSdrs *sdrs ) { cIpmiMsg msg( eIpmiNetfnPicmg, eIpmiCmdGetFanSpeedProperties ); msg.m_data[0] = dIpmiPicMgId; msg.m_data[1] = res->FruId(); msg.m_data_len = 2; cIpmiMsg rsp; SaErrorT rv = res->SendCommand( msg, rsp ); if ( rv != SA_OK || rsp.m_data_len < 6 || rsp.m_data[0] != eIpmiCcOk || rsp.m_data[1] != dIpmiPicMgId ) { stdlog << "cannot get fan speed properties !\n"; return true; } unsigned int min = rsp.m_data[2]; unsigned int max = rsp.m_data[3]; unsigned int def = rsp.m_data[4]; bool auto_adj = rsp.m_data[5] & 0x80; cIpmiControlFan *f = new cIpmiControlFan( res->Mc(), ATCAHPI_CTRL_NUM_FAN_SPEED, min, max, def, auto_adj ); f->EntityPath() = res->EntityPath(); f->IdString().SetAscii( "Fan Control", SAHPI_TL_TYPE_TEXT, SAHPI_LANG_ENGLISH ); res->AddRdr( f ); return true; } bool cIpmiMcVendor::CreateInvs( cIpmiDomain *domain, cIpmiMc *source_mc, cIpmiSdrs *sdrs ) { for( unsigned int i = 0; i < sdrs->NumSdrs(); i++ ) { cIpmiSdr *sdr = sdrs->Sdr( i ); if ( sdr->m_type == eSdrTypeMcDeviceLocatorRecord ) { if ( (sdr->m_data[8] & 8) == 0 ) continue; } else if ( sdr->m_type != eSdrTypeFruDeviceLocatorRecord ) continue; if ( CreateInv( domain, source_mc, sdr, sdrs ) == false ) return false; } return true; } bool cIpmiMcVendor::CreateInv( cIpmiDomain *domain, cIpmiMc *mc, cIpmiSdr *sdr, cIpmiSdrs *sdrs ) { unsigned int fru_id; unsigned int lun; unsigned int sa = mc->GetAddress(); SaHpiEntityTypeT type; if ( sdr->m_type == eSdrTypeMcDeviceLocatorRecord ) { fru_id = 0; lun = 0; sa = sdr->m_data[5]; type = (SaHpiEntityTypeT)sdr->m_data[12]; } else { fru_id = sdr->m_data[6]; lun = (sdr->m_data[7] >> 3) & 3; type = SAHPI_ENT_UNKNOWN; } cIpmiMc *m = mc; assert( m ); cIpmiResource *res = FindResource( domain, m, fru_id, sdr, sdrs ); if ( !res ) return true; cIpmiInventory *inv = (cIpmiInventory *)res->FindRdr( m, SAHPI_INVENTORY_RDR, fru_id ); bool need_add = false; if ( inv == 0 ) { inv = new cIpmiInventory( m, fru_id ); inv->IdString().SetIpmi( sdr->m_data + 15 ); inv->Oem() = sdr->m_data[14]; inv->Resource() = res; ProcessFru(inv, m, sa, type); need_add = true; } SaErrorT rv = inv->Fetch(); if ( rv != SA_OK ) { if ( need_add ) delete inv; // Ignore FRU errors return true; } inv->EntityPath() = res->EntityPath(); if ( !need_add ) return true; res->AddRdr( inv ); return true; } bool cIpmiMcVendor::CreateSels( cIpmiDomain *domain, cIpmiMc *source_mc, cIpmiSdrs *sdrs ) { if ( source_mc == 0 ) return false; if ( !source_mc->SelDeviceSupport() ) return true; cIpmiSdr *mcdlr = sdrs->FindSdr( source_mc ); if ( mcdlr == 0 ) return true; cIpmiResource *res = FindResource( domain, source_mc, 0, mcdlr, sdrs ); if ( !res ) return true; // create hpi sel stdlog << "adding SEL " << res->EntityPath() << "\n"; // sel capabilities res->m_sel = true; return true; } openhpi-2.14.1/plugins/ipmidirect/ipmi_mc_vendor_sun.h0000644000076400007640000000156411302567000020033 0ustar /* * Copyright (c) 2009 by Sun Microsystems, Inc. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Chris Rinaldo */ #ifndef dIpmiMcVendorSun_h #define dIpmiMcVendorSun_h #include "ipmi_control.h" #include "ipmi_mc.h" #include "ipmi_mc_vendor.h" class cIpmiMcVendorSunBmc : public cIpmiMcVendor { public: cIpmiMcVendorSunBmc(unsigned int product_id); virtual ~cIpmiMcVendorSunBmc(); virtual bool InitMc(cIpmiMc *mc, const cIpmiMsg &devid); bool CreateControls(cIpmiDomain *domain, cIpmiMc *mc, cIpmiSdrs *sdrs); }; #endif openhpi-2.14.1/plugins/ipmidirect/ipmi_text_buffer.h0000644000076400007640000000471611302567000017511 0ustar /* * ipmi_text_buffer.h * * Copyright (c) 2003 by FORCE Computers * Copyright (c) 2005 by ESO Technologies. * * Note that this file is based on parts of OpenIPMI * written by Corey Minyard * of MontaVista Software. Corey's code was helpful * and many thanks go to him. He gave the permission * to use this code in OpenHPI under BSD license. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Thomas Kanngieser * Pierre Sangouard */ #ifndef dIpmiTextBuffer_h #define dIpmiTextBuffer_h #ifndef dIpmiLog_h #include "ipmi_log.h" #endif extern "C" { #include "SaHpi.h" } // wrapper class for SaHpiTextBufferT class cIpmiTextBuffer { protected: int BinaryToAscii( char *buffer, unsigned int len ) const; int BcdPlusToAscii( char *buffer, unsigned int len ) const; int Ascii6ToAscii( char *buffer, unsigned int len ) const; int LanguageToAscii( char *buffer, unsigned int len ) const; int AsciiToBcdPlus ( const char *input ); int AsciiToAscii6 ( const char *input ); int AsciiToLanguage( const char *input ); SaHpiTextBufferT m_buffer; public: cIpmiTextBuffer(); cIpmiTextBuffer( const char *string, SaHpiTextTypeT type, SaHpiLanguageT l = SAHPI_LANG_ENGLISH ); cIpmiTextBuffer( const unsigned char *data, SaHpiLanguageT l = SAHPI_LANG_ENGLISH ); cIpmiTextBuffer( const SaHpiTextBufferT &buf ); void Clear(); operator SaHpiTextBufferT () const { return m_buffer; } SaHpiUint8T DataLength() const { return m_buffer.DataLength; } const unsigned char *SetIpmi( const unsigned char *data, bool is_fru = false, SaHpiLanguageT l = SAHPI_LANG_ENGLISH ); SaHpiTextTypeT CheckAscii( const char *s ); // convert ascii string to text buffer bool SetAscii( const char *string, SaHpiTextTypeT type, SaHpiLanguageT l = SAHPI_LANG_ENGLISH ); // returns length of string or -1 on error int GetAscii( char *buffer, unsigned int len ) const; bool operator==( const cIpmiTextBuffer &tb ) const; bool operator!=( const cIpmiTextBuffer &tb ) const; }; cIpmiLog &operator<<( cIpmiLog &dump, const cIpmiTextBuffer &tb ); #endif openhpi-2.14.1/plugins/ipmidirect/ipmi_sensor_hotswap.cpp0000644000076400007640000002227111302567000020601 0ustar /* * ipmi_sensor_hotswap.cpp * * Copyright (c) 2004 by FORCE Computers * Copyright (c) 2005 by ESO Technologies. * * Note that this file is based on parts of OpenIPMI * written by Corey Minyard * of MontaVista Software. Corey's code was helpful * and many thanks go to him. He gave the permission * to use this code in OpenHPI under BSD license. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Thomas Kanngieser * Pierre Sangouard */ #include "ipmi_sensor_hotswap.h" #include "ipmi_domain.h" #include #include #include #include #include #include #include cIpmiSensorHotswap::cIpmiSensorHotswap( cIpmiMc *mc ) : cIpmiSensorDiscrete( mc ) { } cIpmiSensorHotswap::~cIpmiSensorHotswap() { } bool cIpmiSensorHotswap::GetDataFromSdr( cIpmiMc *mc, cIpmiSdr *sdr ) { if ( !cIpmiSensorDiscrete::GetDataFromSdr( mc, sdr ) ) return false; return true; } bool cIpmiSensorHotswap::CreateRdr( SaHpiRptEntryT &resource, SaHpiRdrT &rdr ) { if ( cIpmiSensorDiscrete::CreateRdr( resource, rdr ) == false ) return false; cIpmiResource *res = Resource(); if( !res ) return false; if (EntityPath() == res->EntityPath()) { // update resource capabilities resource.ResourceCapabilities |= SAHPI_CAPABILITY_MANAGED_HOTSWAP; resource.HotSwapCapabilities |= SAHPI_HS_CAPABILITY_INDICATOR_SUPPORTED; } return true; } SaHpiHsStateT cIpmiSensorHotswap::ConvertIpmiToHpiHotswapState( tIpmiFruState h ) { switch( h ) { case eIpmiFruStateNotInstalled: return SAHPI_HS_STATE_NOT_PRESENT; case eIpmiFruStateInactive: return SAHPI_HS_STATE_INACTIVE; case eIpmiFruStateActivationRequest: return SAHPI_HS_STATE_INSERTION_PENDING; case eIpmiFruStateActivationInProgress: return SAHPI_HS_STATE_INSERTION_PENDING; case eIpmiFruStateActive: return SAHPI_HS_STATE_ACTIVE; case eIpmiFruStateDeactivationRequest: return SAHPI_HS_STATE_EXTRACTION_PENDING; case eIpmiFruStateDeactivationInProgress: return SAHPI_HS_STATE_EXTRACTION_PENDING; case eIpmiFruStateCommunicationLost: default: return SAHPI_HS_STATE_NOT_PRESENT; } } void cIpmiSensorHotswap::HandleEvent( cIpmiEvent *event ) { cIpmiResource *res = Resource(); if( !res ) { stdlog << "cIpmiSensorHotswap::HandleEvent: No resource !\n"; return; } tIpmiFruState state = (tIpmiFruState)(event->m_data[10] & 0x07); tIpmiFruState previous_state = (tIpmiFruState)(event->m_data[11] & 0x07); switch (state) { case eIpmiFruStateActivationInProgress: if (previous_state == eIpmiFruStateActivationRequest) { stdlog << "cIpmiSensorHotswap::HandleEvent: M2->M3 ignore\n"; res->PreviousPrevFruState() = previous_state; return; } break; case eIpmiFruStateDeactivationInProgress: if (previous_state == eIpmiFruStateDeactivationRequest) { stdlog << "cIpmiSensorHotswap::HandleEvent: M5->M6 ignore\n"; res->PreviousPrevFruState() = previous_state; return; } if (previous_state == eIpmiFruStateActivationInProgress) { stdlog << "cIpmiSensorHotswap::HandleEvent: M3->M6 ignore\n"; res->PreviousPrevFruState() = previous_state; return; } break; default: break; } oh_event *e = (oh_event *)g_malloc0( sizeof( struct oh_event ) ); SaHpiRptEntryT *rptentry = oh_get_resource_by_id( res->Domain()->GetHandler()->rptcache, res->m_resource_id ); if ( rptentry ) e->resource = *rptentry; else e->resource.ResourceCapabilities = 0; // hpi event SaHpiEventT &h = e->event; h.Source = res->m_resource_id; h.EventType = SAHPI_ET_HOTSWAP; // Default severity h.Severity = SAHPI_INFORMATIONAL; // Hot swap events must be dated here otherwise // hot swap policy won't work properly ! oh_gettimeofday(&h.Timestamp); SaHpiHotSwapEventT &he = h.EventDataUnion.HotSwapEvent; he.HotSwapState = ConvertIpmiToHpiHotswapState( state ); he.PreviousHotSwapState = ConvertIpmiToHpiHotswapState( previous_state ); switch (state) { case eIpmiFruStateNotInstalled: if (previous_state == eIpmiFruStateCommunicationLost) { he.PreviousHotSwapState = ConvertIpmiToHpiHotswapState( res->PreviousPrevFruState() ); } else if (previous_state != eIpmiFruStateInactive) { // get severity from plugin cache if ( rptentry ) h.Severity = rptentry->ResourceSeverity; } break; case eIpmiFruStateCommunicationLost: h.EventType = SAHPI_ET_RESOURCE; h.EventDataUnion.ResourceEvent.ResourceEventType = SAHPI_RESE_RESOURCE_FAILURE; stdlog << "cIpmiSensorHotswap::HandleEvent SAHPI_RESE_RESOURCE_FAILURE Event resource " << res->m_resource_id << "\n"; if ( rptentry ) { rptentry->ResourceFailed = SAHPI_TRUE; oh_add_resource(res->Domain()->GetHandler()->rptcache, rptentry, res, 1); h.Severity = rptentry->ResourceSeverity; } break; case eIpmiFruStateInactive: // M3->M6->M1 special case if ((previous_state == eIpmiFruStateDeactivationInProgress) && (res->PreviousPrevFruState() == eIpmiFruStateActivationInProgress)) { he.PreviousHotSwapState = SAHPI_HS_STATE_INSERTION_PENDING; if ( rptentry ) { h.Severity = rptentry->ResourceSeverity; } } default: if (previous_state == eIpmiFruStateCommunicationLost) { h.EventType = SAHPI_ET_RESOURCE; h.EventDataUnion.ResourceEvent.ResourceEventType = SAHPI_RESE_RESOURCE_RESTORED; stdlog << "cIpmiSensorHotswap::HandleEvent SAHPI_RESE_RESOURCE_RESTORED Event resource " << res->m_resource_id << "\n"; if ( rptentry ) { rptentry->ResourceFailed = SAHPI_FALSE; oh_add_resource(res->Domain()->GetHandler()->rptcache, rptentry, res, 1); h.Severity = rptentry->ResourceSeverity; } } break; } res->PreviousPrevFruState() = previous_state; if (h.EventType == SAHPI_ET_HOTSWAP) stdlog << "cIpmiSensorHotswap::HandleEvent SAHPI_ET_HOTSWAP Event resource " << res->m_resource_id << "\n"; m_mc->Domain()->AddHpiEvent( e ); if (h.EventType != SAHPI_ET_HOTSWAP) return; oh_event *oem_e = (oh_event *)g_malloc0( sizeof( struct oh_event ) ); if ( rptentry ) oem_e->resource = *rptentry; else oem_e->resource.ResourceCapabilities = 0; // hpi event SaHpiEventT &oem_h = oem_e->event; oem_h.Source = h.Source; oem_h.Timestamp = h.Timestamp; oem_h.EventType = SAHPI_ET_OEM; oem_h.Severity = SAHPI_INFORMATIONAL; SaHpiOemEventT &oem_he = oem_h.EventDataUnion.OemEvent; oem_he.MId = ATCAHPI_PICMG_MID; oem_he.OemEventData.DataType = SAHPI_TL_TYPE_TEXT; oem_he.OemEventData.Language = SAHPI_LANG_UNDEF; oem_he.OemEventData.DataLength = 3; oem_he.OemEventData.Data[0] = he.HotSwapState; oem_he.OemEventData.Data[1] = he.PreviousHotSwapState; switch ((event->m_data[11] >> 4) & 0x0F) { case 0x0: case 0x1: oem_he.OemEventData.Data[2] = 0; break; case 0x3: oem_he.OemEventData.Data[2] = 1; break; case 0x2: oem_he.OemEventData.Data[2] = 2; break; case 0x7: oem_he.OemEventData.Data[2] = 3; break; case 0x9: oem_he.OemEventData.Data[2] = 4; break; case 0x6: oem_he.OemEventData.Data[2] = 5; break; case 0x8: oem_he.OemEventData.Data[2] = 6; break; case 0xF: default: oem_he.OemEventData.Data[2] = 7; break; } stdlog << "cIpmiSensorHotswap::HandleEvent SAHPI_ET_OEM Event resource " << res->m_resource_id << "\n"; m_mc->Domain()->AddHpiEvent( oem_e ); } SaErrorT cIpmiSensorHotswap::GetPicmgState( tIpmiFruState &state ) { // read hotswap state cIpmiMsg rsp; // Default value just in case state = eIpmiFruStateCommunicationLost; SaErrorT rv = GetSensorData( rsp ); if ( rv != SA_OK ) { stdlog << "cannot get hotswap state !\n"; return rv; } // Reading should be 0 according to PICMG 3.0 specification // However if it's not this is not a fatal error so just flag it if ( rsp.m_data[1] != 0 ) { stdlog << "WARNING: hotswap sensor reading not 0 : " << rsp.m_data[1] << " !\n"; } unsigned int value = rsp.m_data[3]; for( int i = 0; i < 8; i++ ) if ( value & ( 1 << i ) ) { state = (tIpmiFruState)i; return SA_OK; } stdlog << "WRONG Hot Swap State " << value << "\n"; return SA_ERR_HPI_INVALID_DATA; } SaErrorT cIpmiSensorHotswap::GetHpiState( SaHpiHsStateT &state ) { tIpmiFruState fs; SaErrorT rv = GetPicmgState( fs ); if ( rv != SA_OK ) return rv; state = ConvertIpmiToHpiHotswapState( fs ); return SA_OK; } openhpi-2.14.1/plugins/ipmidirect/ipmi_entity.h0000644000076400007640000001064111302567000016502 0ustar /* * ipmi_entity.h * * Copyright (c) 2003,2004 by FORCE Computers * Copyright (c) 2005 by ESO Technologies. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Thomas Kanngieser * Pierre Sangouard */ #ifndef dIpmiEntity_h #define dIpmiEntity_h #include #include extern "C" { #include "SaHpi.h" } #ifndef dIpmiEvent_h #include "ipmi_event.h" #endif enum tIpmiEntityId { eIpmiEntityInvalid = 0, eIpmiEntityIdOther = 1, eIpmiEntityIdUnkown = 2, eIpmiEntityIdProcessor = 3, eIpmiEntityIdDisk = 4, eIpmiEntityIdPeripheral = 5, eIpmiEntityIdSystemManagementModule = 6, eIpmiEntityIdSystemBoard = 7, eIpmiEntityIdMemoryModule = 8, eIpmiEntityIdProcessorModule = 9, eIpmiEntityIdPowerSupply = 10, eIpmiEntityIdAddInCard = 11, eIpmiEntityIdFrontPanelBoard = 12, eIpmiEntityIdBackPanelBoard = 13, eIpmiEntityIdPowerSystemBoard = 14, eIpmiEntityIdDriveBackplane = 15, eIpmiEntityIdSystemInternalExpansionBoard = 16, eIpmiEntityIdOtherSystemBoard = 17, eIpmiEntityIdProcessorBoard = 18, eIpmiEntityIdPowerUnit = 19, eIpmiEntityIdPowerModule = 20, eIpmiEntityIdPowerManagementBoard = 21, eIpmiEntityIdChassisBackPanelBoard = 22, eIpmiEntityIdSystemChassis = 23, eIpmiEntityIdSubChassis = 24, eIpmiEntityIdOtherChassisBoard = 25, eIpmiEntityIdDiskDriveBay = 26, eIpmiEntityIdPeripheralBay = 27, eIpmiEntityIdDeviceBay = 28, eIpmiEntityIdFanCooling = 29, eIpmiEntityIdCoolingUnit = 30, eIpmiEntityIdCableInterconnect = 31, eIpmiEntityIdMemoryDevice = 32, eIpmiEntityIdSystemManagementSoftware = 33, eIpmiEntityIdBios = 34, eIpmiEntityIdOperatingSystem = 35, eIpmiEntityIdSystemBus = 36, eIpmiEntityIdGroup = 37, eIpmiEntityIdRemoteMgmtCommDevice = 38, eIpmiEntityIdExternalEnvironment = 39, eIpmiEntityIdBattery = 40, eIpmiEntityIdProcessingBlade = 41, eIpmiEntityIdConnectivitySwitch = 42, eIpmiEntityIdProcessorMemoryModule = 43, eIpmiEntityIdIoModule = 44, eIpmiEntityIdProcessorIoModule = 45, eIpmiEntityIdMgmtControllerFirmware = 46, // PIGMIG entity ids eIpmiEntityIdPicMgFrontBoard = 0xa0, eIpmiEntityIdPicMgRearTransitionModule = 0xc0, eIpmiEntityIdPicMgAdvancedMcModule = 0xc1, eIpmiEntityIdPicMgMicroTcaCarrierHub = 0xc2, eIpmiEntityIdPicmgShelfManager = 0xf0, eIpmiEntityIdPicmgFiltrationUnit = 0xf1, eIpmiEntityIdPicmgShelfFruInformation = 0xf2, eIpmiEntityIdPicmgAlarmPanel = 0xf3, }; const char *IpmiEntityIdToString( tIpmiEntityId id ); // wrapper class for entity path class cIpmiEntityPath { public: SaHpiEntityPathT m_entity_path; cIpmiEntityPath(); cIpmiEntityPath( const SaHpiEntityPathT &entity_path ); operator SaHpiEntityPathT() { return m_entity_path; } void SetEntry( int idx, SaHpiEntityTypeT type, SaHpiEntityLocationT instance ); SaHpiEntityTypeT GetEntryType( int idx ); void SetEntryType( int idx, SaHpiEntityTypeT type ); SaHpiEntityLocationT GetEntryInstance( int idx ); void SetEntryInstance( int idx, SaHpiEntityLocationT instance ); cIpmiEntityPath &operator+=( const cIpmiEntityPath &epath ); bool operator==( const cIpmiEntityPath &epath ) const; bool operator!=( const cIpmiEntityPath &epath ) const; void AppendRoot( int idx ); bool FromString( const char *str ); }; cIpmiLog &operator<<( cIpmiLog &log, const cIpmiEntityPath &epath ); #endif openhpi-2.14.1/plugins/ipmidirect/ipmi_con_smi.h0000644000076400007640000000226111302567000016614 0ustar /* * * Copyright (c) 2004 by FORCE Computers * * Note that this file is based on parts of OpenIPMI * written by Corey Minyard * of MontaVista Software. Corey's code was helpful * and many thanks go to him. He gave the permission * to use this code in OpenHPI under BSD license. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Thomas Kanngieser */ #ifndef dIpmiConSmi_h #define dIpmiConSmi_h #ifndef dIpmiCon_h #include "ipmi_con.h" #endif class cIpmiConSmi : public cIpmiCon { int m_if_num; int OpenSmiFd( int if_num ); public: cIpmiConSmi( unsigned int timeout, int log_level, int if_num ); virtual ~cIpmiConSmi(); protected: virtual int IfGetMaxSeq(); virtual int IfOpen(); virtual void IfClose(); virtual SaErrorT IfSendCmd( cIpmiRequest *r ); virtual void IfReadResponse(); }; #endif openhpi-2.14.1/plugins/ipmidirect/ipmi_mc_vendor_fix_sdr.cpp0000644000076400007640000001237011302567000021214 0ustar /* * Copyright (c) 2005 by ESO Technologies. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Pierre Sangouard */ #include "ipmi_mc_vendor_fix_sdr.h" #include "ipmi_utils.h" #include "ipmi_log.h" #include "ipmi_mc.h" #include #include mc_sdr_patch_t sdr_patch_fboard[] = { // ATCA Front Board {ENTITY_DONT_CARE, ENTITY_DONT_CARE, eIpmiEntityIdPicMgFrontBoard, 0x60, false}, {ENTITY_DONT_CARE, ENTITY_DONT_CARE, ENTITY_DONT_CARE, ENTITY_DONT_CARE, true}, }; mc_sdr_patch_t sdr_patch_IShMC[] = { // ShMC itself {eIpmiEntityIdPicmgShelfManager, ENTITY_DONT_CARE, eIpmiEntityIdPicmgShelfManager, 0x60, false}, {eIpmiEntityIdBios, ENTITY_DONT_CARE, eIpmiEntityIdPicmgShelfManager, 0x60, false}, {eIpmiEntityIdSystemManagementSoftware, ENTITY_DONT_CARE, eIpmiEntityIdPicmgShelfManager, 0x60, false}, // Air Filter FRU {eIpmiEntityIdPicmgFiltrationUnit, ENTITY_DONT_CARE, eIpmiEntityIdPicmgFiltrationUnit, 0x60, false}, // Chassis Data Module 1 {eIpmiEntityIdPicmgShelfFruInformation, 0, eIpmiEntityIdPicmgShelfFruInformation, 0x60, false}, // Chassis Data Module 2 {eIpmiEntityIdPicmgShelfFruInformation, 1, eIpmiEntityIdPicmgShelfFruInformation, 0x61, false}, {ENTITY_DONT_CARE, ENTITY_DONT_CARE, ENTITY_DONT_CARE, ENTITY_DONT_CARE, true}, }; mc_sdr_patch_t sdr_patch_IPEM[] = { {ENTITY_DONT_CARE, ENTITY_DONT_CARE, eIpmiEntityIdPowerSupply, 0x60, false}, {ENTITY_DONT_CARE, ENTITY_DONT_CARE, ENTITY_DONT_CARE, ENTITY_DONT_CARE, true}, }; mc_sdr_patch_t sdr_patch_IFanTray[] = { {ENTITY_DONT_CARE, ENTITY_DONT_CARE, eIpmiEntityIdCoolingUnit, 0x60, false}, {ENTITY_DONT_CARE, ENTITY_DONT_CARE, ENTITY_DONT_CARE, ENTITY_DONT_CARE, true}, }; // Entries in this table are for boards // with badly formed SDRs that have been tested // with the plugin. As soon as a fixed firmware // is available from the vendor, the corresponding // entry will be removed from the table mc_patch_t mc_patch[] = { {0x157, 0x80A, sdr_patch_fboard}, // Tested with firmware <= 1.01 {0x157, 0x808, sdr_patch_fboard}, // Tested with firmware <= 1.10 {0x157, 0x841, sdr_patch_IShMC}, // Tested with firmware = 5.01 {0x157, 0x850, sdr_patch_IPEM}, // Tested with firmware = 1.04 {0x157, 0x870, sdr_patch_IFanTray}, // Tested with firmware = 1.02 {0, 0, NULL}, }; cIpmiMcVendorFixSdr::cIpmiMcVendorFixSdr( unsigned int manufacturer_id, unsigned int product_id ) : cIpmiMcVendor( manufacturer_id, product_id, "Some MC" ) { } cIpmiMcVendorFixSdr::~cIpmiMcVendorFixSdr() { } bool cIpmiMcVendorFixSdr::InitMc( cIpmiMc *mc, const cIpmiMsg &devid ) { stdlog << "InitMc : Found Mc with SDR to fix.\n"; m_sdr_patch = NULL; stdlog << "Manuf " << m_manufacturer_id << " Product " << m_product_id << ".\n"; for ( int i = 0; mc_patch[i].sdr_patch != NULL; i++ ) { if (( mc_patch[i].manufacturer_id == m_manufacturer_id ) && ( mc_patch[i].product_id == m_product_id )) { m_sdr_patch = mc_patch[i].sdr_patch; break; } } assert( m_sdr_patch != NULL ); return true; } bool cIpmiMcVendorFixSdr::ProcessSdr( cIpmiDomain *domain, cIpmiMc *mc, cIpmiSdrs *sdrs ) { unsigned char *pEntityId, *pEntityInstance; stdlog << "ProcessSdr : Special Mc found.\n"; for( unsigned int i = 0; i < sdrs->NumSdrs(); i++ ) { cIpmiSdr *sdr = sdrs->Sdr( i ); if ( (sdr->m_type == eSdrTypeMcDeviceLocatorRecord) || (sdr->m_type == eSdrTypeFruDeviceLocatorRecord) ) { pEntityId = &sdr->m_data[12]; pEntityInstance = &sdr->m_data[13]; } else if ( (sdr->m_type == eSdrTypeFullSensorRecord) || (sdr->m_type == eSdrTypeCompactSensorRecord) ) { pEntityId = &sdr->m_data[8]; pEntityInstance = &sdr->m_data[9]; } else { stdlog << "Type is " << sdr->m_type << "\n"; continue; } stdlog << "Old Type " << sdr->m_type << " Ent ID " << *pEntityId << " Inst " << *pEntityInstance << "\n"; for ( int j = 0; m_sdr_patch[j].last_entry != true; j++ ) { if (( m_sdr_patch[j].old_entity_id == ENTITY_DONT_CARE ) || ( m_sdr_patch[j].old_entity_id == *pEntityId )) { if (( m_sdr_patch[j].old_entity_instance == ENTITY_DONT_CARE ) || ( m_sdr_patch[j].old_entity_instance == *pEntityInstance )) { *pEntityId = m_sdr_patch[j].new_entity_id; *pEntityInstance = m_sdr_patch[j].new_entity_instance; break; } } } stdlog << "New Type " << sdr->m_type << " Ent ID " << *pEntityId << " Inst " << *pEntityInstance << "\n"; } return true; } openhpi-2.14.1/plugins/ipmidirect/ipmi_watchdog.h0000644000076400007640000000230311302567000016762 0ustar /* * ipmi_watchdog.h * * Copyright (c) 2006 by ESO Technologies. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Pierre Sangouard */ #ifndef dIpmiWatchdog_h #define dIpmiWatchdog_h #ifndef dIpmiRdr_h #include "ipmi_rdr.h" #endif extern "C" { #include "SaHpi.h" } class cIpmiWatchdog : public cIpmiRdr { protected: unsigned int m_num; // control num unsigned int m_oem; public: cIpmiWatchdog( cIpmiMc *mc, unsigned int num, unsigned int oem ); ~cIpmiWatchdog(); unsigned int Num() const { return m_num; } unsigned int Oem() const { return m_oem; } // create an RDR sensor record bool CreateRdr( SaHpiRptEntryT &resource, SaHpiRdrT &rdr ); SaErrorT GetWatchdogInfo( SaHpiWatchdogT &watchdog); SaErrorT SetWatchdogInfo( SaHpiWatchdogT &watchdog); SaErrorT ResetWatchdog(); }; #endif openhpi-2.14.1/plugins/ipmidirect/ipmi_control_sun_led.cpp0000644000076400007640000000723411302567000020716 0ustar /* * Copyright (c) 2009 by Sun Microsystems, Inc. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Chris Rinaldo */ #include "ipmi_control_sun_led.h" #include "ipmi_resource.h" cIpmiControlSunLed::cIpmiControlSunLed(cIpmiMc* mc, unsigned int num, uint8_t dev_access_addr, uint8_t dev_slave_addr, uint8_t entity_id, uint8_t entity_inst, uint8_t oem, SaHpiBoolT read_only) : cIpmiControl(mc, num, SAHPI_CTRL_LED, SAHPI_CTRL_TYPE_OEM), m_dev_access_addr(dev_access_addr), m_dev_slave_addr(dev_slave_addr), m_entity_id(entity_id), m_entity_inst(entity_inst), m_oem(oem), m_read_only(read_only) { } cIpmiControlSunLed::~cIpmiControlSunLed() { } bool cIpmiControlSunLed::CreateRdr(SaHpiRptEntryT& resource, SaHpiRdrT& rdr) { if (cIpmiControl::CreateRdr(resource, rdr) == false) return false; rdr.RdrTypeUnion.CtrlRec.OutputType = SAHPI_CTRL_LED; rdr.RdrTypeUnion.CtrlRec.Type = SAHPI_CTRL_TYPE_OEM; rdr.RdrTypeUnion.CtrlRec.TypeUnion.Oem.MId = 0x2a; rdr.RdrTypeUnion.CtrlRec.TypeUnion.Oem.ConfigData[0] = m_oem; rdr.RdrTypeUnion.CtrlRec.TypeUnion.Oem.Default.MId = 0x2a; rdr.RdrTypeUnion.CtrlRec.TypeUnion.Oem.Default.BodyLength = 1; rdr.RdrTypeUnion.CtrlRec.TypeUnion.Oem.Default.Body[0] = 0; rdr.RdrTypeUnion.CtrlRec.DefaultMode.Mode = SAHPI_CTRL_MODE_AUTO; rdr.RdrTypeUnion.CtrlRec.DefaultMode.ReadOnly = m_read_only; rdr.RdrTypeUnion.CtrlRec.WriteOnly = SAHPI_FALSE; return true; } SaErrorT cIpmiControlSunLed::GetState(SaHpiCtrlModeT& mode, SaHpiCtrlStateT& state) { mode = SAHPI_CTRL_MODE_AUTO; state.Type = SAHPI_CTRL_TYPE_OEM; cIpmiMsg ledmsg(eIpmiNetfnOem, eIpmiCmdSunOemLedGet); ledmsg.m_data[0] = m_dev_slave_addr; ledmsg.m_data[1] = m_oem; ledmsg.m_data[2] = m_dev_access_addr; ledmsg.m_data[3] = m_oem; ledmsg.m_data[4] = m_entity_id; ledmsg.m_data[5] = m_entity_inst; ledmsg.m_data[6] = 0; ledmsg.m_data_len = 7; cIpmiMsg ledrsp; SaErrorT rv = Resource()->SendCommandReadLock(this, ledmsg, ledrsp); if (rv != SA_OK) return rv; if (ledrsp.m_data_len != 2 || ledrsp.m_data[0] != eIpmiCcOk) return SA_ERR_HPI_ERROR; state.StateUnion.Oem.MId = 0x2a; state.StateUnion.Oem.BodyLength = 1; state.StateUnion.Oem.Body[0] = ledrsp.m_data[1]; return SA_OK; } SaErrorT cIpmiControlSunLed::SetState(const SaHpiCtrlModeT& mode, const SaHpiCtrlStateT& state) { if (state.StateUnion.Oem.Body[0] > eLedStateFastBlink) { return SA_ERR_HPI_INVALID_DATA; } cIpmiMsg ledmsg(eIpmiNetfnOem, eIpmiCmdSunOemLedSet); ledmsg.m_data[0] = m_dev_slave_addr; ledmsg.m_data[1] = m_oem; ledmsg.m_data[2] = m_dev_access_addr; ledmsg.m_data[3] = m_oem; ledmsg.m_data[4] = state.StateUnion.Oem.Body[0]; // mode ledmsg.m_data[5] = m_entity_id; ledmsg.m_data[6] = m_entity_inst; ledmsg.m_data[7] = 0; // force ledmsg.m_data[8] = 0; // role ledmsg.m_data_len = 9; cIpmiMsg ledrsp; SaErrorT rv = Resource()->SendCommandReadLock(this, ledmsg, ledrsp); if (rv != SA_OK) return rv; if (ledrsp.m_data[0] == eIpmiCcInvalidCmd) return SA_ERR_HPI_UNSUPPORTED_PARAMS; if (ledrsp.m_data[0] == eIpmiCcInsufficientPrivilege) return SA_ERR_HPI_READ_ONLY; if (ledrsp.m_data[0] != eIpmiCcOk) return SA_ERR_HPI_ERROR; return SA_OK; } void cIpmiControlSunLed::Dump(cIpmiLog& dump, const char* name) const { dump.Begin("Sun LED", name); dump.End(); } openhpi-2.14.1/plugins/ipmidirect/ipmi.cpp0000644000076400007640000015777211302567000015462 0ustar /* * * Copyright (c) 2003,2004 by FORCE Computers. * Copyright (c) 2005 by ESO Technologies. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Thomas Kanngieser * Pierre Sangouard * Andy Cress */ #include #include #include "ipmi.h" #include "ipmi_con_lan.h" #include "ipmi_con_smi.h" #include "ipmi_utils.h" static cIpmi * VerifyIpmi( void *hnd ) { if (!hnd) return 0; oh_handler_state *handler = (oh_handler_state *)hnd; cIpmi *ipmi = (cIpmi *)handler->data; if ( !ipmi ) { return 0; } if ( !ipmi->CheckMagic() ) { return 0; } if ( !ipmi->CheckHandler( handler ) ) { return 0; } return ipmi; } static cIpmiSensor * VerifySensorAndEnter( void *hnd, SaHpiResourceIdT rid, SaHpiSensorNumT num, cIpmi *&ipmi ) { ipmi = VerifyIpmi( hnd ); if ( !ipmi ) { return 0; } ipmi->IfEnter(); SaHpiRdrT *rdr = oh_get_rdr_by_type( ipmi->GetHandler()->rptcache, rid, SAHPI_SENSOR_RDR, num ); if ( !rdr ) { ipmi->IfLeave(); return 0; } cIpmiSensor *sensor = (cIpmiSensor *)oh_get_rdr_data( ipmi->GetHandler()->rptcache, rid, rdr->RecordId ); if ( !sensor ) { ipmi->IfLeave(); return 0; } if ( !ipmi->VerifySensor( sensor ) ) { ipmi->IfLeave(); return 0; } return sensor; } static cIpmiControl * VerifyControlAndEnter( void *hnd, SaHpiResourceIdT rid, SaHpiCtrlNumT num, cIpmi *&ipmi ) { ipmi = VerifyIpmi( hnd ); if ( !ipmi ) { return 0; } ipmi->IfEnter(); SaHpiRdrT *rdr = oh_get_rdr_by_type( ipmi->GetHandler()->rptcache, rid, SAHPI_CTRL_RDR, num ); if ( !rdr ) { ipmi->IfLeave(); return 0; } cIpmiControl *control = (cIpmiControl *)oh_get_rdr_data( ipmi->GetHandler()->rptcache, rid, rdr->RecordId ); if ( !control ) { ipmi->IfLeave(); return 0; } if ( !ipmi->VerifyControl( control ) ) { ipmi->IfLeave(); return 0; } return control; } static cIpmiWatchdog * VerifyWatchdogAndEnter( void *hnd, SaHpiResourceIdT rid, SaHpiWatchdogNumT num, cIpmi *&ipmi ) { ipmi = VerifyIpmi( hnd ); if ( !ipmi ) { return 0; } ipmi->IfEnter(); SaHpiRdrT *rdr = oh_get_rdr_by_type( ipmi->GetHandler()->rptcache, rid, SAHPI_WATCHDOG_RDR, num ); if ( !rdr ) { ipmi->IfLeave(); return 0; } cIpmiWatchdog *watchdog = (cIpmiWatchdog *)oh_get_rdr_data( ipmi->GetHandler()->rptcache, rid, rdr->RecordId ); if ( !watchdog ) { ipmi->IfLeave(); return 0; } if ( !ipmi->VerifyWatchdog( watchdog ) ) { ipmi->IfLeave(); return 0; } return watchdog; } static cIpmiInventory * VerifyInventoryAndEnter( void *hnd, SaHpiResourceIdT rid, SaHpiIdrIdT idrid, cIpmi *&ipmi ) { ipmi = VerifyIpmi( hnd ); if ( !ipmi ) { return 0; } ipmi->IfEnter(); SaHpiRdrT *rdr = oh_get_rdr_by_type( ipmi->GetHandler()->rptcache, rid, SAHPI_INVENTORY_RDR, idrid ); if ( !rdr ) { ipmi->IfLeave(); return 0; } cIpmiInventory *inv = (cIpmiInventory *)oh_get_rdr_data( ipmi->GetHandler()->rptcache, rid, rdr->RecordId ); if ( !inv ) { ipmi->IfLeave(); return 0; } if ( !ipmi->VerifyInventory( inv ) ) { ipmi->IfLeave(); return 0; } return inv; } static cIpmiResource * VerifyResourceAndEnter( void *hnd, SaHpiResourceIdT rid, cIpmi *&ipmi ) { ipmi = VerifyIpmi( hnd ); if ( !ipmi ) { return 0; } ipmi->IfEnter(); cIpmiResource *res = (cIpmiResource *)oh_get_resource_data( ipmi->GetHandler()->rptcache, rid ); if ( !res ) { ipmi->IfLeave(); return 0; } if ( !ipmi->VerifyResource( res ) ) { ipmi->IfLeave(); return 0; } return res; } static cIpmiSel * VerifySelAndEnter( void *hnd, SaHpiResourceIdT rid, cIpmi *&ipmi ) { ipmi = VerifyIpmi( hnd ); if ( !ipmi ) { return 0; } ipmi->IfEnter(); cIpmiResource *res = (cIpmiResource *)oh_get_resource_data( ipmi->GetHandler()->rptcache, rid ); if ( !res ) { ipmi->IfLeave(); return 0; } if ( !ipmi->VerifyResource( res ) ) { ipmi->IfLeave(); return 0; } if ( res->FruId() || !res->Mc()->SelDeviceSupport() ) { ipmi->IfLeave(); return 0; } return res->Mc()->Sel(); } // new plugin_loader extern "C" { // ABI Interface functions static void * IpmiOpen( GHashTable *, unsigned int, oh_evt_queue * ) __attribute__((used)); static void * IpmiOpen( GHashTable *handler_config, unsigned int hid, oh_evt_queue *eventq ) { // open log const char *logfile = 0; int max_logfiles = 10; char *tmp; int lp = dIpmiLogPropNone; dbg( "IpmiOpen" ); if ( !handler_config ) { err( "No config file provided.....ooops!" ); return 0; } logfile = (char *)g_hash_table_lookup( handler_config, "logfile" ); tmp = (char *)g_hash_table_lookup( handler_config, "logfile_max" ); if ( tmp ) max_logfiles = atoi( tmp ); tmp = (char *)g_hash_table_lookup( handler_config, "logflags" ); if ( tmp ) { if ( strstr( tmp, "StdOut" ) || strstr( tmp, "stdout" ) ) lp |= dIpmiLogStdOut; if ( strstr( tmp, "StdError" ) || strstr( tmp, "stderr" ) ) lp |= dIpmiLogStdErr; if ( strstr( tmp, "File" ) || strstr( tmp, "file" ) ) { lp |= dIpmiLogLogFile; if ( logfile == 0 ) logfile = dDefaultLogfile; } } stdlog.Open( lp, logfile, max_logfiles ); stdlog.Time( true ); // create domain cIpmi *ipmi = new cIpmi; // allocate handler oh_handler_state *handler = (oh_handler_state *)g_malloc0( sizeof( oh_handler_state ) ); if ( !handler ) { err("cannot allocate handler"); delete ipmi; stdlog.Close(); return 0; } handler->data = ipmi; handler->rptcache = (RPTable *)g_malloc0( sizeof( RPTable ) ); if ( !handler->rptcache ) { err("cannot allocate RPT cache"); g_free( handler ); delete ipmi; stdlog.Close(); return 0; } handler->config = handler_config; handler->hid = hid; handler->eventq = eventq; ipmi->SetHandler( handler ); if ( !ipmi->IfOpen( handler_config ) ) { ipmi->IfClose(); delete ipmi; oh_flush_rpt( handler->rptcache ); g_free( handler->rptcache ); g_free( handler ); stdlog.Close(); return 0; } return handler; } static void IpmiClose( void * ) __attribute__((used)); static void IpmiClose( void *hnd ) { dbg( "IpmiClose" ); cIpmi *ipmi = VerifyIpmi( hnd ); if ( !ipmi ) { return; } /** Commenting this code block due to the multi-domain changes ** in the infrastructure. ** (Renier Morales 11/21/06) if ( ipmi->DomainId() != oh_get_default_domain_id() ) { stdlog << "Releasing domain id " << ipmi->DomainId() << "\n"; SaErrorT rv = oh_request_domain_delete( ipmi->HandlerId(), ipmi->DomainId() ); if ( rv != SA_OK ) stdlog << "oh_request_domain_delete error " << rv << "\n"; }*/ ipmi->IfClose(); ipmi->CheckLock(); delete ipmi; oh_handler_state *handler = (oh_handler_state *)hnd; if ( handler->rptcache ) { oh_flush_rpt( handler->rptcache ); g_free( handler->rptcache ); } g_free( handler ); // close logfile stdlog.Close(); } static SaErrorT IpmiGetEvent( void * ) __attribute__((used)); static SaErrorT IpmiGetEvent( void *hnd ) { cIpmi *ipmi = VerifyIpmi( hnd ); struct oh_event event; if ( !ipmi ) { return SA_ERR_HPI_INTERNAL_ERROR; } // there is no need to get a lock because // the event queue has its own lock SaErrorT rv = ipmi->IfGetEvent( &event ); return rv; } static SaErrorT IpmiDiscoverResources( void * ) __attribute__((used)); static SaErrorT IpmiDiscoverResources( void *hnd ) { cIpmi *ipmi = VerifyIpmi( hnd ); if ( !ipmi ) { return SA_ERR_HPI_INTERNAL_ERROR; } stdlog << "Simple discovery let's go " << hnd << "\n"; SaErrorT rv = ipmi->IfDiscoverResources(); return rv; } static SaErrorT IpmiSetResourceTag( void *, SaHpiResourceIdT, SaHpiTextBufferT * ) __attribute__((used)); static SaErrorT IpmiSetResourceTag( void *hnd, SaHpiResourceIdT id, SaHpiTextBufferT *tag ) { cIpmi *ipmi = 0; cIpmiResource *res = VerifyResourceAndEnter( hnd, id, ipmi ); if ( !res ) return SA_ERR_HPI_NOT_PRESENT; SaErrorT rv = ipmi->IfSetResourceTag( res, tag ); ipmi->IfLeave(); return rv; } static SaErrorT IpmiSetResourceSeverity( void *, SaHpiResourceIdT, SaHpiSeverityT ) __attribute__((used)); static SaErrorT IpmiSetResourceSeverity( void *hnd, SaHpiResourceIdT id, SaHpiSeverityT sev ) { cIpmi *ipmi = 0; cIpmiResource *res = VerifyResourceAndEnter( hnd, id, ipmi ); if ( !res ) return SA_ERR_HPI_NOT_PRESENT; SaErrorT rv = ipmi->IfSetResourceSeverity( res, sev ); ipmi->IfLeave(); return rv; } static SaErrorT IpmiGetSensorReading( void *, SaHpiResourceIdT id, SaHpiSensorNumT num, SaHpiSensorReadingT *data, SaHpiEventStateT *state ) __attribute__((used)); static SaErrorT IpmiGetSensorReading( void *hnd, SaHpiResourceIdT id, SaHpiSensorNumT num, SaHpiSensorReadingT *data, SaHpiEventStateT *state ) { cIpmi *ipmi = 0; cIpmiSensor *sensor = VerifySensorAndEnter( hnd, id, num, ipmi ); if ( !sensor ) return SA_ERR_HPI_NOT_PRESENT; SaErrorT rv = sensor->GetSensorReading( *data, *state ); ipmi->IfLeave(); return rv; } static SaErrorT IpmiGetSensorThresholds( void *hnd, SaHpiResourceIdT, SaHpiSensorNumT, SaHpiSensorThresholdsT * ) __attribute__((used)); static SaErrorT IpmiGetSensorThresholds( void *hnd, SaHpiResourceIdT id, SaHpiSensorNumT num, SaHpiSensorThresholdsT *thres ) { cIpmi *ipmi; cIpmiSensor *sensor = VerifySensorAndEnter( hnd, id, num, ipmi ); if ( !sensor ) return SA_ERR_HPI_NOT_PRESENT; SaErrorT rv = SA_ERR_HPI_INVALID_PARAMS; cIpmiSensorThreshold *t = dynamic_cast( sensor ); if ( t ) rv = t->GetThresholdsAndHysteresis( *thres ); ipmi->IfLeave(); return rv; } static SaErrorT IpmiSetSensorThresholds( void *, SaHpiResourceIdT, SaHpiSensorNumT, const SaHpiSensorThresholdsT * ) __attribute__((used)); static SaErrorT IpmiSetSensorThresholds( void *hnd, SaHpiResourceIdT id, SaHpiSensorNumT num, const SaHpiSensorThresholdsT *thres ) { cIpmi *ipmi; cIpmiSensor *sensor = VerifySensorAndEnter( hnd, id, num, ipmi ); if ( !sensor ) return SA_ERR_HPI_NOT_PRESENT; SaErrorT rv = SA_ERR_HPI_INVALID_PARAMS; cIpmiSensorThreshold *t = dynamic_cast( sensor ); if ( t ) rv = t->SetThresholdsAndHysteresis( *thres ); ipmi->IfLeave(); return rv; } static SaErrorT IpmiGetSensorEnable( void *, SaHpiResourceIdT, SaHpiSensorNumT, SaHpiBoolT * ) __attribute__((used)); static SaErrorT IpmiGetSensorEnable( void *hnd, SaHpiResourceIdT id, SaHpiSensorNumT num, SaHpiBoolT *enable ) { cIpmi *ipmi; cIpmiSensor *sensor = VerifySensorAndEnter( hnd, id, num, ipmi ); if ( !sensor ) return SA_ERR_HPI_NOT_PRESENT; SaErrorT rv = sensor->GetEnable( *enable ); ipmi->IfLeave(); return rv; } static SaErrorT IpmiSetSensorEnable( void *, SaHpiResourceIdT, SaHpiSensorNumT, SaHpiBoolT ) __attribute__((used)); static SaErrorT IpmiSetSensorEnable( void *hnd, SaHpiResourceIdT id, SaHpiSensorNumT num, SaHpiBoolT enable ) { cIpmi *ipmi; cIpmiSensor *sensor = VerifySensorAndEnter( hnd, id, num, ipmi ); if ( !sensor ) return SA_ERR_HPI_NOT_PRESENT; SaErrorT rv = sensor->SetEnable( enable ); ipmi->IfLeave(); return rv; } static SaErrorT IpmiGetSensorEventEnables( void *, SaHpiResourceIdT, SaHpiSensorNumT, SaHpiBoolT * ) __attribute__((used)); static SaErrorT IpmiGetSensorEventEnables( void *hnd, SaHpiResourceIdT id, SaHpiSensorNumT num, SaHpiBoolT *enables ) { cIpmi *ipmi; cIpmiSensor *sensor = VerifySensorAndEnter( hnd, id, num, ipmi ); if ( !sensor ) return SA_ERR_HPI_NOT_PRESENT; SaErrorT rv = sensor->GetEventEnables( *enables ); ipmi->IfLeave(); return rv; } static SaErrorT IpmiSetSensorEventEnables( void *, SaHpiResourceIdT, SaHpiSensorNumT, SaHpiBoolT ) __attribute__((used)); static SaErrorT IpmiSetSensorEventEnables( void *hnd, SaHpiResourceIdT id, SaHpiSensorNumT num, SaHpiBoolT enables ) { cIpmi *ipmi; cIpmiSensor *sensor = VerifySensorAndEnter( hnd, id, num, ipmi ); if ( !sensor ) return SA_ERR_HPI_NOT_PRESENT; SaErrorT rv = sensor->SetEventEnables( enables ); ipmi->IfLeave(); return rv; } static SaErrorT IpmiGetSensorEventMasks( void *, SaHpiResourceIdT, SaHpiSensorNumT, SaHpiEventStateT *, SaHpiEventStateT * ) __attribute__((used)); static SaErrorT IpmiGetSensorEventMasks( void *hnd, SaHpiResourceIdT id, SaHpiSensorNumT num, SaHpiEventStateT *AssertEventMask, SaHpiEventStateT *DeassertEventMask ) { cIpmi *ipmi; cIpmiSensor *sensor = VerifySensorAndEnter( hnd, id, num, ipmi ); if ( !sensor ) return SA_ERR_HPI_NOT_PRESENT; SaErrorT rv = sensor->GetEventMasks( *AssertEventMask, *DeassertEventMask ); ipmi->IfLeave(); return rv; } static SaErrorT IpmiSetSensorEventMasks( void *, SaHpiResourceIdT, SaHpiSensorNumT, SaHpiSensorEventMaskActionT, SaHpiEventStateT, SaHpiEventStateT ) __attribute__((used)); static SaErrorT IpmiSetSensorEventMasks( void *hnd, SaHpiResourceIdT id, SaHpiSensorNumT num, SaHpiSensorEventMaskActionT act, SaHpiEventStateT AssertEventMask, SaHpiEventStateT DeassertEventMask ) { cIpmi *ipmi; cIpmiSensor *sensor = VerifySensorAndEnter( hnd, id, num, ipmi ); if ( !sensor ) return SA_ERR_HPI_NOT_PRESENT; SaErrorT rv = sensor->SetEventMasks( act, AssertEventMask, DeassertEventMask ); ipmi->IfLeave(); return rv; } static SaErrorT IpmiGetControlState( void *, SaHpiResourceIdT, SaHpiCtrlNumT, SaHpiCtrlModeT *, SaHpiCtrlStateT * ) __attribute__((used)); static SaErrorT IpmiGetControlState( void *hnd, SaHpiResourceIdT id, SaHpiCtrlNumT num, SaHpiCtrlModeT *mode, SaHpiCtrlStateT *state ) { cIpmi *ipmi; cIpmiControl *control = VerifyControlAndEnter( hnd, id, num, ipmi ); if ( !control ) return SA_ERR_HPI_NOT_PRESENT; SaErrorT rv = control->GetState( *mode, *state ); ipmi->IfLeave(); return rv; } static SaErrorT IpmiSetControlState( void *, SaHpiResourceIdT, SaHpiCtrlNumT, SaHpiCtrlModeT, SaHpiCtrlStateT * ) __attribute__((used)); static SaErrorT IpmiSetControlState( void *hnd, SaHpiResourceIdT id, SaHpiCtrlNumT num, SaHpiCtrlModeT mode, SaHpiCtrlStateT *state ) { cIpmi *ipmi; cIpmiControl *control = VerifyControlAndEnter( hnd, id, num, ipmi ); if ( !control ) return SA_ERR_HPI_NOT_PRESENT; SaErrorT rv = control->SetState( mode, *state ); ipmi->IfLeave(); return rv; } static SaErrorT IpmiGetIdrInfo( void *, SaHpiResourceIdT, SaHpiIdrIdT, SaHpiIdrInfoT * ) __attribute__((used)); static SaErrorT IpmiGetIdrInfo( void *hnd, SaHpiResourceIdT id, SaHpiIdrIdT idrid, SaHpiIdrInfoT *idrinfo ) { cIpmi *ipmi = 0; cIpmiInventory *inv = VerifyInventoryAndEnter( hnd, id, idrid, ipmi ); if ( !inv ) return SA_ERR_HPI_NOT_PRESENT; SaErrorT rv = inv->GetIdrInfo( idrid, *idrinfo ); ipmi->IfLeave(); return rv; } static SaErrorT IpmiGetIdrAreaHeader( void *, SaHpiResourceIdT, SaHpiIdrIdT, SaHpiIdrAreaTypeT, SaHpiEntryIdT, SaHpiEntryIdT *, SaHpiIdrAreaHeaderT * ) __attribute__((used)); static SaErrorT IpmiGetIdrAreaHeader( void *hnd, SaHpiResourceIdT id, SaHpiIdrIdT idrid, SaHpiIdrAreaTypeT areatype, SaHpiEntryIdT areaid, SaHpiEntryIdT *nextareaid, SaHpiIdrAreaHeaderT *header ) { cIpmi *ipmi = 0; cIpmiInventory *inv = VerifyInventoryAndEnter( hnd, id, idrid, ipmi ); if ( !inv ) return SA_ERR_HPI_NOT_PRESENT; SaErrorT rv = inv->GetIdrAreaHeader( idrid, areatype, areaid, *nextareaid, *header ); ipmi->IfLeave(); return rv; } static SaErrorT IpmiAddIdrArea( void *, SaHpiResourceIdT, SaHpiIdrIdT, SaHpiIdrAreaTypeT, SaHpiEntryIdT * ) __attribute__((used)); static SaErrorT IpmiAddIdrArea( void *hnd, SaHpiResourceIdT id, SaHpiIdrIdT idrid, SaHpiIdrAreaTypeT areatype, SaHpiEntryIdT *areaid ) { cIpmi *ipmi = 0; cIpmiInventory *inv = VerifyInventoryAndEnter( hnd, id, idrid, ipmi ); if ( !inv ) return SA_ERR_HPI_NOT_PRESENT; SaErrorT rv = inv->AddIdrArea( idrid, areatype, *areaid ); ipmi->IfLeave(); return rv; } static SaErrorT IpmiDelIdrArea( void *, SaHpiResourceIdT, SaHpiIdrIdT, SaHpiEntryIdT ) __attribute__((used)); static SaErrorT IpmiDelIdrArea( void *hnd, SaHpiResourceIdT id, SaHpiIdrIdT idrid, SaHpiEntryIdT areaid ) { cIpmi *ipmi = 0; cIpmiInventory *inv = VerifyInventoryAndEnter( hnd, id, idrid, ipmi ); if ( !inv ) return SA_ERR_HPI_NOT_PRESENT; SaErrorT rv = inv->DelIdrArea( idrid, areaid ); ipmi->IfLeave(); return rv; } static SaErrorT IpmiGetIdrField( void *, SaHpiResourceIdT, SaHpiIdrIdT, SaHpiEntryIdT, SaHpiIdrFieldTypeT, SaHpiEntryIdT, SaHpiEntryIdT *, SaHpiIdrFieldT * ) __attribute__((used)); static SaErrorT IpmiGetIdrField( void *hnd, SaHpiResourceIdT id, SaHpiIdrIdT idrid, SaHpiEntryIdT areaid, SaHpiIdrFieldTypeT fieldtype, SaHpiEntryIdT fieldid, SaHpiEntryIdT *nextfieldid, SaHpiIdrFieldT *field ) { cIpmi *ipmi = 0; cIpmiInventory *inv = VerifyInventoryAndEnter( hnd, id, idrid, ipmi ); if ( !inv ) return SA_ERR_HPI_NOT_PRESENT; SaErrorT rv = inv->GetIdrField( idrid, areaid, fieldtype, fieldid, *nextfieldid, *field ); ipmi->IfLeave(); return rv; } static SaErrorT IpmiAddIdrField( void *, SaHpiResourceIdT, SaHpiIdrIdT, SaHpiIdrFieldT * ) __attribute__((used)); static SaErrorT IpmiAddIdrField( void *hnd, SaHpiResourceIdT id, SaHpiIdrIdT idrid, SaHpiIdrFieldT *field ) { cIpmi *ipmi = 0; cIpmiInventory *inv = VerifyInventoryAndEnter( hnd, id, idrid, ipmi ); if ( !inv ) return SA_ERR_HPI_NOT_PRESENT; SaErrorT rv = inv->AddIdrField( idrid, *field ); ipmi->IfLeave(); return rv; } static SaErrorT IpmiSetIdrField( void *, SaHpiResourceIdT, SaHpiIdrIdT, SaHpiIdrFieldT * ) __attribute__((used)); static SaErrorT IpmiSetIdrField( void *hnd, SaHpiResourceIdT id, SaHpiIdrIdT idrid, SaHpiIdrFieldT *field ) { cIpmi *ipmi = 0; cIpmiInventory *inv = VerifyInventoryAndEnter( hnd, id, idrid, ipmi ); if ( !inv ) return SA_ERR_HPI_NOT_PRESENT; SaErrorT rv = inv->SetIdrField( idrid, *field ); ipmi->IfLeave(); return rv; } static SaErrorT IpmiDelIdrField( void *, SaHpiResourceIdT, SaHpiIdrIdT, SaHpiEntryIdT, SaHpiEntryIdT ) __attribute__((used)); static SaErrorT IpmiDelIdrField( void *hnd, SaHpiResourceIdT id, SaHpiIdrIdT idrid, SaHpiEntryIdT areaid, SaHpiEntryIdT fieldid ) { cIpmi *ipmi = 0; cIpmiInventory *inv = VerifyInventoryAndEnter( hnd, id, idrid, ipmi ); if ( !inv ) return SA_ERR_HPI_NOT_PRESENT; SaErrorT rv = inv->DelIdrField( idrid, areaid, fieldid ); ipmi->IfLeave(); return rv; } static SaErrorT IpmiGetSelInfo( void *, SaHpiResourceIdT, SaHpiEventLogInfoT * ) __attribute__((used)); static SaErrorT IpmiGetSelInfo( void *hnd, SaHpiResourceIdT id, SaHpiEventLogInfoT *info ) { cIpmi *ipmi = 0; cIpmiSel *sel = VerifySelAndEnter( hnd, id, ipmi ); if ( !sel ) return SA_ERR_HPI_NOT_PRESENT; SaErrorT rv = sel->GetSelInfo( *info ); ipmi->IfLeave(); return rv; } static SaErrorT IpmiSetSelTime( void *, SaHpiResourceIdT, SaHpiTimeT ) __attribute__((used)); static SaErrorT IpmiSetSelTime( void *hnd, SaHpiResourceIdT id, SaHpiTimeT t ) { cIpmi *ipmi = 0; cIpmiSel *sel = VerifySelAndEnter( hnd, id, ipmi ); if ( !sel ) return SA_ERR_HPI_NOT_PRESENT; SaErrorT rv = sel->SetSelTime( t ); ipmi->IfLeave(); return rv; } static SaErrorT IpmiAddSelEntry( void *, SaHpiResourceIdT, const SaHpiEventT * ) __attribute__((used)); static SaErrorT IpmiAddSelEntry( void *hnd, SaHpiResourceIdT id, const SaHpiEventT *Event ) { cIpmi *ipmi = 0; cIpmiSel *sel = VerifySelAndEnter( hnd, id, ipmi ); if ( !sel ) return SA_ERR_HPI_NOT_PRESENT; SaErrorT rv = sel->AddSelEntry( *Event ); ipmi->IfLeave(); return rv; } #ifdef NOTUSED static SaErrorT IpmiDelSelEntry( void *, SaHpiResourceIdT, SaHpiEventLogEntryIdT ) __attribute__((used)); static SaErrorT IpmiDelSelEntry( void *hnd, SaHpiResourceIdT id, SaHpiEventLogEntryIdT sid ) { cIpmi *ipmi = 0; cIpmiSel *sel = VerifySelAndEnter( hnd, id, ipmi ); if ( !sel ) return SA_ERR_HPI_NOT_PRESENT; SaErrorT rv = sel->DeleteSelEntry( sid ); ipmi->IfLeave(); return rv; } #endif static SaErrorT IpmiGetSelEntry( void *hnd, SaHpiResourceIdT, SaHpiEventLogEntryIdT, SaHpiEventLogEntryIdT *, SaHpiEventLogEntryIdT *, SaHpiEventLogEntryT *, SaHpiRdrT *, SaHpiRptEntryT * ) __attribute__((used)); static SaErrorT IpmiGetSelEntry( void *hnd, SaHpiResourceIdT id, SaHpiEventLogEntryIdT current, SaHpiEventLogEntryIdT *prev, SaHpiEventLogEntryIdT *next, SaHpiEventLogEntryT *entry, SaHpiRdrT *rdr, SaHpiRptEntryT *rptentry ) { cIpmi *ipmi = 0; cIpmiSel *sel = VerifySelAndEnter( hnd, id, ipmi ); if ( !sel ) return SA_ERR_HPI_NOT_PRESENT; SaErrorT rv = sel->GetSelEntry( current, *prev, *next, *entry, *rdr, *rptentry ); ipmi->IfLeave(); return rv; } static SaErrorT IpmiClearSel( void *, SaHpiResourceIdT ) __attribute__((used)); static SaErrorT IpmiClearSel( void *hnd, SaHpiResourceIdT id ) { cIpmi *ipmi = 0; cIpmiSel *sel = VerifySelAndEnter( hnd, id, ipmi ); if ( !sel ) return SA_ERR_HPI_NOT_PRESENT; SaErrorT rv = sel->ClearSel(); ipmi->IfLeave(); return rv; } static SaErrorT IpmiHotswapPolicyCancel( void *, SaHpiResourceIdT, SaHpiTimeoutT ) __attribute__((used)); static SaErrorT IpmiHotswapPolicyCancel( void *hnd, SaHpiResourceIdT id, SaHpiTimeoutT timeout) { cIpmi *ipmi = 0; cIpmiResource *res = VerifyResourceAndEnter( hnd, id, ipmi ); if ( !res ) return SA_ERR_HPI_NOT_PRESENT; SaErrorT rv = ipmi->IfHotswapPolicyCancel( res, timeout ); ipmi->IfLeave(); return rv; } static SaErrorT IpmiSetAutoInsertTimeout( void *, SaHpiTimeoutT ) __attribute__((used)); static SaErrorT IpmiSetAutoInsertTimeout( void *hnd, SaHpiTimeoutT timeout) { cIpmi *ipmi = VerifyIpmi( hnd ); if ( !ipmi ) { return SA_ERR_HPI_INTERNAL_ERROR; } SaErrorT rv = ipmi->IfSetAutoInsertTimeout( timeout ); ipmi->IfLeave(); return rv; } static SaErrorT IpmiGetAutoExtractTimeout( void *, SaHpiResourceIdT, SaHpiTimeoutT * ) __attribute__((used)); static SaErrorT IpmiGetAutoExtractTimeout( void *hnd, SaHpiResourceIdT id, SaHpiTimeoutT *timeout ) { cIpmi *ipmi = 0; cIpmiResource *res = VerifyResourceAndEnter( hnd, id, ipmi ); if ( !res ) return SA_ERR_HPI_NOT_PRESENT; SaErrorT rv = ipmi->IfGetAutoExtractTimeout( res, *timeout ); ipmi->IfLeave(); return rv; } static SaErrorT IpmiSetAutoExtractTimeout( void *, SaHpiResourceIdT, SaHpiTimeoutT ) __attribute__((used)); static SaErrorT IpmiSetAutoExtractTimeout( void *hnd, SaHpiResourceIdT id, SaHpiTimeoutT timeout ) { cIpmi *ipmi = 0; cIpmiResource *res = VerifyResourceAndEnter( hnd, id, ipmi ); if ( !res ) return SA_ERR_HPI_NOT_PRESENT; SaErrorT rv = ipmi->IfSetAutoExtractTimeout( res, timeout ); ipmi->IfLeave(); return rv; } static SaErrorT IpmiGetHotswapState( void *, SaHpiResourceIdT , SaHpiHsStateT * ) __attribute__((used)); static SaErrorT IpmiGetHotswapState( void *hnd, SaHpiResourceIdT id, SaHpiHsStateT *state ) { cIpmi *ipmi = 0; cIpmiResource *res = VerifyResourceAndEnter( hnd, id, ipmi ); if ( !res ) return SA_ERR_HPI_NOT_PRESENT; SaErrorT rv = ipmi->IfGetHotswapState( res, *state ); ipmi->IfLeave(); return rv; } static SaErrorT IpmiSetHotswapState( void *, SaHpiResourceIdT, SaHpiHsStateT ) __attribute__((used)); static SaErrorT IpmiSetHotswapState( void *hnd, SaHpiResourceIdT id, SaHpiHsStateT state ) { cIpmi *ipmi = 0; cIpmiResource *res = VerifyResourceAndEnter( hnd, id, ipmi ); if ( !res ) return SA_ERR_HPI_NOT_PRESENT; SaErrorT rv = ipmi->IfSetHotswapState( res, state ); ipmi->IfLeave(); return rv; } static SaErrorT IpmiRequestHotswapAction( void *, SaHpiResourceIdT, SaHpiHsActionT ) __attribute__((used)); static SaErrorT IpmiRequestHotswapAction( void *hnd, SaHpiResourceIdT id, SaHpiHsActionT act ) { cIpmi *ipmi = 0; cIpmiResource *res = VerifyResourceAndEnter( hnd, id, ipmi ); if ( !res ) return SA_ERR_HPI_NOT_PRESENT; SaErrorT rv = ipmi->IfRequestHotswapAction( res, act ); ipmi->IfLeave(); return rv; } static SaErrorT IpmiGetPowerState( void *, SaHpiResourceIdT, SaHpiPowerStateT * ) __attribute__((used)); static SaErrorT IpmiGetPowerState( void *hnd, SaHpiResourceIdT id, SaHpiPowerStateT *state ) { cIpmi *ipmi = 0; cIpmiResource *res = VerifyResourceAndEnter( hnd, id, ipmi ); if ( !res ) return SA_ERR_HPI_NOT_PRESENT; SaErrorT rv = ipmi->IfGetPowerState( res, *state ); ipmi->IfLeave(); return rv; } static SaErrorT IpmiSetPowerState( void *, SaHpiResourceIdT, SaHpiPowerStateT ) __attribute__((used)); static SaErrorT IpmiSetPowerState( void *hnd, SaHpiResourceIdT id, SaHpiPowerStateT state ) { cIpmi *ipmi = 0; cIpmiResource *res = VerifyResourceAndEnter( hnd, id, ipmi ); if ( !res ) return SA_ERR_HPI_NOT_PRESENT; SaErrorT rv = ipmi->IfSetPowerState( res, state ); ipmi->IfLeave(); return rv; } static SaErrorT IpmiGetIndicatorState( void *, SaHpiResourceIdT, SaHpiHsIndicatorStateT * ) __attribute__((used)); static SaErrorT IpmiGetIndicatorState( void *hnd, SaHpiResourceIdT id, SaHpiHsIndicatorStateT *state ) { cIpmi *ipmi = 0; cIpmiResource *res = VerifyResourceAndEnter( hnd, id, ipmi ); if ( !res ) return SA_ERR_HPI_NOT_PRESENT; SaErrorT rv = ipmi->IfGetIndicatorState( res, *state ); ipmi->IfLeave(); return rv; } static SaErrorT IpmiSetIndicatorState( void *, SaHpiResourceIdT, SaHpiHsIndicatorStateT ) __attribute__((used)); static SaErrorT IpmiSetIndicatorState( void *hnd, SaHpiResourceIdT id, SaHpiHsIndicatorStateT state ) { cIpmi *ipmi = 0; cIpmiResource *res = VerifyResourceAndEnter( hnd, id, ipmi ); if ( !res ) return SA_ERR_HPI_NOT_PRESENT; SaErrorT rv = ipmi->IfSetIndicatorState( res, state ); ipmi->IfLeave(); return rv; } static SaErrorT IpmiControlParm( void *, SaHpiResourceIdT, SaHpiParmActionT ) __attribute__((used)); static SaErrorT IpmiControlParm( void *hnd, SaHpiResourceIdT id, SaHpiParmActionT act ) { cIpmi *ipmi = 0; cIpmiResource *res = VerifyResourceAndEnter( hnd, id, ipmi ); if ( !res ) return SA_ERR_HPI_NOT_PRESENT; SaErrorT rv = ipmi->IfControlParm( res, act ); ipmi->IfLeave(); return rv; } static SaErrorT IpmiGetResetState( void *, SaHpiResourceIdT, SaHpiResetActionT * ) __attribute__((used)); static SaErrorT IpmiGetResetState( void *hnd, SaHpiResourceIdT id, SaHpiResetActionT *act ) { cIpmi *ipmi = 0; cIpmiResource *res = VerifyResourceAndEnter( hnd, id, ipmi ); if ( !res ) return SA_ERR_HPI_NOT_PRESENT; SaErrorT rv = ipmi->IfGetResetState( res, *act ); ipmi->IfLeave(); return rv; } static SaErrorT IpmiSetResetState( void *, SaHpiResourceIdT, SaHpiResetActionT ) __attribute__((used)); static SaErrorT IpmiSetResetState( void *hnd, SaHpiResourceIdT id, SaHpiResetActionT act ) { cIpmi *ipmi = 0; cIpmiResource *res = VerifyResourceAndEnter( hnd, id, ipmi ); if ( !res ) return SA_ERR_HPI_NOT_PRESENT; SaErrorT rv = ipmi->IfSetResetState( res, act ); ipmi->IfLeave(); return rv; } static SaErrorT IpmiGetWatchdogInfo(void *, SaHpiResourceIdT, SaHpiWatchdogNumT, SaHpiWatchdogT *) __attribute__((used)); static SaErrorT IpmiGetWatchdogInfo(void *hnd, SaHpiResourceIdT id, SaHpiWatchdogNumT num, SaHpiWatchdogT *watchdog) { cIpmi *ipmi = 0; cIpmiWatchdog *wd = VerifyWatchdogAndEnter( hnd, id, num, ipmi ); if ( !wd ) return SA_ERR_HPI_NOT_PRESENT; SaErrorT rv = wd->GetWatchdogInfo( *watchdog ); ipmi->IfLeave(); return rv; } static SaErrorT IpmiSetWatchdogInfo(void *, SaHpiResourceIdT, SaHpiWatchdogNumT, SaHpiWatchdogT *) __attribute__((used)); static SaErrorT IpmiSetWatchdogInfo(void *hnd, SaHpiResourceIdT id, SaHpiWatchdogNumT num, SaHpiWatchdogT *watchdog) { cIpmi *ipmi = 0; cIpmiWatchdog *wd = VerifyWatchdogAndEnter( hnd, id, num, ipmi ); if ( !wd ) return SA_ERR_HPI_NOT_PRESENT; SaErrorT rv = wd->SetWatchdogInfo( *watchdog ); ipmi->IfLeave(); return rv; } static SaErrorT IpmiResetWatchdog(void *, SaHpiResourceIdT, SaHpiWatchdogNumT) __attribute__((used)); static SaErrorT IpmiResetWatchdog(void *hnd, SaHpiResourceIdT id, SaHpiWatchdogNumT num) { cIpmi *ipmi = 0; cIpmiWatchdog *wd = VerifyWatchdogAndEnter( hnd, id, num, ipmi ); if ( !wd ) return SA_ERR_HPI_NOT_PRESENT; SaErrorT rv = wd->ResetWatchdog(); ipmi->IfLeave(); return rv; } } // new plugin_loader extern "C" { void * oh_open (GHashTable *, unsigned int, oh_evt_queue *) __attribute__ ((weak, alias("IpmiOpen"))); void * oh_close (void *) __attribute__ ((weak, alias("IpmiClose"))); void * oh_get_event (void *) __attribute__ ((weak, alias("IpmiGetEvent"))); void * oh_discover_resources (void *) __attribute__ ((weak, alias("IpmiDiscoverResources"))); void * oh_set_resource_tag (void *, SaHpiResourceIdT, SaHpiTextBufferT *) __attribute__ ((weak, alias("IpmiSetResourceTag"))); void * oh_set_resource_severity (void *, SaHpiResourceIdT, SaHpiSeverityT) __attribute__ ((weak, alias("IpmiSetResourceSeverity"))); void * oh_get_el_info (void *, SaHpiResourceIdT, SaHpiEventLogInfoT *) __attribute__ ((weak, alias("IpmiGetSelInfo"))); void * oh_set_el_time (void *, SaHpiResourceIdT, const SaHpiEventT *) __attribute__ ((weak, alias("IpmiSetSelTime"))); void * oh_add_el_entry (void *, SaHpiResourceIdT, const SaHpiEventT *) __attribute__ ((weak, alias("IpmiAddSelEntry"))); void * oh_get_el_entry (void *, SaHpiResourceIdT, SaHpiEventLogEntryIdT, SaHpiEventLogEntryIdT *, SaHpiEventLogEntryIdT *, SaHpiEventLogEntryT *, SaHpiRdrT *, SaHpiRptEntryT *) __attribute__ ((weak, alias("IpmiGetSelEntry"))); void * oh_clear_el (void *, SaHpiResourceIdT) __attribute__ ((weak, alias("IpmiClearSel"))); void * oh_get_sensor_reading (void *, SaHpiResourceIdT, SaHpiSensorNumT, SaHpiSensorReadingT *, SaHpiEventStateT *) __attribute__ ((weak, alias("IpmiGetSensorReading"))); void * oh_get_sensor_thresholds (void *, SaHpiResourceIdT, SaHpiSensorNumT, SaHpiSensorThresholdsT *) __attribute__ ((weak, alias("IpmiGetSensorThresholds"))); void * oh_set_sensor_thresholds (void *, SaHpiResourceIdT, SaHpiSensorNumT, const SaHpiSensorThresholdsT *) __attribute__ ((weak, alias("IpmiSetSensorThresholds"))); void * oh_get_sensor_enable (void *, SaHpiResourceIdT, SaHpiSensorNumT, SaHpiBoolT *) __attribute__ ((weak, alias("IpmiGetSensorEnable"))); void * oh_set_sensor_enable (void *, SaHpiResourceIdT, SaHpiSensorNumT, SaHpiBoolT) __attribute__ ((weak, alias("IpmiSetSensorEnable"))); void * oh_get_sensor_event_enables (void *, SaHpiResourceIdT, SaHpiSensorNumT, SaHpiBoolT *) __attribute__ ((weak, alias("IpmiGetSensorEventEnables"))); void * oh_set_sensor_event_enables (void *, SaHpiResourceIdT id, SaHpiSensorNumT, SaHpiBoolT *) __attribute__ ((weak, alias("IpmiSetSensorEventEnables"))); void * oh_get_sensor_event_masks (void *, SaHpiResourceIdT, SaHpiSensorNumT, SaHpiEventStateT *, SaHpiEventStateT *) __attribute__ ((weak, alias("IpmiGetSensorEventMasks"))); void * oh_set_sensor_event_masks (void *, SaHpiResourceIdT, SaHpiSensorNumT, SaHpiSensorEventMaskActionT, SaHpiEventStateT, SaHpiEventStateT) __attribute__ ((weak, alias("IpmiSetSensorEventMasks"))); void * oh_get_control_state (void *, SaHpiResourceIdT, SaHpiCtrlNumT, SaHpiCtrlModeT *, SaHpiCtrlStateT *) __attribute__ ((weak, alias("IpmiGetControlState"))); void * oh_set_control_state (void *, SaHpiResourceIdT,SaHpiCtrlNumT, SaHpiCtrlModeT, SaHpiCtrlStateT *) __attribute__ ((weak, alias("IpmiSetControlState"))); void * oh_get_idr_info (void *hnd, SaHpiResourceIdT, SaHpiIdrIdT,SaHpiIdrInfoT) __attribute__ ((weak, alias("IpmiGetIdrInfo"))); void * oh_get_idr_area_header (void *, SaHpiResourceIdT, SaHpiIdrIdT, SaHpiIdrAreaTypeT, SaHpiEntryIdT, SaHpiEntryIdT, SaHpiIdrAreaHeaderT) __attribute__ ((weak, alias("IpmiGetIdrAreaHeader"))); void * oh_add_idr_area (void *, SaHpiResourceIdT, SaHpiIdrIdT, SaHpiIdrAreaTypeT, SaHpiEntryIdT) __attribute__ ((weak, alias("IpmiAddIdrArea"))); void * oh_del_idr_area (void *, SaHpiResourceIdT, SaHpiIdrIdT, SaHpiEntryIdT) __attribute__ ((weak, alias("IpmiDelIdrArea"))); void * oh_get_idr_field (void *, SaHpiResourceIdT, SaHpiIdrIdT, SaHpiEntryIdT, SaHpiIdrFieldTypeT, SaHpiEntryIdT, SaHpiEntryIdT, SaHpiIdrFieldT) __attribute__ ((weak, alias("IpmiGetIdrField"))); void * oh_add_idr_field (void *, SaHpiResourceIdT, SaHpiIdrIdT, SaHpiIdrFieldT) __attribute__ ((weak, alias("IpmiAddIdrField"))); void * oh_set_idr_field (void *, SaHpiResourceIdT, SaHpiIdrIdT, SaHpiIdrFieldT) __attribute__ ((weak, alias("IpmiSetIdrField"))); void * oh_del_idr_field (void *, SaHpiResourceIdT, SaHpiIdrIdT, SaHpiEntryIdT, SaHpiEntryIdT) __attribute__ ((weak, alias("IpmiDelIdrField"))); void * oh_hotswap_policy_cancel (void *, SaHpiResourceIdT, SaHpiTimeoutT) __attribute__ ((weak, alias("IpmiHotswapPolicyCancel"))); void * oh_set_autoinsert_timeout (void *, SaHpiTimeoutT) __attribute__ ((weak, alias("IpmiSetAutoInsertTimeout"))); void * oh_get_autoextract_timeout (void *, SaHpiResourceIdT, SaHpiTimeoutT *) __attribute__ ((weak, alias("IpmiGetAutoExtractTimeout"))); void * oh_set_autoextract_timeout (void *, SaHpiResourceIdT, SaHpiTimeoutT) __attribute__ ((weak, alias("IpmiSetAutoExtractTimeout"))); void * oh_get_hotswap_state (void *, SaHpiResourceIdT, SaHpiHsStateT *) __attribute__ ((weak, alias("IpmiGetHotswapState"))); void * oh_set_hotswap_state (void *, SaHpiResourceIdT, SaHpiHsStateT) __attribute__ ((weak, alias("IpmiSetHotswapState"))); void * oh_request_hotswap_action (void *, SaHpiResourceIdT, SaHpiHsActionT) __attribute__ ((weak, alias("IpmiRequestHotswapAction"))); void * oh_get_power_state (void *, SaHpiResourceIdT, SaHpiPowerStateT *) __attribute__ ((weak, alias("IpmiGetPowerState"))); void * oh_set_power_state (void *, SaHpiResourceIdT, SaHpiPowerStateT) __attribute__ ((weak, alias("IpmiSetPowerState"))); void * oh_get_indicator_state (void *, SaHpiResourceIdT, SaHpiHsIndicatorStateT *) __attribute__ ((weak, alias("IpmiGetIndicatorState"))); void * oh_set_indicator_state (void *, SaHpiResourceIdT, SaHpiHsIndicatorStateT) __attribute__ ((weak, alias("IpmiSetIndicatorState"))); void * oh_control_parm (void *, SaHpiResourceIdT, SaHpiParmActionT) __attribute__ ((weak, alias("IpmiControlParm"))); void * oh_get_reset_state (void *, SaHpiResourceIdT, SaHpiResetActionT *) __attribute__ ((weak, alias("IpmiGetResetState"))); void * oh_set_reset_state (void *, SaHpiResourceIdT, SaHpiResetActionT) __attribute__ ((weak, alias("IpmiSetResetState"))); void * oh_get_watchdog_info (void *, SaHpiResourceIdT, SaHpiWatchdogNumT, SaHpiWatchdogT *) __attribute__ ((weak, alias("IpmiGetWatchdogInfo"))); void * oh_set_watchdog_info (void *, SaHpiResourceIdT, SaHpiWatchdogNumT, SaHpiWatchdogT *) __attribute__ ((weak, alias("IpmiSetWatchdogInfo"))); void * oh_reset_watchdog (void *, SaHpiResourceIdT , SaHpiWatchdogNumT ) __attribute__ ((weak, alias("IpmiResetWatchdog"))); } static unsigned int GetIntNotNull( GHashTable *handler_config, const char *str, unsigned int def = 0 ) { const char *value = (const char *)g_hash_table_lookup(handler_config, str ); if ( !value ) return def; unsigned int v = strtol( value, 0, 0 ); if ( v == 0 ) return def; return v; } static SaHpiTimeoutT GetTimeout( GHashTable *handler_config, const char *str, SaHpiTimeoutT def ) { const char *value = (const char *)g_hash_table_lookup(handler_config, str ); if ( !value ) return def; int v = strtol( value, 0, 0 ); if ( v == 0 ) return SAHPI_TIMEOUT_IMMEDIATE; if ( v == -1 ) return SAHPI_TIMEOUT_BLOCK; SaHpiTimeoutT timeout = v * 1000000000; return timeout; } cIpmi::cIpmi() : m_magic( dIpmiMagic ), m_handler( 0 ) { } cIpmi::~cIpmi() { } void cIpmi::SetHandler( oh_handler_state *handler ) { m_handler = handler; } // wrapper class move async events to domain class cIpmiConLanDomain : public cIpmiConLan { cIpmiDomain *m_domain; public: cIpmiConLanDomain( cIpmiDomain *domain, unsigned int timeout, int log_level, struct in_addr addr, int port, tIpmiAuthType auth, tIpmiPrivilege priv, char *user, char *passwd ) : cIpmiConLan( timeout, log_level, addr, port, auth, priv, user, passwd ), m_domain( domain ) { } virtual ~cIpmiConLanDomain() { } virtual void HandleAsyncEvent( const cIpmiAddr &addr, const cIpmiMsg &msg ) { m_domain->HandleAsyncEvent( addr, msg ); } }; // wrapper class move async events to domain class cIpmiConSmiDomain : public cIpmiConSmi { cIpmiDomain *m_domain; public: cIpmiConSmiDomain( cIpmiDomain *domain, unsigned int timeout, int log_level, int if_num ) : cIpmiConSmi( timeout, log_level, if_num ), m_domain( domain ) { } virtual ~cIpmiConSmiDomain() { } virtual void HandleAsyncEvent( const cIpmiAddr &addr, const cIpmiMsg &msg ) { m_domain->HandleAsyncEvent( addr, msg ); } }; cIpmiCon * cIpmi::AllocConnection( GHashTable *handler_config ) { // default is 5s for IPMI m_con_ipmi_timeout = GetIntNotNull( handler_config, "IpmiConnectionTimeout", 5000 ); stdlog << "AllocConnection: IPMITimeout " << m_con_ipmi_timeout << " ms.\n"; // default is 1s for ATCA systems m_con_atca_timeout = GetIntNotNull( handler_config, "AtcaConnectionTimeout", 1000 ); stdlog << "AllocConnection: AtcaTimeout " << m_con_atca_timeout << " ms.\n"; unsigned int enable_sel_on_all = GetIntNotNull( handler_config, "EnableSelOnAll", 0 ); if ( enable_sel_on_all == 1 ) { m_enable_sel_on_all = true; stdlog << "AllocConnection: Enable SEL on all MCs.\n"; } else { m_enable_sel_on_all = false; stdlog << "AllocConnection: Enable SEL only on BMC.\n"; } // outstanding messages 0 => read from BMC/ShMc m_max_outstanding = GetIntNotNull( handler_config, "MaxOutstanding", 0 ); if ( m_max_outstanding > 256 ) m_max_outstanding = 256; stdlog << "AllocConnection: Max Outstanding IPMI messages " << m_max_outstanding << ".\n"; unsigned int poll_alive = GetIntNotNull( handler_config, "AtcaPollAliveMCs", 0 ); if ( poll_alive == 1 ) { m_atca_poll_alive_mcs = true; stdlog << "AllocConnection: Poll alive MCs.\n"; } else { m_atca_poll_alive_mcs = false; stdlog << "AllocConnection: Don't poll alive MCs.\n"; } m_own_domain = false; /** This code block has been commented out due to the ** multi-domain changes in the infrastructure. ** (Renier Morales 11/21/06) const char *create_own_domain = (const char *)g_hash_table_lookup(handler_config, "MultipleDomains"); if ((create_own_domain != (char *)NULL) && ((strcmp(create_own_domain, "YES") == 0) || (strcmp(create_own_domain, "yes") == 0))) { int *hid = (int *)g_hash_table_lookup(handler_config, "handler-id"); if (hid) { m_own_domain = true; m_handler_id = *hid; stdlog << "AllocConnection: Multi domain handler " << *hid << "\n"; const char *domain_tag = (const char *)g_hash_table_lookup(handler_config, "DomainTag"); if (domain_tag != NULL) { m_domain_tag.SetAscii(domain_tag, SAHPI_TL_TYPE_TEXT, SAHPI_LANG_ENGLISH); } } }*/ m_insert_timeout = GetTimeout( handler_config, "InsertTimeout", SAHPI_TIMEOUT_IMMEDIATE ); m_extract_timeout = GetTimeout( handler_config, "ExtractTimeout", SAHPI_TIMEOUT_IMMEDIATE ); const char *name = (const char *)g_hash_table_lookup(handler_config, "name"); if ( !name ) { stdlog << "Empty parameter !\n"; return 0; } stdlog << "IpmiAllocConnection: connection name = '" << name << "'.\n"; if ( !strcmp( name, "lan" ) || !strcmp( name, "rmcp" ) ) { const char *addr; struct in_addr lan_addr; int lan_port = dIpmiConLanStdPort; tIpmiAuthType auth = eIpmiAuthTypeNone; tIpmiPrivilege priv = eIpmiPrivilegeAdmin; char user[32] = ""; char passwd[32] = ""; char *value; struct hostent *ent; // Address addr = (const char *)g_hash_table_lookup(handler_config, "addr"); if ( !addr ) { stdlog << "TCP/IP address missing in config file !\n"; return 0; } stdlog << "AllocConnection: addr = '" << addr << "'.\n"; ent = gethostbyname( addr ); if ( !ent ) { stdlog << "Unable to resolve IPMI LAN address: " << addr << " !\n"; return 0; } memcpy( &lan_addr, ent->h_addr_list[0], ent->h_length ); unsigned int a = *(unsigned int *)(void *)ent->h_addr_list[0]; stdlog << "Using host at " << (int)(a & 0xff) << "." << (int)((a >> 8 ) & 0xff) << "." << (int)((a >> 16) & 0xff) << "." << (int)((a >> 24) & 0xff) << ".\n"; // Port lan_port = GetIntNotNull( handler_config, "port", 623 ); stdlog << "AllocConnection: port = " << lan_port << ".\n"; // Authentication type value = (char *)g_hash_table_lookup( handler_config, "auth_type" ); if ( value ) { if ( !strcmp( value, "none" ) ) auth = eIpmiAuthTypeNone; else if ( !strcmp( value, "straight" ) ) auth = eIpmiAuthTypeStraight; else if ( !strcmp( value, "md2" ) ) #ifdef HAVE_OPENSSL_MD2_H auth = eIpmiAuthTypeMd2; #else { stdlog << "MD2 is not supported. Please install SSL and recompile.\n"; return 0; } #endif else if ( !strcmp( value, "md5" ) ) #ifdef HAVE_OPENSSL_MD5_H auth = eIpmiAuthTypeMd5; #else { stdlog << "MD5 is not supported. Please install SSL and recompile.\n"; return 0; } #endif else { stdlog << "Invalid IPMI LAN authentication method '" << value << "' !\n"; return 0; } } stdlog << "AllocConnection: authority: " << value << "(" << auth << ").\n"; // Priviledge value = (char *)g_hash_table_lookup(handler_config, "auth_level" ); if ( value ) { if ( !strcmp( value, "operator" ) ) priv = eIpmiPrivilegeOperator; else if ( !strcmp( value, "admin" ) ) priv = eIpmiPrivilegeAdmin; else { stdlog << "Invalid authentication method '" << value << "' !\n"; stdlog << "Only operator and admin are supported !\n"; return 0; } } stdlog << "AllocConnection: priviledge = " << value << "(" << priv << ").\n"; // User Name value = (char *)g_hash_table_lookup( handler_config, "username" ); if ( value ) strncpy( user, value, 32); stdlog << "AllocConnection: user = " << user << ".\n"; // Password value = (char *)g_hash_table_lookup( handler_config, "password" ); if ( value ) strncpy( passwd, value, 32 ); return new cIpmiConLanDomain( this, m_con_ipmi_timeout, dIpmiConLogAll, lan_addr, lan_port, auth, priv, user, passwd ); } else if ( !strcmp( name, "smi" ) ) { const char *addr = (const char *)g_hash_table_lookup(handler_config, "addr"); int if_num = 0; if ( addr ) if_num = strtol( addr, 0, 10 ); stdlog << "AllocConnection: interface number = " << if_num << ".\n"; return new cIpmiConSmiDomain( this, m_con_ipmi_timeout, dIpmiConLogAll, if_num ); } stdlog << "Unknown connection type: " << name << " !\n"; return 0; } void cIpmi::AddHpiEvent( oh_event *event ) { m_event_lock.Lock(); if ( m_handler ) { event->hid = m_handler->hid; oh_evt_queue_push(m_handler->eventq, event); } m_event_lock.Unlock(); } const cIpmiEntityPath & cIpmi::EntityRoot() { return m_entity_root; } oh_handler_state * cIpmi::GetHandler() { return m_handler; } SaHpiRptEntryT * cIpmi::FindResource( SaHpiResourceIdT rid ) { if ( m_handler ) { return oh_get_resource_by_id( m_handler->rptcache, rid); } else { return 0; } } void cIpmi::IfEnter() { ReadLock(); } void cIpmi::IfLeave() { ReadUnlock(); } bool cIpmi::GetParams( GHashTable *handler_config ) { // get mcs to scan char str[100]; for( unsigned int i = 1; i < 0xf1; i++ ) { snprintf( str, sizeof(str), "MC%02x", i ); char *value = (char *)g_hash_table_lookup( handler_config, str ); if ( value == 0 ) { snprintf( str, sizeof(str), "MC%02X", i ); value = (char *)g_hash_table_lookup( handler_config, str ); } if ( value == 0 ) continue; unsigned int properties = 0; char *tokptr; char *tok = strtok_r( value, " \t\n", &tokptr ); while( tok ) { if ( !strcmp( tok, "initial_discover" ) ) properties |= dIpmiMcThreadInitialDiscover; else if ( !strcmp( tok, "poll_alive" ) ) properties |= dIpmiMcThreadPollAliveMc; else if ( !strcmp(tok, "poll_dead" ) ) properties |= dIpmiMcThreadPollDeadMc; else stdlog << "unknown propertiy for MC " << (unsigned char)i << ": " << tok << " !\n"; tok = strtok_r( 0, " \t\n", &tokptr ); } if ( properties == 0 ) continue; char pp[256] = ""; if ( properties & dIpmiMcThreadInitialDiscover ) strcat( pp, " initial_discover" ); if ( properties & dIpmiMcThreadPollAliveMc ) strcat( pp, " poll_alive" ); if ( properties & dIpmiMcThreadPollDeadMc ) strcat( pp, " poll_dead" ); stdlog << "MC " << (unsigned char)i << " properties: " << pp << ".\n"; NewFruInfo( i, 0, SAHPI_ENT_SYS_MGMNT_MODULE, GetFreeSlotForOther( i ), eIpmiAtcaSiteTypeUnknown, properties ); } return true; } bool cIpmi::IfOpen( GHashTable *handler_config ) { const char *entity_root = (const char *)g_hash_table_lookup( handler_config, "entity_root" ); if ( !entity_root ) { err( "entity_root is missing in config file" ); return false; } if ( !m_entity_root.FromString( entity_root ) ) { err( "cannot decode entity path string" ); return false; } cIpmiCon *con = AllocConnection( handler_config ); if ( !con ) { stdlog << "IPMI cannot alloc connection !\n"; return false; } if ( !GetParams( handler_config ) ) { delete con; return false; } bool rv = con->Open(); if ( rv == false ) { stdlog << "IPMI open connection fails !\n"; delete con; return false; } if ( !Init( con ) ) { IfClose(); return false; } return true; } void cIpmi::IfClose() { Cleanup(); if ( m_con ) { delete m_con; m_con = 0; } } int cIpmi::IfGetEvent( oh_event *event ) { int rv = 0; m_event_lock.Lock(); m_event_lock.Unlock(); return rv; } SaErrorT cIpmi::IfDiscoverResources() { dbg( "ipmidirect discover_resources"); bool loop; do { usleep( 10000 ); m_initial_discover_lock.Lock(); loop = m_initial_discover ? true : false; m_initial_discover_lock.Unlock(); } while( loop ); return SA_OK; } SaErrorT cIpmi::IfSetResourceTag( cIpmiResource *ent, SaHpiTextBufferT *tag ) { // change tag in plugin cache SaHpiRptEntryT *rptentry = oh_get_resource_by_id( ent->Domain()->GetHandler()->rptcache, ent->m_resource_id ); if ( !rptentry ) return SA_ERR_HPI_NOT_PRESENT; memcpy(&rptentry->ResourceTag, tag, sizeof(SaHpiTextBufferT)); oh_add_resource(ent->Domain()->GetHandler()->rptcache, rptentry, ent, 1); return SA_OK; } SaErrorT cIpmi::IfSetResourceSeverity( cIpmiResource *ent, SaHpiSeverityT sev ) { // change severity in plugin cache SaHpiRptEntryT *rptentry = oh_get_resource_by_id( ent->Domain()->GetHandler()->rptcache, ent->m_resource_id ); if ( !rptentry ) return SA_ERR_HPI_NOT_PRESENT; rptentry->ResourceSeverity = sev; oh_add_resource(ent->Domain()->GetHandler()->rptcache, rptentry, ent, 1); return SA_OK; } SaErrorT cIpmi::IfControlParm( cIpmiResource * /*res*/, SaHpiParmActionT act ) { // TODO: implementation switch( act ) { case SAHPI_DEFAULT_PARM: break; case SAHPI_SAVE_PARM: break; case SAHPI_RESTORE_PARM: break; } return SA_OK; } openhpi-2.14.1/plugins/simulator/0000755000076400007640000000000011405006365013671 5ustar openhpi-2.14.1/plugins/simulator/Makefile.am0000644000076400007640000000306011302566612015726 0ustar # -*- linux-c -*- # # (C) Copyright IBM Corp. 2005, 2006 # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This # file and program are licensed under a BSD style license. See # the Copying file included with the OpenHPI distribution for # full licensing terms. # # Author(s): # Christina Hernandez # W. David Ashley # Renier Morales # SUBDIRS = t MAINTAINERCLEANFILES = Makefile.in INCLUDES = @OPENHPI_INCLUDES@ pkglib_LTLIBRARIES = libsimulator.la libsimulator_la_LIBADD = -luuid $(top_builddir)/utils/libopenhpiutils.la libsimulator_la_SOURCES = sim_init.c sim_init.h \ sim_resources2.c sim_resources.h \ sim_sensors.c sim_sensors.h \ sim_sensor_func.c sim_sensor_func.h \ sim_controls.c sim_controls.h \ sim_control_func.c sim_control_func.h \ sim_injector.c sim_injector.h \ sim_el.c sim_el.h \ sim_annunciators.c sim_annunciators.h \ sim_annunciator_func.c sim_annunciator_func.h \ sim_dimi.h sim_dimi.c \ sim_dimi_func.h sim_dimi_func.c \ sim_fumi.h sim_fumi.c \ sim_fumi_func.h sim_fumi_func.c \ sim_power.c sim_power.h \ sim_inventory.c sim_inventory.h \ sim_watchdog.c sim_watchdog.h \ sim_hotswap.c sim_hotswap.h \ sim_reset.c sim_reset.h libsimulator_la_LDFLAGS = -module -version-info @HPI_LIB_VERSION@ openhpi-2.14.1/plugins/simulator/sim_sensors.h0000755000076400007640000000702411302566612016416 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005, 2006 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * Christina Hernandez * W. David Ashley * Renier Morales */ #ifndef __SIM_SENSORS_H #define __SIM_SENSORS_H #include #include #define SIM_MAX_EVENTS_PER_SENSOR 24 #define SIM_MAX_READING_MAPS_PER_SENSOR 3 /* Includes an ending NULL entry */ #define SIM_MAX_SENSOR_EVENT_ARRAY_SIZE (SIM_MAX_EVENTS_PER_SENSOR + 1) #define SIM_MAX_SENSOR_READING_MAP_ARRAY_SIZE (SIM_MAX_READING_MAPS_PER_SENSOR + 1) /******************** * Sensor Definitions ********************/ struct SimSensorThresholdOids { const char *LowMinor; const char *LowMajor; const char *LowCritical; const char *UpMinor; const char *UpMajor; const char *UpCritical; const char *PosThdHysteresis; const char *NegThdHysteresis; const char *TotalPosThdHysteresis; const char *TotalNegThdHysteresis; }; struct SimSensorWritableThresholdOids { const char *LowMinor; const char *LowMajor; const char *LowCritical; const char *UpMinor; const char *UpMajor; const char *UpCritical; const char *PosThdHysteresis; const char *NegThdHysteresis; }; struct sensor_event_map { char *event; SaHpiBoolT event_assertion; SaHpiBoolT event_res_failure; SaHpiBoolT event_res_failure_unexpected; SaHpiEventStateT event_state; SaHpiEventStateT recovery_state; }; struct sensor_reading_map { int num; SaHpiSensorRangeT rangemap; SaHpiEventStateT state; }; struct SensorInfo { SaHpiEventStateT cur_state; /* This really records the last state read from the SEL */ /* Which probably isn't the current state of the sensor */ SaHpiBoolT sensor_enabled; SaHpiBoolT events_enabled; SaHpiEventStateT assert_mask; SaHpiEventStateT deassert_mask; struct sensor_event_map event_array[SIM_MAX_SENSOR_EVENT_ARRAY_SIZE]; struct sensor_reading_map reading2event[SIM_MAX_SENSOR_READING_MAP_ARRAY_SIZE]; SaHpiSensorReadingT reading; SaHpiSensorThresholdsT thres; }; /* struct SensorMoreInfo { SaHpiSensorReadingT reading; SaHpiSensorThresholdsT thres; }; */ struct sim_sensor { /* Usually sensor.Num = index; index is used to search thru sensor arrays. It allows sensor.Num to be independent from array index (e.g. for aggregate sensors) */ int index; SaHpiSensorRecT sensor; struct SensorInfo sensor_info; const char *comment; }; SaErrorT sim_discover_chassis_sensors(struct oh_handler_state *state, struct oh_event *e); SaErrorT sim_discover_cpu_sensors(struct oh_handler_state *state, struct oh_event *e); SaErrorT sim_discover_dasd_sensors(struct oh_handler_state *state, struct oh_event *e); SaErrorT sim_discover_hs_dasd_sensors(struct oh_handler_state *state, struct oh_event *e); SaErrorT sim_discover_fan_sensors(struct oh_handler_state *state, struct oh_event *e); #endif openhpi-2.14.1/plugins/simulator/sim_init.h0000644000076400007640000000355511302566612015667 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * Christina Hernandez * W. David Ashley */ #ifndef _SIM_INIT_H #define _SIM_INIT_H #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include /* handler state list */ extern GSList *sim_handler_states; void *sim_open(GHashTable *handler_config, unsigned int hid, oh_evt_queue *eventq); SaErrorT sim_discover(void *hnd); SaErrorT sim_get_event(void *hnd); SaErrorT sim_close(void *hnd); SaErrorT sim_set_resource_tag(void *hnd, SaHpiResourceIdT id, SaHpiTextBufferT *tag); SaErrorT sim_set_resource_severity(void *hnd, SaHpiResourceIdT rid, SaHpiSeverityT sev); SaErrorT sim_resource_failed_remove(void *hnd, SaHpiResourceIdT rid); #endif openhpi-2.14.1/plugins/simulator/sim_annunciator_func.c0000644000076400007640000002652511302566612020255 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * W. David Ashley */ #include SaErrorT sim_get_next_announce(void *hnd, SaHpiResourceIdT rid, SaHpiAnnunciatorNumT aid, SaHpiSeverityT sev, SaHpiBoolT unackonly, SaHpiAnnouncementT *announcement) { struct oh_handler_state *state = (struct oh_handler_state *)hnd; struct simAnnunciatorInfo *info; if (!hnd || !announcement || oh_lookup_severity(sev) == NULL) { err("Invalid parameter."); return SA_ERR_HPI_INVALID_PARAMS; } /* Check if resource exists and has annunciator capabilities */ SaHpiRptEntryT *rpt = oh_get_resource_by_id(state->rptcache, rid); if (!rpt) { return(SA_ERR_HPI_INVALID_RESOURCE); } if (!(rpt->ResourceCapabilities & SAHPI_CAPABILITY_ANNUNCIATOR)) { return(SA_ERR_HPI_CAPABILITY); } SaHpiRdrT *rdr = oh_get_rdr_by_type(state->rptcache, rid, SAHPI_ANNUNCIATOR_RDR, aid); if (rdr == NULL) return(SA_ERR_HPI_NOT_PRESENT); /* get our announcement info */ info = (struct simAnnunciatorInfo *)oh_get_rdr_data(state->rptcache, rid, rdr->RecordId); if (info == NULL) { err("No annunciator data."); return(SA_ERR_HPI_NOT_PRESENT); } /* perform function */ return oh_announcement_get_next(info->announs, sev, unackonly, announcement); } SaErrorT sim_get_announce(void *hnd, SaHpiResourceIdT rid, SaHpiAnnunciatorNumT aid, SaHpiEntryIdT entry, SaHpiAnnouncementT *announcement) { struct oh_handler_state *state = (struct oh_handler_state *)hnd; struct simAnnunciatorInfo *info; if (!hnd || !announcement) { err("Invalid parameter."); return SA_ERR_HPI_INVALID_PARAMS; } /* Check if resource exists and has annunciator capabilities */ SaHpiRptEntryT *rpt = oh_get_resource_by_id(state->rptcache, rid); if (!rpt) { return(SA_ERR_HPI_INVALID_RESOURCE); } if (!(rpt->ResourceCapabilities & SAHPI_CAPABILITY_ANNUNCIATOR)) { return(SA_ERR_HPI_CAPABILITY); } SaHpiRdrT *rdr = oh_get_rdr_by_type(state->rptcache, rid, SAHPI_ANNUNCIATOR_RDR, aid); if (rdr == NULL) return(SA_ERR_HPI_NOT_PRESENT); /* get our announcement info */ info = (struct simAnnunciatorInfo *)oh_get_rdr_data(state->rptcache, rid, rdr->RecordId); if (info == NULL) { err("No annunciator data."); return(SA_ERR_HPI_NOT_PRESENT); } /* perform function */ return oh_announcement_get(info->announs, entry, announcement); } SaErrorT sim_ack_announce(void *hnd, SaHpiResourceIdT rid, SaHpiAnnunciatorNumT aid, SaHpiEntryIdT entry, SaHpiSeverityT sev) { struct oh_handler_state *state = (struct oh_handler_state *)hnd; struct simAnnunciatorInfo *info; if (!hnd || oh_lookup_severity(sev) == NULL) { err("Invalid parameter."); return SA_ERR_HPI_INVALID_PARAMS; } /* Check if resource exists and has annunciator capabilities */ SaHpiRptEntryT *rpt = oh_get_resource_by_id(state->rptcache, rid); if (!rpt) { return(SA_ERR_HPI_INVALID_RESOURCE); } if (!(rpt->ResourceCapabilities & SAHPI_CAPABILITY_ANNUNCIATOR)) { return(SA_ERR_HPI_CAPABILITY); } SaHpiRdrT *rdr = oh_get_rdr_by_type(state->rptcache, rid, SAHPI_ANNUNCIATOR_RDR, aid); if (rdr == NULL) return(SA_ERR_HPI_NOT_PRESENT); /* get our announcement info */ info = (struct simAnnunciatorInfo *)oh_get_rdr_data(state->rptcache, rid, rdr->RecordId); if (info == NULL) { err("No annunciator data."); return(SA_ERR_HPI_NOT_PRESENT); } /* perform function */ return oh_announcement_ack(info->announs, entry, sev); } SaErrorT sim_add_announce(void *hnd, SaHpiResourceIdT rid, SaHpiAnnunciatorNumT aid, SaHpiAnnouncementT *announcement) { struct oh_handler_state *state = (struct oh_handler_state *)hnd; struct simAnnunciatorInfo *info; if (!hnd || !announcement) { err("Invalid parameter."); return SA_ERR_HPI_INVALID_PARAMS; } /* Check if resource exists and has annunciator capabilities */ SaHpiRptEntryT *rpt = oh_get_resource_by_id(state->rptcache, rid); if (!rpt) { return(SA_ERR_HPI_INVALID_RESOURCE); } if (!(rpt->ResourceCapabilities & SAHPI_CAPABILITY_ANNUNCIATOR)) { return(SA_ERR_HPI_CAPABILITY); } SaHpiRdrT *rdr = oh_get_rdr_by_type(state->rptcache, rid, SAHPI_ANNUNCIATOR_RDR, aid); if (rdr == NULL) return(SA_ERR_HPI_NOT_PRESENT); /* get our announcement info */ info = (struct simAnnunciatorInfo *)oh_get_rdr_data(state->rptcache, rid, rdr->RecordId); if (info == NULL) { err("No annunciator data."); return(SA_ERR_HPI_NOT_PRESENT); } /* perform function */ return oh_announcement_append(info->announs, announcement); } SaErrorT sim_del_announce(void *hnd, SaHpiResourceIdT rid, SaHpiAnnunciatorNumT aid, SaHpiEntryIdT entry, SaHpiSeverityT sev) { struct oh_handler_state *state = (struct oh_handler_state *)hnd; struct simAnnunciatorInfo *info; if (!hnd || oh_lookup_severity(sev) == NULL) { err("Invalid parameter."); return SA_ERR_HPI_INVALID_PARAMS; } /* Check if resource exists and has annunciator capabilities */ SaHpiRptEntryT *rpt = oh_get_resource_by_id(state->rptcache, rid); if (!rpt) { return(SA_ERR_HPI_INVALID_RESOURCE); } if (!(rpt->ResourceCapabilities & SAHPI_CAPABILITY_ANNUNCIATOR)) { return(SA_ERR_HPI_CAPABILITY); } SaHpiRdrT *rdr = oh_get_rdr_by_type(state->rptcache, rid, SAHPI_ANNUNCIATOR_RDR, aid); if (rdr == NULL) return(SA_ERR_HPI_NOT_PRESENT); /* get our announcement info */ info = (struct simAnnunciatorInfo *)oh_get_rdr_data(state->rptcache, rid, rdr->RecordId); if (info == NULL) { err("No annunciator data."); return(SA_ERR_HPI_NOT_PRESENT); } /* perform function */ return oh_announcement_del(info->announs, entry, sev); } SaErrorT sim_get_annunc_mode(void *hnd, SaHpiResourceIdT rid, SaHpiAnnunciatorNumT aid, SaHpiAnnunciatorModeT *mode) { struct oh_handler_state *state = (struct oh_handler_state *)hnd; struct simAnnunciatorInfo *info; if (!hnd || !mode) { err("Invalid parameter."); return SA_ERR_HPI_INVALID_PARAMS; } /* Check if resource exists and has annunciator capabilities */ SaHpiRptEntryT *rpt = oh_get_resource_by_id(state->rptcache, rid); if (!rpt) { return(SA_ERR_HPI_INVALID_RESOURCE); } if (!(rpt->ResourceCapabilities & SAHPI_CAPABILITY_ANNUNCIATOR)) { return(SA_ERR_HPI_CAPABILITY); } SaHpiRdrT *rdr = oh_get_rdr_by_type(state->rptcache, rid, SAHPI_ANNUNCIATOR_RDR, aid); if (rdr == NULL) return(SA_ERR_HPI_NOT_PRESENT); /* get our announcement info */ info = (struct simAnnunciatorInfo *)oh_get_rdr_data(state->rptcache, rid, rdr->RecordId); if (info == NULL) { err("No annunciator data."); return(SA_ERR_HPI_NOT_PRESENT); } *mode = info->mode; return(SA_OK); } SaErrorT sim_set_annunc_mode(void *hnd, SaHpiResourceIdT rid, SaHpiAnnunciatorNumT aid, SaHpiAnnunciatorModeT mode) { struct oh_handler_state *state = (struct oh_handler_state *)hnd; struct simAnnunciatorInfo *info; if (!hnd || oh_lookup_annunciatormode(mode) == NULL) { err("Invalid parameter."); return SA_ERR_HPI_INVALID_PARAMS; } /* Check if resource exists and has annunciator capabilities */ SaHpiRptEntryT *rpt = oh_get_resource_by_id(state->rptcache, rid); if (!rpt) { return(SA_ERR_HPI_INVALID_RESOURCE); } if (!(rpt->ResourceCapabilities & SAHPI_CAPABILITY_ANNUNCIATOR)) { return(SA_ERR_HPI_CAPABILITY); } SaHpiRdrT *rdr = oh_get_rdr_by_type(state->rptcache, rid, SAHPI_ANNUNCIATOR_RDR, aid); if (rdr == NULL) return(SA_ERR_HPI_NOT_PRESENT); /* get our announcement info */ info = (struct simAnnunciatorInfo *)oh_get_rdr_data(state->rptcache, rid, rdr->RecordId); if (info == NULL) { err("No annunciator data."); return(SA_ERR_HPI_NOT_PRESENT); } info->mode = mode; return SA_OK; } void * oh_get_next_announce (void *, SaHpiResourceIdT, SaHpiAnnunciatorNumT, SaHpiSeverityT, SaHpiBoolT, SaHpiAnnouncementT) __attribute__ ((weak, alias("sim_get_next_announce"))); void * oh_get_announce (void *, SaHpiResourceIdT, SaHpiAnnunciatorNumT, SaHpiEntryIdT, SaHpiAnnouncementT *) __attribute__ ((weak, alias("sim_get_announce"))); void * oh_ack_announce (void *, SaHpiResourceIdT, SaHpiAnnunciatorNumT, SaHpiEntryIdT, SaHpiSeverityT) __attribute__ ((weak, alias("sim_ack_announce"))); void * oh_add_announce (void *, SaHpiResourceIdT, SaHpiAnnunciatorNumT, SaHpiAnnouncementT *) __attribute__ ((weak, alias("sim_add_announce"))); void * oh_del_announce (void *, SaHpiResourceIdT, SaHpiAnnunciatorNumT, SaHpiEntryIdT, SaHpiSeverityT) __attribute__ ((weak, alias("sim_del_announce"))); void * oh_get_annunc_mode (void *, SaHpiResourceIdT, SaHpiAnnunciatorNumT, SaHpiAnnunciatorModeT *) __attribute__ ((weak, alias("sim_get_annunc_mode"))); void * oh_set_annunc_mode (void *, SaHpiResourceIdT, SaHpiAnnunciatorNumT, SaHpiAnnunciatorModeT) __attribute__ ((weak, alias("sim_set_annunc_mode"))); openhpi-2.14.1/plugins/simulator/sim_controls.h0000755000076400007640000000334011302566612016562 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005, 2006 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * Christina Hernandez * W. David Ashley * Renier Morales */ #ifndef __SIM_CONTROLS_H #define __SIM_CONTROLS_H /******************* Control Definitions *********************/ struct sim_control_info { SaHpiCtrlModeT mode; SaHpiCtrlStateT state; }; struct sim_control { int index; SaHpiCtrlRecT control; SaHpiCtrlModeT mode; const char *comment; }; extern struct sim_control sim_chassis_controls[]; extern struct sim_control sim_cpu_controls[]; extern struct sim_control sim_dasd_controls[]; extern struct sim_control sim_hs_dasd_controls[]; extern struct sim_control sim_fan_controls[]; SaErrorT sim_discover_chassis_controls(struct oh_handler_state *state, struct oh_event *e); SaErrorT sim_discover_cpu_controls(struct oh_handler_state *state, struct oh_event *e); SaErrorT sim_discover_dasd_controls(struct oh_handler_state *state, struct oh_event *e); SaErrorT sim_discover_hs_dasd_controls(struct oh_handler_state *state, struct oh_event *e); SaErrorT sim_discover_fan_controls(struct oh_handler_state *state, struct oh_event *e); #endif openhpi-2.14.1/plugins/simulator/sim_reset.h0000644000076400007640000000133711302566612016042 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * W. David Ashley */ #ifndef __SIM_RESET_H #define __SIM_RESET_H SaErrorT sim_get_reset_state(void *hnd, SaHpiResourceIdT rid, SaHpiResetActionT *act); SaErrorT sim_set_reset_state(void *hnd, SaHpiResourceIdT rid, SaHpiResetActionT act); #endif openhpi-2.14.1/plugins/simulator/sim_control_func.h0000644000076400007640000000160411302566612017410 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * Christina Hernandez * W. David Ashley */ #ifndef __SIM_CONTROL_H #define __SIM_CONTROL_H SaErrorT sim_get_control_state(void *hnd, SaHpiResourceIdT rid, SaHpiCtrlNumT cid, SaHpiCtrlModeT *mode, SaHpiCtrlStateT *state); SaErrorT sim_set_control_state(void *hnd, SaHpiResourceIdT rid, SaHpiCtrlNumT cid, SaHpiCtrlModeT mode, SaHpiCtrlStateT *state); #endif openhpi-2.14.1/plugins/simulator/sim_power.h0000644000076400007640000000135111302566612016050 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * W. David Ashley */ #ifndef __SIM_POWER_H #define __SIM_POWER_H SaErrorT sim_get_power_state(void *hnd, SaHpiResourceIdT rid, SaHpiPowerStateT *state); SaErrorT sim_set_power_state(void *hnd, SaHpiResourceIdT rid, SaHpiPowerStateT state); #endif openhpi-2.14.1/plugins/simulator/sim_inventory.c0000644000076400007640000007264611302566612016763 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005, 2006 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * W. David Ashley * Renier Morales * */ #include static SaErrorT new_inventory(struct oh_handler_state *state, struct oh_event *e, struct sim_inventory *myinv) { SaHpiRdrT *rdr; struct sim_inventory_info *info; SaErrorT error = SA_OK; rdr = (SaHpiRdrT *)g_malloc0(sizeof(SaHpiRdrT)); // Copy information from rdr array to res_rdr rdr->RdrType = SAHPI_INVENTORY_RDR; memcpy(&rdr->RdrTypeUnion.InventoryRec, &myinv->invrec, sizeof(SaHpiInventoryRecT)); oh_init_textbuffer(&rdr->IdString); oh_append_textbuffer(&rdr->IdString, myinv->comment); rdr->RecordId = oh_get_rdr_uid(SAHPI_INVENTORY_RDR, rdr->RdrTypeUnion.InventoryRec.IdrId); rdr->Entity = e->resource.ResourceEntity; //set up our private data info = (struct sim_inventory_info *)g_malloc(sizeof(struct sim_inventory_info)); memcpy(info, &myinv->info, sizeof(struct sim_inventory_info)); // everything ready so add the rdr and extra info to the rptcache error = sim_inject_rdr(state, e, rdr, info); if (error) { g_free(rdr); g_free(info); } return error; } SaErrorT sim_discover_chassis_inventory(struct oh_handler_state *state, struct oh_event *e) { SaErrorT rc; int i = 0; int j = 0; while (sim_chassis_inventory[i].invrec.IdrId != 0) { rc = new_inventory(state, e, &sim_chassis_inventory[i]); if (rc) { err("Error %d returned when adding chassis inventory", rc); } else { j++; } i++; } dbg("%d of %d chassis inventory injected", j, i); return 0; } SaErrorT sim_discover_cpu_inventory(struct oh_handler_state *state, struct oh_event *e) { SaErrorT rc; int i = 0; int j = 0; while (sim_cpu_inventory[i].invrec.IdrId != 0) { rc = new_inventory(state, e, &sim_cpu_inventory[i]); if (rc) { err("Error %d returned when adding cpu inventory", rc); } else { j++; } i++; } dbg("%d of %d cpu inventory injected", j, i); return 0; } SaErrorT sim_discover_dasd_inventory(struct oh_handler_state *state, struct oh_event *e) { SaErrorT rc; int i = 0; int j = 0; while (sim_dasd_inventory[i].invrec.IdrId != 0) { rc = new_inventory(state, e, &sim_dasd_inventory[i]); if (rc) { err("Error %d returned when adding dasd inventory", rc); } else { j++; } i++; } dbg("%d of %d dasd inventory injected", j, i); return 0; } SaErrorT sim_discover_hs_dasd_inventory(struct oh_handler_state *state, struct oh_event *e) { SaErrorT rc; int i = 0; int j = 0; while (sim_hs_dasd_inventory[i].invrec.IdrId != 0) { rc = new_inventory(state, e, &sim_hs_dasd_inventory[i]); if (rc) { err("Error %d returned when adding hs dasd inventory", rc); } else { j++; } i++; } dbg("%d of %d hs dasd inventory injected", j, i); return 0; } SaErrorT sim_discover_fan_inventory(struct oh_handler_state *state, struct oh_event *e) { SaErrorT rc; int i = 0; int j = 0; while (sim_fan_inventory[i].invrec.IdrId != 0) { rc = new_inventory(state, e, &sim_fan_inventory[i]); if (rc) { err("Error %d returned when adding fan inventory", rc); } else { j++; } i++; } dbg("%d of %d fan inventory injected", j, i); return 0; } SaErrorT sim_get_idr_info(void *hnd, SaHpiResourceIdT rid, SaHpiIdrIdT IdrId, SaHpiIdrInfoT *IdrInfo) { struct sim_inventory_info *info; if (!hnd || !IdrInfo) { err("Invalid parameter."); return SA_ERR_HPI_INVALID_PARAMS; } struct oh_handler_state *state = (struct oh_handler_state *)hnd; /* Check if resource exists and has inventory capabilities */ SaHpiRptEntryT *rpt = oh_get_resource_by_id(state->rptcache, rid); if (!rpt) { return SA_ERR_HPI_INVALID_RESOURCE; } if (!(rpt->ResourceCapabilities & SAHPI_CAPABILITY_INVENTORY_DATA)) { return SA_ERR_HPI_CAPABILITY; } /* Find inventory and its data - see if it accessable */ SaHpiRdrT *rdr = oh_get_rdr_by_type(state->rptcache, rid, SAHPI_INVENTORY_RDR, IdrId); if (rdr == NULL) { return SA_ERR_HPI_NOT_PRESENT; } info = (struct sim_inventory_info *)oh_get_rdr_data(state->rptcache, rid, rdr->RecordId); if (info == NULL) { err("No inventory data. IdrId=%s", rdr->IdString.Data); return SA_ERR_HPI_NOT_PRESENT; } /* return the data */ memcpy(IdrInfo, &info->idrinfo, sizeof(SaHpiIdrInfoT)); return SA_OK; } SaErrorT sim_get_idr_area_header(void *hnd, SaHpiResourceIdT rid, SaHpiIdrIdT IdrId, SaHpiIdrAreaTypeT AreaType, SaHpiEntryIdT AreaId, SaHpiEntryIdT *NextAreaId, SaHpiIdrAreaHeaderT *Header) { struct sim_inventory_info *info; int i; int found = SAHPI_FALSE; if (!hnd || !NextAreaId || !Header) { err("Invalid parameter."); return SA_ERR_HPI_INVALID_PARAMS; } struct oh_handler_state *state = (struct oh_handler_state *)hnd; /* Check if resource exists and has inventory capabilities */ SaHpiRptEntryT *rpt = oh_get_resource_by_id(state->rptcache, rid); if (!rpt) { return SA_ERR_HPI_INVALID_RESOURCE; } if (!(rpt->ResourceCapabilities & SAHPI_CAPABILITY_INVENTORY_DATA)) { return SA_ERR_HPI_CAPABILITY; } /* Find inventory and its data - see if it accessable */ SaHpiRdrT *rdr = oh_get_rdr_by_type(state->rptcache, rid, SAHPI_INVENTORY_RDR, IdrId); if (rdr == NULL) { return SA_ERR_HPI_NOT_PRESENT; } info = (struct sim_inventory_info *)oh_get_rdr_data(state->rptcache, rid, rdr->RecordId); if (info == NULL) { err("No inventory data. IdrId=%s", rdr->IdString.Data); return SA_ERR_HPI_NOT_PRESENT; } /* find the corresponding area */ if (info->idrinfo.NumAreas == 0) { return SA_ERR_HPI_NOT_PRESENT; } if (AreaId == SAHPI_FIRST_ENTRY) { for (i = 0; i < SIM_INVENTORY_AREAS && i < info->idrinfo.NumAreas; i++) { if (AreaType == SAHPI_IDR_AREATYPE_UNSPECIFIED || AreaType == info->area[i].idrareahead.Type) { /* found the next entry */ if (found == TRUE) { *NextAreaId = info->area[i].idrareahead.AreaId; break; } /* found what we are looking for */ memcpy(Header, &info->area[i].idrareahead, sizeof(SaHpiIdrAreaHeaderT)); found = SAHPI_TRUE; *NextAreaId = SAHPI_LAST_ENTRY; } } } else for (i = 0; i < SIM_INVENTORY_AREAS && i < info->idrinfo.NumAreas; i++) { if (AreaType == SAHPI_IDR_AREATYPE_UNSPECIFIED || AreaType == info->area[i].idrareahead.Type) { /* found the next entry */ if (found == TRUE) { *NextAreaId = info->area[i].idrareahead.AreaId; break; } if (AreaId != info->area[i].idrareahead.AreaId) { continue; } /* found what we are looking for */ memcpy(Header, &info->area[i].idrareahead, sizeof(SaHpiIdrAreaHeaderT)); found = SAHPI_TRUE; *NextAreaId = SAHPI_LAST_ENTRY; } } if (found == SAHPI_TRUE) { return SA_OK; } return SA_ERR_HPI_NOT_PRESENT; } SaErrorT sim_add_idr_area(void *hnd, SaHpiResourceIdT rid, SaHpiIdrIdT IdrId, SaHpiIdrAreaTypeT AreaType, SaHpiEntryIdT *AreaId) { struct sim_inventory_info *info; if (!hnd || !AreaId) { err("Invalid parameter."); return SA_ERR_HPI_INVALID_PARAMS; } struct oh_handler_state *state = (struct oh_handler_state *)hnd; /* Check if resource exists and has inventory capabilities */ SaHpiRptEntryT *rpt = oh_get_resource_by_id(state->rptcache, rid); if (!rpt) { return SA_ERR_HPI_INVALID_RESOURCE; } if (!(rpt->ResourceCapabilities & SAHPI_CAPABILITY_INVENTORY_DATA)) { return SA_ERR_HPI_CAPABILITY; } /* Find inventory and its data - see if it accessable */ SaHpiRdrT *rdr = oh_get_rdr_by_type(state->rptcache, rid, SAHPI_INVENTORY_RDR, IdrId); if (rdr == NULL) { return SA_ERR_HPI_NOT_PRESENT; } info = (struct sim_inventory_info *)oh_get_rdr_data(state->rptcache, rid, rdr->RecordId); if (info == NULL) { err("No inventory data. IdrId=%s", rdr->IdString.Data); return SA_ERR_HPI_NOT_PRESENT; } /* check to see if space is available for the new area */ if (info->idrinfo.NumAreas == SIM_INVENTORY_AREAS) { return SA_ERR_HPI_OUT_OF_SPACE; } else if (info->idrinfo.ReadOnly) { return SA_ERR_HPI_READ_ONLY; } /* add the area */ info->area[info->idrinfo.NumAreas].idrareahead.AreaId = info->nextareaid; info->area[info->idrinfo.NumAreas].idrareahead.Type = AreaType; info->area[info->idrinfo.NumAreas].idrareahead.ReadOnly = SAHPI_FALSE; info->area[info->idrinfo.NumAreas].idrareahead.NumFields = 0; /* increment our counters and set return info */ info->idrinfo.NumAreas++; *AreaId = info->nextareaid; info->nextareaid++; return SA_OK; } SaErrorT sim_del_idr_area(void *hnd, SaHpiResourceIdT rid, SaHpiIdrIdT IdrId, SaHpiEntryIdT AreaId) { struct sim_inventory_info *info; int i; int found = SAHPI_FALSE; if (!hnd) { err("Invalid parameter."); return SA_ERR_HPI_INVALID_PARAMS; } struct oh_handler_state *state = (struct oh_handler_state *)hnd; /* Check if resource exists and has inventory capabilities */ SaHpiRptEntryT *rpt = oh_get_resource_by_id(state->rptcache, rid); if (!rpt) { return SA_ERR_HPI_INVALID_RESOURCE; } if (!(rpt->ResourceCapabilities & SAHPI_CAPABILITY_INVENTORY_DATA)) { return SA_ERR_HPI_CAPABILITY ; } /* Find inventory and its data - see if it accessable */ SaHpiRdrT *rdr = oh_get_rdr_by_type(state->rptcache, rid, SAHPI_INVENTORY_RDR, IdrId); if (rdr == NULL) { return SA_ERR_HPI_NOT_PRESENT; } info = (struct sim_inventory_info *)oh_get_rdr_data(state->rptcache, rid, rdr->RecordId); if (info == NULL) { err("No inventory data. IdrId=%s", rdr->IdString.Data); return SA_ERR_HPI_NOT_PRESENT; } /* find the entry to delete */ for (i = 0; i < info->idrinfo.NumAreas; i++) { if (AreaId != info->area[i].idrareahead.AreaId) { continue; } /* found what we are looking for */ found = SAHPI_TRUE; break; } if (found == SAHPI_FALSE) { err("Went through the list and could not find it"); return SA_ERR_HPI_NOT_PRESENT; } /* can we delete the area? */ if (info->area[i].idrareahead.ReadOnly == SAHPI_TRUE) { return SA_ERR_HPI_READ_ONLY; } /* delete the area entry by moving the remaining array members up */ if (i < info->idrinfo.NumAreas - 2) { for (i++; i < info->idrinfo.NumAreas; i++) { memcpy(&info->area[i - 1], &info->area[i], sizeof(struct sim_idr_area)); } } info->idrinfo.NumAreas--; return SA_OK; } SaErrorT sim_get_idr_field(void *hnd, SaHpiResourceIdT rid, SaHpiIdrIdT IdrId, SaHpiEntryIdT AreaId, SaHpiIdrFieldTypeT FieldType, SaHpiEntryIdT FieldId, SaHpiEntryIdT *NextFieldId, SaHpiIdrFieldT *Field) { struct sim_inventory_info *info; int i, j; int found = SAHPI_FALSE; if (!hnd || !NextFieldId || !Field) { err("Invalid parameter."); return SA_ERR_HPI_INVALID_PARAMS; } struct oh_handler_state *state = (struct oh_handler_state *)hnd; /* Check if resource exists and has inventory capabilities */ SaHpiRptEntryT *rpt = oh_get_resource_by_id(state->rptcache, rid); if (!rpt) { return SA_ERR_HPI_INVALID_RESOURCE; } if (!(rpt->ResourceCapabilities & SAHPI_CAPABILITY_INVENTORY_DATA)) { return SA_ERR_HPI_CAPABILITY; } /* Find inventory and its data - see if it accessable */ SaHpiRdrT *rdr = oh_get_rdr_by_type(state->rptcache, rid, SAHPI_INVENTORY_RDR, IdrId); if (rdr == NULL) { return SA_ERR_HPI_NOT_PRESENT; } info = (struct sim_inventory_info *)oh_get_rdr_data(state->rptcache, rid, rdr->RecordId); if (info == NULL) { err("No inventory data. IdrId=%s", rdr->IdString.Data); return SA_ERR_HPI_NOT_PRESENT; } /* find the corresponding area */ if (info->idrinfo.NumAreas == 0) { return SA_ERR_HPI_NOT_PRESENT; } for (i = 0; i < info->idrinfo.NumAreas; i++) { if (AreaId != info->area[i].idrareahead.AreaId) { continue; } /* found the area we are looking for */ found = SAHPI_TRUE; break; } if (found == SAHPI_FALSE) { return SA_ERR_HPI_NOT_PRESENT; } /* find the corresponding field */ found = SAHPI_FALSE; if (info->area[i].idrareahead.NumFields == 0) { return SA_ERR_HPI_NOT_PRESENT; } for (j = 0; j < info->area[i].idrareahead.NumFields; j++) { if ( ((info->area[i].field[j].FieldId == FieldId) || (SAHPI_FIRST_ENTRY == FieldId)) && ((info->area[i].field[j].Type == FieldType) || (SAHPI_IDR_FIELDTYPE_UNSPECIFIED == FieldType)) ) { memcpy(Field, &info->area[i].field[j], sizeof(SaHpiIdrFieldT)); found = SAHPI_TRUE; *NextFieldId = SAHPI_LAST_ENTRY; break; } } j++; if (found) { if (j < info->area[i].idrareahead.NumFields) { do { if ((info->area[i].field[j].Type == FieldType) || (SAHPI_IDR_FIELDTYPE_UNSPECIFIED == FieldType)) { *NextFieldId = info->area[i].field[j].FieldId; break; } j++; } while (j < info->area[i].idrareahead.NumFields); } } #if 0 /* found the next field entry */ if (found == TRUE) { *NextFieldId = info->area[i].field[j].FieldId; break; } /* found the field we are looking for */ memcpy(Field, &info->area[i].field[j], sizeof(SaHpiIdrFieldT)); found = SAHPI_TRUE; *NextFieldId = SAHPI_LAST_ENTRY; } } #endif if (found == SAHPI_FALSE) { return SA_ERR_HPI_NOT_PRESENT; } return SA_OK; } SaErrorT sim_add_idr_field(void *hnd, SaHpiResourceIdT rid, SaHpiIdrIdT IdrId, SaHpiIdrFieldT *Field) { struct sim_inventory_info *info; int i; int found = SAHPI_FALSE; if (!hnd || !Field) { err("Invalid parameter."); return SA_ERR_HPI_INVALID_PARAMS; } struct oh_handler_state *state = (struct oh_handler_state *)hnd; /* Check if resource exists and has inventory capabilities */ SaHpiRptEntryT *rpt = oh_get_resource_by_id(state->rptcache, rid); if (!rpt) { return SA_ERR_HPI_INVALID_RESOURCE; } if (!(rpt->ResourceCapabilities & SAHPI_CAPABILITY_INVENTORY_DATA)) { return SA_ERR_HPI_CAPABILITY; } /* Find inventory and its data - see if it accessable */ SaHpiRdrT *rdr = oh_get_rdr_by_type(state->rptcache, rid, SAHPI_INVENTORY_RDR, IdrId); if (rdr == NULL) { err("Inventory RDR %d for resource %d was not found", IdrId, rid); return SA_ERR_HPI_NOT_PRESENT; } info = (struct sim_inventory_info *)oh_get_rdr_data(state->rptcache, rid, rdr->RecordId); if (info == NULL) { err("No inventory data. IdrId=%s", rdr->IdString.Data); return SA_ERR_HPI_NOT_PRESENT; } if (info->idrinfo.ReadOnly) { return SA_ERR_HPI_READ_ONLY; } /* find the corresponding area */ if (info->idrinfo.NumAreas == 0) { err("No areas in the specified IDR"); return SA_ERR_HPI_NOT_PRESENT; } for (i = 0; i < info->idrinfo.NumAreas; i++) { if (Field->AreaId == info->area[i].idrareahead.AreaId) { /* found the area we are looking for */ found = SAHPI_TRUE; break; } } if (found == SAHPI_FALSE) { err("Specified area was not found in IDR"); return SA_ERR_HPI_NOT_PRESENT; } /* can we add a new field? */ if (info->area[i].idrareahead.ReadOnly == SAHPI_TRUE) { return SA_ERR_HPI_READ_ONLY; } /* try to add the new field */ if (info->area[i].idrareahead.NumFields == SIM_INVENTORY_FIELDS) { return SA_ERR_HPI_OUT_OF_SPACE; } memcpy(&info->area[i].field[info->area[i].idrareahead.NumFields], Field, sizeof(SaHpiIdrFieldT)); info->area[i].field[info->area[i].idrareahead.NumFields].AreaId = info->area[i].idrareahead.AreaId; info->area[i].field[info->area[i].idrareahead.NumFields].FieldId = info->area[i].nextfieldid; Field->FieldId = info->area[i].nextfieldid; info->area[i].nextfieldid++; info->area[i].field[info->area[i].idrareahead.NumFields].ReadOnly = SAHPI_FALSE; info->area[i].idrareahead.NumFields++; return SA_OK; } SaErrorT sim_set_idr_field(void *hnd, SaHpiResourceIdT rid, SaHpiIdrIdT IdrId, SaHpiIdrFieldT *Field) { struct sim_inventory_info *info; int i, j; int found = SAHPI_FALSE; char * type; if (!hnd || !Field) { err("Invalid parameter."); return SA_ERR_HPI_INVALID_PARAMS; } type = oh_lookup_idrfieldtype(Field->Type); if (type == NULL) { return SA_ERR_HPI_INVALID_PARAMS; } if (strcmp(type, "UNSPECIFIED") == 0) { return SA_ERR_HPI_INVALID_DATA; } struct oh_handler_state *state = (struct oh_handler_state *)hnd; /* Check if resource exists and has inventory capabilities */ SaHpiRptEntryT *rpt = oh_get_resource_by_id(state->rptcache, rid); if (!rpt) { return SA_ERR_HPI_INVALID_RESOURCE; } if (!(rpt->ResourceCapabilities & SAHPI_CAPABILITY_INVENTORY_DATA)) { return SA_ERR_HPI_CAPABILITY; } /* Find inventory and its data - see if it accessable */ SaHpiRdrT *rdr = oh_get_rdr_by_type(state->rptcache, rid, SAHPI_INVENTORY_RDR, IdrId); if (rdr == NULL) { return SA_ERR_HPI_NOT_PRESENT; } info = (struct sim_inventory_info *)oh_get_rdr_data(state->rptcache, rid, rdr->RecordId); if (info == NULL) { err("No inventory data. IdrId=%s", rdr->IdString.Data); return SA_ERR_HPI_NOT_PRESENT; } /* find the corresponding area */ if (info->idrinfo.NumAreas == 0) { return SA_ERR_HPI_NOT_PRESENT; } for (i = 0; i < info->idrinfo.NumAreas; i++) { if (Field->AreaId != info->area[i].idrareahead.AreaId) { continue; } /* found the area we are looking for */ found = SAHPI_TRUE; break; } if (found == SAHPI_FALSE) { return SA_ERR_HPI_NOT_PRESENT; } /* can we set a field? */ if (info->area[i].idrareahead.ReadOnly == SAHPI_TRUE) { return SA_ERR_HPI_READ_ONLY; } /* find the corresponding field */ if (info->area[i].idrareahead.NumFields == 0) { return SA_ERR_HPI_NOT_PRESENT; } for (j = 0; j < info->area[i].idrareahead.NumFields; j++) { if (Field->FieldId == info->area[i].field[j].FieldId) { /* found the field we are looking for */ if (info->area[i].field[j].ReadOnly == SAHPI_TRUE) { return SA_ERR_HPI_READ_ONLY; } info->area[i].field[j].Type = Field->Type; memcpy(&info->area[i].field[j].Field, &Field->Field, sizeof(SaHpiTextBufferT)); return SA_OK; } } return SA_ERR_HPI_NOT_PRESENT; } SaErrorT sim_del_idr_field(void *hnd, SaHpiResourceIdT rid, SaHpiIdrIdT IdrId, SaHpiEntryIdT AreaId, SaHpiEntryIdT FieldId) { struct sim_inventory_info *info; int i, j; int found = SAHPI_FALSE; if (!hnd) { err("Invalid parameter."); return SA_ERR_HPI_INVALID_PARAMS; } struct oh_handler_state *state = (struct oh_handler_state *)hnd; /* Check if resource exists and has inventory capabilities */ SaHpiRptEntryT *rpt = oh_get_resource_by_id(state->rptcache, rid); if (!rpt) { return SA_ERR_HPI_INVALID_RESOURCE; } if (!(rpt->ResourceCapabilities & SAHPI_CAPABILITY_INVENTORY_DATA)) { return SA_ERR_HPI_CAPABILITY; } /* Find inventory and its data - see if it accessable */ SaHpiRdrT *rdr = oh_get_rdr_by_type(state->rptcache, rid, SAHPI_INVENTORY_RDR, IdrId); if (rdr == NULL) { return SA_ERR_HPI_NOT_PRESENT; } info = (struct sim_inventory_info *)oh_get_rdr_data(state->rptcache, rid, rdr->RecordId); if (info == NULL) { err("No inventory data. IdrId=%s", rdr->IdString.Data); return SA_ERR_HPI_NOT_PRESENT; } /* find the corresponding area */ if (info->idrinfo.NumAreas == 0) { return SA_ERR_HPI_NOT_PRESENT; } for (i = 0; i < info->idrinfo.NumAreas; i++) { if (AreaId != info->area[i].idrareahead.AreaId) { continue; } /* found the area we are looking for */ found = SAHPI_TRUE; break; } if (found == SAHPI_FALSE) { return SA_ERR_HPI_NOT_PRESENT; } /* can we delete a field? */ if (info->area[i].idrareahead.ReadOnly == SAHPI_TRUE) { return SA_ERR_HPI_READ_ONLY; } /* find the corresponding field */ if (info->area[i].idrareahead.NumFields == 0) { return SA_ERR_HPI_NOT_PRESENT; } found = SAHPI_FALSE; for (j = 0; j < info->area[i].idrareahead.NumFields; j++) { if (FieldId == info->area[i].field[j].FieldId) { /* found the field we are looking for */ found = SAHPI_TRUE; break; } } if (found == SAHPI_FALSE) { return SA_ERR_HPI_NOT_PRESENT; } /* can we delete the field? */ if (info->area[i].field[j].ReadOnly == SAHPI_TRUE) { return SA_ERR_HPI_READ_ONLY; } /* delete the area entry by moving the remaining array members up */ if (j < info->area[i].idrareahead.NumFields - 2) { for (j++; j < SIM_INVENTORY_AREAS && j < info->area[i].idrareahead.NumFields; j++) { memcpy(&info->area[i].field[j - 1], &info->area[i].field[j], sizeof(SaHpiIdrFieldT)); } } info->area[i].idrareahead.NumFields--; return SA_OK; } void * oh_get_idr_info (void *hnd, SaHpiResourceIdT, SaHpiIdrIdT,SaHpiIdrInfoT) __attribute__ ((weak, alias("sim_get_idr_info"))); void * oh_get_idr_area_header (void *, SaHpiResourceIdT, SaHpiIdrIdT, SaHpiIdrAreaTypeT, SaHpiEntryIdT, SaHpiEntryIdT, SaHpiIdrAreaHeaderT) __attribute__ ((weak, alias("sim_get_idr_area_header"))); void * oh_add_idr_area (void *, SaHpiResourceIdT, SaHpiIdrIdT, SaHpiIdrAreaTypeT, SaHpiEntryIdT) __attribute__ ((weak, alias("sim_add_idr_area"))); void * oh_del_idr_area (void *, SaHpiResourceIdT, SaHpiIdrIdT, SaHpiEntryIdT) __attribute__ ((weak, alias("sim_del_idr_area"))); void * oh_get_idr_field (void *, SaHpiResourceIdT, SaHpiIdrIdT, SaHpiEntryIdT, SaHpiIdrFieldTypeT, SaHpiEntryIdT, SaHpiEntryIdT, SaHpiIdrFieldT) __attribute__ ((weak, alias("sim_get_idr_field"))); void * oh_add_idr_field (void *, SaHpiResourceIdT, SaHpiIdrIdT, SaHpiIdrFieldT) __attribute__ ((weak, alias("sim_add_idr_field"))); void * oh_set_idr_field (void *, SaHpiResourceIdT, SaHpiIdrIdT, SaHpiIdrFieldT) __attribute__ ((weak, alias("sim_set_idr_field"))); void * oh_del_idr_field (void *, SaHpiResourceIdT, SaHpiIdrIdT, SaHpiEntryIdT, SaHpiEntryIdT) __attribute__ ((weak, alias("sim_del_idr_field"))); openhpi-2.14.1/plugins/simulator/sim_fumi_func.c0000644000076400007640000000160611302566612016665 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2008 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Suntrupth S Yadav */ #include SaErrorT sim_set_fumi_source(void *hnd, SaHpiResourceIdT rid, SaHpiFumiNumT fnum, SaHpiBankNumT bnum, SaHpiTextBufferT *sourceuri) { return SA_ERR_HPI_INVALID_CMD; } void* oh_set_fumi_source (void *, SaHpiResourceIdT,SaHpiFumiNumT, SaHpiBankNumT, SaHpiTextBufferT *) __attribute__ ((weak, alias("sim_set_fumi_source"))); openhpi-2.14.1/plugins/simulator/t/0000755000076400007640000000000011405006365014134 5ustar openhpi-2.14.1/plugins/simulator/t/Makefile.am0000644000076400007640000001615111302566606016201 0ustar # (C) Copyright IBM Corp 2005 # All rights reserved. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This # file and program are licensed under a BSD style license. See # the Copying file included with the OpenHPI distribution for # full licensing terms. MOSTLYCLEANFILES = @TEST_CLEAN@ uid_map EXTRA_DIST = openhpi.conf INCLUDES = @OPENHPI_INCLUDES@ MAINTAINERCLEANFILES = Makefile.in TDEPLIB = $(top_builddir)/src/libopenhpi.la \ $(top_builddir)/utils/libopenhpiutils.la TESTS_ENVIRONMENT = OPENHPI_PATH=$(top_builddir)/plugins/simulator TESTS_ENVIRONMENT += OPENHPI_UID_MAP=$(top_builddir)/plugins/simulator/t/uid_map TESTS_ENVIRONMENT += OPENHPI_CONF=$(top_srcdir)/plugins/simulator/t/openhpi.conf TESTS_ENVIRONMENT += LD_LIBRARY_PATH=$(top_srcdir)/src/.libs:$(top_srcdir)/ssl/.libs:$(top_srcdir)/utils/.libs TESTS = sim_sanity_000 \ sim_sanity_001 \ sim_sanity_002 \ sim_sanity_003 \ sim_sanity_004 \ sim_sanity_005 \ sim_sanity_006 \ sim_sanity_007 \ sim_sanity_008 \ sim_sanity_009 \ sim_sanity_010 \ sim_sanity_011 \ sim_sanity_012 \ sim_sanity_013 \ sim_sanity_014 \ sim_sanity_015 \ sim_sanity_016 \ sim_sanity_017 \ sim_sanity_018 \ sim_sanity_019 \ sim_sanity_020 \ sim_sanity_021 \ sim_sanity_022 \ sim_sanity_023 \ sim_sanity_024 \ sim_sanity_025 \ sim_sanity_026 \ sim_sanity_027 \ sim_sanity_028 \ sim_sanity_029 \ sim_sanity_030 \ sim_sanity_031 \ sim_sanity_032 \ sim_sanity_033 \ sim_sanity_034 \ sim_sanity_035 \ sim_sanity_036 \ sim_sanity_037 \ sim_sanity_038 \ sim_sanity_039 \ sim_sanity_040 \ sim_sanity_041 \ sim_sanity_042 \ sim_sanity_043 \ sim_sanity_044 \ sim_sanity_045 check_PROGRAMS = $(TESTS) sim_sanity_000_SOURCES = sim_sanity_000.c sim_sanity_000_LDADD = $(TDEPLIB) sim_sanity_000_LDFLAGS = -export-dynamic sim_sanity_001_SOURCES = sim_sanity_001.c sim_sanity_001_LDADD = $(TDEPLIB) sim_sanity_001_LDFLAGS = -export-dynamic sim_sanity_002_SOURCES = sim_sanity_002.c sim_sanity_002_LDADD = $(TDEPLIB) sim_sanity_002_LDFLAGS = -export-dynamic sim_sanity_003_SOURCES = sim_sanity_003.c sim_sanity_003_LDADD = $(TDEPLIB) sim_sanity_003_LDFLAGS = -export-dynamic sim_sanity_004_SOURCES = sim_sanity_004.c sim_sanity_004_LDADD = $(TDEPLIB) sim_sanity_004_LDFLAGS = -export-dynamic sim_sanity_005_SOURCES = sim_sanity_005.c sim_sanity_005_LDADD = $(TDEPLIB) sim_sanity_005_LDFLAGS = -export-dynamic sim_sanity_006_SOURCES = sim_sanity_006.c sim_sanity_006_LDADD = $(TDEPLIB) sim_sanity_006_LDFLAGS = -export-dynamic sim_sanity_007_SOURCES = sim_sanity_007.c sim_sanity_007_LDADD = $(TDEPLIB) sim_sanity_007_LDFLAGS = -export-dynamic sim_sanity_008_SOURCES = sim_sanity_008.c sim_sanity_008_LDADD = $(TDEPLIB) sim_sanity_008_LDFLAGS = -export-dynamic sim_sanity_009_SOURCES = sim_sanity_009.c sim_sanity_009_LDADD = $(TDEPLIB) sim_sanity_009_LDFLAGS = -export-dynamic sim_sanity_010_SOURCES = sim_sanity_010.c sim_sanity_010_LDADD = $(TDEPLIB) sim_sanity_010_LDFLAGS = -export-dynamic sim_sanity_011_SOURCES = sim_sanity_011.c sim_sanity_011_LDADD = $(TDEPLIB) sim_sanity_011_LDFLAGS = -export-dynamic sim_sanity_012_SOURCES = sim_sanity_012.c sim_sanity_012_LDADD = $(TDEPLIB) sim_sanity_012_LDFLAGS = -export-dynamic sim_sanity_013_SOURCES = sim_sanity_013.c sim_sanity_013_LDADD = $(TDEPLIB) sim_sanity_013_LDFLAGS = -export-dynamic sim_sanity_014_SOURCES = sim_sanity_014.c sim_sanity_014_LDADD = $(TDEPLIB) sim_sanity_014_LDFLAGS = -export-dynamic sim_sanity_015_SOURCES = sim_sanity_015.c sim_sanity_015_LDADD = $(TDEPLIB) sim_sanity_015_LDFLAGS = -export-dynamic sim_sanity_016_SOURCES = sim_sanity_016.c sim_sanity_016_LDADD = $(TDEPLIB) sim_sanity_016_LDFLAGS = -export-dynamic sim_sanity_017_SOURCES = sim_sanity_017.c sim_sanity_017_LDADD = $(TDEPLIB) sim_sanity_017_LDFLAGS = -export-dynamic sim_sanity_018_SOURCES = sim_sanity_018.c sim_sanity_018_LDADD = $(TDEPLIB) sim_sanity_018_LDFLAGS = -export-dynamic sim_sanity_019_SOURCES = sim_sanity_019.c sim_sanity_019_LDADD = $(TDEPLIB) sim_sanity_019_LDFLAGS = -export-dynamic sim_sanity_020_SOURCES = sim_sanity_020.c sim_sanity_020_LDADD = $(TDEPLIB) sim_sanity_020_LDFLAGS = -export-dynamic sim_sanity_021_SOURCES = sim_sanity_021.c sim_sanity_021_LDADD = $(TDEPLIB) sim_sanity_021_LDFLAGS = -export-dynamic sim_sanity_022_SOURCES = sim_sanity_022.c sim_sanity_022_LDADD = $(TDEPLIB) sim_sanity_022_LDFLAGS = -export-dynamic sim_sanity_023_SOURCES = sim_sanity_023.c sim_sanity_023_LDADD = $(TDEPLIB) sim_sanity_023_LDFLAGS = -export-dynamic sim_sanity_024_SOURCES = sim_sanity_024.c sim_sanity_024_LDADD = $(TDEPLIB) sim_sanity_024_LDFLAGS = -export-dynamic sim_sanity_025_SOURCES = sim_sanity_025.c sim_sanity_025_LDADD = $(TDEPLIB) sim_sanity_025_LDFLAGS = -export-dynamic sim_sanity_026_SOURCES = sim_sanity_026.c sim_sanity_026_LDADD = $(TDEPLIB) sim_sanity_026_LDFLAGS = -export-dynamic sim_sanity_027_SOURCES = sim_sanity_027.c sim_sanity_027_LDADD = $(TDEPLIB) sim_sanity_027_LDFLAGS = -export-dynamic sim_sanity_028_SOURCES = sim_sanity_028.c sim_sanity_028_LDADD = $(TDEPLIB) sim_sanity_028_LDFLAGS = -export-dynamic sim_sanity_029_SOURCES = sim_sanity_029.c sim_sanity_029_LDADD = $(TDEPLIB) sim_sanity_029_LDFLAGS = -export-dynamic sim_sanity_030_SOURCES = sim_sanity_030.c sim_sanity_030_LDADD = $(TDEPLIB) sim_sanity_030_LDFLAGS = -export-dynamic sim_sanity_031_SOURCES = sim_sanity_031.c sim_sanity_031_LDADD = $(TDEPLIB) sim_sanity_031_LDFLAGS = -export-dynamic sim_sanity_032_SOURCES = sim_sanity_032.c sim_sanity_032_LDADD = $(TDEPLIB) sim_sanity_032_LDFLAGS = -export-dynamic sim_sanity_033_SOURCES = sim_sanity_033.c sim_sanity_033_LDADD = $(TDEPLIB) sim_sanity_033_LDFLAGS = -export-dynamic sim_sanity_034_SOURCES = sim_sanity_034.c sim_sanity_034_LDADD = $(TDEPLIB) sim_sanity_034_LDFLAGS = -export-dynamic sim_sanity_035_SOURCES = sim_sanity_035.c sim_sanity_035_LDADD = $(TDEPLIB) sim_sanity_035_LDFLAGS = -export-dynamic sim_sanity_036_SOURCES = sim_sanity_036.c sim_sanity_036_LDADD = $(TDEPLIB) sim_sanity_036_LDFLAGS = -export-dynamic sim_sanity_037_SOURCES = sim_sanity_037.c sim_sanity_037_LDADD = $(TDEPLIB) sim_sanity_037_LDFLAGS = -export-dynamic sim_sanity_038_SOURCES = sim_sanity_038.c sim_sanity_038_LDADD = $(TDEPLIB) sim_sanity_038_LDFLAGS = -export-dynamic sim_sanity_039_SOURCES = sim_sanity_039.c sim_sanity_039_LDADD = $(TDEPLIB) sim_sanity_039_LDFLAGS = -export-dynamic sim_sanity_040_SOURCES = sim_sanity_040.c sim_sanity_040_LDADD = $(TDEPLIB) sim_sanity_040_LDFLAGS = -export-dynamic sim_sanity_041_SOURCES = sim_sanity_041.c sim_sanity_041_LDADD = $(TDEPLIB) sim_sanity_041_LDFLAGS = -export-dynamic sim_sanity_042_SOURCES = sim_sanity_042.c sim_sanity_042_LDADD = $(TDEPLIB) sim_sanity_042_LDFLAGS = -export-dynamic sim_sanity_043_SOURCES = sim_sanity_043.c sim_sanity_043_LDADD = $(TDEPLIB) sim_sanity_043_LDFLAGS = -export-dynamic sim_sanity_044_SOURCES = sim_sanity_044.c sim_sanity_044_LDADD = $(TDEPLIB) sim_sanity_044_LDFLAGS = -export-dynamic sim_sanity_045_SOURCES = sim_sanity_045.c sim_sanity_045_LDADD = $(TDEPLIB) sim_sanity_045_LDFLAGS = -export-dynamic openhpi-2.14.1/plugins/simulator/t/sim_sanity_008.c0000644000076400007640000000434011302566606017054 0ustar /* -*- linux-c -*- * *(C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Sean Dague */ #include #include #include #include /** * Run a series of sanity tests on the simulator * Return 0 on success, otherwise return -1 **/ static SaHpiResourceIdT get_resid(SaHpiSessionIdT sid, SaHpiEntryIdT srchid) { SaHpiRptEntryT res; SaHpiEntryIdT rptid = SAHPI_FIRST_ENTRY; while(saHpiRptEntryGet(sid, rptid, &rptid, &res) == SA_OK) { if (srchid == res.ResourceEntity.Entry[0].EntityType) { return res.ResourceId; } } return 0; } int main(int argc, char **argv) { SaHpiSessionIdT sid = 0; SaHpiBoolT enable; SaErrorT rc = SA_OK; rc = saHpiSessionOpen(SAHPI_UNSPECIFIED_DOMAIN_ID, &sid, NULL); if (rc != SA_OK) { err("Failed to open session"); return -1; } rc = saHpiDiscover(sid); if (rc != SA_OK) { err("Failed to run discover"); return -1; } /* get the resource id of the chassis */ SaHpiResourceIdT resid = get_resid(sid, SAHPI_ENT_SYSTEM_CHASSIS); if (resid == 0) { err("Couldn't find the resource id of the chassis"); return -1; } /* get sensor event enable */ rc = saHpiSensorEventEnableGet(sid, resid, 1, &enable); if (rc != SA_OK) { err("Couldn't get sensor event enable"); err("Error %s",oh_lookup_error(rc)); return -1; } /* set sensor event enable */ rc = saHpiSensorEventEnableSet(sid, resid, 1, enable); if (rc == SA_OK) { /* all our sensors are read-only so if we can change the sensor it is an error */ err("Error: able to write to a read-only sensor"); return -1; } return 0; } openhpi-2.14.1/plugins/simulator/t/sim_sanity_003.c0000644000076400007640000000507611302566606017056 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Sean Dague */ #include #include #include #include /** * Run a series of sanity tests on the simulator * Return 0 on success, otherwise return -1 **/ int main(int argc, char **argv) { SaHpiSessionIdT sid = 0; SaHpiRptEntryT res; SaHpiEntryIdT rptid = SAHPI_FIRST_ENTRY; SaHpiEntryIdT rdrid; SaHpiRdrT rdr; SaErrorT rc = SA_OK; int rptctr = 0; int rdrctr; rc = saHpiSessionOpen(SAHPI_UNSPECIFIED_DOMAIN_ID, &sid, NULL); if(rc != SA_OK) { err("Failed to open session"); return -1; } rc = saHpiDiscover(sid); if(rc != SA_OK) { err("Failed to run discover"); return -1; } /* loop over all resources, ensure that ResourceTag and * ManufacturerId have been set */ while(saHpiRptEntryGet(sid, rptid, &rptid, &res) == SA_OK) { /* verify we have a valid rptentry */ if(!res.ResourceTag.DataLength) { err("Resource Tag has zero length"); return -1; } if(!res.ResourceInfo.ManufacturerId) { err("Resource has no Manufacturer Id"); return -1; } /* just check for the first rdr */ rdrid = SAHPI_FIRST_ENTRY; rdrctr = 0; while (saHpiRdrGet(sid, res.ResourceId, rdrid, &rdrid, &rdr) == SA_OK) { if (rdr.RecordId == 0) { err("Invalid rdr entry found"); return -1; } rdrctr++; } // note that the hot swap resource has no rdrs if (rdrctr == 0 && res.ResourceEntity.Entry[0].EntityType != SAHPI_ENT_DISK_DRIVE_BAY) { err("No rdr entries found"); return -1; } err("%d rdrs found for resource %d", rdrctr, res.ResourceId); rptctr++; } if (rptctr == 0) { err("No rpt entries found"); return -1; } return 0; } openhpi-2.14.1/plugins/simulator/t/sim_sanity_015.c0000644000076400007640000000530011302566606017047 0ustar /* -*- linux-c -*- * *(C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Sean Dague */ #include #include #include #include #include /** * Run a series of sanity tests on the simulator * Return 0 on success, otherwise return -1 **/ static SaHpiResourceIdT get_resid(SaHpiSessionIdT sid, SaHpiEntryIdT srchid) { SaHpiRptEntryT res; SaHpiEntryIdT rptid = SAHPI_FIRST_ENTRY; while(saHpiRptEntryGet(sid, rptid, &rptid, &res) == SA_OK) { if (srchid == res.ResourceEntity.Entry[0].EntityType) { return res.ResourceId; } } return 0; } int main(int argc, char **argv) { SaHpiSessionIdT sid = 0; SaHpiEventT entry; SaHpiEventLogEntryT logentry; SaHpiEventLogEntryIdT prev, next; SaErrorT rc = SA_OK; rc = saHpiSessionOpen(SAHPI_UNSPECIFIED_DOMAIN_ID, &sid, NULL); if (rc != SA_OK) { err("Failed to open session"); return -1; } rc = saHpiDiscover(sid); if (rc != SA_OK) { err("Failed to run discover"); return -1; } /* get the resource id of the chassis */ SaHpiResourceIdT resid = get_resid(sid, SAHPI_ENT_SYSTEM_CHASSIS); if (resid == 0) { err("Couldn't find the resource id of the chassis"); return -1; } /* initialize the new event log entry */ entry.Source = SAHPI_UNSPECIFIED_RESOURCE_ID; entry.EventType = SAHPI_ET_USER; entry.Timestamp = 0; entry.Severity = SAHPI_INFORMATIONAL; oh_init_textbuffer(&entry.EventDataUnion.UserEvent.UserEventData); oh_append_textbuffer(&entry.EventDataUnion.UserEvent.UserEventData, "My user data"); /* add event log entry */ rc = saHpiEventLogEntryAdd(sid, resid, &entry); if (rc != SA_OK) { err("Couldn't add event log entry"); err("Error %s",oh_lookup_error(rc)); return -1; } /* get event log entry */ rc = saHpiEventLogEntryGet(sid, resid, SAHPI_NEWEST_ENTRY, &prev, &next, &logentry, NULL, NULL); if (rc != SA_OK) { err("Couldn't get event log entry"); err("Error %s",oh_lookup_error(rc)); return -1; } return 0; } openhpi-2.14.1/plugins/simulator/t/sim_sanity_032.c0000644000076400007640000000400011302566606017042 0ustar /* -*- linux-c -*- * *(C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Sean Dague */ #include #include #include #include #include /** * Run a series of sanity tests on the simulator * Return 0 on success, otherwise return -1 **/ static SaHpiResourceIdT get_resid(SaHpiSessionIdT sid, SaHpiEntityTypeT srchid) { SaHpiRptEntryT res; SaHpiEntryIdT rptid = SAHPI_FIRST_ENTRY; while(saHpiRptEntryGet(sid, rptid, &rptid, &res) == SA_OK) { oh_print_ep(&res.ResourceEntity, 0); if (srchid == res.ResourceEntity.Entry[0].EntityType && res.ResourceEntity.Entry[0].EntityLocation == 2) { return res.ResourceId; } } return 0; } int main(int argc, char **argv) { SaHpiSessionIdT sid = 0; SaHpiHsStateT state; SaErrorT rc = SA_OK; rc = saHpiSessionOpen(SAHPI_UNSPECIFIED_DOMAIN_ID, &sid, NULL); if (rc != SA_OK) { err("Failed to open session"); return -1; } rc = saHpiDiscover(sid); if (rc != SA_OK) { err("Failed to run discover"); return -1; } /* get the resource id of the hs drive */ SaHpiResourceIdT resid = get_resid(sid, SAHPI_ENT_DISK_DRIVE); if (resid == 0) { err("Couldn't find the resource id of the hs drive"); return -1; } rc = saHpiHotSwapStateGet(sid, resid, &state); if (rc != SA_OK) { err("Couldn't get state"); err("Error %s",oh_lookup_error(rc)); return -1; } return 0; } openhpi-2.14.1/plugins/simulator/t/sim_sanity_041.c0000644000076400007640000000373611302566606017061 0ustar /* -*- linux-c -*- * *(C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Sean Dague */ #include #include #include #include #include /** * Run a series of sanity tests on the simulator * Return 0 on success, otherwise return -1 **/ static SaHpiResourceIdT get_resid(SaHpiSessionIdT sid, SaHpiEntryIdT srchid) { SaHpiRptEntryT res; SaHpiEntryIdT rptid = SAHPI_FIRST_ENTRY; while(saHpiRptEntryGet(sid, rptid, &rptid, &res) == SA_OK) { if (srchid == res.ResourceEntity.Entry[0].EntityType) { return res.ResourceId; } } return 0; } int main(int argc, char **argv) { SaHpiSessionIdT sid = 0; SaHpiIdrFieldT field; SaHpiEntryIdT next; SaErrorT rc = SA_OK; rc = saHpiSessionOpen(SAHPI_UNSPECIFIED_DOMAIN_ID, &sid, NULL); if (rc != SA_OK) { err("Failed to open session"); return -1; } rc = saHpiDiscover(sid); if (rc != SA_OK) { err("Failed to run discover"); return -1; } /* get the resource id of the chassis */ SaHpiResourceIdT resid = get_resid(sid, SAHPI_ENT_SYSTEM_CHASSIS); if (resid == 0) { err("Couldn't find the resource id of the chassis"); return -1; } rc = saHpiIdrFieldGet(sid, resid, 1, 1, SAHPI_IDR_FIELDTYPE_MANUFACTURER, SAHPI_FIRST_ENTRY, &next, &field); if (rc != SA_OK) { err("Couldn't get field"); err("Error %s",oh_lookup_error(rc)); return -1; } return 0; } openhpi-2.14.1/plugins/simulator/t/sim_sanity_022.c0000644000076400007640000000654511302566606017061 0ustar /* -*- linux-c -*- * *(C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Sean Dague */ #include #include #include #include #include /** * Run a series of sanity tests on the simulator * Return 0 on success, otherwise return -1 **/ static SaHpiResourceIdT get_resid(SaHpiSessionIdT sid, SaHpiEntryIdT srchid) { SaHpiRptEntryT res; SaHpiEntryIdT rptid = SAHPI_FIRST_ENTRY; while(saHpiRptEntryGet(sid, rptid, &rptid, &res) == SA_OK) { if (srchid == res.ResourceEntity.Entry[0].EntityType) { return res.ResourceId; } } return 0; } int main(int argc, char **argv) { SaHpiSessionIdT sid = 0; SaHpiAnnouncementT announ; SaErrorT rc = SA_OK; rc = saHpiSessionOpen(SAHPI_UNSPECIFIED_DOMAIN_ID, &sid, NULL); if (rc != SA_OK) { err("Failed to open session"); return -1; } rc = saHpiDiscover(sid); if (rc != SA_OK) { err("Failed to run discover"); return -1; } /* get the resource id of the chassis */ SaHpiResourceIdT resid = get_resid(sid, SAHPI_ENT_SYSTEM_CHASSIS); if (resid == 0) { err("Couldn't find the resource id of the chassis"); return -1; } /* add an announcement */ announ.EntryId = 0; // modified by oh_announcement_append announ.Timestamp = 0; // modified by oh_announcement_append announ.AddedByUser = FALSE; // modified by oh_announcement_append announ.Severity = SAHPI_CRITICAL; announ.Acknowledged = FALSE; announ.StatusCond.Type= SAHPI_STATUS_COND_TYPE_SENSOR; announ.StatusCond.Entity.Entry[0].EntityType = SAHPI_ENT_SYSTEM_BOARD; announ.StatusCond.Entity.Entry[0].EntityLocation = 1; announ.StatusCond.Entity.Entry[1].EntityType = SAHPI_ENT_ROOT; announ.StatusCond.Entity.Entry[1].EntityLocation = 0; announ.StatusCond.DomainId = 1; announ.StatusCond.ResourceId = 1; announ.StatusCond.SensorNum = 1; announ.StatusCond.EventState = SAHPI_ES_UNSPECIFIED; announ.StatusCond.Name.Length = 6; memcpy(&announ.StatusCond.Name.Value,"announ", 6); announ.StatusCond.Mid = 123; announ.StatusCond.Data.DataType = SAHPI_TL_TYPE_TEXT; announ.StatusCond.Data.Language = SAHPI_LANG_ENGLISH; announ.StatusCond.Data.DataLength = 6; memcpy(&announ.StatusCond.Data.Data,"announ", 6); rc = saHpiAnnunciatorAdd(sid, resid, 1, &announ); if (rc != SA_OK) { err("Couldn't add announcement"); err("Error %s",oh_lookup_error(rc)); return -1; } rc = saHpiAnnunciatorDelete(sid, resid, 1, SAHPI_ENTRY_UNSPECIFIED, SAHPI_CRITICAL); if (rc != SA_OK) { err("Couldn't delete announcement"); err("Error %s",oh_lookup_error(rc)); return -1; } return 0; } openhpi-2.14.1/plugins/simulator/t/sim_sanity_029.c0000644000076400007640000000412111302566606017054 0ustar /* -*- linux-c -*- * *(C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Sean Dague */ #include #include #include #include #include /** * Run a series of sanity tests on the simulator * Return 0 on success, otherwise return -1 **/ static SaHpiResourceIdT get_resid(SaHpiSessionIdT sid, SaHpiEntryIdT srchid) { SaHpiRptEntryT res; SaHpiEntryIdT rptid = SAHPI_FIRST_ENTRY; while(saHpiRptEntryGet(sid, rptid, &rptid, &res) == SA_OK) { if (srchid == res.ResourceEntity.Entry[0].EntityType) { return res.ResourceId; } } return 0; } int main(int argc, char **argv) { SaHpiSessionIdT sid = 0; SaErrorT rc = SA_OK; rc = saHpiSessionOpen(SAHPI_UNSPECIFIED_DOMAIN_ID, &sid, NULL); if (rc != SA_OK) { err("Failed to open session"); return -1; } rc = saHpiDiscover(sid); if (rc != SA_OK) { err("Failed to run discover"); return -1; } /* get the resource id of the chassis */ SaHpiResourceIdT resid = get_resid(sid, SAHPI_ENT_SYSTEM_CHASSIS); if (resid == 0) { err("Couldn't find the resource id of the chassis"); return -1; } rc = saHpiResourcePowerStateSet(sid, resid, SAHPI_POWER_ON); if (rc != SA_OK) { err("Couldn't set power state to on"); err("Error %s",oh_lookup_error(rc)); return -1; } rc = saHpiResourcePowerStateSet(sid, resid, SAHPI_POWER_OFF); if (rc != SA_OK) { err("Couldn't set power state to off"); err("Error %s",oh_lookup_error(rc)); return -1; } return 0; } openhpi-2.14.1/plugins/simulator/t/sim_sanity_024.c0000644000076400007640000000361411302566606017055 0ustar /* -*- linux-c -*- * *(C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Sean Dague */ #include #include #include #include #include /** * Run a series of sanity tests on the simulator * Return 0 on success, otherwise return -1 **/ static SaHpiResourceIdT get_resid(SaHpiSessionIdT sid, SaHpiEntryIdT srchid) { SaHpiRptEntryT res; SaHpiEntryIdT rptid = SAHPI_FIRST_ENTRY; while(saHpiRptEntryGet(sid, rptid, &rptid, &res) == SA_OK) { if (srchid == res.ResourceEntity.Entry[0].EntityType) { return res.ResourceId; } } return 0; } int main(int argc, char **argv) { SaHpiSessionIdT sid = 0; SaErrorT rc = SA_OK; rc = saHpiSessionOpen(SAHPI_UNSPECIFIED_DOMAIN_ID, &sid, NULL); if (rc != SA_OK) { err("Failed to open session"); return -1; } rc = saHpiDiscover(sid); if (rc != SA_OK) { err("Failed to run discover"); return -1; } /* get the resource id of the chassis */ SaHpiResourceIdT resid = get_resid(sid, SAHPI_ENT_SYSTEM_CHASSIS); if (resid == 0) { err("Couldn't find the resource id of the chassis"); return -1; } rc = saHpiAnnunciatorModeSet(sid, resid, 1, SAHPI_ANNUNCIATOR_MODE_AUTO); if (rc != SA_OK) { err("Couldn't set annunciator mode"); err("Error %s",oh_lookup_error(rc)); return -1; } return 0; } openhpi-2.14.1/plugins/simulator/t/sim_sanity_014.c0000644000076400007640000000451011302566606017050 0ustar /* -*- linux-c -*- * *(C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Sean Dague */ #include #include #include #include #include /** * Run a series of sanity tests on the simulator * Return 0 on success, otherwise return -1 **/ static SaHpiResourceIdT get_resid(SaHpiSessionIdT sid, SaHpiEntryIdT srchid) { SaHpiRptEntryT res; SaHpiEntryIdT rptid = SAHPI_FIRST_ENTRY; while(saHpiRptEntryGet(sid, rptid, &rptid, &res) == SA_OK) { if (srchid == res.ResourceEntity.Entry[0].EntityType) { return res.ResourceId; } } return 0; } int main(int argc, char **argv) { SaHpiSessionIdT sid = 0; SaHpiEventT entry; SaErrorT rc = SA_OK; rc = saHpiSessionOpen(SAHPI_UNSPECIFIED_DOMAIN_ID, &sid, NULL); if (rc != SA_OK) { err("Failed to open session"); return -1; } rc = saHpiDiscover(sid); if (rc != SA_OK) { err("Failed to run discover"); return -1; } /* get the resource id of the chassis */ SaHpiResourceIdT resid = get_resid(sid, SAHPI_ENT_SYSTEM_CHASSIS); if (resid == 0) { err("Couldn't find the resource id of the chassis"); return -1; } /* initialize the new event log entry */ entry.Source = SAHPI_UNSPECIFIED_RESOURCE_ID; entry.EventType = SAHPI_ET_USER; entry.Timestamp = 0; entry.Severity = SAHPI_INFORMATIONAL; oh_init_textbuffer(&entry.EventDataUnion.UserEvent.UserEventData); oh_append_textbuffer(&entry.EventDataUnion.UserEvent.UserEventData, "My user data"); /* add event log entry */ rc = saHpiEventLogEntryAdd(sid, resid, &entry); if (rc != SA_OK) { err("Couldn't add event log entry"); err("Error %s",oh_lookup_error(rc)); return -1; } return 0; } openhpi-2.14.1/plugins/simulator/t/sim_sanity_025.c0000644000076400007640000000367511302566606017065 0ustar /* -*- linux-c -*- * *(C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Sean Dague */ #include #include #include #include #include /** * Run a series of sanity tests on the simulator * Return 0 on success, otherwise return -1 **/ static SaHpiResourceIdT get_resid(SaHpiSessionIdT sid, SaHpiEntryIdT srchid) { SaHpiRptEntryT res; SaHpiEntryIdT rptid = SAHPI_FIRST_ENTRY; while(saHpiRptEntryGet(sid, rptid, &rptid, &res) == SA_OK) { if (srchid == res.ResourceEntity.Entry[0].EntityType) { return res.ResourceId; } } return 0; } int main(int argc, char **argv) { SaHpiSessionIdT sid = 0; SaErrorT rc = SA_OK; rc = saHpiSessionOpen(SAHPI_UNSPECIFIED_DOMAIN_ID, &sid, NULL); if (rc != SA_OK) { err("Failed to open session"); return -1; } rc = saHpiDiscover(sid); if (rc != SA_OK) { err("Failed to run discover"); return -1; } /* get the resource id of the chassis */ SaHpiResourceIdT resid = get_resid(sid, SAHPI_ENT_SYSTEM_CHASSIS); if (resid == 0) { err("Couldn't find the resource id of the chassis"); return -1; } rc = saHpiAnnunciatorAcknowledge(sid, resid, 1, SAHPI_ENTRY_UNSPECIFIED, SAHPI_MINOR); if (rc != SA_OK) { err("Couldn't ack annunciator"); err("Error %s",oh_lookup_error(rc)); return -1; } return 0; } openhpi-2.14.1/plugins/simulator/t/sim_sanity_006.c0000644000076400007640000000366111302566606017057 0ustar /* -*- linux-c -*- * *(C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Sean Dague */ #include #include #include #include /** * Run a series of sanity tests on the simulator * Return 0 on success, otherwise return -1 **/ static SaHpiResourceIdT get_resid(SaHpiSessionIdT sid, SaHpiEntryIdT srchid) { SaHpiRptEntryT res; SaHpiEntryIdT rptid = SAHPI_FIRST_ENTRY; while(saHpiRptEntryGet(sid, rptid, &rptid, &res) == SA_OK) { if (srchid == res.ResourceEntity.Entry[0].EntityType) { return res.ResourceId; } } return 0; } int main(int argc, char **argv) { SaHpiSessionIdT sid = 0; SaHpiSensorTypeT type; SaHpiEventCategoryT category; SaErrorT rc = SA_OK; rc = saHpiSessionOpen(SAHPI_UNSPECIFIED_DOMAIN_ID, &sid, NULL); if (rc != SA_OK) { err("Failed to open session"); return -1; } rc = saHpiDiscover(sid); if (rc != SA_OK) { err("Failed to run discover"); return -1; } /* get the resource id of the chassis */ SaHpiResourceIdT resid = get_resid(sid, SAHPI_ENT_SYSTEM_CHASSIS); if (resid == 0) { err("Couldn't find the resource id of the chassis"); return -1; } /* get sensor type */ rc = saHpiSensorTypeGet(sid, resid, 1, &type, &category); if (rc != SA_OK) { err("Couldn't get a sensor reading"); err("Error %s",oh_lookup_error(rc)); return -1; } return 0; } openhpi-2.14.1/plugins/simulator/t/sim_sanity_043.c0000644000076400007640000000615411302566606017060 0ustar /* -*- linux-c -*- * *(C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Sean Dague */ #include #include #include #include #include /** * Run a series of sanity tests on the simulator * Return 0 on success, otherwise return -1 **/ static SaHpiResourceIdT get_resid(SaHpiSessionIdT sid, SaHpiEntryIdT srchid) { SaHpiRptEntryT res; SaHpiEntryIdT rptid = SAHPI_FIRST_ENTRY; while(saHpiRptEntryGet(sid, rptid, &rptid, &res) == SA_OK) { if (srchid == res.ResourceEntity.Entry[0].EntityType) { return res.ResourceId; } } return 0; } int main(int argc, char **argv) { SaHpiSessionIdT sid = 0; SaHpiEntryIdT newid; SaHpiIdrFieldT field; SaErrorT rc = SA_OK; rc = saHpiSessionOpen(SAHPI_UNSPECIFIED_DOMAIN_ID, &sid, NULL); if (rc != SA_OK) { err("Failed to open session"); return -1; } rc = saHpiDiscover(sid); if (rc != SA_OK) { err("Failed to run discover"); return -1; } /* get the resource id of the chassis */ SaHpiResourceIdT resid = get_resid(sid, SAHPI_ENT_SYSTEM_CHASSIS); if (resid == 0) { err("Couldn't find the resource id of the chassis"); return -1; } rc = saHpiIdrAreaAdd(sid, resid, 1, SAHPI_IDR_AREATYPE_PRODUCT_INFO, &newid); if (rc == SA_ERR_HPI_READ_ONLY) { return 0; } else if (rc != SA_OK) { err("Couldn't add new area"); err("Error %s",oh_lookup_error(rc)); return -1; } field.AreaId = newid; field.Type = SAHPI_IDR_FIELDTYPE_PART_NUMBER; field.Field.DataType = SAHPI_TL_TYPE_TEXT; field.Field.Language = SAHPI_LANG_ENGLISH; field.Field.DataLength = 6; field.Field.Data[0] = '1'; field.Field.Data[1] = '2'; field.Field.Data[2] = '3'; field.Field.Data[3] = '4'; field.Field.Data[4] = '5'; field.Field.Data[5] = '6'; field.Field.Data[6] = '\0'; rc = saHpiIdrFieldAdd(sid, resid, 1, &field); if (rc != SA_OK) { err("Couldn't add field"); err("Error %s",oh_lookup_error(rc)); return -1; } field.Type = SAHPI_IDR_FIELDTYPE_CUSTOM; rc = saHpiIdrFieldSet(sid, resid, 1, &field); if (rc != SA_OK) { err("Couldn't set field"); err("Error %s",oh_lookup_error(rc)); return -1; } field.AreaId = 1; field.FieldId = 1; rc = saHpiIdrFieldAdd(sid, resid, 1, &field); if (rc == SA_OK) { err("Able to set field to a read only area"); return -1; } return 0; } openhpi-2.14.1/plugins/simulator/t/sim_sanity_005.c0000644000076400007640000000436111302566606017054 0ustar /* -*- linux-c -*- * *(C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Sean Dague */ #include #include #include #include /** * Run a series of sanity tests on the simulator * Return 0 on success, otherwise return -1 **/ static SaHpiResourceIdT get_resid(SaHpiSessionIdT sid, SaHpiEntryIdT srchid) { SaHpiRptEntryT res; SaHpiEntryIdT rptid = SAHPI_FIRST_ENTRY; while(saHpiRptEntryGet(sid, rptid, &rptid, &res) == SA_OK) { if (srchid == res.ResourceEntity.Entry[0].EntityType) { return res.ResourceId; } } return 0; } int main(int argc, char **argv) { SaHpiSessionIdT sid = 0; SaHpiSensorThresholdsT thresholds; SaErrorT rc = SA_OK; rc = saHpiSessionOpen(SAHPI_UNSPECIFIED_DOMAIN_ID, &sid, NULL); if (rc != SA_OK) { err("Failed to open session"); return -1; } rc = saHpiDiscover(sid); if (rc != SA_OK) { err("Failed to run discover"); return -1; } /* get the resource id of the chassis */ SaHpiResourceIdT resid = get_resid(sid, SAHPI_ENT_SYSTEM_CHASSIS); if (resid == 0) { err("Couldn't find the resource id of the chassis"); return -1; } /* get sensor thresholds */ rc = saHpiSensorThresholdsGet(sid, resid, 1, &thresholds); if (rc != SA_OK) { err("Couldn't get sensor thresholds"); err("Error %s",oh_lookup_error(rc)); return -1; } /* set sensor thresholds */ rc = saHpiSensorThresholdsSet(sid, resid, 1, &thresholds); if (rc == SA_OK) { /* all our sensors are read-only so if we can change the sensor it is an error */ err("Error: able to write to a read-only sensor"); return -1; } return 0; } openhpi-2.14.1/plugins/simulator/t/sim_sanity_000.c0000644000076400007640000000160111302566606017041 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * W. David Ashley */ #include #include #include #include /** * Run a series of sanity tests on the simulator * Return 0 on success, otherwise return -1 **/ int main(int argc, char **argv) { SaHpiSessionIdT sid = 0; SaErrorT rc = SA_OK; rc = saHpiSessionOpen(SAHPI_UNSPECIFIED_DOMAIN_ID, &sid, NULL); if (rc != SA_OK) return -1; return 0; } openhpi-2.14.1/plugins/simulator/t/sim_sanity_044.c0000644000076400007640000000611111302566606017052 0ustar /* -*- linux-c -*- * *(C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Sean Dague */ #include #include #include #include #include /** * Run a series of sanity tests on the simulator * Return 0 on success, otherwise return -1 **/ static SaHpiResourceIdT get_resid(SaHpiSessionIdT sid, SaHpiEntryIdT srchid) { SaHpiRptEntryT res; SaHpiEntryIdT rptid = SAHPI_FIRST_ENTRY; while(saHpiRptEntryGet(sid, rptid, &rptid, &res) == SA_OK) { if (srchid == res.ResourceEntity.Entry[0].EntityType) { return res.ResourceId; } } return 0; } int main(int argc, char **argv) { SaHpiSessionIdT sid = 0; SaHpiEntryIdT newid; SaHpiIdrFieldT field; SaErrorT rc = SA_OK; rc = saHpiSessionOpen(SAHPI_UNSPECIFIED_DOMAIN_ID, &sid, NULL); if (rc != SA_OK) { err("Failed to open session"); return -1; } rc = saHpiDiscover(sid); if (rc != SA_OK) { err("Failed to run discover"); return -1; } /* get the resource id of the chassis */ SaHpiResourceIdT resid = get_resid(sid, SAHPI_ENT_SYSTEM_CHASSIS); if (resid == 0) { err("Couldn't find the resource id of the chassis"); return -1; } rc = saHpiIdrAreaAdd(sid, resid, 1, SAHPI_IDR_AREATYPE_PRODUCT_INFO, &newid); if (rc == SA_ERR_HPI_READ_ONLY) { return 0; } else if (rc != SA_OK) { err("Couldn't add new area"); err("Error %s",oh_lookup_error(rc)); return -1; } field.AreaId = newid; field.Type = SAHPI_IDR_FIELDTYPE_PART_NUMBER; field.Field.DataType = SAHPI_TL_TYPE_TEXT; field.Field.Language = SAHPI_LANG_ENGLISH; field.Field.DataLength = 6; field.Field.Data[0] = '1'; field.Field.Data[1] = '2'; field.Field.Data[2] = '3'; field.Field.Data[3] = '4'; field.Field.Data[4] = '5'; field.Field.Data[5] = '6'; field.Field.Data[6] = '\0'; rc = saHpiIdrFieldAdd(sid, resid, 1, &field); if (rc != SA_OK) { err("Couldn't add field"); err("Error %s",oh_lookup_error(rc)); return -1; } rc = saHpiIdrFieldDelete(sid, resid, 1, newid, field.FieldId); if (rc != SA_OK) { err("Couldn't delete field"); err("Error %s",oh_lookup_error(rc)); return -1; } field.AreaId = 1; field.FieldId = 1; rc = saHpiIdrFieldDelete(sid, resid, 1, 1, 1); if (rc == SA_OK) { err("Able to delete read only field"); return -1; } return 0; } openhpi-2.14.1/plugins/simulator/t/sim_sanity_007.c0000644000076400007640000000430411302566606017053 0ustar /* -*- linux-c -*- * *(C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Sean Dague */ #include #include #include #include /** * Run a series of sanity tests on the simulator * Return 0 on success, otherwise return -1 **/ static SaHpiResourceIdT get_resid(SaHpiSessionIdT sid, SaHpiEntryIdT srchid) { SaHpiRptEntryT res; SaHpiEntryIdT rptid = SAHPI_FIRST_ENTRY; while(saHpiRptEntryGet(sid, rptid, &rptid, &res) == SA_OK) { if (srchid == res.ResourceEntity.Entry[0].EntityType) { return res.ResourceId; } } return 0; } int main(int argc, char **argv) { SaHpiSessionIdT sid = 0; SaHpiBoolT enable; SaErrorT rc = SA_OK; rc = saHpiSessionOpen(SAHPI_UNSPECIFIED_DOMAIN_ID, &sid, NULL); if (rc != SA_OK) { err("Failed to open session"); return -1; } rc = saHpiDiscover(sid); if (rc != SA_OK) { err("Failed to run discover"); return -1; } /* get the resource id of the chassis */ SaHpiResourceIdT resid = get_resid(sid, SAHPI_ENT_SYSTEM_CHASSIS); if (resid == 0) { err("Couldn't find the resource id of the chassis"); return -1; } /* get sensor enable */ rc = saHpiSensorEnableGet(sid, resid, 1, &enable); if (rc != SA_OK) { err("Couldn't get sensor enable"); err("Error %s",oh_lookup_error(rc)); return -1; } /* set sensor enable */ rc = saHpiSensorEnableSet(sid, resid, 1, enable); if (rc == SA_OK) { /* all our sensors are read-only so if we can change the sensor it is an error */ err("Error: able to write to a read-only sensor"); return -1; } return 0; } openhpi-2.14.1/plugins/simulator/t/sim_sanity_017.c0000644000076400007640000000365111302566606017060 0ustar /* -*- linux-c -*- * *(C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Sean Dague */ #include #include #include #include #include /** * Run a series of sanity tests on the simulator * Return 0 on success, otherwise return -1 **/ static SaHpiResourceIdT get_resid(SaHpiSessionIdT sid, SaHpiEntryIdT srchid) { SaHpiRptEntryT res; SaHpiEntryIdT rptid = SAHPI_FIRST_ENTRY; while(saHpiRptEntryGet(sid, rptid, &rptid, &res) == SA_OK) { if (srchid == res.ResourceEntity.Entry[0].EntityType) { return res.ResourceId; } } return 0; } int main(int argc, char **argv) { SaHpiSessionIdT sid = 0; SaHpiTimeT cur_time; SaErrorT rc = SA_OK; rc = saHpiSessionOpen(SAHPI_UNSPECIFIED_DOMAIN_ID, &sid, NULL); if (rc != SA_OK) { err("Failed to open session"); return -1; } rc = saHpiDiscover(sid); if (rc != SA_OK) { err("Failed to run discover"); return -1; } /* get the resource id of the chassis */ SaHpiResourceIdT resid = get_resid(sid, SAHPI_ENT_SYSTEM_CHASSIS); if (resid == 0) { err("Couldn't find the resource id of the chassis"); return -1; } /* get event log time */ rc = saHpiEventLogTimeGet(sid, resid, &cur_time); if (rc != SA_OK) { err("Couldn't get event log time"); err("Error %s",oh_lookup_error(rc)); return -1; } return 0; } openhpi-2.14.1/plugins/simulator/t/sim_sanity_030.c0000644000076400007640000000362311302566606017052 0ustar /* -*- linux-c -*- * *(C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Sean Dague */ #include #include #include #include #include /** * Run a series of sanity tests on the simulator * Return 0 on success, otherwise return -1 **/ static SaHpiResourceIdT get_resid(SaHpiSessionIdT sid, SaHpiEntryIdT srchid) { SaHpiRptEntryT res; SaHpiEntryIdT rptid = SAHPI_FIRST_ENTRY; while(saHpiRptEntryGet(sid, rptid, &rptid, &res) == SA_OK) { if (srchid == res.ResourceEntity.Entry[0].EntityType) { return res.ResourceId; } } return 0; } int main(int argc, char **argv) { SaHpiSessionIdT sid = 0; SaHpiResetActionT reset; SaErrorT rc = SA_OK; rc = saHpiSessionOpen(SAHPI_UNSPECIFIED_DOMAIN_ID, &sid, NULL); if (rc != SA_OK) { err("Failed to open session"); return -1; } rc = saHpiDiscover(sid); if (rc != SA_OK) { err("Failed to run discover"); return -1; } /* get the resource id of the chassis */ SaHpiResourceIdT resid = get_resid(sid, SAHPI_ENT_SYSTEM_CHASSIS); if (resid == 0) { err("Couldn't find the resource id of the chassis"); return -1; } rc = saHpiResourceResetStateGet(sid, resid, &reset); if (rc != SA_OK) { err("Couldn't get reset state"); err("Error %s",oh_lookup_error(rc)); return -1; } return 0; } openhpi-2.14.1/plugins/simulator/t/sim_sanity_038.c0000644000076400007640000000440311302566606017057 0ustar /* -*- linux-c -*- * *(C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Sean Dague */ #include #include #include #include #include /** * Run a series of sanity tests on the simulator * Return 0 on success, otherwise return -1 **/ static SaHpiResourceIdT get_resid(SaHpiSessionIdT sid, SaHpiEntryIdT srchid) { SaHpiRptEntryT res; SaHpiEntryIdT rptid = SAHPI_FIRST_ENTRY; while(saHpiRptEntryGet(sid, rptid, &rptid, &res) == SA_OK) { if (srchid == res.ResourceEntity.Entry[0].EntityType) { return res.ResourceId; } } return 0; } int main(int argc, char **argv) { SaHpiSessionIdT sid = 0; SaHpiIdrAreaHeaderT header; SaHpiEntryIdT next; SaErrorT rc = SA_OK; rc = saHpiSessionOpen(SAHPI_UNSPECIFIED_DOMAIN_ID, &sid, NULL); if (rc != SA_OK) { err("Failed to open session"); return -1; } rc = saHpiDiscover(sid); if (rc != SA_OK) { err("Failed to run discover"); return -1; } /* get the resource id of the chassis */ SaHpiResourceIdT resid = get_resid(sid, SAHPI_ENT_SYSTEM_CHASSIS); if (resid == 0) { err("Couldn't find the resource id of the chassis"); return -1; } rc = saHpiIdrAreaHeaderGet(sid, resid, 1, SAHPI_IDR_AREATYPE_CHASSIS_INFO, SAHPI_FIRST_ENTRY, &next, &header); if (rc != SA_OK) { err("Couldn't get first area header"); err("Error %s",oh_lookup_error(rc)); return -1; } rc = saHpiIdrAreaHeaderGet(sid, resid, 1, SAHPI_IDR_AREATYPE_CHASSIS_INFO, next, &next, &header); if (rc == SA_OK) { err("Invalid area header returned"); return -1; } return 0; } openhpi-2.14.1/plugins/simulator/t/sim_sanity_035.c0000644000076400007640000000411211302566606017051 0ustar /* -*- linux-c -*- * *(C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Sean Dague */ #include #include #include #include #include /** * Run a series of sanity tests on the simulator * Return 0 on success, otherwise return -1 **/ static SaHpiResourceIdT get_resid(SaHpiSessionIdT sid, SaHpiEntryIdT srchid) { SaHpiRptEntryT res; SaHpiEntryIdT rptid = SAHPI_FIRST_ENTRY; while(saHpiRptEntryGet(sid, rptid, &rptid, &res) == SA_OK) { if (srchid == res.ResourceEntity.Entry[0].EntityType) { return res.ResourceId; } } return 0; } int main(int argc, char **argv) { SaHpiSessionIdT sid = 0; SaHpiWatchdogT wd; SaErrorT rc = SA_OK; rc = saHpiSessionOpen(SAHPI_UNSPECIFIED_DOMAIN_ID, &sid, NULL); if (rc != SA_OK) { err("Failed to open session"); return -1; } rc = saHpiDiscover(sid); if (rc != SA_OK) { err("Failed to run discover"); return -1; } /* get the resource id of the chassis */ SaHpiResourceIdT resid = get_resid(sid, SAHPI_ENT_SYSTEM_CHASSIS); if (resid == 0) { err("Couldn't find the resource id of the chassis"); return -1; } rc = saHpiWatchdogTimerGet(sid, resid, 1, &wd); if (rc != SA_OK) { err("Couldn't get watchdog timer"); err("Error %s",oh_lookup_error(rc)); return -1; } rc = saHpiWatchdogTimerSet(sid, resid, 1, &wd); if (rc != SA_OK) { err("Couldn't set watchdog timer"); err("Error %s",oh_lookup_error(rc)); return -1; } return 0; } openhpi-2.14.1/plugins/simulator/t/sim_sanity_013.c0000644000076400007640000000360311302566606017051 0ustar /* -*- linux-c -*- * *(C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Sean Dague */ #include #include #include #include /** * Run a series of sanity tests on the simulator * Return 0 on success, otherwise return -1 **/ static SaHpiResourceIdT get_resid(SaHpiSessionIdT sid, SaHpiEntryIdT srchid) { SaHpiRptEntryT res; SaHpiEntryIdT rptid = SAHPI_FIRST_ENTRY; while(saHpiRptEntryGet(sid, rptid, &rptid, &res) == SA_OK) { if (srchid == res.ResourceEntity.Entry[0].EntityType) { return res.ResourceId; } } return 0; } int main(int argc, char **argv) { SaHpiSessionIdT sid = 0; SaHpiEventLogInfoT info; SaErrorT rc = SA_OK; rc = saHpiSessionOpen(SAHPI_UNSPECIFIED_DOMAIN_ID, &sid, NULL); if (rc != SA_OK) { err("Failed to open session"); return -1; } rc = saHpiDiscover(sid); if (rc != SA_OK) { err("Failed to run discover"); return -1; } /* get the resource id of the chassis */ SaHpiResourceIdT resid = get_resid(sid, SAHPI_ENT_SYSTEM_CHASSIS); if (resid == 0) { err("Couldn't find the resource id of the chassis"); return -1; } /* get log info */ rc = saHpiEventLogInfoGet(sid, resid, &info); if (rc != SA_OK) { err("Couldn't get event log info"); err("Error %s",oh_lookup_error(rc)); return -1; } return 0; } openhpi-2.14.1/plugins/simulator/t/sim_sanity_033.c0000644000076400007640000000371211302566606017054 0ustar /* -*- linux-c -*- * *(C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Sean Dague */ #include #include #include #include #include /** * Run a series of sanity tests on the simulator * Return 0 on success, otherwise return -1 **/ static SaHpiResourceIdT get_resid(SaHpiSessionIdT sid, SaHpiEntityTypeT srchid) { SaHpiRptEntryT res; SaHpiEntryIdT rptid = SAHPI_FIRST_ENTRY; while(saHpiRptEntryGet(sid, rptid, &rptid, &res) == SA_OK) { if (srchid == res.ResourceEntity.Entry[0].EntityType && res.ResourceEntity.Entry[0].EntityLocation == 2) { return res.ResourceId; } } return 0; } int main(int argc, char **argv) { SaHpiSessionIdT sid = 0; SaErrorT rc = SA_OK; rc = saHpiSessionOpen(SAHPI_UNSPECIFIED_DOMAIN_ID, &sid, NULL); if (rc != SA_OK) { err("Failed to open session"); return -1; } rc = saHpiDiscover(sid); if (rc != SA_OK) { err("Failed to run discover"); return -1; } /* get the resource id of the hs disk */ SaHpiResourceIdT resid = get_resid(sid, SAHPI_ENT_DISK_DRIVE); if (resid == 0) { err("Couldn't find the resource id of the chassis"); return -1; } rc = saHpiHotSwapActionRequest(sid, resid, SAHPI_HS_ACTION_EXTRACTION); if (rc != SA_OK) { err("Couldn't request action"); err("Error %s",oh_lookup_error(rc)); return -1; } return 0; } openhpi-2.14.1/plugins/simulator/t/sim_sanity_026.c0000644000076400007640000000362511302566606017061 0ustar /* -*- linux-c -*- * *(C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Sean Dague */ #include #include #include #include #include /** * Run a series of sanity tests on the simulator * Return 0 on success, otherwise return -1 **/ static SaHpiResourceIdT get_resid(SaHpiSessionIdT sid, SaHpiEntryIdT srchid) { SaHpiRptEntryT res; SaHpiEntryIdT rptid = SAHPI_FIRST_ENTRY; while(saHpiRptEntryGet(sid, rptid, &rptid, &res) == SA_OK) { if (srchid == res.ResourceEntity.Entry[0].EntityType) { return res.ResourceId; } } return 0; } int main(int argc, char **argv) { SaHpiSessionIdT sid = 0; SaHpiAnnouncementT announ; SaErrorT rc = SA_OK; rc = saHpiSessionOpen(SAHPI_UNSPECIFIED_DOMAIN_ID, &sid, NULL); if (rc != SA_OK) { err("Failed to open session"); return -1; } rc = saHpiDiscover(sid); if (rc != SA_OK) { err("Failed to run discover"); return -1; } /* get the resource id of the chassis */ SaHpiResourceIdT resid = get_resid(sid, SAHPI_ENT_SYSTEM_CHASSIS); if (resid == 0) { err("Couldn't find the resource id of the chassis"); return -1; } rc = saHpiAnnunciatorGet(sid, resid, 1, 1, &announ); if (rc != SA_OK) { err("Couldn't get annunciator"); err("Error %s",oh_lookup_error(rc)); return -1; } return 0; } openhpi-2.14.1/plugins/simulator/t/sim_sanity_037.c0000644000076400007640000000360211302566606017056 0ustar /* -*- linux-c -*- * *(C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Sean Dague */ #include #include #include #include #include /** * Run a series of sanity tests on the simulator * Return 0 on success, otherwise return -1 **/ static SaHpiResourceIdT get_resid(SaHpiSessionIdT sid, SaHpiEntryIdT srchid) { SaHpiRptEntryT res; SaHpiEntryIdT rptid = SAHPI_FIRST_ENTRY; while(saHpiRptEntryGet(sid, rptid, &rptid, &res) == SA_OK) { if (srchid == res.ResourceEntity.Entry[0].EntityType) { return res.ResourceId; } } return 0; } int main(int argc, char **argv) { SaHpiSessionIdT sid = 0; SaHpiIdrInfoT info; SaErrorT rc = SA_OK; rc = saHpiSessionOpen(SAHPI_UNSPECIFIED_DOMAIN_ID, &sid, NULL); if (rc != SA_OK) { err("Failed to open session"); return -1; } rc = saHpiDiscover(sid); if (rc != SA_OK) { err("Failed to run discover"); return -1; } /* get the resource id of the chassis */ SaHpiResourceIdT resid = get_resid(sid, SAHPI_ENT_SYSTEM_CHASSIS); if (resid == 0) { err("Couldn't find the resource id of the chassis"); return -1; } rc = saHpiIdrInfoGet(sid, resid, 1, &info); if (rc != SA_OK) { err("Couldn't get Idr info"); err("Error %s",oh_lookup_error(rc)); return -1; } return 0; } openhpi-2.14.1/plugins/simulator/t/sim_sanity_023.c0000644000076400007640000000363211302566606017054 0ustar /* -*- linux-c -*- * *(C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Sean Dague */ #include #include #include #include #include /** * Run a series of sanity tests on the simulator * Return 0 on success, otherwise return -1 **/ static SaHpiResourceIdT get_resid(SaHpiSessionIdT sid, SaHpiEntryIdT srchid) { SaHpiRptEntryT res; SaHpiEntryIdT rptid = SAHPI_FIRST_ENTRY; while(saHpiRptEntryGet(sid, rptid, &rptid, &res) == SA_OK) { if (srchid == res.ResourceEntity.Entry[0].EntityType) { return res.ResourceId; } } return 0; } int main(int argc, char **argv) { SaHpiSessionIdT sid = 0; SaHpiAnnunciatorModeT mode; SaErrorT rc = SA_OK; rc = saHpiSessionOpen(SAHPI_UNSPECIFIED_DOMAIN_ID, &sid, NULL); if (rc != SA_OK) { err("Failed to open session"); return -1; } rc = saHpiDiscover(sid); if (rc != SA_OK) { err("Failed to run discover"); return -1; } /* get the resource id of the chassis */ SaHpiResourceIdT resid = get_resid(sid, SAHPI_ENT_SYSTEM_CHASSIS); if (resid == 0) { err("Couldn't find the resource id of the chassis"); return -1; } rc = saHpiAnnunciatorModeGet(sid, resid, 1, &mode); if (rc != SA_OK) { err("Couldn't get annunciator mode"); err("Error %s",oh_lookup_error(rc)); return -1; } return 0; } openhpi-2.14.1/plugins/simulator/t/sim_sanity_020.c0000644000076400007640000000363211302566606017051 0ustar /* -*- linux-c -*- * *(C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Sean Dague */ #include #include #include #include #include /** * Run a series of sanity tests on the simulator * Return 0 on success, otherwise return -1 **/ static SaHpiResourceIdT get_resid(SaHpiSessionIdT sid, SaHpiEntryIdT srchid) { SaHpiRptEntryT res; SaHpiEntryIdT rptid = SAHPI_FIRST_ENTRY; while(saHpiRptEntryGet(sid, rptid, &rptid, &res) == SA_OK) { if (srchid == res.ResourceEntity.Entry[0].EntityType) { return res.ResourceId; } } return 0; } int main(int argc, char **argv) { SaHpiSessionIdT sid = 0; SaErrorT rc = SA_OK; rc = saHpiSessionOpen(SAHPI_UNSPECIFIED_DOMAIN_ID, &sid, NULL); if (rc != SA_OK) { err("Failed to open session"); return -1; } rc = saHpiDiscover(sid); if (rc != SA_OK) { err("Failed to run discover"); return -1; } /* get the resource id of the chassis */ SaHpiResourceIdT resid = get_resid(sid, SAHPI_ENT_SYSTEM_CHASSIS); if (resid == 0) { err("Couldn't find the resource id of the chassis"); return -1; } /* reset event log overflow */ rc = saHpiEventLogOverflowReset(sid, resid); if (rc != SA_OK) { err("Couldn't reset event log overflow"); err("Error %s",oh_lookup_error(rc)); return -1; } return 0; } openhpi-2.14.1/plugins/simulator/t/sim_sanity_012.c0000644000076400007640000000415711302566606017055 0ustar /* -*- linux-c -*- * *(C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Sean Dague */ #include #include #include #include /** * Run a series of sanity tests on the simulator * Return 0 on success, otherwise return -1 **/ static SaHpiResourceIdT get_resid(SaHpiSessionIdT sid, SaHpiEntryIdT srchid) { SaHpiRptEntryT res; SaHpiEntryIdT rptid = SAHPI_FIRST_ENTRY; while(saHpiRptEntryGet(sid, rptid, &rptid, &res) == SA_OK) { if (srchid == res.ResourceEntity.Entry[0].EntityType) { return res.ResourceId; } } return 0; } int main(int argc, char **argv) { SaHpiSessionIdT sid = 0; SaHpiCtrlModeT mode; SaHpiCtrlStateT state; SaErrorT rc = SA_OK; rc = saHpiSessionOpen(SAHPI_UNSPECIFIED_DOMAIN_ID, &sid, NULL); if (rc != SA_OK) { err("Failed to open session"); return -1; } rc = saHpiDiscover(sid); if (rc != SA_OK) { err("Failed to run discover"); return -1; } /* get the resource id of the chassis */ SaHpiResourceIdT resid = get_resid(sid, SAHPI_ENT_SYSTEM_CHASSIS); if (resid == 0) { err("Couldn't find the resource id of the chassis"); return -1; } /* get control */ rc = saHpiControlGet(sid, resid, 1, &mode, &state); if (rc != SA_OK) { err("Couldn't get control type"); err("Error %s",oh_lookup_error(rc)); return -1; } /* set control */ rc = saHpiControlSet(sid, resid, 1, mode, &state); if (rc != SA_OK) { err("Couldn't set control"); err("Error %s",oh_lookup_error(rc)); return -1; } return 0; } openhpi-2.14.1/plugins/simulator/t/sim_sanity_004.c0000644000076400007640000000367111302566606017056 0ustar /* -*- linux-c -*- * *(C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Sean Dague */ #include #include #include #include /** * Run a series of sanity tests on the simulator * Return 0 on success, otherwise return -1 **/ static SaHpiResourceIdT get_resid(SaHpiSessionIdT sid, SaHpiEntryIdT srchid) { SaHpiRptEntryT res; SaHpiEntryIdT rptid = SAHPI_FIRST_ENTRY; while(saHpiRptEntryGet(sid, rptid, &rptid, &res) == SA_OK) { if (srchid == res.ResourceEntity.Entry[0].EntityType) { return res.ResourceId; } } return 0; } int main(int argc, char **argv) { SaHpiSessionIdT sid = 0; SaHpiSensorReadingT reading; SaHpiEventStateT state; SaErrorT rc = SA_OK; rc = saHpiSessionOpen(SAHPI_UNSPECIFIED_DOMAIN_ID, &sid, NULL); if (rc != SA_OK) { err("Failed to open session"); return -1; } rc = saHpiDiscover(sid); if (rc != SA_OK) { err("Failed to run discover"); return -1; } /* get the resource id of the chassis */ SaHpiResourceIdT resid = get_resid(sid, SAHPI_ENT_SYSTEM_CHASSIS); if (resid == 0) { err("Couldn't find the resource id of the chassis"); return -1; } /* get a sensor reading */ rc = saHpiSensorReadingGet(sid, resid, 1, &reading, &state); if (rc != SA_OK) { err("Couldn't get a sensor reading"); err("Error %s",oh_lookup_error(rc)); return -1; } return 0; } openhpi-2.14.1/plugins/simulator/t/sim_sanity_019.c0000644000076400007640000000365011302566606017061 0ustar /* -*- linux-c -*- * *(C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Sean Dague */ #include #include #include #include #include /** * Run a series of sanity tests on the simulator * Return 0 on success, otherwise return -1 **/ static SaHpiResourceIdT get_resid(SaHpiSessionIdT sid, SaHpiEntryIdT srchid) { SaHpiRptEntryT res; SaHpiEntryIdT rptid = SAHPI_FIRST_ENTRY; while(saHpiRptEntryGet(sid, rptid, &rptid, &res) == SA_OK) { if (srchid == res.ResourceEntity.Entry[0].EntityType) { return res.ResourceId; } } return 0; } int main(int argc, char **argv) { SaHpiSessionIdT sid = 0; SaHpiBoolT enable; SaErrorT rc = SA_OK; rc = saHpiSessionOpen(SAHPI_UNSPECIFIED_DOMAIN_ID, &sid, NULL); if (rc != SA_OK) { err("Failed to open session"); return -1; } rc = saHpiDiscover(sid); if (rc != SA_OK) { err("Failed to run discover"); return -1; } /* get the resource id of the chassis */ SaHpiResourceIdT resid = get_resid(sid, SAHPI_ENT_SYSTEM_CHASSIS); if (resid == 0) { err("Couldn't find the resource id of the chassis"); return -1; } /* get event log state */ rc = saHpiEventLogStateGet(sid, resid, &enable); if (rc != SA_OK) { err("Couldn't get event log state"); err("Error %s",oh_lookup_error(rc)); return -1; } return 0; } openhpi-2.14.1/plugins/simulator/t/openhpi.conf0000644000076400007640000000016511302566606016454 0ustar plugin libsimulator handler libsimulator { entity_root = "{SYSTEM_CHASSIS,1}" name = "simulator" } openhpi-2.14.1/plugins/simulator/t/sim_sanity_018.c0000644000076400007640000000365411302566606017064 0ustar /* -*- linux-c -*- * *(C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Sean Dague */ #include #include #include #include #include /** * Run a series of sanity tests on the simulator * Return 0 on success, otherwise return -1 **/ static SaHpiResourceIdT get_resid(SaHpiSessionIdT sid, SaHpiEntryIdT srchid) { SaHpiRptEntryT res; SaHpiEntryIdT rptid = SAHPI_FIRST_ENTRY; while(saHpiRptEntryGet(sid, rptid, &rptid, &res) == SA_OK) { if (srchid == res.ResourceEntity.Entry[0].EntityType) { return res.ResourceId; } } return 0; } int main(int argc, char **argv) { SaHpiSessionIdT sid = 0; SaHpiTimeT cur_time = 0; SaErrorT rc = SA_OK; rc = saHpiSessionOpen(SAHPI_UNSPECIFIED_DOMAIN_ID, &sid, NULL); if (rc != SA_OK) { err("Failed to open session"); return -1; } rc = saHpiDiscover(sid); if (rc != SA_OK) { err("Failed to run discover"); return -1; } /* get the resource id of the chassis */ SaHpiResourceIdT resid = get_resid(sid, SAHPI_ENT_SYSTEM_CHASSIS); if (resid == 0) { err("Couldn't find the resource id of the chassis"); return -1; } /* set event log time */ rc = saHpiEventLogTimeSet(sid, resid, cur_time); if (rc != SA_OK) { err("Couldn't set event log time"); err("Error %s",oh_lookup_error(rc)); return -1; } return 0; } openhpi-2.14.1/plugins/simulator/t/sim_sanity_016.c0000644000076400007640000000502711302566606017056 0ustar /* -*- linux-c -*- * *(C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Sean Dague */ #include #include #include #include #include /** * Run a series of sanity tests on the simulator * Return 0 on success, otherwise return -1 **/ static SaHpiResourceIdT get_resid(SaHpiSessionIdT sid, SaHpiEntryIdT srchid) { SaHpiRptEntryT res; SaHpiEntryIdT rptid = SAHPI_FIRST_ENTRY; while(saHpiRptEntryGet(sid, rptid, &rptid, &res) == SA_OK) { if (srchid == res.ResourceEntity.Entry[0].EntityType) { return res.ResourceId; } } return 0; } int main(int argc, char **argv) { SaHpiSessionIdT sid = 0; SaHpiEventT entry; SaErrorT rc = SA_OK; rc = saHpiSessionOpen(SAHPI_UNSPECIFIED_DOMAIN_ID, &sid, NULL); if (rc != SA_OK) { err("Failed to open session"); return -1; } rc = saHpiDiscover(sid); if (rc != SA_OK) { err("Failed to run discover"); return -1; } /* get the resource id of the chassis */ SaHpiResourceIdT resid = get_resid(sid, SAHPI_ENT_SYSTEM_CHASSIS); if (resid == 0) { err("Couldn't find the resource id of the chassis"); return -1; } /* initialize the new event log entry */ entry.Source = SAHPI_UNSPECIFIED_RESOURCE_ID; entry.EventType = SAHPI_ET_USER; entry.Timestamp = 0; entry.Severity = SAHPI_INFORMATIONAL; oh_init_textbuffer(&entry.EventDataUnion.UserEvent.UserEventData); oh_append_textbuffer(&entry.EventDataUnion.UserEvent.UserEventData, "My user data"); /* add event log entry */ rc = saHpiEventLogEntryAdd(sid, resid, &entry); if (rc != SA_OK) { err("Couldn't add event log entry"); err("Error %s",oh_lookup_error(rc)); return -1; } /* clear event log */ rc = saHpiEventLogClear(sid, resid); if (rc != SA_OK) { err("Couldn't clear event log"); err("Error %s",oh_lookup_error(rc)); return -1; } return 0; } openhpi-2.14.1/plugins/simulator/t/sim_sanity_031.c0000644000076400007640000000357411302566606017060 0ustar /* -*- linux-c -*- * *(C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Sean Dague */ #include #include #include #include #include /** * Run a series of sanity tests on the simulator * Return 0 on success, otherwise return -1 **/ static SaHpiResourceIdT get_resid(SaHpiSessionIdT sid, SaHpiEntryIdT srchid) { SaHpiRptEntryT res; SaHpiEntryIdT rptid = SAHPI_FIRST_ENTRY; while(saHpiRptEntryGet(sid, rptid, &rptid, &res) == SA_OK) { if (srchid == res.ResourceEntity.Entry[0].EntityType) { return res.ResourceId; } } return 0; } int main(int argc, char **argv) { SaHpiSessionIdT sid = 0; SaErrorT rc = SA_OK; rc = saHpiSessionOpen(SAHPI_UNSPECIFIED_DOMAIN_ID, &sid, NULL); if (rc != SA_OK) { err("Failed to open session"); return -1; } rc = saHpiDiscover(sid); if (rc != SA_OK) { err("Failed to run discover"); return -1; } /* get the resource id of the chassis */ SaHpiResourceIdT resid = get_resid(sid, SAHPI_ENT_SYSTEM_CHASSIS); if (resid == 0) { err("Couldn't find the resource id of the chassis"); return -1; } rc = saHpiResourceResetStateSet(sid, resid, SAHPI_COLD_RESET); if (rc != SA_OK) { err("Couldn't set reset state"); err("Error %s",oh_lookup_error(rc)); return -1; } return 0; } openhpi-2.14.1/plugins/simulator/t/sim_sanity_042.c0000644000076400007640000000552711302566606017062 0ustar /* -*- linux-c -*- * *(C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Sean Dague */ #include #include #include #include #include /** * Run a series of sanity tests on the simulator * Return 0 on success, otherwise return -1 **/ static SaHpiResourceIdT get_resid(SaHpiSessionIdT sid, SaHpiEntryIdT srchid) { SaHpiRptEntryT res; SaHpiEntryIdT rptid = SAHPI_FIRST_ENTRY; while(saHpiRptEntryGet(sid, rptid, &rptid, &res) == SA_OK) { if (srchid == res.ResourceEntity.Entry[0].EntityType) { return res.ResourceId; } } return 0; } int main(int argc, char **argv) { SaHpiSessionIdT sid = 0; SaHpiEntryIdT newid; SaHpiIdrFieldT field; SaErrorT rc = SA_OK; rc = saHpiSessionOpen(SAHPI_UNSPECIFIED_DOMAIN_ID, &sid, NULL); if (rc != SA_OK) { err("Failed to open session"); return -1; } rc = saHpiDiscover(sid); if (rc != SA_OK) { err("Failed to run discover"); return -1; } /* get the resource id of the chassis */ SaHpiResourceIdT resid = get_resid(sid, SAHPI_ENT_SYSTEM_CHASSIS); if (resid == 0) { err("Couldn't find the resource id of the chassis"); return -1; } rc = saHpiIdrAreaAdd(sid, resid, 1, SAHPI_IDR_AREATYPE_PRODUCT_INFO, &newid); if (rc == SA_ERR_HPI_READ_ONLY) { return 0; } else if (rc != SA_OK) { err("Couldn't add new area"); err("Error %s",oh_lookup_error(rc)); return -1; } field.AreaId = newid; field.Type = SAHPI_IDR_FIELDTYPE_PART_NUMBER; field.Field.DataType = SAHPI_TL_TYPE_TEXT; field.Field.Language = SAHPI_LANG_ENGLISH; field.Field.DataLength = 6; field.Field.Data[0] = '1'; field.Field.Data[1] = '2'; field.Field.Data[2] = '3'; field.Field.Data[3] = '4'; field.Field.Data[4] = '5'; field.Field.Data[5] = '6'; field.Field.Data[6] = '\0'; rc = saHpiIdrFieldAdd(sid, resid, 1, &field); if (rc != SA_OK) { err("Couldn't add field"); err("Error %s",oh_lookup_error(rc)); return -1; } field.AreaId = 1; rc = saHpiIdrFieldAdd(sid, resid, 1, &field); if (rc == SA_OK) { err("Able to add field to a read only area"); return -1; } return 0; } openhpi-2.14.1/plugins/simulator/t/sim_sanity_034.c0000644000076400007640000000361311302566606017055 0ustar /* -*- linux-c -*- * *(C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Sean Dague */ #include #include #include #include #include /** * Run a series of sanity tests on the simulator * Return 0 on success, otherwise return -1 **/ static SaHpiResourceIdT get_resid(SaHpiSessionIdT sid, SaHpiEntryIdT srchid) { SaHpiRptEntryT res; SaHpiEntryIdT rptid = SAHPI_FIRST_ENTRY; while(saHpiRptEntryGet(sid, rptid, &rptid, &res) == SA_OK) { if (srchid == res.ResourceEntity.Entry[0].EntityType) { return res.ResourceId; } } return 0; } int main(int argc, char **argv) { SaHpiSessionIdT sid = 0; SaHpiWatchdogT wd; SaErrorT rc = SA_OK; rc = saHpiSessionOpen(SAHPI_UNSPECIFIED_DOMAIN_ID, &sid, NULL); if (rc != SA_OK) { err("Failed to open session"); return -1; } rc = saHpiDiscover(sid); if (rc != SA_OK) { err("Failed to run discover"); return -1; } /* get the resource id of the chassis */ SaHpiResourceIdT resid = get_resid(sid, SAHPI_ENT_SYSTEM_CHASSIS); if (resid == 0) { err("Couldn't find the resource id of the chassis"); return -1; } rc = saHpiWatchdogTimerGet(sid, resid, 1, &wd); if (rc != SA_OK) { err("Couldn't get watchdog timer"); err("Error %s",oh_lookup_error(rc)); return -1; } return 0; } openhpi-2.14.1/plugins/simulator/t/sim_sanity_040.c0000644000076400007640000000425411302566606017054 0ustar /* -*- linux-c -*- * *(C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Sean Dague */ #include #include #include #include #include /** * Run a series of sanity tests on the simulator * Return 0 on success, otherwise return -1 **/ static SaHpiResourceIdT get_resid(SaHpiSessionIdT sid, SaHpiEntryIdT srchid) { SaHpiRptEntryT res; SaHpiEntryIdT rptid = SAHPI_FIRST_ENTRY; while(saHpiRptEntryGet(sid, rptid, &rptid, &res) == SA_OK) { if (srchid == res.ResourceEntity.Entry[0].EntityType) { return res.ResourceId; } } return 0; } int main(int argc, char **argv) { SaHpiSessionIdT sid = 0; SaHpiEntryIdT newid; SaErrorT rc = SA_OK; rc = saHpiSessionOpen(SAHPI_UNSPECIFIED_DOMAIN_ID, &sid, NULL); if (rc != SA_OK) { err("Failed to open session"); return -1; } rc = saHpiDiscover(sid); if (rc != SA_OK) { err("Failed to run discover"); return -1; } /* get the resource id of the chassis */ SaHpiResourceIdT resid = get_resid(sid, SAHPI_ENT_SYSTEM_CHASSIS); if (resid == 0) { err("Couldn't find the resource id of the chassis"); return -1; } rc = saHpiIdrAreaAdd(sid, resid, 1, SAHPI_IDR_AREATYPE_PRODUCT_INFO, &newid); if (rc == SA_ERR_HPI_READ_ONLY) { return 0; } else if (rc != SA_OK) { err("Couldn't add new area"); err("Error %s",oh_lookup_error(rc)); return -1; } rc = saHpiIdrAreaDelete(sid, resid, 1, newid); if (rc != SA_OK) { err("Couldn't delete new area"); err("Error %s",oh_lookup_error(rc)); return -1; } return 0; } openhpi-2.14.1/plugins/simulator/t/sim_sanity_021.c0000644000076400007640000000613311302566606017051 0ustar /* -*- linux-c -*- * *(C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Sean Dague */ #include #include #include #include #include /** * Run a series of sanity tests on the simulator * Return 0 on success, otherwise return -1 **/ static SaHpiResourceIdT get_resid(SaHpiSessionIdT sid, SaHpiEntryIdT srchid) { SaHpiRptEntryT res; SaHpiEntryIdT rptid = SAHPI_FIRST_ENTRY; while(saHpiRptEntryGet(sid, rptid, &rptid, &res) == SA_OK) { if (srchid == res.ResourceEntity.Entry[0].EntityType) { return res.ResourceId; } } return 0; } int main(int argc, char **argv) { SaHpiSessionIdT sid = 0; SaHpiAnnouncementT announ; SaErrorT rc = SA_OK; rc = saHpiSessionOpen(SAHPI_UNSPECIFIED_DOMAIN_ID, &sid, NULL); if (rc != SA_OK) { err("Failed to open session"); return -1; } rc = saHpiDiscover(sid); if (rc != SA_OK) { err("Failed to run discover"); return -1; } /* get the resource id of the chassis */ SaHpiResourceIdT resid = get_resid(sid, SAHPI_ENT_SYSTEM_CHASSIS); if (resid == 0) { err("Couldn't find the resource id of the chassis"); return -1; } /* add an announcement */ announ.EntryId = 0; // modified by oh_announcement_append announ.Timestamp = 0; // modified by oh_announcement_append announ.AddedByUser = FALSE; // modified by oh_announcement_append announ.Severity = SAHPI_CRITICAL; announ.Acknowledged = FALSE; announ.StatusCond.Type= SAHPI_STATUS_COND_TYPE_SENSOR; announ.StatusCond.Entity.Entry[0].EntityType = SAHPI_ENT_SYSTEM_BOARD; announ.StatusCond.Entity.Entry[0].EntityLocation = 1; announ.StatusCond.Entity.Entry[1].EntityType = SAHPI_ENT_ROOT; announ.StatusCond.Entity.Entry[1].EntityLocation = 0; announ.StatusCond.DomainId = 1; announ.StatusCond.ResourceId = 1; announ.StatusCond.SensorNum = 1; announ.StatusCond.EventState = SAHPI_ES_UNSPECIFIED; announ.StatusCond.Name.Length = 6; memcpy(&announ.StatusCond.Name.Value,"announ", 6); announ.StatusCond.Mid = 123; announ.StatusCond.Data.DataType = SAHPI_TL_TYPE_TEXT; announ.StatusCond.Data.Language = SAHPI_LANG_ENGLISH; announ.StatusCond.Data.DataLength = 6; memcpy(&announ.StatusCond.Data.Data,"announ", 6); rc = saHpiAnnunciatorAdd(sid, resid, 1, &announ); if (rc != SA_OK) { err("Couldn't add announcement"); err("Error %s",oh_lookup_error(rc)); return -1; } return 0; } openhpi-2.14.1/plugins/simulator/t/sim_sanity_027.c0000644000076400007640000000544611302566606017065 0ustar /* -*- linux-c -*- * *(C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Sean Dague */ #include #include #include #include #include /** * Run a series of sanity tests on the simulator * Return 0 on success, otherwise return -1 **/ static SaHpiResourceIdT get_resid(SaHpiSessionIdT sid, SaHpiEntryIdT srchid) { SaHpiRptEntryT res; SaHpiEntryIdT rptid = SAHPI_FIRST_ENTRY; while(saHpiRptEntryGet(sid, rptid, &rptid, &res) == SA_OK) { if (srchid == res.ResourceEntity.Entry[0].EntityType) { return res.ResourceId; } } return 0; } int main(int argc, char **argv) { SaHpiSessionIdT sid = 0; SaHpiAnnouncementT announ; SaErrorT rc = SA_OK; rc = saHpiSessionOpen(SAHPI_UNSPECIFIED_DOMAIN_ID, &sid, NULL); if (rc != SA_OK) { err("Failed to open session"); return -1; } rc = saHpiDiscover(sid); if (rc != SA_OK) { err("Failed to run discover"); return -1; } /* get the resource id of the chassis */ SaHpiResourceIdT resid = get_resid(sid, SAHPI_ENT_SYSTEM_CHASSIS); if (resid == 0) { err("Couldn't find the resource id of the chassis"); return -1; } announ.EntryId = SAHPI_FIRST_ENTRY; rc = saHpiAnnunciatorGetNext(sid, resid, 1, SAHPI_ALL_SEVERITIES, FALSE, &announ); if (rc != SA_OK) { err("Couldn't get next annunciator"); err("Error %s",oh_lookup_error(rc)); return -1; } rc = saHpiAnnunciatorGetNext(sid, resid, 1, SAHPI_ALL_SEVERITIES, FALSE, &announ); if (rc != SA_OK) { err("Couldn't get next annunciator"); err("Error %s",oh_lookup_error(rc)); return -1; } rc = saHpiAnnunciatorGetNext(sid, resid, 1, SAHPI_ALL_SEVERITIES, FALSE, &announ); if (rc != SA_OK) { err("Couldn't get next annunciator"); err("Error %s",oh_lookup_error(rc)); return -1; } rc = saHpiAnnunciatorGetNext(sid, resid, 1, SAHPI_ALL_SEVERITIES, FALSE, &announ); if (rc == SA_OK) { err("Invalid number of announcements"); err("Error %s",oh_lookup_error(rc)); return -1; } return 0; } openhpi-2.14.1/plugins/simulator/t/sim_sanity_028.c0000644000076400007640000000363011302566606017057 0ustar /* -*- linux-c -*- * *(C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Sean Dague */ #include #include #include #include #include /** * Run a series of sanity tests on the simulator * Return 0 on success, otherwise return -1 **/ static SaHpiResourceIdT get_resid(SaHpiSessionIdT sid, SaHpiEntryIdT srchid) { SaHpiRptEntryT res; SaHpiEntryIdT rptid = SAHPI_FIRST_ENTRY; while(saHpiRptEntryGet(sid, rptid, &rptid, &res) == SA_OK) { if (srchid == res.ResourceEntity.Entry[0].EntityType) { return res.ResourceId; } } return 0; } int main(int argc, char **argv) { SaHpiSessionIdT sid = 0; SaHpiPowerStateT pwrstate; SaErrorT rc = SA_OK; rc = saHpiSessionOpen(SAHPI_UNSPECIFIED_DOMAIN_ID, &sid, NULL); if (rc != SA_OK) { err("Failed to open session"); return -1; } rc = saHpiDiscover(sid); if (rc != SA_OK) { err("Failed to run discover"); return -1; } /* get the resource id of the chassis */ SaHpiResourceIdT resid = get_resid(sid, SAHPI_ENT_SYSTEM_CHASSIS); if (resid == 0) { err("Couldn't find the resource id of the chassis"); return -1; } rc = saHpiResourcePowerStateGet(sid, resid, &pwrstate); if (rc != SA_OK) { err("Couldn't get power state"); err("Error %s",oh_lookup_error(rc)); return -1; } return 0; } openhpi-2.14.1/plugins/simulator/t/sim_sanity_036.c0000644000076400007640000000355711302566606017066 0ustar /* -*- linux-c -*- * *(C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Sean Dague */ #include #include #include #include #include /** * Run a series of sanity tests on the simulator * Return 0 on success, otherwise return -1 **/ static SaHpiResourceIdT get_resid(SaHpiSessionIdT sid, SaHpiEntryIdT srchid) { SaHpiRptEntryT res; SaHpiEntryIdT rptid = SAHPI_FIRST_ENTRY; while(saHpiRptEntryGet(sid, rptid, &rptid, &res) == SA_OK) { if (srchid == res.ResourceEntity.Entry[0].EntityType) { return res.ResourceId; } } return 0; } int main(int argc, char **argv) { SaHpiSessionIdT sid = 0; SaErrorT rc = SA_OK; rc = saHpiSessionOpen(SAHPI_UNSPECIFIED_DOMAIN_ID, &sid, NULL); if (rc != SA_OK) { err("Failed to open session"); return -1; } rc = saHpiDiscover(sid); if (rc != SA_OK) { err("Failed to run discover"); return -1; } /* get the resource id of the chassis */ SaHpiResourceIdT resid = get_resid(sid, SAHPI_ENT_SYSTEM_CHASSIS); if (resid == 0) { err("Couldn't find the resource id of the chassis"); return -1; } rc = saHpiWatchdogTimerReset(sid, resid, 1); if (rc != SA_OK) { err("Couldn't reset watchdog timer"); err("Error %s",oh_lookup_error(rc)); return -1; } return 0; } openhpi-2.14.1/plugins/simulator/t/sim_sanity_011.c0000644000076400007640000000362511302566606017053 0ustar /* -*- linux-c -*- * *(C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Sean Dague */ #include #include #include #include /** * Run a series of sanity tests on the simulator * Return 0 on success, otherwise return -1 **/ static SaHpiResourceIdT get_resid(SaHpiSessionIdT sid, SaHpiEntryIdT srchid) { SaHpiRptEntryT res; SaHpiEntryIdT rptid = SAHPI_FIRST_ENTRY; while(saHpiRptEntryGet(sid, rptid, &rptid, &res) == SA_OK) { if (srchid == res.ResourceEntity.Entry[0].EntityType) { return res.ResourceId; } } return 0; } int main(int argc, char **argv) { SaHpiSessionIdT sid = 0; SaHpiCtrlModeT mode; SaHpiCtrlStateT state; SaErrorT rc = SA_OK; rc = saHpiSessionOpen(SAHPI_UNSPECIFIED_DOMAIN_ID, &sid, NULL); if (rc != SA_OK) { err("Failed to open session"); return -1; } rc = saHpiDiscover(sid); if (rc != SA_OK) { err("Failed to run discover"); return -1; } /* get the resource id of the chassis */ SaHpiResourceIdT resid = get_resid(sid, SAHPI_ENT_SYSTEM_CHASSIS); if (resid == 0) { err("Couldn't find the resource id of the chassis"); return -1; } /* get control */ rc = saHpiControlGet(sid, resid, 1, &mode, &state); if (rc != SA_OK) { err("Couldn't get control"); err("Error %s",oh_lookup_error(rc)); return -1; } return 0; } openhpi-2.14.1/plugins/simulator/t/sim_sanity_045.c0000644000076400007640000000354311302566606017061 0ustar /* -*- linux-c -*- * *(C) Copyright IBM Corp. 2005-2006 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * W. David Ashley */ #include #include #include /** * Run a series of sanity tests on the simulator * Return 0 on success, otherwise return -1 **/ int main(int argc, char **argv) { SaHpiSessionIdT sid = 0; SaErrorT rc = SA_OK; int event_ctr = 0; SaHpiEventLogEntryT ele; SaHpiRdrT rdr; SaHpiRptEntryT rpte; SaHpiEventLogEntryIdT eleid, neleid, peleid; rc = saHpiSessionOpen(SAHPI_UNSPECIFIED_DOMAIN_ID, &sid, NULL); if(rc != SA_OK) return -1; rc = saHpiSubscribe(sid); if(rc != SA_OK) return -1; rc = saHpiDiscover(sid); if (rc != SA_OK) return -1; /* count discovery events */ eleid = neleid = SAHPI_OLDEST_ENTRY; while (rc == SA_OK && neleid != SAHPI_NO_MORE_ENTRIES) { rc = saHpiEventLogEntryGet(sid, SAHPI_UNSPECIFIED_RESOURCE_ID, eleid, &peleid, &neleid, &ele, &rdr, &rpte); if (ele.Event.EventType == SAHPI_ET_RESOURCE) event_ctr++; eleid = neleid; } if (rc != SA_OK) { printf("SaHpiEventLogEntryGet returned %d.\n", rc); return -1; } /* A FRU device does NOT generate an ADD event. So our Hot Swap Disk * Drive Bay resource will not generate an ADD event since it is marked * as a FRU. If you change this, this test will see an additional event. */ if (event_ctr != 4) { printf("Incorrect number of events returned. Found %d events.\n", event_ctr); return -1; } return 0; } openhpi-2.14.1/plugins/simulator/t/sim_sanity_039.c0000644000076400007640000000374011302566606017063 0ustar /* -*- linux-c -*- * *(C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Sean Dague */ #include #include #include #include #include /** * Run a series of sanity tests on the simulator * Return 0 on success, otherwise return -1 **/ static SaHpiResourceIdT get_resid(SaHpiSessionIdT sid, SaHpiEntryIdT srchid) { SaHpiRptEntryT res; SaHpiEntryIdT rptid = SAHPI_FIRST_ENTRY; while(saHpiRptEntryGet(sid, rptid, &rptid, &res) == SA_OK) { if (srchid == res.ResourceEntity.Entry[0].EntityType) { return res.ResourceId; } } return 0; } int main(int argc, char **argv) { SaHpiSessionIdT sid = 0; SaHpiEntryIdT newid; SaErrorT rc = SA_OK; rc = saHpiSessionOpen(SAHPI_UNSPECIFIED_DOMAIN_ID, &sid, NULL); if (rc != SA_OK) { err("Failed to open session"); return -1; } rc = saHpiDiscover(sid); if (rc != SA_OK) { err("Failed to run discover"); return -1; } /* get the resource id of the chassis */ SaHpiResourceIdT resid = get_resid(sid, SAHPI_ENT_SYSTEM_CHASSIS); if (resid == 0) { err("Couldn't find the resource id of the chassis"); return -1; } rc = saHpiIdrAreaAdd(sid, resid, 1, SAHPI_IDR_AREATYPE_PRODUCT_INFO, &newid); if (rc != SA_OK && rc != SA_ERR_HPI_READ_ONLY) { err("Couldn't add new area"); err("Error %s",oh_lookup_error(rc)); return -1; } return 0; } openhpi-2.14.1/plugins/simulator/t/sim_sanity_010.c0000644000076400007640000000360311302566606017046 0ustar /* -*- linux-c -*- * *(C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Sean Dague */ #include #include #include #include /** * Run a series of sanity tests on the simulator * Return 0 on success, otherwise return -1 **/ static SaHpiResourceIdT get_resid(SaHpiSessionIdT sid, SaHpiEntryIdT srchid) { SaHpiRptEntryT res; SaHpiEntryIdT rptid = SAHPI_FIRST_ENTRY; while(saHpiRptEntryGet(sid, rptid, &rptid, &res) == SA_OK) { if (srchid == res.ResourceEntity.Entry[0].EntityType) { return res.ResourceId; } } return 0; } int main(int argc, char **argv) { SaHpiSessionIdT sid = 0; SaHpiCtrlTypeT type; SaErrorT rc = SA_OK; rc = saHpiSessionOpen(SAHPI_UNSPECIFIED_DOMAIN_ID, &sid, NULL); if (rc != SA_OK) { err("Failed to open session"); return -1; } rc = saHpiDiscover(sid); if (rc != SA_OK) { err("Failed to run discover"); return -1; } /* get the resource id of the chassis */ SaHpiResourceIdT resid = get_resid(sid, SAHPI_ENT_SYSTEM_CHASSIS); if (resid == 0) { err("Couldn't find the resource id of the chassis"); return -1; } /* get control type */ rc = saHpiControlTypeGet(sid, resid, 1, &type); if (rc != SA_OK) { err("Couldn't get control type"); err("Error %s",oh_lookup_error(rc)); return -1; } return 0; } openhpi-2.14.1/plugins/simulator/t/sim_sanity_002.c0000644000076400007640000000237111302566606017050 0ustar /* -*- linux-c -*- * *(C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Sean Dague */ #include #include #include #include /** * Run a series of sanity tests on the simulator * Return 0 on success, otherwise return -1 **/ int main(int argc, char **argv) { SaHpiSessionIdT sid = 0; SaHpiRptEntryT res; SaHpiEntryIdT id = SAHPI_FIRST_ENTRY; SaErrorT rc = SA_OK; rc = saHpiSessionOpen(SAHPI_UNSPECIFIED_DOMAIN_ID, &sid, NULL); if (rc != SA_OK) { err("Failed to open session"); return -1; } rc = saHpiDiscover(sid); if (rc != SA_OK) { err("Failed to run discover"); return -1; } rc = saHpiRptEntryGet(sid, id, &id, &res); if (rc != SA_OK) { err("Couldn't get the first rpt entry"); err("Error %s",oh_lookup_error(rc)); return -1; } return 0; } openhpi-2.14.1/plugins/simulator/t/sim_sanity_001.c0000644000076400007640000000161011302566606017042 0ustar /* -*- linux-c -*- * *(C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Sean Dague */ #include #include #include #include /** * Run a series of sanity tests on the simulator * Return 0 on success, otherwise return -1 **/ int main(int argc, char **argv) { SaHpiSessionIdT sid = 0; SaErrorT rc = SA_OK; rc = saHpiSessionOpen(SAHPI_UNSPECIFIED_DOMAIN_ID, &sid, NULL); if(rc != SA_OK) return -1; rc = saHpiDiscover(sid); if (rc != SA_OK) return -1; return 0; } openhpi-2.14.1/plugins/simulator/t/sim_sanity_009.c0000644000076400007640000000451411302566606017060 0ustar /* -*- linux-c -*- * *(C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Sean Dague */ #include #include #include #include /** * Run a series of sanity tests on the simulator * Return 0 on success, otherwise return -1 **/ static SaHpiResourceIdT get_resid(SaHpiSessionIdT sid, SaHpiEntryIdT srchid) { SaHpiRptEntryT res; SaHpiEntryIdT rptid = SAHPI_FIRST_ENTRY; while(saHpiRptEntryGet(sid, rptid, &rptid, &res) == SA_OK) { if (srchid == res.ResourceEntity.Entry[0].EntityType) { return res.ResourceId; } } return 0; } int main(int argc, char **argv) { SaHpiSessionIdT sid = 0; SaHpiEventStateT amask; SaHpiEventStateT dmask; SaErrorT rc = SA_OK; rc = saHpiSessionOpen(SAHPI_UNSPECIFIED_DOMAIN_ID, &sid, NULL); if (rc != SA_OK) { err("Failed to open session"); return -1; } rc = saHpiDiscover(sid); if (rc != SA_OK) { err("Failed to run discover"); return -1; } /* get the resource id of the chassis */ SaHpiResourceIdT resid = get_resid(sid, SAHPI_ENT_SYSTEM_CHASSIS); if (resid == 0) { err("Couldn't find the resource id of the chassis"); return -1; } /* get sensor event masks */ rc = saHpiSensorEventMasksGet(sid, resid, 1, &amask, &dmask); if (rc != SA_OK) { err("Couldn't get sensor event masks"); err("Error %s",oh_lookup_error(rc)); return -1; } /* set sensor event masks */ rc = saHpiSensorEventMasksSet(sid, resid, 1, SAHPI_SENS_ADD_EVENTS_TO_MASKS, amask, dmask); if (rc == SA_OK) { /* all our sensors are read-only so if we can change the sensor it is an error */ err("Error: able to write to a read-only sensor"); return -1; } return 0; } openhpi-2.14.1/plugins/simulator/sim_control_func.c0000644000076400007640000001275111302566612017410 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * Christina Hernandez * W. David Ashley */ #include SaErrorT sim_get_control_state(void *hnd, SaHpiResourceIdT rid, SaHpiCtrlNumT cid, SaHpiCtrlModeT *mode, SaHpiCtrlStateT *state) { struct sim_control_info *info; if (!hnd) { err("Invalid parameter."); return(SA_ERR_HPI_INVALID_PARAMS); } struct oh_handler_state *handle = (struct oh_handler_state *)hnd; /* Check if resource exists and has control capabilities */ SaHpiRptEntryT *rpt = oh_get_resource_by_id(handle->rptcache, rid); if (!rpt) { return(SA_ERR_HPI_INVALID_RESOURCE); } if (!(rpt->ResourceCapabilities & SAHPI_CAPABILITY_CONTROL)) { return(SA_ERR_HPI_CAPABILITY); } /* Find control and its mapping data - see if it accessable */ SaHpiRdrT *rdr = oh_get_rdr_by_type(handle->rptcache, rid, SAHPI_CTRL_RDR, cid); if (rdr == NULL) { return(SA_ERR_HPI_NOT_PRESENT); } info = (struct sim_control_info *)oh_get_rdr_data(handle->rptcache, rid, rdr->RecordId); if (info == NULL) { err("No control data. Control=%s", rdr->IdString.Data); return(SA_ERR_HPI_NOT_PRESENT); } if (rdr->RdrTypeUnion.CtrlRec.WriteOnly) { return(SA_ERR_HPI_INVALID_CMD); } if (!mode && !state) { return(SA_OK); } if (state) { if (rdr->RdrTypeUnion.CtrlRec.Type == SAHPI_CTRL_TYPE_TEXT) { if (state->StateUnion.Text.Line != SAHPI_TLN_ALL_LINES && state->StateUnion.Text.Line > rdr->RdrTypeUnion.CtrlRec.TypeUnion.Text.MaxLines) { return(SA_ERR_HPI_INVALID_DATA); } } } if (state) memcpy(state, &info->state, sizeof(SaHpiCtrlStateT)); if (mode) *mode = info->mode; return(SA_OK); } /** * sim_set_control_state: * @hnd: Handler data pointer. * @rid: Resource ID. * @cid: Control ID. * @mode: Control's operational mode to set. * @state: Pointer to control's state to set. * * Sets a control's operational mode and/or state. Both @mode and @state * may be NULL (e.g. check for presence). * * Return values: * SA_OK - Normal case. * SA_ERR_HPI_CAPABILITY - Resource doesn't have SAHPI_CAPABILITY_CONTROL. * SA_ERR_HPI_INVALID_DATA - @state contains bad text control data. * SA_ERR_HPI_INVALID_RESOURCE - Resource doesn't exist. * SA_ERR_HPI_NOT_PRESENT - Control doesn't exist. **/ SaErrorT sim_set_control_state(void *hnd, SaHpiResourceIdT rid, SaHpiCtrlNumT cid, SaHpiCtrlModeT mode, SaHpiCtrlStateT *state) { SaErrorT err; struct sim_control_info *info; struct oh_handler_state *handle = (struct oh_handler_state *)hnd; if (!hnd) { err("Invalid parameter."); return(SA_ERR_HPI_INVALID_PARAMS); } /* Check if resource exists and has control capabilities */ SaHpiRptEntryT *rpt = oh_get_resource_by_id(handle->rptcache, rid); if (!rpt) { return(SA_ERR_HPI_INVALID_RESOURCE); } if (!(rpt->ResourceCapabilities & SAHPI_CAPABILITY_CONTROL)) { return(SA_ERR_HPI_CAPABILITY); } /* Find control and its mapping data - see if it accessable */ SaHpiRdrT *rdr = oh_get_rdr_by_type(handle->rptcache, rid, SAHPI_CTRL_RDR, cid); if (rdr == NULL) { return(SA_ERR_HPI_NOT_PRESENT); } info = (struct sim_control_info *)oh_get_rdr_data(handle->rptcache, rid, rdr->RecordId); if (info == NULL) { err("No control data. Control=%s", rdr->IdString.Data); return(SA_ERR_HPI_NOT_PRESENT); } /* Validate static control state and mode data */ err = oh_valid_ctrl_state_mode(&(rdr->RdrTypeUnion.CtrlRec), mode, state); if (err) { return(err); } /* Write control state */ if (mode != SAHPI_CTRL_MODE_AUTO && state) { info->state = *state; } /* Write control mode, if changed */ if (mode != info->mode) { info->mode = mode; } return(SA_OK); } /* * Simulator plugin interface * */ void * oh_get_control_state (void *, SaHpiResourceIdT, SaHpiCtrlNumT, SaHpiCtrlModeT *, SaHpiCtrlStateT *) __attribute__ ((weak, alias("sim_get_control_state"))); void * oh_set_control_state (void *, SaHpiResourceIdT,SaHpiCtrlNumT, SaHpiCtrlModeT, SaHpiCtrlStateT *) __attribute__ ((weak, alias("sim_set_control_state"))); openhpi-2.14.1/plugins/simulator/sim_dimi_func.c0000644000076400007640000000150411302566612016644 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2007 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * Renier Morales */ #include SaErrorT sim_get_dimi_info(void *hnd, SaHpiResourceIdT rid, SaHpiDimiNumT num, SaHpiDimiInfoT *info) { return SA_ERR_HPI_INVALID_CMD; } void * oh_get_dimi_info (void *, SaHpiResourceIdT, SaHpiDimiNumT, SaHpiDimiInfoT *) __attribute__ ((weak, alias("sim_get_dimi_info"))); openhpi-2.14.1/plugins/simulator/sim_watchdog.h0000644000076400007640000000375511302566612016526 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005, 2006 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * W. David Ashley * Renier Morales */ #ifndef __SIM_WATCHDOG_H #define __SIM_WATCHDOG_H struct simWatchdogInfo { SaHpiWatchdogT watchdog; }; struct sim_watchdog { SaHpiWatchdogRecT watchdogrec; SaHpiWatchdogT wd; const char *comment; }; SaErrorT sim_get_watchdog_info(void *hnd, SaHpiResourceIdT id, SaHpiWatchdogNumT num, SaHpiWatchdogT *wdt); SaErrorT sim_set_watchdog_info(void *hnd, SaHpiResourceIdT id, SaHpiWatchdogNumT num, SaHpiWatchdogT *wdt); SaErrorT sim_reset_watchdog(void *hnd, SaHpiResourceIdT id, SaHpiWatchdogNumT num); extern struct sim_watchdog sim_chassis_watchdogs[]; extern struct sim_watchdog sim_cpu_watchdogs[]; extern struct sim_watchdog sim_dasd_watchdogs[]; extern struct sim_watchdog sim_hs_dasd_watchdogs[]; extern struct sim_watchdog sim_fan_watchdogs[]; SaErrorT sim_discover_chassis_watchdogs(struct oh_handler_state *state, struct oh_event *e); SaErrorT sim_discover_cpu_watchdogs(struct oh_handler_state *state, struct oh_event *e); SaErrorT sim_discover_dasd_watchdogs(struct oh_handler_state *state, struct oh_event *e); SaErrorT sim_discover_hs_dasd_watchdogs(struct oh_handler_state *state, struct oh_event *e); SaErrorT sim_discover_fan_watchdogs(struct oh_handler_state *state, struct oh_event *e); #endif openhpi-2.14.1/plugins/simulator/sim_dimi.c0000644000076400007640000000460611302566612015637 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2008 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Suntrupth S Yadav */ #include #include static SaErrorT new_dimi(struct oh_handler_state *state, struct oh_event *e, struct sim_dimi *mydimi) { SaHpiRdrT *rdr = NULL; struct sim_dimi_info *info; SaErrorT error = SA_OK; rdr = (SaHpiRdrT *)g_malloc0(sizeof(SaHpiRdrT)); // Copy information from rdr array to res_rdr rdr->RdrType = SAHPI_DIMI_RDR; memcpy(&rdr->RdrTypeUnion.DimiRec, &mydimi->dimirec, sizeof(SaHpiDimiRecT)); oh_init_textbuffer(&rdr->IdString); oh_append_textbuffer(&rdr->IdString, mydimi->comment); rdr->RecordId = oh_get_rdr_uid(SAHPI_DIMI_RDR, rdr->RdrTypeUnion.DimiRec.DimiNum); // get the entity path rdr->Entity = e->resource.ResourceEntity; //set up our private data info = (struct sim_dimi_info *)g_malloc(sizeof(struct sim_dimi_info)); memcpy(&info->info, &mydimi->info, sizeof(SaHpiDimiInfoT)); memcpy(&info->test, &mydimi->test, sizeof(SaHpiDimiTestT)); /* everything ready so inject the rdr */ error = sim_inject_rdr(state, e, rdr, info); if (error) { g_free(rdr); g_free(info); } return error; } SaErrorT sim_discover_chassis_dimis(struct oh_handler_state *state, struct oh_event *e) { SaErrorT rc; int i = 0; int j = 0; while (sim_chassis_dimis[i].dimirec.DimiNum != 0) { rc = new_dimi(state, e, &sim_chassis_dimis[i]); if (rc) { err("Error %d returned when adding chassis dimi", rc); } else { j++; } i++; } dbg("%d of %d chassis dimis injected", j, i); return 0; } openhpi-2.14.1/plugins/simulator/sim_controls.c0000644000076400007640000001332211302566612016553 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005, 2006 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * Christina Hernandez * W. David Ashley * Renier Morales */ #include #include static SaErrorT new_control(struct oh_handler_state *state, struct oh_event *e, struct sim_control *mycontrol) { SaHpiRdrT *rdr = NULL; struct sim_control_info *info; SaErrorT error = SA_OK; if (!state || !e || !mycontrol) return SA_ERR_HPI_INVALID_PARAMS; rdr = (SaHpiRdrT *)g_malloc0(sizeof(SaHpiRdrT)); // Copy information from rdr array to res_rdr rdr->RdrType = SAHPI_CTRL_RDR; memcpy(&rdr->RdrTypeUnion.CtrlRec, &mycontrol->control, sizeof(SaHpiCtrlRecT)); oh_init_textbuffer(&rdr->IdString); oh_append_textbuffer(&rdr->IdString, mycontrol->comment); rdr->RecordId = oh_get_rdr_uid(SAHPI_CTRL_RDR, rdr->RdrTypeUnion.CtrlRec.Num); rdr->Entity = e->resource.ResourceEntity; //set up our private data info = (struct sim_control_info *)g_malloc(sizeof(struct sim_control_info)); info->mode = mycontrol->mode; info->state.Type = rdr->RdrTypeUnion.CtrlRec.Type; switch (info->state.Type) { case SAHPI_CTRL_TYPE_DIGITAL: info->state.StateUnion.Digital = rdr->RdrTypeUnion.CtrlRec.TypeUnion.Digital.Default; break; case SAHPI_CTRL_TYPE_DISCRETE: info->state.StateUnion.Discrete = rdr->RdrTypeUnion.CtrlRec.TypeUnion.Discrete.Default; break; case SAHPI_CTRL_TYPE_ANALOG: info->state.StateUnion.Analog = rdr->RdrTypeUnion.CtrlRec.TypeUnion.Analog.Default; break; case SAHPI_CTRL_TYPE_STREAM: memcpy(&info->state.StateUnion.Stream, &rdr->RdrTypeUnion.CtrlRec.TypeUnion.Stream.Default, sizeof(SaHpiCtrlStateStreamT)); break; case SAHPI_CTRL_TYPE_TEXT: memcpy(&info->state.StateUnion.Text, &rdr->RdrTypeUnion.CtrlRec.TypeUnion.Text.Default, sizeof(SaHpiCtrlStateTextT)); break; case SAHPI_CTRL_TYPE_OEM: memcpy(&info->state.StateUnion.Oem, &rdr->RdrTypeUnion.CtrlRec.TypeUnion.Oem.Default, sizeof(SaHpiCtrlStateOemT)); break; default: err("Bad Error: Unrecognized control type."); } // everything ready so add the rdr and extra info to the rptcache error = sim_inject_rdr(state, e, rdr, info); if (error) { g_free(rdr); g_free(info); } return error; } SaErrorT sim_discover_chassis_controls(struct oh_handler_state *state, struct oh_event *e) { SaErrorT rc; int i = 0; int j = 0; while (sim_chassis_controls[i].index != 0) { rc = new_control(state, e, &sim_chassis_controls[i]); if (rc) { err("Error %d returned when adding chassis control", rc); } else { j++; } i++; } dbg("%d of %d chassis controls injected", j, i); return 0; } SaErrorT sim_discover_cpu_controls(struct oh_handler_state *state, struct oh_event *e) { SaErrorT rc; int i = 0; int j = 0; while (sim_cpu_controls[i].index != 0) { rc = new_control(state, e, &sim_cpu_controls[i]); if (rc) { err("Error %d returned when adding cpu control", rc); } else { j++; } i++; } dbg("%d of %d cpu controls injected", j, i); return 0; } SaErrorT sim_discover_dasd_controls(struct oh_handler_state *state, struct oh_event *e) { SaErrorT rc; int i = 0; int j = 0; while (sim_dasd_controls[i].index != 0) { rc = new_control(state, e, &sim_dasd_controls[i]); if (rc) { err("Error %d returned when adding dasd control", rc); } else { j++; } i++; } dbg("%d of %d dasd controls injected", j, i); return 0; } SaErrorT sim_discover_hs_dasd_controls(struct oh_handler_state *state, struct oh_event *e) { SaErrorT rc; int i = 0; int j = 0; while (sim_hs_dasd_controls[i].index != 0) { rc = new_control(state, e, &sim_hs_dasd_controls[i]); if (rc) { err("Error %d returned when adding hs dasd control", rc); } else { j++; } i++; } dbg("%d of %d hs dasd controls injected", j, i); return 0; } SaErrorT sim_discover_fan_controls(struct oh_handler_state *state, struct oh_event *e) { SaErrorT rc; int i = 0; int j = 0; while (sim_fan_controls[i].index != 0) { rc = new_control(state, e, &sim_fan_controls[i]); if (rc) { err("Error %d returned when adding fan control", rc); } else { j++; } i++; } dbg("%d of %d fan controls injected", j, i); return 0; } openhpi-2.14.1/plugins/simulator/sim_hotswap.h0000644000076400007640000000243311302566612016403 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * W. David Ashley */ #ifndef __SIM_HOTSWAP_H #define __SIM_HOTSWAP_H SaErrorT sim_get_hotswap_state(void *hnd, SaHpiResourceIdT rid, SaHpiHsStateT *state); SaErrorT sim_set_hotswap_state(void *hnd, SaHpiResourceIdT rid, SaHpiHsStateT state); SaErrorT sim_request_hotswap_action(void *hnd, SaHpiResourceIdT rid, SaHpiHsActionT act); SaErrorT sim_get_indicator_state(void *hnd, SaHpiResourceIdT rid, SaHpiHsIndicatorStateT *state); SaErrorT sim_set_indicator_state(void *hnd, SaHpiResourceIdT rid, SaHpiHsIndicatorStateT state); SaErrorT sim_get_autoextract_timeout(void *hnd, SaHpiResourceIdT rid, SaHpiTimeoutT *timeout); SaErrorT sim_set_autoextract_timeout(void *hnd, SaHpiResourceIdT rid, SaHpiTimeoutT timeout); #endif openhpi-2.14.1/plugins/simulator/sim_sensors.c0000755000076400007640000001112011302566612016401 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005, 2006 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * Christina Hernandez * W. David Ashley * Renier Morales */ #include #include static SaErrorT new_sensor(struct oh_handler_state *state, struct oh_event *e, struct sim_sensor *mysensor) { SaHpiRdrT *rdr = NULL; struct SensorInfo *info = NULL; SaErrorT error = SA_OK; rdr = (SaHpiRdrT *)g_malloc0(sizeof(SaHpiRdrT)); info = (struct SensorInfo *)g_malloc0(sizeof(struct SensorInfo)); // set up rdr rdr->RdrType = SAHPI_SENSOR_RDR; rdr->RdrTypeUnion.SensorRec = mysensor->sensor; rdr->IsFru = 1; rdr->RecordId = oh_get_rdr_uid(rdr->RdrType, rdr->RdrTypeUnion.SensorRec.Num); oh_init_textbuffer(&rdr->IdString); oh_append_textbuffer(&rdr->IdString, mysensor->comment); rdr->Entity = e->resource.ResourceEntity; // now set up our extra info for the sensor *info = mysensor->sensor_info; // everything ready so add the rdr and extra info to the rptcache error = sim_inject_rdr(state, e, rdr, info); if (error) { g_free(rdr); g_free(info); } return error; } SaErrorT sim_discover_chassis_sensors(struct oh_handler_state *state, struct oh_event *e) { SaErrorT rc; int i = 0; int j = 0; while (sim_chassis_sensors[i].index != 0) { rc = new_sensor(state, e, &sim_chassis_sensors[i]); if (rc) { err("Error %s returned when adding chassis sensor", oh_lookup_error(rc)); } else { j++; } i++; } dbg("%d of %d chassis sensors injected", j, i); return 0; } SaErrorT sim_discover_cpu_sensors(struct oh_handler_state *state, struct oh_event *e) { SaErrorT rc; int i = 0; int j = 0; while (sim_cpu_sensors[i].index != 0) { rc = new_sensor(state, e, &sim_cpu_sensors[i]); if (rc) { err("Error %d returned when adding cpu sensor", rc); } else { j++; } i++; } dbg("%d of %d cpu sensors injected", j, i); return 0; } SaErrorT sim_discover_dasd_sensors(struct oh_handler_state *state, struct oh_event *e) { SaErrorT rc; int i = 0; int j = 0; while (sim_dasd_sensors[i].index != 0) { rc = new_sensor(state, e, &sim_dasd_sensors[i]); if (rc) { err("Error %d returned when adding dasd sensor", rc); } else { j++; } i++; } dbg("%d of %d dasd sensors injected", j, i); return 0; } SaErrorT sim_discover_hs_dasd_sensors(struct oh_handler_state *state, struct oh_event *e) { SaErrorT rc; int i = 0; int j = 0; while (sim_hs_dasd_sensors[i].index != 0) { rc = new_sensor(state, e, &sim_hs_dasd_sensors[i]); if (rc) { err("Error %d returned when adding hs dasd sensor", rc); } else { j++; } i++; } dbg("%d of %d hs dasd sensors injected", j, i); return 0; } SaErrorT sim_discover_fan_sensors(struct oh_handler_state *state, struct oh_event *e) { SaErrorT rc; int i = 0; int j = 0; while (sim_fan_sensors[i].index != 0) { rc = new_sensor(state, e, &sim_fan_sensors[i]); if (rc) { err("Error %d returned when adding fan sensor", rc); } else { j++; } i++; } dbg("%d of %d fan sensors injected", j, i); return 0; } openhpi-2.14.1/plugins/simulator/sim_fumi.c0000644000076400007640000000460511302566612015654 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2008 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Suntrupth S Yadav */ #include #include static SaErrorT new_fumi(struct oh_handler_state *state, struct oh_event *e, struct sim_fumi *myfumi) { SaHpiRdrT *rdr = NULL; struct sim_fumi_info *info; SaErrorT error = SA_OK; rdr = (SaHpiRdrT *)g_malloc0(sizeof(SaHpiRdrT)); // Copy information from rdr array to res_rdr rdr->RdrType = SAHPI_FUMI_RDR; memcpy(&rdr->RdrTypeUnion.FumiRec, &myfumi->fumirec, sizeof(SaHpiFumiRecT)); oh_init_textbuffer(&rdr->IdString); oh_append_textbuffer(&rdr->IdString, myfumi->comment); rdr->RecordId = oh_get_rdr_uid(SAHPI_FUMI_RDR, rdr->RdrTypeUnion.FumiRec.Num); // get the entity path rdr->Entity = e->resource.ResourceEntity; //set up our private data info = (struct sim_fumi_info *)g_malloc(sizeof(struct sim_fumi_info)); memcpy(&info->srcinfo, &myfumi->srcinfo, sizeof(SaHpiFumiSourceInfoT)); memcpy(&info->info, &myfumi->info, sizeof(SaHpiFumiBankInfoT)); /* everything ready so inject the rdr */ error = sim_inject_rdr(state, e, rdr, info); if (error) { g_free(rdr); g_free(info); } return error; } SaErrorT sim_discover_chassis_fumis(struct oh_handler_state *state, struct oh_event *e) { SaErrorT rc; int i = 0; int j = 0; while (sim_chassis_fumis[i].fumirec.Num != 0) { rc = new_fumi(state, e, &sim_chassis_fumis[i]); if (rc) { err("Error %d returned when adding chassis fumi", rc); } else { j++; } i++; } dbg("%d of %d chassis fumis injected", j, i); return 0; } openhpi-2.14.1/plugins/simulator/sim_inventory.h0000644000076400007640000001001311302566612016744 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005, 2006 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * W. David Ashley * Renier Morales */ #ifndef __SIM_INVENTORY_H #define __SIM_INVENTORY_H #define SIM_INVENTORY_FIELDS 10 #define SIM_INVENTORY_AREAS 10 /************************************************************************/ /* Resource one inventory data */ /************************************************************************/ struct sim_idr_area { SaHpiEntryIdT nextfieldid; SaHpiIdrAreaHeaderT idrareahead; SaHpiIdrFieldT field[SIM_INVENTORY_FIELDS]; }; struct sim_inventory_info { SaHpiEntryIdT nextareaid; SaHpiIdrInfoT idrinfo; struct sim_idr_area area[SIM_INVENTORY_AREAS]; }; struct sim_inventory { SaHpiInventoryRecT invrec; struct sim_inventory_info info; const char *comment; }; SaErrorT sim_discover_chassis_inventory(struct oh_handler_state *state, struct oh_event *e); SaErrorT sim_discover_cpu_inventory(struct oh_handler_state *state, struct oh_event *e); SaErrorT sim_discover_dasd_inventory(struct oh_handler_state *state, struct oh_event *e); SaErrorT sim_discover_hs_dasd_inventory(struct oh_handler_state *state, struct oh_event *e); SaErrorT sim_discover_fan_inventory(struct oh_handler_state *state, struct oh_event *e); SaErrorT sim_get_idr_info(void *hnd, SaHpiResourceIdT ResourceId, SaHpiIdrIdT IdrId, SaHpiIdrInfoT *IdrInfo); SaErrorT sim_get_idr_area_header(void *hnd, SaHpiResourceIdT ResourceId, SaHpiIdrIdT IdrId, SaHpiIdrAreaTypeT AreaType, SaHpiEntryIdT AreaId, SaHpiEntryIdT *NextAreaId, SaHpiIdrAreaHeaderT *Header); SaErrorT sim_add_idr_area(void *hnd, SaHpiResourceIdT ResourceId, SaHpiIdrIdT IdrId, SaHpiIdrAreaTypeT AreaType, SaHpiEntryIdT *AreaId); SaErrorT sim_del_idr_area(void *hnd, SaHpiResourceIdT ResourceId, SaHpiIdrIdT IdrId, SaHpiEntryIdT AreaId); SaErrorT sim_get_idr_field(void *hnd, SaHpiResourceIdT ResourceId, SaHpiIdrIdT IdrId, SaHpiEntryIdT AreaId, SaHpiIdrFieldTypeT FieldType, SaHpiEntryIdT FieldId, SaHpiEntryIdT *NextFieldId, SaHpiIdrFieldT *Field); SaErrorT sim_add_idr_field(void *hnd, SaHpiResourceIdT ResourceId, SaHpiIdrIdT IdrId, SaHpiIdrFieldT *Field); SaErrorT sim_set_idr_field(void *hnd, SaHpiResourceIdT ResourceId, SaHpiIdrIdT IdrId, SaHpiIdrFieldT *Field); SaErrorT sim_del_idr_field(void *hnd, SaHpiResourceIdT ResourceId, SaHpiIdrIdT IdrId, SaHpiEntryIdT AreaId, SaHpiEntryIdT FieldId); extern struct sim_inventory sim_chassis_inventory[]; extern struct sim_inventory sim_cpu_inventory[]; extern struct sim_inventory sim_dasd_inventory[]; extern struct sim_inventory sim_hs_dasd_inventory[]; extern struct sim_inventory sim_fan_inventory[]; #endif openhpi-2.14.1/plugins/simulator/sim_dimi.h0000644000076400007640000000164711302566612015646 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2008 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Suntrupth S Yadav */ #ifndef __SIM_DIMI_H #define __SIM_DIMI_H struct sim_dimi_info { SaHpiDimiInfoT info; SaHpiDimiTestT test; }; struct sim_dimi { SaHpiDimiRecT dimirec; SaHpiDimiInfoT info; SaHpiDimiTestT test; const char *comment; }; extern struct sim_dimi sim_chassis_dimis[]; SaErrorT sim_discover_chassis_dimis(struct oh_handler_state *state, struct oh_event *e); #endif openhpi-2.14.1/plugins/simulator/sim_fumi_func.h0000644000076400007640000000132611302566612016671 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2008 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Suntrupth S Yadav */ #ifndef __SIM_FUMI_FUNC_H #define __SIM_FUMI_FUNC_H SaErrorT sim_set_fumi_source(void *hnd, SaHpiResourceIdT rid, SaHpiFumiNumT fnum, SaHpiBankNumT bnum, SaHpiTextBufferT *sourceuri); #endif openhpi-2.14.1/plugins/simulator/sim_el.c0000644000076400007640000001426111302566612015313 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005, 2006, 2007, 2008 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * W. David Ashley * Suntrupth S Yadav */ #include SaErrorT sim_el_get_info(void *hnd, SaHpiResourceIdT id, SaHpiEventLogInfoT *info) { SaErrorT err; struct oh_handler_state *state; if (!hnd || !info) { err("Invalid parameter."); return SA_ERR_HPI_INVALID_PARAMS; } state = (struct oh_handler_state *)hnd; err = oh_el_info(state->elcache, info); return err; } SaErrorT sim_el_set_state(void *hnd, SaHpiResourceIdT id, SaHpiBoolT state) { struct oh_handler_state *h = (struct oh_handler_state *)hnd; if (!hnd || !id) return SA_ERR_HPI_INVALID_PARAMS; return oh_el_enableset(h->elcache, state); } SaErrorT sim_el_get_state(void *hnd, SaHpiResourceIdT id, SaHpiBoolT *state) { struct oh_handler_state *h = (struct oh_handler_state *)hnd; SaHpiEventLogInfoT elinfo; if (!hnd || !id) return SA_ERR_HPI_INVALID_PARAMS; oh_el_info(h->elcache, &elinfo); *state = elinfo.Enabled; return SA_OK; } SaErrorT sim_el_set_time(void *hnd, SaHpiResourceIdT id, SaHpiTimeT time) { struct oh_handler_state *state; SaErrorT err; if (!hnd) { err("Invalid parameter."); return SA_ERR_HPI_INVALID_PARAMS; } state = (struct oh_handler_state *)hnd; err = oh_el_timeset(state->elcache, time); if (err) { err("Cannot set time. Error=%s.", oh_lookup_error(err)); return SA_ERR_HPI_INTERNAL_ERROR; } return SA_OK; } SaErrorT sim_el_add_entry(void *hnd, SaHpiResourceIdT id, const SaHpiEventT *Event) { struct oh_handler_state *state; if (!hnd) { err("Invalid parameter."); return SA_ERR_HPI_INVALID_PARAMS; } state = (struct oh_handler_state *)hnd; return oh_el_append(state->elcache, Event, NULL, NULL); } SaErrorT sim_el_get_entry(void *hnd, SaHpiResourceIdT id, SaHpiEventLogEntryIdT current, SaHpiEventLogEntryIdT *prev, SaHpiEventLogEntryIdT *next, SaHpiEventLogEntryT *entry, SaHpiRdrT *rdr, SaHpiRptEntryT *rptentry) { SaErrorT err = SA_OK; oh_el_entry tmpentry, *tmpentryptr; tmpentryptr = &tmpentry; struct oh_handler_state *state; if (!hnd || !prev || !next || !entry) { err("Invalid parameter."); return SA_ERR_HPI_INVALID_PARAMS; } state = (struct oh_handler_state *)hnd; err = oh_el_get(state->elcache, current, prev, next, &tmpentryptr); if (err) { err("Getting Event Log entry=%d from cache failed. Error=%s.", current, oh_lookup_error(err)); return err; } else { memcpy(entry, &(tmpentryptr->event), sizeof(SaHpiEventLogEntryT)); if (rdr) memcpy(rdr, &tmpentryptr->rdr, sizeof(SaHpiRdrT)); if (rptentry) memcpy(rptentry, &(tmpentryptr->res), sizeof(SaHpiRptEntryT)); } return SA_OK; } SaErrorT sim_el_clear(void *hnd, SaHpiResourceIdT id) { struct oh_handler_state *state; SaErrorT err; if (!hnd) { err("Invalid parameter."); return SA_ERR_HPI_INVALID_PARAMS; } state = (struct oh_handler_state *)hnd; err = oh_el_clear(state->elcache); if (err) { err("Cannot clear system Event Log. Error=%s.", oh_lookup_error(err)); return err; } return SA_OK; } SaErrorT sim_el_overflow(void *hnd, SaHpiResourceIdT id) { struct oh_handler_state *state; if (!hnd) { err("Invalid parameter."); return SA_ERR_HPI_INVALID_PARAMS; } state = (struct oh_handler_state *)hnd; return oh_el_overflowreset(state->elcache); } SaErrorT sim_el_get_caps(void *hnd, SaHpiResourceIdT id, SaHpiEventLogCapabilitiesT *caps) { struct oh_handler_state *state; if (!hnd || !caps) { err("Invalid parameter."); return SA_ERR_HPI_INVALID_PARAMS; } *caps = SAHPI_EVTLOG_CAPABILITY_ENTRY_ADD | SAHPI_EVTLOG_CAPABILITY_CLEAR | SAHPI_EVTLOG_CAPABILITY_TIME_SET | SAHPI_EVTLOG_CAPABILITY_STATE_SET; state = (struct oh_handler_state *)hnd; if (state->elcache->info.OverflowResetable) { *caps |= SAHPI_EVTLOG_CAPABILITY_OVERFLOW_RESET; } return SA_OK; } void * oh_get_el_info (void *, SaHpiResourceIdT, SaHpiEventLogInfoT *) __attribute__ ((weak, alias("sim_el_get_info"))); void * oh_set_el_state (void *, SaHpiResourceIdT, SaHpiBoolT) __attribute__ ((weak, alias("sim_el_set_state"))); void * oh_get_el_state (void *, SaHpiResourceIdT, SaHpiBoolT *) __attribute__ ((weak, alias("sim_el_get_state"))); void * oh_set_el_time (void *, SaHpiResourceIdT, const SaHpiEventT *) __attribute__ ((weak, alias("sim_el_set_time"))); void * oh_add_el_entry (void *, SaHpiResourceIdT, const SaHpiEventT *) __attribute__ ((weak, alias("sim_el_add_entry"))); void * oh_get_el_entry (void *, SaHpiResourceIdT, SaHpiEventLogEntryIdT, SaHpiEventLogEntryIdT *, SaHpiEventLogEntryIdT *, SaHpiEventLogEntryT *, SaHpiRdrT *, SaHpiRptEntryT *) __attribute__ ((weak, alias("sim_el_get_entry"))); void * oh_clear_el (void *, SaHpiResourceIdT) __attribute__ ((weak, alias("sim_el_clear"))); void * oh_reset_el_overflow (void *, SaHpiResourceIdT) __attribute__ ((weak, alias("sim_el_overflow"))); void * oh_get_el_caps (void *, SaHpiResourceIdT, SaHpiEventLogCapabilitiesT *) __attribute__ ((weak, alias("sim_el_get_caps"))); openhpi-2.14.1/plugins/simulator/sim_resources.h0000644000076400007640000000403411302566612016727 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * Christina Hernandez * W. David Ashley */ #ifndef __SIM_RESOURCES_H #define __SIM_RESOURCES_H #include #include /* Start HPI location numbers from 0 */ #define SIM_HPI_LOCATION_BASE 1 /* IBM Manufacturing Number */ /* Corresponding to change made in snmp_bc_resources.h */ #define IBM_MANUFACTURING_ID 20944 /* Resource Ids for SIM resources if the sim_rpt_array order changes this will need to change also */ typedef enum { SIM_RPT_ENTRY_CHASSIS = 1, SIM_RPT_ENTRY_CPU, SIM_RPT_ENTRY_DASD, SIM_RPT_ENTRY_HS_DASD, SIM_RPT_ENTRY_FAN } SimRptEntryT; /* Maximum number of SIM resources */ #define SIM_MAX_CPU 8 #define SIM_MAX_FAN 8 #define SIM_MAX_DASD 4 /* Maximum entries in eventlog */ #define SIM_EL_MAX_SIZE 256 /********************** * Resource Definitions **********************/ #define SIM_MAX_EVENTS_PER_RESOURCE 10 #define SIM_MAX_RESOURCE_EVENT_ARRAY_SIZE (SIM_MAX_EVENTS_PER_RESOURCE + 1) /* Includes an ending NULL entry */ struct simResourceInfo { SaHpiHsStateT cur_hsstate; SaHpiHsIndicatorStateT cur_indicator_hsstate; SaHpiPowerStateT cur_powerstate; SaHpiTimeoutT ae_timeout; }; struct sim_rpt { SaHpiRptEntryT rpt; const char *comment; }; extern struct sim_rpt sim_rpt_array[]; extern struct sim_sensor sim_chassis_sensors[]; extern struct sim_sensor sim_cpu_sensors[]; extern struct sim_sensor sim_dasd_sensors[]; extern struct sim_sensor sim_hs_dasd_sensors[]; extern struct sim_sensor sim_fan_sensors[]; #endif openhpi-2.14.1/plugins/simulator/sim_annunciator_func.h0000644000076400007640000000321311302566612020247 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * W. David Ashley */ #ifndef __SIM_ANNUNCIATOR_FUNC_H #define __SIM_ANNUNCIATOR_FUNC_H SaErrorT sim_get_next_announce(void *hnd, SaHpiResourceIdT rid, SaHpiAnnunciatorNumT aid, SaHpiSeverityT sev, SaHpiBoolT unackonly, SaHpiAnnouncementT *announcement); SaErrorT sim_get_announce(void *hnd, SaHpiResourceIdT rid, SaHpiAnnunciatorNumT aid, SaHpiEntryIdT entry, SaHpiAnnouncementT *announcement); SaErrorT sim_ack_announce(void *hnd, SaHpiResourceIdT rid, SaHpiAnnunciatorNumT aid, SaHpiEntryIdT entry, SaHpiSeverityT sev); SaErrorT sim_add_announce(void *hnd, SaHpiResourceIdT rid, SaHpiAnnunciatorNumT aid, SaHpiAnnouncementT *announcement); SaErrorT sim_del_announce(void *hnd, SaHpiResourceIdT rid, SaHpiAnnunciatorNumT aid, SaHpiEntryIdT entry, SaHpiSeverityT sev); SaErrorT sim_get_annunc_mode(void *hnd, SaHpiResourceIdT rid, SaHpiAnnunciatorNumT aid, SaHpiAnnunciatorModeT *mode); SaErrorT sim_set_annunc_mode(void *hnd, SaHpiResourceIdT rid, SaHpiAnnunciatorNumT aid, SaHpiAnnunciatorModeT mode); #endif openhpi-2.14.1/plugins/simulator/sim_resources2.c0000644000076400007640000024750611302566612017021 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * W. David Ashley */ #include /************************************************************************** * Resource Definitions * * These are patterned after an RSA type machine **************************************************************************/ /*------------------------------------------------------------------------- NOTE!!!!!!!!! The order is important here! Changing the order of these resources or adding additional resources means the code in the function sim_discovery() also needs to change! ------------------------------------------------------------------------*/ struct sim_rpt sim_rpt_array[] = { /* Chassis */ { .rpt = { .ResourceInfo = { .ManufacturerId = IBM_MANUFACTURING_ID, }, .ResourceEntity = { .Entry[0] = { .EntityType = SAHPI_ENT_ROOT, .EntityLocation = 0 } }, .ResourceCapabilities = SAHPI_CAPABILITY_EVENT_LOG | SAHPI_CAPABILITY_EVT_DEASSERTS | SAHPI_CAPABILITY_INVENTORY_DATA | SAHPI_CAPABILITY_RDR | SAHPI_CAPABILITY_RESOURCE | SAHPI_CAPABILITY_SENSOR | SAHPI_CAPABILITY_ANNUNCIATOR | SAHPI_CAPABILITY_POWER | SAHPI_CAPABILITY_RESET | SAHPI_CAPABILITY_WATCHDOG | SAHPI_CAPABILITY_CONTROL | SAHPI_CAPABILITY_DIMI | SAHPI_CAPABILITY_FUMI, .ResourceSeverity = SAHPI_CRITICAL, .ResourceFailed = SAHPI_FALSE, }, .comment = "Chassis" }, /* CPUs */ { .rpt = { .ResourceInfo = { .ManufacturerId = IBM_MANUFACTURING_ID, }, .ResourceEntity = { .Entry[0] = { .EntityType = SAHPI_ENT_PROCESSOR, .EntityLocation = SIM_HPI_LOCATION_BASE }, { .EntityType = SAHPI_ENT_ROOT, .EntityLocation = 0 } }, .ResourceCapabilities = SAHPI_CAPABILITY_EVT_DEASSERTS | SAHPI_CAPABILITY_RDR | SAHPI_CAPABILITY_RESOURCE | SAHPI_CAPABILITY_SENSOR, .ResourceSeverity = SAHPI_MAJOR, .ResourceFailed = SAHPI_FALSE, }, .comment = "CPU" }, /* DASD */ { .rpt = { .ResourceInfo = { .ManufacturerId = IBM_MANUFACTURING_ID, }, .ResourceEntity = { .Entry[0] = { .EntityType = SAHPI_ENT_DISK_DRIVE, .EntityLocation = SIM_HPI_LOCATION_BASE }, { .EntityType = SAHPI_ENT_ROOT, .EntityLocation = 0 } }, .ResourceCapabilities = SAHPI_CAPABILITY_EVT_DEASSERTS | SAHPI_CAPABILITY_RDR | SAHPI_CAPABILITY_RESOURCE | SAHPI_CAPABILITY_SENSOR, .ResourceSeverity = SAHPI_MAJOR, .ResourceFailed = SAHPI_FALSE, }, .comment = "DASD 1" }, /* HS DASD */ { .rpt = { .ResourceInfo = { .ManufacturerId = IBM_MANUFACTURING_ID, }, .ResourceEntity = { .Entry[0] = { .EntityType = SAHPI_ENT_DISK_DRIVE, .EntityLocation = SIM_HPI_LOCATION_BASE + 1 }, { .EntityType = SAHPI_ENT_ROOT, .EntityLocation = 0 } }, .ResourceCapabilities = SAHPI_CAPABILITY_EVT_DEASSERTS | SAHPI_CAPABILITY_RDR | SAHPI_CAPABILITY_RESOURCE | SAHPI_CAPABILITY_FRU | SAHPI_CAPABILITY_MANAGED_HOTSWAP | SAHPI_HS_CAPABILITY_AUTOEXTRACT_READ_ONLY | SAHPI_CAPABILITY_WATCHDOG | SAHPI_CAPABILITY_CONTROL | SAHPI_CAPABILITY_ANNUNCIATOR | SAHPI_CAPABILITY_POWER | SAHPI_CAPABILITY_RESET | SAHPI_CAPABILITY_INVENTORY_DATA | SAHPI_CAPABILITY_EVENT_LOG | SAHPI_CAPABILITY_SENSOR, .ResourceSeverity = SAHPI_MAJOR, .ResourceFailed = SAHPI_FALSE, }, .comment = "HS DASD 1" }, /* Fans */ { .rpt = { .ResourceInfo = { .ManufacturerId = IBM_MANUFACTURING_ID, }, .ResourceEntity = { .Entry[0] = { .EntityType = SAHPI_ENT_FAN, .EntityLocation = SIM_HPI_LOCATION_BASE }, { .EntityType = SAHPI_ENT_ROOT, .EntityLocation = 0, } }, .ResourceCapabilities = SAHPI_CAPABILITY_EVT_DEASSERTS | SAHPI_CAPABILITY_RESOURCE | SAHPI_CAPABILITY_RDR | SAHPI_CAPABILITY_SENSOR | SAHPI_CAPABILITY_CONTROL, .ResourceSeverity = SAHPI_MAJOR, .ResourceFailed = SAHPI_FALSE, }, .comment = "Fan" }, {} /* Terminate array with a null element */ }; /****************************************************************************** * Sensor Definitions * * These are patterned after an RSA type machine ******************************************************************************/ /***************** * Chassis Sensors *****************/ struct sim_sensor sim_chassis_sensors[] = { /* Thermal sensor on planar */ { .index = 1, .sensor = { .Num = 1, .Type = SAHPI_TEMPERATURE, .Category = SAHPI_EC_THRESHOLD, .EnableCtrl = SAHPI_FALSE, .EventCtrl = SAHPI_SEC_READ_ONLY, .Events = SAHPI_ES_UPPER_MINOR | SAHPI_ES_UPPER_MAJOR | SAHPI_ES_UPPER_CRIT, .DataFormat = { .IsSupported = SAHPI_TRUE, .ReadingType = SAHPI_SENSOR_READING_TYPE_FLOAT64, .BaseUnits = SAHPI_SU_DEGREES_F, .ModifierUnits = SAHPI_SU_UNSPECIFIED, .ModifierUse = SAHPI_SMUU_NONE, .Percentage = SAHPI_FALSE, .Range = { .Flags = SAHPI_SRF_MAX | SAHPI_SRF_MIN | SAHPI_SRF_NORMAL_MAX | SAHPI_SRF_NORMAL_MIN | SAHPI_SRF_NOMINAL, .Max = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, .Value = { .SensorFloat64 = 125, }, }, .Min = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, .Value = { .SensorFloat64 = 40, }, }, .NormalMax = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, .Value = { .SensorFloat64 = 110, }, }, .Nominal = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, .Value = { .SensorFloat64 = 100, }, }, .NormalMin = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, .Value = { .SensorFloat64 = 90, }, }, }, }, .ThresholdDefn = { .IsAccessible = SAHPI_TRUE, .ReadThold = SAHPI_STM_UP_MAJOR | SAHPI_STM_UP_CRIT | SAHPI_STM_LOW_MAJOR | SAHPI_STM_LOW_CRIT | SAHPI_STM_UP_CRIT | SAHPI_STM_UP_HYSTERESIS, .WriteThold = SAHPI_STM_UP_MAJOR | SAHPI_STM_UP_CRIT | SAHPI_STM_LOW_MAJOR | SAHPI_STM_LOW_CRIT | SAHPI_STM_UP_CRIT | SAHPI_STM_UP_HYSTERESIS, .Nonlinear = SAHPI_FALSE, }, .Oem = 0, }, .sensor_info = { .cur_state = SAHPI_ES_UPPER_MINOR, .sensor_enabled = SAHPI_TRUE, .events_enabled = SAHPI_TRUE, .assert_mask = SAHPI_ES_UPPER_MINOR | SAHPI_ES_UPPER_MAJOR | SAHPI_ES_UPPER_CRIT, .deassert_mask = SAHPI_ES_UPPER_MINOR | SAHPI_ES_UPPER_MAJOR | SAHPI_ES_UPPER_CRIT, .event_array = { { .event = "0501C480", /* EN_CUTOFF_HI_OVER_TEMP_PLANAR */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_TRUE, .event_res_failure_unexpected = SAHPI_TRUE, .event_state = SAHPI_ES_UPPER_CRIT | SAHPI_ES_UPPER_MAJOR | SAHPI_ES_UPPER_MINOR, .recovery_state = SAHPI_ES_UPPER_MAJOR | SAHPI_ES_UPPER_MINOR, }, { .event = "0501C080", /* EN_OVER_TEMP_PLANAR */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_TRUE, .event_res_failure_unexpected = SAHPI_TRUE, .event_state = SAHPI_ES_UPPER_CRIT | SAHPI_ES_UPPER_MAJOR | SAHPI_ES_UPPER_MINOR, .recovery_state = SAHPI_ES_UPPER_MAJOR | SAHPI_ES_UPPER_MINOR, }, { .event = "0501D500", /* EN_PFA_HI_OVER_TEMP_PLANAR */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_UPPER_MAJOR | SAHPI_ES_UPPER_MINOR, .recovery_state = SAHPI_ES_UNSPECIFIED, }, {}, }, .reading = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, .Value = { .SensorFloat64 = 35, }, }, .thres = { .LowCritical = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, .Value = { .SensorFloat64 = 40, }, }, .LowMajor = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, .Value = { .SensorFloat64 = 50, }, }, .LowMinor = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, .Value = { .SensorFloat64 = 60, }, }, .UpCritical = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, .Value = { .SensorFloat64 = 125, }, }, .UpMajor = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, .Value = { .SensorFloat64 = 120, }, }, .UpMinor = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, .Value = { .SensorFloat64 = 110, }, }, .PosThdHysteresis = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, .Value = { .SensorFloat64 = 2, }, }, .NegThdHysteresis = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, .Value = { .SensorFloat64 = 2, }, }, }, }, .comment = "Planar temperature sensor" }, /* CPU area thermal sensor on planar */ { .index = 2, .sensor = { .Num = 2, .Type = SAHPI_TEMPERATURE, .Category = SAHPI_EC_THRESHOLD, .EnableCtrl = SAHPI_FALSE, .EventCtrl = SAHPI_SEC_READ_ONLY, .Events = SAHPI_ES_UPPER_MINOR | SAHPI_ES_UPPER_MAJOR | SAHPI_ES_UPPER_CRIT, .DataFormat = { .IsSupported = SAHPI_TRUE, .ReadingType = SAHPI_SENSOR_READING_TYPE_FLOAT64, .BaseUnits = SAHPI_SU_DEGREES_F, .ModifierUnits = SAHPI_SU_UNSPECIFIED, .ModifierUse = SAHPI_SMUU_NONE, .Percentage = SAHPI_FALSE, .Range = { .Flags = SAHPI_SRF_MAX | SAHPI_SRF_MIN | SAHPI_SRF_NORMAL_MAX | SAHPI_SRF_NORMAL_MIN | SAHPI_SRF_NOMINAL, .Max = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, .Value = { .SensorFloat64 = 125, }, }, .Min = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, .Value = { .SensorFloat64 = 40, }, }, .NormalMax = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, .Value = { .SensorFloat64 = 110, }, }, .Nominal = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, .Value = { .SensorFloat64 = 100, }, }, .NormalMin = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, .Value = { .SensorFloat64 = 90, }, }, }, }, .ThresholdDefn = { .IsAccessible = SAHPI_FALSE, }, .Oem = 0, }, .sensor_info = { .cur_state = SAHPI_ES_UPPER_MINOR, .sensor_enabled = SAHPI_TRUE, .events_enabled = SAHPI_TRUE, .assert_mask = SAHPI_ES_UPPER_MINOR | SAHPI_ES_UPPER_MAJOR | SAHPI_ES_UPPER_CRIT, .deassert_mask = SAHPI_ES_UPPER_MINOR | SAHPI_ES_UPPER_MAJOR | SAHPI_ES_UPPER_CRIT, .event_array = { { .event = "0601C480", /* EN_CUTOFF_HI_OVER_TEMP_PLANAR */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_TRUE, .event_res_failure_unexpected = SAHPI_TRUE, .event_state = SAHPI_ES_UPPER_CRIT | SAHPI_ES_UPPER_MAJOR | SAHPI_ES_UPPER_MINOR, .recovery_state = SAHPI_ES_UPPER_MAJOR | SAHPI_ES_UPPER_MINOR, }, { .event = "0601C080", /* EN_OVER_TEMP_PLANAR */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_TRUE, .event_res_failure_unexpected = SAHPI_TRUE, .event_state = SAHPI_ES_UPPER_CRIT | SAHPI_ES_UPPER_MAJOR | SAHPI_ES_UPPER_MINOR, .recovery_state = SAHPI_ES_UPPER_MAJOR | SAHPI_ES_UPPER_MINOR, }, { .event = "0601D500", /* EN_PFA_HI_OVER_TEMP_PLANAR */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_UPPER_MAJOR | SAHPI_ES_UPPER_MINOR, .recovery_state = SAHPI_ES_UNSPECIFIED, }, {}, }, .reading = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, .Value = { .SensorFloat64 = 35, }, }, .thres = { .LowCritical = { .IsSupported = SAHPI_FALSE, }, .LowMajor = { .IsSupported = SAHPI_FALSE, }, .LowMinor = { .IsSupported = SAHPI_FALSE, }, .UpCritical = { .IsSupported = SAHPI_FALSE, }, .UpMajor = { .IsSupported = SAHPI_FALSE, }, .UpMinor = { .IsSupported = SAHPI_FALSE, }, .PosThdHysteresis = { .IsSupported = SAHPI_FALSE, }, .NegThdHysteresis = { .IsSupported = SAHPI_FALSE, }, }, }, .comment = "Planar CPU area temperature sensor" }, {} /* Terminate array with a null element */ }; /************* * CPU Sensors *************/ struct sim_sensor sim_cpu_sensors[] = { /* CPU thermal sensor */ { .index = 1, .sensor = { .Num = 1, .Type = SAHPI_TEMPERATURE, .Category = SAHPI_EC_THRESHOLD, .EnableCtrl = SAHPI_FALSE, .EventCtrl = SAHPI_SEC_READ_ONLY, .Events = SAHPI_ES_UPPER_MINOR | SAHPI_ES_UPPER_MAJOR | SAHPI_ES_UPPER_CRIT, .DataFormat = { .IsSupported = SAHPI_TRUE, .ReadingType = SAHPI_SENSOR_READING_TYPE_FLOAT64, .BaseUnits = SAHPI_SU_DEGREES_C, .ModifierUnits = SAHPI_SU_UNSPECIFIED, .ModifierUse = SAHPI_SMUU_NONE, .Percentage = SAHPI_FALSE, .Range = { .Flags = SAHPI_SRF_MAX | SAHPI_SRF_MIN, .Max = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, .Value = { .SensorFloat64 = 125, }, }, .Min = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, .Value = { .SensorFloat64 = 0, }, }, }, }, .ThresholdDefn = { .IsAccessible = SAHPI_TRUE, .ReadThold = SAHPI_STM_UP_MAJOR | SAHPI_STM_UP_CRIT | SAHPI_STM_UP_HYSTERESIS, .WriteThold = 0, }, .Oem = 0, }, .sensor_info = { .cur_state = SAHPI_ES_UPPER_MINOR, .sensor_enabled = SAHPI_TRUE, .events_enabled = SAHPI_TRUE, .assert_mask = SAHPI_ES_UPPER_MINOR | SAHPI_ES_UPPER_MAJOR | SAHPI_ES_UPPER_CRIT, .deassert_mask = SAHPI_ES_UPPER_MINOR | SAHPI_ES_UPPER_MAJOR | SAHPI_ES_UPPER_CRIT, .event_array = { { .event = "0421C40x", /* EN_PROC_HOT_CPUx */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_TRUE, .event_res_failure_unexpected = SAHPI_TRUE, .event_state = SAHPI_ES_UPPER_CRIT | SAHPI_ES_UPPER_MAJOR | SAHPI_ES_UPPER_MINOR, .recovery_state = SAHPI_ES_UPPER_MAJOR | SAHPI_ES_UPPER_MINOR, }, { .event = "0421C48x", /* EN_CUTOFF_HI_OVER_TEMP_CPUx */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_TRUE, .event_res_failure_unexpected = SAHPI_TRUE, .event_state = SAHPI_ES_UPPER_CRIT | SAHPI_ES_UPPER_MAJOR | SAHPI_ES_UPPER_MINOR, .recovery_state = SAHPI_ES_UPPER_MAJOR | SAHPI_ES_UPPER_MINOR, }, { .event = "0421D08x", /* EN_THERM_TRIP_CPUx */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_TRUE, .event_res_failure_unexpected = SAHPI_TRUE, .event_state = SAHPI_ES_UPPER_CRIT | SAHPI_ES_UPPER_MAJOR | SAHPI_ES_UPPER_MINOR, .recovery_state = SAHPI_ES_UPPER_MAJOR | SAHPI_ES_UPPER_MINOR, }, { .event = "0421D50x", /* EN_PFA_HI_OVER_TEMP_CPUx */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_UPPER_MAJOR | SAHPI_ES_UPPER_MINOR, .recovery_state = SAHPI_ES_UNSPECIFIED, }, {}, }, .reading = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, .Value = { .SensorFloat64 = 50, }, }, .thres = { .LowCritical = { .IsSupported = SAHPI_FALSE, }, .LowMajor = { .IsSupported = SAHPI_FALSE, }, .LowMinor = { .IsSupported = SAHPI_FALSE, }, .UpCritical = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, .Value = { .SensorFloat64 = 80, }, }, .UpMajor = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, .Value = { .SensorFloat64 = 60, }, }, .UpMinor = { .IsSupported = SAHPI_FALSE, }, .PosThdHysteresis = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, .Value = { .SensorFloat64 = 2, }, }, .NegThdHysteresis = { .IsSupported = SAHPI_FALSE, }, }, }, .comment = "CPU temperature sensor" }, {} /* Terminate array with a null element */ }; /************** * DASD Sensors **************/ struct sim_sensor sim_dasd_sensors[] = { /* DASD thermal sensor */ { .index = 1, .sensor = { .Num = 1, .Type = SAHPI_TEMPERATURE, .Category = SAHPI_EC_THRESHOLD, .EnableCtrl = SAHPI_FALSE, .EventCtrl = SAHPI_SEC_READ_ONLY, .Events = SAHPI_ES_UPPER_MINOR | SAHPI_ES_UPPER_MAJOR | SAHPI_ES_UPPER_CRIT, .DataFormat = { .IsSupported = SAHPI_TRUE, .ReadingType = SAHPI_SENSOR_READING_TYPE_FLOAT64, .BaseUnits = SAHPI_SU_DEGREES_C, .ModifierUnits = SAHPI_SU_UNSPECIFIED, .ModifierUse = SAHPI_SMUU_NONE, .Percentage = SAHPI_FALSE, .Range = { .Flags = SAHPI_SRF_MAX | SAHPI_SRF_MIN, .Max = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, .Value = { .SensorFloat64 = 125, }, }, .Min = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, .Value = { .SensorFloat64 = 0, }, }, }, }, .ThresholdDefn = { .IsAccessible = SAHPI_TRUE, .ReadThold = SAHPI_STM_UP_MAJOR | SAHPI_STM_UP_CRIT | SAHPI_STM_UP_HYSTERESIS, .WriteThold = 0, }, .Oem = 0, }, .sensor_info = { .cur_state = SAHPI_ES_UPPER_MINOR, .sensor_enabled = SAHPI_TRUE, .events_enabled = SAHPI_TRUE, .assert_mask = SAHPI_ES_UPPER_MINOR | SAHPI_ES_UPPER_MAJOR | SAHPI_ES_UPPER_CRIT, .deassert_mask = SAHPI_ES_UPPER_MINOR | SAHPI_ES_UPPER_MAJOR | SAHPI_ES_UPPER_CRIT, .event_array = { { .event = "0681C08x", /* EN_CUTOFF_HI_OVER_TEMP_DASD1 */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_TRUE, .event_res_failure_unexpected = SAHPI_TRUE, .event_state = SAHPI_ES_UPPER_CRIT | SAHPI_ES_UPPER_MAJOR | SAHPI_ES_UPPER_MINOR, .recovery_state = SAHPI_ES_UPPER_MAJOR | SAHPI_ES_UPPER_MINOR, }, { .event = "0681C40x", /* EN_PFA_HI_OVER_TEMP_DASD1 */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_UPPER_MAJOR | SAHPI_ES_UPPER_MINOR, .recovery_state = SAHPI_ES_UNSPECIFIED, }, {}, }, .reading = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, .Value = { .SensorFloat64 = 50, }, }, .thres = { .LowCritical = { .IsSupported = SAHPI_FALSE, }, .LowMajor = { .IsSupported = SAHPI_FALSE, }, .LowMinor = { .IsSupported = SAHPI_FALSE, }, .UpCritical = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, .Value = { .SensorFloat64 = 80, }, }, .UpMajor = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, .Value = { .SensorFloat64 = 60, }, }, .UpMinor = { .IsSupported = SAHPI_FALSE, }, .PosThdHysteresis = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, .Value = { .SensorFloat64 = 2, }, }, .NegThdHysteresis = { .IsSupported = SAHPI_FALSE, }, }, }, .comment = "DASD temperature sensor" }, {} /* Terminate array with a null element */ }; /*********************** * Hot Swap DASD Sensors **********************/ struct sim_sensor sim_hs_dasd_sensors[] = { /* Hot Swap DASD thermal sensor 1 */ { .index = 1, .sensor = { .Num = 1, .Type = SAHPI_TEMPERATURE, .Category = SAHPI_EC_THRESHOLD, .EnableCtrl = SAHPI_FALSE, .EventCtrl = SAHPI_SEC_READ_ONLY, .Events = SAHPI_ES_UPPER_MINOR | SAHPI_ES_UPPER_MAJOR | SAHPI_ES_UPPER_CRIT, .DataFormat = { .IsSupported = SAHPI_TRUE, .ReadingType = SAHPI_SENSOR_READING_TYPE_FLOAT64, .BaseUnits = SAHPI_SU_DEGREES_F, .ModifierUnits = SAHPI_SU_UNSPECIFIED, .ModifierUse = SAHPI_SMUU_NONE, .Percentage = SAHPI_FALSE, .Range = { .Flags = SAHPI_SRF_MAX | SAHPI_SRF_MIN | SAHPI_SRF_NORMAL_MAX | SAHPI_SRF_NORMAL_MIN | SAHPI_SRF_NOMINAL, .Max = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, .Value = { .SensorFloat64 = 125, }, }, .Min = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, .Value = { .SensorFloat64 = 40, }, }, .NormalMax = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, .Value = { .SensorFloat64 = 110, }, }, .Nominal = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, .Value = { .SensorFloat64 = 100, }, }, .NormalMin = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, .Value = { .SensorFloat64 = 90, }, }, }, }, .ThresholdDefn = { .IsAccessible = SAHPI_TRUE, .ReadThold = SAHPI_STM_UP_MAJOR | SAHPI_STM_UP_CRIT | SAHPI_STM_LOW_MAJOR | SAHPI_STM_LOW_CRIT | SAHPI_STM_UP_CRIT | SAHPI_STM_UP_HYSTERESIS, .WriteThold = SAHPI_STM_UP_MAJOR | SAHPI_STM_UP_CRIT | SAHPI_STM_LOW_MAJOR | SAHPI_STM_LOW_CRIT | SAHPI_STM_UP_CRIT | SAHPI_STM_UP_HYSTERESIS, .Nonlinear = SAHPI_FALSE, }, .Oem = 0, }, .sensor_info = { .cur_state = SAHPI_ES_UPPER_MINOR, .sensor_enabled = SAHPI_TRUE, .events_enabled = SAHPI_TRUE, .assert_mask = SAHPI_ES_UPPER_MINOR | SAHPI_ES_UPPER_MAJOR | SAHPI_ES_UPPER_CRIT, .deassert_mask = SAHPI_ES_UPPER_MINOR | SAHPI_ES_UPPER_MAJOR | SAHPI_ES_UPPER_CRIT, .event_array = { { .event = "0511C480", /* EN_CUTOFF_HI_OVER_TEMP_PLANAR */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_TRUE, .event_res_failure_unexpected = SAHPI_TRUE, .event_state = SAHPI_ES_UPPER_CRIT | SAHPI_ES_UPPER_MAJOR | SAHPI_ES_UPPER_MINOR, .recovery_state = SAHPI_ES_UPPER_MAJOR | SAHPI_ES_UPPER_MINOR, }, { .event = "0511C080", /* EN_OVER_TEMP_PLANAR */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_TRUE, .event_res_failure_unexpected = SAHPI_TRUE, .event_state = SAHPI_ES_UPPER_CRIT | SAHPI_ES_UPPER_MAJOR | SAHPI_ES_UPPER_MINOR, .recovery_state = SAHPI_ES_UPPER_MAJOR | SAHPI_ES_UPPER_MINOR, }, { .event = "0511D500", /* EN_PFA_HI_OVER_TEMP_PLANAR */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_UPPER_MAJOR | SAHPI_ES_UPPER_MINOR, .recovery_state = SAHPI_ES_UNSPECIFIED, }, {}, }, .reading = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, .Value = { .SensorFloat64 = 35, }, }, .thres = { .LowCritical = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, .Value = { .SensorFloat64 = 40, }, }, .LowMajor = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, .Value = { .SensorFloat64 = 50, }, }, .LowMinor = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, .Value = { .SensorFloat64 = 60, }, }, .UpCritical = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, .Value = { .SensorFloat64 = 125, }, }, .UpMajor = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, .Value = { .SensorFloat64 = 120, }, }, .UpMinor = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, .Value = { .SensorFloat64 = 110, }, }, .PosThdHysteresis = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, .Value = { .SensorFloat64 = 2, }, }, .NegThdHysteresis = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, .Value = { .SensorFloat64 = 2, }, }, }, }, .comment = "HS DASD temperature sensor 1" }, /* Hot Swap DASD thermal sensor 2 */ { .index = 2, .sensor = { .Num = 2, .Type = SAHPI_TEMPERATURE, .Category = SAHPI_EC_THRESHOLD, .EnableCtrl = SAHPI_FALSE, .EventCtrl = SAHPI_SEC_READ_ONLY, .Events = SAHPI_ES_UPPER_MINOR | SAHPI_ES_UPPER_MAJOR | SAHPI_ES_UPPER_CRIT, .DataFormat = { .IsSupported = SAHPI_TRUE, .ReadingType = SAHPI_SENSOR_READING_TYPE_FLOAT64, .BaseUnits = SAHPI_SU_DEGREES_F, .ModifierUnits = SAHPI_SU_UNSPECIFIED, .ModifierUse = SAHPI_SMUU_NONE, .Percentage = SAHPI_FALSE, .Range = { .Flags = SAHPI_SRF_MAX | SAHPI_SRF_MIN | SAHPI_SRF_NORMAL_MAX | SAHPI_SRF_NORMAL_MIN | SAHPI_SRF_NOMINAL, .Max = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, .Value = { .SensorFloat64 = 125, }, }, .Min = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, .Value = { .SensorFloat64 = 40, }, }, .NormalMax = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, .Value = { .SensorFloat64 = 110, }, }, .Nominal = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, .Value = { .SensorFloat64 = 100, }, }, .NormalMin = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, .Value = { .SensorFloat64 = 90, }, }, }, }, .ThresholdDefn = { .IsAccessible = SAHPI_FALSE, }, .Oem = 0, }, .sensor_info = { .cur_state = SAHPI_ES_UPPER_MINOR, .sensor_enabled = SAHPI_TRUE, .events_enabled = SAHPI_TRUE, .assert_mask = SAHPI_ES_UPPER_MINOR | SAHPI_ES_UPPER_MAJOR | SAHPI_ES_UPPER_CRIT, .deassert_mask = SAHPI_ES_UPPER_MINOR | SAHPI_ES_UPPER_MAJOR | SAHPI_ES_UPPER_CRIT, .event_array = { { .event = "0611C480", /* EN_CUTOFF_HI_OVER_TEMP_PLANAR */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_TRUE, .event_res_failure_unexpected = SAHPI_TRUE, .event_state = SAHPI_ES_UPPER_CRIT | SAHPI_ES_UPPER_MAJOR | SAHPI_ES_UPPER_MINOR, .recovery_state = SAHPI_ES_UPPER_MAJOR | SAHPI_ES_UPPER_MINOR, }, { .event = "0611C080", /* EN_OVER_TEMP_PLANAR */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_TRUE, .event_res_failure_unexpected = SAHPI_TRUE, .event_state = SAHPI_ES_UPPER_CRIT | SAHPI_ES_UPPER_MAJOR | SAHPI_ES_UPPER_MINOR, .recovery_state = SAHPI_ES_UPPER_MAJOR | SAHPI_ES_UPPER_MINOR, }, { .event = "0611D500", /* EN_PFA_HI_OVER_TEMP_PLANAR */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_UPPER_MAJOR | SAHPI_ES_UPPER_MINOR, .recovery_state = SAHPI_ES_UNSPECIFIED, }, {}, }, .reading = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, .Value = { .SensorFloat64 = 35, }, }, .thres = { .LowCritical = { .IsSupported = SAHPI_FALSE, }, .LowMajor = { .IsSupported = SAHPI_FALSE, }, .LowMinor = { .IsSupported = SAHPI_FALSE, }, .UpCritical = { .IsSupported = SAHPI_FALSE, }, .UpMajor = { .IsSupported = SAHPI_FALSE, }, .UpMinor = { .IsSupported = SAHPI_FALSE, }, .PosThdHysteresis = { .IsSupported = SAHPI_FALSE, }, .NegThdHysteresis = { .IsSupported = SAHPI_FALSE, }, }, }, .comment = "HS DASD temperature sensor 2" }, {} /* Terminate array with a null element */ }; /************* * Fan Sensors *************/ struct sim_sensor sim_fan_sensors[] = { /* Fan speed */ { .index = 1, .sensor = { .Num = 1, .Type = SAHPI_FAN, .Category = SAHPI_EC_PRED_FAIL, .EnableCtrl = SAHPI_FALSE, .EventCtrl = SAHPI_SEC_READ_ONLY, .Events = SAHPI_ES_PRED_FAILURE_ASSERT | SAHPI_ES_PRED_FAILURE_DEASSERT, .DataFormat = { .IsSupported = SAHPI_TRUE, .ReadingType = SAHPI_SENSOR_READING_TYPE_FLOAT64, .BaseUnits = SAHPI_SU_RPM, .ModifierUnits = SAHPI_SU_UNSPECIFIED, .ModifierUse = SAHPI_SMUU_NONE, .Percentage = SAHPI_TRUE, .Range = { .Flags = SAHPI_SRF_MAX | SAHPI_SRF_MIN, .Max = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, .Value = { .SensorFloat64 = 100, }, }, .Min = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, .Value = { .SensorFloat64 = 0, }, }, }, }, .ThresholdDefn = { .IsAccessible = SAHPI_FALSE, }, .Oem = 0, }, .sensor_info = { .cur_state = SAHPI_ES_PRED_FAILURE_DEASSERT, .sensor_enabled = SAHPI_TRUE, .events_enabled = SAHPI_TRUE, .assert_mask = SAHPI_ES_PRED_FAILURE_ASSERT, .deassert_mask = SAHPI_ES_PRED_FAILURE_ASSERT, .event_array = { { .event = "000A600x", /* EN_FANx_PFA */ .event_assertion = SAHPI_TRUE, .event_res_failure = SAHPI_FALSE, .event_res_failure_unexpected = SAHPI_FALSE, .event_state = SAHPI_ES_PRED_FAILURE_ASSERT, .recovery_state = SAHPI_ES_PRED_FAILURE_DEASSERT, }, {}, }, .reading = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, .Value = { .SensorFloat64 = 60, }, }, }, .comment = "Blower fan speed - percent of maximum RPM" }, {} /* Terminate array with a null element */ }; /****************************************************************************** * Control Definitions * * These are patterned after an RSA type machine ******************************************************************************/ struct sim_control sim_chassis_controls[] = { /* Digital Control */ { .index = 1, .control = { .Num = 1, .OutputType = SAHPI_CTRL_LED, .Type = SAHPI_CTRL_TYPE_DIGITAL, .TypeUnion.Digital.Default = SAHPI_CTRL_STATE_ON, .DefaultMode = { .Mode = SAHPI_CTRL_MODE_AUTO, .ReadOnly = SAHPI_TRUE, }, .WriteOnly = SAHPI_FALSE, .Oem = 0, }, .mode = SAHPI_CTRL_MODE_AUTO, .comment = "Digital Control" }, /* Discrete Control */ { .index = 2, .control = { .Num = 2, .OutputType = SAHPI_CTRL_LED, .Type = SAHPI_CTRL_TYPE_DISCRETE, .TypeUnion.Discrete.Default = 1, .DefaultMode = { .Mode = SAHPI_CTRL_MODE_AUTO, .ReadOnly = SAHPI_TRUE, }, .WriteOnly = SAHPI_FALSE, .Oem = 0, }, .mode = SAHPI_CTRL_MODE_AUTO, .comment = "Discrete Control" }, /* Analog Control */ { .index = 3, .control = { .Num = 3, .OutputType = SAHPI_CTRL_AUDIBLE, .Type = SAHPI_CTRL_TYPE_ANALOG, .TypeUnion.Analog.Min = 0, .TypeUnion.Analog.Max = 10, .TypeUnion.Analog.Default = 0, .DefaultMode = { .Mode = SAHPI_CTRL_MODE_AUTO, .ReadOnly = SAHPI_TRUE, }, .WriteOnly = SAHPI_FALSE, .Oem = 0, }, .mode = SAHPI_CTRL_MODE_AUTO, .comment = "Analog Control" }, /* Stream Control */ { .index = 4, .control = { .Num = 4, .OutputType = SAHPI_CTRL_LED, .Type = SAHPI_CTRL_TYPE_STREAM, .TypeUnion.Stream.Default = { .Stream[0] = 'O', .Stream[1] = 'k', }, .DefaultMode = { .Mode = SAHPI_CTRL_MODE_AUTO, .ReadOnly = SAHPI_TRUE, }, .WriteOnly = SAHPI_FALSE, .Oem = 0, }, .mode = SAHPI_CTRL_MODE_AUTO, .comment = "Stream Control" }, /* Text Control */ { .index = 5, .control = { .Num = 5, .OutputType = SAHPI_CTRL_LCD_DISPLAY, .Type = SAHPI_CTRL_TYPE_TEXT, .TypeUnion.Text.MaxChars = 10, .TypeUnion.Text.MaxLines = 2, .TypeUnion.Text.Language = SAHPI_LANG_ENGLISH, .TypeUnion.Text.DataType = SAHPI_TL_TYPE_TEXT, .TypeUnion.Text.Default = { .Line = 0, .Text = { .DataType = SAHPI_TL_TYPE_TEXT, .Language = SAHPI_LANG_ENGLISH, .DataLength = 7, .Data[0] = 'U', .Data[1] = 'n', .Data[2] = 'k', .Data[3] = 'n', .Data[4] = 'w', .Data[5] = 'o', .Data[6] = 'n', }, }, .DefaultMode = { .Mode = SAHPI_CTRL_MODE_AUTO, .ReadOnly = SAHPI_TRUE, }, .WriteOnly = SAHPI_FALSE, .Oem = 0, }, .mode = SAHPI_CTRL_MODE_AUTO, .comment = "Text Control" }, /* Oem Control */ { .index = 6, .control = { .Num = 6, .OutputType = SAHPI_CTRL_LED, .Type = SAHPI_CTRL_TYPE_OEM, .TypeUnion.Oem.MId = 123, .TypeUnion.Oem.ConfigData[0] = 0, .TypeUnion.Oem.ConfigData[1] = 0, .TypeUnion.Oem.ConfigData[2] = 0, .TypeUnion.Oem.ConfigData[3] = 0, .TypeUnion.Oem.ConfigData[4] = 0, .TypeUnion.Oem.ConfigData[5] = 0, .TypeUnion.Oem.ConfigData[6] = 0, .TypeUnion.Oem.ConfigData[7] = 0, .TypeUnion.Oem.ConfigData[8] = 0, .TypeUnion.Oem.ConfigData[9] = 0, .TypeUnion.Oem.Default = { .MId = 123, .BodyLength = 2, .Body[0] = 'O', .Body[1] = 'k', }, .DefaultMode = { .Mode = SAHPI_CTRL_MODE_AUTO, .ReadOnly = SAHPI_TRUE, }, .WriteOnly = SAHPI_FALSE, .Oem = 0, }, .mode = SAHPI_CTRL_MODE_AUTO, .comment = "Oem Control" }, {} /* Terminate array with a null element */ }; struct sim_control sim_cpu_controls[] = { {} /* Terminate array with a null element */ }; struct sim_control sim_dasd_controls[] = { {} /* Terminate array with a null element */ }; struct sim_control sim_hs_dasd_controls[] = { /* Digital Control */ { .index = 1, .control = { .Num = 1, .OutputType = SAHPI_CTRL_LED, .Type = SAHPI_CTRL_TYPE_DIGITAL, .TypeUnion.Digital.Default = SAHPI_CTRL_STATE_ON, .DefaultMode = { .Mode = SAHPI_CTRL_MODE_AUTO, .ReadOnly = SAHPI_TRUE, }, .WriteOnly = SAHPI_FALSE, .Oem = 0, }, .mode = SAHPI_CTRL_MODE_AUTO, .comment = "Digital Control" }, /* Discrete Control */ { .index = 2, .control = { .Num = 2, .OutputType = SAHPI_CTRL_LED, .Type = SAHPI_CTRL_TYPE_DISCRETE, .TypeUnion.Discrete.Default = 1, .DefaultMode = { .Mode = SAHPI_CTRL_MODE_AUTO, .ReadOnly = SAHPI_TRUE, }, .WriteOnly = SAHPI_FALSE, .Oem = 0, }, .mode = SAHPI_CTRL_MODE_AUTO, .comment = "Discrete Control" }, /* Analog Control */ { .index = 3, .control = { .Num = 3, .OutputType = SAHPI_CTRL_AUDIBLE, .Type = SAHPI_CTRL_TYPE_ANALOG, .TypeUnion.Analog.Min = 0, .TypeUnion.Analog.Max = 10, .TypeUnion.Analog.Default = 0, .DefaultMode = { .Mode = SAHPI_CTRL_MODE_AUTO, .ReadOnly = SAHPI_TRUE, }, .WriteOnly = SAHPI_FALSE, .Oem = 0, }, .mode = SAHPI_CTRL_MODE_AUTO, .comment = "Analog Control" }, /* Stream Control */ { .index = 4, .control = { .Num = 4, .OutputType = SAHPI_CTRL_LED, .Type = SAHPI_CTRL_TYPE_STREAM, .TypeUnion.Stream.Default = { .Stream[0] = 'O', .Stream[1] = 'k', }, .DefaultMode = { .Mode = SAHPI_CTRL_MODE_AUTO, .ReadOnly = SAHPI_TRUE, }, .WriteOnly = SAHPI_FALSE, .Oem = 0, }, .mode = SAHPI_CTRL_MODE_AUTO, .comment = "Stream Control" }, /* Text Control */ { .index = 5, .control = { .Num = 5, .OutputType = SAHPI_CTRL_LCD_DISPLAY, .Type = SAHPI_CTRL_TYPE_TEXT, .TypeUnion.Text.MaxChars = 10, .TypeUnion.Text.MaxLines = 2, .TypeUnion.Text.Language = SAHPI_LANG_ENGLISH, .TypeUnion.Text.DataType = SAHPI_TL_TYPE_TEXT, .TypeUnion.Text.Default = { .Line = 0, .Text = { .DataType = SAHPI_TL_TYPE_TEXT, .Language = SAHPI_LANG_ENGLISH, .DataLength = 7, .Data[0] = 'U', .Data[1] = 'n', .Data[2] = 'k', .Data[3] = 'n', .Data[4] = 'w', .Data[5] = 'o', .Data[6] = 'n', }, }, .DefaultMode = { .Mode = SAHPI_CTRL_MODE_AUTO, .ReadOnly = SAHPI_TRUE, }, .WriteOnly = SAHPI_FALSE, .Oem = 0, }, .mode = SAHPI_CTRL_MODE_AUTO, .comment = "Text Control" }, /* Oem Control */ { .index = 6, .control = { .Num = 6, .OutputType = SAHPI_CTRL_LED, .Type = SAHPI_CTRL_TYPE_OEM, .TypeUnion.Oem.MId = 123, .TypeUnion.Oem.ConfigData[0] = 0, .TypeUnion.Oem.ConfigData[1] = 0, .TypeUnion.Oem.ConfigData[2] = 0, .TypeUnion.Oem.ConfigData[3] = 0, .TypeUnion.Oem.ConfigData[4] = 0, .TypeUnion.Oem.ConfigData[5] = 0, .TypeUnion.Oem.ConfigData[6] = 0, .TypeUnion.Oem.ConfigData[7] = 0, .TypeUnion.Oem.ConfigData[8] = 0, .TypeUnion.Oem.ConfigData[9] = 0, .TypeUnion.Oem.Default = { .MId = 123, .BodyLength = 2, .Body[0] = 'O', .Body[1] = 'k', }, .DefaultMode = { .Mode = SAHPI_CTRL_MODE_AUTO, .ReadOnly = SAHPI_TRUE, }, .WriteOnly = SAHPI_FALSE, .Oem = 0, }, .mode = SAHPI_CTRL_MODE_AUTO, .comment = "Oem Control" }, {} /* Terminate array with a null element */ }; struct sim_control sim_fan_controls[] = { { .index = 1, .control = { .Num = 1, .OutputType = SAHPI_CTRL_FAN_SPEED, .Type = SAHPI_CTRL_TYPE_ANALOG, .TypeUnion = { .Analog = { .Min = 0, .Max = 100, .Default = 80 } }, .DefaultMode = { .Mode = SAHPI_CTRL_MODE_MANUAL, .ReadOnly = SAHPI_FALSE }, .WriteOnly = SAHPI_FALSE, .Oem = 0 }, .mode = SAHPI_CTRL_MODE_MANUAL, .comment = "Fan Analog Control" }, {} /* Terminate array with a null element */ }; /****************************************************************************** * Annunciator Definitions * * These are completely made up as RSA has no annunciators ******************************************************************************/ struct sim_annunciator sim_chassis_annunciators[] = { { .index = 1, .annun = { .AnnunciatorNum = 1, .AnnunciatorType = SAHPI_ANNUNCIATOR_TYPE_AUDIBLE, .ModeReadOnly = SAHPI_FALSE, .MaxConditions = 2, .Oem = 0, }, .announs[0] = { .EntryId = 1, .Timestamp = 0, .AddedByUser = SAHPI_FALSE, .Severity = SAHPI_MAJOR, .Acknowledged = SAHPI_FALSE, .StatusCond = { .Type = SAHPI_STATUS_COND_TYPE_SENSOR, .Entity = { .Entry = { {SAHPI_ENT_SYSTEM_BOARD, 1}, {SAHPI_ENT_ROOT, 0} }, }, .DomainId = 1, .ResourceId = 1, .SensorNum = 1, .EventState = SAHPI_ES_UNSPECIFIED, .Name = { .Length = 5, .Value = "announ" }, .Mid = 123, }, }, .announs[1] = { .EntryId = 2, .Timestamp = 0, .AddedByUser = SAHPI_FALSE, .Severity = SAHPI_MINOR, .Acknowledged = SAHPI_FALSE, .StatusCond = { .Type = SAHPI_STATUS_COND_TYPE_SENSOR, .Entity = { .Entry = { {SAHPI_ENT_SYSTEM_BOARD, 1}, {SAHPI_ENT_ROOT, 0} }, }, .DomainId = 1, .ResourceId = 1, .SensorNum = 1, .EventState = SAHPI_ES_UNSPECIFIED, .Name = { .Length = 5, .Value = "announ" }, .Mid = 123, }, }, .announs[2] = { .EntryId = 3, .Timestamp = 0, .AddedByUser = SAHPI_FALSE, .Severity = SAHPI_INFORMATIONAL, .Acknowledged = SAHPI_FALSE, .StatusCond = { .Type = SAHPI_STATUS_COND_TYPE_SENSOR, .Entity = { .Entry = { {SAHPI_ENT_SYSTEM_BOARD, 1}, {SAHPI_ENT_ROOT, 0} }, }, .DomainId = 1, .ResourceId = 1, .SensorNum = 1, .EventState = SAHPI_ES_UNSPECIFIED, .Name = { .Length = 5, .Value = "announ" }, .Mid = 123, }, }, .comment = "Annunciator 1" }, {} /* Terminate array with a null element */ }; struct sim_annunciator sim_cpu_annunciators[] = { {} /* Terminate array with a null element */ }; struct sim_annunciator sim_dasd_annunciators[] = { {} /* Terminate array with a null element */ }; struct sim_annunciator sim_hs_dasd_annunciators[] = { { .index = 1, .annun = { .AnnunciatorNum = 1, .AnnunciatorType = SAHPI_ANNUNCIATOR_TYPE_AUDIBLE, .ModeReadOnly = SAHPI_FALSE, .MaxConditions = 2, .Oem = 0, }, .announs[0] = { .EntryId = 1, .Timestamp = 0, .AddedByUser = SAHPI_FALSE, .Severity = SAHPI_MAJOR, .Acknowledged = SAHPI_FALSE, .StatusCond = { .Type = SAHPI_STATUS_COND_TYPE_SENSOR, .Entity = { .Entry = { {SAHPI_ENT_DISK_DRIVE, 2}, {SAHPI_ENT_ROOT, 0} }, }, .DomainId = 1, .ResourceId = 1, .SensorNum = 1, .EventState = SAHPI_ES_UNSPECIFIED, .Name = { .Length = 5, .Value = "announ" }, .Mid = 123, }, }, .announs[1] = { .EntryId = 2, .Timestamp = 0, .AddedByUser = SAHPI_FALSE, .Severity = SAHPI_MINOR, .Acknowledged = SAHPI_FALSE, .StatusCond = { .Type = SAHPI_STATUS_COND_TYPE_SENSOR, .Entity = { .Entry = { {SAHPI_ENT_DISK_DRIVE, 2}, {SAHPI_ENT_ROOT, 0} }, }, .DomainId = 1, .ResourceId = 1, .SensorNum = 1, .EventState = SAHPI_ES_UNSPECIFIED, .Name = { .Length = 5, .Value = "announ" }, .Mid = 123, }, }, .announs[2] = { .EntryId = 3, .Timestamp = 0, .AddedByUser = SAHPI_FALSE, .Severity = SAHPI_INFORMATIONAL, .Acknowledged = SAHPI_FALSE, .StatusCond = { .Type = SAHPI_STATUS_COND_TYPE_SENSOR, .Entity = { .Entry = { {SAHPI_ENT_DISK_DRIVE, 2}, {SAHPI_ENT_ROOT, 0} }, }, .DomainId = 1, .ResourceId = 1, .SensorNum = 1, .EventState = SAHPI_ES_UNSPECIFIED, .Name = { .Length = 5, .Value = "announ" }, .Mid = 123, }, }, .comment = "Annunciator 2" }, {} /* Terminate array with a null element */ }; struct sim_annunciator sim_fan_annunciators[] = { {} /* Terminate array with a null element */ }; /****************************************************************************** * Watchdog Definitions * * These are completely made up as RSA has no watchdogs ******************************************************************************/ struct sim_watchdog sim_chassis_watchdogs[] = { { .watchdogrec = { .WatchdogNum = 1, .Oem = 0, }, .wd = { .Log = SAHPI_TRUE, .Running = SAHPI_FALSE, .TimerUse = SAHPI_WTU_NONE, .TimerAction = SAHPI_WA_NO_ACTION, .PretimerInterrupt = SAHPI_WPI_NONE, .PreTimeoutInterval = 0, .TimerUseExpFlags = SAHPI_WTU_NONE, .InitialCount = 0, .PresentCount = 0, }, .comment = "Watchdog 1" }, {} /* Terminate array with a null element */ }; struct sim_watchdog sim_cpu_watchdogs[] = { {} /* Terminate array with a null element */ }; struct sim_watchdog sim_dasd_watchdogs[] = { {} /* Terminate array with a null element */ }; struct sim_watchdog sim_hs_dasd_watchdogs[] = { { .watchdogrec = { .WatchdogNum = 1, .Oem = 0, }, .wd = { .Log = SAHPI_TRUE, .Running = SAHPI_FALSE, .TimerUse = SAHPI_WTU_NONE, .TimerAction = SAHPI_WA_NO_ACTION, .PretimerInterrupt = SAHPI_WPI_NONE, .PreTimeoutInterval = 0, .TimerUseExpFlags = SAHPI_WTU_NONE, .InitialCount = 0, .PresentCount = 0, }, .comment = "Watchdog 2" }, {} /* Terminate array with a null element */ }; struct sim_watchdog sim_fan_watchdogs[] = { {} /* Terminate array with a null element */ }; /************************************************************************* * Inventory Definitions *************************************************************************/ struct sim_inventory sim_chassis_inventory[] = { { .invrec = { .IdrId = 1, .Persistent = SAHPI_FALSE, .Oem = 0, }, .info = { .nextareaid = 2, // change if you add more areas below .idrinfo = { .IdrId = 1, .UpdateCount = 0, .ReadOnly = SAHPI_TRUE, .NumAreas = 1, // change if you want more areas below }, .area[0] = { .nextfieldid = 2, // change if you add more fields below .idrareahead = { .AreaId = 1, .Type = SAHPI_IDR_AREATYPE_CHASSIS_INFO, .ReadOnly = SAHPI_TRUE, .NumFields = 1, //change if you add more fields below }, .field[0] = { .AreaId = 1, .FieldId = 1, .Type = SAHPI_IDR_FIELDTYPE_MANUFACTURER, .ReadOnly = SAHPI_TRUE, .Field = { .DataType = SAHPI_TL_TYPE_TEXT, .Language = SAHPI_LANG_ENGLISH, .DataLength = 6, .Data[0] = 'I', .Data[1] = 'B', .Data[2] = 'M', .Data[3] = 'X', .Data[4] = 'X', .Data[5] = 'X', .Data[6] = '\0', }, }, }, }, .comment = "Simulator Inv 1", }, {} /* Terminate array with a null element */ }; struct sim_inventory sim_cpu_inventory[] = { {} /* Terminate array with a null element */ }; struct sim_inventory sim_dasd_inventory[] = { {} /* Terminate array with a null element */ }; struct sim_inventory sim_hs_dasd_inventory[] = { { .invrec = { .IdrId = 1, .Persistent = SAHPI_FALSE, .Oem = 0, }, .info = { .nextareaid = 2, // change if you add more areas below .idrinfo = { .IdrId = 1, .UpdateCount = 0, .ReadOnly = SAHPI_TRUE, .NumAreas = 1, // change if you want more areas below }, .area[0] = { .nextfieldid = 2, // change if you add more fields below .idrareahead = { .AreaId = 1, .Type = SAHPI_IDR_AREATYPE_CHASSIS_INFO, .ReadOnly = SAHPI_TRUE, .NumFields = 1, //change if you add more fields below }, .field[0] = { .AreaId = 1, .FieldId = 1, .Type = SAHPI_IDR_FIELDTYPE_MANUFACTURER, .ReadOnly = SAHPI_TRUE, .Field = { .DataType = SAHPI_TL_TYPE_TEXT, .Language = SAHPI_LANG_ENGLISH, .DataLength = 6, .Data[0] = 'I', .Data[1] = 'B', .Data[2] = 'M', .Data[3] = 'X', .Data[4] = 'X', .Data[5] = 'X', .Data[6] = '\0', }, }, }, }, .comment = "Simulator HS DASD Inv 1", }, {} /* Terminate array with a null element */ }; struct sim_inventory sim_fan_inventory[] = { {} /* Terminate array with a null element */ }; struct sim_dimi sim_chassis_dimis[] = { { .dimirec = { .DimiNum = 1, .Oem = 0, }, .info = { .NumberOfTests =1, .TestNumUpdateCounter=0, }, .test = { .TestName={ .DataType = SAHPI_TL_TYPE_TEXT, .Language = SAHPI_LANG_ENGLISH, .DataLength = 7, .Data = "unknown" }, .ServiceImpact=SAHPI_DIMITEST_NONDEGRADING, .EntitiesImpacted= { { .EntityImpacted.Entry= { { .EntityType = SAHPI_ENT_PROCESSOR, .EntityLocation = 1 }, { .EntityType = SAHPI_ENT_POWER_SUPPLY, .EntityLocation = 1 }, { .EntityType = SAHPI_ENT_ADD_IN_CARD, .EntityLocation = 1 }, { .EntityType = SAHPI_ENT_POWER_UNIT, .EntityLocation = 1 }, { .EntityType = SAHPI_ENT_ROOT, .EntityLocation = 0 }, }, .ServiceImpact=SAHPI_DIMITEST_NONDEGRADING, } }, .NeedServiceOS= SAHPI_FALSE, .ExpectedRunDuration=1000000000, .TestCapabilities=SAHPI_DIMITEST_CAPABILITY_TESTCANCEL, .TestParameters = { { .ParamName = "Some Test Param Name", .ParamInfo = { .DataType = SAHPI_TL_TYPE_TEXT, .Language = SAHPI_LANG_ENGLISH, .DataLength = 7, .Data = "Unknown" }, .ParamType = SAHPI_DIMITEST_PARAM_TYPE_BOOLEAN, .DefaultParam.parambool = SAHPI_TRUE } } }, .comment = "Dimi 1 simulator", }, {} /* Terminate array with a null element */ }; struct sim_fumi sim_chassis_fumis[] = { { .fumirec = { .Num = 1, .AccessProt = SAHPI_FUMI_PROT_FTP, .Capability = SAHPI_FUMI_CAP_BANKCOPY, .NumBanks = 1, .Oem = 0, }, .srcinfo = { .SourceUri = { .DataType = SAHPI_TL_TYPE_TEXT, .Language = SAHPI_LANG_ENGLISH, .DataLength = 7, .Data = "unknown" }, .SourceStatus = SAHPI_FUMI_SRC_VALID, .Identifier = { .DataType = SAHPI_TL_TYPE_TEXT, .Language = SAHPI_LANG_ENGLISH, .DataLength = 3, .Data = "abc" }, .Description = { .DataType = SAHPI_TL_TYPE_TEXT, .Language = SAHPI_LANG_ENGLISH, .DataLength = 3, .Data = "xyz" }, .DateTime = { .DataType = SAHPI_TL_TYPE_TEXT, .Language = SAHPI_LANG_ENGLISH, .DataLength = 3, .Data = "09/05/2008" }, .MajorVersion = 0, .MinorVersion = 0, .AuxVersion = 0 }, .info = { .BankId = 0, .BankSize = 250, .Position = 1, .BankState = SAHPI_FUMI_BANK_ACTIVE, .Identifier = { .DataType = SAHPI_TL_TYPE_TEXT, .Language = SAHPI_LANG_ENGLISH, .DataLength = 3, .Data = "abc" }, .Description = { .DataType = SAHPI_TL_TYPE_TEXT, .Language = SAHPI_LANG_ENGLISH, .DataLength = 3, .Data = "xyz" }, .DateTime = { .DataType = SAHPI_TL_TYPE_TEXT, .Language = SAHPI_LANG_ENGLISH, .DataLength = 3, .Data = "09/05/2008" }, .MajorVersion = 0, .MinorVersion = 0, .AuxVersion = 0 }, .comment = "Fumi 1 simulator", }, {} /* Terminate array with a null element */ }; openhpi-2.14.1/plugins/simulator/sim_annunciators.c0000644000076400007640000001267711302566612017430 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005, 2006 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * Christina Hernandez * W. David Ashley * Renier Morales */ #include #include static SaErrorT new_annunciator(struct oh_handler_state *state, struct oh_event *e, struct sim_annunciator * myannun) { SaHpiRdrT *rdr; struct simAnnunciatorInfo *info = NULL; int i; SaErrorT error = SA_OK; rdr = (SaHpiRdrT *)g_malloc0(sizeof(SaHpiRdrT)); // set up res_rdr rdr->RdrType = SAHPI_ANNUNCIATOR_RDR; memcpy(&rdr->RdrTypeUnion.AnnunciatorRec, &myannun->annun, sizeof(SaHpiAnnunciatorRecT)); oh_init_textbuffer(&rdr->IdString); oh_append_textbuffer(&rdr->IdString, myannun->comment); // get the entity path rdr->Entity = e->resource.ResourceEntity; // save the announcements for the annunciator for (i = 0; myannun->announs[i].EntryId != 0; i++) { if (info == NULL) { info = (struct simAnnunciatorInfo *)g_malloc0(sizeof(struct simAnnunciatorInfo)); // set the default mode value info->mode = SAHPI_ANNUNCIATOR_MODE_SHARED; // set up the announcement list info->announs = oh_announcement_create(); if (info->announs == NULL) { return SA_ERR_HPI_OUT_OF_SPACE; } } /* fix the resource id for the announcement */ myannun->announs[i].StatusCond.ResourceId = e->resource.ResourceId; oh_announcement_append(info->announs, &myannun->announs[i]); } /* everything ready so inject the rdr */ error = sim_inject_rdr(state, e, rdr, info); if (error) { g_free(rdr); g_free(info); } return error; } SaErrorT sim_discover_chassis_annunciators(struct oh_handler_state *state, struct oh_event *e) { SaErrorT rc; int i = 0; int j = 0; while (sim_chassis_annunciators[i].index != 0) { rc = new_annunciator(state, e, &sim_chassis_annunciators[i]); if (rc) { err("Error %d returned when adding chassis annunciator", rc); } else { j++; } i++; } dbg("%d of %d chassis annunciators injected", j, i); return 0; } SaErrorT sim_discover_cpu_annunciators(struct oh_handler_state *state, struct oh_event *e) { SaErrorT rc; int i = 0; int j = 0; while (sim_cpu_annunciators[i].index != 0) { rc = new_annunciator(state, e, &sim_cpu_annunciators[i]); if (rc) { err("Error %d returned when adding cpu annunciator", rc); } else { j++; } i++; } dbg("%d of %d cpu annunciators injected", j, i); return 0; } SaErrorT sim_discover_dasd_annunciators(struct oh_handler_state *state, struct oh_event *e) { SaErrorT rc; int i = 0; int j = 0; while (sim_dasd_annunciators[i].index != 0) { rc = new_annunciator(state, e, &sim_dasd_annunciators[i]); if (rc) { err("Error %d returned when adding dasd annunciator", rc); } else { j++; } i++; } dbg("%d of %d dasd annunciators injected", j, i); return 0; } SaErrorT sim_discover_hs_dasd_annunciators(struct oh_handler_state *state, struct oh_event *e) { SaErrorT rc; int i = 0; int j = 0; while (sim_hs_dasd_annunciators[i].index != 0) { rc = new_annunciator(state, e, &sim_hs_dasd_annunciators[i]); if (rc) { err("Error %d returned when adding hs dasd annunciator", rc); } else { j++; } i++; } dbg("%d of %d hs dasd annunciators injected", j, i); return 0; } SaErrorT sim_discover_fan_annunciators(struct oh_handler_state *state, struct oh_event *e) { SaErrorT rc; int i = 0; int j = 0; while (sim_fan_annunciators[i].index != 0) { rc = new_annunciator(state, e, &sim_fan_annunciators[i]); if (rc) { err("Error %d returned when adding fan annunciator", rc); } else { j++; } i++; } dbg("%d of %d fan annunciators injected", j, i); return 0; } openhpi-2.14.1/plugins/simulator/sim_dimi_func.h0000644000076400007640000000123211302566612016647 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2007 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * Renier Morales */ #ifndef __SIM_DIMI_FUNC_H #define __SIM_DIMI_FUNC_H SaErrorT sim_get_dimi_info(void *hnd, SaHpiResourceIdT rid, SaHpiDimiNumT num, SaHpiDimiInfoT *info); #endif openhpi-2.14.1/plugins/simulator/sim_sensor_func.c0000755000076400007640000005041711302566612017245 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * Christina Hernandez * W. David Ashley */ #include /************************************************************************/ /* Sensor functions */ /************************************************************************/ SaErrorT sim_get_sensor_reading(void *hnd, SaHpiResourceIdT id, SaHpiSensorNumT num, SaHpiSensorReadingT *data, SaHpiEventStateT *state) { struct SensorInfo *sinfo; struct oh_handler_state *handle = (struct oh_handler_state *)hnd; if (!hnd) { err("Invalid parameter."); return(SA_ERR_HPI_INVALID_PARAMS); } /* Check if resource exists and has sensor capabilities */ SaHpiRptEntryT *rpt = oh_get_resource_by_id(handle->rptcache, id); if (!rpt) return(SA_ERR_HPI_INVALID_RESOURCE); if (!(rpt->ResourceCapabilities & SAHPI_CAPABILITY_SENSOR)) return(SA_ERR_HPI_CAPABILITY); /* Check if sensor exist and is enabled */ SaHpiRdrT *rdr = oh_get_rdr_by_type(handle->rptcache, id, SAHPI_SENSOR_RDR, num); if (rdr == NULL) return(SA_ERR_HPI_NOT_PRESENT); sinfo = (struct SensorInfo *)oh_get_rdr_data(handle->rptcache, id, rdr->RecordId); if (sinfo == NULL) { err("No sensor data. Sensor=%s", rdr->IdString.Data); return(SA_ERR_HPI_NOT_PRESENT); } /*If sensor is enabled, get sensor reading*/ if (sinfo->sensor_enabled == SAHPI_FALSE) { return(SA_ERR_HPI_INVALID_REQUEST); } else { if (data) { *data = sinfo->reading; } if (state) { *state = sinfo->cur_state; } } return(SA_OK); } SaErrorT sim_get_sensor_eventstate(void *hnd, SaHpiResourceIdT rid, SaHpiSensorNumT sid, SaHpiSensorReadingT *reading, SaHpiEventStateT *state) { struct SensorInfo *sinfo; struct oh_handler_state *handle = (struct oh_handler_state *)hnd; if (!hnd || !reading || !state) { err("Invalid parameter."); return(SA_ERR_HPI_INVALID_PARAMS); } /* Check if resource exists and has sensor capabilities */ SaHpiRptEntryT *rpt = oh_get_resource_by_id(handle->rptcache, rid); if (!rpt) return(SA_ERR_HPI_INVALID_RESOURCE); if (!(rpt->ResourceCapabilities & SAHPI_CAPABILITY_SENSOR)) return(SA_ERR_HPI_CAPABILITY); /* Check if sensor exist and is enabled */ SaHpiRdrT *rdr = oh_get_rdr_by_type(handle->rptcache, rid, SAHPI_SENSOR_RDR, sid); if (rdr == NULL) return(SA_ERR_HPI_NOT_PRESENT); sinfo = (struct SensorInfo *)oh_get_rdr_data(handle->rptcache, rid, rdr->RecordId); if (sinfo == NULL) { err("No sensor data. Sensor=%s", rdr->IdString.Data); return(SA_ERR_HPI_NOT_PRESENT); } /*If sensor is enabled, set event state to cur_state*/ if (sinfo->sensor_enabled == SAHPI_FALSE){ return(SA_ERR_HPI_INVALID_REQUEST); } else { *state = sinfo->cur_state; } return(SA_OK); } SaErrorT sim_get_sensor_thresholds(void *hnd, SaHpiResourceIdT rid, SaHpiSensorNumT sid, SaHpiSensorThresholdsT *thres) { struct SensorInfo *sinfo; struct oh_handler_state *handle = (struct oh_handler_state *)hnd; if (!hnd || !thres) { err("Invalid parameter."); return(SA_ERR_HPI_INVALID_PARAMS); } if (!rid) return SA_ERR_HPI_INVALID_RESOURCE; if (!sid) return SA_ERR_HPI_NOT_PRESENT; /* Check if resource exists and has sensor capabilities */ SaHpiRptEntryT *rpt = oh_get_resource_by_id(handle->rptcache, rid); if (!rpt) return(SA_ERR_HPI_INVALID_RESOURCE); if (!(rpt->ResourceCapabilities & SAHPI_CAPABILITY_SENSOR)) return(SA_ERR_HPI_CAPABILITY); /* Check if sensor exist and is enabled */ SaHpiRdrT *rdr = oh_get_rdr_by_type(handle->rptcache, rid, SAHPI_SENSOR_RDR, sid); if (rdr == NULL) return(SA_ERR_HPI_NOT_PRESENT); sinfo = (struct SensorInfo *)oh_get_rdr_data(handle->rptcache, rid, rdr->RecordId); if (sinfo == NULL) { err("No sensor data. Sensor=%s", rdr->IdString.Data); return(SA_ERR_HPI_NOT_PRESENT); } /* If sensor is enabled, set thresholds */ if (sinfo->sensor_enabled == SAHPI_FALSE){ return(SA_ERR_HPI_INVALID_REQUEST); } else { *thres = sinfo->thres; } return(SA_OK); } SaErrorT sim_set_sensor_thresholds(void *hnd, SaHpiResourceIdT rid, SaHpiSensorNumT sid, const SaHpiSensorThresholdsT *thres) { struct oh_handler_state *handle = (struct oh_handler_state *)hnd; struct SensorInfo *sinfo; if (!hnd || !thres) { err("Invalid parameter"); return(SA_ERR_HPI_INVALID_PARAMS); } /* Check if resource exists and has sensor capabilities */ SaHpiRptEntryT *rpt = oh_get_resource_by_id(handle->rptcache, rid); if (!rpt) return(SA_ERR_HPI_INVALID_RESOURCE); if (!(rpt->ResourceCapabilities & SAHPI_CAPABILITY_SENSOR)) return(SA_ERR_HPI_CAPABILITY); /* Check if sensor exist and is enabled */ SaHpiRdrT *rdr = oh_get_rdr_by_type(handle->rptcache, rid, SAHPI_SENSOR_RDR, sid); if (rdr == NULL) return(SA_ERR_HPI_NOT_PRESENT); sinfo = (struct SensorInfo *)oh_get_rdr_data(handle->rptcache, rid, rdr->RecordId); if (sinfo == NULL) { err("No sensor data. Sensor=%s", rdr->IdString.Data); return(SA_ERR_HPI_NOT_PRESENT); } if (rdr->RdrTypeUnion.SensorRec.Category != SAHPI_EC_THRESHOLD || rdr->RdrTypeUnion.SensorRec.ThresholdDefn.IsAccessible == SAHPI_FALSE || rdr->RdrTypeUnion.SensorRec.ThresholdDefn.WriteThold == 0) { return(SA_ERR_HPI_INVALID_CMD); } if (sinfo->sensor_enabled == SAHPI_FALSE){ return(SA_ERR_HPI_INVALID_REQUEST); } else{ memcpy(&sinfo->thres, thres, sizeof(SaHpiSensorThresholdsT)); } return(SA_OK); } /* Do we want this functionality??? SaErrorT sim_set_threshold_reading(void *hnd, SaHpiResourceIdT rid, SaHpiSensorNumT sid, const SaHpiSensorReadingT *reading) */ SaErrorT sim_get_sensor_enable(void *hnd, SaHpiResourceIdT rid, SaHpiSensorNumT sid, SaHpiBoolT *enable) { struct oh_handler_state *handle = (struct oh_handler_state *)hnd; struct SensorInfo *sinfo; if (!hnd || !rid || !sid) { err("Invalid parameter."); return(SA_ERR_HPI_INVALID_PARAMS); } /* Check if resource exists and has sensor capabilities */ SaHpiRptEntryT *rpt = oh_get_resource_by_id(handle->rptcache, rid); if (!rpt) return(SA_ERR_HPI_INVALID_RESOURCE); if (!(rpt->ResourceCapabilities & SAHPI_CAPABILITY_SENSOR)) return(SA_ERR_HPI_CAPABILITY); /* Check if sensor exist and is enabled */ SaHpiRdrT *rdr = oh_get_rdr_by_type(handle->rptcache, rid, SAHPI_SENSOR_RDR, sid); if (rdr == NULL) return(SA_ERR_HPI_NOT_PRESENT); sinfo = (struct SensorInfo *)oh_get_rdr_data(handle->rptcache, rid, rdr->RecordId); if (sinfo == NULL) { err("No sensor data. Sensor=%s", rdr->IdString.Data); return(SA_ERR_HPI_NOT_PRESENT); } /*If sensor is enabled, get sensor enable */ if (sinfo->sensor_enabled == SAHPI_FALSE){ return(SA_ERR_HPI_INVALID_REQUEST); } else { *enable = sinfo->sensor_enabled; } return(SA_OK); } SaErrorT sim_set_sensor_enable(void *hnd, SaHpiResourceIdT rid, SaHpiSensorNumT sid, const SaHpiBoolT enable) { struct oh_handler_state *handle = (struct oh_handler_state *)hnd; struct SensorInfo *sinfo; if (!hnd || !rid || !sid || !enable) { err("Invalid parameter."); return(SA_ERR_HPI_INVALID_PARAMS); } /* Check if resource exists and has sensor capabilities */ SaHpiRptEntryT *rpt = oh_get_resource_by_id(handle->rptcache, rid); if (!rpt) return(SA_ERR_HPI_INVALID_RESOURCE); if (!(rpt->ResourceCapabilities & SAHPI_CAPABILITY_SENSOR)) return(SA_ERR_HPI_CAPABILITY); /* Check if sensor exist and is enabled */ SaHpiRdrT *rdr = oh_get_rdr_by_type(handle->rptcache, rid, SAHPI_SENSOR_RDR, sid); if (rdr == NULL) return(SA_ERR_HPI_NOT_PRESENT); sinfo = (struct SensorInfo *)oh_get_rdr_data(handle->rptcache, rid, rdr->RecordId); if (sinfo == NULL) { err("No sensor data. Sensor=%s", rdr->IdString.Data); return(SA_ERR_HPI_NOT_PRESENT); } /* set sensor flag */ sinfo->sensor_enabled = enable; return(SA_OK); } SaErrorT sim_get_sensor_event_enable(void *hnd, SaHpiResourceIdT rid, SaHpiSensorNumT sid, SaHpiBoolT *enable) { struct oh_handler_state *handle = (struct oh_handler_state *)hnd; struct SensorInfo *sinfo; if (!hnd || !rid || !sid || !enable) { err("Invalid parameter."); return(SA_ERR_HPI_INVALID_PARAMS); } /* Check if resource exists and has sensor capabilities */ SaHpiRptEntryT *rpt = oh_get_resource_by_id(handle->rptcache, rid); if (!rpt) return(SA_ERR_HPI_INVALID_RESOURCE); if (!(rpt->ResourceCapabilities & SAHPI_CAPABILITY_SENSOR)) return(SA_ERR_HPI_CAPABILITY); /* Check if sensor exist and is enabled */ SaHpiRdrT *rdr = oh_get_rdr_by_type(handle->rptcache, rid, SAHPI_SENSOR_RDR, sid); if (rdr == NULL) return(SA_ERR_HPI_NOT_PRESENT); sinfo = (struct SensorInfo *)oh_get_rdr_data(handle->rptcache, rid, rdr->RecordId); if (sinfo == NULL) { err("No sensor data. Sensor=%s", rdr->IdString.Data); return(SA_ERR_HPI_NOT_PRESENT); } /* ge sensor event enable flag */ if (sinfo->sensor_enabled == SAHPI_FALSE){ return(SA_ERR_HPI_INVALID_REQUEST); } else { *enable = sinfo->events_enabled; } return(SA_OK); } SaErrorT sim_set_sensor_event_enable(void *hnd, SaHpiResourceIdT rid, SaHpiSensorNumT sid, const SaHpiBoolT enable) { struct oh_handler_state *handle = (struct oh_handler_state *)hnd; if (!hnd ) { err("Invalid parameter."); return(SA_ERR_HPI_INVALID_PARAMS); } /* Check if resource exists and has sensor capabilities */ SaHpiRptEntryT *rpt = oh_get_resource_by_id(handle->rptcache, rid); if (!rpt) return(SA_ERR_HPI_INVALID_RESOURCE); if (!(rpt->ResourceCapabilities & SAHPI_CAPABILITY_SENSOR)) return(SA_ERR_HPI_CAPABILITY); /* Check if sensor exists and if it supports setting of sensor event enablement */ SaHpiRdrT *rdr = oh_get_rdr_by_type(handle->rptcache, rid, SAHPI_SENSOR_RDR, sid); if (rdr == NULL) return(SA_ERR_HPI_NOT_PRESENT); if (rdr->RdrTypeUnion.SensorRec.EventCtrl == SAHPI_SEC_PER_EVENT || rdr->RdrTypeUnion.SensorRec.EventCtrl == SAHPI_SEC_READ_ONLY_MASKS) { err("BladeCenter/RSA do not support sim_set_sensor_event_enable\n"); struct SensorInfo *sinfo; sinfo = (struct SensorInfo *)oh_get_rdr_data(handle->rptcache, rid, rdr->RecordId); if (sinfo == NULL) { err("No sensor data. Sensor=%s", rdr->IdString.Data); return(SA_ERR_HPI_NOT_PRESENT); } sinfo->events_enabled = enable; } else { return(SA_ERR_HPI_READ_ONLY); } return(SA_OK); } SaErrorT sim_get_sensor_event_masks(void *hnd, SaHpiResourceIdT rid, SaHpiSensorNumT sid, SaHpiEventStateT *AssertEventMask, SaHpiEventStateT *DeassertEventMask) { struct oh_handler_state *handle = (struct oh_handler_state *)hnd; struct SensorInfo *sinfo; if (!hnd ) { err("Invalid parameter."); return(SA_ERR_HPI_INVALID_PARAMS); } /* Check if resource exists and has sensor capabilities */ SaHpiRptEntryT *rpt = oh_get_resource_by_id(handle->rptcache, rid); if (!rpt) return(SA_ERR_HPI_INVALID_RESOURCE); if (!(rpt->ResourceCapabilities & SAHPI_CAPABILITY_SENSOR)) return(SA_ERR_HPI_CAPABILITY); /* Check if sensor exists and return enablement status */ SaHpiRdrT *rdr = oh_get_rdr_by_type(handle->rptcache, rid, SAHPI_SENSOR_RDR, sid); if (rdr == NULL) return(SA_ERR_HPI_NOT_PRESENT); if (!AssertEventMask && !DeassertEventMask) { return SA_OK; } sinfo = (struct SensorInfo *)oh_get_rdr_data(handle->rptcache, rid, rdr->RecordId); if (sinfo == NULL) { err("No sensor data. Sensor=%s", rdr->IdString.Data); return(SA_ERR_HPI_NOT_PRESENT); } if (AssertEventMask) *AssertEventMask = sinfo->assert_mask; if (DeassertEventMask) { if (rpt->ResourceCapabilities & SAHPI_CAPABILITY_EVT_DEASSERTS) { *DeassertEventMask = sinfo->assert_mask; } else { *DeassertEventMask = sinfo->deassert_mask; } } return(SA_OK); } SaErrorT sim_set_sensor_event_masks(void *hnd, SaHpiResourceIdT rid, SaHpiSensorNumT sid, SaHpiSensorEventMaskActionT act, const SaHpiEventStateT AssertEventMask, const SaHpiEventStateT DeassertEventMask) { struct oh_handler_state *handle = (struct oh_handler_state *)hnd; if (!hnd ) { err("Invalid parameter."); return(SA_ERR_HPI_INVALID_PARAMS); } if (oh_lookup_sensoreventmaskaction(act) == NULL) return(SA_ERR_HPI_INVALID_DATA); /* Check if resource exists and has sensor capabilities */ SaHpiRptEntryT *rpt = oh_get_resource_by_id(handle->rptcache, rid); if (!rpt) return(SA_ERR_HPI_INVALID_RESOURCE); if (!(rpt->ResourceCapabilities & SAHPI_CAPABILITY_SENSOR)) return(SA_ERR_HPI_CAPABILITY); /* Check if sensor exists and if it supports setting of sensor event masks */ SaHpiRdrT *rdr = oh_get_rdr_by_type(handle->rptcache, rid, SAHPI_SENSOR_RDR, sid); if (rdr == NULL) return(SA_ERR_HPI_NOT_PRESENT); if (rdr->RdrTypeUnion.SensorRec.EventCtrl == SAHPI_SEC_PER_EVENT) { err("BladeCenter/RSA do not support sim_set_sensor_event_masks"); /* Probably need to drive an OID, if hardware supported it */ struct SensorInfo *sinfo; sinfo = (struct SensorInfo *)oh_get_rdr_data(handle->rptcache, rid, rdr->RecordId); if (sinfo == NULL) { err("No sensor data. Sensor=%s", rdr->IdString.Data); return(SA_ERR_HPI_NOT_PRESENT); } SaHpiEventStateT orig_assert_mask = sinfo->assert_mask; SaHpiEventStateT orig_deassert_mask = sinfo->deassert_mask; /* Check for invalid data in user masks */ if ( (AssertEventMask != SAHPI_ALL_EVENT_STATES) && (AssertEventMask & ~(rdr->RdrTypeUnion.SensorRec.Events)) ) { return(SA_ERR_HPI_INVALID_DATA); } if (!(rpt->ResourceCapabilities & SAHPI_CAPABILITY_EVT_DEASSERTS)) { if ( (DeassertEventMask != SAHPI_ALL_EVENT_STATES) && (DeassertEventMask & ~(rdr->RdrTypeUnion.SensorRec.Events)) ) { return(SA_ERR_HPI_INVALID_DATA); } } /* Add to event masks */ if (act == SAHPI_SENS_ADD_EVENTS_TO_MASKS) { if (AssertEventMask == SAHPI_ALL_EVENT_STATES) { sinfo->assert_mask = rdr->RdrTypeUnion.SensorRec.Events; } else { sinfo->assert_mask = sinfo->assert_mask | AssertEventMask; } if (!(rpt->ResourceCapabilities & SAHPI_CAPABILITY_EVT_DEASSERTS)) { if (DeassertEventMask == SAHPI_ALL_EVENT_STATES) { sinfo->deassert_mask = rdr->RdrTypeUnion.SensorRec.Events; } else { sinfo->deassert_mask = sinfo->deassert_mask | DeassertEventMask; } } } else { /* Remove from event masks */ if (AssertEventMask == SAHPI_ALL_EVENT_STATES) { sinfo->assert_mask = 0; } else { sinfo->assert_mask = sinfo->assert_mask & ~AssertEventMask; } if (!(rpt->ResourceCapabilities & SAHPI_CAPABILITY_EVT_DEASSERTS)) { if (DeassertEventMask == SAHPI_ALL_EVENT_STATES) { sinfo->deassert_mask = 0; } else { sinfo->deassert_mask = sinfo->deassert_mask & ~DeassertEventMask; } } } if (sinfo->assert_mask != orig_assert_mask) { // nop? } else { if (!(rpt->ResourceCapabilities & SAHPI_CAPABILITY_EVT_DEASSERTS) && sinfo->deassert_mask != orig_deassert_mask) { } } } else { return(SA_ERR_HPI_READ_ONLY); } return(SA_OK); } /* * Simulator plugin interface * */ void * oh_get_sensor_reading (void *, SaHpiResourceIdT, SaHpiSensorNumT, SaHpiSensorReadingT *, SaHpiEventStateT *) __attribute__ ((weak, alias("sim_get_sensor_reading"))); void * oh_get_sensor_thresholds (void *, SaHpiResourceIdT, SaHpiSensorNumT, SaHpiSensorThresholdsT *) __attribute__ ((weak, alias("sim_get_sensor_thresholds"))); void * oh_set_sensor_thresholds (void *, SaHpiResourceIdT, SaHpiSensorNumT, const SaHpiSensorThresholdsT *) __attribute__ ((weak, alias("sim_set_sensor_thresholds"))); void * oh_get_sensor_enable (void *, SaHpiResourceIdT, SaHpiSensorNumT, SaHpiBoolT *) __attribute__ ((weak, alias("sim_get_sensor_enable"))); void * oh_set_sensor_enable (void *, SaHpiResourceIdT, SaHpiSensorNumT, SaHpiBoolT) __attribute__ ((weak, alias("sim_set_sensor_enable"))); void * oh_get_sensor_event_enables (void *, SaHpiResourceIdT, SaHpiSensorNumT, SaHpiBoolT *) __attribute__ ((weak, alias("sim_get_sensor_event_enable"))); void * oh_set_sensor_event_enables (void *, SaHpiResourceIdT id, SaHpiSensorNumT, SaHpiBoolT *) __attribute__ ((weak, alias("sim_set_sensor_event_enable"))); void * oh_get_sensor_event_masks (void *, SaHpiResourceIdT, SaHpiSensorNumT, SaHpiEventStateT *, SaHpiEventStateT *) __attribute__ ((weak, alias("sim_get_sensor_event_masks"))); void * oh_set_sensor_event_masks (void *, SaHpiResourceIdT, SaHpiSensorNumT, SaHpiSensorEventMaskActionT, SaHpiEventStateT, SaHpiEventStateT) __attribute__ ((weak, alias("sim_set_sensor_event_masks"))); openhpi-2.14.1/plugins/simulator/sim_hotswap.c0000644000076400007640000003045511302566612016403 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * W. David Ashley */ #include /*---------------------------------------------------------------------- Note: we use the full HS model for the simulator. ----------------------------------------------------------------------*/ SaErrorT sim_get_hotswap_state(void *hnd, SaHpiResourceIdT rid, SaHpiHsStateT *hsstate) { struct simResourceInfo *privinfo; if (!hnd || !hsstate) { err("Invalid parameter."); return SA_ERR_HPI_INVALID_PARAMS; } struct oh_handler_state *state = (struct oh_handler_state *)hnd; /* Check if resource exists and has managed hotswap capabilities */ SaHpiRptEntryT *rpt = oh_get_resource_by_id(state->rptcache, rid); if (!rpt) { return SA_ERR_HPI_INVALID_RESOURCE; } if (!(rpt->ResourceCapabilities & SAHPI_CAPABILITY_MANAGED_HOTSWAP)) { err("No hs capability"); return SA_ERR_HPI_CAPABILITY; } /* get our private state data */ privinfo = (struct simResourceInfo *)oh_get_resource_data(state->rptcache, rid); if (privinfo == NULL) { err("No resource data. ResourceId=%d", rid); return SA_ERR_HPI_INVALID_RESOURCE; } /* It is possible that this API can return the NOT_PRESENT state in violation of the spec. See the note attached to the sim_set_hotswap_state() API to understand why this can happen. */ *hsstate = privinfo->cur_hsstate; return SA_OK; } /* Note: When the hot swap state goes to NOT_PRESENT we really should remove the RPT entry and all its associated RDRs. However, if we do then the simulator has no way of knowing when the resource becomes active again. If this was real hardware we could query it on rediscovery to find out if it has returned or not but since we are virtual we have no way of figuring this out. So, the simulator does NOT remove RPT entries in this case. */ SaErrorT sim_set_hotswap_state(void *hnd, SaHpiResourceIdT rid, SaHpiHsStateT hsstate) { struct simResourceInfo *privinfo; if (!hnd) { err("Invalid parameter."); return SA_ERR_HPI_INVALID_PARAMS; } if (NULL == oh_lookup_hsstate(hsstate)) { err("Invalid hotswap state."); return SA_ERR_HPI_INVALID_REQUEST; } struct oh_handler_state *state = (struct oh_handler_state *)hnd; /* Check if resource exists and has managed hotswap capabilities */ SaHpiRptEntryT *rpt = oh_get_resource_by_id(state->rptcache, rid); if (!rpt) { return SA_ERR_HPI_INVALID_RESOURCE; } if (!(rpt->ResourceCapabilities & SAHPI_CAPABILITY_MANAGED_HOTSWAP)) { return SA_ERR_HPI_CAPABILITY; } /* get our private state data */ privinfo = (struct simResourceInfo *)oh_get_resource_data(state->rptcache, rid); if (privinfo == NULL) { err("No resource data. ResourceId=%d", rid); return SA_ERR_HPI_INVALID_RESOURCE; } /* check that the state transition is correct */ switch (privinfo->cur_hsstate) { case SAHPI_HS_STATE_INACTIVE: if (hsstate == SAHPI_HS_STATE_NOT_PRESENT) { privinfo->cur_hsstate = hsstate; return SA_OK; } if (hsstate == SAHPI_HS_STATE_INSERTION_PENDING) { privinfo->cur_hsstate = hsstate; return SA_OK; } break; case SAHPI_HS_STATE_INSERTION_PENDING: if (hsstate == SAHPI_HS_STATE_NOT_PRESENT) { privinfo->cur_hsstate = hsstate; return SA_OK; } if (hsstate == SAHPI_HS_STATE_INACTIVE) { privinfo->cur_hsstate = hsstate; return SA_OK; } if (hsstate == SAHPI_HS_STATE_ACTIVE) { privinfo->cur_hsstate = hsstate; return SA_OK; } break; case SAHPI_HS_STATE_ACTIVE: if (hsstate == SAHPI_HS_STATE_NOT_PRESENT) { privinfo->cur_hsstate = hsstate; return SA_OK; } if (hsstate == SAHPI_HS_STATE_EXTRACTION_PENDING) { privinfo->cur_hsstate = hsstate; return SA_OK; } break; case SAHPI_HS_STATE_EXTRACTION_PENDING: if (hsstate == SAHPI_HS_STATE_NOT_PRESENT) { privinfo->cur_hsstate = hsstate; return SA_OK; } if (hsstate == SAHPI_HS_STATE_ACTIVE) { privinfo->cur_hsstate = hsstate; return SA_OK; } if (hsstate == SAHPI_HS_STATE_INACTIVE) { privinfo->cur_hsstate = hsstate; return SA_OK; } break; case SAHPI_HS_STATE_NOT_PRESENT: if (hsstate == SAHPI_HS_STATE_INSERTION_PENDING) { privinfo->cur_hsstate = hsstate; return SA_OK; } break; default: break; } return SA_ERR_HPI_INVALID_REQUEST; } SaErrorT sim_request_hotswap_action(void *hnd, SaHpiResourceIdT rid, SaHpiHsActionT act) { struct simResourceInfo *privinfo; if (!hnd) { err("Invalid parameter."); return SA_ERR_HPI_INVALID_PARAMS; } if (NULL == oh_lookup_hsaction(act)) { err("Invalid hotswap action."); return SA_ERR_HPI_INVALID_REQUEST; } struct oh_handler_state *state = (struct oh_handler_state *)hnd; /* Check if resource exists and has managed hotswap capabilities */ SaHpiRptEntryT *rpt = oh_get_resource_by_id(state->rptcache, rid); if (!rpt) { return SA_ERR_HPI_INVALID_RESOURCE; } /* if not simplified HS then return an error */ if (!(rpt->ResourceCapabilities & SAHPI_CAPABILITY_FRU)) { return SA_ERR_HPI_CAPABILITY; } /* get our private state data */ privinfo = (struct simResourceInfo *)oh_get_resource_data(state->rptcache, rid); if (privinfo == NULL) { err("No resource data. ResourceId=%d", rid); return SA_ERR_HPI_INVALID_RESOURCE; } /* check that the action corresponds to a valid state */ if (act == SAHPI_HS_ACTION_INSERTION && privinfo ->cur_hsstate == SAHPI_HS_STATE_INACTIVE) { privinfo->cur_hsstate = SAHPI_HS_STATE_INSERTION_PENDING; return SA_OK; } if (act == SAHPI_HS_ACTION_EXTRACTION && privinfo ->cur_hsstate == SAHPI_HS_STATE_ACTIVE) { privinfo->cur_hsstate = SAHPI_HS_STATE_EXTRACTION_PENDING; return SA_OK; } return SA_ERR_HPI_INVALID_REQUEST; } SaErrorT sim_get_indicator_state(void *hnd, SaHpiResourceIdT rid, SaHpiHsIndicatorStateT *ind_state) { struct simResourceInfo *privinfo; if (!hnd || !ind_state) { err("Invalid parameter."); return(SA_ERR_HPI_INVALID_PARAMS); } struct oh_handler_state *state = (struct oh_handler_state *)hnd; /* Check if resource exists and has managed hotswap capabilities */ SaHpiRptEntryT *rpt = oh_get_resource_by_id(state->rptcache, rid); if (!rpt) { return SA_ERR_HPI_INVALID_RESOURCE; } /* if not simplified HS then return an error */ if (!(rpt->ResourceCapabilities & SAHPI_CAPABILITY_FRU)) { return SA_ERR_HPI_CAPABILITY; } /* get our private state data */ privinfo = (struct simResourceInfo *)oh_get_resource_data(state->rptcache, rid); if (privinfo == NULL) { err("No resource data. ResourceId=%d", rid); return SA_ERR_HPI_INVALID_RESOURCE; } *ind_state = privinfo->cur_indicator_hsstate; return SA_OK; } SaErrorT sim_set_indicator_state(void *hnd, SaHpiResourceIdT rid, SaHpiHsIndicatorStateT ind_state) { struct simResourceInfo *privinfo; if (!hnd) { err("Invalid parameter."); return(SA_ERR_HPI_INVALID_PARAMS); } if (NULL == oh_lookup_hsindicatorstate(ind_state)) { err("Invalid hotswap indicator state."); return(SA_ERR_HPI_INVALID_REQUEST); } struct oh_handler_state *state = (struct oh_handler_state *)hnd; /* Check if resource exists and has managed hotswap capabilities */ SaHpiRptEntryT *rpt = oh_get_resource_by_id(state->rptcache, rid); if (!rpt) { return SA_ERR_HPI_INVALID_RESOURCE; } /* if not simplified HS then return an error */ if (!(rpt->ResourceCapabilities & SAHPI_CAPABILITY_FRU)) { return SA_ERR_HPI_CAPABILITY; } /* get our private state data */ privinfo = (struct simResourceInfo *)oh_get_resource_data(state->rptcache, rid); if (privinfo == NULL) { err("No resource data. ResourceId=%d", rid); return SA_ERR_HPI_INVALID_RESOURCE; } privinfo->cur_indicator_hsstate = ind_state; return SA_OK; } SaErrorT sim_get_autoextract_timeout(void *hnd, SaHpiResourceIdT rid, SaHpiTimeoutT *timeout) { struct simResourceInfo *privinfo; if (!hnd) { err("Invalid parameter."); return(SA_ERR_HPI_INVALID_PARAMS); } struct oh_handler_state *state = (struct oh_handler_state *)hnd; /* Check if resource exists and has managed hotswap capabilities */ SaHpiRptEntryT *rpt = oh_get_resource_by_id(state->rptcache, rid); if (!rpt) { return SA_ERR_HPI_INVALID_RESOURCE; } /* if not simplified HS then return an error */ if (!(rpt->ResourceCapabilities & SAHPI_CAPABILITY_MANAGED_HOTSWAP)) { return SA_ERR_HPI_CAPABILITY; } /* get our private state data */ privinfo = (struct simResourceInfo *)oh_get_resource_data(state->rptcache, rid); if (privinfo == NULL) { err("No resource data. ResourceId=%d", rid); return SA_ERR_HPI_INVALID_RESOURCE; } *timeout = privinfo->ae_timeout; return SA_OK; } SaErrorT sim_set_autoextract_timeout(void *hnd, SaHpiResourceIdT rid, SaHpiTimeoutT timeout) { struct simResourceInfo *privinfo; if (!hnd) { err("Invalid parameter."); return(SA_ERR_HPI_INVALID_PARAMS); } struct oh_handler_state *state = (struct oh_handler_state *)hnd; /* Check if resource exists and has managed hotswap capabilities */ SaHpiRptEntryT *rpt = oh_get_resource_by_id(state->rptcache, rid); if (!rpt) { return SA_ERR_HPI_INVALID_RESOURCE; } /* if not simplified HS then return an error */ if (!(rpt->ResourceCapabilities & SAHPI_CAPABILITY_MANAGED_HOTSWAP)) { return SA_ERR_HPI_CAPABILITY; } if (rpt->HotSwapCapabilities & SAHPI_HS_CAPABILITY_AUTOEXTRACT_READ_ONLY) { return SA_ERR_HPI_READ_ONLY; } /* get our private state data */ privinfo = (struct simResourceInfo *)oh_get_resource_data(state->rptcache, rid); if (privinfo == NULL) { err("No resource data. ResourceId=%d", rid); return SA_ERR_HPI_INVALID_RESOURCE; } privinfo->ae_timeout = timeout; return SA_OK; } void * oh_get_hotswap_state (void *, SaHpiResourceIdT, SaHpiHsStateT *) __attribute__ ((weak, alias("sim_get_hotswap_state"))); void * oh_set_hotswap_state (void *, SaHpiResourceIdT, SaHpiHsStateT) __attribute__ ((weak, alias("sim_set_hotswap_state"))); void * oh_request_hotswap_action (void *, SaHpiResourceIdT, SaHpiHsActionT) __attribute__ ((weak, alias("sim_request_hotswap_action"))); void * oh_set_indicator_state (void *, SaHpiResourceIdT, SaHpiHsIndicatorStateT) __attribute__ ((weak, alias("sim_set_indicator_state"))); void * oh_get_indicator_state (void *, SaHpiResourceIdT, SaHpiHsIndicatorStateT) __attribute__ ((weak, alias("sim_get_indicator_state"))); void * oh_get_autoextract_timeout (void *, SaHpiResourceIdT, SaHpiTimeoutT *) __attribute__ ((weak, alias("sim_get_autoextract_timeout"))); void * oh_set_autoextract_timeout (void *, SaHpiResourceIdT, SaHpiTimeoutT) __attribute__ ((weak, alias("sim_set_autoextract_timeout"))); openhpi-2.14.1/plugins/simulator/sim_reset.c0000644000076400007640000000411611302566612016033 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * W. David Ashley */ #include SaErrorT sim_get_reset_state(void *hnd, SaHpiResourceIdT rid, SaHpiResetActionT *act) { if (!hnd || !act) { err("Invalid parameter."); return SA_ERR_HPI_INVALID_PARAMS; } struct oh_handler_state *state = (struct oh_handler_state *)hnd; /* Check if resource exists and has reset capabilities */ SaHpiRptEntryT *rpt = oh_get_resource_by_id(state->rptcache, rid); if (!rpt) { return SA_ERR_HPI_INVALID_RESOURCE; } if (!(rpt->ResourceCapabilities & SAHPI_CAPABILITY_RESET)) { return SA_ERR_HPI_CAPABILITY; } *act = SAHPI_RESET_DEASSERT; return SA_OK; } SaErrorT sim_set_reset_state(void *hnd, SaHpiResourceIdT rid, SaHpiResetActionT act) { if (!hnd || NULL == oh_lookup_resetaction(act)){ err("Invalid parameter."); return SA_ERR_HPI_INVALID_PARAMS; } if (act == SAHPI_RESET_ASSERT || act == SAHPI_RESET_DEASSERT) return SA_ERR_HPI_INVALID_CMD; struct oh_handler_state *state = (struct oh_handler_state *)hnd; /* Check if resource exists and has reset capabilities */ SaHpiRptEntryT *rpt = oh_get_resource_by_id(state->rptcache, rid); if (!rpt) { return SA_ERR_HPI_INVALID_RESOURCE; } if (!(rpt->ResourceCapabilities & SAHPI_CAPABILITY_RESET)) { return SA_ERR_HPI_CAPABILITY; } return SA_OK; } void * oh_get_reset_state (void *, SaHpiResourceIdT, SaHpiResetActionT *) __attribute__ ((weak, alias("sim_get_reset_state"))); void * oh_set_reset_state (void *, SaHpiResourceIdT, SaHpiResetActionT) __attribute__ ((weak, alias("sim_set_reset_state"))); openhpi-2.14.1/plugins/simulator/sim_watchdog.c0000644000076400007640000002201711302566612016511 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005, 2006 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * W. David Ashley * Renier Morales */ #include static SaErrorT new_watchdog(struct oh_handler_state *state, struct oh_event *e, struct sim_watchdog *mywatchdog) { SaHpiRdrT *rdr = NULL; struct simWatchdogInfo *info = NULL; SaErrorT error = SA_OK; rdr = (SaHpiRdrT *)g_malloc0(sizeof(SaHpiRdrT)); // set up rdr rdr->RdrType = SAHPI_WATCHDOG_RDR; memcpy(&rdr->RdrTypeUnion.WatchdogRec, &mywatchdog->watchdogrec, sizeof(SaHpiWatchdogRecT)); oh_init_textbuffer(&rdr->IdString); oh_append_textbuffer(&rdr->IdString, mywatchdog->comment); // get the RptEntry rdr->Entity = e->resource.ResourceEntity; // set up our private info info = (struct simWatchdogInfo *)g_malloc0(sizeof(struct simWatchdogInfo)); memcpy(&info->watchdog,&mywatchdog->wd, sizeof(SaHpiWatchdogT)); /* everything ready so inject the rdr */ error = sim_inject_rdr(state, e, rdr, info); if (error) { g_free(rdr); g_free(info); } return error; } SaErrorT sim_discover_chassis_watchdogs(struct oh_handler_state *state, struct oh_event *e) { SaErrorT rc; int i = 0; int j = 0; while (sim_chassis_watchdogs[i].watchdogrec.WatchdogNum != 0) { rc = new_watchdog(state, e, &sim_chassis_watchdogs[i]); if (rc) { err("Error %d returned when adding chassis watchdog", rc); } else { j++; } i++; } dbg("%d of %d chassis watchdogs injected", j, i); return 0; } SaErrorT sim_discover_cpu_watchdogs(struct oh_handler_state *state, struct oh_event *e) { SaErrorT rc; int i = 0; int j = 0; while (sim_cpu_watchdogs[i].watchdogrec.WatchdogNum != 0) { rc = new_watchdog(state, e, &sim_cpu_watchdogs[i]); if (rc) { err("Error %d returned when adding cpu watchdog", rc); } else { j++; } i++; } dbg("%d of %d cpu watchdogs injected", j, i); return 0; } SaErrorT sim_discover_dasd_watchdogs(struct oh_handler_state *state, struct oh_event *e) { SaErrorT rc; int i = 0; int j = 0; while (sim_dasd_watchdogs[i].watchdogrec.WatchdogNum != 0) { rc = new_watchdog(state, e, &sim_dasd_watchdogs[i]); if (rc) { err("Error %d returned when adding dasd watchdog", rc); } else { j++; } i++; } dbg("%d of %d dasd watchdogs injected", j, i); return 0; } SaErrorT sim_discover_hs_dasd_watchdogs(struct oh_handler_state *state, struct oh_event *e) { SaErrorT rc; int i = 0; int j = 0; while (sim_hs_dasd_watchdogs[i].watchdogrec.WatchdogNum != 0) { rc = new_watchdog(state, e, &sim_hs_dasd_watchdogs[i]); if (rc) { err("Error %d returned when adding hs dasd watchdog", rc); } else { j++; } i++; } dbg("%d of %d hs dasd watchdogs injected", j, i); return 0; } SaErrorT sim_discover_fan_watchdogs(struct oh_handler_state *state, struct oh_event *e) { SaErrorT rc; int i = 0; int j = 0; while (sim_fan_watchdogs[i].watchdogrec.WatchdogNum != 0) { rc = new_watchdog(state, e, &sim_fan_watchdogs[i]); if (rc) { err("Error %d returned when adding fan watchdog", rc); } else { j++; } i++; } dbg("%d of %d fan watchdogs injected", j, i); return 0; } SaErrorT sim_get_watchdog_info(void *hnd, SaHpiResourceIdT rid, SaHpiWatchdogNumT num, SaHpiWatchdogT *wdt) { struct simWatchdogInfo *info; if (!hnd) { err("Invalid parameter."); return SA_ERR_HPI_INVALID_PARAMS; } struct oh_handler_state *state = (struct oh_handler_state *)hnd; /* Check if resource exists and has managed hotswap capabilities */ SaHpiRptEntryT *rpt = oh_get_resource_by_id(state->rptcache, rid); if (!rpt) { return SA_ERR_HPI_INVALID_RESOURCE; } if (!(rpt->ResourceCapabilities & SAHPI_CAPABILITY_WATCHDOG)) { return SA_ERR_HPI_CAPABILITY; } /* get our private info */ SaHpiRdrT *rdr = oh_get_rdr_by_type(state->rptcache, rid, SAHPI_WATCHDOG_RDR, num); if (rdr == NULL) return SA_ERR_HPI_NOT_PRESENT; info = (struct simWatchdogInfo *)oh_get_rdr_data(state->rptcache, rid, rdr->RecordId); if (info == NULL) { err("No watchdog data. Watchdog=%s", rdr->IdString.Data); return SA_ERR_HPI_NOT_PRESENT; } memcpy(wdt, &info->watchdog, sizeof(SaHpiWatchdogT)); return SA_OK; } SaErrorT sim_set_watchdog_info(void *hnd, SaHpiResourceIdT rid, SaHpiWatchdogNumT num, SaHpiWatchdogT *wdt) { struct simWatchdogInfo *info; if (!hnd) { err("Invalid parameter."); return SA_ERR_HPI_INVALID_PARAMS; } struct oh_handler_state *state = (struct oh_handler_state *)hnd; /* Check if resource exists and has managed hotswap capabilities */ SaHpiRptEntryT *rpt = oh_get_resource_by_id(state->rptcache, rid); if (!rpt) { return SA_ERR_HPI_INVALID_RESOURCE; } if (!(rpt->ResourceCapabilities & SAHPI_CAPABILITY_WATCHDOG)) { return SA_ERR_HPI_CAPABILITY; } /* get our private info */ SaHpiRdrT *rdr = oh_get_rdr_by_type(state->rptcache, rid, SAHPI_WATCHDOG_RDR, num); if (rdr == NULL) return SA_ERR_HPI_NOT_PRESENT; info = (struct simWatchdogInfo *)oh_get_rdr_data(state->rptcache, rid, rdr->RecordId); if (info == NULL) { err("No watchdog data. Watchdog=%s", rdr->IdString.Data); return SA_ERR_HPI_NOT_PRESENT; } memcpy(&info->watchdog, wdt, sizeof(SaHpiWatchdogT)); return SA_OK; } SaErrorT sim_reset_watchdog(void *hnd, SaHpiResourceIdT rid, SaHpiWatchdogNumT num) { SaHpiRdrT *rdr; if (!hnd) { err("Invalid parameter."); return SA_ERR_HPI_INVALID_PARAMS; } struct oh_handler_state *state = (struct oh_handler_state *)hnd; /* Check if resource exists and has managed hotswap capabilities */ SaHpiRptEntryT *rpt = oh_get_resource_by_id(state->rptcache, rid); if (!rpt) { return SA_ERR_HPI_INVALID_RESOURCE; } if (!(rpt->ResourceCapabilities & SAHPI_CAPABILITY_WATCHDOG)) { return SA_ERR_HPI_CAPABILITY; } rdr = oh_get_rdr_by_type(state->rptcache, rid, SAHPI_WATCHDOG_RDR, num); if (rdr == NULL) return SA_ERR_HPI_NOT_PRESENT; // since no timer is actually running we can just do nothing here return SA_OK; } void * oh_get_watchdog_info (void *, SaHpiResourceIdT, SaHpiWatchdogNumT, SaHpiWatchdogT *) __attribute__ ((weak, alias("sim_get_watchdog_info"))); void * oh_set_watchdog_info (void *, SaHpiResourceIdT, SaHpiWatchdogNumT, SaHpiWatchdogT *) __attribute__ ((weak, alias("sim_set_watchdog_info"))); void * oh_reset_watchdog (void *, SaHpiResourceIdT, SaHpiWatchdogNumT) __attribute__ ((weak, alias("sim_reset_watchdog"))); openhpi-2.14.1/plugins/simulator/sim_init.c0000644000076400007640000002325711302566612015663 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005, 2006 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * Christina Hernandez * W. David Ashley * Renier Morales */ #include /* This list maintains a list of all handler state structs. It is used by to determine the name of a handler so that the pointer to the handler state can be returned to an injector API. */ GSList *sim_handler_states = NULL; void *sim_open(GHashTable *handler_config, unsigned int hid, oh_evt_queue *eventq) { struct oh_handler_state *state = NULL; char *tok = NULL; if (!handler_config) { err("GHashTable *handler_config is NULL!"); return NULL; } else if (!hid) { err("Bad handler id passed."); return NULL; } else if (!eventq) { err("No event queue was passed."); return NULL; } /* check for required hash table entries */ tok = g_hash_table_lookup(handler_config, "entity_root"); if (!tok) { err("entity_root is needed and not present in conf"); return NULL; } state = g_malloc0(sizeof(struct oh_handler_state)); if (!state) { err("out of memory"); return NULL; } /* initialize rpt hashtable pointer */ state->rptcache = (RPTable *)g_malloc0(sizeof(RPTable)); oh_init_rpt(state->rptcache); /* initialize the event log */ state->elcache = oh_el_create(256); if (!state->elcache) { err("Event log creation failed"); g_free(state->rptcache); g_free(state); return NULL; } /* save the handler config hash table, it holds */ /* the openhpi.conf file config info */ state->config = handler_config; /* Store reference to event queue */ state->eventq = eventq; /* Store id of this handler */ state->hid = hid; /* save the handler state to our list */ sim_handler_states = g_slist_append(sim_handler_states, state); return (void *)state; } SaErrorT sim_discover(void *hnd) { /* NOTE!!!!!!!!!!!!!!!!!!!!!!!!!!!! Since the simulator uses the full managed hot swap model and we do not have any latency issues, discovery only needs to be performed one time for each handler instance. Subsequent calls should just return SA_OK for that instance. */ struct oh_handler_state *inst = (struct oh_handler_state *)hnd; int i; struct oh_event *e = NULL; SaErrorT error = SA_OK; /* We use the inst->data variable to store the initial discovery state for an instance of the handler. */ if (inst->data) { return SA_OK; } /* --------------------------------------------------------------- The following assumes that the resource array is in a specific order. Changing this order means changing some of this code. ------------------------------------------------------------ */ /* discover chassis resources and RDRs */ i = SIM_RPT_ENTRY_CHASSIS - 1; error = sim_inject_resource(inst, &sim_rpt_array[i], NULL, &e); if (!error) { sim_discover_chassis_sensors(inst, e); sim_discover_chassis_controls(inst, e); sim_discover_chassis_annunciators(inst, e); sim_discover_chassis_watchdogs(inst, e); sim_discover_chassis_inventory(inst, e); sim_discover_chassis_dimis(inst,e); sim_discover_chassis_fumis(inst,e); sim_inject_event(inst, e); e = NULL; } else err("Error discovering chassis"); /* discover cpu resources and RDRs */ i = SIM_RPT_ENTRY_CPU - 1; error = sim_inject_resource(inst, &sim_rpt_array[i], NULL, &e); if (!error) { sim_discover_cpu_sensors(inst, e); sim_discover_cpu_controls(inst, e); sim_discover_cpu_annunciators(inst, e); sim_discover_cpu_watchdogs(inst, e); sim_discover_cpu_inventory(inst, e); sim_inject_event(inst, e); e = NULL; } else err("Error discovering CPU"); /* discover dasd resources and RDRs */ i = SIM_RPT_ENTRY_DASD - 1; error = sim_inject_resource(inst, &sim_rpt_array[i], NULL, &e); if (!error) { sim_discover_dasd_sensors(inst, e); sim_discover_dasd_controls(inst, e); sim_discover_dasd_annunciators(inst, e); sim_discover_dasd_watchdogs(inst, e); sim_discover_dasd_inventory(inst, e); sim_inject_event(inst, e); e = NULL; } else err("Error discovering DASD"); /* discover hot swap dasd resources and RDRs */ i = SIM_RPT_ENTRY_HS_DASD - 1; error = sim_inject_resource(inst, &sim_rpt_array[i], NULL, &e); if (!error) { sim_discover_hs_dasd_sensors(inst, e); sim_discover_hs_dasd_controls(inst, e); sim_discover_hs_dasd_annunciators(inst, e); sim_discover_hs_dasd_watchdogs(inst, e); sim_discover_hs_dasd_inventory(inst, e); sim_inject_event(inst, e); e = NULL; } else err("Error discovering HS DASD"); /* discover fan resources and RDRs */ i = SIM_RPT_ENTRY_FAN - 1; error = sim_inject_resource(inst, &sim_rpt_array[i], NULL, &e); if (!error) { sim_discover_fan_sensors(inst, e); sim_discover_fan_controls(inst, e); sim_discover_fan_annunciators(inst, e); sim_discover_fan_watchdogs(inst, e); sim_discover_fan_inventory(inst, e); sim_inject_event(inst, e); e = NULL; } else err("Error discovering FAN"); /* Let subsequent discovery invocations know that discovery has already been performed. */ inst->data = (void *)1; return SA_OK; } /* * Return values: * 1 - events to be processed. * SA_OK - No events to be processed. * SA_ERR_HPI_INVALID_PARAMS - @hnd is NULL. */ SaErrorT sim_get_event(void *hnd) { if (!hnd) return SA_ERR_HPI_INVALID_PARAMS; return SA_OK; } SaErrorT sim_close(void *hnd) { struct oh_handler_state *state = hnd; /* TODO: we may need to do more here than just this! */ // g_free(state->rptcache); g_free(state); return 0; } SaErrorT sim_set_resource_tag(void *hnd, SaHpiResourceIdT id, SaHpiTextBufferT *tag) { struct oh_handler_state *inst = hnd; SaHpiRptEntryT *resource = NULL; if (!tag) return SA_ERR_HPI_INVALID_PARAMS; resource = oh_get_resource_by_id(inst->rptcache, id); if (!resource) { return SA_ERR_HPI_NOT_PRESENT; } memcpy(&resource->ResourceTag, tag, sizeof(SaHpiTextBufferT)); return SA_OK; } SaErrorT sim_set_resource_severity(void *hnd, SaHpiResourceIdT rid, SaHpiSeverityT sev) { struct oh_handler_state *h = hnd; SaHpiRptEntryT *resource = NULL; resource = oh_get_resource_by_id(h->rptcache, rid); if (!resource) { return SA_ERR_HPI_NOT_PRESENT; } resource->ResourceSeverity = sev; return SA_OK; } SaErrorT sim_resource_failed_remove(void *hnd, SaHpiResourceIdT rid) { struct oh_handler_state *h; SaHpiRptEntryT *resource = NULL; struct oh_event e; SaHpiHsStateT hsstate = SAHPI_HS_STATE_ACTIVE; SaErrorT rv; if (hnd == NULL) { err("Invalid parameter"); return SA_ERR_HPI_INVALID_PARAMS; } h = (struct oh_handler_state *) hnd; resource = oh_get_resource_by_id(h->rptcache, rid); if (resource == NULL) { err("Failed to get the RPT entry"); return SA_ERR_HPI_NOT_PRESENT; } if (resource->ResourceCapabilities & SAHPI_CAPABILITY_MANAGED_HOTSWAP) { rv = sim_get_hotswap_state(hnd, rid, &hsstate); if (rv != SA_OK) { err("Failed to get the hotswap state"); return rv; } } /* Raise the resource removal hotswap event */ memset(&e, 0, sizeof(struct oh_event)); e.hid = h->hid; e.resource = *resource; e.rdrs = NULL; e.event.Source = rid; e.event.Severity = resource->ResourceSeverity; oh_gettimeofday(&e.event.Timestamp); e.event.EventType = SAHPI_ET_HOTSWAP; e.event.EventDataUnion.HotSwapEvent.PreviousHotSwapState = hsstate; e.event.EventDataUnion.HotSwapEvent.HotSwapState = SAHPI_HS_STATE_NOT_PRESENT; e.event.EventDataUnion.HotSwapEvent.CauseOfStateChange = SAHPI_HS_CAUSE_USER_UPDATE; oh_evt_queue_push(h->eventq, oh_dup_event(&e)); /* Remove the failed resource from plugin rptcache */ rv = oh_remove_resource(h->rptcache, rid); if (rv != SA_OK) { err("Resource removal from RPTable failed"); return rv; } return SA_OK; } /* * Simulator plugin interface * */ void * oh_open (GHashTable *, unsigned int, oh_evt_queue *) __attribute__ ((weak, alias("sim_open"))); void * oh_close (void *) __attribute__ ((weak, alias("sim_close"))); void * oh_get_event (void *) __attribute__ ((weak, alias("sim_get_event"))); void * oh_discover_resources (void *) __attribute__ ((weak, alias("sim_discover"))); void * oh_set_resource_tag (void *, SaHpiResourceIdT, SaHpiTextBufferT *) __attribute__ ((weak, alias("sim_set_resource_tag"))); void * oh_set_resource_severity (void *, SaHpiResourceIdT, SaHpiSeverityT) __attribute__ ((weak, alias("sim_set_resource_severity"))); void * oh_resource_failed_remove (void *, SaHpiResourceIdT) __attribute__ ((weak, alias("sim_resource_failed_remove"))); openhpi-2.14.1/plugins/simulator/sim_injector.c0000644000076400007640000002356611302566612016540 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005, 2006 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * W. David Ashley * Renier Morales * */ #include #include #include #include #include static SaErrorT sim_create_resourcetag(SaHpiTextBufferT *buffer, const char *str, SaHpiEntityLocationT loc) { char *locstr; SaErrorT err = SA_OK; SaHpiTextBufferT working; if (!buffer || loc < SIM_HPI_LOCATION_BASE || loc > (pow(10, OH_MAX_LOCATION_DIGITS) - 1)) { return(SA_ERR_HPI_INVALID_PARAMS); } err = oh_init_textbuffer(&working); if (err) { return(err); } locstr = (gchar *)g_malloc0(OH_MAX_LOCATION_DIGITS + 1); snprintf(locstr, OH_MAX_LOCATION_DIGITS + 1, " %d", loc); if (str) { oh_append_textbuffer(&working, str); } err = oh_append_textbuffer(&working, locstr); if (!err) { err = oh_copy_textbuffer(buffer, &working); } g_free(locstr); return(err); } /* return a handler state pointer by looking for its handler_name */ struct oh_handler_state *sim_get_handler_by_name(char *name) { struct oh_handler_state *state = NULL; int i = 0; char *handler_name; state = (struct oh_handler_state *)g_slist_nth_data(sim_handler_states, i); while (state != NULL) { handler_name = (char *)g_hash_table_lookup(state->config, "name"); if (strcmp(handler_name, name) == 0) { return state; } i++; state = (struct oh_handler_state *)g_slist_nth_data(sim_handler_states, i); } return NULL; } /* Sets entitypath based on entity_root, and assigns ResourceId */ static void setup_rpte(struct oh_handler_state *state, SaHpiRptEntryT *rpte) { SaHpiEntityPathT root_ep; char *entity_root = NULL; if (!state || !rpte) return; entity_root = (char *)g_hash_table_lookup(state->config,"entity_root"); oh_encode_entitypath (entity_root, &root_ep); /* set up the rpt entry */ oh_concat_ep(&rpte->ResourceEntity, &root_ep); rpte->ResourceId = oh_uid_from_entity_path(&rpte->ResourceEntity); } /* inject a resource */ // assumptions about the input SaHpiRptEntryT *data entry // - all fields are assumed to have valid values except // o EntryId (filled in by oh_add_resource function) // o ResourceId // o ResourceEntity (assumed to have only partial data) SaErrorT sim_inject_resource(struct oh_handler_state *state, struct sim_rpt *rpt_tmpl, void *data, struct oh_event **ohe) { struct oh_event *e = NULL; struct simResourceInfo *privinfo = NULL; SaErrorT rc = SA_OK; /* check arguments */ if (state == NULL || rpt_tmpl == NULL || ohe == NULL) { return SA_ERR_HPI_INVALID_PARAMS; } /* set up the rpt entry */ e = g_malloc0(sizeof(struct oh_event)); e->resource = rpt_tmpl->rpt; setup_rpte(state, &e->resource); sim_create_resourcetag(&e->resource.ResourceTag, rpt_tmpl->comment, e->resource.ResourceEntity.Entry[0].EntityLocation); /* set up our private data store for resource state info */ if (!data) { privinfo = (struct simResourceInfo *)g_malloc0(sizeof(struct simResourceInfo)); if (e->resource.ResourceCapabilities & SAHPI_CAPABILITY_MANAGED_HOTSWAP) { privinfo->cur_hsstate = SAHPI_HS_STATE_ACTIVE; privinfo->cur_indicator_hsstate = SAHPI_HS_INDICATOR_ON; } if (e->resource.ResourceCapabilities & SAHPI_CAPABILITY_POWER) { privinfo->cur_powerstate = SAHPI_POWER_ON; } if (e->resource.ResourceCapabilities & SAHPI_CAPABILITY_MANAGED_HOTSWAP) { privinfo->ae_timeout = SAHPI_TIMEOUT_IMMEDIATE; } data = (void *)privinfo; } /* perform the injection */ dbg("Injecting ResourceId %d", e->resource.ResourceId); rc = oh_add_resource(state->rptcache, &e->resource, data, FREE_RPT_DATA); if (rc) { err("Error %s injecting ResourceId %d", oh_lookup_error(rc), e->resource.ResourceId); g_free(e); return rc; } /* now add an event for the resource add */ e->event.Source = e->resource.ResourceId; oh_gettimeofday(&e->event.Timestamp); e->event.Severity = e->resource.ResourceSeverity; if (e->resource.ResourceCapabilities & SAHPI_CAPABILITY_FRU) { e->event.EventType = SAHPI_ET_HOTSWAP; e->event.EventDataUnion.HotSwapEvent.HotSwapState = SAHPI_HS_STATE_ACTIVE; e->event.EventDataUnion.HotSwapEvent.PreviousHotSwapState = SAHPI_HS_STATE_ACTIVE; } else { e->event.EventType = SAHPI_ET_RESOURCE; e->event.EventDataUnion.ResourceEvent.ResourceEventType = SAHPI_RESE_RESOURCE_ADDED; } *ohe = e; return SA_OK; } /* inject an rdr */ // assumptions about the input SaHpiRdrT *data entry // - all fields are assumed to have valid values // - no checking of the data is performed // assuptions about the input *privdata entry // - no checking of the data is performed SaErrorT sim_inject_rdr(struct oh_handler_state *state, struct oh_event *ohe, SaHpiRdrT *rdr, void *data) { SaErrorT rc; SaHpiResourceIdT rid; /* check arguments */ if (state == NULL || ohe == NULL || rdr == NULL) { return SA_ERR_HPI_INVALID_PARAMS; } rid = ohe->resource.ResourceId; /* perform the injection */ dbg("Injecting rdr for ResourceId %d", rid); rc = oh_add_rdr(state->rptcache, rid, rdr, data, 0); if (rc) { err("Error %s injecting rdr for ResourceId %d", oh_lookup_error(rc), rid); return rc; } /* now add rdr to event */ ohe->rdrs = g_slist_append(ohe->rdrs, (void *)rdr); return SA_OK; } /* inject an event */ // assumptions about the input oh_event *data entry // - all fields are assumed to have valid values // - no checking of the data is performed SaErrorT sim_inject_event(struct oh_handler_state *state, struct oh_event *ohe) { /* check arguments */ if (state == NULL || ohe == NULL) { return SA_ERR_HPI_INVALID_PARAMS; } /* perform the injection */ dbg("Injecting event"); ohe->hid = state->hid; oh_evt_queue_push(state->eventq, ohe); return SA_OK; } SaErrorT sim_inject_ext_event(void *hnd, SaHpiEventT *event, SaHpiRptEntryT *rpte, SaHpiRdrT *rdre) { struct oh_handler_state *state = hnd; GSList *node = NULL; GSList *rdrs = NULL; struct oh_event e; /* * Nums assigned through this call start at 1000. * This assumes that no amount of RDRs within a * specific type defined elsewhere in this plugin will * be greater than 999. This, of course, is not an ideal * solution here, but it suffices for now. */ static unsigned int ctrl_num = 1000; static unsigned int sensor_num = 1000; static unsigned int inv_num = 1000; static unsigned int watchdog_num = 1000; static unsigned int ann_num = 1000; if (!hnd || !event || !rpte || !rdre) return SA_ERR_HPI_INVALID_PARAMS; dbg("Injecting external event"); memset(&e, 0, sizeof(struct oh_event)); if (rpte) { setup_rpte(state, rpte); event->Source = rpte->ResourceId; } else { event->Source = SAHPI_UNSPECIFIED_RESOURCE_ID; } rdrs = g_slist_append(rdrs, rdre); for (node = rdrs; node; node = node->next) { SaHpiRdrT *rdr = (SaHpiRdrT *)node->data; switch (rdr->RdrType) { case SAHPI_CTRL_RDR: rdr->RdrTypeUnion.CtrlRec.Num = ctrl_num++; rdr->RecordId = oh_get_rdr_uid(rdr->RdrType, rdr->RdrTypeUnion.CtrlRec.Num); break; case SAHPI_SENSOR_RDR: rdr->RdrTypeUnion.SensorRec.Num = sensor_num++; rdr->RecordId = oh_get_rdr_uid(rdr->RdrType, rdr->RdrTypeUnion.SensorRec.Num); break; case SAHPI_INVENTORY_RDR: rdr->RdrTypeUnion.InventoryRec.IdrId = inv_num++; rdr->RecordId = oh_get_rdr_uid(rdr->RdrType, rdr->RdrTypeUnion.InventoryRec.IdrId); break; case SAHPI_WATCHDOG_RDR: rdr->RdrTypeUnion.WatchdogRec.WatchdogNum = watchdog_num++; rdr->RecordId = oh_get_rdr_uid(rdr->RdrType, rdr->RdrTypeUnion.WatchdogRec.WatchdogNum); break; case SAHPI_ANNUNCIATOR_RDR: rdr->RdrTypeUnion.AnnunciatorRec.AnnunciatorNum = ann_num++; rdr->RecordId = oh_get_rdr_uid(rdr->RdrType, rdr->RdrTypeUnion.AnnunciatorRec.AnnunciatorNum); break; default: err("Invalid record type"); return SA_ERR_HPI_INVALID_PARAMS; } if (rpte) { rdr->Entity = rpte->ResourceEntity; } } e.event = *event; if (rpte) e.resource = *rpte; e.rdrs = rdrs; e.hid = state->hid; oh_evt_queue_push(state->eventq, oh_dup_event(&e)); return SA_OK; } void * oh_inject_event (void *, SaHpiEventT *, SaHpiRptEntryT *, SaHpiRdrT *) __attribute__ ((weak, alias("sim_inject_ext_event"))); openhpi-2.14.1/plugins/simulator/sim_sensor_func.h0000644000076400007640000000436011302566612017243 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * W. David Ashley */ #ifndef SIM_SENSOR_FUNC_H #define SIM_SENSOR_FUNC_H SaErrorT sim_get_sensor_reading(void *hnd, SaHpiResourceIdT id, SaHpiSensorNumT num, SaHpiSensorReadingT *data, SaHpiEventStateT *state); SaErrorT sim_get_sensor_thresholds(void *hnd, SaHpiResourceIdT rid, SaHpiSensorNumT sid, SaHpiSensorThresholdsT *thres); SaErrorT sim_set_sensor_thresholds(void *hnd, SaHpiResourceIdT rid, SaHpiSensorNumT sid, const SaHpiSensorThresholdsT *thres); SaErrorT sim_get_sensor_enable(void *hnd, SaHpiResourceIdT rid, SaHpiSensorNumT sid, SaHpiBoolT *enable); SaErrorT sim_set_sensor_enable(void *hnd, SaHpiResourceIdT rid, SaHpiSensorNumT sid, const SaHpiBoolT enable); SaErrorT sim_get_sensor_event_enable(void *hnd, SaHpiResourceIdT rid, SaHpiSensorNumT sid, SaHpiBoolT *enable); SaErrorT sim_set_sensor_event_enable(void *hnd, SaHpiResourceIdT rid, SaHpiSensorNumT sid, const SaHpiBoolT enable); SaErrorT sim_get_sensor_event_masks(void *hnd, SaHpiResourceIdT rid, SaHpiSensorNumT sid, SaHpiEventStateT *AssertEventMask, SaHpiEventStateT *DeassertEventMask); SaErrorT sim_set_sensor_event_masks(void *hnd, SaHpiResourceIdT rid, SaHpiSensorNumT sid, SaHpiSensorEventMaskActionT act, const SaHpiEventStateT AssertEventMask, const SaHpiEventStateT DeassertEventMask); SaErrorT sim_get_sensor_eventstate(void *hnd, SaHpiResourceIdT rid, SaHpiSensorNumT sid, SaHpiSensorReadingT *reading, SaHpiEventStateT *state); SaErrorT sim_set_threshold_reading(void *hnd, SaHpiResourceIdT rid, SaHpiSensorNumT sid, const SaHpiSensorReadingT *reading); #endif openhpi-2.14.1/plugins/simulator/sim_injector.h0000644000076400007640000000241611302566612016534 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005, 2006 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * W. David Ashley * Renier Morales * */ #ifndef __SIM_INJECTOR_H #define __SIM_INJECTOR_H #include #include struct oh_handler_state *sim_get_handler_by_name(char *name); SaErrorT sim_inject_resource(struct oh_handler_state *state, struct sim_rpt *rpt_tmpl, void *data, struct oh_event **ohe); SaErrorT sim_inject_rdr(struct oh_handler_state *state, struct oh_event *ohe, SaHpiRdrT *rdr, void *data); SaErrorT sim_inject_event(struct oh_handler_state *state, struct oh_event *ohe); SaErrorT sim_inject_ext_event(void *hnd, SaHpiEventT *event, SaHpiRptEntryT *rpte, SaHpiRdrT *rdr); #endif /*__SIM_INJECTOR_H*/ openhpi-2.14.1/plugins/simulator/sim_power.c0000644000076400007640000000447511302566612016055 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * W. David Ashley */ #include SaErrorT sim_get_power_state(void *hnd, SaHpiResourceIdT rid, SaHpiPowerStateT *pwrstate) { if (!hnd || !pwrstate) { err("Invalid parameter"); return SA_ERR_HPI_INVALID_PARAMS; } struct oh_handler_state *state = (struct oh_handler_state *)hnd; /* Check if resource exists and has power capabilities */ SaHpiRptEntryT *rpt = oh_get_resource_by_id(state->rptcache, rid); if (!rpt) { return SA_ERR_HPI_INVALID_RESOURCE; } if (!(rpt->ResourceCapabilities & SAHPI_CAPABILITY_POWER)) { return SA_ERR_HPI_CAPABILITY; } struct simResourceInfo *sim_rinfo = oh_get_resource_data(state->rptcache, rid); if (!sim_rinfo) return SA_ERR_HPI_NOT_PRESENT; *pwrstate = sim_rinfo->cur_powerstate; return SA_OK; } SaErrorT sim_set_power_state(void *hnd, SaHpiResourceIdT rid, SaHpiPowerStateT pwrstate) { if (!hnd || NULL == oh_lookup_powerstate(pwrstate)) { err("Invalid parameter."); return SA_ERR_HPI_INVALID_PARAMS; } struct oh_handler_state *state = (struct oh_handler_state *)hnd; /* Check if resource exists and has power capabilities */ SaHpiRptEntryT *rpt = oh_get_resource_by_id(state->rptcache, rid); if (!rpt) { return SA_ERR_HPI_INVALID_RESOURCE; } if (!(rpt->ResourceCapabilities & SAHPI_CAPABILITY_POWER)) { return SA_ERR_HPI_CAPABILITY; } struct simResourceInfo *sim_rinfo = oh_get_resource_data(state->rptcache, rid); if (!sim_rinfo) return SA_ERR_HPI_NOT_PRESENT; sim_rinfo->cur_powerstate = pwrstate; return SA_OK; } void * oh_get_power_state (void *, SaHpiResourceIdT, SaHpiPowerStateT *) __attribute__ ((weak, alias("sim_get_power_state"))); void * oh_set_power_state (void *, SaHpiResourceIdT, SaHpiPowerStateT) __attribute__ ((weak, alias("sim_set_power_state"))); openhpi-2.14.1/plugins/simulator/sim_el.h0000644000076400007640000000275711302566612015327 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005,2006, 2007, 2008 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * W. David Ashley * Suntrupth S Yadav */ SaErrorT sim_el_get_info(void *hnd, SaHpiResourceIdT id, SaHpiEventLogInfoT *info); SaErrorT sim_el_set_state(void *hnd, SaHpiResourceIdT id, SaHpiBoolT state); SaErrorT sim_el_get_state(void *hnd, SaHpiResourceIdT id, SaHpiBoolT *state); SaErrorT sim_el_set_time(void *hnd, SaHpiResourceIdT id, SaHpiTimeT time); SaErrorT sim_el_add_entry(void *hnd, SaHpiResourceIdT id, const SaHpiEventT *Event); SaErrorT sim_el_get_entry(void *hnd, SaHpiResourceIdT id, SaHpiEventLogEntryIdT current, SaHpiEventLogEntryIdT *prev, SaHpiEventLogEntryIdT *next, SaHpiEventLogEntryT *entry, SaHpiRdrT *rdr, SaHpiRptEntryT *rptentry); SaErrorT sim_el_clear(void *hnd, SaHpiResourceIdT id); SaErrorT sim_el_overflow(void *hnd, SaHpiResourceIdT id); SaErrorT sim_el_get_caps(void *hnd, SaHpiResourceIdT id, SaHpiEventLogCapabilitiesT *caps); openhpi-2.14.1/plugins/simulator/sim_annunciators.h0000755000076400007640000000370411302566612017427 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005, 2006 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * Christina Hernandez * W. David Ashley * Renier Morales */ #ifndef __SIM_ANNUNCIATORS_H #define __SIM_ANNUNCIATORS_H /******************* Annunciator Definitions *********************/ #define ANNOUN_MAX 5 struct simAnnunciatorInfo { SaHpiAnnunciatorModeT mode; oh_announcement *announs; }; struct sim_annunciator { int index; SaHpiAnnunciatorRecT annun; SaHpiAnnouncementT announs[ANNOUN_MAX + 1]; const char *comment; }; extern struct sim_annunciator sim_chassis_annunciators[]; extern struct sim_annunciator sim_cpu_annunciators[]; extern struct sim_annunciator sim_dasd_annunciators[]; extern struct sim_annunciator sim_hs_dasd_annunciators[]; extern struct sim_annunciator sim_fan_annunciators[]; SaErrorT sim_discover_chassis_annunciators(struct oh_handler_state *state, struct oh_event *e); SaErrorT sim_discover_cpu_annunciators(struct oh_handler_state *state, struct oh_event *e); SaErrorT sim_discover_dasd_annunciators(struct oh_handler_state *state, struct oh_event *e); SaErrorT sim_discover_hs_dasd_annunciators(struct oh_handler_state *state, struct oh_event *e); SaErrorT sim_discover_fan_annunciators(struct oh_handler_state *state, struct oh_event *e); #endif openhpi-2.14.1/plugins/simulator/sim_fumi.h0000644000076400007640000000167611302566612015666 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2008 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Suntrupth S Yadav */ #ifndef __SIM_FUMI_H #define __SIM_FUMI_H struct sim_fumi_info { SaHpiFumiSourceInfoT srcinfo; SaHpiFumiBankInfoT info; }; struct sim_fumi { SaHpiFumiRecT fumirec; SaHpiFumiSourceInfoT srcinfo; SaHpiFumiBankInfoT info; const char *comment; }; extern struct sim_fumi sim_chassis_fumis[]; SaErrorT sim_discover_chassis_fumis(struct oh_handler_state *state, struct oh_event *e); #endif openhpi-2.14.1/plugins/rtas/0000755000076400007640000000000011405006365012623 5ustar openhpi-2.14.1/plugins/rtas/rtas_watchdog.c0000644000076400007640000000335711302567000015622 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * Renier Morales * Daniel de Araujo */ #include SaErrorT rtas_get_watchdog_info(void *hnd, SaHpiResourceIdT id, SaHpiWatchdogNumT num, SaHpiWatchdogT *wdt) { return SA_ERR_HPI_INTERNAL_ERROR; } SaErrorT rtas_set_watchdog_info(void *hnd, SaHpiResourceIdT id, SaHpiWatchdogNumT num, SaHpiWatchdogT *wdt) { return SA_ERR_HPI_INTERNAL_ERROR; } SaErrorT rtas_reset_watchdog(void *hnd, SaHpiResourceIdT id, SaHpiWatchdogNumT num) { return SA_ERR_HPI_INTERNAL_ERROR; } void * oh_get_watchdog_info (void *, SaHpiResourceIdT, SaHpiWatchdogNumT, SaHpiWatchdogT *) __attribute__ ((weak, alias("rtas_get_watchdog_info"))); void * oh_set_watchdog_info (void *, SaHpiResourceIdT, SaHpiWatchdogNumT, SaHpiWatchdogT *) __attribute__ ((weak, alias("rtas_set_watchdog_info"))); void * oh_reset_watchdog (void *, SaHpiResourceIdT, SaHpiWatchdogNumT) __attribute__ ((weak, alias("rtas_reset_watchdog"))); openhpi-2.14.1/plugins/rtas/rtas_eventlog.c0000644000076400007640000000747511302567000015652 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * Renier Morales * Daniel de Araujo */ #include SaErrorT rtas_get_el_info(void *hnd, SaHpiResourceIdT id, SaHpiEventLogInfoT *info) { return SA_ERR_HPI_INTERNAL_ERROR; } SaErrorT rtas_set_el_time(void *hnd, SaHpiResourceIdT id, SaHpiTimeT time) { return SA_ERR_HPI_INTERNAL_ERROR; } SaErrorT rtas_add_el_entry(void *hnd, SaHpiResourceIdT id, const SaHpiEventT *Event) { return SA_ERR_HPI_INTERNAL_ERROR; } SaErrorT rtas_get_el_entry(void *hnd, SaHpiResourceIdT id, SaHpiEventLogEntryIdT current, SaHpiEventLogEntryIdT *prev, SaHpiEventLogEntryIdT *next, SaHpiEventLogEntryT *entry, SaHpiRdrT *rdr, SaHpiRptEntryT *rptentry) { return SA_ERR_HPI_INTERNAL_ERROR; } SaErrorT rtas_clear_el(void *hnd, SaHpiResourceIdT id) { return SA_ERR_HPI_INTERNAL_ERROR; } SaErrorT rtas_set_el_state(void *hnd, SaHpiResourceIdT id, SaHpiBoolT e) { return SA_ERR_HPI_INTERNAL_ERROR; } SaErrorT rtas_reset_el_overflow(void *hnd, SaHpiResourceIdT id) { return SA_ERR_HPI_INTERNAL_ERROR; } SaErrorT rtas_get_sel_info (void *hnd, SaHpiResourceIdT id, SaHpiEventLogInfoT *evtlog) { return SA_ERR_HPI_INTERNAL_ERROR; } SaErrorT rtas_set_sel_time (void *hnd, SaHpiResourceIdT id, const SaHpiEventT *evt) { return SA_ERR_HPI_INTERNAL_ERROR; } SaErrorT rtas_add_sel_entry (void *hnd, SaHpiResourceIdT id, const SaHpiEventT *evt) { return SA_ERR_HPI_INTERNAL_ERROR; } SaErrorT rtas_get_sel_entry (void *hnd, SaHpiResourceIdT id, SaHpiEventLogEntryIdT current, SaHpiEventLogEntryIdT *prev, SaHpiEventLogEntryIdT *next, SaHpiEventLogEntryT *entry, SaHpiRdrT *rdr, SaHpiRptEntryT *rdtentry) { return SA_ERR_HPI_INTERNAL_ERROR; } void * oh_get_el_info (void *, SaHpiResourceIdT, SaHpiEventLogInfoT *) __attribute__ ((weak, alias("rtas_get_sel_info"))); void * oh_set_el_time (void *, SaHpiResourceIdT, const SaHpiEventT *) __attribute__ ((weak, alias("rtas_set_sel_time"))); void * oh_add_el_entry (void *, SaHpiResourceIdT, const SaHpiEventT *) __attribute__ ((weak, alias("rtas_add_sel_entry"))); void * oh_get_el_entry (void *, SaHpiResourceIdT, SaHpiEventLogEntryIdT, SaHpiEventLogEntryIdT *, SaHpiEventLogEntryIdT *, SaHpiEventLogEntryT *, SaHpiRdrT *, SaHpiRptEntryT *) __attribute__ ((weak, alias("rtas_get_sel_entry"))); void * oh_clear_el (void *, SaHpiResourceIdT) __attribute__ ((weak, alias("rtas_clear_el"))); void * oh_set_el_state (void *, SaHpiResourceIdT) __attribute__ ((weak, alias("rtas_set_el_state"))); void * oh_reset_el_overflow (void *, SaHpiResourceIdT) __attribute__ ((weak, alias("rtas_reset_el_overflow"))); openhpi-2.14.1/plugins/rtas/Makefile.am0000644000076400007640000000244111302567000014652 0ustar # -*- linux-c -*- # # (C) Copyright IBM Corp. 2005 # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This # file and program are licensed under a BSD style license. See # the Copying file included with the OpenHPI distribution for # full licensing terms. # # Author(s): # Renier Morales # MAINTAINERCLEANFILES = Makefile.in INCLUDES = @OPENHPI_INCLUDES@ pkglib_LTLIBRARIES = librtas2hpi.la librtas2hpi_la_SOURCES = rtas.h rtas.c \ rtas_annunciator.h rtas_annunciator.c \ rtas_discover.h rtas_discover.c \ rtas_control.h rtas_control.c \ rtas_event.h rtas_event.c \ rtas_eventlog.h rtas_eventlog.c \ rtas_hotswap.h rtas_hotswap.c \ rtas_indicator.h rtas_indicator.c \ rtas_inventory.h rtas_inventory.c \ rtas_power.h rtas_power.c \ rtas_reset.h rtas_reset.c \ rtas_resource.h rtas_resource.c \ rtas_sensor.h rtas_sensor.c \ rtas_utils.h rtas_utils.c \ rtas_watchdog.h rtas_watchdog.c librtas2hpi_la_LIBADD = -luuid -lrtas -lrtasevent $(top_builddir)/utils/libopenhpiutils.la librtas2hpi_la_LDFLAGS = -module -version-info @HPI_LIB_VERSION@ openhpi-2.14.1/plugins/rtas/rtas_control.h0000644000076400007640000000245611302567000015506 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * Renier Morales * Daniel de Araujo */ #ifndef RTAS_CONTROL_H #define RTAS_CONTROL_H #include #include SaErrorT rtas_get_control_state(void *hnd, SaHpiResourceIdT id, SaHpiCtrlNumT num, SaHpiCtrlModeT *mode, SaHpiCtrlStateT *state); SaErrorT rtas_set_control_state(void *hnd, SaHpiResourceIdT id, SaHpiCtrlNumT num, SaHpiCtrlModeT mode, SaHpiCtrlStateT *state); SaErrorT rtas_control_parm(void *hnd, SaHpiResourceIdT id, SaHpiParmActionT act); #endif openhpi-2.14.1/plugins/rtas/rtas_utils.c0000644000076400007640000000372311302567000015157 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * Renier Morales * Daniel de Araujo */ #include /** * librtas_error * @brief check for a librtas specific return code * * @param error librtas return code * @param buf buffer to write librtas error message to * @param size size of "buffer" */ void decode_rtas_error (int error, char *buf, size_t size, int token, int index) { switch (error) { case -1: snprintf(buf, size, "Hardware error retrieving a sensor: token %04d, " "index %d\n", token, index); break; case -3: snprintf(buf, size,"The sensor at token %04d, index %d is not " "implemented.\n", token, index); break; case RTAS_KERNEL_INT: snprintf(buf, size, "No kernel interface to firmware"); break; case RTAS_KERNEL_IMP: snprintf(buf, size, "No kernel implementation of function"); break; case RTAS_PERM: snprintf(buf, size, "Non-root caller"); break; case RTAS_NO_MEM: snprintf(buf, size, "Out of heap memory"); break; case RTAS_NO_LOWMEM: snprintf(buf, size, "Kernel out of low memory"); break; case RTAS_FREE_ERR: snprintf(buf, size, "Attempt to free nonexistant RMO buffer"); break; case RTAS_TIMEOUT: snprintf(buf, size, "RTAS delay exceeded specified timeout"); break; case RTAS_IO_ASSERT: snprintf(buf, size, "Unexpected I/O error"); break; case RTAS_UNKNOWN_OP: snprintf(buf, size, "No firmware implementation of function"); break; default: snprintf(buf, size, "Unknown librtas error %d", error); } } openhpi-2.14.1/plugins/rtas/rtas_watchdog.h0000644000076400007640000000230111302567000015613 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * Renier Morales * Daniel de Araujo */ #ifndef RTAS_WATCHDOG_H #define RTAS_WATCHDOG_H #include #include SaErrorT rtas_get_watchdog_info(void *hnd, SaHpiResourceIdT id, SaHpiWatchdogNumT num, SaHpiWatchdogT *wdt); SaErrorT rtas_set_watchdog_info(void *hnd, SaHpiResourceIdT id, SaHpiWatchdogNumT num, SaHpiWatchdogT *wdt); SaErrorT rtas_reset_watchdog(void *hnd, SaHpiResourceIdT id, SaHpiWatchdogNumT num); #endif openhpi-2.14.1/plugins/rtas/rtas_eventlog.h0000644000076400007640000000474011302567000015647 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * Renier Morales * Daniel de Araujo */ #ifndef RTAS_EVENTLOG_H #define RTAS_EVENTLOG_H #include #include SaErrorT rtas_get_el_info(void *hnd, SaHpiResourceIdT id, SaHpiEventLogInfoT *info); SaErrorT rtas_set_el_time(void *hnd, SaHpiResourceIdT id, SaHpiTimeT time); SaErrorT rtas_add_el_entry(void *hnd, SaHpiResourceIdT id, const SaHpiEventT *Event); SaErrorT rtas_get_el_entry(void *hnd, SaHpiResourceIdT id, SaHpiEventLogEntryIdT current, SaHpiEventLogEntryIdT *prev, SaHpiEventLogEntryIdT *next, SaHpiEventLogEntryT *entry, SaHpiRdrT *rdr, SaHpiRptEntryT *rptentry); SaErrorT rtas_clear_el(void *hnd, SaHpiResourceIdT id); SaErrorT rtas_set_el_state(void *hnd, SaHpiResourceIdT id, SaHpiBoolT e); SaErrorT rtas_reset_el_overflow(void *hnd, SaHpiResourceIdT id); SaErrorT rtas_get_sel_info (void *hnd, SaHpiResourceIdT id, SaHpiEventLogInfoT *evtlog); SaErrorT rtas_set_sel_time (void *hnd, SaHpiResourceIdT id, const SaHpiEventT *evt); SaErrorT rtas_add_sel_entry (void *hnd, SaHpiResourceIdT id, const SaHpiEventT *evt); SaErrorT rtas_get_sel_entry (void *hnd, SaHpiResourceIdT id, SaHpiEventLogEntryIdT current, SaHpiEventLogEntryIdT *prev, SaHpiEventLogEntryIdT *next, SaHpiEventLogEntryT *entry, SaHpiRdrT *rdr, SaHpiRptEntryT *rdtentry); #endif openhpi-2.14.1/plugins/rtas/rtas_resource.c0000644000076400007640000000561611302567000015651 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * Renier Morales * Daniel de Araujo */ #include #include #include #include #include SaErrorT rtas_set_resource_tag(void *hnd, SaHpiResourceIdT id, SaHpiTextBufferT *tag) { struct oh_handler_state *h = hnd; SaHpiRptEntryT *rptentry = NULL; SaErrorT error = SA_OK; struct oh_event *e = NULL; if (!hnd) return SA_ERR_HPI_INTERNAL_ERROR; rptentry = oh_get_resource_by_id(h->rptcache, id); if (!rptentry) return SA_ERR_HPI_NOT_PRESENT; error = oh_append_textbuffer(&rptentry->ResourceTag, (char *)tag->Data); if (error) return error; e = (struct oh_event *)g_malloc0(sizeof(struct oh_event)); e->hid = h->hid; e->event.EventType = SAHPI_ET_RESOURCE; e->event.Source = rptentry->ResourceId; e->event.Severity = rptentry->ResourceSeverity; e->event.Timestamp = SAHPI_TIME_UNSPECIFIED; e->event.EventDataUnion.ResourceEvent.ResourceEventType = SAHPI_RESE_RESOURCE_ADDED; e->resource = *rptentry; oh_evt_queue_push(h->eventq, e); return SA_OK; } SaErrorT rtas_set_resource_severity(void *hnd, SaHpiResourceIdT id, SaHpiSeverityT sev) { struct oh_handler_state *h = hnd; SaHpiRptEntryT *rptentry = NULL; struct oh_event *e = NULL; if (!hnd) return SA_ERR_HPI_INTERNAL_ERROR; rptentry = oh_get_resource_by_id(h->rptcache, id); if (!rptentry) return SA_ERR_HPI_NOT_PRESENT; rptentry->ResourceSeverity = sev; e = (struct oh_event *)g_malloc0(sizeof(struct oh_event)); e->event.EventType = SAHPI_ET_RESOURCE; e->event.Source = rptentry->ResourceId; e->event.Severity = rptentry->ResourceSeverity; e->event.Timestamp = SAHPI_TIME_UNSPECIFIED; e->event.EventDataUnion.ResourceEvent.ResourceEventType = SAHPI_RESE_RESOURCE_ADDED; e->resource = *rptentry; oh_evt_queue_push(h->eventq, e); return SA_OK; } void * oh_set_resource_tag (void *, SaHpiResourceIdT, SaHpiTextBufferT *) __attribute__ ((weak, alias("rtas_set_resource_tag"))); void * oh_set_resource_severity (void *, SaHpiResourceIdT, SaHpiSeverityT) __attribute__ ((weak, alias("rtas_set_resource_severity"))); openhpi-2.14.1/plugins/rtas/rtas_annunciator.c0000644000076400007640000000751611302567000016344 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * Renier Morales * Daniel de Araujo */ #include SaErrorT rtas_get_next_announce(void *hnd, SaHpiResourceIdT id, SaHpiAnnunciatorNumT num, SaHpiSeverityT sev, SaHpiBoolT unack, SaHpiAnnouncementT *a) { return SA_ERR_HPI_INTERNAL_ERROR; } SaErrorT rtas_get_announce(void *hnd, SaHpiResourceIdT id, SaHpiAnnunciatorNumT num, SaHpiEntryIdT aid, SaHpiAnnouncementT *a) { return SA_ERR_HPI_INTERNAL_ERROR; } SaErrorT rtas_ack_announce(void *hnd, SaHpiResourceIdT id, SaHpiAnnunciatorNumT num, SaHpiEntryIdT aid, SaHpiSeverityT sev) { return SA_ERR_HPI_INTERNAL_ERROR; } SaErrorT rtas_add_announce(void *hnd, SaHpiResourceIdT id, SaHpiAnnunciatorNumT num, SaHpiAnnouncementT *a) { return SA_ERR_HPI_INTERNAL_ERROR; } SaErrorT rtas_del_announce(void *hnd, SaHpiResourceIdT id, SaHpiAnnunciatorNumT num, SaHpiEntryIdT aid, SaHpiSeverityT sev) { return SA_ERR_HPI_INTERNAL_ERROR; } SaErrorT rtas_get_annunc_mode(void *hnd, SaHpiResourceIdT id, SaHpiAnnunciatorNumT num, SaHpiAnnunciatorModeT *mode) { return SA_ERR_HPI_INTERNAL_ERROR; } SaErrorT rtas_set_annunc_mode(void *hnd, SaHpiResourceIdT id, SaHpiAnnunciatorNumT num, SaHpiAnnunciatorModeT mode) { return SA_ERR_HPI_INTERNAL_ERROR; } void * oh_get_next_announce (void *, SaHpiResourceIdT, SaHpiAnnunciatorNumT, SaHpiSeverityT, SaHpiBoolT, SaHpiAnnouncementT) __attribute__ ((weak, alias("rtas_get_next_announce"))); void * oh_get_announce (void *, SaHpiResourceIdT, SaHpiAnnunciatorNumT, SaHpiEntryIdT, SaHpiAnnouncementT *) __attribute__ ((weak, alias("rtas_get_announce"))); void * oh_ack_announce (void *, SaHpiResourceIdT, SaHpiAnnunciatorNumT, SaHpiEntryIdT, SaHpiSeverityT) __attribute__ ((weak, alias("rtas_ack_announce"))); void * oh_add_announce (void *, SaHpiResourceIdT, SaHpiAnnunciatorNumT, SaHpiAnnouncementT *) __attribute__ ((weak, alias("rtas_add_announce"))); void * oh_del_announce (void *, SaHpiResourceIdT, SaHpiAnnunciatorNumT, SaHpiEntryIdT, SaHpiSeverityT) __attribute__ ((weak, alias("rtas_del_announce"))); void * oh_get_annunc_mode (void *, SaHpiResourceIdT, SaHpiAnnunciatorNumT, SaHpiAnnunciatorModeT *) __attribute__ ((weak, alias("rtas_get_annunc_mode"))); void * oh_set_annunc_mode (void *, SaHpiResourceIdT, SaHpiAnnunciatorNumT, SaHpiAnnunciatorModeT) __attribute__ ((weak, alias("rtas_set_annunc_mode"))); openhpi-2.14.1/plugins/rtas/rtas_sensor.h0000644000076400007640000001034011302567000015326 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * Renier Morales * Daniel de Araujo */ #ifndef RTAS_SENSOR_H #define RTAS_SENSOR_H #include #include #include #include #include #include #include #define RTAS_SENSORS_PATH "/proc/device-tree/rtas/rtas-sensors" #define RTAS_SENSOR_LOCATION "/proc/device-tree/rtas/ibm,sensor-" #define MAX_SENSOR_LOCATION_STRING_SIZE 24 #define MILLISECONDS_PER_MINUTE 1000 #define TOKEN_MASK 0xFFFFFFF0 #define TIME_MASK ~TOKEN_MASK typedef enum rtasSensorStateEnum { SENSOR_OK = 0, SENSOR_CRITICAL_LOW = 9, SENSOR_WARNING_LOW = 10, SENSOR_NORMAL = 11, SENSOR_WARNING_HIGH = 12, SENSOR_CRITICAL_HIGH = 13 }rtasSensorState; struct SensorInfo { SaHpiUint32T token; SaHpiUint32T index; SaHpiBoolT enabled; SaHpiEventStateT current_state; SaHpiUint32T current_val; char sensor_location[MAX_SENSOR_LOCATION_STRING_SIZE]; }; /* Function Protos */ SaErrorT rtas_get_sensor_reading(void *handler, SaHpiResourceIdT resourceid, SaHpiSensorNumT sensornum, SaHpiSensorReadingT *reading, SaHpiEventStateT *e_state); SaErrorT rtas_get_sensor_thresholds(void *handler, SaHpiResourceIdT resourceid, SaHpiSensorNumT sensornum, SaHpiSensorThresholdsT *thresholds); SaErrorT rtas_set_sensor_thresholds(void *handler, SaHpiResourceIdT resourceid, SaHpiSensorNumT sensornum, const SaHpiSensorThresholdsT *thresholds); SaErrorT rtas_get_sensor_enable(void *hnd, SaHpiResourceIdT id, SaHpiSensorNumT num, SaHpiBoolT *enable); SaErrorT rtas_set_sensor_enable(void *hnd, SaHpiResourceIdT id, SaHpiSensorNumT num, SaHpiBoolT enable); SaErrorT rtas_get_sensor_event_enables(void *hnd, SaHpiResourceIdT id, SaHpiSensorNumT num, SaHpiBoolT *enables); SaErrorT rtas_set_sensor_event_enables(void *hnd, SaHpiResourceIdT id, SaHpiSensorNumT num, const SaHpiBoolT enables); SaErrorT rtas_get_sensor_event_masks(void *hnd, SaHpiResourceIdT id, SaHpiSensorNumT num, SaHpiEventStateT *AssertEventMask, SaHpiEventStateT *DeassertEventMask); SaErrorT rtas_set_sensor_event_masks(void *hnd, SaHpiResourceIdT id, SaHpiSensorNumT num, SaHpiSensorEventMaskActionT act, SaHpiEventStateT AssertEventMask, SaHpiEventStateT DeassertEventMask); SaErrorT rtas_get_sensor_event_enabled(void *hnd, SaHpiResourceIdT id, SaHpiSensorNumT sensornum, SaHpiBoolT *enable); SaErrorT rtas_set_sensor_event_enabled(void *hnd, SaHpiResourceIdT id, SaHpiSensorNumT sensornum, SaHpiBoolT *enable); int rtas_get_sensor_location_code(int token, int index, char *buffer); #endif openhpi-2.14.1/plugins/rtas/rtas_hotswap.h0000644000076400007640000000214311302567000015504 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * Renier Morales * Daniel de Araujo */ #ifndef RTAS_HOTSWAP_H #define RTAS_HOTSWAP_H #include #include SaErrorT rtas_get_hotswap_state(void *hnd, SaHpiResourceIdT id, SaHpiHsStateT *state); SaErrorT rtas_set_hotswap_state(void *hnd, SaHpiResourceIdT id, SaHpiHsStateT state); SaErrorT rtas_request_hotswap_action(void *hnd, SaHpiResourceIdT id, SaHpiHsActionT act); #endif openhpi-2.14.1/plugins/rtas/rtas_inventory.c0000644000076400007640000002651111302567000016054 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005,2006 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * Renier Morales * Daniel de Araujo */ #include #include #include #include #include #define MAX_FIELDS 35 static struct { char *type; SaHpiIdrFieldTypeT hpi_type; } field_map[] = { { .type = "PN", .hpi_type = SAHPI_IDR_FIELDTYPE_PART_NUMBER }, { .type = "FN", .hpi_type = SAHPI_IDR_FIELDTYPE_PART_NUMBER }, { .type = "EC", .hpi_type = SAHPI_IDR_FIELDTYPE_CUSTOM }, { .type = "MN", .hpi_type = SAHPI_IDR_FIELDTYPE_MANUFACTURER }, { .type = "MF", .hpi_type = SAHPI_IDR_FIELDTYPE_MANUFACTURER }, { .type = "SN", .hpi_type = SAHPI_IDR_FIELDTYPE_SERIAL_NUMBER }, { .type = "LI", .hpi_type = SAHPI_IDR_FIELDTYPE_CUSTOM }, { .type = "RL", .hpi_type = SAHPI_IDR_FIELDTYPE_CUSTOM }, { .type = "RM", .hpi_type = SAHPI_IDR_FIELDTYPE_CUSTOM }, { .type = "NA", .hpi_type = SAHPI_IDR_FIELDTYPE_CUSTOM }, { .type = "DD", .hpi_type = SAHPI_IDR_FIELDTYPE_CUSTOM }, { .type = "DG", .hpi_type = SAHPI_IDR_FIELDTYPE_CUSTOM }, { .type = "LL", .hpi_type = SAHPI_IDR_FIELDTYPE_CUSTOM }, { .type = "VI", .hpi_type = SAHPI_IDR_FIELDTYPE_MANUFACTURER }, { .type = "FU", .hpi_type = SAHPI_IDR_FIELDTYPE_CUSTOM }, { .type = "SI", .hpi_type = SAHPI_IDR_FIELDTYPE_MANUFACTURER }, { .type = "VK", .hpi_type = SAHPI_IDR_FIELDTYPE_PRODUCT_VERSION }, { .type = "TM", .hpi_type = SAHPI_IDR_FIELDTYPE_PART_NUMBER}, { .type = "YL", .hpi_type = SAHPI_IDR_FIELDTYPE_CUSTOM }, { .type = "BR", .hpi_type = SAHPI_IDR_FIELDTYPE_ASSET_TAG }, { .type = "CI", .hpi_type = SAHPI_IDR_FIELDTYPE_CUSTOM }, { .type = "RD", .hpi_type = SAHPI_IDR_FIELDTYPE_CUSTOM }, { .type = "PA", .hpi_type = SAHPI_IDR_FIELDTYPE_CUSTOM }, { .type = "NN", .hpi_type = SAHPI_IDR_FIELDTYPE_ASSET_TAG }, { .type = "DS", .hpi_type = SAHPI_IDR_FIELDTYPE_PRODUCT_NAME }, { .type = "AX", .hpi_type = SAHPI_IDR_FIELDTYPE_CUSTOM }, { .type = "CC", .hpi_type = SAHPI_IDR_FIELDTYPE_CUSTOM }, { .type = "CD", .hpi_type = SAHPI_IDR_FIELDTYPE_CUSTOM }, { .type = "CL", .hpi_type = SAHPI_IDR_FIELDTYPE_CUSTOM }, { .type = "MP", .hpi_type = SAHPI_IDR_FIELDTYPE_CUSTOM }, { .type = "SE", .hpi_type = SAHPI_IDR_FIELDTYPE_SERIAL_NUMBER }, { .type = "SZ", .hpi_type = SAHPI_IDR_FIELDTYPE_CUSTOM }, { .type = "PI", .hpi_type = SAHPI_IDR_FIELDTYPE_PRODUCT_NAME }, { .type = "VC", .hpi_type = SAHPI_IDR_FIELDTYPE_PRODUCT_VERSION }, { .type = "OS", .hpi_type = SAHPI_IDR_FIELDTYPE_CUSTOM }, }; SaHpiIdrFieldTypeT rtas_get_idr_field_type(char *type) { int i; SaHpiIdrFieldTypeT hpi_type = SAHPI_IDR_FIELDTYPE_UNSPECIFIED; if (!type) return hpi_type-1; for (i = 0; i < MAX_FIELDS; i++) { if (strcasecmp(type, field_map[i].type) == 0) { hpi_type = field_map[i].hpi_type; break; } } return hpi_type; } SaHpiIdrAreaTypeT rtas_get_idr_area_type(char *type) { SaHpiIdrAreaTypeT area_type = SAHPI_IDR_FIELDTYPE_UNSPECIFIED; if (strcasecmp(type, "VC") == 0) { area_type = SAHPI_IDR_AREATYPE_PRODUCT_INFO; } else if (strcasecmp(type, "DS") == 0) { area_type = SAHPI_IDR_AREATYPE_BOARD_INFO; } return area_type; } SaErrorT rtas_get_idr_info(void *hnd, SaHpiResourceIdT rid, SaHpiIdrIdT idrid, SaHpiIdrInfoT *idrinfo) { struct oh_rtas_idr *idr_info = NULL; SaHpiRdrT *rdr = NULL; struct oh_handler_state *h = hnd; if (!hnd) return SA_ERR_HPI_INTERNAL_ERROR; rdr = oh_get_rdr_by_type(h->rptcache, rid, SAHPI_INVENTORY_RDR, idrid); if (!rdr) return SA_ERR_HPI_NOT_PRESENT; idr_info = oh_get_rdr_data(h->rptcache, rid, rdr->RecordId); if (!idr_info) return SA_ERR_HPI_INTERNAL_ERROR; *idrinfo = idr_info->hpi_idr; return SA_OK; } SaErrorT rtas_get_idr_area_header(void *hnd, SaHpiResourceIdT rid, SaHpiIdrIdT idrid, SaHpiIdrAreaTypeT areatype, SaHpiEntryIdT areaid, SaHpiEntryIdT *nextareaid, SaHpiIdrAreaHeaderT *header) { struct oh_rtas_idr *idr_info = NULL; SaHpiRdrT *rdr = NULL; struct oh_handler_state *h = hnd; GSList *node = NULL; if (!hnd) return SA_ERR_HPI_INTERNAL_ERROR; rdr = oh_get_rdr_by_type(h->rptcache, rid, SAHPI_INVENTORY_RDR, idrid); if (!rdr) { err("RDR not found. %u->inventory->%u", rid, idrid); return SA_ERR_HPI_NOT_PRESENT; } idr_info = oh_get_rdr_data(h->rptcache, rid, rdr->RecordId); if (!idr_info) { err("IDR data not found! %u->%u", rid, rdr->RecordId); return SA_ERR_HPI_INTERNAL_ERROR; } for (node = idr_info->areas; node; node = node->next) { struct oh_rtas_idr_area *area = node->data; if ((areatype != SAHPI_IDR_AREATYPE_UNSPECIFIED && (areaid == SAHPI_FIRST_ENTRY || areaid == area->hpi_idr_area.AreaId) && areatype == area->hpi_idr_area.Type) || (areaid == SAHPI_FIRST_ENTRY || areaid == area->hpi_idr_area.AreaId)) { *header = area->hpi_idr_area; if (node->next) { struct oh_rtas_idr_area *narea = node->next->data; *nextareaid = narea->hpi_idr_area.AreaId; } else { *nextareaid = SAHPI_LAST_ENTRY; } return SA_OK; } } return SA_ERR_HPI_NOT_PRESENT; } SaErrorT rtas_add_idr_area(void *hnd, SaHpiResourceIdT rid, SaHpiIdrIdT idrid, SaHpiIdrAreaTypeT areatype, SaHpiEntryIdT *areaid) { return SA_ERR_HPI_READ_ONLY; } SaErrorT rtas_del_idr_area(void *hnd, SaHpiResourceIdT rid, SaHpiIdrIdT idrid, SaHpiEntryIdT areaid) { return SA_ERR_HPI_READ_ONLY; } SaErrorT rtas_get_idr_field(void *hnd, SaHpiResourceIdT rid, SaHpiIdrIdT idrid, SaHpiEntryIdT areaid, SaHpiIdrFieldTypeT fieldtype, SaHpiEntryIdT fieldid, SaHpiEntryIdT *nextfieldid, SaHpiIdrFieldT *field) { struct oh_rtas_idr *idr_info = NULL; SaHpiRdrT *rdr = NULL; struct oh_handler_state *h = hnd; GSList *node = NULL; if (!hnd) return SA_ERR_HPI_INTERNAL_ERROR; rdr = oh_get_rdr_by_type(h->rptcache, rid, SAHPI_INVENTORY_RDR, idrid); if (!rdr) return SA_ERR_HPI_NOT_PRESENT; idr_info = oh_get_rdr_data(h->rptcache, rid, rdr->RecordId); if (!idr_info) return SA_ERR_HPI_INTERNAL_ERROR; for (node = idr_info->areas; node; node = node->next) { struct oh_rtas_idr_area *area = node->data; if (areaid == area->hpi_idr_area.AreaId || areaid == SAHPI_FIRST_ENTRY) { GSList *node2 = NULL; for (node2 = area->fields; node2; node2 = node2->next) { SaHpiIdrFieldT *tfield = node2->data; if ((fieldtype != SAHPI_IDR_FIELDTYPE_UNSPECIFIED && (fieldid == SAHPI_FIRST_ENTRY || fieldid == tfield->FieldId) && fieldtype == tfield->Type) || (fieldid == SAHPI_FIRST_ENTRY || fieldid == tfield->FieldId)) { *field = *tfield; if (node2->next) { SaHpiIdrFieldT *nfield = node2->next->data; *nextfieldid = nfield->FieldId; } else { *nextfieldid = SAHPI_LAST_ENTRY; } return SA_OK; } } } } return SA_ERR_HPI_NOT_PRESENT; } SaErrorT rtas_add_idr_field(void *hnd, SaHpiResourceIdT rid, SaHpiIdrIdT idrid, SaHpiIdrFieldT *field) { return SA_ERR_HPI_READ_ONLY; } SaErrorT rtas_set_idr_field(void *hnd, SaHpiResourceIdT rid, SaHpiIdrIdT idrid, SaHpiIdrFieldT *field) { return SA_ERR_HPI_READ_ONLY; } SaErrorT rtas_del_idr_field(void *hnd, SaHpiResourceIdT rid, SaHpiIdrIdT idrid, SaHpiEntryIdT areaid, SaHpiEntryIdT fieldid) { return SA_ERR_HPI_READ_ONLY; } void * oh_get_idr_info (void *hnd, SaHpiResourceIdT, SaHpiIdrIdT,SaHpiIdrInfoT) __attribute__ ((weak, alias("rtas_get_idr_info"))); void * oh_get_idr_area_header (void *, SaHpiResourceIdT, SaHpiIdrIdT, SaHpiIdrAreaTypeT, SaHpiEntryIdT, SaHpiEntryIdT, SaHpiIdrAreaHeaderT) __attribute__ ((weak, alias("rtas_get_idr_area_header"))); void * oh_add_idr_area (void *, SaHpiResourceIdT, SaHpiIdrIdT, SaHpiIdrAreaTypeT, SaHpiEntryIdT) __attribute__ ((weak, alias("rtas_add_idr_area"))); void * oh_del_idr_area (void *, SaHpiResourceIdT, SaHpiIdrIdT, SaHpiEntryIdT) __attribute__ ((weak, alias("rtas_del_idr_area"))); void * oh_get_idr_field (void *, SaHpiResourceIdT, SaHpiIdrIdT, SaHpiEntryIdT, SaHpiIdrFieldTypeT, SaHpiEntryIdT, SaHpiEntryIdT, SaHpiIdrFieldT) __attribute__ ((weak, alias("rtas_get_idr_field"))); void * oh_add_idr_field (void *, SaHpiResourceIdT, SaHpiIdrIdT, SaHpiIdrFieldT) __attribute__ ((weak, alias("rtas_add_idr_field"))); void * oh_set_idr_field (void *, SaHpiResourceIdT, SaHpiIdrIdT, SaHpiIdrFieldT) __attribute__ ((weak, alias("rtas_set_idr_field"))); void * oh_del_idr_field (void *, SaHpiResourceIdT, SaHpiIdrIdT, SaHpiEntryIdT, SaHpiEntryIdT) __attribute__ ((weak, alias("rtas_del_idr_field"))); openhpi-2.14.1/plugins/rtas/rtas.c0000644000076400007640000000340111302567000013730 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * Renier Morales */ #include void *rtas_open(GHashTable *handler_config, unsigned int hid, oh_evt_queue *eventq) { struct oh_handler_state *h = NULL; char *entity_root = NULL; if (!handler_config) { err("No configuration passed."); return NULL; } else if (!hid) { err("Bad handler id passed."); return NULL; } else if (!eventq) { err("No event queue was passed."); return NULL; } entity_root = (char *)g_hash_table_lookup(handler_config, "entity_root"); if (!entity_root) { err("Cannot find \"entity_root\" configuration parameter."); return NULL; } h = (struct oh_handler_state *)g_malloc0(sizeof(struct oh_handler_state)); h->config = handler_config; h->rptcache = (RPTable *)g_malloc0(sizeof(RPTable)); oh_init_rpt(h->rptcache); h->elcache = oh_el_create(0); h->elcache->gentimestamp = FALSE; h->hid = hid; h->eventq = eventq; return h; } void rtas_close(void *hnd) { return; } /* Function ABI aliases */ void * oh_open (GHashTable *, unsigned int, oh_evt_queue *) __attribute__ ((weak, alias("rtas_open"))); void * oh_close (void *) __attribute__ ((weak, alias("rtas_close"))); openhpi-2.14.1/plugins/rtas/rtas_resource.h0000644000076400007640000000167011302567000015652 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * Renier Morales * Daniel de Araujo */ #ifndef RTAS_RESOURCE_H #define RTAS_RESOURCE_H #include #include SaErrorT rtas_set_resource_tag(void *hnd, SaHpiResourceIdT id, SaHpiTextBufferT *tag); SaErrorT rtas_set_resource_severity(void *hnd, SaHpiResourceIdT id, SaHpiSeverityT sev); #endif openhpi-2.14.1/plugins/rtas/rtas_indicator.h0000644000076400007640000000172111302567000015774 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * Renier Morales * Daniel de Araujo */ #ifndef RTAS_INDICATOR_H #define RTAS_INDICATOR_H #include #include SaErrorT rtas_get_indicator_state(void *hnd, SaHpiResourceIdT id, SaHpiHsIndicatorStateT *state); SaErrorT rtas_set_indicator_state(void *hnd, SaHpiResourceIdT id, SaHpiHsIndicatorStateT state); #endif openhpi-2.14.1/plugins/rtas/rtas_hotswap.c0000644000076400007640000000307211302567000015501 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * Renier Morales * Daniel de Araujo */ #include SaErrorT rtas_get_hotswap_state(void *hnd, SaHpiResourceIdT id, SaHpiHsStateT *state) { return SA_ERR_HPI_INTERNAL_ERROR; } SaErrorT rtas_set_hotswap_state(void *hnd, SaHpiResourceIdT id, SaHpiHsStateT state) { return SA_ERR_HPI_INTERNAL_ERROR; } SaErrorT rtas_request_hotswap_action(void *hnd, SaHpiResourceIdT id, SaHpiHsActionT act) { return SA_ERR_HPI_INTERNAL_ERROR; } void * oh_get_hotswap_state (void *, SaHpiResourceIdT, SaHpiHsStateT *) __attribute__ ((weak, alias("rtas_get_hotswap_state"))); void * oh_set_hotswap_state (void *, SaHpiResourceIdT, SaHpiHsStateT) __attribute__ ((weak, alias("rtas_set_hotswap_state"))); void * oh_request_hotswap_action (void *, SaHpiResourceIdT, SaHpiHsActionT) __attribute__ ((weak, alias("rtas_request_hotswap_action"))); openhpi-2.14.1/plugins/rtas/rtas_discover.h0000644000076400007640000000402211302567000015633 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * Renier Morales * Daniel de Araujo */ #ifndef RTAS_DISCOVER_H #define RTAS_DISCOVER_H #include #include #include #include #include #include #include #include #define LSVPD_CMD "/sbin/lsvpd" /* Enums */ typedef enum rtasSensorTokenEnum { RTAS_SECURITY_SENSOR = 1, RTAS_RESERVED_SENSOR_2, RTAS_THERMAL_SENSOR, RTAS_RESERVED_SENSOR_4, RTAS_RESERVED_SENSOR_5, RTAS_RESERVED_SENSOR_6, RTAS_RESERVED_SENSOR_7, RTAS_RESERVED_SENSOR_8, RTAS_POWER_STATE_SENSOR, RTAS_RESERVED_SENSOR_10, RTAS_RESERVED_SENSOR_11, RTAS_SURVEILLANCE_SENSOR = 9000, RTAS_FAN_SENSOR, RTAS_VOLTAGE_SENSOR, RTAS_CONNECTOR_SENSOR, RTAS_POWER_SUPPLY_SENSOR, RTAS_GIQ_SENSOR, RTAS_SYSTEM_ATTENTION_SENSOR, RTAS_IDENTIFY_INDICATOR_SENSOR, RTAS_RESERVED_SENSOR_9008, RTAS_COMPONENT_RESET_STATE_SENSOR, RTAS_OEM_SPECIFIC_SENSOR_START, RTAS_OEM_SPECIFIC_SENSOR_END = 9999 } rtasSensorToken; /* Function Protos */ SaErrorT rtas_discover_resources(void *hnd); SaErrorT rtas_discover_sensors(struct oh_handler_state *handle, struct oh_event *res_oh_event); SaErrorT rtas_discover_inventory(struct oh_handler_state *handle, struct oh_event *res_oh_event); void populate_rtas_sensor_rec_info(int token, SaHpiSensorRecT *sensor_info); #endif /* RTAS_DISCOVER_H */ openhpi-2.14.1/plugins/rtas/rtas_utils.h0000644000076400007640000000147511302567000015166 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * Renier Morales * Daniel de Araujo */ #ifndef RTAS_UTILS_H #define RTAS_UTILS_H #include #include #include #include #include #include #include void decode_rtas_error (int error, char *buf, size_t size, int token, int index); #endif /* RTAS_UTILS_H */ openhpi-2.14.1/plugins/rtas/rtas_sensor.c0000644000076400007640000004026011302567000015325 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * Daniel de Araujo * Renier Morales * */ #include #include #include #include #include #include #include #include #include #include #include /** * rtas_get_sensor_reading: * @hnd: Handler data pointer. * @rid: Resource ID. * @sid: Sensor ID. * @data: Location to store sensor's value (may be NULL). * @state: Location to store sensor's state (may be NULL). * * Retrieves a sensor's value and/or state. Both @data and @state * may be NULL, in which case this function can be used to test for * sensor presence. * * Return values: * SA_OK - Normal case. * SA_ERR_HPI_CAPABILITY - Resource doesn't have SAHPI_CAPABILITY_SENSOR. * SA_ERR_HPI_INVALID_REQUEST - Sensor is disabled. * SA_ERR_HPI_NOT_PRESENT - Sensor doesn't exist. * SA_ERR_HPI_INVALID_PARAMS - Pointer parameter(s) are NULL. **/ SaErrorT rtas_get_sensor_reading(void *handler, SaHpiResourceIdT resourceid, SaHpiSensorNumT sensornum, SaHpiSensorReadingT *reading, SaHpiEventStateT *e_state) { SaHpiSensorReadingT sensor_reading; SaHpiEventStateT sensor_state; struct SensorInfo *sensor_info; SaHpiInt32T state = 0, val; char err_buf[150]; size_t sizebuf = sizeof(err_buf); if (!handler) { err("Invalid parameter."); return(SA_ERR_HPI_INVALID_PARAMS); } struct oh_handler_state *handler_state = (struct oh_handler_state *)handler; //do some locking here...... /* Check if resource exists and has sensor capabilities */ SaHpiRptEntryT *rpt = oh_get_resource_by_id(handler_state->rptcache, resourceid); if (!rpt) { //unlock it return(SA_ERR_HPI_INVALID_RESOURCE); } if (!(rpt->ResourceCapabilities & SAHPI_CAPABILITY_SENSOR)) { //unlock it return(SA_ERR_HPI_CAPABILITY); } /* Check if sensor exists and is enabled */ SaHpiRdrT *rdr = oh_get_rdr_by_type(handler_state->rptcache, resourceid, SAHPI_SENSOR_RDR, sensornum); if (rdr == NULL) { //unlock it return(SA_ERR_HPI_NOT_PRESENT); } sensor_info = (struct SensorInfo *)oh_get_rdr_data(handler_state->rptcache, resourceid, rdr->RecordId); if (sensor_info == NULL) { //unlock it err("No sensor data. Sensor=%s", rdr->IdString.Data); return(SA_ERR_HPI_INTERNAL_ERROR); } memset(&sensor_reading, 0, sizeof(SaHpiSensorReadingT)); sensor_state = SAHPI_ES_UNSPECIFIED; dbg("Sensor Reading: Resource=%s; RDR=%s", rpt->ResourceTag.Data, rdr->IdString.Data); /************************************************************ * Get sensor's reading. * Need to go through this logic, since user may request just * the event state for a readable sensor. Need to translate * sensor reading to event in this case. ************************************************************/ if (rdr->RdrTypeUnion.SensorRec.DataFormat.IsSupported == SAHPI_TRUE) { state = rtas_get_sensor(sensor_info->token, sensor_info->index, &val); if (state < 0) { decode_rtas_error(state, err_buf, sizebuf, sensor_info->token, sensor_info->index); err("Cannot determine sensor's reading. Error=%s", err_buf); //unlock it /* NEED TO MAP RTAS ERRORS TO HPI ERRORS */ return(state); } else { /* if the return code is 990x. we must sleep for 10^x milliseconds before * trying to query the rtas sensor again */ if ((state & TOKEN_MASK) == 9900) { sleep((exp10(state & TIME_MASK))); state = rtas_get_sensor(sensor_info->token, sensor_info->index, &val); if (state < 0) { decode_rtas_error(state, err_buf, sizebuf, sensor_info->token, sensor_info->index); err("Cannot determine sensor's reading. Error=%s", err_buf); //unlock it /* NEED TO MAP RTAS ERRORS TO HPI ERRORS */ return(state); } } sensor_reading.IsSupported = SAHPI_TRUE; sensor_reading.Type = rdr->RdrTypeUnion.SensorRec.DataFormat.ReadingType; switch (sensor_reading.Type) { case SAHPI_SENSOR_READING_TYPE_INT64: sensor_reading.Value.SensorInt64 = val; break; case SAHPI_SENSOR_READING_TYPE_UINT64: sensor_reading.Value.SensorUint64 = (SaHpiUint32T)val; break; case SAHPI_SENSOR_READING_TYPE_FLOAT64: sensor_reading.Value.SensorFloat64 = (SaHpiFloat64T)val; break; case SAHPI_SENSOR_READING_TYPE_BUFFER: memcpy(sensor_reading.Value.SensorBuffer, &val, sizeof(val)); break; default: break; } sensor_info->current_val = val; } } else { sensor_reading.IsSupported = SAHPI_FALSE; } /****************************************************************** * We already grabbed the the sensor's state in rtas_get_sensor. * We now need to translate it into an event state and write it * to the stored location. ******************************************************************/ /* If we couldn't get read the data, just assign the state to the one found during discovery */ if (sensor_reading.IsSupported == SAHPI_FALSE) { *e_state = sensor_info->current_state; } else { switch ((rtasSensorState)state) { case SENSOR_OK: sensor_state = SAHPI_ES_UNSPECIFIED; sensor_info->current_state = SAHPI_ES_UNSPECIFIED; break; case SENSOR_CRITICAL_LOW: sensor_state = SAHPI_ES_LOWER_CRIT; sensor_info->current_state = SAHPI_ES_LOWER_CRIT; break; case SENSOR_WARNING_LOW: sensor_state = SAHPI_ES_LOWER_MINOR; sensor_info->current_state = SAHPI_ES_LOWER_MINOR; break; case SENSOR_NORMAL: sensor_state = SAHPI_ES_OK; sensor_info->current_state = SAHPI_ES_OK; break; case SENSOR_WARNING_HIGH: sensor_state = SAHPI_ES_UPPER_MINOR; sensor_info->current_state = SAHPI_ES_UPPER_MINOR; break; case SENSOR_CRITICAL_HIGH: sensor_state = SAHPI_ES_UPPER_CRIT; sensor_info->current_state = SAHPI_ES_UPPER_CRIT; break; default: sensor_state = SAHPI_ES_UNSPECIFIED; sensor_info->current_state = SAHPI_ES_UNSPECIFIED; break; } } /* sinfo->cur_state = working_state; */ if (reading) memcpy(reading, &sensor_reading, sizeof(SaHpiSensorReadingT)); if (e_state) memcpy(e_state, &sensor_state, sizeof(SaHpiEventStateT)); //unlock it return(SA_OK); } /** * snmp_bc_get_sensor_thresholds: * @handler: Handler data pointer. * @resourceid: Resource ID. * @sensornum: Sensor Number. * @threshold: Location to store sensor's threshold values. * * Retreives sensor's threshold values, if defined. * * Return values: * SA_OK - Normal case. * SA_ERR_HPI_CAPABILITY - Resource doesn't have SAHPI_CAPABILITY_SENSOR. * SA_ERR_HPI_INVALID_CMD - Sensor is not threshold type, has accessible or readable thresholds. * SA_ERR_HPI_INVALID_PARAMS - Pointer parameter(s) are NULL. * SA_ERR_HPI_NOT_PRESENT - Sensor doesn't exist. **/ SaErrorT rtas_get_sensor_thresholds(void *handler, SaHpiResourceIdT resourceid, SaHpiSensorNumT sensornum, SaHpiSensorThresholdsT *thresholds) { struct SensorInfo *sinfo; struct oh_handler_state *handler_state = (struct oh_handler_state *)handler; if (!handler || !thresholds) { err("Invalid parameter."); return(SA_ERR_HPI_INVALID_PARAMS); } //do locking stuff here /* Check if resource exists and has sensor capabilities */ SaHpiRptEntryT *rpt = oh_get_resource_by_id(handler_state->rptcache, resourceid); if (!rpt) { //unlock it return(SA_ERR_HPI_INVALID_RESOURCE); } if (!(rpt->ResourceCapabilities & SAHPI_CAPABILITY_SENSOR)) { //unlock it return(SA_ERR_HPI_CAPABILITY); } /* Check if sensor exits and has readable thresholds */ SaHpiRdrT *rdr = oh_get_rdr_by_type(handler_state->rptcache, resourceid, SAHPI_SENSOR_RDR, sensornum); if (rdr == NULL){ //unlock it return(SA_ERR_HPI_NOT_PRESENT); } sinfo = (struct SensorInfo *)oh_get_rdr_data(handler_state->rptcache, resourceid, rdr->RecordId); if (sinfo == NULL) { err("No sensor data. Sensor=%s", rdr->IdString.Data); //unlock it return(SA_ERR_HPI_INTERNAL_ERROR); } /* Since the RTAS library doesn't support reading of thresholds, return the * appropriate return code */ //unlock it return SA_ERR_HPI_INVALID_CMD; } /** * snmp_bc_set_sensor_thresholds: * @handler: Handler data pointer. * @resourceid: Resource ID. * @sensornum: Sensor ID. * @thresholds: Location of sensor's settable threshold values. * * Sets sensor's threshold values. * * Return values: * SA_OK - Normal case. * SA_ERR_HPI_CAPABILITY - Resource doesn't have SAHPI_CAPABILITY_SENSOR. * SA_ERR_HPI_INVALID_CMD - Non-writable thresholds or invalid thresholds. * SA_ERR_HPI_INVALID_DATA - Threshold values out of order; negative hysteresis * SA_ERR_HPI_INVALID_PARAMS - Pointer parameter(s) are NULL. * SA_ERR_HPI_NOT_PRESENT - Sensor doesn't exist. **/ SaErrorT rtas_set_sensor_thresholds(void *handler, SaHpiResourceIdT resourceid, SaHpiSensorNumT sensornum, const SaHpiSensorThresholdsT *thresholds) { struct oh_handler_state *handler_state = (struct oh_handler_state *)handler; struct SensorInfo *sinfo; if (!handler || !thresholds) { err("Invalid parameter"); return(SA_ERR_HPI_INVALID_PARAMS); } //do locking stuff here /* Check if resource exists and has sensor capabilities */ SaHpiRptEntryT *rpt = oh_get_resource_by_id(handler_state->rptcache, resourceid); if (!rpt) { //unlock it return(SA_ERR_HPI_INVALID_RESOURCE); } if (!(rpt->ResourceCapabilities & SAHPI_CAPABILITY_SENSOR)) { //unlock it return(SA_ERR_HPI_CAPABILITY); } /* Check if sensor exists and has writable thresholds */ SaHpiRdrT *rdr = oh_get_rdr_by_type(handler_state->rptcache, resourceid, SAHPI_SENSOR_RDR, sensornum); if (rdr == NULL) { //unlock it return(SA_ERR_HPI_NOT_PRESENT); } sinfo = (struct SensorInfo *)oh_get_rdr_data(handler_state->rptcache, resourceid, rdr->RecordId); if (sinfo == NULL) { err("No sensor data. Sensor=%s", rdr->IdString.Data); //unlock it return(SA_ERR_HPI_INTERNAL_ERROR); } /* Since the RTAS library doesn't support setting of thresholds, return the * appropriate return code */ return(SA_ERR_HPI_INVALID_CMD); } SaErrorT rtas_get_sensor_enable(void *hnd, SaHpiResourceIdT id, SaHpiSensorNumT num, SaHpiBoolT *enable) { return SA_ERR_HPI_INTERNAL_ERROR; } SaErrorT rtas_set_sensor_enable(void *hnd, SaHpiResourceIdT id, SaHpiSensorNumT num, SaHpiBoolT enable) { return SA_ERR_HPI_INTERNAL_ERROR; } SaErrorT rtas_get_sensor_event_enables(void *hnd, SaHpiResourceIdT id, SaHpiSensorNumT num, SaHpiBoolT *enables) { return SA_ERR_HPI_INTERNAL_ERROR; } SaErrorT rtas_set_sensor_event_enables(void *hnd, SaHpiResourceIdT id, SaHpiSensorNumT num, const SaHpiBoolT enables) { return SA_ERR_HPI_INTERNAL_ERROR; } SaErrorT rtas_get_sensor_event_masks(void *hnd, SaHpiResourceIdT id, SaHpiSensorNumT num, SaHpiEventStateT *AssertEventMask, SaHpiEventStateT *DeassertEventMask) { return SA_ERR_HPI_INTERNAL_ERROR; } SaErrorT rtas_set_sensor_event_masks(void *hnd, SaHpiResourceIdT id, SaHpiSensorNumT num, SaHpiSensorEventMaskActionT act, SaHpiEventStateT AssertEventMask, SaHpiEventStateT DeassertEventMask) { return SA_ERR_HPI_INTERNAL_ERROR; } SaErrorT rtas_get_sensor_event_enabled(void *hnd, SaHpiResourceIdT id, SaHpiSensorNumT sensornum, SaHpiBoolT *enable) { return SA_ERR_HPI_INTERNAL_ERROR; } SaErrorT rtas_set_sensor_event_enabled(void *hnd, SaHpiResourceIdT id, SaHpiSensorNumT sensornum, SaHpiBoolT *enable) { return SA_ERR_HPI_INTERNAL_ERROR; } /** * rtas_get_sensor_location_code * * @token - the sensor type. * @index - index of the sensor. * @buffer - buffer to store the location code of the sensor. * * @return - TBD */ int rtas_get_sensor_location_code(int token, int index, char *buffer) { int filehandle, i, len; char filename[45], temp[4096], *pos; if (buffer == NULL) return 0; buffer[0] = '\0'; snprintf(filename, MAX_SENSOR_LOCATION_STRING_SIZE, "%s%04d", RTAS_SENSOR_LOCATION, token); filehandle = open(filename, O_RDONLY); if (filehandle < 0) return 0; if ((len = read(filehandle, temp, 4096)) < 0) return 0; pos = temp; for (i=0; i= temp + len) { close(filehandle); return 0; } } strncpy(buffer, pos, MAX_SENSOR_LOCATION_STRING_SIZE); close(filehandle); return 1; } void * oh_get_sensor_reading (void *, SaHpiResourceIdT, SaHpiSensorNumT, SaHpiSensorReadingT *, SaHpiEventStateT *) __attribute__ ((weak, alias("rtas_get_sensor_reading"))); void * oh_get_sensor_thresholds (void *, SaHpiResourceIdT, SaHpiSensorNumT, SaHpiSensorThresholdsT *) __attribute__ ((weak, alias("rtas_get_sensor_thresholds"))); void * oh_set_sensor_thresholds (void *, SaHpiResourceIdT, SaHpiSensorNumT, const SaHpiSensorThresholdsT *) __attribute__ ((weak, alias("rtas_set_sensor_thresholds"))); void * oh_get_sensor_enable (void *, SaHpiResourceIdT, SaHpiSensorNumT, SaHpiBoolT *) __attribute__ ((weak, alias("rtas_get_sensor_enable"))); void * oh_set_sensor_enable (void *, SaHpiResourceIdT, SaHpiSensorNumT, SaHpiBoolT) __attribute__ ((weak, alias("rtas_set_sensor_enable"))); void * oh_get_sensor_event_enables (void *, SaHpiResourceIdT, SaHpiSensorNumT, SaHpiBoolT *) __attribute__ ((weak, alias("rtas_get_sensor_event_enabled"))); void * oh_set_sensor_event_enables (void *, SaHpiResourceIdT id, SaHpiSensorNumT, SaHpiBoolT *) __attribute__ ((weak, alias("rtas_set_sensor_event_enabled"))); void * oh_get_sensor_event_masks (void *, SaHpiResourceIdT, SaHpiSensorNumT, SaHpiEventStateT *, SaHpiEventStateT *) __attribute__ ((weak, alias("rtas_get_sensor_event_masks"))); void * oh_set_sensor_event_masks (void *, SaHpiResourceIdT, SaHpiSensorNumT, SaHpiSensorEventMaskActionT, SaHpiEventStateT, SaHpiEventStateT) __attribute__ ((weak, alias("rtas_set_sensor_event_masks"))); openhpi-2.14.1/plugins/rtas/rtas_power.h0000644000076400007640000000164411302567000015160 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * Renier Morales * Daniel de Araujo */ #ifndef RTAS_POWER_H #define RTAS_POWER_H #include #include SaErrorT rtas_get_power_state(void *hnd, SaHpiResourceIdT id, SaHpiPowerStateT *state); SaErrorT rtas_set_power_state(void *hnd, SaHpiResourceIdT id, SaHpiPowerStateT state); #endif openhpi-2.14.1/plugins/rtas/rtas_control.c0000644000076400007640000000355511302567000015502 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * Renier Morales * Daniel de Araujo */ #include SaErrorT rtas_get_control_state(void *hnd, SaHpiResourceIdT id, SaHpiCtrlNumT num, SaHpiCtrlModeT *mode, SaHpiCtrlStateT *state) { return SA_ERR_HPI_INTERNAL_ERROR; } SaErrorT rtas_set_control_state(void *hnd, SaHpiResourceIdT id, SaHpiCtrlNumT num, SaHpiCtrlModeT mode, SaHpiCtrlStateT *state) { return SA_ERR_HPI_INTERNAL_ERROR; } SaErrorT rtas_control_parm(void *hnd, SaHpiResourceIdT id, SaHpiParmActionT act) { return SA_ERR_HPI_INTERNAL_ERROR; } void * oh_get_control_state (void *, SaHpiResourceIdT, SaHpiCtrlNumT, SaHpiCtrlModeT *, SaHpiCtrlStateT *) __attribute__ ((weak, alias("rtas_get_control_state"))); void * oh_set_control_state (void *, SaHpiResourceIdT,SaHpiCtrlNumT, SaHpiCtrlModeT, SaHpiCtrlStateT *) __attribute__ ((weak, alias("rtas_set_control_state"))); void * oh_control_parm (void *, SaHpiResourceIdT, SaHpiParmActionT) __attribute__ ((weak, alias("rtas_control_parm"))); openhpi-2.14.1/plugins/rtas/rtas_annunciator.h0000644000076400007640000000443111302567000016342 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * Renier Morales * Daniel de Araujo */ #ifndef RTAS_ANNUNCIATOR_H #define RTAS_ANNUNCIATOR_H #include #include SaErrorT rtas_get_next_announce(void *hnd, SaHpiResourceIdT id, SaHpiAnnunciatorNumT num, SaHpiSeverityT sev, SaHpiBoolT unack, SaHpiAnnouncementT *a); SaErrorT rtas_get_announce(void *hnd, SaHpiResourceIdT id, SaHpiAnnunciatorNumT num, SaHpiEntryIdT aid, SaHpiAnnouncementT *a); SaErrorT rtas_ack_announce(void *hnd, SaHpiResourceIdT id, SaHpiAnnunciatorNumT num, SaHpiEntryIdT aid, SaHpiSeverityT sev); SaErrorT rtas_add_announce(void *hnd, SaHpiResourceIdT id, SaHpiAnnunciatorNumT num, SaHpiAnnouncementT *a); SaErrorT rtas_del_announce(void *hnd, SaHpiResourceIdT id, SaHpiAnnunciatorNumT num, SaHpiEntryIdT aid, SaHpiSeverityT sev); SaErrorT rtas_get_annunc_mode(void *hnd, SaHpiResourceIdT id, SaHpiAnnunciatorNumT num, SaHpiAnnunciatorModeT *mode); SaErrorT rtas_set_annunc_mode(void *hnd, SaHpiResourceIdT id, SaHpiAnnunciatorNumT num, SaHpiAnnunciatorModeT mode); #endif openhpi-2.14.1/plugins/rtas/rtas.h0000644000076400007640000000136411302567000013743 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * Renier Morales */ #ifndef RTAS_H #define RTAS_H #include #include #include #include #include void *rtas_open(GHashTable *handler_config, unsigned int hid, oh_evt_queue *eventq); void rtas_close(void *hnd); #endif /* _OH_RTAS_H */ openhpi-2.14.1/plugins/rtas/rtas_inventory.h0000644000076400007640000000557211302567000016065 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * Renier Morales * Daniel de Araujo */ #ifndef RTAS_INVENTORY_H #define RTAS_INVENTORY_H #include #include struct oh_rtas_idr_area { SaHpiIdrAreaHeaderT hpi_idr_area; GSList *fields; }; struct oh_rtas_idr { SaHpiIdrInfoT hpi_idr; GSList *areas; }; SaHpiIdrFieldTypeT rtas_get_idr_field_type(char *type); SaHpiIdrAreaTypeT rtas_get_idr_area_type(char *type); SaErrorT rtas_get_idr_info(void *hnd, SaHpiResourceIdT rid, SaHpiIdrIdT idrid, SaHpiIdrInfoT *idrinfo); SaErrorT rtas_get_idr_area_header(void *hnd, SaHpiResourceIdT rid, SaHpiIdrIdT idrid, SaHpiIdrAreaTypeT areatype, SaHpiEntryIdT areaid, SaHpiEntryIdT *nextareaid, SaHpiIdrAreaHeaderT *header); SaErrorT rtas_add_idr_area(void *hnd, SaHpiResourceIdT rid, SaHpiIdrIdT idrid, SaHpiIdrAreaTypeT areatype, SaHpiEntryIdT *areaid); SaErrorT rtas_del_idr_area(void *hnd, SaHpiResourceIdT rid, SaHpiIdrIdT idrid, SaHpiEntryIdT areaid); SaErrorT rtas_get_idr_field(void *hnd, SaHpiResourceIdT rid, SaHpiIdrIdT idrid, SaHpiEntryIdT areaid, SaHpiIdrFieldTypeT fieldtype, SaHpiEntryIdT fieldid, SaHpiEntryIdT *nextfieldid, SaHpiIdrFieldT *field); SaErrorT rtas_add_idr_field(void *hnd, SaHpiResourceIdT rid, SaHpiIdrIdT idrid, SaHpiIdrFieldT *field); SaErrorT rtas_set_idr_field(void *hnd, SaHpiResourceIdT rid, SaHpiIdrIdT idrid, SaHpiIdrFieldT *field); SaErrorT rtas_del_idr_field(void *hnd, SaHpiResourceIdT rid, SaHpiIdrIdT idrid, SaHpiEntryIdT areaid, SaHpiEntryIdT fieldid); #endif openhpi-2.14.1/plugins/rtas/rtas_reset.c0000644000076400007640000000226611302567000015142 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005,2006 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * Renier Morales * Daniel de Araujo */ #include SaErrorT rtas_get_reset_state(void *hnd, SaHpiResourceIdT id, SaHpiResetActionT *act) { return SA_ERR_HPI_CAPABILITY; } SaErrorT rtas_set_reset_state(void *hnd, SaHpiResourceIdT id, SaHpiResetActionT act) { return SA_ERR_HPI_CAPABILITY; } void * oh_get_reset_state (void *, SaHpiResourceIdT, SaHpiResetActionT *) __attribute__ ((weak, alias("rtas_get_reset_state"))); void * oh_set_reset_state (void *, SaHpiResourceIdT, SaHpiResetActionT) __attribute__ ((weak, alias("rtas_set_reset_state"))); openhpi-2.14.1/plugins/rtas/rtas_event.h0000644000076400007640000000127411302567000015144 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * Renier Morales * Daniel de Araujo */ #ifndef RTAS_EVENT_H #define RTAS_EVENT_H #include #include #include #include SaErrorT rtas_get_event(void *hnd); #endif openhpi-2.14.1/plugins/rtas/rtas_discover.c0000644000076400007640000010054011302567000015630 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005,2006 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * Renier Morales * Daniel de Araujo */ #include #include #include #include #include #include #include #include #include #include #include SaErrorT rtas_discover_resources(void *hnd) { SaErrorT error = SA_OK; struct oh_handler_state *h = (struct oh_handler_state *)hnd; static int did_discovery = 0; char *entity_root = NULL; SaHpiEntityPathT root_ep; SaHpiRptEntryT lone_res; if (did_discovery) { return SA_OK; } if (!hnd) { err("Null handle!"); return SA_ERR_HPI_INVALID_PARAMS; } entity_root = (char *)g_hash_table_lookup(h->config, "entity_root"); if (entity_root == NULL) { err("Could not aquire entity_root parameter."); return SA_ERR_HPI_INTERNAL_ERROR; } error = oh_encode_entitypath(entity_root, &root_ep); if (error) { err("Could not convert entity path to string. Error=%s.", oh_lookup_error(error)); return SA_ERR_HPI_INTERNAL_ERROR; } // Discover lone resource lone_res.ResourceEntity = root_ep; lone_res.ResourceCapabilities = SAHPI_CAPABILITY_RESOURCE | SAHPI_CAPABILITY_RDR | SAHPI_CAPABILITY_SENSOR | SAHPI_CAPABILITY_INVENTORY_DATA | SAHPI_CAPABILITY_POWER; lone_res.ResourceSeverity = SAHPI_MAJOR; oh_init_textbuffer(&lone_res.ResourceTag); oh_append_textbuffer(&lone_res.ResourceTag, entity_root); lone_res.ResourceId = oh_uid_from_entity_path(&lone_res.ResourceEntity); error = oh_add_resource(h->rptcache, &lone_res, NULL, FREE_RPT_DATA); if (!error) { struct oh_event *e = (struct oh_event *)g_malloc0(sizeof(struct oh_event)); e->hid = h->hid; e->event.EventType = SAHPI_ET_RESOURCE; e->resource = lone_res; e->event.Source = lone_res.ResourceId; e->event.Severity = lone_res.ResourceSeverity; e->event.Timestamp = SAHPI_TIME_UNSPECIFIED; e->event.EventDataUnion.ResourceEvent.ResourceEventType = SAHPI_RESE_RESOURCE_ADDED; // Discover sensors error = rtas_discover_sensors(h, e); // Discover Inventory error = rtas_discover_inventory(h, e); oh_evt_queue_push(h->eventq, e); } else { err("Error adding resource. %s", oh_lookup_error(error)); return error; } if (!error) did_discovery = 1; return error; } /** * rtas_discover_sensors: * @h: Pointer to handler's data. * @e: Pointer to resource's event structure. * * Discovers resource's available sensors and its events. * * Return values: * Adds sensor RDRs to internal Infra-structure queues - normal case * SA_ERR_HPI_OUT_OF_SPACE - Cannot allocate space for internal memory. * SA_ERR_HPI_INVALID_PARAMS - incoming parameters are NULL. **/ SaErrorT rtas_discover_sensors(struct oh_handler_state *h, struct oh_event *e) { FILE *file = NULL; struct sensor_pair { SaHpiUint32T token; SaHpiUint32T max_index; } chunk; int sensor_num = 0; //char err_buf[SAHPI_MAX_TEXT_BUFFER_LENGTH]; SaHpiUint32T token, max_index, index = 0; SaHpiInt32T val, state; struct SensorInfo *sensor_info; if (!h || !e) { return SA_ERR_HPI_INVALID_PARAMS; } /* open the binary file and read the indexes */ file = fopen(RTAS_SENSORS_PATH, "r"); if (!file) { err("Error reading RTAS sensor file %s.", RTAS_SENSORS_PATH); return SA_ERR_HPI_INTERNAL_ERROR; } /* The rtas-sensors file is layed out in the following fashion : * * 32-bit-integer-token 32-bit-integer-index ... * * As a result, we read the first 32-bit chunk to establish * the type of sensor is in the system. We then read the next * 32-bit chunk to determine how many sensors exist of type * token. This process repeats until we've reached EOL. * Note, sensor indices are not necessarily contiguous. */ while (fread(&chunk, sizeof(struct sensor_pair), 1, file) == 1) { token = chunk.token; max_index = chunk.max_index; /* Make sure we didn't get bogus tokens */ if ( token != RTAS_RESERVED_SENSOR_2 && token != RTAS_RESERVED_SENSOR_4 && token != RTAS_RESERVED_SENSOR_5 && token != RTAS_RESERVED_SENSOR_6 && token != RTAS_RESERVED_SENSOR_7 && token != RTAS_RESERVED_SENSOR_8 && token != RTAS_RESERVED_SENSOR_10 && token != RTAS_RESERVED_SENSOR_11 && token != RTAS_RESERVED_SENSOR_9008 ) { /* Now that we have the token and the index, we can * grab the specific data about the sensor and build the RDR. */ for (index = 0; index <= max_index; index++) { /* We cannot assume that there are sensors in each index leading up * up the maxIndex. We must determine whether the sensor actually * exists. We do this by calling rtas_get_sensor. Note: A return * value of "-3" means the sensor does not exist. */ state = rtas_get_sensor(token, index, &val); if (state != -3) { SaHpiRdrT *rdr = (SaHpiRdrT *)g_malloc0(sizeof(SaHpiRdrT)); sensor_info = (struct SensorInfo*)g_malloc0(sizeof(struct SensorInfo)); if (!rdr || !sensor_info) { err("Out of memory."); return SA_ERR_HPI_OUT_OF_SPACE; } rdr->RdrType = SAHPI_SENSOR_RDR; rdr->Entity = e->resource.ResourceEntity; /* Do entity path business */ //rtas_modify_sensor_ep(); //needs more research /* For now, assume sensor number represents a count. If we decide later to * create an RPT for each sensor type (and fill in the RDRs that consist of * the sensor type), then the num will need to be reset. */ rdr->RdrTypeUnion.SensorRec.Num = sensor_num++; populate_rtas_sensor_rec_info(token, &(rdr->RdrTypeUnion.SensorRec)); rdr->RdrTypeUnion.SensorRec.Category = SAHPI_EC_THRESHOLD | SAHPI_EC_SEVERITY; rdr->RdrTypeUnion.SensorRec.EventCtrl = SAHPI_SEC_READ_ONLY; rdr->RdrTypeUnion.SensorRec.Events = SAHPI_ES_OK | SAHPI_ES_LOWER_MINOR | SAHPI_ES_LOWER_CRIT | SAHPI_ES_UPPER_MINOR |SAHPI_ES_UPPER_CRIT; rdr->RdrTypeUnion.SensorRec.ThresholdDefn.IsAccessible = SAHPI_FALSE; sensor_info->token = token; sensor_info->index = index; sensor_info->enabled = SAHPI_TRUE; if ( (token == RTAS_SECURITY_SENSOR) || (token == RTAS_SURVEILLANCE_SENSOR) ) { if (val == 0) { sensor_info->enabled = SAHPI_FALSE; } } sensor_info->current_val = val; switch ((rtasSensorState)state) { case SENSOR_OK: sensor_info->current_state = SAHPI_ES_UNSPECIFIED; break; case SENSOR_CRITICAL_LOW: sensor_info->current_state = SAHPI_ES_LOWER_CRIT; break; case SENSOR_WARNING_LOW: sensor_info->current_state = SAHPI_ES_LOWER_MINOR; break; case SENSOR_NORMAL: sensor_info->current_state = SAHPI_ES_OK; break; case SENSOR_WARNING_HIGH: sensor_info->current_state = SAHPI_ES_UPPER_MINOR; break; case SENSOR_CRITICAL_HIGH: sensor_info->current_state = SAHPI_ES_UPPER_CRIT; break; default: sensor_info->current_state = SAHPI_ES_UNSPECIFIED; break; } rtas_get_sensor_location_code(token, index, sensor_info->sensor_location); oh_add_rdr(h->rptcache, e->resource.ResourceId, rdr, sensor_info, 0); e->rdrs = g_slist_append(e->rdrs, rdr); } } } } fclose(file); return SA_OK; } /** * populate_rtas_sensor_info * * @data - pointer to the location of the SaHpiSensorRecT. * @token - the sensor type. * * @return - writes the specific sensor info based on the type * of sensor. */ void populate_rtas_sensor_rec_info(int token, SaHpiSensorRecT *sensor_info) { if (!sensor_info) return; sensor_info->DataFormat.IsSupported = SAHPI_TRUE; switch ((rtasSensorToken)token) { case RTAS_SECURITY_SENSOR: sensor_info->EnableCtrl = SAHPI_FALSE; sensor_info->Type = SAHPI_PHYSICAL_SECURITY; sensor_info->DataFormat.IsSupported = SAHPI_TRUE; sensor_info->DataFormat.ReadingType = SAHPI_SENSOR_READING_TYPE_UINT64; sensor_info->DataFormat.BaseUnits = SAHPI_SU_CHARACTERS; sensor_info->DataFormat.ModifierUnits = SAHPI_SU_UNSPECIFIED; sensor_info->DataFormat.ModifierUse = SAHPI_SMUU_NONE; sensor_info->DataFormat.Percentage = SAHPI_FALSE; sensor_info->DataFormat.Range.Flags = SAHPI_SRF_MAX | SAHPI_SRF_MIN; sensor_info->DataFormat.Range.Max.IsSupported = SAHPI_TRUE; sensor_info->DataFormat.Range.Max.Type = SAHPI_SENSOR_READING_TYPE_UINT64; sensor_info->DataFormat.Range.Max.Value.SensorUint64 = 3; sensor_info->DataFormat.Range.Min.IsSupported = SAHPI_TRUE; sensor_info->DataFormat.Range.Min.Type = SAHPI_SENSOR_READING_TYPE_UINT64; sensor_info->DataFormat.Range.Min.Value.SensorUint64 = 0; break; case RTAS_THERMAL_SENSOR: sensor_info->EnableCtrl = SAHPI_FALSE; sensor_info->Type = SAHPI_TEMPERATURE; sensor_info->DataFormat.IsSupported = SAHPI_TRUE; sensor_info->DataFormat.ReadingType = SAHPI_SENSOR_READING_TYPE_INT64; sensor_info->DataFormat.BaseUnits = SAHPI_SU_DEGREES_C; sensor_info->DataFormat.ModifierUnits = SAHPI_SU_UNSPECIFIED; sensor_info->DataFormat.ModifierUse = SAHPI_SMUU_NONE; sensor_info->DataFormat.Percentage = SAHPI_FALSE; sensor_info->DataFormat.Range.Flags = SAHPI_SRF_MAX | SAHPI_SRF_MIN; sensor_info->DataFormat.Range.Max.IsSupported = SAHPI_TRUE; sensor_info->DataFormat.Range.Max.Type = SAHPI_SENSOR_READING_TYPE_INT64; sensor_info->DataFormat.Range.Min.IsSupported = SAHPI_TRUE; sensor_info->DataFormat.Range.Min.Type = SAHPI_SENSOR_READING_TYPE_INT64; break; case RTAS_POWER_STATE_SENSOR: sensor_info->EnableCtrl = SAHPI_FALSE; sensor_info->Type = SAHPI_SYSTEM_ACPI_POWER_STATE; sensor_info->DataFormat.IsSupported = SAHPI_TRUE; sensor_info->DataFormat.ReadingType = SAHPI_SENSOR_READING_TYPE_UINT64; sensor_info->DataFormat.BaseUnits = SAHPI_SU_CHARACTERS; sensor_info->DataFormat.ModifierUnits = SAHPI_SU_UNSPECIFIED; sensor_info->DataFormat.ModifierUse = SAHPI_SMUU_NONE; sensor_info->DataFormat.Percentage = SAHPI_FALSE; sensor_info->DataFormat.Range.Flags = SAHPI_SRF_MAX | SAHPI_SRF_MIN; sensor_info->DataFormat.Range.Max.IsSupported = SAHPI_TRUE; sensor_info->DataFormat.Range.Max.Type = SAHPI_SENSOR_READING_TYPE_UINT64; sensor_info->DataFormat.Range.Max.Value.SensorUint64 = 7; sensor_info->DataFormat.Range.Min.IsSupported = SAHPI_TRUE; sensor_info->DataFormat.Range.Min.Type = SAHPI_SENSOR_READING_TYPE_UINT64; sensor_info->DataFormat.Range.Min.Value.SensorUint64 = 0; break; case RTAS_SURVEILLANCE_SENSOR: sensor_info->EnableCtrl = SAHPI_FALSE; sensor_info->Type = SAHPI_MANAGEMENT_SUBSYSTEM_HEALTH; sensor_info->DataFormat.ReadingType = SAHPI_SENSOR_READING_TYPE_UINT64; sensor_info->DataFormat.BaseUnits = SAHPI_SU_MINUTE; sensor_info->DataFormat.ModifierUnits = SAHPI_SU_UNSPECIFIED; sensor_info->DataFormat.ModifierUse = SAHPI_SMUU_NONE; sensor_info->DataFormat.Percentage = SAHPI_FALSE; sensor_info->DataFormat.Range.Flags = SAHPI_SRF_MAX | SAHPI_SRF_MIN; sensor_info->DataFormat.Range.Max.IsSupported = SAHPI_TRUE; sensor_info->DataFormat.Range.Max.Type = SAHPI_SENSOR_READING_TYPE_UINT64; sensor_info->DataFormat.Range.Max.Value.SensorUint64 = 255; sensor_info->DataFormat.Range.Min.IsSupported = SAHPI_TRUE; sensor_info->DataFormat.Range.Min.Type = SAHPI_SENSOR_READING_TYPE_UINT64; sensor_info->DataFormat.Range.Min.Value.SensorUint64 = 0; break; case RTAS_FAN_SENSOR: sensor_info->EnableCtrl = SAHPI_FALSE; sensor_info->Type = SAHPI_FAN; sensor_info->DataFormat.IsSupported = SAHPI_TRUE; sensor_info->DataFormat.ReadingType = SAHPI_SENSOR_READING_TYPE_UINT64; sensor_info->DataFormat.BaseUnits = SAHPI_SU_RPM; sensor_info->DataFormat.ModifierUnits = SAHPI_SU_UNSPECIFIED; sensor_info->DataFormat.ModifierUse = SAHPI_SMUU_NONE; sensor_info->DataFormat.Percentage = SAHPI_FALSE; sensor_info->DataFormat.Range.Flags = SAHPI_SRF_MAX | SAHPI_SRF_MIN; sensor_info->DataFormat.Range.Max.IsSupported = SAHPI_TRUE; sensor_info->DataFormat.Range.Max.Type = SAHPI_SENSOR_READING_TYPE_UINT64; sensor_info->DataFormat.Range.Min.IsSupported = SAHPI_TRUE; sensor_info->DataFormat.Range.Min.Type = SAHPI_SENSOR_READING_TYPE_UINT64; break; case RTAS_VOLTAGE_SENSOR: sensor_info->EnableCtrl = SAHPI_FALSE; sensor_info->Type = SAHPI_VOLTAGE; sensor_info->DataFormat.IsSupported = SAHPI_TRUE; sensor_info->DataFormat.ReadingType = SAHPI_SENSOR_READING_TYPE_INT64; sensor_info->DataFormat.BaseUnits = SAHPI_SU_VOLTS; sensor_info->DataFormat.ModifierUnits = SAHPI_SU_UNSPECIFIED; sensor_info->DataFormat.ModifierUse = SAHPI_SMUU_NONE; sensor_info->DataFormat.Percentage = SAHPI_FALSE; sensor_info->DataFormat.Range.Flags = SAHPI_SRF_MAX | SAHPI_SRF_MIN; sensor_info->DataFormat.Range.Max.IsSupported = SAHPI_TRUE; sensor_info->DataFormat.Range.Max.Type = SAHPI_SENSOR_READING_TYPE_INT64; sensor_info->DataFormat.Range.Min.IsSupported = SAHPI_TRUE; sensor_info->DataFormat.Range.Min.Type = SAHPI_SENSOR_READING_TYPE_INT64; break; case RTAS_CONNECTOR_SENSOR: sensor_info->EnableCtrl = SAHPI_FALSE; sensor_info->Type = SAHPI_SLOT_CONNECTOR; sensor_info->DataFormat.IsSupported = SAHPI_TRUE; sensor_info->DataFormat.ReadingType = SAHPI_SENSOR_READING_TYPE_UINT64; sensor_info->DataFormat.BaseUnits = SAHPI_SU_UNSPECIFIED; sensor_info->DataFormat.ModifierUnits = SAHPI_SU_UNSPECIFIED; sensor_info->DataFormat.ModifierUse = SAHPI_SMUU_NONE; sensor_info->DataFormat.Percentage = SAHPI_FALSE; sensor_info->DataFormat.Range.Flags = SAHPI_SRF_MAX | SAHPI_SRF_MIN; sensor_info->DataFormat.Range.Max.IsSupported = SAHPI_TRUE; sensor_info->DataFormat.Range.Max.Type = SAHPI_SENSOR_READING_TYPE_UINT64; sensor_info->DataFormat.Range.Max.Value.SensorUint64 = 4; sensor_info->DataFormat.Range.Min.IsSupported = SAHPI_TRUE; sensor_info->DataFormat.Range.Min.Type = SAHPI_SENSOR_READING_TYPE_UINT64; sensor_info->DataFormat.Range.Min.Value.SensorUint64 = 0; break; case RTAS_POWER_SUPPLY_SENSOR: sensor_info->EnableCtrl = SAHPI_FALSE; sensor_info->Type = SAHPI_POWER_SUPPLY; sensor_info->DataFormat.IsSupported = SAHPI_TRUE; sensor_info->DataFormat.ReadingType = SAHPI_SENSOR_READING_TYPE_UINT64; sensor_info->DataFormat.BaseUnits = SAHPI_SU_UNSPECIFIED; sensor_info->DataFormat.ModifierUnits = SAHPI_SU_UNSPECIFIED; sensor_info->DataFormat.ModifierUse = SAHPI_SMUU_NONE; sensor_info->DataFormat.Percentage = SAHPI_FALSE; sensor_info->DataFormat.Range.Flags = SAHPI_SRF_MAX | SAHPI_SRF_MIN; sensor_info->DataFormat.Range.Max.IsSupported = SAHPI_TRUE; sensor_info->DataFormat.Range.Max.Type = SAHPI_SENSOR_READING_TYPE_UINT64; sensor_info->DataFormat.Range.Max.Value.SensorUint64 = 3; sensor_info->DataFormat.Range.Min.IsSupported = SAHPI_TRUE; sensor_info->DataFormat.Range.Min.Type = SAHPI_SENSOR_READING_TYPE_UINT64; sensor_info->DataFormat.Range.Min.Value.SensorUint64 = 0; break; case RTAS_GIQ_SENSOR: sensor_info->EnableCtrl = SAHPI_TRUE; sensor_info->Type = SAHPI_CRITICAL_INTERRUPT; sensor_info->DataFormat.IsSupported = SAHPI_TRUE; sensor_info->DataFormat.ReadingType = SAHPI_SENSOR_READING_TYPE_UINT64; sensor_info->DataFormat.BaseUnits = SAHPI_SU_UNSPECIFIED; sensor_info->DataFormat.ModifierUnits = SAHPI_SU_UNSPECIFIED; sensor_info->DataFormat.ModifierUse = SAHPI_SMUU_NONE; sensor_info->DataFormat.Percentage = SAHPI_FALSE; sensor_info->DataFormat.Range.Flags = SAHPI_SRF_MAX | SAHPI_SRF_MIN; sensor_info->DataFormat.Range.Max.IsSupported = SAHPI_TRUE; sensor_info->DataFormat.Range.Max.Type = SAHPI_SENSOR_READING_TYPE_UINT64; sensor_info->DataFormat.Range.Max.Value.SensorUint64 = 1; sensor_info->DataFormat.Range.Min.IsSupported = SAHPI_TRUE; sensor_info->DataFormat.Range.Min.Type = SAHPI_SENSOR_READING_TYPE_UINT64; sensor_info->DataFormat.Range.Min.Value.SensorUint64 = 0; break; case RTAS_SYSTEM_ATTENTION_SENSOR: sensor_info->EnableCtrl = SAHPI_FALSE; sensor_info->Type = SAHPI_PLATFORM_ALERT; sensor_info->DataFormat.IsSupported = SAHPI_TRUE; sensor_info->DataFormat.ReadingType = SAHPI_SENSOR_READING_TYPE_UINT64; sensor_info->DataFormat.BaseUnits = SAHPI_SU_UNSPECIFIED; sensor_info->DataFormat.ModifierUnits = SAHPI_SU_UNSPECIFIED; sensor_info->DataFormat.ModifierUse = SAHPI_SMUU_NONE; sensor_info->DataFormat.Percentage = SAHPI_FALSE; sensor_info->DataFormat.Range.Flags = SAHPI_SRF_MAX | SAHPI_SRF_MIN; sensor_info->DataFormat.Range.Max.IsSupported = SAHPI_TRUE; sensor_info->DataFormat.Range.Max.Type = SAHPI_SENSOR_READING_TYPE_UINT64; sensor_info->DataFormat.Range.Max.Value.SensorUint64 = 1; sensor_info->DataFormat.Range.Min.IsSupported = SAHPI_TRUE; sensor_info->DataFormat.Range.Min.Type = SAHPI_SENSOR_READING_TYPE_UINT64; sensor_info->DataFormat.Range.Min.Value.SensorUint64 = 0; break; case RTAS_IDENTIFY_INDICATOR_SENSOR: sensor_info->EnableCtrl = SAHPI_FALSE; sensor_info->Type = SAHPI_OTHER_FRU; sensor_info->DataFormat.ReadingType = SAHPI_SENSOR_READING_TYPE_UINT64; sensor_info->DataFormat.BaseUnits = SAHPI_SU_UNSPECIFIED; sensor_info->DataFormat.ModifierUnits = SAHPI_SU_UNSPECIFIED; sensor_info->DataFormat.ModifierUse = SAHPI_SMUU_NONE; sensor_info->DataFormat.Percentage = SAHPI_FALSE; sensor_info->DataFormat.Range.Flags = SAHPI_SRF_MAX | SAHPI_SRF_MIN; sensor_info->DataFormat.Range.Max.IsSupported = SAHPI_TRUE; sensor_info->DataFormat.Range.Max.Type = SAHPI_SENSOR_READING_TYPE_UINT64; sensor_info->DataFormat.Range.Max.Value.SensorUint64 = 1; sensor_info->DataFormat.Range.Min.IsSupported = SAHPI_TRUE; sensor_info->DataFormat.Range.Min.Type = SAHPI_SENSOR_READING_TYPE_UINT64; sensor_info->DataFormat.Range.Min.Value.SensorUint64 = 0; break; case RTAS_COMPONENT_RESET_STATE_SENSOR: sensor_info->EnableCtrl = SAHPI_FALSE; sensor_info->Type = SAHPI_OPERATIONAL; sensor_info->DataFormat.ReadingType = SAHPI_SENSOR_READING_TYPE_UINT64; sensor_info->DataFormat.BaseUnits = SAHPI_SU_UNSPECIFIED; sensor_info->DataFormat.ModifierUnits = SAHPI_SU_UNSPECIFIED; sensor_info->DataFormat.ModifierUse = SAHPI_SMUU_NONE; sensor_info->DataFormat.Percentage = SAHPI_FALSE; sensor_info->DataFormat.Range.Flags = SAHPI_SRF_MAX | SAHPI_SRF_MIN; sensor_info->DataFormat.Range.Max.IsSupported = SAHPI_TRUE; sensor_info->DataFormat.Range.Max.Type = SAHPI_SENSOR_READING_TYPE_UINT64; sensor_info->DataFormat.Range.Max.Value.SensorUint64 = 2; sensor_info->DataFormat.Range.Min.IsSupported = SAHPI_TRUE; sensor_info->DataFormat.Range.Min.Type = SAHPI_SENSOR_READING_TYPE_UINT64; sensor_info->DataFormat.Range.Min.Value.SensorUint64 = 0; break; default: sensor_info->EnableCtrl = SAHPI_FALSE; sensor_info->Type = SAHPI_OEM_SENSOR; sensor_info->DataFormat.ReadingType = SAHPI_SENSOR_READING_TYPE_UINT64; sensor_info->DataFormat.BaseUnits = SAHPI_SU_UNSPECIFIED; sensor_info->DataFormat.ModifierUnits = SAHPI_SU_UNSPECIFIED; sensor_info->DataFormat.ModifierUse = SAHPI_SMUU_NONE; sensor_info->DataFormat.Percentage = SAHPI_FALSE; sensor_info->DataFormat.Range.Flags = SAHPI_SRF_MAX | SAHPI_SRF_MIN; sensor_info->DataFormat.Range.Max.IsSupported = SAHPI_FALSE; sensor_info->DataFormat.Range.Min.IsSupported = SAHPI_FALSE; break; } } /** * rtas_discover_inventory: * @h: Pointer to handler's data. * @e: Pointer to resource's event structure. * * Discovers resource's available inventory fields. * * Return values: * Adds inventory RDRs to internal Infra-structure queues - normal case * SA_ERR_HPI_OUT_OF_SPACE - Cannot allocate space for internal memory. * SA_ERR_HPI_INVALID_PARAMS - incoming parameters are NULL. **/ SaErrorT rtas_discover_inventory(struct oh_handler_state *h, struct oh_event *e) { const int MAXLINE = 64; char line[MAXLINE]; FILE *file = NULL; SaHpiInventoryRecT irec; struct oh_rtas_idr oh_idr; struct oh_rtas_idr_area *oh_area = NULL; if (!h || !e) { return SA_ERR_HPI_INVALID_PARAMS; } /* Prepare Inventory Data Record headers */ irec.IdrId = oh_idr.hpi_idr.IdrId = SAHPI_DEFAULT_INVENTORY_ID; irec.Persistent = SAHPI_FALSE; irec.Oem = 0; oh_idr.hpi_idr.ReadOnly = SAHPI_TRUE; /* open the binary file and read the indexes */ file = popen(LSVPD_CMD, "r"); if (!file) { err("Error finding rtas inventory command %s", LSVPD_CMD); return SA_ERR_HPI_INTERNAL_ERROR; } /* Loop through output. Create area(s) with fields (more than one area based on blocks) */ while (fgets(line, MAXLINE, file) != NULL) { /* Parse two columns of output. First one tells the field type, */ /* second, one tells the data.*/ /* Write switch statement on it to create new area and/or field */ char type[3]; if (strlen(line) < 5) { /* Check line. 5 chars long at least. */ err("Bad line from " LSVPD_CMD); pclose(file); return SA_ERR_HPI_INTERNAL_ERROR; } strncpy(type, (line+1), sizeof(char)*2); type[2] = '\0'; if (strncmp(type, "VC", sizeof(char)*2) == 0 || strncmp(type, "DS", sizeof(char)*2) == 0) { /* Create new area */ oh_area = g_new0(struct oh_rtas_idr_area, 1); oh_area->hpi_idr_area.AreaId = ++oh_idr.hpi_idr.NumAreas; oh_area->hpi_idr_area.ReadOnly = SAHPI_TRUE; oh_area->hpi_idr_area.Type = rtas_get_idr_area_type(type); oh_idr.areas = g_slist_append(oh_idr.areas, oh_area); } if (oh_area) { /* Create field */ SaHpiIdrFieldT *field = g_new0(SaHpiIdrFieldT, 1); field->AreaId = oh_area->hpi_idr_area.AreaId; field->FieldId = ++oh_area->hpi_idr_area.NumFields; field->Type = rtas_get_idr_field_type(type); field->ReadOnly = SAHPI_TRUE; oh_init_textbuffer(&field->Field); oh_append_textbuffer(&field->Field, line+4); oh_area->fields = g_slist_append(oh_area->fields, field); } else { err("Bad Error creating field. There is no area yet."); pclose(file); return SA_ERR_HPI_INTERNAL_ERROR; } } pclose(file); /* Publish IDR headers: */ /* Memdup idr_info, add as data to idr_rec (add idr_rec to rptcache). Create rdr event. */ SaHpiRdrT *rdr = (SaHpiRdrT *)g_malloc0(sizeof(SaHpiRdrT)); rdr->RdrType = SAHPI_INVENTORY_RDR; rdr->Entity = e->resource.ResourceEntity; oh_init_textbuffer(&rdr->IdString); oh_append_textbuffer(&rdr->IdString, LSVPD_CMD); rdr->RdrTypeUnion.InventoryRec = irec; oh_add_rdr(h->rptcache, e->resource.ResourceId, rdr, g_memdup(&oh_idr, sizeof(struct oh_rtas_idr)), 0); e->rdrs = g_slist_append(e->rdrs, rdr); return SA_OK; } void * oh_discover_resources (void *) __attribute__ ((weak, alias("rtas_discover_resources"))); openhpi-2.14.1/plugins/rtas/rtas_event.c0000644000076400007640000000147011302567000015135 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * Renier Morales * Daniel de Araujo */ #include SaErrorT rtas_get_event(void *hnd) { if (!hnd) { err("Invalid parameter"); return(SA_ERR_HPI_INVALID_PARAMS); } return SA_OK; } void * oh_get_event (void *) __attribute__ ((weak, alias("rtas_get_event"))); openhpi-2.14.1/plugins/rtas/rtas_power.c0000644000076400007640000000310111302567000015141 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005,2006 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * Renier Morales * Daniel de Araujo */ #include #include SaErrorT rtas_get_power_state(void *hnd, SaHpiResourceIdT id, SaHpiPowerStateT *state) { *state = SAHPI_POWER_ON; return SA_OK; } SaErrorT rtas_set_power_state(void *hnd, SaHpiResourceIdT id, SaHpiPowerStateT state) { int setlevel, rc; if (state == SAHPI_POWER_OFF) { rc = rtas_set_power_level(0, 0, &setlevel); if (rc > -1 && setlevel == 0) return SA_OK; else if (rc > -1 && setlevel != 0) return SA_ERR_HPI_BUSY; else return SA_ERR_HPI_INTERNAL_ERROR; } else { return SA_ERR_HPI_INTERNAL_ERROR; } } void * oh_get_power_state (void *, SaHpiResourceIdT, SaHpiPowerStateT *) __attribute__ ((weak, alias("rtas_get_power_state"))); void * oh_set_power_state (void *, SaHpiResourceIdT, SaHpiPowerStateT) __attribute__ ((weak, alias("rtas_set_power_state"))); openhpi-2.14.1/plugins/rtas/rtas_indicator.c0000644000076400007640000000251011302567000015764 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * Renier Morales * Daniel de Araujo */ #include SaErrorT rtas_get_indicator_state(void *hnd, SaHpiResourceIdT id, SaHpiHsIndicatorStateT *state) { return SA_ERR_HPI_INTERNAL_ERROR; } SaErrorT rtas_set_indicator_state(void *hnd, SaHpiResourceIdT id, SaHpiHsIndicatorStateT state) { return SA_ERR_HPI_INTERNAL_ERROR; } void * oh_get_indicator_state (void *, SaHpiResourceIdT, SaHpiHsIndicatorStateT *) __attribute__ ((weak, alias("rtas_get_indicator_state"))); void * oh_set_indicator_state (void *, SaHpiResourceIdT, SaHpiHsIndicatorStateT) __attribute__ ((weak, alias("rtas_set_indicator_state"))); openhpi-2.14.1/plugins/rtas/rtas_reset.h0000644000076400007640000000164111302567000015143 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * Renier Morales * Daniel de Araujo */ #ifndef RTAS_RESET_H #define RTAS_RESET_H #include #include SaErrorT rtas_get_reset_state(void *hnd, SaHpiResourceIdT id, SaHpiResetActionT *act); SaErrorT rtas_set_reset_state(void *hnd, SaHpiResourceIdT id, SaHpiResetActionT act); #endif openhpi-2.14.1/plugins/ipmi/0000755000076400007640000000000011405006365012610 5ustar openhpi-2.14.1/plugins/ipmi/atca_shelf_rdrs.c0000644000076400007640000015635711302567001016113 0ustar /* -*- linux-c -*- * * Copyright (c) 2005 by Intel Corp. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Vadim Revyakin */ #include "ipmi.h" #include #define uchar unsigned char int ipmicmd_send(ipmi_domain_t *domain, uchar netfn, uchar cmd, uchar lun, uchar chan, uchar *pdata, uchar sdata, ipmi_addr_response_handler_t handler, void *handler_data); static void init_power_on_sequence_data_cb(ipmi_entity_t *entity, void *cb_data) { struct ohoi_handler *ipmi_handler = cb_data; ipmi_fru_t *fru = ipmi_entity_get_fru(entity); unsigned int num, r_num; unsigned int len; int broken = 0; unsigned char data[256]; unsigned char type, ver; ohoi_atca_pwonseq_rec_t *recp = NULL; ohoi_atca_pwonseq_dsk_t *dscp = NULL; int i; int rv; g_slist_foreach(ipmi_handler->atca_pwonseq_recs, (GFunc)g_free, NULL); g_slist_free(ipmi_handler->atca_pwonseq_recs); g_slist_foreach(ipmi_handler->atca_pwonseq_desk, (GFunc)g_free, NULL); g_slist_free(ipmi_handler->atca_pwonseq_desk); ipmi_handler->atca_pwonseq_recs = NULL; ipmi_handler->atca_pwonseq_desk = NULL; ipmi_handler->atca_pwonseq_updated = 0; r_num = ipmi_entity_get_num_multi_records(entity); for (num = 0; num < r_num; num++) { len = 256; rv = ipmi_fru_get_multi_record_data(fru, num, data, &len); if (rv != 0) { err("ipmi_fru_get_multi_record_data(" "fru, %d, data, 0x%x) = 0x%x", num, len, rv); broken = 1; break; } rv = ipmi_fru_get_multi_record_type(fru, num, &type); if (rv) { err("ipmi_entity_get_multi_record_type = %d", rv); broken = 1; break; } if (type != 0xc0) { // record type. Must be OEM err("Record type = 0x%x", data[0]); continue; } rv = ipmi_fru_get_multi_record_format_version(fru, num, &ver); if (rv) { err("ipmi_entity_get_multi_record_format_version = %d", rv); broken = 1; break; } if ((ver & 0x0f) != 0x2) { // must be 2 for PICMG 3.0 ATCA vD1.0 continue; } if (len < 5) { continue; } if ((data[0] | (data[1] << 8) | (data[2] << 16)) != ATCAHPI_PICMG_MID) { err("MId = 0x%x", data[0] | (data[1] << 8) | (data[2] << 16)); continue; } if (data[3] != 0x12) { continue; } if (len < 7) { err("Record #%d too short(%d)", num, len); broken = 1; break; } if (len < 7 + data[6] * 5) { err("Record #%d length(0x%x) mismatches with expected(0x%x)", num, len, 7 + data[6] * 5); broken = 1; break; } recp = malloc(sizeof (ohoi_atca_pwonseq_rec_t)); if (recp) { memcpy(&recp->head, data, 7); recp->updated = 0; recp->rec_num = num; ipmi_handler->atca_pwonseq_recs = g_slist_append(ipmi_handler->atca_pwonseq_recs, recp); } else { err("Out of memory"); broken = 1; break; } for (i = 0; i < data[6]; i++) { dscp = malloc(sizeof (ohoi_atca_pwonseq_dsk_t)); if (dscp) { memcpy(&dscp->body, &data[7 + 5 * i], 5); dscp->slotid = 0; ipmi_handler->atca_pwonseq_desk = g_slist_append( ipmi_handler->atca_pwonseq_desk, dscp); } else { err("Out of memory"); broken = 1; break; } } } if (broken) { // XXX delete all alloced memory } } /* * Chassis status control */ struct atca_chassis_status_control_s { SaHpiCtrlStateOemT *state; int done; SaErrorT rv; }; SaErrorT get_atca_chassis_status_control_state( struct oh_handler_state *hnd, struct ohoi_control_info *c, SaHpiRdrT * rdr, SaHpiCtrlModeT *mode, SaHpiCtrlStateT *state); SaErrorT set_atca_chassis_status_control_state( struct oh_handler_state *hnd, struct ohoi_control_info *c, SaHpiRdrT * rdr, SaHpiCtrlModeT mode, SaHpiCtrlStateT *state); static int get_atca_chassis_status_control_states_cb( ipmi_domain_t *domain, ipmi_msgi_t *rspi) { struct atca_chassis_status_control_s *info = rspi->data1; ipmi_msg_t *msg = &rspi->msg; int rv = msg->data[0]; dbg("get chassis response(%d): %02x %02x %02x %02x %02x\n", msg->data_len, msg->data[0], msg->data[1], msg->data[2], msg->data[3], msg->data[4]); if (domain == NULL) { info->rv = SA_ERR_HPI_INVALID_PARAMS; info->done = 1; return IPMI_MSG_ITEM_NOT_USED; } if (rv == 0xc1) { info->rv = SA_ERR_HPI_INVALID_CMD; } else if (rv == 0xc3) { info->rv = SA_ERR_HPI_NO_RESPONSE; } else if (rv != 0) { info->rv = SA_ERR_HPI_INVALID_PARAMS; } else { info->state->Body[0] = msg->data[1]; info->state->Body[1] = msg->data[2]; info->state->Body[2] = msg->data[3]; if (msg->data_len > 3) { info->state->Body[3] = msg->data[4]; } else { info->state->Body[3] = 0; } info->state->BodyLength = 4; info->state->MId = ATCAHPI_PICMG_MID; } info->done = 1; return IPMI_MSG_ITEM_NOT_USED; }; static void get_atca_chassis_status_control_states( ipmi_domain_t *domain, void *cb_data) { struct atca_chassis_status_control_s *info = cb_data; unsigned char data[16]; int rv; memset(data, 0, 16); rv = ipmicmd_send(domain, 0x00, 0x01, 0, IPMI_BMC_CHANNEL, data, 0, get_atca_chassis_status_control_states_cb, cb_data); if (rv != 0) { err("ipmicmd_send = 0x%x", rv); OHOI_MAP_ERROR(info->rv, rv); return; } return; } static SaHpiRdrT *create_atca_chassis_status_control( struct ohoi_handler *ipmi_handler, SaHpiRptEntryT *rpt, struct ohoi_control_info **ctrl_info ) { SaHpiRdrT *rdr; struct ohoi_control_info *c_info; SaHpiCtrlStateOemT states; SaErrorT rv; struct atca_chassis_status_control_s info; info.state = &states; info.done = 0; info.rv = SA_OK; rv = ipmi_domain_pointer_cb(ipmi_handler->domain_id, get_atca_chassis_status_control_states, &info); if (rv != 0) { err("ipmi_domain_pointer_cb = 0x%x", rv); return NULL; } rv = ohoi_loop(&info.done, ipmi_handler); if (rv != SA_OK) { err("ohoi_loop = 0x%x", rv); return NULL; } if (info.rv != SA_OK) { err("info.rv = 0x%x", info.rv); return NULL; } rdr = malloc(sizeof (*rdr)); if (rdr == NULL) { err("Out of memory"); return NULL; } c_info = malloc(sizeof (*c_info)); if (rdr == NULL) { err("Out of memory"); free(rdr); return NULL; } memset(rdr, 0, sizeof (*rdr)); memset(c_info, 0, sizeof (*c_info)); rdr->RdrType = SAHPI_CTRL_RDR; rdr->IsFru = SAHPI_FALSE; rdr->Entity = rpt->ResourceEntity; rdr->RdrTypeUnion.CtrlRec.Num = ATCAHPI_CTRL_NUM_SHELF_STATUS; rdr->RdrTypeUnion.CtrlRec.OutputType = SAHPI_CTRL_GENERIC; rdr->RdrTypeUnion.CtrlRec.Type = SAHPI_CTRL_TYPE_OEM; rdr->RdrTypeUnion.CtrlRec.TypeUnion.Oem.Default.MId = ATCAHPI_PICMG_MID; rdr->RdrTypeUnion.CtrlRec.TypeUnion.Oem.Default.BodyLength = 4; rdr->RdrTypeUnion.CtrlRec.DefaultMode.Mode = SAHPI_CTRL_MODE_AUTO; rdr->RdrTypeUnion.CtrlRec.DefaultMode.ReadOnly = SAHPI_TRUE; rdr->RdrTypeUnion.CtrlRec.WriteOnly = SAHPI_FALSE; rdr->RdrTypeUnion.CtrlRec.Oem = ATCAHPI_PICMG_CT_CHASSIS_STATUS; oh_init_textbuffer(&rdr->IdString); oh_append_textbuffer(&rdr->IdString, "Chassis Status"); rdr->RdrTypeUnion.CtrlRec.TypeUnion.Oem.Default.Body[0] = states.Body[0]; rdr->RdrTypeUnion.CtrlRec.TypeUnion.Oem.Default.Body[1] = states.Body[1]; rdr->RdrTypeUnion.CtrlRec.TypeUnion.Oem.Default.Body[2] = states.Body[2]; rdr->RdrTypeUnion.CtrlRec.TypeUnion.Oem.Default.Body[3] = states.Body[3]; rdr->RdrTypeUnion.CtrlRec.TypeUnion.Oem.Default.MId = ATCAHPI_PICMG_MID; rdr->RdrTypeUnion.CtrlRec.TypeUnion.Oem.MId = ATCAHPI_PICMG_MID; c_info->ohoii.get_control_state = get_atca_chassis_status_control_state; c_info->ohoii.set_control_state = set_atca_chassis_status_control_state; c_info->mode = SAHPI_CTRL_MODE_AUTO; *ctrl_info = c_info; return rdr; } SaErrorT get_atca_chassis_status_control_state( struct oh_handler_state *hnd, struct ohoi_control_info *c, SaHpiRdrT * rdr, SaHpiCtrlModeT *mode, SaHpiCtrlStateT *state) { struct atca_chassis_status_control_s info; struct ohoi_handler *ipmi_handler = (struct ohoi_handler *)hnd->data; SaErrorT rv; if (state == NULL) { goto no_state; } info.state = &state->StateUnion.Oem; info.done = 0; info.rv = SA_OK; rv = ipmi_domain_pointer_cb(ipmi_handler->domain_id, get_atca_chassis_status_control_states, &info); if (rv != 0) { err("ipmi_domain_pointer_cb = 0x%x", rv); return SA_ERR_HPI_INVALID_CMD; } rv = ohoi_loop(&info.done, ipmi_handler); if (rv != SA_OK) { err("ohoi_loop = 0x%x", rv); return rv; } if (info.rv != SA_OK) { err("info.rv = 0x%x", info.rv); return rv; } state->Type = SAHPI_CTRL_TYPE_OEM; no_state: if (mode) { *mode = SAHPI_CTRL_MODE_AUTO; } return SA_OK; } SaErrorT set_atca_chassis_status_control_state( struct oh_handler_state *hnd, struct ohoi_control_info *c, SaHpiRdrT * rdr, SaHpiCtrlModeT mode, SaHpiCtrlStateT *state) { return SA_ERR_HPI_READ_ONLY; } /* * Shelf Address control */ struct atca_shelf_address_control_s { SaHpiCtrlStateTextT *text; SaHpiTextTypeT type; int done; SaErrorT rv; }; static int set_shelf_address_control_msg_data(SaHpiTextTypeT type, SaHpiTextBufferT *text, unsigned char *data) { int i, j, shift; if (type == text->DataType) { memcpy(data + 2, &text->Data, text->DataLength); data[1] = (type << 6); switch (type) { case SAHPI_TL_TYPE_UNICODE: data[1] |= ((text->DataLength & 0x1f) >> 1); break; case SAHPI_TL_TYPE_BCDPLUS: data[1] |= ((text->DataLength * 2) & 0x1f); break; case SAHPI_TL_TYPE_ASCII6: data[1] |= (((text->DataLength * 8 + 5) / 6) & 0x1f); break; case SAHPI_TL_TYPE_TEXT: case SAHPI_TL_TYPE_BINARY: data[1] |= (text->DataLength & 0x1f); break; } return 0; } if ((type != SAHPI_TL_TYPE_ASCII6) || (text->DataType != SAHPI_TL_TYPE_TEXT)) { err("Datatype dismaych : %d & %d", type, text->DataType); return 1; } for (i = 0; i < text->DataLength; i++) { if ((text->Data[i] < 0x20) || (text->Data[i] > 0x5F)) { err("cannot convert TEXT to ASCII6"); return 1; } } shift = 0; j = 0; for (i = 0; i < text->DataLength; i++) { unsigned char a = text->Data[i] - 0x20; switch (shift) { case 0: data[j] |= (a << 2); shift = 6; break; case 2: data[j] |= a; j++; shift = 0; break; case 4: data[j] |= (a >> 2); j++; data[j] = (a & 0x03) << 6; shift = 2; break; case 6: data[j] |= ((a & 0x30) >> 6); j++; data[j] = (a & 0x0f) << 4; shift = 4; } } data[1] = (unsigned char)((SAHPI_TL_TYPE_ASCII6 << 6) | (text->DataLength & 0x0f)); return 0; } static int set_atca_shelf_address_control_states_cb( ipmi_domain_t *domain, ipmi_msgi_t *rspi) { struct atca_shelf_address_control_s *info = rspi->data1; ipmi_msg_t *msg = &rspi->msg; int rv = msg->data[0]; dbg("set shelf address response(%d): %02x %02x\n", msg->data_len, msg->data[0], msg->data[1]); if (domain == NULL) { info->rv = SA_ERR_HPI_INVALID_PARAMS; info->done = 1; return IPMI_MSG_ITEM_NOT_USED; } if (rv == 0xc1) { info->rv = SA_ERR_HPI_INVALID_CMD; } else if (rv == 0xc3) { info->rv = SA_ERR_HPI_NO_RESPONSE; } else if (rv != 0) { info->rv = SA_ERR_HPI_INVALID_PARAMS; } info->done = 1; return IPMI_MSG_ITEM_NOT_USED; }; static void set_atca_shelf_address_control_states( ipmi_domain_t *domain, void *cb_data) { struct atca_shelf_address_control_s *info = cb_data; unsigned char data[32]; int rv; memset(data, 0, 32); if (set_shelf_address_control_msg_data(info->type, &info->text->Text, data)) { info->rv = SA_ERR_HPI_INVALID_DATA; info->done = 1; return; } dbg("set addr control: 0x%02x 0x%02x 0x%02x 0x%02x 0x%02x 0x%02x", data[0], data[1], data[2], data[3], data[4], data[5]); rv = ipmicmd_send(domain, 0x2c, 0x03, 0, IPMI_BMC_CHANNEL, data, 32, set_atca_shelf_address_control_states_cb, cb_data); if (rv != 0) { err("ipmicmd_send = 0x%x", rv); OHOI_MAP_ERROR(info->rv, rv); info->done = 1; return; } return; } static SaErrorT set_atca_shelf_address_control_state( struct oh_handler_state *hnd, struct ohoi_control_info *c, SaHpiRdrT * rdr, SaHpiCtrlModeT mode, SaHpiCtrlStateT *state) { struct atca_shelf_address_control_s info; struct ohoi_handler *ipmi_handler = (struct ohoi_handler *)hnd->data; SaErrorT rv; SaHpiCtrlStateTextT *text; if (mode == SAHPI_CTRL_MODE_AUTO) { // || (state == NULL)) { // c->mode = mode; return SA_ERR_HPI_READ_ONLY; } if (state->Type != SAHPI_CTRL_TYPE_TEXT) { err("state->Type != SAHPI_CTRL_TYPE_TEXT"); return SA_ERR_HPI_INVALID_DATA; } text = &state->StateUnion.Text; if ((text->Line != 1) && (text->Line != SAHPI_TLN_ALL_LINES)) { err("text->Line != 1 or SAHPI_TLN_ALL_LINES"); return SA_ERR_HPI_INVALID_DATA; } info.text = text; info.done = 0; info.type = rdr->RdrTypeUnion.CtrlRec.TypeUnion.Text.DataType; info.rv = SA_OK; rv = ipmi_domain_pointer_cb(ipmi_handler->domain_id, set_atca_shelf_address_control_states, &info); if (rv != 0) { err("ipmi_domain_pointer_cb = 0x%x", rv); return SA_ERR_HPI_INVALID_CMD; } rv = ohoi_loop(&info.done, ipmi_handler); if (rv != SA_OK) { err("ohoi_loop = 0x%x", rv); return rv; } if (info.rv != SA_OK) { err("info.rv = 0x%x", info.rv); return info.rv; } // c->mode = mode; state->Type = SAHPI_CTRL_TYPE_TEXT; return SA_OK; } static int get_atca_shelf_address_control_states_cb( ipmi_domain_t *domain, ipmi_msgi_t *rspi) { struct atca_shelf_address_control_s *info = rspi->data1; ipmi_msg_t *msg = &rspi->msg; int rv = msg->data[0]; int len; int i; dbg("get shelf address response(%d): %02x %02x %02x %02x %02x\n", msg->data_len, msg->data[0], msg->data[1], msg->data[2], msg->data[3], msg->data[4]); if (domain == NULL) { info->rv = SA_ERR_HPI_INVALID_PARAMS; info->done = 1; return IPMI_MSG_ITEM_NOT_USED; } if (rv == 0xc1) { info->rv = SA_ERR_HPI_INVALID_CMD; } else if (rv == 0xc3) { info->rv = SA_ERR_HPI_NO_RESPONSE; } else if (rv != 0) { info->rv = SA_ERR_HPI_INVALID_PARAMS; } if (rv != 0) { info->done = 1; return IPMI_MSG_ITEM_NOT_USED; } info->text->Line = 1; info->text->Text.DataType = (msg->data[2] & 0xc0) >> 6; len = (msg->data[2] & 0x0f); memset(&info->text->Text.Data, 0, SAHPI_MAX_TEXT_BUFFER_LENGTH); switch (info->text->Text.DataType) { case SAHPI_TL_TYPE_UNICODE: len = len * 2; memcpy(&info->text->Text.Data, msg->data + 3, len); break; case SAHPI_TL_TYPE_BCDPLUS: len = (len + 1) / 2; memcpy(&info->text->Text.Data, msg->data + 3, len); break; case SAHPI_TL_TYPE_ASCII6: for (i = 0; i < len; i++) { int b, off; SaHpiUint8T a = 0; b = (6 * i) / 8; off = (6 * i) % 8; switch (off) { case 0: a = (msg->data[3 + b] & 0xFC) >> 2; break; case 2: a = (msg->data[3 + b] & 0x3F); break; break; case 4: a = ((msg->data[3 + b] & 0x0F) << 2) | ((msg->data[3 + b + 1] & 0xC0) >> 6); break; case 6: a = ((msg->data[3 + b] & 0x03) << 4) | ((msg->data[3 + b + 1] & 0xF0) >> 4); } info->text->Text.Data[i] = a + 0x20; } break; case SAHPI_TL_TYPE_TEXT: info->text->Text.Language = SAHPI_LANG_ENGLISH; case SAHPI_TL_TYPE_BINARY: memcpy(&info->text->Text.Data, msg->data + 3, len); break; } info->text->Text.DataLength = len; info->done = 1; return IPMI_MSG_ITEM_NOT_USED; }; static void get_atca_shelf_address_control_states( ipmi_domain_t *domain, void *cb_data) { struct atca_shelf_address_control_s *info = cb_data; unsigned char data[32]; int rv; memset(data, 0, 32); rv = ipmicmd_send(domain, 0x2c, 0x02, 0, IPMI_BMC_CHANNEL, data, 1, get_atca_shelf_address_control_states_cb, cb_data); if (rv != 0) { err("ipmicmd_send = 0x%x", rv); OHOI_MAP_ERROR(info->rv, rv); return; } return; } static SaErrorT get_atca_shelf_address_control_state( struct oh_handler_state *hnd, struct ohoi_control_info *c, SaHpiRdrT * rdr, SaHpiCtrlModeT *mode, SaHpiCtrlStateT *state) { struct atca_shelf_address_control_s info; struct ohoi_handler *ipmi_handler = (struct ohoi_handler *)hnd->data; SaErrorT rv; if (state == NULL) { goto no_state; } #if 0 if (state->Type != SAHPI_CTRL_TYPE_TEXT) { err("state->Type != SAHPI_CTRL_TYPE_TEXT"); return SA_ERR_HPI_INVALID_DATA; } #endif if ((state->StateUnion.Text.Line != 1) && (state->StateUnion.Text.Line != SAHPI_TLN_ALL_LINES)) { err("text->Line != 1 or SAHPI_TLN_ALL_LINES"); return SA_ERR_HPI_INVALID_DATA; } info.text = &state->StateUnion.Text; info.done = 0; info.rv = SA_OK; rv = ipmi_domain_pointer_cb(ipmi_handler->domain_id, get_atca_shelf_address_control_states, &info); if (rv != 0) { err("ipmi_domain_pointer_cb = 0x%x", rv); return SA_ERR_HPI_INVALID_CMD; } rv = ohoi_loop(&info.done, ipmi_handler); if (rv != SA_OK) { err("ohoi_loop = 0x%x", rv); return rv; } if (info.rv != SA_OK) { err("info.rv = 0x%x", info.rv); return rv; } state->Type = SAHPI_CTRL_TYPE_TEXT; no_state: if (mode) { *mode = c->mode; } return SA_OK; } static SaHpiRdrT *create_atca_shelf_address_control( struct ohoi_handler *ipmi_handler, SaHpiRptEntryT *rpt, struct ohoi_control_info **ctrl_info) { SaHpiRdrT *rdr; struct ohoi_control_info *c_info; SaHpiCtrlStateTextT text; SaErrorT rv; struct atca_shelf_address_control_s info; info.text = &text; info.done = 0; info.rv = SA_OK; rv = ipmi_domain_pointer_cb(ipmi_handler->domain_id, get_atca_shelf_address_control_states, &info); if (rv != 0) { err("ipmi_domain_pointer_cb = 0x%x", rv); return NULL; } rv = ohoi_loop(&info.done, ipmi_handler); if (rv != SA_OK) { err("ohoi_loop = 0x%x", rv); return NULL; } if (info.rv != SA_OK) { err("info.rv = 0x%x", info.rv); return NULL; } rdr = malloc(sizeof (*rdr)); if (rdr == NULL) { err("Out of memory"); return NULL; } c_info = malloc(sizeof (*c_info)); if (rdr == NULL) { err("Out of memory"); free(rdr); return NULL; } memset(rdr, 0, sizeof (*rdr)); memset(c_info, 0, sizeof (*c_info)); rdr->RdrType = SAHPI_CTRL_RDR; rdr->IsFru = SAHPI_FALSE; rdr->Entity = rpt->ResourceEntity; rdr->RdrTypeUnion.CtrlRec.Num = ATCAHPI_CTRL_NUM_SHELF_ADDRESS; rdr->RdrTypeUnion.CtrlRec.OutputType = SAHPI_CTRL_GENERIC; rdr->RdrTypeUnion.CtrlRec.Type = SAHPI_CTRL_TYPE_TEXT; rdr->RdrTypeUnion.CtrlRec.TypeUnion.Text.MaxChars = 25; rdr->RdrTypeUnion.CtrlRec.TypeUnion.Text.MaxLines = 1; rdr->RdrTypeUnion.CtrlRec.TypeUnion.Text.Language = text.Text.Language; rdr->RdrTypeUnion.CtrlRec.TypeUnion.Text.DataType = text.Text.DataType; rdr->RdrTypeUnion.CtrlRec.TypeUnion.Text.Default.Line = 1; rdr->RdrTypeUnion.CtrlRec.TypeUnion.Text.Default.Text.DataType = text.Text.DataType; rdr->RdrTypeUnion.CtrlRec.TypeUnion.Text.Default.Text.DataLength = text.Text.DataLength; rdr->RdrTypeUnion.CtrlRec.TypeUnion.Text.Default.Text.Language = text.Text.Language; memcpy(&rdr->RdrTypeUnion.CtrlRec.TypeUnion.Text.Default.Text.Data, &text.Text.Data, text.Text.DataLength); rdr->RdrTypeUnion.CtrlRec.DefaultMode.Mode = SAHPI_CTRL_MODE_MANUAL; rdr->RdrTypeUnion.CtrlRec.DefaultMode.ReadOnly = SAHPI_TRUE; rdr->RdrTypeUnion.CtrlRec.WriteOnly = SAHPI_FALSE; oh_init_textbuffer(&rdr->IdString); oh_append_textbuffer(&rdr->IdString, "Shelf Address"); c_info->ohoii.get_control_state = get_atca_shelf_address_control_state; c_info->ohoii.set_control_state = set_atca_shelf_address_control_state; c_info->mode = SAHPI_CTRL_MODE_MANUAL; *ctrl_info = c_info; return rdr; } /* * Shelf IP Address Control */ static SaErrorT get_atca_shelf_ip_address_control_state( struct oh_handler_state *hnd, struct ohoi_control_info *c, SaHpiRdrT * rdr, SaHpiCtrlModeT *mode, SaHpiCtrlStateT *state); static SaErrorT set_atca_shelf_ip_address_control_state( struct oh_handler_state *hnd, struct ohoi_control_info *c, SaHpiRdrT * rdr, SaHpiCtrlModeT mode, SaHpiCtrlStateT *state); static SaHpiRdrT *create_atca_shelf_ip_address_control( struct oh_handler_state *handler, SaHpiRptEntryT *rpt, struct ohoi_control_info **ctrl_info) { // struct ohoi_handler *ipmi_handler = handler->data; SaHpiRdrT *rdr; struct ohoi_control_info *c_info; rdr = malloc(sizeof (*rdr)); if (rdr == NULL) { err("Out of memory"); return NULL; } c_info = malloc(sizeof (*c_info)); if (rdr == NULL) { err("Out of memory"); free(rdr); return NULL; } memset(rdr, 0, sizeof (*rdr)); memset(c_info, 0, sizeof (*c_info)); rdr->RdrType = SAHPI_CTRL_RDR; rdr->IsFru = SAHPI_FALSE; rdr->Entity = rpt->ResourceEntity; rdr->RdrTypeUnion.CtrlRec.Num = ATCAHPI_CTRL_NUM_SHELF_IP_ADDRESS; rdr->RdrTypeUnion.CtrlRec.OutputType = SAHPI_CTRL_GENERIC; rdr->RdrTypeUnion.CtrlRec.Type = SAHPI_CTRL_TYPE_TEXT; rdr->RdrTypeUnion.CtrlRec.TypeUnion.Text.MaxChars = 4; rdr->RdrTypeUnion.CtrlRec.TypeUnion.Text.MaxLines = 3; rdr->RdrTypeUnion.CtrlRec.TypeUnion.Text.Language = SAHPI_LANG_UNDEF; rdr->RdrTypeUnion.CtrlRec.TypeUnion.Text.DataType = SAHPI_TL_TYPE_BINARY; rdr->RdrTypeUnion.CtrlRec.TypeUnion.Text.Default.Line = SAHPI_TLN_ALL_LINES; rdr->RdrTypeUnion.CtrlRec.TypeUnion.Text.Default.Text.DataType = SAHPI_TL_TYPE_BINARY; rdr->RdrTypeUnion.CtrlRec.TypeUnion.Text.Default.Text.DataLength = 12; rdr->RdrTypeUnion.CtrlRec.TypeUnion.Text.Default.Text.Language = SAHPI_LANG_UNDEF; memset(&rdr->RdrTypeUnion.CtrlRec.TypeUnion.Text.Default.Text.Data, 0, SAHPI_MAX_TEXT_BUFFER_LENGTH); rdr->RdrTypeUnion.CtrlRec.DefaultMode.Mode = SAHPI_CTRL_MODE_MANUAL; rdr->RdrTypeUnion.CtrlRec.DefaultMode.ReadOnly = SAHPI_TRUE; rdr->RdrTypeUnion.CtrlRec.WriteOnly = SAHPI_FALSE; oh_init_textbuffer(&rdr->IdString); oh_append_textbuffer(&rdr->IdString, "Shelf IP Address"); c_info->info.atcamap_ctrl_info.data = NULL; c_info->type = OHOI_CTRL_ATCA_MAPPED; c_info->mode = SAHPI_CTRL_MODE_MANUAL; c_info->ohoii.get_control_state = get_atca_shelf_ip_address_control_state; c_info->ohoii.set_control_state = set_atca_shelf_ip_address_control_state; *ctrl_info = c_info; return rdr; } static SaErrorT get_shelf_ip_address_record(ipmi_entity_t *ent, unsigned char *buf, unsigned int *len, unsigned char *ver, unsigned int *num) { unsigned char type, vr; unsigned int i, num_rec; unsigned int orig_len = *len; int rv; num_rec = ipmi_entity_get_num_multi_records(ent); for (i = 0; i < num_rec; i++) { *len = orig_len; rv = ipmi_entity_get_multi_record_data(ent, i, buf, len); if (rv != 0) { err("ipmi_entity_get_multi_record_data(%d) = 0x%x", i, rv); return SA_ERR_HPI_INVALID_DATA; } if (*len < 17) { continue; } rv = ipmi_entity_get_multi_record_type(ent, i, &type); if (rv) { err("ipmi_entity_get_multi_record_type = %d", rv); continue; } if (type != 0xc0) { // record type. Must be OEM continue; } rv = ipmi_entity_get_multi_record_format_version(ent, i, &vr); if (rv) { err("ipmi_entity_get_multi_record_format_version = %d", rv); continue; } if ((vr & 0x0f) != 0x2) { // must be 2 for PICMG 3.0 ATCA vD1.0 continue; } // checksums are checked by OpenIPMI if ((buf[0] | (buf[1] << 8) | (buf[2] << 16)) != ATCAHPI_PICMG_MID) { continue; } if (buf[3] != 0x13) { continue; } if (buf[4] != 0x01) { continue; } break; } if (i == num_rec) { err("No record for shelf IP address"); return SA_ERR_HPI_INTERNAL_ERROR; } *num = i; *ver = vr; return SA_OK; } struct atca_shelf_ip_address_control_state { struct oh_handler_state *hnd; SaErrorT rv; SaHpiCtrlStateTextT *text; int done; }; static void get_atca_shelf_ip_address_control_state_cb(ipmi_entity_t *ent, void *cb_data) { struct atca_shelf_ip_address_control_state *info = cb_data; unsigned char buf[256]; unsigned int len = 256; unsigned int num_rec; unsigned char ver; info->rv = get_shelf_ip_address_record(ent, buf, &len, &ver, &num_rec); if (info->rv != SA_OK) { return; } info->text->Text.DataType = SAHPI_TL_TYPE_BINARY; info->text->Text.Language = SAHPI_LANG_UNDEF; switch (info->text->Line) { case 1: // Shelf Manager IP Address info->text->Text.DataLength = 4; memcpy(info->text->Text.Data, buf + 5, 4); break; case 2: // Default Gateway IP Address info->text->Text.DataLength = 4; memcpy(info->text->Text.Data, buf + 9, 4); break; case 3: // Subnet Mask info->text->Text.DataLength = 4; memcpy(info->text->Text.Data, buf + 13, 4); break; case SAHPI_TLN_ALL_LINES: // all info->text->Text.DataLength = 12; memcpy(info->text->Text.Data, buf + 5, 12); break; default : err("wrong text->Line = %d", info->text->Line); info->rv = SA_ERR_HPI_INVALID_DATA; break; } } SaErrorT get_atca_shelf_ip_address_control_state( struct oh_handler_state *handler, struct ohoi_control_info *c, SaHpiRdrT * rdr, SaHpiCtrlModeT *mode, SaHpiCtrlStateT *state) { struct ohoi_resource_info *res_info; struct ohoi_handler *ohoi_handler = handler->data; int rv; struct atca_shelf_ip_address_control_state info; if (state == NULL) { goto no_state; } #if 0 if (state->Type != SAHPI_CTRL_TYPE_TEXT) { err("wrong state type %d", state->Type); return SA_ERR_HPI_INVALID_DATA; } #endif res_info = oh_get_resource_data(handler->rptcache, ohoi_handler->atca_shelf_id); if (res_info == NULL) { err("No shelf resource info?"); return SA_ERR_HPI_INTERNAL_ERROR; } if (res_info->fru == NULL) { err("Shelf does not have IDR"); return SA_ERR_HPI_INVALID_DATA; } info.rv = SA_OK; info.text = &state->StateUnion.Text; g_mutex_lock(res_info->fru->mutex); rv = ipmi_entity_pointer_cb(res_info->u.entity.entity_id, get_atca_shelf_ip_address_control_state_cb, &info); if (rv != 0) { err("ipmi_entity_pointer_cb = 0x%x", rv); g_mutex_unlock(res_info->fru->mutex); return SA_ERR_HPI_INTERNAL_ERROR; } g_mutex_unlock(res_info->fru->mutex); if (info.rv != SA_OK) { return info.rv; } no_state: if (mode) { *mode = c->mode; } return SA_OK; } static void set_atca_shelf_ip_address_control_state_cb(ipmi_entity_t *ent, void *cb_data) { struct atca_shelf_ip_address_control_state *info = cb_data; unsigned char buf[256]; unsigned int len = 256; unsigned int num_rec; unsigned char ver; SaErrorT rv; ipmi_fru_t *fru = ipmi_entity_get_fru(ent); // struct ohoi_handler *ohoi_handler = info->hnd->data; info->rv = get_shelf_ip_address_record(ent, buf, &len, &ver, &num_rec); if (info->rv != SA_OK) { info->done = 1; return; } switch (info->text->Line) { case 1: // Shelf Manager IP Address memcpy(buf + 5, info->text->Text.Data, 4); break; case 2: // Default Gateway IP Address memcpy(buf + 9, info->text->Text.Data, 4); break; case 3: // Subnet Mask memcpy(buf + 13, info->text->Text.Data, 4); break; case SAHPI_TLN_ALL_LINES: // all memcpy(buf + 5, info->text->Text.Data, 12); break; default : err("wrong text->Line = %d", info->text->Line); info->rv = SA_ERR_HPI_INVALID_DATA; info->done = 1; return; } rv = ipmi_fru_set_multi_record(fru, num_rec, 0xC0, ver, buf, len); if (rv != 0) { err("ipmi_fru_set_multi_record(fru, %d, 0xC0, 0x%x, buf, 0x%x", num_rec, ver, len); info->rv = SA_ERR_HPI_INTERNAL_ERROR; } info->done = 1; } SaErrorT set_atca_shelf_ip_address_control_state( struct oh_handler_state *handler, struct ohoi_control_info *c, SaHpiRdrT * rdr, SaHpiCtrlModeT mode, SaHpiCtrlStateT *state) { struct ohoi_resource_info *res_info; struct ohoi_handler *ohoi_handler = handler->data; SaHpiCtrlStateTextT *text; SaHpiCtrlRecTextT *ctrl; int rv; struct atca_shelf_ip_address_control_state info; if (mode == SAHPI_CTRL_MODE_AUTO) { // c->mode = mode; return SA_ERR_HPI_READ_ONLY; } if (state->Type != SAHPI_CTRL_TYPE_TEXT) { err("wrong state type %d", state->Type); return SA_ERR_HPI_INVALID_DATA; } res_info = oh_get_resource_data(handler->rptcache, ohoi_handler->atca_shelf_id); if (res_info == NULL) { err("No shelf resource info?"); return SA_ERR_HPI_INTERNAL_ERROR; } if (res_info->fru == NULL) { err("Shelf does not have IDR"); return SA_ERR_HPI_INVALID_DATA; } ctrl = &rdr->RdrTypeUnion.CtrlRec.TypeUnion.Text; text = &state->StateUnion.Text; if (text->Text.DataType != SAHPI_TL_TYPE_BINARY) { err("wrong DataType = %d", text->Text.DataType); return SA_ERR_HPI_INVALID_DATA; } if (text->Line == SAHPI_TLN_ALL_LINES) { if (text->Text.DataLength != 12) { err("wrong DataLength = %d", text->Text.DataLength); return SA_ERR_HPI_INVALID_DATA; } } else if (text->Line > ctrl->MaxLines) { err("wrong text->Line = %d", text->Line); return SA_ERR_HPI_INVALID_DATA; } else if (text->Text.DataLength != 4) { err("wrong DataLength = %d", text->Text.DataLength); return SA_ERR_HPI_INVALID_DATA; } info.hnd = handler; info.text = text; info.done = 0; info.rv = SA_OK; g_mutex_lock(res_info->fru->mutex); rv = ipmi_entity_pointer_cb(res_info->u.entity.entity_id, set_atca_shelf_ip_address_control_state_cb, &info); if (rv != 0) { err("ipmi_entity_pointer_cb = 0x%x", rv); g_mutex_unlock(res_info->fru->mutex); return SA_ERR_HPI_INTERNAL_ERROR; } rv = ohoi_loop(&info.done, ohoi_handler); g_mutex_unlock(res_info->fru->mutex); if (rv != SA_OK) { return rv; } if (info.rv != SA_OK) { return info.rv; } rv = ohoi_fru_write(ohoi_handler, res_info->u.entity.entity_id); // if (rv == SA_OK) { // c->mode = mode; // } return rv; } /* * FRU Power On Sequence Commit Status Sensor */ static void send_pwronseq_commit_status_sensor_event( struct oh_handler_state *handler, int updated) { struct ohoi_handler *ipmi_handler = handler->data; SaErrorT rv; struct ohoi_sensor_info *s_info = NULL; struct oh_event *e; SaHpiSensorEventT *sen_evt; rv = ohoi_get_rdr_data(handler, ipmi_handler->atca_shelf_id, SAHPI_SENSOR_RDR, ATCAHPI_SENSOR_NUM_PWRONSEQ_COMMIT_STATUS, (void *)&s_info); if (rv != SA_OK) { err("could not get sensor info"); return; } if (s_info == NULL) { err("could not get sensor info"); return; } if (s_info->sen_enabled == SAHPI_FALSE) { err("sensor disabled"); return; } if (!s_info->info.atcamap_sensor_info.val) { // sensor event disable err("sensor event disabled"); return; } if (updated && !(s_info->assert & SAHPI_ES_STATE_01)) { err("SAHPI_ES_STATE_01 disabled"); return; } if (!updated && !(s_info->assert & SAHPI_ES_STATE_00)) { err("SAHPI_ES_STATE_00 disabled"); return; } e = malloc(sizeof(*e)); if (!e) { err("Out of space"); return; } SaHpiRdrT *rdr = oh_get_rdr_by_type(handler->rptcache, ipmi_handler->atca_shelf_id, SAHPI_SENSOR_RDR, ATCAHPI_SENSOR_NUM_PWRONSEQ_COMMIT_STATUS); memset(e, 0, sizeof(*e)); e->event.Source = ipmi_handler->atca_shelf_id; e->event.EventType = SAHPI_ET_SENSOR; e->event.Severity = SAHPI_INFORMATIONAL; oh_gettimeofday(&e->event.Timestamp); sen_evt = &(e->event.EventDataUnion.SensorEvent); sen_evt->SensorNum = ATCAHPI_SENSOR_NUM_PWRONSEQ_COMMIT_STATUS; sen_evt->SensorType = SAHPI_OEM_SENSOR; sen_evt->EventCategory = SAHPI_EC_SENSOR_SPECIFIC; sen_evt->Assertion = SAHPI_TRUE; sen_evt->EventState = updated ? SAHPI_ES_STATE_01 : SAHPI_ES_STATE_00; sen_evt->OptionalDataPresent = SAHPI_SOD_PREVIOUS_STATE | SAHPI_SOD_CURRENT_STATE; sen_evt->CurrentState = updated ? SAHPI_ES_STATE_01 : SAHPI_ES_STATE_00; sen_evt->PreviousState = updated ? SAHPI_ES_STATE_00 : SAHPI_ES_STATE_01; if (rdr) e->rdrs = g_slist_append(e->rdrs, g_memdup(rdr, sizeof(SaHpiRdrT))); e->hid = handler->hid; oh_evt_queue_push(handler->eventq, e); } static SaErrorT get_pwronseq_commit_status_sensor_event_enable( struct oh_handler_state *hnd, struct ohoi_sensor_info *sinfo, SaHpiBoolT *enable, SaHpiEventStateT *assert, SaHpiEventStateT *deassert) { *assert = sinfo->assert; *deassert = 0; *enable = sinfo->info.atcamap_sensor_info.val; return SA_OK; } static SaErrorT set_pwronseq_commit_status_sensor_event_enable( struct oh_handler_state *hnd, struct ohoi_sensor_info *sinfo, SaHpiBoolT enable, SaHpiEventStateT assert, SaHpiEventStateT deassert, unsigned int a_supported, unsigned int d_supported) { if (deassert != 0) { err("deassert(0x%x) != 0", deassert); return SA_ERR_HPI_INVALID_DATA; } if ((assert & ~(SAHPI_ES_STATE_00 | SAHPI_ES_STATE_01))) { err("assert(0x%x)", assert); return SA_ERR_HPI_INVALID_DATA; } sinfo->assert = assert; sinfo->info.atcamap_sensor_info.val = enable; return SA_OK; } static SaErrorT get_pwronseq_commit_status_sensor_reading( struct oh_handler_state *hnd, struct ohoi_sensor_info *sensor_info, SaHpiSensorReadingT *reading, SaHpiEventStateT *ev_state) { struct ohoi_handler *ipmi_handler = hnd->data; if (reading != NULL) { reading->IsSupported = SAHPI_FALSE; } if (ev_state) { if (ipmi_handler->atca_pwonseq_updated) { *ev_state = SAHPI_ES_STATE_01; } else { *ev_state = SAHPI_ES_STATE_00; } } return SA_OK; } static SaErrorT get_pwronseq_commit_status_sensor_thresholds( struct oh_handler_state *hnd, struct ohoi_sensor_info *sinfo, SaHpiSensorThresholdsT *thres) { return SA_ERR_HPI_INVALID_CMD; } static SaErrorT set_pwronseq_commit_status_sensor_thresholds( struct oh_handler_state *hnd, struct ohoi_sensor_info *sinfo, const SaHpiSensorThresholdsT *thres) { return SA_ERR_HPI_INVALID_CMD; } static SaHpiRdrT *create_fru_power_on_sequence_commit_status_sensor( struct oh_handler_state *handler, SaHpiRptEntryT *rpt, struct ohoi_sensor_info **sensor_info) { // struct ohoi_handler *ipmi_handler = handler->data; SaHpiRdrT *rdr; struct ohoi_sensor_info *s_info; rdr = malloc(sizeof (*rdr)); if (rdr == NULL) { err("Out of memory"); return NULL; } s_info = malloc(sizeof (*s_info)); if (rdr == NULL) { err("Out of memory"); free(rdr); return NULL; } memset(rdr, 0, sizeof (*rdr)); memset(s_info, 0, sizeof (*s_info)); rdr->RdrType = SAHPI_SENSOR_RDR; rdr->IsFru = SAHPI_FALSE; rdr->Entity = rpt->ResourceEntity; rdr->RdrTypeUnion.SensorRec.Num = ATCAHPI_SENSOR_NUM_PWRONSEQ_COMMIT_STATUS; rdr->RdrTypeUnion.SensorRec.Type = SAHPI_OEM_SENSOR; rdr->RdrTypeUnion.SensorRec.Category = SAHPI_EC_SENSOR_SPECIFIC; rdr->RdrTypeUnion.SensorRec.EnableCtrl = SAHPI_TRUE; rdr->RdrTypeUnion.SensorRec.EventCtrl = SAHPI_SEC_PER_EVENT; rdr->RdrTypeUnion.SensorRec.Events = SAHPI_ES_STATE_00 | SAHPI_ES_STATE_01; rdr->RdrTypeUnion.SensorRec.DataFormat.IsSupported = SAHPI_FALSE; rdr->RdrTypeUnion.SensorRec.ThresholdDefn.IsAccessible = SAHPI_FALSE; oh_init_textbuffer(&rdr->IdString); oh_append_textbuffer(&rdr->IdString, "FRU Power On Sequence Commit Status"); s_info->support_assert = SAHPI_ES_STATE_00 | SAHPI_ES_STATE_01; s_info->support_deassert = 0; s_info->assert = SAHPI_ES_STATE_00 | SAHPI_ES_STATE_01; s_info->deassert = 0; s_info->sen_enabled = SAHPI_TRUE; s_info->enable = SAHPI_TRUE; s_info->info.atcamap_sensor_info.data = NULL; s_info->info.atcamap_sensor_info.val = SAHPI_TRUE; s_info->type = OHOI_SENSOR_ATCA_MAPPED; s_info->ohoii.get_sensor_event_enable = get_pwronseq_commit_status_sensor_event_enable; s_info->ohoii.set_sensor_event_enable = set_pwronseq_commit_status_sensor_event_enable; s_info->ohoii.get_sensor_reading = get_pwronseq_commit_status_sensor_reading; s_info->ohoii.get_sensor_thresholds = get_pwronseq_commit_status_sensor_thresholds; s_info->ohoii.set_sensor_thresholds = set_pwronseq_commit_status_sensor_thresholds; *sensor_info = s_info; return rdr; } /* * FRU Power On Sequence Controls */ static SaErrorT get_atca_fru_pwronseq_control_state( struct oh_handler_state *hnd, struct ohoi_control_info *c, SaHpiRdrT * rdr, SaHpiCtrlModeT *mode, SaHpiCtrlStateT *state); static SaErrorT set_atca_fru_pwronseq_control_state( struct oh_handler_state *hnd, struct ohoi_control_info *c, SaHpiRdrT * rdr, SaHpiCtrlModeT mode, SaHpiCtrlStateT *state); static SaHpiRdrT *create_fru_power_on_sequence_control( struct oh_handler_state *handler, SaHpiRptEntryT *rpt, struct ohoi_control_info **ctrl_info, int num, SaHpiResourceIdT slotid) { // struct ohoi_handler *ipmi_handler = handler->data; SaHpiRdrT *rdr; struct ohoi_control_info *c_info; unsigned char buf[32]; rdr = malloc(sizeof (*rdr)); if (rdr == NULL) { err("Out of memory"); return NULL; } c_info = malloc(sizeof (*c_info)); if (rdr == NULL) { err("Out of memory"); free(rdr); return NULL; } memset(rdr, 0, sizeof (*rdr)); memset(c_info, 0, sizeof (*c_info)); rdr->RdrType = SAHPI_CTRL_RDR; rdr->IsFru = SAHPI_FALSE; rdr->Entity = rpt->ResourceEntity; rdr->RdrTypeUnion.CtrlRec.Num = ATCAHPI_CTRL_NUM_FRU_POWER_ON_SEQUENCE + num; rdr->RdrTypeUnion.CtrlRec.OutputType = SAHPI_CTRL_GENERIC; rdr->RdrTypeUnion.CtrlRec.Type = SAHPI_CTRL_TYPE_DISCRETE; rdr->RdrTypeUnion.CtrlRec.TypeUnion.Discrete.Default = slotid; rdr->RdrTypeUnion.CtrlRec.DefaultMode.Mode = SAHPI_CTRL_MODE_MANUAL; rdr->RdrTypeUnion.CtrlRec.DefaultMode.ReadOnly = SAHPI_TRUE; rdr->RdrTypeUnion.CtrlRec.WriteOnly = SAHPI_FALSE; oh_init_textbuffer(&rdr->IdString); snprintf((char *)buf, 32, "FRU Power On Sequence #%d", num); oh_append_textbuffer(&rdr->IdString, (void *)buf); c_info->info.atcamap_ctrl_info.data = NULL; c_info->type = OHOI_CTRL_ATCA_MAPPED; c_info->mode = SAHPI_CTRL_MODE_MANUAL; c_info->ohoii.get_control_state = get_atca_fru_pwronseq_control_state; c_info->ohoii.set_control_state = set_atca_fru_pwronseq_control_state; *ctrl_info = c_info; return rdr; } static SaErrorT get_atca_fru_pwronseq_control_state( struct oh_handler_state *hnd, struct ohoi_control_info *c, SaHpiRdrT * rdr, SaHpiCtrlModeT *mode, SaHpiCtrlStateT *state) { struct ohoi_handler *ipmi_handler = hnd->data; ohoi_atca_pwonseq_dsk_t *dsk; GSList *node; int num = rdr->RdrTypeUnion.CtrlRec.Num - ATCAHPI_CTRL_NUM_FRU_POWER_ON_SEQUENCE; if (state == NULL) { goto no_state; } if ((num < 0) || (num >= g_slist_length( ipmi_handler->atca_pwonseq_desk))) { err("wrong dsk number %d", num); return SA_ERR_HPI_INTERNAL_ERROR; } state->Type = SAHPI_CTRL_TYPE_DISCRETE; g_static_rec_mutex_lock(&ipmi_handler->ohoih_lock); node = g_slist_nth(ipmi_handler->atca_pwonseq_desk, num); if (node == NULL) { g_static_rec_mutex_unlock(&ipmi_handler->ohoih_lock); err("No pw on descriptor #%d", num); return SA_ERR_HPI_INTERNAL_ERROR; } dsk = (ohoi_atca_pwonseq_dsk_t *)node->data; state->StateUnion.Discrete = dsk->slotid; g_static_rec_mutex_unlock(&ipmi_handler->ohoih_lock); no_state : if (mode) { *mode = c->mode; } return SA_OK; } static SaErrorT set_atca_fru_pwronseq_control_state( struct oh_handler_state *handler, struct ohoi_control_info *c, SaHpiRdrT * rdr, SaHpiCtrlModeT mode, SaHpiCtrlStateT *state) { struct ohoi_resource_info *res_info; struct ohoi_handler *ipmi_handler = handler->data; SaHpiResourceIdT slotid; SaHpiCtrlRecT *ctrl; // GSList *node; ohoi_atca_pwonseq_dsk_t *dscp = NULL; ohoi_atca_pwonseq_rec_t *recp = NULL; int oldid; int newid; int minid, maxid; int beg, len; int i; if (mode == SAHPI_CTRL_MODE_AUTO) { c->mode = mode; return SA_OK; } if (state->Type != SAHPI_CTRL_TYPE_DISCRETE) { err("wrong state type %d", state->Type); return SA_ERR_HPI_INVALID_DATA; } slotid = state->StateUnion.Discrete; g_static_rec_mutex_lock(&ipmi_handler->ohoih_lock); res_info = oh_get_resource_data(handler->rptcache, ipmi_handler->atca_shelf_id); if (res_info == NULL) { err("No shelf resource info?"); g_static_rec_mutex_unlock(&ipmi_handler->ohoih_lock); return SA_ERR_HPI_INTERNAL_ERROR; } if (res_info->fru == NULL) { g_static_rec_mutex_unlock(&ipmi_handler->ohoih_lock); err("Shelf does not have IDR"); return SA_ERR_HPI_INVALID_DATA; } ctrl = &rdr->RdrTypeUnion.CtrlRec; // find out descriptor with required slotid oldid = 0; for (oldid = 0; oldid < g_slist_length( ipmi_handler->atca_pwonseq_desk); oldid++) { dscp = (ohoi_atca_pwonseq_dsk_t *)g_slist_nth_data( ipmi_handler->atca_pwonseq_desk, oldid); if (dscp == NULL) { break; } if (dscp->slotid == slotid) { break; } } if (dscp == NULL) { g_static_rec_mutex_unlock(&ipmi_handler->ohoih_lock); err("No descriptor for slotid %d", slotid); return SA_ERR_HPI_INVALID_PARAMS; } newid = ctrl->Num - ATCAHPI_CTRL_NUM_FRU_POWER_ON_SEQUENCE; c->mode = mode; if (newid == oldid) { // nothing to do g_static_rec_mutex_unlock(&ipmi_handler->ohoih_lock); return SA_OK; } // Rearrange descriptor ipmi_handler->atca_pwonseq_desk = g_slist_remove( ipmi_handler->atca_pwonseq_desk, dscp); ipmi_handler->atca_pwonseq_desk = g_slist_insert( ipmi_handler->atca_pwonseq_desk, dscp, newid); // Which records are affected and mark them as updated oldid--; maxid = (newid > oldid) ? newid : oldid; minid = (newid < oldid) ? newid : oldid; beg = 0; len = 0; for (i = 0; i < g_slist_length(ipmi_handler->atca_pwonseq_recs); i++) { recp = g_slist_nth_data(ipmi_handler->atca_pwonseq_recs, i); if (recp == NULL) { break; } beg += len; len = recp->head[6]; if ((beg <= maxid) && (beg + len >= minid)) { recp->updated = 1; } } if (ipmi_handler->atca_pwonseq_updated) { // was updated before. nothing to do more g_static_rec_mutex_unlock(&ipmi_handler->ohoih_lock); return SA_OK; } ipmi_handler->atca_pwonseq_updated = 1; send_pwronseq_commit_status_sensor_event(handler, 1); return SA_OK; } /* * FRU Power On Sequence Commit Control */ static SaErrorT get_atca_fru_pwronseq_commit_control_state( struct oh_handler_state *hnd, struct ohoi_control_info *c, SaHpiRdrT * rdr, SaHpiCtrlModeT *mode, SaHpiCtrlStateT *state); static SaErrorT set_atca_fru_pwronseq_commit_control_state( struct oh_handler_state *hnd, struct ohoi_control_info *c, SaHpiRdrT * rdr, SaHpiCtrlModeT mode, SaHpiCtrlStateT *state); static SaHpiRdrT *create_fru_power_on_sequence_commit_control( struct oh_handler_state *handler, SaHpiRptEntryT *rpt, struct ohoi_control_info **ctrl_info) { // struct ohoi_handler *ipmi_handler = handler->data; SaHpiRdrT *rdr; struct ohoi_control_info *c_info; rdr = malloc(sizeof (*rdr)); if (rdr == NULL) { err("Out of memory"); return NULL; } c_info = malloc(sizeof (*c_info)); if (rdr == NULL) { err("Out of memory"); free(rdr); return NULL; } memset(rdr, 0, sizeof (*rdr)); memset(c_info, 0, sizeof (*c_info)); rdr->RdrType = SAHPI_CTRL_RDR; rdr->IsFru = SAHPI_FALSE; rdr->Entity = rpt->ResourceEntity; rdr->RdrTypeUnion.CtrlRec.Num = ATCAHPI_CTRL_NUM_FRU_POWER_ON_SEQUENCE_COMMIT; rdr->RdrTypeUnion.CtrlRec.OutputType = SAHPI_CTRL_GENERIC; rdr->RdrTypeUnion.CtrlRec.Type = SAHPI_CTRL_TYPE_DIGITAL; rdr->RdrTypeUnion.CtrlRec.TypeUnion.Digital.Default = SAHPI_CTRL_STATE_OFF; rdr->RdrTypeUnion.CtrlRec.DefaultMode.Mode = SAHPI_CTRL_MODE_MANUAL; rdr->RdrTypeUnion.CtrlRec.DefaultMode.ReadOnly = SAHPI_TRUE; rdr->RdrTypeUnion.CtrlRec.WriteOnly = SAHPI_FALSE; oh_init_textbuffer(&rdr->IdString); oh_append_textbuffer(&rdr->IdString, "FRU Power On Sequence Commit"); c_info->info.atcamap_ctrl_info.data = NULL; c_info->type = OHOI_CTRL_ATCA_MAPPED; c_info->mode = SAHPI_CTRL_MODE_MANUAL; c_info->ohoii.get_control_state = get_atca_fru_pwronseq_commit_control_state; c_info->ohoii.set_control_state = set_atca_fru_pwronseq_commit_control_state; *ctrl_info = c_info; return rdr; } static SaErrorT get_atca_fru_pwronseq_commit_control_state( struct oh_handler_state *hnd, struct ohoi_control_info *c, SaHpiRdrT * rdr, SaHpiCtrlModeT *mode, SaHpiCtrlStateT *state) { if (state) { state->Type = SAHPI_CTRL_TYPE_DIGITAL; state->StateUnion.Digital = SAHPI_CTRL_STATE_OFF; } if (mode) { *mode = c->mode; } return SA_OK; } struct fru_pwronseq_commit_control_s { struct ohoi_handler *ipmi_handler; unsigned char *buf; unsigned int len; unsigned int num; SaErrorT rv; }; static void write_power_on_sequence_data_cb(ipmi_entity_t *ent, void *cb_data) { struct fru_pwronseq_commit_control_s *info = cb_data; ipmi_fru_t *fru = ipmi_entity_get_fru(ent); int rv; rv = ipmi_fru_set_multi_record(fru, info->num, 0xC0, 0x0, info->buf, info->len); if (rv != 0) { err("ipmi_fru_set_multi_record(fru, %d, 0xC0, 0x0, buf, %d)" " = %d", info->num, info->len, rv); info->rv = SA_ERR_HPI_INTERNAL_ERROR; } } static SaErrorT set_atca_fru_pwronseq_commit_control_state( struct oh_handler_state *hnd, struct ohoi_control_info *c, SaHpiRdrT * rdr, SaHpiCtrlModeT mode, SaHpiCtrlStateT *state) { SaHpiCtrlStateDiscreteT value; struct ohoi_handler *ipmi_handler = hnd->data; struct ohoi_resource_info *res_info; // GSList *dnode, *rnode; ohoi_atca_pwonseq_rec_t *recp; ohoi_atca_pwonseq_dsk_t *dscp; int i, j, di; unsigned int num; unsigned char buf[256]; unsigned int len; struct fru_pwronseq_commit_control_s info; if (mode == SAHPI_CTRL_MODE_AUTO) { return SA_ERR_HPI_READ_ONLY; } value = state->StateUnion.Digital; if (value != SAHPI_CTRL_STATE_PULSE_ON) { err("wrong discrete value %d", value); return SA_ERR_HPI_INVALID_REQUEST; } g_static_rec_mutex_lock(&ipmi_handler->ohoih_lock); if (!ipmi_handler->atca_pwonseq_updated) { g_static_rec_mutex_unlock(&ipmi_handler->ohoih_lock); return SA_OK; } res_info = oh_get_resource_data(hnd->rptcache, ipmi_handler->atca_shelf_id); if ((value == SAHPI_CTRL_STATE_PULSE_OFF) || (value == SAHPI_CTRL_STATE_OFF)) { ipmi_entity_pointer_cb(res_info->u.entity.entity_id, init_power_on_sequence_data_cb, ipmi_handler); send_pwronseq_commit_status_sensor_event(hnd, 0); g_static_rec_mutex_lock(&ipmi_handler->ohoih_lock); return SA_OK; } // SAHPI_CTRL_STATE_PULSE_ON operation // at first check the correctness of the lists num = 0; for (i = 0; ; i++) { recp = (ohoi_atca_pwonseq_rec_t *)g_slist_nth_data( ipmi_handler->atca_pwonseq_recs, i); if (recp == NULL) { if (i != 0) break; else continue; } num += recp->head[6]; } if (num != g_slist_length(ipmi_handler->atca_pwonseq_desk)) { err("list length dismatched: %d != %d", num, g_slist_length(ipmi_handler->atca_pwonseq_desk)); g_static_rec_mutex_unlock(&ipmi_handler->ohoih_lock); return SA_ERR_HPI_INTERNAL_ERROR; } di = 0; for (i = 0; ; i++) { recp = (ohoi_atca_pwonseq_rec_t *)g_slist_nth_data( ipmi_handler->atca_pwonseq_recs, i); if (recp == NULL) { if (i != 0) break; else continue; } if (!recp->updated) { continue; } memcpy(buf, recp->head, 7); len = 7; for (j = 0; j < recp->head[6]; j++) { dscp = (ohoi_atca_pwonseq_dsk_t *)g_slist_nth_data( ipmi_handler->atca_pwonseq_desk, di); if (dscp == NULL) { err("No descrintor %d for record %d", j, i); g_static_rec_mutex_unlock(&ipmi_handler->ohoih_lock); return SA_ERR_HPI_INTERNAL_ERROR; } memcpy(buf + len, dscp->body, 5); len += 5; di++; } #if 0 printf("RECORD: 0x%02x%02x%02x%02x%02x%02x%02x\n", buf[0], buf[1], buf[2], buf[3], buf[4], buf[5], buf[6]); for (j = 0; j < recp->head[6]; j++) printf("%02x%02x%02x%02x%02x\n", buf[7 + 5 * j + 0], buf[7 + 5 * j + 1], buf[7 + 5 * j + 2], buf[7 + 5 * j + 3], buf[7 + 5 * j + 4]); #endif info.ipmi_handler = ipmi_handler; info.buf = buf; info.len = len; info.num = recp->rec_num; info.rv = SA_OK; g_mutex_lock(res_info->fru->mutex); ipmi_entity_pointer_cb(res_info->u.entity.entity_id, write_power_on_sequence_data_cb, &info); g_mutex_unlock(res_info->fru->mutex); if (info.rv != SA_OK) { ipmi_handler->shelf_fru_corrupted = 1; g_static_rec_mutex_unlock(&ipmi_handler->ohoih_lock); return info.rv; } recp->updated = 0; } ipmi_handler->atca_pwonseq_updated = 0; // XXX Call real write fru send_pwronseq_commit_status_sensor_event(hnd, 0); g_static_rec_mutex_unlock(&ipmi_handler->ohoih_lock); return SA_OK; } /* * Creating Virtual Shelf RDRs after domain fully up */ struct create_pwonseq { unsigned char addr; unsigned char devid; }; static int assign_slotid_to_pwonseq( struct oh_handler_state *handler, SaHpiRptEntryT *rpt, struct ohoi_resource_info *res_info, void *cb_data) { ohoi_atca_pwonseq_dsk_t *dsk = cb_data; if (!(res_info->type & OHOI_RESOURCE_SLOT)) { return 0; } if ((dsk->body[0] << 1) != res_info->u.slot.addr) { return 0; } if (dsk->body[1] == res_info->u.slot.devid) { dsk->slotid = rpt->ResourceId; return 1; } if (dsk->body[1] == 0xFE) { dsk->slotid = rpt->ResourceId; return 1; } return 0; } void ohoi_atca_create_shelf_virtual_rdrs(struct oh_handler_state *hnd) { struct ohoi_handler *ipmi_handler = hnd->data; ohoi_atca_pwonseq_dsk_t *dsk; // GSList *node; int i; SaHpiRptEntryT *rpt; SaHpiRdrT *rdr; struct ohoi_control_info *c_info; struct ohoi_sensor_info *s_info; int num_controls = 0; int num_sensors = 0; struct ohoi_resource_info *res_info; g_static_rec_mutex_lock(&ipmi_handler->ohoih_lock); rpt = oh_get_resource_by_id(hnd->rptcache, ipmi_handler->atca_shelf_id); if (rpt == NULL) { err("No rpt for atca chassis?"); return; } res_info = oh_get_resource_data(hnd->rptcache, ipmi_handler->atca_shelf_id); // init data for Power On Sequence RDRs ipmi_entity_pointer_cb(res_info->u.entity.entity_id, init_power_on_sequence_data_cb, ipmi_handler); // Create Shelf Address control rdr = create_atca_shelf_address_control(ipmi_handler, rpt, &c_info); if (rdr != NULL && (oh_add_rdr(hnd->rptcache, ipmi_handler->atca_shelf_id, rdr, c_info, 1) != SA_OK)) { err("couldn't add control rdr"); free(rdr); free(c_info); } else { num_controls++; } // Create Shelf IP Address control rdr = create_atca_shelf_ip_address_control(hnd, rpt, &c_info); if (rdr != NULL && (oh_add_rdr(hnd->rptcache, ipmi_handler->atca_shelf_id, rdr, c_info, 1) != SA_OK)) { err("couldn't add control rdr"); free(rdr); free(c_info); } else { num_controls++; } // Create Chassis Status control rdr = create_atca_chassis_status_control(ipmi_handler, rpt, &c_info); if (rdr != NULL && (oh_add_rdr(hnd->rptcache, ipmi_handler->atca_shelf_id, rdr, c_info, 1) != SA_OK)) { err("couldn't add control rdr"); free(rdr); free(c_info); } else { num_controls++; } // Create Power On Sequence Commit control rdr = create_fru_power_on_sequence_commit_control(hnd, rpt, &c_info); if (rdr != NULL && (oh_add_rdr(hnd->rptcache, ipmi_handler->atca_shelf_id, rdr, c_info, 1) != SA_OK)) { err("couldn't add control rdr"); free(rdr); free(c_info); } else { num_controls++; } // assign Resource slot Ids for FRU activation descriptors // and create FRU Power ON Sequence controls i = 0; for (i = 0; i < g_slist_length(ipmi_handler->atca_pwonseq_desk); i++) { dsk = (ohoi_atca_pwonseq_dsk_t *)g_slist_nth_data( ipmi_handler->atca_pwonseq_desk, i); if (dsk == NULL) { err("no descriptor"); continue; } ohoi_iterate_rptcache(hnd, assign_slotid_to_pwonseq, dsk); rdr = create_fru_power_on_sequence_control(hnd, rpt, &c_info, i, dsk->slotid); if (rdr != NULL && (oh_add_rdr(hnd->rptcache, ipmi_handler->atca_shelf_id, rdr, c_info, 1) != SA_OK)) { err("couldn't add control rdr"); free(rdr); free(c_info); } else { num_controls++; } } // Create Power On Sequence Commit Status sensor rdr = create_fru_power_on_sequence_commit_status_sensor(hnd, rpt, &s_info); if (rdr != NULL && (oh_add_rdr(hnd->rptcache, ipmi_handler->atca_shelf_id, rdr, s_info, 1) != SA_OK)) { err("couldn't add control rdr"); free(rdr); free(s_info); } else { num_sensors++; } if (num_controls) { rpt->ResourceCapabilities |= SAHPI_CAPABILITY_CONTROL | SAHPI_CAPABILITY_RDR; } if (num_sensors) { rpt->ResourceCapabilities |= SAHPI_CAPABILITY_SENSOR | SAHPI_CAPABILITY_RDR; } if (!num_sensors && !num_controls) { g_static_rec_mutex_unlock(&ipmi_handler->ohoih_lock); return; } entity_rpt_set_updated(res_info, ipmi_handler); g_static_rec_mutex_unlock(&ipmi_handler->ohoih_lock); } openhpi-2.14.1/plugins/ipmi/Makefile.am0000644000076400007640000000510011302567001014633 0ustar # # Copyright (c) 2003, Intel Corporation # All rights reserved. # # 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. # # Neither the name of Intel Corporation nor the names # of its contributors may be used to endorse or promote products # derived from this software without specific prior written permission. # # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS # "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT # LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS # FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT # OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, # SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED # TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, # OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY # OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING # NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS # SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. # MAINTAINERCLEANFILES = Makefile.in EXTRA_DIST = ipmi.sym ekeyfru.h SUBDIRS = t INCLUDES = @OPENHPI_INCLUDES@ AM_CFLAGS = @OPENIPMI_CFLAGS@ pkglib_LTLIBRARIES = libipmi.la libipmi_la_SOURCES = ipmi.c \ ipmi_close.c \ ipmi_connection.c \ ipmi_event.c \ ipmi_entity_event.c \ ipmi_mc_event.c \ ipmi_inventory_event.c\ ipmi_sensor_event.c \ ipmi_control_event.c \ ipmi_entity.c \ ipmi_sensor.c \ ipmi_sel.c \ ipmi_inventory.c \ ipmi_controls.c \ ipmi_util.c \ ipmi_drv.c \ hotswap.c \ sync.c \ posix_vlog.c \ atca_shelf_rdrs.c \ atca_slot_rdrs.c \ atca_vshm_rdrs.c \ atca_fru_rdrs.c \ atca_shelf_fru.c \ ipmi.h libipmi_la_LIBADD = $(top_builddir)/utils/libopenhpiutils.la -luuid -lncurses -lOpenIPMI -lOpenIPMIposix @OPENIPMI_LIBS@ #libipmi_la_LDFLAGS = -module -version-info @HPI_LIB_VERSION@ -export-symbols $(srcdir)/ipmi.sym libipmi_la_LDFLAGS = -module -version-info @HPI_LIB_VERSION@ -export-dymanic $(srcdir)/ipmi.sym openhpi-2.14.1/plugins/ipmi/ipmi_sel.c0000644000076400007640000003025311302567001014553 0ustar /* -*- linux-c -*- * * Copyright (c) 2003 by Intel Corp. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Louis Zhuang */ #include "ipmi.h" #include /* * internally used structure for SEL time data **/ struct get_sel_time_cb_data { SaHpiTimeT time; int flag; }; struct ohoi_set_sel_state_cb_data { int enable; int done; }; struct ohoi_get_sel_state_cb_data { int enable; int done; }; /* * SEL num. of entries callback function **/ static void get_sel_count(ipmi_mc_t *mc, void *cb_data) { int *count = cb_data; *count = ipmi_mc_sel_entries_used(mc); } /** * ohoi_get_sel_count: Get IPMI number of SEL entries * @mc_id: management controller id used for OpenIPMI callback * @count: number of entries returned * * This function is called by ipmi.c * This function registers a callback with OpenIPMI's * ipmi_mc_pointer_cb, get's the MC associated with the ID * and calls our function back with the MC and fills in * the number of SEL entries returned to caller. * **/ void ohoi_get_sel_count(ipmi_mcid_t mc_id, int *count) { int rv; *count = -1; rv = ipmi_mc_pointer_cb(mc_id, get_sel_count, count); if (rv<0) err("Unable to convert MC id to a pointer"); } static void get_sel_size(ipmi_mc_t *mc, void *cb_data) { int *size = cb_data; *size = ipmi_mc_sel_get_free_bytes(mc); } void ohoi_get_sel_size(ipmi_mcid_t mc_id, int *size) { int rv; *size = -1; rv = ipmi_mc_pointer_cb(mc_id, get_sel_size, size); if (rv<0) err("Unable to convert MC id to a pointer"); } /** * get_sel_time_cb: callback registered by get_sel_time * @mc: management controller pointer * @err: int error * @time: time returned from OpenIPMI * @cb_data: user requested data * * **/ static void get_sel_time_cb(ipmi_mc_t *mc, int err, unsigned long time, void *cb_data) { struct get_sel_time_cb_data *data = cb_data; data->flag = 1; data->time = time; } /** * get_sel_time: get IPMI SEL time * @mc: management controller id used for OpenIPMI callback * @cb_data: user passed in data * * **/ static void get_sel_time(ipmi_mc_t *mc, void *cb_data) { ipmi_mc_get_current_sel_time(mc, get_sel_time_cb, cb_data); } void ohoi_get_sel_time(ipmi_mcid_t mc_id, SaHpiTimeT *time, void *cb_data) { struct ohoi_handler *ipmi_handler = cb_data; struct get_sel_time_cb_data data; int rv; memset(&data, 0, sizeof(data)); rv = ipmi_mc_pointer_cb(mc_id, get_sel_time, &data); if (rv) { err("Unable to convert domain id to a pointer"); return; } rv = ohoi_loop(&data.flag, ipmi_handler); if (rv) err("Unable to get sel time: Timeout!"); *time = (SaHpiTimeT)data.time*1000000000; } static void get_sel_update_timestamp(ipmi_mc_t *mc, void *cb_data) { SaHpiTimeT *time = cb_data; *time = (SaHpiTimeT)ipmi_mc_sel_get_last_addition_timestamp(mc)*1000000000; } void ohoi_get_sel_updatetime(ipmi_mcid_t mc_id, SaHpiTimeT *time) { int rv; rv = ipmi_mc_pointer_cb(mc_id, get_sel_update_timestamp, time); if (rv) err("Unable to convert domain id to a pointer"); } static void get_sel_overflow(ipmi_mc_t *mc, void *cb_data) { char *overflow = cb_data; *overflow = ipmi_mc_sel_get_overflow(mc); } void ohoi_get_sel_overflow(ipmi_mcid_t mc_id, char *overflow) { int rv; rv = ipmi_mc_pointer_cb(mc_id, get_sel_overflow, overflow); if (rv<0) err("Unable to convert domain id to a pointer"); } static void get_sel_support_del(ipmi_mc_t *mc, void *cb_data) { char *support_del = cb_data; *support_del = ipmi_mc_sel_get_supports_delete_sel(mc); } void ohoi_get_sel_support_del(ipmi_mcid_t mc_id, char *support_del) { int rv; rv = ipmi_mc_pointer_cb(mc_id, get_sel_support_del, support_del); if (rv<0) err("Unable to convert domain id to a pointer"); } static void set_sel_time_done(ipmi_mc_t *mc, int err, void *cb_data) { int *flag = cb_data; *flag = 1; dbg("set_sel_time called, err: %d", err); } struct set_sel_time_cb_data { int flag; struct timeval time; }; static void set_sel_time(ipmi_mc_t *mc, void *cb_data) { struct set_sel_time_cb_data *data = cb_data; int rv; rv = ipmi_mc_set_current_sel_time(mc, &data->time, set_sel_time_done, &data->flag); if (rv) err("Failed to set MC time"); } void ohoi_set_sel_time(ipmi_mcid_t mc_id, const struct timeval *time, void *cb_data) { struct ohoi_handler *ipmi_handler = cb_data; struct set_sel_time_cb_data data; int rv; data.flag = 0; data.time = *time; rv = ipmi_mc_pointer_cb(mc_id, set_sel_time, &data); if (rv) { err("Unable to convert MC id to a pointer"); return; } rv = ohoi_loop(&data.flag, ipmi_handler); if (rv) err("Unable to set SEL time: Timeout!"); return; } struct clear_sel_cb { SaErrorT err; struct ohoi_handler *ipmi_handler; }; static void mc_clear_sel_done(ipmi_mc_t *mc, int err, void *cb_data) { int *flag = cb_data; *flag = 1; dbg("MC sel clear done"); return; } static void clear_sel(ipmi_mc_t *mc, void *cb_data) { struct clear_sel_cb *info = cb_data; int rv; int done = 0; #if 0 ipmi_event_t *event, *event2; event = ipmi_mc_first_event(mc); while (event) { event2 = event; event = ipmi_mc_next_event(mc, event); rv = ipmi_mc_del_event(mc, event2, NULL, NULL); if (rv != 0) { err("ipmi_mc_del_event = 0x%x", rv); info->err = SA_ERR_HPI_INVALID_CMD; return; } ipmi_event_free(event2); } /* we're done, now force an sel_reread so delete takes effect */ rv = ipmi_mc_reread_sel(mc, mc_clear_sel_done, &done); if (rv) { err("ipmi_mc_reread_sel failed"); info->err = SA_ERR_HPI_INVALID_CMD; return; } #endif rv = ipmi_mc_sel_clear(mc, NULL, mc_clear_sel_done, &done); if (rv) { err("ipmi_mc_reread_sel failed"); info->err = SA_ERR_HPI_INVALID_CMD; return; } info->err = ohoi_loop(&done, info->ipmi_handler); } SaErrorT ohoi_clear_sel(ipmi_mcid_t mc_id, void *cb_data) { char support_del = 0; int rv; struct clear_sel_cb info; info.ipmi_handler = cb_data; ohoi_get_sel_support_del(mc_id, &support_del); if (!support_del) { err("MC SEL doesn't support del"); // return SA_ERR_HPI_INVALID_CMD; } info.err = 0; rv = ipmi_mc_pointer_cb(mc_id, clear_sel, &info); if (rv) { err("Unable to convert mcid to pointer: %d", rv); return SA_ERR_HPI_INVALID_CMD; } info.ipmi_handler->sel_clear_done = 1; // atavism return info.err; } static void get_sel_first_entry(ipmi_mc_t *mc, void *cb_data) { ipmi_event_t **event = cb_data; *event = ipmi_mc_first_event(mc); } void ohoi_get_sel_first_entry(ipmi_mcid_t mc_id, ipmi_event_t **event) { int rv; rv = ipmi_mc_pointer_cb(mc_id, get_sel_first_entry, event); if (rv) err("Unable to convert mcid to pointer"); } static void get_sel_last_entry(ipmi_mc_t *mc, void *cb_data) { ipmi_event_t **event = cb_data; *event = ipmi_mc_last_event(mc); } void ohoi_get_sel_last_entry(ipmi_mcid_t mc_id, ipmi_event_t **event) { int rv; rv = ipmi_mc_pointer_cb(mc_id, get_sel_last_entry, event); if (rv) err("Unable to convert mcid to pointer"); } static void get_sel_next_entry(ipmi_mc_t *mc, void *cb_data) { ipmi_event_t **event = cb_data; *event = ipmi_mc_next_event(mc, *event); } void ohoi_get_sel_next_recid(ipmi_mcid_t mc_id, ipmi_event_t *event, unsigned int *record_id) { int rv; ipmi_event_t *te; te = event; rv = ipmi_mc_pointer_cb(mc_id, get_sel_next_entry, &te); if (rv) { err("unable to convert mcid to pointer"); *record_id = SAHPI_NO_MORE_ENTRIES; return; } if (te) *record_id = ipmi_event_get_record_id(te); else *record_id = SAHPI_NO_MORE_ENTRIES; } static void get_sel_prev_entry(ipmi_mc_t *mc, void *cb_data) { ipmi_event_t **event = cb_data; *event = ipmi_mc_prev_event(mc, *event); } void ohoi_get_sel_prev_recid(ipmi_mcid_t mc_id, ipmi_event_t *event, unsigned int *record_id) { int rv; ipmi_event_t *te; te = event; rv = ipmi_mc_pointer_cb(mc_id, get_sel_prev_entry, &te); if (rv) { err("unable to convert mcid to pointer"); *record_id = SAHPI_NO_MORE_ENTRIES; return; } if (te) *record_id = ipmi_event_get_record_id(te); else *record_id = SAHPI_NO_MORE_ENTRIES; } struct ohoi_get_event_by_recid_cb_data { unsigned int record_id; ipmi_event_t *event; }; static void get_sel_by_recid(ipmi_mc_t *mc, void *cb_data) { struct ohoi_get_event_by_recid_cb_data *data = cb_data; data->event = ipmi_mc_event_by_recid(mc, data->record_id); } void ohoi_get_sel_by_recid(ipmi_mcid_t mc_id, SaHpiEventLogEntryIdT entry_id, ipmi_event_t **event) { int rv; struct ohoi_get_event_by_recid_cb_data data; data.record_id = entry_id; data.event = NULL; rv = ipmi_mc_pointer_cb(mc_id, get_sel_by_recid, &data); if(rv) { err("failed to convert mc_id to pointer"); *event = NULL; return; } *event = data.event; } static void set_sel_state_done(ipmi_mc_t *mc, int err, void *cb_data) { int *done = cb_data; if (err == IPMI_IPMI_ERR_VAL(IPMI_INVALID_CMD_CC)) { err("looks like mc doesn't support state changing"); *done = -2; } else if (err) { err("err = %d", err); *done = -1; } else { *done = 1; } } static void set_sel_state(ipmi_mc_t *mc, void *cb_data) { struct ohoi_set_sel_state_cb_data *data = cb_data; int rv; rv = ipmi_mc_set_event_log_enable(mc, data->enable, set_sel_state_done , &data->done); if(rv) { if (rv == ENOSYS) { err("looks like mc doesn't support state changing"); data->done = -2; } else { data->done = -1; } err("failed set_sel_state = %x", rv); } } SaErrorT ohoi_set_sel_state(struct ohoi_handler *ipmi_handler, ipmi_mcid_t mc_id, int enable) { int rv; struct ohoi_set_sel_state_cb_data data; data.done = 0; data.enable = enable; rv = ipmi_mc_pointer_cb(mc_id, set_sel_state, &data); if (rv) { err("failed to convert mc_id to pointer = %d", rv); return SA_ERR_HPI_INTERNAL_ERROR; } rv = ohoi_loop(&data.done, ipmi_handler); if (data.done == -2) { rv = SA_ERR_HPI_ERROR; } else if (data.done < 0) { err("data.done = %d", data.done); rv = SA_ERR_HPI_INTERNAL_ERROR; } if(rv) { err("failed to set sel state to %d = %d", enable, rv); } return rv; } static void get_sel_state_done(ipmi_mc_t *mc, int err, int enable, void *cb_data) { struct ohoi_get_sel_state_cb_data *data = cb_data; data->done = (err == 0) ? 1 : -1; data->enable = enable; } static void get_sel_state(ipmi_mc_t *mc, void *cb_data) { struct ohoi_get_sel_state_cb_data *data = cb_data; int rv; rv = ipmi_mc_get_event_log_enable(mc, get_sel_state_done , data); if(rv) { if (rv == ENOSYS) { // ipmb doesn't support event generator data->done = -2; } else { data->done = -1; } err("failed get_sel_state = %d", rv); } } SaErrorT ohoi_get_sel_state(struct ohoi_handler *ipmi_handler, ipmi_mcid_t mc_id, int *enable) { int rv; struct ohoi_get_sel_state_cb_data data; data.done = 0; rv = ipmi_mc_pointer_cb(mc_id, get_sel_state, &data); if (rv) { err("failed to convert mc_id to pointer = %d", rv); return SA_ERR_HPI_INTERNAL_ERROR; } rv = ohoi_loop(&data.done, ipmi_handler); if (data.done == -2) { rv = SA_ERR_HPI_ERROR; } else if (data.done < 0) { rv = SA_ERR_HPI_INTERNAL_ERROR; } if(rv) { err("failed to get sel state = %d", rv); } else { *enable = data.enable; } return rv; } openhpi-2.14.1/plugins/ipmi/ipmi_entity_event.c0000644000076400007640000006446111302567001016515 0ustar /* -*- linux-c -*- * * Copyright (c) 2003 by Intel Corp. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Louis Zhuang */ #include "ipmi.h" #include #include #include static void trace_ipmi_entity(char *str, int inst, ipmi_entity_t *entity) { if (!getenv("OHOI_TRACE_ENTITY") && !IHOI_TRACE_ALL) { return; } char *type; char logical[24]; logical[0] = 0; switch (ipmi_entity_get_type(entity)) { case IPMI_ENTITY_UNKNOWN: type = "UNKNOWN"; break; case IPMI_ENTITY_MC: type = "MC"; break; case IPMI_ENTITY_FRU: type = "FRU"; if (ipmi_entity_get_is_logical_fru(entity)) { snprintf(logical, 24, " Logical (%d) ", ipmi_entity_get_fru_device_id(entity)); } else { snprintf(logical, 24, " NonLogic(%d) ", ipmi_entity_get_fru_device_id(entity)); } break; case IPMI_ENTITY_GENERIC: type = "GENERIC"; break; case IPMI_ENTITY_EAR: type = "EAR"; break; case IPMI_ENTITY_DREAR: type = "DREAR"; break; default : type = "INVALID"; break; } fprintf(stderr, "*** Entity %s %s %s: %d (%d.%d.%d.%d) (%s) entity = %p\n", type, logical, str, inst, ipmi_entity_get_entity_id(entity), ipmi_entity_get_entity_instance(entity), ipmi_entity_get_device_channel(entity), ipmi_entity_get_device_address(entity), ipmi_entity_get_entity_id_string(entity), entity); } void entity_rpt_set_updated(struct ohoi_resource_info *res_info, struct ohoi_handler *ipmi_handler) { g_static_rec_mutex_lock(&ipmi_handler->ohoih_lock); if (!res_info->presence) { g_static_rec_mutex_unlock(&ipmi_handler->ohoih_lock); return; } res_info->updated = 1; ipmi_handler->updated = 1; g_static_rec_mutex_unlock(&ipmi_handler->ohoih_lock); } void entity_rpt_set_presence(struct ohoi_resource_info *res_info, struct ohoi_handler *ipmi_handler, int present) { g_static_rec_mutex_lock(&ipmi_handler->ohoih_lock); trace_ipmi("res_info %p: old presence %d, new presence %d", res_info, res_info->presence, present); if (present == res_info->presence) { g_static_rec_mutex_unlock(&ipmi_handler->ohoih_lock); return; } res_info->presence = present; res_info->updated = 1; ipmi_handler->updated = 1; g_static_rec_mutex_unlock(&ipmi_handler->ohoih_lock); } int entity_presence(ipmi_entity_t *entity, int present, void *cb_data, ipmi_event_t *event) { struct oh_handler_state *handler = (struct oh_handler_state *)cb_data; struct ohoi_handler *ipmi_handler = handler->data; SaHpiRptEntryT *rpt; SaHpiResourceIdT rid; ipmi_entity_id_t ent_id; struct ohoi_resource_info *res_info; ent_id = ipmi_entity_convert_to_id(entity); g_static_rec_mutex_lock(&ipmi_handler->ohoih_lock); rpt = ohoi_get_resource_by_entityid(handler->rptcache, &ent_id); if (!rpt) { trace_ipmi_entity("SET PRESENCE. NO RPT", present, entity); err("No rpt"); g_static_rec_mutex_unlock(&ipmi_handler->ohoih_lock); return SA_ERR_HPI_NOT_PRESENT; } rid = rpt->ResourceId; if (!(rpt->ResourceCapabilities & SAHPI_CAPABILITY_FRU) && !present) { // This is a workaround trace_ipmi_entity("PRESENCE HANDLER CALLED FOR NOT FRU ENTITY", present, entity); g_static_rec_mutex_unlock(&ipmi_handler->ohoih_lock); return SA_ERR_HPI_NOT_PRESENT; } res_info = oh_get_resource_data(handler->rptcache, rid); if (res_info->presence == present) { g_static_rec_mutex_unlock(&ipmi_handler->ohoih_lock); return SA_OK; } trace_ipmi_entity(present ? "PRESENT" : "NOT PRESENT", present, entity); if (present && res_info->deleted) { // became not present and present again. res_info->deleted = 0; rpt->ResourceFailed = SAHPI_FALSE; } if (IS_ATCA(ipmi_handler->d_type)) { switch (ipmi_entity_get_entity_id(entity)) { case 0xa0: // Blade atca_slot_state_sensor_event_send(handler, rpt, present); break; case 0xf0: // Shelf Manager if ((ipmi_entity_get_device_channel(entity) == 0) && (ipmi_entity_get_device_address(entity) == 32)) { // Virtual ShM. Do nothing. It cannot be. break; } if (present) { ipmi_handler->shmc_present_num++; } else { if (rpt->ResourceFailed) { // it's already marked break; } ipmi_handler->shmc_present_num--; } if (ipmi_handler->fully_up) { ohoi_send_vshmgr_redundancy_sensor_event( handler, present); } break; case 0x1e: // Fan Tray if (present) { ohoi_create_fan_control(handler, rpt->ResourceId); } break; default: break; } } entity_rpt_set_presence(res_info, handler->data, present); if (!present) { res_info->deleted = 1; // send event to infrastructure but don't // touch our local structures while struct oh_event *e = malloc(sizeof(*e)); if (e != NULL) { SaHpiEventUnionT *u = &e->event.EventDataUnion; memset(e, 0, sizeof(*e)); e->resource = *rpt; e->event.Source = rpt->ResourceId; e->event.Severity = rpt->ResourceSeverity; oh_gettimeofday(&e->event.Timestamp); if (rpt->ResourceCapabilities & SAHPI_CAPABILITY_FRU) { e->event.EventType = SAHPI_ET_HOTSWAP; u->HotSwapEvent.HotSwapState = SAHPI_HS_STATE_NOT_PRESENT; u->HotSwapEvent.PreviousHotSwapState = SAHPI_HS_STATE_ACTIVE; } else { e->event.EventType = SAHPI_ET_RESOURCE; u->ResourceEvent.ResourceEventType = SAHPI_RESE_RESOURCE_FAILURE; } e->hid = handler->hid; oh_evt_queue_push(handler->eventq, e); } else { err("Out of memory"); } #if 0 while (SA_OK == oh_remove_rdr(handler->rptcache, rid, SAHPI_FIRST_ENTRY)); ohoi_delete_rpt_fru(res_info); res_info->type = OHOI_RESOURCE_ENTITY; // XXX free inventory area memory #endif } g_static_rec_mutex_unlock(&ipmi_handler->ohoih_lock); return SA_OK; } static void append_parent_epath(SaHpiRptEntryT *entry, SaHpiRptEntryT *parent) { const SaHpiEntityPathT *ep = &(parent->ResourceEntity); oh_concat_ep(&entry->ResourceEntity, ep); } static void init_rpt(SaHpiRptEntryT *entry) { int i; entry->ResourceInfo.ResourceRev = 0; entry->ResourceInfo.SpecificVer = 0; entry->ResourceInfo.DeviceSupport = 0; entry->ResourceInfo.ManufacturerId = 0; entry->ResourceInfo.ProductId = 0; entry->ResourceInfo.FirmwareMajorRev = 0; entry->ResourceInfo.FirmwareMinorRev = 0; entry->ResourceInfo.AuxFirmwareRev = 0; entry->EntryId = 0; entry->ResourceCapabilities = SAHPI_CAPABILITY_RESOURCE; entry->HotSwapCapabilities = 0; for (i=0;i<15;i++) { entry->ResourceInfo.Guid[i] = 0; } entry->ResourceSeverity = SAHPI_MAJOR; /* Default Value -- not related to IPMI */ entry->ResourceFailed = SAHPI_FALSE; oh_init_textbuffer(&entry->ResourceTag); } #if 0 static void _get_is_sel(ipmi_mc_t *mc, void *cb_data) { int *is_selp = cb_data; *is_selp = ipmi_mc_sel_device_support(mc); printf("~~~~~~ MC (%d,%d). sel_support = %d\n", ipmi_mc_get_channel(mc), ipmi_mc_get_address(mc), *is_selp); } #endif static void update_resource_capabilities(ipmi_entity_t *entity, SaHpiRptEntryT *entry, struct ohoi_resource_info *res_info) { if (ipmi_entity_supports_managed_hot_swap(entity)) { trace_ipmi("Entity is hot swapable"); entry->ResourceCapabilities |= SAHPI_CAPABILITY_MANAGED_HOTSWAP; /* if entity supports managed hot swap * check if it has indicator */ /* we need only return value from function */ if (!ipmi_entity_get_hot_swap_indicator(entity, NULL, NULL)) { trace_ipmi("setting SAHPI_HS_CAPABILITY_INDICATOR_SUPPORTED"); entry->HotSwapCapabilities |= SAHPI_HS_CAPABILITY_INDICATOR_SUPPORTED; } } else { entry->ResourceCapabilities &= ~SAHPI_CAPABILITY_MANAGED_HOTSWAP; entry->HotSwapCapabilities &= ~SAHPI_HS_CAPABILITY_INDICATOR_SUPPORTED; } /* OpenIPMI used ipmi_entity_hot_swappable to indicate it's FRU * do not use ipmi_entity_get_is_fru() * it's used only for checking if entity has FRU data */ if ((ipmi_entity_get_entity_id(entity) != 0xf0) || (ipmi_entity_get_device_channel(entity) != 0) || (ipmi_entity_get_device_address(entity) != 32)) { // this is not virtual shelf manager if(ipmi_entity_hot_swappable(entity)) { trace_ipmi("Entity supports simplified hotswap"); entry->ResourceCapabilities |= SAHPI_CAPABILITY_FRU; } else { entry->ResourceCapabilities &= ~SAHPI_CAPABILITY_FRU; } } ipmi_mcid_t mc_id; if (ipmi_entity_get_mc_id(entity, &mc_id) == 0) { res_info->u.entity.mc_id = mc_id; res_info->type |= OHOI_RESOURCE_MC; } else { res_info->type &= ~OHOI_RESOURCE_MC; } } struct add_parent_ep_s { struct oh_handler_state *handler; SaHpiRptEntryT *entry; }; static void add_parent_ep(ipmi_entity_t *ent, ipmi_entity_t *parent, void *cb_data) { struct add_parent_ep_s *info = cb_data; ipmi_entity_id_t parent_id = ipmi_entity_convert_to_id(parent); SaHpiRptEntryT *pr_rpt; pr_rpt = ohoi_get_resource_by_entityid(info->handler->rptcache, &parent_id); if (pr_rpt == NULL) { err(" Couldn't find out res-info for parent: %d.%d.%d.%d %s", ipmi_entity_get_entity_id(parent), ipmi_entity_get_entity_instance(parent), ipmi_entity_get_device_channel(parent), ipmi_entity_get_device_address(parent), ipmi_entity_get_entity_id_string(parent)); trace_ipmi_entity("CAN NOT FIND OUT PARENT. NO RES_INFO", 0, parent); return; } append_parent_epath(info->entry, pr_rpt); return; } static void get_entity_event(ipmi_entity_t *entity, struct ohoi_resource_info *ohoi_res_info, SaHpiRptEntryT *entry, void *cb_data) { SaHpiEntityPathT entity_ep; struct oh_handler_state *handler = cb_data; struct ohoi_handler *ipmi_handler = handler->data; // int rv; const char *str; int entity_id = ipmi_entity_get_entity_id(entity); int entity_instance = ipmi_entity_get_entity_instance(entity); SaHpiEntityPathT ep; unsigned char slot_n_str[8]; int no_slot = 1; unsigned int slot_val = 0; init_rpt(entry); entry->ResourceEntity.Entry[0].EntityType = entity_id; if(entity_instance >= 96) { entry->ResourceEntity.Entry[0].EntityLocation = entity_instance- 96; } else { entry->ResourceEntity.Entry[0].EntityLocation = entity_instance; } entry->ResourceEntity.Entry[1].EntityType = SAHPI_ENT_ROOT; entry->ResourceEntity.Entry[1].EntityLocation = 0; update_resource_capabilities(entity, entry, ohoi_res_info); if (entry->ResourceEntity.Entry[0].EntityType == SAHPI_ENT_SYSTEM_BOARD) { /* This is the BMC entry, so we need to add watchdog. */ if (!ipmi_handler->islan) { // no watchdog commands over lan entry->ResourceCapabilities |= SAHPI_CAPABILITY_WATCHDOG; } } if (ipmi_handler->d_type != IPMI_DOMAIN_TYPE_ATCA) { goto no_atca; } if (entry->ResourceEntity.Entry[0].EntityType == SAHPI_ENT_SYSTEM_CHASSIS) { entry->ResourceEntity.Entry[0].EntityType = SAHPI_ENT_ROOT; entry->ResourceEntity.Entry[0].EntityLocation = 0; oh_append_textbuffer(&entry->ResourceTag, "Shelf"); } /* Since OpenIPMI does not hand us a more descriptive tag which is an SDR issue in the chassis really, we'll over-ride it here until things change */ /* * If entity has a slot try to get it's number */ no_slot = ipmi_entity_get_physical_slot_num(entity, &slot_val); trace_ipmi_entity(" SLOT presence for Entity", no_slot ? 0 : 1, entity); if (no_slot) { /* will use device address */ goto end_of_slot; } { // create Resource for phisical blade slot if it hasn't already been created SaHpiEntityPathT rootep; SaHpiRptEntryT *rpt; struct ohoi_resource_info *s_r_info; char *name; switch (entity_id) { case 0xa0: // Blade ep.Entry[0].EntityType = SAHPI_ENT_PHYSICAL_SLOT; name = "Blade Slot "; break; case 0xf0: // Shelf Manager ep.Entry[0].EntityType = ATCAHPI_ENT_SHELF_MANAGER_SLOT; name = "Shelf Manager Slot "; break; case 0xf1: // Filtration Unit ep.Entry[0].EntityType = ATCAHPI_ENT_FAN_FILTER_TRAY_SLOT; name = "Fan Filter Tray Slot "; break; case 0x0a: // PEM ep.Entry[0].EntityType = ATCAHPI_ENT_POWER_ENTRY_MODULE_SLOT; name = "PEM Slot "; break; case 0xf2: // Shelf FRU ep.Entry[0].EntityType = ATCAHPI_ENT_SHELF_FRU_DEVICE_SLOT; name = "Shelf FRU Device Slot "; break; case 0x1e: // Fan Tray ep.Entry[0].EntityType = ATCAHPI_ENT_FAN_TRAY_SLOT; name = "Fan Tray Slot "; break; case 0xc0: // RTM ep.Entry[0].EntityType = ATCAHPI_ENT_RTM_SLOT; name = "RTM Slot "; break; default: no_slot = 1; goto end_of_slot; } ep.Entry[0].EntityLocation = slot_val; ep.Entry[1].EntityType = SAHPI_ENT_ROOT; ep.Entry[1].EntityLocation = 0; oh_encode_entitypath(ipmi_handler->entity_root, &rootep); oh_concat_ep(&ep, &rootep); rpt = oh_get_resource_by_ep(handler->rptcache, &ep); if (rpt == NULL) { // create rpt for slot SaHpiRptEntryT srpt; int i; init_rpt(&srpt); for (i = 0; i < SAHPI_MAX_ENTITY_PATH; i ++) { srpt.ResourceEntity.Entry[i].EntityLocation = ep.Entry[i].EntityLocation; srpt.ResourceEntity.Entry[i].EntityType = ep.Entry[i].EntityType; if (ep.Entry[i].EntityType == SAHPI_ENT_ROOT) { break; } } oh_append_textbuffer(&srpt.ResourceTag, name); snprintf((char *)slot_n_str, 8, "%d", slot_val); oh_append_textbuffer(&srpt.ResourceTag, (char *)slot_n_str); srpt.ResourceId = oh_uid_from_entity_path(&srpt.ResourceEntity); s_r_info = malloc(sizeof(*ohoi_res_info)); if (s_r_info == NULL) { err("Out of Memory"); goto end_of_slot; } memset(s_r_info, 0, sizeof(*ohoi_res_info)); s_r_info->type = OHOI_RESOURCE_SLOT; s_r_info->u.slot.devid = ipmi_entity_get_fru_device_id(entity); s_r_info->u.slot.addr = ipmi_entity_get_device_address(entity); s_r_info->u.slot.entity_id = ipmi_entity_convert_to_id(entity); if (oh_add_resource(handler->rptcache, &srpt, s_r_info, 1)) { err("couldn't add resource for slot %d", ep.Entry[0].EntityLocation); trace_ipmi_entity("COULD NOT CREATE SLOT for ", 0, entity); no_slot = 1; g_free(s_r_info); goto end_of_slot; } trace_ipmi_entity("CREATE SLOT for ", 0, entity); if (ipmi_entity_get_entity_id(entity) == 0xf0) { // this is not virtual shelf manager ipmi_handler->shmc_num++; } entity_rpt_set_presence(s_r_info, ipmi_handler, 1); rpt = oh_get_resource_by_ep(handler->rptcache, &ep); atca_create_slot_rdrs(handler, srpt.ResourceId); } else { s_r_info = oh_get_resource_data(handler->rptcache, rpt->ResourceId); if (s_r_info && (s_r_info->type & OHOI_RESOURCE_SLOT)) { s_r_info->u.slot.devid = ipmi_entity_get_fru_device_id(entity); s_r_info->u.slot.addr = ipmi_entity_get_device_address(entity); s_r_info->u.slot.entity_id = ipmi_entity_convert_to_id(entity); } else { err("Internal error. s_r_info == %p", s_r_info); } } } end_of_slot: if ((entity_id == 0xa0) && (entity_instance >= 96)) { // ATCA Board if ((ipmi_entity_get_device_address(entity) == 130) || (ipmi_entity_get_device_address(entity) == 132)) { oh_append_textbuffer(&entry->ResourceTag, "Switch "); entry->ResourceEntity.Entry[0].EntityType = SAHPI_ENT_SWITCH_BLADE; } else if (entity_instance == 102) { /* this is here for Force-made Storage blades * until we have access to latest hardware * DO NOT CHANGE */ oh_append_textbuffer(&entry->ResourceTag, "Storage/Disk Blade "); entry->ResourceEntity.Entry[0].EntityType = SAHPI_ENT_DISK_BLADE; } else { oh_append_textbuffer(&entry->ResourceTag, "Blade "); entry->ResourceEntity.Entry[0].EntityType = SAHPI_ENT_SBC_BLADE; } } if ((entity_id == 0x0a) && (entity_instance >= 96)) { // Power Unit oh_append_textbuffer(&entry->ResourceTag, "PEM "); } if ((entity_id == 0xf0) && (entity_instance >= 96)) { // Shelf Manager if ((ipmi_entity_get_device_channel(entity) != 0) || (ipmi_entity_get_device_address(entity) != 32)) { oh_append_textbuffer(&entry->ResourceTag, "Shelf Manager "); } else { oh_append_textbuffer(&entry->ResourceTag, "Virtual Shelf Manager"); no_slot = 1; // XXXX Temporary. Until SDRs fixed ohoi_res_info->type |= OHOI_RESOURCE_MC; ohoi_res_info->u.entity.mc_id = ipmi_handler->virt_mcid; // entry->ResourceCapabilities |= SAHPI_CAPABILITY_EVENT_LOG; } entry->ResourceEntity.Entry[0].EntityType = SAHPI_ENT_SHELF_MANAGER; } if ((entity_id == 0xf2) && (entity_instance >= 96)) { // Shelf FRU oh_append_textbuffer(&entry->ResourceTag, "Shelf FRU Device "); entry->ResourceEntity.Entry[0].EntityType = ATCAHPI_ENT_SHELF_FRU_DEVICE; } if ((entity_id == 0xf1) && (entity_instance >= 96)) { // Filtration Unit oh_append_textbuffer(&entry->ResourceTag, "Fan Filter Tray "); entry->ResourceEntity.Entry[0].EntityType = ATCAHPI_ENT_FILTRATION_UNIT; } if ((entity_id == 0x1e) && (entity_instance >= 96)) { // Fan Tray oh_append_textbuffer(&entry->ResourceTag, "Fan Tray "); } if ((entity_id == 0xc0) && (entity_instance >= 96)) { // Fan Tray oh_append_textbuffer(&entry->ResourceTag, "RTM "); } /* End AdvancedTCA Fix-ups */ if (!no_slot) { oh_append_textbuffer(&entry->ResourceTag, (char *)slot_n_str); } no_atca: if (entry->ResourceTag.DataLength == 0) { str = ipmi_entity_get_entity_id_string(entity); oh_append_textbuffer(&entry->ResourceTag, str); } if (!no_slot) { oh_concat_ep(&entry->ResourceEntity, &ep); } else if (ipmi_entity_get_is_child(entity)) { struct add_parent_ep_s info; info.handler = handler; info.entry = entry; ipmi_entity_iterate_parents(entity, add_parent_ep, &info); } else { oh_encode_entitypath(ipmi_handler->entity_root, &entity_ep); oh_concat_ep(&entry->ResourceEntity, &entity_ep); } entry->ResourceId = oh_uid_from_entity_path(&entry->ResourceEntity); } static void add_entity_event(ipmi_domain_t *domain, ipmi_entity_t *entity, struct oh_handler_state *handler) { struct ohoi_handler *ipmi_handler = handler->data; struct ohoi_resource_info *ohoi_res_info; SaHpiRptEntryT entry; int rv; int inst; inst = ipmi_entity_get_entity_instance(entity); if (inst >= 96) { inst -= 96; } memset(&entry, 0, sizeof (entry)); ohoi_res_info = malloc(sizeof(*ohoi_res_info)); if (!ohoi_res_info) { err("Out of memory"); trace_ipmi_entity("CAN NOT ADD ENTITY. OUT OF MEMORY", inst, entity); return; } memset(ohoi_res_info, 0, sizeof (*ohoi_res_info)); ohoi_res_info->max_ipmb0_link = -1; ohoi_res_info->type = OHOI_RESOURCE_ENTITY; ohoi_res_info->u.entity.entity_id= ipmi_entity_convert_to_id(entity); get_entity_event(entity, ohoi_res_info, &entry, handler); rv = oh_add_resource(handler->rptcache, &entry, ohoi_res_info, 1); if (rv) { err("oh_add_resource failed for %d = %s\n", entry.ResourceId, oh_lookup_error(rv)); trace_ipmi_entity("CAN NOT ADD ENTITY. ADD RESOURCE FAILED", inst, entity); return; } if (!IS_ATCA(ipmi_domain_get_type(domain))) { return; } if (entry.ResourceEntity.Entry[0].EntityType == SAHPI_ENT_SYSTEM_CHASSIS) { ipmi_handler->atca_shelf_id = entry.ResourceId; } if (ipmi_entity_get_type(entity) == IPMI_ENTITY_MC) { ohoi_create_fru_mc_reset_control(handler, entry.ResourceId); } switch (ipmi_entity_get_entity_id(entity)) { case 0xf0: // Shelf Manager if (ipmi_entity_get_device_address(entity) == 0x20) { // this is virtual shelf manager ipmi_handler->atca_vshm_id = entry.ResourceId; create_atca_virt_shmgr_rdrs(handler); // virtual shelf manager always present entity_rpt_set_presence(ohoi_res_info, handler->data, 1); } break; default: break; } } void ohoi_remove_entity(struct oh_handler_state *handler, SaHpiResourceIdT res_id) { struct oh_event *e = NULL; struct ohoi_resource_info *res_info = NULL; SaHpiRptEntryT *rpte = NULL; res_info = oh_get_resource_data(handler->rptcache, res_id); rpte = oh_get_resource_by_id(handler->rptcache, res_id); if (!rpte) { err("Rpt entry not found"); return; } /* Now put an event for the resource to DEL */ e = malloc(sizeof(*e)); if (e == NULL) { err("Out of memory"); return; } memset(e, 0, sizeof(*e)); if (rpte->ResourceCapabilities & SAHPI_CAPABILITY_FRU) { SaHpiHotSwapEventT *hse = &e->event.EventDataUnion.HotSwapEvent; e->event.EventType = SAHPI_ET_HOTSWAP; hse->HotSwapState = SAHPI_HS_STATE_NOT_PRESENT; hse->PreviousHotSwapState = SAHPI_HS_STATE_ACTIVE; } else { SaHpiResourceEventT *re = &e->event.EventDataUnion.ResourceEvent; e->event.EventType = SAHPI_ET_RESOURCE; re->ResourceEventType = SAHPI_RESE_RESOURCE_FAILURE; } e->resource = *rpte; e->event.Source = rpte->ResourceId; e->event.Severity = rpte->ResourceSeverity; oh_gettimeofday(&e->event.Timestamp); e->hid = handler->hid; oh_evt_queue_push(handler->eventq, e); entity_rpt_set_updated(res_info, handler->data); } static void change_entity(struct oh_handler_state *handler, ipmi_entity_t *entity) { struct ohoi_handler *ipmi_handler = handler->data; ipmi_entity_id_t entity_id = ipmi_entity_convert_to_id(entity); SaHpiRptEntryT *rpt; SaHpiResourceIdT slot_id; struct ohoi_resource_info *s_r_info; struct ohoi_resource_info *res_info; unsigned int dummy; rpt = ohoi_get_resource_by_entityid(handler->rptcache, &entity_id); if (rpt == NULL) { err("Couldn't find out resource by entity %d.%.d.%d.%d %s", ipmi_entity_get_entity_id(entity), ipmi_entity_get_entity_instance(entity), ipmi_entity_get_device_channel(entity), ipmi_entity_get_device_address(entity), ipmi_entity_get_entity_id_string(entity)); trace_ipmi_entity("CAN NOT CHANGE RESOURCE. NO RPT", 0, entity); return; } res_info = oh_get_resource_data(handler->rptcache, rpt->ResourceId); update_resource_capabilities(entity, rpt, res_info); entity_rpt_set_updated(res_info, ipmi_handler); if (ipmi_handler->d_type != IPMI_DOMAIN_TYPE_ATCA) { return; } if (ipmi_entity_get_physical_slot_num(entity, &dummy)) { // entity does not have a slot return; } #if 0 if (ipmi_entity_get_type(entity) == IPMI_ENTITY_MC) { if (!(res_info->type & OHOI_MC_RESET_CONTROL_CREATED)) { ohoi_create_fru_mc_reset_control(handler, rpt->ResourceId); } if (!(res_info->type & OHOI_MC_IPMB0_CONTROL_CREATED) && (res_info->max_ipmb0_link >= 0)) { ohoi_create_ipmb0_controls(handler, entity, (SaHpiCtrlStateAnalogT)res_info->max_ipmb0_link); } } #endif slot_id = ohoi_get_parent_id(rpt); s_r_info = oh_get_resource_data(handler->rptcache, slot_id); if (s_r_info && (s_r_info->type & OHOI_RESOURCE_SLOT)) { s_r_info->u.slot.devid = ipmi_entity_get_fru_device_id(entity); s_r_info->u.slot.addr = ipmi_entity_get_device_address(entity); } else { err("No res_info(%p) for slot %d", s_r_info, slot_id); } } static void delete_entity(struct oh_handler_state *handler, ipmi_entity_t *entity) { ipmi_entity_id_t entity_id = ipmi_entity_convert_to_id(entity); SaHpiRptEntryT *rpt; struct ohoi_resource_info *res_info; rpt = ohoi_get_resource_by_entityid(handler->rptcache, &entity_id); if (rpt == NULL) { err("couldn't find out resource"); return; } res_info = oh_get_resource_data(handler->rptcache, rpt->ResourceId); // send event to infrastructure and remove rpt entry struct oh_event *e = malloc(sizeof(*e)); if (e != NULL) { memset(e, 0, sizeof(*e)); if (rpt->ResourceCapabilities & SAHPI_CAPABILITY_FRU) { e->event.EventType = SAHPI_ET_HOTSWAP; e->event.EventDataUnion.HotSwapEvent.HotSwapState = SAHPI_HS_STATE_NOT_PRESENT; } else { e->event.EventType = SAHPI_ET_RESOURCE; e->event.EventDataUnion.ResourceEvent.ResourceEventType = SAHPI_RESE_RESOURCE_FAILURE; } e->resource = *rpt; e->event.Source = rpt->ResourceId; e->event.Severity = rpt->ResourceSeverity; oh_gettimeofday(&e->event.Timestamp); e->hid = handler->hid; oh_evt_queue_push(handler->eventq, e); } else { err("Out of memory"); } while (SA_OK == oh_remove_rdr(handler->rptcache, rpt->ResourceId, SAHPI_FIRST_ENTRY)); if (res_info) { ohoi_delete_rpt_fru(res_info); } oh_remove_resource(handler->rptcache, rpt->ResourceId); } void ohoi_entity_event(enum ipmi_update_e op, ipmi_domain_t *domain, ipmi_entity_t *entity, void *cb_data) { struct oh_handler_state *handler = cb_data; struct ohoi_handler *ipmi_handler = handler->data; int rv; int inst=0; inst=ipmi_entity_get_entity_instance(entity); if(inst >=96) { inst = inst - 96; } g_static_rec_mutex_lock(&ipmi_handler->ohoih_lock); switch (op) { case IPMI_ADDED: add_entity_event(domain, entity, handler); trace_ipmi_entity("ADDED", inst, entity); /* entity presence overall */ rv = ipmi_entity_add_presence_handler(entity, entity_presence, handler); if (rv) err("ipmi_entity_set_presence_handler: %#x", rv); /* hotswap handler */ rv = ipmi_entity_add_hot_swap_handler(entity, ohoi_hot_swap_cb, cb_data); if(rv) err("Failed to set entity hot swap handler"); /* sensors */ rv= ipmi_entity_add_sensor_update_handler(entity, ohoi_sensor_event, handler); if (rv) { err("ipmi_entity_set_sensor_update_handler: %#x", rv); break; } /* controls */ rv = ipmi_entity_add_control_update_handler(entity, ohoi_control_event, handler); if (rv) { err("ipmi_entity_set_control_update_handler: %#x", rv); return; } /* inventory (a.k.a FRU) */ rv = ipmi_entity_add_fru_update_handler(entity, ohoi_inventory_event, handler); if (rv) { err("ipmi_entity_set_fru_update_handler: %#x", rv); break; } break; case IPMI_DELETED: delete_entity(handler, entity); trace_ipmi_entity("DELETED", inst, entity); break; case IPMI_CHANGED: change_entity(handler, entity); trace_ipmi_entity("CHANGED", inst, entity); break; default: err("Entity: Unknow change?!"); } g_static_rec_mutex_unlock(&ipmi_handler->ohoih_lock); } openhpi-2.14.1/plugins/ipmi/posix_vlog.c0000644000076400007640000000326411302567001015145 0ustar /* -*- linux-c -*- * * Copyright (c) 2003 by Intel Corp. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Louis Zhuang */ #include "ipmi.h" void posix_vlog(char *format, enum ipmi_log_type_e log_type, va_list ap) { int do_nl = 1; char *msg = getenv("OHOI_TRACE_MSG"); char *mem = getenv("OHOI_DBG_MEM"); int do_debug = (getenv("OPENHPI_ERROR") && !strcmp("YES", getenv("OPENHPI_ERROR"))); if ((msg || mem) && trace_msg_file) { vfprintf(trace_msg_file, format, ap); if ((log_type == IPMI_LOG_DEBUG_END) && do_nl) fprintf(trace_msg_file, "\n"); if (mem) fprintf(trace_msg_file, "\n"); fflush(trace_msg_file); } if (!do_debug) { return; } switch(log_type) { case IPMI_LOG_INFO: printf("INFO: "); do_nl = 1; break; case IPMI_LOG_WARNING: printf("WARN: "); do_nl = 1; break; case IPMI_LOG_SEVERE: printf("SEVR: "); do_nl = 1; break; case IPMI_LOG_FATAL: printf("FATL: "); do_nl = 1; break; case IPMI_LOG_ERR_INFO: printf("EINF: "); do_nl = 1; break; case IPMI_LOG_DEBUG_START: /* FALLTHROUGH */ case IPMI_LOG_DEBUG: printf("DEBG: "); break; case IPMI_LOG_DEBUG_CONT: /* FALLTHROUGH */ case IPMI_LOG_DEBUG_END: break; } vprintf(format, ap); if (do_nl) printf("\n"); } openhpi-2.14.1/plugins/ipmi/atca_shelf_fru.c0000644000076400007640000010555511302567001015727 0ustar /* -*- linux-c -*- * * Copyright (c) 2005 by Intel Corp. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Vadim Revyakin */ #include "ipmi.h" #include "ekeyfru.h" #include #include typedef struct atca_oem_field_info { SaHpiEntryIdT field; unsigned int rec_num; unsigned int pad_len; unsigned int off; unsigned int len; } atca_oem_field_info_t; typedef struct atca_oem_area_info { SaHpiEntryIdT area; unsigned int record; int field_num; atca_oem_field_info_t *fields; } atca_oem_area_info_t; typedef struct ohoi_atca_pw_on_seq_s { unsigned char head[7]; unsigned char updated; int dsk_num; } ohoi_atca_pw_on_seq_t; /* Structures to create E-Keying sensors */ typedef unsigned char GUID_t[16]; typedef struct { unsigned char link_grouping_id; unsigned char link_type; unsigned char link_type_extension; unsigned char interface_type; unsigned char channels[16]; } ekey_descriptor_t; typedef struct { GUID_t guids[15]; int guid_number; GSList *descriptors; } ekey_sensors_info_t; static SaHpiEntryIdT init_ftrst_fields(atca_oem_field_info_t *fields, unsigned char *data) { // Manufacture Id fields[0].field = OHOI_FIELD_FIRST_ID; fields[0].off = 0; fields[0].len = 3; // Record Id fields[1].field = OHOI_FIELD_FIRST_ID + 1; fields[1].off = 3; fields[1].len = 1; // Format version fields[2].field = OHOI_FIELD_FIRST_ID + 2; fields[2].off = 4; fields[2].len = 1; return OHOI_FIELD_FIRST_ID + 3; } static atca_oem_area_info_t *create_address_table_oem_area( unsigned char *data, unsigned int length) { atca_oem_field_info_t *fields; atca_oem_area_info_t *area; unsigned int len, off; SaHpiEntryIdT cur_field; unsigned int i; if (length < 27 + data[26] * 3) { err("Record length(0x%x) mismatches with expected(0x%x)", length, 27 + data[26] * 3); return NULL; } len = 6 + data[26]; fields = malloc(sizeof (atca_oem_field_info_t) * len); if (fields == NULL) { err("Out of memory"); return NULL; } memset(fields, 0, sizeof (atca_oem_field_info_t) * len); cur_field = init_ftrst_fields(fields, data); // Type/Length of Address fields[cur_field - OHOI_FIELD_FIRST_ID].field = cur_field; fields[cur_field - OHOI_FIELD_FIRST_ID].off = 5; fields[cur_field - OHOI_FIELD_FIRST_ID].len = 1; cur_field++; // Shelf Address fields[cur_field - OHOI_FIELD_FIRST_ID].field = cur_field; fields[cur_field - OHOI_FIELD_FIRST_ID].off = 6; fields[cur_field - OHOI_FIELD_FIRST_ID].len = 6; cur_field++; // Entries Count fields[cur_field - OHOI_FIELD_FIRST_ID].field = cur_field; fields[cur_field - OHOI_FIELD_FIRST_ID].off = 26; fields[cur_field - OHOI_FIELD_FIRST_ID].len = 1; cur_field++; off = 27; for (i = 0; i < data[26]; i++) { // Address Mapping Tables fields[cur_field - OHOI_FIELD_FIRST_ID].field = cur_field; fields[cur_field - OHOI_FIELD_FIRST_ID].off = off + 3 * i; fields[cur_field - OHOI_FIELD_FIRST_ID].len = 3; cur_field++; } area = malloc(sizeof (atca_oem_area_info_t)); if (area == NULL) { err("Out of memory"); free(fields); return NULL; } area->field_num = cur_field - OHOI_FIELD_FIRST_ID; area->fields = fields; return area; } static atca_oem_area_info_t *create_shm_ip_connection_oem_area( unsigned char *data, unsigned int length) { atca_oem_field_info_t *fields; atca_oem_area_info_t *area; int len; SaHpiEntryIdT cur_field; len = 6; fields = malloc(sizeof (atca_oem_field_info_t) * len); if (fields == NULL) { err("Out of memory"); return NULL; } memset(fields, 0,sizeof (atca_oem_field_info_t) * len); cur_field = init_ftrst_fields(fields, data); // Shelf Manager IP Address fields[cur_field - OHOI_FIELD_FIRST_ID].field = cur_field; fields[cur_field - OHOI_FIELD_FIRST_ID].off = 5; fields[cur_field - OHOI_FIELD_FIRST_ID].len = 4; fields[cur_field - OHOI_FIELD_FIRST_ID].pad_len = 12; cur_field++; // Default Gateway Address fields[cur_field - OHOI_FIELD_FIRST_ID].field = cur_field; fields[cur_field - OHOI_FIELD_FIRST_ID].off = 9; fields[cur_field - OHOI_FIELD_FIRST_ID].len = 4; fields[cur_field - OHOI_FIELD_FIRST_ID].pad_len = 12; cur_field++; // Subnet Mask fields[cur_field - OHOI_FIELD_FIRST_ID].field = cur_field; fields[cur_field - OHOI_FIELD_FIRST_ID].off = 13; fields[cur_field - OHOI_FIELD_FIRST_ID].len = 4; fields[cur_field - OHOI_FIELD_FIRST_ID].pad_len = 12; cur_field++; area = malloc(sizeof (atca_oem_area_info_t)); if (area == NULL) { err("Out of memory"); free(fields); return NULL; } area->field_num = cur_field - OHOI_FIELD_FIRST_ID; area->fields = fields; return area; } static void handle_ekey_dsk(ekey_sensors_info_t *eks_info, unsigned char *bytes) { int ch_num = CHANNEL_NUM(bytes); unsigned char link_grouping_id = LINK_GROUPING_ID(bytes); unsigned char link_type_extension = LINK_TYPE_EXTENSION(bytes); unsigned char link_type = LINK_TYPE(bytes); unsigned char interface_type = INTERFACE_TYPE(bytes); unsigned char ports = PORTS(bytes); ekey_descriptor_t *dsk = NULL; GSList *node; #if DEBUG_EKEY printf("EKEY %02X%02X%02X%02X ", bytes[0], bytes[1], bytes[2], bytes[3]); #endif if (ch_num == 0 || ch_num >= 16) { err("channel number too big = %d", ch_num); #if DEBUG_EKEY printf("channel number too big = %d\n", ch_num); #endif return; } for (node = eks_info->descriptors; node; node = g_slist_next(node)) { dsk = g_slist_nth_data(node, 0); if (link_grouping_id == 0) { break; } if (dsk->link_grouping_id != link_grouping_id) { continue; } if (dsk->link_type_extension != link_type_extension) { continue; } if (dsk->link_type != link_type) { continue; } if (dsk->interface_type != interface_type) { continue; } dsk->channels[ch_num - 1] |= ports; #if DEBUG_EKEY printf("FOUND: (%d,%d,%d,%d) add ports 0x%x to channel %d\n", link_grouping_id, link_type, link_type_extension, interface_type, dsk->channels[ch_num], ch_num); #endif return; } dsk = malloc(sizeof (ekey_descriptor_t)); if (dsk == NULL) { err("No Memory"); return; } memset(dsk, 0, sizeof (ekey_descriptor_t)); dsk->link_grouping_id = link_grouping_id; dsk->link_type_extension = link_type_extension; dsk->link_type = link_type; dsk->interface_type = interface_type; dsk->channels[ch_num - 1] = ports; #if DEBUG_EKEY printf("NEW: (%d,%d,%d,%d) ports 0x%x to channel %d\n", link_grouping_id, link_type, link_type_extension, interface_type, dsk->channels[ch_num - 1], ch_num); #endif eks_info->descriptors = g_slist_append(eks_info->descriptors, dsk); } static atca_oem_area_info_t *create_board_p2p_connectivity_oem_area( unsigned char *data, unsigned int length, ekey_sensors_info_t *eks_info) { atca_oem_field_info_t *fields; atca_oem_area_info_t *area; int len; int num_desk; int i; int off; SaHpiEntryIdT cur_field; if (length < 6 + data[5] * 16) { err("Record length(0x%x) mismatches with expected(0x%x)", length, 6 + data[5] * 16); return NULL; } if ((length - (6 + data[5] * 16)) % 4) { err("The rest of record is not divisible by 4: %d - (%d)", length, 6 + data[5] * 16); return NULL; } num_desk = (length - (6 + data[5] * 16)) / 4; len = 4 + data[5] + num_desk + 1; fields = malloc(sizeof (atca_oem_field_info_t) * len); if (fields == NULL) { err("Out of memory"); return NULL; } memset(fields, 0,sizeof (atca_oem_field_info_t) * len); cur_field = init_ftrst_fields(fields, data); // OEM GUID count fields[cur_field - OHOI_FIELD_FIRST_ID].field = cur_field; fields[cur_field - OHOI_FIELD_FIRST_ID].off = 5; fields[cur_field - OHOI_FIELD_FIRST_ID].len = 1; cur_field++; for (i = 0; i < data[5]; i++) { // OEM GUIDs fields[cur_field - OHOI_FIELD_FIRST_ID].field = cur_field; fields[cur_field - OHOI_FIELD_FIRST_ID].off = 6 + 16 * i; fields[cur_field - OHOI_FIELD_FIRST_ID].len = 16; cur_field++; if (eks_info->guid_number < 15) { memcpy(eks_info->guids[eks_info->guid_number], &data[6 + 16 * i], 16); eks_info->guid_number++; } else { err("Too many GUIDS"); } } #if 0 // Number of link descriptors (virtual field) fields[cur_field - OHOI_FIELD_FIRST_ID].field = cur_field; fields[cur_field - OHOI_FIELD_FIRST_ID].off = num_desk; fields[cur_field - OHOI_FIELD_FIRST_ID].len = 0; cur_field++; #endif off = 6 + 16 * data[5]; for (i = 0; i < num_desk; i++) { // Link Descriptors fields[cur_field - OHOI_FIELD_FIRST_ID].field = cur_field; fields[cur_field - OHOI_FIELD_FIRST_ID].off = off + 4 * i; fields[cur_field - OHOI_FIELD_FIRST_ID].len = 4; cur_field++; handle_ekey_dsk(eks_info, &data[off + 4 * i]); } area = malloc(sizeof (atca_oem_area_info_t)); if (area == NULL) { err("Out of memory"); free(fields); return NULL; } area->field_num = cur_field - OHOI_FIELD_FIRST_ID; area->fields = fields; return area; } static atca_oem_area_info_t *create_p2p_connectivity_oem_area( unsigned char *data, int desk_num, unsigned int length) { atca_oem_field_info_t *fields; atca_oem_area_info_t *area; int len; SaHpiEntryIdT cur_field; int off = 5; int i; for (i = 0; i < desk_num; i++) { if (off + 3 + data[off + 2] * 3 >= length) { err("dismatch datalen(0x%x) and record struct(0x%x)" " desk_num = %d", length, off + 3 + data[off + 2] * 3, desk_num); return NULL; } off = off + 3 + data[off + 2] * 3; } //printf(" **** create_p2p_connectivity_oem_area: %d: off = 0x%x, num = 0x%x\n", // feed_num, off, data[off + 2]); len = 6 + data[off + 2]; fields = malloc(sizeof (atca_oem_field_info_t) * len); if (fields == NULL) { err("Out of memory"); return NULL; } memset(fields, 0,sizeof (atca_oem_field_info_t) * len); cur_field = init_ftrst_fields(fields, data); // Point-to-Point Channel Type fields[cur_field - OHOI_FIELD_FIRST_ID].field = cur_field; fields[cur_field - OHOI_FIELD_FIRST_ID].off = off; fields[cur_field - OHOI_FIELD_FIRST_ID].len = 1; cur_field++; // Slot Address fields[cur_field - OHOI_FIELD_FIRST_ID].field = cur_field; fields[cur_field - OHOI_FIELD_FIRST_ID].off = off + 1; fields[cur_field - OHOI_FIELD_FIRST_ID].len = 1; cur_field++; // Channel Count fields[cur_field - OHOI_FIELD_FIRST_ID].field = cur_field; fields[cur_field - OHOI_FIELD_FIRST_ID].off = off + 2; fields[cur_field - OHOI_FIELD_FIRST_ID].len = 1; cur_field++; for (i = 0; i < data[off + 2]; i++) { fields[cur_field - OHOI_FIELD_FIRST_ID].field = cur_field; fields[cur_field - OHOI_FIELD_FIRST_ID].off = off +3 + 3 * i; fields[cur_field - OHOI_FIELD_FIRST_ID].len = 3; cur_field++; } area = malloc(sizeof (atca_oem_area_info_t)); if (area == NULL) { err("Out of memory"); free(fields); return NULL; } area->field_num = cur_field - OHOI_FIELD_FIRST_ID; area->fields = fields; return area; } static atca_oem_area_info_t *create_power_distribution_oem_area( unsigned char *data, int feed_num, unsigned int length) { atca_oem_field_info_t *fields; atca_oem_area_info_t *area; int len; SaHpiEntryIdT cur_field; int off = 6; int i; for (i = 0; i < feed_num; i++) { if (off + 6 + data[off + 5] * 2 >= length) { err("dismatch datalen(0x%x) and record struct(" "0x%x + 6 + 0x%x * 2)" " feed_num = %d", length, off, data[off + 5], feed_num); return NULL; } off += 6 + data[off + 5] * 2; } //printf(" **** create_power_distribution_oem_area: %d: off = 0x%x, num = 0x%x\n", //feed_num, off, data[off + 5]); len = 7 + data[off + 5]; fields = malloc(sizeof (atca_oem_field_info_t) * len); if (fields == NULL) { err("Out of memory"); return NULL; } memset(fields, 0,sizeof (atca_oem_field_info_t) * len); cur_field = init_ftrst_fields(fields, data); // Maximum External Available Current fields[cur_field - OHOI_FIELD_FIRST_ID].field = cur_field; fields[cur_field - OHOI_FIELD_FIRST_ID].off = off; fields[cur_field - OHOI_FIELD_FIRST_ID].len = 2; cur_field++; // Maximum Internal Current fields[cur_field - OHOI_FIELD_FIRST_ID].field = cur_field; fields[cur_field - OHOI_FIELD_FIRST_ID].off = off + 2; fields[cur_field - OHOI_FIELD_FIRST_ID].len = 2; cur_field++; // Maximum Expected Operating Voltage fields[cur_field - OHOI_FIELD_FIRST_ID].field = cur_field; fields[cur_field - OHOI_FIELD_FIRST_ID].off = off + 4; fields[cur_field - OHOI_FIELD_FIRST_ID].len = 1; cur_field++; // FRU to Feed Mapping Entries Count fields[cur_field - OHOI_FIELD_FIRST_ID].field = cur_field; fields[cur_field - OHOI_FIELD_FIRST_ID].off = off + 5; fields[cur_field - OHOI_FIELD_FIRST_ID].len = 1; cur_field++; for (i = 0; i < data[off + 5]; i++) { fields[cur_field - OHOI_FIELD_FIRST_ID].field = cur_field; fields[cur_field - OHOI_FIELD_FIRST_ID].off = off + 6 + i * 2; fields[cur_field - OHOI_FIELD_FIRST_ID].len = 2; cur_field++; } area = malloc(sizeof (atca_oem_area_info_t)); if (area == NULL) { err("Out of memory"); free(fields); return NULL; } area->field_num = cur_field - OHOI_FIELD_FIRST_ID; area->fields = fields; return area; } static atca_oem_area_info_t *create_activation_and_pm_oem_area( unsigned char *data, unsigned int length) { atca_oem_field_info_t *fields; atca_oem_area_info_t *area; unsigned int len, off; unsigned int i; SaHpiEntryIdT cur_field; if (length < 7 + data[6] * 5) { err("Record length(0x%x) mismatches with expected(0x%x)", length, 7 + data[6] * 5); return NULL; } len = 5 + data[6]; fields = malloc(sizeof (atca_oem_field_info_t) * len); if (fields == NULL) { err("Out of memory"); return NULL; } memset(fields, 0,sizeof (atca_oem_field_info_t) * len); cur_field = init_ftrst_fields(fields, data); // Allowance For FRU Activation Readiness fields[cur_field - OHOI_FIELD_FIRST_ID].field = cur_field; fields[cur_field - OHOI_FIELD_FIRST_ID].off = 5; fields[cur_field - OHOI_FIELD_FIRST_ID].len = 1; cur_field++; // Descripror Count fields[cur_field - OHOI_FIELD_FIRST_ID].field = cur_field; fields[cur_field - OHOI_FIELD_FIRST_ID].off = 6; fields[cur_field - OHOI_FIELD_FIRST_ID].len = 1; cur_field++; off = 7; for (i = 0; i < data[6]; i++) { // Address Mapping Tables fields[cur_field - OHOI_FIELD_FIRST_ID].field = cur_field; fields[cur_field - OHOI_FIELD_FIRST_ID].off = off + 5 * i; fields[cur_field - OHOI_FIELD_FIRST_ID].len = 5; cur_field++; } area = malloc(sizeof (atca_oem_area_info_t)); if (area == NULL) { err("Out of memory"); free(fields); return NULL; } area->field_num = cur_field - OHOI_FIELD_FIRST_ID; area->fields = fields; return area; } static atca_oem_area_info_t *create_radial_ipmb0_link_oem_area( unsigned char *data, unsigned int length, unsigned int *max_link) { atca_oem_field_info_t *fields; atca_oem_area_info_t *area; unsigned int len, off; unsigned int i; SaHpiEntryIdT cur_field; if (length < 11 + data[10] * 2) { err("Record length(0x%x) mismatches with expected(0x%x)", length, 11 + data[10] * 2); return NULL; } len = 6 + data[10]; fields = malloc(sizeof (atca_oem_field_info_t) * len); if (fields == NULL) { err("Out of memory"); return NULL; } memset(fields, 0,sizeof (atca_oem_field_info_t) * len); cur_field = init_ftrst_fields(fields, data); // IPMB-0 Connector Definer fields[cur_field - OHOI_FIELD_FIRST_ID].field = cur_field; fields[cur_field - OHOI_FIELD_FIRST_ID].off = 5; fields[cur_field - OHOI_FIELD_FIRST_ID].len = 3; cur_field++; // IPMB-0 Connector Version ID fields[cur_field - OHOI_FIELD_FIRST_ID].field = cur_field; fields[cur_field - OHOI_FIELD_FIRST_ID].off = 8; fields[cur_field - OHOI_FIELD_FIRST_ID].len = 2; cur_field++; // Address Entry Count fields[cur_field - OHOI_FIELD_FIRST_ID].field = cur_field; fields[cur_field - OHOI_FIELD_FIRST_ID].off = 10; fields[cur_field - OHOI_FIELD_FIRST_ID].len = 1; cur_field++; off = 11; for (i = 0; i < data[10]; i++) { // IPMIB-0 Link Mapping Entries fields[cur_field - OHOI_FIELD_FIRST_ID].field = cur_field; fields[cur_field - OHOI_FIELD_FIRST_ID].off = off + 2 * i; fields[cur_field - OHOI_FIELD_FIRST_ID].len = 2; cur_field++; if (data[off + 2 * i + 1] > *max_link) { // calculating maximum link number for IPMB controls *max_link = data[off + 2 * i + 1]; } } area = malloc(sizeof (atca_oem_area_info_t)); if (area == NULL) { err("Out of memory"); free(fields); return NULL; } area->field_num = cur_field - OHOI_FIELD_FIRST_ID; area->fields = fields; return area; } static atca_oem_area_info_t *create_amc_carrier_information_table_oem_area( unsigned char *data, unsigned int length) { atca_oem_field_info_t *fields; atca_oem_area_info_t *area; int len; SaHpiEntryIdT cur_field; int off; int i; if (length < 7 + data[6]) { err("Record length(0x%x) mismatches with expected(0x%x)", length, 7 + data[6]); return NULL; } len = 5 + data[6]; fields = malloc(sizeof (atca_oem_field_info_t) * len); if (fields == NULL) { err("Out of memory"); return NULL; } memset(fields, 0,sizeof (atca_oem_field_info_t) * len); cur_field = init_ftrst_fields(fields, data); // AMC.0 Extension Version fields[cur_field - OHOI_FIELD_FIRST_ID].field = cur_field; fields[cur_field - OHOI_FIELD_FIRST_ID].off = 5; fields[cur_field - OHOI_FIELD_FIRST_ID].len = 1; cur_field++; // Carrier Site Number Count fields[cur_field - OHOI_FIELD_FIRST_ID].field = cur_field; fields[cur_field - OHOI_FIELD_FIRST_ID].off = 6; fields[cur_field - OHOI_FIELD_FIRST_ID].len = 1; cur_field++; off = 7; for (i = 0; i < data[6]; i++) { // Carrier Site Number fields[cur_field - OHOI_FIELD_FIRST_ID].field = cur_field; fields[cur_field - OHOI_FIELD_FIRST_ID].off = off + i; fields[cur_field - OHOI_FIELD_FIRST_ID].len = 1; cur_field++; } area = malloc(sizeof (atca_oem_area_info_t)); if (area == NULL) { err("Out of memory"); free(fields); return NULL; } area->field_num = cur_field - OHOI_FIELD_FIRST_ID; area->fields = fields; return area; } static atca_oem_area_info_t *create_carrier_activ_and_curmngmt_oem_area( unsigned char *data, unsigned int length) { atca_oem_field_info_t *fields; atca_oem_area_info_t *area; int len; SaHpiEntryIdT cur_field; int off; int i; if (length < 9 + data[8] * 3) { err("Record length(0x%x) mismatches with expected(0x%x)", length, 9 + data[9]); return NULL; } len = 6 + data[8]; fields = malloc(sizeof (atca_oem_field_info_t) * len); if (fields == NULL) { err("Out of memory"); return NULL; } memset(fields, 0,sizeof (atca_oem_field_info_t) * len); cur_field = init_ftrst_fields(fields, data); // Maximum Internal Current fields[cur_field - OHOI_FIELD_FIRST_ID].field = cur_field; fields[cur_field - OHOI_FIELD_FIRST_ID].off = 5; fields[cur_field - OHOI_FIELD_FIRST_ID].len = 2; cur_field++; // Allowance For Module Activation Readiness fields[cur_field - OHOI_FIELD_FIRST_ID].field = cur_field; fields[cur_field - OHOI_FIELD_FIRST_ID].off = 7; fields[cur_field - OHOI_FIELD_FIRST_ID].len = 1; cur_field++; // Module Activation and Power Descriptor Count fields[cur_field - OHOI_FIELD_FIRST_ID].field = cur_field; fields[cur_field - OHOI_FIELD_FIRST_ID].off = 8; fields[cur_field - OHOI_FIELD_FIRST_ID].len = 1; cur_field++; off = 9; for (i = 0; i < data[8]; i++) { // Carrier Activation and Power Descriptors fields[cur_field - OHOI_FIELD_FIRST_ID].field = cur_field; fields[cur_field - OHOI_FIELD_FIRST_ID].off = off + i * 3; fields[cur_field - OHOI_FIELD_FIRST_ID].len = 3; cur_field++; } area = malloc(sizeof (atca_oem_area_info_t)); if (area == NULL) { err("Out of memory"); free(fields); return NULL; } area->field_num = cur_field - OHOI_FIELD_FIRST_ID; area->fields = fields; return area; } static atca_oem_area_info_t *create_carrier_p2p_connectivity_oem_area( unsigned char *data, unsigned int length) { atca_oem_field_info_t *fields; atca_oem_area_info_t *area; int len; SaHpiEntryIdT cur_field; int off; int i; if (length < 7 + data[6] * 3) { err("Record length(0x%x) mismatches with expected(0x%x)", length, 7 + data[6]); return NULL; } len = 5 + data[6]; fields = malloc(sizeof (atca_oem_field_info_t) * len); if (fields == NULL) { err("Out of memory"); return NULL; } memset(fields, 0,sizeof (atca_oem_field_info_t) * len); cur_field = init_ftrst_fields(fields, data); // Resource ID fields[cur_field - OHOI_FIELD_FIRST_ID].field = cur_field; fields[cur_field - OHOI_FIELD_FIRST_ID].off = 5; fields[cur_field - OHOI_FIELD_FIRST_ID].len = 1; cur_field++; // Point-to-Point Port Count fields[cur_field - OHOI_FIELD_FIRST_ID].field = cur_field; fields[cur_field - OHOI_FIELD_FIRST_ID].off = 6; fields[cur_field - OHOI_FIELD_FIRST_ID].len = 1; cur_field++; off = 7; for (i = 0; i < data[6]; i++) { // Carrier Activation and Power Descriptors fields[cur_field - OHOI_FIELD_FIRST_ID].field = cur_field; fields[cur_field - OHOI_FIELD_FIRST_ID].off = off + i * 3; fields[cur_field - OHOI_FIELD_FIRST_ID].len = 3; cur_field++; } area = malloc(sizeof (atca_oem_area_info_t)); if (area == NULL) { err("Out of memory"); free(fields); return NULL; } area->field_num = cur_field - OHOI_FIELD_FIRST_ID; area->fields = fields; return area; } unsigned int ohoi_create_atca_oem_idr_areas( struct oh_handler_state *handler, ipmi_entity_t *entity, struct ohoi_resource_info *res_info, struct ohoi_inventory_info *i_info, unsigned int r_num) { // struct ohoi_handler *ipmi_handler = handler->data; ipmi_fru_t *fru = ipmi_entity_get_fru(entity); atca_oem_area_info_t *area; atca_oem_field_info_t *fields; unsigned char data[256]; int rv; unsigned int num; unsigned int len; unsigned int area_num = 0; unsigned int is_atca_field = 0; GSList *areas = NULL; int i; unsigned char ver, type; unsigned int max_link = 0; ekey_sensors_info_t eks_info; memset(&eks_info, 0, sizeof (eks_info)); for (num = 0; num < r_num; num++) { len = 256; rv = ipmi_fru_get_multi_record_data(fru, num, data, &len); if (rv != 0) { err("ipmi_fru_get_multi_record_data(" "fru, %d, data, 0x%x) = 0x%x", num, len, rv); continue; } rv = ipmi_fru_get_multi_record_type(fru, num, &type); if (rv) { err("ipmi_entity_get_multi_record_type(%d) = %d", num, rv); continue; } if (type != 0xc0) { // record type. Must be OEM err("Record #%d type = 0x%x", num, data[0]); goto orig_record; } rv = ipmi_fru_get_multi_record_format_version(fru, num, &ver); if (rv) { err("ipmi_entity_get_multi_record_format_version" "(%d) = %d", num, rv); continue; } if ((ver & 0x0f) != 0x2) { // must be 2 for PICMG 3.0 ATCA vD1.0 err("Record #%d format version = 0x%x", num, data[1] & 0x0f); goto orig_record; } if (len < 5) { err("Record #%d too short(%d)", num, len); goto orig_record; } if ((data[0] | (data[1] << 8) | (data[2] << 16)) != ATCAHPI_PICMG_MID) { err("Record #%d. MId = 0x%x", num, data[0] | (data[1] << 8) | (data[2] << 16)); goto orig_record; } switch (data[3]) { case 0x10 : // Address Table Record if (len < 27) { err("Record #%d too short. len = 0x%x", num, len); goto orig_record; } if (data[4] != 0) { err("wrong RecFormVersion record #%d = %d", num, data[4]); goto orig_record; } area = create_address_table_oem_area(data, len); if (area == NULL) { goto orig_record; } break; case 0x13 : // Shelf Manager IP Connection Record if (len < 17) { err("Record #%d too short. len = 0x%x", num, len); goto orig_record; } if (data[4] != 1) { err("wrong RecFormVersion record #%d = %d", num, data[4]); goto orig_record; } area = create_shm_ip_connection_oem_area(data, len); break; case 0x04 : // Backplane Point-to-Point Connectivity Record if (len < 8) { err("Record #%d too short. len = 0x%x", num, len); goto orig_record; } if (data[4] != 0) { err("wrong RecFormVersion record #%d = %d", num, data[4]); goto orig_record; } for (i = 0; ; i++) { area = create_p2p_connectivity_oem_area( data, i, len); if (area != NULL) { area->record = num; area->area = FIRST_OEM_AREA_NUM + area_num; areas = g_slist_append(areas, area); area_num++; is_atca_field++; } else { if (i == 0) { goto orig_record; } break; } } continue; case 0x11 : // Shelf Power Distribution Record if (len < 10) { err("Record #%d too short. len = 0x%x", num, len); goto orig_record; } if (data[4] != 0) { err("wrong RecFormVersion record #%d = %d", num, data[4]); goto orig_record; } for (i = 0; i < data[5]; i++) { area = create_power_distribution_oem_area( data, i, len); if (area != NULL) { area->record = num; area->area = FIRST_OEM_AREA_NUM + area_num; areas = g_slist_append(areas, area); area_num++; is_atca_field++; } } area = NULL; continue; case 0x12 : // Shelf Activation and Power Management Record if (len < 7) { err("Record #%d too short. len = 0x%x", num, len); goto orig_record; } if (data[4] != 0) { err("wrong RecFormVersion record #%d = %d", num, data[4]); goto orig_record; } area = create_activation_and_pm_oem_area(data, len); break; case 0x14 : // Board Point-to-Point Connectivity Record if (len < 6) { err("Record #%d too short. len = 0x%x", num, len); goto orig_record; } if (data[4] != 0) { err("wrong RecFormVersion record #%d = %d", num, data[4]); goto orig_record; } area = create_board_p2p_connectivity_oem_area(data, len, &eks_info); break; case 0x15 : // Radial IPMB-0 Link Mapping Record if (len < 11) { err("Record #%d too short. len = 0x%x", num, len); goto orig_record; } if (data[4] != 0) { err("wrong RecFormVersion record #%d = %d", num, data[4]); goto orig_record; } area = create_radial_ipmb0_link_oem_area( data, len, &max_link); if (area == NULL) { goto orig_record; } break; case 0x1a : // Carrier Information Table if (len < 7) { err("Record #%d too short. len = 0x%x", num, len); goto orig_record; } if (data[4] != 0) { err("wrong RecFormVersion record #%d = %d", num, data[4]); goto orig_record; } area = create_amc_carrier_information_table_oem_area( data, len); if (area == NULL) { goto orig_record; } break; case 0x17 : // Carrier Activation and Current Management Record if (len < 9) { err("Record #%d too short. len = 0x%x", num, len); goto orig_record; } if (data[4] != 0) { err("wrong RecFormVersion record #%d = %d", num, data[4]); goto orig_record; } area = create_carrier_activ_and_curmngmt_oem_area( data, len); if (area == NULL) { goto orig_record; } break; case 0x18 : // Carrier Point-to-Point Connectivity Record if (len < 9) { err("Record #%d too short. len = 0x%x", num, len); goto orig_record; } if (data[4] != 0) { err("wrong RecFormVersion record #%d = %d", num, data[4]); goto orig_record; } area = create_carrier_p2p_connectivity_oem_area( data, len); if (area == NULL) { goto orig_record; } break; default : err("Unknown record #%d Id = 0x%x", num, data[3]); area = NULL; goto orig_record; } if (area == NULL) { continue; } area->record = num; area->area = FIRST_OEM_AREA_NUM + area_num; area_num++; is_atca_field++; areas = g_slist_append(areas, area); continue; orig_record: // We met not ATCA specific record. Put it into special area fields = malloc(sizeof (atca_oem_field_info_t)); if (fields == NULL) { err("Out of memory"); continue; } memset(fields, 0, sizeof (atca_oem_field_info_t)); area = malloc(sizeof (atca_oem_area_info_t)); if (area == NULL) { err("Out of memory"); free(fields); continue; } fields->field = OHOI_FIELD_FIRST_ID; fields->off = 0; fields->len = len; area->record = num; area->field_num = 1; area->area = FIRST_OEM_AREA_NUM + area_num; area_num++; area->fields = fields; areas = g_slist_append(areas, area); } #if 0 res_info->max_ipmb0_link = max_link; if (ipmi_entity_get_type(entity) == IPMI_ENTITY_MC) { ohoi_create_ipmb0_controls(handler, entity, max_link); } #endif if (!is_atca_field) { return 1; } #if 0 { GSList *node; atca_oem_area_info_t *ar; for (node = areas; node; node = node->next) { ar = node->data; printf(" ******* area %d; num_fields %d\n", ar->area, ar->field_num); } } #endif // create Ekeying link state sensors GSList *node; unsigned int s_num = 0; ekey_descriptor_t *dsk; for (node = eks_info.descriptors; node; node = g_slist_next(node)) { dsk = g_slist_nth_data(node, 0); if (dsk->link_type <0xf0) { ohoi_create_ekeying_link_state_sensor(handler, entity, s_num, NULL, dsk->link_grouping_id, dsk->link_type, dsk->link_type_extension, dsk->interface_type, dsk->channels); } else { ohoi_create_ekeying_link_state_sensor(handler, entity, s_num, eks_info.guids[dsk->link_type - 0xf0], dsk->link_grouping_id, dsk->link_type, dsk->link_type_extension, dsk->interface_type, dsk->channels); } s_num++; } g_slist_foreach(eks_info.descriptors, (GFunc)g_free, NULL); g_slist_free(eks_info.descriptors); i_info->oem_areas = areas; return area_num; } extern void ohoi_delete_oem_area(gpointer arg, gpointer u_data); void ohoi_delete_oem_area(gpointer arg, gpointer u_data) { atca_oem_area_info_t *area = arg; if (area && area->fields) free(area->fields); if (area) free(area); } SaHpiUint32T ohoi_atca_oem_area_fields_num(struct ohoi_inventory_info *fru, SaHpiEntryIdT areaid) { GSList *node; atca_oem_area_info_t *area; for (node = fru->oem_areas; node; node = node->next) { area = node->data; if (area->area == areaid) { return area->field_num; } } return 0; } struct atca_oem_area_field_s { atca_oem_field_info_t *fld; SaHpiIdrFieldT *field; SaHpiEntryIdT fid; int raw_field; SaErrorT rv; int done; }; static void ohoi_atca_oem_area_field_cb(ipmi_entity_t *ent, void *cb_data) { struct atca_oem_area_field_s *info = cb_data; int rv; unsigned int len; unsigned char type, ver; unsigned char buf[SAHPI_MAX_TEXT_BUFFER_LENGTH]; unsigned int shift = info->fld->pad_len; rv = ipmi_entity_get_multi_record_data_len(ent, info->fid, &len); if (rv) { err("ipmi_entity_get_multi_record_data_len = %d", rv); info->rv = SA_ERR_HPI_NOT_PRESENT; info->done = 1; return; } if (len < info->fld->off + info->fld->len) { err("real record too short. %d < %d + %d", len, info->fld->off, info->fld->len); info->rv = SA_ERR_HPI_NOT_PRESENT; info->done = 1; return; } if (info->raw_field) { rv = ipmi_entity_get_multi_record_type(ent, info->fid, &type); if (rv) { err("ipmi_entity_get_multi_record_type = %d", rv); info->rv = SA_ERR_HPI_NOT_PRESENT; info->done = 1; return; } rv = ipmi_entity_get_multi_record_format_version(ent, info->fid, &ver); if (rv) { err("ipmi_entity_get_multi_record_type = %d", rv); info->rv = SA_ERR_HPI_NOT_PRESENT; info->done = 1; return; } shift = 2; } /* rv = ipmi_entity_get_multi_record_type(ent, f_id, &type); if (rv) { err("ipmi_entity_get_multi_record_type = %d", rv); oif->rv = SA_ERR_HPI_NOT_PRESENT; return; } rv = ipmi_entity_get_multi_record_format_version(ent, f_id, &ver); if (rv) { err("ipmi_entity_get_multi_record_format_version = %d", rv); oif->rv = SA_ERR_HPI_NOT_PRESENT; return; } if (len > SAHPI_MAX_TEXT_BUFFER_LENGTH - 2) { len = SAHPI_MAX_TEXT_BUFFER_LENGTH - 2; } */ rv = ipmi_entity_get_multi_record_data(ent, info->fid, buf, &len); if (rv) { err("ipmi_entity_get_multi_record_data = %d", rv); info->rv = SA_ERR_HPI_NOT_PRESENT; info->done = 1; return; } oh_init_textbuffer(&info->field->Field); if (info->raw_field) { info->field->Field.Data[0] = type; info->field->Field.Data[1] = ver; } memcpy(info->field->Field.Data + shift, &buf[info->fld->off], info->fld->len); info->field->Field.Language = SAHPI_LANG_UNDEF; info->field->Field.DataType = SAHPI_TL_TYPE_BINARY; info->field->Field.DataLength = info->fld->len + shift; info->done = 1; } SaErrorT ohoi_atca_oem_area_field(struct oh_handler_state *handler, struct ohoi_resource_info *ohoi_res_info, SaHpiEntryIdT *nextfieldid, SaHpiIdrFieldT *field) { struct ohoi_inventory_info *fru = ohoi_res_info->fru; GSList *node = fru->oem_areas; atca_oem_area_info_t *area = NULL; atca_oem_field_info_t *fields; struct atca_oem_area_field_s info; int rv; int i; for (node = fru->oem_areas; node; node = g_slist_next(node)) { area = g_slist_nth_data(node, 0); if (area->area == field->AreaId) { break; } } if (area == NULL) { err("Area %d not present", field->AreaId); return SA_ERR_HPI_NOT_PRESENT; } fields = area->fields; for (i = 0; i < area->field_num; i++) { if (fields[i].field == field->FieldId) { break; } } if (i == area->field_num) { err("Field %d for OEM Area %d not present", field->FieldId, field->AreaId); return SA_ERR_HPI_NOT_PRESENT; } fields += i; if (fields->len == 0) { // this is the virtual field. Compose it oh_init_textbuffer(&field->Field); field->Field.Data[0] = fields->off; field->Field.Language = SAHPI_LANG_UNDEF; field->Field.DataType = SAHPI_TL_TYPE_BINARY; field->Field.DataLength = 1; goto virt_field; } info.fld = fields; info.field = field; info.rv = SA_OK; info.fid = area->record; info.done = 1; info.raw_field = (area->field_num == 1); rv = ipmi_entity_pointer_cb(ohoi_res_info->u.entity.entity_id, ohoi_atca_oem_area_field_cb, &info); if (rv) { err("ipmi_entity_pointer_cb = 0x%x", rv); return SA_ERR_HPI_INTERNAL_ERROR; } rv = ohoi_loop(&info.done, handler->data); if (rv != SA_OK) { err("ohoi_loop = %d", rv); return rv; } if (info.rv != SA_OK) { err("info.rv = %d", info.rv); return info.rv; } virt_field: field->ReadOnly = SAHPI_TRUE; field->Type = SAHPI_IDR_FIELDTYPE_CUSTOM; if (i == area->field_num - 1) { *nextfieldid = SAHPI_LAST_ENTRY; } else { *nextfieldid = fields[1].field; } return SA_OK; } openhpi-2.14.1/plugins/ipmi/t/0000755000076400007640000000000011405006365013053 5ustar openhpi-2.14.1/plugins/ipmi/t/Makefile.am0000644000076400007640000000367411302567001015114 0ustar # # Copyright (c) 2003, Intel Corporation # All rights reserved. # # 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. # # Neither the name of Intel Corporation nor the names # of its contributors may be used to endorse or promote products # derived from this software without specific prior written permission. # # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS # "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT # LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS # FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT # OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, # SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED # TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, # OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY # OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING # NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS # SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. # MAINTAINERCLEANFILES = Makefile.in noinst_PROGRAMS = ipmi_thres_test INCLUDES = @OPENHPI_INCLUDES@ LD_DIRS = -L$(top_builddir)/src -L$(top_builddir)/utils #noinst_PROGRAMS = set_thres ipmi_thres_test_SOURCES = ipmi_thres_test.c ipmi_thres_test_LDADD = $(LD_DIRS) -luuid -lopenhpiutils -lopenhpi #set_thres_SOURCES = set_thres.c #set_thres_LDADD = $(top_builddir)/src/libopenhpi.la openhpi-2.14.1/plugins/ipmi/t/ipmi_thres_test.c0000644000076400007640000003114311302567001016416 0ustar /* -*- linux-c -*- * * Copyright (c) 2003, 2004 by Intel Corp. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * ipmi_thres_test.c * * Authors: * Bill Barkely * Andy Cress * Changes: * 02/26/04 ARCress - added general search for any Fan sensor. * 03/17/04 ARCress - changed to Temp sensor (always has Lower Major) * 11/03/2004 kouzmich porting to HPI B * * Copied from clients/hpithres.c and modified * * 11/18/2004 kouzmich modified as ipmi test */ #include #include #include #include #include #include #include typedef enum { PASS = 0, // test passed FAIL, // test failed UNTESTED // error before testing } TestStatus_T; int fdebug = 0; char progver[] = "1.1"; SaErrorT rv; TestStatus_T status = FAIL; char *rdrtypes[5] = { "None ", "Control ", "Sensor ", "Invent ", "Watchdog"}; #define HPI_NSEC_PER_SEC 1000000000LL #define NSU 32 char *units[NSU] = { "units", "deg C", "deg F", "deg K", "volts", "amps", "watts", "joules", "coulombs", "va", "nits", "lumen", "lux", "candela", "kpa", "psi", "newton", "cfm", "rpm", "Hz", "us", "ms", "sec", "min", "hours", "days", "weeks", "mil", "in", "ft", "mm", "cm" }; static void print_value(SaHpiSensorReadingT *item, char *mes) { char *val; if (item->IsSupported != SAHPI_TRUE) return; switch (item->Type) { case SAHPI_SENSOR_READING_TYPE_INT64: printf("%s %lld\n", mes, item->Value.SensorInt64); return; case SAHPI_SENSOR_READING_TYPE_UINT64: printf("%s %llu\n", mes, item->Value.SensorUint64); return; case SAHPI_SENSOR_READING_TYPE_FLOAT64: printf("%s %10.3f\n", mes, item->Value.SensorFloat64); return; case SAHPI_SENSOR_READING_TYPE_BUFFER: val = (char *)(item->Value.SensorBuffer); if (val != NULL) printf("%s %s\n", mes, val); return; } } static void Set_value(SaHpiSensorReadingT *item, SaHpiSensorReadingUnionT value) { switch (item->Type) { case SAHPI_SENSOR_READING_TYPE_INT64: item->Value.SensorInt64 = value.SensorInt64; break; case SAHPI_SENSOR_READING_TYPE_UINT64: item->Value.SensorUint64 = value.SensorUint64; break; case SAHPI_SENSOR_READING_TYPE_FLOAT64: item->Value.SensorFloat64 = value.SensorFloat64; break; case SAHPI_SENSOR_READING_TYPE_BUFFER: printf("Set_value: Buffer type is not supported\n"); break; } } static void Mul_value(SaHpiSensorReadingT *item, SaHpiFloat64T value) { switch (item->Type) { case SAHPI_SENSOR_READING_TYPE_INT64: item->Value.SensorInt64 = (SaHpiInt64T)((SaHpiFloat64T)(item->Value.SensorInt64) * value); break; case SAHPI_SENSOR_READING_TYPE_UINT64: item->Value.SensorUint64 = (SaHpiUint64T)((SaHpiFloat64T)(item->Value.SensorUint64) * value); break; case SAHPI_SENSOR_READING_TYPE_FLOAT64: item->Value.SensorFloat64 *= value; break; case SAHPI_SENSOR_READING_TYPE_BUFFER: printf("Mul_value: Buffer type is not supported\n"); break; } } static void Sum_value(SaHpiSensorReadingT *item, SaHpiFloat64T value) { switch (item->Type) { case SAHPI_SENSOR_READING_TYPE_INT64: item->Value.SensorInt64 = (SaHpiInt64T)((SaHpiFloat64T)(item->Value.SensorInt64) + value); break; case SAHPI_SENSOR_READING_TYPE_UINT64: item->Value.SensorUint64 = (SaHpiUint64T)((SaHpiFloat64T)(item->Value.SensorUint64) + value); break; case SAHPI_SENSOR_READING_TYPE_FLOAT64: item->Value.SensorFloat64 += value; break; case SAHPI_SENSOR_READING_TYPE_BUFFER: printf("Sum_value: Buffer type is not supported\n"); break; } } static void ShowThresh(SaHpiSensorThresholdsT *sensbuff) { printf(" Supported Thresholds:\n"); print_value(&(sensbuff->LowCritical), " Lower Critical Threshold:"); print_value(&(sensbuff->LowMajor), " Lower Major Threshold:"); print_value(&(sensbuff->LowMinor), " Lower Minor Threshold:"); print_value(&(sensbuff->UpCritical), " Upper Critical Threshold:"); print_value(&(sensbuff->UpMajor), " Upper Major Threshold:"); print_value(&(sensbuff->UpMinor), " Upper Minor Threshold:"); print_value(&(sensbuff->PosThdHysteresis), " Positive Threshold Hysteresis:"); print_value(&(sensbuff->NegThdHysteresis), " Negative Threshold Hysteresis:"); printf("\n"); } static TestStatus_T DoEvent( SaHpiSessionIdT sessionid, SaHpiResourceIdT resourceid, SaHpiSensorRecT *sensorrec ) { SaHpiSensorNumT sensornum; SaHpiSensorReadingT reading; SaHpiSensorReadingT item; SaHpiSensorThresholdsT senstbuff1; SaHpiSensorThresholdsT senstbuff2; SaHpiSensorThresholdsT senstbuff3; SaHpiTimeoutT timeout = (SaHpiInt64T)(10 * HPI_NSEC_PER_SEC); /* 10 seconds */ SaHpiEventT event; SaHpiRptEntryT rptentry; SaHpiRdrT rdr; char *unit; TestStatus_T stat = PASS; int i; sensornum = sensorrec->Num; /* Get current sensor reading */ rv = saHpiSensorReadingGet(sessionid, resourceid, sensornum, &reading, NULL); if (rv != SA_OK) { printf("saHpiSensorReadingGet: %s\n", oh_lookup_error(rv)); return(FAIL); } /* Determine units of interpreted reading */ i = sensorrec->DataFormat.BaseUnits; if (i > NSU) i = 0; unit = units[i]; print_value(&reading, unit); /* Retrieve current threshold setings, twice */ /* once for backup and once for modification */ /* Get backup copy */ rv = saHpiSensorThresholdsGet(sessionid, resourceid, sensornum, &senstbuff1); if (rv != SA_OK) { printf("saHpiSensorThresholdsGet: %s\n", oh_lookup_error(rv)); return(FAIL); } /* Get modification copy */ rv = saHpiSensorThresholdsGet(sessionid, resourceid, sensornum, &senstbuff2); if (rv != SA_OK) { printf("saHpiSensorThresholdsGet: %s\n", oh_lookup_error(rv)); return(FAIL); } /* Display current thresholds */ printf(" Current thresholds:\n"); ShowThresh(&senstbuff2); senstbuff2.LowMajor.IsSupported = 1; /* Set new threshold to current reading + 10% */ switch (senstbuff2.LowMajor.Type) { case SAHPI_SENSOR_READING_TYPE_INT64: senstbuff2.LowMajor.Value.SensorInt64 = reading.Value.SensorInt64 * 1.10; break; case SAHPI_SENSOR_READING_TYPE_UINT64: senstbuff2.LowMajor.Value.SensorFloat64 = reading.Value.SensorUint64 * 1.10; break; case SAHPI_SENSOR_READING_TYPE_FLOAT64: senstbuff2.LowMajor.Value.SensorFloat64 = reading.Value.SensorFloat64 * 1.10; break; case SAHPI_SENSOR_READING_TYPE_BUFFER: printf("Buffer type is not supported\n"); break; }; item = reading; Mul_value(&item, (SaHpiFloat64T)1.10); Set_value(&(senstbuff2.LowMajor), item.Value); /* In this case, LowMinor > LowMajor */ senstbuff2.LowMinor.IsSupported = 1; switch (senstbuff2.LowMinor.Type) { case SAHPI_SENSOR_READING_TYPE_INT64: senstbuff2.LowMinor.Value.SensorInt64 = reading.Value.SensorInt64 * (SaHpiInt64T)1.10 + 10; break; case SAHPI_SENSOR_READING_TYPE_UINT64: senstbuff2.LowMinor.Value.SensorFloat64 = reading.Value.SensorUint64 * (SaHpiUint64T)1.10 + 10; break; case SAHPI_SENSOR_READING_TYPE_FLOAT64: senstbuff2.LowMinor.Value.SensorFloat64 = reading.Value.SensorFloat64 * (SaHpiFloat64T)1.10 + 10; break; case SAHPI_SENSOR_READING_TYPE_BUFFER: printf("Buffer type is not supported\n"); break; }; item = reading; Mul_value(&item, (SaHpiFloat64T)1.10); Sum_value(&item, (SaHpiFloat64T)10); Set_value(&(senstbuff2.LowMinor), item.Value); printf(" New\n"); ShowThresh(&senstbuff2); /* Subscribe to New Events, only */ printf("Subscribe to events\n"); rv = saHpiSubscribe(sessionid); if (rv != SA_OK) { printf("saHpiSubscribe: %s\n", oh_lookup_error(rv)); return(UNTESTED); } /* Set new thresholds */ printf("Set new thresholds\n"); rv = saHpiSensorThresholdsSet(sessionid, resourceid, sensornum, &senstbuff2); if (rv != SA_OK) { printf("saHpiSensorThresholdsSet: %s\n", oh_lookup_error(rv)); printf("Unsubscribe\n"); saHpiUnsubscribe(sessionid); return(FAIL); } /* Go wait on event to occur */ printf("Go and get the event\n"); for (;;) { rv = saHpiEventGet(sessionid, timeout, &event, &rdr, &rptentry, NULL); if (rv != SA_OK) { if (rv != SA_ERR_HPI_TIMEOUT) { printf("Error during EventGet\n"); stat = FAIL; }; break; } if (event.EventType == SAHPI_ET_SENSOR) { printf("Sensor # = %2d Severity = %2x\n", event.EventDataUnion.SensorEvent.SensorNum, event.Severity ); if (event.EventDataUnion.SensorEvent.SensorNum == sensornum) { printf("Got it\n"); break; } } } if (stat != FAIL) { saHpiSensorThresholdsGet(sessionid, resourceid, sensornum, &senstbuff3); printf(" Current thresholds:\n"); ShowThresh(&senstbuff3); if (memcmp(&senstbuff3, &senstbuff2, sizeof(SaHpiSensorThresholdsT)) != 0) { printf("Invalid current threshold!\n"); stat = FAIL; } } /* Reset to the original thresholds */ printf("Reset thresholds\n"); rv = saHpiSensorThresholdsSet(sessionid, resourceid, sensornum, &senstbuff1); if (rv != SA_OK) { printf("saHpiSensorThresholdsSet: %s\n", oh_lookup_error(rv)); } else { /* Re-read threshold values */ rv = saHpiSensorThresholdsGet(sessionid, resourceid, sensornum, &senstbuff2); if (rv != SA_OK) { printf("saHpiSensorThresholdsGet: %s\n", oh_lookup_error(rv)); } else { /* Display reset thresholds */ printf(" Reset thresholds:\n"); ShowThresh(&senstbuff2); } } printf("Unsubscribe\n"); saHpiUnsubscribe(sessionid); return (stat); } /*end DoEvent*/ static TestStatus_T test(int argc, char **argv) { int c; SaHpiSessionIdT sessionid; SaHpiDomainInfoT domainInfo; SaHpiRptEntryT rptentry; SaHpiEntryIdT rptentryid; SaHpiEntryIdT nextrptentryid; SaHpiEntryIdT entryid; SaHpiEntryIdT nextentryid; SaHpiResourceIdT resourceid; SaHpiRdrT rdr; TestStatus_T result = PASS; printf("%s ver %s\n", argv[0], progver); while ( (c = getopt( argc, argv,"x?")) != EOF ) switch(c) { case 'x': fdebug = 1; break; default: printf("Usage: %s [-x]\n", argv[0]); printf(" -x Display debug messages\n"); return (UNTESTED); } rv = saHpiSessionOpen(SAHPI_UNSPECIFIED_DOMAIN_ID ,&sessionid, NULL); if (rv != SA_OK) { printf("saHpiSessionOpen: %s\n", oh_lookup_error(rv)); return (UNTESTED); } rv = saHpiDiscover(sessionid); if (fdebug) printf("saHpiDiscover: %s\n", oh_lookup_error(rv)); rv = saHpiDomainInfoGet(sessionid,&domainInfo); if (fdebug) printf("saHpiDomainInfoGet: %s\n", oh_lookup_error(rv)); if (fdebug) printf("DomainInfo: UpdateCount = %x, UpdateTime = %lx\n", domainInfo.RptUpdateCount, (unsigned long)domainInfo.RptUpdateTimestamp); /* walk the RPT list */ rptentryid = SAHPI_FIRST_ENTRY; while ((result == PASS) && (rptentryid != SAHPI_LAST_ENTRY)) { rv = saHpiRptEntryGet(sessionid, rptentryid, &nextrptentryid, &rptentry); if (rv != SA_OK) break; /* walk the RDR list for this RPT entry */ entryid = SAHPI_FIRST_ENTRY; rptentry.ResourceTag.Data[rptentry.ResourceTag.DataLength] = 0; resourceid = rptentry.ResourceId; if (fdebug) printf("rptentry[%d] resourceid=%d\n", rptentryid,resourceid); printf("Resource Tag: %s\n", rptentry.ResourceTag.Data); while ((result == PASS) && (entryid != SAHPI_LAST_ENTRY)) { rv = saHpiRdrGet(sessionid, resourceid, entryid, &nextentryid, &rdr); if (fdebug) printf("saHpiRdrGet[%d]: %s\n", entryid, oh_lookup_error(rv)); if (rv != SA_OK) { printf( "saHpiRdrGet: Returned HPI Error: %s\n", oh_lookup_error(rv)); break; }; if (rdr.RdrType == SAHPI_SENSOR_RDR) { /*type 2 includes sensor and control records*/ rdr.IdString.Data[rdr.IdString.DataLength] = 0; printf("%02d %s\t", rdr.RecordId, rdr.IdString.Data); result = DoEvent(sessionid, resourceid, &rdr.RdrTypeUnion.SensorRec); if (result != PASS) { printf("Returned Error from DoEvent\n"); break; } } entryid = nextentryid; } /*while rdr loop */ rptentryid = nextrptentryid; } /*while rpt loop*/ saHpiSessionClose(sessionid); return(result); } int main(int argc, char **argv) { status = test(argc, argv); switch (status) { case PASS: printf(" Test PASSED\n"); break; case FAIL: printf(" Test FAILED\n"); break; case UNTESTED: printf(" Test UNTESTED (error before testing)\n"); break; default: printf(" UNKNOWN ERROR!\n"); } return (status == PASS ? 0 : 1); } /* end ipmi_thres_test.c */ openhpi-2.14.1/plugins/ipmi/ipmi_inventory.c0000644000076400007640000021536211302567001016033 0ustar /* -*- linux-c -*- * * Copyright (c) 2003 by Intel Corp. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Louis Zhuang * Racing Guo * Vadim Revyakin */ #include "ipmi.h" #include #include static int prnt_fru = 1; #define OHOI_IDR_DEFAULT_ID 0 #define OHOI_CHECK_RPT_CAP_IDR() \ do{ \ SaHpiRptEntryT *rpt_entry; \ rpt_entry = oh_get_resource_by_id(handler->rptcache, rid); \ if (!rpt_entry) { \ err("Resource %d No rptentry", rid); \ return SA_ERR_HPI_INVALID_PARAMS; \ } \ if (!(rpt_entry->ResourceCapabilities & \ SAHPI_CAPABILITY_INVENTORY_DATA)) { \ err("Resource %d no inventory capability", rid); \ return SA_ERR_HPI_INVALID_PARAMS; \ } \ if (idrid != OHOI_IDR_DEFAULT_ID) { \ err("error id"); \ return SA_ERR_HPI_NOT_PRESENT; \ } \ }while(0) struct ohoi_field_data { SaHpiIdrFieldTypeT fieldtype; SaHpiLanguageT lang; int (*get_len)(ipmi_entity_t *, unsigned int*); int (*get_data)(ipmi_entity_t *, char*, unsigned int*); int (*get_type)(ipmi_fru_t *fru, enum ipmi_str_type_e *type); }; static int _ipmi_entity_get_chassis_info_type_len(ipmi_entity_t *ent, unsigned int *length) { *length = 1; return 0; } static int _ipmi_entity_get_chassis_info_type(ipmi_entity_t *ent, char *str, unsigned int *strlen) { unsigned char tp; int r; r = ipmi_entity_get_chassis_info_type(ent, &tp); if (r) { return r; } str[0] = (char)tp; *strlen = 1; return 0; } static int _ipmi_fru_get_chassis_info_type_type(ipmi_fru_t *fru, enum ipmi_str_type_e *type) { *type = IPMI_BINARY_STR; return 0; } static struct ohoi_field_data chassis_fields[] = { { SAHPI_IDR_FIELDTYPE_CHASSIS_TYPE, SAHPI_LANG_UNDEF, _ipmi_entity_get_chassis_info_type_len, _ipmi_entity_get_chassis_info_type, _ipmi_fru_get_chassis_info_type_type, }, { SAHPI_IDR_FIELDTYPE_SERIAL_NUMBER, SAHPI_LANG_ENGLISH, ipmi_entity_get_chassis_info_serial_number_len, ipmi_entity_get_chassis_info_serial_number, ipmi_fru_get_chassis_info_serial_number_type, }, { SAHPI_IDR_FIELDTYPE_PART_NUMBER, SAHPI_LANG_UNDEF, ipmi_entity_get_chassis_info_part_number_len, ipmi_entity_get_chassis_info_part_number, ipmi_fru_get_chassis_info_part_number_type, }, }; static int _ipmi_fru_get_board_info_mfg_time_len(ipmi_entity_t *entity, unsigned int *length) { *length = sizeof (time_t); return 0; } static int _ipmi_fru_get_board_info_mfg_time(ipmi_entity_t *entity, char *str, unsigned int *strlen) { time_t tm; int res; res = ipmi_entity_get_board_info_mfg_time(entity, &tm); if (res) { return res; } memcpy(str, &tm, sizeof (tm)); *strlen = sizeof (tm); return 0; } static int _ipmi_fru_get_board_info_mfg_time_type(ipmi_fru_t *fru, enum ipmi_str_type_e *type) { *type = IPMI_FRU_DATA_BINARY; return 0; } static struct ohoi_field_data board_fields[] = { { SAHPI_IDR_FIELDTYPE_MFG_DATETIME, SAHPI_LANG_UNDEF, _ipmi_fru_get_board_info_mfg_time_len, _ipmi_fru_get_board_info_mfg_time, _ipmi_fru_get_board_info_mfg_time_type, }, { SAHPI_IDR_FIELDTYPE_MANUFACTURER, SAHPI_LANG_UNDEF, ipmi_entity_get_board_info_board_manufacturer_len, ipmi_entity_get_board_info_board_manufacturer, ipmi_fru_get_board_info_board_manufacturer_type }, { SAHPI_IDR_FIELDTYPE_PRODUCT_NAME, SAHPI_LANG_UNDEF, ipmi_entity_get_board_info_board_product_name_len, ipmi_entity_get_board_info_board_product_name, ipmi_fru_get_board_info_board_product_name_type, }, { SAHPI_IDR_FIELDTYPE_SERIAL_NUMBER, SAHPI_LANG_ENGLISH, ipmi_entity_get_board_info_board_serial_number_len, ipmi_entity_get_board_info_board_serial_number, ipmi_fru_get_board_info_board_serial_number_type }, { SAHPI_IDR_FIELDTYPE_PART_NUMBER, SAHPI_LANG_UNDEF, ipmi_entity_get_board_info_board_part_number_len, ipmi_entity_get_board_info_board_part_number, ipmi_fru_get_board_info_board_part_number_type }, { SAHPI_IDR_FIELDTYPE_FILE_ID, SAHPI_LANG_ENGLISH, ipmi_entity_get_board_info_fru_file_id_len, ipmi_entity_get_board_info_fru_file_id, ipmi_fru_get_board_info_fru_file_id_type }, }; static struct ohoi_field_data product_fields[] = { { SAHPI_IDR_FIELDTYPE_MANUFACTURER, SAHPI_LANG_UNDEF, ipmi_entity_get_product_info_manufacturer_name_len, ipmi_entity_get_product_info_manufacturer_name, ipmi_fru_get_product_info_manufacturer_name_type, }, { SAHPI_IDR_FIELDTYPE_PRODUCT_NAME, SAHPI_LANG_UNDEF, ipmi_entity_get_product_info_product_name_len, ipmi_entity_get_product_info_product_name, ipmi_fru_get_product_info_product_name_type, }, { SAHPI_IDR_FIELDTYPE_PART_NUMBER, SAHPI_LANG_UNDEF, ipmi_entity_get_product_info_product_part_model_number_len, ipmi_entity_get_product_info_product_part_model_number, ipmi_fru_get_product_info_product_part_model_number_type, }, { SAHPI_IDR_FIELDTYPE_PRODUCT_VERSION, SAHPI_LANG_UNDEF, ipmi_entity_get_product_info_product_version_len, ipmi_entity_get_product_info_product_version, ipmi_fru_get_product_info_product_version_type, }, { SAHPI_IDR_FIELDTYPE_SERIAL_NUMBER, SAHPI_LANG_ENGLISH, ipmi_entity_get_product_info_product_serial_number_len, ipmi_entity_get_product_info_product_serial_number, ipmi_fru_get_product_info_product_serial_number_type, }, { SAHPI_IDR_FIELDTYPE_FILE_ID, SAHPI_LANG_UNDEF, ipmi_entity_get_product_info_fru_file_id_len, ipmi_entity_get_product_info_fru_file_id, ipmi_fru_get_product_info_fru_file_id_type, }, { SAHPI_IDR_FIELDTYPE_ASSET_TAG, SAHPI_LANG_UNDEF, ipmi_entity_get_product_info_asset_tag_len, ipmi_entity_get_product_info_asset_tag, ipmi_fru_get_product_info_asset_tag_type, }, }; static int _ipmi_entity_get_internal_use_data(ipmi_entity_t *entity, char *data, unsigned int *max_len) { return ipmi_entity_get_internal_use_data(entity, (void *)data, max_len); } static int _ipmi_fru_get_multi_record_type(ipmi_fru_t *fru, enum ipmi_str_type_e *type) { return ipmi_fru_get_multi_record_type(fru, 0, (void *)type); } static struct ohoi_field_data internal_fields[] = { { SAHPI_IDR_FIELDTYPE_CUSTOM, SAHPI_LANG_UNDEF, ipmi_entity_get_internal_use_length, _ipmi_entity_get_internal_use_data, _ipmi_fru_get_multi_record_type }, { SAHPI_IDR_FIELDTYPE_CUSTOM, SAHPI_LANG_UNDEF, NULL, NULL, NULL, } }; static struct ohoi_area_data { int field_num; SaHpiIdrAreaTypeT areatype; unsigned int empty_len; SaHpiBoolT read_only; struct ohoi_field_data *fields; } areas [] = { { sizeof(internal_fields)/sizeof(internal_fields[0]), SAHPI_IDR_AREATYPE_INTERNAL_USE, 8, SAHPI_TRUE, internal_fields }, { sizeof(chassis_fields)/sizeof(chassis_fields[0]), SAHPI_IDR_AREATYPE_CHASSIS_INFO, 8, SAHPI_FALSE, chassis_fields }, { sizeof(board_fields)/sizeof(board_fields[0]), SAHPI_IDR_AREATYPE_BOARD_INFO, 16, SAHPI_FALSE, board_fields }, { sizeof(product_fields)/sizeof(product_fields[0]), SAHPI_IDR_AREATYPE_PRODUCT_INFO, 16, SAHPI_FALSE, product_fields }, { 0, SAHPI_IDR_AREATYPE_OEM, 0, SAHPI_TRUE, NULL } }; #define OHOI_AREA_LAST_ID(fru) (FIRST_OEM_AREA_NUM + (fru)->oem - 1) #define OHOI_FIELD_NUM(area) ((area)->field_num) #define OHOI_FIELD_LAST_ID(area) ((area)->field_num) struct ohoi_area_layout { unsigned int off; unsigned int len; unsigned int used_len; }; struct ohoi_fru_layout { unsigned int len; unsigned int free_len; struct ohoi_area_layout areas[IPMI_FRU_FTR_NUMBER]; }; static SaHpiEntryIdT get_first_areaid_by_type(SaHpiIdrAreaTypeT areatype) { SaHpiEntryIdT id; for (id = 0; id < FIRST_OEM_AREA_NUM; id++) { if (areas[id].areatype == areatype) { return id + 1; } } return 0; } static SaHpiIdrAreaTypeT get_areatype_by_id(SaHpiEntryIdT id, struct ohoi_inventory_info *fru) { if (id < OHOI_AREA_FIRST_ID) { return OHOI_AREA_EMPTY_ID; } if (id <= FIRST_OEM_AREA_NUM) { return areas[id - 1].areatype; } if (id > OHOI_AREA_LAST_ID(fru)) { return OHOI_AREA_EMPTY_ID; } return SAHPI_IDR_AREATYPE_OEM; } static unsigned int get_ipmi_areatype(SaHpiIdrAreaTypeT areatype) { switch (areatype) { case SAHPI_IDR_AREATYPE_BOARD_INFO: return IPMI_FRU_FTR_BOARD_INFO_AREA; case SAHPI_IDR_AREATYPE_PRODUCT_INFO: return IPMI_FRU_FTR_PRODUCT_INFO_AREA; case SAHPI_IDR_AREATYPE_CHASSIS_INFO: return IPMI_FRU_FTR_CHASSIS_INFO_AREA; case SAHPI_IDR_AREATYPE_INTERNAL_USE: return IPMI_FRU_FTR_INTERNAL_USE_AREA; case SAHPI_IDR_AREATYPE_OEM: return IPMI_FRU_FTR_MULTI_RECORD_AREA; default: return IPMI_FRU_FTR_NUMBER; } } static SaHpiEntryIdT get_fieldid_by_type(struct ohoi_inventory_info *fru, SaHpiEntryIdT areaid, SaHpiIdrFieldTypeT type) { struct ohoi_area_data *area; SaHpiEntryIdT i; SaHpiEntryIdT mid, cn; if (areaid < OHOI_AREA_FIRST_ID) { err("Invalid areaid 0x%x", areaid); return 0; } if (fru->oem_areas && (areaid >= FIRST_OEM_AREA_NUM) && (areaid < OHOI_AREA_LAST_ID(fru)) && (type == SAHPI_IDR_FIELDTYPE_CUSTOM)) { return 1; } if (areaid > FIRST_OEM_AREA_NUM) { err("Invalid areaid 0x%x", areaid); return 0; } area = &areas[areaid - 1]; if (type == SAHPI_IDR_FIELDTYPE_CUSTOM) { mid = OHOI_FIELD_NUM(area); switch (area->areatype) { case SAHPI_IDR_AREATYPE_CHASSIS_INFO : cn = fru->ci_custom_num; break; case SAHPI_IDR_AREATYPE_BOARD_INFO : cn = fru->bi_custom_num; break; case SAHPI_IDR_AREATYPE_PRODUCT_INFO : cn = fru->pi_custom_num; break; default : return 0; } return mid + cn + 1; } for (i = 0; i < OHOI_FIELD_NUM(area); i++) { if (area->fields[i].fieldtype == type) { return i + 1; } } err("No area field type %d in areatype 0x%x", type, area->areatype); return 0; } static int get_fru_layout(ipmi_fru_t *fru, struct ohoi_fru_layout *layout) { unsigned int len, used_len; unsigned int offset; unsigned int common_len = 0; int rv; SaHpiEntryIdT id; layout->free_len = 0; layout->len = ipmi_fru_get_data_length(fru); rv = ipmi_fru_area_get_length(fru, IPMI_FRU_FTR_INTERNAL_USE_AREA, &len); rv |= ipmi_fru_area_get_offset(fru, IPMI_FRU_FTR_INTERNAL_USE_AREA, &offset); rv |= ipmi_fru_area_get_used_length(fru, IPMI_FRU_FTR_INTERNAL_USE_AREA, &used_len); if (rv != 0) { offset = 0; len = 0; used_len = 0; } id = get_ipmi_areatype(SAHPI_IDR_AREATYPE_INTERNAL_USE); layout->areas[id].off = offset; layout->areas[id].len = len; layout->areas[id].used_len = used_len; common_len += len; rv = ipmi_fru_area_get_length(fru, IPMI_FRU_FTR_CHASSIS_INFO_AREA, &len); rv |= ipmi_fru_area_get_offset(fru, IPMI_FRU_FTR_CHASSIS_INFO_AREA, &offset); rv |= ipmi_fru_area_get_used_length(fru, IPMI_FRU_FTR_CHASSIS_INFO_AREA, &used_len); if (rv != 0) { offset = 0; len = 0; used_len = 0; } id = get_ipmi_areatype(SAHPI_IDR_AREATYPE_CHASSIS_INFO); layout->areas[id].off = offset; layout->areas[id].len = len; layout->areas[id].used_len = used_len; common_len += len; rv = ipmi_fru_area_get_length(fru, IPMI_FRU_FTR_BOARD_INFO_AREA, &len); rv |= ipmi_fru_area_get_offset(fru, IPMI_FRU_FTR_BOARD_INFO_AREA, &offset); rv |= ipmi_fru_area_get_used_length(fru, IPMI_FRU_FTR_BOARD_INFO_AREA, &used_len); if (rv != 0) { offset = 0; len = 0; used_len = 0; } id = get_ipmi_areatype(SAHPI_IDR_AREATYPE_BOARD_INFO); layout->areas[id].off = offset; layout->areas[id].len = len; layout->areas[id].used_len = used_len; common_len += len; rv = ipmi_fru_area_get_length(fru, IPMI_FRU_FTR_PRODUCT_INFO_AREA, &len); rv |= ipmi_fru_area_get_offset(fru, IPMI_FRU_FTR_PRODUCT_INFO_AREA, &offset); rv |= ipmi_fru_area_get_used_length(fru, IPMI_FRU_FTR_PRODUCT_INFO_AREA, &used_len); if (rv != 0) { offset = 0; len = 0; used_len = 0; } id = get_ipmi_areatype(SAHPI_IDR_AREATYPE_PRODUCT_INFO); layout->areas[id].off = offset; layout->areas[id].len = len; layout->areas[id].used_len = used_len; common_len += len; rv = ipmi_fru_area_get_length(fru, IPMI_FRU_FTR_MULTI_RECORD_AREA, &len); rv |= ipmi_fru_area_get_offset(fru, IPMI_FRU_FTR_MULTI_RECORD_AREA, &offset); rv |= ipmi_fru_area_get_used_length(fru, IPMI_FRU_FTR_MULTI_RECORD_AREA, &used_len); if (rv != 0) { offset = 0; len = 0; used_len = 0; } id = get_ipmi_areatype(SAHPI_IDR_AREATYPE_OEM); layout->areas[id].off = offset; layout->areas[id].len = len; layout->areas[id].used_len = used_len; common_len += len; layout->free_len = layout->len - common_len; return 0; } static void print_fru_layout(char *head, struct ohoi_fru_layout *l) { struct ohoi_area_layout *al; if (!prnt_fru) { return; } if (head != NULL) { printf("***** %s\n", head); } printf(" FRU length = %i, free_len = %i\n", l->len, l->free_len); al = &l->areas[IPMI_FRU_FTR_INTERNAL_USE_AREA]; printf(" Internal Use Area: off = %i; len = %i" "; used len = %i\n", al->off, al->len, al->used_len); al = &l->areas[IPMI_FRU_FTR_CHASSIS_INFO_AREA]; printf(" Chassis Info Area: off = %i; len = %i" "; used len = %i\n", al->off, al->len, al->used_len); al = &l->areas[IPMI_FRU_FTR_BOARD_INFO_AREA]; printf(" Board Info Area: off = %i; len = %i" "; used len = %i\n", al->off, al->len, al->used_len); al = &l->areas[IPMI_FRU_FTR_PRODUCT_INFO_AREA]; printf(" Product Info Area: off = %i; len = %i" "; used len = %i\n", al->off, al->len, al->used_len); al = &l->areas[IPMI_FRU_FTR_MULTI_RECORD_AREA]; printf(" Multi Record Area: off = %i; len = %i" "; used len = %i\n", al->off, al->len, al->used_len); } #if 0 //see below static void dbg_print_fru_cb(ipmi_entity_t *ent, void *cb_data) { char *head = cb_data; struct ohoi_fru_layout layout; get_fru_layout(ipmi_entity_get_fru(ent), &layout); print_fru_layout(head, &layout); } #endif static void dbg_print_fru(char *head, ipmi_entity_id_t e_id) { #if 0 // OpenIPMI segfaults. need to be investigated if (!getenv("OHOI_TRACE_FRU") && !IHOI_TRACE_ALL) { return; } ipmi_entity_pointer_cb(e_id, dbg_print_fru_cb, head); #endif return; } static unsigned char get_areatype_presence(struct ohoi_inventory_info *i_info, SaHpiIdrAreaTypeT areatype) { switch (areatype) { case SAHPI_IDR_AREATYPE_BOARD_INFO: return i_info->bi; case SAHPI_IDR_AREATYPE_PRODUCT_INFO: return i_info->pi; case SAHPI_IDR_AREATYPE_CHASSIS_INFO: return i_info->ci; case SAHPI_IDR_AREATYPE_OEM: return i_info->oem; case SAHPI_IDR_AREATYPE_INTERNAL_USE: return i_info->iu; default: err("wrong area type 0x%x", areatype); return (unsigned char)0; } } static unsigned char get_area_presence(struct ohoi_inventory_info *i_info, SaHpiEntryIdT areaid) { switch (areaid) { case OHOI_BOARD_INFO_AREA_ID: return i_info->bi; case OHOI_PRODUCT_INFO_AREA_ID: return i_info->pi; case OHOI_CHASSIS_INFO_AREA_ID: return i_info->ci; case OHOI_INTERNAL_USE_AREA_ID: return i_info->iu; default: if (areaid < OHOI_AREA_FIRST_ID) { err("wrong area id 0x%x", areaid); return 0; } if (areaid > OHOI_AREA_LAST_ID(i_info)) { err("wrong area id 0x%x", areaid); return (unsigned char)0; } return 1; } } static void set_area_presence(struct ohoi_inventory_info *i_info, SaHpiIdrAreaTypeT areatype) { switch (areatype) { case SAHPI_IDR_AREATYPE_BOARD_INFO: i_info->bi = SAHPI_LANG_ENGLISH; i_info->bi_fld_msk = 0; return; case SAHPI_IDR_AREATYPE_PRODUCT_INFO: i_info->pi = SAHPI_LANG_ENGLISH; i_info->pi_fld_msk = 0; return; case SAHPI_IDR_AREATYPE_CHASSIS_INFO: i_info->ci = 1; i_info->ci_fld_msk = 0; return; case SAHPI_IDR_AREATYPE_OEM: i_info->oem = 1; return; default: return; } } static void set_field_presence(struct ohoi_inventory_info *i_info, SaHpiIdrAreaTypeT areatype, SaHpiIdrFieldTypeT fieldtype) { switch (areatype) { case SAHPI_IDR_AREATYPE_BOARD_INFO: i_info->bi = SAHPI_LANG_ENGLISH; i_info->bi_fld_msk |= (1 << fieldtype); return; case SAHPI_IDR_AREATYPE_PRODUCT_INFO: i_info->pi = SAHPI_LANG_ENGLISH; i_info->pi_fld_msk |= (1 << fieldtype); return; case SAHPI_IDR_AREATYPE_CHASSIS_INFO: i_info->ci_fld_msk |= (1 << fieldtype); return; case SAHPI_IDR_AREATYPE_OEM: i_info->oem = 1; return; default: return; } } static int field_present(struct ohoi_inventory_info *fru, SaHpiEntryIdT areaid, SaHpiEntryIdT fieldid) { SaHpiUint32T nf = 0; unsigned int msk; unsigned int cust_num; struct ohoi_area_data *area; if (fieldid < OHOI_FIELD_FIRST_ID) { return 0; } switch (areaid) { case OHOI_BOARD_INFO_AREA_ID: msk = fru->bi_fld_msk; cust_num = fru->bi_custom_num; break; case OHOI_PRODUCT_INFO_AREA_ID: msk = fru->pi_fld_msk; cust_num = fru->pi_custom_num; break; case OHOI_CHASSIS_INFO_AREA_ID: msk = fru->ci_fld_msk; cust_num = fru->ci_custom_num; break; case SAHPI_IDR_AREATYPE_INTERNAL_USE: return fru->iu; default: if (areaid < OHOI_AREA_FIRST_ID) { err("wrong area id 0x%x", areaid); return 0; } if (areaid > OHOI_AREA_LAST_ID(fru)) { err("wrong area id 0x%x", areaid); return 0; } if (fru->oem_areas) { nf = fru->oem_fields_num; } else { nf = ohoi_atca_oem_area_fields_num(fru, areaid); } return (fieldid <= nf); } area = &areas[areaid - 1]; if (fieldid <= OHOI_FIELD_NUM(area)) { return ((1 << (area->fields[fieldid - 1].fieldtype)) & msk); //return (msk & (1 << (fieldid -1))); } return (fieldid <= cust_num + OHOI_FIELD_NUM(area)); } static void unset_area_presence(struct ohoi_inventory_info *i_info, SaHpiIdrAreaTypeT areatype) { switch (areatype) { case SAHPI_IDR_AREATYPE_BOARD_INFO: i_info->bi = 0; i_info->bi_fld_msk = 0; i_info->bi_custom_num = 0; return; case SAHPI_IDR_AREATYPE_PRODUCT_INFO: i_info->pi = 0; i_info->pi_fld_msk = 0; i_info->pi_custom_num = 0; return; case SAHPI_IDR_AREATYPE_OEM: i_info->oem = 0; i_info->oem_fields_num = 0; return; case SAHPI_IDR_AREATYPE_CHASSIS_INFO: i_info->ci = 0; i_info->ci_fld_msk = 0; i_info->ci_custom_num = 0; return; default: return; } } static int get_first_area(struct ohoi_resource_info *ohoi_res_info, SaHpiIdrAreaTypeT areatype) { int i; for (i = OHOI_AREA_FIRST_ID; i < FIRST_OEM_AREA_NUM; i++) { if ((areatype != SAHPI_IDR_AREATYPE_UNSPECIFIED) && (areas[i - 1].areatype != areatype)) { continue; } if (get_area_presence(ohoi_res_info->fru, i)) { return i; } } return OHOI_AREA_EMPTY_ID; } static int get_first_field(struct ohoi_area_data *area, struct ohoi_inventory_info *fru) { int i; unsigned int *msk; switch (area->areatype) { case SAHPI_IDR_AREATYPE_INTERNAL_USE: return 1; case SAHPI_IDR_AREATYPE_CHASSIS_INFO: msk = &fru->ci_fld_msk; break; case SAHPI_IDR_AREATYPE_BOARD_INFO: msk = &fru->bi_fld_msk; break; case SAHPI_IDR_AREATYPE_PRODUCT_INFO: msk = &fru->pi_fld_msk; break; default: return OHOI_FIELD_EMPTY_ID; } for (i = 0; i < OHOI_FIELD_NUM(area); i++) { if ((1 << area->fields[i].fieldtype) & *msk) { return (i + 1); } } return OHOI_FIELD_EMPTY_ID; } static int get_first_typed_field(struct ohoi_area_data *area, SaHpiIdrFieldTypeT fieldtype, struct ohoi_inventory_info *fru) { int i; unsigned int *msk; switch (area->areatype) { case SAHPI_IDR_AREATYPE_INTERNAL_USE: return 1; case SAHPI_IDR_AREATYPE_CHASSIS_INFO: msk = &fru->ci_fld_msk; break; case SAHPI_IDR_AREATYPE_BOARD_INFO: msk = &fru->bi_fld_msk; break; case SAHPI_IDR_AREATYPE_PRODUCT_INFO: msk = &fru->pi_fld_msk; break; default: return OHOI_FIELD_EMPTY_ID; } if (!((1 << fieldtype) & *msk)) { return OHOI_FIELD_EMPTY_ID; } for (i = 0; i < OHOI_FIELD_NUM(area); i++) { if (area->fields[i].fieldtype == fieldtype) { return (i + 1); } } return OHOI_FIELD_EMPTY_ID; } SaHpiTextTypeT convert_to_hpi_data_type(enum ipmi_str_type_e type) { switch (type) { case IPMI_ASCII_STR: return SAHPI_TL_TYPE_TEXT; case IPMI_UNICODE_STR: return SAHPI_TL_TYPE_UNICODE; case IPMI_BINARY_STR: return SAHPI_TL_TYPE_BINARY; } return SAHPI_TL_TYPE_BINARY; } static SaErrorT get_str_type(SaHpiTextBufferT *tb, SaHpiLanguageT lang, enum ipmi_str_type_e *type) { switch (tb->DataType) { case SAHPI_TL_TYPE_BINARY: *type = IPMI_BINARY_STR; return SA_OK; case SAHPI_TL_TYPE_TEXT: case SAHPI_TL_TYPE_ASCII6: case SAHPI_TL_TYPE_BCDPLUS: *type = IPMI_ASCII_STR; break; case SAHPI_TL_TYPE_UNICODE: *type = IPMI_UNICODE_STR; break; default: err("unknown DataType %d", tb->DataType); return SA_ERR_HPI_INVALID_DATA; } if (lang && (tb->Language != lang)) { err("unexpected language %d. expected %d", tb->Language, lang); return SA_ERR_HPI_INVALID_DATA; } return SA_OK; } static SaHpiLanguageT get_language(struct ohoi_inventory_info *i_info, SaHpiIdrAreaTypeT areatype) { switch (areatype) { case SAHPI_IDR_AREATYPE_BOARD_INFO: return i_info->bi; case SAHPI_IDR_AREATYPE_PRODUCT_INFO: return i_info->pi; default: return SAHPI_LANG_UNDEF; } } struct ohoi_get_field { struct ohoi_field_data *data; SaHpiIdrFieldT *field; int done; SaErrorT rv; }; static void get_field(ipmi_entity_t *ent, void *cb_data) { int rv; unsigned int len; enum ipmi_str_type_e type; ipmi_fru_t *fru; int (*get_len)(ipmi_entity_t *, unsigned int*); int (*get_data)(ipmi_entity_t *, char*, unsigned int*); struct ohoi_get_field *gf = cb_data; struct ohoi_field_data *data = gf->data; SaHpiIdrFieldT *field = gf->field; get_len = data->get_len; get_data = data->get_data; field->Type = data->fieldtype; field->ReadOnly = SAHPI_FALSE; fru = ipmi_entity_get_fru(ent); if (fru == NULL) { err("Bug: entity without fru"); gf->rv = SA_ERR_HPI_INTERNAL_ERROR; gf->done = 1; return; } rv = data->get_type(fru, &type); if (rv) { err("Could not get data type = %d. set SAHPI_TL_TYPE_BINARY", rv); field->Field.DataType = SAHPI_TL_TYPE_BINARY; } else { field->Field.DataType = convert_to_hpi_data_type(type); } field->Field.Language = SAHPI_LANG_ENGLISH; field->Field.DataLength = 0; rv = get_len(ent, &len); if (rv) { err("Error on get_len: %d", rv); gf->rv = SA_ERR_HPI_NOT_PRESENT; gf->done = 1; return; } len++; /* if ASCII string (yes), add one for NULL char. */ if (len > SAHPI_MAX_TEXT_BUFFER_LENGTH) len = SAHPI_MAX_TEXT_BUFFER_LENGTH; rv = get_data(ent, (void *)&field->Field.Data[0], &len); if (!rv) { field->Field.DataLength = len; } else { err("Error on get_data: %d", rv); gf->rv = SA_ERR_HPI_INTERNAL_ERROR; } gf->done = 1; } struct oem_idr_field { SaHpiIdrFieldT *field; SaErrorT rv; int done; }; static void get_oem_idr_field_cb(ipmi_entity_t *ent, void *cbdata) { struct oem_idr_field *oif = cbdata; int rv; unsigned int len; unsigned char ver, type; unsigned int f_id = oif->field->FieldId - 1; rv = ipmi_entity_get_multi_record_data_len(ent, f_id, &len); if (rv) { err("ipmi_entity_get_multi_record_data_len = %d", rv); oif->rv = SA_ERR_HPI_NOT_PRESENT; oif->done = 1; return; } rv = ipmi_entity_get_multi_record_type(ent, f_id, &type); if (rv) { err("ipmi_entity_get_multi_record_type = %d", rv); oif->rv = SA_ERR_HPI_NOT_PRESENT; oif->done = 1; return; } rv = ipmi_entity_get_multi_record_format_version(ent, f_id, &ver); if (rv) { err("ipmi_entity_get_multi_record_format_version = %d", rv); oif->rv = SA_ERR_HPI_NOT_PRESENT; oif->done = 1; return; } if (len > SAHPI_MAX_TEXT_BUFFER_LENGTH - 2) { len = SAHPI_MAX_TEXT_BUFFER_LENGTH - 2; } rv = ipmi_entity_get_multi_record_data(ent, f_id, &oif->field->Field.Data[2], &len); if (rv) { err("ipmi_entity_get_multi_record_data = %d", rv); oif->rv = SA_ERR_HPI_NOT_PRESENT; oif->done = 1; return; } oif->field->Field.Data[0] = type; oif->field->Field.Data[1] = ver; oif->field->Field.DataLength = len + 2; oif->field->Field.DataType = SAHPI_TL_TYPE_BINARY; oif->rv = SA_OK; oif->done = 1; } static SaErrorT get_oem_idr_field(struct oh_handler_state *handler, struct ohoi_resource_info *ohoi_res_info, SaHpiEntryIdT *nextfieldid, SaHpiIdrFieldT *field) { struct ohoi_inventory_info *i_info = ohoi_res_info->fru; struct oem_idr_field oif; SaHpiEntryIdT fieldid = field->FieldId; int rv; if (fieldid < OHOI_FIELD_FIRST_ID) { err("fieldid(%d) < 1", fieldid); return SA_ERR_HPI_NOT_PRESENT; } if (i_info->oem_areas) { // atca oem area mapping. special case return ohoi_atca_oem_area_field(handler, ohoi_res_info, nextfieldid, field); } if (fieldid > i_info->oem_fields_num) { err("fieldid(%d) > i_info->oem_fields_num(%d)", fieldid, i_info->oem_fields_num); return SA_ERR_HPI_NOT_PRESENT; } field->Type = SAHPI_IDR_FIELDTYPE_UNSPECIFIED; oif.done = 0; oif.rv = SA_OK; oif.field = field; rv = ipmi_entity_pointer_cb(ohoi_res_info->u.entity.entity_id, get_oem_idr_field_cb, &oif); if (rv) { err("ipmi_entity_pointer_cb returned %d", rv); oif.rv = SA_ERR_HPI_INTERNAL_ERROR; } else { oif.rv = ohoi_loop(&oif.done, handler->data); } if (oif.rv != SA_OK) { err("get_oem_idr_field. rv = %d", oif.rv); } else if (fieldid < i_info->oem_fields_num) { *nextfieldid = fieldid + 1; } else { *nextfieldid = SAHPI_LAST_ENTRY; } return oif.rv; } struct ohoi_custom_field { int (*get_len)(ipmi_fru_t *, unsigned int, unsigned int*); int (*get_data)(ipmi_fru_t *, unsigned int, char*, unsigned int*); SaHpiIdrFieldT *field; unsigned int num; SaErrorT rv; int done; }; static void get_custom_field_cb(ipmi_entity_t *ent, void *cbdata) { struct ohoi_custom_field *cf = cbdata; ipmi_fru_t *fru; SaHpiIdrFieldT *field = cf->field; unsigned int len; int rv; cf->done = 1; fru = ipmi_entity_get_fru(ent); if (fru == NULL) { err("Bug: entity without fru"); cf->rv = SA_ERR_HPI_INTERNAL_ERROR; return; } field->Field.DataType = SAHPI_TL_TYPE_BINARY; field->Field.Language = SAHPI_LANG_ENGLISH; field->Field.DataLength = 0; rv = cf->get_len(fru, cf->num, &len); if (rv) { err("Error on get_len: %d", rv); cf->rv = SA_ERR_HPI_NOT_PRESENT; return; } dbg("custom field %d len = %d", cf->num, len); if (len > SAHPI_MAX_TEXT_BUFFER_LENGTH) len = SAHPI_MAX_TEXT_BUFFER_LENGTH; rv = cf->get_data(fru, cf->num, (void *)&field->Field.Data[0], &len); if (!rv) { dbg("custom field len = %d", len); field->Field.DataLength = len; } else { err("Error on get_data: %d", rv); cf->rv = SA_ERR_HPI_INTERNAL_ERROR; } } static SaErrorT get_custom_field(struct oh_handler_state *handler, struct ohoi_resource_info *ohoi_res_info, SaHpiEntryIdT lastid, SaHpiEntryIdT fieldid, SaHpiEntryIdT *nextfieldid, SaHpiIdrFieldT *field) { unsigned int num; struct ohoi_custom_field cf; int rv; switch(get_areatype_by_id(field->AreaId, ohoi_res_info->fru)) { case SAHPI_IDR_AREATYPE_CHASSIS_INFO: cf.get_len = ipmi_fru_get_chassis_info_custom_len; cf.get_data = ipmi_fru_get_chassis_info_custom; num = ohoi_res_info->fru->ci_custom_num; break; case SAHPI_IDR_AREATYPE_BOARD_INFO: cf.get_len = ipmi_fru_get_board_info_custom_len; cf.get_data = ipmi_fru_get_board_info_custom; num = ohoi_res_info->fru->bi_custom_num; break; case SAHPI_IDR_AREATYPE_PRODUCT_INFO: cf.get_len =ipmi_fru_get_product_info_custom_len; cf.get_data =ipmi_fru_get_product_info_custom; //get_type = ipmi_fru_get_product_info_custom_type num = ohoi_res_info->fru->pi_custom_num; break; default: err("bug: area %d; wrong areatype %x", field->AreaId, get_areatype_by_id( field->AreaId, ohoi_res_info->fru)); return SA_ERR_HPI_NOT_PRESENT; } if (fieldid - lastid > num) { err("fieldid(%d) - lastid(%d) > num(%d)", fieldid, lastid, num); return SA_ERR_HPI_NOT_PRESENT; } cf.done = 0; cf.rv = SA_OK; cf.num = fieldid - lastid - 1; cf.field = field; rv = ipmi_entity_pointer_cb(ohoi_res_info->u.entity.entity_id, get_custom_field_cb, &cf); if (rv) { err("ipmi_entity_pointer_cb returned %d", rv); cf.rv = SA_ERR_HPI_INTERNAL_ERROR; } else { cf.rv = ohoi_loop(&cf.done, handler->data); } if (cf.rv != SA_OK) { err("error after get_custom_field_cb cf.rv =%d", cf.rv); return cf.rv; } field->Field.DataType = SAHPI_TL_TYPE_TEXT; // FIXME field->Field.Language = SAHPI_LANG_ENGLISH; // FIXME if (fieldid - lastid < num) { *nextfieldid = fieldid + 1; } else { *nextfieldid = SAHPI_LAST_ENTRY; } return SA_OK; } SaErrorT ohoi_get_idr_info(void *hnd, SaHpiResourceIdT rid, SaHpiIdrIdT idrid, SaHpiIdrInfoT *idrinfo) { struct oh_handler_state *handler = hnd; struct ohoi_resource_info *ohoi_res_info; struct ohoi_inventory_info *fru; SaHpiUint32T na = 0; OHOI_CHECK_RPT_CAP_IDR(); ohoi_res_info = oh_get_resource_data(handler->rptcache, rid); if (ohoi_res_info->fru == NULL) { err("bug: resource without fru?"); return SA_ERR_HPI_CAPABILITY; } if (idrid != OHOI_IDR_DEFAULT_ID) { err("drid(%d) != OHOI_IDR_DEFAULT_ID", idrid); return SA_ERR_HPI_NOT_PRESENT; } fru = ohoi_res_info->fru; dbg_print_fru("get idr info", ohoi_res_info->u.entity.entity_id); g_mutex_lock(fru->mutex); idrinfo->IdrId = OHOI_IDR_DEFAULT_ID; idrinfo->UpdateCount = fru->update_count; idrinfo->ReadOnly = SAHPI_FALSE; if (fru->iu) { na++; } if (fru->ci) { na++; } if (fru->bi) { na++; } if (fru->pi) { na++; } if (fru->oem) { na++; } idrinfo->NumAreas = na; g_mutex_unlock(fru->mutex); return SA_OK; } static SaHpiUint32T get_num_fields(struct ohoi_inventory_info *fru, SaHpiEntryIdT areaid) { SaHpiUint32T nf = 0; unsigned int msk; unsigned int cust_num; int i; if (areaid < OHOI_AREA_FIRST_ID || areaid > OHOI_AREA_LAST_ID(fru)) { err("wrong areaid %d, last area id %d", areaid, OHOI_AREA_LAST_ID(fru)); return 0; } switch (areaid) { case OHOI_BOARD_INFO_AREA_ID: msk = fru->bi_fld_msk; cust_num = fru->bi_custom_num; break; case OHOI_PRODUCT_INFO_AREA_ID: msk = fru->pi_fld_msk; cust_num = fru->pi_custom_num; break; case OHOI_CHASSIS_INFO_AREA_ID: msk = fru->ci_fld_msk; cust_num = fru->ci_custom_num; break; case SAHPI_IDR_AREATYPE_INTERNAL_USE: return 1; default: if (fru->oem_areas == NULL) { return fru->oem_fields_num; } return ohoi_atca_oem_area_fields_num(fru, areaid); } msk &= ~(1 << SAHPI_IDR_FIELDTYPE_CUSTOM); for (i = 0; i < sizeof (msk) * 8; i++) { if (msk & 1) { nf++; } msk = (msk >> 1); } nf += cust_num; return nf; } SaErrorT ohoi_get_idr_area_header(void *hnd, SaHpiResourceIdT rid, SaHpiIdrIdT idrid, SaHpiIdrAreaTypeT areatype, SaHpiEntryIdT areaid, SaHpiEntryIdT *nextareaid, SaHpiIdrAreaHeaderT *header) { struct oh_handler_state *handler = hnd; struct ohoi_resource_info *ohoi_res_info; SaHpiEntryIdT tmp_id; struct ohoi_inventory_info *fru; OHOI_CHECK_RPT_CAP_IDR(); ohoi_res_info = oh_get_resource_data(handler->rptcache, rid); if (ohoi_res_info->fru == NULL) { err("bug: resource without fru?"); return SA_ERR_HPI_CAPABILITY; } fru = ohoi_res_info->fru; g_mutex_lock(fru->mutex); if ((areatype == SAHPI_IDR_AREATYPE_UNSPECIFIED) && (areaid == SAHPI_FIRST_ENTRY)) { for (tmp_id = OHOI_AREA_FIRST_ID; tmp_id <= OHOI_AREA_LAST_ID(fru); tmp_id++) { if (get_area_presence(fru, tmp_id)) { break; } } if (tmp_id > FIRST_OEM_AREA_NUM) { err("tmp_id > OHOI_AREA_LAST_ID"); g_mutex_unlock(fru->mutex); return SA_ERR_HPI_NOT_PRESENT; } areaid = tmp_id; } else if ((areatype != SAHPI_IDR_AREATYPE_UNSPECIFIED) && (areaid == SAHPI_FIRST_ENTRY)) { areaid = get_first_area(ohoi_res_info, areatype); if (areaid == OHOI_AREA_EMPTY_ID) { err("areaid == OHOI_AREA_EMPTY_ID"); g_mutex_unlock(fru->mutex); return SA_ERR_HPI_NOT_PRESENT; } } else if ((areatype == SAHPI_IDR_AREATYPE_UNSPECIFIED) && (areaid != SAHPI_FIRST_ENTRY)) { if (!get_area_presence(fru, areaid)) { err("area %d not present", areaid); g_mutex_unlock(fru->mutex); return SA_ERR_HPI_NOT_PRESENT; } } else if ((areatype != SAHPI_IDR_AREATYPE_UNSPECIFIED) && (areaid != SAHPI_FIRST_ENTRY)) { if (get_areatype_by_id(areaid, fru) != areatype) { err("area %d not present or type(0x%x) dismatch", areaid, areatype); g_mutex_unlock(fru->mutex); return SA_ERR_HPI_NOT_PRESENT; } } if (areatype != SAHPI_IDR_AREATYPE_UNSPECIFIED) { if (areatype == SAHPI_IDR_AREATYPE_OEM) { if (areaid < OHOI_AREA_LAST_ID(fru)) { *nextareaid = areaid + 1; } else { *nextareaid = SAHPI_LAST_ENTRY; } } else { *nextareaid = SAHPI_LAST_ENTRY; } } else { for (tmp_id = areaid + 1; tmp_id <= OHOI_AREA_LAST_ID(fru); tmp_id++) { if (get_area_presence(fru, tmp_id)) { break; } } if (tmp_id > OHOI_AREA_LAST_ID(fru)) { *nextareaid = SAHPI_LAST_ENTRY; } else { *nextareaid = tmp_id; } } header->AreaId = areaid; header->Type = get_areatype_by_id(areaid, fru); if (fru->oem_areas && areaid >= FIRST_OEM_AREA_NUM) { header->ReadOnly = SAHPI_TRUE; } else { header->ReadOnly = (header->Type == SAHPI_IDR_AREATYPE_INTERNAL_USE) ? SAHPI_TRUE : SAHPI_FALSE; } header->NumFields = get_num_fields(fru, areaid); g_mutex_unlock (fru->mutex); return SA_OK; } static int try_to_alloc_room_for_area(ipmi_fru_t *fru, SaHpiIdrAreaTypeT areatype, unsigned int *off) { struct ohoi_fru_layout layout; unsigned int len; unsigned int ipmi_atype; unsigned int i; unsigned int beg = 8; // common header length unsigned int end; struct ohoi_area_layout *al; int r; len = areas[get_first_areaid_by_type(areatype) - 1].empty_len; if (get_fru_layout(fru, &layout)) { err("could not get fru layout"); return 1; } print_fru_layout("Initial layout", &layout); if (len > layout.free_len) { al = &layout.areas[IPMI_FRU_FTR_MULTI_RECORD_AREA]; if (al->off != 0 && (len <= layout.free_len + al->len - ((al->used_len +7)&~7))) { err("Decrease len of OEM_AREA from %d to %d", al->len, (al->used_len +7)&~7); /* r = ipmi_fru_area_set_length(fru, IPMI_FRU_FTR_MULTI_RECORD_AREA, (al->used_len +7)&~7); if (r != 0) { err("ipmi_fru_area_set_length() returned %d", r); return 1; } */ layout.free_len += al->len - ((al->used_len +7)&~7); al->len = (al->used_len +7)&~7; print_fru_layout("After truncate OEM AREA layout", &layout); } } if (len > layout.free_len) { err("len(%d) < layout->free_len(%d)", len, layout.free_len); return 1; } ipmi_atype = get_ipmi_areatype(areatype); for (i = 0; i < ipmi_atype; i++) { // try to up previous areas al = &layout.areas[i]; if (al->off == 0) { continue; } if (beg < al->off) { r = ipmi_fru_area_set_offset(fru, i, beg); if (r != 0) { err("ipmi_fru_area_set_offset for area %d = %d", i, r); return 1; } al->off = beg; } beg = al->off + al->len; } end =layout.len - 8; if ((ipmi_atype + 1) == IPMI_FRU_FTR_NUMBER) { if (beg + len <= end) { *off = beg; print_fru_layout("After moving above areas layout", &layout); return 0; } else { err("STRANGE. There is still not enough room."); return 1; } } for (i = IPMI_FRU_FTR_NUMBER - 1; i > ipmi_atype; i--) { al = &layout.areas[i]; if (al->off == 0) { continue; } if (al->off + al->len < end) { r = ipmi_fru_area_set_offset(fru, i, end - al->len); if (r != 0) { err("ipmi_fru_area_set_offset to %d for area %d = %d", end - al->len, i, r); return 1; } } al->off = end - al->len; end = al->off; } print_fru_layout("Result Layout", &layout); if (beg + len > end) { err("STRANGE. There is still not enough room."); return 1; } *off = beg; return 0; } /************** ADD AREA ************/ struct ohoi_add_area { struct ohoi_resource_info *res_info; struct oh_handler_state *handler; SaHpiIdrAreaTypeT areatype; int done; SaErrorT rv; }; static void add_idr_area_cb(ipmi_entity_t *ent, void *cb_data) { struct ohoi_add_area *ar_add = cb_data; ipmi_fru_t *fru; unsigned int off; int r; fru = ipmi_entity_get_fru(ent); if (try_to_alloc_room_for_area(fru, ar_add->areatype, &off)) { ar_add->rv = SA_ERR_HPI_OUT_OF_SPACE; ar_add->done = 1; return; } r = ipmi_fru_add_area(fru, get_ipmi_areatype(ar_add->areatype), off, areas[get_first_areaid_by_type(ar_add->areatype) - 1].empty_len); if (r) { err("ipmi_fru_add_area(fru, 0x%x, 0x%x, 0x%x) return %d", get_ipmi_areatype(ar_add->areatype), off, areas[get_first_areaid_by_type(ar_add->areatype) - 1].empty_len, r); ar_add->rv = SA_ERR_HPI_INTERNAL_ERROR; } ar_add->done = 1; } SaErrorT ohoi_add_idr_area(void *hnd, SaHpiResourceIdT rid, SaHpiIdrIdT idrid, SaHpiIdrAreaTypeT areatype, SaHpiEntryIdT *areaid) { struct oh_handler_state *handler = hnd; struct ohoi_resource_info *ohoi_res_info; struct ohoi_inventory_info *fru; int rv; SaErrorT ret; struct ohoi_add_area ar_add; OHOI_CHECK_RPT_CAP_IDR(); ohoi_res_info = oh_get_resource_data(handler->rptcache, rid); if (ohoi_res_info->fru == NULL) { err("bug: resource without fru?"); return SA_ERR_HPI_CAPABILITY; } fru = ohoi_res_info->fru; g_mutex_lock(fru->mutex); if (get_areatype_presence(fru, areatype)) { g_mutex_unlock(fru->mutex); err("area 0x%x already present", areatype); return SA_ERR_HPI_INVALID_DATA; } ar_add.res_info = ohoi_res_info; ar_add.handler = handler; ar_add.areatype = areatype; ar_add.done = 0; ar_add.rv = SA_OK; rv = ipmi_entity_pointer_cb(ohoi_res_info->u.entity.entity_id, add_idr_area_cb, &ar_add); if (rv) { err("ipmi_entity_pointer_cb returned %d", rv); g_mutex_unlock (fru->mutex); return SA_ERR_HPI_INTERNAL_ERROR; } ret = ohoi_loop(&ar_add.done, handler->data); if (ret != SA_OK) { err("ohoi_loop = %d", ret); g_mutex_unlock(fru->mutex); return ret; } if (ar_add.rv != SA_OK) { err("callback failed. ar_add.rv = %d", ar_add.rv); g_mutex_unlock(fru->mutex); return ar_add.rv; } ret = ohoi_fru_write(handler->data, ohoi_res_info->u.entity.entity_id); if (ret == SA_OK) { set_area_presence(fru, areatype); ohoi_res_info->fru->update_count++; *areaid = get_first_areaid_by_type(areatype); } g_mutex_unlock (fru->mutex); return ret; } /************** DELETE AREA ******************/ struct ohoi_del_area { SaHpiIdrAreaTypeT areatype; struct oh_handler_state *handler; int done; SaErrorT rv; }; static void del_idr_area_cb(ipmi_entity_t *ent, void *cb_data) { struct ohoi_del_area *ar_del = cb_data; ipmi_fru_t *fru; int r; fru = ipmi_entity_get_fru(ent); ar_del->done = 1; r = ipmi_fru_delete_area(fru, get_ipmi_areatype(ar_del->areatype)); if (r) { err("ipmi_fru_del_area return %d", r); ar_del->rv = SA_ERR_HPI_INTERNAL_ERROR; return; } ar_del->done = 1; } SaErrorT ohoi_del_idr_area(void *hnd, SaHpiResourceIdT rid, SaHpiIdrIdT idrid, SaHpiEntryIdT areaid) { struct oh_handler_state *handler = hnd; struct ohoi_resource_info *ohoi_res_info; struct ohoi_inventory_info *fru; int rv; SaErrorT ret; struct ohoi_del_area ar_del; SaHpiIdrAreaTypeT areatype; OHOI_CHECK_RPT_CAP_IDR(); ohoi_res_info = oh_get_resource_data(handler->rptcache, rid); if (ohoi_res_info->fru == NULL) { err("bug: resource without fru?"); return SA_ERR_HPI_CAPABILITY; } fru = ohoi_res_info->fru; g_mutex_lock(fru->mutex); if (areaid == SAHPI_FIRST_ENTRY) { areaid = get_first_area(ohoi_res_info, SAHPI_IDR_AREATYPE_UNSPECIFIED); } if (!get_area_presence(fru, areaid)) { g_mutex_unlock(fru->mutex); return SA_ERR_HPI_NOT_PRESENT; } areatype = get_areatype_by_id(areaid, fru); if (areatype == OHOI_AREA_EMPTY_ID) { err("areatype == OHOI_AREA_EMPTY_ID"); g_mutex_unlock(fru->mutex); return SA_ERR_HPI_INVALID_PARAMS; } if (areatype == SAHPI_IDR_AREATYPE_INTERNAL_USE) { g_mutex_unlock(fru->mutex); return SA_ERR_HPI_READ_ONLY; } if ((areatype == SAHPI_IDR_AREATYPE_OEM) && fru->oem_areas) { g_mutex_unlock(fru->mutex); return SA_ERR_HPI_READ_ONLY; } ar_del.areatype = areatype; ar_del.handler = handler; ar_del.done = 0; ar_del.rv = SA_OK; rv = ipmi_entity_pointer_cb(ohoi_res_info->u.entity.entity_id, del_idr_area_cb, &ar_del); if (rv) { err("ipmi_entity_pointer_cb returned %d", rv); g_mutex_unlock (fru->mutex); ar_del.rv = SA_ERR_HPI_INTERNAL_ERROR; } ret = ohoi_loop(&ar_del.done, handler->data); if (ret != SA_OK) { err("ohoi_loop = %d", ret); g_mutex_unlock(fru->mutex); return ret; } if (ar_del.rv != SA_OK) { err("ohoi_del_idr_field failed. rv = %d", ar_del.rv); g_mutex_unlock(fru->mutex); return ar_del.rv; } ret = ohoi_fru_write(handler->data, ohoi_res_info->u.entity.entity_id); if (ret == SA_OK) { unset_area_presence(fru, areatype); ohoi_res_info->fru->update_count++; } g_mutex_unlock (fru->mutex); return ret; } /**************** GET FIELD ****************/ static SaHpiEntryIdT get_nextfield(struct ohoi_inventory_info *i_info, struct ohoi_area_data *area_data, SaHpiEntryIdT fieldid) { unsigned int msk; unsigned int num; SaHpiEntryIdT i; switch (area_data->areatype) { case SAHPI_IDR_AREATYPE_INTERNAL_USE: return SAHPI_LAST_ENTRY; case SAHPI_IDR_AREATYPE_CHASSIS_INFO: msk = i_info->ci_fld_msk; num = i_info->ci_custom_num; break; case SAHPI_IDR_AREATYPE_BOARD_INFO: msk = i_info->bi_fld_msk; num = i_info->bi_custom_num; break; case SAHPI_IDR_AREATYPE_PRODUCT_INFO: msk = i_info->pi_fld_msk; num = i_info->pi_custom_num; break; case SAHPI_IDR_AREATYPE_OEM: msk = 0; num = 0; break; default: err("bug: wrong areatype %x", area_data->areatype); return SA_ERR_HPI_INTERNAL_ERROR; } dbg("area = %x; fieldid = %d; msk = %x; num = %x", area_data->areatype, fieldid, msk, num); for (i = 1; fieldid + i <= OHOI_FIELD_LAST_ID(area_data); i++) { if ((1 << (area_data->fields[fieldid + i - 1].fieldtype)) & msk) { err("return %d for not custom field %d, type %d", fieldid + i, fieldid, area_data->fields[fieldid + i - 1].fieldtype); return fieldid + i; } } if (((1 << SAHPI_IDR_FIELDTYPE_CUSTOM) & msk) && (fieldid < OHOI_FIELD_LAST_ID(area_data) + num)) { err("return %d for custom field", fieldid + 1); return fieldid + 1; } err("return SAHPI_LAST_ENTRY"); return SAHPI_LAST_ENTRY; } SaErrorT ohoi_get_idr_field(void *hnd, SaHpiResourceIdT rid, SaHpiIdrIdT idrid, SaHpiEntryIdT areaid, SaHpiIdrFieldTypeT fieldtype, SaHpiEntryIdT fieldid, SaHpiEntryIdT *nextfieldid, SaHpiIdrFieldT *field) { struct oh_handler_state *handler = hnd; struct ohoi_resource_info *ohoi_res_info; ipmi_entity_id_t ent_id; struct ohoi_field_data *field_data; struct ohoi_area_data *area_data; struct ohoi_get_field gf; struct ohoi_inventory_info *fru; int rv; SaErrorT ret; OHOI_CHECK_RPT_CAP_IDR(); if ((fieldid != SAHPI_FIRST_ENTRY) && (fieldid < OHOI_FIELD_FIRST_ID)) { err("fieldid(%d) < 1", fieldid); return SA_ERR_HPI_NOT_PRESENT; } ohoi_res_info = oh_get_resource_data(handler->rptcache, rid); if (!(ohoi_res_info->type & OHOI_RESOURCE_ENTITY)) { err("Bug: try to get fru in unsupported resource"); return SA_ERR_HPI_INVALID_CMD; } fru = ohoi_res_info->fru; if (fru == NULL) { err("bug: resource without fru?"); return SA_ERR_HPI_CAPABILITY; } ent_id = ohoi_res_info->u.entity.entity_id; if (areaid == SAHPI_FIRST_ENTRY) { areaid = get_first_area(ohoi_res_info, SAHPI_IDR_AREATYPE_UNSPECIFIED); if (areaid == OHOI_AREA_EMPTY_ID) { err("idr without areas?"); return SA_ERR_HPI_NOT_PRESENT; } } if (areaid > OHOI_AREA_LAST_ID(fru)) { err("areaid(%d) > OHOI_AREA_LAST_ID", areaid); return SA_ERR_HPI_NOT_PRESENT; } g_mutex_lock(fru->mutex); if (areaid >= FIRST_OEM_AREA_NUM) { // oem area is handled by special alghorithm if (fieldtype != SAHPI_IDR_FIELDTYPE_UNSPECIFIED && fieldtype != SAHPI_IDR_FIELDTYPE_CUSTOM) { err("fieldtype != UNSPECIFIED or CUSTOM"); g_mutex_unlock(fru->mutex); return SA_ERR_HPI_NOT_PRESENT; } if (fieldid ==SAHPI_FIRST_ENTRY) { fieldid = OHOI_FIELD_FIRST_ID; } field->FieldId = fieldid; field->AreaId = areaid; ret = get_oem_idr_field(handler, ohoi_res_info, nextfieldid, field); g_mutex_unlock(fru->mutex); if (ret != SA_OK) { err("get_oem_idr_field = %d", ret); } return ret; } area_data = &areas[areaid - 1]; field->AreaId = areaid; if ((fieldtype == SAHPI_IDR_FIELDTYPE_UNSPECIFIED) && (fieldid == SAHPI_FIRST_ENTRY)) { fieldid = get_first_field(area_data, fru); if (fieldid == OHOI_FIELD_EMPTY_ID) { err("fieldid == OHOI_FIELD_EMPTY_ID"); g_mutex_unlock(fru->mutex); return SA_ERR_HPI_NOT_PRESENT; } } else if ((fieldtype != SAHPI_IDR_FIELDTYPE_UNSPECIFIED) && (fieldid == SAHPI_FIRST_ENTRY)) { fieldid = get_first_typed_field(area_data, fieldtype, fru); if (fieldid == OHOI_FIELD_EMPTY_ID) { err("fieldid == OHOI_FIELD_EMPTY_ID"); g_mutex_unlock(fru->mutex); return SA_ERR_HPI_NOT_PRESENT; } } else if ((fieldtype == SAHPI_IDR_FIELDTYPE_UNSPECIFIED) && (fieldid != SAHPI_FIRST_ENTRY)) { if (!field_present(fru, areaid, fieldid)) { g_mutex_unlock(fru->mutex); err("field %d of area %d not present", fieldid, areaid); return SA_ERR_HPI_NOT_PRESENT; } if (fieldid > OHOI_FIELD_LAST_ID(area_data)) { err("area %x; fieldid(%u) >= " "OHOI_FIELD_LAST_ID(area_data)(%u)", area_data->areatype, fieldid, OHOI_FIELD_LAST_ID(area_data)); field->FieldId = fieldid; field->Type = SAHPI_IDR_FIELDTYPE_CUSTOM; field->ReadOnly = SAHPI_FALSE; //area_data->read_only; ret = get_custom_field(handler, ohoi_res_info, OHOI_FIELD_LAST_ID(area_data), fieldid, nextfieldid, field); g_mutex_unlock(fru->mutex); if (ret != SA_OK) { err("get_custom_field = %d", ret); } return ret; } } else if ((fieldtype != SAHPI_IDR_FIELDTYPE_UNSPECIFIED) && (fieldid != SAHPI_FIRST_ENTRY)) { if (fieldid > OHOI_FIELD_LAST_ID(area_data)) { if (fieldtype != SAHPI_IDR_FIELDTYPE_CUSTOM) { err("fieldtype(%d) != SAHPI_IDR_FIELDTYPE_CUSTOM", fieldtype); g_mutex_unlock(fru->mutex); return SA_ERR_HPI_NOT_PRESENT; } ret = get_custom_field(handler, ohoi_res_info, fieldid - OHOI_FIELD_LAST_ID(area_data), fieldid, nextfieldid, field); g_mutex_unlock(fru->mutex); return ret; } if (area_data->fields[fieldid - 1].fieldtype != fieldtype) { err("area_data->fields[fieldid - 1].fieldtype != fieldtype(%d != %d)", area_data->fields[fieldid - 1].fieldtype, fieldtype); g_mutex_unlock(fru->mutex); return SA_ERR_HPI_NOT_PRESENT; } } field_data = &area_data->fields[fieldid - 1]; if (area_data->areatype == SAHPI_IDR_AREATYPE_OEM) { if (fieldid < ohoi_res_info->fru->oem_fields_num - 1) { *nextfieldid = fieldid + 1; } else { *nextfieldid = SAHPI_LAST_ENTRY; } } else if ((fieldtype !=SAHPI_IDR_FIELDTYPE_UNSPECIFIED) && (fieldtype != SAHPI_IDR_FIELDTYPE_CUSTOM)) { *nextfieldid = SAHPI_LAST_ENTRY; } else { *nextfieldid = get_nextfield(ohoi_res_info->fru, area_data, fieldid); } field->FieldId = fieldid; field->Type = field_data->fieldtype; gf.field = field; gf.data = field_data; gf.rv = SA_OK; gf.done = 0; rv = ipmi_entity_pointer_cb(ent_id, get_field, &gf); if (rv) { g_mutex_unlock(fru->mutex); err("ipmi_entity_pointer_cb = %d", rv); return SA_ERR_HPI_INTERNAL_ERROR; } if (gf.rv != SA_OK) { err("get_field failed for rpt %d AreaId = %u, fildId = %u, type = %u", rid, areaid, fieldid, field_data->fieldtype); } else { gf.rv = ohoi_loop(&gf.done, handler->data); } if (gf.rv != SA_OK) { err("ohoi_loop = %d", gf.rv); g_mutex_unlock(fru->mutex); return gf.rv; } field->ReadOnly = SAHPI_FALSE; //area_data->read_only; if (field_data->lang == SAHPI_LANG_UNDEF) { field->Field.Language = get_language(ohoi_res_info->fru, area_data->areatype); } else { field->Field.Language = field_data->lang; } g_mutex_unlock (fru->mutex); return SA_OK; } /************* MODIFYING (ADD, SET, DELETE) FIELD **************/ static SaErrorT modify_inventory(SaHpiIdrFieldT *field, ipmi_entity_t *ent, struct ohoi_resource_info *res_info); struct ohoi_mod_field { SaHpiIdrFieldT *field; struct ohoi_resource_info *res_info; struct oh_handler_state *hnd; SaErrorT rv; int done; }; struct ohoi_del_field { SaHpiEntryIdT fieldid; SaHpiEntryIdT areaid; struct ohoi_resource_info *res_info; struct oh_handler_state *hnd; SaErrorT rv; int done; }; static void modify_inventoty_field_cb(ipmi_entity_t *ent, void *cbdata) { struct ohoi_mod_field *mf = cbdata; mf->rv = modify_inventory(mf->field, ent, mf->res_info); if (mf->rv != SA_OK) { err("modify_inventory failed. return %d", mf->rv); } mf->done = 1; } /************* SET FIELD *************/ SaErrorT ohoi_set_idr_field(void *hnd, SaHpiResourceIdT rid, SaHpiIdrIdT idrid, SaHpiIdrFieldT *field) { struct oh_handler_state *handler = hnd; struct ohoi_resource_info *ohoi_res_info; struct ohoi_inventory_info *fru; struct ohoi_mod_field mf; struct ohoi_area_data *area; int rv; SaErrorT ret; OHOI_CHECK_RPT_CAP_IDR(); ohoi_res_info = oh_get_resource_data(handler->rptcache, rid); if (!(ohoi_res_info->type & OHOI_RESOURCE_ENTITY)) { err("Bug: try to get fru in unsupported resource"); return SA_ERR_HPI_INVALID_CMD; } fru = ohoi_res_info->fru; if (fru == NULL) { err("bug: resource without fru?"); return SA_ERR_HPI_CAPABILITY; } if (field->AreaId < OHOI_AREA_FIRST_ID){ err("wrong AreaId %d", field->AreaId); return SA_ERR_HPI_NOT_PRESENT; } if (field->AreaId > OHOI_AREA_LAST_ID(fru)){ err("wrong AreaId %d", field->AreaId); return SA_ERR_HPI_NOT_PRESENT; } if (fru->oem_areas && field->AreaId >= FIRST_OEM_AREA_NUM) { return SA_ERR_HPI_READ_ONLY; } area = &areas[field->AreaId - 1]; if (field->FieldId > OHOI_FIELD_LAST_ID(area)) { if (field->Type != SAHPI_IDR_FIELDTYPE_CUSTOM) { err("implementation restriction doesn't permit " "to change field type"); // return SA_ERR_HPI_INVALID_DATA; field->Type = SAHPI_IDR_FIELDTYPE_CUSTOM; } } else if (area->fields[field->FieldId - 1].fieldtype != field->Type) { err("implementation restriction doesn't permit " "to change field type 0x%x -> 0x%x", area->fields[field->FieldId - 1].fieldtype, field->Type); return SA_ERR_HPI_INVALID_DATA; } mf.field = field; mf.res_info = ohoi_res_info; mf.hnd = hnd; mf.rv = SA_OK; mf.done = 0; g_mutex_lock(fru->mutex); rv = ipmi_entity_pointer_cb(ohoi_res_info->u.entity.entity_id, modify_inventoty_field_cb, &mf); if (rv) { err("ipmi_entity_pointer_cb returned %d", rv); g_mutex_unlock (fru->mutex); mf.rv = SA_ERR_HPI_INTERNAL_ERROR; } else { ret = ohoi_loop(&mf.done, handler->data); if (ret != SA_OK) { mf.rv = ret; } } if (mf.rv != SA_OK) { err("ohoi_set_idr_field failed. rv = %d", mf.rv); g_mutex_unlock (fru->mutex); return mf.rv; } ret = ohoi_fru_write(handler->data, ohoi_res_info->u.entity.entity_id); if (ret != SA_OK) { err("Couldn't write up updated field %d of area %d", field->FieldId, field->AreaId); g_mutex_unlock (fru->mutex); return ret; } switch (get_areatype_by_id(field->AreaId, fru)) { case SAHPI_IDR_AREATYPE_CHASSIS_INFO : fru->ci_fld_msk |= (1 << field->Type); break; case SAHPI_IDR_AREATYPE_BOARD_INFO : fru->bi_fld_msk |= (1 << field->Type); break; case SAHPI_IDR_AREATYPE_PRODUCT_INFO : fru->pi_fld_msk |= (1 << field->Type); break; default : err("area 0x%x doesn't permit fields modification", get_areatype_by_id(field->AreaId, fru)); break; } fru->update_count++; g_mutex_unlock (fru->mutex); return SA_OK; } /****** ADD FIELD ******/ SaErrorT ohoi_add_idr_field(void *hnd, SaHpiResourceIdT rid, SaHpiIdrIdT idrid, SaHpiIdrFieldT *field) { SaHpiEntryIdT fid; struct oh_handler_state *handler = hnd; struct ohoi_resource_info *ohoi_res_info; struct ohoi_inventory_info *fru; SaHpiIdrAreaTypeT a_type; SaErrorT rv; ohoi_res_info = oh_get_resource_data(handler->rptcache, rid); if (!(ohoi_res_info->type & OHOI_RESOURCE_ENTITY)) { err("Bug: try to get fru in unsupported resource"); return SA_ERR_HPI_INVALID_CMD; } fru = ohoi_res_info->fru; if (fru == NULL) { err("bug: resource without fru?"); return SA_ERR_HPI_CAPABILITY; } if (field->AreaId < OHOI_AREA_FIRST_ID) { err("wrong AreaId %d", field->AreaId); return SA_ERR_HPI_NOT_PRESENT; } if (field->AreaId > OHOI_AREA_LAST_ID(fru)) { err("wrong AreaId %d", field->AreaId); return SA_ERR_HPI_NOT_PRESENT; } a_type = get_areatype_by_id(field->AreaId, fru); field->FieldId = 0; fid = get_fieldid_by_type(fru, field->AreaId, field->Type); if (fid == 0) { err("invalid field type %d", field->Type); return SA_ERR_HPI_INVALID_PARAMS; } field->FieldId = fid; rv = ohoi_set_idr_field(hnd, rid, idrid, field); if (rv != SA_OK) { return rv; } if (field->Type == SAHPI_IDR_FIELDTYPE_CUSTOM) { switch (a_type) { case SAHPI_IDR_AREATYPE_CHASSIS_INFO : fru->ci_custom_num++; break; case SAHPI_IDR_AREATYPE_BOARD_INFO : fru->bi_custom_num++; break; case SAHPI_IDR_AREATYPE_PRODUCT_INFO : fru->pi_custom_num++; break; default : err("area 0x%x doesn't permit custom fields", a_type); break; } } else { set_field_presence(fru, a_type, field->Type); } return rv; } /************ DELETE FIELD ************/ static void delete_inventoty_field_cb(ipmi_entity_t *ent, void *cbdata) { struct ohoi_del_field *df = cbdata; SaHpiIdrFieldT field; field.FieldId = df->fieldid; field.AreaId = df->areaid; // field.Type = areas[df->areaid - 1].fields[df->fieldid - 1].fieldtype; field.Field.DataLength = 0; field.Field.DataType = SAHPI_TL_TYPE_BINARY; if (field.FieldId <= OHOI_FIELD_LAST_ID(&areas[df->areaid - 1])) { field.Type = areas[df->areaid - 1]. fields[df->fieldid - 1].fieldtype; } else { field.Type = SAHPI_IDR_FIELDTYPE_CUSTOM; } df->rv = modify_inventory(&field, ent, df->res_info); df->done = 1; if (df->rv != SA_OK) { err("modify_inventory failed. return %d", df->rv); } df->done = 1; } SaErrorT ohoi_del_idr_field(void *hnd, SaHpiResourceIdT rid, SaHpiIdrIdT idrid, SaHpiEntryIdT areaid, SaHpiEntryIdT fieldid) { struct oh_handler_state *handler = hnd; struct ohoi_resource_info *ohoi_res_info; struct ohoi_inventory_info *fru; struct ohoi_del_field df; int rv; SaErrorT ret; OHOI_CHECK_RPT_CAP_IDR(); ohoi_res_info = oh_get_resource_data(handler->rptcache, rid); if (!(ohoi_res_info->type & OHOI_RESOURCE_ENTITY)) { err("Bug: try to get fru in unsupported resource"); return SA_ERR_HPI_INVALID_CMD; } fru = ohoi_res_info->fru; if (fru == NULL) { err("bug: resource without fru?"); return SA_ERR_HPI_CAPABILITY; } if (areaid < OHOI_AREA_FIRST_ID) { err("areaid < 1"); return SA_ERR_HPI_NOT_PRESENT; } if (areaid > OHOI_AREA_LAST_ID(fru)) { err("areaid(%d) > OHOI_AREA_LAST_ID(%d) || areaid < 1", areaid, OHOI_AREA_LAST_ID(fru)); return SA_ERR_HPI_NOT_PRESENT; } if (fru->oem_areas && (areaid >= FIRST_OEM_AREA_NUM)) { return SA_ERR_HPI_READ_ONLY; } if (!get_area_presence(fru, areaid)) { return SA_ERR_HPI_NOT_PRESENT; } if (!field_present(fru, areaid, fieldid)) { return SA_ERR_HPI_NOT_PRESENT; } df.fieldid = fieldid; df.areaid = areaid; df.res_info = ohoi_res_info; df.hnd = hnd; df.rv = SA_OK; df.done = 0; g_mutex_lock(fru->mutex); rv = ipmi_entity_pointer_cb(ohoi_res_info->u.entity.entity_id, delete_inventoty_field_cb, &df); if (rv) { err("ipmi_entity_pointer_cb returned %d", rv); g_mutex_unlock(fru->mutex); return SA_ERR_HPI_INTERNAL_ERROR; } ret = ohoi_loop(&df.done, handler->data); if (ret != SA_OK) { g_mutex_unlock(fru->mutex); return ret; } if (df.rv != SA_OK) { err("ohoi_del_idr_field failed. rv = %d", df.rv); g_mutex_unlock(fru->mutex); return df.rv; } ret = ohoi_fru_write(handler->data, ohoi_res_info->u.entity.entity_id); if (ret == SA_OK) { ohoi_res_info->fru->update_count++; } g_mutex_unlock(fru->mutex); return ret; } static int try_to_change_area_size(ipmi_fru_t *fru, unsigned int delta, unsigned int my_a_type) { unsigned int fru_len; unsigned int sum_len = 0; unsigned int len; unsigned int my_len = 0; unsigned int i; unsigned int off; int rv; dbg("enter: delta = %u, area = %u", delta, my_a_type); // calculate sum of all area sizes for (i = 0; i < IPMI_FRU_FTR_NUMBER; i++) { rv = ipmi_fru_area_get_length(fru, i, &len); if (rv == 0) { sum_len += len; if (i == my_a_type) { my_len = len; } } } fru_len = ipmi_fru_get_data_length(fru); // must be multiple 8 delta = ((delta + 7) >> 3) << 3; dbg("fru_len = %u; sum_len = %u; new_delta = %u", fru_len, sum_len, delta); if (sum_len + delta > fru_len) { err("not enough space. Do nothing"); return 1; } for (i = IPMI_FRU_FTR_NUMBER - 1; i != my_a_type; i--) { // move all below areas down to free space rv = ipmi_fru_area_get_offset(fru, i, &off); if (rv) { dbg("no area %u in fru. coontinue", i); continue; } dbg("offset of area %u is changing from %u to %u", i, off, off + delta); rv = ipmi_fru_area_set_offset(fru, i, off + delta); if (rv) { err("could not chang offset"); return 1; } } rv = ipmi_fru_area_set_length(fru, my_a_type, my_len + delta); dbg("change size of area %d from %u to %u. res = %d", my_a_type, my_len, my_len + delta, rv); return rv; } static SaErrorT modify_custom_field(SaHpiIdrFieldT *field, ipmi_entity_t *ent, struct ohoi_resource_info *ohoi_res_info) { SaHpiEntryIdT areaid = field->AreaId; SaHpiEntryIdT fieldid = field->FieldId; SaHpiTextBufferT *tb = &field->Field; SaHpiIdrAreaTypeT a_type; enum ipmi_str_type_e type; unsigned char lang = 0; unsigned int ipmi_a_type = IPMI_FRU_FTR_NUMBER; unsigned int cn; SaErrorT ret = SA_OK; int rv; ipmi_fru_t *fru; struct ohoi_area_data *area_data; int (* set_func)(ipmi_fru_t *fru, unsigned int num, enum ipmi_str_type_e type, char *str, unsigned int len) = NULL; int (* len_func)(ipmi_fru_t *fru, unsigned int num, unsigned int *length) = NULL; fru = ipmi_entity_get_fru(ent); if (fru == NULL) { err("Bug: resource without fru"); return SA_ERR_HPI_INTERNAL_ERROR; } area_data = &areas[areaid - 1]; a_type = area_data->areatype; switch (a_type) { case SAHPI_IDR_AREATYPE_CHASSIS_INFO : ipmi_a_type = IPMI_FRU_FTR_CHASSIS_INFO_AREA; len_func = ipmi_fru_get_chassis_info_custom_len; set_func = ipmi_fru_set_chassis_info_custom; cn = fieldid - OHOI_FIELD_LAST_ID(area_data) - 1; break; case SAHPI_IDR_AREATYPE_BOARD_INFO : ipmi_a_type = IPMI_FRU_FTR_BOARD_INFO_AREA; len_func = ipmi_fru_get_board_info_custom_len; set_func = ipmi_fru_set_board_info_custom; cn = fieldid - OHOI_FIELD_LAST_ID(area_data) - 1; break; case SAHPI_IDR_AREATYPE_PRODUCT_INFO : ipmi_a_type = IPMI_FRU_FTR_PRODUCT_INFO_AREA; len_func = ipmi_fru_get_product_info_custom_len; set_func = ipmi_fru_set_product_info_custom; cn = fieldid - OHOI_FIELD_LAST_ID(area_data) - 1; break; default : err("area 0x%x doesn't permit custom fields", a_type); return SA_ERR_HPI_INVALID_DATA; } if (set_func != NULL) { ret = get_str_type(tb, lang, &type); if (ret != SA_OK) { err("Unknown lang type"); goto out; } rv = set_func(fru, cn, type, (char *)tb->Data, (unsigned int)tb->DataLength); dbg("custom field %d len set = %d; rv = %d", cn, tb->DataLength, rv); if (rv == ENOSPC) { // try to increase the room for area moving other areas int r; unsigned int f_len; //print_fru_layout(fru); r = len_func(fru, cn, &f_len); dbg("rv = %d; f_len = %u; new_len = %u", rv, f_len, tb->DataLength); if ((r == 0) && (f_len < (unsigned int)tb->DataLength) && (try_to_change_area_size(fru, (unsigned int)tb->DataLength - f_len, ipmi_a_type) == 0)) { //print_fru_layout(fru); rv = set_func(fru, cn, type, (char *)tb->Data, (unsigned int)tb->DataLength); dbg("custom field %d len set = %d", cn, tb->DataLength); } } if (rv) { err("Could not set FRU field %d of area %d. rv = %d\n", fieldid, areaid, rv); if (rv == ENOSPC) { ret = SA_ERR_HPI_OUT_OF_SPACE; } else { err("set_func for %x/SAHPI_IDR_FIELDTYPE_CUSTOM" " returned error = %d", a_type, rv); ret = SA_ERR_HPI_INVALID_DATA; } } } out: return ret; } static SaErrorT modify_inventory(SaHpiIdrFieldT *field, ipmi_entity_t *ent, struct ohoi_resource_info *ohoi_res_info) { struct ohoi_inventory_info *i_info = ohoi_res_info->fru; SaHpiEntryIdT areaid = field->AreaId; SaHpiEntryIdT fieldid = field->FieldId; SaHpiTextBufferT *tb = &field->Field; SaHpiIdrFieldTypeT f_type; SaHpiIdrAreaTypeT a_type; struct ohoi_area_data *area_data; enum ipmi_str_type_e type; unsigned char lang = 0; unsigned int ipmi_a_type = IPMI_FRU_FTR_NUMBER; SaErrorT ret = SA_OK; ipmi_fru_t *fru; int rv = 0; int (* set_func)(ipmi_fru_t *fru, enum ipmi_str_type_e type, char *str, unsigned int len) = NULL; int (* len_func)(ipmi_fru_t *fru, unsigned int *length) = NULL; if (areaid < 1) { err("areaid(%d) < 1", areaid); return SA_ERR_HPI_NOT_PRESENT; } if (areaid > OHOI_AREA_LAST_ID(i_info)) { err("areaid(%d) >= (%d)", areaid, FIRST_OEM_AREA_NUM + i_info->oem); return SA_ERR_HPI_NOT_PRESENT; } if (i_info->oem_areas && areaid >= FIRST_OEM_AREA_NUM) { return SA_ERR_HPI_READ_ONLY; } area_data = &areas[areaid - 1]; a_type = area_data->areatype; if (fieldid > OHOI_FIELD_LAST_ID(area_data)) { if (field->Type == SAHPI_IDR_FIELDTYPE_CUSTOM) { return modify_custom_field(field, ent, ohoi_res_info); } err("fieldid(%d) >= OHOI_FIELD_LAST_ID(area_data)(%d)", fieldid, OHOI_FIELD_LAST_ID(area_data)); return SA_ERR_HPI_NOT_PRESENT; } f_type = area_data->fields[fieldid - 1].fieldtype; dbg("modify_inventory: area = 0x%x; fieldtype = %i", a_type, f_type); if (i_info == NULL) { err("Bug: ohoi_res_info->fru == NULL"); return SA_ERR_HPI_CAPABILITY; } fru = ipmi_entity_get_fru(ent); if (fru == NULL) { err("Bug: resource without fru"); return SA_ERR_HPI_INTERNAL_ERROR; } switch (a_type) { case SAHPI_IDR_AREATYPE_INTERNAL_USE: return SA_ERR_HPI_READ_ONLY; case SAHPI_IDR_AREATYPE_CHASSIS_INFO: if (i_info->ci == 0) { err("CHASSIS_INFO area not present"); ret = SA_ERR_HPI_NOT_PRESENT; goto out; } ipmi_a_type = IPMI_FRU_FTR_CHASSIS_INFO_AREA; switch (f_type) { case SAHPI_IDR_FIELDTYPE_CHASSIS_TYPE: if ((tb->DataType != SAHPI_TL_TYPE_BINARY) || ((tb->DataLength != 1) && (tb->DataLength != 0))) { err("CHASSIS_TYPE: DataType = %d; " "DataLength = %d", tb->DataType, tb->DataLength); return SA_ERR_HPI_INVALID_DATA; } rv = ipmi_fru_set_chassis_info_type(fru, *(unsigned char *)tb->Data); break; case SAHPI_IDR_FIELDTYPE_PART_NUMBER: lang = 0; set_func = ipmi_fru_set_chassis_info_part_number; len_func = ipmi_fru_get_chassis_info_part_number_len; break; case SAHPI_IDR_FIELDTYPE_SERIAL_NUMBER: lang = SAHPI_LANG_ENGLISH; set_func = ipmi_fru_set_chassis_info_serial_number; len_func = ipmi_fru_get_chassis_info_serial_number_len; break; default: err("CHASSIS_INFO: field %d not present", fieldid); ret = SA_ERR_HPI_NOT_PRESENT; goto out; } break; case SAHPI_IDR_AREATYPE_BOARD_INFO: if (i_info->bi == 0) { err("BOARD_INFO area not present"); return SA_ERR_HPI_NOT_PRESENT; } ipmi_a_type = IPMI_FRU_FTR_BOARD_INFO_AREA; lang = i_info->bi; switch (f_type) { case SAHPI_IDR_FIELDTYPE_MFG_DATETIME: if ((tb->DataType != SAHPI_TL_TYPE_BINARY) || ((tb->DataLength != sizeof(time_t)) && (tb->DataLength != 0))) { err("BOARD_INFO/MFG_DATETIME: DataType = %d; " "DataLength = %d", tb->DataType, tb->DataLength); return SA_ERR_HPI_INVALID_DATA; } if (tb->DataLength == 0) { rv = ipmi_fru_set_board_info_mfg_time(fru, 0); } else { rv = ipmi_fru_set_board_info_mfg_time(fru, *(time_t *)tb->Data); } break; case SAHPI_IDR_FIELDTYPE_MANUFACTURER: set_func = ipmi_fru_set_board_info_board_manufacturer; len_func = ipmi_fru_get_board_info_board_manufacturer_len; break; case SAHPI_IDR_FIELDTYPE_PRODUCT_NAME: set_func = ipmi_fru_set_board_info_board_product_name; len_func = ipmi_fru_get_board_info_board_product_name_len; break; case SAHPI_IDR_FIELDTYPE_PART_NUMBER: set_func = ipmi_fru_set_board_info_board_part_number; len_func = ipmi_fru_get_board_info_board_part_number_len; break; case SAHPI_IDR_FIELDTYPE_SERIAL_NUMBER: lang = SAHPI_LANG_ENGLISH; set_func = ipmi_fru_set_board_info_board_serial_number; len_func = ipmi_fru_get_board_info_board_serial_number_len; break; case SAHPI_IDR_FIELDTYPE_FILE_ID: lang = SAHPI_LANG_ENGLISH; set_func = ipmi_fru_set_board_info_fru_file_id; len_func = ipmi_fru_get_board_info_fru_file_id_len; break; default: err("BOARD_INFO: field %d not present", fieldid); ret = SA_ERR_HPI_NOT_PRESENT; goto out; } break; case SAHPI_IDR_AREATYPE_PRODUCT_INFO: if (i_info->pi == 0) { err("PRODUCT_INFO area not present"); return SA_ERR_HPI_NOT_PRESENT; } ipmi_a_type = IPMI_FRU_FTR_PRODUCT_INFO_AREA; lang = i_info->pi; switch (f_type) { case SAHPI_IDR_FIELDTYPE_MANUFACTURER: set_func = ipmi_fru_set_product_info_manufacturer_name; len_func = ipmi_fru_get_product_info_manufacturer_name_len; break; case SAHPI_IDR_FIELDTYPE_PRODUCT_NAME: set_func = ipmi_fru_set_product_info_product_name; len_func = ipmi_fru_get_product_info_product_name_len; break; case SAHPI_IDR_FIELDTYPE_PART_NUMBER: set_func = ipmi_fru_set_product_info_product_part_model_number; len_func = ipmi_fru_get_product_info_product_part_model_number_len; break; case SAHPI_IDR_FIELDTYPE_PRODUCT_VERSION: set_func = ipmi_fru_set_product_info_product_version; len_func = ipmi_fru_get_product_info_product_version_len; break; case SAHPI_IDR_FIELDTYPE_SERIAL_NUMBER: lang = SAHPI_LANG_ENGLISH; set_func = ipmi_fru_set_product_info_product_serial_number; len_func = ipmi_fru_get_product_info_product_serial_number_len; break; case SAHPI_IDR_FIELDTYPE_ASSET_TAG: set_func = ipmi_fru_set_product_info_asset_tag; len_func = ipmi_fru_get_product_info_asset_tag_len; break; case SAHPI_IDR_FIELDTYPE_FILE_ID: set_func = ipmi_fru_set_product_info_fru_file_id; len_func = ipmi_fru_get_product_info_fru_file_id_len; break; default: err("PRODUCT_INFO: field %d not present", fieldid); ret = SA_ERR_HPI_NOT_PRESENT; goto out; } break; case SAHPI_IDR_AREATYPE_OEM : return SA_ERR_HPI_UNSUPPORTED_API; default: err("Unknown area type = 0x%x", a_type); ret = SA_ERR_HPI_INVALID_PARAMS; goto out; } if (set_func != NULL) { ret = get_str_type(tb, lang, &type); if (ret != SA_OK) { goto out; } rv = set_func(fru, type, (char *)tb->Data, (unsigned int)tb->DataLength); if (rv == ENOSPC) { // try to increase the room for area moving other areas int r; unsigned int f_len; //print_fru_layout(fru); r = len_func(fru, &f_len); dbg("rv = %d; f_len = %u; new_len = %u", rv, f_len, tb->DataLength); if ((r == 0) && (f_len < (unsigned int)tb->DataLength) && (try_to_change_area_size(fru, (unsigned int)tb->DataLength - f_len, ipmi_a_type) == 0)) { //print_fru_layout(fru); rv = set_func(fru, type, (char *)tb->Data, (unsigned int)tb->DataLength); } } if (rv) { err("Could not set FRU field %d of area %d. rv = %d\n", fieldid, areaid, rv); if (rv == ENOSPC) { ret = SA_ERR_HPI_OUT_OF_SPACE; } else { err("set_func for %x/%d returned error = %d", a_type, f_type, rv); ret = SA_ERR_HPI_INVALID_DATA; } } } out: return ret; } static void ipmi_fru_write_done_cb(ipmi_domain_t *domain, ipmi_fru_t *fru, int err, void *cb_data) { struct ohoi_fru_write_s *info = cb_data; if (err) { err("err = %d", err); OHOI_MAP_ERROR(info->rv, err); } info->done = 1; } static void ipmi_fru_write_cb(ipmi_entity_t *entity, void *cb_data) { int rv; struct ohoi_fru_write_s *info = cb_data; rv = ipmi_fru_write(ipmi_entity_get_fru(entity), ipmi_fru_write_done_cb, cb_data); if (rv != 0) { err("ipmi_fru_write = 0x%x", rv); info->rv = SA_ERR_HPI_INTERNAL_ERROR; info->done = 1; } } SaErrorT ohoi_fru_write(struct ohoi_handler *ipmi_handler, ipmi_entity_id_t entid) { struct ohoi_fru_write_s info; SaErrorT rv; if (!ipmi_handler->real_write_fru) { err("No real FRU write. Real FRU write isn't set"); return SA_OK; } info.done = 0; info.rv = 0; rv = ipmi_entity_pointer_cb(entid, ipmi_fru_write_cb, &info); if (rv) { err("ipmi_entity_pointer_cb = %d", rv); return SA_ERR_HPI_INTERNAL_ERROR; } rv = ohoi_loop(&info.done, ipmi_handler); if (rv != SA_OK) { return rv; } return info.rv; } void * oh_get_idr_info (void *hnd, SaHpiResourceIdT, SaHpiIdrIdT,SaHpiIdrInfoT) __attribute__ ((weak, alias("ohoi_get_idr_info"))); void * oh_get_idr_area_header (void *, SaHpiResourceIdT, SaHpiIdrIdT, SaHpiIdrAreaTypeT, SaHpiEntryIdT, SaHpiEntryIdT, SaHpiIdrAreaHeaderT) __attribute__ ((weak, alias("ohoi_get_idr_area_header"))); void * oh_add_idr_area (void *, SaHpiResourceIdT, SaHpiIdrIdT, SaHpiIdrAreaTypeT, SaHpiEntryIdT) __attribute__ ((weak, alias("ohoi_add_idr_area"))); void * oh_del_idr_area (void *, SaHpiResourceIdT, SaHpiIdrIdT, SaHpiEntryIdT) __attribute__ ((weak, alias("ohoi_del_idr_area"))); void * oh_get_idr_field (void *, SaHpiResourceIdT, SaHpiIdrIdT, SaHpiEntryIdT, SaHpiIdrFieldTypeT, SaHpiEntryIdT, SaHpiEntryIdT, SaHpiIdrFieldT) __attribute__ ((weak, alias("ohoi_get_idr_field"))); void * oh_add_idr_field (void *, SaHpiResourceIdT, SaHpiIdrIdT, SaHpiIdrFieldT) __attribute__ ((weak, alias("ohoi_add_idr_field"))); void * oh_set_idr_field (void *, SaHpiResourceIdT, SaHpiIdrIdT, SaHpiIdrFieldT) __attribute__ ((weak, alias("ohoi_set_idr_field"))); void * oh_del_idr_field (void *, SaHpiResourceIdT, SaHpiIdrIdT, SaHpiEntryIdT, SaHpiEntryIdT) __attribute__ ((weak, alias("ohoi_del_idr_field"))); openhpi-2.14.1/plugins/ipmi/ipmi_sensor.c0000644000076400007640000010725611302567001015311 0ustar /* -*- linux-c -*- * * Copyright (c) 2003 by Intel Corp. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Louis Zhuang * Kevin Gao * Rusty Lynch * Racing Guo */ #include "ipmi.h" #define OHOI_TIMEOUT 10 /* 10 seconds, was 5 seconds */ struct ipmi_event_state_s { unsigned int status; /* Pay no attention to the implementation. */ unsigned int __assertion_events; unsigned int __deassertion_events; }; /* * Use for getting sensor reading */ struct ohoi_sensor_reading { SaHpiSensorReadingT reading; SaHpiEventStateT ev_state; int done; int rvalue; }; /* * Use for getting/setting sensor threadholds */ struct ohoi_sensor_thresholds { SaHpiSensorThresholdsT sensor_thres; ipmi_thresholds_t *thrhlds; int thres_done; int hyster_done; int rvalue; }; /* * Use for sensor event enable and sensor event masks */ struct ohoi_sensor_event_enable_masks { SaHpiBoolT enable; SaHpiEventStateT assert; SaHpiEventStateT deassert; unsigned int a_support; unsigned int d_support; ipmi_event_state_t *states; int done; int rvalue; }; static int ignore_sensor(ipmi_sensor_t *sensor) { ipmi_entity_t *ent; if (ipmi_sensor_get_ignore_if_no_entity(sensor)) { err("ignore if no entity"); return 0; } ent = ipmi_sensor_get_entity(sensor); if (ent == NULL) { err("ipmi_sensor_get_entity = NULL"); return 1; } if (!ipmi_entity_is_present(ent)) { err("!ipmi_entity_is_present. (%d,%d,%d,%d) %s", ipmi_entity_get_entity_id(ent), ipmi_entity_get_entity_instance(ent), ipmi_entity_get_device_channel(ent), ipmi_entity_get_device_address(ent), ipmi_entity_get_entity_id_string(ent)); return 0; } return 0; } /* GET SENSOR READING */ static SaHpiEventStateT retrieve_states(ipmi_states_t *states) { SaHpiEventStateT st = 0; int i; // fortunatly as discrete as threshold sensors IPMI states // is mapped 1:1 to HPI states for (i = 0; i < 15; i++) { if (ipmi_is_state_set(states, i)) { st |= (1 << i); } } return st; } static void sensor_read_states(ipmi_sensor_t *sensor, int err, ipmi_states_t *states, void *cb_data) { struct ohoi_sensor_reading *p = cb_data; p->done = 1; if (err) { err("sensor reading state error"); p->rvalue = SA_ERR_HPI_INTERNAL_ERROR; return; } p->reading.IsSupported = SAHPI_FALSE; p->ev_state = retrieve_states(states); } static void sensor_reading(ipmi_sensor_t *sensor, int err, enum ipmi_value_present_e value_present, unsigned int raw_val, double val, ipmi_states_t *states, void *cb_data) { struct ohoi_sensor_reading *p = cb_data; p->done = 1; if (err) { OHOI_MAP_ERROR(p->rvalue, err); err("sensor reading error"); p->rvalue = SA_ERR_HPI_INTERNAL_ERROR; return; } p->reading.IsSupported = SAHPI_FALSE; if (value_present == IPMI_BOTH_VALUES_PRESENT) { p->reading.IsSupported = SAHPI_TRUE; p->reading.Type = SAHPI_SENSOR_READING_TYPE_FLOAT64; p->reading.Value.SensorFloat64 = val; } else if(value_present == IPMI_RAW_VALUE_PRESENT) { p->reading.IsSupported = SAHPI_TRUE; p->reading.Type = SAHPI_SENSOR_READING_TYPE_FLOAT64; p->reading.Value.SensorFloat64 = raw_val; } else { err("value present = 0x%x", value_present); } // always returns 1 in 7th bit. Ignore extra 1 p->ev_state = retrieve_states(states) & (SAHPI_ES_LOWER_MINOR | SAHPI_ES_LOWER_MAJOR | SAHPI_ES_LOWER_CRIT | SAHPI_ES_UPPER_MINOR | SAHPI_ES_UPPER_MAJOR | SAHPI_ES_UPPER_CRIT); } static void get_sensor_reading(ipmi_sensor_t *sensor, void *cb_data) { struct ohoi_sensor_reading *reading_data; int rv; reading_data = cb_data; if (ignore_sensor(sensor)) { reading_data->done = 1; reading_data->rvalue = SA_ERR_HPI_NOT_PRESENT; err("Sensor is not present, ignored"); return; } if (ipmi_sensor_get_event_reading_type(sensor) == IPMI_EVENT_READING_TYPE_THRESHOLD) { rv = ipmi_sensor_get_reading(sensor, sensor_reading, reading_data); if (rv) { reading_data->done = 1; reading_data->rvalue = SA_ERR_HPI_INVALID_REQUEST; err("Unable to get sensor reading: 0x%x", rv); } return; } rv = ipmi_sensor_get_states(sensor, sensor_read_states, reading_data); if (rv) { reading_data->done = 1; reading_data->rvalue = SA_ERR_HPI_INVALID_REQUEST; err("Unable to get sensor reading states: 0x%x", rv); } } SaErrorT orig_get_sensor_reading(struct oh_handler_state *handler, struct ohoi_sensor_info *sensor_info, SaHpiSensorReadingT *reading, SaHpiEventStateT *ev_state) { struct ohoi_handler *ipmi_handler = (struct ohoi_handler *)(handler->data); struct ohoi_sensor_reading reading_data; int rv; ipmi_sensor_id_t sensor_id; sensor_id = sensor_info->info.orig_sensor_info.sensor_id; memset(&reading_data, 0, sizeof(reading_data)); rv = ipmi_sensor_pointer_cb(sensor_id, get_sensor_reading, &reading_data); if (rv) { err("Unable to convert sensor_id to pointer"); return SA_ERR_HPI_INVALID_CMD; } rv = ohoi_loop(&reading_data.done, ipmi_handler); if (rv) return rv; if (reading_data.rvalue) return reading_data.rvalue; *reading = reading_data.reading; *ev_state = reading_data.ev_state & 0x7fff; return SA_OK; } SaErrorT ohoi_get_sensor_reading(void *hnd, struct ohoi_sensor_info *sensor_info, SaHpiSensorReadingT *reading, SaHpiEventStateT *ev_state) { struct oh_handler_state *handler = (struct oh_handler_state *)hnd; if (sensor_info->ohoii.get_sensor_reading == NULL) { return SA_ERR_HPI_INVALID_CMD; } return sensor_info->ohoii.get_sensor_reading(handler, sensor_info, reading, ev_state); } /* GET SENSOR THRESHOLDS */ static void thres_get(ipmi_sensor_t *sensor, ipmi_thresholds_t *th, unsigned int event, SaHpiSensorReadingT *thres) { int val; ipmi_sensor_threshold_readable(sensor, event, &val); if (!val) { thres->IsSupported = SAHPI_FALSE; return; } if (0 == ipmi_threshold_get(th, event, &thres->Value.SensorFloat64)) { thres->IsSupported = SAHPI_TRUE; thres->Type = SAHPI_SENSOR_READING_TYPE_FLOAT64; }else { thres->IsSupported = SAHPI_FALSE; } } static void thresholds_read(ipmi_sensor_t *sensor, int err, ipmi_thresholds_t *th, void *cb_data) { struct ohoi_sensor_thresholds *p = cb_data; if (err) { OHOI_MAP_ERROR(p->rvalue, err); p->thres_done = 1; err("sensor thresholds reading error"); return; } thres_get(sensor, th, IPMI_LOWER_NON_CRITICAL, &p->sensor_thres.LowMinor); thres_get(sensor, th, IPMI_LOWER_CRITICAL, &p->sensor_thres.LowMajor); thres_get(sensor, th, IPMI_LOWER_NON_RECOVERABLE, &p->sensor_thres.LowCritical); thres_get(sensor, th, IPMI_UPPER_NON_CRITICAL, &p->sensor_thres.UpMinor); thres_get(sensor, th, IPMI_UPPER_CRITICAL, &p->sensor_thres.UpMajor); thres_get(sensor, th, IPMI_UPPER_NON_RECOVERABLE, &p->sensor_thres.UpCritical); p->thres_done = 1; } static SaErrorT get_thresholds(ipmi_sensor_t *sensor, struct ohoi_sensor_thresholds *thres_data) { int rv; rv = ipmi_sensor_get_thresholds(sensor, thresholds_read, thres_data); if (rv) err("Unable to get sensor thresholds: 0x%x\n", rv); return (rv? SA_ERR_HPI_INVALID_CMD : SA_OK); } static void hysteresis_read(ipmi_sensor_t *sensor, int err, unsigned int positive_hysteresis, unsigned int negative_hysteresis, void *cb_data) { struct ohoi_sensor_thresholds *p = cb_data; if (err) { p->rvalue = SA_ERR_HPI_INTERNAL_ERROR; p->hyster_done = 1; err("sensor hysteresis reading error"); return; } p->sensor_thres.PosThdHysteresis.IsSupported = SAHPI_TRUE; p->sensor_thres.PosThdHysteresis.Type = SAHPI_SENSOR_READING_TYPE_FLOAT64; p->sensor_thres.PosThdHysteresis.Value.SensorFloat64 = positive_hysteresis; p->sensor_thres.NegThdHysteresis.IsSupported = SAHPI_TRUE; p->sensor_thres.NegThdHysteresis.Type = SAHPI_SENSOR_READING_TYPE_FLOAT64; p->sensor_thres.NegThdHysteresis.Value.SensorFloat64 = negative_hysteresis; p->hyster_done = 1; } static SaErrorT get_hysteresis(ipmi_sensor_t *sensor, struct ohoi_sensor_thresholds *thres_data) { int rv; rv = ipmi_sensor_get_hysteresis(sensor, hysteresis_read, thres_data); if (rv) err("Unable to get sensor hysteresis: 0x%x\n", rv); return (rv? SA_ERR_HPI_INVALID_CMD : SA_OK); } static void get_sensor_thresholds(ipmi_sensor_t *sensor, void *cb_data) { struct ohoi_sensor_thresholds *thres_data; int rv; thres_data = cb_data; if (ignore_sensor(sensor)) { thres_data->hyster_done = 1; thres_data->thres_done = 1; thres_data->rvalue = SA_ERR_HPI_NOT_PRESENT; err("ENTITY_NOT_PRESENT"); return; } if (ipmi_sensor_get_event_reading_type(sensor) != IPMI_EVENT_READING_TYPE_THRESHOLD) { err("Not threshold sensor!"); thres_data->hyster_done = 1; thres_data->thres_done = 1; thres_data->rvalue = SA_ERR_HPI_INVALID_CMD; return; } if (ipmi_sensor_get_threshold_access(sensor) == IPMI_THRESHOLD_ACCESS_SUPPORT_NONE) { err("sensor doesn't support threshold read"); err("Unable to get sensor thresholds"); thres_data->hyster_done = 1; thres_data->thres_done = 1; thres_data->rvalue = SA_ERR_HPI_INVALID_CMD; return; } rv = get_thresholds(sensor, thres_data); if (rv != SA_OK) { err("Unable to get sensor thresholds"); thres_data->hyster_done = 1; thres_data->thres_done = 1; thres_data->rvalue = rv; return; } rv = ipmi_sensor_get_hysteresis_support(sensor); if (rv != IPMI_HYSTERESIS_SUPPORT_READABLE && rv != IPMI_HYSTERESIS_SUPPORT_SETTABLE) { // thres_data->thres_done = 1; thres_data->hyster_done = 1; thres_data->sensor_thres.PosThdHysteresis.IsSupported = SAHPI_FALSE; thres_data->sensor_thres.NegThdHysteresis.IsSupported = SAHPI_FALSE; return; } rv = get_hysteresis(sensor, thres_data); if (rv != SA_OK) { err("failed to get hysteresis"); thres_data->hyster_done = 1; // thres_data->thres_done = 1; thres_data->rvalue = SA_ERR_HPI_INTERNAL_ERROR; return; } return; } static int is_get_sensor_thresholds_done(const void *cb_data) { const struct ohoi_sensor_thresholds *thres_data; thres_data = cb_data; /* Can we check the validity of this pointer here to avoid SegFault? */ return (thres_data->thres_done && thres_data->hyster_done); } SaErrorT orig_get_sensor_thresholds(struct oh_handler_state *handler, struct ohoi_sensor_info *sensor_info, SaHpiSensorThresholdsT *thres) { struct ohoi_handler *ipmi_handler = (struct ohoi_handler *)(handler->data); struct ohoi_sensor_thresholds thres_data; int rv; ipmi_sensor_id_t sensor_id; sensor_id = sensor_info->info.orig_sensor_info.sensor_id; memset(&thres_data, 0, sizeof(thres_data)); rv = ipmi_sensor_pointer_cb(sensor_id, get_sensor_thresholds, &thres_data); if (rv) { err("Unable to convert sensor id into pointer"); return SA_ERR_HPI_INVALID_CMD; } rv = ohoi_loop_until(is_get_sensor_thresholds_done, &thres_data, OHOI_TIMEOUT, ipmi_handler); if (rv) return rv; if (thres_data.rvalue) return thres_data.rvalue; if (thres) *thres = thres_data.sensor_thres; return SA_OK; } SaErrorT ohoi_get_sensor_thresholds(void *hnd, struct ohoi_sensor_info *sensor_info, SaHpiSensorThresholdsT *thres) { struct oh_handler_state *handler = (struct oh_handler_state *)hnd; if (sensor_info->ohoii.get_sensor_thresholds == NULL) { return SA_ERR_HPI_INVALID_CMD; } return sensor_info->ohoii.get_sensor_thresholds(handler, sensor_info, thres); } /* SET SENSOR THRESHOLDS */ static void thres_set_data(ipmi_sensor_t *sensor, int err, void *cb_data) { struct ohoi_sensor_thresholds *info = cb_data; if (err) { err("err = 0x%x", err); if (info->rvalue == SA_OK) { OHOI_MAP_ERROR(info->rvalue, err); } } info->thres_done = 1; } static void hys_set_data(ipmi_sensor_t *sensor, int err, void *cb_data) { struct ohoi_sensor_thresholds *info = cb_data; if (err) { err("err = 0x%x", err); if (info->rvalue == SA_OK) { OHOI_MAP_ERROR(info->rvalue, err); } } info->hyster_done = 1; } static SaErrorT thres_cpy(ipmi_sensor_t *sensor, const SaHpiSensorReadingT reading, unsigned int event, ipmi_thresholds_t *info) { int val; int rv; if (!reading.IsSupported) { return SA_OK; } if ((rv = ipmi_sensor_threshold_settable(sensor, event, &val))) { err("ipmi_sensor_threshold_settable error = %d", rv); return SA_ERR_HPI_INVALID_CMD; } if (!val) { err("ipmi threshold 0x%x isn't settable", event); return SA_ERR_HPI_INVALID_DATA; } switch (reading.Type) { /*Fix Me* case...*/ case SAHPI_SENSOR_READING_TYPE_INT64: case SAHPI_SENSOR_READING_TYPE_UINT64: case SAHPI_SENSOR_READING_TYPE_BUFFER: break; case SAHPI_SENSOR_READING_TYPE_FLOAT64: if(ipmi_threshold_set(info, sensor, event, reading.Value.SensorFloat64)) { return SA_OK; } break; } return SA_OK; } static SaErrorT init_thresholeds_info( ipmi_sensor_t *sensor, const SaHpiSensorThresholdsT *thres, ipmi_thresholds_t *info) { SaErrorT rv; if (ipmi_thresholds_init(info)) { return SA_ERR_HPI_INTERNAL_ERROR; } rv = thres_cpy(sensor, thres->LowMinor, IPMI_LOWER_NON_CRITICAL, info); if (rv != SA_OK) return rv; rv = thres_cpy(sensor, thres->LowMajor, IPMI_LOWER_CRITICAL, info); if (rv != SA_OK) return rv; rv = thres_cpy(sensor, thres->LowCritical, IPMI_LOWER_NON_RECOVERABLE, info); if (rv != SA_OK) return rv; rv = thres_cpy(sensor, thres->UpMinor, IPMI_UPPER_NON_CRITICAL, info); if (rv != SA_OK) return rv; rv = thres_cpy(sensor, thres->UpMajor, IPMI_UPPER_CRITICAL, info); if (rv != SA_OK) return rv; rv = thres_cpy(sensor, thres->UpCritical, IPMI_UPPER_NON_RECOVERABLE, info); if (rv != SA_OK) return rv; return SA_OK; } static SaErrorT set_thresholds(ipmi_sensor_t *sensor, struct ohoi_sensor_thresholds *thres_data) { ipmi_thresholds_t *info = thres_data->thrhlds; int rv; rv = init_thresholeds_info(sensor, &thres_data->sensor_thres, info); if (rv != SA_OK) { err("Unable to init sensor thresholds: 0x%x\n", rv); return rv; } rv = ipmi_sensor_set_thresholds(sensor, info, thres_set_data, thres_data); if (rv) { err("Unable to set sensor thresholds: 0x%x\n", rv); return SA_ERR_HPI_INTERNAL_ERROR; } return SA_OK; } static SaErrorT set_hysteresis(ipmi_sensor_t *sensor, struct ohoi_sensor_thresholds *thres_data) { int rv; unsigned int pos = 0, neg = 0; SaHpiSensorReadingT pos_reading = thres_data->sensor_thres.PosThdHysteresis; SaHpiSensorReadingT neg_reading = thres_data->sensor_thres.NegThdHysteresis; switch (pos_reading.Type) { case SAHPI_SENSOR_READING_TYPE_INT64: pos = pos_reading.Value.SensorInt64; break; case SAHPI_SENSOR_READING_TYPE_UINT64: pos = pos_reading.Value.SensorUint64; break; case SAHPI_SENSOR_READING_TYPE_FLOAT64: pos = pos_reading.Value.SensorFloat64; break; case SAHPI_SENSOR_READING_TYPE_BUFFER: err("ipmi sensor doesn't support this type of reading"); return SA_ERR_HPI_INVALID_DATA; } switch (neg_reading.Type) { case SAHPI_SENSOR_READING_TYPE_INT64: neg = neg_reading.Value.SensorInt64; break; case SAHPI_SENSOR_READING_TYPE_UINT64: neg = neg_reading.Value.SensorUint64; break; case SAHPI_SENSOR_READING_TYPE_FLOAT64: neg = neg_reading.Value.SensorFloat64; break; case SAHPI_SENSOR_READING_TYPE_BUFFER: err("ipmi sensor doesn't support this type of reading"); return SA_ERR_HPI_INVALID_DATA; } rv = ipmi_sensor_set_hysteresis(sensor, pos, neg, hys_set_data, thres_data); if (rv) { err("Unable to set sensor hysteresis: 0x%x\n", rv); return SA_ERR_HPI_INTERNAL_ERROR; } return SA_OK; } static void set_sensor_thresholds(ipmi_sensor_t *sensor, void *cb_data) { struct ohoi_sensor_thresholds *thres_data; SaErrorT rv; thres_data = cb_data; if (ignore_sensor(sensor)) { err("sensor is ignored"); thres_data->hyster_done = 1; thres_data->thres_done = 1; thres_data->rvalue = SA_ERR_HPI_NOT_PRESENT; return; } if (ipmi_sensor_get_event_reading_type(sensor) != IPMI_EVENT_READING_TYPE_THRESHOLD) { err("Not threshold sensor!"); thres_data->hyster_done = 1; thres_data->thres_done = 1; thres_data->rvalue = SA_ERR_HPI_INVALID_CMD; return; } if ((ipmi_sensor_get_threshold_access(sensor) != IPMI_THRESHOLD_ACCESS_SUPPORT_SETTABLE) || (ipmi_sensor_get_hysteresis_support(sensor) != IPMI_HYSTERESIS_SUPPORT_SETTABLE)) { err("sensor doesn't support threshold or histeresis set"); thres_data->hyster_done = 1; thres_data->thres_done = 1; thres_data->rvalue = SA_ERR_HPI_INVALID_CMD; return; } rv = set_thresholds(sensor, thres_data); if (rv != SA_OK) { err("Unable to set thresholds"); thres_data->hyster_done = 1; thres_data->thres_done = 1; thres_data->rvalue = rv; return; } rv = set_hysteresis(sensor, thres_data); if (rv != SA_OK) { thres_data->hyster_done = 1; thres_data->thres_done = 1; thres_data->rvalue = rv; err("Unable to set hysteresis"); return; } return; } SaErrorT orig_set_sensor_thresholds(struct oh_handler_state *handler, struct ohoi_sensor_info *sensor_info, const SaHpiSensorThresholdsT *thres) { struct ohoi_handler *ipmi_handler = (struct ohoi_handler *)(handler->data); struct ohoi_sensor_thresholds thres_data; int rv; ipmi_sensor_id_t sensor_id; sensor_id = sensor_info->info.orig_sensor_info.sensor_id; memset(&thres_data, 0, sizeof(thres_data)); thres_data.thrhlds = malloc(ipmi_thresholds_size()); if (thres_data.thrhlds == NULL) { err("could not alloc memory"); return SA_ERR_HPI_OUT_OF_MEMORY; } thres_data.sensor_thres = *thres; rv = ipmi_sensor_pointer_cb(sensor_id, set_sensor_thresholds, &thres_data); if (rv) { err("Unable to convert sensor_id to pointer"); free(thres_data.thrhlds); return SA_ERR_HPI_INVALID_CMD; } rv = ohoi_loop_until(is_get_sensor_thresholds_done, &thres_data, OHOI_TIMEOUT, ipmi_handler); free(thres_data.thrhlds); if (rv != SA_OK) { return rv; } if (thres_data.rvalue) { return thres_data.rvalue; } return SA_OK; } SaErrorT ohoi_set_sensor_thresholds(void *hnd, struct ohoi_sensor_info *sensor_info, const SaHpiSensorThresholdsT *thres) { struct oh_handler_state *handler = (struct oh_handler_state *)hnd; if (sensor_info->ohoii.set_sensor_thresholds == NULL) { return SA_ERR_HPI_INVALID_CMD; } return sensor_info->ohoii.set_sensor_thresholds(handler, sensor_info, thres); } /* SENSOR ENABLE */ static void set_sensor_enable(ipmi_sensor_t *sensor, void *cb_data) { // SaHpiBoolT *enable = cb_data; // ipmi_sensor_set_ignore_if_no_entity(sensor, *enable); return; } int ohoi_set_sensor_enable(ipmi_sensor_id_t sensor_id, SaHpiBoolT enable, void *cb_data) { SaErrorT rv; rv = ipmi_sensor_pointer_cb(sensor_id, set_sensor_enable, &enable); if (rv) { err("Unable to convert sensor_id to pointer"); return SA_ERR_HPI_INVALID_CMD; } return SA_OK; } /* SENSOR EVENT ENABLE MASK */ static void convert_to_ohoi_event_states(ipmi_sensor_t *sensor, ipmi_event_state_t *state, SaHpiEventStateT *assert, SaHpiEventStateT *deassert) { int i; *assert = 0; *deassert = 0; if(ipmi_sensor_get_event_reading_type(sensor) != IPMI_EVENT_READING_TYPE_THRESHOLD) { for (i = 0; i < 15; i++) { if (ipmi_is_discrete_event_set(state, i, IPMI_ASSERTION)) { *assert |= (1 << i); } if (ipmi_is_discrete_event_set(state, i, IPMI_DEASSERTION)) { *deassert |= (1 << i); } } return; } // threshold sensor if (ipmi_is_threshold_event_set(state, IPMI_LOWER_NON_CRITICAL, IPMI_GOING_LOW, IPMI_ASSERTION)) { *assert |= SAHPI_ES_LOWER_MINOR; } if (ipmi_is_threshold_event_set(state, IPMI_LOWER_NON_CRITICAL, IPMI_GOING_HIGH, IPMI_ASSERTION)) { *deassert |= SAHPI_ES_LOWER_MINOR; } if (ipmi_is_threshold_event_set(state, IPMI_LOWER_NON_CRITICAL, IPMI_GOING_LOW, IPMI_DEASSERTION)) { *deassert |= SAHPI_ES_LOWER_MINOR; } if (ipmi_is_threshold_event_set(state, IPMI_LOWER_NON_CRITICAL, IPMI_GOING_HIGH, IPMI_DEASSERTION)) { *assert |= SAHPI_ES_LOWER_MINOR; } if (ipmi_is_threshold_event_set(state, IPMI_LOWER_CRITICAL, IPMI_GOING_LOW, IPMI_ASSERTION)) { *assert |= SAHPI_ES_LOWER_MAJOR; } if (ipmi_is_threshold_event_set(state, IPMI_LOWER_CRITICAL, IPMI_GOING_HIGH, IPMI_ASSERTION)) { *deassert |= SAHPI_ES_LOWER_MAJOR; } if (ipmi_is_threshold_event_set(state, IPMI_LOWER_CRITICAL, IPMI_GOING_LOW, IPMI_DEASSERTION)) { *deassert |= SAHPI_ES_LOWER_MAJOR; } if (ipmi_is_threshold_event_set(state, IPMI_LOWER_CRITICAL, IPMI_GOING_HIGH, IPMI_DEASSERTION)) { *assert |= SAHPI_ES_LOWER_MAJOR; } if (ipmi_is_threshold_event_set(state, IPMI_LOWER_NON_RECOVERABLE, IPMI_GOING_LOW, IPMI_ASSERTION)) { *assert |= SAHPI_ES_LOWER_CRIT; } if (ipmi_is_threshold_event_set(state, IPMI_LOWER_NON_RECOVERABLE, IPMI_GOING_HIGH, IPMI_ASSERTION)) { *deassert |= SAHPI_ES_LOWER_CRIT; } if (ipmi_is_threshold_event_set(state, IPMI_LOWER_NON_RECOVERABLE, IPMI_GOING_LOW, IPMI_DEASSERTION)) { *deassert |= SAHPI_ES_LOWER_CRIT; } if (ipmi_is_threshold_event_set(state, IPMI_LOWER_NON_RECOVERABLE, IPMI_GOING_HIGH, IPMI_DEASSERTION)) { *assert |= SAHPI_ES_LOWER_CRIT; } if (ipmi_is_threshold_event_set(state, IPMI_UPPER_NON_CRITICAL, IPMI_GOING_LOW, IPMI_ASSERTION)) { *deassert |= SAHPI_ES_UPPER_MINOR; } if (ipmi_is_threshold_event_set(state, IPMI_UPPER_NON_CRITICAL, IPMI_GOING_HIGH, IPMI_ASSERTION)) { *assert |= SAHPI_ES_UPPER_MINOR; } if (ipmi_is_threshold_event_set(state, IPMI_UPPER_NON_CRITICAL, IPMI_GOING_LOW, IPMI_DEASSERTION)) { *assert |= SAHPI_ES_UPPER_MINOR; } if (ipmi_is_threshold_event_set(state, IPMI_UPPER_NON_CRITICAL, IPMI_GOING_HIGH, IPMI_DEASSERTION)) { *deassert |= SAHPI_ES_UPPER_MINOR; } if (ipmi_is_threshold_event_set(state, IPMI_UPPER_CRITICAL, IPMI_GOING_LOW, IPMI_ASSERTION)) { *deassert |= SAHPI_ES_UPPER_MAJOR; } if (ipmi_is_threshold_event_set(state, IPMI_UPPER_CRITICAL, IPMI_GOING_HIGH, IPMI_ASSERTION)) { *assert |= SAHPI_ES_UPPER_MAJOR; } if (ipmi_is_threshold_event_set(state, IPMI_UPPER_CRITICAL, IPMI_GOING_LOW, IPMI_DEASSERTION)) { *assert |= SAHPI_ES_UPPER_MAJOR; } if (ipmi_is_threshold_event_set(state, IPMI_UPPER_CRITICAL, IPMI_GOING_HIGH, IPMI_DEASSERTION)) { *deassert |= SAHPI_ES_UPPER_MAJOR; } if (ipmi_is_threshold_event_set(state, IPMI_UPPER_NON_RECOVERABLE, IPMI_GOING_LOW, IPMI_ASSERTION)) { *deassert |= SAHPI_ES_UPPER_CRIT; } if (ipmi_is_threshold_event_set(state, IPMI_UPPER_NON_RECOVERABLE, IPMI_GOING_HIGH, IPMI_ASSERTION)) { *assert |= SAHPI_ES_UPPER_CRIT; } if (ipmi_is_threshold_event_set(state, IPMI_UPPER_NON_RECOVERABLE, IPMI_GOING_LOW, IPMI_DEASSERTION)) { *assert |= SAHPI_ES_UPPER_CRIT; } if (ipmi_is_threshold_event_set(state, IPMI_UPPER_NON_RECOVERABLE, IPMI_GOING_HIGH, IPMI_DEASSERTION)) { *deassert |= SAHPI_ES_UPPER_CRIT; } } static void event_enable_masks_read(ipmi_sensor_t *sensor, int err, ipmi_event_state_t *state, void *cb_data) { struct ohoi_sensor_event_enable_masks *p = cb_data; int rv; p->done = 1; if (err) { err("Sensor event enable reading error 0x%x", err); OHOI_MAP_ERROR(p->rvalue, err); return; } p->enable = SAHPI_FALSE; rv = ipmi_event_state_get_events_enabled(state); if (rv) p->enable = SAHPI_TRUE; convert_to_ohoi_event_states(sensor, state, &p->assert, &p->deassert); } static void get_sensor_event_enable_masks(ipmi_sensor_t *sensor, void *cb_data) { struct ohoi_sensor_event_enable_masks *enable_data; int rv; enable_data = cb_data; if (ignore_sensor(sensor)) { err("sensor is ignored"); enable_data->done = 1; enable_data->rvalue = SA_ERR_HPI_NOT_PRESENT; return; } if ((ipmi_sensor_get_event_support(sensor) == IPMI_EVENT_SUPPORT_PER_STATE)|| (ipmi_sensor_get_event_support(sensor) == IPMI_EVENT_SUPPORT_ENTIRE_SENSOR)){ rv = ipmi_sensor_get_event_enables(sensor, event_enable_masks_read, enable_data); if (rv) { err("Unable to sensor event enable: 0x%x\n", rv); enable_data->rvalue = SA_ERR_HPI_INTERNAL_ERROR; return; } } else { err("Sensor do not support event"); enable_data->assert = 0; enable_data->deassert = 0; enable_data->enable = SAHPI_FALSE; enable_data->rvalue = SA_OK; enable_data->done = 1; } } static int insert_events_to_ipmi_event_state( ipmi_sensor_t *sensor, ipmi_event_state_t *state, SaHpiEventStateT a_mask, SaHpiEventStateT d_mask, unsigned int a_sup, unsigned int d_sup) { int i; if (ipmi_sensor_get_event_support(sensor) != IPMI_EVENT_SUPPORT_PER_STATE) { return 0; } if (ipmi_sensor_get_event_reading_type(sensor) != IPMI_EVENT_READING_TYPE_THRESHOLD) { // discrete sensor. map states 1:1 if ((a_mask &~a_sup) || (d_mask & ~d_sup)) { return 1; } for (i = 0; i < 15; i++) { if (a_mask & (1 << i)) { ipmi_discrete_event_set(state, i, IPMI_ASSERTION); } if (d_mask & (1 << i)) { ipmi_discrete_event_set(state, i, IPMI_DEASSERTION); } } return 0; } // threhold sensor; // set assertion mask if (a_mask & SAHPI_ES_LOWER_MINOR) { if (a_sup & OHOI_THS_LMINL) { ipmi_threshold_event_set(state, IPMI_LOWER_NON_CRITICAL, IPMI_GOING_LOW, IPMI_ASSERTION); } else if (d_sup & OHOI_THS_LMINH) { ipmi_threshold_event_set(state, IPMI_LOWER_NON_CRITICAL, IPMI_GOING_HIGH, IPMI_DEASSERTION); } else { return 1; } } if (a_mask & SAHPI_ES_LOWER_MAJOR) { if (a_sup & OHOI_THS_LMAJL) { ipmi_threshold_event_set(state, IPMI_LOWER_CRITICAL, IPMI_GOING_LOW, IPMI_ASSERTION); } else if (d_sup & OHOI_THS_LMAJH) { ipmi_threshold_event_set(state, IPMI_LOWER_CRITICAL, IPMI_GOING_HIGH, IPMI_DEASSERTION); } else { return 1; } } if (a_mask & SAHPI_ES_LOWER_CRIT) { if (a_sup & OHOI_THS_LCRTL) { ipmi_threshold_event_set(state, IPMI_LOWER_NON_RECOVERABLE, IPMI_GOING_LOW, IPMI_ASSERTION); } else if (d_sup & OHOI_THS_LCRTH) { ipmi_threshold_event_set(state, IPMI_LOWER_NON_RECOVERABLE, IPMI_GOING_HIGH, IPMI_DEASSERTION); } else { return 1; } } if (a_mask & SAHPI_ES_UPPER_MINOR) { if (a_sup & OHOI_THS_UMINH) { ipmi_threshold_event_set(state, IPMI_UPPER_NON_CRITICAL, IPMI_GOING_HIGH, IPMI_ASSERTION); } else if (d_sup & OHOI_THS_UMINL) { ipmi_threshold_event_set(state, IPMI_UPPER_NON_CRITICAL, IPMI_GOING_LOW, IPMI_DEASSERTION); } else { return 1; } } if (a_mask & SAHPI_ES_UPPER_MAJOR) { if (a_sup & OHOI_THS_UMAJH) { ipmi_threshold_event_set(state, IPMI_UPPER_CRITICAL, IPMI_GOING_HIGH, IPMI_ASSERTION); } else if (d_sup & OHOI_THS_UMAJL) { ipmi_threshold_event_set(state, IPMI_UPPER_CRITICAL, IPMI_GOING_LOW, IPMI_DEASSERTION); } else { return 1; } } if (a_mask & SAHPI_ES_UPPER_CRIT) { if (a_sup & OHOI_THS_UCRTH) { ipmi_threshold_event_set(state, IPMI_UPPER_NON_RECOVERABLE, IPMI_GOING_HIGH, IPMI_ASSERTION); } else if (d_sup & OHOI_THS_UCRTL) { ipmi_threshold_event_set(state, IPMI_GOING_LOW, IPMI_UPPER_NON_RECOVERABLE, IPMI_DEASSERTION); } else { return 1; } } // set deassertion mask if (d_mask & SAHPI_ES_LOWER_MINOR) { if (d_sup & OHOI_THS_LMINL) { ipmi_threshold_event_set(state, IPMI_LOWER_NON_CRITICAL, IPMI_GOING_LOW, IPMI_DEASSERTION); } else if (a_sup & OHOI_THS_LMINH) { ipmi_threshold_event_set(state, IPMI_LOWER_NON_CRITICAL, IPMI_GOING_HIGH, IPMI_ASSERTION); } else { return 1; } } if (d_mask & SAHPI_ES_LOWER_MAJOR) { if (d_sup & OHOI_THS_LMAJL) { ipmi_threshold_event_set(state, IPMI_LOWER_CRITICAL, IPMI_GOING_LOW, IPMI_DEASSERTION); } else if (a_sup & OHOI_THS_LMAJH) { ipmi_threshold_event_set(state, IPMI_GOING_HIGH, IPMI_LOWER_CRITICAL, IPMI_ASSERTION); } else { return 1; } } if (d_mask & SAHPI_ES_LOWER_CRIT) { if (d_sup & OHOI_THS_LCRTL) { ipmi_threshold_event_set(state, IPMI_LOWER_NON_RECOVERABLE, IPMI_GOING_LOW, IPMI_DEASSERTION); } else if (a_sup & OHOI_THS_LCRTH) { ipmi_threshold_event_set(state, IPMI_LOWER_NON_RECOVERABLE, IPMI_GOING_HIGH, IPMI_ASSERTION); } else { return 1; } } if (d_mask & SAHPI_ES_UPPER_MINOR) { if (d_sup & OHOI_THS_UMINH) { ipmi_threshold_event_set(state, IPMI_UPPER_NON_CRITICAL, IPMI_GOING_HIGH, IPMI_DEASSERTION); } else if (a_sup & OHOI_THS_UMINL) { ipmi_threshold_event_set(state, IPMI_UPPER_NON_CRITICAL, IPMI_GOING_LOW, IPMI_ASSERTION); } else { return 1; } } if (d_mask & SAHPI_ES_UPPER_MAJOR) { if (d_sup & OHOI_THS_UMAJH) { ipmi_threshold_event_set(state, IPMI_UPPER_CRITICAL, IPMI_GOING_HIGH, IPMI_DEASSERTION); } else if (a_sup & OHOI_THS_UMAJL) { ipmi_threshold_event_set(state, IPMI_GOING_LOW, IPMI_UPPER_CRITICAL, IPMI_ASSERTION); } else { return 1; } } if (d_mask & SAHPI_ES_UPPER_CRIT) { if (d_sup & OHOI_THS_UCRTH) { ipmi_threshold_event_set(state, IPMI_UPPER_NON_RECOVERABLE, IPMI_GOING_HIGH, IPMI_DEASSERTION); } else if (a_sup & OHOI_THS_UCRTL) { ipmi_threshold_event_set(state, IPMI_UPPER_NON_RECOVERABLE, IPMI_GOING_LOW, IPMI_ASSERTION); } else { return 1; } } return 0; } static void mask_set_data(ipmi_sensor_t *sensor, int err, void *cb_data) { struct ohoi_sensor_event_enable_masks *info = cb_data; if (err) { err("err = 0x%x", err); info->rvalue = SA_ERR_HPI_INVALID_CMD; } info->done = 1; } static void set_sensor_event_enable_masks(ipmi_sensor_t *sensor, void *cb_data) { struct ohoi_sensor_event_enable_masks *enable_data = cb_data; int rv; ipmi_event_state_t *info = enable_data->states; if (ignore_sensor(sensor)) { err("sensor is ignored"); enable_data->done = 1; enable_data->rvalue = SA_ERR_HPI_NOT_PRESENT; return; } ipmi_event_state_init(info); ipmi_event_state_set_events_enabled(info, (enable_data->enable == SAHPI_TRUE) ? 1 : 0); if (insert_events_to_ipmi_event_state(sensor, info, enable_data->assert, enable_data->deassert, enable_data->a_support, enable_data->d_support)) { err("Attempt to set not supported event 0x%x/0x%x", enable_data->assert, enable_data->deassert); enable_data->done = 1; enable_data->rvalue = SA_ERR_HPI_INVALID_DATA; return; } rv = ipmi_sensor_set_event_enables(sensor, info, mask_set_data, enable_data); if (rv) { err("Unable to sensor event enable = %d", rv); enable_data->done = 1; if (rv == EINVAL) { // invalid event in mask for this sensor */ enable_data->rvalue = SA_ERR_HPI_INVALID_DATA; } else { enable_data->rvalue = SA_ERR_HPI_INTERNAL_ERROR; } } } SaErrorT orig_get_sensor_event_enable(struct oh_handler_state *handler, struct ohoi_sensor_info *sensor_info, SaHpiBoolT *enable, SaHpiEventStateT *assert, SaHpiEventStateT *deassert) { SaErrorT rv; struct ohoi_handler *ipmi_handler = (struct ohoi_handler *)(handler->data); struct ohoi_sensor_event_enable_masks enable_data; ipmi_sensor_id_t sensor_id; sensor_id = sensor_info->info.orig_sensor_info.sensor_id; memset(&enable_data, 0, sizeof(enable_data)); rv = ipmi_sensor_pointer_cb(sensor_id, get_sensor_event_enable_masks, &enable_data); if (rv) { err("Unable to convert sensor_id to pointer"); return SA_ERR_HPI_INVALID_CMD; } rv = ohoi_loop(&enable_data.done, ipmi_handler); if (rv) return rv; if (enable_data.rvalue) return enable_data.rvalue; *enable = enable_data.enable; *assert = enable_data.assert & 0x7fff; *deassert = enable_data.deassert & 0x7fff; return SA_OK; } SaErrorT ohoi_get_sensor_event_enable(void *hnd, struct ohoi_sensor_info *sensor_info, SaHpiBoolT *enable, SaHpiEventStateT *assert, SaHpiEventStateT *deassert) { struct oh_handler_state *handler = (struct oh_handler_state *)hnd; if (sensor_info->ohoii.get_sensor_event_enable == NULL) { return SA_ERR_HPI_INVALID_CMD; } return sensor_info->ohoii.get_sensor_event_enable(handler, sensor_info, enable, assert, deassert); } SaErrorT orig_set_sensor_event_enable(struct oh_handler_state *handler, struct ohoi_sensor_info *sensor_info, SaHpiBoolT enable, SaHpiEventStateT assert, SaHpiEventStateT deassert, unsigned int a_supported, unsigned int d_supported) { int rv; struct ohoi_handler *ipmi_handler = (struct ohoi_handler *)(handler->data); struct ohoi_sensor_event_enable_masks enable_data; ipmi_sensor_id_t sensor_id; sensor_id = sensor_info->info.orig_sensor_info.sensor_id; memset(&enable_data, 0, sizeof(enable_data)); enable_data.states = malloc(ipmi_event_state_size()); if (enable_data.states == NULL) { err("out of memory"); return SA_ERR_HPI_OUT_OF_MEMORY; } enable_data.enable = enable; enable_data.assert = assert; enable_data.deassert = deassert; enable_data.a_support = a_supported; enable_data.d_support = d_supported; rv = ipmi_sensor_pointer_cb(sensor_id, set_sensor_event_enable_masks, &enable_data); if (rv) { err("Unable to convert sensor_id to pointer"); free(enable_data.states); return SA_ERR_HPI_INVALID_CMD; } rv = ohoi_loop(&enable_data.done, ipmi_handler); free(enable_data.states); if (rv) { return rv; } if (enable_data.rvalue) return enable_data.rvalue; return SA_OK; } SaErrorT ohoi_set_sensor_event_enable(void *hnd, struct ohoi_sensor_info *sensor_info, SaHpiBoolT enable, SaHpiEventStateT assert, SaHpiEventStateT deassert, unsigned int a_supported, unsigned int d_supported) { struct oh_handler_state *handler = (struct oh_handler_state *)hnd; if (sensor_info->ohoii.set_sensor_event_enable == NULL) { return SA_ERR_HPI_INVALID_CMD; } return sensor_info->ohoii.set_sensor_event_enable(handler, sensor_info, enable, assert, deassert, a_supported, d_supported); } openhpi-2.14.1/plugins/ipmi/ipmi.c0000644000076400007640000020713411302567001013714 0ustar /* -*- linux-c -*- * * Copyright (c) 2003 by Intel Corp. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Louis Zhuang * Kevin Gao * Rusty Lynch * Tariq Shureih * Racing Guo * Andy Cress (watchdog) */ #include "ipmi.h" #include #include /* Watchdog definitions */ #define WATCHDOG_RESET 0x22 #define WATCHDOG_SET 0x24 #define WATCHDOG_GET 0x25 #define NETFN_APP 0x06 #define IPMI_WD_RESOLUTION 100 #define IPMI_WD_PRETIMER_RESOLUTION 1000 #define uchar unsigned char extern int __ipmi_debug_malloc; //extern int ipmi_close_mv(void); extern int ipmicmd_mv(struct ohoi_handler *ipmi_handler, uchar cmd, uchar netfn, uchar lun, uchar *pdata, uchar sdata, uchar *presp, int sresp, int *rlen); FILE *trace_msg_file = NULL; /** * This is data structure reference by rsel_id.ptr */ struct ohoi_sel_entry { ipmi_mc_t *mc; unsigned int recid; }; /* global reference count of instances */ static int ipmi_refcount = 0; static void ipmi_domain_fully_up(ipmi_domain_t *domain, void *user_data) { struct oh_handler_state *handler = user_data; struct ohoi_handler *ipmi_handler = handler->data; if (getenv("OHOI_TRACE_DOMAINUP")) { printf(" **** DOMAIN FULLY UP *****\n"); } g_static_rec_mutex_lock(&ipmi_handler->ohoih_lock); ipmi_handler->fully_up = 1; ipmi_handler->d_type = ipmi_domain_get_type(domain); if (!IS_ATCA(ipmi_handler->d_type)) { g_static_rec_mutex_unlock(&ipmi_handler->ohoih_lock); return; } ohoi_atca_create_shelf_virtual_rdrs(handler); ohoi_atca_create_fru_rdrs(handler); g_static_rec_mutex_unlock(&ipmi_handler->ohoih_lock); } /* ABI Interface functions */ /** * *ipmi_open: open (initiate) instance of the ipmi plug-in * @handler_config: pointer to openhpi config file * * This function initiates an instance of the ipmi plug-in * and opens a new connection to OpenIPMI. * Depending on what the config file defines, the connection * could be SMI (local) or LAN. * **/ static void *ipmi_open(GHashTable *handler_config, unsigned int hid, oh_evt_queue *eventq) { struct oh_handler_state *handler = NULL; struct ohoi_handler *ipmi_handler = NULL; char domain_name[24]; char *domain_tag = NULL; const char *name; const char *addr; const char *timeout; const char *scan_time; const char *real_write_fru; int rv = 0; char *trace_file_name; /* SaHpiTextBufferT buf = { .DataType = SAHPI_TL_TYPE_TEXT, .Language = SAHPI_LANG_ENGLISH, };*/ trace_ipmi("ipmi_open"); if (!handler_config) { err("No config file provided.....ooops!"); return(NULL); } else if (!hid) { err("Bad handler id passed."); return NULL; } else if (!eventq) { err("No event queue was passed."); return NULL; } name = g_hash_table_lookup(handler_config, "name"); addr = g_hash_table_lookup(handler_config, "addr"); timeout = g_hash_table_lookup(handler_config, "TimeOut"); scan_time = g_hash_table_lookup(handler_config, "OpenIPMIscanTime"); real_write_fru = g_hash_table_lookup(handler_config, "RealWriteFru"); domain_tag = g_hash_table_lookup(handler_config, "DomainTag"); handler = (struct oh_handler_state *)malloc(sizeof( struct oh_handler_state)); if (handler == NULL) { err("Out of memory"); return NULL; } memset(handler, 0, sizeof(struct oh_handler_state)); ipmi_handler = (struct ohoi_handler *)malloc(sizeof( struct ohoi_handler)); if (ipmi_handler == NULL) { err("Out of memory"); free(handler); return NULL; } memset(ipmi_handler, 0, sizeof(struct ohoi_handler)); handler->rptcache = (RPTable *)malloc(sizeof(RPTable)); if (handler->rptcache == NULL) { err("Out of memory"); free(handler); free(ipmi_handler); return NULL; } memset(handler->rptcache, 0, sizeof(RPTable)); handler->data = ipmi_handler; handler->config = handler_config; handler->hid = hid; handler->eventq = eventq; g_static_rec_mutex_init(&(ipmi_handler->ohoih_lock)); snprintf(domain_name, 24, "%s %s", name, addr); /* Discovery routine depends on these flags */ ipmi_handler->SDRs_read_done = 0; /* Domain (main) SDR flag, 1 when done */ ipmi_handler->SELs_read_done = 0; /* SEL flag, 1 when done */ ipmi_handler->mc_count = 0; /* MC level SDRs, 0 when done */ ipmi_handler->FRU_done = 0; /* MC level SDRs, 0 when done */ ipmi_handler->bus_scan_done = 0; ipmi_handler->fullup_timeout = 60; ipmi_handler->openipmi_scan_time = 0; ipmi_handler->real_write_fru = 0; /** This code has been commented due to the multi domain changes ** in the infrastructure. (Renier Morales 11/21/06) multi_domains = g_hash_table_lookup(handler_config, "MultipleDomains"); if (multi_domains != (char *)NULL) { if (domain_tag != NULL) { oh_append_textbuffer(&buf, domain_tag); } else { oh_append_textbuffer(&buf, "IPMI Domain"); } ipmi_handler->did = oh_request_new_domain_aitimeout(hid, &buf, SAHPI_DOMAIN_CAP_AUTOINSERT_READ_ONLY, SAHPI_TIMEOUT_BLOCK, 0, 0); } else ipmi_handler->did = oh_get_default_domain_id(); */ if (timeout != NULL) { ipmi_handler->fullup_timeout = (time_t)strtol(timeout, (char **)NULL, 10); } if (scan_time != NULL) { ipmi_handler->openipmi_scan_time = (time_t)strtol(scan_time, (char **)NULL, 10); } if (real_write_fru && !strcasecmp(real_write_fru, "yes")) { ipmi_handler->real_write_fru = 1; } else { ipmi_handler->real_write_fru = 0; } ipmi_handler->fully_up = 0; ipmi_handler->entity_root = g_hash_table_lookup(handler_config, "entity_root"); if ( !name || !addr || !ipmi_handler->entity_root) { err("Problem getting correct required parameters! \ check config file"); goto free_and_out; } else trace_ipmi("name: %s, addr: %s, entity_root: %s, timeout: %d", name, addr, ipmi_handler->entity_root, (int)ipmi_handler->fullup_timeout); /* OS handler allocated first. */ ipmi_handler->os_hnd = ipmi_posix_get_os_handler(); sel_alloc_selector(ipmi_handler->os_hnd, &ipmi_handler->ohoi_sel); ipmi_posix_os_handler_set_sel(ipmi_handler->os_hnd, ipmi_handler->ohoi_sel); trace_file_name = getenv("OHOI_TRACE_FILE"); if (trace_file_name != NULL) { trace_msg_file = fopen(trace_file_name, "w+"); if (trace_msg_file) { if (getenv("OHOI_TRACE_MSG")) { DEBUG_MSG_ENABLE(); DEBUG_MSG_ERR_ENABLE(); } //if (getenv("OHOI_DBG_MEM")) { // __ipmi_debug_malloc = 1; // DEBUG_MALLOC_ENABLE(); //} } } ipmi_init(ipmi_handler->os_hnd); if (strcmp(name, "general") == 0) { #if 0 char *tok; char *pptr; char *val; char **argv = NULL; int vals_len = 0; int argc = 0; int curr_arg = 0; ipmi_args_t *iargs[2]; int curr_iarg = 0; int i, j; tok = g_hash_table_lookup(handler_config, "addr"); if (tok == NULL) { err("no ""addr"" token in config file"); goto free_and_out; } val = strtok_r(tok, " \t\n", &pptr); while (val) { if (argc == vals_len) { vals_len += 10; char **nv = malloc(sizeof(char *) * vals_len); if (!nv) { err("Out of memory"); if (argv) free(argv); goto free_and_out; } if (argv) free(argv); argv = nv; } argv[argc] = val; argc++; val = strtok_r(NULL, " \t\n", &pptr); } if (!argv) { err("""addr"" token in config file was empty"); goto free_and_out; } while (curr_arg < argc) { if (curr_iarg == 2) break; rv = ipmi_parse_args2(&curr_arg, argc, argv, &iargs[curr_iarg]); if (rv) { err("Cannot parse connection arguments"); free(argv); goto free_and_out; } curr_iarg++; } free(argv); for (i=0; ios_hnd, ipmi_handler->ohoi_sel, &ipmi_handler->cons[i]); if (rv) { err("Cannot setup connection"); for (j=0; jnum_cons = curr_iarg; ipmi_handler->islan = strcmp(ipmi_handler->cons[0]->con_type, "smi") != 0; #else err("Unsupported IPMI connection method: %s",name); goto free_and_out; #endif } else if (strcmp(name, "smi") == 0) { int tmp = strtol(addr, (char **)NULL, 10); rv = ipmi_smi_setup_con(tmp,ipmi_handler->os_hnd, ipmi_handler->ohoi_sel, &ipmi_handler->cons[0]); if (rv) { err("Cannot setup connection"); goto free_and_out; } ipmi_handler->num_cons = 1; ipmi_handler->islan = 0; } else if (strcmp(name, "lan") == 0) { static struct in_addr lan_addr; static int lan_port; static int auth; static int priv; char *tok; char user[32], passwd[32]; /* Address */ tok = g_hash_table_lookup(handler_config, "addr"); if (tok == NULL) { err("no ""addr"" token in config file"); goto free_and_out; } trace_ipmi("IPMI LAN Address: %s", tok); struct hostent *ent = gethostbyname(tok); if (!ent) { err("Unable to resolve IPMI LAN address"); goto free_and_out; } memcpy(&lan_addr, ent->h_addr_list[0], ent->h_length); /* Port */ tok = g_hash_table_lookup(handler_config, "port"); if (tok == NULL) { err("no ""port"" token in config file. set 623"); lan_port = 623; } else { lan_port = atoi(tok); } trace_ipmi("IPMI LAN Port: %i", lan_port); /* Authentication type */ tok = g_hash_table_lookup(handler_config, "auth_type"); if (tok == NULL) { err("no ""auth_type"" token in config file. set ""none"""); auth = IPMI_AUTHTYPE_NONE; } else if (strcmp(tok, "none") == 0) { auth = IPMI_AUTHTYPE_NONE; } else if (strcmp(tok, "straight") == 0) { auth = IPMI_AUTHTYPE_STRAIGHT; } else if (strcmp(tok, "md2") == 0) { auth = IPMI_AUTHTYPE_MD2; } else if (strcmp(tok, "md5") == 0) { auth = IPMI_AUTHTYPE_MD5; } else { err("Invalid IPMI LAN authenication method: %s", tok); goto free_and_out; } trace_ipmi("IPMI LAN Authority: %s(%i)", tok, auth); /* Priviledge */ tok = g_hash_table_lookup(handler_config, "auth_level"); if (tok == NULL) { err("no ""auth_level"" token in config file." " set ""admin"""); priv = IPMI_PRIVILEGE_ADMIN; } else if (strcmp(tok, "callback") == 0) { priv = IPMI_PRIVILEGE_CALLBACK; } else if (strcmp(tok, "user") == 0) { priv = IPMI_PRIVILEGE_USER; } else if (strcmp(tok, "operator") == 0) { priv = IPMI_PRIVILEGE_OPERATOR; } else if (strcmp(tok, "admin") == 0) { priv = IPMI_PRIVILEGE_ADMIN; } else if (strcmp(tok, "oem") == 0) { priv = IPMI_PRIVILEGE_OEM; } else { err("Invalid IPMI LAN authenication method: %s", tok); goto free_and_out; } trace_ipmi("IPMI LAN Priviledge: %s(%i)", tok, priv); /* User Name */ tok = g_hash_table_lookup(handler_config, "username"); if (tok == NULL) { err("no ""username"" token in config file"); strncpy(user, "", 32); } else { strncpy(user, tok, 32); } trace_ipmi("IPMI LAN User: %s", user); /* Password */ tok = g_hash_table_lookup(handler_config, "password"); if (tok == NULL) { err("no ""password"" token in config file"); strncpy(passwd, "", 32); } else { strncpy(passwd, tok, 32); free(tok); } trace_ipmi("IPMI LAN Password: %s", passwd); rv = ipmi_lan_setup_con(&lan_addr, &lan_port, 1, auth, priv, user, strlen(user), passwd, strlen(passwd), ipmi_handler->os_hnd, ipmi_handler->ohoi_sel, &ipmi_handler->cons[0]); if (rv) { err("ipmi_lan_setup_con rv = %d", rv); goto free_and_out; } ipmi_handler->num_cons = 1; ipmi_handler->islan = 1; } else { err("Unsupported IPMI connection method: %s",name); goto free_and_out; } ipmi_handler->connected = -1; rv = ipmi_open_domain(domain_name, ipmi_handler->cons, ipmi_handler->num_cons, ipmi_connection_handler, handler, ipmi_domain_fully_up, handler, NULL, 0, &ipmi_handler->domain_id); if (rv) { fprintf(stderr, "ipmi_open_domain: %s\n", strerror(rv)); goto free_and_out; } ipmi_refcount++; return handler; free_and_out: g_free(handler->rptcache); g_free(handler); g_free(ipmi_handler); return NULL; } /** * ipmi_close: close this instance of ipmi plug-in * @hnd: pointer to handler * This functions closes connection with OpenIPMI and frees * all allocated events and sensors * **/ static void ipmi_close(void *hnd) { struct oh_handler_state *handler = (struct oh_handler_state *) hnd; struct ohoi_handler *ipmi_handler = (struct ohoi_handler *)handler->data; if (ipmi_handler->connected) { trace_ipmi("close connection"); ohoi_close_connection(ipmi_handler->domain_id, handler); } // ipmi_close_mv(); ipmi_refcount--; trace_ipmi("ipmi_refcount :%d", ipmi_refcount); if(ipmi_refcount == 0) { /* last connection and in case other instances didn't close correctly we clean up all connections */ trace_ipmi("Last connection :%d closing", ipmi_refcount); ipmi_shutdown(); } oh_flush_rpt(handler->rptcache); free(handler->rptcache); free(ipmi_handler); free(handler); } /** * ipmi_get_event: get events populated earlier by OpenIPMI * @hnd: pointer to handler * * Return value: 1 or 0 **/ static int ipmi_get_event(void *hnd) { struct oh_handler_state *handler = hnd; struct ohoi_handler *ipmi_handler = (struct ohoi_handler *)handler->data; int sel_select_done = 0; for (;;) { if (sel_select_done) { break; } while (1 == sel_select(ipmi_handler->ohoi_sel, NULL, 0, NULL, NULL)); sel_select_done = 1; }; return 0; } static void trace_ipmi_resources(SaHpiRptEntryT *rpt_entry, struct ohoi_resource_info *res_info) { oh_big_textbuffer bigbuf; if (!getenv("OHOI_TRACE_DISCOVERY") && !IHOI_TRACE_ALL) { return; } unsigned char str[32]; if (res_info->type & OHOI_RESOURCE_ENTITY) { ipmi_entity_id_t *e = &res_info->u.entity.entity_id; snprintf((char *)str, 32, "(%d,%d,%d,%d)", e->entity_id, e->entity_instance, e->channel, e->address); } else { str[0] = 0; } oh_decode_entitypath(&(rpt_entry->ResourceEntity), &bigbuf); fprintf(stderr, "%s %d %s presence: %d; updated:%d %s\n", rpt_entry->ResourceTag.Data, rpt_entry->ResourceId, str, res_info->presence, res_info->updated, bigbuf.Data ); } /** * ipmi_discover_resources: discover resources in system * @hnd: pointer to handler * * This function is both sepcific to OpenIPMI and conforms to openhpi * plug-in interface in waiting until OpenIPMI discovery is done, * then retieving entries from the rptcach of the oh_handler_state and * populating the eventq for the infrastructure to fetch. * * Return value: -1 for failure or 0 for success **/ int ipmi_discover_resources(void *hnd) { int rv = 1; struct oh_handler_state *handler = (struct oh_handler_state *)hnd; struct ohoi_handler *ipmi_handler = (struct ohoi_handler *)handler->data; struct oh_event *event; SaHpiRptEntryT *rpt_entry; SaHpiRdrT *rdr_entry; time_t tm0, tm; int was_connected = 0; struct ohoi_resource_info *res_info; dbg("ipmi discover_resources"); // Look for IPMI events until we get the ipmi_domain_fully_up callback time(&tm0); while (ipmi_handler->fully_up == 0) { if (!ipmi_handler->connected) { fprintf(stderr, "IPMI connection is down\n"); return SA_ERR_HPI_NO_RESPONSE; } if ((ipmi_handler->connected == 1) && !was_connected) { // set new time stamp. IPMI is alive was_connected = 1; time(&tm0); } rv = sel_select(ipmi_handler->ohoi_sel, NULL, 0 , NULL, NULL); if (rv < 0) { // error while fetching sel break; } time(&tm); if ((tm - tm0) > ipmi_handler->fullup_timeout) { err("timeout on waiting for discovery. " "SDR_read_done = %d;" "scan_done = %d; mc_count = %d", ipmi_handler->SDRs_read_done, ipmi_handler->bus_scan_done, ipmi_handler->mc_count); return SA_ERR_HPI_NO_RESPONSE; } } // while (! ipmi_handler->fully_up) // BJS: Why are we doing this some more? while(rv == 1) { rv = sel_select(ipmi_handler->ohoi_sel, NULL, 0 , NULL, NULL); } if (rv != 0) { err("failed to scan SEL. error = %d", rv); return SA_ERR_HPI_INTERNAL_ERROR; } g_static_rec_mutex_lock(&ipmi_handler->ohoih_lock); if (!ipmi_handler->updated) { g_static_rec_mutex_unlock(&ipmi_handler->ohoih_lock); return 0; } ipmi_handler->updated = 0; // BJS: Loop over all rpt_entries (doing what?) rpt_entry = oh_get_resource_next(handler->rptcache, SAHPI_FIRST_ENTRY); while (rpt_entry) { res_info = oh_get_resource_data(handler->rptcache, rpt_entry->ResourceId); trace_ipmi_resources(rpt_entry, res_info); // If this rpt has already been processed, skip it if (res_info->updated == 0) { rpt_entry = oh_get_resource_next(handler->rptcache, rpt_entry->ResourceId); continue; } // If this rpt has been deleted, skip it if (res_info->deleted) { // We have already sent the event rpt_entry = oh_get_resource_next(handler->rptcache, rpt_entry->ResourceId); continue; } event = malloc(sizeof(*event)); if (event == NULL) { err("Out of memory"); g_static_rec_mutex_unlock(&ipmi_handler->ohoih_lock); return SA_ERR_HPI_OUT_OF_MEMORY; } memset(event, 0, sizeof(*event)); if (res_info->presence == 1) { /* Add all RDRs of this RPTe */ rdr_entry = oh_get_rdr_next(handler->rptcache, rpt_entry->ResourceId, SAHPI_FIRST_ENTRY); while (rdr_entry) { event->rdrs = g_slist_append(event->rdrs, g_memdup(rdr_entry, sizeof(SaHpiRdrT))); rdr_entry = oh_get_rdr_next(handler->rptcache, rpt_entry->ResourceId, rdr_entry->RecordId); } } SaHpiEventUnionT *u = &event->event.EventDataUnion; if (rpt_entry->ResourceCapabilities & SAHPI_CAPABILITY_FRU) { event->event.EventType = SAHPI_ET_HOTSWAP; if (res_info->presence) { u->HotSwapEvent.HotSwapState = SAHPI_HS_STATE_ACTIVE; u->HotSwapEvent.PreviousHotSwapState = SAHPI_HS_STATE_ACTIVE; } else { u->HotSwapEvent.HotSwapState = SAHPI_HS_STATE_NOT_PRESENT; u->HotSwapEvent.PreviousHotSwapState = SAHPI_HS_STATE_ACTIVE; } } else { event->event.EventType = SAHPI_ET_RESOURCE; if (res_info->presence) { u->ResourceEvent.ResourceEventType = SAHPI_RESE_RESOURCE_ADDED; } else { u->ResourceEvent.ResourceEventType = SAHPI_RESE_RESOURCE_FAILURE; } } event->event.Source = rpt_entry->ResourceId; oh_gettimeofday(&event->event.Timestamp); event->event.Severity = rpt_entry->ResourceSeverity; event->resource = *rpt_entry; event->hid = handler->hid; oh_evt_queue_push(handler->eventq, event); // We're now done with this rpt res_info->updated = 0; rpt_entry = oh_get_resource_next(handler->rptcache, rpt_entry->ResourceId); } // while (rpt_entry) g_static_rec_mutex_unlock(&ipmi_handler->ohoih_lock); return 0; } /** * ipmi_get_el_info: get ipmi SEL info * @hnd: pointer to handler * @id: resource id * @info: output -- pointer to info structure passed from infra. * * This function retrieves the SEL information from * the BMC or an SEL capable MC in an IPMI domain * * * Return value: 0 **/ static SaErrorT ipmi_get_el_info(void *hnd, SaHpiResourceIdT id, SaHpiEventLogInfoT *info) { unsigned int count; unsigned int size; SaErrorT rv; char del_support; struct oh_handler_state *handler = (struct oh_handler_state *)hnd; struct ohoi_handler *ipmi_handler = (struct ohoi_handler *)handler->data; const struct ohoi_resource_info *ohoi_res_info; while (0 == ipmi_handler->fully_up) { rv = sel_select(ipmi_handler->ohoi_sel, NULL, 0 , NULL, NULL); if (rv<0) { err("error on waiting for SEL"); return SA_ERR_HPI_INTERNAL_ERROR; } } ohoi_res_info = oh_get_resource_data(handler->rptcache, id); if (!(ohoi_res_info->type & OHOI_RESOURCE_MC)) { err("BUG: try to get sel in unsupported resource"); return SA_ERR_HPI_INVALID_CMD; } ohoi_get_sel_count(ohoi_res_info->u.entity.mc_id, (int *)(&count)); info->Entries = count; ohoi_get_sel_size(ohoi_res_info->u.entity.mc_id, (int *)(&size)); info->Size = size / 16; ohoi_get_sel_updatetime(ohoi_res_info->u.entity.mc_id, &info->UpdateTimestamp); ohoi_get_sel_time(ohoi_res_info->u.entity.mc_id, &info->CurrentTime, ipmi_handler); ohoi_get_sel_overflow(ohoi_res_info->u.entity.mc_id, (char *)(&info->OverflowFlag)); info->OverflowAction = SAHPI_EL_OVERFLOW_DROP; ohoi_get_sel_support_del(ohoi_res_info->u.entity.mc_id, &del_support); rv = ohoi_get_sel_state(ipmi_handler, ohoi_res_info->u.entity.mc_id, /* compile error */ // (int *)&info->Enabled); (int *)(void *)&info->Enabled); if (rv != SA_OK) { err("couldn't get sel state rv = %d", rv); return rv; } info->UserEventMaxSize = 0; return SA_OK; } /** * ipmi_set_el_time: set ipmi event log time * @hnd: pointer to handler * @id: resource id of resource holding sel * @time: pointer to time structure * * This functions set the clocl in the event log. * * * Return value: 0 for success, -1 for error **/ static int ipmi_set_el_time(void *hnd, SaHpiResourceIdT id, SaHpiTimeT time) { struct oh_handler_state *handler = (struct oh_handler_state *)hnd; struct ohoi_handler *ipmi_handler = (struct ohoi_handler *)handler->data; struct ohoi_resource_info *ohoi_res_info; struct timeval tv; dbg("sel_set_time called"); ohoi_res_info = oh_get_resource_data(handler->rptcache, id); if (!(ohoi_res_info->type & OHOI_RESOURCE_MC)) { err("BUG: try to get sel in unsupported resource"); return SA_ERR_HPI_INVALID_CMD; } tv.tv_sec = time/1000000000; tv.tv_usec= (time%1000000000)/1000; ohoi_set_sel_time(ohoi_res_info->u.entity.mc_id, &tv, ipmi_handler); return 0; } /** * ipmi_set_sel_state: set ipmi sel state (enabled) * @hnd: pointer to handler * @id: resource id of resource with SEL capability * @enable: int value for enable * * * * Return value: SA_OK for success, SA_ERR_HPI_.... for error **/ static SaErrorT ipmi_set_sel_state(void *hnd, SaHpiResourceIdT id, SaHpiBoolT enable) { struct ohoi_resource_info *ohoi_res_info; struct oh_handler_state *handler = (struct oh_handler_state *)hnd; struct ohoi_handler *ipmi_handler = (struct ohoi_handler *)handler->data; ohoi_res_info = oh_get_resource_data(handler->rptcache, id); if (!(ohoi_res_info->type & OHOI_RESOURCE_MC)) { err("BUG: try to set sel state in unsupported resource"); return SA_ERR_HPI_CAPABILITY; } return ohoi_set_sel_state(ipmi_handler, ohoi_res_info->u.entity.mc_id, enable); } typedef struct { ipmi_sensor_id_t *sid; ipmi_event_t *event; } get_event_sid_t; static void _get_event_sid(ipmi_mc_t *mc, void *cb_data) { get_event_sid_t *info = cb_data; *info->sid = ipmi_event_get_generating_sensor_id( ipmi_mc_get_domain(mc), mc, info->event); } /** * ipmi_get_el_entry: get IPMI SEL entry * @hnd: pointer to handler instance * @id: resourde id with SEL capability * @current: SaHpiEntryIdT of entry to retrieve * @prev: previous entry in log relative to current * @next: next entry in log * @entry: [out]SaHpiEventLogEntryT entry requested * * This function will get event(s) from SEL capable IPMI device * one at a time by the record id starting with HPI's * SAHPI_OLDEST_ENTRY or SAHPI_NEWEST_ENTRY. * * Return value: SA_OK for success -1 for failure **/ static int ipmi_get_el_entry(void *hnd, SaHpiResourceIdT id, SaHpiEventLogEntryIdT current, SaHpiEventLogEntryIdT *prev, SaHpiEventLogEntryIdT *next, SaHpiEventLogEntryT *entry, SaHpiRdrT *rdr, SaHpiRptEntryT *rptentry) { struct ohoi_resource_info *ohoi_res_info; struct oh_handler_state *handler = (struct oh_handler_state *)hnd; ipmi_event_t *event; SaHpiRptEntryT *myrpt; SaHpiRdrT *myrdr; SaHpiEventTypeT event_type; struct oh_event *e; char Data[IPMI_EVENT_DATA_MAX_LEN]; int data_len; ipmi_sensor_id_t sid; ipmi_entity_id_t et; get_event_sid_t info; ohoi_res_info = oh_get_resource_data(handler->rptcache, id); if (!(ohoi_res_info->type & OHOI_RESOURCE_MC)) { err("BUG: try to get sel in unsupported resource"); return SA_ERR_HPI_INVALID_CMD; } if (rdr) rdr->RdrType = SAHPI_NO_RECORD; if (rptentry) { rptentry->ResourceCapabilities = 0; rptentry->ResourceId = SAHPI_UNSPECIFIED_RESOURCE_ID; } switch (current) { case SAHPI_OLDEST_ENTRY: ohoi_get_sel_first_entry( ohoi_res_info->u.entity.mc_id, &event); if (!event) return SA_ERR_HPI_NOT_PRESENT; ohoi_get_sel_next_recid(ohoi_res_info->u.entity.mc_id, event, next); *prev = SAHPI_NO_MORE_ENTRIES; break; case SAHPI_NEWEST_ENTRY: ohoi_get_sel_last_entry(ohoi_res_info->u.entity.mc_id, &event); if (!event) return SA_ERR_HPI_NOT_PRESENT; *next = SAHPI_NO_MORE_ENTRIES; ohoi_get_sel_prev_recid(ohoi_res_info->u.entity.mc_id, event, prev); break; case SAHPI_NO_MORE_ENTRIES: err("SEL is empty!"); if (!event) return SA_ERR_HPI_INVALID_PARAMS; default: /* get the entry requested by id */ ohoi_get_sel_by_recid(ohoi_res_info->u.entity.mc_id, current, &event); if (!event) return SA_ERR_HPI_NOT_PRESENT; ohoi_get_sel_next_recid(ohoi_res_info->u.entity.mc_id, event, next); ohoi_get_sel_prev_recid(ohoi_res_info->u.entity.mc_id, event, prev); break; } entry->EntryId = ipmi_event_get_record_id(event); event_type = ipmi_event_get_type(event); data_len = ipmi_event_get_data(event, (unsigned char *)Data, 0, IPMI_EVENT_DATA_MAX_LEN); if (event_type == 0x02) { // sensor event if (rptentry) { rptentry->ResourceCapabilities = 0; } if (rdr) { rdr->RdrType = SAHPI_NO_RECORD; } info.sid = &sid; info.event = event; ipmi_mc_pointer_cb(ohoi_res_info->u.entity.mc_id, _get_event_sid, &info); trace_ipmi_sensors("LOOK FOR", sid); if (ohoi_sensor_ipmi_event_to_hpi_event(handler->data, sid, event, &e, &et)) { //we will handle sensor event as user event goto no_sensor_event; } myrpt = ohoi_get_resource_by_entityid(handler->rptcache, &et); if (myrpt == NULL) { goto no_rpt; } myrdr = ohoi_get_rdr_by_data(handler->rptcache, myrpt->ResourceId, SAHPI_SENSOR_RDR, &sid); e->event.Source = myrpt->ResourceId; if (rptentry) { memcpy(rptentry, myrpt, sizeof (*myrpt)); } if (myrdr) { e->event.EventDataUnion.SensorEvent.SensorNum = myrdr->RdrTypeUnion.SensorRec.Num; if (rdr) { memcpy(rdr, myrdr, sizeof (*myrdr)); } } no_rpt: memcpy(&entry->Event, &e->event, sizeof (SaHpiEventT)); oh_event_free(e, FALSE); entry->Event.EventType = SAHPI_ET_SENSOR; entry->Timestamp = ipmi_event_get_timestamp(event); return SA_OK; } no_sensor_event: entry->Event.Source = SAHPI_UNSPECIFIED_RESOURCE_ID; if (data_len != 13) { err("Strange data len in ipmi event: %d instead of 13\n", data_len); return SA_ERR_HPI_ERROR; } if ((event_type >= 0xC0) && (event_type <= 0xDF)) { // OEM timestamp event type entry->Timestamp = ipmi_event_get_timestamp(event); entry->Event.EventType = SAHPI_ET_OEM; entry->Event.Timestamp = entry->Timestamp; entry->Event.EventDataUnion.OemEvent.MId = Data[4] | (Data[5] << 8) | (Data[6] << 16); entry->Event.Severity = SAHPI_DEBUG; // FIX ME entry->Event.EventDataUnion.OemEvent. OemEventData.DataLength = 6; memcpy(entry->Event.EventDataUnion.OemEvent. OemEventData.Data, Data + 7, data_len); entry->Event.EventDataUnion.OemEvent.OemEventData. DataType = SAHPI_TL_TYPE_BINARY; entry->Event.EventDataUnion.OemEvent.OemEventData. Language = SAHPI_LANG_UNDEF; return SA_OK; }; entry->Event.Source = SAHPI_UNSPECIFIED_RESOURCE_ID; entry->Event.EventType = SAHPI_ET_USER; oh_gettimeofday(&entry->Event.Timestamp); // entry->Event.Timestamp = SAHPI_TIME_UNSPECIFIED; entry->Event.Severity = SAHPI_DEBUG; // FIX ME entry->Event.EventDataUnion.UserEvent.UserEventData.DataType = SAHPI_TL_TYPE_BINARY; entry->Event.EventDataUnion.UserEvent.UserEventData.Language = SAHPI_LANG_UNDEF; entry->Event.EventDataUnion.UserEvent.UserEventData.DataLength = ipmi_event_get_data_len(event); memcpy(entry->Event.EventDataUnion.UserEvent.UserEventData.Data, Data, data_len); return SA_OK; } static SaErrorT ipmi_clear_el(void *hnd, SaHpiResourceIdT id) { struct ohoi_resource_info *ohoi_res_info; struct oh_handler_state *handler = (struct oh_handler_state *)hnd; struct ohoi_handler *ipmi_handler = (struct ohoi_handler *)handler->data; int rv; int i; ohoi_res_info = oh_get_resource_data(handler->rptcache, id); if (!(ohoi_res_info->type & OHOI_RESOURCE_MC)) { err("BUG: try to get sel in unsupported resource"); return SA_ERR_HPI_INVALID_CMD; } ipmi_handler->sel_clear_done = 0; rv = ohoi_clear_sel(ohoi_res_info->u.entity.mc_id, ipmi_handler); if (rv != SA_OK) { err("Error in attempting to clear sel"); return rv; } for (i =0; i < 6; i++) { /* long wait - 1 min */ rv = ohoi_loop(&ipmi_handler->sel_clear_done, ipmi_handler); if (rv == SA_OK) { break; } } return rv; } #define SENSOR_CHECK(handler, sensor_info, id, num) \ do { \ SaErrorT rv; \ SaHpiRdrT *rdr; \ \ rdr = oh_get_rdr_by_type(handler->rptcache, id, \ SAHPI_SENSOR_RDR, num); \ if (!rdr) { \ err("no rdr"); \ return SA_ERR_HPI_NOT_PRESENT; \ } \ \ rv = ohoi_get_rdr_data(handler, id, SAHPI_SENSOR_RDR, num, \ (void *)&sensor_info); \ if (rv != SA_OK) \ return rv; \ \ if (!sensor_info) \ return SA_ERR_HPI_NOT_PRESENT; \ \ } while (0) #define CHECK_SENSOR_SEN_ENABLE(sensor_info) \ do { \ if (sensor_info->sen_enabled == SAHPI_FALSE) \ return SA_ERR_HPI_INVALID_REQUEST; \ } while (0) static int ipmi_get_sensor_event_enable(void *hnd, SaHpiResourceIdT id, SaHpiSensorNumT num, SaHpiBoolT *enable) { SaErrorT rv; struct oh_handler_state *handler = (struct oh_handler_state *)hnd; struct ohoi_sensor_info *sensor_info; SaHpiBoolT t_enable; SaHpiEventStateT t_assert; SaHpiEventStateT t_deassert; SENSOR_CHECK(handler, sensor_info, id, num); if (!enable) return SA_ERR_HPI_INVALID_PARAMS; rv = ohoi_get_sensor_event_enable(hnd, sensor_info, &t_enable, &t_assert, &t_deassert); if (rv) return rv; if (sensor_info->sen_enabled) { sensor_info->enable = t_enable; sensor_info->assert = t_assert; sensor_info->deassert = t_deassert; } *enable = t_enable; return SA_OK; } static int ipmi_set_sensor_event_enable(void *hnd, SaHpiResourceIdT id, SaHpiSensorNumT num, const SaHpiBoolT enable) { SaErrorT rv; struct oh_handler_state *handler = (struct oh_handler_state *)hnd; struct ohoi_sensor_info *sensor_info; struct oh_event *e; SaHpiRdrT *rdr = NULL; SaHpiRptEntryT *rpte = NULL; SaHpiSensorEnableChangeEventT *sen_evt; SENSOR_CHECK(handler, sensor_info, id, num); rv = ohoi_set_sensor_event_enable(hnd, sensor_info, enable, sensor_info->assert, sensor_info->deassert, sensor_info->support_assert, sensor_info->support_deassert); if (rv) return rv; if (sensor_info->enable == enable) return(SA_OK); sensor_info->enable = enable; // sensor_info->saved_enable = enable; e = malloc(sizeof(*e)); if (!e) { err("Out of space"); return IPMI_EVENT_NOT_HANDLED; } memset(e, 0, sizeof(*e)); rpte = oh_get_resource_by_id(handler->rptcache, id); if (rpte) { e->resource = *rpte; } rdr = oh_get_rdr_by_type(handler->rptcache, id, SAHPI_SENSOR_RDR, num); if (!rdr) { err("no rdr"); return SA_ERR_HPI_NOT_PRESENT; } e->event.Source = id; e->event.EventType = SAHPI_ET_SENSOR_ENABLE_CHANGE; e->event.Severity = SAHPI_INFORMATIONAL; oh_gettimeofday(&e->event.Timestamp); e->rdrs = g_slist_append(e->rdrs, g_memdup(rdr, sizeof(SaHpiRdrT))); // e->u.hpi_event.event.Timestamp = SAHPI_TIME_UNSPECIFIED; sen_evt = &(e->event.EventDataUnion.SensorEnableChangeEvent); sen_evt->SensorNum = num; sen_evt->SensorType = rdr->RdrTypeUnion.SensorRec.Type; sen_evt->EventCategory = rdr->RdrTypeUnion.SensorRec.Category; sen_evt->SensorEnable = sensor_info->enable; sen_evt->SensorEventEnable = sensor_info->enable; sen_evt->AssertEventMask = sensor_info->assert; sen_evt->DeassertEventMask = sensor_info->deassert; e->hid = handler->hid; oh_evt_queue_push(handler->eventq, e); return SA_OK; } /** * ipmi_get_sensor_reading: get sensor reading, type, category and other info. * @hnd: pointer to handler instance * @id: ResourceId -- parent of this sensor * @num: sensor number * @data: struct returned with data about the sensor. * * * * Return value: 0 for success or negative for error **/ static int ipmi_get_sensor_reading(void *hnd, SaHpiResourceIdT id, SaHpiSensorNumT num, SaHpiSensorReadingT *reading, SaHpiEventStateT *ev_state) { SaErrorT rv; struct oh_handler_state *handler = (struct oh_handler_state *)hnd; struct ohoi_sensor_info *sensor_info; SaHpiSensorReadingT tmp_reading; SaHpiEventStateT tmp_state; SENSOR_CHECK(handler, sensor_info, id, num); CHECK_SENSOR_SEN_ENABLE(sensor_info); rv = ohoi_get_sensor_reading(hnd, sensor_info, &tmp_reading, &tmp_state); if (rv) return rv; if (reading) *reading = tmp_reading; if (ev_state) *ev_state = tmp_state; return SA_OK; } /** * ipmi_get_sensor_thresholds: for hysteresis sensors, get thresholds. * @hnd: handler instance * @id: ResourceId parent of this sensor * @num: sensor number * @thres: struct returned with data about sensor thresholds. * * * * Return value: 0 for success or negative for error **/ static int ipmi_get_sensor_thresholds(void *hnd, SaHpiResourceIdT id, SaHpiSensorNumT num, SaHpiSensorThresholdsT *thres) { struct oh_handler_state *handler = (struct oh_handler_state *)hnd; struct ohoi_sensor_info *sensor_info; SENSOR_CHECK(handler, sensor_info, id, num); // CHECK_SENSOR_ENABLE(sensor_info); if (!thres) return SA_ERR_HPI_INVALID_PARAMS; memset(thres, 0, sizeof(*thres)); return ohoi_get_sensor_thresholds(hnd, sensor_info, thres); } static int ipmi_set_sensor_thresholds(void *hnd, SaHpiResourceIdT id, SaHpiSensorNumT num, const SaHpiSensorThresholdsT *thres) { struct oh_handler_state *handler = (struct oh_handler_state *)hnd; struct ohoi_sensor_info *sensor_info; SENSOR_CHECK(handler, sensor_info, id, num); // CHECK_SENSOR_ENABLE(sensor_info); if (!thres) return SA_ERR_HPI_INVALID_PARAMS; return ohoi_set_sensor_thresholds(hnd, sensor_info, thres); } static int ipmi_get_sensor_enable(void *hnd, SaHpiResourceIdT id, SaHpiSensorNumT num, SaHpiBoolT *enable) { struct oh_handler_state *handler = (struct oh_handler_state *)hnd; struct ohoi_sensor_info *sensor_info; SENSOR_CHECK(handler, sensor_info, id, num); if (!enable) return SA_ERR_HPI_INVALID_PARAMS; *enable = sensor_info->sen_enabled; return SA_OK; } static int ipmi_set_sensor_enable(void *hnd, SaHpiResourceIdT id, SaHpiSensorNumT num, SaHpiBoolT enable) { struct oh_handler_state *handler = (struct oh_handler_state *)hnd; struct ohoi_sensor_info *sensor_info; SaErrorT rv; SENSOR_CHECK(handler, sensor_info, id, num); if (sensor_info->sen_enabled == enable) { return SA_OK; } if (enable == SAHPI_FALSE) { // sensor_info->saved_enable = sensor_info->enable; if (sensor_info->enable == SAHPI_FALSE) { sensor_info->sen_enabled = SAHPI_FALSE; return SA_OK; } // Disable events rv = ohoi_set_sensor_event_enable(hnd, sensor_info, SAHPI_FALSE, sensor_info->assert, sensor_info->deassert, sensor_info->support_assert, sensor_info->support_deassert); if (rv == SA_OK) { sensor_info->sen_enabled = SAHPI_FALSE; }; return rv; } // enable == SAHPI_TRUE if (sensor_info->enable == SAHPI_FALSE) { sensor_info->sen_enabled = SAHPI_TRUE; return SA_OK; } // Restore events rv = ohoi_set_sensor_event_enable(hnd, sensor_info, SAHPI_TRUE, sensor_info->assert, sensor_info->deassert, sensor_info->support_assert, sensor_info->support_deassert); if (rv != SA_OK) { err("ipmi_set_sensor_event_enable = %d", rv); sensor_info->enable = SAHPI_FALSE; } sensor_info->sen_enabled = SAHPI_TRUE; return rv; } static int ipmi_get_sensor_event_masks(void *hnd, SaHpiResourceIdT id, SaHpiSensorNumT num, SaHpiEventStateT *assert, SaHpiEventStateT *deassert) { SaErrorT rv; struct oh_handler_state *handler = (struct oh_handler_state *)hnd; struct ohoi_sensor_info *sensor_info; SaHpiBoolT t_enable; SaHpiEventStateT t_assert; SaHpiEventStateT t_deassert; SENSOR_CHECK(handler, sensor_info, id, num); if (!assert || !deassert) return SA_ERR_HPI_INVALID_PARAMS; rv = ohoi_get_sensor_event_enable(hnd, sensor_info, &t_enable, &t_assert, &t_deassert); if (rv) return rv; if (sensor_info->sen_enabled) { sensor_info->enable = t_enable; sensor_info->assert = t_assert; sensor_info->deassert = t_deassert; } *assert = t_assert; *deassert = t_deassert; return SA_OK; } static int ipmi_set_sensor_event_masks(void *hnd, SaHpiResourceIdT id, SaHpiSensorNumT num, SaHpiSensorEventMaskActionT act, SaHpiEventStateT assert, SaHpiEventStateT deassert) { SaErrorT rv; struct oh_handler_state *handler = (struct oh_handler_state *)hnd; struct ohoi_sensor_info *sensor_info; SaHpiEventStateT t_assert; SaHpiEventStateT t_deassert; struct oh_event *e; SaHpiRptEntryT *rpte = NULL; SaHpiRdrT *rdr = NULL; SaHpiSensorEnableChangeEventT *sen_evt; SENSOR_CHECK(handler, sensor_info, id, num); if (act == SAHPI_SENS_ADD_EVENTS_TO_MASKS) { t_assert = assert | sensor_info->assert; t_deassert = deassert | sensor_info->deassert; } else if (act == SAHPI_SENS_REMOVE_EVENTS_FROM_MASKS) { t_assert = (assert ^ 0xffff) & sensor_info->assert; t_deassert = (deassert ^ 0xffff) & sensor_info->deassert; } else return SA_ERR_HPI_INVALID_PARAMS; rv = ohoi_set_sensor_event_enable(hnd, sensor_info, sensor_info->enable, t_assert, t_deassert, sensor_info->support_assert, sensor_info->support_deassert); if (rv) return rv; if ((sensor_info->assert == t_assert) && (sensor_info->deassert == t_deassert)) return (SA_OK); sensor_info->assert = t_assert; sensor_info->deassert = t_deassert; e = malloc(sizeof(*e)); if (!e) { err("Out of space"); return IPMI_EVENT_NOT_HANDLED; } memset(e, 0, sizeof(*e)); rpte = oh_get_resource_by_id(handler->rptcache, id); if (rpte) { e->resource = *rpte; } rdr = oh_get_rdr_by_type(handler->rptcache, id, SAHPI_SENSOR_RDR, num); if (!rdr) { err("no rdr"); return SA_ERR_HPI_NOT_PRESENT; } e->event.Source = id; e->event.EventType = SAHPI_ET_SENSOR_ENABLE_CHANGE; e->event.Severity = SAHPI_INFORMATIONAL; oh_gettimeofday(&e->event.Timestamp); e->rdrs = g_slist_append(e->rdrs, g_memdup(rdr, sizeof(SaHpiRdrT))); // e->u.hpi_event.event.Timestamp = SAHPI_TIME_UNSPECIFIED; sen_evt = &(e->event.EventDataUnion.SensorEnableChangeEvent); sen_evt->SensorNum = num; sen_evt->SensorType = rdr->RdrTypeUnion.SensorRec.Type; sen_evt->EventCategory = rdr->RdrTypeUnion.SensorRec.Category; sen_evt->SensorEnable = sensor_info->enable; sen_evt->SensorEventEnable = sensor_info->enable; sen_evt->AssertEventMask = sensor_info->assert; sen_evt->DeassertEventMask = sensor_info->deassert; e->hid = handler->hid; oh_evt_queue_push(handler->eventq, e); return SA_OK; } /* * WATCHDOG FUNCTIONS */ static int ipmi_get_watchdog_info(void *hnd, SaHpiResourceIdT id, SaHpiWatchdogNumT num, SaHpiWatchdogT *watchdog) { struct oh_handler_state *handler = (struct oh_handler_state *)hnd; struct ohoi_handler *ipmi_handler =(struct ohoi_handler *)handler->data; unsigned char reqdata[16]; unsigned char response[16]; int rlen; int rv; /* * OpenIPMI library doesn't have watchdog calls, so talk * directly to the driver (via ipmi_drv.c). * Currently support only default watchdog num, and only local. */ if (ipmi_handler->islan) return(SA_ERR_HPI_UNSUPPORTED_API); if (num != SAHPI_DEFAULT_WATCHDOG_NUM) { err("num = %d", num); return SA_ERR_HPI_INVALID_PARAMS; } rlen = sizeof(response); memset(reqdata, 0, 16); memset(response, 0, 16); rv = ipmicmd_mv(ipmi_handler, WATCHDOG_GET, NETFN_APP, 0, reqdata, 0, response, rlen, &rlen); if (rv != 0) return(rv); dbg("wdog_get: %02x %02x %02x %02x %02x %02x %02x %02x %02x\n", response[0], response[1], response[2], response[3], response[4], response[5], response[6], response[7], response[8]); rv = response[0]; /*completion code*/ if (rv != 0) { rv |= IPMI_IPMI_ERR_TOP; OHOI_MAP_ERROR(rv, rv); return(rv); } /* Translate IPMI response to HPI format */ memset(watchdog, 0, sizeof(SaHpiWatchdogT)); if (response[1] & 0x80) watchdog->Log = SAHPI_FALSE; else watchdog->Log = SAHPI_TRUE; if (response[1] & 0x40) watchdog->Running = SAHPI_TRUE; else watchdog->Running = SAHPI_FALSE; switch(response[1] & 0x07) { case 0x01: watchdog->TimerUse = SAHPI_WTU_BIOS_FRB2; break; case 0x02: watchdog->TimerUse = SAHPI_WTU_BIOS_POST; break; case 0x03: watchdog->TimerUse = SAHPI_WTU_OS_LOAD; break; case 0x04: watchdog->TimerUse = SAHPI_WTU_SMS_OS; break; case 0x05: watchdog->TimerUse = SAHPI_WTU_OEM; break; default: watchdog->TimerUse = SAHPI_WTU_UNSPECIFIED; break; } switch (response[2] & 0x70) { case 0x00: watchdog->PretimerInterrupt = SAHPI_WPI_NONE; break; case 0x10: watchdog->PretimerInterrupt = SAHPI_WPI_SMI; break; case 0x20: watchdog->PretimerInterrupt = SAHPI_WPI_NMI; break; case 0x30: watchdog->PretimerInterrupt = SAHPI_WPI_MESSAGE_INTERRUPT; break; default : watchdog->PretimerInterrupt = SAHPI_WPI_NONE; // watchdog->PretimerInterrupt = SAHPI_WPI_OEM; break; } switch (response[2] & 0x07) { case 0x00: watchdog->TimerAction = SAHPI_WA_NO_ACTION; break; case 0x01: watchdog->TimerAction = SAHPI_WA_RESET; break; case 0x02: watchdog->TimerAction = SAHPI_WA_POWER_DOWN; break; case 0x03: watchdog->TimerAction = SAHPI_WA_POWER_CYCLE; break; default: watchdog->TimerAction = SAHPI_WA_NO_ACTION; break; } watchdog->PreTimeoutInterval = response[3] * IPMI_WD_PRETIMER_RESOLUTION; watchdog->TimerUseExpFlags = 0; if (response[4] & 0x02) watchdog->TimerUseExpFlags |= SAHPI_WATCHDOG_EXP_BIOS_FRB2; if (response[4] & 0x04) watchdog->TimerUseExpFlags |= SAHPI_WATCHDOG_EXP_BIOS_POST; if (response[4] & 0x08) watchdog->TimerUseExpFlags |= SAHPI_WATCHDOG_EXP_OS_LOAD; if (response[4] & 0x10) watchdog->TimerUseExpFlags |= SAHPI_WATCHDOG_EXP_SMS_OS; if (response[4] & 0x20) watchdog->TimerUseExpFlags |= SAHPI_WATCHDOG_EXP_OEM; watchdog->InitialCount = (response[5] + (response[6] * 256)) * IPMI_WD_RESOLUTION; watchdog->PresentCount = (response[7] + (response[8] * 256)) * IPMI_WD_RESOLUTION; return SA_OK; } static int ipmi_set_watchdog_info(void *hnd, SaHpiResourceIdT id, SaHpiWatchdogNumT num, SaHpiWatchdogT *watchdog) { struct oh_handler_state *handler = (struct oh_handler_state *)hnd; struct ohoi_handler *ipmi_handler =(struct ohoi_handler *)handler->data; unsigned char reqdata[16]; unsigned char response[16]; int rlen; int tv; int rv; if (ipmi_handler->islan) return(SA_ERR_HPI_UNSUPPORTED_API); if (num != SAHPI_DEFAULT_WATCHDOG_NUM) { err("watchdog num = %d", num); return SA_ERR_HPI_INVALID_PARAMS; } /* translate HPI values to IPMI */ switch (watchdog->TimerUse) { case SAHPI_WTU_BIOS_FRB2: reqdata[0] = 0x01; break; case SAHPI_WTU_BIOS_POST: reqdata[0] = 0x02; break; case SAHPI_WTU_OS_LOAD: reqdata[0] = 0x03; break; case SAHPI_WTU_SMS_OS: reqdata[0] = 0x04; break; case SAHPI_WTU_OEM: reqdata[0] = 0x05; break; case SAHPI_WTU_NONE: default: reqdata[0] = 0x00; } if (watchdog->Log == SAHPI_FALSE) reqdata[0] |= 0x80;; if (watchdog->Running == SAHPI_TRUE) reqdata[0] |= 0x40;; switch (watchdog->TimerAction) { case SAHPI_WA_RESET: reqdata[1] = 0x01; break; case SAHPI_WA_POWER_DOWN: reqdata[1] = 0x02; break; case SAHPI_WA_POWER_CYCLE: reqdata[1] = 0x03; break; case SAHPI_WA_NO_ACTION: default: reqdata[1] = 0x00; } switch (watchdog->PretimerInterrupt) { case SAHPI_WPI_SMI: reqdata[1] |= 0x10; break; case SAHPI_WPI_NMI: reqdata[1] |= 0x20; break; case SAHPI_WPI_MESSAGE_INTERRUPT: reqdata[1] |= 0x30; break; case SAHPI_WPI_OEM: /* Undefined, so treat it like SAHPI_WPI_NONE */ case SAHPI_WPI_NONE: default: break; } tv = watchdog->PreTimeoutInterval / IPMI_WD_PRETIMER_RESOLUTION; reqdata[2] = tv & 0x00ff; reqdata[3] = 0; if (watchdog->TimerUseExpFlags & SAHPI_WATCHDOG_EXP_BIOS_FRB2) reqdata[3] |= 0x02; if (watchdog->TimerUseExpFlags & SAHPI_WATCHDOG_EXP_BIOS_POST) reqdata[3] |= 0x04; if (watchdog->TimerUseExpFlags & SAHPI_WATCHDOG_EXP_OS_LOAD) reqdata[3] |= 0x08; if (watchdog->TimerUseExpFlags & SAHPI_WATCHDOG_EXP_SMS_OS) reqdata[3] |= 0x10; if (watchdog->TimerUseExpFlags & SAHPI_WATCHDOG_EXP_OEM) reqdata[3] |= 0x20; if ((watchdog->InitialCount < IPMI_WD_RESOLUTION) && (watchdog->InitialCount != 0)) tv = IPMI_WD_RESOLUTION; else tv = watchdog->InitialCount / IPMI_WD_RESOLUTION; reqdata[4] = tv & 0x00ff; // tv % 256; reqdata[5] = tv / 256; // (tv & 0xff00) >> 8; dbg("wdog_set: %02x %02x %02x %02x %02x %02x\n", reqdata[0], reqdata[1], reqdata[2], reqdata[3], reqdata[4], reqdata[5]); rlen = sizeof(response); rv = ipmicmd_mv(ipmi_handler, WATCHDOG_SET, NETFN_APP, 0, reqdata, 6, response, rlen, &rlen); if (rv != 0) return(rv); rv = response[0]; /*completion code*/ if (rv != 0) { err("wdog_set response: %02x", rv); OHOI_MAP_ERROR(rv, rv); } else { rv = SA_OK; } return rv; } static int ipmi_reset_watchdog(void *hnd, SaHpiResourceIdT id, SaHpiWatchdogNumT num) { struct oh_handler_state *handler = (struct oh_handler_state *)hnd; struct ohoi_handler *ipmi_handler =(struct ohoi_handler *)handler->data; unsigned char response[16]; int rlen; int rv; if (ipmi_handler->islan) return(SA_ERR_HPI_UNSUPPORTED_API); if (num != SAHPI_DEFAULT_WATCHDOG_NUM) { err("watchdog num = %d", num); return SA_ERR_HPI_INVALID_PARAMS; } rlen = sizeof(response); rv = ipmicmd_mv(ipmi_handler, WATCHDOG_RESET, NETFN_APP, 0, NULL, 0, response, rlen, &rlen); if (rv != 0) return(rv); rv = response[0]; /*completion code*/ if (rv != 0) { err("wdog_set response: %02x", rv); OHOI_MAP_ERROR(rv, rv); } else { rv = SA_OK; } return rv; } static void ohoi_set_resource_tag(ipmi_entity_t *entity, void *cb_data) { // SaHpiTextBufferT *tag = cb_data; // ipmi_entity_set_entity_id_string(entity, (char *)tag); err("New resource Tag set"); } static SaErrorT ipmi_set_res_tag (void *hnd, SaHpiResourceIdT id, SaHpiTextBufferT *tag) { struct oh_handler_state *handler = (struct oh_handler_state *)hnd; SaHpiRptEntryT *rpt_entry; struct ohoi_resource_info *res_info; int rv; res_info = oh_get_resource_data(handler->rptcache, id); if (!res_info) err("No private resource info for resource %d", id); rpt_entry = oh_get_resource_by_id(handler->rptcache, id); if (!rpt_entry) { err("No rpt for resource %d?", id); return SA_ERR_HPI_NOT_PRESENT; } /* do it in openIPMI's memory first for subsequest updates */ /* can only be an Entity in the ohoi_resource_info struct */ if (res_info->type & OHOI_RESOURCE_ENTITY) { dbg("Setting new Tag: %s for resource: %d", (char *) tag->Data, id); rv = ipmi_entity_pointer_cb(res_info->u.entity.entity_id, ohoi_set_resource_tag, tag->Data); if (rv) err("Error retrieving entity pointer for resource %d", rpt_entry->ResourceId); } rpt_entry->ResourceTag.DataType = tag->DataType; rpt_entry->ResourceTag.Language = tag->Language; rpt_entry->ResourceTag.DataLength = tag->DataLength; /* change it in our memory as well */ memcpy(&rpt_entry->ResourceTag.Data, tag->Data, sizeof(tag->Data)); oh_add_resource(handler->rptcache, rpt_entry, res_info, 1); entity_rpt_set_updated(res_info, handler->data); return SA_OK; } static SaErrorT ipmi_set_res_sev(void *hnd, SaHpiResourceIdT res_id, SaHpiSeverityT severity) { struct oh_handler_state *handler = (struct oh_handler_state *)hnd; struct ohoi_handler *ipmi_handler = handler->data; struct ohoi_resource_info *res_info; SaHpiRptEntryT *rpt_entry; res_info = oh_get_resource_data(handler->rptcache, res_id); if (res_info == NULL) { err("Failed to retrieve RPT private data"); return SA_ERR_HPI_NOT_PRESENT; } rpt_entry = oh_get_resource_by_id(handler->rptcache, res_id); if (!rpt_entry) { err("Can't find RPT for resource id: %d", res_id); return SA_ERR_HPI_NOT_PRESENT; } dbg("Current Severity: %d\n", rpt_entry->ResourceSeverity); dbg("To be set New Severity: %d\n", severity); memcpy(&rpt_entry->ResourceSeverity, &severity, sizeof(severity)); oh_add_resource(handler->rptcache, rpt_entry, res_info, 1); dbg("New Severity: %d\n", rpt_entry->ResourceSeverity); entity_rpt_set_updated(res_info, ipmi_handler); return SA_OK; } void * oh_open (GHashTable *, unsigned int, oh_evt_queue *) __attribute__ ((weak, alias("ipmi_open"))); void * oh_close (void *) __attribute__ ((weak, alias("ipmi_close"))); void * oh_get_event (void *) __attribute__ ((weak, alias("ipmi_get_event"))); void * oh_discover_resources (void *) __attribute__ ((weak, alias("ipmi_discover_resources"))); void * oh_set_resource_tag (void *, SaHpiResourceIdT, SaHpiTextBufferT *) __attribute__ ((weak, alias("ipmi_set_res_tag"))); void * oh_set_resource_severity (void *, SaHpiResourceIdT, SaHpiSeverityT) __attribute__ ((weak, alias("ipmi_set_res_sev"))); void * oh_get_el_info (void *, SaHpiResourceIdT, SaHpiEventLogInfoT *) __attribute__ ((weak, alias("ipmi_get_el_info"))); void * oh_set_el_time (void *, SaHpiResourceIdT, const SaHpiEventT *) __attribute__ ((weak, alias("ipmi_set_el_time"))); void * oh_get_el_entry (void *, SaHpiResourceIdT, const SaHpiEventT *) __attribute__ ((weak, alias("ipmi_get_el_entry"))); void * oh_set_el_state (void *, SaHpiResourceIdT , SaHpiBoolT ) __attribute__ ((weak, alias("ipmi_set_sel_state"))); void * oh_clear_el (void *, SaHpiResourceIdT) __attribute__ ((weak, alias("ipmi_clear_el"))); void * oh_get_sensor_reading (void *, SaHpiResourceIdT, SaHpiSensorNumT, SaHpiSensorReadingT *, SaHpiEventStateT *) __attribute__ ((weak, alias("ipmi_get_sensor_reading"))); void * oh_get_sensor_thresholds (void *, SaHpiResourceIdT, SaHpiSensorNumT, SaHpiSensorThresholdsT *) __attribute__ ((weak, alias("ipmi_get_sensor_thresholds"))); void * oh_set_sensor_thresholds (void *, SaHpiResourceIdT, SaHpiSensorNumT, const SaHpiSensorThresholdsT *) __attribute__ ((weak, alias("ipmi_set_sensor_thresholds"))); void * oh_get_sensor_enable (void *, SaHpiResourceIdT, SaHpiSensorNumT, SaHpiBoolT *) __attribute__ ((weak, alias("ipmi_get_sensor_enable"))); void * oh_set_sensor_enable (void *, SaHpiResourceIdT, SaHpiSensorNumT, SaHpiBoolT) __attribute__ ((weak, alias("ipmi_set_sensor_enable"))); void * oh_get_sensor_event_enables (void *, SaHpiResourceIdT, SaHpiSensorNumT, SaHpiBoolT *) __attribute__ ((weak, alias("ipmi_get_sensor_event_enable"))); void * oh_set_sensor_event_enables (void *, SaHpiResourceIdT id, SaHpiSensorNumT, SaHpiBoolT *) __attribute__ ((weak, alias("ipmi_set_sensor_event_enable"))); void * oh_get_sensor_event_masks (void *, SaHpiResourceIdT, SaHpiSensorNumT, SaHpiEventStateT *, SaHpiEventStateT *) __attribute__ ((weak, alias("ipmi_get_sensor_event_masks"))); void * oh_set_sensor_event_masks (void *, SaHpiResourceIdT, SaHpiSensorNumT, SaHpiSensorEventMaskActionT, SaHpiEventStateT, SaHpiEventStateT) __attribute__ ((weak, alias("ipmi_set_sensor_event_masks"))); void * oh_get_watchdog_info (void *, SaHpiResourceIdT, SaHpiWatchdogNumT, SaHpiWatchdogT *) __attribute__ ((weak, alias("ipmi_get_watchdog_info"))); void * oh_set_watchdog_info (void *, SaHpiResourceIdT, SaHpiWatchdogNumT, SaHpiWatchdogT *) __attribute__ ((weak, alias("ipmi_set_watchdog_info"))); void * oh_reset_watchdog (void *, SaHpiResourceIdT , SaHpiWatchdogNumT ) __attribute__ ((weak, alias("ipmi_reset_watchdog"))); SaErrorT (*reset_watchdog)(void *hnd, SaHpiResourceIdT id, SaHpiWatchdogNumT num); openhpi-2.14.1/plugins/ipmi/ipmi_drv.c0000644000076400007640000002160411302567001014563 0ustar /* -*- linux-c -*- * * Copyright (c) 2004 by Intel Corp. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * These routines access the OpenIPMI driver directly, rather * than using OpenIPMI library calls. * * Authors: * Andy Cress * Changes: * 12/01/04 ARCress - created from ipmiutil/ipmimv.c */ #include "ipmi.h" #include #include #include #include #ifdef SCO_UW #include #endif #include #include #include #include #define uchar unsigned char #define IPMI_MAX_ADDR_SIZE 32 #define IPMI_BMC_CHANNEL 0xf #define IPMI_IOC_MAGIC 'i' #ifdef TV_PORT /* use this to define timeval if it is a portability issue */ struct timeval { long int tv_sec; /* (time_t) seconds */ long int tv_usec; /* (suseconds_t) microseconds */ }; #endif struct ipmi_req { unsigned char *addr; /* Address to send the message to. */ unsigned int addr_len; long msgid; /* The sequence number for the message. */ struct ipmi_msg msg; }; struct ipmi_recv { int recv_type; /* Is this a command, response, etc. */ unsigned char *addr; /* Address the message was from */ int addr_len; /* The size of the address buffer. */ long msgid; /* The sequence number from the request */ struct ipmi_msg msg; /* The data field must point to a buffer. */ }; #define IPMICTL_RECEIVE_MSG _IOWR(IPMI_IOC_MAGIC, 12, struct ipmi_recv) #define IPMICTL_RECEIVE_MSG_TRUNC _IOWR(IPMI_IOC_MAGIC, 11, struct ipmi_recv) #define IPMICTL_SEND_COMMAND _IOR(IPMI_IOC_MAGIC, 13, struct ipmi_req) #define IPMICTL_SET_GETS_EVENTS_CMD _IOR(IPMI_IOC_MAGIC, 16, int) #if 0 FILE *fperr = NULL; /* if NULL, no messages */ static int ipmi_timeout_mv = 10; /* 10 seconds, was 5 sec */ static int ipmi_fd = -1; static int curr_seq = 0; #endif //int ipmi_open_mv(void); //int ipmi_close_mv(void); int ipmicmd_mv(struct ohoi_handler *ipmi_handler, uchar cmd, uchar netfn, uchar lun, uchar *pdata, uchar sdata, uchar *presp, int sresp, int *rlen); int ipmicmd_send(ipmi_domain_t *domain, uchar netfn, uchar cmd, uchar lun, uchar chan, uchar *pdata, uchar sdata, ipmi_addr_response_handler_t handler, void *handler_data); int ipmicmd_mc_send(ipmi_mc_t *mc, uchar netfn, uchar cmd, uchar lun, uchar *pdata, uchar sdata, ipmi_mc_response_handler_t handler, void *handler_data); #if 0 int ipmi_open_mv(void) { if (ipmi_fd != -1) return(0); ipmi_fd = open("/dev/ipmi/0", O_RDWR); if (ipmi_fd == -1) ipmi_fd = open("/dev/ipmi0", O_RDWR); if (ipmi_fd == -1) ipmi_fd = open("/dev/ipmidev0", O_RDWR); if (ipmi_fd == -1) ipmi_fd = open("/dev/ipmidev/0", O_RDWR); if (ipmi_fd == -1) return(-1); return(0); } int ipmi_close_mv(void) { int rc = 0; if (ipmi_fd != -1) { rc = close(ipmi_fd); ipmi_fd = -1; } return(rc); } int ipmicmd_mv(uchar cmd, uchar netfn, uchar lun, uchar *pdata, uchar sdata, uchar *presp, int sresp, int *rlen) { fd_set readfds; struct timeval tv; struct ipmi_recv rsp; struct ipmi_addr addr; struct ipmi_req req; struct ipmi_system_interface_addr bmc_addr; int i; int rv; rv = ipmi_open_mv(); if (rv != 0) return(rv); i = 1; rv = ioctl(ipmi_fd, IPMICTL_SET_GETS_EVENTS_CMD, &i); if (rv) { return(errno); } FD_ZERO(&readfds); // FD_SET(0, &readfds); /* dont watch stdin */ FD_SET(ipmi_fd, &readfds); /* only watch ipmi_fd for input */ /* Send the IPMI command */ bmc_addr.addr_type = IPMI_SYSTEM_INTERFACE_ADDR_TYPE; bmc_addr.channel = IPMI_BMC_CHANNEL; bmc_addr.lun = lun; // BMC_LUN = 0 req.addr = (unsigned char *) &bmc_addr; req.addr_len = sizeof(bmc_addr); req.msg.cmd = cmd; req.msg.netfn = netfn; req.msgid = curr_seq; req.msg.data = pdata; req.msg.data_len = sdata; rv = ioctl(ipmi_fd, IPMICTL_SEND_COMMAND, &req); curr_seq++; if (rv == -1) { rv = errno; } if (rv == 0) { tv.tv_sec=ipmi_timeout_mv; tv.tv_usec=0; rv = select(ipmi_fd+1, &readfds, NULL, NULL, &tv); /* expect select rv = 1 here */ if (rv <= 0) { /* no data within 5 seconds */ if (fperr != NULL) fprintf(fperr,"drv select timeout, fd = %d, isset = %d, rv = %d, errno = %d\n", ipmi_fd,FD_ISSET(ipmi_fd, &readfds),rv,errno); if (rv == 0) rv = -3; else rv = errno; } else { /* receive the IPMI response */ rsp.addr = (unsigned char *) &addr; rsp.addr_len = sizeof(addr); rsp.msg.data = presp; rsp.msg.data_len = sresp; rv = ioctl(ipmi_fd, IPMICTL_RECEIVE_MSG_TRUNC, &rsp); if (rv == -1) { if ((errno == EMSGSIZE) && (rsp.msg.data_len == sresp)) rv = 0; /* errno 90 is ok */ else { rv = errno; if (fperr != NULL) fprintf(fperr,"drv rcv_trunc errno = %d, len = %d\n", errno, rsp.msg.data_len); } } else rv = 0; *rlen = rsp.msg.data_len; } } /* ipmi_close_mv(); * rely on the app calling ipmi_close */ return(rv); } #endif int ipmicmd_send(ipmi_domain_t *domain, uchar netfn, uchar cmd, uchar lun, uchar chan, uchar *pdata, uchar sdata, ipmi_addr_response_handler_t handler, void *handler_data) { struct ipmi_system_interface_addr si; struct ipmi_msg msg; /* Send the IPMI command */ si.addr_type = IPMI_SYSTEM_INTERFACE_ADDR_TYPE; si.channel = chan; si.lun = lun; // BMC_LUN = 0 msg.netfn = netfn; msg.cmd = cmd; msg.data = pdata; msg.data_len = sdata; return ipmi_send_command_addr(domain, (ipmi_addr_t *) &si, sizeof(si), &msg, handler, handler_data, NULL); } int ipmicmd_mc_send(ipmi_mc_t *mc, uchar netfn, uchar cmd, uchar lun, uchar *pdata, uchar sdata, ipmi_mc_response_handler_t handler, void *handler_data) { struct ipmi_msg msg; msg.netfn = netfn; msg.cmd = cmd; msg.data = pdata; msg.data_len = sdata; return ipmi_mc_send_command(mc, lun, &msg, handler, handler_data); } typedef struct { uchar cmd; uchar netfn; uchar lun; uchar *pdata; uchar sdata; uchar *presp; int sresp; int *rlen; SaErrorT rv; int done; } ipmicmd_mv_arg_t; static int ipmicmd_mv_handler( ipmi_domain_t *domain, ipmi_msgi_t *rspi) { ipmicmd_mv_arg_t *info = rspi->data1; ipmi_msg_t *msg = &rspi->msg; if (domain == NULL) { err("domain == NULL"); info->rv = SA_ERR_HPI_INVALID_PARAMS; info->done = 1; return IPMI_MSG_ITEM_NOT_USED; } if (info->sresp < msg->data_len) { err("info->sresp(%d) < msg->data_len(%d)", info->sresp, msg->data_len); info->done = 1; info->rv = SA_ERR_HPI_OUT_OF_SPACE; return IPMI_MSG_ITEM_NOT_USED; } memcpy(info->presp, msg->data, msg->data_len); *info->rlen = msg->data_len; info->done = 1; return IPMI_MSG_ITEM_NOT_USED; } static void ipmicmd_mv_cb(ipmi_domain_t *domain, void *cb_data) { ipmicmd_mv_arg_t *info = cb_data; int rv; rv = ipmicmd_send(domain, info->netfn, info->cmd, info->lun, 0, info->pdata, info->sdata, ipmicmd_mv_handler, cb_data); if (rv != 0) { err("ipmicmd_send = %d", rv); OHOI_MAP_ERROR(info->rv, rv); info->done = 1; } } int ipmicmd_mv(struct ohoi_handler *ipmi_handler, uchar cmd, uchar netfn, uchar lun, uchar *pdata, uchar sdata, uchar *presp, int sresp, int *rlen) { ipmicmd_mv_arg_t info; int rv; info.cmd = cmd; info.netfn = netfn; info.lun = lun; info.pdata = pdata; info.sdata = sdata; info.presp = presp; info.sresp = sresp; info.rlen = rlen; info.rv = 0; info.done = 0; rv = ipmi_domain_pointer_cb(ipmi_handler->domain_id, ipmicmd_mv_cb, &info); if (rv != 0) { err("ipmi_domain_pointer_cb = %d", rv); return SA_ERR_HPI_BUSY; } rv = ohoi_loop(&info.done, ipmi_handler); if (rv != SA_OK) { err("ohoi_loop = %d", rv); return rv; } return info.rv; } #ifdef TEST int main(int argc, char *argv[]) { fd_set readfds; struct timeval tv; char data[40]; int i, j; int err; int rlen; err = ipmicmd_mv(0x01, 0x06, 0, NULL, 0, data, sizeof(data), &rlen); printf("ipmicmd_mv ret=%d, cc=%02x\n",err,(uchar)data[0]); printf(" ** Return Code: %2.2X\n", data[0]); printf(" ** Data[%d]: ",rlen); for (i=1; i < rlen; i++) printf("%2.2X ", (uchar)data[i]); printf("\n"); printf("\n"); ipmi_close_mv(); return 0; } #endif openhpi-2.14.1/plugins/ipmi/ipmi.sym0000644000076400007640000000005411302567001014272 0ustar ipmi_get_interface get_interface posix_vlog openhpi-2.14.1/plugins/ipmi/ipmi_inventory_event.c0000644000076400007640000002041711302567001017227 0ustar /* -*- linux-c -*- * * Copyright (c) 2003 by Intel Corp. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Louis Zhuang * Racing Guo */ #include "ipmi.h" #include #include static void trace_ipmi_fru(char *str, ipmi_entity_t *entity) { if (!getenv("OHOI_TRACE_FRU") && !IHOI_TRACE_ALL) { return; } fprintf(stderr, "*** FRU %s: for (%d,%d,%d,%d) %s\n", str, ipmi_entity_get_entity_id(entity), ipmi_entity_get_entity_instance(entity), ipmi_entity_get_device_channel(entity), ipmi_entity_get_device_address(entity), ipmi_entity_get_entity_id_string(entity)); } static void init_inventory_info( struct oh_handler_state *handler, struct ohoi_resource_info *res_info, ipmi_entity_t *ent) { struct ohoi_handler *ipmi_handler = handler->data; ipmi_fru_t *fru = ipmi_entity_get_fru(ent); struct ohoi_inventory_info *i_info; unsigned int len; unsigned char uch; time_t tm; unsigned int i; if (fru == NULL) { err("ipmi_entity_get_fru returned NULL"); return; } i_info = malloc(sizeof(*i_info)); if (!i_info) { err("Out of memory"); return; } memset(i_info, 0, sizeof(*i_info)); i_info->mutex = g_mutex_new(); if (ipmi_fru_area_get_length( fru, IPMI_FRU_FTR_INTERNAL_USE_AREA, &len) == 0) { i_info->iu = 255; } if (ipmi_fru_area_get_length( fru, IPMI_FRU_FTR_CHASSIS_INFO_AREA, &len) == 0) { i_info->ci = 255; if (ipmi_fru_get_chassis_info_type(fru, &uch) == 0) { i_info->ci_fld_msk |= (1 << SAHPI_IDR_FIELDTYPE_CHASSIS_TYPE); } if (ipmi_fru_get_chassis_info_part_number_len(fru, &len) == 0) { i_info->ci_fld_msk |= (1 << SAHPI_IDR_FIELDTYPE_PART_NUMBER); } if (ipmi_fru_get_chassis_info_serial_number_len(fru, &len) == 0) { i_info->ci_fld_msk |= (1 << SAHPI_IDR_FIELDTYPE_SERIAL_NUMBER); } for (i = 0; ;i++) { if (ipmi_fru_get_chassis_info_custom_len(fru, i, &len) == 0) { break; } i_info->ci_fld_msk |= (1 << SAHPI_IDR_FIELDTYPE_CUSTOM); i_info->ci_custom_num++; } } if (ipmi_fru_get_board_info_lang_code(fru, &i_info->bi) == 0) { if (i_info->bi == 0) { i_info->bi = SAHPI_LANG_ENGLISH; } if (ipmi_fru_get_board_info_board_manufacturer_len(fru, &len) == 0) { i_info->bi_fld_msk |= (1 << SAHPI_IDR_FIELDTYPE_MANUFACTURER); } if (ipmi_fru_get_board_info_mfg_time(fru, &tm) == 0) { i_info->bi_fld_msk |= (1 << SAHPI_IDR_FIELDTYPE_MFG_DATETIME); } if (ipmi_fru_get_board_info_board_product_name_len(fru, &len) == 0) { i_info->bi_fld_msk |= (1 << SAHPI_IDR_FIELDTYPE_PRODUCT_NAME); } if (ipmi_fru_get_board_info_board_serial_number_len(fru, &len) == 0) { i_info->bi_fld_msk |= (1 << SAHPI_IDR_FIELDTYPE_SERIAL_NUMBER); } if (ipmi_fru_get_board_info_board_part_number_len(fru, &len) == 0) { i_info->bi_fld_msk |= (1 << SAHPI_IDR_FIELDTYPE_PART_NUMBER); } if (ipmi_fru_get_board_info_fru_file_id_len(fru, &len) == 0) { i_info->bi_fld_msk |= (1 << SAHPI_IDR_FIELDTYPE_FILE_ID); } for (i = 0; ;i++) { if (ipmi_fru_get_board_info_custom_len(fru, i, &len) != 0) { break; } i_info->bi_fld_msk |= (1 << SAHPI_IDR_FIELDTYPE_CUSTOM); i_info->bi_custom_num++; } } if (ipmi_fru_get_product_info_lang_code(fru, &i_info->pi) == 0) { if (i_info->pi == 0) { i_info->pi = SAHPI_LANG_ENGLISH; } if (ipmi_fru_get_product_info_manufacturer_name_len(fru, &len) == 0) { i_info->pi_fld_msk |= (1 << SAHPI_IDR_FIELDTYPE_MANUFACTURER); } if (ipmi_fru_get_product_info_product_name_len(fru, &len) == 0) { i_info->pi_fld_msk |= (1 << SAHPI_IDR_FIELDTYPE_PRODUCT_NAME); } if (ipmi_fru_get_product_info_product_part_model_number_len(fru, &len) == 0) { i_info->pi_fld_msk |= (1 << SAHPI_IDR_FIELDTYPE_PART_NUMBER); } if (ipmi_fru_get_product_info_product_version_len(fru, &len) == 0) { i_info->pi_fld_msk |= (1 << SAHPI_IDR_FIELDTYPE_PRODUCT_VERSION); } if (ipmi_fru_get_product_info_product_serial_number_len(fru, &len) == 0) { i_info->pi_fld_msk |= (1 << SAHPI_IDR_FIELDTYPE_SERIAL_NUMBER); } if (ipmi_fru_get_product_info_asset_tag_len(fru, &len) == 0) { i_info->pi_fld_msk |= (1 << SAHPI_IDR_FIELDTYPE_ASSET_TAG); } if (ipmi_fru_get_product_info_fru_file_id_len(fru, &len) == 0) { i_info->pi_fld_msk |= (1 << SAHPI_IDR_FIELDTYPE_FILE_ID); } for (i = 0; ;i++) { if (ipmi_fru_get_product_info_custom_len(fru, i, &len) != 0) { break; } i_info->pi_fld_msk |= (1 << SAHPI_IDR_FIELDTYPE_CUSTOM); i_info->pi_custom_num++; } } if (ipmi_fru_area_get_length( fru, IPMI_FRU_FTR_MULTI_RECORD_AREA, &len) == 0) { unsigned int r_num = ipmi_fru_get_num_multi_records(fru); i_info->oem = 1; i_info->oem_fields_num = r_num; if (ipmi_handler->d_type == IPMI_DOMAIN_TYPE_ATCA) { i_info->oem = ohoi_create_atca_oem_idr_areas(handler, ent, res_info, i_info, r_num); } } res_info->fru = i_info; } static void add_inventory_event(struct ohoi_resource_info *res_info, ipmi_entity_t *ent, struct oh_handler_state *handler, SaHpiRptEntryT *rpt_entry) { SaHpiResourceIdT rid = rpt_entry->ResourceId; SaHpiRdrT rdr; int rv; init_inventory_info(handler, res_info, ent); if (res_info->fru == NULL) { err("Out of memory"); return; } memset(&rdr, 0, sizeof(rdr)); rdr.RecordId = 0; rdr.RdrType = SAHPI_INVENTORY_RDR; rdr.Entity = rpt_entry->ResourceEntity; rdr.IsFru = SAHPI_TRUE; /* One Fru has only one inventory, so IdrId always is 0 */ rdr.RdrTypeUnion.InventoryRec.IdrId = 0; rdr.RdrTypeUnion.InventoryRec.Persistent = SAHPI_TRUE; rdr.RdrTypeUnion.InventoryRec.Oem = 0; oh_init_textbuffer(&rdr.IdString); oh_append_textbuffer(&rdr.IdString, "FRU Inventory data"); rid = oh_uid_lookup(&rdr.Entity); rv = oh_add_rdr(handler->rptcache, rid, &rdr, NULL, 0); if (rv == SA_OK) { rpt_entry->ResourceCapabilities |= SAHPI_CAPABILITY_INVENTORY_DATA | SAHPI_CAPABILITY_RDR; } else { free(res_info->fru); res_info->fru = NULL; err("couldn't add inventory. rv = %d", rv); } } extern void ohoi_delete_oem_area(gpointer arg, gpointer u_data); void ohoi_delete_rpt_fru(struct ohoi_resource_info *res_info) { struct ohoi_inventory_info *i_info; if (res_info->fru == NULL) { return; } i_info = res_info->fru; if (i_info->oem_areas) { g_slist_foreach(i_info->oem_areas, ohoi_delete_oem_area, NULL); g_slist_free(i_info->oem_areas); } free(i_info); res_info->fru = NULL; } /* Per IPMI spec., one FRU per entity */ void ohoi_inventory_event(enum ipmi_update_e op, ipmi_entity_t *entity, void *cb_data) { struct oh_handler_state *handler = cb_data; struct ohoi_resource_info *res_info; ipmi_entity_id_t entity_id; SaHpiRptEntryT *rpt_entry; entity_id = ipmi_entity_convert_to_id(entity); rpt_entry = ohoi_get_resource_by_entityid( handler->rptcache, &entity_id); if (!rpt_entry) { trace_ipmi_fru("NO RPT ENTRY", entity); dump_entity_id("FRU without RPT entry?!", entity_id); return; } res_info = oh_get_resource_data(handler->rptcache, rpt_entry->ResourceId); if (op == IPMI_ADDED) { trace_ipmi_fru("ADDED", entity); add_inventory_event(res_info, entity, handler, rpt_entry); } else if (op == IPMI_DELETED) { trace_ipmi_fru("DELETED", entity); ohoi_delete_rpt_fru(res_info); rpt_entry->ResourceCapabilities &= ~SAHPI_CAPABILITY_INVENTORY_DATA; if (oh_get_rdr_next(handler->rptcache, rpt_entry->ResourceId, SAHPI_FIRST_ENTRY) == NULL) { rpt_entry->ResourceCapabilities &= ~SAHPI_CAPABILITY_RDR; } } trace_ipmi("Set updated for res_info %p(%d). Inventory", res_info, rpt_entry->ResourceId); entity_rpt_set_updated(res_info, handler->data);; } openhpi-2.14.1/plugins/ipmi/ipmi_entity.c0000644000076400007640000000104311302567001015277 0ustar /* -*- linux-c -*- * * Copyright (c) 2003 by Intel Corp. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Louis Zhuang */ #include "ipmi.h" #include #include openhpi-2.14.1/plugins/ipmi/hotswap.c0000644000076400007640000005664611302567001014455 0ustar /* -*- linux-c -*- * * Copyright (c) 2003 by Intel Corp. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Louis Zhuang * Racing Guo */ #include "ipmi.h" #include #include static SaHpiHsStateT _ipmi_to_hpi_state_conv(enum ipmi_hot_swap_states ipmi_state) { SaHpiHsStateT state = 0; switch (ipmi_state) { case IPMI_HOT_SWAP_NOT_PRESENT: case IPMI_HOT_SWAP_OUT_OF_CON: state = SAHPI_HS_STATE_NOT_PRESENT; break; case IPMI_HOT_SWAP_INACTIVE: state = SAHPI_HS_STATE_INACTIVE; break; case IPMI_HOT_SWAP_ACTIVATION_REQUESTED: case IPMI_HOT_SWAP_ACTIVATION_IN_PROGRESS: state = SAHPI_HS_STATE_INSERTION_PENDING; break; case IPMI_HOT_SWAP_ACTIVE: state = SAHPI_HS_STATE_ACTIVE; break; case IPMI_HOT_SWAP_DEACTIVATION_REQUESTED: case IPMI_HOT_SWAP_DEACTIVATION_IN_PROGRESS: state = SAHPI_HS_STATE_EXTRACTION_PENDING; break; #if 0 case IPMI_HOT_SWAP_OUT_OF_CON: state = SAHPI_HS_STATE_ACTIVE_UNHEALTHY; break; #endif default: err("Unknown state: %d", ipmi_state); } return state; } static enum ipmi_hot_swap_states _hpi_to_ipmi_state_conv(SaHpiHsStateT hpi_state) { enum ipmi_hot_swap_states state = 0; switch (hpi_state) { case SAHPI_HS_STATE_NOT_PRESENT: state = IPMI_HOT_SWAP_NOT_PRESENT; break; case SAHPI_HS_STATE_INACTIVE: state = IPMI_HOT_SWAP_INACTIVE; break; case SAHPI_HS_STATE_INSERTION_PENDING: state = IPMI_HOT_SWAP_ACTIVATION_IN_PROGRESS; break; case SAHPI_HS_STATE_ACTIVE: state = IPMI_HOT_SWAP_ACTIVE; break; case SAHPI_HS_STATE_EXTRACTION_PENDING: state = IPMI_HOT_SWAP_DEACTIVATION_IN_PROGRESS; break; default: err("Unknown state: %d", hpi_state); } return state; } static SaHpiSeverityT get_severity(enum ipmi_hot_swap_states prev, enum ipmi_hot_swap_states curr, SaHpiRptEntryT *rpt, struct ohoi_resource_info *res_info) { unsigned char hs_mark = 0; if (res_info) { hs_mark = res_info->hs_mark; res_info->hs_mark = 0; } if ((prev == IPMI_HOT_SWAP_ACTIVATION_IN_PROGRESS) && (curr == IPMI_HOT_SWAP_INACTIVE)) { return rpt->ResourceSeverity; } if ((prev != IPMI_HOT_SWAP_INACTIVE) && (curr == IPMI_HOT_SWAP_NOT_PRESENT)) { return rpt->ResourceSeverity; } if (hs_mark && (prev == IPMI_HOT_SWAP_DEACTIVATION_IN_PROGRESS) && (curr == IPMI_HOT_SWAP_INACTIVE)) { return rpt->ResourceSeverity; } return SAHPI_INFORMATIONAL; } static unsigned char _ipmi_to_hpi_cause_of_change_conv(unsigned char cause) { switch (cause) { case 0x00: return 0; case 0x03: return 1; case 0x02: return 2; case 0x07: return 3; case 0x09: return 4; case 0x06: return 5; case 0x08: return 6; case 0x0f: default: return 7; } } int ohoi_hot_swap_cb(ipmi_entity_t *ent, enum ipmi_hot_swap_states last_state, enum ipmi_hot_swap_states curr_state, void *cb_data, ipmi_event_t *event) { struct oh_handler_state *handler = (struct oh_handler_state*)cb_data; struct ohoi_handler *ipmi_handler = (struct ohoi_handler *)handler->data; ipmi_entity_id_t entity_id; SaHpiRptEntryT *rpt_entry; struct ohoi_resource_info *res_info; struct oh_event *e; #if 0 if (event) { unsigned char data[IPMI_EVENT_DATA_MAX_LEN]; unsigned int dt_len, i; printf("event body : "); dt_len = ipmi_event_get_data(event, data, 0, IPMI_EVENT_DATA_MAX_LEN); for (i =0; i < dt_len; i++) printf(" 0x%02x", data[i]); printf("\n"); } #endif if (getenv("OHOI_TRACE_HOTSWAP") || IHOI_TRACE_ALL) { printf(" *** Hotswap HANDLER for entity %d,%d,%d,%d " "(%s). states 0x%x -> 0x%x. entity = %p\n", ipmi_entity_get_entity_id(ent), ipmi_entity_get_entity_instance(ent), ipmi_entity_get_device_channel(ent), ipmi_entity_get_device_address(ent), ipmi_entity_get_entity_id_string(ent), last_state, curr_state, ent); } trace_ipmi("HotSwap Handler called"); entity_id = ipmi_entity_convert_to_id(ent); rpt_entry = ohoi_get_resource_by_entityid(handler->rptcache, &entity_id); if (!rpt_entry) { err(" No rpt\n"); return IPMI_EVENT_HANDLED; } res_info = oh_get_resource_data(handler->rptcache, rpt_entry->ResourceId); if ((last_state == IPMI_HOT_SWAP_ACTIVATION_IN_PROGRESS) && (curr_state == IPMI_HOT_SWAP_DEACTIVATION_IN_PROGRESS)) { if (res_info) { res_info->hs_mark = 1; } return IPMI_EVENT_HANDLED; } e = malloc(sizeof(*e)); if (!e) { err("Out of space"); return IPMI_EVENT_HANDLED; } memset(e, 0, sizeof(*e)); e->event.Source = rpt_entry->ResourceId; if ((curr_state == IPMI_HOT_SWAP_OUT_OF_CON) && (last_state != IPMI_HOT_SWAP_NOT_PRESENT)) { // special case. connection to entity lost rpt_entry->ResourceFailed = SAHPI_TRUE; e->event.EventType = SAHPI_ET_RESOURCE; e->event.Severity = rpt_entry->ResourceSeverity; oh_gettimeofday(&e->event.Timestamp); e->event.Source = rpt_entry->ResourceId; e->event.EventDataUnion.ResourceEvent. ResourceEventType = SAHPI_RESE_RESOURCE_FAILURE; e->resource = *rpt_entry; e->hid = handler->hid; oh_evt_queue_push(handler->eventq, e); if (!IS_ATCA(ipmi_handler->d_type)) { return IPMI_EVENT_HANDLED; } if (ipmi_entity_get_entity_id(ent) == 0xf0) { // Shelf Manager. Handle ShM Redundancy Sensor if (ipmi_handler->fully_up) { ipmi_handler->shmc_present_num--; ohoi_send_vshmgr_redundancy_sensor_event( handler, 0); } } return IPMI_EVENT_HANDLED; } if ((curr_state != IPMI_HOT_SWAP_OUT_OF_CON) && rpt_entry->ResourceFailed) { // special case rpt_entry->ResourceFailed = SAHPI_FALSE; if (curr_state != IPMI_HOT_SWAP_NOT_PRESENT) { // connection to entity restored e->event.EventType = SAHPI_ET_RESOURCE; e->event.Severity = rpt_entry->ResourceSeverity; oh_gettimeofday(&e->event.Timestamp); e->event.Source = rpt_entry->ResourceId; e->event.EventDataUnion.ResourceEvent. ResourceEventType = SAHPI_RESE_RESOURCE_RESTORED; e->resource = *rpt_entry; e->hid = handler->hid; oh_evt_queue_push(handler->eventq, e); if (!IS_ATCA(ipmi_handler->d_type)) { return IPMI_EVENT_HANDLED; } if (ipmi_entity_get_entity_id(ent) == 0xf0) { // Shelf Manager. Handle ShM Redundancy Sensor if (ipmi_handler->fully_up) { ipmi_handler->shmc_present_num++; ohoi_send_vshmgr_redundancy_sensor_event( handler, 1); } } return IPMI_EVENT_HANDLED; } // XXX here must be handled M7->M0 transition } e->event.Source = rpt_entry->ResourceId; e->event.EventType = SAHPI_ET_HOTSWAP; e->event.Severity = get_severity(last_state, curr_state, rpt_entry, res_info); if (event != NULL) { e->event.Timestamp = (SaHpiTimeT)ipmi_event_get_timestamp(event); } else { e->event.Timestamp = SAHPI_TIME_UNSPECIFIED; } if (e->event.Timestamp == SAHPI_TIME_UNSPECIFIED) { oh_gettimeofday(&e->event.Timestamp); } e->event.EventDataUnion.HotSwapEvent.HotSwapState = _ipmi_to_hpi_state_conv(curr_state); e->event.EventDataUnion.HotSwapEvent.PreviousHotSwapState = _ipmi_to_hpi_state_conv(last_state); e->resource = *rpt_entry; if (e->event.EventDataUnion.HotSwapEvent.PreviousHotSwapState == e->event.EventDataUnion.HotSwapEvent.HotSwapState) { free(e); return IPMI_EVENT_HANDLED; } if (e->event.EventDataUnion.HotSwapEvent.HotSwapState == SAHPI_HS_STATE_INSERTION_PENDING) { res_info->hs_inspen_time = e->event.Timestamp; } else { res_info->hs_inspen_time = SAHPI_TIME_UNSPECIFIED; } if (e->event.EventDataUnion.HotSwapEvent.HotSwapState == SAHPI_HS_STATE_NOT_PRESENT) { trace_ipmi("HS_STATE NOT PRESENT, removing RPT"); e->hid = handler->hid; oh_evt_queue_push(handler->eventq, e); }else if (e->event.EventDataUnion.HotSwapEvent.HotSwapState == SAHPI_HS_STATE_ACTIVE) { trace_ipmi("HS_STATE ACTIVE"); e->hid = handler->hid; oh_evt_queue_push(handler->eventq, e); }else { e->hid = handler->hid; oh_evt_queue_push(handler->eventq, e); } // oh_wake_event_thread(0); if (!IS_ATCA(ipmi_handler->d_type) || !event) { return IPMI_EVENT_HANDLED; } unsigned char data[IPMI_EVENT_DATA_MAX_LEN]; unsigned int dt_len; dt_len = ipmi_event_get_data(event, data, 0, IPMI_EVENT_DATA_MAX_LEN); if (dt_len < 12) { err("event data len (%d) too short", dt_len); return IPMI_EVENT_HANDLED; } e = malloc(sizeof(*e)); if (!e) { err("Out of space"); return IPMI_EVENT_HANDLED; } memset(e, 0, sizeof(*e)); e->resource = *rpt_entry; e->event.Source = rpt_entry->ResourceId; e->event.Timestamp = (SaHpiTimeT)ipmi_event_get_timestamp(event); e->event.Severity = SAHPI_INFORMATIONAL; e->event.EventType = SAHPI_ET_OEM; e->event.EventDataUnion.OemEvent.MId = ATCAHPI_PICMG_MID; e->event.EventDataUnion.OemEvent.OemEventData.DataType = SAHPI_TL_TYPE_TEXT; e->event.EventDataUnion.OemEvent.OemEventData.Language = SAHPI_LANG_UNDEF; e->event.EventDataUnion.OemEvent.OemEventData.DataLength = 3; e->event.EventDataUnion.OemEvent.OemEventData.Data[0] = _ipmi_to_hpi_state_conv(curr_state); e->event.EventDataUnion.OemEvent.OemEventData.Data[1] = _ipmi_to_hpi_state_conv(last_state); e->event.EventDataUnion.OemEvent.OemEventData.Data[2] = _ipmi_to_hpi_cause_of_change_conv(data[11] >> 4); e->hid = handler->hid; oh_evt_queue_push(handler->eventq, e); return IPMI_EVENT_HANDLED; } /* GET HOTSWAP STATE */ typedef struct { int done; SaErrorT err; enum ipmi_hot_swap_states ipmi_state; } get_hs_state_t; static void _get_hotswap_state(ipmi_entity_t *ent, int err, enum ipmi_hot_swap_states state, void *cb_data) { get_hs_state_t *info = cb_data; if (err) { err("_get_hotswap_state. err = 0x%x", err); err = SA_ERR_HPI_INVALID_CMD; } else { info->ipmi_state = state; } info->done = 1; } SaErrorT ohoi_get_hotswap_state(void *hnd, SaHpiResourceIdT id, SaHpiHsStateT *state) { struct oh_handler_state *handler; const struct ohoi_resource_info *ohoi_res_info; get_hs_state_t info; int rv; handler = (struct oh_handler_state *)hnd; ohoi_res_info = oh_get_resource_data(handler->rptcache, id); if (!(ohoi_res_info->type & OHOI_RESOURCE_ENTITY)) { err("BUG: try to get sel in unsupported resource"); return SA_ERR_HPI_INVALID_CMD; } info.done = 0; info.err = SA_OK; rv = ipmi_entity_id_get_hot_swap_state(ohoi_res_info->u.entity.entity_id, _get_hotswap_state, &info); if (rv) { err("Unable to get hotswap state: %d", rv); return SA_ERR_HPI_INVALID_CMD; } rv = ohoi_loop(&info.done, handler->data); if (rv) { err("ohoi_loop returned %d", rv); return rv; } if (info.err != SA_OK) { err("info.err = %d", info.err); return info.err; } *state = _ipmi_to_hpi_state_conv(info.ipmi_state); return SA_OK; } /* SET HOTSWAP STATE */ struct hs_done_s { int done; int err; }; static void _hotswap_done(ipmi_entity_t *ent, int err, void *cb_data) { struct hs_done_s *info = cb_data; if (err) { err("err = 0x%x", err); } info->err = err; info->done = 1; } SaErrorT ohoi_set_hotswap_state(void *hnd, SaHpiResourceIdT id, SaHpiHsStateT state) { struct oh_handler_state *handler = (struct oh_handler_state *)hnd; struct ohoi_handler *ipmi_handler = handler->data; const struct ohoi_resource_info *ohoi_res_info; struct hs_done_s info; SaErrorT rv; ohoi_res_info = oh_get_resource_data(handler->rptcache, id); if (!(ohoi_res_info->type & OHOI_RESOURCE_ENTITY)) { err("BUG: try to get sel in unsupported resource"); return SA_ERR_HPI_INVALID_CMD; } info.done = 0; info.err = 0; switch (_hpi_to_ipmi_state_conv(state)) { case IPMI_HOT_SWAP_ACTIVE: ipmi_entity_id_activate(ohoi_res_info->u.entity.entity_id, _hotswap_done, &info); break; case IPMI_HOT_SWAP_INACTIVE: ipmi_entity_id_deactivate(ohoi_res_info->u.entity.entity_id, _hotswap_done, &info); break; default: err("Unable set hotswap state: %d", state); return SA_ERR_HPI_INVALID_CMD; } rv = ohoi_loop(&info.done, ipmi_handler); if (rv != SA_OK) { return rv; } if (info.err) { return SA_ERR_HPI_INVALID_CMD; } return SA_OK; } /* REQUEST HOTSWAP ACTION */ static void activation_request(ipmi_entity_t *ent, void *cb_data) { int rv; struct hs_done_s *info = cb_data; rv = ipmi_entity_set_activation_requested(ent, _hotswap_done, cb_data); if (rv == ENOSYS) { err("ipmi_entity_set_activation_requested = ENOSYS. " "Use ipmi_entity_activate"); rv = ipmi_entity_activate(ent, _hotswap_done, cb_data); } if (rv) { err("ipmi_entity_set_activation_requested = 0x%x", rv); info->done = 1; info->err = -1; } } static void deactivation_request(ipmi_entity_t *ent, void *cb_data) { int rv; struct hs_done_s *info = cb_data; rv = ipmi_entity_deactivate(ent, _hotswap_done, cb_data); if (rv) { err("ipmi_entity_set_activation_requested = 0x%x", rv); info->done = 1; info->err = -1; } } SaErrorT ohoi_request_hotswap_action(void *hnd, SaHpiResourceIdT id, SaHpiHsActionT act) { struct oh_handler_state *handler; const struct ohoi_resource_info *ohoi_res_info; struct hs_done_s info; SaErrorT rv; handler = (struct oh_handler_state *)hnd; struct ohoi_handler *ipmi_handler = handler->data; ohoi_res_info = oh_get_resource_data(handler->rptcache, id); if (!(ohoi_res_info->type & OHOI_RESOURCE_ENTITY)) { err("BUG: try to get sel in unsupported resource"); return SA_ERR_HPI_INVALID_CMD; } info.done = 0; info.err = 0; switch (act) { case SAHPI_HS_ACTION_INSERTION: rv = ipmi_entity_pointer_cb(ohoi_res_info->u.entity.entity_id, activation_request, &info); if (rv) { err("ipmi_entity_pointer_cb = 0x%x", rv); return SA_ERR_HPI_INVALID_PARAMS; } break; case SAHPI_HS_ACTION_EXTRACTION: rv = ipmi_entity_pointer_cb(ohoi_res_info->u.entity.entity_id, deactivation_request, &info); if (rv) { err("ipmi_entity_pointer_cb = 0x%x", rv); return SA_ERR_HPI_INVALID_PARAMS; } break; //return SA_ERR_HPI_UNSUPPORTED_API; default : return SA_ERR_HPI_INVALID_PARAMS; } rv = ohoi_loop(&info.done, ipmi_handler); if (rv != SA_OK) { return rv; } if (info.err) { return SA_ERR_HPI_INVALID_REQUEST; } return SA_OK; } #if 0 SaErrorT ohoi_get_indicator_state(void *hnd, SaHpiResourceIdT id, SaHpiHsIndicatorStateT *state) { struct oh_handler_state *handler; const struct ohoi_resource_info *ohoi_res_info; SaHpiCtrlStateT c_state; SaErrorT rv; handler = (struct oh_handler_state *)hnd; ohoi_res_info = oh_get_resource_data(handler->rptcache, id); if (!(ohoi_res_info->type & OHOI_RESOURCE_ENTITY)) { err("BUG: try to get HS in unsupported resource"); return SA_ERR_HPI_INVALID_CMD; } rv = ohoi_get_control_state(hnd, id, ohoi_res_info->hotswapind, NULL, &c_state); if (rv != SA_OK) { return rv; } if (c_state.StateUnion.Oem.Body[1] == 0) { *state = SAHPI_HS_INDICATOR_OFF; } else { *state = SAHPI_HS_INDICATOR_ON; } return SA_OK; } SaErrorT ohoi_set_indicator_state(void *hnd, SaHpiResourceIdT id, SaHpiHsIndicatorStateT state) { struct oh_handler_state *handler; const struct ohoi_resource_info *ohoi_res_info; SaErrorT rv; SaHpiCtrlStateT c_state; SaHpiCtrlModeT mode; handler = (struct oh_handler_state *)hnd; ohoi_res_info = oh_get_resource_data(handler->rptcache, id); if (!(ohoi_res_info->type & OHOI_RESOURCE_ENTITY)) { err("BUG: try to set HS in unsupported resource"); return SA_ERR_HPI_INVALID_CMD; } rv = ohoi_get_control_state(hnd, id, ohoi_res_info->hotswapind, &mode, &c_state); if (rv != SA_OK) { return rv; } if (state == SAHPI_HS_INDICATOR_OFF) { c_state.StateUnion.Oem.Body[0] = 1; c_state.StateUnion.Oem.Body[1] = 0; } else if (state == SAHPI_HS_INDICATOR_ON) { c_state.StateUnion.Oem.Body[0] = 0; c_state.StateUnion.Oem.Body[1] = 1; } else { return SA_ERR_HPI_INVALID_PARAMS; } rv = ohoi_set_control_state(hnd, id, ohoi_res_info->hotswapind, SAHPI_CTRL_MODE_MANUAL, &c_state); if ((rv == SA_OK) && (mode == SAHPI_CTRL_MODE_AUTO)) { ohoi_set_control_state(hnd, id, ohoi_res_info->hotswapind, SAHPI_CTRL_MODE_AUTO, NULL); } return rv; } #endif struct ohoi_indicator_state { int done; int val; int err; }; static void _get_indicator_state(ipmi_entity_t *ent, int err, int val, void *cb_data) { struct ohoi_indicator_state *state; state = cb_data; if (state->err) { err("err = 0x%x", err); } state->err = err; state->done = 1; state->val = val; } SaErrorT ohoi_set_indicator_state(void *hnd, SaHpiResourceIdT id, SaHpiHsIndicatorStateT state) { struct oh_handler_state *handler; const struct ohoi_resource_info *ohoi_res_info; struct hs_done_s info; SaErrorT rv; handler = (struct oh_handler_state *)hnd; struct ohoi_handler *ipmi_handler = handler->data; ohoi_res_info = oh_get_resource_data(handler->rptcache, id); if (!(ohoi_res_info->type & OHOI_RESOURCE_ENTITY)) { err("BUG: try to get sel in unsupported resource"); return SA_ERR_HPI_INVALID_CMD; } info.done = 0; info.err = 0; ipmi_entity_id_set_hot_swap_indicator(ohoi_res_info->u.entity.entity_id, state, _hotswap_done, &info); rv = ohoi_loop(&info.done,ipmi_handler); if (rv != SA_OK) { return rv; } if (info.err) { return SA_ERR_HPI_INVALID_CMD; } return SA_OK; } SaErrorT ohoi_get_indicator_state(void *hnd, SaHpiResourceIdT id, SaHpiHsIndicatorStateT *state) { struct oh_handler_state *handler; const struct ohoi_resource_info *ohoi_res_info; struct ohoi_indicator_state ipmi_state; SaErrorT rv; handler = (struct oh_handler_state *)hnd; struct ohoi_handler *ipmi_handler = handler->data; ohoi_res_info = oh_get_resource_data(handler->rptcache, id); if (!(ohoi_res_info->type & OHOI_RESOURCE_ENTITY)) { err("BUG: try to get HS in unsupported resource"); return SA_ERR_HPI_INVALID_CMD; } ipmi_state.done = 0; rv = ipmi_entity_id_get_hot_swap_indicator( ohoi_res_info->u.entity.entity_id, _get_indicator_state, &ipmi_state); if(rv) { return SA_ERR_HPI_INTERNAL_ERROR; } rv = ohoi_loop(&ipmi_state.done, ipmi_handler); if (rv != SA_OK) { return rv; } *state = ipmi_state.val; return SA_OK;; } SaErrorT ohoi_hotswap_policy_cancel(void *hnd, SaHpiResourceIdT rid, SaHpiTimeoutT ins_timeout) { struct oh_handler_state *handler = hnd; struct ohoi_handler *ipmi_handler = handler->data; struct ohoi_resource_info *res_info; struct ohoi_control_info *ctrl_info; SaHpiRptEntryT *rpt; SaHpiResourceIdT prid; SaHpiTimeoutT curtime; SaErrorT rv; if (!IS_ATCA(ipmi_handler->d_type)) { return SA_OK; } rpt = oh_get_resource_by_id(handler->rptcache, rid); if (rpt == NULL) { err("No rpt for id = %d", rid); return SA_ERR_HPI_INTERNAL_ERROR; } // get parent (slot) rpt prid = ohoi_get_parent_id(rpt); rv = ohoi_get_rdr_data(hnd, prid, SAHPI_CTRL_RDR, ATCAHPI_CTRL_NUM_FRU_ACTIVATION, (void *)&ctrl_info); if (rv != SA_OK) { err("NO FRU Activation Control"); return SA_ERR_HPI_INVALID_REQUEST; } if (ctrl_info->mode == SAHPI_CTRL_MODE_AUTO) { err("mode == AUTO"); return SA_ERR_HPI_INVALID_REQUEST; } res_info = oh_get_resource_data(handler->rptcache, rid); if (res_info == NULL) { err("no res_info"); return SA_ERR_HPI_INTERNAL_ERROR; } if (ins_timeout == SAHPI_TIMEOUT_BLOCK) { return SA_OK; } if (res_info->hs_inspen_time == SAHPI_TIME_UNSPECIFIED) { // time of last insertion pending state unknown err("time of last insertion pending state unknown"); return SA_ERR_HPI_INVALID_REQUEST; } if (ins_timeout == SAHPI_TIMEOUT_IMMEDIATE) { err("ins_timeout == SAHPI_TIMEOUT_IMMEDIATE"); return SA_ERR_HPI_INVALID_REQUEST; } oh_gettimeofday(&curtime); if (res_info->hs_inspen_time + ins_timeout > curtime) { err("time expired"); return SA_ERR_HPI_INVALID_REQUEST; } return SA_OK; } void * oh_get_hotswap_state (void *, SaHpiResourceIdT, SaHpiHsStateT *) __attribute__ ((weak, alias("ohoi_get_hotswap_state"))); void * oh_set_hotswap_state (void *, SaHpiResourceIdT, SaHpiHsStateT) __attribute__ ((weak, alias("ohoi_set_hotswap_state"))); void * oh_request_hotswap_action (void *, SaHpiResourceIdT, SaHpiHsActionT) __attribute__ ((weak, alias("ohoi_request_hotswap_action"))); void * oh_get_indicator_state (void *, SaHpiResourceIdT, SaHpiHsIndicatorStateT *) __attribute__ ((weak, alias("ohoi_get_indicator_state"))); void * oh_set_indicator_state (void *, SaHpiResourceIdT, SaHpiHsIndicatorStateT) __attribute__ ((weak, alias("ohoi_set_indicator_state"))); void * oh_hotswap_policy_cancel (void *, SaHpiResourceIdT, SaHpiTimeoutT) __attribute__ ((weak, alias("ohoi_hotswap_policy_cancel"))); openhpi-2.14.1/plugins/ipmi/atca_fru_rdrs.c0000644000076400007640000015623211302567001015576 0ustar /* -*- linux-c -*- * * Copyright (c) 2005 by Intel Corp. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Vadim Revyakin */ #include "ipmi.h" #include "ekeyfru.h" #include #define uchar unsigned char int ipmicmd_send(ipmi_domain_t *domain, uchar netfn, uchar cmd, uchar lun, uchar chan, uchar *pdata, uchar sdata, ipmi_addr_response_handler_t handler, void *handler_data); int ipmicmd_mc_send(ipmi_mc_t *mc, uchar netfn, uchar cmd, uchar lun, uchar *pdata, uchar sdata, ipmi_mc_response_handler_t handler, void *handler_data); /* * IPMB-0 Sensor */ struct atca_ipmb0_link_num_s { int l_num; int s_num; ipmi_sensor_t *sensor; int done; SaErrorT rv; }; static int get_ipmb0_sensor_num_done( ipmi_domain_t *domain, ipmi_msgi_t *rspi) { struct atca_ipmb0_link_num_s *info = rspi->data1; ipmi_msg_t *msg = &rspi->msg; int rv = msg->data[0]; dbg("get ipmb link info(%d) for sensor 0x%x: %02x %02x %02x %02x", msg->data_len, info->s_num, msg->data[0], msg->data[1], msg->data[2], msg->data[3]); if (domain == NULL) { info->rv = SA_ERR_HPI_INVALID_PARAMS; info->done = 1; return IPMI_MSG_ITEM_NOT_USED; } if (rv == 0xc1) { info->rv = SA_ERR_HPI_INVALID_CMD; } else if (rv == 0xc3) { info->rv = SA_ERR_HPI_NO_RESPONSE; } else if (rv != 0) { info->rv = SA_ERR_HPI_INVALID_PARAMS; } else { info->l_num = msg->data[2]; } info->done = 1; return IPMI_MSG_ITEM_NOT_USED; }; static void get_ipmb0_sensor_num_cb( ipmi_domain_t *domain, void *cb_data) { struct atca_ipmb0_link_num_s *info = cb_data; unsigned char data[16]; int rv; ipmi_sensor_id_t sid = ipmi_sensor_convert_to_id(info->sensor); info->s_num = sid.sensor_num; data[0] = 0; // PICMB Identifier; data[1] = 0x01; // next byte contains sensor number data[2] = sid.sensor_num; rv = ipmicmd_send(domain, 0x2c, 0x18, sid.lun, sid.mcid.channel, data, 3, get_ipmb0_sensor_num_done, cb_data); if (rv != 0) { err("ipmicmd_send = 0x%x", rv); OHOI_MAP_ERROR(info->rv, rv); return; } else { dbg("get ipmb link info send(0x%x 0x%x): %02x %02x %02x", sid.lun, sid.mcid.channel, data[0], data[1], data[2]); } return; } static int get_ipmb0_sensor_num(struct oh_handler_state *handler, ipmi_sensor_t *sensor, SaHpiSensorNumT *snump) { struct ohoi_handler *ipmi_handler = handler->data; struct atca_ipmb0_link_num_s info; ipmi_entity_t *entity = ipmi_sensor_get_entity(sensor); int rv; if (ipmi_handler->d_type != IPMI_DOMAIN_TYPE_ATCA) { return 1; } if (ipmi_entity_get_entity_id(entity) != 0xf0) { // it is not shelf manager *snump = ATCAHPI_SENSOR_NUM_IPMB0; return 0; } info.done = 0; info.sensor = sensor; info.rv = SA_OK; rv = ipmi_domain_pointer_cb(ipmi_handler->domain_id, get_ipmb0_sensor_num_cb, &info); if (rv != 0) { err("ipmi_domain_pointer_cb = 0x%x", rv); return 1; } rv = ohoi_loop(&info.done, ipmi_handler); if (rv != SA_OK) { err("ohoi_loop = 0x%x", rv); return 1; } if (info.rv != SA_OK) { err("info.rv = 0x%x", info.rv); return 1; } *snump = ATCAHPI_SENSOR_NUM_IPMB0 + info.l_num; return 0; } static SaHpiEventStateT ipmb0_sensor_events_to_hpi(SaHpiEventStateT ev) { SaHpiEventStateT newev = 0; if (ev & 0x01) { newev |= SAHPI_ES_NON_REDUNDANT_INSUFFICIENT_RESOURCES; } if ((ev & 0x02) || (ev & 0x04)) { newev |= SAHPI_ES_NON_REDUNDANT_SUFFICIENT_RESOURCES; } if (ev & 0x08) { newev |= SAHPI_ES_FULLY_REDUNDANT; } return newev; } static SaHpiEventStateT ipmb0_sensor_events_to_ipmi(SaHpiEventStateT ev) { SaHpiEventStateT newev = 0; if (ev & SAHPI_ES_NON_REDUNDANT_INSUFFICIENT_RESOURCES) { newev |= 0x01; } if (ev & SAHPI_ES_NON_REDUNDANT_SUFFICIENT_RESOURCES) { newev |= 0x06; } if (ev & SAHPI_ES_FULLY_REDUNDANT) { newev |= 0x08; } return newev; } static SaErrorT get_ipmb0_sensor_reading( struct oh_handler_state *handler, struct ohoi_sensor_info *sinfo, SaHpiSensorReadingT * reading, SaHpiEventStateT * ev_state) { SaHpiEventStateT tmp_state; SaErrorT rv; rv = orig_get_sensor_reading(handler, sinfo, reading, &tmp_state); if (rv != SA_OK) { return rv; } *ev_state = ipmb0_sensor_events_to_hpi(tmp_state); return SA_OK; } static SaErrorT get_ipmb0_sensor_event_enable( struct oh_handler_state *handler, struct ohoi_sensor_info *sinfo, SaHpiBoolT *enable, SaHpiEventStateT *assert, SaHpiEventStateT *deassert) { SaHpiEventStateT tmp_assert; SaHpiEventStateT tmp_deassert; SaErrorT rv; rv = orig_get_sensor_event_enable(handler, sinfo, enable, &tmp_assert, &tmp_deassert); if (rv != SA_OK) { return rv; } *assert = ipmb0_sensor_events_to_hpi(tmp_assert); *deassert = ipmb0_sensor_events_to_hpi(tmp_deassert); return SA_OK; } static SaErrorT set_ipmb0_sensor_event_enable( struct oh_handler_state *handler, struct ohoi_sensor_info *sinfo, SaHpiBoolT enable, SaHpiEventStateT assert, SaHpiEventStateT deassert, unsigned int a_supported, unsigned int d_supported) { return orig_set_sensor_event_enable(handler, sinfo, enable, ipmb0_sensor_events_to_ipmi(assert), ipmb0_sensor_events_to_ipmi(deassert), a_supported, d_supported); } void adjust_sensor_to_atcahpi_spec(struct oh_handler_state *handler, SaHpiRptEntryT *rpt, SaHpiRdrT *rdr, struct ohoi_sensor_info *sensor_info, ipmi_sensor_t *sensor) { struct ohoi_handler *ipmi_handler = handler->data; SaHpiSensorRecT *rec = &rdr->RdrTypeUnion.SensorRec; if (!IS_ATCA(ipmi_handler->d_type)) { return; } if (ipmi_sensor_get_sensor_type(sensor) == 0xf0) { // ATCA hot swap sensor rec->Type = SAHPI_OEM_SENSOR; rec->Category = SAHPI_EC_GENERIC; return; } if (ipmi_sensor_get_sensor_type(sensor) != 0xf1) { // not IPMB-0 sensor return; } if (get_ipmb0_sensor_num(handler, sensor, &rec->Num) != 0) { err("Couldn't get IPMB-0 sensor link. #%d for resource %d", rec->Num, rpt->ResourceId); return; } rec->Type = SAHPI_OEM_SENSOR; rec->Category = SAHPI_EC_REDUNDANCY; rec->Events = SAHPI_ES_FULLY_REDUNDANT | SAHPI_ES_NON_REDUNDANT_SUFFICIENT_RESOURCES | SAHPI_ES_NON_REDUNDANT_INSUFFICIENT_RESOURCES; sensor_info->ohoii.get_sensor_event_enable = get_ipmb0_sensor_event_enable; sensor_info->ohoii.set_sensor_event_enable = set_ipmb0_sensor_event_enable; sensor_info->ohoii.get_sensor_reading = get_ipmb0_sensor_reading; } /* * IPMB-0 State Control */ struct set_ipmb0_state_control_s { unsigned char a; unsigned char b; unsigned char chan; int done; SaErrorT rv; }; static void _set_ipmb0_state_control_cb( ipmi_mc_t *mc, ipmi_msg_t *msg, void *rsp_data) { struct set_ipmb0_state_control_s *info = rsp_data; int rv = msg->data[0]; dbg("set IPMB state response(%d): %02x\n", msg->data_len, rv); if (mc == NULL) { info->rv = SA_ERR_HPI_ENTITY_NOT_PRESENT; info->done = 1; return; } if (rv == 0xc1) { info->rv = SA_ERR_HPI_INVALID_CMD; } else if (rv == 0xc3) { info->rv = SA_ERR_HPI_NO_RESPONSE; } else if (rv != 0) { info->rv = SA_ERR_HPI_INVALID_PARAMS; } info->done = 1; return; }; static void set_ipmb0_state_control_cb( ipmi_mc_t *mc, void *cb_data) { struct set_ipmb0_state_control_s *info = cb_data; unsigned char data[16]; int rv; data[0] = 0; data[1] = info->a; data[2] = info->b; dbg("set IPMB state to MC (%d, %d) : %02x %02x %02x", ipmi_mc_get_channel(mc), ipmi_mc_get_address(mc), data[0], data[1], data[2]); rv = ipmicmd_mc_send(mc, 0x2c, 0x09, 0, data, 3, _set_ipmb0_state_control_cb, cb_data); if (rv != 0) { err("ipmicmd_send = 0x%x", rv); OHOI_MAP_ERROR(info->rv, rv); info->done =1; return; } return; } static SaErrorT set_ipmb0_state_control_state( struct oh_handler_state *hnd, struct ohoi_control_info *c, SaHpiRdrT * rdr, SaHpiCtrlModeT mode, SaHpiCtrlStateT *state) { struct set_ipmb0_state_control_s info; struct ohoi_handler *ipmi_handler = (struct ohoi_handler *)hnd->data; SaErrorT rv; struct ohoi_resource_info *res_info; unsigned int link_num; unsigned char on; if (state && state->Type != SAHPI_CTRL_TYPE_ANALOG) { err("wrong state Type : %d", state->Type); return SA_ERR_HPI_INVALID_DATA; } res_info = oh_get_resource_data(hnd->rptcache, c->info.atcamap_ctrl_info.val); if (res_info == NULL) { err("No res_info"); return SA_ERR_HPI_INTERNAL_ERROR; } if (!(res_info->type & OHOI_RESOURCE_MC)) { err("resource not MC"); return SA_ERR_HPI_INTERNAL_ERROR; } link_num = state ? state->StateUnion.Analog : 0; if (link_num > rdr->RdrTypeUnion.CtrlRec.TypeUnion.Analog.Max) { err("Wrong analog value: %d > %d", link_num, rdr->RdrTypeUnion.CtrlRec.TypeUnion.Analog.Max); return SA_ERR_HPI_INVALID_DATA; } on = (mode == SAHPI_CTRL_MODE_AUTO) ? 1 : 0; if (rdr->RdrTypeUnion.CtrlRec.Num == ATCAHPI_CTRL_NUM_IPMB_A_STATE) { info.b = 0xFF; info.a = (link_num << 1) | on; } else if (rdr->RdrTypeUnion.CtrlRec.Num == ATCAHPI_CTRL_NUM_IPMB_B_STATE) { info.a = 0xFF; info.b = (link_num << 1) | on; } else { err("Not IPMB state control: 0x%x", rdr->RdrTypeUnion.CtrlRec.Num); return SA_ERR_HPI_INTERNAL_ERROR; } info.done = 0; info.rv = SA_OK; rv = ipmi_mc_pointer_cb(res_info->u.entity.mc_id, set_ipmb0_state_control_cb, &info); if (rv != 0) { err("ipmi_mc_pointer_cb = 0x%x", rv); return SA_ERR_HPI_INVALID_CMD; } rv = ohoi_loop(&info.done, ipmi_handler); if (rv != SA_OK) { err("ohoi_loop = 0x%x", rv); return rv; } if (info.rv != SA_OK) { err("info.rv = 0x%x", info.rv); return rv; } return SA_OK; } static SaHpiRdrT *create_ipmb0_state_control( struct ohoi_handler *ipmi_handler, SaHpiRptEntryT *rpt, struct ohoi_control_info **ctrl_info, int bus_A, SaHpiCtrlStateAnalogT max_link ) { SaHpiRdrT *rdr; struct ohoi_control_info *c_info; rdr = malloc(sizeof (*rdr)); if (rdr == NULL) { err("Out of memory"); return NULL; } c_info = malloc(sizeof (*c_info)); if (rdr == NULL) { err("Out of memory"); free(rdr); return NULL; } memset(rdr, 0, sizeof (*rdr)); memset(c_info, 0, sizeof (*c_info)); rdr->RdrType = SAHPI_CTRL_RDR; rdr->IsFru = SAHPI_FALSE; rdr->Entity = rpt->ResourceEntity; rdr->RdrTypeUnion.CtrlRec.Num = bus_A ? ATCAHPI_CTRL_NUM_IPMB_A_STATE : ATCAHPI_CTRL_NUM_IPMB_B_STATE; rdr->RdrTypeUnion.CtrlRec.OutputType = SAHPI_CTRL_GENERIC; rdr->RdrTypeUnion.CtrlRec.Type = SAHPI_CTRL_TYPE_ANALOG; rdr->RdrTypeUnion.CtrlRec.TypeUnion.Analog.Min = 0x00; rdr->RdrTypeUnion.CtrlRec.TypeUnion.Analog.Max = max_link; rdr->RdrTypeUnion.CtrlRec.TypeUnion.Analog.Default = 0x00; rdr->RdrTypeUnion.CtrlRec.DefaultMode.ReadOnly = SAHPI_FALSE; rdr->RdrTypeUnion.CtrlRec.DefaultMode.Mode = SAHPI_CTRL_MODE_AUTO; rdr->RdrTypeUnion.CtrlRec.WriteOnly = SAHPI_TRUE; oh_init_textbuffer(&rdr->IdString); if (bus_A) { oh_append_textbuffer(&rdr->IdString, "IPMB-A State Control"); } else { oh_append_textbuffer(&rdr->IdString, "IPMB-B State Control"); } c_info->ohoii.get_control_state = NULL; c_info->ohoii.set_control_state = set_ipmb0_state_control_state; c_info->mode = SAHPI_CTRL_MODE_AUTO; c_info->info.atcamap_ctrl_info.val = rpt->ResourceId; *ctrl_info = c_info; return rdr; } void ohoi_create_ipmb0_controls(struct oh_handler_state *handler, ipmi_entity_t *entity, unsigned int max) { ipmi_entity_id_t entity_id = ipmi_entity_convert_to_id(entity); SaHpiRptEntryT *rpt; struct ohoi_resource_info *res_info; SaHpiRdrT *rdr; struct ohoi_control_info *ctrl_info; rpt = ohoi_get_resource_by_entityid(handler->rptcache, &entity_id); if (rpt == NULL) { err("couldn't find out resource"); return; } res_info = oh_get_resource_data(handler->rptcache, rpt->ResourceId); if (res_info == NULL) { err("couldn't find out res_info"); return; } //printf(" ################ create ipmb0_controls for Resource %d; num links = %d\n", rpt->ResourceId, max); rdr = create_ipmb0_state_control(handler->data, rpt, &ctrl_info, 1, max); if (rdr != NULL && (oh_add_rdr(handler->rptcache, rpt->ResourceId, rdr, ctrl_info, 1) != SA_OK)) { err("couldn't add control rdr"); free(rdr); free(ctrl_info); } else { rpt->ResourceCapabilities |= SAHPI_CAPABILITY_CONTROL | SAHPI_CAPABILITY_RDR; } rdr = create_ipmb0_state_control(handler->data, rpt, &ctrl_info, 0, max); if (rdr != NULL && (oh_add_rdr(handler->rptcache, rpt->ResourceId, rdr, ctrl_info, 1) != SA_OK)) { err("couldn't add control rdr"); free(rdr); free(ctrl_info); } else { rpt->ResourceCapabilities |= SAHPI_CAPABILITY_CONTROL | SAHPI_CAPABILITY_RDR; res_info->type |= OHOI_MC_IPMB0_CONTROL_CREATED; } } /* * FRU Management Controller Reset Control */ static SaErrorT get_fru_mc_reset_control_state( struct oh_handler_state *hnd, struct ohoi_control_info *c, SaHpiRdrT * rdr, SaHpiCtrlModeT *mode, SaHpiCtrlStateT *state) { return SA_ERR_HPI_INVALID_CMD; } struct mc_reset_info { int done; SaErrorT rv; SaHpiCtrlStateAnalogT val; }; static void reset_mc_done (ipmi_mc_t *mc, int err, void *cb_data) { struct mc_reset_info *info = cb_data; info->done = 1; if (err) { err("reset_mc_done err = %d", err); info->rv = SA_ERR_HPI_INVALID_REQUEST; } } static void set_mc_reset_state(ipmi_mc_t *mc, void *cb_data) { struct mc_reset_info *info = cb_data; int rv; int act; if (info->val == 1) { act = IPMI_MC_RESET_COLD; } else if (info->val == 2) { act = IPMI_MC_RESET_WARM; } else { info->rv = SA_ERR_HPI_INVALID_CMD; info->done = 1; return; } rv = ipmi_mc_reset(mc, act, reset_mc_done, cb_data); if (rv) { err("ipmi_mc_reset returned err = %d", rv); info->rv = SA_ERR_HPI_INVALID_REQUEST; info->done = 1; } } static SaErrorT set_fru_mc_reset_control_state( struct oh_handler_state *hnd, struct ohoi_control_info *c, SaHpiRdrT * rdr, SaHpiCtrlModeT mode, SaHpiCtrlStateT *state) { struct mc_reset_info info; struct ohoi_handler *ipmi_handler = (struct ohoi_handler *)hnd->data; SaErrorT rv; struct ohoi_resource_info *res_info; SaHpiCtrlStateAnalogT val; if (mode == SAHPI_CTRL_MODE_AUTO) { return SA_ERR_HPI_READ_ONLY; } if (state->Type != SAHPI_CTRL_TYPE_ANALOG) { err("wrong state Type : %d", state->Type); return SA_ERR_HPI_INVALID_DATA; } res_info = oh_get_resource_data(hnd->rptcache, c->info.atcamap_ctrl_info.val); if (res_info == NULL) { err("No res_info"); return SA_ERR_HPI_INTERNAL_ERROR; } if (!(res_info->type & OHOI_RESOURCE_MC)) { err("resource not MC"); return SA_ERR_HPI_INTERNAL_ERROR; } val = state->StateUnion.Analog; if ((val != 1) && (val != 2)) { err("wrong state value %d", val); return SA_ERR_HPI_INVALID_DATA; } info.done = 0; info.rv = SA_OK; info.val = val; rv = ipmi_mc_pointer_cb(res_info->u.entity.mc_id, set_mc_reset_state, &info); if (rv != 0) { err("ipmi_mc_pointer_cb = 0x%x", rv); return SA_ERR_HPI_INVALID_CMD; } rv = ohoi_loop(&info.done, ipmi_handler); if (rv != SA_OK) { err("ohoi_loop = 0x%x", rv); return rv; } if (info.rv != SA_OK) { err("info.rv = 0x%x", info.rv); return rv; } return SA_OK; } static SaHpiRdrT *create_fru_mc_reset_control( struct ohoi_handler *ipmi_handler, SaHpiRptEntryT *rpt, struct ohoi_control_info **ctrl_info ) { SaHpiRdrT *rdr; struct ohoi_control_info *c_info; rdr = malloc(sizeof (*rdr)); if (rdr == NULL) { err("Out of memory"); return NULL; } c_info = malloc(sizeof (*c_info)); if (rdr == NULL) { err("Out of memory"); free(rdr); return NULL; } memset(rdr, 0, sizeof (*rdr)); memset(c_info, 0, sizeof (*c_info)); rdr->RdrType = SAHPI_CTRL_RDR; rdr->IsFru = SAHPI_FALSE; rdr->Entity = rpt->ResourceEntity; rdr->RdrTypeUnion.CtrlRec.Num = ATCAHPI_CTRL_NUM_FRU_IPMC_RESET; rdr->RdrTypeUnion.CtrlRec.OutputType = SAHPI_CTRL_GENERIC; rdr->RdrTypeUnion.CtrlRec.Type = SAHPI_CTRL_TYPE_ANALOG; rdr->RdrTypeUnion.CtrlRec.TypeUnion.Analog.Min = 0x01; rdr->RdrTypeUnion.CtrlRec.TypeUnion.Analog.Max = 0x02; rdr->RdrTypeUnion.CtrlRec.TypeUnion.Analog.Default = 0x01; rdr->RdrTypeUnion.CtrlRec.DefaultMode.ReadOnly = SAHPI_TRUE; rdr->RdrTypeUnion.CtrlRec.DefaultMode.Mode = SAHPI_CTRL_MODE_MANUAL; rdr->RdrTypeUnion.CtrlRec.WriteOnly = SAHPI_TRUE; oh_init_textbuffer(&rdr->IdString); oh_append_textbuffer(&rdr->IdString, "FRU Management Controller Reset Control"); c_info->ohoii.get_control_state = get_fru_mc_reset_control_state; c_info->ohoii.set_control_state = set_fru_mc_reset_control_state; c_info->mode = SAHPI_CTRL_MODE_MANUAL; c_info->info.atcamap_ctrl_info.val = rpt->ResourceId; *ctrl_info = c_info; return rdr; } void ohoi_create_fru_mc_reset_control(struct oh_handler_state *handler, SaHpiResourceIdT rid) { // struct ohoi_handler *ipmi_handler = handler->data; SaHpiRptEntryT *rpt; struct ohoi_resource_info *res_info; SaHpiRdrT *rdr; struct ohoi_control_info *c_info; int rv; rpt = oh_get_resource_by_id(handler->rptcache, rid); if (rpt == NULL) { err("No rpt = %d", rid); return; } res_info = oh_get_resource_data(handler->rptcache, rpt->ResourceId); if (res_info == NULL) { err("No res_info for rpt = %d", rid); return; } rdr = create_fru_mc_reset_control(handler->data, rpt, &c_info); if (rdr == NULL) { err("could not create fan control"); return; } rv = oh_add_rdr(handler->rptcache,rpt->ResourceId, rdr, c_info, 1); if (rv != SA_OK) { err("couldn't add control rdr"); free(rdr); free(c_info); return; } rpt->ResourceCapabilities |= SAHPI_CAPABILITY_CONTROL | SAHPI_CAPABILITY_RDR; res_info->type |= OHOI_MC_RESET_CONTROL_CREATED; } /* * FAN Control */ static SaErrorT get_fan_control_state( struct oh_handler_state *hnd, struct ohoi_control_info *c, SaHpiRdrT * rdr, SaHpiCtrlModeT *mode, SaHpiCtrlStateT *state); static SaErrorT set_fan_control_state( struct oh_handler_state *hnd, struct ohoi_control_info *c, SaHpiRdrT * rdr, SaHpiCtrlModeT mode, SaHpiCtrlStateT *state); struct fan_control_s { unsigned char min; unsigned char max; unsigned char normal; unsigned char local; unsigned char device_id; SaErrorT rv; int done; }; static void get_fan_speed_properties_done( ipmi_mc_t *mc, ipmi_msg_t *msg, void *rsp_data) { struct fan_control_s *info = rsp_data; dbg("get fan speed properties response(%d): %02x %02x %02x " "%02x %02x %02x\n", msg->data_len, msg->data[0], msg->data[1], msg->data[2], msg->data[3], msg->data[4], msg->data[5]); if (mc == NULL) { info->rv = SA_ERR_HPI_INVALID_PARAMS; info->done = 1; return; } if (msg->data[0] != 0) { info->rv = SA_ERR_HPI_INVALID_PARAMS; } else { info->min = msg->data[2]; info->max = msg->data[3]; info->normal = msg->data[4]; } info->done = 1; }; static void get_fan_speed_properties(ipmi_mc_t *mc, void *cb_data) { struct fan_control_s *info = cb_data; unsigned char data[16]; int rv; info->device_id = 0; data[0] = 0; data[1] = (unsigned char)info->device_id; dbg("get fan properties (%d, %d) : %02x %02x", ipmi_mc_get_channel(mc), ipmi_mc_get_address(mc), data[0], data[1]); rv = ipmicmd_mc_send(mc, 0x2c, 0x14, 0, data, 2, get_fan_speed_properties_done, cb_data); if (rv != 0) { err("ipmicmd_send = 0x%x", rv); info->rv = rv; info->done = 1; return; } return; } static SaHpiRdrT *create_fan_control( struct oh_handler_state *handler, SaHpiRptEntryT *rpt, struct ohoi_control_info **ctrl_info ) { SaHpiRdrT *rdr; struct ohoi_control_info *c_info; struct ohoi_resource_info *res_info; // struct ohoi_handler *ipmi_handler = handler->data; struct fan_control_s info; int rv; res_info = oh_get_resource_data(handler->rptcache, rpt->ResourceId); if (res_info == NULL) { err("res_info == NULL ?"); return NULL; } if (!(res_info->type & OHOI_RESOURCE_MC)) { err("only intelligent fru supported now"); return NULL; } // determine max, min, default values info.rv = SA_OK; info.done = 0; rv = ipmi_mc_pointer_cb(res_info->u.entity.mc_id, get_fan_speed_properties, &info); if (rv != 0) { err("ipmi_pointer_entity_cb = %d", rv); return NULL; } rv = ohoi_loop(&info.done, handler->data); if (rv != SA_OK) { err("ohoi_loop = %d", rv); return NULL; } if (info.rv != 0) { err("info.rv = %d", info.rv); return NULL; } rdr = malloc(sizeof (*rdr)); if (rdr == NULL) { err("Out of memory"); return NULL; } c_info = malloc(sizeof (*c_info)); if (rdr == NULL) { err("Out of memory"); free(rdr); return NULL; } memset(rdr, 0, sizeof (*rdr)); memset(c_info, 0, sizeof (*c_info)); rdr->RdrType = SAHPI_CTRL_RDR; rdr->IsFru = SAHPI_FALSE; rdr->Entity = rpt->ResourceEntity; rdr->RdrTypeUnion.CtrlRec.Num = ATCAHPI_CTRL_NUM_FAN_SPEED; rdr->RdrTypeUnion.CtrlRec.OutputType = SAHPI_CTRL_FAN_SPEED; rdr->RdrTypeUnion.CtrlRec.Type = SAHPI_CTRL_TYPE_ANALOG; rdr->RdrTypeUnion.CtrlRec.TypeUnion.Analog.Min = info.min; rdr->RdrTypeUnion.CtrlRec.TypeUnion.Analog.Max = info.max; rdr->RdrTypeUnion.CtrlRec.TypeUnion.Analog.Default = info.normal; rdr->RdrTypeUnion.CtrlRec.DefaultMode.ReadOnly = SAHPI_TRUE; rdr->RdrTypeUnion.CtrlRec.DefaultMode.Mode = SAHPI_CTRL_MODE_AUTO; rdr->RdrTypeUnion.CtrlRec.WriteOnly = SAHPI_FALSE; oh_init_textbuffer(&rdr->IdString); oh_append_textbuffer(&rdr->IdString, "Fan Control"); c_info->ohoii.get_control_state = get_fan_control_state; c_info->ohoii.set_control_state = set_fan_control_state; c_info->mode = SAHPI_CTRL_MODE_AUTO; c_info->info.atcamap_ctrl_info.val = rpt->ResourceId; *ctrl_info = c_info; return rdr; } void ohoi_create_fan_control(struct oh_handler_state *handler, SaHpiResourceIdT rid) { // struct ohoi_handler *ipmi_handler = handler->data; SaHpiRptEntryT *rpt; SaHpiRdrT *rdr; struct ohoi_control_info *c_info; int rv; rpt = oh_get_resource_by_id(handler->rptcache, rid); if (rpt == NULL) { err("No rpt = %d", rid); return; } rdr = create_fan_control(handler, rpt, &c_info); if (rdr == NULL) { err("could not create fan control"); return; } rv = oh_add_rdr(handler->rptcache,rpt->ResourceId, rdr, c_info, 1); if (rv != SA_OK) { err("couldn't add control rdr"); free(rdr); free(c_info); return; } rpt->ResourceCapabilities |= SAHPI_CAPABILITY_CONTROL | SAHPI_CAPABILITY_RDR; } static void get_fan_control_state_done( ipmi_mc_t *mc, ipmi_msg_t *msg, void *rsp_data) { struct fan_control_s *info = rsp_data; dbg("get fan level response(%d): %02x %02x %02x %02x\n", msg->data_len, msg->data[0], msg->data[1], msg->data[2], msg->data[3]); if (mc == NULL) { info->rv = SA_ERR_HPI_INVALID_PARAMS; info->done = 1; return; } if (msg->data[0] != 0) { info->rv = SA_ERR_HPI_INVALID_PARAMS; } else { info->local = msg->data[3]; info->normal = msg->data[2]; } info->done = 1; }; static void get_fan_control_state_cb(ipmi_mc_t *mc, void *cb_data) { struct fan_control_s *info = cb_data; unsigned char data[16]; int rv; info->device_id = 0; data[0] = 0; data[1] = (unsigned char)info->device_id; dbg("get fan level (%d, %d) : %02x %02x", ipmi_mc_get_channel(mc), ipmi_mc_get_address(mc), data[0], data[1]); rv = ipmicmd_mc_send(mc, 0x2c, 0x16, 0, data, 2, get_fan_control_state_done, cb_data); if (rv != 0) { err("ipmicmd_send = 0x%x", rv); info->rv = rv; info->done = 1; return; } return; } static SaErrorT get_fan_control_state( struct oh_handler_state *handler, struct ohoi_control_info *c, SaHpiRdrT * rdr, SaHpiCtrlModeT *mode, SaHpiCtrlStateT *state) { // struct ohoi_handler *ipmi_handler = handler->data; struct ohoi_resource_info *res_info; struct fan_control_s info; int rv; if (state == NULL) { goto no_state; } res_info = oh_get_resource_data(handler->rptcache, c->info.atcamap_ctrl_info.val); if (res_info == NULL) { err("res_info == NULL ?"); return SA_ERR_HPI_INVALID_RESOURCE; } if (!(res_info->type & OHOI_RESOURCE_MC)) { err("only intelligent fru supported now"); return SA_ERR_HPI_UNSUPPORTED_API; } info.rv = SA_OK; info.done = 0; rv = ipmi_mc_pointer_cb(res_info->u.entity.mc_id, get_fan_control_state_cb, &info); if (rv != 0) { err("ipmi_pointer_entity_cb = %d", rv); return SA_ERR_HPI_ENTITY_NOT_PRESENT; } rv = ohoi_loop(&info.done, handler->data); if (rv != SA_OK) { err("ohoi_loop = %d", rv); return SA_ERR_HPI_ENTITY_NOT_PRESENT; } if (info.rv != 0) { err("info.rv = %d", info.rv); return SA_ERR_HPI_ENTITY_NOT_PRESENT; } state->Type = SAHPI_CTRL_TYPE_ANALOG; state->StateUnion.Analog = info.normal; no_state : if (mode) { *mode = c->mode; } return SA_OK; } static SaErrorT set_fan_control_state( struct oh_handler_state *hnd, struct ohoi_control_info *c, SaHpiRdrT * rdr, SaHpiCtrlModeT mode, SaHpiCtrlStateT *state) { if (mode == SAHPI_CTRL_MODE_AUTO) { return SA_OK; } return SA_ERR_HPI_READ_ONLY; } /* * Ekeying Link State Sensor */ static SaErrorT get_ekeying_link_state_sensor_event_enable( struct oh_handler_state *hnd, struct ohoi_sensor_info *sinfo, SaHpiBoolT *enable, SaHpiEventStateT *assert, SaHpiEventStateT *deassert) { *assert = 0; *deassert = 0; *enable = 0; return SA_OK; } typedef struct { unsigned char channel; SaHpiUint8T *buffer; SaHpiEventStateT state; int done; SaErrorT rv; } ekey_sen_reading_info_t; static void get_ekeying_link_state_sensor_reading_done( ipmi_mc_t *mc, ipmi_msg_t *msg, void *rsp_data) { ekey_sen_reading_info_t *info = rsp_data; int rv = msg->data[0]; unsigned char *data = msg->data; SaHpiUint8T *buffer = info->buffer; unsigned char link_enabled = 0; unsigned char *buf; unsigned char chn; unsigned char ip; unsigned char chns[4] = {0, 0, 0, 0}; unsigned char order[4] = {0, 0, 0, 0}; dbg("get IPMB state response(%d): %02x\n", msg->data_len, rv); //printf("get IPMB state response: %02x %02x %02x %02x %02x %02x %02x\n", //data[0], data[1], data[2], data[3], data[4], data[05], data[6]); if (mc == NULL) { info->rv = SA_ERR_HPI_ENTITY_NOT_PRESENT; info->done = 1; return; } if (rv == 0xc1) { info->rv = SA_ERR_HPI_INVALID_CMD; } else if (rv == 0xc3) { info->rv = SA_ERR_HPI_NO_RESPONSE; } else if (rv != 0) { info->rv = SA_ERR_HPI_INVALID_PARAMS; } if (rv != 0) { info->done = 1; return; } if (msg->data_len < 7) { info->rv = SA_ERR_HPI_NO_RESPONSE; goto out; } memset(buffer, 0, SAHPI_SENSOR_BUFFER_LENGTH); // first link ip = 2; // index to ports for first channel buf = data + 2; chn = CHANNEL_NUM(buf); if (chn == 0 || chn > 16) { err("wrong channel %d for Link 1", chn); info->rv = SA_ERR_HPI_NO_RESPONSE; goto out; } if (chn <= 8) { buffer[0] = 1 << (chn - 1); } else { buffer[1] = 1 << (chn - 9); } order[0] = ip; buffer[5] = LINK_GROUPING_ID(buf); buffer[4] = LINK_TYPE_EXTENSION(buf); buffer[3] = LINK_TYPE(buf); buffer[2] = INTERFACE_TYPE(buf); link_enabled = data[6]; if (msg->data_len < 12) { goto out; } // second link ip = 7; // index to ports for second channel buf = data + 7; chn = CHANNEL_NUM(buf); if (chn == 0 || chn > 16) { err("wrong channel %d for Link 2", chn); info->rv = SA_ERR_HPI_NO_RESPONSE; goto out; } if (chn > chns[0]) { chns[1] = chn; order[1] = ip; } else { chns[1] = chns[0]; order[1] = order[0]; chns[0] = chn; order[0] = ip; } if (chn <= 8) { buffer[0] |= 1 << (chn - 1); } else { buffer[1] |= 1 << (chn - 9); } link_enabled |= data[11]; if (msg->data_len < 17) { goto out; } // third link ip = 12; // index to ports for third channel buf = data + 12; chn = CHANNEL_NUM(buf); if (chn == 0 || chn > 16) { err("wrong channel %d for Link 2", chn); info->rv = SA_ERR_HPI_NO_RESPONSE; goto out; } if (chn > chns[1]) { chns[2] = chn; order[2] = ip; } else { chns[2] = chns[1]; order[2] = order[1]; if (chn > chns[0]) { chns[1] = chn; order[1] = ip; } else { chns[1] = chns[0]; order[1] = order[0]; chns[0] = chn; order[0] = ip; } } if (chn <= 8) { buffer[0] |= 1 << (chn - 1); } else { buffer[1] |= 1 << (chn - 9); } link_enabled |= data[16]; if (msg->data_len < 22) { goto out; } // forth link ip = 17; // index to ports for forth cahannel buf = data + 17; chn = CHANNEL_NUM(buf); if (chn == 0 || chn > 16) { err("wrong channel %d for Link 2", chn); info->rv = SA_ERR_HPI_NO_RESPONSE; goto out; } if (chn > chns[2]) { chns[3] = chn; order[3] = ip; } else { chns[3] = chns[2]; order[3] = order[2]; if (chn > chns[1]) { chns[2] = chn; order[2] = ip; } else { chns[2] = chns[1]; order[2] = order[1]; if (chn > chns[0]) { chns[1] = chn; order[1] = ip; } else { chns[1] = chns[0]; order[1] = order[0]; chns[0] = chn; order[0] = ip; } } } if (chn <= 8) { buffer[0] |= 1 << (chn - 1); } else { buffer[1] |= 1 << (chn - 9); } link_enabled |= data[21]; // It will be fine to check all links have the same // gpouping_id, link_type, link_type_extension, interface_type // and enable bit. XXXX out: if (info->rv == 0) { // now fill in port map fields if (order[0] > 0) { buffer[6] = PORTS(data + order[0]); } if (order[1] > 0) { buffer[6] |= (PORTS(data + order[1]) << 4); } if (order[2] > 0) { buffer[7] = PORTS(data + order[2]); } if (order[3] > 0) { buffer[7] |= (PORTS(data + order[3]) << 4); } info->state = link_enabled ? SAHPI_ES_ENABLED : SAHPI_ES_DISABLED; } #if DEBUG_EKEY printf("E-KEY READING: port map = %02x%02x%02x%02x%02x%02x%02x%02x\n" " Link Grouping Id %02x; Link Type Extension %02x; " "Link Type %02x; Intrface Type %02x; Channel Map %02x%02x\n", buffer[13], buffer[12], buffer[11], buffer[10], buffer[ 9], buffer[ 8], buffer[ 7], buffer[ 6], buffer[ 5], buffer[ 4], buffer[ 3], buffer[ 2], buffer[ 1], buffer[ 0]); #endif info->done = 1; }; static void get_ekeying_link_state_sensor_reading_cb(ipmi_mc_t *mc, void *cb_data) { ekey_sen_reading_info_t *info = cb_data; unsigned char data[16]; int rv; data[0] = 0; data[1] = info->channel; dbg("Get Port State to MC (%d, %d) : %02x %02x", ipmi_mc_get_channel(mc), ipmi_mc_get_address(mc), data[0], data[1]); rv = ipmicmd_mc_send(mc, 0x2c, 0x0f, 0, data, 2, get_ekeying_link_state_sensor_reading_done, cb_data); if (rv != 0) { err("ipmicmd_send = 0x%x", rv); OHOI_MAP_ERROR(info->rv, rv); info->done = 1; return; } return; } static SaErrorT get_ekeying_link_state_sensor_reading( struct oh_handler_state *handler, struct ohoi_sensor_info *sensor_info, SaHpiSensorReadingT *reading, SaHpiEventStateT *ev_state) { SaHpiRptEntryT *rpt; struct ohoi_resource_info *res_info; SaHpiRdrT *rdr; ekey_sen_reading_info_t info; int rv; SaHpiUint8T *buf; int i; rpt = oh_get_resource_by_id(handler->rptcache, sensor_info->info.atcamap_sensor_info.val); if (rpt == NULL) { err("no rpt for resource Id %d", sensor_info->info.atcamap_sensor_info.val); return SA_ERR_HPI_ENTITY_NOT_PRESENT; } rdr = ohoi_get_rdr_by_data(handler->rptcache, rpt->ResourceId, SAHPI_SENSOR_RDR, sensor_info); if (rdr == NULL) { err("no rdr for sensor. Rpt %d, sen_info = %p", rpt->ResourceId, sensor_info); return SA_ERR_HPI_ENTITY_NOT_PRESENT; } res_info = oh_get_resource_data(handler->rptcache, rpt->ResourceId); if (res_info == NULL) { err("no res_info"); return SA_ERR_HPI_ENTITY_NOT_PRESENT; } if (!(res_info->type & OHOI_RESOURCE_MC)) { err("resource %d not MC", rpt->ResourceId); return SA_ERR_HPI_ENTITY_NOT_PRESENT; } buf = rdr->RdrTypeUnion.SensorRec.DataFormat.Range. Nominal.Value.SensorBuffer; // calculate the least channel number for (i = 0; i < 8; i++) { if (buf[0] & (1 << i)) { break; } } if (i == 8) { for (i = 0; i < 16; i++) { if (buf[1] & (1 << (i - 8))) { break; } } } if (i == 16) { err("No channels for link"); return SA_ERR_HPI_ERROR; } info.channel = (i + 1) | (buf[2] << 6); info.buffer = reading->Value.SensorBuffer; info.state = 0; info.done = 0; info.rv = SA_OK; rv = ipmi_mc_pointer_cb(res_info->u.entity.mc_id, get_ekeying_link_state_sensor_reading_cb, &info); if (rv != 0) { err("ipmi_mc_pointer_cb = 0x%x", rv); return SA_ERR_HPI_INVALID_CMD; } rv = ohoi_loop(&info.done, handler->data); if (rv != SA_OK) { err("ohoi_loop = 0x%x", rv); return rv; } if (info.rv != SA_OK) { err("info.rv = 0x%x", info.rv); return rv; } if (reading) { memcpy(reading->Value.SensorBuffer + 14, rdr->RdrTypeUnion.SensorRec.DataFormat.Range. Nominal.Value.SensorBuffer + 14, 16); reading->Type = SAHPI_SENSOR_READING_TYPE_BUFFER; reading->IsSupported = SAHPI_TRUE; } if (ev_state) { *ev_state = info.state; } return SA_OK; } void ohoi_create_ekeying_link_state_sensor( struct oh_handler_state *handler, ipmi_entity_t *entity, unsigned int s_num, unsigned char *guid, unsigned char link_grouping_id, unsigned char link_type, unsigned char link_type_extension, unsigned char interface_type, unsigned char *channels) { //printf("Create EKEYING sensor %d for %d. (%d,%d,%d,%d). chan: 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x\n", s_num, ipmi_entity_get_device_address(entity), //link_grouping_id, link_type, link_type_extension, interface_type, //channels[0], channels[1], channels[2], channels[3], channels[4], channels[5], channels[6], channels[7], //channels[8], channels[9], channels[10], channels[11], channels[12], channels[13], channels[14], channels[15]); SaHpiRptEntryT *rpt; struct ohoi_resource_info *res_info; ipmi_entity_id_t entity_id = ipmi_entity_convert_to_id(entity); SaHpiRdrT *rdr; struct ohoi_sensor_info *s_info; SaHpiUint8T *buffer; rpt = ohoi_get_resource_by_entityid(handler->rptcache, &entity_id); if (rpt == NULL) { err("Couldn't find out resource by entity %d.%.d.%d.%d %s", ipmi_entity_get_entity_id(entity), ipmi_entity_get_entity_instance(entity), ipmi_entity_get_device_channel(entity), ipmi_entity_get_device_address(entity), ipmi_entity_get_entity_id_string(entity)); return; } res_info = oh_get_resource_data(handler->rptcache, rpt->ResourceId); if (res_info == NULL) { err("No res_info for resource id = %d", rpt->ResourceId); return; } rdr = malloc(sizeof (*rdr)); if (rdr == NULL) { err("Out of memory"); return; } s_info = malloc(sizeof (*s_info)); if (rdr == NULL) { err("Out of memory"); free(rdr); return; } memset(rdr, 0, sizeof (*rdr)); memset(s_info, 0, sizeof (*s_info)); rdr->RdrType = SAHPI_SENSOR_RDR; rdr->IsFru = SAHPI_FALSE; rdr->Entity = rpt->ResourceEntity; rdr->RdrTypeUnion.SensorRec.Num = OHOI_FIRST_EKEYING_SENSOR_NUM + s_num; rdr->RdrTypeUnion.SensorRec.Type = SAHPI_RESERVED1; rdr->RdrTypeUnion.SensorRec.Category = SAHPI_EC_ENABLE; rdr->RdrTypeUnion.SensorRec.EnableCtrl = SAHPI_FALSE; rdr->RdrTypeUnion.SensorRec.EventCtrl = SAHPI_SEC_PER_EVENT; rdr->RdrTypeUnion.SensorRec.Events = SAHPI_ES_ENABLED | SAHPI_ES_DISABLED; rdr->RdrTypeUnion.SensorRec.ThresholdDefn.IsAccessible = SAHPI_FALSE; rdr->RdrTypeUnion.SensorRec.DataFormat.IsSupported = SAHPI_TRUE; rdr->RdrTypeUnion.SensorRec.DataFormat.ReadingType = SAHPI_SENSOR_READING_TYPE_BUFFER; rdr->RdrTypeUnion.SensorRec.DataFormat.BaseUnits = SAHPI_SU_UNSPECIFIED; rdr->RdrTypeUnion.SensorRec.DataFormat.ModifierUnits = SAHPI_SU_UNSPECIFIED; rdr->RdrTypeUnion.SensorRec.DataFormat.ModifierUse = SAHPI_SMUU_NONE; rdr->RdrTypeUnion.SensorRec.DataFormat.Percentage = SAHPI_FALSE; rdr->RdrTypeUnion.SensorRec.DataFormat.Range.Flags = SAHPI_SRF_NOMINAL; buffer = rdr->RdrTypeUnion.SensorRec.DataFormat.Range. Nominal.Value.SensorBuffer; int i, chn = 0, first_channel = 0; for (i = 0; i < 15; i++) { if (channels[i] == 0) { continue; } if (chn % 2) { buffer[6 + chn / 2] |= (channels[i] << 4); } else { buffer[6 + chn / 2] = channels[i] & 0x0f; } if (i >= 8) { buffer[1] |= 1 << (i - 8); } else { buffer[0] |= 1 << i; } chn++; if (first_channel == 0) { first_channel = i + 1; } } if (first_channel == 0) { err("No channels for sensor"); free(rdr); free(s_info); return; } buffer[2] = interface_type; buffer[3] = link_type; buffer[4] = link_type_extension; buffer[5] = link_grouping_id; if (guid) { memcpy(&buffer[14], guid, 16); } oh_init_textbuffer(&rdr->IdString); char name[256], *nm; nm = name; strncpy(name, "E-Keying Link State: ", 256); snprintf(name, 256, "E-Keying Link State: %d Intrface, Link Type %d," " Link Type Ext %d Channel %d", interface_type, link_type, link_type_extension, first_channel); oh_append_textbuffer(&rdr->IdString, name); s_info->support_assert = 0; s_info->support_deassert = 0; s_info->assert = 0; s_info->deassert = 0; s_info->sen_enabled = SAHPI_TRUE; s_info->enable = SAHPI_FALSE; s_info->info.atcamap_sensor_info.data = rpt; s_info->info.atcamap_sensor_info.val = rpt->ResourceId; // ((interface_type & 3) << 6) | (first_channel & 0x3f); s_info->type = OHOI_SENSOR_ATCA_MAPPED; s_info->ohoii.get_sensor_event_enable = get_ekeying_link_state_sensor_event_enable; s_info->ohoii.set_sensor_event_enable = NULL; s_info->ohoii.get_sensor_reading = get_ekeying_link_state_sensor_reading; s_info->ohoii.get_sensor_thresholds = NULL; s_info->ohoii.set_sensor_thresholds = NULL; if (oh_add_rdr(handler->rptcache, rpt->ResourceId, rdr, s_info, 1) != SA_OK) { err("could not add e-keying link state sensor to rpt id = %d", rpt->ResourceId); free(rdr); free(s_info); return; } rpt->ResourceCapabilities |= SAHPI_CAPABILITY_SENSOR | SAHPI_CAPABILITY_RDR; return; } /* * RPT iterator. It is called after all scannings done. * Create nessesary RDRs are not created yet */ static int ipmb0_state_control_rdr_iterator( struct oh_handler_state *handler, SaHpiRptEntryT *rpt, SaHpiRdrT *rdr, void *cb_data) { int *max = cb_data; int num; if (rdr->RdrType != SAHPI_SENSOR_RDR) { return 0; } num = (int)rdr->RdrTypeUnion.SensorRec.Num; if ((num < ATCAHPI_SENSOR_NUM_IPMB0) || (num > ATCAHPI_SENSOR_NUM_IPMB0 + 0x5F)) { // not IPMB-0 sensor return 0; } if (num > *max + ATCAHPI_SENSOR_NUM_IPMB0) { *max = num - ATCAHPI_SENSOR_NUM_IPMB0; } return 0; } /*--------------------- FRU Reset and Diagnostic Control --------------------*/ struct reset_ctrl_state_s { SaHpiInt32T state; }; static void _set_atca_reset_diagnostic_control_state_cb( ipmi_mc_t *mc, ipmi_msg_t *msg, void *rsp_data) { atca_common_info_t *info = rsp_data; int rv = msg->data[0]; if (mc == NULL) { info->rv = SA_ERR_HPI_ENTITY_NOT_PRESENT; info->done = 1; return; } if (rv == 0xc1) { info->rv = SA_ERR_HPI_INVALID_CMD; } else if (rv == 0xc3) { info->rv = SA_ERR_HPI_NO_RESPONSE; } else if (rv == 0xcc) { info->rv = SA_ERR_HPI_INVALID_REQUEST; } else if (rv != 0) { info->rv = SA_ERR_HPI_INVALID_PARAMS; } info->done = 1; return; }; static void set_atca_reset_diagnostic_control_state_cb(ipmi_mc_t *mc, void *cb_data) { atca_common_info_t *info = cb_data; struct reset_ctrl_state_s *ctrl_state = info->info; unsigned char data[25]; int rv; memset(data, 0, 25); data[0] = IPMI_PICMG_GRP_EXT; data[1] = info->devid; data[2] = ctrl_state->state; rv = ipmicmd_mc_send(mc, IPMI_GROUP_EXTENSION_NETFN, IPMI_PICMG_CMD_FRU_CONTROL, 0, data, 3, _set_atca_reset_diagnostic_control_state_cb, cb_data); if (rv != 0) { err("ipmicmd_send = 0x%x\n", rv); OHOI_MAP_ERROR(info->rv, rv); return; } return; } static SaErrorT set_atca_reset_diagnostic_control_state( struct oh_handler_state *hnd, struct ohoi_control_info *c_info, SaHpiRdrT *rdr, SaHpiCtrlModeT mode, SaHpiCtrlStateT *state) { struct ohoi_handler *ipmi_handler = (struct ohoi_handler *) hnd->data; SaHpiRptEntryT *rpt; struct ohoi_resource_info *res_info, *slot_info; atca_common_info_t info; struct reset_ctrl_state_s ctrl_state; int rv; if (state == NULL) { return SA_ERR_HPI_INVALID_DATA; } if (state->Type != SAHPI_CTRL_TYPE_ANALOG) { return SA_ERR_HPI_INVALID_DATA; } rpt = oh_get_resource_by_id(hnd->rptcache, c_info->info.atcamap_ctrl_info.rid); if (rpt == NULL) { return SA_ERR_HPI_INTERNAL_ERROR; } res_info = oh_get_resource_data(hnd->rptcache, c_info->info.atcamap_ctrl_info.rid); if (res_info == NULL) { return SA_ERR_HPI_INTERNAL_ERROR; } slot_info = oh_get_resource_data(hnd->rptcache, ohoi_get_parent_id(rpt)); if (slot_info == NULL) { return SA_ERR_HPI_INTERNAL_ERROR; } info.done = 0; info.rv = SA_OK; info.addr = slot_info->u.slot.addr; info.devid = slot_info->u.slot.devid; ctrl_state.state = state->StateUnion.Analog + 1; info.info = &ctrl_state; rv = ipmi_mc_pointer_cb(res_info->u.entity.mc_id, set_atca_reset_diagnostic_control_state_cb, &info); if (rv != 0) { err("ipmi_domain_pointer_cb = 0x%x", rv); return SA_ERR_HPI_INTERNAL_ERROR; } rv = ohoi_loop(&info.done, ipmi_handler); if (rv != SA_OK) { err("ohoi_loop = 0x%x", rv); return SA_ERR_HPI_INTERNAL_ERROR; } return info.rv; } static SaHpiRdrT *atca_create_reset_diagnostic_control( struct oh_handler_state *handler, struct ohoi_control_info **c_info) { SaHpiRdrT *rdr; struct ohoi_control_info *l_c_info; rdr = malloc(sizeof (SaHpiRdrT)); if (rdr == NULL) { err("Out of memory"); return NULL; } l_c_info = malloc(sizeof (struct ohoi_control_info)); if (l_c_info == NULL) { err("Out of memory"); free(rdr); return NULL; } memset(rdr, 0, sizeof (SaHpiRdrT)); memset(l_c_info, 0, sizeof (struct ohoi_control_info)); rdr->RdrType = SAHPI_CTRL_RDR; rdr->IsFru = SAHPI_FALSE; rdr->RdrTypeUnion.CtrlRec.Num = ATCAHPI_CTRL_NUM_FRU_CONTROL; rdr->RdrTypeUnion.CtrlRec.OutputType = SAHPI_CTRL_GENERIC; rdr->RdrTypeUnion.CtrlRec.Type = SAHPI_CTRL_TYPE_ANALOG; rdr->RdrTypeUnion.CtrlRec.TypeUnion.Analog.Min = 1; rdr->RdrTypeUnion.CtrlRec.TypeUnion.Analog.Max = 2; rdr->RdrTypeUnion.CtrlRec.TypeUnion.Analog.Default = 1; rdr->RdrTypeUnion.CtrlRec.DefaultMode.Mode = SAHPI_CTRL_MODE_MANUAL; rdr->RdrTypeUnion.CtrlRec.DefaultMode.ReadOnly = SAHPI_TRUE; rdr->RdrTypeUnion.CtrlRec.WriteOnly = SAHPI_TRUE; oh_init_textbuffer(&rdr->IdString); oh_append_textbuffer(&rdr->IdString, "FRU Reboot and Diagnostic Control"); l_c_info->ohoii.get_control_state = NULL; l_c_info->ohoii.set_control_state = set_atca_reset_diagnostic_control_state; l_c_info->mode = SAHPI_CTRL_MODE_MANUAL; l_c_info->type = OHOI_CTRL_ATCA_MAPPED; *c_info = l_c_info; return rdr; } /*------------------------- Desired Power Control ----------------------------*/ struct desired_pwr_ctrl_s { SaHpiInt32T des_pwr; }; static void _get_atca_desired_power_control_state_cb( ipmi_mc_t *mc, ipmi_msg_t *msg, void *rsp_data) { atca_common_info_t *info = rsp_data; int rv = msg->data[0]; struct desired_pwr_ctrl_s *des_pwr = (struct desired_pwr_ctrl_s *)info->info; if (mc == NULL) { info->rv = SA_ERR_HPI_ENTITY_NOT_PRESENT; info->done = 1; return; } if (rv == 0xc1) { info->rv = SA_ERR_HPI_INVALID_CMD; } else if (rv == 0xc3) { info->rv = SA_ERR_HPI_NO_RESPONSE; } else if (rv != 0) { info->rv = SA_ERR_HPI_INVALID_PARAMS; } else { des_pwr->des_pwr = (SaHpiFloat64T) (msg->data[msg->data_len - 1] * msg->data[4]); } info->done = 1; return; }; static void get_atca_desired_power_control_state_cb(ipmi_mc_t *mc, void *cb_data) { atca_common_info_t *info = cb_data; unsigned char data[25]; int rv; memset(data, 0, 25); data[0] = IPMI_PICMG_GRP_EXT; data[1] = info->devid; data[2] = 1; /* Desired steady state draw levels */ rv = ipmicmd_mc_send(mc, IPMI_GROUP_EXTENSION_NETFN, IPMI_PICMG_CMD_GET_POWER_LEVEL, 0, data, 3, _get_atca_desired_power_control_state_cb, cb_data); if (rv != 0) { err("ipmicmd_send = 0x%x\n", rv); OHOI_MAP_ERROR(info->rv, rv); return; } return; } static SaErrorT get_atca_desired_power_control_state( struct oh_handler_state *hnd, struct ohoi_control_info *c_info, SaHpiRdrT * rdr, SaHpiCtrlModeT *mode, SaHpiCtrlStateT *state) { struct ohoi_handler *ipmi_handler = (struct ohoi_handler *) hnd->data; SaHpiRptEntryT *rpt; struct ohoi_resource_info *res_info, *slot_info; atca_common_info_t info; struct desired_pwr_ctrl_s des_pwr; int rv; rpt = oh_get_resource_by_id(hnd->rptcache, c_info->info.atcamap_ctrl_info.rid); if (rpt == NULL) { return SA_ERR_HPI_INTERNAL_ERROR; } res_info = oh_get_resource_data(hnd->rptcache, c_info->info.atcamap_ctrl_info.rid); if (res_info == NULL) { return SA_ERR_HPI_INTERNAL_ERROR; } slot_info = oh_get_resource_data(hnd->rptcache, ohoi_get_parent_id(rpt)); if (slot_info == NULL) { return SA_ERR_HPI_INTERNAL_ERROR; } info.done = 0; info.rv = 0; info.addr = slot_info->u.slot.addr; info.devid = slot_info->u.slot.devid; info.info = &des_pwr; rv = ipmi_mc_pointer_cb(res_info->u.entity.mc_id, get_atca_desired_power_control_state_cb, &info); if (rv != 0) { err("ipmi_domain_pointer_cb = 0x%x", rv); return SA_ERR_HPI_INTERNAL_ERROR; } rv = ohoi_loop(&info.done, ipmi_handler); if (rv != SA_OK) { err("ohoi_loop = 0x%x", rv); return SA_ERR_HPI_INTERNAL_ERROR; } if (info.rv != SA_OK) { err("info.rv = 0x%x\n", info.rv); return info.rv; } if (mode) { *mode = c_info->mode = SAHPI_CTRL_MODE_AUTO; } if (state == NULL) { return SA_OK; } state->Type = SAHPI_CTRL_TYPE_ANALOG; state->StateUnion.Analog = des_pwr.des_pwr; return SA_OK; } static SaErrorT set_atca_desired_power_control_state( struct oh_handler_state *hnd, struct ohoi_control_info *c_info, SaHpiRdrT *rdr, SaHpiCtrlModeT mode, SaHpiCtrlStateT *state) { return SA_ERR_HPI_READ_ONLY; } static SaHpiRdrT *atca_create_desired_pwr_control( struct oh_handler_state *handler, struct ohoi_control_info **c_info) { SaHpiRdrT *rdr; struct ohoi_control_info *l_c_info; rdr = malloc(sizeof (SaHpiRdrT)); if (rdr == NULL) { err("Out of memory"); return NULL; } l_c_info = malloc(sizeof (struct ohoi_control_info)); if (l_c_info == NULL) { err("Out of memory"); free(rdr); return NULL; } memset(rdr, 0, sizeof (SaHpiRdrT)); memset(l_c_info, 0, sizeof (struct ohoi_control_info)); rdr->RdrType = SAHPI_CTRL_RDR; rdr->IsFru = SAHPI_FALSE; rdr->RdrTypeUnion.CtrlRec.Num = ATCAHPI_CTRL_NUM_DESIRED_PWR; rdr->RdrTypeUnion.CtrlRec.OutputType = SAHPI_CTRL_GENERIC; rdr->RdrTypeUnion.CtrlRec.Type = SAHPI_CTRL_TYPE_ANALOG; rdr->RdrTypeUnion.CtrlRec.TypeUnion.Analog.Min = 0; rdr->RdrTypeUnion.CtrlRec.TypeUnion.Analog.Max = 400; rdr->RdrTypeUnion.CtrlRec.TypeUnion.Analog.Default = 0; rdr->RdrTypeUnion.CtrlRec.DefaultMode.Mode = SAHPI_CTRL_MODE_AUTO; rdr->RdrTypeUnion.CtrlRec.DefaultMode.ReadOnly = SAHPI_TRUE; rdr->RdrTypeUnion.CtrlRec.WriteOnly = SAHPI_FALSE; oh_init_textbuffer(&rdr->IdString); oh_append_textbuffer(&rdr->IdString, "FRU Desired Power"); l_c_info->ohoii.get_control_state = get_atca_desired_power_control_state; l_c_info->ohoii.set_control_state = set_atca_desired_power_control_state; l_c_info->mode = SAHPI_CTRL_MODE_AUTO; l_c_info->type = OHOI_CTRL_ATCA_MAPPED; *c_info = l_c_info; return rdr; } /*---------------------------------------------------------------------------*/ static int fru_rdrs_rpt_iterator( struct oh_handler_state *handler, SaHpiRptEntryT *rpt, struct ohoi_resource_info *res_info, void *cb_data) { int max = -1; SaHpiRdrT *rdr; struct ohoi_control_info *ctrl_info; if (!(res_info->type & OHOI_RESOURCE_MC) || (res_info->type & OHOI_MC_RESET_CONTROL_CREATED)) { goto no_reset_control; } // Create FRU Management Controller Reset Control rdr = create_fru_mc_reset_control(handler->data, rpt, &ctrl_info); if (rdr != NULL && (oh_add_rdr(handler->rptcache, rpt->ResourceId, rdr, ctrl_info, 1) != SA_OK)) { err("couldn't add control rdr"); free(rdr); free(ctrl_info); } else { rpt->ResourceCapabilities |= SAHPI_CAPABILITY_CONTROL | SAHPI_CAPABILITY_RDR; res_info->type |= OHOI_MC_RESET_CONTROL_CREATED; } no_reset_control: if (res_info->type & OHOI_MC_IPMB0_CONTROL_CREATED) { goto no_ipmb0_controls; } // calculate the number of IPMB links ohoi_iterate_rpt_rdrs(handler, rpt, ipmb0_state_control_rdr_iterator, &max); if (max < 0) { err("No ipmb0 sensors for resource %d", rpt->ResourceId); res_info->type |= OHOI_MC_IPMB0_CONTROL_CREATED; goto no_ipmb0_controls; } rdr = create_ipmb0_state_control(handler->data, rpt, &ctrl_info, 1, max); if (rdr != NULL && (oh_add_rdr(handler->rptcache, rpt->ResourceId, rdr, ctrl_info, 1) != SA_OK)) { err("couldn't add control rdr"); free(rdr); free(ctrl_info); } else { rpt->ResourceCapabilities |= SAHPI_CAPABILITY_CONTROL | SAHPI_CAPABILITY_RDR; } rdr = create_ipmb0_state_control(handler->data, rpt, &ctrl_info, 0, max); if (rdr != NULL && (oh_add_rdr(handler->rptcache, rpt->ResourceId, rdr, ctrl_info, 1) != SA_OK)) { err("couldn't add control rdr"); free(rdr); free(ctrl_info); } else { rpt->ResourceCapabilities |= SAHPI_CAPABILITY_CONTROL | SAHPI_CAPABILITY_RDR; res_info->type |= OHOI_MC_RESET_CONTROL_CREATED; } no_ipmb0_controls: if (!(rpt->ResourceCapabilities & SAHPI_CAPABILITY_MANAGED_HOTSWAP)) { goto no_fru_control; } rdr = atca_create_desired_pwr_control(handler, &ctrl_info); if (rdr) { if (oh_add_rdr(handler->rptcache, rpt->ResourceId, rdr, ctrl_info, 1) != SA_OK) { err("couldn't add control rdr"); free(rdr); free(ctrl_info); } else { rpt->ResourceCapabilities |= SAHPI_CAPABILITY_CONTROL | SAHPI_CAPABILITY_RDR; ctrl_info->info.atcamap_ctrl_info.rid = rpt->ResourceId; } } rdr = atca_create_reset_diagnostic_control(handler, &ctrl_info); if (rdr) { if (oh_add_rdr(handler->rptcache, rpt->ResourceId, rdr, ctrl_info, 1) != SA_OK) { err("couldn't add control rdr"); free(rdr); free(ctrl_info); } else { rpt->ResourceCapabilities |= SAHPI_CAPABILITY_CONTROL | SAHPI_CAPABILITY_RDR; ctrl_info->info.atcamap_ctrl_info.rid = rpt->ResourceId; } } no_fru_control: return 0; } void ohoi_atca_create_fru_rdrs(struct oh_handler_state *handler) { ohoi_iterate_rptcache(handler, fru_rdrs_rpt_iterator, NULL); } void ohoi_atca_delete_fru_rdrs(struct oh_handler_state *handler, ipmi_mcid_t mcid) { SaHpiRptEntryT *rpt; struct ohoi_resource_info *res_info; SaHpiRdrT *rdr; SaHpiSensorNumT num; rpt = ohoi_get_resource_by_mcid(handler->rptcache, &mcid); if (rpt == NULL) { err("Can't delete mc rdrs. rpt == NULL"); return; } res_info = oh_get_resource_data(handler->rptcache, rpt->ResourceId); if (res_info == NULL) { err("res_info == NULL"); return; } // Delete FRU Management Controller Reset Control if (!(res_info->type & OHOI_MC_RESET_CONTROL_CREATED)) { goto no_reset_control; } rdr = oh_get_rdr_by_type(handler->rptcache, rpt->ResourceId, SAHPI_CTRL_RDR, ATCAHPI_CTRL_NUM_FRU_IPMC_RESET); if (rdr) { oh_remove_rdr(handler->rptcache, rpt->ResourceId, rdr->RecordId); } else { err("No rdr for FRU Management Controller Reset Control"); } res_info ->type &= ~OHOI_MC_RESET_CONTROL_CREATED; no_reset_control: if (!(res_info->type & OHOI_MC_IPMB0_CONTROL_CREATED)) { goto no_ipmb0_controls; } rdr = oh_get_rdr_by_type(handler->rptcache, rpt->ResourceId, SAHPI_CTRL_RDR, ATCAHPI_CTRL_NUM_IPMB_A_STATE); if (rdr) { oh_remove_rdr(handler->rptcache, rpt->ResourceId, rdr->RecordId); } else { err("No rdr for ATCAHPI_CTRL_NUM_IPMB_A_STATE"); } rdr = oh_get_rdr_by_type(handler->rptcache, rpt->ResourceId, SAHPI_CTRL_RDR, ATCAHPI_CTRL_NUM_IPMB_B_STATE); if (rdr) { oh_remove_rdr(handler->rptcache, rpt->ResourceId, rdr->RecordId); } else { err("No rdr for ATCAHPI_CTRL_NUM_IPMB_B_STATE"); } for (num = ATCAHPI_SENSOR_NUM_IPMB0; num < ATCAHPI_SENSOR_NUM_IPMB0 + 0x5F; num++) { rdr = oh_get_rdr_by_type(handler->rptcache, rpt->ResourceId, SAHPI_SENSOR_RDR, num); if (rdr) { oh_remove_rdr(handler->rptcache, rpt->ResourceId, rdr->RecordId); } } res_info ->type &= ~OHOI_MC_IPMB0_CONTROL_CREATED; no_ipmb0_controls: if (!(rpt->ResourceCapabilities & SAHPI_CAPABILITY_MANAGED_HOTSWAP)) { goto no_fru_control; } rdr = oh_get_rdr_by_type(handler->rptcache, rpt->ResourceId, SAHPI_CTRL_RDR, ATCAHPI_CTRL_NUM_DESIRED_PWR); if (rdr) { oh_remove_rdr(handler->rptcache, rpt->ResourceId, rdr->RecordId); } else { err("No rdr for ATCAHPI_CTRL_NUM_DESIRED_PWR"); } rdr = oh_get_rdr_by_type(handler->rptcache, rpt->ResourceId, SAHPI_CTRL_RDR, ATCAHPI_CTRL_NUM_FRU_CONTROL); if (rdr) { oh_remove_rdr(handler->rptcache, rpt->ResourceId, rdr->RecordId); } else { err("No rdr for ATCAHPI_CTRL_NUM_FRU_CONTROL"); } no_fru_control: if (!ohoi_rpt_has_sensors(handler, rpt->ResourceId)) { rpt->ResourceCapabilities &= ~SAHPI_CAPABILITY_SENSOR; } if (!ohoi_rpt_has_controls(handler, rpt->ResourceId)) { rpt->ResourceCapabilities &= ~SAHPI_CAPABILITY_CONTROL; } if ((oh_get_rdr_next(handler->rptcache, rpt->ResourceId, SAHPI_FIRST_ENTRY) == NULL) && (res_info->fru == NULL)) { // no more rdrs for rpt rpt->ResourceCapabilities &= ~SAHPI_CAPABILITY_RDR; } entity_rpt_set_updated(res_info, handler->data); } openhpi-2.14.1/plugins/ipmi/ipmi_event.c0000644000076400007640000000462711302567001015117 0ustar /* -*- linux-c -*- * * Copyright (c) 2003 by Intel Corp. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Louis Zhuang * Kevin Gao * Rusty Lynch * Tariq Shureih */ #include "ipmi.h" #include #include static void SDRs_read_done(ipmi_domain_t *domain, int err, void *cb_data) { int *flag = cb_data; *flag = 1; dbg("SDRs read done"); return; } static void SELs_read_done(ipmi_domain_t *domain, int err, void *cb_data) { int *flag = cb_data; *flag = 1; dbg("SELs read done"); return; } static void bus_scan_done(ipmi_domain_t *domain, int err, void *cb_data) { struct ohoi_handler *ipmi_handler = (struct ohoi_handler *) cb_data; int rv; int *flag = &ipmi_handler->bus_scan_done; *flag = 1; dbg("bus scan done"); /* we have MCs now, get SEL */ rv = ipmi_domain_reread_sels(domain, SELs_read_done, &ipmi_handler->SELs_read_done); if (rv) err("ipmi_domain_reread_sels returned error: %d\n", rv); return; } void ohoi_setup_done(ipmi_domain_t *domain, void *user_data) { struct oh_handler_state *handler = user_data; struct ohoi_handler *ipmi_handler = handler->data; int rv; rv = ipmi_domain_enable_events(domain); if (rv) { err("ipmi_domain_enable_events return error %d", rv); } rv = ipmi_domain_add_entity_update_handler(domain, ohoi_entity_event, handler); if (rv) err("ipmi_bmc_iterate_entities return error"); rv = ipmi_domain_set_main_SDRs_read_handler(domain, SDRs_read_done, &ipmi_handler->SDRs_read_done); if (rv) err("ipmi_domain_set_main_SDRs_read_handler return error: %d\n", rv); rv = ipmi_domain_set_bus_scan_handler(domain, bus_scan_done, ipmi_handler); if (rv) err("ipmi_domain_set_bus_scan_handler return error: %d\n", rv); rv = ipmi_domain_add_mc_updated_handler(domain, ohoi_mc_event, handler); if (rv) err("ipmi_domain_register_mc_update_handler return error: %d\n", rv); } openhpi-2.14.1/plugins/ipmi/ipmi_mc_event.c0000644000076400007640000001125411302567001015570 0ustar /* -*- linux-c -*- * * Copyright (c) 2003 by Intel Corp. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Louis Zhuang */ #include "ipmi.h" #include #include static void trace_ipmi_mc(char *str, ipmi_mc_t *mc) { if (!getenv("OHOI_TRACE_MC") && !IHOI_TRACE_ALL) { return; } fprintf(stderr, "*** MC (%d, %d): %s. sel support = %d\n", ipmi_mc_get_channel(mc), ipmi_mc_get_address(mc), str, ipmi_mc_sel_device_support(mc)); } static void mc_add(ipmi_mc_t *mc, struct oh_handler_state *handler) { trace_ipmi_mc("ADDED and ACTIVE", mc); } static void mc_remove(ipmi_mc_t *mc, struct oh_handler_state *handler) { struct ohoi_handler *ipmi_handler = handler->data; ipmi_mcid_t mcid; SaHpiRptEntryT *rpt; trace_ipmi_mc("REMOVED (not present)", mc); if (!IS_ATCA(ipmi_handler->d_type)) { return; } g_static_rec_mutex_lock(&ipmi_handler->ohoih_lock); mcid = ipmi_mc_convert_to_id(mc); ohoi_atca_delete_fru_rdrs(handler, mcid); rpt = ohoi_get_resource_by_mcid(handler->rptcache, &mcid); if (rpt == NULL) { trace_ipmi_mc("COULDN'T FIND RPT", mc); err("couldn't find out resource"); } else { rpt->ResourceCapabilities &= ~SAHPI_CAPABILITY_EVENT_LOG; } g_static_rec_mutex_unlock(&ipmi_handler->ohoih_lock); } static void mc_active(ipmi_mc_t *mc, int active, void *cb_data) { struct oh_handler_state *handler = cb_data; // struct ohoi_handler *ipmi_handler = handler->data; if (active) { mc_add(mc, handler); } else { mc_remove(mc, handler); } } static void process_sel_support(ipmi_mc_t *mc, struct oh_handler_state *handler) { struct ohoi_resource_info *res_info; struct ohoi_handler *ipmi_handler = handler->data; ipmi_mcid_t mcid; SaHpiRptEntryT *rpt; mcid = ipmi_mc_convert_to_id(mc); rpt = ohoi_get_resource_by_mcid(handler->rptcache, &mcid); if (rpt == NULL) { trace_ipmi_mc("COULDN'T FIND RPT", mc); err("couldn't find out resource"); return; } res_info = oh_get_resource_data(handler->rptcache, rpt->ResourceId); if (ipmi_mc_sel_device_support(mc)) { rpt->ResourceCapabilities |= SAHPI_CAPABILITY_EVENT_LOG; entity_rpt_set_updated(res_info, ipmi_handler); } } static void mc_processed(ipmi_mc_t *mc, void *cb_data) { struct oh_handler_state *handler = cb_data; struct ohoi_handler *ipmi_handler = handler->data; g_static_rec_mutex_lock(&ipmi_handler->ohoih_lock); if (ipmi_mc_is_active(mc)) { process_sel_support(mc, handler); } else { trace_ipmi_mc("NOT ACTIVE IN PROCESSED", mc); } if (!ipmi_handler->fully_up) { // do nothing. we''ll process everything when // domain is fully up g_static_rec_mutex_unlock(&ipmi_handler->ohoih_lock); trace_ipmi_mc("PROCESSED, domain not fully up", mc); return; } trace_ipmi_mc("PROCESSED, handle this event", mc); if (IS_ATCA(ipmi_handler->d_type)) { ohoi_atca_create_fru_rdrs(handler); } g_static_rec_mutex_unlock(&ipmi_handler->ohoih_lock); } void ohoi_mc_event(enum ipmi_update_e op, ipmi_domain_t *domain, ipmi_mc_t *mc, void *cb_data) { struct oh_handler_state *handler = cb_data; struct ohoi_handler *ipmi_handler = handler->data; int rv; if ((ipmi_mc_get_channel(mc) == 0) && (ipmi_mc_get_address(mc) == 32) && ipmi_handler->d_type == IPMI_DOMAIN_TYPE_ATCA) { ipmi_handler->virt_mcid = ipmi_mc_convert_to_id(mc); } g_static_rec_mutex_lock(&ipmi_handler->ohoih_lock); switch (op) { case IPMI_ADDED: /* if we get an MC but inactive, register a call to add it once it goes active */ rv = ipmi_mc_add_active_handler(mc, mc_active, handler); rv = ipmi_mc_set_sdrs_first_read_handler(mc, mc_processed, handler); if(!ipmi_mc_is_active(mc)) { trace_ipmi_mc("ADDED but inactive...we ignore", mc); break; } else { mc_add(mc, handler); break; } case IPMI_DELETED: trace_ipmi_mc("DELETED, but nothing done", mc); break; case IPMI_CHANGED: if(!ipmi_mc_is_active(mc)) { trace_ipmi("CHANGED and is inactive: (%d %x)\n", ipmi_mc_get_address(mc), ipmi_mc_get_channel(mc)); } else { mc_add(mc, handler); } break; } g_static_rec_mutex_unlock(&ipmi_handler->ohoih_lock); } openhpi-2.14.1/plugins/ipmi/ipmi_control_event.c0000644000076400007640000005044411302567001016655 0ustar /* -*- linux-c -*- * * Copyright (c) 2003 by Intel Corp. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Tariq Shureih * Louis Zhuang */ #include "ipmi.h" #include #include //static void add_control_event_data_format(ipmi_control_t *control, //SaHpiCtrlRecT *rec) //{ //} static void trace_ipmi_control(char *str, ipmi_control_t *control, SaHpiRptEntryT *rpt) { if (!getenv("OHOI_TRACE_CONTROL") && !IHOI_TRACE_ALL) { return; } char strtype[24]; char name[24]; ipmi_control_get_id(control, name, 24); switch (ipmi_control_get_type(control)) { case IPMI_CONTROL_ONE_SHOT_RESET: strncpy(strtype,"reset", 24); break; case IPMI_CONTROL_POWER: strncpy(strtype,"power", 24); break; case IPMI_CONTROL_ALARM: strncpy(strtype,"alarm", 24); break; case IPMI_CONTROL_IDENTIFIER: strncpy(strtype,"address", 24); break; case IPMI_CONTROL_LIGHT: strncpy(strtype,"LED", 24); break; default: snprintf(strtype, 24, "unknown(%d)", ipmi_control_get_type(control)); break; } fprintf(stderr, " *** CONTROL %s. type %s (%s). RPT %d(%s)\n", str, strtype, name, rpt->ResourceId, rpt->ResourceTag.Data); } SaHpiUint8T ohoi_atca_led_to_hpi_color(int ipmi_color) { switch (ipmi_color) { case IPMI_CONTROL_COLOR_WHITE: return ATCAHPI_LED_COLOR_WHITE; case IPMI_CONTROL_COLOR_RED: return ATCAHPI_LED_COLOR_RED; case IPMI_CONTROL_COLOR_GREEN: return ATCAHPI_LED_COLOR_GREEN; case IPMI_CONTROL_COLOR_BLUE: return ATCAHPI_LED_COLOR_BLUE; case IPMI_CONTROL_COLOR_YELLOW: return ATCAHPI_LED_COLOR_AMBER; case IPMI_CONTROL_COLOR_ORANGE: return ATCAHPI_LED_COLOR_ORANGE; default: err("strange color %d, return WHITE", ipmi_color); return ATCAHPI_LED_COLOR_WHITE; } } int ohoi_atca_led_to_ipmi_color(SaHpiUint8T c) { switch (c) { case ATCAHPI_LED_COLOR_WHITE: return IPMI_CONTROL_COLOR_WHITE; case ATCAHPI_LED_COLOR_ORANGE: return IPMI_CONTROL_COLOR_ORANGE; case ATCAHPI_LED_COLOR_AMBER: return IPMI_CONTROL_COLOR_YELLOW; case ATCAHPI_LED_COLOR_GREEN: return IPMI_CONTROL_COLOR_GREEN; case ATCAHPI_LED_COLOR_RED: return IPMI_CONTROL_COLOR_RED; case ATCAHPI_LED_COLOR_BLUE: return IPMI_CONTROL_COLOR_BLUE; default: return 0; } } static SaHpiCtrlOutputTypeT _control_type_from_ipmi_to_hpi( ipmi_control_t *control) { switch (ipmi_control_get_type(control)) { case IPMI_CONTROL_ALARM: return SAHPI_CTRL_FRONT_PANEL_LOCKOUT; case IPMI_CONTROL_DISPLAY: return SAHPI_CTRL_LCD_DISPLAY; case IPMI_CONTROL_LIGHT: return SAHPI_CTRL_LED; case IPMI_CONTROL_FAN_SPEED: return SAHPI_CTRL_FAN_SPEED; case IPMI_CONTROL_IDENTIFIER: case IPMI_CONTROL_RELAY: default: return SAHPI_CTRL_OEM; } } static void set_idstring(ipmi_control_t *control, SaHpiRdrT *rdr) { char name[SAHPI_MAX_TEXT_BUFFER_LENGTH]; SaHpiTextTypeT data_type; int name_len; memset(name, '\0' ,SAHPI_MAX_TEXT_BUFFER_LENGTH); ipmi_control_get_id(control, name, SAHPI_MAX_TEXT_BUFFER_LENGTH); name_len = ipmi_control_get_id_length(control); if (name_len >= SAHPI_MAX_TEXT_BUFFER_LENGTH) name_len = SAHPI_MAX_TEXT_BUFFER_LENGTH - 1; data_type = convert_to_hpi_data_type(ipmi_control_get_id_type(control)); rdr->IdString.DataType = data_type; rdr->IdString.Language = SAHPI_LANG_ENGLISH; rdr->IdString.DataLength = name_len; memset(rdr->IdString.Data, 0, SAHPI_MAX_TEXT_BUFFER_LENGTH); memcpy(rdr->IdString.Data, name, name_len); } static int add_control_event(ipmi_entity_t *ent, ipmi_control_t *control, struct oh_handler_state *handler, SaHpiEntityPathT parent_ep, SaHpiResourceIdT rid) { struct ohoi_resource_info *info; struct ohoi_control_info *ctrl_info; SaHpiRdrT rdr; ctrl_info = malloc(sizeof(struct ohoi_control_info)); if (!ctrl_info) { err("Out of memory"); return 1; } memset(&rdr, 0, sizeof(rdr)); ctrl_info->type = OHOI_CTRL_ORIGINAL; ctrl_info->info.orig_ctrl_info.ctrl_id = ipmi_control_convert_to_id(control); ctrl_info->mode = SAHPI_CTRL_MODE_AUTO; ctrl_info->ohoii.get_control_state = orig_get_control_state; ctrl_info->ohoii.set_control_state = orig_set_control_state; rdr.RecordId = 0; rdr.Entity = parent_ep; rdr.RdrTypeUnion.CtrlRec.OutputType = _control_type_from_ipmi_to_hpi(control); rdr.RdrTypeUnion.CtrlRec.Type = SAHPI_CTRL_TYPE_OEM; set_idstring(control, &rdr); info = oh_get_resource_data(handler->rptcache, rid); if (!info) { free(ctrl_info); err("No info in resource(%d)\n", rid); return 1; } rdr.RdrTypeUnion.CtrlRec.Num = ++info->ctrl_count; rid = oh_uid_lookup(&rdr.Entity); if (oh_add_rdr(handler->rptcache, rid, &rdr, ctrl_info, 1) != SA_OK) { err("couldn't add control rdr"); free(ctrl_info); return 1; } return 0; } static void set_possible_colors(ipmi_control_t *control, unsigned char *clrs) { unsigned char c = 0; int num = 0; if (ipmi_control_light_is_color_supported(control, IPMI_CONTROL_COLOR_WHITE)) { c |= ATCAHPI_LED_WHITE; num++; } if (ipmi_control_light_is_color_supported(control, IPMI_CONTROL_COLOR_RED)) { c |= ATCAHPI_LED_RED; num++; } if (ipmi_control_light_is_color_supported(control, IPMI_CONTROL_COLOR_GREEN)) { c |= ATCAHPI_LED_GREEN; num++; } if (ipmi_control_light_is_color_supported(control, IPMI_CONTROL_COLOR_BLUE)) { c |= ATCAHPI_LED_BLUE; num++; } if (ipmi_control_light_is_color_supported(control, IPMI_CONTROL_COLOR_YELLOW)) { c |= ATCAHPI_LED_AMBER; num++; } if (ipmi_control_light_is_color_supported(control, IPMI_CONTROL_COLOR_ORANGE)) { c |= ATCAHPI_LED_ORANGE; num++; } *clrs = c; } typedef struct { SaHpiCtrlRecOemT *oem; SaHpiCtrlDefaultModeT *dm; int err; int done; } ohoi_led_info_t; static void set_led_oem_cb(ipmi_control_t *control, int err, ipmi_light_setting_t *st, void *cb_data) { ohoi_led_info_t *info = cb_data; SaHpiCtrlRecOemT *oem = info->oem; SaHpiCtrlDefaultModeT *dm = info->dm; int lc = 0; int color; int on_time, off_time; if (err) { info->err = err; info->done = 1; err("led_default_mode_settings_cb = %d", err); return; } oem->Default.MId = ATCAHPI_PICMG_MID; oem->MId = ATCAHPI_PICMG_MID; // set possible colors set_possible_colors(control, &oem->ConfigData[0]); //set default auto color if (ipmi_light_setting_get_color(st, 0, &color) == 0) { oem->ConfigData[1] = ohoi_atca_led_to_hpi_color(color); } else { oem->ConfigData[1] = 0; } //set default manual color if (ipmi_light_setting_get_color(st, 0, &color) == 0) { oem->ConfigData[2] = ohoi_atca_led_to_hpi_color(color); } else { oem->ConfigData[2] = 0; } if (!ipmi_light_setting_get_on_time(st, 0, &on_time) && !ipmi_light_setting_get_off_time(st, 0, &off_time)) { oem->ConfigData[3] = ATCAHPI_LED_BR_SUPPORTED; if (off_time > 10) { oem->Default.Body[0] = off_time / 10; } else { oem->Default.Body[0] = off_time ? 1 : 0; } if (on_time > 10) { oem->Default.Body[1] = on_time / 10; } else { oem->Default.Body[1] = on_time ? 1 : 0; } } else { oem->ConfigData[3] = ATCAHPI_LED_BR_NOT_SUPPORTED; } oem->Default.Body[2] = oem->ConfigData[1]; oem->Default.Body[3] = oem->ConfigData[2]; oem->Default.Body[4] = SAHPI_FALSE; oem->Default.BodyLength = 6; if (!ipmi_control_light_has_local_control(control)) { dm->Mode = SAHPI_CTRL_MODE_AUTO; dm->ReadOnly = SAHPI_TRUE; } else { ipmi_light_setting_in_local_control(st, 0, &lc); dm->Mode = lc ? SAHPI_CTRL_MODE_AUTO : SAHPI_CTRL_MODE_MANUAL; dm->ReadOnly = SAHPI_FALSE; } info->done = 1; } static int add_led_control_event(ipmi_entity_t *ent, ipmi_control_t *control, struct oh_handler_state *handler, SaHpiRptEntryT *rpt) { SaHpiEntityPathT parent_ep = rpt->ResourceEntity; SaHpiResourceIdT rid = rpt->ResourceId; struct ohoi_resource_info *info; struct ohoi_control_info *ctrl_info; SaHpiRdrT rdr; int rv; ctrl_info = malloc(sizeof(struct ohoi_control_info)); if (!ctrl_info) { err("Out of memory"); return 1; } memset(&rdr, 0, sizeof(rdr)); ctrl_info->type = OHOI_CTRL_ORIGINAL; ctrl_info->info.orig_ctrl_info.ctrl_id = ipmi_control_convert_to_id(control); ctrl_info->ohoii.get_control_state = orig_get_control_state; ctrl_info->ohoii.set_control_state = orig_set_control_state; rdr.RecordId = 0; rdr.RdrType = SAHPI_CTRL_RDR; rdr.Entity = parent_ep; rdr.RdrTypeUnion.CtrlRec.OutputType = SAHPI_CTRL_LED; rdr.RdrTypeUnion.CtrlRec.Type = SAHPI_CTRL_TYPE_OEM; rdr.RdrTypeUnion.CtrlRec.DefaultMode.Mode = SAHPI_CTRL_MODE_AUTO; rdr.RdrTypeUnion.CtrlRec.DefaultMode.ReadOnly = SAHPI_TRUE; set_idstring(control, &rdr); if (ipmi_control_light_set_with_setting(control)) { ohoi_led_info_t info; info.done = 0; info.err = 0; info.oem = &rdr.RdrTypeUnion.CtrlRec.TypeUnion.Oem; info.dm = &rdr.RdrTypeUnion.CtrlRec.DefaultMode; rv = ipmi_control_get_light(control, set_led_oem_cb, &info); if (rv) { err("ipmi_control_get_light = 0x%x", rv); } else { ohoi_loop(&info.done, handler->data); } } else { err("ipmi_control_light_set_with_setting == 0"); } ctrl_info->mode = rdr.RdrTypeUnion.CtrlRec.DefaultMode.Mode; rdr.RdrTypeUnion.CtrlRec.Oem = ATCAHPI_PICMG_CT_ATCA_LED; info = oh_get_resource_data(handler->rptcache, rid); if (!info) { free(ctrl_info); err("No info in resource(%d)\n", rid); return 1; } if (strcasecmp((char *)rdr.IdString.Data, "blue led") == 0) { rdr.RdrTypeUnion.CtrlRec.Num = ATCAHPI_CTRL_NUM_BLUE_LED; } else if (strcasecmp((char *)rdr.IdString.Data, "led 1") == 0) { rdr.RdrTypeUnion.CtrlRec.Num = ATCAHPI_CTRL_NUM_LED1; } else if (strcasecmp((char *)rdr.IdString.Data, "led 2") == 0) { rdr.RdrTypeUnion.CtrlRec.Num = ATCAHPI_CTRL_NUM_LED2; } else if (strcasecmp((char *)rdr.IdString.Data, "led 3") == 0) { rdr.RdrTypeUnion.CtrlRec.Num = ATCAHPI_CTRL_NUM_LED3; } else if (strcasestr((char *)rdr.IdString.Data, "application-specific led ") == (char *)rdr.IdString.Data) { char *appnum = (char *)&rdr.IdString.Data[strlen("application-specific led ")]; if (strlen(appnum) <= 3) { rdr.RdrTypeUnion.CtrlRec.Num = ATCAHPI_CTRL_NUM_APP_LED + strtoul(appnum, NULL, 0); } else { err("Invalid data in LED Control\n"); return 1; } } else { err("Invalid data in LED Control\n"); return 1; } rid = oh_uid_lookup(&rdr.Entity); rv = oh_add_rdr(handler->rptcache, rid, &rdr, ctrl_info, 1); if (rv != SA_OK) { err("couldn't add control rdr. rv = %d", rv); free(ctrl_info); return 1; } #if 0 /* May be it's hot swap indicator? */ if (strcmp(rdr->IdString.Data, "blue led")) { return; } if (rpt->HotSwapCapabilities & SAHPI_HS_CAPABILITY_INDICATOR_SUPPORTED) { // already set? err("Resource %d. hot swap indicator already set 0x%x !?", rid, rpt->HotSwapCapabilities); } trace_ipmi("Attach hot swap indicator into entity %d(%s)", rpt->ResourceId, rpt->ResourceTag.Data); info->hotswapind = e->u.rdr_event.rdr.RdrTypeUnion.CtrlRec.Num; rpt->HotSwapCapabilities |= SAHPI_HS_CAPABILITY_INDICATOR_SUPPORTED; #endif return 0; } /* * add_alarm_rdr */ static void add_alarm_rdr(char *name, int num, SaHpiResourceIdT rptid, SaHpiEntityPathT parent_ent, SaHpiCtrlDefaultModeT *def_mode, SaHpiBoolT wo, ipmi_control_id_t *control_id, struct oh_handler_state *handler) { SaHpiRdrT rdr_temp; SaHpiRdrT *rdr; int name_len; struct ohoi_control_info *ctrl_info; struct ohoi_resource_info *info; info = oh_get_resource_data(handler->rptcache, rptid); if (!info) { err("No info in resource(%d)\n", rptid); return; } ctrl_info = malloc(sizeof(struct ohoi_control_info)); if (!ctrl_info) { err("Out of memory"); return; } ctrl_info->type = OHOI_CTRL_ORIGINAL; ctrl_info->info.orig_ctrl_info.ctrl_id = *control_id; ctrl_info->mode = SAHPI_CTRL_MODE_AUTO; ctrl_info->ohoii.get_control_state = orig_get_control_state; ctrl_info->ohoii.set_control_state = orig_set_control_state; rdr = &rdr_temp; rdr->RecordId = 0; rdr->RdrType = SAHPI_CTRL_RDR; rdr->Entity = parent_ent; name_len = strlen(name); if (name_len >= SAHPI_MAX_TEXT_BUFFER_LENGTH) name_len = SAHPI_MAX_TEXT_BUFFER_LENGTH - 1; rdr->IdString.DataType = SAHPI_TL_TYPE_TEXT; rdr->IdString.Language = SAHPI_LANG_ENGLISH; rdr->IdString.DataLength = strlen(name); memset(rdr->IdString.Data, 0, SAHPI_MAX_TEXT_BUFFER_LENGTH); memcpy(rdr->IdString.Data, name, strlen(name)); rdr->RdrTypeUnion.CtrlRec.Num = ++info->ctrl_count; rdr->RdrTypeUnion.CtrlRec.Type = SAHPI_CTRL_TYPE_DIGITAL; rdr->RdrTypeUnion.CtrlRec.TypeUnion.Digital.Default = SAHPI_CTRL_STATE_OFF; rdr->RdrTypeUnion.CtrlRec.OutputType = SAHPI_CTRL_LED; rdr->RdrTypeUnion.CtrlRec.Oem = OEM_ALARM_BASE + num; /* FIXME: OpenIPMI does not provide a reading */ rdr->RdrTypeUnion.CtrlRec.WriteOnly = wo; rdr->RdrTypeUnion.CtrlRec.DefaultMode.Mode = def_mode->Mode; rdr->RdrTypeUnion.CtrlRec.DefaultMode.ReadOnly = def_mode->ReadOnly; if(oh_add_rdr(handler->rptcache, rptid, rdr, ctrl_info, 1)) { err("couldn't add alarm control"); free(ctrl_info); return; } trace_ipmi("add_alarm_rdr: %s\n",name); } /* * add_alarm_rdrs */ static int add_alarm_rdrs( struct oh_handler_state *handler, SaHpiRptEntryT *rpt, ipmi_control_t *control) { SaHpiResourceIdT rid; SaHpiEntityPathT ent; SaHpiCtrlDefaultModeT default_mode; SaHpiBoolT wo; static ipmi_control_id_t alarm_control_id; /*save this */ static int alarms_done = 0; if (alarms_done) return 0; /* only do alarms the first time */ rid = rpt->ResourceId; ent = rpt->ResourceEntity; alarm_control_id = ipmi_control_convert_to_id(control); wo = (ipmi_control_is_readable(control) == 0); default_mode.ReadOnly = (ipmi_control_is_settable(control) != 0); default_mode.Mode = SAHPI_CTRL_MODE_AUTO; rpt->ResourceCapabilities |= SAHPI_CAPABILITY_RDR; rpt->ResourceCapabilities |= SAHPI_CAPABILITY_CONTROL; add_alarm_rdr("Power Alarm LED", 0, rid, ent, &default_mode, wo, &alarm_control_id, handler); add_alarm_rdr("Critical Alarm LED", 1, rid, ent, &default_mode, wo, &alarm_control_id, handler); add_alarm_rdr("Major Alarm LED", 2, rid, ent, &default_mode, wo, &alarm_control_id, handler); add_alarm_rdr("Minor Alarm LED", 3, rid, ent, &default_mode, wo, &alarm_control_id, handler); alarms_done = 1; return 0; } #if 0 static void address_control(ipmi_control_t *control, int err, unsigned char *val, int length, void *cb_data) { int i; int *location = cb_data; if (control == NULL) { err("Invalid control?"); return; } for (i=0; idata; rv = ipmi_control_identifier_get_val(control, address_control, &location); if(rv) { err("Error getting identifier control val"); return -1; } ohoi_loop(&location, ipmi_handler); //rpt->ResourceEntity.Entry[0].EntityLocation = //ipmi_entity_get_entity_instance(entity) - 96 ; //rpt->ResourceEntity.Entry[1].EntityLocation = location; //rpt.ResourceId = //oh_uid_from_entity_path(&rpt.ResourceEntity); //dbg("Control New ResourceId: %d", rpt.ResourceId); //rv = oh_add_resource(handler->rptcache, *rpt, NULL, 1); //if (rv) { //err("oh_add_resource failed for %d = %s\n", rpt->ResourceId, oh_lookup_error(rv)); //} return 0; } #endif void ohoi_control_event(enum ipmi_update_e op, ipmi_entity_t *ent, ipmi_control_t *control, void *cb_data) { struct oh_handler_state *handler = cb_data; struct ohoi_handler *ipmi_handler = handler->data; struct ohoi_resource_info *ohoi_res_info; int ctrl_type = ipmi_control_get_type(control); ipmi_control_id_t cid = ipmi_control_convert_to_id(control); ipmi_entity_id_t entity_id; SaHpiRptEntryT *rpt_entry; char str[24]; int rv; entity_id = ipmi_entity_convert_to_id(ent); rpt_entry = ohoi_get_resource_by_entityid(handler->rptcache, &entity_id); if (!rpt_entry) { dump_entity_id("Control with RPT Entry?!", entity_id); return; } g_static_rec_mutex_lock(&ipmi_handler->ohoih_lock); ohoi_res_info = oh_get_resource_data(handler->rptcache, rpt_entry->ResourceId); if (op == IPMI_ADDED) { trace_ipmi_control("ADD", control, rpt_entry); /* attach power and reset to chassis entity since IPMI provides them as such */ switch (ctrl_type) { case IPMI_CONTROL_ONE_SHOT_RESET: ohoi_res_info->reset_ctrl = cid; rpt_entry->ResourceCapabilities |= SAHPI_CAPABILITY_RESET; break; case IPMI_CONTROL_POWER: if ((ipmi_handler->d_type == IPMI_DOMAIN_TYPE_ATCA) && (ipmi_entity_get_entity_id(ent) == SAHPI_ENT_SYSTEM_CHASSIS)) { // never power off ATCA chassis break; } ohoi_res_info->power_ctrl = cid; rpt_entry->ResourceCapabilities |= SAHPI_CAPABILITY_POWER; break; case IPMI_CONTROL_ALARM: rv = add_alarm_rdrs(handler,rpt_entry,control); if (rv) { err("add_alarms_rdrs failed"); break; } rpt_entry->ResourceCapabilities |= SAHPI_CAPABILITY_CONTROL | SAHPI_CAPABILITY_RDR; break; case IPMI_CONTROL_IDENTIFIER: #if 0 rv = address_control_get(control,handler, ent, rpt_entry); if (rv) { err("address_control_get failed"); break; } rpt_entry->ResourceCapabilities |= SAHPI_CAPABILITY_CONTROL | SAHPI_CAPABILITY_RDR; #endif break; case IPMI_CONTROL_LIGHT: ipmi_control_get_id(control, str, 24); if (add_led_control_event(ent, control, handler, rpt_entry)) { break; } rpt_entry->ResourceCapabilities |= SAHPI_CAPABILITY_CONTROL | SAHPI_CAPABILITY_RDR; break; default: if (SA_OK != add_control_event(ent, control, handler, rpt_entry->ResourceEntity, rpt_entry->ResourceId)) { break; } rpt_entry->ResourceCapabilities |= SAHPI_CAPABILITY_CONTROL | SAHPI_CAPABILITY_RDR; break; } } else if (op == IPMI_DELETED) { trace_ipmi_control("DELETE", control, rpt_entry); switch (ctrl_type) { case IPMI_CONTROL_ONE_SHOT_RESET: ipmi_control_id_set_invalid( &ohoi_res_info->reset_ctrl); rpt_entry->ResourceCapabilities &= ~SAHPI_CAPABILITY_RESET; break; case IPMI_CONTROL_POWER: ipmi_control_id_set_invalid( &ohoi_res_info->power_ctrl); rpt_entry->ResourceCapabilities &= ~SAHPI_CAPABILITY_POWER; break; default: if (ohoi_delete_orig_control_rdr(handler, rpt_entry, &cid)) { // no more controlss for rpt rpt_entry->ResourceCapabilities &= ~SAHPI_CAPABILITY_CONTROL; ohoi_res_info->ctrl_count = 0; } break; } if ((oh_get_rdr_next(handler->rptcache, rpt_entry->ResourceId, SAHPI_FIRST_ENTRY) == NULL) && (ohoi_res_info->fru == NULL)) { // no more rdrs for rpt rpt_entry->ResourceCapabilities &= ~SAHPI_CAPABILITY_RDR; } } trace_ipmi("Set updated for res_info %p(%d). Control", ohoi_res_info, rpt_entry->ResourceId); entity_rpt_set_updated(ohoi_res_info, ipmi_handler); g_static_rec_mutex_unlock(&ipmi_handler->ohoih_lock); } openhpi-2.14.1/plugins/ipmi/ipmi_connection.c0000644000076400007640000000537611302567001016137 0ustar /* -*- linux-c -*- * * Copyright (c) 2003 by Intel Corp. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Louis Zhuang * Kevin Gao * Rusty Lynch * Tariq Shureih * Racing Guo * Andy Cress (watchdog) */ #include "ipmi.h" static int init_domain_handlers(ipmi_domain_t *domain, void *user_data) { struct oh_handler_state *handler = user_data; char dmn_name[IPMI_DOMAIN_NAME_LEN]; int rv; int ret = 0; rv = ipmi_domain_enable_events(domain); if (rv) { fprintf(stderr, "ipmi_domain_enable_events return error %d\n", rv); if (ret == 0) { ret = rv; } } rv = ipmi_domain_add_entity_update_handler(domain, ohoi_entity_event, handler); if (rv) { fprintf(stderr, "ipmi_domain_add_entity_update_handler error %d\n", rv); if (ret == 0) { ret = rv; } } rv = ipmi_domain_add_mc_updated_handler(domain, ohoi_mc_event, handler); if (rv) { fprintf(stderr, "ipmi_domain_add_mc_updated_handler return error: %d\n", rv); if (ret == 0) { ret = rv; } } if (ret) { ipmi_domain_get_name(domain, dmn_name, IPMI_DOMAIN_NAME_LEN); fprintf(stderr, "Could not initialize ipmi domain %s\n", dmn_name); } return ret; } void ipmi_connection_handler (ipmi_domain_t *domain, int err, unsigned int conn_num, unsigned int port_num, int still_connected, void *cb_data) { struct oh_handler_state *handler = cb_data; struct ohoi_handler *ipmi_handler = handler->data; int rv; trace_ipmi("connection handler called. Error code: 0x%x", err); ipmi_handler->d_type = ipmi_domain_get_type(domain); if (err) { err("Failed to connect to IPMI domain. err = 0x%x", err); ipmi_handler->connected = 0; } else { err("IPMI domain Connection success"); ipmi_handler->connected = 1; } if (!still_connected) { err("All IPMI connections down\n"); ipmi_handler->connected = 0; } if (ipmi_handler->connected == 0) { return; } rv = init_domain_handlers(domain, cb_data); if (rv) { /* we can do something better */ err("Couldn't init_domain_handlers. rv = 0x%x", rv); ipmi_handler->connected = 0; } if (ipmi_handler->connected && ipmi_handler->openipmi_scan_time) { ipmi_domain_set_sel_rescan_time(domain, ipmi_handler->openipmi_scan_time); } } openhpi-2.14.1/plugins/ipmi/ekeyfru.h0000644000076400007640000000157611302567001014437 0ustar /* -*- linux-c -*- * * Copyright (c) 2006 by Intel Corp. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Vadim Revyakin */ #ifndef _EKEYFRU_H_ #define _EKEYFRU_H_ #define CHANNEL_NUM(bytes) ((bytes)[0] & 0x3F) #define LINK_GROUPING_ID(bytes) ((bytes)[3]) #define LINK_TYPE_EXTENSION(bytes) ((bytes[2] & 0xf0) >> 4) #define LINK_TYPE(bytes) (((bytes[2] & 0x0f) << 4) | (((bytes)[1] & 0xf0) >> 4)) #define INTERFACE_TYPE(bytes) (((bytes)[0] & 0xc0) >> 6) #define PORTS(bytes) ((bytes)[1] & 0x0f) #define DEBUG_EKEY 0 #endif openhpi-2.14.1/plugins/ipmi/ipmi_sensor_event.c0000644000076400007640000010314711302567001016505 0ustar /* -*- linux-c -*- * * Copyright (c) 2003 by Intel Corp. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Louis Zhuang */ #include "ipmi.h" #include #include enum ohoi_event_type { EVENT_DATA_0 = 0, EVENT_DATA_1, EVENT_DATA_2, EVENT_DATA_3 }; /* IPMI does not define the decrete sensor event state */ enum ohoi_discrete_e { IPMI_TRANS_IDLE = 0, IPMI_TRANS_ACTIVE, IPMI_TRANS_BUSY }; static void set_discrete_sensor_misc_event(ipmi_event_t *event, SaHpiSensorEventT *e) { enum ohoi_event_type type; char data[IPMI_EVENT_DATA_MAX_LEN]; int dt_len; SaHpiSensorOptionalDataT od = 0; dt_len = ipmi_event_get_data(event, (unsigned char *)data, 0, IPMI_EVENT_DATA_MAX_LEN); if (dt_len != 13) { err("Wrong size of ipmi event data = %i", dt_len); return; } e->EventState = (1 << (data[10] & 0x0f)); type = data[10] >> 6; if (type == EVENT_DATA_1) { if ((data[11] & 0x0f) != 0x0f) { od |= SAHPI_SOD_PREVIOUS_STATE; e->PreviousState = (1 << (data[11] & 0x0f)); } } else if (type == EVENT_DATA_2) { od |= SAHPI_SOD_OEM; } else if (type == EVENT_DATA_3) { od |= SAHPI_SOD_SENSOR_SPECIFIC; } type = (data[10] & 0x30) >> 4; if (type == EVENT_DATA_2) { od |= SAHPI_SOD_OEM; } else if (type == EVENT_DATA_3) { od |= SAHPI_SOD_SENSOR_SPECIFIC; } if (e->SensorType == IPMI_SENSOR_TYPE_OS_CRITICAL_STOP) { // implementation feature od |= SAHPI_SOD_SENSOR_SPECIFIC; e->SensorSpecific = (data[12] << 16) | (data[11] << 8) | data[9]; } else { e->SensorSpecific = (data[12] << 16) | (data[11] << 8) | data[10]; } e->Oem = (data[12] << 16) | (data[11] << 8) | data[10]; e->OptionalDataPresent = od; } static void set_event_sensor_num(ipmi_sensor_t *sensor, struct oh_event *e, struct oh_handler_state *handler) { ipmi_entity_id_t entity_id; ipmi_sensor_id_t sensor_id; SaHpiRptEntryT *rpt_entry; SaHpiRdrT *rdr; entity_id = ipmi_entity_convert_to_id(ipmi_sensor_get_entity(sensor)); sensor_id = ipmi_sensor_convert_to_id(sensor); rpt_entry = ohoi_get_resource_by_entityid(handler->rptcache, &entity_id); if (!rpt_entry) { dump_entity_id("Sensor without RPT Entry?!", entity_id); return; } e->event.Source = rpt_entry->ResourceId; rdr = ohoi_get_rdr_by_data(handler->rptcache, rpt_entry->ResourceId, SAHPI_SENSOR_RDR, &sensor_id); if (!rdr) { err("No rdr for sensor %d in resource:%d\n", sensor_id.sensor_num, rpt_entry->ResourceId); return; } e->event.EventDataUnion.SensorEvent.SensorNum = rdr->RdrTypeUnion.SensorRec.Num; } /* * sensor_discrete_map_event * @dir: assertion or disassertion * @offset: not used now * @severity: severity of event * @prev_severity: previous state of sensor event * @event: ipmi event * * Helper function to map ipmi event from discrete sensor to oh_event. * It is used to implement saHpiEventLogEntryGet() and saHpiEventGet(). * * Returns: oh_event to which ipmi event is mapped */ static struct oh_event *sensor_discrete_map_event( struct ohoi_handler *ipmi_handler, enum ipmi_event_dir_e dir, int offset, int severity, int prev_severity, ipmi_event_t *event) { struct oh_event *e; unsigned char data[IPMI_EVENT_DATA_MAX_LEN]; unsigned int dt_len; dt_len = ipmi_event_get_data(event, data, 0, IPMI_EVENT_DATA_MAX_LEN); if (dt_len != 13) { err("Wrong size of ipmi event data = %i", dt_len); return NULL; } e = malloc(sizeof(*e)); if (!e) { err("Out of space"); return NULL; } memset(e, 0, sizeof(*e)); e->event.Source = 0; /* Do not find EventType in IPMI */ e->event.EventType = SAHPI_ET_SENSOR; e->event.Timestamp = ipmi_event_get_timestamp(event); e->event.Severity = (SaHpiSeverityT)severity; e->event.EventDataUnion.SensorEvent.SensorNum = 0; e->event.EventDataUnion.SensorEvent.SensorType = data[7]; if ((data[9] & 0x7f) == 0x6f) { /* sensor specific event */ e->event.EventDataUnion.SensorEvent.EventCategory = SAHPI_EC_SENSOR_SPECIFIC; } else if ((data[9] & 0x7f) >= 0x70) { e->event.EventDataUnion.SensorEvent.EventCategory = SAHPI_EC_GENERIC; } else { e->event.EventDataUnion.SensorEvent.EventCategory = data[9] & 0x7f; } if (data[7] >= 0xc0) { e->event.EventDataUnion.SensorEvent.SensorType = SAHPI_OEM_SENSOR; } e->event.EventDataUnion.SensorEvent.Assertion = !(dir); set_discrete_sensor_misc_event(event, &e->event.EventDataUnion.SensorEvent); if (!IS_ATCA(ipmi_handler->d_type) || ( data[7] != 0xf1)) { return e; } // ATCA IPMB-0 link sensor. Special mapping e->event.EventDataUnion.SensorEvent.EventCategory = SAHPI_EC_REDUNDANCY; switch (data[10] & 0x0f) { // IPMI event state case 0x00: // IPMB_A disable, IPMB-B disable e->event.EventDataUnion.SensorEvent.EventState = SAHPI_ES_NON_REDUNDANT_INSUFFICIENT_RESOURCES; e->event.Severity = SAHPI_CRITICAL; break; case 0x01: // IPMB_A enable, IPMB-B disable case 0x02: // IPMB_A disable, IPMB-B enable e->event.EventDataUnion.SensorEvent.EventState = SAHPI_ES_NON_REDUNDANT_SUFFICIENT_RESOURCES; e->event.Severity = SAHPI_MAJOR; break; case 0x03: // IPMB_A enable, IPMB-B enable e->event.EventDataUnion.SensorEvent.EventState = SAHPI_ES_FULLY_REDUNDANT; e->event.Severity = SAHPI_OK; break; default: err("wrong IPMIB-0 Status Change Event State = 0x%x", data[10] & 0x0f); break; } if (!(e->event.EventDataUnion.SensorEvent.OptionalDataPresent & SAHPI_SOD_PREVIOUS_STATE)) { // no previous state return e; } switch (data[11] & 0x0f) { // previous IPMI event state case 0x00: // IPMB_A disable, IPMB-B disable e->event.EventDataUnion.SensorEvent.PreviousState = SAHPI_ES_NON_REDUNDANT_INSUFFICIENT_RESOURCES; break; case 0x01: // IPMB_A enable, IPMB-B disable case 0x02: // IPMB_A disable, IPMB-B enable e->event.EventDataUnion.SensorEvent.PreviousState = SAHPI_ES_NON_REDUNDANT_SUFFICIENT_RESOURCES; break; case 0x03: // IPMB_A enable, IPMB-B enable e->event.EventDataUnion.SensorEvent.PreviousState = SAHPI_ES_FULLY_REDUNDANT; break; default: err("wrong IPMIB-0 Status Change Previous Event State = 0x%x", data[11] & 0x0f); break; } return e; } static int sensor_discrete_event(ipmi_sensor_t *sensor, enum ipmi_event_dir_e dir, int offset, int severity, int prev_severity, void * cb_data, ipmi_event_t *event) { struct oh_event *e; struct oh_handler_state *handler = cb_data; struct ohoi_handler *ipmi_handler = handler->data; ipmi_sensor_id_t sid = ipmi_sensor_convert_to_id(sensor); trace_ipmi_sensors("EVENT", sid); if ((ipmi_handler->d_type == IPMI_DOMAIN_TYPE_ATCA) && (ipmi_sensor_get_sensor_type(sensor) == 0xF0)) { // hot swap sensor. We don't report its event. // hotswap event will be reported via entity hotswap // handeler instead of. return IPMI_EVENT_NOT_HANDLED; } e = sensor_discrete_map_event(ipmi_handler, dir, offset, severity, prev_severity, event); if (e == NULL) { return IPMI_EVENT_HANDLED; } set_event_sensor_num(sensor, e, handler); e->hid = handler->hid; oh_evt_queue_push(handler->eventq, e); return IPMI_EVENT_HANDLED; } static void set_thresholed_sensor_event_state(enum ipmi_thresh_e threshold, enum ipmi_event_dir_e dir, enum ipmi_event_value_dir_e high_low, SaHpiSensorEventT *event, SaHpiSeverityT *severity) { if ((dir == IPMI_ASSERTION && high_low == IPMI_GOING_HIGH) || (dir == IPMI_DEASSERTION && high_low == IPMI_GOING_LOW)) event->Assertion = SAHPI_TRUE; else if ((dir == IPMI_ASSERTION && high_low == IPMI_GOING_LOW) || (dir == IPMI_DEASSERTION && high_low == IPMI_GOING_HIGH)) event->Assertion = SAHPI_FALSE; switch (threshold) { case IPMI_LOWER_NON_CRITICAL: event->EventState = SAHPI_ES_LOWER_MINOR; *severity = SAHPI_MINOR; break; case IPMI_LOWER_CRITICAL: event->EventState = SAHPI_ES_LOWER_MAJOR; *severity = SAHPI_MAJOR; break; case IPMI_LOWER_NON_RECOVERABLE: event->EventState = SAHPI_ES_LOWER_CRIT; *severity = SAHPI_CRITICAL; break; case IPMI_UPPER_NON_CRITICAL: event->EventState = SAHPI_ES_UPPER_MINOR; *severity = SAHPI_MINOR; break; case IPMI_UPPER_CRITICAL: event->EventState = SAHPI_ES_UPPER_MAJOR; *severity = SAHPI_MAJOR; break; case IPMI_UPPER_NON_RECOVERABLE: event->EventState = SAHPI_ES_UPPER_CRIT; *severity = SAHPI_CRITICAL; break; default: err("Invalid threshold giving"); event->EventState = SAHPI_ES_UNSPECIFIED; } } static void set_thresholds_sensor_misc_event(ipmi_event_t *event, SaHpiSensorEventT *e) { unsigned int type; SaHpiSensorOptionalDataT od = 0; unsigned char data[IPMI_EVENT_DATA_MAX_LEN]; unsigned int dt_len; dt_len = ipmi_event_get_data(event, data, 0, IPMI_EVENT_DATA_MAX_LEN); if (dt_len != 13) { err("Wrong size of ipmi event data = %i", dt_len); return; } type = data[10] >> 6; if (type == EVENT_DATA_1) { od |= SAHPI_SOD_TRIGGER_READING; e->TriggerReading.IsSupported = SAHPI_TRUE; e->TriggerReading.Type = SAHPI_SENSOR_READING_TYPE_UINT64; e->TriggerReading.Value.SensorUint64 = data[11]; } else if (type == EVENT_DATA_2) { od |= SAHPI_SOD_OEM; } else if (type == EVENT_DATA_3) { od |= SAHPI_SOD_SENSOR_SPECIFIC; } type = (data[10] & 0x30) >> 4; if (type == EVENT_DATA_1) { od |= SAHPI_SOD_TRIGGER_THRESHOLD; e->TriggerThreshold.IsSupported = SAHPI_TRUE; e->TriggerThreshold.Type = SAHPI_SENSOR_READING_TYPE_UINT64; e->TriggerThreshold.Value.SensorUint64 = data[12]; } else if (type == EVENT_DATA_2) { od |= SAHPI_SOD_OEM; } else if (type == EVENT_DATA_3) { od |= SAHPI_SOD_SENSOR_SPECIFIC; } if (e->SensorType == IPMI_SENSOR_TYPE_OS_CRITICAL_STOP) { od |= SAHPI_SOD_SENSOR_SPECIFIC; e->SensorSpecific = (data[12] << 16) | (data[11] << 8) | data[9]; } else { e->SensorSpecific = (data[12] << 16) | (data[11] << 8) | data[10]; } e->Oem = (data[12] << 16) | (data[11] << 8) | data[10]; e->OptionalDataPresent = od; } /* * sensor_threshold_map_event * @dir: assertion or disassertion - pass to set_thresholed_sensor_event_state * @threshhold: to pass to set_thresholed_sensor_event_state * @high_low: to pass to set_thresholed_sensor_event_state * @value_present: not used now * @raw_value: not used now * value: not used now * @event: ipmi event * * Helper function to map ipmi event from threshold sensor to oh_event. * It is used to implement saHpiEventLogEntryGet() and saHpiEventGet(). * * Returns: oh_event to which ipmi event is mapped */ static struct oh_event *sensor_threshold_map_event( enum ipmi_event_dir_e dir, enum ipmi_thresh_e threshold, enum ipmi_event_value_dir_e high_low, enum ipmi_value_present_e value_present, unsigned int raw_value, double value, ipmi_event_t *event) { struct oh_event *e; SaHpiSeverityT severity = SAHPI_CRITICAL; unsigned char data[IPMI_EVENT_DATA_MAX_LEN]; unsigned int dt_len; dt_len = ipmi_event_get_data(event, data, 0, IPMI_EVENT_DATA_MAX_LEN); if (dt_len != 13) { err("Wrong size of ipmi event data = %i", dt_len); return NULL; } e = malloc(sizeof(*e)); if (!e) { err("Out of space"); return NULL; } memset(e, 0, sizeof(*e)); e->event.Source = 0; e->event.EventType = SAHPI_ET_SENSOR; e->event.Timestamp = ipmi_event_get_timestamp(event); // sensor num should be assigned later in calling functions e->event.EventDataUnion.SensorEvent.SensorNum = 0; if (data[7] >= 0xc0) { e->event.EventDataUnion.SensorEvent.SensorType = SAHPI_OEM_SENSOR; } else { e->event.EventDataUnion.SensorEvent.SensorType = data[7]; } e->event.EventDataUnion.SensorEvent.EventCategory = data[9] & 0x7f; set_thresholed_sensor_event_state(threshold, dir, high_low, &e->event.EventDataUnion.SensorEvent, &severity); e->event.Severity = severity; set_thresholds_sensor_misc_event (event, &e->event.EventDataUnion.SensorEvent); return e; } static int sensor_threshold_event(ipmi_sensor_t *sensor, enum ipmi_event_dir_e dir, enum ipmi_thresh_e threshold, enum ipmi_event_value_dir_e high_low, enum ipmi_value_present_e value_present, unsigned int raw_value, double value, void *cb_data, ipmi_event_t *event) { struct oh_event *e = NULL; struct oh_handler_state *handler = cb_data; e = sensor_threshold_map_event(dir, threshold, high_low, value_present, raw_value, value, event); if (e == NULL) { return IPMI_EVENT_HANDLED; } set_event_sensor_num(sensor, e, handler); e->hid = handler->hid; oh_evt_queue_push(handler->eventq, e); return IPMI_EVENT_HANDLED; } static void add_sensor_event_thresholds(ipmi_sensor_t *sensor, SaHpiSensorRecT *rec) { int val; SaHpiSensorThdMaskT temp; unsigned int access; if (rec->Category != SAHPI_EC_THRESHOLD) { rec->ThresholdDefn.IsAccessible = SAHPI_FALSE; return; } access = ipmi_sensor_get_threshold_access(sensor); if (access == IPMI_THRESHOLD_ACCESS_SUPPORT_NONE) { rec->ThresholdDefn.IsAccessible = SAHPI_FALSE; return; } if (access >= IPMI_THRESHOLD_ACCESS_SUPPORT_READABLE) { rec->ThresholdDefn.IsAccessible = SAHPI_TRUE; temp = 0; ipmi_sensor_threshold_readable(sensor, IPMI_LOWER_NON_CRITICAL, &val); if (val) temp |= SAHPI_STM_LOW_MINOR; ipmi_sensor_threshold_readable(sensor, IPMI_LOWER_CRITICAL, &val); if (val) temp |= SAHPI_STM_LOW_MAJOR; ipmi_sensor_threshold_readable(sensor, IPMI_LOWER_NON_RECOVERABLE, &val); if (val) temp |= SAHPI_STM_LOW_CRIT; ipmi_sensor_threshold_readable(sensor, IPMI_UPPER_NON_CRITICAL, &val); if (val) temp |= SAHPI_STM_UP_MINOR; ipmi_sensor_threshold_readable(sensor, IPMI_UPPER_CRITICAL, &val); if (val) temp |= SAHPI_STM_UP_MAJOR; ipmi_sensor_threshold_readable(sensor, IPMI_UPPER_NON_RECOVERABLE, &val); if (val) temp |= SAHPI_STM_UP_CRIT; val = ipmi_sensor_get_hysteresis_support(sensor); if (val == IPMI_HYSTERESIS_SUPPORT_READABLE || val == IPMI_HYSTERESIS_SUPPORT_SETTABLE) temp |= SAHPI_STM_UP_HYSTERESIS | SAHPI_STM_LOW_HYSTERESIS; rec->ThresholdDefn.ReadThold = temp; } if (access == IPMI_THRESHOLD_ACCESS_SUPPORT_SETTABLE) { temp = 0; ipmi_sensor_threshold_settable(sensor, IPMI_LOWER_NON_CRITICAL, &val); if (val) temp |= SAHPI_STM_LOW_MINOR; ipmi_sensor_threshold_settable(sensor, IPMI_LOWER_CRITICAL, &val); if (val) temp |= SAHPI_STM_LOW_MAJOR; ipmi_sensor_threshold_settable(sensor, IPMI_LOWER_NON_RECOVERABLE, &val); if (val) temp |= SAHPI_STM_LOW_CRIT; ipmi_sensor_threshold_settable(sensor, IPMI_UPPER_NON_CRITICAL, &val); if (val) temp |= SAHPI_STM_UP_MINOR; ipmi_sensor_threshold_settable(sensor, IPMI_UPPER_CRITICAL, &val); if (val) temp |= SAHPI_STM_UP_MAJOR; ipmi_sensor_threshold_settable(sensor, IPMI_UPPER_NON_RECOVERABLE, &val); if (val) temp |= SAHPI_STM_UP_CRIT; val = ipmi_sensor_get_hysteresis_support(sensor); if (val == IPMI_HYSTERESIS_SUPPORT_SETTABLE) temp |= SAHPI_STM_UP_HYSTERESIS | SAHPI_STM_LOW_HYSTERESIS; rec->ThresholdDefn.WriteThold = temp; } } static void add_sensor_event_data_format(ipmi_sensor_t *sensor, SaHpiSensorRecT *rec) { #define FILL_READING(reading, val) \ do { \ (reading).IsSupported = SAHPI_TRUE; \ (reading).Type = SAHPI_SENSOR_READING_TYPE_FLOAT64; \ (reading).Value.SensorFloat64 = (SaHpiFloat64T)val; \ } while (0) int rv; double accur = 0; double fval = 0; if (ipmi_sensor_get_event_reading_type(sensor) != IPMI_EVENT_READING_TYPE_THRESHOLD) { rec->DataFormat.IsSupported = SAHPI_FALSE; return; } rec->DataFormat.IsSupported = SAHPI_TRUE; rec->DataFormat.ReadingType = SAHPI_SENSOR_READING_TYPE_FLOAT64; rec->DataFormat.BaseUnits = (SaHpiSensorUnitsT) ipmi_sensor_get_base_unit(sensor); rec->DataFormat.ModifierUnits = (SaHpiSensorUnitsT) ipmi_sensor_get_modifier_unit(sensor); rec->DataFormat.ModifierUse = (SaHpiSensorModUnitUseT) ipmi_sensor_get_modifier_unit_use(sensor); ipmi_sensor_get_accuracy(sensor, 0, &accur); rec->DataFormat.AccuracyFactor = (SaHpiFloat64T)accur; rec->DataFormat.Percentage = (SaHpiBoolT) ipmi_sensor_get_percentage(sensor); rec->DataFormat.Range.Flags = 0; rv = ipmi_sensor_get_sensor_max(sensor, &fval); if (!rv) { FILL_READING(rec->DataFormat.Range.Max, fval); rec->DataFormat.Range.Flags |= SAHPI_SRF_MAX; } rv = ipmi_sensor_get_sensor_min(sensor, &fval); if (!rv) { FILL_READING(rec->DataFormat.Range.Min, fval); rec->DataFormat.Range.Flags |= SAHPI_SRF_MIN; } if (ipmi_sensor_get_nominal_reading_specified(sensor)) { rv = ipmi_sensor_get_nominal_reading(sensor, &fval); if (!rv) { FILL_READING(rec->DataFormat.Range.Nominal, fval); rec->DataFormat.Range.Flags |= SAHPI_SRF_NOMINAL; } } if (ipmi_sensor_get_normal_max_specified(sensor)) { rv = ipmi_sensor_get_normal_max(sensor, &fval); if (!rv) { FILL_READING(rec->DataFormat.Range.NormalMax, fval); rec->DataFormat.Range.Flags |= SAHPI_SRF_NORMAL_MAX; } } if (ipmi_sensor_get_normal_min_specified(sensor)) { rv = ipmi_sensor_get_normal_min(sensor, &fval); if (!rv) { FILL_READING(rec->DataFormat.Range.NormalMin, fval); rec->DataFormat.Range.Flags |= SAHPI_SRF_NORMAL_MIN; } } } static SaHpiEventCategoryT ohoi_sensor_get_event_reading_type(ipmi_sensor_t *sensor) { SaHpiEventCategoryT hpi_category; unsigned int ipmi_category; ipmi_category = ipmi_sensor_get_event_reading_type(sensor); switch (ipmi_category) { case IPMI_EVENT_READING_TYPE_DISCRETE_ACPI_POWER: case IPMI_EVENT_READING_TYPE_SENSOR_SPECIFIC: hpi_category = SAHPI_EC_GENERIC; break; default: hpi_category = ipmi_category; break; } return hpi_category; } static void add_sensor_states(ipmi_sensor_t *sensor, struct ohoi_sensor_info *sensor_info) { int i; int val; int rv; sensor_info->support_assert = 0; sensor_info->support_deassert = 0; if(ipmi_sensor_get_event_reading_type(sensor) != IPMI_EVENT_READING_TYPE_THRESHOLD) { for (i = 0; i < 15; i++) { rv = ipmi_sensor_discrete_event_supported(sensor, i, IPMI_ASSERTION, &val); if ((rv == 0) && val) { sensor_info->support_assert |= (1 << i); } rv = ipmi_sensor_discrete_event_supported(sensor, i, IPMI_DEASSERTION, &val); if ((rv == 0) && val) { sensor_info->support_deassert |= (1 << i); } } return; } // threshold sensor rv = ipmi_sensor_threshold_event_supported(sensor, IPMI_LOWER_NON_CRITICAL, IPMI_GOING_LOW, IPMI_ASSERTION, &val); if ((rv == 0) && (val != 0)) { sensor_info->support_assert |= OHOI_THS_LMINL; } rv = ipmi_sensor_threshold_event_supported(sensor, IPMI_LOWER_NON_CRITICAL, IPMI_GOING_HIGH, IPMI_ASSERTION, &val); if ((rv == 0) && (val != 0)) { sensor_info->support_assert |= OHOI_THS_LMINH; } rv = ipmi_sensor_threshold_event_supported(sensor, IPMI_LOWER_NON_CRITICAL, IPMI_GOING_LOW, IPMI_DEASSERTION, &val); if ((rv == 0) && (val != 0)) { sensor_info->support_deassert |= OHOI_THS_LMINL; } rv = ipmi_sensor_threshold_event_supported(sensor, IPMI_LOWER_NON_CRITICAL, IPMI_GOING_HIGH, IPMI_DEASSERTION, &val); if ((rv == 0) && (val != 0)) { sensor_info->support_deassert |= OHOI_THS_LMINH; } rv = ipmi_sensor_threshold_event_supported(sensor, IPMI_LOWER_CRITICAL, IPMI_GOING_LOW, IPMI_ASSERTION, &val); if ((rv == 0) && (val != 0)) { sensor_info->support_assert |= OHOI_THS_LMAJL; } rv = ipmi_sensor_threshold_event_supported(sensor, IPMI_LOWER_CRITICAL, IPMI_GOING_HIGH, IPMI_ASSERTION, &val); if ((rv == 0) && (val != 0)) { sensor_info->support_assert |= OHOI_THS_LMAJH; } rv = ipmi_sensor_threshold_event_supported(sensor, IPMI_LOWER_CRITICAL, IPMI_GOING_LOW, IPMI_DEASSERTION, &val); if ((rv == 0) && (val != 0)) { sensor_info->support_deassert |= OHOI_THS_LMAJL; } rv = ipmi_sensor_threshold_event_supported(sensor, IPMI_LOWER_CRITICAL, IPMI_GOING_HIGH, IPMI_DEASSERTION, &val); if ((rv == 0) && (val != 0)) { sensor_info->support_deassert |= OHOI_THS_LMAJH; } rv = ipmi_sensor_threshold_event_supported(sensor, IPMI_LOWER_NON_RECOVERABLE, IPMI_GOING_LOW, IPMI_ASSERTION, &val); if ((rv == 0) && (val != 0)) { sensor_info->support_assert |= OHOI_THS_LCRTL; } rv = ipmi_sensor_threshold_event_supported(sensor, IPMI_LOWER_NON_RECOVERABLE, IPMI_GOING_HIGH, IPMI_ASSERTION, &val); if ((rv == 0) && (val != 0)) { sensor_info->support_assert |= OHOI_THS_LCRTH; } rv = ipmi_sensor_threshold_event_supported(sensor, IPMI_LOWER_NON_RECOVERABLE, IPMI_GOING_LOW, IPMI_DEASSERTION, &val); if ((rv == 0) && (val != 0)) { sensor_info->support_deassert |= OHOI_THS_LCRTL; } rv = ipmi_sensor_threshold_event_supported(sensor, IPMI_LOWER_NON_RECOVERABLE, IPMI_GOING_HIGH, IPMI_DEASSERTION, &val); if ((rv == 0) && (val != 0)) { sensor_info->support_deassert |= OHOI_THS_LCRTH; } rv = ipmi_sensor_threshold_event_supported(sensor, IPMI_UPPER_NON_CRITICAL, IPMI_GOING_LOW, IPMI_ASSERTION, &val); if ((rv == 0) && (val != 0)) { sensor_info->support_assert |= OHOI_THS_UMINL; } rv = ipmi_sensor_threshold_event_supported(sensor, IPMI_UPPER_NON_CRITICAL, IPMI_GOING_HIGH, IPMI_ASSERTION, &val); if ((rv == 0) && (val != 0)) { sensor_info->support_assert |= OHOI_THS_UMINH; } rv = ipmi_sensor_threshold_event_supported(sensor, IPMI_UPPER_NON_CRITICAL, IPMI_GOING_LOW, IPMI_DEASSERTION, &val); if ((rv == 0) && (val != 0)) { sensor_info->support_deassert |= OHOI_THS_UMINL; } rv = ipmi_sensor_threshold_event_supported(sensor, IPMI_UPPER_NON_CRITICAL, IPMI_GOING_HIGH, IPMI_DEASSERTION, &val); if ((rv == 0) && (val != 0)) { sensor_info->support_deassert |= OHOI_THS_UMINH; } rv = ipmi_sensor_threshold_event_supported(sensor, IPMI_UPPER_CRITICAL, IPMI_GOING_LOW, IPMI_ASSERTION, &val); if ((rv == 0) && (val != 0)) { sensor_info->support_assert |= OHOI_THS_UMAJL; } rv = ipmi_sensor_threshold_event_supported(sensor, IPMI_UPPER_CRITICAL, IPMI_GOING_HIGH, IPMI_ASSERTION, &val); if ((rv == 0) && (val != 0)) { sensor_info->support_assert |= OHOI_THS_UMAJH; } rv = ipmi_sensor_threshold_event_supported(sensor, IPMI_UPPER_CRITICAL, IPMI_GOING_LOW, IPMI_DEASSERTION, &val); if ((rv == 0) && (val != 0)) { sensor_info->support_deassert |= OHOI_THS_UMAJL; } rv = ipmi_sensor_threshold_event_supported(sensor, IPMI_UPPER_CRITICAL, IPMI_GOING_HIGH, IPMI_DEASSERTION, &val); if ((rv == 0) && (val != 0)) { sensor_info->support_deassert |= OHOI_THS_UMAJH; } rv = ipmi_sensor_threshold_event_supported(sensor, IPMI_UPPER_NON_RECOVERABLE, IPMI_GOING_LOW, IPMI_ASSERTION, &val); if ((rv == 0) && (val != 0)) { sensor_info->support_assert |= OHOI_THS_UCRTL; } rv = ipmi_sensor_threshold_event_supported(sensor, IPMI_UPPER_NON_RECOVERABLE, IPMI_GOING_HIGH, IPMI_ASSERTION, &val); if ((rv == 0) && (val != 0)) { sensor_info->support_assert |= OHOI_THS_UCRTH; } rv = ipmi_sensor_threshold_event_supported(sensor, IPMI_UPPER_NON_RECOVERABLE, IPMI_GOING_LOW, IPMI_DEASSERTION, &val); if ((rv == 0) && (val != 0)) { sensor_info->support_deassert |= OHOI_THS_UCRTL; } rv = ipmi_sensor_threshold_event_supported(sensor, IPMI_UPPER_NON_RECOVERABLE, IPMI_GOING_HIGH, IPMI_DEASSERTION, &val); if ((rv == 0) && (val != 0)) { sensor_info->support_deassert |= OHOI_THS_UCRTH; } } static SaHpiEventStateT convert_to_hpi_event_state( ipmi_sensor_t *sensor, struct ohoi_sensor_info *sensor_info) { unsigned int ast = sensor_info->support_assert; unsigned int dst = sensor_info->support_deassert; SaHpiEventStateT hst = 0; if(ipmi_sensor_get_event_reading_type(sensor) != IPMI_EVENT_READING_TYPE_THRESHOLD) { return (SaHpiEventStateT)((ast | dst) & 0x7fff); } if ((ast | dst) & (OHOI_THS_LMINL | OHOI_THS_LMINH)) { hst |= SAHPI_ES_LOWER_MINOR; } if ((ast | dst) & (OHOI_THS_LMAJL | OHOI_THS_LMAJH)) { hst |= SAHPI_ES_LOWER_MAJOR; } if ((ast | dst) & (OHOI_THS_LCRTL | OHOI_THS_LCRTH)) { hst |= SAHPI_ES_LOWER_CRIT; } if ((ast | dst) & (OHOI_THS_UMINL | OHOI_THS_UMINH)) { hst |= SAHPI_ES_UPPER_MINOR; } if ((ast | dst) & (OHOI_THS_UMAJL | OHOI_THS_UMAJH)) { hst |= SAHPI_ES_UPPER_MAJOR; } if ((ast | dst) & (OHOI_THS_UCRTL | OHOI_THS_UCRTH)) { hst |= SAHPI_ES_UPPER_CRIT; } return hst; } static void add_sensor_event_sensor_rec(struct oh_handler_state *handler, ipmi_sensor_t *sensor, SaHpiSensorRecT *rec) { rec->Type = (SaHpiSensorTypeT)ipmi_sensor_get_sensor_type(sensor); if (rec->Type >= 0xc0) { rec->Type = SAHPI_OEM_SENSOR; } rec->Category = ohoi_sensor_get_event_reading_type(sensor); rec->EventCtrl = (SaHpiSensorEventCtrlT)ipmi_sensor_get_event_support(sensor); add_sensor_event_data_format(sensor, rec); add_sensor_event_thresholds(sensor, rec); rec->Oem = ipmi_sensor_get_oem1(sensor); } static void add_sensor_event_rdr(struct oh_handler_state *handler, ipmi_sensor_t *sensor, SaHpiRdrT *rdr, SaHpiEntityPathT parent_ep, SaHpiResourceIdT res_id) { char name[SAHPI_MAX_TEXT_BUFFER_LENGTH]; SaHpiTextTypeT data_type; int name_len; memset(name, '\0', SAHPI_MAX_TEXT_BUFFER_LENGTH); rdr->RecordId = 0; rdr->RdrType = SAHPI_SENSOR_RDR; rdr->Entity = parent_ep; add_sensor_event_sensor_rec(handler, sensor, &rdr->RdrTypeUnion.SensorRec); ipmi_sensor_get_id(sensor, name, SAHPI_MAX_TEXT_BUFFER_LENGTH); data_type = convert_to_hpi_data_type(ipmi_sensor_get_id_type(sensor)); name_len = ipmi_sensor_get_id_length(sensor); if (name_len >= SAHPI_MAX_TEXT_BUFFER_LENGTH) name_len = SAHPI_MAX_TEXT_BUFFER_LENGTH - 1; rdr->IdString.DataType = data_type; rdr->IdString.Language = SAHPI_LANG_ENGLISH; rdr->IdString.DataLength = name_len; switch ( ipmi_sensor_get_event_support(sensor) ) { case IPMI_EVENT_SUPPORT_PER_STATE: rdr->RdrTypeUnion.SensorRec.EventCtrl = SAHPI_SEC_PER_EVENT; rdr->RdrTypeUnion.SensorRec.EnableCtrl = SAHPI_TRUE; break; case IPMI_EVENT_SUPPORT_ENTIRE_SENSOR: rdr->RdrTypeUnion.SensorRec.EventCtrl = SAHPI_SEC_READ_ONLY_MASKS; rdr->RdrTypeUnion.SensorRec.EnableCtrl = SAHPI_TRUE; break; case IPMI_EVENT_SUPPORT_GLOBAL_ENABLE: case IPMI_EVENT_SUPPORT_NONE: rdr->RdrTypeUnion.SensorRec.EventCtrl = SAHPI_SEC_READ_ONLY; break; } memset(rdr->IdString.Data, 0, SAHPI_MAX_TEXT_BUFFER_LENGTH); memcpy(rdr->IdString.Data, name, name_len); } static void add_sensor_event(ipmi_entity_t *ent, ipmi_sensor_t *sensor, struct oh_handler_state *handler, SaHpiRptEntryT *rpt) { struct ohoi_sensor_info *sensor_info; SaHpiRdrT rdr; int lun, num; int rv; sensor_info = malloc(sizeof(*sensor_info)); if (!sensor_info) { err("Out of memory for sensor info"); return; } sensor_info->type = OHOI_SENSOR_ORIGINAL; sensor_info->ohoii.get_sensor_event_enable = orig_get_sensor_event_enable; sensor_info->ohoii.set_sensor_event_enable = orig_set_sensor_event_enable; sensor_info->ohoii.get_sensor_reading = orig_get_sensor_reading; sensor_info->ohoii.get_sensor_thresholds = orig_get_sensor_thresholds; sensor_info->ohoii.set_sensor_thresholds = orig_set_sensor_thresholds; sensor_info->info.orig_sensor_info.sensor_id = ipmi_sensor_convert_to_id(sensor); sensor_info->sen_enabled = SAHPI_TRUE; sensor_info->enable = SAHPI_TRUE; add_sensor_states(sensor, sensor_info); memset(&rdr, 0, sizeof(rdr)); rdr.RdrTypeUnion.SensorRec.Events = convert_to_hpi_event_state(sensor, sensor_info); rv = ipmi_sensor_get_num(sensor, &lun, &num); if(rv) { err("Error getting sensor number"); rdr.RdrTypeUnion.SensorRec.Num = SA_ERR_HPI_INVALID_DATA; } else { rdr.RdrTypeUnion.SensorRec.Num = num; } add_sensor_event_rdr(handler, sensor, &rdr, rpt->ResourceEntity, rpt->ResourceId); adjust_sensor_to_atcahpi_spec(handler, rpt, &rdr, sensor_info, sensor); rv = oh_add_rdr(handler->rptcache, rpt->ResourceId, &rdr, sensor_info, 1); if (rv != SA_OK) { free(sensor_info); err("Failed to add sensor rdr"); } } void ohoi_sensor_event(enum ipmi_update_e op, ipmi_entity_t *ent, ipmi_sensor_t *sensor, void *cb_data) { char name[33]; int rv; ipmi_sensor_id_t sid = ipmi_sensor_convert_to_id(sensor); struct oh_handler_state *handler = cb_data; struct ohoi_handler *ipmi_handler = handler->data; struct ohoi_resource_info *res_info; ipmi_entity_id_t entity_id; SaHpiRptEntryT *rpt_entry; g_static_rec_mutex_lock(&ipmi_handler->ohoih_lock); ipmi_sensor_get_id(sensor, name, 32); entity_id = ipmi_entity_convert_to_id(ent); rpt_entry = ohoi_get_resource_by_entityid(handler->rptcache, &entity_id); if (!rpt_entry) { dump_entity_id("Sensor without RPT Entry?!", entity_id); g_static_rec_mutex_unlock(&ipmi_handler->ohoih_lock); return; } res_info = oh_get_resource_data(handler->rptcache, rpt_entry->ResourceId); switch (op) { case IPMI_ADDED: trace_ipmi_sensors("ADD", sid); rpt_entry->ResourceCapabilities |= SAHPI_CAPABILITY_RDR | SAHPI_CAPABILITY_SENSOR; /* fill in the sensor data, add it to ipmi_event_list * and finally to the rpt-cache */ add_sensor_event(ent, sensor, handler, rpt_entry); trace_ipmi("Sensor Added"); if (ipmi_sensor_get_event_reading_type(sensor) == IPMI_EVENT_READING_TYPE_THRESHOLD) { rv = ipmi_sensor_add_threshold_event_handler( sensor, sensor_threshold_event, handler); } else { if (IS_ATCA(ipmi_handler->d_type) && (ipmi_sensor_get_sensor_type(sensor) == 0xF0)) { break; } rv = ipmi_sensor_add_discrete_event_handler( sensor, sensor_discrete_event, handler); } if (rv) err("Unable to reg sensor event handler: %#x\n", rv); break; case IPMI_CHANGED: trace_ipmi_sensors("CHANGED", sid); add_sensor_event(ent, sensor, handler, rpt_entry); dbg("Sensor Changed"); break; case IPMI_DELETED: trace_ipmi_sensors("DELELE", sid); if (ohoi_delete_orig_sensor_rdr(handler, rpt_entry, &sid)) { // no more sensors for rpt rpt_entry->ResourceCapabilities &= ~SAHPI_CAPABILITY_SENSOR; } if ((oh_get_rdr_next(handler->rptcache, rpt_entry->ResourceId, SAHPI_FIRST_ENTRY) == NULL) && (res_info->fru == NULL)) { // no more rdrs for rpt rpt_entry->ResourceCapabilities &= ~SAHPI_CAPABILITY_RDR; } /* We don't do anything, if the entity is gone infrastructre deletes the RDRs automatically */ break; } trace_ipmi("Set updated for resource %d . Sensor", rpt_entry->ResourceId); entity_rpt_set_updated(res_info, ipmi_handler); g_static_rec_mutex_unlock(&ipmi_handler->ohoih_lock); } /* * get_sensor_by_sensor_id_handler * * This is just callback to get ipmi_sensor_t from ipmi_sensor_id_t * and auxiliary structure to do it */ static void get_sensor_by_sensor_id_handler(ipmi_sensor_t *sensor, void *cb_data) { ipmi_entity_id_t *entity_id = cb_data; if (sensor == NULL) { ipmi_entity_id_set_invalid(entity_id); } *entity_id = ipmi_entity_convert_to_id( ipmi_sensor_get_entity(sensor)); } int ohoi_sensor_ipmi_event_to_hpi_event( struct ohoi_handler *ipmi_handler, ipmi_sensor_id_t sid, ipmi_event_t *event, struct oh_event **e, ipmi_entity_id_t *entity_id ) { // sens_info_t info; enum ipmi_event_dir_e dir; struct oh_event * ev = NULL; unsigned char data[IPMI_EVENT_DATA_MAX_LEN]; unsigned int dt_len; int rv; dt_len = ipmi_event_get_data(event, data, 0, IPMI_EVENT_DATA_MAX_LEN); if (dt_len != 13) { err("Wrong size of ipmi event data = %i", dt_len); return 0; } rv = ipmi_sensor_pointer_cb(sid, get_sensor_by_sensor_id_handler, entity_id); if (rv) { err("no sensor for sensor_id rv = 0x%x", rv); } dir = data[9] >> 7; if ((data[9] & 0x7f) == IPMI_EVENT_READING_TYPE_THRESHOLD) { enum ipmi_thresh_e threshold; enum ipmi_event_value_dir_e high_low; enum ipmi_value_present_e value_present; unsigned int raw_value; double value; threshold = (data[10] >> 1) & 0x07; high_low = data[10] & 1; raw_value = data[11]; value = 0.0; value_present = IPMI_NO_VALUES_PRESENT; ev = sensor_threshold_map_event(dir, threshold, high_low, value_present, raw_value, value, event); } else { int offset; int severity = 0; int prev_severity = 0; offset = data[10] & 0x0f; if ((data[10] >> 6) == 2) { severity = data[11] >> 4; prev_severity = data[11] & 0xf; if (severity == 0xf) { severity = -1; } if (prev_severity == 0xf) { prev_severity = -1; } } ev = sensor_discrete_map_event(ipmi_handler,dir, offset, severity, prev_severity, event); } if (ev == NULL) { return 1; } if (ev->event.EventDataUnion.SensorEvent.SensorNum == 0) { ev->event.EventDataUnion.SensorEvent.SensorNum = data[8]; } *e = ev; return 0; } openhpi-2.14.1/plugins/ipmi/ipmi.h0000644000076400007640000006477111302567001013731 0ustar /* -*- linux-c -*- * * Copyright (c) 2003 by Intel Corp. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Louis Zhuang * Kevin Gao * Rusty Lynch * Racing Guo */ #ifndef _INC_IPMI_H_ #define _INC_IPMI_H_ #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #define IPMI_DATA_WAIT 10 #define OEM_ALARM_BASE 0x10 #define IPMI_EVENT_DATA_MAX_LEN 13 #define MAX_ES_STATE 15 /* max number of possible event state - 1 */ typedef struct ohoi_atca_pwonseq_dsk_s { unsigned char body[5]; SaHpiResourceIdT slotid; } ohoi_atca_pwonseq_dsk_t; typedef struct ohoi_atca_pwonseq_rec_s { unsigned char head[7]; unsigned char updated; unsigned int rec_num; } ohoi_atca_pwonseq_rec_t; struct ohoi_handler { GStaticRecMutex ohoih_lock; int SDRs_read_done; int bus_scan_done; int SELs_read_done; int mc_count; /* to keep track of num of mcs to wait on sdrs */ int sel_clear_done; /* we need to wait for mc_sel_reread for clear to succeed */ int FRU_done; /* we have to track FRUs */ ipmi_domain_id_t domain_id; /* OpenIPMI connection and os_handler */ os_handler_t *os_hnd; ipmi_con_t *cons[2]; unsigned int num_cons; selector_t *ohoi_sel; char *entity_root; int connected; int islan; int fully_up; time_t fullup_timeout; int updated; unsigned int openipmi_scan_time; int real_write_fru; SaHpiDomainIdT did; enum ipmi_domain_type d_type; char domain_name[24]; /* ATCA part */ int shmc_num; int shmc_present_num; ipmi_mcid_t virt_mcid; SaHpiResourceIdT atca_shelf_id; SaHpiResourceIdT atca_vshm_id; int shelf_fru_corrupted; int atca_pwonseq_updated; GSList *atca_pwonseq_recs; GSList *atca_pwonseq_desk; }; #define IS_ATCA(type) ((type) == IPMI_DOMAIN_TYPE_ATCA) struct ohoi_inventory_info; typedef struct ohoi_slotid_s { unsigned char addr; unsigned char devid; ipmi_entity_id_t entity_id; } ohoi_slotid_t; typedef struct ohoi_entity_s { ipmi_mcid_t mc_id; ipmi_entity_id_t entity_id; } ohoi_entity_t;; #define OHOI_RESOURCE_ENTITY 0x01 #define OHOI_RESOURCE_SLOT 0x02 #define OHOI_RESOURCE_MC 0x04 #define OHOI_FAN_CONTROL_CREATED 0x10 #define OHOI_MC_RESET_CONTROL_CREATED 0x20 #define OHOI_MC_IPMB0_CONTROL_CREATED 0x40 struct ohoi_resource_info { unsigned char presence; /* entity presence from OpenIPMI to determine to push RPT to domain RPTable or not */ unsigned char updated; /* refcount of resource add/update from rptcache to domain RPT */ unsigned char deleted; /* entity must be deleled after event of removing RPT has been sent to domain */ unsigned char hs_mark; /* to handle properly M3->M6->M1 ATCA transition */ SaHpiTimeoutT hs_inspen_time; /* time of last insertion pending state */ SaHpiUint8T sensor_count; SaHpiUint8T ctrl_count; unsigned int type; union { ohoi_entity_t entity; ohoi_slotid_t slot; } u; int max_ipmb0_link; ipmi_control_id_t reset_ctrl; ipmi_control_id_t power_ctrl; SaHpiCtrlNumT hotswapind; struct ohoi_inventory_info *fru; }; typedef struct atca_common_info { int done; SaErrorT rv; unsigned char data[255]; unsigned int len; unsigned char addr; unsigned char devid; void *info; } atca_common_info_t; /* Sensor info */ #define OHOI_THS_LMINH 0x0001 #define OHOI_THS_LMINL 0x0002 #define OHOI_THS_LMAJH 0x0004 #define OHOI_THS_LMAJL 0x0008 #define OHOI_THS_LCRTH 0x0010 #define OHOI_THS_LCRTL 0x0020 #define OHOI_THS_UMINH 0x0040 #define OHOI_THS_UMINL 0x0080 #define OHOI_THS_UMAJH 0x0100 #define OHOI_THS_UMAJL 0x0200 #define OHOI_THS_UCRTH 0x0400 #define OHOI_THS_UCRTL 0x0800 typedef enum { OHOI_SENSOR_ORIGINAL = 1, OHOI_SENSOR_ATCA_MAPPED } ohoi_sensor_type_t; typedef struct ohoi_original_sensor_info { ipmi_sensor_id_t sensor_id; } ohoi_original_sensor_info_t; typedef struct ohoi_atcamap_sensor_info { void *data; int val; SaHpiResourceIdT rid; } ohoi_atcamap_sensor_info_t; typedef union { ohoi_original_sensor_info_t orig_sensor_info; ohoi_atcamap_sensor_info_t atcamap_sensor_info; } ohoi_sensor_info_union_t; struct ohoi_sensor_info; typedef struct ohoi_sensor_interfaces { SaErrorT (*get_sensor_event_enable)(struct oh_handler_state *hnd, struct ohoi_sensor_info *sinfo, SaHpiBoolT *enable, SaHpiEventStateT *assert, SaHpiEventStateT *deassert); SaErrorT (*set_sensor_event_enable)(struct oh_handler_state *hnd, struct ohoi_sensor_info *sinfo, SaHpiBoolT enable, SaHpiEventStateT assert, SaHpiEventStateT deassert, unsigned int a_supported, unsigned int d_supported); SaErrorT (*get_sensor_reading)(struct oh_handler_state *hnd, struct ohoi_sensor_info *sensor_info, SaHpiSensorReadingT *reading, SaHpiEventStateT *ev_state); SaErrorT (*get_sensor_thresholds)(struct oh_handler_state *hnd, struct ohoi_sensor_info *sinfo, SaHpiSensorThresholdsT *thres); SaErrorT (*set_sensor_thresholds)(struct oh_handler_state *hnd, struct ohoi_sensor_info *sinfo, const SaHpiSensorThresholdsT *thres); } ohoi_sensor_interfaces_t; struct ohoi_sensor_info { ohoi_sensor_type_t type; ohoi_sensor_info_union_t info; int sen_enabled; SaHpiBoolT enable; SaHpiEventStateT assert; SaHpiEventStateT deassert; unsigned int support_assert; unsigned int support_deassert; ohoi_sensor_interfaces_t ohoii; }; /* Control info*/ typedef enum { OHOI_CTRL_ORIGINAL = 1, OHOI_CTRL_ATCA_MAPPED } ohoi_control_type_t; typedef struct ohoi_original_ctrl_info { ipmi_control_id_t ctrl_id; } ohoi_original_ctrl_info_t; typedef struct ohoi_atcamap_ctrl_info { void *data; int val; SaHpiResourceIdT rid; } ohoi_atcamap_ctrl_info_t; typedef union { ohoi_original_ctrl_info_t orig_ctrl_info; ohoi_atcamap_ctrl_info_t atcamap_ctrl_info; } ohoi_control_info_union_t; struct ohoi_control_info; typedef struct ohoi_ctrl_interfaces { SaErrorT (*get_control_state)(struct oh_handler_state *hnd, struct ohoi_control_info *c, SaHpiRdrT * rdr, SaHpiCtrlModeT *mode, SaHpiCtrlStateT *state); SaErrorT (*set_control_state)(struct oh_handler_state *hnd, struct ohoi_control_info *c, SaHpiRdrT * rdr, SaHpiCtrlModeT mode, SaHpiCtrlStateT *state); } ohoi_ctrl_interfaces_t; struct ohoi_control_info { ohoi_control_type_t type; ohoi_control_info_union_t info; SaHpiCtrlModeT mode; ohoi_ctrl_interfaces_t ohoii; }; /* Inventory info*/ struct ohoi_inventory_info { SaHpiUint32T update_count; // zero if area doesn't exist. If area exists // lang for board and product info, 1 for the rest unsigned char iu, ci, bi, pi, oem; unsigned int ci_fld_msk; unsigned int ci_custom_num; unsigned int bi_fld_msk; unsigned int bi_custom_num; unsigned int pi_fld_msk; unsigned int pi_custom_num; unsigned int oem_fields_num; GSList *oem_areas; GMutex *mutex; }; #define OHOI_AREA_EMPTY_ID 0 #define OHOI_AREA_FIRST_ID 1 #define OHOI_INTERNAL_USE_AREA_ID 1 #define OHOI_CHASSIS_INFO_AREA_ID 2 #define OHOI_BOARD_INFO_AREA_ID 3 #define OHOI_PRODUCT_INFO_AREA_ID 4 #define FIRST_OEM_AREA_NUM 5 #define OHOI_FIELD_EMPTY_ID 0 #define OHOI_FIELD_FIRST_ID 1 SaHpiTextTypeT convert_to_hpi_data_type(enum ipmi_str_type_e type); /* implemented in ipmi_event.c */ void ohoi_setup_done(ipmi_domain_t *domain, void *user_data); /* implemented in ipmi_close.c */ void ohoi_close_connection(ipmi_domain_id_t domain_id, void *user_data); /* implemented in ipmi_sensor.c */ SaErrorT orig_get_sensor_reading(struct oh_handler_state *handler, struct ohoi_sensor_info *sinfo, SaHpiSensorReadingT * reading, SaHpiEventStateT * ev_state); SaErrorT ohoi_get_sensor_reading(void *hnd, struct ohoi_sensor_info *sinfo, SaHpiSensorReadingT * reading, SaHpiEventStateT * ev_state); SaErrorT orig_get_sensor_thresholds(struct oh_handler_state *handler, struct ohoi_sensor_info *sinfo, SaHpiSensorThresholdsT *thres); SaErrorT ohoi_get_sensor_thresholds(void *hnd, struct ohoi_sensor_info *sinfo, SaHpiSensorThresholdsT *thres); SaErrorT orig_set_sensor_thresholds(struct oh_handler_state *handler, struct ohoi_sensor_info *sinfo, const SaHpiSensorThresholdsT *thres); SaErrorT ohoi_set_sensor_thresholds(void *hnd, struct ohoi_sensor_info *sinfo, const SaHpiSensorThresholdsT *thres); int ohoi_set_sensor_enable(ipmi_sensor_id_t sensor_id, SaHpiBoolT enable, void *cb_data); SaErrorT orig_get_sensor_event_enable(struct oh_handler_state *handler, struct ohoi_sensor_info *sinfo, SaHpiBoolT *enable, SaHpiEventStateT *assert, SaHpiEventStateT *deassert); SaErrorT ohoi_get_sensor_event_enable(void *hnd, struct ohoi_sensor_info *sinfo, SaHpiBoolT *enable, SaHpiEventStateT *assert, SaHpiEventStateT *deassert); SaErrorT orig_set_sensor_event_enable(struct oh_handler_state *handler, struct ohoi_sensor_info *sinfo, SaHpiBoolT enable, SaHpiEventStateT assert, SaHpiEventStateT deassert, unsigned int a_supported, unsigned int d_supported); SaErrorT ohoi_set_sensor_event_enable(void *hnd, struct ohoi_sensor_info *sinfo, SaHpiBoolT enable, SaHpiEventStateT assert, SaHpiEventStateT deassert, unsigned int a_supported, unsigned int d_supported); void ohoi_get_sel_time(ipmi_mcid_t mc_id, SaHpiTimeT *time, void *cb_data); void ohoi_set_sel_time(ipmi_mcid_t mc_id, const struct timeval *time, void *cb_data); void ohoi_get_sel_updatetime(ipmi_mcid_t mc_id, SaHpiTimeT *time); void ohoi_get_sel_size(ipmi_mcid_t mc_id, int *size); void ohoi_get_sel_count(ipmi_mcid_t mc_id, int *count); void ohoi_get_sel_overflow(ipmi_mcid_t mc_id, char *overflow); void ohoi_get_sel_support_del(ipmi_mcid_t mc_id, char *support_del); SaErrorT ohoi_clear_sel(ipmi_mcid_t mc_id, void *cb_data); SaErrorT ohoi_set_sel_state(struct ohoi_handler *ipmi_handler, ipmi_mcid_t mc_id, int enable); SaErrorT ohoi_get_sel_state(struct ohoi_handler *ipmi_handler, ipmi_mcid_t mc_id, int *enable); void ohoi_get_sel_first_entry(ipmi_mcid_t mc_id, ipmi_event_t **event); void ohoi_get_sel_last_entry(ipmi_mcid_t mc_id, ipmi_event_t **event); void ohoi_get_sel_next_recid(ipmi_mcid_t mc_id, ipmi_event_t *event, unsigned int *record_id); void ohoi_get_sel_prev_recid(ipmi_mcid_t mc_id, ipmi_event_t *event, unsigned int *record_id); void ohoi_get_sel_by_recid(ipmi_mcid_t mc_id, SaHpiEventLogEntryIdT entry_id, ipmi_event_t **event); /* This is used to help plug-in to find resource in rptcache by entity_id and mc_id*/ SaHpiResourceIdT ohoi_get_parent_id(SaHpiRptEntryT *child); SaHpiRptEntryT *ohoi_get_resource_by_entityid(RPTable *table, const ipmi_entity_id_t *entity_id); SaHpiRptEntryT *ohoi_get_resource_by_mcid(RPTable *table, const ipmi_mcid_t *mc_id); /* This is used to help plug-in to find rdr in rptcache by data*/ SaHpiRdrT *ohoi_get_rdr_by_data(RPTable *table, SaHpiResourceIdT rid, SaHpiRdrTypeT type, void *data); /* This is used for OpenIPMI to notice sensor change */ void ohoi_sensor_event(enum ipmi_update_e op, ipmi_entity_t *ent, ipmi_sensor_t *sensor, void *cb_data); /* * This is used to help saHpiEventLogEntryGet() * to convert sensor ipmi event to hpi event */ int ohoi_sensor_ipmi_event_to_hpi_event( struct ohoi_handler *ipmi_handler, ipmi_sensor_id_t sid, ipmi_event_t *event, struct oh_event **e, ipmi_entity_id_t *eid); /* This is used for OpenIPMI to notice control change */ void ohoi_control_event(enum ipmi_update_e op, ipmi_entity_t *ent, ipmi_control_t *control, void *cb_data); /* This is used for OpenIPMI to notice mc change */ void ohoi_mc_event(enum ipmi_update_e op, ipmi_domain_t *domain, ipmi_mc_t *mc, void *cb_data); /* This is used for OpenIPMI to noice inventroy change */ void ohoi_inventory_event(enum ipmi_update_e op, ipmi_entity_t *entity, void *cb_data); /* This is used for OpenIPMI to notice entity change */ void ohoi_entity_event(enum ipmi_update_e op, ipmi_domain_t *domain, ipmi_entity_t *entity, void *cb_data); int ohoi_loop(int *done_flag, struct ohoi_handler *ipmi_handler); typedef int (*loop_indicator_cb)(const void *cb_data); int ohoi_loop_until(loop_indicator_cb indicator, const void *cb_data, int timeout, struct ohoi_handler *ipmi_handler); SaErrorT ohoi_get_rdr_data(const struct oh_handler_state *handler, SaHpiResourceIdT id, SaHpiRdrTypeT type, SaHpiSensorNumT num, void **pdata); int ohoi_delete_orig_sensor_rdr(struct oh_handler_state *handler, SaHpiRptEntryT *rpt, ipmi_sensor_id_t *mysid); int ohoi_delete_orig_control_rdr(struct oh_handler_state *handler, SaHpiRptEntryT *rpt, ipmi_control_id_t *mycid); typedef int (*rpt_loop_handler_cb)( struct oh_handler_state *handler, SaHpiRptEntryT *rpt, struct ohoi_resource_info *res_info, void *cb_data); void ohoi_iterate_rptcache(struct oh_handler_state *handler, rpt_loop_handler_cb func, void *cb_data); typedef int (*rdr_loop_handler_cb)( struct oh_handler_state *handler, SaHpiRptEntryT *rpt, SaHpiRdrT *rdr, void *cb_data); void ohoi_iterate_rpt_rdrs(struct oh_handler_state *handler, SaHpiRptEntryT *rpt, rdr_loop_handler_cb func, void *cb_data); int ohoi_rpt_has_controls(struct oh_handler_state *handler, SaHpiResourceIdT rid); int ohoi_rpt_has_sensors(struct oh_handler_state *handler, SaHpiResourceIdT rid); SaErrorT ohoi_get_idr_info(void *hnd, SaHpiResourceIdT rid, SaHpiIdrIdT idrid, SaHpiIdrInfoT *idrinfo); SaErrorT ohoi_get_idr_area_header(void *hnd, SaHpiResourceIdT rid, SaHpiIdrIdT idrid, SaHpiIdrAreaTypeT areatype, SaHpiEntryIdT areaid, SaHpiEntryIdT *nextareaid, SaHpiIdrAreaHeaderT *header); SaErrorT ohoi_add_idr_area(void *hnd, SaHpiResourceIdT rid, SaHpiIdrIdT idrid, SaHpiIdrAreaTypeT areatype, SaHpiEntryIdT *areaid); SaErrorT ohoi_del_idr_area(void *hnd, SaHpiResourceIdT rid, SaHpiIdrIdT idrid, SaHpiEntryIdT areaid); SaErrorT ohoi_get_idr_field(void *hnd, SaHpiResourceIdT rid, SaHpiIdrIdT idrid, SaHpiEntryIdT areaid, SaHpiIdrFieldTypeT fieldtype, SaHpiEntryIdT fieldid, SaHpiEntryIdT *nextfieldid, SaHpiIdrFieldT *field); SaErrorT ohoi_add_idr_field(void *hnd, SaHpiResourceIdT rid, SaHpiIdrIdT idrid, SaHpiIdrFieldT *field ); SaErrorT ohoi_set_idr_field(void *hnd, SaHpiResourceIdT rid, SaHpiIdrIdT idrid, SaHpiIdrFieldT *field ); SaErrorT ohoi_del_idr_field(void *hnd, SaHpiResourceIdT rid, SaHpiIdrIdT idrid, SaHpiEntryIdT areaid, SaHpiEntryIdT fieldid); void ohoi_delete_rpt_fru(struct ohoi_resource_info *res_info); int ohoi_hot_swap_cb(ipmi_entity_t *ent, enum ipmi_hot_swap_states last_state, enum ipmi_hot_swap_states curr_state, void *cb_data, ipmi_event_t *event); SaErrorT ohoi_get_hotswap_state(void *hnd, SaHpiResourceIdT id, SaHpiHsStateT *state); SaErrorT ohoi_set_hotswap_state(void *hnd, SaHpiResourceIdT id, SaHpiHsStateT state); SaErrorT ohoi_request_hotswap_action(void *hnd, SaHpiResourceIdT id, SaHpiHsActionT act); SaErrorT ohoi_get_indicator_state(void *hnd, SaHpiResourceIdT id, SaHpiHsIndicatorStateT *state); SaErrorT ohoi_hotswap_policy_cancel(void *hnd, SaHpiResourceIdT rid, SaHpiTimeoutT ins_timeout); SaErrorT ohoi_set_indicator_state(void *hnd, SaHpiResourceIdT id, SaHpiHsIndicatorStateT state); SaErrorT ohoi_set_power_state(void *hnd, SaHpiResourceIdT id, SaHpiPowerStateT state); SaErrorT ohoi_get_power_state(void *hnd, SaHpiResourceIdT id, SaHpiPowerStateT *state); SaErrorT ohoi_set_reset_state(void *hnd, SaHpiResourceIdT id, SaHpiResetActionT act); SaErrorT ohoi_get_reset_state(void *hnd, SaHpiResourceIdT id, SaHpiResetActionT *act); SaErrorT orig_get_control_state(struct oh_handler_state *handler, struct ohoi_control_info *c, SaHpiRdrT * rdr, SaHpiCtrlModeT *mode, SaHpiCtrlStateT *state); SaErrorT orig_set_control_state(struct oh_handler_state *handler, struct ohoi_control_info *c, SaHpiRdrT * rdr, SaHpiCtrlModeT mode, SaHpiCtrlStateT *state); SaErrorT ohoi_get_control_state(void *hnd, SaHpiResourceIdT id, SaHpiCtrlNumT num, SaHpiCtrlModeT *mode, SaHpiCtrlStateT *state); SaErrorT ohoi_set_control_state(void *hnd, SaHpiResourceIdT id, SaHpiCtrlNumT num, SaHpiCtrlModeT mode, SaHpiCtrlStateT *state); void ipmi_connection_handler(ipmi_domain_t *domain, int err, unsigned int conn_num, unsigned int port_num, int still_connected, void *cb_data); struct ohoi_fru_write_s { SaErrorT rv; int done; }; SaErrorT ohoi_fru_write(struct ohoi_handler *ipmi_handler, ipmi_entity_id_t entid); /* ATCA-HPI mapping functions */ void ohoi_atca_create_fru_rdrs(struct oh_handler_state *handler); void ohoi_atca_delete_fru_rdrs(struct oh_handler_state *handler, ipmi_mcid_t mcid); SaHpiUint8T ohoi_atca_led_to_hpi_color(int ipmi_color); int ohoi_atca_led_to_ipmi_color(SaHpiUint8T c); void adjust_sensor_to_atcahpi_spec(struct oh_handler_state *handler, SaHpiRptEntryT *rpt, SaHpiRdrT *rdr, struct ohoi_sensor_info *sensor_info, ipmi_sensor_t *sensor); void ohoi_atca_create_shelf_virtual_rdrs(struct oh_handler_state *hnd); void create_atca_virt_shmgr_rdrs(struct oh_handler_state *hnd); void ohoi_send_vshmgr_redundancy_sensor_event( struct oh_handler_state *handler, int become_present); /* ATCA Fan Control */ void ohoi_create_fan_control(struct oh_handler_state *handler, SaHpiResourceIdT rid); /* ATCA IPMB-0 Control */ void ohoi_create_ipmb0_controls(struct oh_handler_state *handler, ipmi_entity_t *entity, unsigned int max_link); /* ATCA FRU MC Reset Control */ void ohoi_create_fru_mc_reset_control(struct oh_handler_state *handler, SaHpiResourceIdT rid); /* ATCA Ekeying Link State Sensor */ #define OHOI_FIRST_EKEYING_SENSOR_NUM 0x400 void ohoi_create_ekeying_link_state_sensor( struct oh_handler_state *handler, ipmi_entity_t *entity, unsigned int s_num, unsigned char *guid, unsigned char link_grouping_id, unsigned char link_type, unsigned char link_type_extension, unsigned char interface_type, unsigned char *channels); /* ATCA inventory functions */ unsigned int ohoi_create_atca_oem_idr_areas( struct oh_handler_state *handler, ipmi_entity_t *entity, struct ohoi_resource_info *res_info, struct ohoi_inventory_info *i_info, unsigned int r_num); SaHpiUint32T ohoi_atca_oem_area_fields_num(struct ohoi_inventory_info *fru, SaHpiEntryIdT areaid); SaErrorT ohoi_atca_oem_area_field(struct oh_handler_state *handler, struct ohoi_resource_info *ohoi_res_info, SaHpiEntryIdT *nextfieldid, SaHpiIdrFieldT *field); /* ATCA slot state specific functions */ void atca_slot_state_sensor_event_send(struct oh_handler_state *handler, SaHpiRptEntryT *dev_entry, int present); void atca_create_slot_rdrs(struct oh_handler_state *handler, SaHpiResourceIdT rid); /* misc macros for debug */ #define dump_entity_id(s, x) \ do { \ err("%s domain id: %p, entity id: %x, entity instance: %x, channel: %x, address: %x, seq: %lx", \ s, \ (x).domain_id.domain, \ (x).entity_id, \ (x).entity_instance, \ (x).channel, \ (x).address, \ (x).seq); \ } while(0) /* dump rpttable to make debug easy if you don't like it, feel free to delete it. IMO, it is a good idea to place dump_rpttable in rpt_utils.c */ static inline void dump_rpttable(RPTable *table) { SaHpiRptEntryT *rpt; rpt = oh_get_resource_next(table, SAHPI_FIRST_ENTRY); printf("\n"); while (rpt) { printf("Resource Id:%d", rpt->ResourceId); struct ohoi_resource_info *res_info = oh_get_resource_data(table, rpt->ResourceId); if (res_info->type & OHOI_RESOURCE_ENTITY) { ipmi_entity_id_t e = res_info->u.entity.entity_id; printf("; entity id: %x, entity instance: %x, channel: %x, address: %x, seq: %lx", e.entity_id, e.entity_instance, e.channel, e.address, e.seq); } printf("\n"); #if 0 SaHpiRdrT *rdr; rdr = oh_get_rdr_next(table, rpt->ResourceId, SAHPI_FIRST_ENTRY); while (rdr) { unsigned char *data; int i; data = oh_get_rdr_data(table, rpt->ResourceId, rdr->RecordId); /*FIXME:: causes issue on IA64 */ /* commenting out for now until fixed */ //printf("(Rdr id:%d type:%d) data pointer:%u\n", //rdr->RecordId, //rdr->RdrType, //(unsigned)(void *)data); //if (data) // for (i = 0; i < 30; i++) // printf("%u ", data[i]); //printf("\n"); rdr = oh_get_rdr_next(table, rpt->ResourceId, rdr->RecordId); } // printf("\n"); #endif rpt = oh_get_resource_next(table, rpt->ResourceId); } } #endif /* called when a resource is removed (swapped?) */ int entity_presence(ipmi_entity_t *entity, int present, void *cb_data, ipmi_event_t *event); int ipmi_discover_resources(void *hnd); void entity_rpt_set_updated(struct ohoi_resource_info *res_info, struct ohoi_handler *hnd); void entity_rpt_set_presence(struct ohoi_resource_info *res_info, struct ohoi_handler *hnd, int presence); void ohoi_remove_entity(struct oh_handler_state *handler, SaHpiResourceIdT res_id); #define OHOI_MAP_ERROR(to, err) \ do {\ if (err == (IPMI_IPMI_ERR_TOP | IPMI_INVALID_CMD_CC)) {\ to = SA_ERR_HPI_INVALID_CMD;\ } else if (err == (IPMI_IPMI_ERR_TOP | IPMI_NODE_BUSY_CC)) {\ to = SA_ERR_HPI_BUSY;\ } else if (err == (IPMI_IPMI_ERR_TOP | IPMI_TIMEOUT_CC)) {\ to = SA_ERR_HPI_NO_RESPONSE;\ } else if (err == (IPMI_IPMI_ERR_TOP | IPMI_COMMAND_INVALID_FOR_LUN_CC)) {\ to = SA_ERR_HPI_INVALID_CMD;\ } else if (err == (IPMI_IPMI_ERR_TOP | IPMI_CANNOT_EXEC_DUPLICATE_REQUEST_CC)) {\ to = SA_ERR_HPI_BUSY;\ } else {\ to = SA_ERR_HPI_INTERNAL_ERROR;\ }\ } while (0) /* * The following traces are available : * OHOI_TRACE_ALL - trace all the following traces and trace_ipmi(). Must be "YES". * OHOI_TRACE_SENSOR - traces sensors add/change/delete and for events in SEL * OHOI_TRACE_ENTITY - traces entities add/change/delete * OHOI_TRACE_MC - traces MCs add/change/delete/active/inactive * OHOI_TRACE_DISCOVERY - prints all existing resources (present and not present) * after discovery * * the values of these variables are ignored */ #define IHOI_TRACE_ALL (getenv("OHOI_TRACE_ALL") &&\ !strcmp("YES",getenv("OHOI_TRACE_ALL"))) #define trace_ipmi(format, ...) \ do { \ if (IHOI_TRACE_ALL) { \ fprintf(stderr, " %s:%d:%s: ", __FILE__, __LINE__, __func__); \ fprintf(stderr, format "\n", ## __VA_ARGS__); \ } \ } while(0) #define trace_ipmi_sensors(action, sid) \ do { \ if (getenv("OHOI_TRACE_SENSOR") || IHOI_TRACE_ALL) { \ fprintf(stderr, " *** SENSOR %s. sensor_id = {{%p, %d, %d, %ld}, %d, %d}\n", action,\ sid.mcid.domain_id.domain, sid.mcid.mc_num, sid.mcid.channel, sid.mcid.seq,\ sid.lun, sid.sensor_num);\ } \ } while(0) extern FILE *trace_msg_file; // File to trace all IPMI messages openhpi-2.14.1/plugins/ipmi/ipmi_util.c0000644000076400007640000002532211302567001014746 0ustar /* -*- linux-c -*- * * Copyright (c) 2003 by Intel Corp. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Louis Zhuang */ #include "ipmi.h" #include #include static inline int domain_id_is_equal(const ipmi_domain_id_t id1, const ipmi_domain_id_t id2) { return (id1.domain == id2.domain); } static inline int entity_id_is_equal(const ipmi_entity_id_t id1, const ipmi_entity_id_t id2) { return (domain_id_is_equal(id1.domain_id, id2.domain_id) && (id1.entity_id == id2.entity_id) && (id1.entity_instance == id2.entity_instance) && (id1.channel == id2.channel) && (id1.address == id2.address) && (id1.seq == id2.seq)); } static inline int mc_id_is_equal(const ipmi_mcid_t id1, const ipmi_mcid_t id2) { //printf("compare MC: (%d,%d,%ld) and (%d,%d,%ld)\n", id1.mc_num, id1.channel, id1.seq, id2.mc_num, id2.channel, id2.seq); return (domain_id_is_equal(id1.domain_id, id2.domain_id) && (id1.mc_num == id2.mc_num) && (id1.channel== id2.channel) && (id1.seq == id2.seq)); } static inline int ohoi_resource_info_is_equal( const struct ohoi_resource_info info1, const struct ohoi_resource_info info2) { /* We don't compare rdr_count */ if (info1.type & OHOI_RESOURCE_MC) { if (!(info2.type & OHOI_RESOURCE_MC)) { return 0; } return mc_id_is_equal(info1.u.entity.mc_id, info2.u.entity.mc_id); } if (info1.type & OHOI_RESOURCE_ENTITY) { return (entity_id_is_equal(info1.u.entity.entity_id, info2.u.entity.entity_id)); } else if (info1.type & OHOI_RESOURCE_SLOT) { return (entity_id_is_equal(info1.u.slot.entity_id, info2.u.slot.entity_id)); } else { err("UNKNOWN OHOI RESOURCE TYPE!"); return 0; } } SaHpiResourceIdT ohoi_get_parent_id(SaHpiRptEntryT *child) { SaHpiEntityPathT ep; int i; if (child == NULL) return 0; for (i = 1; i < SAHPI_MAX_ENTITY_PATH; i ++) { ep.Entry[i - 1].EntityLocation = child->ResourceEntity.Entry[i].EntityLocation; ep.Entry[i - 1].EntityType = child->ResourceEntity.Entry[i].EntityType; if (child->ResourceEntity.Entry[i].EntityType == SAHPI_ENT_ROOT) { break; } } return oh_uid_lookup(&ep); } /*XXX algorithm here is so ulgy! */ SaHpiRptEntryT *ohoi_get_resource_by_entityid(RPTable *table, const ipmi_entity_id_t *entity_id) { struct ohoi_resource_info res_info1; SaHpiRptEntryT *rpt_entry; res_info1.type = OHOI_RESOURCE_ENTITY; res_info1.u.entity.entity_id = *entity_id; rpt_entry = oh_get_resource_next(table, SAHPI_FIRST_ENTRY); while (rpt_entry) { struct ohoi_resource_info *ohoi_res_info; ohoi_res_info = oh_get_resource_data(table, rpt_entry->ResourceId); if (ohoi_resource_info_is_equal(res_info1, *ohoi_res_info)) { return rpt_entry; } rpt_entry = oh_get_resource_next(table, rpt_entry->ResourceId); } err("Not found resource by entity_id"); return NULL; } /*XXX algorithm here is so ulgy! */ SaHpiRptEntryT *ohoi_get_resource_by_mcid(RPTable *table, const ipmi_mcid_t *mc_id) { struct ohoi_resource_info res_info1; SaHpiRptEntryT *rpt_entry; res_info1.type = OHOI_RESOURCE_MC; res_info1.u.entity.mc_id = *mc_id; rpt_entry = oh_get_resource_next(table, SAHPI_FIRST_ENTRY); while (rpt_entry) { struct ohoi_resource_info *ohoi_res_info; ohoi_res_info = oh_get_resource_data(table, rpt_entry->ResourceId); if (ohoi_resource_info_is_equal(res_info1, *ohoi_res_info)) { return rpt_entry; } rpt_entry = oh_get_resource_next(table, rpt_entry->ResourceId); } err("Not found resource by mc_id"); return NULL; } SaErrorT ohoi_get_rdr_data(const struct oh_handler_state *handler, SaHpiResourceIdT id, SaHpiRdrTypeT type, SaHpiSensorNumT num, void **pdata) { SaHpiRdrT * rdr; rdr = oh_get_rdr_by_type(handler->rptcache, id, type, num); if (!rdr) { err("no rdr for Resource %d. type = %d, num = %d", id, type, num); /*XXX No err code for invalid rdr?*/ return SA_ERR_HPI_INVALID_RESOURCE; } *pdata = oh_get_rdr_data(handler->rptcache, id, rdr->RecordId); return SA_OK; } SaHpiRdrT *ohoi_get_rdr_by_data(RPTable *table, SaHpiResourceIdT rid, SaHpiRdrTypeT type, void *data) { SaHpiRdrT *rdr; struct ohoi_sensor_info *s_info; if (!data) { err("data == NULL"); return NULL; } if (type != SAHPI_SENSOR_RDR) { err("type != SAHPI_SENSOR_RDR"); return NULL; } rdr = oh_get_rdr_next(table, rid, SAHPI_FIRST_ENTRY); while (rdr) { ipmi_sensor_id_t *sidp; if (rdr->RdrType != SAHPI_SENSOR_RDR) { goto next_rdr; } s_info = oh_get_rdr_data(table, rid, rdr->RecordId); if (!s_info) { err("s_info == NULL"); goto next_rdr; } if (s_info->type == OHOI_SENSOR_ATCA_MAPPED) { if ((struct ohoi_sensor_info *)data == s_info) { return rdr; } goto next_rdr; } sidp = &s_info->info.orig_sensor_info.sensor_id; if (!ipmi_cmp_sensor_id(*(ipmi_sensor_id_t *)data, *sidp)) { return rdr; } next_rdr: rdr = oh_get_rdr_next(table, rid, rdr->RecordId); } return NULL; } void ohoi_iterate_rptcache(struct oh_handler_state *handler, rpt_loop_handler_cb func, void *cb_data) { RPTable *table = handler->rptcache; struct ohoi_resource_info *res_info; SaHpiRptEntryT *rpt_entry; rpt_entry = oh_get_resource_next(table, SAHPI_FIRST_ENTRY); while (rpt_entry) { res_info = oh_get_resource_data(table, rpt_entry->ResourceId); if (func(handler, rpt_entry, res_info, cb_data)) { return; } rpt_entry = oh_get_resource_next(table, rpt_entry->ResourceId); } } void ohoi_iterate_rpt_rdrs(struct oh_handler_state *handler, SaHpiRptEntryT *rpt, rdr_loop_handler_cb func, void *cb_data) { SaHpiRdrT *rdr; RPTable *table = handler->rptcache; rdr = oh_get_rdr_next(table, rpt->ResourceId, SAHPI_FIRST_ENTRY); while (rdr) { if (func(handler, rpt, rdr, cb_data)) { break; } rdr = oh_get_rdr_next(table, rpt->ResourceId, rdr->RecordId); } return; } int ohoi_delete_orig_sensor_rdr(struct oh_handler_state *handler, SaHpiRptEntryT *rpt, ipmi_sensor_id_t *mysid) { SaHpiRdrT *rdr; SaHpiRdrT *rdr_todelete = NULL; RPTable *table = handler->rptcache; ipmi_sensor_id_t *sid; struct ohoi_sensor_info *s_info; int more_sensors = 0; rdr = oh_get_rdr_next(table, rpt->ResourceId, SAHPI_FIRST_ENTRY); while (rdr) { if (rdr_todelete && more_sensors) { break; } if (rdr->RdrType != SAHPI_SENSOR_RDR) { goto next_rdr; } s_info = oh_get_rdr_data(table, rpt->ResourceId, rdr->RecordId); if (!s_info) { err("s_info == NULL"); goto next_rdr; } if (rdr_todelete) { more_sensors = 1; break; } if (s_info->type == OHOI_SENSOR_ATCA_MAPPED) { more_sensors = 1; goto next_rdr; } sid = &s_info->info.orig_sensor_info.sensor_id; if (!ipmi_cmp_sensor_id(*mysid, *sid)) { rdr_todelete = rdr; goto next_rdr; } next_rdr: rdr = oh_get_rdr_next(table, rpt->ResourceId, rdr->RecordId); } if (rdr_todelete) { oh_remove_rdr(table, rpt->ResourceId, rdr_todelete->RecordId); } else { err("Sensor %d for rpt %d not deleted", mysid->sensor_num, rpt->ResourceId); } return !more_sensors; } int ohoi_delete_orig_control_rdr(struct oh_handler_state *handler, SaHpiRptEntryT *rpt, ipmi_control_id_t *mycid) { SaHpiRdrT *rdr; SaHpiRdrT *rdr_todelete = NULL; RPTable *table = handler->rptcache; ipmi_control_id_t *cid; struct ohoi_control_info *c_info; int more_controls = 0; rdr = oh_get_rdr_next(table, rpt->ResourceId, SAHPI_FIRST_ENTRY); while (rdr) { if (rdr->RdrType != SAHPI_CTRL_RDR) { goto next_rdr; } c_info = oh_get_rdr_data(table, rpt->ResourceId, rdr->RecordId); if (!c_info) { err("c_info == NULL"); goto next_rdr; } if (c_info->type == OHOI_CTRL_ATCA_MAPPED) { more_controls = 1; goto next_rdr; } cid = &c_info->info.orig_ctrl_info.ctrl_id; if (!ipmi_cmp_control_id(*mycid, *cid)) { rdr_todelete = rdr; goto next_rdr; } more_controls = 1; next_rdr: rdr = oh_get_rdr_next(table, rpt->ResourceId, rdr->RecordId); if (rdr_todelete) { oh_remove_rdr(table, rpt->ResourceId, rdr_todelete->RecordId); rdr_todelete = NULL; } // can be more than one control with the same cid. don't break } return !more_controls; } int ohoi_rpt_has_sensors(struct oh_handler_state *handler, SaHpiResourceIdT rid) { SaHpiRdrT *rdr; RPTable *table = handler->rptcache; rdr = oh_get_rdr_next(table, rid, SAHPI_FIRST_ENTRY); while (rdr) { if (rdr->RdrType == SAHPI_SENSOR_RDR) { return 1; } rdr = oh_get_rdr_next(table, rid, rdr->RecordId); } return 0; } int ohoi_rpt_has_controls(struct oh_handler_state *handler, SaHpiResourceIdT rid) { SaHpiRdrT *rdr; RPTable *table = handler->rptcache; rdr = oh_get_rdr_next(table, rid, SAHPI_FIRST_ENTRY); while (rdr) { if (rdr->RdrType == SAHPI_CTRL_RDR) { return 1; } rdr = oh_get_rdr_next(table, rid, rdr->RecordId); } return 0; } openhpi-2.14.1/plugins/ipmi/sync.c0000644000076400007640000000240511302567001013724 0ustar /* -*- linux-c -*- * * Copyright (c) 2003 by Intel Corp. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Louis Zhuang */ #include "ipmi.h" SaErrorT ohoi_loop_until(loop_indicator_cb indicator, const void *cb_data, int to, struct ohoi_handler *ipmi_handler) { struct timeval tv1, tv2, tv3; /* Wait 5 seconds for result */ gettimeofday(&tv1, NULL); tv1.tv_sec += to; while (1) { if (indicator(cb_data)) { return SA_OK; } memset(&tv3, 0, sizeof(tv3)); gettimeofday(&tv2, NULL); if (tv2.tv_sec>tv1.tv_sec) { break; } sel_select(ipmi_handler->ohoi_sel, NULL, 0, NULL, &tv3); } return SA_ERR_HPI_NO_RESPONSE; } static int simple_indicator(const void *cb_data) { return (*(const int *)cb_data); } SaErrorT ohoi_loop(int *done, struct ohoi_handler *ipmi_handler) { return (ohoi_loop_until(simple_indicator, done, IPMI_DATA_WAIT, ipmi_handler)); } openhpi-2.14.1/plugins/ipmi/ipmi_close.c0000644000076400007640000000262411302567001015076 0ustar /* -*- linux-c -*- * * Copyright (c) 2003 by Intel Corp. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Tariq Shureih */ #include "ipmi.h" static void close_done(void *cb_data) { struct ohoi_handler *ipmi_handler = cb_data; trace_ipmi("close_done"); ipmi_handler->fully_up = 0; } static void close_connection(ipmi_domain_t *domain, void *user_data) { int rv, *flag = user_data; trace_ipmi("close flag:%d", *flag); rv = ipmi_domain_close(domain, close_done, user_data); if (rv) { err("ipmi_close_connection failed!"); *flag = 1; } } void ohoi_close_connection(ipmi_domain_id_t domain_id, void *user_data) { struct oh_handler_state *handler = (struct oh_handler_state *)user_data; struct ohoi_handler *ipmi_handler = (struct ohoi_handler *)handler->data; int rv; trace_ipmi("ohoi_close_connection"); rv = ipmi_domain_pointer_cb(domain_id, close_connection, ipmi_handler); if (rv) { err("ipmi_domain_pointer_cb failed!"); return; } while (ipmi_handler->fully_up != 0) { sel_select(ipmi_handler->ohoi_sel, NULL, 0, NULL, NULL); } } openhpi-2.14.1/plugins/ipmi/ipmi_controls.c0000644000076400007640000007634111302567001015643 0ustar /* -*- linux-c -*- * * Copyright (c) 2003 by Intel Corp. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Tariq Shureih * Louis Zhuang */ #include "ipmi.h" static unsigned char oem_alarm_state = 0xff; struct ohoi_ctrl_info { int done; SaErrorT err; SaHpiRdrT * rdr; struct oh_handler_state *handler; SaHpiCtrlModeT mode; SaHpiCtrlStateT *state; }; /* struct for getting power state */ struct ohoi_power_info { int done; SaErrorT err; SaHpiPowerStateT *state; }; /* struct for getting reset state */ struct ohoi_reset_info { int done; SaErrorT err; SaHpiResetActionT *state; }; static void __get_control_state(ipmi_control_t *control, int err, int *val, void *cb_data) { struct ohoi_ctrl_info *info = cb_data; if (err || !val) { err("__get_control_state: err = %d; val = %p", err, val); info->err = SA_ERR_HPI_INTERNAL_ERROR; info->done = 1; return; } if (info->state->Type != SAHPI_CTRL_TYPE_OEM) { err("IPMI plug-in only support OEM control now"); info->err = SA_ERR_HPI_INTERNAL_ERROR; info->done = 1; return; } if (err || !val) { err("__get_control_state: err = %d; val = %p", err, val); info->err = SA_ERR_HPI_INTERNAL_ERROR; info->done = 1; return; } info->state->StateUnion.Oem.BodyLength = ipmi_control_get_num_vals(control); memcpy(&info->state->StateUnion.Oem.Body[0], val, info->state->StateUnion.Oem.BodyLength); info->done = 1; } static void __get_control_leds_state(ipmi_control_t *control, int err, ipmi_light_setting_t *settings, void *cb_data) { struct ohoi_ctrl_info *info = cb_data; int len, res ,val; if (err) { err("__get_control_leds_state: err = %d", err); info->err = SA_ERR_HPI_INTERNAL_ERROR; info->done = 1; return; } if (info->state->Type != SAHPI_CTRL_TYPE_OEM) { err("IPMI plug-in only support OEM control now"); info->err = SA_ERR_HPI_INTERNAL_ERROR; info->done = 1; return; } if (settings == (ipmi_light_setting_t *)NULL) { err("__get_control_leds_state: settings = NULL"); info->err = SA_ERR_HPI_INTERNAL_ERROR; info->done = 1; return; } len = ipmi_control_get_num_vals(control); info->state->StateUnion.Oem.BodyLength = len; res = ipmi_light_setting_get_color(settings, 0, &val); info->state->StateUnion.Oem.Body[0] = val; info->done = 1; } static void _get_control_state(ipmi_control_t *control, void *cb_data) { if (ipmi_control_light_set_with_setting(control)) ipmi_control_get_light(control, __get_control_leds_state, cb_data); else ipmi_control_get_val(control, __get_control_state, cb_data); } /* * ATCA LEDs */ static void __get_atca_led(ipmi_control_t *control, int err, ipmi_light_setting_t *st, void *cb_data) { struct ohoi_ctrl_info *info = cb_data; SaHpiCtrlStateT *state = info->state; int lc; int on_time, off_time; int color; ipmi_light_setting_in_local_control(st, 0, &lc); info->mode = lc ? SAHPI_CTRL_MODE_AUTO : SAHPI_CTRL_MODE_MANUAL; if (state == NULL) { info->done = 1; return; } if (!ipmi_light_setting_get_on_time(st, 0, &on_time) && !ipmi_light_setting_get_off_time(st, 0, &off_time)) { if (off_time > 10) { state->StateUnion.Oem.Body[0] = off_time / 10; } else { state->StateUnion.Oem.Body[0] = off_time ? 1 : 0; } if (on_time > 10) { state->StateUnion.Oem.Body[1] = on_time / 10; } else { state->StateUnion.Oem.Body[1] = on_time ? 1 : 0; } } else { err("couldn't get on/off times"); info->err = SA_ERR_HPI_INVALID_DATA; info->done = 1; } if (ipmi_light_setting_get_color(st, 0, &color) == 0) { state->StateUnion.Oem.Body[2] = ohoi_atca_led_to_hpi_color(color); state->StateUnion.Oem.Body[3] = state->StateUnion.Oem.Body[2]; } else { err("couldn't get color"); info->err = SA_ERR_HPI_INVALID_DATA; info->done = 1; } state->StateUnion.Oem.Body[4] = 0; state->StateUnion.Oem.Body[5] = 0; state->StateUnion.Oem.MId = ATCAHPI_PICMG_MID; state->StateUnion.Oem.BodyLength = 6; state->Type = SAHPI_CTRL_TYPE_OEM; info->done = 1; } static void _get_atca_led(ipmi_control_t *control, void *cb_data) { struct ohoi_ctrl_info *info = cb_data; int rv; rv = ipmi_control_get_light(control, __get_atca_led, info); if (rv) { err("ipmi_control_get_light. rv = %d", rv); info->err = SA_ERR_HPI_INVALID_DATA; info->done = 1; } } SaErrorT orig_get_control_state(struct oh_handler_state *handler, struct ohoi_control_info *c, SaHpiRdrT * rdr, SaHpiCtrlModeT *mode, SaHpiCtrlStateT *state) { struct ohoi_handler *ipmi_handler = (struct ohoi_handler *)handler->data; struct ohoi_ctrl_info info; SaErrorT rv; ipmi_control_id_t ctrl; SaHpiUint8T val, mask, idx, i; SaHpiCtrlStateT localstate; SaHpiCtrlModeT localmode; ctrl = c->info.orig_ctrl_info.ctrl_id; if (state == NULL) { state = &localstate; } if (mode == NULL) { mode = &localmode; } if ((rdr->RdrTypeUnion.CtrlRec.Type == SAHPI_CTRL_TYPE_OEM) && (rdr->RdrTypeUnion.CtrlRec.OutputType == SAHPI_CTRL_LED) && (rdr->RdrTypeUnion.CtrlRec.TypeUnion.Oem.MId == ATCAHPI_PICMG_MID)) { /* This is ATCA led */ info.done = 0; info.err = SA_OK; info.rdr = rdr; info.handler = handler; info.mode = 0; info.state = state; rv = ipmi_control_pointer_cb(ctrl, _get_atca_led, &info); if (rv) { err("ipmi_control_pointer_cb. rv = %d", rv); return SA_ERR_HPI_INVALID_DATA; } rv = ohoi_loop(&info.done, handler->data); if (rv != SA_OK) { err("ohoi_loop. rv = %d", rv); return rv; } if (info.err != SA_OK) { err("info.err = %d", info.err); return info.err; } *mode = info.mode; c->mode = info.mode; return SA_OK; } *mode = c->mode; memset(state, 0, sizeof(*state)); info.done = 0; info.state = state; info.err = SA_OK; info.state->Type = SAHPI_CTRL_TYPE_OEM; rv = ipmi_control_pointer_cb(ctrl, _get_control_state, &info); if (rv) { err("Unable to retrieve control state"); return SA_ERR_HPI_ERROR; } rv = ohoi_loop(&info.done, ipmi_handler); if (rv != SA_OK) { return rv; } if (info.err != SA_OK) { return info.err; } val = info.state->StateUnion.Oem.Body[0]; if ((rdr->RdrTypeUnion.CtrlRec.Type == SAHPI_CTRL_TYPE_DIGITAL) && (rdr->RdrTypeUnion.CtrlRec.OutputType == SAHPI_CTRL_LED) && (rdr->RdrTypeUnion.CtrlRec.Oem >= OEM_ALARM_BASE)) { oem_alarm_state = val; /* This is a front panel alarm LED. */ state->Type = SAHPI_CTRL_TYPE_DIGITAL; mask = 0x01; idx = rdr->RdrTypeUnion.CtrlRec.Oem - OEM_ALARM_BASE; /* bits 0 - 3 = Pwr, Crit, Maj, Min */ for (i = 0; i < idx; i++) mask = mask << 1; if ((val & mask) == 0) state->StateUnion.Digital = SAHPI_CTRL_STATE_ON; else state->StateUnion.Digital = SAHPI_CTRL_STATE_OFF; } return SA_OK; } SaErrorT ohoi_get_control_state(void *hnd, SaHpiResourceIdT id, SaHpiCtrlNumT num, SaHpiCtrlModeT *mode, SaHpiCtrlStateT *state) { struct oh_handler_state *handler = (struct oh_handler_state *)hnd; SaErrorT rv; struct ohoi_control_info *ctrl_info; SaHpiRdrT *rdr; rdr = oh_get_rdr_by_type(handler->rptcache, id, SAHPI_CTRL_RDR, num); if (!rdr) return SA_ERR_HPI_INVALID_RESOURCE; rv = ohoi_get_rdr_data(hnd, id, SAHPI_CTRL_RDR, num, (void *)&ctrl_info); if (rv!=SA_OK) return rv; if (ctrl_info->ohoii.get_control_state == NULL) { return SA_ERR_HPI_INVALID_CMD; } return ctrl_info->ohoii.get_control_state(handler, ctrl_info, rdr, mode, state); } static void __set_control_state(ipmi_control_t *control, int err, void *cb_data) { struct ohoi_ctrl_info *info = cb_data; if (err) { err("__set_control_state: err = %d", err); info->err = SA_ERR_HPI_INTERNAL_ERROR; } info->done = 1; } static void _set_control_state(ipmi_control_t *control, void *cb_data) { struct ohoi_ctrl_info *info = cb_data; if (info->state->StateUnion.Oem.BodyLength != ipmi_control_get_num_vals(control)) { err("control number is not equal to supplied data"); info->done = -1; info->err = SA_ERR_HPI_INVALID_PARAMS; return; } if (ipmi_control_light_set_with_setting(control)) { ipmi_light_setting_t *setting; setting = ipmi_alloc_light_settings(1); ipmi_light_setting_set_local_control(setting, 0, 1); ipmi_light_setting_set_color(setting, 0, info->state->StateUnion.Oem.Body[0]); ipmi_control_set_light(control, setting, __set_control_state, cb_data); ipmi_free_light_settings(setting); } else { ipmi_control_set_val(control, /* compile error */ // (int *)&info->state->StateUnion.Oem.Body[0], (int *)(void *)&info->state->StateUnion.Oem.Body[0], __set_control_state, info); } } static SaErrorT set_front_panrl_alarm_led(void *hnd, struct ohoi_control_info *c, SaHpiRdrT * rdr, ipmi_control_id_t ctrl, SaHpiUint8T idx, SaHpiCtrlModeT mode, SaHpiCtrlStateT *state) { struct oh_handler_state *handler = (struct oh_handler_state *)hnd; struct ohoi_handler *ipmi_handler = (struct ohoi_handler *)handler->data; struct ohoi_ctrl_info info; SaErrorT rv; SaHpiUint8T val, mask; SaHpiCtrlStateT my_state; /* just get the current control states */ rv = orig_get_control_state(hnd, c, rdr, NULL, &my_state); if (rv != SA_OK) { return SA_ERR_HPI_NOT_PRESENT; } if (my_state.Type != state->Type) { return SA_ERR_HPI_INVALID_DATA; } val = oem_alarm_state; val |= 0xf0; /* h.o. nibble always write 1 */ state->Type = SAHPI_CTRL_TYPE_OEM; state->StateUnion.Oem.BodyLength = 1; state->StateUnion.Oem.Body[0] = val; mask = 0x01; /* bits 0 - 3 = Pwr, Crit, Maj, Min */ mask = 1 << idx; // for (i = 0; i < idx; i++) mask = mask << 1; info.done = 0; info.state = state; info.err = SA_OK; switch (state->StateUnion.Digital) { case SAHPI_CTRL_STATE_ON : if (!(val & mask)) { /* already turned on */ return SA_OK; } state->StateUnion.Oem.Body[0] = val & ~mask; break; case SAHPI_CTRL_STATE_OFF : if (val & mask) { /* already turned off */ return SA_OK; } state->StateUnion.Oem.Body[0] = val |mask; break; case SAHPI_CTRL_STATE_PULSE_ON : if (!(val & mask)) { /* already turned on */ return SA_ERR_HPI_INVALID_REQUEST; } /* turn it on */ state->StateUnion.Oem.Body[0] = val & ~mask; rv = ipmi_control_pointer_cb(ctrl, _set_control_state, &info); if (rv) { err("Unable to set control state"); return SA_ERR_HPI_ERROR; } rv = ohoi_loop(&info.done, ipmi_handler); if (info.err != SA_OK) { err("Unable to set control state"); return info.err; } if (rv != SA_OK) { err("Unable to set control state"); return rv; } /* then turn it off. IPMI is slow, it provides us delay */ state->StateUnion.Oem.Body[0] = val | mask; break; case SAHPI_CTRL_STATE_PULSE_OFF : if (val & mask) { /* already turned off */ return SA_ERR_HPI_INVALID_REQUEST; } /* turn it off */ state->StateUnion.Oem.Body[0] = val | mask; rv = ipmi_control_pointer_cb(ctrl, _set_control_state, &info); if (rv) { err("Unable to set control state"); return SA_ERR_HPI_ERROR; } rv = ohoi_loop(&info.done, ipmi_handler); if (info.err != SA_OK) { err("Unable to set control state"); return info.err; } if (rv != SA_OK) { err("Unable to set control state"); return rv; } /* then turn it on. IPMI is slow, it provides us delay */ state->StateUnion.Oem.Body[0] = val | mask; break; default : return SA_ERR_HPI_INVALID_PARAMS; } rv = ipmi_control_pointer_cb(ctrl, _set_control_state, &info); if (rv) { err("Unable to set control state"); return SA_ERR_HPI_ERROR; } rv = ohoi_loop(&info.done, ipmi_handler); if (info.err != SA_OK) { err("Unable to set control state"); return info.err; } if (rv != SA_OK) { err("Unable to set control state"); return rv; } return SA_OK; } /* * ATCA LED controls */ static void __set_atca_led(ipmi_control_t *control, int err, ipmi_light_setting_t *st, void *cb_data) { struct ohoi_ctrl_info *info = cb_data; SaHpiUint8T *body; int lc = 0; int color = 0; int rv; ipmi_light_setting_in_local_control(st, 0, &lc); if (info->mode == SAHPI_CTRL_MODE_AUTO) { /* set MODE only */ ipmi_light_setting_set_local_control(st, 0, 1); } else { body = &info->state->StateUnion.Oem.Body[0]; color = ohoi_atca_led_to_ipmi_color(body[2]); ipmi_light_setting_set_local_control(st, 0, 0); rv = ipmi_light_setting_set_color(st, 0, color); if (rv) { err("ipmi_light_setting_set_color. rv = %d", rv); } rv = ipmi_light_setting_set_off_time(st, 0, body[0] * 10); if (rv) { err("ipmi_light_setting_set_off_time. rv = %d", rv); } rv = ipmi_light_setting_set_on_time(st, 0, body[1] * 10); if (rv) { err("ipmi_light_setting_set_on_time. rv = %d", rv); } } rv = ipmi_control_set_light(control, st, __set_control_state, info); if (rv) { err("ipmi_control_set_light = %d", rv); info->err = SA_ERR_HPI_INVALID_DATA; info->done = 1; return; } } static void _set_atca_led(ipmi_control_t *control, void *cb_data) { struct ohoi_ctrl_info *info = cb_data; int rv; rv = ipmi_control_get_light(control, __set_atca_led, info); if (rv) { err("ipmi_control_get_light. rv = %d", rv); info->err = SA_ERR_HPI_INVALID_DATA; info->done = 1; } } /** * is_supported_color * @hpi_color: HPI Color to test if supported * @rdr: RDR object containing control record for LED. * * Check if hpi_color is supported by the LED associated with rdr. * * Return value: 0 if color is supported, 1 otherwise. **/ static int is_supported_color(AtcaHpiLedColorT hpi_color, SaHpiRdrT *rdr) { AtcaHpiColorCapabilitiesT supported_colors = rdr->RdrTypeUnion.CtrlRec.TypeUnion.Oem.ConfigData[0]; switch(hpi_color) { case ATCAHPI_LED_COLOR_BLUE: return ((supported_colors & ATCAHPI_LED_BLUE) != 0); case ATCAHPI_LED_COLOR_RED: return ((supported_colors & ATCAHPI_LED_RED) != 0); case ATCAHPI_LED_COLOR_GREEN: return ((supported_colors & ATCAHPI_LED_GREEN) != 0); case ATCAHPI_LED_COLOR_AMBER: return ((supported_colors & ATCAHPI_LED_AMBER) != 0); case ATCAHPI_LED_COLOR_ORANGE: return ((supported_colors & ATCAHPI_LED_ORANGE) != 0); case ATCAHPI_LED_COLOR_WHITE: return ((supported_colors & ATCAHPI_LED_WHITE) != 0); case ATCAHPI_LED_COLOR_NO_CHANGE: return 1; case ATCAHPI_LED_COLOR_USE_DEFAULT: return 1; case ATCAHPI_LED_COLOR_RESERVED: return 0; } return 0; } SaErrorT orig_set_control_state(struct oh_handler_state *handler, struct ohoi_control_info *c, SaHpiRdrT * rdr, SaHpiCtrlModeT mode, SaHpiCtrlStateT *state) { struct ohoi_handler *ipmi_handler = (struct ohoi_handler *)handler->data; struct ohoi_ctrl_info info; SaErrorT rv; ipmi_control_id_t ctrl; ctrl = c->info.orig_ctrl_info.ctrl_id; if ((rdr->RdrTypeUnion.CtrlRec.Type == SAHPI_CTRL_TYPE_OEM) && (rdr->RdrTypeUnion.CtrlRec.OutputType == SAHPI_CTRL_LED) && (rdr->RdrTypeUnion.CtrlRec.TypeUnion.Oem.MId == ATCAHPI_PICMG_MID)) { /* This is ATCA led */ if (state != NULL) { if (state->StateUnion.Oem.MId != ATCAHPI_PICMG_MID) { err("state->StateUnion.Mid isn't ATCAHPI_PICMG_MID"); return SA_ERR_HPI_INVALID_DATA; } if (state->StateUnion.Oem.BodyLength != 6) { err("state->StateUnion.Oem.BodyLength(%d) != 6", state->StateUnion.Oem.BodyLength); return SA_ERR_HPI_INVALID_DATA; } SaHpiUint8T *body = &state->StateUnion.Oem.Body[0]; if ((body[2] == 0) || ((body[2] & (body[2] - 1)) != 0)) { /* exactly one color must be set */ return SA_ERR_HPI_INVALID_DATA; } if (!is_supported_color(body[2], rdr)) { /* LED doesn't support this color */ return SA_ERR_HPI_INVALID_DATA; } } info.done = 0; info.err = 0; info.rdr = rdr; info.handler = handler; info.mode = mode; info.state = state; rv = ipmi_control_pointer_cb(ctrl, _set_atca_led, &info); if (rv) { err("ipmi_control_pointer_cb. rv = %d", rv); return SA_ERR_HPI_INVALID_DATA; } rv = ohoi_loop(&info.done, handler->data); if (rv != SA_OK) { err("ohoi_loop. rv = %d", rv); return rv; } if (info.err != SA_OK) { err("info.err = %d", info.err); return info.err; } c->mode = mode; return SA_OK; } if (mode == SAHPI_CTRL_MODE_AUTO) { c->mode = mode; return SA_OK; } if ((rdr->RdrTypeUnion.CtrlRec.Type == SAHPI_CTRL_TYPE_DIGITAL) && (rdr->RdrTypeUnion.CtrlRec.OutputType == SAHPI_CTRL_LED) && (rdr->RdrTypeUnion.CtrlRec.Oem >= OEM_ALARM_BASE)) { /* This is a front panel alarm LED. */ rv = set_front_panrl_alarm_led(handler, c, rdr, ctrl, rdr->RdrTypeUnion.CtrlRec.Oem - OEM_ALARM_BASE, mode, state); if (rv == SA_OK) { c->mode = mode; } return rv; } info.done = 0; info.state = state; info.err = SA_OK; if (info.state->Type != SAHPI_CTRL_TYPE_OEM) { err("IPMI only support OEM control"); return SA_ERR_HPI_INVALID_CMD; } rv = ipmi_control_pointer_cb(ctrl, _set_control_state, &info); if (rv) { err("Unable to set control state"); return SA_ERR_HPI_ERROR; } rv = ohoi_loop(&info.done, ipmi_handler); if (rv != SA_OK) { return rv; } if (info.err != SA_OK) { return info.err; } c->mode = mode; return SA_OK; } /* interface function */ SaErrorT ohoi_set_control_state(void *hnd, SaHpiResourceIdT id, SaHpiCtrlNumT num, SaHpiCtrlModeT mode, SaHpiCtrlStateT *state) { struct oh_handler_state *handler = (struct oh_handler_state *)hnd; struct ohoi_control_info *ctrl_info; SaErrorT rv; SaHpiRdrT *rdr; rdr = oh_get_rdr_by_type(handler->rptcache, id, SAHPI_CTRL_RDR, num); if (!rdr) return SA_ERR_HPI_INVALID_RESOURCE; rv = ohoi_get_rdr_data(hnd, id, SAHPI_CTRL_RDR, num, (void *)&ctrl_info); if (rv != SA_OK) return rv; if (rdr->RdrTypeUnion.CtrlRec.DefaultMode.ReadOnly && rdr->RdrTypeUnion.CtrlRec.DefaultMode.Mode != mode) { err("Attempt to change mode of RO sensor mode"); return SA_ERR_HPI_READ_ONLY; } if (ctrl_info->ohoii.set_control_state == NULL) { return SA_ERR_HPI_UNSUPPORTED_API; } rv = ctrl_info->ohoii.set_control_state(handler, ctrl_info, rdr, mode, state); return rv; } static void reset_resource_done (ipmi_control_t *ipmi_control, int err, void *cb_data) { struct ohoi_reset_info *info = cb_data; info->done = 1; if (err) { err("reset_resource_done: err = %d", err); info->err = SA_ERR_HPI_INTERNAL_ERROR; } } static void set_resource_reset_state(ipmi_control_t *control, void *cb_data) { struct ohoi_reset_info *info = cb_data; int val = 1; int rv; /* Just cold reset the entity*/ rv = ipmi_control_set_val(control, &val, reset_resource_done, cb_data); if (rv) { err("ipmi_control_set_val returned err = %d", rv); info->err = SA_ERR_HPI_INTERNAL_ERROR; info->done = 1; } } static void reset_mc_done (ipmi_mc_t *mc, int err, void *cb_data) { struct ohoi_reset_info *info = cb_data; info->done = 1; if (err) { err("reset_mc_done err = %d", err); info->err = SA_ERR_HPI_INTERNAL_ERROR; } } static void set_mc_reset_state(ipmi_mc_t *mc, void *cb_data) { struct ohoi_reset_info *info = cb_data; int rv; int act; if (*info->state == SAHPI_COLD_RESET) { act = IPMI_MC_RESET_COLD; } else if (*info->state == SAHPI_WARM_RESET) { act = IPMI_MC_RESET_WARM; } else { info->err = SA_ERR_HPI_INVALID_CMD; info->done = 1; return; } rv = ipmi_mc_reset(mc, act, reset_mc_done, cb_data); if (rv) { err("ipmi_mc_reset returned err = %d", rv); info->err = SA_ERR_HPI_INTERNAL_ERROR; info->done = 1; } } SaErrorT ohoi_set_reset_state(void *hnd, SaHpiResourceIdT id, SaHpiResetActionT act) { struct oh_handler_state *handler = (struct oh_handler_state *)hnd; struct ohoi_handler *ipmi_handler = (struct ohoi_handler *)handler->data; struct ohoi_reset_info info; struct ohoi_resource_info *ohoi_res_info; int rv; info.done = 0; info.err = 0; if ((act == SAHPI_COLD_RESET) || (act == SAHPI_WARM_RESET)) { dbg("ResetAction requested: %d", act); info.state = &act; } else { err("Currently we only support cold and warm reset"); return SA_ERR_HPI_INVALID_CMD; } ohoi_res_info = oh_get_resource_data(handler->rptcache, id); if (!(ohoi_res_info->type & OHOI_RESOURCE_ENTITY)) { rv = ipmi_control_pointer_cb(ohoi_res_info->reset_ctrl, set_resource_reset_state, &info); } else { rv = ipmi_mc_pointer_cb(ohoi_res_info->u.entity.mc_id, set_mc_reset_state, &info); } if (rv) { err("Not support reset in the entity or mc"); return SA_ERR_HPI_CAPABILITY; } /* wait until reset_done is called to exit this function */ rv = ohoi_loop(&info.done, ipmi_handler); if ((rv == SA_OK) && (info.err == 0)) { return SA_OK; } else if (info.err) { return info.err; } else { return rv; } } static void power_done (ipmi_control_t *ipmi_control, int err, void *cb_data) { struct ohoi_power_info *power_info = cb_data; power_info->done = 1; if (err) { err("power_done: err = %d", err); power_info->err = SA_ERR_HPI_INTERNAL_ERROR; } } static void set_power_state_on(ipmi_control_t *control, void *cb_data) { struct ohoi_power_info *power_info = cb_data; int rv; rv = ipmi_control_set_val(control, (int *)power_info->state, power_done, cb_data); if (rv) { err("Failed to set control val (power on). rv = %d", rv); OHOI_MAP_ERROR(power_info->err, rv); power_info->done = 1; } else power_info->err = SA_OK; } static void set_power_state_off(ipmi_control_t *control, void *cb_data) { struct ohoi_power_info *power_info = cb_data; int rv; rv = ipmi_control_set_val(control, (int *)power_info->state, power_done, cb_data); if (rv) { err("Failed to set control val (power off). rv = %d", rv); OHOI_MAP_ERROR(power_info->err, rv); power_info->done = 1; } else power_info->err = SA_OK; } SaErrorT ohoi_set_power_state(void *hnd, SaHpiResourceIdT id, SaHpiPowerStateT state) { struct ohoi_resource_info *ohoi_res_info; struct oh_handler_state *handler = (struct oh_handler_state *)hnd; struct ohoi_handler *ipmi_handler = (struct ohoi_handler *)handler->data; struct ohoi_power_info power_info; int rv; power_info.done = 0; power_info.state = &state; ohoi_res_info = oh_get_resource_data(handler->rptcache, id); if (!(ohoi_res_info->type & OHOI_RESOURCE_ENTITY)) { err("Not support power in MC"); return SA_ERR_HPI_INVALID_CMD; } switch (state) { case SAHPI_POWER_ON: rv = ipmi_control_pointer_cb(ohoi_res_info->power_ctrl, set_power_state_on, &power_info); if (rv) { err("set_power_state_on failed"); return SA_ERR_HPI_INTERNAL_ERROR; } break; case SAHPI_POWER_OFF: rv = ipmi_control_pointer_cb(ohoi_res_info->power_ctrl, set_power_state_off, &power_info); if (rv) { err("set_power_state_off failed"); return SA_ERR_HPI_INTERNAL_ERROR; } break; case SAHPI_POWER_CYCLE: dbg("CYCLE power"); SaHpiPowerStateT cy_state = 0; cy_state = SAHPI_POWER_OFF; power_info.state = &cy_state; rv = ipmi_control_pointer_cb(ohoi_res_info->power_ctrl, set_power_state_off, &power_info); if (rv) { err("set_power_state_off failed"); return SA_ERR_HPI_INTERNAL_ERROR; } rv = ohoi_loop(&power_info.done, ipmi_handler); if (rv != SA_OK) { err("ohopi_loop = 0x%x", rv); return rv; } dbg("CYCLE Stage 1: OK"); if ((power_info.done) && (power_info.err == SA_OK)) { dbg("CYCLE: done = %d , err = %d", power_info.done, power_info.err); cy_state = SAHPI_POWER_ON; power_info.state = &cy_state; power_info.done = 0; rv = ipmi_control_pointer_cb(ohoi_res_info->power_ctrl, set_power_state_on, &power_info); if (rv) { err("set_power_state_on failed"); return SA_ERR_HPI_INTERNAL_ERROR; } } break; default: err("Invalid power state requested"); return SA_ERR_HPI_INVALID_PARAMS; } rv = ohoi_loop(&power_info.done, ipmi_handler); if (rv != SA_OK) { return rv; } return power_info.err; } static void get_power_control_val (ipmi_control_t *control, int err, int *val, void *cb_data) { struct ohoi_power_info *info = cb_data; if (err || !val) { err("get_power_control_val: err = %d; val = %p", err, val); info->err = SA_ERR_HPI_INTERNAL_ERROR; info->done = 1; return; } if (*val == 0) { err("Power Control Value: %d", *val); *info->state = SAHPI_POWER_OFF; info->err = SA_OK; } else if (*val == 1) { err("Power Control Value: %d", *val); *info->state = SAHPI_POWER_ON; info->err = SA_OK; } else { err("invalid power state"); info->err = SA_ERR_HPI_INTERNAL_ERROR; } info->done = 1; } static void get_power_state (ipmi_control_t *ipmi_control, void *cb_data) { struct ohoi_power_info *power_state = cb_data; int rv; rv = ipmi_control_get_val(ipmi_control, get_power_control_val, cb_data); if(rv) { err("[power]control_get_val failed. rv = %d", rv); power_state->err = SA_ERR_HPI_INTERNAL_ERROR; power_state->done = 1; } } SaErrorT ohoi_get_power_state (void *hnd, SaHpiResourceIdT id, SaHpiPowerStateT *state) { struct oh_handler_state *handler = (struct oh_handler_state *)hnd; struct ohoi_handler *ipmi_handler = (struct ohoi_handler *)handler->data; struct ohoi_resource_info *ohoi_res_info; struct ohoi_power_info power_state; int rv; power_state.done = 0; power_state.err = SA_OK; power_state.state = state; ohoi_res_info = oh_get_resource_data(handler->rptcache, id); if (!(ohoi_res_info->type & OHOI_RESOURCE_ENTITY)) { err("MC does not support power!"); return SA_ERR_HPI_CAPABILITY; } rv = ipmi_control_pointer_cb(ohoi_res_info->power_ctrl, get_power_state, &power_state); if (rv) { err("get_power_state failed"); return SA_ERR_HPI_INTERNAL_ERROR; } dbg("waiting for OIPMI to return"); rv = ohoi_loop(&power_state.done, ipmi_handler); if (rv != SA_OK) { return rv; } return power_state.err; } static void get_reset_control_val (ipmi_control_t *control, int err, int *val, void *cb_data) { struct ohoi_reset_info *info = cb_data; if (err || !val) { err("get_reset_control_val: err = %d; val = %p", err, val); info->err = SA_ERR_HPI_INTERNAL_ERROR; info->done = 1; return; } if (*val == 0) { err("Reset Control Value: %d", *val); *info->state = SAHPI_RESET_DEASSERT; info->err = SA_OK; } else if (*val == 1) { err("Power Control Value: %d", *val); *info->state = SAHPI_RESET_ASSERT; info->err = SA_OK; } else { /* Note: IPMI platfroms don't hold reset state * so we'll always return SAHPI_RESET_DEASSER * this code is here just in case ;-) */ err("System does not support holding ResetState"); *info->state = SAHPI_RESET_DEASSERT; info->err = SA_OK; } info->done = 1; } static void get_reset_state(ipmi_control_t *control, void *cb_data) { struct ohoi_reset_info *reset_info = cb_data; int rv; rv = ipmi_control_get_val(control, get_reset_control_val, cb_data); if (rv) { //err("[reset] control_get_val failed. IPMI error = %i", rv); err("This IPMI system has a pulse reset, state is always DEASSERT"); /* OpenIPMI will return an error for this call since pulse resets do not support get_state we will return UNSUPPORTED_API */ *reset_info->state = SAHPI_RESET_DEASSERT; reset_info->err = SA_OK; reset_info->done = 1; } } SaErrorT ohoi_get_reset_state(void *hnd, SaHpiResourceIdT id, SaHpiResetActionT *act) { struct oh_handler_state *handler = (struct oh_handler_state *)hnd; struct ohoi_handler *ipmi_handler = (struct ohoi_handler *)handler->data; struct ohoi_resource_info *ohoi_res_info; struct ohoi_reset_info reset_state; int rv; reset_state.done = 0; reset_state.err = 0; reset_state.state = act; ohoi_res_info = oh_get_resource_data(handler->rptcache, id); if (!(ohoi_res_info->type & OHOI_RESOURCE_ENTITY)) { err("Not support power in MC"); return SA_ERR_HPI_CAPABILITY; } rv = ipmi_control_pointer_cb(ohoi_res_info->reset_ctrl, get_reset_state, &reset_state); if(rv) { err("[reset_state] control pointer callback failed. rv = %d", rv); return SA_ERR_HPI_INVALID_CMD; } rv = ohoi_loop(&reset_state.done, ipmi_handler); if (rv != SA_OK) { return rv; } return reset_state.err; } void * oh_get_control_state (void *, SaHpiResourceIdT, SaHpiCtrlNumT, SaHpiCtrlModeT *, SaHpiCtrlStateT *) __attribute__ ((weak, alias("ohoi_get_control_state"))); void * oh_set_control_state (void *, SaHpiResourceIdT,SaHpiCtrlNumT, SaHpiCtrlModeT, SaHpiCtrlStateT *) __attribute__ ((weak, alias("ohoi_set_control_state"))); void * oh_get_power_state (void *, SaHpiResourceIdT, SaHpiPowerStateT *) __attribute__ ((weak, alias("ohoi_get_power_state"))); void * oh_set_power_state (void *, SaHpiResourceIdT, SaHpiPowerStateT) __attribute__ ((weak, alias("ohoi_set_power_state"))); void * oh_get_reset_state (void *, SaHpiResourceIdT, SaHpiResetActionT *) __attribute__ ((weak, alias("ohoi_get_reset_state"))); void * oh_set_reset_state (void *, SaHpiResourceIdT, SaHpiResetActionT) __attribute__ ((weak, alias("ohoi_set_reset_state"))); openhpi-2.14.1/plugins/ipmi/atca_slot_rdrs.c0000644000076400007640000006736511302567001015773 0ustar /* -*- linux-c -*- * * Copyright (c) 2005 by Intel Corp. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Denis Sadykov */ #include "ipmi.h" #define uchar unsigned char int ipmicmd_mc_send(ipmi_mc_t *mc, uchar netfn, uchar cmd, uchar lun, uchar *pdata, uchar sdata, ipmi_mc_response_handler_t handler, void *handler_data); static void atca_shelf_record_get(ipmi_entity_t *entity, unsigned char record_type, unsigned int *record_ver, unsigned int *record_num, unsigned char **record, unsigned int *record_len) { ipmi_fru_t *fru; unsigned char data[256]; unsigned int num; unsigned int len; unsigned char ver, type; unsigned int r_num; int rv; fru = ipmi_entity_get_fru(entity); r_num = ipmi_fru_get_num_multi_records(fru); *record = NULL; for (num = 0; num < r_num; num++) { len = 256; rv = ipmi_fru_get_multi_record_data(fru, num, data, &len); if (rv != 0) { continue; } rv = ipmi_fru_get_multi_record_type(fru, num, &type); if (rv) { continue; } if (type != 0xc0) { continue; } rv = ipmi_fru_get_multi_record_format_version(fru, num, &ver); if (rv) { continue; } if ((ver & 0x0f) != 0x2) { continue; } if (len < 5) { continue; } if ((data[0] | (data[1] << 8) | (data[2] << 16)) != ATCAHPI_PICMG_MID) { continue; } if (data[3] != record_type) { continue; } *record = malloc(len); memcpy(*record, data, len); *record_len = len; *record_ver = ver; *record_num = num; break; } } static void get_atca_fru_pwr_desc_cb(ipmi_entity_t *entity, void *cb_data) { atca_common_info_t *info = cb_data; unsigned char *data; unsigned int len, offset, ver, num_rec; unsigned int i; info->len = offset = 0; atca_shelf_record_get(entity, 0x12, &ver, &num_rec, &data, &len); if (data == NULL) { info->done = 1; return; } for (i = 0; i < data[6]; i++) { if (data[7 + i*5] << 1 == info->addr) { memcpy(info->data + offset, data + 7 + i*5, 5); offset += 5; } } free(data); info->len = offset; info->done = 1; } /*--------------- Slot State Sensor --------------------------------------*/ static SaErrorT atca_slot_state_sensor_event_enable_get( struct oh_handler_state *hnd, struct ohoi_sensor_info *sinfo, SaHpiBoolT *enable, SaHpiEventStateT *assert, SaHpiEventStateT *deassert) { *assert = sinfo->assert; *deassert = 0; *enable = sinfo->info.atcamap_sensor_info.val; return SA_OK; } static SaErrorT atca_slot_state_sensor_event_enable_set( struct oh_handler_state *hnd, struct ohoi_sensor_info *sinfo, SaHpiBoolT enable, SaHpiEventStateT assert, SaHpiEventStateT deassert, unsigned int a_supported, unsigned int d_supported) { if (deassert != 0) { return SA_ERR_HPI_INVALID_DATA; } if ((assert & ~(SAHPI_ES_PRESENT | SAHPI_ES_ABSENT))) { return SA_ERR_HPI_INVALID_DATA; } sinfo->enable = enable; sinfo->assert = assert; sinfo->info.atcamap_sensor_info.val = enable; return SA_OK; } static SaHpiRptEntryT *atca_get_slot_state(struct oh_handler_state *handler, struct ohoi_resource_info *slot_info) { SaHpiRptEntryT *rpt; struct ohoi_resource_info *ent_info; if (handler == NULL || slot_info == NULL) { return NULL; } rpt = ohoi_get_resource_by_entityid(handler->rptcache, &slot_info->u.slot.entity_id); if (!rpt) { return NULL; } ent_info = (struct ohoi_resource_info *) oh_get_resource_data(handler->rptcache, rpt->ResourceId); if (ent_info->presence == 0) { return NULL; } else { return rpt; } } static SaErrorT atca_get_slot_state_reading(struct oh_handler_state *handler, struct ohoi_sensor_info *sensor_info, SaHpiSensorReadingT *reading, SaHpiEventStateT *ev_state) { struct ohoi_resource_info *res_info; SaHpiRptEntryT *rpt; reading->IsSupported = TRUE; reading->Type = SAHPI_SENSOR_READING_TYPE_UINT64; res_info = (struct ohoi_resource_info *) oh_get_resource_data(handler->rptcache, sensor_info->info.atcamap_sensor_info.rid); rpt = atca_get_slot_state(handler, res_info); if (rpt) { reading->Value.SensorUint64 = rpt->ResourceId; } else { reading->Value.SensorUint64 = SAHPI_UNSPECIFIED_RESOURCE_ID; } if (ev_state) { if (reading->Value.SensorUint64 == SAHPI_UNSPECIFIED_RESOURCE_ID) { *ev_state = SAHPI_ES_ABSENT; } else { *ev_state = SAHPI_ES_PRESENT; } } return SA_OK; } void atca_slot_state_sensor_event_send(struct oh_handler_state *handler, SaHpiRptEntryT *dev_entry, int present) { SaHpiResourceIdT rid; struct oh_event *e; SaHpiSensorEventT *sen_evt; SaHpiRdrT *rdr; struct ohoi_sensor_info *sensor_info; if (!dev_entry) { return; } rid = ohoi_get_parent_id(dev_entry); if (rid == 0) { return; } rdr = oh_get_rdr_by_type(handler->rptcache, rid, SAHPI_SENSOR_RDR, ATCAHPI_SENSOR_NUM_SLOT_STATE); if (!rdr) { return; } sensor_info = (struct ohoi_sensor_info *) oh_get_rdr_data(handler->rptcache, rid, rdr->RecordId); if (!sensor_info) { return; } if (sensor_info->sen_enabled == SAHPI_FALSE || sensor_info->info.atcamap_sensor_info.val == SAHPI_FALSE) { return; } if (present && !(sensor_info->assert & SAHPI_ES_PRESENT)) { return; } if (!present && !(sensor_info->assert & SAHPI_ES_ABSENT)) { return; } e = malloc(sizeof(*e)); if (!e) { return; } memset(e, 0, sizeof(*e)); e->resource = *dev_entry; e->rdrs = g_slist_append(e->rdrs, g_memdup(rdr, sizeof(SaHpiRdrT))); e->event.Source = rid; e->event.EventType = SAHPI_ET_SENSOR; e->event.Severity = SAHPI_INFORMATIONAL; oh_gettimeofday(&e->event.Timestamp); sen_evt = &(e->event.EventDataUnion.SensorEvent); sen_evt->SensorNum = ATCAHPI_SENSOR_NUM_SLOT_STATE; sen_evt->SensorType = SAHPI_OEM_SENSOR; sen_evt->EventCategory = SAHPI_EC_PRESENCE; sen_evt->Assertion = SAHPI_TRUE; sen_evt->EventState = present ? SAHPI_ES_PRESENT : SAHPI_ES_ABSENT; sen_evt->OptionalDataPresent = SAHPI_SOD_PREVIOUS_STATE | SAHPI_SOD_CURRENT_STATE; sen_evt->CurrentState = present ? SAHPI_ES_PRESENT : SAHPI_ES_ABSENT; sen_evt->PreviousState = present ? SAHPI_ES_ABSENT : SAHPI_ES_PRESENT; e->hid = handler->hid; oh_evt_queue_push(handler->eventq, e); } static SaHpiRdrT *atca_create_slot_state_sensor( struct ohoi_handler *ipmi_handler, struct ohoi_sensor_info **s_info) { SaHpiRdrT *rdr; struct ohoi_sensor_info *l_s_info; rdr = malloc(sizeof (SaHpiRdrT)); if (rdr == NULL) { err("Out of memory"); return NULL; } l_s_info = malloc(sizeof (struct ohoi_sensor_info)); if (l_s_info == NULL) { err("Out of memory"); free(rdr); return NULL; } memset(rdr, 0, sizeof (SaHpiRdrT)); memset(l_s_info, 0, sizeof (struct ohoi_sensor_info)); rdr->RdrType = SAHPI_SENSOR_RDR; rdr->IsFru = SAHPI_FALSE; rdr->RdrTypeUnion.SensorRec.Num = ATCAHPI_SENSOR_NUM_SLOT_STATE; rdr->RdrTypeUnion.SensorRec.Type = SAHPI_ENTITY_PRESENCE; rdr->RdrTypeUnion.SensorRec.Category = SAHPI_EC_PRESENCE; rdr->RdrTypeUnion.SensorRec.EnableCtrl = SAHPI_TRUE; rdr->RdrTypeUnion.SensorRec.EventCtrl = SAHPI_SEC_PER_EVENT; rdr->RdrTypeUnion.SensorRec.Events = SAHPI_ES_PRESENT | SAHPI_ES_ABSENT; rdr->RdrTypeUnion.SensorRec.DataFormat.IsSupported = SAHPI_TRUE; rdr->RdrTypeUnion.SensorRec.DataFormat.ReadingType = SAHPI_SENSOR_READING_TYPE_UINT64; rdr->RdrTypeUnion.SensorRec.DataFormat.BaseUnits = SAHPI_SU_UNSPECIFIED; rdr->RdrTypeUnion.SensorRec.DataFormat.ModifierUnits = SAHPI_SU_UNSPECIFIED; rdr->RdrTypeUnion.SensorRec.DataFormat.ModifierUse = SAHPI_SMUU_NONE; rdr->RdrTypeUnion.SensorRec.DataFormat.Percentage = SAHPI_FALSE; rdr->RdrTypeUnion.SensorRec.DataFormat.Range.Flags = 0x0; rdr->RdrTypeUnion.SensorRec.DataFormat.AccuracyFactor = 0.00; rdr->RdrTypeUnion.SensorRec.ThresholdDefn.IsAccessible = SAHPI_FALSE; oh_init_textbuffer(&rdr->IdString); oh_append_textbuffer(&rdr->IdString, "Slot State Sensor"); l_s_info->ohoii.get_sensor_event_enable = atca_slot_state_sensor_event_enable_get; l_s_info->ohoii.set_sensor_event_enable = atca_slot_state_sensor_event_enable_set; l_s_info->ohoii.get_sensor_reading = atca_get_slot_state_reading; l_s_info->ohoii.get_sensor_thresholds = NULL; l_s_info->ohoii.set_sensor_thresholds = NULL; l_s_info->support_assert = SAHPI_ES_PRESENT | SAHPI_ES_ABSENT; l_s_info->support_deassert = 0; l_s_info->assert = SAHPI_ES_PRESENT | SAHPI_ES_ABSENT; l_s_info->deassert = 0; l_s_info->sen_enabled = SAHPI_TRUE; l_s_info->enable = SAHPI_TRUE; l_s_info->info.atcamap_sensor_info.data = NULL; l_s_info->info.atcamap_sensor_info.val = SAHPI_FALSE; l_s_info->type = OHOI_SENSOR_ATCA_MAPPED; *s_info = l_s_info; return rdr; } /* ---------------- FRU activation control ------------------------------ */ struct fru_act_ctrl_state_s { SaHpiCtrlModeT mode; SaHpiInt32T state; }; static SaErrorT get_atca_fru_activation_control_state( struct oh_handler_state *hnd, struct ohoi_control_info *c_info, SaHpiRdrT * rdr, SaHpiCtrlModeT *mode, SaHpiCtrlStateT *state) { struct ohoi_handler *ipmi_handler = (struct ohoi_handler *) hnd->data; struct ohoi_resource_info *shelf_info, *slot_info; atca_common_info_t info; int rv; shelf_info = (struct ohoi_resource_info *) oh_get_resource_data(hnd->rptcache, ipmi_handler->atca_shelf_id); if (shelf_info == NULL) { return SA_ERR_HPI_INTERNAL_ERROR; } slot_info = (struct ohoi_resource_info *) oh_get_resource_data(hnd->rptcache, c_info->info.atcamap_ctrl_info.rid); if (slot_info == NULL) { return SA_ERR_HPI_INTERNAL_ERROR; } info.done = 0; info.rv = 0; info.addr = slot_info->u.slot.addr; info.devid = slot_info->u.slot.devid; rv = ipmi_entity_pointer_cb(shelf_info->u.entity.entity_id, get_atca_fru_pwr_desc_cb, &info); if (rv) { return SA_ERR_HPI_INTERNAL_ERROR; } rv = ohoi_loop(&info.done, ipmi_handler); if (rv != SA_OK) { return rv; } if (info.len == 0) { return SA_ERR_HPI_INTERNAL_ERROR; } if (mode) { if (info.data[4] >> 6) { *mode = c_info->mode = SAHPI_CTRL_MODE_AUTO; } else { *mode = c_info->mode = SAHPI_CTRL_MODE_MANUAL; } } if (state == NULL) { return SA_OK; } state->Type = SAHPI_CTRL_TYPE_ANALOG; state->StateUnion.Analog = (info.data[4] & 0x3F); return SA_OK; } static void set_atca_fru_activation_control_state_cb(ipmi_entity_t *entity, void *cb_data) { atca_common_info_t *info = cb_data; unsigned char *data; unsigned int len, offset, ver, num_rec; unsigned int i; int rv; struct fru_act_ctrl_state_s *ctrl_state = info->info; info->len = offset = 0; atca_shelf_record_get(entity, 0x12, &ver, &num_rec, &data, &len); if (data == NULL) { info->rv = SA_ERR_HPI_INTERNAL_ERROR; info->done = 1; return; } for (i = 0; i < data[6]; i++) { if (data[7 + i*5] << 1 == info->addr) { if (ctrl_state->mode) { data[11 + i*5] = ctrl_state->state | (!ctrl_state->mode << 6); } else { data[11 + i*5] |= (!ctrl_state->mode << 6); } } } rv = ipmi_fru_set_multi_record(ipmi_entity_get_fru(entity), num_rec, 0xC0, ver, data, len); free(data); if (rv != 0) { info->rv = SA_ERR_HPI_INTERNAL_ERROR; } info->done = 1; } static SaErrorT set_atca_fru_activation_control_state( struct oh_handler_state *hnd, struct ohoi_control_info *c_info, SaHpiRdrT *rdr, SaHpiCtrlModeT mode, SaHpiCtrlStateT *state) { struct ohoi_handler *ipmi_handler = (struct ohoi_handler *) hnd->data; struct ohoi_resource_info *shelf_info, *slot_info; atca_common_info_t info; struct fru_act_ctrl_state_s ctrl_state; int rv; if (state == NULL) { return SA_ERR_HPI_INVALID_DATA; } if (state->Type != SAHPI_CTRL_TYPE_ANALOG) { return SA_ERR_HPI_INVALID_DATA; } shelf_info = (struct ohoi_resource_info *) oh_get_resource_data(hnd->rptcache, ipmi_handler->atca_shelf_id); if (shelf_info == NULL) { return SA_ERR_HPI_INTERNAL_ERROR; } slot_info = (struct ohoi_resource_info *) oh_get_resource_data(hnd->rptcache, c_info->info.atcamap_ctrl_info.rid); if (slot_info == NULL) { return SA_ERR_HPI_INTERNAL_ERROR; } info.done = 0; info.rv = 0; info.addr = slot_info->u.slot.addr; info.devid = slot_info->u.slot.devid; ctrl_state.mode = mode; ctrl_state.state = state->StateUnion.Analog; info.info = &ctrl_state; rv = ipmi_entity_pointer_cb(shelf_info->u.entity.entity_id, set_atca_fru_activation_control_state_cb, &info); if (rv) { return SA_ERR_HPI_INTERNAL_ERROR; } rv = ohoi_loop(&info.done, ipmi_handler); if (rv != SA_OK) { return rv; } return info.rv; } static SaHpiRdrT *atca_create_fru_activation_control( struct oh_handler_state *handler, SaHpiRptEntryT *slot, struct ohoi_control_info **c_info) { SaHpiRdrT *rdr; struct ohoi_control_info *l_c_info; rdr = malloc(sizeof (SaHpiRdrT)); if (rdr == NULL) { err("Out of memory"); return NULL; } l_c_info = malloc(sizeof (struct ohoi_control_info)); if (l_c_info == NULL) { err("Out of memory"); free(rdr); return NULL; } memset(rdr, 0, sizeof (SaHpiRdrT)); memset(l_c_info, 0, sizeof (struct ohoi_control_info)); rdr->RdrType = SAHPI_CTRL_RDR; rdr->IsFru = SAHPI_FALSE; rdr->RdrTypeUnion.CtrlRec.Num = ATCAHPI_CTRL_NUM_FRU_ACTIVATION; rdr->RdrTypeUnion.CtrlRec.OutputType = SAHPI_CTRL_GENERIC; rdr->RdrTypeUnion.CtrlRec.Type = SAHPI_CTRL_TYPE_ANALOG; rdr->RdrTypeUnion.CtrlRec.TypeUnion.Analog.Min = 0; rdr->RdrTypeUnion.CtrlRec.TypeUnion.Analog.Max = 0x3f; rdr->RdrTypeUnion.CtrlRec.TypeUnion.Analog.Default = 0; rdr->RdrTypeUnion.CtrlRec.DefaultMode.Mode = SAHPI_CTRL_MODE_AUTO; rdr->RdrTypeUnion.CtrlRec.DefaultMode.ReadOnly = SAHPI_FALSE; rdr->RdrTypeUnion.CtrlRec.WriteOnly = SAHPI_FALSE; oh_init_textbuffer(&rdr->IdString); oh_append_textbuffer(&rdr->IdString, "FRU activation control"); l_c_info->ohoii.get_control_state = get_atca_fru_activation_control_state; l_c_info->ohoii.set_control_state = set_atca_fru_activation_control_state; l_c_info->mode = SAHPI_CTRL_MODE_AUTO; l_c_info->type = OHOI_CTRL_ATCA_MAPPED; *c_info = l_c_info; return rdr; } /*----------------------- Assigned Power Sensor -----------------------------*/ struct assigned_pwr_sensor_s { SaHpiFloat64T ass_pwr; }; static void _atca_get_assigned_pwr_cb(ipmi_mc_t *mc, ipmi_msg_t *msg, void *rsp_data) { atca_common_info_t *info = rsp_data; int rv = msg->data[0]; struct assigned_pwr_sensor_s *ass_pwr = (struct assigned_pwr_sensor_s *)info->info; if (mc == NULL) { info->rv = SA_ERR_HPI_ENTITY_NOT_PRESENT; info->done = 1; return; } if (rv == 0xc1) { info->rv = SA_ERR_HPI_INVALID_CMD; } else if (rv == 0xc3) { info->rv = SA_ERR_HPI_NO_RESPONSE; } else if (rv != 0) { info->rv = SA_ERR_HPI_INVALID_PARAMS; } else { ass_pwr->ass_pwr = (SaHpiFloat64T) (msg->data[msg->data_len - 1] * (msg->data[4] / 10)); } info->done = 1; return; }; static void atca_get_assigned_pwr_cb(ipmi_mc_t *mc, void *cb_data) { atca_common_info_t *info = cb_data; unsigned char data[25]; int rv; memset(data, 0, 25); data[0] = IPMI_PICMG_GRP_EXT; data[1] = info->devid; data[2] = 0; rv = ipmicmd_mc_send(mc, IPMI_GROUP_EXTENSION_NETFN, IPMI_PICMG_CMD_GET_POWER_LEVEL, 0, data, 3, _atca_get_assigned_pwr_cb, cb_data); if (rv != 0) { err("ipmicmd_send = 0x%x\n", rv); OHOI_MAP_ERROR(info->rv, rv); return; } return; } static SaErrorT atca_get_assigned_pwr_reading(struct oh_handler_state *handler, struct ohoi_sensor_info *s_info, SaHpiSensorReadingT *reading, SaHpiEventStateT *ev_state) { struct ohoi_handler *ipmi_handler = (struct ohoi_handler *)handler->data; struct ohoi_resource_info *slot_info, *ent_info; atca_common_info_t info; struct assigned_pwr_sensor_s ass_pwr; SaHpiRptEntryT *rpt; SaErrorT rv; reading->IsSupported = FALSE; if (ev_state) { *ev_state = 0; } slot_info = (struct ohoi_resource_info *) oh_get_resource_data(handler->rptcache, s_info->info.atcamap_sensor_info.rid); rpt = atca_get_slot_state(handler, slot_info); if (!rpt) { reading->Value.SensorFloat64 = 0; } else { ent_info = (struct ohoi_resource_info *) oh_get_resource_data(handler->rptcache, rpt->ResourceId); info.done = 0; info.rv = SA_OK; info.addr = slot_info->u.slot.addr; info.devid = slot_info->u.slot.devid; info.info = &ass_pwr; rv = ipmi_mc_pointer_cb(ent_info->u.entity.mc_id, atca_get_assigned_pwr_cb, &info); if (rv != 0) { err("ipmi_domain_pointer_cb = 0x%x", rv); return SA_ERR_HPI_INTERNAL_ERROR; } rv = ohoi_loop(&info.done, ipmi_handler); if (rv != SA_OK) { err("ohoi_loop = 0x%x", rv); return SA_ERR_HPI_INTERNAL_ERROR; } if (info.rv != SA_OK) { err("info.rv = 0x%x\n", info.rv); return info.rv; } reading->Value.SensorFloat64 = ass_pwr.ass_pwr; } reading->IsSupported = TRUE; reading->Type = SAHPI_SENSOR_READING_TYPE_FLOAT64; return SA_OK; } static SaErrorT atca_assigned_pwr_sensor_event_enable_get( struct oh_handler_state *hnd, struct ohoi_sensor_info *sinfo, SaHpiBoolT *enable, SaHpiEventStateT *assert, SaHpiEventStateT *deassert) { *assert = sinfo->assert; *deassert = sinfo->deassert; *enable = sinfo->info.atcamap_sensor_info.val; return SA_OK; } static SaErrorT atca_get_assigned_pwr_thresholds(struct oh_handler_state *hnd, struct ohoi_sensor_info *sinfo, SaHpiSensorThresholdsT *thres) { memset(thres, 0, sizeof (SaHpiSensorThresholdsT)); thres->LowCritical.IsSupported = SAHPI_TRUE; thres->LowCritical.Type = SAHPI_SENSOR_READING_TYPE_FLOAT64; thres->LowCritical.Value.SensorFloat64 = 0; thres->UpCritical.IsSupported = SAHPI_TRUE; thres->UpCritical.Type = SAHPI_SENSOR_READING_TYPE_FLOAT64; thres->UpCritical.Value.SensorFloat64 = 400; return SA_OK; } static SaHpiRdrT *atca_create_assigned_pwr_sensor( struct ohoi_handler *ipmi_handler, struct ohoi_sensor_info **s_info) { SaHpiRdrT *rdr; struct ohoi_sensor_info *l_s_info; rdr = malloc(sizeof (SaHpiRdrT)); if (rdr == NULL) { err("Out of memory"); return NULL; } l_s_info = malloc(sizeof (struct ohoi_sensor_info)); if (l_s_info == NULL) { err("Out of memory"); free(rdr); return NULL; } memset(rdr, 0, sizeof (SaHpiRdrT)); memset(l_s_info, 0, sizeof (struct ohoi_sensor_info)); rdr->RdrType = SAHPI_SENSOR_RDR; rdr->IsFru = SAHPI_FALSE; rdr->RdrTypeUnion.SensorRec.Num = ATCAHPI_SENSOR_NUM_ASSIGNED_PWR; rdr->RdrTypeUnion.SensorRec.Type = SAHPI_OTHER_UNITS_BASED_SENSOR; rdr->RdrTypeUnion.SensorRec.Category = SAHPI_EC_THRESHOLD; rdr->RdrTypeUnion.SensorRec.EnableCtrl = SAHPI_TRUE; rdr->RdrTypeUnion.SensorRec.EventCtrl = SAHPI_SEC_READ_ONLY; rdr->RdrTypeUnion.SensorRec.Events = 0; rdr->RdrTypeUnion.SensorRec.DataFormat.IsSupported = SAHPI_TRUE; rdr->RdrTypeUnion.SensorRec.DataFormat.ReadingType = SAHPI_SENSOR_READING_TYPE_FLOAT64; rdr->RdrTypeUnion.SensorRec.DataFormat.BaseUnits = SAHPI_SU_WATTS; rdr->RdrTypeUnion.SensorRec.DataFormat.ModifierUnits = SAHPI_SU_UNSPECIFIED; rdr->RdrTypeUnion.SensorRec.DataFormat.ModifierUse = SAHPI_SMUU_NONE; rdr->RdrTypeUnion.SensorRec.DataFormat.Percentage = SAHPI_FALSE; rdr->RdrTypeUnion.SensorRec.DataFormat.Range.Flags = SAHPI_SRF_MIN | SAHPI_SRF_MAX; rdr->RdrTypeUnion.SensorRec.DataFormat.Range.Max.IsSupported = SAHPI_TRUE; rdr->RdrTypeUnion.SensorRec.DataFormat.Range.Max.Type = SAHPI_SENSOR_READING_TYPE_FLOAT64; rdr->RdrTypeUnion.SensorRec.DataFormat.Range.Max.Value.SensorFloat64 = 400; rdr->RdrTypeUnion.SensorRec.DataFormat.Range.Min.IsSupported = SAHPI_TRUE; rdr->RdrTypeUnion.SensorRec.DataFormat.Range.Min.Type = SAHPI_SENSOR_READING_TYPE_FLOAT64; rdr->RdrTypeUnion.SensorRec.DataFormat.Range.Min.Value.SensorFloat64 = 0; rdr->RdrTypeUnion.SensorRec.DataFormat.AccuracyFactor = 0.1; rdr->RdrTypeUnion.SensorRec.ThresholdDefn.IsAccessible = SAHPI_TRUE; rdr->RdrTypeUnion.SensorRec.ThresholdDefn.ReadThold = SAHPI_STM_LOW_CRIT | SAHPI_STM_UP_CRIT; rdr->RdrTypeUnion.SensorRec.ThresholdDefn.WriteThold = 0; rdr->RdrTypeUnion.SensorRec.ThresholdDefn.Nonlinear = SAHPI_FALSE; oh_init_textbuffer(&rdr->IdString); oh_append_textbuffer(&rdr->IdString, "Assigned Power Sensor"); l_s_info->ohoii.get_sensor_event_enable = atca_assigned_pwr_sensor_event_enable_get; l_s_info->ohoii.set_sensor_event_enable = NULL; l_s_info->ohoii.get_sensor_reading = atca_get_assigned_pwr_reading; l_s_info->ohoii.get_sensor_thresholds = atca_get_assigned_pwr_thresholds; l_s_info->ohoii.set_sensor_thresholds = NULL; l_s_info->support_assert = 0; l_s_info->support_deassert = 0; l_s_info->assert = 0; l_s_info->deassert = 0; l_s_info->sen_enabled = SAHPI_TRUE; l_s_info->enable = SAHPI_TRUE; l_s_info->info.atcamap_sensor_info.data = NULL; l_s_info->info.atcamap_sensor_info.val = SAHPI_FALSE; l_s_info->type = OHOI_SENSOR_ATCA_MAPPED; *s_info = l_s_info; return rdr; } /*-------------- Maximum Power Capability Sensor ----------------------------*/ static SaErrorT atca_get_max_pwr_capability_event_enable( struct oh_handler_state *hnd, struct ohoi_sensor_info *sinfo, SaHpiBoolT *enable, SaHpiEventStateT *assert, SaHpiEventStateT *deassert) { *assert = 0; *deassert = 0; *enable = SAHPI_FALSE; return SA_OK; } static SaErrorT atca_get_max_pwr_capability_reading( struct oh_handler_state *hnd, struct ohoi_sensor_info *s_info, SaHpiSensorReadingT *reading, SaHpiEventStateT *ev_state) { struct ohoi_handler *ipmi_handler = (struct ohoi_handler *) hnd->data; struct ohoi_resource_info *shelf_info, *slot_info; atca_common_info_t info; int rv; reading->IsSupported = FALSE; if (ev_state) { *ev_state = 0; } shelf_info = (struct ohoi_resource_info *) oh_get_resource_data(hnd->rptcache, ipmi_handler->atca_shelf_id); if (shelf_info == NULL) { return SA_ERR_HPI_INTERNAL_ERROR; } slot_info = (struct ohoi_resource_info *) oh_get_resource_data(hnd->rptcache, s_info->info.atcamap_sensor_info.rid); if (slot_info == NULL) { return SA_ERR_HPI_INTERNAL_ERROR; } info.done = 0; info.rv = 0; info.addr = slot_info->u.slot.addr; info.devid = slot_info->u.slot.devid; rv = ipmi_entity_pointer_cb(shelf_info->u.entity.entity_id, get_atca_fru_pwr_desc_cb, &info); if (rv) { return SA_ERR_HPI_INTERNAL_ERROR; } rv = ohoi_loop(&info.done, ipmi_handler); if (rv != SA_OK) { return rv; } if (info.len == 0) { return SA_ERR_HPI_INTERNAL_ERROR; } memcpy(&reading->Value.SensorUint64, info.data + 2, 2); reading->IsSupported = TRUE; reading->Type = SAHPI_SENSOR_READING_TYPE_UINT64; return SA_OK; } static SaHpiRdrT *atca_create_max_pwr_capability_sensor( struct ohoi_handler *ipmi_handler, struct ohoi_sensor_info **s_info) { SaHpiRdrT *rdr; struct ohoi_sensor_info *l_s_info; rdr = malloc(sizeof (SaHpiRdrT)); if (rdr == NULL) { err("Out of memory"); return NULL; } l_s_info = malloc(sizeof (struct ohoi_sensor_info)); if (l_s_info == NULL) { err("Out of memory"); free(rdr); return NULL; } memset(rdr, 0, sizeof (SaHpiRdrT)); memset(l_s_info, 0, sizeof (struct ohoi_sensor_info)); rdr->RdrType = SAHPI_SENSOR_RDR; rdr->IsFru = SAHPI_FALSE; rdr->RdrTypeUnion.SensorRec.Num = ATCAHPI_SENSOR_NUM_MAX_PWR; rdr->RdrTypeUnion.SensorRec.Type = SAHPI_OTHER_UNITS_BASED_SENSOR; rdr->RdrTypeUnion.SensorRec.Category = SAHPI_EC_THRESHOLD; rdr->RdrTypeUnion.SensorRec.EnableCtrl = SAHPI_TRUE; rdr->RdrTypeUnion.SensorRec.EventCtrl = SAHPI_SEC_READ_ONLY; rdr->RdrTypeUnion.SensorRec.Events = 0; rdr->RdrTypeUnion.SensorRec.DataFormat.IsSupported = SAHPI_TRUE; rdr->RdrTypeUnion.SensorRec.DataFormat.ReadingType = SAHPI_SENSOR_READING_TYPE_UINT64; rdr->RdrTypeUnion.SensorRec.DataFormat.BaseUnits = SAHPI_SU_WATTS; rdr->RdrTypeUnion.SensorRec.DataFormat.ModifierUnits = SAHPI_SU_UNSPECIFIED; rdr->RdrTypeUnion.SensorRec.DataFormat.ModifierUse = SAHPI_SMUU_NONE; rdr->RdrTypeUnion.SensorRec.DataFormat.Percentage = SAHPI_FALSE; rdr->RdrTypeUnion.SensorRec.DataFormat.Range.Flags = SAHPI_SRF_MIN | SAHPI_SRF_MAX; rdr->RdrTypeUnion.SensorRec.DataFormat.Range.Max.IsSupported = SAHPI_TRUE; rdr->RdrTypeUnion.SensorRec.DataFormat.Range.Max.Type = SAHPI_SENSOR_READING_TYPE_UINT64; rdr->RdrTypeUnion.SensorRec.DataFormat.Range.Max.Value.SensorUint64 = 800; rdr->RdrTypeUnion.SensorRec.DataFormat.Range.Min.IsSupported = SAHPI_TRUE; rdr->RdrTypeUnion.SensorRec.DataFormat.Range.Min.Type = SAHPI_SENSOR_READING_TYPE_UINT64; rdr->RdrTypeUnion.SensorRec.DataFormat.Range.Min.Value.SensorUint64 = 0; rdr->RdrTypeUnion.SensorRec.DataFormat.AccuracyFactor = 1; rdr->RdrTypeUnion.SensorRec.ThresholdDefn.IsAccessible = SAHPI_FALSE; oh_init_textbuffer(&rdr->IdString); oh_append_textbuffer(&rdr->IdString, "Maximum Power Capability Sensor"); l_s_info->ohoii.get_sensor_event_enable = atca_get_max_pwr_capability_event_enable; l_s_info->ohoii.set_sensor_event_enable = NULL; l_s_info->ohoii.get_sensor_reading = atca_get_max_pwr_capability_reading; l_s_info->ohoii.get_sensor_thresholds =NULL; l_s_info->ohoii.set_sensor_thresholds = NULL; l_s_info->support_assert = 0; l_s_info->support_deassert = 0; l_s_info->assert = 0; l_s_info->deassert = 0; l_s_info->sen_enabled = SAHPI_TRUE; l_s_info->enable = SAHPI_TRUE; l_s_info->info.atcamap_sensor_info.data = NULL; l_s_info->info.atcamap_sensor_info.val = SAHPI_FALSE; l_s_info->type = OHOI_SENSOR_ATCA_MAPPED; *s_info = l_s_info; return rdr; } /*---------------------------------------------------------------------------*/ void atca_create_slot_rdrs(struct oh_handler_state *handler, SaHpiResourceIdT rid) { struct ohoi_handler *ipmi_handler = (struct ohoi_handler *) handler->data; struct ohoi_sensor_info *s_info; struct ohoi_control_info *c_info; SaHpiRdrT *rdr; SaHpiRptEntryT *rpt; rpt = oh_get_resource_by_id(handler->rptcache, rid); if (rpt == NULL) { err("No rpt for atca chassis?"); return; } rdr = atca_create_slot_state_sensor(ipmi_handler, &s_info); if (rdr) { if (oh_add_rdr(handler->rptcache, rid, rdr, s_info, 1) != SA_OK) { err("couldn't add sensor rdr"); free(s_info); } else { rpt->ResourceCapabilities |= SAHPI_CAPABILITY_SENSOR | SAHPI_CAPABILITY_RDR; s_info->info.atcamap_sensor_info.rid = rid; } } rdr = atca_create_fru_activation_control(handler, rpt, &c_info); if (rdr) { if (oh_add_rdr(handler->rptcache, rid, rdr, c_info, 1) != SA_OK) { err("couldn't add control rdr"); free(c_info); } else { rpt->ResourceCapabilities |= SAHPI_CAPABILITY_CONTROL | SAHPI_CAPABILITY_RDR; c_info->info.atcamap_ctrl_info.rid = rid; } } rdr = atca_create_assigned_pwr_sensor(ipmi_handler, &s_info); if (rdr) { if (oh_add_rdr(handler->rptcache, rid, rdr, s_info, 1) != SA_OK) { err("couldn't add sensor rdr"); free(s_info); } else { rpt->ResourceCapabilities |= SAHPI_CAPABILITY_SENSOR | SAHPI_CAPABILITY_RDR; s_info->info.atcamap_sensor_info.rid = rid; } } rdr = atca_create_max_pwr_capability_sensor(ipmi_handler, &s_info); if (rdr) { if (oh_add_rdr(handler->rptcache, rid, rdr, s_info, 1) != SA_OK) { err("couldn't add sensor rdr"); free(s_info); } else { rpt->ResourceCapabilities |= SAHPI_CAPABILITY_SENSOR | SAHPI_CAPABILITY_RDR; s_info->info.atcamap_sensor_info.rid = rid; } } } openhpi-2.14.1/plugins/ipmi/atca_vshm_rdrs.c0000644000076400007640000002153411302567001015753 0ustar /* -*- linux-c -*- * * Copyright (c) 2005 by Intel Corp. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Vadim Revyakin */ #include "ipmi.h" #include // Virtual Shelf Manager Redundancy Sensor void ohoi_send_vshmgr_redundancy_sensor_event( struct oh_handler_state *handler, int become_present) { struct ohoi_handler *ipmi_handler = handler->data; SaErrorT rv; struct ohoi_sensor_info *s_info = NULL; struct oh_event *e; SaHpiSensorEventT *sen_evt; int num; SaHpiEventStateT cur; SaHpiEventStateT prev; rv = ohoi_get_rdr_data(handler, ipmi_handler->atca_vshm_id, SAHPI_SENSOR_RDR, ATCAHPI_SENSOR_NUM_SHMGR_REDUNDANCY, (void *)&s_info); if (rv != SA_OK) { err("could not get sensor info"); return; } if (s_info == NULL) { err("could not get sensor info"); return; } if (s_info->sen_enabled == SAHPI_FALSE) { err("sensor disabled"); return; } if (!s_info->info.atcamap_sensor_info.val) { // sensor event disable err("sensor event disabled"); return; } num = ipmi_handler->shmc_present_num; if (num == 1) { if (!(s_info->assert & SAHPI_ES_NON_REDUNDANT_SUFFICIENT_RESOURCES)) { err("SAHPI_ES_NON_REDUNDANT_SUFFICIENT" "_RESOURCES disabled"); return; } cur = SAHPI_ES_NON_REDUNDANT_SUFFICIENT_RESOURCES; prev = SAHPI_ES_FULLY_REDUNDANT; } else if (num == 0) { if (!(s_info->assert & SAHPI_ES_NON_REDUNDANT_INSUFFICIENT_RESOURCES)) { err("SAHPI_ES_NON_REDUNDANT_INSUFFICIENT" "_RESOURCES disabled"); return; } cur = SAHPI_ES_NON_REDUNDANT_INSUFFICIENT_RESOURCES; prev = SAHPI_ES_NON_REDUNDANT_SUFFICIENT_RESOURCES; } else if (num >= 2) { if (!become_present) { err("redunduncy not changed"); return; } if (!(s_info->assert & SAHPI_ES_FULLY_REDUNDANT)) { err("SAHPI_ES_FULLY_REDUNDANT disabled"); return; } cur = SAHPI_ES_FULLY_REDUNDANT; prev = SAHPI_ES_NON_REDUNDANT_SUFFICIENT_RESOURCES; } else { err("Internal error. Negative " "ipmi_handler->shmc_present_num = %d", num); return; } e = malloc(sizeof(*e)); if (!e) { err("Out of space"); return; } memset(e, 0, sizeof(*e)); e->event.Source = ipmi_handler->atca_vshm_id; e->event.EventType = SAHPI_ET_SENSOR; e->event.Severity = SAHPI_MAJOR; oh_gettimeofday(&e->event.Timestamp); sen_evt = &(e->event.EventDataUnion.SensorEvent); sen_evt->SensorNum = ATCAHPI_SENSOR_NUM_SHMGR_REDUNDANCY; sen_evt->SensorType = SAHPI_OPERATIONAL; sen_evt->EventCategory = SAHPI_EC_REDUNDANCY; sen_evt->Assertion = SAHPI_TRUE; sen_evt->EventState = cur; sen_evt->OptionalDataPresent = SAHPI_SOD_PREVIOUS_STATE | SAHPI_SOD_CURRENT_STATE; sen_evt->CurrentState = cur; sen_evt->PreviousState = prev; SaHpiRdrT *rdr = oh_get_rdr_by_type(handler->rptcache, ipmi_handler->atca_vshm_id, SAHPI_SENSOR_RDR, ATCAHPI_SENSOR_NUM_SHMGR_REDUNDANCY); if (rdr) e->rdrs = g_slist_append(e->rdrs, g_memdup(rdr, sizeof(SaHpiRdrT))); e->hid = handler->hid; oh_evt_queue_push(handler->eventq, e); } static SaErrorT get_vshmgr_redundancy_sensor_event_enable( struct oh_handler_state *hnd, struct ohoi_sensor_info *sinfo, SaHpiBoolT *enable, SaHpiEventStateT *assert, SaHpiEventStateT *deassert) { *assert = sinfo->assert; *deassert = 0; *enable = sinfo->info.atcamap_sensor_info.val; return SA_OK; } static SaErrorT set_vshmgr_redundancy_sensor_event_enable( struct oh_handler_state *hnd, struct ohoi_sensor_info *sinfo, SaHpiBoolT enable, SaHpiEventStateT assert, SaHpiEventStateT deassert, unsigned int a_supported, unsigned int d_supported) { if (deassert != 0) { err("deassert(0x%x) != 0", deassert); return SA_ERR_HPI_INVALID_DATA; } if ((assert & ~(SAHPI_ES_FULLY_REDUNDANT | SAHPI_ES_NON_REDUNDANT_SUFFICIENT_RESOURCES | SAHPI_ES_NON_REDUNDANT_INSUFFICIENT_RESOURCES))) { err("assert(0x%x)", assert); return SA_ERR_HPI_INVALID_DATA; } sinfo->assert = assert; sinfo->info.atcamap_sensor_info.val = enable; return SA_OK; } static SaErrorT get_vshmgr_redundancy_sensor_reading( struct oh_handler_state *hnd, struct ohoi_sensor_info *sensor_info, SaHpiSensorReadingT *reading, SaHpiEventStateT *ev_state) { struct ohoi_handler *ipmi_handler = hnd->data; int num = ipmi_handler->shmc_present_num; if (reading != NULL) { reading->IsSupported = SAHPI_FALSE; } if (ev_state) { if (num == 0) { *ev_state = SAHPI_ES_NON_REDUNDANT_INSUFFICIENT_RESOURCES; } else if (num == 1) { *ev_state = SAHPI_ES_NON_REDUNDANT_SUFFICIENT_RESOURCES; } else { *ev_state = SAHPI_ES_FULLY_REDUNDANT; } } return SA_OK; } static SaErrorT get_vshmgr_redundancy_sensor_thresholds( struct oh_handler_state *hnd, struct ohoi_sensor_info *sinfo, SaHpiSensorThresholdsT *thres) { return SA_ERR_HPI_INVALID_CMD; } static SaErrorT set_vshmgr_redundancy_sensor_thresholds( struct oh_handler_state *hnd, struct ohoi_sensor_info *sinfo, const SaHpiSensorThresholdsT *thres) { return SA_ERR_HPI_INVALID_CMD; } static SaHpiRdrT *create_vshmgr_redundancy_sensor( struct oh_handler_state *handler, SaHpiRptEntryT *rpt, struct ohoi_sensor_info **sensor_info) { // struct ohoi_handler *ipmi_handler = handler->data; SaHpiRdrT *rdr; struct ohoi_sensor_info *s_info; SaHpiEventStateT events; rdr = malloc(sizeof (*rdr)); if (rdr == NULL) { err("Out of memory"); return NULL; } s_info = malloc(sizeof (*s_info)); if (rdr == NULL) { err("Out of memory"); free(rdr); return NULL; } memset(rdr, 0, sizeof (*rdr)); memset(s_info, 0, sizeof (*s_info)); events = SAHPI_ES_FULLY_REDUNDANT | SAHPI_ES_NON_REDUNDANT_SUFFICIENT_RESOURCES | SAHPI_ES_NON_REDUNDANT_INSUFFICIENT_RESOURCES; rdr->RdrType = SAHPI_SENSOR_RDR; rdr->IsFru = SAHPI_FALSE; rdr->Entity = rpt->ResourceEntity; rdr->RdrTypeUnion.SensorRec.Num = ATCAHPI_SENSOR_NUM_SHMGR_REDUNDANCY; rdr->RdrTypeUnion.SensorRec.Type = SAHPI_OPERATIONAL; rdr->RdrTypeUnion.SensorRec.Category = SAHPI_EC_REDUNDANCY; rdr->RdrTypeUnion.SensorRec.EnableCtrl = SAHPI_TRUE; rdr->RdrTypeUnion.SensorRec.EventCtrl = SAHPI_SEC_PER_EVENT; rdr->RdrTypeUnion.SensorRec.Events = events; rdr->RdrTypeUnion.SensorRec.DataFormat.IsSupported = SAHPI_FALSE; rdr->RdrTypeUnion.SensorRec.ThresholdDefn.IsAccessible = SAHPI_FALSE; oh_init_textbuffer(&rdr->IdString); oh_append_textbuffer(&rdr->IdString, "Shelf Manager Redundancy Sensor"); s_info->support_assert = events; s_info->support_deassert = 0; s_info->assert = events; s_info->deassert = 0; s_info->sen_enabled = SAHPI_TRUE; s_info->enable = SAHPI_TRUE; s_info->info.atcamap_sensor_info.data = NULL; s_info->info.atcamap_sensor_info.val = SAHPI_TRUE; s_info->type = OHOI_SENSOR_ATCA_MAPPED; s_info->ohoii.get_sensor_event_enable = get_vshmgr_redundancy_sensor_event_enable; s_info->ohoii.set_sensor_event_enable = set_vshmgr_redundancy_sensor_event_enable; s_info->ohoii.get_sensor_reading = get_vshmgr_redundancy_sensor_reading; s_info->ohoii.get_sensor_thresholds = get_vshmgr_redundancy_sensor_thresholds; s_info->ohoii.set_sensor_thresholds = set_vshmgr_redundancy_sensor_thresholds; *sensor_info = s_info; return rdr; } void create_atca_virt_shmgr_rdrs(struct oh_handler_state *hnd) { struct ohoi_handler *ipmi_handler = hnd->data; SaHpiRptEntryT *rpt; SaHpiRdrT *rdr; // struct ohoi_control_info *c_info; struct ohoi_sensor_info *s_info; // int num_controls = 0; // int num_sensors = 0; struct ohoi_resource_info *res_info; g_static_rec_mutex_lock(&ipmi_handler->ohoih_lock); rpt = oh_get_resource_by_id(hnd->rptcache, ipmi_handler->atca_vshm_id); if (rpt == NULL) { err("No rpt for atca chassis?"); return; } res_info = oh_get_resource_data(hnd->rptcache, ipmi_handler->atca_vshm_id); // Create Power On Sequence Commit Status sensor rdr = create_vshmgr_redundancy_sensor(hnd, rpt, &s_info); if (rdr != NULL) { if (oh_add_rdr(hnd->rptcache, ipmi_handler->atca_vshm_id, rdr, s_info, 1) != SA_OK) { err("couldn't add control rdr"); free(rdr); free(s_info); } } else { rpt->ResourceCapabilities |= SAHPI_CAPABILITY_SENSOR | SAHPI_CAPABILITY_RDR; } g_static_rec_mutex_unlock(&ipmi_handler->ohoih_lock); } openhpi-2.14.1/plugins/sysfs/0000755000076400007640000000000011405006365013021 5ustar openhpi-2.14.1/plugins/sysfs/Makefile.am0000644000076400007640000000351011302566770015063 0ustar # # Copyright (c) 2003, Intel Corporation # All rights reserved. # # 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. # # Neither the name of Intel Corporation nor the names # of its contributors may be used to endorse or promote products # derived from this software without specific prior written permission. # # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS # "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT # LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS # FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT # OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, # SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED # TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, # OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY # OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING # NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS # SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. # MAINTAINERCLEANFILES = Makefile.in INCLUDES = @OPENHPI_INCLUDES@ -I/usr/include/sysfs pkglib_LTLIBRARIES = libsysfs2hpi.la libsysfs2hpi_la_SOURCES = sysfs2hpi.c libsysfs2hpi_la_LIBADD = -lsysfs -luuid $(top_builddir)/utils/libopenhpiutils.la libsysfs2hpi_la_LDFLAGS = -module -version-info @HPI_LIB_VERSION@ openhpi-2.14.1/plugins/sysfs/sysfs2hpi.c0000644000076400007640000007736511302566770015150 0ustar /* -*- linux-c -*- * * Copyright (c) 2003 by Intel Corp. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Rusty Lynch * Julie Fleischer * Tariq Shureih * Racing Guo */ #include #include #include #include #include #include #include #include #define SYSFS2HPI_ERROR -700 #define SCRATCHSIZE 60 int g_num_resources=0; /* total # resources */ SaHpiEntityPathT g_epbase; /* root entity path (from config) */ struct sysfsitems { GSList *resources; struct sysfs_bus *bus; int initialized; }; struct sensor { int num; char name[SYSFS_NAME_LEN]; struct sysfs_attribute *max; struct sysfs_attribute *min; struct sysfs_attribute *value; struct sysfs_attribute *div; SaHpiBoolT evt_enable; }; struct resource { SaHpiEntityPathT path; char name[SYSFS_NAME_LEN]; GSList *sensors; }; static inline void reading_int64_set(SaHpiSensorReadingT *reading, int value) { reading->IsSupported = SAHPI_TRUE; reading->Type = SAHPI_SENSOR_READING_TYPE_INT64; reading->Value.SensorInt64 = value; } /** * *sysfs2hpi_open: * @handler_config: pointer to config file * * This function creates an instance for the sysfs plugin * and returns a handler to the instance. * The two input parameters name and addr for the * mechanism's name and address, respectively, are N/A * for a sysfs plugin. **/ static void *sysfs2hpi_open(GHashTable *handler_config, unsigned int hid, oh_evt_queue *eventq) { struct oh_handler_state *hnd; struct sysfsitems *sys; char *er; if (!handler_config) { err("empty handler_config"); return NULL; } /* set up entity root in g_epbase */ er = (char *)g_hash_table_lookup(handler_config,"entity_root"); if (!er) { err("no entity root present"); return NULL; } oh_encode_entitypath(er, &g_epbase); hnd = malloc(sizeof(*hnd)); if (!hnd) { err("unable to allocate main handler"); return NULL; } memset(hnd, '\0', sizeof(*hnd)); /* assign config to handler_config and initialize rptcache */ hnd->config = handler_config; hnd->hid = hid; hnd->eventq = eventq; hnd->rptcache = (RPTable *)g_malloc0(sizeof(RPTable)); oh_init_rpt(hnd->rptcache); sys = malloc(sizeof(*sys)); if (!sys) { err("unable to allocate sysfsitems structure"); return NULL; } memset(sys, '\0', sizeof(*sys)); hnd->data = (void *) sys; return hnd; } /** * sysfs2hpi_close: * @hnd: pointer to instance * * Close the instance for the sysfs plugin. * Note: There is currently no way to test this code * as it is not called by the framework. **/ static void sysfs2hpi_close(void *hnd) { GSList *tmp; struct resource *r; struct sysfsitems *sys; struct oh_handler_state *inst = (struct oh_handler_state *)hnd; if (!inst) { err("no instance to delete"); return; } sys = inst->data; sysfs_close_bus(sys->bus); /* Free resources and their sensors */ if (g_slist_length(sys->resources) != 0) { g_slist_for_each(tmp, sys->resources) { r = (struct resource *)tmp->data; g_slist_free(r->sensors); g_slist_free(sys->resources); } } /* Free main instance */ free(inst); } /** * sysfs2hpi_get_event: * @hnd: pointer to handler instance * * This function gets a sysfs event from the sysfs event table * in instance.events. * * Return value: 0 if times out, > 0 is event is returned. **/ static int sysfs2hpi_get_event(void *hnd) { return 0; } /** * sysfs2hpi_setup_rdr: * @type: Sensor type * @str: string holding sensor name * @num_sensors: sensor number * @d: pointer to struct sysfs_device for this sensor * @r: pointer to struct resource for this sensor * @inst: pointer to instance * * Helper function to sysfs2hpi_assign_rdrs(). * Set up the RDR for either current, fan, voltage, * or temperature. * * Return value: 0 for success | Error code. **/ static int sysfs2hpi_setup_rdr(SaHpiSensorTypeT type, const char* str, int num_sensors, struct sysfs_device* d, struct resource* r, struct oh_handler_state* inst, struct oh_event *e) { struct sensor *s; unsigned char strinput[SYSFS_NAME_LEN]; int puid; SaHpiSensorDataFormatT *frmt; SaHpiRdrT *tmprdr; if ((type != SAHPI_TEMPERATURE) && (type != SAHPI_VOLTAGE) && (type != SAHPI_CURRENT) && (type != SAHPI_FAN)) { return SA_ERR_HPI_INVALID_PARAMS; } s = (struct sensor*)malloc(sizeof(*s)); if (!s) { err("unable to allocate sensor"); return SA_ERR_HPI_OUT_OF_SPACE; } memset(s,'\0',sizeof(*s)); s->num = num_sensors; switch(type) { case SAHPI_TEMPERATURE: snprintf(s->name, SYSFS_NAME_LEN, "%i:Temp Sensor",s->num); snprintf((char*)strinput, SYSFS_NAME_LEN, "temp_input%s", str); s->value = sysfs_get_device_attr(d, (char*)strinput); snprintf((char*)strinput, SYSFS_NAME_LEN, "temp_max%s", str); s->max = sysfs_get_device_attr(d, (char*)strinput); snprintf((char*)strinput, SYSFS_NAME_LEN, "temp_min%s", str); s->min = sysfs_get_device_attr(d, (char*)strinput); s->div = NULL; break; case SAHPI_VOLTAGE: snprintf(s->name, SYSFS_NAME_LEN, "%i:Voltage Sensor",s->num); snprintf((char*)strinput, SYSFS_NAME_LEN, "in_input%s", str); s->value = sysfs_get_device_attr(d, (char*)strinput); snprintf((char*)strinput, SYSFS_NAME_LEN, "in_max%s", str); s->max = sysfs_get_device_attr(d, (char*)strinput); snprintf((char*)strinput, SYSFS_NAME_LEN, "in_min%s", str); s->min = sysfs_get_device_attr(d, (char*)strinput); s->div = NULL; break; case SAHPI_CURRENT: snprintf(s->name, SYSFS_NAME_LEN, "%i:Current Sensor",s->num); snprintf((char*)strinput, SYSFS_NAME_LEN, "curr_input%s", str); s->value = sysfs_get_device_attr(d, (char*)strinput); snprintf((char*)strinput, SYSFS_NAME_LEN, "curr_max%s", str); s->max = sysfs_get_device_attr(d, (char*)strinput); snprintf((char*)strinput, SYSFS_NAME_LEN, "curr_min%s", str); s->min = sysfs_get_device_attr(d, (char*)strinput); s->div = NULL; break; case SAHPI_FAN: snprintf(s->name, SYSFS_NAME_LEN, "%i:Fan Sensor",s->num); snprintf((char*)strinput, SYSFS_NAME_LEN, "fan_input%s", str); s->value = sysfs_get_device_attr(d, (char*)strinput); snprintf((char*)strinput, SYSFS_NAME_LEN, "fan_max%s", str); s->max = sysfs_get_device_attr(d, (char*)strinput); snprintf((char*)strinput, SYSFS_NAME_LEN, "fan_min%s", str); s->min = sysfs_get_device_attr(d, (char*)strinput); snprintf((char*)strinput, SYSFS_NAME_LEN, "fan_div%s", str); s->div = sysfs_get_device_attr(d, (char*)strinput); break; default: /* should never be executed */ return SA_ERR_HPI_INVALID_PARAMS; } if (!s->value && !s->max && !s->min) { /* RDR doesn't exist */ free(s); return SYSFS2HPI_ERROR; } r->sensors = g_slist_append(r->sensors, s); tmprdr = (SaHpiRdrT *)malloc(sizeof(SaHpiRdrT)); if (!tmprdr) return SA_ERR_HPI_OUT_OF_SPACE; tmprdr->RecordId = num_sensors; tmprdr->RdrType = SAHPI_SENSOR_RDR; tmprdr->Entity.Entry[0].EntityType = SAHPI_ENT_SYS_MGMNT_SOFTWARE; tmprdr->Entity.Entry[0].EntityLocation = g_num_resources; tmprdr->Entity.Entry[1].EntityType = SAHPI_ENT_OTHER_SYSTEM_BOARD; tmprdr->Entity.Entry[1].EntityLocation = 0; /* 0 b/c only 1 board */ oh_concat_ep( &tmprdr->Entity, &g_epbase); tmprdr->RdrTypeUnion.SensorRec.Num = num_sensors; tmprdr->RdrTypeUnion.SensorRec.Type = type; /* Ignoring .Category, .EventCtrl, and .Events b/c sysfs has no events */ frmt = &tmprdr->RdrTypeUnion.SensorRec.DataFormat; frmt->IsSupported = SAHPI_TRUE; frmt->ReadingType = SAHPI_SENSOR_READING_TYPE_INT64; switch(type) { case SAHPI_TEMPERATURE: /* Interpreted temperature is in degrees Celcius */ frmt->BaseUnits = SAHPI_SU_DEGREES_C; break; case SAHPI_VOLTAGE: /* Interpreted voltage is in Volts */ frmt->BaseUnits = SAHPI_SU_VOLTS; break; case SAHPI_CURRENT: /* Interpreted current is in Amps */ frmt->BaseUnits = SAHPI_SU_AMPS; break; case SAHPI_FAN: /* Interpreted fan is in RPMs */ frmt->BaseUnits = SAHPI_SU_RPM; break; default: /* should never be executed */ return SA_ERR_HPI_INVALID_PARAMS; } frmt->ModifierUnits = 0; frmt->ModifierUse = 0; frmt->Percentage = 0; /* Fix Me : I don't know range*/ //frmt->Range = 0; frmt->AccuracyFactor = 0; #if 0 e->u.rdr_event.rdr.RdrTypeUnion.SensorRec.Ignore = FALSE; e->u.rdr_event.rdr.RdrTypeUnion.SensorRec.DataFormat.ReadingFormats = SAHPI_SRF_RAW | SAHPI_SRF_INTERPRETED; e->u.rdr_event.rdr.RdrTypeUnion.SensorRec.DataFormat.IsNumeric = TRUE; switch(type) { case SAHPI_TEMPERATURE: /* Interpreted temperature is in degrees Celcius */ e->u.rdr_event.rdr.RdrTypeUnion.SensorRec.DataFormat.BaseUnits = SAHPI_SU_DEGREES_C; break; case SAHPI_VOLTAGE: /* Interpreted voltage is in Volts */ e->u.rdr_event.rdr.RdrTypeUnion.SensorRec.DataFormat.BaseUnits = SAHPI_SU_VOLTS; break; case SAHPI_CURRENT: /* Interpreted current is in Amps */ e->u.rdr_event.rdr.RdrTypeUnion.SensorRec.DataFormat.BaseUnits = SAHPI_SU_AMPS; break; case SAHPI_FAN: /* Interpreted fan is in RPMs */ e->u.rdr_event.rdr.RdrTypeUnion.SensorRec.DataFormat.BaseUnits = SAHPI_SU_RPM; break; default: /* should never be executed */ return SA_ERR_HPI_INVALID_PARAMS; } e->u.rdr_event.rdr.RdrTypeUnion.SensorRec.ThresholdDefn.IsThreshold = SAHPI_TRUE; e->u.rdr_event.rdr.RdrTypeUnion.SensorRec.ThresholdDefn.TholdCapabilities = SAHPI_STC_RAW|SAHPI_STC_INTERPRETED; e->u.rdr_event.rdr.RdrTypeUnion.SensorRec.ThresholdDefn.ReadThold = SAHPI_STM_LOW_CRIT | SAHPI_STM_UP_CRIT; e->u.rdr_event.rdr.RdrTypeUnion.SensorRec.ThresholdDefn.WriteThold = SAHPI_STM_LOW_CRIT | SAHPI_STM_UP_CRIT; e->u.rdr_event.rdr.RdrTypeUnion.SensorRec.ThresholdDefn.FixedThold = 0; e->u.rdr_event.rdr.IdString.DataType = SAHPI_TL_TYPE_ASCII6; e->u.rdr_event.rdr.IdString.Language = SAHPI_LANG_ENGLISH; e->u.rdr_event.rdr.IdString.DataLength = strlen(s->name); strcpy(e->u.rdr_event.rdr.IdString.Data, s->name); #endif puid = oh_uid_lookup(&tmprdr->Entity); if (puid < 0) { err("could not find correct parent"); return SA_ERR_HPI_ERROR; } if (oh_add_rdr(inst->rptcache, puid, tmprdr, (void *)s, 0)) { err("unable to add RDR to RPT"); return SA_ERR_HPI_ERROR; } e->rdrs = g_slist_append(e->rdrs, tmprdr); /* Append RDR to event */ return 0; } /** * sysfs2hpi_assign_rdrs: * @d: pointer to sysfs_device structure * @r: pointer to resource structure * @inst: pointer to instance * * Helper function for sysfs2hpi_assign_resource(). * Assigns RDR values. * Currently, there are the following possible RDRs: * - current * - fan * - voltage * - temp * The fields: alarms, beep, eeprom, pwm, vid, and vrm * are not used at this time. * * Return value: **/ static int sysfs2hpi_assign_rdrs(struct sysfs_device* d, struct resource* r, struct oh_handler_state* inst, struct oh_event *e) { int num_sensors = 0; char str[2]; int i; /* Max # fan, voltage, temp, current entries is set by sysfs. Hard-coded here. Voltage starts at 0. All others start at 1. Current has no max. */ const int fanmax = 3; const int voltagemax = 8; const int tempmax = 3; /* Set up current RDR */ i=0; while(i != -1) { i++; snprintf(str, sizeof(str), "%d", i); if (sysfs2hpi_setup_rdr(SAHPI_CURRENT, str, ++num_sensors, d, r, inst, e) != 0) { i=-1; /* keep going until we get an error returned */ num_sensors--; } } /* Set up fan RDR */ for (i=1;i<=fanmax;i++) { snprintf(str, sizeof(str), "%d", i); if (sysfs2hpi_setup_rdr(SAHPI_FAN, str, ++num_sensors, d, r, inst, e) != 0) { num_sensors--; } } /* Set up voltage RDR */ for (i=0;i<=voltagemax;i++) { snprintf(str, sizeof(str), "%d", i); if (sysfs2hpi_setup_rdr(SAHPI_VOLTAGE, str, ++num_sensors, d, r, inst, e) != 0) { num_sensors--; } } /* Set up temp RDR */ for (i=1;i<=tempmax;i++) { snprintf(str, sizeof(str), "%d", i); if (sysfs2hpi_setup_rdr(SAHPI_TEMPERATURE, str, ++num_sensors, d, r, inst, e) != 0) { num_sensors--; } } return 0; } /** * sysfs2hpi_assign_resource: * @d: pointer to sysfs_device structure * @inst: pointer to instance * * Helper function for sysfs2hpi_discover_resources(). * This function fills in the resource structure and * places the event for the resource on the internal * event queue. * Currently, all resources for sysfs are critical * as there is no way to differentiate priority * between devices. [No data available to tell * location of device -- i2c bus # doesn't; sysfs * data is all for one device and also doesn't tell * location.] * * Return value: 0 for success | Error code **/ static int sysfs2hpi_assign_resource(struct sysfs_device* d, struct oh_handler_state* inst) { struct oh_event *e; struct resource *r; struct sysfsitems *sys; r = (struct resource *)malloc(sizeof(*r)); if (!r) { err("unable to allocate resource"); return SA_ERR_HPI_OUT_OF_SPACE; } memset(r,'\0',sizeof(*r)); r->path.Entry[0].EntityType = SAHPI_ENT_SYS_MGMNT_SOFTWARE; r->path.Entry[0].EntityLocation = g_num_resources; r->path.Entry[1].EntityType = SAHPI_ENT_OTHER_SYSTEM_BOARD; r->path.Entry[1].EntityLocation = 0; /* 0 b/c only 1 board */ //snprintf(r->name, "%s_%s", d->name, d->bus_id); strncpy(r->name,d->name,SYSFS_NAME_LEN); sys = inst->data; sys->resources = g_slist_append(sys->resources, r); e = (struct oh_event *)malloc(sizeof(*e)); if (!e) { err("unable to allocate event"); return SA_ERR_HPI_OUT_OF_SPACE; } memset(e, '\0', sizeof(struct oh_event)); e->hid = inst->hid; oh_concat_ep( &(r->path), &g_epbase); e->resource.ResourceId = oh_uid_from_entity_path(&(r->path)); e->resource.EntryId = e->resource.ResourceId; /* EntryId = ResourceId */ /* Note: .res_event.entry.ResourceInfo currently unassigned */ memcpy(&(e->resource.ResourceEntity),&(r->path),sizeof(SaHpiEntityPathT)); e->resource.ResourceCapabilities = SAHPI_CAPABILITY_RESOURCE|SAHPI_CAPABILITY_RDR|SAHPI_CAPABILITY_SENSOR; e->resource.ResourceSeverity = SAHPI_CRITICAL; /* sysfs data always critical */ e->resource.ResourceTag.DataType = SAHPI_TL_TYPE_ASCII6; e->resource.ResourceTag.Language = SAHPI_LANG_ENGLISH; e->resource.ResourceTag.DataLength = strlen(r->name); strcpy((char*)e->resource.ResourceTag.Data, r->name); e->event.Source = e->resource.ResourceId; e->event.Timestamp = SAHPI_TIME_UNSPECIFIED; e->event.Severity = e->resource.ResourceSeverity; e->event.EventType = SAHPI_ET_RESOURCE; e->event.EventDataUnion.ResourceEvent.ResourceEventType = SAHPI_RESE_RESOURCE_ADDED; /* add resource */ if (0 != oh_add_resource(inst->rptcache, &(e->resource), NULL, 0)) { err("unable to add resource to RPT"); return SA_ERR_HPI_ERROR; } /* Assign RDRs to this resource */ sysfs2hpi_assign_rdrs(d, r, inst, e); /* add event */ oh_evt_queue_push(inst->eventq, e); return 0; } /** * sysfs2hpi_discover_resources: * @hnd: void pointer to handler * * Discover the resources in sysfs. * Currently, we are only discovering devices on * the i2c bus. Each device is a resource. All * data underneath is part of the RDR. * * Return value: 0 for success | Error code **/ static int sysfs2hpi_discover_resources(void *hnd) { struct sysfs_device *d = NULL; struct oh_handler_state *inst = (struct oh_handler_state *)hnd; struct sysfsitems *sys; if (!hnd) { err("null handle"); return SA_ERR_HPI_INVALID_PARAMS; } /* * This plug-in is written for hardwired i2c sensors, * and therefore doesn't really need to do any discovery * after the initial discovery */ sys = inst->data; if (sys->initialized) return 0; sys->bus = sysfs_open_bus("i2c"); if (!sys->bus) { err("unable to open i2c bus"); return SA_ERR_HPI_NOT_PRESENT; /* better error checking would ensure a better return val */ } if (!(sys->bus->devices)) { err("no i2c devices found"); sysfs_close_bus(sys->bus); sys->initialized++; return 0; } /* * One resource per device under /sys/bus/i2c/devices */ oh_uid_initialize(); dlist_for_each_data(sys->bus->devices, d, struct sysfs_device) { int ret = 0; ret = sysfs2hpi_assign_resource(d, inst); g_num_resources++; if (0 != ret) { return ret; } } /* end dlist_for_each_data */ sys->initialized++; return 0; } /** * sysfs2hpi_get_sensor_reading: * @hnd: void pointer to handler * @id: ResourceId for resource with data * @num: Sensor number for sensor with data * @data: pointer to SaHpiSensorReading data type * * Get the data for the RDR sensor passed to this function. * This function rereads the data from the machine in case it * has changed. * Note: libsysfs documentation states that current, voltage, * and temperature raw readings need to be divided by 1000 to * get interpreted values. fan readings need to be divided * by fan_div. We are assuming that if there is not a div * parameter, this is not a fan sensor (This assumption is * not fully robust.). * * Return value: 0 for success | Error code **/ /** * Change: * all readings get interpreted values **/ static int sysfs2hpi_get_sensor_reading(void *hnd, SaHpiResourceIdT id, SaHpiSensorNumT num, SaHpiSensorReadingT *reading, SaHpiEventStateT *state) { struct sensor *s; struct sysfs_attribute *sysattr = NULL; struct oh_handler_state *inst = (struct oh_handler_state *)hnd; SaHpiRdrT *tmprdr; if (!hnd) { err("null handle"); return SA_ERR_HPI_INVALID_PARAMS; } /* sequential search of rdr list for current RDR */ tmprdr = oh_get_rdr_next(inst->rptcache, id, 0); while ((tmprdr->RdrTypeUnion.SensorRec.Num != num) && (tmprdr)) { tmprdr = oh_get_rdr_next(inst->rptcache, id, tmprdr->RecordId); } if (tmprdr->RdrTypeUnion.SensorRec.Num != num) { /* didn't find sensor */ err("could not find sensor"); return SA_ERR_HPI_INVALID_DATA; } /* get sensor data */ s = (struct sensor *) oh_get_rdr_data(inst->rptcache, id, tmprdr->RecordId); if (!s) { err("could not get sensor data"); return SA_ERR_HPI_INVALID_DATA; } if (!s->value) { err("input data for sensor not available"); return SA_ERR_HPI_INVALID_DATA; } *state = 0x0000; sysattr = sysfs_open_attribute(s->value->path); if (!sysattr) { err("failed opening attribute at %s", s->value->path); return SA_ERR_HPI_INVALID_DATA; } if (sysfs_read_attribute(sysattr)) { err("error attempting to read value of %s",s->name); sysfs_close_attribute(sysattr); return SA_ERR_HPI_INVALID_DATA; } reading_int64_set(reading, atoi(sysattr->value)); sysfs_close_attribute(sysattr); return 0; } /** * sysfs2hpi_get_sensor_thresholds: * @hnd: void pointer to handler * @id: ResourceId for resource with data * @num: Sensor number for sensor with data * @thres: pointer to SaHpiSensorThresholdsT data type * * Get the thresholds for the RDR sensor passed to this function. * This function rereads the data from the machine in case it * has changed. * Note: libsysfs documentation states that current, voltage, * and temperature raw readings need to be divided by 1000 to * get interpreted values. fan readings need to be divided * by fan_div. We are assuming that if there is not a div * parameter, this is not a fan sensor (This assumption is * not fully robust.). * * Return value: 0 for success | Error code **/ static int sysfs2hpi_get_sensor_thresholds(void *hnd, SaHpiResourceIdT id, SaHpiSensorNumT num, SaHpiSensorThresholdsT *thres) { struct sensor *s; struct sysfs_attribute *sysattr = NULL; struct oh_handler_state *inst = (struct oh_handler_state *)hnd; SaHpiRdrT *tmprdr; if (!hnd) { err("null handle"); return SA_ERR_HPI_INVALID_PARAMS; } /* sequential search of rdr list for current RDR */ tmprdr = oh_get_rdr_next(inst->rptcache, id, 0); while ((tmprdr->RdrTypeUnion.SensorRec.Num != num) && (tmprdr)) { tmprdr = oh_get_rdr_next(inst->rptcache, id, tmprdr->RecordId); } if (tmprdr->RdrTypeUnion.SensorRec.Num != num) { /* didn't find sensor */ err("could not find sensor"); return SA_ERR_HPI_INVALID_DATA; } /* get sensor data */ s = (struct sensor *) oh_get_rdr_data(inst->rptcache, id, tmprdr->RecordId); if (!s) { err("could not get sensor thresholds"); return SA_ERR_HPI_INVALID_DATA; } /* * sysfs only defines a min and a max * setting these to LowCritical and UpCritical, respectively * The min value for temperature can technically be a hysteresis value, * but this currently is not part of the hysteresis fields. * Setting ValuesPresent for all other items to 0. */ /* get min values */ sysattr = sysfs_open_attribute(s->min->path); if (!sysattr) { err("failed opening attribute at %s", s->min->path); return SA_ERR_HPI_INVALID_DATA; } if (sysfs_read_attribute(sysattr)) { err("error attempting to read value of %s",s->name); sysfs_close_attribute(sysattr); return SA_ERR_HPI_INVALID_DATA; } reading_int64_set(&thres->LowCritical, atoi(sysattr->value)); sysfs_close_attribute(sysattr); sysattr = NULL; sysattr = sysfs_open_attribute(s->max->path); if (!sysattr) { err("failed opening attribute at %s", s->max->path); return SA_ERR_HPI_INVALID_DATA; } if (sysfs_read_attribute(sysattr)) { err("error attempting to read value of %s",s->name); sysfs_close_attribute(sysattr); return SA_ERR_HPI_INVALID_DATA; } reading_int64_set(&thres->UpCritical, atoi(sysattr->value)); sysfs_close_attribute(sysattr); thres->LowMajor.IsSupported = SAHPI_FALSE; thres->LowMinor.IsSupported = SAHPI_FALSE; thres->UpMajor.IsSupported = SAHPI_FALSE; thres->UpMinor.IsSupported = SAHPI_FALSE; thres->PosThdHysteresis.IsSupported = SAHPI_FALSE; thres->NegThdHysteresis.IsSupported = SAHPI_FALSE; #if 0 thres->LowCritical.Raw = atoi(tmp); thres->LowCritical.ValuesPresent = SAHPI_SRF_RAW; thres->LowCritical.EventStatus.SensorStatus = s->enables.SensorStatus; thres->LowCritical.EventStatus.EventStatus = s->enables.AssertEvents; thres->LowCritical.Interpreted.Type = SAHPI_SENSOR_INTERPRETED_TYPE_UINT32; if (!s->div) { /* assume not a fan sensor */ thres->LowCritical.Interpreted.Value.SensorUint32 = (SaHpiUint32T) thres->LowCritical.Raw/1000; } else { /* fan sensor */ if (sysfs_read_attribute_value(s->div->path,tmp,SCRATCHSIZE)) { err("error attempting to read value of %s",s->name); return SA_ERR_HPI_INVALID_DATA; } thres->LowCritical.Interpreted.Value.SensorUint32 = (SaHpiUint32T) thres->LowCritical.Raw/atoi(tmp); } if (sysfs_read_attribute_value(s->max->path,tmp,SCRATCHSIZE)) { err("error attempting to read value of %s",s->name); return SA_ERR_HPI_INVALID_DATA; } /* get max values */ thres->UpCritical.Raw = atoi(tmp); thres->UpCritical.ValuesPresent = SAHPI_SRF_RAW; thres->UpCritical.EventStatus.SensorStatus = s->enables.SensorStatus; thres->UpCritical.EventStatus.EventStatus = s->enables.AssertEvents; thres->UpCritical.Interpreted.Type = SAHPI_SENSOR_INTERPRETED_TYPE_UINT32; if (!s->div) { /* assume not a fan sensor */ thres->UpCritical.Interpreted.Value.SensorUint32 = (SaHpiUint32T) thres->UpCritical.Raw/1000; } else { /* fan sensor */ if (sysfs_read_attribute_value(s->div->path,tmp,SCRATCHSIZE)) { err("error attempting to read value of %s",s->name); return SA_ERR_HPI_INVALID_DATA; } thres->UpCritical.Interpreted.Value.SensorUint32 = (SaHpiUint32T) thres->UpCritical.Raw/atoi(tmp); } thres->LowMajor.ValuesPresent = 0; thres->LowMinor.ValuesPresent = 0; thres->UpMajor.ValuesPresent = 0; thres->UpMinor.ValuesPresent = 0; thres->PosThdHysteresis.ValuesPresent = 0; thres->NegThdHysteresis.ValuesPresent = 0; #endif return 0; } /** * sysfs2hpi_set_reading: * @rdr - current RDR * @attr - sysfs attribute to be set * @div - sysfs attribute for div, if needed * @reading - sensor reading to set * * Helper function to sysfs2hpi_set_sensor_thresholds. * Set an individual reading of a sensor. * * Return value: 0 for success | Error code **/ static int sysfs2hpi_set_sensor_reading(SaHpiRdrT *rdr, struct sysfs_attribute *attr, SaHpiSensorReadingT reading) { char tmp[SCRATCHSIZE]; if (reading.Type == SAHPI_SENSOR_READING_TYPE_INT64) { snprintf(tmp, SCRATCHSIZE, "%lld", reading.Value.SensorInt64); if (sysfs_write_attribute(attr,tmp,SCRATCHSIZE)) { err("error attempting to write value"); return SA_ERR_HPI_INVALID_DATA; } return 0; } err("No values were set"); return SA_ERR_HPI_INVALID_REQUEST; } /** * sysfs2hpi_set_sensor_thresholds: * @hnd: void pointer to handler * @id: ResourceId for resource with data * @num: Sensor number for sensor with data * @thres: pointer to SaHpiSensorThresholdsT data type * * Functions to set a given sensor's thresholds values * * Return value: 0 for success | Error code **/ static int sysfs2hpi_set_sensor_thresholds(void *hnd, SaHpiResourceIdT id, SaHpiSensorNumT num, const SaHpiSensorThresholdsT *thres) { struct sensor *s; struct oh_handler_state *inst = (struct oh_handler_state *)hnd; SaHpiRdrT *tmprdr; int ret = 0; if (!hnd) { err("null handle"); return SA_ERR_HPI_INVALID_PARAMS; } /* sequential search of rdr list for current RDR */ tmprdr = oh_get_rdr_next(inst->rptcache, id, 0); while ((tmprdr->RdrTypeUnion.SensorRec.Num != num) && (tmprdr)) { tmprdr = oh_get_rdr_next(inst->rptcache, id, tmprdr->RecordId); } if (tmprdr->RdrTypeUnion.SensorRec.Num != num) { /* didn't find sensor */ err("could not find sensor"); return SA_ERR_HPI_INVALID_DATA; } /* get sensor data */ s = (struct sensor *) oh_get_rdr_data(inst->rptcache, id, tmprdr->RecordId); if (!s) { err("could not get sensor data for thresholds"); return SA_ERR_HPI_INVALID_DATA; } /* * sysfs only defines a min and a max, which have been mapped * to LowCritical and UpCritical, respectively, so all other input * will be ignored */ if ((SAHPI_TRUE != thres->LowCritical.IsSupported) && (SAHPI_TRUE != thres->UpCritical.IsSupported)) { /* if no LowCritical or UpCritical values are sent, return error */ err("No LowCritical or UpCritical values were sent"); return SA_ERR_HPI_INVALID_PARAMS; } /* set min value */ if (SAHPI_TRUE == thres->LowCritical.IsSupported) { ret = sysfs2hpi_set_sensor_reading(tmprdr, s->min, thres->LowCritical); } /* set max values */ if (SAHPI_TRUE == thres->UpCritical.IsSupported) { ret = sysfs2hpi_set_sensor_reading(tmprdr, s->max, thres->UpCritical); } return ret; } /** * sysfs2hpi_get_sensor_event_enables: * @hnd: void pointer to handler * @id: ResourceId for resource with data * @num: Sensor number for sensor with data * @enables: pointer to SaHpiSensorEvtEnablesT data type * * Get the enables field from the RDR passed to this function. * * Return value: 0 for success | Error code **/ static int sysfs2hpi_get_sensor_event_enables(void *hnd, SaHpiResourceIdT id, SaHpiSensorNumT num, SaHpiBoolT *enable) { struct sensor *s; struct oh_handler_state *inst = (struct oh_handler_state *)hnd; SaHpiRdrT *tmprdr; if (!hnd) { err("null handle"); return SA_ERR_HPI_INVALID_PARAMS; } /* sequential search of rdr list for current RDR */ tmprdr = oh_get_rdr_next(inst->rptcache, id, 0); while ((tmprdr->RdrTypeUnion.SensorRec.Num != num) && (tmprdr)) { tmprdr = oh_get_rdr_next(inst->rptcache, id, tmprdr->RecordId); } if (tmprdr->RdrTypeUnion.SensorRec.Num != num) { /* didn't find sensor */ err("could not find sensor"); return SA_ERR_HPI_INVALID_DATA; } /* get sensor data */ s = (struct sensor *) oh_get_rdr_data(inst->rptcache, id, tmprdr->RecordId); if (!s) { err("could not get sensor data for event enables"); return SA_ERR_HPI_INVALID_DATA; } *enable = s->evt_enable; return 0; } /** * sysfs2hpi_set_sensor_event_enables: * @hnd: void pointer to handler * @id: ResourceId for resource with data * @num: Sensor number for sensor with data * @enables: pointer to SaHpiSensorEvtEnablesT data type * * Set the enables field on the RDR passed to this function. * * Return value: 0 for success | Error code **/ static int sysfs2hpi_set_sensor_event_enables(void *hnd, SaHpiResourceIdT id, SaHpiSensorNumT num, SaHpiBoolT enable) { struct sensor *s; struct oh_handler_state *inst = (struct oh_handler_state *)hnd; SaHpiRdrT *tmprdr; if (!hnd) { err("null handle"); return SA_ERR_HPI_INVALID_PARAMS; } /* sequential search of rdr list for current RDR */ tmprdr = oh_get_rdr_next(inst->rptcache, id, 0); while ((tmprdr->RdrTypeUnion.SensorRec.Num != num) && (tmprdr)) { tmprdr = oh_get_rdr_next(inst->rptcache, id, tmprdr->RecordId); } if (tmprdr->RdrTypeUnion.SensorRec.Num != num) { /* didn't find sensor */ err("could not find sensor"); return SA_ERR_HPI_INVALID_DATA; } /* get sensor data */ s = (struct sensor *) oh_get_rdr_data(inst->rptcache, id, tmprdr->RecordId); if (!s) { err("could not get sensor data for event enables"); return SA_ERR_HPI_INVALID_DATA; } s->evt_enable = enable; return 0; } void * oh_open (GHashTable *, unsigned int, oh_evt_queue *) __attribute__ ((weak, alias("sysfs2hpi_open"))); void * oh_close (void *) __attribute__ ((weak, alias("sysfs2hpi_close"))); void * oh_get_event (void *) __attribute__ ((weak, alias("sysfs2hpi_get_event"))); void * oh_discover_resources (void *) __attribute__ ((weak, alias("sysfs2hpi_discover_resources"))); void * oh_get_sensor_reading (void *, SaHpiResourceIdT, SaHpiSensorNumT, SaHpiSensorReadingT *, SaHpiEventStateT *) __attribute__ ((weak, alias("sysfs2hpi_get_sensor_reading"))); void * oh_get_sensor_thresholds (void *, SaHpiResourceIdT, SaHpiSensorNumT, SaHpiSensorThresholdsT *) __attribute__ ((weak, alias("sysfs2hpi_get_sensor_thresholds"))); void * oh_set_sensor_thresholds (void *, SaHpiResourceIdT, SaHpiSensorNumT, const SaHpiSensorThresholdsT *) __attribute__ ((weak, alias("sysfs2hpi_set_sensor_thresholds"))); void * oh_get_sensor_event_enables (void *, SaHpiResourceIdT, SaHpiSensorNumT, SaHpiBoolT *) __attribute__ ((weak, alias("sysfs2hpi_get_sensor_event_enables"))); void * oh_set_sensor_event_enables (void *, SaHpiResourceIdT id, SaHpiSensorNumT, SaHpiBoolT *) __attribute__ ((weak, alias("sysfs2hpi_set_sensor_event_enables"))); openhpi-2.14.1/plugins/sysfs/README0000644000076400007640000000152311302566770013711 0ustar ################################################################################ In order to use this plugin, you must have a machine with libsysfs version 0.3.0* installed (found in sysutils 0.3.0). Follow the instructions to install. To install this code: make make install (as root) Can be verified using program examples/list_resources and examples/set_resources ----------------------- Developer note: - If you'd like to test for an imaginary system with more entities, you can point to an imaginary sysfs file system: * create a mounts file (like /proc/mounts) that has only one entry pointing to your imaginary sysfs file system * change include/libsysfs.h to point to your mounts file (SYSFS_PROC_MNTS) * in lib/ run "make" and "make install" * libsysfs should now be looking at your imaginary file system for sysfs entries openhpi-2.14.1/src/0000755000076400007640000000000011405006365010760 5ustar openhpi-2.14.1/src/Makefile.am0000644000076400007640000000524511302567034013023 0ustar # # Copyright (c) 2003, Intel Corporation # (C) Copyright IBM Corp 2003-2006 # All rights reserved. # # 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. # # Neither the name of Intel Corporation nor the names # of its contributors may be used to endorse or promote products # derived from this software without specific prior written permission. # # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS # "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT # LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS # FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT # OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, # SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED # TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, # OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY # OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING # NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS # SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. # MAINTAINERCLEANFILES = Makefile.in DISTCLEANFILES = plugin_static.c MOSTLYCLEANFILES = @TEST_CLEAN@ EXTRA_DIST = plugin_static.c.in INCLUDES = @OPENHPI_INCLUDES@ @OH_SSL_INCLUDES@ SUBDIRS = t noinst_LTLIBRARIES = libopenhpi.la libopenhpi_la_SOURCES = \ config.c \ domain.c \ event.c \ threaded.c \ alarm.c \ hotswap.c \ lock.c \ plugin.c \ init.c \ safhpi.c \ session.c \ ohpi.c nodist_libopenhpi_la_SOURCES = plugin_static.c libopenhpi_la_LIBADD = @STATIC_PLUGIN_LIBS@ @STATIC_PLUGIN_EXTRA_LIBS@ $(top_builddir)/utils/libopenhpiutils.la if HAVE_OPENSSL libopenhpi_la_LIBADD += $(top_builddir)/$(SSLDIR)/libopenhpi_ssl.la endif libopenhpi_la_LDFLAGS = -L$(top_builddir)/utils -version-info @HPI_LIB_VERSION@ -export-dynamic -static libopenhpi_la_DEPENDENCIES = @STATIC_PLUGIN_LIBS@ openhpi-2.14.1/src/safhpi.c0000644000076400007640000070624111302567034012411 0ustar /* -*- linux-c -*- * * Copyright (c) 2003 by Intel Corp. * (C) Copyright IBM Corp. 2003-2007 * Copyright (c) 2004 by FORCE Computers. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Louis Zhuang * Sean Dague * Rusty Lynch * David Judkovics * Thomas Kanngieser * Renier Morales * Racing Guo * Anton Pak */ #include #include #include #include #include /********************************************************************* * * Begin SAHPI B.03.01 Functions. For full documentation please see * the specification * ********************************************************************/ SaHpiVersionT SAHPI_API saHpiVersionGet () { return SAHPI_INTERFACE_VERSION; } SaErrorT SAHPI_API saHpiSessionOpen( SAHPI_IN SaHpiDomainIdT DomainId, SAHPI_OUT SaHpiSessionIdT *SessionId, SAHPI_IN void *SecurityParams) { SaHpiSessionIdT sid; SaHpiDomainIdT did = DomainId; dbg("saHpiSessionOpen DomainId [%d]", DomainId); if (SessionId == NULL) { err("Invalid Session Id pointer"); return SA_ERR_HPI_INVALID_PARAMS; } /* Security Params required to be NULL by the spec at this point */ if (SecurityParams != NULL) { err("SecurityParams must be NULL"); return SA_ERR_HPI_INVALID_PARAMS; } /* Initialize Library - This will only run once */ if (oh_init()) return SA_ERR_HPI_INTERNAL_ERROR; sid = oh_create_session(did); if(!sid) { err("Domain %d does not exist or unable to create session!", did); return SA_ERR_HPI_INVALID_DOMAIN; } dbg("Created session %d for domain %d", sid, did); *SessionId = sid; return SA_OK; } SaErrorT SAHPI_API saHpiSessionClose( SAHPI_IN SaHpiSessionIdT SessionId) { OH_CHECK_INIT_STATE(SessionId); return oh_destroy_session(SessionId); } SaErrorT SAHPI_API saHpiDiscover( SAHPI_IN SaHpiSessionIdT SessionId) { OH_CHECK_INIT_STATE(SessionId); /* This will wake the discovery thread up * and wait until it does a round throughout the * plugin instances. If the thread is already running, * it will wait for it until it completes the round. */ oh_wake_discovery_thread(SAHPI_TRUE); oh_wake_event_thread(SAHPI_TRUE); return SA_OK; } /********************************************************************* * * Domain Functions * ********************************************************************/ SaErrorT SAHPI_API saHpiDomainInfoGet ( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_OUT SaHpiDomainInfoT *DomainInfo) { SaHpiDomainIdT did; struct oh_domain *d = NULL; struct oh_global_param param = { .type = OPENHPI_DAT_USER_LIMIT }; if (!DomainInfo) return SA_ERR_HPI_INVALID_PARAMS; OH_CHECK_INIT_STATE(SessionId); OH_GET_DID(SessionId, did); OH_GET_DOMAIN(did, d); /* Lock domain */ /* General */ DomainInfo->DomainId = d->id; DomainInfo->DomainCapabilities = d->capabilities; DomainInfo->IsPeer = 0; /* DRT */ DomainInfo->DrtUpdateCount = d->drt.update_count; DomainInfo->DrtUpdateTimestamp = d->drt.update_timestamp; /* RPT */ DomainInfo->RptUpdateCount = d->rpt.update_count; DomainInfo->RptUpdateTimestamp = d->rpt.update_timestamp; /* DAT */ DomainInfo->DatUpdateCount = d->dat.update_count; DomainInfo->DatUpdateTimestamp = d->dat.update_timestamp; DomainInfo->ActiveAlarms = oh_count_alarms(d, SAHPI_ALL_SEVERITIES); DomainInfo->CriticalAlarms = oh_count_alarms(d, SAHPI_CRITICAL); DomainInfo->MajorAlarms = oh_count_alarms(d, SAHPI_MAJOR); DomainInfo->MinorAlarms = oh_count_alarms(d, SAHPI_MINOR); if (oh_get_global_param(¶m)) param.u.dat_user_limit = OH_MAX_DAT_USER_LIMIT; DomainInfo->DatUserAlarmLimit = param.u.dat_user_limit; DomainInfo->DatOverflow = d->dat.overflow; memcpy(DomainInfo->Guid, d->guid, sizeof(SaHpiGuidT)); DomainInfo->DomainTag = d->tag; oh_release_domain(d); /* Unlock domain */ return SA_OK; } SaErrorT SAHPI_API saHpiDrtEntryGet ( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiEntryIdT EntryId, SAHPI_OUT SaHpiEntryIdT *NextEntryId, SAHPI_OUT SaHpiDrtEntryT *DrtEntry) { SaHpiDomainIdT did; OH_CHECK_INIT_STATE(SessionId); OH_GET_DID(SessionId, did); if((DrtEntry == NULL) || (NextEntryId == NULL) || (EntryId == SAHPI_LAST_ENTRY)) { return SA_ERR_HPI_INVALID_PARAMS; } return oh_drt_entry_get(did, EntryId, NextEntryId, DrtEntry); } SaErrorT SAHPI_API saHpiDomainTagSet ( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiTextBufferT *DomainTag) { SaHpiDomainIdT did; struct oh_domain *d = NULL; if (!DomainTag || !oh_valid_textbuffer(DomainTag)) return SA_ERR_HPI_INVALID_PARAMS; OH_CHECK_INIT_STATE(SessionId); OH_GET_DID(SessionId, did); OH_GET_DOMAIN(did, d); /* Lock domain */ d->tag = *DomainTag; oh_release_domain(d); /* Unlock domain */ return SA_OK; } /********************************************************************* * * Resource Functions * ********************************************************************/ SaErrorT SAHPI_API saHpiRptEntryGet( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiEntryIdT EntryId, SAHPI_OUT SaHpiEntryIdT *NextEntryId, SAHPI_OUT SaHpiRptEntryT *RptEntry) { SaHpiDomainIdT did; struct oh_domain *d = NULL; SaHpiRptEntryT *req_entry; SaHpiRptEntryT *next_entry; OH_CHECK_INIT_STATE(SessionId); OH_GET_DID(SessionId, did); /* Test pointer parameters for invalid pointers */ if ((NextEntryId == NULL) || (RptEntry == NULL)) { return SA_ERR_HPI_INVALID_PARAMS; } /* I believe this is the only current reserved value here, though others may come in the future. */ if (EntryId == SAHPI_LAST_ENTRY) { return SA_ERR_HPI_INVALID_PARAMS; } OH_GET_DOMAIN(did, d); /* Lock domain */ if (EntryId == SAHPI_FIRST_ENTRY) { req_entry = oh_get_resource_next(&(d->rpt), SAHPI_FIRST_ENTRY); } else { req_entry = oh_get_resource_by_id(&(d->rpt), EntryId); } /* if the entry was NULL, clearly have an issue */ if (req_entry == NULL) { err("Invalid EntryId %d in Domain %d", EntryId, did); oh_release_domain(d); /* Unlock domain */ return SA_ERR_HPI_NOT_PRESENT; } memcpy(RptEntry, req_entry, sizeof(*RptEntry)); next_entry = oh_get_resource_next(&(d->rpt), req_entry->EntryId); if(next_entry != NULL) { *NextEntryId = next_entry->EntryId; } else { *NextEntryId = SAHPI_LAST_ENTRY; } oh_release_domain(d); /* Unlock domain */ return SA_OK; } SaErrorT SAHPI_API saHpiRptEntryGetByResourceId( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId, SAHPI_OUT SaHpiRptEntryT *RptEntry) { SaHpiDomainIdT did; struct oh_domain *d = NULL; SaHpiRptEntryT *req_entry; OH_CHECK_INIT_STATE(SessionId); OH_GET_DID(SessionId, did); /* Test pointer parameters for invalid pointers */ if (ResourceId == SAHPI_UNSPECIFIED_RESOURCE_ID || RptEntry == NULL) { return SA_ERR_HPI_INVALID_PARAMS; } OH_GET_DOMAIN(did, d); /* Lock domain */ req_entry = oh_get_resource_by_id(&(d->rpt), ResourceId); /* * is this case really supposed to be an error? I thought * there was a valid return for "not found in domain" */ if (req_entry == NULL) { err("No such Resource Id %d in Domain %d", ResourceId, did); oh_release_domain(d); /* Unlock domain */ return SA_ERR_HPI_INVALID_RESOURCE; } memcpy(RptEntry, req_entry, sizeof(*RptEntry)); oh_release_domain(d); /* Unlock domain */ return SA_OK; } SaErrorT SAHPI_API saHpiResourceSeveritySet( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId, SAHPI_IN SaHpiSeverityT Severity) { /* this requires a new abi call to push down to the plugin */ int (*set_res_sev)(void *hnd, SaHpiResourceIdT id, SaHpiSeverityT sev); SaHpiDomainIdT did; struct oh_handler *h = NULL; struct oh_domain *d = NULL; SaErrorT error = SA_OK; SaHpiRptEntryT *rptentry; OH_CHECK_INIT_STATE(SessionId); if (ResourceId == SAHPI_UNSPECIFIED_RESOURCE_ID) { err("Invalid resource id, SAHPI_UNSPECIFIED_RESOURCE_ID passed."); return SA_ERR_HPI_INVALID_PARAMS; } else if (!oh_lookup_severity(Severity) || Severity == SAHPI_ALL_SEVERITIES) { err("Invalid severity %d passed.", Severity); return SA_ERR_HPI_INVALID_PARAMS; } OH_GET_DID(SessionId, did); OH_GET_DOMAIN(did, d); /* Lock domain */ OH_HANDLER_GET(d, ResourceId, h); oh_release_domain(d); /* Unlock domain */ set_res_sev = h ? h->abi->set_resource_severity : NULL; if (!set_res_sev) { oh_release_handler(h); return SA_ERR_HPI_INVALID_CMD; } if ((error = set_res_sev(h->hnd, ResourceId, Severity)) != SA_OK) { oh_release_handler(h); err("Setting severity failed for ResourceId %d in Domain %d", ResourceId, did); return error; } oh_release_handler(h); /* Alarm Handling */ if (error == SA_OK) { oh_detect_res_sev_alarm(did, ResourceId, Severity); } /* to get rpt entry into infrastructure */ OH_GET_DOMAIN(did, d); /* Lock domain */ rptentry = oh_get_resource_by_id(&(d->rpt), ResourceId); if (!rptentry) { oh_release_domain(d); /* Unlock domain */ err("Severity set failed: No Resource %d in Domain %d", ResourceId, did); return SA_ERR_HPI_NOT_PRESENT; } rptentry->ResourceSeverity = Severity; oh_release_domain(d); /* Unlock domain */ return error; } SaErrorT SAHPI_API saHpiResourceTagSet( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId, SAHPI_IN SaHpiTextBufferT *ResourceTag) { SaErrorT rv; SaErrorT (*set_res_tag)(void *hnd, SaHpiResourceIdT id, SaHpiTextBufferT *ResourceTag); SaHpiDomainIdT did; struct oh_handler *h = NULL; struct oh_domain *d = NULL; SaHpiRptEntryT *rptentry; OH_CHECK_INIT_STATE(SessionId); if (ResourceTag == NULL || !oh_valid_textbuffer(ResourceTag)) return SA_ERR_HPI_INVALID_PARAMS; OH_GET_DID(SessionId, did); OH_GET_DOMAIN(did, d); /* Lock domain */ OH_HANDLER_GET(d, ResourceId, h); oh_release_domain(d); /* Unlock domain */ set_res_tag = h ? h->abi->set_resource_tag : NULL; if (!set_res_tag) { oh_release_handler(h); return SA_ERR_HPI_INVALID_CMD; } rv = set_res_tag(h->hnd, ResourceId, ResourceTag); if (rv != SA_OK) { err("Tag set failed for Resource %d in Domain %d", ResourceId, did); oh_release_handler(h); return rv; } oh_release_handler(h); OH_GET_DOMAIN(did, d); /* Lock domain */ rptentry = oh_get_resource_by_id(&(d->rpt), ResourceId); if (!rptentry) { err("Tag set failed: No Resource %d in Domain %d", ResourceId, did); oh_release_domain(d); /* Unlock domain */ return SA_ERR_HPI_NOT_PRESENT; } rptentry->ResourceTag = *ResourceTag; oh_release_domain(d); /* Unlock domain */ return SA_OK; } SaErrorT SAHPI_API saHpiMyEntityPathGet( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_OUT SaHpiEntityPathT *EntityPath) { SaHpiDomainIdT did; struct oh_global_param ep_param = { .type = OPENHPI_ON_EP }; if (EntityPath == NULL) return SA_ERR_HPI_INVALID_PARAMS; OH_CHECK_INIT_STATE(SessionId); OH_GET_DID(SessionId, did); oh_get_global_param(&ep_param); // This is true if OPENHPI_ON_EP is not set in openhpi.conf if ( ( ep_param.u.on_ep.Entry[0].EntityType == SAHPI_ENT_ROOT ) && ( ep_param.u.on_ep.Entry[0].EntityLocation == 0 ) ) { err("Could not get entity we are running in." "It is probably not set in openhpi.conf (OPENHPI_ON_EP)."); return SA_ERR_HPI_UNKNOWN; } *EntityPath = ep_param.u.on_ep; return SA_OK; } SaErrorT SAHPI_API saHpiResourceIdGet( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_OUT SaHpiResourceIdT *ResourceId) { SaHpiDomainIdT did; struct oh_domain *d = NULL; SaHpiRptEntryT *rptentry; struct oh_global_param ep_param = { .type = OPENHPI_ON_EP }; if (ResourceId == NULL) return SA_ERR_HPI_INVALID_PARAMS; OH_CHECK_INIT_STATE(SessionId); OH_GET_DID(SessionId, did); oh_get_global_param(&ep_param); OH_GET_DOMAIN(did, d); /* Lock domain */ rptentry = oh_get_resource_by_ep(&(d->rpt), &ep_param.u.on_ep); if (!rptentry) { oh_release_domain(d); /* Unlock domain */ err("Could not get resource id we are running in." "It is probably not set in openhpi.conf (OPENHPI_ON_EP)."); return SA_ERR_HPI_UNKNOWN; } *ResourceId = rptentry->ResourceId; oh_release_domain(d); /* Unlock domain */ return SA_OK; } SaErrorT SAHPI_API saHpiGetIdByEntityPath ( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiEntityPathT EntityPath, SAHPI_IN SaHpiRdrTypeT InstrumentType, SAHPI_INOUT SaHpiUint32T *InstanceId, SAHPI_OUT SaHpiResourceIdT *ResourceId, SAHPI_OUT SaHpiInstrumentIdT *InstrumentId, SAHPI_OUT SaHpiUint32T *RptUpdateCount) { struct oh_domain *d = NULL; SaHpiDomainIdT did; SaHpiResourceIdT rid = 0; SaHpiRdrT *rdr = NULL; if (InstanceId == NULL || ResourceId == NULL || *InstanceId == SAHPI_LAST_ENTRY || (InstrumentId == NULL && InstrumentType != SAHPI_NO_RECORD) || RptUpdateCount == NULL) { return SA_ERR_HPI_INVALID_PARAMS; } OH_CHECK_INIT_STATE(SessionId); OH_GET_DID(SessionId, did); rid = oh_uid_lookup(&EntityPath); if (rid == 0) { return SA_ERR_HPI_NOT_PRESENT; } OH_GET_DOMAIN(did, d); /* Lock domain */ *ResourceId = rid; *RptUpdateCount = d->rpt.update_count; if (InstrumentType == SAHPI_NO_RECORD) { *InstanceId = SAHPI_LAST_ENTRY; oh_release_domain(d); return SA_OK; } /* Get Rdr indicated by InstanceId (Num) and Type */ if (*InstanceId == SAHPI_FIRST_ENTRY) { rdr = oh_get_rdr_by_type_first(&d->rpt, rid, InstrumentType); } else { rdr = oh_get_rdr_by_type(&d->rpt, rid, InstrumentType, oh_get_rdr_num(*InstanceId)); } if (rdr == NULL) { oh_release_domain(d); return SA_ERR_HPI_NOT_PRESENT; } *InstrumentId = oh_get_rdr_num(rdr->RecordId); rdr = oh_get_rdr_by_type_next(&d->rpt, rid, InstrumentType, oh_get_rdr_num(rdr->RecordId)); if (rdr == NULL) { *InstanceId = SAHPI_LAST_ENTRY; } else { *InstanceId = oh_get_rdr_uid(rdr->RdrType, oh_get_rdr_num(rdr->RecordId) ); } oh_release_domain(d); return SA_OK; } SaErrorT SAHPI_API saHpiGetChildEntityPath ( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiEntityPathT ParentEntityPath, SAHPI_INOUT SaHpiUint32T *InstanceId, SAHPI_OUT SaHpiEntityPathT *ChildEntityPath, SAHPI_OUT SaHpiUint32T *RptUpdateCount) { struct oh_domain *d = NULL; SaHpiDomainIdT did; oh_entitypath_pattern epp; SaHpiRptEntryT *rpte = NULL; SaHpiBoolT found_match = SAHPI_FALSE; SaErrorT error; int i, j; if (InstanceId == NULL || *InstanceId == SAHPI_LAST_ENTRY || RptUpdateCount == NULL) { return SA_ERR_HPI_INVALID_PARAMS; } OH_CHECK_INIT_STATE(SessionId); OH_GET_DID(SessionId, did); OH_GET_DOMAIN(did, d); /* Lock domain */ /* Check to see the parent entity path exists */ rpte = oh_get_resource_by_ep(&d->rpt, &ParentEntityPath); if (rpte == NULL) { oh_release_domain(d); return SA_ERR_HPI_INVALID_DATA; } rpte = NULL; /* Create an entity path pattern from the parent entity path * that looks like the following: {.,.} * This will match direct childs of ParentEntityPath. **/ memset(&epp, 0, sizeof(oh_entitypath_pattern)); epp.epattern[0].etp.is_dot = 1; epp.epattern[0].elp.is_dot = 1; for(i = 0, j = 1; i < SAHPI_MAX_ENTITY_PATH; i++) { epp.epattern[j].etp.type = ParentEntityPath.Entry[i].EntityType; epp.epattern[j].elp.location = ParentEntityPath.Entry[i].EntityLocation; j++; } /* Find a matching child */ for (rpte = oh_get_resource_by_id(&d->rpt, *InstanceId); rpte; rpte = oh_get_resource_next(&d->rpt, rpte->ResourceId)) { if (oh_match_entitypath_pattern(&epp, &rpte->ResourceEntity)) { found_match = SAHPI_TRUE; break; } if (*InstanceId != SAHPI_FIRST_ENTRY) break; } if (found_match) { /* Found matching InstanceId */ /* Now look next matching InstanceId */ SaHpiRptEntryT *nrpte = NULL; found_match = SAHPI_FALSE; for (nrpte = oh_get_resource_next(&d->rpt, rpte->ResourceId); nrpte; nrpte = oh_get_resource_next(&d->rpt, nrpte->ResourceId)) { if (oh_match_entitypath_pattern(&epp, &nrpte->ResourceEntity)) { found_match = SAHPI_TRUE; break; } } *InstanceId = SAHPI_LAST_ENTRY; if (found_match) { *InstanceId = nrpte->ResourceId; } *ChildEntityPath = rpte->ResourceEntity; *RptUpdateCount = d->rpt.update_count; error = SA_OK; } else { error = SA_ERR_HPI_NOT_PRESENT; } oh_release_domain(d); return error; } SaErrorT SAHPI_API saHpiResourceFailedRemove ( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId) { SaErrorT error; struct oh_domain *d = NULL; struct oh_handler *h = NULL; unsigned int hid; SaHpiDomainIdT did; SaHpiRptEntryT *rpte = NULL; SaHpiRptEntryT saved_res; struct oh_event *e = NULL; SaHpiHsStateT hsstate; SaErrorT (*get_hotswap_state)(void *hnd, SaHpiResourceIdT rid, SaHpiHsStateT *state); SaErrorT (*resource_failed_remove)(void *hnd, SaHpiResourceIdT rid); OH_CHECK_INIT_STATE(SessionId); OH_GET_DID(SessionId, did); OH_GET_DOMAIN(did, d); /* Lock domain */ rpte = oh_get_resource_by_id(&d->rpt, ResourceId); if (rpte == NULL) { oh_release_domain(d); return SA_ERR_HPI_NOT_PRESENT; } if (!rpte->ResourceFailed) { oh_release_domain(d); return SA_ERR_HPI_INVALID_REQUEST; } if (!(rpte->ResourceCapabilities & SAHPI_CAPABILITY_FRU)) { oh_release_domain(d); return SA_ERR_HPI_INVALID_CMD; } saved_res = *rpte; OH_HANDLER_GET(d, ResourceId, h); oh_release_domain(d); hid = h->id; resource_failed_remove = h ? h->abi->resource_failed_remove : NULL; if (resource_failed_remove) { error = resource_failed_remove(h->hnd, ResourceId); oh_release_handler(h); return error; } /* If the resource_failed_remove ABI is not defined, then remove the * resource from rptcache */ if (rpte->ResourceCapabilities & SAHPI_CAPABILITY_MANAGED_HOTSWAP) { get_hotswap_state = h ? h->abi->get_hotswap_state : NULL; if (!get_hotswap_state) { oh_release_handler(h); return SA_ERR_HPI_INTERNAL_ERROR; } error = get_hotswap_state(h->hnd, ResourceId, &hsstate); oh_release_handler(h); if (error) return error; } else hsstate = SAHPI_HS_STATE_ACTIVE; e = g_malloc0(sizeof(struct oh_event)); e->hid = hid; e->resource = saved_res; e->event.Source = ResourceId; e->event.Severity = saved_res.ResourceSeverity; oh_gettimeofday(&e->event.Timestamp); e->event.EventType = SAHPI_ET_HOTSWAP; e->event.EventDataUnion.HotSwapEvent.PreviousHotSwapState = hsstate; e->event.EventDataUnion.HotSwapEvent.HotSwapState = SAHPI_HS_STATE_NOT_PRESENT; e->event.EventDataUnion.HotSwapEvent.CauseOfStateChange = SAHPI_HS_CAUSE_USER_UPDATE; oh_evt_queue_push(&oh_process_q, e); return SA_OK; } /********************************************************************* * * Event Log Functions * ********************************************************************/ SaErrorT SAHPI_API saHpiEventLogInfoGet ( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId, SAHPI_OUT SaHpiEventLogInfoT *Info) { SaErrorT rv; SaErrorT (*get_func) (void *, SaHpiResourceIdT, SaHpiEventLogInfoT *); SaHpiRptEntryT *res; struct oh_handler *h = NULL; struct oh_domain *d = NULL; SaHpiDomainIdT did; /* Test pointer parameters for invalid pointers */ if (Info == NULL) { return SA_ERR_HPI_INVALID_PARAMS; } OH_CHECK_INIT_STATE(SessionId); OH_GET_DID(SessionId, did); OH_GET_DOMAIN(did, d); /* Lock domain */ /* test for special domain case */ if (ResourceId == SAHPI_UNSPECIFIED_RESOURCE_ID) { rv = oh_el_info(d->del, Info); oh_release_domain(d); /* Unlock domain */ return rv; } OH_RESOURCE_GET_CHECK(d, ResourceId, res); if(!(res->ResourceCapabilities & SAHPI_CAPABILITY_EVENT_LOG)) { err("Resource %d in Domain %d does not have EL",ResourceId,did); oh_release_domain(d); /* Unlock domain */ return SA_ERR_HPI_CAPABILITY; } OH_HANDLER_GET(d, ResourceId, h); oh_release_domain(d); /* Unlock domain */ get_func = h ? h->abi->get_el_info : NULL; if (!get_func) { oh_release_handler(h); return SA_ERR_HPI_INVALID_CMD; } rv = get_func(h->hnd, ResourceId, Info); oh_release_handler(h); if (rv != SA_OK) { err("EL info get failed"); } return rv; } SaErrorT SAHPI_API saHpiEventLogCapabilitiesGet ( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId, SAHPI_OUT SaHpiEventLogCapabilitiesT *EventLogCapabilities) { SaErrorT error; SaErrorT (*get_el_caps) (void *, SaHpiResourceIdT, SaHpiEventLogCapabilitiesT *); SaHpiRptEntryT *rpte = NULL; struct oh_handler *h = NULL; struct oh_domain *d = NULL; SaHpiDomainIdT did; if (EventLogCapabilities == NULL) return SA_ERR_HPI_INVALID_PARAMS; OH_CHECK_INIT_STATE(SessionId); OH_GET_DID(SessionId, did); if (ResourceId == SAHPI_UNSPECIFIED_RESOURCE_ID) { *EventLogCapabilities = SAHPI_EVTLOG_CAPABILITY_ENTRY_ADD | SAHPI_EVTLOG_CAPABILITY_CLEAR | SAHPI_EVTLOG_CAPABILITY_TIME_SET | SAHPI_EVTLOG_CAPABILITY_STATE_SET | SAHPI_EVTLOG_CAPABILITY_OVERFLOW_RESET; return SA_OK; } OH_GET_DOMAIN(did, d); /* Lock domain */ OH_RESOURCE_GET_CHECK(d, ResourceId, rpte); if(!(rpte->ResourceCapabilities & SAHPI_CAPABILITY_EVENT_LOG)) { oh_release_domain(d); /* Unlock domain */ return SA_ERR_HPI_CAPABILITY; } OH_HANDLER_GET(d, ResourceId, h); oh_release_domain(d); /* Unlock domain */ get_el_caps = h ? h->abi->get_el_caps : NULL; if (!get_el_caps) { oh_release_handler(h); return SA_ERR_HPI_INTERNAL_ERROR; } error = get_el_caps(h->hnd, ResourceId, EventLogCapabilities); oh_release_handler(h); return error; } SaErrorT SAHPI_API saHpiEventLogEntryGet ( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId, SAHPI_IN SaHpiEventLogEntryIdT EntryId, SAHPI_OUT SaHpiEventLogEntryIdT *PrevEntryId, SAHPI_OUT SaHpiEventLogEntryIdT *NextEntryId, SAHPI_OUT SaHpiEventLogEntryT *EventLogEntry, SAHPI_INOUT SaHpiRdrT *Rdr, SAHPI_INOUT SaHpiRptEntryT *RptEntry) { SaErrorT rv; SaErrorT (*get_el_entry)(void *hnd, SaHpiResourceIdT id, SaHpiEventLogEntryIdT current, SaHpiEventLogEntryIdT *prev, SaHpiEventLogEntryIdT *next, SaHpiEventLogEntryT *entry, SaHpiRdrT *rdr, SaHpiRptEntryT *rptentry); SaHpiRptEntryT *res; struct oh_handler *h; struct oh_domain *d; oh_el_entry *elentry; SaErrorT retc; SaHpiDomainIdT did; /* Test pointer parameters for invalid pointers */ if (!PrevEntryId || !EventLogEntry || !NextEntryId || EntryId == SAHPI_NO_MORE_ENTRIES) { return SA_ERR_HPI_INVALID_PARAMS; } OH_CHECK_INIT_STATE(SessionId); OH_GET_DID(SessionId, did); OH_GET_DOMAIN(did, d); /* Lock domain */ /* test for special domain case */ if (ResourceId == SAHPI_UNSPECIFIED_RESOURCE_ID) { retc = oh_el_get(d->del, EntryId, PrevEntryId, NextEntryId, &elentry); if (retc == SA_OK) { memcpy(EventLogEntry, &elentry->event, sizeof(SaHpiEventLogEntryT)); if (Rdr) memcpy(Rdr, &elentry->rdr, sizeof(SaHpiRdrT)); if (RptEntry) memcpy(RptEntry, &elentry->res, sizeof(SaHpiRptEntryT)); } oh_release_domain(d); /* Unlock domain */ return retc; } OH_RESOURCE_GET_CHECK(d, ResourceId, res); if(!(res->ResourceCapabilities & SAHPI_CAPABILITY_EVENT_LOG)) { err("Resource %d in Domain %d does not have EL",ResourceId,did); oh_release_domain(d); /* Unlock domain */ return SA_ERR_HPI_CAPABILITY; } OH_HANDLER_GET(d, ResourceId, h); oh_release_domain(d); /* Unlock domain */ get_el_entry = h ? h->abi->get_el_entry : NULL; if (!get_el_entry) { err("This api is not supported"); oh_release_handler(h); return SA_ERR_HPI_INVALID_CMD; } rv = get_el_entry(h->hnd, ResourceId, EntryId, PrevEntryId, NextEntryId, EventLogEntry, Rdr, RptEntry); oh_release_handler(h); if(rv != SA_OK) err("EL entry get failed"); return rv; } SaErrorT SAHPI_API saHpiEventLogEntryAdd ( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId, SAHPI_IN SaHpiEventT *EvtEntry) { SaErrorT rv; SaHpiEventLogInfoT info; SaErrorT (*add_el_entry)(void *hnd, SaHpiResourceIdT id, const SaHpiEventT *Event); SaHpiRptEntryT *res; struct oh_handler *h; struct oh_domain *d; SaHpiDomainIdT did; char del_filepath[SAHPI_MAX_TEXT_BUFFER_LENGTH*2]; OH_CHECK_INIT_STATE(SessionId); if (EvtEntry == NULL) { err("Error: Event Log Entry is NULL"); return SA_ERR_HPI_INVALID_PARAMS; } else if (EvtEntry->EventType != SAHPI_ET_USER) { err("Error: Event Log Entry is not USER"); return SA_ERR_HPI_INVALID_PARAMS; } else if (EvtEntry->Source != SAHPI_UNSPECIFIED_RESOURCE_ID) { err("Error: Event.Source not what it should be"); return SA_ERR_HPI_INVALID_PARAMS; } else if (EvtEntry->Severity == SAHPI_ALL_SEVERITIES) { err("Error: SAHPI_ALL_SEVERITIES is not a valid here."); return SA_ERR_HPI_INVALID_PARAMS; } else if (!oh_lookup_severity(EvtEntry->Severity)) { err("Error: Event Log Entry Severity is invalid"); return SA_ERR_HPI_INVALID_PARAMS; } else if (!oh_valid_textbuffer(&EvtEntry->EventDataUnion.UserEvent.UserEventData)) { err("Error: Event Log UserData is invalid"); return SA_ERR_HPI_INVALID_PARAMS; } rv = saHpiEventLogInfoGet(SessionId, ResourceId, &info); if (rv) { err("couldn't get loginfo"); return rv; } if (EvtEntry->EventDataUnion.UserEvent.UserEventData.DataLength > info.UserEventMaxSize) { err("DataLength(%d) > info.UserEventMaxSize(%d)", EvtEntry->EventDataUnion.UserEvent.UserEventData.DataLength, info.UserEventMaxSize); return SA_ERR_HPI_INVALID_DATA; } OH_GET_DID(SessionId, did); OH_GET_DOMAIN(did, d); /* Lock domain */ /* test for special domain case */ if (ResourceId == SAHPI_UNSPECIFIED_RESOURCE_ID) { struct oh_global_param param = { .type = OPENHPI_DEL_SAVE }; oh_get_global_param(¶m); rv = oh_el_append(d->del, EvtEntry, NULL, NULL); if (param.u.del_save) { param.type = OPENHPI_VARPATH; oh_get_global_param(¶m); snprintf(del_filepath, SAHPI_MAX_TEXT_BUFFER_LENGTH*2, "%s/del.%u", param.u.varpath, did); oh_el_map_to_file(d->del, del_filepath); } oh_release_domain(d); /* Unlock domain */ return rv; } OH_RESOURCE_GET_CHECK(d, ResourceId, res); if(!(res->ResourceCapabilities & SAHPI_CAPABILITY_EVENT_LOG)) { err("Resource %d in Domain %d does not have EL.",ResourceId,did); oh_release_domain(d); /* Unlock domain */ return SA_ERR_HPI_CAPABILITY; } OH_HANDLER_GET(d, ResourceId, h); oh_release_domain(d); /* Unlock domain */ add_el_entry = h ? h->abi->add_el_entry : NULL; if (!add_el_entry) { oh_release_handler(h); return SA_ERR_HPI_INVALID_CMD; } rv = add_el_entry(h->hnd, ResourceId, EvtEntry); if (rv != SA_OK) err("EL add entry failed"); oh_release_handler(h); return rv; } SaErrorT SAHPI_API saHpiEventLogClear ( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId) { SaErrorT rv; SaErrorT (*clear_el)(void *hnd, SaHpiResourceIdT id); SaHpiRptEntryT *res; struct oh_handler *h; struct oh_domain *d; SaHpiDomainIdT did; OH_CHECK_INIT_STATE(SessionId); OH_GET_DID(SessionId, did); OH_GET_DOMAIN(did, d); /* Lock domain */ /* test for special domain case */ if (ResourceId == SAHPI_UNSPECIFIED_RESOURCE_ID) { rv = oh_el_clear(d->del); oh_release_domain(d); /* Unlock domain */ return rv; } OH_RESOURCE_GET_CHECK(d, ResourceId, res); if(!(res->ResourceCapabilities & SAHPI_CAPABILITY_EVENT_LOG)) { err("Resource %d in Domain %d does not have EL",ResourceId,did); oh_release_domain(d); /* Unlock domain */ return SA_ERR_HPI_CAPABILITY; } OH_HANDLER_GET(d, ResourceId, h); oh_release_domain(d); /* Unlock domain */ clear_el = h ? h->abi->clear_el : NULL; if (!clear_el) { oh_release_handler(h); return SA_ERR_HPI_INVALID_CMD; } rv = clear_el(h->hnd, ResourceId); oh_release_handler(h); if(rv != SA_OK) { err("EL delete entry failed"); } return rv; } SaErrorT SAHPI_API saHpiEventLogTimeGet ( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId, SAHPI_OUT SaHpiTimeT *Time) { SaHpiEventLogInfoT info; SaErrorT rv; /* Test pointer parameters for invalid pointers */ if (Time == NULL) { return SA_ERR_HPI_INVALID_PARAMS; } rv = saHpiEventLogInfoGet(SessionId, ResourceId, &info); if(rv != SA_OK) { return rv; } *Time = info.CurrentTime; return SA_OK; } SaErrorT SAHPI_API saHpiEventLogTimeSet ( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId, SAHPI_IN SaHpiTimeT Time) { SaErrorT rv; SaErrorT (*set_el_time)(void *hnd, SaHpiResourceIdT id, SaHpiTimeT time); SaHpiRptEntryT *res; struct oh_handler *h; struct oh_domain *d; SaHpiDomainIdT did; OH_CHECK_INIT_STATE(SessionId); OH_GET_DID(SessionId, did); OH_GET_DOMAIN(did, d); /* Lock domain */ /* test for special domain case */ if (ResourceId == SAHPI_UNSPECIFIED_RESOURCE_ID) { rv = oh_el_timeset(d->del, Time); oh_release_domain(d); /* Unlock domain */ return rv; } OH_RESOURCE_GET_CHECK(d, ResourceId, res); if(!(res->ResourceCapabilities & SAHPI_CAPABILITY_EVENT_LOG)) { err("Resource %d in Domain %d does not have EL",ResourceId,did); oh_release_domain(d); /* Unlock domain */ return SA_ERR_HPI_CAPABILITY; } if (Time == SAHPI_TIME_UNSPECIFIED) { err("Time SAHPI_TIME_UNSPECIFIED"); oh_release_domain(d); /* Unlock domain */ return SA_ERR_HPI_INVALID_PARAMS; } OH_HANDLER_GET(d, ResourceId, h); oh_release_domain(d); /* Unlock domain */ set_el_time = h ? h->abi->set_el_time : NULL; if (!set_el_time) { oh_release_handler(h); return SA_ERR_HPI_INVALID_CMD; } rv = set_el_time(h->hnd, ResourceId, Time); oh_release_handler(h); if (rv != SA_OK) { err("Set EL time failed"); } return rv; } SaErrorT SAHPI_API saHpiEventLogStateGet ( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId, SAHPI_OUT SaHpiBoolT *Enable) { SaHpiEventLogInfoT info; SaErrorT rv; /* Test pointer parameters for invalid pointers */ if (Enable == NULL) { return SA_ERR_HPI_INVALID_PARAMS; } rv = saHpiEventLogInfoGet(SessionId, ResourceId, &info); if(rv != SA_OK) { return rv; } *Enable = info.Enabled; return SA_OK; } SaErrorT SAHPI_API saHpiEventLogStateSet ( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId, SAHPI_IN SaHpiBoolT Enable) { struct oh_domain *d; struct oh_handler *h; SaErrorT rv; SaHpiDomainIdT did; SaHpiRptEntryT *res; SaErrorT (*set_el_state)(void *hnd, SaHpiResourceIdT id, SaHpiBoolT e); OH_CHECK_INIT_STATE(SessionId); OH_GET_DID(SessionId, did); OH_GET_DOMAIN(did, d); /* Lock domain */ /* test for special domain case */ if (ResourceId == SAHPI_UNSPECIFIED_RESOURCE_ID) { oh_el_enableset(d->del, Enable); oh_release_domain(d); /* Unlock domain */ return SA_OK; } OH_RESOURCE_GET_CHECK(d, ResourceId, res); if(!(res->ResourceCapabilities & SAHPI_CAPABILITY_EVENT_LOG)) { err("Resource %d in Domain %d does not have EL",ResourceId,did); oh_release_domain(d); /* Unlock domain */ return SA_ERR_HPI_CAPABILITY; } OH_HANDLER_GET(d, ResourceId, h); oh_release_domain(d); /* Unlock domain */ set_el_state = h ? h->abi->set_el_state : NULL; if (!set_el_state) { oh_release_handler(h); return SA_ERR_HPI_INVALID_CMD; } rv = set_el_state(h->hnd, ResourceId, Enable); oh_release_handler(h); if(rv != SA_OK) { err("Set EL state failed Domain %d, Resource: %d", did, ResourceId); } return rv; } SaErrorT SAHPI_API saHpiEventLogOverflowReset ( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId) { struct oh_handler *h; struct oh_domain *d; SaHpiDomainIdT did; SaHpiRptEntryT *res; SaErrorT rv = SA_OK; SaErrorT (*reset_el_overflow)(void *hnd, SaHpiResourceIdT id); OH_CHECK_INIT_STATE(SessionId); OH_GET_DID(SessionId, did); OH_GET_DOMAIN(did, d); /* Lock domain */ /* test for special domain case */ if (ResourceId == SAHPI_UNSPECIFIED_RESOURCE_ID) { rv = oh_el_overflowreset(d->del); oh_release_domain(d); /* Unlock domain */ return rv; } OH_RESOURCE_GET_CHECK(d, ResourceId, res); if(!(res->ResourceCapabilities & SAHPI_CAPABILITY_EVENT_LOG)) { err("Resource %d in Domain %d does not have EL",ResourceId,did); oh_release_domain(d); /* Unlock domain */ return SA_ERR_HPI_CAPABILITY; } OH_HANDLER_GET(d, ResourceId, h); oh_release_domain(d); /* Unlock domain */ reset_el_overflow = h ? h->abi->reset_el_overflow : NULL; if (!reset_el_overflow) { oh_release_handler(h); return SA_ERR_HPI_INVALID_CMD; } rv = reset_el_overflow(h->hnd, ResourceId); oh_release_handler(h); if(rv != SA_OK) { dbg("Reset EL Oveerflow not SA_OK"); } return rv; } /********************************************************************* * * Event Functions * ********************************************************************/ SaErrorT SAHPI_API saHpiSubscribe ( SAHPI_IN SaHpiSessionIdT SessionId) { SaHpiDomainIdT did; SaHpiBoolT subscribed; SaErrorT error; OH_CHECK_INIT_STATE(SessionId); OH_GET_DID(SessionId, did); error = oh_get_session_subscription(SessionId, &subscribed); if (error) { err("Error subscribing to SessionId: %d", SessionId); return error; } if (subscribed) { err("Cannot subscribe if session is not unsubscribed."); return SA_ERR_HPI_DUPLICATE; } error = oh_set_session_subscription(SessionId, SAHPI_TRUE); return error; } SaErrorT SAHPI_API saHpiUnsubscribe ( SAHPI_IN SaHpiSessionIdT SessionId) { SaHpiDomainIdT did; SaHpiBoolT subscribed; SaErrorT error; OH_CHECK_INIT_STATE(SessionId); OH_GET_DID(SessionId, did); error = oh_get_session_subscription(SessionId, &subscribed); if (error) { err("Error reading session subscription from SessionId: %d", SessionId); return error; } if (!subscribed) { err("Cannot unsubscribe if session is not subscribed."); return SA_ERR_HPI_INVALID_REQUEST; } error = oh_set_session_subscription(SessionId, SAHPI_FALSE); if (error) { err("Error unsubscribing to SessionId: %d", SessionId); return error; } return error; } SaErrorT SAHPI_API saHpiEventGet ( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiTimeoutT Timeout, SAHPI_OUT SaHpiEventT *Event, SAHPI_INOUT SaHpiRdrT *Rdr, SAHPI_INOUT SaHpiRptEntryT *RptEntry, SAHPI_INOUT SaHpiEvtQueueStatusT *EventQueueStatus) { SaHpiDomainIdT did; SaHpiBoolT subscribed; struct oh_event e; SaErrorT error = SA_OK; SaHpiEvtQueueStatusT qstatus1 = 0, qstatus2 = 0; OH_CHECK_INIT_STATE(SessionId); OH_GET_DID(SessionId, did); if (!Event) { err("Event == NULL"); return SA_ERR_HPI_INVALID_PARAMS; } else if ((Timeout <= 0) && (Timeout != SAHPI_TIMEOUT_BLOCK) && (Timeout != SAHPI_TIMEOUT_IMMEDIATE)) { err("Timeout is not positive"); return SA_ERR_HPI_INVALID_PARAMS; } error = oh_get_session_subscription(SessionId, &subscribed); if (error) return error; if (!subscribed) { err("session is not subscribed"); return SA_ERR_HPI_INVALID_REQUEST; } /* See if there is already an event in the queue */ dbg("Getting event from session %d queue.", SessionId); error = oh_dequeue_session_event(SessionId, SAHPI_TIMEOUT_IMMEDIATE, &e, &qstatus1); if (error) { /* If queue empty then fetch more events */ oh_wake_event_thread(SAHPI_TRUE); /* Sent for more events. Ready to wait on queue. */ dbg("Trying getting event again from session %d queue.", SessionId); error = oh_dequeue_session_event(SessionId, Timeout, &e, &qstatus2); } /* If no events after trying to fetch them, return error */ if (error) { err("No events in session's %d queue: %s", SessionId, oh_lookup_error(error)); return error; } /* If there was overflow before or after getting events, return it */ if (EventQueueStatus) *EventQueueStatus = qstatus1 ? qstatus1 : qstatus2; /* Return event, resource and rdr */ *Event = e.event; if (RptEntry) *RptEntry = e.resource; if (Rdr) { if (e.rdrs) { memcpy(Rdr, e.rdrs->data, sizeof(SaHpiRdrT)); } else { Rdr->RdrType = SAHPI_NO_RECORD; } } oh_event_free(&e, TRUE); return SA_OK; } SaErrorT SAHPI_API saHpiEventAdd ( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiEventT *EvtEntry) { SaHpiDomainIdT did; struct oh_event e; SaHpiEventLogInfoT info; SaErrorT error = SA_OK; error = oh_valid_addevent(EvtEntry); if (error) { err("event is not valid"); return error; } OH_CHECK_INIT_STATE(SessionId); OH_GET_DID(SessionId, did); error = saHpiEventLogInfoGet(SessionId, SAHPI_UNSPECIFIED_RESOURCE_ID, &info); if (error) { err("couldn't get loginfo"); return error; } if (EvtEntry->EventDataUnion.UserEvent.UserEventData.DataLength > info.UserEventMaxSize) { err("DataLength(%d) > info.UserEventMaxSize(%d)", EvtEntry->EventDataUnion.UserEvent.UserEventData.DataLength, info.UserEventMaxSize); return SA_ERR_HPI_INVALID_DATA; } e.hid = 0; /* Timestamp the incoming user event * only if it is SAHPI_TIME_UNSPECIFIED */ if (EvtEntry->Timestamp == SAHPI_TIME_UNSPECIFIED) { struct timeval tv1; gettimeofday(&tv1, NULL); EvtEntry->Timestamp = (SaHpiTimeT) tv1.tv_sec * 1000000000 + tv1.tv_usec * 1000; } /* Copy SaHpiEventT into oh_event struct */ e.event = *EvtEntry; /* indicate there is no rdr or resource */ e.rdrs = NULL; e.resource.ResourceId = did; e.resource.ResourceCapabilities = 0; /* indicate this is a user-added event */ e.resource.ResourceSeverity = SAHPI_INFORMATIONAL; oh_evt_queue_push(&oh_process_q, g_memdup(&e, sizeof(struct oh_event))); oh_wake_event_thread(SAHPI_TRUE); return error; } /********************************************************************* * * DAT Functions * ********************************************************************/ SaErrorT SAHPI_API saHpiAlarmGetNext ( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiSeverityT Severity, SAHPI_IN SaHpiBoolT UnacknowledgedOnly, SAHPI_INOUT SaHpiAlarmT *Alarm) { SaHpiDomainIdT did = 0; SaHpiAlarmT *a = NULL; struct oh_domain *d = NULL; SaErrorT error = SA_ERR_HPI_NOT_PRESENT; OH_CHECK_INIT_STATE(SessionId); if (!oh_lookup_severity(Severity) || !Alarm) { return SA_ERR_HPI_INVALID_PARAMS; } else if (Alarm->AlarmId == SAHPI_LAST_ENTRY) { return error; } OH_GET_DID(SessionId, did); OH_GET_DOMAIN(did, d); /* Lock domain */ if (Alarm->AlarmId != SAHPI_FIRST_ENTRY) { /* Lookup timestamp for previous alarm, first*/ a = oh_get_alarm(d, &Alarm->AlarmId, &Severity, NULL, NULL, NULL, NULL, NULL, UnacknowledgedOnly, 0); if (a && a->Timestamp != Alarm->Timestamp) { error = SA_ERR_HPI_INVALID_DATA; } } a = oh_get_alarm(d, &Alarm->AlarmId, &Severity, NULL, NULL, NULL, NULL, NULL, UnacknowledgedOnly, 1); /* get next alarm */ if (a) { if (error != SA_ERR_HPI_INVALID_DATA) { error = SA_OK; } memcpy(Alarm, a, sizeof(SaHpiAlarmT)); } oh_release_domain(d); return error; } SaErrorT SAHPI_API saHpiAlarmGet( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiAlarmIdT AlarmId, SAHPI_OUT SaHpiAlarmT *Alarm) { SaHpiDomainIdT did = 0; struct oh_domain *d = NULL; SaHpiAlarmT *a = NULL; SaErrorT error = SA_ERR_HPI_NOT_PRESENT; OH_CHECK_INIT_STATE(SessionId); if (!Alarm || AlarmId == SAHPI_FIRST_ENTRY || AlarmId == SAHPI_LAST_ENTRY) return SA_ERR_HPI_INVALID_PARAMS; OH_GET_DID(SessionId, did); OH_GET_DOMAIN(did, d); /* Lock domain */ a = oh_get_alarm(d, &AlarmId, NULL, NULL, NULL, NULL, NULL, NULL, 0, 0); if (a) { memcpy(Alarm, a, sizeof(SaHpiAlarmT)); error = SA_OK; } oh_release_domain(d); return error; } SaErrorT SAHPI_API saHpiAlarmAcknowledge( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiAlarmIdT AlarmId, SAHPI_IN SaHpiSeverityT Severity) { SaHpiDomainIdT did = 0; struct oh_domain *d = NULL; SaHpiAlarmT *a = NULL; SaErrorT error = SA_ERR_HPI_NOT_PRESENT; OH_CHECK_INIT_STATE(SessionId); if (AlarmId == SAHPI_ENTRY_UNSPECIFIED && !oh_lookup_severity(Severity)) return SA_ERR_HPI_INVALID_PARAMS; OH_GET_DID(SessionId, did); OH_GET_DOMAIN(did, d); /* Lock domain */ if (AlarmId != SAHPI_ENTRY_UNSPECIFIED) { /* Acknowledge specific alarm */ a = oh_get_alarm(d, &AlarmId, NULL, NULL, NULL, NULL, NULL, NULL, 0, 0); if (a) { a->Acknowledged = SAHPI_TRUE; error = SA_OK; } } else { /* Acknowledge group of alarms, by severity */ SaHpiAlarmIdT aid = SAHPI_FIRST_ENTRY; a = oh_get_alarm(d, &aid, &Severity, NULL, NULL, NULL, NULL, NULL, 0, 1); while (a) { a->Acknowledged = SAHPI_TRUE; a = oh_get_alarm(d, &a->AlarmId, &Severity, NULL, NULL, NULL, NULL, NULL, 0, 1); } error = SA_OK; } oh_release_domain(d); return error; } SaErrorT SAHPI_API saHpiAlarmAdd( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_INOUT SaHpiAlarmT *Alarm) { SaHpiDomainIdT did = 0; struct oh_domain *d = NULL; SaHpiAlarmT *a = NULL; OH_CHECK_INIT_STATE(SessionId); if (!Alarm || !((Alarm->Severity == SAHPI_CRITICAL) || (Alarm->Severity == SAHPI_MAJOR) || (Alarm->Severity == SAHPI_MINOR)) || (Alarm->AlarmCond.Type != SAHPI_STATUS_COND_TYPE_USER)|| !oh_valid_textbuffer(&Alarm->AlarmCond.Data)) return SA_ERR_HPI_INVALID_PARAMS; OH_GET_DID(SessionId, did); OH_GET_DOMAIN(did, d); /* Lock domain */ /* Add new alarm */ a = oh_add_alarm(d, Alarm, 0); oh_release_domain(d); if (a == NULL) return SA_ERR_HPI_OUT_OF_SPACE; else return SA_OK; } SaErrorT SAHPI_API saHpiAlarmDelete( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiAlarmIdT AlarmId, SAHPI_IN SaHpiSeverityT Severity) { SaHpiDomainIdT did = 0; struct oh_domain *d = NULL; SaHpiAlarmT *a = NULL; SaHpiStatusCondTypeT type = SAHPI_STATUS_COND_TYPE_USER; SaErrorT error = SA_ERR_HPI_NOT_PRESENT; OH_CHECK_INIT_STATE(SessionId); if (AlarmId == SAHPI_ENTRY_UNSPECIFIED && !oh_lookup_severity(Severity)) return SA_ERR_HPI_INVALID_PARAMS; OH_GET_DID(SessionId, did); OH_GET_DOMAIN(did, d); /* Lock domain */ if (AlarmId != SAHPI_ENTRY_UNSPECIFIED) { /* Look for specific alarm */ a = oh_get_alarm(d, &AlarmId, NULL, NULL, NULL, NULL, NULL, NULL, 0, 0); if (a) { if (a->AlarmCond.Type != SAHPI_STATUS_COND_TYPE_USER) { error = SA_ERR_HPI_READ_ONLY; } else { d->dat.list = g_slist_remove(d->dat.list, a); g_free(a); error = SA_OK; } } } else { /* Delete group of alarms by severity */ oh_remove_alarm(d, &Severity, &type, NULL, NULL, NULL, NULL, NULL, 1); error = SA_OK; } oh_release_domain(d); return error; } /********************************************************************* * * RDR Functions * ********************************************************************/ SaErrorT SAHPI_API saHpiRdrGet ( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId, SAHPI_IN SaHpiEntryIdT EntryId, SAHPI_OUT SaHpiEntryIdT *NextEntryId, SAHPI_OUT SaHpiRdrT *Rdr) { struct oh_domain *d; SaHpiDomainIdT did; SaHpiRptEntryT *res = NULL; SaHpiRdrT *rdr_cur; SaHpiRdrT *rdr_next; OH_CHECK_INIT_STATE(SessionId); OH_GET_DID(SessionId, did); /* Test pointer parameters for invalid pointers */ if (EntryId == SAHPI_LAST_ENTRY || !Rdr || !NextEntryId) { return SA_ERR_HPI_INVALID_PARAMS; } OH_GET_DOMAIN(did, d); /* Lock domain */ OH_RESOURCE_GET(d, ResourceId, res); if(!(res->ResourceCapabilities & SAHPI_CAPABILITY_RDR)) { err("No RDRs for Resource %d in Domain %d",ResourceId,did); oh_release_domain(d); /* Unlock domain */ return SA_ERR_HPI_CAPABILITY; } if(EntryId == SAHPI_FIRST_ENTRY) { rdr_cur = oh_get_rdr_next(&(d->rpt), ResourceId, SAHPI_FIRST_ENTRY); } else { rdr_cur = oh_get_rdr_by_id(&(d->rpt), ResourceId, EntryId); } if (rdr_cur == NULL) { err("Requested RDR, Domain[%d]->Resource[%d]->RDR[%d], is not present", did, ResourceId, EntryId); oh_release_domain(d); /* Unlock domain */ return SA_ERR_HPI_NOT_PRESENT; } memcpy(Rdr, rdr_cur, sizeof(*Rdr)); rdr_next = oh_get_rdr_next(&(d->rpt), ResourceId, rdr_cur->RecordId); if(rdr_next == NULL) { *NextEntryId = SAHPI_LAST_ENTRY; } else { *NextEntryId = rdr_next->RecordId; } oh_release_domain(d); /* Unlock domain */ return SA_OK; } SaErrorT SAHPI_API saHpiRdrGetByInstrumentId ( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId, SAHPI_IN SaHpiRdrTypeT RdrType, SAHPI_IN SaHpiInstrumentIdT InstrumentId, SAHPI_OUT SaHpiRdrT *Rdr) { SaHpiRptEntryT *res = NULL; SaHpiRdrT *rdr_cur; SaHpiDomainIdT did; SaHpiCapabilitiesT cap; struct oh_domain *d = NULL; /* Test pointer parameters for invalid pointers */ if (!oh_lookup_rdrtype(RdrType) || RdrType == SAHPI_NO_RECORD || !Rdr) { return SA_ERR_HPI_INVALID_PARAMS; } OH_CHECK_INIT_STATE(SessionId); OH_GET_DID(SessionId, did); OH_GET_DOMAIN(did, d); /* Lock domain */ OH_RESOURCE_GET(d, ResourceId, res); cap = res->ResourceCapabilities; if(!(cap & SAHPI_CAPABILITY_RDR)) { err("No RDRs for Resource %d in Domain %d",ResourceId,did); oh_release_domain(d); /* Unlock domain */ return SA_ERR_HPI_CAPABILITY; } /* ensure that the resource has something of that type */ switch(RdrType) { case SAHPI_CTRL_RDR: if(!(cap & SAHPI_CAPABILITY_CONTROL)) { err("No Controls for Resource %d in Domain %d",ResourceId,did); oh_release_domain(d); /* Unlock domain */ return SA_ERR_HPI_CAPABILITY; } break; case SAHPI_SENSOR_RDR: if(!(cap & SAHPI_CAPABILITY_SENSOR)) { err("No Sensors for Resource %d in Domain %d",ResourceId,did); oh_release_domain(d); /* Unlock domain */ return SA_ERR_HPI_CAPABILITY; } break; case SAHPI_INVENTORY_RDR: if(!(cap & SAHPI_CAPABILITY_INVENTORY_DATA)) { err("No IDRs for Resource %d in Domain %d",ResourceId,did); oh_release_domain(d); /* Unlock domain */ return SA_ERR_HPI_CAPABILITY; } break; case SAHPI_WATCHDOG_RDR: if(!(cap & SAHPI_CAPABILITY_WATCHDOG)) { err("No Watchdogs for Resource %d in Domain %d",ResourceId,did); oh_release_domain(d); /* Unlock domain */ return SA_ERR_HPI_CAPABILITY; } break; case SAHPI_ANNUNCIATOR_RDR: if(!(cap & SAHPI_CAPABILITY_ANNUNCIATOR)) { err("No Annunciators for Resource %d in Domain %d",ResourceId,did); oh_release_domain(d); /* Unlock domain */ return SA_ERR_HPI_CAPABILITY; } break; case SAHPI_DIMI_RDR: if(!(cap & SAHPI_CAPABILITY_DIMI)) { dbg("No DIMI for Resource %d in Domain %d",ResourceId,did); oh_release_domain(d); /* Unlock domain */ return SA_ERR_HPI_CAPABILITY; } break; case SAHPI_FUMI_RDR: if(!(cap & SAHPI_CAPABILITY_FUMI)) { dbg("No FUMI for Resource %d in Domain %d",ResourceId,did); oh_release_domain(d); /* Unlock domain */ return SA_ERR_HPI_CAPABILITY; } break; default: err("Not a valid Rdr Type %d", RdrType); oh_release_domain(d); /* Unlock domain */ return SA_ERR_HPI_INVALID_PARAMS; } /* now that we have a pretty good notion that all is well, try the lookup */ rdr_cur = oh_get_rdr_by_type(&(d->rpt), ResourceId, RdrType, InstrumentId); if (rdr_cur == NULL) { err("Requested RDR, Domain[%d]->Resource[%d]->RDR[%d,%d], is not present", did, ResourceId, RdrType, InstrumentId); oh_release_domain(d); /* Unlock domain */ return SA_ERR_HPI_NOT_PRESENT; } memcpy(Rdr, rdr_cur, sizeof(*Rdr)); oh_release_domain(d); /* Unlock domain */ return SA_OK; } SaErrorT SAHPI_API saHpiRdrUpdateCountGet( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId, SAHPI_OUT SaHpiUint32T *UpdateCount) { SaHpiDomainIdT did; struct oh_domain *d = NULL; SaHpiRptEntryT *res; /* Test pointer parameters for invalid pointers */ if (UpdateCount == NULL) return SA_ERR_HPI_INVALID_PARAMS; OH_CHECK_INIT_STATE(SessionId); OH_GET_DID(SessionId, did); OH_GET_DOMAIN(did, d); /* Lock domain */ OH_RESOURCE_GET(d, ResourceId, res); if(!(res->ResourceCapabilities & SAHPI_CAPABILITY_RDR)) { err("No RDRs for Resource %d in Domain %d",ResourceId,did); oh_release_domain(d); /* Unlock domain */ return SA_ERR_HPI_CAPABILITY; } // TODO implement // Current implementation always return 0 // Shall we introduce new call in handler ABI or // implement update counter in OpenHPI core? *UpdateCount = 0; oh_release_domain(d); /* Unlock domain */ return SA_OK; } /********************************************************************* * * Sensor Functions * ********************************************************************/ SaErrorT SAHPI_API saHpiSensorReadingGet ( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId, SAHPI_IN SaHpiSensorNumT SensorNum, SAHPI_INOUT SaHpiSensorReadingT *Reading, SAHPI_INOUT SaHpiEventStateT *EventState) { SaErrorT rv; SaErrorT (*get_func) (void *, SaHpiResourceIdT, SaHpiSensorNumT, SaHpiSensorReadingT *, SaHpiEventStateT *); struct oh_handler *h; SaHpiRptEntryT *res; SaHpiRdrT *rdr; SaHpiDomainIdT did; struct oh_domain *d = NULL; OH_CHECK_INIT_STATE(SessionId); OH_GET_DID(SessionId, did); OH_GET_DOMAIN(did, d); /* Lock domain */ OH_RESOURCE_GET_CHECK(d, ResourceId, res); if(!(res->ResourceCapabilities & SAHPI_CAPABILITY_SENSOR)) { err("Resource %d in Domain %d doesn't have sensors", ResourceId, did); oh_release_domain(d); /* Unlock domain */ return SA_ERR_HPI_CAPABILITY; } rdr = oh_get_rdr_by_type(&(d->rpt), ResourceId, SAHPI_SENSOR_RDR, SensorNum); if (!rdr) { err("No Sensor %d found for ResourceId %d in Domain %d", SensorNum, ResourceId, did); oh_release_domain(d); /* Unlock domain */ return SA_ERR_HPI_NOT_PRESENT; } OH_HANDLER_GET(d, ResourceId, h); oh_release_domain(d); /* Unlock domain */ get_func = h ? h->abi->get_sensor_reading : NULL; if (!get_func) { oh_release_handler(h); return SA_ERR_HPI_INVALID_CMD; } rv = get_func(h->hnd, ResourceId, SensorNum, Reading, EventState); /* If the Reading->IsSupported is set to False, then Reading->Type and * Reading->Value fields are not valid. Hence, these two fields may not * be modified by the plugin. But the marshalling code expects all * the fields of return structure to have proper values. * * The below code is added to overcome the marshalling limitation. */ if (rv == SA_OK && Reading && Reading->IsSupported == SAHPI_FALSE) { Reading->Type = 0; memset(&(Reading->Value), 0, sizeof(SaHpiSensorReadingUnionT)); } oh_release_handler(h); return rv; } SaErrorT SAHPI_API saHpiSensorThresholdsGet ( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId, SAHPI_IN SaHpiSensorNumT SensorNum, SAHPI_IN SaHpiSensorThresholdsT *SensorThresholds) { SaErrorT rv; SaErrorT (*get_func) (void *, SaHpiResourceIdT, SaHpiSensorNumT, SaHpiSensorThresholdsT *); SaHpiRptEntryT *res; SaHpiRdrT *rdr_cur; SaHpiSensorThdDefnT *thd; struct oh_handler *h; SaHpiDomainIdT did; struct oh_domain *d = NULL; if (!SensorThresholds) return SA_ERR_HPI_INVALID_PARAMS; OH_CHECK_INIT_STATE(SessionId); OH_GET_DID(SessionId, did); OH_GET_DOMAIN(did, d); /* Lock domain */ OH_RESOURCE_GET_CHECK(d, ResourceId, res); if(!(res->ResourceCapabilities & SAHPI_CAPABILITY_SENSOR)) { oh_release_domain(d); /* Unlock domain */ err("Resource %d in Domain %d doesn't have sensors", ResourceId, did); return SA_ERR_HPI_CAPABILITY; } rdr_cur = oh_get_rdr_by_type(&(d->rpt), ResourceId, SAHPI_SENSOR_RDR, SensorNum); if (rdr_cur == NULL) { oh_release_domain(d); /* Unlock domain */ err("Requested RDR, Domain[%d]->Resource[%d]->RDR[%d,%d], is not present", did, ResourceId, SAHPI_SENSOR_RDR, SensorNum); return SA_ERR_HPI_NOT_PRESENT; } thd = &rdr_cur->RdrTypeUnion.SensorRec.ThresholdDefn; if (thd->IsAccessible == SAHPI_FALSE || thd->ReadThold == 0) { oh_release_domain(d); /* Unlock domain */ err("Sensor has no readable thresholds."); return SA_ERR_HPI_INVALID_CMD; } OH_HANDLER_GET(d, ResourceId, h); oh_release_domain(d); /* Unlock domain */ get_func = h ? h->abi->get_sensor_thresholds : NULL; if (!get_func) { oh_release_handler(h); return SA_ERR_HPI_INVALID_CMD; } rv = get_func(h->hnd, ResourceId, SensorNum, SensorThresholds); oh_release_handler(h); return rv; } SaErrorT SAHPI_API saHpiSensorThresholdsSet ( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId, SAHPI_IN SaHpiSensorNumT SensorNum, SAHPI_OUT SaHpiSensorThresholdsT *SensorThresholds) { SaErrorT rv; SaErrorT (*set_func) (void *, SaHpiResourceIdT, SaHpiSensorNumT, const SaHpiSensorThresholdsT *); SaHpiRptEntryT *res; SaHpiRdrT *rdr; struct oh_handler *h; SaHpiDomainIdT did; struct oh_domain *d = NULL; if (!SensorThresholds) return SA_ERR_HPI_INVALID_PARAMS; OH_CHECK_INIT_STATE(SessionId); OH_GET_DID(SessionId, did); OH_GET_DOMAIN(did, d); /* Lock domain */ OH_RESOURCE_GET_CHECK(d, ResourceId, res); if(!(res->ResourceCapabilities & SAHPI_CAPABILITY_SENSOR)) { err("Resource %d in Domain %d doesn't have sensors",ResourceId,did); oh_release_domain(d); /* Unlock domain */ return SA_ERR_HPI_CAPABILITY; } rdr = oh_get_rdr_by_type(&(d->rpt), ResourceId, SAHPI_SENSOR_RDR, SensorNum); if (!rdr) { err("No Sensor %d found for ResourceId %d in Domain %d", SensorNum, ResourceId, did); oh_release_domain(d); return SA_ERR_HPI_NOT_PRESENT; } /* Merging thresholds*/ SaHpiSensorThresholdsT tmp; rv = saHpiSensorThresholdsGet( SessionId, ResourceId, SensorNum, &tmp ); if (rv != SA_OK) { err("Can't get sensor thresholds. Sensor %d, ResourceId %d, Domain %d", SensorNum, ResourceId, did); oh_release_domain(d); return rv; } SaHpiSensorThdMaskT wmask = rdr->RdrTypeUnion.SensorRec.ThresholdDefn.WriteThold; #define COPY_TH( TH, MASK ) \ { \ if ( ( SensorThresholds->TH.IsSupported == SAHPI_TRUE ) && ( ( wmask & MASK ) != 0 ) ) { \ tmp.TH = SensorThresholds->TH; \ } \ } COPY_TH( UpCritical, SAHPI_STM_UP_CRIT ); COPY_TH( UpMajor, SAHPI_STM_UP_MAJOR ); COPY_TH( UpMinor, SAHPI_STM_UP_MINOR ); COPY_TH( LowCritical, SAHPI_STM_LOW_CRIT ); COPY_TH( LowMajor, SAHPI_STM_LOW_MAJOR ); COPY_TH( LowMinor, SAHPI_STM_LOW_MINOR ); COPY_TH( PosThdHysteresis, SAHPI_STM_UP_HYSTERESIS ); COPY_TH( NegThdHysteresis, SAHPI_STM_LOW_HYSTERESIS ); #undef COPY_TH rv = oh_valid_thresholds(&tmp, rdr); if (rv != SA_OK) { /* Invalid sensor threshold */ err("Invalid sensor threshold."); oh_release_domain(d); return rv; } OH_HANDLER_GET(d, ResourceId, h); oh_release_domain(d); /* Unlock domain */ set_func = h ? h->abi->set_sensor_thresholds : NULL; if (!set_func) { oh_release_handler(h); return SA_ERR_HPI_INVALID_CMD; } rv = set_func(h->hnd, ResourceId, SensorNum, SensorThresholds); oh_release_handler(h); return rv; } SaErrorT SAHPI_API saHpiSensorTypeGet ( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId, SAHPI_IN SaHpiSensorNumT SensorNum, SAHPI_OUT SaHpiSensorTypeT *Type, SAHPI_OUT SaHpiEventCategoryT *Category) { SaHpiRptEntryT *res; SaHpiRdrT *rdr; SaHpiDomainIdT did; struct oh_domain *d = NULL; if (!Type || !Category) return SA_ERR_HPI_INVALID_PARAMS; OH_CHECK_INIT_STATE(SessionId); OH_GET_DID(SessionId, did); OH_GET_DOMAIN(did, d); /* Lock domain */ OH_RESOURCE_GET(d, ResourceId, res); if(!(res->ResourceCapabilities & SAHPI_CAPABILITY_SENSOR)) { err("Resource %d in Domain %d doesn't have sensors", ResourceId, did); oh_release_domain(d); /* Unlock domain */ return SA_ERR_HPI_CAPABILITY; } rdr = oh_get_rdr_by_type(&(d->rpt), ResourceId, SAHPI_SENSOR_RDR, SensorNum); if (!rdr) { err("No Sensor num %d found for Resource %d in Domain %d", SensorNum, ResourceId, did); oh_release_domain(d); /* Unlock domain */ return SA_ERR_HPI_NOT_PRESENT; } memcpy(Type, &(rdr->RdrTypeUnion.SensorRec.Type), sizeof(SaHpiSensorTypeT)); memcpy(Category, &(rdr->RdrTypeUnion.SensorRec.Category), sizeof(SaHpiEventCategoryT)); oh_release_domain(d); /* Unlock domain */ return SA_OK; } SaErrorT SAHPI_API saHpiSensorEnableGet ( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId, SAHPI_IN SaHpiSensorNumT SensorNum, SAHPI_OUT SaHpiBoolT *SensorEnabled) { SaErrorT rv; SaErrorT (*get_sensor_enable)(void *hnd, SaHpiResourceIdT, SaHpiSensorNumT, SaHpiBoolT *enable); SaHpiRptEntryT *res; SaHpiRdrT *rdr_cur; struct oh_handler *h; SaHpiDomainIdT did; struct oh_domain *d = NULL; if (!SensorEnabled) return SA_ERR_HPI_INVALID_PARAMS; OH_CHECK_INIT_STATE(SessionId); OH_GET_DID(SessionId, did); OH_GET_DOMAIN(did, d); /* Lock domain */ OH_RESOURCE_GET_CHECK(d, ResourceId, res); if(!(res->ResourceCapabilities & SAHPI_CAPABILITY_SENSOR)) { err("Resource %d doesn't have sensors in Domain %d", ResourceId, did); oh_release_domain(d); /* Unlock domain */ return SA_ERR_HPI_CAPABILITY; } rdr_cur = oh_get_rdr_by_type(&(d->rpt), ResourceId, SAHPI_SENSOR_RDR, SensorNum); if (rdr_cur == NULL) { err("Requested RDR, Domain[%d]->Resource[%d]->RDR[%d,%d], is not present", did, ResourceId, SAHPI_SENSOR_RDR, SensorNum); oh_release_domain(d); /* Unlock domain */ return SA_ERR_HPI_NOT_PRESENT; } OH_HANDLER_GET(d, ResourceId, h); oh_release_domain(d); /* Unlock domain */ get_sensor_enable = h ? h->abi->get_sensor_enable : NULL; if (!get_sensor_enable) { oh_release_handler(h); return SA_ERR_HPI_INVALID_CMD; } rv = get_sensor_enable(h->hnd, ResourceId, SensorNum, SensorEnabled); oh_release_handler(h); return rv; } SaErrorT SAHPI_API saHpiSensorEnableSet ( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId, SAHPI_IN SaHpiSensorNumT SensorNum, SAHPI_IN SaHpiBoolT SensorEnabled) { SaErrorT rv; SaErrorT (*set_sensor_enable)(void *hnd, SaHpiResourceIdT, SaHpiSensorNumT, SaHpiBoolT enable); SaHpiRptEntryT *res; SaHpiRdrT *rdr_cur; struct oh_handler *h; SaHpiDomainIdT did; struct oh_domain *d = NULL; OH_CHECK_INIT_STATE(SessionId); OH_GET_DID(SessionId, did); OH_GET_DOMAIN(did, d); /* Lock domain */ OH_RESOURCE_GET_CHECK(d, ResourceId, res); if(!(res->ResourceCapabilities & SAHPI_CAPABILITY_SENSOR)) { err("Resource %d doesn't have sensors in Domain %d", ResourceId, did); oh_release_domain(d); /* Unlock domain */ return SA_ERR_HPI_CAPABILITY; } rdr_cur = oh_get_rdr_by_type(&(d->rpt), ResourceId, SAHPI_SENSOR_RDR, SensorNum); if (rdr_cur == NULL) { err("Requested RDR, Domain[%d]->Resource[%d]->RDR[%d,%d], is not present", did, ResourceId, SAHPI_SENSOR_RDR, SensorNum); oh_release_domain(d); /* Unlock domain */ return SA_ERR_HPI_NOT_PRESENT; } if (!rdr_cur->RdrTypeUnion.SensorRec.EnableCtrl) { err("Domain[%d]->Resource[%d]->Sensor[%d] - not EnableCtr", did, ResourceId, SensorNum); oh_release_domain(d); /* Unlock domain */ return SA_ERR_HPI_READ_ONLY; } OH_HANDLER_GET(d, ResourceId, h); oh_release_domain(d); /* Unlock domain */ set_sensor_enable = h ? h->abi->set_sensor_enable : NULL; if (!set_sensor_enable) { oh_release_handler(h); return SA_ERR_HPI_INVALID_CMD; } rv = set_sensor_enable(h->hnd, ResourceId, SensorNum, SensorEnabled); oh_release_handler(h); if (rv == SA_OK) { oh_detect_sensor_enable_alarm(did, ResourceId, SensorNum, SensorEnabled); } return rv; } SaErrorT SAHPI_API saHpiSensorEventEnableGet ( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId, SAHPI_IN SaHpiSensorNumT SensorNum, SAHPI_OUT SaHpiBoolT *SensorEventsEnabled) { SaErrorT rv; SaErrorT (*get_sensor_event_enables)(void *hnd, SaHpiResourceIdT, SaHpiSensorNumT, SaHpiBoolT *enables); SaHpiRptEntryT *res; SaHpiRdrT *rdr_cur; struct oh_handler *h; SaHpiDomainIdT did; struct oh_domain *d = NULL; if (!SensorEventsEnabled) return SA_ERR_HPI_INVALID_PARAMS; OH_CHECK_INIT_STATE(SessionId); OH_GET_DID(SessionId, did); OH_GET_DOMAIN(did, d); /* Lock domain */ OH_RESOURCE_GET_CHECK(d, ResourceId, res); if(!(res->ResourceCapabilities & SAHPI_CAPABILITY_SENSOR)) { err("Resource %d doesn't have sensors in Domain %d", ResourceId, did); oh_release_domain(d); /* Unlock domain */ return SA_ERR_HPI_CAPABILITY; } rdr_cur = oh_get_rdr_by_type(&(d->rpt), ResourceId, SAHPI_SENSOR_RDR, SensorNum); if (rdr_cur == NULL) { err("Requested RDR, Domain[%d]->Resource[%d]->RDR[%d,%d], is not present", did, ResourceId, SAHPI_SENSOR_RDR, SensorNum); oh_release_domain(d); /* Unlock domain */ return SA_ERR_HPI_NOT_PRESENT; } OH_HANDLER_GET(d, ResourceId, h); oh_release_domain(d); /* Unlock domain */ get_sensor_event_enables = h ? h->abi->get_sensor_event_enables : NULL; if (!get_sensor_event_enables) { oh_release_handler(h); return SA_ERR_HPI_INVALID_CMD; } rv = get_sensor_event_enables(h->hnd, ResourceId, SensorNum, SensorEventsEnabled); oh_release_handler(h); return rv; } SaErrorT SAHPI_API saHpiSensorEventEnableSet ( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId, SAHPI_IN SaHpiSensorNumT SensorNum, SAHPI_IN SaHpiBoolT SensorEventsEnabled) { SaErrorT rv; SaErrorT (*set_sensor_event_enables)(void *hnd, SaHpiResourceIdT, SaHpiSensorNumT, const SaHpiBoolT enables); SaHpiRptEntryT *res; SaHpiRdrT *rdr_cur; struct oh_handler *h; SaHpiDomainIdT did; struct oh_domain *d = NULL; SaHpiSensorEventCtrlT sec; OH_CHECK_INIT_STATE(SessionId); OH_GET_DID(SessionId, did); OH_GET_DOMAIN(did, d); /* Lock domain */ OH_RESOURCE_GET_CHECK(d, ResourceId, res); if(!(res->ResourceCapabilities & SAHPI_CAPABILITY_SENSOR)) { err("Resource %d doesn't have sensors in Domain %d", ResourceId, did); oh_release_domain(d); /* Unlock domain */ return SA_ERR_HPI_CAPABILITY; } rdr_cur = oh_get_rdr_by_type(&(d->rpt), ResourceId, SAHPI_SENSOR_RDR, SensorNum); if (rdr_cur == NULL) { err("Requested RDR, Domain[%d]->Resource[%d]->RDR[%d,%d], is not present", did, ResourceId, SAHPI_SENSOR_RDR, SensorNum); oh_release_domain(d); /* Unlock domain */ return SA_ERR_HPI_NOT_PRESENT; } sec = rdr_cur->RdrTypeUnion.SensorRec.EventCtrl; if ((sec == SAHPI_SEC_READ_ONLY)) { oh_release_domain(d); /* Unlock domain */ return SA_ERR_HPI_READ_ONLY; } OH_HANDLER_GET(d, ResourceId, h); oh_release_domain(d); /* Unlock domain */ set_sensor_event_enables = h ? h->abi->set_sensor_event_enables : NULL; if (!set_sensor_event_enables) { oh_release_handler(h); return SA_ERR_HPI_INVALID_CMD; } rv = set_sensor_event_enables(h->hnd, ResourceId, SensorNum, SensorEventsEnabled); oh_release_handler(h); if (rv == SA_OK) { oh_detect_sensor_enable_alarm(did, ResourceId, SensorNum, SensorEventsEnabled); } return rv; } SaErrorT SAHPI_API saHpiSensorEventMasksGet ( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId, SAHPI_IN SaHpiSensorNumT SensorNum, SAHPI_INOUT SaHpiEventStateT *AssertEventMask, SAHPI_INOUT SaHpiEventStateT *DeassertEventMask) { SaErrorT rv; SaErrorT (*get_sensor_event_masks)(void *hnd, SaHpiResourceIdT, SaHpiSensorNumT, SaHpiEventStateT *AssertEventMask, SaHpiEventStateT *DeassertEventMask); SaHpiRptEntryT *res; SaHpiRdrT *rdr_cur; struct oh_handler *h; SaHpiDomainIdT did; struct oh_domain *d = NULL; OH_CHECK_INIT_STATE(SessionId); OH_GET_DID(SessionId, did); OH_GET_DOMAIN(did, d); /* Lock domain */ OH_RESOURCE_GET_CHECK(d, ResourceId, res); if(!(res->ResourceCapabilities & SAHPI_CAPABILITY_SENSOR)) { err("Resource %d doesn't have sensors in Domain %d", ResourceId, did); oh_release_domain(d); /* Unlock domain */ return SA_ERR_HPI_CAPABILITY; } rdr_cur = oh_get_rdr_by_type(&(d->rpt), ResourceId, SAHPI_SENSOR_RDR, SensorNum); if (rdr_cur == NULL) { err("Requested RDR, Domain[%d]->Resource[%d]->RDR[%d,%d], is not present", did, ResourceId, SAHPI_SENSOR_RDR, SensorNum); oh_release_domain(d); /* Unlock domain */ return SA_ERR_HPI_NOT_PRESENT; } OH_HANDLER_GET(d, ResourceId, h); oh_release_domain(d); /* Unlock domain */ get_sensor_event_masks = h ? h->abi->get_sensor_event_masks : NULL; if (!get_sensor_event_masks) { oh_release_handler(h); return SA_ERR_HPI_INVALID_CMD; } rv = get_sensor_event_masks(h->hnd, ResourceId, SensorNum, AssertEventMask, DeassertEventMask); oh_release_handler(h); return rv; } SaErrorT SAHPI_API saHpiSensorEventMasksSet ( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId, SAHPI_IN SaHpiSensorNumT SensorNum, SAHPI_IN SaHpiSensorEventMaskActionT Action, SAHPI_IN SaHpiEventStateT AssertEventMask, SAHPI_IN SaHpiEventStateT DeassertEventMask) { SaErrorT rv; SaErrorT (*set_sensor_event_masks)(void *hnd, SaHpiResourceIdT, SaHpiSensorNumT, SaHpiSensorEventMaskActionT Action, SaHpiEventStateT AssertEventMask, SaHpiEventStateT DeassertEventMask); SaHpiRptEntryT *res; SaHpiRdrT *rdr_cur; struct oh_handler *h; SaHpiDomainIdT did; struct oh_domain *d = NULL; SaHpiSensorEventCtrlT sec; OH_CHECK_INIT_STATE(SessionId); if (!oh_lookup_sensoreventmaskaction(Action)) return SA_ERR_HPI_INVALID_PARAMS; OH_GET_DID(SessionId, did); OH_GET_DOMAIN(did, d); /* Lock domain */ OH_RESOURCE_GET_CHECK(d, ResourceId, res); if(!(res->ResourceCapabilities & SAHPI_CAPABILITY_SENSOR)) { err("Resource %d doesn't have sensors in Domain %d", ResourceId, did); oh_release_domain(d); /* Unlock domain */ return SA_ERR_HPI_CAPABILITY; } rdr_cur = oh_get_rdr_by_type(&(d->rpt), ResourceId, SAHPI_SENSOR_RDR, SensorNum); if (rdr_cur == NULL) { err("Requested RDR, Domain[%d]->Resource[%d]->RDR[%d,%d], is not present", did, ResourceId, SAHPI_SENSOR_RDR, SensorNum); oh_release_domain(d); /* Unlock domain */ return SA_ERR_HPI_NOT_PRESENT; } sec = rdr_cur->RdrTypeUnion.SensorRec.EventCtrl; if ((sec == SAHPI_SEC_READ_ONLY_MASKS) || (sec == SAHPI_SEC_READ_ONLY)) { oh_release_domain(d); /* Unlock domain */ return SA_ERR_HPI_READ_ONLY; } if (Action == SAHPI_SENS_ADD_EVENTS_TO_MASKS) { if (AssertEventMask != SAHPI_ALL_EVENT_STATES && (rdr_cur->RdrTypeUnion.SensorRec.Events | AssertEventMask) != rdr_cur->RdrTypeUnion.SensorRec.Events) { oh_release_domain(d); return SA_ERR_HPI_INVALID_DATA; } if (!(res->ResourceCapabilities & SAHPI_CAPABILITY_EVT_DEASSERTS) && (DeassertEventMask != SAHPI_ALL_EVENT_STATES) && ((rdr_cur->RdrTypeUnion.SensorRec.Events | DeassertEventMask) != rdr_cur->RdrTypeUnion.SensorRec.Events)) { oh_release_domain(d); return SA_ERR_HPI_INVALID_DATA; } } OH_HANDLER_GET(d, ResourceId, h); oh_release_domain(d); /* Unlock domain */ set_sensor_event_masks = h ? h->abi->set_sensor_event_masks : NULL; if (!set_sensor_event_masks) { oh_release_handler(h); return SA_ERR_HPI_INVALID_CMD; } rv = set_sensor_event_masks(h->hnd, ResourceId, SensorNum, Action, AssertEventMask, DeassertEventMask); oh_release_handler(h); if (rv == SA_OK) { oh_detect_sensor_mask_alarm(did, ResourceId, SensorNum, Action, DeassertEventMask); } return rv; } /* End Sensor functions */ /********************************************************************* * * Control Functions * ********************************************************************/ SaErrorT SAHPI_API saHpiControlTypeGet ( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId, SAHPI_IN SaHpiCtrlNumT CtrlNum, SAHPI_OUT SaHpiCtrlTypeT *Type) { SaHpiRptEntryT *res; SaHpiRdrT *rdr; SaHpiDomainIdT did; struct oh_domain *d = NULL; if (!Type) return SA_ERR_HPI_INVALID_PARAMS; OH_CHECK_INIT_STATE(SessionId); OH_GET_DID(SessionId, did); OH_GET_DOMAIN(did, d); /* Lock domain */ OH_RESOURCE_GET(d, ResourceId, res); if(!(res->ResourceCapabilities & SAHPI_CAPABILITY_CONTROL)) { err("Resource %d in Domain %d doesn't have controls", ResourceId,did); oh_release_domain(d); /* Unlock domain */ return SA_ERR_HPI_CAPABILITY; } rdr = oh_get_rdr_by_type(&(d->rpt), ResourceId, SAHPI_CTRL_RDR, CtrlNum); if (!rdr) { oh_release_domain(d); /* Unlock domain */ return SA_ERR_HPI_NOT_PRESENT; } memcpy(Type, &(rdr->RdrTypeUnion.CtrlRec.Type), sizeof(SaHpiCtrlTypeT)); oh_release_domain(d); /* Unlock domain */ return SA_OK; } SaErrorT SAHPI_API saHpiControlGet ( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId, SAHPI_IN SaHpiCtrlNumT CtrlNum, SAHPI_OUT SaHpiCtrlModeT *CtrlMode, SAHPI_INOUT SaHpiCtrlStateT *CtrlState) { SaErrorT rv; SaErrorT (*get_func)(void *, SaHpiResourceIdT, SaHpiCtrlNumT, SaHpiCtrlModeT *, SaHpiCtrlStateT *); SaHpiRptEntryT *res; SaHpiRdrT *rdr; struct oh_handler *h = NULL; SaHpiDomainIdT did; struct oh_domain *d = NULL; OH_CHECK_INIT_STATE(SessionId); OH_GET_DID(SessionId, did); OH_GET_DOMAIN(did, d); /* Lock domain */ OH_RESOURCE_GET_CHECK(d, ResourceId, res); if(!(res->ResourceCapabilities & SAHPI_CAPABILITY_CONTROL)) { err("Resource %d in Domain %d doesn't have controls", ResourceId, d->id); oh_release_domain(d); /* Unlock domain */ return SA_ERR_HPI_CAPABILITY; } rdr = oh_get_rdr_by_type(&(d->rpt), ResourceId, SAHPI_CTRL_RDR, CtrlNum); if (!rdr) { oh_release_domain(d); /* Unlock domain */ return SA_ERR_HPI_NOT_PRESENT; } if(rdr->RdrTypeUnion.CtrlRec.WriteOnly) { oh_release_domain(d); /* Unlock domain */ return SA_ERR_HPI_INVALID_CMD; } if (CtrlMode == NULL && CtrlState == NULL) { oh_release_domain(d); return SA_OK; } else if (CtrlState && rdr->RdrTypeUnion.CtrlRec.Type == SAHPI_CTRL_TYPE_TEXT) { if (CtrlState->StateUnion.Text.Line != SAHPI_TLN_ALL_LINES && CtrlState->StateUnion.Text.Line > rdr->RdrTypeUnion.CtrlRec.TypeUnion.Text.MaxLines) { oh_release_domain(d); return SA_ERR_HPI_INVALID_DATA; } } OH_HANDLER_GET(d, ResourceId, h); oh_release_domain(d); /* Unlock domain */ get_func = h ? h->abi->get_control_state : NULL; if (!get_func) { oh_release_handler(h); return SA_ERR_HPI_INVALID_CMD; } rv = get_func(h->hnd, ResourceId, CtrlNum, CtrlMode, CtrlState); oh_release_handler(h); return rv; } SaErrorT SAHPI_API saHpiControlSet ( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId, SAHPI_IN SaHpiCtrlNumT CtrlNum, SAHPI_IN SaHpiCtrlModeT CtrlMode, SAHPI_IN SaHpiCtrlStateT *CtrlState) { SaErrorT rv; SaHpiRptEntryT *res; SaHpiRdrT *rdr; struct oh_handler *h; SaHpiDomainIdT did; struct oh_domain *d = NULL; SaHpiCtrlModeT cur_mode; SaHpiCtrlStateT cur_state; if (!oh_lookup_ctrlmode(CtrlMode) || (CtrlMode != SAHPI_CTRL_MODE_AUTO && !CtrlState)) { return SA_ERR_HPI_INVALID_PARAMS; } if (CtrlMode != SAHPI_CTRL_MODE_AUTO && ((CtrlState->Type == SAHPI_CTRL_TYPE_DIGITAL && !oh_lookup_ctrlstatedigital(CtrlState->StateUnion.Digital)) || (CtrlState->Type == SAHPI_CTRL_TYPE_STREAM && CtrlState->StateUnion.Stream.StreamLength > SAHPI_CTRL_MAX_STREAM_LENGTH) || (CtrlState->Type == SAHPI_CTRL_TYPE_TEXT && !oh_valid_textbuffer(&CtrlState->StateUnion.Text.Text)))) { return SA_ERR_HPI_INVALID_PARAMS; } OH_CHECK_INIT_STATE(SessionId); OH_GET_DID(SessionId, did); OH_GET_DOMAIN(did, d); /* Lock domain */ OH_RESOURCE_GET_CHECK(d, ResourceId, res); if(!(res->ResourceCapabilities & SAHPI_CAPABILITY_CONTROL)) { oh_release_domain(d); /* Unlock domain */ err("Resource %d in Domain %d doesn't have controls", ResourceId, did); return SA_ERR_HPI_CAPABILITY; } rdr = oh_get_rdr_by_type(&d->rpt, ResourceId, SAHPI_CTRL_RDR, CtrlNum); if (!rdr || rdr->RdrType != SAHPI_CTRL_RDR) { oh_release_domain(d); /* Unlock domain */ return SA_ERR_HPI_NOT_PRESENT; } /* Check CtrlMode and CtrlState */ rv = oh_valid_ctrl_state_mode(&rdr->RdrTypeUnion.CtrlRec, CtrlMode, CtrlState); if (rv != SA_OK) { oh_release_domain(d); return rv; } OH_HANDLER_GET(d, ResourceId, h); oh_release_domain(d); /* Unlock domain */ if (!rdr->RdrTypeUnion.CtrlRec.WriteOnly && rdr->RdrTypeUnion.CtrlRec.Type == SAHPI_CTRL_TYPE_DIGITAL) { OH_CALL_ABI(h, get_control_state, SA_ERR_HPI_INVALID_CMD, rv, ResourceId, CtrlNum, &cur_mode, &cur_state); if (CtrlMode != SAHPI_CTRL_MODE_AUTO) { if (((cur_state.StateUnion.Digital == SAHPI_CTRL_STATE_PULSE_ON || cur_state.StateUnion.Digital == SAHPI_CTRL_STATE_ON) && CtrlState->StateUnion.Digital == SAHPI_CTRL_STATE_PULSE_ON) || ((cur_state.StateUnion.Digital == SAHPI_CTRL_STATE_PULSE_OFF || cur_state.StateUnion.Digital == SAHPI_CTRL_STATE_OFF) && CtrlState->StateUnion.Digital == SAHPI_CTRL_STATE_PULSE_OFF)) { oh_release_handler(h); return SA_ERR_HPI_INVALID_REQUEST; } } } OH_CALL_ABI(h, set_control_state, SA_ERR_HPI_INVALID_CMD, rv, ResourceId, CtrlNum, CtrlMode, CtrlState); oh_release_handler(h); return rv; } /********************************************************************* * * Inventory Functions * ********************************************************************/ SaErrorT SAHPI_API saHpiIdrInfoGet( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId, SAHPI_IN SaHpiIdrIdT IdrId, SAHPI_OUT SaHpiIdrInfoT *IdrInfo) { SaHpiRptEntryT *res; SaHpiRdrT *rdr; SaErrorT rv = SA_OK; /* Default to SA_OK */ SaHpiDomainIdT did; struct oh_domain *d = NULL; struct oh_handler *h = NULL; SaErrorT (*set_func)(void *, SaHpiResourceIdT, SaHpiIdrIdT, SaHpiIdrInfoT *); if (IdrInfo == NULL) { err("NULL IdrInfo"); return SA_ERR_HPI_INVALID_PARAMS; } OH_CHECK_INIT_STATE(SessionId); OH_GET_DID(SessionId, did); OH_GET_DOMAIN(did, d); /* Lock domain */ OH_RESOURCE_GET(d, ResourceId, res); /* Interface and conformance checking */ if(!(res->ResourceCapabilities & SAHPI_CAPABILITY_INVENTORY_DATA)) { err("Resource %d in Domain %d doesn't have inventory data", ResourceId,did); oh_release_domain(d); /* Unlock domain */ return SA_ERR_HPI_CAPABILITY; } rdr = oh_get_rdr_by_type(&(d->rpt), ResourceId, SAHPI_INVENTORY_RDR, IdrId); if (!rdr) { oh_release_domain(d); /* Unlock domain */ return SA_ERR_HPI_NOT_PRESENT; } OH_HANDLER_GET(d, ResourceId, h); oh_release_domain(d); /* Unlock domain */ set_func = h ? h->abi->get_idr_info : NULL; if (!set_func) { oh_release_handler(h); err("Plugin does not have this function in jump table."); return SA_ERR_HPI_INVALID_CMD; } /* Access Inventory Info from plugin */ dbg("Access IdrInfo from plugin."); rv = set_func(h->hnd, ResourceId, IdrId, IdrInfo); oh_release_handler(h); return rv; } SaErrorT SAHPI_API saHpiIdrAreaHeaderGet( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId, SAHPI_IN SaHpiIdrIdT IdrId, SAHPI_IN SaHpiIdrAreaTypeT AreaType, SAHPI_IN SaHpiEntryIdT AreaId, SAHPI_OUT SaHpiEntryIdT *NextAreaId, SAHPI_OUT SaHpiIdrAreaHeaderT *Header) { SaHpiRptEntryT *res; SaHpiRdrT *rdr; SaErrorT rv = SA_OK; /* Default to SA_OK */ SaHpiDomainIdT did; struct oh_domain *d = NULL; struct oh_handler *h; SaErrorT (*set_func)(void *, SaHpiResourceIdT, SaHpiIdrIdT, SaHpiIdrAreaTypeT, SaHpiEntryIdT, SaHpiEntryIdT *, SaHpiIdrAreaHeaderT *); if ( ((AreaType < SAHPI_IDR_AREATYPE_INTERNAL_USE) || ((AreaType > SAHPI_IDR_AREATYPE_PRODUCT_INFO) && (AreaType != SAHPI_IDR_AREATYPE_UNSPECIFIED) && (AreaType != SAHPI_IDR_AREATYPE_OEM)) || (AreaId == SAHPI_LAST_ENTRY)|| (NextAreaId == NULL) || (Header == NULL))) { err("Invalid Parameters"); return SA_ERR_HPI_INVALID_PARAMS; } OH_CHECK_INIT_STATE(SessionId); OH_GET_DID(SessionId, did); OH_GET_DOMAIN(did, d); /* Lock domain */ OH_RESOURCE_GET_CHECK(d, ResourceId, res); /* Interface and conformance checking */ if(!(res->ResourceCapabilities & SAHPI_CAPABILITY_INVENTORY_DATA)) { err("Resource %d in Domain %d doesn't have inventory data", ResourceId,did); oh_release_domain(d); /* Unlock domain */ return SA_ERR_HPI_CAPABILITY; } rdr = oh_get_rdr_by_type(&(d->rpt), ResourceId, SAHPI_INVENTORY_RDR, IdrId); if (!rdr) { oh_release_domain(d); /* Unlock domain */ return SA_ERR_HPI_NOT_PRESENT; } OH_HANDLER_GET(d, ResourceId, h); oh_release_domain(d); /* Unlock domain */ set_func = h ? h->abi->get_idr_area_header : NULL; if (!set_func) { oh_release_handler(h); err("Plugin does not have this function in jump table."); return SA_ERR_HPI_INVALID_CMD; } /* Access Inventory Info from plugin */ dbg("Access IdrAreaHeader from plugin."); rv = set_func(h->hnd, ResourceId, IdrId, AreaType, AreaId, NextAreaId, Header); oh_release_handler(h); return rv; } SaErrorT SAHPI_API saHpiIdrAreaAdd( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId, SAHPI_IN SaHpiIdrIdT IdrId, SAHPI_IN SaHpiIdrAreaTypeT AreaType, SAHPI_OUT SaHpiEntryIdT *AreaId) { SaHpiRptEntryT *res; SaHpiRdrT *rdr; SaErrorT rv = SA_OK; /* Default to SA_OK */ SaHpiDomainIdT did; struct oh_domain *d = NULL; struct oh_handler *h; SaErrorT (*set_func)(void *, SaHpiResourceIdT, SaHpiIdrIdT, SaHpiIdrAreaTypeT, SaHpiEntryIdT *); if (!oh_lookup_idrareatype(AreaType) || AreaId == NULL) { err("Invalid Parameters"); return SA_ERR_HPI_INVALID_PARAMS; } else if (AreaType == SAHPI_IDR_AREATYPE_UNSPECIFIED) { err("AreaType == SAHPI_IDR_AREATYPE_UNSPECIFIED"); return SA_ERR_HPI_INVALID_DATA; } OH_CHECK_INIT_STATE(SessionId); OH_GET_DID(SessionId, did); OH_GET_DOMAIN(did, d); /* Lock domain */ OH_RESOURCE_GET_CHECK(d, ResourceId, res); /* Interface and conformance checking */ if(!(res->ResourceCapabilities & SAHPI_CAPABILITY_INVENTORY_DATA)) { err("Resource %d in Domain %d doesn't have inventory data", ResourceId,did); oh_release_domain(d); /* Unlock domain */ return SA_ERR_HPI_CAPABILITY; } rdr = oh_get_rdr_by_type(&(d->rpt), ResourceId, SAHPI_INVENTORY_RDR, IdrId); if (!rdr) { oh_release_domain(d); /* Unlock domain */ return SA_ERR_HPI_NOT_PRESENT; } OH_HANDLER_GET(d, ResourceId, h); oh_release_domain(d); /* Unlock domain */ set_func = h ? h->abi->add_idr_area : NULL; if (!set_func) { oh_release_handler(h); err("Plugin does not have this function in jump table."); return SA_ERR_HPI_INVALID_CMD; } /* Access Inventory Info from plugin */ dbg("Access IdrAreaAdd from plugin."); rv = set_func(h->hnd, ResourceId, IdrId, AreaType, AreaId); oh_release_handler(h); return rv; } SaErrorT SAHPI_API saHpiIdrAreaAddById( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId, SAHPI_IN SaHpiIdrIdT IdrId, SAHPI_IN SaHpiIdrAreaTypeT AreaType, SAHPI_IN SaHpiEntryIdT AreaId) { SaHpiRptEntryT *rpte; SaHpiRdrT *rdr; SaErrorT error = SA_OK; SaHpiDomainIdT did; struct oh_domain *d = NULL; struct oh_handler *h = NULL; SaHpiIdrInfoT info; SaHpiIdrAreaHeaderT header; SaHpiEntryIdT next; SaErrorT (*add_idr_area_id)(void *, SaHpiResourceIdT, SaHpiIdrIdT, SaHpiIdrAreaTypeT, SaHpiEntryIdT); SaErrorT (*get_idr_info)(void *hnd, SaHpiResourceIdT rid, SaHpiIdrIdT idrid, SaHpiIdrInfoT *idrinfo); SaErrorT (*get_idr_area_header)(void *hnd, SaHpiResourceIdT rid, SaHpiIdrIdT idrid, SaHpiIdrAreaTypeT areatype, SaHpiEntryIdT areaid, SaHpiEntryIdT *nextareaid, SaHpiIdrAreaHeaderT *header); if (!oh_lookup_idrareatype(AreaType) || AreaId == SAHPI_LAST_ENTRY) { return SA_ERR_HPI_INVALID_PARAMS; } else if (AreaType == SAHPI_IDR_AREATYPE_UNSPECIFIED) { return SA_ERR_HPI_INVALID_DATA; } OH_CHECK_INIT_STATE(SessionId); OH_GET_DID(SessionId, did); OH_GET_DOMAIN(did, d); /* Lock domain */ OH_RESOURCE_GET_CHECK(d, ResourceId, rpte); /* Interface and conformance checking */ if(!(rpte->ResourceCapabilities & SAHPI_CAPABILITY_INVENTORY_DATA)) { oh_release_domain(d); /* Unlock domain */ return SA_ERR_HPI_CAPABILITY; } rdr = oh_get_rdr_by_type(&(d->rpt), ResourceId, SAHPI_INVENTORY_RDR, IdrId); if (!rdr) { oh_release_domain(d); /* Unlock domain */ return SA_ERR_HPI_NOT_PRESENT; } OH_HANDLER_GET(d, ResourceId, h); oh_release_domain(d); /* Unlock domain */ /* Check if IDR is read-only */ get_idr_info = h ? h->abi->get_idr_info : NULL; if (!get_idr_info) { oh_release_handler(h); return SA_ERR_HPI_INTERNAL_ERROR; } error = get_idr_info(h->hnd, ResourceId, IdrId, &info); if (error != SA_OK) { oh_release_handler(h); return SA_ERR_HPI_NOT_PRESENT; } else if (info.ReadOnly) { oh_release_handler(h); return SA_ERR_HPI_READ_ONLY; } /* Check if the AreaId requested already exists */ get_idr_area_header = h ? h->abi->get_idr_area_header : NULL; if (!get_idr_area_header) { oh_release_handler(h); return SA_ERR_HPI_INTERNAL_ERROR; } error = get_idr_area_header(h->hnd, ResourceId, IdrId, AreaType, AreaId, &next, &header); if (error == SA_OK) { oh_release_handler(h); return SA_ERR_HPI_DUPLICATE; } add_idr_area_id = h ? h->abi->add_idr_area_id : NULL; if (!add_idr_area_id) { oh_release_handler(h); return SA_ERR_HPI_INTERNAL_ERROR; } error = add_idr_area_id(h->hnd, ResourceId, IdrId, AreaType, AreaId); oh_release_handler(h); return error; } SaErrorT SAHPI_API saHpiIdrAreaDelete( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId, SAHPI_IN SaHpiIdrIdT IdrId, SAHPI_IN SaHpiEntryIdT AreaId) { SaHpiRptEntryT *res; SaHpiRdrT *rdr; SaErrorT rv = SA_OK; /* Default to SA_OK */ SaHpiDomainIdT did; struct oh_domain *d = NULL; struct oh_handler *h; SaErrorT (*set_func)(void *, SaHpiResourceIdT, SaHpiIdrIdT, SaHpiEntryIdT); if (AreaId == SAHPI_LAST_ENTRY) { err("Invalid Parameters"); return SA_ERR_HPI_INVALID_PARAMS; } OH_CHECK_INIT_STATE(SessionId); OH_GET_DID(SessionId, did); OH_GET_DOMAIN(did, d); /* Lock domain */ OH_RESOURCE_GET_CHECK(d, ResourceId, res); /* Interface and conformance checking */ if(!(res->ResourceCapabilities & SAHPI_CAPABILITY_INVENTORY_DATA)) { err("Resource %d in Domain %d doesn't have inventory data", ResourceId,did); oh_release_domain(d); /* Unlock domain */ return SA_ERR_HPI_CAPABILITY; } rdr = oh_get_rdr_by_type(&(d->rpt), ResourceId, SAHPI_INVENTORY_RDR, IdrId); if (!rdr) { oh_release_domain(d); /* Unlock domain */ return SA_ERR_HPI_NOT_PRESENT; } OH_HANDLER_GET(d, ResourceId, h); oh_release_domain(d); /* Unlock domain */ set_func = h ? h->abi->del_idr_area : NULL; if (!set_func) { oh_release_handler(h); err("Plugin does not have this function in jump table."); return SA_ERR_HPI_INVALID_CMD; } /* Access Inventory Info from plugin */ dbg("Access IdrAreaDelete from plugin."); rv = set_func(h->hnd, ResourceId, IdrId, AreaId); oh_release_handler(h); return rv; } SaErrorT SAHPI_API saHpiIdrFieldGet( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId, SAHPI_IN SaHpiIdrIdT IdrId, SAHPI_IN SaHpiEntryIdT AreaId, SAHPI_IN SaHpiIdrFieldTypeT FieldType, SAHPI_IN SaHpiEntryIdT FieldId, SAHPI_OUT SaHpiEntryIdT *NextFieldId, SAHPI_OUT SaHpiIdrFieldT *Field) { SaHpiRptEntryT *res; SaHpiRdrT *rdr; SaErrorT rv = SA_OK; /* Default to SA_OK */ SaHpiDomainIdT did; struct oh_domain *d = NULL; struct oh_handler *h; SaErrorT (*set_func)(void *, SaHpiResourceIdT, SaHpiIdrIdT, SaHpiEntryIdT, SaHpiIdrFieldTypeT, SaHpiEntryIdT, SaHpiEntryIdT *, SaHpiIdrFieldT * ); if (!Field || !oh_lookup_idrfieldtype(FieldType) || AreaId == SAHPI_LAST_ENTRY || FieldId == SAHPI_LAST_ENTRY || !NextFieldId) { err("Invalid Parameters"); return SA_ERR_HPI_INVALID_PARAMS; } OH_CHECK_INIT_STATE(SessionId); OH_GET_DID(SessionId, did); OH_GET_DOMAIN(did, d); /* Lock domain */ OH_RESOURCE_GET_CHECK(d, ResourceId, res); /* Interface and conformance checking */ if(!(res->ResourceCapabilities & SAHPI_CAPABILITY_INVENTORY_DATA)) { err("Resource %d in Domain %d doesn't have inventory data", ResourceId,did); oh_release_domain(d); /* Unlock domain */ return SA_ERR_HPI_CAPABILITY; } rdr = oh_get_rdr_by_type(&(d->rpt), ResourceId, SAHPI_INVENTORY_RDR, IdrId); if (!rdr) { oh_release_domain(d); /* Unlock domain */ err("Inventory RDR was not found."); return SA_ERR_HPI_NOT_PRESENT; } OH_HANDLER_GET(d, ResourceId, h); oh_release_domain(d); /* Unlock domain */ set_func = h ? h->abi->get_idr_field : NULL; if (!set_func) { oh_release_handler(h); err("Plugin does not have this function in jump table."); return SA_ERR_HPI_INVALID_CMD; } /* Access Inventory Info from plugin */ dbg("Access saHpiIdrFieldGet from plugin."); rv = set_func(h->hnd, ResourceId, IdrId, AreaId, FieldType, FieldId, NextFieldId, Field); oh_release_handler(h); return rv; } SaErrorT SAHPI_API saHpiIdrFieldAdd( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId, SAHPI_IN SaHpiIdrIdT IdrId, SAHPI_INOUT SaHpiIdrFieldT *Field) { SaHpiRptEntryT *res; SaHpiRdrT *rdr; SaErrorT rv = SA_OK; /* Default to SA_OK */ SaHpiDomainIdT did; struct oh_domain *d = NULL; struct oh_handler *h; SaErrorT (*set_func)(void *, SaHpiResourceIdT, SaHpiIdrIdT, SaHpiIdrFieldT * ); if (!Field) { err("Invalid Parameter: Field is NULL "); return SA_ERR_HPI_INVALID_PARAMS; } else if (!oh_lookup_idrfieldtype(Field->Type)) { err("Invalid Parameter in Field->Type"); return SA_ERR_HPI_INVALID_PARAMS; } else if (Field->Type == SAHPI_IDR_FIELDTYPE_UNSPECIFIED) { err("Invalid unspecified type"); return SA_ERR_HPI_INVALID_PARAMS; } else if (oh_valid_textbuffer(&Field->Field) != SAHPI_TRUE) { err("invalid text buffer"); return SA_ERR_HPI_INVALID_PARAMS; } OH_CHECK_INIT_STATE(SessionId); OH_GET_DID(SessionId, did); OH_GET_DOMAIN(did, d); /* Lock domain */ OH_RESOURCE_GET_CHECK(d, ResourceId, res); /* Interface and conformance checking */ if(!(res->ResourceCapabilities & SAHPI_CAPABILITY_INVENTORY_DATA)) { err("Resource %d in Domain %d doesn't have inventory data", ResourceId,did); oh_release_domain(d); /* Unlock domain */ return SA_ERR_HPI_CAPABILITY; } rdr = oh_get_rdr_by_type(&(d->rpt), ResourceId, SAHPI_INVENTORY_RDR, IdrId); if (!rdr) { oh_release_domain(d); /* Unlock domain */ err("Could not find inventory rdr"); return SA_ERR_HPI_NOT_PRESENT; } OH_HANDLER_GET(d, ResourceId, h); oh_release_domain(d); /* Unlock domain */ set_func = h ? h->abi->add_idr_field : NULL; if (!set_func) { oh_release_handler(h); err("Plugin does not have this function in jump table."); return SA_ERR_HPI_INVALID_CMD; } /* Access Inventory Info from plugin */ dbg("Access saHpiIdrFieldAdd from plugin."); rv = set_func(h->hnd, ResourceId, IdrId, Field); oh_release_handler(h); return rv; } SaErrorT SAHPI_API saHpiIdrFieldAddById( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId, SAHPI_IN SaHpiIdrIdT IdrId, SAHPI_INOUT SaHpiIdrFieldT *Field) { SaHpiRptEntryT *rpte; SaHpiRdrT *rdr; SaErrorT error = SA_OK; SaHpiDomainIdT did; struct oh_domain *d = NULL; struct oh_handler *h = NULL; SaHpiEntryIdT nextid; SaHpiIdrAreaHeaderT header; SaHpiIdrFieldT field; SaErrorT (*add_idr_field_id)(void *, SaHpiResourceIdT, SaHpiIdrIdT, SaHpiIdrFieldT *); SaErrorT (*get_idr_area_header)(void *hnd, SaHpiResourceIdT rid, SaHpiIdrIdT idrid, SaHpiIdrAreaTypeT areatype, SaHpiEntryIdT areaid, SaHpiEntryIdT *nextareaid, SaHpiIdrAreaHeaderT *header); SaErrorT (*get_idr_field)(void *hnd, SaHpiResourceIdT rid, SaHpiIdrIdT idrid, SaHpiEntryIdT areaid, SaHpiIdrFieldTypeT fieldtype, SaHpiEntryIdT fieldid, SaHpiEntryIdT *nextfieldid, SaHpiIdrFieldT *field); if (!Field) { return SA_ERR_HPI_INVALID_PARAMS; } else if (!oh_lookup_idrfieldtype(Field->Type)) { return SA_ERR_HPI_INVALID_PARAMS; } else if (Field->Type == SAHPI_IDR_FIELDTYPE_UNSPECIFIED) { return SA_ERR_HPI_INVALID_PARAMS; } else if (oh_valid_textbuffer(&Field->Field) != SAHPI_TRUE) { return SA_ERR_HPI_INVALID_PARAMS; } else if (Field->AreaId == SAHPI_LAST_ENTRY || Field->FieldId == SAHPI_LAST_ENTRY) { return SA_ERR_HPI_INVALID_PARAMS; } OH_CHECK_INIT_STATE(SessionId); OH_GET_DID(SessionId, did); OH_GET_DOMAIN(did, d); /* Lock domain */ OH_RESOURCE_GET_CHECK(d, ResourceId, rpte); /* Interface and conformance checking */ if(!(rpte->ResourceCapabilities & SAHPI_CAPABILITY_INVENTORY_DATA)) { oh_release_domain(d); /* Unlock domain */ return SA_ERR_HPI_CAPABILITY; } rdr = oh_get_rdr_by_type(&(d->rpt), ResourceId, SAHPI_INVENTORY_RDR, IdrId); if (!rdr) { oh_release_domain(d); /* Unlock domain */ return SA_ERR_HPI_NOT_PRESENT; } OH_HANDLER_GET(d, ResourceId, h); oh_release_domain(d); /* Unlock domain */ /* Check if AreaId specified in Field exists */ get_idr_area_header = h ? h->abi->get_idr_area_header : NULL; if (!get_idr_area_header) { oh_release_handler(h); return SA_ERR_HPI_INTERNAL_ERROR; } error = get_idr_area_header(h->hnd, ResourceId, IdrId, SAHPI_IDR_AREATYPE_UNSPECIFIED, Field->AreaId, &nextid, &header); if (error != SA_OK) { oh_release_handler(h); return SA_ERR_HPI_NOT_PRESENT; } else if (header.ReadOnly) { oh_release_handler(h); return SA_ERR_HPI_READ_ONLY; } /* Check if FieldId requested does not already exists */ get_idr_field = h ? h->abi->get_idr_field : NULL; if (!get_idr_field) { oh_release_handler(h); return SA_ERR_HPI_INTERNAL_ERROR; } error = get_idr_field(h->hnd, ResourceId, IdrId, Field->AreaId, SAHPI_IDR_FIELDTYPE_UNSPECIFIED, Field->FieldId, &nextid, &field); if (error == SA_OK) { oh_release_handler(h); return SA_ERR_HPI_DUPLICATE; } /* All checks done. Pass call down to plugin */ add_idr_field_id = h ? h->abi->add_idr_field_id : NULL; if (!add_idr_field_id) { oh_release_handler(h); return SA_ERR_HPI_INTERNAL_ERROR; } error = add_idr_field_id(h->hnd, ResourceId, IdrId, Field); oh_release_handler(h); return error; } SaErrorT SAHPI_API saHpiIdrFieldSet( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId, SAHPI_IN SaHpiIdrIdT IdrId, SAHPI_IN SaHpiIdrFieldT *Field) { SaHpiRptEntryT *res; SaHpiRdrT *rdr; SaErrorT rv = SA_OK; /* Default to SA_OK */ SaHpiDomainIdT did; struct oh_domain *d = NULL; struct oh_handler *h; SaErrorT (*set_func)(void *, SaHpiResourceIdT, SaHpiIdrIdT, SaHpiIdrFieldT * ); if (!Field) { err("Invalid Parameter: Field is NULL "); return SA_ERR_HPI_INVALID_PARAMS; } else if (Field->Type > SAHPI_IDR_FIELDTYPE_CUSTOM) { err("Invalid Parameters in Field->Type"); return SA_ERR_HPI_INVALID_PARAMS; } else if (!oh_valid_textbuffer(&Field->Field)) { err("Invalid Text Buffer in field."); return SA_ERR_HPI_INVALID_PARAMS; } OH_CHECK_INIT_STATE(SessionId); OH_GET_DID(SessionId, did); OH_GET_DOMAIN(did, d); /* Lock domain */ OH_RESOURCE_GET_CHECK(d, ResourceId, res); /* Interface and conformance checking */ if(!(res->ResourceCapabilities & SAHPI_CAPABILITY_INVENTORY_DATA)) { err("Resource %d in Domain %d doesn't have inventory data", ResourceId,did); oh_release_domain(d); /* Unlock domain */ return SA_ERR_HPI_CAPABILITY; } rdr = oh_get_rdr_by_type(&(d->rpt), ResourceId, SAHPI_INVENTORY_RDR, IdrId); if (!rdr) { oh_release_domain(d); /* Unlock domain */ return SA_ERR_HPI_NOT_PRESENT; } OH_HANDLER_GET(d, ResourceId, h); oh_release_domain(d); /* Unlock domain */ set_func = h ? h->abi->set_idr_field : NULL; if (!set_func) { oh_release_handler(h); err("Plugin does not have this function in jump table."); return SA_ERR_HPI_INVALID_CMD; } /* Access Inventory Info from plugin */ dbg("Access saHpiIdrFieldSet from plugin."); rv = set_func(h->hnd, ResourceId, IdrId, Field); oh_release_handler(h); return rv; } SaErrorT SAHPI_API saHpiIdrFieldDelete( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId, SAHPI_IN SaHpiIdrIdT IdrId, SAHPI_IN SaHpiEntryIdT AreaId, SAHPI_IN SaHpiEntryIdT FieldId) { SaHpiRptEntryT *res; SaHpiRdrT *rdr; SaErrorT rv = SA_OK; /* Default to SA_OK */ SaHpiDomainIdT did; struct oh_handler *h; struct oh_domain *d = NULL; SaErrorT (*set_func)(void *, SaHpiResourceIdT, SaHpiIdrIdT, SaHpiEntryIdT, SaHpiEntryIdT ); if (FieldId == SAHPI_LAST_ENTRY || AreaId == SAHPI_LAST_ENTRY) { err("Invalid Parameters"); return SA_ERR_HPI_INVALID_PARAMS; } OH_CHECK_INIT_STATE(SessionId); OH_GET_DID(SessionId, did); OH_GET_DOMAIN(did, d); /* Lock domain */ OH_RESOURCE_GET_CHECK(d, ResourceId, res); /* Interface and conformance checking */ if(!(res->ResourceCapabilities & SAHPI_CAPABILITY_INVENTORY_DATA)) { err("Resource %d in Domain %d doesn't have inventory data", ResourceId,did); oh_release_domain(d); /* Unlock domain */ return SA_ERR_HPI_CAPABILITY; } rdr = oh_get_rdr_by_type(&(d->rpt), ResourceId, SAHPI_INVENTORY_RDR, IdrId); if (!rdr) { oh_release_domain(d); /* Unlock domain */ return SA_ERR_HPI_NOT_PRESENT; } OH_HANDLER_GET(d, ResourceId, h); oh_release_domain(d); /* Unlock domain */ set_func = h ? h->abi->del_idr_field : NULL; if (!set_func) { oh_release_handler(h); err("Plugin does not have this function in jump table."); return SA_ERR_HPI_INVALID_CMD; } /* Access Inventory Info from plugin */ dbg("Access saHpiIdrFieldDelete from plugin."); rv = set_func(h->hnd, ResourceId, IdrId, AreaId, FieldId); oh_release_handler(h); return rv; } /* End of Inventory Functions */ /********************************************************************* * * Watchdog Functions * ********************************************************************/ SaErrorT SAHPI_API saHpiWatchdogTimerGet ( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId, SAHPI_IN SaHpiWatchdogNumT WatchdogNum, SAHPI_OUT SaHpiWatchdogT *Watchdog) { SaErrorT rv; SaErrorT (*get_func)(void *, SaHpiResourceIdT, SaHpiWatchdogNumT, SaHpiWatchdogT *); SaHpiRptEntryT *res; struct oh_handler *h; struct oh_domain *d = NULL; SaHpiDomainIdT did; if (!Watchdog) return SA_ERR_HPI_INVALID_PARAMS; OH_CHECK_INIT_STATE(SessionId); OH_GET_DID(SessionId, did); OH_GET_DOMAIN(did, d); /* Lock domain */ OH_RESOURCE_GET_CHECK(d, ResourceId, res); if(!(res->ResourceCapabilities & SAHPI_CAPABILITY_WATCHDOG)) { err("Resource %d in Domain %d doesn't have watchdog", ResourceId,did); oh_release_domain(d); /* Unlock domain */ return SA_ERR_HPI_CAPABILITY; } OH_HANDLER_GET(d, ResourceId, h); oh_release_domain(d); /* Unlock domain */ get_func = h ? h->abi->get_watchdog_info : NULL; if (!get_func) { oh_release_handler(h); return SA_ERR_HPI_INVALID_CMD; } rv = get_func(h->hnd, ResourceId, WatchdogNum, Watchdog); oh_release_handler(h); return rv; } SaErrorT SAHPI_API saHpiWatchdogTimerSet ( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId, SAHPI_IN SaHpiWatchdogNumT WatchdogNum, SAHPI_IN SaHpiWatchdogT *Watchdog) { SaErrorT rv; SaErrorT (*set_func)(void *, SaHpiResourceIdT, SaHpiWatchdogNumT, SaHpiWatchdogT *); SaHpiRptEntryT *res; struct oh_handler *h; struct oh_domain *d = NULL; SaHpiDomainIdT did; if (!Watchdog || !oh_lookup_watchdogtimeruse(Watchdog->TimerUse) || !oh_lookup_watchdogaction(Watchdog->TimerAction) || !oh_lookup_watchdogpretimerinterrupt(Watchdog->PretimerInterrupt)) { return SA_ERR_HPI_INVALID_PARAMS; } if (Watchdog->PreTimeoutInterval > Watchdog->InitialCount) { return SA_ERR_HPI_INVALID_DATA; } OH_CHECK_INIT_STATE(SessionId); OH_GET_DID(SessionId, did); OH_GET_DOMAIN(did, d); /* Lock domain */ OH_RESOURCE_GET_CHECK(d, ResourceId, res); if(!(res->ResourceCapabilities & SAHPI_CAPABILITY_WATCHDOG)) { err("Resource %d in Domain %d doesn't have watchdog", ResourceId,did); oh_release_domain(d); /* Unlock domain */ return SA_ERR_HPI_CAPABILITY; } OH_HANDLER_GET(d, ResourceId, h); oh_release_domain(d); /* Unlock domain */ set_func = h ? h->abi->set_watchdog_info : NULL; if (!set_func) { oh_release_handler(h); return SA_ERR_HPI_INVALID_CMD; } rv = set_func(h->hnd, ResourceId, WatchdogNum, Watchdog); oh_release_handler(h); return rv; } SaErrorT SAHPI_API saHpiWatchdogTimerReset ( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId, SAHPI_IN SaHpiWatchdogNumT WatchdogNum) { SaErrorT rv; SaErrorT (*reset_func)(void *, SaHpiResourceIdT, SaHpiWatchdogNumT); SaHpiRptEntryT *res; struct oh_handler *h; struct oh_domain *d = NULL; SaHpiDomainIdT did; OH_CHECK_INIT_STATE(SessionId); OH_GET_DID(SessionId, did); OH_GET_DOMAIN(did, d); /* Lock domain */ OH_RESOURCE_GET_CHECK(d, ResourceId, res); if(!(res->ResourceCapabilities & SAHPI_CAPABILITY_WATCHDOG)) { err("Resource %d in Domain %d doesn't have watchdog", ResourceId,did); oh_release_domain(d); /* Unlock domain */ return SA_ERR_HPI_CAPABILITY; } OH_HANDLER_GET(d, ResourceId, h); oh_release_domain(d); /* Unlock domain */ reset_func = h ? h->abi->reset_watchdog : NULL; if (!reset_func) { oh_release_handler(h); return SA_ERR_HPI_INVALID_CMD; } rv = reset_func(h->hnd, ResourceId, WatchdogNum); oh_release_handler(h); return rv; } /******************************************************************************* * * Annunciator Functions * ******************************************************************************/ SaErrorT SAHPI_API saHpiAnnunciatorGetNext( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId, SAHPI_IN SaHpiAnnunciatorNumT AnnunciatorNum, SAHPI_IN SaHpiSeverityT Severity, SAHPI_IN SaHpiBoolT UnacknowledgedOnly, SAHPI_INOUT SaHpiAnnouncementT *Announcement) { SaErrorT (*ann_func)(void *, SaHpiResourceIdT, SaHpiAnnunciatorNumT, SaHpiSeverityT, SaHpiBoolT, SaHpiAnnouncementT *); SaErrorT rv; SaHpiRptEntryT *res; SaHpiRdrT *rdr; SaHpiDomainIdT did; struct oh_handler *h; struct oh_domain *d = NULL; if (Announcement == NULL) return SA_ERR_HPI_INVALID_PARAMS; if (!oh_lookup_severity(Severity)) return SA_ERR_HPI_INVALID_PARAMS; OH_CHECK_INIT_STATE(SessionId); OH_GET_DID(SessionId, did); OH_GET_DOMAIN(did, d); /* Lock domain */ OH_RESOURCE_GET_CHECK(d, ResourceId, res); if(!(res->ResourceCapabilities & SAHPI_CAPABILITY_ANNUNCIATOR)) { err("Resource %d in Domain %d doesn't have annunciators", ResourceId, did); oh_release_domain(d); /* Unlock domain */ return SA_ERR_HPI_CAPABILITY; } rdr = oh_get_rdr_by_type(&(d->rpt), ResourceId, SAHPI_ANNUNCIATOR_RDR, AnnunciatorNum); if (!rdr) { err("No Annunciator num %d found for Resource %d in Domain %d", AnnunciatorNum, ResourceId, did); oh_release_domain(d); /* Unlock domain */ return SA_ERR_HPI_NOT_PRESENT; } OH_HANDLER_GET(d, ResourceId, h); oh_release_domain(d); /* talk to the plugin */ ann_func = h ? h->abi->get_next_announce : NULL; if (!ann_func) { oh_release_handler(h); return SA_ERR_HPI_INVALID_CMD; } rv = ann_func(h->hnd, ResourceId, AnnunciatorNum, Severity, UnacknowledgedOnly, Announcement); oh_release_handler(h); return rv; } SaErrorT SAHPI_API saHpiAnnunciatorGet( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId, SAHPI_IN SaHpiAnnunciatorNumT AnnunciatorNum, SAHPI_IN SaHpiEntryIdT EntryId, SAHPI_OUT SaHpiAnnouncementT *Announcement) { SaErrorT (*ann_func)(void *, SaHpiResourceIdT, SaHpiAnnunciatorNumT, SaHpiEntryIdT, SaHpiAnnouncementT *); SaErrorT rv; SaHpiRptEntryT *res; SaHpiRdrT *rdr; SaHpiDomainIdT did; struct oh_handler *h; struct oh_domain *d = NULL; if (Announcement == NULL || EntryId == SAHPI_FIRST_ENTRY || EntryId == SAHPI_LAST_ENTRY) return SA_ERR_HPI_INVALID_PARAMS; OH_CHECK_INIT_STATE(SessionId); OH_GET_DID(SessionId, did); OH_GET_DOMAIN(did, d); /* Lock domain */ OH_RESOURCE_GET_CHECK(d, ResourceId, res); if(!(res->ResourceCapabilities & SAHPI_CAPABILITY_ANNUNCIATOR)) { err("Resource %d in Domain %d doesn't have annunciators", ResourceId, did); oh_release_domain(d); /* Unlock domain */ return SA_ERR_HPI_CAPABILITY; } rdr = oh_get_rdr_by_type(&(d->rpt), ResourceId, SAHPI_ANNUNCIATOR_RDR, AnnunciatorNum); if (!rdr) { err("No Annunciator num %d found for Resource %d in Domain %d", AnnunciatorNum, ResourceId, did); oh_release_domain(d); /* Unlock domain */ return SA_ERR_HPI_NOT_PRESENT; } OH_HANDLER_GET(d, ResourceId, h); oh_release_domain(d); /* talk to the plugin */ ann_func = h ? h->abi->get_announce : NULL; if (!ann_func) { oh_release_handler(h); return SA_ERR_HPI_INVALID_CMD; } rv = ann_func(h->hnd, ResourceId, AnnunciatorNum, EntryId, Announcement); oh_release_handler(h); return rv; } SaErrorT SAHPI_API saHpiAnnunciatorAcknowledge( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId, SAHPI_IN SaHpiAnnunciatorNumT AnnunciatorNum, SAHPI_IN SaHpiEntryIdT EntryId, SAHPI_IN SaHpiSeverityT Severity) { SaErrorT (*ann_func)(void *, SaHpiResourceIdT, SaHpiAnnunciatorNumT, SaHpiEntryIdT, SaHpiSeverityT); SaErrorT rv; SaHpiRptEntryT *res; SaHpiRdrT *rdr; SaHpiDomainIdT did; struct oh_handler *h; struct oh_domain *d = NULL; if ((EntryId == SAHPI_ENTRY_UNSPECIFIED) && !oh_lookup_severity(Severity)) { return SA_ERR_HPI_INVALID_PARAMS; } OH_CHECK_INIT_STATE(SessionId); OH_GET_DID(SessionId, did); OH_GET_DOMAIN(did, d); /* Lock domain */ OH_RESOURCE_GET_CHECK(d, ResourceId, res); if(!(res->ResourceCapabilities & SAHPI_CAPABILITY_ANNUNCIATOR)) { err("Resource %d in Domain %d doesn't have annunciators", ResourceId, did); oh_release_domain(d); /* Unlock domain */ return SA_ERR_HPI_CAPABILITY; } rdr = oh_get_rdr_by_type(&(d->rpt), ResourceId, SAHPI_ANNUNCIATOR_RDR, AnnunciatorNum); if (!rdr) { err("No Annunciator num %d found for Resource %d in Domain %d", AnnunciatorNum, ResourceId, did); oh_release_domain(d); /* Unlock domain */ return SA_ERR_HPI_NOT_PRESENT; } OH_HANDLER_GET(d, ResourceId, h); oh_release_domain(d); /* talk to the plugin */ ann_func = h ? h->abi->ack_announce : NULL; if (!ann_func) { oh_release_handler(h); return SA_ERR_HPI_INVALID_CMD; } rv = ann_func(h->hnd, ResourceId, AnnunciatorNum, EntryId, Severity); oh_release_handler(h); return rv; } SaErrorT SAHPI_API saHpiAnnunciatorAdd( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId, SAHPI_IN SaHpiAnnunciatorNumT AnnunciatorNum, SAHPI_INOUT SaHpiAnnouncementT *Announcement) { SaErrorT (*ann_func)(void *, SaHpiResourceIdT, SaHpiAnnunciatorNumT, SaHpiAnnouncementT *); SaErrorT rv; SaHpiRptEntryT *res; SaHpiRdrT *rdr; SaHpiDomainIdT did; SaHpiAnnunciatorModeT mode; struct oh_handler *h; struct oh_domain *d = NULL; if (Announcement == NULL) return SA_ERR_HPI_INVALID_PARAMS; if (Announcement->Severity == SAHPI_ALL_SEVERITIES || !oh_lookup_severity(Announcement->Severity) || !oh_valid_textbuffer(&Announcement->StatusCond.Data) || !oh_lookup_statuscondtype(Announcement->StatusCond.Type)|| Announcement->StatusCond.Name.Length > SA_HPI_MAX_NAME_LENGTH) return SA_ERR_HPI_INVALID_PARAMS; OH_CHECK_INIT_STATE(SessionId); OH_GET_DID(SessionId, did); OH_GET_DOMAIN(did, d); /* Lock domain */ OH_RESOURCE_GET_CHECK(d, ResourceId, res); if(!(res->ResourceCapabilities & SAHPI_CAPABILITY_ANNUNCIATOR)) { err("Resource %d in Domain %d doesn't have annunciators", ResourceId, did); oh_release_domain(d); /* Unlock domain */ return SA_ERR_HPI_CAPABILITY; } rdr = oh_get_rdr_by_type(&(d->rpt), ResourceId, SAHPI_ANNUNCIATOR_RDR, AnnunciatorNum); if (!rdr) { err("No Annunciator num %d found for Resource %d in Domain %d", AnnunciatorNum, ResourceId, did); oh_release_domain(d); /* Unlock domain */ return SA_ERR_HPI_NOT_PRESENT; } rv = saHpiAnnunciatorModeGet(SessionId, ResourceId, AnnunciatorNum, &mode); if(rv != SA_OK) { oh_release_domain(d); return rv; } if(mode == SAHPI_ANNUNCIATOR_MODE_AUTO) { oh_release_domain(d); return SA_ERR_HPI_READ_ONLY; } OH_HANDLER_GET(d, ResourceId, h); oh_release_domain(d); /* talk to the plugin */ ann_func = h ? h->abi->add_announce : NULL; if (!ann_func) { oh_release_handler(h); return SA_ERR_HPI_INVALID_CMD; } rv = ann_func(h->hnd, ResourceId, AnnunciatorNum, Announcement); oh_release_handler(h); return rv; } SaErrorT SAHPI_API saHpiAnnunciatorDelete( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId, SAHPI_IN SaHpiAnnunciatorNumT AnnunciatorNum, SAHPI_IN SaHpiEntryIdT EntryId, SAHPI_IN SaHpiSeverityT Severity) { SaErrorT (*ann_func)(void *, SaHpiResourceIdT, SaHpiAnnunciatorNumT, SaHpiEntryIdT, SaHpiSeverityT); SaErrorT rv; SaHpiRptEntryT *res; SaHpiRdrT *rdr; SaHpiDomainIdT did; SaHpiAnnunciatorModeT mode; struct oh_handler *h; struct oh_domain *d = NULL; if ((EntryId == SAHPI_ENTRY_UNSPECIFIED) && !oh_lookup_severity(Severity)) { err("Bad Severity %d passed in.", Severity); return SA_ERR_HPI_INVALID_PARAMS; } OH_CHECK_INIT_STATE(SessionId); OH_GET_DID(SessionId, did); OH_GET_DOMAIN(did, d); /* Lock domain */ OH_RESOURCE_GET_CHECK(d, ResourceId, res); if(!(res->ResourceCapabilities & SAHPI_CAPABILITY_ANNUNCIATOR)) { oh_release_domain(d); /* Unlock domain */ err("Resource %d in Domain %d doesn't have annunciators", ResourceId, did); return SA_ERR_HPI_CAPABILITY; } rdr = oh_get_rdr_by_type(&(d->rpt), ResourceId, SAHPI_ANNUNCIATOR_RDR, AnnunciatorNum); if (!rdr) { oh_release_domain(d); /* Unlock domain */ err("No Annunciator num %d found for Resource %d in Domain %d", AnnunciatorNum, ResourceId, did); return SA_ERR_HPI_NOT_PRESENT; } rv = saHpiAnnunciatorModeGet(SessionId, ResourceId, AnnunciatorNum, &mode); if(rv != SA_OK) { oh_release_domain(d); return rv; } if(mode == SAHPI_ANNUNCIATOR_MODE_AUTO) { oh_release_domain(d); return SA_ERR_HPI_READ_ONLY; } OH_HANDLER_GET(d, ResourceId, h); oh_release_domain(d); /* talk to the plugin */ ann_func = h ? h->abi->del_announce : NULL; if (!ann_func) { oh_release_handler(h); return SA_ERR_HPI_INVALID_CMD; } rv = ann_func(h->hnd, ResourceId, AnnunciatorNum, EntryId, Severity); oh_release_handler(h); return rv; } SaErrorT SAHPI_API saHpiAnnunciatorModeGet( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId, SAHPI_IN SaHpiAnnunciatorNumT AnnunciatorNum, SAHPI_OUT SaHpiAnnunciatorModeT *Mode) { SaErrorT (*ann_func)(void *, SaHpiResourceIdT, SaHpiAnnunciatorNumT, SaHpiAnnunciatorModeT *); SaErrorT rv; SaHpiRptEntryT *res; SaHpiRdrT *rdr; SaHpiDomainIdT did; struct oh_handler *h; struct oh_domain *d = NULL; if (Mode == NULL) return SA_ERR_HPI_INVALID_PARAMS; OH_CHECK_INIT_STATE(SessionId); OH_GET_DID(SessionId, did); OH_GET_DOMAIN(did, d); /* Lock domain */ OH_RESOURCE_GET_CHECK(d, ResourceId, res); if(!(res->ResourceCapabilities & SAHPI_CAPABILITY_ANNUNCIATOR)) { err("Resource %d in Domain %d doesn't have annunciators", ResourceId, did); oh_release_domain(d); /* Unlock domain */ return SA_ERR_HPI_CAPABILITY; } rdr = oh_get_rdr_by_type(&(d->rpt), ResourceId, SAHPI_ANNUNCIATOR_RDR, AnnunciatorNum); if (!rdr) { err("No Annunciator num %d found for Resource %d in Domain %d", AnnunciatorNum, ResourceId, did); oh_release_domain(d); /* Unlock domain */ return SA_ERR_HPI_NOT_PRESENT; } OH_HANDLER_GET(d, ResourceId, h); oh_release_domain(d); /* talk to the plugin */ ann_func = h ? h->abi->get_annunc_mode : NULL; if (!ann_func) { oh_release_handler(h); return SA_ERR_HPI_INVALID_CMD; } rv = ann_func(h->hnd, ResourceId, AnnunciatorNum, Mode); oh_release_handler(h); return rv; } SaErrorT SAHPI_API saHpiAnnunciatorModeSet( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId, SAHPI_IN SaHpiAnnunciatorNumT AnnunciatorNum, SAHPI_IN SaHpiAnnunciatorModeT Mode) { SaErrorT (*ann_func)(void *, SaHpiResourceIdT, SaHpiAnnunciatorNumT, SaHpiAnnunciatorModeT); SaErrorT rv; SaHpiRptEntryT *res; SaHpiRdrT *rdr; SaHpiDomainIdT did; struct oh_handler *h; struct oh_domain *d = NULL; /* if no valid mode, then this won't find a lookup */ if (!oh_lookup_annunciatormode(Mode)) { err("Invalid Annunciator Mode"); return SA_ERR_HPI_INVALID_PARAMS; } OH_CHECK_INIT_STATE(SessionId); OH_GET_DID(SessionId, did); OH_GET_DOMAIN(did, d); /* Lock domain */ OH_RESOURCE_GET_CHECK(d, ResourceId, res); if(!(res->ResourceCapabilities & SAHPI_CAPABILITY_ANNUNCIATOR)) { err("Resource %d in Domain %d doesn't have annunciators", ResourceId, did); oh_release_domain(d); /* Unlock domain */ return SA_ERR_HPI_CAPABILITY; } rdr = oh_get_rdr_by_type(&(d->rpt), ResourceId, SAHPI_ANNUNCIATOR_RDR, AnnunciatorNum); if (!rdr) { err("No Annunciator num %d found for Resource %d in Domain %d", AnnunciatorNum, ResourceId, did); oh_release_domain(d); /* Unlock domain */ return SA_ERR_HPI_NOT_PRESENT; } if (rdr->RdrTypeUnion.AnnunciatorRec.ModeReadOnly) { err("Can't set mode on a Read Only Annunciator"); oh_release_domain(d); /* Unlock domain */ return SA_ERR_HPI_READ_ONLY; } OH_HANDLER_GET(d, ResourceId, h); oh_release_domain(d); /* talk to the plugin */ ann_func = h ? h->abi->set_annunc_mode : NULL; if (!ann_func) { oh_release_handler(h); return SA_ERR_HPI_INVALID_CMD; } rv = ann_func(h->hnd, ResourceId, AnnunciatorNum, Mode); oh_release_handler(h); return rv; } /******************************************************************************* * * DIMI Functions * ******************************************************************************/ SaErrorT SAHPI_API saHpiDimiInfoGet ( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId, SAHPI_IN SaHpiDimiNumT DimiNum, SAHPI_OUT SaHpiDimiInfoT *DimiInfo) { SaHpiDomainIdT did; struct oh_domain *d = NULL; SaHpiRptEntryT *rpte = NULL; SaHpiRdrT *rdr = NULL; SaErrorT error = SA_OK; struct oh_handler *h = NULL; if (DimiInfo == NULL) { return SA_ERR_HPI_INVALID_PARAMS; } OH_CHECK_INIT_STATE(SessionId); OH_GET_DID(SessionId, did); OH_GET_DOMAIN(did, d); /* Lock domain */ OH_RESOURCE_GET_CHECK(d, ResourceId, rpte); if(!(rpte->ResourceCapabilities & SAHPI_CAPABILITY_DIMI)) { err("Resource %d in Domain %d doesn't does not support DIMIs", ResourceId, did); oh_release_domain(d); return SA_ERR_HPI_CAPABILITY; } rdr = oh_get_rdr_by_type(&(d->rpt), ResourceId, SAHPI_DIMI_RDR, DimiNum); if (!rdr) { err("No DIMI num %d found for Resource %d in Domain %d", DimiNum, ResourceId, did); oh_release_domain(d); return SA_ERR_HPI_NOT_PRESENT; } OH_HANDLER_GET(d, ResourceId, h); oh_release_domain(d); OH_CALL_ABI(h, get_dimi_info, SA_ERR_HPI_INVALID_CMD, error, ResourceId, DimiNum, DimiInfo); oh_release_handler(h); return error; } SaErrorT SAHPI_API saHpiDimiTestInfoGet ( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId, SAHPI_IN SaHpiDimiNumT DimiNum, SAHPI_IN SaHpiDimiTestNumT TestNum, SAHPI_OUT SaHpiDimiTestT *DimiTest) { SaHpiDomainIdT did; struct oh_domain *d = NULL; SaHpiRptEntryT *rpte = NULL; SaHpiRdrT *rdr = NULL; SaErrorT error = SA_OK; struct oh_handler *h = NULL; if (!DimiTest) return SA_ERR_HPI_INVALID_PARAMS; OH_CHECK_INIT_STATE(SessionId); OH_GET_DID(SessionId, did); OH_GET_DOMAIN(did, d); /* Lock domain */ OH_RESOURCE_GET_CHECK(d, ResourceId, rpte); if(!(rpte->ResourceCapabilities & SAHPI_CAPABILITY_DIMI)) { err("Resource %d in Domain %d doesn't does not support DIMIs", ResourceId, did); oh_release_domain(d); return SA_ERR_HPI_CAPABILITY; } rdr = oh_get_rdr_by_type(&(d->rpt), ResourceId, SAHPI_DIMI_RDR, DimiNum); if (!rdr) { err("No DIMI num %d found for Resource %d in Domain %d", DimiNum, ResourceId, did); oh_release_domain(d); return SA_ERR_HPI_NOT_PRESENT; } OH_HANDLER_GET(d, ResourceId, h); oh_release_domain(d); OH_CALL_ABI(h, get_dimi_test, SA_ERR_HPI_INVALID_CMD, error, ResourceId, DimiNum, TestNum, DimiTest); oh_release_handler(h); return error; } SaErrorT SAHPI_API saHpiDimiTestReadinessGet ( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId, SAHPI_IN SaHpiDimiNumT DimiNum, SAHPI_IN SaHpiDimiTestNumT TestNum, SAHPI_OUT SaHpiDimiReadyT *DimiReady) { SaHpiDomainIdT did; struct oh_domain *d = NULL; SaHpiRptEntryT *rpte = NULL; SaHpiRdrT *rdr = NULL; SaErrorT error = SA_OK; struct oh_handler *h = NULL; if (DimiReady == NULL) return SA_ERR_HPI_INVALID_PARAMS; OH_CHECK_INIT_STATE(SessionId); OH_GET_DID(SessionId, did); OH_GET_DOMAIN(did, d); /* Lock domain */ OH_RESOURCE_GET_CHECK(d, ResourceId, rpte); if (!(rpte->ResourceCapabilities & SAHPI_CAPABILITY_DIMI)) { err("Resource %d in Domain %d doesn't does not support DIMIs", ResourceId, did); oh_release_domain(d); return SA_ERR_HPI_CAPABILITY; } rdr = oh_get_rdr_by_type(&(d->rpt), ResourceId, SAHPI_DIMI_RDR, DimiNum); if (!rdr) { err("No DIMI num %d found for Resource %d in Domain %d", DimiNum, ResourceId, did); oh_release_domain(d); return SA_ERR_HPI_NOT_PRESENT; } OH_HANDLER_GET(d, ResourceId, h); oh_release_domain(d); OH_CALL_ABI(h, get_dimi_test_ready, SA_ERR_HPI_INVALID_CMD, error, ResourceId, DimiNum, TestNum, DimiReady); oh_release_handler(h); return error; } SaErrorT SAHPI_API saHpiDimiTestStart ( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId, SAHPI_IN SaHpiDimiNumT DimiNum, SAHPI_IN SaHpiDimiTestNumT TestNum, SAHPI_IN SaHpiUint8T NumberOfParams, SAHPI_IN SaHpiDimiTestVariableParamsT *ParamsList) { SaHpiDomainIdT did; struct oh_domain *d = NULL; SaHpiRptEntryT *rpte = NULL; SaHpiRdrT *rdr = NULL; SaErrorT error = SA_OK; struct oh_handler *h = NULL; if (ParamsList == NULL && NumberOfParams != 0) return SA_ERR_HPI_INVALID_PARAMS; OH_CHECK_INIT_STATE(SessionId); OH_GET_DID(SessionId, did); OH_GET_DOMAIN(did, d); /* Lock domain */ OH_RESOURCE_GET_CHECK(d, ResourceId, rpte); if (!(rpte->ResourceCapabilities & SAHPI_CAPABILITY_DIMI)) { err("Resource %d in Domain %d doesn't does not support DIMIs", ResourceId, did); oh_release_domain(d); return SA_ERR_HPI_CAPABILITY; } rdr = oh_get_rdr_by_type(&(d->rpt), ResourceId, SAHPI_DIMI_RDR, DimiNum); if (!rdr) { err("No DIMI num %d found for Resource %d in Domain %d", DimiNum, ResourceId, did); oh_release_domain(d); return SA_ERR_HPI_NOT_PRESENT; } OH_HANDLER_GET(d, ResourceId, h); oh_release_domain(d); OH_CALL_ABI(h, start_dimi_test, SA_ERR_HPI_INVALID_CMD, error, ResourceId, DimiNum, TestNum, NumberOfParams, ParamsList); oh_release_handler(h); return error; } SaErrorT SAHPI_API saHpiDimiTestCancel ( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId, SAHPI_IN SaHpiDimiNumT DimiNum, SAHPI_IN SaHpiDimiTestNumT TestNum) { SaHpiDomainIdT did; struct oh_domain *d = NULL; SaHpiRptEntryT *rpte = NULL; SaHpiRdrT *rdr = NULL; SaErrorT error = SA_OK; struct oh_handler *h = NULL; OH_CHECK_INIT_STATE(SessionId); OH_GET_DID(SessionId, did); OH_GET_DOMAIN(did, d); /* Lock domain */ OH_RESOURCE_GET_CHECK(d, ResourceId, rpte); if (!(rpte->ResourceCapabilities & SAHPI_CAPABILITY_DIMI)) { err("Resource %d in Domain %d doesn't does not support DIMIs", ResourceId, did); oh_release_domain(d); return SA_ERR_HPI_CAPABILITY; } rdr = oh_get_rdr_by_type(&(d->rpt), ResourceId, SAHPI_DIMI_RDR, DimiNum); if (!rdr) { err("No DIMI num %d found for Resource %d in Domain %d", DimiNum, ResourceId, did); oh_release_domain(d); return SA_ERR_HPI_NOT_PRESENT; } OH_HANDLER_GET(d, ResourceId, h); oh_release_domain(d); OH_CALL_ABI(h, cancel_dimi_test, SA_ERR_HPI_INVALID_CMD, error, ResourceId, DimiNum, TestNum); oh_release_handler(h); return error; } SaErrorT SAHPI_API saHpiDimiTestStatusGet ( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId, SAHPI_IN SaHpiDimiNumT DimiNum, SAHPI_IN SaHpiDimiTestNumT TestNum, SAHPI_OUT SaHpiDimiTestPercentCompletedT *PercentCompleted, SAHPI_OUT SaHpiDimiTestRunStatusT *RunStatus) { SaHpiDomainIdT did; struct oh_domain *d = NULL; SaHpiRptEntryT *rpte = NULL; SaHpiRdrT *rdr = NULL; SaErrorT error = SA_OK; struct oh_handler *h = NULL; if (RunStatus == NULL) return SA_ERR_HPI_INVALID_PARAMS; OH_CHECK_INIT_STATE(SessionId); OH_GET_DID(SessionId, did); OH_GET_DOMAIN(did, d); /* Lock domain */ OH_RESOURCE_GET_CHECK(d, ResourceId, rpte); if (!(rpte->ResourceCapabilities & SAHPI_CAPABILITY_DIMI)) { err("Resource %d in Domain %d doesn't does not support DIMIs", ResourceId, did); oh_release_domain(d); return SA_ERR_HPI_CAPABILITY; } rdr = oh_get_rdr_by_type(&(d->rpt), ResourceId, SAHPI_DIMI_RDR, DimiNum); if (!rdr) { err("No DIMI num %d found for Resource %d in Domain %d", DimiNum, ResourceId, did); oh_release_domain(d); return SA_ERR_HPI_NOT_PRESENT; } OH_HANDLER_GET(d, ResourceId, h); oh_release_domain(d); OH_CALL_ABI(h, get_dimi_test_status, SA_ERR_HPI_INVALID_CMD, error, ResourceId, DimiNum, TestNum, PercentCompleted, RunStatus); oh_release_handler(h); return error; } SaErrorT SAHPI_API saHpiDimiTestResultsGet ( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId, SAHPI_IN SaHpiDimiNumT DimiNum, SAHPI_IN SaHpiDimiTestNumT TestNum, SAHPI_OUT SaHpiDimiTestResultsT *TestResults) { SaHpiDomainIdT did; struct oh_domain *d = NULL; SaHpiRptEntryT *rpte = NULL; SaHpiRdrT *rdr = NULL; SaErrorT error = SA_OK; struct oh_handler *h = NULL; if (TestResults == NULL) return SA_ERR_HPI_INVALID_PARAMS; OH_CHECK_INIT_STATE(SessionId); OH_GET_DID(SessionId, did); OH_GET_DOMAIN(did, d); /* Lock domain */ OH_RESOURCE_GET_CHECK(d, ResourceId, rpte); if (!(rpte->ResourceCapabilities & SAHPI_CAPABILITY_DIMI)) { err("Resource %d in Domain %d doesn't does not support DIMIs", ResourceId, did); oh_release_domain(d); return SA_ERR_HPI_CAPABILITY; } rdr = oh_get_rdr_by_type(&(d->rpt), ResourceId, SAHPI_DIMI_RDR, DimiNum); if (!rdr) { err("No DIMI num %d found for Resource %d in Domain %d", DimiNum, ResourceId, did); oh_release_domain(d); return SA_ERR_HPI_NOT_PRESENT; } OH_HANDLER_GET(d, ResourceId, h); oh_release_domain(d); OH_CALL_ABI(h, get_dimi_test_results, SA_ERR_HPI_INVALID_CMD, error, ResourceId, DimiNum, TestNum, TestResults); oh_release_handler(h); return error; } /******************************************************************************* * * FUMI Functions * ******************************************************************************/ SaErrorT SAHPI_API saHpiFumiSpecInfoGet( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId, SAHPI_IN SaHpiFumiNumT FumiNum, SAHPI_OUT SaHpiFumiSpecInfoT *SpecInfo) { SaHpiDomainIdT did; struct oh_domain *d = NULL; SaHpiRptEntryT *rpte = NULL; SaHpiRdrT *rdr = NULL; SaErrorT error = SA_OK; struct oh_handler *h = NULL; if (SpecInfo == NULL) return SA_ERR_HPI_INVALID_PARAMS; OH_CHECK_INIT_STATE(SessionId); OH_GET_DID(SessionId, did); OH_GET_DOMAIN(did, d); /* Lock domain */ OH_RESOURCE_GET_CHECK(d, ResourceId, rpte); if (!(rpte->ResourceCapabilities & SAHPI_CAPABILITY_FUMI)) { err("Resource %d in Domain %d doesn't does not support FUMIs", ResourceId, did); oh_release_domain(d); return SA_ERR_HPI_CAPABILITY; } rdr = oh_get_rdr_by_type(&(d->rpt), ResourceId, SAHPI_FUMI_RDR, FumiNum); if (!rdr) { err("No FUMI num %d found for Resource %d in Domain %d", FumiNum, ResourceId, did); oh_release_domain(d); return SA_ERR_HPI_NOT_PRESENT; } OH_HANDLER_GET(d, ResourceId, h); oh_release_domain(d); OH_CALL_ABI(h, get_fumi_spec, SA_ERR_HPI_INVALID_CMD, error, ResourceId, FumiNum, SpecInfo); oh_release_handler(h); return error; } SaErrorT SAHPI_API saHpiFumiServiceImpactGet( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId, SAHPI_IN SaHpiFumiNumT FumiNum, SAHPI_OUT SaHpiFumiServiceImpactDataT *ServiceImpact) { SaHpiDomainIdT did; struct oh_domain *d = NULL; SaHpiRptEntryT *rpte = NULL; SaHpiRdrT *rdr = NULL; SaErrorT error = SA_OK; struct oh_handler *h = NULL; if (ServiceImpact == NULL) return SA_ERR_HPI_INVALID_PARAMS; OH_CHECK_INIT_STATE(SessionId); OH_GET_DID(SessionId, did); OH_GET_DOMAIN(did, d); /* Lock domain */ OH_RESOURCE_GET_CHECK(d, ResourceId, rpte); if (!(rpte->ResourceCapabilities & SAHPI_CAPABILITY_FUMI)) { err("Resource %d in Domain %d doesn't does not support FUMIs", ResourceId, did); oh_release_domain(d); return SA_ERR_HPI_CAPABILITY; } rdr = oh_get_rdr_by_type(&(d->rpt), ResourceId, SAHPI_FUMI_RDR, FumiNum); if (!rdr) { err("No FUMI num %d found for Resource %d in Domain %d", FumiNum, ResourceId, did); oh_release_domain(d); return SA_ERR_HPI_NOT_PRESENT; } OH_HANDLER_GET(d, ResourceId, h); oh_release_domain(d); OH_CALL_ABI(h, get_fumi_service_impact, SA_ERR_HPI_INVALID_CMD, error, ResourceId, FumiNum, ServiceImpact); oh_release_handler(h); return error; } SaErrorT SAHPI_API saHpiFumiSourceSet ( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId, SAHPI_IN SaHpiFumiNumT FumiNum, SAHPI_IN SaHpiBankNumT BankNum, SAHPI_IN SaHpiTextBufferT *SourceUri) { SaHpiDomainIdT did; struct oh_domain *d = NULL; SaHpiRptEntryT *rpte = NULL; SaHpiRdrT *rdr = NULL; SaErrorT error = SA_OK; struct oh_handler *h = NULL; if (SourceUri == NULL || SourceUri->DataType != SAHPI_TL_TYPE_TEXT) return SA_ERR_HPI_INVALID_PARAMS; /* TODO: Add URI format validation */ OH_CHECK_INIT_STATE(SessionId); OH_GET_DID(SessionId, did); OH_GET_DOMAIN(did, d); /* Lock domain */ OH_RESOURCE_GET_CHECK(d, ResourceId, rpte); if (!(rpte->ResourceCapabilities & SAHPI_CAPABILITY_FUMI)) { err("Resource %d in Domain %d doesn't does not support FUMIs", ResourceId, did); oh_release_domain(d); return SA_ERR_HPI_CAPABILITY; } rdr = oh_get_rdr_by_type(&(d->rpt), ResourceId, SAHPI_FUMI_RDR, FumiNum); if (!rdr) { err("No FUMI num %d found for Resource %d in Domain %d", FumiNum, ResourceId, did); oh_release_domain(d); return SA_ERR_HPI_NOT_PRESENT; } OH_HANDLER_GET(d, ResourceId, h); oh_release_domain(d); OH_CALL_ABI(h, set_fumi_source, SA_ERR_HPI_INVALID_CMD, error, ResourceId, FumiNum, BankNum, SourceUri); oh_release_handler(h); return error; } SaErrorT SAHPI_API saHpiFumiSourceInfoValidateStart ( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId, SAHPI_IN SaHpiFumiNumT FumiNum, SAHPI_IN SaHpiBankNumT BankNum) { SaHpiDomainIdT did; struct oh_domain *d = NULL; SaHpiRptEntryT *rpte = NULL; SaHpiRdrT *rdr = NULL; SaErrorT error = SA_OK; struct oh_handler *h = NULL; OH_CHECK_INIT_STATE(SessionId); OH_GET_DID(SessionId, did); OH_GET_DOMAIN(did, d); /* Lock domain */ OH_RESOURCE_GET_CHECK(d, ResourceId, rpte); if (!(rpte->ResourceCapabilities & SAHPI_CAPABILITY_FUMI)) { err("Resource %d in Domain %d doesn't does not support FUMIs", ResourceId, did); oh_release_domain(d); return SA_ERR_HPI_CAPABILITY; } rdr = oh_get_rdr_by_type(&(d->rpt), ResourceId, SAHPI_FUMI_RDR, FumiNum); if (!rdr) { err("No FUMI num %d found for Resource %d in Domain %d", FumiNum, ResourceId, did); oh_release_domain(d); return SA_ERR_HPI_NOT_PRESENT; } OH_HANDLER_GET(d, ResourceId, h); oh_release_domain(d); OH_CALL_ABI(h, validate_fumi_source, SA_ERR_HPI_INVALID_CMD, error, ResourceId, FumiNum, BankNum); oh_release_handler(h); return error; } SaErrorT SAHPI_API saHpiFumiSourceInfoGet ( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId, SAHPI_IN SaHpiFumiNumT FumiNum, SAHPI_IN SaHpiBankNumT BankNum, SAHPI_OUT SaHpiFumiSourceInfoT *SourceInfo) { SaHpiDomainIdT did; struct oh_domain *d = NULL; SaHpiRptEntryT *rpte = NULL; SaHpiRdrT *rdr = NULL; SaErrorT error = SA_OK; struct oh_handler *h = NULL; if (SourceInfo == NULL) return SA_ERR_HPI_INVALID_PARAMS; OH_CHECK_INIT_STATE(SessionId); OH_GET_DID(SessionId, did); OH_GET_DOMAIN(did, d); /* Lock domain */ OH_RESOURCE_GET_CHECK(d, ResourceId, rpte); if (!(rpte->ResourceCapabilities & SAHPI_CAPABILITY_FUMI)) { err("Resource %d in Domain %d doesn't does not support FUMIs", ResourceId, did); oh_release_domain(d); return SA_ERR_HPI_CAPABILITY; } rdr = oh_get_rdr_by_type(&(d->rpt), ResourceId, SAHPI_FUMI_RDR, FumiNum); if (!rdr) { err("No FUMI num %d found for Resource %d in Domain %d", FumiNum, ResourceId, did); oh_release_domain(d); return SA_ERR_HPI_NOT_PRESENT; } OH_HANDLER_GET(d, ResourceId, h); oh_release_domain(d); OH_CALL_ABI(h, get_fumi_source, SA_ERR_HPI_INVALID_CMD, error, ResourceId, FumiNum, BankNum, SourceInfo); oh_release_handler(h); return error; } SaErrorT SAHPI_API saHpiFumiSourceComponentInfoGet( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId, SAHPI_IN SaHpiFumiNumT FumiNum, SAHPI_IN SaHpiBankNumT BankNum, SAHPI_IN SaHpiEntryIdT ComponentEntryId, SAHPI_OUT SaHpiEntryIdT *NextComponentEntryId, SAHPI_OUT SaHpiFumiComponentInfoT *ComponentInfo) { SaHpiDomainIdT did; struct oh_domain *d = NULL; SaHpiRptEntryT *rpte = NULL; SaHpiRdrT *rdr = NULL; SaErrorT error = SA_OK; struct oh_handler *h = NULL; if (NextComponentEntryId == NULL || ComponentInfo == NULL) return SA_ERR_HPI_INVALID_PARAMS; if ( ComponentEntryId == SAHPI_LAST_ENTRY) return SA_ERR_HPI_INVALID_PARAMS; OH_CHECK_INIT_STATE(SessionId); OH_GET_DID(SessionId, did); OH_GET_DOMAIN(did, d); /* Lock domain */ OH_RESOURCE_GET_CHECK(d, ResourceId, rpte); if (!(rpte->ResourceCapabilities & SAHPI_CAPABILITY_FUMI)) { err("Resource %d in Domain %d doesn't does not support FUMIs", ResourceId, did); oh_release_domain(d); return SA_ERR_HPI_CAPABILITY; } rdr = oh_get_rdr_by_type(&(d->rpt), ResourceId, SAHPI_FUMI_RDR, FumiNum); if (!rdr) { err("No FUMI num %d found for Resource %d in Domain %d", FumiNum, ResourceId, did); oh_release_domain(d); return SA_ERR_HPI_NOT_PRESENT; } else if (!(rdr->RdrTypeUnion.FumiRec.Capability & SAHPI_FUMI_CAP_COMPONENTS)) { err("FUMI %u does not support subsidiary firmware components for" " Resource %u in Domain %u", FumiNum, ResourceId, did); oh_release_domain(d); return SA_ERR_HPI_CAPABILITY; } OH_HANDLER_GET(d, ResourceId, h); oh_release_domain(d); OH_CALL_ABI(h, get_fumi_source_component, SA_ERR_HPI_INVALID_CMD, error, ResourceId, FumiNum, BankNum, ComponentEntryId, NextComponentEntryId, ComponentInfo); oh_release_handler(h); return error; } SaErrorT SAHPI_API saHpiFumiTargetInfoGet ( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId, SAHPI_IN SaHpiFumiNumT FumiNum, SAHPI_IN SaHpiBankNumT BankNum, SAHPI_OUT SaHpiFumiBankInfoT *BankInfo) { SaHpiDomainIdT did; struct oh_domain *d = NULL; SaHpiRptEntryT *rpte = NULL; SaHpiRdrT *rdr = NULL; SaErrorT error = SA_OK; struct oh_handler *h = NULL; if (BankInfo == NULL) return SA_ERR_HPI_INVALID_PARAMS; OH_CHECK_INIT_STATE(SessionId); OH_GET_DID(SessionId, did); OH_GET_DOMAIN(did, d); /* Lock domain */ OH_RESOURCE_GET_CHECK(d, ResourceId, rpte); if (!(rpte->ResourceCapabilities & SAHPI_CAPABILITY_FUMI)) { err("Resource %d in Domain %d doesn't does not support FUMIs", ResourceId, did); oh_release_domain(d); return SA_ERR_HPI_CAPABILITY; } rdr = oh_get_rdr_by_type(&(d->rpt), ResourceId, SAHPI_FUMI_RDR, FumiNum); if (!rdr) { err("No FUMI num %d found for Resource %d in Domain %d", FumiNum, ResourceId, did); oh_release_domain(d); return SA_ERR_HPI_NOT_PRESENT; } OH_HANDLER_GET(d, ResourceId, h); oh_release_domain(d); OH_CALL_ABI(h, get_fumi_target, SA_ERR_HPI_INVALID_CMD, error, ResourceId, FumiNum, BankNum, BankInfo); oh_release_handler(h); return error; } SaErrorT SAHPI_API saHpiFumiTargetComponentInfoGet( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId, SAHPI_IN SaHpiFumiNumT FumiNum, SAHPI_IN SaHpiBankNumT BankNum, SAHPI_IN SaHpiEntryIdT ComponentEntryId, SAHPI_OUT SaHpiEntryIdT *NextComponentEntryId, SAHPI_OUT SaHpiFumiComponentInfoT *ComponentInfo) { SaHpiDomainIdT did; struct oh_domain *d = NULL; SaHpiRptEntryT *rpte = NULL; SaHpiRdrT *rdr = NULL; SaErrorT error = SA_OK; struct oh_handler *h = NULL; if (NextComponentEntryId == NULL || ComponentInfo == NULL) return SA_ERR_HPI_INVALID_PARAMS; if ( ComponentEntryId == SAHPI_LAST_ENTRY) return SA_ERR_HPI_INVALID_PARAMS; OH_CHECK_INIT_STATE(SessionId); OH_GET_DID(SessionId, did); OH_GET_DOMAIN(did, d); /* Lock domain */ OH_RESOURCE_GET_CHECK(d, ResourceId, rpte); if (!(rpte->ResourceCapabilities & SAHPI_CAPABILITY_FUMI)) { err("Resource %d in Domain %d doesn't does not support FUMIs", ResourceId, did); oh_release_domain(d); return SA_ERR_HPI_CAPABILITY; } rdr = oh_get_rdr_by_type(&(d->rpt), ResourceId, SAHPI_FUMI_RDR, FumiNum); if (!rdr) { err("No FUMI num %d found for Resource %d in Domain %d", FumiNum, ResourceId, did); oh_release_domain(d); return SA_ERR_HPI_NOT_PRESENT; } else if (!(rdr->RdrTypeUnion.FumiRec.Capability & SAHPI_FUMI_CAP_COMPONENTS)) { err("FUMI %u does not support subsidiary firmware components for" " Resource %u in Domain %u", FumiNum, ResourceId, did); oh_release_domain(d); return SA_ERR_HPI_CAPABILITY; } OH_HANDLER_GET(d, ResourceId, h); oh_release_domain(d); OH_CALL_ABI(h, get_fumi_target_component, SA_ERR_HPI_INVALID_CMD, error, ResourceId, FumiNum, BankNum, ComponentEntryId, NextComponentEntryId, ComponentInfo); oh_release_handler(h); return error; } SaErrorT SAHPI_API saHpiFumiLogicalTargetInfoGet( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId, SAHPI_IN SaHpiFumiNumT FumiNum, SAHPI_OUT SaHpiFumiLogicalBankInfoT *BankInfo) { SaHpiDomainIdT did; struct oh_domain *d = NULL; SaHpiRptEntryT *rpte = NULL; SaHpiRdrT *rdr = NULL; SaErrorT error = SA_OK; struct oh_handler *h = NULL; if (BankInfo == NULL) return SA_ERR_HPI_INVALID_PARAMS; OH_CHECK_INIT_STATE(SessionId); OH_GET_DID(SessionId, did); OH_GET_DOMAIN(did, d); /* Lock domain */ OH_RESOURCE_GET_CHECK(d, ResourceId, rpte); if (!(rpte->ResourceCapabilities & SAHPI_CAPABILITY_FUMI)) { err("Resource %d in Domain %d doesn't does not support FUMIs", ResourceId, did); oh_release_domain(d); return SA_ERR_HPI_CAPABILITY; } rdr = oh_get_rdr_by_type(&(d->rpt), ResourceId, SAHPI_FUMI_RDR, FumiNum); if (!rdr) { err("No FUMI num %d found for Resource %d in Domain %d", FumiNum, ResourceId, did); oh_release_domain(d); return SA_ERR_HPI_NOT_PRESENT; } OH_HANDLER_GET(d, ResourceId, h); oh_release_domain(d); OH_CALL_ABI(h, get_fumi_logical_target, SA_ERR_HPI_INVALID_CMD, error, ResourceId, FumiNum, BankInfo); oh_release_handler(h); return error; } SaErrorT SAHPI_API saHpiFumiLogicalTargetComponentInfoGet( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId, SAHPI_IN SaHpiFumiNumT FumiNum, SAHPI_IN SaHpiEntryIdT ComponentEntryId, SAHPI_OUT SaHpiEntryIdT *NextComponentEntryId, SAHPI_OUT SaHpiFumiLogicalComponentInfoT *ComponentInfo) { SaHpiDomainIdT did; struct oh_domain *d = NULL; SaHpiRptEntryT *rpte = NULL; SaHpiRdrT *rdr = NULL; SaErrorT error = SA_OK; struct oh_handler *h = NULL; if (NextComponentEntryId == NULL || ComponentInfo == NULL) return SA_ERR_HPI_INVALID_PARAMS; if ( ComponentEntryId == SAHPI_LAST_ENTRY) return SA_ERR_HPI_INVALID_PARAMS; OH_CHECK_INIT_STATE(SessionId); OH_GET_DID(SessionId, did); OH_GET_DOMAIN(did, d); /* Lock domain */ OH_RESOURCE_GET_CHECK(d, ResourceId, rpte); if (!(rpte->ResourceCapabilities & SAHPI_CAPABILITY_FUMI)) { err("Resource %d in Domain %d doesn't does not support FUMIs", ResourceId, did); oh_release_domain(d); return SA_ERR_HPI_CAPABILITY; } rdr = oh_get_rdr_by_type(&(d->rpt), ResourceId, SAHPI_FUMI_RDR, FumiNum); if (!rdr) { err("No FUMI num %d found for Resource %d in Domain %d", FumiNum, ResourceId, did); oh_release_domain(d); return SA_ERR_HPI_NOT_PRESENT; } else if (!(rdr->RdrTypeUnion.FumiRec.Capability & SAHPI_FUMI_CAP_COMPONENTS)) { err("FUMI %u does not support subsidiary firmware components for" " Resource %u in Domain %u", FumiNum, ResourceId, did); oh_release_domain(d); return SA_ERR_HPI_CAPABILITY; } OH_HANDLER_GET(d, ResourceId, h); oh_release_domain(d); OH_CALL_ABI(h, get_fumi_logical_target_component, SA_ERR_HPI_INVALID_CMD, error, ResourceId, FumiNum, ComponentEntryId, NextComponentEntryId, ComponentInfo); oh_release_handler(h); return error; } SaErrorT SAHPI_API saHpiFumiBackupStart( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId, SAHPI_IN SaHpiFumiNumT FumiNum) { SaHpiDomainIdT did; struct oh_domain *d = NULL; SaHpiRptEntryT *rpte = NULL; SaHpiRdrT *rdr = NULL; SaErrorT error = SA_OK; struct oh_handler *h = NULL; OH_CHECK_INIT_STATE(SessionId); OH_GET_DID(SessionId, did); OH_GET_DOMAIN(did, d); /* Lock domain */ OH_RESOURCE_GET_CHECK(d, ResourceId, rpte); if (!(rpte->ResourceCapabilities & SAHPI_CAPABILITY_FUMI)) { err("Resource %d in Domain %d doesn't does not support FUMIs", ResourceId, did); oh_release_domain(d); return SA_ERR_HPI_CAPABILITY; } rdr = oh_get_rdr_by_type(&(d->rpt), ResourceId, SAHPI_FUMI_RDR, FumiNum); if (!rdr) { err("No FUMI num %d found for Resource %d in Domain %d", FumiNum, ResourceId, did); oh_release_domain(d); return SA_ERR_HPI_NOT_PRESENT; } else if (!(rdr->RdrTypeUnion.FumiRec.Capability & SAHPI_FUMI_CAP_BACKUP)) { err("FUMI %u does not support backup capability for" " Resource %u in Domain %u", FumiNum, ResourceId, did); oh_release_domain(d); return SA_ERR_HPI_CAPABILITY; } OH_HANDLER_GET(d, ResourceId, h); oh_release_domain(d); OH_CALL_ABI(h, start_fumi_backup, SA_ERR_HPI_INVALID_CMD, error, ResourceId, FumiNum); oh_release_handler(h); return error; } SaErrorT SAHPI_API saHpiFumiBankBootOrderSet ( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId, SAHPI_IN SaHpiFumiNumT FumiNum, SAHPI_IN SaHpiBankNumT BankNum, SAHPI_IN SaHpiUint32T Position) { SaHpiDomainIdT did; struct oh_domain *d = NULL; SaHpiRptEntryT *rpte = NULL; SaHpiRdrT *rdr = NULL; SaErrorT error = SA_OK; struct oh_handler *h = NULL; OH_CHECK_INIT_STATE(SessionId); OH_GET_DID(SessionId, did); OH_GET_DOMAIN(did, d); /* Lock domain */ OH_RESOURCE_GET_CHECK(d, ResourceId, rpte); if (!(rpte->ResourceCapabilities & SAHPI_CAPABILITY_FUMI)) { err("Resource %d in Domain %d doesn't does not support FUMIs", ResourceId, did); oh_release_domain(d); return SA_ERR_HPI_CAPABILITY; } rdr = oh_get_rdr_by_type(&(d->rpt), ResourceId, SAHPI_FUMI_RDR, FumiNum); if (!rdr) { err("No FUMI num %d found for Resource %d in Domain %d", FumiNum, ResourceId, did); oh_release_domain(d); return SA_ERR_HPI_NOT_PRESENT; } else if (!(rdr->RdrTypeUnion.FumiRec.Capability & SAHPI_FUMI_CAP_BANKREORDER)) { err("FUMI %u does not support bank reordering for" " Resource %u in Domain %u", FumiNum, ResourceId, did); oh_release_domain(d); return SA_ERR_HPI_CAPABILITY; } OH_HANDLER_GET(d, ResourceId, h); oh_release_domain(d); OH_CALL_ABI(h, set_fumi_bank_order, SA_ERR_HPI_INVALID_CMD, error, ResourceId, FumiNum, BankNum, Position); oh_release_handler(h); return error; } SaErrorT SAHPI_API saHpiFumiBankCopyStart( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId, SAHPI_IN SaHpiFumiNumT FumiNum, SAHPI_IN SaHpiBankNumT SourceBankNum, SAHPI_IN SaHpiBankNumT TargetBankNum) { SaHpiDomainIdT did; struct oh_domain *d = NULL; SaHpiRptEntryT *rpte = NULL; SaHpiRdrT *rdr = NULL; SaErrorT error = SA_OK; struct oh_handler *h = NULL; if (SourceBankNum == TargetBankNum) { err("Invalid Request. Source and Target numbers are the same."); return SA_ERR_HPI_INVALID_REQUEST; } OH_CHECK_INIT_STATE(SessionId); OH_GET_DID(SessionId, did); OH_GET_DOMAIN(did, d); /* Lock domain */ OH_RESOURCE_GET_CHECK(d, ResourceId, rpte); if (!(rpte->ResourceCapabilities & SAHPI_CAPABILITY_FUMI)) { err("Resource %d in Domain %d doesn't does not support FUMIs", ResourceId, did); oh_release_domain(d); return SA_ERR_HPI_CAPABILITY; } rdr = oh_get_rdr_by_type(&(d->rpt), ResourceId, SAHPI_FUMI_RDR, FumiNum); if (!rdr) { err("No FUMI num %d found for Resource %d in Domain %d", FumiNum, ResourceId, did); oh_release_domain(d); return SA_ERR_HPI_NOT_PRESENT; } else if (!(rdr->RdrTypeUnion.FumiRec.Capability & SAHPI_FUMI_CAP_BANKCOPY)) { err("FUMI %u does not support bank copying for" " Resource %u in Domain %u", FumiNum, ResourceId, did); oh_release_domain(d); return SA_ERR_HPI_CAPABILITY; } OH_HANDLER_GET(d, ResourceId, h); oh_release_domain(d); OH_CALL_ABI(h, start_fumi_bank_copy, SA_ERR_HPI_INVALID_CMD, error, ResourceId, FumiNum, SourceBankNum, TargetBankNum); oh_release_handler(h); return error; } SaErrorT SAHPI_API saHpiFumiInstallStart ( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId, SAHPI_IN SaHpiFumiNumT FumiNum, SAHPI_IN SaHpiBankNumT BankNum) { SaHpiDomainIdT did; struct oh_domain *d = NULL; SaHpiRptEntryT *rpte = NULL; SaHpiRdrT *rdr = NULL; SaErrorT error = SA_OK; struct oh_handler *h = NULL; SaHpiFumiSourceInfoT sourceinfo; OH_CHECK_INIT_STATE(SessionId); OH_GET_DID(SessionId, did); OH_GET_DOMAIN(did, d); /* Lock domain */ OH_RESOURCE_GET_CHECK(d, ResourceId, rpte); if (!(rpte->ResourceCapabilities & SAHPI_CAPABILITY_FUMI)) { err("Resource %d in Domain %d doesn't does not support FUMIs", ResourceId, did); oh_release_domain(d); return SA_ERR_HPI_CAPABILITY; } rdr = oh_get_rdr_by_type(&(d->rpt), ResourceId, SAHPI_FUMI_RDR, FumiNum); if (!rdr) { err("No FUMI num %d found for Resource %d in Domain %d", FumiNum, ResourceId, did); oh_release_domain(d); return SA_ERR_HPI_NOT_PRESENT; } error = saHpiFumiSourceInfoGet(SessionId, ResourceId, FumiNum, BankNum, &sourceinfo); if (error) { oh_release_domain(d); return error; } else if (sourceinfo.SourceStatus != SAHPI_FUMI_SRC_VALID && sourceinfo.SourceStatus != SAHPI_FUMI_SRC_VALIDITY_UNKNOWN) { oh_release_domain(d); err("Source is not valid: Bank %u, Fumi %u, Resource %u, Domain %u", BankNum, FumiNum, ResourceId, did); return SA_ERR_HPI_INVALID_REQUEST; } OH_HANDLER_GET(d, ResourceId, h); oh_release_domain(d); OH_CALL_ABI(h, start_fumi_install, SA_ERR_HPI_INVALID_CMD, error, ResourceId, FumiNum, BankNum); oh_release_handler(h); return error; } SaErrorT SAHPI_API saHpiFumiUpgradeStatusGet ( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId, SAHPI_IN SaHpiFumiNumT FumiNum, SAHPI_IN SaHpiBankNumT BankNum, SAHPI_OUT SaHpiFumiUpgradeStatusT *UpgradeStatus) { SaHpiDomainIdT did; struct oh_domain *d = NULL; SaHpiRptEntryT *rpte = NULL; SaHpiRdrT *rdr = NULL; SaErrorT error = SA_OK; struct oh_handler *h = NULL; if (UpgradeStatus == NULL) return SA_ERR_HPI_INVALID_PARAMS; OH_CHECK_INIT_STATE(SessionId); OH_GET_DID(SessionId, did); OH_GET_DOMAIN(did, d); /* Lock domain */ OH_RESOURCE_GET_CHECK(d, ResourceId, rpte); if (!(rpte->ResourceCapabilities & SAHPI_CAPABILITY_FUMI)) { err("Resource %d in Domain %d doesn't does not support FUMIs", ResourceId, did); oh_release_domain(d); return SA_ERR_HPI_CAPABILITY; } rdr = oh_get_rdr_by_type(&(d->rpt), ResourceId, SAHPI_FUMI_RDR, FumiNum); if (!rdr) { err("No FUMI num %d found for Resource %d in Domain %d", FumiNum, ResourceId, did); oh_release_domain(d); return SA_ERR_HPI_NOT_PRESENT; } OH_HANDLER_GET(d, ResourceId, h); oh_release_domain(d); OH_CALL_ABI(h, get_fumi_status, SA_ERR_HPI_INVALID_CMD, error, ResourceId, FumiNum, BankNum, UpgradeStatus); oh_release_handler(h); return error; } SaErrorT SAHPI_API saHpiFumiTargetVerifyStart ( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId, SAHPI_IN SaHpiFumiNumT FumiNum, SAHPI_IN SaHpiBankNumT BankNum) { SaHpiDomainIdT did; struct oh_domain *d = NULL; SaHpiRptEntryT *rpte = NULL; SaHpiRdrT *rdr = NULL; SaErrorT error = SA_OK; struct oh_handler *h = NULL; SaHpiFumiSourceInfoT sourceinfo; OH_CHECK_INIT_STATE(SessionId); OH_GET_DID(SessionId, did); OH_GET_DOMAIN(did, d); /* Lock domain */ OH_RESOURCE_GET_CHECK(d, ResourceId, rpte); if (!(rpte->ResourceCapabilities & SAHPI_CAPABILITY_FUMI)) { err("Resource %d in Domain %d doesn't does not support FUMIs", ResourceId, did); oh_release_domain(d); return SA_ERR_HPI_CAPABILITY; } rdr = oh_get_rdr_by_type(&(d->rpt), ResourceId, SAHPI_FUMI_RDR, FumiNum); if (!rdr) { err("No FUMI num %d found for Resource %d in Domain %d", FumiNum, ResourceId, did); oh_release_domain(d); return SA_ERR_HPI_NOT_PRESENT; } else if (!(rdr->RdrTypeUnion.FumiRec.Capability & SAHPI_FUMI_CAP_TARGET_VERIFY)) { err("FUMI %u does not support target verification for" " Resource %u in Domain %u", FumiNum, ResourceId, did); oh_release_domain(d); return SA_ERR_HPI_CAPABILITY; } error = saHpiFumiSourceInfoGet(SessionId, ResourceId, FumiNum, BankNum, &sourceinfo); if (error) { oh_release_domain(d); return error; } else if (sourceinfo.SourceStatus != SAHPI_FUMI_SRC_VALID && sourceinfo.SourceStatus != SAHPI_FUMI_SRC_VALIDITY_UNKNOWN) { oh_release_domain(d); err("Source is not valid: Bank %u, Fumi %u, Resource %u, Domain %u", BankNum, FumiNum, ResourceId, did); return SA_ERR_HPI_INVALID_REQUEST; } OH_HANDLER_GET(d, ResourceId, h); oh_release_domain(d); OH_CALL_ABI(h, start_fumi_verify, SA_ERR_HPI_INVALID_CMD, error, ResourceId, FumiNum, BankNum); oh_release_handler(h); return error; } SaErrorT SAHPI_API saHpiFumiTargetVerifyMainStart( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId, SAHPI_IN SaHpiFumiNumT FumiNum) { SaHpiDomainIdT did; struct oh_domain *d = NULL; SaHpiRptEntryT *rpte = NULL; SaHpiRdrT *rdr = NULL; SaErrorT error = SA_OK; struct oh_handler *h = NULL; SaHpiFumiSourceInfoT sourceinfo; OH_CHECK_INIT_STATE(SessionId); OH_GET_DID(SessionId, did); OH_GET_DOMAIN(did, d); /* Lock domain */ OH_RESOURCE_GET_CHECK(d, ResourceId, rpte); if (!(rpte->ResourceCapabilities & SAHPI_CAPABILITY_FUMI)) { err("Resource %d in Domain %d doesn't does not support FUMIs", ResourceId, did); oh_release_domain(d); return SA_ERR_HPI_CAPABILITY; } rdr = oh_get_rdr_by_type(&(d->rpt), ResourceId, SAHPI_FUMI_RDR, FumiNum); if (!rdr) { err("No FUMI num %d found for Resource %d in Domain %d", FumiNum, ResourceId, did); oh_release_domain(d); return SA_ERR_HPI_NOT_PRESENT; } else if (!(rdr->RdrTypeUnion.FumiRec.Capability & SAHPI_FUMI_CAP_TARGET_VERIFY_MAIN)) { err("FUMI %u does not support target verification for" " Resource %u in Domain %u", FumiNum, ResourceId, did); oh_release_domain(d); return SA_ERR_HPI_CAPABILITY; } error = saHpiFumiSourceInfoGet(SessionId, ResourceId, FumiNum, 0, &sourceinfo); if (error) { oh_release_domain(d); return error; } else if (sourceinfo.SourceStatus != SAHPI_FUMI_SRC_VALID && sourceinfo.SourceStatus != SAHPI_FUMI_SRC_VALIDITY_UNKNOWN) { oh_release_domain(d); err("Source is not valid: Bank %u, Fumi %u, Resource %u, Domain %u", 0, FumiNum, ResourceId, did); return SA_ERR_HPI_INVALID_REQUEST; } OH_HANDLER_GET(d, ResourceId, h); oh_release_domain(d); OH_CALL_ABI(h, start_fumi_verify_main, SA_ERR_HPI_INVALID_CMD, error, ResourceId, FumiNum); oh_release_handler(h); return error; } SaErrorT SAHPI_API saHpiFumiUpgradeCancel ( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId, SAHPI_IN SaHpiFumiNumT FumiNum, SAHPI_IN SaHpiBankNumT BankNum) { SaHpiDomainIdT did; struct oh_domain *d = NULL; SaHpiRptEntryT *rpte = NULL; SaHpiRdrT *rdr = NULL; SaErrorT error = SA_OK; struct oh_handler *h = NULL; OH_CHECK_INIT_STATE(SessionId); OH_GET_DID(SessionId, did); OH_GET_DOMAIN(did, d); /* Lock domain */ OH_RESOURCE_GET_CHECK(d, ResourceId, rpte); if (!(rpte->ResourceCapabilities & SAHPI_CAPABILITY_FUMI)) { err("Resource %d in Domain %d doesn't does not support FUMIs", ResourceId, did); oh_release_domain(d); return SA_ERR_HPI_CAPABILITY; } rdr = oh_get_rdr_by_type(&(d->rpt), ResourceId, SAHPI_FUMI_RDR, FumiNum); if (!rdr) { err("No FUMI num %d found for Resource %d in Domain %d", FumiNum, ResourceId, did); oh_release_domain(d); return SA_ERR_HPI_NOT_PRESENT; } OH_HANDLER_GET(d, ResourceId, h); oh_release_domain(d); OH_CALL_ABI(h, cancel_fumi_upgrade, SA_ERR_HPI_INVALID_CMD, error, ResourceId, FumiNum, BankNum); oh_release_handler(h); return error; } SaErrorT SAHPI_API saHpiFumiAutoRollbackDisableGet( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId, SAHPI_IN SaHpiFumiNumT FumiNum, SAHPI_OUT SaHpiBoolT *Disable) { SaHpiDomainIdT did; struct oh_domain *d = NULL; SaHpiRptEntryT *rpte = NULL; SaHpiRdrT *rdr = NULL; SaErrorT error = SA_OK; struct oh_handler *h = NULL; if (Disable == NULL) return SA_ERR_HPI_INVALID_PARAMS; OH_CHECK_INIT_STATE(SessionId); OH_GET_DID(SessionId, did); OH_GET_DOMAIN(did, d); /* Lock domain */ OH_RESOURCE_GET_CHECK(d, ResourceId, rpte); if (!(rpte->ResourceCapabilities & SAHPI_CAPABILITY_FUMI)) { err("Resource %d in Domain %d doesn't does not support FUMIs", ResourceId, did); oh_release_domain(d); return SA_ERR_HPI_CAPABILITY; } rdr = oh_get_rdr_by_type(&(d->rpt), ResourceId, SAHPI_FUMI_RDR, FumiNum); if (!rdr) { err("No FUMI num %d found for Resource %d in Domain %d", FumiNum, ResourceId, did); oh_release_domain(d); return SA_ERR_HPI_NOT_PRESENT; } else if (!(rdr->RdrTypeUnion.FumiRec.Capability & SAHPI_FUMI_CAP_AUTOROLLBACK)) { err("FUMI %u does not support automatic rollback for" " Resource %u in Domain %u", FumiNum, ResourceId, did); oh_release_domain(d); return SA_ERR_HPI_CAPABILITY; } OH_HANDLER_GET(d, ResourceId, h); oh_release_domain(d); OH_CALL_ABI(h, get_fumi_autorollback_disable, SA_ERR_HPI_INVALID_CMD, error, ResourceId, FumiNum, Disable); oh_release_handler(h); return error; } SaErrorT SAHPI_API saHpiFumiAutoRollbackDisableSet( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId, SAHPI_IN SaHpiFumiNumT FumiNum, SAHPI_IN SaHpiBoolT Disable) { SaHpiDomainIdT did; struct oh_domain *d = NULL; SaHpiRptEntryT *rpte = NULL; SaHpiRdrT *rdr = NULL; SaErrorT error = SA_OK; struct oh_handler *h = NULL; OH_CHECK_INIT_STATE(SessionId); OH_GET_DID(SessionId, did); OH_GET_DOMAIN(did, d); /* Lock domain */ OH_RESOURCE_GET_CHECK(d, ResourceId, rpte); if (!(rpte->ResourceCapabilities & SAHPI_CAPABILITY_FUMI)) { err("Resource %d in Domain %d doesn't does not support FUMIs", ResourceId, did); oh_release_domain(d); return SA_ERR_HPI_CAPABILITY; } rdr = oh_get_rdr_by_type(&(d->rpt), ResourceId, SAHPI_FUMI_RDR, FumiNum); if (!rdr) { err("No FUMI num %d found for Resource %d in Domain %d", FumiNum, ResourceId, did); oh_release_domain(d); return SA_ERR_HPI_NOT_PRESENT; } else if (!(rdr->RdrTypeUnion.FumiRec.Capability & SAHPI_FUMI_CAP_AUTOROLLBACK)) { err("FUMI %u does not support automatic rollback for" " Resource %u in Domain %u", FumiNum, ResourceId, did); oh_release_domain(d); return SA_ERR_HPI_CAPABILITY; } else if (!(rdr->RdrTypeUnion.FumiRec.Capability & SAHPI_FUMI_CAP_AUTOROLLBACK_CAN_BE_DISABLED)) { err("FUMI %u does not support automatic rollback control for" " Resource %u in Domain %u", FumiNum, ResourceId, did); oh_release_domain(d); return SA_ERR_HPI_CAPABILITY; } OH_HANDLER_GET(d, ResourceId, h); oh_release_domain(d); OH_CALL_ABI(h, set_fumi_autorollback_disable, SA_ERR_HPI_INVALID_CMD, error, ResourceId, FumiNum, Disable); oh_release_handler(h); return error; } SaErrorT SAHPI_API saHpiFumiRollbackStart ( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId, SAHPI_IN SaHpiFumiNumT FumiNum) { SaHpiDomainIdT did; struct oh_domain *d = NULL; SaHpiRptEntryT *rpte = NULL; SaHpiRdrT *rdr = NULL; SaErrorT error = SA_OK; struct oh_handler *h = NULL; OH_CHECK_INIT_STATE(SessionId); OH_GET_DID(SessionId, did); OH_GET_DOMAIN(did, d); /* Lock domain */ OH_RESOURCE_GET_CHECK(d, ResourceId, rpte); if (!(rpte->ResourceCapabilities & SAHPI_CAPABILITY_FUMI)) { err("Resource %d in Domain %d doesn't does not support FUMIs", ResourceId, did); oh_release_domain(d); return SA_ERR_HPI_CAPABILITY; } rdr = oh_get_rdr_by_type(&(d->rpt), ResourceId, SAHPI_FUMI_RDR, FumiNum); if (!rdr) { err("No FUMI num %d found for Resource %d in Domain %d", FumiNum, ResourceId, did); oh_release_domain(d); return SA_ERR_HPI_NOT_PRESENT; } else if (!(rdr->RdrTypeUnion.FumiRec.Capability & SAHPI_FUMI_CAP_ROLLBACK)) { err("FUMI %u does not support rollback for" " Resource %u in Domain %u", FumiNum, ResourceId, did); oh_release_domain(d); return SA_ERR_HPI_CAPABILITY; } OH_HANDLER_GET(d, ResourceId, h); oh_release_domain(d); OH_CALL_ABI(h, start_fumi_rollback, SA_ERR_HPI_INVALID_CMD, error, ResourceId, FumiNum); oh_release_handler(h); return error; } SaErrorT SAHPI_API saHpiFumiActivate ( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId, SAHPI_IN SaHpiFumiNumT FumiNum) { SaHpiDomainIdT did; struct oh_domain *d = NULL; SaHpiRptEntryT *rpte = NULL; SaHpiRdrT *rdr = NULL; SaErrorT error = SA_OK; struct oh_handler *h = NULL; OH_CHECK_INIT_STATE(SessionId); OH_GET_DID(SessionId, did); OH_GET_DOMAIN(did, d); /* Lock domain */ OH_RESOURCE_GET_CHECK(d, ResourceId, rpte); if (!(rpte->ResourceCapabilities & SAHPI_CAPABILITY_FUMI)) { err("Resource %d in Domain %d doesn't does not support FUMIs", ResourceId, did); oh_release_domain(d); return SA_ERR_HPI_CAPABILITY; } rdr = oh_get_rdr_by_type(&(d->rpt), ResourceId, SAHPI_FUMI_RDR, FumiNum); if (!rdr) { err("No FUMI num %d found for Resource %d in Domain %d", FumiNum, ResourceId, did); oh_release_domain(d); return SA_ERR_HPI_NOT_PRESENT; } OH_HANDLER_GET(d, ResourceId, h); oh_release_domain(d); OH_CALL_ABI(h, activate_fumi, SA_ERR_HPI_INVALID_CMD, error, ResourceId, FumiNum); oh_release_handler(h); return error; } SaErrorT SAHPI_API saHpiFumiActivateStart( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId, SAHPI_IN SaHpiFumiNumT FumiNum, SAHPI_IN SaHpiBoolT Logical) { SaHpiDomainIdT did; struct oh_domain *d = NULL; SaHpiRptEntryT *rpte = NULL; SaHpiRdrT *rdr = NULL; SaErrorT error = SA_OK; struct oh_handler *h = NULL; OH_CHECK_INIT_STATE(SessionId); OH_GET_DID(SessionId, did); OH_GET_DOMAIN(did, d); /* Lock domain */ OH_RESOURCE_GET_CHECK(d, ResourceId, rpte); if (!(rpte->ResourceCapabilities & SAHPI_CAPABILITY_FUMI)) { err("Resource %d in Domain %d doesn't does not support FUMIs", ResourceId, did); oh_release_domain(d); return SA_ERR_HPI_CAPABILITY; } rdr = oh_get_rdr_by_type(&(d->rpt), ResourceId, SAHPI_FUMI_RDR, FumiNum); if (!rdr) { err("No FUMI num %d found for Resource %d in Domain %d", FumiNum, ResourceId, did); oh_release_domain(d); return SA_ERR_HPI_NOT_PRESENT; } OH_HANDLER_GET(d, ResourceId, h); oh_release_domain(d); OH_CALL_ABI(h, start_fumi_activate, SA_ERR_HPI_INVALID_CMD, error, ResourceId, FumiNum, Logical); oh_release_handler(h); return error; } SaErrorT SAHPI_API saHpiFumiCleanup( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId, SAHPI_IN SaHpiFumiNumT FumiNum, SAHPI_IN SaHpiBankNumT BankNum) { SaHpiDomainIdT did; struct oh_domain *d = NULL; SaHpiRptEntryT *rpte = NULL; SaHpiRdrT *rdr = NULL; SaErrorT error = SA_OK; struct oh_handler *h = NULL; OH_CHECK_INIT_STATE(SessionId); OH_GET_DID(SessionId, did); OH_GET_DOMAIN(did, d); /* Lock domain */ OH_RESOURCE_GET_CHECK(d, ResourceId, rpte); if (!(rpte->ResourceCapabilities & SAHPI_CAPABILITY_FUMI)) { err("Resource %d in Domain %d doesn't does not support FUMIs", ResourceId, did); oh_release_domain(d); return SA_ERR_HPI_CAPABILITY; } rdr = oh_get_rdr_by_type(&(d->rpt), ResourceId, SAHPI_FUMI_RDR, FumiNum); if (!rdr) { err("No FUMI num %d found for Resource %d in Domain %d", FumiNum, ResourceId, did); oh_release_domain(d); return SA_ERR_HPI_NOT_PRESENT; } OH_HANDLER_GET(d, ResourceId, h); oh_release_domain(d); OH_CALL_ABI(h, cleanup_fumi, SA_ERR_HPI_INVALID_CMD, error, ResourceId, FumiNum, BankNum); oh_release_handler(h); return error; } /******************************************************************************* * * Hotswap Functions * ******************************************************************************/ SaErrorT SAHPI_API saHpiHotSwapPolicyCancel ( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId) { SaHpiRptEntryT *res; SaHpiDomainIdT did; SaHpiHsStateT currentstate; SaErrorT error; struct oh_handler *h; struct oh_domain *d = NULL; SaHpiTimeoutT timeout; SaErrorT (*hotswap_policy_cancel)(void *hnd, SaHpiResourceIdT, SaHpiTimeoutT timeout); OH_CHECK_INIT_STATE(SessionId); OH_GET_DID(SessionId, did); OH_GET_DOMAIN(did, d); /* Lock domain */ OH_RESOURCE_GET_CHECK(d, ResourceId, res); if (!(res->ResourceCapabilities & SAHPI_CAPABILITY_MANAGED_HOTSWAP)) { oh_release_domain(d); /* Unlock domain */ return SA_ERR_HPI_CAPABILITY; } /* per spec, we only allow a cancel from certain states */ error = saHpiHotSwapStateGet(SessionId, ResourceId, ¤tstate); if (error != SA_OK) { err("Failed to determine current HS state of Resource %d", ResourceId); oh_release_domain(d); /* Unlock domain */ return error; } if ((currentstate != SAHPI_HS_STATE_INSERTION_PENDING) && (currentstate != SAHPI_HS_STATE_EXTRACTION_PENDING)) { err("Invalid cancel from state %s",oh_lookup_hsstate(currentstate)); oh_release_domain(d); return SA_ERR_HPI_INVALID_REQUEST; } OH_HANDLER_GET(d, ResourceId, h); timeout = d->ai_timeout; oh_release_domain(d); /* Unlock domain */ hotswap_policy_cancel = h ? h->abi->hotswap_policy_cancel : NULL; if (hotswap_policy_cancel) { error = hotswap_policy_cancel(h->hnd, ResourceId, timeout); } else { error = SA_OK; } oh_release_handler(h); return error; } SaErrorT SAHPI_API saHpiResourceActiveSet ( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId) { SaErrorT error; SaErrorT (*set_hotswap_state)(void *hnd, SaHpiResourceIdT, SaHpiHsStateT state); SaHpiRptEntryT *res; struct oh_handler *h; SaHpiDomainIdT did; SaHpiHsStateT from; struct oh_domain *d = NULL; OH_CHECK_INIT_STATE(SessionId); OH_GET_DID(SessionId, did); OH_GET_DOMAIN(did, d); /* Lock domain */ OH_RESOURCE_GET_CHECK(d, ResourceId, res); if (!(res->ResourceCapabilities & SAHPI_CAPABILITY_MANAGED_HOTSWAP)) { oh_release_domain(d); /* Unlock domain */ return SA_ERR_HPI_CAPABILITY; } error = saHpiHotSwapStateGet(SessionId, ResourceId, &from); if (error != SA_OK) { err("Failed to determine current HS state of Resource %d", ResourceId); oh_release_domain(d); /* Unlock domain */ return error; } if (!oh_allowed_hotswap_transition(from, SAHPI_HS_STATE_ACTIVE)) { err("Not allowed to transition %s -> %s", oh_lookup_hsstate(from), oh_lookup_hsstate(SAHPI_HS_STATE_ACTIVE)); oh_release_domain(d); /* Unlock domain */ return SA_ERR_HPI_INVALID_REQUEST; } OH_HANDLER_GET(d, ResourceId, h); oh_release_domain(d); /* Unlock domain */ set_hotswap_state = h ? h->abi->set_hotswap_state : NULL; if (!set_hotswap_state) { oh_release_handler(h); return SA_ERR_HPI_INVALID_CMD; } error = set_hotswap_state(h->hnd, ResourceId, SAHPI_HS_STATE_ACTIVE); oh_release_handler(h); return error; } SaErrorT SAHPI_API saHpiResourceInactiveSet ( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId) { SaErrorT error; SaErrorT (*set_hotswap_state)(void *hnd, SaHpiResourceIdT rid, SaHpiHsStateT state); SaHpiRptEntryT *res; struct oh_handler *h; SaHpiDomainIdT did; SaHpiHsStateT from; struct oh_domain *d = NULL; OH_CHECK_INIT_STATE(SessionId); OH_GET_DID(SessionId, did); OH_GET_DOMAIN(did, d); /* Lock domain */ OH_RESOURCE_GET_CHECK(d, ResourceId, res); if (!(res->ResourceCapabilities & SAHPI_CAPABILITY_MANAGED_HOTSWAP)) { oh_release_domain(d); /* Unlock domain */ return SA_ERR_HPI_CAPABILITY; } error = saHpiHotSwapStateGet(SessionId, ResourceId, &from); if (error != SA_OK) { err("Failed to determine current HS state of Resource %d", ResourceId); oh_release_domain(d); /* Unlock domain */ return error; } if (!oh_allowed_hotswap_transition(from, SAHPI_HS_STATE_INACTIVE)) { err("Not allowed to transition %s -> %s", oh_lookup_hsstate(from), oh_lookup_hsstate(SAHPI_HS_STATE_INACTIVE)); oh_release_domain(d); /* Unlock domain */ return SA_ERR_HPI_INVALID_REQUEST; } OH_HANDLER_GET(d, ResourceId, h); oh_release_domain(d); /* Unlock domain */ set_hotswap_state = h ? h->abi->set_hotswap_state : NULL; if (!set_hotswap_state) { oh_release_handler(h); return SA_ERR_HPI_INVALID_CMD; } error = set_hotswap_state(h->hnd, ResourceId, SAHPI_HS_STATE_INACTIVE); oh_release_handler(h); return error; } SaErrorT SAHPI_API saHpiAutoInsertTimeoutGet( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_OUT SaHpiTimeoutT *Timeout) { SaHpiDomainIdT did; struct oh_domain *domain; if (!Timeout) { return SA_ERR_HPI_INVALID_PARAMS; } OH_CHECK_INIT_STATE(SessionId); OH_GET_DID(SessionId, did); OH_GET_DOMAIN(did, domain); /* Lock domain */ *Timeout = get_hotswap_auto_insert_timeout(domain); oh_release_domain(domain); /* Unlock domain */ return SA_OK; } SaErrorT SAHPI_API saHpiAutoInsertTimeoutSet( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiTimeoutT Timeout) { SaHpiDomainIdT did; struct oh_domain *domain = NULL; SaErrorT error = SA_OK; SaHpiRptEntryT *rpte = NULL; RPTable *rpt; GArray *hids = NULL; int i; if (Timeout != SAHPI_TIMEOUT_IMMEDIATE && Timeout != SAHPI_TIMEOUT_BLOCK && Timeout < 0) return SA_ERR_HPI_INVALID_PARAMS; OH_CHECK_INIT_STATE(SessionId); OH_GET_DID(SessionId, did); OH_GET_DOMAIN(did, domain); /* Lock domain */ if (domain->capabilities & SAHPI_DOMAIN_CAP_AUTOINSERT_READ_ONLY) { oh_release_domain(domain); /* Unlock domain */ return SA_ERR_HPI_READ_ONLY; } set_hotswap_auto_insert_timeout(domain, Timeout); rpt = &domain->rpt; /* 1. Get a list of unique handler ids where the resources in this * domain came from. */ hids = g_array_new(FALSE, TRUE, sizeof(guint)); for (rpte = oh_get_resource_by_id(rpt, SAHPI_FIRST_ENTRY); rpte; rpte = oh_get_resource_next(rpt, rpte->ResourceId)) { guint *hidp = (guint *)oh_get_resource_data(rpt, rpte->ResourceId); if (hidp) { int found_hid = 0; /* Store id if we don't have it in the list already */ for (i = 0; i < hids->len; i++) { #if defined(__sparc) || defined(__sparc__) if (((guint *)((void *)(hids->data)))[i] == *hidp) { #else if (g_array_index(hids, guint, i) == *hidp) { #endif found_hid = 1; break; } } if (!found_hid) g_array_append_val(hids, *hidp); } } oh_release_domain(domain); /* Unlock domain */ if (!hids->len) err("Did not find any handlers for domain resources?!"); /* 2. Use list to push down autoInsertTimeoutSet() to those handlers. */ for (i = 0; i < hids->len; i++) { #if defined(__sparc) || defined(__sparc__) guint hid = ((guint *)((void *)(hids->data)))[i]; #else guint hid = g_array_index(hids, guint, i); #endif struct oh_handler *h = oh_get_handler(hid); if (!h || !h->hnd) { err("No such handler %u", hid); error = SA_ERR_HPI_INTERNAL_ERROR; break; } if (h->abi->set_autoinsert_timeout) { error = h->abi->set_autoinsert_timeout(h->hnd, Timeout); } oh_release_handler(h); if (error) break; } g_array_free(hids, TRUE); return error; } SaErrorT SAHPI_API saHpiAutoExtractTimeoutGet( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId, SAHPI_OUT SaHpiTimeoutT *Timeout) { SaErrorT (*get_autoextract_timeout)(void *hnd, SaHpiResourceIdT id, SaHpiTimeoutT *timeout); SaHpiRptEntryT *res; SaHpiDomainIdT did; struct oh_domain *d = NULL; struct oh_handler *h = NULL; SaErrorT error = SA_OK; if (!Timeout) { return SA_ERR_HPI_INVALID_PARAMS; } OH_CHECK_INIT_STATE(SessionId); OH_GET_DID(SessionId, did); OH_GET_DOMAIN(did, d); /* Lock domain */ OH_RESOURCE_GET_CHECK(d, ResourceId, res); if (!(res->ResourceCapabilities & SAHPI_CAPABILITY_MANAGED_HOTSWAP)) { oh_release_domain(d); /* Unlock domain */ return SA_ERR_HPI_CAPABILITY; } OH_HANDLER_GET(d, ResourceId, h); oh_release_domain(d); /* Unlock Domain */ get_autoextract_timeout = h ? h->abi->get_autoextract_timeout : NULL; if (!get_autoextract_timeout) { oh_release_handler(h); return SA_ERR_HPI_INVALID_CMD; } error = get_autoextract_timeout(h->hnd, ResourceId, Timeout); oh_release_handler(h); return error; } SaErrorT SAHPI_API saHpiAutoExtractTimeoutSet( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId, SAHPI_IN SaHpiTimeoutT Timeout) { SaErrorT (*set_autoextract_timeout)(void *hnd, SaHpiResourceIdT id, SaHpiTimeoutT timeout); SaHpiRptEntryT *res; SaHpiDomainIdT did; struct oh_domain *d = NULL; struct oh_handler *h = NULL; SaErrorT error = SA_OK; if (Timeout != SAHPI_TIMEOUT_IMMEDIATE && Timeout != SAHPI_TIMEOUT_BLOCK && Timeout < 0) return SA_ERR_HPI_INVALID_PARAMS; OH_CHECK_INIT_STATE(SessionId); OH_GET_DID(SessionId, did); OH_GET_DOMAIN(did, d); /* Lock domain */ OH_RESOURCE_GET_CHECK(d, ResourceId, res); if (!(res->ResourceCapabilities & SAHPI_CAPABILITY_MANAGED_HOTSWAP)) { oh_release_domain(d); /* Unlock domain */ return SA_ERR_HPI_CAPABILITY; } OH_HANDLER_GET(d, ResourceId, h); oh_release_domain(d); /* Unlock Domain */ set_autoextract_timeout = h ? h->abi->set_autoextract_timeout : NULL; if (!set_autoextract_timeout) { oh_release_handler(h); return SA_ERR_HPI_INVALID_CMD; } error = set_autoextract_timeout(h->hnd, ResourceId, Timeout); oh_release_handler(h); return error; } SaErrorT SAHPI_API saHpiHotSwapStateGet ( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId, SAHPI_OUT SaHpiHsStateT *State) { SaErrorT rv; SaErrorT (*get_hotswap_state)(void *hnd, SaHpiResourceIdT rid, SaHpiHsStateT *state); SaHpiRptEntryT *res; struct oh_handler *h; SaHpiDomainIdT did; struct oh_domain *d = NULL; if (!State) { return SA_ERR_HPI_INVALID_PARAMS; } OH_CHECK_INIT_STATE(SessionId); OH_GET_DID(SessionId, did); OH_GET_DOMAIN(did, d); /* Lock domain */ OH_RESOURCE_GET_CHECK(d, ResourceId, res); if (!(res->ResourceCapabilities & SAHPI_CAPABILITY_MANAGED_HOTSWAP)) { oh_release_domain(d); /* Unlock domain */ return SA_ERR_HPI_CAPABILITY; } OH_HANDLER_GET(d, ResourceId, h); oh_release_domain(d); /* Unlock domain */ get_hotswap_state = h ? h->abi->get_hotswap_state : NULL; if (!get_hotswap_state) { oh_release_handler(h); return SA_ERR_HPI_INVALID_CMD; } rv = get_hotswap_state(h->hnd, ResourceId, State); oh_release_handler(h); return rv; } SaErrorT SAHPI_API saHpiHotSwapActionRequest ( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId, SAHPI_IN SaHpiHsActionT Action) { SaErrorT rv; SaErrorT (*request_hotswap_action)(void *hnd, SaHpiResourceIdT rid, SaHpiHsActionT act); SaHpiRptEntryT *res; struct oh_handler *h; SaHpiDomainIdT did; SaHpiHsStateT currentstate; struct oh_domain *d = NULL; if (!oh_lookup_hsaction(Action)) { return SA_ERR_HPI_INVALID_PARAMS; } OH_CHECK_INIT_STATE(SessionId); OH_GET_DID(SessionId, did); OH_GET_DOMAIN(did, d); /* Lock domain */ OH_RESOURCE_GET_CHECK(d, ResourceId, res); if (!(res->ResourceCapabilities & SAHPI_CAPABILITY_MANAGED_HOTSWAP)) { oh_release_domain(d); /* Unlock domain */ return SA_ERR_HPI_CAPABILITY; } rv = saHpiHotSwapStateGet(SessionId, ResourceId, ¤tstate); if(rv != SA_OK) { err("Failed to determine current HS state of Resource %d", ResourceId); oh_release_domain(d); /* Unlock domain */ return rv; } /* Action already validated, let's check HS state */ if( ((Action == SAHPI_HS_ACTION_INSERTION) && (currentstate != SAHPI_HS_STATE_INACTIVE)) || ((Action == SAHPI_HS_ACTION_EXTRACTION) && (currentstate != SAHPI_HS_STATE_ACTIVE))) { err("Invalid actionrequest %s from state %s", oh_lookup_hsaction(Action), oh_lookup_hsstate(currentstate)); oh_release_domain(d); return SA_ERR_HPI_INVALID_REQUEST; } OH_HANDLER_GET(d, ResourceId, h); oh_release_domain(d); /* Unlock domain */ request_hotswap_action = h ? h->abi->request_hotswap_action : NULL; if (!request_hotswap_action) { oh_release_handler(h); return SA_ERR_HPI_INVALID_CMD; } rv = request_hotswap_action(h->hnd, ResourceId, Action); oh_release_handler(h); oh_wake_event_thread(SAHPI_TRUE); return rv; } SaErrorT SAHPI_API saHpiHotSwapIndicatorStateGet ( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId, SAHPI_OUT SaHpiHsIndicatorStateT *State) { SaErrorT rv; SaErrorT (*get_indicator_state)(void *hnd, SaHpiResourceIdT id, SaHpiHsIndicatorStateT *state); SaHpiRptEntryT *res; struct oh_handler *h; SaHpiDomainIdT did; struct oh_domain *d = NULL; if (!State) { return SA_ERR_HPI_INVALID_PARAMS; } OH_CHECK_INIT_STATE(SessionId); OH_GET_DID(SessionId, did); OH_GET_DOMAIN(did, d); /* Lock domain */ OH_RESOURCE_GET_CHECK(d, ResourceId, res); if (!(res->ResourceCapabilities & SAHPI_CAPABILITY_MANAGED_HOTSWAP)) { oh_release_domain(d); /* Unlock domain */ return SA_ERR_HPI_CAPABILITY; } if (!(res->HotSwapCapabilities & SAHPI_HS_CAPABILITY_INDICATOR_SUPPORTED)) { oh_release_domain(d); /* Unlock domain */ return SA_ERR_HPI_CAPABILITY; } OH_HANDLER_GET(d, ResourceId, h); oh_release_domain(d); /* Unlock domain */ get_indicator_state = h ? h->abi->get_indicator_state : NULL; if (!get_indicator_state) { oh_release_handler(h); return SA_ERR_HPI_INVALID_CMD; } rv = get_indicator_state(h->hnd, ResourceId, State); oh_release_handler(h); return rv; } SaErrorT SAHPI_API saHpiHotSwapIndicatorStateSet ( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId, SAHPI_IN SaHpiHsIndicatorStateT State) { SaErrorT rv; SaErrorT (*set_indicator_state)(void *hnd, SaHpiResourceIdT id, SaHpiHsIndicatorStateT state); SaHpiRptEntryT *res; struct oh_handler *h; SaHpiDomainIdT did; struct oh_domain *d = NULL; if (!oh_lookup_hsindicatorstate(State)) { return SA_ERR_HPI_INVALID_PARAMS; } OH_CHECK_INIT_STATE(SessionId); OH_GET_DID(SessionId, did); OH_GET_DOMAIN(did, d); /* Lock domain */ OH_RESOURCE_GET_CHECK(d, ResourceId, res); if (!(res->ResourceCapabilities & SAHPI_CAPABILITY_MANAGED_HOTSWAP)) { oh_release_domain(d); /* Unlock domain */ return SA_ERR_HPI_CAPABILITY; } if (!(res->HotSwapCapabilities & SAHPI_HS_CAPABILITY_INDICATOR_SUPPORTED)) { oh_release_domain(d); /* Unlock domain */ return SA_ERR_HPI_CAPABILITY; } OH_HANDLER_GET(d, ResourceId, h); oh_release_domain(d); /* Unlock domain */ set_indicator_state = h ? h->abi->set_indicator_state : NULL; if (!set_indicator_state) { oh_release_handler(h); return SA_ERR_HPI_INVALID_CMD; } rv = set_indicator_state(h->hnd, ResourceId, State); oh_release_handler(h); return rv; } /******************************************************************************* * * Configuration Function(s) * ******************************************************************************/ SaErrorT SAHPI_API saHpiParmControl ( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId, SAHPI_IN SaHpiParmActionT Action) { SaErrorT rv; SaErrorT (*control_parm)(void *, SaHpiResourceIdT, SaHpiParmActionT); SaHpiRptEntryT *res; struct oh_handler *h; SaHpiDomainIdT did; struct oh_domain *d = NULL; if (!oh_lookup_parmaction(Action)) { return SA_ERR_HPI_INVALID_PARAMS; } OH_CHECK_INIT_STATE(SessionId); OH_GET_DID(SessionId, did); OH_GET_DOMAIN(did, d); /* Lock domain */ OH_RESOURCE_GET_CHECK(d, ResourceId, res); if (!(res->ResourceCapabilities & SAHPI_CAPABILITY_CONFIGURATION)) { oh_release_domain(d); /* Unlock domain */ return SA_ERR_HPI_CAPABILITY; } OH_HANDLER_GET(d, ResourceId, h); oh_release_domain(d); /* Unlock domain */ control_parm = h ? h->abi->control_parm : NULL; if (!control_parm) { oh_release_handler(h); return SA_ERR_HPI_INVALID_CMD; } rv = control_parm(h->hnd, ResourceId, Action); oh_release_handler(h); return rv; } /******************************************************************************* * * Load Management * ******************************************************************************/ SaErrorT SAHPI_API saHpiResourceLoadIdGet ( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId, SAHPI_OUT SaHpiLoadIdT *LoadId) { SaErrorT error; SaErrorT (*load_id_get)(void *, SaHpiResourceIdT, SaHpiLoadIdT *); SaHpiRptEntryT *rpte; struct oh_handler *h = NULL; SaHpiDomainIdT did; struct oh_domain *d = NULL; if (LoadId == NULL) { return SA_ERR_HPI_INVALID_PARAMS; } OH_CHECK_INIT_STATE(SessionId); OH_GET_DID(SessionId, did); OH_GET_DOMAIN(did, d); /* Lock domain */ OH_RESOURCE_GET_CHECK(d, ResourceId, rpte); if (!(rpte->ResourceCapabilities & SAHPI_CAPABILITY_LOAD_ID)) { oh_release_domain(d); /* Unlock domain */ return SA_ERR_HPI_CAPABILITY; } OH_HANDLER_GET(d, ResourceId, h); oh_release_domain(d); /* Unlock domain */ load_id_get = h ? h->abi->load_id_get : NULL; if (!load_id_get) { oh_release_handler(h); return SA_ERR_HPI_INTERNAL_ERROR; } error = load_id_get(h->hnd, ResourceId, LoadId); oh_release_handler(h); return error; } SaErrorT SAHPI_API saHpiResourceLoadIdSet ( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId, SAHPI_IN SaHpiLoadIdT *LoadId) { SaErrorT error; SaErrorT (*load_id_set)(void *, SaHpiResourceIdT, SaHpiLoadIdT *); SaHpiRptEntryT *rpte; struct oh_handler *h = NULL; SaHpiDomainIdT did; struct oh_domain *d = NULL; if (LoadId == NULL) { /* Spec doesn't say what to return in this case */ return SA_ERR_HPI_INVALID_PARAMS; } OH_CHECK_INIT_STATE(SessionId); OH_GET_DID(SessionId, did); OH_GET_DOMAIN(did, d); /* Lock domain */ OH_RESOURCE_GET_CHECK(d, ResourceId, rpte); if (!(rpte->ResourceCapabilities & SAHPI_CAPABILITY_LOAD_ID)) { oh_release_domain(d); /* Unlock domain */ return SA_ERR_HPI_CAPABILITY; } OH_HANDLER_GET(d, ResourceId, h); oh_release_domain(d); /* Unlock domain */ load_id_set = h ? h->abi->load_id_set : NULL; if (!load_id_set) { oh_release_handler(h); return SA_ERR_HPI_INTERNAL_ERROR; } error = load_id_set(h->hnd, ResourceId, LoadId); oh_release_handler(h); return error; } /******************************************************************************* * * Reset Functions * ******************************************************************************/ SaErrorT SAHPI_API saHpiResourceResetStateGet ( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId, SAHPI_OUT SaHpiResetActionT *ResetAction) { SaErrorT rv; SaErrorT (*get_func)(void *, SaHpiResourceIdT, SaHpiResetActionT *); SaHpiRptEntryT *res; struct oh_handler *h; SaHpiDomainIdT did; struct oh_domain *d = NULL; if (!ResetAction) { return SA_ERR_HPI_INVALID_PARAMS; } OH_CHECK_INIT_STATE(SessionId); OH_GET_DID(SessionId, did); OH_GET_DOMAIN(did, d); /* Lock domain */ OH_RESOURCE_GET_CHECK(d, ResourceId, res); if (!(res->ResourceCapabilities & SAHPI_CAPABILITY_RESET)) { oh_release_domain(d); /* Unlock domain */ return SA_ERR_HPI_CAPABILITY; } OH_HANDLER_GET(d, ResourceId, h); oh_release_domain(d); /* Unlock domain */ get_func = h ? h->abi->get_reset_state : NULL; if (!get_func) { oh_release_handler(h); return SA_ERR_HPI_INVALID_CMD; } rv = get_func(h->hnd, ResourceId, ResetAction); oh_release_handler(h); return rv; } SaErrorT SAHPI_API saHpiResourceResetStateSet ( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId, SAHPI_IN SaHpiResetActionT ResetAction) { SaErrorT rv; SaErrorT (*set_func)(void *, SaHpiResourceIdT, SaHpiResetActionT); SaHpiRptEntryT *res; struct oh_handler *h; SaHpiDomainIdT did; struct oh_domain *d = NULL; if (!oh_lookup_resetaction(ResetAction)) { return SA_ERR_HPI_INVALID_PARAMS; } OH_CHECK_INIT_STATE(SessionId); OH_GET_DID(SessionId, did); OH_GET_DOMAIN(did, d); /* Lock domain */ OH_RESOURCE_GET_CHECK(d, ResourceId, res); if (!(res->ResourceCapabilities & SAHPI_CAPABILITY_RESET)) { oh_release_domain(d); /* Unlock domain */ return SA_ERR_HPI_CAPABILITY; } OH_HANDLER_GET(d, ResourceId, h); oh_release_domain(d); /* Unlock domain */ set_func = h ? h->abi->set_reset_state : NULL; if (!set_func) { oh_release_handler(h); return SA_ERR_HPI_INVALID_CMD; } rv = set_func(h->hnd, ResourceId, ResetAction); oh_release_handler(h); return rv; } /******************************************************************************* * * Power Functions * ******************************************************************************/ SaErrorT SAHPI_API saHpiResourcePowerStateGet ( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId, SAHPI_OUT SaHpiPowerStateT *State) { SaErrorT rv; SaErrorT (*get_power_state)(void *hnd, SaHpiResourceIdT id, SaHpiPowerStateT *state); SaHpiRptEntryT *res; struct oh_handler *h; SaHpiDomainIdT did; struct oh_domain *d = NULL; if (State == NULL) { return SA_ERR_HPI_INVALID_PARAMS; } OH_CHECK_INIT_STATE(SessionId); OH_GET_DID(SessionId, did); OH_GET_DOMAIN(did, d); /* Lock domain */ OH_RESOURCE_GET_CHECK(d, ResourceId, res); if (!(res->ResourceCapabilities & SAHPI_CAPABILITY_POWER)) { oh_release_domain(d); /* Unlock domain */ return SA_ERR_HPI_CAPABILITY; } OH_HANDLER_GET(d, ResourceId, h); oh_release_domain(d); /* Unlock domain */ get_power_state = h ? h->abi->get_power_state : NULL; if (!get_power_state) { oh_release_handler(h); return SA_ERR_HPI_INVALID_CMD; } rv = get_power_state(h->hnd, ResourceId, State); oh_release_handler(h); return rv; } SaErrorT SAHPI_API saHpiResourcePowerStateSet ( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId, SAHPI_IN SaHpiPowerStateT State) { SaErrorT rv; SaErrorT (*set_power_state)(void *hnd, SaHpiResourceIdT id, SaHpiPowerStateT state); SaHpiRptEntryT *res; struct oh_handler *h; SaHpiDomainIdT did; struct oh_domain *d = NULL; if (!oh_lookup_powerstate(State)) { return SA_ERR_HPI_INVALID_PARAMS; } OH_CHECK_INIT_STATE(SessionId); OH_GET_DID(SessionId, did); OH_GET_DOMAIN(did, d); /* Lock domain */ OH_RESOURCE_GET_CHECK(d, ResourceId, res); if (!(res->ResourceCapabilities & SAHPI_CAPABILITY_POWER)) { oh_release_domain(d); /* Unlock domain */ return SA_ERR_HPI_CAPABILITY; } OH_HANDLER_GET(d, ResourceId, h); oh_release_domain(d); /* Unlock domain */ set_power_state = h ? h->abi->set_power_state : NULL; if (!set_power_state) { oh_release_handler(h); return SA_ERR_HPI_INVALID_CMD; } rv = set_power_state(h->hnd, ResourceId, State); oh_release_handler(h); return rv; } openhpi-2.14.1/src/threaded.c0000644000076400007640000002220611302567034012707 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005-2006 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * Renier Morales * */ #include #include #include #include #include #define OH_DISCOVERY_THREAD_SLEEP_TIME 180 * G_USEC_PER_SEC #define OH_EVTGET_THREAD_SLEEP_TIME 3 * G_USEC_PER_SEC GCond *oh_evtget_thread_wait = NULL; GThread *oh_evtget_thread = NULL; GError *oh_evtget_thread_error = NULL; GMutex *oh_evtget_thread_mutex = NULL; GStaticMutex oh_wake_evtget_mutex = G_STATIC_MUTEX_INIT; GThread *oh_evtpop_thread = NULL; GError *oh_evtpop_thread_error = NULL; GMutex *oh_evtpop_thread_mutex = NULL; GThread *oh_discovery_thread = NULL; GError *oh_discovery_thread_error = NULL; GMutex *oh_discovery_thread_mutex = NULL; GCond *oh_discovery_thread_wait = NULL; GStaticMutex oh_wake_discovery_mutex = G_STATIC_MUTEX_INIT; static int oh_discovery_init(void) { /* Nothing to do here...for now */ return 0; } static int oh_discovery_final(void) { g_mutex_free(oh_discovery_thread_mutex); g_cond_free(oh_discovery_thread_wait); return 0; } static int oh_event_final(void) { /*g_async_queue_unref(oh_process_q);*/ g_mutex_free(oh_evtget_thread_mutex); g_cond_free(oh_evtget_thread_wait); g_mutex_free(oh_evtpop_thread_mutex); return 0; } static gpointer oh_discovery_thread_loop(gpointer data) { GTimeVal time; SaErrorT error = SA_OK; g_mutex_lock(oh_discovery_thread_mutex); while (1) { dbg("Doing threaded discovery on all handlers"); error = oh_discovery(); if (error) { dbg("Got error on threaded discovery return."); } /* Let oh_wake_discovery_thread know this thread is done */ g_cond_broadcast(oh_discovery_thread_wait); g_get_current_time(&time); g_time_val_add(&time, OH_DISCOVERY_THREAD_SLEEP_TIME); /* Go to sleep; let oh_wake_discovery_thread take the mutex */ dbg("Going to sleep"); if (g_cond_timed_wait(oh_discovery_thread_wait, oh_discovery_thread_mutex, &time)) dbg("SIGNALED: Got signal from saHpiDiscover()"); else dbg("TIMEDOUT: Woke up, am doing discovery again"); } g_mutex_unlock(oh_discovery_thread_mutex); g_thread_exit(0); return data; } static gpointer oh_evtpop_thread_loop(gpointer data) { SaErrorT error = SA_OK; g_mutex_lock(oh_evtpop_thread_mutex); while(1) { dbg("Thread processing events"); error = oh_process_events(); if (error != SA_OK) err("Error on processing of events."); } g_mutex_unlock(oh_evtpop_thread_mutex); g_thread_exit(0); return data; } static gpointer oh_evtget_thread_loop(gpointer data) { GTimeVal time; SaErrorT error = SA_OK; static int first_loop = 1; g_mutex_lock(oh_evtget_thread_mutex); while (1) { /* Give the discovery time to start first -> FIXME */ if (first_loop) { struct timespec sleepytime = { .tv_sec = 0, .tv_nsec = 500000000}; first_loop = 0; nanosleep(&sleepytime, NULL); } dbg("Thread Harvesting events"); error = oh_harvest_events(); if (error != SA_OK) err("Error on harvest of events."); /* Let oh_wake_evtget_thread know this thread is done */ g_cond_broadcast(oh_evtget_thread_wait); g_get_current_time(&time); g_time_val_add(&time, OH_EVTGET_THREAD_SLEEP_TIME); dbg("Going to sleep"); if (g_cond_timed_wait(oh_evtget_thread_wait, oh_evtget_thread_mutex, &time)) dbg("SIGNALED: Got signal from plugin"); else dbg("TIMEDOUT: Woke up, am looping again"); } g_mutex_unlock(oh_evtget_thread_mutex); g_thread_exit(0); return data; } int oh_threaded_init() { int error = 0; dbg("Attempting to init event"); if (!g_thread_supported()) { dbg("Initializing thread support"); g_thread_init(NULL); } else { dbg("Already supporting threads"); } error = oh_event_init(); if (oh_discovery_init() || error) error = 1; return error; } int oh_threaded_start() { dbg("Starting discovery thread"); oh_discovery_thread_wait = g_cond_new(); oh_discovery_thread_mutex = g_mutex_new(); oh_discovery_thread = g_thread_create(oh_discovery_thread_loop, NULL, FALSE, &oh_discovery_thread_error); dbg("Starting event threads"); oh_evtget_thread_wait = g_cond_new(); oh_evtget_thread_mutex = g_mutex_new(); oh_evtget_thread = g_thread_create(oh_evtget_thread_loop, NULL, FALSE, &oh_evtget_thread_error); oh_evtpop_thread_mutex = g_mutex_new(); oh_evtpop_thread = g_thread_create(oh_evtpop_thread_loop, NULL, FALSE, &oh_evtpop_thread_error); return 0; } int oh_threaded_final() { oh_discovery_final(); oh_event_final(); return 0; } /** * oh_wake_discovery_thread * @wait: Says whether we should wait for the discovery thread * to do one round through the plugin instances. Otherwise, we * just knock on the discovery thread's door and return quickly. * * If wait is true, the discovery thread is woken up * and we wait until it does a round throughout the * plugin instances. If the thread is already running, * we will wait for it until it completes the round. * * Returns: void **/ void oh_wake_discovery_thread(SaHpiBoolT wait) { if (!wait) { /* If not waiting, just signal the thread and go. */ g_cond_broadcast(oh_discovery_thread_wait); return; } g_static_mutex_lock(&oh_wake_discovery_mutex); if (g_mutex_trylock(oh_discovery_thread_mutex)) { /* The thread was asleep; wake it up. */ dbg("Going to wait for discovery thread to loop once."); g_cond_broadcast(oh_discovery_thread_wait); g_cond_wait(oh_discovery_thread_wait, oh_discovery_thread_mutex); dbg("Got signal from discovery" " thread being done. Giving lock back"); g_mutex_unlock(oh_discovery_thread_mutex); } else { /* Thread was already up. Wait until it completes */ dbg("Waiting for discovery thread..."); g_mutex_lock(oh_discovery_thread_mutex); dbg("...Done waiting for discovery thread."); g_mutex_unlock(oh_discovery_thread_mutex); } g_static_mutex_unlock(&oh_wake_discovery_mutex); return; } /** * oh_wake_event_thread * @wait: Says whether we should wait for the event thread * to do one round through the plugin instances. Otherwise, we * just knock on the event thread's door and return quickly. * * If wait is true, the event thread is woken up * and we wait until it does a round throughout the * plugin instances. If the thread is already running, * we will wait for it until it completes the round. * * Returns: void **/ void oh_wake_event_thread(SaHpiBoolT wait) { if (!wait) { /* If not waiting, just signal the thread and go. */ g_cond_broadcast(oh_evtget_thread_wait); return; } g_static_mutex_lock(&oh_wake_evtget_mutex); if (g_mutex_trylock(oh_evtget_thread_mutex)) { /* The thread was asleep; wake it up. */ dbg("Going to wait for event thread to loop once."); g_cond_broadcast(oh_evtget_thread_wait); g_cond_wait(oh_evtget_thread_wait, oh_evtget_thread_mutex); dbg("Got signal from event" " thread being done. Giving lock back"); g_mutex_unlock(oh_evtget_thread_mutex); } else { /* Thread was already up. Wait until it completes */ dbg("Waiting for event thread..."); g_mutex_lock(oh_evtget_thread_mutex); dbg("...Done waiting for event thread."); g_mutex_unlock(oh_evtget_thread_mutex); } g_static_mutex_unlock(&oh_wake_evtget_mutex); return; } openhpi-2.14.1/src/event.c0000644000076400007640000003150011302567034012245 0ustar /* -*- linux-c -*- * * Copyright (c) 2003 by Intel Corp. * (C) Copyright IBM Corp. 2003-2006 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Louis Zhuang * David Judkovics * Sean Dague * Renier Morales * Racing Guo */ #include #include #include #include #include #include #include #include #include #include struct _oh_evt_queue { GAsyncQueue *q; }; oh_evt_queue oh_process_q = { .q = NULL }; extern GMutex *oh_event_thread_mutex; /* * The following is required to set up the thread state for * the use of event async queues. This is true even if we aren't * using live threads. */ int oh_event_init() { dbg("Setting up event processing queue"); if (!oh_process_q.q) oh_process_q.q = g_async_queue_new(); if (oh_process_q.q) { dbg("Set up processing queue"); return 1; } else { err("Failed to allocate processing queue"); return 0; } } void oh_evt_queue_push(oh_evt_queue *equeue, gpointer data) { g_async_queue_push(equeue->q, data); return; } void oh_event_free(struct oh_event *e, int only_rdrs) { if (e) { if (e->rdrs) { GSList *node = NULL; for (node = e->rdrs; node; node = node->next) { g_free(node->data); } g_slist_free(e->rdrs); } if (!only_rdrs) g_free(e); } } struct oh_event *oh_dup_event(struct oh_event *old_event) { GSList *node = NULL; struct oh_event *e = NULL; if (!old_event) return NULL; e = (struct oh_event *)g_malloc0(sizeof(struct oh_event)); *e = *old_event; e->rdrs = NULL; for (node = old_event->rdrs; node; node = node->next) { e->rdrs = g_slist_append(e->rdrs, g_memdup(node->data, sizeof(SaHpiRdrT))); } return e; } /* * Event processing is split up into 2 stages * 1. Harvesting of the events * 2. Processing of the events into: Domain Event Log, Alarm Table, * Session queues, Resource Precense Table. * */ static SaErrorT harvest_events_for_handler(struct oh_handler *h) { SaErrorT error = SA_OK; if (!h->hnd || !h->abi->get_event) return SA_OK; do { error = h->abi->get_event(h->hnd); if (error < 1) { dbg("Handler is out of Events"); } } while (error > 0); return SA_OK; } SaErrorT oh_harvest_events() { SaErrorT error = SA_ERR_HPI_ERROR; unsigned int hid = 0, next_hid; struct oh_handler *h = NULL; oh_getnext_handler_id(hid, &next_hid); while (next_hid) { dbg("harvesting for %d", next_hid); hid = next_hid; h = oh_get_handler(hid); if (!h) { err("No such handler %d", hid); break; } /* * Here we want to record an error unless there is * at least one harvest_events_for_handler that * finished with SA_OK. (RM 1/6/2005) */ if (harvest_events_for_handler(h) == SA_OK && error) error = SA_OK; oh_release_handler(h); oh_getnext_handler_id(hid, &next_hid); } return error; } static int oh_add_event_to_del(struct oh_domain *d, struct oh_event *e) { struct oh_global_param param = { .type = OPENHPI_LOG_ON_SEV }; char del_filepath[SAHPI_MAX_TEXT_BUFFER_LENGTH*2]; int error = 0; if (!d || !e) return -1; oh_get_global_param(¶m); /* Events get logged in DEL if they are of high enough severity */ if (e->event.EventType == SAHPI_ET_USER || e->event.Severity <= param.u.log_on_sev) { param.type = OPENHPI_DEL_SAVE; oh_get_global_param(¶m); SaHpiEventLogInfoT elinfo; SaHpiRdrT *rdr = (e->rdrs) ? (SaHpiRdrT *)e->rdrs->data : NULL; SaHpiRptEntryT *rpte = (e->resource.ResourceCapabilities) ? &e->resource : NULL; error = oh_el_info(d->del, &elinfo); if (error == SA_OK && elinfo.Enabled) { error = oh_el_append(d->del, &e->event, rdr, rpte); } if (param.u.del_save) { param.type = OPENHPI_VARPATH; oh_get_global_param(¶m); snprintf(del_filepath, SAHPI_MAX_TEXT_BUFFER_LENGTH*2, "%s/del.%u", param.u.varpath, d->id); oh_el_map_to_file(d->del, del_filepath); } } return error; } static int process_hpi_event(struct oh_domain *d, struct oh_event *e) { int i; GArray *sessions = NULL; SaHpiSessionIdT sid; SaHpiEventT *event = NULL; SaHpiRptEntryT *resource = NULL; SaHpiRdrT *rdr = NULL; if (!d || !e) return -1; event = &e->event; resource = &e->resource; rdr = (e->rdrs) ? (SaHpiRdrT *)e->rdrs->data : NULL; if (event->EventType == SAHPI_ET_USER) { resource->ResourceCapabilities = 0; if (rdr) rdr->RdrType = SAHPI_NO_RECORD; } oh_add_event_to_del(d, e); dbg("Added event to EL"); /* * Here is the SESSION MULTIPLEXING code */ sessions = oh_list_sessions(d->id); if (!sessions) { err("Error: Got an empty session list on domain id %u", d->id); return -2; } dbg("Got session list for domain %u", d->id); /* Drop events if there are no sessions open to receive them. */ if (sessions->len < 1) { g_array_free(sessions, TRUE); dbg("No sessions open for event's domain %u. " "Dropping hpi_event", d->id); return 0; } /* multiplex event to the appropriate sessions */ for (i = 0; i < sessions->len; i++) { SaHpiBoolT is_subscribed = SAHPI_FALSE; #if defined(__sparc) || defined(__sparc__) sid = ((SaHpiSessionIdT *)((void *)(sessions->data)))[i]; #else sid = g_array_index(sessions, SaHpiSessionIdT, i); #endif oh_get_session_subscription(sid, &is_subscribed); if (is_subscribed) { oh_queue_session_event(sid, e); } } g_array_free(sessions, TRUE); dbg("done multiplexing event into sessions"); return 0; } static int process_resource_event(struct oh_domain *d, struct oh_event *e) { RPTable *rpt = NULL; SaHpiRptEntryT *exists = NULL; unsigned int *hidp = NULL; SaErrorT error = SA_OK; SaHpiResourceEventTypeT *retype = NULL; SaHpiHsStateT state = SAHPI_HS_STATE_NOT_PRESENT; SaHpiBoolT process_hpi = TRUE; if (!d || !e) return -1; rpt = &(d->rpt); exists = oh_get_resource_by_id(rpt, e->resource.ResourceId); if (e->event.EventType == SAHPI_ET_RESOURCE) { retype = &e->event.EventDataUnion.ResourceEvent.ResourceEventType; if (*retype != SAHPI_RESE_RESOURCE_FAILURE) { /* If previously failed, set EventT to RESTORED */ if (exists && exists->ResourceFailed) { *retype = SAHPI_RESE_RESOURCE_RESTORED; } else if (exists && !exists->ResourceFailed) { process_hpi = FALSE; } e->resource.ResourceFailed = SAHPI_FALSE; } else { e->resource.ResourceFailed = SAHPI_TRUE; } } else if (e->event.EventType == SAHPI_ET_HOTSWAP) { state = e->event.EventDataUnion.HotSwapEvent.HotSwapState; if (state == SAHPI_HS_STATE_NOT_PRESENT) { oh_remove_resource(rpt, e->resource.ResourceId); } } else { err("Expected a resource or hotswap event."); return -1; } if (e->event.EventType == SAHPI_ET_RESOURCE || (e->event.EventType == SAHPI_ET_HOTSWAP && state != SAHPI_HS_STATE_NOT_PRESENT)) { hidp = g_malloc0(sizeof(unsigned int)); *hidp = e->hid; error = oh_add_resource(rpt, &e->resource, hidp, FREE_RPT_DATA); if (error == SA_OK && !exists) { GSList *node = NULL; for (node = e->rdrs; node; node = node->next) { SaHpiRdrT *rdr = (SaHpiRdrT *)node->data; oh_add_rdr(rpt, e->resource.ResourceId, rdr, NULL, 0); } } } if (process_hpi) process_hpi_event(d, e); return 0; } static int process_event(SaHpiDomainIdT did, struct oh_event *e) { struct oh_domain *d = NULL; if (!e) { err("Got NULL event"); return -1; } d = oh_get_domain(did); if (!d) return -2; dbg("Processing event for domain %u", d->id); switch (e->event.EventType) { case SAHPI_ET_RESOURCE: if (!e->hid) { err("Resource event with invalid handler id! Dropping."); break; } else if (!(e->resource.ResourceCapabilities & SAHPI_CAPABILITY_RESOURCE)) { err("Resource event with invalid capabilities. Dropping."); break; } else if ((e->resource.ResourceCapabilities & SAHPI_CAPABILITY_FRU) && (e->event.EventDataUnion.ResourceEvent.ResourceEventType == SAHPI_RESE_RESOURCE_ADDED)) { err("Invalid event. Resource in resource added event " "has FRU capability. Dropping."); } else { process_resource_event(d, e); } break; case SAHPI_ET_HOTSWAP: if (!e->hid) { err("Hotswap event with invalid handler id! Dropping."); break; } else if (!(e->resource.ResourceCapabilities & SAHPI_CAPABILITY_RESOURCE)) { err("Hotswap event with invalid capabilities. Dropping."); break; } else if (!(e->resource.ResourceCapabilities & SAHPI_CAPABILITY_FRU)) { err("Invalid event. Resource in hotswap event " "has no FRU capability. Dropping."); } else { process_resource_event(d, e); } break; case SAHPI_ET_SENSOR: case SAHPI_ET_SENSOR_ENABLE_CHANGE: case SAHPI_ET_WATCHDOG: case SAHPI_ET_OEM: case SAHPI_ET_DOMAIN: case SAHPI_ET_USER: case SAHPI_ET_DIMI: case SAHPI_ET_DIMI_UPDATE: case SAHPI_ET_FUMI: process_hpi_event(d, e); break; default: err("Don't know what to do for event type %d", e->event.EventType); } oh_detect_event_alarm(d, e); oh_release_domain(d); return 0; } SaErrorT oh_process_events() { struct oh_event *e; // GArray *domain_results = NULL; SaHpiDomainIdT tmp_did; char *et; // domain_results = oh_query_domains(); while ((e = g_async_queue_pop(oh_process_q.q)) != NULL) { et = oh_lookup_eventtype(e->event.EventType); dbg("Event Type = %s", (et) ? et : ""); /* 1. Take care of special cases: user and domain type events */ if (e->event.EventType == SAHPI_ET_DOMAIN) { tmp_did = e->event.Source; e->event.Source = SAHPI_UNSPECIFIED_RESOURCE_ID; process_event(tmp_did, e); goto free_event; } else if (e->event.EventType == SAHPI_ET_USER) { tmp_did = e->resource.ResourceId; e->resource.ResourceId = SAHPI_UNSPECIFIED_RESOURCE_ID; process_event(tmp_did, e); goto free_event; } /* TODO: Include HPI_SW event type in special case */ /* All events get processed in the default domain regardless. */ process_event(OH_DEFAULT_DOMAIN_ID, e); free_event: oh_event_free(e, FALSE); } /* Should never get here */ // g_array_free(domain_results, TRUE); return SA_ERR_HPI_INTERNAL_ERROR; } openhpi-2.14.1/src/t/0000755000076400007640000000000011405006365011223 5ustar openhpi-2.14.1/src/t/Makefile.am0000644000076400007640000000100311302567027013254 0ustar # (C) Copyright IBM Corp 2003, 2004 # All rights reserved. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This # file and program are licensed under a BSD style license. See # the Copying file included with the OpenHPI distribution for # full licensing terms. MAINTAINERCLEANFILES = Makefile.in EXTRA_DIST = ohpi_tests.txt SUBDIRS = ohpi openhpi-2.14.1/src/t/ohpi_tests.txt0000644000076400007640000000476211302567027014161 0ustar Unit Test plan for the OpenHPI API extensions --------------------------------------------- Notes: Tests described here are numbered so that they correspond to the program where they are implemented (e.g. ohpi_.c). **Positive Tests** (expect a good return code.) SaErrorT oHpiHandlerCreate(GHashTable *config, oHpiHandlerIdT *id): (007) Load 'libdummy' and 'libwatchdog', create two handlers on each. SaErrorT oHpiHandlerDestroy(oHpiHandlerIdT id): (008) Same as previous, but destroy handlers and unload plugin. SaErrorT oHpiHandlerInfo(oHpiHandlerIdT id, oHpiHandlerInfoT *info): (009) Load 'libdummy', create handler, get handler info and check for expected information. Destroy handler, unload plugin. SaErrorT oHpiHandlerGetNext(oHpiHandlerIdT id, oHpiHandlerIdT *next_id): (010) Load 'libdummy', create three handlers, iterate through them making sure they match with the expected values. Destroy handlers, unload plugin. SaErrorT oHpiGlobalParamGet(oHpiGlobalParam *param): (035) Set OPENHPI_CONF to valid file. Open session. Get parameter that was set through config file comparing with known value. SaErrorT oHpiGlobalParamSet(oHpiGlobalParam *param): (036) Set a paramter, get it, and compare values. Don't open a session. **Negative Tests** (expect a bad return code) SaErrorT oHpiHandlerCreate(GHashTable *config, oHpiHandlerIdT *id): (024) Pass null as arguments (for each argument). (025) Create handler for plugin that doesn't have a "plugin" key. (026) Create handler for non-existant plugin. SaErrorT oHpiHandlerDestroy(oHpiHandlerIdT id): (027) Pass null as argument. (028) Destroy bogus handler. (029) Destroy handler twice. SaErrorT oHpiHandlerInfo(oHpiHandlerIdT id, oHpiHandlerInfoT *info): (030) Pass null as argument. (031) Pass bogus handler id. SaErrorT oHpiHandlerGetNext(oHpiHandlerIdT id, oHpiHandlerIdT *next_id): (032) Pass null as arguments (for each argument). (033) Get next bogus handler. (034) Create three handlers, destroy one, and get next that one. SaErrorT oHpiGlobalParamGet(oHpiGlobalParam *param): (037) Pass null as arguments. (038) Get bogus parameter. SaErrorT oHpiGlobalParamSet(oHpiGlobalParam *param): (039) Pass null as arguments. openhpi-2.14.1/src/t/ohpi/0000755000076400007640000000000011405006365012162 5ustar openhpi-2.14.1/src/t/ohpi/ohpi_035.c0000644000076400007640000000252611302567027013664 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Renier Morales */ #include #include #include #include /** * Set OPENHPI_CONF to valid file. Open session. Get parameter * that was set through config file comparing with known value. * Pass on success, otherwise a failure. **/ int main(int argc, char **argv) { SaHpiSessionIdT sid = 0; oHpiGlobalParamT onep_param = { .Type = OHPI_ON_EP }; if (saHpiSessionOpen(SAHPI_UNSPECIFIED_DOMAIN_ID, &sid, NULL)) { printf("Could not open session\n"); return -1; } if (oHpiGlobalParamGet(&onep_param)) { printf("Could not get parameter\n"); return -1; } if (onep_param.u.OnEP.Entry[0].EntityType != SAHPI_ENT_SYSTEM_CHASSIS || onep_param.u.OnEP.Entry[0].EntityLocation != 1) return -1; return 0; } openhpi-2.14.1/src/t/ohpi/Makefile.am0000644000076400007640000000540611302567027014226 0ustar # (C) Copyright IBM Corp 2004 # All rights reserved. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This # file and program are licensed under a BSD style license. See # the Copying file included with the OpenHPI distribution for # full licensing terms. MAINTAINERCLEANFILES = Makefile.in MOSTLYCLEANFILES = @TEST_CLEAN@ uid_map EXTRA_DIST = openhpi.conf INCLUDES = @OPENHPI_INCLUDES@ TDEPLIB = $(top_builddir)/src/libopenhpi.la \ $(top_builddir)/utils/libopenhpiutils.la TESTS_ENVIRONMENT = OPENHPI_PATH=$(top_builddir)/plugins/simulator:$(top_builddir)/plugins/watchdog TESTS_ENVIRONMENT += OPENHPI_UID_MAP=$(top_builddir)/src/t/ohpi/uid_map TESTS_ENVIRONMENT += OPENHPI_CONF=$(top_srcdir)/src/t/ohpi/openhpi.conf TESTS_ENVIRONMENT += LD_LIBRARY_PATH=$(top_srcdir)/src/.libs:$(top_srcdir)/ssl/.libs:$(top_srcdir)/utils/.libs TESTS = \ ohpi_007 \ ohpi_008 \ ohpi_009 \ ohpi_010 \ ohpi_024 \ ohpi_025 \ ohpi_026 \ ohpi_027 \ ohpi_028 \ ohpi_029 \ ohpi_030 \ ohpi_031 \ ohpi_032 \ ohpi_033 \ ohpi_034 \ ohpi_035 \ ohpi_036 \ ohpi_037 \ ohpi_038 \ ohpi_039 \ ohpi_version \ hpiinjector check_PROGRAMS = $(TESTS) ohpi_007_SOURCES = ohpi_007.c ohpi_007_LDADD = $(TDEPLIB) ohpi_008_SOURCES = ohpi_008.c ohpi_008_LDADD = $(TDEPLIB) ohpi_009_SOURCES = ohpi_009.c ohpi_009_LDADD = $(TDEPLIB) ohpi_010_SOURCES = ohpi_010.c ohpi_010_LDADD = $(TDEPLIB) ohpi_024_SOURCES = ohpi_024.c ohpi_024_LDADD = $(TDEPLIB) ohpi_025_SOURCES = ohpi_025.c ohpi_025_LDADD = $(TDEPLIB) ohpi_026_SOURCES = ohpi_026.c ohpi_026_LDADD = $(TDEPLIB) ohpi_027_SOURCES = ohpi_027.c ohpi_027_LDADD = $(TDEPLIB) ohpi_028_SOURCES = ohpi_028.c ohpi_028_LDADD = $(TDEPLIB) ohpi_029_SOURCES = ohpi_029.c ohpi_029_LDADD = $(TDEPLIB) ohpi_030_SOURCES = ohpi_030.c ohpi_030_LDADD = $(TDEPLIB) ohpi_031_SOURCES = ohpi_031.c ohpi_031_LDADD = $(TDEPLIB) ohpi_032_SOURCES = ohpi_032.c ohpi_032_LDADD = $(TDEPLIB) ohpi_033_SOURCES = ohpi_033.c ohpi_033_LDADD = $(TDEPLIB) ohpi_034_SOURCES = ohpi_034.c ohpi_034_LDADD = $(TDEPLIB) ohpi_035_SOURCES = ohpi_035.c ohpi_035_LDADD = $(TDEPLIB) ohpi_036_SOURCES = ohpi_036.c ohpi_036_LDADD = $(TDEPLIB) ohpi_037_SOURCES = ohpi_037.c ohpi_037_LDADD = $(TDEPLIB) ohpi_038_SOURCES = ohpi_038.c ohpi_038_LDADD = $(TDEPLIB) ohpi_039_SOURCES = ohpi_039.c ohpi_039_LDADD = $(TDEPLIB) ohpi_version_SOURCES = ohpi_version.c ohpi_version_LDADD = $(TDEPLIB) hpiinjector_SOURCES = hpiinjector.c hpiinjector_LDADD = $(TDEPLIB) openhpi-2.14.1/src/t/ohpi/ohpi_027.c0000644000076400007640000000267211302567027013667 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Renier Morales */ #include #include #include /** * Destroy a handler, passing NULL for arguments. * Pass on error, otherwise test failed. **/ int main(int argc, char **argv) { SaHpiSessionIdT sid = 0; GHashTable *config = g_hash_table_new(g_str_hash, g_str_equal); oHpiHandlerIdT hid = 0; setenv("OPENHPI_CONF","./noconfig", 1); if (saHpiSessionOpen(SAHPI_UNSPECIFIED_DOMAIN_ID, &sid, NULL)) return -1; /* Set configuration. */ g_hash_table_insert(config, "plugin", "libsimulator"); g_hash_table_insert(config, "entity_root", "{SYSTEM_CHASSIS,1}"); g_hash_table_insert(config, "name", "test"); g_hash_table_insert(config, "addr", "0"); if (oHpiHandlerCreate(config, &hid)) return -1; if (!oHpiHandlerDestroy(0)) return -1; return 0; } openhpi-2.14.1/src/t/ohpi/ohpi_030.c0000644000076400007640000000271711302567027013661 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Renier Morales */ #include #include #include #include /** * Call oHpiHandlerInfo using NULL as arguments. * Pass on error, otherwise test failed. **/ int main(int argc, char **argv) { SaHpiSessionIdT sid = 0; GHashTable *config = g_hash_table_new(g_str_hash, g_str_equal); oHpiHandlerIdT hid = 0; setenv("OPENHPI_CONF","./noconfig", 1); if (saHpiSessionOpen(SAHPI_UNSPECIFIED_DOMAIN_ID, &sid, NULL)) return -1; /* Set configuration. */ g_hash_table_insert(config, "plugin", "libsimulator"); g_hash_table_insert(config, "entity_root", "{SYSTEM_CHASSIS,1}"); g_hash_table_insert(config, "name", "test"); g_hash_table_insert(config, "addr", "0"); if (oHpiHandlerCreate(config, &hid)) return -1; if (!oHpiHandlerInfo(0, NULL)) return -1; return 0; } openhpi-2.14.1/src/t/ohpi/hpiinjector.c0000644000076400007640000001207711302567027014656 0ustar /* -*- linux-c -*- * * Copyright (c) 2003 by Intel Corp. * (C) Copyright IBM Corp. 2004,2006 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Peter D. Phan * Tariq Shureih * David Judkovics * Renier Morales * * * Changes: * 11/03/2004 kouzmich Fixed Bug #1057934 * djudkovi Copied from hpifru.c and modified for general use * 11/30/2006 renierm Suppressed unneeded output from test * */ #include #include #include #include #include #include #include #include #define TOKEN "Hello America" #define all_resources 255 /* * Globals for this driver */ char progver[] = "0.2 HPI-B"; char progname[] = "hpiinjector"; int fdebug = 0; int f_listall = 0; int f_rpt = 0; int f_sensor = 0; int f_inv = 0; int f_ctrl = 0; int f_rdr = 0; int f_wdog = 0; int f_ann = 0; int f_overview = 0; /* * Main */ int main(int argc, char **argv) { SaErrorT rv = SA_OK; SaHpiVersionT hpiVer; SaHpiSessionIdT sessionid; SaHpiResourceIdT resourceid = all_resources; int c; while ( (c = getopt( argc, argv,"adrsoiwcn:x?")) != EOF ) { switch(c) { case 'a': f_listall = 1; break; case 'c': f_ctrl = 1; break; case 'd': f_rdr = 1; break; case 'i': f_inv = 1; break; case 'r': f_rpt = 1; break; case 's': f_sensor = 1; break; case 'w': f_wdog = 1; break; case 'o': f_overview = 1; break; case 'n': if (optarg) resourceid = atoi(optarg); else resourceid = all_resources; break; case 'x': fdebug = 1; break; default: printf("\n\tUsage: %s [-option]\n\n", progname); printf("\t (No Option) Display all rpts and rdrs\n"); printf("\t -a Display all rpts and rdrs\n"); printf("\t -c Display only controls\n"); printf("\t -d Display rdr records\n"); printf("\t -i Display only inventories\n"); printf("\t -o Display system overview: rpt & rdr headers\n"); printf("\t -r Display only rpts\n"); printf("\t -s Display only sensors\n"); printf("\t -w Display only watchdog\n"); printf("\t -n Select particular resource id to display\n"); printf("\t (Used with [-cdirs] options)\n"); printf("\t -x Display debug messages\n"); printf("\n\n\n\n"); exit(1); } } if (argc == 1) f_listall = 1; /* * House keeping: * -- get (check?) hpi implementation version * -- open hpi session */ if (fdebug) printf("saHpiVersionGet\n"); hpiVer = saHpiVersionGet(); if (fdebug) printf("saHpiSessionOpen\n"); rv = saHpiSessionOpen(SAHPI_UNSPECIFIED_DOMAIN_ID,&sessionid,NULL); if (rv != SA_OK) { printf("saHpiSessionOpen returns %s\n",oh_lookup_error(rv)); exit(-1); } if (fdebug) printf("saHpiSessionOpen returns with SessionId %d\n", sessionid); /* * Resource discovery */ if (fdebug) printf("saHpiDiscover\n"); rv = saHpiDiscover(sessionid); if (rv != SA_OK) { printf("saHpiDiscover returns %s\n",oh_lookup_error(rv)); exit(-1); } SaHpiEventT event; SaHpiRptEntryT rpte; // oHpiRdrArrayT rdrs; memset(&event, 0, sizeof(SaHpiEventT)); memset(&rpte, 0, sizeof(SaHpiRptEntryT)); // memset(&rdrs, 0, sizeof(oHpiRdrArrayT)); SaHpiRdrT rdr; memset(&rdr, 0, sizeof(SaHpiRdrT)); rdr.RecordId = 333; rdr.RdrType = SAHPI_WATCHDOG_RDR; int n = 0; for(n = 0; n < SAHPI_MAX_ENTITY_PATH; n++) { rdr.Entity.Entry[n].EntityLocation = 6; rdr.Entity.Entry[n].EntityType = SAHPI_ENT_ADD_IN_CARD; } rdr.IsFru = FALSE; rdr.RdrTypeUnion.WatchdogRec.Oem = 777; rdr.RdrTypeUnion.WatchdogRec.WatchdogNum = 888; rdr.IdString.DataType = SAHPI_TL_TYPE_TEXT; rdr.IdString.Language = SAHPI_LANG_ENGLISH; memcpy(rdr.IdString.Data, TOKEN, sizeof(TOKEN)); rdr.IdString.Data[254] = (unsigned char)10; rdr.IdString.DataLength = sizeof(TOKEN); // int i = 0; // for(i = 0; i < MAX_RDR_ARRAY_LENGTH; i++) { // rdrs.Entry[i] = rdr; // } event.EventType=SAHPI_ET_HOTSWAP; event.Severity=SAHPI_CRITICAL; event.Source = 666; event.Timestamp=SAHPI_TIME_UNSPECIFIED; event.EventDataUnion.HotSwapEvent.HotSwapState=SAHPI_HS_STATE_EXTRACTION_PENDING; event.EventDataUnion.HotSwapEvent.PreviousHotSwapState=SAHPI_HS_STATE_ACTIVE; rv = oHpiInjectEvent(sessionid, &event, &rpte, &rdr); rv = saHpiSessionClose(sessionid); exit(0); } /* end hpiinjector.c */ openhpi-2.14.1/src/t/ohpi/ohpi_008.c0000644000076400007640000000526311302567027013665 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Renier Morales */ #include #include #include #include /** * Load 'libsimulator' and 'libwatchdog', create two handlers on each. * Destroy handlers and unload plugin. * Pass on success, otherwise failure. **/ #define PLUGIN_NAME_SIZE 32 int main(int argc, char **argv) { SaHpiSessionIdT sid = 0; oHpiHandlerIdT hid0, hid1, hid2, hid3; GHashTable *h0 = g_hash_table_new(g_str_hash, g_str_equal), *h1 = g_hash_table_new(g_str_hash, g_str_equal), *h2 = g_hash_table_new(g_str_hash, g_str_equal), *h3 = g_hash_table_new(g_str_hash, g_str_equal); setenv("OPENHPI_CONF","./noconfig", 1); if (saHpiSessionOpen(SAHPI_UNSPECIFIED_DOMAIN_ID, &sid, NULL)) return -1; /* Set configuration for handlers and create them. */ g_hash_table_insert(h0, "plugin", "libsimulator"); g_hash_table_insert(h0, "entity_root", "{SYSTEM_CHASSIS,1}"); g_hash_table_insert(h0, "name", "test0"); g_hash_table_insert(h0, "addr", "0"); g_hash_table_insert(h1, "plugin", "libsimulator"); g_hash_table_insert(h1, "entity_root", "{SYSTEM_CHASSIS,2}"); g_hash_table_insert(h1, "name", "test1"); g_hash_table_insert(h1, "addr", "1"); /* Set configuration for two handlers and create them. */ g_hash_table_insert(h2, "plugin", "libwatchdog"); g_hash_table_insert(h2, "entity_root", "{SYSTEM_CHASSIS,3}"); g_hash_table_insert(h2, "addr", "0"); g_hash_table_insert(h3, "plugin", "libwatchdog"); g_hash_table_insert(h3, "entity_root", "{SYSTEM_CHASSIS,4}"); g_hash_table_insert(h3, "addr", "1"); if (oHpiHandlerCreate(h0,&hid0) || oHpiHandlerCreate(h1,&hid1)) return -1; if (oHpiHandlerCreate(h2,&hid2) || oHpiHandlerCreate(h3,&hid3)) return -1; if (oHpiHandlerDestroy(hid0) || oHpiHandlerDestroy(hid1)) return -1; if (oHpiHandlerDestroy(hid2) || oHpiHandlerDestroy(hid3)) return -1; return 0; } openhpi-2.14.1/src/t/ohpi/ohpi_031.c0000644000076400007640000000276011302567027013660 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Renier Morales */ #include #include #include #include /** * Try to get handler info passing a bogus handler id. * Pass on success, otherwise failure. **/ int main(int argc, char **argv) { SaHpiSessionIdT sid = 0; GHashTable *config = g_hash_table_new(g_str_hash, g_str_equal); oHpiHandlerIdT hid = 0; oHpiHandlerInfoT hinfo; setenv("OPENHPI_CONF","./noconfig", 1); if (saHpiSessionOpen(SAHPI_UNSPECIFIED_DOMAIN_ID, &sid, NULL)) return -1; /* Set configuration. */ g_hash_table_insert(config, "plugin", "libsimulator"); g_hash_table_insert(config, "entity_root", "{SYSTEM_CHASSIS,1}"); g_hash_table_insert(config, "name", "test"); g_hash_table_insert(config, "addr", "0"); if (oHpiHandlerCreate(config, &hid)) return -1; if (!oHpiHandlerInfo(555, &hinfo)) return -1; return 0; } openhpi-2.14.1/src/t/ohpi/ohpi_039.c0000644000076400007640000000201211302567027013656 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Renier Morales */ #include #include #include /** * Pass null arguments to oHpiGlobalParamSet * Pass on error, otherwise test failed. **/ int main(int argc, char **argv) { SaHpiSessionIdT sid = 0; /* Unset config file env variable */ setenv("OPENHPI_CONF","./noconfig", 1); if (saHpiSessionOpen(SAHPI_UNSPECIFIED_DOMAIN_ID, &sid, NULL)) return -1; if (!oHpiGlobalParamSet(NULL)) return -1; return 0; } openhpi-2.14.1/src/t/ohpi/ohpi_029.c0000644000076400007640000000301211302567027013656 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Renier Morales */ #include #include #include /** * Destroy a handler twice expecting an error the second time. * Pass on error, otherwise test failed. **/ int main(int argc, char **argv) { SaHpiSessionIdT sid = 0; GHashTable *config = g_hash_table_new(g_str_hash, g_str_equal); oHpiHandlerIdT hid = 0; setenv("OPENHPI_CONF","./noconfig", 1); if (saHpiSessionOpen(SAHPI_UNSPECIFIED_DOMAIN_ID, &sid, NULL)) return -1; /* Set configuration. */ g_hash_table_insert(config, "plugin", "libsimulator"); g_hash_table_insert(config, "entity_root", "{SYSTEM_CHASSIS,1}"); g_hash_table_insert(config, "name", "test"); g_hash_table_insert(config, "addr", "0"); if (oHpiHandlerCreate(config, &hid)) return -1; if (oHpiHandlerDestroy(hid)) return -1; if (!oHpiHandlerDestroy(hid)) return -1; return 0; } openhpi-2.14.1/src/t/ohpi/ohpi_025.c0000644000076400007640000000252311302567027013660 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Renier Morales */ #include #include #include /** * Create handler for plugin, with a configuration lacking a plugin key. * Pass on error, otherwise test failed. **/ int main(int argc, char **argv) { SaHpiSessionIdT sid = 0; GHashTable *config = g_hash_table_new(g_str_hash, g_str_equal); oHpiHandlerIdT hid = 0; setenv("OPENHPI_CONF","./noconfig", 1); if (saHpiSessionOpen(SAHPI_UNSPECIFIED_DOMAIN_ID, &sid, NULL)) return -1; /* Set configuration. */ g_hash_table_insert(config, "entity_root", "{SYSTEM_CHASSIS,1}"); g_hash_table_insert(config, "name", "test"); g_hash_table_insert(config, "addr", "0"); if (!oHpiHandlerCreate(config, &hid)) return -1; return 0; } openhpi-2.14.1/src/t/ohpi/ohpi_026.c0000644000076400007640000000260111302567027013656 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Renier Morales */ #include #include #include /** * Create handler for non-existant plugin. * Pass on error, otherwise test failed. **/ int main(int argc, char **argv) { SaHpiSessionIdT sid = 0; GHashTable *config = g_hash_table_new(g_str_hash, g_str_equal); oHpiHandlerIdT hid = 0; setenv("OPENHPI_CONF","./noconfig", 1); if (saHpiSessionOpen(SAHPI_UNSPECIFIED_DOMAIN_ID, &sid, NULL)) return -1; /* Set configuration. */ g_hash_table_insert(config, "plugin", "libnoplugin"); g_hash_table_insert(config, "entity_root", "{SYSTEM_CHASSIS,1}"); g_hash_table_insert(config, "name", "test"); g_hash_table_insert(config, "addr", "0"); if (!oHpiHandlerCreate(config, &hid)) return -1; return 0; } openhpi-2.14.1/src/t/ohpi/ohpi_007.c0000644000076400007640000000470111302567027013660 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Renier Morales */ #include #include #include #include /** * Load 'libsimulator' and 'libwatchdog', create two handlers on each. * Pass on success, otherwise failure. **/ #define PLUGIN_NAME_SIZE 32 int main(int argc, char **argv) { SaHpiSessionIdT sid = 0; oHpiHandlerIdT hid0, hid1, hid2, hid3; GHashTable *h0 = g_hash_table_new(g_str_hash, g_str_equal), *h1 = g_hash_table_new(g_str_hash, g_str_equal), *h2 = g_hash_table_new(g_str_hash, g_str_equal), *h3 = g_hash_table_new(g_str_hash, g_str_equal); setenv("OPENHPI_CONF","./noconfig", 1); if (saHpiSessionOpen(SAHPI_UNSPECIFIED_DOMAIN_ID, &sid, NULL)) return -1; /* Set configuration for handlers and create them. */ g_hash_table_insert(h0, "plugin", "libsimulator"); g_hash_table_insert(h0, "entity_root", "{SYSTEM_CHASSIS,1}"); g_hash_table_insert(h0, "name", "test0"); g_hash_table_insert(h0, "addr", "0"); g_hash_table_insert(h1, "plugin", "libsimulator"); g_hash_table_insert(h1, "entity_root", "{SYSTEM_CHASSIS,2}"); g_hash_table_insert(h1, "name", "test1"); g_hash_table_insert(h1, "addr", "1"); /* Set configuration for two handlers and create them. */ g_hash_table_insert(h2, "plugin", "libwatchdog"); g_hash_table_insert(h2, "entity_root", "{SYSTEM_CHASSIS,3}"); g_hash_table_insert(h2, "addr", "0"); g_hash_table_insert(h3, "plugin", "libwatchdog"); g_hash_table_insert(h3, "entity_root", "{SYSTEM_CHASSIS,4}"); g_hash_table_insert(h3, "addr", "1"); if (oHpiHandlerCreate(h0,&hid0) || oHpiHandlerCreate(h1,&hid1)) return -1; if (oHpiHandlerCreate(h2,&hid2) || oHpiHandlerCreate(h3,&hid3)) return -1; return 0; } openhpi-2.14.1/src/t/ohpi/ohpi_034.c0000644000076400007640000000446011302567027013662 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Renier Morales */ #include #include #include #include /** * Create three handlers, destroy one, and get next that one. * Pass on error, otherwise test failed. **/ int main(int argc, char **argv) { SaHpiSessionIdT sid = 0; GHashTable *h0 = g_hash_table_new(g_str_hash, g_str_equal), *h1 = g_hash_table_new(g_str_hash, g_str_equal), *h2 = g_hash_table_new(g_str_hash, g_str_equal); oHpiHandlerIdT hid0 = 0, hid1 = 0, hid2 = 0, next_id = 0; setenv("OPENHPI_CONF","./noconfig", 1); if (saHpiSessionOpen(SAHPI_UNSPECIFIED_DOMAIN_ID, &sid, NULL)) return -1; /* Set configuration. */ g_hash_table_insert(h0, "plugin", "libsimulator"); g_hash_table_insert(h0, "entity_root", "{SYSTEM_CHASSIS,1}"); g_hash_table_insert(h0, "name", "test"); g_hash_table_insert(h0, "addr", "0"); g_hash_table_insert(h1, "plugin", "libwatchdog"); g_hash_table_insert(h1, "entity_root", "{SYSTEM_CHASSIS,2}"); g_hash_table_insert(h1, "addr", "0"); g_hash_table_insert(h2, "plugin", "libsimulator"); g_hash_table_insert(h2, "entity_root", "{SYSTEM_CHASSIS,3}"); g_hash_table_insert(h2, "name", "test"); g_hash_table_insert(h2, "addr", "0"); if (oHpiHandlerCreate(h0, &hid0) || oHpiHandlerCreate(h1, &hid1) || oHpiHandlerCreate(h2, &hid2)) return -1; if (oHpiHandlerDestroy(hid1)) return -1; if (oHpiHandlerGetNext(hid0, &next_id) && next_id == 3) return -1; if (!oHpiHandlerGetNext(hid1, &next_id)) return -1; return 0; } openhpi-2.14.1/src/t/ohpi/ohpi_024.c0000644000076400007640000000174011302567027013657 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Renier Morales */ #include #include #include /** * Create handler, passing NULL for each argument. * Pass on error, otherwise test failed. **/ int main(int argc, char **argv) { SaHpiSessionIdT sid = 0; setenv("OPENHPI_CONF","./noconfig", 1); if (saHpiSessionOpen(SAHPI_UNSPECIFIED_DOMAIN_ID, &sid, NULL)) return -1; if (!oHpiHandlerCreate(NULL, NULL)) return -1; return 0; } openhpi-2.14.1/src/t/ohpi/openhpi.conf0000644000076400007640000000010311302567027014470 0ustar OPENHPI_LOG_ON_SEV = "MAJOR" OPENHPI_ON_EP = "{SYSTEM_CHASSIS,1}" openhpi-2.14.1/src/t/ohpi/ohpi_036.c0000644000076400007640000000257711302567027013673 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Renier Morales */ #include #include #include #include /** * Set a paramter, get it, and compare values. * Tests without opening a session to see if the global * parameter table is initialized correctly anyway. * Pass on success, otherwise a failure. **/ int main(int argc, char **argv) { oHpiGlobalParamT path_param = { .Type = OHPI_PATH, .u.Path = "/mylibdir" }; /* Unset config file env variable */ setenv("OPENHPI_CONF","./noconfig", 1); if (oHpiGlobalParamSet(&path_param)) return -1; memset(path_param.u.Path, 0, SAHPI_MAX_TEXT_BUFFER_LENGTH); if (oHpiGlobalParamGet(&path_param)) return -1; if (strcmp("/mylibdir", path_param.u.Path)) return -1; return 0; } openhpi-2.14.1/src/t/ohpi/ohpi_038.c0000644000076400007640000000231011302567027013656 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Renier Morales */ #include #include #include #include /** * Pass bogus argument to oHpiGlobalParamGet * Pass on error, otherwise test failed. **/ int main(int argc, char **argv) { SaHpiSessionIdT sid = 0; oHpiGlobalParamT bogus_param = { .Type = 0 }; /* Set config file env variable */ setenv("OPENHPI_CONF","./openhpi.conf", 1); if (saHpiSessionOpen(SAHPI_UNSPECIFIED_DOMAIN_ID, &sid, NULL)) return -1; if (!oHpiGlobalParamGet(&bogus_param)) return -1; bogus_param.Type = 255; if (!oHpiGlobalParamGet(&bogus_param)) return -1; return 0; } openhpi-2.14.1/src/t/ohpi/ohpi_version.c0000644000076400007640000000226311302567027015040 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Renier Morales */ #include #include #include #include #include #include /** * Load the simulator plugin. * Pass on success, otherwise a failure. **/ int main(int argc, char **argv) { SaHpiUint64T v = 0; char * buf = g_malloc(100); char * version = VERSION ".0"; setenv("OPENHPI_CONF","./noconfig", 1); v = oHpiVersionGet(); snprintf(buf,100,"%llu.%llu.%llu.%llu", (v >> 48), ((v >> 32) & 0x0000ffff), // my gcc barfed unless it did this ((v & 0x00000000ffffffff) >> 16), (v & 0x000000000000ffff)); if(strcmp(buf,version) == 0) { return 0; } return -1; } openhpi-2.14.1/src/t/ohpi/ohpi_010.c0000644000076400007640000000522711302567027013656 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Renier Morales */ #include #include #include #include /** * Load 'libsimulator', create three handlers, iterate through them * making sure they match with the expected values. * Destroy handlers, unload plugin. * Pass on success, otherwise failure. **/ int main(int argc, char **argv) { SaHpiSessionIdT sid = 0; GHashTable *h0 = g_hash_table_new(g_str_hash, g_str_equal), *h1 = g_hash_table_new(g_str_hash, g_str_equal), *h2 = g_hash_table_new(g_str_hash, g_str_equal); oHpiHandlerIdT hid0 = 0, hid1 = 0, hid2 = 0, next_id = 0; setenv("OPENHPI_CONF","./noconfig", 1); if (saHpiSessionOpen(SAHPI_UNSPECIFIED_DOMAIN_ID, &sid, NULL)) return -1; /* Set configuration. */ g_hash_table_insert(h0, "plugin", "libsimulator"); g_hash_table_insert(h0, "entity_root", "{SYSTEM_CHASSIS,1}"); g_hash_table_insert(h0, "name", "test"); g_hash_table_insert(h0, "addr", "0"); g_hash_table_insert(h1, "plugin", "libwatchdog"); g_hash_table_insert(h1, "entity_root", "{SYSTEM_CHASSIS,2}"); g_hash_table_insert(h1, "addr", "0"); g_hash_table_insert(h2, "plugin", "libsimulator"); g_hash_table_insert(h2, "entity_root", "{SYSTEM_CHASSIS,3}"); g_hash_table_insert(h2, "name", "test"); g_hash_table_insert(h2, "addr", "0"); if (oHpiHandlerCreate(h0, &hid0) || oHpiHandlerCreate(h1, &hid1) || oHpiHandlerCreate(h2, &hid2)) return -1; if (oHpiHandlerGetNext(0, &next_id) || next_id != 1) return -1; if (oHpiHandlerGetNext(1, &next_id) || next_id != 2) return -1; if (oHpiHandlerGetNext(2, &next_id) || next_id != 3) return -1; if (!oHpiHandlerGetNext(3, &next_id)) return -1; if (oHpiHandlerDestroy(hid0) || oHpiHandlerDestroy(hid1) || oHpiHandlerDestroy(hid2)) return -1; return 0; } openhpi-2.14.1/src/t/ohpi/ohpi_009.c0000644000076400007640000000334211302567027013662 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Renier Morales */ #include #include #include #include /** * Load 'libsimulator', create handler, get handler info and check for * expected information. Destroy handler, unload plugin. * Pass on success, otherwise failure. **/ int main(int argc, char **argv) { SaHpiSessionIdT sid = 0; GHashTable *config = g_hash_table_new(g_str_hash, g_str_equal); oHpiHandlerIdT hid = 0; oHpiHandlerInfoT hinfo; setenv("OPENHPI_CONF","./noconfig", 1); if (saHpiSessionOpen(SAHPI_UNSPECIFIED_DOMAIN_ID, &sid, NULL)) return -1; /* Set configuration. */ g_hash_table_insert(config, "plugin", "libsimulator"); g_hash_table_insert(config, "entity_root", "{SYSTEM_CHASSIS,1}"); g_hash_table_insert(config, "name", "test"); g_hash_table_insert(config, "addr", "0"); if (oHpiHandlerCreate(config, &hid)) return -1; if (oHpiHandlerInfo(hid, &hinfo)) return -1; if (strcmp("libsimulator",hinfo.plugin_name)) return -1; if (oHpiHandlerDestroy(hid)) return -1; return 0; } openhpi-2.14.1/src/t/ohpi/ohpi_037.c0000644000076400007640000000204011302567027013655 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Renier Morales */ #include #include #include #include /** * Pass null arguments to oHpiGlobalParamGet * Pass on error, otherwise test failed. **/ int main(int argc, char **argv) { SaHpiSessionIdT sid = 0; /* Set config file env variable */ setenv("OPENHPI_CONF","./openhpi.conf", 1); if (saHpiSessionOpen(SAHPI_UNSPECIFIED_DOMAIN_ID, &sid, NULL)) return -1; if (!oHpiGlobalParamGet(NULL)) return -1; return 0; } openhpi-2.14.1/src/t/ohpi/ohpi_028.c0000644000076400007640000000266111302567027013666 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Renier Morales */ #include #include #include /** * Destroy a bogus non-existent handler. * Pass on error, otherwise test failed. **/ int main(int argc, char **argv) { SaHpiSessionIdT sid = 0; GHashTable *config = g_hash_table_new(g_str_hash, g_str_equal); oHpiHandlerIdT hid = 0; setenv("OPENHPI_CONF","./noconfig", 1); if (saHpiSessionOpen(SAHPI_UNSPECIFIED_DOMAIN_ID, &sid, NULL)) return -1; /* Set configuration. */ g_hash_table_insert(config, "plugin", "libsimulator"); g_hash_table_insert(config, "entity_root", "{SYSTEM_CHASSIS,1}"); g_hash_table_insert(config, "name", "test"); g_hash_table_insert(config, "addr", "0"); if (oHpiHandlerCreate(config, &hid)) return -1; if (!oHpiHandlerDestroy(5)) return -1; return 0; } openhpi-2.14.1/src/t/ohpi/ohpi_032.c0000644000076400007640000000413611302567027013660 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Renier Morales */ #include #include #include #include /** * Call oHpiHandlerGetNext passing NULL as arguments. * Pass on error, otherwise test failed. **/ int main(int argc, char **argv) { SaHpiSessionIdT sid = 0; GHashTable *h0 = g_hash_table_new(g_str_hash, g_str_equal), *h1 = g_hash_table_new(g_str_hash, g_str_equal), *h2 = g_hash_table_new(g_str_hash, g_str_equal); oHpiHandlerIdT hid0 = 0, hid1 = 0, hid2 = 0; setenv("OPENHPI_CONF","./noconfig", 1); if (saHpiSessionOpen(SAHPI_UNSPECIFIED_DOMAIN_ID, &sid, NULL)) return -1; /* Set configuration. */ g_hash_table_insert(h0, "plugin", "libsimulator"); g_hash_table_insert(h0, "entity_root", "{SYSTEM_CHASSIS,1}"); g_hash_table_insert(h0, "name", "test"); g_hash_table_insert(h0, "addr", "0"); g_hash_table_insert(h1, "plugin", "libwatchdog"); g_hash_table_insert(h1, "entity_root", "{SYSTEM_CHASSIS,2}"); g_hash_table_insert(h1, "addr", "0"); g_hash_table_insert(h2, "plugin", "libsimulator"); g_hash_table_insert(h2, "entity_root", "{SYSTEM_CHASSIS,3}"); g_hash_table_insert(h2, "name", "test"); g_hash_table_insert(h2, "addr", "0"); if (oHpiHandlerCreate(h0, &hid0) || oHpiHandlerCreate(h1, &hid1) || oHpiHandlerCreate(h2, &hid2)) return -1; if (!oHpiHandlerGetNext(0, NULL)) return -1; return 0; } openhpi-2.14.1/src/t/ohpi/ohpi_033.c0000644000076400007640000000416411302567027013662 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Renier Morales */ #include #include #include #include /** * Call oHpiHandlerGetNext passing bogus handler id as argument. * Pass on error, otherwise test failed. **/ int main(int argc, char **argv) { SaHpiSessionIdT sid = 0; GHashTable *h0 = g_hash_table_new(g_str_hash, g_str_equal), *h1 = g_hash_table_new(g_str_hash, g_str_equal), *h2 = g_hash_table_new(g_str_hash, g_str_equal); oHpiHandlerIdT hid0 = 0, hid1 = 0, hid2 = 0, next_id = 0; setenv("OPENHPI_CONF","./noconfig", 1); if (saHpiSessionOpen(SAHPI_UNSPECIFIED_DOMAIN_ID, &sid, NULL)) return -1; /* Set configuration. */ g_hash_table_insert(h0, "plugin", "libsimulator"); g_hash_table_insert(h0, "entity_root", "{SYSTEM_CHASSIS,1}"); g_hash_table_insert(h0, "name", "test"); g_hash_table_insert(h0, "addr", "0"); g_hash_table_insert(h1, "plugin", "libwatchdog"); g_hash_table_insert(h1, "entity_root", "{SYSTEM_CHASSIS,2}"); g_hash_table_insert(h1, "addr", "0"); g_hash_table_insert(h2, "plugin", "libsimulator"); g_hash_table_insert(h2, "entity_root", "{SYSTEM_CHASSIS,3}"); g_hash_table_insert(h2, "name", "test"); g_hash_table_insert(h2, "addr", "0"); if (oHpiHandlerCreate(h0, &hid0) || oHpiHandlerCreate(h1, &hid1) || oHpiHandlerCreate(h2, &hid2)) return -1; if (!oHpiHandlerGetNext(555, &next_id)) return -1; return 0; } openhpi-2.14.1/src/lock.c0000644000076400007640000000152211302567034012055 0ustar /* -*- linux-c -*- * * Copyright (c) 2003 by Intel Corp. * (C) Copyright IBM Corp. 2003, 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Louis Zhuang */ #include int oh_will_block = 0; int lockcount = 0; /* multi-threading support, use Posix mutex for data access */ /* initialize mutex used for data locking */ #include GStaticRecMutex oh_main_lock = G_STATIC_REC_MUTEX_INIT; int data_access_block_times(void) { return(oh_will_block); } openhpi-2.14.1/src/hotswap.c0000644000076400007640000000546211302567034012621 0ustar /* -*- linux-c -*- * * Copyright (c) 2003 by Intel Corp. * (C) Copyright IBM Corp. 2003-2006 * Copyright (c) 2004 by FORCE Computers. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Louis Zhuang * Thomas Kanngieser * Racing Guo * David Judkovics * Renier Morales */ #include SaHpiTimeoutT get_hotswap_auto_insert_timeout(struct oh_domain *d) { return d->ai_timeout; } void set_hotswap_auto_insert_timeout(struct oh_domain *d, SaHpiTimeoutT to) { d->ai_timeout = to; } /* * this function determines whether a hotswap transition is allowed */ SaHpiBoolT oh_allowed_hotswap_transition(SaHpiHsStateT from, SaHpiHsStateT to) { switch(from) { case SAHPI_HS_STATE_INACTIVE: if((to == SAHPI_HS_STATE_INSERTION_PENDING) || (to == SAHPI_HS_STATE_NOT_PRESENT)) { return SAHPI_TRUE; } else { return SAHPI_FALSE; } break; case SAHPI_HS_STATE_INSERTION_PENDING: if((to == SAHPI_HS_STATE_INACTIVE) || (to == SAHPI_HS_STATE_NOT_PRESENT) || (to == SAHPI_HS_STATE_ACTIVE)) { return SAHPI_TRUE; } else { return SAHPI_FALSE; } break; case SAHPI_HS_STATE_ACTIVE: if((to == SAHPI_HS_STATE_EXTRACTION_PENDING) || to == SAHPI_HS_STATE_NOT_PRESENT) { return SAHPI_TRUE; } else { return SAHPI_FALSE; } break; case SAHPI_HS_STATE_EXTRACTION_PENDING: if((to == SAHPI_HS_STATE_ACTIVE) || (to == SAHPI_HS_STATE_NOT_PRESENT) || (to == SAHPI_HS_STATE_INACTIVE)) { return SAHPI_TRUE; } else { return SAHPI_FALSE; } break; case SAHPI_HS_STATE_NOT_PRESENT: if(to == SAHPI_HS_STATE_INSERTION_PENDING) { return SAHPI_TRUE; } else { return SAHPI_FALSE; } break; default: return SAHPI_FALSE; } } openhpi-2.14.1/src/session.c0000644000076400007640000003454311302567034012621 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004, 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * Renier Morales * */ #include #include #include #include #include #include #include struct oh_session_table oh_sessions = { .table = NULL, .lock = G_STATIC_REC_MUTEX_INIT }; static struct oh_event *oh_generate_hpi_event(void) { struct oh_event *e = NULL; char *msg = "This session is being destroyed now!"; e = g_new0(struct oh_event, 1); e->event.EventType = SAHPI_ET_HPI_SW; e->event.Source = SAHPI_UNSPECIFIED_RESOURCE_ID; e->event.Timestamp = SAHPI_TIME_UNSPECIFIED; e->event.Severity = SAHPI_CRITICAL; e->event.EventDataUnion.HpiSwEvent.MId = SAHPI_MANUFACTURER_ID_UNSPECIFIED; e->event.EventDataUnion.HpiSwEvent.Type = SAHPI_HPIE_OTHER; e->event.EventDataUnion.HpiSwEvent.EventData.DataType = SAHPI_TL_TYPE_TEXT; e->event.EventDataUnion.HpiSwEvent.EventData.Language = SAHPI_TL_TYPE_TEXT; strcpy((char *)e->event.EventDataUnion.HpiSwEvent.EventData.Data, msg); e->event.EventDataUnion.HpiSwEvent.EventData.DataLength = strlen(msg); return e; } /** * oh_create_session * @did: * * * * Returns: **/ SaHpiSessionIdT oh_create_session(SaHpiDomainIdT did) { struct oh_session *session = NULL; struct oh_domain *domain = NULL; static SaHpiSessionIdT id = 1; /* Session ids will start at 1 */ if (did == SAHPI_UNSPECIFIED_DOMAIN_ID) did = OH_DEFAULT_DOMAIN_ID; session = g_new0(struct oh_session, 1); if (!session) return 0; session->did = did; session->eventq = g_async_queue_new(); session->subscribed = SAHPI_FALSE; domain = oh_get_domain(did); if (!domain) { g_async_queue_unref(session->eventq); g_free(session); return 0; } g_static_rec_mutex_lock(&oh_sessions.lock); /* Locked session table */ session->id = id++; g_hash_table_insert(oh_sessions.table, &(session->id), session); oh_sessions.list = g_slist_append(oh_sessions.list, session); g_static_rec_mutex_unlock(&oh_sessions.lock); /* Unlocked session table */ oh_release_domain(domain); return session->id; } /** * oh_get_session_domain * @sid: * * * * Returns: SAHPI_UNSPECIFIED_DOMAIN_ID if domain id was not found. **/ SaHpiDomainIdT oh_get_session_domain(SaHpiSessionIdT sid) { struct oh_session *session = NULL; SaHpiDomainIdT did; if (sid < 1) return SAHPI_UNSPECIFIED_DOMAIN_ID; g_static_rec_mutex_lock(&oh_sessions.lock); /* Locked session table */ session = g_hash_table_lookup(oh_sessions.table, &sid); if (!session) { g_static_rec_mutex_unlock(&oh_sessions.lock); return SAHPI_UNSPECIFIED_DOMAIN_ID; } did = session->did; g_static_rec_mutex_unlock(&oh_sessions.lock); /* Unlocked session table */ return did; } /** * oh_list_sessions * @did: * * * * Returns: A dynamically allocated array of session ids. * The caller needs to free this array when he is done with it. **/ GArray *oh_list_sessions(SaHpiDomainIdT did) { struct oh_domain *domain = NULL; GArray *session_ids = NULL; GSList *node = NULL; if (did == SAHPI_UNSPECIFIED_DOMAIN_ID) did = OH_DEFAULT_DOMAIN_ID; domain = oh_get_domain(did); if (!domain) return NULL; session_ids = g_array_new(FALSE, TRUE, sizeof(SaHpiSessionIdT)); g_static_rec_mutex_lock(&oh_sessions.lock); /* Locked session table */ for (node = oh_sessions.list; node; node = node->next) { struct oh_session *s = node->data; if (s->did != did) continue; g_array_append_val(session_ids, s->id); } g_static_rec_mutex_unlock(&oh_sessions.lock); /* Unlocked session table */ oh_release_domain(domain); return session_ids; } /** * oh_get_session_state * @sid: * @state: * * * * Returns: **/ SaErrorT oh_get_session_subscription(SaHpiSessionIdT sid, SaHpiBoolT * state) { struct oh_session *session = NULL; if (sid < 1) return SA_ERR_HPI_INVALID_SESSION; if (state == NULL) return SA_ERR_HPI_INVALID_PARAMS; if (oh_sessions.table == NULL) return SA_ERR_HPI_INTERNAL_ERROR; g_static_rec_mutex_lock(&oh_sessions.lock); /* Locked session table */ session = g_hash_table_lookup(oh_sessions.table, &sid); if (!session) { g_static_rec_mutex_unlock(&oh_sessions.lock); return SA_ERR_HPI_INVALID_SESSION; } *state = session->subscribed; g_static_rec_mutex_unlock(&oh_sessions.lock); /* Unlocked session table */ return SA_OK; } /** * oh_set_session_state * @sid: * @state: * * * * Returns: **/ SaErrorT oh_set_session_subscription(SaHpiSessionIdT sid, SaHpiBoolT state) { struct oh_session *session = NULL; struct oh_event e; if (sid < 1) return SA_ERR_HPI_INVALID_PARAMS; g_static_rec_mutex_lock(&oh_sessions.lock); /* Locked session table */ session = g_hash_table_lookup(oh_sessions.table, &sid); if (!session) { g_static_rec_mutex_unlock(&oh_sessions.lock); return SA_ERR_HPI_INVALID_SESSION; } session->subscribed = state; g_static_rec_mutex_unlock(&oh_sessions.lock); /* Unlocked session table */ /* Flush session's event queue */ if (state == SAHPI_FALSE) { while (oh_dequeue_session_event(sid, SAHPI_TIMEOUT_IMMEDIATE, &e, NULL) == SA_OK) { oh_event_free(&e, TRUE); } } return SA_OK; } /** * oh_queue_session_event * @sid: * @event: * * * * Returns: **/ SaErrorT oh_queue_session_event(SaHpiSessionIdT sid, struct oh_event * event) { struct oh_session *session = NULL; struct oh_event *qevent = NULL; struct oh_global_param param = {.type = OPENHPI_EVT_QUEUE_LIMIT }; if (sid < 1 || !event) return SA_ERR_HPI_INVALID_PARAMS; qevent = oh_dup_event(event); if (!qevent) return SA_ERR_HPI_OUT_OF_MEMORY; if (oh_get_global_param(¶m)) param.u.evt_queue_limit = OH_MAX_EVT_QUEUE_LIMIT; g_static_rec_mutex_lock(&oh_sessions.lock); /* Locked session table */ session = g_hash_table_lookup(oh_sessions.table, &sid); if (!session) { g_static_rec_mutex_unlock(&oh_sessions.lock); oh_event_free(qevent, FALSE); return SA_ERR_HPI_INVALID_SESSION; } if (param.u.evt_queue_limit != OH_MAX_EVT_QUEUE_LIMIT) { SaHpiSessionIdT tmp_sid = session->id; gint qlength = g_async_queue_length(session->eventq); if (qlength > 0 && qlength >= param.u.evt_queue_limit) { /* Don't proceed with event push if queue is overflowed */ session->eventq_status = SAHPI_EVT_QUEUE_OVERFLOW; g_static_rec_mutex_unlock(&oh_sessions.lock); oh_event_free(qevent, FALSE); err("Session %d's queue is out of space; " "# of events is %d; Max is %d", tmp_sid, qlength, param.u.evt_queue_limit); return SA_ERR_HPI_OUT_OF_SPACE; } } g_async_queue_push(session->eventq, qevent); g_static_rec_mutex_unlock(&oh_sessions.lock); /* Unlocked session table */ return SA_OK; } /** * oh_dequeue_session_event * @sid: * @event: * * * * Returns: **/ SaErrorT oh_dequeue_session_event(SaHpiSessionIdT sid, SaHpiTimeoutT timeout, struct oh_event * event, SaHpiEvtQueueStatusT * eventq_status) { struct oh_session *session = NULL; struct oh_event *devent = NULL; GTimeVal gfinaltime; GAsyncQueue *eventq = NULL; SaHpiBoolT subscribed; SaErrorT invalid; if (sid < 1 || (event == NULL)) return SA_ERR_HPI_INVALID_PARAMS; g_static_rec_mutex_lock(&oh_sessions.lock); /* Locked session table */ session = g_hash_table_lookup(oh_sessions.table, &sid); if (!session) { g_static_rec_mutex_unlock(&oh_sessions.lock); return SA_ERR_HPI_INVALID_SESSION; } if (eventq_status) { *eventq_status = session->eventq_status; } session->eventq_status = 0; eventq = session->eventq; g_async_queue_ref(eventq); g_static_rec_mutex_unlock(&oh_sessions.lock); if (timeout == SAHPI_TIMEOUT_IMMEDIATE) { devent = g_async_queue_try_pop(eventq); } else if (timeout == SAHPI_TIMEOUT_BLOCK) { while (devent == NULL) { g_get_current_time(&gfinaltime); g_time_val_add(&gfinaltime, 5000000L); devent = g_async_queue_timed_pop(eventq, &gfinaltime); /* compliance with spec page 63 */ invalid = oh_get_session_subscription(sid, &subscribed); /* Is the session still open? or still subscribed? */ if (invalid || !subscribed) { g_async_queue_unref(eventq); oh_event_free(devent, FALSE); return invalid ? SA_ERR_HPI_INVALID_SESSION : SA_ERR_HPI_INVALID_REQUEST; } } } else { g_get_current_time(&gfinaltime); g_time_val_add(&gfinaltime, (glong) (timeout / 1000)); devent = g_async_queue_timed_pop(eventq, &gfinaltime); invalid = oh_get_session_subscription(sid, &subscribed); if (invalid || !subscribed) { g_async_queue_unref(eventq); oh_event_free(devent, FALSE); return invalid ? SA_ERR_HPI_INVALID_SESSION : SA_ERR_HPI_INVALID_REQUEST; } } g_async_queue_unref(eventq); if (devent) { memcpy(event, devent, sizeof(struct oh_event)); g_free(devent); return SA_OK; } else { memset(event, 0, sizeof(struct oh_event)); return SA_ERR_HPI_TIMEOUT; } } /** * oh_destroy_session * @sid: * @update_domain: * * * Returns: **/ SaErrorT oh_destroy_session(SaHpiSessionIdT sid) { struct oh_session *session = NULL; SaHpiDomainIdT did; gpointer event = NULL; int i, len; if (sid < 1) return SA_ERR_HPI_INVALID_PARAMS; g_static_rec_mutex_lock(&oh_sessions.lock); /* Locked session table */ session = g_hash_table_lookup(oh_sessions.table, &sid); if (!session) { g_static_rec_mutex_unlock(&oh_sessions.lock); return SA_ERR_HPI_INVALID_SESSION; } oh_sessions.list = g_slist_remove(oh_sessions.list, session); g_hash_table_remove(oh_sessions.table, &(session->id)); g_static_rec_mutex_unlock(&oh_sessions.lock); /* Unlocked session table */ did = session->did; /* Finalize session */ len = g_async_queue_length(session->eventq); if (len > 0) { for (i = 0; i < len; i++) { event = g_async_queue_try_pop(session->eventq); if (event) oh_event_free(event, FALSE); event = NULL; } } g_async_queue_unref(session->eventq); g_free(session); return SA_OK; } static void __delete_by_did(gpointer key, gpointer value, gpointer user_data) { SaHpiDomainIdT did = *((SaHpiDomainIdT *) user_data); struct oh_session *session = (struct oh_session *) value; int i, len; gpointer event = NULL; if (!session) { err("Session does not exist!"); return; } if (session->did != did) { return; } oh_sessions.list = g_slist_remove(oh_sessions.list, session); g_hash_table_remove(oh_sessions.table, &(session->id)); /* Neutralize event queue */ len = g_async_queue_length(session->eventq); if (len < 0) { for (i = 0; i > len; i--) { g_async_queue_push(session->eventq, oh_generate_hpi_event()); } } else if (len > 0) { for (i = 0; i < len; i++) { event = g_async_queue_try_pop(session->eventq); if (event) oh_event_free(event, FALSE); event = NULL; } } g_async_queue_unref(session->eventq); g_free(session); } SaErrorT oh_destroy_domain_sessions(SaHpiDomainIdT did) { if (did == SAHPI_UNSPECIFIED_DOMAIN_ID) did = OH_DEFAULT_DOMAIN_ID; g_static_rec_mutex_lock(&oh_sessions.lock); g_hash_table_foreach(oh_sessions.table, __delete_by_did, &did); g_static_rec_mutex_unlock(&oh_sessions.lock); return SA_OK; } openhpi-2.14.1/src/init.c0000644000076400007640000001177511302567034012103 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004-2006 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * Renier Morales * */ #include #include #include #include #include #include #include #include #include #include #include /** * oh_init * * Returns: 0 on success otherwise an error code **/ int oh_init(void) { static int initialized = 0; struct oh_parsed_config config = { NULL, 0, 0 }; struct oh_global_param config_param = { .type = OPENHPI_CONF }; SaErrorT rval; data_access_lock(); if (initialized) { /* Don't initialize more than once */ data_access_unlock(); return 0; } /* Initialize thread engine */ oh_threaded_init(); #ifdef HAVE_OPENSSL /* Initialize SSL library */ if (oh_ssl_init()) { err("SSL library intialization failed."); data_access_unlock(); return SA_ERR_HPI_OUT_OF_MEMORY; /* Most likely */ } #endif /* Set openhpi configuration file location */ oh_get_global_param(&config_param); rval = oh_load_config(config_param.u.conf, &config); /* Don't error out if there is no conf file */ if (rval < 0 && rval != -4) { err("Can not load config."); data_access_unlock(); return SA_ERR_HPI_NOT_PRESENT; } /* Initialize uid_utils */ rval = oh_uid_initialize(); if( (rval != SA_OK) && (rval != SA_ERR_HPI_ERROR) ) { err("Unique ID intialization failed."); data_access_unlock(); return rval; } dbg("Initialized UID."); /* Initialize handler table */ oh_handlers.table = g_hash_table_new(g_int_hash, g_int_equal); dbg("Initialized handler table"); /* Initialize domain table */ oh_domains.table = g_hash_table_new(g_int_hash, g_int_equal); dbg("Initialized domain table"); /* Initialize session table */ oh_sessions.table = g_hash_table_new(g_int_hash, g_int_equal); dbg("Initialized session table"); /* Load plugins, create handlers and domains */ oh_process_config(&config); /* Create default domain if it does not exist yet. */ if (oh_create_domain(OH_DEFAULT_DOMAIN_ID, "DEFAULT", SAHPI_UNSPECIFIED_DOMAIN_ID, SAHPI_UNSPECIFIED_DOMAIN_ID, SAHPI_DOMAIN_CAP_AUTOINSERT_READ_ONLY, SAHPI_TIMEOUT_IMMEDIATE)) { data_access_unlock(); err("Could not create first domain!"); return SA_ERR_HPI_ERROR; } /* * Wipes away configuration lists (plugin_names and handler_configs). * global_params is not touched. */ oh_clean_config(&config); /* * If any handlers were defined in the config file AND * all of them failed to load, Then return with an error. */ if (config.handlers_defined > 0 && config.handlers_loaded == 0) { warn("Warning: Handlers were defined, but none loaded."); } else if (config.handlers_defined > 0 && config.handlers_loaded < config.handlers_defined) { warn("*Warning*: Not all handlers defined loaded." " Check previous messages."); } /* Start discovery and event threads */ oh_threaded_start(); initialized = 1; data_access_unlock(); dbg("OpenHPI has been initialized"); /* infrastructure initialization has completed at this point */ /* Check if there are any handlers loaded */ if (config.handlers_defined == 0) { warn("*Warning*: No handler definitions found in config file." " Check configuration file %s and previous messages", config_param.u.conf); } /* * HACK: wait a second before returning * to give the threads time to populate the RPT */ struct timespec waittime = { .tv_sec = 1, .tv_nsec = 1000L}; nanosleep(&waittime, NULL); /* Do not use SA_OK here in case it is ever changed to something * besides zero, The runtime stuff depends on zero being returned here * in order for the shared library to be completely initialized. */ return 0; } /** * oh_finit * * Returns: always returns 0 **/ int oh_finit(void) { data_access_lock(); oh_close_handlers(); data_access_unlock(); return 0; } openhpi-2.14.1/src/plugin_static.c.in0000644000076400007640000000113711302567034014401 0ustar /* -*- linux-c -*- * * Copyright (c) 2003 by FORCE Computers. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Thomas Kanngieser */ #include "oh_plugin.h" @STATIC_PLUGIN_EXTERN@ struct oh_static_plugin static_plugins[] = { @STATIC_PLUGIN@ { 0, 0 } /* end mark */ }; openhpi-2.14.1/src/alarm.c0000644000076400007640000006337111302567034012233 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004-2008 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * Renier Morales * */ #include #include #include #include #include #include #include #include #include #include static void __update_dat(struct oh_domain *d) { struct timeval tv; if (!d) return; gettimeofday(&tv, NULL); d->dat.update_count++; d->dat.update_timestamp = (SaHpiTimeT) tv.tv_sec * 1000000000 + tv.tv_usec * 1000; } static GSList *__get_alarm_node(struct oh_domain *d, SaHpiAlarmIdT *aid, SaHpiSeverityT *severity, SaHpiStatusCondTypeT *type, SaHpiResourceIdT *rid, SaHpiManufacturerIdT *mid, SaHpiSensorNumT *num, SaHpiEventStateT *state, SaHpiBoolT unacknowledged, int get_next) { GSList *alarms = NULL; if (!d) return NULL; if (aid) { if (*aid == SAHPI_FIRST_ENTRY) get_next = 1; else if (*aid == SAHPI_LAST_ENTRY) { /* Just return the last node, if not getting next alarm. */ if (get_next) return NULL; else return g_slist_last(d->dat.list); } } for (alarms = d->dat.list; alarms; alarms = alarms->next) { SaHpiAlarmT *alarm = alarms->data; if (alarm && (aid ? (get_next ? alarm->AlarmId > *aid : alarm->AlarmId == *aid) : 1) && (severity ? (*severity != SAHPI_ALL_SEVERITIES ? alarm->Severity == *severity : 1) : 1) && (type ? alarm->AlarmCond.Type == *type : 1) && (rid ? alarm->AlarmCond.ResourceId == *rid: 1) && (mid ? alarm->AlarmCond.Mid == *mid : 1) && (num ? alarm->AlarmCond.SensorNum == *num : 1) && (state ? alarm->AlarmCond.EventState == *state : 1) && (unacknowledged ? !alarm->Acknowledged : 1)) { return alarms; } } return NULL; } static SaHpiUint32T __count_alarms(struct oh_domain *d, SaHpiStatusCondTypeT *type, SaHpiSeverityT sev) { GSList *alarms = NULL; SaHpiUint32T count = 0; if (!d) return 0; if (!type && sev == SAHPI_ALL_SEVERITIES) return g_slist_length(d->dat.list); else { for (alarms = d->dat.list; alarms; alarms = alarms->next) { SaHpiAlarmT *alarm = alarms->data; if (alarm && (type ? alarm->AlarmCond.Type == *type : 1) && (sev == SAHPI_ALL_SEVERITIES ? 1 : alarm->Severity == sev)) { count++; } } } return count; } /** * oh_add_alarm * @d: pointer to domain * @alarm: alarm to be added * @fromfile: if True will preserve alarm's id, timestamp, and * acknowledge flag. Also, it will not save immediatedly to disk, * if OPENHPI_DAT_SAVE is set. * * Return value: reference to newly added alarm or NULL if there was * an error **/ SaHpiAlarmT *oh_add_alarm(struct oh_domain *d, SaHpiAlarmT *alarm, int fromfile) { struct timeval tv1; SaHpiAlarmT *a = NULL; struct oh_global_param param = { .type = OPENHPI_DAT_SIZE_LIMIT }; if (!d) { err("NULL domain pointer passed."); return NULL; } if (oh_get_global_param(¶m)) param.u.dat_size_limit = OH_MAX_DAT_SIZE_LIMIT; if (param.u.dat_size_limit != OH_MAX_DAT_SIZE_LIMIT && g_slist_length(d->dat.list) >= param.u.dat_size_limit) { err("DAT for domain %d is overflowed", d->id); d->dat.overflow = SAHPI_TRUE; return NULL; } else if (alarm && alarm->AlarmCond.Type == SAHPI_STATUS_COND_TYPE_USER) { param.type = OPENHPI_DAT_USER_LIMIT; if (oh_get_global_param(¶m)) param.u.dat_user_limit = OH_MAX_DAT_USER_LIMIT; if (param.u.dat_user_limit != OH_MAX_DAT_USER_LIMIT && __count_alarms(d, &alarm->AlarmCond.Type, SAHPI_ALL_SEVERITIES) >= param.u.dat_user_limit) { err("DAT for domain %d has reached its user alarms limit", d->id); return NULL; } } a = g_new0(SaHpiAlarmT, 1); if (alarm) { /* Copy contents of optional alarm reference */ memcpy(a, alarm, sizeof(SaHpiAlarmT)); } if (fromfile) { if (a->AlarmId > d->dat.next_id) { d->dat.next_id = a->AlarmId; } } else { a->AlarmId = ++(d->dat.next_id); gettimeofday(&tv1, NULL); a->Timestamp = (SaHpiTimeT) tv1.tv_sec * 1000000000 + tv1.tv_usec * 1000; a->Acknowledged = SAHPI_FALSE; } a->AlarmCond.DomainId = d->id; d->dat.list = g_slist_append(d->dat.list, a); /* Set alarm id and timestamp info in alarm reference */ if (alarm) { alarm->AlarmId = a->AlarmId; alarm->Timestamp = a->Timestamp; } if (!fromfile) { __update_dat(d); param.type = OPENHPI_DAT_SAVE; oh_get_global_param(¶m); if (param.u.dat_save) { char dat_filepath[SAHPI_MAX_TEXT_BUFFER_LENGTH*2]; param.type = OPENHPI_VARPATH; oh_get_global_param(¶m); snprintf(dat_filepath, SAHPI_MAX_TEXT_BUFFER_LENGTH*2, "%s/dat.%u", param.u.varpath, d->id); oh_alarms_to_file(&d->dat, dat_filepath); } } return a; } /** * oh_get_alarm * @d: pointer to domain * @aid: Optional. alarm id for alarm to get * @severity: Optional. Severity of alarm to get * @type: Optional. Type of alarm to get * @rid: Optional. Resource Id of alarm to get * @mid: Optional. Manufacturer Id of alarm to get * @num: Optional. Sensor number of alarm to get * @state: Optional. Event State of alarm to get * @unacknowledged: If True, only gets unacknowledged. * @get_next: Instead of getting the exact @aid, get the next alarm * after that one * * Return value: pointer to SaHpiAlarmT that matched, or NULL of none found. **/ SaHpiAlarmT *oh_get_alarm(struct oh_domain *d, SaHpiAlarmIdT *aid, SaHpiSeverityT *severity, SaHpiStatusCondTypeT *type, SaHpiResourceIdT *rid, SaHpiManufacturerIdT *mid, SaHpiSensorNumT *num, SaHpiEventStateT *state, SaHpiBoolT unacknowledged, int get_next) { GSList *alarm_node = NULL; if (!d) return NULL; alarm_node = __get_alarm_node(d, aid, severity, type, rid, mid, num, state, unacknowledged, get_next); if (!alarm_node) return NULL; return alarm_node->data; } /** * oh_remove_alarm * @d: pointer to domain * @severity: Optional. Severity of alarm to remove * @type: Optional. Type of alarm to remove * @rid: Optional. Resource Id of alarm to remove * @mid: Optional. Manufacturer Id of alarm to remove * @num: Optional. Sensor Number of alarm to remove * @state: Optional. Event state of alarm to remove * @deassert_mask: Optional. Deassert Mask. Matches on a bit AND operation. * @multi: If True, does operation for all matching alarms, otherwise, * just the first matching one. * * Return value: SA_OK on success **/ SaErrorT oh_remove_alarm(struct oh_domain *d, SaHpiSeverityT *severity, SaHpiStatusCondTypeT *type, SaHpiResourceIdT *rid, SaHpiManufacturerIdT *mid, SaHpiSensorNumT *num, SaHpiEventStateT *state, SaHpiEventStateT *deassert_mask, int multi) { GSList *alarm_node = NULL; SaHpiAlarmT *alarm = NULL; SaHpiAlarmIdT aid = SAHPI_FIRST_ENTRY; /* Set to zero */ struct oh_global_param param = { .type = OPENHPI_DAT_SIZE_LIMIT }; if (!d) return SA_ERR_HPI_INVALID_PARAMS; do { alarm_node = __get_alarm_node(d, &aid, severity, type, rid, mid, num, state, 0, 1); if (alarm_node) alarm = alarm_node->data; else break; aid = alarm->AlarmId; if (deassert_mask ? *deassert_mask & alarm->AlarmCond.EventState : 1) { d->dat.list = g_slist_delete_link(d->dat.list, alarm_node); g_free(alarm); } alarm_node = NULL; alarm = NULL; } while (multi); __update_dat(d); if (!oh_get_global_param(¶m)) { /* Reset overflow flag if not overflowed */ if (param.u.dat_size_limit != OH_MAX_DAT_SIZE_LIMIT && g_slist_length(d->dat.list) < param.u.dat_size_limit) d->dat.overflow = SAHPI_FALSE; } return SA_OK; } /** * oh_close_alarmtable * @d: pointer to domain * * Frees all memory held by alarm table. * * Return value: SA_OK on success **/ SaErrorT oh_close_alarmtable(struct oh_domain *d) { SaErrorT error = SA_OK; if (!d) return SA_ERR_HPI_INVALID_PARAMS; error = oh_remove_alarm(d, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 1); d->dat.next_id = 0; d->dat.update_count = 0; d->dat.update_timestamp = SAHPI_TIME_UNSPECIFIED; return error; } /** * oh_count_alarms * @d: pointer to domain * @sev: Severity of alarms to count * * Counts alarms in the domain table. You can count alarms of a specific * severity, or for all severities (SAHPI_ALL_SEVERITIES). * * Return value: Number of alarms counted. **/ SaHpiUint32T oh_count_alarms(struct oh_domain *d, SaHpiSeverityT sev) { SaHpiUint32T count = 0; count = __count_alarms(d, NULL, sev); return count; } static void oh_detect_oem_event_alarm(struct oh_domain *d, SaHpiEventT *event) { SaHpiAlarmT a; SaHpiStatusCondTypeT type = SAHPI_STATUS_COND_TYPE_OEM; if (!d || !event) return; /* Search for possible oem alarm, if severity is "non-alarming" */ if (event->Severity > SAHPI_MINOR) { oh_remove_alarm(d, NULL, &type, &event->Source, &event->EventDataUnion.OemEvent.MId, NULL, NULL, NULL, 1); return; } /* Severity is "alarming". Add/Create OEM alarm */ memset( &a, 0, sizeof( a ) ); /* Make sure alarm has valid fields */ a.Severity = event->Severity; a.AlarmCond.Type = type; oh_entity_path_lookup(event->Source, &a.AlarmCond.Entity); a.AlarmCond.ResourceId = event->Source; a.AlarmCond.Mid = event->EventDataUnion.OemEvent.MId; memcpy(&a.AlarmCond.Data, &event->EventDataUnion.OemEvent.OemEventData, sizeof(SaHpiTextBufferT)); oh_add_alarm(d, &a, 0); return; } static void oh_detect_resource_event_alarm(struct oh_domain *d, SaHpiEventT *event) { SaHpiStatusCondTypeT type = SAHPI_STATUS_COND_TYPE_RESOURCE; SaHpiAlarmT a; if (!d || !event) return; if (event->EventType != SAHPI_ET_RESOURCE) return; /* Search for possible clearance of resource alarm, if event is not a resource failure */ if (event->EventDataUnion.ResourceEvent.ResourceEventType != SAHPI_RESE_RESOURCE_FAILURE) { oh_remove_alarm(d, NULL, &type, &event->Source, NULL, NULL, NULL, NULL, 1); return; } /* Failed resource. Add/Create resource alarm if severity is "alarming" */ if (event->Severity <= SAHPI_MINOR) { memset( &a, 0, sizeof( a ) ); /* Make sure alarm has valid * fields */ a.Severity = event->Severity; a.AlarmCond.Type = type; oh_entity_path_lookup(event->Source, &a.AlarmCond.Entity); a.AlarmCond.ResourceId = event->Source; oh_add_alarm(d, &a, 0); } return; } static void oh_detect_sensor_event_alarm(struct oh_domain *d, SaHpiEventT *event) { SaHpiStatusCondTypeT type = SAHPI_STATUS_COND_TYPE_SENSOR; SaHpiAlarmT a; if (!d || !event) return; if ( ( event->EventDataUnion.SensorEvent.OptionalDataPresent & SAHPI_SOD_CURRENT_STATE ) != 0 ) { SaHpiEventStateT deasserted = ~ ( event->EventDataUnion.SensorEvent.CurrentState ); oh_remove_alarm(d, NULL, &type, &event->Source, NULL, &event->EventDataUnion.SensorEvent.SensorNum, NULL, &deasserted, 1); } if (!event->EventDataUnion.SensorEvent.Assertion) { /* Check for possible sensor alarm removals, since sensor is not asserted. */ oh_remove_alarm(d, NULL, &type, &event->Source, NULL, &event->EventDataUnion.SensorEvent.SensorNum, &event->EventDataUnion.SensorEvent.EventState, NULL, 1); } else if (event->Severity <= SAHPI_MINOR && event->EventDataUnion.SensorEvent.Assertion) { /* Add sensor alarm to dat, since event is severe enough and is asserted. */ memset( &a, 0, sizeof( a ) ); /* Make sure alarm has valid * fields */ a.Severity = event->Severity; a.AlarmCond.Type = type; oh_entity_path_lookup(event->Source, &a.AlarmCond.Entity); a.AlarmCond.ResourceId = event->Source; a.AlarmCond.SensorNum = event->EventDataUnion.SensorEvent.SensorNum; a.AlarmCond.EventState = event->EventDataUnion.SensorEvent.EventState; oh_add_alarm(d, &a, 0); } return; } static void oh_detect_sensor_enable_change_alarm(struct oh_domain *d, SaHpiEventT *event) { SaHpiStatusCondTypeT type = SAHPI_STATUS_COND_TYPE_SENSOR; if (!d || !event) return; if (!event->EventDataUnion.SensorEnableChangeEvent.SensorEnable || !event->EventDataUnion.SensorEnableChangeEvent.SensorEventEnable) { oh_remove_alarm(d, NULL, &type, &event->Source, NULL, &event->EventDataUnion.SensorEnableChangeEvent.SensorNum, NULL, NULL, 1); } } static void oh_remove_resource_alarms(struct oh_domain *d, SaHpiResourceIdT rid, int all) { SaHpiStatusCondTypeT type = SAHPI_STATUS_COND_TYPE_RESOURCE; if (!d || !rid) return; oh_remove_alarm(d, NULL, &type, &rid, NULL, NULL, NULL, NULL, 1); if (all) { type = SAHPI_STATUS_COND_TYPE_OEM; oh_remove_alarm(d, NULL, &type, &rid, NULL, NULL, NULL, NULL, 1); type = SAHPI_STATUS_COND_TYPE_SENSOR; oh_remove_alarm(d, NULL, &type, &rid, NULL, NULL, NULL, NULL, 1); } return; } static void oh_detect_hpi_alarm(struct oh_domain *d, SaHpiEventT *event) { if (!d || !event) return; switch (event->EventType) { case SAHPI_ET_OEM: oh_detect_oem_event_alarm(d, event); break; case SAHPI_ET_RESOURCE: oh_detect_resource_event_alarm(d, event); break; case SAHPI_ET_SENSOR: oh_detect_sensor_event_alarm(d, event); break; case SAHPI_ET_SENSOR_ENABLE_CHANGE: oh_detect_sensor_enable_change_alarm(d, event); break; default:; } return; } static void oh_detect_resource_alarm(struct oh_domain *d, SaHpiRptEntryT *res) { SaHpiAlarmT a; SaHpiStatusCondTypeT type = SAHPI_STATUS_COND_TYPE_SENSOR; if (!d || !res) return; /* Check possible alarms for removal, if resource is not failed. */ if (!res->ResourceFailed || res->ResourceSeverity > SAHPI_MINOR) { oh_remove_alarm(d, NULL, &type, &res->ResourceId, NULL, NULL, NULL, NULL, 1); } else if (res->ResourceSeverity <= SAHPI_MINOR && res->ResourceFailed) { /* Otherwise, if sev is "alarming" and resource failed, create alarm. */ memset( &a, 0, sizeof( a ) ); /* Make sure alarm has valid * fields */ a.Severity = res->ResourceSeverity; a.AlarmCond.Type = SAHPI_STATUS_COND_TYPE_RESOURCE; oh_entity_path_lookup(res->ResourceId, &a.AlarmCond.Entity); a.AlarmCond.ResourceId = res->ResourceId; a.AlarmCond.Mid = res->ResourceInfo.ManufacturerId; memcpy(&a.AlarmCond.Data, &res->ResourceTag, sizeof(SaHpiTextBufferT)); oh_add_alarm(d, &a, 0); } return; } /** * oh_detect_event_alarm * @d: pointer to domain * @e: pointer to event * * Study event and determine if alarms need to be removed. * * Return value: SA_OK on success **/ SaErrorT oh_detect_event_alarm(struct oh_domain *d, struct oh_event *e) { SaHpiEventTypeT etype; if (!d || !e) return SA_ERR_HPI_INVALID_PARAMS; etype = e->event.EventType; if (etype == SAHPI_ET_RESOURCE) { if (e->resource.ResourceId) { oh_detect_resource_alarm(d, &e->resource); } else { oh_detect_resource_event_alarm(d, &e->event); } } else if (etype == SAHPI_ET_HOTSWAP) { if (e->event.EventDataUnion.HotSwapEvent.HotSwapState == SAHPI_HS_STATE_NOT_PRESENT) { SaHpiResourceIdT rid = e->resource.ResourceId; if (!rid) rid = e->event.Source; oh_remove_resource_alarms(d, rid, 1); } } else { oh_detect_hpi_alarm(d, &e->event); } return SA_OK; } /** * oh_detect_res_sev_alarm * @did: domain id * @res: resource id * @new_sev: severity being set in resource * * Detect if severity on resource change makes any alarms invalid. * If so, remove such alarms. * * Return value: SA_OK on success **/ SaErrorT oh_detect_res_sev_alarm(SaHpiDomainIdT did, SaHpiResourceIdT rid, SaHpiSeverityT new_sev) { struct oh_domain *d = NULL; SaHpiRptEntryT *res = NULL; if (!rid) return SA_ERR_HPI_INVALID_PARAMS; d = oh_get_domain(did); if (!d) return SA_ERR_HPI_INVALID_DOMAIN; res = oh_get_resource_by_id(&d->rpt, rid); if (!res) { oh_release_domain(d); return SA_ERR_HPI_INVALID_RESOURCE; } if (res->ResourceSeverity <= SAHPI_MINOR && new_sev > SAHPI_MINOR) oh_remove_resource_alarms(d, res->ResourceId, 0); oh_release_domain(d); return SA_OK; } /** * oh_detect_sensor_enable_alarm * @did: domain id * @rid: resource id * @num: sensor number * @enable: sensor enable flag * * This will detect if a sensor-enable related alarm needs to be removed, * and if so, will remove it accordingly. * * Return value: SA_OK on success **/ SaErrorT oh_detect_sensor_enable_alarm(SaHpiDomainIdT did, SaHpiResourceIdT rid, SaHpiSensorNumT num, SaHpiBoolT enable) { struct oh_domain *d = NULL; SaHpiStatusCondTypeT type = SAHPI_STATUS_COND_TYPE_SENSOR; SaErrorT error = SA_OK; if (!rid) return SA_ERR_HPI_INVALID_PARAMS; /* Only need to scan alarm table if enable is false */ if (enable) return SA_OK; d = oh_get_domain(did); if (!d) return SA_ERR_HPI_INVALID_DOMAIN; /* Enable is false, so scan alarm table and remove any matching sensor alarms */ error = oh_remove_alarm(d, NULL, &type, &rid, NULL, &num, NULL, NULL, 1); oh_release_domain(d); return error; } /** * oh_detect_sensor_mask_alarm * @did: domain id * @rid: resource id * @num: sensor number * @action: event mask action * @deassert_mask: deassert mask * * This will detect if a sensor related alarm needs to be removed, * and if so, will remove it accordingly. * * Return value: SA_OK on success **/ SaErrorT oh_detect_sensor_mask_alarm(SaHpiDomainIdT did, SaHpiResourceIdT rid, SaHpiSensorNumT num, SaHpiSensorEventMaskActionT action, SaHpiEventStateT deassert_mask) { struct oh_domain *d = NULL; SaHpiStatusCondTypeT type = SAHPI_STATUS_COND_TYPE_SENSOR; SaErrorT error = SA_OK; if (!rid) return SA_ERR_HPI_INVALID_PARAMS; if (action == SAHPI_SENS_ADD_EVENTS_TO_MASKS) return SA_OK; if (action != SAHPI_SENS_REMOVE_EVENTS_FROM_MASKS) return SA_ERR_HPI_INVALID_PARAMS; d = oh_get_domain(did); if (!d) return SA_ERR_HPI_INVALID_DOMAIN; /* Find matching sensor alarms and compare alarm's state with the deassert mask. If deassert for that state is being disabled on the sensor, then remove the alarm. */ error = oh_remove_alarm(d, NULL, &type, &rid, NULL, &num, NULL, &deassert_mask, 1); oh_release_domain(d); return error; } /** * oh_alarms_to_file * * @at: pointer to alarm table. alarms in this table will be saved to a file * @filename: file to which alarms will be saved. * * Return value: SA_OK on success. **/ SaErrorT oh_alarms_to_file(struct oh_dat *at, char *filename) { GSList *alarms = NULL; int file; if (!at || !filename) { err("Invalid Parameters"); return SA_ERR_HPI_INVALID_PARAMS; } file = open(filename, O_WRONLY|O_CREAT|O_TRUNC, S_IRUSR|S_IWUSR|S_IRGRP|S_IWGRP); if (file < 0) { err("File '%s' could not be opened", filename); return SA_ERR_HPI_ERROR; } for (alarms = at->list; alarms; alarms = alarms->next) { int bytes_written = 0; bytes_written = write(file, (void *)alarms->data, sizeof(SaHpiAlarmT)); if (bytes_written != sizeof(SaHpiAlarmT)) { err("Couldn't write to file '%s'.", filename); close(file); return SA_ERR_HPI_ERROR; } } if (close(file) != 0) { err("Couldn't close file '%s'.", filename); return SA_ERR_HPI_ERROR; } return SA_OK; } /** * oh_alarms_from_file * * @d: pointer to domain. alarm table in this domain will receive * the alarms stored in @filename. * @filename: filename where alarms will be read from * * Return value: SA_OK on success **/ SaErrorT oh_alarms_from_file(struct oh_domain *d, char *filename) { int file; SaHpiAlarmT alarm; if (!d || !filename) { err("Invalid Parameters"); return SA_ERR_HPI_ERROR; } file = open(filename, O_RDONLY); if (file < 0) { err("File '%s' could not be opened", filename); return SA_ERR_HPI_ERROR; } while (read(file, &alarm, sizeof(SaHpiAlarmT)) == sizeof(SaHpiAlarmT)) { SaHpiAlarmT *a = oh_add_alarm(d, &alarm, 1); if (!a) { close(file); err("Error adding alarm read from file."); return SA_ERR_HPI_ERROR; } } if (close(file) != 0) { err("Couldn't close file '%s'.", filename); return SA_ERR_HPI_ERROR; } return SA_OK; } openhpi-2.14.1/src/plugin.c0000644000076400007640000010454711302567034012436 0ustar /* -*- linux-c -*- * * Copyright (c) 2003 by Intel Corp. * (C) Copyright IBM Corp. 2003, 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Louis Zhuang * Sean Dague * David Judkovics * Renier Morales * Anton Pak */ #include #include #include #include #include #include #include #include #include /* * Structure containing global list of plugins (oh_plugin). */ struct oh_plugins oh_plugins = { .list = NULL, .lock = G_STATIC_REC_MUTEX_INIT }; /* * Structure containing global table of handlers (oh_handler). */ struct oh_handlers oh_handlers = { .table = NULL, .list = NULL, .lock = G_STATIC_REC_MUTEX_INIT }; /** * oh_close_handlers * * When a client calls exit() this function * gets called to clean up the handlers * and any handler connections to the hardware. * Until clients use dynamic oHPI interface * * Returns: void **/ void oh_close_handlers() { struct oh_handler *h = NULL; GSList *node = NULL; g_static_rec_mutex_lock(&oh_handlers.lock); if (oh_handlers.list == NULL) { g_static_rec_mutex_unlock(&oh_handlers.lock); return; } for (node = oh_handlers.list; node; node = node->next) { h = node->data; if (h && h->abi && h->abi->close) { h->abi->close(h->hnd); } } g_static_rec_mutex_unlock(&oh_handlers.lock); } /** * oh_exit_ltdl * * Does everything needed to close the ltdl structures. * * Returns: 0 on Success. **/ static int oh_exit_ltdl(void) { int rv; rv = lt_dlexit(); if (rv < 0) { err("Could not exit ltdl!"); return -1; } return 0; } /** * oh_init_ltdl * * Does all the initialization needed for the ltdl process to * work. It takes no arguments, and returns 0 on success, < 0 on error * * Returns: 0 on Success. **/ static int oh_init_ltdl(void) { struct oh_global_param path_param = { .type = OPENHPI_PATH }; int err; static int init_done = 0; data_access_lock(); if (init_done) { data_access_unlock(); return 0; } err = lt_dlinit(); if (err != 0) { err("Can not init ltdl"); data_access_unlock(); return -1; } oh_get_global_param(&path_param); err = lt_dlsetsearchpath(path_param.u.path); if (err != 0) { err("Can not set lt_dl search path"); oh_exit_ltdl(); data_access_unlock(); return -1; } init_done = 1; data_access_unlock(); return 0; } static void __inc_plugin_refcount(struct oh_plugin *p) { g_static_rec_mutex_lock(&p->refcount_lock); p->refcount++; g_static_rec_mutex_unlock(&p->refcount_lock); } static void __dec_plugin_refcount(struct oh_plugin *p) { g_static_rec_mutex_lock(&p->refcount_lock); p->refcount--; g_static_rec_mutex_unlock(&p->refcount_lock); } static void __delete_plugin(struct oh_plugin *p) { if (!p) return; g_free(p->name); g_static_rec_mutex_free(&p->lock); g_static_rec_mutex_free(&p->refcount_lock); g_free(p->abi); if (p->dl_handle) { lt_dlclose(p->dl_handle); } g_free(p); } /** * oh_get_plugin * @plugin_name: name of plugin. string. * * Lookup and get a reference for @plugin_name. * Locks out the plugin. Need to call oh_putback_plugin * to unlock it. * * Returns: oh_plugin reference or NULL if plugin_name was not found. **/ struct oh_plugin *oh_get_plugin(char *plugin_name) { GSList *node = NULL; struct oh_plugin *plugin = NULL; if (!plugin_name) { err("ERROR getting plugin. Invalid parameter."); return NULL; } g_static_rec_mutex_lock(&oh_plugins.lock); for (node = oh_plugins.list; node; node = node->next) { struct oh_plugin *p = (struct oh_plugin *)(node->data); if (strcmp(p->name, plugin_name) == 0) { __inc_plugin_refcount(p); g_static_rec_mutex_unlock(&oh_plugins.lock); g_static_rec_mutex_lock(&p->lock); plugin = p; return plugin; } } g_static_rec_mutex_unlock(&oh_plugins.lock); return plugin; } /** * oh_release_plugin * @plugin: Pointer to plugin * * Decrements refcount on plugin and unlocks it. * * Returns: void **/ void oh_release_plugin(struct oh_plugin *plugin) { if (!plugin) { err("WARNING - NULL plugin parameter passed."); return; } __dec_plugin_refcount(plugin); if (plugin->refcount < 0) __delete_plugin(plugin); else g_static_rec_mutex_unlock(&plugin->lock); } /** * oh_getnext_plugin_name * @plugin_name: IN. If NULL is passed, the first plugin in the list is returned. * @next_plugin_name: OUT. Buffer to print the next plugin name to. * @size: IN. Size of the buffer at @next_plugin_name. * * Returns: 0 on Success. **/ int oh_getnext_plugin_name(char *plugin_name, char *next_plugin_name, unsigned int size) { GSList *node = NULL; if (!next_plugin_name) { err("ERROR. Invalid parameter."); return -1; } memset(next_plugin_name, '\0', size); if (!plugin_name) { g_static_rec_mutex_lock(&oh_plugins.lock); if (oh_plugins.list) { struct oh_plugin *plugin = oh_plugins.list->data; strncpy(next_plugin_name, plugin->name, size); g_static_rec_mutex_unlock(&oh_plugins.lock); return 0; } else { g_static_rec_mutex_unlock(&oh_plugins.lock); dbg("No plugins have been loaded yet."); return -1; } } else { g_static_rec_mutex_lock(&oh_plugins.lock); for (node = oh_plugins.list; node; node = node->next) { struct oh_plugin *p = node->data; if (strcmp(p->name, plugin_name) == 0) { if (node->next) { p = node->next->data; strncpy(next_plugin_name, p->name, size); g_static_rec_mutex_unlock(&oh_plugins.lock); return 0; } else { break; } } } g_static_rec_mutex_unlock(&oh_plugins.lock); } return -1; } /* list of static plugins. defined in plugin_static.c.in */ extern struct oh_static_plugin static_plugins[]; /** * oh_load_plugin * @plugin_name: name of plugin to be loaded (e.g. "libdummy"). * * Load plugin by name * * Returns: 0 on Success. **/ int oh_load_plugin(char *plugin_name) { struct oh_plugin *plugin = NULL; struct oh_static_plugin *p = static_plugins; int err; if (!plugin_name) { err("ERROR. NULL plugin name passed."); return -1; } if (oh_init_ltdl()) { err("ERROR. Could not initialize ltdl for loading plugins."); return -1; } plugin = oh_get_plugin(plugin_name); if (plugin) { oh_release_plugin(plugin); dbg("Plugin %s already loaded. Not loading twice.", plugin_name); return 0; } plugin = (struct oh_plugin *)g_malloc0(sizeof(struct oh_plugin)); if (!plugin) { err("Out of memory."); return -1; } plugin->name = g_strdup(plugin_name); plugin->handler_count = 0; plugin->refcount = 0; g_static_rec_mutex_init(&plugin->lock); g_static_rec_mutex_init(&plugin->refcount_lock); /* first take search plugin in the array of static plugin */ while (p->name) { if (!strcmp(plugin->name, p->name)) { plugin->dl_handle = 0; err = (*p->get_interface)((void **)&plugin->abi, UUID_OH_ABI_V2); if (err < 0 || !plugin->abi || !plugin->abi->open) { err("Can not get ABI V2"); goto cleanup_and_quit; } dbg("found static plugin %s", p->name); g_static_rec_mutex_lock(&oh_plugins.lock); oh_plugins.list = g_slist_append(oh_plugins.list, plugin); g_static_rec_mutex_unlock(&oh_plugins.lock); return 0; } p++; } plugin->dl_handle = lt_dlopenext(plugin->name); if (plugin->dl_handle == NULL) { err("Can not open %s plugin: %s", plugin->name, lt_dlerror()); goto cleanup_and_quit; } err = oh_load_plugin_functions(plugin, &plugin->abi); if (err < 0 || !plugin->abi || !plugin->abi->open) { err("Can not get ABI"); goto cleanup_and_quit; } g_static_rec_mutex_lock(&oh_plugins.lock); oh_plugins.list = g_slist_append(oh_plugins.list, plugin); g_static_rec_mutex_unlock(&oh_plugins.lock); return 0; cleanup_and_quit: __delete_plugin(plugin); return -1; } /** * oh_unload_plugin * @plugin_name: String. Name of plugin to unload. * * Returns: 0 on Success. **/ int oh_unload_plugin(char *plugin_name) { struct oh_plugin *plugin = NULL; if (!plugin_name) { err("ERROR unloading plugin. NULL parameter passed."); return -1; } plugin = oh_get_plugin(plugin_name); if (!plugin) { err("ERROR unloading plugin. Plugin not found."); return -2; } if (plugin->handler_count > 0) { oh_release_plugin(plugin); err("ERROR unloading plugin. Handlers are still referencing it."); return -3; } g_static_rec_mutex_lock(&oh_plugins.lock); oh_plugins.list = g_slist_remove(oh_plugins.list, plugin); g_static_rec_mutex_unlock(&oh_plugins.lock); __dec_plugin_refcount(plugin); if (plugin->refcount < 1) __delete_plugin(plugin); else oh_release_plugin(plugin); return 0; } static void __inc_handler_refcount(struct oh_handler *h) { g_static_rec_mutex_lock(&h->refcount_lock); h->refcount++; g_static_rec_mutex_unlock(&h->refcount_lock); } static void __dec_handler_refcount(struct oh_handler *h) { g_static_rec_mutex_lock(&h->refcount_lock); h->refcount--; g_static_rec_mutex_unlock(&h->refcount_lock); } static void __delete_handler(struct oh_handler *h) { struct oh_plugin *plugin = NULL; if (!h) return; /* Subtract one from the number of handlers using this plugin */ plugin = oh_get_plugin(h->plugin_name); if (!plugin) { err("BAD ERROR - Handler loaded, but plugin does not exist!"); } else { plugin->handler_count--; oh_release_plugin(plugin); } /* Free the oh_handler members first, then the handler. */ /* FIXME: Where/When should the handler config table be freed? */ g_static_rec_mutex_free(&h->lock); g_static_rec_mutex_free(&h->refcount_lock); g_free(h); } /** * oh_get_handler * @hid: id of handler being requested * * Returns: NULL if handler was not found. **/ struct oh_handler *oh_get_handler(unsigned int hid) { GSList *node = NULL; struct oh_handler *handler = NULL; g_static_rec_mutex_lock(&oh_handlers.lock); node = g_hash_table_lookup(oh_handlers.table, &hid); handler = node ? node->data : NULL; if (!handler) { g_static_rec_mutex_unlock(&oh_handlers.lock); err("Error - Handler %d was not found", hid); return NULL; } __inc_handler_refcount(handler); g_static_rec_mutex_unlock(&oh_handlers.lock); g_static_rec_mutex_lock(&handler->lock); return handler; } /** * oh_release_handler * @handler: a handler, previously obtained (i.e. locked) with * oh_get_handler(), to be released (i.e. unlocked). * * Returns: void **/ void oh_release_handler(struct oh_handler *handler) { if (!handler) { err("Warning - NULL parameter passed."); return; } __dec_handler_refcount(handler); if (handler->refcount < 0) __delete_handler(handler); else g_static_rec_mutex_unlock(&handler->lock); } /** * oh_getnext_handler_id * @hid: If 0, will return the first handler id in the list. * Otherwise, indicates handler id previous to the one being requested. * @next_hid: Place where the next handler id after @hid * will be put. * * Returns: 0 on Success. **/ int oh_getnext_handler_id(unsigned int hid, unsigned int *next_hid) { GSList *node = NULL; struct oh_handler *h = NULL; if (!next_hid) { err("ERROR. Invalid parameter."); return -1; } *next_hid = 0; if (!hid) { /* Return first handler id in the list */ g_static_rec_mutex_lock(&oh_handlers.lock); if (oh_handlers.list) { h = oh_handlers.list->data; *next_hid = h->id; g_static_rec_mutex_unlock(&oh_handlers.lock); return 0; } else { g_static_rec_mutex_unlock(&oh_handlers.lock); err("Warning - no handlers"); return -1; } } else { /* Return handler id coming after hid in the list */ g_static_rec_mutex_lock(&oh_handlers.lock); node = g_hash_table_lookup(oh_handlers.table, &hid); if (node && node->next && node->next->data) { h = node->next->data; *next_hid = h->id; g_static_rec_mutex_unlock(&oh_handlers.lock); return 0; } } g_static_rec_mutex_unlock(&oh_handlers.lock); return -1; } static struct oh_handler *new_handler(GHashTable *handler_config) { /* Return a new oh_handler instance */ struct oh_plugin *plugin = NULL; struct oh_handler *handler = NULL; char *plugin_name = NULL; static unsigned int handler_id = 1; if (!handler_config) { err("ERROR creating new handler. Invalid parameter."); return NULL; } plugin_name = (char *)g_hash_table_lookup(handler_config, "plugin"); if (!plugin_name) { err("ERROR creating new handler. No plugin name received."); return NULL; } handler = (struct oh_handler *)g_malloc0(sizeof(struct oh_handler)); plugin = oh_get_plugin(plugin_name); if(!plugin) { /* Attempt to load plugin here once */ int rc = oh_load_plugin(plugin_name); if (rc) { err("Could not create handler. Plugin %s not loaded", plugin_name); goto cleanexit; } plugin = oh_get_plugin(plugin_name); if (!plugin) { err("Tried but could not get a plugin to " "create this handler."); goto cleanexit; } } /* Initialize handler */ handler->abi = plugin->abi; plugin->handler_count++; /* Increment # of handlers using the plugin */ oh_release_plugin(plugin); g_static_rec_mutex_lock(&oh_handlers.lock); handler->id = handler_id++; g_static_rec_mutex_unlock(&oh_handlers.lock); handler->plugin_name = (char *)g_hash_table_lookup(handler_config, "plugin"); handler->config = handler_config; handler->refcount = 0; g_static_rec_mutex_init(&handler->lock); g_static_rec_mutex_init(&handler->refcount_lock); return handler; cleanexit: g_free(handler); return NULL; } /** * oh_create_handler * @handler_config: Hash table containing the configuration for a handler * read from the configuration file. * @hid: pointer where hid of newly created handler will be stored. * * Returns: SA_OK on success. If handler failed to open, then @hid will * contain a valid handler id, but SA_ERR_HPI_INTERNAL_ERROR will be * returned. **/ SaErrorT oh_create_handler (GHashTable *handler_config, unsigned int *hid) { struct oh_handler *handler = NULL; if (!handler_config || !hid) { err("ERROR creating handler. Invalid parameters."); return SA_ERR_HPI_INVALID_PARAMS; } *hid = 0; handler = new_handler(handler_config); if (!handler) return SA_ERR_HPI_ERROR; *hid = handler->id; g_static_rec_mutex_lock(&oh_handlers.lock); oh_handlers.list = g_slist_append(oh_handlers.list, handler); g_hash_table_insert(oh_handlers.table, &(handler->id), g_slist_last(oh_handlers.list)); handler->hnd = handler->abi->open(handler->config, handler->id, &oh_process_q); if (!handler->hnd) { err("A handler #%d on the %s plugin could not be opened.", handler->id, handler->plugin_name); g_static_rec_mutex_unlock(&oh_handlers.lock); return SA_ERR_HPI_INTERNAL_ERROR; } g_static_rec_mutex_unlock(&oh_handlers.lock); return SA_OK; } /** * oh_destroy_handler * @hid: Id of handler to destroy * * Returns: 0 on Success. **/ int oh_destroy_handler(unsigned int hid) { struct oh_handler *handler = NULL; if (hid < 1) { err("ERROR - Invalid handler 0 id passed."); return -1; } handler = oh_get_handler(hid); if (!handler) { err("ERROR - Handler %d not found.", hid); return -1; } if (handler->abi && handler->abi->close) handler->abi->close(handler->hnd); g_static_rec_mutex_lock(&oh_handlers.lock); g_hash_table_remove(oh_handlers.table, &handler->id); oh_handlers.list = g_slist_remove(oh_handlers.list, &(handler->id)); g_static_rec_mutex_unlock(&oh_handlers.lock); __dec_handler_refcount(handler); if (handler->refcount < 1) __delete_handler(handler); else oh_release_handler(handler); return 0; } /** * oh_discover_resources * * Returns: SA_OK on success. **/ SaErrorT oh_discovery(void) { unsigned int hid = 0, next_hid; struct oh_handler *h = NULL; SaErrorT error = SA_ERR_HPI_ERROR; oh_getnext_handler_id(hid, &next_hid); while (next_hid) { hid = next_hid; SaErrorT cur_error; h = oh_get_handler(hid); if (!h) { err("No such handler %d", hid); break; } if (h->abi->discover_resources && h->hnd) { cur_error = h->abi->discover_resources(h->hnd); if (cur_error == SA_OK && error) { error = cur_error; } } oh_release_handler(h); oh_getnext_handler_id(hid, &next_hid); } return error; } /** * oh_load_plugin_functions * @plugin: plugin structure. * @abi: oh_abi struct * * This function will load the symbol table from the plugin name and * assign the plugin functions to the abi struct. * * Return value: 0 on success, otherwise any negative value on failure. **/ int oh_load_plugin_functions(struct oh_plugin *plugin, struct oh_abi_v2 **abi) { *abi = (struct oh_abi_v2 *)g_malloc0(sizeof(struct oh_abi_v2)); if (!(*abi)) { err("Out of Memory!"); return -1; } (*abi)->open = lt_dlsym(plugin->dl_handle, "oh_open"); (*abi)->close = lt_dlsym(plugin->dl_handle, "oh_close"); (*abi)->get_event = lt_dlsym(plugin->dl_handle, "oh_get_event"); (*abi)->discover_resources = lt_dlsym(plugin->dl_handle, "oh_discover_resources"); (*abi)->set_resource_tag = lt_dlsym(plugin->dl_handle, "oh_set_resource_tag"); (*abi)->set_resource_severity = lt_dlsym(plugin->dl_handle, "oh_set_resource_severity"); (*abi)->resource_failed_remove = lt_dlsym(plugin->dl_handle, "oh_resource_failed_remove"); (*abi)->get_el_info = lt_dlsym(plugin->dl_handle, "oh_get_el_info"); (*abi)->get_el_caps = lt_dlsym(plugin->dl_handle, "oh_get_el_caps"); (*abi)->set_el_time = lt_dlsym(plugin->dl_handle, "oh_set_el_time"); (*abi)->add_el_entry = lt_dlsym(plugin->dl_handle, "oh_add_el_entry"); (*abi)->get_el_entry = lt_dlsym(plugin->dl_handle, "oh_get_el_entry"); (*abi)->clear_el = lt_dlsym(plugin->dl_handle, "oh_clear_el"); (*abi)->set_el_state = lt_dlsym(plugin->dl_handle, "oh_set_el_state"); (*abi)->reset_el_overflow = lt_dlsym(plugin->dl_handle, "oh_reset_el_overflow"); (*abi)->get_sensor_reading = lt_dlsym(plugin->dl_handle, "oh_get_sensor_reading"); (*abi)->get_sensor_thresholds = lt_dlsym(plugin->dl_handle, "oh_get_sensor_thresholds"); (*abi)->set_sensor_thresholds = lt_dlsym(plugin->dl_handle, "oh_set_sensor_thresholds"); (*abi)->get_sensor_enable = lt_dlsym(plugin->dl_handle, "oh_get_sensor_enable"); (*abi)->set_sensor_enable = lt_dlsym(plugin->dl_handle, "oh_set_sensor_enable"); (*abi)->get_sensor_event_enables = lt_dlsym(plugin->dl_handle, "oh_get_sensor_event_enables"); (*abi)->set_sensor_event_enables = lt_dlsym(plugin->dl_handle, "oh_set_sensor_event_enables"); (*abi)->get_sensor_event_masks = lt_dlsym(plugin->dl_handle, "oh_get_sensor_event_masks"); (*abi)->set_sensor_event_masks = lt_dlsym(plugin->dl_handle, "oh_set_sensor_event_masks"); (*abi)->get_control_state = lt_dlsym(plugin->dl_handle, "oh_get_control_state"); (*abi)->set_control_state = lt_dlsym(plugin->dl_handle, "oh_set_control_state"); (*abi)->get_idr_info = lt_dlsym(plugin->dl_handle, "oh_get_idr_info"); (*abi)->get_idr_area_header = lt_dlsym(plugin->dl_handle, "oh_get_idr_area_header"); (*abi)->add_idr_area = lt_dlsym(plugin->dl_handle, "oh_add_idr_area"); (*abi)->add_idr_area_id = lt_dlsym(plugin->dl_handle, "oh_add_idr_area_id"); (*abi)->del_idr_area = lt_dlsym(plugin->dl_handle, "oh_del_idr_area"); (*abi)->get_idr_field = lt_dlsym(plugin->dl_handle, "oh_get_idr_field"); (*abi)->add_idr_field = lt_dlsym(plugin->dl_handle, "oh_add_idr_field"); (*abi)->add_idr_field_id = lt_dlsym(plugin->dl_handle, "oh_add_idr_field_id"); (*abi)->set_idr_field = lt_dlsym(plugin->dl_handle, "oh_set_idr_field"); (*abi)->del_idr_field = lt_dlsym(plugin->dl_handle, "oh_del_idr_field"); (*abi)->get_watchdog_info = lt_dlsym(plugin->dl_handle, "oh_get_watchdog_info"); (*abi)->set_watchdog_info = lt_dlsym(plugin->dl_handle, "oh_set_watchdog_info"); (*abi)->reset_watchdog = lt_dlsym(plugin->dl_handle, "oh_reset_watchdog"); (*abi)->get_next_announce = lt_dlsym(plugin->dl_handle, "oh_get_next_announce"); (*abi)->get_announce = lt_dlsym(plugin->dl_handle, "oh_get_announce"); (*abi)->ack_announce = lt_dlsym(plugin->dl_handle, "oh_ack_announce"); (*abi)->add_announce = lt_dlsym(plugin->dl_handle, "oh_add_announce"); (*abi)->del_announce = lt_dlsym(plugin->dl_handle, "oh_del_announce"); (*abi)->get_annunc_mode = lt_dlsym(plugin->dl_handle, "oh_get_annunc_mode"); (*abi)->set_annunc_mode = lt_dlsym(plugin->dl_handle, "oh_set_annunc_mode"); (*abi)->get_dimi_info = lt_dlsym(plugin->dl_handle, "oh_get_dimi_info"); (*abi)->get_dimi_test = lt_dlsym(plugin->dl_handle, "oh_get_dimi_test"); (*abi)->get_dimi_test_ready = lt_dlsym(plugin->dl_handle, "oh_get_dimi_test_ready"); (*abi)->start_dimi_test = lt_dlsym(plugin->dl_handle, "oh_start_dimi_test"); (*abi)->cancel_dimi_test = lt_dlsym(plugin->dl_handle, "oh_cancel_dimi_test"); (*abi)->get_dimi_test_status = lt_dlsym(plugin->dl_handle, "oh_get_dimi_test_status"); (*abi)->get_dimi_test_results = lt_dlsym(plugin->dl_handle, "oh_get_dimi_test_results"); (*abi)->get_fumi_spec = lt_dlsym(plugin->dl_handle, "oh_get_fumi_spec"); (*abi)->get_fumi_service_impact = lt_dlsym(plugin->dl_handle, "oh_get_fumi_service_impact"); (*abi)->set_fumi_source = lt_dlsym(plugin->dl_handle, "oh_set_fumi_source"); (*abi)->validate_fumi_source = lt_dlsym(plugin->dl_handle, "oh_validate_fumi_source"); (*abi)->get_fumi_source = lt_dlsym(plugin->dl_handle, "oh_get_fumi_source"); (*abi)->get_fumi_source_component = lt_dlsym(plugin->dl_handle, "oh_get_fumi_source_component"); (*abi)->get_fumi_target = lt_dlsym(plugin->dl_handle, "oh_get_fumi_target"); (*abi)->get_fumi_target_component = lt_dlsym(plugin->dl_handle, "oh_get_fumi_target_component"); (*abi)->get_fumi_logical_target = lt_dlsym(plugin->dl_handle, "oh_get_fumi_logical_target"); (*abi)->get_fumi_logical_target_component = lt_dlsym(plugin->dl_handle, "oh_get_fumi_logical_target_component"); (*abi)->start_fumi_backup = lt_dlsym(plugin->dl_handle, "oh_start_fumi_backup"); (*abi)->set_fumi_bank_order = lt_dlsym(plugin->dl_handle, "oh_set_fumi_bank_order"); (*abi)->start_fumi_bank_copy = lt_dlsym(plugin->dl_handle, "oh_start_fumi_bank_copy"); (*abi)->start_fumi_install = lt_dlsym(plugin->dl_handle, "oh_start_fumi_install"); (*abi)->get_fumi_status = lt_dlsym(plugin->dl_handle, "oh_get_fumi_status"); (*abi)->start_fumi_verify = lt_dlsym(plugin->dl_handle, "oh_start_fumi_verify"); (*abi)->start_fumi_verify_main = lt_dlsym(plugin->dl_handle, "oh_start_fumi_verify_main"); (*abi)->cancel_fumi_upgrade = lt_dlsym(plugin->dl_handle, "oh_cancel_fumi_upgrade"); (*abi)->get_fumi_autorollback_disable = lt_dlsym(plugin->dl_handle, "oh_get_fumi_autorollback_disable"); (*abi)->set_fumi_autorollback_disable = lt_dlsym(plugin->dl_handle, "oh_set_fumi_autorollback_disable"); (*abi)->start_fumi_rollback = lt_dlsym(plugin->dl_handle, "oh_start_fumi_rollback"); (*abi)->activate_fumi = lt_dlsym(plugin->dl_handle, "oh_activate_fumi"); (*abi)->start_fumi_activate = lt_dlsym(plugin->dl_handle, "oh_start_fumi_activate"); (*abi)->cleanup_fumi = lt_dlsym(plugin->dl_handle, "oh_cleanup_fumi"); (*abi)->hotswap_policy_cancel = lt_dlsym(plugin->dl_handle, "oh_hotswap_policy_cancel"); (*abi)->get_hotswap_state = lt_dlsym(plugin->dl_handle, "oh_get_hotswap_state"); (*abi)->set_autoinsert_timeout = lt_dlsym(plugin->dl_handle, "oh_set_autoinsert_timeout"); (*abi)->set_hotswap_state = lt_dlsym(plugin->dl_handle, "oh_set_hotswap_state"); (*abi)->request_hotswap_action = lt_dlsym(plugin->dl_handle, "oh_request_hotswap_action"); (*abi)->get_autoextract_timeout = lt_dlsym(plugin->dl_handle, "oh_get_autoextract_timeout"); (*abi)->set_autoextract_timeout = lt_dlsym(plugin->dl_handle, "oh_set_autoextract_timeout"); (*abi)->get_power_state = lt_dlsym(plugin->dl_handle, "oh_get_power_state"); (*abi)->set_power_state = lt_dlsym(plugin->dl_handle, "oh_set_power_state"); (*abi)->get_indicator_state = lt_dlsym(plugin->dl_handle, "oh_get_indicator_state"); (*abi)->set_indicator_state = lt_dlsym(plugin->dl_handle, "oh_set_indicator_state"); (*abi)->control_parm = lt_dlsym(plugin->dl_handle, "oh_control_parm"); (*abi)->load_id_get = lt_dlsym(plugin->dl_handle, "oh_load_id_get"); (*abi)->load_id_set = lt_dlsym(plugin->dl_handle, "oh_load_id_set"); (*abi)->get_reset_state = lt_dlsym(plugin->dl_handle, "oh_get_reset_state"); (*abi)->set_reset_state = lt_dlsym(plugin->dl_handle, "oh_set_reset_state"); (*abi)->inject_event = lt_dlsym(plugin->dl_handle, "oh_inject_event"); return 0; } openhpi-2.14.1/src/domain.c0000644000076400007640000005215611302567034012405 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004-2006 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * Renier Morales * */ #include #include #include #include #include #include #include #include #include #define domains_lock() g_static_rec_mutex_lock(&oh_domains.lock) #define domains_unlock() g_static_rec_mutex_unlock(&oh_domains.lock) struct oh_domain_table oh_domains = { .table = NULL, .lock = G_STATIC_REC_MUTEX_INIT, }; static void __inc_domain_refcount(struct oh_domain *d) { g_static_rec_mutex_lock(&d->refcount_lock); d->refcount++; g_static_rec_mutex_unlock(&d->refcount_lock); return; } static void __dec_domain_refcount(struct oh_domain *d) { g_static_rec_mutex_lock(&d->refcount_lock); d->refcount--; g_static_rec_mutex_unlock(&d->refcount_lock); return; } static void __free_drt_list(GSList *drt_list) { GSList *node = NULL; for (node = drt_list; node; node = node->next) { g_free(node->data); } g_slist_free(drt_list); return; } static void __delete_domain(struct oh_domain *d) { oh_flush_rpt(&d->rpt); oh_el_close(d->del); oh_close_alarmtable(d); __free_drt_list(d->drt.list); g_static_rec_mutex_free(&d->lock); g_static_rec_mutex_free(&d->refcount_lock); g_free(d); } #if 0 static void __query_domains(gpointer key, gpointer value, gpointer user_data) { oh_domain_result dr; GList *node = (GList *)value; struct oh_domain *domain = (struct oh_domain *)node->data; GArray *data = (GArray *)user_data; dr.id = domain->id; dr.entity_pattern = domain->entity_pattern; dr.tag = domain->tag; g_array_append_val(data, dr); } #endif static GList *__get_domain(SaHpiDomainIdT did) { GList *node = NULL; struct oh_domain *domain = NULL; if (did == SAHPI_UNSPECIFIED_DOMAIN_ID) { did = OH_DEFAULT_DOMAIN_ID; } domains_lock(); node = (GList *)g_hash_table_lookup(oh_domains.table, &did); if (!node) { domains_unlock(); return NULL; } domain = (struct oh_domain *)node->data; /* Punch in */ __inc_domain_refcount(domain); /* Unlock domain table */ domains_unlock(); /* Wait to get domain lock */ g_static_rec_mutex_lock(&domain->lock); return node; } static void gen_domain_event(SaHpiDomainIdT target_id, SaHpiDomainIdT subject_id, SaHpiBoolT addition) { struct oh_event *e = NULL; struct timeval tv1; SaHpiDomainEventTypeT type = (addition) ? SAHPI_DOMAIN_REF_ADDED : SAHPI_DOMAIN_REF_REMOVED; e = g_new0(struct oh_event, 1); e->resource.ResourceId = SAHPI_UNSPECIFIED_RESOURCE_ID; e->event.Source = target_id; e->event.EventType = SAHPI_ET_DOMAIN; e->event.Severity = SAHPI_INFORMATIONAL; e->event.EventDataUnion.DomainEvent.Type = type; e->event.EventDataUnion.DomainEvent.DomainId = subject_id; gettimeofday(&tv1, NULL); e->event.Timestamp = (SaHpiTimeT) tv1.tv_sec * 1000000000 + tv1.tv_usec * 1000; dbg("domain %d %s domain %d", subject_id, type == SAHPI_DOMAIN_REF_ADDED ? "added to" : "removed from", target_id); oh_evt_queue_push(&oh_process_q, e); } static void update_drt(SaHpiDomainIdT target_id, SaHpiDomainIdT subject_id, SaHpiBoolT subject_is_peer, SaHpiBoolT addition) { struct oh_domain *domain = NULL; SaHpiDrtEntryT *drtentry = NULL; struct timeval tv1; int found = 0; domain = oh_get_domain(target_id); if (!domain) { err("Warning. Could not update DRT. Domain %u not found.", target_id); return; } if (addition) { drtentry = g_new0(SaHpiDrtEntryT, 1); drtentry->DomainId = subject_id; drtentry->EntryId = ++(domain->drt.next_id); drtentry->IsPeer = subject_is_peer; domain->drt.list = g_slist_append(domain->drt.list, drtentry); gen_domain_event(target_id, subject_id, SAHPI_TRUE); } else { GSList *node = NULL, *savenode = NULL; int child_count = 0, peer_count = 0, is_peer = 0; for (node = domain->drt.list; node || savenode; node = (node) ? node->next : savenode) { drtentry = (SaHpiDrtEntryT *)node->data; savenode = NULL; if (drtentry->IsPeer) peer_count++; else child_count++; if (drtentry->DomainId == subject_id && !found) { is_peer = drtentry->IsPeer; savenode = node->next; domain->drt.list = g_slist_delete_link(domain->drt.list, node); g_free(node->data); gen_domain_event(target_id, subject_id, SAHPI_FALSE); found = 1; node = NULL; } } } if (addition || found) { gettimeofday(&tv1, NULL); domain->drt.update_timestamp = (SaHpiTimeT) tv1.tv_sec * 1000000000 + tv1.tv_usec * 1000; domain->drt.update_count++; } oh_release_domain(domain); } #define add_drtentry(target_id, subject_id, subject_is_peer) \ update_drt(target_id, subject_id, subject_is_peer, SAHPI_TRUE); #define del_drtentry(target_id, subject_id) \ update_drt(target_id, subject_id, SAHPI_FALSE, SAHPI_FALSE); static int connect2parent(struct oh_domain *domain, SaHpiDomainIdT parent_id) { struct oh_domain *parent = NULL; if (!domain) return -1; if (parent_id == SAHPI_UNSPECIFIED_DOMAIN_ID) return -2; parent = oh_get_domain(parent_id); if (!parent) { err("Couldn't get domain %d", parent_id); return -3; } /* Add child drt to peers of parent domain */ #if 0 if (parent->state & OH_DOMAIN_PEER) { GSList *node = NULL; for (node = parent->drt.list; node; node = node->next) { SaHpiDrtEntryT *drte = (SaHpiDrtEntryT *)node->data; if (drte->IsPeer) { add_drtentry(drte->DomainId, domain->id, SAHPI_FALSE); } } } #endif oh_release_domain(parent); /* Add child drt to parent domain */ add_drtentry(parent_id, domain->id, SAHPI_FALSE); // domain->state |= OH_DOMAIN_CHILD; /* set child state */ domain->drt.parent_id = parent_id; return 0; } static int connect2peer(struct oh_domain *domain, SaHpiDomainIdT peer_id) { struct oh_domain *peer = NULL; GSList *node = NULL; if (!domain) return -1; if (peer_id == SAHPI_UNSPECIFIED_DOMAIN_ID) return -2; peer = oh_get_domain(peer_id); if (!peer) { err("Couldn't get domain %d", peer_id); return -3; } /* Copy entitypath pattern. Peers contain the same resources */ // domain->entity_pattern = peer->entity_pattern; /* Copy drt list from target peer. * Also, add self drt to peers of target peer. */ for (node = peer->drt.list; node; node = node->next) { SaHpiDrtEntryT *drtentry = (SaHpiDrtEntryT *)node->data; add_drtentry(domain->id, drtentry->DomainId, drtentry->IsPeer); if (drtentry->IsPeer) { add_drtentry(drtentry->DomainId, domain->id, SAHPI_TRUE); } } oh_release_domain(peer); /* Add each others drts to domain and domain's peer */ add_drtentry(domain->id, peer_id, SAHPI_TRUE); add_drtentry(peer_id, domain->id, SAHPI_TRUE); // domain->state |= OH_DOMAIN_PEER; return 0; } #if 0 static int disconnect_parent(struct oh_domain *child) { GSList *node = NULL; struct oh_domain *parent = NULL; if (!child) return -1; // if (!(child->state & OH_DOMAIN_CHILD)) return -2; parent = oh_get_domain(child->drt.parent_id); if (!parent) return -3; /* Remove child drt from peers of the parent */ for (node = parent->drt.list; node; node = node->next) { SaHpiDrtEntryT *drte = (SaHpiDrtEntryT *)node->data; if (drte->IsPeer) { del_drtentry(drte->DomainId, child->id); } } oh_release_domain(parent); /* Finally, remove child drt from the parent */ del_drtentry(child->drt.parent_id, child->id); // child->state = child->state & 0x06; /* Unset child state */ return 0; } static int disconnect_peers(struct oh_domain *domain) { GSList *node = NULL; if (!domain) return -1; // if (!(domain->state & OH_DOMAIN_PEER)) return -2; /* Remove drt from peers */ for (node = domain->drt.list; node; node = node->next) { SaHpiDrtEntryT *drte = (SaHpiDrtEntryT *)node->data; if (drte->IsPeer) { del_drtentry(drte->DomainId, domain->id); } } // domain->state = domain->state & 0x03; /* Unset peer state */ return 0; } #endif /** * oh_create_domain * @id: Required. 0 or SAHPI_UNSPECIFIED_DOMAIN_ID means default. * @entity_pattern: Required. * @nametag: Optional. * @tier_of: Optional. SAHPI_UNSPECIFIED_DOMAIN_ID means none. * @peer_of: Optional. SAHPI_UNSPECIFIED_DOMAIN_ID means none. * @capabilities: * @ai_timeout: * * * * Returns: SA_OK if domain was created successfully. **/ SaErrorT oh_create_domain(SaHpiDomainIdT id, char *tag, SaHpiDomainIdT child_of, SaHpiDomainIdT peer_of, SaHpiDomainCapabilitiesT capabilities, SaHpiTimeoutT ai_timeout) { struct oh_domain *domain = g_new0(struct oh_domain,1); struct oh_global_param param = { .type = OPENHPI_DEL_SIZE_LIMIT }; char filepath[SAHPI_MAX_TEXT_BUFFER_LENGTH*2]; /* Fix id to int capable value */ if (id == SAHPI_UNSPECIFIED_DOMAIN_ID) id = OH_DEFAULT_DOMAIN_ID; /* Input validation */ if (peer_of == id || child_of == id || (child_of == peer_of && child_of != SAHPI_UNSPECIFIED_DOMAIN_ID)) return SA_ERR_HPI_INVALID_PARAMS; /* Check to see if domain id is already taken */ domains_lock(); if (g_hash_table_lookup(oh_domains.table, &id)) { domains_unlock(); g_free(domain); err("Domain %u already exists; not creating twice.", id); return SA_ERR_HPI_INVALID_DOMAIN; } domain->id = id; /* Set domain id */ if (tag) { /* Set domain tag */ oh_init_textbuffer(&domain->tag); oh_append_textbuffer(&domain->tag, tag); } domain->capabilities = capabilities; domain->ai_timeout = ai_timeout; /* Initialize Resource Precense Table */ oh_init_rpt(&(domain->rpt)); /* Initialize domain reference table timestamp to a valid value */ domain->drt.update_timestamp = SAHPI_TIME_UNSPECIFIED; oh_get_global_param(¶m); /* Get domain event log size limit */ /* Initialize domain event log */ domain->del = oh_el_create(param.u.del_size_limit); if (!domain->del) { domains_unlock(); g_free(domain->del); g_free(domain); return SA_ERR_HPI_ERROR; } g_static_rec_mutex_init(&domain->lock); g_static_rec_mutex_init(&domain->refcount_lock); /* Get option for saving domain event log or not */ param.type = OPENHPI_DEL_SAVE; oh_get_global_param(¶m); if (param.u.del_save) { param.type = OPENHPI_VARPATH; oh_get_global_param(¶m); snprintf(filepath, SAHPI_MAX_TEXT_BUFFER_LENGTH*2, "%s/del.%u", param.u.varpath, domain->id); oh_el_map_from_file(domain->del, filepath); } param.type = OPENHPI_DAT_SAVE; oh_get_global_param(¶m); if (param.u.dat_save) { param.type = OPENHPI_VARPATH; oh_get_global_param(¶m); memset(filepath, 0, SAHPI_MAX_TEXT_BUFFER_LENGTH*2); snprintf(filepath, SAHPI_MAX_TEXT_BUFFER_LENGTH*2, "%s/dat.%u", param.u.varpath, domain->id); oh_alarms_from_file(domain, filepath); } /* Need to put new domain in table before relating to other domains. */ oh_domains.list = g_list_append(oh_domains.list, domain); g_hash_table_insert(oh_domains.table, &domain->id, g_list_last(oh_domains.list)); /* Establish child-parent relationship */ if (child_of != SAHPI_UNSPECIFIED_DOMAIN_ID && connect2parent(domain, child_of)) { err("Error connecting domain %u to parent %u", domain->id, child_of); } /* Establish peer relationships */ if (peer_of != SAHPI_UNSPECIFIED_DOMAIN_ID && connect2peer(domain, peer_of)) { err("Error connection domain %u to peer %u", domain->id, peer_of); } domains_unlock(); return SA_OK; } #if 0 SaErrorT oh_create_domain_from_table(GHashTable *table) { SaHpiDomainIdT *id = NULL, *child_of = NULL, *peer_of = NULL; char *entity_pattern = NULL, *tag = NULL; oh_entitypath_pattern epp; SaHpiTimeT ai_timeout = SAHPI_TIMEOUT_IMMEDIATE, *ait = NULL; unsigned int *ai_readonly = NULL; SaHpiDomainCapabilitiesT capabilities = SAHPI_DOMAIN_CAP_AUTOINSERT_READ_ONLY; if (!table) return SA_ERR_HPI_INVALID_PARAMS; id = (SaHpiDomainIdT *)g_hash_table_lookup(table, "id"); child_of = (SaHpiDomainIdT *)g_hash_table_lookup(table, "child_of"); peer_of = (SaHpiDomainIdT *)g_hash_table_lookup(table, "peer_of"); entity_pattern = (char *)g_hash_table_lookup(table, "entity_pattern"); tag = (char *)g_hash_table_lookup(table, "tag"); ait = (SaHpiTimeT *)g_hash_table_lookup(table, "ai_timeout"); ai_readonly = (unsigned int *)g_hash_table_lookup(table, "ai_readonly"); if (!id) { err("Error creating a domain from configuration." " No domain id was given."); return SA_ERR_HPI_INVALID_PARAMS; } if (id == 0) { /* ID == 0 is the default domain */ /* Default domain cannot be a peer or child of anyone */ child_of = NULL; peer_of = NULL; } if (peer_of && entity_pattern) { warn("Warning creating domain %u. Entity pattern will be" " disregarded since a peer was specified.", *id); } else if (!peer_of && oh_compile_entitypath_pattern(entity_pattern, &epp)) { err("Error creating domain %u. " "Invalid entity pattern given.", *id); return SA_ERR_HPI_INVALID_PARAMS; } if (ait) ai_timeout = *ait * 1000000000; if (ai_readonly && *ai_readonly == 0) capabilities = 0; return oh_create_domain(*id, (peer_of) ? NULL : &epp, tag, (child_of) ? *child_of : SAHPI_UNSPECIFIED_DOMAIN_ID, (peer_of) ? *peer_of : SAHPI_UNSPECIFIED_DOMAIN_ID, capabilities, ai_timeout); } #endif /** * oh_destroy_domain * @did: * * * * Returns: **/ SaErrorT oh_destroy_domain(SaHpiDomainIdT did) { struct oh_domain *domain = NULL; GList *node = NULL; if (did == OH_DEFAULT_DOMAIN_ID || did == SAHPI_UNSPECIFIED_DOMAIN_ID) return SA_ERR_HPI_INVALID_PARAMS; node = __get_domain(did); if (!node) { return SA_ERR_HPI_NOT_PRESENT; } domain = (struct oh_domain *)node->data; #if 0 if (domain->state & OH_DOMAIN_CHILD) disconnect_parent(domain); if (domain->state & OH_DOMAIN_PEER) disconnect_peers(domain); #endif domains_lock(); g_hash_table_remove(oh_domains.table, &domain->id); oh_domains.list = g_list_delete_link(oh_domains.list, node); domains_unlock(); __dec_domain_refcount(domain); if (domain->refcount < 1) __delete_domain(domain); else oh_release_domain(domain); return SA_OK; } /** * oh_get_domain * @did: * * * * Returns: **/ struct oh_domain *oh_get_domain(SaHpiDomainIdT did) { GList *node = NULL; struct oh_domain *domain = NULL; node = __get_domain(did); if (!node) { return NULL; } domain = (struct oh_domain *)node->data; return domain; } /** * oh_release_domain * @domain: * * * * Returns: **/ SaErrorT oh_release_domain(struct oh_domain *domain) { if (!domain) return SA_ERR_HPI_INVALID_PARAMS; __dec_domain_refcount(domain); /* Punch out */ /* * If domain was scheduled for destruction before, and * no other threads are referring to it, then delete domain. */ if (domain->refcount < 0) __delete_domain(domain); else g_static_rec_mutex_unlock(&domain->lock); return SA_OK; } #if 0 /** * oh_query_domains * * Fetches information on all present domains * * Returns: a GArray of oh_domain_result types. **/ GArray *oh_query_domains() { GArray *domain_results = g_array_new(FALSE, TRUE, sizeof(oh_domain_result)); domains_lock(); g_hash_table_foreach(oh_domains.table, __query_domains, domain_results); domains_unlock(); return domain_results; } #endif /** * oh_drt_entry_get * @did: a domain id * @entryid: id of drt entry * @nextentryid: id next to @entryid in the drt will be put here. * @drtentry: drt entry corresponding to @entryid will be placed here. * * Fetches a drt entry from the domain identified by @did * * Returns: SA_OK on success, otherwise an error. **/ SaErrorT oh_drt_entry_get(SaHpiDomainIdT did, SaHpiEntryIdT entryid, SaHpiEntryIdT *nextentryid, SaHpiDrtEntryT *drtentry) { struct oh_domain *domain = NULL; GSList *node = NULL; if (did < 0 || !nextentryid || !drtentry) { err("Error - Invalid parameters passed."); return SA_ERR_HPI_INVALID_PARAMS; } domain = oh_get_domain(did); if (domain == NULL) { err("no domain for id %d", did); return SA_ERR_HPI_INTERNAL_ERROR; } for (node = domain->drt.list; node; node = node->next) { SaHpiDrtEntryT *curdrt = (SaHpiDrtEntryT *)node->data; if (curdrt->EntryId == entryid || entryid == SAHPI_FIRST_ENTRY) { if (node->next == NULL) { /* last entry */ *nextentryid = SAHPI_LAST_ENTRY; } else { SaHpiDrtEntryT *nextdrt = (SaHpiDrtEntryT *)node->next->data; *nextentryid = nextdrt->EntryId; } memcpy(drtentry, curdrt, sizeof(SaHpiDrtEntryT)); oh_release_domain(domain); return SA_OK; } } oh_release_domain(domain); return SA_ERR_HPI_NOT_PRESENT; } openhpi-2.14.1/src/config.c0000644000076400007640000007121111302567034012374 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2003-2006 * Copyright (c) 2003 by Intel Corp. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Sean Dague * Louis Zhuang * David Judkovics * Thomas Kangieser * Renier Morales */ #include #include #include #include #include #include #include #include /* * Global Parameters */ static const char *known_globals[] = { "OPENHPI_ON_EP", "OPENHPI_LOG_ON_SEV", "OPENHPI_EVT_QUEUE_LIMIT", "OPENHPI_DEL_SIZE_LIMIT", "OPENHPI_DEL_SAVE", "OPENHPI_DAT_SIZE_LIMIT", "OPENHPI_DAT_USER_LIMIT", "OPENHPI_DAT_SAVE", "OPENHPI_PATH", "OPENHPI_VARPATH", "OPENHPI_CONF", "OPENHPICLIENT_CONF", NULL }; static struct { SaHpiEntityPathT on_ep; SaHpiSeverityT log_on_sev; SaHpiUint32T evt_queue_limit; SaHpiUint32T del_size_limit; SaHpiBoolT del_save; SaHpiUint32T dat_size_limit; SaHpiUint32T dat_user_limit; SaHpiBoolT dat_save; char path[OH_MAX_TEXT_BUFFER_LENGTH]; char varpath[OH_MAX_TEXT_BUFFER_LENGTH]; char conf[OH_MAX_TEXT_BUFFER_LENGTH]; char client_conf[OH_MAX_TEXT_BUFFER_LENGTH]; unsigned char read_env; GStaticRecMutex lock; } global_params = { /* Defaults for global params are set here */ .on_ep = { .Entry[0] = { .EntityType = SAHPI_ENT_ROOT, .EntityLocation = 0 } }, .log_on_sev = SAHPI_MINOR, .evt_queue_limit = 10000, .del_size_limit = 10000, /* 0 is unlimited size */ .del_save = SAHPI_FALSE, .dat_size_limit = 0, /* Unlimited size */ .dat_user_limit = 0, /* Unlimited size */ .dat_save = SAHPI_FALSE, .path = OH_PLUGIN_PATH, .varpath = VARPATH, .conf = OH_DEFAULT_CONF, .client_conf = OH_CLIENT_DEFAULT_CONF, .read_env = 0, .lock = G_STATIC_REC_MUTEX_INIT }; /* * List of handler configs (parameter tables). This list is * populated during config file parse, and used to build the handler_table */ static GSList *handler_configs = NULL; /******************************************************************************* * In order to use the glib lexical parser we need to define token * types which we want to switch on ******************************************************************************/ enum { HPI_CONF_TOKEN_HANDLER = G_TOKEN_LAST } hpiConfType; struct tokens { gchar *name; guint token; }; static struct tokens oh_conf_tokens[] = { { .name = "handler", .token = HPI_CONF_TOKEN_HANDLER } }; /******************************************************************************* * In order to initialize the lexical scanner, you need the following config. * This config was figured out by reading the glib sources, and lots of * trial and error (documentation for this isn't very good). * * G_TOKEN_STRING will be created when anything starts with a-zA-z_/. * due to cset_identifier_first and identifier2string values below. * Therefor, if you want 0 to be scanned as a string, you need to quote * it (e.g. "0") * *******************************************************************************/ static GScannerConfig oh_scanner_config = { ( " \t\n" ) /* cset_skip_characters */, ( G_CSET_a_2_z "_/." G_CSET_A_2_Z ) /* cset_identifier_first */, ( G_CSET_a_2_z "_-0123456789/." G_CSET_A_2_Z ) /* cset_identifier_nth */, ( "#\n" ) /* cpair_comment_single */, FALSE /* case_sensitive */, TRUE /* skip_comment_multi */, TRUE /* skip_comment_single */, TRUE /* scan_comment_multi */, TRUE /* scan_identifier */, TRUE /* scan_identifier_1char */, TRUE /* scan_identifier_NULL */, TRUE /* scan_symbols */, TRUE /* scan_binary */, TRUE /* scan_octal */, TRUE /* scan_float */, TRUE /* scan_hex */, TRUE /* scan_hex_dollar */, TRUE /* scan_string_sq */, TRUE /* scan_string_dq */, TRUE /* numbers_2_int */, FALSE /* int_2_float */, TRUE /* identifier_2_string */, TRUE /* char_2_token */, TRUE /* symbol_2_token */, FALSE /* scope_0_fallback */, }; static void process_global_param(const char *name, char *value) { if (!strcmp("OPENHPI_ON_EP", name)) { g_static_rec_mutex_lock(&global_params.lock); oh_encode_entitypath(value, &global_params.on_ep); g_static_rec_mutex_unlock(&global_params.lock); } else if (!strcmp("OPENHPI_LOG_ON_SEV", name)) { SaHpiTextBufferT buffer; strncpy((char *)buffer.Data, value, SAHPI_MAX_TEXT_BUFFER_LENGTH); g_static_rec_mutex_lock(&global_params.lock); oh_encode_severity(&buffer, &global_params.log_on_sev); g_static_rec_mutex_unlock(&global_params.lock); } else if (!strcmp("OPENHPI_EVT_QUEUE_LIMIT", name)) { global_params.evt_queue_limit = atoi(value); } else if (!strcmp("OPENHPI_DEL_SIZE_LIMIT", name)) { global_params.del_size_limit = atoi(value); } else if (!strcmp("OPENHPI_DEL_SAVE", name)) { if (!strcmp("YES", value)) { global_params.del_save = SAHPI_TRUE; } else { global_params.del_save = SAHPI_FALSE; } } else if (!strcmp("OPENHPI_DAT_SIZE_LIMIT", name)) { global_params.dat_size_limit = atoi(value); } else if (!strcmp("OPENHPI_DAT_USER_LIMIT", name)) { global_params.dat_user_limit = atoi(value); } else if (!strcmp("OPENHPI_DAT_SAVE", name)) { if (!strcmp("YES", value)) { global_params.dat_save = SAHPI_TRUE; } else { global_params.dat_save = SAHPI_FALSE; } } else if (!strcmp("OPENHPI_PATH", name)) { g_static_rec_mutex_lock(&global_params.lock); memset(global_params.path, 0, OH_MAX_TEXT_BUFFER_LENGTH); strncpy(global_params.path, value, OH_MAX_TEXT_BUFFER_LENGTH-1); g_static_rec_mutex_unlock(&global_params.lock); } else if (!strcmp("OPENHPI_VARPATH", name)) { g_static_rec_mutex_lock(&global_params.lock); memset(global_params.varpath, 0, OH_MAX_TEXT_BUFFER_LENGTH); strncpy(global_params.varpath, value, OH_MAX_TEXT_BUFFER_LENGTH-1); g_static_rec_mutex_unlock(&global_params.lock); } else if (!strcmp("OPENHPI_CONF", name)) { g_static_rec_mutex_lock(&global_params.lock); memset(global_params.conf, 0, OH_MAX_TEXT_BUFFER_LENGTH); strncpy(global_params.conf, value, OH_MAX_TEXT_BUFFER_LENGTH-1); g_static_rec_mutex_unlock(&global_params.lock); } else if (!strcmp("OPENHPICLIENT_CONF", name)) { g_static_rec_mutex_lock(&global_params.lock); memset(global_params.client_conf, 0, OH_MAX_TEXT_BUFFER_LENGTH); strncpy(global_params.client_conf, value, OH_MAX_TEXT_BUFFER_LENGTH-1); g_static_rec_mutex_unlock(&global_params.lock); } else { err("ERROR. Invalid global parameter %s in config file", name); } return; } static void read_globals_from_env(int force) { char *tmp_env_str = NULL; int i; if (!force && global_params.read_env) return; g_static_rec_mutex_lock(&global_params.lock); for (i = 0; known_globals[i]; i++) { if ((tmp_env_str = getenv(known_globals[i])) != NULL) { process_global_param(known_globals[i], tmp_env_str); tmp_env_str = NULL; } } global_params.read_env = 1; g_static_rec_mutex_unlock(&global_params.lock); } /** * process_handler_token * @oh_scanner * * handles parsing of handler tokens into a hash table. * * Return value: 0 on sucess, < 0 on fail **/ static int process_handler_token (GScanner* oh_scanner) { GHashTable *handler_stanza = NULL; char *tablekey, *tablevalue; int found_right_curly = 0; data_access_lock(); if (g_scanner_get_next_token(oh_scanner) != HPI_CONF_TOKEN_HANDLER) { err("Processing handler: Unexpected token."); data_access_unlock(); return -1; } /* Get the plugin type and store in Hash Table */ if (g_scanner_get_next_token(oh_scanner) != G_TOKEN_STRING) { err("Processing handler: Expected string token."); data_access_unlock(); return -1; } else { handler_stanza = g_hash_table_new_full(g_str_hash, g_str_equal, g_free, g_free); tablekey = g_strdup("plugin"); tablevalue = g_strdup(oh_scanner->value.v_string); g_hash_table_insert(handler_stanza, (gpointer) tablekey, (gpointer) tablevalue); oh_load_plugin(tablevalue); } /* Check for Left Brace token type. If we have it, then continue parsing. */ if (g_scanner_get_next_token(oh_scanner) != G_TOKEN_LEFT_CURLY) { err("Processing handler: Expected left curly token."); goto free_table; } while (!found_right_curly) { /* get key token in key\value pair set (e.g. key = value) */ if (g_scanner_get_next_token(oh_scanner) != G_TOKEN_STRING) { err("Processing handler: Expected string token."); goto free_table; } else { tablekey = g_strdup(oh_scanner->value.v_string); } /* Check for the equal sign next. If we have it, continue parsing */ if (g_scanner_get_next_token(oh_scanner) != G_TOKEN_EQUAL_SIGN) { err("Processing handler: Expected equal sign token."); goto free_table_and_key; } /* * Now check for the value token in the key\value set. * Store the key\value value pair in the hash table and continue on. */ if (g_scanner_peek_next_token(oh_scanner) != G_TOKEN_INT && g_scanner_peek_next_token(oh_scanner) != G_TOKEN_FLOAT && g_scanner_peek_next_token(oh_scanner) != G_TOKEN_STRING) { err("Processing handler: Expected string, integer, or float token."); goto free_table_and_key; } else { /* The type of token tells us how to fetch the value from oh_scanner */ gpointer value = NULL; int current_token = g_scanner_get_next_token(oh_scanner); if (current_token == G_TOKEN_INT) { gulong *value_int = (gulong *)g_malloc(sizeof(gulong)); *value_int = oh_scanner->value.v_int; value = (gpointer)value_int; } else if (current_token == G_TOKEN_FLOAT) { gdouble *value_float = (gdouble *)g_malloc(sizeof(gdouble)); *value_float = oh_scanner->value.v_float; value = (gpointer)value_float; } else { gchar *value_string = g_strdup(oh_scanner->value.v_string); value = (gpointer)value_string; } if (value == NULL) { err("Processing handler:" " Unable to allocate memory for value." " Token Type: %d", current_token); goto free_table_and_key; } g_hash_table_insert(handler_stanza, (gpointer) tablekey, value); } if (g_scanner_peek_next_token(oh_scanner) == G_TOKEN_RIGHT_CURLY) { g_scanner_get_next_token(oh_scanner); found_right_curly = 1; } } /* end of while(!found_right_curly) */ /* Attach table describing handler stanza to the global linked list of handlers */ if (handler_stanza != NULL) { handler_configs = g_slist_append( handler_configs, (gpointer) handler_stanza); } data_access_unlock(); return 0; free_table_and_key: g_free(tablekey); free_table: /** There was an error reading a token so we need to error out, but not before cleaning up. Destroy the table. */ g_hash_table_destroy(handler_stanza); data_access_unlock(); return -1; } static int process_global_token(GScanner *scanner) { char *name = NULL, *value = NULL; guint current_token; data_access_lock(); /* Get the global parameter name */ current_token = g_scanner_get_next_token(scanner); if (current_token != G_TOKEN_STRING) { err("Processing global: Expected string token. Got %d", current_token); goto quit; } name = g_strdup(scanner->value.v_string); if (!name) { err("Unable to allocate for global param name."); goto quit; } current_token = g_scanner_get_next_token(scanner); if (current_token != G_TOKEN_EQUAL_SIGN) { err("Did not get expected '=' token. Got %d", current_token); goto free_and_quit; } current_token = g_scanner_get_next_token(scanner); if (current_token != G_TOKEN_STRING && current_token != G_TOKEN_INT) { err("Did not get expected string value for global parameter." " Got %d", current_token); goto free_and_quit; } if (current_token == G_TOKEN_INT) { guint num_chars = 0, result; result = scanner->value.v_int; while (result) { result = result / 10; num_chars++; } value = (char *)g_malloc0(++num_chars); result = scanner->value.v_int; snprintf(value, num_chars, "%u", result); } else { value = g_strdup(scanner->value.v_string); } if (!value) { err("Unable to allocate for global param value."); goto free_and_quit; } process_global_param(name, value); g_free(name); g_free(value); data_access_unlock(); return 0; free_and_quit: g_free(name); quit: data_access_unlock(); return -1; } /** * scanner_msg_handler: a reference of this function is passed into the GScanner. * Used by the GScanner object to output messages that come up during parsing. * * @scanner: Object used to parse the config file. * @message: Message string. * @is_error: Bit to say the message is an error. * * Return value: None (void). **/ static void scanner_msg_handler (GScanner *scanner, gchar *message, gboolean is_error) { g_return_if_fail (scanner != NULL); err("%s:%d: %s%s\n", scanner->input_name ? scanner->input_name : "", scanner->line, is_error ? "error: " : "", message ); } /** * oh_load_config * @filename: OpenHPI configuration filename * @config: place where the parsed configuration will be placed. * * Parses an OpenHPI configuration file and gives the results * which can be processed by the caller. * * Return value: 0 on success, otherwise a failure. **/ int oh_load_config (char *filename, struct oh_parsed_config *config) { int oh_conf_file, i; GScanner *oh_scanner; int done = 0; int num_tokens = sizeof(oh_conf_tokens) / sizeof(oh_conf_tokens[0]); if (!filename || !config) { err("Error. Invalid parameters"); return -1; } handler_configs = NULL; oh_scanner = g_scanner_new(&oh_scanner_config); if (!oh_scanner) { err("Couldn't allocate g_scanner for file parsing"); return -2; } oh_scanner->msg_handler = scanner_msg_handler; oh_scanner->input_name = filename; oh_conf_file = open(filename, O_RDONLY); if (oh_conf_file < 0) { err("Configuration file '%s' could not be opened", filename); g_scanner_destroy(oh_scanner); return -4; } g_scanner_input_file(oh_scanner, oh_conf_file); for (i = 0; i < num_tokens; i++) { g_scanner_scope_add_symbol( oh_scanner, 0, oh_conf_tokens[i].name, (void *)((unsigned long)oh_conf_tokens[i].token)); } while (!done) { guint my_token; my_token = g_scanner_peek_next_token (oh_scanner); /*dbg("token: %d", my_token);*/ switch (my_token) { case G_TOKEN_EOF: done = 1; break; case HPI_CONF_TOKEN_HANDLER: process_handler_token(oh_scanner); break; case G_TOKEN_STRING: process_global_token(oh_scanner); break; default: /* need to advance it */ my_token = g_scanner_get_next_token(oh_scanner); g_scanner_unexp_token(oh_scanner, G_TOKEN_SYMBOL, NULL, "\"handle\" or \"domain\"", NULL, NULL, 1); break; } } read_globals_from_env(1); if (close(oh_conf_file) != 0) { err("Couldn't close file '%s'.", filename); g_scanner_destroy(oh_scanner); return -5; } done = oh_scanner->parse_errors; g_scanner_destroy(oh_scanner); dbg("Done processing conf file.\nNumber of parse errors:%d", done); config->handler_configs = handler_configs; handler_configs = NULL; return 0; } /** * oh_process_config * @config: pointer to parsed configuration for processing * * This will process a parsed configuration by loading * the specified plugins and corresponding handlers. * * Returns: SA_OK on success, otherwise the call failed. **/ SaErrorT oh_process_config(struct oh_parsed_config *config) { GSList *node = NULL; if (!config) return SA_ERR_HPI_INVALID_PARAMS; /* Initialize handlers */ for (node = config->handler_configs; node; node = node->next) { GHashTable *handler_config = (GHashTable *)node->data; unsigned int hid = 0; SaErrorT error = SA_OK; error = oh_create_handler(handler_config, &hid); if (error == SA_OK) { dbg("Loaded handler for plugin %s", (char *)g_hash_table_lookup(handler_config, "plugin")); config->handlers_loaded++; } else { err("Couldn't load handler for plugin %s", (char *)g_hash_table_lookup(handler_config, "plugin")); if (hid == 0) g_hash_table_destroy(handler_config); } config->handlers_defined++; } return SA_OK; } void oh_clean_config(struct oh_parsed_config *config) { /* Free list of handler configuration blocks */ g_slist_free(config->handler_configs); } /** * oh_get_global_param * @param * * Returns: 0 on Success. **/ int oh_get_global_param(struct oh_global_param *param) { if (!param || !(param->type)) { if (!param) { err("ERROR. Invalid parameters param NULL"); } if (!param->type) { err("ERROR. Invalid parameters param->type NULL"); } return -1; } read_globals_from_env(0); switch (param->type) { case OPENHPI_ON_EP: g_static_rec_mutex_lock(&global_params.lock); param->u.on_ep = global_params.on_ep; g_static_rec_mutex_unlock(&global_params.lock); break; case OPENHPI_LOG_ON_SEV: param->u.log_on_sev = global_params.log_on_sev; break; case OPENHPI_EVT_QUEUE_LIMIT: param->u.evt_queue_limit = global_params.evt_queue_limit; break; case OPENHPI_DEL_SIZE_LIMIT: param->u.del_size_limit = global_params.del_size_limit; break; case OPENHPI_DEL_SAVE: param->u.del_save = global_params.del_save; break; case OPENHPI_DAT_SIZE_LIMIT: param->u.dat_size_limit = global_params.dat_size_limit; break; case OPENHPI_DAT_USER_LIMIT: param->u.dat_user_limit = global_params.dat_user_limit; break; case OPENHPI_DAT_SAVE: param->u.dat_save = global_params.dat_save; break; case OPENHPI_PATH: g_static_rec_mutex_lock(&global_params.lock); strncpy(param->u.path, global_params.path, OH_MAX_TEXT_BUFFER_LENGTH); g_static_rec_mutex_unlock(&global_params.lock); break; case OPENHPI_VARPATH: g_static_rec_mutex_lock(&global_params.lock); strncpy(param->u.varpath, global_params.varpath, OH_MAX_TEXT_BUFFER_LENGTH); g_static_rec_mutex_unlock(&global_params.lock); break; case OPENHPI_CONF: g_static_rec_mutex_lock(&global_params.lock); strncpy(param->u.conf, global_params.conf, OH_MAX_TEXT_BUFFER_LENGTH); g_static_rec_mutex_unlock(&global_params.lock); break; case OPENHPICLIENT_CONF: g_static_rec_mutex_lock(&global_params.lock); strncpy(param->u.conf, global_params.client_conf, OH_MAX_TEXT_BUFFER_LENGTH); g_static_rec_mutex_unlock(&global_params.lock); break; default: err("ERROR. Invalid global parameter %d!", param->type); return -2; } return 0; } /** * oh_set_global_param * @param * * Returns: 0 on Success. **/ int oh_set_global_param(struct oh_global_param *param) { if (!param || !(param->type)) { err("ERROR. Invalid parameters"); return -1; } read_globals_from_env(0); switch (param->type) { case OPENHPI_ON_EP: g_static_rec_mutex_lock(&global_params.lock); global_params.on_ep = param->u.on_ep; g_static_rec_mutex_unlock(&global_params.lock); break; case OPENHPI_LOG_ON_SEV: global_params.log_on_sev = param->u.log_on_sev; break; case OPENHPI_EVT_QUEUE_LIMIT: global_params.evt_queue_limit = param->u.evt_queue_limit; break; case OPENHPI_DEL_SIZE_LIMIT: global_params.del_size_limit = param->u.del_size_limit; break; case OPENHPI_DEL_SAVE: global_params.del_save = param->u.del_save; break; case OPENHPI_DAT_SIZE_LIMIT: global_params.dat_size_limit = param->u.dat_size_limit; break; case OPENHPI_DAT_USER_LIMIT: global_params.dat_user_limit = param->u.dat_user_limit; break; case OPENHPI_DAT_SAVE: global_params.dat_save = param->u.dat_save; break; case OPENHPI_PATH: g_static_rec_mutex_lock(&global_params.lock); memset(global_params.path, 0, OH_MAX_TEXT_BUFFER_LENGTH); strncpy(global_params.path, param->u.path, OH_MAX_TEXT_BUFFER_LENGTH-1); g_static_rec_mutex_unlock(&global_params.lock); break; case OPENHPI_VARPATH: g_static_rec_mutex_lock(&global_params.lock); memset(global_params.varpath, 0, OH_MAX_TEXT_BUFFER_LENGTH); strncpy(global_params.varpath, param->u.varpath, OH_MAX_TEXT_BUFFER_LENGTH-1); g_static_rec_mutex_unlock(&global_params.lock); break; case OPENHPI_CONF: g_static_rec_mutex_lock(&global_params.lock); memset(global_params.conf, 0, OH_MAX_TEXT_BUFFER_LENGTH); strncpy(global_params.conf, param->u.conf, OH_MAX_TEXT_BUFFER_LENGTH-1); g_static_rec_mutex_unlock(&global_params.lock); break; case OPENHPICLIENT_CONF: g_static_rec_mutex_lock(&global_params.lock); memset(global_params.conf, 0, OH_MAX_TEXT_BUFFER_LENGTH); strncpy(global_params.client_conf, param->u.conf, OH_MAX_TEXT_BUFFER_LENGTH-1); g_static_rec_mutex_unlock(&global_params.lock); break; default: err("ERROR. Invalid global parameter %d!", param->type); return -2; } return 0; } openhpi-2.14.1/src/ohpi.c0000644000076400007640000002303211302567034012064 0ustar /* -*- linux-c -*- * * (C) Copright IBM Corp 2004,2006 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Renier Morales */ #include #include #include #include #include #include #include #include #include #include #include #include /** * oHpiVersionGet * * Returns the version of the library as a SaHpiUint64T type. * The version consists of 3 16-bit integers: MAJOR, MINOR, and PATCH. */ SaHpiUint64T oHpiVersionGet() { SaHpiUint64T v = 0; OHPI_VERSION_GET(v, VERSION); return v; } /* Handler operations */ /** * oHpiHandlerCreate * @config: IN. Hash table. Holds configuration information used by handler. * @id: IN/OUT. The id of the newly created handler is returned here. * * Creates a new handler (instance of a plugin). Plugin handlers are what * respond to most API calls. * @config needs to have an entry for "plugin" in order to know for which * plugin the handler is being created. * * Returns: SA_OK on success. SA_ERR_HPI_INTERNAL_ERROR if a handler is * created, but failed to open. oHpiHandlerRetry can be used to retry * opening the handler. **/ SaErrorT oHpiHandlerCreate(GHashTable *config, oHpiHandlerIdT *id) { SaErrorT error = SA_OK; if (!config || !id) { err("Invalid parameters."); return SA_ERR_HPI_INVALID_PARAMS; } if (oh_init()) return SA_ERR_HPI_ERROR; error = oh_create_handler(config, id); return error; } /** * oHpiHandlerDestroy * @id: IN. The id of the handler to destroy * * Destroys a handler. Calls the plugin's abi close function. * * Returns: SA_OK on success. Minus SA_OK on error. **/ SaErrorT oHpiHandlerDestroy(oHpiHandlerIdT id) { if (!id) return SA_ERR_HPI_INVALID_PARAMS; if (oh_init()) return SA_ERR_HPI_INTERNAL_ERROR; if (oh_destroy_handler(id)) return SA_ERR_HPI_ERROR; return SA_OK; } /** * oHpiHandlerInfo * @id: IN. The id of the handler to query * @info: IN/OUT. Pointer to struct for holding handler information * * Queries a handler for the information associated with it. * * Returns: SA_OK on success. Minus SA_OK on error. **/ SaErrorT oHpiHandlerInfo(oHpiHandlerIdT id, oHpiHandlerInfoT *info) { struct oh_handler *h = NULL; if (!id || !info) return SA_ERR_HPI_INVALID_PARAMS; if (oh_init()) return SA_ERR_HPI_INTERNAL_ERROR; h = oh_get_handler(id); if (!h) { err("Handler %d not found.", id); return SA_ERR_HPI_NOT_PRESENT; } info->id = id; strncpy(info->plugin_name, h->plugin_name, MAX_PLUGIN_NAME_LENGTH); oh_encode_entitypath((const char *)g_hash_table_lookup(h->config, "entity_root"), &info->entity_root); if (!h->hnd) info->load_failed = 1; else info->load_failed = 0; oh_release_handler(h); return SA_OK; } /** * oHpiHandlerGetNext * @id: IN. Id of handler to search for. * @next_id: IN/OUT. The id of the handler next to the handler being searched for * will be returned here. * * Used for iterating through all loaded handlers. If you pass * 0 (SAHPI_FIRST_ENTRY), you will get the id of the first handler returned * in next_id. * * Returns: SA_OK on success. Minus SA_OK on error. **/ SaErrorT oHpiHandlerGetNext(oHpiHandlerIdT id, oHpiHandlerIdT *next_id) { if (!next_id) { err("Invalid parameters."); return SA_ERR_HPI_INVALID_PARAMS; } if (oh_init()) return SA_ERR_HPI_INTERNAL_ERROR; if (oh_getnext_handler_id(id, next_id)) return SA_ERR_HPI_NOT_PRESENT; return SA_OK; } /** * oHpiHandlerFind * @sid: a valid session id * @rid: resource id * @id: pointer where handler id found will be placed. * * Inputs are the @sid and @rid. @rid corresponds to some resource available * in that session. The function then will return the handler that served such * resource. * * Returns: SA_OK if handler was found. **/ SaErrorT oHpiHandlerFind(SaHpiSessionIdT sid, SaHpiResourceIdT rid, oHpiHandlerIdT *id) { SaHpiDomainIdT did; struct oh_domain *d = NULL; unsigned int *hid = NULL; OH_CHECK_INIT_STATE(sid); OH_GET_DID(sid, did); if (sid == 0 || rid == 0 || !id) { return SA_ERR_HPI_INVALID_PARAMS; } if (oh_init()) return SA_ERR_HPI_INTERNAL_ERROR; OH_GET_DOMAIN(did, d); /* Lock domain */ hid = (unsigned int *)oh_get_resource_data(&d->rpt, rid); if (hid == NULL) { err("No such Resource Id %d in Domain %d", rid, did); oh_release_domain(d); /* Unlock domain */ return SA_ERR_HPI_INVALID_RESOURCE; } *id = *hid; oh_release_domain(d); /* Unlock domain */ return SA_OK; } /** * oHpiHandlerRetry * @id: handler id * * Returns: SA_OK if handler opens successfully. **/ SaErrorT oHpiHandlerRetry(oHpiHandlerIdT id) { struct oh_handler *h = NULL; SaErrorT error = SA_OK; if (id == 0) return SA_ERR_HPI_INVALID_PARAMS; if (oh_init()) return SA_ERR_HPI_INTERNAL_ERROR; h = oh_get_handler(id); if (!h) return SA_ERR_HPI_NOT_PRESENT; if (h->hnd != NULL) { oh_release_handler(h); return SA_OK; } h->hnd = h->abi->open(h->config, h->id, &oh_process_q); if (h->hnd == NULL) error = SA_ERR_HPI_INTERNAL_ERROR; else error = SA_OK; oh_release_handler(h); return error; } /* Global parameters */ /** * oHpiGlobalParamGet * @param: param->type needs to be set to know what parameter to fetch. * * Gets the value of the specified global parameter. * * Returns: SA_OK on success. Minus SA_OK on error. **/ SaErrorT oHpiGlobalParamGet(oHpiGlobalParamT *param) { struct oh_global_param p; if (!param || !param->Type) { err("Invalid parameters. oHpiGlobalParamGet()"); return SA_ERR_HPI_INVALID_PARAMS; } if (oh_init()) return SA_ERR_HPI_INTERNAL_ERROR; p.type = param->Type; if (oh_get_global_param(&p)) return SA_ERR_HPI_UNKNOWN; memcpy(¶m->u, &p.u, sizeof(oh_global_param_union)); return SA_OK; } /** * oHpiGlobalParamSet * @param: param->type needs to be set to know what parameter to set. * Also, the appropiate value in param->u needs to be filled in. * * Sets a global parameter. * * Returns: SA_OK on success. Minus SA_OK on error. **/ SaErrorT oHpiGlobalParamSet(oHpiGlobalParamT *param) { struct oh_global_param p; if (!param || !param->Type) { err("Invalid parameters. oHpiGlobalParamSet()"); return SA_ERR_HPI_INVALID_PARAMS; } if (oh_init()) return SA_ERR_HPI_INTERNAL_ERROR; p.type = param->Type; memcpy(&p.u, ¶m->u, sizeof(oh_global_param_union)); if (oh_set_global_param(&p)) return SA_ERR_HPI_ERROR; return SA_OK; } /** * oHpiInjectEvent * @id: id of handler into which the event will be injected. * @event: pointer to the event to be injected. * @rpte: pointer to the resource to be injected. * @rdrs: pointer to the list of RDRs to be injected along with @resoruce * * @id and @event are required parameters. @rpte is only required if the event * is of RESOURCE type or HOTSWAP type. @rdrs is an optional argument in all * cases and can be NULL. If @rdrs is passed, it will be copied. It is the * responsibility of the caller to clean up the RDRs list once it is used here. * * Returns: SA_OK on success. This call will set the event.Source, rpte.ResourceId, * rpte.ResourceEntity so that the caller knows what the final assigned values were. * For rpte.ResourceEntity, the entity_root configuration parameter for the plugin * is used to complete it. In addition, for each rdr in @rdrs, a Num, RecordId, * and Entity will be assigned. This will also be reflected in the passed @rdrs * list so that the caller can know what the assigned values were. **/ SaErrorT oHpiInjectEvent(oHpiHandlerIdT id, SaHpiEventT *event, SaHpiRptEntryT *rpte, SaHpiRdrT *rdr) { SaErrorT (*inject_event)(void *hnd, SaHpiEventT *evt, SaHpiRptEntryT *rpte, SaHpiRdrT *rdr); /* TODO: Allow for an array/list of RDRs */ struct oh_handler *h = NULL; SaErrorT error = SA_OK; if (!id) { err("Invalid handler id %d passed",id); return SA_ERR_HPI_INVALID_PARAMS; } else if (!event) { err("Invalid NULL event passed"); return SA_ERR_HPI_INVALID_PARAMS; } if (oh_init()) return SA_ERR_HPI_INTERNAL_ERROR; h = oh_get_handler(id); inject_event = h ? h->abi->inject_event : NULL; if (!inject_event) { oh_release_handler(h); return SA_ERR_HPI_INVALID_CMD; } error = inject_event(h->hnd, event, rpte, rdr); if (error) { err("Event injection into handler %d failed", id); } oh_release_handler(h); return error; } openhpi-2.14.1/hpi_shell/0000755000076400007640000000000011405006365012140 5ustar openhpi-2.14.1/hpi_shell/hpi_cmd.c0000644000076400007640000000573111302567132013715 0ustar /* -*- linux-c -*- * * Copyright (c) 2004 by Intel Corp. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Racing Guo * Changes: * 11.30.2004 - Kouzmich: porting to HPI-B * * */ #include #include #include #include #include "hpi_cmd.h" int debug_flag = 0; int main(int argc, char **argv) { int c, eflag = 0; while ( (c = getopt( argc, argv,"c:ef:xn:?")) != EOF ) switch(c) { case 'c': setenv("OPENHPI_CONF", optarg, 1); break; case 'e': eflag = 1; break; case 'f': open_file(optarg); break; case 'x': debug_flag = 1; break; case 'n': setenv("OPENHPI_DAEMON_HOST", optarg, 1); break; default: printf("Usage: %s [-c ][-e][-f ][-n ]\n", argv[0]); printf(" -c - use passed file as configuration file\n"); printf(" -e - show short events, discover after subscribe\n"); printf(" -f - execute command file\n"); printf(" -n use passed hostname as OpenHPI daemon host\n"); return(1); } domainlist = (GSList *)NULL; if (open_session(eflag) == -1) return(1); cmd_shell(); close_session(); return 0; } ret_code_t ask_rpt(SaHpiResourceIdT *ret) { term_def_t *term; int i, res; term = get_next_term(); if (term == NULL) { if (read_file) return(HPI_SHELL_PARM_ERROR); i = show_rpt_list(Domain, SHOW_ALL_RPT, 0, SHORT_LSRES, ui_print); if (i == 0) { printf("NO rpts!\n"); return(HPI_SHELL_CMD_ERROR); }; i = get_int_param("RPT ID ==> ", &res); if (i == 1) *ret = (SaHpiResourceIdT)res; else return(HPI_SHELL_PARM_ERROR); } else { *ret = (SaHpiResourceIdT)atoi(term->term); }; return(HPI_SHELL_OK); } ret_code_t ask_rdr(SaHpiResourceIdT rptid, SaHpiRdrTypeT type, SaHpiInstrumentIdT *ret) { term_def_t *term; int i, res; char buf[64]; strncpy(buf, oh_lookup_rdrtype(type), 64); buf[strlen(buf)-4] = '\0'; strncat(buf, " NUM ==> ", 64-strlen(buf)); term = get_next_term(); if (term == NULL) { if (read_file) return(HPI_SHELL_CMD_ERROR); i = show_rdr_list(Domain, rptid, type, ui_print); if (i == 0) { printf("No rdrs for rpt: %d\n", rptid); return(HPI_SHELL_CMD_ERROR); }; i = get_int_param(buf, &res); if (i != 1) return(HPI_SHELL_PARM_ERROR); *ret = (SaHpiInstrumentIdT)res; } else { *ret = (SaHpiInstrumentIdT)atoi(term->term); }; return(HPI_SHELL_OK); } ret_code_t open_file(char *path) { if (add_input_file(path) != 0) { printf("Can not run file: %s\n", path); return(HPI_SHELL_PARM_ERROR); }; read_file = 1; read_stdin = 0; return(HPI_SHELL_OK); } openhpi-2.14.1/hpi_shell/Makefile.am0000644000076400007640000000127211302567132014176 0ustar .NOTPARALLEL: MAINTAINERCLEANFILES = Makefile.in MOSTLYCLEANFILES = @TEST_CLEAN@ EXTRA_DIST = hpi_ui.h INCLUDES = -I$(top_srcdir)/include -I$(top_srcdir)/utils INCLUDES += -I$(top_srcdir)/openhpid \ -I$(top_srcdir)/marshal \ -DCLIENT COMMONLIBS = $(top_builddir)/marshal/libohtcpconnx.la \ $(top_builddir)/utils/libopenhpiutils.la \ $(top_builddir)/openhpid/libopenhpi.la bin_PROGRAMS = hpi_shell HS_SOURCES = \ hpi_cmd.h \ hpi_cmd.c \ cmdparser.c \ commands.c \ ctrl_inv.c \ inputcmd.c \ sensor.c \ session.c \ show.c \ service.c \ dimi.c \ fumi.c hpi_shell_SOURCES = $(HS_SOURCES) hpi_shell_LDADD = $(COMMONLIBS) clean-local: rm -f *~ *.o openhpi-2.14.1/hpi_shell/inputcmd.c0000644000076400007640000003332211302567132014132 0ustar /* -*- linux-c -*- * * Copyright (c) 2005 by Intel Corp. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * Kouzmich < Mikhail.V.Kouzmich@intel.com > * * */ #include #include #include #include #include #include #include #include "hpi_cmd.h" #define CTRL_A_KEY 0x01 #define CTRL_B_KEY 0x02 #define CTRL_D_KEY 0x04 #define CTRL_E_KEY 0x05 #define CTRL_F_KEY 0x06 #define CTRL_G_KEY 0x07 #define BELL_KEY 0x07 #define CTRL_H_KEY 0x08 #define TAB_KEY 0x09 #define NL_KEY 0x0A #define CTRL_K_KEY 0x0B #define CTRL_L_KEY 0x0C #define CTRL_N_KEY 0x0E #define CTRL_R_KEY 0x12 #define CTRL_S_KEY 0x13 #define CTRL1_KEY 0x1B #define CTRL2_KEY 0x5B #define BACKSP_KEY 0x7F #define INSERT_KEY 0x32 #define DELETE_KEY 0x33 #define PGUP_KEY 0x35 #define PGDOWN_KEY 0x36 #define UP_KEY 0x41 #define DOWN_KEY 0x42 #define RIGHT_KEY 0x43 #define LEFT_KEY 0x44 #define END_KEY 0x46 #define HOME_KEY 0x48 #define HISTORY_DELTA 5 typedef struct { int n_items; int comp_len; char **items; } compl_t; compl_t complition_struct; int termfd = -1; static char clear_buf[READ_BUF_SIZE]; static int no_stty = 1; static struct termios saved_termio; static int is_insert_key = 0; static char **History; static int hist_ind = 0; static int hist_size = 0; static int current_hist_ind = -1; void init_history(void) { History = (char **)malloc(sizeof(char *) * HISTORY_DELTA); hist_size = HISTORY_DELTA; memset(History, 0, sizeof(char *) * HISTORY_DELTA); current_hist_ind = -1; hist_ind = 0; complition_struct.n_items = 0; } static void get_history_new(int new_cmd) { char **tmp; if (current_hist_ind < 0) new_cmd = 1; if ((current_hist_ind >= 0) && (*(History[current_hist_ind]) == 0)) { hist_ind = current_hist_ind; return; }; if (new_cmd) current_hist_ind++; else return; if (current_hist_ind >= hist_size) { hist_size += HISTORY_DELTA; tmp = (char **)malloc(sizeof(char *) * hist_size); memset(tmp, 0, sizeof(char *) * hist_size); if (current_hist_ind > 1) { memcpy(tmp, History, sizeof(char *) * current_hist_ind); free(History); }; History = tmp; }; hist_ind = current_hist_ind; History[current_hist_ind] = (char *)malloc(1); *(History[current_hist_ind]) = 0; } static void add_to_history(char *line, int index) { if (line == (char *)NULL) return; if (strlen(line) == 0) return; if (index > current_hist_ind) return; if(strcmp(line, History[index]) == 0) return; free(History[index]); History[index] = strdup(line); } static char *get_history_next(char *str) { add_to_history(str, hist_ind); if (current_hist_ind > hist_ind) hist_ind++; else printf("%c", BELL_KEY); return(History[hist_ind]); } static char *get_history_prev(char *str) { add_to_history(str, hist_ind); hist_ind--; if (hist_ind < 0) { hist_ind = 0; printf("%c", BELL_KEY); }; return(History[hist_ind]); } static void go_to_begin(int index) { while (index-- > 0) printf("%c", '\b'); } static int print_str_by_index(char *buf, int index, int cursor_pos) // index - current cursor position // cursor_pos - new cursor position, // if cursor_pos == -1 set to the end of the buf // return value: new cursor position { int n; n = strlen(buf) - index; if (n > 0) printf("%s", buf + index); if ((cursor_pos == -1) || (cursor_pos > strlen(buf))) cursor_pos = strlen(buf); n = strlen(buf) - cursor_pos; go_to_begin(n); return(cursor_pos); } static int clear_line(int index, int length) { go_to_begin(index); memset(clear_buf, ' ', length); clear_buf[length] = 0; return(print_str_by_index(clear_buf, 0, 0)); } static int add_char(char *buf, int length, int c, int index) // return value : new corsor position { int i; if (index >= length) { buf[length++] = c; return(length); }; if ( ! is_insert_key) for (i = length; i > index; i--) buf[i] = buf[i - 1]; buf[index] = c; i = (is_insert_key) ? length - 1 : length; print_str_by_index(buf, index, index + 1); return(index + 1); } static int delete_char(char *buf, int length, int index, int as) // as = 0 - backspace key, 1 - delete key // return value : new corsor position { int n, ind; if (index < 0) return(0); if ((index == length) && as) return(length); ind = (as) ? index : index - 1; memcpy(buf + ind, buf + ind + 1, length - ind - 1); buf[length - 1] = ' '; if (as == 0) printf("%c", '\b'); n = print_str_by_index(buf, ind, ind); buf[length - 1] = 0; return(n); } static int find_cmd_by_text(char *text, int current_index, int forward) { int i, len, is_cmp = 0; len = strlen(text); if (len == 0) return(-1); for (i = current_index; (i >= 0) && (i <= current_hist_ind);) { if (strncmp(History[i], text, len) == 0) { is_cmp = 1; break; }; if (forward) i++; else i--; }; if (is_cmp) return(i); return(-1); } static int find_command(char *line, int curr_index, int forward) { int res, cmd_ind, len, ind, c, line_size; char str[READ_BUF_SIZE]; char text[READ_BUF_SIZE]; len = strlen(line) + strlen(Title); clear_line(len, len); if (forward) { if (curr_index == current_hist_ind) { printf("%c", BELL_KEY); return(curr_index); } } else { if (curr_index <= 0) { printf("%c", BELL_KEY); return(0); } }; memset(text, 0, READ_BUF_SIZE); len = 0; ind = 0; cmd_ind = curr_index; for (;;) { line_size = ind + strlen(History[cmd_ind]); if (forward) res = find_cmd_by_text(text, cmd_ind, 1); else res = find_cmd_by_text(text, cmd_ind, 0); if (res != -1) cmd_ind = res; else printf("%c", BELL_KEY); if (forward) snprintf(str, READ_BUF_SIZE, "(i-search)`%s': ", text); else snprintf(str, READ_BUF_SIZE, "(revers-i-search)`%s': ", text); clear_line(ind, line_size); ind = print_str_by_index(str, 0, -1); print_str_by_index(History[cmd_ind], 0, 0); c = getchar(); if (c == BACKSP_KEY) { len--; if (len < 0) len = 0; text[len] = 0; } else if ((c < ' ') || (c > 'z')) { ungetc(c, stdin); break; }; text[len++] = c; if (len >= READ_BUF_SIZE) break; }; res = ind + strlen(History[cmd_ind]); clear_line(ind, res); return(cmd_ind); } static void check_compl(compl_t *compl_def) { int i, j, len; char *str; if (compl_def->n_items == 0) { compl_def->comp_len = 0; return; }; if (compl_def->n_items == 1) { compl_def->comp_len = strlen(compl_def->items[0]); return; }; str = compl_def->items[0]; len = strlen(str); for (i = 1; i < compl_def->n_items; i++) { for (j = len; j > 0; j--) { if (strncmp(str, compl_def->items[i], j) == 0) break; }; if (j == 0) { compl_def->comp_len = 0; return; }; len = j; }; compl_def->comp_len = len; } static void add_to_compl(char *text, compl_t *compl_def) { char **tmp; int n; n = compl_def->n_items + 1; tmp = (char **)malloc(sizeof(char *) * n); if (compl_def->n_items > 0) { memcpy(tmp, compl_def->items, sizeof(char *) * compl_def->n_items); free(compl_def->items); }; compl_def->items = tmp; tmp[compl_def->n_items] = strdup(text); compl_def->n_items = n; } static int completion_func(int compl_type, char *text, compl_t *compl_def) { int i, len; command_def_t *cmd = NULL; if (compl_def == (compl_t *)NULL) return(0); if (compl_def->n_items > 0) { for (i = 0; i < compl_def->n_items; i++) free(compl_def->items[i]); free(compl_def->items); compl_def->n_items = 0; }; compl_def->comp_len = 0; len = strlen(text); switch (compl_type) { case COMPL_CMD: for (cmd = commands; cmd->cmd != NULL; cmd++) { if ((cmd->type != MAIN_COM) && (cmd->type != block_type) && (cmd->type != UNDEF_COM)) continue; if (strncmp(text, cmd->cmd, len) == 0) add_to_compl(cmd->cmd, compl_def); }; break; case COMPL_NULL: return(0); }; check_compl(compl_def); return(compl_def->n_items); } static int set_term_flags(void) { int res, c; char name[1024]; struct termios termio; if (no_stty == 0) return(0); ctermid(name); termfd = open(name, O_RDWR); if (termfd < 0) { printf("Can not open terminal\n"); return(1); }; c = tcgetattr(termfd, &saved_termio); if (c != 0) { printf("Can not read terminal attrs\n"); return(1); }; termio = saved_termio; c = ICANON | ECHO | ECHOCTL; c = ~c; termio.c_lflag &= c; termio.c_cc[VMIN] = 1; termio.c_cc[VTIME] = 0; res = tcsetattr(termfd, TCSANOW, &termio); no_stty = 0; return(0); } void restore_term_flags(void) { if (no_stty) return; tcsetattr(termfd, TCSANOW, &saved_termio); no_stty = 1; } char *get_command_line(int new_cmd, int comp_type) { int c, ind = 0, len = 0, res; char input_buf[READ_BUF_SIZE]; char *str; if (set_term_flags() != 0) exit(1); get_history_new(new_cmd); memset(input_buf, 0, READ_BUF_SIZE); for (;;) { c = getchar(); len = strlen(input_buf); if (len >= (READ_BUF_SIZE - 1)) c = NL_KEY; switch (c) { case CTRL_A_KEY: go_to_begin(ind); ind = print_str_by_index(input_buf, 0, 0); break; case CTRL_B_KEY: printf("%c", '\b'); ind--; if (ind < 0) { ind = 0; printf("%c", ' '); }; break; case CTRL_D_KEY: if (ind == len) break; ind = delete_char(input_buf, len, ind, 1); break; case CTRL_E_KEY: ind = print_str_by_index(input_buf, ind, len); break; case CTRL_G_KEY: case CTRL_L_KEY: printf("%c", c); break; case CTRL_F_KEY: ind = print_str_by_index(input_buf, ind, ind + 1); break; case TAB_KEY: res = completion_func(comp_type, input_buf, &complition_struct); if (res == 0) break; if (res == 1) { strcpy(input_buf, complition_struct.items[0]); strcat(input_buf, " "); ind = print_str_by_index(input_buf, ind, -1); break; }; memset(input_buf, 0, READ_BUF_SIZE); strncpy(input_buf, complition_struct.items[0], complition_struct.comp_len); ind = print_str_by_index(input_buf, ind, -1); break; case NL_KEY: printf("%c", c); if (current_hist_ind != hist_ind) add_to_history(input_buf, hist_ind); if (strlen(input_buf) == 0) return(""); add_to_history(input_buf, current_hist_ind); return(History[current_hist_ind]); case CTRL_K_KEY: clear_line(ind, len); memset(input_buf + ind, 0, len - ind); print_str_by_index(input_buf, 0, ind); break; case CTRL_N_KEY: ungetc(DOWN_KEY, stdin); ungetc(CTRL2_KEY, stdin); ungetc(CTRL1_KEY, stdin); break; case CTRL_R_KEY: case CTRL_S_KEY: res = find_command(input_buf, hist_ind, (c == CTRL_S_KEY)); if (res != hist_ind) { hist_ind = res; memset(input_buf, 0, READ_BUF_SIZE); strcpy(input_buf, History[hist_ind]); }; print_str_by_index(Title, 0, -1); ind = print_str_by_index(input_buf, 0, -1); break; case CTRL1_KEY: c = getchar(); if (c != CTRL2_KEY) break; c = getchar(); switch (c) { case INSERT_KEY: getchar(); is_insert_key = (is_insert_key) ? 0 : 1; break; case DELETE_KEY: getchar(); if (ind == len) break; ind = delete_char(input_buf, len, ind, 1); break; case LEFT_KEY: printf("%c", '\b'); ind--; if (ind < 0) { ind = 0; printf("%c", ' '); }; break; case RIGHT_KEY: ind++; if (ind > len) ind = len; else print_str_by_index(input_buf, ind - 1, ind); break; case UP_KEY: case DOWN_KEY: clear_line(ind, len); if (c == UP_KEY) str = get_history_prev(input_buf); else str = get_history_next(input_buf); memset(input_buf, 0, READ_BUF_SIZE); strcpy(input_buf, str); len = strlen(input_buf); ind = print_str_by_index(input_buf, 0, len); break; case PGUP_KEY: case PGDOWN_KEY: getchar(); add_to_history(input_buf, hist_ind); clear_line(ind, len); hist_ind = (c == PGUP_KEY) ? 0 : current_hist_ind; str = History[hist_ind]; memset(input_buf, 0, READ_BUF_SIZE); strcpy(input_buf, str); len = strlen(input_buf); ind = print_str_by_index(input_buf, 0, len); break; case HOME_KEY: go_to_begin(ind); ind = print_str_by_index(input_buf, 0, 0); break; case END_KEY: ind = print_str_by_index(input_buf, ind, len); break; }; break; case CTRL_H_KEY: case BACKSP_KEY: ind = (ind <= 0) ? 0 : delete_char(input_buf, len, ind, 0); break; default: if (ind == len) { input_buf[ind++] = c; printf("%c", c); break; }; ind = add_char(input_buf, len, c, ind); break; }; if (ind >= (READ_BUF_SIZE - 1)) { if (current_hist_ind != hist_ind) add_to_history(input_buf, hist_ind); add_to_history(input_buf, current_hist_ind); return(History[current_hist_ind]); } }; return((char *)NULL); } void set_current_history(char *line) { if (line == (char *)NULL) return; if (strlen(line) == 0) return; if (strcmp(History[current_hist_ind], line) == 0) return; free(History[current_hist_ind]); History[current_hist_ind] = strdup(line); } char *get_last_history(void) { if (current_hist_ind > 0) return(History[current_hist_ind - 1]); return((char *)NULL); } char *get_def_history(char *text, int *count) { int ind, i, res; char *tmp, c; tmp = text; i = *count; while((*tmp != ' ') && (*tmp != 0)) { tmp++; i++; }; c = *tmp; *tmp = 0; if (isdigit(*text)) { ind = atoi(text); *tmp = c; if ((ind < 0) || (ind > current_hist_ind)) return((char *)NULL); *count = i; return(History[ind]); }; res = find_cmd_by_text(text, current_hist_ind - 1, 0); *tmp = c; if (res == -1) return((char *)NULL); *count = i; return(History[res]); } ret_code_t history_cmd(void) { int i; for (i = 0; i <= current_hist_ind; i++) { printf("[ %d ] %s\n", i, History[i]); }; return(HPI_SHELL_OK); } openhpi-2.14.1/hpi_shell/hpi_cmd.h0000644000076400007640000001316611302567132013723 0ustar /* -*- linux-c -*- * * Copyright (c) 2004 by Intel Corp. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Changes: * 11.30.2004 - Kouzmich: porting to HPI-B * * */ #ifndef _INC_HPI_CMD_H #define _INC_HPI_CMD_H #include #include #include #define KUZ_DEBUG0 #define READ_BUF_SIZE 1024 #define LINE_BUF_SIZE 4096 #define COMPL_NULL 0 #define COMPL_CMD 1 typedef enum { HPI_SHELL_OK = 0, HPI_SHELL_CMD_ERROR = -1, HPI_SHELL_PARM_ERROR = -2, HPI_SHELL_SYNTAX_ERROR = -3 } ret_code_t; typedef enum { UNDEF_COM, MAIN_COM, SEN_COM, ANN_COM, CTRL_COM, INV_COM, HS_COM, DIMI_COM, FUMI_COM, } com_enum_t; typedef struct { char *cmd; ret_code_t (*fun)(void); const char *help; com_enum_t type; } command_def_t; typedef enum { CMD_TERM, ITEM_TERM, CMD_END_TERM, CMD_REDIR_TERM, CMD_ERROR_TERM, EMPTY_TERM } term_t; typedef struct { term_t term_type; char *term; } term_def_t; extern command_def_t commands[]; extern int prt_flag; extern int show_event_short; extern Domain_t *Domain; extern GSList *domainlist; extern term_def_t *terms; extern int read_stdin; extern int read_file; extern FILE *input_file; extern com_enum_t block_type; extern ret_code_t shell_error; extern int debug_flag; extern char Title[]; extern int termfd; extern int is_more; extern int add_domain(Domain_t *domain); extern int add_input_file(char *name); extern ret_code_t ann_block(void); extern ret_code_t ann_block_acknow(void); extern ret_code_t ann_block_add(void); extern ret_code_t ann_block_delete(void); extern ret_code_t ann_block_list(void); extern ret_code_t ann_block_modeget(void); extern ret_code_t ann_block_modeset(void); extern ret_code_t ann_block_show(void); extern ret_code_t ask_rdr(SaHpiResourceIdT rptid, SaHpiRdrTypeT type, SaHpiInstrumentIdT *ret); extern ret_code_t ask_rpt(SaHpiResourceIdT *ret); extern int close_session(void); extern ret_code_t cmd_parser(char *mes, int as, int new_cmd, int *redirect); extern void cmd_shell(void); extern ret_code_t ctrl_block(void); extern ret_code_t ctrl_block_setst(void); extern ret_code_t ctrl_block_show(void); extern ret_code_t ctrl_block_state(void); extern void delete_progress(void); extern int do_discover(Domain_t *domain); extern void do_progress(char *mes); extern ret_code_t domain_proc(void); extern char *get_command_line(int new_cmd, int type); extern char *get_def_history(char *text, int *count); extern int get_hex_int_param(char *mes, int *val); extern int get_hex_string_param(char *mes, char *val, int max_length); extern int get_int_param(char *mes, int *val); extern char *get_last_history(void); extern int get_new_command(char *mes); extern int get_string_param(char *mes, char *string, int len); extern term_def_t *get_next_term(void); extern int get_sessionId(Domain_t *domain); extern void help(int as); extern ret_code_t history_cmd(void); extern ret_code_t hs_block(void); extern ret_code_t hs_block_action(void); extern ret_code_t hs_block_active(void); extern ret_code_t hs_block_gtime(void); extern ret_code_t hs_block_inact(void); extern ret_code_t hs_block_ind(void); extern ret_code_t hs_block_policy(void); extern ret_code_t hs_block_state(void); extern ret_code_t hs_block_stime(void); extern void init_history(void); extern ret_code_t inv_block(void); extern ret_code_t inv_block_show(void); extern ret_code_t inv_block_addarea(void); extern ret_code_t inv_block_addfield(void); extern ret_code_t inv_block_delarea(void); extern ret_code_t inv_block_delfield(void); extern ret_code_t inv_block_setfield(void); extern ret_code_t list_sensor(void); extern ret_code_t open_file(char *path); extern int open_session(int eflag); extern void restore_term_flags(void); extern int run_command(void); extern ret_code_t sen_block(void); extern ret_code_t sen_block_disable(void); extern ret_code_t sen_block_enable(void); extern ret_code_t sen_block_evtdis(void); extern ret_code_t sen_block_evtenb(void); extern ret_code_t sen_block_maskadd(void); extern ret_code_t sen_block_maskrm(void); extern ret_code_t sen_block_setthres(void); extern ret_code_t sen_block_show(void); extern void set_current_history(char *line); extern void set_Subscribe(Domain_t *domain, int as); extern int set_text_buffer(SaHpiTextBufferT *buf); extern ret_code_t show_inv(void); extern ret_code_t dimi_block(void); extern ret_code_t dimi_block_info(void); extern ret_code_t dimi_block_testinfo(void); extern ret_code_t dimi_block_ready(void); extern ret_code_t dimi_block_start(void); extern ret_code_t dimi_block_cancel(void); extern ret_code_t dimi_block_status(void); extern ret_code_t dimi_block_results(void); extern ret_code_t fumi_block(void); extern ret_code_t fumi_block_setsource(void); extern ret_code_t fumi_block_validatesource(void); extern ret_code_t fumi_block_getsource(void); extern ret_code_t fumi_block_targetinfo(void); extern ret_code_t fumi_block_backup(void); extern ret_code_t fumi_block_setbootorder(void); extern ret_code_t fumi_block_bankcopy(void); extern ret_code_t fumi_block_install(void); extern ret_code_t fumi_block_status(void); extern ret_code_t fumi_block_verifytarget(void); extern ret_code_t fumi_block_cancel(void); extern ret_code_t fumi_block_rollback(void); extern ret_code_t fumi_block_activate(void); extern int ui_print(char *Str); extern ret_code_t unget_term(void); #endif openhpi-2.14.1/hpi_shell/ctrl_inv.c0000644000076400007640000007037511302567132014140 0ustar /* -*- linux-c -*- * * Copyright (c) 2004 by Intel Corp. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * Kouzmich < Mikhail.V.Kouzmich@intel.com > * * */ #include #include #include #include #include #include #include "hpi_cmd.h" typedef struct { SaHpiResourceIdT rptid; SaHpiInstrumentIdT rdrnum; } inv_block_env_t; static inv_block_env_t inv_block_env; typedef struct { SaHpiResourceIdT rptid; SaHpiInstrumentIdT rdrnum; } ctrl_block_env_t; static ctrl_block_env_t ctrl_block_env; typedef struct { SaHpiResourceIdT rptid; SaHpiInstrumentIdT rdrnum; SaHpiRdrT rdr_entry; } ann_block_env_t; static ann_block_env_t ann_block_env; typedef struct { char *name; SaHpiIdrAreaTypeT val; } Area_type_t; static Area_type_t Area_types[] = { { "inter", SAHPI_IDR_AREATYPE_INTERNAL_USE }, { "chass", SAHPI_IDR_AREATYPE_CHASSIS_INFO }, { "board", SAHPI_IDR_AREATYPE_BOARD_INFO }, { "prod", SAHPI_IDR_AREATYPE_PRODUCT_INFO }, { "oem", SAHPI_IDR_AREATYPE_OEM }, { NULL, SAHPI_IDR_AREATYPE_UNSPECIFIED } }; typedef struct { char *name; SaHpiIdrFieldTypeT val; } Field_type_t; static Field_type_t Field_types[] = { { "chass", SAHPI_IDR_FIELDTYPE_CHASSIS_TYPE }, { "time", SAHPI_IDR_FIELDTYPE_MFG_DATETIME }, { "manuf", SAHPI_IDR_FIELDTYPE_MANUFACTURER }, { "prodname", SAHPI_IDR_FIELDTYPE_PRODUCT_NAME }, { "prodver", SAHPI_IDR_FIELDTYPE_PRODUCT_VERSION }, { "snum", SAHPI_IDR_FIELDTYPE_SERIAL_NUMBER }, { "pnum", SAHPI_IDR_FIELDTYPE_PART_NUMBER }, { "file", SAHPI_IDR_FIELDTYPE_FILE_ID }, { "tag", SAHPI_IDR_FIELDTYPE_ASSET_TAG }, { "custom", SAHPI_IDR_FIELDTYPE_CUSTOM }, { NULL, SAHPI_IDR_FIELDTYPE_UNSPECIFIED } }; static ret_code_t add_inventory_area(SaHpiSessionIdT sessionId, SaHpiResourceIdT rptid, SaHpiIdrIdT rdrnum) { SaHpiEntryIdT entry; SaErrorT rv; char buf[10]; int i; i = get_string_param("Area type (inter,chass,board,prod,oem): ", buf, 9); if (i != 0) return(HPI_SHELL_PARM_ERROR); for (i = 0; Area_types[i].name != (char *)NULL; i++) if (strcmp(Area_types[i].name, buf) == 0) break; if (Area_types[i].name == (char *)NULL) { printf("Error!!! Unknown Area type: %s\n", buf); return(HPI_SHELL_PARM_ERROR); }; rv = saHpiIdrAreaAdd(sessionId, rptid, rdrnum, Area_types[i].val, &entry); if (rv != SA_OK) { printf("ERROR!!! saHpiIdrAreaAdd: %s\n", oh_lookup_error(rv)); return(HPI_SHELL_CMD_ERROR); }; return(HPI_SHELL_OK); } static ret_code_t add_inventory_field(SaHpiSessionIdT sessionId, SaHpiResourceIdT rptid, SaHpiIdrIdT rdrnum) { SaErrorT rv; SaHpiIdrFieldT field; char buf[256]; int res, i; i = get_int_param("Area Id: ", &res); if (i != 1) { printf("Error!!! Invalid Area Id\n"); return(HPI_SHELL_PARM_ERROR); }; field.AreaId = res; i = get_string_param("Field type(chass,time,manuf,prodname,prodver," "snum,pnum,file,tag,custom): ", buf, 9); if (i != 0) { printf("Error!!! Invalid Field type: %s\n", buf); return(HPI_SHELL_PARM_ERROR); }; for (i = 0; Field_types[i].name != (char *)NULL; i++) if (strcmp(Field_types[i].name, buf) == 0) break; if (Field_types[i].name == (char *)NULL) { printf("Error!!! Unknown Field type: %s\n", buf); return(HPI_SHELL_PARM_ERROR); }; field.Type = Field_types[i].val; field.ReadOnly = SAHPI_FALSE; i = set_text_buffer(&(field.Field)); if (i != 0) { printf("Invalid text\n"); return(HPI_SHELL_PARM_ERROR); }; rv = saHpiIdrFieldAdd(sessionId, rptid, rdrnum, &field); if (rv != SA_OK) { printf("ERROR!!! saHpiIdrFieldAdd: %s\n", oh_lookup_error(rv)); return(HPI_SHELL_CMD_ERROR); }; return(HPI_SHELL_OK); } static ret_code_t set_inventory_field(SaHpiSessionIdT sessionId, SaHpiResourceIdT rptid, SaHpiIdrIdT rdrnum) { SaErrorT rv; SaHpiIdrFieldT field, read_field; SaHpiEntryIdT next; int res, i; memset(&field, 0, sizeof(SaHpiIdrFieldT)); i = get_int_param("Area Id: ", &res); if (i != 1) { printf("Error!!! Invalid Area Id\n"); return(HPI_SHELL_PARM_ERROR); }; field.AreaId = res; i = get_int_param("Field Id: ", &res); if (i != 1) { printf("Error!!! Invalid Field Id\n"); return(HPI_SHELL_PARM_ERROR); }; field.FieldId = res; rv = saHpiIdrFieldGet(sessionId, rptid, rdrnum, field.AreaId, SAHPI_IDR_FIELDTYPE_UNSPECIFIED, field.FieldId, &next, &read_field); if (rv != SA_OK) { printf("ERROR!!! saHpiIdrFieldGet: %s\n", oh_lookup_error(rv)); return(HPI_SHELL_CMD_ERROR); }; field.Type = read_field.Type; i = set_text_buffer(&(field.Field)); if (i != 0) { printf("Invalid text\n"); return(HPI_SHELL_PARM_ERROR); }; rv = saHpiIdrFieldSet(sessionId, rptid, rdrnum, &field); if (rv != SA_OK) { printf("ERROR!!! saHpiIdrFieldSet: %s\n", oh_lookup_error(rv)); return(HPI_SHELL_CMD_ERROR); }; return(HPI_SHELL_OK); } static ret_code_t del_inventory_field(SaHpiSessionIdT sessionId, SaHpiResourceIdT rptid, SaHpiIdrIdT rdrnum) { SaErrorT rv; SaHpiEntryIdT areaId, fieldId; int res, i; i = get_int_param("Area Id: ", &res); if (i != 1) { printf("Error!!! Invalid Area Id\n"); return(HPI_SHELL_PARM_ERROR); }; areaId = res; i = get_int_param("Field Id: ", &res); if (i != 1) { printf("Error!!! Invalid Field Id\n"); return(HPI_SHELL_PARM_ERROR); }; fieldId = res; rv = saHpiIdrFieldDelete(sessionId, rptid, rdrnum, areaId, fieldId); if (rv != SA_OK) { printf("ERROR!!! saHpiIdrFieldDelete: %s\n", oh_lookup_error(rv)); return(HPI_SHELL_CMD_ERROR); }; return(HPI_SHELL_OK); } static ret_code_t delete_inventory_area(SaHpiSessionIdT sessionId, SaHpiResourceIdT rptid, SaHpiIdrIdT rdrnum) { SaErrorT rv; int res, i; i = get_int_param("Area Id: ", &res); if (i != 1) { printf("Error!!! Invalid Area Id\n"); return(HPI_SHELL_PARM_ERROR); }; rv = saHpiIdrAreaDelete(sessionId, rptid, rdrnum, res); if (rv != SA_OK) { printf("ERROR!!! saHpiIdrAreaDelete: %s\n", oh_lookup_error(rv)); return(HPI_SHELL_CMD_ERROR); }; return(HPI_SHELL_OK); } static ret_code_t sa_show_inv(SaHpiResourceIdT resourceid) { SaErrorT rv = SA_OK, rva, rvf; SaHpiEntryIdT rdrentryid; SaHpiEntryIdT nextrdrentryid; SaHpiRdrT rdr; SaHpiIdrIdT idrid; SaHpiIdrInfoT idrInfo; SaHpiEntryIdT areaId; SaHpiEntryIdT nextareaId; SaHpiIdrAreaTypeT areaType; int numAreas; SaHpiEntryIdT fieldId; SaHpiEntryIdT nextFieldId; SaHpiIdrFieldTypeT fieldType; SaHpiIdrFieldT thisField; SaHpiIdrAreaHeaderT areaHeader; rdrentryid = SAHPI_FIRST_ENTRY; while (rdrentryid != SAHPI_LAST_ENTRY) { rv = saHpiRdrGet(Domain->sessionId, resourceid, rdrentryid, &nextrdrentryid, &rdr); if (rv != SA_OK) { printf("saHpiRdrGet error %s\n", oh_lookup_error(rv)); return HPI_SHELL_CMD_ERROR; } if (rdr.RdrType != SAHPI_INVENTORY_RDR) { rdrentryid = nextrdrentryid; continue; }; idrid = rdr.RdrTypeUnion.InventoryRec.IdrId; rv = saHpiIdrInfoGet(Domain->sessionId, resourceid, idrid, &idrInfo); if (rv != SA_OK) { printf("saHpiIdrInfoGet error %s\n", oh_lookup_error(rv)); return HPI_SHELL_CMD_ERROR; } numAreas = idrInfo.NumAreas; areaType = SAHPI_IDR_AREATYPE_UNSPECIFIED; areaId = SAHPI_FIRST_ENTRY; while (areaId != SAHPI_LAST_ENTRY) { rva = saHpiIdrAreaHeaderGet(Domain->sessionId, resourceid, idrInfo.IdrId, areaType, areaId, &nextareaId, &areaHeader); if (rva != SA_OK) { printf("saHpiIdrAreaHeaderGet error %s\n", oh_lookup_error(rva)); break; } show_inv_area_header(&areaHeader, 2, ui_print); fieldType = SAHPI_IDR_FIELDTYPE_UNSPECIFIED; fieldId = SAHPI_FIRST_ENTRY; while (fieldId != SAHPI_LAST_ENTRY) { rvf = saHpiIdrFieldGet(Domain->sessionId, resourceid, idrInfo.IdrId, areaHeader.AreaId, fieldType, fieldId, &nextFieldId, &thisField); if (rvf != SA_OK) { printf("saHpiIdrFieldGet error %s\n", oh_lookup_error(rvf)); break; } show_inv_field(&thisField, 4, ui_print); fieldId = nextFieldId; } areaId = nextareaId; } rdrentryid = nextrdrentryid; } return HPI_SHELL_OK; } ret_code_t inv_block_show(void) { term_def_t *term; SaHpiEntryIdT areaid; term = get_next_term(); if (term != NULL) { areaid = strtol( term->term, NULL, 10 ); } else { areaid = SAHPI_LAST_ENTRY; } return(show_inventory(Domain->sessionId, inv_block_env.rptid, inv_block_env.rdrnum, areaid, ui_print)); } ret_code_t inv_block_addarea(void) { return(add_inventory_area(Domain->sessionId, inv_block_env.rptid, inv_block_env.rdrnum)); } ret_code_t inv_block_delarea(void) { return(delete_inventory_area(Domain->sessionId, inv_block_env.rptid, inv_block_env.rdrnum)); } ret_code_t inv_block_addfield(void) { return(add_inventory_field(Domain->sessionId, inv_block_env.rptid, inv_block_env.rdrnum)); } ret_code_t inv_block_setfield(void) { return(set_inventory_field(Domain->sessionId, inv_block_env.rptid, inv_block_env.rdrnum)); } ret_code_t inv_block_delfield(void) { return(del_inventory_field(Domain->sessionId, inv_block_env.rptid, inv_block_env.rdrnum)); } ret_code_t inv_block(void) { SaHpiRdrT rdr_entry; SaHpiResourceIdT rptid; SaHpiInstrumentIdT rdrnum; SaHpiRdrTypeT type; SaErrorT rv; char buf[256]; ret_code_t ret; term_def_t *term; int res; ret = ask_rpt(&rptid); if (ret != HPI_SHELL_OK) return(ret); type = SAHPI_INVENTORY_RDR; ret = ask_rdr(rptid, type, &rdrnum); if (ret != HPI_SHELL_OK) return(ret); inv_block_env.rptid = rptid; inv_block_env.rdrnum = rdrnum; rv = saHpiRdrGetByInstrumentId(Domain->sessionId, rptid, type, rdrnum, &rdr_entry); if (rv != SA_OK) { printf("saHpiRdrGetByInstrumentId error %s\n", oh_lookup_error(rv)); printf("ERROR!!! Can not get rdr: ResourceId=%d RdrType=%d RdrNum=%d\n", rptid, type, rdrnum); return(HPI_SHELL_CMD_ERROR); }; show_inventory(Domain->sessionId, rptid, rdrnum, SAHPI_LAST_ENTRY, ui_print); for (;;) { block_type = INV_COM; res = get_new_command("inventory block ==> "); if (res == 2) { unget_term(); return HPI_SHELL_OK; }; term = get_next_term(); if (term == NULL) continue; snprintf(buf, 256, "%s", term->term); if ((strcmp(buf, "q") == 0) || (strcmp(buf, "quit") == 0)) break; }; block_type = MAIN_COM; return HPI_SHELL_OK; } ret_code_t show_inv(void) { SaHpiResourceIdT resid = 0; int i, res; term_def_t *term; term = get_next_term(); if (term == NULL) { i = show_rpt_list(Domain, SHOW_ALL_RPT, resid, SHORT_LSRES, ui_print); if (i == 0) { printf("NO rpt!\n"); return(HPI_SHELL_OK); }; i = get_int_param("RPT ID ==> ", &res); if (i == 1) resid = (SaHpiResourceIdT)res; else return HPI_SHELL_OK; } else { resid = (SaHpiResourceIdT)atoi(term->term); }; return sa_show_inv(resid); } static ret_code_t set_control_state(SaHpiSessionIdT sessionid, SaHpiResourceIdT resourceid, SaHpiCtrlNumT num) { SaErrorT rv; SaHpiRdrT rdr; SaHpiCtrlRecT *ctrl; SaHpiCtrlTypeT type; SaHpiCtrlStateDigitalT state_val = 0; SaHpiCtrlModeT mode; SaHpiCtrlStateT state; char buf[SAHPI_MAX_TEXT_BUFFER_LENGTH]; char *str; int i, res; rv = saHpiRdrGetByInstrumentId(sessionid, resourceid, SAHPI_CTRL_RDR, num, &rdr); if (rv != SA_OK) { printf("saHpiRdrGetByInstrumentId: error: %s\n", oh_lookup_error(rv)); return(HPI_SHELL_CMD_ERROR); }; memset(&state, 0, sizeof(SaHpiCtrlStateT)); i = get_string_param("Mode(auto|manual): ", buf, 7); if (i != 0) return(HPI_SHELL_CMD_ERROR); if (strcmp(buf, "auto") == 0) mode = SAHPI_CTRL_MODE_AUTO; else if (strcmp(buf, "manual") == 0) mode = SAHPI_CTRL_MODE_MANUAL; else return(HPI_SHELL_CMD_ERROR); if (mode == SAHPI_CTRL_MODE_AUTO) { rv = saHpiControlSet(sessionid, resourceid, num, mode, (SaHpiCtrlStateT *)NULL); if (rv != SA_OK) { printf("saHpiControlSet: error: %s\n", oh_lookup_error(rv)); return(HPI_SHELL_CMD_ERROR); }; return(HPI_SHELL_OK); }; ctrl = &(rdr.RdrTypeUnion.CtrlRec); type = ctrl->Type; state.Type = type; switch (type) { case SAHPI_CTRL_TYPE_DIGITAL: i = get_string_param( "New state(on|off|pulseon|pulseoff): ", buf, 9); if (i != 0) return(HPI_SHELL_CMD_ERROR); if (strcmp(buf, "on") == 0) state_val = SAHPI_CTRL_STATE_ON; if (strcmp(buf, "off") == 0) state_val = SAHPI_CTRL_STATE_OFF; if (strcmp(buf, "pulseon") == 0) state_val = SAHPI_CTRL_STATE_PULSE_ON; if (strcmp(buf, "pulseoff") == 0) state_val = SAHPI_CTRL_STATE_PULSE_OFF; state.StateUnion.Digital = state_val; break; case SAHPI_CTRL_TYPE_DISCRETE: i = get_int_param("Value ==> ", &res); if (i != 1) { printf("Invalid value\n"); return HPI_SHELL_CMD_ERROR; }; state.StateUnion.Discrete = res; break; case SAHPI_CTRL_TYPE_ANALOG: i = get_int_param("Value ==> ", &res); if (i != 1) { printf("Invalid value\n"); return HPI_SHELL_CMD_ERROR; }; state.StateUnion.Analog = res; break; case SAHPI_CTRL_TYPE_STREAM: i = get_string_param("Repeat(yes|no): ", buf, 4); if (i != 0) return(HPI_SHELL_CMD_ERROR); str = buf; while (*str == ' ') str++; if (strncmp(str, "yes", 3) == 0) state.StateUnion.Stream.Repeat = 1; i = get_string_param("Stream: ", buf, 4); i = strlen(buf); if (i > 4) i = 4; state.StateUnion.Stream.StreamLength = i; strncpy((char *)(state.StateUnion.Stream.Stream), buf, i); break; case SAHPI_CTRL_TYPE_TEXT: i = get_int_param("Line #: ", &res); if (i != 1) { printf("Invalid value\n"); return HPI_SHELL_CMD_ERROR; }; state.StateUnion.Text.Line = res; printf("Text: "); i = set_text_buffer(&(state.StateUnion.Text.Text)); if (i != 0) { printf("Invalid text\n"); return(HPI_SHELL_CMD_ERROR); }; break; case SAHPI_CTRL_TYPE_OEM: i = get_int_param("Manufacturer Id: ", &res); if (i != 1) { printf("Invalid value\n"); return HPI_SHELL_CMD_ERROR; }; state.StateUnion.Oem.MId = res; memset(state.StateUnion.Oem.Body, 0, SAHPI_CTRL_MAX_OEM_BODY_LENGTH); i = get_hex_string_param("Oem body: ", (char *)(state.StateUnion.Oem.Body), SAHPI_CTRL_MAX_OEM_BODY_LENGTH); state.StateUnion.Oem.BodyLength = i; break; default: strcpy(buf, "Unknown control type\n"); return(HPI_SHELL_CMD_ERROR); }; rv = saHpiControlSet(sessionid, resourceid, num, SAHPI_CTRL_MODE_MANUAL, &state); if (rv != SA_OK) { printf("saHpiControlSet: error: %s\n", oh_lookup_error(rv)); return(HPI_SHELL_CMD_ERROR); }; return(HPI_SHELL_OK); } ret_code_t ctrl_block_state(void) { show_control_state(Domain->sessionId, ctrl_block_env.rptid, ctrl_block_env.rdrnum, ui_print, get_int_param); return(HPI_SHELL_OK); } ret_code_t ctrl_block_setst(void) { return(set_control_state(Domain->sessionId, ctrl_block_env.rptid, ctrl_block_env.rdrnum)); } ret_code_t ctrl_block_show(void) { show_control(Domain->sessionId, ctrl_block_env.rptid, ctrl_block_env.rdrnum, ui_print); return(HPI_SHELL_OK); } ret_code_t ctrl_block(void) { SaHpiRdrT rdr_entry; SaHpiResourceIdT rptid; SaHpiInstrumentIdT rdrnum; SaHpiRdrTypeT type; SaErrorT rv; char buf[256]; ret_code_t ret; term_def_t *term; int res; ret = ask_rpt(&rptid); if (ret != HPI_SHELL_OK) return(ret); type = SAHPI_CTRL_RDR; ret = ask_rdr(rptid, type, &rdrnum); if (ret != HPI_SHELL_OK) return(ret); ctrl_block_env.rptid = rptid; ctrl_block_env.rdrnum = rdrnum; rv = saHpiRdrGetByInstrumentId(Domain->sessionId, rptid, type, rdrnum, &rdr_entry); if (rv != SA_OK) { printf("saHpiRdrGetByInstrumentId error %s\n", oh_lookup_error(rv)); printf("ERROR!!! Can not get rdr: ResourceId=%d RdrType=%d RdrNum=%d\n", rptid, type, rdrnum); return(HPI_SHELL_CMD_ERROR); }; show_control(Domain->sessionId, rptid, rdrnum, ui_print); for (;;) { block_type = CTRL_COM; res = get_new_command("control block ==> "); if (res == 2) { unget_term(); return HPI_SHELL_OK; }; term = get_next_term(); if (term == NULL) continue; snprintf(buf, 256, "%s", term->term); if ((strcmp(buf, "q") == 0) || (strcmp(buf, "quit") == 0)) break; }; block_type = MAIN_COM; return HPI_SHELL_OK; } int set_text_buffer(SaHpiTextBufferT *buf) { int i, j, ind; char str[SAHPI_MAX_TEXT_BUFFER_LENGTH], *str1; SaHpiTextTypeT type = SAHPI_TL_TYPE_TEXT; SaHpiLanguageT lang = SAHPI_LANG_ENGLISH; i = get_string_param("DataType(text|bcd|ascii6|bin|unicode): ", str, 10); if (i != 0) return(-1); if (strcmp(str, "text") == 0) type = SAHPI_TL_TYPE_TEXT; else if (strcmp(str, "bcd") == 0) type = SAHPI_TL_TYPE_BCDPLUS; else if (strcmp(str, "ascii6") == 0) type = SAHPI_TL_TYPE_ASCII6; else if (strcmp(str, "bin") == 0) type = SAHPI_TL_TYPE_BINARY; else if (strcmp(str, "unicode") == 0) type = SAHPI_TL_TYPE_UNICODE; /* * ask a language for unicode and text: Fix me */ i = get_string_param("Text: ", str, SAHPI_MAX_TEXT_BUFFER_LENGTH); if (i != 0) return(-1); buf->DataType = type; switch (type) { case SAHPI_TL_TYPE_UNICODE: printf("UNICODE: not implemented"); return(-1); case SAHPI_TL_TYPE_BCDPLUS: for (i = 0; i < strlen(str); i++) { switch ( str[i] ) { case '0': case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9': case ' ': case '-': case '.': case ':': case ',': case '_': break; default: printf( "BCD+: Illegal symbol \'%c\'(0x%x)\n", str[i], str[i] ); return -1; } } snprintf((char *)&(buf->Data), SAHPI_MAX_TEXT_BUFFER_LENGTH, "%s", str); buf->DataLength = strlen(str); buf->Language = lang; break; case SAHPI_TL_TYPE_ASCII6: for (i = 0; i < strlen(str); i++) { if ( ( str[i] < 0x20 ) || ( str[i] > 0x5F ) ) { printf( "ASCII6: Illegal symbol \'%c\'(0x%x)\n", str[i], str[i] ); return -1; } } snprintf((char *)&(buf->Data), SAHPI_MAX_TEXT_BUFFER_LENGTH, "%s", str); buf->DataLength = strlen(str); buf->Language = lang; break; case SAHPI_TL_TYPE_TEXT: snprintf((char *)&(buf->Data), SAHPI_MAX_TEXT_BUFFER_LENGTH, "%s", str); buf->DataLength = strlen(str); buf->Language = lang; break; case SAHPI_TL_TYPE_BINARY: str1 = (char *)&(buf->Data); ind = 0; for (i = 0; i < strlen(str); i++) { for (j = 0; j < 16; j++) if (hex_codes[j] == toupper(str[i])) break; if (j >= 16) return(-1); if (i % 2) str1[ind++] += j; else str1[ind] = j << 4; }; buf->DataLength = (i + 1)/ 2; break; }; return(0); } static void show_rdr_attrs(SaHpiRdrT *rdr_entry) { Rdr_t tmp_rdr; make_attrs_rdr(&tmp_rdr, rdr_entry); show_Rdr(&tmp_rdr, ui_print); free_attrs(&(tmp_rdr.Attrutes)); } static ret_code_t list_cond(SaHpiResourceIdT rptid, SaHpiInstrumentIdT rdrnum) { SaErrorT rv; SaHpiAnnouncementT annon; SaHpiTextBufferT buffer; annon.EntryId = SAHPI_FIRST_ENTRY; for (;;) { rv = saHpiAnnunciatorGetNext(Domain->sessionId, rptid, rdrnum, SAHPI_ALL_SEVERITIES, SAHPI_FALSE, &annon); if (rv != SA_OK) { if (rv == SA_ERR_HPI_NOT_PRESENT) break; printf("saHpiAnnunciatorGetNext error %s\n", oh_lookup_error(rv)); return(HPI_SHELL_CMD_ERROR); }; oh_decode_time(annon.Timestamp, &buffer); printf(" ID: %d AddedByUser: %d Acknowledged: %d Time: %s Sever: %d\n", annon.EntryId, annon.AddedByUser, annon.Acknowledged, buffer.Data, annon.Severity); }; return HPI_SHELL_OK; } static ret_code_t set_acknowledge(SaHpiResourceIdT rptid, SaHpiInstrumentIdT rdrnum) { SaErrorT rv; char str[32]; int i, all = 0; SaHpiSeverityT sev = SAHPI_OK; SaHpiEntryIdT entryId = 0; i = get_string_param("EntryId( | all): ", str, 32); if (i != 0) return(HPI_SHELL_PARM_ERROR); if (strcmp(str, "all") == 0) all = 1; else entryId = atoi(str); if (all) { i = get_string_param("Severity(crit|maj|min|info|ok): ", str, 10); if (i != 0) return(HPI_SHELL_PARM_ERROR); if (strcmp(str, "crit") == 0) sev = SAHPI_CRITICAL; else if (strcmp(str, "maj") == 0) sev = SAHPI_MAJOR; else if (strcmp(str, "min") == 0) sev = SAHPI_MINOR; else if (strcmp(str, "info") == 0) sev = SAHPI_INFORMATIONAL; else if (strcmp(str, "ok") == 0) sev = SAHPI_OK; else { printf("Invalid severity %s\n", str); return(HPI_SHELL_PARM_ERROR); }; entryId = SAHPI_ENTRY_UNSPECIFIED; }; rv = saHpiAnnunciatorAcknowledge(Domain->sessionId, rptid, rdrnum, entryId, sev); if (rv != SA_OK) { printf("saHpiAnnunciatorAcknowledge error %s\n", oh_lookup_error(rv)); return(HPI_SHELL_CMD_ERROR); }; return HPI_SHELL_OK; } static ret_code_t delete_announ(SaHpiResourceIdT rptid, SaHpiInstrumentIdT rdrnum) { SaErrorT rv; char str[32]; int i, any = 0; SaHpiSeverityT sev = SAHPI_OK; SaHpiEntryIdT entryId = 0; i = get_string_param("EntryId( | any): ", str, 32); if (i != 0) return(HPI_SHELL_PARM_ERROR); if (strcmp(str, "any") == 0) any = 1; else entryId = atoi(str); if (any) { i = get_string_param("Severity(crit|maj|min|info|ok|all): ", str, 10); if (i != 0) return(-1); if (strcmp(str, "crit") == 0) sev = SAHPI_CRITICAL; else if (strcmp(str, "maj") == 0) sev = SAHPI_MAJOR; else if (strcmp(str, "min") == 0) sev = SAHPI_MINOR; else if (strcmp(str, "info") == 0) sev = SAHPI_INFORMATIONAL; else if (strcmp(str, "ok") == 0) sev = SAHPI_OK; else if (strcmp(str, "all") == 0) sev = SAHPI_ALL_SEVERITIES; else { printf("Invalid severity %s\n", str); return(HPI_SHELL_PARM_ERROR); }; entryId = SAHPI_ENTRY_UNSPECIFIED; }; rv = saHpiAnnunciatorDelete(Domain->sessionId, rptid, rdrnum, entryId, sev); if (rv != SA_OK) { printf("saHpiAnnunciatorDelete error %s\n", oh_lookup_error(rv)); return(HPI_SHELL_CMD_ERROR); }; return HPI_SHELL_OK; } static ret_code_t add_announ(SaHpiResourceIdT rptid, SaHpiInstrumentIdT rdrnum) { SaErrorT rv; char str[32]; int i; SaHpiSeverityT sev = SAHPI_OK; SaHpiAnnouncementT announ; SaHpiStatusCondTypeT type = SAHPI_STATUS_COND_TYPE_SENSOR; SaHpiDomainIdT did; SaHpiResourceIdT resId; SaHpiSensorNumT sennum = 0; memset(&announ, 0, sizeof(SaHpiAnnouncementT)); i = get_string_param("Severity(crit|maj|min|info|ok): ", str, 10); if (i != 0) return(HPI_SHELL_PARM_ERROR); if (strcmp(str, "crit") == 0) sev = SAHPI_CRITICAL; else if (strcmp(str, "maj") == 0) sev = SAHPI_MAJOR; else if (strcmp(str, "min") == 0) sev = SAHPI_MINOR; else if (strcmp(str, "info") == 0) sev = SAHPI_INFORMATIONAL; else if (strcmp(str, "ok") == 0) sev = SAHPI_OK; else { printf("Invalid severity %s\n", str); return(HPI_SHELL_PARM_ERROR); }; announ.Severity = sev; i = get_string_param("Condition Type(sensor|res|oem|user): ", str, 10); if (i != 0) return(-1); if (strcmp(str, "sensor") == 0) type = SAHPI_STATUS_COND_TYPE_SENSOR; else if (strcmp(str, "res") == 0) type = SAHPI_STATUS_COND_TYPE_RESOURCE; else if (strcmp(str, "oem") == 0) type = SAHPI_STATUS_COND_TYPE_OEM; else if (strcmp(str, "user") == 0) type = SAHPI_STATUS_COND_TYPE_USER; else { printf("Invalid Condition Type %s\n", str); return(HPI_SHELL_PARM_ERROR); }; announ.StatusCond.Type = type; // EntityPath: is needed ??? // oh_encode_entitypath(char *str, SaHpiEntityPathT *ep); convert string into ep. i = get_int_param("DomainId: ", (int *)&did); if (i != 1) did = SAHPI_UNSPECIFIED_DOMAIN_ID; announ.StatusCond.DomainId = did; i = get_int_param("ResourceId: ", (int *)&resId); if (i != 1) resId = SAHPI_UNSPECIFIED_RESOURCE_ID; announ.StatusCond.ResourceId = resId; i = get_int_param("Sensor number: ", (int *)&sennum); announ.StatusCond.SensorNum = sennum; rv = saHpiAnnunciatorAdd(Domain->sessionId, rptid, rdrnum, &announ); if (rv != SA_OK) { printf("saHpiAnnunciatorAdd error %s\n", oh_lookup_error(rv)); return(HPI_SHELL_CMD_ERROR); }; return HPI_SHELL_OK; } static void show_cond(SaHpiResourceIdT rptid, SaHpiInstrumentIdT rdrnum, int num) { SaErrorT rv; SaHpiAnnouncementT announ; SaHpiTextBufferT buffer; SaHpiConditionT *cond; char *str; oh_big_textbuffer tmpbuf; rv = saHpiAnnunciatorGet(Domain->sessionId, rptid, rdrnum, num, &announ); if (rv != SA_OK) { printf("Can not find Announcement: %d\n", num); return; }; oh_decode_time(announ.Timestamp, &buffer); printf(" ID: %d AddedByUser: %d Acknowledged: %d Time: %s Sever: %d\n", announ.EntryId, announ.AddedByUser, announ.Acknowledged, buffer.Data, announ.Severity); cond = &(announ.StatusCond); switch (cond->Type) { case SAHPI_STATUS_COND_TYPE_SENSOR: str = "SENSOR"; break; case SAHPI_STATUS_COND_TYPE_RESOURCE: str = "RESOURCE"; break; case SAHPI_STATUS_COND_TYPE_OEM: str = "OEM"; break; case SAHPI_STATUS_COND_TYPE_USER: str = "USER"; break; default: str = "UNKNOWN"; break; }; printf(" Condition: Type = %s DomainId = %d ResId %d SensorNum = %d\n", str, cond->DomainId, cond->ResourceId, cond->SensorNum); oh_decode_entitypath(&(cond->Entity), &tmpbuf); printf(" EPath = %s\n", tmpbuf.Data); printf(" Mid = %d EventState = %x\n", cond->Mid, cond->EventState); printf(" Name = %s Data = %s\n", cond->Name.Value, cond->Data.Data); } ret_code_t ann_block_acknow(void) { return(set_acknowledge(ann_block_env.rptid, ann_block_env.rdrnum)); } ret_code_t ann_block_list(void) { return(list_cond(ann_block_env.rptid, ann_block_env.rdrnum)); } ret_code_t ann_block_add(void) { return(add_announ(ann_block_env.rptid, ann_block_env.rdrnum)); } ret_code_t ann_block_delete(void) { return(delete_announ(ann_block_env.rptid, ann_block_env.rdrnum)); } ret_code_t ann_block_modeget(void) { SaErrorT rv; SaHpiAnnunciatorModeT mode; char *str; rv = saHpiAnnunciatorModeGet(Domain->sessionId, ann_block_env.rptid, ann_block_env.rdrnum, &mode); if (rv != SA_OK) { printf("saHpiAnnunciatorModeGet error %s\n", oh_lookup_error(rv)); return(HPI_SHELL_CMD_ERROR); }; switch (mode) { case SAHPI_ANNUNCIATOR_MODE_AUTO: str = "AUTO"; break; case SAHPI_ANNUNCIATOR_MODE_USER: str = "USER"; break; case SAHPI_ANNUNCIATOR_MODE_SHARED: str = "SHARED"; break; default: str = "Unknown"; break; }; printf("Annunciator Mode: %s\n", str); return(HPI_SHELL_OK); } ret_code_t ann_block_modeset(void) { SaErrorT rv; SaHpiAnnunciatorModeT mode; char buf[256]; int res; res = get_string_param("Mode(auto|user|shared): ", buf, 10); if (res != 0) { printf("Invalid mode: %s\n", buf); return(HPI_SHELL_PARM_ERROR); }; if (strcmp(buf, "auto") == 0) mode = SAHPI_ANNUNCIATOR_MODE_AUTO; else if (strcmp(buf, "user") == 0) mode = SAHPI_ANNUNCIATOR_MODE_USER; else if (strcmp(buf, "shared") == 0) mode = SAHPI_ANNUNCIATOR_MODE_SHARED; else { printf("Invalid mode: %s\n", buf); return(HPI_SHELL_PARM_ERROR); }; rv = saHpiAnnunciatorModeSet(Domain->sessionId, ann_block_env.rptid, ann_block_env.rdrnum, mode); if (rv != SA_OK) { printf("saHpiAnnunciatorModeSet error %s\n", oh_lookup_error(rv)); return(HPI_SHELL_CMD_ERROR); }; return(HPI_SHELL_OK); } ret_code_t ann_block_show(void) { term_def_t *term; int res, val; term = get_next_term(); if (term == NULL) { show_rdr_attrs(&(ann_block_env.rdr_entry)); return(HPI_SHELL_OK); }; unget_term(); res = get_int_param(" ", &val); if (res != 1) unget_term(); else show_cond(ann_block_env.rptid, ann_block_env.rdrnum, val); return(HPI_SHELL_OK); } ret_code_t ann_block(void) { SaHpiResourceIdT rptid; SaHpiInstrumentIdT rdrnum; SaHpiRdrTypeT type; SaErrorT rv; char buf[256]; ret_code_t ret; term_def_t *term; int res; ret = ask_rpt(&rptid); if (ret != HPI_SHELL_OK) return(ret); type = SAHPI_ANNUNCIATOR_RDR; ret = ask_rdr(rptid, type, &rdrnum); if (ret != HPI_SHELL_OK) return(ret); rv = saHpiRdrGetByInstrumentId(Domain->sessionId, rptid, type, rdrnum, &(ann_block_env.rdr_entry)); if (rv != SA_OK) { printf("saHpiRdrGetByInstrumentId error %s\n", oh_lookup_error(rv)); printf("ERROR!!! Can not get rdr: ResourceId=%d RdrType=%d RdrNum=%d\n", rptid, type, rdrnum); return(HPI_SHELL_CMD_ERROR); }; ann_block_env.rptid = rptid; ann_block_env.rdrnum = rdrnum; show_rdr_attrs(&(ann_block_env.rdr_entry)); for (;;) { block_type = ANN_COM; res = get_new_command("annunciator block ==> "); if (res == 2) { unget_term(); block_type = MAIN_COM; return HPI_SHELL_OK; }; term = get_next_term(); if (term == NULL) continue; snprintf(buf, 256, "%s", term->term); if ((strcmp(buf, "q") == 0) || (strcmp(buf, "quit") == 0)) break; }; block_type = MAIN_COM; return HPI_SHELL_OK; } openhpi-2.14.1/hpi_shell/cmdparser.c0000644000076400007640000003511611302567132014272 0ustar /* -*- linux-c -*- * * Copyright (c) 2004 by Intel Corp. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Hu Yin * Changes: * 11.30.2004 - Kouzmich: porting to HPI-B * * */ #include #include #include #include #include #include #if defined(__sun) && defined(__SVR4) #include #endif #include "hpi_cmd.h" #define MAX_IN_FILES 10 #define MAX_REDIRECTIONS 10 term_def_t *terms; int read_stdin = 1; int read_file = 0; com_enum_t block_type = MAIN_COM; FILE *input_file = (FILE *)NULL; ret_code_t shell_error = HPI_SHELL_OK; int in_files_count = 0; FILE *input_files[MAX_IN_FILES]; int out_files_count = 0; int output_files[MAX_REDIRECTIONS]; char Title[1024]; int is_more = 1; /* local variables */ static char input_buffer[READ_BUF_SIZE]; // command line buffer static char *input_buf_ptr = input_buffer; // current pointer in input_buffer static char cmd_line[LINE_BUF_SIZE]; // current command line static char new_cmd_line[LINE_BUF_SIZE]; // new command line static int max_term_count = 0; static int term_count = 0; static int current_term = 0; static int window_nrows = 24; static int window_ncols = 80; static int current_row = 0; static int set_redirection(char *name, int redir) { char *flags; FILE *out; if (out_files_count >= MAX_REDIRECTIONS) { printf("Too many redirections\n"); return(-1); }; if (redir == 1) flags = "w"; else flags = "a"; out = fopen(name, flags); if (out == (FILE *)NULL) { printf("Can not open/create file: %s\n", name); return(-1); }; output_files[out_files_count] = dup(STDOUT_FILENO); fflush(stdout); dup2(fileno(out), STDOUT_FILENO); fclose(out); out_files_count++; return(0); } static void remove_reditection(void) { if (out_files_count == 0) return; out_files_count--; fflush(stdout); dup2(output_files[out_files_count], STDOUT_FILENO); close(output_files[out_files_count]); } static int delete_input_file(void) { FILE *f; if (in_files_count < 1) return(-1); in_files_count--; f = input_files[in_files_count]; fclose(f); if (in_files_count == 0) return(-1); input_file = input_files[in_files_count - 1]; return(0); } static void new_command(void) { term_count = 0; current_row = 0; current_term = 0; *cmd_line = 0; } static void go_to_dialog(void) { if (read_stdin) return; if (delete_input_file() == 0) return; read_stdin = 1; read_file = 0; new_command(); } static void add_term(char *term, term_t type) { term_def_t *tmp_terms; if (term_count >= max_term_count) { max_term_count += 5; tmp_terms = (term_def_t *)malloc(max_term_count * sizeof(term_def_t)); memset(tmp_terms, 0, max_term_count * sizeof(term_def_t)); if (term_count > 0) { memcpy(tmp_terms, terms, term_count * sizeof(term_def_t)); free(terms); }; terms = tmp_terms; }; tmp_terms = terms + term_count; tmp_terms->term_type = type; tmp_terms->term = term; if (debug_flag) printf("add_term: term = %s type = %d\n", term, type); term_count++; } static char *find_cmd_end(char *str) { while (*str != 0) { if (*str == '\"') { str++; while ((*str != 0) && (*str != '\"')) str++; if (*str == 0) return(str); }; if (*str == ';') return(str + 1); str++; }; return(str); } static char *get_input_line(char *mes, int new_cmd) { FILE *f = stdin; char *res; int len; if (strlen(input_buf_ptr) > 0) { res = input_buf_ptr; input_buf_ptr = find_cmd_end(input_buf_ptr); return(res); }; input_buf_ptr = input_buffer; fflush(stdout); memset(input_buffer, 0, READ_BUF_SIZE); current_row = 0; if (read_stdin) { if (mes != (char *)NULL) snprintf(Title, READ_BUF_SIZE, "%s", mes); else strcpy(Title, "OpenHPI> "); printf("%s", Title); res = get_command_line(new_cmd, COMPL_CMD); if (res != (char *)NULL) { strcpy(input_buffer, res); res = input_buffer; } } else if (read_file) { f = input_file; res = fgets(input_buffer, READ_BUF_SIZE - 1, f); } else { printf("Internal error: get_input_line:\n" " No input file\n"); exit(1); }; if (res != (char *)NULL) { len = strlen(res); if ((len > 0) && (res[len - 1] == '\n')) res[len - 1] = 0; input_buf_ptr = find_cmd_end(input_buf_ptr); }; return(res); } static command_def_t *get_cmd(char *name) { const char *p; command_def_t *c, *res = (command_def_t *)NULL; int len = strlen(name); int n = 0; for (c = commands; (p = c->cmd) != NULL; c++) { if ((c->type != MAIN_COM) && (c->type != block_type) && (c->type != UNDEF_COM)) continue; if (strncmp(p, name, len) == 0) { if (n == 0) res = c; n++; }; if (strcmp(p, name) == 0) { return(c); } }; if (n == 1) return(res); return((command_def_t *)NULL); } static void add_to_cmd_line(char *str) { int len; len = strlen(cmd_line); if (len == 0) strcpy(cmd_line, str); else snprintf(cmd_line + len, LINE_BUF_SIZE - len, " %s", str); } static int check_cmd_for_redirect(void) { int i, redirect = 0; for (i = 0; i < term_count; i++) { if (terms[i].term_type == CMD_ERROR_TERM) return(HPI_SHELL_SYNTAX_ERROR); if (terms[i].term_type == CMD_REDIR_TERM) { if (redirect != 0) return(HPI_SHELL_SYNTAX_ERROR); if (strcmp(">>", terms[i].term) == 0) redirect = 2; else redirect = 1; } }; return(redirect); } ret_code_t cmd_parser(char *mes, int as, int new_cmd, int *redirect) // as = 0 - get command // as = 1 - may be exit with empty command // new_cmd = 1 - new command // new_cmd = 0 - get added items // returned redirect value (for new_cmd = 1): // 0 - no redirect output // 1 - redirect to the empty file // 2 - add output to the existent file { char *cmd, *str, *beg, *tmp; term_t type; int i; char new_line[LINE_BUF_SIZE]; *redirect = 0; for (;;) { if (new_cmd) { new_command(); type = CMD_TERM; } else type = ITEM_TERM; cmd = get_input_line(mes, new_cmd); if (cmd == (char *)NULL) { go_to_dialog(); continue; }; strcpy(new_cmd_line, cmd); str = new_cmd_line; while (isspace(*str)) str++; if (strlen(str) == 0) { if (as) return HPI_SHELL_OK; continue; }; beg = str; if (*beg == '#') continue; while (*str != 0) { if (isspace(*str)) { *str++ = 0; if (strlen(beg) > 0) { add_term(beg, type); type = ITEM_TERM; }; while (isspace(*str)) str++; add_to_cmd_line(beg); beg = str; continue; }; if (*str == '\"') { str++; while ((*str != 0) && (*str != '\"')) str ++; if (*str == 0) { add_to_cmd_line(beg); add_term(beg, type); if (read_file) add_term(";", CMD_ERROR_TERM); break; }; if (*beg == '\"') { beg++; *str = 0; add_term(beg, type); type = ITEM_TERM; add_to_cmd_line(beg); beg = str + 1; }; str++; continue; }; if (*str == '>') { *str++ = 0; if (strlen(beg) > 0) { add_to_cmd_line(beg); add_term(beg, type); }; if (*str == '>') { add_to_cmd_line(">>"); add_term(">>", CMD_REDIR_TERM); str++; } else { add_to_cmd_line(">"); add_term(">", CMD_REDIR_TERM); }; type = ITEM_TERM; beg = str; continue; }; if ((*str == '!') && read_stdin) { if (str[1] == '!') { i = 2; tmp = get_last_history(); } else { i = 1; tmp = get_def_history(str + 1, &i); }; if (tmp == (char *)NULL) { str += i; continue; }; *str = 0; str += i; snprintf(new_line, LINE_BUF_SIZE, "%s%s%s", beg, tmp, str); str = new_cmd_line + strlen(beg); strcpy(new_cmd_line, new_line); beg = new_cmd_line; continue; }; if (*str == ';') { *str++ = 0; add_to_cmd_line(beg); break; }; str++; }; if (strlen(beg) > 0) { add_to_cmd_line(beg); add_term(beg, type); }; if (read_file) add_term(";", CMD_END_TERM); if (read_stdin) set_current_history(cmd_line); if (new_cmd == 0) return(HPI_SHELL_OK); *redirect = check_cmd_for_redirect(); return(HPI_SHELL_OK); } } int run_command(void) // returned: -1 - command not found // 0 - command found and ran // 1 - no command // 2 - other block command (do not run command) // 3 - get new command { term_def_t *term; command_def_t *c; ret_code_t rv; if (debug_flag) printf("run_command:\n"); term = get_next_term(); if (term == NULL) return(1); if (term->term_type != CMD_TERM) return(1); c = get_cmd(term->term); if (c == (command_def_t *)NULL) { printf("Invalid command:\n%s\n", cmd_line); go_to_dialog(); help(0); shell_error = HPI_SHELL_CMD_ERROR; return(-1); }; if (c->fun) { if (debug_flag) printf("run_command: c->type = %d\n", c->type); term->term = c->cmd; if ((block_type != c->type) && (c->type != UNDEF_COM)) { block_type = c->type; if (debug_flag) printf("run_command: ret = 2\n"); return(2); }; rv = c->fun(); if (rv == HPI_SHELL_PARM_ERROR) { printf("Invalid parameters:\n%s\n", cmd_line); printf("%s\n", c->help); go_to_dialog(); shell_error = HPI_SHELL_PARM_ERROR; return(3); } else if (rv == HPI_SHELL_CMD_ERROR) { printf("Command failed:\n%s\n", cmd_line); go_to_dialog(); return(3); }; shell_error = rv; } else { printf("Unimplemented command:\n%s\n", cmd_line); go_to_dialog(); shell_error = HPI_SHELL_CMD_ERROR; return(3); }; return(0); } int get_new_command(char *mes) { int redir = 0, i, res; char *name; term_def_t *term; if (debug_flag) printf("get_new_command:\n"); term = get_next_term(); if ((term == NULL) || (term->term_type != CMD_TERM)) cmd_parser(mes, 0, 1, &redir); else { unget_term(); redir = check_cmd_for_redirect(); }; if (redir != 0) { for (i = 0; i < term_count; i++) { if (terms[i].term_type == CMD_REDIR_TERM) break; }; if (i >= term_count - 1) { printf("Syntax error:\n%s\n", cmd_line); go_to_dialog(); return(3); }; if (terms[i + 1].term_type != ITEM_TERM) { printf("Syntax error:\n%s\n", cmd_line); go_to_dialog(); return(3); }; name = terms[i + 1].term; res = set_redirection(name, redir); if (res != 0) { printf("Command failed:\n%s\n", cmd_line); go_to_dialog(); return(3); }; res = run_command(); remove_reditection(); return(res); }; res = run_command(); return(res); } void cmd_shell(void) { *Title = 0; init_history(); help(0); domain_proc(); for (;;) { if (debug_flag) printf("cmd_shell:\n"); shell_error = HPI_SHELL_OK; get_new_command((char *)NULL); if ((shell_error != HPI_SHELL_OK) && read_file) { go_to_dialog(); } } } int get_int_param(char *mes, int *val) { int res, redir; char *str; term_def_t *term; term = get_next_term(); if (term == NULL) { cmd_parser(mes, 1, 0, &redir); term = get_next_term(); }; if (term == NULL) { go_to_dialog(); return(HPI_SHELL_CMD_ERROR); }; str = term->term; if (isdigit(*str) || *str == '-' ) { res = sscanf(str, "%d", val); return(res); }; return(0); } int get_hex_int_param(char *mes, int *val) { char *str, buf[32]; int redir; term_def_t *term; term = get_next_term(); if (term == NULL) { cmd_parser(mes, 1, 0, &redir); term = get_next_term(); }; if (term == NULL) { go_to_dialog(); return(HPI_SHELL_CMD_ERROR); }; str = term->term; if (strncmp(str, "0x", 2) == 0) snprintf(buf, 31, "%s", str); else snprintf(buf, 31, "0x%s", str); *val = strtol(buf, (char **)NULL, 16); return(1); } int get_hex_string_param(char *mes, char *res, int max_length) { char *str, buf[32]; int redir, i, val; term_def_t *term; for (i = 0; i < max_length; i++) { term = get_next_term(); if (term == NULL) { cmd_parser(mes, 1, 0, &redir); term = get_next_term(); }; if (term == NULL) return(i); str = term->term; if (strncmp(str, "0x", 2) == 0) snprintf(buf, 31, "%s", str); else snprintf(buf, 31, "0x%s", str); val = strtol(buf, (char **)NULL, 16); res[i] = val; }; return(i); } int get_string_param(char *mes, char *val, int len) { term_def_t *term; int i; term = get_next_term(); if (term == NULL) { cmd_parser(mes, 1, 0, &i); term = get_next_term(); }; if (term == NULL) { return(HPI_SHELL_CMD_ERROR); }; memset(val, 0, len); strncpy(val, term->term, len); for (i = 0; i < len; i++) if (val[i] == '\n') val[i] = 0; return(0); } term_def_t *get_next_term(void) { term_def_t *res; for (;;) { if (current_term >= term_count){ if (debug_flag) printf("get_next_term: term = (NULL)\n"); return((term_def_t *)NULL); }; res = terms + current_term; if (read_file && (res->term_type == CMD_END_TERM)) return((term_def_t *)NULL); current_term++; if (res->term_type != EMPTY_TERM) break; }; if (debug_flag) printf("get_next_term: term = %s\n", res->term); return(res); } ret_code_t unget_term(void) { if (debug_flag) printf("unget_term:\n"); if (current_term > 0) current_term--; return (current_term); } int add_input_file(char *path) { int i; FILE *f; if (in_files_count >= MAX_IN_FILES) return(-1); i = access(path, R_OK | F_OK); if (i != 0) { printf("Can not access file: %s\n", path); return(HPI_SHELL_PARM_ERROR); }; f = fopen(path, "r"); if (f == (FILE *)NULL) { printf("Can not open file: %s\n", path); return(HPI_SHELL_PARM_ERROR); }; input_files[in_files_count] = f; in_files_count++; input_file = f; return(0); } Pr_ret_t ui_print(char *Str) { struct winsize win; int i, len, c, add_nl = 1; char *tmp, *s; char buf[LINE_BUF_SIZE]; const char green[] = "\033[0;40;32m"; // const char yellow[] = "\033[0;40;33m"; const char reset[] = "\033[0m"; i = ioctl(termfd, TIOCGWINSZ, &win); if ((i != 0) || (win.ws_row == 0) || (win.ws_col == 0)) { window_nrows = 24; window_ncols = 80; } else { window_nrows = win.ws_row; window_ncols = win.ws_col; }; strncpy(buf, Str, LINE_BUF_SIZE); s = tmp = buf; for (i = 0, len = 0; *tmp != 0; i++, tmp++) { c = *tmp; switch (c) { case '\b': continue; case '\n': *tmp = 0; printf("%s\n", s); current_row += add_nl; if ((current_row >= (window_nrows - 1)) && is_more) { printf("%s - more - %s", green, reset); i = getchar(); printf("\r \r"); current_row = 0; if (i == 'q') return(HPI_UI_END); }; s = tmp + 1; len = 0; add_nl = 1; break; case '\r': len = 0; continue; case '\t': len += 8; len = (len / 8) * 8; break; default : len++; break; }; if (len >= window_ncols) { add_nl++; len = 0; } }; if (*s != 0) printf("%s", s); return(HPI_UI_OK); } openhpi-2.14.1/hpi_shell/sensor.c0000644000076400007640000004442711302567132013630 0ustar /* -*- linux-c -*- * * Copyright (c) 2004 by Intel Corp. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * Kouzmich < Mikhail.V.Kouzmich@intel.com > * * */ #include #include #include #include #include #include #include "hpi_cmd.h" typedef struct { SaHpiResourceIdT rptid; SaHpiInstrumentIdT rdrnum; SaHpiRdrT rdr_entry; } sen_block_env_t; static sen_block_env_t sen_block_env; typedef struct { SaHpiResourceIdT rptid; } hs_block_env_t; static hs_block_env_t hs_block_env; typedef enum { THRES_LI = 0, THRES_LA, THRES_LC, THRES_UI, THRES_UA, THRES_UC, THRES_PH, THRES_NH } thres_enum_t; typedef struct { char *name; char *short_name; } thres_name_def_t; static thres_name_def_t thres_names[] = { { "Lower Minor:", "li" }, { "Lower Major:", "la" }, { "Lower Critical:", "lc" }, { "Upper Minor:", "ui" }, { "Upper Major:", "ua" }, { "Upper Critical:", "uc" }, { "Positive Hysteresis:", "ph" }, { "Negative Hysteresis:", "nh" } }; static void Set_thres_value(SaHpiSensorReadingT *item, double value) { item->IsSupported = 1; switch (item->Type) { case SAHPI_SENSOR_READING_TYPE_INT64: item->Value.SensorInt64 = (SaHpiInt64T)value; break; case SAHPI_SENSOR_READING_TYPE_UINT64: item->Value.SensorUint64 = (SaHpiUint64T)value; break; case SAHPI_SENSOR_READING_TYPE_FLOAT64: item->Value.SensorFloat64 = (SaHpiFloat64T)value; break; case SAHPI_SENSOR_READING_TYPE_BUFFER: break; } } static char *get_thres_value(SaHpiSensorReadingT *item, char *buf, int len) { char *val; if (item->IsSupported != SAHPI_TRUE) return(""); switch (item->Type) { case SAHPI_SENSOR_READING_TYPE_INT64: snprintf(buf, len, "%lld", item->Value.SensorInt64); break; case SAHPI_SENSOR_READING_TYPE_UINT64: snprintf(buf, len, "%llu", item->Value.SensorUint64); break; case SAHPI_SENSOR_READING_TYPE_FLOAT64: snprintf(buf, len, "%10.3f", item->Value.SensorFloat64); break; case SAHPI_SENSOR_READING_TYPE_BUFFER: val = (char *)(item->Value.SensorBuffer); if (val != NULL) { snprintf(buf, len, "%s", val); break; } return(""); }; return(buf); } static int Get_and_set_thres_value(thres_enum_t num, SaHpiSensorReadingT *item) { char tmp[256], str[1024]; float f; int res, modify = 0; if (item->IsSupported) { snprintf(str, 1024, "%s(%s) ==> ", thres_names[num].name, get_thres_value(item, tmp, 256)); res = get_string_param(str, tmp, 256); if (res != 0) return(0); res = sscanf(tmp, "%f", &f); if (res == 1) { modify = 1; Set_thres_value(item, f); } }; return(modify); } static ret_code_t set_threshold_packet(SaHpiSensorThresholdsT *senstbuff) { term_def_t *term; int i; float f; int res; SaHpiSensorReadingT *item; for (;;) { term = get_next_term(); if (term == NULL) break; for (i = 0; i <= THRES_NH; i++) { if (strcmp(term->term, thres_names[i].short_name) == 0) break; }; switch (i) { case THRES_LI: item = &(senstbuff->LowMinor); break; case THRES_LA: item = &(senstbuff->LowMajor); break; case THRES_LC: item = &(senstbuff->LowCritical); break; case THRES_UI: item = &(senstbuff->UpMinor); break; case THRES_UA: item = &(senstbuff->UpMajor); break; case THRES_UC: item = &(senstbuff->UpCritical); break; case THRES_PH: item = &(senstbuff->PosThdHysteresis); break; case THRES_NH: item = &(senstbuff->NegThdHysteresis); break; default: return(HPI_SHELL_PARM_ERROR); }; term = get_next_term(); if (term == NULL) return(HPI_SHELL_PARM_ERROR); res = sscanf(term->term, "%f", &f); if (res != 1) return(HPI_SHELL_PARM_ERROR); Set_thres_value(item, f); }; return(HPI_SHELL_OK); } static ret_code_t set_threshold(SaHpiResourceIdT rptid, SaHpiRdrT *rdr) { SaErrorT rv; SaHpiSensorTypeT type; SaHpiEventCategoryT categ; SaHpiSensorThresholdsT senstbuff; SaHpiSensorRangeT *range; SaHpiSensorNumT num = rdr->RdrTypeUnion.SensorRec.Num; int modify = 0, i; char tmp[256]; ret_code_t ret; rv = saHpiSensorTypeGet(Domain->sessionId, rptid, num, &type, &categ); if (rv != SA_OK) { printf("ERROR: saHpiSensorTypeGet error = %s\n", oh_lookup_error(rv)); return(HPI_SHELL_CMD_ERROR); }; if (categ != SAHPI_EC_THRESHOLD) return(HPI_SHELL_CMD_ERROR); rv = saHpiSensorThresholdsGet(Domain->sessionId, rptid, num, &senstbuff); if (rv != SA_OK) { printf("ERROR: saHpiSensorThresholdsGet error = %s\n", oh_lookup_error(rv)); return(HPI_SHELL_CMD_ERROR); }; if (read_stdin) { printf("Range ("); range = &(rdr->RdrTypeUnion.SensorRec.DataFormat.Range); if ((range->Flags & SAHPI_SRF_MIN) == 0) printf("-"); else printf("%s", get_thres_value(&(range->Min), tmp, 256)); printf(":"); if ((range->Flags & SAHPI_SRF_MAX) == 0) printf("-)\n"); else printf("%s)\n", get_thres_value(&(range->Max), tmp, 256)); if (Get_and_set_thres_value(THRES_LI, &(senstbuff.LowMinor))) modify = 1; if (Get_and_set_thres_value(THRES_LA, &(senstbuff.LowMajor))) modify = 1; if (Get_and_set_thres_value(THRES_LC, &(senstbuff.LowCritical))) modify = 1; if (Get_and_set_thres_value(THRES_UI, &(senstbuff.UpMinor))) modify = 1; if (Get_and_set_thres_value(THRES_UA, &(senstbuff.UpMajor))) modify = 1; if (Get_and_set_thres_value(THRES_UC, &(senstbuff.UpCritical))) modify = 1; if (Get_and_set_thres_value(THRES_PH, &(senstbuff.PosThdHysteresis))) modify = 1; if (Get_and_set_thres_value(THRES_NH, &(senstbuff.NegThdHysteresis))) modify = 1; if (modify == 0) return(HPI_SHELL_OK); print_thres_value(&(senstbuff.LowCritical), thres_names[THRES_LC].name, NULL, 0, ui_print); print_thres_value(&(senstbuff.LowMajor), thres_names[THRES_LA].name, NULL, 0, ui_print); print_thres_value(&(senstbuff.LowMinor), thres_names[THRES_LI].name, NULL, 0, ui_print); print_thres_value(&(senstbuff.UpCritical), thres_names[THRES_UC].name, NULL, 0, ui_print); print_thres_value(&(senstbuff.UpMajor), thres_names[THRES_UA].name, NULL, 0, ui_print); print_thres_value(&(senstbuff.UpMinor), thres_names[THRES_UI].name, NULL, 0, ui_print); print_thres_value(&(senstbuff.PosThdHysteresis), thres_names[THRES_PH].name, NULL, 0, ui_print); print_thres_value(&(senstbuff.NegThdHysteresis), thres_names[THRES_NH].name, NULL, 0, ui_print); i = get_string_param("Set new threshold (yes|no) : ", tmp, 256); if ((i != 0) || (strncmp(tmp, "yes", 3) != 0)) { printf("No action.\n"); return(HPI_SHELL_OK); } } else { ret = set_threshold_packet(&senstbuff); if (ret != HPI_SHELL_OK) return(ret); }; rv = saHpiSensorThresholdsSet(Domain->sessionId, rptid, num, &senstbuff); if (rv != SA_OK) { printf("saHpiSensorThresholdsSet error %s\n", oh_lookup_error(rv)); return(HPI_SHELL_CMD_ERROR); } else printf("Sensor Threshold Value Set Succeed.\n"); return(HPI_SHELL_OK); } ret_code_t sen_block_show(void) { SaErrorT res; res = show_sensor(Domain->sessionId, sen_block_env.rptid, sen_block_env.rdrnum, ui_print); if (res != SA_OK) return(HPI_SHELL_CMD_ERROR); return(HPI_SHELL_OK); } ret_code_t sen_block_setthres(void) { set_threshold(sen_block_env.rptid, &(sen_block_env.rdr_entry)); return(HPI_SHELL_OK); } static ret_code_t sen_block_set_enable(SaHpiBoolT value) { SaHpiBoolT val; SaErrorT rv; char *str; rv = saHpiSensorEnableSet(Domain->sessionId, sen_block_env.rptid, sen_block_env.rdrnum, value); if (rv != SA_OK) { printf("saHpiSensorEnableSet: error: %s\n", oh_lookup_error(rv)); return(HPI_SHELL_CMD_ERROR); }; rv = saHpiSensorEnableGet(Domain->sessionId, sen_block_env.rptid, sen_block_env.rdrnum, &val); if (rv != SA_OK) { printf("saHpiSensorEnableGet: error: %s\n", oh_lookup_error(rv)); return(HPI_SHELL_CMD_ERROR); }; if (val) str = "Enable"; else str = "Disable"; printf("Sensor:(%d/%d) %s\n", sen_block_env.rptid, sen_block_env.rdrnum, str); return(HPI_SHELL_OK); } ret_code_t sen_block_enable(void) { return(sen_block_set_enable(SAHPI_TRUE)); } ret_code_t sen_block_disable(void) { return(sen_block_set_enable(SAHPI_FALSE)); } static ret_code_t sen_block_set_evtenb(SaHpiBoolT value) { SaHpiBoolT val; SaErrorT rv; char *str; rv = saHpiSensorEventEnableSet(Domain->sessionId, sen_block_env.rptid, sen_block_env.rdrnum, value); if (rv != SA_OK) { printf("saHpiSensorEventEnableSet: error: %s\n", oh_lookup_error(rv)); return(HPI_SHELL_CMD_ERROR); }; rv = saHpiSensorEventEnableGet(Domain->sessionId, sen_block_env.rptid, sen_block_env.rdrnum, &val); if (rv != SA_OK) { printf("saHpiSensorEventEnableGet: error: %s\n", oh_lookup_error(rv)); return(HPI_SHELL_CMD_ERROR); }; if (val) str = "Enable"; else str = "Disable"; printf("Sensor:(%d/%d) event %s\n", sen_block_env.rptid, sen_block_env.rdrnum, str); return(HPI_SHELL_OK); } ret_code_t sen_block_evtenb(void) { return(sen_block_set_evtenb(SAHPI_TRUE)); } ret_code_t sen_block_evtdis(void) { return(sen_block_set_evtenb(SAHPI_FALSE)); } static ret_code_t sen_block_set_masks(SaHpiSensorEventMaskActionT act) { SaErrorT rv; char rep[10]; SaHpiEventStateT assert, deassert; int res; char buf[256]; if (act == SAHPI_SENS_ADD_EVENTS_TO_MASKS) { strcpy(rep, "add"); } else { strcpy(rep, "remove"); }; rv = saHpiSensorEventMasksGet(Domain->sessionId, sen_block_env.rptid, sen_block_env.rdrnum, &assert, &deassert); if (rv != SA_OK) { printf("saHpiSensorEventMasksGet: error: %s\n", oh_lookup_error(rv)); return(HPI_SHELL_CMD_ERROR); }; get_hex_int_param("Assert mask = 0x", &res); assert = res; get_hex_int_param("Deassert mask = 0x", &res); deassert = res; if (read_stdin) { snprintf(buf, 256, "Sensor:(%d/%d) %s masks: assert = 0x%4.4x " "deassert = 0x%4.4x (yes/no)?", sen_block_env.rptid, sen_block_env.rdrnum, rep, assert, deassert); get_string_param(buf, rep, 4); if (strcmp(rep, "yes") != 0) { printf("No action.\n"); return(HPI_SHELL_OK); } }; rv = saHpiSensorEventMasksSet(Domain->sessionId, sen_block_env.rptid, sen_block_env.rdrnum, act, assert, deassert); if (rv != SA_OK) { printf("saHpiSensorEventMasksSet: error: %s\n", oh_lookup_error(rv)); return(HPI_SHELL_CMD_ERROR); }; return(HPI_SHELL_OK); } ret_code_t sen_block_maskadd(void) { return(sen_block_set_masks(SAHPI_SENS_ADD_EVENTS_TO_MASKS)); } ret_code_t sen_block_maskrm(void) { return(sen_block_set_masks(SAHPI_SENS_REMOVE_EVENTS_FROM_MASKS)); } static ret_code_t sensor_command_block(SaHpiResourceIdT rptid, SaHpiInstrumentIdT rdrnum, SaHpiRdrT *rdr_entry) { char buf[256]; term_def_t *term; int res; show_sensor(Domain->sessionId, rptid, rdrnum, ui_print); for (;;) { block_type = SEN_COM; res = get_new_command("sensor block ==> "); if (res == 2) { unget_term(); return HPI_SHELL_OK; }; term = get_next_term(); if (term == NULL) continue; snprintf(buf, 256, "%s", term->term); if ((strcmp(buf, "q") == 0) || (strcmp(buf, "quit") == 0)) { break; }; }; return(HPI_SHELL_OK); } ret_code_t sen_block(void) { SaHpiRdrTypeT type; SaErrorT rv; ret_code_t ret; ret = ask_rpt(&(sen_block_env.rptid)); if (ret != HPI_SHELL_OK) return(ret); type = SAHPI_SENSOR_RDR; ret = ask_rdr(sen_block_env.rptid, type, &(sen_block_env.rdrnum)); if (ret != HPI_SHELL_OK) return(ret); rv = saHpiRdrGetByInstrumentId(Domain->sessionId, sen_block_env.rptid, type, sen_block_env.rdrnum, &(sen_block_env.rdr_entry)); if (rv != SA_OK) { printf("ERROR!!! saHpiRdrGetByInstrumentId" "(Rpt=%d RdrType=%d Rdr=%d): %s\n", sen_block_env.rptid, type, sen_block_env.rdrnum, oh_lookup_error(rv)); return(HPI_SHELL_CMD_ERROR); }; ret = sensor_command_block(sen_block_env.rptid, sen_block_env.rdrnum, &(sen_block_env.rdr_entry)); block_type = MAIN_COM; return(ret); } ret_code_t list_sensor(void) { SaErrorT rv; rv = sensor_list(Domain->sessionId, ui_print); if (rv != SA_OK) return(HPI_SHELL_CMD_ERROR); return(HPI_SHELL_OK); } ret_code_t hs_block_policy(void) { SaErrorT rv; rv = saHpiHotSwapPolicyCancel(Domain->sessionId, hs_block_env.rptid); if (rv != SA_OK) { printf("ERROR!!! saHpiHotSwapPolicyCancel: %s\n", oh_lookup_error(rv)); return(HPI_SHELL_CMD_ERROR); }; return(HPI_SHELL_OK); } ret_code_t hs_block_active(void) { SaErrorT rv; rv = saHpiResourceActiveSet(Domain->sessionId, hs_block_env.rptid); if (rv != SA_OK) { printf("ERROR!!! saHpiResourceActiveSet: %s\n", oh_lookup_error(rv)); return(HPI_SHELL_CMD_ERROR); }; return(HPI_SHELL_OK); } ret_code_t hs_block_inact(void) { SaErrorT rv; rv = saHpiResourceInactiveSet(Domain->sessionId, hs_block_env.rptid); if (rv != SA_OK) { printf("ERROR!!! saHpiResourceInactiveSet: %s\n", oh_lookup_error(rv)); return(HPI_SHELL_CMD_ERROR); }; return(HPI_SHELL_OK); } static ret_code_t hs_block_getsettime(int get) { SaErrorT rv; int ins, res, i; char buf[256]; SaHpiTimeoutT timeout; ins = -1; res = get_string_param("Timeout type(insert|extract): ", buf, 256); if (res != 0) { printf("Invalid timeout type"); return(HPI_SHELL_PARM_ERROR); }; if (strcmp(buf, "insert") == 0) ins = 1; if (strcmp(buf, "extract") == 0) ins = 0; if (ins < 0) { printf("Invalid timeout type: %s\n", buf); return(HPI_SHELL_PARM_ERROR); }; if (get) { if (ins) { rv = saHpiAutoInsertTimeoutGet(Domain->sessionId, &timeout); if (rv != SA_OK) { printf("ERROR!!! saHpiAutoInsertTimeoutGet:" " %s\n", oh_lookup_error(rv)); return(HPI_SHELL_CMD_ERROR); }; if ( timeout != SAHPI_TIMEOUT_BLOCK ) { printf("Auto-insert timeout: %lld nsec\n", timeout); } else { printf("Auto-insert timeout: BLOCK\n"); } return(HPI_SHELL_OK); }; rv = saHpiAutoExtractTimeoutGet(Domain->sessionId, hs_block_env.rptid, &timeout); if (rv != SA_OK) { printf("ERROR!!! saHpiAutoExtractTimeoutGet: %s\n", oh_lookup_error(rv)); return(HPI_SHELL_CMD_ERROR); }; if ( timeout != SAHPI_TIMEOUT_BLOCK ) { printf("Auto-extract timeout: %lld nsec\n", timeout); } else { printf("Auto-extract timeout: BLOCK\n"); } return(HPI_SHELL_OK); }; i = get_int_param("Timeout (msec): ", &res); if (i != 1) { printf("Invalid timeout\n"); return(HPI_SHELL_PARM_ERROR); }; if ( res >= 0) { timeout = 1000000LL * res; } else { timeout = SAHPI_TIMEOUT_BLOCK; } if (ins) { rv = saHpiAutoInsertTimeoutSet(Domain->sessionId, timeout); if (rv != SA_OK) { printf("ERROR!!! saHpiAutoInsertTimeoutSet: %s\n", oh_lookup_error(rv)); return(HPI_SHELL_CMD_ERROR); }; return(HPI_SHELL_OK); }; rv = saHpiAutoExtractTimeoutSet(Domain->sessionId, hs_block_env.rptid, timeout); if (rv != SA_OK) { printf("ERROR!!! saHpiAutoExtractTimeoutSet: %s\n", oh_lookup_error(rv)); return(HPI_SHELL_CMD_ERROR); }; return(HPI_SHELL_OK); } ret_code_t hs_block_gtime(void) { return(hs_block_getsettime(1)); } ret_code_t hs_block_stime(void) { return(hs_block_getsettime(0)); } ret_code_t hs_block_state(void) { SaErrorT rv; SaHpiHsStateT state; char *str; rv = saHpiHotSwapStateGet(Domain->sessionId, hs_block_env.rptid, &state); if (rv != SA_OK) { printf("ERROR!!! saHpiHotSwapStateGet: %s\n", oh_lookup_error(rv)); return(HPI_SHELL_CMD_ERROR); } else { switch (state) { case SAHPI_HS_STATE_INACTIVE: str = "Inactive"; break; case SAHPI_HS_STATE_INSERTION_PENDING: str = "Ins. Pending"; break; case SAHPI_HS_STATE_ACTIVE: str = "Active"; break; case SAHPI_HS_STATE_EXTRACTION_PENDING: str = "Ext. Pending"; break; case SAHPI_HS_STATE_NOT_PRESENT: str = "Not present"; break; default: str = "Unknown"; break; }; printf("Hot Swap State: %s\n", str); }; return(HPI_SHELL_OK); } ret_code_t hs_block_action(void) { SaErrorT rv; SaHpiHsActionT action; char buf[256]; int res; res = get_string_param("Action type(insert|extract): ", buf, 256); if (res != 0) { printf("Invalid action type"); return(HPI_SHELL_PARM_ERROR); }; if (strcmp(buf, "insert") == 0) action = SAHPI_HS_ACTION_INSERTION; else if (strcmp(buf, "extract") == 0) action = SAHPI_HS_ACTION_EXTRACTION; else { printf("Invalid action type: %s\n", buf); return(HPI_SHELL_PARM_ERROR); }; rv = saHpiHotSwapActionRequest(Domain->sessionId, hs_block_env.rptid, action); if (rv != SA_OK) { printf("ERROR!!! saHpiHotSwapActionRequest: %s\n", oh_lookup_error(rv)); return(HPI_SHELL_CMD_ERROR); }; return(HPI_SHELL_OK); } ret_code_t hs_block_ind(void) { SaErrorT rv; int res; char buf[256]; SaHpiHsIndicatorStateT ind_state; char *str; res = get_string_param("Action type(get|on|off): ", buf, 256); if (res != 0) { printf("Invalid action type"); return(HPI_SHELL_PARM_ERROR); }; if (strcmp(buf, "get") == 0) { rv = saHpiHotSwapIndicatorStateGet(Domain->sessionId, hs_block_env.rptid, &ind_state); if (rv != SA_OK) { printf("ERROR!!! saHpiHotSwapIndicatorStateGet: %s\n", oh_lookup_error(rv)); return(HPI_SHELL_CMD_ERROR); }; if (ind_state == SAHPI_HS_INDICATOR_OFF) str = "OFF"; else str = "ON"; printf("Hot Swap Indicator: %s\n", str); return(HPI_SHELL_OK); }; if (strcmp(buf, "on") == 0) ind_state = SAHPI_HS_INDICATOR_ON; else if (strcmp(buf, "off") == 0) ind_state = SAHPI_HS_INDICATOR_OFF; else { printf("Invalid action type: %s\n", buf); return(HPI_SHELL_PARM_ERROR); }; rv = saHpiHotSwapIndicatorStateSet(Domain->sessionId, hs_block_env.rptid, ind_state); if (rv != SA_OK) { printf("ERROR!!! saHpiHotSwapIndicatorStateSet: %s\n", oh_lookup_error(rv)); return(HPI_SHELL_CMD_ERROR); }; return(HPI_SHELL_OK); } ret_code_t hs_block(void) { SaHpiResourceIdT rptid; char buf[256]; ret_code_t ret; term_def_t *term; int res; ret = ask_rpt(&rptid); if (ret != HPI_SHELL_OK) return(ret); hs_block_env.rptid = rptid; for (;;) { block_type = HS_COM; res = get_new_command("Hot swap block ==> "); if (res == 2) { unget_term(); block_type = MAIN_COM; return HPI_SHELL_OK; }; term = get_next_term(); if (term == NULL) continue; snprintf(buf, 256, "%s", term->term); if ((strcmp(buf, "q") == 0) || (strcmp(buf, "quit") == 0)) break; }; block_type = MAIN_COM; return SA_OK; } openhpi-2.14.1/hpi_shell/session.c0000644000076400007640000001603211302567132013771 0ustar /* -*- linux-c -*- * * Copyright (c) 2004 by Intel Corp. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Racing Guo * Aaron Chen * Changes: * 11.30.2004 - Kouzmich: porting to HPI-B * * */ #include #include #include #include #include #include #include #include #include "hpi_cmd.h" static pthread_t ge_thread; static pthread_t prog_thread; int prt_flag = 0; int show_event_short = 0; static int in_progress = 0; static GCond *thread_wait = NULL; static GMutex *thread_mutex = NULL; static char *progress_mes; Domain_t *Domain; // curreny domain GSList *domainlist; // domain list #define PROGRESS_BUF_SIZE 80 /* Progress bar implementation */ static void* progress_bar(void *unused) { GTimeVal time; char buf[PROGRESS_BUF_SIZE], A[20]; int i = 0, t = 0, len, mes_len; memset(buf, 0, PROGRESS_BUF_SIZE); mes_len = strlen(progress_mes); while (in_progress) { snprintf(A, 10, " %d.%d s ", t / 10, t % 10); len = strlen(A); memset(buf + mes_len, '.', i); strncpy(buf, progress_mes, mes_len); if (i > 8) strncpy(buf + mes_len + (i - len) / 2, A, len); printf("%s\r", buf); fflush(stdout); g_get_current_time(&time); g_time_val_add(&time, G_USEC_PER_SEC / 10); g_cond_timed_wait(thread_wait, thread_mutex, &time); if (i < (PROGRESS_BUF_SIZE - mes_len - 1)) i++; t++; }; g_thread_exit(0); return (void *)1; } /* This function creates thread for progress bar. * mes - progress bar title. */ void do_progress(char *mes) { progress_mes = mes; in_progress = 1; pthread_create(&prog_thread, NULL, progress_bar, NULL); } /* This function deletes thread for progress bar. */ void delete_progress() { char buf[PROGRESS_BUF_SIZE]; in_progress = 0; memset(buf, ' ', PROGRESS_BUF_SIZE); buf[PROGRESS_BUF_SIZE - 1] = 0; printf("%s\n", buf); } static void* get_event(void *unused) { SaHpiEventT event; SaErrorT rv; SaHpiRptEntryT rptentry; SaHpiRdrT rdr; SaHpiEntryIdT rptentryid; SaHpiEntryIdT nextrptentryid; rv = saHpiSubscribe(Domain->sessionId); if (rv != SA_OK) { printf("OpenHPI>Fail to Subscribe event\n"); return (void *)0; } while(1) { for(;;) { rdr.RdrType = SAHPI_NO_RECORD; rptentry.ResourceId = 0; memset(&event, 0xF, sizeof(event)); rv = saHpiEventGet(Domain->sessionId, SAHPI_TIMEOUT_BLOCK, &event, &rdr, &rptentry, NULL); if (rv != SA_OK ) { printf("saHpiEventGet failed with error <%d>\n", rv); break; } if (prt_flag == 1) { if (show_event_short) show_short_event(&event, ui_print); else if (rdr.RdrType != SAHPI_NO_RECORD) oh_print_event(&event, &rdr.Entity, 4); else if (rptentry.ResourceId != 0) oh_print_event(&event, &rptentry.ResourceEntity, 4); else { rptentryid = event.Source; rv = saHpiRptEntryGet(Domain->sessionId, rptentryid, &nextrptentryid, &rptentry); if(rv == SA_OK) oh_print_event(&event, &rptentry.ResourceEntity, 4); else { oh_print_event(&event, NULL, 4); } } } }/*the loop for retrieving event*/ sleep(1); } return (void *)1; } void set_Subscribe(Domain_t *domain, int as) // as = 1 - Subscribe // as = 0 - UnSubscribe // if domain == NULL - for all opened domains { int i, n; gpointer ptr; Domain_t *dmn; if ((domain != (Domain_t *)NULL) && domain->session_opened) { if (as) saHpiSubscribe(domain->sessionId); else saHpiUnsubscribe(domain->sessionId); return; }; n = g_slist_length(domainlist); for (i = 0; i < n; i++) { ptr = g_slist_nth_data(domainlist, i); if (ptr == (gpointer)NULL) return; dmn = (Domain_t *)ptr; if (dmn->session_opened) { if (as) saHpiSubscribe(dmn->sessionId); else saHpiUnsubscribe(dmn->sessionId); } } } SaErrorT get_sessionId(Domain_t *domain) { SaErrorT rv; SaHpiDomainInfoT info; if (domain->session_opened) return(SA_OK); rv = saHpiSessionOpen(domain->domainId, &(domain->sessionId), NULL); if (rv != SA_OK) { printf("saHpiSessionOpen error %s\n", oh_lookup_error(rv)); return rv; }; domain->session_opened = 1; rv = saHpiDomainInfoGet(domain->sessionId, &info); if (rv != SA_OK) { printf("ERROR!!! saHpiDomainInfoGet: %s\n", oh_lookup_error(rv)); return(rv); }; domain->domainId = info.DomainId; return(SA_OK); } SaErrorT do_discover(Domain_t *domain) { SaErrorT rv; if (!domain->sessionId) { rv = get_sessionId(domain); if (rv != SA_OK) return(-1); }; if (domain->discovered) return(SA_OK); do_progress("Discover"); rv = saHpiDiscover(domain->sessionId); if (rv != SA_OK) { delete_progress(); printf("saHpiDiscover error %s\n", oh_lookup_error(rv)); return rv; }; delete_progress(); domain->discovered = 1; printf("Discovery done\n"); return(SA_OK); } int add_domain(Domain_t *domain) { SaErrorT rv; GSList *ptr; rv = do_discover(domain); if (rv != SA_OK) return(-1); ptr = g_slist_find(domainlist, domain); if (ptr == (GSList *)NULL) domainlist = g_slist_append(domainlist, domain); return(0); } int open_session(int eflag) { Domain_t *par_domain; if (!g_thread_supported()) { g_thread_init(NULL); }; thread_wait = g_cond_new(); thread_mutex = g_mutex_new(); par_domain = (Domain_t *)malloc(sizeof(Domain_t)); memset(par_domain, 0, sizeof(Domain_t)); par_domain->domainId = SAHPI_UNSPECIFIED_DOMAIN_ID; if (get_sessionId(par_domain) != SA_OK) return(-1); // set current domain Domain = par_domain; if (eflag) { show_event_short = 1; prt_flag = 1; pthread_create(&ge_thread, NULL, get_event, NULL); }; // add main domain to the domain list if (add_domain(par_domain) != SA_OK) return(-1); printf("\tEnter a command or \"help\" for list of commands\n"); if (! eflag) pthread_create(&ge_thread, NULL, get_event, NULL); return 0; } int close_session() { SaErrorT rv; /* Bug 2171901, replace pthread_kill(ge_thread, SIGKILL); */ pthread_cancel(ge_thread); rv = saHpiSessionClose(Domain->sessionId); if (rv != SA_OK) { printf("saHpiSessionClose error %s\n", oh_lookup_error(rv)); return -1; } return 0; } openhpi-2.14.1/hpi_shell/service.c0000644000076400007640000010112111302567132013740 0ustar /* -*- linux-c -*- * * Copyright (c) 2004 by Intel Corp. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * Kouzmich < Mikhail.V.Kouzmich@intel.com > * */ #include #include #include #include #include // function numbers for lookup_proc #define LANG_PROC 1 #define TAGTYPE_PROC 2 #define RDRTYPE_PROC 3 #define SENREADT_PROC 4 #define SENUNIT_PROC 5 #define SENMODU_PROC 6 #define SENTYPE_PROC 7 #define CATEGORY_PROC 8 #define CTRLTYPE_PROC 9 #define CTRLMODE_PROC 10 #define CTRLOUTPUT_PROC 11 #define CTRLDIGIT_PROC 12 #define SEVERITY_PROC 13 #define EVENTCTRL_PROC 14 // function numbers for decode_proc #define EPATH_PROC 1 // function numbers for decode1_proc #define CAPAB_PROC 1 #define HSCAPAB_PROC 2 #define THDMASK_PROC 3 #define RANGEMASK_PROC 4 extern char *lookup_proc(int num, int val); extern SaErrorT decode_proc(int num, void *val, char *buf, int bufsize); extern SaErrorT decode1_proc(int num, int val, char *buf, int bufsize); extern SaErrorT thres_value(SaHpiSensorReadingT *item, char *buf, int size); #define RPT_ATTRS_NUM 9 attr_t Def_rpt[] = { { "EntryId", INT_TYPE, 0, { .d = 0} }, // 0 { "ResourceId", INT_TYPE, 0, { .d = 0} }, // 1 { "ResourceInfo", STRUCT_TYPE, 0, { .d = 0} }, // 2 { "ResourceEntity", DECODE_TYPE, EPATH_PROC, { .d = 0} }, // 3 { "Capabilities", DECODE1_TYPE, CAPAB_PROC, { .d = 0} }, // 4 { "HotSwapCapabilities",DECODE1_TYPE, HSCAPAB_PROC, { .d = 0} }, // 5 { "ResourceSeverity", LOOKUP_TYPE, SEVERITY_PROC, { .d = 0} }, // 6 { "ResourceFailed", BOOL_TYPE, 0, { .d = 0} }, // 7 { "Tag", TEXT_BUFF_TYPE, 0, { .d = 0} } // 8 }; #define RESINFO_ATTRS_NUM 9 attr_t Def_resinfo[] = { { "ResourceRev", INT_TYPE, 0, { .d = 0} }, // 0 { "SpecificVer", INT_TYPE, 0, { .d = 0} }, // 1 { "DeviceSupport", INT_TYPE, 0, { .d = 0} }, // 2 { "ManufacturerId", INT_TYPE, 0, { .d = 0} }, // 3 { "ProductId", INT_TYPE, 0, { .d = 0} }, // 4 { "FirmwareMajorRev", INT_TYPE, 0, { .d = 0} }, // 5 { "FirmwareMinorRev", INT_TYPE, 0, { .d = 0} }, // 6 { "AuxFirmwareRev", INT_TYPE, 0, { .d = 0} }, // 7 { "Guid", STR_TYPE, 0, { .d = 0} } // 8 }; char *lookup_proc(int num, int val) { char *string = (char *)NULL; switch (num) { case LANG_PROC: string = oh_lookup_language(val); break; case TAGTYPE_PROC: string = oh_lookup_texttype(val); break; case RDRTYPE_PROC: string = oh_lookup_rdrtype(val); break; case SENREADT_PROC: string = oh_lookup_sensorreadingtype(val); break; case SENUNIT_PROC: string = oh_lookup_sensorunits(val); break; case SENMODU_PROC: string = oh_lookup_sensormodunituse(val); break; case SENTYPE_PROC: string = oh_lookup_sensortype(val); break; case CATEGORY_PROC: string = oh_lookup_eventcategory(val); break; case CTRLTYPE_PROC: string = oh_lookup_ctrltype(val); break; case CTRLMODE_PROC: string = oh_lookup_ctrlmode(val); break; case CTRLOUTPUT_PROC: string = oh_lookup_ctrloutputtype(val); break; case CTRLDIGIT_PROC: string = oh_lookup_ctrlstatedigital(val); break; case SEVERITY_PROC: string = oh_lookup_severity(val); break; case EVENTCTRL_PROC: string = oh_lookup_sensoreventctrl(val); break; }; if (string == (char *)NULL) return(""); return(string); } SaErrorT decode_proc(int num, void *val, char *buf, int bufsize) { oh_big_textbuffer tmpbuf; SaErrorT rv; oh_init_bigtext(&tmpbuf); memset(buf, 0, bufsize); switch (num) { case EPATH_PROC: rv = oh_decode_entitypath((SaHpiEntityPathT *)val, &tmpbuf); if (rv != SA_OK) return(-1); break; }; strncpy(buf, (char *)(tmpbuf.Data), bufsize); return(SA_OK); } static void oh_threshold_mask(SaHpiSensorThdMaskT mask, char *buf, int bufsize) { char tmp[256]; int ind; memset(buf, 0, 256); if (mask == 0) return; strcpy(tmp, "{ "); if (mask & SAHPI_STM_LOW_MINOR) strcat(tmp, "LOW_MINOR | "); if (mask & SAHPI_STM_LOW_MAJOR) strcat(tmp, "LOW_MAJOR | "); if (mask & SAHPI_STM_LOW_CRIT) strcat(tmp, "LOW_CRIT | "); if (mask & SAHPI_STM_LOW_HYSTERESIS) strcat(tmp, "LOW_HYSTERESIS | "); if (mask & SAHPI_STM_UP_MINOR) strcat(tmp, "UP_MINOR | "); if (mask & SAHPI_STM_UP_MAJOR) strcat(tmp, "UP_MAJOR | "); if (mask & SAHPI_STM_UP_CRIT) strcat(tmp, "UP_CRIT | "); if (mask & SAHPI_STM_UP_HYSTERESIS) strcat(tmp, "UP_HYSTERESIS | "); ind = strlen(tmp); /* Remove last delimiter */ if (tmp[ind - 2] == '{') // null mask return; tmp[ind - 2] = '}'; tmp[ind - 1] = 0; strncpy(buf, tmp, bufsize); return; } static void oh_range_mask(SaHpiSensorRangeFlagsT mask, char *buf, int bufsize) { char tmp[256]; int ind; memset(buf, 0, 256); if (mask == 0) return; strcpy(tmp, "{ "); if (mask & SAHPI_SRF_MIN) strcat(tmp, "MIN | "); if (mask & SAHPI_SRF_MAX) strcat(tmp, "MAX | "); if (mask & SAHPI_SRF_NORMAL_MIN) strcat(tmp, "NORMAL MIN | "); if (mask & SAHPI_SRF_NORMAL_MAX) strcat(tmp, "NORMAL MAX | "); if (mask & SAHPI_SRF_NOMINAL) strcat(tmp, "NOMINAL | "); ind = strlen(tmp); /* Remove last delimiter */ if (tmp[ind - 2] == '{') // null mask return; tmp[ind - 2] = '}'; tmp[ind - 1] = 0; strncpy(buf, tmp, bufsize); return; } SaErrorT decode1_proc(int num, int val, char *buf, int bufsize) { SaHpiTextBufferT tbuf; SaErrorT rv; memset(buf, 0, bufsize); switch (num) { case CAPAB_PROC: rv = oh_decode_capabilities(val, &tbuf); if (rv != SA_OK) return(-1); break; case HSCAPAB_PROC: rv = oh_decode_hscapabilities(val, &tbuf); if (rv != SA_OK) return(-1); break; case THDMASK_PROC: oh_threshold_mask(val, buf, bufsize); return(SA_OK); case RANGEMASK_PROC: oh_range_mask(val, buf, bufsize); return(SA_OK); }; strncpy(buf, (char *)(tbuf.Data), bufsize); return(SA_OK); } SaErrorT thres_value(SaHpiSensorReadingT *item, char *buf, int size) { char *val; int i, n; memset(buf, 0, size); if (item->IsSupported != SAHPI_TRUE) return(-1); switch (item->Type) { case SAHPI_SENSOR_READING_TYPE_INT64: snprintf(buf, size, "%lld", item->Value.SensorInt64); break; case SAHPI_SENSOR_READING_TYPE_UINT64: snprintf(buf, size, "%llu", item->Value.SensorUint64); break; case SAHPI_SENSOR_READING_TYPE_FLOAT64: snprintf(buf, size, "%10.3f", item->Value.SensorFloat64); break; case SAHPI_SENSOR_READING_TYPE_BUFFER: val = (char *)(item->Value.SensorBuffer); if (val == NULL ) { return(-1); } n = ( SAHPI_SENSOR_BUFFER_LENGTH > ( size / 2 ) ) ? ( size / 2 ) : SAHPI_SENSOR_BUFFER_LENGTH; buf[0] = '\0'; for (i = 0; i < n; ++i) { sprintf( buf + 2 * i, "%02x", val[i] ); } }; return(SA_OK); } static int find_attr(Attributes_t *attrs, char *name) { int i; for (i = 0; i < attrs->n_attrs; i++) { if (strcmp(attrs->Attrs[i].name, name) == 0) return(i); }; return(-1); } void make_attrs_rpt(Rpt_t *Rpt, SaHpiRptEntryT *rptentry) { attr_t *att, *att1; int i = 0; Attributes_t *at; SaHpiRptEntryT *obj; Rpt->Table = *rptentry; obj = &(Rpt->Table); Rpt->Attrutes.n_attrs = RPT_ATTRS_NUM; Rpt->Attrutes.Attrs = (attr_t *)malloc(sizeof(attr_t) * RPT_ATTRS_NUM); memcpy(Rpt->Attrutes.Attrs, Def_rpt, sizeof(attr_t) * RPT_ATTRS_NUM); att = Rpt->Attrutes.Attrs; att[i++].value.i = obj->EntryId; att[i++].value.i = obj->ResourceId; at = (Attributes_t *)malloc(sizeof(Attributes_t)); at->n_attrs = RESINFO_ATTRS_NUM; att1 = (attr_t *)malloc(sizeof(attr_t) * RESINFO_ATTRS_NUM); memcpy(att1, Def_resinfo, sizeof(attr_t) * RESINFO_ATTRS_NUM); at->Attrs = att1; att[i++].value.a = at; att1[0].value.i = obj->ResourceInfo.ResourceRev; att1[1].value.i = obj->ResourceInfo.SpecificVer; att1[2].value.i = obj->ResourceInfo.DeviceSupport; att1[3].value.i = obj->ResourceInfo.ManufacturerId; att1[4].value.i = obj->ResourceInfo.ProductId; att1[5].value.i = obj->ResourceInfo.FirmwareMajorRev; att1[6].value.i = obj->ResourceInfo.FirmwareMinorRev; att1[7].value.i = obj->ResourceInfo.AuxFirmwareRev; att1[8].value.s = (char *)(obj->ResourceInfo.Guid); att[i++].value.a = &(obj->ResourceEntity); att[i++].value.i = obj->ResourceCapabilities; att[i++].value.i = obj->HotSwapCapabilities; att[i++].value.i = obj->ResourceSeverity; att[i++].value.i = obj->ResourceFailed; att[i++].value.a = &(obj->ResourceTag); } #define RDR_ATTRS_COMMON_NUM 6 attr_t Def_common_rdr[] = { { "RecordId", INT_TYPE, 0, { .d = 0} }, // 0 { "RdrType", LOOKUP_TYPE, RDRTYPE_PROC, { .d = 0} }, // 1 { "EntityPath", DECODE_TYPE, EPATH_PROC, { .d = 0} }, // 2 { "IsFru", BOOL_TYPE, 0, { .d = 0} }, // 3 { "Record", STRUCT_TYPE, 0, { .d = 0} }, // 4 { "IdString", TEXT_BUFF_TYPE, 0, { .d = 0} } // 5 }; #define RDR_ATTRS_SENSOR_NUM 9 attr_t Def_sensor_rdr[] = { { "Num", INT_TYPE, 0, { .d = 0} }, // 0 { "Type", LOOKUP_TYPE, SENTYPE_PROC, { .d = 0} }, // 1 { "Category", LOOKUP_TYPE, CATEGORY_PROC, { .d = 0} }, // 2 { "EnableCtrl", BOOL_TYPE, 0, { .d = 0} }, // 3 { "EventCtrl", LOOKUP_TYPE, EVENTCTRL_PROC, { .d = 0} }, // 4 { "Events", HEX_TYPE, 0, { .d = 0} }, // 5 { "DataFormat", STRUCT_TYPE, 0, { .d = 0} }, // 6 { "ThresholdDefn", STRUCT_TYPE, 0, { .d = 0} }, // 7 { "Oem", INT_TYPE, 0, { .d = 0} } // 8 }; #define ATTRS_SENSOR_DATAFORMAT 8 attr_t DataForm_rdr[] = { { "IsSupported", BOOL_TYPE, 0, { .d = 0} }, // 0 { "ReadingType", LOOKUP_TYPE, SENREADT_PROC, { .d = 0} }, // 1 { "BaseUnits", LOOKUP_TYPE, SENUNIT_PROC, { .d = 0} }, // 2 { "ModifierUnits", LOOKUP_TYPE, SENUNIT_PROC, { .d = 0} }, // 3 { "ModifierUse", LOOKUP_TYPE, SENMODU_PROC, { .d = 0} }, // 4 { "Percentage", BOOL_TYPE, 0, { .d = 0} }, // 5 { "Range", STRUCT_TYPE, 0, { .d = 0} }, // 6 { "AccuracyFactor", FLOAT_TYPE, 0, { .d = 0} } // 7 }; #define ATTRS_SENSOR_THDDEF 4 attr_t ThresDef_rdr[] = { { "IsAccessible", BOOL_TYPE, 0, { .d = 0} }, // 0 { "ReadMask", DECODE1_TYPE, THDMASK_PROC, { .d = 0} }, // 1 { "WriteMask", DECODE1_TYPE, THDMASK_PROC, { .d = 0} }, // 2 { "Nonlinear", BOOL_TYPE, 0, { .d = 0} } // 3 }; #define ATTRS_SENSOR_RANGE 6 attr_t Range_rdr[] = { { "Flags", DECODE1_TYPE, RANGEMASK_PROC, { .d = 0} }, // 0 { "Max", READING_TYPE, 0, { .d = 0} }, // 1 { "Min", READING_TYPE, 0, { .d = 0} }, // 2 { "Nominal", READING_TYPE, 0, { .d = 0} }, // 3 { "NormalMax", READING_TYPE, 0, { .d = 0} }, // 4 { "NormalMin", READING_TYPE, 0, { .d = 0} } // 5 }; static Attributes_t *make_attrs_sensor(SaHpiSensorRecT *sensor) { attr_t *att1, *att2, *att3; Attributes_t *at, *at2, *at3; at = (Attributes_t *)malloc(sizeof(Attributes_t)); at->n_attrs = RDR_ATTRS_SENSOR_NUM; att1 = (attr_t *)malloc(sizeof(attr_t) * RDR_ATTRS_SENSOR_NUM); memcpy(att1, Def_sensor_rdr, sizeof(attr_t) * RDR_ATTRS_SENSOR_NUM); at->Attrs = att1; att1[0].value.i = sensor->Num; att1[1].value.i = sensor->Type; att1[2].value.i = sensor->Category; att1[3].value.i = sensor->EnableCtrl; att1[4].value.i = sensor->EventCtrl; att1[5].value.i = sensor->Events; at2 = (Attributes_t *)malloc(sizeof(Attributes_t)); at2->n_attrs = ATTRS_SENSOR_DATAFORMAT; att2 = (attr_t *)malloc(sizeof(attr_t) * ATTRS_SENSOR_DATAFORMAT); memcpy(att2, DataForm_rdr, sizeof(attr_t) * ATTRS_SENSOR_DATAFORMAT); at2->Attrs = att2; att2[0].value.i = sensor->DataFormat.IsSupported; att2[1].value.i = sensor->DataFormat.ReadingType; att2[2].value.i = sensor->DataFormat.BaseUnits; att2[3].value.i = sensor->DataFormat.ModifierUnits; att2[4].value.i = sensor->DataFormat.ModifierUse; att2[5].value.i = sensor->DataFormat.Percentage; at3 = (Attributes_t *)malloc(sizeof(Attributes_t)); at3->n_attrs = ATTRS_SENSOR_RANGE; att3 = (attr_t *)malloc(sizeof(attr_t) * ATTRS_SENSOR_RANGE); memcpy(att3, Range_rdr, sizeof(attr_t) * ATTRS_SENSOR_RANGE); at3->Attrs = att3; att3[0].value.i = sensor->DataFormat.Range.Flags; att3[1].value.a = &(sensor->DataFormat.Range.Max); att3[2].value.a = &(sensor->DataFormat.Range.Min); att3[3].value.a = &(sensor->DataFormat.Range.Nominal); att3[4].value.a = &(sensor->DataFormat.Range.NormalMax); att3[5].value.a = &(sensor->DataFormat.Range.NormalMin); att2[6].value.a = at3; att2[7].value.d = sensor->DataFormat.AccuracyFactor; att1[6].value.a = at2; at2 = (Attributes_t *)malloc(sizeof(Attributes_t)); at2->n_attrs = ATTRS_SENSOR_THDDEF; att2 = (attr_t *)malloc(sizeof(attr_t) * ATTRS_SENSOR_THDDEF); memcpy(att2, ThresDef_rdr, sizeof(attr_t) * ATTRS_SENSOR_THDDEF); att2[0].value.i = sensor->ThresholdDefn.IsAccessible; att2[1].value.i = sensor->ThresholdDefn.ReadThold; att2[2].value.i = sensor->ThresholdDefn.WriteThold; at2->Attrs = att2; att1[7].value.a = at2; att1[8].value.i = sensor->Oem; return(at); } #define RDR_ATTRS_CTRL_NUM 7 attr_t Def_ctrl_rdr[] = { { "Num", INT_TYPE, 0, { .d = 0} }, // 0 { "Type", LOOKUP_TYPE, CTRLTYPE_PROC, { .d = 0} }, // 1 { "OutputType", LOOKUP_TYPE, CTRLOUTPUT_PROC, { .d = 0} }, // 2 { "TypeUnion", STRUCT_TYPE, 0, { .d = 0} }, // 3 { "DefaultMode", STRUCT_TYPE, 0, { .d = 0} }, // 4 { "WriteOnly", BOOL_TYPE, 0, { .d = 0} }, // 5 { "Oem", INT_TYPE, 0, { .d = 0} } // 6 }; #define ATTRS_CTRL_MODE 2 attr_t Def_ctrl_mode[] = { { "Mode", LOOKUP_TYPE, CTRLMODE_PROC, { .d = 0} }, // 0 { "ReadOnly", BOOL_TYPE, 0, { .d = 0} } // 1 }; #define ATTRS_CTRL_DIGITAL 1 attr_t Def_ctrl_digital[] = { { "Default", LOOKUP_TYPE, CTRLDIGIT_PROC, { .d = 0} } // 0 }; #define ATTRS_CTRL_DISCRETE 1 attr_t Def_ctrl_discrete[] = { { "Default", INT_TYPE, 0, { .d = 0} } // 0 }; #define ATTRS_CTRL_ANALOG 3 attr_t Def_ctrl_analog[] = { { "Min", INT_TYPE, 0, { .d = 0} }, // 0 { "Max", INT_TYPE, 0, { .d = 0} }, // 1 { "Default", INT_TYPE, 0, { .d = 0} } // 2 }; #define ATTRS_CTRL_STREAM 3 attr_t Def_ctrl_stream[] = { { "Repeat", BOOL_TYPE, 0, { .d = 0} }, // 0 { "Length", INT_TYPE, 0, { .d = 0} }, // 1 { "Stream", STR_TYPE, 0, { .d = 0} } // 2 }; #define ATTRS_CTRL_TEXT 5 attr_t Def_ctrl_text[] = { { "MaxChars", INT_TYPE, 0, { .d = 0} }, // 0 { "MaxLines", INT_TYPE, 0, { .d = 0} }, // 1 { "Language", LOOKUP_TYPE, LANG_PROC, { .d = 0} }, // 2 { "DataType", LOOKUP_TYPE, TAGTYPE_PROC, { .d = 0} }, // 3 { "Default", STR_TYPE, 0, { .d = 0} } // 4 }; #define ATTRS_CTRL_TEXT_DEFAULT 2 attr_t Def_ctrl_text_def[] = { { "Line", INT_TYPE, 0, { .d = 0} }, // 0 { "Text", TEXT_BUFF_TYPE, 0, { .d = 0} } // 4 }; static Attributes_t *make_attrs_ctrl(SaHpiCtrlRecT *ctrl) { attr_t *att1, *att2, *att3; Attributes_t *at, *at2, *at3; SaHpiCtrlRecDigitalT *digital; SaHpiCtrlRecDiscreteT *discrete; SaHpiCtrlRecAnalogT *analog; SaHpiCtrlRecStreamT *stream; SaHpiCtrlRecTextT *text; at = (Attributes_t *)malloc(sizeof(Attributes_t)); at->n_attrs = RDR_ATTRS_CTRL_NUM; att1 = (attr_t *)malloc(sizeof(attr_t) * RDR_ATTRS_CTRL_NUM); memcpy(att1, Def_ctrl_rdr, sizeof(attr_t) * RDR_ATTRS_CTRL_NUM); at->Attrs = att1; att1[0].value.i = ctrl->Num; att1[1].value.i = ctrl->Type; att1[2].value.i = ctrl->OutputType; switch (ctrl->Type) { case SAHPI_CTRL_TYPE_DIGITAL: digital = &(ctrl->TypeUnion.Digital); att1[3].name = "Digital"; at2 = (Attributes_t *)malloc(sizeof(Attributes_t)); at2->n_attrs = ATTRS_CTRL_DIGITAL; att2 = (attr_t *)malloc(sizeof(attr_t) * ATTRS_CTRL_DIGITAL); memcpy(att2, Def_ctrl_digital, sizeof(attr_t) * ATTRS_CTRL_DIGITAL); at2->Attrs = att2; att2[0].value.i = digital->Default; att1[3].value.a = at2; break; case SAHPI_CTRL_TYPE_DISCRETE: discrete = &(ctrl->TypeUnion.Discrete); att1[3].name = "Discrete"; at2 = (Attributes_t *)malloc(sizeof(Attributes_t)); at2->n_attrs = ATTRS_CTRL_DISCRETE; att2 = (attr_t *)malloc(sizeof(attr_t) * ATTRS_CTRL_DISCRETE); memcpy(att2, Def_ctrl_discrete, sizeof(attr_t) * ATTRS_CTRL_DISCRETE); at2->Attrs = att2; att2[0].value.i = discrete->Default; att1[3].value.a = at2; break; case SAHPI_CTRL_TYPE_ANALOG: analog = &(ctrl->TypeUnion.Analog); att1[3].name = "Analog"; at2 = (Attributes_t *)malloc(sizeof(Attributes_t)); at2->n_attrs = ATTRS_CTRL_ANALOG; att2 = (attr_t *)malloc(sizeof(attr_t) * ATTRS_CTRL_ANALOG); memcpy(att2, Def_ctrl_analog, sizeof(attr_t) * ATTRS_CTRL_ANALOG); at2->Attrs = att2; att2[0].value.i = analog->Min; att2[1].value.i = analog->Max; att2[2].value.i = analog->Default; att1[3].value.a = at2; break; case SAHPI_CTRL_TYPE_STREAM: stream = &(ctrl->TypeUnion.Stream); att1[3].name = "Stream"; at2 = (Attributes_t *)malloc(sizeof(Attributes_t)); at2->n_attrs = ATTRS_CTRL_STREAM; att2 = (attr_t *)malloc(sizeof(attr_t) * ATTRS_CTRL_STREAM); memcpy(att2, Def_ctrl_stream, sizeof(attr_t) * ATTRS_CTRL_STREAM); at2->Attrs = att2; att2[0].value.i = stream->Default.Repeat; att2[1].value.i = stream->Default.StreamLength; att2[2].value.s = (char *)(stream->Default.Stream); att1[3].value.a = at2; break; case SAHPI_CTRL_TYPE_TEXT: text = &(ctrl->TypeUnion.Text); att1[3].name = "Text"; at2 = (Attributes_t *)malloc(sizeof(Attributes_t)); at2->n_attrs = ATTRS_CTRL_TEXT; att2 = (attr_t *)malloc(sizeof(attr_t) * ATTRS_CTRL_TEXT); memcpy(att2, Def_ctrl_text, sizeof(attr_t) * ATTRS_CTRL_TEXT); at2->Attrs = att2; att2[0].value.i = text->MaxChars; att2[1].value.i = text->MaxLines; att2[2].value.i = text->Language; att2[3].value.i = text->DataType; at3 = (Attributes_t *)malloc(sizeof(Attributes_t)); at3->n_attrs = ATTRS_CTRL_TEXT_DEFAULT; att3 = (attr_t *)malloc(sizeof(attr_t) * ATTRS_CTRL_TEXT_DEFAULT); memcpy(att3, Def_ctrl_text_def, sizeof(attr_t) * ATTRS_CTRL_TEXT_DEFAULT); at3->Attrs = att3; att3[0].value.i = text->Default.Line; att3[1].value.a = &(text->Default.Text); att2[4].value.a = at3; att1[3].value.a = at2; break; default: att1[3].name = "Digital"; att1[3].type = NO_TYPE; }; at2 = (Attributes_t *)malloc(sizeof(Attributes_t)); at2->n_attrs = ATTRS_CTRL_MODE; att2 = (attr_t *)malloc(sizeof(attr_t) * ATTRS_CTRL_MODE); memcpy(att2, Def_ctrl_mode, sizeof(attr_t) * ATTRS_CTRL_MODE); at2->Attrs = att2; att2[0].value.i = ctrl->DefaultMode.Mode; att2[1].value.i = ctrl->DefaultMode.ReadOnly; att1[4].value.a = at2; att1[5].value.i = ctrl->WriteOnly; att1[6].value.i = ctrl->Oem; return(at); } #define RDR_ATTRS_INV_NUM 3 attr_t Def_inv_rdr[] = { { "IdrId", INT_TYPE, 0, { .d = 0} }, // 0 { "Persistent", BOOL_TYPE, 0, { .d = 0} }, // 1 { "Oem", INT_TYPE, 0, { .d = 0} } // 2 }; static Attributes_t *make_attrs_inv(SaHpiInventoryRecT *inv) { attr_t *att1; Attributes_t *at; at = (Attributes_t *)malloc(sizeof(Attributes_t)); at->n_attrs = RDR_ATTRS_INV_NUM; att1 = (attr_t *)malloc(sizeof(attr_t) * RDR_ATTRS_INV_NUM); memcpy(att1, Def_inv_rdr, sizeof(attr_t) * RDR_ATTRS_INV_NUM); at->Attrs = att1; att1[0].value.i = inv->IdrId; att1[1].value.i = inv->Persistent; att1[2].value.i = inv->Oem; return(at); } #define RDR_ATTRS_WDOG_NUM 2 attr_t Def_wdog_rdr[] = { { "Num", INT_TYPE, 0, { .d = 0} }, // 0 { "Oem", INT_TYPE, 0, { .d = 0} } // 1 }; static Attributes_t *make_attrs_wdog(SaHpiWatchdogRecT *wdog) { attr_t *att1; Attributes_t *at; at = (Attributes_t *)malloc(sizeof(Attributes_t)); at->n_attrs = RDR_ATTRS_WDOG_NUM; att1 = (attr_t *)malloc(sizeof(attr_t) * RDR_ATTRS_WDOG_NUM); memcpy(att1, Def_wdog_rdr, sizeof(attr_t) * RDR_ATTRS_WDOG_NUM); at->Attrs = att1; att1[0].value.i = wdog->WatchdogNum; att1[1].value.i = wdog->Oem; return(at); } #define RDR_ATTRS_ANNUN_NUM 5 attr_t Def_annun_rdr[] = { { "Num", INT_TYPE, 0, { .d = 0} }, // 0 { "Type", INT_TYPE, 0, { .d = 0} }, // 1 { "ReadOnly", INT_TYPE, 0, { .d = 0} }, // 2 { "MaxConditions", INT_TYPE, 0, { .d = 0} }, // 3 { "Oem", INT_TYPE, 0, { .d = 0} } // 4 }; static Attributes_t *make_attrs_annun(SaHpiAnnunciatorRecT *annun) { attr_t *att1; Attributes_t *at; at = (Attributes_t *)malloc(sizeof(Attributes_t)); at->n_attrs = RDR_ATTRS_ANNUN_NUM; att1 = (attr_t *)malloc(sizeof(attr_t) * RDR_ATTRS_ANNUN_NUM); memcpy(att1, Def_annun_rdr, sizeof(attr_t) * RDR_ATTRS_ANNUN_NUM); at->Attrs = att1; att1[0].value.i = annun->AnnunciatorNum; att1[1].value.i = annun->AnnunciatorType; att1[2].value.i = annun->ModeReadOnly; att1[3].value.i = annun->MaxConditions; att1[4].value.i = annun->Oem; return(at); } #define RDR_ATTRS_DIMI_NUM 2 attr_t Def_dimi_rdr[] = { { "DimiNum", INT_TYPE, 0, { .d = 0} }, // 0 { "Oem", INT_TYPE, 0, { .d = 0} } // 1 }; static Attributes_t *make_attrs_dimi(SaHpiDimiRecT *dimi) { attr_t *att1; Attributes_t *at; at = (Attributes_t *)malloc(sizeof(Attributes_t)); at->n_attrs = RDR_ATTRS_DIMI_NUM; att1 = (attr_t *)malloc(sizeof(attr_t) * RDR_ATTRS_DIMI_NUM); memcpy(att1, Def_dimi_rdr, sizeof(attr_t) * RDR_ATTRS_DIMI_NUM); at->Attrs = att1; att1[0].value.i = dimi->DimiNum; att1[1].value.i = dimi->Oem; return(at); } #define RDR_ATTRS_FUMI_NUM 5 attr_t Def_fumi_rdr[] = { { "Num", INT_TYPE, 0, { .d = 0} }, // 0 { "AccessProt", INT_TYPE, 0, { .d = 0} }, // 1 { "Capability", INT_TYPE, 0, { .d = 0} }, // 2 { "NumBanks", INT_TYPE, 0, { .d = 0} }, // 3 { "Oem", INT_TYPE, 0, { .d = 0} } // 4 }; static Attributes_t *make_attrs_fumi(SaHpiFumiRecT *fumi) { attr_t *att1; Attributes_t *at; at = (Attributes_t *)malloc(sizeof(Attributes_t)); at->n_attrs = RDR_ATTRS_FUMI_NUM; att1 = (attr_t *)malloc(sizeof(attr_t) * RDR_ATTRS_FUMI_NUM); memcpy(att1, Def_fumi_rdr, sizeof(attr_t) * RDR_ATTRS_FUMI_NUM); at->Attrs = att1; att1[0].value.i = fumi->Num; att1[1].value.i = fumi->AccessProt; att1[2].value.i = fumi->Capability; att1[3].value.i = fumi->NumBanks; att1[4].value.i = fumi->Oem; return(at); } void make_attrs_rdr(Rdr_t *Rdr, SaHpiRdrT *rdrentry) { attr_t *att; int i = 0; Attributes_t *at; SaHpiRdrT *obj; SaHpiSensorRecT *sensor; SaHpiCtrlRecT *ctrl; SaHpiInventoryRecT *inv; SaHpiWatchdogRecT *wdog; SaHpiAnnunciatorRecT *annun; SaHpiDimiRecT *dimi; SaHpiFumiRecT *fumi; Rdr->Record = *rdrentry; obj = &(Rdr->Record); Rdr->Attrutes.n_attrs = RDR_ATTRS_COMMON_NUM; Rdr->Attrutes.Attrs = (attr_t *)malloc(sizeof(attr_t) * RDR_ATTRS_COMMON_NUM); memcpy(Rdr->Attrutes.Attrs, Def_common_rdr, sizeof(attr_t) * RDR_ATTRS_COMMON_NUM); att = Rdr->Attrutes.Attrs; att[i++].value.i = obj->RecordId; att[i++].value.i = obj->RdrType; att[i++].value.a = &(obj->Entity); att[i++].value.i = obj->IsFru; switch (obj->RdrType) { case SAHPI_SENSOR_RDR: sensor = &(obj->RdrTypeUnion.SensorRec); at = make_attrs_sensor(sensor); att[i].name = "Sensor"; att[i++].value.a = at; break; case SAHPI_CTRL_RDR: ctrl = &(obj->RdrTypeUnion.CtrlRec); at = make_attrs_ctrl(ctrl); att[i].name = "Control"; att[i++].value.a = at; break; case SAHPI_INVENTORY_RDR: inv = &(obj->RdrTypeUnion.InventoryRec); at = make_attrs_inv(inv); att[i].name = "Inventory"; att[i++].value.a = at; break; case SAHPI_WATCHDOG_RDR: wdog = &(obj->RdrTypeUnion.WatchdogRec); at = make_attrs_wdog(wdog); att[i].name = "Watchdog"; att[i++].value.a = at; break; case SAHPI_ANNUNCIATOR_RDR: annun = &(obj->RdrTypeUnion.AnnunciatorRec); at = make_attrs_annun(annun); att[i].name = "Annunciator"; att[i++].value.a = at; break; case SAHPI_DIMI_RDR: dimi = &(obj->RdrTypeUnion.DimiRec); at = make_attrs_dimi(dimi); att[i].name = "DIMI"; att[i++].value.a = at; break; case SAHPI_FUMI_RDR: fumi = &(obj->RdrTypeUnion.FumiRec); at = make_attrs_fumi(fumi); att[i].name = "FUMI"; att[i++].value.a = at; break; default: break; }; att[i++].value.a = &(obj->IdString); } void free_attrs(Attributes_t *At) { int i; attr_t *attr; for (i = 0, attr = At->Attrs; i < At->n_attrs; i++, attr++) { if (attr->type == STRUCT_TYPE) { if (attr->value.a == 0) continue; free_attrs((Attributes_t *)(attr->value.a)); free(attr->value.a); } }; free(At->Attrs); } void time2str(SaHpiTimeT time, char * str, size_t size) { struct tm t; time_t tt; if (!str) return; if (time > SAHPI_TIME_MAX_RELATIVE) { /*absolute time*/ tt = time / 1000000000; strftime(str, size, "%F %T", localtime(&tt)); } else if (time == SAHPI_TIME_UNSPECIFIED) { strcpy(str,"SAHPI_TIME_UNSPECIFIED "); } else if (time > SAHPI_TIME_UNSPECIFIED) { /*invalid time*/ strcpy(str,"invalid time "); } else { /*relative time*/ tt = time / 1000000000; localtime_r(&tt, &t); strftime(str, size, "%b %d, %Y - %H:%M:%S", &t); } } char *get_attr_name(Attributes_t *Attrs, int num) { if ((num < 0) || (num >= Attrs->n_attrs)) return((char *)NULL); return(Attrs->Attrs[num].name); } int get_attr_type(Attributes_t *Attrs, int num) { if ((num < 0) || (num >= Attrs->n_attrs)) return(-1); return(Attrs->Attrs[num].type); } SaErrorT get_value_as_string(Attributes_t *Attrs, int num, char *val, int len) { int type; SaHpiBoolT b; if ((num < 0) || (num >= Attrs->n_attrs) || (val == (char *)NULL) || (len == 0)) return SA_ERR_HPI_INVALID_PARAMS; type = Attrs->Attrs[num].type; switch (type) { case BOOL_TYPE: b = Attrs->Attrs[num].value.i; if (b) snprintf(val, len, "%s", "TRUE"); else snprintf(val, len, "%s", "FALSE"); break; case INT_TYPE: snprintf(val, len, "%d", Attrs->Attrs[num].value.i); break; case HEX_TYPE: snprintf(val, len, "0x%x", Attrs->Attrs[num].value.i); break; case FLOAT_TYPE: snprintf(val, len, "%f", Attrs->Attrs[num].value.d); break; case STR_TYPE: if (Attrs->Attrs[num].value.s != (char *)NULL) snprintf(val, len, "%s", Attrs->Attrs[num].value.s); else *val = 0; break; default: return(SA_ERR_HPI_ERROR); }; return(SA_OK); } SaErrorT get_rdr_attr_as_string(Rdr_t *rdr, char *attr_name, char *val, int len) { int i; SaErrorT ret; if ((attr_name == (char *)NULL) || (val == (char *)NULL) || (len == 0)) return(SA_ERR_HPI_INVALID_PARAMS); i = find_attr(&(rdr->Attrutes), attr_name); if (i < 0) return(SA_ERR_HPI_INVALID_PARAMS); ret = get_value_as_string(&(rdr->Attrutes), i, val, len); return(ret); } SaErrorT get_rdr_attr(Rdr_t *rdr, char *attr_name, union_type_t *val) { int i; if ((attr_name == (char *)NULL) || (val == (union_type_t *)NULL)) return(SA_ERR_HPI_INVALID_PARAMS); i = find_attr(&(rdr->Attrutes), attr_name); if (i < 0) return(SA_ERR_HPI_INVALID_PARAMS); *val = rdr->Attrutes.Attrs[i].value; return(SA_OK); } SaErrorT get_rpt_attr_as_string(Rpt_t *rpt, char *attr_name, char *val, int len) { int i; SaErrorT ret; if ((attr_name == (char *)NULL) || (val == (char *)NULL) || (len == 0)) return(SA_ERR_HPI_INVALID_PARAMS); i = find_attr(&(rpt->Attrutes), attr_name); if (i < 0) return(SA_ERR_HPI_INVALID_PARAMS); ret = get_value_as_string(&(rpt->Attrutes), i, val, len); return(ret); } SaErrorT get_rpt_attr(Rpt_t *rpt, char *attr_name, union_type_t *val) { int i; if ((attr_name == (char *)NULL) || (val == (union_type_t *)NULL)) return(SA_ERR_HPI_INVALID_PARAMS); i = find_attr(&(rpt->Attrutes), attr_name); if (i < 0) return(SA_ERR_HPI_INVALID_PARAMS); *val = rpt->Attrutes.Attrs[i].value; return(SA_OK); } SaErrorT get_value(Attributes_t *Attrs, int num, union_type_t *val) { int type; if ((num < 0) || (num >= Attrs->n_attrs) || (val == (union_type_t *)NULL)) return SA_ERR_HPI_INVALID_PARAMS; type = Attrs->Attrs[num].type; if ((type == STR_TYPE) || (type == STRUCT_TYPE) || (type == ARRAY_TYPE)) { if (Attrs->Attrs[num].value.s == (char *)NULL) return(-1); }; *val = Attrs->Attrs[num].value; return(SA_OK); } SaErrorT find_rdr_by_num(SaHpiSessionIdT sessionid, SaHpiResourceIdT resourceid, SaHpiInstrumentIdT num, SaHpiRdrTypeT type, int as, SaHpiRdrT *retrdr) //as : 0 - get rdr by num // 1 - get first rdr { SaHpiRdrT rdr; SaErrorT rv; SaHpiEntryIdT entryid; SaHpiEntryIdT nextentryid; SaHpiInstrumentIdT rdrnum; entryid = SAHPI_FIRST_ENTRY; while (entryid !=SAHPI_LAST_ENTRY) { rv = saHpiRdrGet(sessionid, resourceid, entryid, &nextentryid, &rdr); if (rv != SA_OK) return(-1); if ((type != SAHPI_NO_RECORD) && (rdr.RdrType != type)) continue; switch (rdr.RdrType) { case SAHPI_CTRL_RDR: rdrnum = rdr.RdrTypeUnion.CtrlRec.Num; break; case SAHPI_SENSOR_RDR: rdrnum = rdr.RdrTypeUnion.SensorRec.Num; break; case SAHPI_INVENTORY_RDR: rdrnum = rdr.RdrTypeUnion.InventoryRec.IdrId; break; case SAHPI_WATCHDOG_RDR: rdrnum = rdr.RdrTypeUnion.WatchdogRec.WatchdogNum; break; case SAHPI_ANNUNCIATOR_RDR: rdrnum = rdr.RdrTypeUnion.AnnunciatorRec.AnnunciatorNum; break; case SAHPI_DIMI_RDR: rdrnum = rdr.RdrTypeUnion.DimiRec.DimiNum; break; case SAHPI_FUMI_RDR: rdrnum = rdr.RdrTypeUnion.FumiRec.Num; break; default: entryid = nextentryid; continue; }; if ((rdrnum == num) || as) { *retrdr = rdr; return(SA_OK); }; entryid = nextentryid; }; return(-1); } char *hex_codes = "0123456789ABCDEF"; Pr_ret_t print_text_buffer_type(char *mes, SaHpiTextBufferT *buf, char *meslast, hpi_ui_print_cb_t proc) { char *str = ""; if (mes != (char *)NULL) { if (proc(mes) == HPI_UI_END) return(HPI_UI_END); }; switch (buf->DataType) { case SAHPI_TL_TYPE_UNICODE: str = "UNICODE"; break; case SAHPI_TL_TYPE_BCDPLUS: str = "BCDPLUS"; break; case SAHPI_TL_TYPE_ASCII6: str = "ASCII6"; break; case SAHPI_TL_TYPE_TEXT: str = "TEXT"; break; case SAHPI_TL_TYPE_BINARY: str = "BIN"; break; }; if (proc(str) == HPI_UI_END) return(HPI_UI_END); if (meslast != (char *)NULL) { if (proc(meslast) == HPI_UI_END) return(HPI_UI_END); }; return(0); } void get_text_buffer_text(char *mes, SaHpiTextBufferT *buf, char *meslast, char *outbuf) { int i, c, tmp_ind, len; char *tmp; *outbuf = 0; if (mes != (char *)NULL) strcpy(outbuf,mes); if ((buf->DataLength == 0) && (buf->DataType != SAHPI_TL_TYPE_BINARY)) { if (meslast != (char *)NULL) strcat(outbuf, meslast); return; }; switch (buf->DataType) { case SAHPI_TL_TYPE_UNICODE: strcat(outbuf, "UNICODE does not implement"); break; case SAHPI_TL_TYPE_BCDPLUS: case SAHPI_TL_TYPE_ASCII6: case SAHPI_TL_TYPE_TEXT: strncat(outbuf, (char *)(buf->Data), buf->DataLength); break; case SAHPI_TL_TYPE_BINARY: len = buf->DataLength * 2 + 1; tmp = malloc(len); memset(tmp, 0, len); tmp_ind = 0; memset(tmp, 0, len); for (i = 0; i < buf->DataLength; i++) { c = (buf->Data[i] & 0xF0) >> 4; tmp[tmp_ind++] = hex_codes[c]; c = buf->Data[i] & 0x0F; tmp[tmp_ind++] = hex_codes[c]; }; strcat(outbuf, tmp); free(tmp); break; }; if (meslast != (char *)NULL) strcat(outbuf, meslast); return; } Pr_ret_t print_text_buffer_text(char *mes, SaHpiTextBufferT *buf, char *meslast, hpi_ui_print_cb_t proc) { char outbuf[SHOW_BUF_SZ]; get_text_buffer_text(mes, buf, meslast, outbuf); return(proc(outbuf)); } Pr_ret_t print_text_buffer_lang(char *mes, SaHpiTextBufferT *buf, char *meslast, hpi_ui_print_cb_t proc) { char *str; if ((buf->DataType == SAHPI_TL_TYPE_UNICODE) || (buf->DataType == SAHPI_TL_TYPE_TEXT)) { str = oh_lookup_language(buf->Language); if (str == (char *)NULL) return(HPI_UI_OK); if (strlen(str) == 0) return(HPI_UI_OK); if (mes != (char *)NULL) { if (proc(mes) == HPI_UI_END) return(HPI_UI_END); }; if (proc(str) != 0) return(1); if (meslast != (char *)NULL) { if (proc(meslast) == HPI_UI_END) return(HPI_UI_END); } }; return(HPI_UI_OK); } Pr_ret_t print_text_buffer_length(char *mes, SaHpiTextBufferT *buf, char *meslast, hpi_ui_print_cb_t proc) { char len_buf[32]; if (mes != (char *)NULL) { if (proc(mes) == HPI_UI_END) return(HPI_UI_END); }; snprintf(len_buf, 31, "%d", buf->DataLength); if (proc(len_buf) == HPI_UI_END) return(HPI_UI_END); if (meslast != (char *)NULL) { if (proc(meslast) == HPI_UI_END) return(HPI_UI_END); }; return(HPI_UI_OK); } Pr_ret_t print_text_buffer(char *mes, SaHpiTextBufferT *buf, char *meslast, hpi_ui_print_cb_t proc) { if (mes != (char *)NULL) { if (proc(mes) == HPI_UI_END) return(HPI_UI_END); }; if ((buf->DataLength > 0) || (buf->DataType == SAHPI_TL_TYPE_BINARY)) { if (print_text_buffer_type(NULL, buf, ": ", proc) != HPI_UI_OK) return(HPI_UI_END); if (print_text_buffer_lang(NULL, buf, ": ", proc) != HPI_UI_OK) return(HPI_UI_END); if (print_text_buffer_text(NULL, buf, NULL, proc) != HPI_UI_OK) return(HPI_UI_END); if (print_text_buffer_length(" (len=", buf, ")", proc) != HPI_UI_OK) return(HPI_UI_END); } if (meslast != (char *)NULL) { if (proc(meslast) == HPI_UI_END) return(HPI_UI_END); }; return(HPI_UI_OK); } openhpi-2.14.1/hpi_shell/fumi.c0000644000076400007640000004042511302567132013251 0ustar /* -*- linux-c -*- * * Copyright (c) 2008 Pigeon Point Systems. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * Anton Pak * * */ #include #include #include #include #include "hpi_cmd.h" typedef struct { SaHpiResourceIdT rptid; SaHpiFumiNumT fuminum; } fumi_block_env_t; static fumi_block_env_t fumi_block_env; static ret_code_t get_banknum_prompt( char * prompt, SaHpiBankNumT * banknum ) { int i, res; i = get_int_param( prompt, &res ); if ( i != 1 ) { printf( "Error!!! Invalid Bank Num\n" ); return HPI_SHELL_PARM_ERROR ; } *banknum = (SaHpiBankNumT)res; return HPI_SHELL_OK; } static ret_code_t get_banknum( SaHpiBankNumT * banknum ) { return get_banknum_prompt( "Bank Num(0 == active bank): ", banknum ); } static ret_code_t get_position( SaHpiUint32T * position ) { int i, res; i = get_int_param( "Position of the bank in boot order: ", &res ); if ( i != 1 ) { printf( "Error!!! Invalid position\n" ); return HPI_SHELL_PARM_ERROR ; } *position = (SaHpiUint32T)res; return HPI_SHELL_OK; } static ret_code_t get_uri( SaHpiTextBufferT* uri ) { int i; i = get_string_param("Source URI: ", (char*)(uri->Data), SAHPI_MAX_TEXT_BUFFER_LENGTH); if ( i != 0 ) { printf( "Error!!! Invalid string: %s\n", uri->Data ); return HPI_SHELL_PARM_ERROR ; } uri->DataType = SAHPI_TL_TYPE_TEXT; uri->Language = SAHPI_LANG_ENGLISH; uri->DataLength = strlen( (char*)(uri->Data) ); return HPI_SHELL_OK; } static ret_code_t set_source( SaHpiSessionIdT sessionId, SaHpiResourceIdT rptid, SaHpiFumiNumT fuminum, SaHpiBankNumT banknum, SaHpiTextBufferT* uri ) { SaErrorT rv; rv = saHpiFumiSourceSet( sessionId, rptid, fuminum, banknum, uri ); if ( rv != SA_OK ) { printf( "ERROR!!! saHpiFumiSourceSet: %s\n", oh_lookup_error( rv ) ); return HPI_SHELL_CMD_ERROR; } return HPI_SHELL_OK; } static ret_code_t start_source_validation( SaHpiSessionIdT sessionId, SaHpiResourceIdT rptid, SaHpiFumiNumT fuminum, SaHpiBankNumT banknum ) { SaErrorT rv; rv = saHpiFumiSourceInfoValidateStart( sessionId, rptid, fuminum, banknum ); if ( rv != SA_OK ) { printf( "ERROR!!! saHpiFumiSourceInfoValidateStart: %s\n", oh_lookup_error( rv ) ); return HPI_SHELL_CMD_ERROR; } return HPI_SHELL_OK; } static ret_code_t show_source_info( SaHpiSessionIdT sessionId, SaHpiResourceIdT rptid, SaHpiFumiNumT fuminum, SaHpiBankNumT banknum ) { SaErrorT rv; SaHpiFumiSourceInfoT info; rv = saHpiFumiSourceInfoGet( sessionId, rptid, fuminum, banknum, &info ); if ( rv != SA_OK ) { printf( "ERROR!!! saHpiFumiSourceInfoGet: %s\n", oh_lookup_error( rv ) ); return HPI_SHELL_CMD_ERROR; } printf( "Bank Num: %d\n", banknum ); print_text_buffer_text( " Source URI: \"", &info.SourceUri, "\"\n", ui_print ); printf( " Source status: %s\n", oh_lookup_fumisourcestatus( info.SourceStatus ) ); print_text_buffer_text( " Identifier: \"", &info.Identifier, "\"\n", ui_print ); print_text_buffer_text( " Description: \"", &info.Description, "\"\n", ui_print ); print_text_buffer_text( " DateTime: \"", &info.DateTime, "\"\n", ui_print ); printf( " Version: %u.%u.%u\n", info.MajorVersion, info.MinorVersion, info.AuxVersion ); return HPI_SHELL_OK; } static ret_code_t show_bank_info( SaHpiSessionIdT sessionId, SaHpiResourceIdT rptid, SaHpiFumiNumT fuminum, SaHpiBankNumT banknum ) { SaErrorT rv; SaHpiFumiBankInfoT info; rv = saHpiFumiTargetInfoGet( sessionId, rptid, fuminum, banknum, &info ); if ( rv != SA_OK ) { printf( "ERROR!!! saHpiFumiTargetInfoGet: %s\n", oh_lookup_error( rv ) ); return HPI_SHELL_CMD_ERROR; } printf( "Bank Num: %d\n", banknum ); printf( " Bank id: %u\n", (unsigned int)info.BankId ); printf( " Bank size: %u KB\n", info.BankSize ); printf( " Position: %u\n", info.Position ); printf( " Bank state: %s\n", oh_lookup_fumibankstate( info.BankState ) ); print_text_buffer_text( " Identifier: \"", &info.Identifier, "\"\n", ui_print ); print_text_buffer_text( " Description: \"", &info.Description, "\"\n", ui_print ); print_text_buffer_text( " DateTime: \"", &info.DateTime, "\"\n", ui_print ); printf( " Version: %u.%u.%u\n", info.MajorVersion, info.MinorVersion, info.AuxVersion ); return HPI_SHELL_OK; } static ret_code_t start_backup( SaHpiSessionIdT sessionId, SaHpiResourceIdT rptid, SaHpiFumiNumT fuminum ) { SaErrorT rv; rv = saHpiFumiBackupStart( sessionId, rptid, fuminum ); if ( rv != SA_OK ) { printf( "ERROR!!! saHpiFumiBackupStart: %s\n", oh_lookup_error( rv ) ); return HPI_SHELL_CMD_ERROR; } return HPI_SHELL_OK; } static ret_code_t set_bank_boot_order( SaHpiSessionIdT sessionId, SaHpiResourceIdT rptid, SaHpiFumiNumT fuminum, SaHpiBankNumT banknum, SaHpiUint32T position ) { SaErrorT rv; rv = saHpiFumiBankBootOrderSet( sessionId, rptid, fuminum, banknum, position ); if ( rv != SA_OK ) { printf( "ERROR!!! saHpiFumiBankBootOrderSet: %s\n", oh_lookup_error( rv ) ); return HPI_SHELL_CMD_ERROR; } return HPI_SHELL_OK; } static ret_code_t start_bank_copying( SaHpiSessionIdT sessionId, SaHpiResourceIdT rptid, SaHpiFumiNumT fuminum, SaHpiBankNumT srcbanknum, SaHpiBankNumT dstbanknum ) { SaErrorT rv; rv = saHpiFumiBankCopyStart( sessionId, rptid, fuminum, srcbanknum, dstbanknum ); if ( rv != SA_OK ) { printf( "ERROR!!! saHpiFumiBankCopyStart: %s\n", oh_lookup_error( rv ) ); return HPI_SHELL_CMD_ERROR; } return HPI_SHELL_OK; } static ret_code_t start_install( SaHpiSessionIdT sessionId, SaHpiResourceIdT rptid, SaHpiFumiNumT fuminum, SaHpiBankNumT banknum ) { SaErrorT rv; rv = saHpiFumiInstallStart( sessionId, rptid, fuminum, banknum ); if ( rv != SA_OK ) { printf( "ERROR!!! saHpiFumiInstallStart: %s\n", oh_lookup_error( rv ) ); return HPI_SHELL_CMD_ERROR; } return HPI_SHELL_OK; } static ret_code_t show_upgrade_status( SaHpiSessionIdT sessionId, SaHpiResourceIdT rptid, SaHpiFumiNumT fuminum, SaHpiBankNumT banknum ) { SaErrorT rv; SaHpiFumiUpgradeStatusT status; rv = saHpiFumiUpgradeStatusGet( sessionId, rptid, fuminum, banknum, &status ); if ( rv != SA_OK ) { printf( "ERROR!!! saHpiFumiUpgradeStatusGet: %s\n", oh_lookup_error( rv ) ); return HPI_SHELL_CMD_ERROR; } printf( "Upgrade status on bank %d: %s\n", banknum, oh_lookup_fumiupgradestatus( status ) ); return HPI_SHELL_OK; } static ret_code_t start_target_verification( SaHpiSessionIdT sessionId, SaHpiResourceIdT rptid, SaHpiFumiNumT fuminum, SaHpiBankNumT banknum ) { SaErrorT rv; rv = saHpiFumiTargetVerifyStart( sessionId, rptid, fuminum, banknum ); if ( rv != SA_OK ) { printf( "ERROR!!! saHpiFumiTargetVerifyStart: %s\n", oh_lookup_error( rv ) ); return HPI_SHELL_CMD_ERROR; } return HPI_SHELL_OK; } static ret_code_t cancel_upgrade( SaHpiSessionIdT sessionId, SaHpiResourceIdT rptid, SaHpiFumiNumT fuminum, SaHpiBankNumT banknum ) { SaErrorT rv; rv = saHpiFumiUpgradeCancel( sessionId, rptid, fuminum, banknum ); if ( rv != SA_OK ) { printf( "ERROR!!! saHpiFumiUpgradeCancel: %s\n", oh_lookup_error( rv ) ); return HPI_SHELL_CMD_ERROR; } return HPI_SHELL_OK; } static ret_code_t start_rollback( SaHpiSessionIdT sessionId, SaHpiResourceIdT rptid, SaHpiFumiNumT fuminum ) { SaErrorT rv; rv = saHpiFumiRollbackStart( sessionId, rptid, fuminum ); if ( rv != SA_OK ) { printf( "ERROR!!! saHpiFumiRollbackStart: %s\n", oh_lookup_error( rv ) ); return HPI_SHELL_CMD_ERROR; } return HPI_SHELL_OK; } static ret_code_t activate( SaHpiSessionIdT sessionId, SaHpiResourceIdT rptid, SaHpiFumiNumT fuminum ) { SaErrorT rv; rv = saHpiFumiActivate( sessionId, rptid, fuminum ); if ( rv != SA_OK ) { printf( "ERROR!!! saHpiFumiActivate: %s\n", oh_lookup_error( rv ) ); return HPI_SHELL_CMD_ERROR; } return HPI_SHELL_OK; } /************************************* * commands ************************************/ ret_code_t fumi_block( void ) { SaErrorT rv; ret_code_t ret; SaHpiResourceIdT rptid; SaHpiInstrumentIdT rdrnum; SaHpiRdrT rdr; ret = ask_rpt( &rptid ); if ( ret != HPI_SHELL_OK ) { return ret; }; ret = ask_rdr( rptid, SAHPI_FUMI_RDR, &rdrnum ); if ( ret != HPI_SHELL_OK ) { return ret; } rv = saHpiRdrGetByInstrumentId( Domain->sessionId, rptid, SAHPI_FUMI_RDR, rdrnum, &rdr ); if ( rv != SA_OK ) { printf( "ERROR!!! saHpiRdrGetByInstrumentId" "(Rpt=%d RdrType=%d Rdr=%d): %s\n", rptid, SAHPI_FUMI_RDR, rdrnum, oh_lookup_error( rv ) ); return HPI_SHELL_CMD_ERROR; }; fumi_block_env.rptid = rptid; fumi_block_env.fuminum = rdr.RdrTypeUnion.FumiRec.Num; block_type = FUMI_COM; for ( ;; ) { int res; term_def_t * term ; char buf[256]; res = get_new_command( "FUMI block ==> " ); if ( res == 2 ) { unget_term(); break; }; term = get_next_term(); if ( term == NULL ) continue; snprintf( buf, 256, "%s", term->term ); if ( ( strcmp( buf, "q" ) == 0) || ( strcmp( buf, "quit" ) == 0 ) ) { break; } } block_type = MAIN_COM; return HPI_SHELL_OK; } ret_code_t fumi_block_setsource(void) { SaHpiBankNumT banknum; SaHpiTextBufferT uri; if ( get_banknum( &banknum) != HPI_SHELL_OK ) { return HPI_SHELL_PARM_ERROR; } if ( get_uri( &uri) != HPI_SHELL_OK ) { return HPI_SHELL_PARM_ERROR; } return set_source( Domain->sessionId, fumi_block_env.rptid, fumi_block_env.fuminum, banknum, &uri ); } ret_code_t fumi_block_validatesource(void) { SaHpiBankNumT banknum; if ( get_banknum( &banknum) != HPI_SHELL_OK ) { return HPI_SHELL_PARM_ERROR; } return start_source_validation( Domain->sessionId, fumi_block_env.rptid, fumi_block_env.fuminum, banknum ); } ret_code_t fumi_block_getsource(void) { SaHpiBankNumT banknum; if ( get_banknum( &banknum) != HPI_SHELL_OK ) { return HPI_SHELL_PARM_ERROR; } return show_source_info( Domain->sessionId, fumi_block_env.rptid, fumi_block_env.fuminum, banknum ); } ret_code_t fumi_block_targetinfo(void) { SaHpiBankNumT banknum; if ( get_banknum( &banknum) != HPI_SHELL_OK ) { return HPI_SHELL_PARM_ERROR; } return show_bank_info( Domain->sessionId, fumi_block_env.rptid, fumi_block_env.fuminum, banknum ); } ret_code_t fumi_block_backup(void) { return start_backup( Domain->sessionId, fumi_block_env.rptid, fumi_block_env.fuminum ); } ret_code_t fumi_block_setbootorder(void) { SaHpiBankNumT banknum; SaHpiUint32T position; if ( get_banknum( &banknum) != HPI_SHELL_OK ) { return HPI_SHELL_PARM_ERROR; } if ( get_position( &position) != HPI_SHELL_OK ) { return HPI_SHELL_PARM_ERROR; } return set_bank_boot_order( Domain->sessionId, fumi_block_env.rptid, fumi_block_env.fuminum, banknum, position ); } ret_code_t fumi_block_bankcopy(void) { SaHpiBankNumT srcbanknum; SaHpiBankNumT dstbanknum; if ( get_banknum_prompt( "Source Bank Num(0 == active bank): ", &srcbanknum) != HPI_SHELL_OK ) { return HPI_SHELL_PARM_ERROR; } if ( get_banknum_prompt( "Target Bank Num(0 == active bank): ", &dstbanknum) != HPI_SHELL_OK ) { return HPI_SHELL_PARM_ERROR; } return start_bank_copying( Domain->sessionId, fumi_block_env.rptid, fumi_block_env.fuminum, srcbanknum, dstbanknum ); } ret_code_t fumi_block_install(void) { SaHpiBankNumT banknum; if ( get_banknum( &banknum) != HPI_SHELL_OK ) { return HPI_SHELL_PARM_ERROR; } return start_install( Domain->sessionId, fumi_block_env.rptid, fumi_block_env.fuminum, banknum ); } ret_code_t fumi_block_status(void) { SaHpiBankNumT banknum; if ( get_banknum( &banknum) != HPI_SHELL_OK ) { return HPI_SHELL_PARM_ERROR; } return show_upgrade_status( Domain->sessionId, fumi_block_env.rptid, fumi_block_env.fuminum, banknum ); } ret_code_t fumi_block_verifytarget(void) { SaHpiBankNumT banknum; if ( get_banknum( &banknum) != HPI_SHELL_OK ) { return HPI_SHELL_PARM_ERROR; } return start_target_verification( Domain->sessionId, fumi_block_env.rptid, fumi_block_env.fuminum, banknum ); } ret_code_t fumi_block_cancel(void) { SaHpiBankNumT banknum; if ( get_banknum( &banknum) != HPI_SHELL_OK ) { return HPI_SHELL_PARM_ERROR; } return cancel_upgrade( Domain->sessionId, fumi_block_env.rptid, fumi_block_env.fuminum, banknum ); } ret_code_t fumi_block_rollback(void) { return start_rollback( Domain->sessionId, fumi_block_env.rptid, fumi_block_env.fuminum ); } ret_code_t fumi_block_activate(void) { return activate( Domain->sessionId, fumi_block_env.rptid, fumi_block_env.fuminum ); } openhpi-2.14.1/hpi_shell/dimi.c0000644000076400007640000003364411302567132013240 0ustar /* -*- linux-c -*- * * Copyright (c) 2007 Pigeon Point Systems. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * Anton Pak * * */ #include #include #include #include #include "hpi_cmd.h" typedef struct { SaHpiResourceIdT rptid; SaHpiDimiNumT diminum; } dimi_block_env_t; static dimi_block_env_t dimi_block_env; static ret_code_t get_testnum( SaHpiDimiTestNumT * testnum ) { int i, res; i = get_int_param( "Test Num: ", &res ); if ( i != 1 ) { printf( "Error!!! Invalid Test Num\n" ); return HPI_SHELL_PARM_ERROR ; } *testnum = (SaHpiDimiTestNumT)res; return HPI_SHELL_OK; } static ret_code_t show_dimi_info( SaHpiSessionIdT sessionId, SaHpiResourceIdT rptid, SaHpiDimiNumT diminum ) { SaErrorT rv; SaHpiDimiInfoT info; rv = saHpiDimiInfoGet( sessionId, rptid, diminum, &info ); if ( rv != SA_OK ) { printf( "ERROR!!! saHpiDimiInfoGet: %s\n", oh_lookup_error( rv ) ); return HPI_SHELL_CMD_ERROR; } printf( "DIMI number: %d\n", (int)diminum ); printf( " Number of tests: %d\n", (int)info.NumberOfTests ); printf( " Test number update counter: %d\n", (int)info.TestNumUpdateCounter ); return HPI_SHELL_OK; } static ret_code_t show_test_info( SaHpiSessionIdT sessionId, SaHpiResourceIdT rptid, SaHpiDimiNumT diminum, SaHpiDimiTestNumT testnum ) { SaErrorT rv; SaHpiDimiTestT test; oh_big_textbuffer bigtmpbuf; SaHpiTextBufferT tmpbuf; int i; rv = saHpiDimiTestInfoGet( sessionId, rptid, diminum, testnum, &test ); if ( rv != SA_OK ) { printf( "ERROR!!! saHpiDimiTestInfoGet: %s\n", oh_lookup_error( rv ) ); return HPI_SHELL_CMD_ERROR; } printf( "Test number: %d\n", (int)testnum ); print_text_buffer_text( " Name: \"", &test.TestName, NULL, ui_print ); printf( "\"\n" ); printf( " Service Impact: %s", oh_lookup_dimitestserviceimpact( test.ServiceImpact ) ); printf( "\n" ); printf( " Affected Entities:\n" ); for ( i = 0 ; i < SAHPI_DIMITEST_MAX_ENTITIESIMPACTED; ++i ) { const SaHpiDimiTestAffectedEntityT * ei = &(test.EntitiesImpacted[i]); // Trick suggested to point unset entity pathes if ( ei->EntityImpacted.Entry[0].EntityType == SAHPI_ENT_UNSPECIFIED ) { break; } oh_decode_entitypath( &(ei->EntityImpacted), &bigtmpbuf); printf( " %s: %s\n", bigtmpbuf.Data, oh_lookup_dimitestserviceimpact( ei->ServiceImpact ) ); } if ( test.NeedServiceOS == SAHPI_TRUE ) { print_text_buffer_text( " Needed Service OS: ", &test.ServiceOS, NULL, ui_print ); printf( "\n" ); } printf( " Expected Run Duration: %lld nsec\n", test.ExpectedRunDuration ); oh_decode_dimitestcapabilities( test.TestCapabilities, &tmpbuf ); printf( " Test capabilities: %s\n", tmpbuf.Data ); printf( " Test parameters:\n" ); for ( i = 0; i < SAHPI_DIMITEST_MAX_PARAMETERS; ++i ) { const SaHpiDimiTestParamsDefinitionT * param = &(test.TestParameters[i]); // Trick suggested to point unused params if ( param->ParamName[0] == '\0' ) { break; } printf( " Paramerer %d:\n", i ); printf( " Name: \"%s\"\n", param->ParamName ); printf( " Info: %s\n", param->ParamInfo.Data ); switch ( param->ParamType ) { case SAHPI_DIMITEST_PARAM_TYPE_BOOLEAN: printf( " Type: boolean\n" ); printf( " Default value: %s\n", param->DefaultParam.parambool == SAHPI_TRUE ? "true" : "false" ); break; case SAHPI_DIMITEST_PARAM_TYPE_INT32: printf( " Type: int32\n" ); printf( " Min value: %d\n", param->MinValue.IntValue ); printf( " Max value: %d\n", param->MaxValue.IntValue ); printf( " Default value: %d\n", param->DefaultParam.paramint ); break; case SAHPI_DIMITEST_PARAM_TYPE_FLOAT64: printf( " Type: float64\n" ); printf( " Min value: %f\n", param->MinValue.FloatValue ); printf( " Max value: %f\n", param->MaxValue.FloatValue ); printf( " Default value: %f\n", param->DefaultParam.paramfloat ); break; case SAHPI_DIMITEST_PARAM_TYPE_TEXT: printf( " Type: text\n" ); printf( " Default value: %s\n", param->DefaultParam.paramtext.Data ); break; default: printf( " Type: unknown\n" ); } } return HPI_SHELL_OK; } static ret_code_t show_test_readiness( SaHpiSessionIdT sessionId, SaHpiResourceIdT rptid, SaHpiDimiNumT diminum, SaHpiDimiTestNumT testnum ) { SaErrorT rv; SaHpiDimiReadyT ready; rv = saHpiDimiTestReadinessGet( sessionId, rptid, diminum, testnum, &ready ); if ( rv != SA_OK ) { printf( "ERROR!!! saHpiDimiTestReadinessGet: %s\n", oh_lookup_error( rv ) ); return HPI_SHELL_CMD_ERROR; } switch ( ready ) { case SAHPI_DIMI_READY: printf( "DIMI is ready to run test %d\n", testnum ); break; case SAHPI_DIMI_WRONG_STATE: printf( "DIMI is in the wrong state to run test %d\n", testnum ); break; case SAHPI_DIMI_BUSY: printf( "DIMI cannot start test %d at this time.\n", testnum ); break; default: printf( "Unknown test readiness state(%d).\n", (int)ready ); } return HPI_SHELL_OK; } static ret_code_t start_test( SaHpiSessionIdT sessionId, SaHpiResourceIdT rptid, SaHpiDimiNumT diminum, SaHpiDimiTestNumT testnum ) { SaErrorT rv; rv = saHpiDimiTestStart( sessionId, rptid, diminum, testnum, 0, NULL ); if ( rv != SA_OK ) { printf( "ERROR!!! saHpiDimiTestStart: %s\n", oh_lookup_error( rv ) ); return HPI_SHELL_CMD_ERROR; } return HPI_SHELL_OK; } static ret_code_t cancel_test( SaHpiSessionIdT sessionId, SaHpiResourceIdT rptid, SaHpiDimiNumT diminum, SaHpiDimiTestNumT testnum ) { SaErrorT rv; rv = saHpiDimiTestCancel( sessionId, rptid, diminum, testnum ); if ( rv != SA_OK ) { printf( "ERROR!!! saHpiDimiTestCancel: %s\n", oh_lookup_error( rv ) ); return HPI_SHELL_CMD_ERROR; } return HPI_SHELL_OK; } static ret_code_t show_test_status( SaHpiSessionIdT sessionId, SaHpiResourceIdT rptid, SaHpiDimiNumT diminum, SaHpiDimiTestNumT testnum ) { SaErrorT rv; SaHpiDimiTestPercentCompletedT percent_completed; SaHpiDimiTestRunStatusT runstatus; rv = saHpiDimiTestStatusGet( sessionId, rptid, diminum, testnum, &percent_completed, &runstatus ); if ( rv != SA_OK ) { printf( "ERROR!!! saHpiDimiTestStatusGet: %s\n", oh_lookup_error( rv ) ); return HPI_SHELL_CMD_ERROR; } printf( "Test number: %d\n", (int)testnum ); printf( " Status: %s\n", oh_lookup_dimitestrunstatus( runstatus ) ); if ( percent_completed != 0xff && runstatus == SAHPI_DIMITEST_STATUS_RUNNING ) { printf( " Percent completed: %d\n", percent_completed ); } return HPI_SHELL_OK; } static ret_code_t show_test_results( SaHpiSessionIdT sessionId, SaHpiResourceIdT rptid, SaHpiDimiNumT diminum, SaHpiDimiTestNumT testnum ) { SaErrorT rv; SaHpiDimiTestResultsT results; char date[30]; rv = saHpiDimiTestResultsGet( sessionId, rptid, diminum, testnum, &results ); if ( rv != SA_OK ) { printf( "ERROR!!! saHpiDimiTestResultsGet: %s\n", oh_lookup_error( rv ) ); return HPI_SHELL_CMD_ERROR; } printf( "Test number: %d\n", (int)testnum ); time2str( results.ResultTimeStamp, date, sizeof(date) ); printf( " Result timestamp: %s\n", date ); printf( " Run duration: %lld nsec\n", results.RunDuration ); printf( " Last run status: %s\n", oh_lookup_dimitestrunstatus( results.LastRunStatus ) ); printf( " Test error code: " ); switch( results.TestErrorCode ) { case SAHPI_DIMITEST_STATUSERR_NOERR: printf( "no Error was generated" ); break; case SAHPI_DIMITEST_STATUSERR_RUNERR: printf( "run time error was generated" ); break; case SAHPI_DIMITEST_STATUSERR_UNDEF: printf( "undefined error" ); break; default: printf( "unknown" ); } printf( "\n" ); printf( " Test result %s: \"%s\"\n", results.TestResultStringIsURI == SAHPI_TRUE ? "URI" : "string", results.TestResultString.Data ); return HPI_SHELL_OK; } /************************************* * commands ************************************/ ret_code_t dimi_block( void ) { SaErrorT rv; ret_code_t ret; SaHpiResourceIdT rptid; SaHpiInstrumentIdT rdrnum; SaHpiRdrT rdr; ret = ask_rpt( &rptid ); if ( ret != HPI_SHELL_OK ) { return ret; }; ret = ask_rdr( rptid, SAHPI_DIMI_RDR, &rdrnum ); if ( ret != HPI_SHELL_OK ) { return ret; } rv = saHpiRdrGetByInstrumentId( Domain->sessionId, rptid, SAHPI_DIMI_RDR, rdrnum, &rdr ); if ( rv != SA_OK ) { printf( "ERROR!!! saHpiRdrGetByInstrumentId" "(Rpt=%d RdrType=%d Rdr=%d): %s\n", rptid, SAHPI_DIMI_RDR, rdrnum, oh_lookup_error( rv ) ); return HPI_SHELL_CMD_ERROR; }; dimi_block_env.rptid = rptid; dimi_block_env.diminum = rdr.RdrTypeUnion.DimiRec.DimiNum; block_type = DIMI_COM; for ( ;; ) { int res; term_def_t * term ; char buf[256]; res = get_new_command( "DIMI block ==> " ); if ( res == 2 ) { unget_term(); break; }; term = get_next_term(); if ( term == NULL ) continue; snprintf( buf, 256, "%s", term->term ); if ( ( strcmp( buf, "q" ) == 0) || ( strcmp( buf, "quit" ) == 0 ) ) { break; } } block_type = MAIN_COM; return HPI_SHELL_OK; } ret_code_t dimi_block_info( void ) { return show_dimi_info( Domain->sessionId, dimi_block_env.rptid, dimi_block_env.diminum ); } ret_code_t dimi_block_testinfo( void ) { SaHpiDimiTestNumT testnum; if ( get_testnum( &testnum) != HPI_SHELL_OK ) { return HPI_SHELL_PARM_ERROR; } return show_test_info( Domain->sessionId, dimi_block_env.rptid, dimi_block_env.diminum, testnum ); } ret_code_t dimi_block_ready( void ) { SaHpiDimiTestNumT testnum; if ( get_testnum( &testnum) != HPI_SHELL_OK ) { return HPI_SHELL_PARM_ERROR; } return show_test_readiness( Domain->sessionId, dimi_block_env.rptid, dimi_block_env.diminum, testnum ); } ret_code_t dimi_block_start( void ) { SaHpiDimiTestNumT testnum; if ( get_testnum( &testnum) != HPI_SHELL_OK ) { return HPI_SHELL_PARM_ERROR; } return start_test( Domain->sessionId, dimi_block_env.rptid, dimi_block_env.diminum, testnum ); } ret_code_t dimi_block_cancel( void ) { SaHpiDimiTestNumT testnum; if ( get_testnum( &testnum) != HPI_SHELL_OK ) { return HPI_SHELL_PARM_ERROR; } return cancel_test( Domain->sessionId, dimi_block_env.rptid, dimi_block_env.diminum, testnum ); } ret_code_t dimi_block_status( void ) { SaHpiDimiTestNumT testnum; if ( get_testnum( &testnum) != HPI_SHELL_OK ) { return HPI_SHELL_PARM_ERROR; } return show_test_status( Domain->sessionId, dimi_block_env.rptid, dimi_block_env.diminum, testnum ); } ret_code_t dimi_block_results( void ) { SaHpiDimiTestNumT testnum; if ( get_testnum( &testnum) != HPI_SHELL_OK ) { return HPI_SHELL_PARM_ERROR; } return show_test_results( Domain->sessionId, dimi_block_env.rptid, dimi_block_env.diminum, testnum ); } openhpi-2.14.1/hpi_shell/commands.c0000644000076400007640000020001111302567132014077 0ustar /* -*- linux-c -*- * * Copyright (c) 2004 by Intel Corp. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Hu Yin * Racing Guo * Changes: * 11.30.2004 - Kouzmich < Mikhail.V.Kouzmich@intel.com >: * porting to HPI-B * 09.07.2005 - Renier Morales : * Changes due to move of oh_add_config_file to config.c * * */ #include #include #include #include #include #include #include #include #include #include #include "hpi_cmd.h" #define SEV_BUF_SIZE 32 typedef struct { char *name; SaHpiSeverityT val; } Sev_def_t; static Sev_def_t Sev_array[] = { {"crit", SAHPI_CRITICAL}, {"maj", SAHPI_MAJOR}, {"min", SAHPI_MINOR}, {"inf", SAHPI_INFORMATIONAL}, {"ok", SAHPI_OK}, {"debug", SAHPI_DEBUG}, {"all", SAHPI_ALL_SEVERITIES}, {NULL, 0} }; void help(int as) // as = 0 - Available commands // as = 1 - help command { command_def_t *cmd = NULL, *res = (command_def_t *)NULL; int len; term_def_t *term; if ((as == 0) || ((term = get_next_term()) == NULL)) { int width = 0; printf("Available commands are: \n\n"); for (cmd = commands; cmd->cmd != NULL; cmd++) { if ((cmd->type != MAIN_COM) && (cmd->type != block_type) && (cmd->type != UNDEF_COM)) continue; printf("%-20s", cmd->cmd); if ((++width % 4) == 0) printf("\n"); } printf("\n"); return; } for (;;) { register char *arg; int n; arg = term->term; len = strlen(arg); n = 0; for (cmd = commands; cmd->cmd != NULL; cmd++) { if ((cmd->type != MAIN_COM) && (cmd->type != block_type) && (cmd->type != UNDEF_COM)) continue; if (strncmp(cmd->cmd, arg, len) == 0) { if (n == 0) res = cmd; n++; }; if (strcmp(cmd->cmd, arg) == 0) { res = cmd; n = 1; break; } } if (n != 1) printf("Invalid help command %s\n", arg); else printf("%s\n", res->help); term = get_next_term(); if (term == NULL) break; } } static ret_code_t help_cmd(void) { help(1); return(HPI_SHELL_OK); } static ret_code_t add_config(void) { #if 0 // This code needs to call oHpi APIs instead of internal functions SaErrorT rv; term_def_t *term; struct oh_parsed_config config = {NULL, NULL, 0, 0, 0, 0}; term = get_next_term(); if (term == NULL) { printf("no config file\n"); return HPI_SHELL_CMD_ERROR; } rv = oh_load_config(term->term, &config); if (rv == SA_ERR_HPI_BUSY) { printf("Hold on. Another configuration changing is" " processing\n"); } if (rv == SA_ERR_HPI_NOT_PRESENT) { printf("Hold on. Initialization is processing\n"); } if (rv != SA_OK) return HPI_SHELL_CMD_ERROR; rv = oh_process_config(&config); oh_clean_config(&config); if (rv == SA_OK) return HPI_SHELL_OK; #endif return HPI_SHELL_CMD_ERROR; } static ret_code_t event(void) { term_def_t *term; term = get_next_term(); if (term == NULL) { printf("Event display: %s\n", prt_flag?"Enable":"Disable"); return(HPI_SHELL_OK); }; if (strcmp(term->term, "enable") == 0) { prt_flag = 1; printf("Event display enable successfully\n"); } else if (strcmp(term->term, "disable") == 0) { prt_flag = 0; printf("Event display disable successfully\n"); } else if (strcmp(term->term, "short") == 0) { show_event_short = 1; prt_flag = 1; printf("Event short display enable successfully\n"); } else if (strcmp(term->term, "full") == 0) { show_event_short = 0; prt_flag = 1; printf("Event full display enable successfully\n"); } else { return HPI_SHELL_PARM_ERROR; }; set_Subscribe((Domain_t *)NULL, prt_flag); return HPI_SHELL_OK; } static ret_code_t debugset(void) { char *val; term_def_t *term; if (debug_flag) printf("debugset:\n"); term = get_next_term(); if (term == NULL) { val = getenv("OPENHPI_ERROR"); if (val == (char *)NULL) val = "NO"; printf("OPENHPI_ERROR=%s\n", val); return(HPI_SHELL_OK); }; if (strcmp(term->term, "on") == 0) val = "YES"; else if (strcmp(term->term, "off") == 0) val = "NO"; else return HPI_SHELL_PARM_ERROR; setenv("OPENHPI_ERROR", val, 1); return HPI_SHELL_OK; } static ret_code_t moreset(void) { char *val; term_def_t *term; term = get_next_term(); if (term == NULL) { if (is_more) val = "ON"; else val = "OFF"; printf("more = %s\n", val); return(HPI_SHELL_OK); }; if (strcmp(term->term, "on") == 0) is_more = 1; else if (strcmp(term->term, "off") == 0) is_more = 0; else return HPI_SHELL_PARM_ERROR; return HPI_SHELL_OK; } static ret_code_t power(void) { SaErrorT rv; SaHpiResourceIdT resourceid; SaHpiPowerStateT state; int do_set = 1; term_def_t *term; ret_code_t ret; ret = ask_rpt(&resourceid); if (ret != HPI_SHELL_OK) return(ret); term = get_next_term(); if (term == NULL) do_set = 0; else if (!strcmp(term->term, "on")) { state = SAHPI_POWER_ON; } else if (!strcmp(term->term, "off")) { state = SAHPI_POWER_OFF; } else if (!strcmp(term->term, "cycle")) { state = SAHPI_POWER_CYCLE; } else { return HPI_SHELL_PARM_ERROR; } if (do_set) { rv = saHpiResourcePowerStateSet(Domain->sessionId, resourceid, state); if (rv != SA_OK) { printf("saHpiResourcePowerStateSet error %s\n", oh_lookup_error(rv)); return HPI_SHELL_CMD_ERROR; }; return HPI_SHELL_OK; } rv = saHpiResourcePowerStateGet(Domain->sessionId, resourceid, &state); if (rv != SA_OK) { printf("saHpiResourcePowerStateGet error %s\n", oh_lookup_error(rv)); return HPI_SHELL_CMD_ERROR; } if (state == SAHPI_POWER_ON) { printf("Resource %d is power on now.\n",resourceid); } else if (state == SAHPI_POWER_OFF) { printf("Resource %d is power off now.\n",resourceid); } return HPI_SHELL_OK; } static ret_code_t reset(void) { SaErrorT rv; SaHpiResourceIdT resourceid; SaHpiResetActionT state; int do_set = 1; term_def_t *term; ret_code_t ret; ret = ask_rpt(&resourceid); if (ret != HPI_SHELL_OK) return(ret); term = get_next_term(); if (term == NULL) do_set = 0; else if (!strcmp(term->term, "cold")) { state = SAHPI_COLD_RESET; } else if (!strcmp(term->term, "warm")) { state = SAHPI_WARM_RESET; } else if (!strcmp(term->term, "assert")) { state = SAHPI_RESET_ASSERT; } else if (!strcmp(term->term, "deassert")) { state = SAHPI_RESET_DEASSERT; } else { return HPI_SHELL_PARM_ERROR; } if (do_set) { rv = saHpiResourceResetStateSet(Domain->sessionId, resourceid, state); if (rv != SA_OK) { printf("saHpiResourceResetStateSet error %s\n", oh_lookup_error(rv)); return HPI_SHELL_CMD_ERROR; } } rv = saHpiResourceResetStateGet(Domain->sessionId, resourceid, &state); if (rv != SA_OK) { printf("saHpiResourceResetStateGet error %s\n", oh_lookup_error(rv)); return HPI_SHELL_CMD_ERROR; } if (state == SAHPI_RESET_ASSERT) { printf("Entity's reset of %d is asserted now.\n",resourceid); } else if (state == SAHPI_RESET_DEASSERT) { printf("Entity's reset of %d is not asserted now.\n",resourceid); } else { printf("Entity's reset of %d is not setted now.\n",resourceid); } return HPI_SHELL_OK; } static ret_code_t clear_evtlog(void) { SaHpiResourceIdT resourceid; term_def_t *term; SaErrorT rv; term = get_next_term(); if (term == NULL) resourceid = SAHPI_UNSPECIFIED_RESOURCE_ID; else resourceid = (SaHpiResourceIdT)atoi(term->term); rv = saHpiEventLogClear(Domain->sessionId, resourceid); if (rv != SA_OK) { printf("EventLog clear, error = %s\n", oh_lookup_error(rv)); return HPI_SHELL_CMD_ERROR; } printf("EventLog successfully cleared\n"); return HPI_SHELL_OK; } static ret_code_t set_tag(void) { SaHpiResourceIdT resid = 0; SaHpiTextBufferT tbuf; int i; char buf[SAHPI_MAX_TEXT_BUFFER_LENGTH + 1]; SaErrorT rv; SaHpiRptEntryT rpt_entry; Rpt_t tmp_rpt; ret_code_t ret; ret = ask_rpt(&resid); if (ret != HPI_SHELL_OK) return(ret); i = get_string_param("New tag: ", buf, SAHPI_MAX_TEXT_BUFFER_LENGTH); if (i != 0) { printf("Invalid tag: %s\n", buf); return(HPI_SHELL_PARM_ERROR); }; strcpy((char *)(tbuf.Data), buf); tbuf.DataType = SAHPI_TL_TYPE_TEXT; tbuf.Language = SAHPI_LANG_ENGLISH; tbuf.DataLength = strlen(buf); rv = saHpiResourceTagSet(Domain->sessionId, resid, &tbuf); if (rv != SA_OK) { printf("saHpiResourceTagSet error = %s\n", oh_lookup_error(rv)); return HPI_SHELL_CMD_ERROR; }; rv = saHpiRptEntryGetByResourceId(Domain->sessionId, resid, &rpt_entry); make_attrs_rpt(&tmp_rpt, &rpt_entry); show_Rpt(&tmp_rpt, ui_print); free_attrs(&(tmp_rpt.Attrutes)); return (HPI_SHELL_OK); } static ret_code_t parmctrl(void) { SaHpiResourceIdT resid; int i; char buf[10]; SaErrorT rv; SaHpiParmActionT act; ret_code_t ret; ret = ask_rpt(&resid); if (ret != HPI_SHELL_OK) return(ret); i = get_string_param("Action (default,save,restore): ", buf, 9); if (i != 0) { printf("Invalid action: %s\n", buf); return(HPI_SHELL_PARM_ERROR); }; if (strcmp(buf, "default") == 0) act = SAHPI_DEFAULT_PARM; else if (strcmp(buf, "save") == 0) act = SAHPI_SAVE_PARM; else if (strcmp(buf, "restore") == 0) act = SAHPI_RESTORE_PARM; else { printf("Invalid action: %s\n", buf); return(HPI_SHELL_PARM_ERROR); }; rv = saHpiParmControl(Domain->sessionId, resid, act); if (rv != SA_OK) { printf("saHpiParmControl error = %s\n", oh_lookup_error(rv)); return HPI_SHELL_CMD_ERROR; }; return (HPI_SHELL_OK); } static ret_code_t set_sever(void) { SaHpiResourceIdT resid; SaHpiSeverityT sev = SAHPI_OK; int i; char buf[SEV_BUF_SIZE + 1]; SaErrorT rv; SaHpiRptEntryT rpt_entry; Rpt_t tmp_rpt; ret_code_t ret; ret = ask_rpt(&resid); if (ret != HPI_SHELL_OK) return(ret); i = get_string_param( "New severity (crit, maj, min, inf, ok, debug, all): ", buf, SEV_BUF_SIZE); if (i != 0) { printf("Invalid sevetity: %s\n", buf); return(HPI_SHELL_PARM_ERROR); }; for (i = 0; Sev_array[i].name != (char *)NULL; i++) if (strcmp(buf, Sev_array[i].name) == 0) { sev = Sev_array[i].val; break; }; if (Sev_array[i].name == (char *)NULL) { printf("Invalid sevetity type: %s\n", buf); return(HPI_SHELL_PARM_ERROR); }; rv = saHpiResourceSeveritySet(Domain->sessionId, resid, sev); if (rv != SA_OK) { printf("saHpiResourceSeveritySet error = %s\n", oh_lookup_error(rv)); return HPI_SHELL_CMD_ERROR; }; rv = saHpiRptEntryGetByResourceId(Domain->sessionId, resid, &rpt_entry); make_attrs_rpt(&tmp_rpt, &rpt_entry); show_Rpt(&tmp_rpt, ui_print); free_attrs(&(tmp_rpt.Attrutes)); return (HPI_SHELL_OK); } static ret_code_t discovery(void) { SaErrorT ret; do_progress("Discover"); ret = saHpiDiscover(Domain->sessionId); if (SA_OK != ret) { printf("saHpiResourcesDiscover error = %s\n", oh_lookup_error(ret)); delete_progress(); return HPI_SHELL_CMD_ERROR; }; delete_progress(); return HPI_SHELL_OK; } static ret_code_t dat_list(void) { return show_dat(Domain, ui_print); } static ret_code_t listres(void) { term_def_t *term; int mask = SHORT_LSRES; term = get_next_term(); while (term != NULL) { if (strcmp(term->term, "stat") == 0) mask |= STATE_LSRES; else if (strcmp(term->term, "path") == 0) mask |= PATH_LSRES; else { printf("Invalid argument: %s\n", term->term); return(HPI_SHELL_PARM_ERROR); }; term = get_next_term(); }; show_rpt_list(Domain, SHOW_ALL_RPT, 0, mask, ui_print); return(HPI_SHELL_OK); } static ret_code_t show_evtlog(void) { SaHpiResourceIdT rptid = 0; term_def_t *term; term = get_next_term(); if (term == NULL) rptid = SAHPI_UNSPECIFIED_RESOURCE_ID; else rptid = (SaHpiResourceIdT)atoi(term->term); return show_event_log(Domain->sessionId, rptid, show_event_short, ui_print); } static ret_code_t evtlog_time(void) { SaHpiResourceIdT rptid = 0; SaErrorT rv; SaHpiTimeT logtime; SaHpiTextBufferT buffer; term_def_t *term; term = get_next_term(); if (term == NULL) rptid = SAHPI_UNSPECIFIED_RESOURCE_ID; else rptid = (SaHpiResourceIdT)atoi(term->term); rv = saHpiEventLogTimeGet(Domain->sessionId, rptid, &logtime); if (rv != SA_OK) { printf("saHpiEventLogTimeGet %s\n", oh_lookup_error(rv)); return (HPI_SHELL_CMD_ERROR); } oh_decode_time(logtime, &buffer); printf ("Current event log time: %s\n", buffer.Data); return HPI_SHELL_OK; } static ret_code_t evtlog_state(void) { SaHpiResourceIdT rptid = 0; SaErrorT rv; SaHpiBoolT state = SAHPI_TRUE; int do_set = 0; char *str; term_def_t *term; rptid = SAHPI_UNSPECIFIED_RESOURCE_ID; term = get_next_term(); if ((term != NULL) && (isdigit(term->term[0]))) rptid = (SaHpiResourceIdT)atoi(term->term); term = get_next_term(); if (term != NULL) { do_set = 1; if (strcmp(term->term, "enable") == 0) state = SAHPI_TRUE; else if (strcmp(term->term, "disable") == 0) state = SAHPI_FALSE; else return(HPI_SHELL_PARM_ERROR); }; if (do_set) { rv = saHpiEventLogStateSet(Domain->sessionId, rptid, state); if (rv != SA_OK) { printf("saHpiEventLogStateSet %s\n", oh_lookup_error(rv)); return(HPI_SHELL_CMD_ERROR); }; return(HPI_SHELL_OK); }; rv = saHpiEventLogStateGet(Domain->sessionId, rptid, &state); if (rv != SA_OK) { printf("saHpiEventLogStateGet %s\n", oh_lookup_error(rv)); return(HPI_SHELL_CMD_ERROR); }; if (state == SAHPI_TRUE) str = "Enable"; else str = "Disable"; printf("Event Log State: %s\n", str); return HPI_SHELL_OK; } static ret_code_t evtlog_reset(void) { SaHpiResourceIdT rptid = 0; SaErrorT rv; term_def_t *term; rptid = SAHPI_UNSPECIFIED_RESOURCE_ID; term = get_next_term(); if ((term != NULL) && (isdigit(term->term[0]))) rptid = (SaHpiResourceIdT)atoi(term->term); rv = saHpiEventLogOverflowReset(Domain->sessionId, rptid); if (rv != SA_OK) { printf("saHpiEventLogOverflowReset %s\n", oh_lookup_error(rv)); return(HPI_SHELL_CMD_ERROR); }; return HPI_SHELL_OK; } static ret_code_t settime_evtlog(void) { SaHpiResourceIdT rptid = 0; SaErrorT rv; SaHpiTimeT newtime; struct tm new_tm_time; char buf[READ_BUF_SIZE]; int day_array[] = { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 }; term_def_t *term; int i; rptid = SAHPI_UNSPECIFIED_RESOURCE_ID; term = get_next_term(); if ((term != NULL) && (isdigit(term->term[0]))) { if (strchr(term->term, ':') != (char *)NULL) { unget_term(); rptid = SAHPI_UNSPECIFIED_RESOURCE_ID; } else rptid = (SaHpiResourceIdT)atoi(term->term); } else rptid = SAHPI_UNSPECIFIED_RESOURCE_ID; if (rptid == SAHPI_UNSPECIFIED_RESOURCE_ID) printf("Set date and time for Domain Event Log!\n"); else printf("Set date and time for Resource %d!\n", rptid); memset(&new_tm_time, 0, sizeof(struct tm)); i = get_string_param("format: MM:DD:YYYY:hh:mm:ss ==> ", buf, READ_BUF_SIZE); if (i != 0) return(HPI_SHELL_PARM_ERROR); sscanf(buf, "%d:%d:%d:%d:%d:%d", &new_tm_time.tm_mon, &new_tm_time.tm_mday, &new_tm_time.tm_year, &new_tm_time.tm_hour, &new_tm_time.tm_min, &new_tm_time.tm_sec); if ((new_tm_time.tm_mon < 1) || (new_tm_time.tm_mon > 12)) { printf("Month out of range: (%d)\n", new_tm_time.tm_mon); return(HPI_SHELL_PARM_ERROR); }; new_tm_time.tm_mon--; if (new_tm_time.tm_year < 1900) { printf("Year out of range: (%d)\n", new_tm_time.tm_year); return(HPI_SHELL_PARM_ERROR); }; if (new_tm_time.tm_mon == 1) { /* if the given year is a leap year */ if ((((new_tm_time.tm_year % 4) == 0) && ((new_tm_time.tm_year % 100) != 0)) || ((new_tm_time.tm_year % 400) == 0)) day_array[1] = 29; }; if ((new_tm_time.tm_mday < 1) || (new_tm_time.tm_mday > day_array[new_tm_time.tm_mon])) { printf("Day out of range: (%d)\n", new_tm_time.tm_mday); return(HPI_SHELL_PARM_ERROR); }; new_tm_time.tm_year -= 1900; if ((new_tm_time.tm_hour < 0) || (new_tm_time.tm_hour > 24)) { printf("Hours out of range: (%d)\n", new_tm_time.tm_hour); return(HPI_SHELL_PARM_ERROR); }; if ((new_tm_time.tm_min < 0) || (new_tm_time.tm_min > 60)) { printf("Minutes out of range: (%d)\n", new_tm_time.tm_min); return(HPI_SHELL_PARM_ERROR); }; if ((new_tm_time.tm_sec < 0) || (new_tm_time.tm_sec > 60)) { printf("Seconds out of range: (%d)\n", new_tm_time.tm_sec); return(HPI_SHELL_PARM_ERROR); }; newtime = (SaHpiTimeT) mktime(&new_tm_time) * 1000000000; rv = saHpiEventLogTimeSet(Domain->sessionId, rptid, newtime); if (rv != SA_OK) { printf("saHpiEventLogTimeSet %s\n", oh_lookup_error(rv)); return(HPI_SHELL_CMD_ERROR); } return (HPI_SHELL_OK); } static ret_code_t show_rpt(void) { Rpt_t tmp_rpt; SaHpiRptEntryT rpt_entry; SaErrorT rv; SaHpiResourceIdT resid; ret_code_t ret; ret = ask_rpt(&resid); if (ret != HPI_SHELL_OK) return(ret); rv = saHpiRptEntryGetByResourceId(Domain->sessionId, resid, &rpt_entry); if (rv != SA_OK) { printf("NO rpt: %d\n", resid); return(HPI_SHELL_CMD_ERROR); }; make_attrs_rpt(&tmp_rpt, &rpt_entry); show_Rpt(&tmp_rpt, ui_print); free_attrs(&(tmp_rpt.Attrutes)); return (HPI_SHELL_OK); } static ret_code_t show_rdr(void) { Rdr_t tmp_rdr; SaHpiRdrT rdr_entry; SaHpiResourceIdT rptid = 0; SaHpiInstrumentIdT rdrnum; SaHpiRdrTypeT type; SaErrorT rv; int i; char buf[10], t; term_def_t *term; ret_code_t ret; term = get_next_term(); if (term == NULL) { if (read_file) return(HPI_SHELL_CMD_ERROR); i = show_rpt_list(Domain, SHOW_ALL_RPT, rptid, SHORT_LSRES, ui_print); if (i == 0) { printf("NO rpt!\n"); return(HPI_SHELL_CMD_ERROR); }; i = get_string_param("RPT (ID | all) ==> ", buf, 9); if (i != 0) return HPI_SHELL_CMD_ERROR; if (strncmp(buf, "all", 3) == 0) { show_rpt_list(Domain, SHOW_ALL_RDR, rptid, SHORT_LSRES, ui_print); return(HPI_SHELL_OK); }; rptid = (SaHpiResourceIdT)atoi(buf); } else { if (strcmp(term->term, "all") == 0) { show_rpt_list(Domain, SHOW_ALL_RDR, rptid, SHORT_LSRES, ui_print); return(HPI_SHELL_OK); }; if (isdigit(term->term[0])) rptid = (SaHpiResourceIdT)atoi(term->term); else return HPI_SHELL_PARM_ERROR; }; term = get_next_term(); if (term == NULL) { if (read_file) return(HPI_SHELL_CMD_ERROR); i = get_string_param("RDR Type (s|a|c|w|i|d|f) ==> ", buf, 9); if ( (i != 0) || (buf[0] == '\0') || (buf[1] != 0) ) return HPI_SHELL_PARM_ERROR; } else { memset(buf, 0, 10); strncpy(buf, term->term, 3); }; t = *buf; if (t == 'c') type = SAHPI_CTRL_RDR; else if (t == 's') type = SAHPI_SENSOR_RDR; else if (t == 'i') type = SAHPI_INVENTORY_RDR; else if (t == 'w') type = SAHPI_WATCHDOG_RDR; else if (t == 'a') type = SAHPI_ANNUNCIATOR_RDR; else if (t == 'd') type = SAHPI_DIMI_RDR; else if (t == 'f') type = SAHPI_FUMI_RDR; else return HPI_SHELL_PARM_ERROR; ret = ask_rdr(rptid, type, &rdrnum); if (ret != HPI_SHELL_OK) return(ret); rv = saHpiRdrGetByInstrumentId(Domain->sessionId, rptid, type, rdrnum, &rdr_entry); if (rv != SA_OK) { printf("ERROR!!! Get rdr: ResourceId=%d RdrType=%d" "RdrNum=%d: %s\n", rptid, type, rdrnum, oh_lookup_error(rv)); return(HPI_SHELL_CMD_ERROR); }; make_attrs_rdr(&tmp_rdr, &rdr_entry); show_Rdr(&tmp_rdr, ui_print); free_attrs(&(tmp_rdr.Attrutes)); return HPI_SHELL_OK; } static ret_code_t show_ver(void) { SaHpiVersionT ver = saHpiVersionGet(); printf("\nPackage version: %s\n", PACKAGE_VERSION); printf("HPI specification version: SAI_HPI-%c.%02d.%02d\n\n", ('A' + (ver >> 16) -1), (ver >> 8) & 0xFF, (ver) & 0xFF); return(HPI_SHELL_OK); } static ret_code_t wtd_get(void) { SaHpiResourceIdT rptid; SaHpiWatchdogNumT wtdnum; SaHpiWatchdogT watchdog; SaHpiWatchdogExpFlagsT flags; SaErrorT rv; ret_code_t ret; char *str; char tmp[256]; ret = ask_rpt(&rptid); if (ret != HPI_SHELL_OK) return(ret); ret = ask_rdr(rptid, SAHPI_WATCHDOG_RDR, &wtdnum); if (ret != HPI_SHELL_OK) return(ret); rv = saHpiWatchdogTimerGet(Domain->sessionId, rptid, wtdnum, &watchdog); if (rv != SA_OK) { printf("ERROR!!! Get Watchdog: ResourceId=%d " "WatchdogNum=%d: %s\n", rptid, wtdnum, oh_lookup_error(rv)); return(HPI_SHELL_CMD_ERROR); }; if (watchdog.Log) str = "TRUE"; else str = "FALSE"; printf(" Watchdogtimer (%d/%d): Log=%s", rptid, wtdnum, str); if (watchdog.Running) str = "Running"; else str = "Stopped"; printf(" %s\n", str); switch (watchdog.TimerUse) { case SAHPI_WTU_NONE: str = "NONE"; break; case SAHPI_WTU_BIOS_FRB2: str = "BIOS_FRB2"; break; case SAHPI_WTU_BIOS_POST: str = "BIOS_POST"; break; case SAHPI_WTU_OS_LOAD: str = "OS_LOAD"; break; case SAHPI_WTU_SMS_OS: str = "SMS_OS"; break; case SAHPI_WTU_OEM: str = "OEM"; break; case SAHPI_WTU_UNSPECIFIED: str = "UNSPEC"; break; default: str = "Unknown"; break; }; printf(" Timer Use: %s", str); switch (watchdog.TimerAction) { case SAHPI_WAE_NO_ACTION: str = "NO_ACTION"; break; case SAHPI_WAE_RESET: str = "RESET"; break; case SAHPI_WAE_POWER_DOWN: str = "POWER_DOWN"; break; case SAHPI_WAE_POWER_CYCLE: str = "POWER_CYCLE"; break; case SAHPI_WAE_TIMER_INT: str = "TIMER_INT"; break; default: str = "Unknown"; break; }; printf(" Action: %s", str); switch (watchdog.PretimerInterrupt) { case SAHPI_WPI_NONE: str = "NONE"; break; case SAHPI_WPI_SMI: str = "SMI"; break; case SAHPI_WPI_NMI: str = "NMI"; break; case SAHPI_WPI_MESSAGE_INTERRUPT: str = "MESSAGE"; break; case SAHPI_WPI_OEM: str = "OEM"; break; default: str = "Unknown"; break; }; printf(" Interrupt: %s", str); printf(" TimeOut: %d\n", watchdog.PreTimeoutInterval); tmp[0] = 0; flags = watchdog.TimerUseExpFlags; if (flags & SAHPI_WATCHDOG_EXP_BIOS_FRB2) strcat(tmp, " BIOS_FRB2 |"); if (flags & SAHPI_WATCHDOG_EXP_BIOS_POST) strcat(tmp, " BIOS_POST |"); if (flags & SAHPI_WATCHDOG_EXP_OS_LOAD) strcat(tmp, " OS_LOAD |"); if (flags & SAHPI_WATCHDOG_EXP_SMS_OS) strcat(tmp, " SMS_OS |"); if (flags & SAHPI_WATCHDOG_EXP_OEM) strcat(tmp, " OEM |"); if (strlen(tmp) > 0) { tmp[strlen(tmp) - 1] = 0; printf(" Flags: {%s}\n", tmp); } else printf(" Flags: (null)\n"); printf(" InitialCount = %d PresentCount = %d\n", watchdog.InitialCount, watchdog.PresentCount); return HPI_SHELL_OK; } static ret_code_t wtd_set(void) { SaHpiResourceIdT rptid; SaHpiWatchdogNumT wtdnum; SaHpiWatchdogT watchdog; SaHpiWatchdogExpFlagsT flags; SaErrorT rv; ret_code_t ret; int i, res; char *str, *str1; char tmp[256]; ret = ask_rpt(&rptid); if (ret != HPI_SHELL_OK) return(ret); ret = ask_rdr(rptid, SAHPI_WATCHDOG_RDR, &wtdnum); if (ret != HPI_SHELL_OK) return(ret); i = get_string_param("Log(0 | 1): ", tmp, 255); if (i != 0) { printf("Invalid Log value: %s\n", tmp); return(HPI_SHELL_PARM_ERROR); }; if (tmp[0] == '1') watchdog.Log = SAHPI_TRUE; else watchdog.Log = SAHPI_FALSE; i = get_string_param("Running(0 | 1): ", tmp, 255); if (i != 0) { printf("Invalid Running value: %s\n", tmp); return(HPI_SHELL_PARM_ERROR); }; if (tmp[0] == '1') watchdog.Running = SAHPI_TRUE; else watchdog.Running = SAHPI_FALSE; i = get_string_param( "TimerUse(none|bios_frb2|bios_post|os_load|sms_os|oem): ", tmp, 255); if (i != 0) { printf("Invalid TimerUse value: %s\n", tmp); return(HPI_SHELL_PARM_ERROR); }; if (strcmp(tmp, "none") == 0) watchdog.TimerUse = SAHPI_WTU_NONE; else if (strcmp(tmp, "bios_frb2") == 0) watchdog.TimerUse = SAHPI_WTU_BIOS_FRB2; else if (strcmp(tmp, "bios_post") == 0) watchdog.TimerUse = SAHPI_WTU_BIOS_POST; else if (strcmp(tmp, "os_load") == 0) watchdog.TimerUse = SAHPI_WTU_OS_LOAD; else if (strcmp(tmp, "sms_os") == 0) watchdog.TimerUse = SAHPI_WTU_SMS_OS; else if (strcmp(tmp, "oem") == 0) watchdog.TimerUse = SAHPI_WTU_OEM; else { printf("Invalid TimerUse value: %s\n", tmp); return(HPI_SHELL_PARM_ERROR); }; i = get_string_param( "TimerAction(no|reset|pwr_down|pwr_cycle|int): ", tmp, 255); if (i != 0) { printf("Invalid TimerAction value: %s\n", tmp); return(HPI_SHELL_PARM_ERROR); }; if (strcmp(tmp, "no") == 0) watchdog.TimerAction = SAHPI_WAE_NO_ACTION; else if (strcmp(tmp, "reset") == 0) watchdog.TimerAction = SAHPI_WAE_RESET; else if (strcmp(tmp, "pwr_down") == 0) watchdog.TimerAction = SAHPI_WAE_POWER_DOWN; else if (strcmp(tmp, "pwr_cycle") == 0) watchdog.TimerAction = SAHPI_WAE_POWER_CYCLE; else if (strcmp(tmp, "int") == 0) watchdog.TimerAction = SAHPI_WAE_TIMER_INT; else { printf("Invalid TimerAction value: %s\n", tmp); return(HPI_SHELL_PARM_ERROR); }; i = get_string_param("PretimerInterrupt(no|smi|nmi|mess|oem): ", tmp, 255); if (i != 0) { printf("Invalid PretimerInterrupt value: %s\n", tmp); return(HPI_SHELL_PARM_ERROR); }; if (strcmp(tmp, "no") == 0) watchdog.PretimerInterrupt = SAHPI_WPI_NONE; else if (strcmp(tmp, "smi") == 0) watchdog.PretimerInterrupt = SAHPI_WPI_SMI; else if (strcmp(tmp, "nmi") == 0) watchdog.PretimerInterrupt = SAHPI_WPI_NMI; else if (strcmp(tmp, "mess") == 0) watchdog.PretimerInterrupt = SAHPI_WPI_MESSAGE_INTERRUPT; else if (strcmp(tmp, "oem") == 0) watchdog.PretimerInterrupt = SAHPI_WPI_OEM; else { printf("Invalid TimerAction value: %s\n", tmp); return(HPI_SHELL_PARM_ERROR); }; i = get_int_param("TimeOut: ", &res); if (i != 1) { printf("Invalid TimeOut value\n"); return(HPI_SHELL_PARM_ERROR); }; watchdog.PreTimeoutInterval = res; i = get_string_param("Flags(\"bios_frb2|bios_post|os_load|sms_os|oem\"): ", tmp, 255); if (i != 0) *tmp = 0; flags = 0; str = tmp; while (strlen(str) != 0) { while (isspace(*str)) str++; str1 = str; while ((*str1 != ' ') && (*str1 != 0) && (*str1 != '|')) str1++; if (*str1 != 0) *str1++ = 0; else *str1 = 0; if (strcmp(str, "bios_frb2") == 0) flags |= SAHPI_WATCHDOG_EXP_BIOS_FRB2; if (strcmp(str, "bios_post") == 0) flags |= SAHPI_WATCHDOG_EXP_BIOS_POST; if (strcmp(str, "os_load") == 0) flags |= SAHPI_WATCHDOG_EXP_OS_LOAD; if (strcmp(str, "sms_os") == 0) flags |= SAHPI_WATCHDOG_EXP_SMS_OS; if (strcmp(str, "oem") == 0) flags |= SAHPI_WATCHDOG_EXP_OEM; str = str1; }; watchdog.TimerUseExpFlags = flags; i = get_int_param("InitialCount: ", &res); if (i != 1) { printf("Invalid InitialCount value\n"); return(HPI_SHELL_PARM_ERROR); }; watchdog.InitialCount = res; rv = saHpiWatchdogTimerSet(Domain->sessionId, rptid, wtdnum, &watchdog); if (rv != SA_OK) { printf("ERROR!!! Set Watchdog: ResourceId=%d WatchdogNum=%d: %s\n", rptid, wtdnum, oh_lookup_error(rv)); return(HPI_SHELL_CMD_ERROR); }; return HPI_SHELL_OK; } static ret_code_t wtd_reset(void) { SaHpiResourceIdT rptid; SaHpiWatchdogNumT wtdnum; SaErrorT rv; ret_code_t ret; ret = ask_rpt(&rptid); if (ret != HPI_SHELL_OK) return(ret); ret = ask_rdr(rptid, SAHPI_WATCHDOG_RDR, &wtdnum); if (ret != HPI_SHELL_OK) return(ret); rv = saHpiWatchdogTimerReset(Domain->sessionId, rptid, wtdnum); if (rv != SA_OK) { printf("ERROR!!! Reset Watchdog: ResourceId=%d WatchdogNum=%d: %s\n", rptid, wtdnum, oh_lookup_error(rv)); return(HPI_SHELL_CMD_ERROR); }; return HPI_SHELL_OK; } static ret_code_t quit(void) { if (block_type != MAIN_COM) { unget_term(); return(HPI_SHELL_OK); }; printf("quit\n"); restore_term_flags(); close_session(); exit(0); } static ret_code_t reopen_session(void) { int eflag = 0, fflag = 0; term_def_t *term; SaErrorT rv; term = get_next_term(); while (term != NULL) { if (strcmp(term->term, "force") == 0) { fflag = 1; } else { printf("Invalid argument: %s\n", term->term); return(HPI_SHELL_PARM_ERROR); }; term = get_next_term(); }; do { rv = saHpiSessionClose(Domain->sessionId); sleep( 1 ); } while ( fflag == 0 && rv != SA_OK && rv != SA_ERR_HPI_NO_RESPONSE ); if (rv != SA_OK) { printf("saHpiSessionClose error %s\n", oh_lookup_error(rv)); } if (open_session(eflag) != 0) { printf("Can not open session\n"); return(HPI_SHELL_CMD_ERROR); } return(HPI_SHELL_OK); } static ret_code_t run(void) { term_def_t *term; char *path; term = get_next_term(); if (term == NULL) return(HPI_SHELL_PARM_ERROR); path = term->term; return(open_file(path)); } static ret_code_t exec_proc(void) { term_def_t *term; char buf[4096]; term = get_next_term(); if (term == NULL) return(HPI_SHELL_PARM_ERROR); strcpy(buf, term->term); while (term != NULL) { term = get_next_term(); if (term == NULL) break; if (term->term_type != ITEM_TERM) break; strcat(buf, " "); strcat(buf, term->term); }; if (system(buf) < 0) return(HPI_SHELL_CMD_ERROR); return(HPI_SHELL_OK); } static ret_code_t echo(void) { term_def_t *term; term = get_next_term(); if (term != NULL) printf("%s\n", term->term); return(HPI_SHELL_OK); } static ret_code_t domain_info(void) { SaHpiDomainInfoT info; SaHpiTextBufferT *buf; SaErrorT rv; char date[30]; rv = saHpiDomainInfoGet(Domain->sessionId, &info); if (rv != SA_OK) { printf("ERROR!!! saHpiDomainInfoGet: %s\n", oh_lookup_error(rv)); return(HPI_SHELL_CMD_ERROR); }; printf("Domain: %d Capabil: 0x%x IsPeer: %d Guid: %s\n", info.DomainId, info.DomainCapabilities, info.IsPeer, info.Guid); buf = &(info.DomainTag); print_text_buffer_text(" Tag: ", buf, NULL, ui_print); printf("\n"); time2str(info.DrtUpdateTimestamp, date, 30); printf(" DRT update count: %d DRT Timestamp : %s\n", info.DrtUpdateCount, date); time2str(info.RptUpdateTimestamp, date, 30); printf(" RPT update count: %d RPT Timestamp : %s\n", info.RptUpdateCount, date); time2str(info.DatUpdateTimestamp, date, 30); printf(" DAT update count: %d DAT Timestamp : %s\n", info.DatUpdateCount, date); printf(" ActiveAlarms: %d CriticalAlarms: %d Major: %d " "Minor: %d Limit: %d\n", info.ActiveAlarms, info.CriticalAlarms, info.MajorAlarms, info.MinorAlarms, info.DatUserAlarmLimit); printf(" DatOverflow : %d\n", info.DatOverflow); return(HPI_SHELL_OK); } ret_code_t domain_proc(void) { SaHpiDomainInfoT info; SaHpiEntryIdT entryid, nextentryid; SaHpiDrtEntryT drtentry; SaErrorT rv; SaHpiDomainIdT id; SaHpiSessionIdT sessionId; int i, n, first; gpointer ptr; Domain_t *domain = (Domain_t *)NULL; Domain_t *new_domain; term_def_t *term; term = get_next_term(); if (term == NULL) { printf("Domain list:\n"); printf(" ID: %d SessionId: %d", Domain->domainId, Domain->sessionId); rv = saHpiDomainInfoGet(Domain->sessionId, &info); if (rv == SA_OK) { print_text_buffer_text(" Tag: ", &(info.DomainTag), NULL, ui_print); }; printf("\n"); entryid = SAHPI_FIRST_ENTRY; first = 1; while (entryid != SAHPI_LAST_ENTRY) { rv = saHpiDrtEntryGet(Domain->sessionId, entryid, &nextentryid, &drtentry); if (rv != SA_OK) break; if (first) { first = 0; printf(" Domain Reference Table:\n"); }; printf(" ID: %d", drtentry.DomainId); entryid = nextentryid; rv = saHpiSessionOpen(drtentry.DomainId, &sessionId, NULL); if (rv != SA_OK) { printf("\n"); continue; }; rv = saHpiDomainInfoGet(sessionId, &info); if (rv == SA_OK) { print_text_buffer_text(" Tag: ", &(info.DomainTag), NULL, ui_print); }; saHpiSessionClose(sessionId); printf("\n"); } return(HPI_SHELL_OK); }; if (isdigit(term->term[0])) id = (int)atoi(term->term); else return HPI_SHELL_PARM_ERROR; n = g_slist_length(domainlist); for (i = 0; i < n; i++) { ptr = g_slist_nth_data(domainlist, i); if (ptr == (gpointer)NULL) break; domain = (Domain_t *)ptr; if (domain->domainId == id) break; }; if (i >= n) { new_domain = (Domain_t *)malloc(sizeof(Domain_t)); memset(new_domain, 0, sizeof(Domain_t)); new_domain->domainId = id; if (add_domain(new_domain) < 0) { free(new_domain); printf("Can not open domain: %d\n", id); return HPI_SHELL_PARM_ERROR; }; domain = new_domain; }; Domain = domain; set_Subscribe(Domain, prt_flag); add_domain(Domain); return(HPI_SHELL_OK); } #ifdef KUZ_DEBUG static ret_code_t test_cmd(void) { char ar[256], s[10]; int c, n; while (1) { c = getchar(); memset(s, 0, 5); n = *s; snprintf(ar, 256, "input: <%c> <0x%x> <%d>\n", c, c, c); printf("%s", ar); }; return(HPI_SHELL_OK); } #endif /* command table */ const char addcfghelp[] = "addcfg: add plugins, domains, handlers from" " config file\nUsage: addcfg \n"; const char annhelp[] = "ann: annunciator command block\n" "Usage: ann \n"; const char clevtloghelp[] = "clearevtlog: clear system event logs\n" "Usage: clearevtlog []"; const char ctrlhelp[] = "ctrl: control command block\n" "Usage: ctrl []\n" " ctrlId:: \n"; const char dathelp[] = "dat: domain alarm table list\n" "Usage: dat"; const char dimiblockhelp[] = "dimi: DIMI command block\n" "Usage: dimi []\n" " DimiId:: \n"; const char debughelp[] = "debug: set or unset OPENHPI_ERROR environment\n" "Usage: debug [ on | off ]"; const char domainhelp[] = "domain: show domain list and set current domain\n" "Usage: domain []"; const char domaininfohelp[] = "domaininfo: show current domain info\n" "Usage: domaininfo"; const char dscvhelp[] = "dscv: discovery resources\n" "Usage: dscv "; const char echohelp[] = "echo: pass string to the stdout\n" "Usage: echo "; const char eventhelp[] = "event: enable or disable event display on screen\n" "Usage: event [enable|disable|short|full] "; const char evtlresethelp[] = "evtlogreset: reset the OverflowFlag in the event log\n" "Usage: evtlogreset []"; const char evtlstatehelp[] = "evtlogstate: show and set the event log state\n" "Usage: evtlogstate [] [enable|disable]"; const char evtlogtimehelp[] = "evtlogtime: show the event log's clock\n" "Usage: evtlogtime []"; const char exechelp[] = "exec: execute external program\n" "Usage: exec [parameters]"; const char fumiblockhelp[] = "fumi: FUMI command block\n" "Usage: fumi []\n" " DimiId:: \n"; const char helphelp[] = "help: help information for OpenHPI commands\n" "Usage: help [optional commands]"; const char historyhelp[] = "history: show input commands history\n" "Usage: history"; const char hsblockhelp[] = "hs: hot swap command block\n" "Usage: hs \n"; const char hsindhelp[] = "hotswap_ind: show hot swap indicator state\n" "Usage: hotswap_ind "; const char hsstathelp[] = "hotswapstat: retrieve hot swap state of a resource\n" "Usage: hotswapstat "; const char invhelp[] = "inv: inventory command block\n" "Usage: inv []\n" " InvId:: \n"; const char lreshelp[] = "lsres: list resources\n" "Usage: lsres [stat] [path]"; const char lsorhelp[] = "lsensor: list sensors\n" "Usage: lsensor"; const char morehelp[] = "more: set or unset more enable\n" "Usage: more [ on | off ]"; const char parmctrlhelp[] = "parmctrl: save and restore parameters for a resource\n" "Usage: parmctrl \n" " action - default | save | restore"; const char powerhelp[] = "power: power the resource on, off or cycle\n" "Usage: power [on|off|cycle]"; const char quithelp[] = "quit: close session and quit console\n" "Usage: quit"; const char resethelp[] = "reset: perform specified reset on the entity\n" "Usage: reset [cold|warm|assert|deassert]"; const char reopenhelp[] = "reopen: reopens session\n" "Usage: reopen [force]\n" "force flag skips old session closing check"; const char runhelp[] = "run: execute command file\n" "Usage: run "; const char senhelp[] = "sen: sensor command block\n" "Usage: sen []\n" " sensorId:: \n"; const char setseverhelp[] = "setsever: set severity for a resource\n" "Usage: setsever []"; const char settaghelp[] = "settag: set tag for a particular resource\n" "Usage: settag []"; const char settmevtlhelp[] = "settimeevtlog: sets the event log's clock\n" "Usage: settimeevtlog []"; const char showevtloghelp[] = "showevtlog: show system event logs\n" "Usage: showevtlog []"; const char showinvhelp[] = "showinv: show inventory data of a resource\n" "Usage: showinv []"; const char showrdrhelp[] = "showrdr: show resource data record\n" "Usage: showrdr [ [type []]]\n" " or rdr [ [type []]]\n" " type = c - control rdr, s - sensor, i - inventory rdr\n" " w - watchdog, a - annunciator"; const char showrpthelp[] = "showrpt: show resource information\n" "Usage: showrpt []\n" " or rpt []"; const char versionhelp[] = "ver: show HPI specification, package versions\n" "Usage: ver"; const char wtdgethelp[] = "wtdget: show watchdog timer\n" "Usage: wtdget "; const char wtdresethelp[] = "wtdreset: reset watchdog timer\n" "Usage: wtdreset "; const char wtdsethelp[] = "wtdset: set watchdog timer\n" "Usage: wtdset "; // sensor command block const char sen_dishelp[] = "disable: set sensor disable\n" "Usage: disable"; const char sen_enbhelp[] = "enable: set sensor enable\n" "Usage: enable"; const char sen_evtenbhelp[] = "evtenb: set sensor event enable\n" "Usage: evtenb"; const char sen_evtdishelp[] = "evtdis: set sensor event disable\n" "Usage: evtdis"; const char sen_mskaddhelp[] = "maskadd: add sensor event masks\n" "Usage: maskadd"; const char sen_mskrmhelp[] = "maskrm: remove sensor event masks\n" "Usage: maskrm"; const char sen_setthhelp[] = "setthres: set sensor thresholds\n" "Usage: setthres"; const char sen_showhelp[] = "show: show sensor state\n" "Usage: show"; // inventory command block const char inv_addahelp[] = "addarea: add inventory area\n" "Usage: addarea"; const char inv_addfhelp[] = "addfield: add inventory field\n" "Usage: addfield"; const char inv_delahelp[] = "delarea: delete inventory area\n" "Usage: delarea"; const char inv_delfhelp[] = "delfield: delete inventory field\n" "Usage: delfield"; const char inv_setfhelp[] = "setfield: set inventory field\n" "Usage: setfield"; const char inv_showhelp[] = "show: show inventory\n" "Usage: show []"; // control command block const char ctrl_setsthelp[] = "setstate: set control state\n" "Usage: setstate "; const char ctrl_showhelp[] = "show: show control\n" "Usage: show"; const char ctrl_sthelp[] = "state: show control state\n" "Usage: state"; // annunciator command block const char ann_acknowhelp[] = "acknow: set acknowledge flag\n" "Usage: acknow [] | [all ]"; const char ann_addhelp[] = "add: add Announcement\n" "Usage: add "; const char ann_delhelp[] = "delete: delete Announcement\n" "Usage: delete "; const char ann_listhelp[] = "list: show Announcement list\n" "Usage: list"; const char ann_mgethelp[] = "modeget: show annunciator mode\n" "Usage: modeget"; const char ann_msethelp[] = "modeset: set annunciator mode\n" "Usage: modeset "; const char ann_showhelp[] = "show: show annunciator or condition\n" "Usage: show [num]"; // Hot swap command block const char hs_actionhelp[] = "action: set action process\n" "Usage: action insert|extract"; const char hs_activehelp[] = "active: set active state\n" "Usage: active"; const char hs_gettohelp[] = "gettimeout: show timeout\n" "Usage: gettimeout insert|extract"; const char hs_inactivehelp[] = "inactive: set inactive state\n" "Usage: inactive"; const char hs_indhelp[] = "ind: set and show indicator state\n" "Usage: ind get|on|off"; const char hs_policyhelp[] = "policycancel: set default policy\n" "Usage: policycancel"; const char hs_settohelp[] = "settimeout: set timeout\n" "Usage: settimeout insert|extract "; const char hs_statehelp[] = "state: show hot swap state\n" "Usage: state"; // DIMI command block const char dimi_infohelp[] = "info: shows information about DIMI\n" "Usage: info"; const char dimi_testinfohelp[] = "testinfo: shows information about specified test\n" "Usage: testinfo []"; const char dimi_readyhelp[] = "ready: shows information about the DIMI readiness to run specified test\n" "Usage: ready "; const char dimi_starthelp[] = "start: starts execution of specified test\n" "Usage: start "; const char dimi_cancelhelp[] = "cancel: cancels specified test running\n" "Usage: cancel "; const char dimi_statushelp[] = "status: shows status of specified test\n" "Usage: status "; const char dimi_resultshelp[] = "results: show results from the last run of specified test\n" "Usage: results "; // FUMI command block const char fumi_setsourcehelp[] = "setsource : set new source information to the specified bank\n" "Usage: setsource "; const char fumi_validatesourcehelp[] = "validatesource : initiates the validation of the integrity of " "the source image associated with the designated bank\n" "Usage: validatesource "; const char fumi_getsourcehelp[] = "getsource : shows information about the source image assigned to " "designated bank\n" "Usage: getsource "; const char fumi_targetinfohelp[] = "targetinfo : shows information about the specified bank\n" "Usage: targetinfo "; const char fumi_backuphelp[] = "backup : initiates a backup of currently active bank\n" "Usage: backup"; const char fumi_setbootorderhelp[] = "setbootorder : set the position of a bank in the boot order\n" "Usage: setbootorder "; const char fumi_bankcopyhelp[] = "bankcopy : initiates a copy of the contents of one bank to another bank\n" "Usage: bankcopy "; const char fumi_installhelp[] = "install : starts an installation process, loading firmware to " "a specified bank\n" "Usage: install "; const char fumi_statushelp[] = "status : shows upgrade status of the FUMI\n" "Usage: status "; const char fumi_verifytargethelp[] = "verifytarget : starts the verification process of the upgraded image\n" "Usage: verifytarget "; const char fumi_cancelhelp[] = "cancel : stops upgrade asynchronous operation in progress\n" "Usage: cancel "; const char fumi_rollbackhelp[] = "rollback : initiates a rollback operation to " "restore the currently active bank with a backup version\n" "Usage: rollback "; const char fumi_activatehelp[] = "activate : starts execution of the active image on the FUMI\n" "Usage: activate "; command_def_t commands[] = { { "addcfg", add_config, addcfghelp, MAIN_COM }, { "ann", ann_block, annhelp, MAIN_COM }, { "clearevtlog", clear_evtlog, clevtloghelp, MAIN_COM }, { "ctrl", ctrl_block, ctrlhelp, MAIN_COM }, { "dat", dat_list, dathelp, MAIN_COM }, { "debug", debugset, debughelp, UNDEF_COM }, { "dimi", dimi_block, dimiblockhelp, MAIN_COM }, { "domain", domain_proc, domainhelp, MAIN_COM }, { "domaininfo", domain_info, domaininfohelp, MAIN_COM }, { "dscv", discovery, dscvhelp, MAIN_COM }, { "echo", echo, echohelp, UNDEF_COM }, { "event", event, eventhelp, UNDEF_COM }, { "evtlogtime", evtlog_time, evtlogtimehelp, MAIN_COM }, { "evtlogreset", evtlog_reset, evtlresethelp, MAIN_COM }, { "evtlogstate", evtlog_state, evtlstatehelp, MAIN_COM }, { "exec", exec_proc, exechelp, UNDEF_COM }, { "fumi", fumi_block, fumiblockhelp, MAIN_COM }, { "help", help_cmd, helphelp, UNDEF_COM }, { "history", history_cmd, historyhelp, UNDEF_COM }, { "hs", hs_block, hsblockhelp, MAIN_COM }, { "inv", inv_block, invhelp, MAIN_COM }, { "lsres", listres, lreshelp, UNDEF_COM }, { "lsensor", list_sensor, lsorhelp, MAIN_COM }, { "more", moreset, morehelp, UNDEF_COM }, { "parmctrl", parmctrl, parmctrlhelp, MAIN_COM }, { "power", power, powerhelp, MAIN_COM }, { "quit", quit, quithelp, UNDEF_COM }, { "rdr", show_rdr, showrdrhelp, MAIN_COM }, { "reopen", reopen_session, reopenhelp, UNDEF_COM }, { "reset", reset, resethelp, MAIN_COM }, { "rpt", show_rpt, showrpthelp, MAIN_COM }, { "run", run, runhelp, MAIN_COM }, { "sen", sen_block, senhelp, MAIN_COM }, { "settag", set_tag, settaghelp, MAIN_COM }, { "setsever", set_sever, setseverhelp, MAIN_COM }, { "settimeevtlog", settime_evtlog, settmevtlhelp, MAIN_COM }, { "showevtlog", show_evtlog, showevtloghelp, MAIN_COM }, { "showinv", show_inv, showinvhelp, MAIN_COM }, { "showrdr", show_rdr, showrdrhelp, MAIN_COM }, { "showrpt", show_rpt, showrpthelp, MAIN_COM }, { "ver", show_ver, versionhelp, UNDEF_COM }, { "wtdget", wtd_get, wtdgethelp, MAIN_COM }, { "wtdreset", wtd_reset, wtdresethelp, MAIN_COM }, { "wtdset", wtd_set, wtdsethelp, MAIN_COM }, { "?", help_cmd, helphelp, UNDEF_COM }, #ifdef KUZ_DEBUG { "test", test_cmd, helphelp, UNDEF_COM }, #endif // sensor command block { "disable", sen_block_disable, sen_dishelp, SEN_COM }, { "enable", sen_block_enable, sen_enbhelp, SEN_COM }, { "evtdis", sen_block_evtdis, sen_evtdishelp, SEN_COM }, { "evtenb", sen_block_evtenb, sen_evtenbhelp, SEN_COM }, { "maskadd", sen_block_maskadd, sen_mskaddhelp, SEN_COM }, { "maskrm", sen_block_maskrm, sen_mskrmhelp, SEN_COM }, { "setthres", sen_block_setthres, sen_setthhelp, SEN_COM }, { "show", sen_block_show, sen_showhelp, SEN_COM }, // inventory command block { "addarea", inv_block_addarea, inv_addahelp, INV_COM }, { "addfield", inv_block_addfield, inv_addfhelp, INV_COM }, { "delarea", inv_block_delarea, inv_delahelp, INV_COM }, { "delfield", inv_block_delfield, inv_delfhelp, INV_COM }, { "setfield", inv_block_setfield, inv_setfhelp, INV_COM }, { "show", inv_block_show, inv_showhelp, INV_COM }, // control command block { "setstate", ctrl_block_setst, ctrl_setsthelp, CTRL_COM }, { "show", ctrl_block_show, ctrl_showhelp, CTRL_COM }, { "state", ctrl_block_state, ctrl_sthelp, CTRL_COM }, // annunciator command block { "acknow", ann_block_acknow, ann_acknowhelp, ANN_COM }, { "add", ann_block_add, ann_addhelp, ANN_COM }, { "delete", ann_block_delete, ann_delhelp, ANN_COM }, { "list", ann_block_list, ann_listhelp, ANN_COM }, { "modeget", ann_block_modeget, ann_mgethelp, ANN_COM }, { "modeset", ann_block_modeset, ann_msethelp, ANN_COM }, { "show", ann_block_show, ann_showhelp, ANN_COM }, // Hot swap command block { "action", hs_block_action,hs_actionhelp, HS_COM }, { "active", hs_block_active,hs_activehelp, HS_COM }, { "gettimeout", hs_block_gtime, hs_gettohelp, HS_COM }, { "inactive", hs_block_inact, hs_inactivehelp,HS_COM }, { "ind", hs_block_ind, hs_indhelp, HS_COM }, { "policycancel", hs_block_policy,hs_policyhelp, HS_COM }, { "settimeout", hs_block_stime, hs_settohelp, HS_COM }, { "state", hs_block_state, hs_statehelp, HS_COM }, // DIMI command block { "info", dimi_block_info, dimi_infohelp, DIMI_COM }, { "testinfo", dimi_block_testinfo, dimi_testinfohelp, DIMI_COM }, { "ready", dimi_block_ready, dimi_readyhelp, DIMI_COM }, { "start", dimi_block_start, dimi_starthelp, DIMI_COM }, { "cancel", dimi_block_cancel, dimi_cancelhelp, DIMI_COM }, { "status", dimi_block_status, dimi_statushelp, DIMI_COM }, { "results", dimi_block_results, dimi_resultshelp, DIMI_COM }, // FUMI command block { "setsource", fumi_block_setsource, fumi_setsourcehelp, FUMI_COM }, { "validatesource", fumi_block_validatesource, fumi_validatesourcehelp, FUMI_COM }, { "getsource", fumi_block_getsource, fumi_getsourcehelp, FUMI_COM }, { "targetinfo", fumi_block_targetinfo, fumi_targetinfohelp, FUMI_COM }, { "backup", fumi_block_backup, fumi_backuphelp, FUMI_COM }, { "setbootorder", fumi_block_setbootorder, fumi_setbootorderhelp, FUMI_COM }, { "bankcopy", fumi_block_bankcopy, fumi_bankcopyhelp, FUMI_COM }, { "install", fumi_block_install, fumi_installhelp, FUMI_COM }, { "status", fumi_block_status, fumi_statushelp, FUMI_COM }, { "verifytarget", fumi_block_verifytarget, fumi_verifytargethelp, FUMI_COM }, { "cancel", fumi_block_cancel, fumi_cancelhelp, FUMI_COM }, { "rollback", fumi_block_rollback, fumi_rollbackhelp, FUMI_COM }, { "activate", fumi_block_activate, fumi_activatehelp, FUMI_COM }, // Terminator { NULL, NULL, NULL, MAIN_COM } }; openhpi-2.14.1/hpi_shell/show.c0000644000076400007640000014533011302567132013272 0ustar /* -*- linux-c -*- * * Copyright (c) 2004 by Intel Corp. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * Kouzmich < Mikhail.V.Kouzmich@intel.com > * * */ #include #include #include #include #define SHOW_BUF_SZ 1024 #define HPIBOOL2STR( x ) ( ( x == SAHPI_TRUE ) ? "TRUE" : "FALSE" ) extern char *lookup_proc(int num, int val); extern SaErrorT decode_proc(int num, void *val, char *buf, int bufsize); extern SaErrorT decode1_proc(int num, int val, char *buf, int bufsize); extern SaErrorT thres_value(SaHpiSensorReadingT *item, char *buf, int size); static int is_ATCA(SaHpiSessionIdT sessionid, SaHpiResourceIdT resourceid) { SaHpiRptEntryT rpt_entry; SaHpiEntityPathT *path; int i; if (saHpiRptEntryGetByResourceId(sessionid, resourceid, &rpt_entry) != SA_OK) return(0); path = &(rpt_entry.ResourceEntity); for (i = 0; i < SAHPI_MAX_ENTITY_PATH; i++) if (path->Entry[i].EntityType == SAHPI_ENT_ADVANCEDTCA_CHASSIS) return(1); return(0); } SaErrorT sensor_list(SaHpiSessionIdT sessionid, hpi_ui_print_cb_t proc) { SaErrorT rv = SA_OK; Pr_ret_t ret; SaHpiRptEntryT rptentry; SaHpiEntryIdT rptentryid; SaHpiEntryIdT nextrptentryid; /* walk the RPT list */ rptentryid = SAHPI_FIRST_ENTRY; while (rptentryid != SAHPI_LAST_ENTRY) { rv = saHpiRptEntryGet(sessionid, rptentryid, &nextrptentryid, &rptentry); if (rv != SA_OK) break; ret = show_sensor_list(sessionid, rptentry.ResourceId, proc); if (ret == HPI_UI_END) return(SA_OK); rptentryid = nextrptentryid; }; return(rv); } Pr_ret_t print_thres_value(SaHpiSensorReadingT *item, char *info, SaHpiSensorThdDefnT *def, int num, hpi_ui_print_cb_t proc) { char mes[256]; char buf[SHOW_BUF_SZ]; int i, j = 0; if (item->IsSupported != SAHPI_TRUE) { snprintf(buf, SHOW_BUF_SZ, "%s not supported.\n", info); return(proc(buf)); }; strcpy(mes, info); if (def != (SaHpiSensorThdDefnT *)NULL) { if (def->ReadThold & num) { if (def->WriteThold & num) strcat(mes, "(RW)"); else strcat(mes, "(RO)"); } else { if (def->WriteThold & num) strcat(mes, "(WO)"); else strcat(mes, "(NA)"); } }; switch (item->Type) { case SAHPI_SENSOR_READING_TYPE_INT64: snprintf(buf, SHOW_BUF_SZ, "%s %lld\n", mes, item->Value.SensorInt64); break; case SAHPI_SENSOR_READING_TYPE_UINT64: snprintf(buf, SHOW_BUF_SZ, "%s %llu\n", mes, item->Value.SensorUint64); break; case SAHPI_SENSOR_READING_TYPE_FLOAT64: snprintf(buf, SHOW_BUF_SZ, "%s %10.3f\n", mes, item->Value.SensorFloat64); break; case SAHPI_SENSOR_READING_TYPE_BUFFER: j = snprintf(buf, SHOW_BUF_SZ, "%s ", mes); for (i = 0; i < SAHPI_SENSOR_BUFFER_LENGTH; i++) { j = j + snprintf(buf + j, SHOW_BUF_SZ-j,"%02x", item->Value.SensorBuffer[i]); if (j >= SHOW_BUF_SZ) break; } if (j < SHOW_BUF_SZ) sprintf(buf + j, "\n"); break; }; return(proc(buf)); } int show_threshold(SaHpiSessionIdT sessionid, SaHpiResourceIdT resourceid, SaHpiSensorNumT sensornum, SaHpiSensorRecT *sen, hpi_ui_print_cb_t proc) { SaErrorT rv; SaHpiSensorThresholdsT senstbuff; SaHpiSensorThdDefnT *sendef; SaHpiSensorTypeT type; SaHpiEventCategoryT categ; char buf[SHOW_BUF_SZ]; Pr_ret_t res; sendef = &(sen->ThresholdDefn); rv = saHpiSensorTypeGet(sessionid, resourceid, sensornum, &type, &categ); if (rv != SA_OK) { snprintf(buf, SHOW_BUF_SZ, "ERROR: saHpiSensorTypeGet error = %s\n", oh_lookup_error(rv)); proc(buf); return -1; }; if (categ != SAHPI_EC_THRESHOLD) return(SA_OK); if (sendef->IsAccessible == SAHPI_FALSE) { proc("Thresholds are not accessible.\n"); return(SA_OK); } if (sendef->ReadThold == 0) { proc("Thresholds are not readable.\n"); return(SA_OK); } memset(&senstbuff, 0, sizeof(SaHpiSensorThresholdsT)); rv = saHpiSensorThresholdsGet(sessionid, resourceid, sensornum, &senstbuff); if (rv != SA_OK) { snprintf(buf, SHOW_BUF_SZ, "ERROR: saHpiSensorThresholdsGet error = %s\n", oh_lookup_error(rv)); proc(buf); return -1; }; res = print_thres_value(&(senstbuff.LowMinor), "Lower Minor Threshold", sendef, SAHPI_ES_LOWER_MINOR, proc); if (res == HPI_UI_END) return(HPI_UI_END); res = print_thres_value(&(senstbuff.LowMajor), "Lower Major Threshold", sendef, SAHPI_ES_LOWER_MAJOR, proc); if (res == HPI_UI_END) return(HPI_UI_END); res = print_thres_value(&(senstbuff.LowCritical), "Lower Critical Threshold", sendef, SAHPI_ES_LOWER_CRIT, proc); if (res == HPI_UI_END) return(HPI_UI_END); res = print_thres_value(&(senstbuff.UpMinor), "Upper Minor Threshold", sendef, SAHPI_ES_UPPER_MINOR, proc); if (res == HPI_UI_END) return(HPI_UI_END); res = print_thres_value(&(senstbuff.UpMajor), "Upper Major Threshold", sendef, SAHPI_ES_UPPER_MAJOR, proc); if (res == HPI_UI_END) return(HPI_UI_END); res = print_thres_value(&(senstbuff.UpCritical), "Upper Critical Threshold", sendef, SAHPI_ES_UPPER_CRIT, proc); if (res == HPI_UI_END) return(HPI_UI_END); res = print_thres_value(&(senstbuff.PosThdHysteresis), "Positive Threshold Hysteresis", NULL, 0, proc); if (res == HPI_UI_END) return(HPI_UI_END); res = print_thres_value(&(senstbuff.NegThdHysteresis), "Negative Threshold Hysteresis", NULL, 0, proc); return SA_OK; } SaErrorT show_control(SaHpiSessionIdT sessionid, SaHpiResourceIdT resourceid, SaHpiCtrlNumT num, hpi_ui_print_cb_t proc) { SaErrorT rv; SaHpiRdrT rdr; SaHpiCtrlRecT *ctrl; char *str, *str1; char buf[SHOW_BUF_SZ]; char errbuf[SHOW_BUF_SZ]; SaHpiCtrlTypeT type; SaHpiCtrlRecDigitalT *digit; SaHpiCtrlRecDiscreteT *discr; SaHpiCtrlRecAnalogT *analog; SaHpiCtrlRecStreamT *stream; SaHpiCtrlRecTextT *text; SaHpiCtrlRecOemT *oem; int i; rv = saHpiRdrGetByInstrumentId(sessionid, resourceid, SAHPI_CTRL_RDR, num, &rdr); if (rv != SA_OK) { snprintf(errbuf, SHOW_BUF_SZ, "\nERROR: saHpiRdrGetByInstrumentId: error: %s\n", oh_lookup_error(rv)); proc(errbuf); return(rv); }; ctrl = &(rdr.RdrTypeUnion.CtrlRec); type = ctrl->Type; if (ctrl->WriteOnly) str = "(Write Only)"; else str = " "; snprintf(buf, SHOW_BUF_SZ, "Control(%d/%d) Type: %s %s Output: %s\n", resourceid, num, oh_lookup_ctrltype(type), str, oh_lookup_ctrloutputtype(ctrl->OutputType)); if (proc(buf) != HPI_UI_OK) return(SA_OK); if (ctrl->DefaultMode.ReadOnly) str = "(Read Only)"; else str = " "; snprintf(buf, SHOW_BUF_SZ, " Mode: %s %s\n", oh_lookup_ctrlmode(ctrl->DefaultMode.Mode), str); if (proc(buf) != HPI_UI_OK) return(SA_OK); if (proc("Data:\n") != HPI_UI_OK) return(SA_OK); switch (type) { case SAHPI_CTRL_TYPE_DIGITAL: digit = &(ctrl->TypeUnion.Digital); str = oh_lookup_ctrlstatedigital(digit->Default); if (str == (char *)NULL) { snprintf(errbuf, SHOW_BUF_SZ, "Invalid value (0x%x)", digit->Default); str = errbuf; }; snprintf(buf, SHOW_BUF_SZ, "\tDefault: %s\n", str); break; case SAHPI_CTRL_TYPE_DISCRETE: discr = &(ctrl->TypeUnion.Discrete); snprintf(buf, SHOW_BUF_SZ, "\tDefault: %d\n", discr->Default); break; case SAHPI_CTRL_TYPE_ANALOG: analog = &(ctrl->TypeUnion.Analog); snprintf(buf, SHOW_BUF_SZ, "\tDefault: %d (min = %d max = %d)\n", analog->Default, analog->Min, analog->Max); break; case SAHPI_CTRL_TYPE_STREAM: stream = &(ctrl->TypeUnion.Stream); snprintf(buf, SHOW_BUF_SZ, "\tDefault: Repeat = %d lendth = %d stream = %s\n", stream->Default.Repeat, stream->Default.StreamLength, stream->Default.Stream); break; case SAHPI_CTRL_TYPE_TEXT: text = &(ctrl->TypeUnion.Text); snprintf(buf, SHOW_BUF_SZ, "\tMaxChars = %d MaxLines = %d\n", text->MaxChars, text->MaxLines); if (proc(buf) != HPI_UI_OK) return(SA_OK); str = oh_lookup_language(text->Language); if (str == (char *)NULL) str = "UNKNOWN"; str1 = oh_lookup_texttype(text->DataType); if (str1 == (char *)NULL) str1 = "UNKNOWN"; snprintf(buf, SHOW_BUF_SZ, "\tLanguage = %s DataType = %s\n", str, str1); if (proc(buf) != HPI_UI_OK) return(SA_OK); snprintf(buf, SHOW_BUF_SZ, "\tDefault: Line # = %d", text->Default.Line); if (proc(buf) != HPI_UI_OK) return(SA_OK); print_text_buffer_text(" Text = ", &(text->Default.Text), "\n", proc); return SA_OK; case SAHPI_CTRL_TYPE_OEM: oem = &(ctrl->TypeUnion.Oem); snprintf(buf, SHOW_BUF_SZ, "\tMId = %d Config data = ", oem->MId); proc(buf); str = (char *)(oem->ConfigData); for (i = 0; i < SAHPI_CTRL_OEM_CONFIG_LENGTH; i++) sprintf(buf + i * 3, "%2.2X ", (unsigned char)(str[i])); strcat(buf, "\n\t"); if (proc(buf) != HPI_UI_OK) return(SA_OK); sprintf(buf, "Default: MId = %d Body = ", oem->MId); str = (char *)(oem->Default.Body); for (i = 0; i < oem->Default.BodyLength; i++) sprintf(buf + i * 3, "%2.2X ", (unsigned char)(str[i])); strcat(buf, "\n"); break; default: strcpy(buf, "Unknown control type\n"); }; proc(buf); return SA_OK; } SaErrorT show_control_state(SaHpiSessionIdT sessionid, SaHpiResourceIdT resourceid, SaHpiCtrlNumT num, hpi_ui_print_cb_t proc, get_int_param_t get_int_param) { SaErrorT rv; int i; int res; char *str; char buf[SHOW_BUF_SZ]; char errbuf[SHOW_BUF_SZ]; SaHpiCtrlModeT mode; SaHpiCtrlStateT state; SaHpiCtrlTypeT type; SaHpiCtrlStateDigitalT digit; SaHpiCtrlStateDiscreteT discr; SaHpiCtrlStateAnalogT analog; SaHpiCtrlStateStreamT *stream; SaHpiCtrlStateTextT *text; SaHpiCtrlStateOemT *oem; rv = saHpiControlTypeGet(sessionid, resourceid, num, &type); if (rv != SA_OK) { snprintf(errbuf, SHOW_BUF_SZ, "\nERROR: saHpiControlTypeGet: error: %s\n", oh_lookup_error(rv)); proc(errbuf); return(rv); }; state.Type = type; if (type == SAHPI_CTRL_TYPE_TEXT) { i = get_int_param("Line #(0 == all): ", &res); if (i != 1) { printf("Invalid value\n"); return SA_ERR_HPI_ERROR; }; state.StateUnion.Text.Line = res; } rv = saHpiControlGet(sessionid, resourceid, num, &mode, &state); if (rv != SA_OK) { snprintf(errbuf, SHOW_BUF_SZ, "\nERROR: saHpiControlGet: error: %s\n", oh_lookup_error(rv)); proc(errbuf); return(rv); }; type = state.Type; snprintf(buf, SHOW_BUF_SZ, "Control(%d/%d) %s State: ", resourceid, num, oh_lookup_ctrlmode(mode)); if (proc(buf) != HPI_UI_OK) return(SA_OK); switch (type) { case SAHPI_CTRL_TYPE_DIGITAL: digit = state.StateUnion.Digital; str = oh_lookup_ctrlstatedigital(digit); if (str == (char *)NULL) { snprintf(errbuf, SHOW_BUF_SZ, "Invalid value (0x%x)", digit); str = errbuf; }; snprintf(buf, SHOW_BUF_SZ, "%s\n", str); break; case SAHPI_CTRL_TYPE_DISCRETE: discr = state.StateUnion.Discrete; snprintf(buf, SHOW_BUF_SZ, "%d\n", discr); break; case SAHPI_CTRL_TYPE_ANALOG: analog = state.StateUnion.Analog; snprintf(buf, SHOW_BUF_SZ, "%d\n", analog); break; case SAHPI_CTRL_TYPE_STREAM: stream = &(state.StateUnion.Stream); snprintf(buf, SHOW_BUF_SZ, "Repeat = %d lendth = %d stream = %s\n", stream->Repeat, stream->StreamLength, stream->Stream); break; case SAHPI_CTRL_TYPE_TEXT: text = &(state.StateUnion.Text); snprintf(buf, SHOW_BUF_SZ, "Line # = %d", text->Line); if (proc(buf) != HPI_UI_OK) return(SA_OK); print_text_buffer_text(" Text = ", &(text->Text), "\n", proc); return SA_OK; case SAHPI_CTRL_TYPE_OEM: oem = &(state.StateUnion.Oem); str = (char *)(oem->Body); if (is_ATCA(sessionid, resourceid) && (oem->MId == ATCAHPI_PICMG_MID)) snprintf(buf, SHOW_BUF_SZ, "MId = %d Color = %s Body = ", oem->MId, oh_lookup_atcahpiledcolor(str[2])); else snprintf(buf, SHOW_BUF_SZ, "MId = %d Body = ", oem->MId); proc(buf); for (i = 0; i < oem->BodyLength; i++) sprintf(buf + i * 3, "%2.2X ", (unsigned char)(str[i])); strcat(buf, "\n"); break; default: strcpy(buf, "Unknown control type\n"); }; proc(buf); return SA_OK; } SaErrorT show_sensor(SaHpiSessionIdT sessionid, SaHpiResourceIdT resourceid, SaHpiSensorNumT sensornum, hpi_ui_print_cb_t proc) { SaHpiSensorReadingT reading; SaHpiEventStateT status, assert, deassert; SaHpiRdrT rdr; SaErrorT rv; SaHpiBoolT val; char buf[SHOW_BUF_SZ]; char errbuf[SHOW_BUF_SZ]; Pr_ret_t res; rv = saHpiRdrGetByInstrumentId(sessionid, resourceid, SAHPI_SENSOR_RDR, sensornum, &rdr); if (rv != SA_OK) { snprintf(errbuf, SHOW_BUF_SZ, "\nERROR: saHpiRdrGetByInstrumentId: error: %s\n", oh_lookup_error(rv)); proc(errbuf); return(rv); }; snprintf(buf, SHOW_BUF_SZ, "Sensor(%d/%d) %s", resourceid, sensornum, oh_lookup_sensortype(rdr.RdrTypeUnion.SensorRec.Type)); proc(buf); res = print_text_buffer_text(" ", &(rdr.IdString), "\n", proc); if (res != HPI_UI_OK) return(SA_OK); rv = saHpiSensorEnableGet(sessionid, resourceid, sensornum, &val); if (rv != SA_OK) { snprintf(errbuf, SHOW_BUF_SZ, "\nERROR: saHpiSensorEnableGet: error: %s\n", oh_lookup_error(rv)); if (proc(errbuf) != HPI_UI_OK) return(rv); } else { if (val) res = proc("Enable "); else res = proc("Disable "); if (res != HPI_UI_OK) return(SA_OK); }; rv = saHpiSensorEventEnableGet(sessionid, resourceid, sensornum, &val); if (rv != SA_OK) { snprintf(errbuf, SHOW_BUF_SZ, "\nERROR: saHpiSensorEventEnableGet: error: %s\n", oh_lookup_error(rv)); if (proc(errbuf) != HPI_UI_OK) return(rv); } else { if (proc(" event : ") != HPI_UI_OK) return(SA_OK); if (val) res = proc("Enable"); else res = proc("Disable"); if (res != HPI_UI_OK) return(SA_OK); }; rv = saHpiSensorEventMasksGet(sessionid, resourceid, sensornum, &assert, &deassert); if (rv != SA_OK) { snprintf(errbuf, SHOW_BUF_SZ, "\nERROR: saHpiSensorEventMasksGet: error: %s\n", oh_lookup_error(rv)); if (proc(errbuf) != HPI_UI_OK) return(rv); } else { snprintf(buf, SHOW_BUF_SZ, " supported: 0x%4.4x masks: assert = 0x%4.4x" " deassert = 0x%4.4x\n", rdr.RdrTypeUnion.SensorRec.Events, assert, deassert); if (proc(buf) != HPI_UI_OK) return(rv); }; rv = saHpiSensorReadingGet(sessionid, resourceid, sensornum, &reading, &status); if (rv != SA_OK) { snprintf(errbuf, SHOW_BUF_SZ, "\nERROR: saHpiSensorReadingGet: error: %s\n", oh_lookup_error(rv)); proc(errbuf); return(rv); }; snprintf(buf, SHOW_BUF_SZ, "\tEvent states = 0x%x\n", status); if (proc(buf) != HPI_UI_OK) return(SA_OK); if (reading.IsSupported) { res = print_thres_value(&reading, "\tReading Value =", NULL, 0, proc); if (res == HPI_UI_END) return(SA_OK); } else { if (proc("\tReading not supported\n") != HPI_UI_OK) return(SA_OK); } show_threshold(sessionid, resourceid, sensornum, &(rdr.RdrTypeUnion.SensorRec), proc); return SA_OK; } SaErrorT show_event_log(SaHpiSessionIdT sessionid, SaHpiResourceIdT resourceid, int show_short, hpi_ui_print_cb_t proc) { SaErrorT rv = SA_OK; SaHpiRptEntryT rptentry; SaHpiEventLogInfoT info; SaHpiEventLogEntryIdT entryid; SaHpiEventLogEntryIdT nextentryid; SaHpiEventLogEntryIdT preventryid; SaHpiEventLogEntryT sel; SaHpiRdrT rdr; SaHpiRptEntryT rpt; char buf[SHOW_BUF_SZ]; char date[30], date1[30]; if (resourceid != SAHPI_UNSPECIFIED_RESOURCE_ID) { rv = saHpiRptEntryGetByResourceId(sessionid, resourceid, &rptentry); if (rv != SA_OK) { snprintf(buf, SHOW_BUF_SZ, "ERROR: saHpiRptEntryGetByResourceId error = %s\n", oh_lookup_error(rv)); proc(buf); return rv; }; if (!(rptentry.ResourceCapabilities & SAHPI_CAPABILITY_EVENT_LOG)) { proc("ERROR: The designated resource hasn't SEL.\n"); return SA_OK; } }; rv = saHpiEventLogInfoGet(sessionid, resourceid, &info); if (rv != SA_OK) { snprintf(buf, SHOW_BUF_SZ, "ERROR: saHpiEventLogInfoGet error = %s\n", oh_lookup_error(rv)); proc(buf); return rv; } snprintf(buf, SHOW_BUF_SZ, "EventLog: entries = %d, size = %d, enabled = %d\n", info.Entries, info.Size, info.Enabled); if (proc(buf) != HPI_UI_OK) return(SA_OK); time2str(info.UpdateTimestamp, date, 30); time2str(info.CurrentTime, date1, 30); snprintf(buf, SHOW_BUF_SZ, "UpdateTime = %s CurrentTime = %s Overflow = %d\n", date, date1, info.OverflowFlag); if (proc(buf) != HPI_UI_OK) return(SA_OK); if (info.Entries != 0){ entryid = SAHPI_OLDEST_ENTRY; while (entryid != SAHPI_NO_MORE_ENTRIES) { rv = saHpiEventLogEntryGet(sessionid, resourceid, entryid, &preventryid, &nextentryid, &sel, &rdr, &rpt); if (rv != SA_OK) { snprintf(buf, SHOW_BUF_SZ, "ERROR: saHpiEventLogEntryGet error = %s\n", oh_lookup_error(rv)); proc(buf); return -1; }; if (show_short) { if (show_short_event(&(sel.Event), proc) != HPI_UI_OK) return(SA_OK); } else { if (rpt.ResourceCapabilities != 0) { oh_print_eventlogentry(&sel, &rpt.ResourceEntity, 1); } else if (rdr.RdrType != SAHPI_NO_RECORD) { oh_print_eventlogentry(&sel, &rdr.Entity, 1); } else { oh_print_eventlogentry(&sel, NULL, 1); } } preventryid = entryid; entryid = nextentryid; } } else { proc("SEL is empty\n"); }; return SA_OK; } Pr_ret_t show_sensor_list(SaHpiSessionIdT sessionid, SaHpiResourceIdT resourceid, hpi_ui_print_cb_t proc) { SaErrorT rv = SA_OK; SaHpiEntryIdT entryid; SaHpiEntryIdT nextentryid; SaHpiRdrT rdr; char buf[SHOW_BUF_SZ]; entryid = SAHPI_FIRST_ENTRY; while (entryid != SAHPI_LAST_ENTRY) { rv = saHpiRdrGet(sessionid, resourceid, entryid, &nextentryid, &rdr); if (rv != SA_OK) break; if (rdr.RdrType == SAHPI_SENSOR_RDR) { snprintf(buf, 256, "Resource Id: %d, Sensor Num: %d", resourceid, rdr.RdrTypeUnion.SensorRec.Num); if (proc(buf) != 0) return(HPI_UI_END); if (print_text_buffer_text(", Tag: ", &(rdr.IdString), NULL, proc) != 0) return(-1); if (proc("\n") != 0) return(HPI_UI_END); }; entryid = nextentryid; }; return(HPI_UI_OK); } int show_rdr_list(Domain_t *domain, SaHpiResourceIdT rptid, SaHpiRdrTypeT passed_type, hpi_ui_print_cb_t proc) // return: list size { SaHpiRdrT rdr; SaHpiEntryIdT entryid; SaHpiEntryIdT nextentryid; char buf[SHOW_BUF_SZ]; SaHpiRdrTypeT type; char ar[256]; SaHpiSensorRecT *sensor; SaErrorT ret; int res_num = 0; entryid = SAHPI_FIRST_ENTRY; while (entryid !=SAHPI_LAST_ENTRY) { memset(buf, 0, SHOW_BUF_SZ); memset(ar, 0, 256); ret = saHpiRdrGet(domain->sessionId, rptid, entryid, &nextentryid, &rdr); if (ret != SA_OK) return(res_num); type = rdr.RdrType; if ((passed_type != SAHPI_NO_RECORD) && (type != passed_type)) { entryid = nextentryid; continue; }; snprintf(buf, SHOW_BUF_SZ, "(%3.3d): %s ID=%u", oh_get_rdr_num(rdr.RecordId), oh_lookup_rdrtype(type), rdr.RecordId); switch (type) { case SAHPI_SENSOR_RDR: sensor = &(rdr.RdrTypeUnion.SensorRec); snprintf(ar, 256, ", Ctrl=%d, EvtCtrl=", sensor->EnableCtrl); switch (sensor->EventCtrl) { case SAHPI_SEC_PER_EVENT: strcat(ar, "WR"); break; case SAHPI_SEC_READ_ONLY_MASKS: strcat(ar, "RM"); break; default: strcat(ar, "RO"); break; }; break; case SAHPI_CTRL_RDR: break; case SAHPI_INVENTORY_RDR: break; case SAHPI_WATCHDOG_RDR: break; case SAHPI_ANNUNCIATOR_RDR: break; case SAHPI_DIMI_RDR: break; case SAHPI_FUMI_RDR: break; default: snprintf(ar, 256, ", Unrecognized RDR Type"); }; strcat(buf, ar); res_num++; if (proc(buf) != HPI_UI_OK) return(res_num); if (print_text_buffer_text(", Tag=", &(rdr.IdString), "\n", proc) != HPI_UI_OK) return(res_num); entryid = nextentryid; }; return(res_num); } typedef struct { int len_buf; char outbuf[SHOW_BUF_SZ]; SaHpiEntityPathT path; } rpt_outbuf_t; static int lsres_sort(void *st1, void *st2) { int i, n1, n2; rpt_outbuf_t *ar1 = (rpt_outbuf_t *)st1; rpt_outbuf_t *ar2 = (rpt_outbuf_t *)st2; for (i = 0; i < SAHPI_MAX_ENTITY_PATH; i++) if (ar1->path.Entry[i].EntityType == SAHPI_ENT_ROOT) break; n1 = i; for (i = 0; i < SAHPI_MAX_ENTITY_PATH; i++) if (ar2->path.Entry[i].EntityType == SAHPI_ENT_ROOT) break; n2 = i; while ((n1 >= 0) && (n2 >= 0)) { if (ar1->path.Entry[n1].EntityType > ar2->path.Entry[n2].EntityType) return(1); if (ar1->path.Entry[n1].EntityType < ar2->path.Entry[n2].EntityType) return(-1); if (ar1->path.Entry[n1].EntityLocation > ar2->path.Entry[n2].EntityLocation) return(1); if (ar1->path.Entry[n1].EntityLocation < ar2->path.Entry[n2].EntityLocation) return(-1); n1--; n2--; }; if (n1 >= 0) return(1); if (n2 >= 0) return(-1); return(0); } static void print_rpt_paths(rpt_outbuf_t *ar, int len, hpi_ui_print_cb_t proc) { int i, max_len = 0; char buf[SHOW_BUF_SZ]; oh_big_textbuffer tmpbuf; SaErrorT rv; for (i = 0; i < len; i++) { if (ar[i].len_buf > max_len) max_len = ar[i].len_buf; }; qsort(ar, len, sizeof(rpt_outbuf_t), (int(*)(const void *, const void *))lsres_sort); for (i = 0; i < len; i++) { if (ar[i].len_buf == 0) continue; memset(buf, ' ', SHOW_BUF_SZ); strncpy(buf, ar[i].outbuf, ar[i].len_buf); buf[max_len + 1] = 0; strcat(buf, ": "); rv = oh_decode_entitypath(&(ar[i].path), &tmpbuf); if (rv == SA_OK) { strcat(buf, (char *)(tmpbuf.Data)); }; strcat(buf, "\n"); if (proc(buf) != HPI_UI_OK) return; } } int show_rpt_list(Domain_t *domain, int as, SaHpiResourceIdT rptid, int addedfields, hpi_ui_print_cb_t proc) /* as : SHOW_ALL_RPT - show all rpt entry only * SHOW_ALL_RDR - show all rdr for all rpt * SHOW_RPT_RDR - show all rdr for rptid * addedfields : SHORT_LSRES - traditional resource list * STATE_LSRES - show resource status * PATH_LSRES - show entity path * return: list size */ { SaHpiRptEntryT rpt_entry; SaHpiEntryIdT rptentryid, nextrptentryid; int ind = 0, show_path; char buf[SHOW_BUF_SZ]; SaErrorT rv; SaHpiCapabilitiesT cap; SaHpiHsCapabilitiesT hscap; SaHpiHsStateT state; rpt_outbuf_t *rpt_out = NULL, *tmp; int res_num = 0, n_rpt = 0, max_rpt = 0; if (as != SHOW_ALL_RPT) show_path = 0; else show_path = addedfields & PATH_LSRES; rptentryid = SAHPI_FIRST_ENTRY; while (rptentryid != SAHPI_LAST_ENTRY) { rv = saHpiRptEntryGet(domain->sessionId, rptentryid, &nextrptentryid, &rpt_entry); if (rv != SA_OK) break; if ((as == SHOW_RPT_RDR) && (rpt_entry.ResourceId != rptid)) { rptentryid = nextrptentryid; continue; }; res_num++; snprintf(buf, SHOW_BUF_SZ, "(%3.3d):", rpt_entry.ResourceId); get_text_buffer_text(NULL, &(rpt_entry.ResourceTag), ":", buf + strlen(buf)); strcat(buf, "{"); cap = rpt_entry.ResourceCapabilities; if (cap & SAHPI_CAPABILITY_SENSOR) strcat(buf, "S|"); if (cap & SAHPI_CAPABILITY_RDR) strcat(buf, "RDR|"); if (cap & SAHPI_CAPABILITY_EVENT_LOG) strcat(buf, "ELOG|"); if (cap & SAHPI_CAPABILITY_INVENTORY_DATA) strcat(buf, "INV|"); if (cap & SAHPI_CAPABILITY_RESET) strcat(buf, "RST|"); if (cap & SAHPI_CAPABILITY_POWER) strcat(buf, "PWR|"); if (cap & SAHPI_CAPABILITY_ANNUNCIATOR) strcat(buf, "AN|"); if (cap & SAHPI_CAPABILITY_FRU) strcat(buf, "FRU|"); if (cap & SAHPI_CAPABILITY_CONTROL) strcat(buf, "CNT|"); if (cap & SAHPI_CAPABILITY_WATCHDOG) strcat(buf, "WTD|"); if (cap & SAHPI_CAPABILITY_MANAGED_HOTSWAP) strcat(buf, "HS|"); if (cap & SAHPI_CAPABILITY_CONFIGURATION) strcat(buf, "CF |"); if (cap & SAHPI_CAPABILITY_AGGREGATE_STATUS) strcat(buf, "AG|"); if (cap & SAHPI_CAPABILITY_EVT_DEASSERTS) strcat(buf, "DS|"); if (cap & SAHPI_CAPABILITY_RESOURCE) strcat(buf, "RES|"); if (cap & SAHPI_CAPABILITY_DIMI) strcat(buf, "DIMI|"); if (cap & SAHPI_CAPABILITY_FUMI) strcat(buf, "FUMI|"); ind = strlen(buf); if (buf[ind - 1] == '|') buf[ind - 1] = 0; strcat(buf, "}"); if (addedfields & STATE_LSRES) { rv = saHpiHotSwapStateGet(domain->sessionId, rpt_entry.ResourceId, &state); hscap = rpt_entry.HotSwapCapabilities; if ((rv == SA_OK) || (hscap != 0)) { strcat(buf, " HS={"); if (rv == SA_OK) strcat(buf, oh_lookup_hsstate(state)); if (hscap & SAHPI_HS_CAPABILITY_AUTOEXTRACT_READ_ONLY) strcat(buf, " RO|"); if (hscap & SAHPI_HS_CAPABILITY_INDICATOR_SUPPORTED) strcat(buf, " IND|"); ind = strlen(buf); if (buf[ind - 1] == '|') buf[ind - 1] = 0; strcat(buf, "}"); } }; if (show_path) { if (n_rpt >= max_rpt) { max_rpt += 10; tmp = (rpt_outbuf_t *)malloc(sizeof(rpt_outbuf_t) * max_rpt); memset(tmp, 0, sizeof(rpt_outbuf_t) * max_rpt); if (n_rpt > 0) { memcpy(tmp, rpt_out, sizeof(rpt_outbuf_t) * n_rpt); free(rpt_out); }; rpt_out = tmp; }; tmp = rpt_out + n_rpt; tmp->len_buf = strlen(buf); if (tmp->len_buf > 0) { strcpy(tmp->outbuf, buf); tmp->path = rpt_entry.ResourceEntity; n_rpt++; } } else { strcat(buf, "\n"); if (proc(buf) != HPI_UI_OK) return(res_num); if (as == SHOW_ALL_RDR) show_rdr_list(domain, rpt_entry.ResourceId, SAHPI_NO_RECORD, proc); }; rptentryid = nextrptentryid; }; if (show_path) { print_rpt_paths(rpt_out, n_rpt, proc); free(rpt_out); }; return(res_num); } static Pr_ret_t show_attrs(Attributes_t *Attrs, int delta, hpi_ui_print_cb_t proc) { int i, type, len, del; char tmp[256], *name; char buf[SHOW_BUF_SZ]; union_type_t val; SaErrorT rv; Pr_ret_t ret; memset(buf, ' ', SHOW_BUF_SZ); del = delta << 1; len = SHOW_BUF_SZ - del; for (i = 0; i < Attrs->n_attrs; i++) { name = get_attr_name(Attrs, i); if (name == (char *)NULL) break; rv = get_value(Attrs, i, &val); if (rv != SA_OK) continue; type = get_attr_type(Attrs, i); switch (type) { case NO_TYPE: continue; case STRUCT_TYPE: snprintf(buf + del, len, "%s:\n", name); if (proc(buf) != 0) return(-1); rv = get_value(Attrs, i, &val); if (rv != SA_OK) continue; ret = show_attrs((Attributes_t *)(val.a), delta + 1, proc); if (ret != HPI_UI_OK) return(HPI_UI_END); continue; case LOOKUP_TYPE: strncpy(tmp, lookup_proc(Attrs->Attrs[i].lunum, val.i), 256); break; case DECODE_TYPE: rv = decode_proc(Attrs->Attrs[i].lunum, val.a, tmp, 256); if (rv != SA_OK) continue; break; case DECODE1_TYPE: rv = decode1_proc(Attrs->Attrs[i].lunum, val.i, tmp, 256); if (rv != SA_OK) continue; break; case READING_TYPE: if (thres_value(val.a, tmp, 256) != SA_OK) continue; break; case TEXT_BUFF_TYPE: snprintf(buf + del, len, "%s: ", name); if (proc(buf) != HPI_UI_OK) return(HPI_UI_END); ret = print_text_buffer(NULL, val.a, "\n", proc); if (ret != HPI_UI_OK) return(HPI_UI_END); continue; default: rv = get_value_as_string(Attrs, i, tmp, 256); if (rv != SA_OK) continue; }; snprintf(buf + del, len, "%s: %s\n", name, tmp); if (proc(buf) != HPI_UI_OK) return(HPI_UI_END); }; return(0); } SaErrorT show_Rpt(Rpt_t *Rpt, hpi_ui_print_cb_t proc) { show_attrs(&(Rpt->Attrutes), 0, proc); return(SA_OK); } SaErrorT show_Rdr(Rdr_t *Rdr, hpi_ui_print_cb_t proc) { show_attrs(&(Rdr->Attrutes), 0, proc); return(SA_OK); } Pr_ret_t show_short_event(SaHpiEventT *event, hpi_ui_print_cb_t proc) { SaHpiTextBufferT tmbuf; SaHpiSensorEventT *sen; SaHpiDomainEventT *dom; SaErrorT rv; char buf[SHOW_BUF_SZ], buf1[32]; char *str, *str1; rv = oh_decode_time(event->Timestamp, &tmbuf); if (rv) snprintf(buf, SHOW_BUF_SZ, "%19s ", "TIME UNSPECIFIED"); else snprintf(buf, SHOW_BUF_SZ, "%19s ", tmbuf.Data); proc(buf); snprintf(buf, SHOW_BUF_SZ, "%s ", oh_lookup_eventtype(event->EventType)); proc(buf); switch (event->EventType) { case SAHPI_ET_DOMAIN: dom = &(event->EventDataUnion.DomainEvent); snprintf(buf, SHOW_BUF_SZ, " Event: %s DomainId: %d", oh_lookup_domaineventtype(dom->Type), dom->DomainId); proc(buf); break; case SAHPI_ET_SENSOR: sen = &(event->EventDataUnion.SensorEvent); if (sen->Assertion == SAHPI_TRUE) str = "ASSERTED"; else str = "DEASSERTED"; rv = oh_decode_eventstate(sen->EventState, sen->EventCategory, &tmbuf); if (rv != SA_OK) { snprintf(buf1, 32, "STATE(%4.4x)", sen->EventState); str1 = buf1; } else str1 = (char *)(tmbuf.Data); snprintf(buf, SHOW_BUF_SZ, "%s %d/%d %s %s %s:%s", oh_lookup_sensortype(sen->SensorType), event->Source, sen->SensorNum, oh_lookup_severity(event->Severity), oh_lookup_eventcategory(sen->EventCategory), str1, str); proc(buf); break; case SAHPI_ET_RESOURCE: snprintf(buf, SHOW_BUF_SZ, "%d %s %s", event->Source, oh_lookup_severity(event->Severity), oh_lookup_resourceeventtype(event->EventDataUnion. ResourceEvent.ResourceEventType)); proc(buf); break; case SAHPI_ET_HOTSWAP: snprintf(buf, SHOW_BUF_SZ, "%d %s %s -> %s", event->Source, oh_lookup_severity(event->Severity), oh_lookup_hsstate( event->EventDataUnion.HotSwapEvent. PreviousHotSwapState), oh_lookup_hsstate( event->EventDataUnion.HotSwapEvent.HotSwapState)); if (proc(buf) != HPI_UI_OK) return(HPI_UI_END); break; case SAHPI_ET_DIMI: snprintf(buf, SHOW_BUF_SZ, "RESOURCE %d DIMI %d TEST %d : %s", event->Source, event->EventDataUnion.DimiEvent.DimiNum, event->EventDataUnion.DimiEvent.TestNum, oh_lookup_dimitestrunstatus(event->EventDataUnion.DimiEvent.DimiTestRunStatus)); proc(buf); break; case SAHPI_ET_DIMI_UPDATE: snprintf(buf, SHOW_BUF_SZ, "RESOURCE %d DIMI %d", event->Source, event->EventDataUnion.DimiUpdateEvent.DimiNum); proc(buf); break; case SAHPI_ET_FUMI: snprintf(buf, SHOW_BUF_SZ, "RESOURCE %d FUMI %d BANK %d : %s", event->Source, event->EventDataUnion.FumiEvent.FumiNum, event->EventDataUnion.FumiEvent.BankNum, oh_lookup_fumiupgradestatus(event->EventDataUnion.FumiEvent.UpgradeStatus)); proc(buf); break; default: snprintf(buf, SHOW_BUF_SZ, "%d", event->Source); proc(buf); break; }; return(proc("\n")); } SaErrorT show_dat(Domain_t *domain, hpi_ui_print_cb_t proc) { SaHpiAlarmT alarm; SaErrorT rv = SA_OK; char buf[SHOW_BUF_SZ]; char time[256]; int ind; int first = 1; alarm.AlarmId = SAHPI_FIRST_ENTRY; while (rv == SA_OK) { rv = saHpiAlarmGetNext(domain->sessionId, SAHPI_ALL_SEVERITIES, FALSE, &alarm); if (rv != SA_OK) break; first = 0; snprintf(buf, SHOW_BUF_SZ, "(%d) ", alarm.AlarmId); time2str(alarm.Timestamp, time, 256); strcat(buf, time); strcat(buf, " "); strcat(buf, oh_lookup_severity(alarm.Severity)); if (alarm.Acknowledged) strcat(buf, " a "); else strcat(buf, " - "); strcat(buf, oh_lookup_statuscondtype(alarm.AlarmCond.Type)); ind = strlen(buf); if (alarm.AlarmCond.Type == SAHPI_STATUS_COND_TYPE_SENSOR) { snprintf(buf + ind, SHOW_BUF_SZ - ind, " %d/%d 0x%x", alarm.AlarmCond.ResourceId, alarm.AlarmCond.SensorNum, alarm.AlarmCond.EventState); } else if (alarm.AlarmCond.Type == SAHPI_STATUS_COND_TYPE_OEM) { snprintf(buf + ind, SHOW_BUF_SZ - ind, " OEM = %d", alarm.AlarmCond.Mid); break; }; strcat(buf, "\n"); if (proc(buf) != 0) return(-1); }; if ( (rv == SA_ERR_HPI_NOT_PRESENT) && (first == 1) ) { proc("No alarms in DAT.\n"); return(SA_OK); }; return(rv); } SaErrorT show_inventory(SaHpiSessionIdT sessionid, SaHpiResourceIdT resourceid, SaHpiIdrIdT IdrId, SaHpiEntryIdT areaid, hpi_ui_print_cb_t proc) { SaHpiIdrInfoT info; SaErrorT rv; SaHpiEntryIdT entryid, nextentryid; SaHpiEntryIdT fentryid, nextfentryid; SaHpiIdrAreaHeaderT hdr; SaHpiIdrFieldT field; char buf[SHOW_BUF_SZ]; char *str; int num; rv = saHpiIdrInfoGet(sessionid, resourceid, IdrId, &info); if (rv != SA_OK) { snprintf(buf, SHOW_BUF_SZ, "ERROR!!! saHpiIdrInfoGet: %s\n", oh_lookup_error(rv)); proc(buf); return(-1); }; num = info.NumAreas; snprintf(buf, SHOW_BUF_SZ, "Inventory: %d Update count: %d Read Only: %s Areas: %d\n", info.IdrId, info.UpdateCount, HPIBOOL2STR( info.ReadOnly ), num); if (proc(buf) != 0) return(SA_OK); entryid = SAHPI_FIRST_ENTRY; while ((entryid != SAHPI_LAST_ENTRY) && (num > 0)) { rv = saHpiIdrAreaHeaderGet(sessionid, resourceid, IdrId, SAHPI_IDR_AREATYPE_UNSPECIFIED, entryid, &nextentryid, &hdr); if (rv != SA_OK) { proc("ERROR!!! saHpiIdrAreaHeaderGet\n"); return(-1); }; if ( areaid != SAHPI_LAST_ENTRY && areaid != hdr.AreaId ) { entryid = nextentryid; continue; } str = oh_lookup_idrareatype(hdr.Type); if (str == NULL) str = "Unknown"; snprintf(buf, SHOW_BUF_SZ, " Area: %d Type: %s Read Only: %s Fields: %d\n", hdr.AreaId, str, HPIBOOL2STR( hdr.ReadOnly ), hdr.NumFields); if (proc(buf) != 0) return(SA_OK); fentryid = SAHPI_FIRST_ENTRY; entryid = nextentryid; while ((fentryid != SAHPI_LAST_ENTRY) && (hdr.NumFields > 0)) { rv = saHpiIdrFieldGet(sessionid, resourceid, IdrId, hdr.AreaId, SAHPI_IDR_FIELDTYPE_UNSPECIFIED, fentryid, &nextfentryid, &field); if (rv != SA_OK) { proc("ERROR!!! saHpiIdrFieldGet\n"); return(-1); }; str = oh_lookup_idrfieldtype(field.Type); if (str == NULL) str = "Unknown"; snprintf(buf, SHOW_BUF_SZ, " Field: %d Type: %s Read Only: %s (", field.FieldId, str, HPIBOOL2STR( field.ReadOnly )); if (proc(buf) != 0) return(SA_OK); if (print_text_buffer(NULL, &(field.Field), NULL, proc) != 0) return(SA_OK); if (proc(")\n") != 0) return(SA_OK); fentryid = nextfentryid; } }; return(SA_OK); } void show_inv_area_header(SaHpiIdrAreaHeaderT *Header, int del, hpi_ui_print_cb_t proc) { char buf[SHOW_BUF_SZ], *str; int len; del <<= 1; len = SHOW_BUF_SZ - del; str = buf + del; memset(buf, ' ', SHOW_BUF_SZ); snprintf(str, len, "AreaId: %d\n", Header->AreaId); if (proc(buf) != 0) return; snprintf(str, len, "AreaType: %s\n", oh_lookup_idrareatype(Header->Type)); if (proc(buf) != 0) return; snprintf(str, len, "ReadOnly: %s\n", HPIBOOL2STR( Header->ReadOnly )); if (proc(buf) != 0) return; snprintf(str, len, "NumFields: %d\n", Header->NumFields); proc(buf); } void show_inv_field(SaHpiIdrFieldT *Field, int del, hpi_ui_print_cb_t proc) { char buf[SHOW_BUF_SZ], *str; int len; del <<= 1; len = SHOW_BUF_SZ - del; str = buf + del; memset(buf, ' ', SHOW_BUF_SZ); snprintf(str, len, "Field Id: %d\n", Field->FieldId); if (proc(buf) != 0) return; snprintf(str, len, "Field Type: %s\n", oh_lookup_idrfieldtype(Field->Type)); if (proc(buf) != 0) return; snprintf(str, len, "ReadOnly: %s\n", HPIBOOL2STR( Field->ReadOnly )); if (proc(buf) != 0) return; *str = 0; proc(buf); print_text_buffer("Content: ", &(Field->Field), "\n", proc); } openhpi-2.14.1/hpi_shell/hpi_ui.h0000644000076400007640000001433211302567132013571 0ustar /* -*- linux-c -*- * * Copyright (c) 2004 by Intel Corp. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * Kouzmich < Mikhail.V.Kouzmich@intel.com > * */ #ifndef __HPI_UI_H #define __HPI_UI_H #include #include #define SHOW_BUF_SZ 1024 /* defines for show_rpt_list function */ #define SHOW_ALL_RPT 0 #define SHOW_ALL_RDR 1 #define SHOW_RPT_RDR 2 #define SHORT_LSRES 0x0 #define STATE_LSRES 0x1 #define PATH_LSRES 0x2 typedef unsigned char uchar; typedef union { int i; double d; char *s; void *a; } union_type_t; /* value types */ #define NO_TYPE 0 // value doesn't present #define INT_TYPE 1 // interger #define FLOAT_TYPE 2 // float #define STR_TYPE 3 // string #define STRUCT_TYPE 4 // structure #define ARRAY_TYPE 5 // array #define LOOKUP_TYPE 6 // call lookup function #define DECODE_TYPE 7 // call encode function #define DECODE1_TYPE 8 // call encode1 function #define READING_TYPE 9 // call reading print function #define BOOL_TYPE 10 // boolean #define HEX_TYPE 11 // hexadecimal #define TEXT_BUFF_TYPE 12 // TextBuffer typedef struct { char *name; // attribute name int type; // value type int lunum; // lookup proc number union_type_t value; // value } attr_t; typedef struct { int n_attrs; attr_t *Attrs; } Attributes_t; typedef struct { SaHpiRdrT Record; SaHpiEntryIdT RecordId; SaHpiRdrTypeT RdrType; Attributes_t Attrutes; } Rdr_t; typedef struct { SaHpiRptEntryT Table; SaHpiEntryIdT EntryId; SaHpiResourceIdT ResourceId; Attributes_t Attrutes; } Rpt_t; typedef struct { SaHpiSessionIdT sessionId; SaHpiDomainIdT domainId; int session_opened; int discovered; } Domain_t; /* print function * This parameter is passed to the interface show functions * It return HPI_UI_OK on successful completion, otherwise HPI_UI_END on * output ending. */ typedef enum { HPI_UI_OK = 0, HPI_UI_END = -1 } Pr_ret_t; // Print return code typedef Pr_ret_t (*hpi_ui_print_cb_t)(char *buf); typedef int (*get_int_param_t)(char *buf, int *val); extern char *hex_codes; extern SaErrorT find_rdr_by_num(SaHpiSessionIdT sessionid, SaHpiResourceIdT resourceid, SaHpiInstrumentIdT num, SaHpiRdrTypeT type, int as, SaHpiRdrT *retrdr); extern void free_attrs(Attributes_t *At); extern SaErrorT get_rpt_attr(Rpt_t *rpt, char *attr_name, union_type_t *val); // get rpt attribute value extern SaErrorT get_rpt_attr_as_string(Rpt_t *rpt, char *attr_name, char *val, int len); // get rpt attribute value as string (max length: len) extern SaErrorT get_rdr_attr(Rdr_t *rdr, char *attr_name, union_type_t *val); // get rdr attribute value extern SaErrorT get_rdr_attr_as_string(Rdr_t *rdr, char *attr_name, char *val, int len); // get rdr attribute value as string (max length: len) extern void get_text_buffer_text(char *mes, SaHpiTextBufferT *buf, char *meslast, char *outbuf); extern SaErrorT get_value(Attributes_t *Attrs, int num, union_type_t *val); // get attribute value as string by number (max length: len) extern SaErrorT get_value_as_string(Attributes_t *Attrs, int num, char *val, int len); // get attribute value as string by number (max length: len) extern char *get_attr_name(Attributes_t *Attrs, int num); // get attribute name extern int get_attr_type(Attributes_t *Attrs, int num); // get attribute type extern void make_attrs_rdr(Rdr_t *Rdr, SaHpiRdrT *rdr_entry); extern void make_attrs_rpt(Rpt_t *Rpt, SaHpiRptEntryT *rptentry); extern Pr_ret_t print_text_buffer(char *mes, SaHpiTextBufferT *buf, char *meslast, hpi_ui_print_cb_t proc); extern Pr_ret_t print_text_buffer_lang(char *mes, SaHpiTextBufferT *buf, char *meslast, hpi_ui_print_cb_t proc); extern Pr_ret_t print_text_buffer_length(char *mes, SaHpiTextBufferT *buf, char *meslast, hpi_ui_print_cb_t proc); extern Pr_ret_t print_text_buffer_text(char *mes, SaHpiTextBufferT *buf, char *meslast, hpi_ui_print_cb_t proc); extern Pr_ret_t print_text_buffer_type(char *mes, SaHpiTextBufferT *buf, char *meslast, hpi_ui_print_cb_t proc); extern Pr_ret_t print_thres_value(SaHpiSensorReadingT *item, char *mes, SaHpiSensorThdDefnT *def, int num, hpi_ui_print_cb_t proc); extern SaErrorT show_control(SaHpiSessionIdT sessionid, SaHpiResourceIdT resourceid, SaHpiCtrlNumT num, hpi_ui_print_cb_t proc); extern SaErrorT show_control_state(SaHpiSessionIdT sessionid, SaHpiResourceIdT resourceid, SaHpiCtrlNumT num, hpi_ui_print_cb_t proc, get_int_param_t); extern SaErrorT show_dat(Domain_t *domain, hpi_ui_print_cb_t proc); extern SaErrorT show_event_log(SaHpiSessionIdT sessionid, SaHpiResourceIdT resourceid, int show_short, hpi_ui_print_cb_t proc); extern void show_inv_area_header(SaHpiIdrAreaHeaderT *Header, int del, hpi_ui_print_cb_t proc); extern void show_inv_field(SaHpiIdrFieldT *Field, int del, hpi_ui_print_cb_t proc); extern SaErrorT show_inventory(SaHpiSessionIdT sessionid, SaHpiResourceIdT resourceid, SaHpiIdrIdT num, SaHpiEntryIdT areaid, hpi_ui_print_cb_t proc); extern SaErrorT show_Rdr(Rdr_t *Rdr, hpi_ui_print_cb_t proc); extern SaErrorT show_Rpt(Rpt_t *Rpt, hpi_ui_print_cb_t proc); extern int show_rdr_list(Domain_t *D, SaHpiResourceIdT resourceid, SaHpiRdrTypeT passed_type, hpi_ui_print_cb_t proc); extern int show_rpt_list(Domain_t *domain, int as, SaHpiResourceIdT rptid, int addedfields, hpi_ui_print_cb_t proc); extern Pr_ret_t show_sensor_list(SaHpiSessionIdT sessionid, SaHpiResourceIdT resourceid, hpi_ui_print_cb_t proc); extern SaErrorT show_sensor(SaHpiSessionIdT sessionid, SaHpiResourceIdT resourceid, SaHpiSensorNumT sensornum, hpi_ui_print_cb_t proc); extern Pr_ret_t show_short_event(SaHpiEventT *event, hpi_ui_print_cb_t proc); extern SaErrorT show_threshold(SaHpiSessionIdT sessionid, SaHpiResourceIdT resourceid, SaHpiSensorNumT sensornum, SaHpiSensorRecT *sen, hpi_ui_print_cb_t proc); extern SaErrorT sensor_list(SaHpiSessionIdT sessionid, hpi_ui_print_cb_t proc); extern void time2str(SaHpiTimeT time, char * str, size_t size); #endif /* __HPI_UI_H */ openhpi-2.14.1/README.daemon0000644000076400007640000001260711302567132012321 0ustar ==================================== Readme for the OpenHPI Client/Daemon ==================================== This file documents the OpenHPI daemon and client libraries for the current release. The OpenHPI daemon runs as a background process and accepts connections from remote clients to perform OpenHPI library function calls. The daemon wraps the standard OpenHPI function library with a sockets-based API that is archicture neutral for all types of clients. The OpenHPI client library provides all the connection functionality needed by the client application to connect to the OpenHPI daemon running on the local or remote server. Three ways of starting the OpenHPI daemon: ========================================= There are three methods for starting the daemon at this point; manually calling the installed init.d script, manually starting the daemon in the foreground, or automatically by installing the init script in one of the system run levels. 1. Manually Calling Init Script: ----------------------------------- You can START and STOP the daemon with the 'openhpid' init script. This script can be found in $sysconfdir/init.d/openhpid (where the default sysconfdir value expands to /usr/local/etc). You can change sysconfdir's value when you run configure using the --sysconfdir= argument. We recommend setting it to /etc. Example To Start: $sudo /usr/local/etc/init.d/openhpid start Starting openhpid: [ OK ] $ Example To Stop: $sudo /usr/local/etc/init.d/openhpid stop Stopping openhpid: [ OK ] $ 2. Installing Daemon into a Run Level: -------------------------------------------- How you get the daemon to start automatically when the system boots depends on your Linux distribution: - Fedora/Mandriva: chkconfig --add openhpid; chkconfig openhpid on - SuSE: yast - Gentoo: rc-update -a openhpid default - Debian: update-rc.d openhpid defaults Manually Starting The Daemon: --------------------------------------------- After performing 'make install' the init.d script will reside at $sysconfdir/init.d/openhpid and the executable itself at $prefix/sbin/openhpid. Usage of the openhpid executable: openhpid [options] [-c ] To start the daemon in the foreground use the '-n' option. For more info 'openhpid -h'. Example: 'openhpid -n -c /etc/openhpi/openhpi.conf' More information on daemon parameters and evironment variables is given below. The OpenHPI Daemon ================== The daemon is compiled as a standalone application and can be run as either a foreground or background application. The daemon application and client libraries will be located in the openhpid subdirectory. When you run the daemon the standard method for locating the OpenHPI configuration file is used. However, the daemon will accept a configuration file as a command line option to override the default file. An option in the configuration file determines the port number the daemon will listen on for client connections. If a configuration file is not found the the daemon will listen on port 4743 by default. Currently, if you are not running as the root user, you must override the default PID file location. Normally the PID file is created in the /var/run subdirectory. This directory is not writable by normal users and only the root user can write to this location. Thus the daemon will fail when run as a normal user if the PID file location is not overridden. To override the PID file location you can use the command line option. ./openhpid -f ./openhpid.pid The OpenHPI Client Library ========================== The easiect method to use to link to the client library is to first run the OpenHPI installation script. make install This will install the client library in the standard system locations. You can now use the following link flags to link the client library to your application. -lopenhpi When you run your application the client library uses two environment variables to locate the daemon service. OPENHPI_DAEMON_HOST - URL for the host running the daemon. This can be "localhost" if the daemon is running on the local host or an ip address. OPENHPI_DAEMON_PORT - The port number the host is listening on for clent connections. If the OPENHPI_DAEMON_HOST variable is not found the client library uses localhost as the default. If the OPENHPI_DAEMON_PORT variable is not found then the client library uses port 4743 as the default. General Information ------------------- The client and the daemon do not have to be on the same hardware architecture. The daemon could be running on a P-series processor and the client running on an x86-series processor. The client library and daemon use a marshaling technique to resolve architecture and structure padding conflicts. The user does not need to concern themselves with architectureal differences between the client and daemon. The one exception to this rule is 64-bit architectures. The client and daemon currently cannot resolve differences between 32-bit and 64-bit architectures. DO NOT MIX THESE TYPES OF ARCHITECTURES! It is important that data passed to the client library OpenHPI functions is correct. Passing incorrect data could cause the client library or the daemon to crash. The client library performs an extensive set of data validation functions for each OpenHPI function, but it is still possible for bad data to be missed by those functions. BE CAREFUL!. openhpi-2.14.1/openhpid/0000755000076400007640000000000011405006365011777 5ustar openhpi-2.14.1/openhpid/Makefile.am0000644000076400007640000000363311302567132014040 0ustar # # Copyright (c) 2004-2006 by IBM Corporation. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This # file and program are licensed under a BSD style license. See # the Copying file included with the OpenHPI distribution for # full licensing terms. # # Authors: # W. David Ashley # Renier Morales # .NOTPARALLEL: MAINTAINERCLEANFILES = Makefile.in *~ INCLUDES = \ @OPENHPI_INCLUDES@ -I$(top_srcdir)/marshal @OH_SSL_INCLUDES@ EXTRA_DIST = \ openhpid.sh.in oh_client.h oh_client_conf.h oh_client_session.h # daemon sbin_PROGRAMS = openhpid openhpid_SOURCES = openhpid.cpp openhpid_LDADD = $(top_builddir)/src/libopenhpi.la \ $(top_builddir)/utils/libopenhpiutils.la \ $(top_builddir)/marshal/libopenhpimarshal.la \ $(top_builddir)/marshal/libohtcpconnx.la if HAVE_OPENSSL openhpid_LDADD += $(top_builddir)/$(SSLDIR)/libopenhpi_ssl.la endif openhpid_LDFLAGS = -export-dynamic # this is defined with ./configure --disable-dynamicdaemon if OPENHPID_STATIC openhpid_LDFLAGS += -static else openhpid_LDADD += -lstdc++ endif lib_LTLIBRARIES = libopenhpi.la libopenhpi_la_SOURCES = oh_client.cpp oh_client_session.cpp oh_client_conf.c libopenhpi_la_LDFLAGS = -version-info @HPI_LIB_VERSION@ libopenhpi_la_LIBADD = $(top_builddir)/marshal/libohtcpconnx.la -lstdc++ \ $(top_builddir)/marshal/libopenhpimarshal.la \ $(top_builddir)/utils/libopenhpiutils.la install-data-local: $(mkinstalldirs) $(DESTDIR)$(sysconfdir)/init.d $(INSTALL) -m 0755 openhpid.sh $(DESTDIR)$(sysconfdir)/init.d/openhpid uninstall-local: rm -f $(DESTDIR)$(sysconfdir)/init.d/openhpid clean-local: rm -f *~ core core.* openhpi-2.14.1/openhpid/oh_client.cpp0000644000076400007640000063770311302567132014467 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004-2008 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * W. David Ashley * Renier Morales * Anton Pak * */ extern "C" { #include #include #include #include #include #include #include } #include #include "oh_client.h" #include "oh_client_session.h" #define client_dbg(cmd, str) dbg("%s: %s\n", cmd, str) #define client_err(cmd, str) err("%s: %s\n", cmd, str) /*----------------------------------------------------------------------------*/ /* Utility functions */ /*----------------------------------------------------------------------------*/ static SaErrorT clean_reading(SaHpiSensorReadingT *read_in, SaHpiSensorReadingT *read_out) { /* This is a workaround against unknown bugs in the marshal code */ if (!read_in || !read_out) return SA_ERR_HPI_INVALID_PARAMS; memset(read_out, 0, sizeof(SaHpiSensorReadingT)); read_out->IsSupported = read_in->IsSupported; if (read_in->IsSupported == SAHPI_TRUE) { if (!oh_lookup_sensorreadingtype(read_in->Type)) { //printf("Invalid reading type: %d\n", read_in->Type); return SA_ERR_HPI_INVALID_DATA; } read_out->Type = read_in->Type; } else { /* Do we need to set dummy & reading type just to keep marshalling happy? */ read_out->Type = SAHPI_SENSOR_READING_TYPE_INT64; read_out->Value.SensorInt64 = 0; return SA_OK; } if (read_in->Type == SAHPI_SENSOR_READING_TYPE_INT64) { read_out->Value.SensorInt64 = read_in->Value.SensorInt64; } else if (read_in->Type == SAHPI_SENSOR_READING_TYPE_UINT64) { read_out->Value.SensorUint64 = read_in->Value.SensorUint64; } else if (read_in->Type == SAHPI_SENSOR_READING_TYPE_FLOAT64) { read_out->Value.SensorFloat64 = read_in->Value.SensorFloat64; } else if (read_in->Type == SAHPI_SENSOR_READING_TYPE_BUFFER) { memcpy(read_out->Value.SensorBuffer, read_in->Value.SensorBuffer, SAHPI_SENSOR_BUFFER_LENGTH); } return SA_OK; } static SaErrorT clean_thresholds(SaHpiSensorThresholdsT *thrds_in, SaHpiSensorThresholdsT *thrds_out) { /* This is a workaround against unknown bugs in the marshal code */ SaErrorT err = SA_OK; if (!thrds_in || !thrds_out) return SA_ERR_HPI_INVALID_PARAMS; err = clean_reading(&thrds_in->LowCritical, &thrds_out->LowCritical); if (err) return err; err = clean_reading(&thrds_in->LowMajor, &thrds_out->LowMajor); if (err) return err; err = clean_reading(&thrds_in->LowMinor, &thrds_out->LowMinor); if (err) return err; err = clean_reading(&thrds_in->UpCritical, &thrds_out->UpCritical); if (err) return err; err = clean_reading(&thrds_in->UpMajor, &thrds_out->UpMajor); if (err) return err; err = clean_reading(&thrds_in->UpMinor, &thrds_out->UpMinor); if (err) return err; err = clean_reading(&thrds_in->PosThdHysteresis, &thrds_out->PosThdHysteresis); if (err) return err; err = clean_reading(&thrds_in->NegThdHysteresis, &thrds_out->NegThdHysteresis); return err; } static void __dehash_config(gpointer key, gpointer value, gpointer data) { oHpiHandlerConfigT *handler_config = (oHpiHandlerConfigT *)data; strncpy((char *)handler_config->Params[handler_config->NumberOfParams].Name, (const char *)key, SAHPI_MAX_TEXT_BUFFER_LENGTH); strncpy((char *)handler_config->Params[handler_config->NumberOfParams].Value, (const char *)value, SAHPI_MAX_TEXT_BUFFER_LENGTH); handler_config->NumberOfParams = handler_config->NumberOfParams + 1; return; } /******************************************************************************/ /* HPI Client Layer */ /******************************************************************************/ /*----------------------------------------------------------------------------*/ /* saHpiVersionGet */ /*----------------------------------------------------------------------------*/ SaHpiVersionT SAHPI_API saHpiVersionGet (void) { return SAHPI_INTERFACE_VERSION; } /*----------------------------------------------------------------------------*/ /* saHpiInitialize */ /*----------------------------------------------------------------------------*/ SaErrorT SAHPI_API saHpiInitialize( SAHPI_IN SaHpiVersionT RequestedVersion, SAHPI_IN SaHpiUint32T NumOptions, SAHPI_INOUT SaHpiInitOptionT *Options, SAHPI_OUT SaHpiUint32T *FailedOption, SAHPI_OUT SaErrorT *OptionError) { if ( RequestedVersion != SAHPI_INTERFACE_VERSION ) { return SA_ERR_HPI_UNSUPPORTED_API; } if ( ( NumOptions != 0 ) && ( Options == NULL ) ) { return SA_ERR_HPI_INVALID_PARAMS; } // TODO implement more checks from section 5.2.1 of B.03.01 spec // Current implementation does not cover options check // TODO implement any library initialization code here // Current implementation does not utilize this function // return SA_OK; } /*----------------------------------------------------------------------------*/ /* saHpiFinalize */ /*----------------------------------------------------------------------------*/ SaErrorT SAHPI_API saHpiFinalize() { // TODO implement // TODO implement any library finalization code here // Current implementation does not utilize this function return SA_OK; } /*----------------------------------------------------------------------------*/ /* saHpiSessionOpen */ /*----------------------------------------------------------------------------*/ SaErrorT SAHPI_API saHpiSessionOpen( SAHPI_IN SaHpiDomainIdT DomainId, SAHPI_OUT SaHpiSessionIdT *SessionId, SAHPI_IN void *SecurityParams) { void *request; char reply[dMaxMessageLength]; SaErrorT err = SA_OK; SaHpiSessionIdT domain_sid = 0; char cmd[] = "saHpiSessionOpen"; pcstrmsock pinst = NULL; SaHpiDomainIdT default_did = SAHPI_UNSPECIFIED_DOMAIN_ID; if (!SessionId || SecurityParams) return SA_ERR_HPI_INVALID_PARAMS; if (DomainId == SAHPI_UNSPECIFIED_DOMAIN_ID) (DomainId = OH_DEFAULT_DOMAIN_ID); err = oh_create_connx(DomainId, &pinst); if (err) { client_err(cmd, "Could not create client connection"); return err; } cHpiMarshal *hm = HpiMarshalFind(eFsaHpiSessionOpen); pinst->MessageHeaderInit( eMhMsg, 0, eFsaHpiSessionOpen, hm->m_request_len); request = malloc(hm->m_request_len); /* TODO: Does daemon need domain id param in this call*/ pinst->header.m_len = HpiMarshalRequest1(hm, request, &default_did); SendRecv(0, cmd); int mr = HpiDemarshalReply1(pinst->header.m_flags & dMhEndianBit, hm, reply + sizeof(cMessageHeader), &err, &domain_sid); if (request) free(request); if (err != SA_OK) { oh_delete_connx(pinst); return err; } if (mr < 0) { oh_delete_connx(pinst); return SA_ERR_HPI_INVALID_PARAMS; } *SessionId = oh_open_session(DomainId, domain_sid, pinst); return err; } /*----------------------------------------------------------------------------*/ /* saHpiSessionClose */ /*----------------------------------------------------------------------------*/ SaErrorT SAHPI_API saHpiSessionClose( SAHPI_IN SaHpiSessionIdT SessionId) { void *request; char reply[dMaxMessageLength]; SaErrorT err = SA_OK; char cmd[] = "saHpiSessionClose"; pcstrmsock pinst; SaHpiSessionIdT dsid = 0; SaHpiDomainIdT did = 0; if (SessionId == 0) return SA_ERR_HPI_INVALID_SESSION; err = oh_get_connx(SessionId, &dsid, &pinst, &did); if (err) return err; cHpiMarshal *hm = HpiMarshalFind(eFsaHpiSessionClose); pinst->MessageHeaderInit(eMhMsg, 0, eFsaHpiSessionClose, hm->m_request_len); request = malloc(hm->m_request_len); pinst->header.m_len = HpiMarshalRequest1(hm, request, &dsid); SendRecv(SessionId, cmd); int mr = HpiDemarshalReply0(pinst->header.m_flags & dMhEndianBit, hm, reply + sizeof(cMessageHeader), &err); if (request) free(request); oh_close_session(SessionId); if (mr < 0) return SA_ERR_HPI_INVALID_PARAMS; return err; } /*----------------------------------------------------------------------------*/ /* saHpiDiscover */ /*----------------------------------------------------------------------------*/ SaErrorT SAHPI_API saHpiDiscover( SAHPI_IN SaHpiSessionIdT SessionId) { void *request; char reply[dMaxMessageLength]; SaErrorT err = SA_OK; char cmd[] = "saHpiDiscover"; pcstrmsock pinst; SaHpiSessionIdT dsid = 0; SaHpiDomainIdT did = 0; if (SessionId == 0) return SA_ERR_HPI_INVALID_SESSION; err = oh_get_connx(SessionId, &dsid, &pinst, &did); if (err) return err; cHpiMarshal *hm = HpiMarshalFind(eFsaHpiDiscover); pinst->MessageHeaderInit(eMhMsg, 0, eFsaHpiDiscover, hm->m_request_len); request = malloc(hm->m_request_len); pinst->header.m_len = HpiMarshalRequest1(hm, request, &dsid); SendRecv(SessionId, cmd); int mr = HpiDemarshalReply0(pinst->header.m_flags & dMhEndianBit, hm, reply + sizeof(cMessageHeader), &err); if (request) free(request); if (pinst->header.m_type == eMhError) return SA_ERR_HPI_INVALID_PARAMS; if (mr < 0) return SA_ERR_HPI_INVALID_PARAMS; return err; } /*----------------------------------------------------------------------------*/ /* saHpiDomainInfoGet */ /*----------------------------------------------------------------------------*/ SaErrorT SAHPI_API saHpiDomainInfoGet( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_OUT SaHpiDomainInfoT *DomainInfo) { void *request; char reply[dMaxMessageLength]; SaErrorT err = SA_OK; char cmd[] = "saHpiDomainInfoGet"; pcstrmsock pinst; SaHpiSessionIdT dsid = 0; SaHpiDomainIdT did = 0; if (SessionId == 0) return SA_ERR_HPI_INVALID_SESSION; /* oh_get_connx() places the real Domain Id to dsid */ err = oh_get_connx(SessionId, &dsid, &pinst, &did); if (err) return err; if (DomainInfo == NULL) return SA_ERR_HPI_INVALID_PARAMS; cHpiMarshal *hm = HpiMarshalFind(eFsaHpiDomainInfoGet); pinst->MessageHeaderInit(eMhMsg, 0, eFsaHpiDomainInfoGet, hm->m_request_len); request = malloc(hm->m_request_len); pinst->header.m_len = HpiMarshalRequest1(hm, request, &dsid); SendRecv(SessionId, cmd); int mr = HpiDemarshalReply1(pinst->header.m_flags & dMhEndianBit, hm, reply + sizeof(cMessageHeader), &err, DomainInfo); /* Set Domain Id to real Domain Id */ DomainInfo->DomainId = did; if (request) free(request); if (pinst->header.m_type == eMhError) return SA_ERR_HPI_INVALID_PARAMS; if (mr < 0) return SA_ERR_HPI_INVALID_PARAMS; return err; } /*----------------------------------------------------------------------------*/ /* saHpiDrtEntryGet */ /*----------------------------------------------------------------------------*/ SaErrorT SAHPI_API saHpiDrtEntryGet( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiEntryIdT EntryId, SAHPI_OUT SaHpiEntryIdT *NextEntryId, SAHPI_OUT SaHpiDrtEntryT *DrtEntry) { void *request; char reply[dMaxMessageLength]; SaErrorT err = SA_OK; char cmd[] = "saHpiDrtEntryGet"; pcstrmsock pinst; SaHpiSessionIdT dsid = 0; SaHpiDomainIdT did = 0; if (SessionId == 0) return SA_ERR_HPI_INVALID_SESSION; /* oh_get_connx() places the real Domain Id to dsid */ err = oh_get_connx(SessionId, &dsid, &pinst, &did); if (err) return err; if((DrtEntry == NULL) || (NextEntryId == NULL) || (EntryId == SAHPI_LAST_ENTRY)) { return SA_ERR_HPI_INVALID_PARAMS; } cHpiMarshal *hm = HpiMarshalFind(eFsaHpiDrtEntryGet); pinst->MessageHeaderInit(eMhMsg, 0, eFsaHpiDrtEntryGet, hm->m_request_len); request = malloc(hm->m_request_len); pinst->header.m_len = HpiMarshalRequest2(hm, request, &dsid, &EntryId); SendRecv(SessionId, cmd); int mr = HpiDemarshalReply2(pinst->header.m_flags & dMhEndianBit, hm, reply + sizeof(cMessageHeader), &err, NextEntryId, DrtEntry); /* Set Domain Id to real Domain Id */ DrtEntry->DomainId = did; if (request) free(request); if (pinst->header.m_type == eMhError) return SA_ERR_HPI_INVALID_PARAMS; if (mr < 0) return SA_ERR_HPI_INVALID_PARAMS; return err; } /*----------------------------------------------------------------------------*/ /* saHpiDomainTagSet */ /*----------------------------------------------------------------------------*/ SaErrorT SAHPI_API saHpiDomainTagSet( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiTextBufferT *DomainTag) { void *request; char reply[dMaxMessageLength]; SaErrorT err = SA_OK; char cmd[] = "saHpiDomainTagSet"; pcstrmsock pinst; SaHpiSessionIdT dsid = 0; SaHpiDomainIdT did = 0; if (SessionId == 0) return SA_ERR_HPI_INVALID_SESSION; err = oh_get_connx(SessionId, &dsid, &pinst, &did); if (err) return err; if (!DomainTag) return SA_ERR_HPI_INVALID_PARAMS; if (!oh_lookup_texttype(DomainTag->DataType)) return SA_ERR_HPI_INVALID_PARAMS; cHpiMarshal *hm = HpiMarshalFind(eFsaHpiDomainTagSet); pinst->MessageHeaderInit(eMhMsg, 0, eFsaHpiDomainTagSet, hm->m_request_len); request = malloc(hm->m_request_len); pinst->header.m_len = HpiMarshalRequest2(hm, request, &dsid, DomainTag); SendRecv(SessionId, cmd); int mr = HpiDemarshalReply0(pinst->header.m_flags & dMhEndianBit, hm, reply + sizeof(cMessageHeader), &err); if (request) free(request); if (pinst->header.m_type == eMhError) return SA_ERR_HPI_INVALID_PARAMS; if (mr < 0) return SA_ERR_HPI_INVALID_PARAMS; return err; } /*----------------------------------------------------------------------------*/ /* saHpiRptEntryGet */ /*----------------------------------------------------------------------------*/ SaErrorT SAHPI_API saHpiRptEntryGet( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiEntryIdT EntryId, SAHPI_OUT SaHpiEntryIdT *NextEntryId, SAHPI_OUT SaHpiRptEntryT *RptEntry) { void *request; char reply[dMaxMessageLength]; SaErrorT err = SA_OK; char cmd[] = "saHpiRptEntryGet"; pcstrmsock pinst; SaHpiSessionIdT dsid = 0; SaHpiDomainIdT did = 0; if (SessionId == 0) return SA_ERR_HPI_INVALID_SESSION; err = oh_get_connx(SessionId, &dsid, &pinst, &did); if (err) return err; if ((NextEntryId == NULL) || (RptEntry == NULL)) { return SA_ERR_HPI_INVALID_PARAMS; } if (EntryId == SAHPI_LAST_ENTRY) { return SA_ERR_HPI_INVALID_PARAMS; } cHpiMarshal *hm = HpiMarshalFind(eFsaHpiRptEntryGet); pinst->MessageHeaderInit(eMhMsg, 0, eFsaHpiRptEntryGet, hm->m_request_len); request = malloc(hm->m_request_len); pinst->header.m_len = HpiMarshalRequest2(hm, request, &dsid, &EntryId); SendRecv(SessionId, cmd); int mr = HpiDemarshalReply2(pinst->header.m_flags & dMhEndianBit, hm, reply + sizeof(cMessageHeader), &err, NextEntryId, RptEntry); if (request) free(request); if (pinst->header.m_type == eMhError) return SA_ERR_HPI_INVALID_PARAMS; if (mr < 0) return SA_ERR_HPI_INVALID_PARAMS; return err; } /*----------------------------------------------------------------------------*/ /* saHpiRptEntryGetByResourceId */ /*----------------------------------------------------------------------------*/ SaErrorT SAHPI_API saHpiRptEntryGetByResourceId( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId, SAHPI_OUT SaHpiRptEntryT *RptEntry) { void *request; char reply[dMaxMessageLength]; SaErrorT err = SA_OK; char cmd[] = "saHpiRptEntryGetByResourceId"; pcstrmsock pinst; SaHpiSessionIdT dsid = 0; SaHpiDomainIdT did = 0; if (SessionId == 0) return SA_ERR_HPI_INVALID_SESSION; err = oh_get_connx(SessionId, &dsid, &pinst, &did); if (err) return err; if (ResourceId == SAHPI_UNSPECIFIED_RESOURCE_ID || RptEntry == NULL) { return SA_ERR_HPI_INVALID_PARAMS; } cHpiMarshal *hm = HpiMarshalFind(eFsaHpiRptEntryGetByResourceId); pinst->MessageHeaderInit(eMhMsg, 0, eFsaHpiRptEntryGetByResourceId, hm->m_request_len); request = malloc(hm->m_request_len); pinst->header.m_len = HpiMarshalRequest2(hm, request, &dsid, &ResourceId); SendRecv(SessionId, cmd); int mr = HpiDemarshalReply1(pinst->header.m_flags & dMhEndianBit, hm, reply + sizeof(cMessageHeader), &err, RptEntry); if (request) free(request); if (pinst->header.m_type == eMhError) return SA_ERR_HPI_INVALID_PARAMS; if (mr < 0) return SA_ERR_HPI_INVALID_PARAMS; return err; } /*----------------------------------------------------------------------------*/ /* saHpiResourceSeveritySet */ /*----------------------------------------------------------------------------*/ SaErrorT SAHPI_API saHpiResourceSeveritySet( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId, SAHPI_IN SaHpiSeverityT Severity) { void *request; char reply[dMaxMessageLength]; SaErrorT err = SA_OK; char cmd[] = "saHpiResourceSeveritySet"; pcstrmsock pinst; SaHpiSessionIdT dsid = 0; SaHpiDomainIdT did = 0; if (SessionId == 0) return SA_ERR_HPI_INVALID_SESSION; err = oh_get_connx(SessionId, &dsid, &pinst, &did); if (err) return err; if (ResourceId == SAHPI_UNSPECIFIED_RESOURCE_ID) return SA_ERR_HPI_INVALID_PARAMS; if (!oh_lookup_severity(Severity)) return SA_ERR_HPI_INVALID_PARAMS; cHpiMarshal *hm = HpiMarshalFind(eFsaHpiResourceSeveritySet); pinst->MessageHeaderInit(eMhMsg, 0, eFsaHpiResourceSeveritySet, hm->m_request_len); request = malloc(hm->m_request_len); pinst->header.m_len = HpiMarshalRequest3(hm, request, &dsid, &ResourceId, &Severity); SendRecv(SessionId, cmd); int mr = HpiDemarshalReply0(pinst->header.m_flags & dMhEndianBit, hm, reply + sizeof(cMessageHeader), &err); if (request) free(request); if (pinst->header.m_type == eMhError) return SA_ERR_HPI_INVALID_PARAMS; if (mr < 0) return SA_ERR_HPI_INVALID_PARAMS; return err; } /*----------------------------------------------------------------------------*/ /* saHpiResourceTagSet */ /*----------------------------------------------------------------------------*/ SaErrorT SAHPI_API saHpiResourceTagSet( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId, SAHPI_IN SaHpiTextBufferT *ResourceTag) { void *request; char reply[dMaxMessageLength]; SaErrorT err = SA_OK; char cmd[] = "saHpiResourceTagSet"; pcstrmsock pinst; SaHpiSessionIdT dsid = 0; SaHpiDomainIdT did = 0; if (SessionId == 0) return SA_ERR_HPI_INVALID_SESSION; err = oh_get_connx(SessionId, &dsid, &pinst, &did); if (err) return err; if (ResourceTag == NULL) return SA_ERR_HPI_INVALID_PARAMS; cHpiMarshal *hm = HpiMarshalFind(eFsaHpiResourceTagSet); pinst->MessageHeaderInit(eMhMsg, 0, eFsaHpiResourceTagSet, hm->m_request_len); request = malloc(hm->m_request_len); pinst->header.m_len = HpiMarshalRequest3(hm, request, &dsid, &ResourceId, ResourceTag); SendRecv(SessionId, cmd); int mr = HpiDemarshalReply0(pinst->header.m_flags & dMhEndianBit, hm, reply + sizeof(cMessageHeader), &err); if (request) free(request); if (pinst->header.m_type == eMhError) return SA_ERR_HPI_INVALID_PARAMS; if (mr < 0) return SA_ERR_HPI_INVALID_PARAMS; return err; } /*----------------------------------------------------------------------------*/ /* saHpiMyEntityPathGet */ /*----------------------------------------------------------------------------*/ SaErrorT SAHPI_API saHpiMyEntityPathGet( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_OUT SaHpiEntityPathT *EntityPath) { void *request; char reply[dMaxMessageLength]; SaErrorT err = SA_OK; char cmd[] = "saHpiMyEntityPathGet"; pcstrmsock pinst; SaHpiSessionIdT dsid = 0; SaHpiDomainIdT did = 0; if (SessionId == 0) return SA_ERR_HPI_INVALID_SESSION; err = oh_get_connx(SessionId, &dsid, &pinst, &did); if (err) return err; if (EntityPath == NULL) return SA_ERR_HPI_INVALID_PARAMS; cHpiMarshal *hm = HpiMarshalFind(eFsaHpiMyEntityPathGet); pinst->MessageHeaderInit(eMhMsg, 0, eFsaHpiMyEntityPathGet, hm->m_request_len); request = malloc(hm->m_request_len); pinst->header.m_len = HpiMarshalRequest1(hm, request, &dsid); SendRecv(SessionId, cmd); int mr = HpiDemarshalReply1(pinst->header.m_flags & dMhEndianBit, hm, reply + sizeof(cMessageHeader), &err, EntityPath); if (request) free(request); if (pinst->header.m_type == eMhError) return SA_ERR_HPI_INVALID_PARAMS; if (mr < 0) return SA_ERR_HPI_INVALID_PARAMS; return err; } /*----------------------------------------------------------------------------*/ /* saHpiResourceIdGet */ /*----------------------------------------------------------------------------*/ SaErrorT SAHPI_API saHpiResourceIdGet( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_OUT SaHpiResourceIdT *ResourceId) { void *request; char reply[dMaxMessageLength]; SaErrorT err = SA_OK; char cmd[] = "saHpiResourceIdGet"; pcstrmsock pinst; SaHpiSessionIdT dsid = 0; SaHpiDomainIdT did = 0; if (SessionId == 0) return SA_ERR_HPI_INVALID_SESSION; err = oh_get_connx(SessionId, &dsid, &pinst, &did); if (err) return err; if (ResourceId == NULL) return SA_ERR_HPI_INVALID_PARAMS; cHpiMarshal *hm = HpiMarshalFind(eFsaHpiResourceIdGet); pinst->MessageHeaderInit(eMhMsg, 0, eFsaHpiResourceIdGet, hm->m_request_len); request = malloc(hm->m_request_len); pinst->header.m_len = HpiMarshalRequest1(hm, request, &dsid); SendRecv(SessionId, cmd); int mr = HpiDemarshalReply1(pinst->header.m_flags & dMhEndianBit, hm, reply + sizeof(cMessageHeader), &err, ResourceId); if (request) free(request); if (pinst->header.m_type == eMhError) return SA_ERR_HPI_INVALID_PARAMS; if (mr < 0) return SA_ERR_HPI_INVALID_PARAMS; return err; } /*----------------------------------------------------------------------------*/ /* saHpiGetIdByEntityPath */ /*----------------------------------------------------------------------------*/ SaErrorT SAHPI_API saHpiGetIdByEntityPath( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiEntityPathT EntityPath, SAHPI_IN SaHpiRdrTypeT InstrumentType, SAHPI_INOUT SaHpiUint32T *InstanceId, SAHPI_OUT SaHpiResourceIdT *ResourceId, SAHPI_OUT SaHpiInstrumentIdT *InstrumentId, SAHPI_OUT SaHpiUint32T *RptUpdateCount) { void *request; char reply[dMaxMessageLength]; SaErrorT err = SA_OK; char cmd[] = "saHpiGetIdByEntityPath"; pcstrmsock pinst; SaHpiSessionIdT dsid = 0; SaHpiDomainIdT did = 0; SaHpiInstrumentIdT instrument_id; if (SessionId == 0) return SA_ERR_HPI_INVALID_SESSION; err = oh_get_connx(SessionId, &dsid, &pinst, &did); if (err) return err; if (ResourceId == NULL || InstanceId == NULL || *InstanceId == SAHPI_LAST_ENTRY || RptUpdateCount == NULL || (InstrumentId == NULL && InstrumentType != SAHPI_NO_RECORD)) return SA_ERR_HPI_INVALID_PARAMS; if (InstrumentId == NULL) InstrumentId = &instrument_id; cHpiMarshal *hm = HpiMarshalFind(eFsaHpiGetIdByEntityPath); pinst->MessageHeaderInit(eMhMsg, 0, eFsaHpiGetIdByEntityPath, hm->m_request_len); request = malloc(hm->m_request_len); pinst->header.m_len = HpiMarshalRequest4(hm, request, &dsid, &EntityPath, &InstrumentType, InstanceId); SendRecv(SessionId, cmd); int mr = HpiDemarshalReply4(pinst->header.m_flags & dMhEndianBit, hm, reply + sizeof(cMessageHeader), &err, InstanceId, ResourceId, InstrumentId, RptUpdateCount); if (request) free(request); if (pinst->header.m_type == eMhError) return SA_ERR_HPI_INVALID_PARAMS; if (mr < 0) return SA_ERR_HPI_INVALID_PARAMS; return err; } /*----------------------------------------------------------------------------*/ /* saHpiGetChildEntityPath */ /*----------------------------------------------------------------------------*/ SaErrorT SAHPI_API saHpiGetChildEntityPath( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiEntityPathT ParentEntityPath, SAHPI_INOUT SaHpiUint32T *InstanceId, SAHPI_OUT SaHpiEntityPathT *ChildEntityPath, SAHPI_OUT SaHpiUint32T *RptUpdateCount) { void *request; char reply[dMaxMessageLength]; SaErrorT err = SA_OK; char cmd[] = "saHpiGetChildEntityPath"; pcstrmsock pinst; SaHpiSessionIdT dsid = 0; SaHpiDomainIdT did = 0; if (SessionId == 0) return SA_ERR_HPI_INVALID_SESSION; err = oh_get_connx(SessionId, &dsid, &pinst, &did); if (err) return err; if (InstanceId == NULL || *InstanceId == SAHPI_LAST_ENTRY || RptUpdateCount == NULL) return SA_ERR_HPI_INVALID_PARAMS; cHpiMarshal *hm = HpiMarshalFind(eFsaHpiGetChildEntityPath); pinst->MessageHeaderInit(eMhMsg, 0, eFsaHpiGetChildEntityPath, hm->m_request_len); request = malloc(hm->m_request_len); pinst->header.m_len = HpiMarshalRequest3(hm, request, &dsid, &ParentEntityPath, InstanceId); SendRecv(SessionId, cmd); int mr = HpiDemarshalReply3(pinst->header.m_flags & dMhEndianBit, hm, reply + sizeof(cMessageHeader), &err, InstanceId, ChildEntityPath, RptUpdateCount); if (request) free(request); if (pinst->header.m_type == eMhError) return SA_ERR_HPI_INVALID_PARAMS; if (mr < 0) return SA_ERR_HPI_INVALID_PARAMS; return err; } /*----------------------------------------------------------------------------*/ /* saHpiResourceFailedRemove */ /*----------------------------------------------------------------------------*/ SaErrorT SAHPI_API saHpiResourceFailedRemove( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId) { void *request; char reply[dMaxMessageLength]; SaErrorT err = SA_OK; char cmd[] = "saHpiResourceFailedRemove"; pcstrmsock pinst; SaHpiSessionIdT dsid = 0; SaHpiDomainIdT did = 0; if (SessionId == 0) return SA_ERR_HPI_INVALID_SESSION; err = oh_get_connx(SessionId, &dsid, &pinst, &did); if (err) return err; cHpiMarshal *hm = HpiMarshalFind(eFsaHpiResourceFailedRemove); pinst->MessageHeaderInit(eMhMsg, 0, eFsaHpiResourceFailedRemove, hm->m_request_len); request = malloc(hm->m_request_len); pinst->header.m_len = HpiMarshalRequest2(hm, request, &dsid, &ResourceId); SendRecv(SessionId, cmd); int mr = HpiDemarshalReply0(pinst->header.m_flags & dMhEndianBit, hm, reply + sizeof(cMessageHeader), &err); if (request) free(request); if (pinst->header.m_type == eMhError) return SA_ERR_HPI_INVALID_PARAMS; if (mr < 0) return SA_ERR_HPI_INVALID_PARAMS; return err; } /*----------------------------------------------------------------------------*/ /* saHpiEventLogInfoGet */ /*----------------------------------------------------------------------------*/ SaErrorT SAHPI_API saHpiEventLogInfoGet( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId, SAHPI_OUT SaHpiEventLogInfoT *Info) { void *request; char reply[dMaxMessageLength]; SaErrorT err = SA_OK; char cmd[] = "saHpiEventLogInfoGet"; pcstrmsock pinst; SaHpiSessionIdT dsid = 0; SaHpiDomainIdT did = 0; if (SessionId == 0) return SA_ERR_HPI_INVALID_SESSION; err = oh_get_connx(SessionId, &dsid, &pinst, &did); if (err) return err; if (Info == NULL) return SA_ERR_HPI_INVALID_PARAMS; cHpiMarshal *hm = HpiMarshalFind(eFsaHpiEventLogInfoGet); pinst->MessageHeaderInit(eMhMsg, 0, eFsaHpiEventLogInfoGet, hm->m_request_len); request = malloc(hm->m_request_len); pinst->header.m_len = HpiMarshalRequest2(hm, request, &dsid, &ResourceId); SendRecv(SessionId, cmd); int mr = HpiDemarshalReply1(pinst->header.m_flags & dMhEndianBit, hm, reply + sizeof(cMessageHeader), &err, Info); if (request) free(request); if (pinst->header.m_type == eMhError) return SA_ERR_HPI_INVALID_PARAMS; if (mr < 0) return SA_ERR_HPI_INVALID_PARAMS; return err; } /*----------------------------------------------------------------------------*/ /* saHpiEventLogCapabilitiesGet */ /*----------------------------------------------------------------------------*/ SaErrorT SAHPI_API saHpiEventLogCapabilitiesGet( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId, SAHPI_OUT SaHpiEventLogCapabilitiesT *EventLogCapabilities) { void *request; char reply[dMaxMessageLength]; SaErrorT err = SA_OK; char cmd[] = "saHpiEventLogCapabilitiesGet"; pcstrmsock pinst; SaHpiSessionIdT dsid = 0; SaHpiDomainIdT did = 0; if (SessionId == 0) return SA_ERR_HPI_INVALID_SESSION; err = oh_get_connx(SessionId, &dsid, &pinst, &did); if (err) return err; if (EventLogCapabilities == NULL) return SA_ERR_HPI_INVALID_PARAMS; cHpiMarshal *hm = HpiMarshalFind(eFsaHpiEventLogCapabilitiesGet); pinst->MessageHeaderInit(eMhMsg, 0, eFsaHpiEventLogCapabilitiesGet, hm->m_request_len); request = malloc(hm->m_request_len); pinst->header.m_len = HpiMarshalRequest2(hm, request, &dsid, &ResourceId); SendRecv(SessionId, cmd); int mr = HpiDemarshalReply1(pinst->header.m_flags & dMhEndianBit, hm, reply + sizeof(cMessageHeader), &err, EventLogCapabilities); if (request) free(request); if (pinst->header.m_type == eMhError) return SA_ERR_HPI_INVALID_PARAMS; if (mr < 0) return SA_ERR_HPI_INVALID_PARAMS; return err; } /*----------------------------------------------------------------------------*/ /* saHpiEventLogEntryGet */ /*----------------------------------------------------------------------------*/ SaErrorT SAHPI_API saHpiEventLogEntryGet( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId, SAHPI_IN SaHpiEntryIdT EntryId, SAHPI_OUT SaHpiEventLogEntryIdT *PrevEntryId, SAHPI_OUT SaHpiEventLogEntryIdT *NextEntryId, SAHPI_OUT SaHpiEventLogEntryT *EventLogEntry, SAHPI_INOUT SaHpiRdrT *Rdr, SAHPI_INOUT SaHpiRptEntryT *RptEntry) { void *request; char reply[dMaxMessageLength]; SaErrorT err = SA_OK; char cmd[] = "saHpiEventLogEntryGet"; SaHpiRdrT tmp_rdr; SaHpiRptEntryT tmp_rpt; pcstrmsock pinst; SaHpiSessionIdT dsid =0; SaHpiDomainIdT did = 0; if (SessionId == 0) return SA_ERR_HPI_INVALID_SESSION; err = oh_get_connx(SessionId, &dsid, &pinst, &did); if (err) return err; if (!PrevEntryId || !EventLogEntry || !NextEntryId || EntryId == SAHPI_NO_MORE_ENTRIES) { return SA_ERR_HPI_INVALID_PARAMS; } cHpiMarshal *hm = HpiMarshalFind(eFsaHpiEventLogEntryGet); pinst->MessageHeaderInit(eMhMsg, 0, eFsaHpiEventLogEntryGet, hm->m_request_len); request = malloc(hm->m_request_len); pinst->header.m_len = HpiMarshalRequest3(hm, request, &dsid, &ResourceId, &EntryId); SendRecv(SessionId, cmd); int mr = HpiDemarshalReply5(pinst->header.m_flags & dMhEndianBit, hm, reply + sizeof(cMessageHeader), &err, PrevEntryId, NextEntryId, EventLogEntry, &tmp_rdr, &tmp_rpt); if (Rdr != NULL) { memcpy(Rdr, &tmp_rdr, sizeof(SaHpiRdrT)); } if (RptEntry != NULL) { memcpy(RptEntry, &tmp_rpt, sizeof(SaHpiRptEntryT)); } /* If this event is Domain Event, then adjust DomainId */ if ((ResourceId == SAHPI_UNSPECIFIED_RESOURCE_ID) && (EventLogEntry->Event.EventType == SAHPI_ET_DOMAIN)) { EventLogEntry->Event.EventDataUnion.DomainEvent.DomainId = did; } if (request) free(request); if (pinst->header.m_type == eMhError) return SA_ERR_HPI_INVALID_PARAMS; if (mr < 0) return SA_ERR_HPI_INVALID_PARAMS; return err; } /*----------------------------------------------------------------------------*/ /* saHpiEventLogEntryAdd */ /*----------------------------------------------------------------------------*/ SaErrorT SAHPI_API saHpiEventLogEntryAdd( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId, SAHPI_IN SaHpiEventT *EvtEntry) { void *request; char reply[dMaxMessageLength]; SaErrorT err = SA_OK; char cmd[] = "saHpiEventLogEntryAdd"; pcstrmsock pinst; SaHpiSessionIdT dsid = 0; SaHpiDomainIdT did = 0; if (SessionId == 0) return SA_ERR_HPI_INVALID_SESSION; err = oh_get_connx(SessionId, &dsid, &pinst, &did); if (err) return err; if (EvtEntry == NULL) return SA_ERR_HPI_INVALID_PARAMS; if (EvtEntry->EventType != SAHPI_ET_USER || EvtEntry->Source != SAHPI_UNSPECIFIED_RESOURCE_ID) return SA_ERR_HPI_INVALID_PARAMS; if (!oh_lookup_severity(EvtEntry->Severity)) return SA_ERR_HPI_INVALID_PARAMS; if (!oh_valid_textbuffer(&EvtEntry->EventDataUnion.UserEvent.UserEventData)) return SA_ERR_HPI_INVALID_PARAMS; cHpiMarshal *hm = HpiMarshalFind(eFsaHpiEventLogEntryAdd); pinst->MessageHeaderInit(eMhMsg, 0, eFsaHpiEventLogEntryAdd, hm->m_request_len); request = malloc(hm->m_request_len); pinst->header.m_len = HpiMarshalRequest3(hm, request, &dsid, &ResourceId, EvtEntry); SendRecv(SessionId, cmd); int mr = HpiDemarshalReply0(pinst->header.m_flags & dMhEndianBit, hm, reply + sizeof(cMessageHeader), &err); if (request) free(request); if (pinst->header.m_type == eMhError) return SA_ERR_HPI_INVALID_PARAMS; if (mr < 0) return SA_ERR_HPI_INVALID_PARAMS; return err; } /*----------------------------------------------------------------------------*/ /* saHpiEventLogClear */ /*----------------------------------------------------------------------------*/ SaErrorT SAHPI_API saHpiEventLogClear( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId) { void *request; char reply[dMaxMessageLength]; SaErrorT err = SA_OK; char cmd[] = "saHpiEventLogClear"; pcstrmsock pinst; SaHpiSessionIdT dsid = 0; SaHpiDomainIdT did = 0; if (SessionId == 0) return SA_ERR_HPI_INVALID_SESSION; err = oh_get_connx(SessionId, &dsid, &pinst, &did); if (err) return err; cHpiMarshal *hm = HpiMarshalFind(eFsaHpiEventLogClear); pinst->MessageHeaderInit(eMhMsg, 0, eFsaHpiEventLogClear, hm->m_request_len); request = malloc(hm->m_request_len); pinst->header.m_len = HpiMarshalRequest2(hm, request, &dsid, &ResourceId); SendRecv(SessionId, cmd); int mr = HpiDemarshalReply0(pinst->header.m_flags & dMhEndianBit, hm, reply + sizeof(cMessageHeader), &err); if (request) free(request); if (pinst->header.m_type == eMhError) return SA_ERR_HPI_INVALID_PARAMS; if (mr < 0) return SA_ERR_HPI_INVALID_PARAMS; return err; } /*----------------------------------------------------------------------------*/ /* saHpiEventLogTimeGet */ /*----------------------------------------------------------------------------*/ SaErrorT SAHPI_API saHpiEventLogTimeGet( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId, SAHPI_OUT SaHpiTimeT *Time) { void *request; char reply[dMaxMessageLength]; SaErrorT err = SA_OK; char cmd[] = "saHpiEventLogTimeGet"; pcstrmsock pinst; SaHpiSessionIdT dsid = 0; SaHpiDomainIdT did = 0; if (SessionId == 0) return SA_ERR_HPI_INVALID_SESSION; err = oh_get_connx(SessionId, &dsid, &pinst, &did); if (err) return err; if (Time == NULL) return SA_ERR_HPI_INVALID_PARAMS; cHpiMarshal *hm = HpiMarshalFind(eFsaHpiEventLogTimeGet); pinst->MessageHeaderInit(eMhMsg, 0, eFsaHpiEventLogTimeGet, hm->m_request_len); request = malloc(hm->m_request_len); pinst->header.m_len = HpiMarshalRequest2(hm, request, &dsid, &ResourceId); SendRecv(SessionId, cmd); int mr = HpiDemarshalReply1(pinst->header.m_flags & dMhEndianBit, hm, reply + sizeof(cMessageHeader), &err, Time); if (request) free(request); if (pinst->header.m_type == eMhError) return SA_ERR_HPI_INVALID_PARAMS; if (mr < 0) return SA_ERR_HPI_INVALID_PARAMS; return err; } /*----------------------------------------------------------------------------*/ /* saHpiEventLogTimeSet */ /*----------------------------------------------------------------------------*/ SaErrorT SAHPI_API saHpiEventLogTimeSet( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId, SAHPI_IN SaHpiTimeT Time) { void *request; char reply[dMaxMessageLength]; SaErrorT err = SA_OK; char cmd[] = "saHpiEventLogTimeSet"; pcstrmsock pinst; SaHpiSessionIdT dsid = 0; SaHpiDomainIdT did = 0; if (SessionId == 0) return SA_ERR_HPI_INVALID_SESSION; err = oh_get_connx(SessionId, &dsid, &pinst, &did); if (err) return err; cHpiMarshal *hm = HpiMarshalFind(eFsaHpiEventLogTimeSet); pinst->MessageHeaderInit(eMhMsg, 0, eFsaHpiEventLogTimeSet, hm->m_request_len); request = malloc(hm->m_request_len); pinst->header.m_len = HpiMarshalRequest3(hm, request, &dsid, &ResourceId, &Time); SendRecv(SessionId, cmd); int mr = HpiDemarshalReply0(pinst->header.m_flags & dMhEndianBit, hm, reply + sizeof(cMessageHeader), &err); if (request) free(request); if (pinst->header.m_type == eMhError) return SA_ERR_HPI_INVALID_PARAMS; if (mr < 0) return SA_ERR_HPI_INVALID_PARAMS; return err; } /*----------------------------------------------------------------------------*/ /* saHpiEventLogStateGet */ /*----------------------------------------------------------------------------*/ SaErrorT SAHPI_API saHpiEventLogStateGet( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId, SAHPI_OUT SaHpiBoolT *EnableState) { void *request; char reply[dMaxMessageLength]; SaErrorT err = SA_OK; char cmd[] = "saHpiEventLogStateGet"; pcstrmsock pinst; SaHpiSessionIdT dsid = 0; SaHpiDomainIdT did = 0; if (SessionId == 0) return SA_ERR_HPI_INVALID_SESSION; err = oh_get_connx(SessionId, &dsid, &pinst, &did); if (err) return err; if (EnableState == NULL) return SA_ERR_HPI_INVALID_PARAMS; cHpiMarshal *hm = HpiMarshalFind(eFsaHpiEventLogStateGet); pinst->MessageHeaderInit(eMhMsg, 0, eFsaHpiEventLogStateGet, hm->m_request_len); request = malloc(hm->m_request_len); pinst->header.m_len = HpiMarshalRequest2(hm, request, &dsid, &ResourceId); SendRecv(SessionId, cmd); int mr = HpiDemarshalReply1(pinst->header.m_flags & dMhEndianBit, hm, reply + sizeof(cMessageHeader), &err, EnableState); if (request) free(request); if (pinst->header.m_type == eMhError) return SA_ERR_HPI_INVALID_PARAMS; if (mr < 0) return SA_ERR_HPI_INVALID_PARAMS; return err; } /*----------------------------------------------------------------------------*/ /* saHpiEventLogStateSet */ /*----------------------------------------------------------------------------*/ SaErrorT SAHPI_API saHpiEventLogStateSet( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId, SAHPI_IN SaHpiBoolT EnableState) { void *request; char reply[dMaxMessageLength]; SaErrorT err = SA_OK; char cmd[] = "saHpiEventLogStateSet"; pcstrmsock pinst; SaHpiSessionIdT dsid = 0; SaHpiDomainIdT did = 0; if (SessionId == 0) return SA_ERR_HPI_INVALID_SESSION; err = oh_get_connx(SessionId, &dsid, &pinst, &did); if (err) return err; cHpiMarshal *hm = HpiMarshalFind(eFsaHpiEventLogStateSet); pinst->MessageHeaderInit(eMhMsg, 0, eFsaHpiEventLogStateSet, hm->m_request_len); request = malloc(hm->m_request_len); pinst->header.m_len = HpiMarshalRequest3(hm, request, &dsid, &ResourceId, &EnableState); SendRecv(SessionId, cmd); int mr = HpiDemarshalReply0(pinst->header.m_flags & dMhEndianBit, hm, reply + sizeof(cMessageHeader), &err); if (request) free(request); if (pinst->header.m_type == eMhError) return SA_ERR_HPI_INVALID_PARAMS; if (mr < 0) return SA_ERR_HPI_INVALID_PARAMS; return err; } /*----------------------------------------------------------------------------*/ /* saHpiEventLogOverflowReset */ /*----------------------------------------------------------------------------*/ SaErrorT SAHPI_API saHpiEventLogOverflowReset( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId) { void *request; char reply[dMaxMessageLength]; SaErrorT err = SA_OK; char cmd[] = "saHpiEventLogOverflowReset"; pcstrmsock pinst; SaHpiSessionIdT dsid = 0; SaHpiDomainIdT did = 0; if (SessionId == 0) return SA_ERR_HPI_INVALID_SESSION; err = oh_get_connx(SessionId, &dsid, &pinst, &did); if (err) return err; cHpiMarshal *hm = HpiMarshalFind(eFsaHpiEventLogOverflowReset); pinst->MessageHeaderInit(eMhMsg, 0, eFsaHpiEventLogOverflowReset, hm->m_request_len); request = malloc(hm->m_request_len); pinst->header.m_len = HpiMarshalRequest2(hm, request, &dsid, &ResourceId); SendRecv(SessionId, cmd); int mr = HpiDemarshalReply0(pinst->header.m_flags & dMhEndianBit, hm, reply + sizeof(cMessageHeader), &err); if (request) free(request); if (pinst->header.m_type == eMhError) return SA_ERR_HPI_INVALID_PARAMS; if (mr < 0) return SA_ERR_HPI_INVALID_PARAMS; return err; } /*----------------------------------------------------------------------------*/ /* saHpiSubscribe */ /*----------------------------------------------------------------------------*/ SaErrorT SAHPI_API saHpiSubscribe( SAHPI_IN SaHpiSessionIdT SessionId) { void *request; char reply[dMaxMessageLength]; SaErrorT err = SA_OK; char cmd[] = "saHpiSubscribe"; pcstrmsock pinst; SaHpiSessionIdT dsid = 0; SaHpiDomainIdT did = 0; if (SessionId == 0) return SA_ERR_HPI_INVALID_SESSION; err = oh_get_connx(SessionId, &dsid, &pinst, &did); if (err) return err; cHpiMarshal *hm = HpiMarshalFind(eFsaHpiSubscribe); pinst->MessageHeaderInit(eMhMsg, 0, eFsaHpiSubscribe, hm->m_request_len); request = malloc(hm->m_request_len); pinst->header.m_len = HpiMarshalRequest1(hm, request, &dsid); SendRecv(SessionId, cmd); int mr = HpiDemarshalReply0(pinst->header.m_flags & dMhEndianBit, hm, reply + sizeof(cMessageHeader), &err); if (request) free(request); if (pinst->header.m_type == eMhError) return SA_ERR_HPI_INVALID_PARAMS; if (mr < 0) return SA_ERR_HPI_INVALID_PARAMS; return err; } /*----------------------------------------------------------------------------*/ /* saHpiUnsSubscribe */ /*----------------------------------------------------------------------------*/ SaErrorT SAHPI_API saHpiUnsubscribe( SAHPI_IN SaHpiSessionIdT SessionId) { void *request; char reply[dMaxMessageLength]; SaErrorT err = SA_OK; char cmd[] = "saHpiUnsubscribe"; pcstrmsock pinst; SaHpiSessionIdT dsid = 0; SaHpiDomainIdT did = 0; if (SessionId == 0) return SA_ERR_HPI_INVALID_SESSION; err = oh_get_connx(SessionId, &dsid, &pinst, &did); if (err) return err; cHpiMarshal *hm = HpiMarshalFind(eFsaHpiUnsubscribe); pinst->MessageHeaderInit(eMhMsg, 0, eFsaHpiUnsubscribe, hm->m_request_len); request = malloc(hm->m_request_len); pinst->header.m_len = HpiMarshalRequest1(hm, request, &dsid); SendRecv(SessionId, cmd); int mr = HpiDemarshalReply0(pinst->header.m_flags & dMhEndianBit, hm, reply + sizeof(cMessageHeader), &err); if (request) free(request); if (pinst->header.m_type == eMhError) return SA_ERR_HPI_INVALID_PARAMS; if (mr < 0) return SA_ERR_HPI_INVALID_PARAMS; return err; } /*----------------------------------------------------------------------------*/ /* saHpiEventGet */ /*----------------------------------------------------------------------------*/ SaErrorT SAHPI_API saHpiEventGet( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiTimeoutT Timeout, SAHPI_OUT SaHpiEventT *Event, SAHPI_INOUT SaHpiRdrT *Rdr, SAHPI_INOUT SaHpiRptEntryT *RptEntry, SAHPI_INOUT SaHpiEvtQueueStatusT *EventQueueStatus) { void *request; char reply[dMaxMessageLength]; SaErrorT err = SA_OK; char cmd[] = "saHpiEventGet"; SaHpiRdrT tmp_rdr; SaHpiRptEntryT tmp_rpt; SaHpiEvtQueueStatusT tmp_status; pcstrmsock pinst; SaHpiSessionIdT dsid = 0; SaHpiDomainIdT did = 0; if (SessionId == 0) return SA_ERR_HPI_INVALID_SESSION; err = oh_get_connx(SessionId, &dsid, &pinst, &did); if (err) return err; if (Timeout < SAHPI_TIMEOUT_BLOCK || !Event) return SA_ERR_HPI_INVALID_PARAMS; cHpiMarshal *hm = HpiMarshalFind(eFsaHpiEventGet); pinst->MessageHeaderInit(eMhMsg, 0, eFsaHpiEventGet, hm->m_request_len); request = malloc(hm->m_request_len); pinst->header.m_len = HpiMarshalRequest2(hm, request, &dsid, &Timeout); SendRecv(SessionId, cmd); int mr = HpiDemarshalReply4(pinst->header.m_flags & dMhEndianBit, hm, reply + sizeof(cMessageHeader), &err, Event, &tmp_rdr, &tmp_rpt, &tmp_status); if (Rdr != NULL) { memcpy(Rdr, &tmp_rdr, sizeof(SaHpiRdrT)); } if (RptEntry != NULL) { memcpy(RptEntry, &tmp_rpt, sizeof(SaHpiRptEntryT)); } if (EventQueueStatus != NULL) { memcpy(EventQueueStatus, &tmp_status, sizeof(SaHpiEvtQueueStatusT)); } if (request) free(request); if (pinst->header.m_type == eMhError) return SA_ERR_HPI_INVALID_PARAMS; if (mr < 0) return SA_ERR_HPI_INVALID_PARAMS; return err; } /*----------------------------------------------------------------------------*/ /* saHpiEventAdd */ /*----------------------------------------------------------------------------*/ SaErrorT SAHPI_API saHpiEventAdd( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiEventT *Event) { void *request; char reply[dMaxMessageLength]; SaErrorT err = SA_OK; char cmd[] = "saHpiEventAdd"; pcstrmsock pinst; SaHpiSessionIdT dsid = 0; SaHpiDomainIdT did = 0; if (SessionId == 0) return SA_ERR_HPI_INVALID_SESSION; err = oh_get_connx(SessionId, &dsid, &pinst, &did); if (err) return err; err = oh_valid_addevent(Event); if (err != SA_OK) return err; cHpiMarshal *hm = HpiMarshalFind(eFsaHpiEventAdd); pinst->MessageHeaderInit(eMhMsg, 0, eFsaHpiEventAdd, hm->m_request_len); request = malloc(hm->m_request_len); pinst->header.m_len = HpiMarshalRequest2(hm, request, &dsid, Event); SendRecv(SessionId, cmd); int mr = HpiDemarshalReply0(pinst->header.m_flags & dMhEndianBit, hm, reply + sizeof(cMessageHeader), &err); if (request) free(request); if (pinst->header.m_type == eMhError) return SA_ERR_HPI_INVALID_PARAMS; if (mr < 0) return SA_ERR_HPI_INVALID_PARAMS; return err; } /*----------------------------------------------------------------------------*/ /* saHpiAlarmGetNext */ /*----------------------------------------------------------------------------*/ SaErrorT SAHPI_API saHpiAlarmGetNext( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiSeverityT Severity, SAHPI_IN SaHpiBoolT Unack, SAHPI_INOUT SaHpiAlarmT *Alarm) { void *request; char reply[dMaxMessageLength]; SaErrorT err = SA_OK; char cmd[] = "saHpiAlarmGetNext"; pcstrmsock pinst; SaHpiSessionIdT dsid = 0; SaHpiDomainIdT did = 0; if (SessionId == 0) return SA_ERR_HPI_INVALID_SESSION; err = oh_get_connx(SessionId, &dsid, &pinst, &did); if (err) return err; if (!Alarm) return SA_ERR_HPI_INVALID_PARAMS; if (!oh_lookup_severity(Severity)) return SA_ERR_HPI_INVALID_PARAMS; if (Alarm->AlarmId == SAHPI_LAST_ENTRY) return SA_ERR_HPI_NOT_PRESENT; cHpiMarshal *hm = HpiMarshalFind(eFsaHpiAlarmGetNext); pinst->MessageHeaderInit(eMhMsg, 0, eFsaHpiAlarmGetNext, hm->m_request_len); request = malloc(hm->m_request_len); pinst->header.m_len = HpiMarshalRequest4(hm, request, &dsid, &Severity, &Unack, Alarm); SendRecv(SessionId, cmd); int mr = HpiDemarshalReply1(pinst->header.m_flags & dMhEndianBit, hm, reply + sizeof(cMessageHeader), &err, Alarm); /* Set Alarm DomainId to actual DomainID since openhpi core lib has DEFAULT_DOMAIN_ID */ Alarm->AlarmCond.DomainId = did; if (request) free(request); if (pinst->header.m_type == eMhError) return SA_ERR_HPI_INVALID_PARAMS; if (mr < 0) return SA_ERR_HPI_INVALID_PARAMS; return err; } /*----------------------------------------------------------------------------*/ /* saHpiAlarmGet */ /*----------------------------------------------------------------------------*/ SaErrorT SAHPI_API saHpiAlarmGet( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiAlarmIdT AlarmId, SAHPI_OUT SaHpiAlarmT *Alarm) { void *request; char reply[dMaxMessageLength]; SaErrorT err = SA_OK; char cmd[] = "saHpiAlarmGet"; pcstrmsock pinst; SaHpiSessionIdT dsid = 0; SaHpiDomainIdT did = 0; if (SessionId == 0) return SA_ERR_HPI_INVALID_SESSION; err = oh_get_connx(SessionId, &dsid, &pinst, &did); if (err) return err; if (!Alarm) return SA_ERR_HPI_INVALID_PARAMS; cHpiMarshal *hm = HpiMarshalFind(eFsaHpiAlarmGet); pinst->MessageHeaderInit(eMhMsg, 0, eFsaHpiAlarmGet, hm->m_request_len); request = malloc(hm->m_request_len); pinst->header.m_len = HpiMarshalRequest2(hm, request, &dsid, &AlarmId); SendRecv(SessionId, cmd); int mr = HpiDemarshalReply1(pinst->header.m_flags & dMhEndianBit, hm, reply + sizeof(cMessageHeader), &err, Alarm); /* Set Alarm DomainId to actual DomainID since openhpi core lib has DEFAULT_DOMAIN_ID */ Alarm->AlarmCond.DomainId = did; if (request) free(request); if (pinst->header.m_type == eMhError) return SA_ERR_HPI_INVALID_PARAMS; if (mr < 0) return SA_ERR_HPI_INVALID_PARAMS; return err; } /*----------------------------------------------------------------------------*/ /* saHpiAlarmAcknowledge */ /*----------------------------------------------------------------------------*/ SaErrorT SAHPI_API saHpiAlarmAcknowledge( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiAlarmIdT AlarmId, SAHPI_IN SaHpiSeverityT Severity) { void *request; char reply[dMaxMessageLength]; SaErrorT err = SA_OK; char cmd[] = "saHpiAlarmAcknowledge"; pcstrmsock pinst; SaHpiSessionIdT dsid = 0; SaHpiDomainIdT did = 0; if (SessionId == 0) return SA_ERR_HPI_INVALID_SESSION; err = oh_get_connx(SessionId, &dsid, &pinst, &did); if (err) return err; if (AlarmId == SAHPI_ENTRY_UNSPECIFIED && !oh_lookup_severity(Severity)) return SA_ERR_HPI_INVALID_PARAMS; cHpiMarshal *hm = HpiMarshalFind(eFsaHpiAlarmAcknowledge); pinst->MessageHeaderInit(eMhMsg, 0, eFsaHpiAlarmAcknowledge, hm->m_request_len); request = malloc(hm->m_request_len); pinst->header.m_len = HpiMarshalRequest3(hm, request, &dsid, &AlarmId, &Severity); SendRecv(SessionId, cmd); int mr = HpiDemarshalReply0(pinst->header.m_flags & dMhEndianBit, hm, reply + sizeof(cMessageHeader), &err); if (request) free(request); if (pinst->header.m_type == eMhError) return SA_ERR_HPI_INVALID_PARAMS; if (mr < 0) return SA_ERR_HPI_INVALID_PARAMS; return err; } /*----------------------------------------------------------------------------*/ /* saHpiAlarmAdd */ /*----------------------------------------------------------------------------*/ SaErrorT SAHPI_API saHpiAlarmAdd( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_INOUT SaHpiAlarmT *Alarm) { void *request; char reply[dMaxMessageLength]; SaErrorT err = SA_OK; char cmd[] = "saHpiAlarmAdd"; pcstrmsock pinst; SaHpiSessionIdT dsid = 0; SaHpiDomainIdT did = 0; if (SessionId == 0) return SA_ERR_HPI_INVALID_SESSION; err = oh_get_connx(SessionId, &dsid, &pinst, &did); if (err) return err; if (!Alarm || !oh_lookup_severity(Alarm->Severity) || Alarm->AlarmCond.Type != SAHPI_STATUS_COND_TYPE_USER) return SA_ERR_HPI_INVALID_PARAMS; cHpiMarshal *hm = HpiMarshalFind(eFsaHpiAlarmAdd); pinst->MessageHeaderInit(eMhMsg, 0, eFsaHpiAlarmAdd, hm->m_request_len); request = malloc(hm->m_request_len); pinst->header.m_len = HpiMarshalRequest2(hm, request, &dsid, Alarm); SendRecv(SessionId, cmd); int mr = HpiDemarshalReply1(pinst->header.m_flags & dMhEndianBit, hm, reply + sizeof(cMessageHeader), &err, Alarm); /* Set Alarm DomainId to actual DomainID since openhpi core lib has DEFAULT_DOMAIN_ID */ Alarm->AlarmCond.DomainId = did; if (request) free(request); if (pinst->header.m_type == eMhError) return SA_ERR_HPI_INVALID_PARAMS; if (mr < 0) return SA_ERR_HPI_INVALID_PARAMS; return err; } /*----------------------------------------------------------------------------*/ /* saHpiAlarmDelete */ /*----------------------------------------------------------------------------*/ SaErrorT SAHPI_API saHpiAlarmDelete( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiAlarmIdT AlarmId, SAHPI_IN SaHpiSeverityT Severity) { void *request; char reply[dMaxMessageLength]; SaErrorT err = SA_OK; char cmd[] = "saHpiAlarmDelete"; pcstrmsock pinst; SaHpiSessionIdT dsid = 0; SaHpiDomainIdT did = 0; if (SessionId == 0) return SA_ERR_HPI_INVALID_SESSION; err = oh_get_connx(SessionId, &dsid, &pinst, &did); if (err) return err; if (AlarmId == SAHPI_ENTRY_UNSPECIFIED && !oh_lookup_severity(Severity)) return SA_ERR_HPI_INVALID_PARAMS; cHpiMarshal *hm = HpiMarshalFind(eFsaHpiAlarmDelete); pinst->MessageHeaderInit(eMhMsg, 0, eFsaHpiAlarmDelete, hm->m_request_len); request = malloc(hm->m_request_len); pinst->header.m_len = HpiMarshalRequest3(hm, request, &dsid, &AlarmId, &Severity); SendRecv(SessionId, cmd); int mr = HpiDemarshalReply0(pinst->header.m_flags & dMhEndianBit, hm, reply + sizeof(cMessageHeader), &err); if (request) free(request); if (pinst->header.m_type == eMhError) return SA_ERR_HPI_INVALID_PARAMS; if (mr < 0) return SA_ERR_HPI_INVALID_PARAMS; return err; } /*----------------------------------------------------------------------------*/ /* saHpiRdrGet */ /*----------------------------------------------------------------------------*/ SaErrorT SAHPI_API saHpiRdrGet( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId, SAHPI_IN SaHpiEntryIdT EntryId, SAHPI_OUT SaHpiEntryIdT *NextEntryId, SAHPI_OUT SaHpiRdrT *Rdr) { void *request; char reply[dMaxMessageLength]; SaErrorT err = SA_OK; char cmd[] = "saHpiRdrGet"; pcstrmsock pinst; SaHpiSessionIdT dsid = 0; SaHpiDomainIdT did = 0; if (SessionId == 0) return SA_ERR_HPI_INVALID_SESSION; err = oh_get_connx(SessionId, &dsid, &pinst, &did); if (err) return err; if (EntryId == SAHPI_LAST_ENTRY || !Rdr || !NextEntryId) return SA_ERR_HPI_INVALID_PARAMS; cHpiMarshal *hm = HpiMarshalFind(eFsaHpiRdrGet); pinst->MessageHeaderInit(eMhMsg, 0, eFsaHpiRdrGet, hm->m_request_len); request = malloc(hm->m_request_len); pinst->header.m_len = HpiMarshalRequest3(hm, request, &dsid, &ResourceId, &EntryId); SendRecv(SessionId, cmd); int mr = HpiDemarshalReply2(pinst->header.m_flags & dMhEndianBit, hm, reply + sizeof(cMessageHeader), &err, NextEntryId, Rdr); if (request) free(request); if (pinst->header.m_type == eMhError) return SA_ERR_HPI_INVALID_PARAMS; if (mr < 0) return SA_ERR_HPI_INVALID_PARAMS; return err; } /*----------------------------------------------------------------------------*/ /* saHpiRdrGetByInstrumentId */ /*----------------------------------------------------------------------------*/ SaErrorT SAHPI_API saHpiRdrGetByInstrumentId( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId, SAHPI_IN SaHpiRdrTypeT RdrType, SAHPI_IN SaHpiInstrumentIdT InstrumentId, SAHPI_OUT SaHpiRdrT *Rdr) { void *request; char reply[dMaxMessageLength]; SaErrorT err = SA_OK; char cmd[] = "saHpiRdrGetByInstrumentId"; pcstrmsock pinst; SaHpiSessionIdT dsid = 0; SaHpiDomainIdT did = 0; if (SessionId == 0) return SA_ERR_HPI_INVALID_SESSION; err = oh_get_connx(SessionId, &dsid, &pinst, &did); if (err) return err; if (!oh_lookup_rdrtype(RdrType) || RdrType == SAHPI_NO_RECORD || !Rdr) return SA_ERR_HPI_INVALID_PARAMS; cHpiMarshal *hm = HpiMarshalFind(eFsaHpiRdrGetByInstrumentId); pinst->MessageHeaderInit(eMhMsg, 0, eFsaHpiRdrGetByInstrumentId, hm->m_request_len); request = malloc(hm->m_request_len); pinst->header.m_len = HpiMarshalRequest4(hm, request, &dsid, &ResourceId, &RdrType, &InstrumentId); SendRecv(SessionId, cmd); int mr = HpiDemarshalReply1(pinst->header.m_flags & dMhEndianBit, hm, reply + sizeof(cMessageHeader), &err, Rdr); if (request) free(request); if (pinst->header.m_type == eMhError) return SA_ERR_HPI_INVALID_PARAMS; if (mr < 0) return SA_ERR_HPI_INVALID_PARAMS; return err; } /*----------------------------------------------------------------------------*/ /* saHpiRdrUpdateCountGet */ /*----------------------------------------------------------------------------*/ SaErrorT SAHPI_API saHpiRdrUpdateCountGet( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId, SAHPI_OUT SaHpiUint32T *UpdateCount) { void *request; char reply[dMaxMessageLength]; SaErrorT err = SA_OK; char cmd[] = "saHpiRdrUpdateCountGet"; pcstrmsock pinst; SaHpiSessionIdT dsid = 0; SaHpiDomainIdT did = 0; if (SessionId == 0) return SA_ERR_HPI_INVALID_SESSION; err = oh_get_connx(SessionId, &dsid, &pinst, &did); if (err) return err; if (UpdateCount == NULL) return SA_ERR_HPI_INVALID_PARAMS; cHpiMarshal *hm = HpiMarshalFind(eFsaHpiRdrUpdateCountGet); pinst->MessageHeaderInit(eMhMsg, 0, eFsaHpiRdrUpdateCountGet, hm->m_request_len); request = malloc(hm->m_request_len); pinst->header.m_len = HpiMarshalRequest2(hm, request, &dsid, &ResourceId); SendRecv(SessionId, cmd); int mr = HpiDemarshalReply1(pinst->header.m_flags & dMhEndianBit, hm, reply + sizeof(cMessageHeader), &err, UpdateCount); if (request) free(request); if (pinst->header.m_type == eMhError) return SA_ERR_HPI_INVALID_PARAMS; if (mr < 0) return SA_ERR_HPI_INVALID_PARAMS; return err; } /*----------------------------------------------------------------------------*/ /* saHpiSensorReadingGet */ /*----------------------------------------------------------------------------*/ SaErrorT SAHPI_API saHpiSensorReadingGet( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId, SAHPI_IN SaHpiSensorNumT SensorNum, SAHPI_INOUT SaHpiSensorReadingT *Reading, SAHPI_INOUT SaHpiEventStateT *EventState) { void *request; char reply[dMaxMessageLength]; SaErrorT err = SA_OK; char cmd[] = "saHpiSensorReadingGet"; SaHpiSensorReadingT tmp_reading; SaHpiEventStateT tmp_state; pcstrmsock pinst; SaHpiSessionIdT dsid = 0; SaHpiDomainIdT did = 0; if (SessionId == 0) return SA_ERR_HPI_INVALID_SESSION; err = oh_get_connx(SessionId, &dsid, &pinst, &did); if (err) return err; cHpiMarshal *hm = HpiMarshalFind(eFsaHpiSensorReadingGet); pinst->MessageHeaderInit(eMhMsg, 0, eFsaHpiSensorReadingGet, hm->m_request_len); request = malloc(hm->m_request_len); pinst->header.m_len = HpiMarshalRequest3(hm, request, &dsid, &ResourceId, &SensorNum); SendRecv(SessionId, cmd); int mr = HpiDemarshalReply2(pinst->header.m_flags & dMhEndianBit, hm, reply + sizeof(cMessageHeader), &err, &tmp_reading, &tmp_state); if (Reading != NULL) { memcpy(Reading, &tmp_reading, sizeof(SaHpiSensorReadingT)); } if (EventState != NULL) { memcpy(EventState, &tmp_state, sizeof(SaHpiEventStateT)); } if (request) free(request); if (pinst->header.m_type == eMhError) return SA_ERR_HPI_INVALID_PARAMS; if (mr < 0) return SA_ERR_HPI_INVALID_PARAMS; return err; } /*----------------------------------------------------------------------------*/ /* saHpiSensorThresholdsGet */ /*----------------------------------------------------------------------------*/ SaErrorT SAHPI_API saHpiSensorThresholdsGet( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId, SAHPI_IN SaHpiSensorNumT SensorNum, SAHPI_OUT SaHpiSensorThresholdsT *Thresholds) { void *request; char reply[dMaxMessageLength]; SaErrorT err = SA_OK; char cmd[] = "saHpiSensorThresholdsGet"; pcstrmsock pinst; SaHpiSessionIdT dsid = 0; SaHpiDomainIdT did = 0; if (SessionId == 0) return SA_ERR_HPI_INVALID_SESSION; err = oh_get_connx(SessionId, &dsid, &pinst, &did); if (err) return err; if (!Thresholds) return SA_ERR_HPI_INVALID_PARAMS; cHpiMarshal *hm = HpiMarshalFind(eFsaHpiSensorThresholdsGet); pinst->MessageHeaderInit(eMhMsg, 0, eFsaHpiSensorThresholdsGet, hm->m_request_len); request = malloc(hm->m_request_len); pinst->header.m_len = HpiMarshalRequest3(hm, request, &dsid, &ResourceId, &SensorNum); SendRecv(SessionId, cmd); int mr = HpiDemarshalReply1(pinst->header.m_flags & dMhEndianBit, hm, reply + sizeof(cMessageHeader), &err, Thresholds); if (request) free(request); if (pinst->header.m_type == eMhError) return SA_ERR_HPI_INVALID_PARAMS; if (mr < 0) return SA_ERR_HPI_INVALID_PARAMS; return err; } /*----------------------------------------------------------------------------*/ /* saHpiSensorThresholdsSet */ /*----------------------------------------------------------------------------*/ SaErrorT SAHPI_API saHpiSensorThresholdsSet( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId, SAHPI_IN SaHpiSensorNumT SensorNum, SAHPI_IN SaHpiSensorThresholdsT *Thresholds) { void *request; char reply[dMaxMessageLength]; SaErrorT err = SA_OK; char cmd[] = "saHpiSensorThresholdsSet"; pcstrmsock pinst; SaHpiSessionIdT dsid = 0; SaHpiDomainIdT did = 0; SaHpiSensorThresholdsT tmpthrds; if (SessionId == 0) return SA_ERR_HPI_INVALID_SESSION; err = oh_get_connx(SessionId, &dsid, &pinst, &did); if (err) return err; if (!Thresholds) return SA_ERR_HPI_INVALID_PARAMS; err = clean_thresholds(Thresholds, &tmpthrds); if (err) return err; cHpiMarshal *hm = HpiMarshalFind(eFsaHpiSensorThresholdsSet); pinst->MessageHeaderInit(eMhMsg, 0, eFsaHpiSensorThresholdsSet, hm->m_request_len); request = malloc(hm->m_request_len); pinst->header.m_len = HpiMarshalRequest4(hm, request, &dsid, &ResourceId, &SensorNum, &tmpthrds); SendRecv(SessionId, cmd); int mr = HpiDemarshalReply0(pinst->header.m_flags & dMhEndianBit, hm, reply + sizeof(cMessageHeader), &err); if (request) free(request); if (pinst->header.m_type == eMhError) return SA_ERR_HPI_INVALID_PARAMS; if (mr < 0) return SA_ERR_HPI_INVALID_PARAMS; return err; } /*----------------------------------------------------------------------------*/ /* saHpiSensorTypeGet */ /*----------------------------------------------------------------------------*/ SaErrorT SAHPI_API saHpiSensorTypeGet( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId, SAHPI_IN SaHpiSensorNumT SensorNum, SAHPI_OUT SaHpiSensorTypeT *Type, SAHPI_OUT SaHpiEventCategoryT *Category) { void *request; char reply[dMaxMessageLength]; SaErrorT err = SA_OK; char cmd[] = "saHpiSensorTypeGet"; pcstrmsock pinst; SaHpiSessionIdT dsid = 0; SaHpiDomainIdT did = 0; if (SessionId == 0) return SA_ERR_HPI_INVALID_SESSION; err = oh_get_connx(SessionId, &dsid, &pinst, &did); if (err) return err; if (!Type || !Category) return SA_ERR_HPI_INVALID_PARAMS; cHpiMarshal *hm = HpiMarshalFind(eFsaHpiSensorTypeGet); pinst->MessageHeaderInit(eMhMsg, 0, eFsaHpiSensorTypeGet, hm->m_request_len); request = malloc(hm->m_request_len); pinst->header.m_len = HpiMarshalRequest3(hm, request, &dsid, &ResourceId, &SensorNum); SendRecv(SessionId, cmd); int mr = HpiDemarshalReply2(pinst->header.m_flags & dMhEndianBit, hm, reply + sizeof(cMessageHeader), &err, Type, Category); if (request) free(request); if (pinst->header.m_type == eMhError) return SA_ERR_HPI_INVALID_PARAMS; if (mr < 0) return SA_ERR_HPI_INVALID_PARAMS; return err; } /*----------------------------------------------------------------------------*/ /* saHpiSensorEnableGet */ /*----------------------------------------------------------------------------*/ SaErrorT SAHPI_API saHpiSensorEnableGet( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId, SAHPI_IN SaHpiSensorNumT SensorNum, SAHPI_OUT SaHpiBoolT *Enabled) { void *request; char reply[dMaxMessageLength]; SaErrorT err = SA_OK; char cmd[] = "saHpiSensorEnableGet"; pcstrmsock pinst; SaHpiSessionIdT dsid = 0; SaHpiDomainIdT did = 0; if (SessionId == 0) return SA_ERR_HPI_INVALID_SESSION; err = oh_get_connx(SessionId, &dsid, &pinst, &did); if (err) return err; if (!Enabled) return SA_ERR_HPI_INVALID_PARAMS; cHpiMarshal *hm = HpiMarshalFind(eFsaHpiSensorEnableGet); pinst->MessageHeaderInit(eMhMsg, 0, eFsaHpiSensorEnableGet, hm->m_request_len); request = malloc(hm->m_request_len); pinst->header.m_len = HpiMarshalRequest3(hm, request, &dsid, &ResourceId, &SensorNum); SendRecv(SessionId, cmd); int mr = HpiDemarshalReply1(pinst->header.m_flags & dMhEndianBit, hm, reply + sizeof(cMessageHeader), &err, Enabled); if (request) free(request); if (pinst->header.m_type == eMhError) return SA_ERR_HPI_INVALID_PARAMS; if (mr < 0) return SA_ERR_HPI_INVALID_PARAMS; return err; } /*----------------------------------------------------------------------------*/ /* saHpiSensorEnableSet */ /*----------------------------------------------------------------------------*/ SaErrorT SAHPI_API saHpiSensorEnableSet( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId, SAHPI_IN SaHpiSensorNumT SensorNum, SAHPI_IN SaHpiBoolT Enabled) { void *request; char reply[dMaxMessageLength]; SaErrorT err = SA_OK; char cmd[] = "saHpiSensorEnableSet"; pcstrmsock pinst; SaHpiSessionIdT dsid = 0; SaHpiDomainIdT did = 0; if (SessionId == 0) return SA_ERR_HPI_INVALID_SESSION; err = oh_get_connx(SessionId, &dsid, &pinst, &did); if (err) return err; cHpiMarshal *hm = HpiMarshalFind(eFsaHpiSensorEnableSet); pinst->MessageHeaderInit(eMhMsg, 0, eFsaHpiSensorEnableSet, hm->m_request_len); request = malloc(hm->m_request_len); pinst->header.m_len = HpiMarshalRequest4(hm, request, &dsid, &ResourceId, &SensorNum, &Enabled); SendRecv(SessionId, cmd); int mr = HpiDemarshalReply0(pinst->header.m_flags & dMhEndianBit, hm, reply + sizeof(cMessageHeader), &err); if (request) free(request); if (pinst->header.m_type == eMhError) return SA_ERR_HPI_INVALID_PARAMS; if (mr < 0) return SA_ERR_HPI_INVALID_PARAMS; return err; } /*----------------------------------------------------------------------------*/ /* saHpiSensorEventEnableGet */ /*----------------------------------------------------------------------------*/ SaErrorT SAHPI_API saHpiSensorEventEnableGet( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId, SAHPI_IN SaHpiSensorNumT SensorNum, SAHPI_OUT SaHpiBoolT *Enabled) { void *request; char reply[dMaxMessageLength]; SaErrorT err = SA_OK; char cmd[] = "saHpiSensorEventEnableGet"; pcstrmsock pinst; SaHpiSessionIdT dsid = 0; SaHpiDomainIdT did = 0; if (SessionId == 0) return SA_ERR_HPI_INVALID_SESSION; err = oh_get_connx(SessionId, &dsid, &pinst, &did); if (err) return err; if (!Enabled) return SA_ERR_HPI_INVALID_PARAMS; cHpiMarshal *hm = HpiMarshalFind(eFsaHpiSensorEventEnableGet); pinst->MessageHeaderInit(eMhMsg, 0, eFsaHpiSensorEventEnableGet, hm->m_request_len); request = malloc(hm->m_request_len); pinst->header.m_len = HpiMarshalRequest3(hm, request, &dsid, &ResourceId, &SensorNum); SendRecv(SessionId, cmd); int mr = HpiDemarshalReply1(pinst->header.m_flags & dMhEndianBit, hm, reply + sizeof(cMessageHeader), &err, Enabled); if (request) free(request); if (pinst->header.m_type == eMhError) return SA_ERR_HPI_INVALID_PARAMS; if (mr < 0) return SA_ERR_HPI_INVALID_PARAMS; return err; } /*----------------------------------------------------------------------------*/ /* saHpiSensorEventEnableSet */ /*----------------------------------------------------------------------------*/ SaErrorT SAHPI_API saHpiSensorEventEnableSet( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId, SAHPI_IN SaHpiSensorNumT SensorNum, SAHPI_IN SaHpiBoolT Enabled) { void *request; char reply[dMaxMessageLength]; SaErrorT err = SA_OK; char cmd[] = "saHpiSensorEventEnableSet"; pcstrmsock pinst; SaHpiSessionIdT dsid = 0; SaHpiDomainIdT did = 0; if (SessionId == 0) return SA_ERR_HPI_INVALID_SESSION; err = oh_get_connx(SessionId, &dsid, &pinst, &did); if (err) return err; cHpiMarshal *hm = HpiMarshalFind(eFsaHpiSensorEventEnableSet); pinst->MessageHeaderInit(eMhMsg, 0, eFsaHpiSensorEventEnableSet, hm->m_request_len); request = malloc(hm->m_request_len); pinst->header.m_len = HpiMarshalRequest4(hm, request, &dsid, &ResourceId, &SensorNum, &Enabled); SendRecv(SessionId, cmd); int mr = HpiDemarshalReply0(pinst->header.m_flags & dMhEndianBit, hm, reply + sizeof(cMessageHeader), &err); if (request) free(request); if (pinst->header.m_type == eMhError) return SA_ERR_HPI_INVALID_PARAMS; if (mr < 0) return SA_ERR_HPI_INVALID_PARAMS; return err; } /*----------------------------------------------------------------------------*/ /* saHpiSensorEventMasksGet */ /*----------------------------------------------------------------------------*/ SaErrorT SAHPI_API saHpiSensorEventMasksGet( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId, SAHPI_IN SaHpiSensorNumT SensorNum, SAHPI_INOUT SaHpiEventStateT *Assert, SAHPI_INOUT SaHpiEventStateT *Deassert) { void *request; char reply[dMaxMessageLength]; SaErrorT err = SA_OK; char cmd[] = "saHpiSensorEventMasksGet"; pcstrmsock pinst; SaHpiSessionIdT dsid = 0; SaHpiDomainIdT did = 0; SaHpiEventStateT myassert = 0, mydeassert = 0; if (SessionId == 0) return SA_ERR_HPI_INVALID_SESSION; err = oh_get_connx(SessionId, &dsid, &pinst, &did); if (err) return err; if (!Assert) Assert = &myassert; if (!Deassert) Deassert = &mydeassert; cHpiMarshal *hm = HpiMarshalFind(eFsaHpiSensorEventMasksGet); pinst->MessageHeaderInit(eMhMsg, 0, eFsaHpiSensorEventMasksGet, hm->m_request_len); request = malloc(hm->m_request_len); pinst->header.m_len = HpiMarshalRequest5(hm, request, &dsid, &ResourceId, &SensorNum, Assert, Deassert); SendRecv(SessionId, cmd); int mr = HpiDemarshalReply2(pinst->header.m_flags & dMhEndianBit, hm, reply + sizeof(cMessageHeader), &err, Assert, Deassert); if (request) free(request); if (pinst->header.m_type == eMhError) return SA_ERR_HPI_INVALID_PARAMS; if (mr < 0) return SA_ERR_HPI_INVALID_PARAMS; return err; } /*----------------------------------------------------------------------------*/ /* saHpiSensorEventMasksSet */ /*----------------------------------------------------------------------------*/ SaErrorT SAHPI_API saHpiSensorEventMasksSet( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId, SAHPI_IN SaHpiSensorNumT SensorNum, SAHPI_IN SaHpiSensorEventMaskActionT Action, SAHPI_IN SaHpiEventStateT Assert, SAHPI_IN SaHpiEventStateT Deassert) { void *request; char reply[dMaxMessageLength]; SaErrorT err = SA_OK; char cmd[] = "saHpiSensorEventMasksSet"; pcstrmsock pinst; SaHpiSessionIdT dsid = 0; SaHpiDomainIdT did = 0; if (SessionId == 0) return SA_ERR_HPI_INVALID_SESSION; err = oh_get_connx(SessionId, &dsid, &pinst, &did); if (err) return err; cHpiMarshal *hm = HpiMarshalFind(eFsaHpiSensorEventMasksSet); pinst->MessageHeaderInit(eMhMsg, 0, eFsaHpiSensorEventMasksSet, hm->m_request_len); request = malloc(hm->m_request_len); pinst->header.m_len = HpiMarshalRequest6(hm, request, &dsid, &ResourceId, &SensorNum, &Action, &Assert, &Deassert); SendRecv(SessionId, cmd); int mr = HpiDemarshalReply0(pinst->header.m_flags & dMhEndianBit, hm, reply + sizeof(cMessageHeader), &err); if (request) free(request); if (pinst->header.m_type == eMhError) return SA_ERR_HPI_INVALID_PARAMS; if (mr < 0) return SA_ERR_HPI_INVALID_PARAMS; return err; } /*----------------------------------------------------------------------------*/ /* saHpiControlTypeGet */ /*----------------------------------------------------------------------------*/ SaErrorT SAHPI_API saHpiControlTypeGet( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId, SAHPI_IN SaHpiCtrlNumT CtrlNum, SAHPI_OUT SaHpiCtrlTypeT *Type) { void *request; char reply[dMaxMessageLength]; SaErrorT err = SA_OK; char cmd[] = "saHpiControlTypeGet"; pcstrmsock pinst; SaHpiSessionIdT dsid = 0; SaHpiDomainIdT did = 0; if (SessionId == 0) return SA_ERR_HPI_INVALID_SESSION; err = oh_get_connx(SessionId, &dsid, &pinst, &did); if (err) return err; if (!Type) return SA_ERR_HPI_INVALID_PARAMS; cHpiMarshal *hm = HpiMarshalFind(eFsaHpiControlTypeGet); pinst->MessageHeaderInit(eMhMsg, 0, eFsaHpiControlTypeGet, hm->m_request_len); request = malloc(hm->m_request_len); pinst->header.m_len = HpiMarshalRequest3(hm, request, &dsid, &ResourceId, &CtrlNum); SendRecv(SessionId, cmd); int mr = HpiDemarshalReply1(pinst->header.m_flags & dMhEndianBit, hm, reply + sizeof(cMessageHeader), &err, Type); if (request) free(request); if (pinst->header.m_type == eMhError) return SA_ERR_HPI_INVALID_PARAMS; if (mr < 0) return SA_ERR_HPI_INVALID_PARAMS; return err; } /*----------------------------------------------------------------------------*/ /* saHpiControlGet */ /*----------------------------------------------------------------------------*/ SaErrorT SAHPI_API saHpiControlGet( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId, SAHPI_IN SaHpiCtrlNumT CtrlNum, SAHPI_OUT SaHpiCtrlModeT *Mode, SAHPI_INOUT SaHpiCtrlStateT *State) { void *request; char reply[dMaxMessageLength]; SaErrorT err = SA_OK; char cmd[] = "saHpiControlGet"; SaHpiCtrlModeT tmp_mode = SAHPI_CTRL_MODE_AUTO; SaHpiCtrlStateT tmp_state; pcstrmsock pinst; SaHpiSessionIdT dsid = 0; SaHpiDomainIdT did = 0; memset(&tmp_state, 0, sizeof(SaHpiCtrlStateT)); if (SessionId == 0) return SA_ERR_HPI_INVALID_SESSION; err = oh_get_connx(SessionId, &dsid, &pinst, &did); if (err) return err; if (State != NULL) { memcpy(&tmp_state, State, sizeof(SaHpiCtrlStateT)); if (oh_lookup_ctrltype(tmp_state.Type) == NULL) { tmp_state.Type = SAHPI_CTRL_TYPE_TEXT; } } else { tmp_state.Type = SAHPI_CTRL_TYPE_TEXT; } cHpiMarshal *hm = HpiMarshalFind(eFsaHpiControlGet); pinst->MessageHeaderInit(eMhMsg, 0, eFsaHpiControlGet, hm->m_request_len); request = malloc(hm->m_request_len); pinst->header.m_len = HpiMarshalRequest4(hm, request, &dsid, &ResourceId, &CtrlNum, &tmp_state); SendRecv(SessionId, cmd); int mr = HpiDemarshalReply2(pinst->header.m_flags & dMhEndianBit, hm, reply + sizeof(cMessageHeader), &err, &tmp_mode, &tmp_state); if (Mode != NULL) { memcpy(Mode, &tmp_mode, sizeof(SaHpiCtrlModeT)); } if (State != NULL) { memcpy(State, &tmp_state, sizeof(SaHpiCtrlStateT)); } if (request) free(request); if (pinst->header.m_type == eMhError) return SA_ERR_HPI_INVALID_PARAMS; if (mr < 0) return SA_ERR_HPI_INVALID_PARAMS; return err; } /*----------------------------------------------------------------------------*/ /* saHpiControlSet */ /*----------------------------------------------------------------------------*/ SaErrorT SAHPI_API saHpiControlSet( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId, SAHPI_IN SaHpiCtrlNumT CtrlNum, SAHPI_IN SaHpiCtrlModeT Mode, SAHPI_IN SaHpiCtrlStateT *State) { void *request; char reply[dMaxMessageLength]; SaErrorT err = SA_OK; char cmd[] = "saHpiControlSet"; pcstrmsock pinst; SaHpiSessionIdT dsid = 0; SaHpiDomainIdT did = 0; SaHpiCtrlStateT mystate, *pmystate = NULL; if (SessionId == 0) return SA_ERR_HPI_INVALID_SESSION; err = oh_get_connx(SessionId, &dsid, &pinst, &did); if (err) return err; if (!oh_lookup_ctrlmode(Mode) || (Mode != SAHPI_CTRL_MODE_AUTO && !State) || (State && State->Type == SAHPI_CTRL_TYPE_DIGITAL && !oh_lookup_ctrlstatedigital(State->StateUnion.Digital)) || (State && State->Type == SAHPI_CTRL_TYPE_STREAM && State->StateUnion.Stream.StreamLength > SAHPI_CTRL_MAX_STREAM_LENGTH)) return SA_ERR_HPI_INVALID_PARAMS; memset(&mystate, 0, sizeof(SaHpiCtrlStateT)); if (Mode == SAHPI_CTRL_MODE_AUTO) { pmystate = &mystate; } else if (State && !oh_lookup_ctrltype(State->Type)) { return SA_ERR_HPI_INVALID_DATA; } else { pmystate = State; } cHpiMarshal *hm = HpiMarshalFind(eFsaHpiControlSet); pinst->MessageHeaderInit(eMhMsg, 0, eFsaHpiControlSet, hm->m_request_len); request = malloc(hm->m_request_len); pinst->header.m_len = HpiMarshalRequest5(hm, request, &dsid, &ResourceId, &CtrlNum, &Mode, pmystate); SendRecv(SessionId, cmd); int mr = HpiDemarshalReply0(pinst->header.m_flags & dMhEndianBit, hm, reply + sizeof(cMessageHeader), &err); if (request) free(request); if (pinst->header.m_type == eMhError) return SA_ERR_HPI_INVALID_PARAMS; if (mr < 0) return SA_ERR_HPI_INVALID_PARAMS; return err; } /*----------------------------------------------------------------------------*/ /* saHpiIdrInfoGet */ /*----------------------------------------------------------------------------*/ SaErrorT SAHPI_API saHpiIdrInfoGet( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId, SAHPI_IN SaHpiIdrIdT Idrid, SAHPI_OUT SaHpiIdrInfoT *Info) { void *request; char reply[dMaxMessageLength]; SaErrorT err = SA_OK; char cmd[] = "saHpiIdrInfoGet"; pcstrmsock pinst; SaHpiSessionIdT dsid = 0; SaHpiDomainIdT did = 0; if (SessionId == 0) return SA_ERR_HPI_INVALID_SESSION; err = oh_get_connx(SessionId, &dsid, &pinst, &did); if (err) return err; if (Info == NULL) return SA_ERR_HPI_INVALID_PARAMS; cHpiMarshal *hm = HpiMarshalFind(eFsaHpiIdrInfoGet); pinst->MessageHeaderInit(eMhMsg, 0, eFsaHpiIdrInfoGet, hm->m_request_len); request = malloc(hm->m_request_len); pinst->header.m_len = HpiMarshalRequest3(hm, request, &dsid, &ResourceId, &Idrid); SendRecv(SessionId, cmd); int mr = HpiDemarshalReply1(pinst->header.m_flags & dMhEndianBit, hm, reply + sizeof(cMessageHeader), &err, Info); if (request) free(request); if (pinst->header.m_type == eMhError) return SA_ERR_HPI_INVALID_PARAMS; if (mr < 0) return SA_ERR_HPI_INVALID_PARAMS; return err; } /*----------------------------------------------------------------------------*/ /* saHpiIdrAreaHeaderGet */ /*----------------------------------------------------------------------------*/ SaErrorT SAHPI_API saHpiIdrAreaHeaderGet( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId, SAHPI_IN SaHpiIdrIdT Idrid, SAHPI_IN SaHpiIdrAreaTypeT AreaType, SAHPI_IN SaHpiEntryIdT AreaId, SAHPI_OUT SaHpiEntryIdT *NextAreaId, SAHPI_OUT SaHpiIdrAreaHeaderT *Header) { void *request; char reply[dMaxMessageLength]; SaErrorT err = SA_OK; char cmd[] = "saHpiIdrAreaHeaderGet"; pcstrmsock pinst; SaHpiSessionIdT dsid = 0; SaHpiDomainIdT did = 0; if (SessionId == 0) return SA_ERR_HPI_INVALID_SESSION; err = oh_get_connx(SessionId, &dsid, &pinst, &did); if (err) return err; if ( ((AreaType < SAHPI_IDR_AREATYPE_INTERNAL_USE) || ((AreaType > SAHPI_IDR_AREATYPE_PRODUCT_INFO) && (AreaType != SAHPI_IDR_AREATYPE_UNSPECIFIED) && (AreaType != SAHPI_IDR_AREATYPE_OEM)) || (AreaId == SAHPI_LAST_ENTRY)|| (NextAreaId == NULL) || (Header == NULL))) return SA_ERR_HPI_INVALID_PARAMS; cHpiMarshal *hm = HpiMarshalFind(eFsaHpiIdrAreaHeaderGet); pinst->MessageHeaderInit(eMhMsg, 0, eFsaHpiIdrAreaHeaderGet, hm->m_request_len); request = malloc(hm->m_request_len); pinst->header.m_len = HpiMarshalRequest5(hm, request, &dsid, &ResourceId, &Idrid, &AreaType, &AreaId); SendRecv(SessionId, cmd); int mr = HpiDemarshalReply2(pinst->header.m_flags & dMhEndianBit, hm, reply + sizeof(cMessageHeader), &err, NextAreaId, Header); if (request) free(request); if (pinst->header.m_type == eMhError) return SA_ERR_HPI_INVALID_PARAMS; if (mr < 0) return SA_ERR_HPI_INVALID_PARAMS; return err; } /*----------------------------------------------------------------------------*/ /* saHpiIdrAreaAdd */ /*----------------------------------------------------------------------------*/ SaErrorT SAHPI_API saHpiIdrAreaAdd( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId, SAHPI_IN SaHpiIdrIdT Idrid, SAHPI_IN SaHpiIdrAreaTypeT AreaType, SAHPI_OUT SaHpiEntryIdT *AreaId) { void *request; char reply[dMaxMessageLength]; SaErrorT err = SA_OK; char cmd[] = "saHpiIdrAreaAdd"; pcstrmsock pinst; SaHpiSessionIdT dsid = 0; SaHpiDomainIdT did = 0; if (SessionId == 0) return SA_ERR_HPI_INVALID_SESSION; err = oh_get_connx(SessionId, &dsid, &pinst, &did); if (err) return err; if (!oh_lookup_idrareatype(AreaType) || AreaId == NULL) { return SA_ERR_HPI_INVALID_PARAMS; } else if (AreaType == SAHPI_IDR_AREATYPE_UNSPECIFIED) { return SA_ERR_HPI_INVALID_DATA; } cHpiMarshal *hm = HpiMarshalFind(eFsaHpiIdrAreaAdd); pinst->MessageHeaderInit(eMhMsg, 0, eFsaHpiIdrAreaAdd, hm->m_request_len); request = malloc(hm->m_request_len); pinst->header.m_len = HpiMarshalRequest4(hm, request, &dsid, &ResourceId, &Idrid, &AreaType); SendRecv(SessionId, cmd); int mr = HpiDemarshalReply1(pinst->header.m_flags & dMhEndianBit, hm, reply + sizeof(cMessageHeader), &err, AreaId); if (request) free(request); if (pinst->header.m_type == eMhError) return SA_ERR_HPI_INVALID_PARAMS; if (mr < 0) return SA_ERR_HPI_INVALID_PARAMS; return err; } /*----------------------------------------------------------------------------*/ /* saHpiIdrAreaAddById */ /*----------------------------------------------------------------------------*/ SaErrorT SAHPI_API saHpiIdrAreaAddById( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId, SAHPI_IN SaHpiIdrIdT Idrid, SAHPI_IN SaHpiIdrAreaTypeT AreaType, SAHPI_IN SaHpiEntryIdT AreaId) { void *request; char reply[dMaxMessageLength]; SaErrorT err = SA_OK; char cmd[] = "saHpiIdrAreaAddById"; pcstrmsock pinst; SaHpiSessionIdT dsid = 0; SaHpiDomainIdT did = 0; if (SessionId == 0) return SA_ERR_HPI_INVALID_SESSION; err = oh_get_connx(SessionId, &dsid, &pinst, &did); if (err) return err; if (!oh_lookup_idrareatype(AreaType)) { return SA_ERR_HPI_INVALID_PARAMS; } else if (AreaType == SAHPI_IDR_AREATYPE_UNSPECIFIED) { return SA_ERR_HPI_INVALID_DATA; } cHpiMarshal *hm = HpiMarshalFind(eFsaHpiIdrAreaAddById); pinst->MessageHeaderInit(eMhMsg, 0, eFsaHpiIdrAreaAddById, hm->m_request_len); request = malloc(hm->m_request_len); pinst->header.m_len = HpiMarshalRequest5(hm, request, &dsid, &ResourceId, &Idrid, &AreaType, &AreaId); SendRecv(SessionId, cmd); int mr = HpiDemarshalReply0(pinst->header.m_flags & dMhEndianBit, hm, reply + sizeof(cMessageHeader), &err); if (request) free(request); if (pinst->header.m_type == eMhError) return SA_ERR_HPI_INVALID_PARAMS; if (mr < 0) return SA_ERR_HPI_INVALID_PARAMS; return err; } /*----------------------------------------------------------------------------*/ /* saHpiIdrAreaDelete */ /*----------------------------------------------------------------------------*/ SaErrorT SAHPI_API saHpiIdrAreaDelete( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId, SAHPI_IN SaHpiIdrIdT Idrid, SAHPI_IN SaHpiEntryIdT AreaId) { void *request; char reply[dMaxMessageLength]; SaErrorT err = SA_OK; char cmd[] = "saHpiIdrAreaDelete"; pcstrmsock pinst; SaHpiSessionIdT dsid = 0; SaHpiDomainIdT did = 0; if (SessionId == 0) return SA_ERR_HPI_INVALID_SESSION; err = oh_get_connx(SessionId, &dsid, &pinst, &did); if (err) return err; if (AreaId == SAHPI_LAST_ENTRY) return SA_ERR_HPI_INVALID_PARAMS; cHpiMarshal *hm = HpiMarshalFind(eFsaHpiIdrAreaDelete); pinst->MessageHeaderInit(eMhMsg, 0, eFsaHpiIdrAreaDelete, hm->m_request_len); request = malloc(hm->m_request_len); pinst->header.m_len = HpiMarshalRequest4(hm, request, &dsid, &ResourceId, &Idrid, &AreaId); SendRecv(SessionId, cmd); int mr = HpiDemarshalReply0(pinst->header.m_flags & dMhEndianBit, hm, reply + sizeof(cMessageHeader), &err); if (request) free(request); if (pinst->header.m_type == eMhError) return SA_ERR_HPI_INVALID_PARAMS; if (mr < 0) return SA_ERR_HPI_INVALID_PARAMS; return err; } /*----------------------------------------------------------------------------*/ /* saHpiIdrFieldGet */ /*----------------------------------------------------------------------------*/ SaErrorT SAHPI_API saHpiIdrFieldGet( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId, SAHPI_IN SaHpiIdrIdT Idrid, SAHPI_IN SaHpiEntryIdT AreaId, SAHPI_IN SaHpiIdrFieldTypeT FieldType, SAHPI_IN SaHpiEntryIdT FieldId, SAHPI_OUT SaHpiEntryIdT *NextId, SAHPI_OUT SaHpiIdrFieldT *Field) { void *request; char reply[dMaxMessageLength]; SaErrorT err = SA_OK; char cmd[] = "saHpiIdrFieldGet"; pcstrmsock pinst; SaHpiSessionIdT dsid = 0; SaHpiDomainIdT did = 0; if (SessionId == 0) return SA_ERR_HPI_INVALID_SESSION; err = oh_get_connx(SessionId, &dsid, &pinst, &did); if (err) return err; if (!Field || !oh_lookup_idrfieldtype(FieldType) || AreaId == SAHPI_LAST_ENTRY || FieldId == SAHPI_LAST_ENTRY || !NextId) { client_err(cmd, "Invalid Parameters"); return SA_ERR_HPI_INVALID_PARAMS; } cHpiMarshal *hm = HpiMarshalFind(eFsaHpiIdrFieldGet); pinst->MessageHeaderInit(eMhMsg, 0, eFsaHpiIdrFieldGet, hm->m_request_len); request = malloc(hm->m_request_len); pinst->header.m_len = HpiMarshalRequest6(hm, request, &dsid, &ResourceId, &Idrid, &AreaId, &FieldType, &FieldId); SendRecv(SessionId, cmd); int mr = HpiDemarshalReply2(pinst->header.m_flags & dMhEndianBit, hm, reply + sizeof(cMessageHeader), &err, NextId, Field); if (request) free(request); if (pinst->header.m_type == eMhError) return SA_ERR_HPI_INVALID_PARAMS; if (mr < 0) return SA_ERR_HPI_INVALID_PARAMS; return err; } /*----------------------------------------------------------------------------*/ /* saHpiIdrFieldAdd */ /*----------------------------------------------------------------------------*/ SaErrorT SAHPI_API saHpiIdrFieldAdd( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId, SAHPI_IN SaHpiIdrIdT Idrid, SAHPI_INOUT SaHpiIdrFieldT *Field) { void *request; char reply[dMaxMessageLength]; SaErrorT err = SA_OK; char cmd[] = "saHpiIdrFieldAdd"; pcstrmsock pinst; SaHpiSessionIdT dsid = 0; SaHpiDomainIdT did = 0; if (SessionId == 0) return SA_ERR_HPI_INVALID_SESSION; err = oh_get_connx(SessionId, &dsid, &pinst, &did); if (err) return err; if (!Field) { client_err(cmd, "Null Field"); return SA_ERR_HPI_INVALID_PARAMS; } else if (!oh_lookup_idrfieldtype(Field->Type)) { client_err(cmd, "Bad Field Type"); return SA_ERR_HPI_INVALID_PARAMS; } else if (Field->Type == SAHPI_IDR_FIELDTYPE_UNSPECIFIED) { client_err(cmd, "Unspecified Field Type"); return SA_ERR_HPI_INVALID_PARAMS; } else if (oh_valid_textbuffer(&Field->Field) != SAHPI_TRUE) { client_err(cmd, "Bad Text Buffer in Field"); return SA_ERR_HPI_INVALID_PARAMS; } cHpiMarshal *hm = HpiMarshalFind(eFsaHpiIdrFieldAdd); pinst->MessageHeaderInit(eMhMsg, 0, eFsaHpiIdrFieldAdd, hm->m_request_len); request = malloc(hm->m_request_len); pinst->header.m_len = HpiMarshalRequest4(hm, request, &dsid, &ResourceId, &Idrid, Field); SendRecv(SessionId, cmd); int mr = HpiDemarshalReply1(pinst->header.m_flags & dMhEndianBit, hm, reply + sizeof(cMessageHeader), &err, Field); if (request) free(request); if (pinst->header.m_type == eMhError) return SA_ERR_HPI_INVALID_PARAMS; if (mr < 0) return SA_ERR_HPI_INVALID_PARAMS; return err; } /*----------------------------------------------------------------------------*/ /* saHpiIdrFieldAddById */ /*----------------------------------------------------------------------------*/ SaErrorT SAHPI_API saHpiIdrFieldAddById( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId, SAHPI_IN SaHpiIdrIdT Idrid, SAHPI_INOUT SaHpiIdrFieldT *Field) { void *request; char reply[dMaxMessageLength]; SaErrorT err = SA_OK; char cmd[] = "saHpiIdrFieldAddById"; pcstrmsock pinst; SaHpiSessionIdT dsid = 0; SaHpiDomainIdT did = 0; if (SessionId == 0) return SA_ERR_HPI_INVALID_SESSION; err = oh_get_connx(SessionId, &dsid, &pinst, &did); if (err) return err; if (!Field) { client_err(cmd, "Null Field"); return SA_ERR_HPI_INVALID_PARAMS; } else if (!oh_lookup_idrfieldtype(Field->Type)) { client_err(cmd, "Bad Field Type"); return SA_ERR_HPI_INVALID_PARAMS; } else if (Field->Type == SAHPI_IDR_FIELDTYPE_UNSPECIFIED) { client_err(cmd, "Unspecified Field Type"); return SA_ERR_HPI_INVALID_PARAMS; } else if (oh_valid_textbuffer(&Field->Field) != SAHPI_TRUE) { client_err(cmd, "Bad Text Buffer in Field"); return SA_ERR_HPI_INVALID_PARAMS; } cHpiMarshal *hm = HpiMarshalFind(eFsaHpiIdrFieldAddById); pinst->MessageHeaderInit(eMhMsg, 0, eFsaHpiIdrFieldAddById, hm->m_request_len); request = malloc(hm->m_request_len); pinst->header.m_len = HpiMarshalRequest4(hm, request, &dsid, &ResourceId, &Idrid, Field); SendRecv(SessionId, cmd); int mr = HpiDemarshalReply1(pinst->header.m_flags & dMhEndianBit, hm, reply + sizeof(cMessageHeader), &err, Field); if (request) free(request); if (pinst->header.m_type == eMhError) return SA_ERR_HPI_INVALID_PARAMS; if (mr < 0) return SA_ERR_HPI_INVALID_PARAMS; return err; } /*----------------------------------------------------------------------------*/ /* saHpiIdrFieldSet */ /*----------------------------------------------------------------------------*/ SaErrorT SAHPI_API saHpiIdrFieldSet( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId, SAHPI_IN SaHpiIdrIdT Idrid, SAHPI_IN SaHpiIdrFieldT *Field) { void *request; char reply[dMaxMessageLength]; SaErrorT err = SA_OK; char cmd[] = "saHpiIdrFieldSet"; pcstrmsock pinst; SaHpiSessionIdT dsid = 0; SaHpiDomainIdT did = 0; if (SessionId == 0) return SA_ERR_HPI_INVALID_SESSION; err = oh_get_connx(SessionId, &dsid, &pinst, &did); if (err) return err; if (!Field) return SA_ERR_HPI_INVALID_PARAMS; if (Field->Type > SAHPI_IDR_FIELDTYPE_CUSTOM) return SA_ERR_HPI_INVALID_PARAMS; cHpiMarshal *hm = HpiMarshalFind(eFsaHpiIdrFieldSet); pinst->MessageHeaderInit(eMhMsg, 0, eFsaHpiIdrFieldSet, hm->m_request_len); request = malloc(hm->m_request_len); pinst->header.m_len = HpiMarshalRequest4(hm, request, &dsid, &ResourceId, &Idrid, Field); SendRecv(SessionId, cmd); int mr = HpiDemarshalReply0(pinst->header.m_flags & dMhEndianBit, hm, reply + sizeof(cMessageHeader), &err); if (request) free(request); if (pinst->header.m_type == eMhError) return SA_ERR_HPI_INVALID_PARAMS; if (mr < 0) return SA_ERR_HPI_INVALID_PARAMS; return err; } /*----------------------------------------------------------------------------*/ /* saHpiIdrFieldDelete */ /*----------------------------------------------------------------------------*/ SaErrorT SAHPI_API saHpiIdrFieldDelete( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId, SAHPI_IN SaHpiIdrIdT Idrid, SAHPI_IN SaHpiEntryIdT AreaId, SAHPI_IN SaHpiEntryIdT FieldId) { void *request; char reply[dMaxMessageLength]; SaErrorT err = SA_OK; char cmd[] = "saHpiIdrFieldDelete"; pcstrmsock pinst; SaHpiSessionIdT dsid = 0; SaHpiDomainIdT did = 0; if (SessionId == 0) return SA_ERR_HPI_INVALID_SESSION; err = oh_get_connx(SessionId, &dsid, &pinst, &did); if (err) return err; if (FieldId == SAHPI_LAST_ENTRY || AreaId == SAHPI_LAST_ENTRY) return SA_ERR_HPI_INVALID_PARAMS; cHpiMarshal *hm = HpiMarshalFind(eFsaHpiIdrFieldDelete); pinst->MessageHeaderInit(eMhMsg, 0, eFsaHpiIdrFieldDelete, hm->m_request_len); request = malloc(hm->m_request_len); pinst->header.m_len = HpiMarshalRequest5(hm, request, &dsid, &ResourceId, &Idrid, &AreaId, &FieldId); SendRecv(SessionId, cmd); int mr = HpiDemarshalReply0(pinst->header.m_flags & dMhEndianBit, hm, reply + sizeof(cMessageHeader), &err); if (request) free(request); if (pinst->header.m_type == eMhError) return SA_ERR_HPI_INVALID_PARAMS; if (mr < 0) return SA_ERR_HPI_INVALID_PARAMS; return err; } /*----------------------------------------------------------------------------*/ /* saHpiWatchdogTimerGet */ /*----------------------------------------------------------------------------*/ SaErrorT SAHPI_API saHpiWatchdogTimerGet( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId, SAHPI_IN SaHpiWatchdogNumT WatchdogNum, SAHPI_OUT SaHpiWatchdogT *Watchdog) { void *request; char reply[dMaxMessageLength]; SaErrorT err = SA_OK; char cmd[] = "saHpiWatchdogTimerGet"; pcstrmsock pinst; SaHpiSessionIdT dsid = 0; SaHpiDomainIdT did = 0; if (SessionId == 0) return SA_ERR_HPI_INVALID_SESSION; err = oh_get_connx(SessionId, &dsid, &pinst, &did); if (err) return err; if (!Watchdog) return SA_ERR_HPI_INVALID_PARAMS; cHpiMarshal *hm = HpiMarshalFind(eFsaHpiWatchdogTimerGet); pinst->MessageHeaderInit(eMhMsg, 0, eFsaHpiWatchdogTimerGet, hm->m_request_len); request = malloc(hm->m_request_len); pinst->header.m_len = HpiMarshalRequest3(hm, request, &dsid, &ResourceId, &WatchdogNum); SendRecv(SessionId, cmd); int mr = HpiDemarshalReply1(pinst->header.m_flags & dMhEndianBit, hm, reply + sizeof(cMessageHeader), &err, Watchdog); if (request) free(request); if (pinst->header.m_type == eMhError) return SA_ERR_HPI_INVALID_PARAMS; if (mr < 0) return SA_ERR_HPI_INVALID_PARAMS; return err; } /*----------------------------------------------------------------------------*/ /* saHpiWatchdogTimerSet */ /*----------------------------------------------------------------------------*/ SaErrorT SAHPI_API saHpiWatchdogTimerSet( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId, SAHPI_IN SaHpiWatchdogNumT WatchdogNum, SAHPI_IN SaHpiWatchdogT *Watchdog) { void *request; char reply[dMaxMessageLength]; SaErrorT err = SA_OK; char cmd[] = "saHpiWatchdogTimerSet"; pcstrmsock pinst; SaHpiSessionIdT dsid = 0; SaHpiDomainIdT did = 0; if (SessionId == 0) return SA_ERR_HPI_INVALID_SESSION; err = oh_get_connx(SessionId, &dsid, &pinst, &did); if (err) return err; if (!Watchdog || !oh_lookup_watchdogtimeruse(Watchdog->TimerUse) || !oh_lookup_watchdogaction(Watchdog->TimerAction) || !oh_lookup_watchdogpretimerinterrupt(Watchdog->PretimerInterrupt)) { return SA_ERR_HPI_INVALID_PARAMS; } if (Watchdog->PreTimeoutInterval > Watchdog->InitialCount) { return SA_ERR_HPI_INVALID_DATA; } cHpiMarshal *hm = HpiMarshalFind(eFsaHpiWatchdogTimerSet); pinst->MessageHeaderInit(eMhMsg, 0, eFsaHpiWatchdogTimerSet, hm->m_request_len); request = malloc(hm->m_request_len); pinst->header.m_len = HpiMarshalRequest4(hm, request, &dsid, &ResourceId, &WatchdogNum, Watchdog); SendRecv(SessionId, cmd); int mr = HpiDemarshalReply0(pinst->header.m_flags & dMhEndianBit, hm, reply + sizeof(cMessageHeader), &err); if (request) free(request); if (pinst->header.m_type == eMhError) return SA_ERR_HPI_INVALID_PARAMS; if (mr < 0) return SA_ERR_HPI_INVALID_PARAMS; return err; } /*----------------------------------------------------------------------------*/ /* saHpiWatchdogTimerReset */ /*----------------------------------------------------------------------------*/ SaErrorT SAHPI_API saHpiWatchdogTimerReset( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId, SAHPI_IN SaHpiWatchdogNumT WatchdogNum) { void *request; char reply[dMaxMessageLength]; SaErrorT err = SA_OK; char cmd[] = "saHpiWatchdogTimerReset"; pcstrmsock pinst; SaHpiSessionIdT dsid = 0; SaHpiDomainIdT did = 0; if (SessionId == 0) return SA_ERR_HPI_INVALID_SESSION; err = oh_get_connx(SessionId, &dsid, &pinst, &did); if (err) return err; cHpiMarshal *hm = HpiMarshalFind(eFsaHpiWatchdogTimerReset); pinst->MessageHeaderInit(eMhMsg, 0, eFsaHpiWatchdogTimerReset, hm->m_request_len); request = malloc(hm->m_request_len); pinst->header.m_len = HpiMarshalRequest3(hm, request, &dsid, &ResourceId, &WatchdogNum); SendRecv(SessionId, cmd); int mr = HpiDemarshalReply0(pinst->header.m_flags & dMhEndianBit, hm, reply + sizeof(cMessageHeader), &err); if (request) free(request); if (pinst->header.m_type == eMhError) return SA_ERR_HPI_INVALID_PARAMS; if (mr < 0) return SA_ERR_HPI_INVALID_PARAMS; return err; } /*----------------------------------------------------------------------------*/ /* saHpiAnnunciatorGetNext */ /*----------------------------------------------------------------------------*/ SaErrorT SAHPI_API saHpiAnnunciatorGetNext( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId, SAHPI_IN SaHpiAnnunciatorNumT AnnNum, SAHPI_IN SaHpiSeverityT Severity, SAHPI_IN SaHpiBoolT Unack, SAHPI_INOUT SaHpiAnnouncementT *Announcement) { void *request; char reply[dMaxMessageLength]; SaErrorT err = SA_OK; char cmd[] = "saHpiAnnunciatorGetNext"; pcstrmsock pinst; SaHpiSessionIdT dsid = 0; SaHpiDomainIdT did = 0; if (SessionId == 0) return SA_ERR_HPI_INVALID_SESSION; err = oh_get_connx(SessionId, &dsid, &pinst, &did); if (err) return err; if (Announcement == NULL) return SA_ERR_HPI_INVALID_PARAMS; if (!oh_lookup_severity(Severity)) return SA_ERR_HPI_INVALID_PARAMS; cHpiMarshal *hm = HpiMarshalFind(eFsaHpiAnnunciatorGetNext); pinst->MessageHeaderInit(eMhMsg, 0, eFsaHpiAnnunciatorGetNext, hm->m_request_len); request = malloc(hm->m_request_len); pinst->header.m_len = HpiMarshalRequest6(hm, request, &dsid, &ResourceId, &AnnNum, &Severity, &Unack, Announcement); SendRecv(SessionId, cmd); int mr = HpiDemarshalReply1(pinst->header.m_flags & dMhEndianBit, hm, reply + sizeof(cMessageHeader), &err, Announcement); if (request) free(request); if (pinst->header.m_type == eMhError) return SA_ERR_HPI_INVALID_PARAMS; if (mr < 0) return SA_ERR_HPI_INVALID_PARAMS; return err; } /*----------------------------------------------------------------------------*/ /* saHpiAnnunciatorGet */ /*----------------------------------------------------------------------------*/ SaErrorT SAHPI_API saHpiAnnunciatorGet( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId, SAHPI_IN SaHpiAnnunciatorNumT AnnNum, SAHPI_IN SaHpiEntryIdT EntryId, SAHPI_OUT SaHpiAnnouncementT *Announcement) { void *request; char reply[dMaxMessageLength]; SaErrorT err = SA_OK; char cmd[] = "saHpiAnnunciatorGet"; pcstrmsock pinst; SaHpiSessionIdT dsid = 0; SaHpiDomainIdT did = 0; if (SessionId == 0) return SA_ERR_HPI_INVALID_SESSION; err = oh_get_connx(SessionId, &dsid, &pinst, &did); if (err) return err; if (Announcement == NULL) return SA_ERR_HPI_INVALID_PARAMS; cHpiMarshal *hm = HpiMarshalFind(eFsaHpiAnnunciatorGet); pinst->MessageHeaderInit(eMhMsg, 0, eFsaHpiAnnunciatorGet, hm->m_request_len); request = malloc(hm->m_request_len); pinst->header.m_len = HpiMarshalRequest4(hm, request, &dsid, &ResourceId, &AnnNum, &EntryId); SendRecv(SessionId, cmd); int mr = HpiDemarshalReply1(pinst->header.m_flags & dMhEndianBit, hm, reply + sizeof(cMessageHeader), &err, Announcement); if (request) free(request); if (pinst->header.m_type == eMhError) return SA_ERR_HPI_INVALID_PARAMS; if (mr < 0) return SA_ERR_HPI_INVALID_PARAMS; return err; } /*----------------------------------------------------------------------------*/ /* saHpiAnnunciatorAcknowledge */ /*----------------------------------------------------------------------------*/ SaErrorT SAHPI_API saHpiAnnunciatorAcknowledge( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId, SAHPI_IN SaHpiAnnunciatorNumT AnnNum, SAHPI_IN SaHpiEntryIdT EntryId, SAHPI_IN SaHpiSeverityT Severity) { void *request; char reply[dMaxMessageLength]; SaErrorT err = SA_OK; char cmd[] = "saHpiAnnunciatorAcknowledge"; pcstrmsock pinst; SaHpiSessionIdT dsid = 0; SaHpiDomainIdT did = 0; SaHpiSeverityT mysev = SAHPI_DEBUG; if (SessionId == 0) return SA_ERR_HPI_INVALID_SESSION; if (EntryId == SAHPI_ENTRY_UNSPECIFIED) { if (!oh_lookup_severity(Severity)) { return SA_ERR_HPI_INVALID_PARAMS; } else { mysev = Severity; } } err = oh_get_connx(SessionId, &dsid, &pinst, &did); if (err) return err; cHpiMarshal *hm = HpiMarshalFind(eFsaHpiAnnunciatorAcknowledge); pinst->MessageHeaderInit(eMhMsg, 0, eFsaHpiAnnunciatorAcknowledge, hm->m_request_len); request = malloc(hm->m_request_len); pinst->header.m_len = HpiMarshalRequest5(hm, request, &dsid, &ResourceId, &AnnNum, &EntryId, &mysev); SendRecv(SessionId, cmd); int mr = HpiDemarshalReply0(pinst->header.m_flags & dMhEndianBit, hm, reply + sizeof(cMessageHeader), &err); if (request) free(request); if (pinst->header.m_type == eMhError) return SA_ERR_HPI_INVALID_PARAMS; if (mr < 0) return SA_ERR_HPI_INVALID_PARAMS; return err; } /*----------------------------------------------------------------------------*/ /* saHpiAnnunciatorAdd */ /*----------------------------------------------------------------------------*/ SaErrorT SAHPI_API saHpiAnnunciatorAdd( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId, SAHPI_IN SaHpiAnnunciatorNumT AnnNum, SAHPI_INOUT SaHpiAnnouncementT *Announcement) { void *request; char reply[dMaxMessageLength]; SaErrorT err = SA_OK; char cmd[] = "saHpiAnnunciatorAdd"; pcstrmsock pinst; SaHpiSessionIdT dsid = 0; SaHpiDomainIdT did = 0; if (SessionId == 0) return SA_ERR_HPI_INVALID_SESSION; err = oh_get_connx(SessionId, &dsid, &pinst, &did); if (err) return err; if (Announcement == NULL) return SA_ERR_HPI_INVALID_PARAMS; if (Announcement->Severity == SAHPI_ALL_SEVERITIES || !oh_lookup_severity(Announcement->Severity) || !oh_valid_textbuffer(&Announcement->StatusCond.Data) || !oh_lookup_statuscondtype(Announcement->StatusCond.Type)) return SA_ERR_HPI_INVALID_PARAMS; cHpiMarshal *hm = HpiMarshalFind(eFsaHpiAnnunciatorAdd); pinst->MessageHeaderInit(eMhMsg, 0, eFsaHpiAnnunciatorAdd, hm->m_request_len); request = malloc(hm->m_request_len); pinst->header.m_len = HpiMarshalRequest4(hm, request, &dsid, &ResourceId, &AnnNum, Announcement); SendRecv(SessionId, cmd); int mr = HpiDemarshalReply1(pinst->header.m_flags & dMhEndianBit, hm, reply + sizeof(cMessageHeader), &err, Announcement); if (request) free(request); if (pinst->header.m_type == eMhError) return SA_ERR_HPI_INVALID_PARAMS; if (mr < 0) return SA_ERR_HPI_INVALID_PARAMS; return err; } /*----------------------------------------------------------------------------*/ /* saHpiAnnunciatorDelete */ /*----------------------------------------------------------------------------*/ SaErrorT SAHPI_API saHpiAnnunciatorDelete( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId, SAHPI_IN SaHpiAnnunciatorNumT AnnNum, SAHPI_IN SaHpiEntryIdT EntryId, SAHPI_IN SaHpiSeverityT Severity) { void *request; char reply[dMaxMessageLength]; SaErrorT err = SA_OK; char cmd[] = "saHpiAnnunciatorDelete"; pcstrmsock pinst; SaHpiSessionIdT dsid = 0; SaHpiDomainIdT did = 0; SaHpiSeverityT mysev = SAHPI_DEBUG; if (SessionId == 0) return SA_ERR_HPI_INVALID_SESSION; if (EntryId == SAHPI_ENTRY_UNSPECIFIED) { if (!oh_lookup_severity(Severity)) { printf("Bad severity %d passed in.\n", Severity); return SA_ERR_HPI_INVALID_PARAMS; } else { mysev = Severity; } } err = oh_get_connx(SessionId, &dsid, &pinst, &did); if (err) return err; cHpiMarshal *hm = HpiMarshalFind(eFsaHpiAnnunciatorDelete); pinst->MessageHeaderInit(eMhMsg, 0, eFsaHpiAnnunciatorDelete, hm->m_request_len); request = malloc(hm->m_request_len); pinst->header.m_len = HpiMarshalRequest5(hm, request, &dsid, &ResourceId, &AnnNum, &EntryId, &mysev); SendRecv(SessionId, cmd); int mr = HpiDemarshalReply0(pinst->header.m_flags & dMhEndianBit, hm, reply + sizeof(cMessageHeader), &err); if (request) free(request); if (pinst->header.m_type == eMhError) return SA_ERR_HPI_INVALID_PARAMS; if (mr < 0) return SA_ERR_HPI_INVALID_PARAMS; return err; } /*----------------------------------------------------------------------------*/ /* saHpiAnnunciatorModeGet */ /*----------------------------------------------------------------------------*/ SaErrorT SAHPI_API saHpiAnnunciatorModeGet( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId, SAHPI_IN SaHpiAnnunciatorNumT AnnNum, SAHPI_OUT SaHpiAnnunciatorModeT *Mode) { void *request; char reply[dMaxMessageLength]; SaErrorT err = SA_OK; char cmd[] = "saHpiAnnunciatorModeGet"; pcstrmsock pinst; SaHpiSessionIdT dsid = 0; SaHpiDomainIdT did = 0; if (SessionId == 0) return SA_ERR_HPI_INVALID_SESSION; err = oh_get_connx(SessionId, &dsid, &pinst, &did); if (err) return err; if (Mode == NULL) return SA_ERR_HPI_INVALID_PARAMS; cHpiMarshal *hm = HpiMarshalFind(eFsaHpiAnnunciatorModeGet); pinst->MessageHeaderInit(eMhMsg, 0, eFsaHpiAnnunciatorModeGet, hm->m_request_len); request = malloc(hm->m_request_len); pinst->header.m_len = HpiMarshalRequest3(hm, request, &dsid, &ResourceId, &AnnNum); SendRecv(SessionId, cmd); int mr = HpiDemarshalReply1(pinst->header.m_flags & dMhEndianBit, hm, reply + sizeof(cMessageHeader), &err, Mode); if (request) free(request); if (pinst->header.m_type == eMhError) return SA_ERR_HPI_INVALID_PARAMS; if (mr < 0) return SA_ERR_HPI_INVALID_PARAMS; return err; } /*----------------------------------------------------------------------------*/ /* saHpiAnnunciatorModeSet */ /*----------------------------------------------------------------------------*/ SaErrorT SAHPI_API saHpiAnnunciatorModeSet( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId, SAHPI_IN SaHpiAnnunciatorNumT AnnNum, SAHPI_IN SaHpiAnnunciatorModeT Mode) { void *request; char reply[dMaxMessageLength]; SaErrorT err = SA_OK; char cmd[] = "saHpiAnnunciatorModeSet"; pcstrmsock pinst; SaHpiSessionIdT dsid = 0; SaHpiDomainIdT did = 0; if (SessionId == 0) return SA_ERR_HPI_INVALID_SESSION; err = oh_get_connx(SessionId, &dsid, &pinst, &did); if (err) return err; if (!oh_lookup_annunciatormode(Mode)) return SA_ERR_HPI_INVALID_PARAMS; cHpiMarshal *hm = HpiMarshalFind(eFsaHpiAnnunciatorModeSet); pinst->MessageHeaderInit(eMhMsg, 0, eFsaHpiAnnunciatorModeSet, hm->m_request_len); request = malloc(hm->m_request_len); pinst->header.m_len = HpiMarshalRequest4(hm, request, &dsid, &ResourceId, &AnnNum, &Mode); SendRecv(SessionId, cmd); int mr = HpiDemarshalReply0(pinst->header.m_flags & dMhEndianBit, hm, reply + sizeof(cMessageHeader), &err); if (request) free(request); if (pinst->header.m_type == eMhError) return SA_ERR_HPI_INVALID_PARAMS; if (mr < 0) return SA_ERR_HPI_INVALID_PARAMS; return err; } /*----------------------------------------------------------------------------*/ /* saHpiDimiInfoGet */ /*----------------------------------------------------------------------------*/ SaErrorT SAHPI_API saHpiDimiInfoGet( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId, SAHPI_IN SaHpiDimiNumT DimiNum, SAHPI_OUT SaHpiDimiInfoT *DimiInfo) { void *request; char reply[dMaxMessageLength]; SaErrorT err = SA_OK; char cmd[] = "saHpiDimiInfoGet"; pcstrmsock pinst; SaHpiSessionIdT dsid = 0; SaHpiDomainIdT did = 0; if (SessionId == 0) return SA_ERR_HPI_INVALID_SESSION; err = oh_get_connx(SessionId, &dsid, &pinst, &did); if (err) return err; if (!DimiInfo) return SA_ERR_HPI_INVALID_PARAMS; cHpiMarshal *hm = HpiMarshalFind(eFsaHpiDimiInfoGet); pinst->MessageHeaderInit(eMhMsg, 0, eFsaHpiDimiInfoGet, hm->m_request_len); request = malloc(hm->m_request_len); pinst->header.m_len = HpiMarshalRequest3(hm, request, &dsid, &ResourceId, &DimiNum); SendRecv(SessionId, cmd); int mr = HpiDemarshalReply1(pinst->header.m_flags & dMhEndianBit, hm, reply + sizeof(cMessageHeader), &err, DimiInfo); if (request) free(request); if (pinst->header.m_type == eMhError) return SA_ERR_HPI_INVALID_PARAMS; if (mr < 0) return SA_ERR_HPI_INVALID_PARAMS; return err; } SaErrorT SAHPI_API saHpiDimiTestInfoGet( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId, SAHPI_IN SaHpiDimiNumT DimiNum, SAHPI_IN SaHpiDimiTestNumT TestNum, SAHPI_OUT SaHpiDimiTestT *DimiTest) { void *request; char reply[dMaxMessageLength]; SaErrorT err = SA_OK; char cmd[] = "saHpiDimiTestInfoGet"; pcstrmsock pinst; SaHpiSessionIdT dsid = 0; SaHpiDomainIdT did = 0; if (SessionId == 0) return SA_ERR_HPI_INVALID_SESSION; err = oh_get_connx(SessionId, &dsid, &pinst, &did); if (err) return err; if (!DimiTest) return SA_ERR_HPI_INVALID_PARAMS; cHpiMarshal *hm = HpiMarshalFind(eFsaHpiDimiTestInfoGet); pinst->MessageHeaderInit(eMhMsg, 0, eFsaHpiDimiTestInfoGet, hm->m_request_len); request = malloc(hm->m_request_len); pinst->header.m_len = HpiMarshalRequest4(hm, request, &dsid, &ResourceId, &DimiNum, &TestNum); SendRecv(SessionId, cmd); int mr = HpiDemarshalReply1(pinst->header.m_flags & dMhEndianBit, hm, reply + sizeof(cMessageHeader), &err, DimiTest); if (request) free(request); if (pinst->header.m_type == eMhError) return SA_ERR_HPI_INVALID_PARAMS; if (mr < 0) return SA_ERR_HPI_INVALID_PARAMS; return err; } SaErrorT SAHPI_API saHpiDimiTestReadinessGet( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId, SAHPI_IN SaHpiDimiNumT DimiNum, SAHPI_IN SaHpiDimiTestNumT TestNum, SAHPI_OUT SaHpiDimiReadyT *DimiReady) { void *request; char reply[dMaxMessageLength]; SaErrorT err = SA_OK; char cmd[] = "saHpiDimiTestReadinessGet"; pcstrmsock pinst; SaHpiSessionIdT dsid = 0; SaHpiDomainIdT did = 0; if (SessionId == 0) return SA_ERR_HPI_INVALID_SESSION; err = oh_get_connx(SessionId, &dsid, &pinst, &did); if (err) return err; if (!DimiReady) return SA_ERR_HPI_INVALID_PARAMS; cHpiMarshal *hm = HpiMarshalFind(eFsaHpiDimiTestReadinessGet); pinst->MessageHeaderInit(eMhMsg, 0, eFsaHpiDimiTestReadinessGet, hm->m_request_len); request = malloc(hm->m_request_len); pinst->header.m_len = HpiMarshalRequest4(hm, request, &dsid, &ResourceId, &DimiNum, &TestNum); SendRecv(SessionId, cmd); int mr = HpiDemarshalReply1(pinst->header.m_flags & dMhEndianBit, hm, reply + sizeof(cMessageHeader), &err, DimiReady); if (request) free(request); if (pinst->header.m_type == eMhError) return SA_ERR_HPI_INVALID_PARAMS; if (mr < 0) return SA_ERR_HPI_INVALID_PARAMS; return err; } SaErrorT SAHPI_API saHpiDimiTestStart( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId, SAHPI_IN SaHpiDimiNumT DimiNum, SAHPI_IN SaHpiDimiTestNumT TestNum, SAHPI_IN SaHpiUint8T NumberOfParams, SAHPI_IN SaHpiDimiTestVariableParamsT *ParamsList) { void *request; char reply[dMaxMessageLength]; SaErrorT err = SA_OK; char cmd[] = "saHpiDimiTestStart"; pcstrmsock pinst; SaHpiSessionIdT dsid = 0; SaHpiDomainIdT did = 0; SaHpiDimiTestVariableParamsListT params_list; if (SessionId == 0) return SA_ERR_HPI_INVALID_SESSION; err = oh_get_connx(SessionId, &dsid, &pinst, &did); if (err) return err; if (ParamsList == NULL && NumberOfParams != 0) return SA_ERR_HPI_INVALID_PARAMS; params_list.NumberOfParams = NumberOfParams; params_list.ParamsList = ParamsList; cHpiMarshal *hm = HpiMarshalFind(eFsaHpiDimiTestStart); pinst->MessageHeaderInit(eMhMsg, 0, eFsaHpiDimiTestStart, hm->m_request_len); request = malloc(hm->m_request_len); pinst->header.m_len = HpiMarshalRequest5(hm, request, &dsid, &ResourceId, &DimiNum, &TestNum, ¶ms_list); SendRecv(SessionId, cmd); int mr = HpiDemarshalReply0(pinst->header.m_flags & dMhEndianBit, hm, reply + sizeof(cMessageHeader), &err); if (request) free(request); if (pinst->header.m_type == eMhError) return SA_ERR_HPI_INVALID_PARAMS; if (mr < 0) return SA_ERR_HPI_INVALID_PARAMS; return err; } SaErrorT SAHPI_API saHpiDimiTestCancel( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId, SAHPI_IN SaHpiDimiNumT DimiNum, SAHPI_IN SaHpiDimiTestNumT TestNum) { void *request; char reply[dMaxMessageLength]; SaErrorT err = SA_OK; char cmd[] = "saHpiDimiTestCancel"; pcstrmsock pinst; SaHpiSessionIdT dsid = 0; SaHpiDomainIdT did = 0; if (SessionId == 0) return SA_ERR_HPI_INVALID_SESSION; err = oh_get_connx(SessionId, &dsid, &pinst, &did); if (err) return err; cHpiMarshal *hm = HpiMarshalFind(eFsaHpiDimiTestCancel); pinst->MessageHeaderInit(eMhMsg, 0, eFsaHpiDimiTestCancel, hm->m_request_len); request = malloc(hm->m_request_len); pinst->header.m_len = HpiMarshalRequest4(hm, request, &dsid, &ResourceId, &DimiNum, &TestNum); SendRecv(SessionId, cmd); int mr = HpiDemarshalReply0(pinst->header.m_flags & dMhEndianBit, hm, reply + sizeof(cMessageHeader), &err); if (request) free(request); if (pinst->header.m_type == eMhError) return SA_ERR_HPI_INVALID_PARAMS; if (mr < 0) return SA_ERR_HPI_INVALID_PARAMS; return err; } SaErrorT SAHPI_API saHpiDimiTestStatusGet( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId, SAHPI_IN SaHpiDimiNumT DimiNum, SAHPI_IN SaHpiDimiTestNumT TestNum, SAHPI_OUT SaHpiDimiTestPercentCompletedT *PercentCompleted, SAHPI_OUT SaHpiDimiTestRunStatusT *RunStatus) { void *request; char reply[dMaxMessageLength]; SaErrorT err = SA_OK; char cmd[] = "saHpiDimiTestStatusGet"; pcstrmsock pinst; SaHpiSessionIdT dsid = 0; SaHpiDomainIdT did = 0; SaHpiDimiTestPercentCompletedT percent; SaHpiDimiTestPercentCompletedT *ppercent = &percent; if (SessionId == 0) return SA_ERR_HPI_INVALID_SESSION; err = oh_get_connx(SessionId, &dsid, &pinst, &did); if (err) return err; if (RunStatus == NULL) return SA_ERR_HPI_INVALID_PARAMS; if (PercentCompleted != NULL) ppercent = PercentCompleted; cHpiMarshal *hm = HpiMarshalFind(eFsaHpiDimiTestStatusGet); pinst->MessageHeaderInit(eMhMsg, 0, eFsaHpiDimiTestStatusGet, hm->m_request_len); request = malloc(hm->m_request_len); pinst->header.m_len = HpiMarshalRequest4(hm, request, &dsid, &ResourceId, &DimiNum, &TestNum); SendRecv(SessionId, cmd); int mr = HpiDemarshalReply2(pinst->header.m_flags & dMhEndianBit, hm, reply + sizeof(cMessageHeader), &err, ppercent, RunStatus); if (request) free(request); if (pinst->header.m_type == eMhError) return SA_ERR_HPI_INVALID_PARAMS; if (mr < 0) return SA_ERR_HPI_INVALID_PARAMS; return err; } SaErrorT SAHPI_API saHpiDimiTestResultsGet( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId, SAHPI_IN SaHpiDimiNumT DimiNum, SAHPI_IN SaHpiDimiTestNumT TestNum, SAHPI_OUT SaHpiDimiTestResultsT *TestResults) { void *request; char reply[dMaxMessageLength]; SaErrorT err = SA_OK; char cmd[] = "saHpiDimiTestResultsGet"; pcstrmsock pinst; SaHpiSessionIdT dsid = 0; SaHpiDomainIdT did = 0; if (SessionId == 0) return SA_ERR_HPI_INVALID_SESSION; err = oh_get_connx(SessionId, &dsid, &pinst, &did); if (err) return err; if (TestResults == NULL) return SA_ERR_HPI_INVALID_PARAMS; cHpiMarshal *hm = HpiMarshalFind(eFsaHpiDimiTestResultsGet); pinst->MessageHeaderInit(eMhMsg, 0, eFsaHpiDimiTestResultsGet, hm->m_request_len); request = malloc(hm->m_request_len); pinst->header.m_len = HpiMarshalRequest4(hm, request, &dsid, &ResourceId, &DimiNum, &TestNum); SendRecv(SessionId, cmd); int mr = HpiDemarshalReply1(pinst->header.m_flags & dMhEndianBit, hm, reply + sizeof(cMessageHeader), &err, TestResults); if (request) free(request); if (pinst->header.m_type == eMhError) return SA_ERR_HPI_INVALID_PARAMS; if (mr < 0) return SA_ERR_HPI_INVALID_PARAMS; return err; } /******************************************************************************* * * FUMI Functions * ******************************************************************************/ SaErrorT SAHPI_API saHpiFumiSpecInfoGet( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId, SAHPI_IN SaHpiFumiNumT FumiNum, SAHPI_OUT SaHpiFumiSpecInfoT *SpecInfo) { void *request; char reply[dMaxMessageLength]; SaErrorT err = SA_OK; char cmd[] = "saHpiFumiSpecInfoGet"; pcstrmsock pinst; SaHpiDomainIdT dsid = 0; SaHpiDomainIdT did = 0; if (SessionId == 0) return SA_ERR_HPI_INVALID_SESSION; err = oh_get_connx(SessionId, &dsid, &pinst, &did); if (err) return err; if (SpecInfo == NULL) return SA_ERR_HPI_INVALID_PARAMS; cHpiMarshal *hm = HpiMarshalFind(eFsaHpiFumiSpecInfoGet); pinst->MessageHeaderInit(eMhMsg, 0, eFsaHpiFumiSpecInfoGet, hm->m_request_len); request = malloc(hm->m_request_len); pinst->header.m_len = HpiMarshalRequest3(hm, request, &dsid, &ResourceId, &FumiNum); SendRecv(SessionId, cmd); int mr = HpiDemarshalReply1(pinst->header.m_flags & dMhEndianBit, hm, reply + sizeof(cMessageHeader), &err, SpecInfo); if (request) free(request); if (pinst->header.m_type == eMhError) return SA_ERR_HPI_INVALID_PARAMS; if (mr < 0) return SA_ERR_HPI_INVALID_PARAMS; return err; } SaErrorT SAHPI_API saHpiFumiServiceImpactGet( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId, SAHPI_IN SaHpiFumiNumT FumiNum, SAHPI_OUT SaHpiFumiServiceImpactDataT *ServiceImpact) { void *request; char reply[dMaxMessageLength]; SaErrorT err = SA_OK; char cmd[] = "saHpiFumiServiceImpactGet"; pcstrmsock pinst; SaHpiDomainIdT dsid = 0; SaHpiDomainIdT did = 0; if (SessionId == 0) return SA_ERR_HPI_INVALID_SESSION; err = oh_get_connx(SessionId, &dsid, &pinst, &did); if (err) return err; if (ServiceImpact == NULL) return SA_ERR_HPI_INVALID_PARAMS; cHpiMarshal *hm = HpiMarshalFind(eFsaHpiFumiServiceImpactGet); pinst->MessageHeaderInit(eMhMsg, 0, eFsaHpiFumiServiceImpactGet, hm->m_request_len); request = malloc(hm->m_request_len); pinst->header.m_len = HpiMarshalRequest3(hm, request, &dsid, &ResourceId, &FumiNum); SendRecv(SessionId, cmd); int mr = HpiDemarshalReply1(pinst->header.m_flags & dMhEndianBit, hm, reply + sizeof(cMessageHeader), &err, ServiceImpact); if (request) free(request); if (pinst->header.m_type == eMhError) return SA_ERR_HPI_INVALID_PARAMS; if (mr < 0) return SA_ERR_HPI_INVALID_PARAMS; return err; } SaErrorT SAHPI_API saHpiFumiSourceSet ( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId, SAHPI_IN SaHpiFumiNumT FumiNum, SAHPI_IN SaHpiBankNumT BankNum, SAHPI_IN SaHpiTextBufferT *SourceUri) { void *request; char reply[dMaxMessageLength]; SaErrorT err = SA_OK; char cmd[] = "saHpiFumiSourceSet"; pcstrmsock pinst; SaHpiSessionIdT dsid = 0; SaHpiDomainIdT did = 0; if (SessionId == 0) return SA_ERR_HPI_INVALID_SESSION; err = oh_get_connx(SessionId, &dsid, &pinst, &did); if (err) return err; if (SourceUri == NULL || SourceUri->DataType != SAHPI_TL_TYPE_TEXT) return SA_ERR_HPI_INVALID_PARAMS; cHpiMarshal *hm = HpiMarshalFind(eFsaHpiFumiSourceSet); pinst->MessageHeaderInit(eMhMsg, 0, eFsaHpiFumiSourceSet, hm->m_request_len); request = malloc(hm->m_request_len); pinst->header.m_len = HpiMarshalRequest5(hm, request, &dsid, &ResourceId, &FumiNum, &BankNum, SourceUri); SendRecv(SessionId, cmd); int mr = HpiDemarshalReply0(pinst->header.m_flags & dMhEndianBit, hm, reply + sizeof(cMessageHeader), &err); if (request) free(request); if (pinst->header.m_type == eMhError) return SA_ERR_HPI_INVALID_PARAMS; if (mr < 0) return SA_ERR_HPI_INVALID_PARAMS; return err; } SaErrorT SAHPI_API saHpiFumiSourceInfoValidateStart ( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId, SAHPI_IN SaHpiFumiNumT FumiNum, SAHPI_IN SaHpiBankNumT BankNum) { void *request; char reply[dMaxMessageLength]; SaErrorT err = SA_OK; char cmd[] = "saHpiFumiSourceInfoValidateStart"; pcstrmsock pinst; SaHpiSessionIdT dsid = 0; SaHpiDomainIdT did = 0; if (SessionId == 0) return SA_ERR_HPI_INVALID_SESSION; err = oh_get_connx(SessionId, &dsid, &pinst, &did); if (err) return err; cHpiMarshal *hm = HpiMarshalFind(eFsaHpiFumiSourceInfoValidateStart); pinst->MessageHeaderInit(eMhMsg, 0, eFsaHpiFumiSourceInfoValidateStart, hm->m_request_len); request = malloc(hm->m_request_len); pinst->header.m_len = HpiMarshalRequest4(hm, request, &dsid, &ResourceId, &FumiNum, &BankNum); SendRecv(SessionId, cmd); int mr = HpiDemarshalReply0(pinst->header.m_flags & dMhEndianBit, hm, reply + sizeof(cMessageHeader), &err); if (request) free(request); if (pinst->header.m_type == eMhError) return SA_ERR_HPI_INVALID_PARAMS; if (mr < 0) return SA_ERR_HPI_INVALID_PARAMS; return err; } SaErrorT SAHPI_API saHpiFumiSourceInfoGet ( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId, SAHPI_IN SaHpiFumiNumT FumiNum, SAHPI_IN SaHpiBankNumT BankNum, SAHPI_OUT SaHpiFumiSourceInfoT *SourceInfo) { void *request; char reply[dMaxMessageLength]; SaErrorT err = SA_OK; char cmd[] = "saHpiFumiSourceInfoGet"; pcstrmsock pinst; SaHpiSessionIdT dsid = 0; SaHpiDomainIdT did = 0; if (SessionId == 0) return SA_ERR_HPI_INVALID_SESSION; err = oh_get_connx(SessionId, &dsid, &pinst, &did); if (err) return err; if (SourceInfo == NULL) return SA_ERR_HPI_INVALID_PARAMS; cHpiMarshal *hm = HpiMarshalFind(eFsaHpiFumiSourceInfoGet); pinst->MessageHeaderInit(eMhMsg, 0, eFsaHpiFumiSourceInfoGet, hm->m_request_len); request = malloc(hm->m_request_len); pinst->header.m_len = HpiMarshalRequest4(hm, request, &dsid, &ResourceId, &FumiNum, &BankNum); SendRecv(SessionId, cmd); int mr = HpiDemarshalReply1(pinst->header.m_flags & dMhEndianBit, hm, reply + sizeof(cMessageHeader), &err, SourceInfo); if (request) free(request); if (pinst->header.m_type == eMhError) return SA_ERR_HPI_INVALID_PARAMS; if (mr < 0) return SA_ERR_HPI_INVALID_PARAMS; return err; } SaErrorT SAHPI_API saHpiFumiSourceComponentInfoGet( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId, SAHPI_IN SaHpiFumiNumT FumiNum, SAHPI_IN SaHpiBankNumT BankNum, SAHPI_IN SaHpiEntryIdT ComponentEntryId, SAHPI_OUT SaHpiEntryIdT *NextComponentEntryId, SAHPI_OUT SaHpiFumiComponentInfoT *ComponentInfo) { void *request; char reply[dMaxMessageLength]; SaErrorT err = SA_OK; char cmd[] = "saHpiFumiSourceComponentInfoGet"; pcstrmsock pinst; SaHpiDomainIdT dsid = 0; SaHpiDomainIdT did = 0; if (SessionId == 0) return SA_ERR_HPI_INVALID_SESSION; err = oh_get_connx(SessionId, &dsid, &pinst, &did); if (err) return err; if (NextComponentEntryId == NULL || ComponentInfo == NULL) return SA_ERR_HPI_INVALID_PARAMS; if (ComponentEntryId == SAHPI_LAST_ENTRY ) return SA_ERR_HPI_INVALID_PARAMS; cHpiMarshal *hm = HpiMarshalFind(eFsaHpiFumiSourceComponentInfoGet); pinst->MessageHeaderInit(eMhMsg, 0, eFsaHpiFumiSourceComponentInfoGet, hm->m_request_len); request = malloc(hm->m_request_len); pinst->header.m_len = HpiMarshalRequest5(hm, request, &dsid, &ResourceId, &FumiNum, &BankNum, &ComponentEntryId); SendRecv(SessionId, cmd); int mr = HpiDemarshalReply2(pinst->header.m_flags & dMhEndianBit, hm, reply + sizeof(cMessageHeader), &err, NextComponentEntryId, ComponentInfo); if (request) free(request); if (pinst->header.m_type == eMhError) return SA_ERR_HPI_INVALID_PARAMS; if (mr < 0) return SA_ERR_HPI_INVALID_PARAMS; return err; } SaErrorT SAHPI_API saHpiFumiTargetInfoGet ( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId, SAHPI_IN SaHpiFumiNumT FumiNum, SAHPI_IN SaHpiBankNumT BankNum, SAHPI_OUT SaHpiFumiBankInfoT *BankInfo) { void *request; char reply[dMaxMessageLength]; SaErrorT err = SA_OK; char cmd[] = "saHpiFumiTargetInfoGet"; pcstrmsock pinst; SaHpiSessionIdT dsid = 0; SaHpiDomainIdT did = 0; if (SessionId == 0) return SA_ERR_HPI_INVALID_SESSION; err = oh_get_connx(SessionId, &dsid, &pinst, &did); if (err) return err; if (BankInfo == NULL) return SA_ERR_HPI_INVALID_PARAMS; cHpiMarshal *hm = HpiMarshalFind(eFsaHpiFumiTargetInfoGet); pinst->MessageHeaderInit(eMhMsg, 0, eFsaHpiFumiTargetInfoGet, hm->m_request_len); request = malloc(hm->m_request_len); pinst->header.m_len = HpiMarshalRequest4(hm, request, &dsid, &ResourceId, &FumiNum, &BankNum); SendRecv(SessionId, cmd); int mr = HpiDemarshalReply1(pinst->header.m_flags & dMhEndianBit, hm, reply + sizeof(cMessageHeader), &err, BankInfo); if (request) free(request); if (pinst->header.m_type == eMhError) return SA_ERR_HPI_INVALID_PARAMS; if (mr < 0) return SA_ERR_HPI_INVALID_PARAMS; return err; } SaErrorT SAHPI_API saHpiFumiTargetComponentInfoGet( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId, SAHPI_IN SaHpiFumiNumT FumiNum, SAHPI_IN SaHpiBankNumT BankNum, SAHPI_IN SaHpiEntryIdT ComponentEntryId, SAHPI_OUT SaHpiEntryIdT *NextComponentEntryId, SAHPI_OUT SaHpiFumiComponentInfoT *ComponentInfo) { void *request; char reply[dMaxMessageLength]; SaErrorT err = SA_OK; char cmd[] = "saHpiFumiTargetComponentInfoGet"; pcstrmsock pinst; SaHpiDomainIdT dsid = 0; SaHpiDomainIdT did = 0; if (SessionId == 0) return SA_ERR_HPI_INVALID_SESSION; err = oh_get_connx(SessionId, &dsid, &pinst, &did); if (err) return err; if (NextComponentEntryId == NULL || ComponentInfo == NULL) return SA_ERR_HPI_INVALID_PARAMS; if (ComponentEntryId == SAHPI_LAST_ENTRY ) return SA_ERR_HPI_INVALID_PARAMS; cHpiMarshal *hm = HpiMarshalFind(eFsaHpiFumiTargetComponentInfoGet); pinst->MessageHeaderInit(eMhMsg, 0, eFsaHpiFumiTargetComponentInfoGet, hm->m_request_len); request = malloc(hm->m_request_len); pinst->header.m_len = HpiMarshalRequest5(hm, request, &dsid, &ResourceId, &FumiNum, &BankNum, &ComponentEntryId); SendRecv(SessionId, cmd); int mr = HpiDemarshalReply2(pinst->header.m_flags & dMhEndianBit, hm, reply + sizeof(cMessageHeader), &err, NextComponentEntryId, ComponentInfo); if (request) free(request); if (pinst->header.m_type == eMhError) return SA_ERR_HPI_INVALID_PARAMS; if (mr < 0) return SA_ERR_HPI_INVALID_PARAMS; return err; } SaErrorT SAHPI_API saHpiFumiLogicalTargetInfoGet( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId, SAHPI_IN SaHpiFumiNumT FumiNum, SAHPI_OUT SaHpiFumiLogicalBankInfoT *BankInfo) { void *request; char reply[dMaxMessageLength]; SaErrorT err = SA_OK; char cmd[] = "saHpiFumiLogicalTargetInfoGet"; pcstrmsock pinst; SaHpiDomainIdT dsid = 0; SaHpiDomainIdT did = 0; if (SessionId == 0) return SA_ERR_HPI_INVALID_SESSION; err = oh_get_connx(SessionId, &dsid, &pinst, &did); if (err) return err; if (BankInfo == NULL) return SA_ERR_HPI_INVALID_PARAMS; cHpiMarshal *hm = HpiMarshalFind(eFsaHpiFumiLogicalTargetInfoGet); pinst->MessageHeaderInit(eMhMsg, 0, eFsaHpiFumiLogicalTargetInfoGet, hm->m_request_len); request = malloc(hm->m_request_len); pinst->header.m_len = HpiMarshalRequest3(hm, request, &dsid, &ResourceId, &FumiNum); SendRecv(SessionId, cmd); int mr = HpiDemarshalReply1(pinst->header.m_flags & dMhEndianBit, hm, reply + sizeof(cMessageHeader), &err, BankInfo); if (request) free(request); if (pinst->header.m_type == eMhError) return SA_ERR_HPI_INVALID_PARAMS; if (mr < 0) return SA_ERR_HPI_INVALID_PARAMS; return err; } SaErrorT SAHPI_API saHpiFumiLogicalTargetComponentInfoGet( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId, SAHPI_IN SaHpiFumiNumT FumiNum, SAHPI_IN SaHpiEntryIdT ComponentEntryId, SAHPI_OUT SaHpiEntryIdT *NextComponentEntryId, SAHPI_OUT SaHpiFumiLogicalComponentInfoT *ComponentInfo) { void *request; char reply[dMaxMessageLength]; SaErrorT err = SA_OK; char cmd[] = "saHpiFumiLogicalTargetComponentInfoGet"; pcstrmsock pinst; SaHpiDomainIdT dsid = 0; SaHpiDomainIdT did = 0; if (SessionId == 0) return SA_ERR_HPI_INVALID_SESSION; err = oh_get_connx(SessionId, &dsid, &pinst, &did); if (err) return err; if (NextComponentEntryId == NULL || ComponentInfo == NULL) return SA_ERR_HPI_INVALID_PARAMS; if (ComponentEntryId == SAHPI_LAST_ENTRY ) return SA_ERR_HPI_INVALID_PARAMS; cHpiMarshal *hm = HpiMarshalFind(eFsaHpiFumiLogicalTargetComponentInfoGet); pinst->MessageHeaderInit(eMhMsg, 0, eFsaHpiFumiLogicalTargetComponentInfoGet, hm->m_request_len); request = malloc(hm->m_request_len); pinst->header.m_len = HpiMarshalRequest4(hm, request, &dsid, &ResourceId, &FumiNum, &ComponentEntryId); SendRecv(SessionId, cmd); int mr = HpiDemarshalReply2(pinst->header.m_flags & dMhEndianBit, hm, reply + sizeof(cMessageHeader), &err, NextComponentEntryId, ComponentInfo); if (request) free(request); if (pinst->header.m_type == eMhError) return SA_ERR_HPI_INVALID_PARAMS; if (mr < 0) return SA_ERR_HPI_INVALID_PARAMS; return err; } SaErrorT SAHPI_API saHpiFumiBackupStart( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId, SAHPI_IN SaHpiFumiNumT FumiNum) { void *request; char reply[dMaxMessageLength]; SaErrorT err = SA_OK; char cmd[] = "saHpiFumiBackupStart"; pcstrmsock pinst; SaHpiSessionIdT dsid = 0; SaHpiDomainIdT did = 0; if (SessionId == 0) return SA_ERR_HPI_INVALID_SESSION; err = oh_get_connx(SessionId, &dsid, &pinst, &did); if (err) return err; cHpiMarshal *hm = HpiMarshalFind(eFsaHpiFumiBackupStart); pinst->MessageHeaderInit(eMhMsg, 0, eFsaHpiFumiBackupStart, hm->m_request_len); request = malloc(hm->m_request_len); pinst->header.m_len = HpiMarshalRequest3(hm, request, &dsid, &ResourceId, &FumiNum); SendRecv(SessionId, cmd); int mr = HpiDemarshalReply0(pinst->header.m_flags & dMhEndianBit, hm, reply + sizeof(cMessageHeader), &err); if (request) free(request); if (pinst->header.m_type == eMhError) return SA_ERR_HPI_INVALID_PARAMS; if (mr < 0) return SA_ERR_HPI_INVALID_PARAMS; return err; } SaErrorT SAHPI_API saHpiFumiBankBootOrderSet ( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId, SAHPI_IN SaHpiFumiNumT FumiNum, SAHPI_IN SaHpiBankNumT BankNum, SAHPI_IN SaHpiUint32T Position) { void *request; char reply[dMaxMessageLength]; SaErrorT err = SA_OK; char cmd[] = "saHpiFumiBankBootOrderSet"; pcstrmsock pinst; SaHpiSessionIdT dsid = 0; SaHpiDomainIdT did = 0; if (SessionId == 0) return SA_ERR_HPI_INVALID_SESSION; err = oh_get_connx(SessionId, &dsid, &pinst, &did); if (err) return err; cHpiMarshal *hm = HpiMarshalFind(eFsaHpiFumiBankBootOrderSet); pinst->MessageHeaderInit(eMhMsg, 0, eFsaHpiFumiBankBootOrderSet, hm->m_request_len); request = malloc(hm->m_request_len); pinst->header.m_len = HpiMarshalRequest5(hm, request, &dsid, &ResourceId, &FumiNum, &BankNum, &Position); SendRecv(SessionId, cmd); int mr = HpiDemarshalReply0(pinst->header.m_flags & dMhEndianBit, hm, reply + sizeof(cMessageHeader), &err); if (request) free(request); if (pinst->header.m_type == eMhError) return SA_ERR_HPI_INVALID_PARAMS; if (mr < 0) return SA_ERR_HPI_INVALID_PARAMS; return err; } SaErrorT SAHPI_API saHpiFumiBankCopyStart( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId, SAHPI_IN SaHpiFumiNumT FumiNum, SAHPI_IN SaHpiBankNumT SourceBankNum, SAHPI_IN SaHpiBankNumT TargetBankNum) { void *request; char reply[dMaxMessageLength]; SaErrorT err = SA_OK; char cmd[] = "saHpiFumiBankCopyStart"; pcstrmsock pinst; SaHpiSessionIdT dsid = 0; SaHpiDomainIdT did = 0; if (SessionId == 0) return SA_ERR_HPI_INVALID_SESSION; err = oh_get_connx(SessionId, &dsid, &pinst, &did); if (err) return err; cHpiMarshal *hm = HpiMarshalFind(eFsaHpiFumiBankCopyStart); pinst->MessageHeaderInit(eMhMsg, 0, eFsaHpiFumiBankCopyStart, hm->m_request_len); request = malloc(hm->m_request_len); pinst->header.m_len = HpiMarshalRequest5(hm, request, &dsid, &ResourceId, &FumiNum, &SourceBankNum, &TargetBankNum); SendRecv(SessionId, cmd); int mr = HpiDemarshalReply0(pinst->header.m_flags & dMhEndianBit, hm, reply + sizeof(cMessageHeader), &err); if (request) free(request); if (pinst->header.m_type == eMhError) return SA_ERR_HPI_INVALID_PARAMS; if (mr < 0) return SA_ERR_HPI_INVALID_PARAMS; return err; } SaErrorT SAHPI_API saHpiFumiInstallStart ( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId, SAHPI_IN SaHpiFumiNumT FumiNum, SAHPI_IN SaHpiBankNumT BankNum) { void *request; char reply[dMaxMessageLength]; SaErrorT err = SA_OK; char cmd[] = "saHpiFumiInstallStart"; pcstrmsock pinst; SaHpiSessionIdT dsid = 0; SaHpiDomainIdT did = 0; if (SessionId == 0) return SA_ERR_HPI_INVALID_SESSION; err = oh_get_connx(SessionId, &dsid, &pinst, &did); if (err) return err; cHpiMarshal *hm = HpiMarshalFind(eFsaHpiFumiInstallStart); pinst->MessageHeaderInit(eMhMsg, 0, eFsaHpiFumiInstallStart, hm->m_request_len); request = malloc(hm->m_request_len); pinst->header.m_len = HpiMarshalRequest4(hm, request, &dsid, &ResourceId, &FumiNum, &BankNum); SendRecv(SessionId, cmd); int mr = HpiDemarshalReply0(pinst->header.m_flags & dMhEndianBit, hm, reply + sizeof(cMessageHeader), &err); if (request) free(request); if (pinst->header.m_type == eMhError) return SA_ERR_HPI_INVALID_PARAMS; if (mr < 0) return SA_ERR_HPI_INVALID_PARAMS; return err; } SaErrorT SAHPI_API saHpiFumiUpgradeStatusGet ( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId, SAHPI_IN SaHpiFumiNumT FumiNum, SAHPI_IN SaHpiBankNumT BankNum, SAHPI_OUT SaHpiFumiUpgradeStatusT *UpgradeStatus) { void *request; char reply[dMaxMessageLength]; SaErrorT err = SA_OK; char cmd[] = "saHpiFumiUpgradeStatusGet"; pcstrmsock pinst; SaHpiSessionIdT dsid = 0; SaHpiDomainIdT did = 0; if (SessionId == 0) return SA_ERR_HPI_INVALID_SESSION; err = oh_get_connx(SessionId, &dsid, &pinst, &did); if (err) return err; if (UpgradeStatus == NULL) return SA_ERR_HPI_INVALID_PARAMS; cHpiMarshal *hm = HpiMarshalFind(eFsaHpiFumiUpgradeStatusGet); pinst->MessageHeaderInit(eMhMsg, 0, eFsaHpiFumiUpgradeStatusGet, hm->m_request_len); request = malloc(hm->m_request_len); pinst->header.m_len = HpiMarshalRequest4(hm, request, &dsid, &ResourceId, &FumiNum, &BankNum); SendRecv(SessionId, cmd); int mr = HpiDemarshalReply1(pinst->header.m_flags & dMhEndianBit, hm, reply + sizeof(cMessageHeader), &err, UpgradeStatus); if (request) free(request); if (pinst->header.m_type == eMhError) return SA_ERR_HPI_INVALID_PARAMS; if (mr < 0) return SA_ERR_HPI_INVALID_PARAMS; return err; } SaErrorT SAHPI_API saHpiFumiTargetVerifyStart ( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId, SAHPI_IN SaHpiFumiNumT FumiNum, SAHPI_IN SaHpiBankNumT BankNum) { void *request; char reply[dMaxMessageLength]; SaErrorT err = SA_OK; char cmd[] = "saHpiFumiTargetVerifyStart"; pcstrmsock pinst; SaHpiSessionIdT dsid = 0; SaHpiDomainIdT did = 0; if (SessionId == 0) return SA_ERR_HPI_INVALID_SESSION; err = oh_get_connx(SessionId, &dsid, &pinst, &did); if (err) return err; cHpiMarshal *hm = HpiMarshalFind(eFsaHpiFumiTargetVerifyStart); pinst->MessageHeaderInit(eMhMsg, 0, eFsaHpiFumiTargetVerifyStart, hm->m_request_len); request = malloc(hm->m_request_len); pinst->header.m_len = HpiMarshalRequest4(hm, request, &dsid, &ResourceId, &FumiNum, &BankNum); SendRecv(SessionId, cmd); int mr = HpiDemarshalReply0(pinst->header.m_flags & dMhEndianBit, hm, reply + sizeof(cMessageHeader), &err); if (request) free(request); if (pinst->header.m_type == eMhError) return SA_ERR_HPI_INVALID_PARAMS; if (mr < 0) return SA_ERR_HPI_INVALID_PARAMS; return err; } SaErrorT SAHPI_API saHpiFumiTargetVerifyMainStart( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId, SAHPI_IN SaHpiFumiNumT FumiNum) { void *request; char reply[dMaxMessageLength]; SaErrorT err = SA_OK; char cmd[] = "saHpiFumiTargetVerifyMainStart"; pcstrmsock pinst; SaHpiDomainIdT dsid = 0; SaHpiDomainIdT did = 0; if (SessionId == 0) return SA_ERR_HPI_INVALID_SESSION; err = oh_get_connx(SessionId, &dsid, &pinst, &did); if (err) return err; cHpiMarshal *hm = HpiMarshalFind(eFsaHpiFumiTargetVerifyMainStart); pinst->MessageHeaderInit(eMhMsg, 0, eFsaHpiFumiTargetVerifyMainStart, hm->m_request_len); request = malloc(hm->m_request_len); pinst->header.m_len = HpiMarshalRequest3(hm, request, &dsid, &ResourceId, &FumiNum ); SendRecv(SessionId, cmd); int mr = HpiDemarshalReply0(pinst->header.m_flags & dMhEndianBit, hm, reply + sizeof(cMessageHeader), &err); if (request) free(request); if (pinst->header.m_type == eMhError) return SA_ERR_HPI_INVALID_PARAMS; if (mr < 0) return SA_ERR_HPI_INVALID_PARAMS; return err; } SaErrorT SAHPI_API saHpiFumiUpgradeCancel ( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId, SAHPI_IN SaHpiFumiNumT FumiNum, SAHPI_IN SaHpiBankNumT BankNum) { void *request; char reply[dMaxMessageLength]; SaErrorT err = SA_OK; char cmd[] = "saHpiFumiUpgradeCancel"; pcstrmsock pinst; SaHpiSessionIdT dsid = 0; SaHpiDomainIdT did = 0; if (SessionId == 0) return SA_ERR_HPI_INVALID_SESSION; err = oh_get_connx(SessionId, &dsid, &pinst, &did); if (err) return err; cHpiMarshal *hm = HpiMarshalFind(eFsaHpiFumiUpgradeCancel); pinst->MessageHeaderInit(eMhMsg, 0, eFsaHpiFumiUpgradeCancel, hm->m_request_len); request = malloc(hm->m_request_len); pinst->header.m_len = HpiMarshalRequest4(hm, request, &dsid, &ResourceId, &FumiNum, &BankNum); SendRecv(SessionId, cmd); int mr = HpiDemarshalReply0(pinst->header.m_flags & dMhEndianBit, hm, reply + sizeof(cMessageHeader), &err); if (request) free(request); if (pinst->header.m_type == eMhError) return SA_ERR_HPI_INVALID_PARAMS; if (mr < 0) return SA_ERR_HPI_INVALID_PARAMS; return err; } SaErrorT SAHPI_API saHpiFumiAutoRollbackDisableGet( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId, SAHPI_IN SaHpiFumiNumT FumiNum, SAHPI_OUT SaHpiBoolT *Disable) { void *request; char reply[dMaxMessageLength]; SaErrorT err = SA_OK; char cmd[] = "saHpiFumiAutoRollbackDisableGet"; pcstrmsock pinst; SaHpiDomainIdT dsid = 0; SaHpiDomainIdT did = 0; if (SessionId == 0) return SA_ERR_HPI_INVALID_SESSION; err = oh_get_connx(SessionId, &dsid, &pinst, &did); if (err) return err; if (Disable == NULL) return SA_ERR_HPI_INVALID_PARAMS; cHpiMarshal *hm = HpiMarshalFind(eFsaHpiFumiAutoRollbackDisableGet); pinst->MessageHeaderInit(eMhMsg, 0, eFsaHpiFumiAutoRollbackDisableGet, hm->m_request_len); request = malloc(hm->m_request_len); pinst->header.m_len = HpiMarshalRequest3(hm, request, &dsid, &ResourceId, &FumiNum ); SendRecv(SessionId, cmd); int mr = HpiDemarshalReply1(pinst->header.m_flags & dMhEndianBit, hm, reply + sizeof(cMessageHeader), &err, Disable); if (request) free(request); if (pinst->header.m_type == eMhError) return SA_ERR_HPI_INVALID_PARAMS; if (mr < 0) return SA_ERR_HPI_INVALID_PARAMS; return err; } SaErrorT SAHPI_API saHpiFumiAutoRollbackDisableSet( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId, SAHPI_IN SaHpiFumiNumT FumiNum, SAHPI_IN SaHpiBoolT Disable) { void *request; char reply[dMaxMessageLength]; SaErrorT err = SA_OK; char cmd[] = "saHpiFumiAutoRollbackDisableSet"; pcstrmsock pinst; SaHpiDomainIdT dsid = 0; SaHpiDomainIdT did = 0; if (SessionId == 0) return SA_ERR_HPI_INVALID_SESSION; err = oh_get_connx(SessionId, &dsid, &pinst, &did); if (err) return err; cHpiMarshal *hm = HpiMarshalFind(eFsaHpiFumiAutoRollbackDisableSet); pinst->MessageHeaderInit(eMhMsg, 0, eFsaHpiFumiAutoRollbackDisableSet, hm->m_request_len); request = malloc(hm->m_request_len); pinst->header.m_len = HpiMarshalRequest4(hm, request, &dsid, &ResourceId, &FumiNum, &Disable ); SendRecv(SessionId, cmd); int mr = HpiDemarshalReply0(pinst->header.m_flags & dMhEndianBit, hm, reply + sizeof(cMessageHeader), &err); if (request) free(request); if (pinst->header.m_type == eMhError) return SA_ERR_HPI_INVALID_PARAMS; if (mr < 0) return SA_ERR_HPI_INVALID_PARAMS; return err; } SaErrorT SAHPI_API saHpiFumiRollbackStart ( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId, SAHPI_IN SaHpiFumiNumT FumiNum) { void *request; char reply[dMaxMessageLength]; SaErrorT err = SA_OK; char cmd[] = "saHpiFumiRollbackStart"; pcstrmsock pinst; SaHpiSessionIdT dsid = 0; SaHpiDomainIdT did = 0; if (SessionId == 0) return SA_ERR_HPI_INVALID_SESSION; err = oh_get_connx(SessionId, &dsid, &pinst, &did); if (err) return err; cHpiMarshal *hm = HpiMarshalFind(eFsaHpiFumiRollbackStart); pinst->MessageHeaderInit(eMhMsg, 0, eFsaHpiFumiRollbackStart, hm->m_request_len); request = malloc(hm->m_request_len); pinst->header.m_len = HpiMarshalRequest3(hm, request, &dsid, &ResourceId, &FumiNum); SendRecv(SessionId, cmd); int mr = HpiDemarshalReply0(pinst->header.m_flags & dMhEndianBit, hm, reply + sizeof(cMessageHeader), &err); if (request) free(request); if (pinst->header.m_type == eMhError) return SA_ERR_HPI_INVALID_PARAMS; if (mr < 0) return SA_ERR_HPI_INVALID_PARAMS; return err; } SaErrorT SAHPI_API saHpiFumiActivate ( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId, SAHPI_IN SaHpiFumiNumT FumiNum) { void *request; char reply[dMaxMessageLength]; SaErrorT err = SA_OK; char cmd[] = "saHpiFumiActivate"; pcstrmsock pinst; SaHpiSessionIdT dsid = 0; SaHpiDomainIdT did = 0; if (SessionId == 0) return SA_ERR_HPI_INVALID_SESSION; err = oh_get_connx(SessionId, &dsid, &pinst, &did); if (err) return err; cHpiMarshal *hm = HpiMarshalFind(eFsaHpiFumiActivate); pinst->MessageHeaderInit(eMhMsg, 0, eFsaHpiFumiActivate, hm->m_request_len); request = malloc(hm->m_request_len); pinst->header.m_len = HpiMarshalRequest3(hm, request, &dsid, &ResourceId, &FumiNum); SendRecv(SessionId, cmd); int mr = HpiDemarshalReply0(pinst->header.m_flags & dMhEndianBit, hm, reply + sizeof(cMessageHeader), &err); if (request) free(request); if (pinst->header.m_type == eMhError) return SA_ERR_HPI_INVALID_PARAMS; if (mr < 0) return SA_ERR_HPI_INVALID_PARAMS; return err; } SaErrorT SAHPI_API saHpiFumiActivateStart( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId, SAHPI_IN SaHpiFumiNumT FumiNum, SAHPI_IN SaHpiBoolT Logical) { void *request; char reply[dMaxMessageLength]; SaErrorT err = SA_OK; char cmd[] = "saHpiFumiActivateStart"; pcstrmsock pinst; SaHpiDomainIdT dsid = 0; SaHpiDomainIdT did = 0; if (SessionId == 0) return SA_ERR_HPI_INVALID_SESSION; err = oh_get_connx(SessionId, &dsid, &pinst, &did); if (err) return err; cHpiMarshal *hm = HpiMarshalFind(eFsaHpiFumiActivateStart); pinst->MessageHeaderInit(eMhMsg, 0, eFsaHpiFumiActivateStart, hm->m_request_len); request = malloc(hm->m_request_len); pinst->header.m_len = HpiMarshalRequest4(hm, request, &dsid, &ResourceId, &FumiNum, &Logical); SendRecv(SessionId, cmd); int mr = HpiDemarshalReply0(pinst->header.m_flags & dMhEndianBit, hm, reply + sizeof(cMessageHeader), &err); if (request) free(request); if (pinst->header.m_type == eMhError) return SA_ERR_HPI_INVALID_PARAMS; if (mr < 0) return SA_ERR_HPI_INVALID_PARAMS; return err; } SaErrorT SAHPI_API saHpiFumiCleanup( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId, SAHPI_IN SaHpiFumiNumT FumiNum, SAHPI_IN SaHpiBankNumT BankNum) { void *request; char reply[dMaxMessageLength]; SaErrorT err = SA_OK; char cmd[] = "saHpiFumiCleanup"; pcstrmsock pinst; SaHpiDomainIdT dsid = 0; SaHpiDomainIdT did = 0; if (SessionId == 0) return SA_ERR_HPI_INVALID_SESSION; err = oh_get_connx(SessionId, &dsid, &pinst, &did); if (err) return err; cHpiMarshal *hm = HpiMarshalFind(eFsaHpiFumiCleanup); pinst->MessageHeaderInit(eMhMsg, 0, eFsaHpiFumiCleanup, hm->m_request_len); request = malloc(hm->m_request_len); pinst->header.m_len = HpiMarshalRequest4(hm, request, &dsid, &ResourceId, &FumiNum, &BankNum); SendRecv(SessionId, cmd); int mr = HpiDemarshalReply0(pinst->header.m_flags & dMhEndianBit, hm, reply + sizeof(cMessageHeader), &err); if (request) free(request); if (pinst->header.m_type == eMhError) return SA_ERR_HPI_INVALID_PARAMS; if (mr < 0) return SA_ERR_HPI_INVALID_PARAMS; return err; } /*----------------------------------------------------------------------------*/ /* saHpiHotSwapPolicyCancel */ /*----------------------------------------------------------------------------*/ SaErrorT SAHPI_API saHpiHotSwapPolicyCancel( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId) { void *request; char reply[dMaxMessageLength]; SaErrorT err = SA_OK; char cmd[] = "saHpiHotSwapPolicyCancel"; pcstrmsock pinst; SaHpiSessionIdT dsid = 0; SaHpiDomainIdT did = 0; if (SessionId == 0) return SA_ERR_HPI_INVALID_SESSION; err = oh_get_connx(SessionId, &dsid, &pinst, &did); if (err) return err; cHpiMarshal *hm = HpiMarshalFind(eFsaHpiHotSwapPolicyCancel); pinst->MessageHeaderInit(eMhMsg, 0, eFsaHpiHotSwapPolicyCancel, hm->m_request_len); request = malloc(hm->m_request_len); pinst->header.m_len = HpiMarshalRequest2(hm, request, &dsid, &ResourceId); SendRecv(SessionId, cmd); int mr = HpiDemarshalReply0(pinst->header.m_flags & dMhEndianBit, hm, reply + sizeof(cMessageHeader), &err); if (request) free(request); if (pinst->header.m_type == eMhError) return SA_ERR_HPI_INVALID_PARAMS; if (mr < 0) return SA_ERR_HPI_INVALID_PARAMS; return err; } /*----------------------------------------------------------------------------*/ /* saHpiResourceActiveSet */ /*----------------------------------------------------------------------------*/ SaErrorT SAHPI_API saHpiResourceActiveSet( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId) { void *request; char reply[dMaxMessageLength]; SaErrorT err = SA_OK; char cmd[] = "saHpiResourceActiveSet"; pcstrmsock pinst; SaHpiSessionIdT dsid = 0; SaHpiDomainIdT did = 0; if (SessionId == 0) return SA_ERR_HPI_INVALID_SESSION; err = oh_get_connx(SessionId, &dsid, &pinst, &did); if (err) return err; cHpiMarshal *hm = HpiMarshalFind(eFsaHpiResourceActiveSet); pinst->MessageHeaderInit(eMhMsg, 0, eFsaHpiResourceActiveSet, hm->m_request_len); request = malloc(hm->m_request_len); pinst->header.m_len = HpiMarshalRequest2(hm, request, &dsid, &ResourceId); SendRecv(SessionId, cmd); int mr = HpiDemarshalReply0(pinst->header.m_flags & dMhEndianBit, hm, reply + sizeof(cMessageHeader), &err); if (request) free(request); if (pinst->header.m_type == eMhError) return SA_ERR_HPI_INVALID_PARAMS; if (mr < 0) return SA_ERR_HPI_INVALID_PARAMS; return err; } /*----------------------------------------------------------------------------*/ /* saHpiResourceInactiveSet */ /*----------------------------------------------------------------------------*/ SaErrorT SAHPI_API saHpiResourceInactiveSet( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId) { void *request; char reply[dMaxMessageLength]; SaErrorT err = SA_OK; char cmd[] = "saHpiResourceInactiveSet"; pcstrmsock pinst; SaHpiSessionIdT dsid = 0; SaHpiDomainIdT did = 0; if (SessionId == 0) return SA_ERR_HPI_INVALID_SESSION; err = oh_get_connx(SessionId, &dsid, &pinst, &did); if (err) return err; cHpiMarshal *hm = HpiMarshalFind(eFsaHpiResourceInactiveSet); pinst->MessageHeaderInit(eMhMsg, 0, eFsaHpiResourceInactiveSet, hm->m_request_len); request = malloc(hm->m_request_len); pinst->header.m_len = HpiMarshalRequest2(hm, request, &dsid, &ResourceId); SendRecv(SessionId, cmd); int mr = HpiDemarshalReply0(pinst->header.m_flags & dMhEndianBit, hm, reply + sizeof(cMessageHeader), &err); if (request) free(request); if (pinst->header.m_type == eMhError) return SA_ERR_HPI_INVALID_PARAMS; if (mr < 0) return SA_ERR_HPI_INVALID_PARAMS; return err; } /*----------------------------------------------------------------------------*/ /* saHpiAutoInsertTimeoutGet */ /*----------------------------------------------------------------------------*/ SaErrorT SAHPI_API saHpiAutoInsertTimeoutGet( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_OUT SaHpiTimeoutT *Timeout) { void *request; char reply[dMaxMessageLength]; SaErrorT err = SA_OK; char cmd[] = "saHpiAutoInsertTimeoutGet"; pcstrmsock pinst; SaHpiSessionIdT dsid = 0; SaHpiDomainIdT did = 0; if (SessionId == 0) return SA_ERR_HPI_INVALID_SESSION; err = oh_get_connx(SessionId, &dsid, &pinst, &did); if (err) return err; if (Timeout == NULL) return SA_ERR_HPI_INVALID_PARAMS; cHpiMarshal *hm = HpiMarshalFind(eFsaHpiAutoInsertTimeoutGet); pinst->MessageHeaderInit(eMhMsg, 0, eFsaHpiAutoInsertTimeoutGet, hm->m_request_len); request = malloc(hm->m_request_len); pinst->header.m_len = HpiMarshalRequest1(hm, request, &dsid); SendRecv(SessionId, cmd); int mr = HpiDemarshalReply1(pinst->header.m_flags & dMhEndianBit, hm, reply + sizeof(cMessageHeader), &err, Timeout); if (request) free(request); if (pinst->header.m_type == eMhError) return SA_ERR_HPI_INVALID_PARAMS; if (mr < 0) return SA_ERR_HPI_INVALID_PARAMS; return err; } /*----------------------------------------------------------------------------*/ /* saHpiAutoInsertTimeoutSet */ /*----------------------------------------------------------------------------*/ SaErrorT SAHPI_API saHpiAutoInsertTimeoutSet( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiTimeoutT Timeout) { void *request; char reply[dMaxMessageLength]; SaErrorT err = SA_OK; char cmd[] = "saHpiAutoInsertTimeoutSet"; pcstrmsock pinst; SaHpiSessionIdT dsid = 0; SaHpiDomainIdT did = 0; if (SessionId == 0) return SA_ERR_HPI_INVALID_SESSION; err = oh_get_connx(SessionId, &dsid, &pinst, &did); if (err) return err; if (Timeout != SAHPI_TIMEOUT_IMMEDIATE && Timeout != SAHPI_TIMEOUT_BLOCK && Timeout < 0) return SA_ERR_HPI_INVALID_PARAMS; cHpiMarshal *hm = HpiMarshalFind(eFsaHpiAutoInsertTimeoutSet); pinst->MessageHeaderInit(eMhMsg, 0, eFsaHpiAutoInsertTimeoutSet, hm->m_request_len); request = malloc(hm->m_request_len); pinst->header.m_len = HpiMarshalRequest2(hm, request, &dsid, &Timeout); SendRecv(SessionId, cmd); int mr = HpiDemarshalReply0(pinst->header.m_flags & dMhEndianBit, hm, reply + sizeof(cMessageHeader), &err); if (request) free(request); if (pinst->header.m_type == eMhError) return SA_ERR_HPI_INVALID_PARAMS; if (mr < 0) return SA_ERR_HPI_INVALID_PARAMS; return err; } /*----------------------------------------------------------------------------*/ /* saHpiAutoExtractGet */ /*----------------------------------------------------------------------------*/ SaErrorT SAHPI_API saHpiAutoExtractTimeoutGet( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId, SAHPI_OUT SaHpiTimeoutT *Timeout) { void *request; char reply[dMaxMessageLength]; SaErrorT err = SA_OK; char cmd[] = "saHpiAutoExtractTimeoutGet"; pcstrmsock pinst; SaHpiSessionIdT dsid = 0; SaHpiDomainIdT did = 0; if (SessionId == 0) return SA_ERR_HPI_INVALID_SESSION; err = oh_get_connx(SessionId, &dsid, &pinst, &did); if (err) return err; if (!Timeout) return SA_ERR_HPI_INVALID_PARAMS; cHpiMarshal *hm = HpiMarshalFind(eFsaHpiAutoExtractTimeoutGet); pinst->MessageHeaderInit(eMhMsg, 0, eFsaHpiAutoExtractTimeoutGet, hm->m_request_len); request = malloc(hm->m_request_len); pinst->header.m_len = HpiMarshalRequest2(hm, request, &dsid, &ResourceId); SendRecv(SessionId, cmd); int mr = HpiDemarshalReply1(pinst->header.m_flags & dMhEndianBit, hm, reply + sizeof(cMessageHeader), &err, Timeout); if (request) free(request); if (pinst->header.m_type == eMhError) return SA_ERR_HPI_INVALID_PARAMS; if (mr < 0) return SA_ERR_HPI_INVALID_PARAMS; return err; } /*----------------------------------------------------------------------------*/ /* saHpiAutoExtractTimeoutSet */ /*----------------------------------------------------------------------------*/ SaErrorT SAHPI_API saHpiAutoExtractTimeoutSet( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId, SAHPI_IN SaHpiTimeoutT Timeout) { void *request; char reply[dMaxMessageLength]; SaErrorT err = SA_OK; char cmd[] = "saHpiAutoExtractTimeoutSet"; pcstrmsock pinst; SaHpiSessionIdT dsid = 0; SaHpiDomainIdT did = 0; if (SessionId == 0) return SA_ERR_HPI_INVALID_SESSION; err = oh_get_connx(SessionId, &dsid, &pinst, &did); if (err) return err; if (Timeout != SAHPI_TIMEOUT_IMMEDIATE && Timeout != SAHPI_TIMEOUT_BLOCK && Timeout < 0) return SA_ERR_HPI_INVALID_PARAMS; cHpiMarshal *hm = HpiMarshalFind(eFsaHpiAutoExtractTimeoutSet); pinst->MessageHeaderInit(eMhMsg, 0, eFsaHpiAutoExtractTimeoutSet, hm->m_request_len); request = malloc(hm->m_request_len); pinst->header.m_len = HpiMarshalRequest3(hm, request, &dsid, &ResourceId, &Timeout); SendRecv(SessionId, cmd); int mr = HpiDemarshalReply0(pinst->header.m_flags & dMhEndianBit, hm, reply + sizeof(cMessageHeader), &err); if (request) free(request); if (pinst->header.m_type == eMhError) return SA_ERR_HPI_INVALID_PARAMS; if (mr < 0) return SA_ERR_HPI_INVALID_PARAMS; return err; } /*----------------------------------------------------------------------------*/ /* saHpiHotSwapStateGet */ /*----------------------------------------------------------------------------*/ SaErrorT SAHPI_API saHpiHotSwapStateGet( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId, SAHPI_OUT SaHpiHsStateT *State) { void *request; char reply[dMaxMessageLength]; SaErrorT err = SA_OK; char cmd[] = "saHpiHotSwapStateGet"; pcstrmsock pinst; SaHpiSessionIdT dsid = 0; SaHpiDomainIdT did = 0; if (SessionId == 0) return SA_ERR_HPI_INVALID_SESSION; err = oh_get_connx(SessionId, &dsid, &pinst, &did); if (err) return err; if (!State) return SA_ERR_HPI_INVALID_PARAMS; cHpiMarshal *hm = HpiMarshalFind(eFsaHpiHotSwapStateGet); pinst->MessageHeaderInit(eMhMsg, 0, eFsaHpiHotSwapStateGet, hm->m_request_len); request = malloc(hm->m_request_len); pinst->header.m_len = HpiMarshalRequest2(hm, request, &dsid, &ResourceId); SendRecv(SessionId, cmd); int mr = HpiDemarshalReply1(pinst->header.m_flags & dMhEndianBit, hm, reply + sizeof(cMessageHeader), &err, State); if (request) free(request); if (pinst->header.m_type == eMhError) return SA_ERR_HPI_INVALID_PARAMS; if (mr < 0) return SA_ERR_HPI_INVALID_PARAMS; return err; } /*----------------------------------------------------------------------------*/ /* saHpiHotSwapActionRequest */ /*----------------------------------------------------------------------------*/ SaErrorT SAHPI_API saHpiHotSwapActionRequest( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId, SAHPI_IN SaHpiHsActionT Action) { void *request; char reply[dMaxMessageLength]; SaErrorT err = SA_OK; char cmd[] = "saHpiHotSwapActionRequest"; pcstrmsock pinst; SaHpiSessionIdT dsid = 0; SaHpiDomainIdT did = 0; if (SessionId == 0) return SA_ERR_HPI_INVALID_SESSION; err = oh_get_connx(SessionId, &dsid, &pinst, &did); if (err) return err; if (!oh_lookup_hsaction(Action)) return SA_ERR_HPI_INVALID_PARAMS; cHpiMarshal *hm = HpiMarshalFind(eFsaHpiHotSwapActionRequest); pinst->MessageHeaderInit(eMhMsg, 0, eFsaHpiHotSwapActionRequest, hm->m_request_len); request = malloc(hm->m_request_len); pinst->header.m_len = HpiMarshalRequest3(hm, request, &dsid, &ResourceId, &Action); SendRecv(SessionId, cmd); int mr = HpiDemarshalReply0(pinst->header.m_flags & dMhEndianBit, hm, reply + sizeof(cMessageHeader), &err); if (request) free(request); if (pinst->header.m_type == eMhError) return SA_ERR_HPI_INVALID_PARAMS; if (mr < 0) return SA_ERR_HPI_INVALID_PARAMS; return err; } /*----------------------------------------------------------------------------*/ /* saHpiHotSwapIndicatorStateGet */ /*----------------------------------------------------------------------------*/ SaErrorT SAHPI_API saHpiHotSwapIndicatorStateGet( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId, SAHPI_OUT SaHpiHsIndicatorStateT *State) { void *request; char reply[dMaxMessageLength]; SaErrorT err = SA_OK; char cmd[] = "saHpiHotSwapIndicatorStateGet"; pcstrmsock pinst; SaHpiSessionIdT dsid = 0; SaHpiDomainIdT did = 0; if (SessionId == 0) return SA_ERR_HPI_INVALID_SESSION; err = oh_get_connx(SessionId, &dsid, &pinst, &did); if (err) return err; if (!State) return SA_ERR_HPI_INVALID_PARAMS; cHpiMarshal *hm = HpiMarshalFind(eFsaHpiHotSwapIndicatorStateGet); pinst->MessageHeaderInit(eMhMsg, 0, eFsaHpiHotSwapIndicatorStateGet, hm->m_request_len); request = malloc(hm->m_request_len); pinst->header.m_len = HpiMarshalRequest2(hm, request, &dsid, &ResourceId); SendRecv(SessionId, cmd); int mr = HpiDemarshalReply1(pinst->header.m_flags & dMhEndianBit, hm, reply + sizeof(cMessageHeader), &err, State); if (request) free(request); if (pinst->header.m_type == eMhError) return SA_ERR_HPI_INVALID_PARAMS; if (mr < 0) return SA_ERR_HPI_INVALID_PARAMS; return err; } /*----------------------------------------------------------------------------*/ /* saHpiHotSwapIndicatorStateSet */ /*----------------------------------------------------------------------------*/ SaErrorT SAHPI_API saHpiHotSwapIndicatorStateSet( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId, SAHPI_IN SaHpiHsIndicatorStateT State) { void *request; char reply[dMaxMessageLength]; SaErrorT err = SA_OK; char cmd[] = "saHpiHotSwapIndicatorStateSet"; pcstrmsock pinst; SaHpiSessionIdT dsid = 0; SaHpiDomainIdT did = 0; if (SessionId == 0) return SA_ERR_HPI_INVALID_SESSION; err = oh_get_connx(SessionId, &dsid, &pinst, &did); if (err) return err; if (!oh_lookup_hsindicatorstate(State)) return SA_ERR_HPI_INVALID_PARAMS; cHpiMarshal *hm = HpiMarshalFind(eFsaHpiHotSwapIndicatorStateSet); pinst->MessageHeaderInit(eMhMsg, 0, eFsaHpiHotSwapIndicatorStateSet, hm->m_request_len); request = malloc(hm->m_request_len); pinst->header.m_len = HpiMarshalRequest3(hm, request, &dsid, &ResourceId, &State); SendRecv(SessionId, cmd); int mr = HpiDemarshalReply0(pinst->header.m_flags & dMhEndianBit, hm, reply + sizeof(cMessageHeader), &err); if (request) free(request); if (pinst->header.m_type == eMhError) return SA_ERR_HPI_INVALID_PARAMS; if (mr < 0) return SA_ERR_HPI_INVALID_PARAMS; return err; } /*----------------------------------------------------------------------------*/ /* saHpiParmControl */ /*----------------------------------------------------------------------------*/ SaErrorT SAHPI_API saHpiParmControl( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId, SAHPI_IN SaHpiParmActionT Action) { void *request; char reply[dMaxMessageLength]; SaErrorT err = SA_OK; char cmd[] = "saHpiParmControl"; pcstrmsock pinst; SaHpiSessionIdT dsid = 0; SaHpiDomainIdT did = 0; if (SessionId == 0) return SA_ERR_HPI_INVALID_SESSION; err = oh_get_connx(SessionId, &dsid, &pinst, &did); if (err) return err; if (!oh_lookup_parmaction(Action)) return SA_ERR_HPI_INVALID_PARAMS; cHpiMarshal *hm = HpiMarshalFind(eFsaHpiParmControl); pinst->MessageHeaderInit(eMhMsg, 0, eFsaHpiParmControl, hm->m_request_len); request = malloc(hm->m_request_len); pinst->header.m_len = HpiMarshalRequest3(hm, request, &dsid, &ResourceId, &Action); SendRecv(SessionId, cmd); int mr = HpiDemarshalReply0(pinst->header.m_flags & dMhEndianBit, hm, reply + sizeof(cMessageHeader), &err); if (request) free(request); if (pinst->header.m_type == eMhError) return SA_ERR_HPI_INVALID_PARAMS; if (mr < 0) return SA_ERR_HPI_INVALID_PARAMS; return err; } /*----------------------------------------------------------------------------*/ /* saHpiResourceLoadIdGet */ /*----------------------------------------------------------------------------*/ SaErrorT SAHPI_API saHpiResourceLoadIdGet( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId, SAHPI_OUT SaHpiLoadIdT *LoadId) { void *request; char reply[dMaxMessageLength]; SaErrorT err = SA_OK; char cmd[] = "saHpiResourceLoadIdGet"; pcstrmsock pinst; SaHpiSessionIdT dsid = 0; SaHpiDomainIdT did = 0; if (SessionId == 0) return SA_ERR_HPI_INVALID_SESSION; err = oh_get_connx(SessionId, &dsid, &pinst, &did); if (err) return err; cHpiMarshal *hm = HpiMarshalFind(eFsaHpiResourceLoadIdGet); pinst->MessageHeaderInit(eMhMsg, 0, eFsaHpiResourceLoadIdGet, hm->m_request_len); request = malloc(hm->m_request_len); pinst->header.m_len = HpiMarshalRequest2(hm, request, &dsid, &ResourceId); SendRecv(SessionId, cmd); int mr = HpiDemarshalReply1(pinst->header.m_flags & dMhEndianBit, hm, reply + sizeof(cMessageHeader), &err, LoadId); if (request) free(request); if (pinst->header.m_type == eMhError) return SA_ERR_HPI_INVALID_PARAMS; if (mr < 0) return SA_ERR_HPI_INVALID_PARAMS; return err; } /*----------------------------------------------------------------------------*/ /* saHpiResourceLoadIdSet */ /*----------------------------------------------------------------------------*/ SaErrorT SAHPI_API saHpiResourceLoadIdSet( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId, SAHPI_IN SaHpiLoadIdT *LoadId) { void *request; char reply[dMaxMessageLength]; SaErrorT err = SA_OK; char cmd[] = "saHpiResourceLoadIdSet"; pcstrmsock pinst; SaHpiSessionIdT dsid = 0; SaHpiDomainIdT did = 0; if (SessionId == 0) return SA_ERR_HPI_INVALID_SESSION; err = oh_get_connx(SessionId, &dsid, &pinst, &did); if (err) return err; if (LoadId == NULL) return SA_ERR_HPI_INVALID_PARAMS; cHpiMarshal *hm = HpiMarshalFind(eFsaHpiResourceLoadIdSet); pinst->MessageHeaderInit(eMhMsg, 0, eFsaHpiResourceLoadIdSet, hm->m_request_len); request = malloc(hm->m_request_len); pinst->header.m_len = HpiMarshalRequest3(hm, request, &dsid, &ResourceId, LoadId); SendRecv(SessionId, cmd); int mr = HpiDemarshalReply0(pinst->header.m_flags & dMhEndianBit, hm, reply + sizeof(cMessageHeader), &err); if (request) free(request); if (pinst->header.m_type == eMhError) return SA_ERR_HPI_INVALID_PARAMS; if (mr < 0) return SA_ERR_HPI_INVALID_PARAMS; return err; } /*----------------------------------------------------------------------------*/ /* saHpiResourceResetStateGet */ /*----------------------------------------------------------------------------*/ SaErrorT SAHPI_API saHpiResourceResetStateGet( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId, SAHPI_OUT SaHpiResetActionT *Action) { void *request; char reply[dMaxMessageLength]; SaErrorT err = SA_OK; char cmd[] = "saHpiResourceResetStateGet"; pcstrmsock pinst; SaHpiSessionIdT dsid = 0; SaHpiDomainIdT did = 0; if (SessionId == 0) return SA_ERR_HPI_INVALID_SESSION; err = oh_get_connx(SessionId, &dsid, &pinst, &did); if (err) return err; if (!Action) return SA_ERR_HPI_INVALID_PARAMS; cHpiMarshal *hm = HpiMarshalFind(eFsaHpiResourceResetStateGet); pinst->MessageHeaderInit(eMhMsg, 0, eFsaHpiResourceResetStateGet, hm->m_request_len); request = malloc(hm->m_request_len); pinst->header.m_len = HpiMarshalRequest2(hm, request, &dsid, &ResourceId); SendRecv(SessionId, cmd); int mr = HpiDemarshalReply1(pinst->header.m_flags & dMhEndianBit, hm, reply + sizeof(cMessageHeader), &err, Action); if (request) free(request); if (pinst->header.m_type == eMhError) return SA_ERR_HPI_INVALID_PARAMS; if (mr < 0) return SA_ERR_HPI_INVALID_PARAMS; return err; } /*----------------------------------------------------------------------------*/ /* saHpiResourceResetStateSet */ /*----------------------------------------------------------------------------*/ SaErrorT SAHPI_API saHpiResourceResetStateSet( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId, SAHPI_IN SaHpiResetActionT Action) { void *request; char reply[dMaxMessageLength]; SaErrorT err = SA_OK; char cmd[] = "saHpiResourceResetStateSet"; pcstrmsock pinst; SaHpiSessionIdT dsid = 0; SaHpiDomainIdT did = 0; if (SessionId == 0) return SA_ERR_HPI_INVALID_SESSION; err = oh_get_connx(SessionId, &dsid, &pinst, &did); if (err) return err; if (!oh_lookup_resetaction(Action)) return SA_ERR_HPI_INVALID_PARAMS; cHpiMarshal *hm = HpiMarshalFind(eFsaHpiResourceResetStateSet); pinst->MessageHeaderInit(eMhMsg, 0, eFsaHpiResourceResetStateSet, hm->m_request_len); request = malloc(hm->m_request_len); pinst->header.m_len = HpiMarshalRequest3(hm, request, &dsid, &ResourceId, &Action); SendRecv(SessionId, cmd); int mr = HpiDemarshalReply0(pinst->header.m_flags & dMhEndianBit, hm, reply + sizeof(cMessageHeader), &err); if (request) free(request); if (pinst->header.m_type == eMhError) return SA_ERR_HPI_INVALID_PARAMS; if (mr < 0) return SA_ERR_HPI_INVALID_PARAMS; return err; } /*----------------------------------------------------------------------------*/ /* saHpiResourcePowerStateGet */ /*----------------------------------------------------------------------------*/ SaErrorT SAHPI_API saHpiResourcePowerStateGet( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId, SAHPI_OUT SaHpiPowerStateT *State) { void *request; char reply[dMaxMessageLength]; SaErrorT err = SA_OK; char cmd[] = "saHpiResourcePowerStateGet"; pcstrmsock pinst; SaHpiSessionIdT dsid = 0; SaHpiDomainIdT did = 0; if (SessionId == 0) return SA_ERR_HPI_INVALID_SESSION; err = oh_get_connx(SessionId, &dsid, &pinst, &did); if (err) return err; if (!State) return SA_ERR_HPI_INVALID_PARAMS; cHpiMarshal *hm = HpiMarshalFind(eFsaHpiResourcePowerStateGet); pinst->MessageHeaderInit(eMhMsg, 0, eFsaHpiResourcePowerStateGet, hm->m_request_len); request = malloc(hm->m_request_len); pinst->header.m_len = HpiMarshalRequest2(hm, request, &dsid, &ResourceId); SendRecv(SessionId, cmd); int mr = HpiDemarshalReply1(pinst->header.m_flags & dMhEndianBit, hm, reply + sizeof(cMessageHeader), &err, State); if (request) free(request); if (pinst->header.m_type == eMhError) return SA_ERR_HPI_INVALID_PARAMS; if (mr < 0) return SA_ERR_HPI_INVALID_PARAMS; return err; } /*----------------------------------------------------------------------------*/ /* saHpiResourcePowerStateSet */ /*----------------------------------------------------------------------------*/ SaErrorT SAHPI_API saHpiResourcePowerStateSet( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId, SAHPI_IN SaHpiPowerStateT State) { void *request; char reply[dMaxMessageLength]; SaErrorT err = SA_OK; char cmd[] = "saHpiResourcePowerStateSet"; pcstrmsock pinst; SaHpiSessionIdT dsid = 0; SaHpiDomainIdT did = 0; if (SessionId == 0) return SA_ERR_HPI_INVALID_SESSION; err = oh_get_connx(SessionId, &dsid, &pinst, &did); if (err) return err; if (!oh_lookup_powerstate(State)) return SA_ERR_HPI_INVALID_PARAMS; cHpiMarshal *hm = HpiMarshalFind(eFsaHpiResourcePowerStateSet); pinst->MessageHeaderInit(eMhMsg, 0, eFsaHpiResourcePowerStateSet, hm->m_request_len); request = malloc(hm->m_request_len); pinst->header.m_len = HpiMarshalRequest3(hm, request, &dsid, &ResourceId, &State); SendRecv(SessionId, cmd); int mr = HpiDemarshalReply0(pinst->header.m_flags & dMhEndianBit, hm, reply + sizeof(cMessageHeader), &err); if (request) free(request); if (pinst->header.m_type == eMhError) return SA_ERR_HPI_INVALID_PARAMS; if (mr < 0) return SA_ERR_HPI_INVALID_PARAMS; return err; } /*----------------------------------------------------------------------------*/ /* oHpiVersionGet */ /*----------------------------------------------------------------------------*/ SaHpiUint64T oHpiVersionGet(void) { SaHpiUint64T v = 0; OHPI_VERSION_GET(v, VERSION); return v; } /*----------------------------------------------------------------------------*/ /* oHpiHandlerCreate */ /*----------------------------------------------------------------------------*/ SaErrorT oHpiHandlerCreate(GHashTable *config, oHpiHandlerIdT *id) { SaErrorT err = SA_OK; void *request; char reply[dMaxMessageLength]; char cmd[] = "oHpiHandlerCreate"; /* TODO: Change oHpi apis to send a domain id */ pcstrmsock pinst = NULL; oHpiHandlerConfigT handler_config; if (!config || !id) return SA_ERR_HPI_INVALID_PARAMS; err = oh_create_connx(SAHPI_UNSPECIFIED_DOMAIN_ID, &pinst); if (err) return err; handler_config.NumberOfParams = 0; handler_config.Params = (oHpiHandlerConfigParamT *)g_malloc0(sizeof(oHpiHandlerConfigParamT)*g_hash_table_size(config)); // add each hash table entry to the marshable handler_config g_hash_table_foreach(config, __dehash_config, &handler_config); // now create the handler cHpiMarshal *hm = HpiMarshalFind(eFoHpiHandlerCreate); pinst->MessageHeaderInit(eMhMsg, 0, eFoHpiHandlerCreate, hm->m_request_len); request = malloc(hm->m_request_len); pinst->header.m_len = HpiMarshalRequest1(hm, request, &handler_config); SendRecv(0, cmd); int mr = HpiDemarshalReply1(pinst->header.m_flags & dMhEndianBit, hm, reply + sizeof(cMessageHeader), &err, id); oh_delete_connx(pinst); if (request) free(request); if (mr < 0) return SA_ERR_HPI_INVALID_PARAMS; return err; } /*----------------------------------------------------------------------------*/ /* oHpiHandlerDestroy */ /*----------------------------------------------------------------------------*/ SaErrorT oHpiHandlerDestroy(oHpiHandlerIdT id) { void *request; char reply[dMaxMessageLength]; SaErrorT err = SA_OK; char cmd[] = "oHpiHandlerDestroy"; pcstrmsock pinst = NULL; err = oh_create_connx(SAHPI_UNSPECIFIED_DOMAIN_ID, &pinst); if (err) return err; cHpiMarshal *hm = HpiMarshalFind(eFoHpiHandlerDestroy); pinst->MessageHeaderInit(eMhMsg, 0, eFoHpiHandlerDestroy, hm->m_request_len); request = malloc(hm->m_request_len); pinst->header.m_len = HpiMarshalRequest1(hm, request, &id); SendRecv(0, cmd); int mr = HpiDemarshalReply0(pinst->header.m_flags & dMhEndianBit, hm, reply + sizeof(cMessageHeader), &err); oh_delete_connx(pinst); if (request) free(request); if (mr < 0) return SA_ERR_HPI_INVALID_PARAMS; return err; } /*----------------------------------------------------------------------------*/ /* oHpiHandlerInfo */ /*----------------------------------------------------------------------------*/ SaErrorT oHpiHandlerInfo(oHpiHandlerIdT id, oHpiHandlerInfoT *info) { void *request; char reply[dMaxMessageLength]; SaErrorT err = SA_OK; char cmd[] = "oHpiHandlerInfo"; pcstrmsock pinst = NULL; err = oh_create_connx(SAHPI_UNSPECIFIED_DOMAIN_ID, &pinst); if (err) return err; cHpiMarshal *hm = HpiMarshalFind(eFoHpiHandlerInfo); pinst->MessageHeaderInit(eMhMsg, 0, eFoHpiHandlerInfo, hm->m_request_len); request = malloc(hm->m_request_len); pinst->header.m_len = HpiMarshalRequest1(hm, request, &id); SendRecv(0, cmd); int mr = HpiDemarshalReply1(pinst->header.m_flags & dMhEndianBit, hm, reply + sizeof(cMessageHeader), &err, info); oh_delete_connx(pinst); if (request) free(request); if (mr < 0) return SA_ERR_HPI_INVALID_PARAMS; return err; } /*----------------------------------------------------------------------------*/ /* oHpiHandlerGetNext */ /*----------------------------------------------------------------------------*/ SaErrorT oHpiHandlerGetNext(oHpiHandlerIdT id, oHpiHandlerIdT *next_id) { void *request; char reply[dMaxMessageLength]; SaErrorT err = SA_OK; char cmd[] = "oHpiHandlerGetNext"; pcstrmsock pinst = NULL; err = oh_create_connx(SAHPI_UNSPECIFIED_DOMAIN_ID, &pinst); if (err) return err; cHpiMarshal *hm = HpiMarshalFind(eFoHpiHandlerGetNext); pinst->MessageHeaderInit(eMhMsg, 0, eFoHpiHandlerGetNext, hm->m_request_len); request = malloc(hm->m_request_len); pinst->header.m_len = HpiMarshalRequest1(hm, request, &id); SendRecv(0, cmd); int mr = HpiDemarshalReply1(pinst->header.m_flags & dMhEndianBit, hm, reply + sizeof(cMessageHeader), &err, next_id); oh_delete_connx(pinst); if (request) free(request); if (mr < 0) return SA_ERR_HPI_INVALID_PARAMS; return err; } /*----------------------------------------------------------------------------*/ /* oHpiHandlerFind */ /*----------------------------------------------------------------------------*/ SaErrorT oHpiHandlerFind(SaHpiSessionIdT sid, SaHpiResourceIdT rid, oHpiHandlerIdT *id) { void *request; char reply[dMaxMessageLength]; SaErrorT err = SA_OK; char cmd[] = "oHpiHandlerFind"; pcstrmsock pinst = NULL; err = oh_create_connx(SAHPI_UNSPECIFIED_DOMAIN_ID, &pinst); if (err) return err; if (!id || !sid || !rid) { return SA_ERR_HPI_INVALID_PARAMS; } *id = 0; //Initialize output var cHpiMarshal *hm = HpiMarshalFind(eFoHpiHandlerFind); pinst->MessageHeaderInit(eMhMsg, 0, eFoHpiHandlerFind, hm->m_request_len); request = malloc(hm->m_request_len); pinst->header.m_len = HpiMarshalRequest2(hm, request, &sid, &rid); SendRecv(0, cmd); int mr = HpiDemarshalReply1(pinst->header.m_flags & dMhEndianBit, hm, reply + sizeof(cMessageHeader), &err, id); oh_delete_connx(pinst); if (request) free(request); if (mr < 0) return SA_ERR_HPI_INVALID_PARAMS; return err; } /*----------------------------------------------------------------------------*/ /* oHpiHandlerRetry */ /*----------------------------------------------------------------------------*/ SaErrorT oHpiHandlerRetry(oHpiHandlerIdT id) { void *request; char reply[dMaxMessageLength]; SaErrorT err = SA_OK; char cmd[] = "oHpiHandlerRetry"; pcstrmsock pinst = NULL; err = oh_create_connx(SAHPI_UNSPECIFIED_DOMAIN_ID, &pinst); if (err) return err; if (!id) { return SA_ERR_HPI_INVALID_PARAMS; } cHpiMarshal *hm = HpiMarshalFind(eFoHpiHandlerRetry); pinst->MessageHeaderInit(eMhMsg, 0, eFoHpiHandlerRetry, hm->m_request_len); request = malloc(hm->m_request_len); pinst->header.m_len = HpiMarshalRequest1(hm, request, &id); SendRecv(0, cmd); int mr = HpiDemarshalReply0(pinst->header.m_flags & dMhEndianBit, hm, reply + sizeof(cMessageHeader), &err); oh_delete_connx(pinst); if (request) free(request); if (mr < 0) return SA_ERR_HPI_INVALID_PARAMS; return err; } /*----------------------------------------------------------------------------*/ /* oHpiGlobalParamGet */ /*----------------------------------------------------------------------------*/ SaErrorT oHpiGlobalParamGet(oHpiGlobalParamT *param) { void *request; char reply[dMaxMessageLength]; SaErrorT err = SA_OK; char cmd[] = "oHpiGlobalParamGet"; pcstrmsock pinst = NULL; err = oh_create_connx(SAHPI_UNSPECIFIED_DOMAIN_ID, &pinst); if (err) return err; cHpiMarshal *hm = HpiMarshalFind(eFoHpiGlobalParamGet); pinst->MessageHeaderInit(eMhMsg, 0, eFoHpiGlobalParamGet, hm->m_request_len); request = malloc(hm->m_request_len); pinst->header.m_len = HpiMarshalRequest1(hm, request, param); SendRecv(0, cmd); int mr = HpiDemarshalReply1(pinst->header.m_flags & dMhEndianBit, hm, reply + sizeof(cMessageHeader), &err, param); oh_delete_connx(pinst); if (request) free(request); if (mr < 0) return SA_ERR_HPI_INVALID_PARAMS; return err; } /*----------------------------------------------------------------------------*/ /* oHpiGlobalParamSet */ /*----------------------------------------------------------------------------*/ SaErrorT oHpiGlobalParamSet(oHpiGlobalParamT *param) { void *request; char reply[dMaxMessageLength]; SaErrorT err = SA_OK; char cmd[] = "oHpiGlobalParamSet"; pcstrmsock pinst = NULL; err = oh_create_connx(SAHPI_UNSPECIFIED_DOMAIN_ID, &pinst); if (err) return err; cHpiMarshal *hm = HpiMarshalFind(eFoHpiGlobalParamSet); pinst->MessageHeaderInit(eMhMsg, 0, eFoHpiGlobalParamSet, hm->m_request_len); request = malloc(hm->m_request_len); pinst->header.m_len = HpiMarshalRequest1(hm, request, param); SendRecv(0, cmd); int mr = HpiDemarshalReply1(pinst->header.m_flags & dMhEndianBit, hm, reply + sizeof(cMessageHeader), &err, param); oh_delete_connx(pinst); if (request) free(request); if (mr < 0) return SA_ERR_HPI_INVALID_PARAMS; return err; } /*----------------------------------------------------------------------------*/ /* oHpiInjectEvent */ /*----------------------------------------------------------------------------*/ SaErrorT oHpiInjectEvent(oHpiHandlerIdT id, SaHpiEventT *event, SaHpiRptEntryT *rpte, SaHpiRdrT *rdr) { void *request; char reply[dMaxMessageLength]; SaErrorT err = SA_OK; char cmd[] = "oHpiInjectEvent"; pcstrmsock pinst = NULL; err = oh_create_connx(SAHPI_UNSPECIFIED_DOMAIN_ID, &pinst); if (err) return err; if (!id) { return SA_ERR_HPI_INVALID_PARAMS; } else if (!event) { return SA_ERR_HPI_INVALID_PARAMS; } cHpiMarshal *hm = HpiMarshalFind(eFoHpiInjectEvent); pinst->MessageHeaderInit(eMhMsg, 0, eFoHpiInjectEvent, hm->m_request_len); request = malloc(hm->m_request_len); pinst->header.m_len = HpiMarshalRequest4(hm, request, &id, event, rpte, rdr); SendRecv(0, cmd); int mr = HpiDemarshalReply4(pinst->header.m_flags & dMhEndianBit, hm, reply + sizeof(cMessageHeader), &err, &id, event, rpte, rdr); oh_delete_connx(pinst); if (request) free(request); if (mr < 0) return SA_ERR_HPI_INVALID_PARAMS; return err; } openhpi-2.14.1/openhpid/openhpid.sh.in0000644000076400007640000001031411302567132014545 0ustar #! /bin/sh # ### BEGIN INIT INFO # Provides: openhpid # Required-Start: $network $remote_fs $syslog # Required-Stop: $network $remote_fs $syslog # Should-Start: $named # Should-Stop: $named # Default-Start: 2 3 4 5 # Default-Stop: 0 1 6 # Short-Description: Start OpenHPI daemon at boot time # Description: Enable OpenHPI service which is provided by openhpid. ### END INIT INFO # # openhpid.sh Start/Stop the openhpi daemon. # # description: openhpid is standard UNIX program which uses the OpenHPI \ # APIs and provides a standard internet server to access those \ # APIs for client programs. # processname: openhpid # config: the standard openhpi conf file specified on the command line or the env. # pidfile: /var/run/openhpid.pid # # Author(s): # W. David Ashley # Daniel de Araujo # Source function library. PATH=/sbin:/bin:/usr/sbin:/usr/bin prog="openhpid" # Determine whether the lsb package is installed # If it is, determine which lsb in installed: # redhat, suse, or standard lsb if test -f /etc/init.d/functions then lsbtype="rh" . /etc/init.d/functions elif test -f /etc/rc.status then lsbtype="suse" . /etc/rc.status elif test -f /lib/lsb/init-functions then lsbtype="lsb" . /lib/lsb/init-functions elif test -f /etc/gentoo-release then lsbtype="gentoo" . /sbin/functions.sh else lsbtype="nolsb" fi print_outcome() { case "${lsbtype}" in rh) echo [ "$?" -eq 0 ] ;; suse) rc_status -v ;; lsb) if test "$?" -eq 0 then log_success_msg "success" else log_failure_msg "failed" fi ;; gentoo) eend $? ;; nolsb) if test "$?" -eq 0 then echo " ... success" fi if test "$?" -ne 0 then echo " ... failed" fi ;; esac } start() { case "${lsbtype}" in rh) echo -n $"Starting $prog: " daemon @prefix@/sbin/openhpid -c @CONFPATH@/@HPI_PKG@.conf RETVAL=$? ;; suse) echo -n $"Starting $prog: " startproc @prefix@/sbin/openhpid -c @CONFPATH@/@HPI_PKG@.conf RETVAL=$? ;; lsb) echo -n $"Starting $prog: " start_daemon @prefix@/sbin/openhpid -c @CONFPATH@/@HPI_PKG@.conf RETVAL=$? ;; gentoo) ebegin "Starting $prog: " start-stop-daemon --start --quiet --exec @prefix@/sbin/openhpid -- -c @CONFPATH@/@HPI_PKG@.conf RETVAL=$? ;; nolsb) echo -n $"Starting $prog: " @prefix@/sbin/openhpid -c @CONFPATH@/@HPI_PKG@.conf RETVAL=$? ;; esac print_outcome } stop() { case "${lsbtype}" in rh | lsb | suse) echo -n $"Stopping $prog: " killproc @prefix@/sbin/openhpid RETVAL=$? ;; gentoo) ebegin "Stopping $prog: " start-stop-daemon --stop --quiet --exec @prefix@/sbin/openhpid RETVAL=$? ;; nolsb) echo -n $"Stopping $prog: " if test -f /var/run/openhpid.pid && test "`cat /var/run/openhpid.pid`" != "" then kill "`cat /var/run/openhpid.pid`" RETVAL=$? else RETVAL=0 fi ;; esac print_outcome if test "$RETVAL" -eq 0 && test -f /var/run/openhpid.pid then rm -f /var/lock/openhpid rm -f /var/run/openhpid.pid fi } dstatus() { echo $"Checking for $prog daemon: " case "${lsbtype}" in rh) status @prefix@/sbin/openhpid ;; suse) checkproc @prefix@/sbin/openhpid rc_status -v ;; lsb) pid="`pidofproc @prefix@/sbin/openhpid`" if test "${pid}" != "" then log_success_msg "$prog is running" else log_success_msg "$prog is not running" fi ;; gentoo | nolsb) if test -f /var/run/openhpid.pid && test "`cat /var/run/openhpid.pid`" != "" && kill -0 "`cat /var/run/openhpid.pid`" then echo "$prog is running" else echo "$prog is not running" fi ;; esac } restart() { stop start } force_reload() { echo -n $"Force-reload not supported." echo return 0 } # See how we were called. case "$1" in start) start ;; stop) stop ;; restart) restart ;; status) dstatus ;; force-reload) force_reload ;; *) echo $"Usage: $0 {start|stop|restart|status|force-reload}" exit 1 esac openhpi-2.14.1/openhpid/oh_client_conf.h0000644000076400007640000000131711302567132015123 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2008 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * Renier Morales * */ #include #include struct oh_domain_conf { SaHpiDomainIdT did; char host[SAHPI_MAX_TEXT_BUFFER_LENGTH]; unsigned int port; }; int oh_load_client_config(const char *filename, GHashTable *domains); openhpi-2.14.1/openhpid/oh_client_conf.c0000644000076400007640000002732111302567132015121 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2008 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Renier Morales */ #include #include #include #include #include #include #include #include #include #include /******************************************************************************* * In order to use the glib lexical parser we need to define token * types which we want to switch on ******************************************************************************/ enum { HPI_CLIENT_CONF_TOKEN_DOMAIN = G_TOKEN_LAST, HPI_CLIENT_CONF_TOKEN_DEFAULT, HPI_CLIENT_CONF_TOKEN_HOST, HPI_CLIENT_CONF_TOKEN_PORT } hpiClientConfType; struct tokens { gchar *name; guint token; }; static struct tokens oh_client_conf_tokens[] = { { .name = "domain", .token = HPI_CLIENT_CONF_TOKEN_DOMAIN }, { .name = "default", .token = HPI_CLIENT_CONF_TOKEN_DEFAULT }, { .name = "host", .token = HPI_CLIENT_CONF_TOKEN_HOST }, { .name = "port", .token = HPI_CLIENT_CONF_TOKEN_PORT } }; /******************************************************************************* * In order to initialize the lexical scanner, you need the following config. * This config was figured out by reading the glib sources, and lots of * trial and error (documentation for this isn't very good). * * G_TOKEN_STRING will be created when anything starts with a-zA-z_/. * due to cset_identifier_first and identifier2string values below. * Therefor, if you want 0 to be scanned as a string, you need to quote * it (e.g. "0") * *******************************************************************************/ static GScannerConfig oh_scanner_conf = { ( " \t\n" ) /* cset_skip_characters */, ( G_CSET_a_2_z "_/." G_CSET_A_2_Z ) /* cset_identifier_first */, ( G_CSET_a_2_z "_-0123456789/." G_CSET_A_2_Z ) /* cset_identifier_nth */, ( "#\n" ) /* cpair_comment_single */, FALSE /* case_sensitive */, TRUE /* skip_comment_multi */, TRUE /* skip_comment_single */, TRUE /* scan_comment_multi */, TRUE /* scan_identifier */, TRUE /* scan_identifier_1char */, TRUE /* scan_identifier_NULL */, TRUE /* scan_symbols */, TRUE /* scan_binary */, TRUE /* scan_octal */, TRUE /* scan_float */, TRUE /* scan_hex */, TRUE /* scan_hex_dollar */, TRUE /* scan_string_sq */, TRUE /* scan_string_dq */, TRUE /* numbers_2_int */, FALSE /* int_2_float */, TRUE /* identifier_2_string */, TRUE /* char_2_token */, TRUE /* symbol_2_token */, FALSE /* scope_0_fallback */, }; static GTokenType get_next_good_token(GScanner *oh_scanner) { GTokenType next_token; next_token = g_scanner_get_next_token(oh_scanner); while (next_token != G_TOKEN_RIGHT_CURLY && next_token != HPI_CLIENT_CONF_TOKEN_HOST && next_token != HPI_CLIENT_CONF_TOKEN_PORT) { if (next_token == G_TOKEN_EOF) break; next_token = g_scanner_get_next_token(oh_scanner); } return next_token; } static int process_domain_token (GScanner *oh_scanner, GHashTable *domains) { struct oh_domain_conf *domain_conf = NULL; GTokenType next_token; if (g_scanner_get_next_token(oh_scanner) != HPI_CLIENT_CONF_TOKEN_DOMAIN) { err("Processing domain: Expected a domain token"); return -1; } /* Get the domain id and store in Hash Table */ next_token = g_scanner_get_next_token(oh_scanner); if (next_token == HPI_CLIENT_CONF_TOKEN_DEFAULT) { // Default domain domain_conf = g_malloc0(sizeof(struct oh_domain_conf)); // domain_conf->did = SAHPI_UNSPECIFIED_DOMAIN_ID; domain_conf->did = OH_DEFAULT_DOMAIN_ID; dbg("Processing domain: Found default domain definition"); } else if (next_token == G_TOKEN_INT) { if (oh_scanner->value.v_int == 0) { // Domain Id of 0 is invalid err("Processing domain: A domain id of 0 is invalid"); return -2; } domain_conf = g_malloc0(sizeof(struct oh_domain_conf)); domain_conf->did = (SaHpiDomainIdT)oh_scanner->value.v_int; dbg("Processing domain: Found domain definition"); } else { err("Processing domain: Expected int or string ('default') token"); return -3; } /* Check for Left Brace token type. If we have it, then continue parsing. */ if (g_scanner_get_next_token(oh_scanner) != G_TOKEN_LEFT_CURLY) { err("Processing domain: Expected left curly token."); goto free_and_exit; } next_token = get_next_good_token(oh_scanner); while (next_token != G_TOKEN_EOF && next_token != G_TOKEN_RIGHT_CURLY) { if (next_token == HPI_CLIENT_CONF_TOKEN_HOST) { next_token = g_scanner_get_next_token(oh_scanner); if (next_token != G_TOKEN_EQUAL_SIGN) { err("Processing domain: Expected equal sign"); goto free_and_exit; } next_token = g_scanner_get_next_token(oh_scanner); if (next_token != G_TOKEN_STRING) { err("Processing domain: Expected a string"); goto free_and_exit; } if (domain_conf->host[0] == '\0') { strncpy(domain_conf->host, oh_scanner->value.v_string, SAHPI_MAX_TEXT_BUFFER_LENGTH); } } else if (next_token == HPI_CLIENT_CONF_TOKEN_PORT) { next_token = g_scanner_get_next_token(oh_scanner); if (next_token != G_TOKEN_EQUAL_SIGN) { err("Processing domain: Expected equal sign"); goto free_and_exit; } next_token = g_scanner_get_next_token(oh_scanner); if (next_token != G_TOKEN_INT) { err("Processing domain: Expected an integer"); goto free_and_exit; } domain_conf->port = oh_scanner->value.v_int; } else { err("Processing domain: Should not get here!"); goto free_and_exit; } next_token = g_scanner_get_next_token(oh_scanner); } if (next_token == G_TOKEN_EOF) { err("Processing domain: Expected a right curly"); goto free_and_exit; } else if (domain_conf->host[0] == '\0') { err("Processing domain: Did not find the host parameter"); goto free_and_exit; } else if (domain_conf->port == 0) { domain_conf->port = OPENHPI_DEFAULT_DAEMON_PORT; } g_hash_table_insert(domains, &domain_conf->did, domain_conf); //printf("domain %d: %s:%d\n", domain_conf->did, domain_conf->host, domain_conf->port); return 0; free_and_exit: /** There was an error reading a token so we need to error out, but not before cleaning up. */ g_free(domain_conf); return -10; } static void scanner_msg_handler (GScanner *scanner, gchar *message, gboolean is_error) { g_return_if_fail (scanner != NULL); err("%s:%d: %s%s\n", scanner->input_name ? scanner->input_name : "", scanner->line, is_error ? "error: " : "", message ); } int oh_load_client_config(const char *filename, GHashTable *domains) { int oh_client_conf_file, i, done = 0; GScanner *oh_scanner; int num_tokens = sizeof(oh_client_conf_tokens) / sizeof(oh_client_conf_tokens[0]); if (!filename || !domains) { err("Error. Invalid parameters"); return -1; } oh_scanner = g_scanner_new(&oh_scanner_conf); if (!oh_scanner) { err("Couldn't allocate g_scanner for file parsing"); return -2; } oh_scanner->msg_handler = scanner_msg_handler; oh_scanner->input_name = filename; oh_client_conf_file = open(filename, O_RDONLY); if (oh_client_conf_file < 0) { err("Client configuration file '%s' could not be opened", filename); g_scanner_destroy(oh_scanner); return -3; } g_scanner_input_file(oh_scanner, oh_client_conf_file); for (i = 0; i < num_tokens; i++) { g_scanner_scope_add_symbol( oh_scanner, 0, oh_client_conf_tokens[i].name, (void *)((unsigned long)oh_client_conf_tokens[i].token)); } while (!done) { guint my_token; my_token = g_scanner_peek_next_token(oh_scanner); /*dbg("token: %d", my_token);*/ switch (my_token) { case G_TOKEN_EOF: done = 1; break; case HPI_CLIENT_CONF_TOKEN_DOMAIN: process_domain_token(oh_scanner, domains); break; default: /* need to advance it */ my_token = g_scanner_get_next_token(oh_scanner); g_scanner_unexp_token(oh_scanner, G_TOKEN_SYMBOL, NULL, "\"domain\"", NULL, NULL, 1); break; } } if (close(oh_client_conf_file) != 0) { err("Couldn't close file '%s'.", filename); g_scanner_destroy(oh_scanner); return -4; } done = oh_scanner->parse_errors; g_scanner_destroy(oh_scanner); dbg("Done processing conf file.\nNumber of parse errors:%d", done); return 0; } openhpi-2.14.1/openhpid/oh_client_session.h0000644000076400007640000000261611302567132015664 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004-2008 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * W. David Ashley * Renier Morales * */ #ifndef __OH_CLIENT_SESSION_H #define __OH_CLIENT_SESSION_H #include "strmsock.h" extern "C" { #include #include } struct oh_client_session { SaHpiDomainIdT did; /* Domain Id */ SaHpiSessionIdT csid; /* Client Session Id */ SaHpiSessionIdT dsid; /* Domain Session Id */ GHashTable *connxs; /* Connections for this session (per thread) */ }; extern GHashTable *ohd_domains; extern GHashTable *ohd_sessions; extern GStaticRecMutex ohd_sessions_sem; SaErrorT oh_create_connx(SaHpiDomainIdT, pcstrmsock *); void oh_delete_connx(pcstrmsock); SaErrorT oh_close_connx(SaHpiSessionIdT); SaErrorT oh_get_connx(SaHpiSessionIdT, SaHpiSessionIdT *, pcstrmsock *, SaHpiDomainIdT *); SaHpiSessionIdT oh_open_session(SaHpiDomainIdT, SaHpiSessionIdT, pcstrmsock); SaErrorT oh_close_session(SaHpiSessionIdT); #endif /* __OH_CLIENT_SESSION_H */ openhpi-2.14.1/openhpid/oh_client.h0000644000076400007640000000315211302567132014115 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004-2008 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * W. David Ashley * Renier Morales * */ #ifndef __OH_CLIENT_H #define __OH_CLIENT_H /*----------------------------------------------------------------------------*/ /* Macros */ /*----------------------------------------------------------------------------*/ #define SendRecv(sid, cmd) \ if (pinst->WriteMsg(request)) { \ client_err(cmd, "WriteMsg failed\n"); \ g_free(request); \ if (sid) oh_close_connx(sid); \ else oh_delete_connx(pinst); \ return SA_ERR_HPI_NO_RESPONSE; \ } \ if (pinst->ReadMsg(reply)) { \ client_err(cmd, "Read failed\n"); \ g_free(request); \ if (sid) oh_close_connx(sid); \ else oh_delete_connx(pinst); \ return SA_ERR_HPI_NO_RESPONSE; \ } #define SendRecvNoReturn(cmd) \ if (pinst->WriteMsg(request)) { \ client_err(cmd, "WriteMsg failed\n"); \ g_free(request); \ oh_delete_connx(pinst); \ return; \ } \ if (pinst->ReadMsg(reply)) { \ client_err(cmd, "Read failed\n"); \ g_free(request); \ oh_delete_connx(pinst); \ return; \ } #endif /* __OH_CLIENT_H */ openhpi-2.14.1/openhpid/openhpid.cpp0000644000076400007640000042252311302567132014321 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004-2008 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * W. David Ashley * David Judkoivcs * Renier Morales * Anton Pak * */ #include #include #include #include #include #include #include #include #include #include #include #include #include #include "strmsock.h" #include "oh_domain.h" extern "C" { #include #include #include #include } #include "marshal_hpi.h" /*--------------------------------------------------------------------*/ /* Local definitions */ /*--------------------------------------------------------------------*/ extern "C" { enum tResult { eResultOk, eResultError, eResultReply, eResultClose }; static bool morph2daemon(void); static void service_thread(gpointer data, gpointer user_data); static void HandleInvalidRequest(psstrmsock thrdinst); static tResult HandleMsg(psstrmsock thrdinst, char *data, SaHpiSessionIdT * sid); } #define CLIENT_TIMEOUT 0 // Unlimited #define PID_FILE "/var/run/openhpid.pid" static bool stop_server = FALSE; static bool runasdaemon = TRUE; static int sock_timeout = CLIENT_TIMEOUT; static int max_threads = -1; // unlimited /* options set by the command line */ static char *pid_file = NULL; static int verbose_flag = 0; static struct option long_options[] = { {"verbose", no_argument, NULL, 'v'}, {"nondaemon", no_argument, NULL, 'n'}, {"config", required_argument, NULL, 'c'}, {"port", required_argument, NULL, 'p'}, {"pidfile", required_argument, NULL, 'f'}, {"timeout", required_argument, NULL, 's'}, {"threads", required_argument, NULL, 't'}, {0, 0, 0, 0} }; /* verbose macro */ #define PVERBOSE1(msg, ...) if (verbose_flag) dbg(msg, ## __VA_ARGS__) #define PVERBOSE2(msg, ...) if (verbose_flag) err(msg, ## __VA_ARGS__) #define PVERBOSE3(msg, ...) if (verbose_flag) printf("CRITICAL: "msg, ## __VA_ARGS__) /*--------------------------------------------------------------------*/ /* Function: display_help */ /*--------------------------------------------------------------------*/ void display_help(void) { printf("Help for openhpid:\n\n"); printf(" openhpid -c conf_file [-v] [-p port] [-f pidfile]\n\n"); printf(" -c conf_file conf_file is the path/name of the configuration file.\n"); printf(" This option is required unless the environment\n"); printf(" variable OPENHPI_CONF has been set to a valid\n"); printf(" configuration file.\n"); printf(" -v This option causes the daemon to display verbose\n"); printf(" messages. This option is optional.\n"); printf(" -p port This overrides the default listening port (%d) of\n", OPENHPI_DEFAULT_DAEMON_PORT); printf(" the daemon. This option is optional.\n"); printf(" -f pidfile This overrides the default name/location for the daemon.\n"); printf(" pid file. This option is optional.\n"); printf(" -s seconds This overrides the default socket read timeout of 30\n"); printf(" minutes. This option is optional.\n"); printf(" -t threads This sets the maximum number of connection threads.\n"); printf(" The default is umlimited. This option is optional.\n"); printf(" -n This forces the code to run as a foreground process\n"); printf(" and NOT as a daemon. The default is to run as\n"); printf(" a daemon. This option is optional.\n\n"); printf("A typical invocation might be\n\n"); printf(" ./openhpid -c /etc/openhpi/openhpi.conf\n\n"); } /*--------------------------------------------------------------------*/ /* Function: main */ /*--------------------------------------------------------------------*/ int main (int argc, char *argv[]) { GThreadPool *thrdpool; int port, c, option_index = 0; char *portstr; char * configfile = NULL; char pid_buf[256]; int pfile, len, pid = 0; /* get the command line options */ while (1) { c = getopt_long(argc, argv, "nvc:p:f:s:t:", long_options, &option_index); /* detect when done scanning options */ if (c == -1) { break; } switch (c) { case 0: /* no need to do anything here */ break; case 'c': setenv("OPENHPI_CONF", optarg, 1); break; case 'p': setenv("OPENHPI_DAEMON_PORT", optarg, 1); break; case 'v': verbose_flag = 1; break; case 'f': pid_file = (char *)malloc(strlen(optarg) + 1); strcpy(pid_file, optarg); break; case 's': sock_timeout = atoi(optarg); if (sock_timeout < 0) { sock_timeout = CLIENT_TIMEOUT; } break; case 't': max_threads = atoi(optarg); if (max_threads < -1 || max_threads == 0) { max_threads = -1; } break; case 'n': runasdaemon = FALSE; break; case '?': display_help(); exit(0); default: /* they obviously need it */ display_help(); exit(-1); } } if (pid_file == NULL) { pid_file = (char *)malloc(strlen(PID_FILE) + 1); strcpy(pid_file, PID_FILE); } if (optind < argc) { err("Error: Unknown command line option specified .\n"); err(" Aborting execution.\n\n"); display_help(); exit(-1); } // see if we are already running if ((pfile = open(pid_file, O_RDONLY)) > 0) { len = read(pfile, pid_buf, sizeof(pid_buf) - 1); close(pfile); pid_buf[len] = '\0'; pid = atoi(pid_buf); if (pid && (pid == getpid() || kill(pid, 0) < 0)) { unlink(pid_file); } else { // there is already a server running err("Error: There is already a server running .\n"); err(" Aborting execution.\n"); exit(1); } } // write the pid file pfile = open(pid_file, O_WRONLY|O_CREAT, S_IRUSR|S_IWUSR|S_IRGRP); if (pfile == -1) { // there is already a server running err("Error: Cannot open PID file .\n"); err(" Aborting execution.\n\n"); display_help(); exit(1); } snprintf(pid_buf, sizeof(pid_buf), "%d\n", (int)getpid()); len = write(pfile, pid_buf, strlen(pid_buf)); close(pfile); // see if we have a valid configuration file char *cfgfile = getenv("OPENHPI_CONF"); if (cfgfile == NULL) { err("Error: Configuration file not specified .\n"); err(" Aborting execution.\n\n"); display_help(); exit(-1); } if (!g_file_test(cfgfile, G_FILE_TEST_EXISTS)) { err("Error: Configuration file does not exist.\n"); err(" Aborting execution.\n\n"); display_help(); exit(-1); } configfile = (char *) malloc(strlen(cfgfile) + 1); strcpy(configfile, cfgfile); // get our listening port portstr = getenv("OPENHPI_DAEMON_PORT"); if (portstr == NULL) { port = OPENHPI_DEFAULT_DAEMON_PORT; } else { port = atoi(portstr); } // become a daemon if (!morph2daemon()) { exit(8); } if (!g_thread_supported()) { g_thread_init(NULL); } if (oh_init()) { // Initialize OpenHPI err("There was an error initializing OpenHPI"); return 8; } // create the thread pool thrdpool = g_thread_pool_new(service_thread, NULL, max_threads, FALSE, NULL); // create the server socket psstrmsock servinst = new sstrmsock; if (servinst->Create(port)) { err("Error creating server socket.\n"); g_thread_pool_free(thrdpool, FALSE, TRUE); delete servinst; return 8; } // announce ourselves dbg("%s started.\n", argv[0]); dbg("OPENHPI_CONF = %s\n", configfile); dbg("OPENHPI_DAEMON_PORT = %d\n\n", port); // wait for a connection and then service the connection while (TRUE) { if (stop_server) { break; } if (servinst->Accept()) { PVERBOSE1("Error accepting server socket."); break; } PVERBOSE1("### Spawning thread to handle connection. ###"); psstrmsock thrdinst = new sstrmsock(*servinst); g_thread_pool_push(thrdpool, (gpointer)thrdinst, NULL); } servinst->CloseSrv(); PVERBOSE1("Server socket closed."); // ensure all threads are complete g_thread_pool_free(thrdpool, FALSE, TRUE); delete servinst; return 0; } /*--------------------------------------------------------------------*/ /* Function: morph2daemon */ /*--------------------------------------------------------------------*/ static bool morph2daemon(void) { char pid_buf[SA_HPI_MAX_NAME_LENGTH]; int pid_fd; int ret; if (signal(SIGPIPE, SIG_IGN) == SIG_ERR) { return false; } if (runasdaemon) { pid_t pid = fork(); if (pid < 0) { return false; } else if (pid != 0) { // parent process exit( 0 ); } // Become the session leader setsid(); // Second fork to make sure we are detached from any // controlling terminal. pid = fork(); if (pid < 0) { return false; } else if (pid != 0) { // parent process exit(0); } // Rreate the pid file (overwrite of old pid file is ok) unlink(pid_file); pid_fd = open(pid_file, O_WRONLY|O_CREAT, S_IRUSR|S_IWUSR|S_IRGRP); snprintf(pid_buf, SA_HPI_MAX_NAME_LENGTH, "%d\n", (int)getpid()); ret = write(pid_fd, pid_buf, strlen(pid_buf)); close(pid_fd); //chdir("/"); umask(0); // Reset default file permissions // Close unneeded inherited file descriptors // Keep stdout and stderr open if they already are. #ifdef NR_OPEN for (int i = 3; i < NR_OPEN; i++) { #else for (int i = 3; i < 1024; i++) { #endif close(i); } } return true; } /*--------------------------------------------------------------------*/ /* Function: service_thread */ /*--------------------------------------------------------------------*/ static void service_thread(gpointer data, gpointer user_data) { psstrmsock thrdinst = (psstrmsock) data; bool stop = false; char buf[dMaxMessageLength]; tResult result; gpointer thrdid = g_thread_self(); SaHpiSessionIdT session_id = 0; PVERBOSE1("%p Servicing connection.", thrdid); /* set the read timeout for the socket */ thrdinst->SetReadTimeout(sock_timeout); PVERBOSE1("### service_thread, thrdid [%p] ###", (void *)thrdid); while (stop == false) { if (thrdinst->ReadMsg(buf)) { if (thrdinst->GetErrcode() == EWOULDBLOCK) { PVERBOSE3("%p Timeout reading socket.\n", thrdid); } else { PVERBOSE3("%p Error reading socket.\n", thrdid); } goto thrd_cleanup; } else { switch( thrdinst->header.m_type ) { case eMhMsg: result = HandleMsg(thrdinst, buf, &session_id); // marshal error ? if (result == eResultError) { PVERBOSE3("%p Invalid API found.\n", thrdid); HandleInvalidRequest(thrdinst); } // done ? if (result == eResultClose) { stop = true; } break; default: PVERBOSE3("%p Error in socket read buffer data.\n", thrdid); HandleInvalidRequest(thrdinst); break; } } } thrd_cleanup: // if necessary, clean up HPI lib data if (session_id != 0) { saHpiSessionClose( session_id ); } delete thrdinst; // cleanup thread instance data PVERBOSE1("%p Connection ended.", thrdid); return; // do NOT use g_thread_exit here! } /*--------------------------------------------------------------------*/ /* Function: HandleInvalidRequest */ /*--------------------------------------------------------------------*/ void HandleInvalidRequest(psstrmsock thrdinst) { gpointer thrdid = g_thread_self(); /* create and deliver a pong message */ PVERBOSE2("%p Invalid request.", thrdid); thrdinst->MessageHeaderInit(eMhError, 0, thrdinst->header.m_id, 0 ); thrdinst->WriteMsg(NULL); return; } /*--------------------------------------------------------------------*/ /* Function: HandleMsg */ /*--------------------------------------------------------------------*/ static tResult HandleMsg(psstrmsock thrdinst, char *data, SaHpiSessionIdT * sid) { cHpiMarshal *hm; SaErrorT ret; tResult result = eResultReply; char *pReq = data + sizeof(cMessageHeader); gpointer thrdid = g_thread_self(); unsigned char request_mFlags; hm = HpiMarshalFind(thrdinst->header.m_id); // keep a local copy of the requests flags // before it is overwritten in the MessageHeaderInit below. request_mFlags = thrdinst->header.m_flags; // init reply header thrdinst->MessageHeaderInit((tMessageType) thrdinst->header.m_type, 0, thrdinst->header.m_id, hm->m_reply_len ); switch( thrdinst->header.m_id ) { case eFsaHpiSessionOpen: { SaHpiDomainIdT domain_id; SaHpiSessionIdT session_id = 0; void *securityparams = NULL; PVERBOSE1("%p Processing saHpiSessionOpen.", thrdid); if ( HpiDemarshalRequest1( request_mFlags & dMhEndianBit, hm, pReq, &domain_id ) < 0 ) return eResultError; // patched version ret = saHpiSessionOpen( SAHPI_UNSPECIFIED_DOMAIN_ID, &session_id, securityparams ); ret = saHpiSessionOpen( OH_DEFAULT_DOMAIN_ID, &session_id, securityparams ); thrdinst->header.m_len = HpiMarshalReply1( hm, pReq, &ret, &session_id ); // this is used in case the connection ever breaks! *sid = session_id; } break; case eFsaHpiSessionClose: { SaHpiSessionIdT session_id; PVERBOSE1("%p Processing saHpiSessionClose.", thrdid); if ( HpiDemarshalRequest1( request_mFlags & dMhEndianBit, hm, pReq, &session_id ) < 0 ) return eResultError; ret = saHpiSessionClose( session_id ); thrdinst->header.m_len = HpiMarshalReply0( hm, pReq, &ret ); result = eResultClose; *sid = 0; } break; case eFsaHpiDiscover: { SaHpiSessionIdT session_id; PVERBOSE1("%p Processing saHpiDiscover.", thrdid); if ( HpiDemarshalRequest1( request_mFlags & dMhEndianBit, hm, pReq, &session_id ) < 0 ) return eResultError; ret = saHpiDiscover( session_id ); thrdinst->header.m_len = HpiMarshalReply0( hm, pReq, &ret ); } break; case eFsaHpiDomainInfoGet: { SaHpiSessionIdT session_id; SaHpiDomainInfoT domain_info; PVERBOSE1("%p Processing saHpiDomainInfoGet.", thrdid); if ( HpiDemarshalRequest1( request_mFlags & dMhEndianBit, hm, pReq, &session_id ) < 0 ) return eResultError; ret = saHpiDomainInfoGet( session_id, &domain_info ); thrdinst->header.m_len = HpiMarshalReply1( hm, pReq, &ret, &domain_info ); } break; case eFsaHpiDrtEntryGet: { SaHpiSessionIdT session_id; SaHpiEntryIdT entry_id; SaHpiEntryIdT next_entry_id = 0; SaHpiDrtEntryT drt_entry; PVERBOSE1("%p Processing saHpiDrtEntryGet.", thrdid); if ( HpiDemarshalRequest2( request_mFlags & dMhEndianBit, hm, pReq, &session_id, &entry_id ) < 0 ) return eResultError; ret = saHpiDrtEntryGet( session_id, entry_id, &next_entry_id, &drt_entry ); thrdinst->header.m_len = HpiMarshalReply2( hm, pReq, &ret, &next_entry_id, &drt_entry ); } break; case eFsaHpiDomainTagSet: { SaHpiSessionIdT session_id; SaHpiTextBufferT domain_tag; PVERBOSE1("%p Processing saHpiDomainTagSet.", thrdid); if ( HpiDemarshalRequest2( request_mFlags & dMhEndianBit, hm, pReq, &session_id, &domain_tag ) < 0 ) return eResultError; ret = saHpiDomainTagSet( session_id, &domain_tag ); thrdinst->header.m_len = HpiMarshalReply0( hm, pReq, &ret ); } break; case eFsaHpiRptEntryGet: { SaHpiSessionIdT session_id; SaHpiEntryIdT entry_id; SaHpiEntryIdT next_entry_id = 0; // for valgring SaHpiRptEntryT rpt_entry; PVERBOSE1("%p Processing saHpiRptEntryGet.", thrdid); if ( HpiDemarshalRequest2( request_mFlags & dMhEndianBit, hm, pReq, &session_id, &entry_id ) < 0 ) return eResultError; ret = saHpiRptEntryGet( session_id, entry_id, &next_entry_id, &rpt_entry ); thrdinst->header.m_len = HpiMarshalReply2( hm, pReq, &ret, &next_entry_id, &rpt_entry ); } break; case eFsaHpiRptEntryGetByResourceId: { SaHpiSessionIdT session_id; SaHpiResourceIdT resource_id; SaHpiRptEntryT rpt_entry; PVERBOSE1("%p Processing saHpiRptEntryGetByResourceId.", thrdid); if ( HpiDemarshalRequest2( request_mFlags & dMhEndianBit, hm, pReq, &session_id, &resource_id ) < 0 ) return eResultError; ret = saHpiRptEntryGetByResourceId( session_id, resource_id, &rpt_entry ); thrdinst->header.m_len = HpiMarshalReply1( hm, pReq, &ret, &rpt_entry ); } break; case eFsaHpiResourceSeveritySet: { SaHpiSessionIdT session_id; SaHpiResourceIdT resource_id; SaHpiSeverityT severity; PVERBOSE1("%p Processing saHpiResourceSeveritySet.", thrdid); if ( HpiDemarshalRequest3( request_mFlags & dMhEndianBit, hm, pReq, &session_id, &resource_id, &severity ) < 0 ) return eResultError; ret = saHpiResourceSeveritySet( session_id, resource_id, severity ); thrdinst->header.m_len = HpiMarshalReply0( hm, pReq, &ret ); } break; case eFsaHpiResourceTagSet: { SaHpiSessionIdT session_id; SaHpiResourceIdT resource_id; SaHpiTextBufferT resource_tag; PVERBOSE1("%p Processing saHpiResourceTagSet.", thrdid); if ( HpiDemarshalRequest3( request_mFlags & dMhEndianBit, hm, pReq, &session_id, &resource_id, &resource_tag ) < 0 ) return eResultError; ret = saHpiResourceTagSet( session_id, resource_id, &resource_tag ); thrdinst->header.m_len = HpiMarshalReply0( hm, pReq, &ret ); } break; case eFsaHpiMyEntityPathGet: { SaHpiSessionIdT session_id; SaHpiEntityPathT entity_path; PVERBOSE1("%p Processing saHpiMyEntityPathGet.", thrdid); if ( HpiDemarshalRequest1( request_mFlags & dMhEndianBit, hm, pReq, &session_id ) < 0 ) return eResultError; ret = saHpiMyEntityPathGet( session_id, &entity_path ); thrdinst->header.m_len = HpiMarshalReply1( hm, pReq, &ret, &entity_path ); } break; case eFsaHpiResourceIdGet: { SaHpiSessionIdT session_id; SaHpiResourceIdT resource_id = 0; PVERBOSE1("%p Processing saHpiResourceIdGet.", thrdid); if ( HpiDemarshalRequest1( request_mFlags & dMhEndianBit, hm, pReq, &session_id ) < 0 ) return eResultError; ret = saHpiResourceIdGet( session_id, &resource_id ); thrdinst->header.m_len = HpiMarshalReply1( hm, pReq, &ret, &resource_id ); } break; case eFsaHpiGetIdByEntityPath: { /* IN params */ SaHpiSessionIdT session_id; SaHpiEntityPathT entity_path; SaHpiRdrTypeT instrument_type; /* INOUT params */ SaHpiUint32T instance_id; /* OUT params */ SaHpiResourceIdT resource_id; SaHpiInstrumentIdT instrument_id; SaHpiUint32T rpt_update_count; PVERBOSE1("%p Processing saHpiGetIdByEntityPath.", thrdid); if ( HpiDemarshalRequest4( request_mFlags & dMhEndianBit, hm, pReq, &session_id, &entity_path, &instrument_type, &instance_id ) < 0 ) return eResultError; ret = saHpiGetIdByEntityPath( session_id, entity_path, instrument_type, &instance_id, &resource_id, &instrument_id, &rpt_update_count ); thrdinst->header.m_len = HpiMarshalReply4( hm, pReq, &ret, &instance_id, &resource_id, &instrument_id, &rpt_update_count ); } break; case eFsaHpiGetChildEntityPath: { /* IN params */ SaHpiSessionIdT session_id; SaHpiEntityPathT parent_ep; /* INOUT params */ SaHpiUint32T instance_id; /* OUT params */ SaHpiEntityPathT child_ep; SaHpiUint32T rpt_update_count; PVERBOSE1("%p Processing saHpiGetChildEntityPath.", thrdid); if ( HpiDemarshalRequest3( request_mFlags & dMhEndianBit, hm, pReq, &session_id, &parent_ep, &instance_id ) < 0 ) return eResultError; ret = saHpiGetChildEntityPath( session_id, parent_ep, &instance_id, &child_ep, &rpt_update_count ); thrdinst->header.m_len = HpiMarshalReply3( hm, pReq, &ret, &instance_id, &child_ep, &rpt_update_count ); } break; case eFsaHpiResourceFailedRemove: { SaHpiSessionIdT session_id; SaHpiResourceIdT resource_id; PVERBOSE1("%p Processing saHpiResourceFailedRemove.", thrdid); if ( HpiDemarshalRequest2( request_mFlags & dMhEndianBit, hm, pReq, &session_id, &resource_id ) < 0 ) return eResultError; ret = saHpiResourceFailedRemove( session_id, resource_id ); thrdinst->header.m_len = HpiMarshalReply0( hm, pReq, &ret ); } break; case eFsaHpiEventLogInfoGet: { SaHpiSessionIdT session_id; SaHpiResourceIdT resource_id; SaHpiEventLogInfoT info; PVERBOSE1("%p Processing saHpiEventLogInfoGet.", thrdid); if ( HpiDemarshalRequest2( request_mFlags & dMhEndianBit, hm, pReq, &session_id, &resource_id ) < 0 ) return eResultError; ret = saHpiEventLogInfoGet( session_id, resource_id, &info ); thrdinst->header.m_len = HpiMarshalReply1( hm, pReq, &ret, &info ); } break; case eFsaHpiEventLogCapabilitiesGet: { SaHpiSessionIdT session_id; SaHpiResourceIdT resource_id; SaHpiEventLogCapabilitiesT elcaps; PVERBOSE1("%p Processing saHpiEventLogCapabilitiesGet.", thrdid); if ( HpiDemarshalRequest2( request_mFlags & dMhEndianBit, hm, pReq, &session_id, &resource_id ) < 0 ) return eResultError; ret = saHpiEventLogCapabilitiesGet( session_id, resource_id, &elcaps ); thrdinst->header.m_len = HpiMarshalReply1( hm, pReq, &ret, &elcaps ); } break; case eFsaHpiEventLogEntryGet: { SaHpiSessionIdT session_id; SaHpiResourceIdT resource_id; SaHpiEventLogEntryIdT entry_id; SaHpiEventLogEntryIdT prev_entry_id = 0; SaHpiEventLogEntryIdT next_entry_id = 0; SaHpiEventLogEntryT event_log_entry; SaHpiRdrT rdr; SaHpiRptEntryT rpt_entry; PVERBOSE1("%p Processing saHpiEventLogEntryGet.", thrdid); memset( &rdr, 0, sizeof( SaHpiRdrT ) ); memset( &rpt_entry, 0, sizeof( SaHpiRptEntryT ) ); memset( &event_log_entry, 0, sizeof( SaHpiEventLogEntryT ) ); if ( HpiDemarshalRequest3( request_mFlags & dMhEndianBit, hm, pReq, &session_id, &resource_id, &entry_id ) < 0 ) return eResultError; ret = saHpiEventLogEntryGet( session_id, resource_id, entry_id, &prev_entry_id, &next_entry_id, &event_log_entry, &rdr, &rpt_entry ); thrdinst->header.m_len = HpiMarshalReply5( hm, pReq, &ret, &prev_entry_id, &next_entry_id, &event_log_entry, &rdr, &rpt_entry ); } break; case eFsaHpiEventLogEntryAdd: { SaHpiSessionIdT session_id; SaHpiResourceIdT resource_id; SaHpiEventT evt_entry; PVERBOSE1("%p Processing saHpiEventLogEntryAdd.", thrdid); if ( HpiDemarshalRequest3( request_mFlags & dMhEndianBit, hm, pReq, &session_id, &resource_id, &evt_entry ) < 0 ) return eResultError; ret = saHpiEventLogEntryAdd( session_id, resource_id, &evt_entry ); thrdinst->header.m_len = HpiMarshalReply0( hm, pReq, &ret ); } break; case eFsaHpiEventLogClear: { SaHpiSessionIdT session_id; SaHpiResourceIdT resource_id; PVERBOSE1("%p Processing saHpiEventLogClear.", thrdid); if ( HpiDemarshalRequest2( request_mFlags & dMhEndianBit, hm, pReq, &session_id, &resource_id ) < 0 ) return eResultError; ret = saHpiEventLogClear( session_id, resource_id ); thrdinst->header.m_len = HpiMarshalReply0( hm, pReq, &ret ); } break; case eFsaHpiEventLogTimeGet: { SaHpiSessionIdT session_id; SaHpiResourceIdT resource_id; SaHpiTimeT ti; PVERBOSE1("%p Processing saHpiEventLogTimeGet.", thrdid); if ( HpiDemarshalRequest2( request_mFlags & dMhEndianBit, hm, pReq, &session_id, &resource_id ) < 0 ) return eResultError; ret = saHpiEventLogTimeGet( session_id, resource_id, &ti ); thrdinst->header.m_len = HpiMarshalReply1( hm, pReq, &ret, &ti ); } break; case eFsaHpiEventLogTimeSet: { SaHpiSessionIdT session_id; SaHpiResourceIdT resource_id; SaHpiTimeT ti; PVERBOSE1("%p Processing saHpiEventLogTimeSet.", thrdid); if ( HpiDemarshalRequest3( request_mFlags & dMhEndianBit, hm, pReq, &session_id, &resource_id, &ti ) < 0 ) return eResultError; ret = saHpiEventLogTimeSet( session_id, resource_id, ti ); thrdinst->header.m_len = HpiMarshalReply0( hm, pReq, &ret ); } break; case eFsaHpiEventLogStateGet: { SaHpiSessionIdT session_id; SaHpiResourceIdT resource_id; SaHpiBoolT enable; PVERBOSE1("%p Processing saHpiEventLogStateGet.", thrdid); if ( HpiDemarshalRequest2( request_mFlags & dMhEndianBit, hm, pReq, &session_id, &resource_id ) < 0 ) return eResultError; ret = saHpiEventLogStateGet( session_id, resource_id, &enable ); thrdinst->header.m_len = HpiMarshalReply1( hm, pReq, &ret, &enable ); } break; case eFsaHpiEventLogStateSet: { SaHpiSessionIdT session_id; SaHpiResourceIdT resource_id; SaHpiBoolT enable; PVERBOSE1("%p Processing saHpiEventLogStateSet.", thrdid); if ( HpiDemarshalRequest3( request_mFlags & dMhEndianBit, hm, pReq, &session_id, &resource_id, &enable ) < 0 ) return eResultError; ret = saHpiEventLogStateSet( session_id, resource_id, enable ); thrdinst->header.m_len = HpiMarshalReply0( hm, pReq, &ret ); } break; case eFsaHpiEventLogOverflowReset: { SaHpiSessionIdT session_id; SaHpiResourceIdT resource_id; PVERBOSE1("%p Processing saHpiEventLogOverflowReset.", thrdid); if ( HpiDemarshalRequest2( request_mFlags & dMhEndianBit, hm, pReq, &session_id, &resource_id ) < 0 ) return eResultError; ret = saHpiEventLogOverflowReset( session_id, resource_id ); thrdinst->header.m_len = HpiMarshalReply0( hm, pReq, &ret ); } break; case eFsaHpiSubscribe: { SaHpiSessionIdT session_id; PVERBOSE1("%p Processing saHpiSubscribe.", thrdid); if ( HpiDemarshalRequest1( request_mFlags & dMhEndianBit, hm, pReq, &session_id ) < 0 ) return eResultError; ret = saHpiSubscribe( session_id ); thrdinst->header.m_len = HpiMarshalReply0( hm, pReq, &ret ); } break; case eFsaHpiUnsubscribe: { SaHpiSessionIdT session_id; PVERBOSE1("%p Processing saHpiUnsubscribe.", thrdid); if ( HpiDemarshalRequest1( request_mFlags & dMhEndianBit, hm, pReq, &session_id ) < 0 ) return eResultError; ret = saHpiUnsubscribe( session_id ); thrdinst->header.m_len = HpiMarshalReply0( hm, pReq, &ret ); } break; case eFsaHpiEventGet: { SaHpiSessionIdT session_id; SaHpiTimeoutT timeout; SaHpiEventT event; SaHpiRdrT rdr; SaHpiRptEntryT rpt_entry; SaHpiEvtQueueStatusT status; PVERBOSE1("%p Processing saHpiEventGet.", thrdid); if ( HpiDemarshalRequest2( request_mFlags & dMhEndianBit, hm, pReq, &session_id, &timeout ) < 0 ) return eResultError; ret = saHpiEventGet( session_id, timeout, &event, &rdr, &rpt_entry, &status ); thrdinst->header.m_len = HpiMarshalReply4( hm, pReq, &ret, &event, &rdr, &rpt_entry, &status ); } break; case eFsaHpiEventAdd: { SaHpiSessionIdT session_id; SaHpiEventT event; PVERBOSE1("%p Processing saHpiEventAdd.", thrdid); if ( HpiDemarshalRequest2( request_mFlags & dMhEndianBit, hm, pReq, &session_id, &event ) < 0 ) return eResultError; ret = saHpiEventAdd( session_id, &event ); thrdinst->header.m_len = HpiMarshalReply0( hm, pReq, &ret ); } break; case eFsaHpiAlarmGetNext: { SaHpiSessionIdT session_id; SaHpiSeverityT severity; SaHpiBoolT unack; SaHpiAlarmT alarm; PVERBOSE1("%p Processing saHpiAlarmGetNext.", thrdid); if ( HpiDemarshalRequest4( request_mFlags & dMhEndianBit, hm, pReq, &session_id, &severity, &unack, &alarm ) < 0 ) return eResultError; ret = saHpiAlarmGetNext( session_id, severity, unack, &alarm ); thrdinst->header.m_len = HpiMarshalReply1( hm, pReq, &ret, &alarm ); } break; case eFsaHpiAlarmGet: { SaHpiSessionIdT session_id; SaHpiAlarmIdT alarm_id; SaHpiAlarmT alarm; PVERBOSE1("%p Processing saHpiAlarmGet.", thrdid); if ( HpiDemarshalRequest2( request_mFlags & dMhEndianBit, hm, pReq, &session_id, &alarm_id ) < 0 ) return eResultError; ret = saHpiAlarmGet( session_id, alarm_id, &alarm ); thrdinst->header.m_len = HpiMarshalReply1( hm, pReq, &ret, &alarm ); } break; case eFsaHpiAlarmAcknowledge: { SaHpiSessionIdT session_id; SaHpiAlarmIdT alarm_id; SaHpiSeverityT severity; PVERBOSE1("%p Processing saHpiAlarmAcknowledge.", thrdid); if ( HpiDemarshalRequest3( request_mFlags & dMhEndianBit, hm, pReq, &session_id, &alarm_id, &severity ) < 0 ) return eResultError; ret = saHpiAlarmAcknowledge( session_id, alarm_id, severity ); thrdinst->header.m_len = HpiMarshalReply0( hm, pReq, &ret ); } break; case eFsaHpiAlarmAdd: { SaHpiSessionIdT session_id; SaHpiAlarmT alarm; PVERBOSE1("%p Processing saHpiAlarmAdd.", thrdid); if ( HpiDemarshalRequest2( request_mFlags & dMhEndianBit, hm, pReq, &session_id, &alarm ) < 0 ) return eResultError; ret = saHpiAlarmAdd( session_id, &alarm ); thrdinst->header.m_len = HpiMarshalReply1( hm, pReq, &ret, &alarm ); } break; case eFsaHpiAlarmDelete: { SaHpiSessionIdT session_id; SaHpiAlarmIdT alarm_id; SaHpiSeverityT severity; PVERBOSE1("%p Processing saHpiAlarmDelete.", thrdid); if ( HpiDemarshalRequest3( request_mFlags & dMhEndianBit, hm, pReq, &session_id, &alarm_id, &severity ) < 0 ) return eResultError; ret = saHpiAlarmDelete( session_id, alarm_id, severity ); thrdinst->header.m_len = HpiMarshalReply0( hm, pReq, &ret ); } break; case eFsaHpiRdrGet: { SaHpiSessionIdT session_id; SaHpiResourceIdT resource_id; SaHpiEntryIdT entry_id; SaHpiEntryIdT next_entry_id; SaHpiRdrT rdr; PVERBOSE1("%p Processing saHpiRdrGet.", thrdid); if ( HpiDemarshalRequest3( request_mFlags & dMhEndianBit, hm, pReq, &session_id, &resource_id, &entry_id ) < 0 ) return eResultError; ret = saHpiRdrGet( session_id, resource_id, entry_id, &next_entry_id, &rdr ); thrdinst->header.m_len = HpiMarshalReply2( hm, pReq, &ret, &next_entry_id, &rdr ); } break; case eFsaHpiRdrGetByInstrumentId: { SaHpiSessionIdT session_id; SaHpiResourceIdT resource_id; SaHpiRdrTypeT rdr_type; SaHpiInstrumentIdT inst_id; SaHpiRdrT rdr; PVERBOSE1("%p Processing saHpiRdrGetByInstrumentId.", thrdid); if ( HpiDemarshalRequest4( request_mFlags & dMhEndianBit, hm, pReq, &session_id, &resource_id, &rdr_type, &inst_id ) < 0 ) return eResultError; ret = saHpiRdrGetByInstrumentId( session_id, resource_id, rdr_type, inst_id, &rdr ); thrdinst->header.m_len = HpiMarshalReply1( hm, pReq, &ret, &rdr ); } break; case eFsaHpiRdrUpdateCountGet: { SaHpiSessionIdT session_id; SaHpiResourceIdT resource_id; SaHpiUint32T rdr_update_count; PVERBOSE1("%p Processing saHpiRdrUpdateCountGet.", thrdid); if ( HpiDemarshalRequest2( request_mFlags & dMhEndianBit, hm, pReq, &session_id, &resource_id ) < 0 ) return eResultError; ret = saHpiRdrUpdateCountGet( session_id, resource_id, &rdr_update_count ); thrdinst->header.m_len = HpiMarshalReply1( hm, pReq, &ret, &rdr_update_count ); } break; case eFsaHpiSensorReadingGet: { SaHpiSessionIdT session_id; SaHpiResourceIdT resource_id; SaHpiSensorNumT sensor_num; SaHpiSensorReadingT reading; SaHpiEventStateT state; PVERBOSE1("%p Processing saHpiSensorReadingGet.", thrdid); if ( HpiDemarshalRequest3( request_mFlags & dMhEndianBit, hm, pReq, &session_id, &resource_id, &sensor_num ) < 0 ) return eResultError; ret = saHpiSensorReadingGet( session_id, resource_id, sensor_num, &reading, &state ); thrdinst->header.m_len = HpiMarshalReply2( hm, pReq, &ret, &reading, &state ); } break; case eFsaHpiSensorThresholdsGet: { SaHpiSessionIdT session_id; SaHpiResourceIdT resource_id; SaHpiSensorNumT sensor_num; SaHpiSensorThresholdsT sensor_thresholds; PVERBOSE1("%p Processing saHpiSensorThresholdsGet.", thrdid); if ( HpiDemarshalRequest3( request_mFlags & dMhEndianBit, hm, pReq, &session_id, &resource_id, &sensor_num ) < 0 ) return eResultError; ret = saHpiSensorThresholdsGet( session_id, resource_id, sensor_num, &sensor_thresholds); thrdinst->header.m_len = HpiMarshalReply1( hm, pReq, &ret, &sensor_thresholds ); } break; case eFsaHpiSensorThresholdsSet: { SaHpiSessionIdT session_id; SaHpiResourceIdT resource_id; SaHpiSensorNumT sensor_num; SaHpiSensorThresholdsT sensor_thresholds; PVERBOSE1("%p Processing saHpiSensorThresholdsSet.", thrdid); if ( HpiDemarshalRequest4( request_mFlags & dMhEndianBit, hm, pReq, &session_id, &resource_id, &sensor_num, &sensor_thresholds ) < 0 ) return eResultError; ret = saHpiSensorThresholdsSet( session_id, resource_id, sensor_num, &sensor_thresholds ); thrdinst->header.m_len = HpiMarshalReply0( hm, pReq, &ret ); } break; case eFsaHpiSensorTypeGet: { SaHpiSessionIdT session_id; SaHpiResourceIdT resource_id; SaHpiSensorNumT sensor_num; SaHpiSensorTypeT type; SaHpiEventCategoryT category; PVERBOSE1("%p Processing saHpiSensorTypeGet.", thrdid); if ( HpiDemarshalRequest3( request_mFlags & dMhEndianBit, hm, pReq, &session_id, &resource_id, &sensor_num ) < 0 ) return eResultError; ret = saHpiSensorTypeGet( session_id, resource_id, sensor_num, &type, &category ); thrdinst->header.m_len = HpiMarshalReply2( hm, pReq, &ret, &type, &category ); } break; case eFsaHpiSensorEnableGet: { SaHpiSessionIdT session_id; SaHpiResourceIdT resource_id; SaHpiSensorNumT sensor_num; SaHpiBoolT enabled; PVERBOSE1("%p Processing saHpiSensorEnableGet.", thrdid); if ( HpiDemarshalRequest3( request_mFlags & dMhEndianBit, hm, pReq, &session_id, &resource_id, &sensor_num ) < 0 ) return eResultError; ret = saHpiSensorEnableGet( session_id, resource_id, sensor_num, &enabled ); thrdinst->header.m_len = HpiMarshalReply1( hm, pReq, &ret, &enabled ); } break; case eFsaHpiSensorEnableSet: { SaHpiSessionIdT session_id; SaHpiResourceIdT resource_id; SaHpiSensorNumT sensor_num; SaHpiBoolT enabled; PVERBOSE1("%p Processing saHpiSensorEnableSet.", thrdid); if ( HpiDemarshalRequest4( request_mFlags & dMhEndianBit, hm, pReq, &session_id, &resource_id, &sensor_num, &enabled ) < 0 ) return eResultError; ret = saHpiSensorEnableSet( session_id, resource_id, sensor_num, enabled ); thrdinst->header.m_len = HpiMarshalReply0( hm, pReq, &ret ); } break; case eFsaHpiSensorEventEnableGet: { SaHpiSessionIdT session_id; SaHpiResourceIdT resource_id; SaHpiSensorNumT sensor_num; SaHpiBoolT enables; PVERBOSE1("%p Processing saHpiSensorEventEnableGet.", thrdid); if ( HpiDemarshalRequest3( request_mFlags & dMhEndianBit, hm, pReq, &session_id, &resource_id, &sensor_num ) < 0 ) return eResultError; ret = saHpiSensorEventEnableGet( session_id, resource_id, sensor_num, &enables ); thrdinst->header.m_len = HpiMarshalReply1( hm, pReq, &ret, &enables ); } break; case eFsaHpiSensorEventEnableSet: { SaHpiSessionIdT session_id; SaHpiResourceIdT resource_id; SaHpiSensorNumT sensor_num; SaHpiBoolT enables; PVERBOSE1("%p Processing saHpiSensorEventEnableSet.", thrdid); if ( HpiDemarshalRequest4( request_mFlags & dMhEndianBit, hm, pReq, &session_id, &resource_id, &sensor_num, &enables ) < 0 ) return eResultError; ret = saHpiSensorEventEnableSet( session_id, resource_id, sensor_num, enables ); thrdinst->header.m_len = HpiMarshalReply0( hm, pReq, &ret ); } break; case eFsaHpiSensorEventMasksGet: { SaHpiSessionIdT session_id; SaHpiResourceIdT resource_id; SaHpiSensorNumT sensor_num; SaHpiEventStateT assert_mask; SaHpiEventStateT deassert_mask; PVERBOSE1("%p Processing saHpiSensorEventMasksGet.", thrdid); if ( HpiDemarshalRequest5( request_mFlags & dMhEndianBit, hm, pReq, &session_id, &resource_id, &sensor_num, &assert_mask, &deassert_mask ) < 0 ) return eResultError; ret = saHpiSensorEventMasksGet( session_id, resource_id, sensor_num, &assert_mask, &deassert_mask ); thrdinst->header.m_len = HpiMarshalReply2( hm, pReq, &ret, &assert_mask, &deassert_mask ); } break; case eFsaHpiSensorEventMasksSet: { SaHpiSessionIdT session_id; SaHpiResourceIdT resource_id; SaHpiSensorNumT sensor_num; SaHpiSensorEventMaskActionT action; SaHpiEventStateT assert_mask; SaHpiEventStateT deassert_mask; PVERBOSE1("%p Processing saHpiSensorEventMasksSet.", thrdid); if ( HpiDemarshalRequest6( request_mFlags & dMhEndianBit, hm, pReq, &session_id, &resource_id, &sensor_num, &action, &assert_mask, &deassert_mask ) < 0 ) return eResultError; ret = saHpiSensorEventMasksSet( session_id, resource_id, sensor_num, action, assert_mask, deassert_mask ); thrdinst->header.m_len = HpiMarshalReply0( hm, pReq, &ret ); } break; case eFsaHpiControlTypeGet: { SaHpiSessionIdT session_id; SaHpiResourceIdT resource_id; SaHpiCtrlNumT ctrl_num; SaHpiCtrlTypeT type; PVERBOSE1("%p Processing saHpiControlTypeGet.", thrdid); if ( HpiDemarshalRequest3( request_mFlags & dMhEndianBit, hm, pReq, &session_id, &resource_id, &ctrl_num ) < 0 ) return eResultError; ret = saHpiControlTypeGet( session_id, resource_id, ctrl_num, &type ); thrdinst->header.m_len = HpiMarshalReply1( hm, pReq, &ret, &type ); } break; case eFsaHpiControlGet: { SaHpiSessionIdT session_id; SaHpiResourceIdT resource_id; SaHpiCtrlNumT ctrl_num; SaHpiCtrlModeT ctrl_mode; SaHpiCtrlStateT ctrl_state; PVERBOSE1("%p Processing saHpiControlGet.", thrdid); if ( HpiDemarshalRequest4( request_mFlags & dMhEndianBit, hm, pReq, &session_id, &resource_id, &ctrl_num, &ctrl_state ) < 0 ) return eResultError; ret = saHpiControlGet( session_id, resource_id, ctrl_num, &ctrl_mode, &ctrl_state ); thrdinst->header.m_len = HpiMarshalReply2( hm, pReq, &ret, &ctrl_mode, &ctrl_state ); } break; case eFsaHpiControlSet: { SaHpiSessionIdT session_id; SaHpiResourceIdT resource_id; SaHpiCtrlNumT ctrl_num; SaHpiCtrlModeT ctrl_mode; SaHpiCtrlStateT ctrl_state; PVERBOSE1("%p Processing saHpiControlSet.", thrdid); if ( HpiDemarshalRequest5( request_mFlags & dMhEndianBit, hm, pReq, &session_id, &resource_id, &ctrl_num, &ctrl_mode, &ctrl_state ) < 0 ) return eResultError; ret = saHpiControlSet( session_id, resource_id, ctrl_num, ctrl_mode, &ctrl_state ); thrdinst->header.m_len = HpiMarshalReply0( hm, pReq, &ret ); } break; case eFsaHpiIdrInfoGet: { SaHpiSessionIdT session_id; SaHpiResourceIdT resource_id; SaHpiIdrIdT idr_id; SaHpiIdrInfoT info; PVERBOSE1("%p Processing saHpiIdrInfoGet.", thrdid); if ( HpiDemarshalRequest3( request_mFlags & dMhEndianBit, hm, pReq, &session_id, &resource_id, &idr_id ) < 0 ) return eResultError; ret = saHpiIdrInfoGet( session_id, resource_id, idr_id, &info ); thrdinst->header.m_len = HpiMarshalReply1( hm, pReq, &ret, &info ); } break; case eFsaHpiIdrAreaHeaderGet: { SaHpiSessionIdT session_id; SaHpiResourceIdT resource_id; SaHpiIdrIdT idr_id; SaHpiIdrAreaTypeT area; SaHpiEntryIdT area_id; SaHpiEntryIdT next; SaHpiIdrAreaHeaderT header; PVERBOSE1("%p Processing saHpiIdrAreaHeaderGet.", thrdid); if ( HpiDemarshalRequest5( request_mFlags & dMhEndianBit, hm, pReq, &session_id, &resource_id, &idr_id, &area, &area_id ) < 0 ) return eResultError; ret = saHpiIdrAreaHeaderGet( session_id, resource_id, idr_id, area, area_id, &next, &header ); thrdinst->header.m_len = HpiMarshalReply2( hm, pReq, &ret, &next, &header ); } break; case eFsaHpiIdrAreaAdd: { SaHpiSessionIdT session_id; SaHpiResourceIdT resource_id; SaHpiIdrIdT idr_id; SaHpiIdrAreaTypeT area; SaHpiEntryIdT area_id; PVERBOSE1("%p Processing saHpiIdrAreaAdd.", thrdid); if ( HpiDemarshalRequest4( request_mFlags & dMhEndianBit, hm, pReq, &session_id, &resource_id, &idr_id, &area ) < 0 ) return eResultError; ret = saHpiIdrAreaAdd( session_id, resource_id, idr_id, area, &area_id ); thrdinst->header.m_len = HpiMarshalReply1( hm, pReq, &ret, &area_id ); } break; case eFsaHpiIdrAreaAddById: { SaHpiSessionIdT session_id; SaHpiResourceIdT resource_id; SaHpiIdrIdT idr_id; SaHpiIdrAreaTypeT area_type; SaHpiEntryIdT area_id; PVERBOSE1("%p Processing saHpiIdrAreaAddById.", thrdid); if ( HpiDemarshalRequest5( request_mFlags & dMhEndianBit, hm, pReq, &session_id, &resource_id, &idr_id, &area_type, &area_id ) < 0 ) return eResultError; ret = saHpiIdrAreaAddById( session_id, resource_id, idr_id, area_type, area_id ); thrdinst->header.m_len = HpiMarshalReply0( hm, pReq, &ret ); } break; case eFsaHpiIdrAreaDelete: { SaHpiSessionIdT session_id; SaHpiResourceIdT resource_id; SaHpiIdrIdT idr_id; SaHpiEntryIdT area_id; PVERBOSE1("%p Processing saHpiIdrAreaAdd.", thrdid); if ( HpiDemarshalRequest4( request_mFlags & dMhEndianBit, hm, pReq, &session_id, &resource_id, &idr_id, &area_id ) < 0 ) return eResultError; ret = saHpiIdrAreaDelete( session_id, resource_id, idr_id, area_id ); thrdinst->header.m_len = HpiMarshalReply0( hm, pReq, &ret ); } break; case eFsaHpiIdrFieldGet: { SaHpiSessionIdT session_id; SaHpiResourceIdT resource_id; SaHpiIdrIdT idr_id; SaHpiEntryIdT area_id; SaHpiIdrFieldTypeT type; SaHpiEntryIdT field_id; SaHpiEntryIdT next; SaHpiIdrFieldT field; PVERBOSE1("%p Processing saHpiIdrFieldGet.", thrdid); if ( HpiDemarshalRequest6( request_mFlags & dMhEndianBit, hm, pReq, &session_id, &resource_id, &idr_id, &area_id, &type, &field_id ) < 0 ) return eResultError; ret = saHpiIdrFieldGet( session_id, resource_id, idr_id, area_id, type, field_id, &next, &field ); thrdinst->header.m_len = HpiMarshalReply2( hm, pReq, &ret, &next, &field ); } break; case eFsaHpiIdrFieldAdd: { SaHpiSessionIdT session_id; SaHpiResourceIdT resource_id; SaHpiIdrIdT idr_id; SaHpiIdrFieldT field; PVERBOSE1("%p Processing saHpiIdrFieldAdd.", thrdid); if ( HpiDemarshalRequest4( request_mFlags & dMhEndianBit, hm, pReq, &session_id, &resource_id, &idr_id, &field ) < 0 ) return eResultError; ret = saHpiIdrFieldAdd( session_id, resource_id, idr_id, &field ); thrdinst->header.m_len = HpiMarshalReply1( hm, pReq, &ret, &field ); } break; case eFsaHpiIdrFieldAddById: { SaHpiSessionIdT session_id; SaHpiResourceIdT resource_id; SaHpiIdrIdT idr_id; SaHpiIdrFieldT field; PVERBOSE1("%p Processing saHpiIdrFieldAddById.", thrdid); if ( HpiDemarshalRequest4( request_mFlags & dMhEndianBit, hm, pReq, &session_id, &resource_id, &idr_id, &field ) < 0 ) return eResultError; ret = saHpiIdrFieldAddById( session_id, resource_id, idr_id, &field ); thrdinst->header.m_len = HpiMarshalReply1( hm, pReq, &ret, &field ); } break; case eFsaHpiIdrFieldSet: { SaHpiSessionIdT session_id; SaHpiResourceIdT resource_id; SaHpiIdrIdT idr_id; SaHpiIdrFieldT field; PVERBOSE1("%p Processing saHpiIdrFieldSet.", thrdid); if ( HpiDemarshalRequest4( request_mFlags & dMhEndianBit, hm, pReq, &session_id, &resource_id, &idr_id, &field ) < 0 ) return eResultError; ret = saHpiIdrFieldSet( session_id, resource_id, idr_id, &field ); thrdinst->header.m_len = HpiMarshalReply0( hm, pReq, &ret ); } break; case eFsaHpiIdrFieldDelete: { SaHpiSessionIdT session_id; SaHpiResourceIdT resource_id; SaHpiIdrIdT idr_id; SaHpiEntryIdT area_id; SaHpiEntryIdT field_id; PVERBOSE1("%p Processing saHpiIdrFieldSet.", thrdid); if ( HpiDemarshalRequest5( request_mFlags & dMhEndianBit, hm, pReq, &session_id, &resource_id, &idr_id, &area_id, &field_id ) < 0 ) return eResultError; ret = saHpiIdrFieldDelete( session_id, resource_id, idr_id, area_id, field_id ); thrdinst->header.m_len = HpiMarshalReply0( hm, pReq, &ret ); } break; case eFsaHpiWatchdogTimerGet: { SaHpiSessionIdT session_id; SaHpiResourceIdT resource_id; SaHpiWatchdogNumT watchdog_num; SaHpiWatchdogT watchdog; PVERBOSE1("%p Processing saHpiWatchdogTimerGet.", thrdid); if ( HpiDemarshalRequest3( request_mFlags & dMhEndianBit, hm, pReq, &session_id, &resource_id, &watchdog_num ) < 0 ) return eResultError; ret = saHpiWatchdogTimerGet( session_id, resource_id, watchdog_num, &watchdog ); thrdinst->header.m_len = HpiMarshalReply1( hm, pReq, &ret, &watchdog ); } break; case eFsaHpiWatchdogTimerSet: { SaHpiSessionIdT session_id; SaHpiResourceIdT resource_id; SaHpiWatchdogNumT watchdog_num; SaHpiWatchdogT watchdog; PVERBOSE1("%p Processing saHpiWatchdogTimerSet.", thrdid); if ( HpiDemarshalRequest4( request_mFlags & dMhEndianBit, hm, pReq, &session_id, &resource_id, &watchdog_num, &watchdog ) < 0 ) return eResultError; ret = saHpiWatchdogTimerSet( session_id, resource_id, watchdog_num, &watchdog ); thrdinst->header.m_len = HpiMarshalReply0( hm, pReq, &ret ); } break; case eFsaHpiWatchdogTimerReset: { SaHpiSessionIdT session_id; SaHpiResourceIdT resource_id; SaHpiWatchdogNumT watchdog_num; PVERBOSE1("%p Processing saHpiWatchdogTimerReset.", thrdid); if ( HpiDemarshalRequest3( request_mFlags & dMhEndianBit, hm, pReq, &session_id, &resource_id, &watchdog_num ) < 0 ) return eResultError; ret = saHpiWatchdogTimerReset( session_id, resource_id, watchdog_num ); thrdinst->header.m_len = HpiMarshalReply0( hm, pReq, &ret ); } break; case eFsaHpiAnnunciatorGetNext: { SaHpiSessionIdT session_id; SaHpiResourceIdT resource_id; SaHpiAnnunciatorNumT annun_num; SaHpiSeverityT severity; SaHpiBoolT unack; SaHpiAnnouncementT announcement; PVERBOSE1("%p Processing saHpiAnnunciatorGetNext.", thrdid); if ( HpiDemarshalRequest6( request_mFlags & dMhEndianBit, hm, pReq, &session_id, &resource_id, &annun_num, &severity, &unack, &announcement ) < 0 ) return eResultError; ret = saHpiAnnunciatorGetNext( session_id, resource_id, annun_num, severity, unack, &announcement ); thrdinst->header.m_len = HpiMarshalReply1( hm, pReq, &ret, &announcement ); } break; case eFsaHpiAnnunciatorGet: { SaHpiSessionIdT session_id; SaHpiResourceIdT resource_id; SaHpiAnnunciatorNumT annun_num; SaHpiEntryIdT entry_id; SaHpiAnnouncementT announcement; PVERBOSE1("%p Processing saHpiAnnunciatorGet.", thrdid); if ( HpiDemarshalRequest4( request_mFlags & dMhEndianBit, hm, pReq, &session_id, &resource_id, &annun_num, &entry_id ) < 0 ) return eResultError; ret = saHpiAnnunciatorGet( session_id, resource_id, annun_num, entry_id, &announcement ); thrdinst->header.m_len = HpiMarshalReply1( hm, pReq, &ret, &announcement ); } break; case eFsaHpiAnnunciatorAcknowledge: { SaHpiSessionIdT session_id; SaHpiResourceIdT resource_id; SaHpiAnnunciatorNumT annun_num; SaHpiEntryIdT entry_id; SaHpiSeverityT severity; PVERBOSE1("%p Processing saHpiAnnunciatorAcknowledge.", thrdid); if ( HpiDemarshalRequest5( request_mFlags & dMhEndianBit, hm, pReq, &session_id, &resource_id, &annun_num, &entry_id, &severity ) < 0 ) return eResultError; ret = saHpiAnnunciatorAcknowledge( session_id, resource_id, annun_num, entry_id, severity ); thrdinst->header.m_len = HpiMarshalReply0( hm, pReq, &ret ); } break; case eFsaHpiAnnunciatorAdd: { SaHpiSessionIdT session_id; SaHpiResourceIdT resource_id; SaHpiAnnunciatorNumT annun_num; SaHpiAnnouncementT announcement; PVERBOSE1("%p Processing saHpiAnnunciatorAdd.", thrdid); if ( HpiDemarshalRequest4( request_mFlags & dMhEndianBit, hm, pReq, &session_id, &resource_id, &annun_num, &announcement ) < 0 ) return eResultError; ret = saHpiAnnunciatorAdd( session_id, resource_id, annun_num, &announcement ); thrdinst->header.m_len = HpiMarshalReply1( hm, pReq, &ret, &announcement ); } break; case eFsaHpiAnnunciatorDelete: { SaHpiSessionIdT session_id; SaHpiResourceIdT resource_id; SaHpiAnnunciatorNumT annun_num; SaHpiEntryIdT entry_id; SaHpiSeverityT severity; PVERBOSE1("%p Processing saHpiAnnunciatorAdd.", thrdid); if ( HpiDemarshalRequest5( request_mFlags & dMhEndianBit, hm, pReq, &session_id, &resource_id, &annun_num, &entry_id, &severity ) < 0 ) return eResultError; ret = saHpiAnnunciatorDelete( session_id, resource_id, annun_num, entry_id, severity ); thrdinst->header.m_len = HpiMarshalReply0( hm, pReq, &ret ); } break; case eFsaHpiAnnunciatorModeGet: { SaHpiSessionIdT session_id; SaHpiResourceIdT resource_id; SaHpiAnnunciatorNumT annun_num; SaHpiAnnunciatorModeT mode; PVERBOSE1("%p Processing saHpiAnnunciatorModeGet.", thrdid); if ( HpiDemarshalRequest3( request_mFlags & dMhEndianBit, hm, pReq, &session_id, &resource_id, &annun_num ) < 0 ) return eResultError; ret = saHpiAnnunciatorModeGet( session_id, resource_id, annun_num, &mode ); thrdinst->header.m_len = HpiMarshalReply1( hm, pReq, &ret, &mode ); } break; case eFsaHpiAnnunciatorModeSet: { SaHpiSessionIdT session_id; SaHpiResourceIdT resource_id; SaHpiAnnunciatorNumT annun_num; SaHpiAnnunciatorModeT mode; PVERBOSE1("%p Processing saHpiAnnunciatorModeSet.", thrdid); if ( HpiDemarshalRequest4( request_mFlags & dMhEndianBit, hm, pReq, &session_id, &resource_id, &annun_num, &mode ) < 0 ) return eResultError; ret = saHpiAnnunciatorModeSet( session_id, resource_id, annun_num, mode ); thrdinst->header.m_len = HpiMarshalReply0( hm, pReq, &ret ); } break; case eFsaHpiDimiInfoGet: { SaHpiSessionIdT session_id; SaHpiResourceIdT resource_id; SaHpiDimiNumT dimi_num; SaHpiDimiInfoT info; PVERBOSE1("%p Processing saHpiDimiInfoGet.", thrdid); if ( HpiDemarshalRequest3( request_mFlags & dMhEndianBit, hm, pReq, &session_id, &resource_id, &dimi_num ) < 0 ) return eResultError; ret = saHpiDimiInfoGet( session_id, resource_id, dimi_num, &info ); thrdinst->header.m_len = HpiMarshalReply1( hm, pReq, &ret, &info ); } break; case eFsaHpiDimiTestInfoGet: { SaHpiSessionIdT session_id; SaHpiResourceIdT resource_id; SaHpiDimiNumT dimi_num; SaHpiDimiTestNumT test_num; SaHpiDimiTestT test; PVERBOSE1("%p Processing saHpiDimiTestInfoGet.", thrdid); if (HpiDemarshalRequest4(request_mFlags & dMhEndianBit, hm, pReq, &session_id, &resource_id, &dimi_num, &test_num) < 0) return eResultError; ret = saHpiDimiTestInfoGet(session_id, resource_id, dimi_num, test_num, &test); thrdinst->header.m_len = HpiMarshalReply1(hm, pReq, &ret, &test); } break; case eFsaHpiDimiTestReadinessGet: { SaHpiSessionIdT session_id; SaHpiResourceIdT resource_id; SaHpiDimiNumT dimi_num; SaHpiDimiTestNumT test_num; SaHpiDimiReadyT ready; PVERBOSE1("%p Processing saHpiDimiTestReadinessGet.", thrdid); if (HpiDemarshalRequest4(request_mFlags & dMhEndianBit, hm, pReq, &session_id, &resource_id, &dimi_num, &test_num) < 0) return eResultError; ret = saHpiDimiTestReadinessGet(session_id, resource_id, dimi_num, test_num, &ready); thrdinst->header.m_len = HpiMarshalReply1(hm, pReq, &ret, &ready); } break; case eFsaHpiDimiTestStart: { SaHpiSessionIdT session_id; SaHpiResourceIdT resource_id; SaHpiDimiNumT dimi_num; SaHpiDimiTestNumT test_num; SaHpiDimiTestVariableParamsListT params_list; PVERBOSE1("%p Processing saHpiDimiTestStart.", thrdid); if (HpiDemarshalRequest5(request_mFlags & dMhEndianBit, hm, pReq, &session_id, &resource_id, &dimi_num, &test_num, ¶ms_list) < 0) return eResultError; ret = saHpiDimiTestStart(session_id, resource_id, dimi_num, test_num, params_list.NumberOfParams, params_list.ParamsList); free(params_list.ParamsList); thrdinst->header.m_len = HpiMarshalReply0(hm, pReq, &ret); } break; case eFsaHpiDimiTestCancel: { SaHpiSessionIdT session_id; SaHpiResourceIdT resource_id; SaHpiDimiNumT dimi_num; SaHpiDimiTestNumT test_num; PVERBOSE1("%p Processing saHpiDimiTestCancel.", thrdid); if (HpiDemarshalRequest4(request_mFlags & dMhEndianBit, hm, pReq, &session_id, &resource_id, &dimi_num, &test_num) < 0) return eResultError; ret = saHpiDimiTestCancel(session_id, resource_id, dimi_num, test_num); thrdinst->header.m_len = HpiMarshalReply0(hm, pReq, &ret); } break; case eFsaHpiDimiTestStatusGet: { SaHpiSessionIdT session_id; SaHpiResourceIdT resource_id; SaHpiDimiNumT dimi_num; SaHpiDimiTestNumT test_num; SaHpiDimiTestPercentCompletedT percent; SaHpiDimiTestRunStatusT status; PVERBOSE1("%p Processing saHpiDimiTestStatusGet.", thrdid); if (HpiDemarshalRequest4(request_mFlags & dMhEndianBit, hm, pReq, &session_id, &resource_id, &dimi_num, &test_num) < 0) return eResultError; ret = saHpiDimiTestStatusGet(session_id, resource_id, dimi_num, test_num, &percent, &status); thrdinst->header.m_len = HpiMarshalReply2(hm, pReq, &ret, &percent, &status); } break; case eFsaHpiDimiTestResultsGet: { SaHpiSessionIdT session_id; SaHpiResourceIdT resource_id; SaHpiDimiNumT dimi_num; SaHpiDimiTestNumT test_num; SaHpiDimiTestResultsT results; PVERBOSE1("%p Processing saHpiDimiTestResultsGet.", thrdid); if (HpiDemarshalRequest4(request_mFlags & dMhEndianBit, hm, pReq, &session_id, &resource_id, &dimi_num, &test_num) < 0) return eResultError; ret = saHpiDimiTestResultsGet(session_id, resource_id, dimi_num, test_num, &results); thrdinst->header.m_len = HpiMarshalReply1(hm, pReq, &ret, &results); } break; case eFsaHpiFumiSpecInfoGet: { SaHpiSessionIdT session_id; SaHpiResourceIdT resource_id; SaHpiFumiNumT fumi_num; SaHpiFumiSpecInfoT spec_info; PVERBOSE1("%p Processing saHpiFumiSpecInfoGet.", thrdid); if (HpiDemarshalRequest3(request_mFlags & dMhEndianBit, hm, pReq, &session_id, &resource_id, &fumi_num) < 0) return eResultError; ret = saHpiFumiSpecInfoGet(session_id, resource_id, fumi_num, &spec_info ); thrdinst->header.m_len = HpiMarshalReply1(hm, pReq, &ret, &spec_info); } break; case eFsaHpiFumiServiceImpactGet: { SaHpiSessionIdT session_id; SaHpiResourceIdT resource_id; SaHpiFumiNumT fumi_num; SaHpiFumiServiceImpactDataT service_impact; PVERBOSE1("%p Processing saHpiFumiServiceImpactGet.", thrdid); if (HpiDemarshalRequest3(request_mFlags & dMhEndianBit, hm, pReq, &session_id, &resource_id, &fumi_num) < 0) return eResultError; ret = saHpiFumiServiceImpactGet(session_id, resource_id, fumi_num, &service_impact ); thrdinst->header.m_len = HpiMarshalReply1(hm, pReq, &ret, &service_impact); } break; case eFsaHpiFumiSourceSet: { SaHpiSessionIdT session_id; SaHpiResourceIdT resource_id; SaHpiFumiNumT fumi_num; SaHpiBankNumT bank_num; SaHpiTextBufferT source_uri; PVERBOSE1("%p Processing saHpiFumiSourceSet.", thrdid); if (HpiDemarshalRequest5(request_mFlags & dMhEndianBit, hm, pReq, &session_id, &resource_id, &fumi_num, &bank_num, &source_uri) < 0) return eResultError; ret = saHpiFumiSourceSet(session_id, resource_id, fumi_num, bank_num, &source_uri); thrdinst->header.m_len = HpiMarshalReply0(hm, pReq, &ret); } break; case eFsaHpiFumiSourceInfoValidateStart: { SaHpiSessionIdT session_id; SaHpiResourceIdT resource_id; SaHpiFumiNumT fumi_num; SaHpiBankNumT bank_num; PVERBOSE1("%p Processing saHpiFumiSourceInfoValidateStart.", thrdid); if (HpiDemarshalRequest4(request_mFlags & dMhEndianBit, hm, pReq, &session_id, &resource_id, &fumi_num, &bank_num) < 0) return eResultError; ret = saHpiFumiSourceInfoValidateStart(session_id, resource_id, fumi_num, bank_num); thrdinst->header.m_len = HpiMarshalReply0(hm, pReq, &ret); } break; case eFsaHpiFumiSourceInfoGet: { SaHpiSessionIdT session_id; SaHpiResourceIdT resource_id; SaHpiFumiNumT fumi_num; SaHpiBankNumT bank_num; SaHpiFumiSourceInfoT source_info; PVERBOSE1("%p Processing saHpiFumiSourceInfoGet.", thrdid); if (HpiDemarshalRequest4(request_mFlags & dMhEndianBit, hm, pReq, &session_id, &resource_id, &fumi_num, &bank_num) < 0) return eResultError; ret = saHpiFumiSourceInfoGet(session_id, resource_id, fumi_num, bank_num, &source_info); thrdinst->header.m_len = HpiMarshalReply1(hm, pReq, &ret, &source_info); } break; case eFsaHpiFumiSourceComponentInfoGet: { SaHpiSessionIdT session_id; SaHpiResourceIdT resource_id; SaHpiFumiNumT fumi_num; SaHpiBankNumT bank_num; SaHpiEntryIdT entry_id; SaHpiEntryIdT next_entry_id = 0; SaHpiFumiComponentInfoT component_info; PVERBOSE1("%p Processing saHpiFumiSourceComponentInfoGet.", thrdid); if (HpiDemarshalRequest5(request_mFlags & dMhEndianBit, hm, pReq, &session_id, &resource_id, &fumi_num, &bank_num, &entry_id ) < 0) return eResultError; ret = saHpiFumiSourceComponentInfoGet(session_id, resource_id, fumi_num, bank_num, entry_id, &next_entry_id, &component_info ); thrdinst->header.m_len = HpiMarshalReply2(hm, pReq, &ret, &next_entry_id, &component_info); } break; case eFsaHpiFumiTargetInfoGet: { SaHpiSessionIdT session_id; SaHpiResourceIdT resource_id; SaHpiFumiNumT fumi_num; SaHpiBankNumT bank_num; SaHpiFumiBankInfoT bank_info; PVERBOSE1("%p Processing saHpiFumiTargetInfoGet.", thrdid); if (HpiDemarshalRequest4(request_mFlags & dMhEndianBit, hm, pReq, &session_id, &resource_id, &fumi_num, &bank_num) < 0) return eResultError; ret = saHpiFumiTargetInfoGet(session_id, resource_id, fumi_num, bank_num, &bank_info); thrdinst->header.m_len = HpiMarshalReply1(hm, pReq, &ret, &bank_info); } break; case eFsaHpiFumiTargetComponentInfoGet: { SaHpiSessionIdT session_id; SaHpiResourceIdT resource_id; SaHpiFumiNumT fumi_num; SaHpiBankNumT bank_num; SaHpiEntryIdT entry_id; SaHpiEntryIdT next_entry_id = 0; SaHpiFumiComponentInfoT component_info; PVERBOSE1("%p Processing saHpiFumiTargetComponentInfoGet.", thrdid); if (HpiDemarshalRequest5(request_mFlags & dMhEndianBit, hm, pReq, &session_id, &resource_id, &fumi_num, &bank_num, &entry_id ) < 0) return eResultError; ret = saHpiFumiTargetComponentInfoGet(session_id, resource_id, fumi_num, bank_num, entry_id, &next_entry_id, &component_info ); thrdinst->header.m_len = HpiMarshalReply2(hm, pReq, &ret, &next_entry_id, &component_info); } break; case eFsaHpiFumiLogicalTargetInfoGet: { SaHpiSessionIdT session_id; SaHpiResourceIdT resource_id; SaHpiFumiNumT fumi_num; SaHpiFumiLogicalBankInfoT bank_info; PVERBOSE1("%p Processing saHpiFumiLogicalTargetInfoGet.", thrdid); if (HpiDemarshalRequest3(request_mFlags & dMhEndianBit, hm, pReq, &session_id, &resource_id, &fumi_num) < 0) return eResultError; ret = saHpiFumiLogicalTargetInfoGet(session_id, resource_id, fumi_num, &bank_info); thrdinst->header.m_len = HpiMarshalReply1(hm, pReq, &ret, &bank_info); } break; case eFsaHpiFumiLogicalTargetComponentInfoGet: { SaHpiSessionIdT session_id; SaHpiResourceIdT resource_id; SaHpiFumiNumT fumi_num; SaHpiEntryIdT entry_id; SaHpiEntryIdT next_entry_id = 0; SaHpiFumiLogicalComponentInfoT component_info; PVERBOSE1("%p Processing saHpiFumiLogicalTargetComponentInfoGet.", thrdid); if (HpiDemarshalRequest4(request_mFlags & dMhEndianBit, hm, pReq, &session_id, &resource_id, &fumi_num, &entry_id ) < 0) return eResultError; ret = saHpiFumiLogicalTargetComponentInfoGet(session_id, resource_id, fumi_num, entry_id, &next_entry_id, &component_info ); thrdinst->header.m_len = HpiMarshalReply2(hm, pReq, &ret, &next_entry_id, &component_info); } break; case eFsaHpiFumiBackupStart: { SaHpiSessionIdT session_id; SaHpiResourceIdT resource_id; SaHpiFumiNumT fumi_num; PVERBOSE1("%p Processing saHpiFumiBackupStart.", thrdid); if (HpiDemarshalRequest3(request_mFlags & dMhEndianBit, hm, pReq, &session_id, &resource_id, &fumi_num) < 0) return eResultError; ret = saHpiFumiBackupStart(session_id, resource_id, fumi_num); thrdinst->header.m_len = HpiMarshalReply0(hm, pReq, &ret); } break; case eFsaHpiFumiBankBootOrderSet: { SaHpiSessionIdT session_id; SaHpiResourceIdT resource_id; SaHpiFumiNumT fumi_num; SaHpiBankNumT bank_num; SaHpiUint32T position; PVERBOSE1("%p Processing saHpiFumiBankBootOrderSet.", thrdid); if (HpiDemarshalRequest5(request_mFlags & dMhEndianBit, hm, pReq, &session_id, &resource_id, &fumi_num, &bank_num, &position) < 0) return eResultError; ret = saHpiFumiBankBootOrderSet(session_id, resource_id, fumi_num, bank_num, position); thrdinst->header.m_len = HpiMarshalReply0(hm, pReq, &ret); } break; case eFsaHpiFumiBankCopyStart: { SaHpiSessionIdT session_id; SaHpiResourceIdT resource_id; SaHpiFumiNumT fumi_num; SaHpiBankNumT source_bank; SaHpiBankNumT target_bank; PVERBOSE1("%p Processing saHpiFumiBankCopyStart.", thrdid); if (HpiDemarshalRequest5(request_mFlags & dMhEndianBit, hm, pReq, &session_id, &resource_id, &fumi_num, &source_bank, &target_bank) < 0) return eResultError; ret = saHpiFumiBankCopyStart(session_id, resource_id, fumi_num, source_bank, target_bank); thrdinst->header.m_len = HpiMarshalReply0(hm, pReq, &ret); } break; case eFsaHpiFumiInstallStart: { SaHpiSessionIdT session_id; SaHpiResourceIdT resource_id; SaHpiFumiNumT fumi_num; SaHpiBankNumT bank_num; PVERBOSE1("%p Processing saHpiFumiInstallStart.", thrdid); if (HpiDemarshalRequest4(request_mFlags & dMhEndianBit, hm, pReq, &session_id, &resource_id, &fumi_num, &bank_num) < 0) return eResultError; ret = saHpiFumiInstallStart(session_id, resource_id, fumi_num, bank_num); thrdinst->header.m_len = HpiMarshalReply0(hm, pReq, &ret); } break; case eFsaHpiFumiUpgradeStatusGet: { SaHpiSessionIdT session_id; SaHpiResourceIdT resource_id; SaHpiFumiNumT fumi_num; SaHpiBankNumT bank_num; SaHpiFumiUpgradeStatusT status; PVERBOSE1("%p Processing saHpiFumiUpgradeStatusGet.", thrdid); if (HpiDemarshalRequest4(request_mFlags & dMhEndianBit, hm, pReq, &session_id, &resource_id, &fumi_num, &bank_num) < 0) return eResultError; ret = saHpiFumiUpgradeStatusGet(session_id, resource_id, fumi_num, bank_num, &status); thrdinst->header.m_len = HpiMarshalReply1(hm, pReq, &ret, &status); } break; case eFsaHpiFumiTargetVerifyStart: { SaHpiSessionIdT session_id; SaHpiResourceIdT resource_id; SaHpiFumiNumT fumi_num; SaHpiBankNumT bank_num; PVERBOSE1("%p Processing saHpiFumiTargetVerifyStart.", thrdid); if (HpiDemarshalRequest4(request_mFlags & dMhEndianBit, hm, pReq, &session_id, &resource_id, &fumi_num, &bank_num) < 0) return eResultError; ret = saHpiFumiTargetVerifyStart(session_id, resource_id, fumi_num, bank_num); thrdinst->header.m_len = HpiMarshalReply0(hm, pReq, &ret); } break; case eFsaHpiFumiTargetVerifyMainStart: { SaHpiSessionIdT session_id; SaHpiResourceIdT resource_id; SaHpiFumiNumT fumi_num; PVERBOSE1("%p Processing saHpiFumiTargetVerifyMainStart.", thrdid); if (HpiDemarshalRequest3(request_mFlags & dMhEndianBit, hm, pReq, &session_id, &resource_id, &fumi_num) < 0) return eResultError; ret = saHpiFumiTargetVerifyMainStart(session_id, resource_id, fumi_num); thrdinst->header.m_len = HpiMarshalReply0(hm, pReq, &ret); } break; case eFsaHpiFumiUpgradeCancel: { SaHpiSessionIdT session_id; SaHpiResourceIdT resource_id; SaHpiFumiNumT fumi_num; SaHpiBankNumT bank_num; PVERBOSE1("%p Processing saHpiFumiUpgradeCancel.", thrdid); if (HpiDemarshalRequest4(request_mFlags & dMhEndianBit, hm, pReq, &session_id, &resource_id, &fumi_num, &bank_num) < 0) return eResultError; ret = saHpiFumiUpgradeCancel(session_id, resource_id, fumi_num, bank_num); thrdinst->header.m_len = HpiMarshalReply0(hm, pReq, &ret); } break; case eFsaHpiFumiAutoRollbackDisableGet: { SaHpiSessionIdT session_id; SaHpiResourceIdT resource_id; SaHpiFumiNumT fumi_num; SaHpiBoolT disable = SAHPI_FALSE; PVERBOSE1("%p Processing saHpiFumiAutoRollbackDisableGet.", thrdid); if (HpiDemarshalRequest3(request_mFlags & dMhEndianBit, hm, pReq, &session_id, &resource_id, &fumi_num) < 0) return eResultError; ret = saHpiFumiAutoRollbackDisableGet(session_id, resource_id, fumi_num, &disable); thrdinst->header.m_len = HpiMarshalReply1(hm, pReq, &ret, &disable); } break; case eFsaHpiFumiAutoRollbackDisableSet: { SaHpiSessionIdT session_id; SaHpiResourceIdT resource_id; SaHpiFumiNumT fumi_num; SaHpiBoolT disable; PVERBOSE1("%p Processing saHpiFumiAutoRollbackDisableSet.", thrdid); if (HpiDemarshalRequest4(request_mFlags & dMhEndianBit, hm, pReq, &session_id, &resource_id, &fumi_num, &disable) < 0) return eResultError; ret = saHpiFumiAutoRollbackDisableSet(session_id, resource_id, fumi_num, disable); thrdinst->header.m_len = HpiMarshalReply0(hm, pReq, &ret ); } break; case eFsaHpiFumiRollbackStart: { SaHpiSessionIdT session_id; SaHpiResourceIdT resource_id; SaHpiFumiNumT fumi_num; PVERBOSE1("%p Processing saHpiFumiRollbackStart.", thrdid); if (HpiDemarshalRequest3(request_mFlags & dMhEndianBit, hm, pReq, &session_id, &resource_id, &fumi_num) < 0) return eResultError; ret = saHpiFumiRollbackStart(session_id, resource_id, fumi_num); thrdinst->header.m_len = HpiMarshalReply0(hm, pReq, &ret); } break; case eFsaHpiFumiActivate: { SaHpiSessionIdT session_id; SaHpiResourceIdT resource_id; SaHpiFumiNumT fumi_num; PVERBOSE1("%p Processing saHpiFumiActivate.", thrdid); if (HpiDemarshalRequest3(request_mFlags & dMhEndianBit, hm, pReq, &session_id, &resource_id, &fumi_num) < 0) return eResultError; ret = saHpiFumiActivate(session_id, resource_id, fumi_num); thrdinst->header.m_len = HpiMarshalReply0(hm, pReq, &ret); } break; case eFsaHpiFumiActivateStart: { SaHpiSessionIdT session_id; SaHpiResourceIdT resource_id; SaHpiFumiNumT fumi_num; SaHpiBoolT logical; PVERBOSE1("%p Processing saHpiFumiActivateStart.", thrdid); if (HpiDemarshalRequest4(request_mFlags & dMhEndianBit, hm, pReq, &session_id, &resource_id, &fumi_num, &logical) < 0) return eResultError; ret = saHpiFumiActivateStart(session_id, resource_id, fumi_num, logical); thrdinst->header.m_len = HpiMarshalReply0(hm, pReq, &ret); } break; case eFsaHpiFumiCleanup: { SaHpiSessionIdT session_id; SaHpiResourceIdT resource_id; SaHpiFumiNumT fumi_num; SaHpiBankNumT bank_num; PVERBOSE1("%p Processing saHpiFumiCleanup.", thrdid); if (HpiDemarshalRequest4(request_mFlags & dMhEndianBit, hm, pReq, &session_id, &resource_id, &fumi_num, &bank_num) < 0) return eResultError; ret = saHpiFumiCleanup(session_id, resource_id, fumi_num, bank_num); thrdinst->header.m_len = HpiMarshalReply0(hm, pReq, &ret); } break; case eFsaHpiHotSwapPolicyCancel: { SaHpiSessionIdT session_id; SaHpiResourceIdT resource_id; PVERBOSE1("%p Processing saHpiHotSwapPolicyCancel.", thrdid); if ( HpiDemarshalRequest2( request_mFlags & dMhEndianBit, hm, pReq, &session_id, &resource_id ) < 0 ) return eResultError; ret = saHpiHotSwapPolicyCancel( session_id, resource_id ); thrdinst->header.m_len = HpiMarshalReply0( hm, pReq, &ret ); } break; case eFsaHpiResourceActiveSet: { SaHpiSessionIdT session_id; SaHpiResourceIdT resource_id; PVERBOSE1("%p Processing saHpiResourceActiveSet.", thrdid); if ( HpiDemarshalRequest2( request_mFlags & dMhEndianBit, hm, pReq, &session_id, &resource_id ) < 0 ) return eResultError; ret = saHpiResourceActiveSet( session_id, resource_id ); thrdinst->header.m_len = HpiMarshalReply0( hm, pReq, &ret ); } break; case eFsaHpiResourceInactiveSet: { SaHpiSessionIdT session_id; SaHpiResourceIdT resource_id; PVERBOSE1("%p Processing saHpiResourceInactiveSet.", thrdid); if ( HpiDemarshalRequest2( request_mFlags & dMhEndianBit, hm, pReq, &session_id, &resource_id ) < 0 ) return eResultError; ret = saHpiResourceInactiveSet( session_id, resource_id ); thrdinst->header.m_len = HpiMarshalReply0( hm, pReq, &ret ); } break; case eFsaHpiAutoInsertTimeoutGet: { SaHpiSessionIdT session_id; SaHpiTimeoutT timeout; PVERBOSE1("%p Processing saHpiAutoInsertTimeoutGet.", thrdid); if ( HpiDemarshalRequest1( request_mFlags & dMhEndianBit, hm, pReq, &session_id ) < 0 ) return eResultError; ret = saHpiAutoInsertTimeoutGet( session_id, &timeout ); thrdinst->header.m_len = HpiMarshalReply1( hm, pReq, &ret, &timeout ); } break; case eFsaHpiAutoInsertTimeoutSet: { SaHpiSessionIdT session_id; SaHpiTimeoutT timeout; PVERBOSE1("%p Processing saHpiAutoInsertTimeoutSet.", thrdid); if ( HpiDemarshalRequest2( request_mFlags & dMhEndianBit, hm, pReq, &session_id, &timeout ) < 0 ) return eResultError; ret = saHpiAutoInsertTimeoutSet( session_id, timeout ); thrdinst->header.m_len = HpiMarshalReply0( hm, pReq, &ret ); } break; case eFsaHpiAutoExtractTimeoutGet: { SaHpiSessionIdT session_id; SaHpiResourceIdT resource_id; SaHpiTimeoutT timeout; PVERBOSE1("%p Processing saHpiAutoExtractTimeoutGet.", thrdid); if ( HpiDemarshalRequest2( request_mFlags & dMhEndianBit, hm, pReq, &session_id, &resource_id ) < 0 ) return eResultError; ret = saHpiAutoExtractTimeoutGet( session_id, resource_id, &timeout ); thrdinst->header.m_len = HpiMarshalReply1( hm, pReq, &ret, &timeout ); } break; case eFsaHpiAutoExtractTimeoutSet: { SaHpiSessionIdT session_id; SaHpiResourceIdT resource_id; SaHpiTimeoutT timeout; PVERBOSE1("%p Processing saHpiAutoExtractTimeoutSet.", thrdid); if ( HpiDemarshalRequest3( request_mFlags & dMhEndianBit, hm, pReq, &session_id, &resource_id, &timeout ) < 0 ) return eResultError; ret = saHpiAutoExtractTimeoutSet( session_id, resource_id, timeout ); thrdinst->header.m_len = HpiMarshalReply0( hm, pReq, &ret ); } break; case eFsaHpiHotSwapStateGet: { SaHpiSessionIdT session_id; SaHpiResourceIdT resource_id; SaHpiHsStateT state; PVERBOSE1("%p Processing saHpiHotSwapStateGet.", thrdid); if ( HpiDemarshalRequest2( request_mFlags & dMhEndianBit, hm, pReq, &session_id, &resource_id ) < 0 ) return eResultError; ret = saHpiHotSwapStateGet( session_id, resource_id, &state ); thrdinst->header.m_len = HpiMarshalReply1( hm, pReq, &ret, &state ); } break; case eFsaHpiHotSwapActionRequest: { SaHpiSessionIdT session_id; SaHpiResourceIdT resource_id; SaHpiHsActionT action; PVERBOSE1("%p Processing saHpiHotSwapActionRequest.", thrdid); if ( HpiDemarshalRequest3( request_mFlags & dMhEndianBit, hm, pReq, &session_id, &resource_id, &action ) < 0 ) return eResultError; ret = saHpiHotSwapActionRequest( session_id, resource_id, action ); thrdinst->header.m_len = HpiMarshalReply0( hm, pReq, &ret ); } break; case eFsaHpiHotSwapIndicatorStateGet: { SaHpiSessionIdT session_id; SaHpiResourceIdT resource_id; SaHpiHsIndicatorStateT state; PVERBOSE1("%p Processing saHpiHotSwapIndicatorStateGet.", thrdid); if ( HpiDemarshalRequest2( request_mFlags & dMhEndianBit, hm, pReq, &session_id, &resource_id ) < 0 ) return eResultError; ret = saHpiHotSwapIndicatorStateGet( session_id, resource_id, &state ); thrdinst->header.m_len = HpiMarshalReply1( hm, pReq, &ret, &state ); } break; case eFsaHpiHotSwapIndicatorStateSet: { SaHpiSessionIdT session_id; SaHpiResourceIdT resource_id; SaHpiHsIndicatorStateT state; PVERBOSE1("%p Processing saHpiHotSwapIndicatorStateSet.", thrdid); if ( HpiDemarshalRequest3( request_mFlags & dMhEndianBit, hm, pReq, &session_id, &resource_id, &state ) < 0 ) return eResultError; ret = saHpiHotSwapIndicatorStateSet( session_id, resource_id, state ); thrdinst->header.m_len = HpiMarshalReply0( hm, pReq, &ret ); } break; case eFsaHpiParmControl: { SaHpiSessionIdT session_id; SaHpiResourceIdT resource_id; SaHpiParmActionT action; PVERBOSE1("%p Processing saHpiParmControl.", thrdid); if ( HpiDemarshalRequest3( request_mFlags & dMhEndianBit, hm, pReq, &session_id, &resource_id, &action ) < 0 ) return eResultError; ret = saHpiParmControl( session_id, resource_id, action ); thrdinst->header.m_len = HpiMarshalReply0( hm, pReq, &ret ); } break; case eFsaHpiResourceLoadIdGet: { SaHpiSessionIdT session_id; SaHpiResourceIdT resource_id; SaHpiLoadIdT load_id; PVERBOSE1("%p Processing saHpiResourceLoadIdGet.", thrdid); if ( HpiDemarshalRequest2( request_mFlags & dMhEndianBit, hm, pReq, &session_id, &resource_id ) < 0 ) return eResultError; ret = saHpiResourceLoadIdGet( session_id, resource_id, &load_id ); thrdinst->header.m_len = HpiMarshalReply1( hm, pReq, &ret, &load_id ); } break; case eFsaHpiResourceLoadIdSet: { SaHpiSessionIdT session_id; SaHpiResourceIdT resource_id; SaHpiLoadIdT load_id; PVERBOSE1("%p Processing saHpiResourceLoadIdSet.", thrdid); if ( HpiDemarshalRequest3( request_mFlags & dMhEndianBit, hm, pReq, &session_id, &resource_id, &load_id ) < 0 ) return eResultError; ret = saHpiResourceLoadIdSet( session_id, resource_id, &load_id ); thrdinst->header.m_len = HpiMarshalReply0( hm, pReq, &ret ); } break; case eFsaHpiResourceResetStateGet: { SaHpiSessionIdT session_id; SaHpiResourceIdT resource_id; SaHpiResetActionT action; PVERBOSE1("%p Processing saHpiResourceResetStateGet.", thrdid); if ( HpiDemarshalRequest2( request_mFlags & dMhEndianBit, hm, pReq, &session_id, &resource_id ) < 0 ) return eResultError; ret = saHpiResourceResetStateGet( session_id, resource_id, &action ); thrdinst->header.m_len = HpiMarshalReply1( hm, pReq, &ret, &action ); } break; case eFsaHpiResourceResetStateSet: { SaHpiSessionIdT session_id; SaHpiResourceIdT resource_id; SaHpiResetActionT action; PVERBOSE1("%p Processing saHpiResourceResetStateSet.", thrdid); if ( HpiDemarshalRequest3( request_mFlags & dMhEndianBit, hm, pReq, &session_id, &resource_id, &action ) < 0 ) return eResultError; ret = saHpiResourceResetStateSet( session_id, resource_id, action ); thrdinst->header.m_len = HpiMarshalReply0( hm, pReq, &ret ); } break; case eFsaHpiResourcePowerStateGet: { SaHpiSessionIdT session_id; SaHpiResourceIdT resource_id; SaHpiPowerStateT state; PVERBOSE1("%p Processing saHpiResourcePowerStateGet.", thrdid); if ( HpiDemarshalRequest2( request_mFlags & dMhEndianBit, hm, pReq, &session_id, &resource_id ) < 0 ) return eResultError; ret = saHpiResourcePowerStateGet( session_id, resource_id, &state ); thrdinst->header.m_len = HpiMarshalReply1( hm, pReq, &ret, &state ); } break; case eFsaHpiResourcePowerStateSet: { SaHpiSessionIdT session_id; SaHpiResourceIdT resource_id; SaHpiPowerStateT state; PVERBOSE1("%p Processing saHpiResourcePowerStateGet.", thrdid); if ( HpiDemarshalRequest3( request_mFlags & dMhEndianBit, hm, pReq, &session_id, &resource_id, &state ) < 0 ) return eResultError; ret = saHpiResourcePowerStateSet( session_id, resource_id, state ); thrdinst->header.m_len = HpiMarshalReply0( hm, pReq, &ret ); } break; case eFoHpiHandlerCreate: { oHpiHandlerIdT id; oHpiHandlerConfigT config; GHashTable *config_table = g_hash_table_new_full( g_str_hash, g_str_equal, g_free, g_free ); PVERBOSE1("%p Processing oHpiHandlerCreate.", thrdid); if ( HpiDemarshalRequest1( request_mFlags & dMhEndianBit, hm, pReq, &config ) < 0 ) return eResultError; for (int n = 0; n < config.NumberOfParams; n++) { g_hash_table_insert(config_table, g_strdup((const gchar *)config.Params[n].Name), g_strdup((const gchar *)config.Params[n].Value)); } free(config.Params); ret = oHpiHandlerCreate(config_table, &id); g_hash_table_destroy(config_table); thrdinst->header.m_len = HpiMarshalReply1( hm, pReq, &ret, &id ); result = eResultClose; } break; case eFoHpiHandlerDestroy: { oHpiHandlerIdT id; PVERBOSE1("%p Processing oHpiHandlerDestroy.", thrdid); if ( HpiDemarshalRequest1( request_mFlags & dMhEndianBit, hm, pReq, &id ) < 0 ) return eResultError; ret = oHpiHandlerDestroy(id); thrdinst->header.m_len = HpiMarshalReply0( hm, pReq, &ret ); result = eResultClose; } break; case eFoHpiHandlerInfo: { oHpiHandlerIdT id; oHpiHandlerInfoT info; PVERBOSE1("%p Processing oHpiHandlerInfo.", thrdid); if ( HpiDemarshalRequest1( request_mFlags & dMhEndianBit, hm, pReq, &id ) < 0 ) return eResultError; ret = oHpiHandlerInfo(id, &info); thrdinst->header.m_len = HpiMarshalReply1( hm, pReq, &ret, &info ); result = eResultClose; } break; case eFoHpiHandlerGetNext: { oHpiHandlerIdT id, next_id; PVERBOSE1("%p Processing oHpiHandlerGetNext.", thrdid); if ( HpiDemarshalRequest1( request_mFlags & dMhEndianBit, hm, pReq, &id ) < 0 ) return eResultError; ret = oHpiHandlerGetNext(id, &next_id); thrdinst->header.m_len = HpiMarshalReply1( hm, pReq, &ret, &next_id ); result = eResultClose; } break; case eFoHpiHandlerFind: { SaHpiSessionIdT session_id; SaHpiResourceIdT rid; oHpiHandlerIdT hid; PVERBOSE1("%p Processing oHpiHandlerFind.", thrdid); if ( HpiDemarshalRequest2( request_mFlags & dMhEndianBit, hm, pReq, &session_id, &rid ) < 0 ) return eResultError; ret = oHpiHandlerFind(session_id, rid, &hid); thrdinst->header.m_len = HpiMarshalReply1( hm, pReq, &ret, &hid ); result = eResultClose; } break; case eFoHpiHandlerRetry: { oHpiHandlerIdT hid; PVERBOSE1("%p Processing oHpiHandlerRetry.", thrdid); if ( HpiDemarshalRequest1( request_mFlags & dMhEndianBit, hm, pReq, &hid ) < 0 ) return eResultError; ret = oHpiHandlerRetry(hid); thrdinst->header.m_len = HpiMarshalReply0( hm, pReq, &ret ); result = eResultClose; } break; case eFoHpiGlobalParamGet: { oHpiGlobalParamT param; PVERBOSE1("%p Processing oHpiGlobalParamGet.", thrdid); if ( HpiDemarshalRequest1( request_mFlags & dMhEndianBit, hm, pReq, ¶m ) < 0 ) return eResultError; ret = oHpiGlobalParamGet(¶m); thrdinst->header.m_len = HpiMarshalReply1( hm, pReq, &ret, ¶m ); result = eResultClose; } break; case eFoHpiGlobalParamSet: { oHpiGlobalParamT param; PVERBOSE1("%p Processing oHpiGlobalParamSet.", thrdid); if ( HpiDemarshalRequest1( request_mFlags & dMhEndianBit, hm, pReq, ¶m ) < 0 ) return eResultError; ret = oHpiGlobalParamSet(¶m); thrdinst->header.m_len = HpiMarshalReply0( hm, pReq, &ret ); result = eResultClose; } break; case eFoHpiInjectEvent: { oHpiHandlerIdT id = 0; SaHpiEventT event; SaHpiRptEntryT rpte; SaHpiRdrT rdr; memset(&event, 0, sizeof(SaHpiEventT)); memset(&rpte, 0, sizeof(SaHpiRptEntryT)); memset(&rdr, 0, sizeof(SaHpiRdrT)); PVERBOSE1("%p Processing oHpiInjectEvent.\n", thrdid); if ( HpiDemarshalRequest4( request_mFlags & dMhEndianBit, hm, pReq, &id, &event, &rpte, &rdr ) < 0 ) return eResultError; ret = oHpiInjectEvent(id, &event, &rpte, &rdr); thrdinst->header.m_len = HpiMarshalReply0( hm, pReq, &ret ); result = eResultClose; } break; default: PVERBOSE2("%p Function not found", thrdid); return eResultError; } // send the reply bool wrt_result = thrdinst->WriteMsg(pReq); if (wrt_result) { PVERBOSE2("%p Socket write failed.", thrdid); return eResultError; } PVERBOSE1("%p Return code = %d", thrdid, ret); return result; } openhpi-2.14.1/openhpid/oh_client_session.cpp0000644000076400007640000002244011302567132016214 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004-2008 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * W. David Ashley * Renier Morales * */ #include "oh_client_session.h" extern "C" { #include #include #include #include #include #include "oh_client_conf.h" } GHashTable *ohd_domains = NULL; GHashTable *ohd_sessions = NULL; GStaticRecMutex ohd_sessions_sem = G_STATIC_REC_MUTEX_INIT; static SaHpiSessionIdT next_client_sid = 1; static void __destroy_client_connx(gpointer data) { struct oh_client_session *client_session = (struct oh_client_session *)data; g_hash_table_destroy(client_session->connxs); g_free(client_session); } int oh_client_init(void) { char *tmp_env_str = NULL; // Initialize GLIB thread engine if (!g_thread_supported()) { g_thread_init(NULL); } g_static_rec_mutex_lock(&ohd_sessions_sem); // Create session table. if (!ohd_sessions) { ohd_sessions = g_hash_table_new_full( g_int_hash, g_int_equal, NULL, __destroy_client_connx ); } if (!ohd_domains) { // Create domain table struct oh_domain_conf *domain_conf = NULL; // SaHpiDomainIdT default_did = SAHPI_UNSPECIFIED_DOMAIN_ID; SaHpiDomainIdT default_did = OH_DEFAULT_DOMAIN_ID; ohd_domains = g_hash_table_new_full( g_int_hash, g_int_equal, NULL, g_free ); /* TODO: Have a default openhpiclient.conf file in /etc */ if ((tmp_env_str = getenv("OPENHPICLIENT_CONF")) != NULL) { oh_load_client_config(tmp_env_str, ohd_domains); } else { oh_load_client_config(OH_CLIENT_DEFAULT_CONF, ohd_domains); } /* Check to see if a default domain exists, if not, add it */ domain_conf = (struct oh_domain_conf *)g_hash_table_lookup(ohd_domains, &default_did); if (!domain_conf) { const char *host, *portstr; int port; /* TODO: change these envs to have DEFAULT in the name*/ host = getenv("OPENHPI_DAEMON_HOST"); if (!host) host = "localhost"; portstr = getenv("OPENHPI_DAEMON_PORT"); if (!portstr) port = OPENHPI_DEFAULT_DAEMON_PORT; else port = atoi(portstr); domain_conf = g_new0(struct oh_domain_conf, 1); domain_conf->did = default_did; strncpy(domain_conf->host, host, SAHPI_MAX_TEXT_BUFFER_LENGTH); domain_conf->port = port; g_hash_table_insert(ohd_domains, &domain_conf->did, domain_conf); } } g_static_rec_mutex_unlock(&ohd_sessions_sem); return 0; } SaErrorT oh_create_connx(SaHpiDomainIdT did, pcstrmsock *pinst) { struct oh_domain_conf *domain_conf = NULL; pcstrmsock connx = NULL; if (!pinst) { return SA_ERR_HPI_INVALID_PARAMS; } oh_client_init(); /* Initialize library - Will run only once */ g_static_rec_mutex_lock(&ohd_sessions_sem); connx = new cstrmsock; if (!connx) { g_static_rec_mutex_unlock(&ohd_sessions_sem); return SA_ERR_HPI_INTERNAL_ERROR; } domain_conf = (struct oh_domain_conf *)g_hash_table_lookup(ohd_domains, &did); if (!domain_conf) { delete connx; g_static_rec_mutex_unlock(&ohd_sessions_sem); err("Client configuration for domain %u was not found.", did); return SA_ERR_HPI_INVALID_DOMAIN; } g_static_rec_mutex_unlock(&ohd_sessions_sem); if (connx->Open(domain_conf->host, domain_conf->port)) { err("Could not open client socket" "\nPossibly, the OpenHPI daemon has not been started."); delete connx; return SA_ERR_HPI_NO_RESPONSE; } *pinst = connx; dbg("Client instance created"); return SA_OK; } void oh_delete_connx(pcstrmsock pinst) { if (pinst) { pinst->Close(); dbg("Connection closed and deleted"); delete pinst; } } SaErrorT oh_close_connx(SaHpiSessionIdT SessionId) { pthread_t thread_id = pthread_self(); struct oh_client_session *client_session = NULL; if (SessionId == 0) return SA_ERR_HPI_INVALID_PARAMS; g_static_rec_mutex_lock(&ohd_sessions_sem); client_session = (struct oh_client_session *)g_hash_table_lookup(ohd_sessions, &SessionId); if (!client_session) { g_static_rec_mutex_unlock(&ohd_sessions_sem); err("Did not find connx for sid %d", SessionId); return SA_ERR_HPI_INTERNAL_ERROR; } g_hash_table_remove(client_session->connxs, &thread_id); g_static_rec_mutex_unlock(&ohd_sessions_sem); return SA_OK; } SaErrorT oh_get_connx(SaHpiSessionIdT csid, SaHpiSessionIdT *dsid, pcstrmsock *pinst, SaHpiDomainIdT *did) { pthread_t thread_id = pthread_self(); struct oh_client_session *client_session = NULL; pcstrmsock connx = NULL; SaErrorT ret = SA_OK; if (!csid || !dsid || !pinst || !did) return SA_ERR_HPI_INVALID_PARAMS; oh_client_init(); /* Initialize library - Will run only once */ // Look up connection table. If it exists, look up connection. // if there is not connection, create one on-the-fly. g_static_rec_mutex_lock(&ohd_sessions_sem); client_session = (struct oh_client_session *)g_hash_table_lookup(ohd_sessions, &csid); if (client_session) { connx = (pcstrmsock)g_hash_table_lookup(client_session->connxs, &thread_id); if (!connx) { ret = oh_create_connx(client_session->did, &connx); if (connx) { g_hash_table_insert(client_session->connxs, g_memdup(&thread_id, sizeof(pthread_t)), connx); dbg("We are inserting a new connection" " in conns table"); } } *dsid = client_session->dsid; *did = client_session->did; *pinst = connx; } g_static_rec_mutex_unlock(&ohd_sessions_sem); if (client_session) { if (connx) return SA_OK; else return ret; } else return SA_ERR_HPI_INVALID_SESSION; } static void __delete_connx(gpointer data) { pcstrmsock pinst = (pcstrmsock)data; oh_delete_connx(pinst); } SaHpiSessionIdT oh_open_session(SaHpiDomainIdT did, SaHpiSessionIdT sid, pcstrmsock pinst) { GHashTable *connxs = NULL; pthread_t thread_id; struct oh_client_session *client_session; if (!sid || !pinst) return 0; client_session = g_new0(struct oh_client_session, 1); g_static_rec_mutex_lock(&ohd_sessions_sem); // Create connections table for new session. connxs = g_hash_table_new_full(g_int_hash, g_int_equal, g_free, __delete_connx); // Map connection to thread id thread_id = pthread_self(); g_hash_table_insert(connxs, g_memdup(&thread_id, sizeof(pthread_t)), pinst); // Map connecitons table to session id client_session->did = did; client_session->dsid = sid; client_session->csid = next_client_sid++; client_session->connxs = connxs; g_hash_table_insert(ohd_sessions, &client_session->csid, client_session); g_static_rec_mutex_unlock(&ohd_sessions_sem); return client_session->csid; } SaErrorT oh_close_session(SaHpiSessionIdT SessionId) { if (SessionId == 0) return SA_ERR_HPI_INVALID_PARAMS; g_static_rec_mutex_lock(&ohd_sessions_sem); // Since we used g_hash_table_new_full to create the tables, // this will remove the connection hash table and all of its entries also. g_hash_table_remove(ohd_sessions, &SessionId); g_static_rec_mutex_unlock(&ohd_sessions_sem); return SA_OK; } openhpi-2.14.1/missing0000755000076400007640000002557711302567646011622 0ustar #! /bin/sh # Common stub for a few missing GNU programs while installing. scriptversion=2006-05-10.23 # Copyright (C) 1996, 1997, 1999, 2000, 2002, 2003, 2004, 2005, 2006 # Free Software Foundation, Inc. # Originally by Fran,cois Pinard , 1996. # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2, or (at your option) # any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA # 02110-1301, USA. # As a special exception to the GNU General Public License, if you # distribute this file as part of a program that contains a # configuration script generated by Autoconf, you may include it under # the same distribution terms that you use for the rest of that program. if test $# -eq 0; then echo 1>&2 "Try \`$0 --help' for more information" exit 1 fi run=: sed_output='s/.* --output[ =]\([^ ]*\).*/\1/p' sed_minuso='s/.* -o \([^ ]*\).*/\1/p' # In the cases where this matters, `missing' is being run in the # srcdir already. if test -f configure.ac; then configure_ac=configure.ac else configure_ac=configure.in fi msg="missing on your system" case $1 in --run) # Try to run requested program, and just exit if it succeeds. run= shift "$@" && exit 0 # Exit code 63 means version mismatch. This often happens # when the user try to use an ancient version of a tool on # a file that requires a minimum version. In this case we # we should proceed has if the program had been absent, or # if --run hadn't been passed. if test $? = 63; then run=: msg="probably too old" fi ;; -h|--h|--he|--hel|--help) echo "\ $0 [OPTION]... PROGRAM [ARGUMENT]... Handle \`PROGRAM [ARGUMENT]...' for when PROGRAM is missing, or return an error status if there is no known handling for PROGRAM. Options: -h, --help display this help and exit -v, --version output version information and exit --run try to run the given command, and emulate it if it fails Supported PROGRAM values: aclocal touch file \`aclocal.m4' autoconf touch file \`configure' autoheader touch file \`config.h.in' autom4te touch the output file, or create a stub one automake touch all \`Makefile.in' files bison create \`y.tab.[ch]', if possible, from existing .[ch] flex create \`lex.yy.c', if possible, from existing .c help2man touch the output file lex create \`lex.yy.c', if possible, from existing .c makeinfo touch the output file tar try tar, gnutar, gtar, then tar without non-portable flags yacc create \`y.tab.[ch]', if possible, from existing .[ch] Send bug reports to ." exit $? ;; -v|--v|--ve|--ver|--vers|--versi|--versio|--version) echo "missing $scriptversion (GNU Automake)" exit $? ;; -*) echo 1>&2 "$0: Unknown \`$1' option" echo 1>&2 "Try \`$0 --help' for more information" exit 1 ;; esac # Now exit if we have it, but it failed. Also exit now if we # don't have it and --version was passed (most likely to detect # the program). case $1 in lex|yacc) # Not GNU programs, they don't have --version. ;; tar) if test -n "$run"; then echo 1>&2 "ERROR: \`tar' requires --run" exit 1 elif test "x$2" = "x--version" || test "x$2" = "x--help"; then exit 1 fi ;; *) if test -z "$run" && ($1 --version) > /dev/null 2>&1; then # We have it, but it failed. exit 1 elif test "x$2" = "x--version" || test "x$2" = "x--help"; then # Could not run --version or --help. This is probably someone # running `$TOOL --version' or `$TOOL --help' to check whether # $TOOL exists and not knowing $TOOL uses missing. exit 1 fi ;; esac # If it does not exist, or fails to run (possibly an outdated version), # try to emulate it. case $1 in aclocal*) echo 1>&2 "\ WARNING: \`$1' is $msg. You should only need it if you modified \`acinclude.m4' or \`${configure_ac}'. You might want to install the \`Automake' and \`Perl' packages. Grab them from any GNU archive site." touch aclocal.m4 ;; autoconf) echo 1>&2 "\ WARNING: \`$1' is $msg. You should only need it if you modified \`${configure_ac}'. You might want to install the \`Autoconf' and \`GNU m4' packages. Grab them from any GNU archive site." touch configure ;; autoheader) echo 1>&2 "\ WARNING: \`$1' is $msg. You should only need it if you modified \`acconfig.h' or \`${configure_ac}'. You might want to install the \`Autoconf' and \`GNU m4' packages. Grab them from any GNU archive site." files=`sed -n 's/^[ ]*A[CM]_CONFIG_HEADER(\([^)]*\)).*/\1/p' ${configure_ac}` test -z "$files" && files="config.h" touch_files= for f in $files; do case $f in *:*) touch_files="$touch_files "`echo "$f" | sed -e 's/^[^:]*://' -e 's/:.*//'`;; *) touch_files="$touch_files $f.in";; esac done touch $touch_files ;; automake*) echo 1>&2 "\ WARNING: \`$1' is $msg. You should only need it if you modified \`Makefile.am', \`acinclude.m4' or \`${configure_ac}'. You might want to install the \`Automake' and \`Perl' packages. Grab them from any GNU archive site." find . -type f -name Makefile.am -print | sed 's/\.am$/.in/' | while read f; do touch "$f"; done ;; autom4te) echo 1>&2 "\ WARNING: \`$1' is needed, but is $msg. You might have modified some files without having the proper tools for further handling them. You can get \`$1' as part of \`Autoconf' from any GNU archive site." file=`echo "$*" | sed -n "$sed_output"` test -z "$file" && file=`echo "$*" | sed -n "$sed_minuso"` if test -f "$file"; then touch $file else test -z "$file" || exec >$file echo "#! /bin/sh" echo "# Created by GNU Automake missing as a replacement of" echo "# $ $@" echo "exit 0" chmod +x $file exit 1 fi ;; bison|yacc) echo 1>&2 "\ WARNING: \`$1' $msg. You should only need it if you modified a \`.y' file. You may need the \`Bison' package in order for those modifications to take effect. You can get \`Bison' from any GNU archive site." rm -f y.tab.c y.tab.h if test $# -ne 1; then eval LASTARG="\${$#}" case $LASTARG in *.y) SRCFILE=`echo "$LASTARG" | sed 's/y$/c/'` if test -f "$SRCFILE"; then cp "$SRCFILE" y.tab.c fi SRCFILE=`echo "$LASTARG" | sed 's/y$/h/'` if test -f "$SRCFILE"; then cp "$SRCFILE" y.tab.h fi ;; esac fi if test ! -f y.tab.h; then echo >y.tab.h fi if test ! -f y.tab.c; then echo 'main() { return 0; }' >y.tab.c fi ;; lex|flex) echo 1>&2 "\ WARNING: \`$1' is $msg. You should only need it if you modified a \`.l' file. You may need the \`Flex' package in order for those modifications to take effect. You can get \`Flex' from any GNU archive site." rm -f lex.yy.c if test $# -ne 1; then eval LASTARG="\${$#}" case $LASTARG in *.l) SRCFILE=`echo "$LASTARG" | sed 's/l$/c/'` if test -f "$SRCFILE"; then cp "$SRCFILE" lex.yy.c fi ;; esac fi if test ! -f lex.yy.c; then echo 'main() { return 0; }' >lex.yy.c fi ;; help2man) echo 1>&2 "\ WARNING: \`$1' is $msg. You should only need it if you modified a dependency of a manual page. You may need the \`Help2man' package in order for those modifications to take effect. You can get \`Help2man' from any GNU archive site." file=`echo "$*" | sed -n "$sed_output"` test -z "$file" && file=`echo "$*" | sed -n "$sed_minuso"` if test -f "$file"; then touch $file else test -z "$file" || exec >$file echo ".ab help2man is required to generate this page" exit 1 fi ;; makeinfo) echo 1>&2 "\ WARNING: \`$1' is $msg. You should only need it if you modified a \`.texi' or \`.texinfo' file, or any other file indirectly affecting the aspect of the manual. The spurious call might also be the consequence of using a buggy \`make' (AIX, DU, IRIX). You might want to install the \`Texinfo' package or the \`GNU make' package. Grab either from any GNU archive site." # The file to touch is that specified with -o ... file=`echo "$*" | sed -n "$sed_output"` test -z "$file" && file=`echo "$*" | sed -n "$sed_minuso"` if test -z "$file"; then # ... or it is the one specified with @setfilename ... infile=`echo "$*" | sed 's/.* \([^ ]*\) *$/\1/'` file=`sed -n ' /^@setfilename/{ s/.* \([^ ]*\) *$/\1/ p q }' $infile` # ... or it is derived from the source name (dir/f.texi becomes f.info) test -z "$file" && file=`echo "$infile" | sed 's,.*/,,;s,.[^.]*$,,'`.info fi # If the file does not exist, the user really needs makeinfo; # let's fail without touching anything. test -f $file || exit 1 touch $file ;; tar) shift # We have already tried tar in the generic part. # Look for gnutar/gtar before invocation to avoid ugly error # messages. if (gnutar --version > /dev/null 2>&1); then gnutar "$@" && exit 0 fi if (gtar --version > /dev/null 2>&1); then gtar "$@" && exit 0 fi firstarg="$1" if shift; then case $firstarg in *o*) firstarg=`echo "$firstarg" | sed s/o//` tar "$firstarg" "$@" && exit 0 ;; esac case $firstarg in *h*) firstarg=`echo "$firstarg" | sed s/h//` tar "$firstarg" "$@" && exit 0 ;; esac fi echo 1>&2 "\ WARNING: I can't seem to be able to run \`tar' with the given arguments. You may want to install GNU tar or Free paxutils, or check the command line arguments." exit 1 ;; *) echo 1>&2 "\ WARNING: \`$1' is needed, and is $msg. You might have modified some files without having the proper tools for further handling them. Check the \`README' file, it often tells you about the needed prerequisites for installing this package. You may also peek at any GNU archive site, in case some other package would contain this missing \`$1' program." exit 1 ;; esac exit 0 # Local variables: # eval: (add-hook 'write-file-hooks 'time-stamp) # time-stamp-start: "scriptversion=" # time-stamp-format: "%:y-%02m-%02d.%02H" # time-stamp-end: "$" # End: openhpi-2.14.1/scripts/0000755000076400007640000000000011405006365011660 5ustar openhpi-2.14.1/scripts/test/0000755000076400007640000000000011405006365012637 5ustar openhpi-2.14.1/scripts/test/Makefile.am0000644000076400007640000000566311302567034014706 0ustar # # Copyright (c) 2003, Intel Corporation # All rights reserved. # # 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. # # Neither the name of Intel Corporation nor the names # of its contributors may be used to endorse or promote products # derived from this software without specific prior written permission. # # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS # "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT # LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS # FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT # OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, # SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED # TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, # OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY # OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING # NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS # SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. # REPORTDIR = report_html CONFORMDIR = conform_html SERVER = shell1.sf.net RDIR = /home/groups/o/op/openhpi/htdocs/coverage_report CONFORMRDIR = /home/groups/o/op/openhpi/htdocs/conform_report SFUSER = $(shell if test $(SFUID) != "" > /dev/null 2>&1; then echo $(SFUID); else echo $(USER); fi;) MAINTAINERCLEANFILES = Makefile.in MOSTLYCLEANFILES = @TEST_CLEAN@ # we want all the local perl programs EXTRA_DIST = $(shell ls *pl) clean-local: rm -rf $(REPORTDIR) $(CONFORMDIR) report: ./testcoverage.pl ./coverage_report.pl conform: ./testconformance.pl ./conformance_report.pl pconform: -chmod a+x $(shell echo $(CONFORMDIR)/*html) -echo "XBitHack on" > $(CONFORMDIR)/.htaccess -echo "Options +Indexes" >> $(CONFORMDIR)/.htaccess -rsync -e ssh -rP --delete $(CONFORMDIR)/ $(SERVER):$(CONFORMRDIR) -ssh $(SERVER) "find $(CONFORMRDIR) -user `whoami` -exec chmod g+w {} \;" -ssh $(SERVER) "find $(CONFORMRDIR) -user `whoami` -type d -exec chmod g+s {} \;" preport: -chmod a+x $(shell echo $(REPORTDIR)/*html) -echo "XBitHack on" > $(REPORTDIR)/.htaccess -echo "Options +Indexes" >> $(REPORTDIR)/.htaccess -rsync -e ssh -rP --delete $(REPORTDIR)/ $(SFUSER)@$(SERVER):$(RDIR) -ssh $(SFUSER)@$(SERVER) "find $(RDIR) -user $(SFUSER) -exec chmod g+w {} \;" -ssh $(SFUSER)@$(SERVER) "find $(RDIR) -user $(SFUSER) -type d -exec chmod g+s {} \;" publish-conform:: conform pconform publish-report:: report preport openhpi-2.14.1/scripts/test/conformance_report.pl0000755000076400007640000000215311302567034017066 0ustar #!/usr/bin/perl # $Id: conformance_report.pl 2269 2004-11-01 22:19:44Z sdague $ # (C) Copyright IBM Corp. 2004 # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This # file and program are licensed under a BSD style license. See # the Copying file included with the OpenHPI distribution for # full licensing terms. # Authors: # Sean Dague use strict; my @dirs = qw(src utils); my $outdir = "conform_html"; mkdir $outdir, 0755; foreach my $dir (@dirs) { opendir(DIR,"../$dir"); while(my $file = readdir(DIR)) { my $safename = $dir; $safename =~ s{/}{_}g; $safename .= "_"; if($file =~ /\.gcov$/) { system("./gcov2html.pl ../$dir/$file > $outdir/$safename$file.html"); } elsif ($file =~ /\.summary$/) { system("./gsum2html.pl ../$dir/$file > $outdir/$safename$file.html"); } } closedir(DIR); } system("./generate_index.pl $outdir > $outdir/index.html"); openhpi-2.14.1/scripts/test/testconformance.pl0000755000076400007640000000456711302567034016406 0ustar #!/usr/bin/perl # $Id: testconformance.pl 5778 2006-05-17 00:27:15Z renierm $ # (C) Copyright IBM Corp. 2004 # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This # file and program are licensed under a BSD style license. See # the Copying file included with the OpenHPI distribution for # full licensing terms. # Authors: # Sean Dague use strict; use Cwd; use File::Basename; chdir("../../"); my $start = cwd(); # set up env my $plugroot = "$start/plugins"; $ENV{OPENHPI_CONF} = "$start/openhpi.conf"; $ENV{OPENHPI_UID_MAP} = "$start/uid_map"; $ENV{LD_LIBRARY_PATH} .= "$start/src/.libs:$start/utils/.libs"; $ENV{LIBRARY_PATH} .= "$start/src/.libs:$start/utils/.libs"; $ENV{OPENHPI_PATH} .= "$plugroot/dummy:$plugroot/ipmi:$plugroot/ipmidirect:$plugroot/watchdog:$plugroot/sysfs:$plugroot/text_remote:$plugroot/snmp_bc"; # first we have to rebuild the library with --enable-testcover system("./bootstrap && ./configure --enable-testcover @ARGV && make clean && make"); chdir("../hpitest"); system("./hpitest --clean --hpiversion B.1.01 openhpi"); foreach my $dir (qw(src utils)) { chdir($start); my $report = ""; chdir($dir); my @files = (); # We are only testing files in openhpi/src for conformance coverage opendir(IN,"."); while(my $file = readdir(IN)) { if($file =~ /\.c$/) { push @files, "$file"; } } close(IN); foreach my $file (@files) { print STDERR "Cwd is now" . cwd() . "\n"; my $cmd = "gcov -blf -o .libs $file"; my $report = "Coverage Report for $dir/$file\n\n"; my $body = ""; my $header = ""; open(GCOV,"$cmd |"); while() { if(s{^(File.*)($file)}{$1$dir/$file}) { $header .= $_; # File $header .= ; # Lines $header .= ; # Branches $header .= ; # Taken $header .= ; # Calls $header .= "\n"; last; # and now we are *done* } else { $body .= $_; } } close(GCOV); open(OUT,">$file.summary"); print OUT $report, $header, $body; close(OUT); } } openhpi-2.14.1/scripts/test/generate_index.pl0000755000076400007640000000452611302567034016170 0ustar #!/usr/bin/perl # $Id: generate_index.pl 2267 2004-11-01 20:15:18Z sdague $ # (C) Copyright IBM Corp. 2004 # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This # file and program are licensed under a BSD style license. See # the Copying file included with the OpenHPI distribution for # full licensing terms. # Authors: # Sean Dague use strict; use HTML::Entities; my $dir = shift; opendir(IN,"$dir"); my @files = (); while(my $file = readdir(IN)) { push @files, $file; } closedir(IN); my $html = make_html_head(); $html .= make_html_body($dir, @files); $html .= make_html_tail(); print $html; sub make_html_head { return < Test Coverage Analysis

    \n"; if (($count%4) == 3) { # close the last table $html .= "

    Test Coverage Analysis

    END } sub make_html_tail { return <
    END } # ok, here is a set of assumptions, which should hold true # # 1. .c.summary.html files will exist for everything we care about # 2. a .c.gcov.html file will exist for each # 3. my regex skills are honed enough to pull up the table from .c.summary.html file sub make_html_body { my $dir = shift; my @files = @_; my $html; foreach my $file (sort @files) { if($file =~ /\.c\.summary\.html$/) { next if(-z "$dir/$file"); my $name = $file; $name =~ s/.summary.html//; $html .= slurp_summary_table($name, "$dir/$file"); $html .= "Full Coverage Report
    \n"; $html .= "Detailed Execution Report
    \n"; } } return $html; } sub slurp_summary_table { my ($name, $file) = @_; open(IN,"$file"); local $/ = undef; my $content = ; close(IN); my $snip = ""; if($content =~ m{(

    .*?

    \s*)}igs) { $snip = $1; } return $snip; } openhpi-2.14.1/scripts/test/coverage_report.pl0000755000076400007640000000225111302567034016366 0ustar #!/usr/bin/perl # $Id: coverage_report.pl 2657 2005-01-17 04:37:20Z renierm $ # (C) Copyright IBM Corp. 2004 # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This # file and program are licensed under a BSD style license. See # the Copying file included with the OpenHPI distribution for # full licensing terms. # Authors: # Sean Dague use strict; #my @dirs = qw(src utils plugins/snmp_bc plugins/snmp_bc/t); my @dirs = qw(src utils); my $outdir = "report_html"; mkdir $outdir, 0755; foreach my $dir (@dirs) { opendir(DIR,"../$dir"); while(my $file = readdir(DIR)) { my $safename = $dir; $safename =~ s{/}{_}g; $safename .= "_"; if($file =~ /\.gcov$/) { system("./gcov2html.pl ../$dir/$file > $outdir/$safename$file.html"); } elsif ($file =~ /\.summary$/) { system("./gsum2html.pl ../$dir/$file > $outdir/$safename$file.html"); } } closedir(DIR); } system("./generate_index.pl $outdir > $outdir/index.html"); openhpi-2.14.1/scripts/test/gcov2html.pl0000755000076400007640000000550311302567034015110 0ustar #!/usr/bin/perl # $Id: gcov2html.pl 2268 2004-11-01 21:30:21Z sdague $ # (C) Copyright IBM Corp. 2004 # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This # file and program are licensed under a BSD style license. See # the Copying file included with the OpenHPI distribution for # full licensing terms. # Authors: # Sean Dague use strict; use HTML::Entities; foreach my $file (@ARGV) { # my $outfile = $file . ".html"; open(IN,"$file"); my @lines = ; close(IN); my $html = make_html_head($file); $html .= make_html_body(parse_gcov(@lines)); $html .= make_html_tail(); print $html; # open(OUT,">$outfile"); # print OUT $html; # close(OUT); } sub make_html_head { my $title = shift; $title =~ s/.*\/(.*)\.gcov$/$1/; return < GCOV execution analyis for $title \n"; $linecount++; } return $html; } sub parse_gcov { my @in = @_; my $lines = []; foreach my $line (@in) { if($line =~ /^\s+(.*?):\s+(.*?):(.*)/) { my $hash = { exec => $1, line => $2, data => $3, }; push @$lines, $hash; } } return $lines; } openhpi-2.14.1/scripts/test/testcoverage.pl0000755000076400007640000000737411302567034015706 0ustar #!/usr/bin/perl # $Id: testcoverage.pl 5778 2006-05-17 00:27:15Z renierm $ # (C) Copyright IBM Corp. 2004-2006 # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This # file and program are licensed under a BSD style license. See # the Copying file included with the OpenHPI distribution for # full licensing terms. # Authors: # Sean Dague use strict; use Cwd; use File::Basename; chdir("../../"); my $start = cwd(); my $report = ""; # this needs to be made more generic over time my %files = ( "src/ohpi.c" => ".libs", "utils/el_utils.c" => "t/el", "utils/epath_utils.c" => "t/epath", "utils/rpt_utils.c" => "t/rpt", "utils/uid_utils.c" => "t/uid", "utils/sahpi_enum_utils.c" => "t/sahpi", "utils/sahpi_event_encode.c" => "t/sahpi", "utils/sahpi_event_utils.c" => "t/sahpi", "utils/sahpi_struct_utils.c" => "t/sahpi", "utils/sahpi_time_utils.c" => "t/sahpi", # now for the blade center stuff # "plugins/snmp_bc/snmp_bc.c" => "t", # "plugins/snmp_bc/snmp_bc_control.c" => "t", # "plugins/snmp_bc/snmp_bc_discover.c" => "t", # "plugins/snmp_bc/snmp_bc_event.c" => "t", # "plugins/snmp_bc/snmp_bc_hotswap.c" => "t", # "plugins/snmp_bc/snmp_bc_inventory.c" => "t", # "plugins/snmp_bc/snmp_bc_sel.c" => "t", # "plugins/snmp_bc/snmp_bc_sensor.c" => "t", # "plugins/snmp_bc/snmp_bc_session.c" => "t", # "plugins/snmp_bc/snmp_bc_time.c" => "t", # "plugins/snmp_bc/snmp_bc_utils.c" => "t", # "plugins/snmp_bc/snmp_bc_watchdog.c" => "t", # "plugins/snmp_bc/t/bc_str2event.c" => ".libs", # "plugins/snmp_bc/t/snmp_bc.c" => ".libs", # "plugins/snmp_bc/t/snmp_bc_control.c" => ".libs", # "plugins/snmp_bc/t/snmp_bc_discover.c" => ".libs", # "plugins/snmp_bc/t/snmp_bc_event.c" => ".libs", # "plugins/snmp_bc/t/snmp_bc_hotswap.c" => ".libs", # "plugins/snmp_bc/t/snmp_bc_inventory.c" => ".libs", # "plugins/snmp_bc/t/snmp_bc_sel.c" => ".libs", # "plugins/snmp_bc/t/snmp_bc_sensor.c" => ".libs", # "plugins/snmp_bc/t/snmp_bc_session.c" => ".libs", # "plugins/snmp_bc/t/snmp_bc_time.c" => ".libs", # "plugins/snmp_bc/t/snmp_bc_utils.c" => ".libs", # "plugins/snmp_bc/t/snmp_bc_watchdog.c" => ".libs", # "plugins/snmp_bc/t/snmp_util.c" => ".libs", ); # we must ensure that we have coverage created system("./bootstrap && ./configure --enable-testcover @ARGV && make clean && make && make -sk check"); #system("make -ks clean check"); foreach my $fullfile (sort keys %files) { chdir($start); my $file = basename($fullfile); my $dir = dirname($fullfile); chdir($dir); print STDERR "Cwd is now" . cwd() . "\n"; my $cmd = "gcov -blf -o $files{$fullfile} $file"; my $report = "Coverage Report for $fullfile\n\n"; my $body = ""; my $header = ""; open(GCOV,"$cmd |"); while() { if(s{^(File.*)($file)}{$1$dir/$file}) { $header .= $_; # File $header .= ; # Lines $header .= ; # Branches $header .= ; # Taken $header .= ; # Calls $header .= "\n"; last; # and now we are *done* } else { $body .= $_; } } close(GCOV); open(OUT,">$file.summary"); print OUT $report, $header, $body; close(OUT); } openhpi-2.14.1/scripts/test/gsum2html.pl0000755000076400007640000000572611302567034015134 0ustar #!/usr/bin/perl # $Id: gsum2html.pl 2657 2005-01-17 04:37:20Z renierm $ # (C) Copyright IBM Corp. 2004 # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This # file and program are licensed under a BSD style license. See # the Copying file included with the OpenHPI distribution for # full licensing terms. # Authors: # Sean Dague use strict; use HTML::Entities; foreach my $file (@ARGV) { # my $outfile = $file . ".html"; open(IN,"$file"); my @lines = ; close(IN); my $html = make_html_head($file); $html .= make_html_body(@lines); $html .= make_html_tail(); if(scalar(@lines) > 5) { print $html; } # open(OUT,">$outfile"); # print OUT $html; # close(OUT); } sub make_html_head { my $title = shift; $title =~ s/.*\/(.*)\.summary$/$1/; return < GCOV Report for $title

    GCOV Execution Analysis for $title

    The left column is the number of times the code was executed during the unit test suites.

    END } sub make_html_tail { return <
    Exec CodeLine #
    END } sub set_status { my $exec = shift; if($exec eq "-") { return "na"; } elsif($exec eq "#####") { return "notexec"; } elsif($exec < 10) { return "low"; } else { return "good"; } } sub make_html_body { my $lines = shift; my $html; my $linecount = 1; foreach my $line (@$lines) { my $status = set_status($line->{exec}); my $exec = ($status eq "na") ? " " : $line->{exec} + 0; my $data = $line->{data}; $data =~ s{<(\S+)\@(.*?)\.(net|com)>}{< address removed >}ig; $data = encode_entities($data); $html .= "

    $exec 
    $data
    $linecount

    GCOV Summary for $title

    END } sub make_html_tail { return <
    END } sub set_status { my $exec = shift; if($exec eq "-") { return "na"; } elsif($exec eq "#####") { return "notexec"; } elsif($exec < 10) { return "low"; } else { return "good"; } } sub make_html_body { my @lines = @_; my $html; my $count = 0; foreach my $line (@lines) { if ($line =~ /^No/) { $html .= "
    $line
    \n"; } if ($line =~ /^No branches/) { $count = $count + 1; } $count = $count + 1; } elsif ($line =~ /(\d+\.\d{2})%/) { my $per = $1; my $status = "bad"; my $boundary; if ($line =~ /(in function )(.+)$/) { $boundary .= "

    $2

    \n\n"; } elsif ($line =~ /(in file )(.+)$/) { $boundary .= "

    $2

    \n
    \n" } $line =~ s/$1$2//; if (($count%4) == 0) { $html .= $boundary; } if($per >= 100) { $status = "great"; } elsif($per > 80) { $status = "good"; } elsif($per > 50) { $status = "ok"; } $html .= "\n"; if (($count%4) == 3) { # close the last table $html .= "
    $line
    \n"; } $count = $count + 1; } } return $html; } openhpi-2.14.1/scripts/Makefile.am0000644000076400007640000000321311302567034013714 0ustar # # Copyright (c) 2003, Intel Corporation # (C) Copyright IBM Corp 2003-2006 # All rights reserved. # # 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. # # Neither the name of Intel Corporation nor the names # of its contributors may be used to endorse or promote products # derived from this software without specific prior written permission. # # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS # "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT # LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS # FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT # OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, # SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED # TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, # OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY # OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING # NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS # SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. # EXTRA_DIST = SaHpi2code.pl text2cstr.pl SUBDIRS = test MAINTAINERCLEANFILES = Makefile.in openhpi-2.14.1/scripts/SaHpi2code.pl0000755000076400007640000010074411302567034014150 0ustar #!/usr/bin/perl ####################################################################### # (C) COPYRIGHT IBM Corp 2004 # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This # file and program are licensed under a BSD style license. See # the Copying file included with the OpenHPI distribution for # full licensing terms. # # Author(s): # Steve Sherman ######################################################################## ######################################################################## # Script Description: # # This script reads SaHpi.h and generates the C code necessary to # print the string definitions of the SaHpi.h's enum typedefs (and some # #defines). The idea is to automatically generate and centralize these # utility functions for use in OpenHPI client and testing programs. # # These utility functions can also be used to determine if an arbitrary # value is valid for a given enum typedef (a NULL return code indicates # an invalid value). # # Script also generates code to support SaHpi_event_utils.c routines. # # This script is run as part of the OpenHPI build process. # # Script Input: # # --debug (optional) Turn on debug info. # Default is no. # --ifile (optional) Full path name to header file, including the # header's filename. # Default is "current_directory/SaHpi.h". # --atca (optional) Auto-generating should take account of additional # ATCA spec (SaHpiAtac.h). # --odir (optional) Directory for generated output files. # Default is current directory. # --tdir (optional) Directory for generated testcase files. # If not defined; no testcase files are generated; # Exit codes # - 0 successful # - 1 error occurred ######################################################################### use strict; use Getopt::Long; GetOptions( "debug" => \my $debug, "atca" => \my $atca, "ifile=s" => \my $ifile, "odir=s" => \my $odir, "tdir=s" => \my $tdir, ); sub normalize_file(*); sub parse_category_events(*$); sub print_copywrite(*); sub print_hfile_header(*$); sub print_cfile_header; sub print_xfile_header; sub print_xhfile_header; sub print_testfile_header; sub print_xtestfile_header; sub beautify_type_name($); sub print_hfile_func($$); sub print_cfile_func($); sub beautify_enum_name($$); sub print_cfile_case($$); sub print_cfile_encode_array_header($); sub print_cfile_encode_array($$); sub print_cfile_encode_func($); sub print_testfile_case($$); sub print_xtestfile_case($$$); sub print_xtestfile_badevent($); sub print_cfile_endfunc; sub print_testfile_endfunc($); sub print_hfile_ending(*); sub print_testfile_ending; sub print_xtestfile_ending; ###################################### # Main Code - Set directory/file names ###################################### my $cur_dir = `pwd`; chomp $cur_dir; if ($ifile eq "") { $ifile = $cur_dir . "/SaHpi.h"; } if ($odir eq "") { $odir = $cur_dir; } #if ($oname eq "") { my ($dir, $base, $ext) = ($ifile =~ m:(.*)/([^/]+)\.([^\./]+)$:); ($base, $ext) = ($ifile =~ m:^([^/]+)\.([^\./]+)$:) unless $base; die "cannot find base for file $ifile" unless $base; $base = lc($base); my $ocfile = $base . "_enum_utils.c"; my $ohfile = $base . "_enum_utils.h"; my $oxcfile = $base . "_event_encode.c"; my $oxhfile = $base . "_event_encode.h"; #} #else { # $ocfile = $oname . ".c"; # $ohfile = $oname . ".h"; #} my $file_c = $odir . "/$ocfile"; my $file_h = $odir . "/$ohfile"; my $file_x = $odir . "/$oxcfile"; my $file_xh = $odir . "/$oxhfile"; my ($atca_base) = "sahpiatca"; my ($atca_header) = 0; if ($base eq $atca_base) { $atca_header = 1; } unlink $file_c; unlink $file_h; if (!$atca_header) { unlink $file_x; unlink $file_xh; } open(INPUT_HEADER, $ifile) or die "$0 Error! Cannot open $ifile. $! Stopped"; open(FILE_C, ">>$file_c") or die "$0 Error! Cannot open file $file_c. $! Stopped"; open(FILE_H, ">>$file_h") or die "$0 Error! Cannot open file $file_h. $! Stopped"; if (!$atca_header) { open(FILE_X, ">>$file_x") or die "$0 Error! Cannot open file $file_x. $! Stopped"; open(FILE_XH, ">>$file_xh") or die "$0 Error! Cannot open file $file_xh. $! Stopped"; } my $tbase_name = "$ocfile"; my $txbase_name = "$oxcfile"; $tbase_name =~ s/\.c$/_test\.c/; $txbase_name =~ s/\.c$/_test\.c/; my $tfile = "$tdir/$tbase_name"; my $txfile = "$tdir/$txbase_name"; if ($tdir) { unlink $tfile; open(FILE_TEST, ">>$tfile") or die "$0 Error! Cannot open file $tfile. $! Stopped"; if (!$atca_header) { unlink $txfile; open(XFILE_TEST, ">>$txfile") or die "$0 Error! Cannot open file $txfile. $! Stopped"; } } ######################### # Parse input header file ######################### my $rtn_code = 0; my $cat_type = "SaHpiEventCategoryT"; my $err_type = "SaErrorT"; my $entity_type = "SaHpiEntityTypeT"; my $atca_entity_type = "AtcaHpiEntityTypeT"; my $atca_pretty_type = beautify_type_name($atca_entity_type); my $atca_entity_encode_name = "oh_encode_" . "$atca_pretty_type"; my $atca_entity_lookup_name = "oh_lookup_" . "$atca_pretty_type"; my @cat_array = (); my @err_array = (); my @atca_entity_array = (); my @enum_array = (); my @normalized_array = (); my %category = (); my %global_category = (); if (normalize_file INPUT_HEADER) { $rtn_code = 1; goto CLEANUP; } print_copywrite *FILE_C; print_copywrite *FILE_H; if (!$atca_header) { print_copywrite *FILE_X; print_copywrite *FILE_XH; } if ($tdir) { print_copywrite *FILE_TEST; if (!$atca_header) { print_copywrite *XFILE_TEST; } } print_hfile_header *FILE_H, $ohfile; print_cfile_header(); if (!$atca_header) { print_hfile_header *FILE_XH, $oxhfile; print_xfile_header(); print_xhfile_header(); } if ($tdir) { print_testfile_header(); if (!$atca_header) { print_xtestfile_header(); } } my $in_enum = 0; my $line_count = 0; my $max_global_events = 0; my $max_events = 0; for ( my ($i) = 0; $i < @normalized_array; ++$i ) { $_ = $normalized_array[ $i ]; # Handle SaErrorT definitions my ($err_code) = /^\s*\#define\s+(\w+)\s*\($err_type\).*$/; if ($err_code) { push(@err_array, $err_code); next; } if (/^\s*\($atca_entity_type\).*$/) { $_ = @normalized_array[ $i - 1 ]; my ($atca_entity_code) = /^\s*\#define\s+(\w+).*$/; push(@atca_entity_array, $atca_entity_code); next; } # Handle SaHpiEventCategoryT definitions my ($cat_code) = /^\s*\#define\s+(\w*)\s*\($cat_type\).*$/; if ($cat_code) { push(@cat_array, $cat_code); next; } if ( /^\s*typedef\s+enum.*$/ ) { $in_enum = 1; next; } if ($in_enum) { # Check for end of enum definition - Assumming all on one line my ($enum_end, $enum_type) = /^\s*(\}+)\s*(\w*)\s*\;\s*$/; if ( $enum_end ne "" ) { $in_enum = 0; $line_count++; print_cfile_func($enum_type); my $max_enums = 0; foreach my $case (@enum_array) { $max_enums++; print_cfile_case($enum_type, $case); if ($tdir) { print_testfile_case($enum_type, $case); } } print_cfile_endfunc($enum_type); # Create encoding code print_cfile_encode_array_header($enum_type); foreach my $case (@enum_array) { print_cfile_encode_array($enum_type, $case); } print FILE_C "};\n\n"; print_cfile_encode_func($enum_type); if ($tdir) { print_testfile_endfunc($enum_type); } print_hfile_func($enum_type, $max_enums); @enum_array = (); next; } # Find enum definition - sometimes "{" is on the next line my ($enum_def) = /^\s*\{*\s*(\w+).*$/; if ($enum_def) { push(@enum_array, $enum_def); } } } if ($in_enum) { die "$0 Error! Open enum definition. $! Stopped"; } if ($#err_array > 0) { my $max_enums = 0; $line_count++; print_cfile_func($err_type); foreach my $case (@err_array) { $max_enums++; print_cfile_case($err_type, $case); if ($tdir) { print_testfile_case($err_type, $case); } } print_cfile_endfunc(); # Create encode function print_cfile_encode_array_header($err_type); foreach my $case (@err_array) { print_cfile_encode_array($err_type, $case); } print FILE_C "};\n\n"; print_cfile_encode_func($err_type); if ($tdir) { print_testfile_endfunc($err_type); } print_hfile_func($err_type, $max_enums); } if (($#cat_array > 0) && (!$atca_header)) { my $max_enums = 0; $line_count++; print_cfile_func($cat_type); foreach my $case (@cat_array) { $max_enums++; print_cfile_case($cat_type, $case); if ($tdir) { print_testfile_case($cat_type, $case); } } print_cfile_endfunc(); # Create encode function print_cfile_encode_array_header($cat_type); foreach my $case (@cat_array) { print_cfile_encode_array($cat_type, $case); } print FILE_C "};\n\n"; print_cfile_encode_func($cat_type); if ($tdir) { print_testfile_endfunc($cat_type); } print_hfile_func($cat_type, $max_enums); } if ($#atca_entity_array > 0) { my $max_enums = 0; $line_count++; print_cfile_func($atca_entity_type); foreach my $case (@atca_entity_array) { $max_enums++; print_cfile_case($atca_entity_type, $case); if ($tdir) { print_testfile_case($atca_entity_type, $case); } } print_cfile_endfunc(); # Create encode function print_cfile_encode_array_header($atca_entity_type); foreach my $case (@atca_entity_array) { print_cfile_encode_array($atca_entity_type, $case); } print FILE_C "};\n\n"; print_cfile_encode_func($atca_entity_type); if ($tdir) { print_testfile_endfunc($atca_entity_type); } print_hfile_func($atca_entity_type, $max_enums); } #################################### # Handle event states and categories #################################### if (!$atca_header) { print FILE_X "oh_categorystate_map state_global_strings[] = {\n"; foreach my $gc (keys %global_category) { foreach my $gevt (sort {$global_category{$gc}->{$a}->{value} <=> $global_category{$gc}->{$b}->{value}} keys %{$global_category{$gc}}) { $max_global_events++; if ($debug) { print("CAT=$gc; EVENT=$gevt; STR=$global_category{$gc}->{$gevt}->{string}\n"); } print FILE_X "{SAHPI_EC_UNSPECIFIED, $gevt, \"$global_category{$gc}->{$gevt}->{string}\"},\n"; if ($tdir) { print_xtestfile_case($gevt, "SAHPI_EC_UNSPECIFIED", $global_category{$gc}->{$gevt}->{string}); } } print_xtestfile_badevent("SAHPI_EC_UNSPECIFIED"); } print FILE_X "};\n\n"; print FILE_XH "\#define OH_MAX_STATE_GLOBAL_STRINGS $max_global_events\n"; print FILE_XH "extern oh_categorystate_map state_global_strings[OH_MAX_STATE_GLOBAL_STRINGS];\n\n"; print FILE_X "oh_categorystate_map state_strings[] = {\n"; foreach my $c (keys %category) { foreach my $evt (sort {$category{$c}->{$a}->{value} <=> $category{$c}->{$b}->{value}} keys %{$category{$c}}) { $max_events++; if ($debug) { print("CAT=$c; EVENT=$evt; STR=$category{$c}->{$evt}->{string}\n"); } print FILE_X "{$c, $evt, \"$category{$c}->{$evt}->{string}\"},\n"; if ($tdir) { print_xtestfile_case($evt, $c, $category{$c}->{$evt}->{string}); } } print_xtestfile_badevent($c); } print FILE_X "};\n\n"; print FILE_XH "\#define OH_MAX_STATE_STRINGS $max_events\n"; print FILE_XH "extern oh_categorystate_map state_strings[OH_MAX_STATE_STRINGS];\n\n"; print_hfile_ending *FILE_XH; } print_hfile_ending *FILE_H; if ($tdir) { print_testfile_ending(); if (!$atca_header) { print_xtestfile_ending(); } } CLEANUP: close INPUT_HEADER; close FILE_C; close FILE_H; if (!$atca_header) { close FILE_X; close FILE_XH; } if ($tdir) { close FILE_TEST; if (!$atca_header) { close XFILE_TEST; } } if ($line_count == 0) { print "$0 Warning! No code can be generated from header file - $ifile\n"; unlink $file_c; unlink $file_h; if ($tdir) { unlink $tfile; } } if (($max_events == 0) && (!$atca_header)) { print "$0 Warning! No Events found in header file - $ifile\n"; if ($tdir) { rm $txfile; } } exit ($rtn_code); ############# # Subroutines ############# sub normalize_file(*) { my( $input_handle ) = @_; my $in_comments = 0; my $in_cat = 0; while ( <$input_handle> ) { chomp; # Handle special case for Event Categories and their states if (/^.*\s+SaHpiEventCategoryT\s*==.*$/ ) { parse_category_events($input_handle, $_); } next if /^\s*$/; # Skip blank lines next if /^\s*\/\/.*$/; # Skip // lines next if /^\s*\/\*.*\*\/\s*$/; # Skip /* ... */ lines my $line = $_; ($line) =~ s/^(.*?)\s*$/$1/; # Strip blanks from end of line ($line) =~ s/^(.*?)\/\/.*$/$1/; # Strip trailing C++ comments # Multi-line C comments if ( ( /^.*\/\*.*$/ ) && !( /^.*\*\/.*$/ ) ) { $in_comments = 1; ($line) =~ s/^(.*?)\/\*.*$/$1/; # Get part of line before comment chomp $line; if ($line ne "") { push(@normalized_array, $line); } if ($debug) { print "In multi-line comment section\n"; print "Characters before first comment = $line\n"; } next; } # End C comment if ( !( /^.*\/\*.*$/ ) && ( /^.*\*\/.*$/ ) ) { $in_comments = 0; ($line) =~ s/^.*\*\/(.*?)$/$1/; # Get part of line after comment if ($debug) { print "Out of multi-line comment section\n"; print "Characters after last comment = $line\n"; } } # Embedded single line comment after C code if ( ( /^.*\/\*.*$/ ) && ( /^.*\*\/.*$/ ) ) { my ($token1, $comment, $token2) = /^(.*)(\/\*.*\*\/)+(.*)$/; $line = $token1 . "\n$token2"; if ($debug) { print "Embedded single line comment\n"; print "Line without comment = $line\n"; } } next if ($in_comments); chomp $line; next if ($line eq ""); # Change commas to NLs $line =~ s/,/\n/g; my @fields = split/\n/,$line; foreach my $field (@fields) { chomp $field; push(@normalized_array, $field); } } return 0; } sub parse_category_events(*$) { my ($file_handle, $line) = @_; my $in_global_cat = 0; my @global_events = (); my @cat_list = (); if (/\/) { $in_global_cat = 1; } else { my ($cat, $rest_of_line) = /^.*SaHpiEventCategoryT\s*==\s*(\w+)\s+(.*)$/; if ($debug) { print("CAT=$cat\n"); } push(@cat_list, $cat); # Handle multiple categories || together while ($rest_of_line =~ /\|\|/) { $rest_of_line =~ s/^\|\|//; # Strip off beginning || my ($cat, $rol) = ($rest_of_line =~ /\s*(\w+)\s+(.*)$/); $rest_of_line = $rol; if ($debug) { print("CAT=$cat\n"); } push(@cat_list, $cat); } } # Find events - assume blank lines end #define section; but support # line continuation characters while (($line = <$file_handle>) !~ /^\s*$/) { my ($event_state, $event_hex) = ($line =~ /^\s*\#define\s+(\w+)\s+.*?(0x\w+)\s*$/); if ($event_state eq "") { ($event_state) = ($line =~ /^\s*\#define\s+(\w+)\s+\\\s*$/); if ($event_state) { $line = <$file_handle>; ($event_hex) = ($line =~ /^\s*.*?(0x\w+)\s*$/); die "Cannot parse continuation event line" unless ($event_hex); } } # Push event state definition to global hashes if ($event_state && $event_hex) { my $str = $event_state; $str =~ s/SAHPI_ES_//; if ($in_global_cat) { $global_category{"ANY"}->{$event_state}->{value} = hex($event_hex); $global_category{"ANY"}->{$event_state}->{string} = $str; } else { foreach my $cat (@cat_list) { if ($debug) { print("CAT=$cat; EVENT STATE=$event_state; HEX=$event_hex; STR=$str x\n"); } $category{$cat}->{$event_state}->{value} = hex($event_hex); $category{$cat}->{$event_state}->{string} = $str; } } } } return 0; } #################################### # Print h file's static leading text #################################### sub print_copywrite(*) { my ( $file_handle ) = @_; print $file_handle < */ /******************************************************************* * WARNING! This file is auto-magically generated by: * $0. * Do not change this file manually. Update script instead *******************************************************************/ EOF return 0; } ####################################### # Print header file static leading text ####################################### sub print_hfile_header(*$) { my ( $filehandle, $filename ) = @_; my $hdef_name = $filename; $hdef_name =~ tr/a-z/A-Z/; $hdef_name =~ s/\./_/g; print $filehandle < #include #include EOF return 0; } #################################### # Print xfile's static leading text #################################### sub print_xfile_header { print FILE_X < #include EOF return 0; } ########################################## # Print xfile header's static leading text ########################################## sub print_xhfile_header { print FILE_XH < #include #include #include #define BAD_ENUM_VALUE -1 int main(int argc, char **argv) { char *expected_str; char *str; EOF return 0; } ############################################ # Print xtestcase file's static leading text ############################################ sub print_xtestfile_header { print XFILE_TEST < #include #include #include int main(int argc, char **argv) { char *expected_str; SaErrorT err; SaHpiEventStateT event_state, expected_state; SaHpiEventCategoryT event_cat, expected_cat; SaHpiTextBufferT buffer; #define BAD_EVENT 0xFFFF EOF return 0; } ############################## # Beautify SaHpi typedef names ############################## sub beautify_type_name($) { my ($name) = @_; $name =~ s/^Sa//; # Strip off beginning Sa - for SaErrorT $name =~ s/^Hpi//; # Strip off beginning Hpi - for rest of SaHpi types $name =~ s/T$//; # Strip off trailing T $name = lc($name); # Lower case name return $name; } ############################### # Print h file's func prototype ############################### sub print_hfile_func($$) { my( $type, $max ) = @_; my $pretty_type = beautify_type_name($type); my $lookup_name = "oh_lookup_" . "$pretty_type"; my $encode_name = "oh_encode_" . "$pretty_type"; my $map_name = "oh_" . "$pretty_type" . "_map"; my $upper_pretty_type = uc($pretty_type); my $max_name = "OH_MAX_" . "$upper_pretty_type"; my $array_name = "$pretty_type" . "_strings[$max_name]"; print FILE_H <Data string, generated by $lookup_name(), back * into an $type type. * * Returns: * $type value - normal operation. * SA_ERR_HPI_INVALID_PARAMS - if \@buffer or \@type is NULL or \@buffer->Data empty. * SA_ERR_HPI_INVALID_DATA - if \@buffer->Data is invalid. **/ SaErrorT $encode_name(SaHpiTextBufferT *buffer, $type *type) { int i, found; if (!buffer || !type || buffer->Data == NULL || buffer->Data[0] == \'\\0\') { return(SA_ERR_HPI_INVALID_PARAMS); } found = 0; for (i=0; i<$max_name; i++) { if (strcasecmp((char *)buffer->Data, $array_member.str) == 0) { found++; break; } } if (found) { *type = $array_member.entity_type; } else { return($ret); } return(SA_OK); } EOF return 0; } ################################ # Print testcase file's testcase ################################ sub print_testfile_case($$) { my( $type, $case ) = @_; my $pretty_type = beautify_type_name($type); my $lookup_name = "oh_lookup_" . "$pretty_type"; my $encode_name = "oh_encode_" . "$pretty_type"; my $casestr = beautify_enum_name($type, $case); print FILE_TEST < ################################################################# use strict; #eval "exec /usr/bin/perl -S $0 $*" # if $Shell_cannot_understand; #! $0 =~ /[^\/]+$/ ; # get the name of this program my $program = $&; my $sflag = 0; my $strname = "eventxml"; while($_ = $ARGV[0], /^-/){ # get options shift; if (/^-s$/) { $sflag = 1; $strname = $ARGV[0]; shift; } elsif (/^-s(.*)/) { $sflag = 1; $strname = $1; } else { print stderr "$program: convert text to C program string...\n"; print stderr " Usage: $program -s strname ] { textfile }\n"; exit 0; } } print <){ chop; s/\\/\\\\/g; s/\t/\\t/g; s/\"/\\"/g; print "\t\"$_\\n\"\n"; } print "\t\"\\0\"\n"; print "};\n"; print "\n"; openhpi-2.14.1/include/0000755000076400007640000000000011302570550011612 5ustar openhpi-2.14.1/include/oh_plugin.h0000644000076400007640000000634611302567027013765 0ustar /* -*- linux-c -*- * * (C) Copright IBM Corp 2004-2006 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Renier Morales */ #ifndef __OH_PLUGIN_H #define __OH_PLUGIN_H #include #include /* * Plugins are kept in a list within the oh_plugins struct */ struct oh_plugins { GSList *list; GStaticRecMutex lock; }; struct oh_plugin { char *name; /* Name of plugin preceded by 'lib' (e.g. "libdummy"). */ /* handle returned by lt_dlopenext or 0 for static plugins */ void *dl_handle; struct oh_abi_v2 *abi; /* pointer to associated plugin interface */ int handler_count; /* How many handlers use this plugin */ /* Synchronization - used internally by plugin interfaces below. */ GStaticRecMutex lock; /* Exclusive lock for working with plugin */ /* These are used to keep the plugin from being unloaded while it * is being referenced. */ int refcount; GStaticRecMutex refcount_lock; }; extern struct oh_plugins oh_plugins; /* * Representation of a handler (plugin instance) */ struct oh_handlers { GHashTable *table; GSList *list; GStaticRecMutex lock; }; struct oh_handler { unsigned int id; /* id of handler */ char *plugin_name; GHashTable *config; /* pointer to handler configuration */ struct oh_abi_v2 *abi; /* pointer to associated plugin interface */ /* * private pointer used by plugin implementations to distinguish * between different instances */ void *hnd; /* Synchronization - used internally by handler interfaces below. */ GStaticRecMutex lock; /* Exclusive lock for working with handler */ /* These are used to keep the handler from being destroyed while it * is being referenced. */ int refcount; GStaticRecMutex refcount_lock; }; extern struct oh_handlers oh_handlers; /* Finalization of plugins and handlers. */ void oh_close_handlers(void); /* Plugin interface functions */ struct oh_plugin *oh_get_plugin(char *plugin_name); void oh_release_plugin(struct oh_plugin *plugin); int oh_getnext_plugin_name(char *plugin_name, char *next_plugin_name, unsigned int size); int oh_load_plugin(char *plugin_name); int oh_unload_plugin(char *plugin_name); /* Handler (plugin instances) interface functions */ struct oh_handler *oh_get_handler(unsigned int hid); void oh_release_handler(struct oh_handler *handler); int oh_getnext_handler_id(unsigned int hid, unsigned int *next_hid); SaErrorT oh_create_handler(GHashTable *handler_config, unsigned int *hid); int oh_destroy_handler(unsigned int hid); SaErrorT oh_discovery(void); /* Bind abi functions into plugin */ int oh_load_plugin_functions(struct oh_plugin *plugin, struct oh_abi_v2 **abi); #endif /*__OH_PLUGIN_H*/ openhpi-2.14.1/include/oh_session.h0000644000076400007640000000462511302567027014150 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * Renier Morales * */ #ifndef __OH_SESSION_H #define __OH_SESSION_H #include #include #include /* * Global table of all active sessions (oh_session). This table is * populated and depopulated by calls to saHpiSessionOpen() and * saHpiSessionClose(). The table has been encapsulated to have a lock * alongside of it. */ struct oh_session_table { GHashTable *table; GSList *list; GStaticRecMutex lock; }; extern struct oh_session_table oh_sessions; /* * Representation of an HPI session */ struct oh_session { /* Session ID as returned by saHpiSessionOpen() */ SaHpiSessionIdT id; /* A session is always associated with exactly one domain */ SaHpiDomainIdT did; SaHpiBoolT subscribed; /* Initialized to false. Will be set to true*/ SaHpiEvtQueueStatusT eventq_status; /* Even if multiple sessions are opened for the same domain, each session could receive different events depending on what events the caller signs up for. This is the session specific event queue */ GAsyncQueue *eventq; }; SaHpiSessionIdT oh_create_session(SaHpiDomainIdT did); SaHpiDomainIdT oh_get_session_domain(SaHpiSessionIdT sid); GArray *oh_list_sessions(SaHpiDomainIdT did); SaErrorT oh_get_session_subscription(SaHpiSessionIdT sid, SaHpiBoolT *state); SaErrorT oh_set_session_subscription(SaHpiSessionIdT sid, SaHpiBoolT state); SaErrorT oh_queue_session_event(SaHpiSessionIdT sid, struct oh_event *event); SaErrorT oh_dequeue_session_event(SaHpiSessionIdT sid, SaHpiTimeoutT timeout, struct oh_event *event, SaHpiEvtQueueStatusT *eventq_status); SaErrorT oh_destroy_session(SaHpiSessionIdT sid); SaErrorT oh_destroy_domain_sessions(SaHpiDomainIdT did); #endif /* __OH_SESSION_H */ openhpi-2.14.1/include/oh_handler.h0000644000076400007640000010026511302567027014077 0ustar /* -*- linux-c -*- * * Copyright (c) 2003 by Intel Corp. * (C) Copright IBM Corp 2003-2006 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Louis Zhuang * Sean Dague * Renier Morales * Racing Guo * Anton Pak */ #ifndef __OH_HANDLER_H #define __OH_HANDLER_H #include #include #include #include #include #include #include #ifdef __cplusplus extern "C" { #endif void oh_wake_event_thread(SaHpiBoolT); /* * Common OpenHPI implementation specific definitions * -------------------------------------------------- * * plugin - software component contained in a shared library that exports * a function named 'get_interface'. Loading a plugin entails * performing a dlopen on the library, finding 'get_interface' with * dl_sym, and calling 'get_interface' to get an interface pointer * (referred to as the 'abi'.) * * abi - pointer to a structure of type oh_abi_XX where XX represents a * version of the structure. This structure is a bundle of function * pointers that represents the interface between a given plug-in * instance (known as a handler), and the OpenHPI infrastructure. * * handler - an instance of a plugin represented by a structure of type * oh_handler which contains an abi and a pointer to an instance * specific data structure that is private to the plug-in. */ /* * How plugins are instantiated * ---------------------------- * * When an HPI application initializes OpenHPI by calling saHpiInitialize(), * the OpenHPI infrastructure will seek out all configured plug-ins * (see oh_config.h for details on how a plug-in is configured), and: * 1. load the plug-in into memory * 2. extract an abi from the plug-in * 3. create a new oh_plugin containing the name of the plugin and * the abi extracted from the plugin * 4. add the oh_plugin to the global list of plugins * * The first time the HPI application creates a new session by calling * saHpiSessionOpen(), the OpenHPI infrastructure will once again examine * the implementation configuration and create new plug-in instances * (i.e. a handler) as the configuration dictates. * * Each handler configuration item will specify: * 1. name of plugin in question * 2. additional arguments understood by the plug-in * * Each new handler is created by: * 1. finding the oh_plugin containing the same plugin name as the * configuration item * 2. using the abi found in the oh_plugin to call abi->open(), passing * the additional plug-in specific arguments to the open function. * The open call will return a void* pointer (known as hnd) that is * required to be passed back to the plug-in for all further abi * function calls. * 3. creating a new oh_handler that contains a pointer to the associated * abi, and the hnd returned by the open function. */ /* * How plugins can have multiple instances open at the same time * ------------------------------------------------------------- * * The key to a plugin being able to support multiple instances * is in the 'void *hnd' passed to all abi functions (except open().) * The intent is that hnd is used as a private pointer to an instance specific * data structure. * * For example, if a plug-in were created to allow an HPI implementation * running a remote server to inter-operate with the local OpenHPI * implementation, then the plug-in could be written such that: * 1. the plugin defines a new structure containing an event queue and tcp * socket to the remote machine * 2. the plugin requires that handler configuration entries for this * plugin to contain the IP address of the remote machine to connect * 3. when open() is called, the plugin * - opens a socket to the new machine * - allocates a new event queue * - allocates a new instance structure * - stores the event queue and socket in the instance structure * - returns a pointer to the structure as 'hnd'. * 4. as other abi functions are called, the 'hnd' passed in with those * functions is cast back to a pointer to the instance data, and then * communicates over the socket in that structure to service the given * request. * */ struct oh_handler_state { unsigned int hid; oh_evt_queue *eventq; GHashTable *config; RPTable *rptcache; oh_el *elcache; GThread *thread_handle; void *data; }; /* Current abi is version 2. Version 1 is out-of-date and nobody * should use it */ /* UUID_OH_ABI_V1 is out-of-date, keep here just for reference * ee778a5f-32cf-453b-a650-518814dc956c */ /* static const uuid_t UUID_OH_ABI_V1 = { 0xee, 0x77, 0x8a, 0x5f, 0x32, 0xcf, 0x45, 0x3b, 0xa6, 0x50, 0x51, 0x88, 0x14, 0xdc, 0x95, 0x6c }; */ /* 13adfcc7-d788-4aaf-b966-5cd30bdcd808 */ /* regen this with via * * perl -e 'use POSIX qw(strftime); my $str = strftime("%Y%m%d%H%M%S",gmtime(time)); $str .= "00"; for my $c (split(//, $str)) {print "0x0$c, "} ' * * any time you make a change */ /* static const uuid_t UUID_OH_ABI_V2 = { 0x02, 0x00, 0x00, 0x04, 0x01, 0x02, 0x01, 0x05, 0x01, 0x06, 0x01, 0x04, 0x01, 0x00, 0x00, 0x00, }; */ static const uuid_t UUID_OH_ABI_V2 = { 0x02, 0x00, 0x00, 0x05, 0x00, 0x04, 0x01, 0x03, 0x01, 0x02, 0x05, 0x04, 0x05, 0x00, 0x00, 0x00, }; struct oh_abi_v2 { /*** * open * handler_config: instance's configuration data. * hid: id of this intance. * eventq: pointer to queue to place events in. * * The function creates a pluing instance. * * Returns: pointer to the handler of the instance **/ void *(*open)(GHashTable *handler_config, unsigned int hid, oh_evt_queue *eventq); void (*close)(void *hnd); /******************************************************************** * PLUGIN HPI ABIs - These plugin functions implement a large part of * the HPI APIs from the specification. ********************************************************************/ /*** * saHpiEventGet - passed down to plugin * * @remark at the start-up, plugins must send out res/rdr event for all * resources and rdrs so as to OpenHPI can build up RPT/RDR. * @return >0 if an event is returned; 0 if timeout; otherwise an error * occur. **/ SaErrorT (*get_event)(void *hnd); /*** * saHpiDiscover, passed down to plugin **/ SaErrorT (*discover_resources)(void *hnd); /*** * saHpiResourceTagSet, this is passed down so the device has * a chance to set it in nv storage if it likes **/ SaErrorT (*set_resource_tag)(void *hnd, SaHpiResourceIdT id, SaHpiTextBufferT *tag); /*** * saHpiResourceSeveritySet is pushed down so the device has * a chance to set it in nv storage **/ SaErrorT (*set_resource_severity)(void *hnd, SaHpiResourceIdT id, SaHpiSeverityT sev); /*** * saHpiResourceFailedRemove, passed down to plugin **/ SaErrorT (*resource_failed_remove)(void *hnd, SaHpiResourceIdT rid); /***************** * EVENT LOG ABIs *****************/ /*** * saHpiEventLogInfoGet **/ SaErrorT (*get_el_info)(void *hnd, SaHpiResourceIdT id, SaHpiEventLogInfoT *info); /*** * saHpiEventLogCapabilitiesGet **/ SaErrorT (*get_el_caps)(void *hnd, SaHpiResourceIdT id, SaHpiEventLogCapabilitiesT *caps); /*** * saHpiEventLogTimeSet **/ SaErrorT (*set_el_time)(void *hnd, SaHpiResourceIdT id, SaHpiTimeT time); /*** * saHpiEventLogEntryAdd **/ SaErrorT (*add_el_entry)(void *hnd, SaHpiResourceIdT id, const SaHpiEventT *Event); /*** * saHpiEventLogEntryGet **/ SaErrorT (*get_el_entry)(void *hnd, SaHpiResourceIdT id, SaHpiEventLogEntryIdT current, SaHpiEventLogEntryIdT *prev, SaHpiEventLogEntryIdT *next, SaHpiEventLogEntryT *entry, SaHpiRdrT *rdr, SaHpiRptEntryT *rptentry); /*** * saHpiEventLogClear **/ SaErrorT (*clear_el)(void *hnd, SaHpiResourceIdT id); /*** * saHpiEventLogStateSet **/ SaErrorT (*set_el_state)(void *hnd, SaHpiResourceIdT id, SaHpiBoolT e); /*** * saHpiEventLogOverflowReset **/ SaErrorT (*reset_el_overflow)(void *hnd, SaHpiResourceIdT id); /************** * SENSOR ABIs **************/ /*** * saHpiSensorReadingGet **/ SaErrorT (*get_sensor_reading)(void *hnd, SaHpiResourceIdT id, SaHpiSensorNumT num, SaHpiSensorReadingT *reading, SaHpiEventStateT *state); /*** * saHpiSensorThresholdsGet **/ SaErrorT (*get_sensor_thresholds)(void *hnd, SaHpiResourceIdT id, SaHpiSensorNumT num, SaHpiSensorThresholdsT *thres); /*** * saHpiSensorThresholdsSet **/ SaErrorT (*set_sensor_thresholds)(void *hnd, SaHpiResourceIdT id, SaHpiSensorNumT num, const SaHpiSensorThresholdsT *thres); /*** * saHpiSensorEnableGet **/ SaErrorT (*get_sensor_enable)(void *hnd, SaHpiResourceIdT id, SaHpiSensorNumT num, SaHpiBoolT *enable); /*** * saHpiSensorEnableSet **/ SaErrorT (*set_sensor_enable)(void *hnd, SaHpiResourceIdT id, SaHpiSensorNumT num, SaHpiBoolT enable); /*** * saHpiSensorEventEnableGet **/ SaErrorT (*get_sensor_event_enables)(void *hnd, SaHpiResourceIdT id, SaHpiSensorNumT num, SaHpiBoolT *enables); /*** * saHpiSensorEventEnableSet **/ SaErrorT (*set_sensor_event_enables)(void *hnd, SaHpiResourceIdT id, SaHpiSensorNumT num, const SaHpiBoolT enables); /*** * saHpiSensorEventMasksGet **/ SaErrorT (*get_sensor_event_masks)(void *hnd, SaHpiResourceIdT id, SaHpiSensorNumT num, SaHpiEventStateT *AssertEventMask, SaHpiEventStateT *DeassertEventMask); /*** * saHpiSensorEventMasksSet **/ SaErrorT (*set_sensor_event_masks)(void *hnd, SaHpiResourceIdT id, SaHpiSensorNumT num, SaHpiSensorEventMaskActionT act, SaHpiEventStateT AssertEventMask, SaHpiEventStateT DeassertEventMask); /*************** * CONTROL ABIs ***************/ /*** * saHpiControlGet **/ SaErrorT (*get_control_state)(void *hnd, SaHpiResourceIdT id, SaHpiCtrlNumT num, SaHpiCtrlModeT *mode, SaHpiCtrlStateT *state); /*** * saHpiControlSet **/ SaErrorT (*set_control_state)(void *hnd, SaHpiResourceIdT id, SaHpiCtrlNumT num, SaHpiCtrlModeT mode, SaHpiCtrlStateT *state); /***************** * INVENTORY ABIs *****************/ /*** * saHpiIdrInfoGet **/ SaErrorT (*get_idr_info)(void *hnd, SaHpiResourceIdT rid, SaHpiIdrIdT idrid, SaHpiIdrInfoT *idrinfo); /*** * saHpiIdrAreaHeaderGet **/ SaErrorT (*get_idr_area_header)(void *hnd, SaHpiResourceIdT rid, SaHpiIdrIdT idrid, SaHpiIdrAreaTypeT areatype, SaHpiEntryIdT areaid, SaHpiEntryIdT *nextareaid, SaHpiIdrAreaHeaderT *header); /*** * saHpiIdrAreaAdd **/ SaErrorT (*add_idr_area)(void *hnd, SaHpiResourceIdT rid, SaHpiIdrIdT idrid, SaHpiIdrAreaTypeT areatype, SaHpiEntryIdT *areaid); /*** * saHpiIdrAreaAddById **/ SaErrorT (*add_idr_area_id)(void *, SaHpiResourceIdT, SaHpiIdrIdT, SaHpiIdrAreaTypeT, SaHpiEntryIdT); /*** * saHpiIdrAreaDelete **/ SaErrorT (*del_idr_area)(void *hnd, SaHpiResourceIdT rid, SaHpiIdrIdT idrid, SaHpiEntryIdT areaid); /*** * saHpiIdrFieldGet **/ SaErrorT (*get_idr_field)(void *hnd, SaHpiResourceIdT rid, SaHpiIdrIdT idrid, SaHpiEntryIdT areaid, SaHpiIdrFieldTypeT fieldtype, SaHpiEntryIdT fieldid, SaHpiEntryIdT *nextfieldid, SaHpiIdrFieldT *field); /*** * saHpiIdrFieldAdd **/ SaErrorT (*add_idr_field)(void *hnd, SaHpiResourceIdT rid, SaHpiIdrIdT idrid, SaHpiIdrFieldT *field); /*** * saHpiIdrFieldAddById **/ SaErrorT (*add_idr_field_id)(void *hnd, SaHpiResourceIdT rid, SaHpiIdrIdT idrid, SaHpiIdrFieldT *field); /*** * saHpiIdrFieldSet **/ SaErrorT (*set_idr_field)(void *hnd, SaHpiResourceIdT rid, SaHpiIdrIdT idrid, SaHpiIdrFieldT *field); /*** * saHpiIdrFieldDelete **/ SaErrorT (*del_idr_field)(void *hnd, SaHpiResourceIdT rid, SaHpiIdrIdT idrid, SaHpiEntryIdT areaid, SaHpiEntryIdT fieldid); /*** * saHpiWatchdogTimerGet **/ SaErrorT (*get_watchdog_info)(void *hnd, SaHpiResourceIdT id, SaHpiWatchdogNumT num, SaHpiWatchdogT *wdt); /*** * saHpiWatchdogTimerSet **/ SaErrorT (*set_watchdog_info)(void *hnd, SaHpiResourceIdT id, SaHpiWatchdogNumT num, SaHpiWatchdogT *wdt); /*** * saHpiWatchdogTimerReset **/ SaErrorT (*reset_watchdog)(void *hnd, SaHpiResourceIdT id, SaHpiWatchdogNumT num); /****************** * ANNUCIATOR ABIs ******************/ /* the first 5 Annunciator functions are really operating on a single Annunciator and doing things to the announcements that it contains. For this reason the functions are named _announce */ /*** * saHpiAnnunciatorGetNext **/ SaErrorT (*get_next_announce)(void *hnd, SaHpiResourceIdT id, SaHpiAnnunciatorNumT num, SaHpiSeverityT sev, SaHpiBoolT ack, SaHpiAnnouncementT *ann); /*** * saHpiAnnunciatorGet **/ SaErrorT (*get_announce)(void *hnd, SaHpiResourceIdT id, SaHpiAnnunciatorNumT num, SaHpiEntryIdT annid, SaHpiAnnouncementT *ann); /*** * saHpiAnnunciatorAcknowledge **/ SaErrorT (*ack_announce)(void *hnd, SaHpiResourceIdT id, SaHpiAnnunciatorNumT num, SaHpiEntryIdT annid, SaHpiSeverityT sev); /*** * saHpiAnnunciatorAdd **/ SaErrorT (*add_announce)(void *hnd, SaHpiResourceIdT id, SaHpiAnnunciatorNumT num, SaHpiAnnouncementT *ann); /*** * saHpiAnnunciatorDelete **/ SaErrorT (*del_announce)(void *hnd, SaHpiResourceIdT id, SaHpiAnnunciatorNumT num, SaHpiEntryIdT annid, SaHpiSeverityT sev); /* the last 2 functions deal with Annunciator mode setting */ /*** * saHpiAnnunciatorModeGet **/ SaErrorT (*get_annunc_mode)(void *hnd, SaHpiResourceIdT id, SaHpiAnnunciatorNumT num, SaHpiAnnunciatorModeT *mode); /*** * saHpiAnnunciatorModeSet **/ SaErrorT (*set_annunc_mode)(void *hnd, SaHpiResourceIdT id, SaHpiAnnunciatorNumT num, SaHpiAnnunciatorModeT mode); /*************** * DIMI ABIs ***************/ /*** * saHpiDimiInfoGet **/ SaErrorT (*get_dimi_info)(void *hnd, SaHpiResourceIdT id, SaHpiDimiNumT num, SaHpiDimiInfoT *info); /*** * saHpiDimiTestInfoGet **/ SaErrorT (*get_dimi_test)(void *hnd, SaHpiResourceIdT id, SaHpiDimiNumT num, SaHpiDimiTestNumT testnum, SaHpiDimiTestT *test); /*** * saHpiDimiTestReadinessGet **/ SaErrorT (*get_dimi_test_ready)( void *hnd, SaHpiResourceIdT id, SaHpiDimiNumT num, SaHpiDimiTestNumT testnum, SaHpiDimiReadyT *ready); /*** * saHpiDimiTestStart **/ SaErrorT (*start_dimi_test)( void *hnd, SaHpiResourceIdT id, SaHpiDimiNumT num, SaHpiDimiTestNumT testnum, SaHpiUint8T numparams, SaHpiDimiTestVariableParamsT *paramslist); /*** * saHpiDimiTestCancel **/ SaErrorT (*cancel_dimi_test)( void *hnd, SaHpiResourceIdT id, SaHpiDimiNumT num, SaHpiDimiTestNumT testnum); /*** * saHpiDimiTestStatusGet **/ SaErrorT (*get_dimi_test_status)( void *hnd, SaHpiResourceIdT id, SaHpiDimiNumT num, SaHpiDimiTestNumT testnum, SaHpiDimiTestPercentCompletedT *percentcompleted, SaHpiDimiTestRunStatusT *runstatus); /*** * saHpiDimiTestResultsGet **/ SaErrorT (*get_dimi_test_results)( void *hnd, SaHpiResourceIdT id, SaHpiDimiNumT num, SaHpiDimiTestNumT testnum, SaHpiDimiTestResultsT *testresults); /*************** * FUMI ABIs ***************/ /*** * saHpiFumiSpecInfoGet **/ SaErrorT (*get_fumi_spec)( void *hnd, SaHpiResourceIdT id, SaHpiFumiNumT num, SaHpiFumiSpecInfoT *specinfo ); /*** * saHpiFumiServiceImpactGet **/ SaErrorT (*get_fumi_service_impact)( void *hnd, SaHpiResourceIdT id, SaHpiFumiNumT num, SaHpiFumiServiceImpactDataT *serviceimpact ); /*** * saHpiFumiSourceSet **/ SaErrorT (*set_fumi_source)( void *hnd, SaHpiResourceIdT id, SaHpiFumiNumT num, SaHpiBankNumT banknum, SaHpiTextBufferT *sourceuri); /*** * saHpiFumiSourceInfoValidateStart **/ SaErrorT (*validate_fumi_source)( void *hnd, SaHpiResourceIdT id, SaHpiFumiNumT num, SaHpiBankNumT banknum); /*** * saHpiFumiSourceInfoGet **/ SaErrorT (*get_fumi_source)( void *hnd, SaHpiResourceIdT id, SaHpiFumiNumT num, SaHpiBankNumT banknum, SaHpiFumiSourceInfoT *sourceinfo); /*** * saHpiFumiSourceComponentInfoGet **/ SaErrorT (*get_fumi_source_component)( void *hnd, SaHpiResourceIdT id, SaHpiFumiNumT num, SaHpiBankNumT banknum, SaHpiEntryIdT compid, SaHpiEntryIdT *nextcompid, SaHpiFumiComponentInfoT *compinfo); /*** * saHpiFumiTargetInfoGet **/ SaErrorT (*get_fumi_target)( void *hnd, SaHpiResourceIdT id, SaHpiFumiNumT num, SaHpiBankNumT banknum, SaHpiFumiBankInfoT *bankinfo); /*** * saHpiFumiTargetComponentInfoGet **/ SaErrorT (*get_fumi_target_component)( void *hnd, SaHpiResourceIdT id, SaHpiFumiNumT num, SaHpiBankNumT banknum, SaHpiEntryIdT compid, SaHpiEntryIdT *nextcompid, SaHpiFumiComponentInfoT *compinfo); /*** * saHpiFumiLogicalTargetInfoGet **/ SaErrorT (*get_fumi_logical_target)( void *hnd, SaHpiResourceIdT id, SaHpiFumiNumT num, SaHpiFumiLogicalBankInfoT *bankinfo); /*** * saHpiFumiLogicalTargetComponentInfoGet **/ SaErrorT (*get_fumi_logical_target_component)( void *hnd, SaHpiResourceIdT id, SaHpiFumiNumT num, SaHpiEntryIdT compid, SaHpiEntryIdT *nextcompid, SaHpiFumiLogicalComponentInfoT *compinfo); /*** * saHpiFumiBackupStart **/ SaErrorT (*start_fumi_backup)( void *hnd, SaHpiResourceIdT id, SaHpiFumiNumT num); /*** * saHpiFumiBankBootOrderSet **/ SaErrorT (*set_fumi_bank_order)( void *hnd, SaHpiResourceIdT id, SaHpiFumiNumT num, SaHpiBankNumT banknum, SaHpiUint32T position); /*** * saHpiFumiBankBootOrderSet **/ SaErrorT (*start_fumi_bank_copy)( void *hnd, SaHpiResourceIdT id, SaHpiFumiNumT num, SaHpiBankNumT sourcebanknum, SaHpiBankNumT targetbanknum); /*** * saHpiFumiInstallStart **/ SaErrorT (*start_fumi_install)( void *hnd, SaHpiResourceIdT id, SaHpiFumiNumT num, SaHpiBankNumT banknum); /*** * saHpiFumiUpgradeStatusGet **/ SaErrorT (*get_fumi_status)( void *hnd, SaHpiResourceIdT id, SaHpiFumiNumT num, SaHpiBankNumT banknum, SaHpiFumiUpgradeStatusT *status); /*** * saHpiFumiTargetVerifyStart **/ SaErrorT (*start_fumi_verify)( void *hnd, SaHpiResourceIdT id, SaHpiFumiNumT num, SaHpiBankNumT banknum); /*** * saHpiFumiTargetVerifyMainStart **/ SaErrorT (*start_fumi_verify_main)( void *hnd, SaHpiResourceIdT id, SaHpiFumiNumT num ); /*** * saHpiFumiUpgradeCancel **/ SaErrorT (*cancel_fumi_upgrade)( void *hnd, SaHpiResourceIdT id, SaHpiFumiNumT num, SaHpiBankNumT banknum); /*** * saHpiFumiAutoRollbackDisableGet **/ SaErrorT (*get_fumi_autorollback_disable)( void *hnd, SaHpiResourceIdT id, SaHpiFumiNumT num, SaHpiBoolT *disable); /*** * saHpiFumiAutoRollbackDisableSet **/ SaErrorT (*set_fumi_autorollback_disable)( void *hnd, SaHpiResourceIdT id, SaHpiFumiNumT num, SaHpiBoolT disable); /*** * saHpiFumiRollbackStart **/ SaErrorT (*start_fumi_rollback)( void *hnd, SaHpiResourceIdT id, SaHpiFumiNumT num); /*** * saHpiFumiActivate **/ SaErrorT (*activate_fumi)( void *hnd, SaHpiResourceIdT id, SaHpiFumiNumT num); /*** * saHpiFumiActivateStart **/ SaErrorT (*start_fumi_activate)( void *hnd, SaHpiResourceIdT id, SaHpiFumiNumT num, SaHpiBoolT logical); /*** * saHpiFumiCleanup **/ SaErrorT (*cleanup_fumi)( void *hnd, SaHpiResourceIdT id, SaHpiFumiNumT num, SaHpiBankNumT banknum); /*************** * HOTSWAP ABIs ***************/ /*** * saHpiHotSwapPolycyCancel **/ SaErrorT (*hotswap_policy_cancel)(void *hnd, SaHpiResourceIdT id, SaHpiTimeoutT timeout); /*** * saHpiAutoInsertTimeoutSet **/ SaErrorT (*set_autoinsert_timeout)(void *hnd, SaHpiTimeoutT timeout); /*** * saHpiAutoExtractTimeoutGet **/ SaErrorT (*get_autoextract_timeout)(void *hnd, SaHpiResourceIdT id, SaHpiTimeoutT *timeout); /*** * saHpiAutoExtractTimeoutSet **/ SaErrorT (*set_autoextract_timeout)(void *hnd, SaHpiResourceIdT id, SaHpiTimeoutT timeout); /*** * saHpiHotSwapStateGet **/ SaErrorT (*get_hotswap_state)(void *hnd, SaHpiResourceIdT id, SaHpiHsStateT *state); /*** * saHpiHotSwapStateSet **/ SaErrorT (*set_hotswap_state)(void *hnd, SaHpiResourceIdT id, SaHpiHsStateT state); /*** * saHpiHotSwapActionRequest **/ SaErrorT (*request_hotswap_action)(void *hnd, SaHpiResourceIdT id, SaHpiHsActionT act); /*** * saHpiHotSwapIndicatorStateGet **/ SaErrorT (*get_indicator_state)(void *hnd, SaHpiResourceIdT id, SaHpiHsIndicatorStateT *state); /*** * saHpiHotSwapIndicatorStateSet **/ SaErrorT (*set_indicator_state)(void *hnd, SaHpiResourceIdT id, SaHpiHsIndicatorStateT state); /************* * POWER ABIs *************/ /*** * saHpiResourcePowerStateGet **/ SaErrorT (*get_power_state)(void *hnd, SaHpiResourceIdT id, SaHpiPowerStateT *state); /*** * saHpiResourcePowerStateSet **/ SaErrorT (*set_power_state)(void *hnd, SaHpiResourceIdT id, SaHpiPowerStateT state); /***************** * PARAMETER ABIs *****************/ /*** * saHpiParmControl **/ SaErrorT (*control_parm)(void *hnd, SaHpiResourceIdT id, SaHpiParmActionT act); /*********************** * Load Management ABIs ***********************/ /*** * saHpiResourceLoadIdGet **/ SaErrorT (*load_id_get)(void *hnd, SaHpiResourceIdT rid, SaHpiLoadIdT *load_id); /*** * saHpiResourceLoadIdSet **/ SaErrorT (*load_id_set)(void *hnd, SaHpiResourceIdT rid, SaHpiLoadIdT *load_id); /************* * RESET ABIs *************/ /*** * saHpiResourceResetStateGet **/ SaErrorT (*get_reset_state)(void *hnd, SaHpiResourceIdT id, SaHpiResetActionT *act); /*** * saHpiResourceResetStateSet **/ SaErrorT (*set_reset_state)(void *hnd, SaHpiResourceIdT id, SaHpiResetActionT act); /********************************** * INJECTOR ABIs - OpenHPI specific **********************************/ /*** * oHpiInjectEvent **/ SaErrorT (*inject_event)(void *hnd, SaHpiEventT *event, SaHpiRptEntryT *rpte, SaHpiRdrT *rdr); }; /*The function is used for plugin loader to get interface*/ int get_interface(void **pp, const uuid_t uuid) __attribute__ ((weak)); /* Structure for static plugins */ typedef int (*get_interface_t)( void **pp, const uuid_t uuid ); struct oh_static_plugin { char *name; get_interface_t get_interface; }; #ifdef __cplusplus } #endif /* Macors for use in handlers to walk a single linked list such as * eventq */ #define g_slist_for_each(pos, head) \ for (pos = head; pos != NULL; pos = g_slist_next(pos)) #define g_slist_for_each_safe(pos, pos1, head) \ for (pos = head, pos1 = g_slist_next(pos); pos; pos = pos1, pos1 = g_slist_next(pos1)) #endif/*__OH_HANDLER_H*/ openhpi-2.14.1/include/oh_domain.h0000644000076400007640000000572611302567027013737 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004, 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * Renier Morales * */ #ifndef __OH_DOMAIN_H #define __OH_DOMAIN_H #define OH_DEFAULT_DOMAIN_ID 0 #ifdef __cplusplus extern "C" { #endif #include #include #include /* * Global table of all active domains (oh_domain). * Encapsulated in a struct to store a lock alongside of it. */ struct oh_domain_table { GHashTable *table; GList *list; GStaticRecMutex lock; }; #define OH_DOMAIN_SINGLE (SaHpiUint8T)0x00 #define OH_DOMAIN_CHILD (SaHpiUint8T)0x01 #define OH_DOMAIN_PARENT (SaHpiUint8T)0x02 #define OH_DOMAIN_PEER (SaHpiUint8T)0x04 struct oh_dat { /* Domain Alarm Table */ SaHpiAlarmIdT next_id; GSList *list; SaHpiUint32T update_count; SaHpiTimeT update_timestamp; SaHpiBoolT overflow; }; struct oh_drt { /* Domain Reference Table */ SaHpiEntryIdT next_id; SaHpiDomainIdT parent_id; GSList *list; SaHpiUint32T update_count; SaHpiTimeT update_timestamp; }; extern struct oh_domain_table oh_domains; /* * Representation of an domain */ struct oh_domain { /* id number of domain */ SaHpiDomainIdT id; /* Name tag of this domain */ SaHpiTextBufferT tag; /* Auto insert timeout for this domain */ SaHpiTimeoutT ai_timeout; /* Domain Capabilities */ SaHpiDomainCapabilitiesT capabilities; SaHpiGuidT guid; /* Resource Presence Table */ RPTable rpt; /* Domain Alarm Table */ struct oh_dat dat; /* Domain Reference Table */ struct oh_drt drt; /* Domain Event Log */ oh_el *del; /* Synchronization - used internally by domain interfaces */ GStaticRecMutex lock; int refcount; GStaticRecMutex refcount_lock; }; SaErrorT oh_create_domain(SaHpiDomainIdT id, char *tag, SaHpiDomainIdT tier_of, SaHpiDomainIdT peer_of, SaHpiDomainCapabilitiesT capabilities, SaHpiTimeoutT ai_timeout ); SaErrorT oh_destroy_domain(SaHpiDomainIdT did); struct oh_domain *oh_get_domain(SaHpiDomainIdT did); SaErrorT oh_release_domain(struct oh_domain *domain); GArray *oh_query_domains(void); SaErrorT oh_drt_entry_get(SaHpiDomainIdT did, SaHpiEntryIdT entryid, SaHpiEntryIdT *nextentryid, SaHpiDrtEntryT *drt); #ifdef __cplusplus } #endif #endif /* __OH_DOMAIN_H */ openhpi-2.14.1/include/oh_error.h0000644000076400007640000000430611302567027013612 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004-2006 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * Renier Morales * */ #ifndef __OH_ERROR_H #define __OH_ERROR_H #include #include #include #include #include /* this is put here intentionally as there are too many instances * of unqualified sprintf calls in plugin code. Use snprintf instead * to ensure there are no buffer overruns */ /* Unfortunately, sprintf is used in the system headers of some versions * of Solaris, so we can't poison sprintf there. */ #if !defined(__sun) || !defined(__SVR4) #undef sprintf #pragma GCC poison sprintf #endif #define OH_ERROR "OPENHPI_ERROR" #define OH_DEBUG "OPENHPI_DEBUG" #ifdef __cplusplus extern "C" { #endif #ifdef OH_DBG_MSGS #define err(format, ...) \ do { \ syslog(3, "ERROR: (%s, %d, "format")", __FILE__, __LINE__,## __VA_ARGS__); \ if (getenv(OH_ERROR) && !strcmp("YES", getenv(OH_ERROR))) { \ fprintf(stderr, "%s:%d ("format")\n", __FILE__, __LINE__, ## __VA_ARGS__); \ } \ } while(0) #else #define err(format, ...) #endif #ifdef OH_DBG_MSGS #define warn(format, ...) \ do { \ syslog(3, "WARNING: (%s, %d, "format")", __FILE__, __LINE__,## __VA_ARGS__); \ if (getenv(OH_ERROR) && !strcmp("YES", getenv(OH_ERROR))) { \ fprintf(stderr, "%s:%d ("format")\n", __FILE__, __LINE__, ## __VA_ARGS__); \ } \ } while(0) #else #define warn(format, ...) #endif #ifdef OH_DBG_MSGS #define dbg(format, ...) \ do { \ if (getenv(OH_DEBUG) && !strcmp("YES", getenv(OH_DEBUG))) { \ fprintf(stderr, " %s:%d:%s: ", __FILE__, __LINE__, __func__); \ fprintf(stderr, format "\n", ## __VA_ARGS__); \ } \ } while(0) #else #define dbg(format, ...) #endif #ifdef __cplusplus } #endif #endif /* __OH_ERROR_H */ openhpi-2.14.1/include/oh_config.h0000644000076400007640000000413111302567027013722 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2003-2006 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Sean Dague * Renier Morales */ #ifndef __OH_CONFIG_H #define __OH_CONFIG_H #ifdef __cplusplus extern "C" { #endif #include #include #include struct oh_parsed_config { GSList *handler_configs; guint handlers_defined; guint handlers_loaded; }; typedef enum { OPENHPI_ON_EP = 1, OPENHPI_LOG_ON_SEV, OPENHPI_EVT_QUEUE_LIMIT, OPENHPI_DEL_SIZE_LIMIT, OPENHPI_DEL_SAVE, OPENHPI_DAT_SIZE_LIMIT, OPENHPI_DAT_USER_LIMIT, OPENHPI_DAT_SAVE, OPENHPI_PATH, OPENHPI_VARPATH, OPENHPI_CONF, OPENHPICLIENT_CONF } oh_global_param_type; typedef union { SaHpiEntityPathT on_ep; SaHpiSeverityT log_on_sev; SaHpiUint32T evt_queue_limit; SaHpiUint32T del_size_limit; SaHpiBoolT del_save; SaHpiUint32T dat_size_limit; SaHpiUint32T dat_user_limit; SaHpiBoolT dat_save; char path[OH_MAX_TEXT_BUFFER_LENGTH]; char varpath[OH_MAX_TEXT_BUFFER_LENGTH]; char conf[OH_MAX_TEXT_BUFFER_LENGTH]; } oh_global_param_union; struct oh_global_param { oh_global_param_type type; oh_global_param_union u; }; /* Plugin configuration information prototypes */ int oh_load_config(char *filename, struct oh_parsed_config *config); SaErrorT oh_process_config(struct oh_parsed_config *config); void oh_clean_config(struct oh_parsed_config *config); /* For handling global parameters */ int oh_get_global_param(struct oh_global_param *param); int oh_set_global_param(struct oh_global_param *param); #ifdef __cplusplus } #endif #endif/*__OH_CONFIG_H*/ openhpi-2.14.1/include/oHpi.h0000644000076400007640000000721311302567027012672 0ustar /* -*- linux-c -*- * * (C) Copright IBM Corp 2004-2006 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Renier Morales */ #ifndef __OHPI_H #define __OHPI_H #include #include #include #define OPENHPI_DEFAULT_DAEMON_PORT 4743 #define MAX_PLUGIN_NAME_LENGTH 32 typedef SaHpiUint32T oHpiHandlerIdT; typedef struct { oHpiHandlerIdT id; char plugin_name[MAX_PLUGIN_NAME_LENGTH]; SaHpiEntityPathT entity_root; int load_failed; } oHpiHandlerInfoT; typedef enum { OHPI_ON_EP = 1, OHPI_LOG_ON_SEV, OHPI_EVT_QUEUE_LIMIT, OHPI_DEL_SIZE_LIMIT, OHPI_DEL_SAVE, OHPI_DAT_SIZE_LIMIT, OHPI_DAT_USER_LIMIT, OHPI_DAT_SAVE, //OHPI_DEBUG, //OHPI_DEBUG_TRACE, //OHPI_DEBUG_LOCK, OHPI_PATH, OHPI_VARPATH, OHPI_CONF } oHpiGlobalParamTypeT; typedef union { SaHpiEntityPathT OnEP; /* Entity path where this openhpi instance runs */ /* Log events of severity equal to ore more critical than this */ SaHpiSeverityT LogOnSev; SaHpiUint32T EvtQueueLimit; /* Max events # allowed in session queue */ SaHpiUint32T DelSizeLimit; /* Maximum size of domain event log */ SaHpiBoolT DelSave; /* True if domain event log is to be saved to disk */ SaHpiUint32T DatSizeLimit; /* Max alarms allowed in alarm table */ SaHpiUint32T DatUserLimit; /* Max number of user alarms allowed */ SaHpiBoolT DatSave; /* True if domain alarm table is to be saved to disk */ //unsigned char Debug; /* 1 = YES, 0 = NO */ //unsigned char DebugTrace; /* !0 = YES, 0 = NO */ //unsigned char DebugLock; /* !0 = YES, 0 = NO */ char Path[OH_MAX_TEXT_BUFFER_LENGTH]; /* Dir path to openhpi plugins */ char VarPath[OH_MAX_TEXT_BUFFER_LENGTH]; /* Dir path for openhpi data */ char Conf[OH_MAX_TEXT_BUFFER_LENGTH]; /* File path of openhpi configuration */ } oHpiGlobalParamUnionT; typedef struct { oHpiGlobalParamTypeT Type; oHpiGlobalParamUnionT u; } oHpiGlobalParamT; /* Version function */ SaHpiUint64T oHpiVersionGet(void); /* Exported OpenHPI handler (plugin instance) calls */ SaErrorT oHpiHandlerCreate(GHashTable *config, oHpiHandlerIdT *id); SaErrorT oHpiHandlerDestroy(oHpiHandlerIdT id); SaErrorT oHpiHandlerInfo(oHpiHandlerIdT id, oHpiHandlerInfoT *info); SaErrorT oHpiHandlerGetNext(oHpiHandlerIdT id, oHpiHandlerIdT *next_id); SaErrorT oHpiHandlerFind(SaHpiSessionIdT sid, SaHpiResourceIdT rid, oHpiHandlerIdT *id); SaErrorT oHpiHandlerRetry(oHpiHandlerIdT id); /* Global parameters */ SaErrorT oHpiGlobalParamGet(oHpiGlobalParamT *param); SaErrorT oHpiGlobalParamSet(oHpiGlobalParamT *param); /* Injector */ SaErrorT oHpiInjectEvent(oHpiHandlerIdT id, SaHpiEventT *event, SaHpiRptEntryT *rpte, SaHpiRdrT *rdr); #define OHPI_VERSION_GET(v, VER) \ { \ char version[] = VER; \ char *start = version; \ char *end = version; \ v += (strtoull(start, &end, 10) << 48); \ end++; \ start = end; \ v += (strtoull(start, &end, 10) << 32); \ end++; \ start = end; \ v += (strtoull(start, &end, 10) << 16); \ } #endif /*__OHPI_H*/ openhpi-2.14.1/include/oh_event.h0000644000076400007640000001144111302567027013600 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004-2006 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * Sean Dague * Renier Morales * */ #ifndef __OH_EVENT_H #define __OH_EVENT_H #include #include #define OH_MAX_EVT_QUEUE_LIMIT 0 #ifdef __cplusplus extern "C" { #endif /*** * Instructions for using oh_event ********************************* * oh_event is primarily used by the plugins to report HPI events. * * Required Fields: * .hid, .event * * Optional Fields: * .resource, .rdrs * * FRU Resource oh_events: * If reporting a resource, the plugin sets the appropiate event in .event. * For example, if reporting a new FRU resource, then the event should be * a hotswap type showing the correct hotswap state (any except NOT_PRESENT) * indicating the library that it should add it to the RPT. * If its just updating the FRU RPT entry, then it should come with a hotswap * event with appropiate transition (current and previous hotswap states equal * or as appropiate). The library will update the RPT entry accordingly. * If the plugin needs to report an extracted FRU, then the hotswap * event has to show the NOT_PRESENT current state, indicating to the library * that it should remove it from the RPT. * Hotswap events must have their accompaining resource set its capability bit * for FRU to 1 or it will be dropped by the infrastructure. * The .resource.ResourceId field can be zero. If so, the RPT will not be * updated, but the SaHpiEventT will be passed on to the session queues and * domain event log normally. * * Non-FRU Resource oh_events: * For adding or updating Non-FRU resources, the .event should be a resource * type HPI event and the ResourceEventType should be RESOURCE_ADDED or * RESOURCE_RESTORED. The resource itself should have its capability bit for * FRU set to zero or the event will be dropped by the infrastructure. * Removing Non-FRU resource from the RPT is not supported anymore as this is * not spec compliant. The Non-FRU resource are always there, but they are * either working or failed. If a resource is failed, then the oh_event should * have a resource event type with the resource state as RESOURCE_FAILED. * The .resource field should have the resource in question. This is used by * the infrastructure to update the RPT and mark the resource as failed * (ResourceFailed == True). The .resource.ResourceId field can be zero. If so, * the RPT will not be updated, but the SaHpiEventT will be passed on to the * session queues and domain event log normally. * * RDRs: * If the event is for a resource, be it FRU or Non-FRU, and the resource did * not previously exist in the RPT for the domain, then the .rdrs field is * scanned for valid SaHpiRdrTs (RdrType != SAHPI_NO_RECORD) objects and each * one is added as an rdr for the resource to the RPT. If the resource is * already in the RPT, then the rdrs field will be ignored. * This is to avoid changes to the RDR repository of a resource once the * resource has already been added as this is not spec compliant. * * Other event types: * If the event is of type SENSOR, SENSOR_ENABLE_CHANGE, WATCHDOG, or OEM, then * The .resource field is scanned for a valid resource to use as reference for * the domain event log. Also, the .rdrs field is scanned for exactly one * SaHpiRdrT to be used as reference for the domain event log and session event * queue. If multiple rdrs are passed for these event types, only the first one * will be used. **/ struct oh_event { unsigned int hid; /* handler id for the event */ SaHpiEventT event; /* If no resource, ResourceCapabilities must be 0 */ SaHpiRptEntryT resource; GSList *rdrs; }; typedef struct _oh_evt_queue oh_evt_queue; extern oh_evt_queue oh_process_q; /* Event utility macros */ #define oh_new_event() g_new0(struct oh_event, 1) #define oh_copy_event(dest, src) memcpy(dest, src, sizeof(struct oh_event)) #define sahpi_new_event() g_new0(SaHpiEventT, 1) #define sahpi_dup_event(old) g_memdup(old, sizeof(SaHpiEventT)) #define sahpi_copy_event(dest, src) memcpy(dest, src, sizeof(SaHpiEventT)) /* function definitions */ int oh_event_init(void); void oh_evt_queue_push(oh_evt_queue *equeue, gpointer data); SaErrorT oh_harvest_events(void); SaErrorT oh_process_events(void); void oh_event_free(struct oh_event *e, int only_rdrs); struct oh_event *oh_dup_event(struct oh_event *old_event); #ifdef __cplusplus } #endif #endif /* __OH_EVENT_H */ openhpi-2.14.1/include/SaHpi.h0000644000076400007640000172333311302567027013010 0ustar /******************************************************************************* ** ** FILE: ** SaHpi.h ** ** DESCRIPTION: ** This file provides the C language binding for the Service ** Availability(TM) Forum Platform Interface. It contains all of ** the prototypes and type definitions. Note, this file was ** generated from the Platform Interface specification document. ** ** SPECIFICATION VERSION: ** SAI-HPI-B.03.01 ** ** DATE: ** Wed Oct 08 2008 18:33 ** ** LEGAL: ** OWNERSHIP OF SPECIFICATION AND COPYRIGHTS. ** The Specification and all worldwide copyrights therein are ** the exclusive property of Licensor. You may not remove, obscure, or ** alter any copyright or other proprietary rights notices that are in or ** on the copy of the Specification you download. You must reproduce all ** such notices on all copies of the Specification you make. Licensor ** may make changes to the Specification, or to items referenced therein, ** at any time without notice. Licensor is not obligated to support or ** update the Specification. ** ** Copyright(c) 2004, 2008, Service Availability(TM) Forum. All rights ** reserved. ** ** Permission to use, copy, modify, and distribute this software for any ** purpose without fee is hereby granted, provided that this entire notice ** is included in all copies of any software which is or includes a copy ** or modification of this software and in all copies of the supporting ** documentation for such software. ** ** THIS SOFTWARE IS BEING PROVIDED "AS IS", WITHOUT ANY EXPRESS OR IMPLIED ** WARRANTY. IN PARTICULAR, THE SERVICE AVAILABILITY FORUM DOES NOT MAKE ANY ** REPRESENTATION OR WARRANTY OF ANY KIND CONCERNING THE MERCHANTABILITY ** OF THIS SOFTWARE OR ITS FITNESS FOR ANY PARTICULAR PURPOSE. ** *******************************************************************************/ #ifndef __SAHPI_H #define __SAHPI_H #ifdef __cplusplus extern "C" { #endif /******************************************************************************* ******************************************************************************** ********** ********** ********** Basic Data Types and Values ********** ********** ********** ******************************************************************************** *******************************************************************************/ /* General Types - need to be specified correctly for the host architecture */ /* ** It is recommended that these types be defined such that the data sizes ** and alignment of each data type are as indicated. The only requirement ** for source compatibility is that the types be defined to be able to ** contain at least the required data (e.g., at least signed 8-bit values ** must be contained in the data type defined as SaHpiInt8T, etc.) ** Following the full recommendations for data size and alignment, however, ** may promote more binary compatibility. */ /* The following definitions produce the recommended sizes and alignments ** using the gcc compiler for the i386 (IA-32) platform. */ /* unsigned 8-bit data, 1-byte alignment */ typedef unsigned char SaHpiUint8T; /* unsigned 16-bit data, 2-byte alignment */ typedef unsigned short SaHpiUint16T; /* unsigned 32-bit data, 4-byte alignment */ typedef unsigned int SaHpiUint32T; /* unsigned 64-bit data, 8-byte alignment */ typedef unsigned long long int SaHpiUint64T __attribute__((__aligned__(8))); /* signed 8-bit data, 1-byte alignment */ typedef signed char SaHpiInt8T; /* signed 16-bit data, 2-byte alignment */ typedef signed short SaHpiInt16T; /* signed 32-bit data, 4-byte alignment */ typedef signed int SaHpiInt32T; /* signed 64-bit data, 8-byte alignment */ typedef signed long long int SaHpiInt64T __attribute__((__aligned__(8))); /* 64-bit floating point, 8-byte alignment */ typedef double SaHpiFloat64T __attribute__((__aligned__(8))); /* enum types are recommended to be 32-bit values, with 4-byte alignment */ typedef SaHpiUint8T SaHpiBoolT; #define SAHPI_TRUE 1 /* While SAHPI_TRUE = 1, any non-zero value is also considered to be True and HPI Users/Implementers of this specification should not test for equality against SAHPI_TRUE. */ #define SAHPI_FALSE 0 /* Platform, O/S, or Vendor dependent */ #ifndef SAHPI_API #define SAHPI_API #endif #ifndef SAHPI_IN #define SAHPI_IN #endif #ifndef SAHPI_OUT #define SAHPI_OUT #endif #ifndef SAHPI_INOUT #define SAHPI_INOUT #endif /* ** Identifier for the manufacturer ** ** This is the IANA-assigned private enterprise number for the ** manufacturer of the resource or FRU, or of the manufacturer ** defining an OEM Control or event type. A list of current ** IANA-assigned private enterprise numbers may be obtained at ** ** http://www.iana.org/assignments/enterprise-numbers ** ** If a manufacturer does not currently have an assigned number, one ** may be obtained by following the instructions located at ** ** http://www.iana.org/cgi-bin/enterprise.pl */ typedef SaHpiUint32T SaHpiManufacturerIdT; #define SAHPI_MANUFACTURER_ID_UNSPECIFIED (SaHpiManufacturerIdT)0 /* Version Types */ typedef SaHpiUint32T SaHpiVersionT; /* ** Interface Version ** ** The interface version is the version of the actual interface and not the ** version of the implementation. It is a 24 bit value where ** the most significant 8 bits represent the compatibility level ** (with letters represented as the corresponding numbers); ** the next 8 bits represent the major version number; and ** the least significant 8 bits represent the minor version number. */ #define SAHPI_INTERFACE_VERSION (SaHpiVersionT)0x020301 /* B.03.01 */ /* ** Return Codes ** ** SaErrorT is defined in the HPI specification. In the future a ** common SAF types definition may be created to contain this type. At ** that time, this typedef should be removed. Each of the return codes ** is defined in Section 4.1 of the specification. ** ** Future version of the specification may add new return codes. User ** programs should accept unknown return codes as indicating an unknown ** error. ** */ typedef SaHpiInt32T SaErrorT; /* Return code */ /* ** SA_OK: */ #define SA_OK (SaErrorT)0x0000 /* This value is the base for all HPI-specific error codes. */ #define SA_HPI_ERR_BASE -1000 #define SA_ERR_HPI_ERROR (SaErrorT)(SA_HPI_ERR_BASE - 1) #define SA_ERR_HPI_UNSUPPORTED_API (SaErrorT)(SA_HPI_ERR_BASE - 2) #define SA_ERR_HPI_BUSY (SaErrorT)(SA_HPI_ERR_BASE - 3) #define SA_ERR_HPI_INTERNAL_ERROR (SaErrorT)(SA_HPI_ERR_BASE - 4) #define SA_ERR_HPI_INVALID_CMD (SaErrorT)(SA_HPI_ERR_BASE - 5) #define SA_ERR_HPI_TIMEOUT (SaErrorT)(SA_HPI_ERR_BASE - 6) #define SA_ERR_HPI_OUT_OF_SPACE (SaErrorT)(SA_HPI_ERR_BASE - 7) #define SA_ERR_HPI_OUT_OF_MEMORY (SaErrorT)(SA_HPI_ERR_BASE - 8) #define SA_ERR_HPI_INVALID_PARAMS (SaErrorT)(SA_HPI_ERR_BASE - 9) #define SA_ERR_HPI_INVALID_DATA (SaErrorT)(SA_HPI_ERR_BASE - 10) #define SA_ERR_HPI_NOT_PRESENT (SaErrorT)(SA_HPI_ERR_BASE - 11) #define SA_ERR_HPI_NO_RESPONSE (SaErrorT)(SA_HPI_ERR_BASE - 12) #define SA_ERR_HPI_DUPLICATE (SaErrorT)(SA_HPI_ERR_BASE - 13) #define SA_ERR_HPI_INVALID_SESSION (SaErrorT)(SA_HPI_ERR_BASE - 14) #define SA_ERR_HPI_INVALID_DOMAIN (SaErrorT)(SA_HPI_ERR_BASE - 15) #define SA_ERR_HPI_INVALID_RESOURCE (SaErrorT)(SA_HPI_ERR_BASE - 16) #define SA_ERR_HPI_INVALID_REQUEST (SaErrorT)(SA_HPI_ERR_BASE - 17) #define SA_ERR_HPI_ENTITY_NOT_PRESENT (SaErrorT)(SA_HPI_ERR_BASE - 18) #define SA_ERR_HPI_READ_ONLY (SaErrorT)(SA_HPI_ERR_BASE - 19) #define SA_ERR_HPI_CAPABILITY (SaErrorT)(SA_HPI_ERR_BASE - 20) #define SA_ERR_HPI_UNKNOWN (SaErrorT)(SA_HPI_ERR_BASE - 21) #define SA_ERR_HPI_INVALID_STATE (SaErrorT)(SA_HPI_ERR_BASE - 22) #define SA_ERR_HPI_UNSUPPORTED_PARAMS (SaErrorT)(SA_HPI_ERR_BASE - 23) /* ** Domain, Session and Resource Type Definitions */ /* Domain ID. */ typedef SaHpiUint32T SaHpiDomainIdT; /* The SAHPI_UNSPECIFIED_DOMAIN_ID value is used to specify the default ** domain. */ #define SAHPI_UNSPECIFIED_DOMAIN_ID (SaHpiDomainIdT) 0xFFFFFFFF /* Session ID. */ typedef SaHpiUint32T SaHpiSessionIdT; /* Resource identifier. */ typedef SaHpiUint32T SaHpiResourceIdT; /* The SAHPI_UNSPECIFIED_RESOURCE_ID value is used to specify the Domain ** Event Log and to specify that there is no resource for such things as HPI ** User events/alarms. */ #define SAHPI_UNSPECIFIED_RESOURCE_ID (SaHpiResourceIdT) 0xFFFFFFFF /* Table Related Type Definitions */ typedef SaHpiUint32T SaHpiEntryIdT; #define SAHPI_FIRST_ENTRY (SaHpiEntryIdT)0x00000000 #define SAHPI_LAST_ENTRY (SaHpiEntryIdT)0xFFFFFFFF #define SAHPI_ENTRY_UNSPECIFIED SAHPI_FIRST_ENTRY /* ** Time Related Type Definitions ** ** An HPI time value represents time as either the number of nanoseconds ** since startup (called "relative time") or as the number of ** nanoseconds since 00:00:00, January 1, 1970 (called "absolute time"). ** Any time value less than or equal to 0x0C00000000000000 is ** interpreted as "relative time". Any time value greater than this ** value is interpreted as "absolute time". ** ** When reporting a relative time, the specific meaning of "startup" ** is implementation dependent. It may mean, for example, system boot, ** startup of the HPI implementation, startup of a particular resource, etc. ** ** With the exception of event log entry timestamps, it is implementation- ** dependent whether absolute or relative time is used for each time value ** passed to an HPI User. For event log entry timestamps, the default ** representation is implementation-specific. However, an HPI User can ** change the representation used on subsequent event log entries by calling ** saHpiEventLogTimeSet(). ** ** HPI time values can represent relative times in a range of 0 to 27 years ** and absolute times from 1997 through 2262. Specific HPI implementations ** may not be able to support these entire ranges. However, all HPI ** implementations must be able to report appropriate time values during the ** life of the system. ** ** For event log timestamps, all HPI implementations must support relative ** times in the range of 0 to the longest time since "startup" that is ever ** expected to be encountered and absolute times representing current time ** throughout the expected life of the system. ** ** It should be noted that although nano-second resolution is supported ** in the data type, the actual resolution provided by an implementation ** may be more limited than this. ** ** The value -2**63, which is 0x8000000000000000, is used to indicate ** "unknown/unspecified time". ** ** Conversion to/from POSIX and other common time representations is ** relatively straightforward. The following code framgment converts ** between SaHpiTimeT and time_t: ** ** time_t tt1, tt2; ** SaHpiTimeT saHpiTime; ** ** time(&tt1); ** saHpiTime = (SaHpiTimeT) tt1 * 1000000000; ** tt2 = saHpiTime / 1000000000; ** ** The following fragment converts between SaHpiTimeT and a struct timeval: ** ** struct timeval tv1, tv2; ** SaHpiTimeT saHpiTime; ** ** gettimeofday(&tv1, NULL); ** saHpiTime = (SaHpiTimeT) tv1.tv_sec * 1000000000 + tv1.tv_usec * 1000; ** tv2.tv_sec = saHpiTime / 1000000000; ** tv2.tv_usec = saHpiTime % 1000000000 / 1000; ** ** The following fragment converts between SaHpiTimeT and a struct timespec: ** ** struct timespec ts1, ts2; ** SaHpiTimeT saHpiTime; ** ** clock_gettime(CLOCK_REALTIME, &ts1); ** saHpiTime = (SaHpiTimeT) ts1.tv_sec * 1000000000 + ts1.tv_nsec; ** ts2.tv_sec = saHpiTime / 1000000000; ** ts2.tv_nsec = saHpiTime % 1000000000; ** ** Note, however, that since time_t is (effectively) universally 32 bits, ** all of these conversions will cease to work on January 18, 2038. ** In any of these conversions, if the SaHpiTimeT value is less than or ** equal to 0x0C00000000000000, then the POSIX time structure represents ** time since startup. If the SaHpiTimeT value is greater than this ** value, then the POSIX time structure represents absolute time of day. ** */ typedef SaHpiInt64T SaHpiTimeT; /* Time in nanoseconds */ /* Unspecified or unknown time */ #define SAHPI_TIME_UNSPECIFIED (SaHpiTimeT) 0x8000000000000000LL /* Maximum time that can be specified as relative */ #define SAHPI_TIME_MAX_RELATIVE (SaHpiTimeT) 0x0C00000000000000LL typedef SaHpiInt64T SaHpiTimeoutT; /* Timeout in nanoseconds */ /* Non-blocking call */ #define SAHPI_TIMEOUT_IMMEDIATE (SaHpiTimeoutT) 0x0000000000000000LL /* Blocking call, wait indefinitely for call to complete */ #define SAHPI_TIMEOUT_BLOCK (SaHpiTimeoutT) -1LL /* ** Language ** ** This enumeration lists all of the languages that can be associated with text. ** ** SAHPI_LANG_UNDEF indicates that the language is unspecified or ** unknown. ** ** This enumerated list may grow in future versions of this specification ** as more languages are added. Legacy HPI Users should consider these new ** languages "valid but unknown". */ typedef enum { SAHPI_LANG_UNDEF = 0, SAHPI_LANG_AFAR, SAHPI_LANG_ABKHAZIAN, SAHPI_LANG_AFRIKAANS, SAHPI_LANG_AMHARIC, SAHPI_LANG_ARABIC, SAHPI_LANG_ASSAMESE, SAHPI_LANG_AYMARA, SAHPI_LANG_AZERBAIJANI, SAHPI_LANG_BASHKIR, SAHPI_LANG_BYELORUSSIAN, SAHPI_LANG_BULGARIAN, SAHPI_LANG_BIHARI, SAHPI_LANG_BISLAMA, SAHPI_LANG_BENGALI, SAHPI_LANG_TIBETAN, SAHPI_LANG_BRETON, SAHPI_LANG_CATALAN, SAHPI_LANG_CORSICAN, SAHPI_LANG_CZECH, SAHPI_LANG_WELSH, SAHPI_LANG_DANISH, SAHPI_LANG_GERMAN, SAHPI_LANG_BHUTANI, SAHPI_LANG_GREEK, SAHPI_LANG_ENGLISH, SAHPI_LANG_ESPERANTO, SAHPI_LANG_SPANISH, SAHPI_LANG_ESTONIAN, SAHPI_LANG_BASQUE, SAHPI_LANG_PERSIAN, SAHPI_LANG_FINNISH, SAHPI_LANG_FIJI, SAHPI_LANG_FAEROESE, SAHPI_LANG_FRENCH, SAHPI_LANG_FRISIAN, SAHPI_LANG_IRISH, SAHPI_LANG_SCOTSGAELIC, SAHPI_LANG_GALICIAN, SAHPI_LANG_GUARANI, SAHPI_LANG_GUJARATI, SAHPI_LANG_HAUSA, SAHPI_LANG_HINDI, SAHPI_LANG_CROATIAN, SAHPI_LANG_HUNGARIAN, SAHPI_LANG_ARMENIAN, SAHPI_LANG_INTERLINGUA, SAHPI_LANG_INTERLINGUE, SAHPI_LANG_INUPIAK, SAHPI_LANG_INDONESIAN, SAHPI_LANG_ICELANDIC, SAHPI_LANG_ITALIAN, SAHPI_LANG_HEBREW, SAHPI_LANG_JAPANESE, SAHPI_LANG_YIDDISH, SAHPI_LANG_JAVANESE, SAHPI_LANG_GEORGIAN, SAHPI_LANG_KAZAKH, SAHPI_LANG_GREENLANDIC, SAHPI_LANG_CAMBODIAN, SAHPI_LANG_KANNADA, SAHPI_LANG_KOREAN, SAHPI_LANG_KASHMIRI, SAHPI_LANG_KURDISH, SAHPI_LANG_KIRGHIZ, SAHPI_LANG_LATIN, SAHPI_LANG_LINGALA, SAHPI_LANG_LAOTHIAN, SAHPI_LANG_LITHUANIAN, SAHPI_LANG_LATVIANLETTISH, SAHPI_LANG_MALAGASY, SAHPI_LANG_MAORI, SAHPI_LANG_MACEDONIAN, SAHPI_LANG_MALAYALAM, SAHPI_LANG_MONGOLIAN, SAHPI_LANG_MOLDAVIAN, SAHPI_LANG_MARATHI, SAHPI_LANG_MALAY, SAHPI_LANG_MALTESE, SAHPI_LANG_BURMESE, SAHPI_LANG_NAURU, SAHPI_LANG_NEPALI, SAHPI_LANG_DUTCH, SAHPI_LANG_NORWEGIAN, SAHPI_LANG_OCCITAN, SAHPI_LANG_AFANOROMO, SAHPI_LANG_ORIYA, SAHPI_LANG_PUNJABI, SAHPI_LANG_POLISH, SAHPI_LANG_PASHTOPUSHTO, SAHPI_LANG_PORTUGUESE, SAHPI_LANG_QUECHUA, SAHPI_LANG_RHAETOROMANCE, SAHPI_LANG_KIRUNDI, SAHPI_LANG_ROMANIAN, SAHPI_LANG_RUSSIAN, SAHPI_LANG_KINYARWANDA, SAHPI_LANG_SANSKRIT, SAHPI_LANG_SINDHI, SAHPI_LANG_SANGRO, SAHPI_LANG_SERBOCROATIAN, SAHPI_LANG_SINGHALESE, SAHPI_LANG_SLOVAK, SAHPI_LANG_SLOVENIAN, SAHPI_LANG_SAMOAN, SAHPI_LANG_SHONA, SAHPI_LANG_SOMALI, SAHPI_LANG_ALBANIAN, SAHPI_LANG_SERBIAN, SAHPI_LANG_SISWATI, SAHPI_LANG_SESOTHO, SAHPI_LANG_SUDANESE, SAHPI_LANG_SWEDISH, SAHPI_LANG_SWAHILI, SAHPI_LANG_TAMIL, SAHPI_LANG_TELUGU, SAHPI_LANG_TAJIK, SAHPI_LANG_THAI, SAHPI_LANG_TIGRINYA, SAHPI_LANG_TURKMEN, SAHPI_LANG_TAGALOG, SAHPI_LANG_SETSWANA, SAHPI_LANG_TONGA, SAHPI_LANG_TURKISH, SAHPI_LANG_TSONGA, SAHPI_LANG_TATAR, SAHPI_LANG_TWI, SAHPI_LANG_UKRAINIAN, SAHPI_LANG_URDU, SAHPI_LANG_UZBEK, SAHPI_LANG_VIETNAMESE, SAHPI_LANG_VOLAPUK, SAHPI_LANG_WOLOF, SAHPI_LANG_XHOSA, SAHPI_LANG_YORUBA, SAHPI_LANG_CHINESE, SAHPI_LANG_ZULU, SAHPI_LANG_MAX_VALID = SAHPI_LANG_ZULU } SaHpiLanguageT; /* ** Text Buffers ** ** These structures are used for defining the type of data in the text buffer ** and the length of the buffer. Text buffers are used in many places for ** variable length strings of data. ** ** The encoding of the Data field in the SaHpiTextBufferT structure is defined ** by the value of the DataType field in the buffer. The following table ** describes the various encodings: ** ** DataType Encoding ** -------- -------- ** ** SAHPI_TL_TYPE_UNICODE 16-bit Unicode. See Note 3 below. ** ** SAHPI_TL_TYPE_BCDPLUS 8-bit ASCII, "0"-"9" or space, dash, period, ** colon, comma, or underscore only. ** See Note 2 below. ** ** SAHPI_TL_TYPE_ASCII6 8-bit ASCII, reduced set, 0x20=0x5f only. ** See Note 2 below. ** ** SAHPI_TL_TYPE_TEXT 8-bit ASCII+Latin 1. See Note 1 below. ** ** SAHPI_TL_TYPE_BINARY 8-bit bytes, any values legal ** ** Note 1: "ASCII+Latin 1" is derived from the first 256 characters of ** Unicode 2.0. The first 256 codes of Unicode follow ISO 646 (ASCII) ** and ISO 8859/1 (Latin 1). The Unicode "C0 Controls and Basic Latin" ** set defines the first 128 8-bit characters (00h-7Fh) and the ** "C1 Controls and Latin 1 Supplement" defines the second 128 (80h-FFh). ** ** Note 2: The SAHPI_TL_TYPE_BCDPLUS and SAHPI_TL_TYPE_ASCII6 encodings ** use normal ASCII character encodings, but restrict the allowed ** characters to a subset of the entire ASCII character set. These ** encodings are used when the target device contains restrictions ** on which characters it can store or display. SAHPI_TL_TYPE_BCDPLUS ** data may be stored externally as 4-bit values, and ** SAHPI_TL_TYPE_ASCII6 may be stored externally as 6-bit values. ** But, regardless of how the data is stored externally, it is ** encoded as 8-bit ASCII in the SaHpiTextBufferT structure passed ** across the HPI. ** ** Note 3: Unicode data is encoded according to the UTF-16LE encoding scheme ** as defined in the UNICODE 4.0 standard. This encoding scheme stores ** 21-bit UNICODE code points in a series of 16-bit values stored ** least-siginficant-byte first in the SaHpiTextBufferT Data field. ** The SaHpiTextBufferT DataLength field contains the number of bytes, ** so must always be an even number (maximum 0xFE) when the DataType is ** SAHPI_TL_TYPE_UNICODE. In addition to containing an even number of ** bytes, the text buffer must also contain a well-formed UTF-16LE ** sequence (meaning no "unmatched surrogates" may be present), and ** must not include encodings of any UNICODE "Non-Characters" in order ** to be considered valid. More details can be found in the Unicode ** specification available at www.unicode.org. */ #define SAHPI_MAX_TEXT_BUFFER_LENGTH 255 typedef enum { SAHPI_TL_TYPE_UNICODE = 0, /* 2-byte UNICODE characters; DataLength must be even. */ SAHPI_TL_TYPE_BCDPLUS, /* String of ASCII characters, "0"-"9", space, dash, period, colon, comma or underscore ONLY */ SAHPI_TL_TYPE_ASCII6, /* Reduced ASCII character set: 0x20-0x5F ONLY */ SAHPI_TL_TYPE_TEXT, /* ASCII+Latin 1 */ SAHPI_TL_TYPE_BINARY, /* Binary data, any values legal */ SAHPI_TL_TYPE_MAX_VALID = SAHPI_TL_TYPE_BINARY } SaHpiTextTypeT; typedef struct { SaHpiTextTypeT DataType; SaHpiLanguageT Language; /* Language the text is in. */ SaHpiUint8T DataLength; /* Bytes used in Data buffer */ SaHpiUint8T Data[SAHPI_MAX_TEXT_BUFFER_LENGTH]; /* Data buffer */ } SaHpiTextBufferT; /* ** Instrument Id ** ** The following data type is used for all management instrument identifiers - ** Sensor numbers, Control numbers, Watchdog Timer numbers, etc. ** */ typedef SaHpiUint32T SaHpiInstrumentIdT; /******************************************************************************* ******************************************************************************** ********** ********** ********** Entities ********** ********** ********** ******************************************************************************** *******************************************************************************/ /* ** Entity Types ** ** An Entity is a physical hardware component of the system. Entities are ** defined with an entity type enumeration, and an entity location number ** (to identify the physical location of a particular type of entity). ** ** Entities are uniquely identified in a system with an ordered series of ** Entity Type / Entity Location pairs called an "Entity Path". Each subsequent ** Entity Type/Entity Location in the path is the next higher "containing" ** entity. The "root" of the Entity Path (the outermost level of containment) ** is designated with an Entity Type of SAHPI_ENT_ROOT if the entire Entity Path ** is fewer than SAHPI_MAX_ENTITY_PATH entries in length. ** ** Enumerated Entity Types include those types enumerated by the IPMI Consortium ** for IPMI-managed entities, as well as additional types defined by the ** HPI specification. ** Future versions of this specification may add new Entity Types to this ** enumerated type. Room is left in the enumeration for the inclusion of Entity ** Types taken from other lists, if needed in the future. ** Legacy HPI Users should consider these new entity types "valid but unknown". */ /* Base values for entity types from various sources. */ #define SAHPI_ENT_IPMI_GROUP 0 #define SAHPI_ENT_SAFHPI_GROUP 0x10000 #define SAHPI_ENT_ROOT_VALUE 0xFFFF typedef enum { SAHPI_ENT_UNSPECIFIED = SAHPI_ENT_IPMI_GROUP, SAHPI_ENT_OTHER, SAHPI_ENT_UNKNOWN, SAHPI_ENT_PROCESSOR, SAHPI_ENT_DISK_BAY, /* Disk or disk bay */ SAHPI_ENT_PERIPHERAL_BAY, SAHPI_ENT_SYS_MGMNT_MODULE, /* System management module */ SAHPI_ENT_SYSTEM_BOARD, /* Main system board, may also be processor board and/or internal expansion board */ SAHPI_ENT_MEMORY_MODULE, /* Board holding memory devices */ SAHPI_ENT_PROCESSOR_MODULE, /* Holds processors, use this designation when processors are not mounted on system board */ SAHPI_ENT_POWER_SUPPLY, /* Main power supply (supplies) for the system */ SAHPI_ENT_ADD_IN_CARD, SAHPI_ENT_FRONT_PANEL_BOARD, /* Control panel */ SAHPI_ENT_BACK_PANEL_BOARD, SAHPI_ENT_POWER_SYSTEM_BOARD, SAHPI_ENT_DRIVE_BACKPLANE, SAHPI_ENT_SYS_EXPANSION_BOARD, /* System internal expansion board (contains expansion slots). */ SAHPI_ENT_OTHER_SYSTEM_BOARD, /* Part of board set */ SAHPI_ENT_PROCESSOR_BOARD, /* Holds 1 or more processors. Includes boards that hold SECC modules */ SAHPI_ENT_POWER_UNIT, /* Power unit / power domain (typically used as a pre-defined logical entity for grouping power supplies)*/ SAHPI_ENT_POWER_MODULE, /* Power module / DC-to-DC converter. Use this value for internal converters. Note: You should use entity ID (power supply) for the main power supply even if the main supply is a DC-to-DC converter */ SAHPI_ENT_POWER_MGMNT, /* Power management/distribution board */ SAHPI_ENT_CHASSIS_BACK_PANEL_BOARD, SAHPI_ENT_SYSTEM_CHASSIS, SAHPI_ENT_SUB_CHASSIS, SAHPI_ENT_OTHER_CHASSIS_BOARD, SAHPI_ENT_DISK_DRIVE_BAY, SAHPI_ENT_PERIPHERAL_BAY_2, SAHPI_ENT_DEVICE_BAY, SAHPI_ENT_COOLING_DEVICE, /* Fan/cooling device */ SAHPI_ENT_COOLING_UNIT, /* Can be used as a pre-defined logical entity for grouping fans or other cooling devices. */ SAHPI_ENT_INTERCONNECT, /* Cable / interconnect */ SAHPI_ENT_MEMORY_DEVICE, /* This Entity ID should be used for replaceable memory devices, e.g. DIMM/SIMM. It is recommended that Entity IDs not be used for individual non-replaceable memory devices. Rather, monitoring and error reporting should be associated with the FRU [e.g. memory card] holding the memory. */ SAHPI_ENT_SYS_MGMNT_SOFTWARE, /* System Management Software */ SAHPI_ENT_BIOS, SAHPI_ENT_OPERATING_SYSTEM, SAHPI_ENT_SYSTEM_BUS, SAHPI_ENT_GROUP, /* This is a logical entity for use with Entity Association records. It is provided to allow a Sensor data record to point to an entity- association record when there is no appropriate pre-defined logical entity for the entity grouping. This Entity should not be used as a physical entity. */ SAHPI_ENT_REMOTE, /* Out of band management communication device */ SAHPI_ENT_EXTERNAL_ENVIRONMENT, SAHPI_ENT_BATTERY, SAHPI_ENT_RESERVED_1, SAHPI_ENT_RESERVED_2, SAHPI_ENT_RESERVED_3, SAHPI_ENT_RESERVED_4, SAHPI_ENT_RESERVED_5, SAHPI_ENT_MC_FIRMWARE , /* Management Controller Firmware, represents firmware or software running on a management controller */ SAHPI_ENT_IPMI_CHANNEL, /* This Entity ID enables associating Sensors with the IPMI communication channels - for example a Redundancy Sensor could be used to report redundancy status for a channel that is composed of multiple physical links. By convention, the Entity Instance corresponds to the channel number. */ SAHPI_ENT_PCI_BUS, SAHPI_ENT_PCI_EXPRESS_BUS, SAHPI_ENT_SCSI_BUS, SAHPI_ENT_SATA_BUS, SAHPI_ENT_PROC_FSB, /* Processor, front side bus */ SAHPI_ENT_CLOCK, /* e.g. Real Time Clock (RTC) */ SAHPI_ENT_SYSTEM_FIRMWARE, /* e.g. BIOS/ EFI */ /* The range from SAHPI_ENT_SYSTEM_FIRMWARE + 1 to SAHPI_ENT_CHASSIS_SPECIFIC - 1 is Reserved for future use by this specification */ SAHPI_ENT_CHASSIS_SPECIFIC = SAHPI_ENT_IPMI_GROUP + 0x90, SAHPI_ENT_BOARD_SET_SPECIFIC = SAHPI_ENT_IPMI_GROUP + 0xB0, SAHPI_ENT_OEM_SYSINT_SPECIFIC = SAHPI_ENT_IPMI_GROUP + 0xD0, SAHPI_ENT_ROOT = SAHPI_ENT_ROOT_VALUE, SAHPI_ENT_RACK = SAHPI_ENT_SAFHPI_GROUP, SAHPI_ENT_SUBRACK, SAHPI_ENT_COMPACTPCI_CHASSIS, SAHPI_ENT_ADVANCEDTCA_CHASSIS, SAHPI_ENT_RACK_MOUNTED_SERVER, SAHPI_ENT_SYSTEM_BLADE, SAHPI_ENT_SWITCH, /* Network switch, such as a rack-mounted ethernet or fabric switch. */ SAHPI_ENT_SWITCH_BLADE, /* Network switch, as above, but in a bladed system. */ SAHPI_ENT_SBC_BLADE, SAHPI_ENT_IO_BLADE, SAHPI_ENT_DISK_BLADE, SAHPI_ENT_DISK_DRIVE, SAHPI_ENT_FAN, SAHPI_ENT_POWER_DISTRIBUTION_UNIT, SAHPI_ENT_SPEC_PROC_BLADE, /* Special Processing Blade, including DSP */ SAHPI_ENT_IO_SUBBOARD, /* I/O Sub-Board, including PMC I/O board */ SAHPI_ENT_SBC_SUBBOARD, /* SBC Sub-Board, including PMC SBC board */ SAHPI_ENT_ALARM_MANAGER, /* Chassis alarm manager board */ SAHPI_ENT_SHELF_MANAGER, /* Blade-based shelf manager */ SAHPI_ENT_DISPLAY_PANEL, /* Display panel, such as an alarm display panel. */ SAHPI_ENT_SUBBOARD_CARRIER_BLADE, /* Includes PMC Carrier Blade -- Use only if "carrier" is only function of blade. Else use primary function (SBC_BLADE, SPEC_PROC_BLADE, etc.). */ SAHPI_ENT_PHYSICAL_SLOT, /* Indicates the physical slot into which a FRU is inserted. */ SAHPI_ENT_PICMG_FRONT_BLADE, /* Any blade conforming to a PICMG Standard. E.g. AdvancedTCA */ SAHPI_ENT_SYSTEM_INVENTORY_DEVICE, /* Inventory storage device for storing system definitions */ SAHPI_ENT_FILTRATION_UNIT, /* E.g. a fan filter */ SAHPI_ENT_AMC, /* Advanced Mezzannine Card */ /* The range from SAHPI_ENT_AMC + 0x01 to SAHPI_ENT_SAFHPI_GROUP + 0x2F is reserved for future use by this specification */ SAHPI_ENT_BMC = SAHPI_ENT_SAFHPI_GROUP + 0x30, /* Baseboard Management Controller */ SAHPI_ENT_IPMC, /* IPM controller */ SAHPI_ENT_MMC, /* Module Management controller */ SAHPI_ENT_SHMC, /* Shelf Mangement Controller */ SAHPI_ENT_CPLD, /* Complex Programmable Logic Device */ SAHPI_ENT_EPLD, /* Electrically Programmable Logic Device */ SAHPI_ENT_FPGA, /* Field Prorammable Gate Array */ SAHPI_ENT_DASD, /* Direct Access Storage Device */ SAHPI_ENT_NIC, /* Network Interface Card */ SAHPI_ENT_DSP, /* Digital Signal Processor */ SAHPI_ENT_UCODE, /* Microcode */ SAHPI_ENT_NPU, /* Network Processor */ SAHPI_ENT_OEM, /* Proprietary device */ SAHPI_ENT_MAX_VALID = SAHPI_ENT_OEM /* The range from SAHPI_ENT_OEM + 0x01 to SAHPI_ENT_SAFHPI_GROUP + 0xFF is reserved for future use by this specification */ } SaHpiEntityTypeT; typedef SaHpiUint32T SaHpiEntityLocationT; typedef struct { SaHpiEntityTypeT EntityType; SaHpiEntityLocationT EntityLocation; } SaHpiEntityT; #define SAHPI_MAX_ENTITY_PATH 16 typedef struct { SaHpiEntityT Entry[SAHPI_MAX_ENTITY_PATH]; } SaHpiEntityPathT; /******************************************************************************* ******************************************************************************** ********** ********** ********** Sensor Event States ********** ********** ********** ******************************************************************************** *******************************************************************************/ /* ** Category ** ** Sensor events contain an event category and event state. Depending on the ** event category, the event states take on different meanings for events ** generated by specific Sensors. ** ** It is recommended that implementations map their Sensor specific ** event categories into the set of categories listed here. When such a mapping ** is impractical or impossible, the SAHPI_EC_SENSOR_SPECIFIC category should ** be used. ** ** The SAHPI_EC_GENERIC category can be used for discrete Sensors which have ** state meanings other than those identified with other event categories. ** ** Future versions of this specification may add new event categories to this ** list. Legacy HPI Users should consider these new event categories as being ** equivalent to SAHPI_EC_GENERIC. */ typedef SaHpiUint8T SaHpiEventCategoryT; #define SAHPI_EC_UNSPECIFIED (SaHpiEventCategoryT)0x00 /* Unspecified */ #define SAHPI_EC_THRESHOLD (SaHpiEventCategoryT)0x01 /* Threshold events */ #define SAHPI_EC_USAGE (SaHpiEventCategoryT)0x02 /* Usage state events */ #define SAHPI_EC_STATE (SaHpiEventCategoryT)0x03 /* Generic state events */ #define SAHPI_EC_PRED_FAIL (SaHpiEventCategoryT)0x04 /* Predictive fail events */ #define SAHPI_EC_LIMIT (SaHpiEventCategoryT)0x05 /* Limit events */ #define SAHPI_EC_PERFORMANCE (SaHpiEventCategoryT)0x06 /* Performance events */ #define SAHPI_EC_SEVERITY (SaHpiEventCategoryT)0x07 /* Severity indicating events */ #define SAHPI_EC_PRESENCE (SaHpiEventCategoryT)0x08 /* Device presence events */ #define SAHPI_EC_ENABLE (SaHpiEventCategoryT)0x09 /* Device enabled events */ #define SAHPI_EC_AVAILABILITY (SaHpiEventCategoryT)0x0A /* Availability state events */ #define SAHPI_EC_REDUNDANCY (SaHpiEventCategoryT)0x0B /* Redundancy state events */ #define SAHPI_EC_SENSOR_SPECIFIC (SaHpiEventCategoryT)0x7E /* Sensor- specific events */ #define SAHPI_EC_GENERIC (SaHpiEventCategoryT)0x7F /* OEM defined events */ /* ** Event States ** ** The following event states are specified relative to the categories listed ** above. The event types are only valid for their given category. Each set of ** events is labeled as to which category it belongs to. ** Each event has only one event state associated with it. When retrieving ** the event status or event enabled status a bit mask of all applicable event ** states is used. Similarly, when setting the event enabled status a bit mask ** of all applicable event states is used. */ typedef SaHpiUint16T SaHpiEventStateT; /* ** SaHpiEventCategoryT == */ #define SAHPI_ES_UNSPECIFIED (SaHpiEventStateT)0x0000 /* ** SaHpiEventCategoryT == SAHPI_EC_THRESHOLD ** When using these event states, the event state should match ** the event severity (for example SAHPI_ES_LOWER_MINOR should have an ** event severity of SAHPI_MINOR). */ #define SAHPI_ES_LOWER_MINOR (SaHpiEventStateT)0x0001 #define SAHPI_ES_LOWER_MAJOR (SaHpiEventStateT)0x0002 #define SAHPI_ES_LOWER_CRIT (SaHpiEventStateT)0x0004 #define SAHPI_ES_UPPER_MINOR (SaHpiEventStateT)0x0008 #define SAHPI_ES_UPPER_MAJOR (SaHpiEventStateT)0x0010 #define SAHPI_ES_UPPER_CRIT (SaHpiEventStateT)0x0020 /* SaHpiEventCategoryT == SAHPI_EC_USAGE */ #define SAHPI_ES_IDLE (SaHpiEventStateT)0x0001 #define SAHPI_ES_ACTIVE (SaHpiEventStateT)0x0002 #define SAHPI_ES_BUSY (SaHpiEventStateT)0x0004 /* SaHpiEventCategoryT == SAHPI_EC_STATE */ #define SAHPI_ES_STATE_DEASSERTED (SaHpiEventStateT)0x0001 #define SAHPI_ES_STATE_ASSERTED (SaHpiEventStateT)0x0002 /* SaHpiEventCategoryT == SAHPI_EC_PRED_FAIL */ #define SAHPI_ES_PRED_FAILURE_DEASSERT (SaHpiEventStateT)0x0001 #define SAHPI_ES_PRED_FAILURE_ASSERT (SaHpiEventStateT)0x0002 /* SaHpiEventCategoryT == SAHPI_EC_LIMIT */ #define SAHPI_ES_LIMIT_NOT_EXCEEDED (SaHpiEventStateT)0x0001 #define SAHPI_ES_LIMIT_EXCEEDED (SaHpiEventStateT)0x0002 /* SaHpiEventCategoryT == SAHPI_EC_PERFORMANCE */ #define SAHPI_ES_PERFORMANCE_MET (SaHpiEventStateT)0x0001 #define SAHPI_ES_PERFORMANCE_LAGS (SaHpiEventStateT)0x0002 /* ** SaHpiEventCategoryT == SAHPI_EC_SEVERITY ** When using these event states, the event state should match ** the event severity */ #define SAHPI_ES_OK (SaHpiEventStateT)0x0001 #define SAHPI_ES_MINOR_FROM_OK (SaHpiEventStateT)0x0002 #define SAHPI_ES_MAJOR_FROM_LESS (SaHpiEventStateT)0x0004 #define SAHPI_ES_CRITICAL_FROM_LESS (SaHpiEventStateT)0x0008 #define SAHPI_ES_MINOR_FROM_MORE (SaHpiEventStateT)0x0010 #define SAHPI_ES_MAJOR_FROM_CRITICAL (SaHpiEventStateT)0x0020 #define SAHPI_ES_CRITICAL (SaHpiEventStateT)0x0040 #define SAHPI_ES_MONITOR (SaHpiEventStateT)0x0080 #define SAHPI_ES_INFORMATIONAL (SaHpiEventStateT)0x0100 /* SaHpiEventCategoryT == SAHPI_EC_PRESENCE */ #define SAHPI_ES_ABSENT (SaHpiEventStateT)0x0001 #define SAHPI_ES_PRESENT (SaHpiEventStateT)0x0002 /* SaHpiEventCategoryT == SAHPI_EC_ENABLE */ #define SAHPI_ES_DISABLED (SaHpiEventStateT)0x0001 #define SAHPI_ES_ENABLED (SaHpiEventStateT)0x0002 /* SaHpiEventCategoryT == SAHPI_EC_AVAILABILITY */ #define SAHPI_ES_RUNNING (SaHpiEventStateT)0x0001 #define SAHPI_ES_TEST (SaHpiEventStateT)0x0002 #define SAHPI_ES_POWER_OFF (SaHpiEventStateT)0x0004 #define SAHPI_ES_ON_LINE (SaHpiEventStateT)0x0008 #define SAHPI_ES_OFF_LINE (SaHpiEventStateT)0x0010 #define SAHPI_ES_OFF_DUTY (SaHpiEventStateT)0x0020 #define SAHPI_ES_DEGRADED (SaHpiEventStateT)0x0040 #define SAHPI_ES_POWER_SAVE (SaHpiEventStateT)0x0080 #define SAHPI_ES_INSTALL_ERROR (SaHpiEventStateT)0x0100 /* SaHpiEventCategoryT == SAHPI_EC_REDUNDANCY */ #define SAHPI_ES_FULLY_REDUNDANT (SaHpiEventStateT)0x0001 #define SAHPI_ES_REDUNDANCY_LOST (SaHpiEventStateT)0x0002 #define SAHPI_ES_REDUNDANCY_DEGRADED (SaHpiEventStateT)0x0004 #define SAHPI_ES_REDUNDANCY_LOST_SUFFICIENT_RESOURCES \ (SaHpiEventStateT)0x0008 #define SAHPI_ES_NON_REDUNDANT_SUFFICIENT_RESOURCES \ (SaHpiEventStateT)0x0010 #define SAHPI_ES_NON_REDUNDANT_INSUFFICIENT_RESOURCES \ (SaHpiEventStateT)0x0020 #define SAHPI_ES_REDUNDANCY_DEGRADED_FROM_FULL (SaHpiEventStateT)0x0040 #define SAHPI_ES_REDUNDANCY_DEGRADED_FROM_NON (SaHpiEventStateT)0x0080 /* ** SaHpiEventCategoryT == SAHPI_EC_GENERIC || SAHPI_EC_SENSOR_SPECIFIC ** These event states are implementation-specific. */ #define SAHPI_ES_STATE_00 (SaHpiEventStateT)0x0001 #define SAHPI_ES_STATE_01 (SaHpiEventStateT)0x0002 #define SAHPI_ES_STATE_02 (SaHpiEventStateT)0x0004 #define SAHPI_ES_STATE_03 (SaHpiEventStateT)0x0008 #define SAHPI_ES_STATE_04 (SaHpiEventStateT)0x0010 #define SAHPI_ES_STATE_05 (SaHpiEventStateT)0x0020 #define SAHPI_ES_STATE_06 (SaHpiEventStateT)0x0040 #define SAHPI_ES_STATE_07 (SaHpiEventStateT)0x0080 #define SAHPI_ES_STATE_08 (SaHpiEventStateT)0x0100 #define SAHPI_ES_STATE_09 (SaHpiEventStateT)0x0200 #define SAHPI_ES_STATE_10 (SaHpiEventStateT)0x0400 #define SAHPI_ES_STATE_11 (SaHpiEventStateT)0x0800 #define SAHPI_ES_STATE_12 (SaHpiEventStateT)0x1000 #define SAHPI_ES_STATE_13 (SaHpiEventStateT)0x2000 #define SAHPI_ES_STATE_14 (SaHpiEventStateT)0x4000 /******************************************************************************* ******************************************************************************** ********** ********** ********** Sensors ********** ********** ********** ******************************************************************************** *******************************************************************************/ /* Sensor Number */ typedef SaHpiInstrumentIdT SaHpiSensorNumT; /* ** The following specifies the named range for Sensor numbers reserved ** by the HPI specification. ** HPI Implementations shall not assign Sensor numbers within this ** number range, except for the specific Sensors identified in the ** specification. For example, currently, three aggregate Sensors are named in ** this range. Other Sensors exposed by the HPI Implementation (e.g., a ** temperature Sensor) must be assigned a number outside of this range. **/ #define SAHPI_STANDARD_SENSOR_MIN (SaHpiSensorNumT)0x00000100 #define SAHPI_STANDARD_SENSOR_MAX (SaHpiSensorNumT)0x000001FF #define SAHPI_SENSOR_TYPE_SAFHPI_GROUP 0x10000 /* Type of Sensor ** Future versions of this specification may add new Sensor types as required. ** Legacy HPI Users should consider these new types "valid but unknown". */ typedef enum { SAHPI_TEMPERATURE = 0x01, SAHPI_VOLTAGE, SAHPI_CURRENT, SAHPI_FAN, SAHPI_PHYSICAL_SECURITY, SAHPI_PLATFORM_VIOLATION, SAHPI_PROCESSOR, SAHPI_POWER_SUPPLY, SAHPI_POWER_UNIT, SAHPI_COOLING_DEVICE, SAHPI_OTHER_UNITS_BASED_SENSOR, SAHPI_MEMORY, SAHPI_DRIVE_SLOT, SAHPI_POST_MEMORY_RESIZE, SAHPI_SYSTEM_FW_PROGRESS, SAHPI_EVENT_LOGGING_DISABLED, SAHPI_RESERVED1, SAHPI_SYSTEM_EVENT, SAHPI_CRITICAL_INTERRUPT, SAHPI_BUTTON, SAHPI_MODULE_BOARD, SAHPI_MICROCONTROLLER_COPROCESSOR, SAHPI_ADDIN_CARD, SAHPI_CHASSIS, SAHPI_CHIP_SET, SAHPI_OTHER_FRU, SAHPI_CABLE_INTERCONNECT, SAHPI_TERMINATOR, SAHPI_SYSTEM_BOOT_INITIATED, SAHPI_BOOT_ERROR, SAHPI_OS_BOOT, SAHPI_OS_CRITICAL_STOP, SAHPI_SLOT_CONNECTOR, SAHPI_SYSTEM_ACPI_POWER_STATE, SAHPI_RESERVED2, SAHPI_PLATFORM_ALERT, SAHPI_ENTITY_PRESENCE, SAHPI_MONITOR_ASIC_IC, SAHPI_LAN, SAHPI_MANAGEMENT_SUBSYSTEM_HEALTH, SAHPI_BATTERY, SAHPI_SESSION_AUDIT, SAHPI_VERSION_CHANGE, SAHPI_OPERATIONAL = 0xA0, SAHPI_OEM_SENSOR=0xC0, SAHPI_COMM_CHANNEL_LINK_STATE = SAHPI_SENSOR_TYPE_SAFHPI_GROUP + 0x1, SAHPI_MANAGEMENT_BUS_STATE, SAHPI_SENSOR_TYPE_MAX_VALID = SAHPI_MANAGEMENT_BUS_STATE } SaHpiSensorTypeT; /* ** Sensor Reading Type ** ** These definitions list the available data types that can be ** used for Sensor readings. ** */ #define SAHPI_SENSOR_BUFFER_LENGTH 32 typedef enum { SAHPI_SENSOR_READING_TYPE_INT64, SAHPI_SENSOR_READING_TYPE_UINT64, SAHPI_SENSOR_READING_TYPE_FLOAT64, SAHPI_SENSOR_READING_TYPE_BUFFER, /* 32 byte array. The format of the buffer is implementation- specific. Sensors that use this reading type may not have thresholds that are settable or readable. */ SAHPI_SENSOR_READING_TYPE_MAX_VALID = SAHPI_SENSOR_READING_TYPE_BUFFER } SaHpiSensorReadingTypeT; typedef union { SaHpiInt64T SensorInt64; SaHpiUint64T SensorUint64; SaHpiFloat64T SensorFloat64; SaHpiUint8T SensorBuffer[SAHPI_SENSOR_BUFFER_LENGTH]; } SaHpiSensorReadingUnionT; /* ** Sensor Reading ** ** The Sensor reading data structure is returned from a call to get ** Sensor reading. The structure is also used when setting and getting Sensor ** threshold values and reporting Sensor ranges. ** ** IsSupported is set to True if a Sensor reading/threshold value is available. ** Otherwise, if no reading or threshold is supported, this flag is set to ** False. ** */ typedef struct { SaHpiBoolT IsSupported; SaHpiSensorReadingTypeT Type; SaHpiSensorReadingUnionT Value; } SaHpiSensorReadingT; /* Sensor Event Mask Actions - used with saHpiSensorEventMasksSet() */ typedef enum { SAHPI_SENS_ADD_EVENTS_TO_MASKS, SAHPI_SENS_REMOVE_EVENTS_FROM_MASKS, SAHPI_SENS_EVENT_MASK_ACTION_MAX_VALID = SAHPI_SENS_REMOVE_EVENTS_FROM_MASKS } SaHpiSensorEventMaskActionT; /* Value to use for AssertEvents or DeassertEvents parameter in saHpiSensorEventMasksSet() to set or clear all supported event states for a Sensor in the mask */ #define SAHPI_ALL_EVENT_STATES (SaHpiEventStateT)0xFFFF /* ** Threshold Values ** This structure encompasses all of the thresholds that can be set. ** These are set and read with the same units as Sensors report in ** saHpiSensorReadingGet(). When hysteresis is not constant over the ** range of Sensor values, it is calculated at the nominal Sensor reading, ** as given in the Range field of the Sensor RDR. ** ** Thresholds are required to be set in-order (such that the setting for ** UpCritical is greater than or equal to the setting for UpMajor, etc.). ** ** A high-going threshold asserts an event state when the reading is ** greater-than or equal-to the threshold value. And a low-going threshold ** asserts an event state when the reading is less-than or equal-to the ** threshold value. ** ** The PosThdHysteresis and NegThdHysteresis factor into when the deassertion ** events occur. A high-going threshold must have the reading drop to a ** value that is less than PosThdHysteresis below the threshold value in ** order for the deassertion event to occur. A low-going threshold must have ** the reading rise to a value that is greater than NegThdHysteresis above the ** threshold to become deasserted. ** ** Note that a zero hysteresis value still leads to a difference between where ** the deassertion events occur. An event cannot be in the asserted and ** deasserted states simultaneously. Thus, for zero hysteresis a high-going ** threshold event becomes asserted when the reading is greater-than or ** equal-to the threshold, and becomes deasserted when the reading goes ** less-than the threshold. A low-going threshold event becomes asserted when ** the reading goes less-than or equal-to the threshold, and becomes deasserted ** when the reading goes greater-than the threshold.*/ typedef struct { SaHpiSensorReadingT LowCritical; /* Lower Critical Threshold */ SaHpiSensorReadingT LowMajor; /* Lower Major Threshold */ SaHpiSensorReadingT LowMinor; /* Lower Minor Threshold */ SaHpiSensorReadingT UpCritical; /* Upper critical Threshold */ SaHpiSensorReadingT UpMajor; /* Upper major Threshold */ SaHpiSensorReadingT UpMinor; /* Upper minor Threshold */ SaHpiSensorReadingT PosThdHysteresis; /* Positive Threshold Hysteresis */ SaHpiSensorReadingT NegThdHysteresis; /* Negative Threshold Hysteresis */ } SaHpiSensorThresholdsT; /******************************************************************************* ******************************************************************************** ********** ********** ********** Sensor Resource Data Records ********** ********** ********** ******************************************************************************** *******************************************************************************/ /* ** Sensor Range ** Sensor range values can include minimum, maximum, normal minimum, normal ** maximum, and nominal values. ** ** Sensor thresholds cannot be set outside of the range defined by SAHPI_SRF_MIN ** through SAHPI_SRF_MAX, if these limits are present (as indicated by the ** SaHpiSensorRangeFlagsT). If the MIN limit is not present, no lower bound ** is enforced on Sensor thresholds. If the MAX limit is not present, no ** upper bound is enforced on Sensor thresholds. */ typedef SaHpiUint8T SaHpiSensorRangeFlagsT; #define SAHPI_SRF_MIN (SaHpiSensorRangeFlagsT)0x10 #define SAHPI_SRF_MAX (SaHpiSensorRangeFlagsT)0x08 #define SAHPI_SRF_NORMAL_MIN (SaHpiSensorRangeFlagsT)0x04 #define SAHPI_SRF_NORMAL_MAX (SaHpiSensorRangeFlagsT)0x02 #define SAHPI_SRF_NOMINAL (SaHpiSensorRangeFlagsT)0x01 typedef struct { SaHpiSensorRangeFlagsT Flags; SaHpiSensorReadingT Max; SaHpiSensorReadingT Min; SaHpiSensorReadingT Nominal; SaHpiSensorReadingT NormalMax; SaHpiSensorReadingT NormalMin; } SaHpiSensorRangeT; /* ** Sensor Units ** This is a list of all the Sensor units supported by HPI. ** Future versions of this specification may add new Sensor units as required. ** Legacy HPI Users should consider these new units "valid but unknown". */ typedef enum { SAHPI_SU_UNSPECIFIED = 0, SAHPI_SU_DEGREES_C, SAHPI_SU_DEGREES_F, SAHPI_SU_DEGREES_K, SAHPI_SU_VOLTS, SAHPI_SU_AMPS, SAHPI_SU_WATTS, SAHPI_SU_JOULES, SAHPI_SU_COULOMBS, SAHPI_SU_VA, SAHPI_SU_NITS, SAHPI_SU_LUMEN, SAHPI_SU_LUX, SAHPI_SU_CANDELA, SAHPI_SU_KPA, SAHPI_SU_PSI, SAHPI_SU_NEWTON, SAHPI_SU_CFM, SAHPI_SU_RPM, SAHPI_SU_HZ, SAHPI_SU_MICROSECOND, SAHPI_SU_MILLISECOND, SAHPI_SU_SECOND, SAHPI_SU_MINUTE, SAHPI_SU_HOUR, SAHPI_SU_DAY, SAHPI_SU_WEEK, SAHPI_SU_MIL, SAHPI_SU_INCHES, SAHPI_SU_FEET, SAHPI_SU_CU_IN, SAHPI_SU_CU_FEET, SAHPI_SU_MM, SAHPI_SU_CM, SAHPI_SU_M, SAHPI_SU_CU_CM, SAHPI_SU_CU_M, SAHPI_SU_LITERS, SAHPI_SU_FLUID_OUNCE, SAHPI_SU_RADIANS, SAHPI_SU_STERADIANS, SAHPI_SU_REVOLUTIONS, SAHPI_SU_CYCLES, SAHPI_SU_GRAVITIES, SAHPI_SU_OUNCE, SAHPI_SU_POUND, SAHPI_SU_FT_LB, SAHPI_SU_OZ_IN, SAHPI_SU_GAUSS, SAHPI_SU_GILBERTS, SAHPI_SU_HENRY, SAHPI_SU_MILLIHENRY, SAHPI_SU_FARAD, SAHPI_SU_MICROFARAD, SAHPI_SU_OHMS, SAHPI_SU_SIEMENS, SAHPI_SU_MOLE, SAHPI_SU_BECQUEREL, SAHPI_SU_PPM, SAHPI_SU_RESERVED, SAHPI_SU_DECIBELS, SAHPI_SU_DBA, SAHPI_SU_DBC, SAHPI_SU_GRAY, SAHPI_SU_SIEVERT, SAHPI_SU_COLOR_TEMP_DEG_K, SAHPI_SU_BIT, SAHPI_SU_KILOBIT, SAHPI_SU_MEGABIT, SAHPI_SU_GIGABIT, SAHPI_SU_BYTE, SAHPI_SU_KILOBYTE, SAHPI_SU_MEGABYTE, SAHPI_SU_GIGABYTE, SAHPI_SU_WORD, SAHPI_SU_DWORD, SAHPI_SU_QWORD, SAHPI_SU_LINE, SAHPI_SU_HIT, SAHPI_SU_MISS, SAHPI_SU_RETRY, SAHPI_SU_RESET, SAHPI_SU_OVERRUN, SAHPI_SU_UNDERRUN, SAHPI_SU_COLLISION, SAHPI_SU_PACKETS, SAHPI_SU_MESSAGES, SAHPI_SU_CHARACTERS, SAHPI_SU_ERRORS, SAHPI_SU_CORRECTABLE_ERRORS, SAHPI_SU_UNCORRECTABLE_ERRORS, SAHPI_SU_MAX_VALID = SAHPI_SU_UNCORRECTABLE_ERRORS } SaHpiSensorUnitsT; /* ** Modifier Unit Use ** This type defines how the modifier unit is used. For example: base unit == ** meter, modifier unit == seconds, and modifier unit use == ** SAHPI_SMUU_BASIC_OVER_MODIFIER. The resulting unit would be meters per ** second. */ typedef enum { SAHPI_SMUU_NONE = 0, SAHPI_SMUU_BASIC_OVER_MODIFIER, /* Basic Unit / Modifier Unit */ SAHPI_SMUU_BASIC_TIMES_MODIFIER, /* Basic Unit * Modifier Unit */ SAHPI_SMUU_MAX_VALID = SAHPI_SMUU_BASIC_TIMES_MODIFIER } SaHpiSensorModUnitUseT; /* ** Data Format ** When IsSupported is False, the Sensor does not support data readings ** (it only supports event states). A False setting for this flag ** indicates that the rest of the structure is not meaningful. ** ** This structure encapsulates all of the various types that make up the ** definition of Sensor data. For reading type of ** SAHPI_SENSOR_READING_TYPE_BUFFER, the rest of the structure ** (beyond ReadingType) is not meaningful. ** ** The Accuracy Factor is expressed as a floating point percentage ** (e.g. 0.05 = 5%) and represents statistically how close the measured ** reading is to the actual value. It is an interpreted value that ** figures in all Sensor accuracies, resolutions, and tolerances. */ typedef struct { SaHpiBoolT IsSupported; /* Indicates if Sensor data readings are supported.*/ SaHpiSensorReadingTypeT ReadingType; /* Type of value for Sensor reading. */ SaHpiSensorUnitsT BaseUnits; /* Base units (meters, etc.) */ SaHpiSensorUnitsT ModifierUnits; /* Modifier unit (second, etc.)*/ SaHpiSensorModUnitUseT ModifierUse; /* Modifier use(m/sec, etc.) */ SaHpiBoolT Percentage; /* Is value a percentage */ SaHpiSensorRangeT Range; /* Valid range of Sensor */ SaHpiFloat64T AccuracyFactor; /* Accuracy */ } SaHpiSensorDataFormatT; /* ** Threshold Support ** ** These types define what threshold values are readable and writable. ** Thresholds are read/written in the same ReadingType as is used for Sensor ** readings. */ typedef SaHpiUint8T SaHpiSensorThdMaskT; #define SAHPI_STM_LOW_MINOR (SaHpiSensorThdMaskT)0x01 #define SAHPI_STM_LOW_MAJOR (SaHpiSensorThdMaskT)0x02 #define SAHPI_STM_LOW_CRIT (SaHpiSensorThdMaskT)0x04 #define SAHPI_STM_UP_MINOR (SaHpiSensorThdMaskT)0x08 #define SAHPI_STM_UP_MAJOR (SaHpiSensorThdMaskT)0x10 #define SAHPI_STM_UP_CRIT (SaHpiSensorThdMaskT)0x20 #define SAHPI_STM_UP_HYSTERESIS (SaHpiSensorThdMaskT)0x40 #define SAHPI_STM_LOW_HYSTERESIS (SaHpiSensorThdMaskT)0x80 typedef struct { SaHpiBoolT IsAccessible; /* True if the Sensor supports readable or writable thresholds. If False, rest of structure is not meaningful. Sensors that have the IsAccessible flag set to True must also support the threshold event category. A Sensor of reading type SAHPI_ SENSOR_READING_TYPE_BUFFER cannot have accessible thresholds.*/ SaHpiSensorThdMaskT ReadThold; /* Readable thresholds */ SaHpiSensorThdMaskT WriteThold; /* Writable thresholds */ SaHpiBoolT Nonlinear; /* If this flag is set to True, hysteresis values are calculated at the nominal Sensor value. */ } SaHpiSensorThdDefnT; /* ** Event Control ** ** This type defines how Sensor event messages can be controlled (can be turned ** off and on for each type of event, etc.). */ typedef enum { SAHPI_SEC_PER_EVENT = 0, /* Event message control per event, or by entire Sensor; Sensor event enable status can be changed, and assert/deassert masks can be changed */ SAHPI_SEC_READ_ONLY_MASKS, /* Control for entire Sensor only; Sensor event enable status can be changed, but assert/deassert masks cannot be changed */ SAHPI_SEC_READ_ONLY, /* Event control not supported; Sensor event enable status cannot be changed and assert/deassert masks cannot be changed */ SAHPI_SEC_MAX_VALID = SAHPI_SEC_READ_ONLY } SaHpiSensorEventCtrlT; /* ** Record ** ** This is the Sensor resource data record which describes all of the static ** data associated with a Sensor. */ typedef struct { SaHpiSensorNumT Num; /* Sensor Number/Index */ SaHpiSensorTypeT Type; /* General Sensor Type */ SaHpiEventCategoryT Category; /* Event category */ SaHpiBoolT EnableCtrl; /* True if HPI User can enable or disable Sensor via saHpiSensorEnableSet() */ SaHpiSensorEventCtrlT EventCtrl; /* How events can be controlled */ SaHpiEventStateT Events; /* Bit mask of event states supported */ SaHpiSensorDataFormatT DataFormat; /* Format of the data */ SaHpiSensorThdDefnT ThresholdDefn; /* Threshold Definition */ SaHpiUint32T Oem; /* Reserved for OEM use */ } SaHpiSensorRecT; /******************************************************************************* ******************************************************************************** ********** ********** ********** Aggregate Status ********** ********** ********** ******************************************************************************** *******************************************************************************/ /* These are the default Sensor numbers for aggregate status. */ #define SAHPI_DEFAGSENS_OPER (SaHpiSensorNumT)0x00000100 #define SAHPI_DEFAGSENS_PWR (SaHpiSensorNumT)0x00000101 #define SAHPI_DEFAGSENS_TEMP (SaHpiSensorNumT)0x00000102 /* The following specifies the named range for aggregate status. */ #define SAHPI_DEFAGSENS_MIN (SaHpiSensorNumT)0x00000100 #define SAHPI_DEFAGSENS_MAX (SaHpiSensorNumT)0x0000010F /******************************************************************************* ******************************************************************************** ********** ********** ********** Controls ********** ********** ********** ******************************************************************************** *******************************************************************************/ /* Control Number */ typedef SaHpiInstrumentIdT SaHpiCtrlNumT; /* ** Type of Control ** ** This enumerated type defines the different types of generic Controls. ** Future versions of this specification may add new Control types to this ** enumerated type. Legacy HPI Users should consider these new Control types ** "valid but unknown" and should not attempt to interpret the resource data ** records or Control states of such Controls. */ typedef enum { SAHPI_CTRL_TYPE_DIGITAL = 0x00, SAHPI_CTRL_TYPE_DISCRETE, SAHPI_CTRL_TYPE_ANALOG, SAHPI_CTRL_TYPE_STREAM, SAHPI_CTRL_TYPE_TEXT, SAHPI_CTRL_TYPE_OEM = 0xC0, SAHPI_CTRL_TYPE_MAX_VALID = SAHPI_CTRL_TYPE_OEM } SaHpiCtrlTypeT; /* ** Control State Type Definitions */ /* ** Digital Control State Definition ** ** Defines the types of digital Control states. ** Any of the four states may be set using saHpiControlSet(). ** Only ON or OFF are appropriate returns from saHpiControlGet(). ** (PULSE_ON and PULSE_OFF are transitory and end in OFF and ON states, ** respectively.) ** OFF - the Control is off ** ON - the Control is on ** PULSE_OFF - the Control is briefly turned off, and then turned back on ** PULSE_ON - the Control is briefly turned on, and then turned back off ** */ typedef enum { SAHPI_CTRL_STATE_OFF = 0, SAHPI_CTRL_STATE_ON, SAHPI_CTRL_STATE_PULSE_OFF, SAHPI_CTRL_STATE_PULSE_ON, SAHPI_CTRL_STATE_MAX_VALID = SAHPI_CTRL_STATE_PULSE_ON } SaHpiCtrlStateDigitalT; /* ** Discrete Control State Definition */ typedef SaHpiUint32T SaHpiCtrlStateDiscreteT; /* ** Analog Control State Definition */ typedef SaHpiInt32T SaHpiCtrlStateAnalogT; /* ** Stream Control State Definition */ #define SAHPI_CTRL_MAX_STREAM_LENGTH 4 typedef struct { SaHpiBoolT Repeat; /* Repeat flag */ SaHpiUint32T StreamLength; /* Length of the data, in bytes, stored in the stream. */ SaHpiUint8T Stream[SAHPI_CTRL_MAX_STREAM_LENGTH]; } SaHpiCtrlStateStreamT; /* ** Text Control State Definition */ typedef SaHpiUint8T SaHpiTxtLineNumT; /* Reserved number for sending output to all lines */ #define SAHPI_TLN_ALL_LINES (SaHpiTxtLineNumT)0x00 typedef struct { SaHpiTxtLineNumT Line; /* Operate on line # */ SaHpiTextBufferT Text; /* Text to display */ } SaHpiCtrlStateTextT; /* ** OEM Control State Definition */ #define SAHPI_CTRL_MAX_OEM_BODY_LENGTH 255 typedef struct { SaHpiManufacturerIdT MId; SaHpiUint8T BodyLength; SaHpiUint8T Body[SAHPI_CTRL_MAX_OEM_BODY_LENGTH]; /* OEM Specific */ } SaHpiCtrlStateOemT; typedef union { SaHpiCtrlStateDigitalT Digital; SaHpiCtrlStateDiscreteT Discrete; SaHpiCtrlStateAnalogT Analog; SaHpiCtrlStateStreamT Stream; SaHpiCtrlStateTextT Text; SaHpiCtrlStateOemT Oem; } SaHpiCtrlStateUnionT; typedef struct { SaHpiCtrlTypeT Type; /* Type of Control */ SaHpiCtrlStateUnionT StateUnion; /* Data for Control type */ } SaHpiCtrlStateT; /* ** Control Mode Type Definition ** ** Controls may be in either AUTO mode or MANUAL mode. ** */ typedef enum { SAHPI_CTRL_MODE_AUTO, SAHPI_CTRL_MODE_MANUAL, SAHPI_CTRL_MODE_MAX_VALID = SAHPI_CTRL_MODE_MANUAL } SaHpiCtrlModeT; /******************************************************************************* ******************************************************************************** ********** ********** ********** Control Resource Data Records ********** ********** ********** ******************************************************************************** *******************************************************************************/ /* ** Output Type ** ** This enumeration defines the Control's output. ** Future versions of this specification may add new Control output types to ** this enumerated type. Legacy HPI Users should consider these new types ** "valid but unknown". */ typedef enum { SAHPI_CTRL_GENERIC = 0, SAHPI_CTRL_LED, SAHPI_CTRL_FAN_SPEED, SAHPI_CTRL_DRY_CONTACT_CLOSURE, SAHPI_CTRL_POWER_SUPPLY_INHIBIT, SAHPI_CTRL_AUDIBLE, SAHPI_CTRL_FRONT_PANEL_LOCKOUT, SAHPI_CTRL_POWER_INTERLOCK, SAHPI_CTRL_POWER_STATE, SAHPI_CTRL_LCD_DISPLAY, SAHPI_CTRL_OEM, SAHPI_CTRL_OUTPUT_TYPE_MAX_VALID = SAHPI_CTRL_OEM } SaHpiCtrlOutputTypeT; /* ** Specific Record Types ** These types represent the specific types of Control resource data records. */ typedef struct { SaHpiCtrlStateDigitalT Default; } SaHpiCtrlRecDigitalT; typedef struct { SaHpiCtrlStateDiscreteT Default; } SaHpiCtrlRecDiscreteT; typedef struct { SaHpiCtrlStateAnalogT Min; /* Minimum Value */ SaHpiCtrlStateAnalogT Max; /* Maximum Value */ SaHpiCtrlStateAnalogT Default; } SaHpiCtrlRecAnalogT; typedef struct { SaHpiCtrlStateStreamT Default; } SaHpiCtrlRecStreamT; typedef struct { SaHpiUint8T MaxChars; /* Maximum chars per line. If the Control DataType is SAHPI_TL_TYPE_UNICODE, there are two bytes required for each character. This field reports the number of characters per line- not the number of bytes. MaxChars must not be larger than the number of characters that can be placed in a single SaHpiTextBufferT structure. */ SaHpiUint8T MaxLines; /* Maximum # of lines */ SaHpiLanguageT Language; /* Language Code */ SaHpiTextTypeT DataType; /* Permitted Data */ SaHpiCtrlStateTextT Default; } SaHpiCtrlRecTextT; #define SAHPI_CTRL_OEM_CONFIG_LENGTH 10 typedef struct { SaHpiManufacturerIdT MId; SaHpiUint8T ConfigData[SAHPI_CTRL_OEM_CONFIG_LENGTH]; SaHpiCtrlStateOemT Default; } SaHpiCtrlRecOemT; typedef union { SaHpiCtrlRecDigitalT Digital; SaHpiCtrlRecDiscreteT Discrete; SaHpiCtrlRecAnalogT Analog; SaHpiCtrlRecStreamT Stream; SaHpiCtrlRecTextT Text; SaHpiCtrlRecOemT Oem; } SaHpiCtrlRecUnionT; /* ** Default Control Mode Structure ** This structure tells an HPI User if the Control comes up in Auto mode or ** in Manual mode, by default. It also indicates if the mode can be ** changed (using saHpiControlSet()). When ReadOnly is False, the mode ** can be changed from its default setting; otherwise attempting to ** change the mode results in an error. */ typedef struct { SaHpiCtrlModeT Mode; /* Auto or Manual */ SaHpiBoolT ReadOnly; /* Indicates if mode is read-only */ } SaHpiCtrlDefaultModeT; /* ** Record Definition ** Definition of the Control resource data record. */ typedef struct { SaHpiCtrlNumT Num; /* Control Number/Index */ SaHpiCtrlOutputTypeT OutputType; SaHpiCtrlTypeT Type; /* Type of Control */ SaHpiCtrlRecUnionT TypeUnion; /* Specific Control record */ SaHpiCtrlDefaultModeT DefaultMode; /*Indicates if the Control comes up in Auto or Manual mode. */ SaHpiBoolT WriteOnly; /* Indicates if the Control is write-only. */ SaHpiUint32T Oem; /* Reserved for OEM use */ } SaHpiCtrlRecT; /******************************************************************************* ******************************************************************************** ********** ********** ********** Inventory Data Repositories ********** ********** ********** ******************************************************************************** *******************************************************************************/ /* ** These structures are used to read and write inventory data to entity ** Inventory Data Repositories within a resource. */ /* ** Inventory Data Repository ID ** Identifier for an Inventory Data Repository. */ typedef SaHpiInstrumentIdT SaHpiIdrIdT; #define SAHPI_DEFAULT_INVENTORY_ID (SaHpiIdrIdT)0x00000000 /* Inventory Data Area type definitions ** Future versions of this specification may add new area types to ** this enumerated type. Legacy HPI Users should consider these new types ** "valid but unknown". */ typedef enum { SAHPI_IDR_AREATYPE_INTERNAL_USE = 0xB0, SAHPI_IDR_AREATYPE_CHASSIS_INFO, SAHPI_IDR_AREATYPE_BOARD_INFO, SAHPI_IDR_AREATYPE_PRODUCT_INFO, SAHPI_IDR_AREATYPE_OEM = 0xC0, SAHPI_IDR_AREATYPE_UNSPECIFIED = 0xFF, SAHPI_IDR_AREATYPE_MAX_VALID = SAHPI_IDR_AREATYPE_UNSPECIFIED } SaHpiIdrAreaTypeT; /* Inventory Data Field type definitions ** Future versions of this specification may add new field types to ** this enumerated type. Legacy HPI Users should consider these new types ** "valid but unknown". */ typedef enum { SAHPI_IDR_FIELDTYPE_CHASSIS_TYPE, SAHPI_IDR_FIELDTYPE_MFG_DATETIME, SAHPI_IDR_FIELDTYPE_MANUFACTURER, SAHPI_IDR_FIELDTYPE_PRODUCT_NAME, SAHPI_IDR_FIELDTYPE_PRODUCT_VERSION, SAHPI_IDR_FIELDTYPE_SERIAL_NUMBER, SAHPI_IDR_FIELDTYPE_PART_NUMBER, SAHPI_IDR_FIELDTYPE_FILE_ID, SAHPI_IDR_FIELDTYPE_ASSET_TAG, SAHPI_IDR_FIELDTYPE_CUSTOM, SAHPI_IDR_FIELDTYPE_UNSPECIFIED = 0xFF, SAHPI_IDR_FIELDTYPE_MAX_VALID = SAHPI_IDR_FIELDTYPE_UNSPECIFIED } SaHpiIdrFieldTypeT; /* Inventory Data Field structure definition */ typedef struct { SaHpiEntryIdT AreaId; /* AreaId for the IDA to which */ /* the Field belongs */ SaHpiEntryIdT FieldId; /* Field Identifier */ SaHpiIdrFieldTypeT Type; /* Field Type */ SaHpiBoolT ReadOnly; /* Describes if a field is read-only. */ SaHpiTextBufferT Field; /* Field Data */ } SaHpiIdrFieldT; /* Inventory Data Area header structure definition */ typedef struct { SaHpiEntryIdT AreaId; /* Area Identifier */ SaHpiIdrAreaTypeT Type; /* Type of area */ SaHpiBoolT ReadOnly; /* Describes if an area is read-only. */ SaHpiUint32T NumFields; /* Number of Fields contained in Area */ } SaHpiIdrAreaHeaderT; /* Inventory Data Repository Information structure definition */ typedef struct { SaHpiIdrIdT IdrId; /* Repository Identifier */ SaHpiUint32T UpdateCount; /* The count is incremented any time the */ /* IDR is changed. It rolls over to zero */ /* when the maximum value is reached */ SaHpiBoolT ReadOnly; /* Describes if the IDR is read-only. */ SaHpiUint32T NumAreas; /* Number of Areas contained in IDR */ } SaHpiIdrInfoT; /******************************************************************************* ******************************************************************************** ********** ********** ********** Inventory Data Repository Resource Data Records ********** ********** ********** ******************************************************************************** *******************************************************************************/ /* ** All inventory data contained in an Inventory Data Repository ** must be represented in the RDR repository ** with an SaHpiInventoryRecT. */ typedef struct { SaHpiIdrIdT IdrId; SaHpiBoolT Persistent; /* True indicates that updates to IDR are automatically and immediately persisted. False indicates that updates are not immediately persisted; but optionally may be persisted via saHpiParmControl() function, as defined in implementation documentation.*/ SaHpiUint32T Oem; } SaHpiInventoryRecT; /******************************************************************************* ******************************************************************************** ********** ********** ********** Watchdogs ********** ********** ********** ******************************************************************************** *******************************************************************************/ /* ** This section defines all of the data types associated with Watchdog Timers. */ /* Watchdog Number - Identifier for a Watchdog Timer. */ typedef SaHpiInstrumentIdT SaHpiWatchdogNumT; #define SAHPI_DEFAULT_WATCHDOG_NUM (SaHpiWatchdogNumT)0x00000000 /* ** Watchdog Timer Action ** ** These enumerations represent the possible actions to be taken upon Watchdog ** Timer timeout and the events that are generated for Watchdog actions. */ typedef enum { SAHPI_WA_NO_ACTION = 0, SAHPI_WA_RESET, SAHPI_WA_POWER_DOWN, SAHPI_WA_POWER_CYCLE, SAHPI_WA_MAX_VALID = SAHPI_WA_POWER_CYCLE } SaHpiWatchdogActionT; typedef enum { SAHPI_WAE_NO_ACTION = 0, SAHPI_WAE_RESET, SAHPI_WAE_POWER_DOWN, SAHPI_WAE_POWER_CYCLE, SAHPI_WAE_TIMER_INT=0x08, /* Used if Timer Preinterrupt only */ SAHPI_WAE_MAX_VALID = SAHPI_WAE_TIMER_INT } SaHpiWatchdogActionEventT; /* ** Watchdog Pre-timer Interrupt ** ** These enumerations represent the possible types of interrupts that may be ** triggered by a Watchdog pre-timer event. The actual meaning of these ** operations may differ depending on the hardware architecture. */ typedef enum { SAHPI_WPI_NONE = 0, SAHPI_WPI_SMI, SAHPI_WPI_NMI, SAHPI_WPI_MESSAGE_INTERRUPT, SAHPI_WPI_OEM = 0x0F, SAHPI_WPI_MAX_VALID = SAHPI_WPI_OEM } SaHpiWatchdogPretimerInterruptT; /* ** Watchdog Timer Use ** ** These enumerations represent the possible Watchdog users that may have caused ** the Watchdog to expire. For instance, if a Watchdog is used during power ** on self test (POST), and it expires, the SAHPI_WTU_BIOS_POST expiration type ** is set. Most specific uses for Watchdog timer by users of HPI should ** indicate SAHPI_WTU_SMS_OS if the use is to provide an OS-healthy heartbeat, ** or SAHPI_WTU_OEM if it is used for some other purpose. */ typedef enum { SAHPI_WTU_NONE = 0, SAHPI_WTU_BIOS_FRB2, SAHPI_WTU_BIOS_POST, SAHPI_WTU_OS_LOAD, SAHPI_WTU_SMS_OS, /* System Management System providing heartbeat for OS */ SAHPI_WTU_OEM, SAHPI_WTU_UNSPECIFIED = 0x0F, SAHPI_WTU_MAX_VALID = SAHPI_WTU_UNSPECIFIED } SaHpiWatchdogTimerUseT; /* ** Timer Use Expiration Flags ** These values are used for the Watchdog Timer Use Expiration flags in the ** SaHpiWatchdogT structure. */ typedef SaHpiUint8T SaHpiWatchdogExpFlagsT; #define SAHPI_WATCHDOG_EXP_BIOS_FRB2 (SaHpiWatchdogExpFlagsT)0x02 #define SAHPI_WATCHDOG_EXP_BIOS_POST (SaHpiWatchdogExpFlagsT)0x04 #define SAHPI_WATCHDOG_EXP_OS_LOAD (SaHpiWatchdogExpFlagsT)0x08 #define SAHPI_WATCHDOG_EXP_SMS_OS (SaHpiWatchdogExpFlagsT)0x10 #define SAHPI_WATCHDOG_EXP_OEM (SaHpiWatchdogExpFlagsT)0x20 /* ** Watchdog Structure ** ** This structure is used by the saHpiWatchdogTimerGet() and ** saHpiWatchdogTimerSet() functions. The use of the structure varies slightly ** by each function. ** ** For saHpiWatchdogTimerGet() : ** ** Log - indicates whether the Watchdog is configured to ** issue events. True=events are generated. ** Running - indicates whether the Watchdog is currently ** running or stopped. True=Watchdog is running. ** TimerUse - indicates the current use of the timer; one of the ** enumerated preset uses which was included on the last ** saHpiWatchdogTimerSet() function call, or through some ** other implementation-dependent means to start the ** Watchdog timer. ** TimerAction - indicates what action will be taken when the Watchdog ** times out. ** PretimerInterrupt - indicates which action will be taken ** "PreTimeoutInterval" milliseconds prior to Watchdog ** timer expiration. ** PreTimeoutInterval - indicates how many milliseconds prior to timer time ** out the PretimerInterrupt action will be taken. If ** "PreTimeoutInterval" = 0, the PretimerInterrupt action ** occurs concurrently with "TimerAction". HPI ** implementations may not be able to support millisecond ** resolution, and because of this may have rounded the ** set value to whatever resolution could be supported. ** The HPI implementation returns this rounded value. ** TimerUseExpFlags - set of five bit flags which indicate that a Watchdog ** timer timeout has occurred while the corresponding ** TimerUse value was set. Once set, these flags stay ** set until specifically cleared with a ** saHpiWatchdogTimerSet() call, or by some other ** implementation-dependent means. ** InitialCount - The time, in milliseconds, before the timer will time ** out after the Watchdog is started/restarted, or some ** other implementation-dependent strobe is ** sent to the Watchdog. HPI implementations may not be ** able to support millisecond resolution, and because ** of this may have rounded the set value to whatever ** resolution could be supported. The HPI implementation ** returns this rounded value. ** PresentCount - The remaining time in milliseconds before the timer ** times out unless an saHpiWatchdogTimerReset() ** function call is made, or some other implementation- ** dependent strobe is sent to the Watchdog. ** HPI implementations may not be able to support ** millisecond resolution on Watchdog Timers, but ** returns the number of clock ticks remaining times the ** number of milliseconds between each tick. ** ** For saHpiWatchdogTimerSet(): ** ** Log - indicates whether the Watchdog should issue ** events. True=events are generated. ** Running - indicates whether the Watchdog should be ** stopped before updating. ** True = Watchdog is not stopped. If it is ** already stopped, it remains stopped, ** but if it is running, it continues ** to run, with the countown timer reset ** to the new InitialCount. Note that ** there is a race condition possible ** with this setting, so it should be used ** with care. ** False = Watchdog is stopped. After ** saHpiWatchdogTimerSet() is called, a ** subsequent call to ** saHpiWatchdogTimerReset() is required ** to start the timer. ** TimerUse - indicates the current use of the timer. Controls ** which TimerUseExpFlag will be set if the timer ** expires. ** TimerAction - indicates what action will be taken when the Watchdog ** times out. ** PretimerInterrupt - indicates which action will be taken ** "PreTimeoutInterval" milliseconds prior to Watchdog ** timer expiration. ** PreTimeoutInterval - indicates how many milliseconds prior to timer time ** out the PretimerInterrupt action will be taken. If ** "PreTimeoutInterval" = 0, the PretimerInterrupt action ** occurs concurrently with "TimerAction". HPI ** implementations may not be able to support millisecond ** resolution and may have a maximum value restriction. ** These restrictions should be documented by the ** provider of the HPI interface. ** TimerUseExpFlags - Set of five bit flags corresponding to the five ** TimerUse values. For each bit set to "1", the ** corresponding Timer Use Expiration Flag is cleared, ** that is, set to "0". Generally, a program should only ** clear the Timer Use Expiration Flag corresponding to ** its own TimerUse, so that other software, which may ** have used the timer for another purpose in the past ** can still read its TimerUseExpFlag to determine ** whether the timer expired during that use. ** InitialCount - The time, in milliseconds, before the timer will time ** out after an saHpiWatchdogTimerReset() function call is ** made, or some other implementation-dependent strobe is ** sent to the Watchdog. HPI implementations may not be ** able to support millisecond resolution and may have a ** maximum value restriction. These restrictions should ** be documented by the provider of the HPI interface. ** PresentCount - Not used on saHpiWatchdogTimerSet() function. Ignored. ** */ typedef struct { SaHpiBoolT Log; SaHpiBoolT Running; SaHpiWatchdogTimerUseT TimerUse; SaHpiWatchdogActionT TimerAction; SaHpiWatchdogPretimerInterruptT PretimerInterrupt; SaHpiUint32T PreTimeoutInterval; SaHpiWatchdogExpFlagsT TimerUseExpFlags; SaHpiUint32T InitialCount; SaHpiUint32T PresentCount; } SaHpiWatchdogT; /******************************************************************************* ******************************************************************************** ********** ********** ********** Watchdog Resource Data Records ********** ********** ********** ******************************************************************************** *******************************************************************************/ /* ** When the "Watchdog" capability is set in a resource, a Watchdog with an ** identifier of SAHPI_DEFAULT_WATCHDOG_NUM is required. All Watchdogs must be ** represented in the RDR repository with an SaHpiWatchdogRecT, including the ** Watchdog with an identifier of SAHPI_DEFAULT_WATCHDOG_NUM. */ typedef struct { SaHpiWatchdogNumT WatchdogNum; SaHpiUint32T Oem; } SaHpiWatchdogRecT; /******************************************************************************* ******************************************************************************** ********** ********** ********** DIMI ********** ********** ********** ******************************************************************************** *******************************************************************************/ /* ** This section defines all of the data types associated with a DIMI */ /* DIMI Number - numeric identifier for a DIMI */ typedef SaHpiInstrumentIdT SaHpiDimiNumT; /* ** Test Service Impact Levels */ typedef enum { SAHPI_DIMITEST_NONDEGRADING, SAHPI_DIMITEST_DEGRADING, SAHPI_DIMITEST_VENDOR_DEFINED_LEVEL, /* VENDOR_DEFINED_LEVEL can be used to indicate severity of degrading test */ SAHPI_DIMITEST_SERVICE_IMPACT_MAX_VALID = SAHPI_DIMITEST_VENDOR_DEFINED_LEVEL } SaHpiDimiTestServiceImpactT; /* A test may affect the entity corresponding to DIMI it runs on. The same test ** may also affect other entities as well. This stuct defines the entity path & ** the service impact (as defined by SaHpiDimiTestServiceImpactT) on that ** affected entity. */ typedef struct { SaHpiEntityPathT EntityImpacted; /* Entity path of impacted entity */ SaHpiDimiTestServiceImpactT ServiceImpact; /* Service Impact on affected entity */ } SaHpiDimiTestAffectedEntityT; typedef enum { SAHPI_DIMITEST_STATUS_NOT_RUN, /* Only returned if test has never been executed on the DIMI */ SAHPI_DIMITEST_STATUS_FINISHED_NO_ERRORS, /* Test is not running. Last run finished without any errors */ SAHPI_DIMITEST_STATUS_FINISHED_ERRORS, /* Test is not running. But the last run finished with error */ SAHPI_DIMITEST_STATUS_CANCELED, /* This is returned when a test has canceled using the saHpiDimiTestCancel function */ SAHPI_DIMITEST_STATUS_RUNNING, /* This is returned when a test is in progress */ SAHPI_DIMITEST_STATUS_MAX_VALID = SAHPI_DIMITEST_STATUS_RUNNING } SaHpiDimiTestRunStatusT; /* Error codes that can be generated by a test ** Future versions of this specification may add new error codes to ** this enumerated type. Legacy HPI Users should consider these new values ** undefined errors. */ typedef enum { SAHPI_DIMITEST_STATUSERR_NOERR = 0, /* No Error was generated */ SAHPI_DIMITEST_STATUSERR_RUNERR, /* Run time error was generated */ SAHPI_DIMITEST_STATUSERR_UNDEF, /* Undefined Error*/ SAHPI_DIMITEST_STATUSERR_MAX_VALID = SAHPI_DIMITEST_STATUSERR_UNDEF } SaHpiDimiTestErrCodeT; /* Test results from last run of test */ typedef struct { SaHpiTimeT ResultTimeStamp; /* TimeStamp when the results are generated. When test ends, ResultTimeStamp captures the time test ended */ SaHpiTimeoutT RunDuration; /* Implementation provides the duration from the start of last run until the time results were generated */ SaHpiDimiTestRunStatusT LastRunStatus; SaHpiDimiTestErrCodeT TestErrorCode; SaHpiTextBufferT TestResultString; /* String contains either in line Test result or URI to the file name containing results from last run */ SaHpiBoolT TestResultStringIsURI; /* True = URI to file name, False = in-line test result, If True, the DataType of the TestResultString text buffer must be SAHPI_TL_TYPE_TEXT. */ } SaHpiDimiTestResultsT; /* SaHpiDimiTestParamsDefinitionT struct defines test parameters. The test ** parameter definition consists of Parameter Name, human readable text for ** parameters information, parameters type and value (min, max, default). ** HPI User can use APIs to obtain the parameters definition along with test ** information. Based on test parameters definition a proper parameter can ** be defined and passed together with the test invocation. */ /* Possible types of parameters for a test. */ typedef enum { SAHPI_DIMITEST_PARAM_TYPE_BOOLEAN, /* HPI type SaHpiBoolT */ SAHPI_DIMITEST_PARAM_TYPE_INT32, /* HPI type SaHpiUint32T */ SAHPI_DIMITEST_PARAM_TYPE_FLOAT64, /* HPI type SaHpiFloat64T */ SAHPI_DIMITEST_PARAM_TYPE_TEXT, /* HPI type SaHpiTextBufferT */ SAHPI_DIMITEST_PARAM_TYPE_MAX_VALID = SAHPI_DIMITEST_PARAM_TYPE_TEXT } SaHpiDimiTestParamTypeT; /* This union is defining the values for the test parameter*/ typedef union { SaHpiInt32T paramint; SaHpiBoolT parambool; SaHpiFloat64T paramfloat; SaHpiTextBufferT paramtext; /* Must be DataType = SAHPI_TL_TYPE_TEXT */ } SaHpiDimiTestParamValueT; /* maximum number of possible parameters for any DIMI test */ #define SAHPI_DIMITEST_MAX_PARAMETERS 10 /* Test parameter name length */ #define SAHPI_DIMITEST_PARAM_NAME_LEN 20 typedef union { SaHpiInt32T IntValue; SaHpiFloat64T FloatValue; } SaHpiDimiTestParameterValueUnionT; typedef struct { SaHpiUint8T ParamName[SAHPI_DIMITEST_PARAM_NAME_LEN]; /* Name of the parameter, case sensitive */ SaHpiTextBufferT ParamInfo; /* This is a human readable text */ SaHpiDimiTestParamTypeT ParamType; SaHpiDimiTestParameterValueUnionT MinValue; /* Only valid for integer and float parameters */ SaHpiDimiTestParameterValueUnionT MaxValue; /* Only valid for integer and float parameters */ SaHpiDimiTestParamValueT DefaultParam; /* Default value */ } SaHpiDimiTestParamsDefinitionT; /* The following defines the standard capabilities available for DIMI tests. ** Each test in a DIMI may support any number of capabilities using the bit ** mask. If a test supports one of these capabilities then the corresponding ** bit is set in the bit mask. ** There is a close relationship between capabilities and parameters of a ** test. A test may support some standard parameters if specific capability ** bits are set. Some capabilities might not have test parameters. ** ** Future versions of the HPI specification may define additional DIMI test ** capabilities and associate them with currently undefined bit positions in ** the SaHpiDimiTestCapabilitiesT bit mask. Implementations conforming to ** this version of the HPI specification should set all undefined bit values ** to zero in the TestCapabilities field of the SaHpiDimiTestT structure. ** However, HPI Users should not assume undefined bit values are zero, to ** remain compatible with HPI implementations that implement future versions ** of the specification. ** ** SAHPI_DIMITEST_CAPABILITY_NO_CAPABILITY ** Test does not support any of the standard capabilities ** ** SAHPI_DIMITEST_CAPABILITY_LOOPCOUNT ** Test supports looping for a specified count of times. When this capability ** is set for a test the standard parameter SAHPI_DIMITEST_LOOP_COUNT_PARAM ** is also supported by the test. Loop count parameter can be configured ** loop the test n number of times. Minimum and default is 1 time so that ** test is executed at least one time. ** ** SAHPI_DIMITEST_CAPABILITY_LOOPTIME ** Test supports looping for a specified amount of time (in seconds). When ** this capability is set for a test the standard parameter ** SAHPI_DIMITEST_LOOP_TIME_PARAM is also supported by the test. ** ** SAHPI_DIMITEST_CAPABILITY_SERVICEMODE ** Test supports a basic as well as extended mode. When this capability is ** set for a test the standard parameter SAHPI_DIMITEST_SERVICE_MODE_PARAM ** is also supported by the test. ** ** SAHPI_DIMITEST_CAPABILITY_LOGGING ** Test supports logging capability. When capability is set for a test the ** standard parameter SAHPI_DIMITEST_LOGGING_PARAM is also supported ** by the test. ** ** SAHPI_DIMITEST_CAPABILITY_RESULTSOUTPUT ** Test supports FINALONLY, ONDEMAND, ASYNC results output capablilities. ** When capability is set for a test the standard parameter ** SAHPI_DIMITEST_RESULTS_OUTPUT_PARAM is also supported by the test. ** ** SAHPI_DIMITEST_CAPABILITY_TESTCANCEL ** Test supports TESTCANCEL capability. This capability has no corresponding ** test parameter. */ typedef SaHpiUint32T SaHpiDimiTestCapabilityT; #define SAHPI_DIMITEST_CAPABILITY_NO_CAPABILITY \ (SaHpiDimiTestCapabilityT)0x00000000 #define SAHPI_DIMITEST_CAPABILITY_RESULTSOUTPUT \ (SaHpiDimiTestCapabilityT)0x00000001 #define SAHPI_DIMITEST_CAPABILITY_SERVICEMODE \ (SaHpiDimiTestCapabilityT)0x00000002 #define SAHPI_DIMITEST_CAPABILITY_LOOPCOUNT \ (SaHpiDimiTestCapabilityT)0x00000004 #define SAHPI_DIMITEST_CAPABILITY_LOOPTIME \ (SaHpiDimiTestCapabilityT)0x00000008 #define SAHPI_DIMITEST_CAPABILITY_LOGGING \ (SaHpiDimiTestCapabilityT)0x00000010 #define SAHPI_DIMITEST_CAPABILITY_TESTCANCEL \ (SaHpiDimiTestCapabilityT)0x00000020 /* The following are the standard test parameters available for use with DIMI ** tests. These parameters are applicable only if the corresponding test ** capability is supported by a DIMI test. HPI User can check the capabilities ** through the bit-stream defined through SaHpiDimiTestCapabilityT. If a test ** supports certain capability, corresponding test parameter is defined in ** standard format. The parameters are defined here as macros. For tests ** supporting these parameters they are returned as type ** SaHpiDimiTestParamsDefinitionT with the SaHpiDimiTestT structure. */ #ifndef SAHPI_DIMITEST_LOOP_COUNT_PARAM #define SAHPI_DIMITEST_LOOP_COUNT_PARAM_NAME "Loop Count" #define SAHPI_DIMITEST_LOOP_COUNT_PARAM \ { \ SAHPI_DIMITEST_LOOP_COUNT_PARAM_NAME, \ { \ SAHPI_TL_TYPE_TEXT, \ SAHPI_LANG_ENGLISH, \ 15, \ "Test Loop Count" \ }, \ SAHPI_DIMITEST_PARAM_TYPE_INT32, \ 1, \ 0xFFFFFFFF, \ { 1 } \ } #endif // SAHPI_DIMITEST_LOOP_COUNT_PARAM #ifndef SAHPI_DIMITEST_LOOP_TIME_PARAM #define SAHPI_DIMITEST_LOOP_TIME_PARAM_NAME "Loop Time" #define SAHPI_DIMITEST_LOOP_TIME_PARAM \ { \ SAHPI_DIMITEST_LOOP_TIME_PARAM_NAME, \ { \ SAHPI_TL_TYPE_TEXT, \ SAHPI_LANG_ENGLISH, \ 14, \ "Test Loop Time" \ }, \ SAHPI_DIMITEST_PARAM_TYPE_INT32, \ 0, \ 0xFFFFFFFF, \ { 1 } \ } #endif // SAHPI_DIMITEST_LOOP_TIME_PARAM #ifndef SAHPI_DIMITEST_SERVICE_MODE_PARAM #define SAHPI_DIMITEST_SERVICE_MODE_PARAM_NAME "Service Mode" #define SAHPI_DIMITEST_SERVICE_MODE_PARAM { \ { \ SAHPI_DIMITEST_SERVICE_MODE_PARAM_NAME, \ { \ SAHPI_TL_TYPE_TEXT, \ SAHPI_LANG_ENGLISH, \ 14, \ "Operating Mode" \ }, \ SAHPI_DIMITEST_PARAM_TYPE_INT32, \ 0, /* basic mode */ \ 1, /* extended mode */ \ { 0 } /* default is basic mode */ \ } #endif // SAHPI_DIMITEST_SERVICE_MODE_PARAM #ifndef SAHPI_DIMITEST_LOGGING_PARAM #define SAHPI_DIMITEST_LOGGING_PARAM_NAME "Logging" #define SAHPI_DIMITEST_LOGGING_PARAM \ { \ SAHPI_DIMITEST_LOGGING_PARAM_NAME, \ { \ SAHPI_TL_TYPE_TEXT, \ SAHPI_LANG_ENGLISH, \ 18, \ "Logging Capability" \ }, \ SAHPI_DIMITEST_PARAM_TYPE_INT32, \ 0, /* No Logging */ \ 5, /* Verbose Logging*/ \ { 0 } \ } #endif // SAHPI_DIMITEST_LOGGING_PARAM /* ResultsOutputParam: Standard parameter describing the capability of a ** DIMI to output the results. ** DIMI can generate results in FINALONLY, ONDEMAND and ASYNC enumerated ** types. */ #ifndef SAHPI_DIMITEST_RESULTS_OUTPUT_PARAM #define SAHPI_DIMITEST_CAPAB_RES_FINALONLY 0 #define SAHPI_DIMITEST_CAPAB_RES_ONDEMAND 1 #define SAHPI_DIMITEST_CAPAB_RES_ASYNC 2 #define SAHPI_DIMITEST_RESULTS_OUTPUT_PARAM_NAME "Results Output" #define SAHPI_DIMITEST_RESULTS_OUTPUT_PARAM { \ { \ SAHPI_DIMITEST_RESULTS_OUTPUT_PARAM_NAME,\ { \ SAHPI_TL_TYPE_TEXT, \ SAHPI_LANG_ENGLISH, \ 25, \ "Results Output Capability" \ }, \ SAHPI_DIMITEST_PARAM_TYPE_INT32, \ 0, \ 2, \ { 0 } \ } #endif // SAHPI_DIMITEST_RESULTS_OUTPUT_PARAM /* ** SaHpiDimiTestT */ /* DIMI test number */ typedef SaHpiUint32T SaHpiDimiTestNumT; /* Maximum number entities that can be affected by a test */ #define SAHPI_DIMITEST_MAX_ENTITIESIMPACTED 5 typedef struct { SaHpiTextBufferT TestName; SaHpiDimiTestServiceImpactT ServiceImpact; /* Service Impact on DIMI itself */ SaHpiDimiTestAffectedEntityT EntitiesImpacted[SAHPI_DIMITEST_MAX_ENTITIESIMPACTED]; /* Entities affected by the Test. If entity contains other entities then contained entities are considered affected as well. If Entities affected by Test are more than Max number, its recommended to associate test with higher level entity DIMI. */ SaHpiBoolT NeedServiceOS; /* True if a special Service OS is needed for this test */ SaHpiTextBufferT ServiceOS; /* If a special Service OS is needed to be run for the test, the HPI User is required to load the particular Service OS before running the tests, else DIMI returns an error code.*/ SaHpiTimeT ExpectedRunDuration; /* Expected run duration for a test with default parameters */ SaHpiDimiTestCapabilityT TestCapabilities; SaHpiDimiTestParamsDefinitionT TestParameters[SAHPI_DIMITEST_MAX_PARAMETERS]; } SaHpiDimiTestT; /* This struct defines the format of parameter which is passed ** to the test on invocation */ typedef struct { SaHpiUint8T ParamName[SAHPI_DIMITEST_PARAM_NAME_LEN]; /* Must exactly match the one returned by the ParamsDefinition */ SaHpiDimiTestParamTypeT ParamType; /* Must exactly match the one returned by the ParamsDefinition */ SaHpiDimiTestParamValueT Value; } SaHpiDimiTestVariableParamsT; /* Percentage of test completed. Based on DIMI test capability, Value range is 0 - 100, 0xFF returned if capability not available. */ typedef SaHpiUint8T SaHpiDimiTestPercentCompletedT; typedef enum { SAHPI_DIMI_READY, /* DIMI is in ready state to run a particular test */ SAHPI_DIMI_WRONG_STATE, /* DIMI is in the wrong state to run a particular test. For example, need to load a correct ServiceOS before this test can run */ SAHPI_DIMI_BUSY, /* DIMI cannot start a particular test at this time. User can try again later. */ SAHPI_DIMI_READY_MAX_VALID = SAHPI_DIMI_BUSY } SaHpiDimiReadyT; typedef struct { SaHpiUint32T NumberOfTests; /* It is recommended that the DIMI advertise all available tests regardless of ServiceImpact or Service OS */ SaHpiUint32T TestNumUpdateCounter; /* If number of tests change for DIMI this counter is incremented and Event is generated*/ } SaHpiDimiInfoT; /******************************************************************************* ******************************************************************************** ********** ********** ********** DIMI Resource Data Records ********** ********** ********** ******************************************************************************** *******************************************************************************/ /* ** All DIMIs must be represented in the ** RDR repository with an SaHpiDimiRecT */ typedef struct { SaHpiDimiNumT DimiNum; SaHpiUint32T Oem; /* Reserved for OEM use */ } SaHpiDimiRecT; /******************************************************************************* ******************************************************************************** ********** ********** ********** FUMI ********** ********** ********** ******************************************************************************** *******************************************************************************/ /* FUMI Number - identifier for a FUMI */ typedef SaHpiInstrumentIdT SaHpiFumiNumT; /* Bank number on FUMI */ typedef SaHpiUint8T SaHpiBankNumT; /* ** Spec framework underlying a FUMI implementation ** ** This information can be presented in two ways: ** ** 1) If SAF recognizes underlying spec framework: ** a well-known assigned Spec Identifier and Spec ** revision (SaHpiFumiSafDefinedSpecInfoT). ** ** 2) Otherwise, an OEM defined identifier (SaHpiFumiOemDefinedSpecInfoT) */ /* ** Underlying spec framework information type */ typedef enum { SAHPI_FUMI_SPEC_INFO_NONE, SAHPI_FUMI_SPEC_INFO_SAF_DEFINED, SAHPI_FUMI_SPEC_INFO_OEM_DEFINED, SAHPI_FUMI_SPEC_INFO_MAX_VALID = SAHPI_FUMI_SPEC_INFO_OEM_DEFINED } SaHpiFumiSpecInfoTypeT; /* ** SAF-recognized underlying spec framework information */ typedef enum { SAHPI_FUMI_SPEC_HPM1 = 0, /* future revisions of HPI specification will define more constants */ SAHPI_FUMI_SPEC_MAX_VALID = SAHPI_FUMI_SPEC_HPM1 } SaHpiFumiSafDefinedSpecIdT; typedef struct { SaHpiFumiSafDefinedSpecIdT SpecID; SaHpiUint32T RevisionID; } SaHpiFumiSafDefinedSpecInfoT; /* ** OEM-defined underlying spec framework information */ #define SAHPI_FUMI_MAX_OEM_BODY_LENGTH 255 typedef struct { SaHpiManufacturerIdT Mid; SaHpiUint8T BodyLength; SaHpiUint8T Body[SAHPI_FUMI_MAX_OEM_BODY_LENGTH]; } SaHpiFumiOemDefinedSpecInfoT; /* ** Underlying spec framework information */ typedef union { SaHpiFumiSafDefinedSpecInfoT SafDefined; SaHpiFumiOemDefinedSpecInfoT OemDefined; } SaHpiFumiSpecInfoTypeUnionT; typedef struct { SaHpiFumiSpecInfoTypeT SpecInfoType; SaHpiFumiSpecInfoTypeUnionT SpecInfoTypeUnion; } SaHpiFumiSpecInfoT; /* ** Firmware instance info. ** InstancePresent indicates whether the firmware instance is present or not. ** Identifier contains file name. ** Description contains the description string for the firmware instance. ** DateTime contains the firmware build date-time ** Version further identifies the firmware instance. ** Text buffers may have zero length if data is not available. ** Version field values may be 0 if version data is not available. */ typedef struct { SaHpiBoolT InstancePresent; SaHpiTextBufferT Identifier; SaHpiTextBufferT Description; SaHpiTextBufferT DateTime; SaHpiUint32T MajorVersion; SaHpiUint32T MinorVersion; SaHpiUint32T AuxVersion; } SaHpiFumiFirmwareInstanceInfoT; /* ** FUMI Service Impact Levels */ typedef enum { SAHPI_FUMI_PROCESS_NONDEGRADING, SAHPI_FUMI_PROCESS_DEGRADING, SAHPI_FUMI_PROCESS_VENDOR_DEFINED_IMPACT_LEVEL, SAHPI_FUMI_PROCESS_IMPACT_MAX_VALID = SAHPI_FUMI_PROCESS_VENDOR_DEFINED_IMPACT_LEVEL } SaHpiFumiServiceImpactT; /* ** An upgrade process on FUMI may affect the entity corresponding to FUMI ** resource. It also may affect other entities as well. ** This struct defines the entity path and the service impact for an affected ** entity. */ typedef struct { SaHpiEntityPathT ImpactedEntity; SaHpiFumiServiceImpactT ServiceImpact; } SaHpiFumiImpactedEntityT; /* ** Maximum number of entities that can be affected by an upgrade process ** on a FUMI */ #define SAHPI_FUMI_MAX_ENTITIES_IMPACTED 5 /* ** This structure lists the entities affected by an upgrade process on a FUMI. ** If an entity is in the list, all its contained entities are implicitly ** considered affected as well (and with the same impact description). ** If both container and contained entity are in list, impact description for ** contained entity is explicitly taken from the corresponding list element. */ typedef struct { SaHpiUint32T NumEntities; SaHpiFumiImpactedEntityT ImpactedEntities[SAHPI_FUMI_MAX_ENTITIES_IMPACTED]; } SaHpiFumiServiceImpactDataT; /* ** FUMI Source Validation Status codes */ typedef enum { SAHPI_FUMI_SRC_VALID = 0, SAHPI_FUMI_SRC_PROTOCOL_NOT_SUPPORTED, /* The source URI specifies a protocol that is not supported by the FUMI */ SAHPI_FUMI_SRC_UNREACHABLE, /* Destination designated by source URI is not reachable, or does not respond */ SAHPI_FUMI_SRC_VALIDATION_NOT_STARTED, /* Validation process has not been started, e.g., no call to saHpiFumiSourceInfoValidate(). */ SAHPI_FUMI_SRC_VALIDATION_INITIATED, /* Validation process is in process */ SAHPI_FUMI_SRC_VALIDATION_FAIL, /* Validation process failed, unable to determine if source image is valid */ SAHPI_FUMI_SRC_TYPE_MISMATCH, /* If the source image does not match the target */ SAHPI_FUMI_SRC_INVALID, /* If the source image fails validation such as failed checksum, corrupted etc. */ SAHPI_FUMI_SRC_VALIDITY_UNKNOWN, /* If the source image validity cannot be determined */ SAHPI_FUMI_SRC_STATUS_MAX_VALID = SAHPI_FUMI_SRC_VALIDITY_UNKNOWN } SaHpiFumiSourceStatusT; /* ** FUMI Bank States */ typedef enum { SAHPI_FUMI_BANK_VALID = 0x00, SAHPI_FUMI_BANK_UPGRADE_IN_PROGRESS, SAHPI_FUMI_BANK_CORRUPTED, SAHPI_FUMI_BANK_ACTIVE, /* Bank has become active bank */ SAHPI_FUMI_BANK_BUSY, /* FUMI operations targeting bank are not currently possible */ SAHPI_FUMI_BANK_UNKNOWN, SAHPI_FUMI_BANK_STATE_MAX_VALID = SAHPI_FUMI_BANK_UNKNOWN } SaHpiFumiBankStateT; /* ** FUMI Upgrade Status */ typedef enum { SAHPI_FUMI_OPERATION_NOTSTARTED = 0x00, /* Only returned in response to saHpiFumiUpgradeStatusGet() */ SAHPI_FUMI_SOURCE_VALIDATION_INITIATED, SAHPI_FUMI_SOURCE_VALIDATION_FAILED, SAHPI_FUMI_SOURCE_VALIDATION_DONE, SAHPI_FUMI_SOURCE_VALIDATION_CANCELLED, SAHPI_FUMI_INSTALL_INITIATED, SAHPI_FUMI_INSTALL_FAILED_ROLLBACK_NEEDED, SAHPI_FUMI_INSTALL_FAILED_ROLLBACK_INITIATED, SAHPI_FUMI_INSTALL_FAILED_ROLLBACK_NOT_POSSIBLE, SAHPI_FUMI_INSTALL_DONE, SAHPI_FUMI_INSTALL_CANCELLED, /* User cancelled operation */ SAHPI_FUMI_ROLLBACK_INITIATED, SAHPI_FUMI_ROLLBACK_FAILED, SAHPI_FUMI_ROLLBACK_DONE, SAHPI_FUMI_ROLLBACK_CANCELLED, SAHPI_FUMI_BACKUP_INITIATED, SAHPI_FUMI_BACKUP_FAILED, SAHPI_FUMI_BACKUP_DONE, SAHPI_FUMI_BACKUP_CANCELLED, SAHPI_FUMI_BANK_COPY_INITIATED, SAHPI_FUMI_BANK_COPY_FAILED, SAHPI_FUMI_BANK_COPY_DONE, SAHPI_FUMI_BANK_COPY_CANCELLED, SAHPI_FUMI_TARGET_VERIFY_INITIATED, SAHPI_FUMI_TARGET_VERIFY_FAILED, SAHPI_FUMI_TARGET_VERIFY_DONE, SAHPI_FUMI_TARGET_VERIFY_CANCELLED, SAHPI_FUMI_ACTIVATE_INITIATED, SAHPI_FUMI_ACTIVATE_FAILED_ROLLBACK_NEEDED, SAHPI_FUMI_ACTIVATE_FAILED_ROLLBACK_INITIATED, SAHPI_FUMI_ACTIVATE_FAILED_ROLLBACK_NOT_POSSIBLE, SAHPI_FUMI_ACTIVATE_DONE, SAHPI_FUMI_ACTIVATE_CANCELLED, SAHPI_FUMI_UPGRADE_STATUS_MAX_VALID = SAHPI_FUMI_ACTIVATE_CANCELLED } SaHpiFumiUpgradeStatusT; /* ** FUMI Source Information - ** Source name contains the file in the identifier section, manufacturer and ** build date-time in description section and version number to correctly ** identify the firmware. Text buffers may have zero length if data is not ** available. Version values may be 0 if version data is not available. */ typedef struct { SaHpiTextBufferT SourceUri; /* Value set for the source information with saHpiFumiSourceSet(). */ SaHpiFumiSourceStatusT SourceStatus; /* Result of validation */ SaHpiTextBufferT Identifier; /* File name */ SaHpiTextBufferT Description; /* Description */ SaHpiTextBufferT DateTime; /* Build Date-Time */ SaHpiUint32T MajorVersion; /* Major Version */ SaHpiUint32T MinorVersion; /* Minor Version */ SaHpiUint32T AuxVersion; /* Auxiliary Version */ } SaHpiFumiSourceInfoT; /* ** FUMI subsidiary component information */ typedef struct { SaHpiEntryIdT EntryId; SaHpiUint32T ComponentId; SaHpiFumiFirmwareInstanceInfoT MainFwInstance; SaHpiUint32T ComponentFlags; /* Reserved for future use */ } SaHpiFumiComponentInfoT; /* ** FUMI Bank Information - ** Text buffers may have zero length if data is not ** available. Version values may be 0 if version data is not available. */ typedef struct { SaHpiUint8T BankId; /* Identifier for bank */ SaHpiUint32T BankSize; /* Bank Size in KBytes */ SaHpiUint32T Position; /* Bank Position in boot order. If only one bank, will always be set to "1" */ SaHpiFumiBankStateT BankState; /* Validity state of bank */ SaHpiTextBufferT Identifier; /* File name */ SaHpiTextBufferT Description; /* Description */ SaHpiTextBufferT DateTime; /* Build Date-Time */ SaHpiUint32T MajorVersion; /* Major Version */ SaHpiUint32T MinorVersion; /* Minor Version */ SaHpiUint32T AuxVersion; /* Auxiliary Version */ } SaHpiFumiBankInfoT; /* ** FUMI Logical Bank State Flags ** Currently only one state flag is defined. It indicates that the currently executing main ** firmware instance does not have a persistent copy. ** Additional state flags may be defined in future versions of this specification. */ typedef SaHpiUint32T SaHpiFumiLogicalBankStateFlagsT; #define SAHPI_FUMI_NO_MAIN_PERSISTENT_COPY (SaHpiFumiLogicalBankStatesT)0x00000001 /* ** FUMI Logical Bank Information */ typedef struct { /* The max number of persistent firmware instances that this */ /* FUMI logical bank can have at the same time */ SaHpiUint8T FirmwarePersistentLocationCount; SaHpiFumiLogicalBankStateFlagsT BankStateFlags; SaHpiFumiFirmwareInstanceInfoT PendingFwInstance; SaHpiFumiFirmwareInstanceInfoT RollbackFwInstance; } SaHpiFumiLogicalBankInfoT; /* ** Logical FUMI Bank Component Information */ typedef struct { SaHpiEntryIdT EntryId; SaHpiUint32T ComponentId; SaHpiFumiFirmwareInstanceInfoT PendingFwInstance; SaHpiFumiFirmwareInstanceInfoT RollbackFwInstance; SaHpiUint32T ComponentFlags; /* Reserved for future use */ } SaHpiFumiLogicalComponentInfoT; /******************************************************************************* ******************************************************************************** ********** ********** ********** FUMI Resource Data Records ********** ********** ********** ******************************************************************************** *******************************************************************************/ /* ** Supported Access Protocols are stored as a bit map for all the different ** access mechanisms that the FUMI implementation supports for accessing the ** firmware binary from the source repository. ** ** Future versions of the HPI specification may define additional access ** protocols and associate them with currently undefined bit positions in ** the SaHpiFumiProtocolT bit mask. Implementations conforming to ** this version of the HPI specification should set all undefined bit values ** to zero in the AccessProt field of the FUMI Resource Data Record. ** However, HPI Users should not assume undefined bit values are zero, to ** remain compatible with HPI implementations that implement future versions ** of the specification. ** */ typedef SaHpiUint32T SaHpiFumiProtocolT; #define SAHPI_FUMI_PROT_TFTP (SaHpiFumiProtocolT)0x00000001 #define SAHPI_FUMI_PROT_FTP (SaHpiFumiProtocolT)0x00000002 #define SAHPI_FUMI_PROT_HTTP (SaHpiFumiProtocolT)0x00000004 #define SAHPI_FUMI_PROT_LDAP (SaHpiFumiProtocolT)0x00000008 #define SAHPI_FUMI_PROT_LOCAL (SaHpiFumiProtocolT)0x00000010 /* Local Copy */ #define SAHPI_FUMI_PROT_NFS (SaHpiFumiProtocolT)0x00000020 #define SAHPI_FUMI_PROT_DBACCESS (SaHpiFumiProtocolT)0x00000040 /* ** Capability flag of FUMI is a bitmap of supported capabilities ** ** Future versions of the HPI specification may define additional FUMI ** capabilities and associate them with currently undefined bit positions in ** the SaHpiFumiCapabilityT bit mask. Implementations conforming to ** this version of the HPI specification should set all undefined bit values ** to zero in the Capability field of the FUMI Resource Data Record. ** However, HPI Users should not assume undefined bit values are zero, to ** remain compatible with HPI implementations that implement future versions ** of the specification. ** */ typedef SaHpiUint32T SaHpiFumiCapabilityT; #define SAHPI_FUMI_CAP_ROLLBACK (SaHpiFumiCapabilityT)0x00000001 #define SAHPI_FUMI_CAP_BANKCOPY (SaHpiFumiCapabilityT)0x00000002 #define SAHPI_FUMI_CAP_BANKREORDER (SaHpiFumiCapabilityT)0x00000004 #define SAHPI_FUMI_CAP_BACKUP (SaHpiFumiCapabilityT)0x00000008 #define SAHPI_FUMI_CAP_TARGET_VERIFY (SaHpiFumiCapabilityT)0x00000010 #define SAHPI_FUMI_CAP_TARGET_VERIFY_MAIN (SaHpiFumiCapabilityT)0x00000020 #define SAHPI_FUMI_CAP_COMPONENTS (SaHpiFumiCapabilityT)0x00000040 #define SAHPI_FUMI_CAP_AUTOROLLBACK (SaHpiFumiCapabilityT)0x00000080 #define SAHPI_FUMI_CAP_AUTOROLLBACK_CAN_BE_DISABLED \ (SaHpiFumiCapabilityT)0x00000100 #define SAHPI_FUMI_CAP_MAIN_NOT_PERSISTENT \ (SaHpiFumiCapabilityT)0x00000200 /* ** Record Definition ** Definition of the FUMI resource data record. */ typedef struct { SaHpiFumiNumT Num; /* FUMI Number/Index */ SaHpiFumiProtocolT AccessProt; /* Supported protocols for repository access */ SaHpiFumiCapabilityT Capability; /* Optional capbilities supported by FUMI */ SaHpiUint8T NumBanks; /* Number of explicit banks supported. Set to "0" if no explicit banks are supported */ SaHpiUint32T Oem; /* Reserved for OEM use */ } SaHpiFumiRecT; /******************************************************************************* ******************************************************************************** ********** ********** ********** Hot Swap ********** ********** ********** ******************************************************************************** *******************************************************************************/ /* Hot Swap Indicator State */ typedef enum { SAHPI_HS_INDICATOR_OFF = 0, SAHPI_HS_INDICATOR_ON, SAHPI_HS_INDICATOR_STATE_MAX_VALID = SAHPI_HS_INDICATOR_ON } SaHpiHsIndicatorStateT; /* Hot Swap Action */ typedef enum { SAHPI_HS_ACTION_INSERTION = 0, SAHPI_HS_ACTION_EXTRACTION, SAHPI_HS_ACTION_MAX_VALID = SAHPI_HS_ACTION_EXTRACTION } SaHpiHsActionT; /* Hot Swap State */ typedef enum { SAHPI_HS_STATE_INACTIVE = 0, SAHPI_HS_STATE_INSERTION_PENDING, SAHPI_HS_STATE_ACTIVE, SAHPI_HS_STATE_EXTRACTION_PENDING, SAHPI_HS_STATE_NOT_PRESENT, SAHPI_HS_STATE_MAX_VALID = SAHPI_HS_STATE_NOT_PRESENT } SaHpiHsStateT; /* Cause of Hot Swap State Change */ typedef enum { SAHPI_HS_CAUSE_AUTO_POLICY = 0, SAHPI_HS_CAUSE_EXT_SOFTWARE, SAHPI_HS_CAUSE_OPERATOR_INIT, SAHPI_HS_CAUSE_USER_UPDATE, SAHPI_HS_CAUSE_UNEXPECTED_DEACTIVATION, SAHPI_HS_CAUSE_SURPRISE_EXTRACTION, SAHPI_HS_CAUSE_EXTRACTION_UPDATE, SAHPI_HS_CAUSE_HARDWARE_FAULT, SAHPI_HS_CAUSE_CONTAINING_FRU, SAHPI_HS_CAUSE_UNKNOWN = 0xFFFF, SAHPI_HS_CAUSE_MAX_VALID = SAHPI_HS_CAUSE_UNKNOWN } SaHpiHsCauseOfStateChangeT; /******************************************************************************* ******************************************************************************** ********** ********** ********** Events ********** ********** ********** ******************************************************************************** *******************************************************************************/ /* Event Data Structures */ typedef enum { SAHPI_CRITICAL = 0, SAHPI_MAJOR, SAHPI_MINOR, SAHPI_INFORMATIONAL, SAHPI_OK, SAHPI_DEBUG = 0xF0, SAHPI_ALL_SEVERITIES = 0xFF, /* Only used with some DAT and */ /* Annunciator functions. This is */ /* not a valid severity for events, */ /* alarms, or announcements */ SAHPI_SEVERITY_MAX_VALID = SAHPI_DEBUG } SaHpiSeverityT; /* ** Resource Event Types ** ** Future versions of this specification may add new types of resource events ** to this enumerated type. Legacy HPI Users should consider these new types ** "valid but unknown". */ typedef enum { SAHPI_RESE_RESOURCE_FAILURE, SAHPI_RESE_RESOURCE_RESTORED, SAHPI_RESE_RESOURCE_ADDED, SAHPI_RESE_RESOURCE_REMOVED, SAHPI_RESE_RESOURCE_INACCESSIBLE, SAHPI_RESE_RESOURCE_UPDATED, SAHPI_RESE_TYPE_MAX_VALID = SAHPI_RESE_RESOURCE_UPDATED } SaHpiResourceEventTypeT; typedef struct { SaHpiResourceEventTypeT ResourceEventType; } SaHpiResourceEventT; /* ** Domain events are used to announce the addition of domain references ** and the removal of domain references to the DRT. ** ** ** Future versions of this specification may add new types of domain events ** to this enumerated type. Legacy HPI Users should consider these new types ** "valid but unknown". */ typedef enum { SAHPI_DOMAIN_REF_ADDED, SAHPI_DOMAIN_REF_REMOVED, SAHPI_DOMAIN_EVENT_TYPE_MAX_VALID = SAHPI_DOMAIN_REF_REMOVED } SaHpiDomainEventTypeT; typedef struct { SaHpiDomainEventTypeT Type; /* Type of domain event */ SaHpiDomainIdT DomainId; /* Domain Id of domain added to or removed from DRT. */ } SaHpiDomainEventT; /* ** Sensor events and Sensor enable change events are issued to report ** changes in status of Sensors. These events are associated with ** specific Sensor management instruments, identified by the SensorNum ** field in the event. */ /* ** Sensor Optional Data ** ** Sensor events may contain optional data items passed and stored with the ** event. If these optional data items are present, they are included with ** the event data returned in response to an saHpiEventGet() or ** saHpiEventLogEntryGet() function call. Also, the optional data items may be ** included with the event data passed to the saHpiEventLogEntryAdd() function. ** ** Specific implementations of HPI may have restrictions on how much data may ** be passed to saHpiEventLogEntryAdd(). These restrictions should be documented ** by the provider of the HPI interface. ** ** Future versions of the HPI specification may define additional Sensor ** optional data items and associate them with currently undefined bit positions ** in the SaHpiSensorOptionalDataT bit mask. Implementations conforming to ** this version of the HPI specification should set all undefined bit values ** to zero in the OptionalDataPresent field of Sensor events. ** However, HPI Users should not assume undefined bit values are zero, to ** remain compatible with HPI implementations that implement future versions ** of the specification. ** */ typedef SaHpiUint8T SaHpiSensorOptionalDataT; #define SAHPI_SOD_TRIGGER_READING (SaHpiSensorOptionalDataT)0x01 #define SAHPI_SOD_TRIGGER_THRESHOLD (SaHpiSensorOptionalDataT)0x02 #define SAHPI_SOD_OEM (SaHpiSensorOptionalDataT)0x04 #define SAHPI_SOD_PREVIOUS_STATE (SaHpiSensorOptionalDataT)0x08 #define SAHPI_SOD_CURRENT_STATE (SaHpiSensorOptionalDataT)0x10 #define SAHPI_SOD_SENSOR_SPECIFIC (SaHpiSensorOptionalDataT)0x20 typedef struct { SaHpiSensorNumT SensorNum; SaHpiSensorTypeT SensorType; SaHpiEventCategoryT EventCategory; SaHpiBoolT Assertion; /* True = Event State asserted False = deasserted */ SaHpiEventStateT EventState; /* single state being asserted or deasserted*/ SaHpiSensorOptionalDataT OptionalDataPresent; /* the following fields are only valid if the corresponding flag is set in the OptionalDataPresent field */ SaHpiSensorReadingT TriggerReading; /* Reading that triggered the event */ SaHpiSensorReadingT TriggerThreshold; /* Value of the threshold that was crossed. Is not present if threshold is not readable. */ SaHpiEventStateT PreviousState; /* Previous set of asserted event states. If multiple event states change at once, multiple events may be generated for each changing event state. This field should indicate the status of the Sensor event states prior to any of the simultaneous changes. Thus, it is the same in each event generated due to multiple simultaneous event state changes. */ SaHpiEventStateT CurrentState; /* Current set of asserted event states. */ SaHpiUint32T Oem; SaHpiUint32T SensorSpecific; } SaHpiSensorEventT; /* ** Sensor Enable Change Optional Data ** ** Sensor enable change events may contain optional data items passed and ** stored with the event. ** ** Future versions of the HPI specification may define additional Sensor enable ** change optional data items and associate them with currently undefined bit ** positions in the SaHpiSensorEnableOptDataT bit mask. Implementations ** conforming to this version of the HPI specification should set all undefined ** bit values to zero in the OptionalDataPresent field of Sensor Enable Change ** events. However, HPI Users should not assume undefined bit values are zero, ** to remain compatible with HPI implementations that implement future versions ** of the specification. ** */ typedef SaHpiUint8T SaHpiSensorEnableOptDataT; #define SAHPI_SEOD_CURRENT_STATE (SaHpiSensorEnableOptDataT)0x10 #define SAHPI_SEOD_ALARM_STATES (SaHpiSensorEnableOptDataT)0x40 typedef struct { SaHpiSensorNumT SensorNum; SaHpiSensorTypeT SensorType; SaHpiEventCategoryT EventCategory; SaHpiBoolT SensorEnable; /* current Sensor enable status */ SaHpiBoolT SensorEventEnable; /* current evt enable status */ SaHpiEventStateT AssertEventMask; /* current assert event mask */ SaHpiEventStateT DeassertEventMask; /* current deassert evt mask */ SaHpiSensorEnableOptDataT OptionalDataPresent; /* The CurrentState field is valid only if the SAHPI_SEOD_CURRENT_STATE flag is set in the OptionalDataPresent field. */ SaHpiEventStateT CurrentState; /* Current set of asserted Event states. */ /* The CriticalAlarms, MajorAlarms and MinorAlarms fields are valid only if the SAHPI_SEOD_ALARM_STATES flag is set in the OptionalDataPresent field. These fields indicate which of the currently asserted event states are critical, major, or minor alarms, respectively. An asserted event state is an alarm only if the Sensor is enabled, Sensor events are enabled, the corresponding AssertEventMask bit is set, and the event generated for that event state assertion has a severity of SAHPI_CRITICAL, SAHPI_MAJOR, or SAHPI_MINOR. Thus, if the event is reporting that the Sensor is disabled or Sensor events are disabled, then these three fields, if present, must all be equal to 0000. Similarly, there should never be a bit set in any of these three fields that is not also set in the AssertEventMask field, and, if the SAHPI_SEOD_CURRENT_STATE flag is Set, in the CurrentState field. */ SaHpiEventStateT CriticalAlarms; /* current set of asserted Event states that are critical alarms.*/ SaHpiEventStateT MajorAlarms; /* current set of asserted Event states that are major alarms.*/ SaHpiEventStateT MinorAlarms; /* current set of asserted Event states that are minor alarms.*/ } SaHpiSensorEnableChangeEventT; typedef struct { SaHpiHsStateT HotSwapState; SaHpiHsStateT PreviousHotSwapState; SaHpiHsCauseOfStateChangeT CauseOfStateChange; } SaHpiHotSwapEventT; /* ** Watchdog events are issued to report changes in status of Sensors. These ** events are associated with specific Watchdog Timer management instruments, ** identified by the WatchdogNum field in the event. */ typedef struct { SaHpiWatchdogNumT WatchdogNum; SaHpiWatchdogActionEventT WatchdogAction; SaHpiWatchdogPretimerInterruptT WatchdogPreTimerAction; SaHpiWatchdogTimerUseT WatchdogUse; } SaHpiWatchdogEventT; /* ** The following type defines the types of events that can be reported ** by the HPI software implementation. ** ** Audit events report a discrepancy in the audit process. Audits are typically ** performed by HA software to detect problems. Audits may look for such things ** as corrupted data stores, inconsistent RPT information, or improperly managed ** queues. ** ** Startup events report a failure to start-up properly, or inconsistencies in ** persisted data. ** ** ** Future versions of this specification may add new types of software events ** to this enumerated type. Legacy HPI Users should consider these new types ** "valid but unknown". */ typedef enum { SAHPI_HPIE_AUDIT, SAHPI_HPIE_STARTUP, SAHPI_HPIE_OTHER, SAHPI_HPIE_TYPE_MAX_VALID = SAHPI_HPIE_OTHER } SaHpiSwEventTypeT; typedef struct { SaHpiManufacturerIdT MId; SaHpiSwEventTypeT Type; SaHpiTextBufferT EventData; } SaHpiHpiSwEventT; typedef struct { SaHpiManufacturerIdT MId; SaHpiTextBufferT OemEventData; } SaHpiOemEventT; /* ** User events may be used for storing custom events created by an HPI User ** when injecting events into the Event Log using saHpiEventLogEntryAdd(). */ typedef struct { SaHpiTextBufferT UserEventData; } SaHpiUserEventT; /* ** DIMI events and DIMI Update events are issued to report changes in status ** of DIMIs or tests initiated by DIMIs. These events are associated with ** specific Diagnotic Initiator management instruments, identified by the ** DimiNum field in the event. */ /* ** DIMI events are generated by DIMI implementation asynchronously when ** status of a test changes (For example when a test starts, ends, gets ** canceled or generated for % completed). The test run status is enumerated ** in SaHpiDimiTestRunStatusT */ typedef struct { SaHpiDimiNumT DimiNum; SaHpiDimiTestNumT TestNum; SaHpiDimiTestRunStatusT DimiTestRunStatus; SaHpiDimiTestPercentCompletedT DimiTestPercentCompleted; /* Percentage of test completed. Based on implementation capability, value 0 - 100, 0xFF returned if capability not available */ } SaHpiDimiEventT; /* ** DIMI update events are generated when the set of tests for a DIMI changes. ** For example, when new tests are added or deleted from DIMI. When this event ** is generated, HPI User is expected to retrieve updated test information ** using DimiInfoGet function with the DIMI number provided in the event. */ typedef struct { SaHpiDimiNumT DimiNum; } SaHpiDimiUpdateEventT; /* ** FUMI events are issued to report changes in status of firmware upgrade ** operations. These events are associated with specific Firmware Upgrade ** management instruments, identified by the FumiNum field in the event. */ /* ** FUMI event definition ** */ typedef struct { SaHpiFumiNumT FumiNum; /* FUMI Number */ SaHpiUint8T BankNum; /* Bank Number */ SaHpiFumiUpgradeStatusT UpgradeStatus; /* Upgrade status of bank */ } SaHpiFumiEventT; /* HPI Event Types ** ** Future versions of this specification may add new event types to this ** enumerated type. Legacy HPI Users should consider these new event types ** "valid but unknown" and should not attempt to interpret such events. ** In general, if an event of unknown type is found in an event log or ** received via an event subscription it should be ignored by the HPI User. */ typedef enum { SAHPI_ET_RESOURCE, SAHPI_ET_DOMAIN, SAHPI_ET_SENSOR, SAHPI_ET_SENSOR_ENABLE_CHANGE, SAHPI_ET_HOTSWAP, SAHPI_ET_WATCHDOG, SAHPI_ET_HPI_SW, SAHPI_ET_OEM, SAHPI_ET_USER, SAHPI_ET_DIMI, SAHPI_ET_DIMI_UPDATE, SAHPI_ET_FUMI, SAHPI_ET_MAX_VALID = SAHPI_ET_FUMI } SaHpiEventTypeT; typedef union { SaHpiResourceEventT ResourceEvent; SaHpiDomainEventT DomainEvent; SaHpiSensorEventT SensorEvent; SaHpiSensorEnableChangeEventT SensorEnableChangeEvent; SaHpiHotSwapEventT HotSwapEvent; SaHpiWatchdogEventT WatchdogEvent; SaHpiHpiSwEventT HpiSwEvent; SaHpiOemEventT OemEvent; SaHpiUserEventT UserEvent; SaHpiDimiEventT DimiEvent; SaHpiDimiUpdateEventT DimiUpdateEvent; SaHpiFumiEventT FumiEvent; } SaHpiEventUnionT; typedef struct { SaHpiResourceIdT Source; SaHpiEventTypeT EventType; SaHpiTimeT Timestamp; /*Equal to SAHPI_TIME_UNSPECIFIED if time is not available; Absolute time if greater than SAHPI_TIME_MAX_RELATIVE, Relative time if less than or equal to SAHPI_TIME_MAX_RELATIVE */ SaHpiSeverityT Severity; SaHpiEventUnionT EventDataUnion; } SaHpiEventT; /* ** Event Queue Status ** ** This status word is returned to HPI Users that request it ** when saHpiEventGet() is called. ** */ typedef SaHpiUint32T SaHpiEvtQueueStatusT; #define SAHPI_EVT_QUEUE_OVERFLOW (SaHpiEvtQueueStatusT)0x0001 /******************************************************************************* ******************************************************************************** ********** ********** ********** Annunciators ********** ********** ********** ******************************************************************************** *******************************************************************************/ /* ** Annunciator Number ** Identifier for an Annunciator management instrument. */ typedef SaHpiInstrumentIdT SaHpiAnnunciatorNumT; /* ** The following data type is equivalent to the AIS data type SaNameT. ** it is defined in this header file, so that inclusion of the AIS ** header file is not required. This data type is based on version 1.0 ** of the AIS specification */ #define SA_HPI_MAX_NAME_LENGTH 256 typedef struct { SaHpiUint16T Length; unsigned char Value[SA_HPI_MAX_NAME_LENGTH]; } SaHpiNameT; /* ** Enumeration of Announcement Types ** ** Future versions of this specification may add new types of announcements ** to this enumerated type. Legacy HPI Users should consider these new types ** "valid but unknown". */ typedef enum { SAHPI_STATUS_COND_TYPE_SENSOR, SAHPI_STATUS_COND_TYPE_RESOURCE, SAHPI_STATUS_COND_TYPE_OEM, SAHPI_STATUS_COND_TYPE_USER, SAHPI_STATUS_COND_TYPE_MAX_VALID = SAHPI_STATUS_COND_TYPE_USER } SaHpiStatusCondTypeT; /* Condition structure definition */ typedef struct { SaHpiStatusCondTypeT Type; /* Status Condition Type */ SaHpiEntityPathT Entity; /* Entity assoc. with status condition */ SaHpiDomainIdT DomainId; /* Domain associated with status. May be SAHPI_UNSPECIFIED_DOMAIN_ID meaning current domain, or domain not meaningful for status condition*/ SaHpiResourceIdT ResourceId; /* Resource associated with status. May be SAHPI_UNSPECIFIED_RESOURCE_ID if Type is SAHPI_STATUS_COND_USER. Must be set to valid ResourceId in domain specified by DomainId, or in current domain, if DomainId is SAHPI_UNSPECIFIED_DOMAIN_ID */ SaHpiSensorNumT SensorNum; /* Sensor associated with status Only valid if Type is SAHPI_STATUS_COND_TYPE_SENSOR */ SaHpiEventStateT EventState; /* Sensor event state. Only valid if Type is SAHPI_STATUS_COND_TYPE_SENSOR. */ SaHpiNameT Name; /* AIS compatible identifier associated with Status condition */ SaHpiManufacturerIdT Mid; /* Manufacturer Id associated with status condition, required when type is SAHPI_STATUS_COND_TYPE_OEM. */ SaHpiTextBufferT Data; /* Optional Data associated with Status condition */ } SaHpiConditionT; /* Announcement structure definition */ typedef struct { SaHpiEntryIdT EntryId; /* Announcment Entry Id */ SaHpiTimeT Timestamp; /* Time when announcement added to set */ SaHpiBoolT AddedByUser; /* True if added to set by HPI User, False if added automatically by HPI implementation */ SaHpiSeverityT Severity; /* Severity of announcement */ SaHpiBoolT Acknowledged; /* Acknowledged flag */ SaHpiConditionT StatusCond; /* Detailed status condition */ } SaHpiAnnouncementT; /* Annunciator Mode - defines who may add or delete entries in set. */ typedef enum { SAHPI_ANNUNCIATOR_MODE_AUTO, SAHPI_ANNUNCIATOR_MODE_USER, SAHPI_ANNUNCIATOR_MODE_SHARED, SAHPI_ANNUNCIATOR_MODE_MAX_VALID = SAHPI_ANNUNCIATOR_MODE_SHARED } SaHpiAnnunciatorModeT; /******************************************************************************* ******************************************************************************** ********** ********** ********** Annunciator Resource Data Records ********** ********** ********** ******************************************************************************** *******************************************************************************/ /* ** The following enumerated type defines the possible output types ** which can be associated with an Annunciator Management Instrument ** ** Future versions of this specification may add new types of announcement ** output types to this enumerated type. Legacy HPI Users should consider ** these new types "valid but unknown". */ typedef enum { SAHPI_ANNUNCIATOR_TYPE_LED = 0, SAHPI_ANNUNCIATOR_TYPE_DRY_CONTACT_CLOSURE, SAHPI_ANNUNCIATOR_TYPE_AUDIBLE, SAHPI_ANNUNCIATOR_TYPE_LCD_DISPLAY, SAHPI_ANNUNCIATOR_TYPE_MESSAGE, SAHPI_ANNUNCIATOR_TYPE_COMPOSITE, SAHPI_ANNUNCIATOR_TYPE_OEM, SAHPI_ANNUNCIATOR_TYPE_MAX_VALID = SAHPI_ANNUNCIATOR_TYPE_OEM } SaHpiAnnunciatorTypeT; /* ** All Annunciator management instruments ** must be represented in the RDR repository ** with an SaHpiAnnunciatorRecT. */ typedef struct { SaHpiAnnunciatorNumT AnnunciatorNum; SaHpiAnnunciatorTypeT AnnunciatorType; /* Annunciator Output Type */ SaHpiBoolT ModeReadOnly; /* if True, Mode may not be changed by HPI User */ SaHpiUint32T MaxConditions; /* maximum number of conditions that can be held in current set. 0 means no fixed limit. */ SaHpiUint32T Oem; } SaHpiAnnunciatorRecT; /******************************************************************************* ******************************************************************************** ********** ********** ********** Resource Data Record ********** ********** ********** ******************************************************************************** *******************************************************************************/ /* ** The following describes the different types of records that exist within a ** RDR repository and the RDR super-structure to all of the specific RDR types ** (Sensor, Inventory Data, Watchdog, etc.). ** ** Future versions of this specification may add new resource data record ** types to this enumerated type. Legacy HPI Users should consider these new ** RDR types "valid but unknown" and should not attempt to interpret such ** records. In general, if an RDR of unknown type is found within a RDR ** repository the HPI User should ignore it. */ typedef enum { SAHPI_NO_RECORD, SAHPI_CTRL_RDR, SAHPI_SENSOR_RDR, SAHPI_INVENTORY_RDR, SAHPI_WATCHDOG_RDR, SAHPI_ANNUNCIATOR_RDR, SAHPI_DIMI_RDR, SAHPI_FUMI_RDR, SAHPI_RDR_TYPE_MAX_VALID = SAHPI_FUMI_RDR } SaHpiRdrTypeT; typedef union { SaHpiCtrlRecT CtrlRec; SaHpiSensorRecT SensorRec; SaHpiInventoryRecT InventoryRec; SaHpiWatchdogRecT WatchdogRec; SaHpiAnnunciatorRecT AnnunciatorRec; SaHpiDimiRecT DimiRec; SaHpiFumiRecT FumiRec; } SaHpiRdrTypeUnionT; typedef struct { SaHpiEntryIdT RecordId; SaHpiRdrTypeT RdrType; SaHpiEntityPathT Entity; /* Entity to which this RDR relates. */ SaHpiBoolT IsFru; /* Entity is a FRU. This field is Only valid if the Entity path given in the "Entity" field is different from the Entity path in the RPT entry for the resource. */ SaHpiRdrTypeUnionT RdrTypeUnion; SaHpiTextBufferT IdString; } SaHpiRdrT; /******************************************************************************* ******************************************************************************** ********** ********** ********** Parameter Control ********** ********** ********** ******************************************************************************** *******************************************************************************/ typedef enum { SAHPI_DEFAULT_PARM = 0, SAHPI_SAVE_PARM, SAHPI_RESTORE_PARM, SAHPI_PARM_ACTION_MAX_VALID = SAHPI_RESTORE_PARM } SaHpiParmActionT; /******************************************************************************* ******************************************************************************** ********** ********** ********** Reset ********** ********** ********** ******************************************************************************** *******************************************************************************/ typedef enum { SAHPI_COLD_RESET = 0, SAHPI_WARM_RESET, SAHPI_RESET_ASSERT, SAHPI_RESET_DEASSERT, SAHPI_RESET_MAX_VALID = SAHPI_RESET_DEASSERT } SaHpiResetActionT; /******************************************************************************* ******************************************************************************** ********** ********** ********** Power ********** ********** ********** ******************************************************************************** *******************************************************************************/ typedef enum { SAHPI_POWER_OFF = 0, SAHPI_POWER_ON, SAHPI_POWER_CYCLE, SAHPI_POWER_STATE_MAX_VALID = SAHPI_POWER_CYCLE } SaHpiPowerStateT; /******************************************************************************* ******************************************************************************** ********** ********** ********** Load ID ********** ********** ********** ******************************************************************************** *******************************************************************************/ typedef SaHpiUint32T SaHpiLoadNumberT; #define SAHPI_LOAD_ID_DEFAULT (SaHpiLoadNumberT)0 #define SAHPI_LOAD_ID_BYNAME (SaHpiLoadNumberT)0xffffffff typedef struct { SaHpiLoadNumberT LoadNumber; SaHpiTextBufferT LoadName; } SaHpiLoadIdT; /******************************************************************************* ******************************************************************************** ********** ********** ********** Resource Presence Table ********** ********** ********** ******************************************************************************** *******************************************************************************/ /* This section defines the types associated with the RPT. */ /* ** GUID - Globally Unique Identifier ** ** The format of the ID follows that specified by the Wired for Management ** Baseline, Version 2.0 specification. HPI uses version 1 of the GUID ** format, with a 3-bit variant field of 10x (where x indicates "don't care") */ typedef SaHpiUint8T SaHpiGuidT[16]; /* ** Resource Info Type Definitions ** ** ** SaHpiResourceInfoT contains static configuration data concerning the ** management controller associated with the resource, or the resource itself. ** Note this information is used to describe the resource; that is, the piece of ** infrastructure which manages an entity (or multiple entities) - NOT the ** entities for which the resource provides management. The purpose of the ** SaHpiResourceInfoT structure is to provide information that an HPI User may ** need to interact correctly with the resource (e.g., recognize a ** specific management controller which may have defined OEM fields in Sensors, ** OEM Controls, etc.). ** ** The fields of the SaHpiResourceInfoT structure are intended to uniquely ** identify an implementation of the functionality modeled by an HPI resource. ** Multiple instances of a resource implementation may be present in an HPI ** implementation with different configurations, so it is not required that ** this data be unique in each resource present in an HPI implemenation. ** ** The GUID is used to uniquely identify a Resource. A GUID value of zero ** indicates that the Resource does not have an associated GUID. ** ** All of the fields in the following structure may or may not be used by a ** given resource. */ typedef struct { SaHpiUint8T ResourceRev; SaHpiUint8T SpecificVer; SaHpiUint8T DeviceSupport; SaHpiManufacturerIdT ManufacturerId; SaHpiUint16T ProductId; SaHpiUint8T FirmwareMajorRev; SaHpiUint8T FirmwareMinorRev; SaHpiUint8T AuxFirmwareRev; SaHpiGuidT Guid; } SaHpiResourceInfoT; /* ** Resource Capabilities ** ** This definition defines the capabilities of a given resource. One resource ** may support any number of capabilities using the bit mask. Because each entry ** in an RPT has the SAHPI_CAPABILITY_RESOURCE bit set, zero is not a ** valid value for the capability flag, and is thus used to indicate "no RPT ** entry present" in some function calls. ** ** Future versions of the HPI specification may define additional resource ** capabilities and associate them with currently undefined bit positions in ** the SaHpiCapabilitiesT bit mask. Implementations conforming to this ** version of the HPI specification should set all undefined bit values to ** zero in the ResourceCapabilities field of all Rpt entries. However, ** HPI Users should not assume undefined bit values are zero, to ** remain compatible with HPI implementations that implement future versions ** of the specification. ** ** SAHPI_CAPABILITY_RESOURCE ** SAHPI_CAPABILITY_EVT_DEASSERTS ** Indicates that all Sensors on the resource have the property that their ** Assertion and Deassertion event enable flags are the same. That is, ** for all event states whose assertion triggers an event, it is ** guaranteed that the deassertion of that event state also ** triggers an event. Thus, an HPI User may track the state of Sensors on the ** resource by monitoring events rather than polling for event state changes. ** SAHPI_CAPABILITY_AGGREGATE_STATUS ** SAHPI_CAPABILITY_CONFIGURATION ** SAHPI_CAPABILITY_MANAGED_HOTSWAP ** Indicates that the resource supports managed hot swap. ** Since hot swap only makes sense for field-replaceable units, the ** SAHPI_CAPABILITY_FRU capability bit must also be set for this resource. ** SAHPI_CAPABILITY_WATCHDOG ** SAHPI_CAPABILITY_CONTROL ** SAHPI_CAPABILITY_FRU ** Indicates that the resource is associated with an entity that is a ** field-replaceable unit; i.e., it is capable of being removed and ** replaced in a live system, and the resource reports hot swap events ** for the FRU. ** SAHPI_CAPABILITY_LOAD_ID ** SAHPI_CAPABILITY_DIMI ** SAHPI_CAPABILITY_FUMI ** SAHPI_CAPABILITY_ANNUNCIATOR ** SAHPI_CAPABILITY_POWER ** SAHPI_CAPABILITY_RESET ** SAHPI_CAPABILITY_INVENTORY_DATA ** SAHPI_CAPABILITY_EVENT_LOG ** SAHPI_CAPABILITY_RDR ** Indicates that a resource data record (RDR) repository is supplied ** by the resource. Since the existence of an RDR is mandatory for all ** management instruments, this ** capability must be asserted if the resource ** contains any Sensors, Controls, Watchdog Timers, Annunciators, ** Inventory Data Repositories, FUMIs or DIMIs. ** SAHPI_CAPABILITY_SENSOR */ typedef SaHpiUint32T SaHpiCapabilitiesT; #define SAHPI_CAPABILITY_RESOURCE (SaHpiCapabilitiesT)0x40000000 #define SAHPI_CAPABILITY_FUMI (SaHpiCapabilitiesT)0x00010000 #define SAHPI_CAPABILITY_EVT_DEASSERTS (SaHpiCapabilitiesT)0x00008000 #define SAHPI_CAPABILITY_DIMI (SaHpiCapabilitiesT)0x00004000 #define SAHPI_CAPABILITY_AGGREGATE_STATUS (SaHpiCapabilitiesT)0x00002000 #define SAHPI_CAPABILITY_CONFIGURATION (SaHpiCapabilitiesT)0x00001000 #define SAHPI_CAPABILITY_MANAGED_HOTSWAP (SaHpiCapabilitiesT)0x00000800 #define SAHPI_CAPABILITY_WATCHDOG (SaHpiCapabilitiesT)0x00000400 #define SAHPI_CAPABILITY_CONTROL (SaHpiCapabilitiesT)0x00000200 #define SAHPI_CAPABILITY_FRU (SaHpiCapabilitiesT)0x00000100 #define SAHPI_CAPABILITY_LOAD_ID (SaHpiCapabilitiesT)0x00000080 #define SAHPI_CAPABILITY_ANNUNCIATOR (SaHpiCapabilitiesT)0x00000040 #define SAHPI_CAPABILITY_POWER (SaHpiCapabilitiesT)0x00000020 #define SAHPI_CAPABILITY_RESET (SaHpiCapabilitiesT)0x00000010 #define SAHPI_CAPABILITY_INVENTORY_DATA (SaHpiCapabilitiesT)0x00000008 #define SAHPI_CAPABILITY_EVENT_LOG (SaHpiCapabilitiesT)0x00000004 #define SAHPI_CAPABILITY_RDR (SaHpiCapabilitiesT)0x00000002 #define SAHPI_CAPABILITY_SENSOR (SaHpiCapabilitiesT)0x00000001 /* ** Resource Managed Hot Swap Capabilities ** ** This definition defines the managed hot swap capabilities of a given ** resource. ** ** Future versions of the HPI specification may define additional hot swap ** capabilities and associate them with currently undefined bit positions ** in the SaHpiHsCapabilitiesT bit mask. Implementations conforming to ** this version of the HPI specification should set all undefined bit values ** to zero in the HotSwapCapabilities field of all RPT entries. ** However, HPI Users should not assume undefined bit values are zero, to ** remain compatible with HPI implementations that implement future versions ** of the specification. ** ** SAHPI_HS_CAPABILITY_AUTOEXTRACT_READ_ONLY ** This capability indicates if the hot swap autoextract timer is read-only. ** SAHPI_HS_CAPABILITY_INDICATOR_SUPPORTED ** Indicates whether the resource has a hot swap indicator. ** SAHPI_HS_CAPABILITY_AUTOINSERT_IMMEDIATE ** This capability indicates that the resource ignores the auto insertion ** timeout value(s) configured for the domain(s) of which it is a member, ** but instead begins its auto insertion policy immediately upon insertion. */ typedef SaHpiUint32T SaHpiHsCapabilitiesT; #define SAHPI_HS_CAPABILITY_AUTOEXTRACT_READ_ONLY \ (SaHpiHsCapabilitiesT)0x80000000 #define SAHPI_HS_CAPABILITY_INDICATOR_SUPPORTED \ (SaHpiHsCapabilitiesT)0X40000000 #define SAHPI_HS_CAPABILITY_AUTOINSERT_IMMEDIATE\ (SaHpiHsCapabilitiesT)0x20000000 /* ** RPT Entry ** ** This structure is used to store the RPT entry information. ** ** The ResourceCapabilities field defines the capabilities of the resource. ** This field must be non-zero for all valid resources. ** ** The HotSwapCapabilities field denotes the capabilities of the resource, ** specifically related to hot swap. This field is only valid if the ** resource supports managed hot swap, as indicated by the ** SAHPI_CAPABILITY_MANAGED_HOT_SWAP resource capability. ** ** The ResourceTag is a data field within an RPT entry available to the HPI ** User for associating application specific data with a resource. The HPI ** User supplied data is purely informational and is not used by the HPI ** implementation, domain, or associated resource. For example, an HPI User ** can set the resource tag to a "descriptive" value, which can be used to ** identify the resource in messages to a human operator. */ typedef struct { SaHpiEntryIdT EntryId; SaHpiResourceIdT ResourceId; SaHpiResourceInfoT ResourceInfo; SaHpiEntityPathT ResourceEntity; /* If resource manages a FRU, entity path of the FRU */ /* If resource manages a single entity, entity path of that entity. */ /* If resource manages multiple entities, the entity path of the "primary" entity managed by the resource */ /* Must be set to the same value in every domain which contains this resource */ SaHpiCapabilitiesT ResourceCapabilities; /* Must be non-0. */ SaHpiHsCapabilitiesT HotSwapCapabilities; /* Indicates the hot swap capabilities of the resource */ SaHpiSeverityT ResourceSeverity; /* Indicates the criticality that should be raised when the resource is not responding */ SaHpiBoolT ResourceFailed; /* Indicates that the resource is not currently accessible */ SaHpiTextBufferT ResourceTag; } SaHpiRptEntryT; /******************************************************************************* ******************************************************************************** ********** ********** ********** Domain Information ********** ********** ********** ******************************************************************************** *******************************************************************************/ /* This section defines the types associated with the domain controller. */ /* ** Domain Capabilities ** ** This definition defines the capabilities of a given domain. A domain ** may support any number of capabilities using the bit mask. ** ** Future versions of the HPI specification may define additional domain ** capabilities and associate them with currently undefined bit positions ** in the SaHpiDomainCapabilitiesT bit mask. Implementations conforming to ** this version of the HPI specification should set all undefined bit values ** to zero in the DomainCapabilities field of the SaHpiDomainInfoT structure. ** However, HPI Users should not assume undefined bit values are zero, to ** remain compatible with HPI implementations that implement future versions ** of the specification. ** ** SAHPI_DOMAIN_CAP_AUTOINSERT_READ_ONLY ** Indicates that the domain auto insert timeout value is read-only ** and may not be modified using the saHpiHotSwapAutoInsertTimeoutSet() ** function. */ typedef SaHpiUint32T SaHpiDomainCapabilitiesT; #define SAHPI_DOMAIN_CAP_AUTOINSERT_READ_ONLY \ (SaHpiDomainCapabilitiesT)0X00000001 /* ** Domain Info ** ** This structure is used to store the information regarding the domain ** including information regarding the domain reference table (DRT) and ** the resource presence table (RPT). ** ** The DomainTag field is an informational value that supplies an HPI User ** with naming information for the domain. ** ** NOTE: Regarding timestamps - If the implementation cannot supply an absolute ** timestamp, then it may supply a timestamp relative to some system-defined ** epoch, such as system boot. The value SAHPI_TIME_UNSPECIFIED indicates that ** the time of the update cannot be determined. Otherwise, If the value is less ** than or equal to SAHPI_TIME_MAX_RELATIVE, then it is relative; if it is ** greater than SAHPI_TIME_MAX_RELATIVE, then it is absolute. ** ** The GUID is used to uniquely identify a domain. A GUID value of zero is not ** valid and indicates that the domain does not have an associated GUID. */ typedef struct { SaHpiDomainIdT DomainId; /* Unique Domain Id associated with domain */ SaHpiDomainCapabilitiesT DomainCapabilities; /* Domain Capabilities */ SaHpiBoolT IsPeer; /* Indicates that this domain participates in a peer relationship. */ SaHpiTextBufferT DomainTag; /* Information tag associated with domain */ SaHpiUint32T DrtUpdateCount; /* This count is incremented any time the table is changed. It rolls over to zero when the maximum value is reached */ SaHpiTimeT DrtUpdateTimestamp; /* This timestamp is set any time the DRT table is changed. */ SaHpiUint32T RptUpdateCount; /* This count is incremented any time the RPT is changed. It rolls over to zero when the maximum value is reached */ SaHpiTimeT RptUpdateTimestamp; /* This timestamp is set any time the RPT table is changed. */ SaHpiUint32T DatUpdateCount; /* This count is incremented any time the DAT is changed. It rolls over to zero when the maximum value is reached */ SaHpiTimeT DatUpdateTimestamp; /* This timestamp is set any time the DAT is changed. */ SaHpiUint32T ActiveAlarms; /* Count of active alarms in the DAT */ SaHpiUint32T CriticalAlarms; /* Count of active critical alarms in the DAT */ SaHpiUint32T MajorAlarms; /* Count of active major alarms in the DAT */ SaHpiUint32T MinorAlarms; /* Count of active minor alarms in the DAT */ SaHpiUint32T DatUserAlarmLimit; /* Maximum User Alarms that can be added to DAT. 0=no fixed limit */ SaHpiBoolT DatOverflow; /* Set to True if there are one or more non-User Alarms that are missing from the DAT because of space limitations */ SaHpiGuidT Guid; /* GUID associated with domain.*/ } SaHpiDomainInfoT; /* ** DRT Entry ** ** This structure is used to store the DRT entry information. ** */ typedef struct { SaHpiEntryIdT EntryId; SaHpiDomainIdT DomainId; /* The Domain ID referenced by this entry */ SaHpiBoolT IsPeer; /* Indicates if this domain reference is a peer. */ } SaHpiDrtEntryT; /* ** DAT Entry ** ** This structure is used to store alarm information in the DAT ** */ typedef SaHpiEntryIdT SaHpiAlarmIdT; typedef struct { SaHpiAlarmIdT AlarmId; /* Alarm Id */ SaHpiTimeT Timestamp; /* Time when alarm added to DAT */ SaHpiSeverityT Severity; /* Severity of alarm */ SaHpiBoolT Acknowledged; /* Acknowledged flag */ SaHpiConditionT AlarmCond; /* Detailed alarm condition */ } SaHpiAlarmT; /******************************************************************************* ******************************************************************************** ********** ********** ********** Event Log ********** ********** ********** ******************************************************************************** *******************************************************************************/ /* This section defines the types associated with the Event Log. */ /* ** Event Log Information ** ** The Entries entry denotes the number of active entries contained in the Event ** Log. ** The Size entry denotes the total number of entries the Event Log is able to ** hold. ** The UserEventMaxSize entry indicates the maximum size of the text buffer ** data field in an HPI User event that is supported by the Event Log ** implementation. If the implementation does not enforce a more restrictive ** data length, it should be set to SAHPI_MAX_TEXT_BUFFER_LENGTH. ** The UpdateTimestamp entry denotes the time of the last update to the Event ** Log. ** The CurrentTime entry denotes the Event Log's idea of the current time; i.e ** the timestamp that would be placed on an entry if it was added now. ** The Enabled entry indicates whether the Event Log is enabled. If the Event ** Log is "disabled" no events generated within the HPI implementation are ** added to the Event Log. Events may still be added to the Event Log with ** the saHpiEventLogEntryAdd() function. When the Event Log is "enabled" ** events may be automatically added to the Event Log as they are generated ** in a resource or a domain, however, it is implementation-specific which ** events are automatically added to any Event Log. ** The OverflowFlag entry indicates the Event Log has overflowed. Events have ** been dropped or overwritten due to a table overflow. ** The OverflowAction entry indicates the behavior of the Event Log when an ** overflow occurs. ** The OverflowResetable entry indicates if the overflow flag can be ** cleared by an HPI User with the saHpiEventLogOverflowReset() function. */ typedef enum { SAHPI_EL_OVERFLOW_DROP, /* New entries are dropped when Event Log is full*/ SAHPI_EL_OVERFLOW_OVERWRITE, /* Event Log overwrites existing entries when Event Log is full */ SAHPI_EL_OVERFLOW_ACTION_MAX_TYPE = SAHPI_EL_OVERFLOW_OVERWRITE } SaHpiEventLogOverflowActionT; typedef struct { SaHpiUint32T Entries; SaHpiUint32T Size; SaHpiUint32T UserEventMaxSize; SaHpiTimeT UpdateTimestamp; SaHpiTimeT CurrentTime; SaHpiBoolT Enabled; SaHpiBoolT OverflowFlag; SaHpiBoolT OverflowResetable; SaHpiEventLogOverflowActionT OverflowAction; } SaHpiEventLogInfoT; /* ** Event Log Capabilities ** ** A value of the following type, SaHpiEventLogCapabilitiesT, is returned by ** the saHpiEventLogCapabilitiesGet() function. It is defined as a 32-bit ** value with individual bits representing various optional capabilities ** provided by specific event logs in an HPI implementation. A separate ** value is returned for each event log maintained by an HPI implementation, ** so different event logs may have different capabilities. ** ** For each bit value defined below, if the event log supports the ** corresponding capability, the bit is set to "1" in the value returned ** by saHpiEventLogCapabilitiesGet(). If the event log does not support the ** corresponding capability, the bit is set to "0". ** ** Future versions of the HPI specification may define additional event log ** capabilities and associate them with currently undefined bit positions ** in the SaHpiEventLogCapabilitiesT bit mask. Implementations conforming to ** this version of the HPI specification should set all undefined bit values ** to zero in the SaHpiEentLogCapabilitiesT value for all event logs. ** However, HPI Users should not assume undefined bit values are zero, to ** remain compatible with HPI implementations that implement future versions ** of the specification. ** ** ** The optional event log capabilities, and the corresponding bit values are: ** ** SAHPI_EVTLOG_CAPABILITY_ENTRY_ADD ** The saHpiEventLogEntryAdd() function may be used to add events to the ** event log. Note that this capability only addresses whether ** users can add entries directly to the event log via the ** saHpiEventLogEntryAdd() function. Even without this capability, user ** events added to a domain via the saHpiEventAdd() function may be added ** to an event log by the HPI implementation. ** SAHPI_EVTLOG_CAPABILITY_CLEAR ** The saHpiEventLogClear() function may be used to clear the event log. ** SAHPI_EVTLOG_CAPABILITY_TIME_SET ** The saHpiEventLogTimeSet() function may be used to set the event log ** clock. ** SAHPI_EVTLOG_CAPABILITY_STATE_SET ** The saHpiEventLogStateSet() function may be used to enable or disable ** automatic logging of events in the event log. ** SAHPI_EVTLOG_CAPABILITY_OVERFLOW_RESET ** The saHpiEventLogOverflowReset() function may be used to clear the ** OverflowFlag in the event log info record. ** */ typedef SaHpiUint32T SaHpiEventLogCapabilitiesT; #define SAHPI_EVTLOG_CAPABILITY_ENTRY_ADD (SaHpiEventLogCapabilitiesT)0x00000001 #define SAHPI_EVTLOG_CAPABILITY_CLEAR (SaHpiEventLogCapabilitiesT)0x00000002 #define SAHPI_EVTLOG_CAPABILITY_TIME_SET (SaHpiEventLogCapabilitiesT)0x00000004 #define SAHPI_EVTLOG_CAPABILITY_STATE_SET (SaHpiEventLogCapabilitiesT)0x00000008 #define SAHPI_EVTLOG_CAPABILITY_OVERFLOW_RESET \ (SaHpiEventLogCapabilitiesT)0x00000010 /* ** Event Log Entry ** These types define the Event Log entry. */ typedef SaHpiUint32T SaHpiEventLogEntryIdT; /* Reserved values for Event Log entry IDs */ #define SAHPI_OLDEST_ENTRY (SaHpiEventLogEntryIdT)0x00000000 #define SAHPI_NEWEST_ENTRY (SaHpiEventLogEntryIdT)0xFFFFFFFF #define SAHPI_NO_MORE_ENTRIES (SaHpiEventLogEntryIdT)0xFFFFFFFE typedef struct { SaHpiEventLogEntryIdT EntryId; /* Entry ID for record */ SaHpiTimeT Timestamp; /* Time at which the event was placed in the Event Log. If less than or equal to SAHPI_TIME_MAX_RELATIVE, then it is relative; if it is greater than SAHPI_TIME_ MAX_RELATIVE, then it is absolute. */ SaHpiEventT Event; /* Logged Event */ } SaHpiEventLogEntryT; /******************************************************************************* ******************************************************************************** ********** ********** ********** Initialization and Finalization ********** ********** ********** ******************************************************************************** *******************************************************************************/ /* ** Options are passed in using the following structure. The OptionId is set ** to the particular option, and IntVal and PointerVal are set based on the ** requirements of the particular option. See the specific options for details. */ typedef struct { SaHpiUint32T OptionId; union { SaHpiInt32T IntVal; void *PointerVal; } u; } SaHpiInitOptionT; /* ** An implementation may define OEM options. For an OEM option, OptionId ** must be greater than or equal to the following value: */ #define SA_HPI_INITOPTION_FIRST_OEM 0x40000000U /* ** Provide a function to create threads for the library. A library ** implementation may create threads for internal use; programs may need to ** monitor these threads or set their priority. This option allows the user ** to pass a function of type SaHpiCreateThreadFuncT with the PointerVal field; ** if this option is specified, the library will use only this function to create ** threads. ** ** When the function of type SaHpiCreateThreadFuncT is called, ** it should create a new thread, and from that thread, call the function ** specified by the StartFunction parameter, and providing in this call ** the FunctionData parameter. ** The return value of StartFunction is not used; it is provided only for ** compatibility with some operating systems. ** ** All threads will return when SaHpiShutdown() is called. Threads may return at ** any other time; this is not an error. ** ** This option cannot fail, so it has no error codes. */ #define SA_HPI_INITOPTION_HANDLE_CREATE_THREAD 1 typedef SaErrorT (*SaHpiCreateThreadFuncT)(void *(*StartFunction)(void *), void *FunctionData); /******************************************************************************* ** ** Name: saHpiVersionGet() ** ** Description: ** This function returns the version identifier of the SaHpi specification ** version supported by the HPI implementation. ** ** Parameters: ** None. ** ** Return Value: ** The interface version identifier, of type SaHpiVersionT is returned. ** ** Remarks: ** This function differs from all other interface functions in that it returns ** the version identifier rather than a standard return code. This is because ** the version itself is necessary in order for an HPI User to properly ** interpret subsequent API return codes. Thus, the saHpiVersionGet() ** function returns the interface version identifier unconditionally. ** ** This function returns the value of the header file symbol ** SAHPI_INTERFACE_VERSION in the SaHpi.h header file used when the library ** was compiled. An HPI User may compare the returned value to the ** SAHPI_INTERFACE_VERSION symbol in the SaHpi.h header file used by the ** calling program to determine if the accessed library is compatible with the ** calling program. ** *******************************************************************************/ SaHpiVersionT SAHPI_API saHpiVersionGet ( void ); /******************************************************************************* ** ** Name: saHpiInitialize() ** ** Description: ** This function allows an HPI User to initialize an HPI library. ** The usage of this function is not mandatory; however, if it is used, ** it must be invoked when the library is in an initial state, that is, before ** any other HPI function has been called or after saHpiFinalize() has been ** called. This function allows aspects of the HPI library to be controlled. ** The options themselves are defined in Section 8.29. ** ** Parameters: ** RequestedVersion – [in] The version of the specification to which the ** HPI User complies. ** NumOptions – [in] The number of options in the Options array. ** Options – [in/out] An array of option information. ** The user passes option-specified information in this field if the option ** requires it. If information is returned to the user, it is also done ** through this field. If no options are required or supplied, this ** parameter may be NULL. ** FailedOption – [out] If this function returns SA_ERR_HPI_INVALID_DATA, ** this parameter will be set to the index of the first invalid option. ** Passing in NULL is valid. In this case, the function will operate ** normally, but if the function returns SA_ERR_HPI_INVALID_DATA, the ** user will not know which option failed. ** OptionError – [out] If this function returns SA_ERR_HPI_INVALID_DATA, this ** parameter will be set to an option-specific error code. Passing in NULL ** is valid. In this case; the function will operate normally, but if the ** function returns SA_ERR_HPI_INVALID_DATA, the user will not know the ** specific reason for the failure. ** ** Return Value: ** SA_OK is returned on successful completion; otherwise, an error code is ** returned. ** SA_ERR_HPI_UNSUPPORTED_API is returned if the HPI Library does not ** support the RequestedVersion. ** SA_ERR_HPI_INVALID_PARAMS is returned if the Options array is passed in as ** NULL and NumOptions is not zero. ** SA_ERR_HPI_INVALID_DATA is returned if an option has an invalid OptionID, ** or if a parameter in an option is not valid. ** SA_ERR_HPI_INVALID_REQUEST is returned if the HPI library is not in initial ** state. ** ** Remarks: ** It is not mandatory for the HPI User to call this function before using the ** HPI library. If the function is not called, the library will make reasonable ** assumptions for the options available. ** ** If this function returns an error, the library’s state will not be modified. ** ** The FailedOption and OptionError parameters will be updated if the function ** returns SA_ERR_HPI_INVALID_PARAMS; otherwise, the library will not modify ** FailedOption or OptionError. This overrides the rule described in Section ** 4.3. ** ** The RequestedVersion parameter does not have to match the version returned ** by saHpiVersionGet(). Because all versions of the specification with the ** same compatibility level identifier are backward compatible, the ** RequestedVersion may be any earlier version of the specification with the ** same compatibility level, and the library shall accept the version. For ** example, if the library supports B.03.01, it shall accept users specifying ** a RequestedVersion of B.01.01 or B.02.01. ** ** An HPI implementation may accept a RequestedVersion that is not backward ** compatible with the version returned by saHpiVersionGet(). If the library ** does this, all API functions shall work as specified in the ** RequestedVersion, including semantics and data structure layout. Using API ** functions, constants, or semantics defined in versions later than the ** RequestedVersion may result in undefined behavior. ** *******************************************************************************/ SaErrorT SAHPI_API saHpiInitialize ( SAHPI_IN SaHpiVersionT RequestedVersion, SAHPI_IN SaHpiUint32T NumOptions, SAHPI_INOUT SaHpiInitOptionT *Options, SAHPI_OUT SaHpiUint32T *FailedOption, SAHPI_OUT SaErrorT *OptionError ); /******************************************************************************* ** ** Name: saHpiFinalize() ** ** Description: ** This function allows an HPI User to return the library to its initial state. ** ** Parameters: ** None. ** ** Return Value: ** SA_OK is returned on successful completion; otherwise, an error code is ** returned. ** SA_ERR_HPI_INVALID_REQUEST is returned if the HPI library is already in initial ** state. ** ** Remarks: ** Calling this function is not mandatory. The HPI User can just shut down without ** calling it. ** ** This function will return the library to the initial state at startup. ** All sessions will be closed by this function. ** *******************************************************************************/ SaErrorT SAHPI_API saHpiFinalize ( void ); /******************************************************************************* ** ** Name: saHpiSessionOpen() ** ** Description: ** This function opens an HPI session for a given domain and set of security ** characteristics (future). ** ** Parameters: ** DomainId - [in] Domain identifier of the domain to be accessed by the HPI ** User. A domain identifier of SAHPI_UNSPECIFIED_DOMAIN_ID requests that a ** session be opened to a default domain. ** SessionId - [out] Pointer to a location to store an identifier for the ** newly opened session. This identifier is used for subsequent access to ** domain resources and events. ** SecurityParams - [in] Pointer to security and permissions data structure. ** This parameter is reserved for future use, and must be set to NULL. ** ** Return Value: ** SA_OK is returned on successful completion; otherwise, an error code is ** returned. ** SA_ERR_HPI_INVALID_DOMAIN is returned if no domain matching the specified ** domain identifier exists. ** SA_ERR_HPI_INVALID_PARAMS is returned if: ** * A non-null SecurityParams pointer is passed. ** * The SessionId pointer is passed in as NULL. ** SA_ERR_HPI_OUT_OF_SPACE is returned if no more sessions can be opened. ** ** Remarks: ** None. ** *******************************************************************************/ SaErrorT SAHPI_API saHpiSessionOpen ( SAHPI_IN SaHpiDomainIdT DomainId, SAHPI_OUT SaHpiSessionIdT *SessionId, SAHPI_IN void *SecurityParams ); /******************************************************************************* ** ** Name: saHpiSessionClose() ** ** Description: ** This function closes an HPI session. After closing a session, the SessionId ** is no longer valid. ** ** Parameters: ** SessionId - [in] Session identifier previously obtained using ** saHpiSessionOpen(). ** ** Return Value: ** SA_OK is returned on successful completion; otherwise, an error code is ** returned. ** ** Remarks: ** None. ** *******************************************************************************/ SaErrorT SAHPI_API saHpiSessionClose ( SAHPI_IN SaHpiSessionIdT SessionId ); /******************************************************************************* ** ** Name: saHpiDiscover() ** ** Description: ** This function requests the HPI implementation service to update information ** about resources and domains that have recently been added to the system or ** removed from the system. This function also updates RPT entries for ** resources that have changed 'failed' status. ** ** An HPI implementation may exhibit latency between when ** hardware changes occur and when the domain DRT and RPT are updated. To ** overcome this latency, the saHpiDiscover() function may be called. When ** this function returns, the DRT and RPT should be updated to reflect the ** current system configuration and status. ** ** Parameters: ** SessionId - [in] Identifier for a session context previously obtained using ** saHpiSessionOpen(). ** ** Return Value: ** SA_OK is returned on successful completion; otherwise, an error code is ** returned. ** ** Remarks: ** The saHpiDiscover function is only meant to overcome latencies between ** actual hardware changes and the time it takes for them to get reflected ** into the DRT and RPT, and it should be used as such. ** ** It should be noted that the RPT is not dependent on the saHpiDiscover ** function to get populated and it is not required to call this function to ** discover Resources in a Domain after opening a Session. The HPI User is ** expected follow the procedure described in Section 3.5 - Discovery to ** gather information about the Domain after a Session has been opened. ** *******************************************************************************/ SaErrorT SAHPI_API saHpiDiscover ( SAHPI_IN SaHpiSessionIdT SessionId ); /******************************************************************************* ** ** Name: saHpiDomainInfoGet() ** ** Description: ** This function is used for requesting information about the domain, the ** Domain Reference Table (DRT), the Resource Presence Table (RPT), and the ** Domain Alarm Table (DAT), such as table update counters and timestamps, and ** the unique domain identifier associated with the domain. ** ** Parameters: ** SessionId - [in] Identifier for a session context previously obtained using ** saHpiSessionOpen(). ** DomainInfo - [out] Pointer to the information describing the domain and ** DRT. ** ** Return Value: ** SA_OK is returned on successful completion; otherwise, an error code is ** returned. ** SA_ERR_HPI_INVALID_PARAMS is returned if the DomainInfo pointer is passed ** in as NULL. ** ** Remarks: ** None. ** *******************************************************************************/ SaErrorT SAHPI_API saHpiDomainInfoGet ( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_OUT SaHpiDomainInfoT *DomainInfo ); /******************************************************************************* ** ** Name: saHpiDrtEntryGet() ** ** Description: ** This function retrieves domain information for the specified entry of the ** DRT. This function allows an HPI User to read the DRT entry-by-entry. ** ** Parameters: ** SessionId - [in] Identifier for a session context previously obtained using ** saHpiSessionOpen(). ** EntryId - [in] Identifier of the DRT entry to retrieve. Reserved EntryId ** values: ** * SAHPI_FIRST_ENTRY Get first entry ** * SAHPI_LAST_ENTRY Reserved as delimiter for end of list. Not a ** valid entry identifier. ** NextEntryId - [out] Pointer to location to store the EntryId of next entry ** in DRT. ** DrtEntry - [out] Pointer to the structure to hold the returned DRT entry. ** ** Return Value: ** SA_OK is returned on successful completion; otherwise, an error code is ** returned. ** SA_ERR_HPI_NOT_PRESENT is returned if the: ** * Entry identified by EntryId is not present. ** * EntryId is SAHPI_FIRST_ENTRY and the DRT is empty. ** SA_ERR_HPI_INVALID_PARAMS is returned if the: ** * DrtEntry pointer is passed in as NULL. ** * NextEntryId pointer is passed in as NULL. ** * EntryId is an invalid reserved value such as SAHPI_LAST_ENTRY. ** ** Remarks: ** If the EntryId parameter is set to SAHPI_FIRST_ENTRY, the first entry in ** the DRT is returned. When an entry is successfully retrieved, NextEntryId ** is set to the identifier of the next valid entry; however, when the last ** entry has been retrieved, NextEntryId is set to SAHPI_LAST_ENTRY. To ** retrieve an entire list of entries, call this function first with an ** EntryId of SAHPI_FIRST_ENTRY and then use the returned NextEntryId in the ** next call. Proceed until the NextEntryId returned is SAHPI_LAST_ENTRY. ** ** If an HPI User has not subscribed to receive events and a DRT entry is ** added while the DRT is being read, that new entry may be missed. The ** update counter provides a means for insuring that no domains are missed ** when stepping through the DRT. To use this feature, an HPI User should call ** saHpiDomainInfoGet() to get the update counter value before retrieving the ** first DRT entry. After reading the last entry, the HPI User should again ** call saHpiDomainInfoGet() to get the update counter value. If the update ** counter has not been incremented, no new entries have been added. ** *******************************************************************************/ SaErrorT SAHPI_API saHpiDrtEntryGet ( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiEntryIdT EntryId, SAHPI_OUT SaHpiEntryIdT *NextEntryId, SAHPI_OUT SaHpiDrtEntryT *DrtEntry ); /******************************************************************************* ** ** Name: saHpiDomainTagSet() ** ** Description: ** This function allows an HPI User to set a descriptive tag for a particular ** domain. The domain tag is an informational value that supplies an HPI User ** with naming information for the domain. ** ** Parameters: ** SessionId - [in] Identifier for a session context previously obtained using ** saHpiSessionOpen(). ** DomainTag - [in] Pointer to SaHpiTextBufferT containing the domain tag. ** ** Return Value: ** SA_OK is returned on successful completion; otherwise, an error code is ** returned. ** SA_ERR_HPI_INVALID_PARAMS is returned if the SaHpiTextBufferT structure ** passed as DomainTag is not valid. This would occur when: ** * The DataType is not one of the enumerated values for that type, or ** * The data field contains characters that are not legal according to ** the value of DataType, or ** * The Language is not one of the enumerated values for that type when ** the DataType is SAHPI_TL_TYPE_UNICODE or SAHPI_TL_TYPE_TEXT. ** SA_ERR_HPI_INVALID_PARAMS is returned if the DomainTag pointer is passed in ** as NULL. ** ** Remarks: ** The HPI implementation provides an appropriate default value for the domain ** tag; this function is provided so that an HPI User can override the ** default, if desired. The value of the domain tag may be retrieved from the ** domain's information structure. ** ** The domain tag is not necessarily persistent, and may return to its default ** value if the domain controller function for the domain restarts. ** *******************************************************************************/ SaErrorT SAHPI_API saHpiDomainTagSet ( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiTextBufferT *DomainTag ); /******************************************************************************* ** ** Name: saHpiRptEntryGet() ** ** Description: ** This function retrieves resource information for the specified entry of the ** resource presence table. This function allows an HPI User to read the RPT ** entry-by-entry. ** ** Parameters: ** SessionId - [in] Identifier for a session context previously obtained using ** saHpiSessionOpen(). ** EntryId - [in] Identifier of the RPT entry to retrieve. Reserved EntryId ** values: ** * SAHPI_FIRST_ENTRY Get first entry. ** * SAHPI_LAST_ENTRY Reserved as delimiter for end of list. Not a ** valid entry identifier. ** NextEntryId - [out] Pointer to location to store the EntryId of next entry ** in RPT. ** RptEntry - [out] Pointer to the structure to hold the returned RPT entry. ** ** Return Value: ** SA_OK is returned on successful completion; otherwise, an error code is ** returned. ** SA_ERR_HPI_NOT_PRESENT is returned when the: ** * Entry identified by EntryId is not present. ** * EntryId is SAHPI_FIRST_ENTRY and the RPT is empty. ** SA_ERR_HPI_INVALID_PARAMS is returned if the: ** * RptEntry pointer is passed in as NULL. ** * NextEntryId pointer is passed in as NULL. ** * EntryId is an invalid reserved value such as SAHPI_LAST_ENTRY. ** ** Remarks: ** If the EntryId parameter is set to SAHPI_FIRST_ENTRY, the first entry in ** the RPT is returned. When an entry is successfully retrieved, NextEntryId ** is set to the identifier of the next valid entry; however, when the last ** entry has been retrieved, NextEntryId is set to SAHPI_LAST_ENTRY. To ** retrieve an entire list of entries, call this function first with an ** EntryId of SAHPI_FIRST_ENTRY and then use the returned NextEntryId in the ** next call. Proceed until the NextEntryId returned is SAHPI_LAST_ENTRY. ** ** At initialization, an HPI User may not wish to receive HPI events, since ** the context of the events, as provided by the RPT, is not known. In this ** instance, if a FRU is inserted into the system while the RPT is being read ** entry by entry, the resource associated with that FRU may be missed. (Keep ** in mind that there is no specified ordering for the RPT entries.) The ** update counter provides a means for insuring that no resources are missed ** when stepping through the RPT. To use this feature, an HPI User should ** invoke saHpiDomainInfoGet(), and get the update counter value before ** retrieving the first RPT entry. After reading the last entry, an HPI User ** should again invoke the saHpiDomainInfoGet(). If the update counter has not ** changed, no new records have been added. ** *******************************************************************************/ SaErrorT SAHPI_API saHpiRptEntryGet ( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiEntryIdT EntryId, SAHPI_OUT SaHpiEntryIdT *NextEntryId, SAHPI_OUT SaHpiRptEntryT *RptEntry ); /******************************************************************************* ** ** Name: saHpiRptEntryGetByResourceId() ** ** Description: ** This function retrieves resource information from the resource presence ** table for the specified resource using its ResourceId. ** ** Parameters: ** SessionId - [in] Identifier for a session context previously obtained using ** saHpiSessionOpen(). ** ResourceId - [in] Resource identified for this operation. ** RptEntry - [out] Pointer to structure to hold the returned RPT entry. ** ** Return Value: ** SA_OK is returned on successful completion; otherwise, an error code is ** returned. ** SA_ERR_HPI_INVALID_PARAMS is returned if the RptEntry pointer is passed in ** as NULL. ** ** Remarks: ** Typically at start-up, the RPT is read entry-by-entry, using ** saHpiRptEntryGet(). From this, an HPI User can establish the set of ** ResourceIds to use for future calls to the HPI functions. ** ** However, there may be other ways of learning ResourceIds without first ** reading the RPT. For example, resources may be added to the domain while ** the system is running in response to a hot swap action. When a resource is ** added, the application receives a hot swap event containing the ResourceId ** of the new resource. The application may then want to search the RPT for ** more detailed information on the newly added resource. In this case, the ** ResourceId can be used to locate the applicable RPT entry information. ** ** Note that saHpiRptEntryGetByResourceId() is valid in any hot swap state, ** except for SAHPI_HS_STATE_NOT_PRESENT. ** *******************************************************************************/ SaErrorT SAHPI_API saHpiRptEntryGetByResourceId ( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId, SAHPI_OUT SaHpiRptEntryT *RptEntry ); /******************************************************************************* ** ** Name: saHpiResourceSeveritySet() ** ** Description: ** This function allows an HPI User to set the severity level applied to an ** event issued if a resource unexpectedly becomes unavailable to the HPI. A ** resource may become unavailable for several reasons including: ** The FRU associated with the resource is no longer present in the system (a ** surprise extraction has occurred.) ** A catastrophic failure has occurred. ** ** Parameters: ** SessionId - [in] Identifier for a session context previously obtained using ** saHpiSessionOpen(). ** ResourceId - [in] Resource identified for this operation. ** Severity - [in] Severity level of event issued when the resource ** unexpectedly becomes unavailable to the HPI. ** ** Return Value: ** SA_OK is returned on successful completion; otherwise, an error code is ** returned. ** SA_ERR_HPI_INVALID_PARAMS is returned when the value for Severity is not ** one of the valid enumerated values for this type, or it is equal to ** SAHPI_ALL_SEVERITIES. ** ** Remarks: ** Since the resource severity is contained within an RPT entry, its scope is ** limited to a single domain. A resource that exists in more than one domain ** has independent resource severity values within each domain. ** ** The HPI implementation provides a default value for the resource severity, ** which may vary by resource, when an RPT entry is added to a domain; an HPI ** User can override this default value by use of this function. ** ** If a resource is removed from, then re-added to the RPT (e.g., because of a ** hot swap action), the HPI implementation may reset the value of the ** resource severity. ** *******************************************************************************/ SaErrorT SAHPI_API saHpiResourceSeveritySet ( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId, SAHPI_IN SaHpiSeverityT Severity ); /******************************************************************************* ** ** Name: saHpiResourceTagSet() ** ** Description: ** This function allows an HPI User to set the resource tag of an RPT entry ** for a particular resource. ** ** Parameters: ** SessionId - [in] Identifier for a session context previously obtained using ** saHpiSessionOpen(). ** ResourceId - [in] Resource identified for this operation. ** ResourceTag - [in] Pointer to SaHpiTextBufferT containing the resource tag. ** ** Return Value: ** SA_OK is returned on successful completion; otherwise, an error code is ** returned. ** SA_ERR_HPI_INVALID_PARAMS is returned if the SaHpiTextBufferT structure ** passed as ResourceTag is not valid. This would occur when: ** * The DataType is not one of the enumerated values for that type, or ** * The data field contains characters that are not legal according to the ** value of DataType, or ** * The Language is not one of the enumerated values for that type when ** the DataType is SAHPI_TL_TYPE_UNICODE or SAHPI_TL_TYPE_TEXT. ** SA_ERR_HPI_INVALID_PARAMS is returned if the ResourceTag pointer is passed ** in as NULL. ** ** Remarks: ** The resource tag is a data field within an RPT entry available to an HPI ** User for associating application specific data with a resource. HPI User ** supplied data is purely informational and is not used by the HPI ** implementation, domain, or associated resource. For example, an HPI User ** can set the resource tag to a "descriptive" value, which can be used to ** identify the resource in messages to a human operator. ** ** Since the resource tag is contained within an RPT entry, its scope is ** limited to a single domain. A resource that exists in more than one domain ** has independent resource tags within each domain. ** ** The HPI implementation provides a default value for the resource tag when ** an RPT entry is added to a domain; this function is provided so that an HPI ** User can override the default, if desired. The value of the resource tag ** may be retrieved from the resource's RPT entry. ** ** If a resource is removed from, then re-added to the RPT (e.g., because of a ** hot swap action), the HPI implementation may reset the value of the ** resource tag. ** *******************************************************************************/ SaErrorT SAHPI_API saHpiResourceTagSet ( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId, SAHPI_IN SaHpiTextBufferT *ResourceTag ); /******************************************************************************* ** ** Name: saHpiMyEntityPathGet() ** ** Description: ** This function returns the EntityPath of the entity upon which the HPI User ** is running. ** ** Parameters: ** SessionId - [in] Identifier for a session context previously obtained using ** saHpiSessionOpen(). ** EntityPath – [out] Pointer to location to hold the returned EntityPath. ** ** Return Value: ** SA_OK is returned on successful completion; otherwise, an error code is ** returned. ** SA_ERR_HPI_INVALID_PARAMS is returned if the EntityPath pointer is passed ** in as NULL. ** SA_ERR_HPI_UNKNOWN is returned if the appropriate EntityPath to return ** cannot be determined. ** ** Remarks: ** To support user authentication, an HPI User must have an open session to ** call this function, but the entity path returned will be the same ** regardless of which domain is associated with the session. Thus, it is ** possible that the entity path returned may not be manageable through the ** domain associated with the passed SessionId. When there are multiple ** domains, an HPI User may call saHpiMyEntityPathGet() using a session open ** to any domain to get the entity path, then call saHpiGetIdByEntityPath() on ** all available domains to find management capabilities for that entity. ** *******************************************************************************/ SaErrorT SAHPI_API saHpiMyEntityPathGet ( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_OUT SaHpiEntityPathT *EntityPath ); /******************************************************************************* ** ** Name: saHpiResourceIdGet() ** ** Note: ** This function should not be used in new HPI User programs. ** The function saHpiMyEntityPathGet() should be used instead. ** ** Description: ** This function returns the ResourceId of the resource associated with the ** entity upon which the HPI User is running. ** ** Parameters: ** SessionId - [in] Identifier for a session context previously obtained using ** saHpiSessionOpen(). ** ResourceId - [out] Pointer to location to hold the returned ResourceId. ** ** Return Value: ** SA_OK is returned on successful completion; otherwise, an error code is ** returned. ** SA_ERR_HPI_INVALID_PARAMS is returned if the ResourceId pointer is passed ** in as NULL. ** SA_ERR_HPI_NOT_PRESENT is returned if the entity the HPI User is running on ** is not manageable in the addressed domain. ** SA_ERR_HPI_UNKNOWN is returned if the domain controller cannot determine an ** appropriate response. That is, there may be an appropriate ResourceId in ** the domain to return, but it cannot be determined. ** ** Remarks: ** This function must be issued within a session to a domain that includes a ** resource associated with the entity upon which the HPI User is running, or ** the SA_ERR_HPI_NOT_PRESENT return is issued. ** ** Since entities are contained within other entities, there may be multiple ** possible resources that could be returned to this call. For example, if ** there is a ResourceId associated with a particular compute blade upon which ** the HPI User is running, and another associated with the chassis which ** contains the compute blade, either could logically be returned as an ** indication of a resource associated with the entity upon which the HPI User ** was running. The function should return the ResourceId of the "smallest" ** resource that is associated with the HPI User. So, in the example above, ** the function should return the ResourceId of the compute blade. ** ** If there are multiple resources that could be returned, each with the same ** entity path, it is implementation specific which one is selected. However, ** in making the selection, the implementation should consider what management ** capabilities are associated with each resource. Preference may be given, ** for example, to a resource that provides a Watchdog Timer or managed hot ** swap capability for the entity, as these are capabilities that are likely ** to be of particular interest to HPI Users running on the entity itself. ** ** Once the function has returned the ResourceId, the HPI User may issue ** further HPI calls using that ResourceId to learn the type of resource that ** been identified. ** *******************************************************************************/ SaErrorT SAHPI_API saHpiResourceIdGet ( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_OUT SaHpiResourceIdT *ResourceId ); /******************************************************************************* ** ** Name: saHpiGetIdByEntityPath() ** ** Description: ** This function, given an entity path, retrieves the ResourceId of a Resource ** that provides management access to the indicated entity. It can also be ** used to find a management instrument (Sensor, Control, DIMI, FUMI, etc.) ** associated with the entity if the instrument type is provided. ** ** Parameters: ** SessionId - [in] Identifier for a session context previously obtained using ** saHpiSessionOpen(). ** EntityPath - [in] EntityPath of entity for which resources or management ** instruments are being searched. ** InstrumentType - [in] Type of management instrument to find. The instrument ** type is designated by setting this value to the corresponding RDR type. ** May be set to SAHPI_NO_RECORD, to search for resources that provide any ** management access to the entity. See Remarks for more information. ** InstanceId - [in/out] Pointer to the instance number of the resource or ** management instrument associated with the entity path to be returned. On ** return, this value is updated to the instance number of the next ** resource or management instrument associated with the entity path, or to ** SAHPI_LAST_ENTRY if there are no more. Reserved InstanceId values: ** SAHPI_FIRST_ENTRY Get first match that is associated with EntityPath and ** InstrumentType. ** SAHPI_LAST_ENTRY Reserved as delimiter for end of list. Not a valid entry ** identifier. ** ResourceId - [out] Pointer to a location to store the ResourceId of a ** resource found that provides management access to the designated entity. ** If InstrumentType is not SAHPI_NO_RECORD then a resource is selected ** only if it contains a management instrument of the appropriate type for ** the designated entity. ** InstrumentId - [out] Pointer to a location to store the Instrument Id ** (Sensor number, Control number, etc.) of a management instrument of the ** selected type that provides management access to the designated entity. ** Ignored if InstrumentType is SAHPI_NO_RECORD. ** RptUpdateCount - [out] Pointer to a location to store the current value of ** the RptUpdateCount field from the domain info data for the domain. This ** value is stored when the function returns either SA_OK or ** SA_ERR_HPI_NOT_PRESENT. ** ** Return Value: ** SA_OK is returned on successful completion; otherwise, an error code is ** returned. ** SA_ERR_HPI_INVALID_PARAMS is returned if the: ** * InstanceId pointer is passed in as NULL. ** * ResourceId pointer is passed in as NULL. ** * InstanceId points to an invalid reserved value such as ** SAHPI_LAST_ENTRY. ** * InstrumentId pointer is passed in as NULL and InstrumentType is not ** SAHPI_NO_RECORD. ** * RptUpdateCount pointer is passed in as NULL. ** SA_ERR_HPI_NOT_PRESENT is returned if there is not an appropriate ** ResourceId or InstrumentId that can be returned based on the passed ** input parameters. See Remarks for more information. ** ** Remarks: ** This function can be used two ways. ** If InstrumentType is set to SAHPI_NO_RECORD, then it returns the ResourceId ** of a resource that provides any management access to the requested entity. ** A resource provides management access to an entity if any management ** instrument contained in that resource is associated with the entity, or if ** the resource's other (non-management-instrument) capabilities are ** associated with the entity. In other words, given an entity path, a ** resource is found to provide management access to the entity if the entity ** path in the RPT entry for the resource matches, or if the entity path in ** any RDR contained in the resource matches. Entity paths must match ** exactly. ** ** If InstrumentType is set to indicate a particular type of management ** instrument, then the function returns both the ResourceId and InstrumentId ** (e.g., Sensor number, Control number, DIMI number, FUMI number, etc.) for a ** management instrument of the requested type that provides management access ** to the requested entity. Entity paths must match exactly. In this case, ** it only returns the ResourceId of a resource that has a management ** instrument of the requested type associated with the requested entity, and ** it may return the same ResourceId several times, each time with a different ** InstrumentId. ** ** For any entity, it is possible that there are multiple resources that ** provide management access, or that there are multiple management ** instruments of the requested type in one or more resources providing ** management access. To retrieve all appropriate ResourceId values or all ** appropriate ResourceId/InstrumentId pairs, multiple calls to ** saHpiGetIdByEntityPath() must be made. The first call should set ** InstanceId to SAHPI_FIRST_ENTRY. On subsequent calls, the InstanceId value ** set upon return can be passed as input on a subsequent call to get the next ** appropriate ResourceId or ResourceId/InstrumentId pair. When the last ** appropriate ResourceId or ResourceId/InstrumentId pair is returned, the ** returned InstanceId value is SAHPI_LAST_ENTRY. The order in which ** ResourceId or ResourceId/InstrumentId pairs are returned is implementation ** specific. ** ** It is possible that resources may be added to or removed from a domain ** between successive calls to this function. As a result, the InstanceId ** returned in a previous call to this function may become invalid. The ** RptUpdateCount is provided to notify the HPI User of this condition. The ** returned RptUpdateCount value should be checked against the last returned ** value every time this function is called with InstanceId other than ** SAHPI_FIRST_ENTRY. If it differs, then the RPT has been updated and the ** search should be restarted with InstanceId set to SAHPI_FIRST_ENTRY. The ** HPI User should also check RptUpdateCount when SA_ERR_HPI_NOT_PRESENT is ** returned while calling this function with InstanceId set to a value other ** than SAHPI_FIRST_ENTRY. If it has changed from the previous call, the ** error return is probably due to the change in the RPT, and the search ** process should be restarted. ** ** The values returned by this function for ResourceId, InstrumentId, and ** InstanceId are only valid if: ** a)the function was called with InstanceId equal to SAHPI_FIRST_ENTRY, or ** b)the function was called with InstanceId equal to the value returned by a ** previous call to the function on the same session, passing the same values ** for EntityPath and InstrumentType, and with the same value for ** RptUpdateCount returned on both calls. ** ** In all other cases, even if the function returns SA_OK, the values returned ** for ResourceId, InstrumentId, and InstanceId are not valid, and should be ** ignored. ** *******************************************************************************/ SaErrorT SAHPI_API saHpiGetIdByEntityPath ( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiEntityPathT EntityPath, SAHPI_IN SaHpiRdrTypeT InstrumentType, SAHPI_INOUT SaHpiUint32T *InstanceId, SAHPI_OUT SaHpiResourceIdT *ResourceId, SAHPI_OUT SaHpiInstrumentIdT *InstrumentId, SAHPI_OUT SaHpiUint32T *RptUpdateCount ); /******************************************************************************* ** ** Name: saHpiGetChildEntityPath() ** ** Description: ** This function retrieves entities that are contained within a given entity. ** The entity path of a containing entity ("parent") is passed to the function ** and the entity path of a contained entity ("child"), if available, is ** returned. ** ** Parameters: ** SessionId - [in] Identifier for a session context previously obtained using ** saHpiSessionOpen(). ** ParentEntityPath - [in] EntityPath of parent entity. ** InstanceId - [in/out] Pointer to the instance number of the child entity ** path to be returned. On return, this value is updated to the instance ** number of the next child entity path for the passed parent entity path, ** or to SAHPI_LAST_ENTRY if there are no more. Reserved InstanceId values: ** SAHPI_FIRST_ENTRY Get first child entity for entity described by ** ParentEntityPath. ** SAHPI_LAST_ENTRY Reserved as delimiter for end of list. Not a valid entry ** identifier. ** ChildEntityPath - [out] Pointer to the entity path of a child entity. ** RptUpdateCount - [out] Pointer to a location to store the current value of ** the RptUpdateCount field from the domain info data for the domain. This ** value is stored when the function returns SA_OK, ** SA_ERR_HPI_INVALID_DATA, or SA_ERR_HPI_NOT_PRESENT. ** ** Return Value: ** SA_OK is returned on successful completion; otherwise, an error code is ** returned. ** SA_ERR_HPI_INVALID_PARAMS is returned if the: ** * InstanceId pointer is passed in as NULL. ** * InstanceId points to an invalid reserved value such as ** SAHPI_LAST_ENTRY. ** * RptUpdateCount pointer is passed in as NULL. ** SA_ERR_HPI_INVALID_DATA is returned if the entity represented by ** ParentEntityPath is not present in the current Domain Entity Tree. ** SA_ERR_HPI_NOT_PRESENT is returned when: ** * InstanceId is SAHPI_FIRST_ENTRY and no child entity for entity ** described by ParentEntityPath is present. ** * InstanceId is not SAHPI_FIRST_ENTRY and no child entity ** corresponding to InstanceId for entity described by ** ParentEntityPath is present. ** ** Remarks: ** This function provides access to the Domain Entity Tree for the domain ** associated with the open SessionId. Passed an entity path that identifies ** a node in the Domain Entity Tree, the function returns entity paths that ** identify the immediate children of that node; that is, the entity paths for ** entities in the Domain Entity Tree that are immediately contained by the ** entity whose entity path was passed as ParentEntityPath. ** ** For any entity path, it is possible that there are multiple immediate ** children in the Domain Entity Tree. To retrieve the entity paths for all ** children or a particular ParentEntityPath, multiple calls to ** saHpiGetChildEntityPath() must be made. On each call, the InstanceId value ** set upon return can be passed as input on a subsequent call to get the ** entity path for the next child. When the entity path for the last child of ** the passed ParentEntityPath is returned, then InstanceId is set to ** SAHPI_LAST_ENTRY. The order in which ChildEntityPath values are returned ** is implementation specific. ** ** To retrieve the entire Domain Entity Tree, an HPI User can start by calling ** this function with an entity path containing only { { SAHPI_ROOT, 0 } } to ** retrieve children of the root node, then calling the function recursively ** for each of those children, and so forth. ** ** It is possible that resources may be added to or removed from a domain ** between successive calls to this function. As a result, the Domain Entity ** Tree may change, invalidating data previously returned. The RptUpdateCount ** is provided to notify the HPI User of this condition. The returned ** RptUpdateCount value should be checked against the last returned value ** every time this function is called with InstanceId other than ** SAHPI_FIRST_ENTRY. If it differs, then the RPT has been updated and the ** entire sequence of calls should be restarted. The HPI User should also ** check RptUpdateCount when SA_ERR_HPI_INVALID_DATA or SA_ERR_HPI_NOT_PRESENT ** is returned while calling this function with InstanceId set to a value ** other than SAHPI_FIRST_ENTRY. If it has changed from the previous call, ** the error return is probably due to the change in the RPT, and the search ** entire sequence of calls should be restarted. ** ** The values returned by this function for ChildEntityPath, and InstanceId ** are only valid if: ** a)the function was called with InstanceId equal to SAHPI_FIRST_ENTRY, or ** b)the function was called with InstanceId equal to the value returned by a ** previous call to the function on the same session, passing the same value ** for ParentEntityPath, and with the same value for RptUpdateCount returned ** on both calls. ** In all other cases, even if the function returns SA_OK, the values returned ** for ChildEntityPath and InstanceId are not valid, and should be ignored. ** *******************************************************************************/ SaErrorT SAHPI_API saHpiGetChildEntityPath ( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiEntityPathT ParentEntityPath, SAHPI_INOUT SaHpiUint32T *InstanceId, SAHPI_OUT SaHpiEntityPathT *ChildEntityPath, SAHPI_OUT SaHpiUint32T *RptUpdateCount ); /******************************************************************************* ** ** Name: saHpiResourceFailedRemove() ** ** Description: ** This function allows an HPI User to remove an RPT entry for a failed ** resource from the domain containing it. It can be used to remove the RPT ** entry for a failed resource associated with a FRU that is not functional or ** has lost management access. If the HPI User acquires knowledge that the FRU ** associated with such a resource has been physically removed, then this ** function provides the means to update the RPT so that it no longer contains ** an entry for that resource. ** ** Parameters: ** SessionId - [in] Identifier for a session context previously obtained using ** saHpiSessionOpen(). ** ResourceId - [in] Resource identified for this operation. ** ** Return value: ** SA_OK is returned on successful completion; otherwise, an error code is ** returned. ** SA_ERR_HPI_INVALID_PARAMS is returned if the ResourceId pointer is passed ** in as NULL. ** SA_ERR_HPI_NOT_PRESENT is returned if an entry for the resource identified ** by ResourceId is not present in the RPT. ** SA_ERR_HPI_INVALID_REQUEST is returned if the ResourceFailed flag in the ** resource's RPT entry is not set to True. ** SA_ERR_HPI_INVALID_CMD is returned if the resource is not associated with a ** FRU, as indicated by SAHPI_CAPABILITY_FRU in the ResourceCapabilities ** field of the resource's RPT entry. ** ** Remarks: ** This function can be used only on resources marked as inaccessible in the ** RPT. Resources that do not have the ResourceFailed flag in their RPT entry ** set to True cannot be removed by this function. For more information on ** failed resources, see Section 3.8. ** ** When the HPI User calls this function for a failed resource, the HPI ** implementation removes the RPT entry for the failed resource and issues an ** event. The event issued depends on whether the resource has the FRU ** capability set indicating that it provides hot swap management. If it is a ** FRU resource, a “user update” hot swap event is issued for transition of ** the resource to the SAHPI_HS_STATE_NOT_PRESENT state from its last known ** state. If it is not a FRU resource, a “Resource Removed” event is issued. ** ** If a FRU resource is removed as the result of an HPI User calling this ** function, any nested resources are also removed from the RPT, and ** appropriate events are issued for those nested resources. For more ** information on nested resources, see Section 3.3. ** *******************************************************************************/ SaErrorT SAHPI_API saHpiResourceFailedRemove ( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId ); /******************************************************************************* ** ** Name: saHpiEventLogInfoGet() ** ** Description: ** This function retrieves the current number of entries in the Event Log, ** total size of the Event Log, the time of the most recent update to the ** Event Log, the current value of the Event Log's clock (i.e., timestamp that ** would be placed on an entry at this moment), the enabled/disabled status of ** the Event Log (see Section 6.4.9), the overflow flag, and the action taken ** by the Event Log if an overflow occurs. ** ** Parameters: ** SessionId - [in] Identifier for a session context previously obtained using ** saHpiSessionOpen(). ** ResourceId - [in] Identifier for the Resource containing the Event Log. ** Set to SAHPI_UNSPECIFIED_RESOURCE_ID to address the Domain Event Log. ** Info - [out] Pointer to the returned Event Log information. ** ** Return Value: ** SA_OK is returned on successful completion; otherwise, an error code is ** returned. ** SA_ERR_HPI_CAPABILITY is returned if the resource does not have an Event ** Log capability (SAHPI_CAPABILITY_EVENT_LOG) set. Note this condition ** only applies to Resource Event Logs. Domain Event Logs are mandatory, ** and should not return this code. ** SA_ERR_HPI_INVALID_PARAMS is returned if the Info pointer is passed in as ** NULL. ** ** Remarks: ** The size field in the returned Event Log information indicates the maximum ** number of entries that can be held in the Event Log. This number should be ** constant for a particular Event Log. ** *******************************************************************************/ SaErrorT SAHPI_API saHpiEventLogInfoGet ( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId, SAHPI_OUT SaHpiEventLogInfoT *Info ); /******************************************************************************* ** ** Name: saHpiEventLogCapabilitiesGet() ** ** Description: ** This function retrieves a set of flags that indicate various optional ** capabilities that may be supported by the event log. ** ** Parameters: ** SessionId - [in] Identifier for a session context previously obtained using ** saHpiSessionOpen(). ** ResourceId - [in] Identifier for the Resource containing the Event Log. ** Set to SAHPI_UNSPECIFIED_RESOURCE_ID to address the Domain Event Log. ** EventLogCapabilities - [out] Pointer to a location to store the Event Log ** Capabilities value. ** ** Return Value: ** SA_OK is returned on successful completion; otherwise, an error code is ** returned. ** SA_ERR_HPI_CAPABILITY is returned if the resource does not have an Event ** Log capability (SAHPI_CAPABILITY_EVENT_LOG) set. Note this condition ** only applies to Resource Event Logs. Domain Event Logs are mandatory, ** and should not return this code. ** SA_ERR_HPI_INVALID_PARAMS is returned if the EventLogCapabilities pointer ** is passed in as NULL. ** ** Remarks: ** The SaHpiEventLogCapabilitiesT type is defined as an unsigned 32-bit value. ** Specific capabilities are defined as individual bits within this value. ** For each defined bit value that is set to a "1", the event log supports the ** corresponding capability. For each defined bit value that is set to a "0", ** the event log does not support the corresponding capability. Undefined ** bits in the capability value are reserved, and may be assigned to indicate ** support for other capabilities in future versions of the specification. ** See Section 8.28 for a definition of the event log capabilities and the ** corresponding bits in the returned EventLogCapabilities value that indicate ** support for each capability. ** ** For backwards compatibility with the B.01.01 specification, the "Overflow ** Resetable" capability, represented in the returned EventLogCapabilities ** value as SAHPI_EVTLOG_CAPABILITY_OVERFLOW_RESETABLE is also represented in ** the Event Log Info record returned by saHpiEventLogInfoGet() function, in ** the OverflowResetable Boolean field. These two items should agree for a ** particular event log. ** *******************************************************************************/ SaErrorT SAHPI_API saHpiEventLogCapabilitiesGet ( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId, SAHPI_OUT SaHpiEventLogCapabilitiesT *EventLogCapabilities ); /******************************************************************************* ** ** Name: saHpiEventLogEntryGet() ** ** Description: ** This function retrieves an Event Log entry. ** ** Parameters: ** SessionId - [in] Identifier for a session context previously obtained using ** saHpiSessionOpen(). ** ResourceId - [in] Identifier for the Resource containing the Event Log. ** Set to SAHPI_UNSPECIFIED_RESOURCE_ID to address the Domain Event Log. ** EntryId - [in] Identifier of event log entry to retrieve. Reserved values: ** * SAHPI_OLDEST_ENTRY Oldest entry in the Event Log. ** * SAHPI_NEWEST_ENTRY Newest entry in the Event Log. ** * SAHPI_NO_MORE_ENTRIES Not valid for this parameter. Used only when ** retrieving the next and previous EntryIds. ** PrevEntryId - [out] Event Log entry identifier for the previous (older ** adjacent) entry. Reserved values: ** * SAHPI_OLDEST_ENTRY Not valid for this parameter. Used only for the ** EntryId parameter. ** * SAHPI_NEWEST_ENTRY Not valid for this parameter. Used only for the ** EntryId parameter. ** * SAHPI_NO_MORE_ENTRIES No more entries in the Event Log before the one ** referenced by the EntryId parameter. ** NextEntryId - [out] Event Log entry identifier for the next (newer ** adjacent) entry. Reserved values: ** * SAHPI_OLDEST_ENTRY Not valid for this parameter. Used only for the ** EntryId parameter. ** * SAHPI_NEWEST_ENTRY Not valid for this parameter. Used only for the ** EntryId parameter. ** * SAHPI_NO_MORE_ENTRIES No more entries in the Event Log after the one ** referenced by the EntryId parameter. ** EventLogEntry - [out] Pointer to retrieved Event Log entry. ** Rdr - [in/out] Pointer to structure to receive resource data record ** associated with the Event Log entry, if available. If NULL, no RDR data ** is returned. ** RptEntry - [in/out] Pointer to structure to receive RPT entry associated ** with the Event Log entry, if available. If NULL, no RPT entry data is ** returned. ** ** Return Value: ** SA_OK is returned on successful completion; otherwise, an error code is ** returned. ** SA_ERR_HPI_CAPABILITY is returned if the resource does not have an Event ** Log capability (SAHPI_CAPABILITY_EVENT_LOG) set. Note this condition ** only applies to Resource Event Logs. Domain Event Logs are mandatory, ** and should not return this code. ** SA_ERR_HPI_NOT_PRESENT is returned when: ** * The Event Log has no entries. ** * The entry identified by EntryId is not present. ** SA_ERR_HPI_INVALID_PARAMS is returned when: ** Any of PrevEntryId, NextEntryId and EventLogEntry pointers are passed in ** as NULL. ** SAHPI_NO_MORE_ENTRIES is passed in to EntryId. ** ** Remarks: ** The special EntryIds SAHPI_OLDEST_ENTRY and SAHPI_NEWEST_ENTRY are used to ** select the oldest and newest entries, respectively, in the Event Log being ** read. A returned NextEntryId of SAHPI_NO_MORE_ENTRIES indicates that the ** newest entry has been returned; there are no more entries going forward ** (time-wise) in the Event Log. A returned PrevEntryId of ** SAHPI_NO_MORE_ENTRIES indicates that the oldest entry has been returned. ** ** To retrieve an entire list of entries going forward (oldest entry to newest ** entry) in the Event Log, call this function first with an EntryId of ** SAHPI_OLDEST_ENTRY and then use the returned NextEntryId as the EntryId in ** the next call. Proceed until the NextEntryId returned is ** SAHPI_NO_MORE_ENTRIES. ** ** To retrieve an entire list of entries going backward (newest entry to ** oldest entry) in the Event Log, call this function first with an EntryId of ** SAHPI_NEWEST_ENTRY and then use the returned PrevEntryId as the EntryId in ** the next call. Proceed until the PrevEntryId returned is ** SAHPI_NO_MORE_ENTRIES. ** ** Event Logs may include RPT entries and resource data records associated ** with the resource and Sensor issuing an event along with the basic event ** data in the Event Log. Because the system may be reconfigured after the ** event was entered in the Event Log, this stored information may be ** important to interpret the event. If the Event Log includes logged RPT ** entries and/or RDRs, and if an HPI User provides a pointer to a structure ** to receive this information, it is returned along with the Event Log entry. ** ** If an HPI User provides a pointer for an RPT entry, but the Event Log does ** not include a logged RPT entry for the Event Log entry being returned, ** RptEntry->ResourceCapabilities is set to zero. No valid RptEntry has a zero ** Capabilities field value. ** ** If an HPI User provides a pointer for an RDR, but the Event Log does not ** include a logged RDR for the Event Log entry being returned, Rdr->RdrType ** is set to SAHPI_NO_RECORD. ** ** The EntryIds returned via the PrevEntryId and NextEntryId parameters may ** not be in sequential order, but will reflect the previous and next entries ** in a chronological ordering of the Event Log, respectively. ** *******************************************************************************/ SaErrorT SAHPI_API saHpiEventLogEntryGet ( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId, SAHPI_IN SaHpiEventLogEntryIdT EntryId, SAHPI_OUT SaHpiEventLogEntryIdT *PrevEntryId, SAHPI_OUT SaHpiEventLogEntryIdT *NextEntryId, SAHPI_OUT SaHpiEventLogEntryT *EventLogEntry, SAHPI_INOUT SaHpiRdrT *Rdr, SAHPI_INOUT SaHpiRptEntryT *RptEntry ); /******************************************************************************* ** ** Name: saHpiEventLogEntryAdd() ** ** Description: ** This function enables an HPI user to add entries to the Event Log. ** ** Parameters: ** SessionId - [in] Identifier for a session context previously obtained using ** saHpiSessionOpen(). ** ResourceId - [in] Identifier for the Resource containing the Event Log. ** Set to SAHPI_UNSPECIFIED_RESOURCE_ID to address the Domain Event Log. ** EvtEntry - [in] Pointer to event data to write to the Event Log. The Event ** field must be of type SAHPI_ET_USER, and the Source field must be ** SAHPI_UNSPECIFIED_RESOURCE_ID. ** ** Return Value: ** SA_OK is returned if the event is successfully written in the Event Log; ** otherwise, an error code is returned. ** SA_ERR_HPI_CAPABILITY is returned if the resource does not have an Event ** Log capability (SAHPI_CAPABILITY_EVENT_LOG) set. Note this condition ** only applies to Resource Event Logs. Domain Event Logs are mandatory, ** and should not return this code. ** SA_ERR_HPI_INVALID_CMD is returned if the addressed event log does not ** support this function. ** SA_ERR_HPI_INVALID_DATA is returned if the event DataLength is larger than ** that supported by the implementation and reported in the Event Log info ** record. ** SA_ERR_HPI_INVALID_PARAMS is returned if the: ** * EvtEntry pointer is passed in as NULL. ** * Event structure passed via the EvtEntry parameter is not an event of ** type SAHPI_ET_USER with the Source field set to ** SAHPI_UNSPECIFIED_RESOURCE_ID. ** * Severity field within the EvtEntry parameter is not one of the valid ** enumerated values for this type, or it is equal to ** SAHPI_ALL_SEVERITIES. ** * SaHpiTextBufferT structure passed as part of the User Event structure ** is not valid. This would occur when: ** * The DataType is not one of the enumerated values ** for that type, or ** * The data field contains characters that are not legal according ** to the value of DataType, or ** * The Language is not one of the enumerated values for that type ** when the DataType is SAHPI_TL_TYPE_UNICODE or ** SAHPI_TL_TYPE_TEXT. ** SA_ERR_HPI_OUT_OF_SPACE is returned if the event cannot be written to the ** Event Log because the Event Log is full, and the Event Log ** OverflowAction is SAHPI_EL_OVERFLOW_DROP. ** ** Remarks: ** This function writes an event in the addressed Event Log. Nothing else is ** done with the event. ** ** If the Event Log is full, overflow processing occurs as defined by the ** Event Log's OverflowAction setting, reported in the Event Log info record. ** If, due to an overflow condition, the event is not written, or if existing ** events are overwritten, then the OverflowFlag in the Event Log info record ** is set to True, just as it would be if an internally generated event caused ** an overflow condition. If the Event Log's OverflowAction is ** SAHPI_EL_OVERFLOW_DROP, then an error is returned (SA_ERR_HPI_OUT_OF_SPACE) ** indicating that the saHpiEventLogEntryAdd() function did not add the event ** to the Event Log. If the Event Log's OverflowAction is ** SAHPI_EL_OVERFLOW_OVERWRITE, then the saHpiEventLogEntryAdd() function ** returns SA_OK, indicating that the event was added to the Event Log, even ** though an overflow occurred as a side-effect of this operation. The ** overflow may be detected by checking the OverflowFlag in the Event Log info ** record. ** ** Specific implementations of HPI may have restrictions on how much data may ** be passed to the saHpiEventLogEntryAdd() function. The Event Log info ** record reports the maximum DataLength that is supported by the Event Log ** for User Events. If saHpiEventLogEntryAdd() is called with a User Event ** that has a larger DataLength than is supported, the event is not added to ** the Event Log, and an error is returned. ** *******************************************************************************/ SaErrorT SAHPI_API saHpiEventLogEntryAdd ( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId, SAHPI_IN SaHpiEventT *EvtEntry ); /******************************************************************************* ** ** Name: saHpiEventLogClear() ** ** Description: ** This function erases the contents of the specified Event Log. ** ** Parameters: ** SessionId - [in] Identifier for a session context previously obtained using ** saHpiSessionOpen(). ** ResourceId - [in] Identifier for the Resource containing the Event Log. ** Set to SAHPI_UNSPECIFIED_RESOURCE_ID to address the Domain Event Log. ** ** Return Value: ** SA_OK is returned on successful completion; otherwise, an error code is ** returned. ** SA_ERR_HPI_CAPABILITY is returned if the resource does not have an Event ** Log capability (SAHPI_CAPABILITY_EVENT_LOG) set. Note this condition ** only applies to Resource Event Logs. Domain Event Logs are mandatory, ** and should not return this code. ** SA_ERR_HPI_INVALID_CMD is returned if the addressed event log does not ** support this function. ** ** Remarks: ** The OverflowFlag field in the Event Log info record is reset when the event ** log is cleared. ** *******************************************************************************/ SaErrorT SAHPI_API saHpiEventLogClear ( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId ); /******************************************************************************* ** ** Name: saHpiEventLogTimeGet() ** ** Description: ** This function retrieves the current time from the Event Log's clock. This ** clock is used to timestamp entries written into the Event Log. ** ** Parameters: ** SessionId - [in] Identifier for a session context previously obtained using ** saHpiSessionOpen(). ** ResourceId - [in] Identifier for the Resource containing the Event Log. ** Set to SAHPI_UNSPECIFIED_RESOURCE_ID to address the Domain Event Log. ** Time - [out] Pointer to the returned current Event Log time. ** ** Return Value: ** SA_OK is returned on successful completion; otherwise, an error code is ** returned. ** SA_ERR_HPI_CAPABILITY is returned if the resource does not have an Event ** Log capability (SAHPI_CAPABILITY_EVENT_LOG) set. Note this condition ** only applies to Resource Event Logs. Domain Event Logs are mandatory, ** and should not return this code. ** SA_ERR_HPI_INVALID_PARAMS is returned if the Time pointer is passed in as ** NULL. ** ** Remarks: ** If the implementation cannot supply an absolute time value, then it may ** supply a time relative to some system-defined epoch, such as system ** startup. If the time value is less than or equal to ** SAHPI_TIME_MAX_RELATIVE, then it is relative; if it is greater than ** SAHPI_TIME_MAX_RELATIVE, then it is absolute. The HPI implementation must ** provide valid timestamps for Event Log entries, using a default time base ** if no time has been set. Thus, the value SAHPI_TIME_UNSPECIFIED is never ** returned. ** *******************************************************************************/ SaErrorT SAHPI_API saHpiEventLogTimeGet ( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId, SAHPI_OUT SaHpiTimeT *Time ); /******************************************************************************* ** ** Name: saHpiEventLogTimeSet() ** ** Description: ** This function sets the Event Log's clock, which is used to timestamp events ** written into the Event Log. ** ** Parameters: ** SessionId - [in] Identifier for a session context previously obtained using ** saHpiSessionOpen(). ** ResourceId - [in] Identifier for the Resource containing the Event Log. ** Set to SAHPI_UNSPECIFIED_RESOURCE_ID to address the Domain Event Log. ** Time - [in] Time to which the Event Log clock should be set. ** ** Return Value: ** SA_OK is returned on successful completion; otherwise, an error code is ** returned. ** SA_ERR_HPI_CAPABILITY is returned if the resource does not have an Event ** Log capability (SAHPI_CAPABILITY_EVENT_LOG) set. Note this condition ** only applies to Resource Event Logs. Domain Event Logs are mandatory, ** and should not return this code. ** SA_ERR_HPI_INVALID_CMD is returned if the addressed event log does not ** support this function. ** SA_ERR_HPI_INVALID_PARAMS is returned when the Time parameter is set to ** SAHPI_TIME_UNSPECIFIED. ** For situations when the underlying implementation cannot represent a time ** value that is specified in Time, SA_ERR_HPI_INVALID_DATA is returned. ** ** Remarks: ** If the Time parameter value is less than or equal to ** SAHPI_TIME_MAX_RELATIVE, but not SAHPI_TIME_UNSPECIFIED, then it is ** relative; if it is greater than SAHPI_TIME_MAX_RELATIVE, then it is ** absolute. Setting this parameter to the value SAHPI_TIME_UNSPECIFIED is ** invalid and results in an error return code of SA_ERR_HPI_INVALID_PARAMS. ** ** Entries placed in the Event Log after this function is called will have ** Event Log timestamps (i.e., the Timestamp field in the SaHpiEventLogEntryT ** structure) based on the new time. Setting the clock does not affect ** existing Event Log entries. If the time is set to a relative time, ** subsequent entries placed in the Event Log will have an Event Log timestamp ** expressed as a relative time; if the time is set to an absolute time, ** subsequent entries will have an Event Log timestamp expressed as an ** absolute time. ** ** This function only sets the Event Log time clock and does not have any ** direct bearing on the timestamps placed on events (i.e., the Timestamp ** field in the SaHpiEventT structure), or the timestamps placed in the domain ** RPT info record. Setting the clocks used to generate timestamps other than ** Event Log timestamps is implementation-dependent, and should be documented ** by the HPI implementation provider. ** ** Some underlying implementations may not be able to handle the same relative ** and absolute time ranges, as those defined in HPI. Such limitations should ** be documented. When a time value is set in a region that is not supported ** by the implementation, an error code of SA_ERR_HPI_INVALID_DATA is ** returned. However, all HPI implementations must support setting the event ** log time to relative times in the range of 0 to the longest time since ** "startup" that is ever expected to be encountered and absolute times ** representing current time throughout the expected life of the system. See ** Section for more details on time ranges. ** *******************************************************************************/ SaErrorT SAHPI_API saHpiEventLogTimeSet ( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId, SAHPI_IN SaHpiTimeT Time ); /******************************************************************************* ** ** Name: saHpiEventLogStateGet() ** ** Description: ** This function enables an HPI User to get the Event Log state. ** ** Parameters: ** SessionId - [in] Identifier for a session context previously obtained using ** saHpiSessionOpen(). ** ResourceId - [in] Identifier for the Resource containing the Event Log. ** Set to SAHPI_UNSPECIFIED_RESOURCE_ID to address the Domain Event Log. ** EnableState - [out] Pointer to the current Event Log enable state. True ** indicates that the Event Log is enabled; False indicates that it is ** disabled. ** ** Return Value: ** SA_OK is returned on successful completion; otherwise, an error code is ** returned. ** SA_ERR_HPI_CAPABILITY is returned if the resource does not have an Event ** Log capability (SAHPI_CAPABILITY_EVENT_LOG) set. Note this condition ** only applies to Resource Event Logs. Domain Event Logs are mandatory, ** and should not return this code. ** SA_ERR_HPI_INVALID_PARAMS is returned if the EnableState pointer is passed ** in as NULL. ** ** Remarks: ** If the Event Log is disabled, no events generated within the HPI ** implementation are added to the Event Log. Events may still be added to the ** Event Log with the saHpiEventLogEntryAdd() function. When the Event Log is ** enabled, events may be automatically added to the Event Log as they are ** generated in a resource or a domain, however, it is implementation-specific ** which events are automatically added to any Event Log. ** *******************************************************************************/ SaErrorT SAHPI_API saHpiEventLogStateGet ( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId, SAHPI_OUT SaHpiBoolT *EnableState ); /******************************************************************************* ** ** Name: saHpiEventLogStateSet() ** ** Description: ** This function enables an HPI User to set the Event Log enabled state. ** ** Parameters: ** SessionId - [in] Identifier for a session context previously obtained using ** saHpiSessionOpen(). ** ResourceId - [in] Identifier for the Resource containing the Event Log. ** Set to SAHPI_UNSPECIFIED_RESOURCE_ID to address the Domain Event Log. ** EnableState - [in] Event Log state to be set. True indicates that the Event ** Log is to be enabled; False indicates that it is to be disabled. ** ** Return Value: ** SA_OK is returned on successful completion; otherwise, an error code is ** returned. ** SA_ERR_HPI_CAPABILITY is returned if the resource does not have an Event ** Log capability (SAHPI_CAPABILITY_EVENT_LOG) set. Note this condition ** only applies to Resource Event Logs. Domain Event Logs are mandatory, ** and should not return this code. ** SA_ERR_HPI_INVALID_CMD is returned if the addressed event log does not ** support this function. ** ** Remarks: ** If the Event Log is disabled no events generated within the HPI ** implementation are added to the Event Log. Events may still be added to the ** Event Log using the saHpiEventLogEntryAdd() function. When the Event Log is ** enabled events may be automatically added to the Event Log as they are ** generated in a resource or a domain. The actual set of events that are ** automatically added to any Event Log is implementation-specific. ** ** The HPI implementation provides an appropriate default value for this ** parameter, which may vary by resource. This function is provided so that an ** HPI User can override the default, if desired. ** ** If a resource hosting an Event Log is re-initialized (e.g., because of a ** hot swap action), the HPI implementation may reset the value of this ** parameter. ** *******************************************************************************/ SaErrorT SAHPI_API saHpiEventLogStateSet ( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId, SAHPI_IN SaHpiBoolT EnableState ); /******************************************************************************* ** ** Name: saHpiEventLogOverflowReset() ** ** Description: ** This function clears the OverflowFlag in the Event Log info record of the ** specified Event Log, that is it sets it to False. ** ** Parameters: ** SessionId - [in] Identifier for a session context previously obtained using ** saHpiSessionOpen(). ** ResourceId - [in] Identifier for the Resource containing the Event Log. ** Set to SAHPI_UNSPECIFIED_RESOURCE_ID to address the Domain Event Log. ** ** Return Value: ** SA_OK is returned on successful completion; otherwise, an error code is ** returned. ** SA_ERR_HPI_CAPABILITY is returned if the resource does not have an Event ** Log capability (SAHPI_CAPABILITY_EVENT_LOG) set. Note this condition ** only applies to Resource Event Logs. Domain Event Logs are mandatory, ** and should not return this code. ** SA_ERR_HPI_INVALID_CMD is returned if the addressed event log does not ** support this function. ** ** Remarks: ** The only effect of this function is to clear the OverflowFlag field in the ** Event Log info record for the specified Event Log, that is, to set it to ** False. If the Event Log is still full, the OverflowFlag will be set to ** True again as soon as another entry needs to be added to the Event Log. ** ** Some Event Log implementations may not allow resetting of the OverflowFlag ** except as a by-product of clearing the entire Event Log with the ** saHpiEventLogClear() function, or at all. Such an implementation returns ** the error code, SA_ERR_HPI_INVALID_CMD to this function. The ** OverflowResetable flag in the Event Log info record and the ** SAHPI_EVTLOG_CAPABILITY_OVERFLOW_RESETABLE bit in the value returned by ** saHpiEventLogCapabilitiesGet() indicate whether or not the implementation ** supports resetting the OverflowFlag with this function. ** *******************************************************************************/ SaErrorT SAHPI_API saHpiEventLogOverflowReset ( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId ); /******************************************************************************* ** ** Name: saHpiSubscribe() ** ** Description: ** This function allows an HPI User to subscribe for events. This single call ** provides subscription to all session events, regardless of event type or ** event severity. ** ** Parameters: ** SessionId - [in] Identifier for a session context previously obtained using ** saHpiSessionOpen(). ** ** Return Value: ** SA_OK is returned on successful completion; otherwise, an error code is ** returned. ** SA_ERR_HPI_DUPLICATE is returned when a subscription is already in place ** for this session. ** ** Remarks: ** Only one subscription is allowed per session, and additional subscribers ** receive an appropriate error code. No event filtering is done by the HPI ** implementation. ** *******************************************************************************/ SaErrorT SAHPI_API saHpiSubscribe ( SAHPI_IN SaHpiSessionIdT SessionId ); /******************************************************************************* ** ** Name: saHpiUnsubscribe() ** ** Description: ** This function removes the event subscription for the session. ** ** Parameters: ** SessionId - [in] Session for which event subscription is to be closed. ** ** Return Value: ** SA_OK is returned on successful completion; otherwise, an error code is ** returned. ** SA_ERR_HPI_INVALID_REQUEST is returned if the session is not currently ** subscribed for events. ** ** Remarks: ** After removal of a subscription, additional saHpiEventGet() calls are not ** allowed on the session unless an HPI User re-subscribes for events on the ** session first. Any events that are still in the event queue when this ** function is called are cleared from it. ** *******************************************************************************/ SaErrorT SAHPI_API saHpiUnsubscribe ( SAHPI_IN SaHpiSessionIdT SessionId ); /******************************************************************************* ** ** Name: saHpiEventGet() ** ** Description: ** This function allows an HPI User to get an event. This call is only valid ** within a session that has subscribed for events. ** ** Parameters: ** SessionId - [in] Identifier for a session context previously obtained using ** saHpiSessionOpen(). ** Timeout - [in] The number of nanoseconds to wait for an event to arrive. ** Reserved time out values: ** SAHPI_TIMEOUT_IMMEDIATE ** Time out immediately if there are no events available (non-blocking ** call). ** SAHPI_TIMEOUT_BLOCK ** Call should not return until an event is retrieved. ** Event - [out] Pointer to the next available event. ** Rdr - [in/out] Pointer to structure to receive the resource data associated ** with the event. If NULL, no RDR is returned. ** RptEntry - [in/out] Pointer to structure to receive the RPT entry ** associated with the resource that generated the event. If NULL, no RPT ** entry is returned. ** EventQueueStatus - [in/out] Pointer to location to store event queue ** status. If NULL, event queue status is not returned. ** ** Return Value: ** SA_OK is returned on successful completion; otherwise, an error code is ** returned. ** SA_ERR_HPI_INVALID_REQUEST is returned if an HPI User is not currently ** subscribed for events in this session. ** SA_ERR_HPI_INVALID_PARAMS is returned if the: ** * Event pointer is passed in as NULL. ** * Timeout parameter is not set to SAHPI_TIMEOUT_BLOCK, ** SAHPI_TIMEOUT_IMMEDIATE or a positive value. ** SA_ERR_HPI_TIMEOUT is returned if no event is available to return within ** the timeout period. If SAHPI_TIMEOUT_IMMEDIATE is passed in the Timeout ** parameter, this error return is used if there is no event queued when ** the function is called. ** ** Remarks: ** SaHpiEventGet()also returns an EventQueueStatus flag to an HPI User. This ** flag indicates whether or not a queue overflow has occurred. The overflow ** flag is set if any events were unable to be queued because of space ** limitations in the interface implementation. The overflow flag is reset ** whenever saHpiEventGet() is called. ** ** If there are one or more events on the event queue when this function is ** called, it immediately returns the next event on the queue. Otherwise, if ** the Timeout parameter is SAHPI_TIMEOUT_IMMEDIATE, it returns ** SA_ERR_HPI_TIMEOUT immediately. Otherwise, it blocks for the time ** specified by the timeout parameter; if an event is added to the queue ** within that time it is returned immediately when added; if not, ** saHpiEventGet() returns SA_ERR_HPI_TIMEOUT at the end of the timeout ** period. If the Timeout parameter is SAHPI_TIMEOUT_BLOCK, the ** saHpiEventGet()blocks indefinitely, until an event becomes available, and ** then returns that event. This provides for notification of events as they ** occur. ** ** If an HPI User provides a pointer for an RPT entry, but the event does not ** include a valid ResourceId for a resource in the domain, then the ** RptEntry->ResourceCapabilities field is set to zero. No valid RPT entry ** has a ResourceCapabilities field equal to zero. ** ** If an HPI User provides a pointer for an RDR, but there is no valid RDR ** associated with the event being returned, then the Rdr->RdrType field is ** set to SAHPI_NO_RECORD. RDRs should be returned for events associated with ** management instruments. Event types that are associated with management ** instruments are identified in Section 8.18. ** ** The timestamp reported in the returned event structure is the best ** approximation an implementation has to when the event actually occurred. ** The implementation may need to make an approximation (such as the time the ** event was placed on the event queue) because it may not have access to the ** actual time the event occurred. The value SAHPI_TIME_UNSPECIFIED indicates ** that the time of the event cannot be determined. ** ** If the implementation cannot supply an absolute timestamp, then it may ** supply a timestamp relative to some system-defined epoch, such as system ** startup. If the timestamp value is less than or equal to ** SAHPI_TIME_MAX_RELATIVE, but not SAHPI_TIME_UNSPECIFIED, then it is ** relative; if it is greater than SAHPI_TIME_MAX_RELATIVE, then it is ** absolute. ** ** If an HPI User passes a NULL pointer for the returned EventQueueStatus ** pointer, the event status is not returned, but the overflow flag, if set, ** is still reset. Thus, if an HPI User needs to know about event queue ** overflows, the EventQueueStatus parameter should never be NULL, and the ** overflow flag should be checked after every call to saHpiEventGet(). ** ** If saHpiEventGet() is called with a timeout value other than ** SAHPI_TIMEOUT_IMMEDIATE, and the session is subsequently closed from ** another thread, this function returns with SA_ERR_HPI_INVALID_SESSION. If ** saHpiEventGet() is called with a timeout value other than ** SAHPI_TIMEOUT_IMMEDIATE, and an HPI User subsequently calls ** saHpiUnsubscribe() from another thread, this function returns with ** SA_ERR_HPI_INVALID_REQUEST. ** *******************************************************************************/ SaErrorT SAHPI_API saHpiEventGet ( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiTimeoutT Timeout, SAHPI_OUT SaHpiEventT *Event, SAHPI_INOUT SaHpiRdrT *Rdr, SAHPI_INOUT SaHpiRptEntryT *RptEntry, SAHPI_INOUT SaHpiEvtQueueStatusT *EventQueueStatus ); /******************************************************************************* ** ** Name: saHpiEventAdd() ** ** Description: ** This function enables an HPI User to add events to the HPI domain ** identified by the SessionId. The domain controller processes an event ** added with this function as if the event originated from within the domain. ** The domain controller attempts to publish events to all active event ** subscribers and may attempt to log events in the Domain Event Log, if room ** is available. ** ** Parameters: ** SessionId - [in] Identifier for a session context previously obtained using ** saHpiSessionOpen(). ** EvtEntry - [in] Pointer to event to add to the domain. Event must be of ** type SAHPI_ET_USER, and the Source field must be ** SAHPI_UNSPECIFIED_RESOURCE_ID. ** ** Return Value: ** SA_OK is returned if the event is successfully added to the domain; ** otherwise, an error code is returned. ** SA_ERR_HPI_INVALID_PARAMS is returned if the: ** * EvtEntry parameter is NULL. ** * Event structure passed via the EvtEntry parameter is not an event of ** type SAHPI_ET_USER with the Source field being ** SAHPI_UNSPECIFIED_RESOURCE_ID. ** * Severity field within the EvtEntry parameter is not one of the valid ** enumerated values for this type, or it is equal to ** SAHPI_ALL_SEVERITIES. ** * SaHpiTextBufferT structure passed as part of the User Event structure ** is not valid. This would occur when: ** * The DataType is not one of the enumerated values ** for that type, or ** * The data field contains characters that are not legal according ** to the value of DataType, or ** * The Language is not one of the enumerated values for that type ** when the DataType is SAHPI_TL_TYPE_UNICODE or ** SAHPI_TL_TYPE_TEXT. ** SA_ERR_HPI_INVALID_DATA is returned if the event data does not meet ** implementation-specific restrictions on how much event data may be ** provided in a SAHPI_ET_USER event. ** ** Remarks: ** Specific implementations of HPI may have restrictions on how much data may ** be included in a SAHPI_ET_USER event. If more event data is provided than ** can be processed, an error is returned. The event data size restriction ** for the SAHPI_ET_USER event type is provided in the UserEventMaxSize field ** in the domain Event Log info structure. An HPI User should call the ** function saHpiEventLogInfoGet() to retrieve the Event Log info structure. ** ** The domain controller attempts to publish the event to all sessions within ** the domain with active event subscriptions; however, a session's event ** queue may overflow due to the addition of the new event. ** ** The domain controller may attempt to log the event in the Domain Event Log; ** however, because it is implementation-specific what events are added to ** event logs, the domain controller is not required to add the event to the ** Domain Event Log. Also, an attempt to add the event to the Domain Event ** Log may fail if the log overflows. ** *******************************************************************************/ SaErrorT SAHPI_API saHpiEventAdd ( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiEventT *EvtEntry ); /******************************************************************************* ** ** Name: saHpiAlarmGetNext() ** ** Description: ** This function allows retrieval of an alarm from the current set of alarms ** held in the Domain Alarm Table (DAT). ** ** Parameters: ** SessionId - [in] Identifier for a session context previously obtained using ** saHpiSessionOpen(). ** Severity - [in] Severity level of alarms to retrieve. Set to ** SAHPI_ALL_SEVERITIES to retrieve alarms of any severity; otherwise, set ** to requested severity level. ** UnacknowledgedOnly - [in] Set to True to indicate only unacknowledged ** alarms should be returned. Set to False to indicate either an ** acknowledged or unacknowledged alarm may be returned. ** Alarm - [in/out] Pointer to the structure to hold the returned alarm entry. ** Also, on input, Alarm->AlarmId and Alarm->Timestamp are used to identify ** the previous alarm. ** ** Return Value: ** SA_OK is returned on successful completion; otherwise, an error code is ** returned. ** SA_ERR_HPI_INVALID_PARAMS is returned when: ** * Severity is not one of the valid enumerated values for this type. ** * The Alarm parameter is passed in as NULL. ** SA_ERR_HPI_NOT_PRESENT is returned: ** * If there are no additional alarms in the DAT that meet the criteria ** specified by the Severity and UnacknowledgedOnly parameters. ** * If the passed Alarm->AlarmId field was set to SAHPI_FIRST_ENTRY and ** there are no alarms in the DAT that meet the criteria specified by ** the Severity and UnacknowledgedOnly parameters. ** SA_ERR_HPI_INVALID_DATA is returned if the passed Alarm->AlarmId matches an ** alarm in the DAT, but the passed Alarm->Timestamp does not match the ** timestamp of that alarm. ** ** Remarks: ** All alarms contained in the DAT are maintained in the order in which they ** were added. This function returns the next alarm meeting the ** specifications given by an HPI User that was added to the DAT after the ** alarm whose AlarmId and Timestamp is passed by an HPI User, even if the ** alarm associated with the AlarmId and Timestamp has been deleted. If ** SAHPI_FIRST_ENTRY is passed as the AlarmId, the first alarm in the DAT ** meeting the specifications given by an HPI User is returned. ** ** Alarm selection can be restricted to only alarms of a specified severity, ** and/or only unacknowledged alarms. ** ** To retrieve all alarms contained within the DAT meeting specific ** requirements, call saHpiAlarmGetNext() with the Alarm->AlarmId field set to ** SAHPI_FIRST_ENTRY and the Severity and UnacknowledgedOnly parameters set to ** select what alarms should be returned. Then, repeatedly call ** saHpiAlarmGetNext() passing the previously returned alarm as the Alarm ** parameter, and the same values for Severity and UnacknowledgedOnly until ** the function returns with the error code SA_ERR_HPI_NOT_PRESENT. ** ** SAHPI_FIRST_ENTRY and SAHPI_LAST_ENTRY are reserved AlarmId values, and are ** never assigned to an alarm in the DAT. ** ** The elements AlarmId and Timestamp are used in the Alarm parameter to ** identify the previous alarm; the next alarm added to the table after this ** alarm that meets the Severity and UnacknowledgedOnly requirements is ** returned. Alarm->AlarmId may be set to SAHPI_FIRST_ENTRY to select the ** first alarm in the DAT meeting the Severity and UnacknowledgedOnly ** requirements. If Alarm->AlarmId is SAHPI_FIRST_ENTRY, then ** Alarm->Timestamp is ignored. ** *******************************************************************************/ SaErrorT SAHPI_API saHpiAlarmGetNext( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiSeverityT Severity, SAHPI_IN SaHpiBoolT UnacknowledgedOnly, SAHPI_INOUT SaHpiAlarmT *Alarm ); /******************************************************************************* ** ** Name: saHpiAlarmGet() ** ** Description: ** This function allows retrieval of a specific alarm in the Domain Alarm ** Table (DAT) by referencing its AlarmId. ** ** Parameters: ** SessionId - [in] Identifier for a session context previously obtained using ** saHpiSessionOpen(). ** AlarmId - [in] AlarmId of the alarm to be retrieved from the DAT. ** Alarm - [out] Pointer to the structure to hold the returned alarm entry. ** ** Return Value: ** SA_OK is returned on successful completion; otherwise, an error code is ** returned. ** SA_ERR_HPI_NOT_PRESENT is returned if the requested AlarmId does not ** correspond to an alarm contained in the DAT. ** SA_ERR_HPI_INVALID_PARAMS is returned if: ** * The Alarm parameter is passed in as NULL. ** * The AlarmId parameter passed is SAHPI_FIRST_ENTRY or SAHPI_LAST_ENTRY. ** ** Remarks: ** SAHPI_FIRST_ENTRY and SAHPI_LAST_ENTRY are reserved AlarmId values, and are ** never assigned to an alarm in the DAT. ** *******************************************************************************/ SaErrorT SAHPI_API saHpiAlarmGet( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiAlarmIdT AlarmId, SAHPI_OUT SaHpiAlarmT *Alarm ); /******************************************************************************* ** ** Name: saHpiAlarmAcknowledge() ** ** Description: ** This function allows an HPI User to acknowledge a single alarm entry or a ** group of alarm entries by severity. ** ** Parameters: ** SessionId - [in] Identifier for a session context previously obtained using ** saHpiSessionOpen(). ** AlarmId - [in] Identifier of the alarm to be acknowledged. Reserved ** AlarmId values: ** * SAHPI_ENTRY_UNSPECIFIED Ignore this parameter. ** Severity - [in] Severity level of alarms to acknowledge. Ignored unless ** AlarmId is SAHPI_ENTRY_UNSPECIFIED. ** ** Return Value: ** SA_OK is returned on successful completion; otherwise, an error code is ** returned. ** SA_ERR_HPI_NOT_PRESENT is returned if an alarm entry identified by the ** AlarmId parameter does not exist in the DAT. ** SA_ERR_HPI_INVALID_PARAMS is returned if AlarmId is SAHPI_ENTRY_UNSPECIFIED ** and Severity is not one of the valid enumerated values for this type. ** ** Remarks: ** An HPI User acknowledges an alarm to indicate that it is aware of the alarm ** and to influence platform-specific alarm annunciation that may be provided ** by the implementation. Typically, an implementation ignores acknowledged ** alarms when announcing an alarm on annunciation devices such as audible ** sirens and dry contact closures. However, alarm annunciation is ** implementation-specific. ** ** An acknowledged alarm has the Acknowledged field in the alarm entry set to ** True. ** ** Alarms are acknowledged one of two ways: a single alarm entry by AlarmId ** regardless of severity or a group of alarm entries by Severity regardless ** of AlarmId. ** ** To acknowledge all alarms contained within the DAT, set the Severity ** parameter to SAHPI_ALL_SEVERITIES, and set the AlarmId parameter to ** SAHPI_ENTRY_UNSPECIFIED. ** ** To acknowledge all alarms of a specific severity contained within the DAT, ** set the Severity parameter to the appropriate value, and set the AlarmId ** parameter to SAHPI_ENTRY_UNSPECIFIED. ** ** To acknowledge a single alarm entry, set the AlarmId parameter to a value ** other than SAHPI_ENTRY_UNSPECIFIED. The AlarmId must be a valid identifier ** for an alarm entry present in the DAT at the time of the function call. ** ** If an alarm has been previously acknowledged, acknowledging it again has no ** effect. However, this is not an error. ** ** If the AlarmId parameter has a value other than SAHPI_ENTRY_UNSPECIFIED, ** the Severity parameter is ignored. ** ** If the AlarmId parameter is passed as SAHPI_ENTRY_UNSPECIFIED, and no ** alarms are present that meet the requested Severity, this function has no ** effect. However, this is not an error. ** ** SAHPI_ENTRY_UNSPECIFIED is defined as the same value as SAHPI_FIRST_ENTRY, ** so using either symbol has the same effect. However, ** SAHPI_ENTRY_UNSPECIFIED should be used with this function for clarity. ** *******************************************************************************/ SaErrorT SAHPI_API saHpiAlarmAcknowledge( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiAlarmIdT AlarmId, SAHPI_IN SaHpiSeverityT Severity ); /******************************************************************************* ** ** Name: saHpiAlarmAdd() ** ** Description: ** This function is used to add a User Alarm to the DAT. ** ** Parameters: ** SessionId - [in] Identifier for a session context previously obtained using ** saHpiSessionOpen(). ** Alarm- [in/out] Pointer to the alarm entry structure that contains the new ** User Alarm to add to the DAT. ** ** Return Value: ** SA_OK is returned on successful completion; otherwise, an error code is ** returned. ** SA_ERR_HPI_INVALID_PARAMS is returned if the: ** * Alarm pointer is passed in as NULL. ** * Alarm->Severity is not one of the following enumerated values: ** SAHPI_MINOR, SAHPI_MAJOR, or SAHPI_CRITICAL. ** * Alarm->AlarmCond.Type is not SAHPI_STATUS_COND_TYPE_USER. ** * SaHpiTextBufferT structure passed as part of the Alarm structure is ** not valid. This would occur when: ** * The DataType is not one of the enumerated values for that type, or ** * The data field contains characters that are not legal according to ** the value of DataType, or ** * The Language is not one of the enumerated values for that type when ** the DataType is SAHPI_TL_TYPE_UNICODE or SAHPI_TL_TYPE_TEXT. ** SA_ERR_HPI_OUT_OF_SPACE is returned if the DAT is not able to add an ** additional User Alarm due to space limits or limits imposed on the ** number of User Alarms permitted in the DAT. ** ** Remarks: ** The AlarmId, and Timestamp fields within the Alarm parameter are not used ** by this function. Instead, on successful completion, these fields are set ** to new values associated with the added alarm. ** *******************************************************************************/ SaErrorT SAHPI_API saHpiAlarmAdd( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_INOUT SaHpiAlarmT *Alarm ); /******************************************************************************* ** ** Name: saHpiAlarmDelete() ** ** Description: ** This function allows an HPI User to delete a single User Alarm or a group ** of User Alarms from the DAT. Alarms may be deleted individually by ** specifying a specific AlarmId, or they may be deleted as a group by ** specifying a Severity. ** ** Parameters: ** SessionId - [in] Identifier for a session context previously obtained using ** saHpiSessionOpen(). ** AlarmId - [in] Alarm identifier of the alarm entry to delete. Reserved ** values: ** * SAHPI_ENTRY_UNSPECIFIED Ignore this parameter. ** Severity - [in] Severity level of alarms to delete. Ignored unless AlarmId ** is SAHPI_ENTRY_UNSPECIFIED. ** ** Return Value: ** SA_OK is returned on successful completion; otherwise, an error code is ** returned. ** SA_ERR_HPI_INVALID_PARAMS is returned if AlarmId is SAHPI_ENTRY_UNSPECIFIED ** and Severity is not one of the valid enumerated values for this type. ** SA_ERR_HPI_NOT_PRESENT is returned if an alarm entry identified by the ** AlarmId parameter does not exist in the DAT. ** SA_ERR_HPI_READ_ONLY is returned if the AlarmId parameter indicates a ** non-User Alarm. ** ** Remarks: ** Only User Alarms added to the DAT can be deleted. When deleting alarms by ** severity, only User Alarms of the requested severity are deleted. ** ** To delete a single, specific alarm, set the AlarmId parameter to a value ** representing an actual User Alarm in the DAT. The Severity parameter is ** ignored when the AlarmId parameter is set to a value other than ** SAHPI_ENTRY_UNSPECIFIED. ** ** To delete a group of User Alarms, set the AlarmId parameter to ** SAHPI_ENTRY_UNSPECIFIED, and set the Severity parameter to identify which ** severity of alarms should be deleted. To clear all User Alarms contained ** within the DAT, set the Severity parameter to SAHPI_ALL_SEVERITIES. ** ** If the AlarmId parameter is passed as SAHPI_ENTRY_UNSPECIFIED, and no User ** Alarms are present that meet the specified Severity, this function has no ** effect. However, this is not an error. ** ** SAHPI_ENTRY_UNSPECIFIED is defined as the same value as SAHPI_FIRST_ENTRY, ** so using either symbol has the same effect. However, ** SAHPI_ENTRY_UNSPECIFIED should be used with this function for clarity. ** *******************************************************************************/ SaErrorT SAHPI_API saHpiAlarmDelete( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiAlarmIdT AlarmId, SAHPI_IN SaHpiSeverityT Severity ); /******************************************************************************* ** ** Name: saHpiRdrGet() ** ** Description: ** This function returns a resource data record from the addressed resource. ** ** Parameters: ** SessionId - [in] Identifier for a session context previously obtained using ** saHpiSessionOpen(). ** ResourceId - [in] Resource identified for this operation. ** EntryId - [in] Identifier of the RDR entry to retrieve. Reserved EntryId ** values: ** * SAHPI_FIRST_ENTRY Get first entry. ** * SAHPI_LAST_ENTRY Reserved as delimiter for end of list. Not a ** valid entry identifier. ** NextEntryId - [out] Pointer to location to store EntryId of next entry in ** RDR repository. ** Rdr - [out] Pointer to the structure to receive the requested resource data ** record. ** ** Return Value: ** SA_OK is returned on successful completion; otherwise, an error code is ** returned. ** SA_ERR_HPI_CAPABILITY is returned if the resource contains no RDR records ** (and thus does not have the SAHPI_CAPABILITY_RDR flag set in its RPT ** entry). ** SA_ERR_HPI_NOT_PRESENT is returned if an EntryId (other than ** SAHPI_FIRST_ENTRY) is passed that does not correspond to an actual ** EntryId in the resource's RDR repository. ** SA_ERR_HPI_INVALID_PARAMS is returned if: ** * SAHPI_LAST_ENTRY is passed in to EntryId. ** * NextEntryId pointer is passed in as NULL. ** * Rdr pointer is passed in as NULL. ** ** Remarks: ** Submitting an EntryId of SAHPI_FIRST_ENTRY results in the first RDR being ** read. A returned NextEntryId of SAHPI_LAST_ENTRY indicates the last RDR has ** been returned. A successful retrieval includes the next valid EntryId. To ** retrieve the entire list of RDRs, call this function first with an EntryId ** of SAHPI_FIRST_ENTRY and then use the returned NextEntryId in the next ** call. Proceed until the NextEntryId returned is SAHPI_LAST_ENTRY. ** ** If the resource configuration changes, and a "Resource Updated" event is ** issued, the contents of the RDR repository can change. If this happens ** while an HPI User is reading the repository with this function, ** inconsistent data may be read. To protect against this, an HPI User may ** examine the RDR update counter before and after reading the RDR repository ** to make sure no configuration change occurred while the repository was ** being read. ** *******************************************************************************/ SaErrorT SAHPI_API saHpiRdrGet ( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId, SAHPI_IN SaHpiEntryIdT EntryId, SAHPI_OUT SaHpiEntryIdT *NextEntryId, SAHPI_OUT SaHpiRdrT *Rdr ); /******************************************************************************* ** ** Name: saHpiRdrGetByInstrumentId() ** ** Description: ** This function returns the Resource Data Record (RDR) for a specific ** management instrument hosted by the addressed resource. ** ** Parameters: ** SessionId - [in] Identifier for a session context previously obtained using ** saHpiSessionOpen(). ** ResourceId - [in] Resource identified for this operation. ** RdrType - [in] Type of RDR being requested. ** InstrumentId - [in] Instrument number identifying the specific RDR to be ** returned. This is a Sensor number, Control number, Watchdog Timer ** number, IDR number, Annunciator number, FUMI number, or DIMI number ** depending on the value of the RdrType parameter. ** Rdr - [out] Pointer to the structure to receive the requested RDR. ** ** Return Value: ** SA_OK is returned on successful completion; otherwise, an error code is ** returned. ** SA_ERR_HPI_CAPABILITY is returned if the: ** * Resource contains no RDR records (and thus does not have the ** SAHPI_CAPABILITY_RDR flag set in its RPT entry). ** * Type of management instrument specified in the RdrType parameter is ** not supported by the resource, as indicated by the Capability field ** in its RPT entry. ** SA_ERR_HPI_NOT_PRESENT is returned if the specific management instrument ** identified in the InstrumentId parameter is not present in the addressed ** resource. ** SA_ERR_HPI_INVALID_PARAMS is returned when the: ** * RdrType parameter is not a valid enumerated value for the type. ** * RdrType is SAHPI_NO_RECORD. ** * Rdr pointer is passed in as NULL. ** ** Remarks: ** The RDR to be returned is identified by RdrType and InstrumentId for the ** specific management instrument for the RDR being requested. ** *******************************************************************************/ SaErrorT SAHPI_API saHpiRdrGetByInstrumentId ( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId, SAHPI_IN SaHpiRdrTypeT RdrType, SAHPI_IN SaHpiInstrumentIdT InstrumentId, SAHPI_OUT SaHpiRdrT *Rdr ); /******************************************************************************* ** ** Name: saHpiRdrUpdateCountGet() ** ** Description: ** This function returns an update counter for the resource data records for ** the addressed resource. ** ** Parameters: ** SessionId - [in] Identifier for a session context previously obtained using ** saHpiSessionOpen(). ** ResourceId - [in] Resource identified for this operation. ** UpdateCount – [out] Pointer to the update counter. ** ** Return Value: ** SA_OK is returned on successful completion; otherwise, an error code is ** returned. ** SA_ERR_HPI_CAPABILITY is returned if the resource contains no RDR records ** (and thus does not have the SAHPI_CAPABILITY_RDR flag set in its RPT ** entry). ** SA_ERR_HPI_INVALID_RESOURCE is returned if the specified resource does not ** exist. ** ** Remarks: ** This function provides a mechanism for the user to detect updates of the ** RDR for a resource. This can happen while the user is reading the RDRs. ** To protect against these updates, an HPI User may use this function before ** and after reading the RDR repository to make sure no configuration change ** occurred while the repository was being read. An HPI user may also use this ** function after receiving a "Resource Updated" or "Resource Restored" event ** to detect whether the RDR repository has changed. ** ** There is no significance attached to the value of the RDR update counter, ** except that it must change any time the RDR data for a resource is updated ** and should remain constant when no changes are made to the RDR data. ** *******************************************************************************/ SaErrorT SAHPI_API saHpiRdrUpdateCountGet ( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId, SAHPI_OUT SaHpiUint32T *UpdateCount ); /******************************************************************************* ** ** Name: saHpiSensorReadingGet() ** ** Description: ** This function is used to retrieve a Sensor reading. ** ** Parameters: ** SessionId - [in] Identifier for a session context previously obtained using ** saHpiSessionOpen(). ** ResourceId - [in] Resource identified for this operation. ** SensorNum - [in] Sensor number for which the Sensor reading is being ** retrieved. ** Reading - [in/out] Pointer to a structure to receive Sensor reading values. ** If NULL, the Sensor reading value is not returned. ** EventState - [in/out] Pointer to location to receive Sensor event states. ** If NULL, the Sensor event states is not returned. ** ** Return Value: ** SA_OK is returned on successful completion; otherwise, an error code is ** returned. ** SA_ERR_HPI_CAPABILITY is returned if the resource does not support Sensors, ** as indicated by SAHPI_CAPABILITY_SENSOR in the resource's RPT entry. ** SA_ERR_HPI_INVALID_REQUEST is returned if the Sensor is currently disabled. ** SA_ERR_HPI_NOT_PRESENT is returned if the Sensor is not present. ** ** Remarks: ** For Sensors that return a type of SAHPI_SENSOR_READING_TYPE_BUFFER, the ** format of the returned data buffer is implementation-specific. ** ** If the Sensor does not provide a reading, the Reading structure returned by ** the saHpiSensorReadingGet() function indicates the reading is not supported ** by setting the IsSupported flag to False. ** ** If the Sensor does not support any event states, a value of 0x0000 is ** returned for the EventState value. This is indistinguishable from the ** return for a Sensor that does support event states, but currently has no ** event states asserted. The Sensor RDR Events field can be examined to ** determine if the Sensor supports any event states. ** ** It is legal for both the Reading parameter and the EventState parameter to ** be NULL. In this case, no data is returned other than the return code. ** This can be used to determine if a Sensor is present and enabled without ** actually returning current Sensor data. If the Sensor is present and ** enabled, SA_OK is returned; otherwise, an error code is returned. ** *******************************************************************************/ SaErrorT SAHPI_API saHpiSensorReadingGet ( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId, SAHPI_IN SaHpiSensorNumT SensorNum, SAHPI_INOUT SaHpiSensorReadingT *Reading, SAHPI_INOUT SaHpiEventStateT *EventState ); /******************************************************************************* ** ** Name: saHpiSensorThresholdsGet() ** ** Description: ** This function retrieves the thresholds for the given Sensor. ** ** Parameters: ** SessionId - [in] Identifier for a session context previously obtained using ** saHpiSessionOpen(). ** ResourceId - [in] Resource identified for this operation. ** SensorNum - [in] Sensor number for which threshold values are being ** retrieved. ** SensorThresholds - [out] Pointer to returned Sensor thresholds. ** ** Return Value: ** SA_OK is returned on successful completion; otherwise, an error code is ** returned. ** SA_ERR_HPI_CAPABILITY is returned if the resource does not support Sensors, ** as indicated by SAHPI_CAPABILITY_SENSOR in the resource's RPT entry. ** SA_ERR_HPI_INVALID_PARAMS is returned if the SensorThresholds pointer is ** passed in as NULL. ** SA_ERR_HPI_INVALID_CMD is returned if: ** * Getting a threshold on a Sensor that is not a threshold type. ** * The Sensor does not have any readable threshold values. ** SA_ERR_HPI_NOT_PRESENT is returned if the Sensor is not present. ** ** Remarks: ** This function only applies to Sensors that support readable thresholds, as ** indicated by the IsAccessible field in the SaHpiSensorThdDefnT structure of ** the Sensor's RDR being set to True and the ReadThold field in the same ** structure having a non-zero value. ** ** For thresholds that do not apply to the identified Sensor, the IsSupported ** flag of the threshold value field is set to False. ** *******************************************************************************/ SaErrorT SAHPI_API saHpiSensorThresholdsGet ( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId, SAHPI_IN SaHpiSensorNumT SensorNum, SAHPI_OUT SaHpiSensorThresholdsT *SensorThresholds ); /******************************************************************************* ** ** Name: saHpiSensorThresholdsSet() ** ** Description: ** This function sets the specified thresholds for the given Sensor. ** ** Parameters: ** SessionId - [in] Identifier for a session context previously obtained using ** saHpiSessionOpen(). ** ResourceId - [in] Resource identified for this operation. ** SensorNum - [in] Sensor number for which threshold values are being set. ** SensorThresholds - [in] Pointer to the Sensor thresholds values being set. ** ** Return Value: ** SA_OK is returned on successful completion; otherwise, an error code is ** returned. ** SA_ERR_HPI_INVALID_DATA is returned if any of the threshold values are ** provided in a format not supported by the Sensor. ** SA_ERR_HPI_CAPABILITY is returned if the resource does not support Sensors, ** as indicated by SAHPI_CAPABILITY_SENSOR in the resource's RPT entry. ** SA_ERR_HPI_NOT_PRESENT is returned if the Sensor is not present. ** SA_ERR_HPI_INVALID_CMD is returned when: ** * Writing to a threshold that is not writable. ** * Setting a threshold on a Sensor that is not a threshold type as ** indicated by the IsAccessible field of the SaHpiSensorThdDefnT ** structure. ** * Setting a threshold outside of the Min-Max range as defined by the ** Range field of the SensorDataFormat of the RDR. ** SA_ERR_HPI_INVALID_DATA is returned when: ** * Thresholds are set out-of-order (see Remarks). ** * A negative number is provided for either the postive hysteresis value ** (SensorThresholds -> PosThdHysteresis), or for the negative ** hysteresis value (SensorThreshold -> NegThdHysteresis). ** SA_ERR_HPI_INVALID_PARAMS is returned if the SensorThresholds pointer is ** passed in as NULL. ** ** Remarks: ** This function only applies to Sensors that support writable thresholds, as ** indicated by the IsAccessible field in the SaHpiSensorThdDefnT structure of ** the Sensor's RDR being set to True and the WriteThold field in the same ** structure having a non-zero value. ** ** The type of value provided for each threshold setting must correspond to ** the reading format supported by the Sensor, as defined by the reading type ** in the DataFormat field of the Sensor's RDR (saHpiSensorRecT). ** ** Sensor thresholds cannot be set outside of the range defined by the Range ** field of the SensorDataFormat of the Sensor RDR. If SAHPI_SRF_MAX ** indicates that a maximum reading exists, no Sensor threshold may be set ** greater than the Max value. If SAHPI_SRF_MIN indicates that a minimum ** reading exists, no Sensor threshold may be set less than the Min value. ** ** Thresholds are required to be set progressively in-order, so that, for all ** threshold values that are defined on a Sensor, Upper Critical >= Upper ** Major >= Upper Minor >= Lower Minor >= Lower Major >= Lower Critical. ** *******************************************************************************/ SaErrorT SAHPI_API saHpiSensorThresholdsSet ( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId, SAHPI_IN SaHpiSensorNumT SensorNum, SAHPI_IN SaHpiSensorThresholdsT *SensorThresholds ); /******************************************************************************* ** ** Name: saHpiSensorTypeGet() ** ** Description: ** This function retrieves the Sensor type and event category for the ** specified Sensor. ** ** Parameters: ** SessionId - [in] Identifier for a session context previously obtained using ** saHpiSessionOpen(). ** ResourceId - [in] Resource identified for this operation. ** SensorNum - [in] Sensor number for which the type is being retrieved. ** Type - [out] Pointer to returned enumerated Sensor type for the specified ** Sensor. ** Category - [out] Pointer to location to receive the returned Sensor event ** category. ** ** Return Value: ** SA_OK is returned on successful completion; otherwise, an error code is ** returned. ** SA_ERR_HPI_CAPABILITY is returned if the resource does not support Sensors, ** as indicated by SAHPI_CAPABILITY_SENSOR in the resource's RPT entry. ** SA_ERR_HPI_NOT_PRESENT is returned if the Sensor is not present. ** SA_ERR_HPI_INVALID_PARAMS is returned if the: ** * Type pointer is passed in as NULL. ** * Category pointer is passed in as NULL. ** ** Remarks: ** None. ** *******************************************************************************/ SaErrorT SAHPI_API saHpiSensorTypeGet ( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId, SAHPI_IN SaHpiSensorNumT SensorNum, SAHPI_OUT SaHpiSensorTypeT *Type, SAHPI_OUT SaHpiEventCategoryT *Category ); /******************************************************************************* ** ** Name: saHpiSensorEnableGet() ** ** Description: ** This function returns the current Sensor enable status for an addressed ** Sensor. ** ** Parameters: ** SessionId - [in] Identifier for a session context previously obtained using ** saHpiSessionOpen(). ** ResourceId - [in] Resource identified for this operation. ** SensorNum - [in] Sensor number for which the Sensor enable status is being ** requested. ** SensorEnabled - [out] Pointer to the location to store the Sensor enable ** status. ** ** Return Value: ** SA_OK is returned on successful completion; otherwise, an error code is ** returned. ** SA_ERR_HPI_CAPABILITY is returned if the resource does not support Sensors, ** as indicated by SAHPI_CAPABILITY_SENSOR in the resource's RPT entry. ** SA_ERR_HPI_INVALID_PARAMS is returned when the SensorEnabled pointer is set ** to NULL. ** SA_ERR_HPI_NOT_PRESENT is returned if the Sensor is not present. ** ** Remarks: ** The SaHpiBoolT value pointed to by the SensorEnabled parameter is set to ** True if the Sensor is enabled, or False if the Sensor is disabled. ** *******************************************************************************/ SaErrorT SAHPI_API saHpiSensorEnableGet ( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId, SAHPI_IN SaHpiSensorNumT SensorNum, SAHPI_OUT SaHpiBoolT *SensorEnabled ); /******************************************************************************* ** ** Name: saHpiSensorEnableSet() ** ** Description: ** This function sets the Sensor enable status for an addressed Sensor. ** ** Parameters: ** SessionId - [in] Identifier for a session context previously obtained using ** saHpiSessionOpen(). ** ResourceId - [in] Resource identified for this operation. ** SensorNum - [in] Sensor number for which the Sensor enable status is being ** set. ** SensorEnabled - [in] Sensor enable status to be set for the Sensor. ** ** Return Value: ** SA_OK is returned on successful completion; otherwise, an error code is ** returned. ** SA_ERR_HPI_CAPABILITY is returned if the resource does not support Sensors, ** as indicated by SAHPI_CAPABILITY_SENSOR in the resource's RPT entry. ** SA_ERR_HPI_NOT_PRESENT is returned if the Sensor is not present. ** SA_ERR_HPI_READ_ONLY is returned if the Sensor does not support changing ** the enable status (i.e., the EnableCtrl field in the Sensor RDR is set ** to False). ** ** Remarks: ** If a Sensor is disabled, any calls to saHpiSensorReadingGet() for that ** Sensor return an error, and no events are generated for the Sensor. ** ** Calling saHpiSensorEnableSet() with a SensorEnabled parameter of True ** enables the Sensor. A SensorEnabled parameter of False disables the ** Sensor. ** ** If the Sensor enable status changes as the result of this function call, an ** event is generated. ** *******************************************************************************/ SaErrorT SAHPI_API saHpiSensorEnableSet ( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId, SAHPI_IN SaHpiSensorNumT SensorNum, SAHPI_IN SaHpiBoolT SensorEnabled ); /******************************************************************************* ** ** Name: saHpiSensorEventEnableGet() ** ** Description: ** This function returns the current Sensor event enable status for an ** addressed Sensor. ** ** Parameters: ** SessionId - [in] Identifier for a session context previously obtained using ** saHpiSessionOpen(). ** ResourceId - [in] Resource identified for this operation. ** SensorNum - [in] Sensor number for which the Sensor event enable status is ** being requested. ** SensorEventsEnabled - [out] Pointer to the location to store the Sensor ** event enable status. ** ** Return Value: ** SA_OK is returned on successful completion; otherwise, an error code is ** returned. ** SA_ERR_HPI_CAPABILITY is returned if the resource does not support Sensors, ** as indicated by SAHPI_CAPABILITY_SENSOR in the resource's RPT entry. ** SA_ERR_HPI_INVALID_PARAMS is returned when the SensorEventsEnabled pointer ** is set to NULL. ** SA_ERR_HPI_NOT_PRESENT is returned if the Sensor is not present. ** ** Remarks: ** The SaHpiBoolT value pointed to by the SensorEventsEnabled parameter is set ** to True if event generation for the Sensor is enabled, or False if event ** generation for the Sensor is disabled. ** *******************************************************************************/ SaErrorT SAHPI_API saHpiSensorEventEnableGet ( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId, SAHPI_IN SaHpiSensorNumT SensorNum, SAHPI_OUT SaHpiBoolT *SensorEventsEnabled ); /******************************************************************************* ** ** Name: saHpiSensorEventEnableSet() ** ** Description: ** This function sets the Sensor event enable status for an addressed Sensor. ** ** Parameters: ** SessionId - [in] Identifier for a session context previously obtained using ** saHpiSessionOpen(). ** ResourceId - [in] Resource identified for this operation. ** SensorNum - [in] Sensor number for which the Sensor enable status is being ** set. ** SensorEventsEnabled - [in] Sensor event enable status to be set for the ** Sensor. ** ** Return Value: ** SA_OK is returned on successful completion; otherwise, an error code is ** returned. ** SA_ERR_HPI_CAPABILITY is returned if the resource does not support Sensors, ** as indicated by SAHPI_CAPABILITY_SENSOR in the resource's RPT entry. ** SA_ERR_HPI_NOT_PRESENT is returned if the Sensor is not present. ** SA_ERR_HPI_READ_ONLY is returned if the Sensor does not support changing ** the event enable status (i.e., the EventCtrl field in the Sensor RDR is ** set to SAHPI_SEC_READ_ONLY). ** ** Remarks: ** If event generation for a Sensor is disabled, no events are generated as a ** result of the assertion or deassertion of any event state, regardless of ** the setting of the assert or deassert event masks for the Sensor. If event ** generation for a Sensor is enabled, events are generated when event states ** are asserted or deasserted, according to the settings of the assert and ** deassert event masks for the Sensor. Event states may still be read for a ** Sensor even if event generation is disabled, by using the ** saHpiSensorReadingGet() function. ** ** Calling saHpiSensorEventEnableSet() with a SensorEventsEnabled parameter of ** True enables event generation for the Sensor. A SensorEventsEnabled ** parameter of False disables event generation for the Sensor. ** ** If the Sensor event enabled status changes as a result of this function ** call, an event is generated. ** *******************************************************************************/ SaErrorT SAHPI_API saHpiSensorEventEnableSet ( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId, SAHPI_IN SaHpiSensorNumT SensorNum, SAHPI_IN SaHpiBoolT SensorEventsEnabled ); /******************************************************************************* ** ** Name: saHpiSensorEventMasksGet() ** ** Description: ** This function returns the assert and deassert event masks for a Sensor. ** ** Parameters: ** SessionId - [in] Identifier for a session context previously obtained using ** saHpiSessionOpen(). ** ResourceId - [in] Resource identified for this operation. ** SensorNum - [in] Sensor number for which the event enable configuration is ** being requested. ** AssertEventMask - [in/out] Pointer to location to store Sensor assert event ** mask. If NULL, assert event mask is not returned. ** DeassertEventMask - [in/out] Pointer to location to store Sensor deassert ** event mask. If NULL, deassert event mask is not returned. ** ** Return Value: ** SA_OK is returned on successful completion; otherwise, an error code is ** returned. ** SA_ERR_HPI_CAPABILITY is returned if the resource does not support Sensors, ** as indicated by SAHPI_CAPABILITY_SENSOR in the resource's RPT entry. ** SA_ERR_HPI_NOT_PRESENT is returned if the Sensor is not present. ** ** Remarks: ** Two bit-mask values are returned by the saHpiSensorEventMasksGet() ** function; one for the Sensor assert event mask, and one for the Sensor ** deassert event mask. A bit set to "1" in the AssertEventMask value ** indicates that an event is generated by the Sensor when the corresponding ** event state for that Sensor changes from deasserted to asserted. A bit set ** to "1" in the DeassertEventMask value indicates that an event is generated ** by the Sensor when the corresponding event state for that Sensor changes ** from asserted to deasserted. ** ** Events are only generated by the Sensor if the appropriate AssertEventMask ** or DeassertEventMask bit is set, Sensor events are enabled, and the Sensor ** is enabled. ** ** For Sensors hosted by resources that have the ** SAHPI_CAPABILITY_EVT_DEASSERTS flag set in its RPT entry, the ** AssertEventMask and the DeassertEventMask values are always the same. ** *******************************************************************************/ SaErrorT SAHPI_API saHpiSensorEventMasksGet ( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId, SAHPI_IN SaHpiSensorNumT SensorNum, SAHPI_INOUT SaHpiEventStateT *AssertEventMask, SAHPI_INOUT SaHpiEventStateT *DeassertEventMask ); /******************************************************************************* ** ** Name: saHpiSensorEventMasksSet() ** ** Description: ** This function provides the ability to change the settings of the Sensor ** assert and deassert event masks. Two parameters contain bit-mask values ** indicating which bits in the Sensor assert and deassert event masks should ** be updated. In addition, there is an Action parameter. ** ** Parameters: ** SessionId - [in] Identifier for a session context previously obtained using ** saHpiSessionOpen(). ** ResourceId - [in] Resource identified for this operation. ** SensorNum - [in] Sensor number for which the event enable configuration is ** being set. ** Action - [in] Enumerated value describing what change should be made to the ** Sensor event masks: ** * SAHPI_SENS_ADD_EVENTS_TO_MASKS - for each bit set to "1" in the ** AssertEventMask and DeassertEventMask parameters, set the ** corresponding bit in the Sensor's assert and deassert event masks, ** respectively, to "1". ** * SAHPI_SENS_REMOVE_EVENTS_FROM_MASKS - for each bit set to "1" in the ** AssertEventMask and DeassertEventMask parameters, clear the ** corresponding bit in the Sensor's assert and deassert event masks, ** respectively, that is, set the corresponding bits in the event masks ** to "0". ** AssertEventMask - [in] Bit mask or special value indicating which bits in ** the Sensor's assert event mask should be set or cleared. (But see ** Remarks concerning resources with the SAHPI_CAPABILITY_EVT_DEASSERTS ** flag set.) ** DeassertEventMask - [in] Bit mask or special value indicating which bits in ** the Sensor's deassert event mask should be set or cleared. (But see ** Remarks concerning resources with the SAHPI_CAPABILITY_EVT_DEASSERTS ** flag set.) ** ** Return Value: ** SA_OK is returned on successful completion; otherwise, an error code is ** returned. ** SA_ERR_HPI_CAPABILITY is returned if the resource does not support Sensors, ** as indicated by SAHPI_CAPABILITY_SENSOR in the resource's RPT entry. ** SA_ERR_HPI_INVALID_DATA is returned if the Action parameter is ** SAHPI_SENS_ADD_EVENTS_TO_MASKS, and: ** * The AssertEventMask parameter is not SAHPI_ALL_EVENT_STATES, and it ** includes a bit for an event state that is not supported by the ** Sensor. ** * The resource does not have the SAHPI_CAPABILITY_EVT_DEASSERTS ** capability set, and the DeassertEventMask parameter is not ** SAHPI_ALL_EVENT_STATES, and it includes a bit for an event state that ** is not supported by the Sensor. ** SA_ERR_HPI_INVALID_PARAMS is returned if the Action parameter is out of ** range. ** SA_ERR_HPI_NOT_PRESENT is returned if the Sensor is not present. ** SA_ERR_HPI_READ_ONLY is returned if the Sensor does not support updating ** the assert and deassert event masks (i.e., the EventCtrl field in the ** Sensor RDR is set to SAHPI_SEC_READ_ONLY_MASKS or SAHPI_SEC_READ_ONLY). ** ** Remarks: ** The bits in the Sensor assert and deassert event masks that correspond to ** "1" bits in the bit-mask parameters are set or cleared, as indicated by the ** Action parameter. The bits in the Sensor assert and deassert event masks ** corresponding to "0" bits in the bit-mask parameters are unchanged. ** ** Assuming that a Sensor is enabled and event generation for the Sensor is ** enabled, then for each bit set in the Sensor's assert event mask, an event ** is generated when the Sensor's corresponding event state changes from ** deasserted to asserted. Similarly, for each bit set in the Sensor's ** deassert event mask, an event is generated when the Sensor's corresponding ** event state changes from asserted to deasserted. ** ** For Sensors hosted by a resource that has the ** SAHPI_CAPABILITY_EVT_DEASSERTS flag set in its RPT entry, the assert and ** deassert event masks cannot be independently configured. When ** saHpiSensorEventMasksSet() is called for Sensors in a resource with this ** capability, the DeassertEventMask parameter is ignored, and the ** AssertEventMask parameter is used to determine which bits to set or clear ** in both the assert event mask and deassert event mask for the Sensor. ** ** The AssertEventMask or DeassertEventMask parameter may be set to the ** special value, SAHPI_ALL_EVENT_STATES, indicating that all event states ** supported by the Sensor should be added to or removed from, the ** corresponding Sensor event mask. ** ** If the Sensor assert and/or deassert event masks change as a result of this ** function call, an event is generated. ** *******************************************************************************/ SaErrorT SAHPI_API saHpiSensorEventMasksSet ( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId, SAHPI_IN SaHpiSensorNumT SensorNum, SAHPI_IN SaHpiSensorEventMaskActionT Action, SAHPI_IN SaHpiEventStateT AssertEventMask, SAHPI_IN SaHpiEventStateT DeassertEventMask ); /******************************************************************************* ** ** Name: saHpiControlTypeGet() ** ** Description: ** This function retrieves the Control type of a Control object. ** ** Parameters: ** SessionId - [in] Identifier for a session context previously obtained using ** saHpiSessionOpen(). ** ResourceId - [in] Resource identified for this operation. ** CtrlNum - [in] Control number for which the type is being retrieved. ** Type - [out] Pointer to SaHpiCtrlTypeT variable to receive the enumerated ** Control type for the specified Control. ** ** Return Value: ** SA_OK is returned on successful completion; otherwise, an error code is ** returned. ** SA_ERR_HPI_CAPABILITY is returned if the resource does not support ** Controls, as indicated by SAHPI_CAPABILITY_CONTROL in the resource's RPT ** entry. ** SA_ERR_HPI_NOT_PRESENT is returned if the Control is not present. ** SA_ERR_HPI_INVALID_PARAMS is returned if the Type pointer is passed in as ** NULL. ** ** Remarks: ** The Type parameter must point to a variable of type SaHpiCtrlTypeT. Upon ** successful completion, the enumerated Control type is returned in the ** variable pointed to by Type. ** *******************************************************************************/ SaErrorT SAHPI_API saHpiControlTypeGet ( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId, SAHPI_IN SaHpiCtrlNumT CtrlNum, SAHPI_OUT SaHpiCtrlTypeT *Type ); /******************************************************************************* ** ** Name: saHpiControlGet() ** ** Description: ** This function retrieves the current state and mode of a Control object. ** ** Parameters: ** SessionId - [in] Identifier for a session context previously obtained using ** saHpiSessionOpen(). ** ResourceId - [in] Resource identified for this operation. ** CtrlNum - [in] Control number for which the state and mode are being ** retrieved. ** CtrlMode - [out] Pointer to the mode of the Control. If NULL, the ** Control's mode is not returned. ** CtrlState - [in/out] Pointer to a Control data structure into which the ** current Control state is placed. For text Controls, the line number to ** read is passed in via CtrlState->StateUnion.Text.Line. If NULL, the ** Control's state is not returned. ** ** Return Value: ** SA_OK is returned on successful completion; otherwise, an error code is ** returned. ** SA_ERR_HPI_INVALID_CMD is returned if the Control is a write-only Control, ** as indicated by the WriteOnly flag in the Control's RDR (see remarks). ** SA_ERR_HPI_CAPABILITY is returned if the resource does not support ** Controls, as indicated by the SAHPI_CAPABILITY_CONTROL in the resource's ** RPT entry. ** SA_ERR_HPI_INVALID_DATA is returned if the addressed Control is a text ** Control, and the line number passed in CtrlState->StateUnion.Text.Line ** does not exist in the Control and is not SAHPI_TLN_ALL_LINES. ** SA_ERR_HPI_NOT_PRESENT is returned if the Control is not present. ** ** Remarks: ** Note that the CtrlState parameter is both an input and an output parameter ** for this function. This is necessary to support line number inputs for ** text Controls, as discussed below. ** ** As an input parameter, the CtrlState->Type value is not significant for ** this function and is ignored. It is thus not necessary to set ** CtrlState->Type to any valid value, even when CtrlState is being used to ** provide input parameters for specific types of Controls. ** In some cases, the state of a Control may be set, but the corresponding ** state cannot be read at a later time. Such Controls are delineated with ** the WriteOnly flag in the Control's RDR. ** ** Note that text Controls are unique in that they have a state associated ** with each line of the Control - the state being the text on that line. The ** line number to be read is passed in to saHpiControlGet() via ** CtrlState->StateUnion.Text.Line; the contents of that line of the Control ** are returned in ** CtrlState->StateUnion.Text.Text. The first line of the text Control is ** line number "1". ** ** If the line number passed in is SAHPI_TLN_ALL_LINES, then saHpiControlGet() ** returns the entire text of the Control, or as much of it as can fit in a ** single SaHpiTextBufferT, in CtrlState->StateUnion.Text.Text. This value ** consists of the text of all the lines concatenated, using the maximum ** number of characters for each line (no trimming of trailing blanks). ** ** Note that depending on the data type and language, the text may be encoded ** in 2-byte Unicode, which requires two bytes of data per character. ** ** Note that the number of lines and columns in a text Control can be obtained ** from the Control's Resource Data Record. ** ** Write-only Controls allow the Control's state to be set, but the Control ** state cannot be subsequently read. Such Controls are indicated in the RDR, ** when the WriteOnly flag is set to True. SA_ERR_HPI_INVALID_CMD is returned ** when calling this function for a write-only Control. ** ** It is legal for both the CtrlMode parameter and the CtrlState parameter to ** be NULL. In this case, no data is returned other than the return code. ** *******************************************************************************/ SaErrorT SAHPI_API saHpiControlGet ( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId, SAHPI_IN SaHpiCtrlNumT CtrlNum, SAHPI_OUT SaHpiCtrlModeT *CtrlMode, SAHPI_INOUT SaHpiCtrlStateT *CtrlState ); /******************************************************************************* ** ** Name: saHpiControlSet() ** ** Description: ** This function is used for setting the state and/or mode of the specified ** Control object. ** ** Parameters: ** SessionId - [in] Identifier for a session context previously obtained using ** saHpiSessionOpen(). ** ResourceId - [in] Resource identified for this operation. ** CtrlNum - [in] Control number for which the state and/or mode is being set. ** CtrlMode - [in] The mode to set on the Control. ** CtrlState - [in] Pointer to a Control state data structure holding the ** state to be set. ** ** Return Value: ** SA_OK is returned on successful completion; otherwise, an error code is ** returned. ** SA_ERR_HPI_CAPABILITY is returned if the resource does not support ** Controls, as indicated by the SAHPI_CAPABILITY_CONTROL in the resource's ** RPT entry. ** SA_ERR_HPI_NOT_PRESENT is returned if the Control is not present. ** SA_ERR_HPI_INVALID_DATA is returned when the: ** * CtrlState->Type field is not the correct type for the Control ** identified by the CtrlNum parameter. ** * CtrlState->StateUnion.Analog is out of range of the Control record's ** analog Min and Max values. ** * CtrlState->StateUnion.Text.Text.DataLength, combined with the ** CtrlState->StateUnion.Text.Line, overflows the remaining text Control ** space. ** * CtrlState->StateUnion.Text.Text.DataType is not set to the DataType ** specified in the RDR. ** * DataType specified in the RDR is SAHPI_TL_TYPE_UNICODE or ** SAHPI_TL_TYPE_TEXT and ** * CtrlState->StateUnion.Text.Text.Language is not set to the Language ** specified in the RDR. ** * OEM Control data is invalid (see remarks below). ** SA_ERR_HPI_INVALID_PARAMS is returned if the: ** * CtrlMode is not one of the valid enumerated values for this type. ** * CtrlMode parameter is not SAHPI_CTRL_MODE_AUTO and the CtrlState ** pointer is passed in as NULL. ** * CtrlState->StateUnion.Digital is not one of the valid enumerated ** values for this type. ** * CtrlState->StateUnion.Stream.StreamLength is bigger than ** SAHPI_CTRL_MAX_STREAM_LENGTH. ** * SaHpiTextBufferT structure passed as CtrlState->StateUnion.Text.Text ** contains text characters that are not allowed according to the value ** of CtrlState->StateUnion.Text.Text.DataType. ** SA_ERR_HPI_INVALID_REQUEST is returned when SAHPI_CTRL_STATE_PULSE_ON is ** issued to a digital Control, which is ON (in either manual or auto ** mode). It is also returned when SAHPI_CTRL_STATE_PULSE_OFF is issued ** to a digital Control, which is OFF (in either manual or auto mode). ** SA_ERR_HPI_READ_ONLY is returned when attempting to change the mode of a ** Control with a read-only mode. ** SA_ERR_HPI_UNSUPPORTED_PARAMS is returned if an otherwise legal CtrlState ** value passed is not supported by the addressed Control. For example, a ** Discrete Control may only be settable to certain values, or a Digital ** Control may only be able to accept a "Pulse" operation. The HPI ** implementation should provide documentation describing the limitations ** of specific Controls which may result in this return value. ** ** Remarks: ** If the CtrlMode parameter is set to SAHPI_CTRL_MODE_AUTO, then the ** CtrlState parameter is not evaluated, and may be set to any value by an HPI ** User, including a NULL pointer. When CtrlMode is SAHPI_CTRL_MODE_MANUAL, ** the CtrlState parameter must be of the correct type for the specified ** Control. ** ** Text Controls include a line number and a line of text in the CtrlState ** parameter, allowing update of just a single line of a text Control. The ** first line of the text Control is line number "1". If less than a full ** line of data is written, the Control clears all spaces beyond those written ** on the line. Thus writing a zero-length string clears the addressed line. ** ** It is also possible to include more characters in the text passed in the ** CtrlState structure than fits on one line; in this case, the Control wraps ** to the next line (still clearing the trailing characters on the last line ** written). Thus, there are two ways to write multiple lines to a text ** Control: (a) call saHpiControlSet() repeatedly for each line, or (b) call ** saHpiControlSet() once and send more characters than fit on one line. An ** HPI User should not assume any "cursor positioning" characters are ** available to use, but rather should always write full lines and allow ** "wrapping" to occur. When calling saHpiControlSet() for a text Control, an ** HPI User may set the line number to SAHPI_TLN_ALL_LINES; in this case, the ** entire Control is cleared, and the data is written starting on line 1. ** (This is different from simply writing at line 1, which only alters the ** lines written to.) ** ** This feature may be used to clear the entire Control, which can be ** accomplished by setting: ** * CtrlState->StateUnion.Text.Line = SAHPI_TLN_ALL_LINES; ** * CtrlState->StateUnion.Text.Text.DataLength = 0; ** * Note that the number of lines and columns in a text Control can be ** obtained from the Control's RDR. ** * The ManufacturerId (MId) field of an OEM Control is ignored by the ** implementation when calling saHpiControlSet(). ** * On an OEM Control, it is up to the implementation to determine what is ** invalid data, and to return the specified error code. ** *******************************************************************************/ SaErrorT SAHPI_API saHpiControlSet ( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId, SAHPI_IN SaHpiCtrlNumT CtrlNum, SAHPI_IN SaHpiCtrlModeT CtrlMode, SAHPI_IN SaHpiCtrlStateT *CtrlState ); /******************************************************************************* ** ** Name: saHpiIdrInfoGet() ** ** Description: ** This function returns the Inventory Data Repository information including ** the number of areas contained within the IDR and the update counter. The ** Inventory Data Repository is associated with a specific entity. ** ** Parameters: ** SessionId - [in] Identifier for a session context previously obtained using ** saHpiSessionOpen(). ** ResourceId - [in] Resource identified for this operation. ** IdrId - [in] Identifier for the Inventory Data Repository. ** IdrInfo - [out] Pointer to the information describing the requested ** Inventory Data Repository. ** ** Return Value: ** SA_OK is returned on successful completion; otherwise, an error code is ** returned. ** SA_ERR_HPI_CAPABILITY is returned if the resource does not support an ** Inventory Data Repository, as indicated by ** SAHPI_CAPABILITY_INVENTORY_DATA in the resource's RPT entry. ** SA_ERR_HPI_NOT_PRESENT is returned if the IDR is not present. ** SA_ERR_HPI_INVALID_PARAMS is returned if the IdrInfo pointer is passed in ** as NULL. ** ** Remarks: ** The update counter provides a means for insuring that no additions or ** changes are missed when retrieving the IDR data. To use this feature, an ** HPI User should call saHpiIdrInfoGet(), and retrieve the update counter ** value before retrieving the first Area. After retrieving all Areas and ** Fields of the IDR, the HPI User should again call saHpiIdrInfoGet(). If the ** update counter value has not been incremented, no modification or additions ** were made to the IDR during data retrieval. ** *******************************************************************************/ SaErrorT SAHPI_API saHpiIdrInfoGet( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId, SAHPI_IN SaHpiIdrIdT IdrId, SAHPI_OUT SaHpiIdrInfoT *IdrInfo ); /******************************************************************************* ** ** Name: saHpiIdrAreaHeaderGet() ** ** Description: ** This function returns the Inventory Data Area header information for a ** specific area associated with a particular Inventory Data Repository. ** ** Parameters: ** SessionId - [in] Identifier for a session context previously obtained using ** saHpiSessionOpen(). ** ResourceId - [in] Resource identified for this operation. ** IdrId - [in] Identifier for the Inventory Data Repository. ** AreaType - [in] Type of Inventory Data Area. ** AreaId - [in] Identifier of Area entry to retrieve from the IDR. Reserved ** AreaId values: ** * SAHPI_FIRST_ENTRY Get first entry. ** * SAHPI_LAST_ENTRY Reserved as a delimiter for end of list. ** Not a valid AreaId. ** NextAreaId - [out] Pointer to location to store the AreaId of next area of ** the requested type within the IDR. ** Header - [out] Pointer to Inventory Data Area Header into which the header ** information is placed. ** ** Return Value: ** SA_OK is returned on successful completion; otherwise, an error code is ** returned. ** SA_ERR_HPI_CAPABILITY is returned if the resource does not support an ** Inventory Data Repository, as indicated by ** SAHPI_CAPABILITY_INVENTORY_DATA in the resource's RPT entry. ** SA_ERR_HPI_NOT_PRESENT is returned if the: ** * IDR is not present. ** * AreaType parameter is set to SAHPI_IDR_AREATYPE_UNSPECIFIED, and the ** area specified by the AreaId parameter does not exist in the IDR. ** * AreaType parameter is set to a specific area type, but an area ** matching both the AreaId parameter and AreaType parameter does not ** exist. ** SA_ERR_HPI_INVALID_PARAMS is returned if: ** * AreaType is not one of the valid enumerated values for this type. ** * The AreaId is an invalid reserved value such as SAHPI_LAST_ENTRY. ** * The NextAreaId pointer is passed in as NULL. ** * The Header pointer is passed in as NULL. ** ** Remarks: ** This function allows retrieval of an Inventory Data Area Header by one of ** two ways: by AreaId regardless of type or by AreaType and AreaId. ** ** To retrieve all areas contained within an IDR, set the AreaType parameter ** to SAHPI_IDR_AREATYPE_UNSPECIFIED, and set the AreaId parameter to ** SAHPI_FIRST_ENTRY for the first call. For each subsequent call, set the ** AreaId parameter to the value returned in the NextAreaId parameter. ** Continue calling this function until the NextAreaId parameter contains the ** value SAHPI_LAST_ENTRY. ** ** To retrieve areas of specific type within an IDR, set the AreaType ** parameter to a valid AreaType enumeration. Use the AreaId parameter in the ** same manner described above to retrieve all areas of the specified type. ** Set the AreaId parameter to SAHPI_FIRST_ENTRY to retrieve the first area of ** that type. Use the value returned in NextAreaId to retrieve the remaining ** areas of that type until SAHPI_LAST_ENTRY is returned. ** *******************************************************************************/ SaErrorT SAHPI_API saHpiIdrAreaHeaderGet( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId, SAHPI_IN SaHpiIdrIdT IdrId, SAHPI_IN SaHpiIdrAreaTypeT AreaType, SAHPI_IN SaHpiEntryIdT AreaId, SAHPI_OUT SaHpiEntryIdT *NextAreaId, SAHPI_OUT SaHpiIdrAreaHeaderT *Header ); /******************************************************************************* ** ** Name: saHpiIdrAreaAdd() ** ** Description: ** This function is used to add an Area to the specified Inventory Data ** Repository. ** ** Parameters: ** SessionId - [in] Identifier for a session context previously obtained using ** saHpiSessionOpen(). ** ResourceId - [in] Resource identified for this operation. ** IdrId - [in] Identifier for the Inventory Data Repository. ** AreaType - [in] Type of Area to add. ** AreaId- [out] Pointer to location to store the AreaId of the newly created ** area. ** ** Return Value: ** SA_OK is returned on successful completion; otherwise, an error code is ** returned. ** SA_ERR_HPI_CAPABILITY is returned if the resource does not support an ** Inventory Data Repository, as indicated by ** SAHPI_CAPABILITY_INVENTORY_DATA in the resource's RPT entry. ** SA_ERR_HPI_NOT_PRESENT is returned if the IDR is not present. ** SA_ERR_HPI_INVALID_DATA is returned when attempting to add an area with an ** AreaType of SAHPI_IDR_AREATYPE_UNSPECIFIED or when adding an area that ** does not meet the implementation-specific restrictions. ** SA_ERR_HPI_OUT_OF_SPACE is returned if the IDR does not have enough free ** space to allow the addition of the area. ** SA_ERR_HPI_INVALID_PARAMS is returned if the: ** * AreaId pointer is passed in as NULL. ** * AreaType is not one of the valid enumerated values for this type. ** SA_ERR_HPI_READ_ONLY is returned if the IDR is read-only and does not allow ** the addition of the area. ** ** Remarks: ** On successful completion, the AreaId parameter contains the AreaId of the ** newly created area. ** ** On successful completion, the ReadOnly element in the new Area's header is ** always False. ** ** SAHPI_IDR_AREATYPE_UNSPECIFIED is not a valid area type, and should not be ** used with this function. If SAHPI_IDR_AREATYPE_UNSPECIFIED is specified as ** the area type, an error code of SA_ERR_HPI_INVALID_DATA is returned. This ** area type is only valid when used with the saHpiIdrAreaHeaderGet() function ** to retrieve areas of an unspecified type. ** ** Some implementations may restrict the types of areas that may be added. ** These restrictions should be documented. SA_ERR_HPI_INVALID_DATA is ** returned when attempting to add an invalid area type. ** *******************************************************************************/ SaErrorT SAHPI_API saHpiIdrAreaAdd( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId, SAHPI_IN SaHpiIdrIdT IdrId, SAHPI_IN SaHpiIdrAreaTypeT AreaType, SAHPI_OUT SaHpiEntryIdT *AreaId ); /******************************************************************************* ** ** Name: saHpiIdrAreaAddById() ** ** Description: ** This function is used to add an Area with a specified AreaId to a given ** Inventory Data Repository. This function differs from saHpiIdrAreaAdd() in ** that it allows the HPI User to add an Area with a specific AreaId. ** ** Parameters: ** SessionId - [in] Identifier for a session context previously obtained using ** saHpiSessionOpen(). ** ResourceId - [in] Resource identified for this operation. ** IdrId - [in] Identifier for the Inventory Data Repository. ** AreaType - [in] Type of Area to add. ** AreaId- [in] AreaId for the new Area to be created. ** ** Return Value: ** SA_OK is returned on successful completion; otherwise, an error code is ** returned. ** SA_ERR_HPI_CAPABILITY is returned if the resource does not support an ** Inventory Data Repository, as indicated by ** SAHPI_CAPABILITY_INVENTORY_DATA in the resource's RPT entry. ** SA_ERR_HPI_NOT_PRESENT is returned if the IDR is not present. ** SA_ERR_HPI_INVALID_DATA is returned when attempting to add an area with an ** AreaType of SAHPI_IDR_AREATYPE_UNSPECIFIED or when adding an area that ** does not meet the implementation-specific restrictions. ** SA_ERR_HPI_OUT_OF_SPACE is returned if the IDR does not have enough free ** space to allow the addition of the Area. ** SA_ERR_HPI_INVALID_PARAMS is returned if the: ** * The AreaId is an invalid reserved value such as SAHPI_LAST_ENTRY. ** * AreaType is not one of the valid enumerated values for this type. ** SA_ERR_HPI_DUPLICATE is returned if Area identified with AreaId already ** exists in the IDR. ** SA_ERR_HPI_READ_ONLY is returned if the IDR is read-only and does not allow ** the addition of the area. ** ** Remarks: ** On successful completion, a new Area with the specified AreaId and AreaType ** is added to the IDR. ** ** On successful completion, the ReadOnly element in the new Area's header is ** always False. ** ** SAHPI_IDR_AREATYPE_UNSPECIFIED is not a valid area type, and should not be ** used with this function. If SAHPI_IDR_AREATYPE_UNSPECIFIED is specified as ** the area type, an error code of SA_ERR_HPI_INVALID_DATA is returned. This ** area type is only valid when used with the saHpiIdrAreaHeaderGet() function ** to retrieve areas of an unspecified type. ** ** SAHPI_FIRST_ENTRY is a valid AreaId and can be used with this function, ** provided the IDR does not have a pre-existing Area with that AreaId. Upon ** successful addition, this new Area becomes the first Area in the IDR and is ** returned when retrieving Areas using saHpiIdrAreaHeaderGet() with ** AreaId=SAHPI_FIRST_ENTRY. Implementations should document how added Areas ** are ordered in an IDR. ** ** Some implementations may restrict the types of Areas that may be added. ** These restrictions should be documented. SA_ERR_HPI_INVALID_DATA is ** returned when attempting to add an invalid area type. ** *******************************************************************************/ SaErrorT SAHPI_API saHpiIdrAreaAddById( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId, SAHPI_IN SaHpiIdrIdT IdrId, SAHPI_IN SaHpiIdrAreaTypeT AreaType, SAHPI_IN SaHpiEntryIdT AreaId ); /******************************************************************************* ** ** Name: saHpiIdrAreaDelete() ** ** Description: ** This function is used to delete an Inventory Data Area, including the Area ** header and all fields contained with the area, from a particular Inventory ** Data Repository. ** ** Parameters: ** SessionId - [in] Identifier for a session context previously obtained using ** saHpiSessionOpen(). ** ResourceId - [in] Resource identified for this operation. ** IdrId - [in] Identifier for the Inventory Data Repository. ** AreaId - [in] Identifier of Area entry to delete from the IDR. ** ** Return Value: ** SA_OK is returned on successful completion; otherwise, an error code is ** returned. ** SA_ERR_HPI_CAPABILITY is returned if the resource does not support an ** Inventory Data Repository, as indicated by ** SAHPI_CAPABILITY_INVENTORY_DATA in the resource's RPT entry. ** SA_ERR_HPI_NOT_PRESENT is returned if the: ** * IDR is not present. ** * Area identified by the AreaId parameter does not exist within the IDR. ** SA_ERR_HPI_INVALID_PARAMS is returned when the AreaId is an invalid ** reserved value such as SAHPI_LAST_ENTRY. ** SA_ERR_HPI_READ_ONLY is returned if the: ** * IDA is read-only and therefore cannot be deleted. ** * IDA contains a read-only Field and therefore cannot be deleted. ** * IDR is read-only as deletions are not permitted for an area from a ** read-only IDR. ** ** Remarks: ** Deleting an Inventory Data Area also deletes all fields contained within ** the area. ** ** In some implementations, certain Areas are intrinsically read-only. The ** ReadOnly flag in the area header indicates if the Area is read-only. ** ** If the Inventory Data Area is not read-only, but contains a Field that is ** read-only, the Area cannot be deleted. An attempt to delete an Area that ** contains a read-only Field returns an error. ** *******************************************************************************/ SaErrorT SAHPI_API saHpiIdrAreaDelete( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId, SAHPI_IN SaHpiIdrIdT IdrId, SAHPI_IN SaHpiEntryIdT AreaId ); /******************************************************************************* ** ** Name: saHpiIdrFieldGet() ** ** Description: ** This function returns the Inventory Data Field information from a ** particular Inventory Data Area and Repository. ** ** Parameters: ** SessionId - [in] Identifier for a session context previously obtained using ** saHpiSessionOpen(). ** ResourceId - [in] Resource identified for this operation. ** IdrId - [in] Identifier for the Inventory Data Repository. ** AreaId - [in] Area identifier for the IDA. ** FieldType - [in] Type of Inventory Data Field. ** FieldId - [in] Identifier of Field to retrieve from the IDA. Reserved ** FieldId values: ** * SAHPI_FIRST_ENTRY Get first entry. ** * SAHPI_LAST_ENTRY Reserved as a delimiter for end of list. ** Not a valid FieldId. ** NextFieldId - [out] Pointer to location to store the FieldId of next field ** of the requested type in the IDA. ** Field - [out] Pointer to Inventory Data Field into which the field ** information is placed. ** ** Return Value: ** SA_OK is returned on successful completion; otherwise, an error code is ** returned. ** SA_ERR_HPI_CAPABILITY is returned if the resource does not support an ** Inventory Data Repository, as indicated by ** SAHPI_CAPABILITY_INVENTORY_DATA in the resource's RPT entry. ** SA_ERR_HPI_NOT_PRESENT is returned if the: ** * IDR is not present. ** * Area identified by AreaId is not present. ** * FieldType parameter is set to SAHPI_IDR_FIELDTYPE_UNSPECIFIED, and the ** field specified by the FieldId parameter does not exist in the IDA. ** * FieldType parameter is set to a specific field type, but a field ** matching both the FieldId parameter and FieldType parameter does not ** exist. ** SA_ERR_HPI_INVALID_PARAMS is returned if: ** * FieldType is not one of the valid enumerated values for this type. ** * The AreaId or FieldId is an invalid reserved value such as ** SAHPI_LAST_ENTRY. ** * The NextFieldId pointer is passed in as NULL. ** * The Field pointer is passed in as NULL. ** ** Remarks: ** This function allows retrieval of an Inventory Data Field by one of two ** ways: by FieldId regardless of type or by FieldType and FieldId. ** ** To retrieve all fields contained within an IDA, set the FieldType parameter ** to SAHPI_IDR_FIELDTYPE_UNSPECIFIED, and set the FieldId parameter to ** SAHPI_FIRST_ENTRY for the first call. For each subsequent call, set the ** FieldId parameter to the value returned in the NextFieldId parameter. ** Continue calling this function until the NextFieldId parameter contains the ** value SAHPI_LAST_ENTRY. ** ** To retrieve fields of a specific type within an IDA, set the FieldType ** parameter to a valid Field type enumeration. Use the FieldId parameter in ** the same manner described above to retrieve all fields of the specified ** type. Set the FieldId parameter to SAHPI_FIRST_ENTRY to retrieve the first ** field of that type. Use the value returned in NextFieldId to retrieve the ** remaining fields of that type until SAHPI_LAST_ENTRY is returned. ** *******************************************************************************/ SaErrorT SAHPI_API saHpiIdrFieldGet( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId, SAHPI_IN SaHpiIdrIdT IdrId, SAHPI_IN SaHpiEntryIdT AreaId, SAHPI_IN SaHpiIdrFieldTypeT FieldType, SAHPI_IN SaHpiEntryIdT FieldId, SAHPI_OUT SaHpiEntryIdT *NextFieldId, SAHPI_OUT SaHpiIdrFieldT *Field ); /******************************************************************************* ** ** Name: saHpiIdrFieldAdd() ** ** Description: ** This function is used to add a field to the specified Inventory Data Area ** with a specific Inventory Data Repository. ** ** Parameters: ** SessionId - [in] Identifier for a session context previously obtained using ** saHpiSessionOpen(). ** ResourceId - [in] Resource identified for this operation. ** IdrId - [in] Identifier for the Inventory Data Repository. ** Field- [in/out] Pointer to Inventory Data Field, which contains the new ** field information to add to the IDA. ** ** Return Value: ** SA_OK is returned on successful completion; otherwise, an error code is ** returned. ** SA_ERR_HPI_CAPABILITY is returned if the resource does not support an ** Inventory Data Repository, as indicated by ** SAHPI_CAPABILITY_INVENTORY_DATA in the resource's RPT entry. ** SA_ERR_HPI_NOT_PRESENT is returned if the: ** * IDR is not present. ** * Area identified by Field->AreaId does not exist within the IDR. ** SA_ERR_HPI_INVALID_DATA is returned if the Field data is incorrectly ** formatted or does not meet the restrictions for the implementation. ** SA_ERR_HPI_OUT_OF_SPACE is returned if the IDR does not have enough free ** space to allow the addition of the field. ** SA_ERR_HPI_READ_ONLY is returned if the Area identified by Field->AreaId is ** read-only and does not allow addition of Fields. ** SA_ERR_HPI_INVALID_PARAMS is returned if the: ** The Field type is not one of the valid field type enumerated values. ** Field type, Field->Type, is set to SAHPI_IDR_FIELDTYPE_UNSPECIFIED. ** SaHpiTextBufferT structure passed as part of the Field parameter is not ** valid. This occurs when: ** * The DataType is not one of the enumerated values for that type, or ** * The data field contains characters that are not legal according to ** the value of DataType, or ** * The Language is not one of the enumerated values for that type when ** the DataType is SAHPI_TL_TYPE_UNICODE or SAHPI_TL_TYPE_TEXT. ** * Field pointer is passed in as NULL. ** ** Remarks: ** The FieldId element within the Field parameter is not used by this ** function. Instead, on successful completion, the FieldId field is set to ** the new value associated with the added Field. ** ** The ReadOnly element in the Field parameter is not used by this function. ** On successful completion, the ReadOnly element in the new Field is always ** False. ** ** Addition of a read-only Inventory Data Field is not allowed; therefore the ** ReadOnly element in the SaHpiIdrFieldT parameter is ignored. ** ** SAHPI_IDR_FIELDTYPE_UNSPECIFIED is not a valid field type, and should not ** be used with this function. If SAHPI_IDR_FIELDTYPE_UNSPECIFIED is ** specified as the field type, an error code of SA_ERR_HPI_INVALID_DATA is ** returned. This field type is only valid when used with the ** saHpiIdrFieldGet() function to retrieve fields of an unspecified type. ** ** Some implementations have restrictions on what fields are valid in specific ** areas and/or the data format of some fields. These restrictions should be ** documented. SA_ERR_HPI_INVALID_DATA is returned when the field type or ** field data does not meet the implementation-specific restrictions. ** ** The AreaId element within the Field parameter identifies the specific IDA ** into which the new field is added. ** *******************************************************************************/ SaErrorT SAHPI_API saHpiIdrFieldAdd( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId, SAHPI_IN SaHpiIdrIdT IdrId, SAHPI_INOUT SaHpiIdrFieldT *Field ); /******************************************************************************* ** ** Name: saHpiIdrFieldAddById() ** ** Description: ** This function is used to add a field with a specific FieldId to the ** specified Inventory Data Area of a specific Inventory Data Repository. This ** function differs from saHpiIdrFieldAdd() in that it allows the HPI User to ** add a Field with a specific FieldId. ** ** Parameters: ** SessionId - [in] Identifier for a session context previously obtained using ** saHpiSessionOpen(). ** ResourceId - [in] Resource identified for this operation. ** IdrId - [in] Identifier for the Inventory Data Repository. ** Field- [in] Pointer to Inventory Data Field, which contains the new field ** information to add to the IDA. ** ** Return Value: ** SA_OK is returned on successful completion; otherwise, an error code is ** returned. ** SA_ERR_HPI_CAPABILITY is returned if the resource does not support an ** Inventory Data Repository, as indicated by ** SAHPI_CAPABILITY_INVENTORY_DATA in the resource's RPT entry. ** SA_ERR_HPI_NOT_PRESENT is returned if the: ** * IDR is not present. ** * Area identified by Field->AreaId does not exist within the IDR. ** SA_ERR_HPI_INVALID_DATA is returned if the Field data is incorrectly ** formatted or does not meet the restrictions for the implementation. ** SA_ERR_HPI_DUPLICATE is returned if a Field identified with Field->FieldId ** already exists in the IDA. ** SA_ERR_HPI_OUT_OF_SPACE is returned if the IDR does not have enough free ** space to allow the addition of the field. ** SA_ERR_HPI_READ_ONLY is returned if the Area identified by Field->AreaId is ** read-only and does not allow addition of Fields. ** SA_ERR_HPI_INVALID_PARAMS is returned if the: ** * Field->FieldId or Field->AreaId is an invalid reserved value such as ** SAHPI_LAST_ENTRY. ** * The Field type is not one of the valid field type enumerated values. ** * Field type, Field->Type, is set to SAHPI_IDR_FIELDTYPE_UNSPECIFIED. ** * SaHpiTextBufferT structure passed as part of the Field parameter is ** not valid. This occurs when: ** * The DataType is not one of the enumerated values for that type, or ** * The data field contains characters that are not legal according to ** the value of DataType, or ** * The Language is not one of the enumerated values for that type when ** the DataType is SAHPI_TL_TYPE_UNICODE or SAHPI_TL_TYPE_TEXT. ** * Field pointer is passed in as NULL. ** ** Remarks: ** On successful completion a new Field with the FieldId specified within the ** Field parameter is added to the IDA identified by Field->AreaId. Thus this ** function can be used to add Fields with user specified FieldIds to non ** read-only Areas. ** ** The ReadOnly element in the Field parameter is not used by this function. ** On successful completion, the ReadOnly element in the new Field is always ** False. ** ** Addition of a read-only Inventory Data Field is not allowed; therefore the ** ReadOnly element in the SaHpiIdrFieldT parameter is ignored. ** ** SAHPI_IDR_FIELDTYPE_UNSPECIFIED is not a valid field type, and should not ** be used with this function. If SAHPI_IDR_FIELDTYPE_UNSPECIFIED is ** specified as the field type, an error code of SA_ERR_HPI_INVALID_DATA is ** returned. This field type is only valid when used with the ** saHpiIdrFieldGet() function to retrieve fields of an unspecified type. ** ** Some implementations have restrictions on what fields are valid in specific ** areas and/or the data format of some fields. These restrictions should be ** documented. SA_ERR_HPI_INVALID_DATA is returned when the field type or ** field data does not meet the implementation-specific restrictions. ** ** SAHPI_FIRST_ENTRY is a valid FieldId and can be used with this function, ** provided the IDA does not have a pre-existing Field with that FieldId. Upon ** successful addition, this new Field becomes the first field in the IDA and ** is returned when retrieving a Field using saHpiIdrFieldGet() with ** FieldId=SAHPI_FIRST_ENTRY. Implementations should document how added Fields ** are ordered in IDAs. ** ** The AreaId element within the Field parameter identifies the specific IDA ** into which the new field is added. ** *******************************************************************************/ SaErrorT SAHPI_API saHpiIdrFieldAddById( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId, SAHPI_IN SaHpiIdrIdT IdrId, SAHPI_INOUT SaHpiIdrFieldT *Field ); /******************************************************************************* ** ** Name: saHpiIdrFieldSet() ** ** Description: ** This function is used to update an Inventory Data Field for a particular ** Inventory Data Area and Repository. ** ** Parameters: ** SessionId - [in] Identifier for a session context previously obtained using ** saHpiSessionOpen(). ** ResourceId - [in] Resource identified for this operation. ** IdrId - [in] Identifier for the Inventory Data Repository. ** Field - [in] Pointer to Inventory Data Field, which contains the updated ** field information. ** ** Return Value: ** SA_OK is returned on successful completion; otherwise, an error code is ** returned. ** SA_ERR_HPI_CAPABILITY is returned if the resource does not support an ** Inventory Data Repository, as indicated by ** SAHPI_CAPABILITY_INVENTORY_DATA in the resource's RPT entry. ** SA_ERR_HPI_NOT_PRESENT is returned if the: ** * IDR is not present. ** * Area identified by Field->AreaId does not exist within the IDR or if ** the Field does not exist within the Inventory Data Area. ** SA_ERR_HPI_INVALID_PARAMS is returned if the: ** * Field pointer is passed in as NULL. ** * Field type, Field->Type, is not set to one of the valid field type ** enumerated values. ** * Field type, Field->Type, is set to SAHPI_IDR_FIELDTYPE_UNSPECIFIED. ** SA_ERR_HPI_INVALID_DATA is returned if the field data is incorrectly ** formatted or does not meet the restrictions for the implementation. ** SA_ERR_HPI_OUT_OF_SPACE is returned if the IDR does not have enough free ** space to allow the modification of the field due to an increase in the ** field size. ** SA_ERR_HPI_READ_ONLY is returned if the Field is read-only and does not ** allow modifications. ** SA_ERR_HPI_INVALID_PARAMS is returned if the SaHpiTextBufferT structure ** passed as part of the Field parameter is not valid. This occurs when: ** * The DataType is not one of the enumerated values for that type, or ** * The data field contains characters that are not legal according to ** the value of DataType, or ** * The Language is not one of the enumerated values for that type when ** the DataType is SAHPI_TL_TYPE_UNICODE or SAHPI_TL_TYPE_TEXT. ** ** Remarks: ** This function allows modification of both the FieldType and Field data of a ** given Inventory Data Field. This function does not allow modification of ** the read-only attribute of the Inventory Data Field; therefore after a ** successful update, the ReadOnly element in the updated Field is always ** False. The input value for ReadOnly is ignored. ** ** SAHPI_IDR_FIELDTYPE_UNSPECIFIED is not a valid field type, and should not ** be used with this function. If SAHPI_IDR_FIELDTYPE_UNSPECIFIED is ** specified as the new field type, an error code of SA_ERR_HPI_INVALID_DATA ** is returned. This field type is only valid when used with the ** saHpiIdrFieldGet() function to retrieve fields of an unspecified type. ** ** Some implementations have restrictions on what fields are valid in specific ** areas and/or the data format of some fields. These restrictions should be ** documented. SA_ERR_HPI_INVALID_DATA is returned when the field type or ** field data does not meet the implementation-specific restrictions. ** ** In some implementations, certain Fields are intrinsically read-only. The ** ReadOnly flag, in the field structure, indicates if the Field is read-only. ** ** SAHPI_FIRST_ENTRY is a valid FieldId for this function and can be used to ** update the first Field in the Area. If a Field with FieldId equal to ** SAHPI_FIRST_ENTRY exists within the Area then it is always the first Field ** in the Area. ** ** The Field to update is identified by the AreaId and FieldId elements within ** the Field parameter. ** *******************************************************************************/ SaErrorT SAHPI_API saHpiIdrFieldSet( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId, SAHPI_IN SaHpiIdrIdT IdrId, SAHPI_IN SaHpiIdrFieldT *Field ); /******************************************************************************* ** ** Name: saHpiIdrFieldDelete() ** ** Description: ** This function is used to delete an Inventory Data Field from a particular ** Inventory Data Area and Repository. ** ** Parameters: ** SessionId - [in] Identifier for a session context previously obtained using ** saHpiSessionOpen(). ** ResourceId - [in] Resource identified for this operation. ** IdrId - [in] Identifier for the Inventory Data Repository. ** AreaId - [in] Area identifier for the IDA. ** FieldId - [in] Identifier of Field to delete from the IDA. ** ** Return Value: ** SA_OK is returned on successful completion; otherwise, an error code is ** returned. ** SA_ERR_HPI_CAPABILITY is returned if the resource does not support an ** Inventory Data Repository, as indicated by ** SAHPI_CAPABILITY_INVENTORY_DATA in the resource's RPT entry. ** SA_ERR_HPI_NOT_PRESENT is returned if the: ** * IDR is not present. ** * Area identified by the AreaId parameter does not exist within the IDR, ** or if the Field identified by the FieldId parameter does not exist ** within the IDA. ** SA_ERR_HPI_READ_ONLY is returned if the Field or the IDA it exists in is ** read-only and does not allow deletion. ** SA_ERR_HPI_INVALID_PARAMS is returned when the AreaId or FieldId is an ** invalid reserved value such as SAHPI_LAST_ENTRY. ** ** Remarks: ** In some implementations, certain fields are intrinsically read-only. The ** ReadOnly flag, in the field structure, indicates if the field is read-only. ** *******************************************************************************/ SaErrorT SAHPI_API saHpiIdrFieldDelete( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId, SAHPI_IN SaHpiIdrIdT IdrId, SAHPI_IN SaHpiEntryIdT AreaId, SAHPI_IN SaHpiEntryIdT FieldId ); /******************************************************************************* ** ** Name: saHpiWatchdogTimerGet() ** ** Description: ** This function retrieves the current Watchdog Timer settings and ** configuration. ** ** Parameters: ** SessionId - [in] Identifier for a session context previously obtained using ** saHpiSessionOpen(). ** ResourceId - [in] Resource identified for this operation. ** WatchdogNum - [in] Watchdog number that specifies the Watchdog Timer on a ** resource. ** Watchdog - [out] Pointer to Watchdog data structure. ** ** Return Value: ** SA_OK is returned on successful completion; otherwise, an error code is ** returned. ** SA_ERR_HPI_CAPABILITY is returned if the resource does not support a ** Watchdog Timer, as indicated by SAHPI_CAPABILITY_WATCHDOG in the ** resource's RPT entry. ** SA_ERR_HPI_NOT_PRESENT is returned if the WatchdogNum is not present. ** SA_ERR_HPI_INVALID_PARAMS is returned when the Watchdog pointer is passed ** in as NULL. ** ** Remarks: ** See the description of the SaHpiWatchdogT structure in Section 8.11 for ** details on what information is returned by this function. ** ** When the Watchdog action is SAHPI_WA_RESET, the type of reset (warm or ** cold) is implementation-dependent. ** *******************************************************************************/ SaErrorT SAHPI_API saHpiWatchdogTimerGet ( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId, SAHPI_IN SaHpiWatchdogNumT WatchdogNum, SAHPI_OUT SaHpiWatchdogT *Watchdog ); /******************************************************************************* ** ** Name: saHpiWatchdogTimerSet() ** ** Description: ** This function provides a method for initializing the Watchdog Timer ** configuration. ** Once the appropriate configuration has been set using ** saHpiWatchdogTimerSet(), an HPI User must then call ** saHpiWatchdogTimerReset() to initially start the Watchdog Timer, unless the ** Watchdog Timer was already running prior to calling saHpiWatchdogTimerSet() ** and the Running field in the passed Watchdog structure is True. ** ** Parameters: ** SessionId - [in] Identifier for a session context previously obtained using ** saHpiSessionOpen(). ** ResourceId - [in] Resource identified for this operation. ** WatchdogNum - [in] The Watchdog number specifying the specific Watchdog ** Timer on a resource. ** Watchdog - [in] Pointer to Watchdog data structure. ** ** Return Value: ** SA_OK is returned on successful completion; otherwise, an error code is ** returned. ** SA_ERR_HPI_CAPABILITY is returned if the resource does not support a ** Watchdog Timer, as indicated by SAHPI_CAPABILITY_WATCHDOG in the ** resource's RPT entry. ** SA_ERR_HPI_NOT_PRESENT is returned if the WatchdogNum is not present. ** SA_ERR_HPI_INVALID_PARAMS is returned when the: ** * Watchdog->TimerUse is not one of the valid enumerated values for this ** type. ** * Watchdog->TimerAction is not one of the valid enumerated values for ** this type. ** * Watchdog->PretimerInterrupt is not one of the valid enumerated values ** for this type. ** * Watchdog pointer is passed in as NULL. ** SA_ERR_HPI_INVALID_DATA is returned when the: ** * Watchdog->PreTimeoutInterval is outside the acceptable range for the ** implementation. ** * Watchdog->InitialCount is outside the acceptable range for the ** implementation. ** * Value of Watchdog->PreTimeoutInterval is greater than the value of ** Watchdog->InitialCount. ** * Watchdog->PretimerInterrupt is set to an unsupported value. ** See remarks. ** * Watchdog->TimerAction is set to an unsupported value. See remarks. ** * Watchdog->TimerUse is set to an unsupported value. See remarks. ** ** Remarks: ** Configuring the Watchdog Timer with the saHpiWatchdogTimerSet() function ** does not start the timer running. If the timer was previously stopped when ** this function is called, then it remains stopped, and must be started by ** calling saHpiWatchdogTimerReset(). If the timer was previously running, ** then it continues to run if the Watchdog->Running field passed is True, or ** is stopped if the Watchdog->Running field passed is False. If it continues ** to run, it restarts its count-down from the newly configured initial count ** value. ** ** If the initial counter value is set to 0, then any configured pre-timer ** interrupt action or Watchdog Timer expiration action is taken immediately ** when the Watchdog Timer is started. This provides a mechanism for software ** to force an immediate recovery action should that be dependent on a ** Watchdog timeout occurring. ** ** See the description of the SaHpiWatchdogT structure for more details on the ** effects of this command related to specific data passed in that structure. ** ** Some implementations impose a limit on the acceptable ranges for the ** PreTimeoutInterval or InitialCount. These limitations must be documented. ** SA_ERR_HPI_INVALID_DATA is returned if an attempt is made to set a value ** outside of the supported range. ** ** Some implementations cannot accept all of the enumerated values for ** TimerUse, TimerAction, or PretimerInterrupt. These restrictions should be ** documented. SA_ERR_HPI_INVALID_DATA is returned if an attempt is made to ** select an unsupported option. ** ** When the Watchdog action is set to SAHPI_WA_RESET, the type of reset (warm ** or cold) is implementation-dependent. ** *******************************************************************************/ SaErrorT SAHPI_API saHpiWatchdogTimerSet ( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId, SAHPI_IN SaHpiWatchdogNumT WatchdogNum, SAHPI_IN SaHpiWatchdogT *Watchdog ); /******************************************************************************* ** ** Name: saHpiWatchdogTimerReset() ** ** Description: ** This function provides a method to start or restart the Watchdog Timer from ** the initial countdown value. ** ** Parameters: ** SessionId - [in] Identifier for a session context previously obtained using ** saHpiSessionOpen(). ** ResourceId - [in] Resource identified for this operation. ** WatchdogNum - [in] The Watchdog number specifying the specific Watchdog ** Timer on a resource. ** ** Return Value: ** SA_OK is returned on successful completion; otherwise, an error code is ** returned. ** SA_ERR_HPI_CAPABILITY is returned if the resource does not support a ** Watchdog Timer, as indicated by SAHPI_CAPABILITY_WATCHDOG in the ** resource's RPT entry. ** SA_ERR_HPI_NOT_PRESENT is returned if the WatchdogNum is not present. ** SA_ERR_HPI_INVALID_REQUEST is returned if the current Watchdog state does ** not allow a reset. ** ** Remarks: ** If the Watchdog has been configured to issue a Pre-Timeout interrupt, and ** that interrupt has already occurred, the saHpiWatchdogTimerReset() function ** cannot be used to reset the Watchdog Timer. The only way to stop a Watchdog ** from timing out once a Pre-Timeout interrupt has occurred is to use the ** saHpiWatchdogTimerSet() function to reconfigure and/or stop the timer. ** *******************************************************************************/ SaErrorT SAHPI_API saHpiWatchdogTimerReset ( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId, SAHPI_IN SaHpiWatchdogNumT WatchdogNum ); /******************************************************************************* ** ** Name: saHpiAnnunciatorGetNext() ** ** Description: ** This function allows retrieval of an announcement from the current set of ** announcements held in the Annunciator. ** ** Parameters: ** SessionId - [in] Identifier for a session context previously obtained using ** saHpiSessionOpen(). ** ResourceId - [in] Resource identified for this operation. ** AnnunciatorNum - [in] Annunciator number for the addressed Annunciator. ** Severity - [in] Severity level of announcements to retrieve. Set to ** SAHPI_ALL_SEVERITIES to retrieve announcement of any severity; ** otherwise, set to requested severity level. ** UnacknowledgedOnly - [in] Set to True to indicate only unacknowledged ** announcements should be returned. Set to False to indicate either an ** acknowledged or unacknowledged announcement may be returned. ** Announcement - [in/out] Pointer to the structure to hold the returned ** announcement. Also, on input, Announcement->EntryId and ** Announcement->Timestamp are used to identify the "previous" ** announcement. ** ** Return Value: ** SA_OK is returned on successful completion; otherwise, an error code is ** returned. ** SA_ERR_HPI_CAPABILITY is returned if the resource does not support ** Annunciators, as indicated by SAHPI_CAPABILITY_ANNUNCIATOR in the ** resource's RPT entry. ** SA_ERR_HPI_INVALID_PARAMS is returned when Severity is not one of the valid ** enumerated values for this type. ** SA_ERR_HPI_NOT_PRESENT is returned if: ** * The AnnunciatorNum passed does not address a valid Annunciator ** supported by the resource. ** * There are no announcements (or no unacknowledged announcements if ** UnacknowledgedOnly is True) that meet the specified Severity in the ** current set after the announcement identified by ** Announcement->EntryId and Announcement->Timestamp. ** * There are no announcements (or no unacknowledged announcements if ** UnacknowledgedOnly is True) that meet the specified Severity in the ** current set if the passed Announcement->EntryId field was set to ** SAHPI_FIRST_ENTRY. ** SA_ERR_HPI_INVALID_PARAMS is returned when the Announcement parameter is ** passed in as NULL. ** SA_ERR_HPI_INVALID_DATA is returned if the passed Announcement->EntryId ** matches an announcement in the current set, but the passed ** Announcement->Timestamp does not match the timestamp of that ** announcement. ** ** Remarks: ** All announcements contained in the set are maintained in the order in which ** they were added. This function returns the next announcement meeting the ** specifications given by an HPI User that was added to the set after the ** announcement whose EntryId and timestamp is passed by an HPI User. If ** SAHPI_FIRST_ENTRY is passed as the EntryId, the first announcement in the ** set meeting the specifications given by an HPI User is returned. This ** function should operate even if the announcement associated with the ** EntryId and Timestamp passed by an HPI User has been deleted. ** ** Selection can be restricted to only announcements of a specified severity, ** and/or only unacknowledged announcements. To retrieve all announcements ** contained meeting specific requirements, call saHpiAnnunciatorGetNext() ** with the Status->EntryId field set to SAHPI_FIRST_ENTRY and the Severity ** and UnacknowledgedOnly parameters set to select what announcements should ** be returned. Then, repeatedly call saHpiAnnunciatorGetNext() passing the ** previously returned announcement as the Announcement parameter, and the ** same values for Severity and UnacknowledgedOnly until the function returns ** with the error code SA_ERR_HPI_NOT_PRESENT. ** ** SAHPI_FIRST_ENTRY and SAHPI_LAST_ENTRY are reserved EntryId values, and are ** never assigned to an announcement. ** ** The elements EntryId and Timestamp are used in the Announcement parameter ** to identify the "previous" announcement; the next announcement added to the ** table after this announcement that meets the Severity and ** UnacknowledgedOnly requirements is returned. Announcement->EntryId may be ** set to SAHPI_FIRST_ENTRY to select the first announcement in the current ** set meeting the Severity and UnacknowledgedOnly requirements. If ** Announcement->EntryId is SAHPI_FIRST_ENTRY, then Announcement->Timestamp is ** ignored. ** *******************************************************************************/ SaErrorT SAHPI_API saHpiAnnunciatorGetNext( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId, SAHPI_IN SaHpiAnnunciatorNumT AnnunciatorNum, SAHPI_IN SaHpiSeverityT Severity, SAHPI_IN SaHpiBoolT UnacknowledgedOnly, SAHPI_INOUT SaHpiAnnouncementT *Announcement ); /******************************************************************************* ** ** Name: saHpiAnnunciatorGet() ** ** Description: ** This function allows retrieval of a specific announcement in the ** Annunciator's current set by referencing its EntryId. ** ** Parameters: ** SessionId - [in] Identifier for a session context previously obtained using ** saHpiSessionOpen(). ** ResourceId - [in] Resource identified for this operation. ** AnnunciatorNum - [in] Annunciator number for the addressed Annunciator. ** EntryId - [in] Identifier of the announcement to retrieve from the ** Annunciator. ** Announcement - [out] Pointer to the structure to hold the returned ** announcement. ** ** Return Value: ** SA_OK is returned on successful completion; otherwise, an error code is ** returned. ** SA_ERR_HPI_CAPABILITY is returned if the resource does not support ** Annunciators, as indicated by SAHPI_CAPABILITY_ANNUNCIATOR in the ** resource's RPT entry. ** SA_ERR_HPI_NOT_PRESENT is returned if: ** * The AnnunciatorNum passed does not address a valid Annunciator ** supported by the resource. ** * The requested EntryId does not correspond to an announcement contained ** in the Annunciator. ** SA_ERR_HPI_INVALID_PARAMS is returned if: ** * The Announcement parameter is passed in as NULL. ** * The EntryId parameter passed is SAHPI_FIRST_ENTRY or SAHPI_LAST_ENTRY. ** ** Remarks: ** SAHPI_FIRST_ENTRY and SAHPI_LAST_ENTRY are reserved EntryId values, and are ** never assigned to announcements. ** *******************************************************************************/ SaErrorT SAHPI_API saHpiAnnunciatorGet( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId, SAHPI_IN SaHpiAnnunciatorNumT AnnunciatorNum, SAHPI_IN SaHpiEntryIdT EntryId, SAHPI_OUT SaHpiAnnouncementT *Announcement ); /******************************************************************************* ** ** Name: saHpiAnnunciatorAcknowledge() ** ** Description: ** This function allows an HPI User to acknowledge a single announcement or a ** group of announcements by severity. ** ** Parameters: ** SessionId - [in] Identifier for a session context previously obtained using ** saHpiSessionOpen(). ** ResourceId - [in] Resource identified for this operation. ** AnnunciatorNum - [in] Annunciator number for the addressed Annunciator. ** EntryId - [in] Entry identifier of the announcement to acknowledge. ** Reserved EntryId values: ** * SAHPI_ENTRY_UNSPECIFIED Ignore this parameter. ** Severity - [in] Severity level of announcements to acknowledge. Ignored ** unless EntryId is SAHPI_ENTRY_UNSPECIFIED. ** ** Return Value: ** SA_OK is returned on successful completion; otherwise, an error code is ** returned. ** SA_ERR_HPI_CAPABILITY is returned if the resource does not support ** Annunciators, as indicated by SAHPI_CAPABILITY_ANNUNCIATOR in the ** resource's RPT entry. ** SA_ERR_HPI_NOT_PRESENT is returned if: ** * The AnnunciatorNum passed does not address a valid Annunciator ** supported by the resource. ** * An announcement identified by the EntryId parameter does not exist in ** the current set. ** SA_ERR_HPI_INVALID_PARAMS is returned if EntryId is SAHPI_ENTRY_UNSPECIFIED ** and Severity is not one of the valid enumerated values for this type. ** ** Remarks: ** Announcements are acknowledged one of two ways: a single announcement by ** EntryId regardless of severity or a group of announcements by severity ** regardless of EntryId. ** ** An HPI User acknowledges an announcement to influence the platform-specific ** annunciation provided by the Annunciator management instrument. ** ** An acknowledged announcement has the Acknowledged field set to True. ** ** To acknowledge all announcements contained within the current set, set the ** Severity parameter to SAHPI_ALL_SEVERITIES, and set the EntryId parameter ** to SAHPI_ENTRY_UNSPECIFIED. ** ** To acknowledge all announcements of a specific severity, set the Severity ** parameter to the appropriate value, and set the EntryId parameter to ** SAHPI_ENTRY_UNSPECIFIED. ** ** To acknowledge a single announcement, set the EntryId parameter to a value ** other than SAHPI_ENTRY_UNSPECIFIED. The EntryId must be a valid identifier ** for an announcement present in the current set. ** ** If an announcement has been previously acknowledged, acknowledging it again ** has no effect. However, this is not an error. ** ** If the EntryId parameter has a value other than SAHPI_ENTRY_UNSPECIFIED, ** the Severity parameter is ignored. ** ** If the EntryId parameter is passed as SAHPI_ENTRY_UNSPECIFIED, and no ** announcements are present that meet the requested Severity, this function ** has no effect. However, this is not an error. ** ** SAHPI_ENTRY_UNSPECIFIED is defined as the same value as SAHPI_FIRST_ENTRY, ** so using either symbol has the same effect. However, ** SAHPI_ENTRY_UNSPECIFIED should be used with this function for clarity. ** *******************************************************************************/ SaErrorT SAHPI_API saHpiAnnunciatorAcknowledge( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId, SAHPI_IN SaHpiAnnunciatorNumT AnnunciatorNum, SAHPI_IN SaHpiEntryIdT EntryId, SAHPI_IN SaHpiSeverityT Severity ); /******************************************************************************* ** ** Name: saHpiAnnunciatorAdd() ** ** Description: ** This function is used to add an announcement to the set of items held by an ** Annunciator management instrument. ** ** Parameters: ** SessionId - [in] Identifier for a session context previously obtained using ** saHpiSessionOpen(). ** ResourceId - [in] Resource identified for this operation. ** AnnunciatorNum - [in] Annunciator number for the addressed Annunciator. ** Announcement - [in/out] Pointer to structure that contains the new ** announcement to add to the set. ** ** Return Value: ** SA_OK is returned on successful completion; otherwise, an error code is ** returned. ** SA_ERR_HPI_CAPABILITY is returned if the resource does not support ** Annunciators, as indicated by SAHPI_CAPABILITY_ANNUNCIATOR in the ** resource's RPT entry. ** SA_ERR_HPI_NOT_PRESENT is returned if the AnnunciatorNum passed does not ** address a valid Annunciator supported by the resource. ** SA_ERR_HPI_INVALID_PARAMS is returned when: ** * The Announcement pointer is passed in as NULL. ** * The Announcement->Severity field is not one of the enumerated values ** for that type, or it is equal to SAHPI_ALL_SEVERITIES. ** * The Announcement->StatusCond.Type field is not one of the enumerated ** values for that type. ** * The SaHpiNameT structure passed as part of the Announcement structure ** has a Length field greater than SA_HPI_MAX_NAME_LENGTH. ** * The SaHpiTextBufferT structure passed as part of the Announcement ** structure is not valid. This would occur when: ** * The DataType is not one of the enumerated values for that type, or ** * The Data field contains characters that are not legal according to ** the value of DataType, or ** * The Language is not one of the enumerated values for that type when ** the DataType is SAHPI_TL_TYPE_UNICODE or SAHPI_TL_TYPE_TEXT. ** SA_ERR_HPI_OUT_OF_SPACE is returned if the Annunciator is not able to add ** an additional announcement due to resource limits. ** SA_ERR_HPI_READ_ONLY is returned if the Annunciator is in auto mode. ** ** Remarks: ** The EntryId, Timestamp, and AddedByUser fields within the Announcement ** parameter are not used by this function. Instead, on successful ** completion, these fields are set to new values associated with the added ** announcement. AddedByUser is always set to True. ** ** The Entity, DomainId, ResourceId, SensorNum, Name, and Mid fields in the ** SaHpiConditionT structure passed as part of the Announcement parameter ** should not be validated by the HPI implementation. Any values passed by an ** HPI user in these fields should be accepted. ** ** Unless one of the error conditions described above are detected, or a ** generic error condition from Section is returned, the announcement should ** be added to the set of items held by the Annunciator. Note, however, that ** unless the Annunciator is in "User" mode, the announcement may be removed ** by the implementation at any time. Other actions taken by the HPI ** implementation when announcements are added to the Annunciator are ** implementation-specific. ** *******************************************************************************/ SaErrorT SAHPI_API saHpiAnnunciatorAdd( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId, SAHPI_IN SaHpiAnnunciatorNumT AnnunciatorNum, SAHPI_INOUT SaHpiAnnouncementT *Announcement ); /******************************************************************************* ** ** Name: saHpiAnnunciatorDelete() ** ** Description: ** This function allows an HPI User to delete a single announcement or a group ** of announcements from the current set of an Annunciator. Announcements may ** be deleted individually by specifying a specific EntryId, or they may be ** deleted as a group by specifying a severity. ** ** Parameters: ** SessionId - [in] Identifier for a session context previously obtained using ** saHpiSessionOpen(). ** ResourceId - [in] Resource identified for this operation. ** AnnunciatorNum - [in] Annunciator number for the addressed Annunciator. ** EntryId - [in] Entry identifier of the announcement to delete. Reserved ** EntryId values: ** * SAHPI_ENTRY_UNSPECIFIED Ignore this parameter. ** Severity - [in] Severity level of announcements to delete. Ignored unless ** EntryId is SAHPI_ENTRY_UNSPECIFIED. ** ** Return Value: ** SA_OK is returned on successful completion; otherwise, an error code is ** returned. ** SA_ERR_HPI_CAPABILITY is returned if the resource does not support ** Annunciators, as indicated by SAHPI_CAPABILITY_ANNUNCIATOR in the ** resource's RPT entry. ** SA_ERR_HPI_INVALID_PARAMS is returned if EntryId is SAHPI_ENTRY_UNSPECIFIED ** and Severity is not one of the valid enumerated values for this type. ** SA_ERR_HPI_NOT_PRESENT is returned if: ** * The AnnunciatorNum passed does not address a valid Annunciator ** supported by the resource ** * An announcement identified by the EntryId parameter does not exist in ** the current set of the Annunciator. ** SA_ERR_HPI_READ_ONLY is returned if the Annunciator is in auto mode. ** ** Remarks: ** To delete a single, specific announcement, set the EntryId parameter to a ** value representing an actual announcement in the current set. The Severity ** parameter is ignored when the EntryId parameter is set to a value other ** than SAHPI_ENTRY_UNSPECIFIED. ** ** To delete a group of announcements, set the EntryId parameter to ** SAHPI_ENTRY_UNSPECIFIED, and set the Severity parameter to identify which ** severity of announcements should be deleted. To clear all announcements ** contained within the Annunciator, set the Severity parameter to ** SAHPI_ALL_SEVERITIES. ** ** If the EntryId parameter is passed as SAHPI_ENTRY_UNSPECIFIED, and no ** announcements are present that meet the specified Severity, this function ** has no effect. However, this is not an error. ** ** SAHPI_ENTRY_UNSPECIFIED is defined as the same value as SAHPI_FIRST_ENTRY, ** so using either symbol has the same effect. However, ** SAHPI_ENTRY_UNSPECIFIED should be used with this function for clarity. ** *******************************************************************************/ SaErrorT SAHPI_API saHpiAnnunciatorDelete( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId, SAHPI_IN SaHpiAnnunciatorNumT AnnunciatorNum, SAHPI_IN SaHpiEntryIdT EntryId, SAHPI_IN SaHpiSeverityT Severity ); /******************************************************************************* ** ** Name: saHpiAnnunciatorModeGet() ** ** Description: ** This function allows an HPI User to retrieve the current operating mode of ** an Annunciator. The mode indicates whether or not an HPI User is allowed to ** add or delete items in the set, and whether or not the HPI implementation ** automatically adds or deletes items in the set. ** ** Parameters: ** SessionId - [in] Identifier for a session context previously obtained using ** saHpiSessionOpen(). ** ResourceId - [in] Resource identified for this operation. ** AnnunciatorNum - [in] Annunciator number for the addressed Annunciator. ** Mode - [out] Pointer to location to store the current operating mode of the ** Annunciator where the returned value is one of the following: ** * SAHPI_ANNUNCIATOR_MODE_AUTO - the HPI implementation may add or delete ** announcements in the set; an HPI User may not add or delete ** announcements in the set. ** * SAHPI_ANNUNCIATOR_MODE_USER - the HPI implementation may not add or ** delete announcements in the set; an HPI User may add or delete ** announcements in the set. ** * SAHPI_ANNUNCIATOR_MODE_SHARED - both the HPI implementation and an HPI ** User may add or delete announcements in the set. ** ** Return Value: ** SA_OK is returned on successful completion; otherwise, an error code is ** returned. ** SA_ERR_HPI_CAPABILITY is returned if the resource does not support ** Annunciators, as indicated by SAHPI_CAPABILITY_ANNUNCIATOR in the ** resource's RPT entry. ** SA_ERR_HPI_NOT_PRESENT is returned if the AnnunciatorNum passed does not ** address a valid Annunciator supported by the resource. ** SA_ERR_HPI_INVALID_PARAMS is returned if Mode is passed in as NULL. ** ** Remarks: ** None. ** *******************************************************************************/ SaErrorT SAHPI_API saHpiAnnunciatorModeGet( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId, SAHPI_IN SaHpiAnnunciatorNumT AnnunciatorNum, SAHPI_OUT SaHpiAnnunciatorModeT *Mode ); /******************************************************************************* ** ** Name: saHpiAnnunciatorModeSet() ** ** Description: ** This function allows an HPI User to change the current operating mode of an ** Annunciator. The mode indicates whether or not an HPI User is allowed to ** add or delete announcements in the set, and whether or not the HPI ** implementation automatically adds or deletes announcements in the set. ** ** Parameters: ** SessionId - [in] Identifier for a session context previously obtained using ** saHpiSessionOpen(). ** ResourceId - [in] Resource identified for this operation. ** AnnunciatorNum - [in] Annunciator number for the addressed Annunciator. ** Mode - [out] Mode to set for the Annunciator: ** * SAHPI_ANNUNCIATOR_MODE_AUTO - the HPI implementation may add or delete ** announcements in the set; an HPI User may not add or delete ** announcements in the set. ** * SAHPI_ANNUNCIATOR_MODE_USER - the HPI implementation may not add or ** delete announcements in the set; an HPI User may add or delete ** announcements in the set. ** * SAHPI_ANNUNCIATOR_MODE_SHARED - both the HPI implementation and an ** HPI User may add or delete announcements in the set. ** ** Return Value: ** SA_OK is returned on successful completion; otherwise, an error code is ** returned. ** SA_ERR_HPI_CAPABILITY is returned if the resource does not support ** Annunciators, as indicated by SAHPI_CAPABILITY_ANNUNCIATOR in the ** resource's RPT entry. ** SA_ERR_HPI_NOT_PRESENT is returned if the AnnunciatorNum passed does not ** address a valid Annunciator supported by the resource. ** SA_ERR_HPI_INVALID_PARAMS is returned if Mode is not a valid enumerated ** value for this type. ** SA_ERR_HPI_READ_ONLY is returned if mode changing is not permitted for this ** Annunciator. ** ** Remarks: ** None. ** *******************************************************************************/ SaErrorT SAHPI_API saHpiAnnunciatorModeSet( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId, SAHPI_IN SaHpiAnnunciatorNumT AnnunciatorNum, SAHPI_IN SaHpiAnnunciatorModeT Mode ); /******************************************************************************* ** ** Name: saHpiDimiInfoGet() ** ** Description: ** This function gets information about the DIMI. ** ** Parameters: ** SessionId - [in] Identifier for a session context previously obtained using ** saHpiSessionOpen(). ** ResourceId - [in] Resource identified for this operation. ** DimiNum- [in] DIMI number ** DimiInfo- [out] Dimi Info ** ** Return Value: ** SA_OK is returned on successful completion; otherwise, an error code is ** returned. ** SA_ERR_HPI_CAPABILITY is returned if the resource does not support DIMI, as ** indicated by SAHPI_CAPABILITY_DIMI in the resource's RPT entry. ** SA_ERR_HPI_INVALID_PARAMS is returned if DimiInfo is passed as NULL. ** SA_ERR_HPI_NOT_PRESENT is returned if the: ** * DimiNum does not address a vaild DIMI supported by the resource. ** ** Remarks: ** An HPI user uses this function to get the number of tests provided by DIMI ** at any given time. An Update Counter is also returned that can be used to ** detect that the set of tests has changed since a previous call to this ** function. ** *******************************************************************************/ SaErrorT SAHPI_API saHpiDimiInfoGet ( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId, SAHPI_IN SaHpiDimiNumT DimiNum, SAHPI_OUT SaHpiDimiInfoT *DimiInfo ); /******************************************************************************* ** ** Name: saHpiDimiTestInfoGet() ** ** Description: ** This function gets information about a particular test. ** ** Parameters: ** SessionId - [in] Identifier for a session context previously obtained using ** saHpiSessionOpen(). ** ResourceId - [in] Resource identified for this operation. ** DimiNum- [in] DIMI number ** TestNum- [in] Test number ** DimiTest- [out] Pointer to location to store test information ** ** Return Value: ** SA_OK is returned on successful completion; otherwise, an error code is ** returned. ** SA_ERR_HPI_CAPABILITY is returned if the resource does not support DIMI, as ** indicated by SAHPI_CAPABILITY_DIMI in the resource's RPT entry. ** SA_ERR_HPI_NOT_PRESENT is returned if the: ** * DimiNum does not address a valid DIMI supported by the resource. ** * TestNum is not a valid test number currently supported by the DIMI. ** SA_ERR_HPI_INVALID_PARAMS is returned if DimiTest is passed as NULL. ** ** Remarks: ** The HPI user can use this function to create a list of all available tests ** on a DIMI and get information for each test. Any time a DIMI is updated ** (the user is notified by an event), the HPI user should obtain the new test ** list by calling this function repeatedly for each TestNum. The output ** parameter DimiTest points to the structure providing the test information. ** ** DIMI test numbering is sequential starting at 0. If there are 'n' tests in ** a DIMI, then first test is always 0 and the last test is (n-1). ** ** The test information returned by this call can contain a list of test ** parameters. Each parameter is defined by its name, type, minimum and ** maximum values (if applicable for the type), and a default value. A short ** human readable description can also be provided. This parameter list can be ** used to populate a user interface, which is used to control the tests. The ** HPI User should use the definition of the test parameters to build a ** parameter list for invoking the test. ** *******************************************************************************/ SaErrorT SAHPI_API saHpiDimiTestInfoGet ( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId, SAHPI_IN SaHpiDimiNumT DimiNum, SAHPI_IN SaHpiDimiTestNumT TestNum, SAHPI_OUT SaHpiDimiTestT *DimiTest ); /******************************************************************************* ** ** Name: saHpiDimiTestReadinessGet() ** ** Description: ** This function provides the readiness of a DIMI to run a particular test. ** ** Parameters: ** SessionId - [in] Identifier for a session context previously obtained using ** saHpiSessionOpen(). ** ResourceId - [in] Resource identified for this operation. ** DimiNum- [in] DIMI number ** TestNum- [in] Test number ** DimiReady - [out] Pointer to location to store value that indicates if DIMI ** is ready to run indicated test ** ** Return Value: ** SA_OK is returned on successful completion; otherwise, an error code is ** returned. ** SA_ERR_HPI_CAPABILITY is returned if the resource does not support DIMIs, ** as indicated by SAHPI_CAPABILITY_DIMI in the resource's RPT entry. ** SA_ERR_HPI_NOT_PRESENT is returned if the: ** * DimiNum does not address a valid DIMI supported by the resource. ** * TestNum is not a valid test number currently supported by the DIMI. ** SA_ERR_HPI_INVALID_PARAMS is returned if Dimiready is passed as NULL. ** ** Remarks: ** None. ** *******************************************************************************/ SaErrorT SAHPI_API saHpiDimiTestReadinessGet ( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId, SAHPI_IN SaHpiDimiNumT DimiNum, SAHPI_IN SaHpiDimiTestNumT TestNum, SAHPI_OUT SaHpiDimiReadyT *DimiReady ); /******************************************************************************* ** ** Name: saHpiDimiTestStart() ** ** Description: ** This function starts execution of a given test on the DIMI. ** ** Parameters: ** SessionId - [in] Identifier for a session context previously obtained using ** saHpiSessionOpen(). ** ResourceId - [in] Resource identified for this operation. ** DimiNum- [in] DIMI number ** TestNum- [in] Test number ** NumberOfParams - [in] Number of variable parameters that are contained in ** the VariableParams array. ** ParamsList - [in] Pointer to array containing variable parameters for the ** test. The parameters must be created based on the information returned ** by the saHpiDimiTestInfoGet() function. The names and parameter types ** must match exactly. ** ** Return Value: ** SA_OK is returned on successful completion; otherwise, an error code is ** returned. ** SA_ERR_HPI_CAPABILITY is returned if the resource does not support DIMI, as ** indicated by SAHPI_CAPABILITY_DIMI in the resource's RPT entry. ** SA_ERR_HPI_NOT_PRESENT is returned if the: ** DimiNum does not address a valid DIMI supported by the resource. ** TestNum is not a valid test number currently supported by the DIMI. ** SA_ERR_HPI_INVALID_STATE is returned if the Test Readiness status for the ** requested test is not SAHPI_DIMI_READY ** SA_ERR_HPI_INVALID_PARAMS is returned if ParamsList is NULL and ** NumberOfParams is non-zero. ** SA_ERR_HPI_INVALID_DATA is returned if a passed parameter ** * Has a name that does not correspond to any of the parameters for the ** test Is of the wrong type for the named parameter ** * Has an invalid value for the named parameter ** ** Remarks: ** The saHpiDimiTestStart function starts execution of given test. An HPI User ** should prepare the system before running a test. When the system is ** prepared to run a test, the DIMI will report a status of SAHPI_DIMI_READY ** to the saHpiDimiTestReadinessGet() function. If an attempt is made to ** start a test that does not report that status, no action is taken and ** SA_ERR_HPI_INVALID_REQUEST is returned. HPI Events are generated when the ** test is started and when it ends. ** ** ParamsList is a pointer to an array of SaHpiDimiTestVariableParamsT ** structures, the number of elements given by NumberOfParams. The parameters ** list is created based on the information returned by the ** saHpiDimiTestInfoGet() function. The names and parameter types must match ** exactly. For unspecified parameters, the test is started using the default ** parameters defined in the test structure. If NumberOfParams is zero, ** ParamsList is ignored and may be NULL. ** *******************************************************************************/ SaErrorT SAHPI_API saHpiDimiTestStart ( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId, SAHPI_IN SaHpiDimiNumT DimiNum, SAHPI_IN SaHpiDimiTestNumT TestNum, SAHPI_IN SaHpiUint8T NumberOfParams, SAHPI_IN SaHpiDimiTestVariableParamsT *ParamsList ); /******************************************************************************* ** ** Name: saHpiDimiTestCancel() ** ** Description: ** This function cancels the test running on the DIMI. ** ** Parameters: ** SessionId - [in] Identifier for a session context previously obtained using ** saHpiSessionOpen(). ** ResourceId - [in] Resource identified for this operation. ** DimiNum- [in] DIMI number ** TestNum- [in] Test number ** ** Return Value: ** SA_OK is returned on successful completion; otherwise, an error code is ** returned. ** SA_ERR_HPI_CAPABILITY is returned if the resource does not support DIMI, as ** indicated by SAHPI_CAPABILITY_DIMI in the resource's RPT entry. ** SA_ERR_HPI_NOT_PRESENT is returned if the: ** * DimiNum does not address a valid DIMI supported by the resource. ** * TestNum is not a valid test number currently supported by the DIMI. ** SA_ERR_HPI_INVALID_STATE is returned if the test is not running ** SA_ERR_INVALID_REQUEST returned if DIMI cannot cancel the test. ** ** Remarks: ** The saHpiDimiTestCancel function is used to stop a running test. An HPI ** User must stop each test individually. An asynchronous event is generated ** to indicate test completion or cancellation. The saHpiDimiTestStatusGet and ** saHpiDimiTestResultsGet functions also reflect the status of the stopped ** test. ** *******************************************************************************/ SaErrorT SAHPI_API saHpiDimiTestCancel ( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId, SAHPI_IN SaHpiDimiNumT DimiNum, SAHPI_IN SaHpiDimiTestNumT TestNum ); /******************************************************************************* ** ** Name: saHpiDimiTestStatusGet() ** ** Description: ** This function returns the status of a particular test. ** ** Parameters: ** SessionId - [in] Identifier for a session context previously obtained using ** saHpiSessionOpen(). ** ResourceId - [in] Resource identified for this operation. ** DimiNum- [in] DIMI number ** TestNum- [in] Test number ** PercentCompleted- [out] Pointer to location to store percentage of test ** completed, based on implementation capability. Value = 0 - 100, 0xFF ** returned if capability not available. If NULL, no value will be ** returned. ** RunStatus- [out] Pointer to location to store the status of the last run of ** the test. ** ** Return Value: ** SA_OK is returned on successful completion; otherwise, an error code is ** returned. ** SA_ERR_HPI_CAPABILITY is returned if the resource does not support DIMI, as ** indicated by SAHPI_CAPABILITY_DIMI in the resource's RPT entry. ** SA_ERR_HPI_NOT_PRESENT is returned if the: ** * DimiNum does not address a valid DIMI supported by the resource. ** * TestNum is not a valid test number currently supported by the DIMI. ** SA_ERR_HPI_INVALID_PARAMS is returned if RunStatus is passed as NULL. ** ** Remarks: ** The saHpiDimiTestStatusGet function is used to obtain the current status of ** tests. If PercentCompleted is passed as NULL, the function returns only ** RunStatus. ** *******************************************************************************/ SaErrorT SAHPI_API saHpiDimiTestStatusGet ( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId, SAHPI_IN SaHpiDimiNumT DimiNum, SAHPI_IN SaHpiDimiTestNumT TestNum, SAHPI_OUT SaHpiDimiTestPercentCompletedT *PercentCompleted, SAHPI_OUT SaHpiDimiTestRunStatusT *RunStatus ); /******************************************************************************* ** ** Name: saHpiDimiTestResultsGet() ** ** Description: ** This function retrieves the results from the last run of a Test on the ** DIMI. ** ** Parameters: ** SessionId - [in] Identifier for a session context previously obtained using ** saHpiSessionOpen(). ** ResourceId - [in] Resource identified for this operation. ** DimiNum- [in] DIMI number ** TestNum- [in] Test number ** TestResults- [out] Pointer to SaHpiDimiTestResultsT for results from last ** run. ** ** Return Value: ** SA_OK is returned on successful completion; otherwise, an error code is ** returned. ** SA_ERR_HPI_CAPABILITY is returned if the resource does not support DIMI, as ** indicated by SAHPI_CAPABILITY_DIMI in the resource's RPT entry. ** SA_ERR_HPI_NOT_PRESENT is returned if the: ** * DimiNum does not address a valid DIMI supported by the resource. ** * TestNum is not a valid test number currently supported by the DIMI. ** SA_ERR_HPI_INVALID_PARAMS is returned if TestResults is passed as NULL. ** ** Remarks: ** The saHpiDimiTestResultsGet() function is used to obtain the result of last ** run of a test. TestResultString in theTestResults structure can return a ** string or an URI that has the entire results stored (e.g. file, etc). This ** URI is interpreted by the HPI user. ** ** If test is cancelled, TestResults still provides results from the cancelled ** run. ** *******************************************************************************/ SaErrorT SAHPI_API saHpiDimiTestResultsGet ( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId, SAHPI_IN SaHpiDimiNumT DimiNum, SAHPI_IN SaHpiDimiTestNumT TestNum, SAHPI_OUT SaHpiDimiTestResultsT *TestResults ); /******************************************************************************* ** ** Name: saHpiFumiSpecInfoGet() ** ** Description: ** This function is used to identify the specification-defined framework, if ** any, underlying a FUMI implementation. ** ** Parameters: ** SessionId - [in] Identifier for a session context previously obtained using ** saHpiSessionOpen(). ** ResourceId - [in] Resource identified for this operation. ** FumiNum - [in] FUMI number for which the spec information is to be ** returned. ** SpecInfo – [out] Pointer to the location to store spec information. ** ** Return Value: ** SA_OK is returned on successful completion; otherwise, an error code is ** returned. ** SA_ERR_HPI_CAPABILITY is returned if the resource does not support Firmware ** Upgrade management instruments, as indicated by SAHPI_CAPABILITY_FUMI in ** the resource's RPT entry. ** SA_ERR_HPI_INVALID_PARAMS is returned if the SpecInfo parameter is passed ** as NULL. ** SA_ERR_HPI_NOT_PRESENT is returned if the FumiNum does not address a valid ** FUMI supported by the resource. ** ** Remarks: ** A FUMI provides a high-level abstraction of the firmware upgrade process. ** FUMI implementations can use any mechanisms or upgrade protocol to ** accomplish the actual upgrade. Some FUMIs use a specification-defined ** framework, and it may be helpful for an HPI User to be aware of any such ** framework that underlies the FUMI implementation. For some such ** frameworks, for instance, there may be additional sensors or controls ** associated with the FUMI that provide supplementary functionality specific ** to that framework. ** *******************************************************************************/ SaErrorT SAHPI_API saHpiFumiSpecInfoGet ( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId, SAHPI_IN SaHpiFumiNumT FumiNum, SAHPI_OUT SaHpiFumiSpecInfoT *SpecInfo ); /******************************************************************************* ** ** Name: saHpiFumiServiceImpactGet() ** ** Description: ** This function is used to obtain information about the potential service ** impact of an upgrade process on a FUMI. ** ** Parameters: ** SessionId - [in] Identifier for a session context previously obtained using ** saHpiSessionOpen(). ** ResourceId - [in] Resource identified for this operation. ** FumiNum - [in] FUMI number for which the service impact information is to ** be returned. ** ServiceImpact – [out] Pointer to the location to store information about ** the service impact. ** ** Return Value: ** SA_OK is returned on successful completion; otherwise, an error code is ** returned. ** SA_ERR_HPI_CAPABILITY is returned if the resource does not support Firmware ** Upgrade management instruments, as indicated by SAHPI_CAPABILITY_FUMI in ** the resource's RPT entry. ** SA_ERR_HPI_INVALID_PARAMS is returned if the ServiceImpact parameter is ** passed as NULL. ** SA_ERR_HPI_NOT_PRESENT is returned if the FumiNum does not address a valid ** FUMI supported by the resource. ** ** Remarks: ** An upgrade process on a FUMI can affect one or more entities associated ** with the resource that implements a FUMI. For instance, new FPGA content ** may not take effect until the FPGA, and possibly other entities, are reset. ** ** An HPI User may call this function to check possible consequences of an ** upgrade process on a FUMI. ** ** The function returns a list of affected entities and the level of impact ** for each entity. If a listed entity has other entities below it in an entity ** tree, they are also assumed to be affected. ** *******************************************************************************/ SaErrorT SAHPI_API saHpiFumiServiceImpactGet( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId, SAHPI_IN SaHpiFumiNumT FumiNum, SAHPI_OUT SaHpiFumiServiceImpactDataT *ServiceImpact ); /******************************************************************************* ** ** Name: saHpiFumiSourceSet() ** ** Description: ** This function is used to set new source information to the target. When ** explicit banks are supported, different source information can be assigned ** to each bank. This allows the FUMI to support loading different sources to ** different banks. ** ** Parameters: ** SessionId - [in] Identifier for a session context previously obtained using ** saHpiSessionOpen(). ** ResourceId - [in] Resource identified for this operation. ** FumiNum - [in] FUMI number for which the source information is being set. ** BankNum - [in] Bank number; 0 for the logical bank. ** SourceUri - [in] Text buffer containing URI of the source. ** ** Return Value: ** SA_OK is returned on successful completion; otherwise, an error code is ** returned. ** SA_ERR_HPI_CAPABILITY is returned if the resource does not support Firmware ** Upgrade management instruments, as indicated by SAHPI_CAPABILITY_FUMI in ** the resource's RPT entry. ** SA_ERR_HPI_INVALID_PARAMS is returned if: ** * SourceUri is passed as NULL. ** * the SaHpiTextBufferT structure passed as SourceUri does not have a ** DataType of SAHPI_TL_TYPE_TEXT. ** * the SourceUri text buffer does not contain a properly formatted URI as ** defined by RFC 3986. ** SA_ERR_HPI_NOT_PRESENT is returned if the: ** * FumiNum does not address a valid FUMI supported by the resource. ** * BankNum is not 0 and not a valid bank number supported by the FUMI. ** ** Remarks: ** A FUMI identifies the location of the source data using the URI provided ** by the HPI User. The URI also identifies the protocol for accessing the ** source data. Protocols that the FUMI supports are reported by the FUMI’s ** RDR. An HPI User shall make sure that the source URI corresponds to one of ** the supported protocols and that the location of the source data is ** accessible by the FUMI. ** ** An HPI User calls this function to provide the source information to the ** FUMI. The actual upgrade process can only be initiated after this ** information has been set. ** ** When a FUMI supports explicit banks, each bank has separate source ** information. The Bank ID of 0 is used to set the source information for ** the logical bank. When a FUMI does not support explicit banks, only Bank 0 ** can be used with this function. ** ** This function does not necessarily validate the source image. If it does ** not, it may execute successfully, even if the image is not correct. ** *******************************************************************************/ SaErrorT SAHPI_API saHpiFumiSourceSet ( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId, SAHPI_IN SaHpiFumiNumT FumiNum, SAHPI_IN SaHpiBankNumT BankNum, SAHPI_IN SaHpiTextBufferT *SourceUri ); /******************************************************************************* ** ** Name: saHpiFumiSourceInfoValidateStart() ** ** Description: ** This function initiates the validation of the integrity of the source image ** associated with the designated bank. ** ** Parameters: ** SessionId - [in] Identifier for a session context previously obtained using ** saHpiSessionOpen(). ** ResourceId - [in] Resource identified for this operation. ** FumiNum - [in] FUMI number for which the source information is to be ** validated. ** BankNum - [in] Bank number on FUMI; 0 for the logical bank. ** ** Return Value: ** SA_OK is returned when the source validation is successfully started; ** otherwise, an error code is returned. ** SA_ERR_HPI_CAPABILITY is returned if the resource does not support Firmware ** Upgrade management instruments, as indicated by SAHPI_CAPABILITY_FUMI in ** the resource's RPT entry. ** SA_ERR_HPI_NOT_PRESENT is returned if the: ** * FumiNum does not address a valid FUMI supported by the resource. ** * BankNum is not 0 and not a valid bank number supported by the FUMI. ** SA_ERR_HPI_INVALID_REQUEST is returned if the source was not set prior to ** calling this function. ** ** Remarks: ** This function checks the validity of the source image. It should also ** report if the image represented by the URI matches the entity which the ** FUMI is representing (i.e. if the image can be understood by the FUMI logic ** and programmed into the underlying hardware). It could also do any type of ** implementation dependent validation of the source. Some of the examples are ** hash key or message digest validation. ** ** The FUMI validates the URI on invocation of this API. Optionally, the FUMI ** can start the validation process internally after the saHpiFumiSourceSet() ** function is called and can cache the result. It can then return the result ** of validation immediately, once the saHpiFumiValidateSource() function is ** called. ** ** When a FUMI supports explicit banks, each bank has separate source ** information, which should be separately validated. The Bank ID of 0 is ** used to validate the source information for the logical bank. When a FUMI ** does not support explicit banks, only Bank 0 can be used with this ** function. ** ** The status of a source validate operation is reported via events and can be ** queried with the saHpiFumiUpgradeStatusGet() function for the appropriate ** bank. ** *******************************************************************************/ SaErrorT SAHPI_API saHpiFumiSourceInfoValidateStart ( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId, SAHPI_IN SaHpiFumiNumT FumiNum, SAHPI_IN SaHpiBankNumT BankNum ); /******************************************************************************* ** ** Name: saHpiFumiSourceInfoGet() ** ** Description: ** This function returns the information about the source image assigned to ** the designated bank. ** ** Parameters: ** SessionId – [in] Identifier for a session context previously obtained using ** saHpiSessionOpen(). ** ResourceId – [in] Resource identified for this operation. ** FumiNum – [in] FUMI number for which source information is to be returned. ** BankNum – [in] Bank number on FUMI; 0 for the logical bank. ** SourceInfo – [out] Pointer to the location to store source information. ** ** Return Value: ** SA_OK is returned on successful completion; otherwise, an error code is ** returned. ** SA_ERR_HPI_CAPABILITY is returned if the resource does not support Firmware ** Upgrade management instruments, as indicated by SAHPI_CAPABILITY_FUMI in ** the resource's RPT entry. ** SA_ERR_HPI_INVALID_PARAMS is returned if the SourceInfo parameter is NULL. ** SA_ERR_HPI_INVALID_REQUEST is returned if the source was not set prior to ** calling this function. ** SA_ERR_HPI_NOT_PRESENT is returned if the: ** * FumiNum does not address a valid FUMI supported by the resource. ** * BankNum is not 0 and not a valid bank number supported by the FUMI. ** ** Remarks: ** This function returns information about the firmware image addressed by the ** URI set previously. To be meaningful, this function can only be called ** after the source is set and validated. This information can be used to ** identify the firmware to be downloaded by the FUMI. This information ** contains the image name, version, and build date-time. ** ** When a FUMI supports explicit banks, each bank has separate source ** information, which should be separately read. The Bank ID of 0 is used ** to get the source information for the logical bank. When a FUMI does not ** support explicit banks, only Bank 0 can be used with this function. ** *******************************************************************************/ SaErrorT SAHPI_API saHpiFumiSourceInfoGet ( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId, SAHPI_IN SaHpiFumiNumT FumiNum, SAHPI_IN SaHpiBankNumT BankNum, SAHPI_OUT SaHpiFumiSourceInfoT *SourceInfo ); /******************************************************************************* ** ** Name: saHpiFumiSourceComponentInfoGet() ** ** Description: ** This function returns the information about the specified subsidiary ** firmware component in the source image assigned to the designated bank. ** ** Parameters: ** SessionId – [in] Identifier for a session context previously obtained using ** saHpiSessionOpen(). ** ResourceId – [in] Resource identified for this operation. ** FumiNum – [in] FUMI number for which source information is to be returned. ** BankNum – [in] Bank number on FUMI; 0 for the logical bank. ** SourceInfo – [out] Pointer to the location to store source information. ** ComponentEntryId – [in] Identifier of the component to retrieve. Reserved ** ComponentEntryId values: ** * SAHPI_FIRST_ENTRY - Get first component. ** * SAHPI_LAST_ENTRY - Reserved as delimiter for end of list. Not a valid ** component identifier. ** NextComponentEntryId – [out] Pointer to location to store the ** ComponentEntryId of the next component. ** ComponentInfo – [out] Pointer to the location to store the component ** information. ** ** Return Value: ** SA_OK is returned on successful completion; otherwise, an error code is ** returned. ** SA_ERR_HPI_CAPABILITY is returned if the: ** * resource does not support Firmware Upgrade management instruments, ** as indicated by SAHPI_CAPABILITY_FUMI in the resource's RPT entry. ** * FUMI does not support subsidiary firmware component structures, as ** indicated by SAHPI_FUMI_CAP_COMPONENTS in the FUMI RDR. ** SA_ERR_HPI_INVALID_PARAMS is returned if the: ** * ComponentInfo parameter is NULL. ** * NextComponentEntryId pointer is passed in as NULL. ** * ComponentEntryId is an invalid reserved value such as SAHPI_LAST_ENTRY. ** SA_ERR_HPI_INVALID_REQUEST is returned if the source was not set prior to ** calling this function. ** SA_ERR_HPI_NOT_PRESENT is returned if the: ** * FumiNum does not address a valid FUMI supported by the resource. ** * BankNum is not 0 and not a valid bank number supported by the FUMI. ** * Component identified by ComponentEntryId is not present. ** * ComponentEntryId is SAHPI_FIRST_ENTRY and no components are avaliable ** in source image ** ** Remarks: ** This function returns information about the subsidiary firmware ** component(s) in the source image represented by the URI set previously. ** To be meaningful, this function can only be called after the source is set ** and validated. This information contains component firmware version, ** description, and build date-time and can be used to further characterize ** the firmware to be installed by the FUMI. ** ** When a FUMI supports explicit banks, each bank may have separate component ** structure in source image, which should be separately read. The Bank ID of ** 0 can be used to get the component structure information for the logical ** bank. When a FUMI does not support explicit banks, only Bank 0 can be used ** with this function. ** ** If the ComponentEntryId parameter is set to SAHPI_FIRST_ENTRY, the first ** component in firmware source image is returned. When an entry is ** successfully retrieved, NextComponentEntryId is set to the identifier of ** the next valid entry; however, when the last entry has been retrieved, ** NextComponentEntryId is set to SAHPI_LAST_ENTRY. To retrieve an entire list ** of entries, an HPI User needs to call this function first with a ** ComponentEntryId of SAHPI_FIRST_ENTRY and then use the returned ** NextComponentEntryId in the next call, until the NextComponentEntryId ** returned is SAHPI_LAST_ENTRY. ** *******************************************************************************/ SaErrorT SAHPI_API saHpiFumiSourceComponentInfoGet ( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId, SAHPI_IN SaHpiFumiNumT FumiNum, SAHPI_IN SaHpiBankNumT BankNum, SAHPI_IN SaHpiEntryIdT ComponentEntryId, SAHPI_OUT SaHpiEntryIdT *NextComponentEntryId, SAHPI_OUT SaHpiFumiComponentInfoT *ComponentInfo ); /******************************************************************************* ** ** Name: saHpiFumiTargetInfoGet() ** ** Description: ** This function returns information about the specified bank. ** ** Parameters: ** SessionId – [in] Identifier for a session context previously obtained using ** saHpiSessionOpen(). ** ResourceId – [in] Resource identified for this operation. ** FumiNum – [in] FUMI number which contains the bank. ** BankNum – [in] Bank number for on FUMI; 0 for the logical bank. ** BankInfo – [out] Pointer to location to store information about the bank. ** ** Return Value: ** SA_OK is returned on successful completion; otherwise, an error code is ** returned. ** SA_ERR_HPI_CAPABILITY is returned if the resource does not support Firmware ** Upgrade management instruments, as indicated by SAHPI_CAPABILITY_FUMI in ** the resource's RPT entry. ** SA_ERR_HPI_INVALID_PARAMS is returned if BankInfo is NULL. ** SA_ERR_HPI_NOT_PRESENT is returned if the: ** * FumiNum does not address a valid FUMI supported by the resource. ** * BankNum is not 0 and not a valid bank number supported by the FUMI. ** ** Remarks: ** This function returns information about the current image on the target ** including bank number, validity state, executable firmware name, version ** number, build date-time, and position in the boot order. The validity ** state and position in the boot order information is applicable only to ** explicit banks. ** ** When a FUMI supports explicit banks, each bank has separate information, ** which should be separately read. The Bank ID of 0 is used to get ** information about the main firmware instance in the logical bank. ** This is the instance that is executing or, if no instance is currently ** executing, this is the instance that will execute when execution starts. ** *******************************************************************************/ SaErrorT SAHPI_API saHpiFumiTargetInfoGet ( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId, SAHPI_IN SaHpiFumiNumT FumiNum, SAHPI_IN SaHpiBankNumT BankNum, SAHPI_OUT SaHpiFumiBankInfoT *BankInfo ); /******************************************************************************* ** ** Name: saHpiFumiTargetComponentInfoGet() ** ** Description: ** This function returns the information about the specified subsidiary ** firmware component in the designated bank. ** ** Parameters: ** SessionId – [in] Identifier for a session context previously obtained using ** saHpiSessionOpen(). ** ResourceId – [in] Resource identified for this operation. ** FumiNum – [in] FUMI number for which source information is to be returned. ** BankNum – [in] Bank number on FUMI; 0 for the logical bank. ** ComponentEntryId – [in] Identifier of the component to retrieve. Reserved ** ComponentEntryId values: ** * SAHPI_FIRST_ENTRY - Get first component. ** * SAHPI_LAST_ENTRY - Reserved as delimiter for end of list. Not a valid ** component identifier. ** NextComponentEntryId – [out] Pointer to location to store the ** ComponentEntryId of the next component. ** ComponentInfo – [out] Pointer to the location to store the component ** information. ** ** Return Value: ** SA_OK is returned on successful completion; otherwise, an error code is ** returned. ** SA_ERR_HPI_CAPABILITY is returned if the: ** * resource does not support Firmware Upgrade management instruments, ** as indicated by SAHPI_CAPABILITY_FUMI in the resource's RPT entry. ** * FUMI does not support subsidiary firmware component structures, as ** indicated by SAHPI_FUMI_CAP_COMPONENTS in the FUMI RDR. ** SA_ERR_HPI_INVALID_PARAMS is returned if the: ** * ComponentInfo parameter is NULL. ** * NextComponentEntryId pointer is passed in as NULL. ** * ComponentEntryId is an invalid reserved value such as SAHPI_LAST_ENTRY. ** SA_ERR_HPI_NOT_PRESENT is returned if the: ** * FumiNum does not address a valid FUMI supported by the resource. ** * BankNum is not 0 and not a valid bank number supported by the FUMI. ** * Component identified by ComponentEntryId is not present. ** * ComponentEntryId is SAHPI_FIRST_ENTRY and no components are avaliable ** in the designated bank ** ** Remarks: ** This function returns information about the subsidiary firmware ** component(s) within the current firmware of the designated bank. This ** information contains component firmware version, description, and build ** date-time. ** ** When a FUMI supports explicit banks, each bank's component structure is ** independent and, therefore, queried separately. The Bank ID of 0 can be ** used to get the component structure information for the main firmware ** instance in the logical bank. If the ComponentEntryId parameter is set to ** SAHPI_FIRST_ENTRY, the first component in the bank firmware is returned. ** When an entry is successfully retrieved, NextComponentEntryId is set to the ** identifier of the next valid entry; however, when the last entry has been ** retrieved, NextComponentEntryId is set to SAHPI_LAST_ENTRY. To retrieve an ** entire list of entries, call this function first with a ComponentEntryId of ** SAHPI_FIRST_ENTRY and then use the returned NextComponentEntryId in the ** next call. Proceed until the NextComponentEntryId returned is ** SAHPI_LAST_ENTRY. ** *******************************************************************************/ SaErrorT SAHPI_API saHpiFumiTargetComponentInfoGet ( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId, SAHPI_IN SaHpiFumiNumT FumiNum, SAHPI_IN SaHpiBankNumT BankNum, SAHPI_IN SaHpiEntryIdT ComponentEntryId, SAHPI_OUT SaHpiEntryIdT *NextComponentEntryId, SAHPI_OUT SaHpiFumiComponentInfoT *ComponentInfo ); /******************************************************************************* ** ** Name: saHpiFumiLogicalTargetInfoGet() ** ** Description: ** This function returns additional target information about the logical bank. ** ** Parameters: ** SessionId – [in] Identifier for a session context previously obtained using ** saHpiSessionOpen(). ** ResourceId – [in] Resource identified for this operation. ** FumiNum – [in] FUMI number for which source information is to be returned. ** ComponentEntryId – [in] Identifier of the component to retrieve. Reserved ** ComponentEntryId values: ** * SAHPI_FIRST_ENTRY - Get first component. ** * SAHPI_LAST_ENTRY - Reserved as delimiter for end of list. Not a valid ** component identifier. ** NextComponentEntryId – [out] Pointer to location to store the ** ComponentEntryId of the next component. ** ComponentInfo – [out] Pointer to the location to store the component ** information. ** ** Return Value: ** SA_OK is returned on successful completion; otherwise, an error code is ** returned. ** SA_ERR_HPI_CAPABILITY is returned if the resource does not support Firmware ** Upgrade management instruments, as indicated by SAHPI_CAPABILITY_FUMI in ** the resource's RPT entry. ** SA_ERR_HPI_INVALID_PARAMS is returned if BankInfo is NULL. ** SA_ERR_HPI_NOT_PRESENT is returned if the FumiNum does not address a valid ** FUMI supported by the resource. ** ** Remarks: ** As previously described, there can be up to three logical locations for the ** firmware instances in the logical bank. Those locations are all accessed ** using Bank ID 0, and their contents changes automatically depending on the ** executed function. Therefore, a special function is necessary to return ** additional information about the firmware instances in the logical bank ** target, specifically regarding the rollback and pending firmware instances. ** This information also includes the number of persistent locations for ** firmware instances and a flag indicating whether the currently executing ** main firmware instance has a persistent copy or not. ** *******************************************************************************/ SaErrorT SAHPI_API saHpiFumiLogicalTargetInfoGet ( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId, SAHPI_IN SaHpiFumiNumT FumiNum, SAHPI_OUT SaHpiFumiLogicalBankInfoT *BankInfo ); /******************************************************************************* ** ** Name: saHpiFumiLogicalTargetComponentInfoGet() ** ** Description: ** This function returns additional information about the specified subsidiary ** firmware component in the logical bank. ** ** Parameters: ** SessionId – [in] Identifier for a session context previously obtained using ** saHpiSessionOpen(). ** ResourceId – [in] Resource identified for this operation. ** FumiNum – [in] FUMI number for which source information is to be returned. ** BankInfo – [out] Pointer to location to store additional information about ** the bank. ** ** Return Value: ** SA_ERR_HPI_CAPABILITY is returned if the: ** * resource does not support Firmware Upgrade management instruments, ** as indicated by SAHPI_CAPABILITY_FUMI in the resource's RPT entry. ** * FUMI does not support subsidiary firmware component structures, as ** indicated by SAHPI_FUMI_CAP_COMPONENTS in the FUMI RDR. ** SA_ERR_HPI_INVALID_PARAMS is returned if the: ** * ComponentInfo parameter is NULL. ** * NextComponentEntryId pointer is passed in as NULL. ** * ComponentEntryId is an invalid reserved value such as SAHPI_LAST_ENTRY. ** SA_ERR_HPI_NOT_PRESENT is returned if the: ** * FumiNum does not address a valid FUMI supported by the resource. ** * Component identified by ComponentEntryId is not present. ** * ComponentEntryId is SAHPI_FIRST_ENTRY and no components are avaliable ** ** Remarks: ** This function returns additional information about the subsidiary firmware ** component in the logical bank, specifically regarding the subsidiary ** components of the rollback and pending firmware instances. ** ** If the ComponentEntryId parameter is set to SAHPI_FIRST_ENTRY, the first ** component in a firmware instance is returned. When an entry is successfully ** retrieved, NextComponentEntryId is set to the identifier of the next valid ** entry; however, when the last entry has been retrieved, ** NextComponentEntryId is set to SAHPI_LAST_ENTRY. To retrieve an entire list ** of entries, call this function first with a ComponentEntryId of ** SAHPI_FIRST_ENTRY and then use the returned NextComponentEntryId in the ** next call. Proceed until the NextComponentEntryId returned is ** SAHPI_LAST_ENTRY. ** *******************************************************************************/ SaErrorT SAHPI_API saHpiFumiLogicalTargetComponentInfoGet ( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId, SAHPI_IN SaHpiFumiNumT FumiNum, SAHPI_IN SaHpiEntryIdT ComponentEntryId, SAHPI_OUT SaHpiEntryIdT *NextComponentEntryId, SAHPI_OUT SaHpiFumiLogicalComponentInfoT *ComponentInfo ); /******************************************************************************* ** ** Name: saHpiFumiBackupStart() ** ** Description: ** This function initiates a backup of the main instance in the logical bank ** on the target, resulting in a rollback instance in the logical bank. ** ** Parameters: ** SessionId - [in] Identifier for a session context previously obtained using ** saHpiSessionOpen(). ** ResourceId - [in] Resource identified for this operation. ** FumiNum - [in] FUMI number that should perform the backup operation. ** ** Return Value: ** SA_OK is returned if the backup operation is successfully started; ** otherwise, an error code is returned. ** SA_ERR_HPI_CAPABILITY is returned if: ** * the resource does not support Firmware Upgrade management instruments, ** as indicated by SAHPI_CAPABILITY_FUMI in the resource's RPT entry. ** * the FUMI does not support backup capability, as indicated by ** SAHPI_FUMI_CAP_BACKUP in the FUMI's RDR. ** SA_ERR_HPI_NOT_PRESENT is returned if the FumiNum does not address a valid ** FUMI supported by the resource. ** ** Remarks: ** This function is used for taking a backup of the main firmware instance in ** the logical bank on the target in preparation for upgrades. Depending on ** the implementation, this may mean taking a backup on the hard drive or into ** another bank, or in any other location. If the logical bank already has a ** copy of the main instance as the rollback instance, the FUMI may ** immediately report the backup is complete without making an additional ** copy. ** ** The status of a backup operation is reported via events and can be queried ** with the saHpiFumiUpgradeStatusGet() function. ** ** The saHpiFumiBackupStart() function cannot be directly targeted to an ** explicit bank, but may have undefined side effects on an explicit bank if ** the FUMI implements explicit banks. To copy an image to a specific bank, ** the saHpiFumiBankCopy() function should be used. ** ** If an implementation supports HPI Users initiating backups of the logical ** bank, it is reflected in the FUMI capability flag SAHPI_FUMI_CAP_BACKUP in ** the RDR. If an implementation does not support this capability, backups ** may be created automatically during the upgrade operation by the ** implementation; such automatic backups are available if ** SAHPI_FUMI_CAP_ROLLBACK is set and SAHPI_FUMI_CAP_BACKUP is not set. ** If an implementation does support the backup capability using this ** function, it does not create automatic backups that would override the ** ones created by this function. ** *******************************************************************************/ SaErrorT SAHPI_API saHpiFumiBackupStart( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId, SAHPI_IN SaHpiFumiNumT FumiNum ); /******************************************************************************* ** ** Name: saHpiFumiBankBootOrderSet() ** ** Description: ** This function sets the position of an explicit bank in the boot order. ** ** Parameters: ** SessionId - [in] Identifier for a session context previously obtained using ** saHpiSessionOpen(). ** ResourceId - [in] Resource identified for this operation. ** FumiNum - [in] FUMI number which contains the bank. ** BankNum – [in] Explicit bank number; a logical bank reference (BankNum = 0) ** is not allowed. ** Position - [in] Position of the bank in boot order. ** ** Return Value: ** SA_OK is returned on successful completion; otherwise, an error code is ** returned. ** SA_ERR_HPI_CAPABILITY is returned if: ** * the resource does not support Firmware Upgrade management instruments, ** as indicated by SAHPI_CAPABILITY_FUMI in the resource's RPT entry. ** * the FUMI does not support bank reorder capability, as indicated by ** SAHPI_FUMI_CAP_BANKREORDER in the FUMI's RDR. ** SA_ERR_HPI_INVALID_DATA is returned if the Position is more than number of ** banks on the FUMI. ** SA_ERR_HPI_NOT_PRESENT is returned if the: ** * FumiNum does not address a valid FUMI supported by the resource. ** * BankNum is not a valid explicit bank number supported by the FUMI. ** ** Remarks: ** For boot ordering, explicit banks are assigned positions between 1 and n, ** inclusive, where n is the number of banks in a FUMI. ** ** Boot order can be represented as a list. Setting a bank to a certain ** position causes all the subsequent banks to move to next higher positions. ** ** For example, suppose the ordered list for a FUMI has four expliict banks in ** following order: ** bank3, bank 2, bank 4, bank 1. ** ** Moving the bank 1 to second position causes the list to get rearranged as: ** bank 3, bank 1, bank 2, bank4. ** *******************************************************************************/ SaErrorT SAHPI_API saHpiFumiBankBootOrderSet ( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId, SAHPI_IN SaHpiFumiNumT FumiNum, SAHPI_IN SaHpiBankNumT BankNum, SAHPI_IN SaHpiUint32T Position ); /******************************************************************************* ** ** Name: saHpiFumiBankCopyStart() ** ** Description: ** This function initiates the copy of the contents of one explicit bank to ** another explicit bank in the same FUMI. ** ** Parameters: ** SessionId - [in] Identifier for a session context previously obtained using ** saHpiSessionOpen(). ** ResourceId - [in] Resource identified for this operation. ** FumiNum - [in] FUMI number which contains the source and destination ** explicit banks. ** SourceBankNum – [in] Explicit Source Bank number to copy from; a logical ** bank reference (SourceBankNum = 0) is not allowed. ** TargetBankNum – [in] Explicit Target Bank number to copy to; a logical bank ** reference (TargetBankNum = 0) is not allowed. ** ** Return Value: ** SA_OK is returned if the backup operation is successfully started; ** otherwise, an error code is returned. ** SA_ERR_HPI_CAPABILITY is returned if: ** * the resource does not support Firmware Upgrade management instruments, ** as indicated by SAHPI_CAPABILITY_FUMI in the resource's RPT entry. ** * the FUMI does not support bank copy capability, as indicated by ** SAHPI_FUMI_CAP_BANKCOPY in the FUMI's RDR. ** SA_ERR_HPI_INVALID_REQUEST is returned if SourceBankNum and TargetBankNum ** are same. ** SA_ERR_HPI_NOT_PRESENT is returned if FumiNum does not address a valid FUMI ** supported by the resource. ** SA_ERR_HPI_INVALID_DATA is returned if SourceBankNum or TargetBankNum is ** not a valid explicit bank number supported by the FUMI. ** ** Remarks: ** The status of a bank copy operation is reported via events, and can be ** queried with the saHpiFumiUpgradeStatusGet() function, using the source ** bank as the value of the BankNum. ** *******************************************************************************/ SaErrorT SAHPI_API saHpiFumiBankCopyStart( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId, SAHPI_IN SaHpiFumiNumT FumiNum, SAHPI_IN SaHpiBankNumT SourceBankNum, SAHPI_IN SaHpiBankNumT TargetBankNum ); /******************************************************************************* ** ** Name: saHpiFumiInstallStart() ** ** Description: ** This function starts an installation process, loading firmware to the ** logical bank or to a specified explicit bank. ** ** Parameters: ** SessionId – [in] Identifier for a session context previously obtained using ** saHpiSessionOpen(). ** ResourceId – [in] Resource identified for this operation. ** FumiNum – [in] FUMI number which that should perform the install operation. ** BankNum – [in] Target bank number; 0 for the logical bank. ** ** Return Value: ** SA_OK is returned if the install operation is successfully started; ** otherwise, an error code is returned. ** SA_ERR_HPI_CAPABILITY is returned if the resource does not support Firmware ** Upgrade management instruments, as indicated by SAHPI_CAPABILITY_FUMI in ** the resource's RPT entry. ** SA_ERR_HPI_NOT_PRESENT is returned if the: ** * FumiNum does not address a valid FUMI supported by the resource. ** * BankNum is not 0 and not a valid bank number supported by the FUMI. ** SA_ERR_HPI_INVALID_REQUEST is returned if the source is not valid. ** That is, if saHpiFumiSourceInfoGet() returns any value other than ** SAHPI_FUMI_SRC_VALID or SAHPI_FUMI_SRC_VALIDITY_UNKNOWN for ** SourceInfo–>SourceStatus. ** ** Remarks: ** This function can be called after setting up and optionally validating the ** source for the given target. It initiates the install process. The target ** is programmed with the new source image on completion of the upgrade ** process. The whole process is atomic to the HPI user. ** ** If the install process on the logical bank fails, the FUMI can ** automatically initiate a rollback process if the FUMI’s RDR indicates the ** capability SAHPI_FUMI_CAP_AUTOROLLBACK. However, if that capability is ** present, the capability SAHPI_FUMI_CAP_AUTOROLLBACK_CAN_BE_DISABLED ** indicates that the automatic rollback can be disabled and enabled via the ** corresponding FUMI function. ** ** When a FUMI supports explicit banks, each bank can be individually ** installed. The Bank ID of 0 can be used to install the logical bank. When ** a FUMI does not support explicit banks, an HPI User shall use Bank 0 with ** this function. ** ** The status of the install operation is reported via events, and can be ** queried with the saHpiFumiUpgradeStatusGet() function, using the source ** bank as the value of the BankNum. Some events (and the corresponding status ** values) indicate that an HPI User should take follow up action, such as ** initiating an explicit rollback operation. ** *******************************************************************************/ SaErrorT SAHPI_API saHpiFumiInstallStart ( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId, SAHPI_IN SaHpiFumiNumT FumiNum, SAHPI_IN SaHpiBankNumT BankNum ); /******************************************************************************* ** ** Name: saHpiFumiUpgradeStatusGet() ** ** Description: ** This function is used to query the upgrade status of the FUMI. ** ** Parameters: ** SessionId - [in] Identifier for a session context previously obtained using ** saHpiSessionOpen(). ** ResourceId - [in] Resource identified for this operation. ** FumiNum - [in] FUMI number for which status is to be returned. ** BankNum - [in] Target bank number; 0 for the logical bank. ** UpgradeStatus - [out] Pointer to location to store upgrade status for the ** bank. ** ** Return Value: ** SA_OK is returned on successful completion; otherwise, an error code is ** returned. ** SA_ERR_HPI_CAPABILITY is returned if the resource does not support Firmware ** Upgrade management instruments, as indicated by SAHPI_CAPABILITY_FUMI in ** the resource's RPT entry. ** SA_ERR_HPI_NOT_PRESENT is returned if the: ** * FumiNum does not address a valid FUMI supported by the resource. ** * BankNum is not 0 and not a valid bank number supported by the FUMI. ** SA_ERR_HPI_INVALID_PARAMS is returned if UpgradeStatus is passed as NULL. ** ** Remarks: ** This function can be used by an HPI user to determine the status of an ** asynchronous operation that may be active on a particular bank. ** ** The status of an asynchronous operation is reported via events, and can be ** queried with the saHpiFumiUpgradeStatusGet() function. When a FUMI ** supports multiple banks, asynchronous operations are associated with ** individual banks, so this function returns the status of an operation for a ** specified bank. ** *******************************************************************************/ SaErrorT SAHPI_API saHpiFumiUpgradeStatusGet ( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId, SAHPI_IN SaHpiFumiNumT FumiNum, SAHPI_IN SaHpiBankNumT BankNum, SAHPI_OUT SaHpiFumiUpgradeStatusT *UpgradeStatus ); /******************************************************************************* ** ** Name: saHpiFumiTargetVerifyStart() ** ** Description: ** This function starts the verification process of the upgraded image. ** Verification compares the programmed data with the source assigned for the ** bank. ** ** Parameters: ** SessionId – [in] Identifier for a session context previously obtained using ** saHpiSessionOpen(). ** ResourceId – [in] Resource identified for this operation. ** FumiNum – [in] FUMI number which should perform the target verify ** operation. ** BankNum – [in] Bank number; 0 for the logical bank. ** ** Return Value: ** SA_OK is returned when source verify operation is successfully started; ** otherwise, an error code is returned. ** SA_ERR_HPI_CAPABILITY is returned if: ** * the resource does not support Firmware Upgrade management instruments, ** as indicated by SAHPI_CAPABILITY_FUMI in the resource's RPT entry. ** * the FUMI does not support target verify capability, as indicated by ** SAHPI_FUMI_CAP_TARGET_VERIFY in the FUMI’s RDR. ** SA_ERR_HPI_NOT_PRESENT is returned if the: ** * FumiNum does not address a valid FUMI supported by the resource. ** * BankNum is not 0 and not a valid bank number supported by the FUMI. ** SA_ERR_HPI_INVALID_REQUEST is returned if the source for the target to be ** verified is not valid. That is, if saHpiFumiSourceInfoGet() returns any ** value other than SAHPI_FUMI_SRC_VALID or SAHPI_FUMI_SRC_VALIDITY_UNKNOWN ** for SourceInfo–>SourceStatus. ** ** Remarks: ** This function verifies that the installed image at the target bank matches ** with the source image that was assigned to it. ** ** The Bank ID of 0 can be used to validate the source information for the ** logical bank. In this case, this function verifies that the pending ** firmware instance at the target matches the source image that was set for ** the bank. ** ** The status of a target verify operation is reported via events and can be ** queried with the saHpiFumiUpgradeStatusGet() function, using the target ** bank as the value of the BankNum parameter. ** *******************************************************************************/ SaErrorT SAHPI_API saHpiFumiTargetVerifyStart ( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId, SAHPI_IN SaHpiFumiNumT FumiNum, SAHPI_IN SaHpiBankNumT BankNum ); /******************************************************************************* ** ** Name: saHpiFumiTargetVerifyMainStart() ** ** Description: ** This function starts the verification process of the main firmware instance ** in the logical bank. ** ** Parameters: ** SessionId - [in] Identifier for a session context previously obtained using ** saHpiSessionOpen(). ** ResourceId - [in] Resource identified for this operation. ** FumiNum - [in] FUMI number that should perform the target verify operation. ** ** Return Value: ** SA_OK is returned if the target verify operation is successfully started; ** otherwise, an error code is returned. ** SA_ERR_HPI_CAPABILITY is returned if: ** * the resource does not support Firmware Upgrade management instruments, ** as indicated by SAHPI_CAPABILITY_FUMI in the resource's RPT entry. ** * the FUMI does not support target verify capability, as indicated by ** SAHPI_FUMI_CAP_TARGET_VERIFY_MAIN in the FUMI's RDR. ** SA_ERR_HPI_NOT_PRESENT is returned if the FumiNum does not address a valid ** FUMI supported by the resource. ** SA_ERR_HPI_INVALID_REQUEST is returned if the: ** * source for the target to be verified is not valid. That is, if ** saHpiFumiSourceInfoGet() returns any value other than ** SAHPI_FUMI_SRC_VALID or SAHPI_FUMI_SRC_VALIDITY_UNKNOWN for ** SourceInfo–>SourceStatus. ** * main firmware instance is not avaliable. This can happen in the case ** of a failed activation or a failed rollback. ** ** Remarks: ** Verification compares the main firmware instance with the source assigned ** for the logical bank. Note that an explicit source set operation may be ** needed to align the source with the main firmware instance on the target. ** ** The logical bank may hold up to three instances of the firmware. Two of ** these, the main and pending instances, can be verified against the source. ** This function verifies the main instance. To verify the pending instance, ** use the saHpiFumiVerifyTargetStart() function with a Bank ID of 0. ** ** The status of a target verify against main firmware instance operation is ** reported via the same events as target verification against pending ** firmware instance and can be queried with the saHpiFumiUpgradeStatusGet() ** function, using 0 as the value of the BankNum parameter. ** *******************************************************************************/ SaErrorT SAHPI_API saHpiFumiTargetVerifyMainStart ( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId, SAHPI_IN SaHpiFumiNumT FumiNum ); /******************************************************************************* ** ** Name: saHpiFumiUpgradeCancel() ** ** Description: ** This function stops an asynchronous operation in process on a designated ** bank. ** ** Parameters: ** SessionId – [in] Identifier for a session context previously obtained using ** saHpiSessionOpen(). ** ResourceId – [in] Resource identified for this operation. ** FumiNum – [in] FUMI number which contains this bank. ** BankNum – [in] Target bank number; 0 for the logical bank. ** ** Return Value: ** SA_OK is returned on successful completion; otherwise, an error code is ** returned. ** SA_ERR_HPI_CAPABILITY is returned if the resource does not support Firmware ** Upgrade management instruments, as indicated by SAHPI_CAPABILITY_FUMI in ** the resource's RPT entry. ** SA_ERR_HPI_NOT_PRESENT is returned if the: ** FumiNum does not address a valid FUMI supported by the resource. ** BankNum is not 0 and not a valid bank number supported by the FUMI. ** SA_ERR_HPI_INVALID_REQUEST is returned if an asynchronous operation is not ** in progress. ** ** Remarks: ** This function cancels any asynchronous operation running on a specific bank ** of a FUMI. Asynchronous operations are started by ** saHpiFumiSourceInfoVerifyStart(), saHpiFumiInstallStart(), ** saHpiFumiTargetVerifyStart(), saHpiFumiRollbackStart(), ** saHpiFumiActivateStart(), saHpiFumiBankCopyStart(), and ** saHpiFumiBackupStart(). ** ** The only mandatory result of this function is an event issued by the FUMI ** identifying the operation that was cancelled. Other persistent effects of ** such a cancellation are implementation-specific. Some implementations may ** automatically roll back to a previous version. Target bank firmware ** instances may be corrupted and not available after the cancellation. ** ** Asynchronous operations are activated for specific banks. The Bank ID of 0 ** can be used to cancel an asynchronous operation on the logical bank. ** *******************************************************************************/ SaErrorT SAHPI_API saHpiFumiUpgradeCancel ( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId, SAHPI_IN SaHpiFumiNumT FumiNum, SAHPI_IN SaHpiBankNumT BankNum ); /******************************************************************************* ** ** Name: saHpiFumiAutoRollbackDisableGet() ** ** Description: ** This function is used to query whether automatic rollback is disabled or ** not on the FUMI logical bank. ** ** Parameters: ** SessionId - [in] Identifier for a session context previously obtained using ** saHpiSessionOpen(). ** ResourceId - [in] Resource identified for this operation. ** FumiNum - [in] FUMI number for which automatic rollback policy is to be ** returned. ** Disable – [out] Pointer to location to store information about automatic ** rollback disable status. Set to True if automatic rollback is disabled, ** or False automatic rollback is enabled. ** ** Return Value: ** SA_OK is returned on successful completion; otherwise, an error code is ** returned. ** SA_ERR_HPI_CAPABILITY is returned if: ** * the resource does not support Firmware Upgrade management instruments, ** as indicated by SAHPI_CAPABILITY_FUMI in the resource's RPT entry. ** * FUMI does not support automatic rollback, as indicated by ** SAHPI_FUMI_CAP_AUTOROLLBACK capability in FUMI RDR. ** SA_ERR_HPI_NOT_PRESENT is returned if FumiNum does not address a valid FUMI ** supported by the resource. ** SA_ERR_HPI_INVALID_PARAMS is returned if Disable is passed as NULL. ** ** Remarks: ** This function can be used by an HPI User to determine whether automatic ** rollback is disabled or not on the FUMI logical bank. ** *******************************************************************************/ SaErrorT SAHPI_API saHpiFumiAutoRollbackDisableGet ( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId, SAHPI_IN SaHpiFumiNumT FumiNum, SAHPI_OUT SaHpiBoolT *Disable ); /******************************************************************************* ** ** Name: saHpiFumiAutoRollbackDisableSet() ** ** Description: ** This function is used to disable or enable automatic rollback on the FUMI ** logical bank. ** ** Parameters: ** SessionId - [in] Identifier for a session context previously obtained using ** saHpiSessionOpen(). ** ResourceId - [in] Resource identified for this operation. ** FumiNum - [in] FUMI number for which automatic rollback policy is to be ** set. ** Disable – [in] Boolean variable that indicates whether an HPI User requests ** disabling or enabling automatic rollback. Set to True to disable ** automatic rollback or to False to enable automatic rollback. ** ** Return Value: ** SA_OK is returned on successful completion; otherwise, an error code is ** returned. ** SA_ERR_HPI_CAPABILITY is returned if: ** * the resource does not support Firmware Upgrade management instruments, ** as indicated by SAHPI_CAPABILITY_FUMI in the resource's RPT entry. ** * FUMI does not support automatic rollback, as indicated by ** SAHPI_FUMI_CAP_AUTOROLLBACK capability in FUMI RDR. ** * FUMI does not support disabling the automatic rollback policy, as ** indicated by SAHPI_FUMI_CAP_AUTOROLLBACK_CAN_BE_DISABLED in FUMI RDR. ** SA_ERR_HPI_NOT_PRESENT is returned if FumiNum does not address a valid FUMI ** supported by the resource. ** ** Remarks: ** This function can be used by an HPI User to enable or disable automatic ** rollback on the FUMI logical bank. By default, automatic rollback is ** enabled. For some implementations, automatic rollback cannot be disabled. ** To change the automatic rollback policy, an HPI User must call this ** function before calling a function (typically an install or activate) that ** could result in the rollback. The state of the rollback policy is intended ** to persist until explicitly changed. Entities that use multiple firmware ** instances for reliability benefits beyond protecting the upgrade process ** itself may apply this policy in those broader contexts as well. ** For instance, an implementation may have the capability to switch to a ** rollback firmware instance if the main instance becomes inoperable for some ** reason not associated with a firmware upgrade; such an implementation may ** inhibit that switch if automatic rollback has been disabled via a FUMI ** operation. ** *******************************************************************************/ SaErrorT SAHPI_API saHpiFumiAutoRollbackDisableSet ( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId, SAHPI_IN SaHpiFumiNumT FumiNum, SAHPI_IN SaHpiBoolT Disable ); /******************************************************************************* ** ** Name: saHpiFumiRollbackStart() ** ** Description: ** This function initiates a rollback operation to replace the main firmware ** instance of the logical bank with the rollback instance. The rollback ** instance may have been explicitly created with saHpiFumiBackupStart(), ** or automatically by the implementation. ** ** Parameters: ** SessionId - [in] Identifier for a session context previously obtained using ** saHpiSessionOpen(). ** ResourceId - [in] Resource identified for this operation. ** FumiNum – [in] FUMI number that should perform the rollback operation. ** ** Return Value: ** SA_OK is returned on successful completion; otherwise, an error code is ** returned. ** SA_ERR_HPI_CAPABILITY is returned if: ** * the resource does not support Firmware Upgrade management instruments, ** as indicated by SAHPI_CAPABILITY_FUMI in the resource's RPT entry. ** * the FUMI does not support rollback capability, as indicated by ** SAHPI_FUMI_CAP_ROLLBACK in the FUMI's RDR. ** SA_ERR_HPI_NOT_PRESENT is returned if FumiNum does not address a valid FUMI ** supported by the resource. ** SA_ERR_HPI_INVALID_REQUEST is returned if rollback firmware instance is ** not available. ** ** Remarks: ** The intent of this function is to roll back to the backed up version. Some ** implementations may not support it; in those cases, if upgrade failure ** happens then the HPI user will need to explicitly restore the target by ** initiating a new upgrade process or copying an image from a redundant ** location. ** ** The status of a rollback operation is reported via events, and can be ** queried with the saHpiFumiUpgradeStatusGet() function. This function ** starts the rollback operation for the logical bank. Status of the rollback ** operation will be associated with that bank. ** *******************************************************************************/ SaErrorT SAHPI_API saHpiFumiRollbackStart ( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId, SAHPI_IN SaHpiFumiNumT FumiNum ); /******************************************************************************* ** ** Name: saHpiFumiActivate() ** ** Note: ** This function should not be used in new HPI User programs. The function ** saHpiFumiActivateStart() should be used instead. ** ** Description: ** This function starts execution of the firmware in the first valid explicit ** bank in the boot order list on the FUMI, if the FUMI supports explicit ** banks, or activates an appropriate firmware instance on the logical bank, ** if FUMI does not support explicit banks. ** ** Parameters: ** SessionId - [in] Identifier for a session context previously obtained using ** saHpiSessionOpen(). ** ResourceId - [in] Resource identified for this operation. ** FumiNum - [in] FUMI number ** ** Return Value: ** SA_OK is returned on successful completion; otherwise, an error code is ** returned. ** SA_ERR_HPI_CAPABILITY is returned if the resource does not support Firmware ** Upgrade management instruments, as indicated by SAHPI_CAPABILITY_FUMI in ** the resource's RPT entry. ** SA_ERR_HPI_NOT_PRESENT is returned if FumiNum does not address a valid FUMI ** supported by the resource. ** SA_ERR_HPI_INVALID_REQUEST is returned if: ** * NumBanks is 0, but there is no valid firmware instance in the logical ** bank to execute on the entity; that is, if there is no valid pending ** or main instance. ** * NumBanks is positive, but no explicit bank has both a valid BankState ** and a positive Position in the boot order list. ** ** Remarks: ** This function provides a synchronous method for firmware activation. ** ** When a FUMI supports explicit banks, this function ensures that the ** firmware loaded in the first valid explicit bank in the boot order list is ** executing. If the required firmware instance is already executing before ** this function was called, the function has no effect. If the entity is not ** executing any firmware, or is executing some inappropriate instance, ** calling this function will cause the entity to be restarted with the ** correct firmware. ** ** When a FUMI does not support explicit banks, this function ensures that the ** pending firmware instance becomes the main firmware instance and starts ** executing. If there is no pending instance, this function ensures that the ** main instance is executing, if necessary by restarting the entity with that ** instance. If the main instance is already executing, this function has no ** effect. ** ** This function is preserved for compatibility with previous HPI ** specification revisions. The more flexible asynchronous function ** saHpiFumiActivateStart() is preferred for new applications. ** *******************************************************************************/ SaErrorT SAHPI_API saHpiFumiActivate ( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId, SAHPI_IN SaHpiFumiNumT FumiNum ); /******************************************************************************* ** ** Name: saHpiFumiActivateStart() ** ** Description: ** This function initiates firmware activation in either the logical bank or ** the explicit banks on the FUMI. ** ** Parameters: ** SessionId - [in] Identifier for a session context previously obtained using ** saHpiSessionOpen(). ** ResourceId - [in] Resource identified for this operation. ** FumiNum - [in] FUMI number ** Logical – [in] Boolean variable. When True, indicates a logical bank ** activation. When False, indicates an explicit bank activation according ** to the boot order list. ** ** Return Value: ** SA_OK is returned on successful completion; otherwise, an error code is ** returned. ** SA_ERR_HPI_CAPABILITY is returned if the resource does not support Firmware ** Upgrade management instruments, as indicated by SAHPI_CAPABILITY_FUMI in ** the resource's RPT entry. ** SA_ERR_HPI_NOT_PRESENT is returned if FumiNum does not address a valid FUMI ** supported by the resource. ** SA_ERR_HPI_INVALID_REQUEST is returned if: ** * Logical is False, but NumBanks is 0 indicating that the FUMI does not ** support explicit banks. ** * Logical is False, NumBanks is positive, but no explicit bank has both ** a valid BankState and a positive Position in the boot order list. ** * Logical is True, but there is no valid firmware instance in the ** logical bank to execute on the entity; that is, if there is no valid ** pending or main instance. ** ** Remarks: ** This function provides an asynchronous method for firmware activation. Some ** implementations may require a long time to start execution of a new image ** on the FUMI. For example, an implementation may need to copy firmware from ** a non-executable SEEPROM to an executable flash location. Alternatively, ** the old firmware may need a long time to shut down or the new firmware may ** need a long time to start up. ** ** If Logical is True, this function ensures that the pending firmware ** instance become the main firmware instance and starts executing. If there ** is no pending instance, this function ensures that the main instance is ** executing, if necessary by restarting the entity with that instance. If ** the main instance is already executing, this function has no effect. ** ** If Logical is True and the activate process fails, the FUMI can ** automatically restore the rollback firmware instance if the FUMI’s RDR ** indicates the capability SAHPI_FUMI_CAP_AUTOROLLBACK. However, if that ** capability is present, the capability ** SAHPI_FUMI_CAP_AUTOROLLBACK_CAN_BE_DISABLED indicates that the automatic ** rollback can be disabled and enabled via the corresponding FUMI functions. ** ** If Logical is False, this function ensures that the firmware loaded in the ** first valid explicit bank in the boot order list is executing. If the ** required firmware instance is already executing before this function was ** called, the function has no effect. If the entity is not executing any ** firmware, or is executing some inappropriate instance, calling this ** function will cause the entity to be restarted with the correct ** firmware. ** ** The status of an asynchronous activation operation is reported via events ** and can be queried with the saHpiFumiUpgradeStatusGet() function. Some ** events (and the corresponding status values) indicate that an HPI User ** should take follow up action, such as initiating an explicit rollback ** operation. ** ** There are some considerations that make this function more flexible than ** the saHpiFumiActivate() variant. One such consideration is that the ** asynchronous variant is better suited to FUMI implementations that ** require a long time to start execution of a new image. For example, an ** implementation may need to copy firmware from a non-executable SEEPROM to ** an executable flash location. Alternatively, the old firmware may need a ** long time to shut down, or the new firmware may need a long time to start ** up. Doing firmware activation synchronously can lead to timeout problems ** in the HPI implementation. ** ** Another such consideration is that the saHpiFumiActivateStart() function ** has an additional parameter that explicitly states whether the logical bank ** or explicit bank activation is intended. For FUMIs that support explicit ** banks, this parameter allows an HPI User to unambiguously determine the ** activation type. ** *******************************************************************************/ SaErrorT SAHPI_API saHpiFumiActivateStart ( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId, SAHPI_IN SaHpiFumiNumT FumiNum, SAHPI_IN SaHpiBoolT Logical ); /******************************************************************************* ** ** Name: saHpiFumiActivateStart() ** ** Description: ** This function performs cleanup after an upgrade process on the specified ** bank, returning it to a predefined state. ** ** Parameters: ** SessionId - [in] Identifier for a session context previously obtained using ** saHpiSessionOpen(). ** ResourceId - [in] Resource identified for this operation. ** FumiNum - [in] FUMI number ** BankNum – [in] Target bank number; 0 for the logical bank. ** ** Return Value: ** SA_OK is returned on successful completion; otherwise, an error code is ** returned. ** SA_ERR_HPI_CAPABILITY is returned if the resource does not support Firmware ** Upgrade management instruments, as indicated by SAHPI_CAPABILITY_FUMI in ** the resource's RPT entry. ** SA_ERR_HPI_NOT_PRESENT is returned if the: ** * FumiNum does not address a valid FUMI supported by the resource. ** * BankNum is not 0 and not a valid bank number supported by the FUMI. ** ** Remarks: ** This function takes the following actions: ** * Cancels all asynchronous operations in progress or scheduled for the ** designated bank. An asynchronous bank to bank copying operation is ** canceled only if the designated bank is the source bank for the ** operation. ** * Unsets the source for designated bank. ** * Returns the designated bank state to SAHPI_FUMI_OPERATION_NOTSTARTED. ** * Does any other cleanup (such as deleting a downloaded source file or ** freeing allocated memory) that is needed by the implementation. ** *******************************************************************************/ SaErrorT SAHPI_API saHpiFumiCleanup ( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId, SAHPI_IN SaHpiFumiNumT FumiNum, SAHPI_IN SaHpiBankNumT BankNum ); /******************************************************************************* ** ** Name: saHpiHotSwapPolicyCancel() ** ** Description: ** A resource supporting hot swap typically supports default policies for ** insertion and extraction. On insertion, the default policy may be for the ** resource to turn the associated FRU's local power on and to de-assert ** reset. On extraction, the default policy may be for the resource to ** immediately power off the FRU and turn on a hot swap indicator. This ** function allows an HPI User, after receiving a hot swap event with ** HotSwapState equal to SAHPI_HS_STATE_INSERTION_PENDING or ** SAHPI_HS_STATE_EXTRACTION_PENDING, to prevent the auto insertion or ** auto extraction policy from being automatically executed by the HPI ** implementation. ** ** Parameters: ** SessionId - [in] Identifier for a session context previously obtained using ** saHpiSessionOpen(). ** ResourceId - [in] Resource identified for this operation. ** ** Return Value: ** SA_OK is returned on successful completion; otherwise, an error code is ** returned. ** SA_ERR_HPI_CAPABILITY is returned if the resource does not support managed ** hot swap, as indicated by SAHPI_CAPABILITY_MANAGED_HOTSWAP in the ** resource's RPT entry. ** SA_ERR_HPI_INVALID_REQUEST is returned if the resource is: ** * Not in the INSERTION PENDING or EXTRACTION PENDING state. ** * Processing an auto-insertion or auto-extraction policy. ** ** Remarks: ** Each time the resource transitions to either the INSERTION PENDING or ** EXTRACTION PENDING state, the default policies execute after the configured ** timeout period, unless cancelled using saHpiHotSwapPolicyCancel() after the ** transition to INSERTION PENDING or EXTRACTION PENDING state and before the ** timeout expires. The policy cannot be canceled once it has begun to ** execute. ** ** This function is only supported by resources that support Managed Hot Swap. ** If a resource with the FRU capability set but without the Managed Hot Swap ** capability set transitions to INSERTION PENDING or EXTRACTION PENDING, ** there is no way for an HPI User to control its insertion or extraction ** policy. ** *******************************************************************************/ SaErrorT SAHPI_API saHpiHotSwapPolicyCancel ( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId ); /******************************************************************************* ** ** Name: saHpiResourceActiveSet() ** ** Description: ** This function allows an HPI User to request a resource to transition to the ** ACTIVE state from the INSERTION PENDING or EXTRACTION PENDING state, ** executing the auto insertion policy to condition the hardware ** appropriately. ** ** Parameters: ** SessionId - [in] Identifier for a session context previously obtained using ** saHpiSessionOpen(). ** ResourceId - [in] Resource identified for this operation. ** ** Return Value: ** SA_OK is returned on successful completion; otherwise, an error code is ** returned. ** SA_ERR_HPI_CAPABILITY is returned if the resource does not support managed ** hot swap, as indicated by SAHPI_CAPABILITY_MANAGED_HOTSWAP in the ** resource's RPT entry. ** SA_ERR_HPI_INVALID_REQUEST is returned if the resource is: ** * Not in the INSERTION PENDING or EXTRACTION PENDING state. ** * Processing an auto-insertion or auto-extraction policy. ** ** Remarks: ** During insertion, a resource supporting managed hot swap generates an ** event to indicate that it is in the INSERTION PENDING state. While the ** resource is in this state, and before it begins execution of the auto ** insertion policy, an HPI User may call this function to request that the ** auto insertion policy be started immediately. ** ** If an HPI User calls saHpiHotSwapPolicyCancel() before the resource begins ** executing the auto insertion policy, the resource remains in INSERTION ** PENDING state while actions can be taken to integrate the FRU associated ** with this resource into the system. Once completed with the integration of ** the FRU, an HPI User must call this function to signal that the resource ** should now execute the auto insertion policy and transition into the ACTIVE ** state. ** ** An HPI User may also use this function to request a resource to return to ** the ACTIVE state from the EXTRACTION PENDING state to reject an extraction ** request. ** ** This function is only supported by resources that support Managed Hot Swap. ** It is only valid if the resource is in INSERTION PENDING or EXTRACTION ** PENDING state, and an auto insertion or auto extraction policy has not been ** initiated. ** *******************************************************************************/ SaErrorT SAHPI_API saHpiResourceActiveSet ( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId ); /******************************************************************************* ** ** Name: saHpiResourceInactiveSet() ** ** Description: ** This function allows an HPI User to request a resource to transition to the ** INACTIVE state from the INSERTION PENDING or EXTRACTION PENDING state, ** executing the auto extraction policy to condition the hardware ** appropriately. ** ** Parameters: ** SessionId - [in] Identifier for a session context previously obtained using ** saHpiSessionOpen(). ** ResourceId - [in] Resource identified for this operation. ** ** Return Value: ** SA_OK is returned on successful completion; otherwise, an error code is ** returned. ** SA_ERR_HPI_CAPABILITY is returned if the resource does not support managed ** hot swap, as indicated by SAHPI_CAPABILITY_MANAGED_HOTSWAP in the ** resource's RPT entry. ** SA_ERR_HPI_INVALID_REQUEST is returned if the resource is: ** * Not in the INSERTION PENDING or EXTRACTION PENDING state. ** * Already processing an auto-insertion or auto-extraction policy. ** ** Remarks: ** During extraction, a resource supporting managed hot swap generates an ** event to indicate that it is in the EXTRACTION PENDING state. While the ** resource is in this state, and before it begins execution of the auto ** extraction policy, an HPI User may call this function to request that the ** auto extraction policy be started immediately. If an HPI User calls ** saHpiHotSwapPolicyCancel() before the resource begins executing the auto ** extraction policy, the resource remains in EXTRACTION PENDING state while ** actions can be taken to prepare the system for the FRU associated with this ** resource to be out of service. Once the system is prepared for the ** shutdown of the FRU, an HPI User must call this function to signal that the ** resource should now execute the auto extraction policy and transition into ** the INACTIVE state. ** ** An HPI User may also use this function to request a resource to return to ** the INACTIVE state from the INSERTION PENDING state to abort a hot-swap ** insertion action. ** ** This function is only supported by resources that support Managed Hot Swap. ** It is only valid if the resource is in EXTRACTION PENDING or INSERTION ** PENDING state, and an auto extraction or auto insertion policy has not been ** initiated. ** *******************************************************************************/ SaErrorT SAHPI_API saHpiResourceInactiveSet ( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId ); /******************************************************************************* ** ** Name: saHpiAutoInsertTimeoutGet() ** ** Description: ** This function allows an HPI User to request the auto-insert timeout value ** within a specific domain. This value indicates how long a resource that ** supports managed hot swap waits after transitioning to INSERTION PENDING ** state before the default auto-insertion policy is invoked. ** ** Parameters: ** SessionId - [in] Identifier for a session context previously obtained using ** saHpiSessionOpen(). ** Timeout - [out] Pointer to location to store the number of nanoseconds to ** wait before autonomous handling of the hot swap event. Reserved time out ** values: ** * SAHPI_TIMEOUT_IMMEDIATE indicates autonomous handling is immediate. ** * SAHPI_TIMEOUT_BLOCK indicates autonomous handling does not occur. ** ** Return Value: ** SA_OK is returned on successful completion; otherwise, an error code is ** returned. ** SA_ERR_HPI_INVALID_PARAMS is returned if the Timeout pointer is passed in ** as NULL. ** ** Remarks: ** Each domain maintains a single auto-insert timeout value and it is applied ** to all contained resources upon insertion, which support managed hot swap. ** Further information on the auto-insert timeout can be found in the function ** saHpiAutoInsertTimeoutSet(). ** *******************************************************************************/ SaErrorT SAHPI_API saHpiAutoInsertTimeoutGet( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_OUT SaHpiTimeoutT *Timeout ); /******************************************************************************* ** ** Name: saHpiAutoInsertTimeoutSet() ** ** Description: ** This function allows an HPI User to configure a timeout for how long to ** wait before the default auto insertion policy is invoked on a resource that ** supports managed hot swap within a specific domain. ** ** Parameters: ** SessionId - [in] Identifier for a session context previously obtained using ** saHpiSessionOpen(). ** Timeout - [in] The number of nanoseconds to wait before autonomous handling ** of the hot swap event. Reserved time out values: ** * SAHPI_TIMEOUT_IMMEDIATE indicates proceed immediately to autonomous ** handling. ** * SAHPI_TIMEOUT_BLOCK indicates prevent autonomous handling. ** ** Return Value: ** SA_OK is returned on successful completion; otherwise, an error code is ** returned. ** SA_ERR_HPI_READ_ONLY is returned if the auto-insert timeout for the domain ** is fixed as indicated by the SAHPI_DOMAIN_CAP_AUTOINSERT_READ_ONLY flag ** in the DomainInfo structure. ** SA_ERR_HPI_INVALID_PARAMS is returned when the Timeout parameter is not set ** to SAHPI_TIMEOUT_BLOCK, SAHPI_TIMEOUT_IMMEDIATE or a positive value. ** ** Remarks: ** This function accepts a parameter instructing each resource that supports ** managed hot swap to impose a delay before performing its hot swap policy ** for auto insertion. The parameter may be set to SAHPI_TIMEOUT_IMMEDIATE to ** direct resources to proceed immediately to auto insertion, or to ** SAHPI_TIMEOUT_BLOCK to prevent auto insertion policy from running until an ** HPI User calls saHpiResourceActiveSet(). If the parameter is set to ** another value, it defines the number of nanoseconds between the time a hot ** swap event with HotSwapState = SAHPI_HS_STATE_INSERTION_PENDING is ** generated and the time that the auto insertion policy is started for that ** resource. If, during this time period, an saHpiHotSwapPolicyCancel() ** function call is processed, the timer is stopped, and the auto insertion ** policy is not invoked. Each domain maintains a single auto insertion ** timeout value, and this value is applied to all contained resources that ** support managed hot swap. ** ** Once the auto-insertion policy begins, an HPI User is not allowed to cancel ** the insertion policy; hence, the timeout should be set appropriately to ** allow for this condition. Note that the timeout period begins when the hot ** swap event with HotSwapState = SAHPI_HS_STATE_INSERTION_PENDING is ** initially generated; not when it is received by an HPI User with a ** saHpiEventGet() function call, or even when it is placed in a session event ** queue. ** ** A resource may exist in multiple domains, which themselves may have ** different auto-insertion timeout values. Upon insertion, the resource ** begins its auto-insertion policy based on the smallest auto-insertion ** timeout value. As an example, if a resource is inserted into two domains, ** one with an auto-insertion timeout of 5 seconds, and one with an ** auto-insertion timeout of 10 seconds, the resource begins its ** auto-insertion policy at 5 seconds. A resource may also be designed to ** always immediately begin execution of its auto insertion policy upon ** insertion. The SAHPI_HS_CAPABILITY_AUTOINSERT_IMMEDIATE flag will be set ** in the RPT entry of such a resource. ** ** A domain may have a fixed, preset timeout value used for all resources. ** In such cases, the SAHPI_DOMAIN_CAP_AUTOINSERT_READ_ONLY flag is set to ** indicate that an HPI User cannot change the auto insertion timeout value. ** SA_ERR_HPI_READ_ONLY is returned if an HPI User attempts to change a ** read-only timeout. ** *******************************************************************************/ SaErrorT SAHPI_API saHpiAutoInsertTimeoutSet( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiTimeoutT Timeout ); /******************************************************************************* ** ** Name: saHpiAutoExtractTimeoutGet() ** ** Description: ** This function allows an HPI User to request the timeout for how long a ** resource that supports managed hot swap waits after transitioning to ** EXTRACTION PENDING state before the default auto-extraction policy is ** invoked. ** ** Parameters: ** SessionId - [in] Identifier for a session context previously obtained using ** saHpiSessionOpen(). ** ResourceId - [in] Resource identified for this operation. ** Timeout - [out] Pointer to location to store the number of nanoseconds to ** wait before autonomous handling of the hot swap event. Reserved time out ** values: ** * SAHPI_TIMEOUT_IMMEDIATE indicates autonomous handling is immediate. ** * SAHPI_TIMEOUT_BLOCK indicates autonomous handling does not occur. ** ** Return Value: ** SA_OK is returned on successful completion; otherwise, an error code is ** returned. ** SA_ERR_HPI_CAPABILITY is returned if the resource does not support managed ** hot swap, as indicated by SAHPI_CAPABILITY_MANAGED_HOTSWAP in the ** resource's RPT entry. ** SA_ERR_HPI_INVALID_PARAMS is returned if the Timeout pointer is passed in ** as NULL. ** ** Remarks: ** This function is only supported by resources that support Managed Hot Swap. ** Further information on auto extraction timeouts is detailed in ** saHpiAutoExtractTimeoutSet(). ** *******************************************************************************/ SaErrorT SAHPI_API saHpiAutoExtractTimeoutGet( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId, SAHPI_OUT SaHpiTimeoutT *Timeout ); /******************************************************************************* ** ** Name: saHpiAutoExtractTimeoutSet() ** ** Description: ** This function allows an HPI User to configure a timeout for how long a ** resource that supports managed hot swap will wait before the auto ** extraction policy is invoked. ** ** Parameters: ** SessionId - [in] Identifier for a session context previously obtained using ** saHpiSessionOpen(). ** ResourceId - [in] Resource identified for this operation. ** Timeout - [in] The number of nanoseconds to wait before autonomous handling ** of the hot swap event. Reserved timeout values: ** * SAHPI_TIMEOUT_IMMEDIATE indicates proceed immediately to autonomous ** handling. ** * SAHPI_TIMEOUT_BLOCK indicates prevent autonomous handling. ** ** Return Value: ** SA_OK is returned on successful completion; otherwise, an error code is ** returned. ** SA_ERR_HPI_CAPABILITY is returned if the resource does not support managed ** hot swap, as indicated by SAHPI_CAPABILITY_MANAGED_HOTSWAP in the ** resource's RPT entry. ** SA_ERR_HPI_INVALID_PARAMS is returned when the Timeout parameter is not set ** to SAHPI_TIMEOUT_BLOCK, SAHPI_TIMEOUT_IMMEDIATE or a positive value. ** SA_ERR_HPI_READ_ONLY is returned if the auto-extract timeout for the ** resource is fixed, as indicated by the ** SAHPI_HS_CAPABILITY_AUTOEXTRACT_READ_ONLY in the resource's RPT entry. ** ** Remarks: ** This function accepts a parameter instructing the resource to impose a ** delay before performing its hot swap policy for auto extraction. The ** parameter may be set to SAHPI_TIMEOUT_IMMEDIATE to direct the resource ** to proceed immediately to auto extraction, or to SAHPI_TIMEOUT_BLOCK to ** prevent the auto extraction policy from running until an HPI User calls ** saHpiResourceInactiveSet(). If the parameter is set to another value, it ** defines the number of nanoseconds between the time a hot swap event with ** HotSwapState = SAHPI_HS_STATE_EXTRACTION_PENDING is generated and the time ** that the auto extraction policy is invoked for the resource. If, during ** this time period, an saHpiHotSwapPolicyCancel() function call is processed, ** the timer is stopped, and the auto extraction policy is not invoked. ** ** Once the auto-extraction policy begins, an HPI User is not allowed to ** cancel the extraction policy; hence, the timeout should be set ** appropriately to allow for this condition. Note that the timeout period ** begins when the hot swap event with HotSwapState = ** SAHPI_HS_STATE_EXTRACTION_PENDING is initially generated; not when it is ** received by a HPI User with a saHpiEventGet() function call, or even when ** it is placed in a session event queue. ** ** The auto extraction timeout period is set at the resource level and is ** only supported by resources supporting the Managed Hot Swap capability. ** After discovering that a newly inserted resource supports Managed Hot Swap, ** an HPI User may use this function to change the timeout of the auto ** extraction policy for that resource. ** ** An implementation may enforce a fixed, preset timeout value. In such ** cases, the RPT entry for the resource will have the ** SAHPI_HS_CAPABILITY_AUTOEXTRACT_READ_ONLY flag set to indicate that an ** HPI User cannot change the auto extraction timeout value. ** SA_ERR_HPI_READ_ONLY is returned if an HPI User attempts to change a ** read-only timeout. ** *******************************************************************************/ SaErrorT SAHPI_API saHpiAutoExtractTimeoutSet( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId, SAHPI_IN SaHpiTimeoutT Timeout ); /******************************************************************************* ** ** Name: saHpiHotSwapStateGet() ** ** Description: ** This function allows an HPI User to retrieve the current hot swap state of ** a resource. ** ** Parameters: ** SessionId - [in] Identifier for a session context previously obtained using ** saHpiSessionOpen(). ** ResourceId - [in] Resource identified for this operation. ** State - [out] Pointer to location to store returned state information. ** ** Return Value: ** SA_OK is returned on successful completion; otherwise, an error code is ** returned. ** SA_ERR_HPI_CAPABILITY is returned if the resource does not support managed ** hot swap, as indicated by SAHPI_CAPABILITY_MANAGED_HOTSWAP in the ** resource's RPT entry. ** SA_ERR_HPI_INVALID_PARAMS is returned if the State pointer is passed in as ** NULL. ** ** Remarks: ** The returned state is one of the following four states: ** * SAHPI_HS_STATE_INSERTION_PENDING ** * SAHPI_HS_STATE_ACTIVE ** * SAHPI_HS_STATE_EXTRACTION_PENDING ** * SAHPI_HS_STATE_INACTIVE ** ** The state SAHPI_HS_STATE_NOT_PRESENT is never returned, because a resource ** that is not present cannot be addressed by this function in the first ** place. ** *******************************************************************************/ SaErrorT SAHPI_API saHpiHotSwapStateGet ( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId, SAHPI_OUT SaHpiHsStateT *State ); /******************************************************************************* ** ** Name: saHpiHotSwapActionRequest() ** ** Description: ** This function allows an HPI User to invoke an insertion or extraction ** process via software on a resource that supports managed hot swap. ** ** Parameters: ** SessionId - [in] Identifier for a session context previously obtained using ** saHpiSessionOpen(). ** ResourceId - [in] Resource identified for this operation. ** Action - [in] Requested action: ** * SAHPI_HS_ACTION_INSERTION ** * SAHPI_HS_ACTION_EXTRACTION ** ** Return Value: ** SA_OK is returned on successful completion; otherwise, an error code is ** returned. ** SA_ERR_HPI_CAPABILITY is returned if the resource does not support managed ** hot swap, as indicated by SAHPI_CAPABILITY_MANAGED_HOTSWAP in the ** resource's RPT entry. ** SA_ERR_HPI_INVALID_REQUEST is returned if the resource is not in an ** appropriate hot swap state, or if the requested action is inappropriate ** for the current hot swap state. See the Remarks section below. ** SA_ERR_HPI_INVALID_PARAMS is returned when Action is not one of the valid ** enumerated values for this type. ** ** Remarks: ** A resource supporting hot swap typically requires a physical action on the ** associated FRU to invoke an insertion or extraction process. An insertion ** process is invoked by physically inserting the FRU into a chassis. ** Physically opening an ejector latch or pressing a button invokes the ** extraction process. This function provides an alternative means to invoke ** an insertion or extraction process via software. ** This function may only be called: ** * To request an insertion action when the resource is in INACTIVE state. ** * To request an extraction action when the resource is in the ACTIVE ** state. ** The function may not be called when the resource is in any other state. ** *******************************************************************************/ SaErrorT SAHPI_API saHpiHotSwapActionRequest ( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId, SAHPI_IN SaHpiHsActionT Action ); /******************************************************************************* ** ** Name: saHpiHotSwapIndicatorStateGet() ** ** Description: ** This function allows an HPI User to retrieve the state of the hot swap ** indicator. A FRU associated with a resource that supports managed hot swap ** may include a hot swap indicator such as a blue LED. This indicator ** signifies that the FRU is ready for removal. ** ** Parameters: ** SessionId - [in] Identifier for a session context previously obtained using ** saHpiSessionOpen(). ** ResourceId - [in] Resource identified for this operation. ** State - [out] Pointer to location to store state of hot swap indicator. ** ** Return Value: ** SA_OK is returned on successful completion; otherwise, an error code is ** returned. ** SA_ERR_HPI_CAPABILITY is returned if the resource does not support: ** * Managed hot swap, as indicated by SAHPI_CAPABILITY_MANAGED_HOTSWAP in ** the resource's RPT entry. ** * A hot swap indicator on the FRU as indicated by the ** SAHPI_HS_CAPABILITY_INDICATOR_SUPPORTED in the resource's RPT entry. ** SA_ERR_HPI_INVALID_PARAMS is returned if the State pointer is passed in as ** NULL. ** ** Remarks: ** The returned state is either SAHPI_HS_INDICATOR_OFF or ** SAHPI_HS_INDICATOR_ON. This function returns the state of the indicator, ** regardless of what hot swap state the resource is in. ** ** This function is only supported by resources that support managed hot swap. ** Furthermore, not all resources supporting managed hot swap necessarily ** support this function. Whether a resource supports the hot swap indicator ** is specified in the Hot Swap Capabilities field of the RPT entry. ** *******************************************************************************/ SaErrorT SAHPI_API saHpiHotSwapIndicatorStateGet ( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId, SAHPI_OUT SaHpiHsIndicatorStateT *State ); /******************************************************************************* ** ** Name: saHpiHotSwapIndicatorStateSet() ** ** Description: ** This function allows an HPI User to set the state of the hot swap ** indicator. A FRU associated with a resource that supports managed hot swap ** may include a hot swap indicator such as a blue LED. This indicator ** signifies that the FRU is ready for removal. ** ** Parameters: ** SessionId - [in] Identifier for a session context previously obtained using ** saHpiSessionOpen(). ** ResourceId - [in] Resource identified for this operation. ** State - [in] State of hot swap indicator to be set. ** ** Return Value: ** SA_OK is returned on successful completion; otherwise, an error code is ** returned. ** SA_ERR_HPI_CAPABILITY is returned if the resource does not support: ** * Managed hot swap, as indicated by SAHPI_CAPABILITY_MANAGED_HOTSWAP in ** the resource's RPT entry. ** * A hot swap indicator on the FRU as indicated by the ** SAHPI_HS_CAPABILITY_INDICATOR_SUPPORTED in the resource's RPT entry. ** SA_ERR_HPI_INVALID_PARAMS is returned when State is not one of the valid ** enumerated values for this type. ** ** Remarks: ** Valid states include SAHPI_HS_INDICATOR_OFF or SAHPI_HS_INDICATOR_ON. This ** function sets the indicator regardless of what hot swap state the resource ** is in, though it is recommended that this function be used only in ** conjunction with moving the resource to the appropriate hot swap state. ** ** This function is only supported by resources that support managed hot swap. ** Furthermore, not all resources supporting managed hot swap necessarily ** support this function. Whether or not a resource supports the hot swap ** indicator is specified in the Hot Swap Capabilities field of the RPT entry. ** *******************************************************************************/ SaErrorT SAHPI_API saHpiHotSwapIndicatorStateSet ( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId, SAHPI_IN SaHpiHsIndicatorStateT State ); /******************************************************************************* ** ** Name: saHpiParmControl() ** ** Description: ** This function allows an HPI User to save and restore parameters associated ** with a specific resource. ** ** Parameters: ** SessionId - [in] Identifier for a session context previously obtained using ** saHpiSessionOpen(). ** ResourceId - [in] Resource identified for this operation. ** Action - [in] Action to perform on resource parameters. ** * SAHPI_DEFAULT_PARM Restores the factory default settings for a ** specific resource. Factory defaults include Sensor thresholds and ** configurations, and resource- specific configuration parameters. ** * SAHPI_SAVE_PARM Stores the resource configuration parameters in ** non-volatile stor"age. Resource configuration parameters stored in ** non-volatile stor"age survive power cycles and resource resets. ** * SAHPI_RESTORE_PARM Restores resource configuration parameters from ** non-volatile stor"age. Resource configuration parameters include ** Sensor thresholds and Sensor configurations, as well as ** resource-specific parameters. ** ** Return Value: ** SA_OK is returned on successful completion; otherwise, an error code is ** returned. ** SA_ERR_HPI_CAPABILITY is returned if the resource does not support ** parameter control, as indicated by SAHPI_CAPABILITY_CONFIGURATION in the ** resource's RPT entry. ** SA_ERR_HPI_INVALID_PARAMS is returned when Action is not set to a proper ** value. ** ** Remarks: ** Resource-specific parameters should be documented in an implementation ** guide for the HPI implementation. ** ** When this API is called with SAHPI_RESTORE_PARM as the action prior to ** having made a call with this API where the action parameter was set to ** SAHPI_SAVE_PARM, the default parameters are restored. ** *******************************************************************************/ SaErrorT SAHPI_API saHpiParmControl ( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId, SAHPI_IN SaHpiParmActionT Action ); /******************************************************************************* ** ** Name: saHpiResourceLoadIdGet() ** ** Description: ** This function gets the Load Id of an entity, allowing an HPI User to ** discover what software the entity will load the next time it initiates a ** software load. ** ** Parameters: ** SessionId - [in] Identifier for a session context previously obtained using ** saHpiSessionOpen(). ** ResourceId - [in] Resource identified for this operation. The entity ** defined in the RPT entry for the Resource is the entity addressed by ** this API. ** LoadId - [out] The current Load Id. Load Id is determined by the contents ** of LoadId->LoadNumber and LoadId->LoadName. If LoadId->LoadNumber is: ** * SAHPI_LOAD_ID_DEFAULT: The entity will load implementation-defined ** default software, ** * SAHPI_LOAD_ID_BYNAME: The entity will load software identified by the ** contents of LoadId->LoadName, ** * Any other value: The entity will load software identified by the value ** of LoadId->LoadNumber. ** ** Return Value: ** SA_OK is returned on successful completion; otherwise, an error code is ** returned. ** SA_ERR_HPI_CAPABILITY is returned if the resource does not support load id ** management, as indicated by SAHPI_CAPABILITY_LOAD_ID in the resource's ** RPT entry. ** SA_ERR_HPI_INVALID_PARAMS is returned if the LoadId pointer is passed in ** as NULL. ** ** Remarks: ** Mapping of LoadId->LoadNumber and LoadId->LoadName to specific software ** loads is implementation specific. ** *******************************************************************************/ SaErrorT SAHPI_API saHpiResourceLoadIdGet ( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId, SAHPI_OUT SaHpiLoadIdT *LoadId ); /******************************************************************************* ** ** Name: saHpiResourceLoadIdSet() ** ** Description: ** This function sets the Load Id of an entity, allowing an HPI User to ** control which software the entity will load the next time it initiates a ** software load. ** ** Parameters: ** SessionId - [in] Identifier for a session context previously obtained using ** saHpiSessionOpen(). ** ResourceId - [in] Resource identified for this operation. The entity ** defined in the RPT entry for the Resource is the entity addressed by ** this API. ** LoadId - [in] The Load Id to be set. Load Id is determined by the contents ** of LoadId->LoadNumber and LoadId->LoadName. If LoadId->LoadNumber is: ** * SAHPI_LOAD_ID_DEFAULT: The entity will load implementation-defined ** default software, ** * SAHPI_LOAD_ID_BYNAME: The entity will load software identified by the ** contents of LoadId->LoadName, ** * Any other value: The entity will load software identified by the ** value of LoadId->LoadNumber. ** ** Return Value: ** SA_OK is returned on successful completion; otherwise, an error code is ** returned. ** SA_ERR_HPI_CAPABILITY is returned if the resource does not support load ** management, as indicated by SAHPI_CAPABILITY_LOAD in the resource's RPT ** entry. ** SA_ERR_HPI_INVALID_DATA is returned if: ** * LoadId->LoadNumber is SAHPI_LOAD_DEFAULT and the resource does not ** have a default load defined. ** * LoadId->LoadNumber is SAHPI_LOAD_BYNAME and the resource does not ** support identifying loads by name. ** * LoadId->LoadNumber is SAHPI_LOAD_BYNAME and the contents of ** * LoadId->LoadName do not correspond to a currently valid software load. ** * LoadId->LoadNumber is some value other than SAHPI_LOAD_DEFAULT or ** SAHPI_LOAD_BYNAME and the value of LoadId->LoadNumber does not ** correspond to a currently valid software load. ** ** Remarks: ** Interpretation of LoadId->LoadNumber and LoadId->LoadName is implementation ** specific. Any particular value or contents of the LoadId->LoadName may be ** invalid for an implementation. If an invalid value is passed, the function ** returns an error. ** *******************************************************************************/ SaErrorT SAHPI_API saHpiResourceLoadIdSet ( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId, SAHPI_IN SaHpiLoadIdT *LoadId ); /******************************************************************************* ** ** Name: saHpiResourceResetStateGet() ** ** Description: ** This function gets the reset state of an entity, allowing an HPI User to ** determine if the entity is being held with its reset asserted. This ** function addresses the entity that is identified in the RPT entry for the ** resource. ** ** Parameters: ** SessionId - [in] Identifier for a session context previously obtained using ** saHpiSessionOpen(). ** ResourceId - [in] Resource identified for this operation. ** ResetAction - [out] The current reset state of the entity. Valid reset ** states are: ** * SAHPI_RESET_ASSERT: The entity's reset is asserted, e.g., for hot swap ** insertion/extraction purposes. ** * SAHPI_RESET_DEASSERT: The entity's reset is not asserted. ** ** Return Value: ** SA_OK is returned if the resource has reset control, and the reset state ** has successfully been determined; otherwise, an error code is returned. ** SA_ERR_HPI_CAPABILITY is returned if the resource does not support reset ** control as indicated by SAHPI_CAPABILITY_RESET in the resource's RPT ** entry. ** SA_ERR_HPI_INVALID_PARAMS is returned if the ResetAction pointer is passed ** in as NULL. ** ** Remarks: ** SAHPI_COLD_RESET and SAHPI_WARM_RESET are pulsed resets, and are not valid ** values to be returned in ResetAction. If the entity is not being held in ** reset (using SAHPI_RESET_ASSERT), the appropriate value is ** SAHPI_RESET_DEASSERT. ** *******************************************************************************/ SaErrorT SAHPI_API saHpiResourceResetStateGet ( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId, SAHPI_OUT SaHpiResetActionT *ResetAction ); /******************************************************************************* ** ** Name: saHpiResourceResetStateSet() ** ** Description: ** This function directs the resource to perform the specified reset type on ** the entity that it manages. This function addresses the entity that is ** identified in the RPT entry for the resource. ** ** Parameters: ** SessionId - [in] Identifier for a session context previously obtained using ** saHpiSessionOpen(). ** ResourceId - [in] Resource identified for this operation. ** ResetAction - [in] Type of reset to perform on the entity. Valid reset ** actions are: ** * SAHPI_COLD_RESET: Perform a "Cold Reset" on the entity (pulse), ** leaving reset de-asserted, ** * SAHPI_WARM_RESET: Perform a "Warm Reset" on the entity (pulse), ** leaving reset de-asserted, ** * SAHPI_RESET_ASSERT: Put the entity into reset state and hold reset ** asserted, e.g., for hot swap insertion/extraction purposes, ** * SAHPI_RESET_DEASSERT: Bring the entity out of the reset state. ** ** Return Value: ** SA_OK is returned if the resource has reset control, and the requested ** reset action has succeeded; otherwise, an error code is returned. ** SA_ERR_HPI_CAPABILITY is returned if the resource does not support resource ** reset control, as indicated by SAHPI_CAPABILITY_RESET in the resource's ** RPT entry. ** SA_ERR_HPI_INVALID_PARAMS is returned when the ResetAction is not one of ** the valid enumerated values for this type. ** SA_ERR_HPI_INVALID_CMD is returned if the requested ResetAction is ** SAHPI_RESET_ASSERT or SAHPI_WARM_RESET and the resource does not support ** this action. ** SA_ERR_HPI_INVALID_REQUEST is returned if the ResetAction is ** SAHPI_COLD_RESET or SAHPI_WARM_RESET and reset is currently asserted. ** ** Remarks: ** Some resources may not support holding the entity in reset or performing a ** warm reset. If this is the case, the resource should return ** SA_ERR_HPI_INVALID_CMD if the unsupported action is requested. All ** resources that have the SAHPI_CAPABILITY_RESET flag set in their RPTs must ** support SAHPI_COLD_RESET. * ** SAHPI_RESET_ASSERT is used to hold an entity in reset, and ** SAHPI_RESET_DEASSERT is used to bring the entity out of an asserted reset ** state. ** *******************************************************************************/ SaErrorT SAHPI_API saHpiResourceResetStateSet ( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId, SAHPI_IN SaHpiResetActionT ResetAction ); /******************************************************************************* ** ** Name: saHpiResourcePowerStateGet() ** ** Description: ** This function gets the power state of an entity, allowing an HPI User to ** determine if the entity is currently powered on or off. This function ** addresses the entity which is identified in the RPT entry for the resource. ** ** Parameters: ** SessionId - [in] Identifier for a session context previously obtained using ** saHpiSessionOpen(). ** ResourceId - [in] Resource identified for this operation. ** State - [out] The current power state of the resource. Valid power states ** are: ** * SAHPI_POWER_OFF: The entity's primary power is OFF, ** * SAHPI_POWER_ON: The entity's primary power is ON. ** ** Return Value: ** SA_OK is returned on successful completion; otherwise, an error code is ** returned. ** SA_ERR_HPI_CAPABILITY is returned if the resource does not support power ** management, as indicated by SAHPI_CAPABILITY_POWER in the resource's RPT ** entry. ** SA_ERR_HPI_INVALID_PARAMS is returned if the State pointer is passed in as ** NULL. ** ** Remarks: ** SAHPI_POWER_CYCLE is a pulsed power operation and is not a valid return for ** the power state. ** *******************************************************************************/ SaErrorT SAHPI_API saHpiResourcePowerStateGet ( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId, SAHPI_OUT SaHpiPowerStateT *State ); /******************************************************************************* ** ** Name: saHpiResourcePowerStateSet() ** ** Description: ** This function directs the resource to perform a power control action on ** the entity that is dientified in the RPT entry for the resource. ** ** Parameters: ** SessionId - [in] Identifier for a session context previously obtained using ** saHpiSessionOpen(). ** ResourceId - [in] Resource identified for this operation. ** State - [in] The requested power control action. Valid values are: ** * SAHPI_POWER_OFF: The entity's primary power is turned OFF, ** * SAHPI_POWER_ON: The entity's primary power is turned ON, ** * SAHPI_POWER_CYCLE: The entity's primary power is turned OFF, then ** turned ON. ** ** Return Value: ** SA_OK is returned on successful completion; otherwise, an error code is ** returned. ** SA_ERR_HPI_CAPABILITY is returned if the resource does not support power ** management, as indicated by SAHPI_CAPABILITY_POWER in the resource's RPT ** entry. ** SA_ERR_HPI_INVALID_PARAMS is returned when State is not one of the valid ** enumarated values for this type. ** ** Remarks: ** This function controls the hardware power on a FRU entity regardless of ** what hot-swap state the resource is in. For example, it is legal (and may ** be desirable) to cycle power on the FRU even while it is in ACTIVE state ** to attempt to clear a fault condition. Similarly, a resource could be ** instructed to power on a FRU even while it is in INACTIVE state, for ** example, to run off-line diagnostics. ** ** This function may also be supported for non-FRU entities if power control ** is available for those entities. ** *******************************************************************************/ SaErrorT SAHPI_API saHpiResourcePowerStateSet ( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId, SAHPI_IN SaHpiPowerStateT State ); #ifdef __cplusplus } #endif #endif /* __SAHPI_H */ openhpi-2.14.1/include/openhpi.h0000644000076400007640000000200211302567027013424 0ustar /* -*- linux-c -*- * * Copyright (c) 2003 by Intel Corp. * (C) Copyright IBM Corp. 2003, 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Louis Zhuang * Sean Dague * Rusty Lynch * Renier Morales */ #ifndef __OPENHPI_H #define __OPENHPI_H #include #include #include #include #include #include #include #include #include #include #include #include #ifdef __cplusplus extern "C" { #endif #ifdef __cplusplus } #endif #endif /* __OPENHPI_H */ openhpi-2.14.1/include/SaHpiAtca.h0000644000076400007640000005123711302567027013575 0ustar /******************************************************************************* ** ** FILE: ** SaHpiAtca.h ** ** DESCRIPTION: ** This file provides the C language binding for the Service ** Availability(TM) Forum HPI-to-AdvancedTCA Mapping Specification. ** It contains all of the prototypes and type definitions. Note, this ** file was generated from the HPI-to-AdvancedTCA mapping specification ** document. ** ** SPECIFICATION VERSION: ** SAIM-HPI-B.01.01-ATCA ** ** DATE: ** Fri Nov 18 2005 010:11 ** ** LEGAL: ** OWNERSHIP OF SPECIFICATION AND COPYRIGHTS. ** The Specification and all worldwide copyrights therein are ** the exclusive property of Licensor. You may not remove, obscure, or ** alter any copyright or other proprietary rights notices that are in or ** on the copy of the Specification you download. You must reproduce all ** such notices on all copies of the Specification you make. Licensor ** may make changes to the Specification, or to items referenced therein, ** at any time without notice. Licensor is not obligated to support or ** update the Specification. ** ** Copyright 2004 by the Service Availability Forum. All rights reserved. ** ** Permission to use, copy, modify, and distribute this software for any ** purpose without fee is hereby granted, provided that this entire notice ** is included in all copies of any software which is or includes a copy ** or modification of this software and in all copies of the supporting ** documentation for such software. ** ** THIS SOFTWARE IS BEING PROVIDED "AS IS", WITHOUT ANY EXPRESS OR IMPLIED ** WARRANTY. IN PARTICULAR, THE SERVICE AVAILABILITY FORUM DOES NOT MAKE ANY ** REPRESENTATION OR WARRANTY OF ANY KIND CONCERNING THE MERCHANTABILITY ** OF THIS SOFTWARE OR ITS FITNESS FOR ANY PARTICULAR PURPOSE. ** *******************************************************************************/ #ifndef __SAHPIATCA_H #define __SAHPIATCA_H /* * SaHpi.h contains the HPI data types that are used in this section */ #include "SaHpi.h" /*********************************************************************** ******** ************************************************************************ ******** ********** ********** ********** Basic Data Types and Values ********** ********** ********** ************************************************************************ ******** ************************************************************************ *******/ /* PICMG manufacturer identifier */ #define ATCAHPI_PICMG_MID 0x00315A /*********************************************************************** ******** ************************************************************************ ******** ********** ********** ********** LED Specific Data Types ********** ********** ********** ************************************************************************ ******** ************************************************************************ *******/ /* ** Color Capabilities ** ** This definition defines the possible color capabilities for an individual ** LED. One LED may support any number of colors using the bit mask. ** ** ATCAHPI_LED_WHITE ** Indicates that the LED supports illumination in WHITE. ** ATCAHPI_LED_ORANGE ** Indicates that the LED supports illumination in ORANGE. ** ATCAHPI_LED_AMBER ** Indicates that the LED supports illumination in AMBER. ** ATCAHPI_LED_GREEN ** Indicates that the LED supports illumination in GREEN. ** ATCAHPI_LED_RED ** Indicates that the LED supports illumination in RED. ** ATCAHPI_LED_BLUE ** Indicates that the LED supports illumination in BLUE. ** */ typedef SaHpiUint8T AtcaHpiColorCapabilitiesT; #define ATCAHPI_BLINK_COLOR_LED (AtcaHpiColorCapabilitiesT)0X80 #define ATCAHPI_LED_WHITE (AtcaHpiColorCapabilitiesT)0x40 #define ATCAHPI_LED_ORANGE (AtcaHpiColorCapabilitiesT)0x20 #define ATCAHPI_LED_AMBER (AtcaHpiColorCapabilitiesT)0x10 #define ATCAHPI_LED_GREEN (AtcaHpiColorCapabilitiesT)0x08 #define ATCAHPI_LED_RED (AtcaHpiColorCapabilitiesT)0x04 #define ATCAHPI_LED_BLUE (AtcaHpiColorCapabilitiesT)0x02 typedef enum { ATCAHPI_LED_COLOR_RESERVED = 0, ATCAHPI_LED_COLOR_BLUE, ATCAHPI_LED_COLOR_RED, ATCAHPI_LED_COLOR_GREEN, ATCAHPI_LED_COLOR_AMBER, ATCAHPI_LED_COLOR_ORANGE, ATCAHPI_LED_COLOR_WHITE, ATCAHPI_LED_COLOR_NO_CHANGE = 0x0E, ATCAHPI_LED_COLOR_USE_DEFAULT = 0x0F } AtcaHpiLedColorT; typedef enum { ATCAHPI_LED_AUTO, /*Set all LEDs under this Resource to Auto mode */ ATCAHPI_LED_MANUAL, /*Set all LEDs under this Resource to Manual mode*/ ATCAHPI_LED_LAMP_TEST /*Put all LEDs under this Resource in Lamp Test */ } AtcaHpiResourceLedModeT; typedef enum { ATCAHPI_LED_BR_SUPPORTED, /*Blinking Rates are Supported */ ATCAHPI_LED_BR_NOT_SUPPORTED, /*Blinking Rates are Not Supported */ ATCAHPI_LED_BR_UNKNOWN /*The HPI Implementation cannot determine whether or not Blinking Rates are supported. */ } AtcaHpiLedBrSupportT; /* * Control numbers for LED Controls. * Note: * 1. The Control numbers from ATCAHPI_CTRL_NUM_BLUE_LED to * ATCAHPI_CTRL_NUM_APP_LED + 0xFA are reserved for Application * Specific LED Controls. */ #define ATCAHPI_CTRL_NUM_BLUE_LED (SaHpiCtrlNumT)0x00 #define ATCAHPI_CTRL_NUM_LED1 (SaHpiCtrlNumT)0x01 #define ATCAHPI_CTRL_NUM_LED2 (SaHpiCtrlNumT)0x02 #define ATCAHPI_CTRL_NUM_LED3 (SaHpiCtrlNumT)0x03 #define ATCAHPI_CTRL_NUM_APP_LED (SaHpiCtrlNumT)0x04 /* * Indicator in the Resource level LED Control RDR that indicates * that this is a Control that aggregates all LEDs of a particular Resource. */ #define ATCAHPI_RESOURCE_AGGREGATE_LED 0xFF /*********************************************************************** ******** ************************************************************************ ******** ********** ********** ********** Entity Data Types ********** ********** ********** ************************************************************************ ******** ************************************************************************ *******/ /* ** ATCA Entity Definitions ** These definitions describe the ATCA specific Entity Types defined ** in this specification. ** Note that the entity types from, SAHPI_ENT_PHYSICAL_SLOT + 1 to ** SAHPI_ENT_PHYSICAL_SLOT + 20h and SAHPI_ENT_BATTERY + 1 to ** SAHPI_ENT_CHASSIS_SPECIFIC + Fh are reserved by this specification. ** ** ATCAHPI_ENT_POWER_ENTRY_MODULE_SLOT - Power Entry Module slot ** ATCAHPI_ENT_SHELF_FRU_DEVICE_SLOT - ATCA Shelf FRU information device slot ** ATCAHPI_ENT_SHELF_MANAGER_SLOT - Dedicated Shelf Managemer Slot ** ATCAHPI_ENT_FAN_TRAY_SLOT - Fan Tray slot ** ATCAHPI_ENT_FAN_FILTER_TRAY_SLOT - Fan Tray Filter slot ** ATCAHPI_ENT_ALARM_SLOT - Alarm Module slot ** ATCAHPI_ENT_AMC_SLOT - ATCA AMC card slot ** ATCAHPI_ENT_PMC_SLOT - PMC card slot ** ATCAHPI_ENT_RTM_SLOT - Rear Transition Module slot ** ** ATCAHPI_ENT_PICMG_FRONT_BLADE - ATCA Field Replaceable Front Board ** ATCAHPI_ENT_SHELF_FRU_DEVICE - ATCA Shelf FRU Information Device ** ATCAHPI_ENT_FILTRATION_UNIT - Air Filtration module ** ATCAHPI_ENT_AMC - ATCA AMC card ** */ typedef SaHpiEntityTypeT AtcaHpiEntityTypeT; #define ATCAHPI_ENT_POWER_ENTRY_MODULE_SLOT \ (AtcaHpiEntityTypeT)(SAHPI_ENT_CHASSIS_SPECIFIC + 1) #define ATCAHPI_ENT_SHELF_FRU_DEVICE_SLOT \ (AtcaHpiEntityTypeT)(SAHPI_ENT_CHASSIS_SPECIFIC + 2) #define ATCAHPI_ENT_SHELF_MANAGER_SLOT \ (AtcaHpiEntityTypeT)(SAHPI_ENT_CHASSIS_SPECIFIC + 3) #define ATCAHPI_ENT_FAN_TRAY_SLOT \ (AtcaHpiEntityTypeT)(SAHPI_ENT_CHASSIS_SPECIFIC + 4) #define ATCAHPI_ENT_FAN_FILTER_TRAY_SLOT \ (AtcaHpiEntityTypeT)(SAHPI_ENT_CHASSIS_SPECIFIC + 5) #define ATCAHPI_ENT_ALARM_SLOT \ (AtcaHpiEntityTypeT)(SAHPI_ENT_CHASSIS_SPECIFIC + 6) #define ATCAHPI_ENT_AMC_SLOT \ (AtcaHpiEntityTypeT)(SAHPI_ENT_CHASSIS_SPECIFIC + 7) #define ATCAHPI_ENT_PMC_SLOT \ (AtcaHpiEntityTypeT)(SAHPI_ENT_CHASSIS_SPECIFIC + 8) #define ATCAHPI_ENT_RTM_SLOT \ (AtcaHpiEntityTypeT)(SAHPI_ENT_CHASSIS_SPECIFIC + 9) #define ATCAHPI_ENT_PICMG_FRONT_BLADE \ (AtcaHpiEntityTypeT)(SAHPI_ENT_PHYSICAL_SLOT + 1) #define ATCAHPI_ENT_SHELF_FRU_DEVICE \ (AtcaHpiEntityTypeT)(SAHPI_ENT_PHYSICAL_SLOT + 2) #define ATCAHPI_ENT_FILTRATION_UNIT \ (AtcaHpiEntityTypeT)(SAHPI_ENT_PHYSICAL_SLOT + 3) #define ATCAHPI_ENT_AMC \ (AtcaHpiEntityTypeT)(SAHPI_ENT_PHYSICAL_SLOT + 4) /*********************************************************************** ******** ************************************************************************ ******** ********** ********** ********** Shelf Resource Data Types ********** ********** ********** ************************************************************************ ******** ************************************************************************ *******/ /* * Sensor/Control numbers for: * Shelf FRU Info Valid Sensor * Shelf Address Control * Shelf Manager IP Address Control * Chassis Status Control */ #define ATCAHPI_SENSOR_NUM_SHELF_INFO_VALID (SaHpiSensorNumT)0x1000 #define ATCAHPI_CTRL_NUM_SHELF_ADDRESS (SaHpiCtrlNumT)0x1000 #define ATCAHPI_CTRL_NUM_SHELF_IP_ADDRESS (SaHpiCtrlNumT)0x1001 #define ATCAHPI_CTRL_NUM_SHELF_STATUS (SaHpiCtrlNumT)0x1002 /* * Sensor/Control numbers for: * FRU Power On Sequence Control * Note that the Control numbers from ATCAHPI_CTRL_NUM_FRU_POWER_ON_SEQUENCE to * ATCAHPI_CTRL_NUM_FRU_POWER_ON_SEQUENCE + FEh are reserved for FRU Power On * Sequence Controls. */ #define ATCAHPI_SENSOR_NUM_PWRONSEQ_COMMIT_STATUS (SaHpiSensorNumT)0x1300 #define ATCAHPI_CTRL_NUM_FRU_POWER_ON_SEQUENCE_COMMIT (SaHpiCtrlNumT)0x1300 #define ATCAHPI_CTRL_NUM_FRU_POWER_ON_SEQUENCE (SaHpiCtrlNumT)0x1301 /* * Chassis Status Control */ /* Bitmask for Current Power State */ typedef SaHpiUint8T AtcaHpiCsCurrentPwrState; /* Maps to OEM Control state byte [2] for the Chassis Status Control */ #define ATCAHPI_CS_CPS_PWR_ON (AtcaHpiCsCurrentPwrState)0x01 /* If bit is set, powered on, powered off otherwise */ #define ATCAHPI_CS_CPS_PWR_OVERLOAD (AtcaHpiCsCurrentPwrState)0x02 /* If bit is set, chassis shut down due to power overload */ #define ATCAHPI_CS_CPS_INTERLOCK (AtcaHpiCsCurrentPwrState)0x04 /* If bit is set, chassis shut down due to interlock switch being active */ #define ATCAHPI_CS_CPS_PWR_FAULT (AtcaHpiCsCurrentPwrState)0x08 /* If bit is set, fault detected in main power subsystem */ #define ATCAHPI_CS_CPS__PWR_CTRL_FAULT (AtcaHpiCsCurrentPwrState)0x10 /* If bit is set, fault in power Control to power up/down */ #define ATCAHPI_CS_CPS_PWR_RESTORE_PWR_UP_PREV (AtcaHpiCsCurrentPwrState)0x20 /* If bit is set, after power restoration, chassis is restored to the state it was in, else chassis stays powered off after power restoration */ #define ATCAHPI_CS_CPS_PWR_RESTORE_PWR_UP (AtcaHpiCsCurrentPwrState)0x40 /* If bit is set, chassis powers up after power restoration */ #define ATCAHPI_CS_CPS_PWR_RESTORE_UNKNOWN (AtcaHpiCsCurrentPwrState)0x60 /* If bits are set, unknown */ /* Bitmask for Last Power Event */ typedef SaHpiUint8T AtcaHpiCsLastPwrEvent; /* maps to OEM Control state byte [3]for the Chassis Status Control */ #define ATCAHPI_CS_LPEVT_AC_FAILED (AtcaHpiCsLastPwrEvent)0x01 /* If bit is set, AC failed */ #define ATCAHPI_CS_LPEVT_PWR_OVERLOAD (AtcaHpiCsLastPwrEvent)0x02 /* If bit is set, last power down caused by a Power overload */ #define ATCAHPI_CS_LPEVT_PWR_INTERLOCK (AtcaHpiCsLastPwrEvent)0x04 /* If bit is set, last power down caused by a power interlock being activated */ #define ATCAHPI_CS_LPEVT_PWR_FAULT (AtcaHpiCsLastPwrEvent)0x08 /* If bit is set, last power down caused by power fault */ #define ATCAHPI_CS_LPEVT_PWRON_IPMI (AtcaHpiCsLastPwrEvent)0x10 /* If bit is set, last 'Power is on' state was entered via IPMI command */ /* Bitmask for Miscellaneous Chassis State */ typedef SaHpiUint8T AtcaHpiCsMiscChassisState; /* maps to OEM Control state byte [4] for the Chassis Status Control */ #define ATCAHPI_CS_MISC_CS_INTRUSION_ACTIVE (AtcaHpiCsMiscChassisState)0x01 /* If bit is set, Chassis intrusion is active */ #define ATCAHPI_CS_MISC_CS_FP_LOCKOUT_ACTIVE (AtcaHpiCsMiscChassisState)0x02 /* If bit is set, Front Panel Lockout is active (power off and reset via chassis push-buttons disabled) */ #define ATCAHPI_CS_MISC_CS_DRIVE_FAULT (AtcaHpiCsMiscChassisState)0x04 /* If bit is set, indicates Drive Fault */ #define ATCAHPI_CS_MISC_CS_COOLING_FAULT (AtcaHpiCsMiscChassisState)0x08 /* If bit is set, Cooling/fan fault detected */ /* Bitmask for Front Panel Button Capabilities and disable/enable status */ typedef SaHpiUint8T AtcaHpiCsFpButtonCap; /* maps to OEM Control state byte [5] for the Chassis Status Control */ #define ATCAHPI_CS_FP_BUTTON_PWR_OFF (AtcaHpiCsFpButtonCap)0x01 /* If bit is set, power off button is disabled */ #define ATCAHPI_CS_FP_BUTTON_RESET_OFF (AtcaHpiCsFpButtonCap)0x02 /* If bit is set, reset button is disabled */ #define ATCAHPI_CS_FP_BUTTON_DIAGINTR_OFF (AtcaHpiCsFpButtonCap)0x04 /* If bit is set, diagnostic interrupt button is disabled */ #define ATCAHPI_CS_FP_BUTTON_STANDBY_OFF (AtcaHpiCsFpButtonCap)0x08 /* If bit is set, standby button is disabled */ #define ATCAHPI_CS_FP_BUTTON_ALLOW_PWR_OFF (AtcaHpiCsFpButtonCap)0x10 /* If bit is set, power off button disable is allowed */ #define ATCAHPI_CS_FP_BUTTON_ALLOW_RESET_OFF (AtcaHpiCsFpButtonCap)0x20 /* If bit is set, reset button disable is allowed */ #define ATCAHPI_CS_FP_BUTTON_ALLOW_DIAGINTR_OFF (AtcaHpiCsFpButtonCap)0x40 /* If bit is set, diagnostic interrupt button disable is allowed */ #define ATCAHPI_CS_FP_BUTTON_ALLOW_STANDBY_OFF (AtcaHpiCsFpButtonCap)0x80 /* If bit is set, standby button disable is allowed */ /*********************************************************************** ******** ************************************************************************ ******** ********** ********** ********** Shelf Manager Resource Data Types ********** ********** ********** ************************************************************************ ******** ************************************************************************ *******/ /* * Sensor/Control numbers for: * Shelf Manager Failover Control * Shelf Manager Redundancy Sensor * Active Shelf Manager Sensor * Standby Shelf Manager Sensor */ #define ATCAHPI_SENSOR_NUM_SHMGR_REDUNDANCY (SaHpiSensorNumT)0x1001 #define ATCAHPI_SENSOR_NUM_SHMGR_ACTIVE (SaHpiSensorNumT)0x1002 #define ATCAHPI_SENSOR_NUM_SHMGR_STANDBY (SaHpiSensorNumT)0x1003 #define ATCAHPI_CTRL_NUM_SHMGR_FAILOVER (SaHpiCtrlNumT)0x1010 #define ATCAHPI_CTRL_NUM_FAILED_RESOURCE_EXTRACT (SaHpiCtrlNumT)0x101E /*********************************************************************** ******** ************************************************************************ ******** ********** ********** ********** FRU Slot Resource Data Types ********** ********** ********** ************************************************************************ ******** ************************************************************************ *******/ /* * Control/Sensor numbers for: * FRU Activation Control * Slot State Sensor * Assigned Power Sensor * Maximum Power Sensor */ #define ATCAHPI_SENSOR_NUM_SLOT_STATE (SaHpiSensorNumT)0x1010 #define ATCAHPI_SENSOR_NUM_ASSIGNED_PWR (SaHpiSensorNumT)0x1011 #define ATCAHPI_SENSOR_NUM_MAX_PWR (SaHpiSensorNumT)0x1012 #define ATCAHPI_CTRL_NUM_FRU_ACTIVATION (SaHpiCtrlNumT)0x1020 /*********************************************************************** ******** ************************************************************************ ******** ********** ********** ********** FRU Resource Data Types ********** ********** ********** ************************************************************************ ******** ************************************************************************ *******/ /* * Sensor/Control numbers for: * IPMB0 Sensor * - Note that the Sensor numbers from ATCAHPI_SENSOR_NUM_IPMB0 to * ATCAHPI_SENSOR_NUM_IPMB0 + 0x5F are reserved for systems supporting a * radial IPMB requiring multiple IPMB0 Sensors. * Desired Power Control * IPMI A/B State Control */ #define ATCAHPI_SENSOR_NUM_IPMB0 (SaHpiSensorNumT)0x1100 #define ATCAHPI_CTRL_NUM_DESIRED_PWR (SaHpiCtrlNumT)0x1030 #define ATCAHPI_CTRL_NUM_IPMB_A_STATE (SaHpiCtrlNumT)0x1101 #define ATCAHPI_CTRL_NUM_IPMB_B_STATE (SaHpiCtrlNumT)0x1102 /* * Control numbers for FRU Control and FRU IPM Controller reset. */ #define ATCAHPI_CTRL_NUM_FRU_CONTROL (SaHpiCtrlNumT)0x1200 #define ATCAHPI_CTRL_NUM_FRU_IPMC_RESET (SaHpiCtrlNumT)0x1201 /* * Sensor/Control numbers for: * AMC Power On Sequence Control * Note that the Control numbers from ATCAHPI_CTRL_NUM_AMC_POWER_ON_SEQUENCE to * ATCAHPI_CTRL_NUM_AMC_POWER_ON_SEQUENCE + Fh are reserved for AMC Power On * Sequence Controls. */ #define ATCAHPI_SENSOR_NUM_AMC_PWRONSEQ_COMMIT_STATUS (SaHpiSensorNumT)0x1500 #define ATCAHPI_CTRL_NUM_AMC_POWER_ON_SEQUENCE_COMMIT (SaHpiCtrlNumT)0x1500 #define ATCAHPI_CTRL_NUM_AMC_POWER_ON_SEQUENCE (SaHpiCtrlNumT)0x1501 /*********************************************************************** ******** ************************************************************************ ******** ********** ********** ********** Fan Control Data Types ********** ********** ********** ************************************************************************ ******** ************************************************************************ *******/ /* * Control number for fan speed. */ #define ATCAHPI_CTRL_NUM_FAN_SPEED (SaHpiCtrlNumT)0x1400 /*********************************************************************** ******** ************************************************************************ ******** ********** ********** ********** OEM Control Data Types ********** ********** ********** ************************************************************************ ******** ************************************************************************ *******/ /* * Well-known OEM values assigned to RDR entries for OEM Controls defined by * this document. */ #define ATCAHPI_PICMG_CT_CHASSIS_STATUS 0x0100315A #define ATCAHPI_PICMG_CT_ATCA_LED 0x0200315A #endif // __SAHPIATCA_H openhpi-2.14.1/include/oh_lock.h0000644000076400007640000000625011302567027013411 0ustar /* -*- linux-c -*- * * Copyright (c) 2003 by Intel Corp. * (C) Copyright IBM Corp. 2003, 2006 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Louis Zhuang * Renier Morales */ #ifndef __OH_LOCK_H #define __OH_LOCK_H #include extern int oh_will_block; int data_access_block_times(void); #ifdef OH_DBG_MSGS /* #define dbg_lock(format, ...) \ do { \ if (oh_get_global_bool(OPENHPI_DEBUG_LOCK)) { \ fprintf(stderr, " LOCK: %s:%d:%s: ", __FILE__, __LINE__, __func__); \ fprintf(stderr, format "\n", ## __VA_ARGS__); \ } \ } while(0) */ #define dbg_lock(format, ...) \ do { \ if (getenv("OPENHPI_DEBUG_LOCK") && !strcmp("YES",getenv("OPENHPI_DEBUG_LOCK"))) { \ fprintf(stderr, " LOCK: %s:%d:%s: ", __FILE__, __LINE__, __func__); \ fprintf(stderr, format "\n", ## __VA_ARGS__); \ } \ } while(0) #else #define dbg_lock(format, ...) #endif /* multi-threading support, use Posix mutex for data access */ /* initialize mutex used for data locking */ #include extern GStaticRecMutex oh_main_lock; extern int lockcount; #define data_access_lock_init() #define data_access_lock() \ do { \ dbg_lock("%p - Attempting lock", g_thread_self()); \ if (!g_static_rec_mutex_trylock(&oh_main_lock)) { \ dbg_lock("%p - Lockcount: %d", g_thread_self(), lockcount); \ dbg_lock("%p - Going to block for a lock now", g_thread_self()); \ oh_will_block++; \ g_static_rec_mutex_lock(&oh_main_lock); \ dbg_lock("%p - Got the lock after blocking", g_thread_self()); \ lockcount++; \ } else { \ dbg_lock("%p - Got the lock because no one had it", g_thread_self()); \ lockcount++; \ dbg_lock("%p - Lockcount: %d", g_thread_self(), lockcount); \ } \ } while(0) #define data_access_unlock() \ do { \ lockcount--; \ g_static_rec_mutex_unlock(&oh_main_lock); \ dbg_lock("%p - released the lock", g_thread_self()); \ } while(0) #endif /* __OH_LOCK_H */ openhpi-2.14.1/include/oh_init.h0000644000076400007640000000122311302567027013417 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004-2006 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * Renier Morales * David M Jukdkovics * */ #ifndef __OH_INIT_H #define __OH_INIT_H #include int oh_init(void); int oh_finit(void); #endif /* __OH_INIT_H */ openhpi-2.14.1/include/oh_hotswap.h0000644000076400007640000000171111302567027014143 0ustar /* -*- linux-c -*- * * Copyright (c) 2004 by Intel Corp. * (C) Copyright IBM Corp. 2005-2006 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Racing Guo * Renier Morales */ #ifndef __OH_HOTSWAP_H #define __OH_HOTSWAP_H #include #include #ifdef __cplusplus extern "C" { #endif SaHpiTimeoutT get_hotswap_auto_insert_timeout(struct oh_domain *d); void set_hotswap_auto_insert_timeout(struct oh_domain *d, SaHpiTimeoutT t); SaHpiBoolT oh_allowed_hotswap_transition(SaHpiHsStateT from, SaHpiHsStateT to); #ifdef __cplusplus } #endif #endif /* __OH_HOTSWAP_H */ openhpi-2.14.1/include/oh_threaded.h0000644000076400007640000000144511302567027014242 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005-2006 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * Renier Morales * */ #ifndef __OH_THREADED_H #define __OH_THREADED_H #include #include #ifdef __cplusplus extern "C" { #endif int oh_threaded_init(void); int oh_threaded_start(void); int oh_threaded_final(void); void oh_wake_discovery_thread(SaHpiBoolT wait); #ifdef __cplusplus } #endif #endif /* __OH_THREADED_H */ openhpi-2.14.1/include/oh_alarm.h0000644000076400007640000000544511302567027013562 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004-2006 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * Renier Morales * */ #ifndef __OH_ALARM_H #define __OH_ALARM_H #include #include #include #define OH_MAX_DAT_SIZE_LIMIT 0 #define OH_MAX_DAT_USER_LIMIT 0 /* Alarm Handling */ SaHpiAlarmT *oh_add_alarm(struct oh_domain *d, SaHpiAlarmT *alarm, int fromfile); SaHpiAlarmT *oh_get_alarm(struct oh_domain *d, SaHpiAlarmIdT *aid, SaHpiSeverityT *severity, SaHpiStatusCondTypeT *type, SaHpiResourceIdT *rid, SaHpiManufacturerIdT *mid, SaHpiSensorNumT *num, SaHpiEventStateT *state, SaHpiBoolT unacknowledged, int get_next); SaErrorT oh_remove_alarm(struct oh_domain *d, SaHpiSeverityT *severity, SaHpiStatusCondTypeT *type, SaHpiResourceIdT *rid, SaHpiManufacturerIdT *mid, SaHpiSensorNumT *num, SaHpiEventStateT *state, SaHpiEventStateT *deassert_mask, int multi); SaErrorT oh_close_alarmtable(struct oh_domain *d); SaHpiUint32T oh_count_alarms(struct oh_domain *d, SaHpiSeverityT sev); /* Alarm Triggers */ SaErrorT oh_detect_event_alarm(struct oh_domain *d, struct oh_event *e); SaErrorT oh_detect_res_sev_alarm(SaHpiDomainIdT did, SaHpiResourceIdT rid, SaHpiSeverityT new_sev); SaErrorT oh_detect_sensor_enable_alarm(SaHpiDomainIdT did, SaHpiResourceIdT rid, SaHpiSensorNumT num, SaHpiBoolT enable); SaErrorT oh_detect_sensor_mask_alarm(SaHpiDomainIdT did, SaHpiResourceIdT rid, SaHpiSensorNumT num, SaHpiSensorEventMaskActionT action, SaHpiEventStateT deassert_mask); /* Persistency */ SaErrorT oh_alarms_to_file(struct oh_dat *at, char *filename); SaErrorT oh_alarms_from_file(struct oh_domain *d, char *filename); #endif /* __OH_ALARM_H */ openhpi-2.14.1/include/SaHpiBladeCenter.h0000644000076400007640000000272511302567027015073 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2006 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * Steve Sherman */ #ifndef __SAHPIBLADECENTER_H #define __SAHPIBLADECENTER_H /* Slot Entity Path Numbers */ #define BLADECENTER_SWITCH_SLOT SAHPI_ENT_CHASSIS_SPECIFIC + 0x10 #define BLADECENTER_POWER_SUPPLY_SLOT SAHPI_ENT_CHASSIS_SPECIFIC + 0x11 #define BLADECENTER_PERIPHERAL_BAY_SLOT SAHPI_ENT_CHASSIS_SPECIFIC + 0x12 #define BLADECENTER_SYS_MGMNT_MODULE_SLOT SAHPI_ENT_CHASSIS_SPECIFIC + 0x13 #define BLADECENTER_BLOWER_SLOT SAHPI_ENT_CHASSIS_SPECIFIC + 0x14 #define BLADECENTER_ALARM_PANEL_SLOT SAHPI_ENT_CHASSIS_SPECIFIC + 0x15 #define BLADECENTER_MUX_SLOT SAHPI_ENT_CHASSIS_SPECIFIC + 0x16 #define BLADECENTER_CLOCK_SLOT SAHPI_ENT_CHASSIS_SPECIFIC + 0x17 /* Slot Sensor Numbers */ #define BLADECENTER_SENSOR_NUM_SLOT_STATE (SaHpiSensorNumT) 0x1010 #define BLADECENTER_SENSOR_NUM_MAX_POWER (SaHpiSensorNumT) 0x1012 #define BLADECENTER_SENSOR_NUM_ASSIGNED_POWER (SaHpiSensorNumT) 0x1011 #define BLADECENTER_SENSOR_NUM_MIN_POWER (SaHpiSensorNumT) 0x1013 #endif openhpi-2.14.1/include/sahpimacros.h0000644000076400007640000001113511302567027014302 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2003, 2004, 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Sean Dague * Renier Morales */ #ifndef __SAHPIMACROS_H #define __SAHPIMACROS_H /************************************************************** * * These macros are defined for clarity of the sahpi.c * source file. They provide standard mechanisms for * checking for and populating standard types, as well * as providing consistent debug and error functionality. * * Yes, macros are evil, but they make this code much * more readable. * ***********************************************************/ #define OH_CHECK_INIT_STATE(sid) \ { \ SaHpiBoolT state; \ SaErrorT init_error; \ if ((init_error = oh_get_session_subscription(sid,&state)) != SA_OK) { \ err("Init state check failed! (%s, %d)", oh_lookup_error(init_error), sid); \ return init_error; \ } \ } /* * OH_GET_DID gets the domain id of a session and * checks its validity (nonzero). * */ #define OH_GET_DID(sid, did) \ { \ did = oh_get_session_domain(sid); \ if (did == SAHPI_UNSPECIFIED_DOMAIN_ID) { \ err("No domain for session id %d",sid); \ return SA_ERR_HPI_INVALID_SESSION; \ } \ } /* * OH_GET_DOMAIN gets the domain object which locks it. * Need to call oh_release_domain(domain) after this to unlock it. */ #define OH_GET_DOMAIN(did, d) \ { \ if (!(d = oh_get_domain(did))) { \ err("Domain %d doesn't exist", did); \ return SA_ERR_HPI_INVALID_DOMAIN; \ } \ } /* * OH_HANDLER_GET gets the hander for the rpt and resource id. It * returns INVALID PARAMS if the handler isn't there */ #define OH_HANDLER_GET(d, rid, h) \ { \ unsigned int *hid = NULL; \ hid = oh_get_resource_data(&(d->rpt), rid); \ if (!hid) { \ err("Can't find handler for Resource %d in Domain %d", rid, d->id); \ oh_release_domain(d); \ return SA_ERR_HPI_INVALID_RESOURCE; \ } \ h = oh_get_handler(*hid); \ if (h && !h->hnd) { \ oh_release_handler(h); \ h = NULL; \ } \ } /* * OH_RESOURCE_GET gets the resource for an resource id and rpt * it returns invalid resource if no resource id is found */ #define OH_RESOURCE_GET(d, rid, r) \ { \ r = oh_get_resource_by_id(&(d->rpt), rid); \ if (!r) { \ err("Resource %d in Domain %d doesn't exist", rid, d->id); \ oh_release_domain(d); \ return SA_ERR_HPI_INVALID_RESOURCE; \ } \ } /* * OH_RESOURCE_GET_CHECK gets the resource for an resource id and rpt * it returns invalid resource if no resource id is found. It will * return NO_RESPONSE if the resource is marked as being failed. */ #define OH_RESOURCE_GET_CHECK(d, rid, r) \ { \ r = oh_get_resource_by_id(&(d->rpt), rid); \ if (!r) { \ err("Resource %d in Domain %d doesn't exist", rid, d->id); \ oh_release_domain(d); \ return SA_ERR_HPI_INVALID_RESOURCE; \ } else if (r->ResourceFailed != SAHPI_FALSE) { \ err("Resource %d in Domain %d is Failed", rid, d->id); \ oh_release_domain(d); \ return SA_ERR_HPI_NO_RESPONSE; \ } \ } /* * OH_CALL_ABI will check for a valid handler struct and existing plugin abi. * If a valid abi or handler is not found, it returns error. Once it passes * this validity check, it will call the plugin abi function with the passed * parameters. */ #define OH_CALL_ABI(handler, func, err, ret, params...) \ { \ if (!handler || !handler->abi->func) { \ oh_release_handler(handler); \ return err; \ } \ ret = handler->abi->func(handler->hnd, params); \ } #endif openhpi-2.14.1/include/SaHpiOaSoap.h0000644000076400007640000002470511302567027014107 0ustar /* * Copyright (C) 2008, Hewlett-Packard Development Company, LLP * All rights reserved. * * 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. * * Neither the name of the Hewlett-Packard Corporation, nor the names * of its contributors may be used to endorse or promote products * derived from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * Author(s) * Raghavendra P.G. * Raghavendra M.S. */ #ifndef __SAHPIOASOAP_H #define __SAHPIOASOAP_H /* Sensor Numbers used in OA SOAP plugin * * On adding new sensor, the following data structures may require updation. * Please update accordingly. * 1. New sensor class in plugin/oa_soap/oa_soap_sensor.h * 2. Max sensor class in plugin/oa_soap/oa_soap_resources.h * 3. New sensor event assert state in plugin/oa_soap/oa_soap_sensor.h * 4. Max sensor event assert state mapping array in * plugin/oa_soap/oa_soap_resources.c * 5. Max sensor enum value mapping array in plugin/oa_soap/oa_soap_resources.c * 6. Global sensor array in plugin/oa_soap/oa_soap_resources.c * 7. Sensor event array in global sensor array in * plugin/oa_soap/oa_soap_resources.c * 8. Global sensor enum value mapping array in * plugin/oa_soap/oa_soap_resources.c * 9. Global sensor event assert state mapping array in * plugin/oa_soap/oa_soap_resources.c */ /* Operational status sensor */ #define OA_SOAP_SEN_OPER_STATUS (SaHpiSensorNumT) 0x000 /* Predictive faliure sensor */ #define OA_SOAP_SEN_PRED_FAIL (SaHpiSensorNumT) 0x001 /* Thermal reading sensor */ #define OA_SOAP_SEN_TEMP_STATUS (SaHpiSensorNumT) 0x002 /* Redundancy sensor */ #define OA_SOAP_SEN_REDUND (SaHpiSensorNumT) 0x003 /* Fan speed sensor */ #define OA_SOAP_SEN_FAN_SPEED (SaHpiSensorNumT) 0x004 /* Power reading sensor */ #define OA_SOAP_SEN_PWR_STATUS (SaHpiSensorNumT) 0x005 /* Internal data error sensor */ #define OA_SOAP_SEN_INT_DATA_ERR (SaHpiSensorNumT) 0x006 /* Management processor error sensor */ #define OA_SOAP_SEN_MP_ERR (SaHpiSensorNumT) 0x007 /* Power supply subsystem power input sensor */ #define OA_SOAP_SEN_IN_PWR (SaHpiSensorNumT) 0x008 /* Power supply subsystem power output sensor */ #define OA_SOAP_SEN_OUT_PWR (SaHpiSensorNumT) 0x009 /* Power supply subsystem power capacity sensor */ #define OA_SOAP_SEN_PWR_CAPACITY (SaHpiSensorNumT) 0x00a /* Thermal warning sensor */ #define OA_SOAP_SEN_THERM_WARN (SaHpiSensorNumT) 0x00b /* Thermal danger sensor */ #define OA_SOAP_SEN_THERM_DANGER (SaHpiSensorNumT) 0x00c /* IO configuration error sensor */ #define OA_SOAP_SEN_IO_CONFIG_ERR (SaHpiSensorNumT) 0x00d /* Device power request error sensor */ #define OA_SOAP_SEN_DEV_PWR_REQ (SaHpiSensorNumT) 0x00e /* Insufficient cooling error sensor */ #define OA_SOAP_SEN_INSUF_COOL (SaHpiSensorNumT) 0x00f /* Device location error sensor */ #define OA_SOAP_SEN_DEV_LOC_ERR (SaHpiSensorNumT) 0x010 /* Device failure sensor */ #define OA_SOAP_SEN_DEV_FAIL (SaHpiSensorNumT) 0x011 /* Device degraded sensor */ #define OA_SOAP_SEN_DEV_DEGRAD (SaHpiSensorNumT) 0x012 /* AC failure sensor */ #define OA_SOAP_SEN_AC_FAIL (SaHpiSensorNumT) 0x013 /* i2c buses sensor */ #define OA_SOAP_SEN_I2C_BUS (SaHpiSensorNumT) 0x014 /* Redundancy error sensor */ #define OA_SOAP_SEN_REDUND_ERR (SaHpiSensorNumT) 0x015 /* Enclosure aggregate operational status sensor */ #define OA_SOAP_SEN_ENC_AGR_OPER (SaHpiSensorNumT) 0x016 /* Enclosure aggregate predictive failure sensor */ #define OA_SOAP_SEN_ENC_AGR_PRED_FAIL (SaHpiSensorNumT) 0x017 /* Enclosure OA redundancy sensor */ #define OA_SOAP_SEN_OA_REDUND (SaHpiSensorNumT) 0x018 /* Enclosure OA link status sensor */ #define OA_SOAP_SEN_OA_LINK_STATUS (SaHpiSensorNumT) 0x019 /* Interconnect CPU fault sensor */ #define OA_SOAP_SEN_CPU_FAULT (SaHpiSensorNumT) 0x01a /* Interconnect health LED sensor */ #define OA_SOAP_SEN_HEALTH_LED (SaHpiSensorNumT) 0x01b /* Health status operational sensor */ #define OA_SOAP_SEN_HEALTH_OPER (SaHpiSensorNumT) 0x01c /* Health status predictive failure sensor */ #define OA_SOAP_SEN_HEALTH_PRED_FAIL (SaHpiSensorNumT) 0x01d /* Device missing sensor */ #define OA_SOAP_SEN_DEV_MISS (SaHpiSensorNumT) 0x01e /* Device power sequence sensor */ #define OA_SOAP_SEN_DEV_PWR_SEQ (SaHpiSensorNumT) 0x01f /* Device bonding sensor */ #define OA_SOAP_SEN_DEV_BOND (SaHpiSensorNumT) 0x020 /* Network configuration sensor */ #define OA_SOAP_SEN_NET_CONFIG (SaHpiSensorNumT) 0x021 /* Firmware mismatch */ #define OA_SOAP_SEN_FW_MISMATCH (SaHpiSensorNumT) 0x022 /* Profile unassigned error sensor */ #define OA_SOAP_SEN_PROF_UNASSIGN_ERR (SaHpiSensorNumT) 0x023 /* Device not supported sensor */ #define OA_SOAP_SEN_DEV_NOT_SUPPORT (SaHpiSensorNumT) 0x024 /* Too low power request sensor */ #define OA_SOAP_SEN_TOO_LOW_PWR_REQ (SaHpiSensorNumT) 0x025 /* Call HP sensor */ #define OA_SOAP_SEN_CALL_HP (SaHpiSensorNumT) 0x026 /* Device informational sensor */ #define OA_SOAP_SEN_DEV_INFO (SaHpiSensorNumT) 0x027 /* Storage device missing sensor */ #define OA_SOAP_SEN_STORAGE_DEV_MISS (SaHpiSensorNumT) 0x028 /* Enclosure ID mismatch sensor */ #define OA_SOAP_SEN_ENC_ID_MISMATCH (SaHpiSensorNumT) 0x029 /* Device mix match sensor */ #define OA_SOAP_SEN_DEV_MIX_MATCH (SaHpiSensorNumT) 0x02a /* Power capping error sensor */ #define OA_SOAP_SEN_GRPCAP_ERR (SaHpiSensorNumT) 0x02b /* IML recorded errors sensor */ #define OA_SOAP_SEN_IML_ERR (SaHpiSensorNumT) 0x02c /* Duplicate management IP address sensor */ #define OA_SOAP_SEN_DUP_MGMT_IP_ADDR (SaHpiSensorNumT) 0x02d /* Server Blade System zone1 */ #define OA_SOAP_SEN_BLADE_SYSTEM_ZONE1 (SaHpiSensorNumT) 0x02e /* Server Blade System zone2 */ #define OA_SOAP_SEN_BLADE_SYSTEM_ZONE2 (SaHpiSensorNumT) 0x02f /* Server Blade System zone3 */ #define OA_SOAP_SEN_BLADE_SYSTEM_ZONE3 (SaHpiSensorNumT) 0x030 /* Server Blade System zone4 */ #define OA_SOAP_SEN_BLADE_SYSTEM_ZONE4 (SaHpiSensorNumT) 0x031 /* Server Blade CPU zone1 */ #define OA_SOAP_SEN_BLADE_CPU_ZONE1 (SaHpiSensorNumT) 0x032 /* Server Blade CPU zone2 */ #define OA_SOAP_SEN_BLADE_CPU_ZONE2 (SaHpiSensorNumT) 0x033 /* Server Blade CPU zone3 */ #define OA_SOAP_SEN_BLADE_CPU_ZONE3 (SaHpiSensorNumT) 0x034 /* Server Blade CPU zone4 */ #define OA_SOAP_SEN_BLADE_CPU_ZONE4 (SaHpiSensorNumT) 0x035 /* Server Blade Memory zone1 */ #define OA_SOAP_SEN_BLADE_MEM_ZONE1 (SaHpiSensorNumT) 0x036 /* Server Blade Memory zone2 */ #define OA_SOAP_SEN_BLADE_MEM_ZONE2 (SaHpiSensorNumT) 0x037 /* Server Blade Memory zone3 */ #define OA_SOAP_SEN_BLADE_MEM_ZONE3 (SaHpiSensorNumT) 0x038 /* Server Blade Memory zone4 */ #define OA_SOAP_SEN_BLADE_MEM_ZONE4 (SaHpiSensorNumT) 0x039 /* Storage Blade Disk zone1 */ #define OA_SOAP_SEN_BLADE_DISK_ZONE1 (SaHpiSensorNumT) 0x03a /* Storage Blade Disk zone2 */ #define OA_SOAP_SEN_BLADE_DISK_ZONE2 (SaHpiSensorNumT) 0x03b /* Storage Blade Disk zone3 */ #define OA_SOAP_SEN_BLADE_DISK_ZONE3 (SaHpiSensorNumT) 0x03c /* Storage Blade Disk zone4 */ #define OA_SOAP_SEN_BLADE_DISK_ZONE4 (SaHpiSensorNumT) 0x03d /* Server Blade CPU1 */ #define OA_SOAP_SEN_BLADE_CPU1_1 (SaHpiSensorNumT) 0x03e /* Server Blade CPU1 */ #define OA_SOAP_SEN_BLADE_CPU1_2 (SaHpiSensorNumT) 0x03f /* Server Blade CPU1 */ #define OA_SOAP_SEN_BLADE_CPU1_3 (SaHpiSensorNumT) 0x040 /* Server Blade CPU1 */ #define OA_SOAP_SEN_BLADE_CPU1_4 (SaHpiSensorNumT) 0x041 /* Server Blade CPU2 */ #define OA_SOAP_SEN_BLADE_CPU2_1 (SaHpiSensorNumT) 0x042 /* Server Blade CPU2 */ #define OA_SOAP_SEN_BLADE_CPU2_2 (SaHpiSensorNumT) 0x043 /* Server Blade CPU2 */ #define OA_SOAP_SEN_BLADE_CPU2_3 (SaHpiSensorNumT) 0x044 /* Server Blade CPU2 */ #define OA_SOAP_SEN_BLADE_CPU2_4 (SaHpiSensorNumT) 0x045 /* Server Blade CPU3 */ #define OA_SOAP_SEN_BLADE_CPU3_1 (SaHpiSensorNumT) 0x046 /* Server Blade CPU3 */ #define OA_SOAP_SEN_BLADE_CPU3_2 (SaHpiSensorNumT) 0x047 /* Server Blade CPU3 */ #define OA_SOAP_SEN_BLADE_CPU3_3 (SaHpiSensorNumT) 0x048 /* Server Blade CPU3 */ #define OA_SOAP_SEN_BLADE_CPU3_4 (SaHpiSensorNumT) 0x049 /* Server Blade CPU4 */ #define OA_SOAP_SEN_BLADE_CPU4_1 (SaHpiSensorNumT) 0x04a /* Server Blade CPU4 */ #define OA_SOAP_SEN_BLADE_CPU4_2 (SaHpiSensorNumT) 0x04b /* Server Blade CPU4 */ #define OA_SOAP_SEN_BLADE_CPU4_3 (SaHpiSensorNumT) 0x04c /* Server Blade CPU4 */ #define OA_SOAP_SEN_BLADE_CPU4_4 (SaHpiSensorNumT) 0x04d /* Control numbers used in OA SOAP plugin * On adding new control, control array in in plugin/oa_soap/oa_soap_resources.c * may require updation. */ /* UID control */ #define OA_SOAP_UID_CNTRL (SaHpiCtrlNumT) 0x000 /* Power control */ #define OA_SOAP_PWR_CNTRL (SaHpiCtrlNumT) 0x001 /* LCD Button Lock control */ #define OA_SOAP_LCD_BUTN_LCK_CNTRL (SaHpiCtrlNumT) 0x002 /* Custom inventory Area and fields used in OA SOAP plugin * On adding new inventory area or field, fan zone mapping rray in in * plugin/oa_soap/oa_soap_resources.c may require updation. */ /* Fan Zone field type for storing the device bays */ #define OA_SOAP_INV_FZ_DEV_BAY (SaHpiIdrIdT) 0x100 /* Fan Zone field type for storing the fan bays */ #define OA_SOAP_INV_FZ_FAN_BAY (SaHpiIdrIdT) 0x101 /* Fan field type for storing the shared status */ #define OA_SOAP_INV_FAN_SHARED (SaHpiIdrIdT) 0x102 /* Fan field type for storing the Fan zone number */ #define OA_SOAP_INV_FZ_NUM (SaHpiIdrIdT) 0x103 #endif openhpi-2.14.1/snmp/0000755000076400007640000000000011405006365011146 5ustar openhpi-2.14.1/snmp/Makefile.am0000644000076400007640000000131511302567132013202 0ustar # (C) Copyright IBM Corp 2003, 2004 # All rights reserved. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This # file and program are licensed under a BSD style license. See # the Copying file included with the OpenHPI distribution for # full licensing terms. MAINTAINERCLEANFILES = Makefile.in INCLUDES = @OPENHPI_INCLUDES@ AM_CFLAGS = @SNMPFLAGS@ lib_LTLIBRARIES = libopenhpi_snmp.la EXTRA_DIST = snmp_utils.h libopenhpi_snmp_la_SOURCES = snmp_utils.c libopenhpi_snmp_la_LIBADD = -luuid @SNMPLIBS@ libopenhpi_snmp_la_LDFLAGS = -version-info @HPI_LIB_VERSION@ openhpi-2.14.1/snmp/snmp_utils.c0000644000076400007640000003715711302567132013524 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2003, 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Renier Morales * David Judkovics * */ #include #include #include #include /** * snmp_get * @ss: a handle to the snmp session needed to make an * snmp transaction. * @objid: string containing the OID entry. * @value: the value received from snmp will be put in this union. * * Gets a single value indicated by the objectid using snmp. * In the case of multiple values being returned, the type in @value will be * ASN_NULL (0x05). Nothing else in @value will be filled in. * * Returns: 0 if successful, <0 if there was an error. **/ SaErrorT snmp_get( void *sessp, const char *objid, struct snmp_value *value) { struct snmp_pdu *pdu; struct snmp_pdu *response; struct snmp_session *session; oid anOID[MAX_OID_LEN]; size_t anOID_len = MAX_OID_LEN; struct variable_list *vars; SaErrorT returncode = SA_OK; int status; /* * Create the PDU for the data for our request. */ pdu = snmp_pdu_create(SNMP_MSG_GET); read_objid(objid, anOID, &anOID_len); snmp_add_null_var(pdu, anOID, anOID_len); /* * Send the Request out. */ status = snmp_sess_synch_response(sessp, pdu, &response); /* * Process the response. */ if (status == STAT_SUCCESS) { if(response->errstat == SNMP_ERR_NOERROR) { vars = response->variables; value->type = vars->type; if (vars->next_variable != NULL) { /* There are more values, set return type to null. */ value->type = ASN_NULL; } else if ( !(CHECK_END(vars->type)) ) { /* This is one of the exception condition */ returncode = SA_ERR_HPI_NOT_PRESENT; dbg("Warning: OID=%s gets snmp exception %d \n",objid, vars->type); } else if ( (vars->type == ASN_INTEGER) || (vars->type == ASN_COUNTER) || (vars->type == ASN_UNSIGNED) ) { value->integer = *(vars->val.integer); } else { value->str_len = vars->val_len; if (value->str_len >= MAX_ASN_STR_LEN) value->str_len = MAX_ASN_STR_LEN; if (value->str_len > 0) memcpy(value->string, vars->val.string, value->str_len); value->string[value->str_len] = '\0'; /* guarantee NULL terminated string */ } } else { dbg("Error in packet %s\nReason: %s\n", objid, snmp_errstring(response->errstat)); returncode = errstat2hpi(response->errstat); } } else { value->type = (u_char)0x00; session = snmp_sess_session(sessp); snmp_sess_perror("snmpget", session); dbg("OID %s, error status: %d\n",objid, status); returncode = snmpstat2hpi(status); } /* Clean up: free the response */ if (response) snmp_free_pdu(response); return (returncode); } /** * snmp_set * @ss: a handle to the snmp session needed to make an snmp transaction. * @objid: string containing the OID to set. * @value: the value to set the oid with. * * Sets a value where indicated by the objectid * using snmp. * * Returns: 0 if Success, less than 0 if Failure. **/ SaErrorT snmp_set( void *sessp, char *objid, struct snmp_value value) { struct snmp_pdu *pdu; struct snmp_pdu *response; struct snmp_session *session; oid anOID[MAX_OID_LEN]; size_t anOID_len = MAX_OID_LEN; void *dataptr = NULL; int status = 0; SaErrorT rtncode = 0; /* * Create the PDU for the data for our request. */ pdu = snmp_pdu_create(SNMP_MSG_SET); read_objid(objid, anOID, &anOID_len); rtncode = 0; /* Default - All is OK */ switch (value.type) { case ASN_INTEGER: case ASN_UNSIGNED: case ASN_COUNTER: dataptr = &value.integer; break; case ASN_OCTET_STR: dataptr = value.string; break; default: rtncode = SA_ERR_HPI_INVALID_PARAMS; err("datatype %c not yet supported by snmp_set()\n", value.type); break; } if (rtncode == 0) { /* * Set the data to send out */ /* Old code - int rc = snmp_add_var(pdu, objid, objid_len, datatype, dataptr) */ /* was missing checking for rc, so there was no OID and no data was */ /* included in the package. */ /* Since snmp_add_var() converts input data to string then call */ /* snmp_pdu_add_variable(), we stick with add_variable() for efficiency */ snmp_pdu_add_variable(pdu, anOID, anOID_len, value.type, dataptr, value.str_len); /* * Send the Request out. */ status = snmp_sess_synch_response(sessp, pdu, &response); /* * Process the response. */ if (status == STAT_SUCCESS) rtncode = errstat2hpi(response->errstat); else { session = snmp_sess_session(sessp); snmp_sess_perror("snmpset", session); rtncode = snmpstat2hpi(status);; } /* Clean up: free the response */ if (response) snmp_free_pdu(response); } return rtncode; } /** * snmp_get2: Gets a single value indicated by the objectid * using snmp. * @handle: a handle to the snmp session needed to make an * snmp transaction. * @objid: string containing the OID entry. * @value: the value received from snmp will be put in this union. * * In the case of multiple values being returned, the type in 'value' will be * ASN_NULL (0x05). Nothing else in 'value' will be filled in. * Use snmp_get_all for doing gets that return multiple values. * * Return value: Returns 0 if successful, <0 if there was an error. **/ SaErrorT snmp_get2(void *sessp, oid *objid, size_t objid_len, struct snmp_value *value) { struct snmp_pdu *pdu; struct snmp_pdu *response; struct snmp_session *session; struct variable_list *vars; SaErrorT returncode = SA_OK; int i; int status; /* * Create the PDU for the data for our request. */ pdu = snmp_pdu_create(SNMP_MSG_GET); snmp_add_null_var(pdu, objid, objid_len); /* * Send the Request out. */ status = snmp_sess_synch_response(sessp, pdu, &response); /* * Process the response. */ if (status == STAT_SUCCESS) { if (response->errstat == SNMP_ERR_NOERROR) { vars = response->variables; value->type = vars->type; if (vars->next_variable != NULL) { /* If there are more values, set return type to null. */ value->type = ASN_NULL; } else if ( !(CHECK_END(vars->type)) ) { /* This is one of the exception condition */ returncode = SA_ERR_HPI_NOT_PRESENT; dbg("snmp exception %d \n",vars->type); } else if ( (vars->type == ASN_INTEGER) || (vars->type == ASN_COUNTER) || (vars->type == ASN_UNSIGNED) ) { value->integer = *(vars->val.integer); } else { value->str_len = vars->val_len; if (value->str_len >= MAX_ASN_STR_LEN) value->str_len = MAX_ASN_STR_LEN; else value->string[value->str_len] = '\0'; memcpy(value->string, vars->val.string, value->str_len); } /* display data */ #ifdef DEBUG if (CHECK_END(vars->type)) { fprintf(stderr, "*** snmp_get2 ******************************************\n"); fprint_variable(stderr, vars->name, vars->name_length, vars); fprintf(stderr, "********************************************************\n"); } else { err("snmp_get2(): No idea.Unknown Type: %X", vars->type); fprint_variable(stderr, vars->name, vars->name_length, vars); } #endif } else { err("Error, Reason: %s", snmp_errstring(response->errstat)); fprintf(stderr, "objid: "); for(i = 0; ierrstat); } } else { session = snmp_sess_session(sessp); snmp_sess_perror("snmpget", session); returncode = snmpstat2hpi(status); } /* Clean up: free the response */ sc_free_pdu(&response); return (returncode); } /** * snmp_set2: Gets a single value indicated by the objectid * using snmp. * @handle: a handle to the snmp session needed to make an * snmp transaction. * @objid: string containing the OID entry. * @value: the value received from snmp will be put in this union. * * In the case of multiple values being returned, the type in 'value' will be * ASN_NULL (0x05). Nothing else in 'value' will be filled in. * Use snmp_get_all for doing gets that return multiple values. * * Return value: Returns 0 if successful, -1 if there was an error. **/ SaErrorT snmp_set2(void *sessp, oid *objid, size_t objid_len, struct snmp_value *value) { struct snmp_pdu *pdu; struct snmp_pdu *response; struct variable_list *vars; struct snmp_session *session; void *dataptr = NULL; int status = 0; SaErrorT rtncode = SA_OK; /* Default - All is OK */ /* * Create the PDU for the data for our request. */ pdu = snmp_pdu_create(SNMP_MSG_SET); switch (value->type) { case ASN_INTEGER: case ASN_UNSIGNED: case ASN_COUNTER: dataptr = &value->integer; break; case ASN_OCTET_STR: dataptr = value->string; break; default: rtncode = SA_ERR_HPI_INVALID_PARAMS; err("datatype %c not yet supported by snmp_set2()", value->type); break; } if (rtncode == SA_OK) { /* * Set the data to send out */ /* Old code - snmp_add_var(pdu, objid, objid_len, datatype, dataptr); */ //int retcode = snmp_add_var(pdu, objid, objid_len, datatype, dataptr); snmp_pdu_add_variable(pdu, objid, objid_len, value->type, dataptr, value->str_len); /* * Send the Request out. */ status = snmp_sess_synch_response(sessp, pdu, &response); /* * Process the response. */ if (status == STAT_SUCCESS) { vars = response->variables; if (response->errstat == SNMP_ERR_NOERROR) { /* display data */ #ifdef DEBUG fprintf(stderr, "*** snmp_set2 ******************************************\n"); if (CHECK_END(response->variables->type)) { fprint_variable(stderr, response->variables->name, response->variables->name_length, response->variables); } else fprintf(stderr, "snmp_set2(): No idea.\n"); fprintf(stderr, "********************************************************\n"); #endif if (!(CHECK_END(response->variables->type)) ) { /* This is one of the exception condition */ rtncode = SA_ERR_HPI_NOT_PRESENT; err("snmp exception %d \n",vars->type); } } else { err("snmp_set2: Error in packet, Reason: %s", snmp_errstring(response->errstat)); rtncode = errstat2hpi(response->errstat); } } else { session = snmp_sess_session(sessp); snmp_sess_perror("snmpset", session); rtncode = snmpstat2hpi(status); } /* Clean up: free the response */ if (response) snmp_free_pdu(response); } return rtncode; } /** * snmp_getn_bulk: Builds and sends a SNMP_BET_BULK pdu using snmp * @sessp: snmp session * @bulk_objid: string containing the OID entry. * @bulk_objid_len: len of OID string * @bulk_pdu: pointer to the PDU to be created * @bulk_response: pointer to the response for this PDU request * @num_repetitions: max OIDs for this request. * Note: this is the max requested. Actual number returned can be less * than maximum. That depends on the target snmp agent. * * Return value: status from snmp_sess_synch_response(). See snmp_client.h of net-snmp library. * STAT_SUCCESS * STAT_ERROR * STAT_TIMEOUT * * Additionally, if status == STAT_SUCCESS, consumer of this routine needs to check for exception * conditions. * Possible exception conditions are SNMP_ENDOFMIBVIEW, SNMP_NOSUCHOBJECT, SNMP_NOSUCHINSTANCE **/ int snmp_getn_bulk( void *sessp, oid *bulk_objid, size_t bulk_objid_len, struct snmp_pdu *bulk_pdu, struct snmp_pdu **bulk_response, int num_repetitions ) { int status; bulk_pdu = snmp_pdu_create(SNMP_MSG_GETBULK); bulk_pdu->non_repeaters = 0; bulk_pdu->max_repetitions = num_repetitions; snmp_add_null_var(bulk_pdu, bulk_objid, bulk_objid_len); /* Send the Request out.*/ status = snmp_sess_synch_response(sessp, bulk_pdu, bulk_response); /* * Return the status. Consumer of this util has to process the response. */ return(status); } void sc_free_pdu(struct snmp_pdu **p) { if (*p) { snmp_free_pdu(*p); *p = NULL; } } SaErrorT errstat2hpi(long pdu_errstat) { SaErrorT hpicode = SA_OK; switch(pdu_errstat) { case SNMP_ERR_NOERROR: hpicode = SA_OK; break; case SNMP_ERR_TOOBIG: case SNMP_ERR_BADVALUE: case SNMP_ERR_WRONGTYPE: case SNMP_ERR_WRONGLENGTH: case SNMP_ERR_WRONGENCODING: case SNMP_ERR_WRONGVALUE: case SNMP_ERR_COMMITFAILED: case SNMP_ERR_UNDOFAILED: case SNMP_ERR_INCONSISTENTVALUE: hpicode = SA_ERR_HPI_INVALID_DATA; break; case SNMP_ERR_READONLY: case SNMP_ERR_NOTWRITABLE: hpicode = SA_ERR_HPI_READ_ONLY; break; case SNMP_ERR_NOSUCHNAME: hpicode = SA_ERR_HPI_NOT_PRESENT; break; case SNMP_ERR_NOACCESS: case SNMP_ERR_AUTHORIZATIONERROR: case SNMP_ERR_INCONSISTENTNAME: case SNMP_ERR_NOCREATION: hpicode = SA_ERR_HPI_INVALID_PARAMS; break; case SNMP_ERR_RESOURCEUNAVAILABLE: hpicode = SA_ERR_HPI_OUT_OF_SPACE; break; case SNMP_ERR_GENERR: default: hpicode = SA_ERR_HPI_UNKNOWN; break; } return(hpicode); } SaErrorT snmpstat2hpi(int snmpstat) { SaErrorT hpicode = SA_OK; switch(snmpstat) { case STAT_SUCCESS: hpicode = SA_OK; break; case STAT_TIMEOUT: hpicode = SA_ERR_HPI_TIMEOUT; break; case STAT_ERROR: default: hpicode = SA_ERR_HPI_ERROR; break; } return(hpicode); } openhpi-2.14.1/snmp/snmp_utils.h0000644000076400007640000000617311302567132013523 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2003, 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Renier Morales */ #ifndef SNMP_BC_UTILS_H #define SNMP_BC_UTILS_H #include #include /****** net-snmp config template ******/ #include #include #include #ifdef HAVE_SYS_TIME_H #include #else #include #endif #ifdef WIN32 #include #endif /* * This was added to deal with net-snmp 5.1 originally, but * it appears to break SuSE, so trying another way. * * #define NETSNMP_IMPORT extern * #define NETSNMP_INLINE * #define RETSIGTYPE void * #define NET_SNMP_CONFIG_H * */ /* Added this to avoid redefinition conflict * in opteron based platforms between the linux headers * and the net-snmp headers. -- Renier 9/27/04 */ #ifdef __ssize_t_defined #define HAVE_SSIZE_T 1 #endif /**************************************/ #include #include #include #define MAX_ASN_STR_LEN 300 #define SNMP_BC_MM_BULK_MAX 45 #define SNMP_BC_BULK_DEFAULT 32 #define SNMP_BC_BULK_MIN 16 #define SA_ERR_SNMP_BASE - 10000 #define SA_ERR_SNMP_NOSUCHOBJECT (SaErrorT)(SA_ERR_SNMP_BASE - SNMP_NOSUCHOBJECT) #define SA_ERR_SNMP_NOSUCHINSTANCE (SaErrorT)(SA_ERR_SNMP_BASE - SNMP_NOSUCHINSTANCE) #define SA_ERR_SNMP_NOSUCHNAME (SaErrorT)(SA_ERR_SNMP_BASE - SNMP_ERR_NOSUCHNAME) #define SA_ERR_SNMP_ENDOFMIBVIEW (SaErrorT)(SA_ERR_SNMP_BASE - SNMP_ENDOFMIBVIEW) #define SA_ERR_SNMP_ERROR (SaErrorT)(SA_ERR_SNMP_BASE - STAT_ERROR) #define SA_ERR_SNMP_TIMEOUT (SaErrorT)(SA_ERR_SNMP_BASE - STAT_TIMEOUT) #define CHECK_END(a) ((a != SNMP_ENDOFMIBVIEW) && \ (a != SNMP_NOSUCHOBJECT) && \ (a != SNMP_NOSUCHINSTANCE))? 1:0 /* Place-holder for values set and returned by snmp */ struct snmp_value { u_char type; char string[MAX_ASN_STR_LEN]; size_t str_len; //unsigned int str_len; long integer; }; SaErrorT snmp_get( void *sessp, const char *objid, struct snmp_value *value); SaErrorT snmp_set( void *sessp, char *objid, struct snmp_value value); SaErrorT snmp_get2(void *sessp, oid *objid, size_t objid_len, struct snmp_value *value); SaErrorT snmp_set2(void *sessp, oid *objid, size_t objid_len, struct snmp_value *value); int snmp_getn_bulk( void *sessp, oid *bulk_objid, size_t bulk_objid_len, struct snmp_pdu *bulk_pdu, struct snmp_pdu **bulk_response, int num_repetitions ); void sc_free_pdu(struct snmp_pdu **p); SaErrorT snmpstat2hpi(int snmpstat); SaErrorT errstat2hpi(long pdu_errstat); #endif openhpi-2.14.1/rt-env.sh.in0000644000076400007640000000203711302567132012347 0ustar #!/bin/sh -x # #OPENHPI_LOCK_DEBUG=YES OPENHPI_ERROR=YES #OPENHPI_DEBUG=YES OPENHPI_UID_MAP=@abs_top_srcdir@/uid_map OPENHPI_CONF=@abs_top_srcdir@/openhpi.conf OPENHPICLIENT_CONF=@abs_top_srcdir@/openhpiclient.conf OPENHPI_PLUGIN_ROOT=@abs_top_builddir@/plugins OPENHPI_PATH=${OPENHPI_PLUGIN_ROOT}/dummy:${OPENHPI_PLUGIN_ROOT}/ipmi:${OPENHPI_PLUGIN_ROOT}/ipmidirect:${OPENHPI_PLUGIN_ROOT}/watchdog:${OPENHPI_PLUGIN_ROOT}/sysfs:${OPENHPI_PLUGIN_ROOT}/snmp_bc:${OPENHPI_PLUGIN_ROOT}/simulator:${LTDL_LIBRARY_PATH} # the following entries are for the hpi daemon and client OPENHPI_DAEMON_HOST=localhost OPENHPI_DAEMON_PORT=4743 if [ ! -f @abs_top_srcdir@/openhpi.conf ]; then cp @abs_top_srcdir@/openhpi.conf.example @abs_top_srcdir@/openhpi.conf fi if [ ! -f @abs_top_srcdir@/openhpiclient.conf ]; then cp @abs_top_srcdir@/openhpiclient.conf.example @abs_top_srcdir@/openhpiclient.conf fi export OPENHPI_DEBUG OPENHPI_DEBUG_TRACE OPENHPI_UID_MAP OPENHPI_CONF OPENHPI_PATH OPENHPICLIENT_CONF export OPENHPI_DAEMON_HOST OPENHPI_DAEMON_PORT openhpi-2.14.1/marshal/0000755000076400007640000000000011405006365011620 5ustar openhpi-2.14.1/marshal/Makefile.am0000644000076400007640000000253711302567035013665 0ustar # # Copyright (c) 2004 by FORCE Computers. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This # file and program are licensed under a BSD style license. See # the Copying file included with the OpenHPI distribution for # full licensing terms. # # Authors: # Thomas Kanngieser # .NOTPARALLEL: SUBDIRS = t DIST_SUBDIRS = t MAINTAINERCLEANFILES = Makefile.in *~ INCLUDES = @OPENHPI_INCLUDES@ # just to clear LIBS LIBS = # marshal and connection used by the daemon and client library lib_LTLIBRARIES = libopenhpimarshal.la libohudpconnx.la libohtcpconnx.la libopenhpimarshal_la_SOURCES = \ marshal_hpi.h \ marshal_hpi.c \ marshal_hpi_types.h \ marshal_hpi_types.c \ marshal.h \ marshal.c libopenhpimarshal_la_LDFLAGS= -version-info @HPI_LIB_VERSION@ libohudpconnx_la_SOURCES = \ connection.h \ connection.c libohudpconnx_la_LDFLAGS= -version-info @HPI_LIB_VERSION@ libohudpconnx_la_LIBADD = $(top_builddir)/marshal/libopenhpimarshal.la libohtcpconnx_la_SOURCES = \ strmsock.h \ strmsock.cpp libohtcpconnx_la_LDFLAGS= -version-info @HPI_LIB_VERSION@ libohtcpconnx_la_LIBADD = $(top_builddir)/marshal/libopenhpimarshal.la clean-local: rm -f *~ core core.* openhpi-2.14.1/marshal/marshal_hpi_types.c0000644000076400007640000013764611302567035015522 0ustar /* * marshaling/demarshaling of hpi data types * * Copyright (c) 2004 by FORCE Computers. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Thomas Kanngieser * W. David Ashley * Renier Morales * Anton Pak */ #include "marshal_hpi_types.h" #include #include #include #include #include // SaHpiTextBuffer static cMarshalType SaHpiTextBufferDataArray = dArray( SaHpiUint8Type, SAHPI_MAX_TEXT_BUFFER_LENGTH ); static cMarshalType SaHpiTextBufferElements[] = { dStructElement( SaHpiTextBufferT, DataType, SaHpiTextTypeType ), dStructElement( SaHpiTextBufferT, Language, SaHpiLanguageType ), dStructElement( SaHpiTextBufferT, DataLength, SaHpiUint8Type ), dStructElement( SaHpiTextBufferT, Data, SaHpiTextBufferDataArray ), dStructElementEnd() }; cMarshalType SaHpiTextBufferType = dStruct( SaHpiTextBufferT, SaHpiTextBufferElements ); // oHpi static cMarshalType oHpiHandlerConfigParamTypeNameArray = dArray( SaHpiUint8Type, SAHPI_MAX_TEXT_BUFFER_LENGTH ); static cMarshalType oHpiHandlerConfigParamTypeValueArray = dArray( SaHpiUint8Type, SAHPI_MAX_TEXT_BUFFER_LENGTH ); static cMarshalType oHpiHandlerConfigParamTypeElements[] = { dStructElement( oHpiHandlerConfigParamT, Name, oHpiHandlerConfigParamTypeNameArray ), dStructElement( oHpiHandlerConfigParamT, Value, oHpiHandlerConfigParamTypeValueArray ), dStructElementEnd() }; cMarshalType oHpiHandlerConfigParamType = dStruct( oHpiHandlerConfigParamT, oHpiHandlerConfigParamTypeElements ); static cMarshalType HandlerConfigParamsArray = dVarArray( oHpiHandlerConfigParamType, dStructOffset( oHpiHandlerConfigT, NumberOfParams ) ); static cMarshalType oHpiHandlerConfigTypeElements[] = { dStructElement( oHpiHandlerConfigT, NumberOfParams, SaHpiUint8Type ), dStructElement( oHpiHandlerConfigT, Params, HandlerConfigParamsArray ), dStructElementEnd() }; cMarshalType oHpiHandlerConfigType = dStruct( oHpiHandlerConfigT, oHpiHandlerConfigTypeElements ); // entity static cMarshalType SaHpiEntityElements[] = { dStructElement( SaHpiEntityT, EntityType, SaHpiEntityTypeType ), dStructElement( SaHpiEntityT, EntityLocation, SaHpiEntityLocationType ), dStructElementEnd() }; cMarshalType SaHpiEntityType = dStruct( SaHpiEntityT, SaHpiEntityElements ); // entity path static cMarshalType SaHpiEntityPathEntryArray = dArray( SaHpiEntityType, SAHPI_MAX_ENTITY_PATH ); static cMarshalType SaHpiEntityPathElements[] = { dStructElement( SaHpiEntityPathT, Entry, SaHpiEntityPathEntryArray ), dStructElementEnd() }; cMarshalType SaHpiEntityPathType = dStruct( SaHpiEntityPathT, SaHpiEntityPathElements ); // sensors static cMarshalType SaHpiSensorInterpretedUnionBufferArray = dArray( SaHpiUint8Type, SAHPI_SENSOR_BUFFER_LENGTH ); static cMarshalType SaHpiSensorReadingUnionElements[] = { dUnionElement( SAHPI_SENSOR_READING_TYPE_INT64, SaHpiInt64Type ), dUnionElement( SAHPI_SENSOR_READING_TYPE_UINT64, SaHpiUint64Type ), dUnionElement( SAHPI_SENSOR_READING_TYPE_FLOAT64, SaHpiFloat64Type ), dUnionElement( SAHPI_SENSOR_READING_TYPE_BUFFER , SaHpiSensorInterpretedUnionBufferArray ), dUnionElementEnd() }; static cMarshalType SaHpiSensorReadingUnionType = dUnion( 1, SaHpiSensorReadingUnionT, SaHpiSensorReadingUnionElements ); // sensor reading static cMarshalType SaHpiSensorReadingTElements[] = { dStructElement( SaHpiSensorReadingT, IsSupported, SaHpiBoolType ), dStructElement( SaHpiSensorReadingT, Type, SaHpiSensorReadingTypeType ), dStructElement( SaHpiSensorReadingT, Value, SaHpiSensorReadingUnionType ), dStructElementEnd() }; cMarshalType SaHpiSensorReadingType = dStruct( SaHpiSensorReadingT, SaHpiSensorReadingTElements ); // sensor threshold values static cMarshalType SaHpiSensorThresholdsElements[] = { dStructElement( SaHpiSensorThresholdsT, LowCritical , SaHpiSensorReadingType ), dStructElement( SaHpiSensorThresholdsT, LowMajor , SaHpiSensorReadingType ), dStructElement( SaHpiSensorThresholdsT, LowMinor , SaHpiSensorReadingType ), dStructElement( SaHpiSensorThresholdsT, UpCritical , SaHpiSensorReadingType ), dStructElement( SaHpiSensorThresholdsT, UpMajor , SaHpiSensorReadingType ), dStructElement( SaHpiSensorThresholdsT, UpMinor , SaHpiSensorReadingType ), dStructElement( SaHpiSensorThresholdsT, PosThdHysteresis, SaHpiSensorReadingType ), dStructElement( SaHpiSensorThresholdsT, NegThdHysteresis, SaHpiSensorReadingType ), dStructElementEnd() }; cMarshalType SaHpiSensorThresholdsType = dStruct( SaHpiSensorThresholdsT, SaHpiSensorThresholdsElements ); // sensor range static cMarshalType SaHpiSensorRangeElements[] = { dStructElement( SaHpiSensorRangeT, Flags , SaHpiSensorRangeFlagsType ), dStructElement( SaHpiSensorRangeT, Max , SaHpiSensorReadingType ), dStructElement( SaHpiSensorRangeT, Min , SaHpiSensorReadingType ), dStructElement( SaHpiSensorRangeT, Nominal , SaHpiSensorReadingType ), dStructElement( SaHpiSensorRangeT, NormalMax, SaHpiSensorReadingType ), dStructElement( SaHpiSensorRangeT, NormalMin, SaHpiSensorReadingType ), dStructElementEnd() }; cMarshalType SaHpiSensorRangeType = dStruct( SaHpiSensorRangeT, SaHpiSensorRangeElements ); // sensor units static cMarshalType SaHpiSensorDataFormatElements[] = { dStructElement( SaHpiSensorDataFormatT, IsSupported, SaHpiBoolType ), dStructElement( SaHpiSensorDataFormatT, ReadingType, SaHpiSensorReadingTypeType ), dStructElement( SaHpiSensorDataFormatT, BaseUnits, SaHpiSensorUnitsType ), dStructElement( SaHpiSensorDataFormatT, ModifierUnits, SaHpiSensorUnitsType ), dStructElement( SaHpiSensorDataFormatT, ModifierUse, SaHpiSensorModUnitUseType ), dStructElement( SaHpiSensorDataFormatT, Percentage, SaHpiBoolType ), dStructElement( SaHpiSensorDataFormatT, Range, SaHpiSensorRangeType ), dStructElement( SaHpiSensorDataFormatT, AccuracyFactor,SaHpiFloat64Type ), dStructElementEnd() }; cMarshalType SaHpiSensorDataFormatType = dStruct( SaHpiSensorDataFormatT, SaHpiSensorDataFormatElements ); // threshold support static cMarshalType SaHpiSensorThdDefnElements[] = { dStructElement( SaHpiSensorThdDefnT, IsAccessible, SaHpiBoolType ), dStructElement( SaHpiSensorThdDefnT, ReadThold, SaHpiSensorThdMaskType ), dStructElement( SaHpiSensorThdDefnT, WriteThold, SaHpiSensorThdMaskType ), dStructElement( SaHpiSensorThdDefnT, Nonlinear, SaHpiBoolType ), dStructElementEnd() }; cMarshalType SaHpiSensorThdDefnType = dStruct( SaHpiSensorThdDefnT, SaHpiSensorThdDefnElements ); // sensor record static cMarshalType SaHpiSensorRecElements[] = { dStructElement( SaHpiSensorRecT, Num, SaHpiSensorNumType ), dStructElement( SaHpiSensorRecT, Type, SaHpiSensorTypeType ), dStructElement( SaHpiSensorRecT, Category, SaHpiEventCategoryType ), dStructElement( SaHpiSensorRecT, EnableCtrl,SaHpiBoolType ), dStructElement( SaHpiSensorRecT, EventCtrl, SaHpiSensorEventCtrlType ), dStructElement( SaHpiSensorRecT, Events, SaHpiEventStateType ), dStructElement( SaHpiSensorRecT, DataFormat, SaHpiSensorDataFormatType ), dStructElement( SaHpiSensorRecT, ThresholdDefn, SaHpiSensorThdDefnType ), dStructElement( SaHpiSensorRecT, Oem, SaHpiUint32Type ), dStructElementEnd() }; cMarshalType SaHpiSensorRecType = dStruct( SaHpiSensorRecT, SaHpiSensorRecElements ); // stream control state static cMarshalType SaHpiCtrlStateStreamArray = dArray( SaHpiUint8Type, SAHPI_CTRL_MAX_STREAM_LENGTH ); static cMarshalType SaHpiCtrlStateStreamElements[] = { dStructElement( SaHpiCtrlStateStreamT, Repeat, SaHpiBoolType ), dStructElement( SaHpiCtrlStateStreamT, StreamLength, SaHpiUint32Type ), dStructElement( SaHpiCtrlStateStreamT, Stream, SaHpiCtrlStateStreamArray ), dStructElementEnd() }; cMarshalType SaHpiCtrlStateStreamType = dStruct( SaHpiCtrlStateStreamT, SaHpiCtrlStateStreamElements ); // text control state static cMarshalType SaHpiCtrlStateTextElements[] = { dStructElement( SaHpiCtrlStateTextT, Line, SaHpiTxtLineNumType ), dStructElement( SaHpiCtrlStateTextT, Text, SaHpiTextBufferType ), dStructElementEnd() }; cMarshalType SaHpiCtrlStateTextType = dStruct( SaHpiCtrlStateTextT, SaHpiCtrlStateTextElements ); // OEM control state static cMarshalType SaHpiCtrlStateOemBodyArray = dArray( SaHpiUint8Type, SAHPI_CTRL_MAX_OEM_BODY_LENGTH ); static cMarshalType SaHpiCtrlStateOemElements[] = { dStructElement( SaHpiCtrlStateOemT, MId, SaHpiManufacturerIdType ), dStructElement( SaHpiCtrlStateOemT, BodyLength, SaHpiUint8Type ), dStructElement( SaHpiCtrlStateOemT, Body, SaHpiCtrlStateOemBodyArray ), dStructElementEnd() }; cMarshalType SaHpiCtrlStateOemType = dStruct( SaHpiCtrlStateOemT, SaHpiCtrlStateOemElements ); static cMarshalType SaHpiCtrlStateUnionElements[] = { dUnionElement( SAHPI_CTRL_TYPE_DIGITAL, SaHpiCtrlStateDigitalType ), dUnionElement( SAHPI_CTRL_TYPE_DISCRETE, SaHpiCtrlStateDiscreteType ), dUnionElement( SAHPI_CTRL_TYPE_ANALOG, SaHpiCtrlStateAnalogType ), dUnionElement( SAHPI_CTRL_TYPE_STREAM, SaHpiCtrlStateStreamType ), dUnionElement( SAHPI_CTRL_TYPE_TEXT, SaHpiCtrlStateTextType ), dUnionElement( SAHPI_CTRL_TYPE_OEM, SaHpiCtrlStateOemType ), dUnionElementEnd() }; static cMarshalType SaHpiCtrlStateUnionType = dUnion( 0, SaHpiCtrlStateUnionT, SaHpiCtrlStateUnionElements ); static cMarshalType SaHpiCtrlStateElements[] = { dStructElement( SaHpiCtrlStateT, Type, SaHpiCtrlTypeType ), dStructElement( SaHpiCtrlStateT, StateUnion, SaHpiCtrlStateUnionType ), dStructElementEnd() }; cMarshalType SaHpiCtrlStateType = dStruct( SaHpiCtrlStateT, SaHpiCtrlStateElements ); // control rdr record types static cMarshalType SaHpiCtrlRecDigitalElements[] = { dStructElement( SaHpiCtrlRecDigitalT, Default, SaHpiCtrlStateDigitalType ), dStructElementEnd() }; cMarshalType SaHpiCtrlRecDigitalType = dStruct( SaHpiCtrlRecDigitalT, SaHpiCtrlRecDigitalElements ); static cMarshalType SaHpiCtrlRecDiscreteElements[] = { dStructElement( SaHpiCtrlRecDiscreteT, Default, SaHpiCtrlStateDiscreteType ), dStructElementEnd() }; cMarshalType SaHpiCtrlRecDiscreteType = dStruct( SaHpiCtrlRecDiscreteT, SaHpiCtrlRecDiscreteElements ); static cMarshalType SaHpiCtrlRecAnalogElements[] = { dStructElement( SaHpiCtrlRecAnalogT, Min, SaHpiCtrlStateAnalogType ), dStructElement( SaHpiCtrlRecAnalogT, Max, SaHpiCtrlStateAnalogType ), dStructElement( SaHpiCtrlRecAnalogT, Default, SaHpiCtrlStateAnalogType ), dStructElementEnd() }; cMarshalType SaHpiCtrlRecAnalogType = dStruct( SaHpiCtrlRecAnalogT, SaHpiCtrlRecAnalogElements ); static cMarshalType SaHpiCtrlRecStreamElements[] = { dStructElement( SaHpiCtrlRecStreamT, Default, SaHpiCtrlStateStreamType ), dStructElementEnd() }; cMarshalType SaHpiCtrlRecStreamType = dStruct( SaHpiCtrlRecStreamT, SaHpiCtrlRecStreamElements ); static cMarshalType SaHpiCtrlRecTextElements[] = { dStructElement( SaHpiCtrlRecTextT, MaxChars, SaHpiUint8Type ), dStructElement( SaHpiCtrlRecTextT, MaxLines, SaHpiUint8Type ), dStructElement( SaHpiCtrlRecTextT, Language, SaHpiLanguageType ), dStructElement( SaHpiCtrlRecTextT, DataType, SaHpiTextTypeType ), dStructElement( SaHpiCtrlRecTextT, Default, SaHpiCtrlStateTextType ), dStructElementEnd() }; cMarshalType SaHpiCtrlRecTextType = dStruct( SaHpiCtrlRecTextT, SaHpiCtrlRecTextElements ); static cMarshalType SaHpiCtrlRecOemConfigDataArray = dArray( SaHpiUint8Type, SAHPI_CTRL_OEM_CONFIG_LENGTH ); static cMarshalType SaHpiCtrlRecOemElements[] = { dStructElement( SaHpiCtrlRecOemT, MId, SaHpiManufacturerIdType ), dStructElement( SaHpiCtrlRecOemT, ConfigData, SaHpiCtrlRecOemConfigDataArray ), dStructElement( SaHpiCtrlRecOemT, Default, SaHpiCtrlStateOemType ), dStructElementEnd() }; cMarshalType SaHpiCtrlRecOemType = dStruct( SaHpiCtrlRecOemT, SaHpiCtrlRecOemElements ); static cMarshalType SaHpiCtrlRecUnionElements[] = { dUnionElement( SAHPI_CTRL_TYPE_DIGITAL, SaHpiCtrlRecDigitalType ), dUnionElement( SAHPI_CTRL_TYPE_DISCRETE, SaHpiCtrlRecDiscreteType ), dUnionElement( SAHPI_CTRL_TYPE_ANALOG, SaHpiCtrlRecAnalogType ), dUnionElement( SAHPI_CTRL_TYPE_STREAM, SaHpiCtrlRecStreamType ), dUnionElement( SAHPI_CTRL_TYPE_TEXT, SaHpiCtrlRecTextType ), dUnionElement( SAHPI_CTRL_TYPE_OEM, SaHpiCtrlRecOemType ), dUnionElementEnd() }; static cMarshalType SaHpiCtrlRecUnionType = dUnion( 2, SaHpiCtrlRecUnionT, SaHpiCtrlRecUnionElements ); // control rdr mode static cMarshalType SaHpiCtrlDefaultModeElements[] = { dStructElement( SaHpiCtrlDefaultModeT, Mode, SaHpiCtrlModeType ), dStructElement( SaHpiCtrlDefaultModeT, ReadOnly, SaHpiBoolType), dStructElementEnd() }; cMarshalType SaHpiCtrlDefaultModeType = dStruct( SaHpiCtrlDefaultModeT, SaHpiCtrlDefaultModeElements ); static cMarshalType SaHpiCtrlRecElements[] = { dStructElement( SaHpiCtrlRecT, Num, SaHpiCtrlNumType ), dStructElement( SaHpiCtrlRecT, OutputType, SaHpiCtrlOutputTypeType ), dStructElement( SaHpiCtrlRecT, Type, SaHpiCtrlTypeType ), dStructElement( SaHpiCtrlRecT, TypeUnion, SaHpiCtrlRecUnionType ), dStructElement( SaHpiCtrlRecT, DefaultMode, SaHpiCtrlDefaultModeType ), dStructElement( SaHpiCtrlRecT, WriteOnly, SaHpiBoolType ), dStructElement( SaHpiCtrlRecT, Oem, SaHpiUint32Type), dStructElementEnd() }; cMarshalType SaHpiCtrlRecType = dStruct( SaHpiCtrlRecT, SaHpiCtrlRecElements ); // entity inventory data static cMarshalType SaHpiIdrFieldTElements[] = { dStructElement( SaHpiIdrFieldT, AreaId, SaHpiEntryIdType ), dStructElement( SaHpiIdrFieldT, FieldId, SaHpiEntryIdType ), dStructElement( SaHpiIdrFieldT, Type, SaHpiIdrFieldTypeType ), dStructElement( SaHpiIdrFieldT, ReadOnly, SaHpiBoolType ), dStructElement( SaHpiIdrFieldT, Field, SaHpiTextBufferType ), dStructElementEnd() }; cMarshalType SaHpiIdrFieldType = dStruct( SaHpiIdrFieldT, SaHpiIdrFieldTElements ); static cMarshalType SaHpiIdrAreaHeaderTElements[] = { dStructElement( SaHpiIdrAreaHeaderT, AreaId, SaHpiEntryIdType ), dStructElement( SaHpiIdrAreaHeaderT, Type, SaHpiIdrAreaTypeType ), dStructElement( SaHpiIdrAreaHeaderT, ReadOnly, SaHpiBoolType ), dStructElement( SaHpiIdrAreaHeaderT, NumFields, SaHpiUint32Type ), dStructElementEnd() }; cMarshalType SaHpiIdrAreaHeaderType = dStruct( SaHpiIdrAreaHeaderT, SaHpiIdrAreaHeaderTElements ); static cMarshalType SaHpiIdrInfoTElements[] = { dStructElement( SaHpiIdrInfoT, IdrId, SaHpiIdrIdType ), dStructElement( SaHpiIdrInfoT, UpdateCount, SaHpiUint32Type ), dStructElement( SaHpiIdrInfoT, ReadOnly, SaHpiBoolType ), dStructElement( SaHpiIdrInfoT, NumAreas, SaHpiUint32Type ), dStructElementEnd() }; cMarshalType SaHpiIdrInfoType = dStruct( SaHpiIdrInfoT, SaHpiIdrInfoTElements ); // inventory resource data records static cMarshalType SaHpiInventoryRecElements[] = { dStructElement( SaHpiInventoryRecT, IdrId, SaHpiUint32Type ), dStructElement( SaHpiInventoryRecT, Persistent, SaHpiBoolType ), dStructElement( SaHpiInventoryRecT, Oem, SaHpiUint32Type ), dStructElementEnd() }; cMarshalType SaHpiInventoryRecType = dStruct( SaHpiInventoryRecT, SaHpiInventoryRecElements ); // watchdogs static cMarshalType SaHpiWatchdogElements[] = { dStructElement( SaHpiWatchdogT, Log, SaHpiBoolType ), dStructElement( SaHpiWatchdogT, Running, SaHpiBoolType ), dStructElement( SaHpiWatchdogT, TimerUse, SaHpiWatchdogTimerUseType ), dStructElement( SaHpiWatchdogT, TimerAction, SaHpiWatchdogActionType ), dStructElement( SaHpiWatchdogT, PretimerInterrupt, SaHpiWatchdogPretimerInterruptType ), dStructElement( SaHpiWatchdogT, PreTimeoutInterval, SaHpiUint32Type ), dStructElement( SaHpiWatchdogT, TimerUseExpFlags, SaHpiWatchdogExpFlagsType ), dStructElement( SaHpiWatchdogT, InitialCount, SaHpiUint32Type ), dStructElement( SaHpiWatchdogT, PresentCount, SaHpiUint32Type ), dStructElementEnd() }; cMarshalType SaHpiWatchdogType = dStruct( SaHpiWatchdogT, SaHpiWatchdogElements ); // watchdog resource data records static cMarshalType SaHpiWatchdogRecElements[] = { dStructElement( SaHpiWatchdogRecT, WatchdogNum, SaHpiWatchdogNumType ), dStructElement( SaHpiWatchdogRecT, Oem, SaHpiUint32Type ), dStructElementEnd() }; cMarshalType SaHpiWatchdogRecType = dStruct( SaHpiWatchdogRecT, SaHpiWatchdogRecElements ); // annunciators static cMarshalType SaHpiNameDataArray = dArray( SaHpiUint8Type, SA_HPI_MAX_NAME_LENGTH ); static cMarshalType SaHpiNameElements[] = { dStructElement( SaHpiNameT, Length, SaHpiUint16Type ), dStructElement( SaHpiNameT, Value, SaHpiNameDataArray ), dStructElementEnd() }; cMarshalType SaHpiNameType = dStruct( SaHpiNameT, SaHpiNameElements ); static cMarshalType SaHpiConditionTypeElements[] = { dStructElement( SaHpiConditionT, Type, SaHpiStatusCondTypeType ), dStructElement( SaHpiConditionT, Entity, SaHpiEntityPathType ), dStructElement( SaHpiConditionT, DomainId, SaHpiDomainIdType ), dStructElement( SaHpiConditionT, ResourceId, SaHpiResourceIdType ), dStructElement( SaHpiConditionT, SensorNum, SaHpiSensorNumType ), dStructElement( SaHpiConditionT, EventState, SaHpiEventStateType ), dStructElement( SaHpiConditionT, Name, SaHpiNameType ), dStructElement( SaHpiConditionT, Mid, SaHpiManufacturerIdType ), dStructElement( SaHpiConditionT, Data, SaHpiTextBufferType ), dStructElementEnd() }; cMarshalType SaHpiConditionType = dStruct( SaHpiConditionT, SaHpiConditionTypeElements ); static cMarshalType SaHpiAnnouncementTypeElements[] = { dStructElement( SaHpiAnnouncementT, EntryId, SaHpiEntryIdType ), dStructElement( SaHpiAnnouncementT, Timestamp, SaHpiTimeType ), dStructElement( SaHpiAnnouncementT, AddedByUser, SaHpiBoolType ), dStructElement( SaHpiAnnouncementT, Severity, SaHpiSeverityType ), dStructElement( SaHpiAnnouncementT, Acknowledged, SaHpiBoolType ), dStructElement( SaHpiAnnouncementT, StatusCond, SaHpiConditionType ), dStructElementEnd() }; cMarshalType SaHpiAnnouncementType = dStruct( SaHpiAnnouncementT, SaHpiAnnouncementTypeElements ); // annunciators rdr static cMarshalType SaHpiAnnunciatorRecElements[] = { dStructElement( SaHpiAnnunciatorRecT, AnnunciatorNum, SaHpiAnnunciatorNumType ), dStructElement( SaHpiAnnunciatorRecT, AnnunciatorType, SaHpiAnnunciatorTypeType ), dStructElement( SaHpiAnnunciatorRecT, ModeReadOnly, SaHpiBoolType ), dStructElement( SaHpiAnnunciatorRecT, MaxConditions, SaHpiUint32Type ), dStructElement( SaHpiAnnunciatorRecT, Oem, SaHpiUint32Type ), dStructElementEnd() }; cMarshalType SaHpiAnnunciatorRecType = dStruct( SaHpiAnnunciatorRecT, SaHpiAnnunciatorRecElements ); //DIMIs static cMarshalType SaHpiDimiInfoElements[] = { dStructElement( SaHpiDimiInfoT, NumberOfTests, SaHpiDimiTotalTestsType ), dStructElement( SaHpiDimiInfoT, TestNumUpdateCounter, SaHpiUint32Type ), dStructElementEnd() }; cMarshalType SaHpiDimiInfoType = dStruct ( SaHpiDimiInfoT, SaHpiDimiInfoElements ); static cMarshalType SaHpiDimiTestParameterValueUnionTypeElements[] = { dUnionElement( SAHPI_DIMITEST_PARAM_TYPE_INT32, SaHpiInt32Type ), dUnionElement( SAHPI_DIMITEST_PARAM_TYPE_FLOAT64, SaHpiFloat64Type ), /* These two types are disregarded but must be spepcified */ dUnionElement( SAHPI_DIMITEST_PARAM_TYPE_BOOLEAN, SaHpiFloat64Type ), dUnionElement( SAHPI_DIMITEST_PARAM_TYPE_TEXT, SaHpiFloat64Type ), dUnionElementEnd() }; cMarshalType SaHpiDimiTestParameterValueUnionType = dUnion( 2, SaHpiDimiTestParameterValueUnionT, SaHpiDimiTestParameterValueUnionTypeElements ); static cMarshalType SaHpiDimiTestParamValue2TypeElements[] = { dUnionElement( SAHPI_DIMITEST_PARAM_TYPE_INT32, SaHpiInt32Type ), dUnionElement( SAHPI_DIMITEST_PARAM_TYPE_FLOAT64, SaHpiFloat64Type ), dUnionElement( SAHPI_DIMITEST_PARAM_TYPE_BOOLEAN, SaHpiBoolType ), dUnionElement( SAHPI_DIMITEST_PARAM_TYPE_TEXT, SaHpiTextBufferType ), dUnionElementEnd() }; cMarshalType SaHpiDimiTestParamValue2Type = dUnion( 2, SaHpiDimiTestParamValueT, SaHpiDimiTestParamValue2TypeElements ); static cMarshalType SaHpiDimiTestParamValue1TypeElements[] = { dUnionElement( SAHPI_DIMITEST_PARAM_TYPE_INT32, SaHpiInt32Type ), dUnionElement( SAHPI_DIMITEST_PARAM_TYPE_FLOAT64, SaHpiFloat64Type ), dUnionElement( SAHPI_DIMITEST_PARAM_TYPE_BOOLEAN, SaHpiBoolType ), dUnionElement( SAHPI_DIMITEST_PARAM_TYPE_TEXT, SaHpiTextBufferType ), dUnionElementEnd() }; cMarshalType SaHpiDimiTestParamValue1Type = dUnion( 1, SaHpiDimiTestParamValueT, SaHpiDimiTestParamValue1TypeElements ); static cMarshalType ParamNameArray = dArray( SaHpiUint8Type, SAHPI_DIMITEST_PARAM_NAME_LEN ); static cMarshalType SaHpiDimiTestParamsDefinitionTypeElements[] = { dStructElement( SaHpiDimiTestParamsDefinitionT, ParamName, ParamNameArray ), dStructElement( SaHpiDimiTestParamsDefinitionT, ParamInfo, SaHpiTextBufferType ), dStructElement( SaHpiDimiTestParamsDefinitionT, ParamType, SaHpiDimiTestParamTypeType ), dStructElement( SaHpiDimiTestParamsDefinitionT, MinValue, SaHpiDimiTestParameterValueUnionType ), dStructElement( SaHpiDimiTestParamsDefinitionT, MaxValue, SaHpiDimiTestParameterValueUnionType ), dStructElement( SaHpiDimiTestParamsDefinitionT, DefaultParam, SaHpiDimiTestParamValue2Type ), dStructElementEnd() }; cMarshalType SaHpiDimiTestParamsDefinitionType = dStruct( SaHpiDimiTestParamsDefinitionT, SaHpiDimiTestParamsDefinitionTypeElements ); static cMarshalType SaHpiDimiTestAffectedEntityTypeElements[] = { dStructElement( SaHpiDimiTestAffectedEntityT, EntityImpacted, SaHpiEntityPathType ), dStructElement( SaHpiDimiTestAffectedEntityT, ServiceImpact, SaHpiDimiTestServiceImpactType ), dStructElementEnd() }; cMarshalType SaHpiDimiTestAffectedEntityType = dStruct( SaHpiDimiTestAffectedEntityT, SaHpiDimiTestAffectedEntityTypeElements ); static cMarshalType EntitiesImpactedArray = dArray( SaHpiDimiTestAffectedEntityType, SAHPI_DIMITEST_MAX_ENTITIESIMPACTED ); static cMarshalType TestParametersArray = dArray( SaHpiDimiTestParamsDefinitionType, SAHPI_DIMITEST_MAX_PARAMETERS ); static cMarshalType SaHpiDimiTestTypeElements[] = { dStructElement( SaHpiDimiTestT, TestName, SaHpiTextBufferType ), dStructElement( SaHpiDimiTestT, ServiceImpact, SaHpiDimiTestServiceImpactType ), dStructElement( SaHpiDimiTestT, EntitiesImpacted, EntitiesImpactedArray ), dStructElement( SaHpiDimiTestT, NeedServiceOS, SaHpiBoolType ), dStructElement( SaHpiDimiTestT, ServiceOS, SaHpiTextBufferType ), dStructElement( SaHpiDimiTestT, ExpectedRunDuration, SaHpiTimeType ), dStructElement( SaHpiDimiTestT, TestCapabilities, SaHpiDimiTestCapabilityType ), dStructElement( SaHpiDimiTestT, TestParameters, TestParametersArray ), dStructElementEnd() }; cMarshalType SaHpiDimiTestType = dStruct( SaHpiDimiTestT, SaHpiDimiTestTypeElements ); static cMarshalType SaHpiDimiTestResultsTypeElements[] = { dStructElement( SaHpiDimiTestResultsT, ResultTimeStamp, SaHpiTimeType ), dStructElement( SaHpiDimiTestResultsT, RunDuration, SaHpiTimeoutType ), dStructElement( SaHpiDimiTestResultsT, LastRunStatus, SaHpiDimiTestRunStatusType ), dStructElement( SaHpiDimiTestResultsT, TestErrorCode, SaHpiDimiTestErrCodeType ), dStructElement( SaHpiDimiTestResultsT, TestResultString, SaHpiTextBufferType ), dStructElement( SaHpiDimiTestResultsT, TestResultStringIsURI, SaHpiBoolType ), dStructElementEnd() }; cMarshalType SaHpiDimiTestResultsType = dStruct( SaHpiDimiTestResultsT, SaHpiDimiTestResultsTypeElements ); static cMarshalType SaHpiDimiTestVariableParamsTypeElements[] = { dStructElement( SaHpiDimiTestVariableParamsT, ParamName, ParamNameArray ), dStructElement( SaHpiDimiTestVariableParamsT, ParamType, SaHpiDimiTestParamTypeType ), dStructElement( SaHpiDimiTestVariableParamsT, Value, SaHpiDimiTestParamValue1Type ), dStructElementEnd() }; cMarshalType SaHpiDimiTestVariableParamsType = dStruct( SaHpiDimiTestVariableParamsT, SaHpiDimiTestVariableParamsTypeElements ); static cMarshalType ParamsListArray = dVarArray( SaHpiDimiTestVariableParamsType, dStructOffset( SaHpiDimiTestVariableParamsListT, NumberOfParams ) ); static cMarshalType SaHpiDimiTestVariableParamsListTypeElements[] = { dStructElement( SaHpiDimiTestVariableParamsListT, NumberOfParams, SaHpiUint8Type ), dStructElement( SaHpiDimiTestVariableParamsListT, ParamsList, ParamsListArray ), dStructElementEnd() }; cMarshalType SaHpiDimiTestVariableParamsListType = dStruct( SaHpiDimiTestVariableParamsListT, SaHpiDimiTestVariableParamsListTypeElements ); // DIMI rdr static cMarshalType SaHpiDimiRecElements[] = { dStructElement( SaHpiDimiRecT, DimiNum, SaHpiDimiNumType ), dStructElement( SaHpiDimiRecT, Oem, SaHpiUint32Type ), dStructElementEnd() }; cMarshalType SaHpiDimiRecType = dStruct( SaHpiDimiRecT, SaHpiDimiRecElements ); // FUMIs static cMarshalType SaHpiFumiSafDefinedSpecInfoElements[] = { dStructElement( SaHpiFumiSafDefinedSpecInfoT, SpecID, SaHpiFumiSafDefinedSpecIdType ), dStructElement( SaHpiFumiSafDefinedSpecInfoT, RevisionID, SaHpiUint32Type ), dStructElementEnd() }; static cMarshalType SaHpiFumiSafDefinedSpecInfoType = dStruct( SaHpiFumiSafDefinedSpecInfoT, SaHpiFumiSafDefinedSpecInfoElements ); static cMarshalType SaHpiFumiOemDefinedSpecInfoBodyArray = dArray( SaHpiUint8Type, SAHPI_FUMI_MAX_OEM_BODY_LENGTH ); static cMarshalType SaHpiFumiOemDefinedSpecInfoElements[] = { dStructElement( SaHpiFumiOemDefinedSpecInfoT, Mid, SaHpiManufacturerIdType ), dStructElement( SaHpiFumiOemDefinedSpecInfoT, BodyLength, SaHpiUint8Type ), dStructElement( SaHpiFumiOemDefinedSpecInfoT, Body, SaHpiFumiOemDefinedSpecInfoBodyArray ), dStructElementEnd() }; static cMarshalType SaHpiFumiOemDefinedSpecInfoType = dStruct( SaHpiFumiOemDefinedSpecInfoT, SaHpiFumiOemDefinedSpecInfoElements ); static cMarshalType SaHpiFumiSpecInfoTypeUnionElements[] = { dUnionElement( SAHPI_FUMI_SPEC_INFO_NONE, SaHpiVoidType ), dUnionElement( SAHPI_FUMI_SPEC_INFO_SAF_DEFINED, SaHpiFumiSafDefinedSpecInfoType ), dUnionElement( SAHPI_FUMI_SPEC_INFO_OEM_DEFINED, SaHpiFumiOemDefinedSpecInfoType ), dUnionElementEnd() }; static cMarshalType SaHpiFumiSpecInfoTypeUnionType = dUnion( 0, SaHpiFumiSpecInfoTypeUnionT, SaHpiFumiSpecInfoTypeUnionElements ); static cMarshalType SaHpiFumiSpecInfoTypeElements[] = { dStructElement( SaHpiFumiSpecInfoT, SpecInfoType, SaHpiFumiSpecInfoTypeType ), dStructElement( SaHpiFumiSpecInfoT, SpecInfoTypeUnion, SaHpiFumiSpecInfoTypeUnionType ), dStructElementEnd() }; cMarshalType SaHpiFumiSpecInfoType = dStruct( SaHpiFumiSpecInfoT, SaHpiFumiSpecInfoTypeElements ); static cMarshalType SaHpiFumiImpactedEntityTypeElements[] = { dStructElement( SaHpiFumiImpactedEntityT, ImpactedEntity, SaHpiEntityPathType ), dStructElement( SaHpiFumiImpactedEntityT, ServiceImpact, SaHpiFumiServiceImpactType ), dStructElementEnd() }; static cMarshalType SaHpiFumiImpactedEntityType = dStruct( SaHpiFumiImpactedEntityT, SaHpiFumiImpactedEntityTypeElements ); static cMarshalType SaHpiFumiServiceImpactDataImpactedEntitiesArray = dArray( SaHpiFumiImpactedEntityType, SAHPI_FUMI_MAX_ENTITIES_IMPACTED ); static cMarshalType SaHpiFumiServiceImpactDataElements[] = { dStructElement( SaHpiFumiServiceImpactDataT, NumEntities, SaHpiUint32Type ), dStructElement( SaHpiFumiServiceImpactDataT, ImpactedEntities, SaHpiFumiServiceImpactDataImpactedEntitiesArray ), dStructElementEnd() }; cMarshalType SaHpiFumiServiceImpactDataType = dStruct( SaHpiFumiServiceImpactDataT, SaHpiFumiServiceImpactDataElements ); static cMarshalType SaHpiFumiSourceInfoTypeElements[] = { dStructElement( SaHpiFumiSourceInfoT, SourceUri, SaHpiTextBufferType ), dStructElement( SaHpiFumiSourceInfoT, SourceStatus, SaHpiFumiSourceStatusType ), dStructElement( SaHpiFumiSourceInfoT, Identifier, SaHpiTextBufferType ), dStructElement( SaHpiFumiSourceInfoT, Description, SaHpiTextBufferType ), dStructElement( SaHpiFumiSourceInfoT, DateTime, SaHpiTextBufferType ), dStructElement( SaHpiFumiSourceInfoT, MajorVersion, SaHpiUint32Type ), dStructElement( SaHpiFumiSourceInfoT, MinorVersion, SaHpiUint32Type ), dStructElement( SaHpiFumiSourceInfoT, AuxVersion, SaHpiUint32Type ), dStructElementEnd() }; cMarshalType SaHpiFumiSourceInfoType = dStruct( SaHpiFumiSourceInfoT, SaHpiFumiSourceInfoTypeElements ); static cMarshalType SaHpiFumiBankInfoTypeElements[] = { dStructElement( SaHpiFumiBankInfoT, BankId, SaHpiUint8Type ), dStructElement( SaHpiFumiBankInfoT, BankSize, SaHpiUint32Type ), dStructElement( SaHpiFumiBankInfoT, Position, SaHpiUint32Type ), dStructElement( SaHpiFumiBankInfoT, BankState, SaHpiFumiBankStateType ), dStructElement( SaHpiFumiBankInfoT, Identifier, SaHpiTextBufferType ), dStructElement( SaHpiFumiBankInfoT, Description, SaHpiTextBufferType ), dStructElement( SaHpiFumiBankInfoT, DateTime, SaHpiTextBufferType ), dStructElement( SaHpiFumiBankInfoT, MajorVersion, SaHpiUint32Type ), dStructElement( SaHpiFumiBankInfoT, MinorVersion, SaHpiUint32Type ), dStructElement( SaHpiFumiBankInfoT, AuxVersion, SaHpiUint32Type ), dStructElementEnd() }; cMarshalType SaHpiFumiBankInfoType = dStruct( SaHpiFumiBankInfoT, SaHpiFumiBankInfoTypeElements ); static cMarshalType SaHpiFumiFirmwareInstanceInfoTypeElements[] = { dStructElement( SaHpiFumiFirmwareInstanceInfoT, InstancePresent, SaHpiBoolType ), dStructElement( SaHpiFumiFirmwareInstanceInfoT, Identifier, SaHpiTextBufferType ), dStructElement( SaHpiFumiFirmwareInstanceInfoT, Description, SaHpiTextBufferType ), dStructElement( SaHpiFumiFirmwareInstanceInfoT, DateTime, SaHpiTextBufferType ), dStructElement( SaHpiFumiFirmwareInstanceInfoT, MajorVersion, SaHpiUint32Type ), dStructElement( SaHpiFumiFirmwareInstanceInfoT, MinorVersion, SaHpiUint32Type ), dStructElement( SaHpiFumiFirmwareInstanceInfoT, AuxVersion, SaHpiUint32Type ), dStructElementEnd() }; static cMarshalType SaHpiFumiFirmwareInstanceInfoType = dStruct( SaHpiFumiFirmwareInstanceInfoT, SaHpiFumiFirmwareInstanceInfoTypeElements ); static cMarshalType SaHpiFumiLogicalBankInfoTypeElements[] = { dStructElement( SaHpiFumiLogicalBankInfoT, FirmwarePersistentLocationCount, SaHpiUint8Type ), dStructElement( SaHpiFumiLogicalBankInfoT, BankStateFlags, SaHpiFumiLogicalBankStateFlagsType ), dStructElement( SaHpiFumiLogicalBankInfoT, PendingFwInstance, SaHpiFumiFirmwareInstanceInfoType ), dStructElement( SaHpiFumiLogicalBankInfoT, RollbackFwInstance, SaHpiFumiFirmwareInstanceInfoType ), dStructElementEnd() }; cMarshalType SaHpiFumiLogicalBankInfoType = dStruct( SaHpiFumiLogicalBankInfoT, SaHpiFumiLogicalBankInfoTypeElements ); static cMarshalType SaHpiFumiComponentInfoTypeElements[] = { dStructElement( SaHpiFumiComponentInfoT, EntryId, SaHpiEntryIdType ), dStructElement( SaHpiFumiComponentInfoT, ComponentId, SaHpiUint32Type ), dStructElement( SaHpiFumiComponentInfoT, MainFwInstance, SaHpiFumiFirmwareInstanceInfoType ), dStructElement( SaHpiFumiComponentInfoT, ComponentFlags, SaHpiUint32Type ), dStructElementEnd() }; cMarshalType SaHpiFumiComponentInfoType = dStruct( SaHpiFumiComponentInfoT, SaHpiFumiComponentInfoTypeElements ); static cMarshalType SaHpiFumiLogicalComponentInfoTypeElements[] = { dStructElement( SaHpiFumiLogicalComponentInfoT, EntryId, SaHpiEntryIdType ), dStructElement( SaHpiFumiLogicalComponentInfoT, ComponentId, SaHpiUint32Type ), dStructElement( SaHpiFumiLogicalComponentInfoT, PendingFwInstance, SaHpiFumiFirmwareInstanceInfoType ), dStructElement( SaHpiFumiLogicalComponentInfoT, RollbackFwInstance, SaHpiFumiFirmwareInstanceInfoType ), dStructElement( SaHpiFumiLogicalComponentInfoT, ComponentFlags, SaHpiUint32Type ), dStructElementEnd() }; cMarshalType SaHpiFumiLogicalComponentInfoType = dStruct( SaHpiFumiLogicalComponentInfoT, SaHpiFumiLogicalComponentInfoTypeElements ); // FUMI rdr static cMarshalType SaHpiFumiRecElements[] = { dStructElement( SaHpiFumiRecT, Num, SaHpiFumiNumType ), dStructElement( SaHpiFumiRecT, AccessProt, SaHpiFumiProtocolType ), dStructElement( SaHpiFumiRecT, Capability, SaHpiFumiCapabilityType ), dStructElement( SaHpiFumiRecT, NumBanks, SaHpiUint8Type ), dStructElement( SaHpiFumiRecT, Oem, SaHpiUint32Type ), dStructElementEnd() }; cMarshalType SaHpiFumiRecType = dStruct( SaHpiFumiRecT, SaHpiFumiRecElements ); // rdr static cMarshalType SaHpiRdrTypeUnionTypeElements[] = { dUnionElement( SAHPI_NO_RECORD, SaHpiVoidType ), dUnionElement( SAHPI_CTRL_RDR, SaHpiCtrlRecType ), dUnionElement( SAHPI_SENSOR_RDR, SaHpiSensorRecType ), dUnionElement( SAHPI_INVENTORY_RDR, SaHpiInventoryRecType ), dUnionElement( SAHPI_WATCHDOG_RDR, SaHpiWatchdogRecType ), dUnionElement( SAHPI_ANNUNCIATOR_RDR, SaHpiAnnunciatorRecType ), dUnionElement( SAHPI_DIMI_RDR, SaHpiDimiRecType ), dUnionElement( SAHPI_FUMI_RDR, SaHpiFumiRecType ), dUnionElementEnd() }; static cMarshalType SaHpiRdrTypeUnionType = dUnion( 1, SaHpiRdrTypeUnionT, SaHpiRdrTypeUnionTypeElements ); static cMarshalType SaHpiRdrElements[] = { dStructElement( SaHpiRdrT, RecordId, SaHpiEntryIdType ), dStructElement( SaHpiRdrT, RdrType, SaHpiRdrTypeType ), dStructElement( SaHpiRdrT, Entity, SaHpiEntityPathType ), dStructElement( SaHpiRdrT, IsFru, SaHpiBoolType ), dStructElement( SaHpiRdrT, RdrTypeUnion, SaHpiRdrTypeUnionType ), dStructElement( SaHpiRdrT, IdString, SaHpiTextBufferType ), dStructElementEnd() }; cMarshalType SaHpiRdrType = dStruct( SaHpiRdrT, SaHpiRdrElements ); // events part 2 static cMarshalType SaHpiResourceEventTypeElements[] = { dStructElement( SaHpiResourceEventT, ResourceEventType, SaHpiResourceEventTypeType ), dStructElementEnd() }; cMarshalType SaHpiResourceEventType = dStruct( SaHpiResourceEventTypeT, SaHpiResourceEventTypeElements ); static cMarshalType SaHpiDomainEventTypeElements[] = { dStructElement( SaHpiDomainEventT, Type, SaHpiDomainEventTypeType ), dStructElement( SaHpiDomainEventT, DomainId, SaHpiDomainIdType ), dStructElementEnd() }; cMarshalType SaHpiDomainEventType = dStruct( SaHpiDomainEventT, SaHpiDomainEventTypeElements ); static cMarshalType SaHpiSensorEventElements[] = { dStructElement( SaHpiSensorEventT, SensorNum, SaHpiSensorNumType ), dStructElement( SaHpiSensorEventT, SensorType, SaHpiSensorTypeType ), dStructElement( SaHpiSensorEventT, EventCategory, SaHpiEventCategoryType ), dStructElement( SaHpiSensorEventT, Assertion, SaHpiBoolType ), dStructElement( SaHpiSensorEventT, EventState, SaHpiEventStateType ), dStructElement( SaHpiSensorEventT, OptionalDataPresent, SaHpiSensorOptionalDataType ), dStructElement( SaHpiSensorEventT, TriggerReading, SaHpiSensorReadingType ), dStructElement( SaHpiSensorEventT, TriggerThreshold, SaHpiSensorReadingType ), dStructElement( SaHpiSensorEventT, PreviousState, SaHpiEventStateType ), dStructElement( SaHpiSensorEventT, CurrentState, SaHpiEventStateType ), dStructElement( SaHpiSensorEventT, Oem, SaHpiUint32Type ), dStructElement( SaHpiSensorEventT, SensorSpecific, SaHpiUint32Type ), dStructElementEnd() }; cMarshalType SaHpiSensorEventType = dStruct( SaHpiSensorEventT, SaHpiSensorEventElements ); static cMarshalType SaHpiSensorEnableChangeEventTElements[] = { dStructElement( SaHpiSensorEnableChangeEventT, SensorNum, SaHpiSensorNumType ), dStructElement( SaHpiSensorEnableChangeEventT, SensorType, SaHpiSensorTypeType ), dStructElement( SaHpiSensorEnableChangeEventT, EventCategory, SaHpiEventCategoryType ), dStructElement( SaHpiSensorEnableChangeEventT, SensorEnable, SaHpiBoolType ), dStructElement( SaHpiSensorEnableChangeEventT, SensorEventEnable, SaHpiBoolType ), dStructElement( SaHpiSensorEnableChangeEventT, AssertEventMask, SaHpiEventStateType ), dStructElement( SaHpiSensorEnableChangeEventT, DeassertEventMask, SaHpiEventStateType ), dStructElement( SaHpiSensorEnableChangeEventT, OptionalDataPresent, SaHpiSensorEnableOptDataType ), dStructElement( SaHpiSensorEnableChangeEventT, CurrentState, SaHpiEventStateType ), dStructElementEnd() }; cMarshalType SaHpiSensorEnableChangeEventType = dStruct( SaHpiSensorEnableChangeEventT, SaHpiSensorEnableChangeEventTElements ); static cMarshalType SaHpiHotSwapEventElements[] = { dStructElement( SaHpiHotSwapEventT, HotSwapState, SaHpiHsStateType ), dStructElement( SaHpiHotSwapEventT, PreviousHotSwapState, SaHpiHsStateType ), dStructElement( SaHpiHotSwapEventT, CauseOfStateChange, SaHpiHsCauseOfStateChangeType ), dStructElementEnd() }; cMarshalType SaHpiHotSwapEventType = dStruct( SaHpiHotSwapEventT, SaHpiHotSwapEventElements ); static cMarshalType SaHpiWatchdogEventElements[] = { dStructElement( SaHpiWatchdogEventT, WatchdogNum, SaHpiWatchdogNumType ), dStructElement( SaHpiWatchdogEventT, WatchdogAction, SaHpiWatchdogActionEventType ), dStructElement( SaHpiWatchdogEventT, WatchdogPreTimerAction, SaHpiWatchdogPretimerInterruptType ), dStructElement( SaHpiWatchdogEventT, WatchdogUse, SaHpiWatchdogTimerUseType ), dStructElementEnd() }; cMarshalType SaHpiWatchdogEventType = dStruct( SaHpiWatchdogEventT, SaHpiWatchdogEventElements ); static cMarshalType SaHpiHpiSwEventTypeElements[] = { dStructElement( SaHpiHpiSwEventT, MId, SaHpiManufacturerIdType ), dStructElement( SaHpiHpiSwEventT, Type, SaHpiSwEventTypeType ), dStructElement( SaHpiHpiSwEventT, EventData, SaHpiTextBufferType ), dStructElementEnd() }; cMarshalType SaHpiHpiSwEventType = dStruct( SaHpiHpiSwEventT, SaHpiHpiSwEventTypeElements ); static cMarshalType SaHpiOemEventTypeElements[] = { dStructElement( SaHpiOemEventT, MId, SaHpiManufacturerIdType ), dStructElement( SaHpiOemEventT, OemEventData, SaHpiTextBufferType ), dStructElementEnd() }; cMarshalType SaHpiOemEventType = dStruct( SaHpiOemEventT, SaHpiOemEventTypeElements ); static cMarshalType SaHpiUserEventElements[] = { dStructElement( SaHpiUserEventT, UserEventData, SaHpiTextBufferType ), dStructElementEnd() }; cMarshalType SaHpiUserEventType = dStruct( SaHpiUserEventT, SaHpiUserEventElements ); static cMarshalType SaHpiDimiEventElements[] = { dStructElement( SaHpiDimiEventT, DimiNum, SaHpiDimiNumType ), dStructElement( SaHpiDimiEventT, TestNum, SaHpiDimiTestNumType ), dStructElement( SaHpiDimiEventT, DimiTestRunStatus, SaHpiDimiTestRunStatusType ), dStructElement( SaHpiDimiEventT, DimiTestPercentCompleted, SaHpiDimiTestPercentCompletedType ), dStructElementEnd() }; cMarshalType SaHpiDimiEventType = dStruct( SaHpiDimiEventT, SaHpiDimiEventElements ); static cMarshalType SaHpiDimiUpdateEventElements[] = { dStructElement( SaHpiDimiUpdateEventT, DimiNum, SaHpiDimiNumType ), dStructElementEnd() }; cMarshalType SaHpiDimiUpdateEventType = dStruct( SaHpiDimiUpdateEventT, SaHpiDimiUpdateEventElements ); static cMarshalType SaHpiFumiEventElements[] = { dStructElement( SaHpiFumiEventT, FumiNum, SaHpiFumiNumType ), dStructElement( SaHpiFumiEventT, BankNum, SaHpiUint8Type ), dStructElement( SaHpiFumiEventT, UpgradeStatus, SaHpiFumiUpgradeStatusType ), dStructElementEnd() }; cMarshalType SaHpiFumiEventType = dStruct( SaHpiFumiEventT, SaHpiFumiEventElements ); static cMarshalType SaHpiEventUnionElements[] = { dUnionElement( SAHPI_ET_RESOURCE, SaHpiResourceEventType ), dUnionElement( SAHPI_ET_DOMAIN, SaHpiDomainEventType ), dUnionElement( SAHPI_ET_SENSOR, SaHpiSensorEventType ), dUnionElement( SAHPI_ET_SENSOR_ENABLE_CHANGE, SaHpiSensorEnableChangeEventType ), dUnionElement( SAHPI_ET_HOTSWAP, SaHpiHotSwapEventType ), dUnionElement( SAHPI_ET_WATCHDOG, SaHpiWatchdogEventType ), dUnionElement( SAHPI_ET_HPI_SW, SaHpiHpiSwEventType ), dUnionElement( SAHPI_ET_OEM, SaHpiOemEventType ), dUnionElement( SAHPI_ET_USER, SaHpiUserEventType ), dUnionElement( SAHPI_ET_DIMI, SaHpiDimiEventType ), dUnionElement( SAHPI_ET_DIMI_UPDATE, SaHpiDimiUpdateEventType ), dUnionElement( SAHPI_ET_FUMI, SaHpiFumiEventType ), dUnionElementEnd() }; static cMarshalType SaHpiEventUnionType = dUnion( 1, SaHpiEventUnionT, SaHpiEventUnionElements ); static cMarshalType SaHpiEventElements[] = { dStructElement( SaHpiEventT, Source, SaHpiResourceIdType ), dStructElement( SaHpiEventT, EventType, SaHpiEventTypeType ), dStructElement( SaHpiEventT, Timestamp, SaHpiTimeType ), dStructElement( SaHpiEventT, Severity, SaHpiSeverityType ), dStructElement( SaHpiEventT, EventDataUnion, SaHpiEventUnionType ), dStructElementEnd() }; cMarshalType SaHpiEventType = dStruct( SaHpiEventT, SaHpiEventElements ); // resource presence table static cMarshalType GuidDataArray = dArray( SaHpiUint8Type, 16 ); static cMarshalType SaHpiResourceInfoElements[] = { dStructElement( SaHpiResourceInfoT, ResourceRev, SaHpiUint8Type ), dStructElement( SaHpiResourceInfoT, SpecificVer, SaHpiUint8Type ), dStructElement( SaHpiResourceInfoT, DeviceSupport, SaHpiUint8Type ), dStructElement( SaHpiResourceInfoT, ManufacturerId, SaHpiManufacturerIdType ), dStructElement( SaHpiResourceInfoT, ProductId, SaHpiUint16Type ), dStructElement( SaHpiResourceInfoT, FirmwareMajorRev, SaHpiUint8Type ), dStructElement( SaHpiResourceInfoT, FirmwareMinorRev, SaHpiUint8Type ), dStructElement( SaHpiResourceInfoT, AuxFirmwareRev, SaHpiUint8Type ), dStructElement( SaHpiResourceInfoT, Guid, GuidDataArray ), dStructElementEnd() }; cMarshalType SaHpiResourceInfoType = dStruct( SaHpiResourceInfoT, SaHpiResourceInfoElements ); static cMarshalType SaHpiRptEntryElements[] = { dStructElement( SaHpiRptEntryT, EntryId, SaHpiEntryIdType ), dStructElement( SaHpiRptEntryT, ResourceId, SaHpiResourceIdType ), dStructElement( SaHpiRptEntryT, ResourceInfo, SaHpiResourceInfoType ), dStructElement( SaHpiRptEntryT, ResourceEntity, SaHpiEntityPathType ), dStructElement( SaHpiRptEntryT, ResourceCapabilities,SaHpiCapabilitiesType ), dStructElement( SaHpiRptEntryT, HotSwapCapabilities, SaHpiHsCapabilitiesType ), dStructElement( SaHpiRptEntryT, ResourceSeverity, SaHpiSeverityType ), dStructElement( SaHpiRptEntryT, ResourceFailed, SaHpiBoolType ), dStructElement( SaHpiRptEntryT, ResourceTag, SaHpiTextBufferType ), dStructElementEnd() }; cMarshalType SaHpiRptEntryType = dStruct( SaHpiRptEntryT, SaHpiRptEntryElements ); static cMarshalType SaHpiLoadIdElements[] = { dStructElement( SaHpiLoadIdT, LoadNumber, SaHpiLoadNumberType ), dStructElement( SaHpiLoadIdT, LoadName, SaHpiTextBufferType ), dStructElementEnd() }; cMarshalType SaHpiLoadIdType = dStruct( SaHpiLoadIdT, SaHpiLoadIdElements ); // domains static cMarshalType SaHpiDomainInfoTElements[] = { dStructElement( SaHpiDomainInfoT, DomainId, SaHpiDomainIdType ), dStructElement( SaHpiDomainInfoT, DomainCapabilities, SaHpiDomainCapabilitiesType ), dStructElement( SaHpiDomainInfoT, IsPeer, SaHpiBoolType ), dStructElement( SaHpiDomainInfoT, DomainTag, SaHpiTextBufferType ), dStructElement( SaHpiDomainInfoT, DrtUpdateCount, SaHpiUint32Type ), dStructElement( SaHpiDomainInfoT, DrtUpdateTimestamp, SaHpiTimeType ), dStructElement( SaHpiDomainInfoT, RptUpdateCount, SaHpiUint32Type ), dStructElement( SaHpiDomainInfoT, RptUpdateTimestamp, SaHpiTimeType ), dStructElement( SaHpiDomainInfoT, DatUpdateCount, SaHpiUint32Type ), dStructElement( SaHpiDomainInfoT, DatUpdateTimestamp, SaHpiTimeType ), dStructElement( SaHpiDomainInfoT, ActiveAlarms, SaHpiUint32Type ), dStructElement( SaHpiDomainInfoT, CriticalAlarms, SaHpiUint32Type ), dStructElement( SaHpiDomainInfoT, MajorAlarms, SaHpiUint32Type ), dStructElement( SaHpiDomainInfoT, MinorAlarms, SaHpiUint32Type ), dStructElement( SaHpiDomainInfoT, DatUserAlarmLimit, SaHpiUint32Type ), dStructElement( SaHpiDomainInfoT, DatOverflow, SaHpiBoolType ), dStructElement( SaHpiDomainInfoT, Guid, GuidDataArray ), dStructElementEnd() }; cMarshalType SaHpiDomainInfoType = dStruct( SaHpiDomainInfoT, SaHpiDomainInfoTElements ); static cMarshalType SaHpiDrtEntryTElements[] = { dStructElement( SaHpiDrtEntryT, EntryId, SaHpiEntryIdType ), dStructElement( SaHpiDrtEntryT, DomainId, SaHpiDomainIdType ), dStructElement( SaHpiDrtEntryT, IsPeer, SaHpiBoolType ), dStructElementEnd() }; cMarshalType SaHpiDrtEntryType = dStruct( SaHpiDrtEntryT, SaHpiDrtEntryTElements ); static cMarshalType SaHpiAlarmTElements[] = { dStructElement( SaHpiAlarmT, AlarmId, SaHpiAlarmIdType ), dStructElement( SaHpiAlarmT, Timestamp, SaHpiTimeType ), dStructElement( SaHpiAlarmT, Severity, SaHpiSeverityType ), dStructElement( SaHpiAlarmT, Acknowledged, SaHpiBoolType ), dStructElement( SaHpiAlarmT, AlarmCond, SaHpiConditionType ), dStructElementEnd() }; cMarshalType SaHpiAlarmType = dStruct( SaHpiAlarmT, SaHpiAlarmTElements ); // event log static cMarshalType SaHpiEventLogInfoTElements[] = { dStructElement( SaHpiEventLogInfoT, Entries, SaHpiUint32Type ), dStructElement( SaHpiEventLogInfoT, Size, SaHpiUint32Type ), dStructElement( SaHpiEventLogInfoT, UserEventMaxSize, SaHpiUint32Type ), dStructElement( SaHpiEventLogInfoT, UpdateTimestamp, SaHpiTimeType ), dStructElement( SaHpiEventLogInfoT, CurrentTime, SaHpiTimeType ), dStructElement( SaHpiEventLogInfoT, Enabled, SaHpiBoolType ), dStructElement( SaHpiEventLogInfoT, OverflowFlag, SaHpiBoolType ), dStructElement( SaHpiEventLogInfoT, OverflowResetable, SaHpiBoolType ), dStructElement( SaHpiEventLogInfoT, OverflowAction, SaHpiSelOverflowActionType ), dStructElementEnd() }; cMarshalType SaHpiEventLogInfoType = dStruct( SaHpiEventLogInfoT, SaHpiEventLogInfoTElements ); static cMarshalType SaHpiEventLogEntryElements[] = { dStructElement( SaHpiEventLogEntryT, EntryId, SaHpiEventLogEntryIdType ), dStructElement( SaHpiEventLogEntryT, Timestamp, SaHpiTimeType ), dStructElement( SaHpiEventLogEntryT, Event, SaHpiEventType ), dStructElementEnd() }; cMarshalType SaHpiEventLogEntryType = dStruct( SaHpiEventLogEntryT, SaHpiEventLogEntryElements ); // handler info static cMarshalType plugin_nameBufferArray = dArray( SaHpiUint8Type, MAX_PLUGIN_NAME_LENGTH ); static cMarshalType oHpiHandlerInfoElements[] = { dStructElement( oHpiHandlerInfoT, id, oHpiHandlerIdType), dStructElement( oHpiHandlerInfoT, plugin_name, plugin_nameBufferArray ), dStructElement( oHpiHandlerInfoT, entity_root, SaHpiEntityPathType ), dStructElement( oHpiHandlerInfoT, load_failed, SaHpiInt32Type ), dStructElementEnd() }; cMarshalType oHpiHandlerInfoType = dStruct( oHpiHandlerInfoT, oHpiHandlerInfoElements ); // global param static cMarshalType GlobalParamPathArray = dArray( SaHpiUint8Type, OH_MAX_TEXT_BUFFER_LENGTH ); static cMarshalType GlobalParamVarPathArray = dArray( SaHpiUint8Type, OH_MAX_TEXT_BUFFER_LENGTH ); static cMarshalType GlobalParamConfArray = dArray( SaHpiUint8Type, SAHPI_MAX_TEXT_BUFFER_LENGTH ); static cMarshalType oHpiGlobalParamUnionTypeElements[] = { dUnionElement( OHPI_ON_EP, SaHpiEntityPathType ), dUnionElement( OHPI_LOG_ON_SEV, SaHpiSeverityType ), dUnionElement( OHPI_EVT_QUEUE_LIMIT, SaHpiUint32Type ), dUnionElement( OHPI_DEL_SIZE_LIMIT, SaHpiUint32Type ), dUnionElement( OHPI_DEL_SAVE, SaHpiBoolType ), dUnionElement( OHPI_DAT_SIZE_LIMIT, SaHpiUint32Type ), dUnionElement( OHPI_DAT_USER_LIMIT, SaHpiUint32Type ), dUnionElement( OHPI_PATH, GlobalParamPathArray ), dUnionElement( OHPI_VARPATH, GlobalParamVarPathArray ), dUnionElement( OHPI_CONF, GlobalParamConfArray ), dUnionElementEnd() }; static cMarshalType oHpiGlobalParamUnionType = dUnion( 0, oHpiGlobalParamUnionT, oHpiGlobalParamUnionTypeElements ); static cMarshalType oHpiGlobalParamTypeElements[] = { dStructElement( oHpiGlobalParamT, Type, oHpiGlobalParamTypeType ), dStructElement( oHpiGlobalParamT, u, oHpiGlobalParamUnionType ), dStructElementEnd() }; cMarshalType oHpiGlobalParamType = dStruct( oHpiGlobalParamT, oHpiGlobalParamTypeElements ); openhpi-2.14.1/marshal/t/0000755000076400007640000000000011405006365012063 5ustar openhpi-2.14.1/marshal/t/marshal_hpi_types_034.c0000644000076400007640000001325411302567035016337 0ustar /* * Copyright (c) 2005 by IBM Corporation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * W. David Ashley */ #include "marshal_hpi_types.h" #include #include #include static int cmp_sensorreading( SaHpiSensorReadingT *d1, SaHpiSensorReadingT *d2 ) { if ( d1->IsSupported != d2->IsSupported ) return 0; if ( d1->Type != d2->Type ) return 0; if ( d1->Value.SensorInt64 != d2->Value.SensorInt64 ) return 0; return 1; } static int cmp_sensorevent( SaHpiSensorEventT *d1, SaHpiSensorEventT *d2 ) { if ( d1->SensorNum != d2->SensorNum ) return 0; if ( d1->SensorType != d2->SensorType ) return 0; if ( d1->EventCategory != d2->EventCategory ) return 0; if ( d1->Assertion != d2->Assertion ) return 0; if ( d1->EventState != d2->EventState ) return 0; if ( d1->OptionalDataPresent != d2->OptionalDataPresent ) return 0; if ( !cmp_sensorreading( &d1->TriggerReading, &d2->TriggerReading ) ) return 0; if ( !cmp_sensorreading( &d1->TriggerThreshold, &d2->TriggerThreshold ) ) return 0; if ( d1->PreviousState != d2->PreviousState ) return 0; if ( d1->CurrentState != d2->CurrentState ) return 0; if ( d1->Oem != d2->Oem ) return 0; if ( d1->SensorSpecific != d2->SensorSpecific ) return 0; return 1; } typedef struct { tUint8 m_pad1; SaHpiSensorEventT m_v1; tUint8 m_pad2; SaHpiSensorEventT m_v2; SaHpiSensorEventT m_v3; tUint8 m_pad3; } cTest; cMarshalType StructElements[] = { dStructElement( cTest, m_pad1 , Marshal_Uint8Type ), dStructElement( cTest, m_v1 , SaHpiSensorEventType ), dStructElement( cTest, m_pad2 , Marshal_Uint8Type ), dStructElement( cTest, m_v2 , SaHpiSensorEventType ), dStructElement( cTest, m_v3 , SaHpiSensorEventType ), dStructElement( cTest, m_pad3 , Marshal_Uint8Type ), dStructElementEnd() }; cMarshalType TestType = dStruct( cTest, StructElements ); int main( int argc, char *argv[] ) { cTest value = { .m_pad1 = 47, .m_v1.SensorNum = 1, .m_v1.SensorType = SAHPI_TEMPERATURE, .m_v1.EventCategory = SAHPI_EC_THRESHOLD, .m_v1.Assertion = TRUE, .m_v1.EventState = SAHPI_ES_UPPER_MAJOR, .m_v1.OptionalDataPresent = 1, .m_v1.TriggerReading.IsSupported = TRUE, .m_v1.TriggerReading.Type = SAHPI_SENSOR_READING_TYPE_INT64, .m_v1.TriggerReading.Value = {21}, .m_v1.TriggerThreshold.IsSupported = TRUE, .m_v1.TriggerThreshold.Type = SAHPI_SENSOR_READING_TYPE_INT64, .m_v1.TriggerThreshold.Value = {20}, .m_v1.PreviousState = SAHPI_ES_ACTIVE, .m_v1.CurrentState = SAHPI_ES_UPPER_MAJOR, .m_v1.Oem = 0, .m_v1.SensorSpecific = 0, .m_pad2 = 48, .m_v2.SensorNum = 2, .m_v2.SensorType = SAHPI_BATTERY, .m_v2.EventCategory = SAHPI_EC_THRESHOLD, .m_v2.Assertion = TRUE, .m_v2.EventState = SAHPI_ES_UPPER_MAJOR, .m_v2.OptionalDataPresent = 1, .m_v2.TriggerReading.IsSupported = TRUE, .m_v2.TriggerReading.Type = SAHPI_SENSOR_READING_TYPE_INT64, .m_v2.TriggerReading.Value = {11}, .m_v2.TriggerThreshold.IsSupported = TRUE, .m_v2.TriggerThreshold.Type = SAHPI_SENSOR_READING_TYPE_INT64, .m_v2.TriggerThreshold.Value = {10}, .m_v2.PreviousState = SAHPI_ES_ACTIVE, .m_v2.CurrentState = SAHPI_ES_UPPER_MAJOR, .m_v2.Oem = 1, .m_v2.SensorSpecific = 1, .m_v3.SensorNum = 3, .m_v3.SensorType = SAHPI_VOLTAGE, .m_v3.EventCategory = SAHPI_EC_THRESHOLD, .m_v3.Assertion = TRUE, .m_v3.EventState = SAHPI_ES_UPPER_MAJOR, .m_v3.OptionalDataPresent = 1, .m_v3.TriggerReading.IsSupported = TRUE, .m_v3.TriggerReading.Type = SAHPI_SENSOR_READING_TYPE_INT64, .m_v3.TriggerReading.Value = {6}, .m_v3.TriggerThreshold.IsSupported = TRUE, .m_v3.TriggerThreshold.Type = SAHPI_SENSOR_READING_TYPE_INT64, .m_v3.TriggerThreshold.Value = {5}, .m_v3.PreviousState = SAHPI_ES_ACTIVE, .m_v3.CurrentState = SAHPI_ES_UPPER_MAJOR, .m_v3.Oem = 10, .m_v3.SensorSpecific = 10, .m_pad3 = 49 }; unsigned char *buffer = (unsigned char *)malloc(sizeof(value)); cTest result; unsigned int s1 = Marshal( &TestType, &value, buffer ); unsigned int s2 = Demarshal( MarshalByteOrder(), &TestType, &result, buffer ); if ( s1 != s2 ) return 1; if ( value.m_pad1 != result.m_pad1 ) return 1; if ( !cmp_sensorevent( &value.m_v1, &result.m_v1 ) ) return 1; if ( value.m_pad2 != result.m_pad2 ) return 1; if ( !cmp_sensorevent( &value.m_v2, &result.m_v2 ) ) return 1; if ( !cmp_sensorevent( &value.m_v3, &result.m_v3 ) ) return 1; if ( value.m_pad3 != result.m_pad3 ) return 1; return 0; } openhpi-2.14.1/marshal/t/marshal_hpi_types_007.c0000644000076400007640000000534011302567035016334 0ustar /* * Copyright (c) 2005 by IBM Corporation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * W. David Ashley */ #include "marshal_hpi_types.h" #include #include #include static int cmp_thddefn( SaHpiSensorThdDefnT *d1, SaHpiSensorThdDefnT *d2 ) { if ( d1->IsAccessible != d2->IsAccessible ) return 0; if ( d1->ReadThold != d2->ReadThold ) return 0; if ( d1->WriteThold != d2->WriteThold ) return 0; if ( d1->Nonlinear != d2->Nonlinear ) return 0; return 1; } typedef struct { tUint8 m_pad1; SaHpiSensorThdDefnT m_v1; tUint8 m_pad2; SaHpiSensorThdDefnT m_v2; SaHpiSensorThdDefnT m_v3; tUint8 m_pad3; } cTest; cMarshalType StructElements[] = { dStructElement( cTest, m_pad1 , Marshal_Uint8Type ), dStructElement( cTest, m_v1 , SaHpiSensorThdDefnType ), dStructElement( cTest, m_pad2 , Marshal_Uint8Type ), dStructElement( cTest, m_v2 , SaHpiSensorThdDefnType ), dStructElement( cTest, m_v3 , SaHpiSensorThdDefnType ), dStructElement( cTest, m_pad3 , Marshal_Uint8Type ), dStructElementEnd() }; cMarshalType TestType = dStruct( cTest, StructElements ); int main( int argc, char *argv[] ) { cTest value = { .m_pad1 = 47, .m_v1.IsAccessible = TRUE, .m_v1.ReadThold = SAHPI_STM_LOW_MINOR, .m_v1.WriteThold = SAHPI_STM_UP_CRIT, .m_v1.Nonlinear = FALSE, .m_pad2 = 48, .m_v2.IsAccessible = TRUE, .m_v2.ReadThold = SAHPI_STM_LOW_MAJOR, .m_v2.WriteThold = SAHPI_STM_UP_MAJOR, .m_v2.Nonlinear = FALSE, .m_v3.IsAccessible = TRUE, .m_v3.ReadThold = SAHPI_STM_UP_CRIT, .m_v3.WriteThold = SAHPI_STM_LOW_CRIT, .m_v3.Nonlinear = FALSE, .m_pad3 = 49 }; unsigned char *buffer = (unsigned char *)malloc(sizeof(value)); cTest result; unsigned int s1 = Marshal( &TestType, &value, buffer ); unsigned int s2 = Demarshal( MarshalByteOrder(), &TestType, &result, buffer ); if ( s1 != s2 ) return 1; if ( value.m_pad1 != result.m_pad1 ) return 1; if ( !cmp_thddefn( &value.m_v1, &result.m_v1 ) ) return 1; if ( value.m_pad2 != result.m_pad2 ) return 1; if ( !cmp_thddefn( &value.m_v2, &result.m_v2 ) ) return 1; if ( !cmp_thddefn( &value.m_v3, &result.m_v3 ) ) return 1; if ( value.m_pad3 != result.m_pad3 ) return 1; return 0; } openhpi-2.14.1/marshal/t/marshal_029.c0000644000076400007640000000724011302567035014255 0ustar /* * Copyright (c) 2004 by FORCE Computers. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Thomas Kanngieser */ #include "marshal.h" #include #define dArraySize 12 typedef struct { tUint8 m_u8; tUint16 m_u16; tUint32 m_u32; tInt8 m_i8; tInt16 m_i16; tInt32 m_i32; tFloat32 m_f32; tFloat64 m_f64; tInt8 m_array[dArraySize]; } cTest1; cMarshalType ArrayType = dArray( Marshal_Int8Type, dArraySize ); cMarshalType Test1Elements[] = { dStructElement( cTest1, m_u8 , Marshal_Uint8Type ), dStructElement( cTest1, m_u16, Marshal_Uint16Type ), dStructElement( cTest1, m_u16, Marshal_Uint16Type ), dStructElement( cTest1, m_u32, Marshal_Uint32Type ), dStructElement( cTest1, m_i8, Marshal_Int8Type ), dStructElement( cTest1, m_i16, Marshal_Int16Type ), dStructElement( cTest1, m_i32, Marshal_Int32Type ), dStructElement( cTest1, m_f32, Marshal_Float32Type ), dStructElement( cTest1, m_f64, Marshal_Float64Type ), dStructElement( cTest1, m_array, ArrayType ), dStructElementEnd() }; cMarshalType Test1Type = dStruct( cTest1, Test1Elements ); typedef struct { tUint16 m_u16; tUint8 m_u8; tUint64 m_u64; tInt64 m_i64; } cTest2; cMarshalType Test2Elements[] = { dStructElement( cTest2, m_u16, Marshal_Uint16Type ), dStructElement( cTest2, m_u8 , Marshal_Uint8Type ), dStructElement( cTest2, m_u64, Marshal_Uint64Type ), dStructElement( cTest2, m_i64, Marshal_Int64Type ), dStructElementEnd() }; cMarshalType Test2Type = dStruct( cTest2, Test2Elements ); int main( int argc, char *argv[] ) { cTest1 value1 = { .m_u8 = 0x42, .m_u16 = 0x1234, .m_u32 = 0x12345678, .m_i8 = -48, .m_i16 = -12345, .m_i32 = -12345667, .m_f32 = 0.123456, .m_f64 = -12345.345566, .m_array = "hui jui" }; cTest2 value2 = { .m_u16 = 0x4434, .m_u8 = 0x47, .m_u64 = 0x1234567812345678LL, .m_i64 = 0x8765432187654321LL, }; unsigned char buffer[1024]; cTest1 result1; cTest2 result2; const cMarshalType *type_array[] = { &Test1Type, &Test2Type, 0 }; const void *value_array[] = { &value1, &value2 }; void *result_array[] = { &result1, &result2 }; unsigned int s1 = MarshalArray( type_array, value_array, buffer ); unsigned int s2 = DemarshalArray( MarshalByteOrder(), type_array, result_array, buffer ); if ( s1 != s2 ) return 1; unsigned int s3 = MarshalSizeArray( type_array ); if ( s1 != s3 ) return 1; if ( value1.m_u8 != result1.m_u8 ) return 1; if ( value1.m_u16 != result1.m_u16 ) return 1; if ( value1.m_u32 != result1.m_u32 ) return 1; if ( value1.m_i8 != result1.m_i8 ) return 1; if ( value1.m_i16 != result1.m_i16 ) return 1; if ( value1.m_i32 != result1.m_i32 ) return 1; if ( value1.m_f32 != result1.m_f32 ) return 1; if ( value1.m_f64 != result1.m_f64 ) return 1; if ( strcmp( value1.m_array, result1.m_array ) ) return 1; if ( value2.m_u8 != result2.m_u8 ) return 1; if ( value2.m_u16 != result2.m_u16 ) return 1; if ( value2.m_u64 != result2.m_u64 ) return 1; if ( value2.m_i64 != result2.m_i64 ) return 1; return 0; } openhpi-2.14.1/marshal/t/Makefile.am0000644000076400007640000003061011302567035014121 0ustar # # Copyright (c) 2004 by FORCE Computers. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This # file and program are licensed under a BSD style license. See # the Copying file included with the OpenHPI distribution for # full licensing terms. # # Authors: # Thomas Kanngieser # MARSHAL_SRCDIR = $(top_srcdir)/marshal REMOTE_SOURCES = connection.c marshal.c MARSHAL_SOURCES = marshal_hpi_types.c MOSTLYCLEANFILES = $(REMOTE_SOURCES) $(MARSHAL_SOURCES) @TEST_CLEAN@ MAINTAINERCLEANFILES = Makefile.in *~ INCLUDES = -I $(MARSHAL_SRCDIR) @OPENHPI_INCLUDES@ noinst_PROGRAMS = float_format float_format_SOURCES = float_format.c CLEANFILES=float32.bin float64.bin *~ $(REMOTE_SOURCES): if test ! -f $@ -a ! -L $@; then \ ln -s $(MARSHAL_SRCDIR)/$@; \ fi $(MARSHAL_SOURCES): if test ! -f $@ -a ! -L $@; then \ ln -s $(MARSHAL_SRCDIR)/$@; \ fi TESTS = \ marshal_000 \ marshal_001 \ marshal_002 \ marshal_003 \ marshal_004 \ marshal_005 \ marshal_006 \ marshal_007 \ marshal_008 \ marshal_009 \ marshal_010 \ marshal_011 \ marshal_012 \ marshal_013 \ marshal_014 \ marshal_015 \ marshal_016 \ marshal_017 \ marshal_018 \ marshal_019 \ marshal_020 \ marshal_021 \ marshal_022 \ marshal_023 \ marshal_024 \ marshal_025 \ marshal_026 \ marshal_027 \ marshal_028 \ marshal_029 \ marshal_030 \ marshal_031 \ marshal_hpi_types_000 \ marshal_hpi_types_001 \ marshal_hpi_types_002 \ marshal_hpi_types_003 \ marshal_hpi_types_004 \ marshal_hpi_types_005 \ marshal_hpi_types_006 \ marshal_hpi_types_007 \ marshal_hpi_types_008 \ marshal_hpi_types_009 \ marshal_hpi_types_010 \ marshal_hpi_types_011 \ marshal_hpi_types_012 \ marshal_hpi_types_013 \ marshal_hpi_types_014 \ marshal_hpi_types_015 \ marshal_hpi_types_016 \ marshal_hpi_types_017 \ marshal_hpi_types_018 \ marshal_hpi_types_019 \ marshal_hpi_types_020 \ marshal_hpi_types_021 \ marshal_hpi_types_022 \ marshal_hpi_types_023 \ marshal_hpi_types_024 \ marshal_hpi_types_025 \ marshal_hpi_types_026 \ marshal_hpi_types_027 \ marshal_hpi_types_028 \ marshal_hpi_types_029 \ marshal_hpi_types_030 \ marshal_hpi_types_031 \ marshal_hpi_types_032 \ marshal_hpi_types_033 \ marshal_hpi_types_034 \ marshal_hpi_types_035 \ marshal_hpi_types_036 \ marshal_hpi_types_037 \ marshal_hpi_types_038 \ marshal_hpi_types_039 \ marshal_hpi_types_040 \ marshal_hpi_types_041 \ marshal_hpi_types_042 \ marshal_hpi_types_043 \ marshal_hpi_types_044 \ marshal_hpi_types_045 \ marshal_hpi_types_046 \ marshal_hpi_types_047 \ marshal_hpi_types_048 # connection_seq_000 \ # connection_000 \ # connection_001 check_PROGRAMS = $(TESTS) #connection_000_SOURCES = connection_000.c $(REMOTE_SOURCES) #connection_seq_000_SOURCES = connection_seq_000.c $(REMOTE_SOURCES) #connection_001_SOURCES = connection_001.c $(REMOTE_SOURCES) marshal_000_SOURCES = marshal_000.c nodist_marshal_000_SOURCES = $(REMOTE_SOURCES) marshal_001_SOURCES = marshal_001.c nodist_marshal_001_SOURCES = $(REMOTE_SOURCES) marshal_002_SOURCES = marshal_002.c nodist_marshal_002_SOURCES = $(REMOTE_SOURCES) marshal_003_SOURCES = marshal_003.c nodist_marshal_003_SOURCES = $(REMOTE_SOURCES) marshal_004_SOURCES = marshal_004.c nodist_marshal_004_SOURCES = $(REMOTE_SOURCES) marshal_005_SOURCES = marshal_005.c nodist_marshal_005_SOURCES = $(REMOTE_SOURCES) marshal_006_SOURCES = marshal_006.c nodist_marshal_006_SOURCES = $(REMOTE_SOURCES) marshal_007_SOURCES = marshal_007.c nodist_marshal_007_SOURCES = $(REMOTE_SOURCES) marshal_008_SOURCES = marshal_008.c nodist_marshal_008_SOURCES = $(REMOTE_SOURCES) marshal_009_SOURCES = marshal_009.c nodist_marshal_009_SOURCES = $(REMOTE_SOURCES) marshal_010_SOURCES = marshal_010.c nodist_marshal_010_SOURCES = $(REMOTE_SOURCES) marshal_011_SOURCES = marshal_011.c nodist_marshal_011_SOURCES = $(REMOTE_SOURCES) marshal_012_SOURCES = marshal_012.c nodist_marshal_012_SOURCES = $(REMOTE_SOURCES) marshal_013_SOURCES = marshal_013.c nodist_marshal_013_SOURCES = $(REMOTE_SOURCES) marshal_014_SOURCES = marshal_014.c nodist_marshal_014_SOURCES = $(REMOTE_SOURCES) marshal_015_SOURCES = marshal_015.c nodist_marshal_015_SOURCES = $(REMOTE_SOURCES) marshal_016_SOURCES = marshal_016.c nodist_marshal_016_SOURCES = $(REMOTE_SOURCES) marshal_017_SOURCES = marshal_017.c nodist_marshal_017_SOURCES = $(REMOTE_SOURCES) marshal_018_SOURCES = marshal_018.c nodist_marshal_018_SOURCES = $(REMOTE_SOURCES) marshal_019_SOURCES = marshal_019.c nodist_marshal_019_SOURCES = $(REMOTE_SOURCES) marshal_020_SOURCES = marshal_020.c nodist_marshal_020_SOURCES = $(REMOTE_SOURCES) marshal_021_SOURCES = marshal_021.c nodist_marshal_021_SOURCES = $(REMOTE_SOURCES) marshal_022_SOURCES = marshal_022.c nodist_marshal_022_SOURCES = $(REMOTE_SOURCES) marshal_023_SOURCES = marshal_023.c nodist_marshal_023_SOURCES = $(REMOTE_SOURCES) marshal_024_SOURCES = marshal_024.c nodist_marshal_024_SOURCES = $(REMOTE_SOURCES) marshal_025_SOURCES = marshal_025.c nodist_marshal_025_SOURCES = $(REMOTE_SOURCES) marshal_026_SOURCES = marshal_026.c nodist_marshal_026_SOURCES = $(REMOTE_SOURCES) marshal_027_SOURCES = marshal_027.c nodist_marshal_027_SOURCES = $(REMOTE_SOURCES) marshal_028_SOURCES = marshal_028.c nodist_marshal_028_SOURCES = $(MARSHAL_SOURCES) $(REMOTE_SOURCES) marshal_029_SOURCES = marshal_029.c nodist_marshal_029_SOURCES = $(REMOTE_SOURCES) marshal_030_SOURCES = marshal_030.c nodist_marshal_030_SOURCES = $(REMOTE_SOURCES) marshal_031_SOURCES = marshal_031.c nodist_marshal_031_SOURCES = $(REMOTE_SOURCES) marshal_hpi_types_000_SOURCES = marshal_hpi_types_000.c nodist_marshal_hpi_types_000_SOURCES = $(MARSHAL_SOURCES) $(REMOTE_SOURCES) marshal_hpi_types_001_SOURCES = marshal_hpi_types_001.c nodist_marshal_hpi_types_001_SOURCES = $(MARSHAL_SOURCES) $(REMOTE_SOURCES) marshal_hpi_types_002_SOURCES = marshal_hpi_types_002.c nodist_marshal_hpi_types_002_SOURCES = $(MARSHAL_SOURCES) $(REMOTE_SOURCES) marshal_hpi_types_003_SOURCES = marshal_hpi_types_003.c nodist_marshal_hpi_types_003_SOURCES = $(MARSHAL_SOURCES) $(REMOTE_SOURCES) marshal_hpi_types_004_SOURCES = marshal_hpi_types_004.c nodist_marshal_hpi_types_004_SOURCES = $(MARSHAL_SOURCES) $(REMOTE_SOURCES) marshal_hpi_types_005_SOURCES = marshal_hpi_types_005.c nodist_marshal_hpi_types_005_SOURCES = $(MARSHAL_SOURCES) $(REMOTE_SOURCES) marshal_hpi_types_006_SOURCES = marshal_hpi_types_006.c nodist_marshal_hpi_types_006_SOURCES = $(MARSHAL_SOURCES) $(REMOTE_SOURCES) marshal_hpi_types_007_SOURCES = marshal_hpi_types_007.c nodist_marshal_hpi_types_007_SOURCES = $(MARSHAL_SOURCES) $(REMOTE_SOURCES) marshal_hpi_types_008_SOURCES = marshal_hpi_types_008.c nodist_marshal_hpi_types_008_SOURCES = $(MARSHAL_SOURCES) $(REMOTE_SOURCES) marshal_hpi_types_009_SOURCES = marshal_hpi_types_009.c nodist_marshal_hpi_types_009_SOURCES = $(MARSHAL_SOURCES) $(REMOTE_SOURCES) marshal_hpi_types_010_SOURCES = marshal_hpi_types_010.c nodist_marshal_hpi_types_010_SOURCES = $(MARSHAL_SOURCES) $(REMOTE_SOURCES) marshal_hpi_types_011_SOURCES = marshal_hpi_types_011.c nodist_marshal_hpi_types_011_SOURCES = $(MARSHAL_SOURCES) $(REMOTE_SOURCES) marshal_hpi_types_012_SOURCES = marshal_hpi_types_012.c nodist_marshal_hpi_types_012_SOURCES = $(MARSHAL_SOURCES) $(REMOTE_SOURCES) marshal_hpi_types_013_SOURCES = marshal_hpi_types_013.c nodist_marshal_hpi_types_013_SOURCES = $(MARSHAL_SOURCES) $(REMOTE_SOURCES) marshal_hpi_types_014_SOURCES = marshal_hpi_types_014.c nodist_marshal_hpi_types_014_SOURCES = $(MARSHAL_SOURCES) $(REMOTE_SOURCES) marshal_hpi_types_015_SOURCES = marshal_hpi_types_015.c nodist_marshal_hpi_types_015_SOURCES = $(MARSHAL_SOURCES) $(REMOTE_SOURCES) marshal_hpi_types_016_SOURCES = marshal_hpi_types_016.c nodist_marshal_hpi_types_016_SOURCES = $(MARSHAL_SOURCES) $(REMOTE_SOURCES) marshal_hpi_types_017_SOURCES = marshal_hpi_types_017.c nodist_marshal_hpi_types_017_SOURCES = $(MARSHAL_SOURCES) $(REMOTE_SOURCES) marshal_hpi_types_018_SOURCES = marshal_hpi_types_018.c nodist_marshal_hpi_types_018_SOURCES = $(MARSHAL_SOURCES) $(REMOTE_SOURCES) marshal_hpi_types_019_SOURCES = marshal_hpi_types_019.c nodist_marshal_hpi_types_019_SOURCES = $(MARSHAL_SOURCES) $(REMOTE_SOURCES) marshal_hpi_types_020_SOURCES = marshal_hpi_types_020.c nodist_marshal_hpi_types_020_SOURCES = $(MARSHAL_SOURCES) $(REMOTE_SOURCES) marshal_hpi_types_021_SOURCES = marshal_hpi_types_021.c nodist_marshal_hpi_types_021_SOURCES = $(MARSHAL_SOURCES) $(REMOTE_SOURCES) marshal_hpi_types_022_SOURCES = marshal_hpi_types_022.c nodist_marshal_hpi_types_022_SOURCES = $(MARSHAL_SOURCES) $(REMOTE_SOURCES) marshal_hpi_types_023_SOURCES = marshal_hpi_types_023.c nodist_marshal_hpi_types_023_SOURCES = $(MARSHAL_SOURCES) $(REMOTE_SOURCES) marshal_hpi_types_024_SOURCES = marshal_hpi_types_024.c nodist_marshal_hpi_types_024_SOURCES = $(MARSHAL_SOURCES) $(REMOTE_SOURCES) marshal_hpi_types_025_SOURCES = marshal_hpi_types_025.c nodist_marshal_hpi_types_025_SOURCES = $(MARSHAL_SOURCES) $(REMOTE_SOURCES) marshal_hpi_types_026_SOURCES = marshal_hpi_types_026.c nodist_marshal_hpi_types_026_SOURCES = $(MARSHAL_SOURCES) $(REMOTE_SOURCES) marshal_hpi_types_027_SOURCES = marshal_hpi_types_027.c nodist_marshal_hpi_types_027_SOURCES = $(MARSHAL_SOURCES) $(REMOTE_SOURCES) marshal_hpi_types_028_SOURCES = marshal_hpi_types_028.c nodist_marshal_hpi_types_028_SOURCES = $(MARSHAL_SOURCES) $(REMOTE_SOURCES) marshal_hpi_types_029_SOURCES = marshal_hpi_types_029.c nodist_marshal_hpi_types_029_SOURCES = $(MARSHAL_SOURCES) $(REMOTE_SOURCES) marshal_hpi_types_030_SOURCES = marshal_hpi_types_030.c nodist_marshal_hpi_types_030_SOURCES = $(MARSHAL_SOURCES) $(REMOTE_SOURCES) marshal_hpi_types_031_SOURCES = marshal_hpi_types_031.c nodist_marshal_hpi_types_031_SOURCES = $(MARSHAL_SOURCES) $(REMOTE_SOURCES) marshal_hpi_types_032_SOURCES = marshal_hpi_types_032.c nodist_marshal_hpi_types_032_SOURCES = $(MARSHAL_SOURCES) $(REMOTE_SOURCES) marshal_hpi_types_033_SOURCES = marshal_hpi_types_033.c nodist_marshal_hpi_types_033_SOURCES = $(MARSHAL_SOURCES) $(REMOTE_SOURCES) marshal_hpi_types_034_SOURCES = marshal_hpi_types_034.c nodist_marshal_hpi_types_034_SOURCES = $(MARSHAL_SOURCES) $(REMOTE_SOURCES) marshal_hpi_types_035_SOURCES = marshal_hpi_types_035.c nodist_marshal_hpi_types_035_SOURCES = $(MARSHAL_SOURCES) $(REMOTE_SOURCES) marshal_hpi_types_036_SOURCES = marshal_hpi_types_036.c nodist_marshal_hpi_types_036_SOURCES = $(MARSHAL_SOURCES) $(REMOTE_SOURCES) marshal_hpi_types_037_SOURCES = marshal_hpi_types_037.c nodist_marshal_hpi_types_037_SOURCES = $(MARSHAL_SOURCES) $(REMOTE_SOURCES) marshal_hpi_types_038_SOURCES = marshal_hpi_types_038.c nodist_marshal_hpi_types_038_SOURCES = $(MARSHAL_SOURCES) $(REMOTE_SOURCES) marshal_hpi_types_039_SOURCES = marshal_hpi_types_039.c nodist_marshal_hpi_types_039_SOURCES = $(MARSHAL_SOURCES) $(REMOTE_SOURCES) marshal_hpi_types_040_SOURCES = marshal_hpi_types_040.c nodist_marshal_hpi_types_040_SOURCES = $(MARSHAL_SOURCES) $(REMOTE_SOURCES) marshal_hpi_types_041_SOURCES = marshal_hpi_types_041.c nodist_marshal_hpi_types_041_SOURCES = $(MARSHAL_SOURCES) $(REMOTE_SOURCES) marshal_hpi_types_042_SOURCES = marshal_hpi_types_042.c nodist_marshal_hpi_types_042_SOURCES = $(MARSHAL_SOURCES) $(REMOTE_SOURCES) marshal_hpi_types_043_SOURCES = marshal_hpi_types_043.c nodist_marshal_hpi_types_043_SOURCES = $(MARSHAL_SOURCES) $(REMOTE_SOURCES) marshal_hpi_types_044_SOURCES = marshal_hpi_types_044.c nodist_marshal_hpi_types_044_SOURCES = $(MARSHAL_SOURCES) $(REMOTE_SOURCES) marshal_hpi_types_045_SOURCES = marshal_hpi_types_045.c nodist_marshal_hpi_types_045_SOURCES = $(MARSHAL_SOURCES) $(REMOTE_SOURCES) marshal_hpi_types_046_SOURCES = marshal_hpi_types_046.c nodist_marshal_hpi_types_046_SOURCES = $(MARSHAL_SOURCES) $(REMOTE_SOURCES) marshal_hpi_types_047_SOURCES = marshal_hpi_types_047.c nodist_marshal_hpi_types_047_SOURCES = $(MARSHAL_SOURCES) $(REMOTE_SOURCES) marshal_hpi_types_048_SOURCES = marshal_hpi_types_048.c nodist_marshal_hpi_types_048_SOURCES = $(MARSHAL_SOURCES) $(REMOTE_SOURCES) openhpi-2.14.1/marshal/t/marshal_hpi_types_032.c0000644000076400007640000000463411302567035016337 0ustar /* * Copyright (c) 2005 by IBM Corporation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * W. David Ashley */ #include "marshal_hpi_types.h" #include #include #include static int cmp_resourceevent( SaHpiResourceEventT *d1, SaHpiResourceEventT *d2 ) { if ( d1->ResourceEventType != d2->ResourceEventType ) return 0; return 1; } typedef struct { tUint8 m_pad1; SaHpiResourceEventT m_v1; tUint8 m_pad2; SaHpiResourceEventT m_v2; SaHpiResourceEventT m_v3; tUint8 m_pad3; } cTest; cMarshalType StructElements[] = { dStructElement( cTest, m_pad1 , Marshal_Uint8Type ), dStructElement( cTest, m_v1 , SaHpiResourceEventType ), dStructElement( cTest, m_pad2 , Marshal_Uint8Type ), dStructElement( cTest, m_v2 , SaHpiResourceEventType ), dStructElement( cTest, m_v3 , SaHpiResourceEventType ), dStructElement( cTest, m_pad3 , Marshal_Uint8Type ), dStructElementEnd() }; cMarshalType TestType = dStruct( cTest, StructElements ); int main( int argc, char *argv[] ) { cTest value = { .m_pad1 = 47, .m_v1.ResourceEventType = SAHPI_RESE_RESOURCE_FAILURE, .m_pad2 = 48, .m_v2.ResourceEventType = SAHPI_RESE_RESOURCE_RESTORED, .m_v3.ResourceEventType = SAHPI_RESE_RESOURCE_ADDED, .m_pad3 = 49 }; unsigned char *buffer = (unsigned char *)malloc(sizeof(value)); cTest result; unsigned int s1 = Marshal( &TestType, &value, buffer ); unsigned int s2 = Demarshal( MarshalByteOrder(), &TestType, &result, buffer ); if ( s1 != s2 ) return 1; if ( value.m_pad1 != result.m_pad1 ) return 1; if ( !cmp_resourceevent( &value.m_v1, &result.m_v1 ) ) return 1; if ( value.m_pad2 != result.m_pad2 ) return 1; if ( !cmp_resourceevent( &value.m_v2, &result.m_v2 ) ) return 1; if ( !cmp_resourceevent( &value.m_v3, &result.m_v3 ) ) return 1; if ( value.m_pad3 != result.m_pad3 ) return 1; return 0; } openhpi-2.14.1/marshal/t/marshal_009.c0000644000076400007640000000165711302567035014261 0ustar /* * Copyright (c) 2004 by FORCE Computers. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Thomas Kanngieser */ #include "marshal.h" int main( int argc, char *argv[] ) { tFloat64 value = -47.345566; tFloat64 result; unsigned char buffer[256]; unsigned int s1 = Marshal( &Marshal_Float64Type, &value, buffer ); if ( s1 != sizeof( tFloat64 ) ) return 1; unsigned int s2 = Demarshal( MarshalByteOrder(), &Marshal_Float64Type, &result, buffer ); if ( s2 != sizeof( tFloat64 ) ) return 1; if ( value != result ) return 1; return 0; } openhpi-2.14.1/marshal/t/marshal_031.c0000644000076400007640000000170611302567035014247 0ustar /* * Copyright (c) 2007 by Sun Microsystems, Inc. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Chris Rinaldo */ #include "marshal.h" #include #include int main( int argc, char *argv[] ) { tFloat64 value = -2.3480639908310873e-146; tFloat64 result; tUint64 swap; memcpy( &swap, &value, sizeof( tUint64 ) ); swap = GUINT64_SWAP_LE_BE( swap ); unsigned int s = Demarshal( MarshalByteOrder() ? 0 : 1, &Marshal_Float64Type, &result, &swap ); if ( s != sizeof( tFloat64 ) ) return 1; if ( value != result ) return 1; return 0; } openhpi-2.14.1/marshal/t/marshal_006.c0000644000076400007640000000165211302567035014251 0ustar /* * Copyright (c) 2004 by FORCE Computers. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Thomas Kanngieser */ #include "marshal.h" int main( int argc, char *argv[] ) { tInt32 value = 0x42aa1234; tInt32 result; unsigned char buffer[256]; unsigned int s1 = Marshal( &Marshal_Int32Type, &value, buffer ); if ( s1 != sizeof( tInt32 ) ) return 1; unsigned int s2 = Demarshal( MarshalByteOrder(), &Marshal_Int32Type, &result, buffer ); if ( s2 != sizeof( tInt32 ) ) return 1; if ( value != result ) return 1; return 0; } openhpi-2.14.1/marshal/t/marshal_020.c0000644000076400007640000000523611302567035014247 0ustar /* * Copyright (c) 2004 by FORCE Computers. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Thomas Kanngieser */ #include "marshal.h" #include #define dModU8 0 #define dModU16 1 #define dModU32 2 #define dModU64 3 #define dModI8 4 #define dModI16 5 #define dModI32 6 #define dModI64 7 #define dModF32 8 #define dModF64 9 typedef union { tUint8 m_u8; tUint16 m_u16; tUint32 m_u32; tUint64 m_u64; tInt8 m_i8; tInt16 m_i16; tInt32 m_i32; tInt64 m_i64; tFloat32 m_f32; tFloat64 m_f64; } cUnion; typedef struct { tUint8 m_pad1; tUint8 m_mod; tUint8 m_pad2; cUnion m_union; tUint8 m_pad3; } cTest; cMarshalType UnionElements[] = { dUnionElement( dModU8 , Marshal_Uint8Type ), dUnionElement( dModU16, Marshal_Uint16Type ), dUnionElement( dModU32, Marshal_Uint32Type ), dUnionElement( dModU64, Marshal_Uint64Type ), dUnionElement( dModI8 , Marshal_Int8Type ), dUnionElement( dModI16, Marshal_Int16Type ), dUnionElement( dModI32, Marshal_Int32Type ), dUnionElement( dModI64, Marshal_Int64Type ), dUnionElement( dModF32, Marshal_Float32Type ), dUnionElement( dModF64, Marshal_Float64Type ), dUnionElementEnd() }; cMarshalType TestUnionType = dUnion( 1, cUnion, UnionElements ); cMarshalType StructElements[] = { dStructElement( cTest, m_pad1 , Marshal_Uint8Type ), dStructElement( cTest, m_mod , Marshal_Uint8Type ), dStructElement( cTest, m_pad2 , Marshal_Uint8Type ), dStructElement( cTest, m_union, TestUnionType ), dStructElement( cTest, m_pad3 , Marshal_Uint8Type ), dStructElementEnd() }; cMarshalType TestType = dStruct( cTest, StructElements ); int main( int argc, char *argv[] ) { cTest value = { .m_pad1 = 47, .m_mod = dModU16, .m_pad2 = 48, .m_union.m_u16 = 0x4711, .m_pad3 = 49 }; unsigned char buffer[256]; cTest result; unsigned int s1 = Marshal( &TestType, &value, buffer ); unsigned int s2 = Demarshal( MarshalByteOrder(), &TestType, &result, buffer ); if ( s1 != s2 ) return 1; if ( value.m_pad1 != result.m_pad1 ) return 1; if ( value.m_mod != result.m_mod ) return 1; if ( value.m_pad2 != result.m_pad2 ) return 1; if ( value.m_pad3 != result.m_pad3 ) return 1; if ( value.m_union.m_u16 != result.m_union.m_u16 ) return 1; return 0; } openhpi-2.14.1/marshal/t/marshal_hpi_types_006.c0000644000076400007640000002327411302567035016341 0ustar /* * Copyright (c) 2005 by IBM Corporation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * W. David Ashley */ #include "marshal_hpi_types.h" #include #include #include static int cmp_sensorreading( SaHpiSensorReadingT *d1, SaHpiSensorReadingT *d2 ) { if ( d1->IsSupported != d2->IsSupported ) return 0; if ( d1->Type != d2->Type ) return 0; if ( d1->Value.SensorInt64 != d2->Value.SensorInt64 ) return 0; return 1; } typedef struct { tUint8 m_pad1; SaHpiSensorDataFormatT m_v1; tUint8 m_pad2; SaHpiSensorDataFormatT m_v2; SaHpiSensorDataFormatT m_v3; tUint8 m_pad3; } cTest; cMarshalType StructElements[] = { dStructElement( cTest, m_pad1 , Marshal_Uint8Type ), dStructElement( cTest, m_v1 , SaHpiSensorDataFormatType ), dStructElement( cTest, m_pad2 , Marshal_Uint8Type ), dStructElement( cTest, m_v2 , SaHpiSensorDataFormatType ), dStructElement( cTest, m_v3 , SaHpiSensorDataFormatType ), dStructElement( cTest, m_pad3 , Marshal_Uint8Type ), dStructElementEnd() }; cMarshalType TestType = dStruct( cTest, StructElements ); int main( int argc, char *argv[] ) { cTest value = { .m_pad1 = 47, .m_v1.IsSupported = TRUE, .m_v1.ReadingType = SAHPI_SENSOR_READING_TYPE_INT64, .m_v1.BaseUnits = SAHPI_SU_DEGREES_C, .m_v1.ModifierUnits = SAHPI_SU_DEGREES_C, .m_v1.ModifierUse = SAHPI_SMUU_NONE, .m_v1.Percentage = TRUE, .m_v1.Range.Flags = SAHPI_SRF_MIN | SAHPI_SRF_MAX | SAHPI_SRF_NORMAL_MIN | SAHPI_SRF_NORMAL_MAX | SAHPI_SRF_NOMINAL, .m_v1.Range.Max.IsSupported = TRUE, .m_v1.Range.Max.Type = SAHPI_SENSOR_READING_TYPE_INT64, .m_v1.Range.Max.Value = {10}, .m_v1.Range.Min.IsSupported = TRUE, .m_v1.Range.Min.Type = SAHPI_SENSOR_READING_TYPE_INT64, .m_v1.Range.Min.Value = {-10}, .m_v1.Range.Nominal.IsSupported = TRUE, .m_v1.Range.Nominal.Type = SAHPI_SENSOR_READING_TYPE_INT64, .m_v1.Range.Nominal.Value = {0}, .m_v1.Range.NormalMax.IsSupported = TRUE, .m_v1.Range.NormalMax.Type = SAHPI_SENSOR_READING_TYPE_INT64, .m_v1.Range.NormalMax.Value = {5}, .m_v1.Range.NormalMin.IsSupported = TRUE, .m_v1.Range.NormalMin.Type = SAHPI_SENSOR_READING_TYPE_INT64, .m_v1.Range.NormalMin.Value = {-5}, .m_v1.AccuracyFactor = 0, .m_pad2 = 48, .m_v2.IsSupported = TRUE, .m_v2.ReadingType = SAHPI_SENSOR_READING_TYPE_INT64, .m_v2.BaseUnits = SAHPI_SU_DEGREES_F, .m_v2.ModifierUnits = SAHPI_SU_DEGREES_F, .m_v2.ModifierUse = SAHPI_SMUU_NONE, .m_v2.Percentage = FALSE, .m_v2.Range.Flags = SAHPI_SRF_MIN | SAHPI_SRF_MAX | SAHPI_SRF_NORMAL_MIN | SAHPI_SRF_NORMAL_MAX | SAHPI_SRF_NOMINAL, .m_v2.Range.Max.IsSupported = TRUE, .m_v2.Range.Max.Type = SAHPI_SENSOR_READING_TYPE_INT64, .m_v2.Range.Max.Value = {10}, .m_v2.Range.Min.IsSupported = TRUE, .m_v2.Range.Min.Type = SAHPI_SENSOR_READING_TYPE_INT64, .m_v2.Range.Min.Value = {-10}, .m_v2.Range.Nominal.IsSupported = TRUE, .m_v2.Range.Nominal.Type = SAHPI_SENSOR_READING_TYPE_INT64, .m_v2.Range.Nominal.Value = {0}, .m_v2.Range.NormalMax.IsSupported = TRUE, .m_v2.Range.NormalMax.Type = SAHPI_SENSOR_READING_TYPE_INT64, .m_v2.Range.NormalMax.Value = {5}, .m_v2.Range.NormalMin.IsSupported = TRUE, .m_v2.Range.NormalMin.Type = SAHPI_SENSOR_READING_TYPE_INT64, .m_v2.Range.NormalMin.Value = {-5}, .m_v2.AccuracyFactor = 0, .m_v3.IsSupported = TRUE, .m_v3.ReadingType = SAHPI_SENSOR_READING_TYPE_INT64, .m_v3.BaseUnits = SAHPI_SU_DEGREES_F, .m_v3.ModifierUnits = SAHPI_SU_DEGREES_F, .m_v3.ModifierUse = SAHPI_SMUU_NONE, .m_v3.Percentage = FALSE, .m_v3.Range.Flags = SAHPI_SRF_MIN | SAHPI_SRF_MAX | SAHPI_SRF_NORMAL_MIN | SAHPI_SRF_NORMAL_MAX | SAHPI_SRF_NOMINAL, .m_v3.Range.Max.IsSupported = TRUE, .m_v3.Range.Max.Type = SAHPI_SENSOR_READING_TYPE_INT64, .m_v3.Range.Max.Value = {10}, .m_v3.Range.Min.IsSupported = TRUE, .m_v3.Range.Min.Type = SAHPI_SENSOR_READING_TYPE_INT64, .m_v3.Range.Min.Value = {-10}, .m_v3.Range.Nominal.IsSupported = TRUE, .m_v3.Range.Nominal.Type = SAHPI_SENSOR_READING_TYPE_INT64, .m_v3.Range.Nominal.Value = {0}, .m_v3.Range.NormalMax.IsSupported = FALSE, .m_v3.Range.NormalMax.Type = SAHPI_SENSOR_READING_TYPE_INT64, .m_v3.Range.NormalMax.Value = {5}, .m_v3.Range.NormalMin.IsSupported = FALSE, .m_v3.Range.NormalMin.Type = SAHPI_SENSOR_READING_TYPE_INT64, .m_v3.Range.NormalMin.Value = {-5}, .m_v3.AccuracyFactor = 0, .m_pad3 = 49 }; unsigned char *buffer = (unsigned char *)malloc(sizeof(value)); cTest result; unsigned int s1 = Marshal( &TestType, &value, buffer ); unsigned int s2 = Demarshal( MarshalByteOrder(), &TestType, &result, buffer ); if ( s1 != s2 ) return 1; if ( value.m_pad1 != result.m_pad1 ) return 1; if ( value.m_v1.IsSupported != result.m_v1.IsSupported ) return 1; if ( value.m_v1.ReadingType != result.m_v1.ReadingType ) return 1; if ( value.m_v1.BaseUnits != result.m_v1.BaseUnits ) return 1; if ( value.m_v1.ModifierUnits != result.m_v1.ModifierUnits ) return 1; if ( value.m_v1.ModifierUse != result.m_v1.ModifierUse ) return 1; if ( value.m_v1.Percentage != result.m_v1.Percentage ) return 1; if ( !cmp_sensorreading( &value.m_v1.Range.Max, &result.m_v1.Range.Max ) ) return 1; if ( !cmp_sensorreading( &value.m_v1.Range.Min, &result.m_v1.Range.Min ) ) return 1; if ( !cmp_sensorreading( &value.m_v1.Range.Nominal, &result.m_v1.Range.Nominal ) ) return 1; if ( !cmp_sensorreading( &value.m_v1.Range.NormalMax, &result.m_v1.Range.NormalMax ) ) return 1; if ( !cmp_sensorreading( &value.m_v1.Range.NormalMin, &result.m_v1.Range.NormalMin ) ) return 1; if ( value.m_v1.AccuracyFactor != result.m_v1.AccuracyFactor ) return 1; if ( value.m_pad2 != result.m_pad2 ) return 1; if ( value.m_v2.IsSupported != result.m_v2.IsSupported ) return 1; if ( value.m_v2.ReadingType != result.m_v2.ReadingType ) return 1; if ( value.m_v2.BaseUnits != result.m_v2.BaseUnits ) return 1; if ( value.m_v2.ModifierUnits != result.m_v2.ModifierUnits ) return 1; if ( value.m_v2.ModifierUse != result.m_v2.ModifierUse ) return 1; if ( value.m_v2.Percentage != result.m_v2.Percentage ) return 1; if ( !cmp_sensorreading( &value.m_v2.Range.Max, &result.m_v2.Range.Max ) ) return 1; if ( !cmp_sensorreading( &value.m_v2.Range.Min, &result.m_v2.Range.Min ) ) return 1; if ( !cmp_sensorreading( &value.m_v2.Range.Nominal, &result.m_v2.Range.Nominal ) ) return 1; if ( !cmp_sensorreading( &value.m_v2.Range.NormalMax, &result.m_v2.Range.NormalMax ) ) return 1; if ( !cmp_sensorreading( &value.m_v2.Range.NormalMin, &result.m_v2.Range.NormalMin ) ) return 1; if ( value.m_v2.AccuracyFactor != result.m_v2.AccuracyFactor ) return 1; if ( value.m_v3.IsSupported != result.m_v3.IsSupported ) return 1; if ( value.m_v3.ReadingType != result.m_v3.ReadingType ) return 1; if ( value.m_v3.BaseUnits != result.m_v3.BaseUnits ) return 1; if ( value.m_v3.ModifierUnits != result.m_v3.ModifierUnits ) return 1; if ( value.m_v3.ModifierUse != result.m_v3.ModifierUse ) return 1; if ( value.m_v3.Percentage != result.m_v3.Percentage ) return 1; if ( !cmp_sensorreading( &value.m_v3.Range.Max, &result.m_v3.Range.Max ) ) return 1; if ( !cmp_sensorreading( &value.m_v3.Range.Min, &result.m_v3.Range.Min ) ) return 1; if ( !cmp_sensorreading( &value.m_v3.Range.Nominal, &result.m_v3.Range.Nominal ) ) return 1; if ( !cmp_sensorreading( &value.m_v3.Range.NormalMax, &result.m_v3.Range.NormalMax ) ) return 1; if ( !cmp_sensorreading( &value.m_v3.Range.NormalMin, &result.m_v3.Range.NormalMin ) ) return 1; if ( value.m_v3.AccuracyFactor != result.m_v3.AccuracyFactor ) return 1; if ( value.m_pad3 != result.m_pad3 ) return 1; return 0; } openhpi-2.14.1/marshal/t/marshal_008.c0000644000076400007640000000166211302567035014254 0ustar /* * Copyright (c) 2004 by FORCE Computers. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Thomas Kanngieser */ #include "marshal.h" int main( int argc, char *argv[] ) { tFloat32 value = 12.2345678; tFloat32 result; unsigned char buffer[256]; unsigned int s1 = Marshal( &Marshal_Float32Type, &value, buffer ); if ( s1 != sizeof( tFloat32 ) ) return 1; unsigned int s2 = Demarshal( MarshalByteOrder(), &Marshal_Float32Type, &result, buffer ); if ( s2 != sizeof( tFloat32 ) ) return 1; if ( value != result ) return 1; return 0; } openhpi-2.14.1/marshal/t/marshal_013.c0000644000076400007640000000155511302567035014251 0ustar /* * Copyright (c) 2004 by FORCE Computers. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Thomas Kanngieser */ #include "marshal.h" #include int main( int argc, char *argv[] ) { tUint32 value = 0xba098765; tUint32 swap = GUINT32_SWAP_LE_BE( value ); tUint32 result; unsigned int s = Demarshal( MarshalByteOrder() ? 0 : 1, &Marshal_Uint32Type, &result, &swap ); if ( s != sizeof( tUint32 ) ) return 1; if ( value != result ) return 1; return 0; } openhpi-2.14.1/marshal/t/marshal_007.c0000644000076400007640000000166111302567035014252 0ustar /* * Copyright (c) 2004 by FORCE Computers. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Thomas Kanngieser */ #include "marshal.h" int main( int argc, char *argv[] ) { tInt64 value = 0x1234567890abcdefLL; tInt64 result; unsigned char buffer[256]; unsigned int s1 = Marshal( &Marshal_Int64Type, &value, buffer ); if ( s1 != sizeof( tInt64 ) ) return 1; unsigned int s2 = Demarshal( MarshalByteOrder(), &Marshal_Int64Type, &result, buffer ); if ( s2 != sizeof( tInt64 ) ) return 1; if ( value != result ) return 1; return 0; } openhpi-2.14.1/marshal/t/marshal_hpi_types_047.c0000644000076400007640000001034611302567035016342 0ustar /* * Copyright (c) 2005 by IBM Corporation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * W. David Ashley */ #include "marshal_hpi_types.h" #include #include #include static int cmp_eventloginfo( SaHpiEventLogInfoT *d1, SaHpiEventLogInfoT *d2 ) { if ( d1->Entries != d2->Entries ) return 0; if ( d1->Size != d2->Size ) return 0; if ( d1->UserEventMaxSize != d2->UserEventMaxSize ) return 0; if ( d1->UpdateTimestamp != d2->UpdateTimestamp ) return 0; if ( d1->CurrentTime != d2->CurrentTime ) return 0; if ( d1->Enabled != d2->Enabled ) return 0; if ( d1->OverflowFlag != d2->OverflowFlag ) return 0; if ( d1->OverflowResetable != d2->OverflowResetable ) return 0; if ( d1->OverflowAction != d2->OverflowAction ) return 0; return 1; } typedef struct { tUint8 m_pad1; SaHpiEventLogInfoT m_v1; tUint8 m_pad2; SaHpiEventLogInfoT m_v2; SaHpiEventLogInfoT m_v3; tUint8 m_pad3; } cTest; cMarshalType StructElements[] = { dStructElement( cTest, m_pad1 , Marshal_Uint8Type ), dStructElement( cTest, m_v1 , SaHpiEventLogInfoType ), dStructElement( cTest, m_pad2 , Marshal_Uint8Type ), dStructElement( cTest, m_v2 , SaHpiEventLogInfoType ), dStructElement( cTest, m_v3 , SaHpiEventLogInfoType ), dStructElement( cTest, m_pad3 , Marshal_Uint8Type ), dStructElementEnd() }; cMarshalType TestType = dStruct( cTest, StructElements ); int main( int argc, char *argv[] ) { cTest value = { .m_pad1 = 47, .m_v1.Entries = 1, .m_v1.Size = 100, .m_v1.UserEventMaxSize = 100, .m_v1.UpdateTimestamp = 2000, .m_v1.CurrentTime = 2010, .m_v1.Enabled = TRUE, .m_v1.OverflowFlag = FALSE, .m_v1.OverflowResetable = TRUE, .m_v1.OverflowAction = SAHPI_EL_OVERFLOW_DROP, .m_pad2 = 48, .m_v2.Entries = 100, .m_v2.Size = 110, .m_v2.UserEventMaxSize = 100, .m_v2.UpdateTimestamp = 4000, .m_v2.CurrentTime = 4010, .m_v2.Enabled = FALSE, .m_v2.OverflowFlag = TRUE, .m_v2.OverflowResetable = FALSE, .m_v2.OverflowAction = SAHPI_EL_OVERFLOW_OVERWRITE, .m_v3.Entries = 1000, .m_v3.Size = 10, .m_v3.UserEventMaxSize = 20, .m_v3.UpdateTimestamp = 3000, .m_v3.CurrentTime = 3010, .m_v3.Enabled = TRUE, .m_v3.OverflowFlag = TRUE, .m_v3.OverflowResetable = TRUE, .m_v3.OverflowAction = SAHPI_EL_OVERFLOW_DROP, .m_pad3 = 49 }; unsigned char *buffer = (unsigned char *)malloc(sizeof(value)); cTest result; unsigned int s1 = Marshal( &TestType, &value, buffer ); unsigned int s2 = Demarshal( MarshalByteOrder(), &TestType, &result, buffer ); if ( s1 != s2 ) return 1; if ( value.m_pad1 != result.m_pad1 ) return 1; if ( !cmp_eventloginfo( &value.m_v1, &result.m_v1 ) ) return 1; if ( value.m_pad2 != result.m_pad2 ) return 1; if ( !cmp_eventloginfo( &value.m_v2, &result.m_v2 ) ) return 1; if ( !cmp_eventloginfo( &value.m_v3, &result.m_v3 ) ) return 1; if ( value.m_pad3 != result.m_pad3 ) return 1; return 0; } openhpi-2.14.1/marshal/t/marshal_030.c0000644000076400007640000000170511302567035014245 0ustar /* * Copyright (c) 2007 by Sun Microsystems, Inc. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Chris Rinaldo */ #include "marshal.h" #include #include int main( int argc, char *argv[] ) { tFloat32 value = -1.2113584441986872e-18; tFloat32 result; tUint32 swap; memcpy( &swap, &value, sizeof( tUint32 ) ); swap = GUINT32_SWAP_LE_BE( swap ); unsigned int s = Demarshal( MarshalByteOrder() ? 0 : 1, &Marshal_Float32Type, &result, &swap ); if ( s != sizeof( tFloat32 ) ) return 1; if ( value != result ) return 1; return 0; } openhpi-2.14.1/marshal/t/marshal_hpi_types_039.c0000644000076400007640000000640011302567035016337 0ustar /* * Copyright (c) 2005 by IBM Corporation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * W. David Ashley */ #include "marshal_hpi_types.h" #include #include #include static int cmp_text_buffer( SaHpiTextBufferT *d1, SaHpiTextBufferT *d2 ) { if ( d1->DataType != d2->DataType ) return 0; if ( d1->Language != d2->Language ) return 0; if ( d1->DataLength != d2->DataLength ) return 0; return memcmp( d1->Data, d2->Data, d1->DataLength ) ? 0 : 1; } static int cmp_oemevent( SaHpiOemEventT *d1, SaHpiOemEventT *d2 ) { if ( d1->MId != d2->MId ) return 0; if ( !cmp_text_buffer( &d1->OemEventData, &d2->OemEventData ) ) return 0; return 1; } typedef struct { tUint8 m_pad1; SaHpiOemEventT m_v1; tUint8 m_pad2; SaHpiOemEventT m_v2; SaHpiOemEventT m_v3; tUint8 m_pad3; } cTest; cMarshalType StructElements[] = { dStructElement( cTest, m_pad1 , Marshal_Uint8Type ), dStructElement( cTest, m_v1 , SaHpiOemEventType ), dStructElement( cTest, m_pad2 , Marshal_Uint8Type ), dStructElement( cTest, m_v2 , SaHpiOemEventType ), dStructElement( cTest, m_v3 , SaHpiOemEventType ), dStructElement( cTest, m_pad3 , Marshal_Uint8Type ), dStructElementEnd() }; cMarshalType TestType = dStruct( cTest, StructElements ); int main( int argc, char *argv[] ) { cTest value = { .m_pad1 = 47, .m_v1.MId = 1, .m_v1.OemEventData.DataType = SAHPI_TL_TYPE_BINARY, .m_v1.OemEventData.Language = SAHPI_LANG_TSONGA, .m_v1.OemEventData.DataLength = 3, .m_v1.OemEventData.Data = "AB", .m_pad2 = 48, .m_v2.MId = 2, .m_v2.OemEventData.DataType = SAHPI_TL_TYPE_BCDPLUS, .m_v2.OemEventData.Language = SAHPI_LANG_SANGRO, .m_v2.OemEventData.DataLength = 21, .m_v2.OemEventData.Data = "12345678901234567890", .m_v3.MId = 3, .m_v3.OemEventData.DataType = SAHPI_TL_TYPE_ASCII6, .m_v3.OemEventData.Language = SAHPI_LANG_TAJIK, .m_v3.OemEventData.DataLength = 0, .m_v3.OemEventData.Data = "", .m_pad3 = 49 }; unsigned char *buffer = (unsigned char *)malloc(sizeof(value)); cTest result; unsigned int s1 = Marshal( &TestType, &value, buffer ); unsigned int s2 = Demarshal( MarshalByteOrder(), &TestType, &result, buffer ); if ( s1 != s2 ) return 1; if ( value.m_pad1 != result.m_pad1 ) return 1; if ( !cmp_oemevent( &value.m_v1, &result.m_v1 ) ) return 1; if ( value.m_pad2 != result.m_pad2 ) return 1; if ( !cmp_oemevent( &value.m_v2, &result.m_v2 ) ) return 1; if ( !cmp_oemevent( &value.m_v3, &result.m_v3 ) ) return 1; if ( value.m_pad3 != result.m_pad3 ) return 1; return 0; } openhpi-2.14.1/marshal/t/marshal_023.c0000644000076400007640000000534411302567035014252 0ustar /* * Copyright (c) 2004 by FORCE Computers. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Thomas Kanngieser */ #include "marshal.h" #include #define dModU8 0xf001 #define dModU16 0xf002 #define dModU32 0xf003 #define dModU64 0xf004 #define dModI8 0xf005 #define dModI16 0xf006 #define dModI32 0xf007 #define dModI64 0xf008 #define dModF32 0xf009 #define dModF64 0xf010 typedef union { tUint8 m_u8; tUint16 m_u16; tUint32 m_u32; tUint64 m_u64; tInt8 m_i8; tInt16 m_i16; tInt32 m_i32; tInt64 m_i64; tFloat32 m_f32; tFloat64 m_f64; } cUnion; typedef struct { tUint8 m_pad1; tUint16 m_mod; tUint8 m_pad2; cUnion m_union; tUint8 m_pad3; } cTest; cMarshalType UnionElements[] = { dUnionElement( dModU8 , Marshal_Uint8Type ), dUnionElement( dModU16, Marshal_Uint16Type ), dUnionElement( dModU32, Marshal_Uint32Type ), dUnionElement( dModU64, Marshal_Uint64Type ), dUnionElement( dModI8 , Marshal_Int8Type ), dUnionElement( dModI16, Marshal_Int16Type ), dUnionElement( dModI32, Marshal_Int32Type ), dUnionElement( dModI64, Marshal_Int64Type ), dUnionElement( dModF32, Marshal_Float32Type ), dUnionElement( dModF64, Marshal_Float64Type ), dUnionElementEnd() }; cMarshalType TestUnionType = dUnion( 1, cUnion, UnionElements ); cMarshalType StructElements[] = { dStructElement( cTest, m_pad1 , Marshal_Uint8Type ), dStructElement( cTest, m_mod , Marshal_Uint16Type ), dStructElement( cTest, m_pad2 , Marshal_Uint8Type ), dStructElement( cTest, m_union, TestUnionType ), dStructElement( cTest, m_pad3 , Marshal_Uint8Type ), dStructElementEnd() }; cMarshalType TestType = dStruct( cTest, StructElements ); int main( int argc, char *argv[] ) { cTest value = { .m_pad1 = 47, .m_mod = dModU64, .m_pad2 = 48, .m_union.m_u64 = 0xabcd123456780123LL, .m_pad3 = 49 }; unsigned char buffer[256]; cTest result; unsigned int s1 = Marshal( &TestType, &value, buffer ); unsigned int s2 = Demarshal( MarshalByteOrder(), &TestType, &result, buffer ); if ( s1 != s2 ) return 1; if ( value.m_pad1 != result.m_pad1 ) return 1; if ( value.m_mod != result.m_mod ) return 1; if ( value.m_pad2 != result.m_pad2 ) return 1; if ( value.m_pad3 != result.m_pad3 ) return 1; if ( value.m_union.m_u64 != result.m_union.m_u64 ) return 1; return 0; } openhpi-2.14.1/marshal/t/marshal_hpi_types_018.c0000644000076400007640000000630411302567035016337 0ustar /* * Copyright (c) 2005 by IBM Corporation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * W. David Ashley */ #include "marshal_hpi_types.h" #include #include #include static int cmp_ctrlstateoem( SaHpiCtrlStateOemT *d1, SaHpiCtrlStateOemT *d2 ) { if ( d1->MId != d2->MId ) return 0; if ( d1->BodyLength != d2->BodyLength ) return 0; if ( memcmp(d1->Body, d2->Body, SAHPI_CTRL_MAX_OEM_BODY_LENGTH) != 0 ) return 0; return 1; } static int cmp_ctrlrecoem( SaHpiCtrlRecOemT *d1, SaHpiCtrlRecOemT *d2 ) { if ( d1->MId != d2->MId ) return 0; if ( memcmp(d1->ConfigData, d2->ConfigData, SAHPI_CTRL_OEM_CONFIG_LENGTH) != 0 ) return 0; if ( !cmp_ctrlstateoem( &d1->Default, &d2->Default ) ) return 0; return 1; } typedef struct { tUint8 m_pad1; SaHpiCtrlRecOemT m_v1; tUint8 m_pad2; SaHpiCtrlRecOemT m_v2; SaHpiCtrlRecOemT m_v3; tUint8 m_pad3; } cTest; cMarshalType StructElements[] = { dStructElement( cTest, m_pad1 , Marshal_Uint8Type ), dStructElement( cTest, m_v1 , SaHpiCtrlRecOemType ), dStructElement( cTest, m_pad2 , Marshal_Uint8Type ), dStructElement( cTest, m_v2 , SaHpiCtrlRecOemType ), dStructElement( cTest, m_v3 , SaHpiCtrlRecOemType ), dStructElement( cTest, m_pad3 , Marshal_Uint8Type ), dStructElementEnd() }; cMarshalType TestType = dStruct( cTest, StructElements ); int main( int argc, char *argv[] ) { cTest value = { .m_pad1 = 47, .m_v1.MId = 0, .m_v1.ConfigData = {'A', 'B', 'c', 'd'}, .m_v1.Default.MId = 0, .m_v1.Default.BodyLength = 4, .m_v1.Default.Body = {'A', 'B', 'c', 'd'}, .m_pad2 = 48, .m_v2.MId = 0, .m_v2.ConfigData = {'d', 'c', 'B', 'A'}, .m_v2.Default.MId = 1, .m_v2.Default.BodyLength = 4, .m_v2.Default.Body = {'d', 'c', 'B', 'A'}, .m_v3.MId = 0, .m_v3.ConfigData = {'A'}, .m_v3.Default.MId = 1, .m_v3.Default.BodyLength = 1, .m_v3.Default.Body = {'A'}, .m_pad3 = 49 }; unsigned char *buffer = (unsigned char *)malloc(sizeof(value)); cTest result; unsigned int s1 = Marshal( &TestType, &value, buffer ); unsigned int s2 = Demarshal( MarshalByteOrder(), &TestType, &result, buffer ); if ( s1 != s2 ) return 1; if ( value.m_pad1 != result.m_pad1 ) return 1; if ( !cmp_ctrlrecoem( &value.m_v1, &result.m_v1 ) ) return 1; if ( value.m_pad2 != result.m_pad2 ) return 1; if ( !cmp_ctrlrecoem( &value.m_v2, &result.m_v2 ) ) return 1; if ( !cmp_ctrlrecoem( &value.m_v3, &result.m_v3 ) ) return 1; if ( value.m_pad3 != result.m_pad3 ) return 1; return 0; } openhpi-2.14.1/marshal/t/marshal_024.c0000644000076400007640000000541011302567035014245 0ustar /* * Copyright (c) 2004 by FORCE Computers. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Thomas Kanngieser */ #include "marshal.h" #include #define dModU8 0xabcdf001 #define dModU16 0xabcdf002 #define dModU32 0xabcdf003 #define dModU64 0xabcdf004 #define dModI8 0xabcdf005 #define dModI16 0xabcdf006 #define dModI32 0xabcdf007 #define dModI64 0xabcdf008 #define dModF32 0xabcdf009 #define dModF64 0xabcdf010 typedef union { tUint8 m_u8; tUint16 m_u16; tUint32 m_u32; tUint64 m_u64; tInt8 m_i8; tInt16 m_i16; tInt32 m_i32; tInt64 m_i64; tFloat32 m_f32; tFloat64 m_f64; } cUnion; typedef struct { tUint8 m_pad1; tUint32 m_mod; tUint8 m_pad2; cUnion m_union; tUint8 m_pad3; } cTest; cMarshalType UnionElements[] = { dUnionElement( dModU8 , Marshal_Uint8Type ), dUnionElement( dModU16, Marshal_Uint16Type ), dUnionElement( dModU32, Marshal_Uint32Type ), dUnionElement( dModU64, Marshal_Uint64Type ), dUnionElement( dModI8 , Marshal_Int8Type ), dUnionElement( dModI16, Marshal_Int16Type ), dUnionElement( dModI32, Marshal_Int32Type ), dUnionElement( dModI64, Marshal_Int64Type ), dUnionElement( dModF32, Marshal_Float32Type ), dUnionElement( dModF64, Marshal_Float64Type ), dUnionElementEnd() }; cMarshalType TestUnionType = dUnion( 1, cUnion, UnionElements ); cMarshalType StructElements[] = { dStructElement( cTest, m_pad1 , Marshal_Uint8Type ), dStructElement( cTest, m_mod , Marshal_Uint32Type ), dStructElement( cTest, m_pad2 , Marshal_Uint8Type ), dStructElement( cTest, m_union, TestUnionType ), dStructElement( cTest, m_pad3 , Marshal_Uint8Type ), dStructElementEnd() }; cMarshalType TestType = dStruct( cTest, StructElements ); int main( int argc, char *argv[] ) { cTest value = { .m_pad1 = 47, .m_mod = dModU64, .m_pad2 = 48, .m_union.m_u64 = 0xabcd123456780123LL, .m_pad3 = 49 }; unsigned char buffer[256]; cTest result; unsigned int s1 = Marshal( &TestType, &value, buffer ); unsigned int s2 = Demarshal( MarshalByteOrder(), &TestType, &result, buffer ); if ( s1 != s2 ) return 1; if ( value.m_pad1 != result.m_pad1 ) return 1; if ( value.m_pad2 != result.m_pad2 ) return 1; if ( value.m_mod != result.m_mod ) return 1; if ( value.m_pad3 != result.m_pad3 ) return 1; if ( value.m_union.m_u64 != result.m_union.m_u64 ) return 1; return 0; } openhpi-2.14.1/marshal/t/marshal_hpi_types_026.c0000644000076400007640000000455311302567035016342 0ustar /* * Copyright (c) 2005 by IBM Corporation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * W. David Ashley */ #include "marshal_hpi_types.h" #include #include #include static int cmp_watchdogrec( SaHpiWatchdogRecT *d1, SaHpiWatchdogRecT *d2 ) { if ( d1->WatchdogNum != d2->WatchdogNum ) return 0; if ( d1->Oem != d2->Oem ) return 0; return 1; } typedef struct { tUint8 m_pad1; SaHpiWatchdogRecT m_v1; tUint8 m_pad2; SaHpiWatchdogRecT m_v2; SaHpiWatchdogRecT m_v3; tUint8 m_pad3; } cTest; cMarshalType StructElements[] = { dStructElement( cTest, m_pad1 , Marshal_Uint8Type ), dStructElement( cTest, m_v1 , SaHpiWatchdogRecType ), dStructElement( cTest, m_pad2 , Marshal_Uint8Type ), dStructElement( cTest, m_v2 , SaHpiWatchdogRecType ), dStructElement( cTest, m_v3 , SaHpiWatchdogRecType ), dStructElement( cTest, m_pad3 , Marshal_Uint8Type ), dStructElementEnd() }; cMarshalType TestType = dStruct( cTest, StructElements ); int main( int argc, char *argv[] ) { cTest value = { .m_pad1 = 47, .m_v1.WatchdogNum = 1, .m_v1.Oem = 0, .m_pad2 = 48, .m_v1.WatchdogNum = 2, .m_v1.Oem = 1, .m_v1.WatchdogNum = 3, .m_v1.Oem = 2, .m_pad3 = 49 }; unsigned char *buffer = (unsigned char *)malloc(sizeof(value)); cTest result; unsigned int s1 = Marshal( &TestType, &value, buffer ); unsigned int s2 = Demarshal( MarshalByteOrder(), &TestType, &result, buffer ); if ( s1 != s2 ) return 1; if ( value.m_pad1 != result.m_pad1 ) return 1; if ( !cmp_watchdogrec( &value.m_v1, &result.m_v1 ) ) return 1; if ( value.m_pad2 != result.m_pad2 ) return 1; if ( !cmp_watchdogrec( &value.m_v2, &result.m_v2 ) ) return 1; if ( !cmp_watchdogrec( &value.m_v3, &result.m_v3 ) ) return 1; if ( value.m_pad3 != result.m_pad3 ) return 1; return 0; } openhpi-2.14.1/marshal/t/marshal_022.c0000644000076400007640000000525411302567035014251 0ustar /* * Copyright (c) 2004 by FORCE Computers. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Thomas Kanngieser */ #include "marshal.h" #include #define dModU8 0 #define dModU16 1 #define dModU32 2 #define dModU64 3 #define dModI8 4 #define dModI16 5 #define dModI32 6 #define dModI64 7 #define dModF32 8 #define dModF64 9 typedef union { tUint8 m_u8; tUint16 m_u16; tUint32 m_u32; tUint64 m_u64; tInt8 m_i8; tInt16 m_i16; tInt32 m_i32; tInt64 m_i64; tFloat32 m_f32; tFloat64 m_f64; } cUnion; typedef struct { tUint8 m_pad1; tUint8 m_mod; tUint8 m_pad2; cUnion m_union; tUint8 m_pad3; } cTest; cMarshalType UnionElements[] = { dUnionElement( dModU8 , Marshal_Uint8Type ), dUnionElement( dModU16, Marshal_Uint16Type ), dUnionElement( dModU32, Marshal_Uint32Type ), dUnionElement( dModU64, Marshal_Uint64Type ), dUnionElement( dModI8 , Marshal_Int8Type ), dUnionElement( dModI16, Marshal_Int16Type ), dUnionElement( dModI32, Marshal_Int32Type ), dUnionElement( dModI64, Marshal_Int64Type ), dUnionElement( dModF32, Marshal_Float32Type ), dUnionElement( dModF64, Marshal_Float64Type ), dUnionElementEnd() }; cMarshalType TestUnionType = dUnion( 1, cUnion, UnionElements ); cMarshalType StructElements[] = { dStructElement( cTest, m_pad1 , Marshal_Uint8Type ), dStructElement( cTest, m_mod , Marshal_Uint8Type ), dStructElement( cTest, m_pad2 , Marshal_Uint8Type ), dStructElement( cTest, m_union, TestUnionType ), dStructElement( cTest, m_pad3 , Marshal_Uint8Type ), dStructElementEnd() }; cMarshalType TestType = dStruct( cTest, StructElements ); int main( int argc, char *argv[] ) { cTest value = { .m_pad1 = 47, .m_mod = dModU64, .m_pad2 = 48, .m_union.m_u64 = 0xabcd123456780123LL, .m_pad3 = 49 }; unsigned char buffer[256]; cTest result; unsigned int s1 = Marshal( &TestType, &value, buffer ); unsigned int s2 = Demarshal( MarshalByteOrder(), &TestType, &result, buffer ); if ( s1 != s2 ) return 1; if ( value.m_pad1 != result.m_pad1 ) return 1; if ( value.m_mod != result.m_mod ) return 1; if ( value.m_pad2 != result.m_pad2 ) return 1; if ( value.m_pad3 != result.m_pad3 ) return 1; if ( value.m_union.m_u64 != result.m_union.m_u64 ) return 1; return 0; } openhpi-2.14.1/marshal/t/marshal_hpi_types_005.c0000644000076400007640000001556211302567035016341 0ustar /* * Copyright (c) 2005 by IBM Corporation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * W. David Ashley */ #include "marshal_hpi_types.h" #include #include #include static int cmp_sensorreading( SaHpiSensorReadingT *d1, SaHpiSensorReadingT *d2 ) { if ( d1->IsSupported != d2->IsSupported ) return 0; if ( d1->Type != d2->Type ) return 0; if ( d1->Value.SensorInt64 != d2->Value.SensorInt64 ) return 0; return 1; } typedef struct { tUint8 m_pad1; SaHpiSensorRangeT m_v1; tUint8 m_pad2; SaHpiSensorRangeT m_v2; SaHpiSensorRangeT m_v3; tUint8 m_pad3; } cTest; cMarshalType StructElements[] = { dStructElement( cTest, m_pad1 , Marshal_Uint8Type ), dStructElement( cTest, m_v1 , SaHpiSensorRangeType ), dStructElement( cTest, m_pad2 , Marshal_Uint8Type ), dStructElement( cTest, m_v2 , SaHpiSensorRangeType ), dStructElement( cTest, m_v3 , SaHpiSensorRangeType ), dStructElement( cTest, m_pad3 , Marshal_Uint8Type ), dStructElementEnd() }; cMarshalType TestType = dStruct( cTest, StructElements ); int main( int argc, char *argv[] ) { cTest value = { .m_pad1 = 47, .m_v1.Flags = SAHPI_SRF_MIN | SAHPI_SRF_MAX | SAHPI_SRF_NORMAL_MIN | SAHPI_SRF_NORMAL_MAX | SAHPI_SRF_NOMINAL, .m_v1.Max.IsSupported = TRUE, .m_v1.Max.Type = SAHPI_SENSOR_READING_TYPE_INT64, .m_v1.Max.Value = {21}, .m_v1.Min.IsSupported = TRUE, .m_v1.Min.Type = SAHPI_SENSOR_READING_TYPE_INT64, .m_v1.Min.Value = {-21}, .m_v1.Nominal.IsSupported = TRUE, .m_v1.Nominal.Type = SAHPI_SENSOR_READING_TYPE_INT64, .m_v1.Nominal.Value = {0}, .m_v1.NormalMax.IsSupported = TRUE, .m_v1.NormalMax.Type = SAHPI_SENSOR_READING_TYPE_INT64, .m_v1.NormalMax.Value = {5}, .m_v1.NormalMin.IsSupported = TRUE, .m_v1.NormalMin.Type = SAHPI_SENSOR_READING_TYPE_INT64, .m_v1.NormalMin.Value = {-5}, .m_pad2 = 48, .m_v2.Flags = SAHPI_SRF_MIN | SAHPI_SRF_MAX | SAHPI_SRF_NORMAL_MIN | SAHPI_SRF_NORMAL_MAX | SAHPI_SRF_NOMINAL, .m_v2.Max.IsSupported = TRUE, .m_v2.Max.Type = SAHPI_SENSOR_READING_TYPE_INT64, .m_v2.Max.Value = {10}, .m_v2.Min.IsSupported = TRUE, .m_v2.Min.Type = SAHPI_SENSOR_READING_TYPE_INT64, .m_v2.Min.Value = {-10}, .m_v2.Nominal.IsSupported = TRUE, .m_v2.Nominal.Type = SAHPI_SENSOR_READING_TYPE_INT64, .m_v2.Nominal.Value = {0}, .m_v2.NormalMax.IsSupported = TRUE, .m_v2.NormalMax.Type = SAHPI_SENSOR_READING_TYPE_INT64, .m_v2.NormalMax.Value = {5}, .m_v2.NormalMin.IsSupported = TRUE, .m_v2.NormalMin.Type = SAHPI_SENSOR_READING_TYPE_INT64, .m_v2.NormalMin.Value = {-5}, .m_v3.Flags = SAHPI_SRF_MIN | SAHPI_SRF_MAX | SAHPI_SRF_NORMAL_MIN | SAHPI_SRF_NORMAL_MAX | SAHPI_SRF_NOMINAL, .m_v3.Max.IsSupported = TRUE, .m_v3.Max.Type = SAHPI_SENSOR_READING_TYPE_INT64, .m_v3.Max.Value = {10}, .m_v3.Min.IsSupported = TRUE, .m_v3.Min.Type = SAHPI_SENSOR_READING_TYPE_INT64, .m_v3.Min.Value = {-10}, .m_v3.Nominal.IsSupported = TRUE, .m_v3.Nominal.Type = SAHPI_SENSOR_READING_TYPE_INT64, .m_v3.Nominal.Value = {3}, .m_v3.NormalMax.IsSupported = TRUE, .m_v3.NormalMax.Type = SAHPI_SENSOR_READING_TYPE_INT64, .m_v3.NormalMax.Value = {7}, .m_v3.NormalMin.IsSupported = TRUE, .m_v3.NormalMin.Type = SAHPI_SENSOR_READING_TYPE_INT64, .m_v3.NormalMin.Value = {-7}, .m_pad3 = 49 }; unsigned char *buffer = (unsigned char *)malloc(sizeof(value)); cTest result; unsigned int s1 = Marshal( &TestType, &value, buffer ); unsigned int s2 = Demarshal( MarshalByteOrder(), &TestType, &result, buffer ); if ( s1 != s2 ) return 1; if ( value.m_pad1 != result.m_pad1 ) return 1; if ( value.m_v1.Flags != result.m_v1.Flags ) return 1; if ( !cmp_sensorreading( &value.m_v1.Max, &result.m_v1.Max ) ) return 1; if ( !cmp_sensorreading( &value.m_v1.Min, &result.m_v1.Min ) ) return 1; if ( !cmp_sensorreading( &value.m_v1.Nominal, &result.m_v1.Nominal ) ) return 1; if ( !cmp_sensorreading( &value.m_v1.NormalMax, &result.m_v1.NormalMax ) ) return 1; if ( !cmp_sensorreading( &value.m_v1.NormalMin, &result.m_v1.NormalMin ) ) return 1; if ( value.m_pad2 != result.m_pad2 ) return 1; if ( value.m_v2.Flags != result.m_v2.Flags ) return 1; if ( !cmp_sensorreading( &value.m_v2.Max, &result.m_v2.Max ) ) return 1; if ( !cmp_sensorreading( &value.m_v2.Min, &result.m_v2.Min ) ) return 1; if ( !cmp_sensorreading( &value.m_v2.Nominal, &result.m_v2.Nominal ) ) return 1; if ( !cmp_sensorreading( &value.m_v2.NormalMax, &result.m_v2.NormalMax ) ) return 1; if ( !cmp_sensorreading( &value.m_v2.NormalMin, &result.m_v2.NormalMin ) ) return 1; if ( value.m_v3.Flags != result.m_v3.Flags ) return 1; if ( !cmp_sensorreading( &value.m_v3.Max, &result.m_v3.Max ) ) return 1; if ( !cmp_sensorreading( &value.m_v3.Min, &result.m_v3.Min ) ) return 1; if ( !cmp_sensorreading( &value.m_v3.Nominal, &result.m_v3.Nominal ) ) return 1; if ( !cmp_sensorreading( &value.m_v3.NormalMax, &result.m_v3.NormalMax ) ) return 1; if ( !cmp_sensorreading( &value.m_v3.NormalMin, &result.m_v3.NormalMin ) ) return 1; if ( value.m_pad3 != result.m_pad3 ) return 1; return 0; } openhpi-2.14.1/marshal/t/marshal_027.c0000644000076400007640000000431011302567035014246 0ustar /* * Copyright (c) 2004 by FORCE Computers. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Thomas Kanngieser */ #include "marshal.h" #include static unsigned int my_user_data = 42; static int MyMarshalFunction( const cMarshalType *type, const void *data, void *buffer, void *user_data ) { unsigned int *ud = (unsigned int *)user_data; if ( ud != &my_user_data ) exit( 1 ); if ( *ud != my_user_data ) exit( 1 ); const tUint8 *d = (const tUint8 *)data; tUint8 *b = (tUint8 *)buffer; tUint8 v1 = *d++; tUint8 v2 = *d++; tUint8 v3 = *d++; *b++ = v2; *b++ = v3; *b++ = v1; return 3; } static int MyDemarshalFunction( int byte_order, const cMarshalType *type, void *data, const void *buffer, void *user_data ) { unsigned int *ud = (unsigned int *)user_data; if ( ud != &my_user_data ) exit( 1 ); if ( *ud != my_user_data ) exit( 1 ); tUint8 *d = (tUint8 *)data; const tUint8 *b = (const tUint8 *)buffer; tUint8 v2 = *b++; tUint8 v3 = *b++; tUint8 v1 = *b++; *d++ = v1; *d++ = v2; *d++ = v3; return 3; } static cMarshalType UserDefinedType = dUserDefined( MyMarshalFunction, MyDemarshalFunction, &my_user_data ); int main( int argc, char *argv[] ) { tUint8 value[4] = { 0x42, 0X43, 0X44, 0X45 }; tUint8 result[4] = { 0x11, 0x12, 0x13, 0x14 }; unsigned char buffer[256]; unsigned int s1 = Marshal( &UserDefinedType, value, buffer ); if ( s1 != 3 ) return 1; unsigned int s2 = Demarshal( MarshalByteOrder(), &UserDefinedType, result, buffer ); if ( s2 != 3 ) return 1; if ( value[0] != result[0] ) return 1; if ( value[1] != result[1] ) return 1; if ( value[2] != result[2] ) return 1; if ( result[3] != 0x14 ) return 1; return 0; } openhpi-2.14.1/marshal/t/marshal_hpi_types_016.c0000644000076400007640000000553711302567035016344 0ustar /* * Copyright (c) 2005 by IBM Corporation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * W. David Ashley */ #include "marshal_hpi_types.h" #include #include #include static int cmp_ctrlstatestream( SaHpiCtrlStateStreamT *d1, SaHpiCtrlStateStreamT *d2 ) { if ( d1->Repeat != d2->Repeat ) return 0; if ( d1->StreamLength != d2->StreamLength ) return 0; if ( memcmp(d1->Stream, d2->Stream, SAHPI_CTRL_MAX_STREAM_LENGTH) != 0 ) return 0; return 1; } static int cmp_ctrlrecstream( SaHpiCtrlRecStreamT *d1, SaHpiCtrlRecStreamT *d2 ) { if ( !cmp_ctrlstatestream( &d1->Default, &d2->Default ) ) return 0; return 1; } typedef struct { tUint8 m_pad1; SaHpiCtrlRecStreamT m_v1; tUint8 m_pad2; SaHpiCtrlRecStreamT m_v2; SaHpiCtrlRecStreamT m_v3; tUint8 m_pad3; } cTest; cMarshalType StructElements[] = { dStructElement( cTest, m_pad1 , Marshal_Uint8Type ), dStructElement( cTest, m_v1 , SaHpiCtrlRecStreamType ), dStructElement( cTest, m_pad2 , Marshal_Uint8Type ), dStructElement( cTest, m_v2 , SaHpiCtrlRecStreamType ), dStructElement( cTest, m_v3 , SaHpiCtrlRecStreamType ), dStructElement( cTest, m_pad3 , Marshal_Uint8Type ), dStructElementEnd() }; cMarshalType TestType = dStruct( cTest, StructElements ); int main( int argc, char *argv[] ) { cTest value = { .m_pad1 = 47, .m_v1.Default.Repeat = 0, .m_v1.Default.StreamLength = 4, .m_v1.Default.Stream = {'A', 'B', 'c', 'd'}, .m_pad2 = 48, .m_v2.Default.Repeat = 1, .m_v2.Default.StreamLength = 4, .m_v2.Default.Stream = {'d', 'c', 'B', 'A'}, .m_v3.Default.Repeat = 1, .m_v3.Default.StreamLength = 1, .m_v3.Default.Stream = {'A'}, .m_pad3 = 49 }; unsigned char *buffer = (unsigned char *)malloc(sizeof(value)); cTest result; unsigned int s1 = Marshal( &TestType, &value, buffer ); unsigned int s2 = Demarshal( MarshalByteOrder(), &TestType, &result, buffer ); if ( s1 != s2 ) return 1; if ( value.m_pad1 != result.m_pad1 ) return 1; if ( !cmp_ctrlrecstream( &value.m_v1, &result.m_v1 ) ) return 1; if ( value.m_pad2 != result.m_pad2 ) return 1; if ( !cmp_ctrlrecstream( &value.m_v2, &result.m_v2 ) ) return 1; if ( !cmp_ctrlrecstream( &value.m_v3, &result.m_v3 ) ) return 1; if ( value.m_pad3 != result.m_pad3 ) return 1; return 0; } openhpi-2.14.1/marshal/t/marshal_hpi_types_014.c0000644000076400007640000000443111302567035016332 0ustar /* * Copyright (c) 2005 by IBM Corporation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * W. David Ashley */ #include "marshal_hpi_types.h" #include #include #include static int cmp_ctrlrecdiscrete( SaHpiCtrlRecDiscreteT *d1, SaHpiCtrlRecDiscreteT *d2 ) { if ( d1->Default != d2->Default ) return 0; return 1; } typedef struct { tUint8 m_pad1; SaHpiCtrlRecDiscreteT m_v1; tUint8 m_pad2; SaHpiCtrlRecDiscreteT m_v2; SaHpiCtrlRecDiscreteT m_v3; tUint8 m_pad3; } cTest; cMarshalType StructElements[] = { dStructElement( cTest, m_pad1 , Marshal_Uint8Type ), dStructElement( cTest, m_v1 , SaHpiCtrlRecDiscreteType ), dStructElement( cTest, m_pad2 , Marshal_Uint8Type ), dStructElement( cTest, m_v2 , SaHpiCtrlRecDiscreteType ), dStructElement( cTest, m_v3 , SaHpiCtrlRecDiscreteType ), dStructElement( cTest, m_pad3 , Marshal_Uint8Type ), dStructElementEnd() }; cMarshalType TestType = dStruct( cTest, StructElements ); int main( int argc, char *argv[] ) { cTest value = { .m_pad1 = 47, .m_v1.Default = SAHPI_CTRL_STATE_OFF, .m_pad2 = 48, .m_v1.Default = SAHPI_CTRL_STATE_ON, .m_v1.Default = SAHPI_CTRL_STATE_PULSE_ON, .m_pad3 = 49 }; unsigned char *buffer = (unsigned char *)malloc(sizeof(value)); cTest result; unsigned int s1 = Marshal( &TestType, &value, buffer ); unsigned int s2 = Demarshal( MarshalByteOrder(), &TestType, &result, buffer ); if ( s1 != s2 ) return 1; if ( value.m_pad1 != result.m_pad1 ) return 1; if ( !cmp_ctrlrecdiscrete( &value.m_v1, &result.m_v1 ) ) return 1; if ( value.m_pad2 != result.m_pad2 ) return 1; if ( !cmp_ctrlrecdiscrete( &value.m_v2, &result.m_v2 ) ) return 1; if ( !cmp_ctrlrecdiscrete( &value.m_v3, &result.m_v3 ) ) return 1; if ( value.m_pad3 != result.m_pad3 ) return 1; return 0; } openhpi-2.14.1/marshal/t/marshal_hpi_types_046.c0000644000076400007640000002027111302567035016337 0ustar /* * Copyright (c) 2005 by IBM Corporation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * W. David Ashley */ #include "marshal_hpi_types.h" #include #include #include static int cmp_text_buffer( SaHpiTextBufferT *d1, SaHpiTextBufferT *d2 ) { if ( d1->DataType != d2->DataType ) return 0; if ( d1->Language != d2->Language ) return 0; if ( d1->DataLength != d2->DataLength ) return 0; return memcmp( d1->Data, d2->Data, d1->DataLength ) ? 0 : 1; } static int cmp_entity( SaHpiEntityT *d1, SaHpiEntityT *d2 ) { if ( d1->EntityType != d2->EntityType ) return 0; if ( d1->EntityLocation != d2->EntityLocation ) return 0; return 1; } static int cmp_entitypath( SaHpiEntityPathT *d1, SaHpiEntityPathT *d2 ) { int i; for (i = 0; ; i++) { if (d1->Entry[i].EntityType == SAHPI_ENT_ROOT && d2->Entry[i].EntityType == SAHPI_ENT_ROOT) { return 1; } if ( cmp_entity(&d1->Entry[i], &d2->Entry[i]) == 0 ) return 0; } return 1; } static int cmp_name( SaHpiNameT *d1, SaHpiNameT *d2 ) { if ( d1->Length != d2->Length ) return 0; if ( memcmp(&d1->Value, &d2->Value, SA_HPI_MAX_NAME_LENGTH) != 0 ) return 0; return 1; } static int cmp_condition( SaHpiConditionT *d1, SaHpiConditionT *d2 ) { if ( d1->Type != d2->Type ) return 0; if ( !cmp_entitypath( &d1->Entity, &d2->Entity ) ) return 0; if ( d1->DomainId != d2->DomainId ) return 0; if ( d1->ResourceId != d2->ResourceId ) return 0; if ( d1->SensorNum != d2->SensorNum ) return 0; if ( d1->SensorNum != d2->SensorNum ) return 0; if ( d1->EventState != d2->EventState ) return 0; if ( !cmp_name( &d1->Name, &d2->Name ) ) return 0; if ( d1->Mid != d2->Mid ) return 0; if ( !cmp_text_buffer( &d1->Data, &d2->Data ) ) return 0; return 1; } static int cmp_alarm( SaHpiAlarmT *d1, SaHpiAlarmT *d2 ) { if ( d1->AlarmId != d2->AlarmId ) return 0; if ( d1->Timestamp != d2->Timestamp ) return 0; if ( d1->Severity != d2->Severity ) return 0; if ( d1->Acknowledged != d2->Acknowledged ) return 0; if ( !cmp_condition( &d1->AlarmCond, &d2->AlarmCond ) ) return 0; return 1; } typedef struct { tUint8 m_pad1; SaHpiAlarmT m_v1; tUint8 m_pad2; SaHpiAlarmT m_v2; SaHpiAlarmT m_v3; tUint8 m_pad3; } cTest; cMarshalType StructElements[] = { dStructElement( cTest, m_pad1 , Marshal_Uint8Type ), dStructElement( cTest, m_v1 , SaHpiAlarmType ), dStructElement( cTest, m_pad2 , Marshal_Uint8Type ), dStructElement( cTest, m_v2 , SaHpiAlarmType ), dStructElement( cTest, m_v3 , SaHpiAlarmType ), dStructElement( cTest, m_pad3 , Marshal_Uint8Type ), dStructElementEnd() }; cMarshalType TestType = dStruct( cTest, StructElements ); int main( int argc, char *argv[] ) { cTest value = { .m_pad1 = 47, .m_v1.AlarmId = 1, .m_v1.Timestamp = 1000, .m_v1.Severity = 0, .m_v1.Acknowledged = TRUE, .m_v1.AlarmCond.Type = SAHPI_STATUS_COND_TYPE_SENSOR, .m_v1.AlarmCond.Entity.Entry[0].EntityType = SAHPI_ENT_SYSTEM_BOARD, .m_v1.AlarmCond.Entity.Entry[0].EntityLocation = 1, .m_v1.AlarmCond.Entity.Entry[1].EntityType = SAHPI_ENT_POWER_UNIT, .m_v1.AlarmCond.Entity.Entry[1].EntityLocation = 2, .m_v1.AlarmCond.Entity.Entry[2].EntityType = SAHPI_ENT_ROOT, .m_v1.AlarmCond.Entity.Entry[2].EntityLocation = 0, .m_v1.AlarmCond.DomainId = SAHPI_UNSPECIFIED_DOMAIN_ID, .m_v1.AlarmCond.ResourceId = 1, .m_v1.AlarmCond.SensorNum = 1, .m_v1.AlarmCond.EventState = SAHPI_ES_LOWER_MINOR, .m_v1.AlarmCond.Name.Length = 9, .m_v1.AlarmCond.Name.Value = "Next text", .m_v1.AlarmCond.Mid = 3, .m_v1.AlarmCond.Data.DataType = SAHPI_TL_TYPE_TEXT, .m_v1.AlarmCond.Data.Language = SAHPI_LANG_ENGLISH, .m_v1.AlarmCond.Data.DataLength = 3, .m_v1.AlarmCond.Data.Data = "AB", .m_pad2 = 48, .m_v2.AlarmId = 1, .m_v2.Timestamp = 1020, .m_v2.Severity = 1, .m_v2.Acknowledged = FALSE, .m_v2.AlarmCond.Type = SAHPI_STATUS_COND_TYPE_RESOURCE, .m_v2.AlarmCond.Entity.Entry[0].EntityType = SAHPI_ENT_SUB_CHASSIS, .m_v2.AlarmCond.Entity.Entry[0].EntityLocation = 1, .m_v2.AlarmCond.Entity.Entry[1].EntityType = SAHPI_ENT_SYSTEM_BUS, .m_v2.AlarmCond.Entity.Entry[1].EntityLocation = 2, .m_v2.AlarmCond.Entity.Entry[2].EntityType = SAHPI_ENT_COOLING_DEVICE, .m_v2.AlarmCond.Entity.Entry[2].EntityLocation = 3, .m_v2.AlarmCond.Entity.Entry[3].EntityType = SAHPI_ENT_ROOT, .m_v2.AlarmCond.Entity.Entry[3].EntityLocation = 0, .m_v2.AlarmCond.DomainId = SAHPI_UNSPECIFIED_DOMAIN_ID, .m_v2.AlarmCond.ResourceId = 2, .m_v2.AlarmCond.SensorNum = 4, .m_v2.AlarmCond.EventState = SAHPI_ES_LOWER_CRIT, .m_v2.AlarmCond.Name.Length = 9, .m_v2.AlarmCond.Name.Value = "Next text", .m_v2.AlarmCond.Mid = 3, .m_v2.AlarmCond.Data.DataType = SAHPI_TL_TYPE_TEXT, .m_v2.AlarmCond.Data.Language = SAHPI_LANG_ENGLISH, .m_v2.AlarmCond.Data.DataLength = 3, .m_v2.AlarmCond.Data.Data = "AB", .m_v3.AlarmId = 1, .m_v3.Timestamp = 1040, .m_v3.Severity = 2, .m_v3.Acknowledged = TRUE, .m_v3.AlarmCond.Type = SAHPI_STATUS_COND_TYPE_OEM, .m_v3.AlarmCond.Entity.Entry[0].EntityType = SAHPI_ENT_PROCESSOR, .m_v3.AlarmCond.Entity.Entry[0].EntityLocation = 1, .m_v3.AlarmCond.Entity.Entry[1].EntityType = SAHPI_ENT_ROOT, .m_v3.AlarmCond.Entity.Entry[1].EntityLocation = 0, .m_v3.AlarmCond.DomainId = SAHPI_UNSPECIFIED_DOMAIN_ID, .m_v3.AlarmCond.ResourceId = 3, .m_v3.AlarmCond.SensorNum = 5, .m_v3.AlarmCond.EventState = SAHPI_ES_UPPER_MAJOR, .m_v3.AlarmCond.Name.Length = 9, .m_v3.AlarmCond.Name.Value = "Next text", .m_v3.AlarmCond.Mid = 3, .m_v3.AlarmCond.Data.DataType = SAHPI_TL_TYPE_BINARY, .m_v3.AlarmCond.Data.Language = SAHPI_LANG_ENGLISH, .m_v3.AlarmCond.Data.DataLength = 3, .m_v3.AlarmCond.Data.Data = "AB", .m_pad3 = 49 }; unsigned char *buffer = (unsigned char *)malloc(sizeof(value)); cTest result; unsigned int s1 = Marshal( &TestType, &value, buffer ); unsigned int s2 = Demarshal( MarshalByteOrder(), &TestType, &result, buffer ); if ( s1 != s2 ) return 1; if ( value.m_pad1 != result.m_pad1 ) return 1; if ( !cmp_alarm( &value.m_v1, &result.m_v1 ) ) return 1; if ( value.m_pad2 != result.m_pad2 ) return 1; if ( !cmp_alarm( &value.m_v2, &result.m_v2 ) ) return 1; if ( !cmp_alarm( &value.m_v3, &result.m_v3 ) ) return 1; if ( value.m_pad3 != result.m_pad3 ) return 1; return 0; } openhpi-2.14.1/marshal/t/marshal_025.c0000644000076400007640000000663311302567035014256 0ustar /* * Copyright (c) 2004 by FORCE Computers. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Thomas Kanngieser */ #include "marshal.h" #include #define dModU8 0 #define dModU16 1 #define dModU32 2 #define dModU64 3 #define dModI8 4 #define dModI16 5 #define dModI32 6 #define dModI64 7 #define dModF32 8 #define dModF64 9 typedef union { tUint8 m_u8; tUint16 m_u16; tUint32 m_u32; tUint64 m_u64; tInt8 m_i8; tInt16 m_i16; tInt32 m_i32; tInt64 m_i64; tFloat32 m_f32; tFloat64 m_f64; } cUnion; typedef struct { tUint8 m_pad1; tUint8 m_mod; tUint8 m_pad2; cUnion m_union; tUint8 m_pad3; } cTest; cMarshalType UnionElements[] = { dUnionElement( dModU8 , Marshal_Uint8Type ), dUnionElement( dModU16, Marshal_Uint16Type ), dUnionElement( dModU32, Marshal_Uint32Type ), dUnionElement( dModU64, Marshal_Uint64Type ), dUnionElement( dModI8 , Marshal_Int8Type ), dUnionElement( dModI16, Marshal_Int16Type ), dUnionElement( dModI32, Marshal_Int32Type ), dUnionElement( dModI64, Marshal_Int64Type ), dUnionElement( dModF32, Marshal_Float32Type ), dUnionElement( dModF64, Marshal_Float64Type ), dUnionElementEnd() }; cMarshalType TestUnionType = dUnion( 1, cUnion, UnionElements ); cMarshalType StructElements[] = { dStructElement( cTest, m_pad1 , Marshal_Uint8Type ), dStructElement( cTest, m_mod , Marshal_Uint8Type ), dStructElement( cTest, m_pad2 , Marshal_Uint8Type ), dStructElement( cTest, m_union, TestUnionType ), dStructElement( cTest, m_pad3 , Marshal_Uint8Type ), dStructElementEnd() }; cMarshalType TestType = dStruct( cTest, StructElements ); static int CheckValue( cTest *v, cTest *r ) { unsigned char buffer[256]; unsigned int s1 = Marshal( &TestType, v, buffer ); unsigned int s2 = Demarshal( MarshalByteOrder(), &TestType, r, buffer ); if ( s1 != s2 ) return 1; if ( v->m_pad1 != r->m_pad1 ) return 1; if ( v->m_mod != r->m_mod ) return 1; if ( v->m_pad2 != r->m_pad2 ) return 1; if ( v->m_pad3 != r->m_pad3 ) return 1; return 0; } int main( int argc, char *argv[] ) { cTest value = { .m_pad1 = 47, .m_mod = 43, // unknown .m_pad2 = 48, .m_union.m_u64 = 0xabcd123456780123LL, .m_pad3 = 49 }; cTest result; // Uint8 value.m_mod = dModU8; value.m_union.m_u8 = 0x43; if ( CheckValue( &value, &result ) ) return 1; if ( value.m_union.m_u8 != result.m_union.m_u8 ) return 1; // Uint16 value.m_mod = dModU16; value.m_union.m_u16 = 0x1234; if ( CheckValue( &value, &result ) ) return 1; if ( value.m_union.m_u16 != result.m_union.m_u16 ) return 1; // Uint32 value.m_mod = dModU32; value.m_union.m_u32 = 0x23458765; if ( CheckValue( &value, &result ) ) return 1; if ( value.m_union.m_u32 != result.m_union.m_u32 ) return 1; // Uint64 value.m_mod = dModU64; value.m_union.m_u64 = 0x1234567823453456LL; if ( CheckValue( &value, &result ) ) return 1; if ( value.m_union.m_u64 != result.m_union.m_u64 ) return 1; return 0; } openhpi-2.14.1/marshal/t/marshal_hpi_types_043.c0000644000076400007640000002204611302567035016336 0ustar /* * Copyright (c) 2005 by IBM Corporation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * W. David Ashley */ #include "marshal_hpi_types.h" #include #include #include static int cmp_resourceinfo( SaHpiResourceInfoT *d1, SaHpiResourceInfoT *d2 ) { int i; if ( d1->ResourceRev != d2->ResourceRev ) return 0; if ( d1->SpecificVer != d2->SpecificVer ) return 0; if ( d1->DeviceSupport != d2->DeviceSupport ) return 0; if ( d1->ManufacturerId != d2->ManufacturerId ) return 0; if ( d1->ProductId != d2->ProductId ) return 0; if ( d1->FirmwareMajorRev != d2->FirmwareMajorRev ) return 0; if ( d1->FirmwareMinorRev != d2->FirmwareMinorRev ) return 0; if ( d1->AuxFirmwareRev != d2->AuxFirmwareRev ) return 0; for (i = 0; i < 16; i++) { if ( d1->Guid[i] != d2->Guid[i] ) return 0; } return 1; } static int cmp_entities( SaHpiEntityT *d1, SaHpiEntityT *d2 ) { if ( d1->EntityType != d2->EntityType ) return 0; if ( d1->EntityLocation != d2->EntityLocation ) return 0; return 1; } static int cmp_text_buffer( SaHpiTextBufferT *d1, SaHpiTextBufferT *d2 ) { if ( d1->DataType != d2->DataType ) return 0; if ( d1->Language != d2->Language ) return 0; if ( d1->DataLength != d2->DataLength ) return 0; return memcmp( d1->Data, d2->Data, d1->DataLength ) ? 0 : 1; } static int cmp_rptentry( SaHpiRptEntryT *d1, SaHpiRptEntryT *d2 ) { if ( d1->EntryId != d2->EntryId ) return 0; if ( d1->ResourceId != d2->ResourceId ) return 0; if ( !cmp_resourceinfo( &d1->ResourceInfo, &d2->ResourceInfo ) ) return 0; /* entity path is not compared here */ if ( d1->ResourceCapabilities != d2->ResourceCapabilities ) return 0; if ( d1->HotSwapCapabilities != d2->HotSwapCapabilities ) return 0; if ( d1->ResourceSeverity != d2->ResourceSeverity ) return 0; if ( d1->ResourceFailed != d2->ResourceFailed ) return 0; if ( !cmp_text_buffer( &d1->ResourceTag, &d2->ResourceTag ) ) return 0; return 1; } typedef struct { tUint8 m_pad1; SaHpiRptEntryT m_v1; tUint8 m_pad2; SaHpiRptEntryT m_v2; SaHpiRptEntryT m_v3; tUint8 m_pad3; } cTest; cMarshalType StructElements[] = { dStructElement( cTest, m_pad1 , Marshal_Uint8Type ), dStructElement( cTest, m_v1 , SaHpiRptEntryType ), dStructElement( cTest, m_pad2 , Marshal_Uint8Type ), dStructElement( cTest, m_v2 , SaHpiRptEntryType ), dStructElement( cTest, m_v3 , SaHpiRptEntryType ), dStructElement( cTest, m_pad3 , Marshal_Uint8Type ), dStructElementEnd() }; cMarshalType TestType = dStruct( cTest, StructElements ); int main( int argc, char *argv[] ) { cTest value = { .m_pad1 = 47, .m_v1.EntryId = 1, .m_v1.ResourceId = 1, .m_v1.ResourceInfo.ResourceRev = 1, .m_v1.ResourceInfo.SpecificVer = 1, .m_v1.ResourceInfo.DeviceSupport = 0, .m_v1.ResourceInfo.ManufacturerId = 10, .m_v1.ResourceInfo.ProductId = 10, .m_v1.ResourceInfo.FirmwareMajorRev = 3, .m_v1.ResourceInfo.FirmwareMinorRev = 3, .m_v1.ResourceInfo.AuxFirmwareRev = 0, .m_v1.ResourceInfo.Guid = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15}, .m_v1.ResourceEntity.Entry[0].EntityType = SAHPI_ENT_SYSTEM_BOARD, .m_v1.ResourceEntity.Entry[0].EntityLocation = 1, .m_v1.ResourceEntity.Entry[1].EntityType = SAHPI_ENT_BATTERY, .m_v1.ResourceEntity.Entry[1].EntityLocation = 2, .m_v1.ResourceCapabilities = 1, .m_v1.HotSwapCapabilities = 1, .m_v1.ResourceSeverity = 1, .m_v1.ResourceFailed = TRUE, .m_v1.ResourceTag.DataType = SAHPI_TL_TYPE_BINARY, .m_v1.ResourceTag.Language = SAHPI_LANG_TSONGA, .m_v1.ResourceTag.DataLength = 3, .m_v1.ResourceTag.Data = "AB", .m_pad2 = 48, .m_v2.EntryId = 2, .m_v2.ResourceId = 2, .m_v2.ResourceInfo.ResourceRev = 1, .m_v2.ResourceInfo.SpecificVer = 1, .m_v2.ResourceInfo.DeviceSupport = 0, .m_v2.ResourceInfo.ManufacturerId = 10, .m_v2.ResourceInfo.ProductId = 10, .m_v2.ResourceInfo.FirmwareMajorRev = 3, .m_v2.ResourceInfo.FirmwareMinorRev = 3, .m_v2.ResourceInfo.AuxFirmwareRev = 0, .m_v2.ResourceInfo.Guid = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15}, .m_v2.ResourceEntity.Entry[0].EntityType = SAHPI_ENT_POWER_MODULE, .m_v2.ResourceEntity.Entry[0].EntityLocation = 2, .m_v2.ResourceEntity.Entry[1].EntityType = SAHPI_ENT_SYSTEM_BUS, .m_v2.ResourceEntity.Entry[1].EntityLocation = 3, .m_v2.ResourceCapabilities = 1, .m_v2.HotSwapCapabilities = 1, .m_v2.ResourceSeverity = 1, .m_v2.ResourceFailed = FALSE, .m_v2.ResourceTag.DataType = SAHPI_TL_TYPE_BCDPLUS, .m_v2.ResourceTag.Language = SAHPI_LANG_SANGRO, .m_v2.ResourceTag.DataLength = 21, .m_v2.ResourceTag.Data = "12345678901234567890", .m_v3.EntryId = 3, .m_v3.ResourceId = 3, .m_v3.ResourceInfo.ResourceRev = 1, .m_v3.ResourceInfo.SpecificVer = 1, .m_v3.ResourceInfo.DeviceSupport = 0, .m_v3.ResourceInfo.ManufacturerId = 10, .m_v3.ResourceInfo.ProductId = 10, .m_v3.ResourceInfo.FirmwareMajorRev = 3, .m_v3.ResourceInfo.FirmwareMinorRev = 3, .m_v3.ResourceInfo.AuxFirmwareRev = 0, .m_v3.ResourceInfo.Guid = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15}, .m_v3.ResourceEntity.Entry[0].EntityType = SAHPI_ENT_SWITCH, .m_v3.ResourceEntity.Entry[0].EntityLocation = 3, .m_v3.ResourceEntity.Entry[1].EntityType = SAHPI_ENT_SYSTEM_BLADE, .m_v3.ResourceEntity.Entry[1].EntityLocation = 4, .m_v3.ResourceEntity.Entry[2].EntityType = SAHPI_ENT_RACK_MOUNTED_SERVER, .m_v3.ResourceEntity.Entry[2].EntityLocation = 5, .m_v3.ResourceCapabilities = 1, .m_v3.HotSwapCapabilities = 1, .m_v3.ResourceSeverity = 1, .m_v3.ResourceFailed = FALSE, .m_v3.ResourceTag.DataType = SAHPI_TL_TYPE_ASCII6, .m_v3.ResourceTag.Language = SAHPI_LANG_TAJIK, .m_v3.ResourceTag.DataLength = 0, .m_v3.ResourceTag.Data = "", .m_pad3 = 49 }; unsigned char *buffer = (unsigned char *)malloc(sizeof(value)); cTest result; unsigned int s1 = Marshal( &TestType, &value, buffer ); unsigned int s2 = Demarshal( MarshalByteOrder(), &TestType, &result, buffer ); if ( s1 != s2 ) return 1; if ( value.m_pad1 != result.m_pad1 ) return 1; if ( !cmp_rptentry( &value.m_v1, &result.m_v1 ) ) return 1; if ( !cmp_entities( &value.m_v1.ResourceEntity.Entry[0], &result.m_v1.ResourceEntity.Entry[0] ) ) return 1; if ( !cmp_entities( &value.m_v1.ResourceEntity.Entry[1], &result.m_v1.ResourceEntity.Entry[1] ) ) return 1; if ( value.m_pad2 != result.m_pad2 ) return 1; if ( !cmp_rptentry( &value.m_v2, &result.m_v2 ) ) return 1; if ( !cmp_entities( &value.m_v2.ResourceEntity.Entry[0], &result.m_v2.ResourceEntity.Entry[0] ) ) return 1; if ( !cmp_entities( &value.m_v2.ResourceEntity.Entry[1], &result.m_v2.ResourceEntity.Entry[1] ) ) return 1; if ( !cmp_rptentry( &value.m_v3, &result.m_v3 ) ) return 1; if ( !cmp_entities( &value.m_v3.ResourceEntity.Entry[0], &result.m_v3.ResourceEntity.Entry[0] ) ) return 1; if ( !cmp_entities( &value.m_v3.ResourceEntity.Entry[1], &result.m_v3.ResourceEntity.Entry[1] ) ) return 1; if ( !cmp_entities( &value.m_v3.ResourceEntity.Entry[2], &result.m_v3.ResourceEntity.Entry[2] ) ) return 1; if ( value.m_pad3 != result.m_pad3 ) return 1; return 0; } openhpi-2.14.1/marshal/t/marshal_hpi_types_030.c0000644000076400007640000000576411302567035016342 0ustar /* * Copyright (c) 2005 by IBM Corporation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * W. David Ashley */ #include "marshal_hpi_types.h" #include #include #include static int cmp_annunciatorrec( SaHpiAnnunciatorRecT *d1, SaHpiAnnunciatorRecT *d2 ) { if ( d1->AnnunciatorNum != d2->AnnunciatorNum ) return 0; if ( d1->AnnunciatorType != d2->AnnunciatorType ) return 0; if ( d1->ModeReadOnly != d2->ModeReadOnly ) return 0; if ( d1->MaxConditions != d2->MaxConditions ) return 0; if ( d1->Oem != d2->Oem ) return 0; return 1; } typedef struct { tUint8 m_pad1; SaHpiAnnunciatorRecT m_v1; tUint8 m_pad2; SaHpiAnnunciatorRecT m_v2; SaHpiAnnunciatorRecT m_v3; tUint8 m_pad3; } cTest; cMarshalType StructElements[] = { dStructElement( cTest, m_pad1 , Marshal_Uint8Type ), dStructElement( cTest, m_v1 , SaHpiAnnunciatorRecType ), dStructElement( cTest, m_pad2 , Marshal_Uint8Type ), dStructElement( cTest, m_v2 , SaHpiAnnunciatorRecType ), dStructElement( cTest, m_v3 , SaHpiAnnunciatorRecType ), dStructElement( cTest, m_pad3 , Marshal_Uint8Type ), dStructElementEnd() }; cMarshalType TestType = dStruct( cTest, StructElements ); int main( int argc, char *argv[] ) { cTest value = { .m_pad1 = 47, .m_v1.AnnunciatorNum = 1, .m_v1.AnnunciatorType = SAHPI_ANNUNCIATOR_TYPE_LED, .m_v1.ModeReadOnly = FALSE, .m_v1.MaxConditions = 0, .m_v1.Oem = 0, .m_pad2 = 48, .m_v2.AnnunciatorNum = 2, .m_v2.AnnunciatorType = SAHPI_ANNUNCIATOR_TYPE_AUDIBLE, .m_v2.ModeReadOnly = TRUE, .m_v2.MaxConditions = 3, .m_v2.Oem = 1000, .m_v3.AnnunciatorNum = 100, .m_v3.AnnunciatorType = SAHPI_ANNUNCIATOR_TYPE_MESSAGE, .m_v3.ModeReadOnly = FALSE, .m_v3.MaxConditions = 10, .m_v3.Oem = 20, .m_pad3 = 49 }; unsigned char *buffer = (unsigned char *)malloc(sizeof(value)); cTest result; unsigned int s1 = Marshal( &TestType, &value, buffer ); unsigned int s2 = Demarshal( MarshalByteOrder(), &TestType, &result, buffer ); if ( s1 != s2 ) return 1; if ( value.m_pad1 != result.m_pad1 ) return 1; if ( !cmp_annunciatorrec( &value.m_v1, &result.m_v1 ) ) return 1; if ( value.m_pad2 != result.m_pad2 ) return 1; if ( !cmp_annunciatorrec( &value.m_v2, &result.m_v2 ) ) return 1; if ( !cmp_annunciatorrec( &value.m_v3, &result.m_v3 ) ) return 1; if ( value.m_pad3 != result.m_pad3 ) return 1; return 0; } openhpi-2.14.1/marshal/t/marshal_hpi_types_029.c0000644000076400007640000002115111302567035016336 0ustar /* * Copyright (c) 2005 by IBM Corporation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * W. David Ashley */ #include "marshal_hpi_types.h" #include #include #include static int cmp_text_buffer( SaHpiTextBufferT *d1, SaHpiTextBufferT *d2 ) { if ( d1->DataType != d2->DataType ) return 0; if ( d1->Language != d2->Language ) return 0; if ( d1->DataLength != d2->DataLength ) return 0; return memcmp( d1->Data, d2->Data, d1->DataLength ) ? 0 : 1; } static int cmp_entity( SaHpiEntityT *d1, SaHpiEntityT *d2 ) { if ( d1->EntityType != d2->EntityType ) return 0; if ( d1->EntityLocation != d2->EntityLocation ) return 0; return 1; } static int cmp_entitypath( SaHpiEntityPathT *d1, SaHpiEntityPathT *d2 ) { int i; for (i = 0; ; i++) { if (d1->Entry[i].EntityType == SAHPI_ENT_ROOT && d2->Entry[i].EntityType == SAHPI_ENT_ROOT) { return 1; } if ( cmp_entity(&d1->Entry[i], &d2->Entry[i]) == 0 ) return 0; } return 1; } static int cmp_name( SaHpiNameT *d1, SaHpiNameT *d2 ) { if ( d1->Length != d2->Length ) return 0; if ( memcmp(&d1->Value, &d2->Value, SA_HPI_MAX_NAME_LENGTH) != 0 ) return 0; return 1; } static int cmp_condition( SaHpiConditionT *d1, SaHpiConditionT *d2 ) { if ( d1->Type != d2->Type ) return 0; if ( !cmp_entitypath( &d1->Entity, &d2->Entity ) ) return 0; if ( d1->DomainId != d2->DomainId ) return 0; if ( d1->ResourceId != d2->ResourceId ) return 0; if ( d1->SensorNum != d2->SensorNum ) return 0; if ( d1->SensorNum != d2->SensorNum ) return 0; if ( d1->EventState != d2->EventState ) return 0; if ( !cmp_name( &d1->Name, &d2->Name ) ) return 0; if ( d1->Mid != d2->Mid ) return 0; if ( !cmp_text_buffer( &d1->Data, &d2->Data ) ) return 0; return 1; } static int cmp_announcement( SaHpiAnnouncementT *d1, SaHpiAnnouncementT *d2 ) { if ( d1->EntryId != d2->EntryId ) return 0; if ( d1->Timestamp != d2->Timestamp ) return 0; if ( d1->AddedByUser != d2->AddedByUser ) return 0; if ( d1->Severity != d2->Severity ) return 0; if ( d1->Acknowledged != d2->Acknowledged ) return 0; if ( !cmp_condition( &d1->StatusCond, &d2->StatusCond ) ) return 0; return 1; } typedef struct { tUint8 m_pad1; SaHpiAnnouncementT m_v1; tUint8 m_pad2; SaHpiAnnouncementT m_v2; SaHpiAnnouncementT m_v3; tUint8 m_pad3; } cTest; cMarshalType StructElements[] = { dStructElement( cTest, m_pad1 , Marshal_Uint8Type ), dStructElement( cTest, m_v1 , SaHpiAnnouncementType ), dStructElement( cTest, m_pad2 , Marshal_Uint8Type ), dStructElement( cTest, m_v2 , SaHpiAnnouncementType ), dStructElement( cTest, m_v3 , SaHpiAnnouncementType ), dStructElement( cTest, m_pad3 , Marshal_Uint8Type ), dStructElementEnd() }; cMarshalType TestType = dStruct( cTest, StructElements ); int main( int argc, char *argv[] ) { cTest value = { .m_pad1 = 47, .m_v1.EntryId = 1, .m_v1.Timestamp = 1000, .m_v1.AddedByUser = FALSE, .m_v1.Severity = SAHPI_CRITICAL, .m_v1.Acknowledged = FALSE, .m_v1.StatusCond.Type = SAHPI_STATUS_COND_TYPE_SENSOR, .m_v1.StatusCond.Entity.Entry[0].EntityType = SAHPI_ENT_SYSTEM_BOARD, .m_v1.StatusCond.Entity.Entry[0].EntityLocation = 1, .m_v1.StatusCond.Entity.Entry[1].EntityType = SAHPI_ENT_POWER_UNIT, .m_v1.StatusCond.Entity.Entry[1].EntityLocation = 2, .m_v1.StatusCond.Entity.Entry[2].EntityType = SAHPI_ENT_ROOT, .m_v1.StatusCond.Entity.Entry[2].EntityLocation = 0, .m_v1.StatusCond.DomainId = SAHPI_UNSPECIFIED_DOMAIN_ID, .m_v1.StatusCond.ResourceId = 1, .m_v1.StatusCond.SensorNum = 1, .m_v1.StatusCond.EventState = SAHPI_ES_LOWER_MINOR, .m_v1.StatusCond.Name.Length = 9, .m_v1.StatusCond.Name.Value = "Next text", .m_v1.StatusCond.Mid = 3, .m_v1.StatusCond.Data.DataType = SAHPI_TL_TYPE_TEXT, .m_v1.StatusCond.Data.Language = SAHPI_LANG_ENGLISH, .m_v1.StatusCond.Data.DataLength = 3, .m_v1.StatusCond.Data.Data = "AB", .m_pad2 = 48, .m_v2.EntryId = 10, .m_v2.Timestamp = 2000, .m_v2.AddedByUser = TRUE, .m_v2.Severity = SAHPI_OK, .m_v2.Acknowledged = FALSE, .m_v2.StatusCond.Type = SAHPI_STATUS_COND_TYPE_RESOURCE, .m_v2.StatusCond.Entity.Entry[0].EntityType = SAHPI_ENT_SUB_CHASSIS, .m_v2.StatusCond.Entity.Entry[0].EntityLocation = 1, .m_v2.StatusCond.Entity.Entry[1].EntityType = SAHPI_ENT_SYSTEM_BUS, .m_v2.StatusCond.Entity.Entry[1].EntityLocation = 2, .m_v2.StatusCond.Entity.Entry[2].EntityType = SAHPI_ENT_COOLING_DEVICE, .m_v2.StatusCond.Entity.Entry[2].EntityLocation = 3, .m_v2.StatusCond.Entity.Entry[3].EntityType = SAHPI_ENT_ROOT, .m_v2.StatusCond.Entity.Entry[3].EntityLocation = 0, .m_v2.StatusCond.DomainId = SAHPI_UNSPECIFIED_DOMAIN_ID, .m_v2.StatusCond.ResourceId = 2, .m_v2.StatusCond.SensorNum = 4, .m_v2.StatusCond.EventState = SAHPI_ES_LOWER_CRIT, .m_v2.StatusCond.Name.Length = 9, .m_v2.StatusCond.Name.Value = "Next text", .m_v2.StatusCond.Mid = 3, .m_v2.StatusCond.Data.DataType = SAHPI_TL_TYPE_TEXT, .m_v2.StatusCond.Data.Language = SAHPI_LANG_ENGLISH, .m_v2.StatusCond.Data.DataLength = 3, .m_v2.StatusCond.Data.Data = "AB", .m_v3.EntryId = 11, .m_v3.Timestamp = 3000, .m_v3.AddedByUser = FALSE, .m_v3.Severity = SAHPI_MAJOR, .m_v3.Acknowledged = TRUE, .m_v3.StatusCond.Type = SAHPI_STATUS_COND_TYPE_OEM, .m_v3.StatusCond.Entity.Entry[0].EntityType = SAHPI_ENT_PROCESSOR, .m_v3.StatusCond.Entity.Entry[0].EntityLocation = 1, .m_v3.StatusCond.Entity.Entry[1].EntityType = SAHPI_ENT_ROOT, .m_v3.StatusCond.Entity.Entry[1].EntityLocation = 0, .m_v3.StatusCond.DomainId = SAHPI_UNSPECIFIED_DOMAIN_ID, .m_v3.StatusCond.ResourceId = 3, .m_v3.StatusCond.SensorNum = 5, .m_v3.StatusCond.EventState = SAHPI_ES_UPPER_MAJOR, .m_v3.StatusCond.Name.Length = 9, .m_v3.StatusCond.Name.Value = "Next text", .m_v3.StatusCond.Mid = 3, .m_v3.StatusCond.Data.DataType = SAHPI_TL_TYPE_BINARY, .m_v3.StatusCond.Data.Language = SAHPI_LANG_ENGLISH, .m_v3.StatusCond.Data.DataLength = 3, .m_v3.StatusCond.Data.Data = "AB", .m_pad3 = 49 }; unsigned char *buffer = (unsigned char *)malloc(sizeof(value)); cTest result; unsigned int s1 = Marshal( &TestType, &value, buffer ); unsigned int s2 = Demarshal( MarshalByteOrder(), &TestType, &result, buffer ); if ( s1 != s2 ) return 1; if ( value.m_pad1 != result.m_pad1 ) return 1; if ( !cmp_announcement( &value.m_v1, &result.m_v1 ) ) return 1; if ( value.m_pad2 != result.m_pad2 ) return 1; if ( !cmp_announcement( &value.m_v2, &result.m_v2 ) ) return 1; if ( !cmp_announcement( &value.m_v3, &result.m_v3 ) ) return 1; if ( value.m_pad3 != result.m_pad3 ) return 1; return 0; } openhpi-2.14.1/marshal/t/marshal_hpi_types_004.c0000644000076400007640000002113511302567035016331 0ustar /* * Copyright (c) 2005 by IBM Corporation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * W. David Ashley */ #include "marshal_hpi_types.h" #include #include #include static int cmp_sensorreading( SaHpiSensorReadingT *d1, SaHpiSensorReadingT *d2 ) { if ( d1->IsSupported != d2->IsSupported ) return 0; if ( d1->Type != d2->Type ) return 0; if ( d1->Value.SensorInt64 != d2->Value.SensorInt64 ) return 0; return 1; } typedef struct { tUint8 m_pad1; SaHpiSensorThresholdsT m_v1; tUint8 m_pad2; SaHpiSensorThresholdsT m_v2; SaHpiSensorThresholdsT m_v3; tUint8 m_pad3; } cTest; cMarshalType StructElements[] = { dStructElement( cTest, m_pad1 , Marshal_Uint8Type ), dStructElement( cTest, m_v1 , SaHpiSensorThresholdsType ), dStructElement( cTest, m_pad2 , Marshal_Uint8Type ), dStructElement( cTest, m_v2 , SaHpiSensorThresholdsType ), dStructElement( cTest, m_v3 , SaHpiSensorThresholdsType ), dStructElement( cTest, m_pad3 , Marshal_Uint8Type ), dStructElementEnd() }; cMarshalType TestType = dStruct( cTest, StructElements ); int main( int argc, char *argv[] ) { cTest value = { .m_pad1 = 47, .m_v1.LowCritical.IsSupported = TRUE, .m_v1.LowCritical.Type = SAHPI_SENSOR_READING_TYPE_INT64, .m_v1.LowCritical.Value = {-21}, .m_v1.LowMajor.IsSupported = TRUE, .m_v1.LowMajor.Type = SAHPI_SENSOR_READING_TYPE_INT64, .m_v1.LowMajor.Value = {-21}, .m_v1.LowMinor.IsSupported = TRUE, .m_v1.LowMinor.Type = SAHPI_SENSOR_READING_TYPE_INT64, .m_v1.LowMinor.Value = {-10}, .m_v1.UpCritical.IsSupported = TRUE, .m_v1.UpCritical.Type = SAHPI_SENSOR_READING_TYPE_INT64, .m_v1.UpCritical.Value = {21}, .m_v1.UpMajor.IsSupported = TRUE, .m_v1.UpMajor.Type = SAHPI_SENSOR_READING_TYPE_INT64, .m_v1.UpMajor.Value = {21}, .m_v1.UpMinor.IsSupported = TRUE, .m_v1.UpMinor.Type = SAHPI_SENSOR_READING_TYPE_INT64, .m_v1.UpMinor.Value = {10}, .m_v1.PosThdHysteresis.IsSupported = TRUE, .m_v1.PosThdHysteresis.Type = SAHPI_SENSOR_READING_TYPE_INT64, .m_v1.PosThdHysteresis.Value = {5}, .m_v1.NegThdHysteresis.IsSupported = TRUE, .m_v1.NegThdHysteresis.Type = SAHPI_SENSOR_READING_TYPE_INT64, .m_v1.NegThdHysteresis.Value = {-5}, .m_pad2 = 48, .m_v2.LowCritical.IsSupported = TRUE, .m_v2.LowCritical.Type = SAHPI_SENSOR_READING_TYPE_INT64, .m_v2.LowCritical.Value = {-21}, .m_v2.LowMajor.IsSupported = FALSE, .m_v2.LowMajor.Type = SAHPI_SENSOR_READING_TYPE_INT64, .m_v2.LowMajor.Value = {-21}, .m_v2.LowMinor.IsSupported = TRUE, .m_v2.LowMinor.Type = SAHPI_SENSOR_READING_TYPE_INT64, .m_v2.LowMinor.Value = {-10}, .m_v2.UpCritical.IsSupported = TRUE, .m_v2.UpCritical.Type = SAHPI_SENSOR_READING_TYPE_INT64, .m_v2.UpCritical.Value = {21}, .m_v2.UpMajor.IsSupported = FALSE, .m_v2.UpMajor.Type = SAHPI_SENSOR_READING_TYPE_INT64, .m_v2.UpMajor.Value = {21}, .m_v2.UpMinor.IsSupported = TRUE, .m_v2.UpMinor.Type = SAHPI_SENSOR_READING_TYPE_INT64, .m_v2.UpMinor.Value = {10}, .m_v2.PosThdHysteresis.IsSupported = TRUE, .m_v2.PosThdHysteresis.Type = SAHPI_SENSOR_READING_TYPE_INT64, .m_v2.PosThdHysteresis.Value = {5}, .m_v2.NegThdHysteresis.IsSupported = TRUE, .m_v2.NegThdHysteresis.Type = SAHPI_SENSOR_READING_TYPE_INT64, .m_v2.NegThdHysteresis.Value = {-5}, .m_v3.LowCritical.IsSupported = TRUE, .m_v3.LowCritical.Type = SAHPI_SENSOR_READING_TYPE_INT64, .m_v3.LowCritical.Value = {-21}, .m_v3.LowMajor.IsSupported = TRUE, .m_v3.LowMajor.Type = SAHPI_SENSOR_READING_TYPE_INT64, .m_v3.LowMajor.Value = {-21}, .m_v3.LowMinor.IsSupported = TRUE, .m_v3.LowMinor.Type = SAHPI_SENSOR_READING_TYPE_INT64, .m_v3.LowMinor.Value = {-10}, .m_v3.UpCritical.IsSupported = TRUE, .m_v3.UpCritical.Type = SAHPI_SENSOR_READING_TYPE_INT64, .m_v3.UpCritical.Value = {21}, .m_v3.UpMajor.IsSupported = TRUE, .m_v3.UpMajor.Type = SAHPI_SENSOR_READING_TYPE_INT64, .m_v3.UpMajor.Value = {21}, .m_v3.UpMinor.IsSupported = TRUE, .m_v3.UpMinor.Type = SAHPI_SENSOR_READING_TYPE_INT64, .m_v3.UpMinor.Value = {10}, .m_v3.PosThdHysteresis.IsSupported = FALSE, .m_v3.PosThdHysteresis.Type = SAHPI_SENSOR_READING_TYPE_INT64, .m_v3.PosThdHysteresis.Value = {5}, .m_v3.NegThdHysteresis.IsSupported = FALSE, .m_v3.NegThdHysteresis.Type = SAHPI_SENSOR_READING_TYPE_INT64, .m_v3.NegThdHysteresis.Value = {-5}, .m_pad3 = 49 }; unsigned char *buffer = (unsigned char *)malloc(sizeof(value)); cTest result; unsigned int s1 = Marshal( &TestType, &value, buffer ); unsigned int s2 = Demarshal( MarshalByteOrder(), &TestType, &result, buffer ); if ( s1 != s2 ) return 1; if ( value.m_pad1 != result.m_pad1 ) return 1; if ( !cmp_sensorreading( &value.m_v1.LowCritical, &result.m_v1.LowCritical ) ) return 1; if ( !cmp_sensorreading( &value.m_v1.LowMajor, &result.m_v1.LowMajor ) ) return 1; if ( !cmp_sensorreading( &value.m_v1.LowMinor, &result.m_v1.LowMinor ) ) return 1; if ( !cmp_sensorreading( &value.m_v1.UpCritical, &result.m_v1.UpCritical ) ) return 1; if ( !cmp_sensorreading( &value.m_v1.UpMajor, &result.m_v1.UpMajor ) ) return 1; if ( !cmp_sensorreading( &value.m_v1.UpMinor, &result.m_v1.UpMinor ) ) return 1; if ( !cmp_sensorreading( &value.m_v1.PosThdHysteresis, &result.m_v1.PosThdHysteresis ) ) return 1; if ( !cmp_sensorreading( &value.m_v1.NegThdHysteresis, &result.m_v1.NegThdHysteresis ) ) return 1; if ( value.m_pad2 != result.m_pad2 ) return 1; if ( !cmp_sensorreading( &value.m_v2.LowCritical, &result.m_v2.LowCritical ) ) return 1; if ( !cmp_sensorreading( &value.m_v2.LowMajor, &result.m_v2.LowMajor ) ) return 1; if ( !cmp_sensorreading( &value.m_v2.LowMinor, &result.m_v2.LowMinor ) ) return 1; if ( !cmp_sensorreading( &value.m_v2.UpCritical, &result.m_v2.UpCritical ) ) return 1; if ( !cmp_sensorreading( &value.m_v2.UpMajor, &result.m_v2.UpMajor ) ) return 1; if ( !cmp_sensorreading( &value.m_v2.UpMinor, &result.m_v2.UpMinor ) ) return 1; if ( !cmp_sensorreading( &value.m_v2.PosThdHysteresis, &result.m_v2.PosThdHysteresis ) ) return 1; if ( !cmp_sensorreading( &value.m_v2.NegThdHysteresis, &result.m_v2.NegThdHysteresis ) ) return 1; if ( !cmp_sensorreading( &value.m_v3.LowCritical, &result.m_v3.LowCritical ) ) return 1; if ( !cmp_sensorreading( &value.m_v3.LowMajor, &result.m_v3.LowMajor ) ) return 1; if ( !cmp_sensorreading( &value.m_v3.LowMinor, &result.m_v3.LowMinor ) ) return 1; if ( !cmp_sensorreading( &value.m_v3.UpCritical, &result.m_v3.UpCritical ) ) return 1; if ( !cmp_sensorreading( &value.m_v3.UpMajor, &result.m_v3.UpMajor ) ) return 1; if ( !cmp_sensorreading( &value.m_v3.UpMinor, &result.m_v3.UpMinor ) ) return 1; if ( !cmp_sensorreading( &value.m_v3.PosThdHysteresis, &result.m_v3.PosThdHysteresis ) ) return 1; if ( !cmp_sensorreading( &value.m_v3.NegThdHysteresis, &result.m_v3.NegThdHysteresis ) ) return 1; if ( value.m_pad3 != result.m_pad3 ) return 1; return 0; } openhpi-2.14.1/marshal/t/marshal_hpi_types_019.c0000644000076400007640000000500011302567035016330 0ustar /* * Copyright (c) 2005 by IBM Corporation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * W. David Ashley */ #include "marshal_hpi_types.h" #include #include #include static int cmp_ctrldefaultmode( SaHpiCtrlDefaultModeT *d1, SaHpiCtrlDefaultModeT *d2 ) { if ( d1->Mode != d2->Mode ) return 0; if ( d1->ReadOnly != d2->ReadOnly ) return 0; return 1; } typedef struct { tUint8 m_pad1; SaHpiCtrlDefaultModeT m_v1; tUint8 m_pad2; SaHpiCtrlDefaultModeT m_v2; SaHpiCtrlDefaultModeT m_v3; tUint8 m_pad3; } cTest; cMarshalType StructElements[] = { dStructElement( cTest, m_pad1 , Marshal_Uint8Type ), dStructElement( cTest, m_v1 , SaHpiCtrlDefaultModeType ), dStructElement( cTest, m_pad2 , Marshal_Uint8Type ), dStructElement( cTest, m_v2 , SaHpiCtrlDefaultModeType ), dStructElement( cTest, m_v3 , SaHpiCtrlDefaultModeType ), dStructElement( cTest, m_pad3 , Marshal_Uint8Type ), dStructElementEnd() }; cMarshalType TestType = dStruct( cTest, StructElements ); int main( int argc, char *argv[] ) { cTest value = { .m_pad1 = 47, .m_v1.Mode = SAHPI_CTRL_MODE_AUTO, .m_v1.ReadOnly = TRUE, .m_pad2 = 48, .m_v2.Mode = SAHPI_CTRL_MODE_AUTO, .m_v2.ReadOnly = FALSE, .m_v3.Mode = SAHPI_CTRL_MODE_MANUAL, .m_v3.ReadOnly = TRUE, .m_pad3 = 49 }; unsigned char *buffer = (unsigned char *)malloc(sizeof(value)); cTest result; unsigned int s1 = Marshal( &TestType, &value, buffer ); unsigned int s2 = Demarshal( MarshalByteOrder(), &TestType, &result, buffer ); if ( s1 != s2 ) return 1; if ( value.m_pad1 != result.m_pad1 ) return 1; if ( !cmp_ctrldefaultmode( &value.m_v1, &result.m_v1 ) ) return 1; if ( value.m_pad2 != result.m_pad2 ) return 1; if ( !cmp_ctrldefaultmode( &value.m_v2, &result.m_v2 ) ) return 1; if ( !cmp_ctrldefaultmode( &value.m_v3, &result.m_v3 ) ) return 1; if ( value.m_pad3 != result.m_pad3 ) return 1; return 0; } openhpi-2.14.1/marshal/t/marshal_014.c0000644000076400007640000000157011302567035014247 0ustar /* * Copyright (c) 2004 by FORCE Computers. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Thomas Kanngieser */ #include "marshal.h" #include int main( int argc, char *argv[] ) { tUint64 value = 0xfedc12345678abcdLL; tUint64 swap = GUINT64_SWAP_LE_BE( value ); tUint64 result; unsigned int s = Demarshal( MarshalByteOrder() ? 0 : 1, &Marshal_Uint64Type, &result, &swap ); if ( s != sizeof( tUint64 ) ) return 1; if ( value != result ) return 1; return 0; } openhpi-2.14.1/marshal/t/marshal_017.c0000644000076400007640000000155011302567035014250 0ustar /* * Copyright (c) 2004 by FORCE Computers. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Thomas Kanngieser */ #include "marshal.h" #include int main( int argc, char *argv[] ) { tInt32 value = 0x42aa1234; tInt32 swap = GUINT32_SWAP_LE_BE( value ); tInt32 result; unsigned int s = Demarshal( MarshalByteOrder() ? 0 : 1, &Marshal_Int32Type, &result, &swap ); if ( s != sizeof( tInt32 ) ) return 1; if ( value != result ) return 1; return 0; } openhpi-2.14.1/marshal/t/marshal_hpi_types_013.c0000644000076400007640000000441511302567035016333 0ustar /* * Copyright (c) 2005 by IBM Corporation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * W. David Ashley */ #include "marshal_hpi_types.h" #include #include #include static int cmp_ctrlrecdigital( SaHpiCtrlRecDigitalT *d1, SaHpiCtrlRecDigitalT *d2 ) { if ( d1->Default != d2->Default ) return 0; return 1; } typedef struct { tUint8 m_pad1; SaHpiCtrlRecDigitalT m_v1; tUint8 m_pad2; SaHpiCtrlRecDigitalT m_v2; SaHpiCtrlRecDigitalT m_v3; tUint8 m_pad3; } cTest; cMarshalType StructElements[] = { dStructElement( cTest, m_pad1 , Marshal_Uint8Type ), dStructElement( cTest, m_v1 , SaHpiCtrlRecDigitalType ), dStructElement( cTest, m_pad2 , Marshal_Uint8Type ), dStructElement( cTest, m_v2 , SaHpiCtrlRecDigitalType ), dStructElement( cTest, m_v3 , SaHpiCtrlRecDigitalType ), dStructElement( cTest, m_pad3 , Marshal_Uint8Type ), dStructElementEnd() }; cMarshalType TestType = dStruct( cTest, StructElements ); int main( int argc, char *argv[] ) { cTest value = { .m_pad1 = 47, .m_v1.Default = SAHPI_CTRL_STATE_OFF, .m_pad2 = 48, .m_v1.Default = SAHPI_CTRL_STATE_ON, .m_v1.Default = SAHPI_CTRL_STATE_PULSE_ON, .m_pad3 = 49 }; unsigned char *buffer = (unsigned char *)malloc(sizeof(value)); cTest result; unsigned int s1 = Marshal( &TestType, &value, buffer ); unsigned int s2 = Demarshal( MarshalByteOrder(), &TestType, &result, buffer ); if ( s1 != s2 ) return 1; if ( value.m_pad1 != result.m_pad1 ) return 1; if ( !cmp_ctrlrecdigital( &value.m_v1, &result.m_v1 ) ) return 1; if ( value.m_pad2 != result.m_pad2 ) return 1; if ( !cmp_ctrlrecdigital( &value.m_v2, &result.m_v2 ) ) return 1; if ( !cmp_ctrlrecdigital( &value.m_v3, &result.m_v3 ) ) return 1; if ( value.m_pad3 != result.m_pad3 ) return 1; return 0; } openhpi-2.14.1/marshal/t/marshal_hpi_types_035.c0000644000076400007640000001021511302567035016332 0ustar /* * Copyright (c) 2005 by IBM Corporation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * W. David Ashley */ #include "marshal_hpi_types.h" #include #include #include static int cmp_sensorenablechangeevent( SaHpiSensorEnableChangeEventT *d1, SaHpiSensorEnableChangeEventT *d2 ) { if ( d1->SensorNum != d2->SensorNum ) return 0; if ( d1->SensorType != d2->SensorType ) return 0; if ( d1->EventCategory != d2->EventCategory ) return 0; if ( d1->SensorEnable != d2->SensorEnable ) return 0; if ( d1->SensorEventEnable != d2->SensorEventEnable ) return 0; if ( d1->AssertEventMask != d2->AssertEventMask ) return 0; if ( d1->DeassertEventMask != d2->DeassertEventMask ) return 0; if ( d1->OptionalDataPresent != d2->OptionalDataPresent ) return 0; if ( d1->CurrentState != d2->CurrentState ) return 0; return 1; } typedef struct { tUint8 m_pad1; SaHpiSensorEnableChangeEventT m_v1; tUint8 m_pad2; SaHpiSensorEnableChangeEventT m_v2; SaHpiSensorEnableChangeEventT m_v3; tUint8 m_pad3; } cTest; cMarshalType StructElements[] = { dStructElement( cTest, m_pad1 , Marshal_Uint8Type ), dStructElement( cTest, m_v1 , SaHpiSensorEnableChangeEventType ), dStructElement( cTest, m_pad2 , Marshal_Uint8Type ), dStructElement( cTest, m_v2 , SaHpiSensorEnableChangeEventType ), dStructElement( cTest, m_v3 , SaHpiSensorEnableChangeEventType ), dStructElement( cTest, m_pad3 , Marshal_Uint8Type ), dStructElementEnd() }; cMarshalType TestType = dStruct( cTest, StructElements ); int main( int argc, char *argv[] ) { cTest value = { .m_pad1 = 47, .m_v1.SensorNum = 1, .m_v1.SensorType = SAHPI_TEMPERATURE, .m_v1.EventCategory = SAHPI_EC_THRESHOLD, .m_v1.SensorEnable = TRUE, .m_v1.SensorEventEnable = TRUE, .m_v1.AssertEventMask = 0, .m_v1.DeassertEventMask = 0, .m_v1.OptionalDataPresent = 1, .m_v1.CurrentState = SAHPI_ES_UPPER_MAJOR, .m_pad2 = 48, .m_v2.SensorNum = 2, .m_v2.SensorType = SAHPI_BATTERY, .m_v2.EventCategory = SAHPI_EC_THRESHOLD, .m_v2.SensorEnable = TRUE, .m_v2.SensorEventEnable = FALSE, .m_v2.AssertEventMask = 0, .m_v2.DeassertEventMask = 0, .m_v2.OptionalDataPresent = 1, .m_v2.CurrentState = SAHPI_ES_UPPER_MAJOR, .m_v3.SensorNum = 3, .m_v3.SensorType = SAHPI_VOLTAGE, .m_v3.EventCategory = SAHPI_EC_THRESHOLD, .m_v3.SensorEnable = FALSE, .m_v3.SensorEventEnable = TRUE, .m_v3.AssertEventMask = 1, .m_v3.DeassertEventMask = 1, .m_v3.OptionalDataPresent = 1, .m_v3.CurrentState = SAHPI_ES_UPPER_MAJOR, .m_pad3 = 49 }; unsigned char *buffer = (unsigned char *)malloc(sizeof(value)); cTest result; unsigned int s1 = Marshal( &TestType, &value, buffer ); unsigned int s2 = Demarshal( MarshalByteOrder(), &TestType, &result, buffer ); if ( s1 != s2 ) return 1; if ( value.m_pad1 != result.m_pad1 ) return 1; if ( !cmp_sensorenablechangeevent( &value.m_v1, &result.m_v1 ) ) return 1; if ( value.m_pad2 != result.m_pad2 ) return 1; if ( !cmp_sensorenablechangeevent( &value.m_v2, &result.m_v2 ) ) return 1; if ( !cmp_sensorenablechangeevent( &value.m_v3, &result.m_v3 ) ) return 1; if ( value.m_pad3 != result.m_pad3 ) return 1; return 0; } openhpi-2.14.1/marshal/t/marshal_hpi_types_021.c0000644000076400007640000000707711302567035016341 0ustar /* * Copyright (c) 2005 by IBM Corporation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * W. David Ashley */ #include "marshal_hpi_types.h" #include #include #include static int cmp_text_buffer( SaHpiTextBufferT *d1, SaHpiTextBufferT *d2 ) { if ( d1->DataType != d2->DataType ) return 0; if ( d1->Language != d2->Language ) return 0; if ( d1->DataLength != d2->DataLength ) return 0; return memcmp( d1->Data, d2->Data, d1->DataLength ) ? 0 : 1; } static int cmp_idrfield( SaHpiIdrFieldT *d1, SaHpiIdrFieldT *d2 ) { if ( d1->AreaId != d2->AreaId ) return 0; if ( d1->FieldId != d2->FieldId ) return 0; if ( d1->Type != d2->Type ) return 0; if ( d1->ReadOnly != d2->ReadOnly ) return 0; if ( !cmp_text_buffer( &d1->Field, &d2->Field ) ) return 0; return 1; } typedef struct { tUint8 m_pad1; SaHpiIdrFieldT m_v1; tUint8 m_pad2; SaHpiIdrFieldT m_v2; SaHpiIdrFieldT m_v3; tUint8 m_pad3; } cTest; cMarshalType StructElements[] = { dStructElement( cTest, m_pad1 , Marshal_Uint8Type ), dStructElement( cTest, m_v1 , SaHpiIdrFieldType ), dStructElement( cTest, m_pad2 , Marshal_Uint8Type ), dStructElement( cTest, m_v2 , SaHpiIdrFieldType ), dStructElement( cTest, m_v3 , SaHpiIdrFieldType ), dStructElement( cTest, m_pad3 , Marshal_Uint8Type ), dStructElementEnd() }; cMarshalType TestType = dStruct( cTest, StructElements ); int main( int argc, char *argv[] ) { cTest value = { .m_pad1 = 47, .m_v1.AreaId = 1, .m_v1.FieldId = 1, .m_v1.Type = SAHPI_IDR_FIELDTYPE_CUSTOM, .m_v1.ReadOnly = FALSE, .m_v1.Field.DataType = SAHPI_TL_TYPE_BINARY, .m_v1.Field.Language = SAHPI_LANG_TSONGA, .m_v1.Field.DataLength = 3, .m_v1.Field.Data = "AB", .m_pad2 = 48, .m_v2.AreaId = 2, .m_v2.FieldId = 2, .m_v2.Type = SAHPI_IDR_FIELDTYPE_PART_NUMBER, .m_v2.ReadOnly = FALSE, .m_v2.Field.DataType = SAHPI_TL_TYPE_BCDPLUS, .m_v2.Field.Language = SAHPI_LANG_SANGRO, .m_v2.Field.DataLength = 21, .m_v2.Field.Data = "12345678901234567890", .m_v3.AreaId = 3, .m_v3.FieldId = 3, .m_v3.Type = SAHPI_IDR_FIELDTYPE_CHASSIS_TYPE, .m_v3.ReadOnly = TRUE, .m_v3.Field.DataType = SAHPI_TL_TYPE_ASCII6, .m_v3.Field.Language = SAHPI_LANG_TAJIK, .m_v3.Field.DataLength = 0, .m_v3.Field.Data = "", .m_pad3 = 49 }; unsigned char *buffer = (unsigned char *)malloc(sizeof(value)); cTest result; unsigned int s1 = Marshal( &TestType, &value, buffer ); unsigned int s2 = Demarshal( MarshalByteOrder(), &TestType, &result, buffer ); if ( s1 != s2 ) return 1; if ( value.m_pad1 != result.m_pad1 ) return 1; if ( !cmp_idrfield( &value.m_v1, &result.m_v1 ) ) return 1; if ( value.m_pad2 != result.m_pad2 ) return 1; if ( !cmp_idrfield( &value.m_v2, &result.m_v2 ) ) return 1; if ( !cmp_idrfield( &value.m_v3, &result.m_v3 ) ) return 1; if ( value.m_pad3 != result.m_pad3 ) return 1; return 0; } openhpi-2.14.1/marshal/t/marshal_hpi_types_031.c0000644000076400007640000001630211302567035016331 0ustar /* * Copyright (c) 2005 by IBM Corporation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * W. David Ashley */ #include "marshal_hpi_types.h" #include #include #include static int cmp_annunciatorrec( SaHpiAnnunciatorRecT *d1, SaHpiAnnunciatorRecT *d2 ) { if ( d1->AnnunciatorNum != d2->AnnunciatorNum ) return 0; if ( d1->AnnunciatorType != d2->AnnunciatorType ) return 0; if ( d1->ModeReadOnly != d2->ModeReadOnly ) return 0; if ( d1->MaxConditions != d2->MaxConditions ) return 0; if ( d1->Oem != d2->Oem ) return 0; return 1; } static int cmp_entity( SaHpiEntityT *d1, SaHpiEntityT *d2 ) { if ( d1->EntityType != d2->EntityType ) return 0; if ( d1->EntityLocation != d2->EntityLocation ) return 0; return 1; } static int cmp_text_buffer( SaHpiTextBufferT *d1, SaHpiTextBufferT *d2 ) { if ( d1->DataType != d2->DataType ) return 0; if ( d1->Language != d2->Language ) return 0; if ( d1->DataLength != d2->DataLength ) return 0; return memcmp( d1->Data, d2->Data, d1->DataLength ) ? 0 : 1; } static int cmp_rdr( SaHpiRdrT *d1, SaHpiRdrT *d2 ) { int i; if ( d1->RecordId != d2->RecordId ) return 0; if ( d1->RdrType != d2->RdrType ) return 0; for (i = 0; i < SAHPI_MAX_ENTITY_PATH; i++) { if (d1->Entity.Entry[i].EntityType == SAHPI_ENT_ROOT_VALUE && d2->Entity.Entry[i].EntityType == SAHPI_ENT_ROOT_VALUE ) { break; } if ( !cmp_entity( &d1->Entity.Entry[i], &d2->Entity.Entry[i] ) ) return 0; } if ( d1->IsFru != d2->IsFru ) return 0; if ( !cmp_annunciatorrec( &d1->RdrTypeUnion.AnnunciatorRec, &d2->RdrTypeUnion.AnnunciatorRec ) ) return 0; if ( !cmp_text_buffer( &d1->IdString, &d2->IdString ) ) return 0; return 1; } typedef struct { tUint8 m_pad1; SaHpiRdrT m_v1; tUint8 m_pad2; SaHpiRdrT m_v2; SaHpiRdrT m_v3; tUint8 m_pad3; } cTest; cMarshalType StructElements[] = { dStructElement( cTest, m_pad1 , Marshal_Uint8Type ), dStructElement( cTest, m_v1 , SaHpiRdrType ), dStructElement( cTest, m_pad2 , Marshal_Uint8Type ), dStructElement( cTest, m_v2 , SaHpiRdrType ), dStructElement( cTest, m_v3 , SaHpiRdrType ), dStructElement( cTest, m_pad3 , Marshal_Uint8Type ), dStructElementEnd() }; cMarshalType TestType = dStruct( cTest, StructElements ); int main( int argc, char *argv[] ) { cTest value = { .m_pad1 = 47, .m_v1.RecordId = 1, .m_v1.RdrType = SAHPI_ANNUNCIATOR_RDR, .m_v1.Entity.Entry[0].EntityType = SAHPI_ENT_SYSTEM_BOARD, .m_v1.Entity.Entry[0].EntityLocation = 1, .m_v1.Entity.Entry[1].EntityType = SAHPI_ENT_POWER_UNIT, .m_v1.Entity.Entry[1].EntityLocation = 2, .m_v1.Entity.Entry[2].EntityType = SAHPI_ENT_ROOT, .m_v1.Entity.Entry[2].EntityLocation = 0, .m_v1.IsFru = FALSE, .m_v1.RdrTypeUnion.AnnunciatorRec.AnnunciatorNum = 1, .m_v1.RdrTypeUnion.AnnunciatorRec.AnnunciatorType = SAHPI_ANNUNCIATOR_TYPE_LED, .m_v1.RdrTypeUnion.AnnunciatorRec.ModeReadOnly = FALSE, .m_v1.RdrTypeUnion.AnnunciatorRec.MaxConditions = 0, .m_v1.RdrTypeUnion.AnnunciatorRec.Oem = 0, .m_v1.IdString.DataType = SAHPI_TL_TYPE_BINARY, .m_v1.IdString.Language = SAHPI_LANG_TSONGA, .m_v1.IdString.DataLength = 3, .m_v1.IdString.Data = "AB", .m_pad2 = 48, .m_v2.RecordId = 1, .m_v2.RdrType = SAHPI_ANNUNCIATOR_RDR, .m_v2.Entity.Entry[0].EntityType = SAHPI_ENT_SUB_CHASSIS, .m_v2.Entity.Entry[0].EntityLocation = 1, .m_v2.Entity.Entry[1].EntityType = SAHPI_ENT_SYSTEM_BUS, .m_v2.Entity.Entry[1].EntityLocation = 2, .m_v2.Entity.Entry[2].EntityType = SAHPI_ENT_COOLING_DEVICE, .m_v2.Entity.Entry[2].EntityLocation = 3, .m_v2.Entity.Entry[3].EntityType = SAHPI_ENT_ROOT, .m_v2.Entity.Entry[3].EntityLocation = 0, .m_v2.IsFru = FALSE, .m_v2.RdrTypeUnion.AnnunciatorRec.AnnunciatorNum = 2, .m_v2.RdrTypeUnion.AnnunciatorRec.AnnunciatorType = SAHPI_ANNUNCIATOR_TYPE_AUDIBLE, .m_v2.RdrTypeUnion.AnnunciatorRec.ModeReadOnly = TRUE, .m_v2.RdrTypeUnion.AnnunciatorRec.MaxConditions = 3, .m_v2.RdrTypeUnion.AnnunciatorRec.Oem = 1000, .m_v2.IdString.DataType = SAHPI_TL_TYPE_BCDPLUS, .m_v2.IdString.Language = SAHPI_LANG_SANGRO, .m_v2.IdString.DataLength = 21, .m_v2.IdString.Data = "12345678901234567890", .m_v3.RecordId = 1, .m_v3.RdrType = SAHPI_ANNUNCIATOR_RDR, .m_v3.Entity.Entry[0].EntityType = SAHPI_ENT_PROCESSOR, .m_v3.Entity.Entry[0].EntityLocation = 1, .m_v3.Entity.Entry[1].EntityType = SAHPI_ENT_ROOT, .m_v3.Entity.Entry[1].EntityLocation = 0, .m_v3.IsFru = TRUE, .m_v3.RdrTypeUnion.AnnunciatorRec.AnnunciatorNum = 100, .m_v3.RdrTypeUnion.AnnunciatorRec.AnnunciatorType = SAHPI_ANNUNCIATOR_TYPE_MESSAGE, .m_v3.RdrTypeUnion.AnnunciatorRec.ModeReadOnly = FALSE, .m_v3.RdrTypeUnion.AnnunciatorRec.MaxConditions = 10, .m_v3.RdrTypeUnion.AnnunciatorRec.Oem = 20, .m_v3.IdString.DataType = SAHPI_TL_TYPE_ASCII6, .m_v3.IdString.Language = SAHPI_LANG_TAJIK, .m_v3.IdString.DataLength = 0, .m_v3.IdString.Data = "", .m_pad3 = 49 }; unsigned char *buffer = (unsigned char *)malloc(sizeof(value)); cTest result; unsigned int s1 = Marshal( &TestType, &value, buffer ); unsigned int s2 = Demarshal( MarshalByteOrder(), &TestType, &result, buffer ); if ( s1 != s2 ) return 1; if ( value.m_pad1 != result.m_pad1 ) return 1; if ( !cmp_rdr( &value.m_v1, &result.m_v1 ) ) return 1; if ( value.m_pad2 != result.m_pad2 ) return 1; if ( !cmp_rdr( &value.m_v2, &result.m_v2 ) ) return 1; if ( !cmp_rdr( &value.m_v3, &result.m_v3 ) ) return 1; if ( value.m_pad3 != result.m_pad3 ) return 1; return 0; } openhpi-2.14.1/marshal/t/marshal_hpi_types_033.c0000644000076400007640000000505211302567035016333 0ustar /* * Copyright (c) 2005 by IBM Corporation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * W. David Ashley */ #include "marshal_hpi_types.h" #include #include #include static int cmp_domainevent( SaHpiDomainEventT *d1, SaHpiDomainEventT *d2 ) { if ( d1->Type != d2->Type ) return 0; if ( d1->DomainId != d2->DomainId ) return 0; return 1; } typedef struct { tUint8 m_pad1; SaHpiDomainEventT m_v1; tUint8 m_pad2; SaHpiDomainEventT m_v2; SaHpiDomainEventT m_v3; tUint8 m_pad3; } cTest; cMarshalType StructElements[] = { dStructElement( cTest, m_pad1 , Marshal_Uint8Type ), dStructElement( cTest, m_v1 , SaHpiDomainEventType ), dStructElement( cTest, m_pad2 , Marshal_Uint8Type ), dStructElement( cTest, m_v2 , SaHpiDomainEventType ), dStructElement( cTest, m_v3 , SaHpiDomainEventType ), dStructElement( cTest, m_pad3 , Marshal_Uint8Type ), dStructElementEnd() }; cMarshalType TestType = dStruct( cTest, StructElements ); int main( int argc, char *argv[] ) { cTest value = { .m_pad1 = 47, .m_v1.Type = SAHPI_DOMAIN_REF_ADDED, .m_v1.DomainId = 1, .m_pad2 = 48, .m_v2.Type = SAHPI_DOMAIN_REF_REMOVED, .m_v2.DomainId = 10, .m_v3.Type = SAHPI_DOMAIN_REF_REMOVED, .m_v3.DomainId = 17, .m_pad3 = 49 }; unsigned char *buffer = (unsigned char *)malloc(sizeof(value)); cTest result; unsigned int s1 = Marshal( &TestType, &value, buffer ); unsigned int s2 = Demarshal( MarshalByteOrder(), &TestType, &result, buffer ); if ( s1 != s2 ) return 1; if ( value.m_pad1 != result.m_pad1 ) return 1; if ( !cmp_domainevent( &value.m_v1, &result.m_v1 ) ) return 1; if ( value.m_pad2 != result.m_pad2 ) return 1; if ( !cmp_domainevent( &value.m_v2, &result.m_v2 ) ) return 1; if ( !cmp_domainevent( &value.m_v3, &result.m_v3 ) ) return 1; if ( value.m_pad3 != result.m_pad3 ) return 1; return 0; } openhpi-2.14.1/marshal/t/marshal_hpi_types_045.c0000644000076400007640000000533511302567035016342 0ustar /* * Copyright (c) 2005 by IBM Corporation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * W. David Ashley */ #include "marshal_hpi_types.h" #include #include #include static int cmp_drtentry( SaHpiDrtEntryT *d1, SaHpiDrtEntryT *d2 ) { if ( d1->EntryId != d2->EntryId ) return 0; if ( d1->DomainId != d2->DomainId ) return 0; if ( d1->IsPeer != d2->IsPeer ) return 0; return 1; } typedef struct { tUint8 m_pad1; SaHpiDrtEntryT m_v1; tUint8 m_pad2; SaHpiDrtEntryT m_v2; SaHpiDrtEntryT m_v3; tUint8 m_pad3; } cTest; cMarshalType StructElements[] = { dStructElement( cTest, m_pad1 , Marshal_Uint8Type ), dStructElement( cTest, m_v1 , SaHpiDrtEntryType ), dStructElement( cTest, m_pad2 , Marshal_Uint8Type ), dStructElement( cTest, m_v2 , SaHpiDrtEntryType ), dStructElement( cTest, m_v3 , SaHpiDrtEntryType ), dStructElement( cTest, m_pad3 , Marshal_Uint8Type ), dStructElementEnd() }; cMarshalType TestType = dStruct( cTest, StructElements ); int main( int argc, char *argv[] ) { cTest value = { .m_pad1 = 47, .m_v1.EntryId = 1, .m_v1.DomainId = 1, .m_v1.IsPeer = TRUE, .m_pad2 = 48, .m_v2.EntryId = 2, .m_v2.DomainId = 2, .m_v2.IsPeer = TRUE, .m_v3.EntryId = 3, .m_v3.DomainId = 3, .m_v3.IsPeer = FALSE, .m_pad3 = 49 }; unsigned char *buffer = (unsigned char *)malloc(sizeof(value)); cTest result; unsigned int s1 = Marshal( &TestType, &value, buffer ); unsigned int s2 = Demarshal( MarshalByteOrder(), &TestType, &result, buffer ); if ( s1 != s2 ) return 1; if ( value.m_pad1 != result.m_pad1 ) return 1; if ( !cmp_drtentry( &value.m_v1, &result.m_v1 ) ) return 1; if ( value.m_pad2 != result.m_pad2 ) return 1; if ( !cmp_drtentry( &value.m_v2, &result.m_v2 ) ) return 1; if ( !cmp_drtentry( &value.m_v3, &result.m_v3 ) ) return 1; if ( value.m_pad3 != result.m_pad3 ) return 1; return 0; } openhpi-2.14.1/marshal/t/marshal_004.c0000644000076400007640000000163511302567035014250 0ustar /* * Copyright (c) 2004 by FORCE Computers. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Thomas Kanngieser */ #include "marshal.h" int main( int argc, char *argv[] ) { tInt8 value = 0xfa; tInt8 result; unsigned char buffer[256]; unsigned int s1 = Marshal( &Marshal_Int8Type, &value, buffer ); if ( s1 != sizeof( tInt8 ) ) return 1; unsigned int s2 = Demarshal( MarshalByteOrder(), &Marshal_Int8Type, &result, buffer ); if ( s2 != sizeof( tInt8 ) ) return 1; if ( value != result ) return 1; return 0; } openhpi-2.14.1/marshal/t/marshal_hpi_types_025.c0000644000076400007640000000731311302567035016336 0ustar /* * Copyright (c) 2005 by IBM Corporation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * W. David Ashley */ #include "marshal_hpi_types.h" #include #include #include static int cmp_watchdog( SaHpiWatchdogT *d1, SaHpiWatchdogT *d2 ) { if ( d1->Log != d2->Log ) return 0; if ( d1->Running != d2->Running ) return 0; if ( d1->TimerUse != d2->TimerUse ) return 0; if ( d1->TimerAction != d2->TimerAction ) return 0; if ( d1->PretimerInterrupt != d2->PretimerInterrupt ) return 0; if ( d1->PreTimeoutInterval != d2->PreTimeoutInterval ) return 0; if ( d1->TimerUseExpFlags != d2->TimerUseExpFlags ) return 0; if ( d1->InitialCount != d2->InitialCount ) return 0; if ( d1->PresentCount != d2->PresentCount ) return 0; return 1; } typedef struct { tUint8 m_pad1; SaHpiWatchdogT m_v1; tUint8 m_pad2; SaHpiWatchdogT m_v2; SaHpiWatchdogT m_v3; tUint8 m_pad3; } cTest; cMarshalType StructElements[] = { dStructElement( cTest, m_pad1 , Marshal_Uint8Type ), dStructElement( cTest, m_v1 , SaHpiWatchdogType ), dStructElement( cTest, m_pad2 , Marshal_Uint8Type ), dStructElement( cTest, m_v2 , SaHpiWatchdogType ), dStructElement( cTest, m_v3 , SaHpiWatchdogType ), dStructElement( cTest, m_pad3 , Marshal_Uint8Type ), dStructElementEnd() }; cMarshalType TestType = dStruct( cTest, StructElements ); int main( int argc, char *argv[] ) { cTest value = { .m_pad1 = 47, .m_v1.Log = TRUE, .m_v1.Running = TRUE, .m_v1.TimerUse = SAHPI_WTU_NONE, .m_v1.TimerAction = SAHPI_WA_NO_ACTION, .m_v1.PretimerInterrupt = SAHPI_WPI_NONE, .m_v1.PreTimeoutInterval = 100, .m_v1.TimerUseExpFlags = SAHPI_WATCHDOG_EXP_BIOS_FRB2, .m_v1.InitialCount = 0, .m_v1.PresentCount = 0, .m_pad2 = 48, .m_v2.Log = FALSE, .m_v2.Running = FALSE, .m_v2.TimerUse = SAHPI_WTU_BIOS_FRB2, .m_v2.TimerAction = SAHPI_WA_RESET, .m_v2.PretimerInterrupt = SAHPI_WPI_SMI, .m_v2.PreTimeoutInterval = 1100, .m_v2.TimerUseExpFlags = SAHPI_WATCHDOG_EXP_BIOS_FRB2, .m_v2.InitialCount = 1, .m_v2.PresentCount = 1, .m_v3.Log = TRUE, .m_v3.Running = FALSE, .m_v3.TimerUse = SAHPI_WTU_BIOS_POST, .m_v3.TimerAction = SAHPI_WA_POWER_CYCLE, .m_v3.PretimerInterrupt = SAHPI_WPI_OEM, .m_v3.PreTimeoutInterval = 100, .m_v3.TimerUseExpFlags = SAHPI_WATCHDOG_EXP_OEM, .m_v3.InitialCount = 1, .m_v3.PresentCount = 0, .m_pad3 = 49 }; unsigned char *buffer = (unsigned char *)malloc(sizeof(value)); cTest result; unsigned int s1 = Marshal( &TestType, &value, buffer ); unsigned int s2 = Demarshal( MarshalByteOrder(), &TestType, &result, buffer ); if ( s1 != s2 ) return 1; if ( value.m_pad1 != result.m_pad1 ) return 1; if ( !cmp_watchdog( &value.m_v1, &result.m_v1 ) ) return 1; if ( value.m_pad2 != result.m_pad2 ) return 1; if ( !cmp_watchdog( &value.m_v2, &result.m_v2 ) ) return 1; if ( !cmp_watchdog( &value.m_v3, &result.m_v3 ) ) return 1; if ( value.m_pad3 != result.m_pad3 ) return 1; return 0; } openhpi-2.14.1/marshal/t/marshal_hpi_types_042.c0000644000076400007640000001060611302567035016334 0ustar /* * Copyright (c) 2005 by IBM Corporation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * W. David Ashley */ #include "marshal_hpi_types.h" #include #include #include static int cmp_resourceinfo( SaHpiResourceInfoT *d1, SaHpiResourceInfoT *d2 ) { int i; if ( d1->ResourceRev != d2->ResourceRev ) return 0; if ( d1->SpecificVer != d2->SpecificVer ) return 0; if ( d1->DeviceSupport != d2->DeviceSupport ) return 0; if ( d1->ManufacturerId != d2->ManufacturerId ) return 0; if ( d1->ProductId != d2->ProductId ) return 0; if ( d1->FirmwareMajorRev != d2->FirmwareMajorRev ) return 0; if ( d1->FirmwareMinorRev != d2->FirmwareMinorRev ) return 0; if ( d1->AuxFirmwareRev != d2->AuxFirmwareRev ) return 0; for (i = 0; i < 16; i++) { if ( d1->Guid[i] != d2->Guid[i] ) return 0; } return 1; } typedef struct { tUint8 m_pad1; SaHpiResourceInfoT m_v1; tUint8 m_pad2; SaHpiResourceInfoT m_v2; SaHpiResourceInfoT m_v3; tUint8 m_pad3; } cTest; cMarshalType StructElements[] = { dStructElement( cTest, m_pad1 , Marshal_Uint8Type ), dStructElement( cTest, m_v1 , SaHpiResourceInfoType ), dStructElement( cTest, m_pad2 , Marshal_Uint8Type ), dStructElement( cTest, m_v2 , SaHpiResourceInfoType ), dStructElement( cTest, m_v3 , SaHpiResourceInfoType ), dStructElement( cTest, m_pad3 , Marshal_Uint8Type ), dStructElementEnd() }; cMarshalType TestType = dStruct( cTest, StructElements ); int main( int argc, char *argv[] ) { cTest value = { .m_pad1 = 47, .m_v1.ResourceRev = 1, .m_v1.SpecificVer = 1, .m_v1.DeviceSupport = 0, .m_v1.ManufacturerId = 10, .m_v1.ProductId = 10, .m_v1.FirmwareMajorRev = 3, .m_v1.FirmwareMinorRev = 3, .m_v1.AuxFirmwareRev = 0, .m_v1.Guid = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15}, .m_pad2 = 48, .m_v2.ResourceRev = 1, .m_v2.SpecificVer = 1, .m_v2.DeviceSupport = 0, .m_v2.ManufacturerId = 10, .m_v2.ProductId = 10, .m_v2.FirmwareMajorRev = 3, .m_v2.FirmwareMinorRev = 3, .m_v2.AuxFirmwareRev = 0, .m_v2.Guid = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15}, .m_v3.ResourceRev = 1, .m_v3.SpecificVer = 1, .m_v3.DeviceSupport = 0, .m_v3.ManufacturerId = 10, .m_v3.ProductId = 10, .m_v3.FirmwareMajorRev = 3, .m_v3.FirmwareMinorRev = 3, .m_v3.AuxFirmwareRev = 0, .m_v3.Guid = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15}, .m_pad3 = 49 }; unsigned char *buffer = (unsigned char *)malloc(sizeof(value)); cTest result; unsigned int s1 = Marshal( &TestType, &value, buffer ); unsigned int s2 = Demarshal( MarshalByteOrder(), &TestType, &result, buffer ); if ( s1 != s2 ) return 1; if ( value.m_pad1 != result.m_pad1 ) return 1; if ( !cmp_resourceinfo( &value.m_v1, &result.m_v1 ) ) return 1; if ( value.m_pad2 != result.m_pad2 ) return 1; if ( !cmp_resourceinfo( &value.m_v2, &result.m_v2 ) ) return 1; if ( !cmp_resourceinfo( &value.m_v3, &result.m_v3 ) ) return 1; if ( value.m_pad3 != result.m_pad3 ) return 1; return 0; } openhpi-2.14.1/marshal/t/marshal_hpi_types_012.c0000644000076400007640000000461311302567035016332 0ustar /* * Copyright (c) 2005 by IBM Corporation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * W. David Ashley */ #include "marshal_hpi_types.h" #include #include #include static int cmp_ctrlstate( SaHpiCtrlStateT *d1, SaHpiCtrlStateT *d2 ) { if ( d1->Type != d2->Type ) return 0; if ( d1->StateUnion.Discrete != d2->StateUnion.Discrete ) return 0; return 1; } typedef struct { tUint8 m_pad1; SaHpiCtrlStateT m_v1; tUint8 m_pad2; SaHpiCtrlStateT m_v2; SaHpiCtrlStateT m_v3; tUint8 m_pad3; } cTest; cMarshalType StructElements[] = { dStructElement( cTest, m_pad1 , Marshal_Uint8Type ), dStructElement( cTest, m_v1 , SaHpiCtrlStateType ), dStructElement( cTest, m_pad2 , Marshal_Uint8Type ), dStructElement( cTest, m_v2 , SaHpiCtrlStateType ), dStructElement( cTest, m_v3 , SaHpiCtrlStateType ), dStructElement( cTest, m_pad3 , Marshal_Uint8Type ), dStructElementEnd() }; cMarshalType TestType = dStruct( cTest, StructElements ); int main( int argc, char *argv[] ) { cTest value = { .m_pad1 = 47, .m_v1.Type = SAHPI_CTRL_TYPE_DISCRETE, .m_v1.StateUnion.Discrete = 1, .m_pad2 = 48, .m_v1.Type = SAHPI_CTRL_TYPE_DISCRETE, .m_v1.StateUnion.Discrete = 2, .m_v1.Type = SAHPI_CTRL_TYPE_DISCRETE, .m_v1.StateUnion.Discrete = 16, .m_pad3 = 49 }; unsigned char *buffer = (unsigned char *)malloc(sizeof(value)); cTest result; unsigned int s1 = Marshal( &TestType, &value, buffer ); unsigned int s2 = Demarshal( MarshalByteOrder(), &TestType, &result, buffer ); if ( s1 != s2 ) return 1; if ( value.m_pad1 != result.m_pad1 ) return 1; if ( !cmp_ctrlstate( &value.m_v1, &result.m_v1 ) ) return 1; if ( value.m_pad2 != result.m_pad2 ) return 1; if ( !cmp_ctrlstate( &value.m_v2, &result.m_v2 ) ) return 1; if ( !cmp_ctrlstate( &value.m_v3, &result.m_v3 ) ) return 1; if ( value.m_pad3 != result.m_pad3 ) return 1; return 0; } openhpi-2.14.1/marshal/t/marshal_hpi_types_037.c0000644000076400007640000000602211302567035016335 0ustar /* * Copyright (c) 2005 by IBM Corporation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * W. David Ashley */ #include "marshal_hpi_types.h" #include #include #include static int cmp_watchdogevent( SaHpiWatchdogEventT *d1, SaHpiWatchdogEventT *d2 ) { if ( d1->WatchdogNum != d2->WatchdogNum ) return 0; if ( d1->WatchdogAction != d2->WatchdogAction ) return 0; if ( d1->WatchdogPreTimerAction != d2->WatchdogPreTimerAction ) return 0; if ( d1->WatchdogUse != d2->WatchdogUse ) return 0; return 1; } typedef struct { tUint8 m_pad1; SaHpiWatchdogEventT m_v1; tUint8 m_pad2; SaHpiWatchdogEventT m_v2; SaHpiWatchdogEventT m_v3; tUint8 m_pad3; } cTest; cMarshalType StructElements[] = { dStructElement( cTest, m_pad1 , Marshal_Uint8Type ), dStructElement( cTest, m_v1 , SaHpiWatchdogEventType ), dStructElement( cTest, m_pad2 , Marshal_Uint8Type ), dStructElement( cTest, m_v2 , SaHpiWatchdogEventType ), dStructElement( cTest, m_v3 , SaHpiWatchdogEventType ), dStructElement( cTest, m_pad3 , Marshal_Uint8Type ), dStructElementEnd() }; cMarshalType TestType = dStruct( cTest, StructElements ); int main( int argc, char *argv[] ) { cTest value = { .m_pad1 = 47, .m_v1.WatchdogNum = 1, .m_v1.WatchdogAction = SAHPI_WA_RESET, .m_v1.WatchdogPreTimerAction = SAHPI_WPI_SMI, .m_v1.WatchdogUse = SAHPI_WTU_NONE, .m_pad2 = 48, .m_v2.WatchdogNum = 2, .m_v2.WatchdogAction = SAHPI_WA_POWER_DOWN, .m_v2.WatchdogPreTimerAction = SAHPI_WPI_NMI, .m_v2.WatchdogUse = SAHPI_WTU_BIOS_POST, .m_v3.WatchdogNum = 3, .m_v3.WatchdogAction = SAHPI_WA_POWER_CYCLE, .m_v3.WatchdogPreTimerAction = SAHPI_WPI_OEM, .m_v3.WatchdogUse = SAHPI_WTU_OS_LOAD, .m_pad3 = 49 }; unsigned char *buffer = (unsigned char *)malloc(sizeof(value)); cTest result; unsigned int s1 = Marshal( &TestType, &value, buffer ); unsigned int s2 = Demarshal( MarshalByteOrder(), &TestType, &result, buffer ); if ( s1 != s2 ) return 1; if ( value.m_pad1 != result.m_pad1 ) return 1; if ( !cmp_watchdogevent( &value.m_v1, &result.m_v1 ) ) return 1; if ( value.m_pad2 != result.m_pad2 ) return 1; if ( !cmp_watchdogevent( &value.m_v2, &result.m_v2 ) ) return 1; if ( !cmp_watchdogevent( &value.m_v3, &result.m_v3 ) ) return 1; if ( value.m_pad3 != result.m_pad3 ) return 1; return 0; } openhpi-2.14.1/marshal/t/marshal_hpi_types_002.c0000644000076400007640000000627311302567035016335 0ustar /* * Copyright (c) 2005 by IBM Corporation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * W. David Ashley */ #include "marshal_hpi_types.h" #include #include #include static int cmp_entities( SaHpiEntityT *d1, SaHpiEntityT *d2 ) { if ( d1->EntityType != d2->EntityType ) return 0; if ( d1->EntityLocation != d2->EntityLocation ) return 0; return 1; } typedef struct { tUint8 m_pad1; SaHpiEntityPathT m_v1; tUint8 m_pad2; SaHpiEntityPathT m_v2; SaHpiEntityPathT m_v3; tUint8 m_pad3; } cTest; cMarshalType StructElements[] = { dStructElement( cTest, m_pad1 , Marshal_Uint8Type ), dStructElement( cTest, m_v1 , SaHpiEntityPathType ), dStructElement( cTest, m_pad2 , Marshal_Uint8Type ), dStructElement( cTest, m_v2 , SaHpiEntityPathType ), dStructElement( cTest, m_v3 , SaHpiEntityPathType ), dStructElement( cTest, m_pad3 , Marshal_Uint8Type ), dStructElementEnd() }; cMarshalType TestType = dStruct( cTest, StructElements ); int main( int argc, char *argv[] ) { cTest value = { .m_pad1 = 47, .m_v1.Entry[0].EntityType = SAHPI_ENT_SYSTEM_BOARD, .m_v1.Entry[0].EntityLocation = 1, .m_v1.Entry[1].EntityType = SAHPI_ENT_BATTERY, .m_v1.Entry[1].EntityLocation = 2, .m_pad2 = 48, .m_v2.Entry[0].EntityType = SAHPI_ENT_POWER_MODULE, .m_v2.Entry[0].EntityLocation = 2, .m_v2.Entry[1].EntityType = SAHPI_ENT_SYSTEM_BUS, .m_v2.Entry[1].EntityLocation = 3, .m_v3.Entry[0].EntityType = SAHPI_ENT_SWITCH, .m_v3.Entry[0].EntityLocation = 3, .m_v3.Entry[1].EntityType = SAHPI_ENT_SYSTEM_BLADE, .m_v3.Entry[1].EntityLocation = 4, .m_v3.Entry[2].EntityType = SAHPI_ENT_RACK_MOUNTED_SERVER, .m_v3.Entry[2].EntityLocation = 5, .m_pad3 = 49 }; unsigned char *buffer = (unsigned char *)malloc(sizeof(value)); cTest result; unsigned int s1 = Marshal( &TestType, &value, buffer ); unsigned int s2 = Demarshal( MarshalByteOrder(), &TestType, &result, buffer ); if ( s1 != s2 ) return 1; if ( value.m_pad1 != result.m_pad1 ) return 1; if ( !cmp_entities( &value.m_v1.Entry[0], &result.m_v1.Entry[0] ) ) return 1; if ( !cmp_entities( &value.m_v1.Entry[1], &result.m_v1.Entry[1] ) ) return 1; if ( value.m_pad2 != result.m_pad2 ) return 1; if ( !cmp_entities( &value.m_v2.Entry[0], &result.m_v2.Entry[0] ) ) return 1; if ( !cmp_entities( &value.m_v2.Entry[1], &result.m_v2.Entry[1] ) ) return 1; if ( !cmp_entities( &value.m_v3.Entry[0], &result.m_v3.Entry[0] ) ) return 1; if ( !cmp_entities( &value.m_v3.Entry[1], &result.m_v3.Entry[1] ) ) return 1; if ( !cmp_entities( &value.m_v3.Entry[2], &result.m_v3.Entry[2] ) ) return 1; if ( value.m_pad3 != result.m_pad3 ) return 1; return 0; } openhpi-2.14.1/marshal/t/marshal_021.c0000644000076400007640000000524211302567035014245 0ustar /* * Copyright (c) 2004 by FORCE Computers. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Thomas Kanngieser */ #include "marshal.h" #include #define dModU8 0 #define dModU16 1 #define dModU32 2 #define dModU64 3 #define dModI8 4 #define dModI16 5 #define dModI32 6 #define dModI64 7 #define dModF32 8 #define dModF64 9 typedef union { tUint8 m_u8; tUint16 m_u16; tUint32 m_u32; tUint64 m_u64; tInt8 m_i8; tInt16 m_i16; tInt32 m_i32; tInt64 m_i64; tFloat32 m_f32; tFloat64 m_f64; } cUnion; typedef struct { tUint8 m_pad1; tUint8 m_mod; tUint8 m_pad2; cUnion m_union; tUint8 m_pad3; } cTest; cMarshalType UnionElements[] = { dUnionElement( dModU8 , Marshal_Uint8Type ), dUnionElement( dModU16, Marshal_Uint16Type ), dUnionElement( dModU32, Marshal_Uint32Type ), dUnionElement( dModU64, Marshal_Uint64Type ), dUnionElement( dModI8 , Marshal_Int8Type ), dUnionElement( dModI16, Marshal_Int16Type ), dUnionElement( dModI32, Marshal_Int32Type ), dUnionElement( dModI64, Marshal_Int64Type ), dUnionElement( dModF32, Marshal_Float32Type ), dUnionElement( dModF64, Marshal_Float64Type ), dUnionElementEnd() }; cMarshalType TestUnionType = dUnion( 1, cUnion, UnionElements ); cMarshalType StructElements[] = { dStructElement( cTest, m_pad1 , Marshal_Uint8Type ), dStructElement( cTest, m_mod , Marshal_Uint8Type ), dStructElement( cTest, m_pad2 , Marshal_Uint8Type ), dStructElement( cTest, m_union, TestUnionType ), dStructElement( cTest, m_pad3 , Marshal_Uint8Type ), dStructElementEnd() }; cMarshalType TestType = dStruct( cTest, StructElements ); int main( int argc, char *argv[] ) { cTest value = { .m_pad1 = 47, .m_mod = dModU32, .m_pad2 = 48, .m_union.m_u32 = 0xabcd1234, .m_pad3 = 49 }; unsigned char buffer[256]; cTest result; unsigned int s1 = Marshal( &TestType, &value, buffer ); unsigned int s2 = Demarshal( MarshalByteOrder(), &TestType, &result, buffer ); if ( s1 != s2 ) return 1; if ( value.m_pad1 != result.m_pad1 ) return 1; if ( value.m_mod != result.m_mod ) return 1; if ( value.m_pad2 != result.m_pad2 ) return 1; if ( value.m_pad3 != result.m_pad3 ) return 1; if ( value.m_union.m_u32 != result.m_union.m_u32 ) return 1; return 0; } openhpi-2.14.1/marshal/t/marshal_hpi_types_022.c0000644000076400007640000000537411302567035016340 0ustar /* * Copyright (c) 2005 by IBM Corporation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * W. David Ashley */ #include "marshal_hpi_types.h" #include #include #include static int cmp_idrareaheader( SaHpiIdrAreaHeaderT *d1, SaHpiIdrAreaHeaderT *d2 ) { if ( d1->AreaId != d2->AreaId ) return 0; if ( d1->Type != d2->Type ) return 0; if ( d1->ReadOnly != d2->ReadOnly ) return 0; if ( d1->NumFields != d2->NumFields ) return 0; return 1; } typedef struct { tUint8 m_pad1; SaHpiIdrAreaHeaderT m_v1; tUint8 m_pad2; SaHpiIdrAreaHeaderT m_v2; SaHpiIdrAreaHeaderT m_v3; tUint8 m_pad3; } cTest; cMarshalType StructElements[] = { dStructElement( cTest, m_pad1 , Marshal_Uint8Type ), dStructElement( cTest, m_v1 , SaHpiIdrAreaHeaderType ), dStructElement( cTest, m_pad2 , Marshal_Uint8Type ), dStructElement( cTest, m_v2 , SaHpiIdrAreaHeaderType ), dStructElement( cTest, m_v3 , SaHpiIdrAreaHeaderType ), dStructElement( cTest, m_pad3 , Marshal_Uint8Type ), dStructElementEnd() }; cMarshalType TestType = dStruct( cTest, StructElements ); int main( int argc, char *argv[] ) { cTest value = { .m_pad1 = 47, .m_v1.AreaId = 1, .m_v1.Type = SAHPI_IDR_FIELDTYPE_CUSTOM, .m_v1.ReadOnly = FALSE, .m_v1.NumFields = 1, .m_pad2 = 48, .m_v2.AreaId = 2, .m_v2.Type = SAHPI_IDR_FIELDTYPE_PART_NUMBER, .m_v2.ReadOnly = FALSE, .m_v2.NumFields = 3, .m_v3.AreaId = 3, .m_v3.Type = SAHPI_IDR_FIELDTYPE_CHASSIS_TYPE, .m_v3.ReadOnly = TRUE, .m_v3.NumFields = 2, .m_pad3 = 49 }; unsigned char *buffer = (unsigned char *)malloc(sizeof(value)); cTest result; unsigned int s1 = Marshal( &TestType, &value, buffer ); unsigned int s2 = Demarshal( MarshalByteOrder(), &TestType, &result, buffer ); if ( s1 != s2 ) return 1; if ( value.m_pad1 != result.m_pad1 ) return 1; if ( !cmp_idrareaheader( &value.m_v1, &result.m_v1 ) ) return 1; if ( value.m_pad2 != result.m_pad2 ) return 1; if ( !cmp_idrareaheader( &value.m_v2, &result.m_v2 ) ) return 1; if ( !cmp_idrareaheader( &value.m_v3, &result.m_v3 ) ) return 1; if ( value.m_pad3 != result.m_pad3 ) return 1; return 0; } openhpi-2.14.1/marshal/t/marshal_012.c0000644000076400007640000000155211302567035014245 0ustar /* * Copyright (c) 2004 by FORCE Computers. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Thomas Kanngieser */ #include "marshal.h" #include int main( int argc, char *argv[] ) { tUint16 value = 0x42aa; tUint16 swap = GUINT16_SWAP_LE_BE( value ); tUint16 result; unsigned int s = Demarshal( MarshalByteOrder() ? 0 : 1, &Marshal_Uint16Type, &result, &swap ); if ( s != sizeof( tUint16 ) ) return 1; if ( value != result ) return 1; return 0; } openhpi-2.14.1/marshal/t/marshal_hpi_types_000.c0000644000076400007640000000525211302567035016327 0ustar /* * Copyright (c) 2004 by FORCE Computers. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Thomas Kanngieser */ #include "marshal_hpi_types.h" #include #include #include static int cmp_text_buffer( SaHpiTextBufferT *d1, SaHpiTextBufferT *d2 ) { if ( d1->DataType != d2->DataType ) return 0; if ( d1->Language != d2->Language ) return 0; if ( d1->DataLength != d2->DataLength ) return 0; return memcmp( d1->Data, d2->Data, d1->DataLength ) ? 0 : 1; } typedef struct { tUint8 m_pad1; SaHpiTextBufferT m_tb1; tUint8 m_pad2; SaHpiTextBufferT m_tb2; SaHpiTextBufferT m_tb3; tUint8 m_pad3; } cTest; cMarshalType StructElements[] = { dStructElement( cTest, m_pad1 , Marshal_Uint8Type ), dStructElement( cTest, m_tb1 , SaHpiTextBufferType ), dStructElement( cTest, m_pad2 , Marshal_Uint8Type ), dStructElement( cTest, m_tb2 , SaHpiTextBufferType ), dStructElement( cTest, m_tb3 , SaHpiTextBufferType ), dStructElement( cTest, m_pad3 , Marshal_Uint8Type ), dStructElementEnd() }; cMarshalType TestType = dStruct( cTest, StructElements ); int main( int argc, char *argv[] ) { cTest value = { .m_pad1 = 47, .m_tb1.DataType = SAHPI_TL_TYPE_BINARY, .m_tb1.Language = SAHPI_LANG_TSONGA, .m_tb1.DataLength = 3, .m_tb1.Data = "AB", .m_pad2 = 48, .m_tb2.DataType = SAHPI_TL_TYPE_BCDPLUS, .m_tb2.Language = SAHPI_LANG_SANGRO, .m_tb2.DataLength = 21, .m_tb2.Data = "12345678901234567890", .m_tb3.DataType = SAHPI_TL_TYPE_ASCII6, .m_tb3.Language = SAHPI_LANG_TAJIK, .m_tb3.DataLength = 0, .m_tb3.Data = "", .m_pad3 = 49 }; unsigned char *buffer = (unsigned char *)malloc(sizeof(value)); cTest result; unsigned int s1 = Marshal( &TestType, &value, buffer ); unsigned int s2 = Demarshal( MarshalByteOrder(), &TestType, &result, buffer ); if ( s1 != s2 ) return 1; if ( value.m_pad1 != result.m_pad1 ) return 1; if ( !cmp_text_buffer( &value.m_tb1, &result.m_tb1 ) ) return 1; if ( value.m_pad2 != result.m_pad2 ) return 1; if ( !cmp_text_buffer( &value.m_tb2, &result.m_tb2 ) ) return 1; if ( !cmp_text_buffer( &value.m_tb3, &result.m_tb3 ) ) return 1; if ( value.m_pad3 != result.m_pad3 ) return 1; return 0; } openhpi-2.14.1/marshal/t/marshal_001.c0000644000076400007640000000171111302567035014240 0ustar /* * Copyright (c) 2004 by FORCE Computers. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Thomas Kanngieser */ #include "marshal.h" int main( int argc, char *argv[] ) { tUint16 value = 0x42aa; tUint16 result; unsigned char buffer[256]; unsigned int s1 = Marshal( &Marshal_Uint16Type, &value, buffer ); if ( s1 != sizeof( tUint16 ) ) return 1; unsigned int s2 = Demarshal( MarshalByteOrder(), &Marshal_Uint16Type, &result, buffer ); if ( s2 != sizeof( tUint16 ) ) return 1; if ( value != result ) return 1; return 0; } openhpi-2.14.1/marshal/t/marshal_026.c0000644000076400007640000000542111302567035014251 0ustar /* * Copyright (c) 2004 by FORCE Computers. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Thomas Kanngieser */ #include "marshal.h" #include typedef struct { tUint8 m_u8; tUint16 m_u16; } cTest2; cMarshalType Test2Elements[] = { dStructElement( cTest2, m_u8 , Marshal_Uint8Type ), dStructElement( cTest2, m_u16, Marshal_Uint16Type ), dStructElementEnd() }; cMarshalType Test2Type = dStruct( cTest2, Test2Elements ); typedef struct { tUint16 m_u16; tUint8 m_u8; } cTest3; cMarshalType Test3Elements[] = { dStructElement( cTest3, m_u16, Marshal_Uint16Type ), dStructElement( cTest3, m_u8 , Marshal_Uint8Type ), dStructElementEnd() }; cMarshalType Test3Type = dStruct( cTest3, Test3Elements ); typedef struct { tUint8 m_u81; tUint16 m_u16; cTest2 m_struct2; tUint8 m_u82; cTest3 m_struct3; tUint8 m_u83; } cTest1; cMarshalType Test1Elements[] = { dStructElement( cTest1, m_u81, Marshal_Uint8Type ), dStructElement( cTest1, m_u16, Marshal_Uint16Type ), dStructElement( cTest1, m_struct2, Test2Type ), dStructElement( cTest1, m_u82, Marshal_Uint8Type ), dStructElement( cTest1, m_struct3, Test3Type ), dStructElement( cTest1, m_u83, Marshal_Uint8Type ), dStructElementEnd() }; cMarshalType Test1Type = dStruct( cTest1, Test1Elements ); int main( int argc, char *argv[] ) { cTest1 value = { .m_u81 = 0x42, .m_u16 = 0x1234, .m_struct2.m_u8 = 0x17, .m_struct2.m_u16 = 0x6789, .m_u82 = 0x43, .m_struct3.m_u16 = 0x3456, .m_struct3.m_u8 = 0x18, .m_u83 = 0x44 }; unsigned char buffer[256]; cTest1 result; unsigned int s1 = Marshal( &Test1Type, &value, buffer ); unsigned int s2 = Demarshal( MarshalByteOrder(), &Test1Type, &result, buffer ); if ( s1 != s2 ) return 1; unsigned int s3 = MarshalSize( &Test1Type ); if ( s1 != s3 ) return 1; if ( value.m_u81 != result.m_u81 ) return 1; if ( value.m_u16 != result.m_u16 ) return 1; if ( value.m_struct2.m_u8 != result.m_struct2.m_u8 ) return 1; if ( value.m_struct2.m_u16 != result.m_struct2.m_u16 ) return 1; if ( value.m_u82 != result.m_u82 ) return 1; if ( value.m_struct3.m_u16 != result.m_struct3.m_u16 ) return 1; if ( value.m_struct3.m_u8 != result.m_struct3.m_u8 ) return 1; if ( value.m_u83 != result.m_u83 ) return 1; return 0; } openhpi-2.14.1/marshal/t/marshal_002.c0000644000076400007640000000171511302567035014245 0ustar /* * Copyright (c) 2004 by FORCE Computers. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Thomas Kanngieser */ #include "marshal.h" int main( int argc, char *argv[] ) { tUint32 value = 0xba098765; tUint32 result; unsigned char buffer[256]; unsigned int s1 = Marshal( &Marshal_Uint32Type, &value, buffer ); if ( s1 != sizeof( tUint32 ) ) return 1; unsigned int s2 = Demarshal( MarshalByteOrder(), &Marshal_Uint32Type, &result, buffer ); if ( s2 != sizeof( tUint32 ) ) return 1; if ( value != result ) return 1; return 0; } openhpi-2.14.1/marshal/t/marshal_000.c0000644000076400007640000000170311302567035014240 0ustar /* * Copyright (c) 2004 by FORCE Computers. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Thomas Kanngieser */ #include "marshal.h" int main( int argc, char *argv[] ) { tUint8 value = 0x42; tUint8 result; unsigned char buffer[256]; unsigned int s1 = Marshal( &Marshal_Uint8Type, &value, buffer ); if ( s1 != sizeof( tUint8 ) ) return 1; unsigned int s2 = Demarshal( MarshalByteOrder(), &Marshal_Uint8Type, &result, buffer ); if ( s2 != sizeof( tUint8 ) ) return 1; if ( value != result ) return 1; return 0; } openhpi-2.14.1/marshal/t/marshal_hpi_types_009.c0000644000076400007640000000510611302567035016336 0ustar /* * Copyright (c) 2005 by IBM Corporation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * W. David Ashley */ #include "marshal_hpi_types.h" #include #include #include static int cmp_ctrlstatestream( SaHpiCtrlStateStreamT *d1, SaHpiCtrlStateStreamT *d2 ) { if ( d1->Repeat != d2->Repeat ) return 0; if ( d1->StreamLength != d2->StreamLength ) return 0; if ( memcmp(d1->Stream, d2->Stream, SAHPI_CTRL_MAX_STREAM_LENGTH) != 0 ) return 0; return 1; } typedef struct { tUint8 m_pad1; SaHpiCtrlStateStreamT m_v1; tUint8 m_pad2; SaHpiCtrlStateStreamT m_v2; SaHpiCtrlStateStreamT m_v3; tUint8 m_pad3; } cTest; cMarshalType StructElements[] = { dStructElement( cTest, m_pad1 , Marshal_Uint8Type ), dStructElement( cTest, m_v1 , SaHpiCtrlStateStreamType ), dStructElement( cTest, m_pad2 , Marshal_Uint8Type ), dStructElement( cTest, m_v2 , SaHpiCtrlStateStreamType ), dStructElement( cTest, m_v3 , SaHpiCtrlStateStreamType ), dStructElement( cTest, m_pad3 , Marshal_Uint8Type ), dStructElementEnd() }; cMarshalType TestType = dStruct( cTest, StructElements ); int main( int argc, char *argv[] ) { cTest value = { .m_pad1 = 47, .m_v1.Repeat = 0, .m_v1.StreamLength = 4, .m_v1.Stream = {'A', 'B', 'c', 'd'}, .m_pad2 = 48, .m_v2.Repeat = 1, .m_v2.StreamLength = 4, .m_v2.Stream = {'d', 'c', 'B', 'A'}, .m_v3.Repeat = 1, .m_v3.StreamLength = 1, .m_v3.Stream = {'A'}, .m_pad3 = 49 }; unsigned char *buffer = (unsigned char *)malloc(sizeof(value)); cTest result; unsigned int s1 = Marshal( &TestType, &value, buffer ); unsigned int s2 = Demarshal( MarshalByteOrder(), &TestType, &result, buffer ); if ( s1 != s2 ) return 1; if ( value.m_pad1 != result.m_pad1 ) return 1; if ( !cmp_ctrlstatestream( &value.m_v1, &result.m_v1 ) ) return 1; if ( value.m_pad2 != result.m_pad2 ) return 1; if ( !cmp_ctrlstatestream( &value.m_v2, &result.m_v2 ) ) return 1; if ( !cmp_ctrlstatestream( &value.m_v3, &result.m_v3 ) ) return 1; if ( value.m_pad3 != result.m_pad3 ) return 1; return 0; } openhpi-2.14.1/marshal/t/marshal_019.c0000644000076400007640000000522611302567035014256 0ustar /* * Copyright (c) 2004 by FORCE Computers. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Thomas Kanngieser */ #include "marshal.h" #include #define dModU8 0 #define dModU16 1 #define dModU32 2 #define dModU64 3 #define dModI8 4 #define dModI16 5 #define dModI32 6 #define dModI64 7 #define dModF32 8 #define dModF64 9 typedef union { tUint8 m_u8; tUint16 m_u16; tUint32 m_u32; tUint64 m_u64; tInt8 m_i8; tInt16 m_i16; tInt32 m_i32; tInt64 m_i64; tFloat32 m_f32; tFloat64 m_f64; } cUnion; typedef struct { tUint8 m_pad1; tUint8 m_mod; tUint8 m_pad2; cUnion m_union; tUint8 m_pad3; } cTest; cMarshalType UnionElements[] = { dUnionElement( dModU8 , Marshal_Uint8Type ), dUnionElement( dModU16, Marshal_Uint16Type ), dUnionElement( dModU32, Marshal_Uint32Type ), dUnionElement( dModU64, Marshal_Uint64Type ), dUnionElement( dModI8 , Marshal_Int8Type ), dUnionElement( dModI16, Marshal_Int16Type ), dUnionElement( dModI32, Marshal_Int32Type ), dUnionElement( dModI64, Marshal_Int64Type ), dUnionElement( dModF32, Marshal_Float32Type ), dUnionElement( dModF64, Marshal_Float64Type ), dUnionElementEnd() }; cMarshalType TestUnionType = dUnion( 1, cUnion, UnionElements ); cMarshalType StructElements[] = { dStructElement( cTest, m_pad1 , Marshal_Uint8Type ), dStructElement( cTest, m_mod , Marshal_Uint8Type ), dStructElement( cTest, m_pad2 , Marshal_Uint8Type ), dStructElement( cTest, m_union, TestUnionType ), dStructElement( cTest, m_pad3 , Marshal_Uint8Type ), dStructElementEnd() }; cMarshalType TestType = dStruct( cTest, StructElements ); int main( int argc, char *argv[] ) { cTest value = { .m_pad1 = 47, .m_mod = dModU8, .m_pad2 = 48, .m_union.m_u8 = 11, .m_pad3 = 49 }; unsigned char buffer[256]; cTest result; unsigned int s1 = Marshal( &TestType, &value, buffer ); unsigned int s2 = Demarshal( MarshalByteOrder(), &TestType, &result, buffer ); if ( s1 != s2 ) return 1; if ( value.m_pad1 != result.m_pad1 ) return 1; if ( value.m_mod != result.m_mod ) return 1; if ( value.m_pad2 != result.m_pad2 ) return 1; if ( value.m_pad3 != result.m_pad3 ) return 1; if ( value.m_union.m_u8 != result.m_union.m_u8 ) return 1; return 0; } openhpi-2.14.1/marshal/t/float_format.c0000644000076400007640000001043411302567035014710 0ustar /* * Copyright (c) 2004 by FORCE Computers. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Thomas Kanngieser */ #include "marshal.h" #include #include #include #include #include #include #include #include #include #include void ReadFile( const char *filename, void *p, int size ); void WriteFile( const char *filename, void *p, int size ); static tFloat32 float32_data[] = { 0.0, 1.0, 2.0, 3.0, 0.5, 0.25, 0.75, -1.0, -2.0, -3.0, M_PI }; static int float32_data_num = sizeof( float32_data ) / sizeof( tFloat32 ); static tFloat64 float64_data[] = { 0.0, 1.0, 2.0, 3.0, 0.5, 0.25, 0.75, -1.0, -2.0, -3.0, M_PI }; static int float64_data_num = sizeof( float64_data ) / sizeof( tFloat64 ); void ReadFile( const char *filename, void *p, int size ) { int fd = open( filename, O_RDONLY ); if ( fd == -1 ) { fprintf( stderr, "cannot open %s: %s !\n", filename, strerror( errno ) ); close( fd ); return; } int rv = read( fd, p, size ); if ( rv != size ) fprintf( stderr, "cannot read %s: %s !\n", filename, strerror( errno ) ); close( fd ); } void WriteFile( const char *filename, void *p, int size ) { int fd = open(filename, O_CREAT|O_TRUNC|O_WRONLY, S_IRUSR|S_IWUSR|S_IRGRP|S_IWGRP|S_IROTH|S_IWOTH); if ( fd == -1 ) { fprintf( stderr, "cannot create %s: %s !\n", filename, strerror( errno ) ); close( fd ); return; } int rv = write( fd, p, size ); if ( rv != size ) fprintf( stderr, "cannot write to %s: %s !\n", filename, strerror( errno ) ); close( fd ); } int main( int argc, char *argv[] ) { int i; // float 32 WriteFile( "Float32.bin", float32_data, sizeof( float32_data ) ); tFloat32 f32[sizeof( float32_data ) / sizeof( tFloat32 )]; ReadFile( "Float32.bin", f32, sizeof( float32_data ) ); if ( memcmp( float32_data, f32, sizeof( float32_data ) ) ) { fprintf( stderr, "read/write float 32 error !\n" ); return 1; } // float 64 WriteFile( "Float64.bin", float64_data, sizeof( float64_data ) ); tFloat64 f64[sizeof( float64_data ) / sizeof( tFloat64 )]; ReadFile( "Float64.bin", f64, sizeof( float64_data ) ); if ( memcmp( float64_data, f64, sizeof( float64_data ) ) ) { fprintf( stderr, "read/write float 64 error !\n" ); return 1; } // conversion if ( G_BYTE_ORDER == G_LITTLE_ENDIAN ) ReadFile( "Float32.bin.ppc", f32, sizeof( float32_data ) ); else ReadFile( "Float32.bin.i386", f32, sizeof( float32_data ) ); char *p = (char *)f32; for( i = 0; i < float32_data_num; i++, p += sizeof( tFloat32 ) ) { /* compile error */ // unsigned int v = *(unsigned int *)p; unsigned int v = *(unsigned int *)(void *)p; v = GUINT32_SWAP_LE_BE( v ); /* compile error */ // *(unsigned int *)p = v; *(unsigned int *)(void *)p = v; } if ( memcmp( float32_data, f32, sizeof( float32_data ) ) ) { fprintf( stderr, "byteswap float 32 fail !\n" ); return 1; } // conversion if ( G_BYTE_ORDER == G_LITTLE_ENDIAN ) ReadFile( "Float64.bin.ppc", f64, sizeof( float64_data ) ); else ReadFile( "Float64.bin.i386", f64, sizeof( float64_data ) ); p = (char *)f64; for( i = 0; i < float64_data_num; i++, p += sizeof( tFloat64 ) ) { /* compile error */ // unsigned long long v = *(unsigned long long *)p; unsigned long long v = *(unsigned long long *)(void *)p; v = GUINT64_SWAP_LE_BE( v ); /* compile error */ // *(unsigned long long *)p = v; *(unsigned long long *)(void *)p = v; } if ( memcmp( float64_data, f64, sizeof( float64_data ) ) ) { fprintf( stderr, "byteswap float 64 fail !\n" ); return 1; } return 0; } openhpi-2.14.1/marshal/t/marshal_016.c0000644000076400007640000000154511302567035014253 0ustar /* * Copyright (c) 2004 by FORCE Computers. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Thomas Kanngieser */ #include "marshal.h" #include int main( int argc, char *argv[] ) { tInt16 value = 0x42aa; tInt16 swap = GUINT16_SWAP_LE_BE( value ); tInt16 result; unsigned int s = Demarshal( MarshalByteOrder() ? 0 : 1, &Marshal_Int16Type, &result, &swap ); if ( s != sizeof( tInt16 ) ) return 1; if ( value != result ) return 1; return 0; } openhpi-2.14.1/marshal/t/marshal_018.c0000644000076400007640000000156211302567035014254 0ustar /* * Copyright (c) 2004 by FORCE Computers. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Thomas Kanngieser */ #include "marshal.h" #include int main( int argc, char *argv[] ) { tInt64 value = 0x1234567890abcdefLL; tInt64 swap = GUINT64_SWAP_LE_BE( value ); tInt64 result; unsigned int s = Demarshal( MarshalByteOrder() ? 0 : 1, &Marshal_Int64Type, &result, &swap ); if ( s != sizeof( tInt64 ) ) return 1; if ( value != result ) return 1; return 0; } openhpi-2.14.1/marshal/t/marshal_hpi_types_036.c0000644000076400007640000000516611302567035016344 0ustar /* * Copyright (c) 2005 by IBM Corporation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * W. David Ashley */ #include "marshal_hpi_types.h" #include #include #include static int cmp_hotswapevent( SaHpiHotSwapEventT *d1, SaHpiHotSwapEventT *d2 ) { if ( d1->HotSwapState != d2->HotSwapState ) return 0; if ( d1->PreviousHotSwapState != d2->PreviousHotSwapState ) return 0; return 1; } typedef struct { tUint8 m_pad1; SaHpiHotSwapEventT m_v1; tUint8 m_pad2; SaHpiHotSwapEventT m_v2; SaHpiHotSwapEventT m_v3; tUint8 m_pad3; } cTest; cMarshalType StructElements[] = { dStructElement( cTest, m_pad1 , Marshal_Uint8Type ), dStructElement( cTest, m_v1 , SaHpiHotSwapEventType ), dStructElement( cTest, m_pad2 , Marshal_Uint8Type ), dStructElement( cTest, m_v2 , SaHpiHotSwapEventType ), dStructElement( cTest, m_v3 , SaHpiHotSwapEventType ), dStructElement( cTest, m_pad3 , Marshal_Uint8Type ), dStructElementEnd() }; cMarshalType TestType = dStruct( cTest, StructElements ); int main( int argc, char *argv[] ) { cTest value = { .m_pad1 = 47, .m_v1.HotSwapState = SAHPI_HS_STATE_INACTIVE, .m_v1.PreviousHotSwapState = SAHPI_HS_STATE_ACTIVE, .m_pad2 = 48, .m_v2.HotSwapState = SAHPI_HS_STATE_ACTIVE, .m_v2.PreviousHotSwapState = SAHPI_HS_STATE_INACTIVE, .m_v3.HotSwapState = SAHPI_HS_STATE_NOT_PRESENT, .m_v3.PreviousHotSwapState = SAHPI_HS_STATE_ACTIVE, .m_pad3 = 49 }; unsigned char *buffer = (unsigned char *)malloc(sizeof(value)); cTest result; unsigned int s1 = Marshal( &TestType, &value, buffer ); unsigned int s2 = Demarshal( MarshalByteOrder(), &TestType, &result, buffer ); if ( s1 != s2 ) return 1; if ( value.m_pad1 != result.m_pad1 ) return 1; if ( !cmp_hotswapevent( &value.m_v1, &result.m_v1 ) ) return 1; if ( value.m_pad2 != result.m_pad2 ) return 1; if ( !cmp_hotswapevent( &value.m_v2, &result.m_v2 ) ) return 1; if ( !cmp_hotswapevent( &value.m_v3, &result.m_v3 ) ) return 1; if ( value.m_pad3 != result.m_pad3 ) return 1; return 0; } openhpi-2.14.1/marshal/t/marshal_003.c0000644000076400007640000000166511302567035014252 0ustar /* * Copyright (c) 2004 by FORCE Computers. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Thomas Kanngieser */ #include "marshal.h" int main( int argc, char *argv[] ) { tUint64 value = 0xfedc12345678abcdLL; tUint64 result; unsigned char buffer[256]; unsigned int s1 = Marshal( &Marshal_Uint64Type, &value, buffer ); if ( s1 != sizeof( tUint64 ) ) return 1; unsigned int s2 = Demarshal( MarshalByteOrder(), &Marshal_Uint64Type, &result, buffer ); if ( s2 != sizeof( tUint64 ) ) return 1; if ( value != result ) return 1; return 0; } openhpi-2.14.1/marshal/t/marshal_hpi_types_040.c0000644000076400007640000000613411302567035016333 0ustar /* * Copyright (c) 2005 by IBM Corporation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * W. David Ashley */ #include "marshal_hpi_types.h" #include #include #include static int cmp_text_buffer( SaHpiTextBufferT *d1, SaHpiTextBufferT *d2 ) { if ( d1->DataType != d2->DataType ) return 0; if ( d1->Language != d2->Language ) return 0; if ( d1->DataLength != d2->DataLength ) return 0; return memcmp( d1->Data, d2->Data, d1->DataLength ) ? 0 : 1; } static int cmp_userevent( SaHpiUserEventT *d1, SaHpiUserEventT *d2 ) { if ( !cmp_text_buffer( &d1->UserEventData, &d2->UserEventData ) ) return 0; return 1; } typedef struct { tUint8 m_pad1; SaHpiUserEventT m_v1; tUint8 m_pad2; SaHpiUserEventT m_v2; SaHpiUserEventT m_v3; tUint8 m_pad3; } cTest; cMarshalType StructElements[] = { dStructElement( cTest, m_pad1 , Marshal_Uint8Type ), dStructElement( cTest, m_v1 , SaHpiUserEventType ), dStructElement( cTest, m_pad2 , Marshal_Uint8Type ), dStructElement( cTest, m_v2 , SaHpiUserEventType ), dStructElement( cTest, m_v3 , SaHpiUserEventType ), dStructElement( cTest, m_pad3 , Marshal_Uint8Type ), dStructElementEnd() }; cMarshalType TestType = dStruct( cTest, StructElements ); int main( int argc, char *argv[] ) { cTest value = { .m_pad1 = 47, .m_v1.UserEventData.DataType = SAHPI_TL_TYPE_BINARY, .m_v1.UserEventData.Language = SAHPI_LANG_TSONGA, .m_v1.UserEventData.DataLength = 3, .m_v1.UserEventData.Data = "AB", .m_pad2 = 48, .m_v2.UserEventData.DataType = SAHPI_TL_TYPE_BCDPLUS, .m_v2.UserEventData.Language = SAHPI_LANG_SANGRO, .m_v2.UserEventData.DataLength = 21, .m_v2.UserEventData.Data = "12345678901234567890", .m_v3.UserEventData.DataType = SAHPI_TL_TYPE_ASCII6, .m_v3.UserEventData.Language = SAHPI_LANG_TAJIK, .m_v3.UserEventData.DataLength = 0, .m_v3.UserEventData.Data = "", .m_pad3 = 49 }; unsigned char *buffer = (unsigned char *)malloc(sizeof(value)); cTest result; unsigned int s1 = Marshal( &TestType, &value, buffer ); unsigned int s2 = Demarshal( MarshalByteOrder(), &TestType, &result, buffer ); if ( s1 != s2 ) return 1; if ( value.m_pad1 != result.m_pad1 ) return 1; if ( !cmp_userevent( &value.m_v1, &result.m_v1 ) ) return 1; if ( value.m_pad2 != result.m_pad2 ) return 1; if ( !cmp_userevent( &value.m_v2, &result.m_v2 ) ) return 1; if ( !cmp_userevent( &value.m_v3, &result.m_v3 ) ) return 1; if ( value.m_pad3 != result.m_pad3 ) return 1; return 0; } openhpi-2.14.1/marshal/t/marshal_028.c0000644000076400007640000000402211302567035014247 0ustar /* * Copyright (c) 2004 by FORCE Computers. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Thomas Kanngieser */ #include "marshal.h" #include "marshal_hpi_types.h" #include #include typedef struct { tUint8 m_pad1; tUint8 m_size; tUint8 m_pad2; SaHpiDimiTestVariableParamsT *m_array; tUint8 m_pad3; } cTest; cMarshalType TestVarArrayType = dVarArray( SaHpiDimiTestVariableParamsType, 1 ); cMarshalType StructElements[] = { dStructElement( cTest, m_pad1 , Marshal_Uint8Type ), dStructElement( cTest, m_size , Marshal_Uint8Type ), dStructElement( cTest, m_pad2 , Marshal_Uint8Type ), dStructElement( cTest, m_array, TestVarArrayType ), dStructElement( cTest, m_pad3 , Marshal_Uint8Type ), dStructElementEnd() }; cMarshalType TestType = dStruct( cTest, StructElements ); SaHpiDimiTestVariableParamsT params_list[] = { { .ParamName = "Test Param", .ParamType = SAHPI_DIMITEST_PARAM_TYPE_INT32, .Value.paramint = 5 } }; int main( int argc, char *argv[] ) { cTest value = { .m_pad1 = 47, .m_size = 1, .m_pad2 = 48, .m_array = params_list, .m_pad3 = 49 }; unsigned char buffer[256]; cTest result; unsigned int s1 = Marshal( &TestType, &value, buffer ); unsigned int s2 = Demarshal( MarshalByteOrder(), &TestType, &result, buffer ); if ( s1 != s2 ) return 1; if ( value.m_pad1 != result.m_pad1 ) return 1; if ( value.m_size != result.m_size ) return 1; if ( value.m_pad2 != result.m_pad2 ) return 1; if ( value.m_pad3 != result.m_pad3 ) return 1; if ( memcmp( value.m_array, result.m_array, sizeof(SaHpiDimiTestVariableParamsT )) ) return 1; return 0; } openhpi-2.14.1/marshal/t/marshal_hpi_types_028.c0000644000076400007640000001513111302567035016336 0ustar /* * Copyright (c) 2005 by IBM Corporation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * W. David Ashley */ #include "marshal_hpi_types.h" #include #include #include static int cmp_text_buffer( SaHpiTextBufferT *d1, SaHpiTextBufferT *d2 ) { if ( d1->DataType != d2->DataType ) return 0; if ( d1->Language != d2->Language ) return 0; if ( d1->DataLength != d2->DataLength ) return 0; return memcmp( d1->Data, d2->Data, d1->DataLength ) ? 0 : 1; } static int cmp_entity( SaHpiEntityT *d1, SaHpiEntityT *d2 ) { if ( d1->EntityType != d2->EntityType ) return 0; if ( d1->EntityLocation != d2->EntityLocation ) return 0; return 1; } static int cmp_entitypath( SaHpiEntityPathT *d1, SaHpiEntityPathT *d2 ) { int i; for (i = 0; ; i++) { if (d1->Entry[i].EntityType == SAHPI_ENT_ROOT && d2->Entry[i].EntityType == SAHPI_ENT_ROOT) { return 1; } if ( cmp_entity(&d1->Entry[i], &d2->Entry[i]) == 0 ) return 0; } return 1; } static int cmp_name( SaHpiNameT *d1, SaHpiNameT *d2 ) { if ( d1->Length != d2->Length ) return 0; if ( memcmp(&d1->Value, &d2->Value, SA_HPI_MAX_NAME_LENGTH) != 0 ) return 0; return 1; } static int cmp_condition( SaHpiConditionT *d1, SaHpiConditionT *d2 ) { if ( d1->Type != d2->Type ) return 0; if ( !cmp_entitypath( &d1->Entity, &d2->Entity ) ) return 0; if ( d1->DomainId != d2->DomainId ) return 0; if ( d1->ResourceId != d2->ResourceId ) return 0; if ( d1->SensorNum != d2->SensorNum ) return 0; if ( d1->SensorNum != d2->SensorNum ) return 0; if ( d1->EventState != d2->EventState ) return 0; if ( !cmp_name( &d1->Name, &d2->Name ) ) return 0; if ( d1->Mid != d2->Mid ) return 0; if ( !cmp_text_buffer( &d1->Data, &d2->Data ) ) return 0; return 1; } typedef struct { tUint8 m_pad1; SaHpiConditionT m_v1; tUint8 m_pad2; SaHpiConditionT m_v2; SaHpiConditionT m_v3; tUint8 m_pad3; } cTest; cMarshalType StructElements[] = { dStructElement( cTest, m_pad1 , Marshal_Uint8Type ), dStructElement( cTest, m_v1 , SaHpiConditionType ), dStructElement( cTest, m_pad2 , Marshal_Uint8Type ), dStructElement( cTest, m_v2 , SaHpiConditionType ), dStructElement( cTest, m_v3 , SaHpiConditionType ), dStructElement( cTest, m_pad3 , Marshal_Uint8Type ), dStructElementEnd() }; cMarshalType TestType = dStruct( cTest, StructElements ); int main( int argc, char *argv[] ) { cTest value = { .m_pad1 = 47, .m_v1.Type = SAHPI_STATUS_COND_TYPE_SENSOR, .m_v1.Entity.Entry[0].EntityType = SAHPI_ENT_SYSTEM_BOARD, .m_v1.Entity.Entry[0].EntityLocation = 1, .m_v1.Entity.Entry[1].EntityType = SAHPI_ENT_POWER_UNIT, .m_v1.Entity.Entry[1].EntityLocation = 2, .m_v1.Entity.Entry[2].EntityType = SAHPI_ENT_ROOT, .m_v1.Entity.Entry[2].EntityLocation = 0, .m_v1.DomainId = SAHPI_UNSPECIFIED_DOMAIN_ID, .m_v1.ResourceId = 1, .m_v1.SensorNum = 1, .m_v1.EventState = SAHPI_ES_LOWER_MINOR, .m_v1.Name.Length = 9, .m_v1.Name.Value = "Next text", .m_v1.Mid = 3, .m_v1.Data.DataType = SAHPI_TL_TYPE_TEXT, .m_v1.Data.Language = SAHPI_LANG_ENGLISH, .m_v1.Data.DataLength = 3, .m_v1.Data.Data = "AB", .m_pad2 = 48, .m_v2.Type = SAHPI_STATUS_COND_TYPE_RESOURCE, .m_v2.Entity.Entry[0].EntityType = SAHPI_ENT_SUB_CHASSIS, .m_v2.Entity.Entry[0].EntityLocation = 1, .m_v2.Entity.Entry[1].EntityType = SAHPI_ENT_SYSTEM_BUS, .m_v2.Entity.Entry[1].EntityLocation = 2, .m_v2.Entity.Entry[2].EntityType = SAHPI_ENT_COOLING_DEVICE, .m_v2.Entity.Entry[2].EntityLocation = 3, .m_v2.Entity.Entry[3].EntityType = SAHPI_ENT_ROOT, .m_v2.Entity.Entry[3].EntityLocation = 0, .m_v2.DomainId = SAHPI_UNSPECIFIED_DOMAIN_ID, .m_v2.ResourceId = 2, .m_v2.SensorNum = 4, .m_v2.EventState = SAHPI_ES_LOWER_CRIT, .m_v2.Name.Length = 9, .m_v2.Name.Value = "Next text", .m_v2.Mid = 3, .m_v2.Data.DataType = SAHPI_TL_TYPE_TEXT, .m_v2.Data.Language = SAHPI_LANG_ENGLISH, .m_v2.Data.DataLength = 3, .m_v2.Data.Data = "AB", .m_v3.Type = SAHPI_STATUS_COND_TYPE_OEM, .m_v3.Entity.Entry[0].EntityType = SAHPI_ENT_PROCESSOR, .m_v3.Entity.Entry[0].EntityLocation = 1, .m_v3.Entity.Entry[1].EntityType = SAHPI_ENT_ROOT, .m_v3.Entity.Entry[1].EntityLocation = 0, .m_v3.DomainId = SAHPI_UNSPECIFIED_DOMAIN_ID, .m_v3.ResourceId = 3, .m_v3.SensorNum = 5, .m_v3.EventState = SAHPI_ES_UPPER_MAJOR, .m_v3.Name.Length = 9, .m_v3.Name.Value = "Next text", .m_v3.Mid = 3, .m_v3.Data.DataType = SAHPI_TL_TYPE_BINARY, .m_v3.Data.Language = SAHPI_LANG_ENGLISH, .m_v3.Data.DataLength = 3, .m_v3.Data.Data = "AB", .m_pad3 = 49 }; unsigned char *buffer = (unsigned char *)malloc(sizeof(value)); cTest result; unsigned int s1 = Marshal( &TestType, &value, buffer ); unsigned int s2 = Demarshal( MarshalByteOrder(), &TestType, &result, buffer ); if ( s1 != s2 ) return 1; if ( value.m_pad1 != result.m_pad1 ) return 1; if ( !cmp_condition( &value.m_v1, &result.m_v1 ) ) return 1; if ( value.m_pad2 != result.m_pad2 ) return 1; if ( !cmp_condition( &value.m_v2, &result.m_v2 ) ) return 1; if ( !cmp_condition( &value.m_v3, &result.m_v3 ) ) return 1; if ( value.m_pad3 != result.m_pad3 ) return 1; return 0; } openhpi-2.14.1/marshal/t/marshal_hpi_types_044.c0000644000076400007640000001631211302567035016336 0ustar /* * Copyright (c) 2005 by IBM Corporation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * W. David Ashley */ #include "marshal_hpi_types.h" #include #include #include static int cmp_text_buffer( SaHpiTextBufferT *d1, SaHpiTextBufferT *d2 ) { if ( d1->DataType != d2->DataType ) return 0; if ( d1->Language != d2->Language ) return 0; if ( d1->DataLength != d2->DataLength ) return 0; return memcmp( d1->Data, d2->Data, d1->DataLength ) ? 0 : 1; } static int cmp_domaininfo( SaHpiDomainInfoT *d1, SaHpiDomainInfoT *d2 ) { int i; if ( d1->DomainId != d2->DomainId ) return 0; if ( d1->DomainCapabilities != d2->DomainCapabilities ) return 0; if ( d1->IsPeer != d2->IsPeer ) return 0; if ( !cmp_text_buffer( &d1->DomainTag, &d2->DomainTag ) ) return 0; if ( d1->DrtUpdateCount != d2->DrtUpdateCount ) return 0; if ( d1->DrtUpdateTimestamp != d2->DrtUpdateTimestamp ) return 0; if ( d1->RptUpdateCount != d2->RptUpdateCount ) return 0; if ( d1->RptUpdateTimestamp != d2->RptUpdateTimestamp ) return 0; if ( d1->DatUpdateCount != d2->DatUpdateCount ) return 0; if ( d1->DatUpdateTimestamp != d2->DatUpdateTimestamp ) return 0; if ( d1->ActiveAlarms != d2->ActiveAlarms ) return 0; if ( d1->CriticalAlarms != d2->CriticalAlarms ) return 0; if ( d1->MajorAlarms != d2->MajorAlarms ) return 0; if ( d1->MinorAlarms != d2->MinorAlarms ) return 0; if ( d1->DatUserAlarmLimit != d2->DatUserAlarmLimit ) return 0; if ( d1->DatOverflow != d2->DatOverflow ) return 0; for (i = 0; i < 16; i++) { if ( d1->Guid[i] != d2->Guid[i] ) return 0; } return 1; } typedef struct { tUint8 m_pad1; SaHpiDomainInfoT m_v1; tUint8 m_pad2; SaHpiDomainInfoT m_v2; SaHpiDomainInfoT m_v3; tUint8 m_pad3; } cTest; cMarshalType StructElements[] = { dStructElement( cTest, m_pad1 , Marshal_Uint8Type ), dStructElement( cTest, m_v1 , SaHpiDomainInfoType ), dStructElement( cTest, m_pad2 , Marshal_Uint8Type ), dStructElement( cTest, m_v2 , SaHpiDomainInfoType ), dStructElement( cTest, m_v3 , SaHpiDomainInfoType ), dStructElement( cTest, m_pad3 , Marshal_Uint8Type ), dStructElementEnd() }; cMarshalType TestType = dStruct( cTest, StructElements ); int main( int argc, char *argv[] ) { cTest value = { .m_pad1 = 47, .m_v1.DomainId = 1, .m_v1.DomainCapabilities = 1, .m_v1.IsPeer = TRUE, .m_v1.DomainTag.DataType = SAHPI_TL_TYPE_BINARY, .m_v1.DomainTag.Language = SAHPI_LANG_TSONGA, .m_v1.DomainTag.DataLength = 3, .m_v1.DomainTag.Data = "AB", .m_v1.DrtUpdateCount = 1, .m_v1.DrtUpdateTimestamp = 1006, .m_v1.RptUpdateCount = 1, .m_v1.RptUpdateTimestamp = 1050, .m_v1.DatUpdateCount = 1, .m_v1.DatUpdateTimestamp = 1400, .m_v1.ActiveAlarms = 1, .m_v1.CriticalAlarms = 1, .m_v1.MajorAlarms = 1, .m_v1.MinorAlarms = 1, .m_v1.DatUserAlarmLimit = 1, .m_v1.DatOverflow = FALSE, .m_v1.Guid = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15}, .m_pad2 = 48, .m_v2.DomainId = 2, .m_v2.DomainCapabilities = 2, .m_v2.IsPeer = TRUE, .m_v2.DomainTag.DataType = SAHPI_TL_TYPE_BINARY, .m_v2.DomainTag.Language = SAHPI_LANG_TSONGA, .m_v2.DomainTag.DataLength = 3, .m_v2.DomainTag.Data = "AB", .m_v2.DrtUpdateCount = 1, .m_v2.DrtUpdateTimestamp = 1100, .m_v2.RptUpdateCount = 1, .m_v2.RptUpdateTimestamp = 1020, .m_v2.DatUpdateCount = 1, .m_v2.DatUpdateTimestamp = 1003, .m_v2.ActiveAlarms = 0, .m_v2.CriticalAlarms = 1, .m_v2.MajorAlarms = 0, .m_v2.MinorAlarms = 1, .m_v2.DatUserAlarmLimit = 1, .m_v2.DatOverflow = TRUE, .m_v2.Guid = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15}, .m_v3.DomainId = 3, .m_v3.DomainCapabilities = 3, .m_v3.IsPeer = FALSE, .m_v3.DomainTag.DataType = SAHPI_TL_TYPE_BINARY, .m_v3.DomainTag.Language = SAHPI_LANG_TSONGA, .m_v3.DomainTag.DataLength = 3, .m_v3.DomainTag.Data = "AB", .m_v3.DrtUpdateCount = 2, .m_v3.DrtUpdateTimestamp = 1300, .m_v3.RptUpdateCount = 1, .m_v3.RptUpdateTimestamp = 1020, .m_v3.DatUpdateCount = 6, .m_v3.DatUpdateTimestamp = 1001, .m_v3.ActiveAlarms = 1, .m_v3.CriticalAlarms = 0, .m_v3.MajorAlarms = 0, .m_v3.MinorAlarms = 0, .m_v3.DatUserAlarmLimit = 1, .m_v3.DatOverflow = TRUE, .m_v3.Guid = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15}, .m_pad3 = 49 }; unsigned char *buffer = (unsigned char *)malloc(sizeof(value)); cTest result; unsigned int s1 = Marshal( &TestType, &value, buffer ); unsigned int s2 = Demarshal( MarshalByteOrder(), &TestType, &result, buffer ); if ( s1 != s2 ) return 1; if ( value.m_pad1 != result.m_pad1 ) return 1; if ( !cmp_domaininfo( &value.m_v1, &result.m_v1 ) ) return 1; if ( value.m_pad2 != result.m_pad2 ) return 1; if ( !cmp_domaininfo( &value.m_v2, &result.m_v2 ) ) return 1; if ( !cmp_domaininfo( &value.m_v3, &result.m_v3 ) ) return 1; if ( value.m_pad3 != result.m_pad3 ) return 1; return 0; } openhpi-2.14.1/marshal/t/marshal_005.c0000644000076400007640000000164611302567035014253 0ustar /* * Copyright (c) 2004 by FORCE Computers. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Thomas Kanngieser */ #include "marshal.h" int main( int argc, char *argv[] ) { tInt16 value = 0x42aa; tInt16 result; unsigned char buffer[256]; unsigned int s1 = Marshal( &Marshal_Int16Type, &value, buffer ); if ( s1 != sizeof( tInt16 ) ) return 1; unsigned int s2 = Demarshal( MarshalByteOrder(), &Marshal_Int16Type, &result, buffer ); if ( s2 != sizeof( tInt16 ) ) return 1; if ( value != result ) return 1; return 0; } openhpi-2.14.1/marshal/t/marshal_hpi_types_020.c0000644000076400007640000001041311302567035016324 0ustar /* * Copyright (c) 2005 by IBM Corporation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * W. David Ashley */ #include "marshal_hpi_types.h" #include #include #include static int cmp_ctrlrecanalog( SaHpiCtrlRecAnalogT *d1, SaHpiCtrlRecAnalogT *d2 ) { if ( d1->Min != d2->Min ) return 0; if ( d1->Max != d2->Max ) return 0; if ( d1->Default != d2->Default ) return 0; return 1; } static int cmp_ctrldefaultmode( SaHpiCtrlDefaultModeT *d1, SaHpiCtrlDefaultModeT *d2 ) { if ( d1->Mode != d2->Mode ) return 0; if ( d1->ReadOnly != d2->ReadOnly ) return 0; return 1; } static int cmp_ctrlrec( SaHpiCtrlRecT *d1, SaHpiCtrlRecT *d2 ) { if ( d1->Num != d2->Num ) return 0; if ( d1->OutputType != d2->OutputType ) return 0; if ( d1->Type != d2->Type ) return 0; if ( !cmp_ctrlrecanalog( &d1->TypeUnion.Analog, &d2->TypeUnion.Analog ) ) return 0; if ( !cmp_ctrldefaultmode( &d1->DefaultMode, &d2->DefaultMode ) ) return 0; if ( d1->WriteOnly != d2->WriteOnly ) return 0; if ( d1->Oem != d2->Oem ) return 0; return 1; } typedef struct { tUint8 m_pad1; SaHpiCtrlRecT m_v1; tUint8 m_pad2; SaHpiCtrlRecT m_v2; SaHpiCtrlRecT m_v3; tUint8 m_pad3; } cTest; cMarshalType StructElements[] = { dStructElement( cTest, m_pad1 , Marshal_Uint8Type ), dStructElement( cTest, m_v1 , SaHpiCtrlRecType ), dStructElement( cTest, m_pad2 , Marshal_Uint8Type ), dStructElement( cTest, m_v2 , SaHpiCtrlRecType ), dStructElement( cTest, m_v3 , SaHpiCtrlRecType ), dStructElement( cTest, m_pad3 , Marshal_Uint8Type ), dStructElementEnd() }; cMarshalType TestType = dStruct( cTest, StructElements ); int main( int argc, char *argv[] ) { cTest value = { .m_pad1 = 47, .m_v1.Num = 1, .m_v1.OutputType = SAHPI_CTRL_GENERIC, .m_v1.Type = SAHPI_CTRL_TYPE_ANALOG, .m_v1.TypeUnion.Analog.Min = -5, .m_v1.TypeUnion.Analog.Max = 5, .m_v1.TypeUnion.Analog.Default = 0, .m_v1.DefaultMode.Mode = SAHPI_CTRL_MODE_AUTO, .m_v1.DefaultMode.ReadOnly = FALSE, .m_v1.WriteOnly = FALSE, .m_v1.Oem = 0, .m_pad2 = 48, .m_v2.Num = 1, .m_v2.OutputType = SAHPI_CTRL_FAN_SPEED, .m_v2.Type = SAHPI_CTRL_TYPE_ANALOG, .m_v2.TypeUnion.Analog.Min = -10, .m_v2.TypeUnion.Analog.Max = 3, .m_v2.TypeUnion.Analog.Default = 1, .m_v2.DefaultMode.Mode = SAHPI_CTRL_MODE_AUTO, .m_v2.DefaultMode.ReadOnly = TRUE, .m_v2.WriteOnly = FALSE, .m_v2.Oem = 0, .m_v3.Num = 1, .m_v3.OutputType = SAHPI_CTRL_AUDIBLE, .m_v3.Type = SAHPI_CTRL_TYPE_ANALOG, .m_v3.TypeUnion.Analog.Min = 0, .m_v3.TypeUnion.Analog.Max = 20, .m_v3.TypeUnion.Analog.Default = 10, .m_v3.DefaultMode.Mode = SAHPI_CTRL_MODE_MANUAL, .m_v3.DefaultMode.ReadOnly = FALSE, .m_v3.WriteOnly = TRUE, .m_v3.Oem = 0, .m_pad3 = 49 }; unsigned char *buffer = (unsigned char *)malloc(sizeof(value)); cTest result; unsigned int s1 = Marshal( &TestType, &value, buffer ); unsigned int s2 = Demarshal( MarshalByteOrder(), &TestType, &result, buffer ); if ( s1 != s2 ) return 1; if ( value.m_pad1 != result.m_pad1 ) return 1; if ( !cmp_ctrlrec( &value.m_v1, &result.m_v1 ) ) return 1; if ( value.m_pad2 != result.m_pad2 ) return 1; if ( !cmp_ctrlrec( &value.m_v2, &result.m_v2 ) ) return 1; if ( !cmp_ctrlrec( &value.m_v3, &result.m_v3 ) ) return 1; if ( value.m_pad3 != result.m_pad3 ) return 1; return 0; } openhpi-2.14.1/marshal/t/marshal_hpi_types_008.c0000644000076400007640000003472411302567035016345 0ustar /* * Copyright (c) 2005 by IBM Corporation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * W. David Ashley */ #include "marshal_hpi_types.h" #include #include #include static int cmp_sensorreading( SaHpiSensorReadingT *d1, SaHpiSensorReadingT *d2 ) { if ( d1->IsSupported != d2->IsSupported ) return 0; if ( d1->Type != d2->Type ) return 0; if ( d1->Value.SensorInt64 != d2->Value.SensorInt64 ) return 0; return 1; } static int cmp_thddefn( SaHpiSensorThdDefnT *d1, SaHpiSensorThdDefnT *d2 ) { if ( d1->IsAccessible != d2->IsAccessible ) return 0; if ( d1->ReadThold != d2->ReadThold ) return 0; if ( d1->WriteThold != d2->WriteThold ) return 0; if ( d1->Nonlinear != d2->Nonlinear ) return 0; return 1; } typedef struct { tUint8 m_pad1; SaHpiSensorRecT m_v1; tUint8 m_pad2; SaHpiSensorRecT m_v2; SaHpiSensorRecT m_v3; tUint8 m_pad3; } cTest; cMarshalType StructElements[] = { dStructElement( cTest, m_pad1 , Marshal_Uint8Type ), dStructElement( cTest, m_v1 , SaHpiSensorRecType ), dStructElement( cTest, m_pad2 , Marshal_Uint8Type ), dStructElement( cTest, m_v2 , SaHpiSensorRecType ), dStructElement( cTest, m_v3 , SaHpiSensorRecType ), dStructElement( cTest, m_pad3 , Marshal_Uint8Type ), dStructElementEnd() }; cMarshalType TestType = dStruct( cTest, StructElements ); int main( int argc, char *argv[] ) { cTest value = { .m_pad1 = 47, .m_v1.Num = 1, .m_v1.Type = SAHPI_TEMPERATURE, .m_v1.Category = SAHPI_EC_GENERIC || SAHPI_EC_SENSOR_SPECIFIC, .m_v1.EnableCtrl = TRUE, .m_v1.EventCtrl = SAHPI_SEC_READ_ONLY, .m_v1.Events = SAHPI_EC_GENERIC || SAHPI_EC_SENSOR_SPECIFIC, .m_v1.DataFormat.IsSupported = TRUE, .m_v1.DataFormat.ReadingType = SAHPI_SENSOR_READING_TYPE_INT64, .m_v1.DataFormat.BaseUnits = SAHPI_SU_DEGREES_C, .m_v1.DataFormat.ModifierUnits = SAHPI_SU_DEGREES_C, .m_v1.DataFormat.ModifierUse = SAHPI_SMUU_NONE, .m_v1.DataFormat.Percentage = TRUE, .m_v1.DataFormat.Range.Flags = SAHPI_SRF_MIN | SAHPI_SRF_MAX | SAHPI_SRF_NORMAL_MIN | SAHPI_SRF_NORMAL_MAX | SAHPI_SRF_NOMINAL, .m_v1.DataFormat.Range.Max.IsSupported = TRUE, .m_v1.DataFormat.Range.Max.Type = SAHPI_SENSOR_READING_TYPE_INT64, .m_v1.DataFormat.Range.Max.Value = {10}, .m_v1.DataFormat.Range.Min.IsSupported = TRUE, .m_v1.DataFormat.Range.Min.Type = SAHPI_SENSOR_READING_TYPE_INT64, .m_v1.DataFormat.Range.Min.Value = {-10}, .m_v1.DataFormat.Range.Nominal.IsSupported = TRUE, .m_v1.DataFormat.Range.Nominal.Type = SAHPI_SENSOR_READING_TYPE_INT64, .m_v1.DataFormat.Range.Nominal.Value = {0}, .m_v1.DataFormat.Range.NormalMax.IsSupported = TRUE, .m_v1.DataFormat.Range.NormalMax.Type = SAHPI_SENSOR_READING_TYPE_INT64, .m_v1.DataFormat.Range.NormalMax.Value = {5}, .m_v1.DataFormat.Range.NormalMin.IsSupported = TRUE, .m_v1.DataFormat.Range.NormalMin.Type = SAHPI_SENSOR_READING_TYPE_INT64, .m_v1.DataFormat.Range.NormalMin.Value = {-5}, .m_v1.DataFormat.AccuracyFactor = 0, .m_v1.ThresholdDefn.IsAccessible = TRUE, .m_v1.ThresholdDefn.ReadThold = SAHPI_STM_LOW_MINOR, .m_v1.ThresholdDefn.WriteThold = SAHPI_STM_UP_CRIT, .m_v1.ThresholdDefn.Nonlinear = FALSE, .m_v1.Oem = 0, .m_pad2 = 48, .m_v2.Num = 2, .m_v2.Type = SAHPI_TEMPERATURE, .m_v2.Category = SAHPI_EC_GENERIC || SAHPI_EC_SENSOR_SPECIFIC, .m_v2.EnableCtrl = FALSE, .m_v2.EventCtrl = SAHPI_SEC_READ_ONLY, .m_v2.Events = SAHPI_EC_GENERIC || SAHPI_EC_SENSOR_SPECIFIC, .m_v2.DataFormat.IsSupported = TRUE, .m_v2.DataFormat.ReadingType = SAHPI_SENSOR_READING_TYPE_INT64, .m_v2.DataFormat.BaseUnits = SAHPI_SU_DEGREES_C, .m_v2.DataFormat.ModifierUnits = SAHPI_SU_DEGREES_C, .m_v2.DataFormat.ModifierUse = SAHPI_SMUU_NONE, .m_v2.DataFormat.Percentage = FALSE, .m_v2.DataFormat.Range.Flags = SAHPI_SRF_MIN | SAHPI_SRF_MAX | SAHPI_SRF_NORMAL_MIN | SAHPI_SRF_NORMAL_MAX | SAHPI_SRF_NOMINAL, .m_v2.DataFormat.Range.Max.IsSupported = TRUE, .m_v2.DataFormat.Range.Max.Type = SAHPI_SENSOR_READING_TYPE_INT64, .m_v2.DataFormat.Range.Max.Value = {10}, .m_v2.DataFormat.Range.Min.IsSupported = FALSE, .m_v2.DataFormat.Range.Min.Type = SAHPI_SENSOR_READING_TYPE_INT64, .m_v2.DataFormat.Range.Min.Value = {-10}, .m_v2.DataFormat.Range.Nominal.IsSupported = TRUE, .m_v2.DataFormat.Range.Nominal.Type = SAHPI_SENSOR_READING_TYPE_INT64, .m_v2.DataFormat.Range.Nominal.Value = {0}, .m_v2.DataFormat.Range.NormalMax.IsSupported = TRUE, .m_v2.DataFormat.Range.NormalMax.Type = SAHPI_SENSOR_READING_TYPE_INT64, .m_v2.DataFormat.Range.NormalMax.Value = {5}, .m_v2.DataFormat.Range.NormalMin.IsSupported = TRUE, .m_v2.DataFormat.Range.NormalMin.Type = SAHPI_SENSOR_READING_TYPE_INT64, .m_v2.DataFormat.Range.NormalMin.Value = {-5}, .m_v2.DataFormat.AccuracyFactor = 0, .m_v2.ThresholdDefn.IsAccessible = FALSE, .m_v2.ThresholdDefn.ReadThold = SAHPI_STM_LOW_MINOR, .m_v2.ThresholdDefn.WriteThold = SAHPI_STM_UP_CRIT, .m_v2.ThresholdDefn.Nonlinear = FALSE, .m_v2.Oem = 0, .m_v3.Num = 3, .m_v3.Type = SAHPI_TEMPERATURE, .m_v3.Category = SAHPI_EC_GENERIC || SAHPI_EC_SENSOR_SPECIFIC, .m_v3.EnableCtrl = TRUE, .m_v3.EventCtrl = SAHPI_SEC_READ_ONLY, .m_v3.Events = SAHPI_EC_GENERIC || SAHPI_EC_SENSOR_SPECIFIC, .m_v3.DataFormat.IsSupported = TRUE, .m_v3.DataFormat.ReadingType = SAHPI_SENSOR_READING_TYPE_INT64, .m_v3.DataFormat.BaseUnits = SAHPI_SU_DEGREES_C, .m_v3.DataFormat.ModifierUnits = SAHPI_SU_DEGREES_C, .m_v3.DataFormat.ModifierUse = SAHPI_SMUU_NONE, .m_v3.DataFormat.Percentage = TRUE, .m_v3.DataFormat.Range.Flags = SAHPI_SRF_MIN | SAHPI_SRF_MAX | SAHPI_SRF_NORMAL_MIN | SAHPI_SRF_NORMAL_MAX | SAHPI_SRF_NOMINAL, .m_v3.DataFormat.Range.Max.IsSupported = FALSE, .m_v3.DataFormat.Range.Max.Type = SAHPI_SENSOR_READING_TYPE_INT64, .m_v3.DataFormat.Range.Max.Value = {10}, .m_v3.DataFormat.Range.Min.IsSupported = FALSE, .m_v3.DataFormat.Range.Min.Type = SAHPI_SENSOR_READING_TYPE_INT64, .m_v3.DataFormat.Range.Min.Value = {-10}, .m_v3.DataFormat.Range.Nominal.IsSupported = TRUE, .m_v3.DataFormat.Range.Nominal.Type = SAHPI_SENSOR_READING_TYPE_INT64, .m_v3.DataFormat.Range.Nominal.Value = {0}, .m_v3.DataFormat.Range.NormalMax.IsSupported = FALSE, .m_v3.DataFormat.Range.NormalMax.Type = SAHPI_SENSOR_READING_TYPE_INT64, .m_v3.DataFormat.Range.NormalMax.Value = {5}, .m_v3.DataFormat.Range.NormalMin.IsSupported = TRUE, .m_v3.DataFormat.Range.NormalMin.Type = SAHPI_SENSOR_READING_TYPE_INT64, .m_v3.DataFormat.Range.NormalMin.Value = {-5}, .m_v3.DataFormat.AccuracyFactor = 0, .m_v3.ThresholdDefn.IsAccessible = TRUE, .m_v3.ThresholdDefn.ReadThold = SAHPI_STM_LOW_MINOR, .m_v3.ThresholdDefn.WriteThold = SAHPI_STM_UP_CRIT, .m_v3.ThresholdDefn.Nonlinear = TRUE, .m_v2.Oem = 0, .m_pad3 = 49 }; unsigned char *buffer = (unsigned char *)malloc(sizeof(value)); cTest result; unsigned int s1 = Marshal( &TestType, &value, buffer ); unsigned int s2 = Demarshal( MarshalByteOrder(), &TestType, &result, buffer ); if ( s1 != s2 ) return 1; if ( value.m_pad1 != result.m_pad1 ) return 1; if ( value.m_v1.Num != result.m_v1.Num ) return 1; if ( value.m_v1.Type != result.m_v1.Type ) return 1; if ( value.m_v1.Category != result.m_v1.Category ) return 1; if ( value.m_v1.EnableCtrl != result.m_v1.EnableCtrl ) return 1; if ( value.m_v1.EventCtrl != result.m_v1.EventCtrl ) return 1; if ( value.m_v1.Events != result.m_v1.Events ) return 1; if ( value.m_v1.DataFormat.IsSupported != result.m_v1.DataFormat.IsSupported ) return 1; if ( value.m_v1.DataFormat.ReadingType != result.m_v1.DataFormat.ReadingType ) return 1; if ( value.m_v1.DataFormat.BaseUnits != result.m_v1.DataFormat.BaseUnits ) return 1; if ( value.m_v1.DataFormat.ModifierUnits != result.m_v1.DataFormat.ModifierUnits ) return 1; if ( value.m_v1.DataFormat.ModifierUse != result.m_v1.DataFormat.ModifierUse ) return 1; if ( value.m_v1.DataFormat.Percentage != result.m_v1.DataFormat.Percentage ) return 1; if ( !cmp_sensorreading( &value.m_v1.DataFormat.Range.Max, &result.m_v1.DataFormat.Range.Max ) ) return 1; if ( !cmp_sensorreading( &value.m_v1.DataFormat.Range.Min, &result.m_v1.DataFormat.Range.Min ) ) return 1; if ( !cmp_sensorreading( &value.m_v1.DataFormat.Range.Nominal, &result.m_v1.DataFormat.Range.Nominal ) ) return 1; if ( !cmp_sensorreading( &value.m_v1.DataFormat.Range.NormalMax, &result.m_v1.DataFormat.Range.NormalMax ) ) return 1; if ( !cmp_sensorreading( &value.m_v1.DataFormat.Range.NormalMin, &result.m_v1.DataFormat.Range.NormalMin ) ) return 1; if ( value.m_v1.DataFormat.AccuracyFactor != result.m_v1.DataFormat.AccuracyFactor ) return 1; if ( !cmp_thddefn( &value.m_v1.ThresholdDefn, &result.m_v1.ThresholdDefn ) ) return 1; if ( value.m_v1.Oem != result.m_v1.Oem ) return 1; if ( value.m_pad2 != result.m_pad2 ) return 1; if ( value.m_v2.Num != result.m_v2.Num ) return 1; if ( value.m_v2.Type != result.m_v2.Type ) return 1; if ( value.m_v2.Category != result.m_v2.Category ) return 1; if ( value.m_v2.EnableCtrl != result.m_v2.EnableCtrl ) return 1; if ( value.m_v2.EventCtrl != result.m_v2.EventCtrl ) return 1; if ( value.m_v2.Events != result.m_v2.Events ) return 1; if ( value.m_v2.DataFormat.IsSupported != result.m_v2.DataFormat.IsSupported ) return 1; if ( value.m_v2.DataFormat.ReadingType != result.m_v2.DataFormat.ReadingType ) return 1; if ( value.m_v2.DataFormat.BaseUnits != result.m_v2.DataFormat.BaseUnits ) return 1; if ( value.m_v2.DataFormat.ModifierUnits != result.m_v2.DataFormat.ModifierUnits ) return 1; if ( value.m_v2.DataFormat.ModifierUse != result.m_v2.DataFormat.ModifierUse ) return 1; if ( value.m_v2.DataFormat.Percentage != result.m_v2.DataFormat.Percentage ) return 1; if ( !cmp_sensorreading( &value.m_v2.DataFormat.Range.Max, &result.m_v2.DataFormat.Range.Max ) ) return 1; if ( !cmp_sensorreading( &value.m_v2.DataFormat.Range.Min, &result.m_v2.DataFormat.Range.Min ) ) return 1; if ( !cmp_sensorreading( &value.m_v2.DataFormat.Range.Nominal, &result.m_v2.DataFormat.Range.Nominal ) ) return 1; if ( !cmp_sensorreading( &value.m_v2.DataFormat.Range.NormalMax, &result.m_v2.DataFormat.Range.NormalMax ) ) return 1; if ( !cmp_sensorreading( &value.m_v2.DataFormat.Range.NormalMin, &result.m_v2.DataFormat.Range.NormalMin ) ) return 1; if ( value.m_v2.DataFormat.AccuracyFactor != result.m_v2.DataFormat.AccuracyFactor ) return 1; if ( !cmp_thddefn( &value.m_v2.ThresholdDefn, &result.m_v2.ThresholdDefn ) ) return 1; if ( value.m_v2.Oem != result.m_v2.Oem ) return 1; if ( value.m_v3.Num != result.m_v3.Num ) return 1; if ( value.m_v3.Type != result.m_v3.Type ) return 1; if ( value.m_v3.Category != result.m_v3.Category ) return 1; if ( value.m_v3.EnableCtrl != result.m_v3.EnableCtrl ) return 1; if ( value.m_v3.EventCtrl != result.m_v3.EventCtrl ) return 1; if ( value.m_v3.Events != result.m_v3.Events ) return 1; if ( value.m_v3.DataFormat.IsSupported != result.m_v3.DataFormat.IsSupported ) return 1; if ( value.m_v3.DataFormat.ReadingType != result.m_v3.DataFormat.ReadingType ) return 1; if ( value.m_v3.DataFormat.BaseUnits != result.m_v3.DataFormat.BaseUnits ) return 1; if ( value.m_v3.DataFormat.ModifierUnits != result.m_v3.DataFormat.ModifierUnits ) return 1; if ( value.m_v3.DataFormat.ModifierUse != result.m_v3.DataFormat.ModifierUse ) return 1; if ( value.m_v3.DataFormat.Percentage != result.m_v3.DataFormat.Percentage ) return 1; if ( !cmp_sensorreading( &value.m_v3.DataFormat.Range.Max, &result.m_v3.DataFormat.Range.Max ) ) return 1; if ( !cmp_sensorreading( &value.m_v3.DataFormat.Range.Min, &result.m_v3.DataFormat.Range.Min ) ) return 1; if ( !cmp_sensorreading( &value.m_v3.DataFormat.Range.Nominal, &result.m_v3.DataFormat.Range.Nominal ) ) return 1; if ( !cmp_sensorreading( &value.m_v3.DataFormat.Range.NormalMax, &result.m_v3.DataFormat.Range.NormalMax ) ) return 1; if ( !cmp_sensorreading( &value.m_v3.DataFormat.Range.NormalMin, &result.m_v3.DataFormat.Range.NormalMin ) ) return 1; if ( value.m_v3.DataFormat.AccuracyFactor != result.m_v3.DataFormat.AccuracyFactor ) return 1; if ( !cmp_thddefn( &value.m_v3.ThresholdDefn, &result.m_v3.ThresholdDefn ) ) return 1; if ( value.m_v3.Oem != result.m_v3.Oem ) return 1; if ( value.m_pad3 != result.m_pad3 ) return 1; return 0; } openhpi-2.14.1/marshal/t/marshal_hpi_types_027.c0000644000076400007640000000453111302567035016337 0ustar /* * Copyright (c) 2005 by IBM Corporation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * W. David Ashley */ #include "marshal_hpi_types.h" #include #include #include static int cmp_name( SaHpiNameT *d1, SaHpiNameT *d2 ) { if ( d1->Length != d2->Length ) return 0; if ( memcmp(&d1->Value, &d2->Value, SA_HPI_MAX_NAME_LENGTH) != 0 ) return 0; return 1; } typedef struct { tUint8 m_pad1; SaHpiNameT m_v1; tUint8 m_pad2; SaHpiNameT m_v2; SaHpiNameT m_v3; tUint8 m_pad3; } cTest; cMarshalType StructElements[] = { dStructElement( cTest, m_pad1 , Marshal_Uint8Type ), dStructElement( cTest, m_v1 , SaHpiNameType ), dStructElement( cTest, m_pad2 , Marshal_Uint8Type ), dStructElement( cTest, m_v2 , SaHpiNameType ), dStructElement( cTest, m_v3 , SaHpiNameType ), dStructElement( cTest, m_pad3 , Marshal_Uint8Type ), dStructElementEnd() }; cMarshalType TestType = dStruct( cTest, StructElements ); int main( int argc, char *argv[] ) { cTest value = { .m_pad1 = 47, .m_v1.Length = 7, .m_v1.Value = "My text", .m_pad2 = 48, .m_v2.Length = 9, .m_v2.Value = "Next text", .m_v3.Length = 15, .m_v3.Value = "My text my text", .m_pad3 = 49 }; unsigned char *buffer = (unsigned char *)malloc(sizeof(value)); cTest result; unsigned int s1 = Marshal( &TestType, &value, buffer ); unsigned int s2 = Demarshal( MarshalByteOrder(), &TestType, &result, buffer ); if ( s1 != s2 ) return 1; if ( value.m_pad1 != result.m_pad1 ) return 1; if ( !cmp_name( &value.m_v1, &result.m_v1 ) ) return 1; if ( value.m_pad2 != result.m_pad2 ) return 1; if ( !cmp_name( &value.m_v2, &result.m_v2 ) ) return 1; if ( !cmp_name( &value.m_v3, &result.m_v3 ) ) return 1; if ( value.m_pad3 != result.m_pad3 ) return 1; return 0; } openhpi-2.14.1/marshal/t/marshal_hpi_types_048.c0000644000076400007640000001175011302567035016343 0ustar /* * Copyright (c) 2005 by IBM Corporation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * W. David Ashley */ #include "marshal_hpi_types.h" #include #include #include static int cmp_text_buffer( SaHpiTextBufferT *d1, SaHpiTextBufferT *d2 ) { if ( d1->DataType != d2->DataType ) return 0; if ( d1->Language != d2->Language ) return 0; if ( d1->DataLength != d2->DataLength ) return 0; return memcmp( d1->Data, d2->Data, d1->DataLength ) ? 0 : 1; } static int cmp_userevent( SaHpiUserEventT *d1, SaHpiUserEventT *d2 ) { if ( !cmp_text_buffer( &d1->UserEventData, &d2->UserEventData ) ) return 0; return 1; } static int cmp_event( SaHpiEventT *d1, SaHpiEventT *d2 ) { if ( d1->Source != d2->Source ) return 0; if ( d1->EventType != d2->EventType ) return 0; if ( d1->Timestamp != d2->Timestamp ) return 0; if ( !cmp_userevent( &d1->EventDataUnion.UserEvent, &d2->EventDataUnion.UserEvent ) ) return 0; return 1; } static int cmp_eventlogentry( SaHpiEventLogEntryT *d1, SaHpiEventLogEntryT *d2 ) { if ( d1->EntryId != d2->EntryId ) return 0; if ( d1->Timestamp != d2->Timestamp ) return 0; if ( !cmp_event( &d1->Event, &d2->Event ) ) return 0; return 1; } typedef struct { tUint8 m_pad1; SaHpiEventLogEntryT m_v1; tUint8 m_pad2; SaHpiEventLogEntryT m_v2; SaHpiEventLogEntryT m_v3; tUint8 m_pad3; } cTest; cMarshalType StructElements[] = { dStructElement( cTest, m_pad1 , Marshal_Uint8Type ), dStructElement( cTest, m_v1 , SaHpiEventLogEntryType ), dStructElement( cTest, m_pad2 , Marshal_Uint8Type ), dStructElement( cTest, m_v2 , SaHpiEventLogEntryType ), dStructElement( cTest, m_v3 , SaHpiEventLogEntryType ), dStructElement( cTest, m_pad3 , Marshal_Uint8Type ), dStructElementEnd() }; cMarshalType TestType = dStruct( cTest, StructElements ); int main( int argc, char *argv[] ) { cTest value = { .m_pad1 = 47, .m_v1.EntryId = 1, .m_v1.Timestamp = 1000, .m_v1.Event.Source = 1, .m_v1.Event.EventType = SAHPI_ET_USER, .m_v1.Event.Timestamp = 1000, .m_v1.Event.EventDataUnion.UserEvent.UserEventData.DataType = SAHPI_TL_TYPE_BINARY, .m_v1.Event.EventDataUnion.UserEvent.UserEventData.Language = SAHPI_LANG_TSONGA, .m_v1.Event.EventDataUnion.UserEvent.UserEventData.DataLength = 3, .m_v1.Event.EventDataUnion.UserEvent.UserEventData.Data = "AB", .m_pad2 = 48, .m_v2.EntryId = 2, .m_v2.Timestamp = 2000, .m_v2.Event.Source = 2, .m_v2.Event.EventType = SAHPI_ET_USER, .m_v2.Event.Timestamp = 1200, .m_v2.Event.EventDataUnion.UserEvent.UserEventData.DataType = SAHPI_TL_TYPE_BCDPLUS, .m_v2.Event.EventDataUnion.UserEvent.UserEventData.Language = SAHPI_LANG_SANGRO, .m_v2.Event.EventDataUnion.UserEvent.UserEventData.DataLength = 21, .m_v2.Event.EventDataUnion.UserEvent.UserEventData.Data = "12345678901234567890", .m_v3.EntryId = 3, .m_v3.Timestamp = 3000, .m_v3.Event.Source = 3, .m_v3.Event.EventType = SAHPI_ET_USER, .m_v3.Event.Timestamp = 1030, .m_v3.Event.EventDataUnion.UserEvent.UserEventData.DataType = SAHPI_TL_TYPE_ASCII6, .m_v3.Event.EventDataUnion.UserEvent.UserEventData.Language = SAHPI_LANG_TAJIK, .m_v3.Event.EventDataUnion.UserEvent.UserEventData.DataLength = 0, .m_v3.Event.EventDataUnion.UserEvent.UserEventData.Data = "", .m_pad3 = 49 }; unsigned char *buffer = (unsigned char *)malloc(sizeof(value)); cTest result; unsigned int s1 = Marshal( &TestType, &value, buffer ); unsigned int s2 = Demarshal( MarshalByteOrder(), &TestType, &result, buffer ); if ( s1 != s2 ) return 1; if ( value.m_pad1 != result.m_pad1 ) return 1; if ( !cmp_eventlogentry( &value.m_v1, &result.m_v1 ) ) return 1; if ( value.m_pad2 != result.m_pad2 ) return 1; if ( !cmp_eventlogentry( &value.m_v2, &result.m_v2 ) ) return 1; if ( !cmp_eventlogentry( &value.m_v3, &result.m_v3 ) ) return 1; if ( value.m_pad3 != result.m_pad3 ) return 1; return 0; } openhpi-2.14.1/marshal/t/marshal_hpi_types_023.c0000644000076400007640000000515211302567035016333 0ustar /* * Copyright (c) 2005 by IBM Corporation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * W. David Ashley */ #include "marshal_hpi_types.h" #include #include #include static int cmp_idrinfo( SaHpiIdrInfoT *d1, SaHpiIdrInfoT *d2 ) { if ( d1->IdrId != d2->IdrId ) return 0; if ( d1->UpdateCount != d2->UpdateCount ) return 0; if ( d1->ReadOnly != d2->ReadOnly ) return 0; if ( d1->NumAreas != d2->NumAreas ) return 0; return 1; } typedef struct { tUint8 m_pad1; SaHpiIdrInfoT m_v1; tUint8 m_pad2; SaHpiIdrInfoT m_v2; SaHpiIdrInfoT m_v3; tUint8 m_pad3; } cTest; cMarshalType StructElements[] = { dStructElement( cTest, m_pad1 , Marshal_Uint8Type ), dStructElement( cTest, m_v1 , SaHpiIdrInfoType ), dStructElement( cTest, m_pad2 , Marshal_Uint8Type ), dStructElement( cTest, m_v2 , SaHpiIdrInfoType ), dStructElement( cTest, m_v3 , SaHpiIdrInfoType ), dStructElement( cTest, m_pad3 , Marshal_Uint8Type ), dStructElementEnd() }; cMarshalType TestType = dStruct( cTest, StructElements ); int main( int argc, char *argv[] ) { cTest value = { .m_pad1 = 47, .m_v1.IdrId = 1, .m_v1.UpdateCount = 1, .m_v1.ReadOnly = FALSE, .m_v1.NumAreas = 1, .m_pad2 = 48, .m_v2.IdrId = 2, .m_v2.UpdateCount = 23, .m_v2.ReadOnly = FALSE, .m_v2.NumAreas = 3, .m_v3.IdrId = 3, .m_v3.UpdateCount = 10, .m_v3.ReadOnly = TRUE, .m_v3.NumAreas = 2, .m_pad3 = 49 }; unsigned char *buffer = (unsigned char *)malloc(sizeof(value)); cTest result; unsigned int s1 = Marshal( &TestType, &value, buffer ); unsigned int s2 = Demarshal( MarshalByteOrder(), &TestType, &result, buffer ); if ( s1 != s2 ) return 1; if ( value.m_pad1 != result.m_pad1 ) return 1; if ( !cmp_idrinfo( &value.m_v1, &result.m_v1 ) ) return 1; if ( value.m_pad2 != result.m_pad2 ) return 1; if ( !cmp_idrinfo( &value.m_v2, &result.m_v2 ) ) return 1; if ( !cmp_idrinfo( &value.m_v3, &result.m_v3 ) ) return 1; if ( value.m_pad3 != result.m_pad3 ) return 1; return 0; } openhpi-2.14.1/marshal/t/marshal_hpi_types_024.c0000644000076400007640000000477711302567035016350 0ustar /* * Copyright (c) 2005 by IBM Corporation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * W. David Ashley */ #include "marshal_hpi_types.h" #include #include #include static int cmp_inventoryrec( SaHpiInventoryRecT *d1, SaHpiInventoryRecT *d2 ) { if ( d1->IdrId != d2->IdrId ) return 0; if ( d1->Persistent != d2->Persistent ) return 0; if ( d1->Oem != d2->Oem ) return 0; return 1; } typedef struct { tUint8 m_pad1; SaHpiInventoryRecT m_v1; tUint8 m_pad2; SaHpiInventoryRecT m_v2; SaHpiInventoryRecT m_v3; tUint8 m_pad3; } cTest; cMarshalType StructElements[] = { dStructElement( cTest, m_pad1 , Marshal_Uint8Type ), dStructElement( cTest, m_v1 , SaHpiInventoryRecType ), dStructElement( cTest, m_pad2 , Marshal_Uint8Type ), dStructElement( cTest, m_v2 , SaHpiInventoryRecType ), dStructElement( cTest, m_v3 , SaHpiInventoryRecType ), dStructElement( cTest, m_pad3 , Marshal_Uint8Type ), dStructElementEnd() }; cMarshalType TestType = dStruct( cTest, StructElements ); int main( int argc, char *argv[] ) { cTest value = { .m_pad1 = 47, .m_v1.IdrId = 1, .m_v1.Persistent = TRUE, .m_v1.Oem = 0, .m_pad2 = 48, .m_v2.IdrId = 2, .m_v2.Persistent = FALSE, .m_v2.Oem = 3, .m_v3.IdrId = 3, .m_v3.Persistent = TRUE, .m_v3.Oem = 2, .m_pad3 = 49 }; unsigned char *buffer = (unsigned char *)malloc(sizeof(value)); cTest result; unsigned int s1 = Marshal( &TestType, &value, buffer ); unsigned int s2 = Demarshal( MarshalByteOrder(), &TestType, &result, buffer ); if ( s1 != s2 ) return 1; if ( value.m_pad1 != result.m_pad1 ) return 1; if ( !cmp_inventoryrec( &value.m_v1, &result.m_v1 ) ) return 1; if ( value.m_pad2 != result.m_pad2 ) return 1; if ( !cmp_inventoryrec( &value.m_v2, &result.m_v2 ) ) return 1; if ( !cmp_inventoryrec( &value.m_v3, &result.m_v3 ) ) return 1; if ( value.m_pad3 != result.m_pad3 ) return 1; return 0; } openhpi-2.14.1/marshal/t/marshal_hpi_types_015.c0000644000076400007640000000504411302567035016334 0ustar /* * Copyright (c) 2005 by IBM Corporation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * W. David Ashley */ #include "marshal_hpi_types.h" #include #include #include static int cmp_ctrlrecanalog( SaHpiCtrlRecAnalogT *d1, SaHpiCtrlRecAnalogT *d2 ) { if ( d1->Min != d2->Min ) return 0; if ( d1->Max != d2->Max ) return 0; if ( d1->Default != d2->Default ) return 0; return 1; } typedef struct { tUint8 m_pad1; SaHpiCtrlRecAnalogT m_v1; tUint8 m_pad2; SaHpiCtrlRecAnalogT m_v2; SaHpiCtrlRecAnalogT m_v3; tUint8 m_pad3; } cTest; cMarshalType StructElements[] = { dStructElement( cTest, m_pad1 , Marshal_Uint8Type ), dStructElement( cTest, m_v1 , SaHpiCtrlRecAnalogType ), dStructElement( cTest, m_pad2 , Marshal_Uint8Type ), dStructElement( cTest, m_v2 , SaHpiCtrlRecAnalogType ), dStructElement( cTest, m_v3 , SaHpiCtrlRecAnalogType ), dStructElement( cTest, m_pad3 , Marshal_Uint8Type ), dStructElementEnd() }; cMarshalType TestType = dStruct( cTest, StructElements ); int main( int argc, char *argv[] ) { cTest value = { .m_pad1 = 47, .m_v1.Min = 0, .m_v1.Max = 27, .m_v1.Default = 10, .m_pad2 = 48, .m_v1.Min = -5, .m_v1.Max = 5, .m_v1.Default = 0, .m_v1.Min = -100, .m_v1.Max = 100, .m_v1.Default = 10, .m_pad3 = 49 }; unsigned char *buffer = (unsigned char *)malloc(sizeof(value)); cTest result; unsigned int s1 = Marshal( &TestType, &value, buffer ); unsigned int s2 = Demarshal( MarshalByteOrder(), &TestType, &result, buffer ); if ( s1 != s2 ) return 1; if ( value.m_pad1 != result.m_pad1 ) return 1; if ( !cmp_ctrlrecanalog( &value.m_v1, &result.m_v1 ) ) return 1; if ( value.m_pad2 != result.m_pad2 ) return 1; if ( !cmp_ctrlrecanalog( &value.m_v2, &result.m_v2 ) ) return 1; if ( !cmp_ctrlrecanalog( &value.m_v3, &result.m_v3 ) ) return 1; if ( value.m_pad3 != result.m_pad3 ) return 1; return 0; } openhpi-2.14.1/marshal/t/marshal_hpi_types_038.c0000644000076400007640000000675111302567035016347 0ustar /* * Copyright (c) 2005 by IBM Corporation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * W. David Ashley */ #include "marshal_hpi_types.h" #include #include #include static int cmp_text_buffer( SaHpiTextBufferT *d1, SaHpiTextBufferT *d2 ) { if ( d1->DataType != d2->DataType ) return 0; if ( d1->Language != d2->Language ) return 0; if ( d1->DataLength != d2->DataLength ) return 0; return memcmp( d1->Data, d2->Data, d1->DataLength ) ? 0 : 1; } static int cmp_swevent( SaHpiHpiSwEventT *d1, SaHpiHpiSwEventT *d2 ) { if ( d1->MId != d2->MId ) return 0; if ( d1->Type != d2->Type ) return 0; if ( !cmp_text_buffer( &d1->EventData, &d2->EventData ) ) return 0; return 1; } typedef struct { tUint8 m_pad1; SaHpiHpiSwEventT m_v1; tUint8 m_pad2; SaHpiHpiSwEventT m_v2; SaHpiHpiSwEventT m_v3; tUint8 m_pad3; } cTest; cMarshalType StructElements[] = { dStructElement( cTest, m_pad1 , Marshal_Uint8Type ), dStructElement( cTest, m_v1 , SaHpiHpiSwEventType ), dStructElement( cTest, m_pad2 , Marshal_Uint8Type ), dStructElement( cTest, m_v2 , SaHpiHpiSwEventType ), dStructElement( cTest, m_v3 , SaHpiHpiSwEventType ), dStructElement( cTest, m_pad3 , Marshal_Uint8Type ), dStructElementEnd() }; cMarshalType TestType = dStruct( cTest, StructElements ); int main( int argc, char *argv[] ) { cTest value = { .m_pad1 = 47, .m_v1.MId = 1, .m_v1.Type = SAHPI_HPIE_AUDIT, .m_v1.EventData.DataType = SAHPI_TL_TYPE_BINARY, .m_v1.EventData.Language = SAHPI_LANG_TSONGA, .m_v1.EventData.DataLength = 3, .m_v1.EventData.Data = "AB", .m_pad2 = 48, .m_v2.MId = 2, .m_v2.Type = SAHPI_HPIE_STARTUP, .m_v2.EventData.DataType = SAHPI_TL_TYPE_BCDPLUS, .m_v2.EventData.Language = SAHPI_LANG_SANGRO, .m_v2.EventData.DataLength = 21, .m_v2.EventData.Data = "12345678901234567890", .m_v3.MId = 3, .m_v3.Type = SAHPI_HPIE_OTHER, .m_v3.EventData.DataType = SAHPI_TL_TYPE_ASCII6, .m_v3.EventData.Language = SAHPI_LANG_TAJIK, .m_v3.EventData.DataLength = 0, .m_v3.EventData.Data = "", .m_pad3 = 49 }; unsigned char *buffer = (unsigned char *)malloc(sizeof(value)); cTest result; unsigned int s1 = Marshal( &TestType, &value, buffer ); unsigned int s2 = Demarshal( MarshalByteOrder(), &TestType, &result, buffer ); if ( s1 != s2 ) return 1; if ( value.m_pad1 != result.m_pad1 ) return 1; if ( !cmp_swevent( &value.m_v1, &result.m_v1 ) ) return 1; if ( value.m_pad2 != result.m_pad2 ) return 1; if ( !cmp_swevent( &value.m_v2, &result.m_v2 ) ) return 1; if ( !cmp_swevent( &value.m_v3, &result.m_v3 ) ) return 1; if ( value.m_pad3 != result.m_pad3 ) return 1; return 0; } openhpi-2.14.1/marshal/t/marshal_015.c0000644000076400007640000000144111302567035014245 0ustar /* * Copyright (c) 2004 by FORCE Computers. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Thomas Kanngieser */ #include "marshal.h" int main( int argc, char *argv[] ) { tInt8 value = 0xfa; tInt8 result; unsigned int s = Demarshal( MarshalByteOrder() ? 0 : 1, &Marshal_Int8Type, &result, &value ); if ( s != sizeof( tInt8 ) ) return 1; if ( value != result ) return 1; return 0; } openhpi-2.14.1/marshal/t/marshal_hpi_types_041.c0000644000076400007640000001023611302567035016332 0ustar /* * Copyright (c) 2005 by IBM Corporation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * W. David Ashley */ #include "marshal_hpi_types.h" #include #include #include static int cmp_text_buffer( SaHpiTextBufferT *d1, SaHpiTextBufferT *d2 ) { if ( d1->DataType != d2->DataType ) return 0; if ( d1->Language != d2->Language ) return 0; if ( d1->DataLength != d2->DataLength ) return 0; return memcmp( d1->Data, d2->Data, d1->DataLength ) ? 0 : 1; } static int cmp_userevent( SaHpiUserEventT *d1, SaHpiUserEventT *d2 ) { if ( !cmp_text_buffer( &d1->UserEventData, &d2->UserEventData ) ) return 0; return 1; } static int cmp_event( SaHpiEventT *d1, SaHpiEventT *d2 ) { if ( d1->Source != d2->Source ) return 0; if ( d1->EventType != d2->EventType ) return 0; if ( d1->Timestamp != d2->Timestamp ) return 0; if ( !cmp_userevent( &d1->EventDataUnion.UserEvent, &d2->EventDataUnion.UserEvent ) ) return 0; return 1; } typedef struct { tUint8 m_pad1; SaHpiEventT m_v1; tUint8 m_pad2; SaHpiEventT m_v2; SaHpiEventT m_v3; tUint8 m_pad3; } cTest; cMarshalType StructElements[] = { dStructElement( cTest, m_pad1 , Marshal_Uint8Type ), dStructElement( cTest, m_v1 , SaHpiEventType ), dStructElement( cTest, m_pad2 , Marshal_Uint8Type ), dStructElement( cTest, m_v2 , SaHpiEventType ), dStructElement( cTest, m_v3 , SaHpiEventType ), dStructElement( cTest, m_pad3 , Marshal_Uint8Type ), dStructElementEnd() }; cMarshalType TestType = dStruct( cTest, StructElements ); int main( int argc, char *argv[] ) { cTest value = { .m_pad1 = 47, .m_v1.Source = 1, .m_v1.EventType = SAHPI_ET_USER, .m_v1.Timestamp = 1000, .m_v1.EventDataUnion.UserEvent.UserEventData.DataType = SAHPI_TL_TYPE_BINARY, .m_v1.EventDataUnion.UserEvent.UserEventData.Language = SAHPI_LANG_TSONGA, .m_v1.EventDataUnion.UserEvent.UserEventData.DataLength = 3, .m_v1.EventDataUnion.UserEvent.UserEventData.Data = "AB", .m_pad2 = 48, .m_v2.Source = 2, .m_v2.EventType = SAHPI_ET_USER, .m_v2.Timestamp = 1200, .m_v2.EventDataUnion.UserEvent.UserEventData.DataType = SAHPI_TL_TYPE_BCDPLUS, .m_v2.EventDataUnion.UserEvent.UserEventData.Language = SAHPI_LANG_SANGRO, .m_v2.EventDataUnion.UserEvent.UserEventData.DataLength = 21, .m_v2.EventDataUnion.UserEvent.UserEventData.Data = "12345678901234567890", .m_v3.Source = 3, .m_v3.EventType = SAHPI_ET_USER, .m_v3.Timestamp = 1030, .m_v3.EventDataUnion.UserEvent.UserEventData.DataType = SAHPI_TL_TYPE_ASCII6, .m_v3.EventDataUnion.UserEvent.UserEventData.Language = SAHPI_LANG_TAJIK, .m_v3.EventDataUnion.UserEvent.UserEventData.DataLength = 0, .m_v3.EventDataUnion.UserEvent.UserEventData.Data = "", .m_pad3 = 49 }; unsigned char *buffer = (unsigned char *)malloc(sizeof(value)); cTest result; unsigned int s1 = Marshal( &TestType, &value, buffer ); unsigned int s2 = Demarshal( MarshalByteOrder(), &TestType, &result, buffer ); if ( s1 != s2 ) return 1; if ( value.m_pad1 != result.m_pad1 ) return 1; if ( !cmp_event( &value.m_v1, &result.m_v1 ) ) return 1; if ( value.m_pad2 != result.m_pad2 ) return 1; if ( !cmp_event( &value.m_v2, &result.m_v2 ) ) return 1; if ( !cmp_event( &value.m_v3, &result.m_v3 ) ) return 1; if ( value.m_pad3 != result.m_pad3 ) return 1; return 0; } openhpi-2.14.1/marshal/t/marshal_011.c0000644000076400007640000000144411302567035014244 0ustar /* * Copyright (c) 2004 by FORCE Computers. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Thomas Kanngieser */ #include "marshal.h" int main( int argc, char *argv[] ) { tUint8 value = 0x42; tUint8 result; unsigned int s = Demarshal( MarshalByteOrder() ? 0 : 1, &Marshal_Uint8Type, &result, &value ); if ( s != sizeof( tUint8 ) ) return 1; if ( value != result ) return 1; return 0; } openhpi-2.14.1/marshal/t/marshal_hpi_types_001.c0000644000076400007640000000450611302567035016331 0ustar /* * Copyright (c) 2005 by IBM Corporation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * W. David Ashley */ #include "marshal_hpi_types.h" #include #include #include static int cmp_entities( SaHpiEntityT *d1, SaHpiEntityT *d2 ) { if ( d1->EntityType != d2->EntityType ) return 0; if ( d1->EntityLocation != d2->EntityLocation ) return 0; return 1; } typedef struct { tUint8 m_pad1; SaHpiEntityT m_v1; tUint8 m_pad2; SaHpiEntityT m_v2; SaHpiEntityT m_v3; tUint8 m_pad3; } cTest; cMarshalType StructElements[] = { dStructElement( cTest, m_pad1 , Marshal_Uint8Type ), dStructElement( cTest, m_v1 , SaHpiEntityType ), dStructElement( cTest, m_pad2 , Marshal_Uint8Type ), dStructElement( cTest, m_v2 , SaHpiEntityType ), dStructElement( cTest, m_v3 , SaHpiEntityType ), dStructElement( cTest, m_pad3 , Marshal_Uint8Type ), dStructElementEnd() }; cMarshalType TestType = dStruct( cTest, StructElements ); int main( int argc, char *argv[] ) { cTest value = { .m_pad1 = 47, .m_v1.EntityType = SAHPI_ENT_SYSTEM_BOARD, .m_v1.EntityLocation = 1, .m_pad2 = 48, .m_v2.EntityType = SAHPI_ENT_POWER_MODULE, .m_v2.EntityLocation = 2, .m_v3.EntityType = SAHPI_ENT_SWITCH, .m_v3.EntityLocation = 3, .m_pad3 = 49 }; unsigned char *buffer = (unsigned char *)malloc(sizeof(value)); cTest result; unsigned int s1 = Marshal( &TestType, &value, buffer ); unsigned int s2 = Demarshal( MarshalByteOrder(), &TestType, &result, buffer ); if ( s1 != s2 ) return 1; if ( value.m_pad1 != result.m_pad1 ) return 1; if ( !cmp_entities( &value.m_v1, &result.m_v1 ) ) return 1; if ( value.m_pad2 != result.m_pad2 ) return 1; if ( !cmp_entities( &value.m_v2, &result.m_v2 ) ) return 1; if ( !cmp_entities( &value.m_v3, &result.m_v3 ) ) return 1; if ( value.m_pad3 != result.m_pad3 ) return 1; return 0; } openhpi-2.14.1/marshal/t/marshal_hpi_types_010.c0000644000076400007640000000605011302567035016325 0ustar /* * Copyright (c) 2005 by IBM Corporation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * W. David Ashley */ #include "marshal_hpi_types.h" #include #include #include static int cmp_text_buffer( SaHpiTextBufferT *d1, SaHpiTextBufferT *d2 ) { if ( d1->DataType != d2->DataType ) return 0; if ( d1->Language != d2->Language ) return 0; if ( d1->DataLength != d2->DataLength ) return 0; return memcmp( d1->Data, d2->Data, d1->DataLength ) ? 0 : 1; } static int cmp_ctrlstatetext( SaHpiCtrlStateTextT *d1, SaHpiCtrlStateTextT *d2 ) { if ( d1->Line != d2->Line ) return 0; if ( !cmp_text_buffer( &d1->Text, &d2->Text ) ) return 0; return 1; } typedef struct { tUint8 m_pad1; SaHpiCtrlStateTextT m_v1; tUint8 m_pad2; SaHpiCtrlStateTextT m_v2; SaHpiCtrlStateTextT m_v3; tUint8 m_pad3; } cTest; cMarshalType StructElements[] = { dStructElement( cTest, m_pad1 , Marshal_Uint8Type ), dStructElement( cTest, m_v1 , SaHpiCtrlStateTextType ), dStructElement( cTest, m_pad2 , Marshal_Uint8Type ), dStructElement( cTest, m_v2 , SaHpiCtrlStateTextType ), dStructElement( cTest, m_v3 , SaHpiCtrlStateTextType ), dStructElement( cTest, m_pad3 , Marshal_Uint8Type ), dStructElementEnd() }; cMarshalType TestType = dStruct( cTest, StructElements ); int main( int argc, char *argv[] ) { cTest value = { .m_pad1 = 47, .m_v1.Line = 1, .m_v1.Text.DataType = SAHPI_TL_TYPE_BINARY, .m_v1.Text.Language = SAHPI_LANG_TSONGA, .m_v1.Text.DataLength = 3, .m_v1.Text.Data = "AB", .m_pad2 = 48, .m_v2.Line = 1, .m_v2.Text.DataType = SAHPI_TL_TYPE_BCDPLUS, .m_v2.Text.Language = SAHPI_LANG_SANGRO, .m_v2.Text.DataLength = 21, .m_v2.Text.Data = "12345678901234567890", .m_v3.Line = 1, .m_v3.Text.DataType = SAHPI_TL_TYPE_ASCII6, .m_v3.Text.Language = SAHPI_LANG_TAJIK, .m_v3.Text.DataLength = 0, .m_v3.Text.Data = "", .m_pad3 = 49 }; unsigned char *buffer = (unsigned char *)malloc(sizeof(value)); cTest result; unsigned int s1 = Marshal( &TestType, &value, buffer ); unsigned int s2 = Demarshal( MarshalByteOrder(), &TestType, &result, buffer ); if ( s1 != s2 ) return 1; if ( value.m_pad1 != result.m_pad1 ) return 1; if ( !cmp_ctrlstatetext( &value.m_v1, &result.m_v1 ) ) return 1; if ( value.m_pad2 != result.m_pad2 ) return 1; if ( !cmp_ctrlstatetext( &value.m_v2, &result.m_v2 ) ) return 1; if ( !cmp_ctrlstatetext( &value.m_v3, &result.m_v3 ) ) return 1; if ( value.m_pad3 != result.m_pad3 ) return 1; return 0; } openhpi-2.14.1/marshal/t/marshal_010.c0000644000076400007640000000462511302567035014247 0ustar /* * Copyright (c) 2004 by FORCE Computers. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Thomas Kanngieser */ #include "marshal.h" #include typedef struct { tUint8 m_u8; tUint16 m_u16; tUint32 m_u32; tUint64 m_u64; tInt8 m_i8; tInt16 m_i16; tInt32 m_i32; tInt64 m_i64; tFloat32 m_f32; tFloat64 m_f64; } cTest; cMarshalType Elements[] = { dStructElement( cTest, m_u8 , Marshal_Uint8Type ), dStructElement( cTest, m_u16, Marshal_Uint16Type ), dStructElement( cTest, m_u32, Marshal_Uint32Type ), dStructElement( cTest, m_u64, Marshal_Uint64Type ), dStructElement( cTest, m_i8 , Marshal_Int8Type ), dStructElement( cTest, m_i16, Marshal_Int16Type ), dStructElement( cTest, m_i32, Marshal_Int32Type ), dStructElement( cTest, m_i64, Marshal_Int64Type ), dStructElement( cTest, m_f32, Marshal_Float32Type ), dStructElement( cTest, m_f64, Marshal_Float64Type ), dStructElementEnd() }; cMarshalType TestType = dStruct( cTest, Elements ); int main( int argc, char *argv[] ) { cTest value = { .m_u8 = 42, .m_u16 = 0x1234, .m_u32 = 0x23456789, .m_u64 = 0x1234234534564567LL, .m_i8 = 43, .m_i16 = 0x7654, .m_i32 = 0x98765432, .m_i64 = 0x9876543210987654LL, .m_f32 = -12.5, .m_f64 = 34.5 }; unsigned char buffer[256]; cTest result; unsigned int s1 = Marshal( &TestType, &value, buffer ); unsigned int s2 = Demarshal( MarshalByteOrder(), &TestType, &result, buffer ); if ( s1 != s2 ) return 1; if ( value.m_u8 != result.m_u8 ) return 1; if ( value.m_u16 != result.m_u16 ) return 1; if ( value.m_u32 != result.m_u32 ) return 1; if ( value.m_u64 != result.m_u64 ) return 1; if ( value.m_i8 != result.m_i8 ) return 1; if ( value.m_i16 != result.m_i16 ) return 1; if ( value.m_i32 != result.m_i32 ) return 1; if ( value.m_i64 != result.m_i64 ) return 1; if ( value.m_f32 != result.m_f32 ) return 1; if ( value.m_f64 != result.m_f64 ) return 1; return 0; } openhpi-2.14.1/marshal/t/marshal_hpi_types_017.c0000644000076400007640000001022011302567035016326 0ustar /* * Copyright (c) 2005 by IBM Corporation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * W. David Ashley */ #include "marshal_hpi_types.h" #include #include #include static int cmp_text_buffer( SaHpiTextBufferT *d1, SaHpiTextBufferT *d2 ) { if ( d1->DataType != d2->DataType ) return 0; if ( d1->Language != d2->Language ) return 0; if ( d1->DataLength != d2->DataLength ) return 0; return memcmp( d1->Data, d2->Data, d1->DataLength ) ? 0 : 1; } static int cmp_ctrlstatetext( SaHpiCtrlStateTextT *d1, SaHpiCtrlStateTextT *d2 ) { if ( d1->Line != d2->Line ) return 0; if ( !cmp_text_buffer( &d1->Text, &d2->Text ) ) return 0; return 1; } static int cmp_ctrlrectext( SaHpiCtrlRecTextT *d1, SaHpiCtrlRecTextT *d2 ) { if ( d1->MaxChars != d2->MaxChars ) return 0; if ( d1->MaxLines != d2->MaxLines ) return 0; if ( d1->Language != d2->Language ) return 0; if ( d1->DataType != d2->DataType ) return 0; if ( !cmp_ctrlstatetext( &d1->Default, &d2->Default ) ) return 0; return 1; } typedef struct { tUint8 m_pad1; SaHpiCtrlRecTextT m_v1; tUint8 m_pad2; SaHpiCtrlRecTextT m_v2; SaHpiCtrlRecTextT m_v3; tUint8 m_pad3; } cTest; cMarshalType StructElements[] = { dStructElement( cTest, m_pad1 , Marshal_Uint8Type ), dStructElement( cTest, m_v1 , SaHpiCtrlRecTextType ), dStructElement( cTest, m_pad2 , Marshal_Uint8Type ), dStructElement( cTest, m_v2 , SaHpiCtrlRecTextType ), dStructElement( cTest, m_v3 , SaHpiCtrlRecTextType ), dStructElement( cTest, m_pad3 , Marshal_Uint8Type ), dStructElementEnd() }; cMarshalType TestType = dStruct( cTest, StructElements ); int main( int argc, char *argv[] ) { cTest value = { .m_pad1 = 47, .m_v1.MaxChars = 80, .m_v1.MaxLines = 10, .m_v1.Language = SAHPI_LANG_ENGLISH, .m_v1.DataType = SAHPI_TL_TYPE_TEXT, .m_v1.Default.Line = 1, .m_v1.Default.Text.DataType = SAHPI_TL_TYPE_TEXT, .m_v1.Default.Text.Language = SAHPI_LANG_ENGLISH, .m_v1.Default.Text.DataLength = 7, .m_v1.Default.Text.Data = "My text", .m_pad2 = 48, .m_v2.MaxChars = 80, .m_v2.MaxLines = 10, .m_v2.Language = SAHPI_LANG_ENGLISH, .m_v2.DataType = SAHPI_TL_TYPE_TEXT, .m_v2.Default.Line = 1, .m_v2.Default.Text.DataType = SAHPI_TL_TYPE_TEXT, .m_v2.Default.Text.Language = SAHPI_LANG_ENGLISH, .m_v2.Default.Text.DataLength = 8, .m_v2.Default.Text.Data = "My text1", .m_v3.MaxChars = 80, .m_v3.MaxLines = 10, .m_v3.Language = SAHPI_LANG_ENGLISH, .m_v3.DataType = SAHPI_TL_TYPE_TEXT, .m_v3.Default.Line = 1, .m_v3.Default.Text.DataType = SAHPI_TL_TYPE_TEXT, .m_v3.Default.Text.Language = SAHPI_LANG_ENGLISH, .m_v3.Default.Text.DataLength = 15, .m_v2.Default.Text.Data = "My text My text", .m_pad3 = 49 }; unsigned char *buffer = (unsigned char *)malloc(sizeof(value)); cTest result; unsigned int s1 = Marshal( &TestType, &value, buffer ); unsigned int s2 = Demarshal( MarshalByteOrder(), &TestType, &result, buffer ); if ( s1 != s2 ) return 1; if ( value.m_pad1 != result.m_pad1 ) return 1; if ( !cmp_ctrlrectext( &value.m_v1, &result.m_v1 ) ) return 1; if ( value.m_pad2 != result.m_pad2 ) return 1; if ( !cmp_ctrlrectext( &value.m_v2, &result.m_v2 ) ) return 1; if ( !cmp_ctrlrectext( &value.m_v3, &result.m_v3 ) ) return 1; if ( value.m_pad3 != result.m_pad3 ) return 1; return 0; } openhpi-2.14.1/marshal/t/marshal_hpi_types_011.c0000644000076400007640000000502611302567035016330 0ustar /* * Copyright (c) 2005 by IBM Corporation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * W. David Ashley */ #include "marshal_hpi_types.h" #include #include #include static int cmp_ctrlstateoem( SaHpiCtrlStateOemT *d1, SaHpiCtrlStateOemT *d2 ) { if ( d1->MId != d2->MId ) return 0; if ( d1->BodyLength != d2->BodyLength ) return 0; if ( memcmp(d1->Body, d2->Body, SAHPI_CTRL_MAX_OEM_BODY_LENGTH) != 0 ) return 0; return 1; } typedef struct { tUint8 m_pad1; SaHpiCtrlStateOemT m_v1; tUint8 m_pad2; SaHpiCtrlStateOemT m_v2; SaHpiCtrlStateOemT m_v3; tUint8 m_pad3; } cTest; cMarshalType StructElements[] = { dStructElement( cTest, m_pad1 , Marshal_Uint8Type ), dStructElement( cTest, m_v1 , SaHpiCtrlStateOemType ), dStructElement( cTest, m_pad2 , Marshal_Uint8Type ), dStructElement( cTest, m_v2 , SaHpiCtrlStateOemType ), dStructElement( cTest, m_v3 , SaHpiCtrlStateOemType ), dStructElement( cTest, m_pad3 , Marshal_Uint8Type ), dStructElementEnd() }; cMarshalType TestType = dStruct( cTest, StructElements ); int main( int argc, char *argv[] ) { cTest value = { .m_pad1 = 47, .m_v1.MId = 0, .m_v1.BodyLength = 4, .m_v1.Body = {'A', 'B', 'c', 'd'}, .m_pad2 = 48, .m_v2.MId = 1, .m_v2.BodyLength = 4, .m_v2.Body = {'d', 'c', 'B', 'A'}, .m_v3.MId = 1, .m_v3.BodyLength = 1, .m_v3.Body = {'A'}, .m_pad3 = 49 }; unsigned char *buffer = (unsigned char *)malloc(sizeof(value)); cTest result; unsigned int s1 = Marshal( &TestType, &value, buffer ); unsigned int s2 = Demarshal( MarshalByteOrder(), &TestType, &result, buffer ); if ( s1 != s2 ) return 1; if ( value.m_pad1 != result.m_pad1 ) return 1; if ( !cmp_ctrlstateoem( &value.m_v1, &result.m_v1 ) ) return 1; if ( value.m_pad2 != result.m_pad2 ) return 1; if ( !cmp_ctrlstateoem( &value.m_v2, &result.m_v2 ) ) return 1; if ( !cmp_ctrlstateoem( &value.m_v3, &result.m_v3 ) ) return 1; if ( value.m_pad3 != result.m_pad3 ) return 1; return 0; } openhpi-2.14.1/marshal/t/marshal_hpi_types_003.c0000644000076400007640000000517711302567035016340 0ustar /* * Copyright (c) 2005 by IBM Corporation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * W. David Ashley */ #include "marshal_hpi_types.h" #include #include #include static int cmp_sensorreading( SaHpiSensorReadingT *d1, SaHpiSensorReadingT *d2 ) { if ( d1->IsSupported != d2->IsSupported ) return 0; if ( d1->Type != d2->Type ) return 0; if ( d1->Value.SensorInt64 != d2->Value.SensorInt64 ) return 0; return 1; } typedef struct { tUint8 m_pad1; SaHpiSensorReadingT m_v1; tUint8 m_pad2; SaHpiSensorReadingT m_v2; SaHpiSensorReadingT m_v3; tUint8 m_pad3; } cTest; cMarshalType StructElements[] = { dStructElement( cTest, m_pad1 , Marshal_Uint8Type ), dStructElement( cTest, m_v1 , SaHpiSensorReadingType ), dStructElement( cTest, m_pad2 , Marshal_Uint8Type ), dStructElement( cTest, m_v2 , SaHpiSensorReadingType ), dStructElement( cTest, m_v3 , SaHpiSensorReadingType ), dStructElement( cTest, m_pad3 , Marshal_Uint8Type ), dStructElementEnd() }; cMarshalType TestType = dStruct( cTest, StructElements ); int main( int argc, char *argv[] ) { cTest value = { .m_pad1 = 47, .m_v1.IsSupported = TRUE, .m_v1.Type = SAHPI_SENSOR_READING_TYPE_INT64, .m_v1.Value = {-21}, .m_pad2 = 48, .m_v2.IsSupported = TRUE, .m_v2.Type = SAHPI_SENSOR_READING_TYPE_UINT64, .m_v2.Value = {21}, .m_v3.IsSupported = FALSE, .m_v3.Type = SAHPI_SENSOR_READING_TYPE_INT64, .m_v3.Value = {0}, .m_pad3 = 49 }; unsigned char *buffer = (unsigned char *)malloc(sizeof(value)); cTest result; unsigned int s1 = Marshal( &TestType, &value, buffer ); unsigned int s2 = Demarshal( MarshalByteOrder(), &TestType, &result, buffer ); if ( s1 != s2 ) return 1; if ( value.m_pad1 != result.m_pad1 ) return 1; if ( !cmp_sensorreading( &value.m_v1, &result.m_v1 ) ) return 1; if ( value.m_pad2 != result.m_pad2 ) return 1; if ( !cmp_sensorreading( &value.m_v2, &result.m_v2 ) ) return 1; if ( !cmp_sensorreading( &value.m_v3, &result.m_v3 ) ) return 1; if ( value.m_pad3 != result.m_pad3 ) return 1; return 0; } openhpi-2.14.1/marshal/marshal.c0000644000076400007640000004755111302567035013431 0ustar /* * marshaling/demarshaling * * Copyright (c) 2004 by FORCE Computers. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Thomas Kanngieser * W. David Ashley */ #include // #include #include #include #include #include "marshal.h" cMarshalType Marshal_VoidType = { .m_type = eMtVoid }; cMarshalType Marshal_Uint8Type = { .m_type = eMtUint8 }; cMarshalType Marshal_Uint16Type = { .m_type = eMtUint16 }; cMarshalType Marshal_Uint32Type = { .m_type = eMtUint32 }; cMarshalType Marshal_Uint64Type = { .m_type = eMtUint64 }; cMarshalType Marshal_Int8Type = { .m_type = eMtInt8 }; cMarshalType Marshal_Int16Type = { .m_type = eMtInt16 }; cMarshalType Marshal_Int32Type = { .m_type = eMtInt32 }; cMarshalType Marshal_Int64Type = { .m_type = eMtInt64 }; cMarshalType Marshal_Float32Type = { .m_type = eMtFloat32 }; cMarshalType Marshal_Float64Type = { .m_type = eMtFloat64 }; int MarshalByteOrder() { if ( G_BYTE_ORDER == G_LITTLE_ENDIAN ) return 1; return 0; } int IsSimpleType( tMarshalType type ) { assert( type != eMtUnknown ); switch( type ) { case eMtUnknown: assert( type != eMtUnknown ); return 0; case eMtVoid: case eMtUint8: case eMtUint16: case eMtUint32: case eMtUint64: case eMtInt8: case eMtInt16: case eMtInt32: case eMtInt64: case eMtFloat32: case eMtFloat64: return 1; case eMtArray: case eMtVarArray: case eMtStruct: case eMtStructElement: case eMtUnion: case eMtUnionElement: case eMtUserDefined: return 0; } // not reached assert( 0 ); return 0; } int MarshalSize( const cMarshalType *type ) { switch( type->m_type ) { case eMtUnknown: assert( 0 ); return 0; case eMtVoid: return 0; case eMtUint8: case eMtInt8: return sizeof( tUint8 ); case eMtUint16: case eMtInt16: return sizeof( tUint16 ); case eMtUint32: case eMtInt32: return sizeof( tUint32 ); case eMtUint64: case eMtInt64: return sizeof( tUint64 ); case eMtFloat32: return sizeof( tFloat32 ); case eMtFloat64: return sizeof( tFloat64 ); case eMtArray: assert( type->m_u.m_array.m_size > 0 ); assert( type->m_u.m_array.m_type ); return type->m_u.m_array.m_size * MarshalSize( type->m_u.m_array.m_type ); case eMtVarArray: return 0xffff; case eMtStruct: { assert( type->m_u.m_struct.m_elements ); int i; int size = 0; for( i = 0; type->m_u.m_struct.m_elements[i].m_type == eMtStructElement; i++ ) { cMarshalType *elem = &type->m_u.m_struct.m_elements[i]; int s = MarshalSize( elem->m_u.m_struct_element.m_type ); if ( s < 0 ) { assert( 0 ); return -1; } size += s; } return size; } case eMtUnion: { assert( type->m_u.m_union.m_elements ); int i; int max = 0; for( i = 0; type->m_u.m_union.m_elements[i].m_type == eMtUnionElement; i++ ) { cMarshalType *elem = &type->m_u.m_union.m_elements[i]; int s = MarshalSize( elem->m_u.m_union_element.m_type ); if ( s < 0 ) { assert( 0 ); return -1; } if ( max < s ) max = s; } return max; } case eMtUserDefined: return 0xffff; case eMtStructElement: case eMtUnionElement: assert( 0 ); return -1; } // not reached assert( 0 ); return -1; } int MarshalSizeArray( const cMarshalType **types ) { int size = 0; int i; for( i = 0; types[i]; i++ ) { int s = MarshalSize( types[i] ); if ( s < 0 ) { assert( 0 ); return -1; } size += s; } return size; } int MarshalSimpleTypes( tMarshalType type, const void *data, void *buffer ) { switch( type ) { case eMtVoid: return 0; case eMtUint8: case eMtInt8: { memcpy(buffer, data, sizeof(tUint8)); } return sizeof( tUint8 ); case eMtInt16: case eMtUint16: { memcpy(buffer, data, sizeof(tUint16)); } return sizeof( tUint16 ); case eMtUint32: case eMtInt32: { memcpy(buffer, data, sizeof(tUint32)); } return sizeof( tUint32 ); case eMtUint64: case eMtInt64: { memcpy(buffer, data, sizeof(tUint64)); } return sizeof( tUint64 ); case eMtFloat32: { memcpy(buffer, data, sizeof(tFloat32)); } return sizeof( tFloat32 ); case eMtFloat64: { memcpy(buffer, data, sizeof(tFloat64)); } return sizeof( tFloat64 ); default: break; } assert( 0 ); return -1; } static const cMarshalType * FindUnionModifierType( const cMarshalType *type, cMarshalType *st_type, const void *d ) { cMarshalType *mod_struct_element = &type->m_u.m_struct.m_elements[st_type->m_u.m_union.m_offset]; assert( mod_struct_element->m_type == eMtStructElement ); cMarshalType *mod_type = mod_struct_element->m_u.m_struct_element.m_type; const unsigned char *so = (const unsigned char *)d + mod_struct_element->m_u.m_struct_element.m_offset; tUint32 m; switch( mod_type->m_type ) { case eMtUint8: case eMtInt8: m = (tUint32)*so; break; case eMtUint16: case eMtInt16: /* compile error */ // m = (tUint32)*(const tUint16 *)so; m = (tUint32)(*(const tUint16 *)(const void *)so); break; case eMtUint32: case eMtInt32: /* compile error */ // m = *(const tUint32 *)so; m = *(const tUint32 *)(const void *)so; break; default: assert( 0 ); m = 0; return 0; } int i; for( i = 0; st_type->m_u.m_union.m_elements[i].m_type == eMtUnionElement; i++ ) if ( st_type->m_u.m_union.m_elements[i].m_u.m_union_element.m_mod == m ) return st_type->m_u.m_union.m_elements[i].m_u.m_union_element.m_type; return 0; } static int FindArraySize( const cMarshalType *type, cMarshalType *st_type, const void *d ) { cMarshalType *size_struct_element = &type->m_u.m_struct.m_elements[st_type->m_u.m_var_array.m_size]; assert( size_struct_element->m_type == eMtStructElement ); cMarshalType *size_type = size_struct_element->m_u.m_struct_element.m_type; const unsigned char *so = (const unsigned char *)d + size_struct_element->m_u.m_struct_element.m_offset; tUint32 size; switch( size_type->m_type ) { case eMtUint8: case eMtInt8: size = (tUint32)*so; break; case eMtUint16: case eMtInt16: /* compile error */ // size = (tUint32)*(const tUint16 *)so; size = (tUint32)*(const tUint16 *)(const void *)so; break; case eMtUint32: case eMtInt32: /* compile error */ // size = *(const tUint32 *)so; size = *(const tUint32 *)(const void *)so; break; default: assert( 0 ); return -1; } return size; } int Marshal( const cMarshalType *type, const void *d, void *b ) { if ( IsSimpleType( type->m_type ) ) return MarshalSimpleTypes( type->m_type, d, b ); int size = 0; const unsigned char *data = d; unsigned char *buffer = b; switch( type->m_type ) { case eMtArray: { int i; //assert( IsSimpleType( type->m_u.m_array.m_type->m_type ) ); for( i = 0; i < type->m_u.m_array.m_size; i++ ) { int s = Marshal( type->m_u.m_array.m_type, data, buffer ); if ( s < 0 ) { assert( 0 ); return -1; } data += s; buffer += s; size += s; } } break; case eMtStruct: { int i; for( i = 0; type->m_u.m_struct.m_elements[i].m_type == eMtStructElement; i++ ) { cMarshalType *struct_element = &type->m_u.m_struct.m_elements[i]; assert( struct_element->m_type == eMtStructElement ); cMarshalType *st_type = struct_element->m_u.m_struct_element.m_type; int s = 0; if ( st_type->m_type == eMtUnion ) { // the mod must be before this entry. // this is a limitation of demarshaling of unions assert( st_type->m_u.m_union.m_offset < i ); const cMarshalType *mod = FindUnionModifierType( type, st_type, data ); if ( mod ) { s = Marshal( mod, data + struct_element->m_u.m_struct_element.m_offset, buffer ); if ( s < 0 ) { assert( 0 ); return -1; } } else { assert( 0 ); return -1; } } else if ( st_type->m_type == eMtVarArray ) { // the array size must be before this entry. // this is a limitation of demarshaling of var arrays assert( st_type->m_u.m_var_array.m_size < i ); int array_size = FindArraySize( type, st_type, data ); // only simple types can be array elements //assert( IsSimpleType( st_type->m_u.m_var_array.m_type->m_type ) ); unsigned char *bb = buffer; const unsigned char *vardata = data + struct_element->m_u.m_struct_element.m_offset; const unsigned char *dd; tUint32 j; memcpy(&dd, vardata, sizeof(void *)); for( j = 0; j < array_size; j++ ) { int si = Marshal( st_type->m_u.m_var_array.m_type, dd, bb ); if ( si < 0 ) { assert( 0 ); return -1; } bb += si; dd += si; s += si; } } else { s = Marshal( st_type, data + struct_element->m_u.m_struct_element.m_offset, buffer ); if ( s < 0 ) { assert( 0 ); return -1; } } buffer += s; size += s; } } break; case eMtUnion: assert( 0 ); return -1; case eMtUserDefined: assert( type->m_u.m_user_defined.m_marshal ); size = type->m_u.m_user_defined.m_marshal( type, d, b, type->m_u.m_user_defined.m_user_data ); break; default: assert( 0 ); return -1; } return size; } int MarshalArray( const cMarshalType **types, const void **data, void *b ) { int i; int size = 0; unsigned char *buffer = b; for( i = 0; types[i]; i++ ) { int s = Marshal( types[i], data[i], buffer ); if ( s < 0 ) { assert( 0 ); return -1; } size += s; buffer += s; } return size; } // for byte swap float 32 typedef union { tUint32 m_u32; tFloat32 m_f32; } tFloat32Uint32; // for byte swap float 64 typedef union { tUint64 m_u64; tFloat64 m_f64; } tFloat64Uint64; int DemarshalSimpleTypes( int byte_order, tMarshalType type, void *data, const void *buffer ) { switch( type ) { case eMtVoid: return 0; case eMtUint8: case eMtInt8: { tUint8 v = *(const tUint8 *)buffer; *(tUint8 *)data = v; } return sizeof( tUint8 ); case eMtInt16: case eMtUint16: { tUint16 v; memcpy( &v, buffer, sizeof( tUint16 ) ); if ( MarshalByteOrder() != byte_order ) v = GUINT16_SWAP_LE_BE( v ); *(tUint16 *)data = v; } return sizeof( tUint16 ); case eMtUint32: case eMtInt32: { tUint32 v; memcpy( &v, buffer, sizeof( tUint32 ) ); if ( MarshalByteOrder() != byte_order ) v = GUINT32_SWAP_LE_BE( v ); *(tUint32 *)data = v; } return sizeof( tUint32 ); case eMtUint64: case eMtInt64: { tUint64 v; memcpy( &v, buffer, sizeof( tUint64 ) ); if ( MarshalByteOrder() != byte_order ) v = GUINT64_SWAP_LE_BE( v ); *(tUint64 *)data = v; } return sizeof( tUint64 ); case eMtFloat32: { // this has been tested for i386 and PPC tFloat32Uint32 v; memcpy( &(v.m_f32), buffer, sizeof( tFloat32 ) ); if ( MarshalByteOrder() != byte_order ) v.m_u32 = GUINT32_SWAP_LE_BE( v.m_u32 ); *(tFloat32 *)data = v.m_f32; } return sizeof( tFloat32 ); case eMtFloat64: { // this has been tested for i386 and PPC tFloat64Uint64 v; memcpy( &(v.m_f64), buffer, sizeof( tFloat64 ) ); if ( MarshalByteOrder() != byte_order ) v.m_u64 = GUINT64_SWAP_LE_BE( v.m_u64 ); *(tFloat64 *)data = v.m_f64; } return sizeof( tFloat64 ); default: break; } assert( 0 ); return -1; } int Demarshal( int byte_order, const cMarshalType *type, void *d, const void *b ) { if ( IsSimpleType( type->m_type ) ) return DemarshalSimpleTypes( byte_order, type->m_type, d, b ); int size = 0; unsigned char *data = d; const unsigned char *buffer = b; switch( type->m_type ) { case eMtArray: { int i; for( i = 0; i < type->m_u.m_array.m_size; i++ ) { int s = Demarshal( byte_order, type->m_u.m_array.m_type, data, buffer ); if ( s < 0 ) { assert( 0 ); return -1; } data += s; buffer += s; size += s; } } break; case eMtStruct: { int i; for( i = 0; type->m_u.m_struct.m_elements[i].m_type == eMtStructElement; i++ ) { cMarshalType *struct_element = &type->m_u.m_struct.m_elements[i]; assert( struct_element->m_type == eMtStructElement ); cMarshalType *st_type = struct_element->m_u.m_struct_element.m_type; int s = 0; if ( st_type->m_type == eMtUnion ) { // the mod must be before this entry. // this is a limitation of demarshaling of unions assert( st_type->m_u.m_union.m_offset < i ); const cMarshalType *mod = FindUnionModifierType( type, st_type, data ); if ( mod ) { s = Demarshal( byte_order, mod, data + struct_element->m_u.m_struct_element.m_offset, buffer ); if ( s < 0 ) { assert( 0 ); return -1; } } else { assert( 0 ); return -1; } } else if ( st_type->m_type == eMtVarArray ) { // the array size must be before this entry. // this is a limitation of demarshaling of var arrays assert( st_type->m_u.m_var_array.m_size < i ); tUint32 array_size = FindArraySize( type, st_type, data ); // only simple types can be array elements //assert( IsSimpleType( st_type->m_u.m_var_array.m_type->m_type ) ); const unsigned char *bb = buffer; const cMarshalType *va_type = st_type->m_u.m_var_array.m_type; // FIXME: This is a hack! I'm assuming the elements in // the variable array are structs. That's because this // is the only instance for which we use var arrays. unsigned char *dd = (unsigned char *)malloc(va_type->m_u.m_struct.m_size*array_size); memset(dd, 0, va_type->m_u.m_struct.m_size*array_size); unsigned char *vardata = data + struct_element->m_u.m_struct_element.m_offset; tUint32 j; memcpy(vardata, &dd, sizeof(void *)); for( j = 0; j < array_size; j++ ) { int si = Demarshal( byte_order, st_type->m_u.m_var_array.m_type, dd, bb ); if ( si < 0 ) { assert( 0 ); return -1; } bb += si; dd += si; s += si; } } else { s = Demarshal( byte_order, st_type, data + struct_element->m_u.m_struct_element.m_offset, buffer ); if ( s < 0 ) { assert( 0 ); return -1; } } buffer += s; size += s; } } break; case eMtUnion: // unions must me encapsulate in structs assert( 0 ); return -1; case eMtStructElement: case eMtUnionElement: assert( 0 ); return -1; case eMtUserDefined: assert( type->m_u.m_user_defined.m_demarshal ); size = type->m_u.m_user_defined.m_demarshal( byte_order, type, d, b, type->m_u.m_user_defined. m_user_data ); if ( size < 0 ) { assert( 0 ); return -1; } break; default: assert( 0 ); return -1; } return size; } int DemarshalArray( int byte_order, const cMarshalType **types, void **data, const void *b ) { int i; int size = 0; const unsigned char *buffer = b; for( i = 0; types[i]; i++ ) { int s = Demarshal( byte_order, types[i], data[i], buffer ); if ( s < 0 ) { assert( 0 ); return -1; } size += s; buffer += s; } return size; } openhpi-2.14.1/marshal/marshal_hpi.h0000644000076400007640000001753411302567035014274 0ustar /* * marshaling/demarshaling of hpi functions * * Copyright (c) 2004 by FORCE Computers. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Thomas Kanngieser * W. David Ashley * Anton Pak */ #ifndef dMarshalHpi_h #define dMarshalHpi_h #ifndef dMarshalHpiTypes_h #include "marshal_hpi_types.h" #endif #ifdef __cplusplus extern "C" { #endif #define dDefaultDaemonPort 4743 typedef enum { eFsaHpiNull, eFsaHpiSessionOpen, eFsaHpiSessionClose, eFsaHpiDiscover, eFsaHpiDomainInfoGet, eFsaHpiDrtEntryGet, eFsaHpiDomainTagSet, eFsaHpiRptEntryGet, eFsaHpiRptEntryGetByResourceId, eFsaHpiResourceSeveritySet, eFsaHpiResourceTagSet, eFsaHpiResourceIdGet, eFsaHpiGetIdByEntityPath, eFsaHpiGetChildEntityPath, eFsaHpiResourceFailedRemove, eFsaHpiEventLogInfoGet, eFsaHpiEventLogCapabilitiesGet, eFsaHpiEventLogEntryGet, eFsaHpiEventLogEntryAdd, eFsaHpiEventLogClear, eFsaHpiEventLogTimeGet, eFsaHpiEventLogTimeSet, eFsaHpiEventLogStateGet, eFsaHpiEventLogStateSet, eFsaHpiEventLogOverflowReset, eFsaHpiSubscribe, eFsaHpiUnsubscribe, eFsaHpiEventGet, eFsaHpiEventAdd, eFsaHpiAlarmGetNext, eFsaHpiAlarmGet, eFsaHpiAlarmAcknowledge, eFsaHpiAlarmAdd, eFsaHpiAlarmDelete, eFsaHpiRdrGet, eFsaHpiRdrGetByInstrumentId, eFsaHpiSensorReadingGet, eFsaHpiSensorThresholdsGet, eFsaHpiSensorThresholdsSet, eFsaHpiSensorTypeGet, eFsaHpiSensorEnableGet, eFsaHpiSensorEnableSet, eFsaHpiSensorEventEnableGet, eFsaHpiSensorEventEnableSet, eFsaHpiSensorEventMasksGet, eFsaHpiSensorEventMasksSet, eFsaHpiControlTypeGet, eFsaHpiControlGet, eFsaHpiControlSet, eFsaHpiIdrInfoGet, eFsaHpiIdrAreaHeaderGet, eFsaHpiIdrAreaAdd, eFsaHpiIdrAreaAddById, eFsaHpiIdrAreaDelete, eFsaHpiIdrFieldGet, eFsaHpiIdrFieldAdd, eFsaHpiIdrFieldAddById, eFsaHpiIdrFieldSet, eFsaHpiIdrFieldDelete, eFsaHpiWatchdogTimerGet, eFsaHpiWatchdogTimerSet, eFsaHpiWatchdogTimerReset, eFsaHpiAnnunciatorGetNext, eFsaHpiAnnunciatorGet, eFsaHpiAnnunciatorAcknowledge, eFsaHpiAnnunciatorAdd, eFsaHpiAnnunciatorDelete, eFsaHpiAnnunciatorModeGet, eFsaHpiAnnunciatorModeSet, eFsaHpiDimiInfoGet, eFsaHpiDimiTestInfoGet, eFsaHpiDimiTestReadinessGet, eFsaHpiDimiTestStart, eFsaHpiDimiTestCancel, eFsaHpiDimiTestStatusGet, eFsaHpiDimiTestResultsGet, eFsaHpiFumiSourceSet, eFsaHpiFumiSourceInfoValidateStart, eFsaHpiFumiSourceInfoGet, eFsaHpiFumiTargetInfoGet, eFsaHpiFumiBackupStart, eFsaHpiFumiBankBootOrderSet, eFsaHpiFumiBankCopyStart, eFsaHpiFumiInstallStart, eFsaHpiFumiUpgradeStatusGet, eFsaHpiFumiTargetVerifyStart, eFsaHpiFumiUpgradeCancel, eFsaHpiFumiRollbackStart, eFsaHpiFumiActivate, eFsaHpiHotSwapPolicyCancel, eFsaHpiResourceActiveSet, eFsaHpiResourceInactiveSet, eFsaHpiAutoInsertTimeoutGet, eFsaHpiAutoInsertTimeoutSet, eFsaHpiAutoExtractTimeoutGet, eFsaHpiAutoExtractTimeoutSet, eFsaHpiHotSwapStateGet, eFsaHpiHotSwapActionRequest, eFsaHpiHotSwapIndicatorStateGet, eFsaHpiHotSwapIndicatorStateSet, eFsaHpiParmControl, eFsaHpiResourceLoadIdGet, eFsaHpiResourceLoadIdSet, eFsaHpiResourceResetStateGet, eFsaHpiResourceResetStateSet, eFsaHpiResourcePowerStateGet, eFsaHpiResourcePowerStateSet, eFoHpiHandlerCreate, eFoHpiHandlerDestroy, eFoHpiHandlerInfo, eFoHpiHandlerGetNext, eFoHpiHandlerFind, eFoHpiHandlerRetry, eFoHpiGlobalParamGet, eFoHpiGlobalParamSet, eFoHpiInjectEvent, // New B.03.01 functions // They are added to the end of enum in order to keep ABI compatibility eFsaHpiMyEntityPathGet, eFsaHpiRdrUpdateCountGet, eFsaHpiFumiSpecInfoGet, eFsaHpiFumiServiceImpactGet, eFsaHpiFumiSourceComponentInfoGet, eFsaHpiFumiTargetComponentInfoGet, eFsaHpiFumiLogicalTargetInfoGet, eFsaHpiFumiLogicalTargetComponentInfoGet, eFsaHpiFumiTargetVerifyMainStart, eFsaHpiFumiAutoRollbackDisableGet, eFsaHpiFumiAutoRollbackDisableSet, eFsaHpiFumiActivateStart, eFsaHpiFumiCleanup, } tHpiFucntionId; typedef struct { int m_id; const cMarshalType **m_request; const cMarshalType **m_reply; // the first param is the result unsigned int m_request_len; unsigned int m_reply_len; } cHpiMarshal; #define dHpiMarshalEntry(name) \ { \ eF ## name, \ name ## In, \ name ## Out, \ 0, 0 \ } cHpiMarshal *HpiMarshalFind( int id ); int HpiMarshalRequest ( cHpiMarshal *m, void *buffer, const void **params ); int HpiMarshalRequest1( cHpiMarshal *m, void *buffer, const void *p1 ); int HpiMarshalRequest2( cHpiMarshal *m, void *buffer, const void *p1, const void *p2 ); int HpiMarshalRequest3( cHpiMarshal *m, void *buffer, const void *p1, const void *p2, const void *p3 ); int HpiMarshalRequest4( cHpiMarshal *m, void *buffer, const void *p1, const void *p2, const void *p3, const void *p4 ); int HpiMarshalRequest5( cHpiMarshal *m, void *buffer, const void *p1, const void *p2, const void *p3, const void *p4, const void *p5 ); int HpiMarshalRequest6( cHpiMarshal *m, void *buffer, const void *p1, const void *p2, const void *p3, const void *p4, const void *p5, const void * p6 ); int HpiDemarshalRequest ( int byte_order, cHpiMarshal *m, const void *buffer, void **params ); int HpiDemarshalRequest1( int byte_order, cHpiMarshal *m, const void *buffer, void *p1 ); int HpiDemarshalRequest2( int byte_order, cHpiMarshal *m, const void *buffer, void *p1, void *p2 ); int HpiDemarshalRequest3( int byte_order, cHpiMarshal *m, const void *buffer, void *p1, void *p2, void *p3 ); int HpiDemarshalRequest4( int byte_order, cHpiMarshal *m, const void *buffer, void *p1, void *p2, void *p3, void *p4 ); int HpiDemarshalRequest5( int byte_order, cHpiMarshal *m, const void *buffer, void *p1, void *p2, void *p3, void *p4, void *p5 ); int HpiDemarshalRequest6( int byte_order, cHpiMarshal *m, const void *buffer, void *p1, void *p2, void *p3, void *p4, void *p5, void *p6 ); int HpiMarshalReply ( cHpiMarshal *m, void *buffer, const void **params ); int HpiMarshalReply0( cHpiMarshal *m, void *buffer, const void *result ); int HpiMarshalReply1( cHpiMarshal *m, void *buffer, const void *result, const void *p1 ); int HpiMarshalReply2( cHpiMarshal *m, void *buffer, const void *result, const void *p1, const void *p2 ); int HpiMarshalReply3( cHpiMarshal *m, void *buffer, const void *result, const void *p1, const void *p2, const void *p3 ); int HpiMarshalReply4( cHpiMarshal *m, void *buffer, const void *result, const void *p1, const void *p2, const void *p3, const void *p4 ); int HpiMarshalReply5( cHpiMarshal *m, void *buffer, const void *result, const void *p1, const void *p2, const void *p3, const void *p4, const void *p5 ); int HpiDemarshalReply ( int byte_order, cHpiMarshal *m, const void *buffer, void **params ); int HpiDemarshalReply0( int byte_order, cHpiMarshal *m, const void *buffer, void *result ); int HpiDemarshalReply1( int byte_order, cHpiMarshal *m, const void *buffer, void *result, void *p1 ); int HpiDemarshalReply2( int byte_order, cHpiMarshal *m, const void *buffer, void *result, void *p1, void *p2 ); int HpiDemarshalReply3( int byte_order, cHpiMarshal *m, const void *buffer, void *result, void *p1, void *p2, void *p3 ); int HpiDemarshalReply4( int byte_order, cHpiMarshal *m, const void *buffer, void *result, void *p1, void *p2, void *p3, void *p4 ); int HpiDemarshalReply5( int byte_order, cHpiMarshal *m, const void *buffer, void *result, void *p1, void *p2, void *p3, void *p4, void *p5 ); #ifdef __cplusplus } #endif #endif openhpi-2.14.1/marshal/marshal_hpi.c0000644000076400007640000014373211302567035014267 0ustar /* * marshaling/demarshaling of hpi functions * * Copyright (c) 2004 by FORCE Computers. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Thomas Kanngieser * W. David Ashley * Renier Morales * Anton Pak */ #include "marshal_hpi.h" #include static const cMarshalType *saHpiSessionOpenIn[] = { &SaHpiDomainIdType, // domain id (SaHpiDomainIdT) 0 }; static const cMarshalType *saHpiSessionOpenOut[] = { &SaErrorType, // result (SaErrorT) &SaHpiSessionIdType, // session id (SaHpiSessionIdT) 0 }; static const cMarshalType *saHpiSessionCloseIn[] = { &SaHpiSessionIdType, // session id (SaHpiSessionIdT) 0 }; static const cMarshalType *saHpiSessionCloseOut[] = { &SaErrorType, // result (SaErrorT) 0 }; static const cMarshalType *saHpiDiscoverIn[] = { &SaHpiSessionIdType, // session id (SaHpiSessionIdT) 0 }; static const cMarshalType *saHpiDiscoverOut[] = { &SaErrorType, // result (SaErrorT) 0 }; static const cMarshalType *saHpiDomainInfoGetIn[] = { &SaHpiSessionIdType, // session id (SaHpiSessionIdT) 0 }; static const cMarshalType *saHpiDomainInfoGetOut[] = { &SaErrorType, // result (SaErrorT) &SaHpiDomainInfoType, 0 }; static const cMarshalType *saHpiDrtEntryGetIn[] = { &SaHpiSessionIdType, // session id (SaHpiSessionIdT) &SaHpiEntryIdType, // entry id (SaHpiEntryIdT) 0 }; static const cMarshalType *saHpiDrtEntryGetOut[] = { &SaErrorType, // result (SaErrorT) &SaHpiEntryIdType, &SaHpiDrtEntryType, 0 }; static const cMarshalType *saHpiDomainTagSetIn[] = { &SaHpiSessionIdType, // session id (SaHpiSessionIdT) &SaHpiTextBufferType, // domain tag (SaHpiTextBufferT) 0 }; static const cMarshalType *saHpiDomainTagSetOut[] = { &SaErrorType, // result (SaErrorT) 0 }; static const cMarshalType *saHpiRptEntryGetIn[] = { &SaHpiSessionIdType, // session id (SaHpiSessionIdT) &SaHpiEntryIdType, 0 }; static const cMarshalType *saHpiRptEntryGetOut[] = { &SaErrorType, // result (SaErrorT) &SaHpiEntryIdType, &SaHpiRptEntryType, 0 }; static const cMarshalType *saHpiRptEntryGetByResourceIdIn[] = { &SaHpiSessionIdType, // session id (SaHpiSessionIdT) &SaHpiResourceIdType, 0 }; static const cMarshalType *saHpiRptEntryGetByResourceIdOut[] = { &SaErrorType, // result (SaErrorT) &SaHpiRptEntryType, 0 }; static const cMarshalType *saHpiResourceSeveritySetIn[] = { &SaHpiSessionIdType, // session id (SaHpiSessionIdT) &SaHpiResourceIdType, &SaHpiSeverityType, 0 }; static const cMarshalType *saHpiResourceSeveritySetOut[] = { &SaErrorType, // result (SaErrorT) 0 }; static const cMarshalType *saHpiResourceTagSetIn[] = { &SaHpiSessionIdType, // session id (SaHpiSessionIdT) &SaHpiResourceIdType, &SaHpiTextBufferType, 0 }; static const cMarshalType *saHpiResourceTagSetOut[] = { &SaErrorType, // result (SaErrorT) 0 }; static const cMarshalType *saHpiMyEntityPathGetIn[] = { &SaHpiSessionIdType, // session id (SaHpiSessionIdT) 0 }; static const cMarshalType *saHpiMyEntityPathGetOut[] = { &SaErrorType, // result (SaErrorT) &SaHpiEntityPathType, 0 }; static const cMarshalType *saHpiResourceIdGetIn[] = { &SaHpiSessionIdType, // session id (SaHpiSessionIdT) 0 }; static const cMarshalType *saHpiResourceIdGetOut[] = { &SaErrorType, // result (SaErrorT) &SaHpiResourceIdType, 0 }; static const cMarshalType *saHpiGetIdByEntityPathIn[] = { &SaHpiSessionIdType, // session id (SaHpiSessionIdT) &SaHpiEntityPathType, &SaHpiRdrTypeType, &SaHpiUint32Type, 0 }; static const cMarshalType *saHpiGetIdByEntityPathOut[] = { &SaErrorType, // result (SaErrorT) &SaHpiUint32Type, &SaHpiResourceIdType, &SaHpiInstrumentIdType, &SaHpiUint32Type, 0 }; static const cMarshalType *saHpiGetChildEntityPathIn[] = { &SaHpiSessionIdType, // session id (SaHpiSessionIdT) &SaHpiEntityPathType, &SaHpiUint32Type, 0 }; static const cMarshalType *saHpiGetChildEntityPathOut[] = { &SaErrorType, // result (SaErrorT) &SaHpiUint32Type, &SaHpiEntityPathType, &SaHpiUint32Type, 0 }; static const cMarshalType *saHpiResourceFailedRemoveIn[] = { &SaHpiSessionIdType, // session id (SaHpiSessionIdT) &SaHpiResourceIdType, 0 }; static const cMarshalType *saHpiResourceFailedRemoveOut[] = { &SaErrorType, // result (SaErrorT) 0 }; static const cMarshalType *saHpiEventLogInfoGetIn[] = { &SaHpiSessionIdType, // session id (SaHpiSessionIdT) &SaHpiResourceIdType, 0 }; static const cMarshalType *saHpiEventLogInfoGetOut[] = { &SaErrorType, // result (SaErrorT) &SaHpiEventLogInfoType, 0 }; static const cMarshalType *saHpiEventLogCapabilitiesGetIn[] = { &SaHpiSessionIdType, // session id (SaHpiSessionIdT) &SaHpiResourceIdType, 0 }; static const cMarshalType *saHpiEventLogCapabilitiesGetOut[] = { &SaErrorType, // result (SaErrorT) &SaHpiEventLogCapabilitiesType, 0 }; static const cMarshalType *saHpiEventLogEntryGetIn[] = { &SaHpiSessionIdType, // session id (SaHpiSessionIdT) &SaHpiResourceIdType, &SaHpiEventLogEntryIdType, 0 }; static const cMarshalType *saHpiEventLogEntryGetOut[] = { &SaErrorType, // result (SaErrorT) &SaHpiEventLogEntryIdType, &SaHpiEventLogEntryIdType, &SaHpiEventLogEntryType, &SaHpiRdrType, &SaHpiRptEntryType, 0 }; static const cMarshalType *saHpiEventLogEntryAddIn[] = { &SaHpiSessionIdType, // session id (SaHpiSessionIdT) &SaHpiResourceIdType, &SaHpiEventType, 0 }; static const cMarshalType *saHpiEventLogEntryAddOut[] = { &SaErrorType, // result (SaErrorT) 0 }; static const cMarshalType *saHpiEventLogClearIn[] = { &SaHpiSessionIdType, // session id (SaHpiSessionIdT) &SaHpiResourceIdType, 0 }; static const cMarshalType *saHpiEventLogClearOut[] = { &SaErrorType, // result (SaErrorT) 0 }; static const cMarshalType *saHpiEventLogTimeGetIn[] = { &SaHpiSessionIdType, // session id (SaHpiSessionIdT) &SaHpiResourceIdType, 0 }; static const cMarshalType *saHpiEventLogTimeGetOut[] = { &SaErrorType, // result (SaErrorT) &SaHpiTimeType, 0 }; static const cMarshalType *saHpiEventLogTimeSetIn[] = { &SaHpiSessionIdType, // session id (SaHpiSessionIdT) &SaHpiResourceIdType, &SaHpiTimeType, 0 }; static const cMarshalType *saHpiEventLogTimeSetOut[] = { &SaErrorType, // result (SaErrorT) 0 }; static const cMarshalType *saHpiEventLogStateGetIn[] = { &SaHpiSessionIdType, // session id (SaHpiSessionIdT) &SaHpiResourceIdType, 0 }; static const cMarshalType *saHpiEventLogStateGetOut[] = { &SaErrorType, // result (SaErrorT) &SaHpiBoolType, 0 }; static const cMarshalType *saHpiEventLogStateSetIn[] = { &SaHpiSessionIdType, // session id (SaHpiSessionIdT) &SaHpiResourceIdType, &SaHpiBoolType, 0 }; static const cMarshalType *saHpiEventLogStateSetOut[] = { &SaErrorType, // result (SaErrorT) 0 }; static const cMarshalType *saHpiEventLogOverflowResetIn[] = { &SaHpiSessionIdType, // session id (SaHpiSessionIdT) &SaHpiResourceIdType, 0 }; static const cMarshalType *saHpiEventLogOverflowResetOut[] = { &SaErrorType, // result (SaErrorT) 0 }; static const cMarshalType *saHpiSubscribeIn[] = { &SaHpiSessionIdType, // session id (SaHpiSessionIdT) 0 }; static const cMarshalType *saHpiSubscribeOut[] = { &SaErrorType, // result (SaErrorT) 0 }; static const cMarshalType *saHpiUnsubscribeIn[] = { &SaHpiSessionIdType, // session id (SaHpiSessionIdT) 0 }; static const cMarshalType *saHpiUnsubscribeOut[] = { &SaErrorType, // result (SaErrorT) 0 }; static const cMarshalType *saHpiEventGetIn[] = { &SaHpiSessionIdType, // session id (SaHpiSessionIdT) &SaHpiTimeoutType, 0 }; static const cMarshalType *saHpiEventGetOut[] = { &SaErrorType, // result (SaErrorT) &SaHpiEventType, &SaHpiRdrType, &SaHpiRptEntryType, &SaHpiEvtQueueStatusType, 0 }; static const cMarshalType *saHpiEventAddIn[] = { &SaHpiSessionIdType, // session id (SaHpiSessionIdT) &SaHpiEventType, 0 }; static const cMarshalType *saHpiEventAddOut[] = { &SaErrorType, // result (SaErrorT) 0 }; static const cMarshalType *saHpiAlarmGetNextIn[] = { &SaHpiSessionIdType, // session id (SaHpiSessionIdT) &SaHpiSeverityType, &SaHpiBoolType, &SaHpiAlarmType, 0 }; static const cMarshalType *saHpiAlarmGetNextOut[] = { &SaErrorType, // result (SaErrorT) &SaHpiAlarmType, 0 }; static const cMarshalType *saHpiAlarmGetIn[] = { &SaHpiSessionIdType, // session id (SaHpiSessionIdT) &SaHpiAlarmIdType, 0 }; static const cMarshalType *saHpiAlarmGetOut[] = { &SaErrorType, // result (SaErrorT) &SaHpiAlarmType, 0 }; static const cMarshalType *saHpiAlarmAcknowledgeIn[] = { &SaHpiSessionIdType, // session id (SaHpiSessionIdT) &SaHpiAlarmIdType, &SaHpiSeverityType, 0 }; static const cMarshalType *saHpiAlarmAcknowledgeOut[] = { &SaErrorType, // result (SaErrorT) 0 }; static const cMarshalType *saHpiAlarmAddIn[] = { &SaHpiSessionIdType, // session id (SaHpiSessionIdT) &SaHpiAlarmType, 0 }; static const cMarshalType *saHpiAlarmAddOut[] = { &SaErrorType, // result (SaErrorT) &SaHpiAlarmType, 0 }; static const cMarshalType *saHpiAlarmDeleteIn[] = { &SaHpiSessionIdType, // session id (SaHpiSessionIdT) &SaHpiAlarmIdType, &SaHpiSeverityType, 0 }; static const cMarshalType *saHpiAlarmDeleteOut[] = { &SaErrorType, // result (SaErrorT) 0 }; static const cMarshalType *saHpiRdrGetIn[] = { &SaHpiSessionIdType, // session id (SaHpiSessionIdT) &SaHpiResourceIdType, &SaHpiEntryIdType, 0 }; static const cMarshalType *saHpiRdrGetOut[] = { &SaErrorType, // result (SaErrorT) &SaHpiEntryIdType, &SaHpiRdrType, 0 }; static const cMarshalType *saHpiRdrGetByInstrumentIdIn[] = { &SaHpiSessionIdType, // session id (SaHpiSessionIdT) &SaHpiResourceIdType, &SaHpiRdrTypeType, &SaHpiInstrumentIdType, 0 }; static const cMarshalType *saHpiRdrGetByInstrumentIdOut[] = { &SaErrorType, // result (SaErrorT) &SaHpiRdrType, 0 }; static const cMarshalType *saHpiRdrUpdateCountGetIn[] = { &SaHpiSessionIdType, // session id (SaHpiSessionIdT) &SaHpiResourceIdType, 0 }; static const cMarshalType *saHpiRdrUpdateCountGetOut[] = { &SaErrorType, // result (SaErrorT) &SaHpiUint32Type, 0 }; static const cMarshalType *saHpiSensorReadingGetIn[] = { &SaHpiSessionIdType, // session id (SaHpiSessionIdT) &SaHpiResourceIdType, &SaHpiSensorNumType, 0 }; static const cMarshalType *saHpiSensorReadingGetOut[] = { &SaErrorType, // result (SaErrorT) &SaHpiSensorReadingType, &SaHpiEventStateType, 0 }; static const cMarshalType *saHpiSensorThresholdsGetIn[] = { &SaHpiSessionIdType, // session id (SaHpiSessionIdT) &SaHpiResourceIdType, &SaHpiSensorNumType, 0 }; static const cMarshalType *saHpiSensorThresholdsGetOut[] = { &SaErrorType, // result (SaErrorT) &SaHpiSensorThresholdsType, 0 }; static const cMarshalType *saHpiSensorThresholdsSetIn[] = { &SaHpiSessionIdType, // session id (SaHpiSessionIdT) &SaHpiResourceIdType, &SaHpiSensorNumType, &SaHpiSensorThresholdsType, 0 }; static const cMarshalType *saHpiSensorThresholdsSetOut[] = { &SaErrorType, // result (SaErrorT) 0 }; static const cMarshalType *saHpiSensorTypeGetIn[] = { &SaHpiSessionIdType, // session id (SaHpiSessionIdT) &SaHpiResourceIdType, &SaHpiSensorNumType, 0 }; static const cMarshalType *saHpiSensorTypeGetOut[] = { &SaErrorType, // result (SaErrorT) &SaHpiSensorTypeType, &SaHpiEventCategoryType, 0 }; static const cMarshalType *saHpiSensorEnableGetIn[] = { &SaHpiSessionIdType, // session id (SaHpiSessionIdT) &SaHpiResourceIdType, &SaHpiSensorNumType, 0 }; static const cMarshalType *saHpiSensorEnableGetOut[] = { &SaErrorType, // result (SaErrorT) &SaHpiBoolType, 0 }; static const cMarshalType *saHpiSensorEnableSetIn[] = { &SaHpiSessionIdType, // session id (SaHpiSessionIdT) &SaHpiResourceIdType, &SaHpiSensorNumType, &SaHpiBoolType, 0 }; static const cMarshalType *saHpiSensorEnableSetOut[] = { &SaErrorType, // result (SaErrorT) 0 }; static const cMarshalType *saHpiSensorEventEnableGetIn[] = { &SaHpiSessionIdType, // session id (SaHpiSessionIdT) &SaHpiResourceIdType, &SaHpiSensorNumType, 0 }; static const cMarshalType *saHpiSensorEventEnableGetOut[] = { &SaErrorType, // result (SaErrorT) &SaHpiBoolType, 0 }; static const cMarshalType *saHpiSensorEventEnableSetIn[] = { &SaHpiSessionIdType, // session id (SaHpiSessionIdT) &SaHpiResourceIdType, &SaHpiSensorNumType, &SaHpiBoolType, 0 }; static const cMarshalType *saHpiSensorEventEnableSetOut[] = { &SaErrorType, // result (SaErrorT) 0 }; static const cMarshalType *saHpiSensorEventMasksGetIn[] = { &SaHpiSessionIdType, // session id (SaHpiSessionIdT) &SaHpiResourceIdType, &SaHpiSensorNumType, &SaHpiEventStateType, &SaHpiEventStateType, 0 }; static const cMarshalType *saHpiSensorEventMasksGetOut[] = { &SaErrorType, // result (SaErrorT) &SaHpiEventStateType, &SaHpiEventStateType, 0 }; static const cMarshalType *saHpiSensorEventMasksSetIn[] = { &SaHpiSessionIdType, // session id (SaHpiSessionIdT) &SaHpiResourceIdType, &SaHpiSensorNumType, &SaHpiUint32Type, &SaHpiEventStateType, &SaHpiEventStateType, 0 }; static const cMarshalType *saHpiSensorEventMasksSetOut[] = { &SaErrorType, // result (SaErrorT) 0 }; static const cMarshalType *saHpiControlTypeGetIn[] = { &SaHpiSessionIdType, // session id (SaHpiSessionIdT) &SaHpiResourceIdType, &SaHpiCtrlNumType, 0 }; static const cMarshalType *saHpiControlTypeGetOut[] = { &SaErrorType, // result (SaErrorT) &SaHpiCtrlTypeType, 0 }; static const cMarshalType *saHpiControlGetIn[] = { &SaHpiSessionIdType, // session id (SaHpiSessionIdT) &SaHpiResourceIdType, &SaHpiCtrlNumType, &SaHpiCtrlStateType, 0 }; static const cMarshalType *saHpiControlGetOut[] = { &SaErrorType, // result (SaErrorT) &SaHpiCtrlModeType, &SaHpiCtrlStateType, 0 }; static const cMarshalType *saHpiControlSetIn[] = { &SaHpiSessionIdType, // session id (SaHpiSessionIdT) &SaHpiResourceIdType, &SaHpiCtrlNumType, &SaHpiCtrlModeType, &SaHpiCtrlStateType, 0 }; static const cMarshalType *saHpiControlSetOut[] = { &SaErrorType, // result (SaErrorT) 0 }; static const cMarshalType *saHpiIdrInfoGetIn[] = { &SaHpiSessionIdType, // session id (SaHpiSessionIdT) &SaHpiResourceIdType, &SaHpiIdrIdType, 0 }; static const cMarshalType *saHpiIdrInfoGetOut[] = { &SaErrorType, // result (SaErrorT) &SaHpiIdrInfoType, 0 }; static const cMarshalType *saHpiIdrAreaHeaderGetIn[] = { &SaHpiSessionIdType, // session id (SaHpiSessionIdT) &SaHpiResourceIdType, &SaHpiIdrIdType, &SaHpiIdrAreaTypeType, &SaHpiEntryIdType, 0 }; static const cMarshalType *saHpiIdrAreaHeaderGetOut[] = { &SaErrorType, // result (SaErrorT) &SaHpiEntryIdType, &SaHpiIdrAreaHeaderType, 0 }; static const cMarshalType *saHpiIdrAreaAddIn[] = { &SaHpiSessionIdType, // session id (SaHpiSessionIdT) &SaHpiResourceIdType, &SaHpiIdrIdType, &SaHpiIdrAreaTypeType, 0 }; static const cMarshalType *saHpiIdrAreaAddOut[] = { &SaErrorType, // result (SaErrorT) &SaHpiEntryIdType, 0 }; static const cMarshalType *saHpiIdrAreaAddByIdIn[] = { &SaHpiSessionIdType, // session id (SaHpiSessionIdT) &SaHpiResourceIdType, &SaHpiIdrIdType, &SaHpiIdrAreaTypeType, &SaHpiEntryIdType, 0 }; static const cMarshalType *saHpiIdrAreaAddByIdOut[] = { &SaErrorType, // result (SaErrorT) 0 }; static const cMarshalType *saHpiIdrAreaDeleteIn[] = { &SaHpiSessionIdType, // session id (SaHpiSessionIdT) &SaHpiResourceIdType, &SaHpiIdrIdType, &SaHpiEntryIdType, 0 }; static const cMarshalType *saHpiIdrAreaDeleteOut[] = { &SaErrorType, // result (SaErrorT) 0 }; static const cMarshalType *saHpiIdrFieldGetIn[] = { &SaHpiSessionIdType, // session id (SaHpiSessionIdT) &SaHpiResourceIdType, &SaHpiIdrIdType, &SaHpiEntryIdType, &SaHpiIdrFieldTypeType, &SaHpiEntryIdType, 0 }; static const cMarshalType *saHpiIdrFieldGetOut[] = { &SaErrorType, // result (SaErrorT) &SaHpiEntryIdType, &SaHpiIdrFieldType, 0 }; static const cMarshalType *saHpiIdrFieldAddIn[] = { &SaHpiSessionIdType, // session id (SaHpiSessionIdT) &SaHpiResourceIdType, &SaHpiIdrIdType, &SaHpiIdrFieldType, 0 }; static const cMarshalType *saHpiIdrFieldAddOut[] = { &SaErrorType, // result (SaErrorT) &SaHpiIdrFieldType, 0 }; static const cMarshalType *saHpiIdrFieldAddByIdIn[] = { &SaHpiSessionIdType, // session id (SaHpiSessionIdT) &SaHpiResourceIdType, &SaHpiIdrIdType, &SaHpiIdrFieldType, 0 }; static const cMarshalType *saHpiIdrFieldAddByIdOut[] = { &SaErrorType, // result (SaErrorT) &SaHpiIdrFieldType, 0 }; static const cMarshalType *saHpiIdrFieldSetIn[] = { &SaHpiSessionIdType, // session id (SaHpiSessionIdT) &SaHpiResourceIdType, &SaHpiIdrIdType, &SaHpiIdrFieldType, 0 }; static const cMarshalType *saHpiIdrFieldSetOut[] = { &SaErrorType, // result (SaErrorT) 0 }; static const cMarshalType *saHpiIdrFieldDeleteIn[] = { &SaHpiSessionIdType, // session id (SaHpiSessionIdT) &SaHpiResourceIdType, &SaHpiIdrIdType, &SaHpiEntryIdType, &SaHpiEntryIdType, 0 }; static const cMarshalType *saHpiIdrFieldDeleteOut[] = { &SaErrorType, // result (SaErrorT) 0 }; static const cMarshalType *saHpiWatchdogTimerGetIn[] = { &SaHpiSessionIdType, // session id (SaHpiSessionIdT) &SaHpiResourceIdType, &SaHpiWatchdogNumType, 0 }; static const cMarshalType *saHpiWatchdogTimerGetOut[] = { &SaErrorType, // result (SaErrorT) &SaHpiWatchdogType, 0 }; static const cMarshalType *saHpiWatchdogTimerSetIn[] = { &SaHpiSessionIdType, // session id (SaHpiSessionIdT) &SaHpiResourceIdType, &SaHpiWatchdogNumType, &SaHpiWatchdogType, 0 }; static const cMarshalType *saHpiWatchdogTimerSetOut[] = { &SaErrorType, // result (SaErrorT) 0 }; static const cMarshalType *saHpiWatchdogTimerResetIn[] = { &SaHpiSessionIdType, // session id (SaHpiSessionIdT) &SaHpiResourceIdType, &SaHpiWatchdogNumType, 0 }; static const cMarshalType *saHpiWatchdogTimerResetOut[] = { &SaErrorType, // result (SaErrorT) 0 }; static const cMarshalType *saHpiAnnunciatorGetNextIn[] = { &SaHpiSessionIdType, // session id (SaHpiSessionIdT) &SaHpiResourceIdType, &SaHpiAnnunciatorNumType, &SaHpiSeverityType, &SaHpiBoolType, &SaHpiAnnouncementType, 0 }; static const cMarshalType *saHpiAnnunciatorGetNextOut[] = { &SaErrorType, // result (SaErrorT) &SaHpiAnnouncementType, 0 }; static const cMarshalType *saHpiAnnunciatorGetIn[] = { &SaHpiSessionIdType, // session id (SaHpiSessionIdT) &SaHpiResourceIdType, &SaHpiAnnunciatorNumType, &SaHpiEntryIdType, 0 }; static const cMarshalType *saHpiAnnunciatorGetOut[] = { &SaErrorType, // result (SaErrorT) &SaHpiAnnouncementType, 0 }; static const cMarshalType *saHpiAnnunciatorAcknowledgeIn[] = { &SaHpiSessionIdType, // session id (SaHpiSessionIdT) &SaHpiResourceIdType, &SaHpiAnnunciatorNumType, &SaHpiEntryIdType, &SaHpiSeverityType, 0 }; static const cMarshalType *saHpiAnnunciatorAcknowledgeOut[] = { &SaErrorType, // result (SaErrorT) 0 }; static const cMarshalType *saHpiAnnunciatorAddIn[] = { &SaHpiSessionIdType, // session id (SaHpiSessionIdT) &SaHpiResourceIdType, &SaHpiAnnunciatorNumType, &SaHpiAnnouncementType, 0 }; static const cMarshalType *saHpiAnnunciatorAddOut[] = { &SaErrorType, // result (SaErrorT) &SaHpiAnnouncementType, 0 }; static const cMarshalType *saHpiAnnunciatorDeleteIn[] = { &SaHpiSessionIdType, // session id (SaHpiSessionIdT) &SaHpiResourceIdType, &SaHpiAnnunciatorNumType, &SaHpiEntryIdType, &SaHpiSeverityType, 0 }; static const cMarshalType *saHpiAnnunciatorDeleteOut[] = { &SaErrorType, // result (SaErrorT) 0 }; static const cMarshalType *saHpiAnnunciatorModeGetIn[] = { &SaHpiSessionIdType, // session id (SaHpiSessionIdT) &SaHpiResourceIdType, &SaHpiAnnunciatorNumType, 0 }; static const cMarshalType *saHpiAnnunciatorModeGetOut[] = { &SaErrorType, // result (SaErrorT) &SaHpiAnnunciatorModeType, 0 }; static const cMarshalType *saHpiAnnunciatorModeSetIn[] = { &SaHpiSessionIdType, // session id (SaHpiSessionIdT) &SaHpiResourceIdType, &SaHpiAnnunciatorNumType, &SaHpiAnnunciatorModeType, 0 }; static const cMarshalType *saHpiAnnunciatorModeSetOut[] = { &SaErrorType, // result (SaErrorT) 0 }; // DIMIs static const cMarshalType *saHpiDimiInfoGetIn[] = { &SaHpiSessionIdType, // session id (SaHpiSessionIdT) &SaHpiResourceIdType, &SaHpiDimiNumType, 0 }; static const cMarshalType *saHpiDimiInfoGetOut[] = { &SaErrorType, // result (SaErrorT) &SaHpiDimiInfoType, 0 }; static const cMarshalType *saHpiDimiTestInfoGetIn[] = { &SaHpiSessionIdType, // session id (SaHpiSessionIdT) &SaHpiResourceIdType, &SaHpiDimiNumType, &SaHpiDimiTestNumType, 0 }; static const cMarshalType *saHpiDimiTestInfoGetOut[] = { &SaErrorType, // result (SaErrorT) &SaHpiDimiTestType, 0 }; static const cMarshalType *saHpiDimiTestReadinessGetIn[] = { &SaHpiSessionIdType, // session id (SaHpiSessionIdT) &SaHpiResourceIdType, &SaHpiDimiNumType, &SaHpiDimiTestNumType, 0 }; static const cMarshalType *saHpiDimiTestReadinessGetOut[] = { &SaErrorType, // result (SaErrorT) &SaHpiDimiReadyType, 0 }; static const cMarshalType *saHpiDimiTestStartIn[] = { &SaHpiSessionIdType, &SaHpiResourceIdType, &SaHpiDimiNumType, &SaHpiDimiTestNumType, &SaHpiDimiTestVariableParamsListType, 0 }; static const cMarshalType *saHpiDimiTestStartOut[] = { &SaErrorType, 0 }; static const cMarshalType *saHpiDimiTestCancelIn[] = { &SaHpiSessionIdType, &SaHpiResourceIdType, &SaHpiDimiNumType, &SaHpiDimiTestNumType, 0 }; static const cMarshalType *saHpiDimiTestCancelOut[] = { &SaErrorType, 0 }; static const cMarshalType *saHpiDimiTestStatusGetIn[] = { &SaHpiSessionIdType, &SaHpiResourceIdType, &SaHpiDimiNumType, &SaHpiDimiTestNumType, 0 }; static const cMarshalType *saHpiDimiTestStatusGetOut[] = { &SaErrorType, &SaHpiDimiTestPercentCompletedType, &SaHpiDimiTestRunStatusType, 0 }; static const cMarshalType *saHpiDimiTestResultsGetIn[] = { &SaHpiSessionIdType, &SaHpiResourceIdType, &SaHpiDimiNumType, &SaHpiDimiTestNumType, 0 }; static const cMarshalType *saHpiDimiTestResultsGetOut[] = { &SaErrorType, &SaHpiDimiTestResultsType, 0 }; // FUMIs static const cMarshalType *saHpiFumiSpecInfoGetIn[]= { &SaHpiSessionIdType, &SaHpiResourceIdType, &SaHpiFumiNumType, 0 }; static const cMarshalType *saHpiFumiSpecInfoGetOut[] = { &SaErrorType, &SaHpiFumiSpecInfoType, 0 }; static const cMarshalType *saHpiFumiServiceImpactGetIn[]= { &SaHpiSessionIdType, &SaHpiResourceIdType, &SaHpiFumiNumType, 0 }; static const cMarshalType *saHpiFumiServiceImpactGetOut[] = { &SaErrorType, &SaHpiFumiServiceImpactDataType, 0 }; static const cMarshalType *saHpiFumiSourceSetIn[]= { &SaHpiSessionIdType, &SaHpiResourceIdType, &SaHpiFumiNumType, &SaHpiBankNumType, &SaHpiTextBufferType, 0 }; static const cMarshalType *saHpiFumiSourceSetOut[] = { &SaErrorType, 0 }; static const cMarshalType *saHpiFumiSourceInfoValidateStartIn[]= { &SaHpiSessionIdType, &SaHpiResourceIdType, &SaHpiFumiNumType, &SaHpiBankNumType, 0 }; static const cMarshalType *saHpiFumiSourceInfoValidateStartOut[] = { &SaErrorType, 0 }; static const cMarshalType *saHpiFumiSourceInfoGetIn[]= { &SaHpiSessionIdType, &SaHpiResourceIdType, &SaHpiFumiNumType, &SaHpiBankNumType, 0 }; static const cMarshalType *saHpiFumiSourceInfoGetOut[] = { &SaErrorType, &SaHpiFumiSourceInfoType, 0 }; static const cMarshalType *saHpiFumiSourceComponentInfoGetIn[]= { &SaHpiSessionIdType, &SaHpiResourceIdType, &SaHpiFumiNumType, &SaHpiBankNumType, &SaHpiEntryIdType, 0 }; static const cMarshalType *saHpiFumiSourceComponentInfoGetOut[] = { &SaErrorType, &SaHpiEntryIdType, &SaHpiFumiComponentInfoType, 0 }; static const cMarshalType *saHpiFumiTargetInfoGetIn[]= { &SaHpiSessionIdType, &SaHpiResourceIdType, &SaHpiFumiNumType, &SaHpiBankNumType, 0 }; static const cMarshalType *saHpiFumiTargetInfoGetOut[] = { &SaErrorType, &SaHpiFumiBankInfoType, 0 }; static const cMarshalType *saHpiFumiTargetComponentInfoGetIn[]= { &SaHpiSessionIdType, &SaHpiResourceIdType, &SaHpiFumiNumType, &SaHpiBankNumType, &SaHpiEntryIdType, 0 }; static const cMarshalType *saHpiFumiTargetComponentInfoGetOut[] = { &SaErrorType, &SaHpiEntryIdType, &SaHpiFumiComponentInfoType, 0 }; static const cMarshalType *saHpiFumiLogicalTargetInfoGetIn[]= { &SaHpiSessionIdType, &SaHpiResourceIdType, &SaHpiFumiNumType, 0 }; static const cMarshalType *saHpiFumiLogicalTargetInfoGetOut[] = { &SaErrorType, &SaHpiFumiLogicalBankInfoType, 0 }; static const cMarshalType *saHpiFumiLogicalTargetComponentInfoGetIn[]= { &SaHpiSessionIdType, &SaHpiResourceIdType, &SaHpiFumiNumType, &SaHpiEntryIdType, 0 }; static const cMarshalType *saHpiFumiLogicalTargetComponentInfoGetOut[] = { &SaErrorType, &SaHpiEntryIdType, &SaHpiFumiLogicalComponentInfoType, 0 }; static const cMarshalType *saHpiFumiBackupStartIn[]= { &SaHpiSessionIdType, &SaHpiResourceIdType, &SaHpiFumiNumType, 0 }; static const cMarshalType *saHpiFumiBackupStartOut[] = { &SaErrorType, 0 }; static const cMarshalType *saHpiFumiBankBootOrderSetIn[]= { &SaHpiSessionIdType, &SaHpiResourceIdType, &SaHpiFumiNumType, &SaHpiBankNumType, &SaHpiUint32Type, 0 }; static const cMarshalType *saHpiFumiBankBootOrderSetOut[] = { &SaErrorType, 0 }; static const cMarshalType *saHpiFumiBankCopyStartIn[]= { &SaHpiSessionIdType, &SaHpiResourceIdType, &SaHpiFumiNumType, &SaHpiBankNumType, &SaHpiBankNumType, 0 }; static const cMarshalType *saHpiFumiBankCopyStartOut[] = { &SaErrorType, 0 }; static const cMarshalType *saHpiFumiInstallStartIn[]= { &SaHpiSessionIdType, &SaHpiResourceIdType, &SaHpiFumiNumType, &SaHpiBankNumType, 0 }; static const cMarshalType *saHpiFumiInstallStartOut[] = { &SaErrorType, 0 }; static const cMarshalType *saHpiFumiUpgradeStatusGetIn[]= { &SaHpiSessionIdType, &SaHpiResourceIdType, &SaHpiFumiNumType, &SaHpiBankNumType, 0 }; static const cMarshalType *saHpiFumiUpgradeStatusGetOut[] = { &SaErrorType, &SaHpiFumiUpgradeStatusType, 0 }; static const cMarshalType *saHpiFumiTargetVerifyStartIn[]= { &SaHpiSessionIdType, &SaHpiResourceIdType, &SaHpiFumiNumType, &SaHpiBankNumType, 0 }; static const cMarshalType *saHpiFumiTargetVerifyStartOut[] = { &SaErrorType, 0 }; static const cMarshalType *saHpiFumiTargetVerifyMainStartIn[]= { &SaHpiSessionIdType, &SaHpiResourceIdType, &SaHpiFumiNumType, 0 }; static const cMarshalType *saHpiFumiTargetVerifyMainStartOut[] = { &SaErrorType, 0 }; static const cMarshalType *saHpiFumiUpgradeCancelIn[]= { &SaHpiSessionIdType, &SaHpiResourceIdType, &SaHpiFumiNumType, &SaHpiBankNumType, 0 }; static const cMarshalType *saHpiFumiUpgradeCancelOut[] = { &SaErrorType, 0 }; static const cMarshalType *saHpiFumiAutoRollbackDisableGetIn[] = { &SaHpiSessionIdType, &SaHpiResourceIdType, &SaHpiFumiNumType, 0 }; static const cMarshalType *saHpiFumiAutoRollbackDisableGetOut[] = { &SaErrorType, &SaHpiBoolType, 0 }; static const cMarshalType *saHpiFumiAutoRollbackDisableSetIn[] = { &SaHpiSessionIdType, &SaHpiResourceIdType, &SaHpiFumiNumType, &SaHpiBoolType, 0 }; static const cMarshalType *saHpiFumiAutoRollbackDisableSetOut[] = { &SaErrorType, // result (SaErrorT) 0 }; static const cMarshalType *saHpiFumiRollbackStartIn[]= { &SaHpiSessionIdType, &SaHpiResourceIdType, &SaHpiFumiNumType, 0 }; static const cMarshalType *saHpiFumiRollbackStartOut[] = { &SaErrorType, 0 }; static const cMarshalType *saHpiFumiActivateIn[]= { &SaHpiSessionIdType, &SaHpiResourceIdType, &SaHpiFumiNumType, 0 }; static const cMarshalType *saHpiFumiActivateOut[] = { &SaErrorType, 0 }; static const cMarshalType *saHpiFumiActivateStartIn[]= { &SaHpiSessionIdType, &SaHpiResourceIdType, &SaHpiFumiNumType, &SaHpiBoolType, 0 }; static const cMarshalType *saHpiFumiActivateStartOut[] = { &SaErrorType, 0 }; static const cMarshalType *saHpiFumiCleanupIn[]= { &SaHpiSessionIdType, &SaHpiResourceIdType, &SaHpiFumiNumType, &SaHpiBankNumType, 0 }; static const cMarshalType *saHpiFumiCleanupOut[] = { &SaErrorType, 0 }; // Hotswap static const cMarshalType *saHpiHotSwapPolicyCancelIn[] = { &SaHpiSessionIdType, // session id (SaHpiSessionIdT) &SaHpiResourceIdType, 0 }; static const cMarshalType *saHpiHotSwapPolicyCancelOut[] = { &SaErrorType, // result (SaErrorT) 0 }; static const cMarshalType *saHpiResourceActiveSetIn[] = { &SaHpiSessionIdType, // session id (SaHpiSessionIdT) &SaHpiResourceIdType, 0 }; static const cMarshalType *saHpiResourceActiveSetOut[] = { &SaErrorType, // result (SaErrorT) 0 }; static const cMarshalType *saHpiResourceInactiveSetIn[] = { &SaHpiSessionIdType, // session id (SaHpiSessionIdT) &SaHpiResourceIdType, 0 }; static const cMarshalType *saHpiResourceInactiveSetOut[] = { &SaErrorType, // result (SaErrorT) 0 }; static const cMarshalType *saHpiAutoInsertTimeoutGetIn[] = { &SaHpiSessionIdType, // session id (SaHpiSessionIdT) 0 }; static const cMarshalType *saHpiAutoInsertTimeoutGetOut[] = { &SaErrorType, // result (SaErrorT) &SaHpiTimeoutType, 0 }; static const cMarshalType *saHpiAutoInsertTimeoutSetIn[] = { &SaHpiSessionIdType, // session id (SaHpiSessionIdT) &SaHpiTimeoutType, 0 }; static const cMarshalType *saHpiAutoInsertTimeoutSetOut[] = { &SaErrorType, // result (SaErrorT) 0 }; static const cMarshalType *saHpiAutoExtractTimeoutGetIn[] = { &SaHpiSessionIdType, // session id (SaHpiSessionIdT) &SaHpiResourceIdType, 0 }; static const cMarshalType *saHpiAutoExtractTimeoutGetOut[] = { &SaErrorType, // result (SaErrorT) &SaHpiTimeoutType, 0 }; static const cMarshalType *saHpiAutoExtractTimeoutSetIn[] = { &SaHpiSessionIdType, // session id (SaHpiSessionIdT) &SaHpiResourceIdType, &SaHpiTimeoutType, 0 }; static const cMarshalType *saHpiAutoExtractTimeoutSetOut[] = { &SaErrorType, // result (SaErrorT) 0 }; static const cMarshalType *saHpiHotSwapStateGetIn[] = { &SaHpiSessionIdType, // session id (SaHpiSessionIdT) &SaHpiResourceIdType, 0 }; static const cMarshalType *saHpiHotSwapStateGetOut[] = { &SaErrorType, // result (SaErrorT) &SaHpiHsStateType, 0 }; static const cMarshalType *saHpiHotSwapActionRequestIn[] = { &SaHpiSessionIdType, // session id (SaHpiSessionIdT) &SaHpiResourceIdType, &SaHpiHsActionType, 0 }; static const cMarshalType *saHpiHotSwapActionRequestOut[] = { &SaErrorType, // result (SaErrorT) 0 }; static const cMarshalType *saHpiHotSwapIndicatorStateGetIn[] = { &SaHpiSessionIdType, // session id (SaHpiSessionIdT) &SaHpiResourceIdType, 0 }; static const cMarshalType *saHpiHotSwapIndicatorStateGetOut[] = { &SaErrorType, // result (SaErrorT) &SaHpiHsIndicatorStateType, 0 }; static const cMarshalType *saHpiHotSwapIndicatorStateSetIn[] = { &SaHpiSessionIdType, // session id (SaHpiSessionIdT) &SaHpiResourceIdType, &SaHpiHsIndicatorStateType, 0 }; static const cMarshalType *saHpiHotSwapIndicatorStateSetOut[] = { &SaErrorType, // result (SaErrorT) 0 }; static const cMarshalType *saHpiParmControlIn[] = { &SaHpiSessionIdType, // session id (SaHpiSessionIdT) &SaHpiResourceIdType, &SaHpiParmActionType, 0 }; static const cMarshalType *saHpiParmControlOut[] = { &SaErrorType, // result (SaErrorT) 0 }; static const cMarshalType *saHpiResourceLoadIdGetIn[] = { &SaHpiSessionIdType, // session id (SaHpiSessionIdT) &SaHpiResourceIdType, 0 }; static const cMarshalType *saHpiResourceLoadIdGetOut[] = { &SaErrorType, // result (SaErrorT) &SaHpiLoadIdType, 0 }; static const cMarshalType *saHpiResourceLoadIdSetIn[] = { &SaHpiSessionIdType, // session id (SaHpiSessionIdT) &SaHpiResourceIdType, &SaHpiLoadIdType, 0 }; static const cMarshalType *saHpiResourceLoadIdSetOut[] = { &SaErrorType, // result (SaErrorT) 0 }; static const cMarshalType *saHpiResourceResetStateGetIn[] = { &SaHpiSessionIdType, // session id (SaHpiSessionIdT) &SaHpiResourceIdType, 0 }; static const cMarshalType *saHpiResourceResetStateGetOut[] = { &SaErrorType, // result (SaErrorT) &SaHpiResetActionType, 0 }; static const cMarshalType *saHpiResourceResetStateSetIn[] = { &SaHpiSessionIdType, // session id (SaHpiSessionIdT) &SaHpiResourceIdType, &SaHpiResetActionType, 0 }; static const cMarshalType *saHpiResourceResetStateSetOut[] = { &SaErrorType, // result (SaErrorT) 0 }; static const cMarshalType *saHpiResourcePowerStateGetIn[] = { &SaHpiSessionIdType, // session id (SaHpiSessionIdT) &SaHpiResourceIdType, 0 }; static const cMarshalType *saHpiResourcePowerStateGetOut[] = { &SaErrorType, // result (SaErrorT) &SaHpiPowerStateType, 0 }; static const cMarshalType *saHpiResourcePowerStateSetIn[] = { &SaHpiSessionIdType, // session id (SaHpiSessionIdT) &SaHpiResourceIdType, &SaHpiPowerStateType, 0 }; static const cMarshalType *saHpiResourcePowerStateSetOut[] = { &SaErrorType, // result (SaErrorT) 0 }; // oHpi static const cMarshalType *oHpiHandlerCreateIn[] = { &oHpiHandlerConfigType, // dummy entry 0 }; static const cMarshalType *oHpiHandlerCreateOut[] = { &SaErrorType, // result (SaErrorT) &oHpiHandlerIdType, // handler id 0 }; static const cMarshalType *oHpiHandlerDestroyIn[] = { &oHpiHandlerIdType, // handler id 0 }; static const cMarshalType *oHpiHandlerDestroyOut[] = { &SaErrorType, // result (SaErrorT) 0 }; static const cMarshalType *oHpiHandlerInfoIn[] = { &oHpiHandlerIdType, // handler id 0 }; static const cMarshalType *oHpiHandlerInfoOut[] = { &SaErrorType, // result (SaErrorT) &oHpiHandlerInfoType, // handler info 0 }; static const cMarshalType *oHpiHandlerGetNextIn[] = { &oHpiHandlerIdType, // handler id 0 }; static const cMarshalType *oHpiHandlerGetNextOut[] = { &SaErrorType, // result (SaErrorT) &oHpiHandlerIdType, // handler id 0 }; static const cMarshalType *oHpiHandlerFindIn[] = { &SaHpiSessionIdType, // session id &SaHpiResourceIdType, // resource id 0 }; static const cMarshalType *oHpiHandlerFindOut[] = { &SaErrorType, // result (SaErrorT) &oHpiHandlerIdType, // handler id 0 }; static const cMarshalType *oHpiHandlerRetryIn[] = { &oHpiHandlerIdType, // handler id 0 }; static const cMarshalType *oHpiHandlerRetryOut[] = { &SaErrorType, // result (SaErrorT) 0 }; static const cMarshalType *oHpiGlobalParamGetIn[] = { &oHpiGlobalParamType, // global param 0 }; static const cMarshalType *oHpiGlobalParamGetOut[] = { &SaErrorType, // result (SaErrorT) &oHpiGlobalParamType, // global param 0 }; static const cMarshalType *oHpiGlobalParamSetIn[] = { &oHpiGlobalParamType, // global param 0 }; static const cMarshalType *oHpiGlobalParamSetOut[] = { &SaErrorType, // result (SaErrorT) 0 }; static const cMarshalType *oHpiInjectEventIn[] = { &oHpiHandlerIdType, // global param &SaHpiEventType, &SaHpiRptEntryType, &SaHpiRdrType, //TODO....needs to be an arrary...not sure what to do 0 }; static const cMarshalType *oHpiInjectEventOut[] = { &SaErrorType, // result (SaErrorT) 0 }; static cHpiMarshal hpi_marshal[] = { dHpiMarshalEntry( saHpiSessionOpen ), dHpiMarshalEntry( saHpiSessionClose ), dHpiMarshalEntry( saHpiDiscover ), dHpiMarshalEntry( saHpiDomainInfoGet ), dHpiMarshalEntry( saHpiDrtEntryGet ), dHpiMarshalEntry( saHpiDomainTagSet ), dHpiMarshalEntry( saHpiRptEntryGet ), dHpiMarshalEntry( saHpiRptEntryGetByResourceId ), dHpiMarshalEntry( saHpiResourceSeveritySet ), dHpiMarshalEntry( saHpiResourceTagSet ), dHpiMarshalEntry( saHpiResourceIdGet ), dHpiMarshalEntry( saHpiGetIdByEntityPath ), dHpiMarshalEntry( saHpiGetChildEntityPath ), dHpiMarshalEntry( saHpiResourceFailedRemove ), dHpiMarshalEntry( saHpiEventLogInfoGet ), dHpiMarshalEntry( saHpiEventLogCapabilitiesGet ), dHpiMarshalEntry( saHpiEventLogEntryGet ), dHpiMarshalEntry( saHpiEventLogEntryAdd ), dHpiMarshalEntry( saHpiEventLogClear ), dHpiMarshalEntry( saHpiEventLogTimeGet ), dHpiMarshalEntry( saHpiEventLogTimeSet ), dHpiMarshalEntry( saHpiEventLogStateGet ), dHpiMarshalEntry( saHpiEventLogStateSet ), dHpiMarshalEntry( saHpiEventLogOverflowReset ), dHpiMarshalEntry( saHpiSubscribe ), dHpiMarshalEntry( saHpiUnsubscribe ), dHpiMarshalEntry( saHpiEventGet ), dHpiMarshalEntry( saHpiEventAdd ), dHpiMarshalEntry( saHpiAlarmGetNext ), dHpiMarshalEntry( saHpiAlarmGet ), dHpiMarshalEntry( saHpiAlarmAcknowledge ), dHpiMarshalEntry( saHpiAlarmAdd ), dHpiMarshalEntry( saHpiAlarmDelete ), dHpiMarshalEntry( saHpiRdrGet ), dHpiMarshalEntry( saHpiRdrGetByInstrumentId ), dHpiMarshalEntry( saHpiSensorReadingGet ), dHpiMarshalEntry( saHpiSensorThresholdsGet ), dHpiMarshalEntry( saHpiSensorThresholdsSet ), dHpiMarshalEntry( saHpiSensorTypeGet ), dHpiMarshalEntry( saHpiSensorEnableGet ), dHpiMarshalEntry( saHpiSensorEnableSet ), dHpiMarshalEntry( saHpiSensorEventEnableGet ), dHpiMarshalEntry( saHpiSensorEventEnableSet ), dHpiMarshalEntry( saHpiSensorEventMasksGet ), dHpiMarshalEntry( saHpiSensorEventMasksSet ), dHpiMarshalEntry( saHpiControlTypeGet ), dHpiMarshalEntry( saHpiControlGet ), dHpiMarshalEntry( saHpiControlSet ), dHpiMarshalEntry( saHpiIdrInfoGet ), dHpiMarshalEntry( saHpiIdrAreaHeaderGet ), dHpiMarshalEntry( saHpiIdrAreaAdd ), dHpiMarshalEntry( saHpiIdrAreaAddById ), dHpiMarshalEntry( saHpiIdrAreaDelete ), dHpiMarshalEntry( saHpiIdrFieldGet ), dHpiMarshalEntry( saHpiIdrFieldAdd ), dHpiMarshalEntry( saHpiIdrFieldAddById ), dHpiMarshalEntry( saHpiIdrFieldSet ), dHpiMarshalEntry( saHpiIdrFieldDelete ), dHpiMarshalEntry( saHpiWatchdogTimerGet ), dHpiMarshalEntry( saHpiWatchdogTimerSet ), dHpiMarshalEntry( saHpiWatchdogTimerReset ), dHpiMarshalEntry( saHpiAnnunciatorGetNext ), dHpiMarshalEntry( saHpiAnnunciatorGet ), dHpiMarshalEntry( saHpiAnnunciatorAcknowledge ), dHpiMarshalEntry( saHpiAnnunciatorAdd ), dHpiMarshalEntry( saHpiAnnunciatorDelete ), dHpiMarshalEntry( saHpiAnnunciatorModeGet ), dHpiMarshalEntry( saHpiAnnunciatorModeSet ), dHpiMarshalEntry( saHpiDimiInfoGet ), dHpiMarshalEntry( saHpiDimiTestInfoGet ), dHpiMarshalEntry( saHpiDimiTestReadinessGet ), dHpiMarshalEntry( saHpiDimiTestStart ), dHpiMarshalEntry( saHpiDimiTestCancel ), dHpiMarshalEntry( saHpiDimiTestStatusGet ), dHpiMarshalEntry( saHpiDimiTestResultsGet ), dHpiMarshalEntry( saHpiFumiSourceSet ), dHpiMarshalEntry( saHpiFumiSourceInfoValidateStart ), dHpiMarshalEntry( saHpiFumiSourceInfoGet ), dHpiMarshalEntry( saHpiFumiTargetInfoGet ), dHpiMarshalEntry( saHpiFumiBackupStart ), dHpiMarshalEntry( saHpiFumiBankBootOrderSet ), dHpiMarshalEntry( saHpiFumiBankCopyStart ), dHpiMarshalEntry( saHpiFumiInstallStart ), dHpiMarshalEntry( saHpiFumiUpgradeStatusGet ), dHpiMarshalEntry( saHpiFumiTargetVerifyStart ), dHpiMarshalEntry( saHpiFumiUpgradeCancel ), dHpiMarshalEntry( saHpiFumiRollbackStart ), dHpiMarshalEntry( saHpiFumiActivate ), dHpiMarshalEntry( saHpiHotSwapPolicyCancel ), dHpiMarshalEntry( saHpiResourceActiveSet ), dHpiMarshalEntry( saHpiResourceInactiveSet ), dHpiMarshalEntry( saHpiAutoInsertTimeoutGet ), dHpiMarshalEntry( saHpiAutoInsertTimeoutSet ), dHpiMarshalEntry( saHpiAutoExtractTimeoutGet ), dHpiMarshalEntry( saHpiAutoExtractTimeoutSet ), dHpiMarshalEntry( saHpiHotSwapStateGet ), dHpiMarshalEntry( saHpiHotSwapActionRequest ), dHpiMarshalEntry( saHpiHotSwapIndicatorStateGet ), dHpiMarshalEntry( saHpiHotSwapIndicatorStateSet ), dHpiMarshalEntry( saHpiParmControl ), dHpiMarshalEntry( saHpiResourceLoadIdGet ), dHpiMarshalEntry( saHpiResourceLoadIdSet ), dHpiMarshalEntry( saHpiResourceResetStateGet ), dHpiMarshalEntry( saHpiResourceResetStateSet ), dHpiMarshalEntry( saHpiResourcePowerStateGet ), dHpiMarshalEntry( saHpiResourcePowerStateSet ), dHpiMarshalEntry( oHpiHandlerCreate ), dHpiMarshalEntry( oHpiHandlerDestroy ), dHpiMarshalEntry( oHpiHandlerInfo ), dHpiMarshalEntry( oHpiHandlerGetNext ), dHpiMarshalEntry( oHpiHandlerFind ), dHpiMarshalEntry( oHpiHandlerRetry ), dHpiMarshalEntry( oHpiGlobalParamGet ), dHpiMarshalEntry( oHpiGlobalParamSet ), dHpiMarshalEntry( oHpiInjectEvent ), // New B.03.01 functions // They are added to the end of enum in order to keep ABI compatibility dHpiMarshalEntry( saHpiMyEntityPathGet ), dHpiMarshalEntry( saHpiRdrUpdateCountGet ), dHpiMarshalEntry( saHpiFumiSpecInfoGet ), dHpiMarshalEntry( saHpiFumiServiceImpactGet ), dHpiMarshalEntry( saHpiFumiSourceComponentInfoGet ), dHpiMarshalEntry( saHpiFumiTargetComponentInfoGet ), dHpiMarshalEntry( saHpiFumiLogicalTargetInfoGet ), dHpiMarshalEntry( saHpiFumiLogicalTargetComponentInfoGet ), dHpiMarshalEntry( saHpiFumiTargetVerifyMainStart ), dHpiMarshalEntry( saHpiFumiAutoRollbackDisableGet ), dHpiMarshalEntry( saHpiFumiAutoRollbackDisableSet ), dHpiMarshalEntry( saHpiFumiActivateStart ), dHpiMarshalEntry( saHpiFumiCleanup ), }; static int hpi_marshal_num = sizeof( hpi_marshal ) / sizeof( cHpiMarshal ); static int hpi_marshal_init = 0; cHpiMarshal * HpiMarshalFind( int id ) { if ( !hpi_marshal_init ) { int i; for( i = 0; i < hpi_marshal_num; i++ ) { // printf("Entry %d\n", i); hpi_marshal[i].m_request_len = MarshalSizeArray( hpi_marshal[i].m_request ); hpi_marshal[i].m_reply_len = MarshalSizeArray( hpi_marshal[i].m_reply ); } hpi_marshal_init = 1; } id--; if ( id < 0 || id >= hpi_marshal_num ) return 0; return &hpi_marshal[id]; } int HpiMarshalRequest( cHpiMarshal *m, void *buffer, const void **param ) { return MarshalArray( m->m_request, param, buffer ); } int HpiMarshalRequest1( cHpiMarshal *m, void *buffer, const void *p1 ) { const void *param[1]; param[0] = p1; return HpiMarshalRequest( m, buffer, param ); } int HpiMarshalRequest2( cHpiMarshal *m, void *buffer, const void *p1, const void *p2 ) { const void *param[2]; param[0] = p1; param[1] = p2; return HpiMarshalRequest( m, buffer, param ); } int HpiMarshalRequest3( cHpiMarshal *m, void *buffer, const void *p1, const void *p2, const void *p3 ) { const void *param[3]; param[0] = p1; param[1] = p2; param[2] = p3; return HpiMarshalRequest( m, buffer, param ); } int HpiMarshalRequest4( cHpiMarshal *m, void *buffer, const void *p1, const void *p2, const void *p3, const void *p4 ) { const void *param[4]; param[0] = p1; param[1] = p2; param[2] = p3; param[3] = p4; return HpiMarshalRequest( m, buffer, param ); } int HpiMarshalRequest5( cHpiMarshal *m, void *buffer, const void *p1, const void *p2, const void *p3, const void *p4, const void *p5 ) { const void *param[5]; param[0] = p1; param[1] = p2; param[2] = p3; param[3] = p4; param[4] = p5; return HpiMarshalRequest( m, buffer, param ); } int HpiMarshalRequest6( cHpiMarshal *m, void *buffer, const void *p1, const void *p2, const void *p3, const void *p4, const void *p5, const void *p6 ) { const void *param[6]; param[0] = p1; param[1] = p2; param[2] = p3; param[3] = p4; param[4] = p5; param[5] = p6; return HpiMarshalRequest( m, buffer, param ); } int HpiDemarshalRequest( int byte_order, cHpiMarshal *m, const void *buffer, void **params ) { return DemarshalArray( byte_order, m->m_request, params, buffer ); } int HpiDemarshalRequest1( int byte_order, cHpiMarshal *m, const void *buffer, void *p1 ) { void *param[1]; param[0] = p1; return HpiDemarshalRequest( byte_order, m, buffer, param ); } int HpiDemarshalRequest2( int byte_order, cHpiMarshal *m, const void *buffer, void *p1, void *p2 ) { void *param[2]; param[0] = p1; param[1] = p2; return HpiDemarshalRequest( byte_order, m, buffer, param ); } int HpiDemarshalRequest3( int byte_order, cHpiMarshal *m, const void *buffer, void *p1, void *p2, void *p3 ) { void *param[3]; param[0] = p1; param[1] = p2; param[2] = p3; return HpiDemarshalRequest( byte_order, m, buffer, param ); } int HpiDemarshalRequest4( int byte_order, cHpiMarshal *m, const void *buffer, void *p1, void *p2, void *p3, void *p4 ) { void *param[4]; param[0] = p1; param[1] = p2; param[2] = p3; param[3] = p4; return HpiDemarshalRequest( byte_order, m, buffer, param ); } int HpiDemarshalRequest5( int byte_order, cHpiMarshal *m, const void *buffer, void *p1, void *p2, void *p3, void *p4, void *p5 ) { void *param[5]; param[0] = p1; param[1] = p2; param[2] = p3; param[3] = p4; param[4] = p5; return HpiDemarshalRequest( byte_order, m, buffer, param ); } int HpiDemarshalRequest6( int byte_order, cHpiMarshal *m, const void *buffer, void *p1, void *p2, void *p3, void *p4, void *p5, void *p6 ) { void *param[6]; param[0] = p1; param[1] = p2; param[2] = p3; param[3] = p4; param[4] = p5; param[5] = p6; return HpiDemarshalRequest( byte_order, m, buffer, param ); } int HpiMarshalReply( cHpiMarshal *m, void *buffer, const void **params ) { // the first value is the result. SaErrorT err = *(const SaErrorT *)params[0]; if ( err == SA_OK ) return MarshalArray( m->m_reply, params, buffer ); return Marshal( &SaErrorType, &err, buffer ); } int HpiMarshalReply0( cHpiMarshal *m, void *buffer, const void *result ) { const void *param[1]; param[0] = result; return HpiMarshalReply( m, buffer, param ); } int HpiMarshalReply1( cHpiMarshal *m, void *buffer, const void *result, const void *p1 ) { const void *param[2]; param[0] = result; param[1] = p1; return HpiMarshalReply( m, buffer, param ); } int HpiMarshalReply2( cHpiMarshal *m, void *buffer, const void *result, const void *p1, const void *p2 ) { const void *param[3]; param[0] = result; param[1] = p1; param[2] = p2; return HpiMarshalReply( m, buffer, param ); } int HpiMarshalReply3( cHpiMarshal *m, void *buffer, const void *result, const void *p1, const void *p2, const void *p3 ) { const void *param[4]; param[0] = result; param[1] = p1; param[2] = p2; param[3] = p3; return HpiMarshalReply( m, buffer, param ); } int HpiMarshalReply4( cHpiMarshal *m, void *buffer, const void *result, const void *p1, const void *p2, const void *p3, const void *p4 ) { const void *param[5]; param[0] = result; param[1] = p1; param[2] = p2; param[3] = p3; param[4] = p4; return HpiMarshalReply( m, buffer, param ); } int HpiMarshalReply5( cHpiMarshal *m, void *buffer, const void *result, const void *p1, const void *p2, const void *p3, const void *p4, const void *p5 ) { const void *param[6]; param[0] = result; param[1] = p1; param[2] = p2; param[3] = p3; param[4] = p4; param[5] = p5; return HpiMarshalReply( m, buffer, param ); } int HpiDemarshalReply( int byte_order, cHpiMarshal *m, const void *buffer, void **params ) { // the first value is the error code int rv = Demarshal( byte_order, &SaErrorType, params[0], buffer ); if ( rv < 0 ) return -1; SaErrorT err = *(SaErrorT *)params[0]; if ( err == SA_OK ) return DemarshalArray( byte_order, m->m_reply, params, buffer ); return rv; } int HpiDemarshalReply0( int byte_order, cHpiMarshal *m, const void *buffer, void *result ) { void *param[1]; param[0] = result; return HpiDemarshalReply( byte_order, m, buffer, param ); } int HpiDemarshalReply1( int byte_order, cHpiMarshal *m, const void *buffer, void *result, void *p1 ) { void *param[2]; param[0] = result; param[1] = p1; return HpiDemarshalReply( byte_order, m, buffer, param ); } int HpiDemarshalReply2( int byte_order, cHpiMarshal *m, const void *buffer, void *result, void *p1, void *p2 ) { void *param[3]; param[0] = result; param[1] = p1; param[2] = p2; return HpiDemarshalReply( byte_order, m, buffer, param ); } int HpiDemarshalReply3( int byte_order, cHpiMarshal *m, const void *buffer, void *result, void *p1, void *p2, void *p3 ) { void *param[4]; param[0] = result; param[1] = p1; param[2] = p2; param[3] = p3; return HpiDemarshalReply( byte_order, m, buffer, param ); } int HpiDemarshalReply4( int byte_order, cHpiMarshal *m, const void *buffer, void *result, void *p1, void *p2, void *p3, void *p4 ) { void *param[5]; param[0] = result; param[1] = p1; param[2] = p2; param[3] = p3; param[4] = p4; return HpiDemarshalReply( byte_order, m, buffer, param ); } int HpiDemarshalReply5( int byte_order, cHpiMarshal *m, const void *buffer, void *result, void *p1, void *p2, void *p3, void *p4, void *p5 ) { void *param[6]; param[0] = result; param[1] = p1; param[2] = p2; param[3] = p3; param[4] = p4; param[5] = p5; return HpiDemarshalReply( byte_order, m, buffer, param ); } openhpi-2.14.1/marshal/marshal_hpi_types.h0000644000076400007640000002416211302567035015513 0ustar /* * marshaling/demarshaling of hpi data types * * Copyright (c) 2004 by FORCE Computers. * (C) Copyright IBM Corp. 2008 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Thomas Kanngieser * W. David Ashley * Renier Morales * Anton Pak */ #ifndef dMarshalHpiTypes_h #define dMarshalHpiTypes_h #ifdef __cplusplus extern "C" { #endif #include #include #include #ifdef __cplusplus } #endif #ifndef dMarshal_h #include "marshal.h" #endif #ifdef __cplusplus extern "C" { #endif #define SaHpiVoidType Marshal_Uint8Type #define SaHpiUint8Type Marshal_Uint8Type #define SaHpiUint16Type Marshal_Uint16Type #define SaHpiUint32Type Marshal_Uint32Type #define SaHpiInt8Type Marshal_Int8Type #define SaHpiInt16Type Marshal_Int16Type #define SaHpiInt32Type Marshal_Int32Type #define SaHpiInt64Type Marshal_Int64Type #define SaHpiUint64Type Marshal_Uint64Type #define SaHpiFloat32Type Marshal_Float32Type #define SaHpiFloat64Type Marshal_Float64Type #define SaHpiBoolType SaHpiUint8Type #define SaHpiManufacturerIdType SaHpiUint32Type #define SaHpiVersionType SaHpiUint32Type #define SaErrorType SaHpiInt32Type #define SaHpiDomainIdType SaHpiUint32Type #define SaHpiSessionIdType SaHpiUint32Type #define SaHpiResourceIdType SaHpiUint32Type #define SaHpiHsCapabilitiesType SaHpiUint32Type #define SaHpiEntryIdType SaHpiUint32Type #define SaHpiTimeType SaHpiInt64Type #define SaHpiTimeoutType SaHpiInt64Type #define SaHpiLoadNumberType SaHpiUint32Type #define SaHpiEventLogCapabilitiesType SaHpiUint32Type // text buffer #define SaHpiTextTypeType SaHpiUint32Type #define SaHpiLanguageType SaHpiUint32Type extern cMarshalType SaHpiTextBufferType; #define SaHpiInstrumentIdType SaHpiUint32Type // entity #define SaHpiEntityTypeType SaHpiUint32Type #define SaHpiEntityLocationType SaHpiUint32Type extern cMarshalType SaHpiEntityType; extern cMarshalType SaHpiEntityPathType; // events #define SaHpiEventCategoryType SaHpiUint8Type #define SaHpiEventStateType SaHpiUint16Type // sensors #define SaHpiSensorNumType SaHpiUint32Type #define SaHpiSensorTypeType SaHpiUint32Type // sensor reading type #define SaHpiSensorReadingTypeType SaHpiUint32Type extern cMarshalType SaHpiSensorReadingType; // sensor thresholds extern cMarshalType SaHpiSensorThresholdsType; #define SaHpiSensorRangeFlagsType SaHpiUint8Type extern cMarshalType SaHpiSensorRangeType; // sensor rdr sensor units #define SaHpiSensorUnitsType SaHpiUint32Type #define SaHpiSensorModUnitUseType SaHpiUint32Type extern cMarshalType SaHpiSensorDataFormatType; // sensor rdr threshold support #define SaHpiSensorThdMaskType SaHpiUint8Type extern cMarshalType SaHpiSensorThdDefnType; // sensor rdr event control #define SaHpiSensorEventCtrlType SaHpiUint32Type // sensor rdr record extern cMarshalType SaHpiSensorRecType; // controls #define SaHpiCtrlNumType SaHpiUint32Type #define SaHpiCtrlTypeType SaHpiUint32Type #define SaHpiCtrlStateDigitalType SaHpiUint32Type #define SaHpiCtrlStateDiscreteType SaHpiUint32Type #define SaHpiCtrlStateAnalogType SaHpiInt32Type extern cMarshalType SaHpiCtrlStateStreamType; #define SaHpiCtrlModeType SaHpiUint32Type // control text controls #define SaHpiTxtLineNumType SaHpiUint8Type extern cMarshalType SaHpiCtrlStateTextType; extern cMarshalType SaHpiCtrlStateOemType; extern cMarshalType SaHpiCtrlStateType; // control resource data records #define SaHpiCtrlOutputTypeType SaHpiUint32Type extern cMarshalType SaHpiCtrlRecDigitalType; extern cMarshalType SaHpiCtrlRecDiscreteType; extern cMarshalType SaHpiCtrlRecAnalogType; extern cMarshalType SaHpiCtrlRecStreamType; extern cMarshalType SaHpiCtrlRecTextType; extern cMarshalType SaHpiCtrlRecOemType; extern cMarshalType SaHpiCtrlDefaultModeType; extern cMarshalType SaHpiCtrlRecType; // entity inventory data #define SaHpiIdrIdType SaHpiUint32Type #define SaHpiIdrAreaTypeType SaHpiUint32Type #define SaHpiIdrFieldTypeType SaHpiUint32Type extern cMarshalType SaHpiIdrFieldType; extern cMarshalType SaHpiIdrAreaHeaderType; extern cMarshalType SaHpiIdrInfoType; // inventory data resource records extern cMarshalType SaHpiInventoryRecType; // watchdogs #define SaHpiWatchdogNumType SaHpiUint32Type #define SaHpiWatchdogActionType SaHpiUint32Type #define SaHpiWatchdogActionEventType SaHpiUint32Type #define SaHpiWatchdogPretimerInterruptType SaHpiUint32Type #define SaHpiWatchdogTimerUseType SaHpiUint32Type #define SaHpiWatchdogExpFlagsType SaHpiUint8Type extern cMarshalType SaHpiWatchdogType; // watchdog resource data records extern cMarshalType SaHpiWatchdogRecType; // Annunciators #define SaHpiAnnunciatorNumType SaHpiUint32Type #define SaHpiStatusCondTypeType SaHpiUint32Type extern cMarshalType SaHpiNameType; extern cMarshalType SaHpiConditionType; extern cMarshalType SaHpiAnnouncementType; #define SaHpiAnnunciatorModeType SaHpiUint32Type // annunciator resource data records #define SaHpiAnnunciatorTypeType SaHpiUint32Type extern cMarshalType SaHpiAnnunciatorRecType; // DIMIs #define SaHpiDimiNumType SaHpiUint32Type #define SaHpiDimiTestNumType SaHpiUint32Type #define SaHpiDimiTotalTestsType SaHpiUint32Type #define SaHpiDimiTestServiceImpactType SaHpiUint32Type #define SaHpiDimiTestCapabilityType SaHpiUint32Type #define SaHpiDimiTestServiceImpactType SaHpiUint32Type #define SaHpiDimiTestParamTypeType SaHpiUint32Type #define SaHpiDimiReadyType SaHpiUint32Type #define SaHpiDimiTestPercentCompletedType SaHpiUint32Type #define SaHpiDimiTestRunStatusType SaHpiUint32Type #define SaHpiDimiTestErrCodeType SaHpiUint32Type extern cMarshalType SaHpiDimiInfoType; extern cMarshalType SaHpiDimiTestParameterValueUnionType; extern cMarshalType SaHpiDimiTestParamValue1Type; extern cMarshalType SaHpiDimiTestParamValue2Type; extern cMarshalType SaHpiDimiTestParamsDefinitionType; extern cMarshalType SaHpiDimiTestAffectedEntityType; extern cMarshalType SaHpiDimiTestType; extern cMarshalType SaHpiDimiTestResultsType; typedef struct { SaHpiUint8T NumberOfParams; SaHpiDimiTestVariableParamsT *ParamsList; } SaHpiDimiTestVariableParamsListT; extern cMarshalType SaHpiDimiTestVariableParamsType; extern cMarshalType SaHpiDimiTestVariableParamsListType; // FUMIs #define SaHpiFumiNumType SaHpiUint32Type #define SaHpiBankNumType SaHpiUint8Type #define SaHpiFumiProtocolType SaHpiUint32Type #define SaHpiFumiCapabilityType SaHpiUint32Type #define SaHpiFumiUpgradeStatusType SaHpiUint32Type #define SaHpiFumiSourceStatusType SaHpiUint32Type #define SaHpiFumiBankStateType SaHpiUint32Type #define SaHpiFumiSafDefinedSpecIdType SaHpiUint32Type #define SaHpiFumiSpecInfoTypeType SaHpiUint32Type #define SaHpiFumiServiceImpactType SaHpiUint32Type #define SaHpiFumiLogicalBankStateFlagsType SaHpiUint32Type extern cMarshalType SaHpiFumiSpecInfoType; extern cMarshalType SaHpiFumiServiceImpactDataType; extern cMarshalType SaHpiFumiSourceInfoType; extern cMarshalType SaHpiFumiBankInfoType; extern cMarshalType SaHpiFumiLogicalBankInfoType; extern cMarshalType SaHpiFumiComponentInfoType; extern cMarshalType SaHpiFumiLogicalComponentInfoType; // resource data record #define SaHpiRdrTypeType SaHpiUint32Type extern cMarshalType SaHpiRdrType; // hot swap #define SaHpiHsIndicatorStateType SaHpiUint32Type #define SaHpiHsActionType SaHpiUint32Type #define SaHpiHsStateType SaHpiUint32Type // events part 2 #define SaHpiSeverityType SaHpiUint32Type #define SaHpiResourceEventTypeType SaHpiUint32Type extern cMarshalType SaHpiResourceEventType; #define SaHpiDomainEventTypeType SaHpiUint32Type extern cMarshalType SaHpiDomainEventType; #define SaHpiSensorOptionalDataType SaHpiUint8Type extern cMarshalType SaHpiSensorEventType; #define SaHpiSensorEnableOptDataType SaHpiUint8Type extern cMarshalType SaHpiSensorEnableChangeEventType; #define SaHpiHsCauseOfStateChangeType SaHpiUint32Type extern cMarshalType SaHpiHotSwapEventType; extern cMarshalType SaHpiWatchdogEventType; #define SaHpiSwEventTypeType SaHpiUint32Type extern cMarshalType SaHpiHpiSwEventType; extern cMarshalType SaHpiOemEventType; extern cMarshalType SaHpiUserEventType; #define SaHpiEventTypeType SaHpiUint32Type extern cMarshalType SaHpiEventType; #define SaHpiEvtQueueStatusType SaHpiUint32Type // param control #define SaHpiParmActionType SaHpiUint32Type // reset #define SaHpiResetActionType SaHpiUint32Type // power #define SaHpiPowerStateType SaHpiUint32Type // resource presence table extern cMarshalType SaHpiResourceInfoType; // resource capabilities #define SaHpiCapabilitiesType SaHpiUint32Type // resource hot swap capabilities #define SaHpiHsCapabilitiesType SaHpiUint32Type // rpt entry extern cMarshalType SaHpiRptEntryType; extern cMarshalType SaHpiLoadIdType; // domains #define SaHpiDomainCapabilitiesType SaHpiUint32Type extern cMarshalType SaHpiDomainInfoType; extern cMarshalType SaHpiDrtEntryType; #define SaHpiAlarmIdType SaHpiUint32Type extern cMarshalType SaHpiAlarmType; // system event log #define SaHpiSelOverflowActionType SaHpiUint32Type extern cMarshalType SaHpiEventLogInfoType; #define SaHpiEventLogEntryIdType SaHpiUint32Type extern cMarshalType SaHpiEventLogEntryType; //---------------------------------------------------------------------------- // The following support the oHpi dynamic configuration APIs //---------------------------------------------------------------------------- typedef struct { SaHpiUint8T Name[SAHPI_MAX_TEXT_BUFFER_LENGTH]; SaHpiUint8T Value[SAHPI_MAX_TEXT_BUFFER_LENGTH]; } oHpiHandlerConfigParamT; extern cMarshalType oHpiHandlerConfigParamType; typedef struct { SaHpiUint8T NumberOfParams; oHpiHandlerConfigParamT *Params; } oHpiHandlerConfigT; extern cMarshalType oHpiHandlerConfigType; // handler stuff #define oHpiHandlerIdType SaHpiUint32Type extern cMarshalType oHpiHandlerInfoType; #define oHpiGlobalParamTypeType SaHpiUint32Type extern cMarshalType oHpiGlobalParamType; #ifdef __cplusplus } #endif #endif openhpi-2.14.1/marshal/connection.h0000644000076400007640000001204111302567035014130 0ustar /* * socket and message handling * * Copyright (c) 2004 by FORCE Computers. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Thomas Kanngieser */ #ifndef dConnection_h #define dConnection_h #ifdef __cplusplus extern "C" { #endif #include // common errors codes typedef enum { eConnectionOk, eConnectionNew, eConnectionDuplicate, eConnectionError, } tConnectionError; // current version #define dMhVersion 1 #define dMhGetVersion(flags) (((flags)>>4) & 0x7) // message flags #define dMhEndianBit 1 #define dMhRequest 0 #define dMhReply 2 #define dMhSingle 0 #define dMhFirst 1 #define dMhMiddle 2 #define dMhLast 3 #define dMhGetPackageType(flags) (((flags) >> 2) & 3) // cMessageHeader::m_type typedef enum { eMhPing = 1, eMhReset = 2, // reset seq eMhMsg = 3, eMhLast = 4 } tMessageType; int IsMessageType( tMessageType type ); // max message length including header #define dMaxMessageLength 0xffff typedef struct { unsigned char m_type; unsigned char m_flags; // bit 0-3 flags, bit 4-7 version unsigned char m_seq; unsigned char m_seq_in; // != 0 for eMhReply to assign the request unsigned int m_id; int m_len; } cMessageHeader; #define IsReplyMsg(header) ((header)->m_flags & dMhReply) #define IsRequestMsg(header) (!((header)->m_flags & dMhReply)) void MessageHeaderInit( cMessageHeader *header, tMessageType type, unsigned char flags, unsigned char seq_in, unsigned int id, unsigned int len ); // sequence number handling typedef struct { unsigned char m_inbound_seq_num; unsigned char m_outbound_seq_num; unsigned int m_recv_msg_map; } cConnectionSeq; void ConnectionSeqInit ( cConnectionSeq *cs ); unsigned char ConnectionSeqGet ( cConnectionSeq *cs ); // get next seq tConnectionError ConnectionSeqCheck( cConnectionSeq *cs, unsigned char seq ); // write message int ConnectionWriteMsg( int fd, struct sockaddr_in *addr, cMessageHeader *header, const void *msg ); // read message int ConnectionReadMsg( int fd, struct sockaddr_in *rd_addr, cMessageHeader *header, void *response ); // re-send of messages struct sConnectionResendMsg; typedef struct sConnectionResendMsg cConnectionResendMsg; struct sConnectionResendMsg { cMessageHeader m_msg; unsigned char *m_data; }; typedef struct { cConnectionSeq m_seq; cConnectionResendMsg m_msg[256]; struct sockaddr_in m_ip_addr; unsigned int m_send_count; // number of messages send unsigned int m_received_count; // number of messages received } cConnectionResend; void ConnectionResendInit ( cConnectionResend *rs, const struct sockaddr_in ip_addr ); void ConnectionResendCleanup ( cConnectionResend *rs ); int ConnectionResendWriteMsg ( cConnectionResend *rs, int fd, cMessageHeader *header, const void *msg ); tConnectionError ConnectionResendHandleMsg( cConnectionResend *rs, int fd, cMessageHeader *header, const void *response ); // client typedef struct { cConnectionResend m_resend; int m_fd; } cClientConnection; cClientConnection *ClientOpen ( const char *host, int host_port ); void ClientClose ( cClientConnection *c ); int ClientWriteMsg( cClientConnection *c, cMessageHeader *header, const void *request ); tConnectionError ClientReadMsg ( cClientConnection *c, cMessageHeader *header, void *response ); // server struct sServerConnection; typedef struct sServerConnection cServerConnection; typedef struct { int m_fd; cServerConnection *m_first; } cServerSocket; struct sServerConnection { cServerConnection *m_next; cServerSocket *m_socket; cConnectionResend m_resend; void *m_user_data; }; cServerSocket *ServerOpen ( int port ); void ServerClose ( cServerSocket *s ); void ServerConnectionRem( cServerConnection *c ); int ServerWriteMsg ( cServerConnection *c, cMessageHeader *header, const void *request ); tConnectionError ServerReadMsg ( cServerSocket *c, cServerConnection **con, cMessageHeader *header, void *response ); #ifdef __cplusplus } #endif #endif openhpi-2.14.1/marshal/strmsock.cpp0000644000076400007640000002017611302567035014201 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * W. David Ashley * */ #include #include #include #include #include #include #include #include #include #include #include #include #include "strmsock.h" #include "marshal.h" // Local definitions #ifndef INADDR_NONE #define INADDR_NONE 0xffffffff #endif /*--------------------------------------------------------------------*/ /* Stream Sockets base class methods */ /*--------------------------------------------------------------------*/ void strmsock::Close(void) { if (fOpen) { close(s); fOpen = FALSE; } errcode = 0; return; } int strmsock::GetErrcode(void) { return(errcode); } void strmsock::SetDomain( int lNewDomain) // the new domain { domain = lNewDomain; errcode = 0; return; } void strmsock::SetProtocol( int lNewProtocol) // the new protocol { protocol = lNewProtocol; errcode = 0; return; } void strmsock::SetType( int lNewType) // the new type { type = lNewType; errcode = 0; return; } void strmsock::SetReadTimeout( int seconds) // the timeout { struct timeval tv; tv.tv_sec = seconds; tv.tv_usec = 0; setsockopt(s, SOL_SOCKET, SO_RCVTIMEO, &tv, sizeof(tv)); return; } bool strmsock::WriteMsg(const void *request) { unsigned char data[dMaxMessageLength]; unsigned int l = sizeof(cMessageHeader) + header.m_len; // printf("Message body length = %d.\n", header.m_len); errcode = 0; if (!fOpen) { printf("Socket not open.\n"); return true; } if (l > dMaxMessageLength) { printf("Message too large.\n"); return true; } memcpy(&data[0], &header, sizeof(cMessageHeader)); if (request != NULL) { memcpy(&data[sizeof(cMessageHeader)], request, header.m_len); } // printf("Size of message header is %d\n", sizeof(cMessageHeader)); // printf("Buffer header address is %p\n", &data[0]); // printf("Buffer request address is %p\n", &data[sizeof(cMessageHeader)]); // printf("Write request buffer (%d bytes) is\n", header.m_len); // for (unsigned int i = 0; i < header.m_len; i++) { // printf("%02x ", *((unsigned char *)request + i)); // } // printf("\n"); // printf("Write buffer (%d bytes) is\n", l); // for (int i = 0; i < l; i++) { // printf("%02x ", (unsigned char)data[i]); // } // printf("\n"); int rv = write(s, data, l); if ( (unsigned int)rv != l ) { return true; } return false; } bool strmsock::ReadMsg(char *data) { errcode = 0; if (!fOpen) { return true; } int len = read( s, data, dMaxMessageLength); if (len < 0) { errcode = errno; printf("Reading from socket returned and error: %d\n", errcode); // Debug return true; } else if (len == 0) { //connection has been aborted by the peer Close(); printf("Connection has been aborted\n"); // Debug return true; } else if (len < (int)sizeof(cMessageHeader)) { printf("Got corrupted header?\n"); // Debug return true; } memcpy(&header, data, sizeof(cMessageHeader)); // swap id and len if nessesary in the reply header if ((header.m_flags & dMhEndianBit) != MarshalByteOrder()) { header.m_id = GUINT32_SWAP_LE_BE(header.m_id); header.m_len = GUINT32_SWAP_LE_BE(header.m_len); } //printf("header.m_flags: 0x%x\n", header.m_flags); if ( (header.m_flags >> 4) != dMhVersion ) { printf("Wrong version? 0x%x != 0x%x\n", header.m_flags, dMhVersion); // Debug return true; } // printf("Read buffer (%d bytes) is\n", len); // for (int i = 0; i < len; i++) { // printf("%02x ", (unsigned char)data[i]); // } // printf("\n"); return false; } void strmsock::MessageHeaderInit(tMessageType mtype, unsigned char flags, unsigned int id, unsigned int len ) { header.m_type = mtype; header.m_flags = flags; // set version header.m_flags &= 0x0f; header.m_flags |= dMhVersion << 4; // set endian header.m_flags &= ~dMhEndianBit; header.m_flags |= MarshalByteOrder(); header.m_id = id; header.m_len = len; } /*--------------------------------------------------------------------*/ /* Stream Sockets client class methods */ /*--------------------------------------------------------------------*/ cstrmsock::cstrmsock() { fOpen = FALSE; ulBufSize = 4096; domain = AF_INET; type = SOCK_STREAM; protocol = 0; s = -1; next = NULL; } cstrmsock::~cstrmsock() { if (fOpen) Close(); } bool cstrmsock::Open( const char * pszHost, // the remote host const int lPort) // the remote port { struct sockaddr_in addr; // address structure struct hostent *phe; // pointer to a host entry // get a socket s = socket(domain, type, protocol); if (s == -1) { errcode = errno; return(TRUE); } // convert the host entry/name to an address phe = gethostbyname(pszHost); if (phe) memcpy((char *) &addr.sin_addr, phe -> h_addr, phe -> h_length); else addr.sin_addr.s_addr = inet_addr(pszHost); if (addr.sin_addr.s_addr == INADDR_NONE) { errcode = 67; // bad network name close(s); return(TRUE); } // connect to the remote host addr.sin_family = domain; addr.sin_port = htons(lPort); errcode = connect(s, (struct sockaddr *) &addr, sizeof(addr)); if (errcode == -1) { errcode = errno; close(s); return(TRUE); } errcode = 0; fOpen = TRUE; return(FALSE); } /*--------------------------------------------------------------------*/ /* Stream Sockets server class methods */ /*--------------------------------------------------------------------*/ sstrmsock::sstrmsock() { fOpen = FALSE; fOpenS = FALSE; ulBufSize = 4096; domain = AF_INET; type = SOCK_STREAM; protocol = 0; backlog = 20; s = -1; ss = -1; } sstrmsock::sstrmsock(const sstrmsock ©) { if (this == ©) { return; } fOpen = copy.fOpen; fOpenS = copy.fOpenS; ulBufSize = copy.ulBufSize; domain = copy.domain; type = copy.type; protocol = copy.protocol; backlog = copy.backlog; s = copy.s; ss = copy.ss; errcode = 0; } sstrmsock::~sstrmsock() { // Note: do NOT close the server socket by default! This will cause // an error in a multi-threaded environment. if (fOpen) Close(); } bool sstrmsock::Accept(void) { socklen_t sz = sizeof(addr); if (!fOpenS) { return(TRUE); } // accept the connection and obtain the connection socket sz = sizeof (struct sockaddr); s = accept(ss, (struct sockaddr *) &addr, &sz); if (s == -1) { errcode = errno; fOpen = FALSE; return(TRUE); } fOpen = TRUE; return(FALSE); } void sstrmsock::CloseSrv(void) { if (fOpenS) { close(ss); fOpenS = FALSE; } errcode = 0; return; } bool sstrmsock::Create( int Port) // the local port { int Rc; // return code int so_reuseaddr = TRUE; // socket reuse flag // get a server socket ss = socket(domain, type, protocol); if (ss == -1) { errcode = errno; return(TRUE); } // set the socket option to reuse the address setsockopt(ss, SOL_SOCKET, SO_REUSEADDR, &so_reuseaddr, sizeof(so_reuseaddr)); // bind the server socket to a port memset(&addr, 0, sizeof (addr)); addr.sin_family = domain; addr.sin_port = htons(Port); addr.sin_addr.s_addr = INADDR_ANY; Rc = bind(ss, (struct sockaddr *) &addr, sizeof(addr)); if (Rc == -1) { errcode = errno; return (TRUE); } // listen for a client at the port Rc = listen(ss, backlog); if (Rc == -1) { errcode = errno; return(TRUE); } errcode = 0; fOpenS = TRUE; return(FALSE); } openhpi-2.14.1/marshal/marshal.h0000644000076400007640000001451311302567035013426 0ustar /* * marshaling/demarshaling * * Copyright (c) 2004 by FORCE Computers. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Thomas Kanngieser * W. David Ashley */ #ifndef dMarshal_h #define dMarshal_h #ifdef __cplusplus extern "C" { #endif typedef unsigned char tUint8; typedef unsigned short tUint16; typedef unsigned int tUint32; typedef unsigned long long tUint64; typedef char tInt8; typedef short tInt16; typedef int tInt32; typedef long long tInt64; typedef float tFloat32; typedef double tFloat64; typedef enum { eMtUnknown, eMtVoid, // do nothing eMtUint8, eMtUint16, eMtUint32, eMtUint64, eMtInt8, eMtInt16, eMtInt32, eMtInt64, eMtFloat32, eMtFloat64, eMtArray, eMtVarArray, // only possible in structs eMtStruct, eMtStructElement, eMtUnion, eMtUnionElement, eMtUserDefined // user defined marshalling } tMarshalType; int IsSimpleType( tMarshalType type ); #define dStructOffset(type,field) ((unsigned int)(((char *) (&(((type *)0)->field)))-((char*)0))) // helper macro for arrays #define dArray( type, size ) \ { \ .m_type = eMtArray, \ .m_u.m_array = \ { \ .m_size = size, \ .m_type = &type \ } \ } // helper macro for var arrays #define dVarArray( type, size_pos ) \ { \ .m_type = eMtVarArray, \ .m_u.m_var_array = \ { \ .m_size = size_pos, \ .m_type = &type \ } \ } // helper marco for struct #define dStruct( type, elems ) \ { \ .m_type = eMtStruct, \ .m_u.m_struct = \ { \ .m_size = sizeof( type ), \ .m_elements = elems \ } \ } // helper marco for struct elements #define dStructElement( struct_type, field, type ) \ { \ .m_type = eMtStructElement, \ .m_u.m_struct_element.m_offset = dStructOffset( struct_type, field ), \ .m_u.m_struct_element.m_type = &type \ } // helper marco for struct end #define dStructElementEnd() \ { \ .m_type = eMtUnknown \ } // helper marco for unions #define dUnion( offset, type, elems ) \ { \ .m_type = eMtUnion, \ .m_u.m_union = \ { \ .m_offset = offset, \ .m_size = sizeof( type ), \ .m_elements = elems \ } \ } // helper marco for union elements #define dUnionElement( mod, type ) \ { \ .m_type = eMtUnionElement, \ .m_u.m_union_element.m_mod = mod, \ .m_u.m_union_element.m_type = &type \ } // helper marco for union end #define dUnionElementEnd() \ { \ .m_type = eMtUnknown \ } // helper macro for user define mashaller #define dUserDefined( marshaller, demarshaller, user_data ) \ { \ .m_type = eMtUserDefined, \ .m_u.m_user_defined.m_marshal = marshaller, \ .m_u.m_user_defined.m_demarshal = demarshaller, \ .m_u.m_user_defined.m_user_data = user_data \ } struct sMarshalType; typedef struct sMarshalType cMarshalType; typedef int (*tMarshalFunction)( const cMarshalType *type, const void *data, void *buffer, void *user_data ); typedef int (*tDemarshalFunction)( int byte_order, const cMarshalType *type, void *data, const void *buffer, void *user_data ); struct sMarshalType { tMarshalType m_type; union { struct { int m_size; // array size cMarshalType *m_type; // array element } m_array; struct { unsigned int m_size; // struct pos where size is cMarshalType *m_type; // array element } m_var_array; struct { unsigned int m_size; // size of structure cMarshalType *m_elements; // struct elements } m_struct; struct { unsigned int m_offset; cMarshalType *m_type; } m_struct_element; struct { int m_offset; // mod offset in struct unsigned int m_size; // size of structure cMarshalType *m_elements; // union elements } m_union; struct { unsigned int m_mod; cMarshalType *m_type; // union element } m_union_element; struct { tMarshalFunction m_marshal; tDemarshalFunction m_demarshal; void *m_user_data; } m_user_defined; } m_u; }; // some simple types extern cMarshalType Marshal_VoidType; extern cMarshalType Marshal_Uint8Type; extern cMarshalType Marshal_Uint16Type; extern cMarshalType Marshal_Uint32Type; extern cMarshalType Marshal_Uint64Type; extern cMarshalType Marshal_Int8Type; extern cMarshalType Marshal_Int16Type; extern cMarshalType Marshal_Int32Type; extern cMarshalType Marshal_Int64Type; extern cMarshalType Marshal_Float32Type; extern cMarshalType Marshal_Float64Type; // marshal order used int MarshalByteOrder( void ); // size in bytes int MarshalSize( const cMarshalType *type ); int MarshalSizeArray( const cMarshalType **types ); // marshal data into buffer int Marshal( const cMarshalType *type, const void *data, void *buffer ); int MarshalArray( const cMarshalType **types, const void **data, void *buffer ); int MarshalSimpleTypes( tMarshalType type, const void *data, void *buffer ); // demarshal buffer into data int Demarshal( int byte_order, const cMarshalType *type, void *data, const void *buffer ); int DemarshalArray( int byte_order, const cMarshalType **types, void **data, const void *buffer ); int DemarshalSimpleTypes( int byte_order, tMarshalType type, void *data, const void *buffer ); #ifdef __cplusplus } #endif #endif openhpi-2.14.1/marshal/connection.c0000644000076400007640000003730311302567035014133 0ustar /* * socket and message handling * * Copyright (c) 2004 by FORCE Computers. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Thomas Kanngieser */ #include #include #include #include #include #include #include #include #include #include #include "connection.h" #include "marshal.h" //#define dUdpTest 1 //////////////////////////////////////////////////////////// // message functions //////////////////////////////////////////////////////////// int IsMessageType( tMessageType type ) { if ( type >= eMhPing && type < eMhLast ) return 1; return 0; } void MessageHeaderInit( cMessageHeader *header, tMessageType type, unsigned char flags, unsigned char seq_in, unsigned int id, unsigned int len ) { memset( header, 0, sizeof( cMessageHeader ) ); header->m_type = type; header->m_flags = flags; header->m_seq_in = seq_in; header->m_id = id; header->m_len = len; } //////////////////////////////////////////////////////////// // sequence number handling //////////////////////////////////////////////////////////// void ConnectionSeqInit( cConnectionSeq *cs ) { cs->m_inbound_seq_num = 1; cs->m_outbound_seq_num = 0; cs->m_recv_msg_map = 0; } unsigned char ConnectionSeqGet( cConnectionSeq *cs ) { cs->m_outbound_seq_num = (cs->m_outbound_seq_num + 1) % 256; if ( cs->m_outbound_seq_num == 0 ) cs->m_outbound_seq_num = 1; return cs->m_outbound_seq_num; } tConnectionError ConnectionSeqCheck( cConnectionSeq *cs, unsigned char seq ) { unsigned char d = seq - cs->m_inbound_seq_num; if ( d < 16 ) { // It's after the current sequence number, but within 15. unsigned int bit = 1 << (d + 16); if ( cs->m_recv_msg_map & bit ) return eConnectionDuplicate; // move the sequence number forward. cs->m_recv_msg_map >>= d; cs->m_inbound_seq_num = seq; cs->m_recv_msg_map |= 1 << 16; return eConnectionOk; } d = cs->m_inbound_seq_num - seq; if ( d <= 16 ) { // It's before the current sequence number, but within 16. unsigned int bit = 1 << d; if ( cs->m_recv_msg_map & bit ) return eConnectionDuplicate; // move the sequence number backward. cs->m_recv_msg_map <<= d; cs->m_inbound_seq_num = seq; cs->m_recv_msg_map |= 1 << 16; return eConnectionOk; } // It's outside the current sequence number range, discard // the msg. return eConnectionError; } //////////////////////////////////////////////////////////// // read and write messages //////////////////////////////////////////////////////////// int ConnectionWriteMsg( int fd, struct sockaddr_in *addr, cMessageHeader *header, const void *msg ) { assert( IsMessageType( header->m_type ) ); assert( (header->m_type == eMhPing && header->m_seq == 0) || (header->m_type != eMhPing && header->m_seq ) ); // set version header->m_flags &= 0x0f; header->m_flags |= dMhVersion << 4; // set endian header->m_flags &= ~dMhEndianBit; header->m_flags |= MarshalByteOrder(); int l = sizeof( cMessageHeader ) + header->m_len; if ( l > dMaxMessageLength ) { fprintf( stderr, "message too big: %d !\n", l ); assert( 0 ); return -1; } unsigned char data[dMaxMessageLength]; memcpy( data, header, sizeof( cMessageHeader ) ); if ( header->m_len ) { assert( msg ); memcpy( data + sizeof( cMessageHeader ), msg, header->m_len ); } #ifdef dUdpTest // simple test for lost upd messages: // remove 50% of all messages if ( rand() < RAND_MAX / 2 ) return 0; #endif int rv = sendto( fd, data, l, 0, (struct sockaddr *)addr, sizeof( struct sockaddr_in ) ); if ( rv != l ) { fprintf( stderr, "write error: %s !\n", strerror( errno ) ); return -1; } return 0; } int ConnectionReadMsg( int fd, struct sockaddr_in *rd_addr, cMessageHeader *header, void *response ) { socklen_t from_len = sizeof( struct sockaddr_in ); unsigned char data[dMaxMessageLength]; int len = recvfrom( fd, data, dMaxMessageLength, 0, (struct sockaddr *)rd_addr, &from_len ); if ( len < sizeof( cMessageHeader ) ) { fprintf( stderr, "drop message because header too small !\n" ); return -1; } memcpy( header, data, sizeof( cMessageHeader ) ); if ( (header->m_flags >> 4) != dMhVersion ) { fprintf( stderr, "drop message because of wrong header version: %d, expect %d !\n", (header->m_flags>>4), dMhVersion ); return -1; } if ( !IsMessageType( header->m_type ) ) { fprintf( stderr, "drop message because of wrong message type: %d !\n", header->m_type ); return -1; } // swap id and len if nessesary if ( (header->m_flags & dMhEndianBit) != MarshalByteOrder() ) { header->m_id = GUINT32_SWAP_LE_BE( header->m_id ); header->m_len = GUINT32_SWAP_LE_BE( header->m_len ); } if ( header->m_len > dMaxMessageLength - sizeof( cMessageHeader ) ) { fprintf( stderr, "drop message because too big message: %d !\n", header->m_len ); return -1; } if ( header->m_len ) { assert( response ); memcpy( response, data + sizeof( cMessageHeader ), header->m_len ); } return 0; } //////////////////////////////////////////////////////////// // resend messages //////////////////////////////////////////////////////////// void ConnectionResendInit( cConnectionResend *rs, const struct sockaddr_in ip_addr ) { assert( rs ); memset( rs, 0, sizeof( cConnectionResend ) ); ConnectionSeqInit( &rs->m_seq ); rs->m_ip_addr = ip_addr; rs->m_send_count = 0; rs->m_received_count = 0; } void ConnectionResendCleanup( cConnectionResend *rs ) { int i; for( i = 0; i < 256; i++ ) if ( rs->m_msg[i].m_data ) { free( rs->m_msg[i].m_data ); rs->m_msg[i].m_data = 0; } ConnectionResendInit( rs, rs->m_ip_addr ); } int ConnectionResendWriteMsg( cConnectionResend *rs, int fd, cMessageHeader *header, const void *msg ) { if ( header->m_type != eMhPing ) { assert( header->m_len <= dMaxMessageLength ); header->m_seq = ConnectionSeqGet( &rs->m_seq ); assert( header->m_seq ); if ( rs->m_send_count < 255 ) assert( header->m_seq == rs->m_send_count + 1 ); if ( IsReplyMsg( header ) ) { unsigned char seq = header->m_seq_in; assert( seq ); cConnectionResendMsg *m = &rs->m_msg[seq]; if ( m->m_data ) free( m->m_data ); memcpy( &m->m_msg, header, sizeof( cMessageHeader ) ); if ( header->m_len ) { assert( msg ); m->m_data = malloc( header->m_len ); memcpy( m->m_data, msg, header->m_len ); } else { assert( msg == 0 ); m->m_data = 0; } assert( rs->m_msg[seq].m_msg.m_seq == header->m_seq ); //fprintf( stderr, "write msg: %d, %d.\n", seq, header->m_seq ); } rs->m_send_count += 1; if ( IsReplyMsg( header ) && header->m_type == eMhReset ) ConnectionResendCleanup( rs ); } else { header->m_seq = 0; header->m_seq_in = 0; assert( header->m_len == 0 ); assert( msg == 0 ); } return ConnectionWriteMsg( fd, &rs->m_ip_addr, header, msg ); } tConnectionError ConnectionResendHandleMsg( cConnectionResend *rs, int fd, cMessageHeader *header, const void *response ) { if ( header->m_type == eMhPing ) { assert( header->m_len == 0 ); assert( header->m_seq == 0 ); assert( header->m_seq_in == 0 ); return eConnectionOk; } else rs->m_received_count += 1; //fprintf( stderr, "read msg: %d.\n", header->m_seq ); if ( header->m_seq == 0 ) { fprintf( stderr, "read invalid message with seq 0 !\n" ); return eConnectionError; } tConnectionError rv = ConnectionSeqCheck( &rs->m_seq, header->m_seq ); switch( header->m_type ) { case eMhReset: if ( IsReplyMsg(header) ) ConnectionResendCleanup( rs ); return eConnectionOk; case eMhMsg: if ( IsRequestMsg( header ) ) { if ( rv == eConnectionDuplicate ) { cConnectionResendMsg *m = &rs->m_msg[header->m_seq]; //fprintf( stderr, "re-send reply %d %d.\n", // m->m_msg.m_seq_in, m->m_msg.m_seq ); // check for reply if ( m->m_msg.m_seq ) // resend reply ConnectionWriteMsg( fd, &rs->m_ip_addr, &m->m_msg, m->m_data ); } } break; default: fprintf( stderr, "drop message because of unknown type %d !\n", header->m_type ); return eConnectionError; } if ( IsRequestMsg( header ) && rv == eConnectionOk ) { //fprintf( stderr, "remove old msg: %d %d.\n", header->m_seq, // rs->m_msg[header->m_seq].m_msg.m_seq_in ); cConnectionResendMsg *m = &rs->m_msg[header->m_seq]; if ( m->m_data ) { free( m->m_data ); m->m_data = 0; } m->m_msg.m_seq = 0; } return rv; } //////////////////////////////////////////////////////////// // client functions //////////////////////////////////////////////////////////// cClientConnection * ClientOpen( const char *host, int host_port ) { // host addr struct hostent *ent = gethostbyname( host ); if ( !ent ) { fprintf( stderr, "cannot resolve %s !\n", host ); return 0; } struct in_addr host_addr; memcpy( &host_addr, ent->h_addr_list[0], ent->h_length ); // create socket int fd = socket( PF_INET, SOCK_DGRAM, IPPROTO_UDP ); if ( fd == -1 ) { fprintf( stderr, "cannot create socket: %s\n", strerror( errno ) ); return 0; } int curr_port = 8000; int rv; do { curr_port++; struct sockaddr_in addr; addr.sin_family = AF_INET; addr.sin_port = htons( curr_port ); addr.sin_addr.s_addr = INADDR_ANY; rv = bind( fd, (struct sockaddr *)&addr, sizeof( addr ) ); } while( curr_port < 8100 && rv == -1 ); if ( rv == -1 ) { fprintf( stderr, "cannot bind: %s\n", strerror( errno ) ); close( fd ); return 0; } cClientConnection *c = malloc( sizeof( cClientConnection ) ); struct sockaddr_in addr; addr.sin_addr = host_addr; addr.sin_family = AF_INET; addr.sin_port = htons( host_port ); ConnectionResendInit( &c->m_resend, addr ); c->m_fd = fd; return c; } void ClientClose( cClientConnection *c ) { if ( c->m_fd ) close( c->m_fd ); ConnectionResendCleanup( &c->m_resend ); free( c ); } int ClientWriteMsg( cClientConnection *c, cMessageHeader *header, const void *request ) { return ConnectionResendWriteMsg( &c->m_resend, c->m_fd, header, request ); } tConnectionError ClientReadMsg( cClientConnection *c, cMessageHeader *header, void *request ) { struct sockaddr_in addr; int rv = ConnectionReadMsg( c->m_fd, &addr, header, request ); if ( rv ) return eConnectionError; // check addr struct sockaddr_in *ipaddr = (struct sockaddr_in *)(void *)&addr; if ( (ipaddr->sin_port != c->m_resend.m_ip_addr.sin_port) || (ipaddr->sin_addr.s_addr != c->m_resend.m_ip_addr.sin_addr.s_addr) ) { fprintf( stderr, "dropped message due to invalid ip !\n" ); return eConnectionError; } return ConnectionResendHandleMsg( &c->m_resend, c->m_fd, header, request ); } //////////////////////////////////////////////////////////// // server functions //////////////////////////////////////////////////////////// cServerSocket * ServerOpen( int port ) { int fd = socket( PF_INET, SOCK_DGRAM, IPPROTO_UDP ); if ( fd == -1 ) { fprintf( stderr, "cannot open udp server socket: %s !\n", strerror( errno ) ); return 0; } struct sockaddr_in addr; addr.sin_family = AF_INET; addr.sin_port = htons( port ); addr.sin_addr.s_addr = INADDR_ANY; int rv = bind( fd, (struct sockaddr *)&addr, sizeof(struct sockaddr_in) ); if ( rv == -1 ) { fprintf( stderr, "cannot bind socket to port: %s !\n", strerror( errno ) ); close( fd ); return 0; } cServerSocket *s = malloc( sizeof( cServerSocket ) ); s->m_fd = fd; s->m_first = 0; return s; } void ServerClose( cServerSocket *s ) { while( s->m_first ) ServerConnectionRem( s->m_first ); if ( s->m_fd ) close( s->m_fd ); free( s ); } static void ServerConnectionAdd( cServerSocket *s, cServerConnection *c ) { c->m_next = s->m_first; c->m_socket = s; s->m_first = c; } void ServerConnectionRem( cServerConnection *c ) { cServerSocket *s = c->m_socket; cServerConnection *prev = 0; cServerConnection *current = s->m_first; while( current ) { if ( current == c ) { // found if ( prev == 0 ) s->m_first = c->m_next; else prev->m_next = c->m_next; ConnectionResendCleanup( &c->m_resend ); free( c ); return; } prev = current; current = current->m_next; } // connection not found assert( 0 ); } int ServerWriteMsg( cServerConnection *c, cMessageHeader *header, const void *request ) { return ConnectionResendWriteMsg( &c->m_resend, c->m_socket->m_fd, header, request ); } tConnectionError ServerReadMsg( cServerSocket *s, cServerConnection **con, cMessageHeader *header, void *response ) { struct sockaddr_in addr; int r = ConnectionReadMsg( s->m_fd, &addr, header, response ); if ( r ) return eConnectionError; // find connection cServerConnection *c = s->m_first; *con = 0; while( c ) { if ( (addr.sin_port == c->m_resend.m_ip_addr.sin_port) && (addr.sin_addr.s_addr == c->m_resend.m_ip_addr.sin_addr.s_addr) ) { *con = c; break; } c = c->m_next; } if ( *con == 0 ) { c = malloc( sizeof( cServerConnection ) ); c->m_next = 0; c->m_socket = s; ConnectionResendInit( &c->m_resend, addr ); c->m_user_data = 0; ServerConnectionAdd( s, c ); *con = c; tConnectionError r = ConnectionResendHandleMsg( &c->m_resend, s->m_fd, header, response ); if ( r != eConnectionOk ) { assert( 0 ); return r; } return eConnectionNew; } return ConnectionResendHandleMsg( &c->m_resend, s->m_fd, header, response ); } openhpi-2.14.1/marshal/strmsock.h0000644000076400007640000000641111302567035013642 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * W. David Ashley * */ #ifndef STRMSOCK_H_INCLUDED #define STRMSOCK_H_INCLUDED #include #include #include #ifdef __cplusplus extern "C" { #endif #include #ifdef __cplusplus } #endif #ifndef TRUE #define TRUE 1 #endif #ifndef FALSE #define FALSE 0 #endif // current version #define dMhVersion 1 #define dMhGetVersion(flags) (((flags)>>4) & 0x7) // message flags #define dMhEndianBit 1 #define dMhRequest 0 #define dMhReply 1 #define dMhError 2 // only valid on server replies // max message length including header #define dMaxMessageLength 0xffff // cMessageHeader::m_type typedef enum { eMhMsg = 1, eMhError, // for reply message header only! } tMessageType; // NOTE!!!!!!!!!!!!!!!!!!!!!!!!!!!! // // The following structure definition will need to be changed if all clients // and deamons do not have a homogenious word size (all 32-bit or all 64-bit). // The fix is to probably define them using GLIB types to force all the // structure member values to use a fixed bit size no matter what the // architecture word size is. typedef struct { unsigned char m_type; unsigned char m_flags; // bit 0-3 flags, bit 4-7 version unsigned int m_id; unsigned int m_len; } cMessageHeader; // The Stream Sockets class class strmsock { protected: int s; // the client socket handle unsigned long ulBufSize; // the read buffer size int domain; // the socket domain int type; // the socket type int protocol; // the socket protocol bool fOpen; // open connection indicator public: virtual ~strmsock () { }; virtual void Close (void); virtual int GetErrcode (void); virtual void SetDomain (int); virtual void SetProtocol (int); virtual void SetType (int); virtual void SetReadTimeout (int); virtual void MessageHeaderInit (tMessageType, unsigned char, unsigned int, unsigned int); virtual bool WriteMsg (const void *request); virtual bool ReadMsg (char *); cMessageHeader header; // message header int errcode; // errno contents }; typedef strmsock *pstrmsock; // the Client Stream Sockets class class cstrmsock : public strmsock { public: SaHpiSessionIdT sid; cstrmsock *next; cstrmsock (); ~cstrmsock (); bool Open (const char *, int); }; typedef cstrmsock *pcstrmsock; // the Server Stream Sockets class class sstrmsock : public strmsock { protected: char acHostName[256]; // host name int ss; // the server socket handle int backlog; // listen queue size struct sockaddr_in addr; // address structure bool fOpenS; // TRUE = valid server socket public: sstrmsock (); sstrmsock (const sstrmsock&); ~sstrmsock (); void CloseSrv (void); bool Create (int); bool Accept (void); }; typedef sstrmsock *psstrmsock; #endif // STRMSOCK_H_INCLUDED__ openhpi-2.14.1/configure.ac0000644000076400007640000005433411302567132012470 0ustar dnl dnl autoconf and automake for openhpi dnl initial file by Andrea Brugger 1/03 dnl various hacks by Sean Dague 4/23/03 AC_PREREQ(2.57) AC_INIT(openhpi, 2.14.1) AC_CONFIG_SRCDIR(openhpi.spec.in) AM_INIT_AUTOMAKE([1.8]) AM_CONFIG_HEADER(config.h) AH_TOP([#ifndef __OPENHPI_CONFIG_H #define __OPENHPI_CONFIG_H]) AH_BOTTOM([#endif /* __OPENHPI_CONFIG_H */]) # # (major version) = (first number) - (third number) # (minor version) = (third number) # (patch version) = (second number) # example HPI_LIB_VERSION=13:4:11 # major version: 2 = 13 - 11 # minor version: 11 = 11 # patch version: 4 = 4 # HPI_LIB_VERSION=16:1:14 HPI_PKG=$PACKAGE_NAME HPI_UTIL_PKG=${PACKAGE_NAME}utils HPI_CLIENT_PKG=${PACKAGE_NAME}client AC_SUBST(HPI_CLIENT_PKG) AC_SUBST(HPI_UTIL_PKG) AC_SUBST(HPI_PKG) AC_SUBST(HPI_LIB_VERSION) AC_SUBST(ac_configure_args) dnl Checks for programs AC_PROG_CC AC_LIBTOOL_DLOPEN AC_PROG_LIBTOOL AC_PROG_LN_S AC_PROG_CXX AC_PROG_CPP AC_PROG_INSTALL AC_PROG_LN_S AC_PROG_MAKE_SET enabled_non32bit="no" AC_ARG_ENABLE([non32bit-int], [ --enable-non32bit-int Allow compile on non 32bit int architectures [[default=no]]], [if test "x$enableval" = "xyes"; then enabled_non32bit="yes" fi]) dnl die on int != 32bits. This is too instrumental to our code right now. dnl AC_MSG_CHECKING(int is 4 bytes) OH_SET_SIZES if test "x$OH_SIZEOF_INT" != "x4"; then if test "x$enabled_non32bit" = "xyes"; then AC_MSG_WARN([ *** Size of int is not 4 bytes, it is $OH_SIZEOF_INT bytes on this platform. *** The --enable_non32bit_int arg has been used to force compilation regardless. *** Execution on this platform is not supported and could produce undefined *** behavior. ]) else AC_MSG_ERROR([ *** Size of int is not 4 bytes, it is $OH_SIZEOF_INT bytes on this platform. *** Execution on this platform is not supported and could produce undefined *** behavior. *** Please contact the openhpi development team to fix this ]) fi fi AM_CONDITIONAL(CROSS_COMPILATION, test x$cross_compiling = xyes) dnl Check for libraries have_uuid=no have_openipmi=no have_fam=no have_sysfs=no have_rtas_lib=no dnl Check for GLIB AC_CHECK_PROG([found_pkg_config],[pkg-config],[yes]) if test "x$found_pkg_config" != "xyes"; then OH_CHECK_FAIL(pkg-config,pkg-config) fi PKG_CFG_SETPATH # check for gcc version AC_MSG_CHECKING(gcc >= 3.2.0) OH_CHECK_GCC(3,2,0) dnl glib 2.x checks GLIB_REQUIRED_VERSION=2.2.0 GLIB=glib-2.0 if pkg-config --atleast-version $GLIB_REQUIRED_VERSION $GLIB; then : else AC_MSG_ERROR([ *** GLIB >= $GLIB_REQUIRED_VERSION is required. The latest version of *** GLIB is always available from ftp://ftp.gtk.org/.]) fi exact_version=`pkg-config --modversion $GLIB`; GLIB_CFLAGS=`pkg-config --cflags $GLIB gthread-2.0` GLIB_LIBS=`pkg-config --libs $GLIB gthread-2.0` # On some versions of Solaris the pkg-config file for gthread-2.0 contains a # compiler option, '-mt', that is incompatible with gcc case $host_os in solaris2.10) GLIB_CFLAGS=`echo $GLIB_CFLAGS | sed -e 's/-mt/-D_REENTRANT/g'` GLIB_LIBS=`echo $GLIB_LIBS | sed -e 's/-mt//g'` ;; esac AC_MSG_CHECKING(for GLIB - version >= $GLIB_REQUIRED_VERSION) AC_MSG_RESULT(yes (version $exact_version)) dnl if the glib is installed on a non standard place dnl like /opt/gnome/lib AC_CHECK_LIB will find the library. old_cflags=$CFLAGS old_libs=$LIBS CFLAGS="$CFLAGS $GLIB_CFLAGS" LIBS="$LIBS $GLIB_LIBS" AC_CHECK_LIB([$GLIB], [g_slist_alloc], [], [ OH_CHECK_FAIL(glib,glib-devel) ]) CFLAGS=$old_cflags LIBS=$old_libs AC_CHECK_LIB([ltdl], [lt_dlopen], [], [ OH_CHECK_FAIL(libltdl,libltdl-devel,, this is required for plugin loading) ]) AC_CHECK_LIB([sysfs], [sysfs_get_mnt_path], [have_sysfs=yes]) AC_CHECK_HEADER([sysfs/libsysfs.h], [], [have_sysfs=no]) OH_CHECK_NETSNMP AC_CHECK_LIB([uuid], [uuid_generate], [have_uuid=yes], [ OH_CHECK_FAIL(libuuid,e2fsprogs-devel) ]) dnl ssl is used for md2/md5 authentification in ipmidirect dnl and for SSL-based communication in ilo2_ribcl and oa_soap AC_CHECK_LIB([crypto],[MD5_Init],[CRYPTO_LIB=-lcrypto],[CRYPTO_LIB=]) AC_SUBST(CRYPTO_LIB) AC_CHECK_LIB([ssl],[SSL_library_init],[SSL_LIB=-lssl],[SSL_LIB=]) AC_SUBST(SSL_LIB) AC_CHECK_HEADERS([openssl/md2.h openssl/md5.h openssl/bio.h openssl/ssl.h openssl/err.h],[have_openssl=yes],[have_openssl=no]) dnl xml is used for XML-based communication in ilo2_ribcl and oa_soap AC_CHECK_LIB([xml2],[xmlParseMemory],[XML2_LIB=-lxml2],[XML2_LIB=]) AC_CHECK_HEADERS([libxml2/libxml/xmlexports.h],[XML2_INCLUDE="-I/usr/include/libxml2"],[XML2_INCLUDE]) AC_SUBST(XML2_LIB) AC_SUBST(XML2_INCLUDE) dnl Build daemon statically or dynamically. openhpid_static="no" ENABLED_DIRS="$ENABLED_DIRS openhpid" AC_ARG_ENABLE([daemon], [ --enable-dynamic-daemon build HPI daemon and client library non-statically[[default=yes]]], [if test "x$enableval" = "xno"; then openhpid_static="yes" fi], [openhpid_static="no"]) AM_CONDITIONAL(OPENHPID_STATIC, test x$openhpid_static = xyes) AC_ARG_ENABLE([clients], [ --enable-clients build HPI client programs [[default=yes]]], [if test "x$enableval" = "xyes"; then ENABLED_DIRS="$ENABLED_DIRS clients" fi], [ENABLED_DIRS="$ENABLED_DIRS clients"]) AC_ARG_ENABLE([cpp_wrappers], [ --enable-cpp_wrappers build SaHpi C++ wrapper objects [[default=no]]], [if test "x$enableval" = "xyes"; then ENABLED_DIRS="$ENABLED_DIRS cpp" fi]) AC_SUBST(ENABLED_DIRS) dnl Checks for header files. AC_HEADER_STDC AC_CHECK_HEADERS([fcntl.h stdlib.h string.h sys/time.h unistd.h stdarg.h netinet/in.h]) dnl Checks for library functions. AC_FUNC_ERROR_AT_LINE AC_FUNC_VPRINTF AC_CHECK_FUNCS([gettimeofday memset strdup]) dnl Checks for other helper programs AC_PATH_PROGS(RPM, rpmbuild) dnl plugin enablement stanzas dnl list of static plugins STATIC_PLUGIN_LIST= STATIC_PLUGIN_EXTRA_LIBS= AC_CHECK_HEADER([linux/watchdog.h], [have_linux_watchdog_h=yes], [], [#include ]) AC_ARG_ENABLE([watchdog], [ --enable-watchdog build watchdog plugin [[default=yes if linux/watchdog.h exists]]], [if test "x$enableval" = "xyes"; then if test "x$have_linux_watchdog_h" = "xyes"; then AC_SUBST(WATCHDOG,watchdog) else AC_MSG_ERROR("Can not build the watchdog plugin without linux/watchdog.h.") fi else AC_SUBST(WATCHDOG,"") fi], [if test "x$have_linux_watchdog_h" = "xyes"; then AC_SUBST(WATCHDOG,watchdog) else AC_SUBST(WATCHDOG,"") fi]) dnl dnl We really need to make ipmi enablement be contigent on OpenIPMI dnl if PKG_CONFIG_PATH=$PKG_CONFIG_PATH:/usr/local/lib/pkgconfig pkg-config --atleast-version 1.4.20 OpenIPMI; then have_openipmi=yes AC_CHECK_LIB([OpenIPMI], [ipmi_smi_setup_con], [have_openipmi=yes]) OPENIPMI_CFLAGS=`PKG_CONFIG_PATH=$PKG_CONFIG_PATH:/usr/local/lib/pkgconfig pkg-config --cflags OpenIPMI` AC_SUBST(OPENIPMI_CFLAGS) OPENIPMI_LIBS=`PKG_CONFIG_PATH=$PKG_CONFIG_PATH:/usr/local/lib/pkgconfig pkg-config --libs OpenIPMI` AC_SUBST(OPENIPMI_LIBS) fi AC_ARG_ENABLE([ipmi], [ --enable-ipmi build openipmi plugin [[default=yes if OpenIPMI exists]]], [if test "x$enableval" = "xyes"; then if test "x$have_openipmi" = "xyes"; then AC_SUBST(IPMI,ipmi) AC_SUBST(WITH_IPMI,1) else OH_CHECK_FAIL(OpenIPMI,libOpenIPMI-devel,http://openipmi.sf.net, Can not build IPMI support without OpenIPMI >= 1.4.20) fi elif test "x$enableval" = "xstatic"; then if test "x$have_openipmi" = "xyes"; then AC_SUBST(IPMI,ipmi) AC_SUBST(WITH_IPMI,1) STATIC_PLUGIN_LIST="$STATIC_PLUGIN_LIST ipmi" STATIC_PLUGIN_EXTRA_LIBS="$STATIC_PLUGIN_EXTRA_LIBS" else OH_CHECK_FAIL(OpenIPMI,libOpenIPMI-devel,http://openipmi.sf.net, Can not build IPMI support without OpenIPMI >= 1.4.20) fi else AC_SUBST(WITH_IPMI,0) fi], [if test "x$have_openipmi" = "xyes"; then AC_SUBST(IPMI,ipmi) AC_SUBST(WITH_IPMI,1) else AC_SUBST(WITH_IPMI,0) fi ]) AC_ARG_ENABLE([sysfs], [ --enable-sysfs build sysfs plugin [[default=yes if libsysfs exists]]], [if test "x$enableval" = "xyes"; then if test "x$have_sysfs" = "xyes"; then AC_SUBST(SYSFS,sysfs) AC_SUBST(WITH_SYSFS,1) else OH_CHECK_FAIL(libsysfs,,http://linux-diag.sf.net, Can not build sysfs support without libsysfs) fi else AC_SUBST(WITH_SYSFS,0) fi], [if test "x$have_sysfs" = "xyes"; then AC_SUBST(SYSFS,sysfs) AC_SUBST(WITH_SYSFS,1) else AC_SUBST(WITH_SYSFS,0) fi ]) AC_ARG_ENABLE([snmp_bc], [ --enable-snmp_bc build IBM Blade Center plugin [[default=yes if net-snmp is installed]]], [if test "x$enableval" = "xyes"; then if test "x$have_netsnmp" = "xyes"; then AC_SUBST(SNMP_BC,snmp_bc) AC_SUBST(WITH_SNMP_BC,1) SNMPDIR=snmp else OH_CHECK_FAIL(net-snmp,net-snmp-devel,http://net-snmp.sourceforge.net/, Can not build IBM Blade Center support without net-snmp) fi else AC_SUBST(WITH_SNMP_BC,0) fi], [if test "x$have_netsnmp" = "xyes"; then AC_SUBST(SNMP_BC,snmp_bc) AC_SUBST(WITH_SNMP_BC,1) SNMPDIR=snmp else AC_SUBST(WITH_SNMP_BC,0) fi] ) AC_ARG_ENABLE([ipmidirect], [ --enable-ipmidirect build direct ipmi plugin [[default=yes]]], [if test "x$enableval" = "xyes"; then AC_SUBST(IPMIDIRECT,ipmidirect) elif test "x$enableval" = "xstatic"; then AC_SUBST(IPMIDIRECT,ipmidirect) STATIC_PLUGIN_LIST="$STATIC_PLUGIN_LIST ipmidirect" STATIC_PLUGIN_EXTRA_LIBS="$STATIC_PLUGIN_EXTRA_LIBS $SSL_LIB -luuid -lm -lstdc++" fi], [AC_SUBST(IPMIDIRECT,ipmidirect)]) dnl [AC_SUBST(IPMIDIRECT,ipmidirect)]) OH_CHECK_RTAS #Configure options for the RTAS plugin AC_ARG_ENABLE([rtas], [ --enable-rtas build rtas ppc plugin [[default=no]]], [if test "x$enableval" = "xyes"; then if test "x$have_rtas_lib" = "xyes"; then AC_SUBST(RTAS,rtas) AC_SUBST(WITH_RTAS,1) else OH_CHECK_FAIL(librtas, librtas-devel, http://librtas.ozlabs.org/, Cannot build RTAS plugin without the librtas library) fi else AC_SUBST(WITH_RTAS,0) fi], [AC_SUBST(WITH_RTAS,0)]) # configure argument for the simulator plugin AC_ARG_ENABLE([simulator], [ --enable-simulator build simulator plugin [[default=yes]]], [if test "x$enableval" = "xyes"; then AC_SUBST(SIMULATOR,simulator) fi], [AC_SUBST(SIMULATOR,simulator)]) # configure argument for the ilo2_ribcl plugin AC_ARG_ENABLE([ilo2_ribcl], [ --enable-ilo2_ribcl build ilo2_ribcl plugin [[default=no]]], [if test "x$enableval" = "xyes"; then if test "x$have_openssl" = "xyes"; then if test -n "$XML2_INCLUDE"; then AC_SUBST(ILO2_RIBCL,ilo2_ribcl) AC_SUBST(WITH_ILO2_RIBCL,1) else OH_CHECK_FAIL(xml2-devel,,,Can not build ilo2_ribcl without xml2 headers) fi else OH_CHECK_FAIL(openssl-devel,,,Can not build ilo2_ribcl without openssl headers) fi else AC_SUBST(WITH_ILO2_RIBCL,0) fi], [if test "x$have_openssl" = "xyes" && test -n "$XML2_INCLUDE"; then AC_SUBST(ILO2_RIBCL,ilo2_ribcl) AC_SUBST(WITH_ILO2_RIBCL,1) else AC_SUBST(WITH_ILO2_RIBCL,0) fi ]) # configure argument for the oa_soap plugin AC_ARG_ENABLE([oa_soap], [ --enable-oa_soap build oa_soap plugin [[default=no]]], [if test "x$enableval" = "xyes"; then if test "x$have_openssl" = "xyes"; then if test -n "$XML2_INCLUDE"; then AC_SUBST(OA_SOAP,oa_soap) AC_SUBST(WITH_OA_SOAP,1) else OH_CHECK_FAIL(xml2-devel,,,Can not build oa_soap without xml2 headers) fi else OH_CHECK_FAIL(openssl-devel,,,Can not build oa_soap without openssl headers) fi else AC_SUBST(WITH_OA_SOAP,0) fi], [if test "x$have_openssl" = "xyes" && test -n "$XML2_INCLUDE"; then AC_SUBST(OA_SOAP,oa_soap) AC_SUBST(WITH_OA_SOAP,1) else AC_SUBST(WITH_OA_SOAP,0) fi ]) dnl enable marshal library AC_SUBST(MARSHALDIR,marshal) dnl dnl create static plugin config dnl STATIC_PLUGIN= STATIC_PLUGIN_EXTERN= STATIC_PLUGIN_LIBS= for name in $STATIC_PLUGIN_LIST; do STATIC_PLUGIN="$STATIC_PLUGIN { \"$name\", ${name}_get_interface },"; STATIC_PLUGIN_EXTERN="${STATIC_PLUGIN_EXTERN} extern int ${name}_get_interface(void **pp, const uuid_t uuid);"; STATIC_PLUGIN_LIBS="$STATIC_PLUGIN_LIBS \$(top_builddir)/plugins/$name/lib${name}.la"; done dnl use src/plugin_static.c.in AC_SUBST(STATIC_PLUGIN_EXTERN) AC_SUBST(STATIC_PLUGIN) dnl additional libs AC_SUBST(STATIC_PLUGIN_LIBS) AC_SUBST(STATIC_PLUGIN_EXTRA_LIBS) dnl setup SNMPFLAGS AC_SUBST(SNMPFLAGS) AC_SUBST(SNMPLIBS) AC_SUBST(SNMPDIR) AC_SUBST(SSLDIR) dnl dnl This code was borrowed from linux-ha configure.in file dnl and is used for creating the proper substitutions dnl in the spec file. Without it, the spec file will dnl have ${exec_prefix}, etc. instead of the actual dnl directory. dnl dnl prefix=`eval echo "$prefix"` case $prefix in NONE) prefix=/usr/local;; esac var() { case $1 in *'${'*) res=`eval echo "$1"`;; *) res="$1";; esac case "$res" in ""|NONE) echo "$2";; *) echo "$res";; esac } exec_prefix=`var "$exec_prefix" "$prefix"` bindir=`var "$bindir" "$exec_prefix/bin"` sbindir=`var "$sbindir" "$exec_prefix/sbin"` sysconfdir=`var "$sysconfdir" "$prefix/etc"` libdir=`var "$libdir" "$exec_prefix/lib"` includedir=`var "$includedir" "$exec_prefix/include"` localstatedir=`var "$localstatedir" "/var"` base_includedir="${includedir}" AC_SUBST(base_includedir) dnl dnl defines CONFPATH, OH_DEFAULT_CONF and OH_CLIENT_DEFAULT_CONF dnl #CONFPATH=${CONFPATH:=/etc/${PACKAGE_NAME}} #AC_ARG_WITH(confpath, # [[ --with-confpath=PATH use directory PATH to store openhpi configuration file [default=/etc/openhpi]]], # [CONFPATH=$withval]) dnl substitute @CONFPATH@ in all Makefiles CONFPATH=${sysconfdir}/openhpi AC_SUBST(CONFPATH) dnl create the #define in config.h AC_DEFINE_UNQUOTED(CONFPATH, "$CONFPATH", [openhpi specific config path]) AC_DEFINE_UNQUOTED(OH_DEFAULT_CONF,"$CONFPATH/${PACKAGE_NAME}.conf", [default configfile]) AC_DEFINE_UNQUOTED(OH_CLIENT_DEFAULT_CONF,"$CONFPATH/${HPI_CLIENT_PKG}.conf", [default client configfile]) dnl defines OH_DEFAULT_UID_MAP and VARPATH dnl set VARPATH only if unset or null. VARPATH=${VARPATH:=${localstatedir}/lib/${PACKAGE_NAME}} AC_ARG_WITH(varpath, [[ --with-varpath=PATH use directory PATH to store openhpi specific data [default=$prefix/var/lib/openhpi]]], [VARPATH=$withval]) dnl substitute @VARPATH@ in all Makefiles AC_SUBST(VARPATH) dnl create the #define VARPATH and #define OH_DEFAULT_UID_MAP in config.h AC_DEFINE_UNQUOTED(VARPATH,"$VARPATH",[openhpi specific data path]) AC_DEFINE_UNQUOTED(OH_DEFAULT_UID_MAP,"$VARPATH/uid_map",[uid map]) dnl OH_PLUGIN_PATH - Directory where plugin libraries live. dnl default is "$libdir/openhpir" PLUGINPATH=${PLUGINPATH:=${libdir}/${PACKAGE_NAME}} AC_ARG_WITH(pluginpath, [[ --with-pluginpath=PATH use directory PATH to locate plugin libraries [default=LIBDIR/openhpi]]], [PLUGINPATH=$withval]) dnl create #define OH_PLUGIN_PATH in config.h AC_DEFINE_UNQUOTED(OH_PLUGIN_PATH,"$PLUGINPATH",[openhpi plugin path]) TEST_CLEAN='$(shell ls *.bb* *.da *.gcov *.gcno *.beam *.gcda *.summary)' AC_SUBST(TEST_CLEAN) AC_C_STRINGIZE dnl getting CFLAGS right takes some effort dnl we start with a good base set that has been built up CFLAGS="$CFLAGS $GLIB_CFLAGS" dnl next we have to do transformations to either turn on dnl test coverage support. AC_ARG_ENABLE([testcover], [ --enable-testcover adds test coverage and profiling support [[default=no]]], [if test "x$enableval" = "xyes"; then CFLAGS=`echo $CFLAGS | sed -e 's/-O\w\?\>[ ]*//g'` CFLAGS="$CFLAGS -ftest-coverage -fprofile-arcs" CXXFLAGS=`echo $CXXFLAGS | sed -e 's/-O\w\?\>[ ]*//g'` CXXFLAGS="$CXXFLAGS -ftest-coverage -fprofile-arcs" fi] ) dnl This makes libopenhpi debugger friendly dnl by eliminating optimizations and adding the -g flag AC_ARG_ENABLE([debuggable], [ --enable-debuggable adds -g flag and turns off optimization [[default=no]]], [if test "x$enableval" = "xyes"; then CFLAGS=`echo $CFLAGS | sed -e 's/-O\w\?\>[ ]*//g'` CFLAGS=`echo $CFLAGS | sed -e 's/^-g\w*[ ]*\| -g\w*//g'` CFLAGS="$CFLAGS -O0 -ggdb3" CXXFLAGS=`echo $CXXFLAGS | sed -e 's/-O\w\?\>[ ]*//g'` CXXFLAGS=`echo $CXXFLAGS | sed -e 's/^-g\w*[ ]*\| -g\w*//g'` CXXFLAGS="$CXXFLAGS -O0 -ggdb3" else CFLAGS=`echo $CFLAGS | sed -e 's/^-g\w*[ ]*\| -g\w*//g'` CXXFLAGS=`echo $CXXFLAGS | sed -e 's/^-g\w*[ ]*\| -g\w*//g'` fi] ) dnl This will let the user decide whether he wants dnl to use dbg/trace messages. AC_ARG_ENABLE([debug-msgs], [ --enable-debug-msgs enables dynamic debug messages [[default=yes]]], [if test "x$enableval" = "xyes"; then AC_DEFINE([OH_DBG_MSGS],[1],[Enables dynamic debug messages]) fi], [AC_DEFINE([OH_DBG_MSGS],[1],[Enables dynamic debug messages])] ) dnl Now we throw in a bunch of warnings. C and C++ need dnl different sets here CC_WARNINGS="\ -Wall \ -Wmissing-prototypes \ -Wmissing-declarations \ -Wstrict-prototypes \ -Wpointer-arith \ -Wformat=2 \ -Wformat-security \ -Wformat-nonliteral \ -Wno-format-y2k \ -Wcast-qual \ -Wcast-align \ -Wno-strict-aliasing \ -fno-strict-aliasing \ -Wno-unused-value " CXX_WARNINGS="\ -Wall \ -Wpointer-arith \ -Wformat=2 \ -Wformat-security \ -Wformat-nonliteral \ -Wcast-qual \ -Wcast-align \ -Wshadow \ -Wwrite-strings \ -Wredundant-decls \ -Wno-strict-aliasing \ -fno-strict-aliasing \ -Wno-unused-value " if test -n "`gcc --version | grep ' 3.2'`" ; then CC_WARNINGS=`echo $CC_WARNINGS | sed -e 's/-Wno-strict-aliasing//g'` CXX_WARNINGS=`echo $CC_WARNINGS | sed -e 's/-Wno-strict-aliasing//g'` fi case $host_os in solaris*) CC_WARNINGS=`echo $CC_WARNINGS | sed -e 's/-Wcast-qual//g'` CXX_WARNINGS=`echo $CXX_WARNINGS | sed -e 's/-Wwrite-strings//g'` ;; esac dnl remerge the warnings into the FLAGS CXXFLAGS="$CFLAGS $CXX_WARNINGS" CFLAGS="$CFLAGS $CC_WARNINGS" dnl lastly, we add things if we are thread safe and have the openssl library dnl (this could probably happen earlier in this file) CFLAGS="$CFLAGS -D_GNU_SOURCE -D_REENTRANT -fexceptions" CXXFLAGS="$CXXFLAGS -D_GNU_SOURCE -D_REENTRANT -fexceptions" if test "x$have_openssl" = "xyes"; then SSLDIR=ssl AC_DEFINE([HAVE_OPENSSL],[1],[openssl library was found]) fi AM_CONDITIONAL(HAVE_OPENSSL, test x$have_openssl = xyes) OH_SSL_INCLUDES="-I\$(top_srcdir)/ssl" AC_SUBST(OH_SSL_INCLUDES) OPENHPI_INCLUDES="-I\$(top_srcdir)/include -I\$(top_srcdir)/utils -I\$(top_builddir)/utils" dnl replace common includes here AC_SUBST(OPENHPI_INCLUDES) dnl Set up libs that will be linked to LIBS="$LIBS $SSL_LIB $GLIB_LIBS -lm -lpthread" AC_CHECK_PROG([found_docbook2html], [docbook2html], [yes]) AC_ARG_ENABLE([docs], [ --enable-docs generate documentation [[default=yes if docbook2html exists]]], [if test "x$enableval" = "xyes"; then if test "x$found_docbook2html" = "xyes"; then AC_SUBST(HLD,hld) AC_SUBST(WITH_DOCBOOK2HTML,1) else OH_CHECK_FAIL(docbook2html,docbook-utils,http://sources.redhat.com/docbook-tools, Can not generate HTML design docs without docbook2html) fi else AC_SUBST(HLD,"") AC_SUBST(WITH_DOCBOOK2HTML,0) fi], [if test "x$found_docbook2html" = "xyes"; then AC_SUBST(HLD,hld) AC_SUBST(WITH_DOCBOOK2HTML,1) else AC_SUBST(HLD,"") AC_SUBST(WITH_DOCBOOK2HTML,0) fi]) AC_CHECK_PROG([found_pod2man], [pod2man], [yes]) AC_ARG_ENABLE([man], [ --enable-man generate man pages [[default=yes if pod2man exists]]], [if test "x$enableval" = "xyes"; then if test "x$found_pod2man" = "xyes"; then AC_SUBST(MAN,man) else OH_CHECK_FAIL(pod2man,perl,http://www.perl.org, Can not generate man pages without pod2man) fi else AC_SUBST(MAN,"") fi], [if test "x$found_pod2man" = "xyes"; then AC_SUBST(MAN,man) else AC_SUBST(MAN,"") fi]) AC_CONFIG_FILES([openhpi.spec openhpi.pc rt-env.sh Makefile utils/openhpiutils.pc utils/Makefile utils/t/Makefile utils/t/epath/Makefile utils/t/rpt/Makefile utils/t/sahpi/Makefile utils/t/el/Makefile utils/t/uid/Makefile utils/t/ann/Makefile marshal/Makefile marshal/t/Makefile plugins/Makefile plugins/watchdog/Makefile plugins/ipmi/Makefile plugins/ipmi/t/Makefile plugins/snmp_bc/Makefile plugins/snmp_bc/t/Makefile plugins/sysfs/Makefile plugins/ipmidirect/Makefile plugins/ipmidirect/t/Makefile plugins/simulator/Makefile plugins/simulator/t/Makefile plugins/rtas/Makefile plugins/ilo2_ribcl/Makefile plugins/oa_soap/Makefile scripts/Makefile scripts/test/Makefile snmp/Makefile ssl/Makefile src/Makefile src/plugin_static.c src/t/Makefile src/t/ohpi/Makefile docs/Makefile docs/hld/Makefile docs/man/Makefile openhpid/Makefile openhpid/openhpid.sh hpi_shell/Makefile cpp/Makefile cpp/t/Makefile clients/Makefile]) AC_OUTPUT openhpi-2.14.1/config.sub0000755000076400007640000010115311302567646012167 0ustar #! /bin/sh # Configuration validation subroutine script. # Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, # 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008 # Free Software Foundation, Inc. timestamp='2008-01-16' # This file is (in principle) common to ALL GNU software. # The presence of a machine in this file suggests that SOME GNU software # can handle that machine. It does not imply ALL GNU software can. # # This file is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA # 02110-1301, USA. # # As a special exception to the GNU General Public License, if you # distribute this file as part of a program that contains a # configuration script generated by Autoconf, you may include it under # the same distribution terms that you use for the rest of that program. # Please send patches to . Submit a context # diff and a properly formatted ChangeLog entry. # # Configuration subroutine to validate and canonicalize a configuration type. # Supply the specified configuration type as an argument. # If it is invalid, we print an error message on stderr and exit with code 1. # Otherwise, we print the canonical config type on stdout and succeed. # This file is supposed to be the same for all GNU packages # and recognize all the CPU types, system types and aliases # that are meaningful with *any* GNU software. # Each package is responsible for reporting which valid configurations # it does not support. The user should be able to distinguish # a failure to support a valid configuration from a meaningless # configuration. # The goal of this file is to map all the various variations of a given # machine specification into a single specification in the form: # CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM # or in some cases, the newer four-part form: # CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM # It is wrong to echo any other type of specification. me=`echo "$0" | sed -e 's,.*/,,'` usage="\ Usage: $0 [OPTION] CPU-MFR-OPSYS $0 [OPTION] ALIAS Canonicalize a configuration name. Operation modes: -h, --help print this help, then exit -t, --time-stamp print date of last modification, then exit -v, --version print version number, then exit Report bugs and patches to ." version="\ GNU config.sub ($timestamp) Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008 Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE." help=" Try \`$me --help' for more information." # Parse command line while test $# -gt 0 ; do case $1 in --time-stamp | --time* | -t ) echo "$timestamp" ; exit ;; --version | -v ) echo "$version" ; exit ;; --help | --h* | -h ) echo "$usage"; exit ;; -- ) # Stop option processing shift; break ;; - ) # Use stdin as input. break ;; -* ) echo "$me: invalid option $1$help" exit 1 ;; *local*) # First pass through any local machine types. echo $1 exit ;; * ) break ;; esac done case $# in 0) echo "$me: missing argument$help" >&2 exit 1;; 1) ;; *) echo "$me: too many arguments$help" >&2 exit 1;; esac # Separate what the user gave into CPU-COMPANY and OS or KERNEL-OS (if any). # Here we must recognize all the valid KERNEL-OS combinations. maybe_os=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\2/'` case $maybe_os in nto-qnx* | linux-gnu* | linux-dietlibc | linux-newlib* | linux-uclibc* | \ uclinux-uclibc* | uclinux-gnu* | kfreebsd*-gnu* | knetbsd*-gnu* | netbsd*-gnu* | \ storm-chaos* | os2-emx* | rtmk-nova*) os=-$maybe_os basic_machine=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\1/'` ;; *) basic_machine=`echo $1 | sed 's/-[^-]*$//'` if [ $basic_machine != $1 ] then os=`echo $1 | sed 's/.*-/-/'` else os=; fi ;; esac ### Let's recognize common machines as not being operating systems so ### that things like config.sub decstation-3100 work. We also ### recognize some manufacturers as not being operating systems, so we ### can provide default operating systems below. case $os in -sun*os*) # Prevent following clause from handling this invalid input. ;; -dec* | -mips* | -sequent* | -encore* | -pc532* | -sgi* | -sony* | \ -att* | -7300* | -3300* | -delta* | -motorola* | -sun[234]* | \ -unicom* | -ibm* | -next | -hp | -isi* | -apollo | -altos* | \ -convergent* | -ncr* | -news | -32* | -3600* | -3100* | -hitachi* |\ -c[123]* | -convex* | -sun | -crds | -omron* | -dg | -ultra | -tti* | \ -harris | -dolphin | -highlevel | -gould | -cbm | -ns | -masscomp | \ -apple | -axis | -knuth | -cray) os= basic_machine=$1 ;; -sim | -cisco | -oki | -wec | -winbond) os= basic_machine=$1 ;; -scout) ;; -wrs) os=-vxworks basic_machine=$1 ;; -chorusos*) os=-chorusos basic_machine=$1 ;; -chorusrdb) os=-chorusrdb basic_machine=$1 ;; -hiux*) os=-hiuxwe2 ;; -sco6) os=-sco5v6 basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -sco5) os=-sco3.2v5 basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -sco4) os=-sco3.2v4 basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -sco3.2.[4-9]*) os=`echo $os | sed -e 's/sco3.2./sco3.2v/'` basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -sco3.2v[4-9]*) # Don't forget version if it is 3.2v4 or newer. basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -sco5v6*) # Don't forget version if it is 3.2v4 or newer. basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -sco*) os=-sco3.2v2 basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -udk*) basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -isc) os=-isc2.2 basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -clix*) basic_machine=clipper-intergraph ;; -isc*) basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -lynx*) os=-lynxos ;; -ptx*) basic_machine=`echo $1 | sed -e 's/86-.*/86-sequent/'` ;; -windowsnt*) os=`echo $os | sed -e 's/windowsnt/winnt/'` ;; -psos*) os=-psos ;; -mint | -mint[0-9]*) basic_machine=m68k-atari os=-mint ;; esac # Decode aliases for certain CPU-COMPANY combinations. case $basic_machine in # Recognize the basic CPU types without company name. # Some are omitted here because they have special meanings below. 1750a | 580 \ | a29k \ | alpha | alphaev[4-8] | alphaev56 | alphaev6[78] | alphapca5[67] \ | alpha64 | alpha64ev[4-8] | alpha64ev56 | alpha64ev6[78] | alpha64pca5[67] \ | am33_2.0 \ | arc | arm | arm[bl]e | arme[lb] | armv[2345] | armv[345][lb] | avr | avr32 \ | bfin \ | c4x | clipper \ | d10v | d30v | dlx | dsp16xx \ | fido | fr30 | frv \ | h8300 | h8500 | hppa | hppa1.[01] | hppa2.0 | hppa2.0[nw] | hppa64 \ | i370 | i860 | i960 | ia64 \ | ip2k | iq2000 \ | m32c | m32r | m32rle | m68000 | m68k | m88k \ | maxq | mb | microblaze | mcore | mep \ | mips | mipsbe | mipseb | mipsel | mipsle \ | mips16 \ | mips64 | mips64el \ | mips64vr | mips64vrel \ | mips64orion | mips64orionel \ | mips64vr4100 | mips64vr4100el \ | mips64vr4300 | mips64vr4300el \ | mips64vr5000 | mips64vr5000el \ | mips64vr5900 | mips64vr5900el \ | mipsisa32 | mipsisa32el \ | mipsisa32r2 | mipsisa32r2el \ | mipsisa64 | mipsisa64el \ | mipsisa64r2 | mipsisa64r2el \ | mipsisa64sb1 | mipsisa64sb1el \ | mipsisa64sr71k | mipsisa64sr71kel \ | mipstx39 | mipstx39el \ | mn10200 | mn10300 \ | mt \ | msp430 \ | nios | nios2 \ | ns16k | ns32k \ | or32 \ | pdp10 | pdp11 | pj | pjl \ | powerpc | powerpc64 | powerpc64le | powerpcle | ppcbe \ | pyramid \ | score \ | sh | sh[1234] | sh[24]a | sh[23]e | sh[34]eb | sheb | shbe | shle | sh[1234]le | sh3ele \ | sh64 | sh64le \ | sparc | sparc64 | sparc64b | sparc64v | sparc86x | sparclet | sparclite \ | sparcv8 | sparcv9 | sparcv9b | sparcv9v \ | spu | strongarm \ | tahoe | thumb | tic4x | tic80 | tron \ | v850 | v850e \ | we32k \ | x86 | xc16x | xscale | xscalee[bl] | xstormy16 | xtensa \ | z8k) basic_machine=$basic_machine-unknown ;; m6811 | m68hc11 | m6812 | m68hc12) # Motorola 68HC11/12. basic_machine=$basic_machine-unknown os=-none ;; m88110 | m680[12346]0 | m683?2 | m68360 | m5200 | v70 | w65 | z8k) ;; ms1) basic_machine=mt-unknown ;; # We use `pc' rather than `unknown' # because (1) that's what they normally are, and # (2) the word "unknown" tends to confuse beginning users. i*86 | x86_64) basic_machine=$basic_machine-pc ;; # Object if more than one company name word. *-*-*) echo Invalid configuration \`$1\': machine \`$basic_machine\' not recognized 1>&2 exit 1 ;; # Recognize the basic CPU types with company name. 580-* \ | a29k-* \ | alpha-* | alphaev[4-8]-* | alphaev56-* | alphaev6[78]-* \ | alpha64-* | alpha64ev[4-8]-* | alpha64ev56-* | alpha64ev6[78]-* \ | alphapca5[67]-* | alpha64pca5[67]-* | arc-* \ | arm-* | armbe-* | armle-* | armeb-* | armv*-* \ | avr-* | avr32-* \ | bfin-* | bs2000-* \ | c[123]* | c30-* | [cjt]90-* | c4x-* | c54x-* | c55x-* | c6x-* \ | clipper-* | craynv-* | cydra-* \ | d10v-* | d30v-* | dlx-* \ | elxsi-* \ | f30[01]-* | f700-* | fido-* | fr30-* | frv-* | fx80-* \ | h8300-* | h8500-* \ | hppa-* | hppa1.[01]-* | hppa2.0-* | hppa2.0[nw]-* | hppa64-* \ | i*86-* | i860-* | i960-* | ia64-* \ | ip2k-* | iq2000-* \ | m32c-* | m32r-* | m32rle-* \ | m68000-* | m680[012346]0-* | m68360-* | m683?2-* | m68k-* \ | m88110-* | m88k-* | maxq-* | mcore-* \ | mips-* | mipsbe-* | mipseb-* | mipsel-* | mipsle-* \ | mips16-* \ | mips64-* | mips64el-* \ | mips64vr-* | mips64vrel-* \ | mips64orion-* | mips64orionel-* \ | mips64vr4100-* | mips64vr4100el-* \ | mips64vr4300-* | mips64vr4300el-* \ | mips64vr5000-* | mips64vr5000el-* \ | mips64vr5900-* | mips64vr5900el-* \ | mipsisa32-* | mipsisa32el-* \ | mipsisa32r2-* | mipsisa32r2el-* \ | mipsisa64-* | mipsisa64el-* \ | mipsisa64r2-* | mipsisa64r2el-* \ | mipsisa64sb1-* | mipsisa64sb1el-* \ | mipsisa64sr71k-* | mipsisa64sr71kel-* \ | mipstx39-* | mipstx39el-* \ | mmix-* \ | mt-* \ | msp430-* \ | nios-* | nios2-* \ | none-* | np1-* | ns16k-* | ns32k-* \ | orion-* \ | pdp10-* | pdp11-* | pj-* | pjl-* | pn-* | power-* \ | powerpc-* | powerpc64-* | powerpc64le-* | powerpcle-* | ppcbe-* \ | pyramid-* \ | romp-* | rs6000-* \ | sh-* | sh[1234]-* | sh[24]a-* | sh[23]e-* | sh[34]eb-* | sheb-* | shbe-* \ | shle-* | sh[1234]le-* | sh3ele-* | sh64-* | sh64le-* \ | sparc-* | sparc64-* | sparc64b-* | sparc64v-* | sparc86x-* | sparclet-* \ | sparclite-* \ | sparcv8-* | sparcv9-* | sparcv9b-* | sparcv9v-* | strongarm-* | sv1-* | sx?-* \ | tahoe-* | thumb-* \ | tic30-* | tic4x-* | tic54x-* | tic55x-* | tic6x-* | tic80-* \ | tron-* \ | v850-* | v850e-* | vax-* \ | we32k-* \ | x86-* | x86_64-* | xc16x-* | xps100-* | xscale-* | xscalee[bl]-* \ | xstormy16-* | xtensa*-* \ | ymp-* \ | z8k-*) ;; # Recognize the basic CPU types without company name, with glob match. xtensa*) basic_machine=$basic_machine-unknown ;; # Recognize the various machine names and aliases which stand # for a CPU type and a company and sometimes even an OS. 386bsd) basic_machine=i386-unknown os=-bsd ;; 3b1 | 7300 | 7300-att | att-7300 | pc7300 | safari | unixpc) basic_machine=m68000-att ;; 3b*) basic_machine=we32k-att ;; a29khif) basic_machine=a29k-amd os=-udi ;; abacus) basic_machine=abacus-unknown ;; adobe68k) basic_machine=m68010-adobe os=-scout ;; alliant | fx80) basic_machine=fx80-alliant ;; altos | altos3068) basic_machine=m68k-altos ;; am29k) basic_machine=a29k-none os=-bsd ;; amd64) basic_machine=x86_64-pc ;; amd64-*) basic_machine=x86_64-`echo $basic_machine | sed 's/^[^-]*-//'` ;; amdahl) basic_machine=580-amdahl os=-sysv ;; amiga | amiga-*) basic_machine=m68k-unknown ;; amigaos | amigados) basic_machine=m68k-unknown os=-amigaos ;; amigaunix | amix) basic_machine=m68k-unknown os=-sysv4 ;; apollo68) basic_machine=m68k-apollo os=-sysv ;; apollo68bsd) basic_machine=m68k-apollo os=-bsd ;; aux) basic_machine=m68k-apple os=-aux ;; balance) basic_machine=ns32k-sequent os=-dynix ;; blackfin) basic_machine=bfin-unknown os=-linux ;; blackfin-*) basic_machine=bfin-`echo $basic_machine | sed 's/^[^-]*-//'` os=-linux ;; c90) basic_machine=c90-cray os=-unicos ;; convex-c1) basic_machine=c1-convex os=-bsd ;; convex-c2) basic_machine=c2-convex os=-bsd ;; convex-c32) basic_machine=c32-convex os=-bsd ;; convex-c34) basic_machine=c34-convex os=-bsd ;; convex-c38) basic_machine=c38-convex os=-bsd ;; cray | j90) basic_machine=j90-cray os=-unicos ;; craynv) basic_machine=craynv-cray os=-unicosmp ;; cr16) basic_machine=cr16-unknown os=-elf ;; crds | unos) basic_machine=m68k-crds ;; crisv32 | crisv32-* | etraxfs*) basic_machine=crisv32-axis ;; cris | cris-* | etrax*) basic_machine=cris-axis ;; crx) basic_machine=crx-unknown os=-elf ;; da30 | da30-*) basic_machine=m68k-da30 ;; decstation | decstation-3100 | pmax | pmax-* | pmin | dec3100 | decstatn) basic_machine=mips-dec ;; decsystem10* | dec10*) basic_machine=pdp10-dec os=-tops10 ;; decsystem20* | dec20*) basic_machine=pdp10-dec os=-tops20 ;; delta | 3300 | motorola-3300 | motorola-delta \ | 3300-motorola | delta-motorola) basic_machine=m68k-motorola ;; delta88) basic_machine=m88k-motorola os=-sysv3 ;; djgpp) basic_machine=i586-pc os=-msdosdjgpp ;; dpx20 | dpx20-*) basic_machine=rs6000-bull os=-bosx ;; dpx2* | dpx2*-bull) basic_machine=m68k-bull os=-sysv3 ;; ebmon29k) basic_machine=a29k-amd os=-ebmon ;; elxsi) basic_machine=elxsi-elxsi os=-bsd ;; encore | umax | mmax) basic_machine=ns32k-encore ;; es1800 | OSE68k | ose68k | ose | OSE) basic_machine=m68k-ericsson os=-ose ;; fx2800) basic_machine=i860-alliant ;; genix) basic_machine=ns32k-ns ;; gmicro) basic_machine=tron-gmicro os=-sysv ;; go32) basic_machine=i386-pc os=-go32 ;; h3050r* | hiux*) basic_machine=hppa1.1-hitachi os=-hiuxwe2 ;; h8300hms) basic_machine=h8300-hitachi os=-hms ;; h8300xray) basic_machine=h8300-hitachi os=-xray ;; h8500hms) basic_machine=h8500-hitachi os=-hms ;; harris) basic_machine=m88k-harris os=-sysv3 ;; hp300-*) basic_machine=m68k-hp ;; hp300bsd) basic_machine=m68k-hp os=-bsd ;; hp300hpux) basic_machine=m68k-hp os=-hpux ;; hp3k9[0-9][0-9] | hp9[0-9][0-9]) basic_machine=hppa1.0-hp ;; hp9k2[0-9][0-9] | hp9k31[0-9]) basic_machine=m68000-hp ;; hp9k3[2-9][0-9]) basic_machine=m68k-hp ;; hp9k6[0-9][0-9] | hp6[0-9][0-9]) basic_machine=hppa1.0-hp ;; hp9k7[0-79][0-9] | hp7[0-79][0-9]) basic_machine=hppa1.1-hp ;; hp9k78[0-9] | hp78[0-9]) # FIXME: really hppa2.0-hp basic_machine=hppa1.1-hp ;; hp9k8[67]1 | hp8[67]1 | hp9k80[24] | hp80[24] | hp9k8[78]9 | hp8[78]9 | hp9k893 | hp893) # FIXME: really hppa2.0-hp basic_machine=hppa1.1-hp ;; hp9k8[0-9][13679] | hp8[0-9][13679]) basic_machine=hppa1.1-hp ;; hp9k8[0-9][0-9] | hp8[0-9][0-9]) basic_machine=hppa1.0-hp ;; hppa-next) os=-nextstep3 ;; hppaosf) basic_machine=hppa1.1-hp os=-osf ;; hppro) basic_machine=hppa1.1-hp os=-proelf ;; i370-ibm* | ibm*) basic_machine=i370-ibm ;; # I'm not sure what "Sysv32" means. Should this be sysv3.2? i*86v32) basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` os=-sysv32 ;; i*86v4*) basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` os=-sysv4 ;; i*86v) basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` os=-sysv ;; i*86sol2) basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` os=-solaris2 ;; i386mach) basic_machine=i386-mach os=-mach ;; i386-vsta | vsta) basic_machine=i386-unknown os=-vsta ;; iris | iris4d) basic_machine=mips-sgi case $os in -irix*) ;; *) os=-irix4 ;; esac ;; isi68 | isi) basic_machine=m68k-isi os=-sysv ;; m68knommu) basic_machine=m68k-unknown os=-linux ;; m68knommu-*) basic_machine=m68k-`echo $basic_machine | sed 's/^[^-]*-//'` os=-linux ;; m88k-omron*) basic_machine=m88k-omron ;; magnum | m3230) basic_machine=mips-mips os=-sysv ;; merlin) basic_machine=ns32k-utek os=-sysv ;; mingw32) basic_machine=i386-pc os=-mingw32 ;; mingw32ce) basic_machine=arm-unknown os=-mingw32ce ;; miniframe) basic_machine=m68000-convergent ;; *mint | -mint[0-9]* | *MiNT | *MiNT[0-9]*) basic_machine=m68k-atari os=-mint ;; mips3*-*) basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'` ;; mips3*) basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'`-unknown ;; monitor) basic_machine=m68k-rom68k os=-coff ;; morphos) basic_machine=powerpc-unknown os=-morphos ;; msdos) basic_machine=i386-pc os=-msdos ;; ms1-*) basic_machine=`echo $basic_machine | sed -e 's/ms1-/mt-/'` ;; mvs) basic_machine=i370-ibm os=-mvs ;; ncr3000) basic_machine=i486-ncr os=-sysv4 ;; netbsd386) basic_machine=i386-unknown os=-netbsd ;; netwinder) basic_machine=armv4l-rebel os=-linux ;; news | news700 | news800 | news900) basic_machine=m68k-sony os=-newsos ;; news1000) basic_machine=m68030-sony os=-newsos ;; news-3600 | risc-news) basic_machine=mips-sony os=-newsos ;; necv70) basic_machine=v70-nec os=-sysv ;; next | m*-next ) basic_machine=m68k-next case $os in -nextstep* ) ;; -ns2*) os=-nextstep2 ;; *) os=-nextstep3 ;; esac ;; nh3000) basic_machine=m68k-harris os=-cxux ;; nh[45]000) basic_machine=m88k-harris os=-cxux ;; nindy960) basic_machine=i960-intel os=-nindy ;; mon960) basic_machine=i960-intel os=-mon960 ;; nonstopux) basic_machine=mips-compaq os=-nonstopux ;; np1) basic_machine=np1-gould ;; nsr-tandem) basic_machine=nsr-tandem ;; op50n-* | op60c-*) basic_machine=hppa1.1-oki os=-proelf ;; openrisc | openrisc-*) basic_machine=or32-unknown ;; os400) basic_machine=powerpc-ibm os=-os400 ;; OSE68000 | ose68000) basic_machine=m68000-ericsson os=-ose ;; os68k) basic_machine=m68k-none os=-os68k ;; pa-hitachi) basic_machine=hppa1.1-hitachi os=-hiuxwe2 ;; paragon) basic_machine=i860-intel os=-osf ;; parisc) basic_machine=hppa-unknown os=-linux ;; parisc-*) basic_machine=hppa-`echo $basic_machine | sed 's/^[^-]*-//'` os=-linux ;; pbd) basic_machine=sparc-tti ;; pbb) basic_machine=m68k-tti ;; pc532 | pc532-*) basic_machine=ns32k-pc532 ;; pc98) basic_machine=i386-pc ;; pc98-*) basic_machine=i386-`echo $basic_machine | sed 's/^[^-]*-//'` ;; pentium | p5 | k5 | k6 | nexgen | viac3) basic_machine=i586-pc ;; pentiumpro | p6 | 6x86 | athlon | athlon_*) basic_machine=i686-pc ;; pentiumii | pentium2 | pentiumiii | pentium3) basic_machine=i686-pc ;; pentium4) basic_machine=i786-pc ;; pentium-* | p5-* | k5-* | k6-* | nexgen-* | viac3-*) basic_machine=i586-`echo $basic_machine | sed 's/^[^-]*-//'` ;; pentiumpro-* | p6-* | 6x86-* | athlon-*) basic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'` ;; pentiumii-* | pentium2-* | pentiumiii-* | pentium3-*) basic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'` ;; pentium4-*) basic_machine=i786-`echo $basic_machine | sed 's/^[^-]*-//'` ;; pn) basic_machine=pn-gould ;; power) basic_machine=power-ibm ;; ppc) basic_machine=powerpc-unknown ;; ppc-*) basic_machine=powerpc-`echo $basic_machine | sed 's/^[^-]*-//'` ;; ppcle | powerpclittle | ppc-le | powerpc-little) basic_machine=powerpcle-unknown ;; ppcle-* | powerpclittle-*) basic_machine=powerpcle-`echo $basic_machine | sed 's/^[^-]*-//'` ;; ppc64) basic_machine=powerpc64-unknown ;; ppc64-*) basic_machine=powerpc64-`echo $basic_machine | sed 's/^[^-]*-//'` ;; ppc64le | powerpc64little | ppc64-le | powerpc64-little) basic_machine=powerpc64le-unknown ;; ppc64le-* | powerpc64little-*) basic_machine=powerpc64le-`echo $basic_machine | sed 's/^[^-]*-//'` ;; ps2) basic_machine=i386-ibm ;; pw32) basic_machine=i586-unknown os=-pw32 ;; rdos) basic_machine=i386-pc os=-rdos ;; rom68k) basic_machine=m68k-rom68k os=-coff ;; rm[46]00) basic_machine=mips-siemens ;; rtpc | rtpc-*) basic_machine=romp-ibm ;; s390 | s390-*) basic_machine=s390-ibm ;; s390x | s390x-*) basic_machine=s390x-ibm ;; sa29200) basic_machine=a29k-amd os=-udi ;; sb1) basic_machine=mipsisa64sb1-unknown ;; sb1el) basic_machine=mipsisa64sb1el-unknown ;; sde) basic_machine=mipsisa32-sde os=-elf ;; sei) basic_machine=mips-sei os=-seiux ;; sequent) basic_machine=i386-sequent ;; sh) basic_machine=sh-hitachi os=-hms ;; sh5el) basic_machine=sh5le-unknown ;; sh64) basic_machine=sh64-unknown ;; sparclite-wrs | simso-wrs) basic_machine=sparclite-wrs os=-vxworks ;; sps7) basic_machine=m68k-bull os=-sysv2 ;; spur) basic_machine=spur-unknown ;; st2000) basic_machine=m68k-tandem ;; stratus) basic_machine=i860-stratus os=-sysv4 ;; sun2) basic_machine=m68000-sun ;; sun2os3) basic_machine=m68000-sun os=-sunos3 ;; sun2os4) basic_machine=m68000-sun os=-sunos4 ;; sun3os3) basic_machine=m68k-sun os=-sunos3 ;; sun3os4) basic_machine=m68k-sun os=-sunos4 ;; sun4os3) basic_machine=sparc-sun os=-sunos3 ;; sun4os4) basic_machine=sparc-sun os=-sunos4 ;; sun4sol2) basic_machine=sparc-sun os=-solaris2 ;; sun3 | sun3-*) basic_machine=m68k-sun ;; sun4) basic_machine=sparc-sun ;; sun386 | sun386i | roadrunner) basic_machine=i386-sun ;; sv1) basic_machine=sv1-cray os=-unicos ;; symmetry) basic_machine=i386-sequent os=-dynix ;; t3e) basic_machine=alphaev5-cray os=-unicos ;; t90) basic_machine=t90-cray os=-unicos ;; tic54x | c54x*) basic_machine=tic54x-unknown os=-coff ;; tic55x | c55x*) basic_machine=tic55x-unknown os=-coff ;; tic6x | c6x*) basic_machine=tic6x-unknown os=-coff ;; tile*) basic_machine=tile-unknown os=-linux-gnu ;; tx39) basic_machine=mipstx39-unknown ;; tx39el) basic_machine=mipstx39el-unknown ;; toad1) basic_machine=pdp10-xkl os=-tops20 ;; tower | tower-32) basic_machine=m68k-ncr ;; tpf) basic_machine=s390x-ibm os=-tpf ;; udi29k) basic_machine=a29k-amd os=-udi ;; ultra3) basic_machine=a29k-nyu os=-sym1 ;; v810 | necv810) basic_machine=v810-nec os=-none ;; vaxv) basic_machine=vax-dec os=-sysv ;; vms) basic_machine=vax-dec os=-vms ;; vpp*|vx|vx-*) basic_machine=f301-fujitsu ;; vxworks960) basic_machine=i960-wrs os=-vxworks ;; vxworks68) basic_machine=m68k-wrs os=-vxworks ;; vxworks29k) basic_machine=a29k-wrs os=-vxworks ;; w65*) basic_machine=w65-wdc os=-none ;; w89k-*) basic_machine=hppa1.1-winbond os=-proelf ;; xbox) basic_machine=i686-pc os=-mingw32 ;; xps | xps100) basic_machine=xps100-honeywell ;; ymp) basic_machine=ymp-cray os=-unicos ;; z8k-*-coff) basic_machine=z8k-unknown os=-sim ;; none) basic_machine=none-none os=-none ;; # Here we handle the default manufacturer of certain CPU types. It is in # some cases the only manufacturer, in others, it is the most popular. w89k) basic_machine=hppa1.1-winbond ;; op50n) basic_machine=hppa1.1-oki ;; op60c) basic_machine=hppa1.1-oki ;; romp) basic_machine=romp-ibm ;; mmix) basic_machine=mmix-knuth ;; rs6000) basic_machine=rs6000-ibm ;; vax) basic_machine=vax-dec ;; pdp10) # there are many clones, so DEC is not a safe bet basic_machine=pdp10-unknown ;; pdp11) basic_machine=pdp11-dec ;; we32k) basic_machine=we32k-att ;; sh[1234] | sh[24]a | sh[34]eb | sh[1234]le | sh[23]ele) basic_machine=sh-unknown ;; sparc | sparcv8 | sparcv9 | sparcv9b | sparcv9v) basic_machine=sparc-sun ;; cydra) basic_machine=cydra-cydrome ;; orion) basic_machine=orion-highlevel ;; orion105) basic_machine=clipper-highlevel ;; mac | mpw | mac-mpw) basic_machine=m68k-apple ;; pmac | pmac-mpw) basic_machine=powerpc-apple ;; *-unknown) # Make sure to match an already-canonicalized machine name. ;; *) echo Invalid configuration \`$1\': machine \`$basic_machine\' not recognized 1>&2 exit 1 ;; esac # Here we canonicalize certain aliases for manufacturers. case $basic_machine in *-digital*) basic_machine=`echo $basic_machine | sed 's/digital.*/dec/'` ;; *-commodore*) basic_machine=`echo $basic_machine | sed 's/commodore.*/cbm/'` ;; *) ;; esac # Decode manufacturer-specific aliases for certain operating systems. if [ x"$os" != x"" ] then case $os in # First match some system type aliases # that might get confused with valid system types. # -solaris* is a basic system type, with this one exception. -solaris1 | -solaris1.*) os=`echo $os | sed -e 's|solaris1|sunos4|'` ;; -solaris) os=-solaris2 ;; -svr4*) os=-sysv4 ;; -unixware*) os=-sysv4.2uw ;; -gnu/linux*) os=`echo $os | sed -e 's|gnu/linux|linux-gnu|'` ;; # First accept the basic system types. # The portable systems comes first. # Each alternative MUST END IN A *, to match a version number. # -sysv* is not here because it comes later, after sysvr4. -gnu* | -bsd* | -mach* | -minix* | -genix* | -ultrix* | -irix* \ | -*vms* | -sco* | -esix* | -isc* | -aix* | -sunos | -sunos[34]*\ | -hpux* | -unos* | -osf* | -luna* | -dgux* | -solaris* | -sym* \ | -amigaos* | -amigados* | -msdos* | -newsos* | -unicos* | -aof* \ | -aos* \ | -nindy* | -vxsim* | -vxworks* | -ebmon* | -hms* | -mvs* \ | -clix* | -riscos* | -uniplus* | -iris* | -rtu* | -xenix* \ | -hiux* | -386bsd* | -knetbsd* | -mirbsd* | -netbsd* \ | -openbsd* | -solidbsd* \ | -ekkobsd* | -kfreebsd* | -freebsd* | -riscix* | -lynxos* \ | -bosx* | -nextstep* | -cxux* | -aout* | -elf* | -oabi* \ | -ptx* | -coff* | -ecoff* | -winnt* | -domain* | -vsta* \ | -udi* | -eabi* | -lites* | -ieee* | -go32* | -aux* \ | -chorusos* | -chorusrdb* \ | -cygwin* | -pe* | -psos* | -moss* | -proelf* | -rtems* \ | -mingw32* | -linux-gnu* | -linux-newlib* | -linux-uclibc* \ | -uxpv* | -beos* | -mpeix* | -udk* \ | -interix* | -uwin* | -mks* | -rhapsody* | -darwin* | -opened* \ | -openstep* | -oskit* | -conix* | -pw32* | -nonstopux* \ | -storm-chaos* | -tops10* | -tenex* | -tops20* | -its* \ | -os2* | -vos* | -palmos* | -uclinux* | -nucleus* \ | -morphos* | -superux* | -rtmk* | -rtmk-nova* | -windiss* \ | -powermax* | -dnix* | -nx6 | -nx7 | -sei* | -dragonfly* \ | -skyos* | -haiku* | -rdos* | -toppers* | -drops*) # Remember, each alternative MUST END IN *, to match a version number. ;; -qnx*) case $basic_machine in x86-* | i*86-*) ;; *) os=-nto$os ;; esac ;; -nto-qnx*) ;; -nto*) os=`echo $os | sed -e 's|nto|nto-qnx|'` ;; -sim | -es1800* | -hms* | -xray | -os68k* | -none* | -v88r* \ | -windows* | -osx | -abug | -netware* | -os9* | -beos* | -haiku* \ | -macos* | -mpw* | -magic* | -mmixware* | -mon960* | -lnews*) ;; -mac*) os=`echo $os | sed -e 's|mac|macos|'` ;; -linux-dietlibc) os=-linux-dietlibc ;; -linux*) os=`echo $os | sed -e 's|linux|linux-gnu|'` ;; -sunos5*) os=`echo $os | sed -e 's|sunos5|solaris2|'` ;; -sunos6*) os=`echo $os | sed -e 's|sunos6|solaris3|'` ;; -opened*) os=-openedition ;; -os400*) os=-os400 ;; -wince*) os=-wince ;; -osfrose*) os=-osfrose ;; -osf*) os=-osf ;; -utek*) os=-bsd ;; -dynix*) os=-bsd ;; -acis*) os=-aos ;; -atheos*) os=-atheos ;; -syllable*) os=-syllable ;; -386bsd) os=-bsd ;; -ctix* | -uts*) os=-sysv ;; -nova*) os=-rtmk-nova ;; -ns2 ) os=-nextstep2 ;; -nsk*) os=-nsk ;; # Preserve the version number of sinix5. -sinix5.*) os=`echo $os | sed -e 's|sinix|sysv|'` ;; -sinix*) os=-sysv4 ;; -tpf*) os=-tpf ;; -triton*) os=-sysv3 ;; -oss*) os=-sysv3 ;; -svr4) os=-sysv4 ;; -svr3) os=-sysv3 ;; -sysvr4) os=-sysv4 ;; # This must come after -sysvr4. -sysv*) ;; -ose*) os=-ose ;; -es1800*) os=-ose ;; -xenix) os=-xenix ;; -*mint | -mint[0-9]* | -*MiNT | -MiNT[0-9]*) os=-mint ;; -aros*) os=-aros ;; -kaos*) os=-kaos ;; -zvmoe) os=-zvmoe ;; -none) ;; *) # Get rid of the `-' at the beginning of $os. os=`echo $os | sed 's/[^-]*-//'` echo Invalid configuration \`$1\': system \`$os\' not recognized 1>&2 exit 1 ;; esac else # Here we handle the default operating systems that come with various machines. # The value should be what the vendor currently ships out the door with their # machine or put another way, the most popular os provided with the machine. # Note that if you're going to try to match "-MANUFACTURER" here (say, # "-sun"), then you have to tell the case statement up towards the top # that MANUFACTURER isn't an operating system. Otherwise, code above # will signal an error saying that MANUFACTURER isn't an operating # system, and we'll never get to this point. case $basic_machine in score-*) os=-elf ;; spu-*) os=-elf ;; *-acorn) os=-riscix1.2 ;; arm*-rebel) os=-linux ;; arm*-semi) os=-aout ;; c4x-* | tic4x-*) os=-coff ;; # This must come before the *-dec entry. pdp10-*) os=-tops20 ;; pdp11-*) os=-none ;; *-dec | vax-*) os=-ultrix4.2 ;; m68*-apollo) os=-domain ;; i386-sun) os=-sunos4.0.2 ;; m68000-sun) os=-sunos3 # This also exists in the configure program, but was not the # default. # os=-sunos4 ;; m68*-cisco) os=-aout ;; mep-*) os=-elf ;; mips*-cisco) os=-elf ;; mips*-*) os=-elf ;; or32-*) os=-coff ;; *-tti) # must be before sparc entry or we get the wrong os. os=-sysv3 ;; sparc-* | *-sun) os=-sunos4.1.1 ;; *-be) os=-beos ;; *-haiku) os=-haiku ;; *-ibm) os=-aix ;; *-knuth) os=-mmixware ;; *-wec) os=-proelf ;; *-winbond) os=-proelf ;; *-oki) os=-proelf ;; *-hp) os=-hpux ;; *-hitachi) os=-hiux ;; i860-* | *-att | *-ncr | *-altos | *-motorola | *-convergent) os=-sysv ;; *-cbm) os=-amigaos ;; *-dg) os=-dgux ;; *-dolphin) os=-sysv3 ;; m68k-ccur) os=-rtu ;; m88k-omron*) os=-luna ;; *-next ) os=-nextstep ;; *-sequent) os=-ptx ;; *-crds) os=-unos ;; *-ns) os=-genix ;; i370-*) os=-mvs ;; *-next) os=-nextstep3 ;; *-gould) os=-sysv ;; *-highlevel) os=-bsd ;; *-encore) os=-bsd ;; *-sgi) os=-irix ;; *-siemens) os=-sysv4 ;; *-masscomp) os=-rtu ;; f30[01]-fujitsu | f700-fujitsu) os=-uxpv ;; *-rom68k) os=-coff ;; *-*bug) os=-coff ;; *-apple) os=-macos ;; *-atari*) os=-mint ;; *) os=-none ;; esac fi # Here we handle the case where we know the os, and the CPU type, but not the # manufacturer. We pick the logical manufacturer. vendor=unknown case $basic_machine in *-unknown) case $os in -riscix*) vendor=acorn ;; -sunos*) vendor=sun ;; -aix*) vendor=ibm ;; -beos*) vendor=be ;; -hpux*) vendor=hp ;; -mpeix*) vendor=hp ;; -hiux*) vendor=hitachi ;; -unos*) vendor=crds ;; -dgux*) vendor=dg ;; -luna*) vendor=omron ;; -genix*) vendor=ns ;; -mvs* | -opened*) vendor=ibm ;; -os400*) vendor=ibm ;; -ptx*) vendor=sequent ;; -tpf*) vendor=ibm ;; -vxsim* | -vxworks* | -windiss*) vendor=wrs ;; -aux*) vendor=apple ;; -hms*) vendor=hitachi ;; -mpw* | -macos*) vendor=apple ;; -*mint | -mint[0-9]* | -*MiNT | -MiNT[0-9]*) vendor=atari ;; -vos*) vendor=stratus ;; esac basic_machine=`echo $basic_machine | sed "s/unknown/$vendor/"` ;; esac echo $basic_machine$os exit # Local variables: # eval: (add-hook 'write-file-hooks 'time-stamp) # time-stamp-start: "timestamp='" # time-stamp-format: "%:y-%02m-%02d" # time-stamp-end: "'" # End: openhpi-2.14.1/depcomp0000755000076400007640000004271311302567646011567 0ustar #! /bin/sh # depcomp - compile a program generating dependencies as side-effects scriptversion=2007-03-29.01 # Copyright (C) 1999, 2000, 2003, 2004, 2005, 2006, 2007 Free Software # Foundation, Inc. # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2, or (at your option) # any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA # 02110-1301, USA. # As a special exception to the GNU General Public License, if you # distribute this file as part of a program that contains a # configuration script generated by Autoconf, you may include it under # the same distribution terms that you use for the rest of that program. # Originally written by Alexandre Oliva . case $1 in '') echo "$0: No command. Try \`$0 --help' for more information." 1>&2 exit 1; ;; -h | --h*) cat <<\EOF Usage: depcomp [--help] [--version] PROGRAM [ARGS] Run PROGRAMS ARGS to compile a file, generating dependencies as side-effects. Environment variables: depmode Dependency tracking mode. source Source file read by `PROGRAMS ARGS'. object Object file output by `PROGRAMS ARGS'. DEPDIR directory where to store dependencies. depfile Dependency file to output. tmpdepfile Temporary file to use when outputing dependencies. libtool Whether libtool is used (yes/no). Report bugs to . EOF exit $? ;; -v | --v*) echo "depcomp $scriptversion" exit $? ;; esac if test -z "$depmode" || test -z "$source" || test -z "$object"; then echo "depcomp: Variables source, object and depmode must be set" 1>&2 exit 1 fi # Dependencies for sub/bar.o or sub/bar.obj go into sub/.deps/bar.Po. depfile=${depfile-`echo "$object" | sed 's|[^\\/]*$|'${DEPDIR-.deps}'/&|;s|\.\([^.]*\)$|.P\1|;s|Pobj$|Po|'`} tmpdepfile=${tmpdepfile-`echo "$depfile" | sed 's/\.\([^.]*\)$/.T\1/'`} rm -f "$tmpdepfile" # Some modes work just like other modes, but use different flags. We # parameterize here, but still list the modes in the big case below, # to make depend.m4 easier to write. Note that we *cannot* use a case # here, because this file can only contain one case statement. if test "$depmode" = hp; then # HP compiler uses -M and no extra arg. gccflag=-M depmode=gcc fi if test "$depmode" = dashXmstdout; then # This is just like dashmstdout with a different argument. dashmflag=-xM depmode=dashmstdout fi case "$depmode" in gcc3) ## gcc 3 implements dependency tracking that does exactly what ## we want. Yay! Note: for some reason libtool 1.4 doesn't like ## it if -MD -MP comes after the -MF stuff. Hmm. ## Unfortunately, FreeBSD c89 acceptance of flags depends upon ## the command line argument order; so add the flags where they ## appear in depend2.am. Note that the slowdown incurred here ## affects only configure: in makefiles, %FASTDEP% shortcuts this. for arg do case $arg in -c) set fnord "$@" -MT "$object" -MD -MP -MF "$tmpdepfile" "$arg" ;; *) set fnord "$@" "$arg" ;; esac shift # fnord shift # $arg done "$@" stat=$? if test $stat -eq 0; then : else rm -f "$tmpdepfile" exit $stat fi mv "$tmpdepfile" "$depfile" ;; gcc) ## There are various ways to get dependency output from gcc. Here's ## why we pick this rather obscure method: ## - Don't want to use -MD because we'd like the dependencies to end ## up in a subdir. Having to rename by hand is ugly. ## (We might end up doing this anyway to support other compilers.) ## - The DEPENDENCIES_OUTPUT environment variable makes gcc act like ## -MM, not -M (despite what the docs say). ## - Using -M directly means running the compiler twice (even worse ## than renaming). if test -z "$gccflag"; then gccflag=-MD, fi "$@" -Wp,"$gccflag$tmpdepfile" stat=$? if test $stat -eq 0; then : else rm -f "$tmpdepfile" exit $stat fi rm -f "$depfile" echo "$object : \\" > "$depfile" alpha=ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz ## The second -e expression handles DOS-style file names with drive letters. sed -e 's/^[^:]*: / /' \ -e 's/^['$alpha']:\/[^:]*: / /' < "$tmpdepfile" >> "$depfile" ## This next piece of magic avoids the `deleted header file' problem. ## The problem is that when a header file which appears in a .P file ## is deleted, the dependency causes make to die (because there is ## typically no way to rebuild the header). We avoid this by adding ## dummy dependencies for each header file. Too bad gcc doesn't do ## this for us directly. tr ' ' ' ' < "$tmpdepfile" | ## Some versions of gcc put a space before the `:'. On the theory ## that the space means something, we add a space to the output as ## well. ## Some versions of the HPUX 10.20 sed can't process this invocation ## correctly. Breaking it into two sed invocations is a workaround. sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' | sed -e 's/$/ :/' >> "$depfile" rm -f "$tmpdepfile" ;; hp) # This case exists only to let depend.m4 do its work. It works by # looking at the text of this script. This case will never be run, # since it is checked for above. exit 1 ;; sgi) if test "$libtool" = yes; then "$@" "-Wp,-MDupdate,$tmpdepfile" else "$@" -MDupdate "$tmpdepfile" fi stat=$? if test $stat -eq 0; then : else rm -f "$tmpdepfile" exit $stat fi rm -f "$depfile" if test -f "$tmpdepfile"; then # yes, the sourcefile depend on other files echo "$object : \\" > "$depfile" # Clip off the initial element (the dependent). Don't try to be # clever and replace this with sed code, as IRIX sed won't handle # lines with more than a fixed number of characters (4096 in # IRIX 6.2 sed, 8192 in IRIX 6.5). We also remove comment lines; # the IRIX cc adds comments like `#:fec' to the end of the # dependency line. tr ' ' ' ' < "$tmpdepfile" \ | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' | \ tr ' ' ' ' >> $depfile echo >> $depfile # The second pass generates a dummy entry for each header file. tr ' ' ' ' < "$tmpdepfile" \ | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' -e 's/$/:/' \ >> $depfile else # The sourcefile does not contain any dependencies, so just # store a dummy comment line, to avoid errors with the Makefile # "include basename.Plo" scheme. echo "#dummy" > "$depfile" fi rm -f "$tmpdepfile" ;; aix) # The C for AIX Compiler uses -M and outputs the dependencies # in a .u file. In older versions, this file always lives in the # current directory. Also, the AIX compiler puts `$object:' at the # start of each line; $object doesn't have directory information. # Version 6 uses the directory in both cases. dir=`echo "$object" | sed -e 's|/[^/]*$|/|'` test "x$dir" = "x$object" && dir= base=`echo "$object" | sed -e 's|^.*/||' -e 's/\.o$//' -e 's/\.lo$//'` if test "$libtool" = yes; then tmpdepfile1=$dir$base.u tmpdepfile2=$base.u tmpdepfile3=$dir.libs/$base.u "$@" -Wc,-M else tmpdepfile1=$dir$base.u tmpdepfile2=$dir$base.u tmpdepfile3=$dir$base.u "$@" -M fi stat=$? if test $stat -eq 0; then : else rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" exit $stat fi for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" do test -f "$tmpdepfile" && break done if test -f "$tmpdepfile"; then # Each line is of the form `foo.o: dependent.h'. # Do two passes, one to just change these to # `$object: dependent.h' and one to simply `dependent.h:'. sed -e "s,^.*\.[a-z]*:,$object:," < "$tmpdepfile" > "$depfile" # That's a tab and a space in the []. sed -e 's,^.*\.[a-z]*:[ ]*,,' -e 's,$,:,' < "$tmpdepfile" >> "$depfile" else # The sourcefile does not contain any dependencies, so just # store a dummy comment line, to avoid errors with the Makefile # "include basename.Plo" scheme. echo "#dummy" > "$depfile" fi rm -f "$tmpdepfile" ;; icc) # Intel's C compiler understands `-MD -MF file'. However on # icc -MD -MF foo.d -c -o sub/foo.o sub/foo.c # ICC 7.0 will fill foo.d with something like # foo.o: sub/foo.c # foo.o: sub/foo.h # which is wrong. We want: # sub/foo.o: sub/foo.c # sub/foo.o: sub/foo.h # sub/foo.c: # sub/foo.h: # ICC 7.1 will output # foo.o: sub/foo.c sub/foo.h # and will wrap long lines using \ : # foo.o: sub/foo.c ... \ # sub/foo.h ... \ # ... "$@" -MD -MF "$tmpdepfile" stat=$? if test $stat -eq 0; then : else rm -f "$tmpdepfile" exit $stat fi rm -f "$depfile" # Each line is of the form `foo.o: dependent.h', # or `foo.o: dep1.h dep2.h \', or ` dep3.h dep4.h \'. # Do two passes, one to just change these to # `$object: dependent.h' and one to simply `dependent.h:'. sed "s,^[^:]*:,$object :," < "$tmpdepfile" > "$depfile" # Some versions of the HPUX 10.20 sed can't process this invocation # correctly. Breaking it into two sed invocations is a workaround. sed 's,^[^:]*: \(.*\)$,\1,;s/^\\$//;/^$/d;/:$/d' < "$tmpdepfile" | sed -e 's/$/ :/' >> "$depfile" rm -f "$tmpdepfile" ;; hp2) # The "hp" stanza above does not work with aCC (C++) and HP's ia64 # compilers, which have integrated preprocessors. The correct option # to use with these is +Maked; it writes dependencies to a file named # 'foo.d', which lands next to the object file, wherever that # happens to be. # Much of this is similar to the tru64 case; see comments there. dir=`echo "$object" | sed -e 's|/[^/]*$|/|'` test "x$dir" = "x$object" && dir= base=`echo "$object" | sed -e 's|^.*/||' -e 's/\.o$//' -e 's/\.lo$//'` if test "$libtool" = yes; then tmpdepfile1=$dir$base.d tmpdepfile2=$dir.libs/$base.d "$@" -Wc,+Maked else tmpdepfile1=$dir$base.d tmpdepfile2=$dir$base.d "$@" +Maked fi stat=$? if test $stat -eq 0; then : else rm -f "$tmpdepfile1" "$tmpdepfile2" exit $stat fi for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" do test -f "$tmpdepfile" && break done if test -f "$tmpdepfile"; then sed -e "s,^.*\.[a-z]*:,$object:," "$tmpdepfile" > "$depfile" # Add `dependent.h:' lines. sed -ne '2,${; s/^ *//; s/ \\*$//; s/$/:/; p;}' "$tmpdepfile" >> "$depfile" else echo "#dummy" > "$depfile" fi rm -f "$tmpdepfile" "$tmpdepfile2" ;; tru64) # The Tru64 compiler uses -MD to generate dependencies as a side # effect. `cc -MD -o foo.o ...' puts the dependencies into `foo.o.d'. # At least on Alpha/Redhat 6.1, Compaq CCC V6.2-504 seems to put # dependencies in `foo.d' instead, so we check for that too. # Subdirectories are respected. dir=`echo "$object" | sed -e 's|/[^/]*$|/|'` test "x$dir" = "x$object" && dir= base=`echo "$object" | sed -e 's|^.*/||' -e 's/\.o$//' -e 's/\.lo$//'` if test "$libtool" = yes; then # With Tru64 cc, shared objects can also be used to make a # static library. This mechanism is used in libtool 1.4 series to # handle both shared and static libraries in a single compilation. # With libtool 1.4, dependencies were output in $dir.libs/$base.lo.d. # # With libtool 1.5 this exception was removed, and libtool now # generates 2 separate objects for the 2 libraries. These two # compilations output dependencies in $dir.libs/$base.o.d and # in $dir$base.o.d. We have to check for both files, because # one of the two compilations can be disabled. We should prefer # $dir$base.o.d over $dir.libs/$base.o.d because the latter is # automatically cleaned when .libs/ is deleted, while ignoring # the former would cause a distcleancheck panic. tmpdepfile1=$dir.libs/$base.lo.d # libtool 1.4 tmpdepfile2=$dir$base.o.d # libtool 1.5 tmpdepfile3=$dir.libs/$base.o.d # libtool 1.5 tmpdepfile4=$dir.libs/$base.d # Compaq CCC V6.2-504 "$@" -Wc,-MD else tmpdepfile1=$dir$base.o.d tmpdepfile2=$dir$base.d tmpdepfile3=$dir$base.d tmpdepfile4=$dir$base.d "$@" -MD fi stat=$? if test $stat -eq 0; then : else rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" "$tmpdepfile4" exit $stat fi for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" "$tmpdepfile4" do test -f "$tmpdepfile" && break done if test -f "$tmpdepfile"; then sed -e "s,^.*\.[a-z]*:,$object:," < "$tmpdepfile" > "$depfile" # That's a tab and a space in the []. sed -e 's,^.*\.[a-z]*:[ ]*,,' -e 's,$,:,' < "$tmpdepfile" >> "$depfile" else echo "#dummy" > "$depfile" fi rm -f "$tmpdepfile" ;; #nosideeffect) # This comment above is used by automake to tell side-effect # dependency tracking mechanisms from slower ones. dashmstdout) # Important note: in order to support this mode, a compiler *must* # always write the preprocessed file to stdout, regardless of -o. "$@" || exit $? # Remove the call to Libtool. if test "$libtool" = yes; then while test $1 != '--mode=compile'; do shift done shift fi # Remove `-o $object'. IFS=" " for arg do case $arg in -o) shift ;; $object) shift ;; *) set fnord "$@" "$arg" shift # fnord shift # $arg ;; esac done test -z "$dashmflag" && dashmflag=-M # Require at least two characters before searching for `:' # in the target name. This is to cope with DOS-style filenames: # a dependency such as `c:/foo/bar' could be seen as target `c' otherwise. "$@" $dashmflag | sed 's:^[ ]*[^: ][^:][^:]*\:[ ]*:'"$object"'\: :' > "$tmpdepfile" rm -f "$depfile" cat < "$tmpdepfile" > "$depfile" tr ' ' ' ' < "$tmpdepfile" | \ ## Some versions of the HPUX 10.20 sed can't process this invocation ## correctly. Breaking it into two sed invocations is a workaround. sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' | sed -e 's/$/ :/' >> "$depfile" rm -f "$tmpdepfile" ;; dashXmstdout) # This case only exists to satisfy depend.m4. It is never actually # run, as this mode is specially recognized in the preamble. exit 1 ;; makedepend) "$@" || exit $? # Remove any Libtool call if test "$libtool" = yes; then while test $1 != '--mode=compile'; do shift done shift fi # X makedepend shift cleared=no for arg in "$@"; do case $cleared in no) set ""; shift cleared=yes ;; esac case "$arg" in -D*|-I*) set fnord "$@" "$arg"; shift ;; # Strip any option that makedepend may not understand. Remove # the object too, otherwise makedepend will parse it as a source file. -*|$object) ;; *) set fnord "$@" "$arg"; shift ;; esac done obj_suffix="`echo $object | sed 's/^.*\././'`" touch "$tmpdepfile" ${MAKEDEPEND-makedepend} -o"$obj_suffix" -f"$tmpdepfile" "$@" rm -f "$depfile" cat < "$tmpdepfile" > "$depfile" sed '1,2d' "$tmpdepfile" | tr ' ' ' ' | \ ## Some versions of the HPUX 10.20 sed can't process this invocation ## correctly. Breaking it into two sed invocations is a workaround. sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' | sed -e 's/$/ :/' >> "$depfile" rm -f "$tmpdepfile" "$tmpdepfile".bak ;; cpp) # Important note: in order to support this mode, a compiler *must* # always write the preprocessed file to stdout. "$@" || exit $? # Remove the call to Libtool. if test "$libtool" = yes; then while test $1 != '--mode=compile'; do shift done shift fi # Remove `-o $object'. IFS=" " for arg do case $arg in -o) shift ;; $object) shift ;; *) set fnord "$@" "$arg" shift # fnord shift # $arg ;; esac done "$@" -E | sed -n -e '/^# [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' \ -e '/^#line [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' | sed '$ s: \\$::' > "$tmpdepfile" rm -f "$depfile" echo "$object : \\" > "$depfile" cat < "$tmpdepfile" >> "$depfile" sed < "$tmpdepfile" '/^$/d;s/^ //;s/ \\$//;s/$/ :/' >> "$depfile" rm -f "$tmpdepfile" ;; msvisualcpp) # Important note: in order to support this mode, a compiler *must* # always write the preprocessed file to stdout, regardless of -o, # because we must use -o when running libtool. "$@" || exit $? IFS=" " for arg do case "$arg" in "-Gm"|"/Gm"|"-Gi"|"/Gi"|"-ZI"|"/ZI") set fnord "$@" shift shift ;; *) set fnord "$@" "$arg" shift shift ;; esac done "$@" -E | sed -n '/^#line [0-9][0-9]* "\([^"]*\)"/ s::echo "`cygpath -u \\"\1\\"`":p' | sort | uniq > "$tmpdepfile" rm -f "$depfile" echo "$object : \\" > "$depfile" . "$tmpdepfile" | sed 's% %\\ %g' | sed -n '/^\(.*\)$/ s:: \1 \\:p' >> "$depfile" echo " " >> "$depfile" . "$tmpdepfile" | sed 's% %\\ %g' | sed -n '/^\(.*\)$/ s::\1\::p' >> "$depfile" rm -f "$tmpdepfile" ;; none) exec "$@" ;; *) echo "Unknown depmode $depmode" 1>&2 exit 1 ;; esac exit 0 # Local Variables: # mode: shell-script # sh-indentation: 2 # eval: (add-hook 'write-file-hooks 'time-stamp) # time-stamp-start: "scriptversion=" # time-stamp-format: "%:y-%02m-%02d.%02H" # time-stamp-end: "$" # End: openhpi-2.14.1/openhpi.spec.in0000644000076400007640000002226611302567132013124 0ustar %define _topdir @abs_top_srcdir@ %define _tmpdir /tmp %define _rpmtopdir %{_topdir}/rpm %define _builddir %{_rpmtopdir}/BUILD %define _rpmdir %{_rpmtopdir}/RPMS %define _sourcedir %{_topdir} %define _specdir %{_topdir} %define _srcrpmdir %{_rpmtopdir}/SRPMS %define _docdir %{_datadir}/doc/%{name}-%{version} %define with_ipmi @WITH_IPMI@ %if "x@IPMIDIRECT@" == "xipmidirect" %define with_ipmidirect 1 %endif %define with_bladecenter @WITH_SNMP_BC@ %if "x@SIMULATOR@" == "xsimulator" %define with_simulator 1 %endif %define with_rtas @WITH_RTAS@ %define with_sysfs @WITH_SYSFS@ %if "x@WATCHDOG@" == "xwatchdog" %define with_watchdog 1 %endif %define with_ilo2_ribcl @WITH_ILO2_RIBCL@ %define with_oa_soap @WITH_OA_SOAP@ %define with_docbook2html @WITH_DOCBOOK2HTML@ Name: @HPI_PKG@ Version: @VERSION@ Release: 1 # Summary: Open implementation of the SAF Hardware Platform Interface # License: BSD Group: System/Monitoring # Vendor: OpenHPI Project Packager: renier@openhpi.org # URL: http://www.openhpi.org Source: http://prdownloads.sourceforge.net/openhpi/%{name}-%{version}.tar.gz # Buildroot: %{_rpmtopdir}/INSTALL BuildRequires: pkgconfig glib2-devel automake autoconf libtool gcc-c++ %if 0%{?suse_version} BuildRequires: tcpd-devel %else BuildRequires: tcp_wrappers %endif %if 0%{?with_docbook2html} BuildRequires: docbook-utils %endif Requires: e2fsprogs-devel openssl-devel libstdc++-devel glib2-devel %package devel Summary: OpenHPI and SAF header files Group: System/Monitoring Requires: openhpi = %{version} %package clients Summary: OpenHPI command-line utilities Group: System/Monitoring %if 0%{?suse_version} BuildRequires: popt-devel %endif Requires: openhpi = %{version} popt %if 0%{?with_ipmi} %package ipmi Summary: OpenHPI plugin for OpenIPMI Group: System/Monitoring BuildRequires: OpenIPMI-devel Requires: openhpi = %{version} OpenIPMI %endif %if 0%{?with_ipmidirect} %package ipmidirect Summary: OpenHPI plugin for IPMI-enabled systems Group: System/Monitoring Requires: openhpi = %{version} %endif %if 0%{?with_rtas} %package rtas Summary: OpenHPI plugin for IBM PPC systems Group: System/Monitoring BuildRequires: librtas-devel Requires: openhpi = %{version} librtas %endif %if 0%{?with_simulator} %package simulator Summary: OpenHPI plugin for testing the core library Group: System/Monitoring Requires: openhpi = %{version} %endif %if 0%{?with_bladecenter} %package bladecenter Summary: OpenHPI plugin for the IBM Blade Center Group: System/Monitoring BuildRequires: net-snmp-devel Requires: openhpi = %{version} net-snmp > 5.0 %endif %if 0%{?with_sysfs} %package sysfs Summary: OpenHPI plugin for sysfs Group: System/Monitoring Requires: openhpi = %{version} libsysfs %endif %if 0%{?with_watchdog} %package watchdog Group: System/Monitoring Summary: OpenHPI plugin for Linux software watchdog support Requires: openhpi = %{version} %endif %if 0%{?with_ilo2_ribcl} %package ilo2_ribcl Summary: OpenHPI plugin for HP ProLiant Rack Mount Servers Group: System/Monitoring BuildRequires: libxml2-devel Requires: openhpi = %{version} libxml2 openssl %endif %if 0%{?with_oa_soap} %package oa_soap Summary: OpenHPI plugin for HP BladeSystem c-Class Group: System/Monitoring BuildRequires: libxml2-devel Requires: openhpi = %{version} libxml2 openssl %endif %description An open implementation of the Service Availability Forum (SAF) Hardware Platform Interface (HPI). It includes support for multiple types of hardware including: IPMI, IBM Blade Center (via SNMP), Linux Watchdog devices, and Sysfs based systems. %description devel Contains header and other include files needed by developers to build application that use the OpenHPI library. %description clients These command-line applications serve as HPI utilities that you can use for looking at: sensor readings, vpd data, power machines on/off, etc. They lso serve as examples to developers of HPI API usage. %if 0%{?with_ipmi} %description ipmi This OpenHPI plugin uses OpenIPMI to connect to IPMI-enabled hardware locally or over the network. Its focus is wide, created to support any generic hardware topology that uses IPMI. %endif %if 0%{?with_ipmidirect} %description ipmidirect This OpenHPI plugin connects directly to IPMI-enabled hardware locally or over the network. Its focus is to support ATCA-type chassis. %endif %if 0%{?with_rtas} %description rtas OpenHPI plugin for reading sensor and vpd information from IBM PPC systems. %endif %if 0%{?with_simulator} %description simulator OpenHPI plugin that reports fakes hardware used for testing the core library. %endif %if 0%{?with_bladecenter} %description bladecenter OpenHPI plugin supporting the IBM BladeCenter. It also supports RSA-enabled IBM systems, in addition to all types of BladeCenters. This plugin uses snmp to connect to and gather information from all systems. %endif %if 0%{?with_sysfs} %description sysfs OpenHPI plugin that reads system information from sysfs. %endif %if 0%{?with_watchdog} %description watchdog OpenHPI plugin that uses the Linux software watchdog support provided by the kernel. %endif %if 0%{?with_ilo2_ribcl} %description ilo2_ribcl OpenHPI plugin supporting HP ProLiant Rack Mount Servers. This plug-in connects to iLO2 on HP ProLiant Rack Mount Server using a SSL connection and exchanges information via Remote Insight Board Command Language (RIBCL). %endif %if 0%{?with_oa_soap} %description oa_soap OpenHPI plug-in supporting HP BladeSystems c-Class. This plug-in connects to the OA of a c-Class chassis using an SSL connection and manages the system using an XML-encoded SOAP interface. %endif ################################################### %prep ################################################### %setup ################################################### %build ################################################### %configure @ac_configure_args@ --prefix=/usr --with-varpath=/var/lib/%{name} find . -type f -name "Makefile" | xargs -n1 sed -i -e 's/-D_FORTIFY_SOURCE=2//g;' %{__make} ################################################### %install ################################################### make DESTDIR=%{buildroot} install %{__install} -Dd -m 0755 %{buildroot}%{_sysconfdir}/%{name} %{buildroot}/var/lib/%{name} %{__install} -m 0644 %{name}.conf.example %{buildroot}%{_sysconfdir}/%{name}/%{name}.conf %post ################################################### %files ################################################### %defattr(-,root,root) %{_docdir}/README* %{_docdir}/COPYING %if 0%{?with_docbook2html} %{_docdir}/html/*.html %dir %{_docdir}/html/images %{_docdir}/html/images/*.png %{_docdir}/html/images/*.gif %endif %dir %{_sysconfdir}/%{name}/ %config(noreplace) %attr(0640,root,root) %{_sysconfdir}/%{name}/%{name}.conf %dir %{_libdir}/%{name} %dir /var/lib/%{name} %{_libdir}/libopenhpi*.so.* %{_libdir}/liboh*connx*.so.* %{_mandir}/man7/%{name}.7* %{_mandir}/man8/%{name}d.8* %{_sbindir}/openhpid %{_sysconfdir}/init.d/openhpid ################################################### %files devel ################################################### %defattr(-,root,root) %{_includedir}/%{name} %{_libdir}/pkgconfig/openhpi.pc %{_libdir}/pkgconfig/openhpiutils.pc %{_libdir}/libopenhpi*.so %{_libdir}/libopenhpi*.la %{_libdir}/*.a %{_libdir}/liboh*connx*.so %{_libdir}/liboh*connx*.la ################################################### %files clients ################################################### %defattr(-,root,root) %{_bindir}/hpi* %{_mandir}/man1/*.1* %{_sysconfdir}/openhpi/openhpiclient.conf ################################################### %if 0%{?with_ipmi} %files ipmi ################################################### %defattr(-,root,root) %{_libdir}/%{name}/libipmi.* %endif ################################################### %if 0%{?with_ipmidirect} %files ipmidirect ################################################### %defattr(-,root,root) %{_libdir}/%{name}/libipmidirect.* %endif ################################################### %if 0%{?with_rtas} %files rtas ################################################### %defattr(-,root,root) %{_libdir}/%{name}/librtas2hpi.* %endif ################################################### %if 0%{?with_simulator} %files simulator ################################################### %defattr(-,root,root) %{_libdir}/%{name}/libsimulator.* %endif ################################################### %if 0%{?with_bladecenter} %files bladecenter ################################################### %defattr(-,root,root) %{_libdir}/%{name}/libsnmp_bc.* %endif ################################################### %if 0%{?with_sysfs} %files sysfs ################################################### %defattr(-,root,root) %{_libdir}/%{name}/libsysfs2hpi.* %endif ################################################### %if 0%{?with_watchdog} %files watchdog ################################################### %defattr(-,root,root) %{_libdir}/%{name}/libwatchdog.* %endif ################################################### %if 0%{?with_ilo2_ribcl} %files ilo2_ribcl ################################################### %defattr(-,root,root) %{_libdir}/%{name}/libilo2_ribcl.* %endif ################################################### %if 0%{?with_oa_soap} %files oa_soap ################################################### %defattr(-,root,root) %{_libdir}/%{name}/liboa_soap.* %endif openhpi-2.14.1/README0000644000076400007640000000754311302567132011062 0ustar This is an implementation of the Service Availability Forum's Hardware Platform Interface B.03.01 specification. The following components are supported: * OpenHPI base library * OpenHPI utility library * OpenHPI Daemon * Simulator Plugin * SNMP BladeCenter/RSA Plugin * IPMI Plugin * IMPI Direct Plugin * iLO2 RIBCL Plug-in * SOAP/XML BladeSystem c-Class Plugin * HPI Clients Feedback, as always, is welcome and encouraged: openhpi-devel@lists.sourceforge.net --------------------------------------------------------- PREREQUISITES --------------------------------------------------------- The following software is required to build openhpi autoconf >= 2.57 automake >= 1.8 gcc >= 3.2.0 uuid.h (may be found in e2fsprogs-devel or uuid-dev) glib2 >= 2.2 pkgconfig (may be called pkg-config depending on distro) The follow libraries are needed to build certain plugins ipmi plugin OpenIPMI >= 1.4.20 (http://openipmi.sf.net) sysfs plugin libsysfs =< 1.3 snmp_bc plugin net-snmp >= 5.07 oa_soap plugin libssl >= 0.9.7 libxml2 --------------------------------------------------------- BUILD / INSTALLATION --------------------------------------------------------- FOR RELEASED TARBALLS Use standard UNIX mechanisms: ./configure && make && make install Note: by default all plugins that *can* be built, will be built, all other plugins will be silently disabled. If you wish to disable a plugin, any flags you pass to configure will be passed to the configure program. ("./configure --help" for more info on the options) i.e. ./configure --disable-simulator will disable the simulator plugin Note that for a production-type installation you will want to pass the following options at the least: ./configure --prefix=/usr --sysconfdir=/etc --with-varpath=/var/lib/openhpi then make (or make rpm, but you will need to be root on some distros.) and then (as root or with proper system install permissions) make install (or install from the rpm). It will install the openhpi library, enabled plug-ins and sample applications that uses the library and plug-ins. NOTE: Modify the configuration file, openhpi.conf, for your needs. This will be in ${sysconfdir}/openhpi/openhpi.conf, where $sysconfdir is ${prefix}/etc by default (and ${prefix} is /usr/local by default) unless you set $sysconfdir when you ran ./configure as shown above. FOR SUBVERSION EXTRACTS svn co https://svn.sourceforge.net/svnroot/openhpi/openhpi/trunk openhpi First time after extracting the code: run ./bootstrap This will generate the configure script and all files needed by it. Then, use the instructions provided for RELEASED TARBALLS --------------------------------------------------------- CLEANUP --------------------------------------------------------- To remove the temporary build files, type: make clean If you are a maintainer, and need to remove all autogenerated files, type: make clean make maintainer-clean (will neeed to run bootstrap and configure again after that) --------------------------------------------------------- Active Plug-ins --------------------------------------------------------- simulator - plugin for use in testing ipmi - OpenIPMI based plugin ipmidirect - IPMI plugin that talks to device driver directly snmp_bc - IBM BladeCenter/RSA plugin (uses snmp) watchdog - Linux watchdog device interface sysfs - Linux sysfs plugin (LM sensors and I2C devices exported in sysfs requires kernel 2.6 or >= 2.5.72) ilo2_ribcl - HP ProLiant Rack Mount Server plug-in oa_soap - HP BladeSystem c-Class plugin For information on recent changes, see the changelogs at http://openhpi.sf.net --------------------------------------------------------- FOR MORE INFO --------------------------------------------------------- For more information please see the project webiste at http://openhpi.sourceforge.net Also visit SAForum's website at http://www.saforum.org openhpi-2.14.1/acinclude.m40000644000076400007640000001557611302567132012400 0ustar ################################################## # # OpenHPI Macros # # Copyright (C) IBM Corp 2003-2006 # # Author(s): # Sean Dague # Renier Morales # # This file is licensed under the same terms as OpenHPI itself. # See the COPYING file in the top level of OpenHPI for more info. # # This is a set of common macros to be used by the top # level configure.in. # ################################################## AC_DEFUN([OH_SET_SIZES], [ if test "x$cross_compiling" != "xno"; then if test "x$OH_SIZEOF_UCHAR" = x; then OH_SIZEOF_UCHAR=$ac_cv_sizeof_uchar fi if test "x$OH_SIZEOF_USHORT" = x; then OH_SIZEOF_USHORT=$ac_cv_sizeof_ushort fi if test "x$OH_SIZEOF_UINT" = x; then OH_SIZEOF_UINT=$ac_cv_sizeof_uint fi if test "x$OH_SIZEOF_CHAR" = x; then OH_SIZEOF_CHAR=$ac_cv_sizeof_char fi if test "x$OH_SIZEOF_SHORT" = x; then OH_SIZEOF_SHORT=$ac_cv_sizeof_short fi if test "x$OH_SIZEOF_INT" = x; then OH_SIZEOF_INT=$ac_cv_sizeof_int fi if test "x$OH_SIZEOF_LLONG" = x; then OH_SIZEOF_LLONG=$ac_cv_sizeof_longlong fi if test "x$OH_SIZEOF_FLOAT" = x; then OH_SIZEOF_FLOAT=$ac_cv_sizeof_float fi if test "x$OH_SIZEOF_DOUBLE" = x; then OH_SIZEOF_DOUBLE=$ac_cv_sizeof_double fi else OH_SSFILE=testsize OH_SSSOURCE="$OH_SSFILE.c" echo "#include " > $OH_SSSOURCE echo "#include " >> $OH_SSSOURCE echo "int main() {" >> $OH_SSSOURCE # add more here if you need them # the lots of slashes are needed to do the processing below right echo "printf(\"unsigned char %d\\\\n\",sizeof(unsigned char));" >> $OH_SSSOURCE echo "printf(\"unsigned short %d\\\\n\",sizeof(unsigned short));" >> $OH_SSSOURCE echo "printf(\"unsigned int %d\\\\n\",sizeof(unsigned int));" >> $OH_SSSOURCE echo "printf(\"char %d\\\\n\",sizeof(char));" >> $OH_SSSOURCE echo "printf(\"short %d\\\\n\",sizeof(short));" >> $OH_SSSOURCE echo "printf(\"int %d\\\\n\",sizeof(int));" >> $OH_SSSOURCE echo "printf(\"long long %d\\\\n\",sizeof(long long));" >> $OH_SSSOURCE echo "printf(\"float %d\\\\n\",sizeof(float));" >> $OH_SSSOURCE echo "printf(\"double %d\\\\n\",sizeof(double));" >> $OH_SSSOURCE echo "return 0;" >> $OH_SSSOURCE echo "}" >> $OH_SSSOURCE $CC -o $OH_SSFILE $OH_SSSOURCE OH_TYPE_SIZES=`./$OH_SSFILE` # feel free to define more logic here if we need it OH_SIZEOF_UCHAR=`echo -e $OH_TYPE_SIZES | grep "^unsigned char" | awk '{print $[3]}'` OH_SIZEOF_USHORT=`echo -e $OH_TYPE_SIZES | grep "^unsigned short" | awk '{print $[3]}'` OH_SIZEOF_UINT=`echo -e $OH_TYPE_SIZES | grep "^unsigned int" | awk '{print $[3]}'` OH_SIZEOF_CHAR=`echo -e $OH_TYPE_SIZES | grep "^char" | awk '{print $[2]}'` OH_SIZEOF_SHORT=`echo -e $OH_TYPE_SIZES | grep "^short" | awk '{print $[2]}'` OH_SIZEOF_INT=`echo -e $OH_TYPE_SIZES | grep "^int" | awk '{print $[2]}'` OH_SIZEOF_LLONG=`echo -e $OH_TYPE_SIZES | grep "^long long" | awk '{print $[3]}'` OH_SIZEOF_FLOAT=`echo -e $OH_TYPE_SIZES | grep "^float" | awk '{print $[2]}'` OH_SIZEOF_DOUBLE=`echo -e $OH_TYPE_SIZES | grep "^double" | awk '{print $[2]}'` rm -f $OH_SSFILE $OH_SSSOURCE fi ]) # # OH_CHECK_FAIL($LIBNAME,$PACKAGE_SUGGEST,$URL,$EXTRA) # AC_DEFUN([OH_CHECK_FAIL], [ OH_MSG=`echo -e "- $1 not found!\n"` if test "x" != "x$4"; then OH_MSG=`echo -e "$OH_MSG\n- $4"` fi if test "x$2" != "x"; then OH_MSG=`echo -e "$OH_MSG\n- Try installing the $2 package\n"` fi if test "x$3" != "x"; then OH_MSG=`echo -e "$OH_MSG\n- or get the latest software from $3\n"` fi AC_MSG_ERROR( ! ************************************************************ $OH_MSG ************************************************************ ) ] ) # # gcc version check. # AC_DEFUN([OH_CHECK_GCC], [ GCCVERSIONOK=`gcc -dumpversion | \ sed 's/\./ /g' | \ awk '{ \ if ( $[1] > $1) { \ print "OK"; \ } \ if ( $[1] == $1 ) { \ if( $[2] > $2 ) { \ print "OK"; \ } \ if( $[2] == $2 ) { \ if( $[3] >= $3 ) { \ print "OK"; \ } \ } \ } \ }'` \ if test "$GCCVERSIONOK" == "OK"; then AC_MSG_RESULT(yes) else OH_CHECK_FAIL(gcc >= $1.$2.$3 is required to build OpenHPI) fi ]) # it is worth noting that we have to strip # optimization from the cflags for net-snmp # hopefully they'll fix that bug in the future AC_DEFUN([OH_CHECK_NETSNMP], [ AC_MSG_CHECKING(for net-snmp) AC_TRY_LINK( [ #include #include ], [ struct snmp_session session ], [ have_netsnmp=yes SNMPFLAGS=`net-snmp-config --cflags | perl -p -e 's/-O\S*//g'` SNMPLIBS=`net-snmp-config --libs` AC_MSG_RESULT(yes) ], [AC_MSG_RESULT(no. No SNMP based plugins can be built!)]) ]) AC_DEFUN([OH_CHECK_OPENIPMI], [ AC_MSG_CHECKING(for OpenIPMI) OH_OI_FILE=ipmi_ver OH_OI_SRC="ipmi_ver.c" echo "#include " > $OH_OI_SRC echo "#include " >> $OH_OI_SRC echo "int main() {" >> $OH_OI_SRC echo "printf(\"%d.%d.%d\", OPENIPMI_VERSION_MAJOR, \ OPENIPMI_VERSION_MINOR, \ OPENIPMI_VERSION_RELEASE);" >> $OH_OI_SRC echo "return 0;}" >> $OH_OI_SRC gcc -o $OH_OI_FILE $CFLAGS $CPPFLAGS $LDFLAGS $OH_OI_SRC >& /dev/null if test -f "ipmi_ver"; then OPENIPMI_VERSION=`./ipmi_ver | \ awk -F. '{ \ if ( $[1] == $1 ) { \ if ( $[2] == $2 ) { \ if ( $[3] >= $3 ) { \ print "OK"; \ } \ } } }'` fi if test "$OPENIPMI_VERSION" == "OK"; then have_openipmi=yes AC_MSG_RESULT(yes) else AC_MSG_RESULT(no...OpenIPMI missing or wrong version IPMI plug-in can't build) have_openipmi=no fi rm -rf $OH_OI_FILE $OH_OI_SRC ]) AC_DEFUN([PKG_CFG_SETPATH], [ if test -f "/etc/ld.so.conf"; then TEMP=`cat /etc/ld.so.conf | grep "/lib$"` TEMP=`echo $TEMP | sed -e 's/\/lib \|\/lib$/\/lib\/pkgconfig:/g'` PKG_CONFIG_PATH="${PKG_CONFIG_PATH}:${TEMP}" fi ]) AC_DEFUN([OH_CHECK_RTAS], [ AC_MSG_CHECKING(for RTAS libary) AC_TRY_COMPILE( [ #include #include ], [ rtas_activate_firmware(); ], [ if test -f "/usr/bin/lsvpd"; then have_rtas_lib=yes AC_MSG_RESULT(yes) else AC_MSG_RESULT(no) fi ], [AC_MSG_RESULT(no)] )]) openhpi-2.14.1/utils/0000755000076400007640000000000011405006365011331 5ustar openhpi-2.14.1/utils/Makefile.am0000644000076400007640000000570411302567131013372 0ustar # # Copyright (c) 2003 Intel Corporation # (C) Copyright IBM Corp 2003, 2004 # All rights reserved. # # 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. # # Neither the name of Intel Corporation nor the names # of its contributors may be used to endorse or promote products # derived from this software without specific prior written permission. # # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS # "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT # LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS # FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT # OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, # SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED # TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, # OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY # OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING # NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS # SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. MAINTAINERCLEANFILES = Makefile.in GENERATED_HEADER_FILES = \ sahpi_enum_utils.h \ sahpiatca_enum_utils.h \ sahpi_event_encode.h GENERATED_SRC_FILES = \ sahpi_enum_utils.c \ sahpiatca_enum_utils.c \ sahpi_event_encode.c GENERATED_FILES = $(GENERATED_HEADER_FILES) $(GENERATED_SRC_FILES) EXTRA_DIST = \ $(GENERATED_HEADER_FILES) \ announcement_utils.h \ el_utils.h \ epath_utils.h \ oh_utils.h \ rpt_utils.h \ sahpi_event_utils.h \ sahpi_struct_utils.h \ sahpi_time_utils.h \ uid_utils.h MOSTLYCLEANFILES = @TEST_CLEAN@ # FIXME:: Add when we can auto-generate files for SMP systems # MOSTLYCLEANFILES += $(GENERATED_FILES) INCLUDES = @OPENHPI_INCLUDES@ SUBDIRS = t DIST_SUBDIRS = t pkgconfigdir = $(libdir)/pkgconfig pkgconfig_DATA = openhpiutils.pc lib_LTLIBRARIES = libopenhpiutils.la # Generated files (e.g.sahpi_enum_utils.c) must be listed first libopenhpiutils_la_SOURCES = \ $(GENERATED_SRC_FILES) \ announcement_utils.c \ el_utils.c \ epath_utils.c \ rpt_utils.c \ sahpi_event_utils.c \ sahpi_struct_utils.c \ sahpi_time_utils.c \ uid_utils.c libopenhpiutils_la_LDFLAGS = -version-info @HPI_LIB_VERSION@ libopenhpiutils_la_LIBADD = -luuid # FIXME:: Add when we can auto-generate files for SMP systems #$(GENERATED_FILES): $(top_srcdir)/include/SaHpi.h $(top_srcdir)/scripts/SaHpi2code.pl # $(top_srcdir)/scripts/SaHpi2code.pl -ifile $(top_srcdir)/include/SaHpi.h openhpi-2.14.1/utils/rpt_utils.h0000644000076400007640000000631511302567131013533 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2003, 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Renier Morales */ #ifndef __RPT_UTILS_H #define __RPT_UTILS_H #ifndef __OH_UTILS_H #warning *** Include oh_utils.h instead of individual utility header files *** #endif #include #include /* oh_add_resource/rdr free-data flag */ #define FREE_RPT_DATA SAHPI_FALSE #define KEEP_RPT_DATA SAHPI_TRUE #ifdef __cplusplus extern "C" { #endif typedef struct { SaHpiUint32T update_count; SaHpiTimeT update_timestamp; /* The structure to hold this is subject to change. */ /* No one should touch this. */ GSList *rptlist; /* Contains RPTEntrys for sequence lookups */ GHashTable *rptable; /* Contains RPTEntrys for fast EntryId lookups */ } RPTable; /* General RPT calls */ SaErrorT oh_init_rpt(RPTable *table); SaErrorT oh_flush_rpt(RPTable *table); SaErrorT rpt_diff(RPTable *cur_rpt, RPTable *new_rpt, GSList **res_new, GSList **rdr_new, GSList **res_gone, GSList **rdr_gone); SaErrorT oh_get_rpt_info(RPTable *table, SaHpiUint32T *update_count, SaHpiTimeT *update_timestamp); /* Resource calls */ SaErrorT oh_add_resource(RPTable *table, SaHpiRptEntryT *entry, void *data, int owndata); SaErrorT oh_remove_resource(RPTable *table, SaHpiResourceIdT rid); void *oh_get_resource_data(RPTable *table, SaHpiResourceIdT rid); SaHpiRptEntryT *oh_get_resource_by_id(RPTable *table, SaHpiResourceIdT rid); SaHpiRptEntryT *oh_get_resource_by_ep(RPTable *table, SaHpiEntityPathT *ep); SaHpiRptEntryT *oh_get_resource_next(RPTable *table, SaHpiResourceIdT rid_prev); /* RDR calls */ SaErrorT oh_add_rdr(RPTable *table, SaHpiResourceIdT rid, SaHpiRdrT *rdr, void *data, int owndata); SaErrorT oh_remove_rdr(RPTable *table, SaHpiResourceIdT rid, SaHpiEntryIdT rdrid); void *oh_get_rdr_data(RPTable *table, SaHpiResourceIdT rid, SaHpiEntryIdT rdrid); SaHpiRdrT *oh_get_rdr_by_id(RPTable *table, SaHpiResourceIdT rid, SaHpiEntryIdT rdrid); SaHpiRdrT *oh_get_rdr_by_type(RPTable *table, SaHpiResourceIdT rid, SaHpiRdrTypeT type, SaHpiInstrumentIdT num); SaHpiRdrT *oh_get_rdr_next(RPTable *table, SaHpiResourceIdT rid, SaHpiEntryIdT rdrid_prev); SaHpiRdrT *oh_get_rdr_by_type_first(RPTable *table, SaHpiResourceIdT rid, SaHpiRdrTypeT type); SaHpiRdrT *oh_get_rdr_by_type_next(RPTable *table, SaHpiResourceIdT rid, SaHpiRdrTypeT type, SaHpiInstrumentIdT num); SaHpiUint32T oh_get_rdr_uid(SaHpiRdrTypeT type, SaHpiInstrumentIdT num); SaHpiInstrumentIdT oh_get_rdr_num(SaHpiEntryIdT rdrid); #ifdef __cplusplus } #endif #endif openhpi-2.14.1/utils/sahpiatca_enum_utils.c0000644000076400007640000002472611302567131015710 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * Steve Sherman */ /******************************************************************* * WARNING! This file is auto-magically generated by: * ./SaHpi2code.pl. * Do not change this file manually. Update script instead *******************************************************************/ #include #include #include /** * oh_lookup_atcahpiledcolor: * @value: enum value of type AtcaHpiLedColorT. * * Converts @value into a string based on @value's HPI enum definition. * * Returns: * string - normal operation. * NULL - if @value not a valid AtcaHpiLedColorT. **/ char * oh_lookup_atcahpiledcolor(AtcaHpiLedColorT value) { switch (value) { case ATCAHPI_LED_COLOR_RESERVED: return "COLOR_RESERVED"; case ATCAHPI_LED_COLOR_BLUE: return "COLOR_BLUE"; case ATCAHPI_LED_COLOR_RED: return "COLOR_RED"; case ATCAHPI_LED_COLOR_GREEN: return "COLOR_GREEN"; case ATCAHPI_LED_COLOR_AMBER: return "COLOR_AMBER"; case ATCAHPI_LED_COLOR_ORANGE: return "COLOR_ORANGE"; case ATCAHPI_LED_COLOR_WHITE: return "COLOR_WHITE"; case ATCAHPI_LED_COLOR_NO_CHANGE: return "COLOR_NO_CHANGE"; case ATCAHPI_LED_COLOR_USE_DEFAULT: return "COLOR_USE_DEFAULT"; default: return NULL; } } struct oh_atcahpiledcolor_map atcahpiledcolor_strings[] = { {ATCAHPI_LED_COLOR_RESERVED, "COLOR_RESERVED"}, {ATCAHPI_LED_COLOR_BLUE, "COLOR_BLUE"}, {ATCAHPI_LED_COLOR_RED, "COLOR_RED"}, {ATCAHPI_LED_COLOR_GREEN, "COLOR_GREEN"}, {ATCAHPI_LED_COLOR_AMBER, "COLOR_AMBER"}, {ATCAHPI_LED_COLOR_ORANGE, "COLOR_ORANGE"}, {ATCAHPI_LED_COLOR_WHITE, "COLOR_WHITE"}, {ATCAHPI_LED_COLOR_NO_CHANGE, "COLOR_NO_CHANGE"}, {ATCAHPI_LED_COLOR_USE_DEFAULT, "COLOR_USE_DEFAULT"}, }; /** * oh_encode_atcahpiledcolor: * @buffer: Pointer to SaHpiTextBufferT that contains enum's string representation. * @type: Location (of AtcaHpiLedColorT) to place encoded result. * * Converts a @buffer->Data string, generated by oh_lookup_atcahpiledcolor(), back * into an AtcaHpiLedColorT type. * * Returns: * AtcaHpiLedColorT value - normal operation. * SA_ERR_HPI_INVALID_PARAMS - if @buffer or @type is NULL or @buffer->Data empty. * SA_ERR_HPI_INVALID_DATA - if @buffer->Data is invalid. **/ SaErrorT oh_encode_atcahpiledcolor(SaHpiTextBufferT *buffer, AtcaHpiLedColorT *type) { int i, found; if (!buffer || !type || buffer->Data == NULL || buffer->Data[0] == '\0') { return(SA_ERR_HPI_INVALID_PARAMS); } found = 0; for (i=0; iData, atcahpiledcolor_strings[i].str) == 0) { found++; break; } } if (found) { *type = atcahpiledcolor_strings[i].entity_type; } else { return(SA_ERR_HPI_INVALID_DATA); } return(SA_OK); } /** * oh_lookup_atcahpiresourceledmode: * @value: enum value of type AtcaHpiResourceLedModeT. * * Converts @value into a string based on @value's HPI enum definition. * * Returns: * string - normal operation. * NULL - if @value not a valid AtcaHpiResourceLedModeT. **/ char * oh_lookup_atcahpiresourceledmode(AtcaHpiResourceLedModeT value) { switch (value) { case ATCAHPI_LED_AUTO: return "AUTO"; case ATCAHPI_LED_MANUAL: return "MANUAL"; case ATCAHPI_LED_LAMP_TEST: return "LAMP_TEST"; default: return NULL; } } struct oh_atcahpiresourceledmode_map atcahpiresourceledmode_strings[] = { {ATCAHPI_LED_AUTO, "AUTO"}, {ATCAHPI_LED_MANUAL, "MANUAL"}, {ATCAHPI_LED_LAMP_TEST, "LAMP_TEST"}, }; /** * oh_encode_atcahpiresourceledmode: * @buffer: Pointer to SaHpiTextBufferT that contains enum's string representation. * @type: Location (of AtcaHpiResourceLedModeT) to place encoded result. * * Converts a @buffer->Data string, generated by oh_lookup_atcahpiresourceledmode(), back * into an AtcaHpiResourceLedModeT type. * * Returns: * AtcaHpiResourceLedModeT value - normal operation. * SA_ERR_HPI_INVALID_PARAMS - if @buffer or @type is NULL or @buffer->Data empty. * SA_ERR_HPI_INVALID_DATA - if @buffer->Data is invalid. **/ SaErrorT oh_encode_atcahpiresourceledmode(SaHpiTextBufferT *buffer, AtcaHpiResourceLedModeT *type) { int i, found; if (!buffer || !type || buffer->Data == NULL || buffer->Data[0] == '\0') { return(SA_ERR_HPI_INVALID_PARAMS); } found = 0; for (i=0; iData, atcahpiresourceledmode_strings[i].str) == 0) { found++; break; } } if (found) { *type = atcahpiresourceledmode_strings[i].entity_type; } else { return(SA_ERR_HPI_INVALID_DATA); } return(SA_OK); } /** * oh_lookup_atcahpiledbrsupport: * @value: enum value of type AtcaHpiLedBrSupportT. * * Converts @value into a string based on @value's HPI enum definition. * * Returns: * string - normal operation. * NULL - if @value not a valid AtcaHpiLedBrSupportT. **/ char * oh_lookup_atcahpiledbrsupport(AtcaHpiLedBrSupportT value) { switch (value) { case ATCAHPI_LED_BR_SUPPORTED: return "BR_SUPPORTED"; case ATCAHPI_LED_BR_NOT_SUPPORTED: return "BR_NOT_SUPPORTED"; case ATCAHPI_LED_BR_UNKNOWN: return "BR_UNKNOWN"; default: return NULL; } } struct oh_atcahpiledbrsupport_map atcahpiledbrsupport_strings[] = { {ATCAHPI_LED_BR_SUPPORTED, "BR_SUPPORTED"}, {ATCAHPI_LED_BR_NOT_SUPPORTED, "BR_NOT_SUPPORTED"}, {ATCAHPI_LED_BR_UNKNOWN, "BR_UNKNOWN"}, }; /** * oh_encode_atcahpiledbrsupport: * @buffer: Pointer to SaHpiTextBufferT that contains enum's string representation. * @type: Location (of AtcaHpiLedBrSupportT) to place encoded result. * * Converts a @buffer->Data string, generated by oh_lookup_atcahpiledbrsupport(), back * into an AtcaHpiLedBrSupportT type. * * Returns: * AtcaHpiLedBrSupportT value - normal operation. * SA_ERR_HPI_INVALID_PARAMS - if @buffer or @type is NULL or @buffer->Data empty. * SA_ERR_HPI_INVALID_DATA - if @buffer->Data is invalid. **/ SaErrorT oh_encode_atcahpiledbrsupport(SaHpiTextBufferT *buffer, AtcaHpiLedBrSupportT *type) { int i, found; if (!buffer || !type || buffer->Data == NULL || buffer->Data[0] == '\0') { return(SA_ERR_HPI_INVALID_PARAMS); } found = 0; for (i=0; iData, atcahpiledbrsupport_strings[i].str) == 0) { found++; break; } } if (found) { *type = atcahpiledbrsupport_strings[i].entity_type; } else { return(SA_ERR_HPI_INVALID_DATA); } return(SA_OK); } /** * oh_lookup_atcahpientitytype: * @value: enum value of type AtcaHpiEntityTypeT. * * Converts @value into a string based on @value's HPI enum definition. * * Returns: * string - normal operation. * NULL - if @value not a valid AtcaHpiEntityTypeT. **/ char * oh_lookup_atcahpientitytype(AtcaHpiEntityTypeT value) { switch (value) { case ATCAHPI_ENT_POWER_ENTRY_MODULE_SLOT: return "POWER_ENTRY_MODULE_SLOT"; case ATCAHPI_ENT_SHELF_FRU_DEVICE_SLOT: return "SHELF_FRU_DEVICE_SLOT"; case ATCAHPI_ENT_SHELF_MANAGER_SLOT: return "SHELF_MANAGER_SLOT"; case ATCAHPI_ENT_FAN_TRAY_SLOT: return "FAN_TRAY_SLOT"; case ATCAHPI_ENT_FAN_FILTER_TRAY_SLOT: return "FAN_FILTER_TRAY_SLOT"; case ATCAHPI_ENT_ALARM_SLOT: return "ALARM_SLOT"; case ATCAHPI_ENT_AMC_SLOT: return "AMC_SLOT"; case ATCAHPI_ENT_PMC_SLOT: return "PMC_SLOT"; case ATCAHPI_ENT_RTM_SLOT: return "RTM_SLOT"; case ATCAHPI_ENT_PICMG_FRONT_BLADE: return "PICMG_FRONT_BLADE"; case ATCAHPI_ENT_SHELF_FRU_DEVICE: return "SHELF_FRU_DEVICE"; case ATCAHPI_ENT_FILTRATION_UNIT: return "FILTRATION_UNIT"; case ATCAHPI_ENT_AMC: return "AMC"; default: return NULL; } } struct oh_atcahpientitytype_map atcahpientitytype_strings[] = { {ATCAHPI_ENT_POWER_ENTRY_MODULE_SLOT, "POWER_ENTRY_MODULE_SLOT"}, {ATCAHPI_ENT_SHELF_FRU_DEVICE_SLOT, "SHELF_FRU_DEVICE_SLOT"}, {ATCAHPI_ENT_SHELF_MANAGER_SLOT, "SHELF_MANAGER_SLOT"}, {ATCAHPI_ENT_FAN_TRAY_SLOT, "FAN_TRAY_SLOT"}, {ATCAHPI_ENT_FAN_FILTER_TRAY_SLOT, "FAN_FILTER_TRAY_SLOT"}, {ATCAHPI_ENT_ALARM_SLOT, "ALARM_SLOT"}, {ATCAHPI_ENT_AMC_SLOT, "AMC_SLOT"}, {ATCAHPI_ENT_PMC_SLOT, "PMC_SLOT"}, {ATCAHPI_ENT_RTM_SLOT, "RTM_SLOT"}, {ATCAHPI_ENT_PICMG_FRONT_BLADE, "PICMG_FRONT_BLADE"}, {ATCAHPI_ENT_SHELF_FRU_DEVICE, "SHELF_FRU_DEVICE"}, {ATCAHPI_ENT_FILTRATION_UNIT, "FILTRATION_UNIT"}, {ATCAHPI_ENT_AMC, "AMC"}, }; /** * oh_encode_atcahpientitytype: * @buffer: Pointer to SaHpiTextBufferT that contains enum's string representation. * @type: Location (of AtcaHpiEntityTypeT) to place encoded result. * * Converts a @buffer->Data string, generated by oh_lookup_atcahpientitytype(), back * into an AtcaHpiEntityTypeT type. * * Returns: * AtcaHpiEntityTypeT value - normal operation. * SA_ERR_HPI_INVALID_PARAMS - if @buffer or @type is NULL or @buffer->Data empty. * SA_ERR_HPI_INVALID_DATA - if @buffer->Data is invalid. **/ SaErrorT oh_encode_atcahpientitytype(SaHpiTextBufferT *buffer, AtcaHpiEntityTypeT *type) { int i, found; if (!buffer || !type || buffer->Data == NULL || buffer->Data[0] == '\0') { return(SA_ERR_HPI_INVALID_PARAMS); } found = 0; for (i=0; iData, atcahpientitytype_strings[i].str) == 0) { found++; break; } } if (found) { *type = atcahpientitytype_strings[i].entity_type; } else { return(SA_ERR_HPI_INVALID_DATA); } return(SA_OK); } openhpi-2.14.1/utils/oh_utils.h0000644000076400007640000000164411302567131013334 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * Renier Morales * Steve Sherman */ #ifndef __OH_UTILS_H #define __OH_UTILS_H /* Order is important */ #include #include #include #include #include #include #include #include #include #include #include #include #endif openhpi-2.14.1/utils/sahpi_enum_utils.h0000644000076400007640000003365011302567131015060 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * Steve Sherman */ /******************************************************************* * WARNING! This file is auto-magically generated by: * ./SaHpi2code.pl. * Do not change this file manually. Update script instead *******************************************************************/ #ifndef __SAHPI_ENUM_UTILS_H #define __SAHPI_ENUM_UTILS_H #ifndef __OH_UTILS_H #warning *** Include oh_utils.h instead of individual utility header files *** #endif #ifdef __cplusplus extern "C" { #endif #define OH_MAX_LANGUAGE 137 extern struct oh_language_map { SaHpiLanguageT entity_type; char *str; } language_strings[OH_MAX_LANGUAGE]; char * oh_lookup_language(SaHpiLanguageT value); SaErrorT oh_encode_language(SaHpiTextBufferT *buffer, SaHpiLanguageT *type); #define OH_MAX_TEXTTYPE 5 extern struct oh_texttype_map { SaHpiTextTypeT entity_type; char *str; } texttype_strings[OH_MAX_TEXTTYPE]; char * oh_lookup_texttype(SaHpiTextTypeT value); SaErrorT oh_encode_texttype(SaHpiTextBufferT *buffer, SaHpiTextTypeT *type); #define OH_MAX_ENTITYTYPE 67 extern struct oh_entitytype_map { SaHpiEntityTypeT entity_type; char *str; } entitytype_strings[OH_MAX_ENTITYTYPE]; char * oh_lookup_entitytype(SaHpiEntityTypeT value); SaErrorT oh_encode_entitytype(SaHpiTextBufferT *buffer, SaHpiEntityTypeT *type); #define OH_MAX_SENSORTYPE 47 extern struct oh_sensortype_map { SaHpiSensorTypeT entity_type; char *str; } sensortype_strings[OH_MAX_SENSORTYPE]; char * oh_lookup_sensortype(SaHpiSensorTypeT value); SaErrorT oh_encode_sensortype(SaHpiTextBufferT *buffer, SaHpiSensorTypeT *type); #define OH_MAX_SENSORREADINGTYPE 4 extern struct oh_sensorreadingtype_map { SaHpiSensorReadingTypeT entity_type; char *str; } sensorreadingtype_strings[OH_MAX_SENSORREADINGTYPE]; char * oh_lookup_sensorreadingtype(SaHpiSensorReadingTypeT value); SaErrorT oh_encode_sensorreadingtype(SaHpiTextBufferT *buffer, SaHpiSensorReadingTypeT *type); #define OH_MAX_SENSOREVENTMASKACTION 2 extern struct oh_sensoreventmaskaction_map { SaHpiSensorEventMaskActionT entity_type; char *str; } sensoreventmaskaction_strings[OH_MAX_SENSOREVENTMASKACTION]; char * oh_lookup_sensoreventmaskaction(SaHpiSensorEventMaskActionT value); SaErrorT oh_encode_sensoreventmaskaction(SaHpiTextBufferT *buffer, SaHpiSensorEventMaskActionT *type); #define OH_MAX_SENSORUNITS 91 extern struct oh_sensorunits_map { SaHpiSensorUnitsT entity_type; char *str; } sensorunits_strings[OH_MAX_SENSORUNITS]; char * oh_lookup_sensorunits(SaHpiSensorUnitsT value); SaErrorT oh_encode_sensorunits(SaHpiTextBufferT *buffer, SaHpiSensorUnitsT *type); #define OH_MAX_SENSORMODUNITUSE 3 extern struct oh_sensormodunituse_map { SaHpiSensorModUnitUseT entity_type; char *str; } sensormodunituse_strings[OH_MAX_SENSORMODUNITUSE]; char * oh_lookup_sensormodunituse(SaHpiSensorModUnitUseT value); SaErrorT oh_encode_sensormodunituse(SaHpiTextBufferT *buffer, SaHpiSensorModUnitUseT *type); #define OH_MAX_SENSOREVENTCTRL 3 extern struct oh_sensoreventctrl_map { SaHpiSensorEventCtrlT entity_type; char *str; } sensoreventctrl_strings[OH_MAX_SENSOREVENTCTRL]; char * oh_lookup_sensoreventctrl(SaHpiSensorEventCtrlT value); SaErrorT oh_encode_sensoreventctrl(SaHpiTextBufferT *buffer, SaHpiSensorEventCtrlT *type); #define OH_MAX_CTRLTYPE 6 extern struct oh_ctrltype_map { SaHpiCtrlTypeT entity_type; char *str; } ctrltype_strings[OH_MAX_CTRLTYPE]; char * oh_lookup_ctrltype(SaHpiCtrlTypeT value); SaErrorT oh_encode_ctrltype(SaHpiTextBufferT *buffer, SaHpiCtrlTypeT *type); #define OH_MAX_CTRLSTATEDIGITAL 4 extern struct oh_ctrlstatedigital_map { SaHpiCtrlStateDigitalT entity_type; char *str; } ctrlstatedigital_strings[OH_MAX_CTRLSTATEDIGITAL]; char * oh_lookup_ctrlstatedigital(SaHpiCtrlStateDigitalT value); SaErrorT oh_encode_ctrlstatedigital(SaHpiTextBufferT *buffer, SaHpiCtrlStateDigitalT *type); #define OH_MAX_CTRLMODE 2 extern struct oh_ctrlmode_map { SaHpiCtrlModeT entity_type; char *str; } ctrlmode_strings[OH_MAX_CTRLMODE]; char * oh_lookup_ctrlmode(SaHpiCtrlModeT value); SaErrorT oh_encode_ctrlmode(SaHpiTextBufferT *buffer, SaHpiCtrlModeT *type); #define OH_MAX_CTRLOUTPUTTYPE 11 extern struct oh_ctrloutputtype_map { SaHpiCtrlOutputTypeT entity_type; char *str; } ctrloutputtype_strings[OH_MAX_CTRLOUTPUTTYPE]; char * oh_lookup_ctrloutputtype(SaHpiCtrlOutputTypeT value); SaErrorT oh_encode_ctrloutputtype(SaHpiTextBufferT *buffer, SaHpiCtrlOutputTypeT *type); #define OH_MAX_IDRAREATYPE 6 extern struct oh_idrareatype_map { SaHpiIdrAreaTypeT entity_type; char *str; } idrareatype_strings[OH_MAX_IDRAREATYPE]; char * oh_lookup_idrareatype(SaHpiIdrAreaTypeT value); SaErrorT oh_encode_idrareatype(SaHpiTextBufferT *buffer, SaHpiIdrAreaTypeT *type); #define OH_MAX_IDRFIELDTYPE 11 extern struct oh_idrfieldtype_map { SaHpiIdrFieldTypeT entity_type; char *str; } idrfieldtype_strings[OH_MAX_IDRFIELDTYPE]; char * oh_lookup_idrfieldtype(SaHpiIdrFieldTypeT value); SaErrorT oh_encode_idrfieldtype(SaHpiTextBufferT *buffer, SaHpiIdrFieldTypeT *type); #define OH_MAX_WATCHDOGACTION 4 extern struct oh_watchdogaction_map { SaHpiWatchdogActionT entity_type; char *str; } watchdogaction_strings[OH_MAX_WATCHDOGACTION]; char * oh_lookup_watchdogaction(SaHpiWatchdogActionT value); SaErrorT oh_encode_watchdogaction(SaHpiTextBufferT *buffer, SaHpiWatchdogActionT *type); #define OH_MAX_WATCHDOGACTIONEVENT 5 extern struct oh_watchdogactionevent_map { SaHpiWatchdogActionEventT entity_type; char *str; } watchdogactionevent_strings[OH_MAX_WATCHDOGACTIONEVENT]; char * oh_lookup_watchdogactionevent(SaHpiWatchdogActionEventT value); SaErrorT oh_encode_watchdogactionevent(SaHpiTextBufferT *buffer, SaHpiWatchdogActionEventT *type); #define OH_MAX_WATCHDOGPRETIMERINTERRUPT 5 extern struct oh_watchdogpretimerinterrupt_map { SaHpiWatchdogPretimerInterruptT entity_type; char *str; } watchdogpretimerinterrupt_strings[OH_MAX_WATCHDOGPRETIMERINTERRUPT]; char * oh_lookup_watchdogpretimerinterrupt(SaHpiWatchdogPretimerInterruptT value); SaErrorT oh_encode_watchdogpretimerinterrupt(SaHpiTextBufferT *buffer, SaHpiWatchdogPretimerInterruptT *type); #define OH_MAX_WATCHDOGTIMERUSE 7 extern struct oh_watchdogtimeruse_map { SaHpiWatchdogTimerUseT entity_type; char *str; } watchdogtimeruse_strings[OH_MAX_WATCHDOGTIMERUSE]; char * oh_lookup_watchdogtimeruse(SaHpiWatchdogTimerUseT value); SaErrorT oh_encode_watchdogtimeruse(SaHpiTextBufferT *buffer, SaHpiWatchdogTimerUseT *type); #define OH_MAX_HSINDICATORSTATE 2 extern struct oh_hsindicatorstate_map { SaHpiHsIndicatorStateT entity_type; char *str; } hsindicatorstate_strings[OH_MAX_HSINDICATORSTATE]; char * oh_lookup_hsindicatorstate(SaHpiHsIndicatorStateT value); SaErrorT oh_encode_hsindicatorstate(SaHpiTextBufferT *buffer, SaHpiHsIndicatorStateT *type); #define OH_MAX_HSACTION 2 extern struct oh_hsaction_map { SaHpiHsActionT entity_type; char *str; } hsaction_strings[OH_MAX_HSACTION]; char * oh_lookup_hsaction(SaHpiHsActionT value); SaErrorT oh_encode_hsaction(SaHpiTextBufferT *buffer, SaHpiHsActionT *type); #define OH_MAX_HSSTATE 5 extern struct oh_hsstate_map { SaHpiHsStateT entity_type; char *str; } hsstate_strings[OH_MAX_HSSTATE]; char * oh_lookup_hsstate(SaHpiHsStateT value); SaErrorT oh_encode_hsstate(SaHpiTextBufferT *buffer, SaHpiHsStateT *type); #define OH_MAX_SEVERITY 7 extern struct oh_severity_map { SaHpiSeverityT entity_type; char *str; } severity_strings[OH_MAX_SEVERITY]; char * oh_lookup_severity(SaHpiSeverityT value); SaErrorT oh_encode_severity(SaHpiTextBufferT *buffer, SaHpiSeverityT *type); #define OH_MAX_RESOURCEEVENTTYPE 6 extern struct oh_resourceeventtype_map { SaHpiResourceEventTypeT entity_type; char *str; } resourceeventtype_strings[OH_MAX_RESOURCEEVENTTYPE]; char * oh_lookup_resourceeventtype(SaHpiResourceEventTypeT value); SaErrorT oh_encode_resourceeventtype(SaHpiTextBufferT *buffer, SaHpiResourceEventTypeT *type); #define OH_MAX_DOMAINEVENTTYPE 2 extern struct oh_domaineventtype_map { SaHpiDomainEventTypeT entity_type; char *str; } domaineventtype_strings[OH_MAX_DOMAINEVENTTYPE]; char * oh_lookup_domaineventtype(SaHpiDomainEventTypeT value); SaErrorT oh_encode_domaineventtype(SaHpiTextBufferT *buffer, SaHpiDomainEventTypeT *type); #define OH_MAX_SWEVENTTYPE 3 extern struct oh_sweventtype_map { SaHpiSwEventTypeT entity_type; char *str; } sweventtype_strings[OH_MAX_SWEVENTTYPE]; char * oh_lookup_sweventtype(SaHpiSwEventTypeT value); SaErrorT oh_encode_sweventtype(SaHpiTextBufferT *buffer, SaHpiSwEventTypeT *type); #define OH_MAX_EVENTTYPE 12 extern struct oh_eventtype_map { SaHpiEventTypeT entity_type; char *str; } eventtype_strings[OH_MAX_EVENTTYPE]; char * oh_lookup_eventtype(SaHpiEventTypeT value); SaErrorT oh_encode_eventtype(SaHpiTextBufferT *buffer, SaHpiEventTypeT *type); #define OH_MAX_STATUSCONDTYPE 4 extern struct oh_statuscondtype_map { SaHpiStatusCondTypeT entity_type; char *str; } statuscondtype_strings[OH_MAX_STATUSCONDTYPE]; char * oh_lookup_statuscondtype(SaHpiStatusCondTypeT value); SaErrorT oh_encode_statuscondtype(SaHpiTextBufferT *buffer, SaHpiStatusCondTypeT *type); #define OH_MAX_ANNUNCIATORMODE 3 extern struct oh_annunciatormode_map { SaHpiAnnunciatorModeT entity_type; char *str; } annunciatormode_strings[OH_MAX_ANNUNCIATORMODE]; char * oh_lookup_annunciatormode(SaHpiAnnunciatorModeT value); SaErrorT oh_encode_annunciatormode(SaHpiTextBufferT *buffer, SaHpiAnnunciatorModeT *type); #define OH_MAX_ANNUNCIATORTYPE 7 extern struct oh_annunciatortype_map { SaHpiAnnunciatorTypeT entity_type; char *str; } annunciatortype_strings[OH_MAX_ANNUNCIATORTYPE]; char * oh_lookup_annunciatortype(SaHpiAnnunciatorTypeT value); SaErrorT oh_encode_annunciatortype(SaHpiTextBufferT *buffer, SaHpiAnnunciatorTypeT *type); #define OH_MAX_DIMITESTSERVICEIMPACT 3 extern struct oh_dimitestserviceimpact_map { SaHpiDimiTestServiceImpactT entity_type; char *str; } dimitestserviceimpact_strings[OH_MAX_DIMITESTSERVICEIMPACT]; char* oh_lookup_dimitestserviceimpact(SaHpiDimiTestServiceImpactT value); SaErrorT oh_encode_dimitestserviceimpact(SaHpiTextBufferT *buffer, SaHpiDimiTestServiceImpactT *type); #define OH_MAX_DIMITESTRUNSTATUS 5 extern struct oh_dimitestrunstatus_map { SaHpiDimiTestRunStatusT entity_type; char *str; } dimitestrunstatus_strings[OH_MAX_DIMITESTRUNSTATUS]; char * oh_lookup_dimitestrunstatus(SaHpiDimiTestRunStatusT value); SaErrorT oh_encode_dimitestrunstatus(SaHpiTextBufferT *buffer, SaHpiDimiTestRunStatusT *type); #define OH_MAX_FUMISOURCESTATUS 9 extern struct oh_fumisourcestatus_map { SaHpiFumiSourceStatusT entity_type; char *str; } fumisourcestatus_strings[OH_MAX_FUMISOURCESTATUS]; char * oh_lookup_fumisourcestatus(SaHpiFumiSourceStatusT value); SaErrorT oh_encode_fumisourcestatus(SaHpiTextBufferT *buffer, SaHpiFumiSourceStatusT *type); #define OH_MAX_FUMIBANKSTATE 6 extern struct oh_fumibankstate_map { SaHpiFumiBankStateT entity_type; char *str; } fumibankstate_strings[OH_MAX_FUMIBANKSTATE]; char * oh_lookup_fumibankstate(SaHpiFumiBankStateT value); SaErrorT oh_encode_fumibankstate(SaHpiTextBufferT *buffer, SaHpiFumiBankStateT *type); #define OH_MAX_FUMIUPGRADESTATUS 27 extern struct oh_fumiupgradestatus_map { SaHpiFumiUpgradeStatusT entity_type; char *str; } fumiupgradestatus_strings[OH_MAX_FUMIUPGRADESTATUS]; char * oh_lookup_fumiupgradestatus(SaHpiFumiUpgradeStatusT value); SaErrorT oh_encode_fumiupgradestatus(SaHpiTextBufferT *buffer, SaHpiFumiUpgradeStatusT *type); #define OH_MAX_RDRTYPE 8 extern struct oh_rdrtype_map { SaHpiRdrTypeT entity_type; char *str; } rdrtype_strings[OH_MAX_RDRTYPE]; char * oh_lookup_rdrtype(SaHpiRdrTypeT value); SaErrorT oh_encode_rdrtype(SaHpiTextBufferT *buffer, SaHpiRdrTypeT *type); #define OH_MAX_PARMACTION 3 extern struct oh_parmaction_map { SaHpiParmActionT entity_type; char *str; } parmaction_strings[OH_MAX_PARMACTION]; char * oh_lookup_parmaction(SaHpiParmActionT value); SaErrorT oh_encode_parmaction(SaHpiTextBufferT *buffer, SaHpiParmActionT *type); #define OH_MAX_RESETACTION 4 extern struct oh_resetaction_map { SaHpiResetActionT entity_type; char *str; } resetaction_strings[OH_MAX_RESETACTION]; char * oh_lookup_resetaction(SaHpiResetActionT value); SaErrorT oh_encode_resetaction(SaHpiTextBufferT *buffer, SaHpiResetActionT *type); #define OH_MAX_POWERSTATE 3 extern struct oh_powerstate_map { SaHpiPowerStateT entity_type; char *str; } powerstate_strings[OH_MAX_POWERSTATE]; char * oh_lookup_powerstate(SaHpiPowerStateT value); SaErrorT oh_encode_powerstate(SaHpiTextBufferT *buffer, SaHpiPowerStateT *type); #define OH_MAX_EVENTLOGOVERFLOWACTION 2 extern struct oh_eventlogoverflowaction_map { SaHpiEventLogOverflowActionT entity_type; char *str; } eventlogoverflowaction_strings[OH_MAX_EVENTLOGOVERFLOWACTION]; char * oh_lookup_eventlogoverflowaction(SaHpiEventLogOverflowActionT value); SaErrorT oh_encode_eventlogoverflowaction(SaHpiTextBufferT *buffer, SaHpiEventLogOverflowActionT *type); #define OH_MAX_ERROR 22 extern struct oh_error_map { SaErrorT entity_type; char *str; } error_strings[OH_MAX_ERROR]; char * oh_lookup_error(SaErrorT value); SaErrorT oh_encode_error(SaHpiTextBufferT *buffer, SaErrorT *type); #define OH_MAX_EVENTCATEGORY 14 extern struct oh_eventcategory_map { SaHpiEventCategoryT entity_type; char *str; } eventcategory_strings[OH_MAX_EVENTCATEGORY]; char * oh_lookup_eventcategory(SaHpiEventCategoryT value); SaErrorT oh_encode_eventcategory(SaHpiTextBufferT *buffer, SaHpiEventCategoryT *type); #ifdef __cplusplus } #endif #endif openhpi-2.14.1/utils/t/0000755000076400007640000000000011405006365011574 5ustar openhpi-2.14.1/utils/t/Makefile.am0000644000076400007640000000325011302567130013626 0ustar # # Copyright (c) 2003, Intel Corporation # All rights reserved. # # 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. # # Neither the name of Intel Corporation nor the names # of its contributors may be used to endorse or promote products # derived from this software without specific prior written permission. # # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS # "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT # LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS # FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT # OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, # SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED # TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, # OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY # OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING # NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS # SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. # MAINTAINERCLEANFILES = Makefile.in #EXTRA_DIST = SUBDIRS = epath rpt sahpi el uid ann DIST_SUBDIRS = epath rpt sahpi el uid ann openhpi-2.14.1/utils/t/epath/0000755000076400007640000000000011405006365012675 5ustar openhpi-2.14.1/utils/t/epath/epath_pattern_445.c0000644000076400007640000000323011302567127016275 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{GROUP,7}{REMOTE,2}{SUBRACK,4}{BIOS,8}"; char *epp_str = "*{.,.}*{.,.}"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_TRUE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-2.14.1/utils/t/epath/epath_pattern_355.c0000644000076400007640000000320311302567127016275 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{GROUP,2}"; char *epp_str = "{SYSTEM_CHASSIS,1}*"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_FALSE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-2.14.1/utils/t/epath/epath_pattern_086.c0000644000076400007640000000330711302567127016303 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{SYSTEM_CHASSIS,1}{PHYSICAL_SLOT,3}{SBC_BLADE,3}{ADD_IN_CARD,8}"; char *epp_str = "*{SYSTEM_CHASSIS,1}{SBC_BLADE,.}*"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_FALSE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-2.14.1/utils/t/epath/epath_pattern_186.c0000644000076400007640000000327611302567127016311 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{GROUP,4}{SYSTEM_CHASSIS,1}{SBC_BLADE,3}{ADD_IN_CARD,8}"; char *epp_str = "*{SYSTEM_CHASSIS,1}{SBC_BLADE,.}*"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_TRUE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-2.14.1/utils/t/epath/epath_pattern_192.c0000644000076400007640000000324311302567127016300 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{GROUP,4}{SYSTEM_CHASSIS,1}{SBC_BLADE,3}{ADD_IN_CARD,8}"; char *epp_str = "*{.,.}"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_TRUE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-2.14.1/utils/t/epath/epath_pattern_211.c0000644000076400007640000000330111302567127016263 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{GROUP,4}{SYSTEM_CHASSIS,1}{PHYSICAL_SLOT,3}{SBC_BLADE,3}"; char *epp_str = "*{SYSTEM_CHASSIS,1}{SBC_BLADE,.}*"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_FALSE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-2.14.1/utils/t/epath/epath_pattern_402.c0000644000076400007640000000324511302567127016274 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{GROUP,7}{REMOTE,2}{SUBRACK,4}"; char *epp_str = "{SYSTEM_CHASSIS,1}{SBC_BLADE,.}*"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_FALSE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-2.14.1/utils/t/epath/epath_pattern_012.c0000644000076400007640000000324511302567127016271 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{SYSTEM_CHASSIS,1}{SBC_BLADE,3}"; char *epp_str = "*{SYSTEM_CHASSIS,.}{SBC_BLADE,.}"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_TRUE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-2.14.1/utils/t/epath/epath_pattern_340.c0000644000076400007640000000325111302567127016272 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{SYSTEM_CHASSIS,1}{PHYSICAL_SLOT,4}{SBC_BLADE,3}"; char *epp_str = "{SYSTEM_CHASSIS,.}"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_FALSE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-2.14.1/utils/t/epath/epath_conv_009.c0000644000076400007640000000507211302567127015567 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. */ /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_tests.pl. * Do not change this file manually. Update script instead *******************************************************************/ #include #include #include /** * main: * epathstr -> epath test * * Test if an entity path string is converted properly into an entity path. **/ int main(int argc, char **argv) { char *test_string = "{SYS_MGMNT_SOFTWARE,13}{SWITCH,20}"; oh_big_textbuffer bigbuf; SaErrorT err; SaHpiEntityPathT ep; err = oh_encode_entitypath(test_string, &ep); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } if (ep.Entry[0].EntityType != SAHPI_ENT_SWITCH) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[0].EntityType, SAHPI_ENT_SWITCH); return -1; } if (ep.Entry[0].EntityLocation != 20) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[0].EntityLocation, 20); return -1; } if (ep.Entry[1].EntityType != SAHPI_ENT_SYS_MGMNT_SOFTWARE) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[1].EntityType, SAHPI_ENT_SYS_MGMNT_SOFTWARE); return -1; } if (ep.Entry[1].EntityLocation != 13) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[1].EntityLocation, 13); return -1; } oh_init_bigtext(&bigbuf); err = oh_decode_entitypath(&ep, &bigbuf); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } if (strcmp((char *)bigbuf.Data, test_string)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received Entity Path=%s.\n", bigbuf.Data); return -1; } return 0; } openhpi-2.14.1/utils/t/epath/epath_conv_076.c0000644000076400007640000000502611302567127015572 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. */ /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_tests.pl. * Do not change this file manually. Update script instead *******************************************************************/ #include #include #include /** * main: * epathstr -> epath test * * Test if an entity path string is converted properly into an entity path. **/ int main(int argc, char **argv) { char *test_string = "{OTHER,78}{BATTERY,84}"; oh_big_textbuffer bigbuf; SaErrorT err; SaHpiEntityPathT ep; err = oh_encode_entitypath(test_string, &ep); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } if (ep.Entry[0].EntityType != SAHPI_ENT_BATTERY) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[0].EntityType, SAHPI_ENT_BATTERY); return -1; } if (ep.Entry[0].EntityLocation != 84) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[0].EntityLocation, 84); return -1; } if (ep.Entry[1].EntityType != SAHPI_ENT_OTHER) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[1].EntityType, SAHPI_ENT_OTHER); return -1; } if (ep.Entry[1].EntityLocation != 78) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[1].EntityLocation, 78); return -1; } oh_init_bigtext(&bigbuf); err = oh_decode_entitypath(&ep, &bigbuf); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } if (strcmp((char *)bigbuf.Data, test_string)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received Entity Path=%s.\n", bigbuf.Data); return -1; } return 0; } openhpi-2.14.1/utils/t/epath/epath_pattern_260.c0000644000076400007640000000322111302567127016270 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{SBC_BLADE,3}{ADD_IN_CARD,8}"; char *epp_str = "*{SBC_BLADE,.}*"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_TRUE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-2.14.1/utils/t/epath/ep_cmp_001.c0000644000076400007640000000163411302567127014674 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * Chris Chia * Steve Sherman */ #include #include #include #include /* oh_cmp_ep: zero element entity path testcase. */ int main(int argc, char **argv) { SaHpiEntityPathT ep1 = {{{SAHPI_ENT_ROOT, 0}}}; SaHpiEntityPathT ep2 = {{{SAHPI_ENT_ROOT, 0}}}; if (!oh_cmp_ep(&ep1, &ep2)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); return -1; } return 0; } openhpi-2.14.1/utils/t/epath/Makefile.am0000644000076400007640000022157011302567127014744 0ustar # # Copyright (c) 2003, 2004 Intel Corporation # All rights reserved. # # 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. # # Neither the name of Intel Corporation nor the names # of its contributors may be used to endorse or promote products # derived from this software without specific prior written permission. # # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS # "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT # LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS # FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT # OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, # SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED # TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, # OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY # OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING # NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS # SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. # MAINTAINERCLEANFILES = Makefile.in REMOTE_SOURCES = \ epath_utils.c \ sahpi_enum_utils.c \ sahpiatca_enum_utils.c \ sahpi_event_encode.c \ sahpi_event_utils.c \ sahpi_struct_utils.c \ sahpi_time_utils.c \ uid_utils.c MOSTLYCLEANFILES = $(REMOTE_SOURCES) @TEST_CLEAN@ INCLUDES = @OPENHPI_INCLUDES@ LIBS += -luuid $(REMOTE_SOURCES): if test ! -f $@ -a ! -L $@; then \ if test -f $(top_srcdir)/utils/$@; then \ $(LN_S) $(top_srcdir)/utils/$@; \ else \ $(LN_S) $(top_builddir)/utils/$@; \ fi; \ fi # FIXME:: Remove epath_conv_xxx files when we can auto-generate file for SMP systems # Create rule using gen_epath_conv_tests.pl. # Do same for epath_pattern_xxx which use gen_epath_pattern_tests.py TESTS = \ epath_utils_test \ epath_numeric_000 \ epath_numeric_001 \ epath_numeric_002 \ epath_numeric_003 \ epath_numeric_004 \ epath_numeric_005 \ epath_conv_000 \ epath_conv_001 \ epath_conv_002 \ epath_conv_003 \ epath_conv_004 \ epath_conv_005 \ epath_conv_006 \ epath_conv_007 \ epath_conv_008 \ epath_conv_009 \ epath_conv_010 \ epath_conv_011 \ epath_conv_012 \ epath_conv_013 \ epath_conv_014 \ epath_conv_015 \ epath_conv_016 \ epath_conv_017 \ epath_conv_018 \ epath_conv_019 \ epath_conv_020 \ epath_conv_021 \ epath_conv_022 \ epath_conv_023 \ epath_conv_024 \ epath_conv_025 \ epath_conv_026 \ epath_conv_027 \ epath_conv_028 \ epath_conv_029 \ epath_conv_030 \ epath_conv_031 \ epath_conv_032 \ epath_conv_033 \ epath_conv_034 \ epath_conv_035 \ epath_conv_036 \ epath_conv_037 \ epath_conv_038 \ epath_conv_039 \ epath_conv_040 \ epath_conv_041 \ epath_conv_042 \ epath_conv_043 \ epath_conv_044 \ epath_conv_045 \ epath_conv_046 \ epath_conv_047 \ epath_conv_048 \ epath_conv_049 \ epath_conv_050 \ epath_conv_051 \ epath_conv_052 \ epath_conv_053 \ epath_conv_054 \ epath_conv_055 \ epath_conv_056 \ epath_conv_057 \ epath_conv_058 \ epath_conv_059 \ epath_conv_060 \ epath_conv_061 \ epath_conv_062 \ epath_conv_063 \ epath_conv_064 \ epath_conv_065 \ epath_conv_066 \ epath_conv_067 \ epath_conv_068 \ epath_conv_069 \ epath_conv_070 \ epath_conv_071 \ epath_conv_072 \ epath_conv_073 \ epath_conv_074 \ epath_conv_075 \ epath_conv_076 \ epath_conv_077 \ epath_conv_078 \ epath_conv_079 \ epath_conv_080 \ epath_conv_081 \ epath_conv_082 \ epath_conv_083 \ epath_conv_084 \ epath_conv_085 \ epath_conv_086 \ epath_conv_087 \ epath_conv_088 \ epath_conv_089 \ epath_conv_090 \ epath_conv_091 \ epath_conv_092 \ epath_conv_093 \ epath_conv_094 \ epath_conv_095 \ epath_conv_096 \ epath_conv_097 \ epath_conv_098 \ epath_conv_099 \ epath_conv_100 \ epath_conv_101 \ ep_cmp_000 \ ep_cmp_001 \ ep_cmp_002 \ ep_cmp_003 \ ep_cmp_004 \ ep_cmp_005 \ ep_cmp_006 \ ep_cmp_007 \ ep_cmp_008 \ ep_cmp_009 \ ep_cmp_010 \ ep_cmp_011 \ ep_concat_000 \ ep_concat_001 \ ep_concat_002 \ ep_concat_003 \ ep_concat_004 \ ep_concat_005 \ ep_concat_006 \ ep_concat_007 \ ep_concat_008 \ ep_concat_009 \ ep_concat_010 \ ep_concat_011 \ ep_concat_012 \ ep_concat_013 \ ep_concat_014 \ ep_concat_015 \ ep_derive_001 \ set_ep_loc_000 \ set_ep_loc_001 \ set_ep_loc_002 \ set_ep_loc_003 \ set_ep_loc_004 \ set_ep_loc_005 \ set_ep_loc_006 \ set_ep_loc_007 \ set_ep_loc_008 \ set_ep_loc_009 \ set_ep_loc_010 \ set_ep_loc_011 \ set_ep_loc_012 \ set_ep_loc_013 \ print_ep_000 \ print_ep_001 \ print_ep_002 \ print_ep_003 \ print_ep_004 \ print_ep_005 \ epath_pattern_000 \ epath_pattern_001 \ epath_pattern_002 \ epath_pattern_003 \ epath_pattern_004 \ epath_pattern_005 \ epath_pattern_006 \ epath_pattern_007 \ epath_pattern_008 \ epath_pattern_009 \ epath_pattern_010 \ epath_pattern_011 \ epath_pattern_012 \ epath_pattern_013 \ epath_pattern_014 \ epath_pattern_015 \ epath_pattern_016 \ epath_pattern_017 \ epath_pattern_018 \ epath_pattern_019 \ epath_pattern_020 \ epath_pattern_021 \ epath_pattern_022 \ epath_pattern_023 \ epath_pattern_024 \ epath_pattern_025 \ epath_pattern_026 \ epath_pattern_027 \ epath_pattern_028 \ epath_pattern_029 \ epath_pattern_030 \ epath_pattern_031 \ epath_pattern_032 \ epath_pattern_033 \ epath_pattern_034 \ epath_pattern_035 \ epath_pattern_036 \ epath_pattern_037 \ epath_pattern_038 \ epath_pattern_039 \ epath_pattern_040 \ epath_pattern_041 \ epath_pattern_042 \ epath_pattern_043 \ epath_pattern_044 \ epath_pattern_045 \ epath_pattern_046 \ epath_pattern_047 \ epath_pattern_048 \ epath_pattern_049 \ epath_pattern_050 \ epath_pattern_051 \ epath_pattern_052 \ epath_pattern_053 \ epath_pattern_054 \ epath_pattern_055 \ epath_pattern_056 \ epath_pattern_057 \ epath_pattern_058 \ epath_pattern_059 \ epath_pattern_060 \ epath_pattern_061 \ epath_pattern_062 \ epath_pattern_063 \ epath_pattern_064 \ epath_pattern_065 \ epath_pattern_066 \ epath_pattern_067 \ epath_pattern_068 \ epath_pattern_069 \ epath_pattern_070 \ epath_pattern_071 \ epath_pattern_072 \ epath_pattern_073 \ epath_pattern_074 \ epath_pattern_075 \ epath_pattern_076 \ epath_pattern_077 \ epath_pattern_078 \ epath_pattern_079 \ epath_pattern_080 \ epath_pattern_081 \ epath_pattern_082 \ epath_pattern_083 \ epath_pattern_084 \ epath_pattern_085 \ epath_pattern_086 \ epath_pattern_087 \ epath_pattern_088 \ epath_pattern_089 \ epath_pattern_090 \ epath_pattern_091 \ epath_pattern_092 \ epath_pattern_093 \ epath_pattern_094 \ epath_pattern_095 \ epath_pattern_096 \ epath_pattern_097 \ epath_pattern_098 \ epath_pattern_099 \ epath_pattern_100 \ epath_pattern_101 \ epath_pattern_102 \ epath_pattern_103 \ epath_pattern_104 \ epath_pattern_105 \ epath_pattern_106 \ epath_pattern_107 \ epath_pattern_108 \ epath_pattern_109 \ epath_pattern_110 \ epath_pattern_111 \ epath_pattern_112 \ epath_pattern_113 \ epath_pattern_114 \ epath_pattern_115 \ epath_pattern_116 \ epath_pattern_117 \ epath_pattern_118 \ epath_pattern_119 \ epath_pattern_120 \ epath_pattern_121 \ epath_pattern_122 \ epath_pattern_123 \ epath_pattern_124 \ epath_pattern_125 \ epath_pattern_126 \ epath_pattern_127 \ epath_pattern_128 \ epath_pattern_129 \ epath_pattern_130 \ epath_pattern_131 \ epath_pattern_132 \ epath_pattern_133 \ epath_pattern_134 \ epath_pattern_135 \ epath_pattern_136 \ epath_pattern_137 \ epath_pattern_138 \ epath_pattern_139 \ epath_pattern_140 \ epath_pattern_141 \ epath_pattern_142 \ epath_pattern_143 \ epath_pattern_144 \ epath_pattern_145 \ epath_pattern_146 \ epath_pattern_147 \ epath_pattern_148 \ epath_pattern_149 \ epath_pattern_150 \ epath_pattern_151 \ epath_pattern_152 \ epath_pattern_153 \ epath_pattern_154 \ epath_pattern_155 \ epath_pattern_156 \ epath_pattern_157 \ epath_pattern_158 \ epath_pattern_159 \ epath_pattern_160 \ epath_pattern_161 \ epath_pattern_162 \ epath_pattern_163 \ epath_pattern_164 \ epath_pattern_165 \ epath_pattern_166 \ epath_pattern_167 \ epath_pattern_168 \ epath_pattern_169 \ epath_pattern_170 \ epath_pattern_171 \ epath_pattern_172 \ epath_pattern_173 \ epath_pattern_174 \ epath_pattern_175 \ epath_pattern_176 \ epath_pattern_177 \ epath_pattern_178 \ epath_pattern_179 \ epath_pattern_180 \ epath_pattern_181 \ epath_pattern_182 \ epath_pattern_183 \ epath_pattern_184 \ epath_pattern_185 \ epath_pattern_186 \ epath_pattern_187 \ epath_pattern_188 \ epath_pattern_189 \ epath_pattern_190 \ epath_pattern_191 \ epath_pattern_192 \ epath_pattern_193 \ epath_pattern_194 \ epath_pattern_195 \ epath_pattern_196 \ epath_pattern_197 \ epath_pattern_198 \ epath_pattern_199 \ epath_pattern_200 \ epath_pattern_201 \ epath_pattern_202 \ epath_pattern_203 \ epath_pattern_204 \ epath_pattern_205 \ epath_pattern_206 \ epath_pattern_207 \ epath_pattern_208 \ epath_pattern_209 \ epath_pattern_210 \ epath_pattern_211 \ epath_pattern_212 \ epath_pattern_213 \ epath_pattern_214 \ epath_pattern_215 \ epath_pattern_216 \ epath_pattern_217 \ epath_pattern_218 \ epath_pattern_219 \ epath_pattern_220 \ epath_pattern_221 \ epath_pattern_222 \ epath_pattern_223 \ epath_pattern_224 \ epath_pattern_225 \ epath_pattern_226 \ epath_pattern_227 \ epath_pattern_228 \ epath_pattern_229 \ epath_pattern_230 \ epath_pattern_231 \ epath_pattern_232 \ epath_pattern_233 \ epath_pattern_234 \ epath_pattern_235 \ epath_pattern_236 \ epath_pattern_237 \ epath_pattern_238 \ epath_pattern_239 \ epath_pattern_240 \ epath_pattern_241 \ epath_pattern_242 \ epath_pattern_243 \ epath_pattern_244 \ epath_pattern_245 \ epath_pattern_246 \ epath_pattern_247 \ epath_pattern_248 \ epath_pattern_249 \ epath_pattern_250 \ epath_pattern_251 \ epath_pattern_252 \ epath_pattern_253 \ epath_pattern_254 \ epath_pattern_255 \ epath_pattern_256 \ epath_pattern_257 \ epath_pattern_258 \ epath_pattern_259 \ epath_pattern_260 \ epath_pattern_261 \ epath_pattern_262 \ epath_pattern_263 \ epath_pattern_264 \ epath_pattern_265 \ epath_pattern_266 \ epath_pattern_267 \ epath_pattern_268 \ epath_pattern_269 \ epath_pattern_270 \ epath_pattern_271 \ epath_pattern_272 \ epath_pattern_273 \ epath_pattern_274 \ epath_pattern_275 \ epath_pattern_276 \ epath_pattern_277 \ epath_pattern_278 \ epath_pattern_279 \ epath_pattern_280 \ epath_pattern_281 \ epath_pattern_282 \ epath_pattern_283 \ epath_pattern_284 \ epath_pattern_285 \ epath_pattern_286 \ epath_pattern_287 \ epath_pattern_288 \ epath_pattern_289 \ epath_pattern_290 \ epath_pattern_291 \ epath_pattern_292 \ epath_pattern_293 \ epath_pattern_294 \ epath_pattern_295 \ epath_pattern_296 \ epath_pattern_297 \ epath_pattern_298 \ epath_pattern_299 \ epath_pattern_300 \ epath_pattern_301 \ epath_pattern_302 \ epath_pattern_303 \ epath_pattern_304 \ epath_pattern_305 \ epath_pattern_306 \ epath_pattern_307 \ epath_pattern_308 \ epath_pattern_309 \ epath_pattern_310 \ epath_pattern_311 \ epath_pattern_312 \ epath_pattern_313 \ epath_pattern_314 \ epath_pattern_315 \ epath_pattern_316 \ epath_pattern_317 \ epath_pattern_318 \ epath_pattern_319 \ epath_pattern_320 \ epath_pattern_321 \ epath_pattern_322 \ epath_pattern_323 \ epath_pattern_324 \ epath_pattern_325 \ epath_pattern_326 \ epath_pattern_327 \ epath_pattern_328 \ epath_pattern_329 \ epath_pattern_330 \ epath_pattern_331 \ epath_pattern_332 \ epath_pattern_333 \ epath_pattern_334 \ epath_pattern_335 \ epath_pattern_336 \ epath_pattern_337 \ epath_pattern_338 \ epath_pattern_339 \ epath_pattern_340 \ epath_pattern_341 \ epath_pattern_342 \ epath_pattern_343 \ epath_pattern_344 \ epath_pattern_345 \ epath_pattern_346 \ epath_pattern_347 \ epath_pattern_348 \ epath_pattern_349 \ epath_pattern_350 \ epath_pattern_351 \ epath_pattern_352 \ epath_pattern_353 \ epath_pattern_354 \ epath_pattern_355 \ epath_pattern_356 \ epath_pattern_357 \ epath_pattern_358 \ epath_pattern_359 \ epath_pattern_360 \ epath_pattern_361 \ epath_pattern_362 \ epath_pattern_363 \ epath_pattern_364 \ epath_pattern_365 \ epath_pattern_366 \ epath_pattern_367 \ epath_pattern_368 \ epath_pattern_369 \ epath_pattern_370 \ epath_pattern_371 \ epath_pattern_372 \ epath_pattern_373 \ epath_pattern_374 \ epath_pattern_375 \ epath_pattern_376 \ epath_pattern_377 \ epath_pattern_378 \ epath_pattern_379 \ epath_pattern_380 \ epath_pattern_381 \ epath_pattern_382 \ epath_pattern_383 \ epath_pattern_384 \ epath_pattern_385 \ epath_pattern_386 \ epath_pattern_387 \ epath_pattern_388 \ epath_pattern_389 \ epath_pattern_390 \ epath_pattern_391 \ epath_pattern_392 \ epath_pattern_393 \ epath_pattern_394 \ epath_pattern_395 \ epath_pattern_396 \ epath_pattern_397 \ epath_pattern_398 \ epath_pattern_399 \ epath_pattern_400 \ epath_pattern_401 \ epath_pattern_402 \ epath_pattern_403 \ epath_pattern_404 \ epath_pattern_405 \ epath_pattern_406 \ epath_pattern_407 \ epath_pattern_408 \ epath_pattern_409 \ epath_pattern_410 \ epath_pattern_411 \ epath_pattern_412 \ epath_pattern_413 \ epath_pattern_414 \ epath_pattern_415 \ epath_pattern_416 \ epath_pattern_417 \ epath_pattern_418 \ epath_pattern_419 \ epath_pattern_420 \ epath_pattern_421 \ epath_pattern_422 \ epath_pattern_423 \ epath_pattern_424 \ epath_pattern_425 \ epath_pattern_426 \ epath_pattern_427 \ epath_pattern_428 \ epath_pattern_429 \ epath_pattern_430 \ epath_pattern_431 \ epath_pattern_432 \ epath_pattern_433 \ epath_pattern_434 \ epath_pattern_435 \ epath_pattern_436 \ epath_pattern_437 \ epath_pattern_438 \ epath_pattern_439 \ epath_pattern_440 \ epath_pattern_441 \ epath_pattern_442 \ epath_pattern_443 \ epath_pattern_444 \ epath_pattern_445 \ epath_pattern_446 \ epath_pattern_447 \ epath_pattern_448 \ epath_pattern_449 check_PROGRAMS = $(TESTS) epath_utils_test_SOURCES = epath_utils_test.c nodist_epath_utils_test_SOURCES = $(REMOTE_SOURCES) epath_numeric_000_SOURCES = epath_numeric_000.c nodist_epath_numeric_000_SOURCES = $(REMOTE_SOURCES) epath_numeric_001_SOURCES = epath_numeric_001.c nodist_epath_numeric_001_SOURCES = $(REMOTE_SOURCES) epath_numeric_002_SOURCES = epath_numeric_002.c nodist_epath_numeric_002_SOURCES = $(REMOTE_SOURCES) epath_numeric_003_SOURCES = epath_numeric_003.c nodist_epath_numeric_003_SOURCES = $(REMOTE_SOURCES) epath_numeric_004_SOURCES = epath_numeric_004.c nodist_epath_numeric_004_SOURCES = $(REMOTE_SOURCES) epath_numeric_005_SOURCES = epath_numeric_005.c nodist_epath_numeric_005_SOURCES = $(REMOTE_SOURCES) epath_conv_000_SOURCES = epath_conv_000.c nodist_epath_conv_000_SOURCES = $(REMOTE_SOURCES) epath_conv_001_SOURCES = epath_conv_001.c nodist_epath_conv_001_SOURCES = $(REMOTE_SOURCES) epath_conv_002_SOURCES = epath_conv_002.c nodist_epath_conv_002_SOURCES = $(REMOTE_SOURCES) epath_conv_003_SOURCES = epath_conv_003.c nodist_epath_conv_003_SOURCES = $(REMOTE_SOURCES) epath_conv_004_SOURCES = epath_conv_004.c nodist_epath_conv_004_SOURCES = $(REMOTE_SOURCES) epath_conv_005_SOURCES = epath_conv_005.c nodist_epath_conv_005_SOURCES = $(REMOTE_SOURCES) epath_conv_006_SOURCES = epath_conv_006.c nodist_epath_conv_006_SOURCES = $(REMOTE_SOURCES) epath_conv_007_SOURCES = epath_conv_007.c nodist_epath_conv_007_SOURCES = $(REMOTE_SOURCES) epath_conv_008_SOURCES = epath_conv_008.c nodist_epath_conv_008_SOURCES = $(REMOTE_SOURCES) epath_conv_009_SOURCES = epath_conv_009.c nodist_epath_conv_009_SOURCES = $(REMOTE_SOURCES) epath_conv_010_SOURCES = epath_conv_010.c nodist_epath_conv_010_SOURCES = $(REMOTE_SOURCES) epath_conv_011_SOURCES = epath_conv_011.c nodist_epath_conv_011_SOURCES = $(REMOTE_SOURCES) epath_conv_012_SOURCES = epath_conv_012.c nodist_epath_conv_012_SOURCES = $(REMOTE_SOURCES) epath_conv_013_SOURCES = epath_conv_013.c nodist_epath_conv_013_SOURCES = $(REMOTE_SOURCES) epath_conv_014_SOURCES = epath_conv_014.c nodist_epath_conv_014_SOURCES = $(REMOTE_SOURCES) epath_conv_015_SOURCES = epath_conv_015.c nodist_epath_conv_015_SOURCES = $(REMOTE_SOURCES) epath_conv_016_SOURCES = epath_conv_016.c nodist_epath_conv_016_SOURCES = $(REMOTE_SOURCES) epath_conv_017_SOURCES = epath_conv_017.c nodist_epath_conv_017_SOURCES = $(REMOTE_SOURCES) epath_conv_018_SOURCES = epath_conv_018.c nodist_epath_conv_018_SOURCES = $(REMOTE_SOURCES) epath_conv_019_SOURCES = epath_conv_019.c nodist_epath_conv_019_SOURCES = $(REMOTE_SOURCES) epath_conv_020_SOURCES = epath_conv_020.c nodist_epath_conv_020_SOURCES = $(REMOTE_SOURCES) epath_conv_021_SOURCES = epath_conv_021.c nodist_epath_conv_021_SOURCES = $(REMOTE_SOURCES) epath_conv_022_SOURCES = epath_conv_022.c nodist_epath_conv_022_SOURCES = $(REMOTE_SOURCES) epath_conv_023_SOURCES = epath_conv_023.c nodist_epath_conv_023_SOURCES = $(REMOTE_SOURCES) epath_conv_024_SOURCES = epath_conv_024.c nodist_epath_conv_024_SOURCES = $(REMOTE_SOURCES) epath_conv_025_SOURCES = epath_conv_025.c nodist_epath_conv_025_SOURCES = $(REMOTE_SOURCES) epath_conv_026_SOURCES = epath_conv_026.c nodist_epath_conv_026_SOURCES = $(REMOTE_SOURCES) epath_conv_027_SOURCES = epath_conv_027.c nodist_epath_conv_027_SOURCES = $(REMOTE_SOURCES) epath_conv_028_SOURCES = epath_conv_028.c nodist_epath_conv_028_SOURCES = $(REMOTE_SOURCES) epath_conv_029_SOURCES = epath_conv_029.c nodist_epath_conv_029_SOURCES = $(REMOTE_SOURCES) epath_conv_030_SOURCES = epath_conv_030.c nodist_epath_conv_030_SOURCES = $(REMOTE_SOURCES) epath_conv_031_SOURCES = epath_conv_031.c nodist_epath_conv_031_SOURCES = $(REMOTE_SOURCES) epath_conv_032_SOURCES = epath_conv_032.c nodist_epath_conv_032_SOURCES = $(REMOTE_SOURCES) epath_conv_033_SOURCES = epath_conv_033.c nodist_epath_conv_033_SOURCES = $(REMOTE_SOURCES) epath_conv_034_SOURCES = epath_conv_034.c nodist_epath_conv_034_SOURCES = $(REMOTE_SOURCES) epath_conv_035_SOURCES = epath_conv_035.c nodist_epath_conv_035_SOURCES = $(REMOTE_SOURCES) epath_conv_036_SOURCES = epath_conv_036.c nodist_epath_conv_036_SOURCES = $(REMOTE_SOURCES) epath_conv_037_SOURCES = epath_conv_037.c nodist_epath_conv_037_SOURCES = $(REMOTE_SOURCES) epath_conv_038_SOURCES = epath_conv_038.c nodist_epath_conv_038_SOURCES = $(REMOTE_SOURCES) epath_conv_039_SOURCES = epath_conv_039.c nodist_epath_conv_039_SOURCES = $(REMOTE_SOURCES) epath_conv_040_SOURCES = epath_conv_040.c nodist_epath_conv_040_SOURCES = $(REMOTE_SOURCES) epath_conv_041_SOURCES = epath_conv_041.c nodist_epath_conv_041_SOURCES = $(REMOTE_SOURCES) epath_conv_042_SOURCES = epath_conv_042.c nodist_epath_conv_042_SOURCES = $(REMOTE_SOURCES) epath_conv_043_SOURCES = epath_conv_043.c nodist_epath_conv_043_SOURCES = $(REMOTE_SOURCES) epath_conv_044_SOURCES = epath_conv_044.c nodist_epath_conv_044_SOURCES = $(REMOTE_SOURCES) epath_conv_045_SOURCES = epath_conv_045.c nodist_epath_conv_045_SOURCES = $(REMOTE_SOURCES) epath_conv_046_SOURCES = epath_conv_046.c nodist_epath_conv_046_SOURCES = $(REMOTE_SOURCES) epath_conv_047_SOURCES = epath_conv_047.c nodist_epath_conv_047_SOURCES = $(REMOTE_SOURCES) epath_conv_048_SOURCES = epath_conv_048.c nodist_epath_conv_048_SOURCES = $(REMOTE_SOURCES) epath_conv_049_SOURCES = epath_conv_049.c nodist_epath_conv_049_SOURCES = $(REMOTE_SOURCES) epath_conv_050_SOURCES = epath_conv_050.c nodist_epath_conv_050_SOURCES = $(REMOTE_SOURCES) epath_conv_051_SOURCES = epath_conv_051.c nodist_epath_conv_051_SOURCES = $(REMOTE_SOURCES) epath_conv_052_SOURCES = epath_conv_052.c nodist_epath_conv_052_SOURCES = $(REMOTE_SOURCES) epath_conv_053_SOURCES = epath_conv_053.c nodist_epath_conv_053_SOURCES = $(REMOTE_SOURCES) epath_conv_054_SOURCES = epath_conv_054.c nodist_epath_conv_054_SOURCES = $(REMOTE_SOURCES) epath_conv_055_SOURCES = epath_conv_055.c nodist_epath_conv_055_SOURCES = $(REMOTE_SOURCES) epath_conv_056_SOURCES = epath_conv_056.c nodist_epath_conv_056_SOURCES = $(REMOTE_SOURCES) epath_conv_057_SOURCES = epath_conv_057.c nodist_epath_conv_057_SOURCES = $(REMOTE_SOURCES) epath_conv_058_SOURCES = epath_conv_058.c nodist_epath_conv_058_SOURCES = $(REMOTE_SOURCES) epath_conv_059_SOURCES = epath_conv_059.c nodist_epath_conv_059_SOURCES = $(REMOTE_SOURCES) epath_conv_060_SOURCES = epath_conv_060.c nodist_epath_conv_060_SOURCES = $(REMOTE_SOURCES) epath_conv_061_SOURCES = epath_conv_061.c nodist_epath_conv_061_SOURCES = $(REMOTE_SOURCES) epath_conv_062_SOURCES = epath_conv_062.c nodist_epath_conv_062_SOURCES = $(REMOTE_SOURCES) epath_conv_063_SOURCES = epath_conv_063.c nodist_epath_conv_063_SOURCES = $(REMOTE_SOURCES) epath_conv_064_SOURCES = epath_conv_064.c nodist_epath_conv_064_SOURCES = $(REMOTE_SOURCES) epath_conv_065_SOURCES = epath_conv_065.c nodist_epath_conv_065_SOURCES = $(REMOTE_SOURCES) epath_conv_066_SOURCES = epath_conv_066.c nodist_epath_conv_066_SOURCES = $(REMOTE_SOURCES) epath_conv_067_SOURCES = epath_conv_067.c nodist_epath_conv_067_SOURCES = $(REMOTE_SOURCES) epath_conv_068_SOURCES = epath_conv_068.c nodist_epath_conv_068_SOURCES = $(REMOTE_SOURCES) epath_conv_069_SOURCES = epath_conv_069.c nodist_epath_conv_069_SOURCES = $(REMOTE_SOURCES) epath_conv_070_SOURCES = epath_conv_070.c nodist_epath_conv_070_SOURCES = $(REMOTE_SOURCES) epath_conv_071_SOURCES = epath_conv_071.c nodist_epath_conv_071_SOURCES = $(REMOTE_SOURCES) epath_conv_072_SOURCES = epath_conv_072.c nodist_epath_conv_072_SOURCES = $(REMOTE_SOURCES) epath_conv_073_SOURCES = epath_conv_073.c nodist_epath_conv_073_SOURCES = $(REMOTE_SOURCES) epath_conv_074_SOURCES = epath_conv_074.c nodist_epath_conv_074_SOURCES = $(REMOTE_SOURCES) epath_conv_075_SOURCES = epath_conv_075.c nodist_epath_conv_075_SOURCES = $(REMOTE_SOURCES) epath_conv_076_SOURCES = epath_conv_076.c nodist_epath_conv_076_SOURCES = $(REMOTE_SOURCES) epath_conv_077_SOURCES = epath_conv_077.c nodist_epath_conv_077_SOURCES = $(REMOTE_SOURCES) epath_conv_078_SOURCES = epath_conv_078.c nodist_epath_conv_078_SOURCES = $(REMOTE_SOURCES) epath_conv_079_SOURCES = epath_conv_079.c nodist_epath_conv_079_SOURCES = $(REMOTE_SOURCES) epath_conv_080_SOURCES = epath_conv_080.c nodist_epath_conv_080_SOURCES = $(REMOTE_SOURCES) epath_conv_081_SOURCES = epath_conv_081.c nodist_epath_conv_081_SOURCES = $(REMOTE_SOURCES) epath_conv_082_SOURCES = epath_conv_082.c nodist_epath_conv_082_SOURCES = $(REMOTE_SOURCES) epath_conv_083_SOURCES = epath_conv_083.c nodist_epath_conv_083_SOURCES = $(REMOTE_SOURCES) epath_conv_084_SOURCES = epath_conv_084.c nodist_epath_conv_084_SOURCES = $(REMOTE_SOURCES) epath_conv_085_SOURCES = epath_conv_085.c nodist_epath_conv_085_SOURCES = $(REMOTE_SOURCES) epath_conv_086_SOURCES = epath_conv_086.c nodist_epath_conv_086_SOURCES = $(REMOTE_SOURCES) epath_conv_087_SOURCES = epath_conv_087.c nodist_epath_conv_087_SOURCES = $(REMOTE_SOURCES) epath_conv_088_SOURCES = epath_conv_088.c nodist_epath_conv_088_SOURCES = $(REMOTE_SOURCES) epath_conv_089_SOURCES = epath_conv_089.c nodist_epath_conv_089_SOURCES = $(REMOTE_SOURCES) epath_conv_090_SOURCES = epath_conv_090.c nodist_epath_conv_090_SOURCES = $(REMOTE_SOURCES) epath_conv_091_SOURCES = epath_conv_091.c nodist_epath_conv_091_SOURCES = $(REMOTE_SOURCES) epath_conv_092_SOURCES = epath_conv_092.c nodist_epath_conv_092_SOURCES = $(REMOTE_SOURCES) epath_conv_093_SOURCES = epath_conv_093.c nodist_epath_conv_093_SOURCES = $(REMOTE_SOURCES) epath_conv_094_SOURCES = epath_conv_094.c nodist_epath_conv_094_SOURCES = $(REMOTE_SOURCES) epath_conv_095_SOURCES = epath_conv_095.c nodist_epath_conv_095_SOURCES = $(REMOTE_SOURCES) epath_conv_096_SOURCES = epath_conv_096.c nodist_epath_conv_096_SOURCES = $(REMOTE_SOURCES) epath_conv_097_SOURCES = epath_conv_097.c nodist_epath_conv_097_SOURCES = $(REMOTE_SOURCES) epath_conv_098_SOURCES = epath_conv_098.c nodist_epath_conv_098_SOURCES = $(REMOTE_SOURCES) epath_conv_099_SOURCES = epath_conv_099.c nodist_epath_conv_099_SOURCES = $(REMOTE_SOURCES) epath_conv_100_SOURCES = epath_conv_100.c nodist_epath_conv_100_SOURCES = $(REMOTE_SOURCES) epath_conv_101_SOURCES = epath_conv_101.c nodist_epath_conv_101_SOURCES = $(REMOTE_SOURCES) ep_cmp_000_SOURCES = ep_cmp_000.c nodist_ep_cmp_000_SOURCES = $(REMOTE_SOURCES) ep_cmp_001_SOURCES = ep_cmp_001.c nodist_ep_cmp_001_SOURCES = $(REMOTE_SOURCES) ep_cmp_002_SOURCES = ep_cmp_002.c nodist_ep_cmp_002_SOURCES = $(REMOTE_SOURCES) ep_cmp_003_SOURCES = ep_cmp_003.c nodist_ep_cmp_003_SOURCES = $(REMOTE_SOURCES) ep_cmp_004_SOURCES = ep_cmp_004.c nodist_ep_cmp_004_SOURCES = $(REMOTE_SOURCES) ep_cmp_005_SOURCES = ep_cmp_005.c nodist_ep_cmp_005_SOURCES = $(REMOTE_SOURCES) ep_cmp_006_SOURCES = ep_cmp_006.c nodist_ep_cmp_006_SOURCES = $(REMOTE_SOURCES) ep_cmp_007_SOURCES = ep_cmp_007.c nodist_ep_cmp_007_SOURCES = $(REMOTE_SOURCES) ep_cmp_008_SOURCES = ep_cmp_008.c nodist_ep_cmp_008_SOURCES = $(REMOTE_SOURCES) ep_cmp_009_SOURCES = ep_cmp_009.c nodist_ep_cmp_009_SOURCES = $(REMOTE_SOURCES) ep_cmp_010_SOURCES = ep_cmp_010.c nodist_ep_cmp_010_SOURCES = $(REMOTE_SOURCES) ep_cmp_011_SOURCES = ep_cmp_011.c nodist_ep_cmp_011_SOURCES = $(REMOTE_SOURCES) ep_concat_000_SOURCES = ep_concat_000.c nodist_ep_concat_000_SOURCES = $(REMOTE_SOURCES) ep_concat_001_SOURCES = ep_concat_001.c nodist_ep_concat_001_SOURCES = $(REMOTE_SOURCES) ep_concat_002_SOURCES = ep_concat_002.c nodist_ep_concat_002_SOURCES = $(REMOTE_SOURCES) ep_concat_003_SOURCES = ep_concat_003.c nodist_ep_concat_003_SOURCES = $(REMOTE_SOURCES) ep_concat_004_SOURCES = ep_concat_004.c nodist_ep_concat_004_SOURCES = $(REMOTE_SOURCES) ep_concat_005_SOURCES = ep_concat_005.c nodist_ep_concat_005_SOURCES = $(REMOTE_SOURCES) ep_concat_006_SOURCES = ep_concat_006.c nodist_ep_concat_006_SOURCES = $(REMOTE_SOURCES) ep_concat_007_SOURCES = ep_concat_007.c nodist_ep_concat_007_SOURCES = $(REMOTE_SOURCES) ep_concat_008_SOURCES = ep_concat_008.c nodist_ep_concat_008_SOURCES = $(REMOTE_SOURCES) ep_concat_009_SOURCES = ep_concat_009.c nodist_ep_concat_009_SOURCES = $(REMOTE_SOURCES) ep_concat_010_SOURCES = ep_concat_010.c nodist_ep_concat_010_SOURCES = $(REMOTE_SOURCES) ep_concat_011_SOURCES = ep_concat_011.c nodist_ep_concat_011_SOURCES = $(REMOTE_SOURCES) ep_concat_012_SOURCES = ep_concat_012.c nodist_ep_concat_012_SOURCES = $(REMOTE_SOURCES) ep_concat_013_SOURCES = ep_concat_013.c nodist_ep_concat_013_SOURCES = $(REMOTE_SOURCES) ep_concat_014_SOURCES = ep_concat_014.c nodist_ep_concat_014_SOURCES = $(REMOTE_SOURCES) ep_concat_015_SOURCES = ep_concat_015.c nodist_ep_concat_015_SOURCES = $(REMOTE_SOURCES) ep_derive_001_SOURCES = ep_derive_001.c nodist_ep_derive_001_SOURCES = $(REMOTE_SOURCES) set_ep_loc_000_SOURCES = set_ep_loc_000.c nodist_set_ep_loc_000_SOURCES = $(REMOTE_SOURCES) set_ep_loc_001_SOURCES = set_ep_loc_001.c nodist_set_ep_loc_001_SOURCES = $(REMOTE_SOURCES) set_ep_loc_002_SOURCES = set_ep_loc_002.c nodist_set_ep_loc_002_SOURCES = $(REMOTE_SOURCES) set_ep_loc_003_SOURCES = set_ep_loc_003.c nodist_set_ep_loc_003_SOURCES = $(REMOTE_SOURCES) set_ep_loc_004_SOURCES = set_ep_loc_004.c nodist_set_ep_loc_004_SOURCES = $(REMOTE_SOURCES) set_ep_loc_005_SOURCES = set_ep_loc_005.c nodist_set_ep_loc_005_SOURCES = $(REMOTE_SOURCES) set_ep_loc_006_SOURCES = set_ep_loc_006.c nodist_set_ep_loc_006_SOURCES = $(REMOTE_SOURCES) set_ep_loc_007_SOURCES = set_ep_loc_007.c nodist_set_ep_loc_007_SOURCES = $(REMOTE_SOURCES) set_ep_loc_008_SOURCES = set_ep_loc_008.c nodist_set_ep_loc_008_SOURCES = $(REMOTE_SOURCES) set_ep_loc_009_SOURCES = set_ep_loc_009.c nodist_set_ep_loc_009_SOURCES = $(REMOTE_SOURCES) set_ep_loc_010_SOURCES = set_ep_loc_010.c nodist_set_ep_loc_010_SOURCES = $(REMOTE_SOURCES) set_ep_loc_011_SOURCES = set_ep_loc_011.c nodist_set_ep_loc_011_SOURCES = $(REMOTE_SOURCES) set_ep_loc_012_SOURCES = set_ep_loc_012.c nodist_set_ep_loc_012_SOURCES = $(REMOTE_SOURCES) set_ep_loc_013_SOURCES = set_ep_loc_013.c nodist_set_ep_loc_013_SOURCES = $(REMOTE_SOURCES) print_ep_000_SOURCES = print_ep_000.c nodist_print_ep_000_SOURCES = $(REMOTE_SOURCES) print_ep_001_SOURCES = print_ep_001.c nodist_print_ep_001_SOURCES = $(REMOTE_SOURCES) print_ep_002_SOURCES = print_ep_002.c nodist_print_ep_002_SOURCES = $(REMOTE_SOURCES) print_ep_003_SOURCES = print_ep_003.c nodist_print_ep_003_SOURCES = $(REMOTE_SOURCES) print_ep_004_SOURCES = print_ep_004.c nodist_print_ep_004_SOURCES = $(REMOTE_SOURCES) print_ep_005_SOURCES = print_ep_005.c nodist_print_ep_005_SOURCES = $(REMOTE_SOURCES) epath_pattern_000_SOURCES = epath_pattern_000.c nodist_epath_pattern_000_SOURCES = $(REMOTE_SOURCES) epath_pattern_001_SOURCES = epath_pattern_001.c nodist_epath_pattern_001_SOURCES = $(REMOTE_SOURCES) epath_pattern_002_SOURCES = epath_pattern_002.c nodist_epath_pattern_002_SOURCES = $(REMOTE_SOURCES) epath_pattern_003_SOURCES = epath_pattern_003.c nodist_epath_pattern_003_SOURCES = $(REMOTE_SOURCES) epath_pattern_004_SOURCES = epath_pattern_004.c nodist_epath_pattern_004_SOURCES = $(REMOTE_SOURCES) epath_pattern_005_SOURCES = epath_pattern_005.c nodist_epath_pattern_005_SOURCES = $(REMOTE_SOURCES) epath_pattern_006_SOURCES = epath_pattern_006.c nodist_epath_pattern_006_SOURCES = $(REMOTE_SOURCES) epath_pattern_007_SOURCES = epath_pattern_007.c nodist_epath_pattern_007_SOURCES = $(REMOTE_SOURCES) epath_pattern_008_SOURCES = epath_pattern_008.c nodist_epath_pattern_008_SOURCES = $(REMOTE_SOURCES) epath_pattern_009_SOURCES = epath_pattern_009.c nodist_epath_pattern_009_SOURCES = $(REMOTE_SOURCES) epath_pattern_010_SOURCES = epath_pattern_010.c nodist_epath_pattern_010_SOURCES = $(REMOTE_SOURCES) epath_pattern_011_SOURCES = epath_pattern_011.c nodist_epath_pattern_011_SOURCES = $(REMOTE_SOURCES) epath_pattern_012_SOURCES = epath_pattern_012.c nodist_epath_pattern_012_SOURCES = $(REMOTE_SOURCES) epath_pattern_013_SOURCES = epath_pattern_013.c nodist_epath_pattern_013_SOURCES = $(REMOTE_SOURCES) epath_pattern_014_SOURCES = epath_pattern_014.c nodist_epath_pattern_014_SOURCES = $(REMOTE_SOURCES) epath_pattern_015_SOURCES = epath_pattern_015.c nodist_epath_pattern_015_SOURCES = $(REMOTE_SOURCES) epath_pattern_016_SOURCES = epath_pattern_016.c nodist_epath_pattern_016_SOURCES = $(REMOTE_SOURCES) epath_pattern_017_SOURCES = epath_pattern_017.c nodist_epath_pattern_017_SOURCES = $(REMOTE_SOURCES) epath_pattern_018_SOURCES = epath_pattern_018.c nodist_epath_pattern_018_SOURCES = $(REMOTE_SOURCES) epath_pattern_019_SOURCES = epath_pattern_019.c nodist_epath_pattern_019_SOURCES = $(REMOTE_SOURCES) epath_pattern_020_SOURCES = epath_pattern_020.c nodist_epath_pattern_020_SOURCES = $(REMOTE_SOURCES) epath_pattern_021_SOURCES = epath_pattern_021.c nodist_epath_pattern_021_SOURCES = $(REMOTE_SOURCES) epath_pattern_022_SOURCES = epath_pattern_022.c nodist_epath_pattern_022_SOURCES = $(REMOTE_SOURCES) epath_pattern_023_SOURCES = epath_pattern_023.c nodist_epath_pattern_023_SOURCES = $(REMOTE_SOURCES) epath_pattern_024_SOURCES = epath_pattern_024.c nodist_epath_pattern_024_SOURCES = $(REMOTE_SOURCES) epath_pattern_025_SOURCES = epath_pattern_025.c nodist_epath_pattern_025_SOURCES = $(REMOTE_SOURCES) epath_pattern_026_SOURCES = epath_pattern_026.c nodist_epath_pattern_026_SOURCES = $(REMOTE_SOURCES) epath_pattern_027_SOURCES = epath_pattern_027.c nodist_epath_pattern_027_SOURCES = $(REMOTE_SOURCES) epath_pattern_028_SOURCES = epath_pattern_028.c nodist_epath_pattern_028_SOURCES = $(REMOTE_SOURCES) epath_pattern_029_SOURCES = epath_pattern_029.c nodist_epath_pattern_029_SOURCES = $(REMOTE_SOURCES) epath_pattern_030_SOURCES = epath_pattern_030.c nodist_epath_pattern_030_SOURCES = $(REMOTE_SOURCES) epath_pattern_031_SOURCES = epath_pattern_031.c nodist_epath_pattern_031_SOURCES = $(REMOTE_SOURCES) epath_pattern_032_SOURCES = epath_pattern_032.c nodist_epath_pattern_032_SOURCES = $(REMOTE_SOURCES) epath_pattern_033_SOURCES = epath_pattern_033.c nodist_epath_pattern_033_SOURCES = $(REMOTE_SOURCES) epath_pattern_034_SOURCES = epath_pattern_034.c nodist_epath_pattern_034_SOURCES = $(REMOTE_SOURCES) epath_pattern_035_SOURCES = epath_pattern_035.c nodist_epath_pattern_035_SOURCES = $(REMOTE_SOURCES) epath_pattern_036_SOURCES = epath_pattern_036.c nodist_epath_pattern_036_SOURCES = $(REMOTE_SOURCES) epath_pattern_037_SOURCES = epath_pattern_037.c nodist_epath_pattern_037_SOURCES = $(REMOTE_SOURCES) epath_pattern_038_SOURCES = epath_pattern_038.c nodist_epath_pattern_038_SOURCES = $(REMOTE_SOURCES) epath_pattern_039_SOURCES = epath_pattern_039.c nodist_epath_pattern_039_SOURCES = $(REMOTE_SOURCES) epath_pattern_040_SOURCES = epath_pattern_040.c nodist_epath_pattern_040_SOURCES = $(REMOTE_SOURCES) epath_pattern_041_SOURCES = epath_pattern_041.c nodist_epath_pattern_041_SOURCES = $(REMOTE_SOURCES) epath_pattern_042_SOURCES = epath_pattern_042.c nodist_epath_pattern_042_SOURCES = $(REMOTE_SOURCES) epath_pattern_043_SOURCES = epath_pattern_043.c nodist_epath_pattern_043_SOURCES = $(REMOTE_SOURCES) epath_pattern_044_SOURCES = epath_pattern_044.c nodist_epath_pattern_044_SOURCES = $(REMOTE_SOURCES) epath_pattern_045_SOURCES = epath_pattern_045.c nodist_epath_pattern_045_SOURCES = $(REMOTE_SOURCES) epath_pattern_046_SOURCES = epath_pattern_046.c nodist_epath_pattern_046_SOURCES = $(REMOTE_SOURCES) epath_pattern_047_SOURCES = epath_pattern_047.c nodist_epath_pattern_047_SOURCES = $(REMOTE_SOURCES) epath_pattern_048_SOURCES = epath_pattern_048.c nodist_epath_pattern_048_SOURCES = $(REMOTE_SOURCES) epath_pattern_049_SOURCES = epath_pattern_049.c nodist_epath_pattern_049_SOURCES = $(REMOTE_SOURCES) epath_pattern_050_SOURCES = epath_pattern_050.c nodist_epath_pattern_050_SOURCES = $(REMOTE_SOURCES) epath_pattern_051_SOURCES = epath_pattern_051.c nodist_epath_pattern_051_SOURCES = $(REMOTE_SOURCES) epath_pattern_052_SOURCES = epath_pattern_052.c nodist_epath_pattern_052_SOURCES = $(REMOTE_SOURCES) epath_pattern_053_SOURCES = epath_pattern_053.c nodist_epath_pattern_053_SOURCES = $(REMOTE_SOURCES) epath_pattern_054_SOURCES = epath_pattern_054.c nodist_epath_pattern_054_SOURCES = $(REMOTE_SOURCES) epath_pattern_055_SOURCES = epath_pattern_055.c nodist_epath_pattern_055_SOURCES = $(REMOTE_SOURCES) epath_pattern_056_SOURCES = epath_pattern_056.c nodist_epath_pattern_056_SOURCES = $(REMOTE_SOURCES) epath_pattern_057_SOURCES = epath_pattern_057.c nodist_epath_pattern_057_SOURCES = $(REMOTE_SOURCES) epath_pattern_058_SOURCES = epath_pattern_058.c nodist_epath_pattern_058_SOURCES = $(REMOTE_SOURCES) epath_pattern_059_SOURCES = epath_pattern_059.c nodist_epath_pattern_059_SOURCES = $(REMOTE_SOURCES) epath_pattern_060_SOURCES = epath_pattern_060.c nodist_epath_pattern_060_SOURCES = $(REMOTE_SOURCES) epath_pattern_061_SOURCES = epath_pattern_061.c nodist_epath_pattern_061_SOURCES = $(REMOTE_SOURCES) epath_pattern_062_SOURCES = epath_pattern_062.c nodist_epath_pattern_062_SOURCES = $(REMOTE_SOURCES) epath_pattern_063_SOURCES = epath_pattern_063.c nodist_epath_pattern_063_SOURCES = $(REMOTE_SOURCES) epath_pattern_064_SOURCES = epath_pattern_064.c nodist_epath_pattern_064_SOURCES = $(REMOTE_SOURCES) epath_pattern_065_SOURCES = epath_pattern_065.c nodist_epath_pattern_065_SOURCES = $(REMOTE_SOURCES) epath_pattern_066_SOURCES = epath_pattern_066.c nodist_epath_pattern_066_SOURCES = $(REMOTE_SOURCES) epath_pattern_067_SOURCES = epath_pattern_067.c nodist_epath_pattern_067_SOURCES = $(REMOTE_SOURCES) epath_pattern_068_SOURCES = epath_pattern_068.c nodist_epath_pattern_068_SOURCES = $(REMOTE_SOURCES) epath_pattern_069_SOURCES = epath_pattern_069.c nodist_epath_pattern_069_SOURCES = $(REMOTE_SOURCES) epath_pattern_070_SOURCES = epath_pattern_070.c nodist_epath_pattern_070_SOURCES = $(REMOTE_SOURCES) epath_pattern_071_SOURCES = epath_pattern_071.c nodist_epath_pattern_071_SOURCES = $(REMOTE_SOURCES) epath_pattern_072_SOURCES = epath_pattern_072.c nodist_epath_pattern_072_SOURCES = $(REMOTE_SOURCES) epath_pattern_073_SOURCES = epath_pattern_073.c nodist_epath_pattern_073_SOURCES = $(REMOTE_SOURCES) epath_pattern_074_SOURCES = epath_pattern_074.c nodist_epath_pattern_074_SOURCES = $(REMOTE_SOURCES) epath_pattern_075_SOURCES = epath_pattern_075.c nodist_epath_pattern_075_SOURCES = $(REMOTE_SOURCES) epath_pattern_076_SOURCES = epath_pattern_076.c nodist_epath_pattern_076_SOURCES = $(REMOTE_SOURCES) epath_pattern_077_SOURCES = epath_pattern_077.c nodist_epath_pattern_077_SOURCES = $(REMOTE_SOURCES) epath_pattern_078_SOURCES = epath_pattern_078.c nodist_epath_pattern_078_SOURCES = $(REMOTE_SOURCES) epath_pattern_079_SOURCES = epath_pattern_079.c nodist_epath_pattern_079_SOURCES = $(REMOTE_SOURCES) epath_pattern_080_SOURCES = epath_pattern_080.c nodist_epath_pattern_080_SOURCES = $(REMOTE_SOURCES) epath_pattern_081_SOURCES = epath_pattern_081.c nodist_epath_pattern_081_SOURCES = $(REMOTE_SOURCES) epath_pattern_082_SOURCES = epath_pattern_082.c nodist_epath_pattern_082_SOURCES = $(REMOTE_SOURCES) epath_pattern_083_SOURCES = epath_pattern_083.c nodist_epath_pattern_083_SOURCES = $(REMOTE_SOURCES) epath_pattern_084_SOURCES = epath_pattern_084.c nodist_epath_pattern_084_SOURCES = $(REMOTE_SOURCES) epath_pattern_085_SOURCES = epath_pattern_085.c nodist_epath_pattern_085_SOURCES = $(REMOTE_SOURCES) epath_pattern_086_SOURCES = epath_pattern_086.c nodist_epath_pattern_086_SOURCES = $(REMOTE_SOURCES) epath_pattern_087_SOURCES = epath_pattern_087.c nodist_epath_pattern_087_SOURCES = $(REMOTE_SOURCES) epath_pattern_088_SOURCES = epath_pattern_088.c nodist_epath_pattern_088_SOURCES = $(REMOTE_SOURCES) epath_pattern_089_SOURCES = epath_pattern_089.c nodist_epath_pattern_089_SOURCES = $(REMOTE_SOURCES) epath_pattern_090_SOURCES = epath_pattern_090.c nodist_epath_pattern_090_SOURCES = $(REMOTE_SOURCES) epath_pattern_091_SOURCES = epath_pattern_091.c nodist_epath_pattern_091_SOURCES = $(REMOTE_SOURCES) epath_pattern_092_SOURCES = epath_pattern_092.c nodist_epath_pattern_092_SOURCES = $(REMOTE_SOURCES) epath_pattern_093_SOURCES = epath_pattern_093.c nodist_epath_pattern_093_SOURCES = $(REMOTE_SOURCES) epath_pattern_094_SOURCES = epath_pattern_094.c nodist_epath_pattern_094_SOURCES = $(REMOTE_SOURCES) epath_pattern_095_SOURCES = epath_pattern_095.c nodist_epath_pattern_095_SOURCES = $(REMOTE_SOURCES) epath_pattern_096_SOURCES = epath_pattern_096.c nodist_epath_pattern_096_SOURCES = $(REMOTE_SOURCES) epath_pattern_097_SOURCES = epath_pattern_097.c nodist_epath_pattern_097_SOURCES = $(REMOTE_SOURCES) epath_pattern_098_SOURCES = epath_pattern_098.c nodist_epath_pattern_098_SOURCES = $(REMOTE_SOURCES) epath_pattern_099_SOURCES = epath_pattern_099.c nodist_epath_pattern_099_SOURCES = $(REMOTE_SOURCES) epath_pattern_100_SOURCES = epath_pattern_100.c nodist_epath_pattern_100_SOURCES = $(REMOTE_SOURCES) epath_pattern_101_SOURCES = epath_pattern_101.c nodist_epath_pattern_101_SOURCES = $(REMOTE_SOURCES) epath_pattern_102_SOURCES = epath_pattern_102.c nodist_epath_pattern_102_SOURCES = $(REMOTE_SOURCES) epath_pattern_103_SOURCES = epath_pattern_103.c nodist_epath_pattern_103_SOURCES = $(REMOTE_SOURCES) epath_pattern_104_SOURCES = epath_pattern_104.c nodist_epath_pattern_104_SOURCES = $(REMOTE_SOURCES) epath_pattern_105_SOURCES = epath_pattern_105.c nodist_epath_pattern_105_SOURCES = $(REMOTE_SOURCES) epath_pattern_106_SOURCES = epath_pattern_106.c nodist_epath_pattern_106_SOURCES = $(REMOTE_SOURCES) epath_pattern_107_SOURCES = epath_pattern_107.c nodist_epath_pattern_107_SOURCES = $(REMOTE_SOURCES) epath_pattern_108_SOURCES = epath_pattern_108.c nodist_epath_pattern_108_SOURCES = $(REMOTE_SOURCES) epath_pattern_109_SOURCES = epath_pattern_109.c nodist_epath_pattern_109_SOURCES = $(REMOTE_SOURCES) epath_pattern_110_SOURCES = epath_pattern_110.c nodist_epath_pattern_110_SOURCES = $(REMOTE_SOURCES) epath_pattern_111_SOURCES = epath_pattern_111.c nodist_epath_pattern_111_SOURCES = $(REMOTE_SOURCES) epath_pattern_112_SOURCES = epath_pattern_112.c nodist_epath_pattern_112_SOURCES = $(REMOTE_SOURCES) epath_pattern_113_SOURCES = epath_pattern_113.c nodist_epath_pattern_113_SOURCES = $(REMOTE_SOURCES) epath_pattern_114_SOURCES = epath_pattern_114.c nodist_epath_pattern_114_SOURCES = $(REMOTE_SOURCES) epath_pattern_115_SOURCES = epath_pattern_115.c nodist_epath_pattern_115_SOURCES = $(REMOTE_SOURCES) epath_pattern_116_SOURCES = epath_pattern_116.c nodist_epath_pattern_116_SOURCES = $(REMOTE_SOURCES) epath_pattern_117_SOURCES = epath_pattern_117.c nodist_epath_pattern_117_SOURCES = $(REMOTE_SOURCES) epath_pattern_118_SOURCES = epath_pattern_118.c nodist_epath_pattern_118_SOURCES = $(REMOTE_SOURCES) epath_pattern_119_SOURCES = epath_pattern_119.c nodist_epath_pattern_119_SOURCES = $(REMOTE_SOURCES) epath_pattern_120_SOURCES = epath_pattern_120.c nodist_epath_pattern_120_SOURCES = $(REMOTE_SOURCES) epath_pattern_121_SOURCES = epath_pattern_121.c nodist_epath_pattern_121_SOURCES = $(REMOTE_SOURCES) epath_pattern_122_SOURCES = epath_pattern_122.c nodist_epath_pattern_122_SOURCES = $(REMOTE_SOURCES) epath_pattern_123_SOURCES = epath_pattern_123.c nodist_epath_pattern_123_SOURCES = $(REMOTE_SOURCES) epath_pattern_124_SOURCES = epath_pattern_124.c nodist_epath_pattern_124_SOURCES = $(REMOTE_SOURCES) epath_pattern_125_SOURCES = epath_pattern_125.c nodist_epath_pattern_125_SOURCES = $(REMOTE_SOURCES) epath_pattern_126_SOURCES = epath_pattern_126.c nodist_epath_pattern_126_SOURCES = $(REMOTE_SOURCES) epath_pattern_127_SOURCES = epath_pattern_127.c nodist_epath_pattern_127_SOURCES = $(REMOTE_SOURCES) epath_pattern_128_SOURCES = epath_pattern_128.c nodist_epath_pattern_128_SOURCES = $(REMOTE_SOURCES) epath_pattern_129_SOURCES = epath_pattern_129.c nodist_epath_pattern_129_SOURCES = $(REMOTE_SOURCES) epath_pattern_130_SOURCES = epath_pattern_130.c nodist_epath_pattern_130_SOURCES = $(REMOTE_SOURCES) epath_pattern_131_SOURCES = epath_pattern_131.c nodist_epath_pattern_131_SOURCES = $(REMOTE_SOURCES) epath_pattern_132_SOURCES = epath_pattern_132.c nodist_epath_pattern_132_SOURCES = $(REMOTE_SOURCES) epath_pattern_133_SOURCES = epath_pattern_133.c nodist_epath_pattern_133_SOURCES = $(REMOTE_SOURCES) epath_pattern_134_SOURCES = epath_pattern_134.c nodist_epath_pattern_134_SOURCES = $(REMOTE_SOURCES) epath_pattern_135_SOURCES = epath_pattern_135.c nodist_epath_pattern_135_SOURCES = $(REMOTE_SOURCES) epath_pattern_136_SOURCES = epath_pattern_136.c nodist_epath_pattern_136_SOURCES = $(REMOTE_SOURCES) epath_pattern_137_SOURCES = epath_pattern_137.c nodist_epath_pattern_137_SOURCES = $(REMOTE_SOURCES) epath_pattern_138_SOURCES = epath_pattern_138.c nodist_epath_pattern_138_SOURCES = $(REMOTE_SOURCES) epath_pattern_139_SOURCES = epath_pattern_139.c nodist_epath_pattern_139_SOURCES = $(REMOTE_SOURCES) epath_pattern_140_SOURCES = epath_pattern_140.c nodist_epath_pattern_140_SOURCES = $(REMOTE_SOURCES) epath_pattern_141_SOURCES = epath_pattern_141.c nodist_epath_pattern_141_SOURCES = $(REMOTE_SOURCES) epath_pattern_142_SOURCES = epath_pattern_142.c nodist_epath_pattern_142_SOURCES = $(REMOTE_SOURCES) epath_pattern_143_SOURCES = epath_pattern_143.c nodist_epath_pattern_143_SOURCES = $(REMOTE_SOURCES) epath_pattern_144_SOURCES = epath_pattern_144.c nodist_epath_pattern_144_SOURCES = $(REMOTE_SOURCES) epath_pattern_145_SOURCES = epath_pattern_145.c nodist_epath_pattern_145_SOURCES = $(REMOTE_SOURCES) epath_pattern_146_SOURCES = epath_pattern_146.c nodist_epath_pattern_146_SOURCES = $(REMOTE_SOURCES) epath_pattern_147_SOURCES = epath_pattern_147.c nodist_epath_pattern_147_SOURCES = $(REMOTE_SOURCES) epath_pattern_148_SOURCES = epath_pattern_148.c nodist_epath_pattern_148_SOURCES = $(REMOTE_SOURCES) epath_pattern_149_SOURCES = epath_pattern_149.c nodist_epath_pattern_149_SOURCES = $(REMOTE_SOURCES) epath_pattern_150_SOURCES = epath_pattern_150.c nodist_epath_pattern_150_SOURCES = $(REMOTE_SOURCES) epath_pattern_151_SOURCES = epath_pattern_151.c nodist_epath_pattern_151_SOURCES = $(REMOTE_SOURCES) epath_pattern_152_SOURCES = epath_pattern_152.c nodist_epath_pattern_152_SOURCES = $(REMOTE_SOURCES) epath_pattern_153_SOURCES = epath_pattern_153.c nodist_epath_pattern_153_SOURCES = $(REMOTE_SOURCES) epath_pattern_154_SOURCES = epath_pattern_154.c nodist_epath_pattern_154_SOURCES = $(REMOTE_SOURCES) epath_pattern_155_SOURCES = epath_pattern_155.c nodist_epath_pattern_155_SOURCES = $(REMOTE_SOURCES) epath_pattern_156_SOURCES = epath_pattern_156.c nodist_epath_pattern_156_SOURCES = $(REMOTE_SOURCES) epath_pattern_157_SOURCES = epath_pattern_157.c nodist_epath_pattern_157_SOURCES = $(REMOTE_SOURCES) epath_pattern_158_SOURCES = epath_pattern_158.c nodist_epath_pattern_158_SOURCES = $(REMOTE_SOURCES) epath_pattern_159_SOURCES = epath_pattern_159.c nodist_epath_pattern_159_SOURCES = $(REMOTE_SOURCES) epath_pattern_160_SOURCES = epath_pattern_160.c nodist_epath_pattern_160_SOURCES = $(REMOTE_SOURCES) epath_pattern_161_SOURCES = epath_pattern_161.c nodist_epath_pattern_161_SOURCES = $(REMOTE_SOURCES) epath_pattern_162_SOURCES = epath_pattern_162.c nodist_epath_pattern_162_SOURCES = $(REMOTE_SOURCES) epath_pattern_163_SOURCES = epath_pattern_163.c nodist_epath_pattern_163_SOURCES = $(REMOTE_SOURCES) epath_pattern_164_SOURCES = epath_pattern_164.c nodist_epath_pattern_164_SOURCES = $(REMOTE_SOURCES) epath_pattern_165_SOURCES = epath_pattern_165.c nodist_epath_pattern_165_SOURCES = $(REMOTE_SOURCES) epath_pattern_166_SOURCES = epath_pattern_166.c nodist_epath_pattern_166_SOURCES = $(REMOTE_SOURCES) epath_pattern_167_SOURCES = epath_pattern_167.c nodist_epath_pattern_167_SOURCES = $(REMOTE_SOURCES) epath_pattern_168_SOURCES = epath_pattern_168.c nodist_epath_pattern_168_SOURCES = $(REMOTE_SOURCES) epath_pattern_169_SOURCES = epath_pattern_169.c nodist_epath_pattern_169_SOURCES = $(REMOTE_SOURCES) epath_pattern_170_SOURCES = epath_pattern_170.c nodist_epath_pattern_170_SOURCES = $(REMOTE_SOURCES) epath_pattern_171_SOURCES = epath_pattern_171.c nodist_epath_pattern_171_SOURCES = $(REMOTE_SOURCES) epath_pattern_172_SOURCES = epath_pattern_172.c nodist_epath_pattern_172_SOURCES = $(REMOTE_SOURCES) epath_pattern_173_SOURCES = epath_pattern_173.c nodist_epath_pattern_173_SOURCES = $(REMOTE_SOURCES) epath_pattern_174_SOURCES = epath_pattern_174.c nodist_epath_pattern_174_SOURCES = $(REMOTE_SOURCES) epath_pattern_175_SOURCES = epath_pattern_175.c nodist_epath_pattern_175_SOURCES = $(REMOTE_SOURCES) epath_pattern_176_SOURCES = epath_pattern_176.c nodist_epath_pattern_176_SOURCES = $(REMOTE_SOURCES) epath_pattern_177_SOURCES = epath_pattern_177.c nodist_epath_pattern_177_SOURCES = $(REMOTE_SOURCES) epath_pattern_178_SOURCES = epath_pattern_178.c nodist_epath_pattern_178_SOURCES = $(REMOTE_SOURCES) epath_pattern_179_SOURCES = epath_pattern_179.c nodist_epath_pattern_179_SOURCES = $(REMOTE_SOURCES) epath_pattern_180_SOURCES = epath_pattern_180.c nodist_epath_pattern_180_SOURCES = $(REMOTE_SOURCES) epath_pattern_181_SOURCES = epath_pattern_181.c nodist_epath_pattern_181_SOURCES = $(REMOTE_SOURCES) epath_pattern_182_SOURCES = epath_pattern_182.c nodist_epath_pattern_182_SOURCES = $(REMOTE_SOURCES) epath_pattern_183_SOURCES = epath_pattern_183.c nodist_epath_pattern_183_SOURCES = $(REMOTE_SOURCES) epath_pattern_184_SOURCES = epath_pattern_184.c nodist_epath_pattern_184_SOURCES = $(REMOTE_SOURCES) epath_pattern_185_SOURCES = epath_pattern_185.c nodist_epath_pattern_185_SOURCES = $(REMOTE_SOURCES) epath_pattern_186_SOURCES = epath_pattern_186.c nodist_epath_pattern_186_SOURCES = $(REMOTE_SOURCES) epath_pattern_187_SOURCES = epath_pattern_187.c nodist_epath_pattern_187_SOURCES = $(REMOTE_SOURCES) epath_pattern_188_SOURCES = epath_pattern_188.c nodist_epath_pattern_188_SOURCES = $(REMOTE_SOURCES) epath_pattern_189_SOURCES = epath_pattern_189.c nodist_epath_pattern_189_SOURCES = $(REMOTE_SOURCES) epath_pattern_190_SOURCES = epath_pattern_190.c nodist_epath_pattern_190_SOURCES = $(REMOTE_SOURCES) epath_pattern_191_SOURCES = epath_pattern_191.c nodist_epath_pattern_191_SOURCES = $(REMOTE_SOURCES) epath_pattern_192_SOURCES = epath_pattern_192.c nodist_epath_pattern_192_SOURCES = $(REMOTE_SOURCES) epath_pattern_193_SOURCES = epath_pattern_193.c nodist_epath_pattern_193_SOURCES = $(REMOTE_SOURCES) epath_pattern_194_SOURCES = epath_pattern_194.c nodist_epath_pattern_194_SOURCES = $(REMOTE_SOURCES) epath_pattern_195_SOURCES = epath_pattern_195.c nodist_epath_pattern_195_SOURCES = $(REMOTE_SOURCES) epath_pattern_196_SOURCES = epath_pattern_196.c nodist_epath_pattern_196_SOURCES = $(REMOTE_SOURCES) epath_pattern_197_SOURCES = epath_pattern_197.c nodist_epath_pattern_197_SOURCES = $(REMOTE_SOURCES) epath_pattern_198_SOURCES = epath_pattern_198.c nodist_epath_pattern_198_SOURCES = $(REMOTE_SOURCES) epath_pattern_199_SOURCES = epath_pattern_199.c nodist_epath_pattern_199_SOURCES = $(REMOTE_SOURCES) epath_pattern_200_SOURCES = epath_pattern_200.c nodist_epath_pattern_200_SOURCES = $(REMOTE_SOURCES) epath_pattern_201_SOURCES = epath_pattern_201.c nodist_epath_pattern_201_SOURCES = $(REMOTE_SOURCES) epath_pattern_202_SOURCES = epath_pattern_202.c nodist_epath_pattern_202_SOURCES = $(REMOTE_SOURCES) epath_pattern_203_SOURCES = epath_pattern_203.c nodist_epath_pattern_203_SOURCES = $(REMOTE_SOURCES) epath_pattern_204_SOURCES = epath_pattern_204.c nodist_epath_pattern_204_SOURCES = $(REMOTE_SOURCES) epath_pattern_205_SOURCES = epath_pattern_205.c nodist_epath_pattern_205_SOURCES = $(REMOTE_SOURCES) epath_pattern_206_SOURCES = epath_pattern_206.c nodist_epath_pattern_206_SOURCES = $(REMOTE_SOURCES) epath_pattern_207_SOURCES = epath_pattern_207.c nodist_epath_pattern_207_SOURCES = $(REMOTE_SOURCES) epath_pattern_208_SOURCES = epath_pattern_208.c nodist_epath_pattern_208_SOURCES = $(REMOTE_SOURCES) epath_pattern_209_SOURCES = epath_pattern_209.c nodist_epath_pattern_209_SOURCES = $(REMOTE_SOURCES) epath_pattern_210_SOURCES = epath_pattern_210.c nodist_epath_pattern_210_SOURCES = $(REMOTE_SOURCES) epath_pattern_211_SOURCES = epath_pattern_211.c nodist_epath_pattern_211_SOURCES = $(REMOTE_SOURCES) epath_pattern_212_SOURCES = epath_pattern_212.c nodist_epath_pattern_212_SOURCES = $(REMOTE_SOURCES) epath_pattern_213_SOURCES = epath_pattern_213.c nodist_epath_pattern_213_SOURCES = $(REMOTE_SOURCES) epath_pattern_214_SOURCES = epath_pattern_214.c nodist_epath_pattern_214_SOURCES = $(REMOTE_SOURCES) epath_pattern_215_SOURCES = epath_pattern_215.c nodist_epath_pattern_215_SOURCES = $(REMOTE_SOURCES) epath_pattern_216_SOURCES = epath_pattern_216.c nodist_epath_pattern_216_SOURCES = $(REMOTE_SOURCES) epath_pattern_217_SOURCES = epath_pattern_217.c nodist_epath_pattern_217_SOURCES = $(REMOTE_SOURCES) epath_pattern_218_SOURCES = epath_pattern_218.c nodist_epath_pattern_218_SOURCES = $(REMOTE_SOURCES) epath_pattern_219_SOURCES = epath_pattern_219.c nodist_epath_pattern_219_SOURCES = $(REMOTE_SOURCES) epath_pattern_220_SOURCES = epath_pattern_220.c nodist_epath_pattern_220_SOURCES = $(REMOTE_SOURCES) epath_pattern_221_SOURCES = epath_pattern_221.c nodist_epath_pattern_221_SOURCES = $(REMOTE_SOURCES) epath_pattern_222_SOURCES = epath_pattern_222.c nodist_epath_pattern_222_SOURCES = $(REMOTE_SOURCES) epath_pattern_223_SOURCES = epath_pattern_223.c nodist_epath_pattern_223_SOURCES = $(REMOTE_SOURCES) epath_pattern_224_SOURCES = epath_pattern_224.c nodist_epath_pattern_224_SOURCES = $(REMOTE_SOURCES) epath_pattern_225_SOURCES = epath_pattern_225.c nodist_epath_pattern_225_SOURCES = $(REMOTE_SOURCES) epath_pattern_226_SOURCES = epath_pattern_226.c nodist_epath_pattern_226_SOURCES = $(REMOTE_SOURCES) epath_pattern_227_SOURCES = epath_pattern_227.c nodist_epath_pattern_227_SOURCES = $(REMOTE_SOURCES) epath_pattern_228_SOURCES = epath_pattern_228.c nodist_epath_pattern_228_SOURCES = $(REMOTE_SOURCES) epath_pattern_229_SOURCES = epath_pattern_229.c nodist_epath_pattern_229_SOURCES = $(REMOTE_SOURCES) epath_pattern_230_SOURCES = epath_pattern_230.c nodist_epath_pattern_230_SOURCES = $(REMOTE_SOURCES) epath_pattern_231_SOURCES = epath_pattern_231.c nodist_epath_pattern_231_SOURCES = $(REMOTE_SOURCES) epath_pattern_232_SOURCES = epath_pattern_232.c nodist_epath_pattern_232_SOURCES = $(REMOTE_SOURCES) epath_pattern_233_SOURCES = epath_pattern_233.c nodist_epath_pattern_233_SOURCES = $(REMOTE_SOURCES) epath_pattern_234_SOURCES = epath_pattern_234.c nodist_epath_pattern_234_SOURCES = $(REMOTE_SOURCES) epath_pattern_235_SOURCES = epath_pattern_235.c nodist_epath_pattern_235_SOURCES = $(REMOTE_SOURCES) epath_pattern_236_SOURCES = epath_pattern_236.c nodist_epath_pattern_236_SOURCES = $(REMOTE_SOURCES) epath_pattern_237_SOURCES = epath_pattern_237.c nodist_epath_pattern_237_SOURCES = $(REMOTE_SOURCES) epath_pattern_238_SOURCES = epath_pattern_238.c nodist_epath_pattern_238_SOURCES = $(REMOTE_SOURCES) epath_pattern_239_SOURCES = epath_pattern_239.c nodist_epath_pattern_239_SOURCES = $(REMOTE_SOURCES) epath_pattern_240_SOURCES = epath_pattern_240.c nodist_epath_pattern_240_SOURCES = $(REMOTE_SOURCES) epath_pattern_241_SOURCES = epath_pattern_241.c nodist_epath_pattern_241_SOURCES = $(REMOTE_SOURCES) epath_pattern_242_SOURCES = epath_pattern_242.c nodist_epath_pattern_242_SOURCES = $(REMOTE_SOURCES) epath_pattern_243_SOURCES = epath_pattern_243.c nodist_epath_pattern_243_SOURCES = $(REMOTE_SOURCES) epath_pattern_244_SOURCES = epath_pattern_244.c nodist_epath_pattern_244_SOURCES = $(REMOTE_SOURCES) epath_pattern_245_SOURCES = epath_pattern_245.c nodist_epath_pattern_245_SOURCES = $(REMOTE_SOURCES) epath_pattern_246_SOURCES = epath_pattern_246.c nodist_epath_pattern_246_SOURCES = $(REMOTE_SOURCES) epath_pattern_247_SOURCES = epath_pattern_247.c nodist_epath_pattern_247_SOURCES = $(REMOTE_SOURCES) epath_pattern_248_SOURCES = epath_pattern_248.c nodist_epath_pattern_248_SOURCES = $(REMOTE_SOURCES) epath_pattern_249_SOURCES = epath_pattern_249.c nodist_epath_pattern_249_SOURCES = $(REMOTE_SOURCES) epath_pattern_250_SOURCES = epath_pattern_250.c nodist_epath_pattern_250_SOURCES = $(REMOTE_SOURCES) epath_pattern_251_SOURCES = epath_pattern_251.c nodist_epath_pattern_251_SOURCES = $(REMOTE_SOURCES) epath_pattern_252_SOURCES = epath_pattern_252.c nodist_epath_pattern_252_SOURCES = $(REMOTE_SOURCES) epath_pattern_253_SOURCES = epath_pattern_253.c nodist_epath_pattern_253_SOURCES = $(REMOTE_SOURCES) epath_pattern_254_SOURCES = epath_pattern_254.c nodist_epath_pattern_254_SOURCES = $(REMOTE_SOURCES) epath_pattern_255_SOURCES = epath_pattern_255.c nodist_epath_pattern_255_SOURCES = $(REMOTE_SOURCES) epath_pattern_256_SOURCES = epath_pattern_256.c nodist_epath_pattern_256_SOURCES = $(REMOTE_SOURCES) epath_pattern_257_SOURCES = epath_pattern_257.c nodist_epath_pattern_257_SOURCES = $(REMOTE_SOURCES) epath_pattern_258_SOURCES = epath_pattern_258.c nodist_epath_pattern_258_SOURCES = $(REMOTE_SOURCES) epath_pattern_259_SOURCES = epath_pattern_259.c nodist_epath_pattern_259_SOURCES = $(REMOTE_SOURCES) epath_pattern_260_SOURCES = epath_pattern_260.c nodist_epath_pattern_260_SOURCES = $(REMOTE_SOURCES) epath_pattern_261_SOURCES = epath_pattern_261.c nodist_epath_pattern_261_SOURCES = $(REMOTE_SOURCES) epath_pattern_262_SOURCES = epath_pattern_262.c nodist_epath_pattern_262_SOURCES = $(REMOTE_SOURCES) epath_pattern_263_SOURCES = epath_pattern_263.c nodist_epath_pattern_263_SOURCES = $(REMOTE_SOURCES) epath_pattern_264_SOURCES = epath_pattern_264.c nodist_epath_pattern_264_SOURCES = $(REMOTE_SOURCES) epath_pattern_265_SOURCES = epath_pattern_265.c nodist_epath_pattern_265_SOURCES = $(REMOTE_SOURCES) epath_pattern_266_SOURCES = epath_pattern_266.c nodist_epath_pattern_266_SOURCES = $(REMOTE_SOURCES) epath_pattern_267_SOURCES = epath_pattern_267.c nodist_epath_pattern_267_SOURCES = $(REMOTE_SOURCES) epath_pattern_268_SOURCES = epath_pattern_268.c nodist_epath_pattern_268_SOURCES = $(REMOTE_SOURCES) epath_pattern_269_SOURCES = epath_pattern_269.c nodist_epath_pattern_269_SOURCES = $(REMOTE_SOURCES) epath_pattern_270_SOURCES = epath_pattern_270.c nodist_epath_pattern_270_SOURCES = $(REMOTE_SOURCES) epath_pattern_271_SOURCES = epath_pattern_271.c nodist_epath_pattern_271_SOURCES = $(REMOTE_SOURCES) epath_pattern_272_SOURCES = epath_pattern_272.c nodist_epath_pattern_272_SOURCES = $(REMOTE_SOURCES) epath_pattern_273_SOURCES = epath_pattern_273.c nodist_epath_pattern_273_SOURCES = $(REMOTE_SOURCES) epath_pattern_274_SOURCES = epath_pattern_274.c nodist_epath_pattern_274_SOURCES = $(REMOTE_SOURCES) epath_pattern_275_SOURCES = epath_pattern_275.c nodist_epath_pattern_275_SOURCES = $(REMOTE_SOURCES) epath_pattern_276_SOURCES = epath_pattern_276.c nodist_epath_pattern_276_SOURCES = $(REMOTE_SOURCES) epath_pattern_277_SOURCES = epath_pattern_277.c nodist_epath_pattern_277_SOURCES = $(REMOTE_SOURCES) epath_pattern_278_SOURCES = epath_pattern_278.c nodist_epath_pattern_278_SOURCES = $(REMOTE_SOURCES) epath_pattern_279_SOURCES = epath_pattern_279.c nodist_epath_pattern_279_SOURCES = $(REMOTE_SOURCES) epath_pattern_280_SOURCES = epath_pattern_280.c nodist_epath_pattern_280_SOURCES = $(REMOTE_SOURCES) epath_pattern_281_SOURCES = epath_pattern_281.c nodist_epath_pattern_281_SOURCES = $(REMOTE_SOURCES) epath_pattern_282_SOURCES = epath_pattern_282.c nodist_epath_pattern_282_SOURCES = $(REMOTE_SOURCES) epath_pattern_283_SOURCES = epath_pattern_283.c nodist_epath_pattern_283_SOURCES = $(REMOTE_SOURCES) epath_pattern_284_SOURCES = epath_pattern_284.c nodist_epath_pattern_284_SOURCES = $(REMOTE_SOURCES) epath_pattern_285_SOURCES = epath_pattern_285.c nodist_epath_pattern_285_SOURCES = $(REMOTE_SOURCES) epath_pattern_286_SOURCES = epath_pattern_286.c nodist_epath_pattern_286_SOURCES = $(REMOTE_SOURCES) epath_pattern_287_SOURCES = epath_pattern_287.c nodist_epath_pattern_287_SOURCES = $(REMOTE_SOURCES) epath_pattern_288_SOURCES = epath_pattern_288.c nodist_epath_pattern_288_SOURCES = $(REMOTE_SOURCES) epath_pattern_289_SOURCES = epath_pattern_289.c nodist_epath_pattern_289_SOURCES = $(REMOTE_SOURCES) epath_pattern_290_SOURCES = epath_pattern_290.c nodist_epath_pattern_290_SOURCES = $(REMOTE_SOURCES) epath_pattern_291_SOURCES = epath_pattern_291.c nodist_epath_pattern_291_SOURCES = $(REMOTE_SOURCES) epath_pattern_292_SOURCES = epath_pattern_292.c nodist_epath_pattern_292_SOURCES = $(REMOTE_SOURCES) epath_pattern_293_SOURCES = epath_pattern_293.c nodist_epath_pattern_293_SOURCES = $(REMOTE_SOURCES) epath_pattern_294_SOURCES = epath_pattern_294.c nodist_epath_pattern_294_SOURCES = $(REMOTE_SOURCES) epath_pattern_295_SOURCES = epath_pattern_295.c nodist_epath_pattern_295_SOURCES = $(REMOTE_SOURCES) epath_pattern_296_SOURCES = epath_pattern_296.c nodist_epath_pattern_296_SOURCES = $(REMOTE_SOURCES) epath_pattern_297_SOURCES = epath_pattern_297.c nodist_epath_pattern_297_SOURCES = $(REMOTE_SOURCES) epath_pattern_298_SOURCES = epath_pattern_298.c nodist_epath_pattern_298_SOURCES = $(REMOTE_SOURCES) epath_pattern_299_SOURCES = epath_pattern_299.c nodist_epath_pattern_299_SOURCES = $(REMOTE_SOURCES) epath_pattern_300_SOURCES = epath_pattern_300.c nodist_epath_pattern_300_SOURCES = $(REMOTE_SOURCES) epath_pattern_301_SOURCES = epath_pattern_301.c nodist_epath_pattern_301_SOURCES = $(REMOTE_SOURCES) epath_pattern_302_SOURCES = epath_pattern_302.c nodist_epath_pattern_302_SOURCES = $(REMOTE_SOURCES) epath_pattern_303_SOURCES = epath_pattern_303.c nodist_epath_pattern_303_SOURCES = $(REMOTE_SOURCES) epath_pattern_304_SOURCES = epath_pattern_304.c nodist_epath_pattern_304_SOURCES = $(REMOTE_SOURCES) epath_pattern_305_SOURCES = epath_pattern_305.c nodist_epath_pattern_305_SOURCES = $(REMOTE_SOURCES) epath_pattern_306_SOURCES = epath_pattern_306.c nodist_epath_pattern_306_SOURCES = $(REMOTE_SOURCES) epath_pattern_307_SOURCES = epath_pattern_307.c nodist_epath_pattern_307_SOURCES = $(REMOTE_SOURCES) epath_pattern_308_SOURCES = epath_pattern_308.c nodist_epath_pattern_308_SOURCES = $(REMOTE_SOURCES) epath_pattern_309_SOURCES = epath_pattern_309.c nodist_epath_pattern_309_SOURCES = $(REMOTE_SOURCES) epath_pattern_310_SOURCES = epath_pattern_310.c nodist_epath_pattern_310_SOURCES = $(REMOTE_SOURCES) epath_pattern_311_SOURCES = epath_pattern_311.c nodist_epath_pattern_311_SOURCES = $(REMOTE_SOURCES) epath_pattern_312_SOURCES = epath_pattern_312.c nodist_epath_pattern_312_SOURCES = $(REMOTE_SOURCES) epath_pattern_313_SOURCES = epath_pattern_313.c nodist_epath_pattern_313_SOURCES = $(REMOTE_SOURCES) epath_pattern_314_SOURCES = epath_pattern_314.c nodist_epath_pattern_314_SOURCES = $(REMOTE_SOURCES) epath_pattern_315_SOURCES = epath_pattern_315.c nodist_epath_pattern_315_SOURCES = $(REMOTE_SOURCES) epath_pattern_316_SOURCES = epath_pattern_316.c nodist_epath_pattern_316_SOURCES = $(REMOTE_SOURCES) epath_pattern_317_SOURCES = epath_pattern_317.c nodist_epath_pattern_317_SOURCES = $(REMOTE_SOURCES) epath_pattern_318_SOURCES = epath_pattern_318.c nodist_epath_pattern_318_SOURCES = $(REMOTE_SOURCES) epath_pattern_319_SOURCES = epath_pattern_319.c nodist_epath_pattern_319_SOURCES = $(REMOTE_SOURCES) epath_pattern_320_SOURCES = epath_pattern_320.c nodist_epath_pattern_320_SOURCES = $(REMOTE_SOURCES) epath_pattern_321_SOURCES = epath_pattern_321.c nodist_epath_pattern_321_SOURCES = $(REMOTE_SOURCES) epath_pattern_322_SOURCES = epath_pattern_322.c nodist_epath_pattern_322_SOURCES = $(REMOTE_SOURCES) epath_pattern_323_SOURCES = epath_pattern_323.c nodist_epath_pattern_323_SOURCES = $(REMOTE_SOURCES) epath_pattern_324_SOURCES = epath_pattern_324.c nodist_epath_pattern_324_SOURCES = $(REMOTE_SOURCES) epath_pattern_325_SOURCES = epath_pattern_325.c nodist_epath_pattern_325_SOURCES = $(REMOTE_SOURCES) epath_pattern_326_SOURCES = epath_pattern_326.c nodist_epath_pattern_326_SOURCES = $(REMOTE_SOURCES) epath_pattern_327_SOURCES = epath_pattern_327.c nodist_epath_pattern_327_SOURCES = $(REMOTE_SOURCES) epath_pattern_328_SOURCES = epath_pattern_328.c nodist_epath_pattern_328_SOURCES = $(REMOTE_SOURCES) epath_pattern_329_SOURCES = epath_pattern_329.c nodist_epath_pattern_329_SOURCES = $(REMOTE_SOURCES) epath_pattern_330_SOURCES = epath_pattern_330.c nodist_epath_pattern_330_SOURCES = $(REMOTE_SOURCES) epath_pattern_331_SOURCES = epath_pattern_331.c nodist_epath_pattern_331_SOURCES = $(REMOTE_SOURCES) epath_pattern_332_SOURCES = epath_pattern_332.c nodist_epath_pattern_332_SOURCES = $(REMOTE_SOURCES) epath_pattern_333_SOURCES = epath_pattern_333.c nodist_epath_pattern_333_SOURCES = $(REMOTE_SOURCES) epath_pattern_334_SOURCES = epath_pattern_334.c nodist_epath_pattern_334_SOURCES = $(REMOTE_SOURCES) epath_pattern_335_SOURCES = epath_pattern_335.c nodist_epath_pattern_335_SOURCES = $(REMOTE_SOURCES) epath_pattern_336_SOURCES = epath_pattern_336.c nodist_epath_pattern_336_SOURCES = $(REMOTE_SOURCES) epath_pattern_337_SOURCES = epath_pattern_337.c nodist_epath_pattern_337_SOURCES = $(REMOTE_SOURCES) epath_pattern_338_SOURCES = epath_pattern_338.c nodist_epath_pattern_338_SOURCES = $(REMOTE_SOURCES) epath_pattern_339_SOURCES = epath_pattern_339.c nodist_epath_pattern_339_SOURCES = $(REMOTE_SOURCES) epath_pattern_340_SOURCES = epath_pattern_340.c nodist_epath_pattern_340_SOURCES = $(REMOTE_SOURCES) epath_pattern_341_SOURCES = epath_pattern_341.c nodist_epath_pattern_341_SOURCES = $(REMOTE_SOURCES) epath_pattern_342_SOURCES = epath_pattern_342.c nodist_epath_pattern_342_SOURCES = $(REMOTE_SOURCES) epath_pattern_343_SOURCES = epath_pattern_343.c nodist_epath_pattern_343_SOURCES = $(REMOTE_SOURCES) epath_pattern_344_SOURCES = epath_pattern_344.c nodist_epath_pattern_344_SOURCES = $(REMOTE_SOURCES) epath_pattern_345_SOURCES = epath_pattern_345.c nodist_epath_pattern_345_SOURCES = $(REMOTE_SOURCES) epath_pattern_346_SOURCES = epath_pattern_346.c nodist_epath_pattern_346_SOURCES = $(REMOTE_SOURCES) epath_pattern_347_SOURCES = epath_pattern_347.c nodist_epath_pattern_347_SOURCES = $(REMOTE_SOURCES) epath_pattern_348_SOURCES = epath_pattern_348.c nodist_epath_pattern_348_SOURCES = $(REMOTE_SOURCES) epath_pattern_349_SOURCES = epath_pattern_349.c nodist_epath_pattern_349_SOURCES = $(REMOTE_SOURCES) epath_pattern_350_SOURCES = epath_pattern_350.c nodist_epath_pattern_350_SOURCES = $(REMOTE_SOURCES) epath_pattern_351_SOURCES = epath_pattern_351.c nodist_epath_pattern_351_SOURCES = $(REMOTE_SOURCES) epath_pattern_352_SOURCES = epath_pattern_352.c nodist_epath_pattern_352_SOURCES = $(REMOTE_SOURCES) epath_pattern_353_SOURCES = epath_pattern_353.c nodist_epath_pattern_353_SOURCES = $(REMOTE_SOURCES) epath_pattern_354_SOURCES = epath_pattern_354.c nodist_epath_pattern_354_SOURCES = $(REMOTE_SOURCES) epath_pattern_355_SOURCES = epath_pattern_355.c nodist_epath_pattern_355_SOURCES = $(REMOTE_SOURCES) epath_pattern_356_SOURCES = epath_pattern_356.c nodist_epath_pattern_356_SOURCES = $(REMOTE_SOURCES) epath_pattern_357_SOURCES = epath_pattern_357.c nodist_epath_pattern_357_SOURCES = $(REMOTE_SOURCES) epath_pattern_358_SOURCES = epath_pattern_358.c nodist_epath_pattern_358_SOURCES = $(REMOTE_SOURCES) epath_pattern_359_SOURCES = epath_pattern_359.c nodist_epath_pattern_359_SOURCES = $(REMOTE_SOURCES) epath_pattern_360_SOURCES = epath_pattern_360.c nodist_epath_pattern_360_SOURCES = $(REMOTE_SOURCES) epath_pattern_361_SOURCES = epath_pattern_361.c nodist_epath_pattern_361_SOURCES = $(REMOTE_SOURCES) epath_pattern_362_SOURCES = epath_pattern_362.c nodist_epath_pattern_362_SOURCES = $(REMOTE_SOURCES) epath_pattern_363_SOURCES = epath_pattern_363.c nodist_epath_pattern_363_SOURCES = $(REMOTE_SOURCES) epath_pattern_364_SOURCES = epath_pattern_364.c nodist_epath_pattern_364_SOURCES = $(REMOTE_SOURCES) epath_pattern_365_SOURCES = epath_pattern_365.c nodist_epath_pattern_365_SOURCES = $(REMOTE_SOURCES) epath_pattern_366_SOURCES = epath_pattern_366.c nodist_epath_pattern_366_SOURCES = $(REMOTE_SOURCES) epath_pattern_367_SOURCES = epath_pattern_367.c nodist_epath_pattern_367_SOURCES = $(REMOTE_SOURCES) epath_pattern_368_SOURCES = epath_pattern_368.c nodist_epath_pattern_368_SOURCES = $(REMOTE_SOURCES) epath_pattern_369_SOURCES = epath_pattern_369.c nodist_epath_pattern_369_SOURCES = $(REMOTE_SOURCES) epath_pattern_370_SOURCES = epath_pattern_370.c nodist_epath_pattern_370_SOURCES = $(REMOTE_SOURCES) epath_pattern_371_SOURCES = epath_pattern_371.c nodist_epath_pattern_371_SOURCES = $(REMOTE_SOURCES) epath_pattern_372_SOURCES = epath_pattern_372.c nodist_epath_pattern_372_SOURCES = $(REMOTE_SOURCES) epath_pattern_373_SOURCES = epath_pattern_373.c nodist_epath_pattern_373_SOURCES = $(REMOTE_SOURCES) epath_pattern_374_SOURCES = epath_pattern_374.c nodist_epath_pattern_374_SOURCES = $(REMOTE_SOURCES) epath_pattern_375_SOURCES = epath_pattern_375.c nodist_epath_pattern_375_SOURCES = $(REMOTE_SOURCES) epath_pattern_376_SOURCES = epath_pattern_376.c nodist_epath_pattern_376_SOURCES = $(REMOTE_SOURCES) epath_pattern_377_SOURCES = epath_pattern_377.c nodist_epath_pattern_377_SOURCES = $(REMOTE_SOURCES) epath_pattern_378_SOURCES = epath_pattern_378.c nodist_epath_pattern_378_SOURCES = $(REMOTE_SOURCES) epath_pattern_379_SOURCES = epath_pattern_379.c nodist_epath_pattern_379_SOURCES = $(REMOTE_SOURCES) epath_pattern_380_SOURCES = epath_pattern_380.c nodist_epath_pattern_380_SOURCES = $(REMOTE_SOURCES) epath_pattern_381_SOURCES = epath_pattern_381.c nodist_epath_pattern_381_SOURCES = $(REMOTE_SOURCES) epath_pattern_382_SOURCES = epath_pattern_382.c nodist_epath_pattern_382_SOURCES = $(REMOTE_SOURCES) epath_pattern_383_SOURCES = epath_pattern_383.c nodist_epath_pattern_383_SOURCES = $(REMOTE_SOURCES) epath_pattern_384_SOURCES = epath_pattern_384.c nodist_epath_pattern_384_SOURCES = $(REMOTE_SOURCES) epath_pattern_385_SOURCES = epath_pattern_385.c nodist_epath_pattern_385_SOURCES = $(REMOTE_SOURCES) epath_pattern_386_SOURCES = epath_pattern_386.c nodist_epath_pattern_386_SOURCES = $(REMOTE_SOURCES) epath_pattern_387_SOURCES = epath_pattern_387.c nodist_epath_pattern_387_SOURCES = $(REMOTE_SOURCES) epath_pattern_388_SOURCES = epath_pattern_388.c nodist_epath_pattern_388_SOURCES = $(REMOTE_SOURCES) epath_pattern_389_SOURCES = epath_pattern_389.c nodist_epath_pattern_389_SOURCES = $(REMOTE_SOURCES) epath_pattern_390_SOURCES = epath_pattern_390.c nodist_epath_pattern_390_SOURCES = $(REMOTE_SOURCES) epath_pattern_391_SOURCES = epath_pattern_391.c nodist_epath_pattern_391_SOURCES = $(REMOTE_SOURCES) epath_pattern_392_SOURCES = epath_pattern_392.c nodist_epath_pattern_392_SOURCES = $(REMOTE_SOURCES) epath_pattern_393_SOURCES = epath_pattern_393.c nodist_epath_pattern_393_SOURCES = $(REMOTE_SOURCES) epath_pattern_394_SOURCES = epath_pattern_394.c nodist_epath_pattern_394_SOURCES = $(REMOTE_SOURCES) epath_pattern_395_SOURCES = epath_pattern_395.c nodist_epath_pattern_395_SOURCES = $(REMOTE_SOURCES) epath_pattern_396_SOURCES = epath_pattern_396.c nodist_epath_pattern_396_SOURCES = $(REMOTE_SOURCES) epath_pattern_397_SOURCES = epath_pattern_397.c nodist_epath_pattern_397_SOURCES = $(REMOTE_SOURCES) epath_pattern_398_SOURCES = epath_pattern_398.c nodist_epath_pattern_398_SOURCES = $(REMOTE_SOURCES) epath_pattern_399_SOURCES = epath_pattern_399.c nodist_epath_pattern_399_SOURCES = $(REMOTE_SOURCES) epath_pattern_400_SOURCES = epath_pattern_400.c nodist_epath_pattern_400_SOURCES = $(REMOTE_SOURCES) epath_pattern_401_SOURCES = epath_pattern_401.c nodist_epath_pattern_401_SOURCES = $(REMOTE_SOURCES) epath_pattern_402_SOURCES = epath_pattern_402.c nodist_epath_pattern_402_SOURCES = $(REMOTE_SOURCES) epath_pattern_403_SOURCES = epath_pattern_403.c nodist_epath_pattern_403_SOURCES = $(REMOTE_SOURCES) epath_pattern_404_SOURCES = epath_pattern_404.c nodist_epath_pattern_404_SOURCES = $(REMOTE_SOURCES) epath_pattern_405_SOURCES = epath_pattern_405.c nodist_epath_pattern_405_SOURCES = $(REMOTE_SOURCES) epath_pattern_406_SOURCES = epath_pattern_406.c nodist_epath_pattern_406_SOURCES = $(REMOTE_SOURCES) epath_pattern_407_SOURCES = epath_pattern_407.c nodist_epath_pattern_407_SOURCES = $(REMOTE_SOURCES) epath_pattern_408_SOURCES = epath_pattern_408.c nodist_epath_pattern_408_SOURCES = $(REMOTE_SOURCES) epath_pattern_409_SOURCES = epath_pattern_409.c nodist_epath_pattern_409_SOURCES = $(REMOTE_SOURCES) epath_pattern_410_SOURCES = epath_pattern_410.c nodist_epath_pattern_410_SOURCES = $(REMOTE_SOURCES) epath_pattern_411_SOURCES = epath_pattern_411.c nodist_epath_pattern_411_SOURCES = $(REMOTE_SOURCES) epath_pattern_412_SOURCES = epath_pattern_412.c nodist_epath_pattern_412_SOURCES = $(REMOTE_SOURCES) epath_pattern_413_SOURCES = epath_pattern_413.c nodist_epath_pattern_413_SOURCES = $(REMOTE_SOURCES) epath_pattern_414_SOURCES = epath_pattern_414.c nodist_epath_pattern_414_SOURCES = $(REMOTE_SOURCES) epath_pattern_415_SOURCES = epath_pattern_415.c nodist_epath_pattern_415_SOURCES = $(REMOTE_SOURCES) epath_pattern_416_SOURCES = epath_pattern_416.c nodist_epath_pattern_416_SOURCES = $(REMOTE_SOURCES) epath_pattern_417_SOURCES = epath_pattern_417.c nodist_epath_pattern_417_SOURCES = $(REMOTE_SOURCES) epath_pattern_418_SOURCES = epath_pattern_418.c nodist_epath_pattern_418_SOURCES = $(REMOTE_SOURCES) epath_pattern_419_SOURCES = epath_pattern_419.c nodist_epath_pattern_419_SOURCES = $(REMOTE_SOURCES) epath_pattern_420_SOURCES = epath_pattern_420.c nodist_epath_pattern_420_SOURCES = $(REMOTE_SOURCES) epath_pattern_421_SOURCES = epath_pattern_421.c nodist_epath_pattern_421_SOURCES = $(REMOTE_SOURCES) epath_pattern_422_SOURCES = epath_pattern_422.c nodist_epath_pattern_422_SOURCES = $(REMOTE_SOURCES) epath_pattern_423_SOURCES = epath_pattern_423.c nodist_epath_pattern_423_SOURCES = $(REMOTE_SOURCES) epath_pattern_424_SOURCES = epath_pattern_424.c nodist_epath_pattern_424_SOURCES = $(REMOTE_SOURCES) epath_pattern_425_SOURCES = epath_pattern_425.c nodist_epath_pattern_425_SOURCES = $(REMOTE_SOURCES) epath_pattern_426_SOURCES = epath_pattern_426.c nodist_epath_pattern_426_SOURCES = $(REMOTE_SOURCES) epath_pattern_427_SOURCES = epath_pattern_427.c nodist_epath_pattern_427_SOURCES = $(REMOTE_SOURCES) epath_pattern_428_SOURCES = epath_pattern_428.c nodist_epath_pattern_428_SOURCES = $(REMOTE_SOURCES) epath_pattern_429_SOURCES = epath_pattern_429.c nodist_epath_pattern_429_SOURCES = $(REMOTE_SOURCES) epath_pattern_430_SOURCES = epath_pattern_430.c nodist_epath_pattern_430_SOURCES = $(REMOTE_SOURCES) epath_pattern_431_SOURCES = epath_pattern_431.c nodist_epath_pattern_431_SOURCES = $(REMOTE_SOURCES) epath_pattern_432_SOURCES = epath_pattern_432.c nodist_epath_pattern_432_SOURCES = $(REMOTE_SOURCES) epath_pattern_433_SOURCES = epath_pattern_433.c nodist_epath_pattern_433_SOURCES = $(REMOTE_SOURCES) epath_pattern_434_SOURCES = epath_pattern_434.c nodist_epath_pattern_434_SOURCES = $(REMOTE_SOURCES) epath_pattern_435_SOURCES = epath_pattern_435.c nodist_epath_pattern_435_SOURCES = $(REMOTE_SOURCES) epath_pattern_436_SOURCES = epath_pattern_436.c nodist_epath_pattern_436_SOURCES = $(REMOTE_SOURCES) epath_pattern_437_SOURCES = epath_pattern_437.c nodist_epath_pattern_437_SOURCES = $(REMOTE_SOURCES) epath_pattern_438_SOURCES = epath_pattern_438.c nodist_epath_pattern_438_SOURCES = $(REMOTE_SOURCES) epath_pattern_439_SOURCES = epath_pattern_439.c nodist_epath_pattern_439_SOURCES = $(REMOTE_SOURCES) epath_pattern_440_SOURCES = epath_pattern_440.c nodist_epath_pattern_440_SOURCES = $(REMOTE_SOURCES) epath_pattern_441_SOURCES = epath_pattern_441.c nodist_epath_pattern_441_SOURCES = $(REMOTE_SOURCES) epath_pattern_442_SOURCES = epath_pattern_442.c nodist_epath_pattern_442_SOURCES = $(REMOTE_SOURCES) epath_pattern_443_SOURCES = epath_pattern_443.c nodist_epath_pattern_443_SOURCES = $(REMOTE_SOURCES) epath_pattern_444_SOURCES = epath_pattern_444.c nodist_epath_pattern_444_SOURCES = $(REMOTE_SOURCES) epath_pattern_445_SOURCES = epath_pattern_445.c nodist_epath_pattern_445_SOURCES = $(REMOTE_SOURCES) epath_pattern_446_SOURCES = epath_pattern_446.c nodist_epath_pattern_446_SOURCES = $(REMOTE_SOURCES) epath_pattern_447_SOURCES = epath_pattern_447.c nodist_epath_pattern_447_SOURCES = $(REMOTE_SOURCES) epath_pattern_448_SOURCES = epath_pattern_448.c nodist_epath_pattern_448_SOURCES = $(REMOTE_SOURCES) epath_pattern_449_SOURCES = epath_pattern_449.c nodist_epath_pattern_449_SOURCES = $(REMOTE_SOURCES) openhpi-2.14.1/utils/t/epath/epath_conv_085.c0000644000076400007640000000506711302567127015577 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. */ /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_tests.pl. * Do not change this file manually. Update script instead *******************************************************************/ #include #include #include /** * main: * epathstr -> epath test * * Test if an entity path string is converted properly into an entity path. **/ int main(int argc, char **argv) { char *test_string = "{SUBRACK,72}{PERIPHERAL_BAY_2,20}"; oh_big_textbuffer bigbuf; SaErrorT err; SaHpiEntityPathT ep; err = oh_encode_entitypath(test_string, &ep); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } if (ep.Entry[0].EntityType != SAHPI_ENT_PERIPHERAL_BAY_2) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[0].EntityType, SAHPI_ENT_PERIPHERAL_BAY_2); return -1; } if (ep.Entry[0].EntityLocation != 20) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[0].EntityLocation, 20); return -1; } if (ep.Entry[1].EntityType != SAHPI_ENT_SUBRACK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[1].EntityType, SAHPI_ENT_SUBRACK); return -1; } if (ep.Entry[1].EntityLocation != 72) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[1].EntityLocation, 72); return -1; } oh_init_bigtext(&bigbuf); err = oh_decode_entitypath(&ep, &bigbuf); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } if (strcmp((char *)bigbuf.Data, test_string)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received Entity Path=%s.\n", bigbuf.Data); return -1; } return 0; } openhpi-2.14.1/utils/t/epath/epath_pattern_099.c0000644000076400007640000000324611302567127016311 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{SYSTEM_CHASSIS,1}{PHYSICAL_SLOT,3}{SBC_BLADE,3}{ADD_IN_CARD,8}"; char *epp_str = "*"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_TRUE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-2.14.1/utils/t/epath/epath_conv_074.c0000644000076400007640000000506711302567127015575 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. */ /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_tests.pl. * Do not change this file manually. Update script instead *******************************************************************/ #include #include #include /** * main: * epathstr -> epath test * * Test if an entity path string is converted properly into an entity path. **/ int main(int argc, char **argv) { char *test_string = "{EXTERNAL_ENVIRONMENT,19}{BIOS,1}"; oh_big_textbuffer bigbuf; SaErrorT err; SaHpiEntityPathT ep; err = oh_encode_entitypath(test_string, &ep); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } if (ep.Entry[0].EntityType != SAHPI_ENT_BIOS) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[0].EntityType, SAHPI_ENT_BIOS); return -1; } if (ep.Entry[0].EntityLocation != 1) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[0].EntityLocation, 1); return -1; } if (ep.Entry[1].EntityType != SAHPI_ENT_EXTERNAL_ENVIRONMENT) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[1].EntityType, SAHPI_ENT_EXTERNAL_ENVIRONMENT); return -1; } if (ep.Entry[1].EntityLocation != 19) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[1].EntityLocation, 19); return -1; } oh_init_bigtext(&bigbuf); err = oh_decode_entitypath(&ep, &bigbuf); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } if (strcmp((char *)bigbuf.Data, test_string)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received Entity Path=%s.\n", bigbuf.Data); return -1; } return 0; } openhpi-2.14.1/utils/t/epath/epath_pattern_382.c0000644000076400007640000000321011302567127016273 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{GROUP,2}{SUBRACK,5}"; char *epp_str = "{SBC_BLADE,3}"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_FALSE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-2.14.1/utils/t/epath/epath_pattern_429.c0000644000076400007640000000324511302567127016305 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{GROUP,7}{REMOTE,2}{SUBRACK,4}{BIOS,8}"; char *epp_str = "{SYSTEM_CHASSIS,1}{.,.}*"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_FALSE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-2.14.1/utils/t/epath/epath_pattern_205.c0000644000076400007640000000326311302567127016275 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{GROUP,4}{SYSTEM_CHASSIS,1}{PHYSICAL_SLOT,3}{SBC_BLADE,3}"; char *epp_str = "{SYSTEM_CHASSIS,1}*"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_FALSE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-2.14.1/utils/t/epath/epath_pattern_329.c0000644000076400007640000000325611302567127016306 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{SYSTEM_CHASSIS,1}{PHYSICAL_SLOT,4}{SBC_BLADE,3}"; char *epp_str = "{SYSTEM_CHASSIS,1}{.,.}*"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_TRUE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-2.14.1/utils/t/epath/epath_pattern_206.c0000644000076400007640000000326211302567127016275 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{GROUP,4}{SYSTEM_CHASSIS,1}{PHYSICAL_SLOT,3}{SBC_BLADE,3}"; char *epp_str = "{SYSTEM_CHASSIS,1}"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_FALSE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-2.14.1/utils/t/epath/epath_pattern_166.c0000644000076400007640000000322411302567127016300 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{GROUP,4}{SYSTEM_CHASSIS,1}{SBC_BLADE,3}"; char *epp_str = "{.,.}"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_FALSE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-2.14.1/utils/t/epath/epath_pattern_111.c0000644000076400007640000000332011302567127016263 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{GROUP,4}{SYSTEM_CHASSIS,1}{PHYSICAL_SLOT,3}{SBC_BLADE,3}{ADD_IN_CARD,8}"; char *epp_str = "*{SYSTEM_CHASSIS,1}{SBC_BLADE,.}*"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_FALSE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-2.14.1/utils/t/epath/epath_pattern_428.c0000644000076400007640000000324411302567127016303 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{GROUP,7}{REMOTE,2}{SUBRACK,4}{BIOS,8}"; char *epp_str = "{SYSTEM_CHASSIS,1}{.,.}"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_FALSE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-2.14.1/utils/t/epath/epath_pattern_240.c0000644000076400007640000000320611302567127016271 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{SBC_BLADE,3}"; char *epp_str = "{SYSTEM_CHASSIS,.}"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_FALSE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-2.14.1/utils/t/epath/ep_derive_001.c0000644000076400007640000000612311302567127015371 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004, 2006 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * Steve Sherman */ #include #include #include #include #include /** * Tests string derive function - success case * - multiple substitutions * - expanded returned oid string * * Return value: 0 on success, 1 on failure **/ int main(int argc, char **argv) { /***************************** * oh_derive_string testcases *****************************/ gchar *oid, *in_oid, *expected_oid; SaHpiEntityPathT ep = { .Entry[0] = { .EntityType = SAHPI_ENT_SYS_MGMNT_MODULE, .EntityLocation = 100 }, { .EntityType = SAHPI_ENT_SUB_CHASSIS, .EntityLocation = 99 } }; /* Multiple character/digit expansion testcase */ in_oid = "1.x.3.x"; expected_oid = "1.99.3.100"; oid = oh_derive_string(&ep, 0, 10, in_oid); if (strcmp(expected_oid, oid)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received OID=%s; Expected OID=%s\n", oid, expected_oid); g_free(oid); return -1; } g_free(oid); /* location offset testcase */ in_oid = "1.x.3.x"; expected_oid = "1.109.3.110"; oid = oh_derive_string(&ep, 10, 10, in_oid); if (strcmp(expected_oid, oid)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received OID=%s; Expected OID=%s\n", oid, expected_oid); g_free(oid); return -1; } g_free(oid); /* base and offset testcase */ in_oid = "1.x.3.x"; expected_oid = "1.6D.3.6E"; oid = oh_derive_string(&ep, 10, 16, in_oid); if (strcmp(expected_oid, oid)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received OID=%s; Expected OID=%s\n", oid, expected_oid); g_free(oid); return -1; } g_free(oid); /* No expansion testcase */ in_oid = "1.99.3.100"; expected_oid = "1.99.3.100"; oid = oh_derive_string(&ep, 0, 10, in_oid); if (strcmp(expected_oid, oid)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received OID=%s; Expected OID=%s\n", oid, expected_oid); g_free(oid); return -1; } g_free(oid); /* Event testcase */ SaHpiEntityPathT ep2 = { .Entry[0] = { .EntityType = SAHPI_ENT_SYS_MGMNT_MODULE, .EntityLocation = 11 }, { .EntityType = SAHPI_ENT_SUB_CHASSIS, .EntityLocation = 14 } }; in_oid = "1.x.3.x"; expected_oid = "1.E.3.B"; oid = oh_derive_string(&ep2, 0, 16, in_oid); if (strcmp(expected_oid, oid)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received OID=%s; Expected OID=%s\n", oid, expected_oid); g_free(oid); return -1; } g_free(oid); return 0; } openhpi-2.14.1/utils/t/epath/epath_pattern_087.c0000644000076400007640000000330611302567127016303 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{SYSTEM_CHASSIS,1}{PHYSICAL_SLOT,3}{SBC_BLADE,3}{ADD_IN_CARD,8}"; char *epp_str = "*{SYSTEM_CHASSIS,.}{SBC_BLADE,.}"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_FALSE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-2.14.1/utils/t/epath/epath_pattern_142.c0000644000076400007640000000320711302567127016273 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{GROUP,4}{SYSTEM_CHASSIS,1}"; char *epp_str = "*{.,.}"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_TRUE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-2.14.1/utils/t/epath/epath_conv_065.c0000644000076400007640000000506111302567127015567 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. */ /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_tests.pl. * Do not change this file manually. Update script instead *******************************************************************/ #include #include #include /** * main: * epathstr -> epath test * * Test if an entity path string is converted properly into an entity path. **/ int main(int argc, char **argv) { char *test_string = "{SWITCH,39}{PROCESSOR_BOARD,20}"; oh_big_textbuffer bigbuf; SaErrorT err; SaHpiEntityPathT ep; err = oh_encode_entitypath(test_string, &ep); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } if (ep.Entry[0].EntityType != SAHPI_ENT_PROCESSOR_BOARD) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[0].EntityType, SAHPI_ENT_PROCESSOR_BOARD); return -1; } if (ep.Entry[0].EntityLocation != 20) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[0].EntityLocation, 20); return -1; } if (ep.Entry[1].EntityType != SAHPI_ENT_SWITCH) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[1].EntityType, SAHPI_ENT_SWITCH); return -1; } if (ep.Entry[1].EntityLocation != 39) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[1].EntityLocation, 39); return -1; } oh_init_bigtext(&bigbuf); err = oh_decode_entitypath(&ep, &bigbuf); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } if (strcmp((char *)bigbuf.Data, test_string)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received Entity Path=%s.\n", bigbuf.Data); return -1; } return 0; } openhpi-2.14.1/utils/t/epath/epath_pattern_233.c0000644000076400007640000000320111302567127016266 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{SBC_BLADE,3}"; char *epp_str = "*{SBC_BLADE,3}"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_TRUE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-2.14.1/utils/t/epath/epath_pattern_285.c0000644000076400007640000000322311302567127016301 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{PHYSICAL_SLOT,4}{SBC_BLADE,3}"; char *epp_str = "*{SBC_BLADE,.}*"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_TRUE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-2.14.1/utils/t/epath/epath_pattern_321.c0000644000076400007640000000323711302567127016275 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{PHYSICAL_SLOT,4}{SBC_BLADE,3}{ADD_IN_CARD,8}"; char *epp_str = "{.,.}*{.,.}*"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_TRUE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-2.14.1/utils/t/epath/epath_conv_064.c0000644000076400007640000000506711302567127015574 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. */ /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_tests.pl. * Do not change this file manually. Update script instead *******************************************************************/ #include #include #include /** * main: * epathstr -> epath test * * Test if an entity path string is converted properly into an entity path. **/ int main(int argc, char **argv) { char *test_string = "{COOLING_DEVICE,18}{PROCESSOR,42}"; oh_big_textbuffer bigbuf; SaErrorT err; SaHpiEntityPathT ep; err = oh_encode_entitypath(test_string, &ep); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } if (ep.Entry[0].EntityType != SAHPI_ENT_PROCESSOR) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[0].EntityType, SAHPI_ENT_PROCESSOR); return -1; } if (ep.Entry[0].EntityLocation != 42) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[0].EntityLocation, 42); return -1; } if (ep.Entry[1].EntityType != SAHPI_ENT_COOLING_DEVICE) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[1].EntityType, SAHPI_ENT_COOLING_DEVICE); return -1; } if (ep.Entry[1].EntityLocation != 18) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[1].EntityLocation, 18); return -1; } oh_init_bigtext(&bigbuf); err = oh_decode_entitypath(&ep, &bigbuf); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } if (strcmp((char *)bigbuf.Data, test_string)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received Entity Path=%s.\n", bigbuf.Data); return -1; } return 0; } openhpi-2.14.1/utils/t/epath/epath_pattern_128.c0000644000076400007640000000323111302567127016274 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{GROUP,4}{SYSTEM_CHASSIS,1}"; char *epp_str = "{SYSTEM_CHASSIS,1}{.,.}"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_FALSE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-2.14.1/utils/t/epath/epath_pattern_150.c0000644000076400007640000000325611302567127016276 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{GROUP,4}{SYSTEM_CHASSIS,1}{SBC_BLADE,3}"; char *epp_str = "{SYSTEM_CHASSIS,1}{SBC_BLADE,3}"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_FALSE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-2.14.1/utils/t/epath/epath_pattern_426.c0000644000076400007640000000325411302567127016302 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{GROUP,7}{REMOTE,2}{SUBRACK,4}{BIOS,8}"; char *epp_str = "{SYSTEM_CHASSIS,1}{SBC_BLADE,.}"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_FALSE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-2.14.1/utils/t/epath/epath_pattern_379.c0000644000076400007640000000322311302567127016305 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{GROUP,2}{SUBRACK,5}"; char *epp_str = "{SYSTEM_CHASSIS,1}{.,.}*"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_FALSE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-2.14.1/utils/t/epath/epath_pattern_057.c0000644000076400007640000000324211302567127016277 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{SYSTEM_CHASSIS,1}{SBC_BLADE,3}{ADD_IN_CARD,8}"; char *epp_str = "{SBC_BLADE,3}"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_FALSE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-2.14.1/utils/t/epath/epath_pattern_339.c0000644000076400007640000000327011302567127016303 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{SYSTEM_CHASSIS,1}{PHYSICAL_SLOT,4}{SBC_BLADE,3}"; char *epp_str = "*{SYSTEM_CHASSIS,.}*{SBC_BLADE,.}*"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_TRUE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-2.14.1/utils/t/epath/epath_pattern_250.c0000644000076400007640000000324211302567127016272 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{SBC_BLADE,3}{ADD_IN_CARD,8}"; char *epp_str = "{SYSTEM_CHASSIS,1}{SBC_BLADE,3}"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_FALSE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-2.14.1/utils/t/epath/epath_pattern_286.c0000644000076400007640000000324611302567127016307 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{PHYSICAL_SLOT,4}{SBC_BLADE,3}"; char *epp_str = "*{SYSTEM_CHASSIS,1}{SBC_BLADE,.}*"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_FALSE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-2.14.1/utils/t/epath/epath_pattern_090.c0000644000076400007640000000327011302567127016275 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{SYSTEM_CHASSIS,1}{PHYSICAL_SLOT,3}{SBC_BLADE,3}{ADD_IN_CARD,8}"; char *epp_str = "{SYSTEM_CHASSIS,.}"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_FALSE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-2.14.1/utils/t/epath/epath_conv_058.c0000644000076400007640000000503111302567127015566 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. */ /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_tests.pl. * Do not change this file manually. Update script instead *******************************************************************/ #include #include #include /** * main: * epathstr -> epath test * * Test if an entity path string is converted properly into an entity path. **/ int main(int argc, char **argv) { char *test_string = "{DISK_BLADE,2}{RACK,36}"; oh_big_textbuffer bigbuf; SaErrorT err; SaHpiEntityPathT ep; err = oh_encode_entitypath(test_string, &ep); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } if (ep.Entry[0].EntityType != SAHPI_ENT_RACK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[0].EntityType, SAHPI_ENT_RACK); return -1; } if (ep.Entry[0].EntityLocation != 36) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[0].EntityLocation, 36); return -1; } if (ep.Entry[1].EntityType != SAHPI_ENT_DISK_BLADE) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[1].EntityType, SAHPI_ENT_DISK_BLADE); return -1; } if (ep.Entry[1].EntityLocation != 2) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[1].EntityLocation, 2); return -1; } oh_init_bigtext(&bigbuf); err = oh_decode_entitypath(&ep, &bigbuf); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } if (strcmp((char *)bigbuf.Data, test_string)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received Entity Path=%s.\n", bigbuf.Data); return -1; } return 0; } openhpi-2.14.1/utils/t/epath/epath_pattern_274.c0000644000076400007640000000320311302567127016275 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{SBC_BLADE,3}{ADD_IN_CARD,8}"; char *epp_str = "*"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_TRUE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-2.14.1/utils/t/epath/epath_pattern_108.c0000644000076400007640000000327511302567127016302 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{GROUP,4}{SYSTEM_CHASSIS,1}{PHYSICAL_SLOT,3}{SBC_BLADE,3}{ADD_IN_CARD,8}"; char *epp_str = "*{SBC_BLADE,3}"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_FALSE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-2.14.1/utils/t/epath/epath_pattern_437.c0000644000076400007640000000325511302567127016305 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{GROUP,7}{REMOTE,2}{SUBRACK,4}{BIOS,8}"; char *epp_str = "*{SYSTEM_CHASSIS,.}{SBC_BLADE,.}"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_FALSE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-2.14.1/utils/t/epath/epath_pattern_031.c0000644000076400007640000000321211302567127016264 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{SYSTEM_CHASSIS,1}"; char *epp_str = "{SYSTEM_CHASSIS,1}"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_TRUE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-2.14.1/utils/t/epath/epath_pattern_356.c0000644000076400007640000000320211302567127016275 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{GROUP,2}"; char *epp_str = "{SYSTEM_CHASSIS,1}"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_FALSE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-2.14.1/utils/t/epath/epath_conv_001.c0000644000076400007640000000505011302567127015553 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. */ /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_tests.pl. * Do not change this file manually. Update script instead *******************************************************************/ #include #include #include /** * main: * epathstr -> epath test * * Test if an entity path string is converted properly into an entity path. **/ int main(int argc, char **argv) { char *test_string = "{DRIVE_BACKPLANE,57}{BIOS,8}"; oh_big_textbuffer bigbuf; SaErrorT err; SaHpiEntityPathT ep; err = oh_encode_entitypath(test_string, &ep); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } if (ep.Entry[0].EntityType != SAHPI_ENT_BIOS) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[0].EntityType, SAHPI_ENT_BIOS); return -1; } if (ep.Entry[0].EntityLocation != 8) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[0].EntityLocation, 8); return -1; } if (ep.Entry[1].EntityType != SAHPI_ENT_DRIVE_BACKPLANE) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[1].EntityType, SAHPI_ENT_DRIVE_BACKPLANE); return -1; } if (ep.Entry[1].EntityLocation != 57) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[1].EntityLocation, 57); return -1; } oh_init_bigtext(&bigbuf); err = oh_decode_entitypath(&ep, &bigbuf); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } if (strcmp((char *)bigbuf.Data, test_string)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received Entity Path=%s.\n", bigbuf.Data); return -1; } return 0; } openhpi-2.14.1/utils/t/epath/epath_conv_004.c0000644000076400007640000000511111302567127015554 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. */ /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_tests.pl. * Do not change this file manually. Update script instead *******************************************************************/ #include #include #include /** * main: * epathstr -> epath test * * Test if an entity path string is converted properly into an entity path. **/ int main(int argc, char **argv) { char *test_string = "{MEMORY_MODULE,95}{SYS_MGMNT_MODULE,93}"; oh_big_textbuffer bigbuf; SaErrorT err; SaHpiEntityPathT ep; err = oh_encode_entitypath(test_string, &ep); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } if (ep.Entry[0].EntityType != SAHPI_ENT_SYS_MGMNT_MODULE) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[0].EntityType, SAHPI_ENT_SYS_MGMNT_MODULE); return -1; } if (ep.Entry[0].EntityLocation != 93) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[0].EntityLocation, 93); return -1; } if (ep.Entry[1].EntityType != SAHPI_ENT_MEMORY_MODULE) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[1].EntityType, SAHPI_ENT_MEMORY_MODULE); return -1; } if (ep.Entry[1].EntityLocation != 95) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[1].EntityLocation, 95); return -1; } oh_init_bigtext(&bigbuf); err = oh_decode_entitypath(&ep, &bigbuf); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } if (strcmp((char *)bigbuf.Data, test_string)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received Entity Path=%s.\n", bigbuf.Data); return -1; } return 0; } openhpi-2.14.1/utils/t/epath/epath_pattern_325.c0000644000076400007640000000326611302567127016303 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{SYSTEM_CHASSIS,1}{PHYSICAL_SLOT,4}{SBC_BLADE,3}"; char *epp_str = "{SYSTEM_CHASSIS,1}{SBC_BLADE,3}"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_FALSE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-2.14.1/utils/t/epath/epath_pattern_199.c0000644000076400007640000000323611302567127016311 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{GROUP,4}{SYSTEM_CHASSIS,1}{SBC_BLADE,3}{ADD_IN_CARD,8}"; char *epp_str = "*"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_TRUE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-2.14.1/utils/t/epath/epath_pattern_266.c0000644000076400007640000000321011302567127016274 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{SBC_BLADE,3}{ADD_IN_CARD,8}"; char *epp_str = "{.,.}"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_FALSE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-2.14.1/utils/t/epath/epath_pattern_342.c0000644000076400007640000000323411302567127016275 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{SYSTEM_CHASSIS,1}{PHYSICAL_SLOT,4}{SBC_BLADE,3}"; char *epp_str = "*{.,.}"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_TRUE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-2.14.1/utils/t/epath/epath_conv_015.c0000644000076400007640000000506111302567127015562 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. */ /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_tests.pl. * Do not change this file manually. Update script instead *******************************************************************/ #include #include #include /** * main: * epathstr -> epath test * * Test if an entity path string is converted properly into an entity path. **/ int main(int argc, char **argv) { char *test_string = "{IO_BLADE,64}{MEMORY_DEVICE,59}"; oh_big_textbuffer bigbuf; SaErrorT err; SaHpiEntityPathT ep; err = oh_encode_entitypath(test_string, &ep); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } if (ep.Entry[0].EntityType != SAHPI_ENT_MEMORY_DEVICE) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[0].EntityType, SAHPI_ENT_MEMORY_DEVICE); return -1; } if (ep.Entry[0].EntityLocation != 59) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[0].EntityLocation, 59); return -1; } if (ep.Entry[1].EntityType != SAHPI_ENT_IO_BLADE) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[1].EntityType, SAHPI_ENT_IO_BLADE); return -1; } if (ep.Entry[1].EntityLocation != 64) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[1].EntityLocation, 64); return -1; } oh_init_bigtext(&bigbuf); err = oh_decode_entitypath(&ep, &bigbuf); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } if (strcmp((char *)bigbuf.Data, test_string)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received Entity Path=%s.\n", bigbuf.Data); return -1; } return 0; } openhpi-2.14.1/utils/t/epath/epath_conv_016.c0000644000076400007640000000507511302567127015570 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. */ /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_tests.pl. * Do not change this file manually. Update script instead *******************************************************************/ #include #include #include /** * main: * epathstr -> epath test * * Test if an entity path string is converted properly into an entity path. **/ int main(int argc, char **argv) { char *test_string = "{SUBRACK,19}{OTHER_CHASSIS_BOARD,1}"; oh_big_textbuffer bigbuf; SaErrorT err; SaHpiEntityPathT ep; err = oh_encode_entitypath(test_string, &ep); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } if (ep.Entry[0].EntityType != SAHPI_ENT_OTHER_CHASSIS_BOARD) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[0].EntityType, SAHPI_ENT_OTHER_CHASSIS_BOARD); return -1; } if (ep.Entry[0].EntityLocation != 1) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[0].EntityLocation, 1); return -1; } if (ep.Entry[1].EntityType != SAHPI_ENT_SUBRACK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[1].EntityType, SAHPI_ENT_SUBRACK); return -1; } if (ep.Entry[1].EntityLocation != 19) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[1].EntityLocation, 19); return -1; } oh_init_bigtext(&bigbuf); err = oh_decode_entitypath(&ep, &bigbuf); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } if (strcmp((char *)bigbuf.Data, test_string)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received Entity Path=%s.\n", bigbuf.Data); return -1; } return 0; } openhpi-2.14.1/utils/t/epath/epath_pattern_109.c0000644000076400007640000000327511302567127016303 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{GROUP,4}{SYSTEM_CHASSIS,1}{PHYSICAL_SLOT,3}{SBC_BLADE,3}{ADD_IN_CARD,8}"; char *epp_str = "*{SBC_BLADE,.}"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_FALSE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-2.14.1/utils/t/epath/ep_cmp_008.c0000644000076400007640000000221311302567127014675 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * Chris Chia * Steve Sherman */ #include #include #include #include /* oh_cmp_ep: compare zero to multi-element entity path testcase. */ int main(int argc, char **argv) { SaHpiEntityPathT ep1 = {{{SAHPI_ENT_ROOT, 0}}}; SaHpiEntityPathT ep2 = {{{SAHPI_ENT_FAN,4}, {SAHPI_ENT_SBC_BLADE,3}, {SAHPI_ENT_RACK,2}, {SAHPI_ENT_ROOT,1}, {SAHPI_ENT_ROOT, 0}}}; if (oh_cmp_ep(&ep1, &ep2)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); return -1; } return 0; } openhpi-2.14.1/utils/t/epath/epath_pattern_066.c0000644000076400007640000000323211302567127016276 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{SYSTEM_CHASSIS,1}{SBC_BLADE,3}{ADD_IN_CARD,8}"; char *epp_str = "{.,.}"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_FALSE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-2.14.1/utils/t/epath/epath_pattern_434.c0000644000076400007640000000323311302567127016276 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{GROUP,7}{REMOTE,2}{SUBRACK,4}{BIOS,8}"; char *epp_str = "*{SBC_BLADE,.}"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_FALSE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-2.14.1/utils/t/epath/epath_pattern_334.c0000644000076400007640000000324411302567127016277 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{SYSTEM_CHASSIS,1}{PHYSICAL_SLOT,4}{SBC_BLADE,3}"; char *epp_str = "*{SBC_BLADE,.}"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_TRUE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-2.14.1/utils/t/epath/epath_conv_057.c0000644000076400007640000000506411302567127015573 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. */ /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_tests.pl. * Do not change this file manually. Update script instead *******************************************************************/ #include #include #include /** * main: * epathstr -> epath test * * Test if an entity path string is converted properly into an entity path. **/ int main(int argc, char **argv) { char *test_string = "{INTERCONNECT,94}{DEVICE_BAY,18}"; oh_big_textbuffer bigbuf; SaErrorT err; SaHpiEntityPathT ep; err = oh_encode_entitypath(test_string, &ep); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } if (ep.Entry[0].EntityType != SAHPI_ENT_DEVICE_BAY) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[0].EntityType, SAHPI_ENT_DEVICE_BAY); return -1; } if (ep.Entry[0].EntityLocation != 18) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[0].EntityLocation, 18); return -1; } if (ep.Entry[1].EntityType != SAHPI_ENT_INTERCONNECT) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[1].EntityType, SAHPI_ENT_INTERCONNECT); return -1; } if (ep.Entry[1].EntityLocation != 94) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[1].EntityLocation, 94); return -1; } oh_init_bigtext(&bigbuf); err = oh_decode_entitypath(&ep, &bigbuf); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } if (strcmp((char *)bigbuf.Data, test_string)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received Entity Path=%s.\n", bigbuf.Data); return -1; } return 0; } openhpi-2.14.1/utils/t/epath/epath_pattern_093.c0000644000076400007640000000325311302567127016301 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{SYSTEM_CHASSIS,1}{PHYSICAL_SLOT,3}{SBC_BLADE,3}{ADD_IN_CARD,8}"; char *epp_str = "{.,.}*"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_TRUE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-2.14.1/utils/t/epath/epath_pattern_202.c0000644000076400007640000000330011302567127016262 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{GROUP,4}{SYSTEM_CHASSIS,1}{PHYSICAL_SLOT,3}{SBC_BLADE,3}"; char *epp_str = "{SYSTEM_CHASSIS,1}{SBC_BLADE,.}*"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_FALSE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-2.14.1/utils/t/epath/epath_pattern_331.c0000644000076400007640000000325111302567127016272 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{SYSTEM_CHASSIS,1}{PHYSICAL_SLOT,4}{SBC_BLADE,3}"; char *epp_str = "{SYSTEM_CHASSIS,1}"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_FALSE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-2.14.1/utils/t/epath/epath_pattern_345.c0000644000076400007640000000324211302567127016277 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{SYSTEM_CHASSIS,1}{PHYSICAL_SLOT,4}{SBC_BLADE,3}"; char *epp_str = "*{.,.}*{.,.}"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_TRUE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-2.14.1/utils/t/epath/epath_pattern_016.c0000644000076400007640000000321311302567127016270 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{SYSTEM_CHASSIS,1}{SBC_BLADE,3}"; char *epp_str = "{.,.}"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_FALSE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-2.14.1/utils/t/epath/ep_concat_015.c0000644000076400007640000000506711302567127015375 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * Chris Chia * Steve Sherman */ #include #include #include #include /* oh_concat_ep: concatenate a 5 element entity path that has garbage beyond end element with a 5 element. Garbage should be gone at end result. */ int main(int argc, char **argv) { SaErrorT err; SaHpiEntityPathT ep1 = {{{SAHPI_ENT_GROUP,1}, {SAHPI_ENT_REMOTE,2}, {SAHPI_ENT_EXTERNAL_ENVIRONMENT,3}, {SAHPI_ENT_BATTERY,4}, {SAHPI_ENT_CHASSIS_SPECIFIC,5}, {SAHPI_ENT_ROOT,0}, {SAHPI_ENT_FAN,11}, {SAHPI_ENT_RACK,12}}}; SaHpiEntityPathT ep2 = {{{SAHPI_ENT_GROUP,101}, {SAHPI_ENT_REMOTE,102}, {SAHPI_ENT_EXTERNAL_ENVIRONMENT,103}, {SAHPI_ENT_BATTERY,104}, {SAHPI_ENT_CHASSIS_SPECIFIC,105}, {SAHPI_ENT_ROOT,0}}}; SaHpiEntityPathT ep3 = {{{SAHPI_ENT_GROUP,1}, {SAHPI_ENT_REMOTE,2}, {SAHPI_ENT_EXTERNAL_ENVIRONMENT,3}, {SAHPI_ENT_BATTERY,4}, {SAHPI_ENT_CHASSIS_SPECIFIC,5}, {SAHPI_ENT_GROUP,101}, {SAHPI_ENT_REMOTE,102}, {SAHPI_ENT_EXTERNAL_ENVIRONMENT,103}, {SAHPI_ENT_BATTERY,104}, {SAHPI_ENT_CHASSIS_SPECIFIC,105}, {SAHPI_ENT_ROOT,0}}}; err = oh_concat_ep(&ep1, &ep2); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } if (!oh_cmp_ep(&ep1, &ep3)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); return -1; } return 0; } openhpi-2.14.1/utils/t/epath/epath_pattern_242.c0000644000076400007640000000317111302567127016274 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{SBC_BLADE,3}"; char *epp_str = "*{.,.}"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_TRUE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-2.14.1/utils/t/epath/ep_cmp_011.c0000644000076400007640000000371111302567127014673 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * Chris Chia * Steve Sherman */ #include #include #include #include /* oh_cmp_ep: unidentical multi-element entity path testcase. */ int main(int argc, char **argv) { SaHpiEntityPathT ep1 = {{{SAHPI_ENT_ADD_IN_CARD,51}, {SAHPI_ENT_FRONT_PANEL_BOARD,52}, {SAHPI_ENT_BACK_PANEL_BOARD,53}, {SAHPI_ENT_POWER_SYSTEM_BOARD,54}, {SAHPI_ENT_DRIVE_BACKPLANE,55}, {SAHPI_ENT_SYS_EXPANSION_BOARD,56}, {SAHPI_ENT_OTHER_SYSTEM_BOARD,57}, {SAHPI_ENT_PROCESSOR_BOARD,58}, {SAHPI_ENT_ROOT,0}}}; SaHpiEntityPathT ep2 = {{{SAHPI_ENT_ADD_IN_CARD,51}, {SAHPI_ENT_FRONT_PANEL_BOARD,52}, {SAHPI_ENT_BACK_PANEL_BOARD,53}, {SAHPI_ENT_POWER_SYSTEM_BOARD,54}, {SAHPI_ENT_DRIVE_BACKPLANE,55}, {SAHPI_ENT_SYS_EXPANSION_BOARD,56}, {SAHPI_ENT_POWER_MODULE,57}, {SAHPI_ENT_PROCESSOR_BOARD,58}, {SAHPI_ENT_ROOT,0}}}; if (oh_cmp_ep(&ep1, &ep2)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); return -1; } return 0; } openhpi-2.14.1/utils/t/epath/epath_pattern_033.c0000644000076400007640000000320711302567127016272 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{SYSTEM_CHASSIS,1}"; char *epp_str = "*{SBC_BLADE,3}"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_FALSE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-2.14.1/utils/t/epath/epath_pattern_220.c0000644000076400007640000000325311302567127016271 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{GROUP,4}{SYSTEM_CHASSIS,1}{PHYSICAL_SLOT,3}{SBC_BLADE,3}"; char *epp_str = "*{.,.}*{.,.}"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_TRUE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-2.14.1/utils/t/epath/epath_pattern_187.c0000644000076400007640000000327611302567127016312 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{GROUP,4}{SYSTEM_CHASSIS,1}{SBC_BLADE,3}{ADD_IN_CARD,8}"; char *epp_str = "*{SYSTEM_CHASSIS,.}{SBC_BLADE,.}"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_FALSE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-2.14.1/utils/t/epath/ep_cmp_007.c0000644000076400007640000000150211302567127014674 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * Chris Chia * Steve Sherman */ #include #include #include #include /* oh_cmp_ep: null pointer testcase. */ int main(int argc, char **argv) { SaHpiEntityPathT ep; if (oh_cmp_ep(&ep, NULL)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); return -1; } return 0; } openhpi-2.14.1/utils/t/epath/epath_pattern_353.c0000644000076400007640000000320711302567127016277 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{GROUP,2}"; char *epp_str = "{SYSTEM_CHASSIS,1}{.,.}"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_FALSE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-2.14.1/utils/t/epath/epath_pattern_258.c0000644000076400007640000000322111302567127016277 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{SBC_BLADE,3}{ADD_IN_CARD,8}"; char *epp_str = "*{SBC_BLADE,3}"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_FALSE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-2.14.1/utils/t/epath/epath_conv_056.c0000644000076400007640000000511711302567127015571 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. */ /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_tests.pl. * Do not change this file manually. Update script instead *******************************************************************/ #include #include #include /** * main: * epathstr -> epath test * * Test if an entity path string is converted properly into an entity path. **/ int main(int argc, char **argv) { char *test_string = "{INTERCONNECT,65}{RACK_MOUNTED_SERVER,76}"; oh_big_textbuffer bigbuf; SaErrorT err; SaHpiEntityPathT ep; err = oh_encode_entitypath(test_string, &ep); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } if (ep.Entry[0].EntityType != SAHPI_ENT_RACK_MOUNTED_SERVER) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[0].EntityType, SAHPI_ENT_RACK_MOUNTED_SERVER); return -1; } if (ep.Entry[0].EntityLocation != 76) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[0].EntityLocation, 76); return -1; } if (ep.Entry[1].EntityType != SAHPI_ENT_INTERCONNECT) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[1].EntityType, SAHPI_ENT_INTERCONNECT); return -1; } if (ep.Entry[1].EntityLocation != 65) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[1].EntityLocation, 65); return -1; } oh_init_bigtext(&bigbuf); err = oh_decode_entitypath(&ep, &bigbuf); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } if (strcmp((char *)bigbuf.Data, test_string)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received Entity Path=%s.\n", bigbuf.Data); return -1; } return 0; } openhpi-2.14.1/utils/t/epath/epath_pattern_148.c0000644000076400007640000000321411302567127016277 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{GROUP,4}{SYSTEM_CHASSIS,1}"; char *epp_str = "*{.,.}{.,.}"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_TRUE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-2.14.1/utils/t/epath/epath_conv_061.c0000644000076400007640000000510011302567127015555 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. */ /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_tests.pl. * Do not change this file manually. Update script instead *******************************************************************/ #include #include #include /** * main: * epathstr -> epath test * * Test if an entity path string is converted properly into an entity path. **/ int main(int argc, char **argv) { char *test_string = "{IO_SUBBOARD,39}{SPEC_PROC_BLADE,78}"; oh_big_textbuffer bigbuf; SaErrorT err; SaHpiEntityPathT ep; err = oh_encode_entitypath(test_string, &ep); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } if (ep.Entry[0].EntityType != SAHPI_ENT_SPEC_PROC_BLADE) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[0].EntityType, SAHPI_ENT_SPEC_PROC_BLADE); return -1; } if (ep.Entry[0].EntityLocation != 78) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[0].EntityLocation, 78); return -1; } if (ep.Entry[1].EntityType != SAHPI_ENT_IO_SUBBOARD) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[1].EntityType, SAHPI_ENT_IO_SUBBOARD); return -1; } if (ep.Entry[1].EntityLocation != 39) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[1].EntityLocation, 39); return -1; } oh_init_bigtext(&bigbuf); err = oh_decode_entitypath(&ep, &bigbuf); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } if (strcmp((char *)bigbuf.Data, test_string)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received Entity Path=%s.\n", bigbuf.Data); return -1; } return 0; } openhpi-2.14.1/utils/t/epath/epath_pattern_442.c0000644000076400007640000000322211302567127016273 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{GROUP,7}{REMOTE,2}{SUBRACK,4}{BIOS,8}"; char *epp_str = "*{.,.}"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_TRUE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-2.14.1/utils/t/epath/epath_pattern_253.c0000644000076400007640000000323211302567127016274 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{SBC_BLADE,3}{ADD_IN_CARD,8}"; char *epp_str = "{SYSTEM_CHASSIS,1}{.,.}"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_FALSE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-2.14.1/utils/t/epath/epath_pattern_433.c0000644000076400007640000000323311302567127016275 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{GROUP,7}{REMOTE,2}{SUBRACK,4}{BIOS,8}"; char *epp_str = "*{SBC_BLADE,3}"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_FALSE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-2.14.1/utils/t/epath/set_ep_loc_012.c0000755000076400007640000000447611302567127015561 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * Chris Chia * Steve Sherman */ #include #include #include #include /* oh_set_ep_location: Dull entity path and victim element in the middle. * Only victim element's instance number changed. */ int main(int argc, char **argv) { unsigned int y = 77002; unsigned int z = 3; unsigned int i = 0; SaErrorT err; SaHpiEntityPathT ep; SaHpiEntityTypeT w = SAHPI_ENT_SBC_BLADE; SaHpiEntityLocationT x = 56873; for (i=0; i #include #include /** * main: * epathstr -> epath test * * Test if an entity path string is converted properly into an entity path. **/ int main(int argc, char **argv) { char *test_string = "{FRONT_PANEL_BOARD,9}{PHYSICAL_SLOT,79}"; oh_big_textbuffer bigbuf; SaErrorT err; SaHpiEntityPathT ep; err = oh_encode_entitypath(test_string, &ep); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } if (ep.Entry[0].EntityType != SAHPI_ENT_PHYSICAL_SLOT) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[0].EntityType, SAHPI_ENT_PHYSICAL_SLOT); return -1; } if (ep.Entry[0].EntityLocation != 79) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[0].EntityLocation, 79); return -1; } if (ep.Entry[1].EntityType != SAHPI_ENT_FRONT_PANEL_BOARD) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[1].EntityType, SAHPI_ENT_FRONT_PANEL_BOARD); return -1; } if (ep.Entry[1].EntityLocation != 9) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[1].EntityLocation, 9); return -1; } oh_init_bigtext(&bigbuf); err = oh_decode_entitypath(&ep, &bigbuf); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } if (strcmp((char *)bigbuf.Data, test_string)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received Entity Path=%s.\n", bigbuf.Data); return -1; } return 0; } openhpi-2.14.1/utils/t/epath/epath_pattern_302.c0000644000076400007640000000326411302567127016274 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{PHYSICAL_SLOT,4}{SBC_BLADE,3}{ADD_IN_CARD,8}"; char *epp_str = "{SYSTEM_CHASSIS,1}{SBC_BLADE,.}*"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_FALSE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-2.14.1/utils/t/epath/epath_pattern_330.c0000644000076400007640000000325111302567127016271 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{SYSTEM_CHASSIS,1}{PHYSICAL_SLOT,4}{SBC_BLADE,3}"; char *epp_str = "{SYSTEM_CHASSIS,1}*"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_TRUE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-2.14.1/utils/t/epath/epath_conv_055.c0000644000076400007640000000511111302567127015562 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. */ /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_tests.pl. * Do not change this file manually. Update script instead *******************************************************************/ #include #include #include /** * main: * epathstr -> epath test * * Test if an entity path string is converted properly into an entity path. **/ int main(int argc, char **argv) { char *test_string = "{MEMORY_DEVICE,50}{OPERATING_SYSTEM,20}"; oh_big_textbuffer bigbuf; SaErrorT err; SaHpiEntityPathT ep; err = oh_encode_entitypath(test_string, &ep); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } if (ep.Entry[0].EntityType != SAHPI_ENT_OPERATING_SYSTEM) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[0].EntityType, SAHPI_ENT_OPERATING_SYSTEM); return -1; } if (ep.Entry[0].EntityLocation != 20) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[0].EntityLocation, 20); return -1; } if (ep.Entry[1].EntityType != SAHPI_ENT_MEMORY_DEVICE) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[1].EntityType, SAHPI_ENT_MEMORY_DEVICE); return -1; } if (ep.Entry[1].EntityLocation != 50) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[1].EntityLocation, 50); return -1; } oh_init_bigtext(&bigbuf); err = oh_decode_entitypath(&ep, &bigbuf); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } if (strcmp((char *)bigbuf.Data, test_string)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received Entity Path=%s.\n", bigbuf.Data); return -1; } return 0; } openhpi-2.14.1/utils/t/epath/epath_pattern_376.c0000644000076400007640000000323211302567127016302 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{GROUP,2}{SUBRACK,5}"; char *epp_str = "{SYSTEM_CHASSIS,1}{SBC_BLADE,.}"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_FALSE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-2.14.1/utils/t/epath/epath_pattern_378.c0000644000076400007640000000322211302567127016303 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{GROUP,2}{SUBRACK,5}"; char *epp_str = "{SYSTEM_CHASSIS,1}{.,.}"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_FALSE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-2.14.1/utils/t/epath/epath_pattern_130.c0000644000076400007640000000322511302567127016270 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{GROUP,4}{SYSTEM_CHASSIS,1}"; char *epp_str = "{SYSTEM_CHASSIS,1}*"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_FALSE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-2.14.1/utils/t/epath/epath_conv_039.c0000644000076400007640000000502311302567127015566 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. */ /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_tests.pl. * Do not change this file manually. Update script instead *******************************************************************/ #include #include #include /** * main: * epathstr -> epath test * * Test if an entity path string is converted properly into an entity path. **/ int main(int argc, char **argv) { char *test_string = "{OTHER,51}{SWITCH,55}"; oh_big_textbuffer bigbuf; SaErrorT err; SaHpiEntityPathT ep; err = oh_encode_entitypath(test_string, &ep); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } if (ep.Entry[0].EntityType != SAHPI_ENT_SWITCH) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[0].EntityType, SAHPI_ENT_SWITCH); return -1; } if (ep.Entry[0].EntityLocation != 55) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[0].EntityLocation, 55); return -1; } if (ep.Entry[1].EntityType != SAHPI_ENT_OTHER) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[1].EntityType, SAHPI_ENT_OTHER); return -1; } if (ep.Entry[1].EntityLocation != 51) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[1].EntityLocation, 51); return -1; } oh_init_bigtext(&bigbuf); err = oh_decode_entitypath(&ep, &bigbuf); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } if (strcmp((char *)bigbuf.Data, test_string)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received Entity Path=%s.\n", bigbuf.Data); return -1; } return 0; } openhpi-2.14.1/utils/t/epath/ep_concat_008.c0000644000076400007640000000277211302567127015377 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * Chris Chia * Steve Sherman */ #include #include #include #include /* oh_concat_ep: concatenate two full entity path */ int main(int argc, char **argv) { int i; SaErrorT err; SaHpiEntityPathT ep1; SaHpiEntityPathT ep2; SaHpiEntityPathT ep3; for (i=0; i */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{GROUP,4}{SYSTEM_CHASSIS,1}{PHYSICAL_SLOT,3}{SBC_BLADE,3}{ADD_IN_CARD,8}"; char *epp_str = "{SYSTEM_CHASSIS,1}{SBC_BLADE,.}*"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_FALSE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-2.14.1/utils/t/epath/epath_pattern_263.c0000644000076400007640000000324411302567127016300 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{SBC_BLADE,3}{ADD_IN_CARD,8}"; char *epp_str = "*{SYSTEM_CHASSIS,.}*{SBC_BLADE,.}"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_FALSE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-2.14.1/utils/t/epath/epath_pattern_068.c0000644000076400007640000000323211302567127016300 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{SYSTEM_CHASSIS,1}{SBC_BLADE,3}{ADD_IN_CARD,8}"; char *epp_str = "{.,.}*"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_TRUE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-2.14.1/utils/t/epath/epath_pattern_292.c0000644000076400007640000000321211302567127016275 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{PHYSICAL_SLOT,4}{SBC_BLADE,3}"; char *epp_str = "*{.,.}"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_TRUE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-2.14.1/utils/t/epath/epath_pattern_035.c0000644000076400007640000000321011302567127016266 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{SYSTEM_CHASSIS,1}"; char *epp_str = "*{SBC_BLADE,.}*"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_FALSE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-2.14.1/utils/t/epath/epath_pattern_228.c0000644000076400007640000000321311302567127016275 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{SBC_BLADE,3}"; char *epp_str = "{SYSTEM_CHASSIS,1}{.,.}"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_FALSE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-2.14.1/utils/t/epath/ep_cmp_006.c0000644000076400007640000000150211302567127014673 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * Chris Chia * Steve Sherman */ #include #include #include #include /* oh_cmp_ep: null pointer testcase. */ int main(int argc, char **argv) { SaHpiEntityPathT ep; if (oh_cmp_ep(NULL, &ep)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); return -1; } return 0; } openhpi-2.14.1/utils/t/epath/epath_pattern_257.c0000644000076400007640000000322011302567127016275 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{SBC_BLADE,3}{ADD_IN_CARD,8}"; char *epp_str = "{SBC_BLADE,3}"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_FALSE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-2.14.1/utils/t/epath/epath_conv_077.c0000644000076400007640000000506411302567127015575 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. */ /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_tests.pl. * Do not change this file manually. Update script instead *******************************************************************/ #include #include #include /** * main: * epathstr -> epath test * * Test if an entity path string is converted properly into an entity path. **/ int main(int argc, char **argv) { char *test_string = "{SWITCH,85}{PERIPHERAL_BAY_2,28}"; oh_big_textbuffer bigbuf; SaErrorT err; SaHpiEntityPathT ep; err = oh_encode_entitypath(test_string, &ep); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } if (ep.Entry[0].EntityType != SAHPI_ENT_PERIPHERAL_BAY_2) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[0].EntityType, SAHPI_ENT_PERIPHERAL_BAY_2); return -1; } if (ep.Entry[0].EntityLocation != 28) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[0].EntityLocation, 28); return -1; } if (ep.Entry[1].EntityType != SAHPI_ENT_SWITCH) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[1].EntityType, SAHPI_ENT_SWITCH); return -1; } if (ep.Entry[1].EntityLocation != 85) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[1].EntityLocation, 85); return -1; } oh_init_bigtext(&bigbuf); err = oh_decode_entitypath(&ep, &bigbuf); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } if (strcmp((char *)bigbuf.Data, test_string)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received Entity Path=%s.\n", bigbuf.Data); return -1; } return 0; } openhpi-2.14.1/utils/t/epath/epath_pattern_403.c0000644000076400007640000000323411302567127016273 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{GROUP,7}{REMOTE,2}{SUBRACK,4}"; char *epp_str = "{SYSTEM_CHASSIS,1}{.,.}"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_FALSE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-2.14.1/utils/t/epath/epath_conv_000.c0000644000076400007640000000512511302567127015555 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. */ /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_tests.pl. * Do not change this file manually. Update script instead *******************************************************************/ #include #include #include /** * main: * epathstr -> epath test * * Test if an entity path string is converted properly into an entity path. **/ int main(int argc, char **argv) { char *test_string = "{EXTERNAL_ENVIRONMENT,73}{PHYSICAL_SLOT,61}"; oh_big_textbuffer bigbuf; SaErrorT err; SaHpiEntityPathT ep; err = oh_encode_entitypath(test_string, &ep); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } if (ep.Entry[0].EntityType != SAHPI_ENT_PHYSICAL_SLOT) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[0].EntityType, SAHPI_ENT_PHYSICAL_SLOT); return -1; } if (ep.Entry[0].EntityLocation != 61) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[0].EntityLocation, 61); return -1; } if (ep.Entry[1].EntityType != SAHPI_ENT_EXTERNAL_ENVIRONMENT) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[1].EntityType, SAHPI_ENT_EXTERNAL_ENVIRONMENT); return -1; } if (ep.Entry[1].EntityLocation != 73) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[1].EntityLocation, 73); return -1; } oh_init_bigtext(&bigbuf); err = oh_decode_entitypath(&ep, &bigbuf); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } if (strcmp((char *)bigbuf.Data, test_string)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received Entity Path=%s.\n", bigbuf.Data); return -1; } return 0; } openhpi-2.14.1/utils/t/epath/epath_pattern_159.c0000644000076400007640000000323411302567127016303 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{GROUP,4}{SYSTEM_CHASSIS,1}{SBC_BLADE,3}"; char *epp_str = "*{SBC_BLADE,.}"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_TRUE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-2.14.1/utils/t/epath/epath_pattern_322.c0000644000076400007640000000323611302567127016275 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{PHYSICAL_SLOT,4}{SBC_BLADE,3}{ADD_IN_CARD,8}"; char *epp_str = "{.,.}{.,.}*"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_TRUE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-2.14.1/utils/t/epath/epath_pattern_251.c0000644000076400007640000000324211302567127016273 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{SBC_BLADE,3}{ADD_IN_CARD,8}"; char *epp_str = "{SYSTEM_CHASSIS,1}{SBC_BLADE,.}"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_FALSE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-2.14.1/utils/t/epath/set_ep_loc_001.c0000755000076400007640000000240011302567127015540 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * Steve Sherman */ #include #include #include #include /* oh_set_ep_location: Zero entry entity path testcase. * Call should be ok but not change anything. */ int main(int argc, char **argv) { SaErrorT err; SaHpiEntityPathT ep = {{{0,0}}}; SaHpiEntityLocationT x = 3; err = oh_set_ep_location(&ep, SAHPI_ENT_BACK_PANEL_BOARD, x); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } if (ep.Entry[0].EntityLocation != 0) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); return -1; } if (ep.Entry[0].EntityType != 0) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); return -1; } return 0; } openhpi-2.14.1/utils/t/epath/epath_pattern_234.c0000644000076400007640000000320111302567127016267 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{SBC_BLADE,3}"; char *epp_str = "*{SBC_BLADE,.}"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_TRUE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-2.14.1/utils/t/epath/print_ep_003.c0000644000076400007640000000225611302567127015254 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * Chris Chia * Steve Sherman */ #include #include #include #include /* oh_print_ep: Multi-element entity path testcase. */ int main(int argc, char **argv) { int offsets = 0; SaErrorT err; SaHpiEntityPathT ep = {{{SAHPI_ENT_FAN,4}, {SAHPI_ENT_SBC_BLADE,3}, {SAHPI_ENT_RACK,2}, {SAHPI_ENT_ROOT,1}, {0}}}; printf("Good multi-element testcase\n"); err = oh_print_ep(&ep, offsets); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } return 0; } openhpi-2.14.1/utils/t/epath/epath_pattern_077.c0000644000076400007640000000330611302567127016302 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{SYSTEM_CHASSIS,1}{PHYSICAL_SLOT,3}{SBC_BLADE,3}{ADD_IN_CARD,8}"; char *epp_str = "{SYSTEM_CHASSIS,1}{SBC_BLADE,.}*"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_FALSE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-2.14.1/utils/t/epath/epath_conv_027.c0000644000076400007640000000504511302567127015567 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. */ /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_tests.pl. * Do not change this file manually. Update script instead *******************************************************************/ #include #include #include /** * main: * epathstr -> epath test * * Test if an entity path string is converted properly into an entity path. **/ int main(int argc, char **argv) { char *test_string = "{OTHER,55}{SYSTEM_BOARD,63}"; oh_big_textbuffer bigbuf; SaErrorT err; SaHpiEntityPathT ep; err = oh_encode_entitypath(test_string, &ep); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } if (ep.Entry[0].EntityType != SAHPI_ENT_SYSTEM_BOARD) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[0].EntityType, SAHPI_ENT_SYSTEM_BOARD); return -1; } if (ep.Entry[0].EntityLocation != 63) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[0].EntityLocation, 63); return -1; } if (ep.Entry[1].EntityType != SAHPI_ENT_OTHER) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[1].EntityType, SAHPI_ENT_OTHER); return -1; } if (ep.Entry[1].EntityLocation != 55) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[1].EntityLocation, 55); return -1; } oh_init_bigtext(&bigbuf); err = oh_decode_entitypath(&ep, &bigbuf); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } if (strcmp((char *)bigbuf.Data, test_string)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received Entity Path=%s.\n", bigbuf.Data); return -1; } return 0; } openhpi-2.14.1/utils/t/epath/epath_conv_012.c0000644000076400007640000000507211302567127015561 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. */ /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_tests.pl. * Do not change this file manually. Update script instead *******************************************************************/ #include #include #include /** * main: * epathstr -> epath test * * Test if an entity path string is converted properly into an entity path. **/ int main(int argc, char **argv) { char *test_string = "{UNSPECIFIED,57}{SHELF_MANAGER,95}"; oh_big_textbuffer bigbuf; SaErrorT err; SaHpiEntityPathT ep; err = oh_encode_entitypath(test_string, &ep); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } if (ep.Entry[0].EntityType != SAHPI_ENT_SHELF_MANAGER) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[0].EntityType, SAHPI_ENT_SHELF_MANAGER); return -1; } if (ep.Entry[0].EntityLocation != 95) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[0].EntityLocation, 95); return -1; } if (ep.Entry[1].EntityType != SAHPI_ENT_UNSPECIFIED) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[1].EntityType, SAHPI_ENT_UNSPECIFIED); return -1; } if (ep.Entry[1].EntityLocation != 57) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[1].EntityLocation, 57); return -1; } oh_init_bigtext(&bigbuf); err = oh_decode_entitypath(&ep, &bigbuf); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } if (strcmp((char *)bigbuf.Data, test_string)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received Entity Path=%s.\n", bigbuf.Data); return -1; } return 0; } openhpi-2.14.1/utils/t/epath/epath_pattern_296.c0000644000076400007640000000322011302567127016300 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{PHYSICAL_SLOT,4}{SBC_BLADE,3}"; char *epp_str = "{.,.}*{.,.}*"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_TRUE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-2.14.1/utils/t/epath/epath_pattern_407.c0000644000076400007640000000322211302567127016274 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{GROUP,7}{REMOTE,2}{SUBRACK,4}"; char *epp_str = "{SBC_BLADE,3}"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_FALSE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-2.14.1/utils/t/epath/epath_pattern_167.c0000644000076400007640000000322411302567127016301 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{GROUP,4}{SYSTEM_CHASSIS,1}{SBC_BLADE,3}"; char *epp_str = "*{.,.}"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_TRUE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-2.14.1/utils/t/epath/epath_pattern_151.c0000644000076400007640000000325611302567127016277 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{GROUP,4}{SYSTEM_CHASSIS,1}{SBC_BLADE,3}"; char *epp_str = "{SYSTEM_CHASSIS,1}{SBC_BLADE,.}"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_FALSE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-2.14.1/utils/t/epath/epath_pattern_134.c0000644000076400007640000000322011302567127016267 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{GROUP,4}{SYSTEM_CHASSIS,1}"; char *epp_str = "*{SBC_BLADE,.}"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_FALSE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-2.14.1/utils/t/epath/epath_pattern_207.c0000644000076400007640000000325511302567127016300 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{GROUP,4}{SYSTEM_CHASSIS,1}{PHYSICAL_SLOT,3}{SBC_BLADE,3}"; char *epp_str = "{SBC_BLADE,3}"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_FALSE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-2.14.1/utils/t/epath/ep_cmp_003.c0000644000076400007640000000266111302567127014677 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * Chris Chia * Steve Sherman */ #include #include #include #include /* oh_cmp_ep: multi-element entity path testcase. */ int main(int argc, char **argv) { SaHpiEntityPathT ep1 = {{{SAHPI_ENT_ADD_IN_CARD,11}, {SAHPI_ENT_FRONT_PANEL_BOARD,22}, {SAHPI_ENT_BACK_PANEL_BOARD,33}, {SAHPI_ENT_POWER_SYSTEM_BOARD,44}, {SAHPI_ENT_ROOT, 0}}}; SaHpiEntityPathT ep2 = {{{SAHPI_ENT_ADD_IN_CARD,11}, {SAHPI_ENT_FRONT_PANEL_BOARD,22}, {SAHPI_ENT_BACK_PANEL_BOARD,33}, {SAHPI_ENT_POWER_SYSTEM_BOARD,44}, {SAHPI_ENT_ROOT, 0}}}; if (!oh_cmp_ep(&ep1, &ep2)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); return -1; } return 0; } openhpi-2.14.1/utils/t/epath/epath_pattern_393.c0000644000076400007640000000320011302567127016274 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{GROUP,2}{SUBRACK,5}"; char *epp_str = "{.,.}*"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_TRUE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-2.14.1/utils/t/epath/epath_conv_070.c0000644000076400007640000000502611302567127015564 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. */ /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_tests.pl. * Do not change this file manually. Update script instead *******************************************************************/ #include #include #include /** * main: * epathstr -> epath test * * Test if an entity path string is converted properly into an entity path. **/ int main(int argc, char **argv) { char *test_string = "{RACK,66}{IO_BLADE,57}"; oh_big_textbuffer bigbuf; SaErrorT err; SaHpiEntityPathT ep; err = oh_encode_entitypath(test_string, &ep); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } if (ep.Entry[0].EntityType != SAHPI_ENT_IO_BLADE) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[0].EntityType, SAHPI_ENT_IO_BLADE); return -1; } if (ep.Entry[0].EntityLocation != 57) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[0].EntityLocation, 57); return -1; } if (ep.Entry[1].EntityType != SAHPI_ENT_RACK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[1].EntityType, SAHPI_ENT_RACK); return -1; } if (ep.Entry[1].EntityLocation != 66) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[1].EntityLocation, 66); return -1; } oh_init_bigtext(&bigbuf); err = oh_decode_entitypath(&ep, &bigbuf); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } if (strcmp((char *)bigbuf.Data, test_string)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received Entity Path=%s.\n", bigbuf.Data); return -1; } return 0; } openhpi-2.14.1/utils/t/epath/ep_concat_005.c0000644000076400007640000000365311302567127015373 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * Chris Chia * Steve Sherman */ #include #include #include #include /* oh_concat_ep: concatenate two 3 element entity path */ int main(int argc, char **argv) { SaErrorT err; SaHpiEntityPathT ep1 = {{{SAHPI_ENT_PERIPHERAL_BAY,55}, {SAHPI_ENT_SYS_MGMNT_MODULE,66}, {SAHPI_ENT_SYSTEM_BOARD,77}, {SAHPI_ENT_ROOT,0}}}; SaHpiEntityPathT ep2 = {{{SAHPI_ENT_MEMORY_MODULE,88}, {SAHPI_ENT_PROCESSOR_MODULE,99}, {SAHPI_ENT_POWER_SUPPLY,101}, {SAHPI_ENT_ROOT,0}}}; SaHpiEntityPathT ep3 = {{{SAHPI_ENT_PERIPHERAL_BAY,55}, {SAHPI_ENT_SYS_MGMNT_MODULE,66}, {SAHPI_ENT_SYSTEM_BOARD,77}, {SAHPI_ENT_MEMORY_MODULE,88}, {SAHPI_ENT_PROCESSOR_MODULE,99}, {SAHPI_ENT_POWER_SUPPLY,101}, {SAHPI_ENT_ROOT,0}}}; err = oh_concat_ep(&ep1, &ep2); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } if (!oh_cmp_ep(&ep1, &ep3)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); return -1; } return 0; } openhpi-2.14.1/utils/t/epath/epath_pattern_204.c0000644000076400007640000000327011302567127016272 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{GROUP,4}{SYSTEM_CHASSIS,1}{PHYSICAL_SLOT,3}{SBC_BLADE,3}"; char *epp_str = "{SYSTEM_CHASSIS,1}{.,.}*"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_FALSE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-2.14.1/utils/t/epath/set_ep_loc_009.c0000755000076400007640000000243111302567127015554 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * Steve Sherman */ #include #include #include #include /** * oh_set_ep_location: Entity type not in entity path. * OK but no changed results. **/ int main(int argc, char **argv) { SaErrorT err; SaHpiEntityPathT ep = {{{SAHPI_ENT_FAN, 494949},{0}}}; SaHpiEntityLocationT x = 6767; err = oh_set_ep_location(&ep, SAHPI_ENT_DISK_BLADE, x); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } if (ep.Entry[0].EntityLocation != 494949) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); return -1; } if (ep.Entry[0].EntityType != SAHPI_ENT_FAN) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); return -1; } return 0; } openhpi-2.14.1/utils/t/epath/epath_pattern_044.c0000644000076400007640000000317711302567127016302 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{SYSTEM_CHASSIS,1}"; char *epp_str = "*{.,.}*"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_TRUE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-2.14.1/utils/t/epath/epath_pattern_115.c0000644000076400007640000000330111302567127016266 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{GROUP,4}{SYSTEM_CHASSIS,1}{PHYSICAL_SLOT,3}{SBC_BLADE,3}{ADD_IN_CARD,8}"; char *epp_str = "{SYSTEM_CHASSIS,.}"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_FALSE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-2.14.1/utils/t/epath/epath_pattern_363.c0000644000076400007640000000322111302567127016274 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{GROUP,2}"; char *epp_str = "*{SYSTEM_CHASSIS,.}*{SBC_BLADE,.}"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_FALSE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-2.14.1/utils/t/epath/ep_cmp_009.c0000644000076400007640000000213511302567127014701 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * Chris Chia * Steve Sherman */ #include #include #include #include /* oh_cmp_ep: compare multi-element to zero element entity path testcase. */ int main(int argc, char **argv) { SaHpiEntityPathT ep1 = {{{SAHPI_ENT_FAN,4}, {SAHPI_ENT_SBC_BLADE,3}, {SAHPI_ENT_RACK,2}, {SAHPI_ENT_ROOT,0}}}; SaHpiEntityPathT ep2 = {{{SAHPI_ENT_ROOT, 0}}}; if (oh_cmp_ep(&ep1, &ep2)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); return -1; } return 0; } openhpi-2.14.1/utils/t/epath/epath_pattern_444.c0000644000076400007640000000322311302567127016276 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{GROUP,7}{REMOTE,2}{SUBRACK,4}{BIOS,8}"; char *epp_str = "*{.,.}*"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_TRUE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-2.14.1/utils/t/epath/epath_pattern_248.c0000644000076400007640000000317711302567127016310 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{SBC_BLADE,3}"; char *epp_str = "*{.,.}{.,.}"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_FALSE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-2.14.1/utils/t/epath/epath_pattern_332.c0000644000076400007640000000324411302567127016275 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{SYSTEM_CHASSIS,1}{PHYSICAL_SLOT,4}{SBC_BLADE,3}"; char *epp_str = "{SBC_BLADE,3}"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_FALSE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-2.14.1/utils/t/epath/epath_pattern_295.c0000644000076400007640000000322011302567127016277 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{PHYSICAL_SLOT,4}{SBC_BLADE,3}"; char *epp_str = "*{.,.}*{.,.}"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_TRUE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-2.14.1/utils/t/epath/epath_pattern_221.c0000644000076400007640000000325311302567127016272 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{GROUP,4}{SYSTEM_CHASSIS,1}{PHYSICAL_SLOT,3}{SBC_BLADE,3}"; char *epp_str = "{.,.}*{.,.}*"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_TRUE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-2.14.1/utils/t/epath/epath_pattern_127.c0000644000076400007640000000324211302567127016275 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{GROUP,4}{SYSTEM_CHASSIS,1}"; char *epp_str = "{SYSTEM_CHASSIS,1}{SBC_BLADE,.}*"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_FALSE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-2.14.1/utils/t/epath/epath_conv_006.c0000644000076400007640000000506411302567127015565 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. */ /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_tests.pl. * Do not change this file manually. Update script instead *******************************************************************/ #include #include #include /** * main: * epathstr -> epath test * * Test if an entity path string is converted properly into an entity path. **/ int main(int argc, char **argv) { char *test_string = "{PERIPHERAL_BAY,12}{DISK_BAY,62}"; oh_big_textbuffer bigbuf; SaErrorT err; SaHpiEntityPathT ep; err = oh_encode_entitypath(test_string, &ep); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } if (ep.Entry[0].EntityType != SAHPI_ENT_DISK_BAY) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[0].EntityType, SAHPI_ENT_DISK_BAY); return -1; } if (ep.Entry[0].EntityLocation != 62) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[0].EntityLocation, 62); return -1; } if (ep.Entry[1].EntityType != SAHPI_ENT_PERIPHERAL_BAY) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[1].EntityType, SAHPI_ENT_PERIPHERAL_BAY); return -1; } if (ep.Entry[1].EntityLocation != 12) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[1].EntityLocation, 12); return -1; } oh_init_bigtext(&bigbuf); err = oh_decode_entitypath(&ep, &bigbuf); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } if (strcmp((char *)bigbuf.Data, test_string)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received Entity Path=%s.\n", bigbuf.Data); return -1; } return 0; } openhpi-2.14.1/utils/t/epath/epath_pattern_272.c0000644000076400007640000000321511302567127016276 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{SBC_BLADE,3}{ADD_IN_CARD,8}"; char *epp_str = "{.,.}{.,.}*"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_TRUE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-2.14.1/utils/t/epath/epath_pattern_139.c0000644000076400007640000000324411302567127016302 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{GROUP,4}{SYSTEM_CHASSIS,1}"; char *epp_str = "*{SYSTEM_CHASSIS,.}*{SBC_BLADE,.}*"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_FALSE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-2.14.1/utils/t/epath/epath_pattern_003.c0000644000076400007640000000323411302567127016267 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{SYSTEM_CHASSIS,1}{SBC_BLADE,3}"; char *epp_str = "{SYSTEM_CHASSIS,1}{.,.}"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_TRUE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-2.14.1/utils/t/epath/epath_pattern_212.c0000644000076400007640000000330011302567127016263 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{GROUP,4}{SYSTEM_CHASSIS,1}{PHYSICAL_SLOT,3}{SBC_BLADE,3}"; char *epp_str = "*{SYSTEM_CHASSIS,.}{SBC_BLADE,.}"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_FALSE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-2.14.1/utils/t/epath/epath_pattern_323.c0000644000076400007640000000323611302567127016276 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{PHYSICAL_SLOT,4}{SBC_BLADE,3}{ADD_IN_CARD,8}"; char *epp_str = "*{.,.}{.,.}"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_TRUE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-2.14.1/utils/t/epath/epath_pattern_030.c0000644000076400007640000000321311302567127016264 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{SYSTEM_CHASSIS,1}"; char *epp_str = "{SYSTEM_CHASSIS,1}*"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_TRUE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-2.14.1/utils/t/epath/epath_pattern_045.c0000644000076400007640000000320511302567127016273 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{SYSTEM_CHASSIS,1}"; char *epp_str = "*{.,.}*{.,.}"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_FALSE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-2.14.1/utils/t/epath/epath_conv_030.c0000644000076400007640000000511711302567127015561 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. */ /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_tests.pl. * Do not change this file manually. Update script instead *******************************************************************/ #include #include #include /** * main: * epathstr -> epath test * * Test if an entity path string is converted properly into an entity path. **/ int main(int argc, char **argv) { char *test_string = "{SPEC_PROC_BLADE,26}{BACK_PANEL_BOARD,36}"; oh_big_textbuffer bigbuf; SaErrorT err; SaHpiEntityPathT ep; err = oh_encode_entitypath(test_string, &ep); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } if (ep.Entry[0].EntityType != SAHPI_ENT_BACK_PANEL_BOARD) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[0].EntityType, SAHPI_ENT_BACK_PANEL_BOARD); return -1; } if (ep.Entry[0].EntityLocation != 36) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[0].EntityLocation, 36); return -1; } if (ep.Entry[1].EntityType != SAHPI_ENT_SPEC_PROC_BLADE) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[1].EntityType, SAHPI_ENT_SPEC_PROC_BLADE); return -1; } if (ep.Entry[1].EntityLocation != 26) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[1].EntityLocation, 26); return -1; } oh_init_bigtext(&bigbuf); err = oh_decode_entitypath(&ep, &bigbuf); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } if (strcmp((char *)bigbuf.Data, test_string)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received Entity Path=%s.\n", bigbuf.Data); return -1; } return 0; } openhpi-2.14.1/utils/t/epath/epath_pattern_351.c0000644000076400007640000000321711302567127016276 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{GROUP,2}"; char *epp_str = "{SYSTEM_CHASSIS,1}{SBC_BLADE,.}"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_FALSE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-2.14.1/utils/t/epath/epath_conv_031.c0000644000076400007640000000504211302567127015557 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. */ /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_tests.pl. * Do not change this file manually. Update script instead *******************************************************************/ #include #include #include /** * main: * epathstr -> epath test * * Test if an entity path string is converted properly into an entity path. **/ int main(int argc, char **argv) { char *test_string = "{POWER_MGMNT,36}{OTHER,18}"; oh_big_textbuffer bigbuf; SaErrorT err; SaHpiEntityPathT ep; err = oh_encode_entitypath(test_string, &ep); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } if (ep.Entry[0].EntityType != SAHPI_ENT_OTHER) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[0].EntityType, SAHPI_ENT_OTHER); return -1; } if (ep.Entry[0].EntityLocation != 18) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[0].EntityLocation, 18); return -1; } if (ep.Entry[1].EntityType != SAHPI_ENT_POWER_MGMNT) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[1].EntityType, SAHPI_ENT_POWER_MGMNT); return -1; } if (ep.Entry[1].EntityLocation != 36) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[1].EntityLocation, 36); return -1; } oh_init_bigtext(&bigbuf); err = oh_decode_entitypath(&ep, &bigbuf); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } if (strcmp((char *)bigbuf.Data, test_string)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received Entity Path=%s.\n", bigbuf.Data); return -1; } return 0; } openhpi-2.14.1/utils/t/epath/epath_pattern_386.c0000644000076400007640000000323411302567127016305 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{GROUP,2}{SUBRACK,5}"; char *epp_str = "*{SYSTEM_CHASSIS,1}{SBC_BLADE,.}*"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_FALSE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-2.14.1/utils/t/epath/epath_pattern_046.c0000644000076400007640000000320511302567127016274 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{SYSTEM_CHASSIS,1}"; char *epp_str = "{.,.}*{.,.}*"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_FALSE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-2.14.1/utils/t/epath/epath_pattern_360.c0000644000076400007640000000317711302567127016303 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{GROUP,2}"; char *epp_str = "*{SBC_BLADE,.}*"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_FALSE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-2.14.1/utils/t/epath/epath_pattern_225.c0000644000076400007640000000322311302567127016273 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{SBC_BLADE,3}"; char *epp_str = "{SYSTEM_CHASSIS,1}{SBC_BLADE,3}"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_FALSE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-2.14.1/utils/t/epath/epath_pattern_144.c0000644000076400007640000000321011302567127016267 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{GROUP,4}{SYSTEM_CHASSIS,1}"; char *epp_str = "*{.,.}*"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_TRUE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-2.14.1/utils/t/epath/epath_pattern_027.c0000644000076400007640000000323111302567127016272 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{SYSTEM_CHASSIS,1}"; char *epp_str = "{SYSTEM_CHASSIS,1}{SBC_BLADE,.}*"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_FALSE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-2.14.1/utils/t/epath/epath_pattern_055.c0000644000076400007640000000324711302567127016302 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{SYSTEM_CHASSIS,1}{SBC_BLADE,3}{ADD_IN_CARD,8}"; char *epp_str = "{SYSTEM_CHASSIS,1}*"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_TRUE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-2.14.1/utils/t/epath/epath_pattern_336.c0000644000076400007640000000327011302567127016300 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{SYSTEM_CHASSIS,1}{PHYSICAL_SLOT,4}{SBC_BLADE,3}"; char *epp_str = "*{SYSTEM_CHASSIS,1}{SBC_BLADE,.}*"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_FALSE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-2.14.1/utils/t/epath/epath_pattern_309.c0000644000076400007640000000324211302567127016277 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{PHYSICAL_SLOT,4}{SBC_BLADE,3}{ADD_IN_CARD,8}"; char *epp_str = "*{SBC_BLADE,.}"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_FALSE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-2.14.1/utils/t/epath/epath_pattern_294.c0000644000076400007640000000321311302567127016300 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{PHYSICAL_SLOT,4}{SBC_BLADE,3}"; char *epp_str = "*{.,.}*"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_TRUE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-2.14.1/utils/t/epath/epath_pattern_404.c0000644000076400007640000000323511302567127016275 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{GROUP,7}{REMOTE,2}{SUBRACK,4}"; char *epp_str = "{SYSTEM_CHASSIS,1}{.,.}*"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_FALSE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-2.14.1/utils/t/epath/epath_pattern_238.c0000644000076400007640000000322511302567127016301 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{SBC_BLADE,3}"; char *epp_str = "*{SYSTEM_CHASSIS,.}*{SBC_BLADE,.}"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_FALSE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-2.14.1/utils/t/epath/epath_pattern_438.c0000644000076400007640000000325611302567127016307 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{GROUP,7}{REMOTE,2}{SUBRACK,4}{BIOS,8}"; char *epp_str = "*{SYSTEM_CHASSIS,.}*{SBC_BLADE,.}"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_FALSE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-2.14.1/utils/t/epath/epath_pattern_083.c0000644000076400007640000000326411302567127016302 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{SYSTEM_CHASSIS,1}{PHYSICAL_SLOT,3}{SBC_BLADE,3}{ADD_IN_CARD,8}"; char *epp_str = "*{SBC_BLADE,3}"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_FALSE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-2.14.1/utils/t/epath/epath_pattern_051.c0000644000076400007640000000326411302567127016275 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{SYSTEM_CHASSIS,1}{SBC_BLADE,3}{ADD_IN_CARD,8}"; char *epp_str = "{SYSTEM_CHASSIS,1}{SBC_BLADE,.}"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_FALSE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-2.14.1/utils/t/epath/epath_pattern_300.c0000644000076400007640000000326311302567127016271 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{PHYSICAL_SLOT,4}{SBC_BLADE,3}{ADD_IN_CARD,8}"; char *epp_str = "{SYSTEM_CHASSIS,1}{SBC_BLADE,3}"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_FALSE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-2.14.1/utils/t/epath/epath_pattern_157.c0000644000076400007640000000323411302567127016301 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{GROUP,4}{SYSTEM_CHASSIS,1}{SBC_BLADE,3}"; char *epp_str = "{SBC_BLADE,3}"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_FALSE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-2.14.1/utils/t/epath/epath_pattern_056.c0000644000076400007640000000324711302567127016303 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{SYSTEM_CHASSIS,1}{SBC_BLADE,3}{ADD_IN_CARD,8}"; char *epp_str = "{SYSTEM_CHASSIS,1}"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_FALSE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-2.14.1/utils/t/epath/ep_concat_001.c0000644000076400007640000000223611302567127015363 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * Renier Morales * Steve Sherman */ #include #include #include /* oh_concat_ep test. NULL as the second parameter testcase. */ int main(int argc, char **argv) { char *test_string = "{CHASSIS_SPECIFIC,89}{OPERATING_SYSTEM,46}"; SaErrorT err; SaHpiEntityPathT ep; err = oh_encode_entitypath(test_string, &ep); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } err = oh_concat_ep(&ep, NULL); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } return 0; } openhpi-2.14.1/utils/t/epath/epath_conv_081.c0000644000076400007640000000506711302567127015573 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. */ /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_tests.pl. * Do not change this file manually. Update script instead *******************************************************************/ #include #include #include /** * main: * epathstr -> epath test * * Test if an entity path string is converted properly into an entity path. **/ int main(int argc, char **argv) { char *test_string = "{SPEC_PROC_BLADE,68}{DISK_BAY,82}"; oh_big_textbuffer bigbuf; SaErrorT err; SaHpiEntityPathT ep; err = oh_encode_entitypath(test_string, &ep); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } if (ep.Entry[0].EntityType != SAHPI_ENT_DISK_BAY) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[0].EntityType, SAHPI_ENT_DISK_BAY); return -1; } if (ep.Entry[0].EntityLocation != 82) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[0].EntityLocation, 82); return -1; } if (ep.Entry[1].EntityType != SAHPI_ENT_SPEC_PROC_BLADE) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[1].EntityType, SAHPI_ENT_SPEC_PROC_BLADE); return -1; } if (ep.Entry[1].EntityLocation != 68) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[1].EntityLocation, 68); return -1; } oh_init_bigtext(&bigbuf); err = oh_decode_entitypath(&ep, &bigbuf); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } if (strcmp((char *)bigbuf.Data, test_string)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received Entity Path=%s.\n", bigbuf.Data); return -1; } return 0; } openhpi-2.14.1/utils/t/epath/epath_conv_053.c0000644000076400007640000000507211302567127015566 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. */ /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_tests.pl. * Do not change this file manually. Update script instead *******************************************************************/ #include #include #include /** * main: * epathstr -> epath test * * Test if an entity path string is converted properly into an entity path. **/ int main(int argc, char **argv) { char *test_string = "{UNKNOWN,87}{BOARD_SET_SPECIFIC,0}"; oh_big_textbuffer bigbuf; SaErrorT err; SaHpiEntityPathT ep; err = oh_encode_entitypath(test_string, &ep); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } if (ep.Entry[0].EntityType != SAHPI_ENT_BOARD_SET_SPECIFIC) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[0].EntityType, SAHPI_ENT_BOARD_SET_SPECIFIC); return -1; } if (ep.Entry[0].EntityLocation != 0) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[0].EntityLocation, 0); return -1; } if (ep.Entry[1].EntityType != SAHPI_ENT_UNKNOWN) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[1].EntityType, SAHPI_ENT_UNKNOWN); return -1; } if (ep.Entry[1].EntityLocation != 87) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[1].EntityLocation, 87); return -1; } oh_init_bigtext(&bigbuf); err = oh_decode_entitypath(&ep, &bigbuf); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } if (strcmp((char *)bigbuf.Data, test_string)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received Entity Path=%s.\n", bigbuf.Data); return -1; } return 0; } openhpi-2.14.1/utils/t/epath/epath_pattern_161.c0000644000076400007640000000325711302567127016301 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{GROUP,4}{SYSTEM_CHASSIS,1}{SBC_BLADE,3}"; char *epp_str = "*{SYSTEM_CHASSIS,1}{SBC_BLADE,.}*"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_TRUE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-2.14.1/utils/t/epath/epath_pattern_043.c0000644000076400007640000000317611302567127016300 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{SYSTEM_CHASSIS,1}"; char *epp_str = "{.,.}*"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_TRUE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-2.14.1/utils/t/epath/epath_pattern_053.c0000644000076400007640000000325411302567127016276 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{SYSTEM_CHASSIS,1}{SBC_BLADE,3}{ADD_IN_CARD,8}"; char *epp_str = "{SYSTEM_CHASSIS,1}{.,.}"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_FALSE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-2.14.1/utils/t/epath/epath_conv_007.c0000644000076400007640000000511111302567127015557 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. */ /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_tests.pl. * Do not change this file manually. Update script instead *******************************************************************/ #include #include #include /** * main: * epathstr -> epath test * * Test if an entity path string is converted properly into an entity path. **/ int main(int argc, char **argv) { char *test_string = "{DISPLAY_PANEL,41}{PERIPHERAL_BAY_2,39}"; oh_big_textbuffer bigbuf; SaErrorT err; SaHpiEntityPathT ep; err = oh_encode_entitypath(test_string, &ep); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } if (ep.Entry[0].EntityType != SAHPI_ENT_PERIPHERAL_BAY_2) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[0].EntityType, SAHPI_ENT_PERIPHERAL_BAY_2); return -1; } if (ep.Entry[0].EntityLocation != 39) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[0].EntityLocation, 39); return -1; } if (ep.Entry[1].EntityType != SAHPI_ENT_DISPLAY_PANEL) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[1].EntityType, SAHPI_ENT_DISPLAY_PANEL); return -1; } if (ep.Entry[1].EntityLocation != 41) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[1].EntityLocation, 41); return -1; } oh_init_bigtext(&bigbuf); err = oh_decode_entitypath(&ep, &bigbuf); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } if (strcmp((char *)bigbuf.Data, test_string)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received Entity Path=%s.\n", bigbuf.Data); return -1; } return 0; } openhpi-2.14.1/utils/t/epath/epath_pattern_119.c0000644000076400007640000000326511302567127016303 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{GROUP,4}{SYSTEM_CHASSIS,1}{PHYSICAL_SLOT,3}{SBC_BLADE,3}{ADD_IN_CARD,8}"; char *epp_str = "*{.,.}*"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_TRUE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-2.14.1/utils/t/epath/epath_pattern_359.c0000644000076400007640000000317611302567127016312 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{GROUP,2}"; char *epp_str = "*{SBC_BLADE,.}"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_FALSE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-2.14.1/utils/t/epath/set_ep_loc_013.c0000755000076400007640000000274511302567127015557 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * Steve Sherman */ #include #include #include #include /* oh_set_ep_location: Entity type not in entity path. * OK but nothing changed. */ int main(int argc, char **argv) { unsigned int y = 45321; unsigned int i = 0; SaErrorT err; SaHpiEntityPathT ep; SaHpiEntityTypeT w = SAHPI_ENT_IO_BLADE; SaHpiEntityLocationT x = 56873; for (i=0; i */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{GROUP,2}{SUBRACK,5}"; char *epp_str = "{SYSTEM_CHASSIS,.}"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_FALSE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-2.14.1/utils/t/epath/epath_conv_017.c0000644000076400007640000000510311302567127015561 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. */ /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_tests.pl. * Do not change this file manually. Update script instead *******************************************************************/ #include #include #include /** * main: * epathstr -> epath test * * Test if an entity path string is converted properly into an entity path. **/ int main(int argc, char **argv) { char *test_string = "{ALARM_MANAGER,53}{SYSTEM_CHASSIS,49}"; oh_big_textbuffer bigbuf; SaErrorT err; SaHpiEntityPathT ep; err = oh_encode_entitypath(test_string, &ep); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } if (ep.Entry[0].EntityType != SAHPI_ENT_SYSTEM_CHASSIS) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[0].EntityType, SAHPI_ENT_SYSTEM_CHASSIS); return -1; } if (ep.Entry[0].EntityLocation != 49) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[0].EntityLocation, 49); return -1; } if (ep.Entry[1].EntityType != SAHPI_ENT_ALARM_MANAGER) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[1].EntityType, SAHPI_ENT_ALARM_MANAGER); return -1; } if (ep.Entry[1].EntityLocation != 53) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[1].EntityLocation, 53); return -1; } oh_init_bigtext(&bigbuf); err = oh_decode_entitypath(&ep, &bigbuf); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } if (strcmp((char *)bigbuf.Data, test_string)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received Entity Path=%s.\n", bigbuf.Data); return -1; } return 0; } openhpi-2.14.1/utils/t/epath/epath_conv_082.c0000644000076400007640000000511411302567127015565 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. */ /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_tests.pl. * Do not change this file manually. Update script instead *******************************************************************/ #include #include #include /** * main: * epathstr -> epath test * * Test if an entity path string is converted properly into an entity path. **/ int main(int argc, char **argv) { char *test_string = "{SYSTEM_BOARD,83}{OTHER_SYSTEM_BOARD,25}"; oh_big_textbuffer bigbuf; SaErrorT err; SaHpiEntityPathT ep; err = oh_encode_entitypath(test_string, &ep); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } if (ep.Entry[0].EntityType != SAHPI_ENT_OTHER_SYSTEM_BOARD) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[0].EntityType, SAHPI_ENT_OTHER_SYSTEM_BOARD); return -1; } if (ep.Entry[0].EntityLocation != 25) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[0].EntityLocation, 25); return -1; } if (ep.Entry[1].EntityType != SAHPI_ENT_SYSTEM_BOARD) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[1].EntityType, SAHPI_ENT_SYSTEM_BOARD); return -1; } if (ep.Entry[1].EntityLocation != 83) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[1].EntityLocation, 83); return -1; } oh_init_bigtext(&bigbuf); err = oh_decode_entitypath(&ep, &bigbuf); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } if (strcmp((char *)bigbuf.Data, test_string)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received Entity Path=%s.\n", bigbuf.Data); return -1; } return 0; } openhpi-2.14.1/utils/t/epath/epath_pattern_401.c0000644000076400007640000000324411302567127016272 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{GROUP,7}{REMOTE,2}{SUBRACK,4}"; char *epp_str = "{SYSTEM_CHASSIS,1}{SBC_BLADE,.}"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_FALSE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-2.14.1/utils/t/epath/epath_conv_013.c0000644000076400007640000000506411302567127015563 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. */ /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_tests.pl. * Do not change this file manually. Update script instead *******************************************************************/ #include #include #include /** * main: * epathstr -> epath test * * Test if an entity path string is converted properly into an entity path. **/ int main(int argc, char **argv) { char *test_string = "{SYSTEM_CHASSIS,77}{IO_BLADE,55}"; oh_big_textbuffer bigbuf; SaErrorT err; SaHpiEntityPathT ep; err = oh_encode_entitypath(test_string, &ep); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } if (ep.Entry[0].EntityType != SAHPI_ENT_IO_BLADE) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[0].EntityType, SAHPI_ENT_IO_BLADE); return -1; } if (ep.Entry[0].EntityLocation != 55) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[0].EntityLocation, 55); return -1; } if (ep.Entry[1].EntityType != SAHPI_ENT_SYSTEM_CHASSIS) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[1].EntityType, SAHPI_ENT_SYSTEM_CHASSIS); return -1; } if (ep.Entry[1].EntityLocation != 77) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[1].EntityLocation, 77); return -1; } oh_init_bigtext(&bigbuf); err = oh_decode_entitypath(&ep, &bigbuf); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } if (strcmp((char *)bigbuf.Data, test_string)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received Entity Path=%s.\n", bigbuf.Data); return -1; } return 0; } openhpi-2.14.1/utils/t/epath/epath_pattern_314.c0000644000076400007640000000326611302567127016301 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{PHYSICAL_SLOT,4}{SBC_BLADE,3}{ADD_IN_CARD,8}"; char *epp_str = "*{SYSTEM_CHASSIS,.}*{SBC_BLADE,.}*"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_FALSE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-2.14.1/utils/t/epath/epath_conv_089.c0000644000076400007640000000511711302567127015577 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. */ /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_tests.pl. * Do not change this file manually. Update script instead *******************************************************************/ #include #include #include /** * main: * epathstr -> epath test * * Test if an entity path string is converted properly into an entity path. **/ int main(int argc, char **argv) { char *test_string = "{PROCESSOR_BOARD,43}{OPERATING_SYSTEM,51}"; oh_big_textbuffer bigbuf; SaErrorT err; SaHpiEntityPathT ep; err = oh_encode_entitypath(test_string, &ep); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } if (ep.Entry[0].EntityType != SAHPI_ENT_OPERATING_SYSTEM) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[0].EntityType, SAHPI_ENT_OPERATING_SYSTEM); return -1; } if (ep.Entry[0].EntityLocation != 51) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[0].EntityLocation, 51); return -1; } if (ep.Entry[1].EntityType != SAHPI_ENT_PROCESSOR_BOARD) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[1].EntityType, SAHPI_ENT_PROCESSOR_BOARD); return -1; } if (ep.Entry[1].EntityLocation != 43) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[1].EntityLocation, 43); return -1; } oh_init_bigtext(&bigbuf); err = oh_decode_entitypath(&ep, &bigbuf); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } if (strcmp((char *)bigbuf.Data, test_string)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received Entity Path=%s.\n", bigbuf.Data); return -1; } return 0; } openhpi-2.14.1/utils/t/epath/epath_pattern_125.c0000644000076400007640000000324111302567127016272 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{GROUP,4}{SYSTEM_CHASSIS,1}"; char *epp_str = "{SYSTEM_CHASSIS,1}{SBC_BLADE,3}"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_FALSE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-2.14.1/utils/t/epath/epath_pattern_071.c0000644000076400007640000000324011302567127016271 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{SYSTEM_CHASSIS,1}{SBC_BLADE,3}{ADD_IN_CARD,8}"; char *epp_str = "{.,.}*{.,.}*"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_TRUE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-2.14.1/utils/t/epath/epath_pattern_249.c0000644000076400007640000000316411302567127016305 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{SBC_BLADE,3}"; char *epp_str = "*"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_TRUE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-2.14.1/utils/t/epath/epath_pattern_078.c0000644000076400007640000000327511302567127016310 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{SYSTEM_CHASSIS,1}{PHYSICAL_SLOT,3}{SBC_BLADE,3}{ADD_IN_CARD,8}"; char *epp_str = "{SYSTEM_CHASSIS,1}{.,.}"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_FALSE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-2.14.1/utils/t/epath/epath_pattern_001.c0000644000076400007640000000324411302567127016266 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{SYSTEM_CHASSIS,1}{SBC_BLADE,3}"; char *epp_str = "{SYSTEM_CHASSIS,1}{SBC_BLADE,.}"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_TRUE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-2.14.1/utils/t/epath/epath_pattern_423.c0000644000076400007640000000321711302567127016276 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{GROUP,7}{REMOTE,2}{SUBRACK,4}"; char *epp_str = "*{.,.}{.,.}"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_TRUE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-2.14.1/utils/t/epath/set_ep_loc_008.c0000755000076400007640000000462311302567127015560 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * Chris Chia * Steve Sherman */ #include #include #include #include /* oh_set_ep_location: 4 element entity path, victim element at head. * Only head element's instance number changed. */ int main(int argc, char **argv) { SaErrorT err; SaHpiEntityPathT ep = {{{SAHPI_ENT_ADD_IN_CARD, 101}, {SAHPI_ENT_POWER_MODULE, 2020}, {SAHPI_ENT_POWER_MGMNT, 30303}, {SAHPI_ENT_SUB_CHASSIS, 404040}, {0}}}; SaHpiEntityLocationT x = 555555; err = oh_set_ep_location(&ep, SAHPI_ENT_ADD_IN_CARD, x); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } if (ep.Entry[0].EntityLocation != x) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); return -1; } if (ep.Entry[0].EntityType != SAHPI_ENT_ADD_IN_CARD) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); return -1; } if (ep.Entry[1].EntityLocation != 2020) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); return -1; } if (ep.Entry[1].EntityType != SAHPI_ENT_POWER_MODULE) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); return -1; } if (ep.Entry[2].EntityLocation != 30303) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); return -1; } if (ep.Entry[2].EntityType != SAHPI_ENT_POWER_MGMNT) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); return -1; } if (ep.Entry[3].EntityLocation != 404040) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); return -1; } if (ep.Entry[3].EntityType != SAHPI_ENT_SUB_CHASSIS) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); return -1; } return 0; } openhpi-2.14.1/utils/t/epath/epath_pattern_171.c0000644000076400007640000000323211302567127016273 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{GROUP,4}{SYSTEM_CHASSIS,1}{SBC_BLADE,3}"; char *epp_str = "{.,.}*{.,.}*"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_TRUE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-2.14.1/utils/t/epath/epath_pattern_327.c0000644000076400007640000000326711302567127016306 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{SYSTEM_CHASSIS,1}{PHYSICAL_SLOT,4}{SBC_BLADE,3}"; char *epp_str = "{SYSTEM_CHASSIS,1}{SBC_BLADE,.}*"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_FALSE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-2.14.1/utils/t/epath/epath_pattern_088.c0000644000076400007640000000330711302567127016305 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{SYSTEM_CHASSIS,1}{PHYSICAL_SLOT,3}{SBC_BLADE,3}{ADD_IN_CARD,8}"; char *epp_str = "*{SYSTEM_CHASSIS,.}*{SBC_BLADE,.}"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_FALSE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-2.14.1/utils/t/epath/epath_pattern_072.c0000644000076400007640000000323711302567127016300 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{SYSTEM_CHASSIS,1}{SBC_BLADE,3}{ADD_IN_CARD,8}"; char *epp_str = "{.,.}{.,.}*"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_TRUE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-2.14.1/utils/t/epath/epath_conv_075.c0000644000076400007640000000507511302567127015575 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. */ /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_tests.pl. * Do not change this file manually. Update script instead *******************************************************************/ #include #include #include /** * main: * epathstr -> epath test * * Test if an entity path string is converted properly into an entity path. **/ int main(int argc, char **argv) { char *test_string = "{COOLING_UNIT,97}{ALARM_MANAGER,20}"; oh_big_textbuffer bigbuf; SaErrorT err; SaHpiEntityPathT ep; err = oh_encode_entitypath(test_string, &ep); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } if (ep.Entry[0].EntityType != SAHPI_ENT_ALARM_MANAGER) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[0].EntityType, SAHPI_ENT_ALARM_MANAGER); return -1; } if (ep.Entry[0].EntityLocation != 20) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[0].EntityLocation, 20); return -1; } if (ep.Entry[1].EntityType != SAHPI_ENT_COOLING_UNIT) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[1].EntityType, SAHPI_ENT_COOLING_UNIT); return -1; } if (ep.Entry[1].EntityLocation != 97) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[1].EntityLocation, 97); return -1; } oh_init_bigtext(&bigbuf); err = oh_decode_entitypath(&ep, &bigbuf); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } if (strcmp((char *)bigbuf.Data, test_string)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received Entity Path=%s.\n", bigbuf.Data); return -1; } return 0; } openhpi-2.14.1/utils/t/epath/print_ep_004.c0000644000076400007640000000252211302567127015251 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * Chris Chia * Steve Sherman */ #include #include #include #include /* oh_print_ep: Multi-element numeric entity path testcase. */ int main(int argc, char **argv) { int offsets = 1; SaErrorT err; SaHpiEntityPathT ep = {{{210,8}, {211,7}, {212,6}, {213,5}, {214,4}, {215,3}, {216,2}, {255,1}, {SAHPI_ENT_ROOT,1}, {0}}}; printf("Good multi-element numeric testcase. Offset\n"); err = oh_print_ep(&ep, offsets); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } return 0; } openhpi-2.14.1/utils/t/epath/epath_pattern_316.c0000644000076400007640000000323111302567127016273 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{PHYSICAL_SLOT,4}{SBC_BLADE,3}{ADD_IN_CARD,8}"; char *epp_str = "{.,.}"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_FALSE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-2.14.1/utils/t/epath/epath_pattern_306.c0000644000076400007640000000324611302567127016300 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{PHYSICAL_SLOT,4}{SBC_BLADE,3}{ADD_IN_CARD,8}"; char *epp_str = "{SYSTEM_CHASSIS,1}"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_FALSE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-2.14.1/utils/t/epath/epath_pattern_000.c0000644000076400007640000000324411302567127016265 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{SYSTEM_CHASSIS,1}{SBC_BLADE,3}"; char *epp_str = "{SYSTEM_CHASSIS,1}{SBC_BLADE,3}"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_TRUE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-2.14.1/utils/t/epath/epath_pattern_120.c0000644000076400007640000000327211302567127016271 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{GROUP,4}{SYSTEM_CHASSIS,1}{PHYSICAL_SLOT,3}{SBC_BLADE,3}{ADD_IN_CARD,8}"; char *epp_str = "*{.,.}*{.,.}"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_TRUE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-2.14.1/utils/t/epath/epath_pattern_194.c0000644000076400007640000000324411302567127016303 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{GROUP,4}{SYSTEM_CHASSIS,1}{SBC_BLADE,3}{ADD_IN_CARD,8}"; char *epp_str = "*{.,.}*"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_TRUE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-2.14.1/utils/t/epath/set_ep_loc_010.c0000755000076400007640000000543311302567127015551 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * Steve Sherman */ #include #include #include #include /* oh_set_ep_location: Entity type not in multi-element entity path. * OK but nothing changed */ int main(int argc, char **argv) { SaErrorT err; SaHpiEntityPathT ep = {{{SAHPI_ENT_GROUP, 100}, {SAHPI_ENT_REMOTE, 200}, {SAHPI_ENT_EXTERNAL_ENVIRONMENT, 300}, {SAHPI_ENT_BATTERY, 400}, {SAHPI_ENT_CHASSIS_SPECIFIC, 500}, {SAHPI_ENT_BOARD_SET_SPECIFIC, 600}, {SAHPI_ENT_OEM_SYSINT_SPECIFIC, 700}, {SAHPI_ENT_ROOT, 800}, {SAHPI_ENT_RACK, 900}, {SAHPI_ENT_SUBRACK, 1000}, {0}}}; SaHpiEntityLocationT x = 11000; err = oh_set_ep_location(&ep, SAHPI_ENT_FAN, x); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } if((ep.Entry[0].EntityLocation != 100) || (ep.Entry[0].EntityType != SAHPI_ENT_GROUP) || (ep.Entry[1].EntityLocation != 200) || (ep.Entry[1].EntityType != SAHPI_ENT_REMOTE) || (ep.Entry[2].EntityLocation != 300) || (ep.Entry[2].EntityType != SAHPI_ENT_EXTERNAL_ENVIRONMENT) || (ep.Entry[3].EntityLocation != 400) || (ep.Entry[3].EntityType != SAHPI_ENT_BATTERY) || (ep.Entry[4].EntityLocation != 500) || (ep.Entry[4].EntityType != SAHPI_ENT_CHASSIS_SPECIFIC) || (ep.Entry[5].EntityLocation != 600) || (ep.Entry[5].EntityType != SAHPI_ENT_BOARD_SET_SPECIFIC) || (ep.Entry[6].EntityLocation != 700) || (ep.Entry[6].EntityType != SAHPI_ENT_OEM_SYSINT_SPECIFIC) || (ep.Entry[7].EntityLocation != 800) || (ep.Entry[7].EntityType != SAHPI_ENT_ROOT) || (ep.Entry[8].EntityLocation != 900) || (ep.Entry[8].EntityType != SAHPI_ENT_RACK) || (ep.Entry[9].EntityLocation != 1000) || (ep.Entry[9].EntityType != SAHPI_ENT_SUBRACK)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); return -1; } return 0; } openhpi-2.14.1/utils/t/epath/epath_pattern_034.c0000644000076400007640000000320711302567127016273 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{SYSTEM_CHASSIS,1}"; char *epp_str = "*{SBC_BLADE,.}"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_FALSE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-2.14.1/utils/t/epath/epath_conv_023.c0000644000076400007640000000513311302567127015561 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. */ /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_tests.pl. * Do not change this file manually. Update script instead *******************************************************************/ #include #include #include /** * main: * epathstr -> epath test * * Test if an entity path string is converted properly into an entity path. **/ int main(int argc, char **argv) { char *test_string = "{FRONT_PANEL_BOARD,49}{BOARD_SET_SPECIFIC,36}"; oh_big_textbuffer bigbuf; SaErrorT err; SaHpiEntityPathT ep; err = oh_encode_entitypath(test_string, &ep); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } if (ep.Entry[0].EntityType != SAHPI_ENT_BOARD_SET_SPECIFIC) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[0].EntityType, SAHPI_ENT_BOARD_SET_SPECIFIC); return -1; } if (ep.Entry[0].EntityLocation != 36) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[0].EntityLocation, 36); return -1; } if (ep.Entry[1].EntityType != SAHPI_ENT_FRONT_PANEL_BOARD) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[1].EntityType, SAHPI_ENT_FRONT_PANEL_BOARD); return -1; } if (ep.Entry[1].EntityLocation != 49) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[1].EntityLocation, 49); return -1; } oh_init_bigtext(&bigbuf); err = oh_decode_entitypath(&ep, &bigbuf); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } if (strcmp((char *)bigbuf.Data, test_string)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received Entity Path=%s.\n", bigbuf.Data); return -1; } return 0; } openhpi-2.14.1/utils/t/epath/epath_pattern_017.c0000644000076400007640000000321311302567127016271 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{SYSTEM_CHASSIS,1}{SBC_BLADE,3}"; char *epp_str = "*{.,.}"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_TRUE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-2.14.1/utils/t/epath/epath_pattern_103.c0000644000076400007640000000330611302567127016270 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{GROUP,4}{SYSTEM_CHASSIS,1}{PHYSICAL_SLOT,3}{SBC_BLADE,3}{ADD_IN_CARD,8}"; char *epp_str = "{SYSTEM_CHASSIS,1}{.,.}"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_FALSE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-2.14.1/utils/t/epath/epath_pattern_271.c0000644000076400007640000000321611302567127016276 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{SBC_BLADE,3}{ADD_IN_CARD,8}"; char *epp_str = "{.,.}*{.,.}*"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_TRUE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-2.14.1/utils/t/epath/epath_pattern_195.c0000644000076400007640000000325111302567127016302 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{GROUP,4}{SYSTEM_CHASSIS,1}{SBC_BLADE,3}{ADD_IN_CARD,8}"; char *epp_str = "*{.,.}*{.,.}"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_TRUE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-2.14.1/utils/t/epath/epath_pattern_420.c0000644000076400007640000000322011302567127016265 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{GROUP,7}{REMOTE,2}{SUBRACK,4}"; char *epp_str = "*{.,.}*{.,.}"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_TRUE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-2.14.1/utils/t/epath/epath_pattern_218.c0000644000076400007640000000324511302567127016301 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{GROUP,4}{SYSTEM_CHASSIS,1}{PHYSICAL_SLOT,3}{SBC_BLADE,3}"; char *epp_str = "{.,.}*"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_TRUE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-2.14.1/utils/t/epath/epath_pattern_293.c0000644000076400007640000000321211302567127016276 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{PHYSICAL_SLOT,4}{SBC_BLADE,3}"; char *epp_str = "{.,.}*"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_TRUE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-2.14.1/utils/t/epath/epath_pattern_227.c0000644000076400007640000000322411302567127016276 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{SBC_BLADE,3}"; char *epp_str = "{SYSTEM_CHASSIS,1}{SBC_BLADE,.}*"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_FALSE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-2.14.1/utils/t/epath/epath_pattern_256.c0000644000076400007640000000322511302567127016301 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{SBC_BLADE,3}{ADD_IN_CARD,8}"; char *epp_str = "{SYSTEM_CHASSIS,1}"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_FALSE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-2.14.1/utils/t/epath/epath_conv_069.c0000644000076400007640000000513611302567127015576 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. */ /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_tests.pl. * Do not change this file manually. Update script instead *******************************************************************/ #include #include #include /** * main: * epathstr -> epath test * * Test if an entity path string is converted properly into an entity path. **/ int main(int argc, char **argv) { char *test_string = "{POWER_SYSTEM_BOARD,93}{COMPACTPCI_CHASSIS,11}"; oh_big_textbuffer bigbuf; SaErrorT err; SaHpiEntityPathT ep; err = oh_encode_entitypath(test_string, &ep); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } if (ep.Entry[0].EntityType != SAHPI_ENT_COMPACTPCI_CHASSIS) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[0].EntityType, SAHPI_ENT_COMPACTPCI_CHASSIS); return -1; } if (ep.Entry[0].EntityLocation != 11) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[0].EntityLocation, 11); return -1; } if (ep.Entry[1].EntityType != SAHPI_ENT_POWER_SYSTEM_BOARD) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[1].EntityType, SAHPI_ENT_POWER_SYSTEM_BOARD); return -1; } if (ep.Entry[1].EntityLocation != 93) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[1].EntityLocation, 93); return -1; } oh_init_bigtext(&bigbuf); err = oh_decode_entitypath(&ep, &bigbuf); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } if (strcmp((char *)bigbuf.Data, test_string)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received Entity Path=%s.\n", bigbuf.Data); return -1; } return 0; } openhpi-2.14.1/utils/t/epath/epath_pattern_348.c0000644000076400007640000000324111302567127016301 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{SYSTEM_CHASSIS,1}{PHYSICAL_SLOT,4}{SBC_BLADE,3}"; char *epp_str = "*{.,.}{.,.}"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_TRUE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-2.14.1/utils/t/epath/epath_pattern_168.c0000644000076400007640000000322411302567127016302 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{GROUP,4}{SYSTEM_CHASSIS,1}{SBC_BLADE,3}"; char *epp_str = "{.,.}*"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_TRUE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-2.14.1/utils/t/epath/epath_pattern_408.c0000644000076400007640000000322311302567127016276 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{GROUP,7}{REMOTE,2}{SUBRACK,4}"; char *epp_str = "*{SBC_BLADE,3}"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_FALSE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-2.14.1/utils/t/epath/epath_pattern_384.c0000644000076400007640000000321111302567127016276 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{GROUP,2}{SUBRACK,5}"; char *epp_str = "*{SBC_BLADE,.}"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_FALSE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-2.14.1/utils/t/epath/print_ep_002.c0000644000076400007640000000174711302567127015257 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * Chris Chia * Steve Sherman */ #include #include #include #include /* oh_print_ep: Single element entity path testcase. */ int main(int argc, char **argv) { int offsets = 0; SaHpiEntityPathT ep; SaErrorT err; oh_init_ep(&ep); printf("Root only entity path testcase\n"); err = oh_print_ep(&ep, offsets); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } return 0; } openhpi-2.14.1/utils/t/epath/epath_pattern_163.c0000644000076400007640000000325711302567127016303 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{GROUP,4}{SYSTEM_CHASSIS,1}{SBC_BLADE,3}"; char *epp_str = "*{SYSTEM_CHASSIS,.}*{SBC_BLADE,.}"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_TRUE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-2.14.1/utils/t/epath/epath_pattern_196.c0000644000076400007640000000325111302567127016303 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{GROUP,4}{SYSTEM_CHASSIS,1}{SBC_BLADE,3}{ADD_IN_CARD,8}"; char *epp_str = "{.,.}*{.,.}*"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_TRUE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-2.14.1/utils/t/epath/epath_conv_097.c0000644000076400007640000000507211302567127015576 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. */ /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_tests.pl. * Do not change this file manually. Update script instead *******************************************************************/ #include #include #include /** * main: * epathstr -> epath test * * Test if an entity path string is converted properly into an entity path. **/ int main(int argc, char **argv) { char *test_string = "{OTHER_SYSTEM_BOARD,91}{SWITCH,62}"; oh_big_textbuffer bigbuf; SaErrorT err; SaHpiEntityPathT ep; err = oh_encode_entitypath(test_string, &ep); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } if (ep.Entry[0].EntityType != SAHPI_ENT_SWITCH) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[0].EntityType, SAHPI_ENT_SWITCH); return -1; } if (ep.Entry[0].EntityLocation != 62) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[0].EntityLocation, 62); return -1; } if (ep.Entry[1].EntityType != SAHPI_ENT_OTHER_SYSTEM_BOARD) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[1].EntityType, SAHPI_ENT_OTHER_SYSTEM_BOARD); return -1; } if (ep.Entry[1].EntityLocation != 91) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[1].EntityLocation, 91); return -1; } oh_init_bigtext(&bigbuf); err = oh_decode_entitypath(&ep, &bigbuf); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } if (strcmp((char *)bigbuf.Data, test_string)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received Entity Path=%s.\n", bigbuf.Data); return -1; } return 0; } openhpi-2.14.1/utils/t/epath/epath_conv_034.c0000644000076400007640000000506711302567127015571 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. */ /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_tests.pl. * Do not change this file manually. Update script instead *******************************************************************/ #include #include #include /** * main: * epathstr -> epath test * * Test if an entity path string is converted properly into an entity path. **/ int main(int argc, char **argv) { char *test_string = "{UNSPECIFIED,69}{INTERCONNECT,99}"; oh_big_textbuffer bigbuf; SaErrorT err; SaHpiEntityPathT ep; err = oh_encode_entitypath(test_string, &ep); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } if (ep.Entry[0].EntityType != SAHPI_ENT_INTERCONNECT) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[0].EntityType, SAHPI_ENT_INTERCONNECT); return -1; } if (ep.Entry[0].EntityLocation != 99) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[0].EntityLocation, 99); return -1; } if (ep.Entry[1].EntityType != SAHPI_ENT_UNSPECIFIED) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[1].EntityType, SAHPI_ENT_UNSPECIFIED); return -1; } if (ep.Entry[1].EntityLocation != 69) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[1].EntityLocation, 69); return -1; } oh_init_bigtext(&bigbuf); err = oh_decode_entitypath(&ep, &bigbuf); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } if (strcmp((char *)bigbuf.Data, test_string)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received Entity Path=%s.\n", bigbuf.Data); return -1; } return 0; } openhpi-2.14.1/utils/t/epath/epath_pattern_074.c0000644000076400007640000000322511302567127016277 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{SYSTEM_CHASSIS,1}{SBC_BLADE,3}{ADD_IN_CARD,8}"; char *epp_str = "*"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_TRUE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-2.14.1/utils/t/epath/epath_pattern_380.c0000644000076400007640000000321611302567127016277 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{GROUP,2}{SUBRACK,5}"; char *epp_str = "{SYSTEM_CHASSIS,1}*"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_FALSE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-2.14.1/utils/t/epath/epath_conv_050.c0000644000076400007640000000505011302567127015557 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. */ /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_tests.pl. * Do not change this file manually. Update script instead *******************************************************************/ #include #include #include /** * main: * epathstr -> epath test * * Test if an entity path string is converted properly into an entity path. **/ int main(int argc, char **argv) { char *test_string = "{ALARM_MANAGER,84}{OTHER,91}"; oh_big_textbuffer bigbuf; SaErrorT err; SaHpiEntityPathT ep; err = oh_encode_entitypath(test_string, &ep); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } if (ep.Entry[0].EntityType != SAHPI_ENT_OTHER) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[0].EntityType, SAHPI_ENT_OTHER); return -1; } if (ep.Entry[0].EntityLocation != 91) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[0].EntityLocation, 91); return -1; } if (ep.Entry[1].EntityType != SAHPI_ENT_ALARM_MANAGER) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[1].EntityType, SAHPI_ENT_ALARM_MANAGER); return -1; } if (ep.Entry[1].EntityLocation != 84) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[1].EntityLocation, 84); return -1; } oh_init_bigtext(&bigbuf); err = oh_decode_entitypath(&ep, &bigbuf); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } if (strcmp((char *)bigbuf.Data, test_string)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received Entity Path=%s.\n", bigbuf.Data); return -1; } return 0; } openhpi-2.14.1/utils/t/epath/ep_concat_002.c0000644000076400007640000000251111302567127015360 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * Chris Chia * Steve Sherman */ #include #include #include #include /* oh_concat_ep: concatenate 2 single element entity path testcase */ int main(int argc, char **argv) { SaErrorT err; SaHpiEntityPathT ep1 = {{{SAHPI_ENT_BACK_PANEL_BOARD,1},{SAHPI_ENT_ROOT,0}}}; SaHpiEntityPathT ep2 = {{{SAHPI_ENT_POWER_UNIT,9},{SAHPI_ENT_ROOT,0}}}; SaHpiEntityPathT ep3 = {{{SAHPI_ENT_BACK_PANEL_BOARD,1},{SAHPI_ENT_POWER_UNIT,9}, {SAHPI_ENT_ROOT,0}}}; err = oh_concat_ep(&ep1, &ep2); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } if (!oh_cmp_ep(&ep1, &ep3)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); return -1; } return 0; } openhpi-2.14.1/utils/t/epath/epath_pattern_265.c0000644000076400007640000000322511302567127016301 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{SBC_BLADE,3}{ADD_IN_CARD,8}"; char *epp_str = "{SYSTEM_CHASSIS,.}"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_FALSE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-2.14.1/utils/t/epath/epath_pattern_375.c0000644000076400007640000000323211302567127016301 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{GROUP,2}{SUBRACK,5}"; char *epp_str = "{SYSTEM_CHASSIS,1}{SBC_BLADE,3}"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_FALSE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-2.14.1/utils/t/epath/epath_pattern_230.c0000644000076400007640000000320711302567127016271 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{SBC_BLADE,3}"; char *epp_str = "{SYSTEM_CHASSIS,1}*"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_FALSE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-2.14.1/utils/t/epath/epath_conv_002.c0000644000076400007640000000510311302567127015553 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. */ /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_tests.pl. * Do not change this file manually. Update script instead *******************************************************************/ #include #include #include /** * main: * epathstr -> epath test * * Test if an entity path string is converted properly into an entity path. **/ int main(int argc, char **argv) { char *test_string = "{SUB_CHASSIS,26}{SYS_MGMNT_MODULE,76}"; oh_big_textbuffer bigbuf; SaErrorT err; SaHpiEntityPathT ep; err = oh_encode_entitypath(test_string, &ep); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } if (ep.Entry[0].EntityType != SAHPI_ENT_SYS_MGMNT_MODULE) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[0].EntityType, SAHPI_ENT_SYS_MGMNT_MODULE); return -1; } if (ep.Entry[0].EntityLocation != 76) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[0].EntityLocation, 76); return -1; } if (ep.Entry[1].EntityType != SAHPI_ENT_SUB_CHASSIS) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[1].EntityType, SAHPI_ENT_SUB_CHASSIS); return -1; } if (ep.Entry[1].EntityLocation != 26) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[1].EntityLocation, 26); return -1; } oh_init_bigtext(&bigbuf); err = oh_decode_entitypath(&ep, &bigbuf); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } if (strcmp((char *)bigbuf.Data, test_string)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received Entity Path=%s.\n", bigbuf.Data); return -1; } return 0; } openhpi-2.14.1/utils/t/epath/epath_pattern_349.c0000644000076400007640000000322711302567127016306 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{SYSTEM_CHASSIS,1}{PHYSICAL_SLOT,4}{SBC_BLADE,3}"; char *epp_str = "*"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_TRUE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-2.14.1/utils/t/epath/epath_pattern_419.c0000644000076400007640000000321311302567127016277 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{GROUP,7}{REMOTE,2}{SUBRACK,4}"; char *epp_str = "*{.,.}*"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_TRUE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-2.14.1/utils/t/epath/epath_pattern_176.c0000644000076400007640000000327511302567127016307 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{GROUP,4}{SYSTEM_CHASSIS,1}{SBC_BLADE,3}{ADD_IN_CARD,8}"; char *epp_str = "{SYSTEM_CHASSIS,1}{SBC_BLADE,.}"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_FALSE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-2.14.1/utils/t/epath/epath_pattern_062.c0000644000076400007640000000326511302567127016300 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{SYSTEM_CHASSIS,1}{SBC_BLADE,3}{ADD_IN_CARD,8}"; char *epp_str = "*{SYSTEM_CHASSIS,.}{SBC_BLADE,.}"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_FALSE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-2.14.1/utils/t/epath/ep_cmp_004.c0000644000076400007640000000372711302567127014704 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * Chris Chia * Steve Sherman */ #include #include #include #include /* oh_cmp_ep: multi-element entity path testcase. */ int main(int argc, char **argv) { SaHpiEntityPathT ep1 = {{{SAHPI_ENT_ADD_IN_CARD,151}, {SAHPI_ENT_FRONT_PANEL_BOARD,252}, {SAHPI_ENT_BACK_PANEL_BOARD,353}, {SAHPI_ENT_POWER_SYSTEM_BOARD,454}, {SAHPI_ENT_DRIVE_BACKPLANE,555}, {SAHPI_ENT_SYS_EXPANSION_BOARD,656}, {SAHPI_ENT_OTHER_SYSTEM_BOARD,757}, {SAHPI_ENT_PROCESSOR_BOARD,858}, {SAHPI_ENT_ROOT, 0}}}; SaHpiEntityPathT ep2 = {{{SAHPI_ENT_ADD_IN_CARD,151}, {SAHPI_ENT_FRONT_PANEL_BOARD,252}, {SAHPI_ENT_BACK_PANEL_BOARD,353}, {SAHPI_ENT_POWER_SYSTEM_BOARD,454}, {SAHPI_ENT_DRIVE_BACKPLANE,555}, {SAHPI_ENT_SYS_EXPANSION_BOARD,656}, {SAHPI_ENT_OTHER_SYSTEM_BOARD,757}, {SAHPI_ENT_PROCESSOR_BOARD,858}, {SAHPI_ENT_ROOT, 0}}}; if (!oh_cmp_ep(&ep1, &ep2)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); return -1; } return 0; } openhpi-2.14.1/utils/t/epath/epath_pattern_042.c0000644000076400007640000000317611302567127016277 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{SYSTEM_CHASSIS,1}"; char *epp_str = "*{.,.}"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_TRUE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-2.14.1/utils/t/epath/epath_pattern_076.c0000644000076400007640000000330511302567127016300 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{SYSTEM_CHASSIS,1}{PHYSICAL_SLOT,3}{SBC_BLADE,3}{ADD_IN_CARD,8}"; char *epp_str = "{SYSTEM_CHASSIS,1}{SBC_BLADE,.}"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_FALSE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-2.14.1/utils/t/epath/epath_conv_100.c0000644000076400007640000000367111302567127015562 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Sean Dague */ #include #include #include /** * main: * epathstr -> epath test * * Test if an entity path string is converted properly into an entity path. **/ int main(int argc, char **argv) { char *test_string = "{CHASSIS_SPECIFIC,97}{BOARD_SET_SPECIFIC,-5}"; SaErrorT err; SaHpiEntityPathT ep; err = oh_encode_entitypath(test_string, &ep); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } if (ep.Entry[0].EntityType != SAHPI_ENT_BOARD_SET_SPECIFIC) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[0].EntityType, SAHPI_ENT_BOARD_SET_SPECIFIC); return -1; } if (ep.Entry[0].EntityLocation != -5) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[0].EntityLocation, -5); return -1; } if (ep.Entry[1].EntityType != SAHPI_ENT_CHASSIS_SPECIFIC) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[0].EntityType, SAHPI_ENT_CHASSIS_SPECIFIC); return -1; } if (ep.Entry[1].EntityLocation != 97) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[0].EntityLocation, 97); return -1; } return 0; } openhpi-2.14.1/utils/t/epath/epath_pattern_092.c0000644000076400007640000000325311302567127016300 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{SYSTEM_CHASSIS,1}{PHYSICAL_SLOT,3}{SBC_BLADE,3}{ADD_IN_CARD,8}"; char *epp_str = "*{.,.}"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_TRUE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-2.14.1/utils/t/epath/epath_pattern_140.c0000644000076400007640000000322411302567127016270 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{GROUP,4}{SYSTEM_CHASSIS,1}"; char *epp_str = "{SYSTEM_CHASSIS,.}"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_FALSE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-2.14.1/utils/t/epath/epath_pattern_024.c0000644000076400007640000000320611302567127016271 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{SYSTEM_CHASSIS,1}{SBC_BLADE,3}"; char *epp_str = "*"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_TRUE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-2.14.1/utils/t/epath/epath_conv_067.c0000644000076400007640000000506111302567127015571 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. */ /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_tests.pl. * Do not change this file manually. Update script instead *******************************************************************/ #include #include #include /** * main: * epathstr -> epath test * * Test if an entity path string is converted properly into an entity path. **/ int main(int argc, char **argv) { char *test_string = "{UNSPECIFIED,59}{SYSTEM_BUS,65}"; oh_big_textbuffer bigbuf; SaErrorT err; SaHpiEntityPathT ep; err = oh_encode_entitypath(test_string, &ep); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } if (ep.Entry[0].EntityType != SAHPI_ENT_SYSTEM_BUS) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[0].EntityType, SAHPI_ENT_SYSTEM_BUS); return -1; } if (ep.Entry[0].EntityLocation != 65) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[0].EntityLocation, 65); return -1; } if (ep.Entry[1].EntityType != SAHPI_ENT_UNSPECIFIED) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[1].EntityType, SAHPI_ENT_UNSPECIFIED); return -1; } if (ep.Entry[1].EntityLocation != 59) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[1].EntityLocation, 59); return -1; } oh_init_bigtext(&bigbuf); err = oh_decode_entitypath(&ep, &bigbuf); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } if (strcmp((char *)bigbuf.Data, test_string)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received Entity Path=%s.\n", bigbuf.Data); return -1; } return 0; } openhpi-2.14.1/utils/t/epath/epath_pattern_443.c0000644000076400007640000000322211302567127016274 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{GROUP,7}{REMOTE,2}{SUBRACK,4}{BIOS,8}"; char *epp_str = "{.,.}*"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_TRUE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-2.14.1/utils/t/epath/epath_pattern_165.c0000644000076400007640000000324111302567127016276 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{GROUP,4}{SYSTEM_CHASSIS,1}{SBC_BLADE,3}"; char *epp_str = "{SYSTEM_CHASSIS,.}"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_FALSE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-2.14.1/utils/t/epath/epath_pattern_048.c0000644000076400007640000000320411302567127016275 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{SYSTEM_CHASSIS,1}"; char *epp_str = "*{.,.}{.,.}"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_FALSE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-2.14.1/utils/t/epath/epath_pattern_025.c0000644000076400007640000000323011302567127016267 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{SYSTEM_CHASSIS,1}"; char *epp_str = "{SYSTEM_CHASSIS,1}{SBC_BLADE,3}"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_FALSE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-2.14.1/utils/t/epath/epath_pattern_153.c0000644000076400007640000000324611302567127016300 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{GROUP,4}{SYSTEM_CHASSIS,1}{SBC_BLADE,3}"; char *epp_str = "{SYSTEM_CHASSIS,1}{.,.}"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_FALSE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-2.14.1/utils/t/epath/epath_pattern_255.c0000644000076400007640000000322611302567127016301 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{SBC_BLADE,3}{ADD_IN_CARD,8}"; char *epp_str = "{SYSTEM_CHASSIS,1}*"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_FALSE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-2.14.1/utils/t/epath/epath_pattern_209.c0000644000076400007640000000325511302567127016302 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{GROUP,4}{SYSTEM_CHASSIS,1}{PHYSICAL_SLOT,3}{SBC_BLADE,3}"; char *epp_str = "*{SBC_BLADE,.}"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_TRUE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-2.14.1/utils/t/epath/epath_pattern_311.c0000644000076400007640000000326511302567127016275 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{PHYSICAL_SLOT,4}{SBC_BLADE,3}{ADD_IN_CARD,8}"; char *epp_str = "*{SYSTEM_CHASSIS,1}{SBC_BLADE,.}*"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_FALSE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-2.14.1/utils/t/epath/epath_pattern_357.c0000644000076400007640000000317511302567127016307 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{GROUP,2}"; char *epp_str = "{SBC_BLADE,3}"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_FALSE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-2.14.1/utils/t/epath/epath_pattern_269.c0000644000076400007640000000321111302567127016300 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{SBC_BLADE,3}{ADD_IN_CARD,8}"; char *epp_str = "*{.,.}*"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_TRUE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-2.14.1/utils/t/epath/epath_pattern_122.c0000644000076400007640000000327111302567127016272 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{GROUP,4}{SYSTEM_CHASSIS,1}{PHYSICAL_SLOT,3}{SBC_BLADE,3}{ADD_IN_CARD,8}"; char *epp_str = "{.,.}{.,.}*"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_TRUE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-2.14.1/utils/t/epath/epath_pattern_070.c0000644000076400007640000000324011302567127016270 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{SYSTEM_CHASSIS,1}{SBC_BLADE,3}{ADD_IN_CARD,8}"; char *epp_str = "*{.,.}*{.,.}"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_TRUE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-2.14.1/utils/t/epath/epath_conv_086.c0000644000076400007640000000511111302567127015566 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. */ /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_tests.pl. * Do not change this file manually. Update script instead *******************************************************************/ #include #include #include /** * main: * epathstr -> epath test * * Test if an entity path string is converted properly into an entity path. **/ int main(int argc, char **argv) { char *test_string = "{DEVICE_BAY,69}{OTHER_CHASSIS_BOARD,50}"; oh_big_textbuffer bigbuf; SaErrorT err; SaHpiEntityPathT ep; err = oh_encode_entitypath(test_string, &ep); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } if (ep.Entry[0].EntityType != SAHPI_ENT_OTHER_CHASSIS_BOARD) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[0].EntityType, SAHPI_ENT_OTHER_CHASSIS_BOARD); return -1; } if (ep.Entry[0].EntityLocation != 50) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[0].EntityLocation, 50); return -1; } if (ep.Entry[1].EntityType != SAHPI_ENT_DEVICE_BAY) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[1].EntityType, SAHPI_ENT_DEVICE_BAY); return -1; } if (ep.Entry[1].EntityLocation != 69) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[1].EntityLocation, 69); return -1; } oh_init_bigtext(&bigbuf); err = oh_decode_entitypath(&ep, &bigbuf); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } if (strcmp((char *)bigbuf.Data, test_string)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received Entity Path=%s.\n", bigbuf.Data); return -1; } return 0; } openhpi-2.14.1/utils/t/epath/epath_pattern_152.c0000644000076400007640000000325711302567127016301 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{GROUP,4}{SYSTEM_CHASSIS,1}{SBC_BLADE,3}"; char *epp_str = "{SYSTEM_CHASSIS,1}{SBC_BLADE,.}*"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_FALSE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-2.14.1/utils/t/epath/epath_pattern_276.c0000644000076400007640000000324411302567127016304 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{PHYSICAL_SLOT,4}{SBC_BLADE,3}"; char *epp_str = "{SYSTEM_CHASSIS,1}{SBC_BLADE,.}"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_FALSE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-2.14.1/utils/t/epath/epath_pattern_305.c0000644000076400007640000000324711302567127016300 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{PHYSICAL_SLOT,4}{SBC_BLADE,3}{ADD_IN_CARD,8}"; char *epp_str = "{SYSTEM_CHASSIS,1}*"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_FALSE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-2.14.1/utils/t/epath/epath_pattern_246.c0000644000076400007640000000320011302567127016271 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{SBC_BLADE,3}"; char *epp_str = "{.,.}*{.,.}*"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_FALSE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-2.14.1/utils/t/epath/epath_conv_087.c0000644000076400007640000000510311302567127015570 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. */ /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_tests.pl. * Do not change this file manually. Update script instead *******************************************************************/ #include #include #include /** * main: * epathstr -> epath test * * Test if an entity path string is converted properly into an entity path. **/ int main(int argc, char **argv) { char *test_string = "{SYSTEM_BUS,29}{SYS_MGMNT_SOFTWARE,1}"; oh_big_textbuffer bigbuf; SaErrorT err; SaHpiEntityPathT ep; err = oh_encode_entitypath(test_string, &ep); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } if (ep.Entry[0].EntityType != SAHPI_ENT_SYS_MGMNT_SOFTWARE) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[0].EntityType, SAHPI_ENT_SYS_MGMNT_SOFTWARE); return -1; } if (ep.Entry[0].EntityLocation != 1) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[0].EntityLocation, 1); return -1; } if (ep.Entry[1].EntityType != SAHPI_ENT_SYSTEM_BUS) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[1].EntityType, SAHPI_ENT_SYSTEM_BUS); return -1; } if (ep.Entry[1].EntityLocation != 29) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[1].EntityLocation, 29); return -1; } oh_init_bigtext(&bigbuf); err = oh_decode_entitypath(&ep, &bigbuf); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } if (strcmp((char *)bigbuf.Data, test_string)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received Entity Path=%s.\n", bigbuf.Data); return -1; } return 0; } openhpi-2.14.1/utils/t/epath/epath_pattern_372.c0000644000076400007640000000317311302567127016302 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{GROUP,2}"; char *epp_str = "{.,.}{.,.}*"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_FALSE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-2.14.1/utils/t/epath/epath_pattern_350.c0000644000076400007640000000321711302567127016275 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{GROUP,2}"; char *epp_str = "{SYSTEM_CHASSIS,1}{SBC_BLADE,3}"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_FALSE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-2.14.1/utils/t/epath/epath_pattern_158.c0000644000076400007640000000323411302567127016302 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{GROUP,4}{SYSTEM_CHASSIS,1}{SBC_BLADE,3}"; char *epp_str = "*{SBC_BLADE,3}"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_TRUE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-2.14.1/utils/t/epath/epath_pattern_067.c0000644000076400007640000000323211302567127016277 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{SYSTEM_CHASSIS,1}{SBC_BLADE,3}{ADD_IN_CARD,8}"; char *epp_str = "*{.,.}"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_TRUE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-2.14.1/utils/t/epath/epath_conv_080.c0000644000076400007640000000505311302567127015565 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. */ /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_tests.pl. * Do not change this file manually. Update script instead *******************************************************************/ #include #include #include /** * main: * epathstr -> epath test * * Test if an entity path string is converted properly into an entity path. **/ int main(int argc, char **argv) { char *test_string = "{SYSTEM_BUS,85}{PROCESSOR,22}"; oh_big_textbuffer bigbuf; SaErrorT err; SaHpiEntityPathT ep; err = oh_encode_entitypath(test_string, &ep); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } if (ep.Entry[0].EntityType != SAHPI_ENT_PROCESSOR) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[0].EntityType, SAHPI_ENT_PROCESSOR); return -1; } if (ep.Entry[0].EntityLocation != 22) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[0].EntityLocation, 22); return -1; } if (ep.Entry[1].EntityType != SAHPI_ENT_SYSTEM_BUS) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[1].EntityType, SAHPI_ENT_SYSTEM_BUS); return -1; } if (ep.Entry[1].EntityLocation != 85) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[1].EntityLocation, 85); return -1; } oh_init_bigtext(&bigbuf); err = oh_decode_entitypath(&ep, &bigbuf); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } if (strcmp((char *)bigbuf.Data, test_string)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received Entity Path=%s.\n", bigbuf.Data); return -1; } return 0; } openhpi-2.14.1/utils/t/epath/epath_pattern_308.c0000644000076400007640000000324211302567127016276 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{PHYSICAL_SLOT,4}{SBC_BLADE,3}{ADD_IN_CARD,8}"; char *epp_str = "*{SBC_BLADE,3}"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_FALSE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-2.14.1/utils/t/epath/epath_pattern_389.c0000644000076400007640000000323511302567127016311 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{GROUP,2}{SUBRACK,5}"; char *epp_str = "*{SYSTEM_CHASSIS,.}*{SBC_BLADE,.}*"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_FALSE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-2.14.1/utils/t/epath/epath_conv_008.c0000644000076400007640000000506411302567127015567 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. */ /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_tests.pl. * Do not change this file manually. Update script instead *******************************************************************/ #include #include #include /** * main: * epathstr -> epath test * * Test if an entity path string is converted properly into an entity path. **/ int main(int argc, char **argv) { char *test_string = "{POWER_UNIT,91}{INTERCONNECT,87}"; oh_big_textbuffer bigbuf; SaErrorT err; SaHpiEntityPathT ep; err = oh_encode_entitypath(test_string, &ep); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } if (ep.Entry[0].EntityType != SAHPI_ENT_INTERCONNECT) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[0].EntityType, SAHPI_ENT_INTERCONNECT); return -1; } if (ep.Entry[0].EntityLocation != 87) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[0].EntityLocation, 87); return -1; } if (ep.Entry[1].EntityType != SAHPI_ENT_POWER_UNIT) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[1].EntityType, SAHPI_ENT_POWER_UNIT); return -1; } if (ep.Entry[1].EntityLocation != 91) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[1].EntityLocation, 91); return -1; } oh_init_bigtext(&bigbuf); err = oh_decode_entitypath(&ep, &bigbuf); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } if (strcmp((char *)bigbuf.Data, test_string)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received Entity Path=%s.\n", bigbuf.Data); return -1; } return 0; } openhpi-2.14.1/utils/t/epath/epath_pattern_095.c0000644000076400007640000000326111302567127016302 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{SYSTEM_CHASSIS,1}{PHYSICAL_SLOT,3}{SBC_BLADE,3}{ADD_IN_CARD,8}"; char *epp_str = "*{.,.}*{.,.}"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_TRUE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-2.14.1/utils/t/epath/epath_pattern_107.c0000644000076400007640000000327411302567127016300 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{GROUP,4}{SYSTEM_CHASSIS,1}{PHYSICAL_SLOT,3}{SBC_BLADE,3}{ADD_IN_CARD,8}"; char *epp_str = "{SBC_BLADE,3}"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_FALSE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-2.14.1/utils/t/epath/epath_conv_010.c0000644000076400007640000000506711302567127015563 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. */ /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_tests.pl. * Do not change this file manually. Update script instead *******************************************************************/ #include #include #include /** * main: * epathstr -> epath test * * Test if an entity path string is converted properly into an entity path. **/ int main(int argc, char **argv) { char *test_string = "{SYSTEM_CHASSIS,4}{DISK_DRIVE,48}"; oh_big_textbuffer bigbuf; SaErrorT err; SaHpiEntityPathT ep; err = oh_encode_entitypath(test_string, &ep); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } if (ep.Entry[0].EntityType != SAHPI_ENT_DISK_DRIVE) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[0].EntityType, SAHPI_ENT_DISK_DRIVE); return -1; } if (ep.Entry[0].EntityLocation != 48) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[0].EntityLocation, 48); return -1; } if (ep.Entry[1].EntityType != SAHPI_ENT_SYSTEM_CHASSIS) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[1].EntityType, SAHPI_ENT_SYSTEM_CHASSIS); return -1; } if (ep.Entry[1].EntityLocation != 4) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[1].EntityLocation, 4); return -1; } oh_init_bigtext(&bigbuf); err = oh_decode_entitypath(&ep, &bigbuf); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } if (strcmp((char *)bigbuf.Data, test_string)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received Entity Path=%s.\n", bigbuf.Data); return -1; } return 0; } openhpi-2.14.1/utils/t/epath/epath_conv_018.c0000644000076400007640000000502311302567127015563 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. */ /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_tests.pl. * Do not change this file manually. Update script instead *******************************************************************/ #include #include #include /** * main: * epathstr -> epath test * * Test if an entity path string is converted properly into an entity path. **/ int main(int argc, char **argv) { char *test_string = "{DISK_BAY,95}{FAN,78}"; oh_big_textbuffer bigbuf; SaErrorT err; SaHpiEntityPathT ep; err = oh_encode_entitypath(test_string, &ep); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } if (ep.Entry[0].EntityType != SAHPI_ENT_FAN) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[0].EntityType, SAHPI_ENT_FAN); return -1; } if (ep.Entry[0].EntityLocation != 78) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[0].EntityLocation, 78); return -1; } if (ep.Entry[1].EntityType != SAHPI_ENT_DISK_BAY) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[1].EntityType, SAHPI_ENT_DISK_BAY); return -1; } if (ep.Entry[1].EntityLocation != 95) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[1].EntityLocation, 95); return -1; } oh_init_bigtext(&bigbuf); err = oh_decode_entitypath(&ep, &bigbuf); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } if (strcmp((char *)bigbuf.Data, test_string)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received Entity Path=%s.\n", bigbuf.Data); return -1; } return 0; } openhpi-2.14.1/utils/t/epath/epath_pattern_381.c0000644000076400007640000000321511302567127016277 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{GROUP,2}{SUBRACK,5}"; char *epp_str = "{SYSTEM_CHASSIS,1}"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_FALSE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-2.14.1/utils/t/epath/epath_pattern_224.c0000644000076400007640000000324011302567127016271 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{GROUP,4}{SYSTEM_CHASSIS,1}{PHYSICAL_SLOT,3}{SBC_BLADE,3}"; char *epp_str = "*"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_TRUE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-2.14.1/utils/t/epath/epath_pattern_036.c0000644000076400007640000000323211302567127016273 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{SYSTEM_CHASSIS,1}"; char *epp_str = "*{SYSTEM_CHASSIS,1}{SBC_BLADE,.}*"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_FALSE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-2.14.1/utils/t/epath/epath_pattern_418.c0000644000076400007640000000321211302567127016275 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{GROUP,7}{REMOTE,2}{SUBRACK,4}"; char *epp_str = "{.,.}*"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_TRUE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-2.14.1/utils/t/epath/epath_pattern_279.c0000644000076400007640000000323511302567127016307 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{PHYSICAL_SLOT,4}{SBC_BLADE,3}"; char *epp_str = "{SYSTEM_CHASSIS,1}{.,.}*"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_FALSE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-2.14.1/utils/t/epath/epath_pattern_273.c0000644000076400007640000000321511302567127016277 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{SBC_BLADE,3}{ADD_IN_CARD,8}"; char *epp_str = "*{.,.}{.,.}"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_TRUE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-2.14.1/utils/t/epath/epath_pattern_004.c0000644000076400007640000000323511302567127016271 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{SYSTEM_CHASSIS,1}{SBC_BLADE,3}"; char *epp_str = "{SYSTEM_CHASSIS,1}{.,.}*"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_TRUE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-2.14.1/utils/t/epath/ep_concat_006.c0000644000076400007640000000433511302567127015372 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * Chris Chia * Steve Sherman */ #include #include #include #include /* oh_concat_ep: concatenate two 4 element entity path */ int main(int argc, char **argv) { SaErrorT err; SaHpiEntityPathT ep1 = {{{SAHPI_ENT_ADD_IN_CARD,111}, {SAHPI_ENT_FRONT_PANEL_BOARD,122}, {SAHPI_ENT_BACK_PANEL_BOARD,133}, {SAHPI_ENT_POWER_SYSTEM_BOARD,144}, {SAHPI_ENT_ROOT,0}}}; SaHpiEntityPathT ep2 = {{{SAHPI_ENT_DRIVE_BACKPLANE,155}, {SAHPI_ENT_SYS_EXPANSION_BOARD,166}, {SAHPI_ENT_OTHER_SYSTEM_BOARD,177}, {SAHPI_ENT_PROCESSOR_BOARD,188}, {SAHPI_ENT_ROOT,0}}}; SaHpiEntityPathT ep3 = {{{SAHPI_ENT_ADD_IN_CARD,111}, {SAHPI_ENT_FRONT_PANEL_BOARD,122}, {SAHPI_ENT_BACK_PANEL_BOARD,133}, {SAHPI_ENT_POWER_SYSTEM_BOARD,144}, {SAHPI_ENT_DRIVE_BACKPLANE,155}, {SAHPI_ENT_SYS_EXPANSION_BOARD,166}, {SAHPI_ENT_OTHER_SYSTEM_BOARD,177}, {SAHPI_ENT_PROCESSOR_BOARD,188}, {SAHPI_ENT_ROOT,0}}}; err = oh_concat_ep(&ep1, &ep2); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } if (!oh_cmp_ep(&ep1, &ep3)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); return -1; } return 0; } openhpi-2.14.1/utils/t/epath/epath_pattern_177.c0000644000076400007640000000327611302567127016311 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{GROUP,4}{SYSTEM_CHASSIS,1}{SBC_BLADE,3}{ADD_IN_CARD,8}"; char *epp_str = "{SYSTEM_CHASSIS,1}{SBC_BLADE,.}*"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_FALSE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-2.14.1/utils/t/epath/epath_conv_051.c0000644000076400007640000000507511302567127015567 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. */ /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_tests.pl. * Do not change this file manually. Update script instead *******************************************************************/ #include #include #include /** * main: * epathstr -> epath test * * Test if an entity path string is converted properly into an entity path. **/ int main(int argc, char **argv) { char *test_string = "{IO_BLADE,6}{COMPACTPCI_CHASSIS,66}"; oh_big_textbuffer bigbuf; SaErrorT err; SaHpiEntityPathT ep; err = oh_encode_entitypath(test_string, &ep); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } if (ep.Entry[0].EntityType != SAHPI_ENT_COMPACTPCI_CHASSIS) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[0].EntityType, SAHPI_ENT_COMPACTPCI_CHASSIS); return -1; } if (ep.Entry[0].EntityLocation != 66) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[0].EntityLocation, 66); return -1; } if (ep.Entry[1].EntityType != SAHPI_ENT_IO_BLADE) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[1].EntityType, SAHPI_ENT_IO_BLADE); return -1; } if (ep.Entry[1].EntityLocation != 6) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[1].EntityLocation, 6); return -1; } oh_init_bigtext(&bigbuf); err = oh_decode_entitypath(&ep, &bigbuf); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } if (strcmp((char *)bigbuf.Data, test_string)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received Entity Path=%s.\n", bigbuf.Data); return -1; } return 0; } openhpi-2.14.1/utils/t/epath/epath_pattern_369.c0000644000076400007640000000316611302567127016312 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{GROUP,2}"; char *epp_str = "*{.,.}*"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_TRUE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-2.14.1/utils/t/epath/set_ep_loc_006.c0000755000076400007640000000453511302567127015560 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * Chris Chia * Steve Sherman */ #include #include #include #include /* oh_set_ep_location: Entity path has 4 elements, victim element in the middle. Only victim element's instance number changed */ int main(int argc, char **argv) { SaErrorT err; SaHpiEntityPathT ep = {{{SAHPI_ENT_FAN, 11099}, {SAHPI_ENT_BATTERY, 2002}, {SAHPI_ENT_RACK, 37373}, {SAHPI_ENT_DISK_BAY, 440044}, {0}}}; SaHpiEntityLocationT x = 123456; err = oh_set_ep_location(&ep, SAHPI_ENT_RACK, x); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } if (ep.Entry[2].EntityLocation != x) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); return -1; } if (ep.Entry[2].EntityType != SAHPI_ENT_RACK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); return -1; } if (ep.Entry[0].EntityLocation != 11099) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); return -1; } if (ep.Entry[0].EntityType != SAHPI_ENT_FAN) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); return -1; } if (ep.Entry[1].EntityLocation != 2002) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); return -1; } if (ep.Entry[1].EntityType != SAHPI_ENT_BATTERY) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); return -1; } if (ep.Entry[3].EntityLocation != 440044) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); return -1; } if (ep.Entry[3].EntityType != SAHPI_ENT_DISK_BAY) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); return -1; } return 0; } openhpi-2.14.1/utils/t/epath/ep_concat_000.c0000644000076400007640000000232411302567127015360 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * Renier Morales * Steve Sherman */ #include #include #include /* oh_concat_ep: NULL parameter testcase. */ int main(int argc, char **argv) { char *test_string = "{CHASSIS_SPECIFIC,89}{OPERATING_SYSTEM,46}"; SaErrorT err, expected_err; SaHpiEntityPathT ep; err = oh_encode_entitypath(test_string, &ep); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } expected_err = SA_ERR_HPI_INVALID_PARAMS; err = oh_concat_ep(NULL, &ep); if (err != expected_err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } return 0; } openhpi-2.14.1/utils/t/epath/epath_pattern_354.c0000644000076400007640000000321011302567127016272 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{GROUP,2}"; char *epp_str = "{SYSTEM_CHASSIS,1}{.,.}*"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_FALSE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-2.14.1/utils/t/epath/epath_pattern_079.c0000644000076400007640000000327511302567127016311 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{SYSTEM_CHASSIS,1}{PHYSICAL_SLOT,3}{SBC_BLADE,3}{ADD_IN_CARD,8}"; char *epp_str = "{SYSTEM_CHASSIS,1}{.,.}*"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_TRUE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-2.14.1/utils/t/epath/epath_pattern_129.c0000644000076400007640000000323211302567127016276 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{GROUP,4}{SYSTEM_CHASSIS,1}"; char *epp_str = "{SYSTEM_CHASSIS,1}{.,.}*"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_FALSE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-2.14.1/utils/t/epath/epath_pattern_231.c0000644000076400007640000000320611302567127016271 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{SBC_BLADE,3}"; char *epp_str = "{SYSTEM_CHASSIS,1}"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_FALSE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-2.14.1/utils/t/epath/epath_conv_033.c0000644000076400007640000000506711302567127015570 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. */ /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_tests.pl. * Do not change this file manually. Update script instead *******************************************************************/ #include #include #include /** * main: * epathstr -> epath test * * Test if an entity path string is converted properly into an entity path. **/ int main(int argc, char **argv) { char *test_string = "{POWER_MGMNT,21}{POWER_SUPPLY,36}"; oh_big_textbuffer bigbuf; SaErrorT err; SaHpiEntityPathT ep; err = oh_encode_entitypath(test_string, &ep); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } if (ep.Entry[0].EntityType != SAHPI_ENT_POWER_SUPPLY) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[0].EntityType, SAHPI_ENT_POWER_SUPPLY); return -1; } if (ep.Entry[0].EntityLocation != 36) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[0].EntityLocation, 36); return -1; } if (ep.Entry[1].EntityType != SAHPI_ENT_POWER_MGMNT) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[1].EntityType, SAHPI_ENT_POWER_MGMNT); return -1; } if (ep.Entry[1].EntityLocation != 21) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[1].EntityLocation, 21); return -1; } oh_init_bigtext(&bigbuf); err = oh_decode_entitypath(&ep, &bigbuf); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } if (strcmp((char *)bigbuf.Data, test_string)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received Entity Path=%s.\n", bigbuf.Data); return -1; } return 0; } openhpi-2.14.1/utils/t/epath/set_ep_loc_000.c0000755000076400007640000000172211302567127015545 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * Renier Morales * Steve Sherman */ #include #include #include /* oh_set_ep_location test: NULL first parameter testcase. */ int main(int argc, char **argv) { SaErrorT err, expected_err; expected_err = SA_ERR_HPI_INVALID_PARAMS; err = oh_set_ep_location(NULL, SAHPI_ENT_ROOT, 5); if (err != expected_err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } return 0; } openhpi-2.14.1/utils/t/epath/ep_concat_014.c0000644000076400007640000000363511302567127015373 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * Chris Chia * Steve Sherman */ #include #include #include #include /* oh_concat_ep: concatenate two one less than full entity path */ int main(int argc, char **argv) { int i; SaErrorT err; SaHpiEntityPathT ep1; SaHpiEntityPathT ep2; SaHpiEntityPathT ep3; for (i=0; i */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{GROUP,2}{SUBRACK,5}"; char *epp_str = "*{SYSTEM_CHASSIS,.}{SBC_BLADE,.}"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_FALSE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-2.14.1/utils/t/epath/epath_pattern_222.c0000644000076400007640000000325211302567127016272 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{GROUP,4}{SYSTEM_CHASSIS,1}{PHYSICAL_SLOT,3}{SBC_BLADE,3}"; char *epp_str = "{.,.}{.,.}*"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_TRUE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-2.14.1/utils/t/epath/epath_pattern_394.c0000644000076400007640000000320111302567127016276 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{GROUP,2}{SUBRACK,5}"; char *epp_str = "*{.,.}*"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_TRUE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-2.14.1/utils/t/epath/epath_pattern_094.c0000644000076400007640000000325411302567127016303 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{SYSTEM_CHASSIS,1}{PHYSICAL_SLOT,3}{SBC_BLADE,3}{ADD_IN_CARD,8}"; char *epp_str = "*{.,.}*"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_TRUE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-2.14.1/utils/t/epath/epath_pattern_291.c0000644000076400007640000000321211302567127016274 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{PHYSICAL_SLOT,4}{SBC_BLADE,3}"; char *epp_str = "{.,.}"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_FALSE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-2.14.1/utils/t/epath/epath_pattern_028.c0000644000076400007640000000322011302567127016271 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{SYSTEM_CHASSIS,1}"; char *epp_str = "{SYSTEM_CHASSIS,1}{.,.}"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_FALSE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-2.14.1/utils/t/epath/epath_pattern_239.c0000644000076400007640000000322611302567127016303 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{SBC_BLADE,3}"; char *epp_str = "*{SYSTEM_CHASSIS,.}*{SBC_BLADE,.}*"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_FALSE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-2.14.1/utils/t/epath/epath_conv_021.c0000644000076400007640000000510311302567127015554 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. */ /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_tests.pl. * Do not change this file manually. Update script instead *******************************************************************/ #include #include #include /** * main: * epathstr -> epath test * * Test if an entity path string is converted properly into an entity path. **/ int main(int argc, char **argv) { char *test_string = "{PROCESSOR,93}{OTHER_SYSTEM_BOARD,25}"; oh_big_textbuffer bigbuf; SaErrorT err; SaHpiEntityPathT ep; err = oh_encode_entitypath(test_string, &ep); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } if (ep.Entry[0].EntityType != SAHPI_ENT_OTHER_SYSTEM_BOARD) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[0].EntityType, SAHPI_ENT_OTHER_SYSTEM_BOARD); return -1; } if (ep.Entry[0].EntityLocation != 25) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[0].EntityLocation, 25); return -1; } if (ep.Entry[1].EntityType != SAHPI_ENT_PROCESSOR) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[1].EntityType, SAHPI_ENT_PROCESSOR); return -1; } if (ep.Entry[1].EntityLocation != 93) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[1].EntityLocation, 93); return -1; } oh_init_bigtext(&bigbuf); err = oh_decode_entitypath(&ep, &bigbuf); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } if (strcmp((char *)bigbuf.Data, test_string)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received Entity Path=%s.\n", bigbuf.Data); return -1; } return 0; } openhpi-2.14.1/utils/t/epath/epath_pattern_080.c0000644000076400007640000000327011302567127016274 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{SYSTEM_CHASSIS,1}{PHYSICAL_SLOT,3}{SBC_BLADE,3}{ADD_IN_CARD,8}"; char *epp_str = "{SYSTEM_CHASSIS,1}*"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_TRUE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-2.14.1/utils/t/epath/epath_pattern_371.c0000644000076400007640000000317411302567127016302 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{GROUP,2}"; char *epp_str = "{.,.}*{.,.}*"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_FALSE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-2.14.1/utils/t/epath/epath_pattern_201.c0000644000076400007640000000327711302567127016276 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{GROUP,4}{SYSTEM_CHASSIS,1}{PHYSICAL_SLOT,3}{SBC_BLADE,3}"; char *epp_str = "{SYSTEM_CHASSIS,1}{SBC_BLADE,.}"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_FALSE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-2.14.1/utils/t/epath/epath_pattern_105.c0000644000076400007640000000330211302567127016266 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{GROUP,4}{SYSTEM_CHASSIS,1}{PHYSICAL_SLOT,3}{SBC_BLADE,3}{ADD_IN_CARD,8}"; char *epp_str = "{SYSTEM_CHASSIS,1}*"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_FALSE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-2.14.1/utils/t/epath/epath_pattern_396.c0000644000076400007640000000320611302567127016305 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{GROUP,2}{SUBRACK,5}"; char *epp_str = "{.,.}*{.,.}*"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_TRUE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-2.14.1/utils/t/epath/epath_pattern_241.c0000644000076400007640000000317011302567127016272 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{SBC_BLADE,3}"; char *epp_str = "{.,.}"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_TRUE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-2.14.1/utils/t/epath/epath_pattern_147.c0000644000076400007640000000321411302567127016276 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{GROUP,4}{SYSTEM_CHASSIS,1}"; char *epp_str = "{.,.}{.,.}*"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_TRUE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-2.14.1/utils/t/epath/epath_pattern_289.c0000644000076400007640000000324711302567127016313 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{PHYSICAL_SLOT,4}{SBC_BLADE,3}"; char *epp_str = "*{SYSTEM_CHASSIS,.}*{SBC_BLADE,.}*"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_FALSE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-2.14.1/utils/t/epath/epath_pattern_278.c0000644000076400007640000000323411302567127016305 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{PHYSICAL_SLOT,4}{SBC_BLADE,3}"; char *epp_str = "{SYSTEM_CHASSIS,1}{.,.}"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_FALSE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-2.14.1/utils/t/epath/epath_conv_096.c0000644000076400007640000000510311302567127015570 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. */ /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_tests.pl. * Do not change this file manually. Update script instead *******************************************************************/ #include #include #include /** * main: * epathstr -> epath test * * Test if an entity path string is converted properly into an entity path. **/ int main(int argc, char **argv) { char *test_string = "{PHYSICAL_SLOT,73}{SPEC_PROC_BLADE,7}"; oh_big_textbuffer bigbuf; SaErrorT err; SaHpiEntityPathT ep; err = oh_encode_entitypath(test_string, &ep); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } if (ep.Entry[0].EntityType != SAHPI_ENT_SPEC_PROC_BLADE) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[0].EntityType, SAHPI_ENT_SPEC_PROC_BLADE); return -1; } if (ep.Entry[0].EntityLocation != 7) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[0].EntityLocation, 7); return -1; } if (ep.Entry[1].EntityType != SAHPI_ENT_PHYSICAL_SLOT) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[1].EntityType, SAHPI_ENT_PHYSICAL_SLOT); return -1; } if (ep.Entry[1].EntityLocation != 73) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[1].EntityLocation, 73); return -1; } oh_init_bigtext(&bigbuf); err = oh_decode_entitypath(&ep, &bigbuf); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } if (strcmp((char *)bigbuf.Data, test_string)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received Entity Path=%s.\n", bigbuf.Data); return -1; } return 0; } openhpi-2.14.1/utils/t/epath/epath_pattern_361.c0000644000076400007640000000322111302567127016272 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{GROUP,2}"; char *epp_str = "*{SYSTEM_CHASSIS,1}{SBC_BLADE,.}*"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_FALSE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-2.14.1/utils/t/epath/ep_concat_010.c0000644000076400007640000000265511302567127015370 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * Chris Chia * Steve Sherman */ #include #include #include #include /* oh_concat_ep: concatenate a full and a zero element entity path */ int main(int argc, char **argv) { int i; SaErrorT err; SaHpiEntityPathT ep1; SaHpiEntityPathT ep2 = {{{SAHPI_ENT_ROOT,0}}}; SaHpiEntityPathT ep3; for (i=0; i */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{GROUP,4}{SYSTEM_CHASSIS,1}{SBC_BLADE,3}"; char *epp_str = "*{.,.}{.,.}"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_TRUE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-2.14.1/utils/t/epath/epath_pattern_060.c0000644000076400007640000000324311302567127016272 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{SYSTEM_CHASSIS,1}{SBC_BLADE,3}{ADD_IN_CARD,8}"; char *epp_str = "*{SBC_BLADE,.}*"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_TRUE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-2.14.1/utils/t/epath/epath_conv_035.c0000644000076400007640000000510311302567127015561 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. */ /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_tests.pl. * Do not change this file manually. Update script instead *******************************************************************/ #include #include #include /** * main: * epathstr -> epath test * * Test if an entity path string is converted properly into an entity path. **/ int main(int argc, char **argv) { char *test_string = "{ALARM_MANAGER,3}{PROCESSOR_MODULE,5}"; oh_big_textbuffer bigbuf; SaErrorT err; SaHpiEntityPathT ep; err = oh_encode_entitypath(test_string, &ep); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } if (ep.Entry[0].EntityType != SAHPI_ENT_PROCESSOR_MODULE) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[0].EntityType, SAHPI_ENT_PROCESSOR_MODULE); return -1; } if (ep.Entry[0].EntityLocation != 5) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[0].EntityLocation, 5); return -1; } if (ep.Entry[1].EntityType != SAHPI_ENT_ALARM_MANAGER) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[1].EntityType, SAHPI_ENT_ALARM_MANAGER); return -1; } if (ep.Entry[1].EntityLocation != 3) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[1].EntityLocation, 3); return -1; } oh_init_bigtext(&bigbuf); err = oh_decode_entitypath(&ep, &bigbuf); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } if (strcmp((char *)bigbuf.Data, test_string)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received Entity Path=%s.\n", bigbuf.Data); return -1; } return 0; } openhpi-2.14.1/utils/t/epath/epath_conv_068.c0000644000076400007640000000507211302567127015574 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. */ /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_tests.pl. * Do not change this file manually. Update script instead *******************************************************************/ #include #include #include /** * main: * epathstr -> epath test * * Test if an entity path string is converted properly into an entity path. **/ int main(int argc, char **argv) { char *test_string = "{DISPLAY_PANEL,38}{SUB_CHASSIS,52}"; oh_big_textbuffer bigbuf; SaErrorT err; SaHpiEntityPathT ep; err = oh_encode_entitypath(test_string, &ep); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } if (ep.Entry[0].EntityType != SAHPI_ENT_SUB_CHASSIS) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[0].EntityType, SAHPI_ENT_SUB_CHASSIS); return -1; } if (ep.Entry[0].EntityLocation != 52) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[0].EntityLocation, 52); return -1; } if (ep.Entry[1].EntityType != SAHPI_ENT_DISPLAY_PANEL) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[1].EntityType, SAHPI_ENT_DISPLAY_PANEL); return -1; } if (ep.Entry[1].EntityLocation != 38) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[1].EntityLocation, 38); return -1; } oh_init_bigtext(&bigbuf); err = oh_decode_entitypath(&ep, &bigbuf); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } if (strcmp((char *)bigbuf.Data, test_string)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received Entity Path=%s.\n", bigbuf.Data); return -1; } return 0; } openhpi-2.14.1/utils/t/epath/epath_pattern_347.c0000644000076400007640000000324111302567127016300 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{SYSTEM_CHASSIS,1}{PHYSICAL_SLOT,4}{SBC_BLADE,3}"; char *epp_str = "{.,.}{.,.}*"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_TRUE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-2.14.1/utils/t/epath/epath_pattern_449.c0000644000076400007640000000321511302567127016304 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{GROUP,7}{REMOTE,2}{SUBRACK,4}{BIOS,8}"; char *epp_str = "*"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_TRUE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-2.14.1/utils/t/epath/epath_pattern_059.c0000644000076400007640000000324311302567127016302 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{SYSTEM_CHASSIS,1}{SBC_BLADE,3}{ADD_IN_CARD,8}"; char *epp_str = "*{SBC_BLADE,.}"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_FALSE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-2.14.1/utils/t/epath/epath_conv_054.c0000644000076400007640000000504211302567127015564 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. */ /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_tests.pl. * Do not change this file manually. Update script instead *******************************************************************/ #include #include #include /** * main: * epathstr -> epath test * * Test if an entity path string is converted properly into an entity path. **/ int main(int argc, char **argv) { char *test_string = "{REMOTE,53}{DISK_DRIVE,31}"; oh_big_textbuffer bigbuf; SaErrorT err; SaHpiEntityPathT ep; err = oh_encode_entitypath(test_string, &ep); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } if (ep.Entry[0].EntityType != SAHPI_ENT_DISK_DRIVE) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[0].EntityType, SAHPI_ENT_DISK_DRIVE); return -1; } if (ep.Entry[0].EntityLocation != 31) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[0].EntityLocation, 31); return -1; } if (ep.Entry[1].EntityType != SAHPI_ENT_REMOTE) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[1].EntityType, SAHPI_ENT_REMOTE); return -1; } if (ep.Entry[1].EntityLocation != 53) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[1].EntityLocation, 53); return -1; } oh_init_bigtext(&bigbuf); err = oh_decode_entitypath(&ep, &bigbuf); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } if (strcmp((char *)bigbuf.Data, test_string)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received Entity Path=%s.\n", bigbuf.Data); return -1; } return 0; } openhpi-2.14.1/utils/t/epath/epath_pattern_133.c0000644000076400007640000000322011302567127016266 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{GROUP,4}{SYSTEM_CHASSIS,1}"; char *epp_str = "*{SBC_BLADE,3}"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_FALSE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-2.14.1/utils/t/epath/epath_pattern_216.c0000644000076400007640000000324511302567127016277 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{GROUP,4}{SYSTEM_CHASSIS,1}{PHYSICAL_SLOT,3}{SBC_BLADE,3}"; char *epp_str = "{.,.}"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_FALSE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-2.14.1/utils/t/epath/ep_concat_003.c0000644000076400007640000000246511302567127015371 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * Chris Chia * Steve Sherman */ #include #include #include #include /* oh_concat_ep: concatenate 2 single element entity path. */ int main(int argc, char **argv) { SaErrorT err; SaHpiEntityPathT ep1 = {{{SAHPI_ENT_UNKNOWN,11},{SAHPI_ENT_ROOT,0}}}; SaHpiEntityPathT ep2 = {{{SAHPI_ENT_POWER_MGMNT,99},{SAHPI_ENT_ROOT,0}}}; SaHpiEntityPathT ep3 = {{{SAHPI_ENT_UNKNOWN,11},{SAHPI_ENT_POWER_MGMNT,99}, {SAHPI_ENT_ROOT,0}}}; err = oh_concat_ep(&ep1, &ep2); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } if (!oh_cmp_ep(&ep1, &ep3)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); return -1; } return 0; } openhpi-2.14.1/utils/t/epath/epath_pattern_019.c0000644000076400007640000000321411302567127016274 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{SYSTEM_CHASSIS,1}{SBC_BLADE,3}"; char *epp_str = "*{.,.}*"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_TRUE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-2.14.1/utils/t/epath/epath_pattern_422.c0000644000076400007640000000321711302567127016275 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{GROUP,7}{REMOTE,2}{SUBRACK,4}"; char *epp_str = "{.,.}{.,.}*"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_TRUE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-2.14.1/utils/t/epath/epath_pattern_370.c0000644000076400007640000000317411302567127016301 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{GROUP,2}"; char *epp_str = "*{.,.}*{.,.}"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_FALSE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-2.14.1/utils/t/epath/epath_pattern_358.c0000644000076400007640000000317611302567127016311 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{GROUP,2}"; char *epp_str = "*{SBC_BLADE,3}"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_FALSE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-2.14.1/utils/t/epath/epath_conv_042.c0000644000076400007640000000507211302567127015564 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. */ /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_tests.pl. * Do not change this file manually. Update script instead *******************************************************************/ #include #include #include /** * main: * epathstr -> epath test * * Test if an entity path string is converted properly into an entity path. **/ int main(int argc, char **argv) { char *test_string = "{GROUP,2}{EXTERNAL_ENVIRONMENT,41}"; oh_big_textbuffer bigbuf; SaErrorT err; SaHpiEntityPathT ep; err = oh_encode_entitypath(test_string, &ep); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } if (ep.Entry[0].EntityType != SAHPI_ENT_EXTERNAL_ENVIRONMENT) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[0].EntityType, SAHPI_ENT_EXTERNAL_ENVIRONMENT); return -1; } if (ep.Entry[0].EntityLocation != 41) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[0].EntityLocation, 41); return -1; } if (ep.Entry[1].EntityType != SAHPI_ENT_GROUP) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[1].EntityType, SAHPI_ENT_GROUP); return -1; } if (ep.Entry[1].EntityLocation != 2) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[1].EntityLocation, 2); return -1; } oh_init_bigtext(&bigbuf); err = oh_decode_entitypath(&ep, &bigbuf); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } if (strcmp((char *)bigbuf.Data, test_string)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received Entity Path=%s.\n", bigbuf.Data); return -1; } return 0; } openhpi-2.14.1/utils/t/epath/epath_pattern_290.c0000644000076400007640000000322711302567127016301 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{PHYSICAL_SLOT,4}{SBC_BLADE,3}"; char *epp_str = "{SYSTEM_CHASSIS,.}"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_FALSE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-2.14.1/utils/t/epath/epath_conv_092.c0000644000076400007640000000513611302567127015572 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. */ /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_tests.pl. * Do not change this file manually. Update script instead *******************************************************************/ #include #include #include /** * main: * epathstr -> epath test * * Test if an entity path string is converted properly into an entity path. **/ int main(int argc, char **argv) { char *test_string = "{ALARM_MANAGER,99}{POWER_DISTRIBUTION_UNIT,54}"; oh_big_textbuffer bigbuf; SaErrorT err; SaHpiEntityPathT ep; err = oh_encode_entitypath(test_string, &ep); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } if (ep.Entry[0].EntityType != SAHPI_ENT_POWER_DISTRIBUTION_UNIT) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[0].EntityType, SAHPI_ENT_POWER_DISTRIBUTION_UNIT); return -1; } if (ep.Entry[0].EntityLocation != 54) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[0].EntityLocation, 54); return -1; } if (ep.Entry[1].EntityType != SAHPI_ENT_ALARM_MANAGER) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[1].EntityType, SAHPI_ENT_ALARM_MANAGER); return -1; } if (ep.Entry[1].EntityLocation != 99) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[1].EntityLocation, 99); return -1; } oh_init_bigtext(&bigbuf); err = oh_decode_entitypath(&ep, &bigbuf); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } if (strcmp((char *)bigbuf.Data, test_string)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received Entity Path=%s.\n", bigbuf.Data); return -1; } return 0; } openhpi-2.14.1/utils/t/epath/epath_conv_040.c0000644000076400007640000000513311302567127015560 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. */ /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_tests.pl. * Do not change this file manually. Update script instead *******************************************************************/ #include #include #include /** * main: * epathstr -> epath test * * Test if an entity path string is converted properly into an entity path. **/ int main(int argc, char **argv) { char *test_string = "{FRONT_PANEL_BOARD,21}{POWER_SYSTEM_BOARD,15}"; oh_big_textbuffer bigbuf; SaErrorT err; SaHpiEntityPathT ep; err = oh_encode_entitypath(test_string, &ep); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } if (ep.Entry[0].EntityType != SAHPI_ENT_POWER_SYSTEM_BOARD) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[0].EntityType, SAHPI_ENT_POWER_SYSTEM_BOARD); return -1; } if (ep.Entry[0].EntityLocation != 15) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[0].EntityLocation, 15); return -1; } if (ep.Entry[1].EntityType != SAHPI_ENT_FRONT_PANEL_BOARD) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[1].EntityType, SAHPI_ENT_FRONT_PANEL_BOARD); return -1; } if (ep.Entry[1].EntityLocation != 21) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[1].EntityLocation, 21); return -1; } oh_init_bigtext(&bigbuf); err = oh_decode_entitypath(&ep, &bigbuf); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } if (strcmp((char *)bigbuf.Data, test_string)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received Entity Path=%s.\n", bigbuf.Data); return -1; } return 0; } openhpi-2.14.1/utils/t/epath/epath_pattern_430.c0000644000076400007640000000324011302567127016270 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{GROUP,7}{REMOTE,2}{SUBRACK,4}{BIOS,8}"; char *epp_str = "{SYSTEM_CHASSIS,1}*"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_FALSE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-2.14.1/utils/t/epath/epath_pattern_388.c0000644000076400007640000000323411302567127016307 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{GROUP,2}{SUBRACK,5}"; char *epp_str = "*{SYSTEM_CHASSIS,.}*{SBC_BLADE,.}"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_FALSE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-2.14.1/utils/t/epath/epath_pattern_425.c0000644000076400007640000000325411302567127016301 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{GROUP,7}{REMOTE,2}{SUBRACK,4}{BIOS,8}"; char *epp_str = "{SYSTEM_CHASSIS,1}{SBC_BLADE,3}"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_FALSE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-2.14.1/utils/t/epath/epath_pattern_141.c0000644000076400007640000000320711302567127016272 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{GROUP,4}{SYSTEM_CHASSIS,1}"; char *epp_str = "{.,.}"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_FALSE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-2.14.1/utils/t/epath/epath_pattern_191.c0000644000076400007640000000324311302567127016277 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{GROUP,4}{SYSTEM_CHASSIS,1}{SBC_BLADE,3}{ADD_IN_CARD,8}"; char *epp_str = "{.,.}"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_FALSE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-2.14.1/utils/t/epath/epath_pattern_131.c0000644000076400007640000000322411302567127016270 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{GROUP,4}{SYSTEM_CHASSIS,1}"; char *epp_str = "{SYSTEM_CHASSIS,1}"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_FALSE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-2.14.1/utils/t/epath/epath_pattern_368.c0000644000076400007640000000316511302567127016310 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{GROUP,2}"; char *epp_str = "{.,.}*"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_TRUE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-2.14.1/utils/t/epath/set_ep_loc_002.c0000755000076400007640000000243211302567127015546 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * Chris Chia * Steve Sherman */ #include #include #include #include /* oh_set_ep_location: Entity path that has 1 element testcase. */ int main(int argc, char **argv) { SaErrorT err; SaHpiEntityPathT ep = {{{SAHPI_ENT_OTHER, 1},{0}}}; SaHpiEntityLocationT x = 5; err = oh_set_ep_location(&ep, SAHPI_ENT_OTHER, x); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } if (ep.Entry[0].EntityLocation != x) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); return -1; } if (ep.Entry[0].EntityType != SAHPI_ENT_OTHER) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); return -1; } return 0; } openhpi-2.14.1/utils/t/epath/epath_pattern_268.c0000644000076400007640000000321011302567127016276 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{SBC_BLADE,3}{ADD_IN_CARD,8}"; char *epp_str = "{.,.}*"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_TRUE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-2.14.1/utils/t/epath/epath_pattern_190.c0000644000076400007640000000326011302567127016275 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{GROUP,4}{SYSTEM_CHASSIS,1}{SBC_BLADE,3}{ADD_IN_CARD,8}"; char *epp_str = "{SYSTEM_CHASSIS,.}"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_FALSE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-2.14.1/utils/t/epath/epath_pattern_210.c0000644000076400007640000000325611302567127016273 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{GROUP,4}{SYSTEM_CHASSIS,1}{PHYSICAL_SLOT,3}{SBC_BLADE,3}"; char *epp_str = "*{SBC_BLADE,.}*"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_TRUE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-2.14.1/utils/t/epath/ep_concat_012.c0000644000076400007640000000573711302567127015376 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * Chris Chia * Steve Sherman */ #include #include #include #include /* oh_concat_ep: concatenate a 15 element and a zero element entity path */ int main(int argc, char **argv) { SaErrorT err; SaHpiEntityPathT ep1 = {{{SAHPI_ENT_GROUP,1}, {SAHPI_ENT_REMOTE,2}, {SAHPI_ENT_EXTERNAL_ENVIRONMENT,3}, {SAHPI_ENT_BATTERY,4}, {SAHPI_ENT_CHASSIS_SPECIFIC,5}, {SAHPI_ENT_BOARD_SET_SPECIFIC,6}, {SAHPI_ENT_OEM_SYSINT_SPECIFIC,7}, {SAHPI_ENT_FAN,8}, {SAHPI_ENT_RACK,9}, {SAHPI_ENT_SUBRACK,10}, {SAHPI_ENT_COMPACTPCI_CHASSIS,11}, {SAHPI_ENT_ADVANCEDTCA_CHASSIS,12}, {SAHPI_ENT_PHYSICAL_SLOT,13}, {SAHPI_ENT_SBC_BLADE,14}, {SAHPI_ENT_IO_BLADE,15}, {SAHPI_ENT_ROOT,0}}}; SaHpiEntityPathT ep2 = {{{SAHPI_ENT_ROOT,0}}}; SaHpiEntityPathT ep3 = {{{SAHPI_ENT_GROUP,1}, {SAHPI_ENT_REMOTE,2}, {SAHPI_ENT_EXTERNAL_ENVIRONMENT,3}, {SAHPI_ENT_BATTERY,4}, {SAHPI_ENT_CHASSIS_SPECIFIC,5}, {SAHPI_ENT_BOARD_SET_SPECIFIC,6}, {SAHPI_ENT_OEM_SYSINT_SPECIFIC,7}, {SAHPI_ENT_FAN,8}, {SAHPI_ENT_RACK,9}, {SAHPI_ENT_SUBRACK,10}, {SAHPI_ENT_COMPACTPCI_CHASSIS,11}, {SAHPI_ENT_ADVANCEDTCA_CHASSIS,12}, {SAHPI_ENT_PHYSICAL_SLOT,13}, {SAHPI_ENT_SBC_BLADE,14}, {SAHPI_ENT_IO_BLADE,15}, {SAHPI_ENT_ROOT,0}}}; err = oh_concat_ep(&ep1, &ep2); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } if (!oh_cmp_ep(&ep1, &ep3)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); return -1; } return 0; } openhpi-2.14.1/utils/t/epath/epath_pattern_410.c0000644000076400007640000000322411302567127016270 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{GROUP,7}{REMOTE,2}{SUBRACK,4}"; char *epp_str = "*{SBC_BLADE,.}*"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_FALSE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-2.14.1/utils/t/epath/epath_conv_048.c0000644000076400007640000000510311302567127015565 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. */ /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_tests.pl. * Do not change this file manually. Update script instead *******************************************************************/ #include #include #include /** * main: * epathstr -> epath test * * Test if an entity path string is converted properly into an entity path. **/ int main(int argc, char **argv) { char *test_string = "{PROCESSOR,17}{COMPACTPCI_CHASSIS,33}"; oh_big_textbuffer bigbuf; SaErrorT err; SaHpiEntityPathT ep; err = oh_encode_entitypath(test_string, &ep); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } if (ep.Entry[0].EntityType != SAHPI_ENT_COMPACTPCI_CHASSIS) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[0].EntityType, SAHPI_ENT_COMPACTPCI_CHASSIS); return -1; } if (ep.Entry[0].EntityLocation != 33) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[0].EntityLocation, 33); return -1; } if (ep.Entry[1].EntityType != SAHPI_ENT_PROCESSOR) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[1].EntityType, SAHPI_ENT_PROCESSOR); return -1; } if (ep.Entry[1].EntityLocation != 17) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[1].EntityLocation, 17); return -1; } oh_init_bigtext(&bigbuf); err = oh_decode_entitypath(&ep, &bigbuf); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } if (strcmp((char *)bigbuf.Data, test_string)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received Entity Path=%s.\n", bigbuf.Data); return -1; } return 0; } openhpi-2.14.1/utils/t/epath/epath_pattern_341.c0000644000076400007640000000323411302567127016274 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{SYSTEM_CHASSIS,1}{PHYSICAL_SLOT,4}{SBC_BLADE,3}"; char *epp_str = "{.,.}"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_FALSE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-2.14.1/utils/t/epath/epath_pattern_245.c0000644000076400007640000000320011302567127016270 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{SBC_BLADE,3}"; char *epp_str = "*{.,.}*{.,.}"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_FALSE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-2.14.1/utils/t/epath/epath_pattern_015.c0000644000076400007640000000323011302567127016266 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{SYSTEM_CHASSIS,1}{SBC_BLADE,3}"; char *epp_str = "{SYSTEM_CHASSIS,.}"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_FALSE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-2.14.1/utils/t/epath/epath_pattern_243.c0000644000076400007640000000317111302567127016275 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{SBC_BLADE,3}"; char *epp_str = "{.,.}*"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_TRUE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-2.14.1/utils/t/epath/epath_conv_090.c0000644000076400007640000000505611302567127015571 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. */ /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_tests.pl. * Do not change this file manually. Update script instead *******************************************************************/ #include #include #include /** * main: * epathstr -> epath test * * Test if an entity path string is converted properly into an entity path. **/ int main(int argc, char **argv) { char *test_string = "{POWER_MODULE,6}{PROCESSOR,65}"; oh_big_textbuffer bigbuf; SaErrorT err; SaHpiEntityPathT ep; err = oh_encode_entitypath(test_string, &ep); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } if (ep.Entry[0].EntityType != SAHPI_ENT_PROCESSOR) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[0].EntityType, SAHPI_ENT_PROCESSOR); return -1; } if (ep.Entry[0].EntityLocation != 65) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[0].EntityLocation, 65); return -1; } if (ep.Entry[1].EntityType != SAHPI_ENT_POWER_MODULE) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[1].EntityType, SAHPI_ENT_POWER_MODULE); return -1; } if (ep.Entry[1].EntityLocation != 6) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[1].EntityLocation, 6); return -1; } oh_init_bigtext(&bigbuf); err = oh_decode_entitypath(&ep, &bigbuf); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } if (strcmp((char *)bigbuf.Data, test_string)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received Entity Path=%s.\n", bigbuf.Data); return -1; } return 0; } openhpi-2.14.1/utils/t/epath/epath_pattern_047.c0000644000076400007640000000320411302567127016274 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{SYSTEM_CHASSIS,1}"; char *epp_str = "{.,.}{.,.}*"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_FALSE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-2.14.1/utils/t/epath/epath_pattern_172.c0000644000076400007640000000323111302567127016273 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{GROUP,4}{SYSTEM_CHASSIS,1}{SBC_BLADE,3}"; char *epp_str = "{.,.}{.,.}*"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_TRUE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-2.14.1/utils/t/epath/epath_pattern_448.c0000644000076400007640000000322711302567127016306 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{GROUP,7}{REMOTE,2}{SUBRACK,4}{BIOS,8}"; char *epp_str = "*{.,.}{.,.}"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_TRUE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-2.14.1/utils/t/epath/epath_pattern_303.c0000644000076400007640000000325311302567127016273 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{PHYSICAL_SLOT,4}{SBC_BLADE,3}{ADD_IN_CARD,8}"; char *epp_str = "{SYSTEM_CHASSIS,1}{.,.}"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_FALSE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-2.14.1/utils/t/epath/epath_conv_098.c0000644000076400007640000000504511302567127015577 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. */ /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_tests.pl. * Do not change this file manually. Update script instead *******************************************************************/ #include #include #include /** * main: * epathstr -> epath test * * Test if an entity path string is converted properly into an entity path. **/ int main(int argc, char **argv) { char *test_string = "{SUBRACK,47}{DISK_DRIVE,66}"; oh_big_textbuffer bigbuf; SaErrorT err; SaHpiEntityPathT ep; err = oh_encode_entitypath(test_string, &ep); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } if (ep.Entry[0].EntityType != SAHPI_ENT_DISK_DRIVE) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[0].EntityType, SAHPI_ENT_DISK_DRIVE); return -1; } if (ep.Entry[0].EntityLocation != 66) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[0].EntityLocation, 66); return -1; } if (ep.Entry[1].EntityType != SAHPI_ENT_SUBRACK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[1].EntityType, SAHPI_ENT_SUBRACK); return -1; } if (ep.Entry[1].EntityLocation != 47) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[1].EntityLocation, 47); return -1; } oh_init_bigtext(&bigbuf); err = oh_decode_entitypath(&ep, &bigbuf); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } if (strcmp((char *)bigbuf.Data, test_string)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received Entity Path=%s.\n", bigbuf.Data); return -1; } return 0; } openhpi-2.14.1/utils/t/epath/epath_pattern_014.c0000644000076400007640000000324711302567127016275 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{SYSTEM_CHASSIS,1}{SBC_BLADE,3}"; char *epp_str = "*{SYSTEM_CHASSIS,.}*{SBC_BLADE,.}*"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_TRUE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-2.14.1/utils/t/epath/epath_pattern_181.c0000644000076400007640000000326011302567127016275 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{GROUP,4}{SYSTEM_CHASSIS,1}{SBC_BLADE,3}{ADD_IN_CARD,8}"; char *epp_str = "{SYSTEM_CHASSIS,1}"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_FALSE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-2.14.1/utils/t/epath/epath_pattern_112.c0000644000076400007640000000331711302567127016272 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{GROUP,4}{SYSTEM_CHASSIS,1}{PHYSICAL_SLOT,3}{SBC_BLADE,3}{ADD_IN_CARD,8}"; char *epp_str = "*{SYSTEM_CHASSIS,.}{SBC_BLADE,.}"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_FALSE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-2.14.1/utils/t/epath/epath_pattern_436.c0000644000076400007640000000325611302567127016305 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{GROUP,7}{REMOTE,2}{SUBRACK,4}{BIOS,8}"; char *epp_str = "*{SYSTEM_CHASSIS,1}{SBC_BLADE,.}*"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_FALSE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-2.14.1/utils/t/epath/epath_pattern_179.c0000644000076400007640000000326611302567127016312 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{GROUP,4}{SYSTEM_CHASSIS,1}{SBC_BLADE,3}{ADD_IN_CARD,8}"; char *epp_str = "{SYSTEM_CHASSIS,1}{.,.}*"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_FALSE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-2.14.1/utils/t/epath/set_ep_loc_005.c0000755000076400007640000000445711302567127015562 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * Chris Chia * Steve Sherman */ #include #include #include #include /* oh_set_ep_location: Entity path that has 4 elements testcase. */ int main(int argc, char **argv) { SaErrorT err; SaHpiEntityPathT ep = {{{SAHPI_ENT_PROCESSOR, 111}, {SAHPI_ENT_DISK_BAY, 2222}, {SAHPI_ENT_BATTERY, 33333}, {SAHPI_ENT_IO_SUBBOARD, 444444}, {0}}}; SaHpiEntityLocationT x = 10101010; err = oh_set_ep_location(&ep, SAHPI_ENT_IO_SUBBOARD, x); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } if (ep.Entry[3].EntityLocation != x) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); return -1; } if (ep.Entry[3].EntityType != SAHPI_ENT_IO_SUBBOARD) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); return -1; } if (ep.Entry[0].EntityLocation != 111) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); return -1; } if (ep.Entry[0].EntityType != SAHPI_ENT_PROCESSOR) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); return -1; } if (ep.Entry[1].EntityLocation != 2222) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); return -1; } if (ep.Entry[1].EntityType != SAHPI_ENT_DISK_BAY) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); return -1; } if (ep.Entry[2].EntityLocation != 33333) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); return -1; } if (ep.Entry[2].EntityType != SAHPI_ENT_BATTERY) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); return -1; } return 0; } openhpi-2.14.1/utils/t/epath/epath_pattern_082.c0000644000076400007640000000326311302567127016300 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{SYSTEM_CHASSIS,1}{PHYSICAL_SLOT,3}{SBC_BLADE,3}{ADD_IN_CARD,8}"; char *epp_str = "{SBC_BLADE,3}"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_FALSE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-2.14.1/utils/t/epath/epath_pattern_391.c0000644000076400007640000000320011302567127016272 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{GROUP,2}{SUBRACK,5}"; char *epp_str = "{.,.}"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_FALSE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-2.14.1/utils/t/epath/epath_pattern_409.c0000644000076400007640000000322311302567127016277 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{GROUP,7}{REMOTE,2}{SUBRACK,4}"; char *epp_str = "*{SBC_BLADE,.}"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_FALSE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-2.14.1/utils/t/epath/ep_concat_004.c0000644000076400007640000000316511302567127015370 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * Chris Chia * Steve Sherman */ #include #include #include #include /* oh_concat_ep: concatenate 2 two element entity path */ int main(int argc, char **argv) { SaErrorT err; SaHpiEntityPathT ep1 = {{{SAHPI_ENT_UNKNOWN,11}, {SAHPI_ENT_OTHER,22}, {SAHPI_ENT_ROOT,0}}}; SaHpiEntityPathT ep2 = {{{SAHPI_ENT_PROCESSOR,39}, {SAHPI_ENT_DISK_BAY,44}, {SAHPI_ENT_ROOT,0}}}; SaHpiEntityPathT ep3 = {{{SAHPI_ENT_UNKNOWN,11}, {SAHPI_ENT_OTHER,22}, {SAHPI_ENT_PROCESSOR,39}, {SAHPI_ENT_DISK_BAY,44}, {SAHPI_ENT_ROOT,0}}}; err = oh_concat_ep(&ep1, &ep2); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } if (!oh_cmp_ep(&ep1, &ep3)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); return -1; } return 0; } openhpi-2.14.1/utils/t/epath/epath_pattern_267.c0000644000076400007640000000321011302567127016275 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{SBC_BLADE,3}{ADD_IN_CARD,8}"; char *epp_str = "*{.,.}"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_TRUE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-2.14.1/utils/t/epath/epath_pattern_320.c0000644000076400007640000000323711302567127016274 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{PHYSICAL_SLOT,4}{SBC_BLADE,3}{ADD_IN_CARD,8}"; char *epp_str = "*{.,.}*{.,.}"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_TRUE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-2.14.1/utils/t/epath/epath_pattern_164.c0000644000076400007640000000326011302567127016276 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{GROUP,4}{SYSTEM_CHASSIS,1}{SBC_BLADE,3}"; char *epp_str = "*{SYSTEM_CHASSIS,.}*{SBC_BLADE,.}*"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_TRUE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-2.14.1/utils/t/epath/epath_pattern_104.c0000644000076400007640000000330711302567127016272 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{GROUP,4}{SYSTEM_CHASSIS,1}{PHYSICAL_SLOT,3}{SBC_BLADE,3}{ADD_IN_CARD,8}"; char *epp_str = "{SYSTEM_CHASSIS,1}{.,.}*"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_FALSE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-2.14.1/utils/t/epath/ep_concat_009.c0000644000076400007640000000265511302567127015400 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * Chris Chia * Steve Sherman */ #include #include #include #include /* oh_concat_ep: concatenate a zero element and a full entity path */ int main(int argc, char **argv) { int i; SaErrorT err; SaHpiEntityPathT ep1 = {{{SAHPI_ENT_ROOT,0}}}; SaHpiEntityPathT ep2; SaHpiEntityPathT ep3; for (i=0; i */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{GROUP,7}{REMOTE,2}{SUBRACK,4}{BIOS,8}"; char *epp_str = "*{SBC_BLADE,.}*"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_FALSE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-2.14.1/utils/t/epath/epath_pattern_006.c0000644000076400007640000000323011302567127016266 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{SYSTEM_CHASSIS,1}{SBC_BLADE,3}"; char *epp_str = "{SYSTEM_CHASSIS,1}"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_FALSE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-2.14.1/utils/t/epath/epath_pattern_117.c0000644000076400007640000000326411302567127016300 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{GROUP,4}{SYSTEM_CHASSIS,1}{PHYSICAL_SLOT,3}{SBC_BLADE,3}{ADD_IN_CARD,8}"; char *epp_str = "*{.,.}"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_TRUE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-2.14.1/utils/t/epath/epath_pattern_058.c0000644000076400007640000000324311302567127016301 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{SYSTEM_CHASSIS,1}{SBC_BLADE,3}{ADD_IN_CARD,8}"; char *epp_str = "*{SBC_BLADE,3}"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_FALSE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-2.14.1/utils/t/epath/epath_pattern_011.c0000644000076400007640000000324611302567127016271 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{SYSTEM_CHASSIS,1}{SBC_BLADE,3}"; char *epp_str = "*{SYSTEM_CHASSIS,1}{SBC_BLADE,.}*"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_TRUE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-2.14.1/utils/t/epath/epath_pattern_259.c0000644000076400007640000000322111302567127016300 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{SBC_BLADE,3}{ADD_IN_CARD,8}"; char *epp_str = "*{SBC_BLADE,.}"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_FALSE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-2.14.1/utils/t/epath/ep_concat_007.c0000644000076400007640000000621711302567127015374 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * Chris Chia * Steve Sherman */ #include #include #include #include /* oh_concat_ep: concatenate a 4 and a 12 element entity path */ int main(int argc, char **argv) { SaErrorT err; SaHpiEntityPathT ep1 = {{{SAHPI_ENT_POWER_UNIT,199}, {SAHPI_ENT_CHASSIS_BACK_PANEL_BOARD,202}, {SAHPI_ENT_SYSTEM_CHASSIS,211}, {SAHPI_ENT_SUB_CHASSIS,222}, {SAHPI_ENT_ROOT,0}}}; SaHpiEntityPathT ep2 = {{{SAHPI_ENT_OTHER_CHASSIS_BOARD,233}, {SAHPI_ENT_DISK_DRIVE_BAY,244}, {SAHPI_ENT_PERIPHERAL_BAY_2,255}, {SAHPI_ENT_DEVICE_BAY,255}, {SAHPI_ENT_COOLING_DEVICE,277}, {SAHPI_ENT_COOLING_UNIT,288}, {SAHPI_ENT_INTERCONNECT,299}, {SAHPI_ENT_MEMORY_DEVICE,303}, {SAHPI_ENT_SYS_MGMNT_SOFTWARE,311}, {SAHPI_ENT_BIOS,322}, {SAHPI_ENT_OPERATING_SYSTEM,333}, {SAHPI_ENT_SYSTEM_BUS,344}, {SAHPI_ENT_ROOT,0}}}; SaHpiEntityPathT ep3 = {{{SAHPI_ENT_POWER_UNIT,199}, {SAHPI_ENT_CHASSIS_BACK_PANEL_BOARD,202}, {SAHPI_ENT_SYSTEM_CHASSIS,211}, {SAHPI_ENT_SUB_CHASSIS,222}, {SAHPI_ENT_OTHER_CHASSIS_BOARD,233}, {SAHPI_ENT_DISK_DRIVE_BAY,244}, {SAHPI_ENT_PERIPHERAL_BAY_2,255}, {SAHPI_ENT_DEVICE_BAY,255}, {SAHPI_ENT_COOLING_DEVICE,277}, {SAHPI_ENT_COOLING_UNIT,288}, {SAHPI_ENT_INTERCONNECT,299}, {SAHPI_ENT_MEMORY_DEVICE,303}, {SAHPI_ENT_SYS_MGMNT_SOFTWARE,311}, {SAHPI_ENT_BIOS,322}, {SAHPI_ENT_OPERATING_SYSTEM,333}, {SAHPI_ENT_SYSTEM_BUS,344}}}; err = oh_concat_ep(&ep1, &ep2); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } if (!oh_cmp_ep(&ep1, &ep3)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); return -1; } return 0; } openhpi-2.14.1/utils/t/epath/epath_pattern_439.c0000644000076400007640000000325711302567127016311 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{GROUP,7}{REMOTE,2}{SUBRACK,4}{BIOS,8}"; char *epp_str = "*{SYSTEM_CHASSIS,.}*{SBC_BLADE,.}*"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_FALSE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-2.14.1/utils/t/epath/epath_pattern_277.c0000644000076400007640000000324511302567127016306 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{PHYSICAL_SLOT,4}{SBC_BLADE,3}"; char *epp_str = "{SYSTEM_CHASSIS,1}{SBC_BLADE,.}*"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_FALSE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-2.14.1/utils/t/epath/epath_pattern_184.c0000644000076400007640000000325411302567127016303 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{GROUP,4}{SYSTEM_CHASSIS,1}{SBC_BLADE,3}{ADD_IN_CARD,8}"; char *epp_str = "*{SBC_BLADE,.}"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_FALSE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-2.14.1/utils/t/epath/epath_pattern_023.c0000644000076400007640000000322011302567127016264 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{SYSTEM_CHASSIS,1}{SBC_BLADE,3}"; char *epp_str = "*{.,.}{.,.}"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_TRUE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-2.14.1/utils/t/epath/epath_conv_060.c0000644000076400007640000000507511302567127015567 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. */ /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_tests.pl. * Do not change this file manually. Update script instead *******************************************************************/ #include #include #include /** * main: * epathstr -> epath test * * Test if an entity path string is converted properly into an entity path. **/ int main(int argc, char **argv) { char *test_string = "{SYSTEM_BLADE,58}{PHYSICAL_SLOT,77}"; oh_big_textbuffer bigbuf; SaErrorT err; SaHpiEntityPathT ep; err = oh_encode_entitypath(test_string, &ep); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } if (ep.Entry[0].EntityType != SAHPI_ENT_PHYSICAL_SLOT) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[0].EntityType, SAHPI_ENT_PHYSICAL_SLOT); return -1; } if (ep.Entry[0].EntityLocation != 77) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[0].EntityLocation, 77); return -1; } if (ep.Entry[1].EntityType != SAHPI_ENT_SYSTEM_BLADE) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[1].EntityType, SAHPI_ENT_SYSTEM_BLADE); return -1; } if (ep.Entry[1].EntityLocation != 58) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[1].EntityLocation, 58); return -1; } oh_init_bigtext(&bigbuf); err = oh_decode_entitypath(&ep, &bigbuf); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } if (strcmp((char *)bigbuf.Data, test_string)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received Entity Path=%s.\n", bigbuf.Data); return -1; } return 0; } openhpi-2.14.1/utils/t/epath/epath_pattern_232.c0000644000076400007640000000320011302567127016264 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{SBC_BLADE,3}"; char *epp_str = "{SBC_BLADE,3}"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_TRUE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-2.14.1/utils/t/epath/epath_pattern_392.c0000644000076400007640000000320011302567127016273 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{GROUP,2}{SUBRACK,5}"; char *epp_str = "*{.,.}"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_TRUE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-2.14.1/utils/t/epath/epath_pattern_411.c0000644000076400007640000000324611302567127016275 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{GROUP,7}{REMOTE,2}{SUBRACK,4}"; char *epp_str = "*{SYSTEM_CHASSIS,1}{SBC_BLADE,.}*"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_FALSE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-2.14.1/utils/t/epath/epath_pattern_287.c0000644000076400007640000000324511302567127016307 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{PHYSICAL_SLOT,4}{SBC_BLADE,3}"; char *epp_str = "*{SYSTEM_CHASSIS,.}{SBC_BLADE,.}"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_FALSE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-2.14.1/utils/t/epath/epath_pattern_297.c0000644000076400007640000000321711302567127016307 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{PHYSICAL_SLOT,4}{SBC_BLADE,3}"; char *epp_str = "{.,.}{.,.}*"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_TRUE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-2.14.1/utils/t/epath/epath_conv_019.c0000644000076400007640000000511111302567127015562 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. */ /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_tests.pl. * Do not change this file manually. Update script instead *******************************************************************/ #include #include #include /** * main: * epathstr -> epath test * * Test if an entity path string is converted properly into an entity path. **/ int main(int argc, char **argv) { char *test_string = "{PROCESSOR_MODULE,55}{SYSTEM_CHASSIS,0}"; oh_big_textbuffer bigbuf; SaErrorT err; SaHpiEntityPathT ep; err = oh_encode_entitypath(test_string, &ep); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } if (ep.Entry[0].EntityType != SAHPI_ENT_SYSTEM_CHASSIS) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[0].EntityType, SAHPI_ENT_SYSTEM_CHASSIS); return -1; } if (ep.Entry[0].EntityLocation != 0) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[0].EntityLocation, 0); return -1; } if (ep.Entry[1].EntityType != SAHPI_ENT_PROCESSOR_MODULE) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[1].EntityType, SAHPI_ENT_PROCESSOR_MODULE); return -1; } if (ep.Entry[1].EntityLocation != 55) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[1].EntityLocation, 55); return -1; } oh_init_bigtext(&bigbuf); err = oh_decode_entitypath(&ep, &bigbuf); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } if (strcmp((char *)bigbuf.Data, test_string)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received Entity Path=%s.\n", bigbuf.Data); return -1; } return 0; } openhpi-2.14.1/utils/t/epath/epath_pattern_137.c0000644000076400007640000000324211302567127016276 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{GROUP,4}{SYSTEM_CHASSIS,1}"; char *epp_str = "*{SYSTEM_CHASSIS,.}{SBC_BLADE,.}"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_FALSE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-2.14.1/utils/t/epath/epath_conv_041.c0000644000076400007640000000513311302567127015561 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. */ /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_tests.pl. * Do not change this file manually. Update script instead *******************************************************************/ #include #include #include /** * main: * epathstr -> epath test * * Test if an entity path string is converted properly into an entity path. **/ int main(int argc, char **argv) { char *test_string = "{POWER_SYSTEM_BOARD,6}{OTHER_SYSTEM_BOARD,11}"; oh_big_textbuffer bigbuf; SaErrorT err; SaHpiEntityPathT ep; err = oh_encode_entitypath(test_string, &ep); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } if (ep.Entry[0].EntityType != SAHPI_ENT_OTHER_SYSTEM_BOARD) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[0].EntityType, SAHPI_ENT_OTHER_SYSTEM_BOARD); return -1; } if (ep.Entry[0].EntityLocation != 11) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[0].EntityLocation, 11); return -1; } if (ep.Entry[1].EntityType != SAHPI_ENT_POWER_SYSTEM_BOARD) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[1].EntityType, SAHPI_ENT_POWER_SYSTEM_BOARD); return -1; } if (ep.Entry[1].EntityLocation != 6) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[1].EntityLocation, 6); return -1; } oh_init_bigtext(&bigbuf); err = oh_decode_entitypath(&ep, &bigbuf); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } if (strcmp((char *)bigbuf.Data, test_string)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received Entity Path=%s.\n", bigbuf.Data); return -1; } return 0; } openhpi-2.14.1/utils/t/epath/epath_pattern_416.c0000644000076400007640000000321211302567127016273 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{GROUP,7}{REMOTE,2}{SUBRACK,4}"; char *epp_str = "{.,.}"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_FALSE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-2.14.1/utils/t/epath/epath_pattern_007.c0000644000076400007640000000322311302567127016271 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{SYSTEM_CHASSIS,1}{SBC_BLADE,3}"; char *epp_str = "{SBC_BLADE,3}"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_FALSE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-2.14.1/utils/t/epath/epath_conv_052.c0000644000076400007640000000511711302567127015565 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. */ /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_tests.pl. * Do not change this file manually. Update script instead *******************************************************************/ #include #include #include /** * main: * epathstr -> epath test * * Test if an entity path string is converted properly into an entity path. **/ int main(int argc, char **argv) { char *test_string = "{OTHER_SYSTEM_BOARD,90}{MEMORY_MODULE,12}"; oh_big_textbuffer bigbuf; SaErrorT err; SaHpiEntityPathT ep; err = oh_encode_entitypath(test_string, &ep); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } if (ep.Entry[0].EntityType != SAHPI_ENT_MEMORY_MODULE) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[0].EntityType, SAHPI_ENT_MEMORY_MODULE); return -1; } if (ep.Entry[0].EntityLocation != 12) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[0].EntityLocation, 12); return -1; } if (ep.Entry[1].EntityType != SAHPI_ENT_OTHER_SYSTEM_BOARD) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[1].EntityType, SAHPI_ENT_OTHER_SYSTEM_BOARD); return -1; } if (ep.Entry[1].EntityLocation != 90) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[1].EntityLocation, 90); return -1; } oh_init_bigtext(&bigbuf); err = oh_decode_entitypath(&ep, &bigbuf); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } if (strcmp((char *)bigbuf.Data, test_string)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received Entity Path=%s.\n", bigbuf.Data); return -1; } return 0; } openhpi-2.14.1/utils/t/epath/epath_pattern_089.c0000644000076400007640000000330711302567127016306 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{SYSTEM_CHASSIS,1}{PHYSICAL_SLOT,3}{SBC_BLADE,3}{ADD_IN_CARD,8}"; char *epp_str = "*{SYSTEM_CHASSIS,.}*{SBC_BLADE,.}*"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_TRUE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-2.14.1/utils/t/epath/epath_pattern_203.c0000644000076400007640000000326711302567127016277 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{GROUP,4}{SYSTEM_CHASSIS,1}{PHYSICAL_SLOT,3}{SBC_BLADE,3}"; char *epp_str = "{SYSTEM_CHASSIS,1}{.,.}"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_FALSE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-2.14.1/utils/t/epath/ep_cmp_002.c0000644000076400007640000000204311302567127014670 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * Chris Chia * Steve Sherman */ #include #include #include #include /* oh_cmp_ep: single element entity path testcase. */ int main(int argc, char **argv) { SaHpiEntityPathT ep1 = {{{SAHPI_ENT_ADD_IN_CARD,1111}, {SAHPI_ENT_ROOT, 0}}}; SaHpiEntityPathT ep2 = {{{SAHPI_ENT_ADD_IN_CARD,1111}, {SAHPI_ENT_ROOT, 0}}}; if (!oh_cmp_ep(&ep1, &ep2)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); return -1; } return 0; } openhpi-2.14.1/utils/t/epath/epath_pattern_447.c0000644000076400007640000000322711302567127016305 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{GROUP,7}{REMOTE,2}{SUBRACK,4}{BIOS,8}"; char *epp_str = "{.,.}{.,.}*"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_TRUE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-2.14.1/utils/t/epath/epath_conv_099.c0000644000076400007640000000514711302567127015603 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. */ /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_tests.pl. * Do not change this file manually. Update script instead *******************************************************************/ #include #include #include /** * main: * epathstr -> epath test * * Test if an entity path string is converted properly into an entity path. **/ int main(int argc, char **argv) { char *test_string = "{EXTERNAL_ENVIRONMENT,92}{OTHER_CHASSIS_BOARD,25}"; oh_big_textbuffer bigbuf; SaErrorT err; SaHpiEntityPathT ep; err = oh_encode_entitypath(test_string, &ep); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } if (ep.Entry[0].EntityType != SAHPI_ENT_OTHER_CHASSIS_BOARD) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[0].EntityType, SAHPI_ENT_OTHER_CHASSIS_BOARD); return -1; } if (ep.Entry[0].EntityLocation != 25) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[0].EntityLocation, 25); return -1; } if (ep.Entry[1].EntityType != SAHPI_ENT_EXTERNAL_ENVIRONMENT) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[1].EntityType, SAHPI_ENT_EXTERNAL_ENVIRONMENT); return -1; } if (ep.Entry[1].EntityLocation != 92) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[1].EntityLocation, 92); return -1; } oh_init_bigtext(&bigbuf); err = oh_decode_entitypath(&ep, &bigbuf); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } if (strcmp((char *)bigbuf.Data, test_string)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received Entity Path=%s.\n", bigbuf.Data); return -1; } return 0; } openhpi-2.14.1/utils/t/epath/epath_pattern_254.c0000644000076400007640000000323311302567127016276 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{SBC_BLADE,3}{ADD_IN_CARD,8}"; char *epp_str = "{SYSTEM_CHASSIS,1}{.,.}*"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_FALSE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-2.14.1/utils/t/epath/epath_pattern_138.c0000644000076400007640000000324311302567127016300 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{GROUP,4}{SYSTEM_CHASSIS,1}"; char *epp_str = "*{SYSTEM_CHASSIS,.}*{SBC_BLADE,.}"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_FALSE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-2.14.1/utils/t/epath/epath_pattern_431.c0000644000076400007640000000323711302567127016277 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{GROUP,7}{REMOTE,2}{SUBRACK,4}{BIOS,8}"; char *epp_str = "{SYSTEM_CHASSIS,1}"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_FALSE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-2.14.1/utils/t/epath/epath_pattern_264.c0000644000076400007640000000324511302567127016302 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{SBC_BLADE,3}{ADD_IN_CARD,8}"; char *epp_str = "*{SYSTEM_CHASSIS,.}*{SBC_BLADE,.}*"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_FALSE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-2.14.1/utils/t/epath/epath_pattern_198.c0000644000076400007640000000325011302567127016304 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{GROUP,4}{SYSTEM_CHASSIS,1}{SBC_BLADE,3}{ADD_IN_CARD,8}"; char *epp_str = "*{.,.}{.,.}"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_TRUE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-2.14.1/utils/t/epath/epath_conv_062.c0000644000076400007640000000507511302567127015571 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. */ /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_tests.pl. * Do not change this file manually. Update script instead *******************************************************************/ #include #include #include /** * main: * epathstr -> epath test * * Test if an entity path string is converted properly into an entity path. **/ int main(int argc, char **argv) { char *test_string = "{BACK_PANEL_BOARD,28}{PROCESSOR,36}"; oh_big_textbuffer bigbuf; SaErrorT err; SaHpiEntityPathT ep; err = oh_encode_entitypath(test_string, &ep); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } if (ep.Entry[0].EntityType != SAHPI_ENT_PROCESSOR) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[0].EntityType, SAHPI_ENT_PROCESSOR); return -1; } if (ep.Entry[0].EntityLocation != 36) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[0].EntityLocation, 36); return -1; } if (ep.Entry[1].EntityType != SAHPI_ENT_BACK_PANEL_BOARD) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[1].EntityType, SAHPI_ENT_BACK_PANEL_BOARD); return -1; } if (ep.Entry[1].EntityLocation != 28) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[1].EntityLocation, 28); return -1; } oh_init_bigtext(&bigbuf); err = oh_decode_entitypath(&ep, &bigbuf); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } if (strcmp((char *)bigbuf.Data, test_string)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received Entity Path=%s.\n", bigbuf.Data); return -1; } return 0; } openhpi-2.14.1/utils/t/epath/epath_pattern_020.c0000644000076400007640000000322111302567127016262 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{SYSTEM_CHASSIS,1}{SBC_BLADE,3}"; char *epp_str = "*{.,.}*{.,.}"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_TRUE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-2.14.1/utils/t/epath/epath_pattern_346.c0000644000076400007640000000324211302567127016300 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{SYSTEM_CHASSIS,1}{PHYSICAL_SLOT,4}{SBC_BLADE,3}"; char *epp_str = "{.,.}*{.,.}*"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_TRUE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-2.14.1/utils/t/epath/epath_pattern_315.c0000644000076400007640000000324611302567127016300 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{PHYSICAL_SLOT,4}{SBC_BLADE,3}{ADD_IN_CARD,8}"; char *epp_str = "{SYSTEM_CHASSIS,.}"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_FALSE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-2.14.1/utils/t/epath/epath_pattern_143.c0000644000076400007640000000320711302567127016274 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{GROUP,4}{SYSTEM_CHASSIS,1}"; char *epp_str = "{.,.}*"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_TRUE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-2.14.1/utils/t/epath/epath_pattern_367.c0000644000076400007640000000316511302567127016307 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{GROUP,2}"; char *epp_str = "*{.,.}"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_TRUE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-2.14.1/utils/t/epath/epath_pattern_352.c0000644000076400007640000000322011302567127016271 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{GROUP,2}"; char *epp_str = "{SYSTEM_CHASSIS,1}{SBC_BLADE,.}*"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_FALSE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-2.14.1/utils/t/epath/epath_pattern_040.c0000644000076400007640000000321211302567127016264 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{SYSTEM_CHASSIS,1}"; char *epp_str = "{SYSTEM_CHASSIS,.}"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_TRUE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-2.14.1/utils/t/epath/epath_pattern_170.c0000644000076400007640000000323211302567127016272 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{GROUP,4}{SYSTEM_CHASSIS,1}{SBC_BLADE,3}"; char *epp_str = "*{.,.}*{.,.}"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_TRUE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-2.14.1/utils/t/epath/epath_pattern_333.c0000644000076400007640000000324411302567127016276 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{SYSTEM_CHASSIS,1}{PHYSICAL_SLOT,4}{SBC_BLADE,3}"; char *epp_str = "*{SBC_BLADE,3}"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_TRUE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-2.14.1/utils/t/epath/epath_conv_043.c0000644000076400007640000000513011302567127015560 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. */ /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_tests.pl. * Do not change this file manually. Update script instead *******************************************************************/ #include #include #include /** * main: * epathstr -> epath test * * Test if an entity path string is converted properly into an entity path. **/ int main(int argc, char **argv) { char *test_string = "{SYS_MGMNT_MODULE,71}{COMPACTPCI_CHASSIS,87}"; oh_big_textbuffer bigbuf; SaErrorT err; SaHpiEntityPathT ep; err = oh_encode_entitypath(test_string, &ep); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } if (ep.Entry[0].EntityType != SAHPI_ENT_COMPACTPCI_CHASSIS) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[0].EntityType, SAHPI_ENT_COMPACTPCI_CHASSIS); return -1; } if (ep.Entry[0].EntityLocation != 87) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[0].EntityLocation, 87); return -1; } if (ep.Entry[1].EntityType != SAHPI_ENT_SYS_MGMNT_MODULE) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[1].EntityType, SAHPI_ENT_SYS_MGMNT_MODULE); return -1; } if (ep.Entry[1].EntityLocation != 71) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[1].EntityLocation, 71); return -1; } oh_init_bigtext(&bigbuf); err = oh_decode_entitypath(&ep, &bigbuf); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } if (strcmp((char *)bigbuf.Data, test_string)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received Entity Path=%s.\n", bigbuf.Data); return -1; } return 0; } openhpi-2.14.1/utils/t/epath/epath_pattern_124.c0000644000076400007640000000325711302567127016300 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{GROUP,4}{SYSTEM_CHASSIS,1}{PHYSICAL_SLOT,3}{SBC_BLADE,3}{ADD_IN_CARD,8}"; char *epp_str = "*"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_TRUE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-2.14.1/utils/t/epath/epath_pattern_149.c0000644000076400007640000000320211302567127016275 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{GROUP,4}{SYSTEM_CHASSIS,1}"; char *epp_str = "*"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_TRUE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-2.14.1/utils/t/epath/epath_pattern_208.c0000644000076400007640000000325511302567127016301 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{GROUP,4}{SYSTEM_CHASSIS,1}{PHYSICAL_SLOT,3}{SBC_BLADE,3}"; char *epp_str = "*{SBC_BLADE,3}"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_TRUE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-2.14.1/utils/t/epath/epath_conv_079.c0000644000076400007640000000507511302567127015601 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. */ /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_tests.pl. * Do not change this file manually. Update script instead *******************************************************************/ #include #include #include /** * main: * epathstr -> epath test * * Test if an entity path string is converted properly into an entity path. **/ int main(int argc, char **argv) { char *test_string = "{DISPLAY_PANEL,22}{POWER_MODULE,60}"; oh_big_textbuffer bigbuf; SaErrorT err; SaHpiEntityPathT ep; err = oh_encode_entitypath(test_string, &ep); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } if (ep.Entry[0].EntityType != SAHPI_ENT_POWER_MODULE) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[0].EntityType, SAHPI_ENT_POWER_MODULE); return -1; } if (ep.Entry[0].EntityLocation != 60) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[0].EntityLocation, 60); return -1; } if (ep.Entry[1].EntityType != SAHPI_ENT_DISPLAY_PANEL) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[1].EntityType, SAHPI_ENT_DISPLAY_PANEL); return -1; } if (ep.Entry[1].EntityLocation != 22) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[1].EntityLocation, 22); return -1; } oh_init_bigtext(&bigbuf); err = oh_decode_entitypath(&ep, &bigbuf); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } if (strcmp((char *)bigbuf.Data, test_string)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received Entity Path=%s.\n", bigbuf.Data); return -1; } return 0; } openhpi-2.14.1/utils/t/epath/epath_pattern_154.c0000644000076400007640000000324711302567127016302 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{GROUP,4}{SYSTEM_CHASSIS,1}{SBC_BLADE,3}"; char *epp_str = "{SYSTEM_CHASSIS,1}{.,.}*"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_FALSE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-2.14.1/utils/t/epath/epath_pattern_063.c0000644000076400007640000000326611302567127016302 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{SYSTEM_CHASSIS,1}{SBC_BLADE,3}{ADD_IN_CARD,8}"; char *epp_str = "*{SYSTEM_CHASSIS,.}*{SBC_BLADE,.}"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_FALSE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-2.14.1/utils/t/epath/epath_pattern_307.c0000644000076400007640000000324111302567127016274 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{PHYSICAL_SLOT,4}{SBC_BLADE,3}{ADD_IN_CARD,8}"; char *epp_str = "{SBC_BLADE,3}"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_FALSE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-2.14.1/utils/t/epath/epath_pattern_301.c0000644000076400007640000000326311302567127016272 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{PHYSICAL_SLOT,4}{SBC_BLADE,3}{ADD_IN_CARD,8}"; char *epp_str = "{SYSTEM_CHASSIS,1}{SBC_BLADE,.}"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_FALSE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-2.14.1/utils/t/epath/epath_conv_028.c0000644000076400007640000000511411302567127015565 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. */ /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_tests.pl. * Do not change this file manually. Update script instead *******************************************************************/ #include #include #include /** * main: * epathstr -> epath test * * Test if an entity path string is converted properly into an entity path. **/ int main(int argc, char **argv) { char *test_string = "{OPERATING_SYSTEM,80}{DISK_DRIVE_BAY,86}"; oh_big_textbuffer bigbuf; SaErrorT err; SaHpiEntityPathT ep; err = oh_encode_entitypath(test_string, &ep); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } if (ep.Entry[0].EntityType != SAHPI_ENT_DISK_DRIVE_BAY) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[0].EntityType, SAHPI_ENT_DISK_DRIVE_BAY); return -1; } if (ep.Entry[0].EntityLocation != 86) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[0].EntityLocation, 86); return -1; } if (ep.Entry[1].EntityType != SAHPI_ENT_OPERATING_SYSTEM) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[1].EntityType, SAHPI_ENT_OPERATING_SYSTEM); return -1; } if (ep.Entry[1].EntityLocation != 80) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[1].EntityLocation, 80); return -1; } oh_init_bigtext(&bigbuf); err = oh_decode_entitypath(&ep, &bigbuf); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } if (strcmp((char *)bigbuf.Data, test_string)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received Entity Path=%s.\n", bigbuf.Data); return -1; } return 0; } openhpi-2.14.1/utils/t/epath/epath_pattern_281.c0000644000076400007640000000322711302567127016301 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{PHYSICAL_SLOT,4}{SBC_BLADE,3}"; char *epp_str = "{SYSTEM_CHASSIS,1}"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_FALSE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-2.14.1/utils/t/epath/epath_pattern_417.c0000644000076400007640000000321211302567127016274 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{GROUP,7}{REMOTE,2}{SUBRACK,4}"; char *epp_str = "*{.,.}"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_TRUE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-2.14.1/utils/t/epath/epath_pattern_052.c0000644000076400007640000000326411302567127016276 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{SYSTEM_CHASSIS,1}{SBC_BLADE,3}{ADD_IN_CARD,8}"; char *epp_str = "{SYSTEM_CHASSIS,1}{SBC_BLADE,.}*"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_TRUE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-2.14.1/utils/t/epath/epath_pattern_343.c0000644000076400007640000000323411302567127016276 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{SYSTEM_CHASSIS,1}{PHYSICAL_SLOT,4}{SBC_BLADE,3}"; char *epp_str = "{.,.}*"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_TRUE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-2.14.1/utils/t/epath/epath_pattern_008.c0000644000076400007640000000322311302567127016272 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{SYSTEM_CHASSIS,1}{SBC_BLADE,3}"; char *epp_str = "*{SBC_BLADE,3}"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_TRUE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-2.14.1/utils/t/epath/epath_pattern_270.c0000644000076400007640000000321611302567127016275 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{SBC_BLADE,3}{ADD_IN_CARD,8}"; char *epp_str = "*{.,.}*{.,.}"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_TRUE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-2.14.1/utils/t/epath/epath_conv_029.c0000644000076400007640000000506411302567127015572 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. */ /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_tests.pl. * Do not change this file manually. Update script instead *******************************************************************/ #include #include #include /** * main: * epathstr -> epath test * * Test if an entity path string is converted properly into an entity path. **/ int main(int argc, char **argv) { char *test_string = "{SBC_BLADE,34}{PERIPHERAL_BAY,8}"; oh_big_textbuffer bigbuf; SaErrorT err; SaHpiEntityPathT ep; err = oh_encode_entitypath(test_string, &ep); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } if (ep.Entry[0].EntityType != SAHPI_ENT_PERIPHERAL_BAY) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[0].EntityType, SAHPI_ENT_PERIPHERAL_BAY); return -1; } if (ep.Entry[0].EntityLocation != 8) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[0].EntityLocation, 8); return -1; } if (ep.Entry[1].EntityType != SAHPI_ENT_SBC_BLADE) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[1].EntityType, SAHPI_ENT_SBC_BLADE); return -1; } if (ep.Entry[1].EntityLocation != 34) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[1].EntityLocation, 34); return -1; } oh_init_bigtext(&bigbuf); err = oh_decode_entitypath(&ep, &bigbuf); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } if (strcmp((char *)bigbuf.Data, test_string)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received Entity Path=%s.\n", bigbuf.Data); return -1; } return 0; } openhpi-2.14.1/utils/t/epath/epath_pattern_075.c0000644000076400007640000000330511302567127016277 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{SYSTEM_CHASSIS,1}{PHYSICAL_SLOT,3}{SBC_BLADE,3}{ADD_IN_CARD,8}"; char *epp_str = "{SYSTEM_CHASSIS,1}{SBC_BLADE,3}"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_FALSE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-2.14.1/utils/t/epath/epath_pattern_244.c0000644000076400007640000000317211302567127016277 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{SBC_BLADE,3}"; char *epp_str = "*{.,.}*"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_TRUE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-2.14.1/utils/t/epath/epath_pattern_091.c0000644000076400007640000000325311302567127016277 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{SYSTEM_CHASSIS,1}{PHYSICAL_SLOT,3}{SBC_BLADE,3}{ADD_IN_CARD,8}"; char *epp_str = "{.,.}"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_FALSE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-2.14.1/utils/t/epath/epath_conv_071.c0000644000076400007640000000505611302567127015570 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. */ /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_tests.pl. * Do not change this file manually. Update script instead *******************************************************************/ #include #include #include /** * main: * epathstr -> epath test * * Test if an entity path string is converted properly into an entity path. **/ int main(int argc, char **argv) { char *test_string = "{BIOS,49}{SYS_MGMNT_MODULE,50}"; oh_big_textbuffer bigbuf; SaErrorT err; SaHpiEntityPathT ep; err = oh_encode_entitypath(test_string, &ep); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } if (ep.Entry[0].EntityType != SAHPI_ENT_SYS_MGMNT_MODULE) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[0].EntityType, SAHPI_ENT_SYS_MGMNT_MODULE); return -1; } if (ep.Entry[0].EntityLocation != 50) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[0].EntityLocation, 50); return -1; } if (ep.Entry[1].EntityType != SAHPI_ENT_BIOS) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[1].EntityType, SAHPI_ENT_BIOS); return -1; } if (ep.Entry[1].EntityLocation != 49) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[1].EntityLocation, 49); return -1; } oh_init_bigtext(&bigbuf); err = oh_decode_entitypath(&ep, &bigbuf); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } if (strcmp((char *)bigbuf.Data, test_string)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received Entity Path=%s.\n", bigbuf.Data); return -1; } return 0; } openhpi-2.14.1/utils/t/epath/epath_pattern_237.c0000644000076400007640000000322411302567127016277 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{SBC_BLADE,3}"; char *epp_str = "*{SYSTEM_CHASSIS,.}{SBC_BLADE,.}"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_FALSE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-2.14.1/utils/t/epath/epath_pattern_405.c0000644000076400007640000000323011302567127016271 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{GROUP,7}{REMOTE,2}{SUBRACK,4}"; char *epp_str = "{SYSTEM_CHASSIS,1}*"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_FALSE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-2.14.1/utils/t/epath/epath_conv_014.c0000644000076400007640000000505311302567127015562 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. */ /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_tests.pl. * Do not change this file manually. Update script instead *******************************************************************/ #include #include #include /** * main: * epathstr -> epath test * * Test if an entity path string is converted properly into an entity path. **/ int main(int argc, char **argv) { char *test_string = "{BATTERY,37}{SYSTEM_BOARD,40}"; oh_big_textbuffer bigbuf; SaErrorT err; SaHpiEntityPathT ep; err = oh_encode_entitypath(test_string, &ep); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } if (ep.Entry[0].EntityType != SAHPI_ENT_SYSTEM_BOARD) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[0].EntityType, SAHPI_ENT_SYSTEM_BOARD); return -1; } if (ep.Entry[0].EntityLocation != 40) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[0].EntityLocation, 40); return -1; } if (ep.Entry[1].EntityType != SAHPI_ENT_BATTERY) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[1].EntityType, SAHPI_ENT_BATTERY); return -1; } if (ep.Entry[1].EntityLocation != 37) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[1].EntityLocation, 37); return -1; } oh_init_bigtext(&bigbuf); err = oh_decode_entitypath(&ep, &bigbuf); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } if (strcmp((char *)bigbuf.Data, test_string)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received Entity Path=%s.\n", bigbuf.Data); return -1; } return 0; } openhpi-2.14.1/utils/t/epath/epath_conv_005.c0000644000076400007640000000506111302567127015561 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. */ /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_tests.pl. * Do not change this file manually. Update script instead *******************************************************************/ #include #include #include /** * main: * epathstr -> epath test * * Test if an entity path string is converted properly into an entity path. **/ int main(int argc, char **argv) { char *test_string = "{BATTERY,11}{COOLING_DEVICE,12}"; oh_big_textbuffer bigbuf; SaErrorT err; SaHpiEntityPathT ep; err = oh_encode_entitypath(test_string, &ep); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } if (ep.Entry[0].EntityType != SAHPI_ENT_COOLING_DEVICE) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[0].EntityType, SAHPI_ENT_COOLING_DEVICE); return -1; } if (ep.Entry[0].EntityLocation != 12) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[0].EntityLocation, 12); return -1; } if (ep.Entry[1].EntityType != SAHPI_ENT_BATTERY) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[1].EntityType, SAHPI_ENT_BATTERY); return -1; } if (ep.Entry[1].EntityLocation != 11) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[1].EntityLocation, 11); return -1; } oh_init_bigtext(&bigbuf); err = oh_decode_entitypath(&ep, &bigbuf); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } if (strcmp((char *)bigbuf.Data, test_string)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received Entity Path=%s.\n", bigbuf.Data); return -1; } return 0; } openhpi-2.14.1/utils/t/epath/epath_pattern_114.c0000644000076400007640000000332011302567127016266 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{GROUP,4}{SYSTEM_CHASSIS,1}{PHYSICAL_SLOT,3}{SBC_BLADE,3}{ADD_IN_CARD,8}"; char *epp_str = "*{SYSTEM_CHASSIS,.}*{SBC_BLADE,.}*"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_TRUE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-2.14.1/utils/t/epath/epath_utils_test.c0000644000076400007640000002065011302567127016430 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * Steve Sherman */ #include #include #include #include #include int main (int argc, char **argv) { gchar *test_string, *expected_string; oh_big_textbuffer bigbuf; SaErrorT err, expected_err; SaHpiEntityPathT ep; /************************************************ * oh_encode_entitypath - Null parameter testcase ************************************************/ expected_err = SA_ERR_HPI_INVALID_PARAMS; err = oh_encode_entitypath(0, &ep); if (err != expected_err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } /******************************************** * oh_encode_entitypath - All blanks testcase ********************************************/ test_string = " "; expected_err = SA_ERR_HPI_INVALID_DATA; err = oh_encode_entitypath(test_string, &ep); if (err != expected_err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } /******************************************** * oh_encode_entitypath - Begin junk testcase ********************************************/ test_string = "junk{SYSTEM_CHASSIS,11}{SUBBOARD_CARRIER_BLADE,9}"; expected_err = SA_ERR_HPI_INVALID_DATA; err = oh_encode_entitypath(test_string, &ep); if (err != expected_err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } /********************************************* * oh_encode_entitypath - Middle junk testcase *********************************************/ test_string = "{SYSTEM_CHASSIS,11}junk{SUBBOARD_CARRIER_BLADE,9}"; expected_err = SA_ERR_HPI_INVALID_DATA; err = oh_encode_entitypath(test_string, &ep); if (err != expected_err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } /****************************************** * oh_encode_entitypath - End junk testcase ******************************************/ test_string = "{SYSTEM_CHASSIS,11}{SUBBOARD_CARRIER_BLADE,9}junk"; expected_err = SA_ERR_HPI_INVALID_DATA; err = oh_encode_entitypath(test_string, &ep); if (err != expected_err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } /****************************************** * oh_encode_entitypath - No comma testcase ******************************************/ test_string = "{SYSTEM_CHASSIS.11}{SUBBOARD_CARRIER_BLADE,9}"; expected_err = SA_ERR_HPI_INVALID_DATA; err = oh_encode_entitypath(test_string, &ep); if (err != expected_err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } /********************************************** * oh_encode_entitypath - Bad HPI type testcase **********************************************/ test_string = "{SYSTEM_CHASSIS,11}{WRONG_HPI_TYPE,9}"; expected_err = SA_ERR_HPI_INVALID_DATA; err = oh_encode_entitypath(test_string, &ep); if (err != expected_err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } /************************************************** * oh_encode_entitypath - Bad HPI instance testcase **************************************************/ test_string = "{SYSTEM_CHASSIS,1abc1}{SYSTEM_SUB_CHASSIS,9}"; expected_err = SA_ERR_HPI_INVALID_DATA; err = oh_encode_entitypath(test_string, &ep); if (err != expected_err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } /************************************************** * oh_encode_entitypath - Extra parameters testcase **************************************************/ test_string = "{SYSTEM_CHASSIS,2}{SYSTEM_SUB_CHASSIS,9,2}"; expected_err = SA_ERR_HPI_INVALID_DATA; err = oh_encode_entitypath(test_string, &ep); if (err != expected_err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } /***************************************** * oh_encode_entitypath - Nominal testcase *****************************************/ test_string = "{SYSTEM_CHASSIS,1}{SUB_CHASSIS,2}"; err = oh_encode_entitypath(test_string, &ep); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } oh_init_bigtext(&bigbuf); err = oh_decode_entitypath(&ep, &bigbuf); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } if (strcmp((char *)bigbuf.Data, test_string)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received Entity Path=%s.\n", bigbuf.Data); return -1; } /**************************************** * oh_encode_entitypath - Blanks testcase ****************************************/ test_string = " {SYSTEM_CHASSIS, 1111} { CHASSIS_BACK_PANEL_BOARD ,32 } "; expected_string = "{SYSTEM_CHASSIS,1111}{CHASSIS_BACK_PANEL_BOARD,32}"; err = oh_encode_entitypath(test_string, &ep); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } oh_init_bigtext(&bigbuf); err = oh_decode_entitypath(&ep, &bigbuf); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } if (strcmp((char *)bigbuf.Data, expected_string)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received Entity Path=%s.\n", bigbuf.Data); return -1; } /******************************** * oh_decode_entitypath testcases ********************************/ { SaHpiEntityPathT test_ep; oh_init_ep(&test_ep); test_ep.Entry[0].EntityType = SAHPI_ENT_SUB_CHASSIS; test_ep.Entry[0].EntityLocation = 109; test_ep.Entry[1].EntityType = SAHPI_ENT_SYSTEM_CHASSIS; test_ep.Entry[1].EntityLocation = 112; /*************************************** * oh_decode_entitypath - Null testcase ***************************************/ expected_err = SA_ERR_HPI_INVALID_PARAMS; err = oh_decode_entitypath(&test_ep, 0); if (err != expected_err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } /*********************************************** * oh_decode_entitypath - Bad instance testcase ***********************************************/ test_ep.Entry[0].EntityLocation = 1234567; expected_err = SA_ERR_HPI_INVALID_DATA; err = oh_decode_entitypath(&test_ep, &bigbuf); if (err != expected_err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } test_ep.Entry[0].EntityLocation = 109; /****************************************** * oh_decode_entitypath - Nominal testcase ******************************************/ expected_string = "{SYSTEM_CHASSIS,112}{SUB_CHASSIS,109}"; oh_init_bigtext(&bigbuf); oh_append_bigtext(&bigbuf, test_string); err = oh_decode_entitypath(&test_ep, &bigbuf); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } if (strcmp((char *)bigbuf.Data, expected_string)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received Entity Path=%s.\n", bigbuf.Data); return -1; } } return 0; } openhpi-2.14.1/utils/t/epath/epath_pattern_414.c0000644000076400007640000000324711302567127016301 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{GROUP,7}{REMOTE,2}{SUBRACK,4}"; char *epp_str = "*{SYSTEM_CHASSIS,.}*{SBC_BLADE,.}*"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_FALSE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-2.14.1/utils/t/epath/epath_pattern_113.c0000644000076400007640000000332011302567127016265 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{GROUP,4}{SYSTEM_CHASSIS,1}{PHYSICAL_SLOT,3}{SBC_BLADE,3}{ADD_IN_CARD,8}"; char *epp_str = "*{SYSTEM_CHASSIS,.}*{SBC_BLADE,.}"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_FALSE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-2.14.1/utils/t/epath/epath_pattern_123.c0000644000076400007640000000327111302567127016273 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{GROUP,4}{SYSTEM_CHASSIS,1}{PHYSICAL_SLOT,3}{SBC_BLADE,3}{ADD_IN_CARD,8}"; char *epp_str = "*{.,.}{.,.}"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_TRUE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-2.14.1/utils/t/epath/epath_conv_038.c0000644000076400007640000000511411302567127015566 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. */ /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_tests.pl. * Do not change this file manually. Update script instead *******************************************************************/ #include #include #include /** * main: * epathstr -> epath test * * Test if an entity path string is converted properly into an entity path. **/ int main(int argc, char **argv) { char *test_string = "{SUB_CHASSIS,18}{SYS_EXPANSION_BOARD,54}"; oh_big_textbuffer bigbuf; SaErrorT err; SaHpiEntityPathT ep; err = oh_encode_entitypath(test_string, &ep); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } if (ep.Entry[0].EntityType != SAHPI_ENT_SYS_EXPANSION_BOARD) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[0].EntityType, SAHPI_ENT_SYS_EXPANSION_BOARD); return -1; } if (ep.Entry[0].EntityLocation != 54) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[0].EntityLocation, 54); return -1; } if (ep.Entry[1].EntityType != SAHPI_ENT_SUB_CHASSIS) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[1].EntityType, SAHPI_ENT_SUB_CHASSIS); return -1; } if (ep.Entry[1].EntityLocation != 18) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[1].EntityLocation, 18); return -1; } oh_init_bigtext(&bigbuf); err = oh_decode_entitypath(&ep, &bigbuf); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } if (strcmp((char *)bigbuf.Data, test_string)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received Entity Path=%s.\n", bigbuf.Data); return -1; } return 0; } openhpi-2.14.1/utils/t/epath/epath_conv_044.c0000644000076400007640000000510611302567127015564 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. */ /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_tests.pl. * Do not change this file manually. Update script instead *******************************************************************/ #include #include #include /** * main: * epathstr -> epath test * * Test if an entity path string is converted properly into an entity path. **/ int main(int argc, char **argv) { char *test_string = "{SUBBOARD_CARRIER_BLADE,91}{SWITCH,44}"; oh_big_textbuffer bigbuf; SaErrorT err; SaHpiEntityPathT ep; err = oh_encode_entitypath(test_string, &ep); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } if (ep.Entry[0].EntityType != SAHPI_ENT_SWITCH) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[0].EntityType, SAHPI_ENT_SWITCH); return -1; } if (ep.Entry[0].EntityLocation != 44) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[0].EntityLocation, 44); return -1; } if (ep.Entry[1].EntityType != SAHPI_ENT_SUBBOARD_CARRIER_BLADE) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[1].EntityType, SAHPI_ENT_SUBBOARD_CARRIER_BLADE); return -1; } if (ep.Entry[1].EntityLocation != 91) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[1].EntityLocation, 91); return -1; } oh_init_bigtext(&bigbuf); err = oh_decode_entitypath(&ep, &bigbuf); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } if (strcmp((char *)bigbuf.Data, test_string)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received Entity Path=%s.\n", bigbuf.Data); return -1; } return 0; } openhpi-2.14.1/utils/t/epath/epath_pattern_282.c0000644000076400007640000000322211302567127016275 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{PHYSICAL_SLOT,4}{SBC_BLADE,3}"; char *epp_str = "{SBC_BLADE,3}"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_FALSE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-2.14.1/utils/t/epath/epath_pattern_146.c0000644000076400007640000000321511302567127016276 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{GROUP,4}{SYSTEM_CHASSIS,1}"; char *epp_str = "{.,.}*{.,.}*"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_TRUE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-2.14.1/utils/t/epath/epath_pattern_427.c0000644000076400007640000000325511302567127016304 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{GROUP,7}{REMOTE,2}{SUBRACK,4}{BIOS,8}"; char *epp_str = "{SYSTEM_CHASSIS,1}{SBC_BLADE,.}*"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_FALSE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-2.14.1/utils/t/epath/epath_conv_037.c0000644000076400007640000000510311302567127015563 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. */ /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_tests.pl. * Do not change this file manually. Update script instead *******************************************************************/ #include #include #include /** * main: * epathstr -> epath test * * Test if an entity path string is converted properly into an entity path. **/ int main(int argc, char **argv) { char *test_string = "{MEMORY_MODULE,76}{DISK_DRIVE_BAY,27}"; oh_big_textbuffer bigbuf; SaErrorT err; SaHpiEntityPathT ep; err = oh_encode_entitypath(test_string, &ep); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } if (ep.Entry[0].EntityType != SAHPI_ENT_DISK_DRIVE_BAY) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[0].EntityType, SAHPI_ENT_DISK_DRIVE_BAY); return -1; } if (ep.Entry[0].EntityLocation != 27) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[0].EntityLocation, 27); return -1; } if (ep.Entry[1].EntityType != SAHPI_ENT_MEMORY_MODULE) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[1].EntityType, SAHPI_ENT_MEMORY_MODULE); return -1; } if (ep.Entry[1].EntityLocation != 76) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[1].EntityLocation, 76); return -1; } oh_init_bigtext(&bigbuf); err = oh_decode_entitypath(&ep, &bigbuf); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } if (strcmp((char *)bigbuf.Data, test_string)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received Entity Path=%s.\n", bigbuf.Data); return -1; } return 0; } openhpi-2.14.1/utils/t/epath/epath_pattern_175.c0000644000076400007640000000327511302567127016306 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{GROUP,4}{SYSTEM_CHASSIS,1}{SBC_BLADE,3}{ADD_IN_CARD,8}"; char *epp_str = "{SYSTEM_CHASSIS,1}{SBC_BLADE,3}"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_FALSE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-2.14.1/utils/t/epath/epath_pattern_200.c0000644000076400007640000000327711302567127016275 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{GROUP,4}{SYSTEM_CHASSIS,1}{PHYSICAL_SLOT,3}{SBC_BLADE,3}"; char *epp_str = "{SYSTEM_CHASSIS,1}{SBC_BLADE,3}"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_FALSE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-2.14.1/utils/t/epath/epath_pattern_013.c0000644000076400007640000000324611302567127016273 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{SYSTEM_CHASSIS,1}{SBC_BLADE,3}"; char *epp_str = "*{SYSTEM_CHASSIS,.}*{SBC_BLADE,.}"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_TRUE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-2.14.1/utils/t/epath/epath_pattern_002.c0000644000076400007640000000324511302567127016270 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{SYSTEM_CHASSIS,1}{SBC_BLADE,3}"; char *epp_str = "{SYSTEM_CHASSIS,1}{SBC_BLADE,.}*"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_TRUE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-2.14.1/utils/t/epath/epath_conv_049.c0000644000076400007640000000513311302567127015571 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. */ /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_tests.pl. * Do not change this file manually. Update script instead *******************************************************************/ #include #include #include /** * main: * epathstr -> epath test * * Test if an entity path string is converted properly into an entity path. **/ int main(int argc, char **argv) { char *test_string = "{OTHER_CHASSIS_BOARD,50}{BACK_PANEL_BOARD,80}"; oh_big_textbuffer bigbuf; SaErrorT err; SaHpiEntityPathT ep; err = oh_encode_entitypath(test_string, &ep); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } if (ep.Entry[0].EntityType != SAHPI_ENT_BACK_PANEL_BOARD) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[0].EntityType, SAHPI_ENT_BACK_PANEL_BOARD); return -1; } if (ep.Entry[0].EntityLocation != 80) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[0].EntityLocation, 80); return -1; } if (ep.Entry[1].EntityType != SAHPI_ENT_OTHER_CHASSIS_BOARD) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[1].EntityType, SAHPI_ENT_OTHER_CHASSIS_BOARD); return -1; } if (ep.Entry[1].EntityLocation != 50) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[1].EntityLocation, 50); return -1; } oh_init_bigtext(&bigbuf); err = oh_decode_entitypath(&ep, &bigbuf); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } if (strcmp((char *)bigbuf.Data, test_string)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received Entity Path=%s.\n", bigbuf.Data); return -1; } return 0; } openhpi-2.14.1/utils/t/epath/epath_pattern_041.c0000644000076400007640000000317511302567127016275 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{SYSTEM_CHASSIS,1}"; char *epp_str = "{.,.}"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_TRUE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-2.14.1/utils/t/epath/epath_pattern_235.c0000644000076400007640000000320211302567127016271 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{SBC_BLADE,3}"; char *epp_str = "*{SBC_BLADE,.}*"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_TRUE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-2.14.1/utils/t/epath/epath_pattern_312.c0000644000076400007640000000326411302567127016275 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{PHYSICAL_SLOT,4}{SBC_BLADE,3}{ADD_IN_CARD,8}"; char *epp_str = "*{SYSTEM_CHASSIS,.}{SBC_BLADE,.}"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_FALSE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-2.14.1/utils/t/epath/epath_pattern_050.c0000644000076400007640000000326411302567127016274 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{SYSTEM_CHASSIS,1}{SBC_BLADE,3}{ADD_IN_CARD,8}"; char *epp_str = "{SYSTEM_CHASSIS,1}{SBC_BLADE,3}"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_FALSE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-2.14.1/utils/t/epath/epath_pattern_424.c0000644000076400007640000000320511302567127016274 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{GROUP,7}{REMOTE,2}{SUBRACK,4}"; char *epp_str = "*"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_TRUE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-2.14.1/utils/t/epath/set_ep_loc_007.c0000755000076400007640000000463211302567127015557 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * Chris Chia * Steve Sherman */ #include #include #include #include /* oh_set_ep_location: Entity path has 4 elements, victim element * in middle. Only victim element's instance number changed */ int main(int argc, char **argv) { SaErrorT err; SaHpiEntityPathT ep = {{{SAHPI_ENT_INTERCONNECT, 1515}, {SAHPI_ENT_PHYSICAL_SLOT, 2525}, {SAHPI_ENT_SUBRACK, 3535}, {SAHPI_ENT_IO_SUBBOARD, 4545}, {0}}}; SaHpiEntityLocationT x = 98765; err = oh_set_ep_location(&ep, SAHPI_ENT_PHYSICAL_SLOT, x); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } if (ep.Entry[1].EntityLocation != x) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); return -1; } if (ep.Entry[1].EntityType != SAHPI_ENT_PHYSICAL_SLOT) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); return -1; } if (ep.Entry[0].EntityLocation != 1515) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); return -1; } if (ep.Entry[0].EntityType != SAHPI_ENT_INTERCONNECT) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); return -1; } if (ep.Entry[2].EntityLocation != 3535) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); return -1; } if (ep.Entry[2].EntityType != SAHPI_ENT_SUBRACK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); return -1; } if (ep.Entry[3].EntityLocation != 4545) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); return -1; } if (ep.Entry[3].EntityType != SAHPI_ENT_IO_SUBBOARD) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); return -1; } return 0; } openhpi-2.14.1/utils/t/epath/ep_concat_013.c0000644000076400007640000000225611302567127015370 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * Chris Chia * Steve Sherman */ #include #include #include #include /* oh_concat_ep: concatenate two zero element entity path */ int main(int argc, char **argv) { SaErrorT err; SaHpiEntityPathT ep1 = {{{SAHPI_ENT_ROOT,0}}}; SaHpiEntityPathT ep2 = {{{SAHPI_ENT_ROOT,0}}}; SaHpiEntityPathT ep3 = {{{SAHPI_ENT_ROOT,0}}}; err = oh_concat_ep(&ep1, &ep2); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } if (!oh_cmp_ep(&ep1, &ep3)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); return -1; } return 0; } openhpi-2.14.1/utils/t/epath/epath_pattern_018.c0000644000076400007640000000321311302567127016272 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{SYSTEM_CHASSIS,1}{SBC_BLADE,3}"; char *epp_str = "{.,.}*"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_TRUE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-2.14.1/utils/t/epath/epath_pattern_229.c0000644000076400007640000000321411302567127016277 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{SBC_BLADE,3}"; char *epp_str = "{SYSTEM_CHASSIS,1}{.,.}*"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_FALSE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-2.14.1/utils/t/epath/epath_numeric_005.c0000644000076400007640000000262411302567127016260 0ustar /* -*- linux-c -*- * * (C) Copyright FORCE Computers 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * Thomas Kanngieser */ #include #include #include #include #include int main (int argc, char **argv) { gchar test_string[512]; oh_big_textbuffer bigbuf; SaErrorT err; SaHpiEntityPathT ep; snprintf(test_string, 512, "{%d,13}", SAHPI_ENT_ROOT_VALUE*2); err = oh_encode_entitypath(test_string, &ep); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } oh_init_bigtext(&bigbuf); err = oh_decode_entitypath(&ep, &bigbuf); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } if (strcmp((char *)bigbuf.Data, test_string)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received Entity Path=%s.\n", bigbuf.Data); return -1; } return 0; } openhpi-2.14.1/utils/t/epath/epath_pattern_054.c0000644000076400007640000000325411302567127016277 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{SYSTEM_CHASSIS,1}{SBC_BLADE,3}{ADD_IN_CARD,8}"; char *epp_str = "{SYSTEM_CHASSIS,1}{.,.}*"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_TRUE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-2.14.1/utils/t/epath/epath_pattern_145.c0000644000076400007640000000321511302567127016275 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{GROUP,4}{SYSTEM_CHASSIS,1}"; char *epp_str = "*{.,.}*{.,.}"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_TRUE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-2.14.1/utils/t/epath/epath_pattern_326.c0000644000076400007640000000326611302567127016304 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{SYSTEM_CHASSIS,1}{PHYSICAL_SLOT,4}{SBC_BLADE,3}"; char *epp_str = "{SYSTEM_CHASSIS,1}{SBC_BLADE,.}"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_FALSE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-2.14.1/utils/t/epath/epath_pattern_213.c0000644000076400007640000000330011302567127016264 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{GROUP,4}{SYSTEM_CHASSIS,1}{PHYSICAL_SLOT,3}{SBC_BLADE,3}"; char *epp_str = "*{SYSTEM_CHASSIS,.}*{SBC_BLADE,.}"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_TRUE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-2.14.1/utils/t/epath/ep_cmp_000.c0000644000076400007640000000137611302567127014676 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * Steve Sherman */ #include #include #include #include /* oh_cmp_ep: null pointer testcase. */ int main(int argc, char **argv) { if (oh_cmp_ep(NULL, NULL)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); return -1; } return 0; } openhpi-2.14.1/utils/t/epath/epath_pattern_010.c0000644000076400007640000000322411302567127016264 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{SYSTEM_CHASSIS,1}{SBC_BLADE,3}"; char *epp_str = "*{SBC_BLADE,.}*"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_TRUE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-2.14.1/utils/t/epath/set_ep_loc_011.c0000755000076400007640000000403611302567127015550 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * Chris Chia * Steve Sherman */ #include #include #include #include /* oh_set_ep_location: Full entity path, victim element at end. * Only end element's instance number changed */ int main(int argc, char **argv) { unsigned int y = 77; unsigned int z = 29; unsigned int i = 0; SaErrorT err; SaHpiEntityPathT ep; SaHpiEntityTypeT w = SAHPI_ENT_POWER_DISTRIBUTION_UNIT; SaHpiEntityLocationT x = 87654; for (i=0; i #include #include /** * main: * epathstr -> epath test * * Test if an entity path string is converted properly into an entity path. **/ int main(int argc, char **argv) { char *test_string = "{SWITCH_BLADE,1}{IO_BLADE,42}"; oh_big_textbuffer bigbuf; SaErrorT err; SaHpiEntityPathT ep; err = oh_encode_entitypath(test_string, &ep); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } if (ep.Entry[0].EntityType != SAHPI_ENT_IO_BLADE) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[0].EntityType, SAHPI_ENT_IO_BLADE); return -1; } if (ep.Entry[0].EntityLocation != 42) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[0].EntityLocation, 42); return -1; } if (ep.Entry[1].EntityType != SAHPI_ENT_SWITCH_BLADE) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[1].EntityType, SAHPI_ENT_SWITCH_BLADE); return -1; } if (ep.Entry[1].EntityLocation != 1) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[1].EntityLocation, 1); return -1; } oh_init_bigtext(&bigbuf); err = oh_decode_entitypath(&ep, &bigbuf); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } if (strcmp((char *)bigbuf.Data, test_string)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received Entity Path=%s.\n", bigbuf.Data); return -1; } return 0; } openhpi-2.14.1/utils/t/epath/epath_pattern_385.c0000644000076400007640000000321211302567127016300 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{GROUP,2}{SUBRACK,5}"; char *epp_str = "*{SBC_BLADE,.}*"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_FALSE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-2.14.1/utils/t/epath/epath_pattern_096.c0000644000076400007640000000326111302567127016303 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{SYSTEM_CHASSIS,1}{PHYSICAL_SLOT,3}{SBC_BLADE,3}{ADD_IN_CARD,8}"; char *epp_str = "{.,.}*{.,.}*"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_TRUE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-2.14.1/utils/t/epath/epath_pattern_029.c0000644000076400007640000000322111302567127016273 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{SYSTEM_CHASSIS,1}"; char *epp_str = "{SYSTEM_CHASSIS,1}{.,.}*"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_FALSE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-2.14.1/utils/t/epath/epath_pattern_022.c0000644000076400007640000000322011302567127016263 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{SYSTEM_CHASSIS,1}{SBC_BLADE,3}"; char *epp_str = "{.,.}{.,.}*"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_TRUE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-2.14.1/utils/t/epath/epath_pattern_252.c0000644000076400007640000000324311302567127016275 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{SBC_BLADE,3}{ADD_IN_CARD,8}"; char *epp_str = "{SYSTEM_CHASSIS,1}{SBC_BLADE,.}*"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_FALSE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-2.14.1/utils/t/epath/epath_pattern_069.c0000644000076400007640000000323311302567127016302 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{SYSTEM_CHASSIS,1}{SBC_BLADE,3}{ADD_IN_CARD,8}"; char *epp_str = "*{.,.}*"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_TRUE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-2.14.1/utils/t/epath/epath_conv_032.c0000644000076400007640000000507511302567127015566 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. */ /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_tests.pl. * Do not change this file manually. Update script instead *******************************************************************/ #include #include #include /** * main: * epathstr -> epath test * * Test if an entity path string is converted properly into an entity path. **/ int main(int argc, char **argv) { char *test_string = "{UNKNOWN,38}{POWER_SYSTEM_BOARD,15}"; oh_big_textbuffer bigbuf; SaErrorT err; SaHpiEntityPathT ep; err = oh_encode_entitypath(test_string, &ep); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } if (ep.Entry[0].EntityType != SAHPI_ENT_POWER_SYSTEM_BOARD) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[0].EntityType, SAHPI_ENT_POWER_SYSTEM_BOARD); return -1; } if (ep.Entry[0].EntityLocation != 15) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[0].EntityLocation, 15); return -1; } if (ep.Entry[1].EntityType != SAHPI_ENT_UNKNOWN) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[1].EntityType, SAHPI_ENT_UNKNOWN); return -1; } if (ep.Entry[1].EntityLocation != 38) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[1].EntityLocation, 38); return -1; } oh_init_bigtext(&bigbuf); err = oh_decode_entitypath(&ep, &bigbuf); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } if (strcmp((char *)bigbuf.Data, test_string)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received Entity Path=%s.\n", bigbuf.Data); return -1; } return 0; } openhpi-2.14.1/utils/t/epath/epath_pattern_197.c0000644000076400007640000000325011302567127016303 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{GROUP,4}{SYSTEM_CHASSIS,1}{SBC_BLADE,3}{ADD_IN_CARD,8}"; char *epp_str = "{.,.}{.,.}*"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_TRUE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-2.14.1/utils/t/epath/ep_cmp_005.c0000644000076400007640000000224411302567127014676 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * Chris Chia * Steve Sherman */ #include #include #include #include /* oh_cmp_ep: full element entity path testcase. */ int main(int argc, char **argv) { int i; SaHpiEntityPathT ep1; SaHpiEntityPathT ep2; for (i=0; i */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{GROUP,4}{SYSTEM_CHASSIS,1}{PHYSICAL_SLOT,3}{SBC_BLADE,3}"; char *epp_str = "*{.,.}*"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_TRUE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-2.14.1/utils/t/epath/epath_pattern_399.c0000644000076400007640000000317311302567127016313 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{GROUP,2}{SUBRACK,5}"; char *epp_str = "*"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_TRUE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-2.14.1/utils/t/epath/epath_conv_088.c0000644000076400007640000000514711302567127015601 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. */ /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_tests.pl. * Do not change this file manually. Update script instead *******************************************************************/ #include #include #include /** * main: * epathstr -> epath test * * Test if an entity path string is converted properly into an entity path. **/ int main(int argc, char **argv) { char *test_string = "{POWER_DISTRIBUTION_UNIT,45}{CHASSIS_SPECIFIC,26}"; oh_big_textbuffer bigbuf; SaErrorT err; SaHpiEntityPathT ep; err = oh_encode_entitypath(test_string, &ep); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } if (ep.Entry[0].EntityType != SAHPI_ENT_CHASSIS_SPECIFIC) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[0].EntityType, SAHPI_ENT_CHASSIS_SPECIFIC); return -1; } if (ep.Entry[0].EntityLocation != 26) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[0].EntityLocation, 26); return -1; } if (ep.Entry[1].EntityType != SAHPI_ENT_POWER_DISTRIBUTION_UNIT) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[1].EntityType, SAHPI_ENT_POWER_DISTRIBUTION_UNIT); return -1; } if (ep.Entry[1].EntityLocation != 45) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[1].EntityLocation, 45); return -1; } oh_init_bigtext(&bigbuf); err = oh_decode_entitypath(&ep, &bigbuf); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } if (strcmp((char *)bigbuf.Data, test_string)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received Entity Path=%s.\n", bigbuf.Data); return -1; } return 0; } openhpi-2.14.1/utils/t/epath/epath_pattern_441.c0000644000076400007640000000322211302567127016272 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{GROUP,7}{REMOTE,2}{SUBRACK,4}{BIOS,8}"; char *epp_str = "{.,.}"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_FALSE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-2.14.1/utils/t/epath/epath_pattern_236.c0000644000076400007640000000322511302567127016277 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{SBC_BLADE,3}"; char *epp_str = "*{SYSTEM_CHASSIS,1}{SBC_BLADE,.}*"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_FALSE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-2.14.1/utils/t/epath/epath_pattern_026.c0000644000076400007640000000323011302567127016270 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{SYSTEM_CHASSIS,1}"; char *epp_str = "{SYSTEM_CHASSIS,1}{SBC_BLADE,.}"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_FALSE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-2.14.1/utils/t/epath/epath_pattern_155.c0000644000076400007640000000324211302567127016276 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{GROUP,4}{SYSTEM_CHASSIS,1}{SBC_BLADE,3}"; char *epp_str = "{SYSTEM_CHASSIS,1}*"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_FALSE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-2.14.1/utils/t/epath/epath_pattern_317.c0000644000076400007640000000323111302567127016274 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{PHYSICAL_SLOT,4}{SBC_BLADE,3}{ADD_IN_CARD,8}"; char *epp_str = "*{.,.}"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_TRUE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-2.14.1/utils/t/epath/epath_conv_020.c0000644000076400007640000000510311302567127015553 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. */ /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_tests.pl. * Do not change this file manually. Update script instead *******************************************************************/ #include #include #include /** * main: * epathstr -> epath test * * Test if an entity path string is converted properly into an entity path. **/ int main(int argc, char **argv) { char *test_string = "{ALARM_MANAGER,25}{DISK_DRIVE_BAY,52}"; oh_big_textbuffer bigbuf; SaErrorT err; SaHpiEntityPathT ep; err = oh_encode_entitypath(test_string, &ep); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } if (ep.Entry[0].EntityType != SAHPI_ENT_DISK_DRIVE_BAY) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[0].EntityType, SAHPI_ENT_DISK_DRIVE_BAY); return -1; } if (ep.Entry[0].EntityLocation != 52) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[0].EntityLocation, 52); return -1; } if (ep.Entry[1].EntityType != SAHPI_ENT_ALARM_MANAGER) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[1].EntityType, SAHPI_ENT_ALARM_MANAGER); return -1; } if (ep.Entry[1].EntityLocation != 25) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[1].EntityLocation, 25); return -1; } oh_init_bigtext(&bigbuf); err = oh_decode_entitypath(&ep, &bigbuf); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } if (strcmp((char *)bigbuf.Data, test_string)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received Entity Path=%s.\n", bigbuf.Data); return -1; } return 0; } openhpi-2.14.1/utils/t/epath/epath_pattern_284.c0000644000076400007640000000322211302567127016277 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{PHYSICAL_SLOT,4}{SBC_BLADE,3}"; char *epp_str = "*{SBC_BLADE,.}"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_TRUE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-2.14.1/utils/t/epath/epath_pattern_288.c0000644000076400007640000000324611302567127016311 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{PHYSICAL_SLOT,4}{SBC_BLADE,3}"; char *epp_str = "*{SYSTEM_CHASSIS,.}*{SBC_BLADE,.}"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_FALSE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-2.14.1/utils/t/epath/epath_pattern_085.c0000644000076400007640000000326411302567127016304 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{SYSTEM_CHASSIS,1}{PHYSICAL_SLOT,3}{SBC_BLADE,3}{ADD_IN_CARD,8}"; char *epp_str = "*{SBC_BLADE,.}*"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_TRUE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-2.14.1/utils/t/epath/epath_conv_063.c0000644000076400007640000000510311302567127015562 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. */ /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_tests.pl. * Do not change this file manually. Update script instead *******************************************************************/ #include #include #include /** * main: * epathstr -> epath test * * Test if an entity path string is converted properly into an entity path. **/ int main(int argc, char **argv) { char *test_string = "{CHASSIS_SPECIFIC,53}{SUB_CHASSIS,82}"; oh_big_textbuffer bigbuf; SaErrorT err; SaHpiEntityPathT ep; err = oh_encode_entitypath(test_string, &ep); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } if (ep.Entry[0].EntityType != SAHPI_ENT_SUB_CHASSIS) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[0].EntityType, SAHPI_ENT_SUB_CHASSIS); return -1; } if (ep.Entry[0].EntityLocation != 82) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[0].EntityLocation, 82); return -1; } if (ep.Entry[1].EntityType != SAHPI_ENT_CHASSIS_SPECIFIC) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[1].EntityType, SAHPI_ENT_CHASSIS_SPECIFIC); return -1; } if (ep.Entry[1].EntityLocation != 53) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[1].EntityLocation, 53); return -1; } oh_init_bigtext(&bigbuf); err = oh_decode_entitypath(&ep, &bigbuf); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } if (strcmp((char *)bigbuf.Data, test_string)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received Entity Path=%s.\n", bigbuf.Data); return -1; } return 0; } openhpi-2.14.1/utils/t/epath/epath_pattern_084.c0000644000076400007640000000326411302567127016303 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{SYSTEM_CHASSIS,1}{PHYSICAL_SLOT,3}{SBC_BLADE,3}{ADD_IN_CARD,8}"; char *epp_str = "*{SBC_BLADE,.}"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_FALSE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-2.14.1/utils/t/epath/epath_pattern_193.c0000644000076400007640000000324311302567127016301 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{GROUP,4}{SYSTEM_CHASSIS,1}{SBC_BLADE,3}{ADD_IN_CARD,8}"; char *epp_str = "{.,.}*"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_TRUE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-2.14.1/utils/t/epath/epath_pattern_415.c0000644000076400007640000000322711302567127016300 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{GROUP,7}{REMOTE,2}{SUBRACK,4}"; char *epp_str = "{SYSTEM_CHASSIS,.}"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_FALSE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-2.14.1/utils/t/epath/epath_pattern_039.c0000644000076400007640000000323311302567127016277 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{SYSTEM_CHASSIS,1}"; char *epp_str = "*{SYSTEM_CHASSIS,.}*{SBC_BLADE,.}*"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_FALSE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-2.14.1/utils/t/epath/epath_pattern_061.c0000644000076400007640000000326511302567127016277 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{SYSTEM_CHASSIS,1}{SBC_BLADE,3}{ADD_IN_CARD,8}"; char *epp_str = "*{SYSTEM_CHASSIS,1}{SBC_BLADE,.}*"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_TRUE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-2.14.1/utils/t/epath/epath_pattern_214.c0000644000076400007640000000330111302567127016266 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{GROUP,4}{SYSTEM_CHASSIS,1}{PHYSICAL_SLOT,3}{SBC_BLADE,3}"; char *epp_str = "*{SYSTEM_CHASSIS,.}*{SBC_BLADE,.}*"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_TRUE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-2.14.1/utils/t/epath/epath_conv_101.c0000644000076400007640000000371611302567127015563 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Sean Dague */ #include #include #include /** * main: * epathstr -> epath test * * Test if an entity path string is converted properly into an entity path. **/ int main(int argc, char **argv) { char *test_string = "{OEM_SYSINT_SPECIFIC,6}{BOARD_SET_SPECIFIC,30}"; SaErrorT err; SaHpiEntityPathT ep; err = oh_encode_entitypath(test_string, &ep); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } if (ep.Entry[0].EntityType != SAHPI_ENT_BOARD_SET_SPECIFIC) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[0].EntityType, SAHPI_ENT_BOARD_SET_SPECIFIC); return -1; } if (ep.Entry[0].EntityLocation != 30) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[0].EntityLocation, 30); return -1; } if (ep.Entry[1].EntityType != SAHPI_ENT_OEM_SYSINT_SPECIFIC) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[0].EntityType, SAHPI_ENT_OEM_SYSINT_SPECIFIC); return -1; } if (ep.Entry[1].EntityLocation != 6) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[0].EntityLocation, 6); return -1; } return 0; } openhpi-2.14.1/utils/t/epath/epath_pattern_406.c0000644000076400007640000000322711302567127016300 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{GROUP,7}{REMOTE,2}{SUBRACK,4}"; char *epp_str = "{SYSTEM_CHASSIS,1}"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_FALSE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-2.14.1/utils/t/epath/epath_pattern_188.c0000644000076400007640000000327711302567127016314 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{GROUP,4}{SYSTEM_CHASSIS,1}{SBC_BLADE,3}{ADD_IN_CARD,8}"; char *epp_str = "*{SYSTEM_CHASSIS,.}*{SBC_BLADE,.}"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_FALSE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-2.14.1/utils/t/epath/epath_conv_095.c0000644000076400007640000000510011302567127015564 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. */ /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_tests.pl. * Do not change this file manually. Update script instead *******************************************************************/ #include #include #include /** * main: * epathstr -> epath test * * Test if an entity path string is converted properly into an entity path. **/ int main(int argc, char **argv) { char *test_string = "{DISK_DRIVE,81}{BACK_PANEL_BOARD,87}"; oh_big_textbuffer bigbuf; SaErrorT err; SaHpiEntityPathT ep; err = oh_encode_entitypath(test_string, &ep); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } if (ep.Entry[0].EntityType != SAHPI_ENT_BACK_PANEL_BOARD) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[0].EntityType, SAHPI_ENT_BACK_PANEL_BOARD); return -1; } if (ep.Entry[0].EntityLocation != 87) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[0].EntityLocation, 87); return -1; } if (ep.Entry[1].EntityType != SAHPI_ENT_DISK_DRIVE) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[1].EntityType, SAHPI_ENT_DISK_DRIVE); return -1; } if (ep.Entry[1].EntityLocation != 81) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[1].EntityLocation, 81); return -1; } oh_init_bigtext(&bigbuf); err = oh_decode_entitypath(&ep, &bigbuf); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } if (strcmp((char *)bigbuf.Data, test_string)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received Entity Path=%s.\n", bigbuf.Data); return -1; } return 0; } openhpi-2.14.1/utils/t/epath/epath_pattern_106.c0000644000076400007640000000330111302567127016266 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{GROUP,4}{SYSTEM_CHASSIS,1}{PHYSICAL_SLOT,3}{SBC_BLADE,3}{ADD_IN_CARD,8}"; char *epp_str = "{SYSTEM_CHASSIS,1}"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_FALSE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-2.14.1/utils/t/epath/epath_pattern_223.c0000644000076400007640000000325211302567127016273 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{GROUP,4}{SYSTEM_CHASSIS,1}{PHYSICAL_SLOT,3}{SBC_BLADE,3}"; char *epp_str = "*{.,.}{.,.}"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_TRUE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-2.14.1/utils/t/epath/epath_pattern_335.c0000644000076400007640000000324511302567127016301 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{SYSTEM_CHASSIS,1}{PHYSICAL_SLOT,4}{SBC_BLADE,3}"; char *epp_str = "*{SBC_BLADE,.}*"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_TRUE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-2.14.1/utils/t/epath/set_ep_loc_004.c0000755000076400007640000000370011302567127015547 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * Chris Chia * Steve Sherman */ #include #include #include #include /* oh_set_ep_location: Entity path that has 3 elements testcase */ int main(int argc, char **argv) { SaErrorT err; SaHpiEntityPathT ep = {{{SAHPI_ENT_GROUP, 11}, {SAHPI_ENT_REMOTE, 12}, {SAHPI_ENT_FAN, 13}, {0}}}; SaHpiEntityLocationT x = 99999; err = oh_set_ep_location(&ep, SAHPI_ENT_FAN, x); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } if (ep.Entry[2].EntityLocation != x) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); return -1; } if (ep.Entry[2].EntityType != SAHPI_ENT_FAN) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); return -1; } if (ep.Entry[0].EntityLocation != 11) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); return -1; } if (ep.Entry[0].EntityType != SAHPI_ENT_GROUP) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); return -1; } if (ep.Entry[1].EntityLocation != 12) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); return -1; } if (ep.Entry[1].EntityType != SAHPI_ENT_REMOTE) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); return -1; } return 0; } openhpi-2.14.1/utils/t/epath/epath_conv_066.c0000644000076400007640000000511111302567127015564 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. */ /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_tests.pl. * Do not change this file manually. Update script instead *******************************************************************/ #include #include #include /** * main: * epathstr -> epath test * * Test if an entity path string is converted properly into an entity path. **/ int main(int argc, char **argv) { char *test_string = "{SYS_EXPANSION_BOARD,24}{POWER_UNIT,49}"; oh_big_textbuffer bigbuf; SaErrorT err; SaHpiEntityPathT ep; err = oh_encode_entitypath(test_string, &ep); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } if (ep.Entry[0].EntityType != SAHPI_ENT_POWER_UNIT) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[0].EntityType, SAHPI_ENT_POWER_UNIT); return -1; } if (ep.Entry[0].EntityLocation != 49) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[0].EntityLocation, 49); return -1; } if (ep.Entry[1].EntityType != SAHPI_ENT_SYS_EXPANSION_BOARD) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[1].EntityType, SAHPI_ENT_SYS_EXPANSION_BOARD); return -1; } if (ep.Entry[1].EntityLocation != 24) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[1].EntityLocation, 24); return -1; } oh_init_bigtext(&bigbuf); err = oh_decode_entitypath(&ep, &bigbuf); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } if (strcmp((char *)bigbuf.Data, test_string)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received Entity Path=%s.\n", bigbuf.Data); return -1; } return 0; } openhpi-2.14.1/utils/t/epath/epath_pattern_097.c0000644000076400007640000000326011302567127016303 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{SYSTEM_CHASSIS,1}{PHYSICAL_SLOT,3}{SBC_BLADE,3}{ADD_IN_CARD,8}"; char *epp_str = "{.,.}{.,.}*"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_TRUE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-2.14.1/utils/t/epath/epath_pattern_182.c0000644000076400007640000000325311302567127016300 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{GROUP,4}{SYSTEM_CHASSIS,1}{SBC_BLADE,3}{ADD_IN_CARD,8}"; char *epp_str = "{SBC_BLADE,3}"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_FALSE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-2.14.1/utils/t/epath/print_ep_000.c0000644000076400007640000000171011302567127015243 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * Chris Chia * Steve Sherman */ #include #include #include #include /* oh_print_ep: NULL pointer testcase. */ int main(int argc, char **argv) { int offsets = 0; SaErrorT err; SaErrorT expected_err = SA_ERR_HPI_INVALID_PARAMS; err = oh_print_ep(NULL, offsets); if (err != expected_err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } return 0; } openhpi-2.14.1/utils/t/epath/epath_pattern_183.c0000644000076400007640000000325411302567127016302 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{GROUP,4}{SYSTEM_CHASSIS,1}{SBC_BLADE,3}{ADD_IN_CARD,8}"; char *epp_str = "*{SBC_BLADE,3}"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_FALSE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-2.14.1/utils/t/epath/epath_pattern_398.c0000644000076400007640000000320511302567127016306 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{GROUP,2}{SUBRACK,5}"; char *epp_str = "*{.,.}{.,.}"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_TRUE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-2.14.1/utils/t/epath/epath_pattern_098.c0000644000076400007640000000326011302567127016304 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{SYSTEM_CHASSIS,1}{PHYSICAL_SLOT,3}{SBC_BLADE,3}{ADD_IN_CARD,8}"; char *epp_str = "*{.,.}{.,.}"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_TRUE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-2.14.1/utils/t/epath/epath_pattern_413.c0000644000076400007640000000324611302567127016277 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{GROUP,7}{REMOTE,2}{SUBRACK,4}"; char *epp_str = "*{SYSTEM_CHASSIS,.}*{SBC_BLADE,.}"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_FALSE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-2.14.1/utils/t/epath/epath_pattern_432.c0000644000076400007640000000323211302567127016273 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{GROUP,7}{REMOTE,2}{SUBRACK,4}{BIOS,8}"; char *epp_str = "{SBC_BLADE,3}"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_FALSE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-2.14.1/utils/t/epath/epath_conv_059.c0000644000076400007640000000511411302567127015571 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. */ /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_tests.pl. * Do not change this file manually. Update script instead *******************************************************************/ #include #include #include /** * main: * epathstr -> epath test * * Test if an entity path string is converted properly into an entity path. **/ int main(int argc, char **argv) { char *test_string = "{PERIPHERAL_BAY,82}{SYS_MGMNT_MODULE,87}"; oh_big_textbuffer bigbuf; SaErrorT err; SaHpiEntityPathT ep; err = oh_encode_entitypath(test_string, &ep); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } if (ep.Entry[0].EntityType != SAHPI_ENT_SYS_MGMNT_MODULE) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[0].EntityType, SAHPI_ENT_SYS_MGMNT_MODULE); return -1; } if (ep.Entry[0].EntityLocation != 87) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[0].EntityLocation, 87); return -1; } if (ep.Entry[1].EntityType != SAHPI_ENT_PERIPHERAL_BAY) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[1].EntityType, SAHPI_ENT_PERIPHERAL_BAY); return -1; } if (ep.Entry[1].EntityLocation != 82) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[1].EntityLocation, 82); return -1; } oh_init_bigtext(&bigbuf); err = oh_decode_entitypath(&ep, &bigbuf); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } if (strcmp((char *)bigbuf.Data, test_string)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received Entity Path=%s.\n", bigbuf.Data); return -1; } return 0; } openhpi-2.14.1/utils/t/epath/epath_pattern_009.c0000644000076400007640000000322311302567127016273 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{SYSTEM_CHASSIS,1}{SBC_BLADE,3}"; char *epp_str = "*{SBC_BLADE,.}"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_TRUE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-2.14.1/utils/t/epath/epath_conv_047.c0000644000076400007640000000507211302567127015571 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. */ /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_tests.pl. * Do not change this file manually. Update script instead *******************************************************************/ #include #include #include /** * main: * epathstr -> epath test * * Test if an entity path string is converted properly into an entity path. **/ int main(int argc, char **argv) { char *test_string = "{EXTERNAL_ENVIRONMENT,42}{RACK,79}"; oh_big_textbuffer bigbuf; SaErrorT err; SaHpiEntityPathT ep; err = oh_encode_entitypath(test_string, &ep); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } if (ep.Entry[0].EntityType != SAHPI_ENT_RACK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[0].EntityType, SAHPI_ENT_RACK); return -1; } if (ep.Entry[0].EntityLocation != 79) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[0].EntityLocation, 79); return -1; } if (ep.Entry[1].EntityType != SAHPI_ENT_EXTERNAL_ENVIRONMENT) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[1].EntityType, SAHPI_ENT_EXTERNAL_ENVIRONMENT); return -1; } if (ep.Entry[1].EntityLocation != 42) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[1].EntityLocation, 42); return -1; } oh_init_bigtext(&bigbuf); err = oh_decode_entitypath(&ep, &bigbuf); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } if (strcmp((char *)bigbuf.Data, test_string)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received Entity Path=%s.\n", bigbuf.Data); return -1; } return 0; } openhpi-2.14.1/utils/t/epath/epath_pattern_383.c0000644000076400007640000000321111302567127016275 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{GROUP,2}{SUBRACK,5}"; char *epp_str = "*{SBC_BLADE,3}"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_FALSE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-2.14.1/utils/t/epath/epath_pattern_049.c0000644000076400007640000000317111302567127016301 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{SYSTEM_CHASSIS,1}"; char *epp_str = "*"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_TRUE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-2.14.1/utils/t/epath/epath_pattern_365.c0000644000076400007640000000320211302567127016275 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{GROUP,2}"; char *epp_str = "{SYSTEM_CHASSIS,.}"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_FALSE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-2.14.1/utils/t/epath/epath_pattern_247.c0000644000076400007640000000317711302567127016307 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{SBC_BLADE,3}"; char *epp_str = "{.,.}{.,.}*"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_FALSE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-2.14.1/utils/t/epath/ep_cmp_010.c0000644000076400007640000000373711302567127014702 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * Chris Chia * Steve Sherman */ #include #include #include #include /* oh_cmp_ep: unidentical multi element entity path testcase. */ int main(int argc, char **argv) { SaHpiEntityPathT ep1 = {{{SAHPI_ENT_ADD_IN_CARD,151}, {SAHPI_ENT_FRONT_PANEL_BOARD,252}, {SAHPI_ENT_BACK_PANEL_BOARD,353}, {SAHPI_ENT_POWER_SYSTEM_BOARD,454}, {SAHPI_ENT_DRIVE_BACKPLANE,555}, {SAHPI_ENT_SYS_EXPANSION_BOARD,656}, {SAHPI_ENT_OTHER_SYSTEM_BOARD,757}, {SAHPI_ENT_PROCESSOR_BOARD,858}, {SAHPI_ENT_ROOT,0}}}; SaHpiEntityPathT ep2 = {{{SAHPI_ENT_ADD_IN_CARD,151}, {SAHPI_ENT_FRONT_PANEL_BOARD,252}, {SAHPI_ENT_BACK_PANEL_BOARD,353}, {SAHPI_ENT_POWER_SYSTEM_BOARD,454}, {SAHPI_ENT_DRIVE_BACKPLANE,555}, {SAHPI_ENT_SYS_EXPANSION_BOARD,656}, {SAHPI_ENT_OTHER_SYSTEM_BOARD,757}, {SAHPI_ENT_PROCESSOR_BOARD,859}, {SAHPI_ENT_ROOT,0}}}; if (oh_cmp_ep(&ep1, &ep2)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); return -1; } return 0; } openhpi-2.14.1/utils/t/epath/epath_pattern_261.c0000644000076400007640000000324411302567127016276 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{SBC_BLADE,3}{ADD_IN_CARD,8}"; char *epp_str = "*{SYSTEM_CHASSIS,1}{SBC_BLADE,.}*"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_FALSE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-2.14.1/utils/t/epath/epath_pattern_100.c0000644000076400007640000000331611302567127016266 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{GROUP,4}{SYSTEM_CHASSIS,1}{PHYSICAL_SLOT,3}{SBC_BLADE,3}{ADD_IN_CARD,8}"; char *epp_str = "{SYSTEM_CHASSIS,1}{SBC_BLADE,3}"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_FALSE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-2.14.1/utils/t/epath/epath_pattern_005.c0000644000076400007640000000323011302567127016265 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{SYSTEM_CHASSIS,1}{SBC_BLADE,3}"; char *epp_str = "{SYSTEM_CHASSIS,1}*"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_TRUE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-2.14.1/utils/t/epath/epath_pattern_275.c0000644000076400007640000000324411302567127016303 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{PHYSICAL_SLOT,4}{SBC_BLADE,3}"; char *epp_str = "{SYSTEM_CHASSIS,1}{SBC_BLADE,3}"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_FALSE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-2.14.1/utils/t/epath/epath_pattern_021.c0000644000076400007640000000322111302567127016263 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{SYSTEM_CHASSIS,1}{SBC_BLADE,3}"; char *epp_str = "{.,.}*{.,.}*"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_TRUE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-2.14.1/utils/t/epath/epath_pattern_118.c0000644000076400007640000000326411302567127016301 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{GROUP,4}{SYSTEM_CHASSIS,1}{PHYSICAL_SLOT,3}{SBC_BLADE,3}{ADD_IN_CARD,8}"; char *epp_str = "{.,.}*"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_TRUE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-2.14.1/utils/t/epath/epath_pattern_319.c0000644000076400007640000000323211302567127016277 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{PHYSICAL_SLOT,4}{SBC_BLADE,3}{ADD_IN_CARD,8}"; char *epp_str = "*{.,.}*"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_TRUE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-2.14.1/utils/t/epath/set_ep_loc_003.c0000755000076400007640000000306111302567127015546 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * Chris Chia * Steve Sherman */ #include #include #include #include /* oh_set_ep_location: Entity path that has 2 elements testcase. */ int main(int argc, char **argv) { SaErrorT err; SaHpiEntityPathT ep = {{{SAHPI_ENT_BIOS, 1},{SAHPI_ENT_UNKNOWN, 2},{0}}}; SaHpiEntityLocationT x = 777; err = oh_set_ep_location(&ep, SAHPI_ENT_UNKNOWN, x); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } if (ep.Entry[1].EntityLocation != x) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); return -1; } if (ep.Entry[1].EntityType != SAHPI_ENT_UNKNOWN) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); return -1; } if (ep.Entry[0].EntityLocation != 1) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); return -1; } if (ep.Entry[0].EntityType != SAHPI_ENT_BIOS) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); return -1; } return 0; } openhpi-2.14.1/utils/t/epath/epath_pattern_400.c0000644000076400007640000000324411302567127016271 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{GROUP,7}{REMOTE,2}{SUBRACK,4}"; char *epp_str = "{SYSTEM_CHASSIS,1}{SBC_BLADE,3}"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_FALSE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-2.14.1/utils/t/epath/epath_conv_025.c0000644000076400007640000000503111302567127015560 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. */ /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_tests.pl. * Do not change this file manually. Update script instead *******************************************************************/ #include #include #include /** * main: * epathstr -> epath test * * Test if an entity path string is converted properly into an entity path. **/ int main(int argc, char **argv) { char *test_string = "{FAN,45}{DEVICE_BAY,14}"; oh_big_textbuffer bigbuf; SaErrorT err; SaHpiEntityPathT ep; err = oh_encode_entitypath(test_string, &ep); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } if (ep.Entry[0].EntityType != SAHPI_ENT_DEVICE_BAY) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[0].EntityType, SAHPI_ENT_DEVICE_BAY); return -1; } if (ep.Entry[0].EntityLocation != 14) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[0].EntityLocation, 14); return -1; } if (ep.Entry[1].EntityType != SAHPI_ENT_FAN) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[1].EntityType, SAHPI_ENT_FAN); return -1; } if (ep.Entry[1].EntityLocation != 45) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[1].EntityLocation, 45); return -1; } oh_init_bigtext(&bigbuf); err = oh_decode_entitypath(&ep, &bigbuf); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } if (strcmp((char *)bigbuf.Data, test_string)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received Entity Path=%s.\n", bigbuf.Data); return -1; } return 0; } openhpi-2.14.1/utils/t/epath/epath_conv_078.c0000644000076400007640000000513311302567127015573 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. */ /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_tests.pl. * Do not change this file manually. Update script instead *******************************************************************/ #include #include #include /** * main: * epathstr -> epath test * * Test if an entity path string is converted properly into an entity path. **/ int main(int argc, char **argv) { char *test_string = "{SYS_MGMNT_SOFTWARE,23}{COMPACTPCI_CHASSIS,0}"; oh_big_textbuffer bigbuf; SaErrorT err; SaHpiEntityPathT ep; err = oh_encode_entitypath(test_string, &ep); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } if (ep.Entry[0].EntityType != SAHPI_ENT_COMPACTPCI_CHASSIS) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[0].EntityType, SAHPI_ENT_COMPACTPCI_CHASSIS); return -1; } if (ep.Entry[0].EntityLocation != 0) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[0].EntityLocation, 0); return -1; } if (ep.Entry[1].EntityType != SAHPI_ENT_SYS_MGMNT_SOFTWARE) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[1].EntityType, SAHPI_ENT_SYS_MGMNT_SOFTWARE); return -1; } if (ep.Entry[1].EntityLocation != 23) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[1].EntityLocation, 23); return -1; } oh_init_bigtext(&bigbuf); err = oh_decode_entitypath(&ep, &bigbuf); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } if (strcmp((char *)bigbuf.Data, test_string)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received Entity Path=%s.\n", bigbuf.Data); return -1; } return 0; } openhpi-2.14.1/utils/t/epath/epath_pattern_298.c0000644000076400007640000000321711302567127016310 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{PHYSICAL_SLOT,4}{SBC_BLADE,3}"; char *epp_str = "*{.,.}{.,.}"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_TRUE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-2.14.1/utils/t/epath/epath_pattern_160.c0000644000076400007640000000323511302567127016274 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{GROUP,4}{SYSTEM_CHASSIS,1}{SBC_BLADE,3}"; char *epp_str = "*{SBC_BLADE,.}*"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_TRUE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-2.14.1/utils/t/epath/epath_pattern_412.c0000644000076400007640000000324511302567127016275 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{GROUP,7}{REMOTE,2}{SUBRACK,4}"; char *epp_str = "*{SYSTEM_CHASSIS,.}{SBC_BLADE,.}"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_FALSE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-2.14.1/utils/t/epath/epath_pattern_136.c0000644000076400007640000000324311302567127016276 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{GROUP,4}{SYSTEM_CHASSIS,1}"; char *epp_str = "*{SYSTEM_CHASSIS,1}{SBC_BLADE,.}*"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_FALSE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-2.14.1/utils/t/epath/epath_pattern_318.c0000644000076400007640000000323111302567127016275 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{PHYSICAL_SLOT,4}{SBC_BLADE,3}{ADD_IN_CARD,8}"; char *epp_str = "{.,.}*"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_TRUE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-2.14.1/utils/t/epath/epath_pattern_073.c0000644000076400007640000000323711302567127016301 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{SYSTEM_CHASSIS,1}{SBC_BLADE,3}{ADD_IN_CARD,8}"; char *epp_str = "*{.,.}{.,.}"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_TRUE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-2.14.1/utils/t/epath/epath_conv_084.c0000644000076400007640000000513311302567127015570 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. */ /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_tests.pl. * Do not change this file manually. Update script instead *******************************************************************/ #include #include #include /** * main: * epathstr -> epath test * * Test if an entity path string is converted properly into an entity path. **/ int main(int argc, char **argv) { char *test_string = "{ADD_IN_CARD,43}{CHASSIS_BACK_PANEL_BOARD,83}"; oh_big_textbuffer bigbuf; SaErrorT err; SaHpiEntityPathT ep; err = oh_encode_entitypath(test_string, &ep); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } if (ep.Entry[0].EntityType != SAHPI_ENT_CHASSIS_BACK_PANEL_BOARD) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[0].EntityType, SAHPI_ENT_CHASSIS_BACK_PANEL_BOARD); return -1; } if (ep.Entry[0].EntityLocation != 83) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[0].EntityLocation, 83); return -1; } if (ep.Entry[1].EntityType != SAHPI_ENT_ADD_IN_CARD) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[1].EntityType, SAHPI_ENT_ADD_IN_CARD); return -1; } if (ep.Entry[1].EntityLocation != 43) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[1].EntityLocation, 43); return -1; } oh_init_bigtext(&bigbuf); err = oh_decode_entitypath(&ep, &bigbuf); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } if (strcmp((char *)bigbuf.Data, test_string)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received Entity Path=%s.\n", bigbuf.Data); return -1; } return 0; } openhpi-2.14.1/utils/t/epath/epath_pattern_116.c0000644000076400007640000000326411302567127016277 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{GROUP,4}{SYSTEM_CHASSIS,1}{PHYSICAL_SLOT,3}{SBC_BLADE,3}{ADD_IN_CARD,8}"; char *epp_str = "{.,.}"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_FALSE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-2.14.1/utils/t/epath/epath_pattern_185.c0000644000076400007640000000325411302567127016304 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{GROUP,4}{SYSTEM_CHASSIS,1}{SBC_BLADE,3}{ADD_IN_CARD,8}"; char *epp_str = "*{SBC_BLADE,.}*"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_TRUE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-2.14.1/utils/t/epath/epath_pattern_189.c0000644000076400007640000000327711302567127016315 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{GROUP,4}{SYSTEM_CHASSIS,1}{SBC_BLADE,3}{ADD_IN_CARD,8}"; char *epp_str = "*{SYSTEM_CHASSIS,.}*{SBC_BLADE,.}*"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_TRUE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-2.14.1/utils/t/epath/epath_conv_093.c0000644000076400007640000000511411302567127015567 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. */ /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_tests.pl. * Do not change this file manually. Update script instead *******************************************************************/ #include #include #include /** * main: * epathstr -> epath test * * Test if an entity path string is converted properly into an entity path. **/ int main(int argc, char **argv) { char *test_string = "{OTHER_CHASSIS_BOARD,20}{SUB_CHASSIS,60}"; oh_big_textbuffer bigbuf; SaErrorT err; SaHpiEntityPathT ep; err = oh_encode_entitypath(test_string, &ep); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } if (ep.Entry[0].EntityType != SAHPI_ENT_SUB_CHASSIS) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[0].EntityType, SAHPI_ENT_SUB_CHASSIS); return -1; } if (ep.Entry[0].EntityLocation != 60) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[0].EntityLocation, 60); return -1; } if (ep.Entry[1].EntityType != SAHPI_ENT_OTHER_CHASSIS_BOARD) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[1].EntityType, SAHPI_ENT_OTHER_CHASSIS_BOARD); return -1; } if (ep.Entry[1].EntityLocation != 20) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[1].EntityLocation, 20); return -1; } oh_init_bigtext(&bigbuf); err = oh_decode_entitypath(&ep, &bigbuf); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } if (strcmp((char *)bigbuf.Data, test_string)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received Entity Path=%s.\n", bigbuf.Data); return -1; } return 0; } openhpi-2.14.1/utils/t/epath/print_ep_005.c0000644000076400007640000000221011302567127015244 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * Chris Chia * Steve Sherman */ #include #include #include #include /* oh_print_ep: Full entity path testcase. */ int main(int argc, char **argv) { int i, offsets = 1; SaErrorT err; SaHpiEntityPathT ep; for (i=0; i */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{GROUP,4}{SYSTEM_CHASSIS,1}{PHYSICAL_SLOT,3}{SBC_BLADE,3}"; char *epp_str = "{SYSTEM_CHASSIS,.}"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_FALSE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-2.14.1/utils/t/epath/epath_pattern_162.c0000644000076400007640000000325611302567127016301 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{GROUP,4}{SYSTEM_CHASSIS,1}{SBC_BLADE,3}"; char *epp_str = "*{SYSTEM_CHASSIS,.}{SBC_BLADE,.}"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_TRUE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-2.14.1/utils/t/epath/epath_pattern_299.c0000644000076400007640000000320511302567127016306 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{PHYSICAL_SLOT,4}{SBC_BLADE,3}"; char *epp_str = "*"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_TRUE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-2.14.1/utils/t/epath/epath_pattern_156.c0000644000076400007640000000324111302567127016276 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{GROUP,4}{SYSTEM_CHASSIS,1}{SBC_BLADE,3}"; char *epp_str = "{SYSTEM_CHASSIS,1}"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_FALSE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-2.14.1/utils/t/epath/epath_pattern_126.c0000644000076400007640000000324111302567127016273 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{GROUP,4}{SYSTEM_CHASSIS,1}"; char *epp_str = "{SYSTEM_CHASSIS,1}{SBC_BLADE,.}"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_FALSE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-2.14.1/utils/t/epath/epath_conv_083.c0000644000076400007640000000506111302567127015567 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. */ /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_tests.pl. * Do not change this file manually. Update script instead *******************************************************************/ #include #include #include /** * main: * epathstr -> epath test * * Test if an entity path string is converted properly into an entity path. **/ int main(int argc, char **argv) { char *test_string = "{POWER_MODULE,78}{DISK_DRIVE,6}"; oh_big_textbuffer bigbuf; SaErrorT err; SaHpiEntityPathT ep; err = oh_encode_entitypath(test_string, &ep); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } if (ep.Entry[0].EntityType != SAHPI_ENT_DISK_DRIVE) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[0].EntityType, SAHPI_ENT_DISK_DRIVE); return -1; } if (ep.Entry[0].EntityLocation != 6) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[0].EntityLocation, 6); return -1; } if (ep.Entry[1].EntityType != SAHPI_ENT_POWER_MODULE) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[1].EntityType, SAHPI_ENT_POWER_MODULE); return -1; } if (ep.Entry[1].EntityLocation != 78) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[1].EntityLocation, 78); return -1; } oh_init_bigtext(&bigbuf); err = oh_decode_entitypath(&ep, &bigbuf); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } if (strcmp((char *)bigbuf.Data, test_string)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received Entity Path=%s.\n", bigbuf.Data); return -1; } return 0; } openhpi-2.14.1/utils/t/epath/epath_pattern_101.c0000644000076400007640000000331611302567127016267 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{GROUP,4}{SYSTEM_CHASSIS,1}{PHYSICAL_SLOT,3}{SBC_BLADE,3}{ADD_IN_CARD,8}"; char *epp_str = "{SYSTEM_CHASSIS,1}{SBC_BLADE,.}"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_FALSE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-2.14.1/utils/t/epath/epath_pattern_377.c0000644000076400007640000000323311302567127016304 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{GROUP,2}{SUBRACK,5}"; char *epp_str = "{SYSTEM_CHASSIS,1}{SBC_BLADE,.}*"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_FALSE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-2.14.1/utils/t/epath/epath_pattern_304.c0000644000076400007640000000325411302567127016275 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{PHYSICAL_SLOT,4}{SBC_BLADE,3}{ADD_IN_CARD,8}"; char *epp_str = "{SYSTEM_CHASSIS,1}{.,.}*"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_FALSE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-2.14.1/utils/t/epath/epath_conv_022.c0000644000076400007640000000510611302567127015560 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. */ /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_tests.pl. * Do not change this file manually. Update script instead *******************************************************************/ #include #include #include /** * main: * epathstr -> epath test * * Test if an entity path string is converted properly into an entity path. **/ int main(int argc, char **argv) { char *test_string = "{COOLING_UNIT,79}{CHASSIS_SPECIFIC,79}"; oh_big_textbuffer bigbuf; SaErrorT err; SaHpiEntityPathT ep; err = oh_encode_entitypath(test_string, &ep); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } if (ep.Entry[0].EntityType != SAHPI_ENT_CHASSIS_SPECIFIC) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[0].EntityType, SAHPI_ENT_CHASSIS_SPECIFIC); return -1; } if (ep.Entry[0].EntityLocation != 79) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[0].EntityLocation, 79); return -1; } if (ep.Entry[1].EntityType != SAHPI_ENT_COOLING_UNIT) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[1].EntityType, SAHPI_ENT_COOLING_UNIT); return -1; } if (ep.Entry[1].EntityLocation != 79) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[1].EntityLocation, 79); return -1; } oh_init_bigtext(&bigbuf); err = oh_decode_entitypath(&ep, &bigbuf); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } if (strcmp((char *)bigbuf.Data, test_string)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received Entity Path=%s.\n", bigbuf.Data); return -1; } return 0; } openhpi-2.14.1/utils/t/epath/epath_pattern_132.c0000644000076400007640000000321711302567127016273 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{GROUP,4}{SYSTEM_CHASSIS,1}"; char *epp_str = "{SBC_BLADE,3}"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_FALSE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-2.14.1/utils/t/epath/epath_pattern_395.c0000644000076400007640000000320611302567127016304 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{GROUP,2}{SUBRACK,5}"; char *epp_str = "*{.,.}*{.,.}"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_TRUE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-2.14.1/utils/t/epath/epath_pattern_310.c0000644000076400007640000000324211302567127016267 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{PHYSICAL_SLOT,4}{SBC_BLADE,3}{ADD_IN_CARD,8}"; char *epp_str = "*{SBC_BLADE,.}*"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_TRUE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-2.14.1/utils/t/epath/epath_conv_046.c0000644000076400007640000000507211302567127015570 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. */ /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_tests.pl. * Do not change this file manually. Update script instead *******************************************************************/ #include #include #include /** * main: * epathstr -> epath test * * Test if an entity path string is converted properly into an entity path. **/ int main(int argc, char **argv) { char *test_string = "{SYS_MGMNT_SOFTWARE,58}{REMOTE,76}"; oh_big_textbuffer bigbuf; SaErrorT err; SaHpiEntityPathT ep; err = oh_encode_entitypath(test_string, &ep); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } if (ep.Entry[0].EntityType != SAHPI_ENT_REMOTE) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[0].EntityType, SAHPI_ENT_REMOTE); return -1; } if (ep.Entry[0].EntityLocation != 76) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[0].EntityLocation, 76); return -1; } if (ep.Entry[1].EntityType != SAHPI_ENT_SYS_MGMNT_SOFTWARE) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[1].EntityType, SAHPI_ENT_SYS_MGMNT_SOFTWARE); return -1; } if (ep.Entry[1].EntityLocation != 58) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[1].EntityLocation, 58); return -1; } oh_init_bigtext(&bigbuf); err = oh_decode_entitypath(&ep, &bigbuf); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } if (strcmp((char *)bigbuf.Data, test_string)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received Entity Path=%s.\n", bigbuf.Data); return -1; } return 0; } openhpi-2.14.1/utils/t/epath/epath_pattern_421.c0000644000076400007640000000322011302567127016266 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{GROUP,7}{REMOTE,2}{SUBRACK,4}"; char *epp_str = "{.,.}*{.,.}*"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_TRUE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-2.14.1/utils/t/epath/epath_pattern_121.c0000644000076400007640000000327211302567127016272 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{GROUP,4}{SYSTEM_CHASSIS,1}{PHYSICAL_SLOT,3}{SBC_BLADE,3}{ADD_IN_CARD,8}"; char *epp_str = "{.,.}*{.,.}*"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_TRUE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-2.14.1/utils/t/epath/epath_pattern_110.c0000644000076400007640000000327511302567127016273 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{GROUP,4}{SYSTEM_CHASSIS,1}{PHYSICAL_SLOT,3}{SBC_BLADE,3}{ADD_IN_CARD,8}"; char *epp_str = "*{SBC_BLADE,.}*"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_TRUE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-2.14.1/utils/t/epath/epath_pattern_065.c0000644000076400007640000000324711302567127016303 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{SYSTEM_CHASSIS,1}{SBC_BLADE,3}{ADD_IN_CARD,8}"; char *epp_str = "{SYSTEM_CHASSIS,.}"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_FALSE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-2.14.1/utils/t/epath/epath_conv_036.c0000644000076400007640000000514711302567127015572 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. */ /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_tests.pl. * Do not change this file manually. Update script instead *******************************************************************/ #include #include #include /** * main: * epathstr -> epath test * * Test if an entity path string is converted properly into an entity path. **/ int main(int argc, char **argv) { char *test_string = "{PROCESSOR_BOARD,16}{CHASSIS_BACK_PANEL_BOARD,22}"; oh_big_textbuffer bigbuf; SaErrorT err; SaHpiEntityPathT ep; err = oh_encode_entitypath(test_string, &ep); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } if (ep.Entry[0].EntityType != SAHPI_ENT_CHASSIS_BACK_PANEL_BOARD) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[0].EntityType, SAHPI_ENT_CHASSIS_BACK_PANEL_BOARD); return -1; } if (ep.Entry[0].EntityLocation != 22) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[0].EntityLocation, 22); return -1; } if (ep.Entry[1].EntityType != SAHPI_ENT_PROCESSOR_BOARD) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[1].EntityType, SAHPI_ENT_PROCESSOR_BOARD); return -1; } if (ep.Entry[1].EntityLocation != 16) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[1].EntityLocation, 16); return -1; } oh_init_bigtext(&bigbuf); err = oh_decode_entitypath(&ep, &bigbuf); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } if (strcmp((char *)bigbuf.Data, test_string)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received Entity Path=%s.\n", bigbuf.Data); return -1; } return 0; } openhpi-2.14.1/utils/t/epath/print_ep_001.c0000644000076400007640000000201111302567127015237 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * Chris Chia * Steve Sherman */ #include #include #include #include /* oh_print_ep: Zero elements entity path testcase. */ int main(int argc, char **argv) { int offsets = 0; SaHpiEntityPathT ep; SaErrorT err; memset(&ep, 0, sizeof(SaHpiEntityPathT)); printf("Zero entity path testcase\n"); err = oh_print_ep(&ep, offsets); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } return 0; } openhpi-2.14.1/utils/t/epath/epath_numeric_000.c0000644000076400007640000000262111302567127016250 0ustar /* -*- linux-c -*- * * (C) Copyright FORCE Computers 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * Thomas Kanngieser */ #include #include #include #include #include int main (int argc, char **argv) { gchar *test_string, *expected_string; oh_big_textbuffer bigbuf; SaErrorT err; SaHpiEntityPathT ep; test_string = "{7,11}"; expected_string = "{SYSTEM_BOARD,11}"; err = oh_encode_entitypath(test_string, &ep); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } oh_init_bigtext(&bigbuf); err = oh_decode_entitypath(&ep, &bigbuf); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } if (strcmp((char *)bigbuf.Data, expected_string)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received Entity Path=%s.\n", bigbuf.Data); return -1; } return 0; } openhpi-2.14.1/utils/t/epath/epath_pattern_366.c0000644000076400007640000000316411302567127016305 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{GROUP,2}"; char *epp_str = "{.,.}"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_TRUE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-2.14.1/utils/t/epath/epath_pattern_283.c0000644000076400007640000000322211302567127016276 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{PHYSICAL_SLOT,4}{SBC_BLADE,3}"; char *epp_str = "*{SBC_BLADE,3}"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_TRUE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-2.14.1/utils/t/epath/epath_pattern_328.c0000644000076400007640000000325611302567127016305 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{SYSTEM_CHASSIS,1}{PHYSICAL_SLOT,4}{SBC_BLADE,3}"; char *epp_str = "{SYSTEM_CHASSIS,1}{.,.}"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_FALSE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-2.14.1/utils/t/epath/epath_pattern_313.c0000644000076400007640000000326511302567127016277 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{PHYSICAL_SLOT,4}{SBC_BLADE,3}{ADD_IN_CARD,8}"; char *epp_str = "*{SYSTEM_CHASSIS,.}*{SBC_BLADE,.}"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_FALSE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-2.14.1/utils/t/epath/epath_pattern_344.c0000644000076400007640000000323511302567127016300 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{SYSTEM_CHASSIS,1}{PHYSICAL_SLOT,4}{SBC_BLADE,3}"; char *epp_str = "*{.,.}*"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_TRUE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-2.14.1/utils/t/epath/epath_pattern_217.c0000644000076400007640000000324511302567127016300 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{GROUP,4}{SYSTEM_CHASSIS,1}{PHYSICAL_SLOT,3}{SBC_BLADE,3}"; char *epp_str = "*{.,.}"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_TRUE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-2.14.1/utils/t/epath/epath_pattern_337.c0000644000076400007640000000326711302567127016307 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{SYSTEM_CHASSIS,1}{PHYSICAL_SLOT,4}{SBC_BLADE,3}"; char *epp_str = "*{SYSTEM_CHASSIS,.}{SBC_BLADE,.}"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_FALSE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-2.14.1/utils/t/epath/epath_conv_073.c0000644000076400007640000000505311302567127015567 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. */ /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_tests.pl. * Do not change this file manually. Update script instead *******************************************************************/ #include #include #include /** * main: * epathstr -> epath test * * Test if an entity path string is converted properly into an entity path. **/ int main(int argc, char **argv) { char *test_string = "{REMOTE,51}{ALARM_MANAGER,19}"; oh_big_textbuffer bigbuf; SaErrorT err; SaHpiEntityPathT ep; err = oh_encode_entitypath(test_string, &ep); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } if (ep.Entry[0].EntityType != SAHPI_ENT_ALARM_MANAGER) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[0].EntityType, SAHPI_ENT_ALARM_MANAGER); return -1; } if (ep.Entry[0].EntityLocation != 19) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[0].EntityLocation, 19); return -1; } if (ep.Entry[1].EntityType != SAHPI_ENT_REMOTE) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[1].EntityType, SAHPI_ENT_REMOTE); return -1; } if (ep.Entry[1].EntityLocation != 51) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[1].EntityLocation, 51); return -1; } oh_init_bigtext(&bigbuf); err = oh_decode_entitypath(&ep, &bigbuf); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } if (strcmp((char *)bigbuf.Data, test_string)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received Entity Path=%s.\n", bigbuf.Data); return -1; } return 0; } openhpi-2.14.1/utils/t/epath/epath_pattern_397.c0000644000076400007640000000320511302567127016305 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{GROUP,2}{SUBRACK,5}"; char *epp_str = "{.,.}{.,.}*"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_TRUE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-2.14.1/utils/t/epath/epath_conv_072.c0000644000076400007640000000505611302567127015571 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. */ /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_tests.pl. * Do not change this file manually. Update script instead *******************************************************************/ #include #include #include /** * main: * epathstr -> epath test * * Test if an entity path string is converted properly into an entity path. **/ int main(int argc, char **argv) { char *test_string = "{SYS_MGMNT_MODULE,4}{OTHER,38}"; oh_big_textbuffer bigbuf; SaErrorT err; SaHpiEntityPathT ep; err = oh_encode_entitypath(test_string, &ep); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } if (ep.Entry[0].EntityType != SAHPI_ENT_OTHER) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[0].EntityType, SAHPI_ENT_OTHER); return -1; } if (ep.Entry[0].EntityLocation != 38) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[0].EntityLocation, 38); return -1; } if (ep.Entry[1].EntityType != SAHPI_ENT_SYS_MGMNT_MODULE) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[1].EntityType, SAHPI_ENT_SYS_MGMNT_MODULE); return -1; } if (ep.Entry[1].EntityLocation != 4) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[1].EntityLocation, 4); return -1; } oh_init_bigtext(&bigbuf); err = oh_decode_entitypath(&ep, &bigbuf); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } if (strcmp((char *)bigbuf.Data, test_string)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received Entity Path=%s.\n", bigbuf.Data); return -1; } return 0; } openhpi-2.14.1/utils/t/epath/epath_pattern_280.c0000644000076400007640000000323011302567127016272 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{PHYSICAL_SLOT,4}{SBC_BLADE,3}"; char *epp_str = "{SYSTEM_CHASSIS,1}*"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_FALSE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-2.14.1/utils/t/epath/epath_pattern_446.c0000644000076400007640000000323011302567127016276 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{GROUP,7}{REMOTE,2}{SUBRACK,4}{BIOS,8}"; char *epp_str = "{.,.}*{.,.}*"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_TRUE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-2.14.1/utils/t/epath/epath_pattern_037.c0000644000076400007640000000323111302567127016273 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{SYSTEM_CHASSIS,1}"; char *epp_str = "*{SYSTEM_CHASSIS,.}{SBC_BLADE,.}"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_FALSE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-2.14.1/utils/t/epath/epath_pattern_226.c0000644000076400007640000000322311302567127016274 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{SBC_BLADE,3}"; char *epp_str = "{SYSTEM_CHASSIS,1}{SBC_BLADE,.}"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_FALSE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-2.14.1/utils/t/epath/epath_pattern_364.c0000644000076400007640000000322211302567127016276 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{GROUP,2}"; char *epp_str = "*{SYSTEM_CHASSIS,.}*{SBC_BLADE,.}*"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_FALSE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-2.14.1/utils/t/epath/epath_conv_026.c0000644000076400007640000000510011302567127015556 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. */ /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_tests.pl. * Do not change this file manually. Update script instead *******************************************************************/ #include #include #include /** * main: * epathstr -> epath test * * Test if an entity path string is converted properly into an entity path. **/ int main(int argc, char **argv) { char *test_string = "{CHASSIS_SPECIFIC,12}{SYSTEM_BUS,32}"; oh_big_textbuffer bigbuf; SaErrorT err; SaHpiEntityPathT ep; err = oh_encode_entitypath(test_string, &ep); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } if (ep.Entry[0].EntityType != SAHPI_ENT_SYSTEM_BUS) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[0].EntityType, SAHPI_ENT_SYSTEM_BUS); return -1; } if (ep.Entry[0].EntityLocation != 32) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[0].EntityLocation, 32); return -1; } if (ep.Entry[1].EntityType != SAHPI_ENT_CHASSIS_SPECIFIC) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[1].EntityType, SAHPI_ENT_CHASSIS_SPECIFIC); return -1; } if (ep.Entry[1].EntityLocation != 12) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[1].EntityLocation, 12); return -1; } oh_init_bigtext(&bigbuf); err = oh_decode_entitypath(&ep, &bigbuf); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } if (strcmp((char *)bigbuf.Data, test_string)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received Entity Path=%s.\n", bigbuf.Data); return -1; } return 0; } openhpi-2.14.1/utils/t/epath/epath_pattern_135.c0000644000076400007640000000322111302567127016271 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{GROUP,4}{SYSTEM_CHASSIS,1}"; char *epp_str = "*{SBC_BLADE,.}*"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_FALSE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-2.14.1/utils/t/epath/epath_conv_045.c0000644000076400007640000000505611302567127015571 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. */ /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_tests.pl. * Do not change this file manually. Update script instead *******************************************************************/ #include #include #include /** * main: * epathstr -> epath test * * Test if an entity path string is converted properly into an entity path. **/ int main(int argc, char **argv) { char *test_string = "{POWER_MODULE,9}{SBC_BLADE,46}"; oh_big_textbuffer bigbuf; SaErrorT err; SaHpiEntityPathT ep; err = oh_encode_entitypath(test_string, &ep); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } if (ep.Entry[0].EntityType != SAHPI_ENT_SBC_BLADE) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[0].EntityType, SAHPI_ENT_SBC_BLADE); return -1; } if (ep.Entry[0].EntityLocation != 46) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[0].EntityLocation, 46); return -1; } if (ep.Entry[1].EntityType != SAHPI_ENT_POWER_MODULE) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[1].EntityType, SAHPI_ENT_POWER_MODULE); return -1; } if (ep.Entry[1].EntityLocation != 9) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[1].EntityLocation, 9); return -1; } oh_init_bigtext(&bigbuf); err = oh_decode_entitypath(&ep, &bigbuf); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } if (strcmp((char *)bigbuf.Data, test_string)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received Entity Path=%s.\n", bigbuf.Data); return -1; } return 0; } openhpi-2.14.1/utils/t/epath/epath_pattern_174.c0000644000076400007640000000321711302567127016301 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{GROUP,4}{SYSTEM_CHASSIS,1}{SBC_BLADE,3}"; char *epp_str = "*"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_TRUE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-2.14.1/utils/t/epath/epath_pattern_169.c0000644000076400007640000000322511302567127016304 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{GROUP,4}{SYSTEM_CHASSIS,1}{SBC_BLADE,3}"; char *epp_str = "*{.,.}*"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_TRUE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-2.14.1/utils/t/epath/epath_pattern_081.c0000644000076400007640000000327011302567127016275 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{SYSTEM_CHASSIS,1}{PHYSICAL_SLOT,3}{SBC_BLADE,3}{ADD_IN_CARD,8}"; char *epp_str = "{SYSTEM_CHASSIS,1}"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_FALSE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-2.14.1/utils/t/epath/epath_pattern_064.c0000644000076400007640000000326611302567127016303 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{SYSTEM_CHASSIS,1}{SBC_BLADE,3}{ADD_IN_CARD,8}"; char *epp_str = "*{SYSTEM_CHASSIS,.}*{SBC_BLADE,.}*"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_TRUE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-2.14.1/utils/t/epath/epath_pattern_178.c0000644000076400007640000000326511302567127016310 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{GROUP,4}{SYSTEM_CHASSIS,1}{SBC_BLADE,3}{ADD_IN_CARD,8}"; char *epp_str = "{SYSTEM_CHASSIS,1}{.,.}"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_FALSE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-2.14.1/utils/t/epath/epath_pattern_262.c0000644000076400007640000000324311302567127016276 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{SBC_BLADE,3}{ADD_IN_CARD,8}"; char *epp_str = "*{SYSTEM_CHASSIS,.}{SBC_BLADE,.}"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_FALSE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-2.14.1/utils/t/epath/epath_conv_011.c0000644000076400007640000000505011302567127015554 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. */ /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_tests.pl. * Do not change this file manually. Update script instead *******************************************************************/ #include #include #include /** * main: * epathstr -> epath test * * Test if an entity path string is converted properly into an entity path. **/ int main(int argc, char **argv) { char *test_string = "{CHASSIS_SPECIFIC,8}{BIOS,8}"; oh_big_textbuffer bigbuf; SaErrorT err; SaHpiEntityPathT ep; err = oh_encode_entitypath(test_string, &ep); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } if (ep.Entry[0].EntityType != SAHPI_ENT_BIOS) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[0].EntityType, SAHPI_ENT_BIOS); return -1; } if (ep.Entry[0].EntityLocation != 8) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[0].EntityLocation, 8); return -1; } if (ep.Entry[1].EntityType != SAHPI_ENT_CHASSIS_SPECIFIC) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[1].EntityType, SAHPI_ENT_CHASSIS_SPECIFIC); return -1; } if (ep.Entry[1].EntityLocation != 8) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[1].EntityLocation, 8); return -1; } oh_init_bigtext(&bigbuf); err = oh_decode_entitypath(&ep, &bigbuf); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } if (strcmp((char *)bigbuf.Data, test_string)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received Entity Path=%s.\n", bigbuf.Data); return -1; } return 0; } openhpi-2.14.1/utils/t/epath/epath_conv_091.c0000644000076400007640000000507511302567127015573 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. */ /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_tests.pl. * Do not change this file manually. Update script instead *******************************************************************/ #include #include #include /** * main: * epathstr -> epath test * * Test if an entity path string is converted properly into an entity path. **/ int main(int argc, char **argv) { char *test_string = "{DISPLAY_PANEL,86}{SYSTEM_BOARD,90}"; oh_big_textbuffer bigbuf; SaErrorT err; SaHpiEntityPathT ep; err = oh_encode_entitypath(test_string, &ep); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } if (ep.Entry[0].EntityType != SAHPI_ENT_SYSTEM_BOARD) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[0].EntityType, SAHPI_ENT_SYSTEM_BOARD); return -1; } if (ep.Entry[0].EntityLocation != 90) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[0].EntityLocation, 90); return -1; } if (ep.Entry[1].EntityType != SAHPI_ENT_DISPLAY_PANEL) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[1].EntityType, SAHPI_ENT_DISPLAY_PANEL); return -1; } if (ep.Entry[1].EntityLocation != 86) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[1].EntityLocation, 86); return -1; } oh_init_bigtext(&bigbuf); err = oh_decode_entitypath(&ep, &bigbuf); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } if (strcmp((char *)bigbuf.Data, test_string)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received Entity Path=%s.\n", bigbuf.Data); return -1; } return 0; } openhpi-2.14.1/utils/t/epath/epath_pattern_440.c0000644000076400007640000000323711302567127016277 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{GROUP,7}{REMOTE,2}{SUBRACK,4}{BIOS,8}"; char *epp_str = "{SYSTEM_CHASSIS,.}"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_FALSE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-2.14.1/utils/t/epath/ep_concat_011.c0000644000076400007640000000442711302567127015370 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * Chris Chia * Steve Sherman */ #include #include #include #include /* oh_concat_ep: concatenate a zero element and a 9 element entity path */ int main(int argc, char **argv) { SaErrorT err; SaHpiEntityPathT ep1 = {{{SAHPI_ENT_ROOT,0}}}; SaHpiEntityPathT ep2 = {{{SAHPI_ENT_GROUP,101}, {SAHPI_ENT_REMOTE,102}, {SAHPI_ENT_EXTERNAL_ENVIRONMENT,103}, {SAHPI_ENT_BATTERY,104}, {SAHPI_ENT_CHASSIS_SPECIFIC,105}, {SAHPI_ENT_BOARD_SET_SPECIFIC,106}, {SAHPI_ENT_OEM_SYSINT_SPECIFIC,107}, {SAHPI_ENT_FAN,108}, {SAHPI_ENT_RACK,109}, {SAHPI_ENT_ROOT,0}}}; SaHpiEntityPathT ep3 = {{{SAHPI_ENT_GROUP,101}, {SAHPI_ENT_REMOTE,102}, {SAHPI_ENT_EXTERNAL_ENVIRONMENT,103}, {SAHPI_ENT_BATTERY,104}, {SAHPI_ENT_CHASSIS_SPECIFIC,105}, {SAHPI_ENT_BOARD_SET_SPECIFIC,106}, {SAHPI_ENT_OEM_SYSINT_SPECIFIC,107}, {SAHPI_ENT_FAN,108}, {SAHPI_ENT_RACK,109}, {SAHPI_ENT_ROOT,0}}}; err = oh_concat_ep(&ep1, &ep2); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } if (!oh_cmp_ep(&ep1, &ep3)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); return -1; } return 0; } openhpi-2.14.1/utils/t/epath/epath_numeric_004.c0000644000076400007640000000263111302567127016255 0ustar /* -*- linux-c -*- * * (C) Copyright FORCE Computers 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * Thomas Kanngieser */ #include #include #include #include #include int main (int argc, char **argv) { gchar *test_string; oh_big_textbuffer bigbuf; SaErrorT err; SaHpiEntityPathT ep; /* check if we can convert the last entry of the list */ test_string = "{PHYSICAL_SLOT,12}"; err = oh_encode_entitypath(test_string, &ep); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } oh_init_bigtext(&bigbuf); err = oh_decode_entitypath(&ep, &bigbuf); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } if (strcmp((char *)bigbuf.Data, test_string)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received Entity Path=%s.\n", bigbuf.Data); return -1; } return 0; } openhpi-2.14.1/utils/t/epath/epath_numeric_003.c0000644000076400007640000000251611302567127016256 0ustar /* -*- linux-c -*- * * (C) Copyright FORCE Computers 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * Thomas Kanngieser */ #include #include #include #include #include int main (int argc, char **argv) { gchar *test_string; oh_big_textbuffer bigbuf; SaErrorT err; SaHpiEntityPathT ep; test_string = "{217,11}"; err = oh_encode_entitypath(test_string, &ep); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } oh_init_bigtext(&bigbuf); err = oh_decode_entitypath(&ep, &bigbuf); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } if (strcmp((char *)bigbuf.Data, test_string)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received Entity Path=%s.\n", bigbuf.Data); return -1; } return 0; } openhpi-2.14.1/utils/t/epath/epath_pattern_338.c0000644000076400007640000000326711302567127016310 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{SYSTEM_CHASSIS,1}{PHYSICAL_SLOT,4}{SBC_BLADE,3}"; char *epp_str = "*{SYSTEM_CHASSIS,.}*{SBC_BLADE,.}"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_TRUE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-2.14.1/utils/t/epath/epath_pattern_032.c0000644000076400007640000000320611302567127016270 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{SYSTEM_CHASSIS,1}"; char *epp_str = "{SBC_BLADE,3}"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_FALSE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-2.14.1/utils/t/epath/epath_conv_003.c0000644000076400007640000000507211302567127015561 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. */ /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_tests.pl. * Do not change this file manually. Update script instead *******************************************************************/ #include #include #include /** * main: * epathstr -> epath test * * Test if an entity path string is converted properly into an entity path. **/ int main(int argc, char **argv) { char *test_string = "{REMOTE,11}{COMPACTPCI_CHASSIS,96}"; oh_big_textbuffer bigbuf; SaErrorT err; SaHpiEntityPathT ep; err = oh_encode_entitypath(test_string, &ep); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } if (ep.Entry[0].EntityType != SAHPI_ENT_COMPACTPCI_CHASSIS) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[0].EntityType, SAHPI_ENT_COMPACTPCI_CHASSIS); return -1; } if (ep.Entry[0].EntityLocation != 96) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[0].EntityLocation, 96); return -1; } if (ep.Entry[1].EntityType != SAHPI_ENT_REMOTE) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[1].EntityType, SAHPI_ENT_REMOTE); return -1; } if (ep.Entry[1].EntityLocation != 11) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received=%d; Expected=%d\n", ep.Entry[1].EntityLocation, 11); return -1; } oh_init_bigtext(&bigbuf); err = oh_decode_entitypath(&ep, &bigbuf); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } if (strcmp((char *)bigbuf.Data, test_string)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received Entity Path=%s.\n", bigbuf.Data); return -1; } return 0; } openhpi-2.14.1/utils/t/epath/epath_pattern_038.c0000644000076400007640000000323211302567127016275 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{SYSTEM_CHASSIS,1}"; char *epp_str = "*{SYSTEM_CHASSIS,.}*{SBC_BLADE,.}"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_FALSE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-2.14.1/utils/t/epath/epath_pattern_362.c0000644000076400007640000000322011302567127016272 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{GROUP,2}"; char *epp_str = "*{SYSTEM_CHASSIS,.}{SBC_BLADE,.}"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_FALSE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-2.14.1/utils/t/epath/epath_numeric_001.c0000644000076400007640000000202011302567127016242 0ustar /* -*- linux-c -*- * * (C) Copyright FORCE Computers 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * Thomas Kanngieser */ #include #include #include #include #include int main (int argc, char **argv) { gchar *test_string; SaErrorT err, expected_err; SaHpiEntityPathT ep; /* Invalid string */ test_string = "{17string,11}"; expected_err = SA_ERR_HPI_INVALID_DATA; err = oh_encode_entitypath(test_string, &ep); if (err != expected_err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } return 0; } openhpi-2.14.1/utils/t/epath/epath_pattern_180.c0000644000076400007640000000326111302567127016275 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{GROUP,4}{SYSTEM_CHASSIS,1}{SBC_BLADE,3}{ADD_IN_CARD,8}"; char *epp_str = "{SYSTEM_CHASSIS,1}*"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_FALSE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-2.14.1/utils/t/epath/epath_pattern_373.c0000644000076400007640000000317311302567127016303 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{GROUP,2}"; char *epp_str = "*{.,.}{.,.}"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_FALSE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-2.14.1/utils/t/epath/epath_pattern_324.c0000644000076400007640000000322411302567127016274 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{PHYSICAL_SLOT,4}{SBC_BLADE,3}{ADD_IN_CARD,8}"; char *epp_str = "*"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_TRUE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-2.14.1/utils/t/epath/epath_pattern_374.c0000644000076400007640000000316011302567127016300 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author: Renier Morales */ #include #include /******************************************************************* * WARNING! This file is auto-magically generated by: * ./gen_epath_pattern_tests.py * Do not change this file manually. Update script instead *******************************************************************/ /** * This takes an entity path and an entity path's pattern, * and knowing the proper result beforehand, checks if the * pattern matches the entity path. If the proper result is * achieved, the test passes. **/ int main(int argc, char **argv) { char *ep_str = "{GROUP,2}"; char *epp_str = "*"; oh_entitypath_pattern epp; SaHpiEntityPathT ep; SaErrorT error = SA_OK; SaHpiBoolT match = SAHPI_TRUE; error = oh_encode_entitypath(ep_str, &ep); if (error) { printf("Encoding of entitypath failed.\n"); return -1; } error = oh_compile_entitypath_pattern(epp_str, &epp); if (error) { printf("Compilation of pattern failed.\n"); return -1; } if (oh_match_entitypath_pattern(&epp, &ep) != match) return -1; return 0; } openhpi-2.14.1/utils/t/epath/epath_numeric_002.c0000644000076400007640000000203311302567127016247 0ustar /* -*- linux-c -*- * * (C) Copyright FORCE Computers 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * Thomas Kanngieser */ #include #include #include #include #include int main (int argc, char **argv) { gchar *test_string; SaErrorT err, expected_err; SaHpiEntityPathT ep; /* Negative values are not allowed */ test_string = "{-7,11}"; expected_err = SA_ERR_HPI_INVALID_DATA; err = oh_encode_entitypath(test_string, &ep); if (err != expected_err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } return 0; } openhpi-2.14.1/utils/t/rpt/0000755000076400007640000000000011405006365012401 5ustar openhpi-2.14.1/utils/t/rpt/rpt_utils_005.c0000644000076400007640000000426211302567130015160 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Renier Morales */ #include #include #include #include #include #include /** * main: Starts with an RPTable of 10 resources with data and fetches * them randomly by the Resource Id and compares the data against * the original data. A failed comparison means the test failed, * otherwise the test passed. * * Return value: 0 on success, 1 on failure **/ int main(int argc, char **argv) { RPTable *rptable = (RPTable *)g_malloc0(sizeof(RPTable)); oh_init_rpt(rptable); guint i = 0, k = 0; GSList *resources = NULL; for (i = 0; rptentries[i].ResourceId != 0; i++) { guint *data = (guint *)g_malloc0(sizeof(guint)); *data = rptentries[i].ResourceId; if (oh_add_resource(rptable, rptentries + i, data, 0)) return 1; else resources = g_slist_append(resources, rptentries + i); } for (; resources; i--) { SaHpiRptEntryT *randentry = NULL; guint *data = NULL; GSList *tmpnode = NULL; k = (guint) (((gfloat)i)*rand()/(RAND_MAX+1.0)); tmpnode = g_slist_nth(resources, k); randentry = (SaHpiRptEntryT *)tmpnode->data; data = (guint *) oh_get_resource_data(rptable, randentry->ResourceId); if (!data || *data != randentry->ResourceId) return 1; else { resources = g_slist_remove_link(resources, tmpnode); g_slist_free_1(tmpnode); } } return 0; } openhpi-2.14.1/utils/t/rpt/Makefile.am0000644000076400007640000002401611302567130014436 0ustar # (C) Copyright IBM Corp 2003, 2004 # All rights reserved. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This # file and program are licensed under a BSD style license. See # the Copying file included with the OpenHPI distribution for # full licensing terms. MAINTAINERCLEANFILES = Makefile.in REMOTE_SOURCES = rpt_utils.c \ epath_utils.c \ uid_utils.c \ sahpi_enum_utils.c \ sahpiatca_enum_utils.c \ sahpi_event_encode.c \ sahpi_event_utils.c \ sahpi_struct_utils.c \ sahpi_time_utils.c MOSTLYCLEANFILES = $(REMOTE_SOURCES) @TEST_CLEAN@ INCLUDES = @OPENHPI_INCLUDES@ EXTRA_DIST = rpt_resources.h LIBS += -luuid $(REMOTE_SOURCES): if test ! -f $@ -a ! -L $@; then \ $(LN_S) $(top_srcdir)/utils/$@; \ fi TESTS = rpt_utils_000 \ rpt_utils_001 \ rpt_utils_002 \ rpt_utils_003 \ rpt_utils_004 \ rpt_utils_005 \ rpt_utils_006 \ rpt_utils_007 \ rpt_utils_008 \ rpt_utils_009 \ rpt_utils_010 \ rpt_utils_011 \ rpt_utils_012 \ rpt_utils_013 \ rpt_utils_014 \ rpt_utils_015 \ rpt_utils_016 \ rpt_utils_017 \ rpt_utils_018 \ rpt_utils_019 \ rpt_utils_020 \ rpt_utils_021 \ rpt_utils_022 \ rpt_utils_023 \ rpt_utils_024 \ rpt_utils_025 \ rpt_utils_026 \ rpt_utils_027 \ rpt_utils_028 \ rpt_utils_029 \ rpt_utils_030 \ rpt_utils_031 \ rpt_utils_032 \ rpt_utils_033 \ rpt_utils_034 \ rpt_utils_035 \ rpt_utils_037 \ rpt_utils_038 \ rpt_utils_039 \ rpt_utils_040 \ rpt_utils_041 \ rpt_utils_042 \ rpt_utils_043 \ rpt_utils_044 \ rpt_utils_045 \ rpt_utils_046 \ rpt_utils_047 \ rpt_utils_048 \ rpt_utils_049 \ rpt_utils_050 \ rpt_utils_051 \ rpt_utils_052 \ rpt_utils_053 \ rpt_utils_054 \ rpt_utils_055 \ rpt_utils_056 \ rpt_utils_057 \ rpt_utils_058 \ rpt_utils_059 \ rpt_utils_060 \ rpt_utils_061 \ rpt_utils_062 \ rpt_utils_063 \ rpt_utils_064 \ rpt_utils_065 \ rpt_utils_066 \ rpt_utils_067 \ rpt_utils_068 \ rpt_utils_069 \ rpt_utils_070 \ rpt_utils_071 \ rpt_utils_072 \ rpt_utils_073 \ rpt_utils_074 \ rpt_utils_075 \ rpt_utils_076 \ rpt_utils_077 \ rpt_utils_078 \ rpt_utils_079 \ rpt_utils_080 \ rpt_utils_081 \ rpt_utils_082 \ rpt_utils_1000 check_PROGRAMS = $(TESTS) rpt_utils_000_SOURCES = rpt_utils_000.c nodist_rpt_utils_000_SOURCES = $(REMOTE_SOURCES) rpt_utils_001_SOURCES = rpt_utils_001.c nodist_rpt_utils_001_SOURCES = $(REMOTE_SOURCES) rpt_utils_002_SOURCES = rpt_utils_002.c nodist_rpt_utils_002_SOURCES = $(REMOTE_SOURCES) rpt_utils_003_SOURCES = rpt_utils_003.c nodist_rpt_utils_003_SOURCES = $(REMOTE_SOURCES) rpt_utils_004_SOURCES = rpt_utils_004.c nodist_rpt_utils_004_SOURCES = $(REMOTE_SOURCES) rpt_utils_005_SOURCES = rpt_utils_005.c nodist_rpt_utils_005_SOURCES = $(REMOTE_SOURCES) rpt_utils_006_SOURCES = rpt_utils_006.c nodist_rpt_utils_006_SOURCES = $(REMOTE_SOURCES) rpt_utils_007_SOURCES = rpt_utils_007.c nodist_rpt_utils_007_SOURCES = $(REMOTE_SOURCES) rpt_utils_008_SOURCES = rpt_utils_008.c nodist_rpt_utils_008_SOURCES = $(REMOTE_SOURCES) rpt_utils_009_SOURCES = rpt_utils_009.c nodist_rpt_utils_009_SOURCES = $(REMOTE_SOURCES) rpt_utils_010_SOURCES = rpt_utils_010.c nodist_rpt_utils_010_SOURCES = $(REMOTE_SOURCES) rpt_utils_011_SOURCES = rpt_utils_011.c nodist_rpt_utils_011_SOURCES = $(REMOTE_SOURCES) rpt_utils_012_SOURCES = rpt_utils_012.c nodist_rpt_utils_012_SOURCES = $(REMOTE_SOURCES) rpt_utils_013_SOURCES = rpt_utils_013.c nodist_rpt_utils_013_SOURCES = $(REMOTE_SOURCES) rpt_utils_014_SOURCES = rpt_utils_014.c nodist_rpt_utils_014_SOURCES = $(REMOTE_SOURCES) rpt_utils_015_SOURCES = rpt_utils_015.c nodist_rpt_utils_015_SOURCES = $(REMOTE_SOURCES) rpt_utils_016_SOURCES = rpt_utils_016.c nodist_rpt_utils_016_SOURCES = $(REMOTE_SOURCES) rpt_utils_017_SOURCES = rpt_utils_017.c nodist_rpt_utils_017_SOURCES = $(REMOTE_SOURCES) rpt_utils_018_SOURCES = rpt_utils_018.c nodist_rpt_utils_018_SOURCES = $(REMOTE_SOURCES) rpt_utils_019_SOURCES = rpt_utils_019.c nodist_rpt_utils_019_SOURCES = $(REMOTE_SOURCES) rpt_utils_020_SOURCES = rpt_utils_020.c nodist_rpt_utils_020_SOURCES = $(REMOTE_SOURCES) rpt_utils_021_SOURCES = rpt_utils_021.c nodist_rpt_utils_021_SOURCES = $(REMOTE_SOURCES) rpt_utils_022_SOURCES = rpt_utils_022.c nodist_rpt_utils_022_SOURCES = $(REMOTE_SOURCES) rpt_utils_023_SOURCES = rpt_utils_023.c nodist_rpt_utils_023_SOURCES = $(REMOTE_SOURCES) rpt_utils_024_SOURCES = rpt_utils_024.c nodist_rpt_utils_024_SOURCES = $(REMOTE_SOURCES) rpt_utils_025_SOURCES = rpt_utils_025.c nodist_rpt_utils_025_SOURCES = $(REMOTE_SOURCES) rpt_utils_026_SOURCES = rpt_utils_026.c nodist_rpt_utils_026_SOURCES = $(REMOTE_SOURCES) rpt_utils_027_SOURCES = rpt_utils_027.c nodist_rpt_utils_027_SOURCES = $(REMOTE_SOURCES) rpt_utils_028_SOURCES = rpt_utils_028.c nodist_rpt_utils_028_SOURCES = $(REMOTE_SOURCES) rpt_utils_029_SOURCES = rpt_utils_029.c nodist_rpt_utils_029_SOURCES = $(REMOTE_SOURCES) rpt_utils_030_SOURCES = rpt_utils_030.c nodist_rpt_utils_030_SOURCES = $(REMOTE_SOURCES) rpt_utils_031_SOURCES = rpt_utils_031.c nodist_rpt_utils_031_SOURCES = $(REMOTE_SOURCES) rpt_utils_032_SOURCES = rpt_utils_032.c nodist_rpt_utils_032_SOURCES = $(REMOTE_SOURCES) rpt_utils_033_SOURCES = rpt_utils_033.c nodist_rpt_utils_033_SOURCES = $(REMOTE_SOURCES) rpt_utils_034_SOURCES = rpt_utils_034.c nodist_rpt_utils_034_SOURCES = $(REMOTE_SOURCES) rpt_utils_035_SOURCES = rpt_utils_035.c nodist_rpt_utils_035_SOURCES = $(REMOTE_SOURCES) rpt_utils_037_SOURCES = rpt_utils_037.c nodist_rpt_utils_037_SOURCES = $(REMOTE_SOURCES) rpt_utils_038_SOURCES = rpt_utils_038.c nodist_rpt_utils_038_SOURCES = $(REMOTE_SOURCES) rpt_utils_039_SOURCES = rpt_utils_039.c nodist_rpt_utils_039_SOURCES = $(REMOTE_SOURCES) rpt_utils_040_SOURCES = rpt_utils_040.c nodist_rpt_utils_040_SOURCES = $(REMOTE_SOURCES) rpt_utils_041_SOURCES = rpt_utils_041.c nodist_rpt_utils_041_SOURCES = $(REMOTE_SOURCES) rpt_utils_042_SOURCES = rpt_utils_042.c nodist_rpt_utils_042_SOURCES = $(REMOTE_SOURCES) rpt_utils_043_SOURCES = rpt_utils_043.c nodist_rpt_utils_043_SOURCES = $(REMOTE_SOURCES) rpt_utils_044_SOURCES = rpt_utils_044.c nodist_rpt_utils_044_SOURCES = $(REMOTE_SOURCES) rpt_utils_045_SOURCES = rpt_utils_045.c nodist_rpt_utils_045_SOURCES = $(REMOTE_SOURCES) rpt_utils_046_SOURCES = rpt_utils_046.c nodist_rpt_utils_046_SOURCES = $(REMOTE_SOURCES) rpt_utils_047_SOURCES = rpt_utils_047.c nodist_rpt_utils_047_SOURCES = $(REMOTE_SOURCES) rpt_utils_048_SOURCES = rpt_utils_048.c nodist_rpt_utils_048_SOURCES = $(REMOTE_SOURCES) rpt_utils_049_SOURCES = rpt_utils_049.c nodist_rpt_utils_049_SOURCES = $(REMOTE_SOURCES) rpt_utils_050_SOURCES = rpt_utils_050.c nodist_rpt_utils_050_SOURCES = $(REMOTE_SOURCES) rpt_utils_051_SOURCES = rpt_utils_051.c nodist_rpt_utils_051_SOURCES = $(REMOTE_SOURCES) rpt_utils_052_SOURCES = rpt_utils_052.c nodist_rpt_utils_052_SOURCES = $(REMOTE_SOURCES) rpt_utils_053_SOURCES = rpt_utils_053.c nodist_rpt_utils_053_SOURCES = $(REMOTE_SOURCES) rpt_utils_054_SOURCES = rpt_utils_054.c nodist_rpt_utils_054_SOURCES = $(REMOTE_SOURCES) rpt_utils_055_SOURCES = rpt_utils_055.c nodist_rpt_utils_055_SOURCES = $(REMOTE_SOURCES) rpt_utils_056_SOURCES = rpt_utils_056.c nodist_rpt_utils_056_SOURCES = $(REMOTE_SOURCES) rpt_utils_057_SOURCES = rpt_utils_057.c nodist_rpt_utils_057_SOURCES = $(REMOTE_SOURCES) rpt_utils_058_SOURCES = rpt_utils_058.c nodist_rpt_utils_058_SOURCES = $(REMOTE_SOURCES) rpt_utils_059_SOURCES = rpt_utils_059.c nodist_rpt_utils_059_SOURCES = $(REMOTE_SOURCES) rpt_utils_060_SOURCES = rpt_utils_060.c nodist_rpt_utils_060_SOURCES = $(REMOTE_SOURCES) rpt_utils_061_SOURCES = rpt_utils_061.c nodist_rpt_utils_061_SOURCES = $(REMOTE_SOURCES) rpt_utils_062_SOURCES = rpt_utils_062.c nodist_rpt_utils_062_SOURCES = $(REMOTE_SOURCES) rpt_utils_063_SOURCES = rpt_utils_063.c nodist_rpt_utils_063_SOURCES = $(REMOTE_SOURCES) rpt_utils_064_SOURCES = rpt_utils_064.c nodist_rpt_utils_064_SOURCES = $(REMOTE_SOURCES) rpt_utils_065_SOURCES = rpt_utils_065.c nodist_rpt_utils_065_SOURCES = $(REMOTE_SOURCES) rpt_utils_066_SOURCES = rpt_utils_066.c nodist_rpt_utils_066_SOURCES = $(REMOTE_SOURCES) rpt_utils_067_SOURCES = rpt_utils_067.c nodist_rpt_utils_067_SOURCES = $(REMOTE_SOURCES) rpt_utils_068_SOURCES = rpt_utils_068.c nodist_rpt_utils_068_SOURCES = $(REMOTE_SOURCES) rpt_utils_069_SOURCES = rpt_utils_069.c nodist_rpt_utils_069_SOURCES = $(REMOTE_SOURCES) rpt_utils_070_SOURCES = rpt_utils_070.c nodist_rpt_utils_070_SOURCES = $(REMOTE_SOURCES) rpt_utils_071_SOURCES = rpt_utils_071.c nodist_rpt_utils_071_SOURCES = $(REMOTE_SOURCES) rpt_utils_072_SOURCES = rpt_utils_072.c nodist_rpt_utils_072_SOURCES = $(REMOTE_SOURCES) rpt_utils_073_SOURCES = rpt_utils_073.c nodist_rpt_utils_073_SOURCES = $(REMOTE_SOURCES) rpt_utils_074_SOURCES = rpt_utils_074.c nodist_rpt_utils_074_SOURCES = $(REMOTE_SOURCES) rpt_utils_075_SOURCES = rpt_utils_075.c nodist_rpt_utils_075_SOURCES = $(REMOTE_SOURCES) rpt_utils_076_SOURCES = rpt_utils_076.c nodist_rpt_utils_076_SOURCES = $(REMOTE_SOURCES) rpt_utils_077_SOURCES = rpt_utils_077.c nodist_rpt_utils_077_SOURCES = $(REMOTE_SOURCES) rpt_utils_078_SOURCES = rpt_utils_078.c nodist_rpt_utils_078_SOURCES = $(REMOTE_SOURCES) rpt_utils_079_SOURCES = rpt_utils_079.c nodist_rpt_utils_079_SOURCES = $(REMOTE_SOURCES) rpt_utils_080_SOURCES = rpt_utils_080.c nodist_rpt_utils_080_SOURCES = $(REMOTE_SOURCES) rpt_utils_081_SOURCES = rpt_utils_081.c nodist_rpt_utils_081_SOURCES = $(REMOTE_SOURCES) rpt_utils_082_SOURCES = rpt_utils_082.c nodist_rpt_utils_082_SOURCES = $(REMOTE_SOURCES) rpt_utils_1000_SOURCES = rpt_utils_1000.c nodist_rpt_utils_1000_SOURCES = $(REMOTE_SOURCES) openhpi-2.14.1/utils/t/rpt/rpt_utils_033.c0000644000076400007640000000267511302567130015167 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Renier Morales */ #include #include #include #include #include /** * main: Starting with an empty RPTable, adds 10 resources to it. * Fetches the first resource back by id using SAHPI_FIRST_ENTRY for a Resource Id. * Passes the test if the interface returns the resource, else it fails. * * Return value: 0 on success, 1 on failure **/ int main(int argc, char **argv) { RPTable *rptable = (RPTable *)g_malloc0(sizeof(RPTable)); oh_init_rpt(rptable); SaHpiRptEntryT *tmpentry = NULL; guint i; for (i = 0; rptentries[i].ResourceId != 0; i++) { if (oh_add_resource(rptable, rptentries+i, NULL, 1)) return 1; } tmpentry = oh_get_resource_by_id(rptable, SAHPI_FIRST_ENTRY); if (!tmpentry) return 1; if (tmpentry->ResourceId != rptentries[0].ResourceId) return 1; return 0; } openhpi-2.14.1/utils/t/rpt/rpt_utils_075.c0000644000076400007640000000246511302567130015172 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Renier Morales */ #include #include #include #include #include /** * main: Invokes rpt_diff with new_rdr param as NULL. * If it returns error, the test passes, otherwise it failed. * * Return value: 0 on success, 1 on failure **/ int main(int argc, char **argv) { RPTable *curr_table = (RPTable *)g_malloc0(sizeof(RPTable)); RPTable *new_table = (RPTable *)g_malloc0(sizeof(RPTable)); GSList *new_res = NULL, *gone_res = NULL, *gone_rdr = NULL; oh_init_rpt(curr_table); oh_init_rpt(new_table); if (oh_add_resource(curr_table, rptentries, NULL, 0)) return 1; if (oh_add_resource(new_table, rptentries + 1, NULL, 0)) return 1; if (!rpt_diff(curr_table, new_table, &new_res, NULL, &gone_res, &gone_rdr)) return 1; return 0; } openhpi-2.14.1/utils/t/rpt/rpt_utils_068.c0000644000076400007640000000262311302567130015170 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Renier Morales */ #include #include #include #include #include /** * main: Starting with an empty RPTable, adds 1 resource to it. * Checks rpt info to see if update count was updated. * If not updated, the test failed, otherwise the test passed. * * Return value: 0 on success, 1 on failure **/ int main(int argc, char **argv) { RPTable *rptable = (RPTable *)g_malloc0(sizeof(RPTable)); oh_init_rpt(rptable); SaHpiUint32T update_count, update_count_new; SaHpiTimeT update_timestamp; update_count = rptable->update_count; if (oh_get_rpt_info(rptable, &update_count, &update_timestamp)) return 1; if (oh_add_resource(rptable, rptentries, NULL, 0)) return 1; if (oh_get_rpt_info(rptable, &update_count_new, &update_timestamp)) return 1; if (update_count_new != update_count + 1) return 1; return 0; } openhpi-2.14.1/utils/t/rpt/rpt_utils_062.c0000644000076400007640000000336711302567130015170 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Renier Morales */ #include #include #include #include #include /** * main: Starts with an RPTable of 10 resources (one with data), adds 5 rdr * to first resource and 2 to the last one. * Invokes oh_flush on the table. * Should return without crashing and there should be no resources left * in the table. * * Return value: 0 on success, 1 on failure **/ int main(int argc, char **argv) { RPTable *rptable = (RPTable *)g_malloc0(sizeof(RPTable)); oh_init_rpt(rptable); guint i; gchar *data = "My data."; if (oh_add_resource(rptable, rptentries, data, 1)) return 1; for (i = 1; rptentries[i].ResourceId != 0; i++) { if (oh_add_resource(rptable, rptentries + i, NULL, 0)) return 1; } for (i = 0; i < 5; i++) { if (oh_add_rdr(rptable, SAHPI_FIRST_ENTRY, sensors + i, NULL, 0)) return 1; } for (; i < 7; i++) { if (oh_add_rdr(rptable, rptentries[9].ResourceId, sensors + i, NULL, 0)) return 1; } oh_flush_rpt(rptable); if (oh_get_resource_by_id(rptable, SAHPI_FIRST_ENTRY)) return 1; return 0; } openhpi-2.14.1/utils/t/rpt/rpt_utils_019.c0000644000076400007640000000356411302567130015171 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Renier Morales */ #include #include #include #include #include /** * main: Starts with an RPTable of 10 resources, multiple rdrs * on some resources. Remove rdr. Check if resource was removed * searching for it in sequence. If not fail, else passed test. * * Return value: 0 on success, 1 on failure **/ int main(int argc, char **argv) { RPTable *rptable = (RPTable *)g_malloc0(sizeof(RPTable)); oh_init_rpt(rptable); SaHpiRdrT *tmprdr = NULL; guint i = 0; for (i = 0; rptentries[i].ResourceId != 0; i++) { if (oh_add_resource(rptable, rptentries + i, NULL, 0)) return 1; } for (i = 0; i < 5; i++) { if (oh_add_rdr(rptable, SAHPI_FIRST_ENTRY, sensors + i, NULL,0)) return 1; } for (; i < 7; i++) { if (oh_add_rdr(rptable, rptentries[9].ResourceId, sensors + i, NULL,0)) return 1; } oh_remove_rdr(rptable, rptentries[0].ResourceId, sensors[1].RecordId); for (tmprdr = oh_get_rdr_by_id(rptable, rptentries[0].ResourceId, SAHPI_FIRST_ENTRY); tmprdr; tmprdr = oh_get_rdr_next(rptable, rptentries[0].ResourceId, tmprdr->RecordId)) { if (tmprdr->RecordId == sensors[1].RecordId) return 1; } return 0; } openhpi-2.14.1/utils/t/rpt/rpt_utils_052.c0000644000076400007640000000256311302567130015164 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Renier Morales */ #include #include #include #include #include /** * main: Starts with an RPTable of 1 resource, adds 5 sensors ++to first resource. * Fetches an rdr by id using a Resource Id not present in the table. * Success if the interface returns an error, otherwise there was a failure. * * Return value: 0 on success, 1 on failure **/ int main(int argc, char **argv) { RPTable *rptable = (RPTable *)g_malloc0(sizeof(RPTable)); oh_init_rpt(rptable); guint i; if (oh_add_resource(rptable, rptentries, NULL, 1)) return 1; for (i = 0; i < 5; i++) { if (oh_add_rdr(rptable, rptentries[0].ResourceId, sensors+i, NULL, 1)) return 1; } if (oh_get_rdr_by_id(rptable, rptentries[1].ResourceId, sensors[0].RecordId)) return 1; return 0; } openhpi-2.14.1/utils/t/rpt/rpt_utils_023.c0000644000076400007640000000155111302567130015156 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Renier Morales */ #include #include #include #include /** * main: Starting with a NULL RPTable, adds a NULL resource to it. * Passes the test if the interface returns an error, else it fails. * * Return value: 0 on success, 1 on failure **/ int main(int argc, char **argv) { if (!oh_add_resource(NULL, NULL, NULL, 0)) return 1; return 0; } openhpi-2.14.1/utils/t/rpt/rpt_utils_048.c0000644000076400007640000000244311302567130015166 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Renier Morales */ #include #include #include #include #include /** * main: Starts with an RPTable of 1 resource, adds 1 rdr with data * to first resource. Fetches data using a NULL table. * Success if the interface returns an error, otherwise there was a failure. * * Return value: 0 on success, 1 on failure **/ int main(int argc, char **argv) { RPTable *rptable = (RPTable *)g_malloc0(sizeof(RPTable)); oh_init_rpt(rptable); gchar *data = "My data"; if (oh_add_resource(rptable, rptentries, NULL, 1)) return 1; if (oh_add_rdr(rptable, rptentries[0].ResourceId, sensors, data, 1)) return 1; if (oh_get_rdr_data(NULL, rptentries[0].ResourceId, sensors[0].RecordId)) return 1; return 0; } openhpi-2.14.1/utils/t/rpt/rpt_utils_013.c0000644000076400007640000000333211302567130015154 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Renier Morales * */ #include #include #include #include #include /** * main: Starts with an RPTable of 10 resources, adds 5 rdr * to first resource. Fetches sensors ++in sequence by record id and compares * with original. A failed comparison means the test failed, * otherwise the test passed. * * Return value: 0 on success, 1 on failure **/ int main(int argc, char **argv) { RPTable *rptable = (RPTable *)g_malloc0(sizeof(RPTable)); oh_init_rpt(rptable); SaHpiRdrT *tmprdr = NULL; guint i = 0; for (i = 0; rptentries[i].ResourceId != 0; i++) { if (oh_add_resource(rptable, rptentries + i, NULL, 0)) return 1; } for (i = 0; i < 5; i++) { if (oh_add_rdr(rptable, SAHPI_FIRST_ENTRY, sensors + i, NULL,0)) return 1; } for (i = 0, tmprdr = oh_get_rdr_by_id(rptable, SAHPI_FIRST_ENTRY, SAHPI_FIRST_ENTRY); tmprdr; tmprdr = oh_get_rdr_next(rptable, SAHPI_FIRST_ENTRY, tmprdr->RecordId)) { if (memcmp(sensors + (i++), tmprdr, sizeof(SaHpiRdrT))) return 1; } return 0; } openhpi-2.14.1/utils/t/rpt/rpt_utils_067.c0000644000076400007640000000250011302567130015161 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Renier Morales */ #include #include #include #include #include /** * main: Starting with an empty RPTable, adds 10 resources to it * and then adds 1 rdr to it with an out-of-range instrument id. * Passes the test if the interface returns an error, else it fails. * * Return value: 0 on success, 1 on failure **/ int main(int argc, char **argv) { RPTable *rptable = (RPTable *)g_malloc0(sizeof(RPTable)); oh_init_rpt(rptable); guint i; for (i = 0; rptentries[i].ResourceId; i++) { if (oh_add_resource(rptable, rptentries+i, NULL, 0)) return 1; } sensors[0].RdrTypeUnion.SensorRec.Num = SAHPI_STANDARD_SENSOR_MAX - 1; if (!oh_add_rdr(rptable, SAHPI_FIRST_ENTRY, sensors, NULL, 1)) return 1; return 0; } openhpi-2.14.1/utils/t/rpt/rpt_utils_038.c0000644000076400007640000000235611302567130015170 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Renier Morales */ #include #include #include #include #include /** * main: Adds 2 resources to an rpt table. * Fetches the 2nd resource through the get_next call * using a Resource Id not present in the table. * Passes the test if the interface returns NULL, else it fails. * * Return value: 0 on success, 1 on failure **/ int main(int argc, char **argv) { RPTable *rptable = (RPTable *)g_malloc0(sizeof(RPTable)); oh_init_rpt(rptable); guint i; for (i = 0; rptentries[i].ResourceId != 0; i++) { if (oh_add_resource(rptable, rptentries+i, NULL, 1)) return 1; } if (oh_get_resource_next(rptable, 1234567)) return 1; return 0; } openhpi-2.14.1/utils/t/rpt/rpt_utils_081.c0000644000076400007640000000461511302567130015166 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Renier Morales */ #include #include #include #include #include #include /** * main: Starts with an RPTable of 10 resources, adds 5 watchdog rdr * to first resource. Fetches watchdogs ++randomly by record id and compares * with original. A failed comparison means the test failed, * otherwise the test passed. * * Return value: 0 on success, 1 on failure **/ int main(int argc, char **argv) { RPTable *rptable = (RPTable *)g_malloc0(sizeof(RPTable)); oh_init_rpt(rptable); GSList *records = NULL; guint i = 0; for (i = 0; rptentries[i].ResourceId != 0; i++) { if (oh_add_resource(rptable, rptentries + i, NULL, 0)) return 1; } for (i = 0; i < 5; i++) { if (oh_add_rdr(rptable, SAHPI_FIRST_ENTRY, watchdogs + i, NULL,0)) return 1; else records = g_slist_append(records, watchdogs + i); } for (; records; i--) { SaHpiRdrT *tmprdr = NULL, *randrdr = NULL; GSList *tmpnode = NULL; guint k = (guint) (((gfloat)i)*rand()/(RAND_MAX+1.0)); tmpnode = g_slist_nth(records, k); randrdr = (SaHpiRdrT *)tmpnode->data; randrdr->RecordId = oh_get_rdr_uid(randrdr->RdrType, randrdr->RdrTypeUnion.WatchdogRec.WatchdogNum); tmprdr = oh_get_rdr_by_id(rptable, SAHPI_FIRST_ENTRY, randrdr->RecordId); if (!tmprdr || memcmp(randrdr, tmprdr, sizeof(SaHpiRdrT))) return 1; else { records = g_slist_remove_link(records, tmpnode); g_slist_free_1(tmpnode); } } return 0; } openhpi-2.14.1/utils/t/rpt/rpt_utils_027.c0000644000076400007640000000226611302567130015166 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Renier Morales */ #include #include #include #include #include /** * main: Starting with an empty RPTable, adds 1 resource to it with data. * Fetches the data back using a NULL table as a parameter. * Passes the test if the interface returns NULL, else it fails. * * Return value: 0 on success, 1 on failure **/ int main(int argc, char **argv) { RPTable *rptable = (RPTable *)g_malloc0(sizeof(RPTable)); oh_init_rpt(rptable); gchar *data = "My data"; if (oh_add_resource(rptable, rptentries, data, KEEP_RPT_DATA)) return 1; if (oh_get_resource_data(NULL, rptentries[0].ResourceId)) return 1; return 0; } openhpi-2.14.1/utils/t/rpt/rpt_utils_074.c0000644000076400007640000000246511302567130015171 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Renier Morales */ #include #include #include #include #include /** * main: Invokes rpt_diff with new_res param as NULL. * If it returns error, the test passes, otherwise it failed. * * Return value: 0 on success, 1 on failure **/ int main(int argc, char **argv) { RPTable *curr_table = (RPTable *)g_malloc0(sizeof(RPTable)); RPTable *new_table = (RPTable *)g_malloc0(sizeof(RPTable)); GSList *new_rdr = NULL, *gone_res = NULL, *gone_rdr = NULL; oh_init_rpt(curr_table); oh_init_rpt(new_table); if (oh_add_resource(curr_table, rptentries, NULL, 0)) return 1; if (oh_add_resource(new_table, rptentries + 1, NULL, 0)) return 1; if (!rpt_diff(curr_table, new_table, NULL, &new_rdr, &gone_res, &gone_rdr)) return 1; return 0; } openhpi-2.14.1/utils/t/rpt/rpt_utils_058.c0000644000076400007640000000255711302567130015175 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Renier Morales */ #include #include #include #include #include /** * main: Starts with an RPTable of 1 resource, adds 5 sensors ++to first resource. * Fetches an rdr using get_next with a Record Id not present in the resource. * Success if the interface returns an error, otherwise there was a failure. * * Return value: 0 on success, 1 on failure **/ int main(int argc, char **argv) { RPTable *rptable = (RPTable *)g_malloc0(sizeof(RPTable)); oh_init_rpt(rptable); guint i; if (oh_add_resource(rptable, rptentries, NULL, 1)) return 1; for (i = 0; i < 5; i++) { if (oh_add_rdr(rptable, rptentries[0].ResourceId, sensors+i, NULL, 1)) return 1; } if (oh_get_rdr_next(rptable, rptentries[0].ResourceId, 1234567)) return 1; return 0; } openhpi-2.14.1/utils/t/rpt/rpt_utils_045.c0000644000076400007640000000237311302567130015165 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Renier Morales */ #include #include #include #include #include /** * main: Starting with an empty RPTable, adds 1 resource to it * and then adds 1 rdr to it. Removes rdr using a NULL table. * Passes the test if the interface returns an error, else it fails. * * Return value: 0 on success, 1 on failure **/ int main(int argc, char **argv) { RPTable *rptable = (RPTable *)g_malloc0(sizeof(RPTable)); oh_init_rpt(rptable); if (oh_add_resource(rptable, rptentries, NULL, 0)) return 1; if (oh_add_rdr(rptable, rptentries[0].ResourceId, sensors, NULL, 1)) return 1; if (!oh_remove_rdr(NULL, rptentries[0].ResourceId, sensors[0].RecordId)) return 1; return 0; } openhpi-2.14.1/utils/t/rpt/rpt_utils_022.c0000644000076400007640000000213411302567130015153 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Renier Morales */ #include #include #include #include #include /** * main: Starting with an empty RPTable, adds 1 resource to it * that has an invalid Resource Id like SAHPI_FIRST_ENTRY. * Passes the test if the interface returns an error, else it fails. * * Return value: 0 on success, 1 on failure **/ int main(int argc, char **argv) { RPTable *rptable = (RPTable *)g_malloc0(sizeof(RPTable)); oh_init_rpt(rptable); rptentries[0].ResourceId = SAHPI_FIRST_ENTRY; if (!oh_add_resource(rptable, rptentries, NULL, 0)) return 1; return 0; } openhpi-2.14.1/utils/t/rpt/rpt_utils_034.c0000644000076400007640000000221311302567130015154 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Renier Morales */ #include #include #include #include #include /** * main: Starting with an empty RPTable, adds 1 resource to it. * Fetches the resource back by entity path using a NULL table. * Passes the test if the interface returns NULL, else it fails. * * Return value: 0 on success, 1 on failure **/ int main(int argc, char **argv) { RPTable *rptable = (RPTable *)g_malloc0(sizeof(RPTable)); oh_init_rpt(rptable); if (oh_add_resource(rptable, rptentries, NULL, 1)) return 1; if (oh_get_resource_by_ep(NULL, &(rptentries[0].ResourceEntity))) return 1; return 0; } openhpi-2.14.1/utils/t/rpt/rpt_utils_030.c0000644000076400007640000000244411302567130015156 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Renier Morales */ #include #include #include #include #include /** * main: Starting with an empty RPTable, adds one resource to it with NULL data * and another with data. * Fetches the resource's NULL data back. * Passes the test if the interface returns the NULL data, else it fails. * * Return value: 0 on success, 1 on failure **/ int main(int argc, char **argv) { RPTable *rptable = (RPTable *)g_malloc0(sizeof(RPTable)); oh_init_rpt(rptable); gchar *data = "My data"; if (oh_add_resource(rptable, rptentries, data, 1)) return 1; if (oh_add_resource(rptable, rptentries+1, NULL, 1)) return 1; if (oh_get_resource_data(rptable, rptentries[1].ResourceId)) return 1; return 0; } openhpi-2.14.1/utils/t/rpt/rpt_utils_004.c0000644000076400007640000000407611302567130015162 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Renier Morales */ #include #include #include #include #include #include /** * main: Starts with an RPTable of 10 resources and fetches * them randomly by the Entity Path and compares them against the original * resource. A failed comparison means the test failed, * otherwise the test passed. * * Return value: 0 on success, 1 on failure **/ int main(int argc, char **argv) { RPTable *rptable = (RPTable *)g_malloc0(sizeof(RPTable)); oh_init_rpt(rptable); guint i = 0, k = 0; GSList *resources = NULL; for (i = 0; rptentries[i].ResourceId != 0; i++) { if (oh_add_resource(rptable, rptentries + i, NULL, 0)) return 1; else resources = g_slist_append(resources, rptentries + i); } for (; resources; i--) { SaHpiRptEntryT *randentry = NULL, *tmpentry = NULL; GSList *tmpnode = NULL; k = (guint) (((gfloat)i)*rand()/(RAND_MAX+1.0)); tmpnode = g_slist_nth(resources, k); randentry = (SaHpiRptEntryT *)tmpnode->data; tmpentry = oh_get_resource_by_ep(rptable, &(randentry->ResourceEntity)); if (!tmpentry || memcmp(randentry, tmpentry, sizeof(SaHpiRptEntryT))) return 1; else { resources = g_slist_remove_link(resources, tmpnode); g_slist_free_1(tmpnode); } } return 0; } openhpi-2.14.1/utils/t/rpt/rpt_utils_015.c0000644000076400007640000000332011302567130015153 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Renier Morales */ #include #include #include #include #include /** * main: Starts with an RPTable of 10 resources, multiple rdrs * on some resources. Remove resource. Check if resource was removed * searching for it by entity path. If not fail, else passed test. * * Return value: 0 on success, 1 on failure **/ int main(int argc, char **argv) { RPTable *rptable = (RPTable *)g_malloc0(sizeof(RPTable)); oh_init_rpt(rptable); SaHpiRptEntryT *tmpentry = NULL; guint i = 0; for (i = 0; rptentries[i].ResourceId != 0; i++) { if (oh_add_resource(rptable, rptentries + i, NULL, 0)) return 1; } for (i = 0; i < 5; i++) { if (oh_add_rdr(rptable, SAHPI_FIRST_ENTRY, sensors + i, NULL,0)) return 1; } for (; i < 7; i++) { if (oh_add_rdr(rptable, rptentries[9].ResourceId, sensors + i, NULL,0)) return 1; } oh_remove_resource(rptable, rptentries[0].ResourceId); tmpentry = oh_get_resource_by_ep(rptable, &(rptentries[0].ResourceEntity)); if (tmpentry) return 1; return 0; } openhpi-2.14.1/utils/t/rpt/rpt_utils_018.c0000644000076400007640000000344611302567130015167 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Renier Morales */ #include #include #include #include #include /** * main: Starts with an RPTable of 10 resources, multiple rdrs * on some resources. Remove rdr. Check if resource was removed * searching for it by type. If not fail, else passed test. * * Return value: 0 on success, 1 on failure **/ int main(int argc, char **argv) { RPTable *rptable = (RPTable *)g_malloc0(sizeof(RPTable)); oh_init_rpt(rptable); SaHpiRdrT *tmprdr = NULL; guint i = 0; for (i = 0; rptentries[i].ResourceId != 0; i++) { if (oh_add_resource(rptable, rptentries + i, NULL, 0)) return 1; } for (i = 0; i < 5; i++) { if (oh_add_rdr(rptable, SAHPI_FIRST_ENTRY, sensors + i, NULL,0)) return 1; } for (; i < 7; i++) { if (oh_add_rdr(rptable, rptentries[9].ResourceId, sensors + i, NULL,0)) return 1; } oh_remove_rdr(rptable, rptentries[0].ResourceId, sensors[1].RecordId); tmprdr = oh_get_rdr_by_type(rptable, rptentries[0].ResourceId, sensors[1].RdrType, sensors[1].RdrTypeUnion.SensorRec.Num); if (tmprdr) return 1; return 0; } openhpi-2.14.1/utils/t/rpt/rpt_utils_1000.c0000644000076400007640000000330411302567130015230 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Renier Morales */ #include #include #include #include #include #include /** * main: Adds 100 resources to RPTable. Fetches the hundredth resource * and times how long it took to fetch it. Fails if it can't get the resource. * * Return value: 0 on success, 1 on failure **/ int main(int argc, char **argv) { RPTable *rptable = (RPTable *)g_malloc0(sizeof(RPTable)); oh_init_rpt(rptable); guint i = 0; struct timeval start, end; SaHpiRptEntryT *tmpentry = NULL; for (i = 1; i <= 10000; i++) { rptentries[0].ResourceId = i; rptentries[0].ResourceEntity.Entry[0].EntityLocation = i; oh_add_resource(rptable, rptentries, NULL, 0); } gettimeofday(&start, NULL); /*printf("Started at %ld.%ld\n",start.tv_sec,start.tv_usec);*/ if (!(tmpentry = oh_get_resource_by_ep(rptable, &(rptentries[0].ResourceEntity)))) return 1; gettimeofday(&end, NULL); /*printf("Ended at %ld.%ld\n",end.tv_sec,end.tv_usec);*/ printf("%ld.%ld seconds elapsed.\n",(long)(end.tv_sec - start.tv_sec),(long)(end.tv_usec - start.tv_usec)); return 0; } openhpi-2.14.1/utils/t/rpt/rpt_utils_082.c0000644000076400007640000000461711302567130015171 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Renier Morales */ #include #include #include #include #include #include /** * main: Starts with an RPTable of 10 resources, adds 5 annunciator rdr * to first resource. Fetches annunciators ++randomly by record id and compares * with original. A failed comparison means the test failed, * otherwise the test passed. * * Return value: 0 on success, 1 on failure **/ int main(int argc, char **argv) { RPTable *rptable = (RPTable *)g_malloc0(sizeof(RPTable)); oh_init_rpt(rptable); GSList *records = NULL; guint i = 0; for (i = 0; rptentries[i].ResourceId != 0; i++) { if (oh_add_resource(rptable, rptentries + i, NULL, 0)) return 1; } for (i = 0; i < 5; i++) { if (oh_add_rdr(rptable, SAHPI_FIRST_ENTRY, annunciators + i, NULL,0)) return 1; else records = g_slist_append(records, annunciators + i); } for (; records; i--) { SaHpiRdrT *tmprdr = NULL, *randrdr = NULL; GSList *tmpnode = NULL; guint k = (guint) (((gfloat)i)*rand()/(RAND_MAX+1.0)); tmpnode = g_slist_nth(records, k); randrdr = (SaHpiRdrT *)tmpnode->data; randrdr->RecordId = oh_get_rdr_uid(randrdr->RdrType, randrdr->RdrTypeUnion.SensorRec.Num); tmprdr = oh_get_rdr_by_id(rptable, SAHPI_FIRST_ENTRY, randrdr->RecordId); if (!tmprdr || memcmp(randrdr, tmprdr, sizeof(SaHpiRdrT))) return 1; else { records = g_slist_remove_link(records, tmpnode); g_slist_free_1(tmpnode); } } return 0; } openhpi-2.14.1/utils/t/rpt/rpt_utils_011.c0000644000076400007640000000460411302567130015155 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Renier Morales */ #include #include #include #include #include #include /** * main: Starts with an RPTable of 10 resources, adds 5 rdr * to first resource. Fetches sensors ++randomly by record id and compares * with original. A failed comparison means the test failed, * otherwise the test passed. * * Return value: 0 on success, 1 on failure **/ int main(int argc, char **argv) { RPTable *rptable = (RPTable *)g_malloc0(sizeof(RPTable)); oh_init_rpt(rptable); GSList *records = NULL; guint i = 0; for (i = 0; rptentries[i].ResourceId != 0; i++) { if (oh_add_resource(rptable, rptentries + i, NULL, 0)) return 1; } for (i = 0; i < 5; i++) { if (oh_add_rdr(rptable, SAHPI_FIRST_ENTRY, sensors + i, NULL,0)) return 1; else records = g_slist_append(records, sensors + i); } for (; records; i--) { SaHpiRdrT *tmprdr = NULL, *randrdr = NULL; GSList *tmpnode = NULL; guint k = (guint) (((gfloat)i)*rand()/(RAND_MAX+1.0)); tmpnode = g_slist_nth(records, k); randrdr = (SaHpiRdrT *)tmpnode->data; randrdr->RecordId = oh_get_rdr_uid(randrdr->RdrType, randrdr->RdrTypeUnion.SensorRec.Num); tmprdr = oh_get_rdr_by_id(rptable, SAHPI_FIRST_ENTRY, randrdr->RecordId); if (!tmprdr || memcmp(randrdr, tmprdr, sizeof(SaHpiRdrT))) return 1; else { records = g_slist_remove_link(records, tmpnode); g_slist_free_1(tmpnode); } } return 0; } openhpi-2.14.1/utils/t/rpt/rpt_utils_024.c0000644000076400007640000000216311302567130015157 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Renier Morales */ #include #include #include #include #include /** * main: Starting with an empty RPTable, adds 1 resource to it * and removes it by specifying a NULL table. * Passes the test if the interface returns an error, else it fails. * * Return value: 0 on success, 1 on failure **/ int main(int argc, char **argv) { RPTable *rptable = (RPTable *)g_malloc0(sizeof(RPTable)); oh_init_rpt(rptable); if (oh_add_resource(rptable, rptentries, NULL, 0)) return 1; if (!oh_remove_resource(NULL, rptentries[0].ResourceId)) return 1; return 0; } openhpi-2.14.1/utils/t/rpt/rpt_utils_057.c0000644000076400007640000000257211302567130015171 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Renier Morales */ #include #include #include #include #include /** * main: Starts with an RPTable of 1 resource, adds 5 sensors ++to first resource. * Fetches an rdr using get_next with a Resource Id not present in the table. * Success if the interface returns an error, otherwise there was a failure. * * Return value: 0 on success, 1 on failure **/ int main(int argc, char **argv) { RPTable *rptable = (RPTable *)g_malloc0(sizeof(RPTable)); oh_init_rpt(rptable); guint i; if (oh_add_resource(rptable, rptentries, NULL, 1)) return 1; for (i = 0; i < 5; i++) { if (oh_add_rdr(rptable, rptentries[0].ResourceId, sensors+i, NULL, 1)) return 1; } if (oh_get_rdr_next(rptable, rptentries[1].ResourceId, sensors[0].RecordId)) return 1; return 0; } openhpi-2.14.1/utils/t/rpt/rpt_utils_059.c0000644000076400007640000000257411302567130015175 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Renier Morales */ #include #include #include #include #include /** * main: Starts with an RPTable of 1 resource, adds 5 sensors ++to first resource. * Fetches an rdr using get_next with the Record Id as SAHPI_FIRST_ENTRY. * Success if the interface returns a valid pointer, otherwise there was a failure. * * Return value: 0 on success, 1 on failure **/ int main(int argc, char **argv) { RPTable *rptable = (RPTable *)g_malloc0(sizeof(RPTable)); oh_init_rpt(rptable); guint i; if (oh_add_resource(rptable, rptentries, NULL, 1)) return 1; for (i = 0; i < 5; i++) { if (oh_add_rdr(rptable, rptentries[0].ResourceId, sensors+i, NULL, 1)) return 1; } if (!oh_get_rdr_next(rptable, rptentries[0].ResourceId, SAHPI_FIRST_ENTRY)) return 1; return 0; } openhpi-2.14.1/utils/t/rpt/rpt_utils_063.c0000644000076400007640000000257111302567130015165 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Renier Morales */ #include #include #include #include #include /** * main: Starting with an empty RPTable, adds 1 resource to it * and then adds 1 rdr to it. Removes rdr using a special value like * SAHPI_FIRST_ENTRY. * Passes the test if the interface returns ok, else it fails. * * Return value: 0 on success, 1 on failure **/ int main(int argc, char **argv) { RPTable *rptable = (RPTable *)g_malloc0(sizeof(RPTable)); oh_init_rpt(rptable); guint i; for (i = 0; rptentries[i].ResourceId != 0; i++) { if (oh_add_resource(rptable, rptentries+i, NULL, 0)) return 1; } if (oh_add_rdr(rptable, rptentries[0].ResourceId, sensors, NULL, 1)) return 1; if (oh_remove_rdr(rptable, rptentries[0].ResourceId, SAHPI_FIRST_ENTRY)) return 1; return 0; } openhpi-2.14.1/utils/t/rpt/rpt_utils_044.c0000644000076400007640000000220211302567130015153 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Renier Morales */ #include #include #include #include #include /** * main: Starting with an empty RPTable, adds 1 resource to it * and then adds 1 NULL rdr to it using a NULL table. * Passes the test if the interface returns an error, else it fails. * * Return value: 0 on success, 1 on failure **/ int main(int argc, char **argv) { RPTable *rptable = (RPTable *)g_malloc0(sizeof(RPTable)); oh_init_rpt(rptable); if (oh_add_resource(rptable, rptentries, NULL, 0)) return 1; if (!oh_add_rdr(NULL, rptentries[0].ResourceId, NULL, NULL, 1)) return 1; return 0; } openhpi-2.14.1/utils/t/rpt/rpt_utils_040.c0000644000076400007640000000234011302567130015152 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Renier Morales */ #include #include #include #include #include /** * main: Adds 10 resources to an rpt table. * Uses the get_next call with the table's last Resource Id. * Passes the test if the interface returns NULL, else it fails. * * Return value: 0 on success, 1 on failure **/ int main(int argc, char **argv) { RPTable *rptable = (RPTable *)g_malloc0(sizeof(RPTable)); oh_init_rpt(rptable); guint i; for (i = 0; rptentries[i].ResourceId != 0; i++) { if (oh_add_resource(rptable, rptentries+i, NULL, 1)) return 1; } if (oh_get_resource_next(rptable, rptentries[i-1].ResourceId)) return 1; return 0; } openhpi-2.14.1/utils/t/rpt/rpt_utils_078.c0000644000076400007640000000325111302567130015167 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Renier Morales */ #include #include #include #include #include /** * main: resource must NOT have SAHPI_CAPABILITY_AGGREGATE_STATUS capability, * sensor num should be between SAHPI_STANDARD_SENSOR_MIN and * SAHPI_STANDARD_SENSOR_MAX and less than SENSOR_AGGREGATE_MAX. * With these conditions, oh_add_rdr is expected to return an error. * This is because for a sensor to have a num in the reserved range, * the resource must have SAHPI_CAPABILITY_AGGREGATE_STATUS capability * set. * If so, the test passes, otherwise it failed. * * Return value: 0 on success, 1 on failure **/ int main(int argc, char **argv) { RPTable *rptable = (RPTable *)g_malloc0(sizeof(RPTable)); oh_init_rpt(rptable); guint i; rptentries[0].ResourceCapabilities = rptentries[0].ResourceCapabilities & 0xFFFFDFFF; for (i = 0; rptentries[i].ResourceId; i++) { if (oh_add_resource(rptable, rptentries+i, NULL, 0)) return 1; } sensors[0].RdrTypeUnion.SensorRec.Num = SAHPI_STANDARD_SENSOR_MIN; if (!oh_add_rdr(rptable, SAHPI_FIRST_ENTRY, sensors, NULL, 1)) return 1; return 0; } openhpi-2.14.1/utils/t/rpt/rpt_utils_000.c0000644000076400007640000000245111302567130015151 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Renier Morales */ #include #include #include #include #include /** * main: Starting with an empty RPTable, adds 1 resource to it * and tries to fetch it by the ResourceId and compare it against * the original resource. A failed comparison means the test * failed, otherwise the test passed. * * Return value: 0 on success, 1 on failure **/ int main(int argc, char **argv) { RPTable *rptable = (RPTable *)g_malloc0(sizeof(RPTable)); oh_init_rpt(rptable); SaHpiRptEntryT *tmpentry = NULL; if (oh_add_resource(rptable, rptentries, NULL, 0)) return 1; tmpentry = oh_get_resource_by_id(rptable, rptentries[0].ResourceId); if (!tmpentry || memcmp(rptentries, tmpentry, sizeof(SaHpiRptEntryT))) return 1; return 0; } openhpi-2.14.1/utils/t/rpt/rpt_utils_072.c0000644000076400007640000000245711302567130015170 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Renier Morales */ #include #include #include #include #include /** * main: Invokes rpt_diff with current table param as NULL. * If it returns error, the test passes, otherwise it failed. * * Return value: 0 on success, 1 on failure **/ int main(int argc, char **argv) { RPTable *curr_table = (RPTable *)g_malloc0(sizeof(RPTable)); RPTable *new_table = (RPTable *)g_malloc0(sizeof(RPTable)); GSList *new_res, *new_rdr, *gone_res, *gone_rdr; oh_init_rpt(curr_table); oh_init_rpt(new_table); if (oh_add_resource(curr_table, rptentries, NULL, 0)) return 1; if (oh_add_resource(new_table, rptentries + 1, NULL, 0)) return 1; if (!rpt_diff(NULL, new_table, &new_res, &new_rdr, &gone_res, &gone_rdr)) return 1; return 0; } openhpi-2.14.1/utils/t/rpt/rpt_utils_014.c0000644000076400007640000000326011302567130015155 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Renier Morales */ #include #include #include #include #include /** * main: Starts with an RPTable of 10 resources, multiple rdrs * on some resources. Remove resource. Check if resource was removed * searching for it by id. If not fail, else passed test. * * Return value: 0 on success, 1 on failure **/ int main(int argc, char **argv) { RPTable *rptable = (RPTable *)g_malloc0(sizeof(RPTable)); oh_init_rpt(rptable); SaHpiRptEntryT *tmpentry = NULL; guint i = 0; for (i = 0; rptentries[i].ResourceId != 0; i++) { if (oh_add_resource(rptable, rptentries + i, NULL, 0)) return 1; } for (i = 0; i < 5; i++) { if (oh_add_rdr(rptable, SAHPI_FIRST_ENTRY, sensors + i, NULL,0)) return 1; } for (; i < 7; i++) { if (oh_add_rdr(rptable, rptentries[9].ResourceId, sensors + i, NULL,0)) return 1; } oh_remove_resource(rptable, rptentries[0].ResourceId); tmpentry = oh_get_resource_by_id(rptable, rptentries[0].ResourceId); if (tmpentry) return 1; return 0; } openhpi-2.14.1/utils/t/rpt/rpt_utils_056.c0000644000076400007640000000253511302567130015167 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Renier Morales */ #include #include #include #include #include /** * main: Starts with an RPTable of 1 resource, adds 5 sensors ++to first resource. * Fetches an rdr using get_next with a NULL table. * Success if the interface returns an error, otherwise there was a failure. * * Return value: 0 on success, 1 on failure **/ int main(int argc, char **argv) { RPTable *rptable = (RPTable *)g_malloc0(sizeof(RPTable)); oh_init_rpt(rptable); guint i; if (oh_add_resource(rptable, rptentries, NULL, 1)) return 1; for (i = 0; i < 5; i++) { if (oh_add_rdr(rptable, rptentries[0].ResourceId, sensors+i, NULL, 1)) return 1; } if (oh_get_rdr_next(NULL, rptentries[0].ResourceId, sensors[0].RecordId)) return 1; return 0; } openhpi-2.14.1/utils/t/rpt/rpt_utils_043.c0000644000076400007640000000216311302567130015160 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Renier Morales */ #include #include #include #include #include /** * main: Starting with an empty RPTable, adds 1 resource to it * and then adds 1 NULL rdr to it. * Passes the test if the interface returns an error, else it fails. * * Return value: 0 on success, 1 on failure **/ int main(int argc, char **argv) { RPTable *rptable = (RPTable *)g_malloc0(sizeof(RPTable)); oh_init_rpt(rptable); if (oh_add_resource(rptable, rptentries, NULL, 0)) return 1; if (!oh_add_rdr(rptable, rptentries[0].ResourceId, NULL, NULL, 1)) return 1; return 0; } openhpi-2.14.1/utils/t/rpt/rpt_utils_066.c0000644000076400007640000000216011302567130015162 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Renier Morales */ #include #include #include #include #include /** * main: Starting with an empty RPTable, adds 1 resource to it * that has an invalid Resource Id like SAHPI_UNSPECIFIED_DOMAIN_ID. * Passes the test if the interface returns an error, else it fails. * * Return value: 0 on success, 1 on failure **/ int main(int argc, char **argv) { RPTable *rptable = (RPTable *)g_malloc0(sizeof(RPTable)); oh_init_rpt(rptable); rptentries[0].ResourceId = SAHPI_UNSPECIFIED_DOMAIN_ID; if (!oh_add_resource(rptable, rptentries, NULL, 0)) return 1; return 0; } openhpi-2.14.1/utils/t/rpt/rpt_utils_010.c0000644000076400007640000000344411302567130015155 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Renier Morales */ #include #include #include #include #include /** * main: Starts with an RPTable of 10 resources, adds 1 rdr * to first resource. Fetches rdr by its type and num and compares * with original. A failed comparison means the test failed, * otherwise the test passed. * * Return value: 0 on success, 1 on failure **/ int main(int argc, char **argv) { RPTable *rptable = (RPTable *)g_malloc0(sizeof(RPTable)); oh_init_rpt(rptable); SaHpiEntryIdT record_id; SaHpiRdrT *tmprdr = NULL; guint i = 0; for (i = 0; rptentries[i].ResourceId != 0; i++) { if (oh_add_resource(rptable, rptentries + i, NULL, 0)) return 1; } if (oh_add_rdr(rptable, SAHPI_FIRST_ENTRY, sensors, NULL,0)) return 1; record_id = oh_get_rdr_uid(sensors[0].RdrType, sensors[0].RdrTypeUnion.SensorRec.Num); sensors[0].RecordId = record_id; tmprdr = oh_get_rdr_by_type(rptable, SAHPI_FIRST_ENTRY, sensors[0].RdrType, sensors[0].RdrTypeUnion.SensorRec.Num); if (!tmprdr || memcmp(sensors, tmprdr, sizeof(SaHpiRdrT))) return 1; return 0; } openhpi-2.14.1/utils/t/rpt/rpt_utils_046.c0000644000076400007640000000257111302567130015166 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Renier Morales */ #include #include #include #include #include /** * main: Starting with an empty RPTable, adds 1 resource to it * and then adds 1 rdr to it. Removes rdr using a Resource Id not present * in the table. * Passes the test if the interface returns an error, else it fails. * * Return value: 0 on success, 1 on failure **/ int main(int argc, char **argv) { RPTable *rptable = (RPTable *)g_malloc0(sizeof(RPTable)); oh_init_rpt(rptable); guint i; for (i = 0; rptentries[i].ResourceId != 0; i++) { if (oh_add_resource(rptable, rptentries+i, NULL, 0)) return 1; } if (oh_add_rdr(rptable, rptentries[0].ResourceId, sensors, NULL, 1)) return 1; if (!oh_remove_rdr(rptable, 1234567, sensors[0].RecordId)) return 1; return 0; } openhpi-2.14.1/utils/t/rpt/rpt_utils_032.c0000644000076400007640000000241011302567130015151 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Renier Morales */ #include #include #include #include #include /** * main: Starting with an empty RPTable, adds 10 resources to it. * Fetches the resource back by id using a Resource Id not present in the table. * Passes the test if the interface returns NULL, else it fails. * * Return value: 0 on success, 1 on failure **/ int main(int argc, char **argv) { RPTable *rptable = (RPTable *)g_malloc0(sizeof(RPTable)); oh_init_rpt(rptable); guint i; for (i = 0; rptentries[i].ResourceId != 0; i++) { if (oh_add_resource(rptable, rptentries+i, NULL, 1)) return 1; } if (oh_get_resource_by_id(rptable, 1234567)) return 1; return 0; } openhpi-2.14.1/utils/t/rpt/rpt_utils_006.c0000644000076400007640000000304011302567130015152 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Renier Morales */ #include #include #include #include #include /** * main: Starts with an RPTable of 10 resources, starting at * the beginning on going on to the next, compares * resource ids against the originals. A failed comparison * means the test failed, otherwise the test passed. * * Return value: 0 on success, 1 on failure **/ int main(int argc, char **argv) { RPTable *rptable = (RPTable *)g_malloc0(sizeof(RPTable)); oh_init_rpt(rptable); SaHpiRptEntryT *tmpentry = NULL; guint i = 0; for (i = 0; rptentries[i].ResourceId != 0; i++) { if (oh_add_resource(rptable, rptentries + i, NULL, 0)) return 1; } for (i = 0, tmpentry = oh_get_resource_by_id(rptable, SAHPI_FIRST_ENTRY); tmpentry; tmpentry = oh_get_resource_next(rptable, tmpentry->ResourceId)) { if (rptentries[i++].ResourceId != tmpentry->ResourceId) return 1; } return 0; } openhpi-2.14.1/utils/t/rpt/rpt_utils_035.c0000644000076400007640000000236611302567130015166 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Renier Morales */ #include #include #include #include #include /** * main: Starting with an empty RPTable, adds 2 resources to it. * Fetches the resource back by using an entity path not present in the table. * Passes the test if the interface returns NULL, else it fails. * * Return value: 0 on success, 1 on failure **/ int main(int argc, char **argv) { RPTable *rptable = (RPTable *)g_malloc0(sizeof(RPTable)); oh_init_rpt(rptable); if (oh_add_resource(rptable, rptentries, NULL, 1)) return 1; if (oh_add_resource(rptable, rptentries+1, NULL, 1)) return 1; if (oh_get_resource_by_ep(rptable, &(rptentries[2].ResourceEntity))) return 1; return 0; } openhpi-2.14.1/utils/t/rpt/rpt_utils_041.c0000644000076400007640000000220611302567130015154 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Renier Morales */ #include #include #include #include #include /** * main: Starting with an empty RPTable, adds 1 resource to it * and then adds 1 rdr to it using NULL table. * Passes the test if the interface returns an error, else it fails. * * Return value: 0 on success, 1 on failure **/ int main(int argc, char **argv) { RPTable *rptable = (RPTable *)g_malloc0(sizeof(RPTable)); oh_init_rpt(rptable); if (oh_add_resource(rptable, rptentries, NULL, 0)) return 1; if (!oh_add_rdr(NULL, rptentries[0].ResourceId, sensors, NULL, 1)) return 1; return 0; } openhpi-2.14.1/utils/t/rpt/rpt_utils_012.c0000644000076400007640000000470311302567130015156 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Renier Morales */ #include #include #include #include #include #include /** * main: Starts with an RPTable of 10 resources, adds 5 rdr * to first resource. Fetches sensors ++randomly by type and compares * with original. A failed comparison means the test failed, * otherwise the test passed. * * Return value: 0 on success, 1 on failure **/ int main(int argc, char **argv) { RPTable *rptable = (RPTable *)g_malloc0(sizeof(RPTable)); oh_init_rpt(rptable); GSList *records = NULL; guint i = 0; for (i = 0; rptentries[i].ResourceId != 0; i++) { if (oh_add_resource(rptable, rptentries + i, NULL, 0)) return 1; } for (i = 0; i < 5; i++) { if (oh_add_rdr(rptable, SAHPI_FIRST_ENTRY, sensors + i, NULL,0)) return 1; else records = g_slist_append(records, sensors + i); } for (; records; i--) { SaHpiRdrT *tmprdr = NULL, *randrdr = NULL; GSList *tmpnode = NULL; guint k = (guint) (((gfloat)i)*rand()/(RAND_MAX+1.0)); tmpnode = g_slist_nth(records, k); randrdr = (SaHpiRdrT *)tmpnode->data; randrdr->RecordId = oh_get_rdr_uid(randrdr->RdrType, randrdr->RdrTypeUnion.SensorRec.Num); tmprdr = oh_get_rdr_by_type(rptable, SAHPI_FIRST_ENTRY, randrdr->RdrType, randrdr->RdrTypeUnion.SensorRec.Num); if (!tmprdr || memcmp(randrdr, tmprdr, sizeof(SaHpiRdrT))) return 1; else { records = g_slist_remove_link(records, tmpnode); g_slist_free_1(tmpnode); } } return 0; } openhpi-2.14.1/utils/t/rpt/rpt_utils_069.c0000644000076400007640000000250511302567130015170 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Renier Morales */ #include #include #include #include #include /** * main: Starting with an empty RPTable, adds a resource to it * twice. Checks to see if the udpate count was updated the * second time. If it was the test failed, otherwise the test passed. * * Return value: 0 on success, 1 on failure **/ int main(int argc, char **argv) { RPTable *rptable = (RPTable *)g_malloc0(sizeof(RPTable)); oh_init_rpt(rptable); SaHpiUint32T update_count; if (oh_add_resource(rptable, rptentries, NULL, 0)) return 1; update_count = rptable->update_count; if (oh_add_resource(rptable, rptentries, NULL, 0)) return 1; if (rptable->update_count != update_count) return 1; return 0; } openhpi-2.14.1/utils/t/rpt/rpt_utils_007.c0000644000076400007640000000301711302567130015157 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Renier Morales */ #include #include #include #include #include /** * main: Starts with an RPTable of 10 resources, starting at * the beginning on going on to the next, compares * rpt entries against the originals. A failed comparison * means the test failed, otherwise the test passed. * * Return value: 0 on success, 1 on failure **/ int main(int argc, char **argv) { RPTable *rptable = (RPTable *)g_malloc0(sizeof(RPTable)); oh_init_rpt(rptable); SaHpiRptEntryT *tmpentry = NULL; guint i = 0; for (i = 0; rptentries[i].ResourceId != 0; i++) { if (oh_add_resource(rptable, rptentries + i, NULL, 0)) return 1; } for (i = 0, tmpentry = oh_get_resource_by_id(rptable, SAHPI_FIRST_ENTRY); tmpentry; tmpentry = oh_get_resource_next(rptable, tmpentry->ResourceId)) { if (memcmp(rptentries+(i++), tmpentry, sizeof(SaHpiRptEntryT))) return 1; } return 0; } openhpi-2.14.1/utils/t/rpt/rpt_utils_051.c0000644000076400007640000000253611302567130015163 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Renier Morales */ #include #include #include #include #include /** * main: Starts with an RPTable of 1 resource, adds 5 sensors ++to first resource. * Fetches an rdr by id using a NULL table. * Success if the interface returns an error, otherwise there was a failure. * * Return value: 0 on success, 1 on failure **/ int main(int argc, char **argv) { RPTable *rptable = (RPTable *)g_malloc0(sizeof(RPTable)); oh_init_rpt(rptable); guint i; if (oh_add_resource(rptable, rptentries, NULL, 1)) return 1; for (i = 0; i < 5; i++) { if (oh_add_rdr(rptable, rptentries[0].ResourceId, sensors+i, NULL, 1)) return 1; } if (oh_get_rdr_by_id(NULL, rptentries[0].ResourceId, sensors[0].RecordId)) return 1; return 0; } openhpi-2.14.1/utils/t/rpt/rpt_utils_073.c0000644000076400007640000000250711302567130015165 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Renier Morales */ #include #include #include #include #include /** * main: Invokes rpt_diff with new table param as NULL. * If it returns error, the test passes, otherwise it failed. * * Return value: 0 on success, 1 on failure **/ int main(int argc, char **argv) { RPTable *curr_table = (RPTable *)g_malloc0(sizeof(RPTable)); RPTable *new_table = (RPTable *)g_malloc0(sizeof(RPTable)); GSList *new_res = NULL, *new_rdr = NULL, *gone_res = NULL, *gone_rdr = NULL; oh_init_rpt(curr_table); oh_init_rpt(new_table); if (oh_add_resource(curr_table, rptentries, NULL, 0)) return 1; if (oh_add_resource(new_table, rptentries + 1, NULL, 0)) return 1; if (!rpt_diff(curr_table, NULL, &new_res, &new_rdr, &gone_res, &gone_rdr)) return 1; return 0; } openhpi-2.14.1/utils/t/rpt/rpt_utils_002.c0000644000076400007640000000257311302567130015160 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Renier Morales */ #include #include #include #include #include /** * main: Starting with an empty RPTable, adds 1 resource to it * with data and then fetches the data of that resource to compare * it with the original data. * A failed comparison means the test failed, otherwise the test passed. * * Return value: 0 on success, 1 on failure **/ int main(int argc, char **argv) { RPTable *rptable = (RPTable *)g_malloc0(sizeof(RPTable)); oh_init_rpt(rptable); void *data = NULL; char *res_data = "This is the resource's data...It's private."; unsigned int res_data_len = strlen(res_data); if (oh_add_resource(rptable, rptentries, res_data, 0)) return 1; data = oh_get_resource_data(rptable, rptentries[0].ResourceId); if (!data || memcmp(data, res_data, res_data_len)) return 1; return 0; } openhpi-2.14.1/utils/t/rpt/rpt_utils_054.c0000644000076400007640000000263711302567130015170 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Renier Morales */ #include #include #include #include #include /** * main: Starts with an RPTable of 1 resource, adds 5 sensors ++to first resource. * Fetches an rdr by type using a NULL table. * Success if the interface returns an error, otherwise there was a failure. * * Return value: 0 on success, 1 on failure **/ int main(int argc, char **argv) { RPTable *rptable = (RPTable *)g_malloc0(sizeof(RPTable)); oh_init_rpt(rptable); guint i; if (oh_add_resource(rptable, rptentries, NULL, 1)) return 1; for (i = 0; i < 5; i++) { if (oh_add_rdr(rptable, rptentries[0].ResourceId, sensors+i, NULL, 1)) return 1; } if (oh_get_rdr_by_type(NULL, rptentries[0].ResourceId, sensors[0].RdrType, sensors[0].RdrTypeUnion.SensorRec.Num)) return 1; return 0; } openhpi-2.14.1/utils/t/rpt/rpt_utils_064.c0000644000076400007640000000247211302567130015166 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Renier Morales */ #include #include #include #include #include /** * main: Starts with an RPTable of 1 resource, adds 1 rdr with data * to first resource. Fetches data using a SAHPI_FIRST_ENTRY as the Record Id. * Success if the interface returns an ok, otherwise there was a failure. * * Return value: 0 on success, 1 on failure **/ int main(int argc, char **argv) { RPTable *rptable = (RPTable *)g_malloc0(sizeof(RPTable)); oh_init_rpt(rptable); gchar *data = "My data"; if (oh_add_resource(rptable, rptentries, NULL, 1)) return 1; if (oh_add_rdr(rptable, rptentries[0].ResourceId, sensors, data, 1)) return 1; if (!oh_get_rdr_data(rptable, rptentries[0].ResourceId, SAHPI_FIRST_ENTRY)) return 1; return 0; } openhpi-2.14.1/utils/t/rpt/rpt_utils_016.c0000644000076400007640000000355411302567130015165 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Renier Morales */ #include #include #include #include #include /** * main: Starts with an RPTable of 10 resources, multiple rdrs * on some resources. Remove resource. Check if resource was removed * searching for it in sequence. If not fail, else passed test. * * Return value: 0 on success, 1 on failure **/ int main(int argc, char **argv) { RPTable *rptable = (RPTable *)g_malloc0(sizeof(RPTable)); oh_init_rpt(rptable); SaHpiRptEntryT *tmpentry = NULL; guint i = 0; for (i = 0; rptentries[i].ResourceId != 0; i++) { if (oh_add_resource(rptable, rptentries + i, NULL, 0)) return 1; } for (i = 0; i < 5; i++) { if (oh_add_rdr(rptable, SAHPI_FIRST_ENTRY, sensors + i, NULL,0)) return 1; } for (; i < 7; i++) { if (oh_add_rdr(rptable, rptentries[9].ResourceId, sensors + i, NULL,0)) return 1; } oh_remove_resource(rptable, rptentries[0].ResourceId); for (tmpentry = oh_get_resource_by_id(rptable, SAHPI_FIRST_ENTRY); tmpentry; tmpentry = oh_get_resource_next(rptable, tmpentry->ResourceId)) { if (tmpentry->ResourceId == rptentries[0].ResourceId) return 1; } return 0; } openhpi-2.14.1/utils/t/rpt/rpt_utils_065.c0000644000076400007640000000255111302567130015165 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Renier Morales */ #include #include #include #include #include /** * main: Starts with an RPTable of 1 resource, adds 5 sensors ++to first resource. * Fetches an rdr by id using SAHPI_FIRST_ENTRY for the Record Id. * Success if the interface returns ok, otherwise there was a failure. * * Return value: 0 on success, 1 on failure **/ int main(int argc, char **argv) { RPTable *rptable = (RPTable *)g_malloc0(sizeof(RPTable)); oh_init_rpt(rptable); guint i; if (oh_add_resource(rptable, rptentries, NULL, 1)) return 1; for (i = 0; i < 5; i++) { if (oh_add_rdr(rptable, rptentries[0].ResourceId, sensors+i, NULL, 1)) return 1; } if (!oh_get_rdr_by_id(rptable, rptentries[0].ResourceId, SAHPI_FIRST_ENTRY)) return 1; return 0; } openhpi-2.14.1/utils/t/rpt/rpt_utils_061.c0000644000076400007640000000145511302567130015163 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Renier Morales */ #include #include #include #include #include /** * main: Starts with an empty RPTable. Invokes oh_flush on it. * Should return without crashing. * * Return value: 0 on success, 1 on failure **/ int main(int argc, char **argv) { oh_flush_rpt(NULL); return 0; } openhpi-2.14.1/utils/t/rpt/rpt_resources.h0000644000076400007640000021017311302567130015453 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Renier Morales * */ #ifndef RPT_RESOURCES_H #define RPT_RESOURCES_H #include SaHpiRptEntryT rptentries[] = { { .EntryId = 1, .ResourceId = 1, .ResourceInfo = { .ResourceRev = 1, .SpecificVer = 1, .DeviceSupport = 1, .ManufacturerId = 1, .ProductId = 1, .FirmwareMajorRev = 1, .FirmwareMinorRev = 1, .AuxFirmwareRev = 1 }, .ResourceEntity = { .Entry[0] = { .EntityType = SAHPI_ENT_SBC_BLADE, .EntityLocation = 14 }, { .EntityType = SAHPI_ENT_SUB_CHASSIS, .EntityLocation = 1 }, { .EntityType = SAHPI_ENT_SYSTEM_CHASSIS, .EntityLocation = 1 }, { .EntityType = SAHPI_ENT_ROOT, .EntityLocation = 0 } }, .ResourceCapabilities = SAHPI_CAPABILITY_CONTROL | SAHPI_CAPABILITY_FRU | SAHPI_CAPABILITY_INVENTORY_DATA | SAHPI_CAPABILITY_RDR | SAHPI_CAPABILITY_RESOURCE | SAHPI_CAPABILITY_SENSOR, .ResourceSeverity = SAHPI_MAJOR, .ResourceTag = { .DataType = SAHPI_TL_TYPE_TEXT, .Language = SAHPI_LANG_ENGLISH, .DataLength = 26, .Data = "This is data for blade 14." } }, { .EntryId = 2, .ResourceId = 2, .ResourceInfo = { .ResourceRev = 2, .SpecificVer = 2, .DeviceSupport = 2, .ManufacturerId = 2, .ProductId = 2, .FirmwareMajorRev = 2, .FirmwareMinorRev = 2, .AuxFirmwareRev = 2 }, .ResourceEntity = { .Entry[0] = { .EntityType = SAHPI_ENT_SBC_BLADE, .EntityLocation = 13 }, { .EntityType = SAHPI_ENT_SUB_CHASSIS, .EntityLocation = 1 }, { .EntityType = SAHPI_ENT_SYSTEM_CHASSIS, .EntityLocation = 1 }, { .EntityType = SAHPI_ENT_ROOT, .EntityLocation = 0 } }, .ResourceCapabilities = SAHPI_CAPABILITY_CONTROL | SAHPI_CAPABILITY_FRU | SAHPI_CAPABILITY_INVENTORY_DATA | SAHPI_CAPABILITY_RDR | SAHPI_CAPABILITY_RESOURCE | SAHPI_CAPABILITY_SENSOR, .ResourceSeverity = SAHPI_MAJOR, .ResourceTag = { .DataType = SAHPI_TL_TYPE_TEXT, .Language = SAHPI_LANG_ENGLISH, .DataLength = 26, .Data = "This is data for blade 13." } }, { .EntryId = 3, .ResourceId = 3, .ResourceInfo = { .ResourceRev = 3, .SpecificVer = 3, .DeviceSupport = 3, .ManufacturerId = 3, .ProductId = 3, .FirmwareMajorRev = 3, .FirmwareMinorRev = 3, .AuxFirmwareRev = 3 }, .ResourceEntity = { .Entry[0] = { .EntityType = SAHPI_ENT_SBC_BLADE, .EntityLocation = 12 }, { .EntityType = SAHPI_ENT_SUB_CHASSIS, .EntityLocation = 1 }, { .EntityType = SAHPI_ENT_SYSTEM_CHASSIS, .EntityLocation = 1 }, { .EntityType = SAHPI_ENT_ROOT, .EntityLocation = 0 } }, .ResourceCapabilities = SAHPI_CAPABILITY_CONTROL | SAHPI_CAPABILITY_FRU | SAHPI_CAPABILITY_INVENTORY_DATA | SAHPI_CAPABILITY_RDR | SAHPI_CAPABILITY_RESOURCE | SAHPI_CAPABILITY_SENSOR, .ResourceSeverity = SAHPI_MAJOR, .ResourceTag = { .DataType = SAHPI_TL_TYPE_TEXT, .Language = SAHPI_LANG_ENGLISH, .DataLength = 26, .Data = "This is data for blade 12." } }, { .EntryId = 4, .ResourceId = 4, .ResourceInfo = { .ResourceRev = 4, .SpecificVer = 4, .DeviceSupport = 4, .ManufacturerId = 4, .ProductId = 4, .FirmwareMajorRev = 4, .FirmwareMinorRev = 4, .AuxFirmwareRev = 4 }, .ResourceEntity = { .Entry[0] = { .EntityType = SAHPI_ENT_SBC_BLADE, .EntityLocation = 11 }, { .EntityType = SAHPI_ENT_SUB_CHASSIS, .EntityLocation = 2 }, { .EntityType = SAHPI_ENT_SYSTEM_CHASSIS, .EntityLocation = 1 }, { .EntityType = SAHPI_ENT_ROOT, .EntityLocation = 0 } }, .ResourceCapabilities = SAHPI_CAPABILITY_CONTROL | SAHPI_CAPABILITY_FRU | SAHPI_CAPABILITY_INVENTORY_DATA | SAHPI_CAPABILITY_RDR | SAHPI_CAPABILITY_RESOURCE | SAHPI_CAPABILITY_SENSOR, .ResourceSeverity = SAHPI_MAJOR, .ResourceTag = { .DataType = SAHPI_TL_TYPE_TEXT, .Language = SAHPI_LANG_ENGLISH, .DataLength = 26, .Data = "This is data for blade 11." } }, { .EntryId = 5, .ResourceId = 5, .ResourceInfo = { .ResourceRev = 5, .SpecificVer = 5, .DeviceSupport = 5, .ManufacturerId = 5, .ProductId = 5, .FirmwareMajorRev = 5, .FirmwareMinorRev = 5, .AuxFirmwareRev = 5 }, .ResourceEntity = { .Entry[0] = { .EntityType = SAHPI_ENT_SBC_BLADE, .EntityLocation = 10 }, { .EntityType = SAHPI_ENT_SUB_CHASSIS, .EntityLocation = 2 }, { .EntityType = SAHPI_ENT_SYSTEM_CHASSIS, .EntityLocation = 1 }, { .EntityType = SAHPI_ENT_ROOT, .EntityLocation = 0 } }, .ResourceCapabilities = SAHPI_CAPABILITY_CONTROL | SAHPI_CAPABILITY_FRU | SAHPI_CAPABILITY_INVENTORY_DATA | SAHPI_CAPABILITY_RDR | SAHPI_CAPABILITY_RESOURCE | SAHPI_CAPABILITY_SENSOR, .ResourceSeverity = SAHPI_MAJOR, .ResourceTag = { .DataType = SAHPI_TL_TYPE_TEXT, .Language = SAHPI_LANG_ENGLISH, .DataLength = 26, .Data = "This is data for blade 10." } }, { .EntryId = 6, .ResourceId = 6, .ResourceInfo = { .ResourceRev = 6, .SpecificVer = 6, .DeviceSupport = 6, .ManufacturerId = 6, .ProductId = 6, .FirmwareMajorRev = 6, .FirmwareMinorRev = 6, .AuxFirmwareRev = 6 }, .ResourceEntity = { .Entry[0] = { .EntityType = SAHPI_ENT_SBC_BLADE, .EntityLocation = 9 }, { .EntityType = SAHPI_ENT_SUB_CHASSIS, .EntityLocation = 2 }, { .EntityType = SAHPI_ENT_SYSTEM_CHASSIS, .EntityLocation = 1 }, { .EntityType = SAHPI_ENT_ROOT, .EntityLocation = 0 } }, .ResourceCapabilities = SAHPI_CAPABILITY_CONTROL | SAHPI_CAPABILITY_FRU | SAHPI_CAPABILITY_INVENTORY_DATA | SAHPI_CAPABILITY_RDR | SAHPI_CAPABILITY_RESOURCE | SAHPI_CAPABILITY_SENSOR, .ResourceSeverity = SAHPI_MAJOR, .ResourceTag = { .DataType = SAHPI_TL_TYPE_TEXT, .Language = SAHPI_LANG_ENGLISH, .DataLength = 25, .Data = "This is data for blade 9." } }, { .EntryId = 7, .ResourceId = 7, .ResourceInfo = { .ResourceRev = 7, .SpecificVer = 7, .DeviceSupport = 7, .ManufacturerId = 7, .ProductId = 7, .FirmwareMajorRev = 7, .FirmwareMinorRev = 7, .AuxFirmwareRev = 7 }, .ResourceEntity = { .Entry[0] = { .EntityType = SAHPI_ENT_SYS_MGMNT_MODULE, .EntityLocation = 1 }, { .EntityType = SAHPI_ENT_SUB_CHASSIS, .EntityLocation = 1 }, { .EntityType = SAHPI_ENT_SYSTEM_CHASSIS, .EntityLocation = 1 }, { .EntityType = SAHPI_ENT_ROOT, .EntityLocation = 0 } }, .ResourceCapabilities = SAHPI_CAPABILITY_FRU | SAHPI_CAPABILITY_INVENTORY_DATA | SAHPI_CAPABILITY_RDR | SAHPI_CAPABILITY_RESOURCE, .ResourceSeverity = SAHPI_MAJOR, .ResourceTag = { .DataType = SAHPI_TL_TYPE_TEXT, .Language = SAHPI_LANG_ENGLISH, .DataLength = 39, .Data = "This is data for the management module." } }, { .EntryId = 8, .ResourceId = 8, .ResourceInfo = { .ResourceRev = 8, .SpecificVer = 8, .DeviceSupport = 8, .ManufacturerId = 8, .ProductId = 8, .FirmwareMajorRev = 8, .FirmwareMinorRev = 8, .AuxFirmwareRev = 8 }, .ResourceEntity = { .Entry[0] = { .EntityType = SAHPI_ENT_INTERCONNECT, .EntityLocation = 1 }, { .EntityType = SAHPI_ENT_SUB_CHASSIS, .EntityLocation = 1 }, { .EntityType = SAHPI_ENT_SYSTEM_CHASSIS, .EntityLocation = 1 }, { .EntityType = SAHPI_ENT_ROOT, .EntityLocation = 0 } }, .ResourceCapabilities = SAHPI_CAPABILITY_FRU | SAHPI_CAPABILITY_INVENTORY_DATA | SAHPI_CAPABILITY_RDR | SAHPI_CAPABILITY_RESOURCE, .ResourceSeverity = SAHPI_MAJOR, .ResourceTag = { .DataType = SAHPI_TL_TYPE_TEXT, .Language = SAHPI_LANG_ENGLISH, .DataLength = 35, .Data = "This is data for the switch module." } }, { .EntryId = 9, .ResourceId = 9, .ResourceInfo = { .ResourceRev = 9, .SpecificVer = 9, .DeviceSupport = 9, .ManufacturerId = 9, .ProductId = 9, .FirmwareMajorRev = 9, .FirmwareMinorRev = 9, .AuxFirmwareRev = 9 }, .ResourceEntity = { .Entry[0] = { .EntityType = SAHPI_ENT_POWER_SUPPLY, .EntityLocation = 3 }, { .EntityType = SAHPI_ENT_SUB_CHASSIS, .EntityLocation = 2 }, { .EntityType = SAHPI_ENT_SYSTEM_CHASSIS, .EntityLocation = 1 }, { .EntityType = SAHPI_ENT_ROOT, .EntityLocation = 0 } }, .ResourceCapabilities = SAHPI_CAPABILITY_FRU | SAHPI_CAPABILITY_INVENTORY_DATA | SAHPI_CAPABILITY_RDR | SAHPI_CAPABILITY_RESOURCE, .ResourceSeverity = SAHPI_MAJOR, .ResourceTag = { .DataType = SAHPI_TL_TYPE_TEXT, .Language = SAHPI_LANG_ENGLISH, .DataLength = 34, .Data = "This is data for the power module." } }, { .EntryId = 10, .ResourceId = 10, .ResourceInfo = { .ResourceRev = 10, .SpecificVer = 10, .DeviceSupport = 10, .ManufacturerId = 10, .ProductId = 10, .FirmwareMajorRev = 10, .FirmwareMinorRev = 10, .AuxFirmwareRev = 10 }, .ResourceEntity = { .Entry[0] = { .EntityType = SAHPI_ENT_SYSTEM_CHASSIS, .EntityLocation = 1 }, { .EntityType = SAHPI_ENT_ROOT, .EntityLocation = 0 } }, .ResourceCapabilities = SAHPI_CAPABILITY_CONTROL | SAHPI_CAPABILITY_INVENTORY_DATA | SAHPI_CAPABILITY_RDR | SAHPI_CAPABILITY_RESOURCE | SAHPI_CAPABILITY_EVENT_LOG | SAHPI_CAPABILITY_SENSOR, .ResourceSeverity = SAHPI_CRITICAL, .ResourceTag = { .DataType = SAHPI_TL_TYPE_TEXT, .Language = SAHPI_LANG_ENGLISH, .DataLength = 25, .Data = "This is data for chassis." } }, {} }; /***************** * Start of RDRs * *****************/ SaHpiRdrT sensors[] = { { .RdrType = SAHPI_SENSOR_RDR, .Entity = { .Entry[0] = { .EntityType = SAHPI_ENT_SBC_BLADE, .EntityLocation = 14 }, { .EntityType = SAHPI_ENT_SUB_CHASSIS, .EntityLocation = 1 }, { .EntityType = SAHPI_ENT_SYSTEM_CHASSIS, .EntityLocation = 1 }, { .EntityType = SAHPI_ENT_ROOT, .EntityLocation = 0 } }, .RdrTypeUnion = { .SensorRec = { .Num = 1, .Type = SAHPI_PLATFORM_VIOLATION, .Category = SAHPI_EC_SEVERITY, .EventCtrl = SAHPI_SEC_PER_EVENT, .Events = SAHPI_ES_OK | SAHPI_ES_CRITICAL, .EnableCtrl = SAHPI_FALSE, .DataFormat = { .BaseUnits = SAHPI_SU_UNSPECIFIED, .ModifierUnits = SAHPI_SU_UNSPECIFIED, .ModifierUse = SAHPI_SMUU_NONE, .Percentage = SAHPI_FALSE, .Range = { .Flags = SAHPI_SRF_MIN | SAHPI_SRF_MAX, .Max = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, .Value.SensorFloat64 = 1.0 }, .Min = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, .Value.SensorFloat64 = 0.0 } } }, .Oem = 1 } }, .IdString = { .DataType = SAHPI_TL_TYPE_TEXT, .Language = SAHPI_LANG_ENGLISH, .DataLength = 22, .Data = "Sensor 1 for Blade 14." } }, { .RdrType = SAHPI_SENSOR_RDR, .Entity = { .Entry[0] = { .EntityType = SAHPI_ENT_SBC_BLADE, .EntityLocation = 14 }, { .EntityType = SAHPI_ENT_SUB_CHASSIS, .EntityLocation = 1 }, { .EntityType = SAHPI_ENT_SYSTEM_CHASSIS, .EntityLocation = 1 }, { .EntityType = SAHPI_ENT_ROOT, .EntityLocation = 0 } }, .RdrTypeUnion = { .SensorRec = { .Num = 2, .Type = SAHPI_PLATFORM_VIOLATION, .Category = SAHPI_EC_SEVERITY, .EventCtrl = SAHPI_SEC_PER_EVENT, .Events = SAHPI_ES_OK | SAHPI_ES_CRITICAL, .EnableCtrl = SAHPI_FALSE, .DataFormat = { .BaseUnits = SAHPI_SU_UNSPECIFIED, .ModifierUnits = SAHPI_SU_UNSPECIFIED, .ModifierUse = SAHPI_SMUU_NONE, .Percentage = SAHPI_FALSE, .Range = { .Flags = SAHPI_SRF_MIN | SAHPI_SRF_MAX, .Max = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, .Value.SensorFloat64 = 1.0 }, .Min = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, .Value.SensorFloat64 = 0.0 } } }, .Oem = 2 } }, .IdString = { .DataType = SAHPI_TL_TYPE_TEXT, .Language = SAHPI_LANG_ENGLISH, .DataLength = 22, .Data = "Sensor 2 for Blade 14." } }, { .RdrType = SAHPI_SENSOR_RDR, .Entity = { .Entry[0] = { .EntityType = SAHPI_ENT_SBC_BLADE, .EntityLocation = 14 }, { .EntityType = SAHPI_ENT_SUB_CHASSIS, .EntityLocation = 1 }, { .EntityType = SAHPI_ENT_SYSTEM_CHASSIS, .EntityLocation = 1 }, { .EntityType = SAHPI_ENT_ROOT, .EntityLocation = 0 } }, .RdrTypeUnion = { .SensorRec = { .Num = 3, .Type = SAHPI_PLATFORM_VIOLATION, .Category = SAHPI_EC_SEVERITY, .EventCtrl = SAHPI_SEC_PER_EVENT, .Events = SAHPI_ES_OK | SAHPI_ES_CRITICAL, .EnableCtrl = SAHPI_FALSE, .DataFormat = { .BaseUnits = SAHPI_SU_UNSPECIFIED, .ModifierUnits = SAHPI_SU_UNSPECIFIED, .ModifierUse = SAHPI_SMUU_NONE, .Percentage = SAHPI_FALSE, .Range = { .Flags = SAHPI_SRF_MIN | SAHPI_SRF_MAX, .Max = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, .Value.SensorFloat64 = 1.0 }, .Min = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, .Value.SensorFloat64 = 0.0 } } }, .Oem = 3 } }, .IdString = { .DataType = SAHPI_TL_TYPE_TEXT, .Language = SAHPI_LANG_ENGLISH, .DataLength = 22, .Data = "Sensor 3 for Blade 14." } }, { .RdrType = SAHPI_SENSOR_RDR, .Entity = { .Entry[0] = { .EntityType = SAHPI_ENT_SBC_BLADE, .EntityLocation = 14 }, { .EntityType = SAHPI_ENT_SUB_CHASSIS, .EntityLocation = 1 }, { .EntityType = SAHPI_ENT_SYSTEM_CHASSIS, .EntityLocation = 1 }, { .EntityType = SAHPI_ENT_ROOT, .EntityLocation = 0 } }, .RdrTypeUnion = { .SensorRec = { .Num = 4, .Type = SAHPI_PLATFORM_VIOLATION, .Category = SAHPI_EC_SEVERITY, .EventCtrl = SAHPI_SEC_PER_EVENT, .Events = SAHPI_ES_OK | SAHPI_ES_CRITICAL, .EnableCtrl = SAHPI_FALSE, .DataFormat = { .BaseUnits = SAHPI_SU_UNSPECIFIED, .ModifierUnits = SAHPI_SU_UNSPECIFIED, .ModifierUse = SAHPI_SMUU_NONE, .Percentage = SAHPI_FALSE, .Range = { .Flags = SAHPI_SRF_MIN | SAHPI_SRF_MAX, .Max = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, .Value.SensorFloat64 = 1.0 }, .Min = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, .Value.SensorFloat64 = 0.0 } } }, .Oem = 4 } }, .IdString = { .DataType = SAHPI_TL_TYPE_TEXT, .Language = SAHPI_LANG_ENGLISH, .DataLength = 22, .Data = "Sensor 4 for Blade 14." } }, { .RdrType = SAHPI_SENSOR_RDR, .Entity = { .Entry[0] = { .EntityType = SAHPI_ENT_SBC_BLADE, .EntityLocation = 14 }, { .EntityType = SAHPI_ENT_SUB_CHASSIS, .EntityLocation = 1 }, { .EntityType = SAHPI_ENT_SYSTEM_CHASSIS, .EntityLocation = 1 }, { .EntityType = SAHPI_ENT_ROOT, .EntityLocation = 0 } }, .RdrTypeUnion = { .SensorRec = { .Num = 5, .Type = SAHPI_PLATFORM_VIOLATION, .Category = SAHPI_EC_SEVERITY, .EventCtrl = SAHPI_SEC_PER_EVENT, .Events = SAHPI_ES_OK | SAHPI_ES_CRITICAL, .EnableCtrl = SAHPI_FALSE, .DataFormat = { .BaseUnits = SAHPI_SU_UNSPECIFIED, .ModifierUnits = SAHPI_SU_UNSPECIFIED, .ModifierUse = SAHPI_SMUU_NONE, .Percentage = SAHPI_FALSE, .Range = { .Flags = SAHPI_SRF_MIN | SAHPI_SRF_MAX, .Max = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, .Value.SensorFloat64 = 1.0 }, .Min = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, .Value.SensorFloat64 = 0.0 } } }, .Oem = 5 } }, .IdString = { .DataType = SAHPI_TL_TYPE_TEXT, .Language = SAHPI_LANG_ENGLISH, .DataLength = 22, .Data = "Sensor 5 for Blade 14." } }, { .RdrType = SAHPI_SENSOR_RDR, .Entity = { .Entry[0] = { .EntityType = SAHPI_ENT_SYSTEM_CHASSIS, .EntityLocation = 1 }, { .EntityType = SAHPI_ENT_ROOT, .EntityLocation = 0 } }, .RdrTypeUnion = { .SensorRec = { .Num = 1, .Type = SAHPI_PLATFORM_VIOLATION, .Category = SAHPI_EC_SEVERITY, .EventCtrl = SAHPI_SEC_PER_EVENT, .Events = SAHPI_ES_OK | SAHPI_ES_CRITICAL, .EnableCtrl = SAHPI_FALSE, .DataFormat = { .BaseUnits = SAHPI_SU_UNSPECIFIED, .ModifierUnits = SAHPI_SU_UNSPECIFIED, .ModifierUse = SAHPI_SMUU_NONE, .Percentage = SAHPI_FALSE, .Range = { .Flags = SAHPI_SRF_MIN | SAHPI_SRF_MAX, .Max = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, .Value.SensorFloat64 = 1.0 }, .Min = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, .Value.SensorFloat64 = 0.0 } } }, .Oem = 6 } }, .IdString = { .DataType = SAHPI_TL_TYPE_TEXT, .Language = SAHPI_LANG_ENGLISH, .DataLength = 21, .Data = "Sensor 1 for Chassis." } }, { .RdrType = SAHPI_SENSOR_RDR, .Entity = { .Entry[0] = { .EntityType = SAHPI_ENT_SYSTEM_CHASSIS, .EntityLocation = 1 }, { .EntityType = SAHPI_ENT_ROOT, .EntityLocation = 0 } }, .RdrTypeUnion = { .SensorRec = { .Num = 2, .Type = SAHPI_PLATFORM_VIOLATION, .Category = SAHPI_EC_SEVERITY, .EventCtrl = SAHPI_SEC_PER_EVENT, .Events = SAHPI_ES_OK | SAHPI_ES_CRITICAL, .EnableCtrl = SAHPI_FALSE, .DataFormat = { .BaseUnits = SAHPI_SU_UNSPECIFIED, .ModifierUnits = SAHPI_SU_UNSPECIFIED, .ModifierUse = SAHPI_SMUU_NONE, .Percentage = SAHPI_FALSE, .Range = { .Flags = SAHPI_SRF_MIN | SAHPI_SRF_MAX, .Max = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, .Value.SensorFloat64 = 1.0 }, .Min = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_FLOAT64, .Value.SensorFloat64 = 0.0 } } }, .Oem = 7 } }, .IdString = { .DataType = SAHPI_TL_TYPE_TEXT, .Language = SAHPI_LANG_ENGLISH, .DataLength = 22, .Data = "Sensor 2 for Chassis." } }, {} }; SaHpiRdrT controls[] = { { .RdrType = SAHPI_CTRL_RDR, .Entity = { .Entry[0] = { .EntityType = SAHPI_ENT_SBC_BLADE, .EntityLocation = 14 }, { .EntityType = SAHPI_ENT_SUB_CHASSIS, .EntityLocation = 1 }, { .EntityType = SAHPI_ENT_SYSTEM_CHASSIS, .EntityLocation = 1 }, { .EntityType = SAHPI_ENT_ROOT, .EntityLocation = 0 } }, .RdrTypeUnion = { .CtrlRec = { .Num = 1, .OutputType = SAHPI_CTRL_GENERIC, .Type = SAHPI_CTRL_TYPE_DIGITAL, .TypeUnion = { .Digital = { .Default = SAHPI_CTRL_STATE_OFF } }, .DefaultMode = { .Mode = SAHPI_CTRL_MODE_MANUAL, .ReadOnly = SAHPI_TRUE }, .WriteOnly = SAHPI_FALSE, .Oem = 1 } }, .IdString = { .DataType = SAHPI_TL_TYPE_TEXT, .Language = SAHPI_LANG_ENGLISH, .DataLength = 23, .Data = "Control 1 for Blade 14." } }, { .RdrType = SAHPI_CTRL_RDR, .Entity = { .Entry[0] = { .EntityType = SAHPI_ENT_SBC_BLADE, .EntityLocation = 14 }, { .EntityType = SAHPI_ENT_SUB_CHASSIS, .EntityLocation = 1 }, { .EntityType = SAHPI_ENT_SYSTEM_CHASSIS, .EntityLocation = 1 }, { .EntityType = SAHPI_ENT_ROOT, .EntityLocation = 0 } }, .RdrTypeUnion = { .CtrlRec = { .Num = 2, .OutputType = SAHPI_CTRL_GENERIC, .Type = SAHPI_CTRL_TYPE_DIGITAL, .TypeUnion = { .Digital = { .Default = SAHPI_CTRL_STATE_OFF } }, .DefaultMode = { .Mode = SAHPI_CTRL_MODE_MANUAL, .ReadOnly = SAHPI_TRUE }, .WriteOnly = SAHPI_FALSE, .Oem = 2 } }, .IdString = { .DataType = SAHPI_TL_TYPE_TEXT, .Language = SAHPI_LANG_ENGLISH, .DataLength = 23, .Data = "Control 2 for Blade 14." } }, { .RdrType = SAHPI_CTRL_RDR, .Entity = { .Entry[0] = { .EntityType = SAHPI_ENT_SBC_BLADE, .EntityLocation = 14 }, { .EntityType = SAHPI_ENT_SUB_CHASSIS, .EntityLocation = 1 }, { .EntityType = SAHPI_ENT_SYSTEM_CHASSIS, .EntityLocation = 1 }, { .EntityType = SAHPI_ENT_ROOT, .EntityLocation = 0 } }, .RdrTypeUnion = { .CtrlRec = { .Num = 3, .OutputType = SAHPI_CTRL_GENERIC, .Type = SAHPI_CTRL_TYPE_DIGITAL, .TypeUnion = { .Digital = { .Default = SAHPI_CTRL_STATE_OFF } }, .DefaultMode = { .Mode = SAHPI_CTRL_MODE_MANUAL, .ReadOnly = SAHPI_TRUE }, .WriteOnly = SAHPI_FALSE, .Oem = 3 } }, .IdString = { .DataType = SAHPI_TL_TYPE_TEXT, .Language = SAHPI_LANG_ENGLISH, .DataLength = 23, .Data = "Control 3 for Blade 14." } }, { .RdrType = SAHPI_CTRL_RDR, .Entity = { .Entry[0] = { .EntityType = SAHPI_ENT_SBC_BLADE, .EntityLocation = 14 }, { .EntityType = SAHPI_ENT_SUB_CHASSIS, .EntityLocation = 1 }, { .EntityType = SAHPI_ENT_SYSTEM_CHASSIS, .EntityLocation = 1 }, { .EntityType = SAHPI_ENT_ROOT, .EntityLocation = 0 } }, .RdrTypeUnion = { .CtrlRec = { .Num = 4, .OutputType = SAHPI_CTRL_GENERIC, .Type = SAHPI_CTRL_TYPE_DIGITAL, .TypeUnion = { .Digital = { .Default = SAHPI_CTRL_STATE_OFF } }, .DefaultMode = { .Mode = SAHPI_CTRL_MODE_MANUAL, .ReadOnly = SAHPI_TRUE }, .WriteOnly = SAHPI_FALSE, .Oem = 4 } }, .IdString = { .DataType = SAHPI_TL_TYPE_TEXT, .Language = SAHPI_LANG_ENGLISH, .DataLength = 23, .Data = "Control 4 for Blade 14." } }, { .RdrType = SAHPI_CTRL_RDR, .Entity = { .Entry[0] = { .EntityType = SAHPI_ENT_SBC_BLADE, .EntityLocation = 14 }, { .EntityType = SAHPI_ENT_SUB_CHASSIS, .EntityLocation = 1 }, { .EntityType = SAHPI_ENT_SYSTEM_CHASSIS, .EntityLocation = 1 }, { .EntityType = SAHPI_ENT_ROOT, .EntityLocation = 0 } }, .RdrTypeUnion = { .CtrlRec = { .Num = 5, .OutputType = SAHPI_CTRL_GENERIC, .Type = SAHPI_CTRL_TYPE_DIGITAL, .TypeUnion = { .Digital = { .Default = SAHPI_CTRL_STATE_OFF } }, .DefaultMode = { .Mode = SAHPI_CTRL_MODE_MANUAL, .ReadOnly = SAHPI_TRUE }, .WriteOnly = SAHPI_FALSE, .Oem = 5 } }, .IdString = { .DataType = SAHPI_TL_TYPE_TEXT, .Language = SAHPI_LANG_ENGLISH, .DataLength = 23, .Data = "Control 5 for Blade 14." } }, {} }; SaHpiRdrT inventories[] = { { .RdrType = SAHPI_INVENTORY_RDR, .Entity = { .Entry[0] = { .EntityType = SAHPI_ENT_SBC_BLADE, .EntityLocation = 14 }, { .EntityType = SAHPI_ENT_SUB_CHASSIS, .EntityLocation = 1 }, { .EntityType = SAHPI_ENT_SYSTEM_CHASSIS, .EntityLocation = 1 }, { .EntityType = SAHPI_ENT_ROOT, .EntityLocation = 0 } }, .RdrTypeUnion = { .InventoryRec = { .IdrId = 1, .Persistent = SAHPI_TRUE, .Oem = 1 } }, .IdString = { .DataType = SAHPI_TL_TYPE_TEXT, .Language = SAHPI_LANG_ENGLISH, .DataLength = 25, .Data = "Inventory 1 for Blade 14." } }, { .RdrType = SAHPI_INVENTORY_RDR, .Entity = { .Entry[0] = { .EntityType = SAHPI_ENT_SBC_BLADE, .EntityLocation = 14 }, { .EntityType = SAHPI_ENT_SUB_CHASSIS, .EntityLocation = 1 }, { .EntityType = SAHPI_ENT_SYSTEM_CHASSIS, .EntityLocation = 1 }, { .EntityType = SAHPI_ENT_ROOT, .EntityLocation = 0 } }, .RdrTypeUnion = { .InventoryRec = { .IdrId = 2, .Persistent = SAHPI_TRUE, .Oem = 2 } }, .IdString = { .DataType = SAHPI_TL_TYPE_TEXT, .Language = SAHPI_LANG_ENGLISH, .DataLength = 25, .Data = "Inventory 2 for Blade 14." } }, { .RdrType = SAHPI_INVENTORY_RDR, .Entity = { .Entry[0] = { .EntityType = SAHPI_ENT_SBC_BLADE, .EntityLocation = 14 }, { .EntityType = SAHPI_ENT_SUB_CHASSIS, .EntityLocation = 1 }, { .EntityType = SAHPI_ENT_SYSTEM_CHASSIS, .EntityLocation = 1 }, { .EntityType = SAHPI_ENT_ROOT, .EntityLocation = 0 } }, .RdrTypeUnion = { .InventoryRec = { .IdrId = 3, .Persistent = SAHPI_TRUE, .Oem = 3 } }, .IdString = { .DataType = SAHPI_TL_TYPE_TEXT, .Language = SAHPI_LANG_ENGLISH, .DataLength = 25, .Data = "Inventory 3 for Blade 14." } }, { .RdrType = SAHPI_INVENTORY_RDR, .Entity = { .Entry[0] = { .EntityType = SAHPI_ENT_SBC_BLADE, .EntityLocation = 14 }, { .EntityType = SAHPI_ENT_SUB_CHASSIS, .EntityLocation = 1 }, { .EntityType = SAHPI_ENT_SYSTEM_CHASSIS, .EntityLocation = 1 }, { .EntityType = SAHPI_ENT_ROOT, .EntityLocation = 0 } }, .RdrTypeUnion = { .InventoryRec = { .IdrId = 4, .Persistent = SAHPI_TRUE, .Oem = 4 } }, .IdString = { .DataType = SAHPI_TL_TYPE_TEXT, .Language = SAHPI_LANG_ENGLISH, .DataLength = 25, .Data = "Inventory 4 for Blade 14." } }, { .RdrType = SAHPI_INVENTORY_RDR, .Entity = { .Entry[0] = { .EntityType = SAHPI_ENT_SBC_BLADE, .EntityLocation = 14 }, { .EntityType = SAHPI_ENT_SUB_CHASSIS, .EntityLocation = 1 }, { .EntityType = SAHPI_ENT_SYSTEM_CHASSIS, .EntityLocation = 1 }, { .EntityType = SAHPI_ENT_ROOT, .EntityLocation = 0 } }, .RdrTypeUnion = { .InventoryRec = { .IdrId = 5, .Persistent = SAHPI_TRUE, .Oem = 5 } }, .IdString = { .DataType = SAHPI_TL_TYPE_TEXT, .Language = SAHPI_LANG_ENGLISH, .DataLength = 25, .Data = "Inventory 5 for Blade 14." } }, {} }; SaHpiRdrT watchdogs[] = { { .RdrType = SAHPI_WATCHDOG_RDR, .Entity = { .Entry[0] = { .EntityType = SAHPI_ENT_SBC_BLADE, .EntityLocation = 14 }, { .EntityType = SAHPI_ENT_SUB_CHASSIS, .EntityLocation = 1 }, { .EntityType = SAHPI_ENT_SYSTEM_CHASSIS, .EntityLocation = 1 }, { .EntityType = SAHPI_ENT_ROOT, .EntityLocation = 0 } }, .RdrTypeUnion = { .WatchdogRec = { .WatchdogNum = 1, .Oem = 1 } }, .IdString = { .DataType = SAHPI_TL_TYPE_TEXT, .Language = SAHPI_LANG_ENGLISH, .DataLength = 24, .Data = "Watchdog 1 for Blade 14." } }, { .RdrType = SAHPI_WATCHDOG_RDR, .Entity = { .Entry[0] = { .EntityType = SAHPI_ENT_SBC_BLADE, .EntityLocation = 14 }, { .EntityType = SAHPI_ENT_SUB_CHASSIS, .EntityLocation = 1 }, { .EntityType = SAHPI_ENT_SYSTEM_CHASSIS, .EntityLocation = 1 }, { .EntityType = SAHPI_ENT_ROOT, .EntityLocation = 0 } }, .RdrTypeUnion = { .WatchdogRec = { .WatchdogNum = 2, .Oem = 2 } }, .IdString = { .DataType = SAHPI_TL_TYPE_TEXT, .Language = SAHPI_LANG_ENGLISH, .DataLength = 24, .Data = "Watchdog 2 for Blade 14." } }, { .RdrType = SAHPI_WATCHDOG_RDR, .Entity = { .Entry[0] = { .EntityType = SAHPI_ENT_SBC_BLADE, .EntityLocation = 14 }, { .EntityType = SAHPI_ENT_SUB_CHASSIS, .EntityLocation = 1 }, { .EntityType = SAHPI_ENT_SYSTEM_CHASSIS, .EntityLocation = 1 }, { .EntityType = SAHPI_ENT_ROOT, .EntityLocation = 0 } }, .RdrTypeUnion = { .WatchdogRec = { .WatchdogNum = 3, .Oem = 3 } }, .IdString = { .DataType = SAHPI_TL_TYPE_TEXT, .Language = SAHPI_LANG_ENGLISH, .DataLength = 24, .Data = "Watchdog 3 for Blade 14." } }, { .RdrType = SAHPI_WATCHDOG_RDR, .Entity = { .Entry[0] = { .EntityType = SAHPI_ENT_SBC_BLADE, .EntityLocation = 14 }, { .EntityType = SAHPI_ENT_SUB_CHASSIS, .EntityLocation = 1 }, { .EntityType = SAHPI_ENT_SYSTEM_CHASSIS, .EntityLocation = 1 }, { .EntityType = SAHPI_ENT_ROOT, .EntityLocation = 0 } }, .RdrTypeUnion = { .WatchdogRec = { .WatchdogNum = 4, .Oem = 4 } }, .IdString = { .DataType = SAHPI_TL_TYPE_TEXT, .Language = SAHPI_LANG_ENGLISH, .DataLength = 24, .Data = "Watchdog 4 for Blade 14." } }, { .RdrType = SAHPI_WATCHDOG_RDR, .Entity = { .Entry[0] = { .EntityType = SAHPI_ENT_SBC_BLADE, .EntityLocation = 14 }, { .EntityType = SAHPI_ENT_SUB_CHASSIS, .EntityLocation = 1 }, { .EntityType = SAHPI_ENT_SYSTEM_CHASSIS, .EntityLocation = 1 }, { .EntityType = SAHPI_ENT_ROOT, .EntityLocation = 0 } }, .RdrTypeUnion = { .WatchdogRec = { .WatchdogNum = 5, .Oem = 5 } }, .IdString = { .DataType = SAHPI_TL_TYPE_TEXT, .Language = SAHPI_LANG_ENGLISH, .DataLength = 24, .Data = "Watchdog 5 for Blade 14." } }, {} }; SaHpiRdrT annunciators[] = { { .RdrType = SAHPI_ANNUNCIATOR_RDR, .Entity = { .Entry[0] = { .EntityType = SAHPI_ENT_SBC_BLADE, .EntityLocation = 14 }, { .EntityType = SAHPI_ENT_SUB_CHASSIS, .EntityLocation = 1 }, { .EntityType = SAHPI_ENT_SYSTEM_CHASSIS, .EntityLocation = 1 }, { .EntityType = SAHPI_ENT_ROOT, .EntityLocation = 0 } }, .RdrTypeUnion = { .AnnunciatorRec = { .AnnunciatorNum = 1, .AnnunciatorType = SAHPI_ANNUNCIATOR_TYPE_LED, .ModeReadOnly = SAHPI_FALSE, .MaxConditions = 2, .Oem = 1 } }, .IdString = { .DataType = SAHPI_TL_TYPE_TEXT, .Language = SAHPI_LANG_ENGLISH, .DataLength = 27, .Data = "Annunciator 1 for Blade 14." } }, { .RdrType = SAHPI_ANNUNCIATOR_RDR, .Entity = { .Entry[0] = { .EntityType = SAHPI_ENT_SBC_BLADE, .EntityLocation = 14 }, { .EntityType = SAHPI_ENT_SUB_CHASSIS, .EntityLocation = 1 }, { .EntityType = SAHPI_ENT_SYSTEM_CHASSIS, .EntityLocation = 1 }, { .EntityType = SAHPI_ENT_ROOT, .EntityLocation = 0 } }, .RdrTypeUnion = { .AnnunciatorRec = { .AnnunciatorNum = 2, .AnnunciatorType = SAHPI_ANNUNCIATOR_TYPE_LED, .ModeReadOnly = SAHPI_FALSE, .MaxConditions = 2, .Oem = 2 } }, .IdString = { .DataType = SAHPI_TL_TYPE_TEXT, .Language = SAHPI_LANG_ENGLISH, .DataLength = 27, .Data = "Annunciator 2 for Blade 14." } }, { .RdrType = SAHPI_ANNUNCIATOR_RDR, .Entity = { .Entry[0] = { .EntityType = SAHPI_ENT_SBC_BLADE, .EntityLocation = 14 }, { .EntityType = SAHPI_ENT_SUB_CHASSIS, .EntityLocation = 1 }, { .EntityType = SAHPI_ENT_SYSTEM_CHASSIS, .EntityLocation = 1 }, { .EntityType = SAHPI_ENT_ROOT, .EntityLocation = 0 } }, .RdrTypeUnion = { .AnnunciatorRec = { .AnnunciatorNum = 3, .AnnunciatorType = SAHPI_ANNUNCIATOR_TYPE_LED, .ModeReadOnly = SAHPI_FALSE, .MaxConditions = 2, .Oem = 3 } }, .IdString = { .DataType = SAHPI_TL_TYPE_TEXT, .Language = SAHPI_LANG_ENGLISH, .DataLength = 27, .Data = "Annunciator 3 for Blade 14." } }, { .RdrType = SAHPI_ANNUNCIATOR_RDR, .Entity = { .Entry[0] = { .EntityType = SAHPI_ENT_SBC_BLADE, .EntityLocation = 14 }, { .EntityType = SAHPI_ENT_SUB_CHASSIS, .EntityLocation = 1 }, { .EntityType = SAHPI_ENT_SYSTEM_CHASSIS, .EntityLocation = 1 }, { .EntityType = SAHPI_ENT_ROOT, .EntityLocation = 0 } }, .RdrTypeUnion = { .AnnunciatorRec = { .AnnunciatorNum = 4, .AnnunciatorType = SAHPI_ANNUNCIATOR_TYPE_LED, .ModeReadOnly = SAHPI_FALSE, .MaxConditions = 2, .Oem = 4 } }, .IdString = { .DataType = SAHPI_TL_TYPE_TEXT, .Language = SAHPI_LANG_ENGLISH, .DataLength = 27, .Data = "Annunciator 4 for Blade 14." } }, { .RdrType = SAHPI_ANNUNCIATOR_RDR, .Entity = { .Entry[0] = { .EntityType = SAHPI_ENT_SBC_BLADE, .EntityLocation = 14 }, { .EntityType = SAHPI_ENT_SUB_CHASSIS, .EntityLocation = 1 }, { .EntityType = SAHPI_ENT_SYSTEM_CHASSIS, .EntityLocation = 1 }, { .EntityType = SAHPI_ENT_ROOT, .EntityLocation = 0 } }, .RdrTypeUnion = { .AnnunciatorRec = { .AnnunciatorNum = 5, .AnnunciatorType = SAHPI_ANNUNCIATOR_TYPE_LED, .ModeReadOnly = SAHPI_FALSE, .MaxConditions = 2, .Oem = 5 } }, .IdString = { .DataType = SAHPI_TL_TYPE_TEXT, .Language = SAHPI_LANG_ENGLISH, .DataLength = 27, .Data = "Annunciator 5 for Blade 14." } }, {} }; #endif /* RPT_RESOURCES_H */ openhpi-2.14.1/utils/t/rpt/rpt_utils_028.c0000644000076400007640000000252511302567130015165 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Renier Morales * */ #include #include #include #include #include /** * main: Starting with an empty RPTable, adds 2 resources to it with data. * Fetches the data back using a Resource Id not present in the table. * Passes the test if the interface returns NULL, else it fails. * * Return value: 0 on success, 1 on failure **/ int main(int argc, char **argv) { RPTable *rptable = (RPTable *)g_malloc0(sizeof(RPTable)); oh_init_rpt(rptable); gchar *data1 = "My data 1"; gchar *data2 = "My data 2"; if (oh_add_resource(rptable, rptentries, data1, KEEP_RPT_DATA)) return 1; if (oh_add_resource(rptable, rptentries+1, data2, KEEP_RPT_DATA)) return 1; if (oh_get_resource_data(rptable, rptentries[2].ResourceId)) return 1; return 0; } openhpi-2.14.1/utils/t/rpt/rpt_utils_017.c0000644000076400007640000000333411302567130015162 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Renier Morales */ #include #include #include #include #include /** * main: Starts with an RPTable of 10 resources, multiple rdrs * on some resources. Remove rdr. Check if resource was removed * searching for it by id. If not fail, else passed test. * * Return value: 0 on success, 1 on failure **/ int main(int argc, char **argv) { RPTable *rptable = (RPTable *)g_malloc0(sizeof(RPTable)); oh_init_rpt(rptable); SaHpiRdrT *tmprdr = NULL; guint i = 0; for (i = 0; rptentries[i].ResourceId != 0; i++) { if (oh_add_resource(rptable, rptentries + i, NULL, 0)) return 1; } for (i = 0; i < 5; i++) { if (oh_add_rdr(rptable, SAHPI_FIRST_ENTRY, sensors + i, NULL,0)) return 1; } for (; i < 7; i++) { if (oh_add_rdr(rptable, rptentries[9].ResourceId, sensors + i, NULL,0)) return 1; } oh_remove_rdr(rptable, rptentries[0].ResourceId, sensors[1].RecordId); tmprdr = oh_get_rdr_by_id(rptable, rptentries[0].ResourceId, sensors[1].RecordId); if (tmprdr) return 1; return 0; } openhpi-2.14.1/utils/t/rpt/rpt_utils_080.c0000644000076400007640000000461711302567130015167 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Renier Morales */ #include #include #include #include #include #include /** * main: Starts with an RPTable of 10 resources, adds 5 inventory rdr * to first resource. Fetches inventories ++randomly by record id and compares * with original. A failed comparison means the test failed, * otherwise the test passed. * * Return value: 0 on success, 1 on failure **/ int main(int argc, char **argv) { RPTable *rptable = (RPTable *)g_malloc0(sizeof(RPTable)); oh_init_rpt(rptable); GSList *records = NULL; guint i = 0; for (i = 0; rptentries[i].ResourceId != 0; i++) { if (oh_add_resource(rptable, rptentries + i, NULL, 0)) return 1; } for (i = 0; i < 5; i++) { if (oh_add_rdr(rptable, SAHPI_FIRST_ENTRY, inventories + i, NULL,0)) return 1; else records = g_slist_append(records, inventories + i); } for (; records; i--) { SaHpiRdrT *tmprdr = NULL, *randrdr = NULL; GSList *tmpnode = NULL; guint k = (guint) (((gfloat)i)*rand()/(RAND_MAX+1.0)); tmpnode = g_slist_nth(records, k); randrdr = (SaHpiRdrT *)tmpnode->data; randrdr->RecordId = oh_get_rdr_uid(randrdr->RdrType, randrdr->RdrTypeUnion.InventoryRec.IdrId); tmprdr = oh_get_rdr_by_id(rptable, SAHPI_FIRST_ENTRY, randrdr->RecordId); if (!tmprdr || memcmp(randrdr, tmprdr, sizeof(SaHpiRdrT))) return 1; else { records = g_slist_remove_link(records, tmpnode); g_slist_free_1(tmpnode); } } return 0; } openhpi-2.14.1/utils/t/rpt/rpt_utils_001.c0000644000076400007640000000246111302567130015153 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Renier Morales */ #include #include #include #include #include /** * main: Starting with an empty RPTable, adds 1 resource to it * and tries to fetch it by the entity path and compare it against * the original resource. A failed comparison means the test * failed, otherwise the test passed. * * Return value: 0 on success, 1 on failure **/ int main(int argc, char **argv) { RPTable *rptable = (RPTable *)g_malloc0(sizeof(RPTable)); oh_init_rpt(rptable); SaHpiRptEntryT *tmpentry = NULL; if (oh_add_resource(rptable, rptentries, NULL, 0)) return 1; tmpentry = oh_get_resource_by_ep(rptable, &(rptentries[0].ResourceEntity)); if (!tmpentry || memcmp(rptentries, tmpentry, sizeof(SaHpiRptEntryT))) return 1; return 0; } openhpi-2.14.1/utils/t/rpt/rpt_utils_031.c0000644000076400007640000000217311302567130015156 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Renier Morales */ #include #include #include #include #include /** * main: Starting with an empty RPTable, adds 1 resource to it. * Fetches the resource back by id using a NULL table. * Passes the test if the interface returns NULL, else it fails. * * Return value: 0 on success, 1 on failure **/ int main(int argc, char **argv) { RPTable *rptable = (RPTable *)g_malloc0(sizeof(RPTable)); oh_init_rpt(rptable); if (oh_add_resource(rptable, rptentries, NULL, 1)) return 1; if (oh_get_resource_by_id(NULL, rptentries[0].ResourceId)) return 1; return 0; } openhpi-2.14.1/utils/t/rpt/rpt_utils_050.c0000644000076400007640000000263711302567130015164 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Renier Morales */ #include #include #include #include #include #include /** * main: Starts with an RPTable of 1 resource, adds 1 rdr with data * to first resource. Fetches data using a Record Id not present in the resource. * Success if the interface returns an error, otherwise there was a failure. * * Return value: 0 on success, 1 on failure **/ int main(int argc, char **argv) { RPTable *rptable = (RPTable *)g_malloc0(sizeof(RPTable)); oh_init_rpt(rptable); gchar *data = "My data"; if (oh_add_resource(rptable, rptentries, NULL, 1)) return 1; if (oh_add_rdr(rptable, rptentries[0].ResourceId, sensors, data, 1)) return 1; if (oh_get_rdr_data(rptable, rptentries[0].ResourceId, 255)) { printf("Data: %s\n",(char *)oh_get_rdr_data(rptable, rptentries[0].ResourceId, 0)); return 1; } return 0; } openhpi-2.14.1/utils/t/rpt/rpt_utils_037.c0000644000076400007640000000232511302567130015163 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Renier Morales */ #include #include #include #include #include /** * main: Adds 2 resources to an rpt table. * Fetches the 2nd resource through the get_next call * using a NULL table. * Passes the test if the interface returns NULL, else it fails. * * Return value: 0 on success, 1 on failure **/ int main(int argc, char **argv) { RPTable *rptable = (RPTable *)g_malloc0(sizeof(RPTable)); oh_init_rpt(rptable); if (oh_add_resource(rptable, rptentries, NULL, 1)) return 1; if (oh_add_resource(rptable, rptentries + 1, NULL, 1)) return 1; if (oh_get_resource_next(NULL, rptentries[0].ResourceId)) return 1; return 0; } openhpi-2.14.1/utils/t/rpt/rpt_utils_049.c0000644000076400007640000000245711302567130015174 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Renier Morales */ #include #include #include #include #include /** * main: Starts with an RPTable of 1 resource, adds 1 rdr with data * to first resource. Fetches data using a Resource Id not present in the table. * Success if the interface returns an error, otherwise there was a failure. * * Return value: 0 on success, 1 on failure **/ int main(int argc, char **argv) { RPTable *rptable = (RPTable *)g_malloc0(sizeof(RPTable)); oh_init_rpt(rptable); gchar *data = "My data"; if (oh_add_resource(rptable, rptentries, NULL, 1)) return 1; if (oh_add_rdr(rptable, rptentries[0].ResourceId, sensors, data, 1)) return 1; if (oh_get_rdr_data(rptable, 1234567, sensors[0].RecordId)) return 1; return 0; } openhpi-2.14.1/utils/t/rpt/rpt_utils_009.c0000644000076400007640000000336511302567130015167 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Renier Morales */ #include #include #include #include #include /** * main: Starts with an RPTable of 10 resources, adds 1 rdr * to first resource. Fetches rdr by record id and compares * with original. A failed comparison means the test failed, * otherwise the test passed. * * Return value: 0 on success, 1 on failure **/ int main(int argc, char **argv) { RPTable *rptable = (RPTable *)g_malloc0(sizeof(RPTable)); oh_init_rpt(rptable); SaHpiEntryIdT record_id; SaHpiRdrT *tmprdr = NULL; guint i = 0; for (i = 0; rptentries[i].ResourceId != 0; i++) { if (oh_add_resource(rptable, rptentries + i, NULL, 0)) return 1; } if (oh_add_rdr(rptable, SAHPI_FIRST_ENTRY, sensors, NULL,0)) { return 1; } record_id = oh_get_rdr_uid(sensors[0].RdrType, sensors[0].RdrTypeUnion.SensorRec.Num); sensors[0].RecordId = record_id; tmprdr = oh_get_rdr_by_id(rptable, SAHPI_FIRST_ENTRY, record_id); if (!tmprdr || memcmp(sensors, tmprdr, sizeof(SaHpiRdrT))) { return 1; } return 0; } openhpi-2.14.1/utils/t/rpt/rpt_utils_076.c0000644000076400007640000000246411302567130015172 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Renier Morales */ #include #include #include #include #include /** * main: Invokes rpt_diff with gone_res param as NULL. * If it returns error, the test passes, otherwise it failed. * * Return value: 0 on success, 1 on failure **/ int main(int argc, char **argv) { RPTable *curr_table = (RPTable *)g_malloc0(sizeof(RPTable)); RPTable *new_table = (RPTable *)g_malloc0(sizeof(RPTable)); GSList *new_res = NULL, *new_rdr = NULL, *gone_rdr = NULL; oh_init_rpt(curr_table); oh_init_rpt(new_table); if (oh_add_resource(curr_table, rptentries, NULL, 0)) return 1; if (oh_add_resource(new_table, rptentries + 1, NULL, 0)) return 1; if (!rpt_diff(curr_table, new_table, &new_res, &new_rdr, NULL, &gone_rdr)) return 1; return 0; } openhpi-2.14.1/utils/t/rpt/rpt_utils_021.c0000644000076400007640000000176211302567130015160 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Renier Morales */ #include #include #include #include #include /** * main: Starting with an empty RPTable, adds 1 NULL resource to it. * Passes the test if the interface returns an error, else it fails. * * Return value: 0 on success, 1 on failure **/ int main(int argc, char **argv) { RPTable *rptable = (RPTable *)g_malloc0(sizeof(RPTable)); oh_init_rpt(rptable); if (!oh_add_resource(rptable, NULL, NULL, 0)) return 1; return 0; } openhpi-2.14.1/utils/t/rpt/rpt_utils_079.c0000644000076400007640000000457511302567130015202 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Renier Morales */ #include #include #include #include #include #include /** * main: Starts with an RPTable of 10 resources, adds 5 control rdr * to first resource. Fetches controls ++randomly by record id and compares * with original. A failed comparison means the test failed, * otherwise the test passed. * * Return value: 0 on success, 1 on failure **/ int main(int argc, char **argv) { RPTable *rptable = (RPTable *)g_malloc0(sizeof(RPTable)); oh_init_rpt(rptable); GSList *records = NULL; guint i = 0; for (i = 0; rptentries[i].ResourceId != 0; i++) { if (oh_add_resource(rptable, rptentries + i, NULL, 0)) return 1; } for (i = 0; i < 5; i++) { if (oh_add_rdr(rptable, SAHPI_FIRST_ENTRY, controls + i, NULL,0)) return 1; else records = g_slist_append(records, controls + i); } for (; records; i--) { SaHpiRdrT *tmprdr = NULL, *randrdr = NULL; GSList *tmpnode = NULL; guint k = (guint) (((gfloat)i)*rand()/(RAND_MAX+1.0)); tmpnode = g_slist_nth(records, k); randrdr = (SaHpiRdrT *)tmpnode->data; randrdr->RecordId = oh_get_rdr_uid(randrdr->RdrType, randrdr->RdrTypeUnion.CtrlRec.Num); tmprdr = oh_get_rdr_by_id(rptable, SAHPI_FIRST_ENTRY, randrdr->RecordId); if (!tmprdr || memcmp(randrdr, tmprdr, sizeof(SaHpiRdrT))) return 1; else { records = g_slist_remove_link(records, tmpnode); g_slist_free_1(tmpnode); } } return 0; } openhpi-2.14.1/utils/t/rpt/rpt_utils_008.c0000644000076400007640000000314111302567130015156 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Renier Morales */ #include #include #include #include #include #include /** * main: Starts with an RPTable of 10 resources, starting at * a random resource on going on to the next, compares * resource ids against the originals. A failed comparison * means the test failed, otherwise the test passed. * * Return value: 0 on success, 1 on failure **/ int main(int argc, char **argv) { RPTable *rptable = (RPTable *)g_malloc0(sizeof(RPTable)); oh_init_rpt(rptable); SaHpiRptEntryT *tmpentry = NULL; guint i = 0, k = 0; for (i = 0; rptentries[i].ResourceId != 0; i++) { if (oh_add_resource(rptable, rptentries + i, NULL, 0)) return 1; } k = (guint) (((gfloat)i)*rand()/(RAND_MAX+1.0)); for (tmpentry = oh_get_resource_by_id(rptable, rptentries[k].ResourceId); tmpentry; tmpentry = oh_get_resource_next(rptable, tmpentry->ResourceId)) { if (rptentries[k++].ResourceId != tmpentry->ResourceId) return 1; } return 0; } openhpi-2.14.1/utils/t/rpt/rpt_utils_055.c0000644000076400007640000000267411302567130015172 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Renier Morales */ #include #include #include #include #include /** * main: Starts with an RPTable of 1 resource, adds 5 sensors ++to first resource. * Fetches an rdr by type using a Resource Id not present in the table. * Success if the interface returns an error, otherwise there was a failure. * * Return value: 0 on success, 1 on failure **/ int main(int argc, char **argv) { RPTable *rptable = (RPTable *)g_malloc0(sizeof(RPTable)); oh_init_rpt(rptable); guint i; if (oh_add_resource(rptable, rptentries, NULL, 1)) return 1; for (i = 0; i < 5; i++) { if (oh_add_rdr(rptable, rptentries[0].ResourceId, sensors+i, NULL, 1)) return 1; } if (oh_get_rdr_by_type(rptable, rptentries[1].ResourceId, sensors[0].RdrType, sensors[0].RdrTypeUnion.SensorRec.Num)) return 1; return 0; } openhpi-2.14.1/utils/t/rpt/rpt_utils_053.c0000644000076400007640000000255011302567130015161 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Renier Morales */ #include #include #include #include #include /** * main: Starts with an RPTable of 1 resource, adds 5 sensors ++to first resource. * Fetches an rdr by id using a Record Id not present in the resource. * Success if the interface returns an error, otherwise there was a failure. * * Return value: 0 on success, 1 on failure **/ int main(int argc, char **argv) { RPTable *rptable = (RPTable *)g_malloc0(sizeof(RPTable)); oh_init_rpt(rptable); guint i; if (oh_add_resource(rptable, rptentries, NULL, 1)) return 1; for (i = 0; i < 5; i++) { if (oh_add_rdr(rptable, rptentries[0].ResourceId, sensors+i, NULL, 1)) return 1; } if (oh_get_rdr_by_id(rptable, rptentries[0].ResourceId, 1234567)) return 1; return 0; } openhpi-2.14.1/utils/t/rpt/rpt_utils_020.c0000644000076400007640000000171111302567130015151 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Renier Morales */ #include #include #include #include #include /** * main: Starting with an empty RPTable, adds 1 resource to it * with a null table. Passes the test if the interface returns an error, * else it fails. * * Return value: 0 on success, 1 on failure **/ int main(int argc, char **argv) { RPTable *rptable = NULL; if (!oh_add_resource(rptable, rptentries, NULL, 0)) return 1; return 0; } openhpi-2.14.1/utils/t/rpt/rpt_utils_039.c0000644000076400007640000000274211302567130015170 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Renier Morales */ #include #include #include #include #include /** * main: Adds 10 resources to an rpt table. * Fetches the 1st resource through the get_next call * using SAHPI_FIRST_ENTRY for the Resource Id. Makes sure that the resource * returned is the 1st resource. * Passes the test if the interface returns a valid entry, else it fails. * * Return value: 0 on success, 1 on failure **/ int main(int argc, char **argv) { RPTable *rptable = (RPTable *)g_malloc0(sizeof(RPTable)); oh_init_rpt(rptable); SaHpiRptEntryT *tmpentry = NULL; guint i; for (i = 0; rptentries[i].ResourceId; i++) { if (oh_add_resource(rptable, rptentries+i, NULL, 1)) return 1; } tmpentry = oh_get_resource_next(rptable, SAHPI_FIRST_ENTRY); if (!tmpentry) return 1; if (tmpentry->ResourceId != rptentries[0].ResourceId) return 1; return 0; } openhpi-2.14.1/utils/t/rpt/rpt_utils_077.c0000644000076400007640000000246411302567130015173 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Renier Morales */ #include #include #include #include #include /** * main: Invokes rpt_diff with gone_rdr param as NULL. * If it returns error, the test passes, otherwise it failed. * * Return value: 0 on success, 1 on failure **/ int main(int argc, char **argv) { RPTable *curr_table = (RPTable *)g_malloc0(sizeof(RPTable)); RPTable *new_table = (RPTable *)g_malloc0(sizeof(RPTable)); GSList *new_res = NULL, *new_rdr = NULL, *gone_res = NULL; oh_init_rpt(curr_table); oh_init_rpt(new_table); if (oh_add_resource(curr_table, rptentries, NULL, 0)) return 1; if (oh_add_resource(new_table, rptentries + 1, NULL, 0)) return 1; if (!rpt_diff(curr_table, new_table, &new_res, &new_rdr, &gone_res, NULL)) return 1; return 0; } openhpi-2.14.1/utils/t/rpt/rpt_utils_029.c0000644000076400007640000000262011302567130015162 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Renier Morales */ #include #include #include #include #include /** * main: Starting with an empty RPTable, adds 2 resources to it with data. * Fetches the data back using SAHPI_FIRST_ENTRY as the Resource Id. * Passes the test if the interface returns the data, else it fails. * * Return value: 0 on success, 1 on failure **/ int main(int argc, char **argv) { RPTable *rptable = (RPTable *)g_malloc0(sizeof(RPTable)); oh_init_rpt(rptable); gchar *data1 = "My data 1"; gchar *data2 = "My data 2"; gchar *tmpdata = NULL; if (oh_add_resource(rptable, rptentries, data1, KEEP_RPT_DATA)) return 1; if (oh_add_resource(rptable, rptentries+1, data2, KEEP_RPT_DATA)) return 1; tmpdata = oh_get_resource_data(rptable, SAHPI_FIRST_ENTRY); if (data1 != tmpdata) return 1; return 0; } openhpi-2.14.1/utils/t/rpt/rpt_utils_060.c0000644000076400007640000000256211302567130015162 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Renier Morales */ #include #include #include #include #include /** * main: Starts with an RPTable of 1 resource, adds 5 sensors ++to first resource. * Fetches an rdr using get_next with the last Record Id in the resource. * Success if the interface returns NULL, otherwise there was a failure. * * Return value: 0 on success, 1 on failure **/ int main(int argc, char **argv) { RPTable *rptable = (RPTable *)g_malloc0(sizeof(RPTable)); oh_init_rpt(rptable); guint i; if (oh_add_resource(rptable, rptentries, NULL, 1)) return 1; for (i = 0; i < 5; i++) { if (oh_add_rdr(rptable, rptentries[0].ResourceId, sensors+i, NULL, 1)) return 1; } if (oh_get_rdr_next(rptable, rptentries[0].ResourceId, sensors[4].RecordId)) return 1; return 0; } openhpi-2.14.1/utils/t/rpt/rpt_utils_026.c0000644000076400007640000000261111302567130015157 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Renier Morales */ #include #include #include #include #include /** * main: Starting with an empty RPTable, adds 10 resources to it * and removes one by specifying SAHPI_FIRST_ENTRY as the Resource Id. * Removes again to make sure it is not there anymore. * Passes the test if the interface returns 0 (success), else it fails. * * Return value: 0 on success, 1 on failure **/ int main(int argc, char **argv) { RPTable *rptable = (RPTable *)g_malloc0(sizeof(RPTable)); oh_init_rpt(rptable); guint i; for (i = 0; rptentries[i].ResourceId != 0; i++) { if (oh_add_resource(rptable, rptentries+i, NULL, 0)) return 1; } if (oh_remove_resource(rptable, SAHPI_FIRST_ENTRY)) return 1; if (!oh_remove_resource(rptable, rptentries[0].ResourceId)) return 1; return 0; } openhpi-2.14.1/utils/t/rpt/rpt_utils_071.c0000644000076400007640000000151011302567130015154 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Renier Morales */ #include #include #include #include #include /** * main: Invoke oh_init_rpt with a NULL param. * If it returns error, the test passes, otherwise it failed. * * Return value: 0 on success, 1 on failure **/ int main(int argc, char **argv) { if (!oh_init_rpt(NULL)) return 1; return 0; } openhpi-2.14.1/utils/t/rpt/rpt_utils_025.c0000644000076400007640000000235111302567130015157 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Renier Morales */ #include #include #include #include #include /** * main: Starting with an empty RPTable, adds 10 resources to it * and removes one by specifying a Resource Id not present in the table. * Passes the test if the interface returns an error, else it fails. * * Return value: 0 on success, 1 on failure **/ int main(int argc, char **argv) { RPTable *rptable = (RPTable *)g_malloc0(sizeof(RPTable)); oh_init_rpt(rptable); guint i; for (i = 0; rptentries[i].ResourceId != 0; i++) { if (oh_add_resource(rptable, rptentries+i, NULL, 0)) return 1; } if (!oh_remove_resource(rptable, 1234567)) return 1; return 0; } openhpi-2.14.1/utils/t/rpt/rpt_utils_003.c0000644000076400007640000000423211302567130015153 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Renier Morales */ #include #include #include #include #include #include /** * main: Starts with an RPTable of 10 resources and fetches * them randomly by the ResourceId and compares them against the original * resource. A failed comparison means the test failed, * otherwise the test passed. * * Return value: 0 on success, 1 on failure **/ int main(int argc, char **argv) { RPTable *rptable = (RPTable *)g_malloc0(sizeof(RPTable)); oh_init_rpt(rptable); guint i = 0, k = 0; GSList *resources = NULL; for (i = 0; rptentries[i].ResourceId != 0; i++) { if (oh_add_resource(rptable, rptentries + i, NULL, 0)) return 1; else resources = g_slist_append(resources, rptentries + i); } for (; resources; i--) { SaHpiRptEntryT *randentry = NULL, *tmpentry = NULL; GSList *tmpnode = NULL; k = (guint) (((gfloat)i)*rand()/(RAND_MAX+1.0)); tmpnode = g_slist_nth(resources, k); randentry = (SaHpiRptEntryT *)tmpnode->data; tmpentry = oh_get_resource_by_id(rptable, randentry->ResourceId); if (!tmpentry || memcmp(randentry, tmpentry, sizeof(SaHpiRptEntryT))) return 1; else { resources = g_slist_remove_link(resources, tmpnode); g_slist_free_1(tmpnode); } } return 0; } openhpi-2.14.1/utils/t/rpt/rpt_utils_047.c0000644000076400007640000000256211302567130015167 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Renier Morales */ #include #include #include #include #include /** * main: Starting with an empty RPTable, adds 1 resource to it * and then adds 1 rdr to it. Removes rdr using a Record Id not present * in the resource. * Passes the test if the interface returns an error, else it fails. * * Return value: 0 on success, 1 on failure **/ int main(int argc, char **argv) { RPTable *rptable = (RPTable *)g_malloc0(sizeof(RPTable)); oh_init_rpt(rptable); guint i; for (i = 0; rptentries[i].ResourceId != 0; i++) { if (oh_add_resource(rptable, rptentries+i, NULL, 0)) return 1; } if (oh_add_rdr(rptable, rptentries[0].ResourceId, sensors, NULL, 1)) return 1; if (!oh_remove_rdr(rptable, rptentries[0].ResourceId, 20)) return 1; return 0; } openhpi-2.14.1/utils/t/rpt/rpt_utils_042.c0000644000076400007640000000237011302567130015157 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Renier Morales */ #include #include #include #include #include /** * main: Starting with an empty RPTable, adds 10 resources to it * and then adds 1 rdr to it using a Resource Id not present in the table. * Passes the test if the interface returns an error, else it fails. * * Return value: 0 on success, 1 on failure **/ int main(int argc, char **argv) { RPTable *rptable = (RPTable *)g_malloc0(sizeof(RPTable)); oh_init_rpt(rptable); guint i; for (i = 0; rptentries[i].ResourceId; i++) { if (oh_add_resource(rptable, rptentries+i, NULL, 0)) return 1; } if (!oh_add_rdr(rptable, 1234567, sensors, NULL, 1)) return 1; return 0; } openhpi-2.14.1/utils/t/rpt/rpt_utils_070.c0000644000076400007640000000257211302567130015164 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Renier Morales */ #include #include #include #include #include /** * main: Starting with an empty RPTable, adds 1 resource to it. * Checks rpt info to see if update count was updated, but it passes * NULL for a table. * If oh_get_rpt_info returns error, the test passes, otherwise it failed. * * Return value: 0 on success, 1 on failure **/ int main(int argc, char **argv) { RPTable *rptable = (RPTable *)g_malloc0(sizeof(RPTable)); oh_init_rpt(rptable); SaHpiUint32T update_count, update_count_new; SaHpiTimeT update_timestamp; update_count = rptable->update_count; if (oh_get_rpt_info(rptable, &update_count, &update_timestamp)) return 1; if (oh_add_resource(rptable, rptentries, NULL, 0)) return 1; if (!oh_get_rpt_info(NULL, &update_count_new, &update_timestamp)) return 1; return 0; } openhpi-2.14.1/utils/t/uid/0000755000076400007640000000000011405006365012355 5ustar openhpi-2.14.1/utils/t/uid/Makefile.am0000644000076400007640000000472711302567127014427 0ustar # (C) Copyright IBM Corp 2003, 2004 # All rights reserved. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This # file and program are licensed under a BSD style license. See # the Copying file included with the OpenHPI distribution for # full licensing terms. MAINTAINERCLEANFILES = Makefile.in REMOTE_SOURCES = uid_utils.c \ epath_utils.c \ sahpi_enum_utils.c \ sahpiatca_enum_utils.c \ sahpi_event_encode.c \ sahpi_event_utils.c \ sahpi_struct_utils.c \ sahpi_time_utils.c MOSTLYCLEANFILES = @TEST_CLEAN@ \ $(REMOTE_SOURCES) \ uid_map INCLUDES = @OPENHPI_INCLUDES@ LIBS += -luuid $(REMOTE_SOURCES): if test ! -f $@ -a ! -L $@; then \ $(LN_S) $(top_srcdir)/utils/$@; \ fi TESTS_ENVIRONMENT = OPENHPI_UID_MAP=$(shell pwd)/uid_map TESTS = uid_utils_000 \ uid_utils_001 \ uid_utils_002 \ uid_utils_003 \ uid_utils_004 \ uid_utils_005 \ uid_utils_006 \ uid_utils_007 \ uid_utils_008 \ uid_utils_009 \ uid_utils_010 \ uid_utils_011 \ uid_utils_012 \ uid_utils_013 check_PROGRAMS = $(TESTS) uid_utils_000_SOURCES = uid_utils_000.c nodist_uid_utils_000_SOURCES = $(REMOTE_SOURCES) uid_utils_001_SOURCES = uid_utils_001.c nodist_uid_utils_001_SOURCES = $(REMOTE_SOURCES) uid_utils_002_SOURCES = uid_utils_002.c nodist_uid_utils_002_SOURCES = $(REMOTE_SOURCES) uid_utils_003_SOURCES = uid_utils_003.c nodist_uid_utils_003_SOURCES = $(REMOTE_SOURCES) uid_utils_004_SOURCES = uid_utils_004.c nodist_uid_utils_004_SOURCES = $(REMOTE_SOURCES) uid_utils_005_SOURCES = uid_utils_005.c nodist_uid_utils_005_SOURCES = $(REMOTE_SOURCES) uid_utils_006_SOURCES = uid_utils_006.c nodist_uid_utils_006_SOURCES = $(REMOTE_SOURCES) uid_utils_007_SOURCES = uid_utils_007.c nodist_uid_utils_007_SOURCES = $(REMOTE_SOURCES) uid_utils_008_SOURCES = uid_utils_008.c nodist_uid_utils_008_SOURCES = $(REMOTE_SOURCES) uid_utils_009_SOURCES = uid_utils_009.c nodist_uid_utils_009_SOURCES = $(REMOTE_SOURCES) uid_utils_010_SOURCES = uid_utils_010.c nodist_uid_utils_010_SOURCES = $(REMOTE_SOURCES) uid_utils_011_SOURCES = uid_utils_011.c nodist_uid_utils_011_SOURCES = $(REMOTE_SOURCES) uid_utils_012_SOURCES = uid_utils_012.c nodist_uid_utils_012_SOURCES = $(REMOTE_SOURCES) uid_utils_013_SOURCES = uid_utils_013.c nodist_uid_utils_013_SOURCES = $(REMOTE_SOURCES) openhpi-2.14.1/utils/t/uid/uid_utils_001.c0000644000076400007640000000174511302567127015115 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Renier Morales */ #include #include #include /** * main: Get a new unique id. Get another one with the same entity path. * Passes if returned id is equal to previous one, * otherwise fails. * * Return value: 0 on success, 1 on failure **/ int main(int argc, char **argv) { SaHpiEntityPathT ep; guint id, rid; if (oh_uid_initialize()) return 1; oh_init_ep(&ep); id = oh_uid_from_entity_path(&ep); rid = oh_uid_from_entity_path(&ep); if (id != rid) return 1; return 0; } openhpi-2.14.1/utils/t/uid/uid_utils_003.c0000644000076400007640000000233411302567127015112 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Renier Morales */ #include #include #include /** * main: Get 10 new unique ids. Get 10 more with the same entity paths. * Passes if returned ids are equal to previous ones, * otherwise fails. * * Return value: 0 on success, 1 on failure **/ int main(int argc, char **argv) { SaHpiEntityPathT ep; guint id[10], rid, i; if (oh_uid_initialize()) return 1; oh_init_ep(&ep); for (i = 0; i < 10; i++) { ep.Entry[0].EntityLocation = i; id[i] = oh_uid_from_entity_path(&ep); } for (i = 0; i < 10; i++) { ep.Entry[0].EntityLocation = i; rid = oh_uid_from_entity_path(&ep); if (id[i] != rid) return 1; } return 0; } openhpi-2.14.1/utils/t/uid/uid_utils_006.c0000644000076400007640000000225611302567127015120 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Renier Morales */ #include #include #include /** * main: Get 10 new unique ids. Look up ids by ep. * Passes if lookups find correct ids, * otherwise fails. * * Return value: 0 on success, 1 on failure **/ int main(int argc, char **argv) { SaHpiEntityPathT ep; guint id[10], rid, i; if (oh_uid_initialize()) return 1; oh_init_ep(&ep); for (i = 0; i < 10; i++) { ep.Entry[0].EntityLocation = i; id[i] = oh_uid_from_entity_path(&ep); } for (i = 0; i < 10; i++) { ep.Entry[0].EntityLocation = i; rid = oh_uid_lookup(&ep); if (rid != id[i]) return 1; } return 0; } openhpi-2.14.1/utils/t/uid/uid_utils_012.c0000644000076400007640000000177711302567127015124 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Renier Morales */ #include #include #include /** * main: Calls oh_entity_path_lookup using a NULL entity path. * Passes if it returns -1, * otherwise fails. * * Return value: 0 on success, 1 on failure **/ int main(int argc, char **argv) { SaHpiEntityPathT ep; guint id; oh_init_ep(&ep); if (oh_uid_initialize()) return 1; id = oh_uid_from_entity_path(&ep); if (!id) return 1; if (!oh_entity_path_lookup(id, NULL)) return 1; return 0; } openhpi-2.14.1/utils/t/uid/uid_utils_013.c0000644000076400007640000000200511302567127015106 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Renier Morales */ #include #include #include /** * main: Calls oh_entity_path_lookup using a NULL id and entity path. * Passes if it returns -1, * otherwise fails. * * Return value: 0 on success, 1 on failure **/ int main(int argc, char **argv) { SaHpiEntityPathT ep; guint id; oh_init_ep(&ep); if (oh_uid_initialize()) return 1; id = oh_uid_from_entity_path(&ep); if (!id) return 1; if (!oh_entity_path_lookup(0, NULL)) return 1; return 0; } openhpi-2.14.1/utils/t/uid/uid_utils_008.c0000644000076400007640000000153511302567127015121 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Renier Morales */ #include #include #include /** * main: Calls oh_uid_from_entity_path using a NULL entity path. * Passes if it returns 0, * otherwise fails. * * Return value: 0 on success, 1 on failure **/ int main(int argc, char **argv) { if (oh_uid_initialize()) return 1; if (oh_uid_from_entity_path(NULL)) return 1; return 0; } openhpi-2.14.1/utils/t/uid/uid_utils_000.c0000644000076400007640000000176711302567127015120 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Renier Morales */ #include #include #include /** * main: Get a new unique id. Use id to lookup original entity path. * Passes if returned entity path is equal to original entity path, * otherwise fails. * * Return value: 0 on success, 1 on failure **/ int main(int argc, char **argv) { SaHpiEntityPathT ep, rep; guint id; if (oh_uid_initialize()) return 1; oh_init_ep(&ep); id = oh_uid_from_entity_path(&ep); if (oh_entity_path_lookup(id, &rep)) return 1; if (!oh_cmp_ep(&ep, &rep)) return 1; return 0; } openhpi-2.14.1/utils/t/uid/uid_utils_004.c0000644000076400007640000000246411302567127015117 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Renier Morales */ #include #include #include /** * main: Get 10 new unique ids. Remove two. Look up removed ids by ep. * Passes if lookups don't find anything, * otherwise fails. * * Return value: 0 on success, 1 on failure **/ int main(int argc, char **argv) { SaHpiEntityPathT ep; guint id[10], i; if (oh_uid_initialize()) return 1; oh_init_ep(&ep); for (i = 0; i < 10; i++) { ep.Entry[0].EntityLocation = i; id[i] = oh_uid_from_entity_path(&ep); } if (oh_uid_remove(id[9])) return 1; if (oh_uid_remove(id[4])) return 1; ep.Entry[0].EntityLocation = 9; if (oh_uid_lookup(&ep)) return 1; ep.Entry[0].EntityLocation = 4; if (oh_uid_lookup(&ep)) return 1; return 0; } openhpi-2.14.1/utils/t/uid/uid_utils_011.c0000644000076400007640000000172411302567127015113 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Renier Morales */ #include #include #include /** * main: Calls oh_entity_path_lookup using a 0 id. * Passes if it returns -1, * otherwise fails. * * Return value: 0 on success, 1 on failure **/ int main(int argc, char **argv) { SaHpiEntityPathT ep, rep; oh_init_ep(&ep); if (oh_uid_initialize()) return 1; if (!oh_uid_from_entity_path(&ep)) return 1; if (!oh_entity_path_lookup(0, &rep)) return 1; return 0; } openhpi-2.14.1/utils/t/uid/uid_utils_005.c0000644000076400007640000000240311302567127015111 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Renier Morales */ #include #include #include /** * main: Get 10 new unique ids. Remove two. Look up removed ids. * Passes if lookups don't find anything, * otherwise fails. * * Return value: 0 on success, 1 on failure **/ int main(int argc, char **argv) { SaHpiEntityPathT ep, rep; guint id[10], i; if (oh_uid_initialize()) return 1; oh_init_ep(&ep); for (i = 0; i < 10; i++) { ep.Entry[0].EntityLocation = i; id[i] = oh_uid_from_entity_path(&ep); } if (oh_uid_remove(id[8])) return 1; if (oh_uid_remove(id[3])) return 1; if (!oh_entity_path_lookup(id[8],&rep)) return 1; if (!oh_entity_path_lookup(id[3],&rep)) return 1; return 0; } openhpi-2.14.1/utils/t/uid/uid_utils_010.c0000644000076400007640000000170611302567127015112 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Renier Morales */ #include #include #include /** * main: Calls oh_uid_lookup using a NULL entity path. * Passes if it returns 0, * otherwise fails. * * Return value: 0 on success, 1 on failure **/ int main(int argc, char **argv) { SaHpiEntityPathT ep; oh_init_ep(&ep); if (oh_uid_initialize()) return 1; if (!oh_uid_from_entity_path(&ep)) return 1; if (oh_uid_lookup(NULL)) return 1; return 0; } openhpi-2.14.1/utils/t/uid/uid_utils_009.c0000644000076400007640000000172211302567127015120 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Renier Morales */ #include #include #include /** * main: Calls oh_uid_remove using 0 as id. * Passes if it returns -1, * otherwise fails. * * Return value: 0 on success, 1 on failure **/ int main(int argc, char **argv) { SaHpiEntityPathT ep; oh_init_ep(&ep); if (oh_uid_initialize()) return 1; if (!oh_uid_from_entity_path(&ep)) return 1; if (!oh_uid_remove(0)) return 1; return 0; } openhpi-2.14.1/utils/t/uid/uid_utils_002.c0000644000076400007640000000243311302567127015111 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Renier Morales */ #include #include #include /** * main: Get 10 new unique ids. Use ids to lookup original entity paths. * Passes if returned entity path is equal to original entity path, * otherwise fails. * * Return value: 0 on success, 1 on failure **/ int main(int argc, char **argv) { SaHpiEntityPathT ep, rep; guint id[10], i; if (oh_uid_initialize()) return 1; oh_init_ep(&ep); for (i = 0; i < 10; i++) { ep.Entry[0].EntityLocation = i; id[i] = oh_uid_from_entity_path(&ep); } for (i = 0; i < 10; i++) { ep.Entry[0].EntityLocation = i; if (oh_entity_path_lookup(id[i], &rep)) return 1; if (!oh_cmp_ep(&ep, &rep)) return 1; } return 0; } openhpi-2.14.1/utils/t/uid/uid_utils_007.c0000644000076400007640000000242211302567127015114 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Renier Morales */ #include #include #include /** * main: Get 10 new unique ids. Look up ids by ep. * Changes values after ROOT element before looking up. * Passes if lookups find correct ids, * otherwise fails. * * Return value: 0 on success, 1 on failure **/ int main(int argc, char **argv) { SaHpiEntityPathT ep; guint id[10], rid, i; if (oh_uid_initialize()) return 1; oh_init_ep(&ep); for (i = 0; i < 10; i++) { ep.Entry[0].EntityLocation = i; id[i] = oh_uid_from_entity_path(&ep); } for (i = 0; i < 10; i++) { ep.Entry[0].EntityLocation = i; ep.Entry[1].EntityType = 0; rid = oh_uid_lookup(&ep); if (rid != id[i]) return 1; } return 0; } openhpi-2.14.1/utils/t/el/0000755000076400007640000000000011405006365012174 5ustar openhpi-2.14.1/utils/t/el/el_test_045.c0000755000076400007640000000331311302567077014402 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * Copyright (c) 2004 by Intel Corp. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Christina Hernandez */ #include #include #include #include #include #include #include #include #include "el_test.h" /** * main: EL test * * This test verifies failure of oh_el_prepend when el-> gentimestamp == FALSE * * Return value: 0 on success, 1 on failure **/ int main(int argc, char **argv) { oh_el *el; SaErrorT retc; SaHpiEventT event; static char *data[1] = { "Test data one" }; /*test oh_el_prepend with el->gentimestamp == FALSE*/ el = oh_el_create(20); event.Source = 1; event.EventType = SAHPI_ET_USER; event.Timestamp = SAHPI_TIME_UNSPECIFIED; event.Severity = SAHPI_DEBUG; el->gentimestamp = SAHPI_FALSE; strcpy((char *) &event.EventDataUnion.UserEvent.UserEventData.Data, data[0]); retc = oh_el_prepend(el, &event, NULL, NULL); if (retc != SA_OK) { err("ERROR: oh_el_prepend failed."); return 1; } /* close el */ retc = oh_el_close(el); if (retc != SA_OK) { err("ERROR: oh_el_close on el failed."); return 1; } return 0; } openhpi-2.14.1/utils/t/el/Makefile.am0000755000076400007640000001313411302567077014245 0ustar # (C) Copyright IBM Corp 2003, 2004 # All rights reserved. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This # file and program are licensed under a BSD style license. See # the Copying file included with the OpenHPI distribution for # full licensing terms. MAINTAINERCLEANFILES = Makefile.in REMOTE_SOURCES = el_utils.c MOSTLYCLEANFILES = $(shell ls *data) $(REMOTE_SOURCES) @TEST_CLEAN@ CLEANFILES = $(top_builddir)/src/t/el/elTest.data INCLUDES = @OPENHPI_INCLUDES@ $(REMOTE_SOURCES): if test ! -f $@ -a ! -L $@; then \ $(LN_S) $(top_srcdir)/utils/$@; \ fi TESTS = el_test_001 \ el_test_002 \ el_test_003 \ el_test_004 \ el_test_005 \ el_test_006 \ el_test_007 \ el_test_008 \ el_test_009 \ el_test_010 \ el_test_011 \ el_test_012 \ el_test_013 \ el_test_014 \ el_test_015 \ el_test_016 \ el_test_017 \ el_test_018 \ el_test_019 \ el_test_020 \ el_test_021 \ el_test_022 \ el_test_023 \ el_test_024 \ el_test_025 \ el_test_026 \ el_test_027 \ el_test_028 \ el_test_029 \ el_test_030 \ el_test_031 \ el_test_032 \ el_test_033 \ el_test_034 \ el_test_035 \ el_test_036 \ el_test_037 \ el_test_038 \ el_test_039 \ el_test_040 \ el_test_041 \ el_test_042 \ el_test_043 \ el_test_044 \ el_test_045 check_PROGRAMS = $(TESTS) el_test_001_SOURCES = el_test.h el_test_001.c nodist_el_test_001_SOURCES = $(REMOTE_SOURCES) el_test_002_SOURCES = el_test.h el_test_002.c nodist_el_test_002_SOURCES = $(REMOTE_SOURCES) el_test_003_SOURCES = el_test.h el_test_003.c nodist_el_test_003_SOURCES = $(REMOTE_SOURCES) el_test_004_SOURCES = el_test.h el_test_004.c nodist_el_test_004_SOURCES = $(REMOTE_SOURCES) el_test_005_SOURCES = el_test.h el_test_005.c el_compare.c nodist_el_test_005_SOURCES = $(REMOTE_SOURCES) el_test_006_SOURCES = el_test.h el_test_006.c el_compare.c nodist_el_test_006_SOURCES = $(REMOTE_SOURCES) el_test_007_SOURCES = el_test.h el_test_007.c nodist_el_test_007_SOURCES = $(REMOTE_SOURCES) el_test_008_SOURCES = el_test.h el_test_008.c nodist_el_test_008_SOURCES = $(REMOTE_SOURCES) el_test_009_SOURCES = el_test.h el_test_009.c nodist_el_test_009_SOURCES = $(REMOTE_SOURCES) el_test_010_SOURCES = el_test.h el_test_010.c nodist_el_test_010_SOURCES = $(REMOTE_SOURCES) el_test_011_SOURCES = el_test.h el_test_011.c nodist_el_test_011_SOURCES = $(REMOTE_SOURCES) el_test_012_SOURCES = el_test.h el_test_012.c nodist_el_test_012_SOURCES = $(REMOTE_SOURCES) el_test_013_SOURCES = el_test.h el_test_013.c nodist_el_test_013_SOURCES = $(REMOTE_SOURCES) el_test_014_SOURCES = el_test.h el_test_014.c nodist_el_test_014_SOURCES = $(REMOTE_SOURCES) el_test_015_SOURCES = el_test.h el_test_015.c nodist_el_test_015_SOURCES = $(REMOTE_SOURCES) el_test_016_SOURCES = el_test.h el_test_016.c nodist_el_test_016_SOURCES = $(REMOTE_SOURCES) el_test_017_SOURCES = el_test.h el_test_017.c nodist_el_test_017_SOURCES = $(REMOTE_SOURCES) el_test_018_SOURCES = el_test.h el_test_018.c nodist_el_test_018_SOURCES = $(REMOTE_SOURCES) el_test_019_SOURCES = el_test.h el_test_019.c nodist_el_test_019_SOURCES = $(REMOTE_SOURCES) el_test_020_SOURCES = el_test.h el_test_020.c nodist_el_test_020_SOURCES = $(REMOTE_SOURCES) el_test_021_SOURCES = el_test.h el_test_021.c nodist_el_test_021_SOURCES = $(REMOTE_SOURCES) el_test_022_SOURCES = el_test.h el_test_022.c nodist_el_test_022_SOURCES = $(REMOTE_SOURCES) el_test_023_SOURCES = el_test.h el_test_023.c nodist_el_test_023_SOURCES = $(REMOTE_SOURCES) el_test_024_SOURCES = el_test.h el_test_024.c nodist_el_test_024_SOURCES = $(REMOTE_SOURCES) el_test_025_SOURCES = el_test.h el_test_025.c nodist_el_test_025_SOURCES = $(REMOTE_SOURCES) el_test_026_SOURCES = el_test.h el_test_026.c nodist_el_test_026_SOURCES = $(REMOTE_SOURCES) el_test_027_SOURCES = el_test.h el_test_027.c nodist_el_test_027_SOURCES = $(REMOTE_SOURCES) el_test_028_SOURCES = el_test.h el_test_028.c nodist_el_test_028_SOURCES = $(REMOTE_SOURCES) el_test_029_SOURCES = el_test.h el_test_029.c nodist_el_test_029_SOURCES = $(REMOTE_SOURCES) el_test_030_SOURCES = el_test.h el_test_030.c nodist_el_test_030_SOURCES = $(REMOTE_SOURCES) el_test_031_SOURCES = el_test.h el_test_031.c nodist_el_test_031_SOURCES = $(REMOTE_SOURCES) el_test_032_SOURCES = el_test.h el_test_032.c nodist_el_test_032_SOURCES = $(REMOTE_SOURCES) el_test_033_SOURCES = el_test.h el_test_033.c nodist_el_test_033_SOURCES = $(REMOTE_SOURCES) el_test_034_SOURCES = el_test.h el_test_034.c nodist_el_test_034_SOURCES = $(REMOTE_SOURCES) el_test_035_SOURCES = el_test.h el_test_035.c nodist_el_test_035_SOURCES = $(REMOTE_SOURCES) el_test_036_SOURCES = el_test.h el_test_036.c nodist_el_test_036_SOURCES = $(REMOTE_SOURCES) el_test_037_SOURCES = el_test.h el_test_037.c nodist_el_test_037_SOURCES = $(REMOTE_SOURCES) el_test_038_SOURCES = el_test.h el_test_038.c nodist_el_test_038_SOURCES = $(REMOTE_SOURCES) el_test_039_SOURCES = el_test.h el_test_039.c nodist_el_test_039_SOURCES = $(REMOTE_SOURCES) el_test_040_SOURCES = el_test.h el_test_040.c nodist_el_test_040_SOURCES = $(REMOTE_SOURCES) el_test_041_SOURCES = el_test.h el_test_041.c nodist_el_test_041_SOURCES = $(REMOTE_SOURCES) el_test_042_SOURCES = el_test.h el_test_042.c nodist_el_test_042_SOURCES = $(REMOTE_SOURCES) el_test_043_SOURCES = el_test.h el_test_043.c nodist_el_test_043_SOURCES = $(REMOTE_SOURCES) el_test_044_SOURCES = el_test.h el_test_044.c nodist_el_test_044_SOURCES = $(REMOTE_SOURCES) el_test_045_SOURCES = el_test.h el_test_045.c nodist_el_test_045_SOURCES = $(REMOTE_SOURCES) openhpi-2.14.1/utils/t/el/el_test_027.c0000755000076400007640000000262711302567077014411 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * Copyright (c) 2004 by Intel Corp. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Christina Hernandez */ #include #include #include #include #include #include #include #include #include "el_test.h" /** * main: EL test * * This test verifies failure of oh_el_get when EL is empty * * Return value: 0 on success, 1 on failure **/ int main(int argc, char **argv) { oh_el *el; oh_el_entry *entry; SaHpiEventLogEntryIdT prev, next; SaErrorT retc; /* create an empty EL */ el = oh_el_create (20); /* fetch the event for el*/ retc = oh_el_get(el, SAHPI_FIRST_ENTRY, &prev, &next, &entry); if (retc == SA_OK) { err("ERROR: oh_el_get failed."); return 1; } /* close el */ retc = oh_el_close(el); if (retc != SA_OK) { err("ERROR: oh_el_close on el failed."); return 1; } return 0; } openhpi-2.14.1/utils/t/el/el_test_028.c0000755000076400007640000000315111302567077014403 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * Copyright (c) 2004 by Intel Corp. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Christina Hernandez */ #include #include #include #include #include #include #include #include #include "el_test.h" /** * main: EL test * * This test verifies oh_el_get when entryid = SAHPI_NEWEST_ENTRY * * Return value: 0 on success, 1 on failure **/ int main(int argc, char **argv) { oh_el *el; oh_el_entry *entry; SaHpiEventLogEntryIdT prev, next; SaErrorT retc; /* set entryid = SAHPI_NEWEST_ENTRY */ el = oh_el_create(20); retc = oh_el_map_from_file(el, "./elTest.data"); if (retc != SA_OK) { err("ERROR: oh_el_map_from_file failed."); return 1; } entry = (oh_el_entry *)(g_list_first(el->list)->data); retc = oh_el_get(el, SAHPI_NEWEST_ENTRY, &prev, &next, &entry); if (retc != SA_OK) { err("ERROR: oh_el_get failed."); return 1; } /* close el */ retc = oh_el_close(el); if (retc != SA_OK) { err("ERROR: oh_el_close on el failed."); return 1; } return 0; } openhpi-2.14.1/utils/t/el/el_test_009.c0000755000076400007640000000222611302567077014404 0ustar /* -*- linux-c -*- ** ** (C) Copyright IBM Corp. 2004 ** Copyright (c) 2004 by Intel Corp. ** ** This program is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This ** file and program are licensed under a BSD style license. See ** the Copying file included with the OpenHPI distribution for ** full licensing terms. ** ** Authors: ** Christina Hernandez **/ #include #include #include #include #include #include #include "el_test.h" /** * main: EL test * * This negative test sets el equal to null and * then verifies oh_el_close fails. * * Return value: 0 on success, 1 on failure **/ int main(int argc, char **argv) { oh_el *el; SaErrorT retc; /* create a null EL*/ el = NULL; /* close el without saving to file*/ retc = oh_el_close(el); if (retc == SA_OK) { err("ERROR: oh_el_close on el failed."); return 1; } return 0; } openhpi-2.14.1/utils/t/el/el_test_010.c0000755000076400007640000000406311302567077014375 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * Copyright (c) 2004 by Intel Corp. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Christina Hernandez */ #include #include #include #include #include #include #include #include #include "el_test.h" /** * main: EL test * * This test verifies oh_el_prepend by reading an * existing EL from a file, then prepending 5 events to the EL. * * Return value: 0 on success, 1 on failure **/ int main(int argc, char **argv) { oh_el *el; SaErrorT retc; int x; SaHpiEventT event; static char *data[5] = { "Test data one", "Test data two", "Test data three", "Test data four", "Test data five" }; /* test oh_el_prepend with existing EL*/ el = oh_el_create(20); /* get EL from file (el) */ retc = oh_el_map_from_file(el, "./elTest.data"); if (retc != SA_OK) { err("ERROR: oh_el_map_from_file failed."); return 1; } /* add 5 more events to el */ for(x=0;x<5;x++){ event.Source = 1; event.EventType = SAHPI_ET_USER; event.Timestamp = SAHPI_TIME_UNSPECIFIED; event.Severity = SAHPI_DEBUG; strcpy((char *) &event.EventDataUnion.UserEvent.UserEventData.Data, data[x]); retc = oh_el_prepend(el, &event, NULL, NULL); if (retc != SA_OK) { err("ERROR: oh_el_append failed."); return 1; } } /* close el */ retc = oh_el_close(el); if (retc != SA_OK) { err("ERROR: oh_el_close on el failed."); return 1; } return 0; } openhpi-2.14.1/utils/t/el/el_test_015.c0000755000076400007640000000350111302567077014376 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * Copyright (c) 2004 by Intel Corp. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Christina Hernandez */ #include #include #include #include #include #include #include #include #include "el_test.h" /** * main: EL test * * This test verifies failure of oh_el_append when el->info.Size != * OH_EL_MAX_SIZE && g_list_length(el->list) == el->info.Size * * Return value: 0 on success, 1 on failure **/ int main(int argc, char **argv) { oh_el *el; SaErrorT retc; SaHpiEventT event; static char *data[1] = { "Test data one" }; /*test oh_el_append with el->info.Size != OH_EL_MAX_SIZE && g_list_length(el->list) == el->info.Size */ el = oh_el_create(20); el->info.Size = g_list_length(el->list); event.Source = 1; event.EventType = SAHPI_ET_USER; event.Timestamp = SAHPI_TIME_UNSPECIFIED; event.Severity = SAHPI_DEBUG; strcpy((char *) &event.EventDataUnion.UserEvent.UserEventData.Data, data[0]); retc = oh_el_append(el, &event, NULL, NULL); if (retc != SA_OK) { err("ERROR: oh_el_append failed."); return 1; } /* close el */ retc = oh_el_close(el); if (retc != SA_OK) { err("ERROR: oh_el_close on el failed."); return 1; } return 0; } openhpi-2.14.1/utils/t/el/el_test_031.c0000755000076400007640000000253511302567077014402 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * Copyright (c) 2004 by Intel Corp. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Christina Hernandez */ #include #include #include #include #include #include #include #include #include "el_test.h" /** * main: EL test * * This test verifies the failure of oh_el_info * when info == NULL * * Return value: 0 on success, 1 on failure **/ int main(int argc, char **argv) { oh_el *el; SaErrorT retc; /* test oh_el_info with info == NULL */ el = oh_el_create(20); retc = oh_el_info(el, NULL); if (retc == SA_OK) { err("ERROR: oh_el_info failed."); return 1; } /* close el without saving to file*/ retc = oh_el_close(el); if (retc != SA_OK) { err("ERROR: oh_el_close on el failed."); return 1; } return 0; } openhpi-2.14.1/utils/t/el/el_test_039.c0000755000076400007640000000262011302567077014405 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * Copyright (c) 2004 by Intel Corp. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Christina Hernandez */ #include #include #include #include #include #include #include #include #include "el_test.h" /** * main: EL test * * This test verifies the failure of oh_el_map_from_file when * filename does not exist. * * Return value: 0 on success, 1 on failure **/ int main(int argc, char **argv) { oh_el *el; SaErrorT retc; /* test failure of oh_el_map_from_file with nonexistant filename */ el = oh_el_create(20); retc = oh_el_map_from_file(el, "./notthere.data"); if (retc == SA_OK) { err("ERROR: oh_el_map_from_file failed."); return 1; } /* close el */ retc = oh_el_close(el); if (retc != SA_OK) { err("ERROR: oh_el_close on el failed."); return 1; } return 0; } openhpi-2.14.1/utils/t/el/el_compare.c0000755000076400007640000000317711302567077014471 0ustar #include #include #include #include #include #include "el_test.h" /* function to compare two event logs */ int el_compare(oh_el *el1, oh_el *el2) { oh_el_entry *entry1, *entry2; SaHpiEventLogEntryIdT prev1, prev2, next1, next2, cur1, cur2; SaErrorT retc; if (g_list_length(el1->list) != g_list_length(el2->list)) { err("ERROR: el1->list != el2->list."); return 1; } if ((g_list_length(el1->list) == 0) && (g_list_length(el2->list) == 0)) { return 0; } next1 = SAHPI_OLDEST_ENTRY; next2 = SAHPI_OLDEST_ENTRY; while (next1 != SAHPI_NO_MORE_ENTRIES) { cur1 = next1; cur2 = next2; /* fetch the event for el1*/ retc = oh_el_get(el1, cur1, &prev1, &next1, &entry1); if (retc != SA_OK) { err("ERROR: oh_el_get failed."); return 1; } /* fetch the event for el2*/ retc = oh_el_get(el2, cur2, &prev2, &next2, &entry2); if (retc != SA_OK) { err("ERROR: oh_el_get failed."); return 1; } if (memcmp(&entry1->event.Event, &entry2->event.Event, sizeof(SaHpiEventT))) { err("ERROR: Data from el1 and el2 do not match"); return 1; } /* Compare resource from el1 and el2 */ if (memcmp(&entry1->res, &entry2->res, sizeof(SaHpiRptEntryT))) { err("ERROR: Res from el1 and el2 do not match."); return 1; } /* Compare rdr from el1 and el2 */ if (memcmp(&entry1->rdr, &entry2->rdr, sizeof(SaHpiRdrT))) { err("ERROR: Rdr from el1 and el2 do not match."); return 1; } } return 0; } openhpi-2.14.1/utils/t/el/el_test_012.c0000755000076400007640000000251511302567077014377 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * Copyright (c) 2004 by Intel Corp. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Christina Hernandez */ #include #include #include #include #include #include #include #include #include "el_test.h" /** * main: EL test * * This test verifies failure of oh_el_append when event == NULL * * Return value: 0 on success, 1 on failure **/ int main(int argc, char **argv) { oh_el *el; SaErrorT retc; /*test oh_el_append with event==NULL*/ el = oh_el_create(20); retc = oh_el_append(el, NULL, NULL, NULL); if (retc == SA_OK) { err("ERROR: oh_el_append failed."); return 1; } /* close el */ retc = oh_el_close(el); if (retc != SA_OK) { err("ERROR: oh_el_close on el failed."); return 1; } return 0; } openhpi-2.14.1/utils/t/el/el_test_035.c0000755000076400007640000000254611302567077014410 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * Copyright (c) 2004 by Intel Corp. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Christina Hernandez */ #include #include #include #include #include #include #include #include #include "el_test.h" /** * main: EL test * * This test verifies the failure of oh_el_map_to_file * when filename == NULL. * * Return value: 0 on success, 1 on failure **/ int main(int argc, char **argv) { oh_el *el; SaErrorT retc; /* attempt to save an el to a filename == NULL */ el = oh_el_create(20); retc = oh_el_map_to_file(el, NULL); if (retc == SA_OK) { err("ERROR: oh_el_map_to_file failed."); return 1; } /* close el */ retc = oh_el_close(el); if (retc != SA_OK) { err("ERROR: oh_el_close on el failed."); return 1; } return 0; } openhpi-2.14.1/utils/t/el/el_test_007.c0000755000076400007640000000434211302567077014403 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * Copyright (c) 2004 by Intel Corp. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Christina Hernandez */ #include #include #include #include #include #include #include #include #include "el_test.h" /** * main: EL test * * This test modifies the timestamp basetime. * It then adds a new entry and examines the * timestamp to verify accuracy. * * Return value: 0 on success, 1 on failure **/ int main(int argc, char **argv) { oh_el *el; SaErrorT retc; SaHpiEventLogInfoT info; SaHpiEventT event; SaHpiTimeT timestamp = 1000000000LL; static char *data[1] = { "Test data" }; /* create a new EL of size 20*/ el = oh_el_create(20); /* add an event to el */ event.Source = 1; event.EventType = SAHPI_ET_USER; event.Timestamp = SAHPI_TIME_UNSPECIFIED; event.Severity = SAHPI_DEBUG; strcpy((char *)event.EventDataUnion.UserEvent.UserEventData.Data, data[0]); /* modifies the timestamp basetime */ retc = oh_el_timeset(el, timestamp); if (retc != SA_OK){ err("ERROR: timeset failed"); return 1; } retc = oh_el_append(el, &event, NULL, NULL); if (retc != SA_OK) { err("ERROR: oh_el_append failed."); return 1; } /* get el info */ retc = oh_el_info(el, &info); if (retc != SA_OK) { err("ERROR: oh_el_info failed."); return 1; } /* Verifies timestamp basetime worked */ if (info.UpdateTimestamp < timestamp){ err("ERROR: Timestamp basetime failed"); return 1; } /* close el without saving to file*/ retc = oh_el_close(el); if (retc != SA_OK) { err("ERROR: oh_el_close on el failed."); return 1; } return 0; } openhpi-2.14.1/utils/t/el/el_test_019.c0000755000076400007640000000311211302567077014400 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * Copyright (c) 2004 by Intel Corp. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Christina Hernandez */ #include #include #include #include #include #include #include #include #include "el_test.h" /** * main: EL test * * This test verifies failure of oh_el_prepend when el->info.Enabled == SAHPI_FALSE * * Return value: 0 on success, 1 on failure **/ int main(int argc, char **argv) { oh_el *el; SaErrorT retc; SaHpiEventT event; /*test oh_el_prepend with el->info.Enabled == SAHPI_FALSE*/ el = oh_el_create(20); el->info.Enabled = SAHPI_FALSE; event.Source = 1; event.EventType = SAHPI_ET_RESOURCE; event.Timestamp = SAHPI_TIME_UNSPECIFIED; event.Severity = SAHPI_DEBUG; retc = oh_el_prepend(el, &event, NULL, NULL); if (retc == SA_OK) { err("ERROR: oh_el_add failed."); return 1; } /* close el */ retc = oh_el_close(el); if (retc != SA_OK) { err("ERROR: oh_el_close on el failed."); return 1; } return 0; } openhpi-2.14.1/utils/t/el/el_test.h0000755000076400007640000000104511302567077014017 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * Copyright (c) 2004 by Intel Corp. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * David Ashley */ int el_compare(oh_el *el1, oh_el *el2); openhpi-2.14.1/utils/t/el/el_test_025.c0000755000076400007640000000252011302567077014377 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * Copyright (c) 2004 by Intel Corp. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Christina Hernandez */ #include #include #include #include #include #include #include #include #include "el_test.h" /** * main: EL test * * This test verifies failure of oh_el_get when entry == NULL * * Return value: 0 on success, 1 on failure **/ int main(int argc, char **argv) { oh_el *el; SaHpiBoolT flag=1; SaErrorT retc; /* tests oh_el_get for failure when entry == NULL */ el = oh_el_create(20); retc = oh_el_setgentimestampflag(el, flag); if (retc != SA_OK) { err("ERROR: oh_el_get failed."); return 1; } /* close el */ retc = oh_el_close(el); if (retc != SA_OK) { err("ERROR: oh_el_close on el failed."); return 1; } return 0; } openhpi-2.14.1/utils/t/el/el_test_001.c0000755000076400007640000000367211302567077014402 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * Copyright (c) 2004 by Intel Corp. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Christina Hernandez */ #include #include #include #include #include #include #include #include #include /** * main: EL test * * This test tests the creation of an EL. * * Return value: 0 on success, 1 on failure **/ int main(int argc, char **argv) { oh_el *el; el = oh_el_create(5); if(el == NULL) { err("ERROR: el pointer == NULL."); return 1; } if(el->info.Enabled != TRUE) { err("ERROR: el->info.Enabled invalid."); return 1; } if(el->info.OverflowFlag != FALSE) { err("ERROR: el->info.OverflowFlag invalid."); return 1; } if(el->info.UpdateTimestamp != SAHPI_TIME_UNSPECIFIED) { err("ERROR: el->info.UpdateTimestamp invalid."); return 1; } if(el->basetime != 0) { err("ERROR: el->basetime invalid."); return 1; } if(el->nextid != SAHPI_OLDEST_ENTRY + 1) { err("ERROR: el->nextid invalid."); return 1; } if(el->info.Size != 5) { err("ERROR: el->info.Size invalid."); return 1; } if(el->list != NULL) { err("ERROR: el->list invalid."); return 1; } return 0; } openhpi-2.14.1/utils/t/el/el_test_020.c0000755000076400007640000000354411302567077014401 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * Copyright (c) 2004 by Intel Corp. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Christina Hernandez */ #include #include #include #include #include #include #include #include #include "el_test.h" /** * main: EL test * * This test verifies failure of oh_el_prepend with log * info.OverflowFlag * * Return value: 0 on success, 1 on failure **/ int main(int argc, char **argv) { oh_el *el; SaErrorT retc; SaHpiEventT event; static char *data[2] = { "Test data one", "Test data two" }; /*test oh_el_prepend with event log info.OverflowFlag */ el = oh_el_create(1); event.Source = 1; event.EventType = SAHPI_ET_USER; event.Timestamp = SAHPI_TIME_UNSPECIFIED; event.Severity = SAHPI_DEBUG; strcpy((char *) &event.EventDataUnion.UserEvent.UserEventData.Data, data[0]); retc = oh_el_prepend(el, &event, NULL, NULL); if (retc != SA_OK) { err("ERROR: oh_el_prepend failed."); return 1; } strcpy((char *) &event.EventDataUnion.UserEvent.UserEventData.Data, data[1]); retc = oh_el_prepend(el, &event, NULL, NULL); if (retc == SA_OK) { err("ERROR: oh_el_prepend failed."); return 1; } /* close el */ retc = oh_el_close(el); if (retc != SA_OK) { err("ERROR: oh_el_close on el failed."); return 1; } return 0; } openhpi-2.14.1/utils/t/el/el_test_003.c0000644000076400007640000000476611302567077014406 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * Copyright (c) 2004 by Intel Corp. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Christina Hernandez */ #include #include #include #include #include #include #include #include "el_test.h" /** * main: EL test * * This test tests creates an EL and adds five events. * It then verifies there are five events in the EL and * that they are the same as the original events. * * Return value: 0 on success, 1 on failure **/ int main(int argc, char **argv) { oh_el *el; int x; SaErrorT retc; SaHpiEventT event; SaHpiEventLogEntryIdT curr = SAHPI_FIRST_ENTRY, prev = 0, next = 0; oh_el_entry *entry; static char *data[5] = { "Test data one", "Test data two", "Test data three", "Test data four", "Test data five" }; /* create the EL */ el = oh_el_create(30); /* add 5 events to el */ for(x=0;x<5;x++){ event.Source = 1; event.EventType = SAHPI_ET_USER; event.Timestamp = SAHPI_TIME_UNSPECIFIED; event.Severity = SAHPI_DEBUG; strcpy((char *) &event.EventDataUnion.UserEvent.UserEventData.Data, data[x]); retc = oh_el_append(el, &event, NULL, NULL); if (retc != SA_OK) { err("ERROR: oh_el_append failed."); return 1; } } if(g_list_length(el->list) != 5){ err("ERROR: g_list_length does not hold the correct number of entries."); return 1; } for(x=0; curr != SAHPI_NO_MORE_ENTRIES; x++){ retc = oh_el_get(el, curr, &prev, &next, &entry); if (retc != SA_OK){ err("ERROR: oh_el_get failed."); return 1; } if (strcmp((char *)entry->event.Event.EventDataUnion.UserEvent.UserEventData.Data, data[x])){ err("ERROR: Data from el and original data do not match"); return 1; } curr = next; } /* close the el */ retc = oh_el_close(el); if (retc != SA_OK) { err("ERROR: oh_el_close failed."); return 1; } return 0; } openhpi-2.14.1/utils/t/el/el_test_032.c0000755000076400007640000000246411302567077014404 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * Copyright (c) 2004 by Intel Corp. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Christina Hernandez */ #include #include #include #include #include #include #include #include #include "el_test.h" /** * main: EL test * * This test creates an EL and resets info.OverflowFlag (oh_el_overflowreset) * Return value: 0 on success, 1 on failure **/ int main(int argc, char **argv) { oh_el *el; SaErrorT retc; /* map el from file*/ el = oh_el_create(20); retc = oh_el_map_from_file(el, "./elTest.data"); if (retc != SA_OK) { err("ERROR: oh_el_map_from_file failed."); return 1; } retc = oh_el_overflowreset(el); if (retc != SA_OK) { err("ERROR: el info.OverflowFlagreset failed."); return 1; } return 0; } openhpi-2.14.1/utils/t/el/el_test_030.c0000755000076400007640000000224511302567077014377 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * Copyright (c) 2004 by Intel Corp. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Christina Hernandez */ #include #include #include #include #include #include #include #include #include "el_test.h" /** * main: EL test * * This test verifies the failure of oh_el_info * when el == NULL * * Return value: 0 on success, 1 on failure **/ int main(int argc, char **argv) { oh_el *el; SaErrorT retc; SaHpiEventLogInfoT info; /* test oh_el_info with el == NULL */ el = NULL; retc = oh_el_info(el, &info); if (retc == SA_OK) { err("ERROR: oh_el_info failed."); return 1; } return 0; } openhpi-2.14.1/utils/t/el/el_test_005.c0000755000076400007640000000554211302567077014404 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * Copyright (c) 2004 by Intel Corp. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Christina Hernandez */ #include #include #include #include #include #include #include #include #include "el_test.h" /** * main: EL test * * This test creates a new EL, adds 10 entries and saves * the EL to a file. It then retrieves the EL and compares * entries between the initial and retrieved ELs. * * Return value: 0 on success, 1 on failure **/ int main(int argc, char **argv) { oh_el *el, *el2; int x; SaErrorT retc, retc1, retc2; SaHpiEventT event; static char *data[10] = { "Test data one", "Test data two", "Test data three", "Test data four", "Test data five", "Test data six", "Test data seven", "Test data eight", "Test data nine", "Test data ten" }; /* create a new EL of size 20*/ el = oh_el_create(20); el2 = oh_el_create(20); /* add 10 events to el */ for(x=0; x<10; x++){ event.Source = 1; event.EventType = SAHPI_ET_USER; event.Timestamp = SAHPI_TIME_UNSPECIFIED; event.Severity = SAHPI_DEBUG; strcpy((char *) &event.EventDataUnion.UserEvent.UserEventData.Data, data[x]); retc = oh_el_append(el, &event, NULL, NULL); if (retc != SA_OK) { err("ERROR: oh_el_append failed."); return 1; } } /* save the EL to file */ retc = oh_el_map_to_file(el, "./elTest.data"); if (retc != SA_OK) { err("ERROR: oh_el_map_to_file failed."); return 1; } /* get EL from file (el2) */ retc2 = oh_el_map_from_file(el2, "./elTest.data"); if (retc2 != SA_OK) { err("ERROR: oh_el_map_from_file failed."); return 1; } /* compare entry contents of el and el2 */ retc = el_compare(el,el2); if (retc != SA_OK){ err("ERROR: el and el2 do not have matching entries."); return 1; } /* close el */ retc1 = oh_el_close(el); if (retc1 != SA_OK) { err("ERROR: oh_el_close on el failed."); return 1; } /* close el2 */ retc2 = oh_el_close(el2); if (retc2 != SA_OK) { err("ERROR: oh_el_close on el2 failed."); return 1; } return 0; } openhpi-2.14.1/utils/t/el/el_test_037.c0000755000076400007640000000266711302567077014416 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * Copyright (c) 2004 by Intel Corp. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Christina Hernandez */ #include #include #include #include #include #include #include #include #include "el_test.h" /** * main: EL test * * This test verifies the failure of oh_el_map_from_file el->info.Enabled == SAHPI_FALSE * * Return value: 0 on success, 1 on failure **/ int main(int argc, char **argv) { oh_el *el; SaErrorT retc; /* test failure of oh_el_map_from_file with el->info.Enabled == SAHPI_FALSE */ el = oh_el_create(20); el->info.Enabled = SAHPI_FALSE; retc = oh_el_map_from_file(el, "./elTest.data"); if (retc == SA_OK) { err("ERROR: oh_el_map_from_file failed."); return 1; } /* close el */ retc = oh_el_close(el); if (retc != SA_OK) { err("ERROR: oh_el_close on el failed."); return 1; } return 0; } openhpi-2.14.1/utils/t/el/el_test_008.c0000755000076400007640000000423111302567077014401 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * Copyright (c) 2004 by Intel Corp. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Christina Hernandez */ #include #include #include #include #include #include #include #include #include "el_test.h" /** * main: EL test * * This test adds 5 entries to an event log, It then clears the EL and * verifies the event log is actually clear. * * Return value: 0 on success, 1 on failure **/ int main(int argc, char **argv) { oh_el *el; SaErrorT retc; int x; SaHpiEventT event; static char *data[5] = { "Test data one", "Test data two", "Test data three", "Test data four", "Test data five" }; /* create a new EL of size 20*/ el = oh_el_create(20); /* add 5 events to el */ for(x=0; x<5; x++){ event.Source = 1; event.EventType = SAHPI_ET_USER; event.Timestamp = SAHPI_TIME_UNSPECIFIED; event.Severity = SAHPI_DEBUG; strcpy((char *) &event.EventDataUnion.UserEvent.UserEventData.Data, data[x]); retc = oh_el_append(el, &event, NULL, NULL); if (retc != SA_OK) { err("ERROR: oh_el_append failed."); return 1; } } /* clear the el */ retc = oh_el_clear(el); if (retc != SA_OK) { err("ERROR: el clear failed."); return 1; } /* verify el list nodes are cleared */ if(el->list != NULL){ err("ERROR: el clear failed."); return 1; } /* close el without saving to file*/ retc = oh_el_close(el); if (retc != SA_OK) { err("ERROR: oh_el_close on el failed."); return 1; } return 0; } openhpi-2.14.1/utils/t/el/el_test_044.c0000755000076400007640000000237111302567077014404 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * Copyright (c) 2004 by Intel Corp. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Christina Hernandez */ #include #include #include #include #include #include #include #include #include "el_test.h" /** * main: EL test * * This test verifies the failure of oh_el_setgentimestampflag * when el == NULL. * * Return value: 0 on success, 1 on failure **/ int main(int argc, char **argv) { oh_el *el; SaErrorT retc; SaHpiBoolT flag = 0; /* create a null EL and attempt to save it to file */ el = NULL; /* save the EL to file */ retc = oh_el_setgentimestampflag(el, flag); if (retc == SA_OK) { err("ERROR: oh_el_setgentimestampflag failed."); return 1; } return 0; } openhpi-2.14.1/utils/t/el/el_test_029.c0000755000076400007640000000324111302567077014404 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * Copyright (c) 2004 by Intel Corp. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Christina Hernandez */ #include #include #include #include #include #include #include #include #include "el_test.h" /** * main: EL test * * This test verifies failure of oh_el_get when entryid < myentry->event.EntryId * * Return value: 0 on success, 1 on failure **/ int main(int argc, char **argv) { oh_el *el; oh_el_entry *entry; SaHpiEventLogEntryIdT prev, next, myentry; SaErrorT retc; /* set entryid < myentry->event.EntryId */ el = oh_el_create(20); retc = oh_el_map_from_file(el, "./elTest.data"); if (retc != SA_OK) { err("ERROR: oh_el_map_from_file failed."); return 1; } entry = (oh_el_entry *)(g_list_first(el->list)->data); myentry = entry->event.EntryId--; retc = oh_el_get(el, myentry, &prev, &next, &entry); if (retc == SA_OK) { err("ERROR: oh_el_get failed."); return 1; } /* close el */ retc = oh_el_close(el); if (retc != SA_OK) { err("ERROR: oh_el_close on el failed."); return 1; } return 0; } openhpi-2.14.1/utils/t/el/el_test_017.c0000755000076400007640000000271711302567077014410 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * Copyright (c) 2004 by Intel Corp. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Christina Hernandez */ #include #include #include #include #include #include #include #include #include "el_test.h" /** * main: EL test * * This test verifies failure of oh_el_prepend when el == NULL * * Return value: 0 on success, 1 on failure **/ int main(int argc, char **argv) { oh_el *el; SaErrorT retc; SaHpiEventT event; static char *data[1] = { "Test data one" }; /* test oh_el_prepend with el==NULL*/ el = NULL; event.Source = 1; event.EventType = SAHPI_ET_USER; event.Timestamp = SAHPI_TIME_UNSPECIFIED; event.Severity = SAHPI_DEBUG; strcpy((char *) &event.EventDataUnion.UserEvent.UserEventData.Data, data[0]); retc = oh_el_prepend(el, &event, NULL, NULL); if (retc == SA_OK) { err("ERROR: oh_el_prepend failed."); return 1; } return 0; } openhpi-2.14.1/utils/t/el/el_test_004.c0000755000076400007640000000475111302567077014404 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * Copyright (c) 2004 by Intel Corp. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Christina Hernandez */ #include #include #include #include #include #include #include #include "el_test.h" /** * main: EL test * * This test creates an EL and adds five events. * It then verifies there are five entries in the EL and * that the events are the same as the initial events. * * Return value: 0 on success, 1 on failure **/ int main(int argc, char **argv) { oh_el *el, *el2; int x; SaErrorT retc; SaHpiEventT event; static char *data[5] = { "Test data one", "Test data two", "Test data three", "Test data four", "Test data five" }; /* create the EL */ el = oh_el_create(30); el2 = oh_el_create(30); /* add 5 events to el */ for(x=0;x<5;x++){ event.Source = 1; event.EventType = SAHPI_ET_USER; event.Timestamp = SAHPI_TIME_UNSPECIFIED; event.Severity = SAHPI_DEBUG; strcpy((char *) &event.EventDataUnion.UserEvent.UserEventData.Data, data[x]); retc = oh_el_append(el, &event, NULL, NULL); if (retc != SA_OK) { err("ERROR: oh_el_append failed."); return 1; } } /* save the EL to file */ retc = oh_el_map_to_file(el, "./elTest.data"); if (retc != SA_OK) { err("ERROR: oh_el_map_to_file failed."); return 1; } /* get EL from file (el2) */ retc = oh_el_map_from_file(el2, "./elTest.data"); if (retc != SA_OK) { err("ERROR: oh_el_map_from_file failed."); return 1; } if(g_list_length(el->list) != g_list_length(el2->list)) { err("ERROR: el->list != el2->list."); return 1; } /* close the el */ retc = oh_el_close(el); if (retc != SA_OK) { err("ERROR: oh_el_close failed."); return 1; } return 0; } openhpi-2.14.1/utils/t/el/el_test_043.c0000755000076400007640000000256111302567077014404 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * Copyright (c) 2004 by Intel Corp. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Christina Hernandez */ #include #include #include #include #include #include #include #include #include "el_test.h" /** * main: EL test * * This test verifies failure of oh_el_timeset when timestamp > * SAHPI_TIME_MAX_RELATIVE * Return value: 0 on success, 1 on failure **/ int main(int argc, char **argv) { oh_el *el; SaErrorT retc; /* tests oh_el_timeset when timestamp > SAHPI_TIME_MAX_RELATIVE */ el = oh_el_create(20); retc = oh_el_timeset(el, SAHPI_TIME_MAX_RELATIVE + 20); if (retc != SA_OK){ err("ERROR: oh_el_timeset failed"); return 1; } /* close el without saving to file*/ retc = oh_el_close(el); if (retc != SA_OK) { err("ERROR: oh_el_close on el failed."); return 1; } return 0; } openhpi-2.14.1/utils/t/el/el_test_018.c0000755000076400007640000000252211302567077014403 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * Copyright (c) 2004 by Intel Corp. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Christina Hernandez */ #include #include #include #include #include #include #include #include #include "el_test.h" /** * main: EL test * * This test verifies failure of oh_el_prepend when event == NULL * * Return value: 0 on success, 1 on failure **/ int main(int argc, char **argv) { oh_el *el; SaErrorT retc; /*test oh_el_prepend with event==NULL*/ el = oh_el_create(20); retc = oh_el_prepend(el, NULL, NULL, NULL); if (retc == SA_OK) { err("ERROR: oh_el_prepend failed."); return 1; } /* close el */ retc = oh_el_close(el); if (retc != SA_OK) { err("ERROR: oh_el_close on el failed."); return 1; } return 0; } openhpi-2.14.1/utils/t/el/el_test_023.c0000755000076400007640000000214411302567077014377 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * Copyright (c) 2004 by Intel Corp. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Christina Hernandez */ #include #include #include #include #include #include #include #include #include "el_test.h" /** * main: EL test * * This test verifies failure of oh_el_clear when * el == NULL * Return value: 0 on success, 1 on failure **/ int main(int argc, char **argv) { oh_el *el; SaErrorT retc; /* attempt to clear a null EL*/ el = NULL; retc = oh_el_clear(el); if (retc == SA_OK) { err("ERROR: el clear failed."); return 1; } return 0; } openhpi-2.14.1/utils/t/el/el_test_034.c0000755000076400007640000000232611302567077014403 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * Copyright (c) 2004 by Intel Corp. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Christina Hernandez */ #include #include #include #include #include #include #include #include #include "el_test.h" /** * main: EL test * * This test verifies the failure of oh_el_map_to_file * when el == NULL. * * Return value: 0 on success, 1 on failure **/ int main(int argc, char **argv) { oh_el *el; SaErrorT retc; /* create a null EL and attempt to save it to file */ el = NULL; /* save the EL to file */ retc = oh_el_map_to_file(el, "./elTest.data"); if (retc == SA_OK) { err("ERROR: oh_el_map_to_file failed."); return 1; } return 0; } openhpi-2.14.1/utils/t/el/el_test_024.c0000755000076400007640000000227311302567077014403 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * Copyright (c) 2004 by Intel Corp. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Christina Hernandez */ #include #include #include #include #include #include #include #include #include "el_test.h" /** * main: EL test * * This test verifies failure of oh_el_get when el == NULL * * Return value: 0 on success, 1 on failure **/ int main(int argc, char **argv) { oh_el *el; oh_el_entry *entry; SaHpiEventLogEntryIdT prev, next; SaErrorT retc; /* test case 1: el == NULL */ el = NULL; retc = oh_el_get(el, SAHPI_NEWEST_ENTRY, &prev, &next, &entry); if (retc == SA_OK) { err("ERROR: oh_el_get failed."); return 1; } return 0; } openhpi-2.14.1/utils/t/el/el_test_011.c0000755000076400007640000000272411302567077014400 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * Copyright (c) 2004 by Intel Corp. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Christina Hernandez */ #include #include #include #include #include #include #include #include #include "el_test.h" /** * main: EL test * * This test verifies failure of oh_el_append when el == NULL * * Return value: 0 on success, 1 on failure **/ int main(int argc, char **argv) { oh_el *el; SaErrorT retc; SaHpiEventT event; static char *data[1] = { "Test data one" }; /* test oh_el_append with el==NULL*/ el = NULL; event.Source = 1; event.EventType = SAHPI_ET_USER; event.Timestamp = SAHPI_TIME_UNSPECIFIED; event.Severity = SAHPI_DEBUG; strcpy((char *) &event.EventDataUnion.UserEvent.UserEventData.Data, data[0]); retc = oh_el_append(el, &event, NULL, NULL); if (retc == SA_OK) { err("ERROR: oh_el_append failed."); return 1; } return 0; } openhpi-2.14.1/utils/t/el/el_test_016.c0000755000076400007640000000332511302567077014403 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * Copyright (c) 2004 by Intel Corp. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Christina Hernandez */ #include #include #include #include #include #include #include #include #include "el_test.h" /** * main: EL test * * This test verifies failure of oh_el_append when el-> gentimestamp == FALSE * * Return value: 0 on success, 1 on failure **/ int main(int argc, char **argv) { oh_el *el; SaErrorT retc; SaHpiEventT event; static char *data[1] = { "Test data one" }; /*test oh_el_append with el->gentimestamp == FALSE*/ el = oh_el_create(20); event.Source = 1; event.EventType = SAHPI_ET_USER; event.Timestamp = SAHPI_TIME_UNSPECIFIED; event.Severity = SAHPI_DEBUG; el->gentimestamp = SAHPI_FALSE; strcpy((char *) &event.EventDataUnion.UserEvent.UserEventData.Data, data[0]); retc = oh_el_append(el, &event, NULL, NULL); if (retc != SA_OK) { err("ERROR: oh_el_append failed."); return 1; } /* close el */ retc = oh_el_close(el); if (retc != SA_OK) { err("ERROR: oh_el_close on el failed."); return 1; } return 0; } openhpi-2.14.1/utils/t/el/el_test_040.c0000755000076400007640000000217411302567077014401 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * Copyright (c) 2004 by Intel Corp. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Christina Hernandez */ #include #include #include #include #include #include #include #include #include "el_test.h" /** * main: EL test * * This test verifies the failure of oh_el_timeset when * el == NULL * * Return value: 0 on success, 1 on failure **/ int main(int argc, char **argv) { oh_el *el; SaHpiTimeT timestamp = 0; SaErrorT retc; /* tests oh_el_timeset when el == NULL */ el = NULL; retc = oh_el_timeset(el, timestamp + 20); if (retc == SA_OK){ err("ERROR: oh_el_timeset failed"); return 1; } return 0; } openhpi-2.14.1/utils/t/el/el_test_021.c0000755000076400007640000000372611302567077014404 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * Copyright (c) 2004 by Intel Corp. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Christina Hernandez */ #include #include #include #include #include #include #include #include #include "el_test.h" /** * main: EL test * * This test verifies failure of oh_el_prepend when res != NULL * * Return value: 0 on success, 1 on failure **/ int main(int argc, char **argv) { oh_el *el; SaErrorT retc; int x; SaHpiEventT event; SaHpiRptEntryT res1; static char *data[10] = { "Test data one", "Test data two", "Test data three", "Test data four", "Test data five", "Test data six", "Test data seven", "Test data eight", "Test data nine", "Test data ten" }; /*test oh_el_prepend with res != NULL */ el = oh_el_create (30); event.Source = 1; event.EventType = SAHPI_ET_USER; event.Timestamp = SAHPI_TIME_UNSPECIFIED; event.Severity = SAHPI_DEBUG; res1.EntryId = 1; res1.ResourceId = 1; res1.ResourceSeverity = SAHPI_CRITICAL; res1.ResourceCapabilities = 1; for(x=0;x<10;x++){ strcpy((char *) &event.EventDataUnion.UserEvent.UserEventData.Data, data[x]); retc = oh_el_prepend(el, &event, NULL, &res1); if (retc != SA_OK) { err("ERROR: oh_el_prepend failed."); return 1; } } /* close el */ retc = oh_el_close(el); if (retc != SA_OK) { err("ERROR: oh_el_close on el failed."); return 1; } return 0; } openhpi-2.14.1/utils/t/el/el_test_002.c0000755000076400007640000000506211302567077014376 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * Copyright (c) 2004 by Intel Corp. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Christina Hernandez */ #include #include #include #include #include #include #include #include "el_test.h" /** * main: EL test * * This test tests creates an EL and adds one event. * It then verifies there is one event and compares the * one event in the EL with the original event. * * Return value: 0 on success, 1 on failure **/ int main(int argc, char **argv) { oh_el *el; SaErrorT retc; SaHpiEventT event; oh_el_entry *entry; SaHpiEventLogEntryIdT prev, next; static char *data[1] = { "Test data one" }; /* create the EL */ el = oh_el_create(5); if(el == NULL) { err("ERROR: el == NULL."); return 1; } /* add a single event */ event.Source = 1; event.EventType = SAHPI_ET_USER; event.Timestamp = SAHPI_TIME_UNSPECIFIED; event.Severity = SAHPI_DEBUG; strcpy((char *) &event.EventDataUnion.UserEvent.UserEventData.Data, data[0]); retc = oh_el_append(el, &event, NULL, NULL); if (retc != SA_OK) { err("ERROR: oh_el_append failed."); return 1; } entry = (oh_el_entry *)(g_list_first(el->list)->data); if(g_list_length(el->list) != 1){ err("ERROR: g_list_length does not return the correct number of entries."); return 1; } /* fetch the event for el*/ retc = oh_el_get(el, entry->event.EntryId, &prev, &next, &entry); if (retc != SA_OK) { err("ERROR: oh_el_get failed."); return 1; } if (strcmp((char *)entry->event.Event.EventDataUnion.UserEvent.UserEventData.Data, data[0])) { err("ERROR: Data from el and what was entered into el do not match"); return 1; } /* close the EL */ retc = oh_el_close(el); if (retc != SA_OK) { err("ERROR: oh_el_close failed."); return 1; } return 0; } openhpi-2.14.1/utils/t/el/el_test_041.c0000755000076400007640000000257211302567077014404 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * Copyright (c) 2004 by Intel Corp. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Christina Hernandez */ #include #include #include #include #include #include #include #include #include "el_test.h" /** * main: EL test * * This test verifies the failure of oh_el_timeset when * timestamp == SAHPI_TIME_UNSPECIFIED * * Return value: 0 on success, 1 on failure **/ int main(int argc, char **argv) { oh_el *el; SaErrorT retc; /* tests oh_el_timeset when timestamp = SAHPI_TIME_UNSPECIFIED */ el = oh_el_create(20); retc = oh_el_timeset(el, SAHPI_TIME_UNSPECIFIED); if (retc == SA_OK){ err("ERROR: oh_el_timeset on el failed"); return 1; } /* close el without saving to file*/ retc = oh_el_close(el); if (retc != SA_OK) { err("ERROR: oh_el_close on el failed."); return 1; } return 0; } openhpi-2.14.1/utils/t/el/el_test_006.c0000755000076400007640000001034511302567077014402 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * Copyright (c) 2004 by Intel Corp. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Christina Hernandez */ #include #include #include #include #include #include #include #include #include "el_test.h" /** * main: EL test * * This test creates a new EL, adds 5 entries and saves the EL * to a file. It then retrieves the EL and adds 5 entries to both * the initial and retrieved ELs. It then checks the number of entries * and compares the two ELs. * * Return value: 0 on success, 1 on failure **/ int main(int argc, char **argv) { oh_el *el, *el2; int x; SaErrorT retc, retc1, retc2; SaHpiEventT event; static char *data[10] = { "Test data one", "Test data two", "Test data three", "Test data four", "Test data five", "Test data six", "Test data seven", "Test data eight", "Test data nine", "Test data ten" }; /* create a new EL of size 20*/ el = oh_el_create(20); el2 = oh_el_create(20); /* add 5 events to el */ for(x=0;x<5;x++){ event.Source = 1; event.EventType = SAHPI_ET_USER; event.Timestamp = SAHPI_TIME_UNSPECIFIED; event.Severity = SAHPI_DEBUG; strcpy((char *)event.EventDataUnion.UserEvent.UserEventData.Data, data[x]); retc = oh_el_append(el, &event, NULL, NULL); if (retc != SA_OK) { err("ERROR: oh_el_append failed."); return 1; } } /* save the EL to file */ retc1 = oh_el_map_to_file(el, "./elTest.data"); if (retc1 != SA_OK) { err("ERROR: oh_el_map_to_file failed."); return 1; } /* get EL from file (el2) */ retc2 = oh_el_map_from_file(el2, "./elTest.data"); if (retc2 != SA_OK) { err("ERROR: oh_el_map_from_file failed."); return 1; } /* add 5 more events to el */ for(x=5;x<10;x++){ event.Source = 1; event.EventType = SAHPI_ET_USER; event.Timestamp = SAHPI_TIME_UNSPECIFIED; event.Severity = SAHPI_DEBUG; strcpy((char *)event.EventDataUnion.UserEvent.UserEventData.Data, data[x]); retc = oh_el_append(el, &event, NULL, NULL); if (retc != SA_OK) { err("ERROR: oh_el_append failed."); return 1; } } /* add 5 more events to el2 */ for(x=5;x<10;x++){ event.Source = 1; event.EventType = SAHPI_ET_USER; event.Timestamp = SAHPI_TIME_UNSPECIFIED; event.Severity = SAHPI_DEBUG; strcpy((char *)event.EventDataUnion.UserEvent.UserEventData.Data, data[x]); retc = oh_el_append(el2, &event, NULL, NULL); if (retc != SA_OK) { err("ERROR: oh_el_append failed."); return 1; } } /* verify number of entries in el and el2 is 10 */ if(g_list_length(el->list) != 10) { err("ERROR: el->list does not have the correct number of entries"); return 1; } if(g_list_length(el2->list) != 10) { err("ERROR: el2->list does not have the correct number of entries"); return 1; } /* compare entry contents of el and el2 */ retc = el_compare(el,el2); if (retc != SA_OK){ err("ERROR: el and el2 do not have matching entries."); return 1; } /* close el */ retc1 = oh_el_close(el); if (retc1 != SA_OK) { err("ERROR: oh_el_close on el failed."); return 1; } /* close el2 */ retc2 = oh_el_close(el2); if (retc2 != SA_OK) { err("ERROR: oh_el_close on el2 failed."); return 1; } return 0; } openhpi-2.14.1/utils/t/el/el_test_036.c0000755000076400007640000000226411302567077014406 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * Copyright (c) 2004 by Intel Corp. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Christina Hernandez */ #include #include #include #include #include #include #include #include #include "el_test.h" /** * main: EL test * * This test verifies the failure of oh_el_map_from_file when * el == NULL * * Return value: 0 on success, 1 on failure **/ int main(int argc, char **argv) { oh_el *el; SaErrorT retc; /* test failure of oh_el_map_from_file with el==NULL */ el = NULL; retc = oh_el_map_from_file(el, "./elTest.data"); if (retc == SA_OK) { err("ERROR: oh_el_map_from_file failed."); return 1; } return 0; } openhpi-2.14.1/utils/t/el/el_test_042.c0000755000076400007640000000251611302567077014403 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * Copyright (c) 2004 by Intel Corp. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Christina Hernandez */ #include #include #include #include #include #include #include #include #include "el_test.h" /** * main: EL test * * This test creates an EL and verifies correctness of oh_el_timeset * Return value: 0 on success, 1 on failure **/ int main(int argc, char **argv) { oh_el *el; SaHpiTimeT timestamp = 0; SaErrorT retc; /* tests oh_el_timeset when el != NULL */ el = oh_el_create(20); retc = oh_el_timeset(el, timestamp + 20); if (retc != SA_OK){ err("ERROR: oh_el_timeset failed"); return 1; } /* close el without saving to file*/ retc = oh_el_close(el); if (retc != SA_OK) { err("ERROR: oh_el_close on el failed."); return 1; } return 0; } openhpi-2.14.1/utils/t/el/el_test_026.c0000755000076400007640000000311011302567077014374 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * Copyright (c) 2004 by Intel Corp. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Christina Hernandez */ #include #include #include #include #include #include #include #include #include "el_test.h" /** * main: EL test * * This test verifies failure of oh_el_get when prev == NULL * * Return value: 0 on success, 1 on failure **/ int main(int argc, char **argv) { oh_el *el; oh_el_entry *entry; SaHpiEventLogEntryIdT next; SaErrorT retc; /* set prev == NULL */ el = oh_el_create(20); retc = oh_el_map_from_file(el, "./elTest.data"); if (retc != SA_OK) { err("ERROR: oh_el_map_from_file failed."); return 1; } entry = (oh_el_entry *)(g_list_first(el->list)->data); retc = oh_el_get(el, entry->event.EntryId, NULL, &next, &entry); if (retc == SA_OK) { err("ERROR: oh_el_get failed."); return 1; } /* close el */ retc = oh_el_close(el); if (retc != SA_OK) { err("ERROR: oh_el_close on el failed."); return 1; } return 0; } openhpi-2.14.1/utils/t/el/el_test_038.c0000755000076400007640000000256311302567077014412 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * Copyright (c) 2004 by Intel Corp. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Christina Hernandez */ #include #include #include #include #include #include #include #include #include "el_test.h" /** * main: EL test * * This test verifies the failure of oh_el_map_from_file when filename == NULL * * Return value: 0 on success, 1 on failure **/ int main(int argc, char **argv) { oh_el *el; SaErrorT retc; /* test failure of oh_el_map_from_file with filename == NULL */ el = oh_el_create(20); retc = oh_el_map_from_file(el, NULL); if (retc == SA_OK) { err("ERROR: oh_el_map_from_file failed."); return 1; } /* close el */ retc = oh_el_close(el); if (retc != SA_OK) { err("ERROR: oh_el_close on el failed."); return 1; } return 0; } openhpi-2.14.1/utils/t/el/el_test_014.c0000755000076400007640000000345711302567077014407 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * Copyright (c) 2004 by Intel Corp. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Christina Hernandez */ #include #include #include #include #include #include #include #include #include "el_test.h" /** * main: EL test * * This test verifies failure of oh_el_append when el->info.Enabled == SAHPI_FALSE && * event->EventType != SAHPI_ET_USER * * Return value: 0 on success, 1 on failure **/ int main(int argc, char **argv) { oh_el *el; SaErrorT retc; SaHpiEventT event; static char *data[10] = { "Test data one" }; /*test oh_el_append with el->info.Enabled == SAHPI_FALSE && event->EventType != SAHPI_ET_USER */ el = oh_el_create(20); el->info.Enabled = FALSE; event.Source = 1; event.EventType = SAHPI_ET_DOMAIN; event.Timestamp = SAHPI_TIME_UNSPECIFIED; event.Severity = SAHPI_DEBUG; strcpy((char *) &event.EventDataUnion.UserEvent.UserEventData.Data, data[0]); retc = oh_el_append(el, &event, NULL, NULL); if (retc == SA_OK) { err("ERROR: oh_el_append failed."); return 1; } /* close el */ retc = oh_el_close(el); if (retc != SA_OK) { err("ERROR: oh_el_close on el failed."); return 1; } return 0; } openhpi-2.14.1/utils/t/el/el_test_033.c0000755000076400007640000000221011302567077014372 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * Copyright (c) 2004 by Intel Corp. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Christina Hernandez */ #include #include #include #include #include #include #include #include #include "el_test.h" /** * main: EL test * * This test verifies failure of oh_el_info.OverflowFlagreset when * el == NULL * Return value: 0 on success, 1 on failure **/ int main(int argc, char **argv) { oh_el *el; SaErrorT retc; /* attempt to clear a null EL*/ el = NULL; retc = oh_el_overflowreset(el); if (retc == SA_OK) { err("ERROR: oh_el_overflowreset failed."); return 1; } return 0; } openhpi-2.14.1/utils/t/el/el_test_022.c0000755000076400007640000000362211302567077014400 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * Copyright (c) 2004 by Intel Corp. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Christina Hernandez */ #include #include #include #include #include #include #include #include #include "el_test.h" /** * main: EL test * * This test verifies failure of oh_el_prepend when res != NULL * * Return value: 0 on success, 1 on failure **/ int main(int argc, char **argv) { oh_el *el; SaErrorT retc; int x; SaHpiEventT event; SaHpiRdrT rdr; static char *data[10] = { "Test data one", "Test data two", "Test data three", "Test data four", "Test data five", "Test data six", "Test data seven", "Test data eight", "Test data nine", "Test data ten" }; /*test oh_el_prepend with rdr != NULL */ el = oh_el_create(30); event.Source = 1; event.EventType = SAHPI_ET_USER; event.Timestamp = SAHPI_TIME_UNSPECIFIED; event.Severity = SAHPI_DEBUG; rdr.RecordId = 1; rdr.RdrType = SAHPI_INVENTORY_RDR; for(x=0;x<10;x++){ strcpy((char *) &event.EventDataUnion.UserEvent.UserEventData.Data, data[x]); retc = oh_el_prepend(el, &event, &rdr, NULL); if (retc != SA_OK) { err("ERROR: oh_el_prepend failed."); return 1; } } /* close el */ retc = oh_el_close(el); if (retc != SA_OK) { err("ERROR: oh_el_close on el failed."); return 1; } return 0; } openhpi-2.14.1/utils/t/el/el_test_013.c0000755000076400007640000000350611302567077014401 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * Copyright (c) 2004 by Intel Corp. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Christina Hernandez */ #include #include #include #include #include #include #include #include #include "el_test.h" /** * main: EL test * * This test verifies failure of oh_el_append when entries added * over length of EL (overload). * * Return value: 0 on success, 1 on failure **/ int main(int argc, char **argv) { oh_el *el; SaErrorT retc; int x; SaHpiEventT event; static char *data[10] = { "Test data one", "Test data two", "Test data three", "Test data four", "Test data five", "Test data six", "Test data seven", "Test data eight", "Test data nine", "Test data ten" }; el = oh_el_create(1); event.Source = 1; event.EventType = SAHPI_ET_USER; event.Timestamp = SAHPI_TIME_UNSPECIFIED; event.Severity = SAHPI_DEBUG; for(x=0;x<10;x++){ strcpy((char *) &event.EventDataUnion.UserEvent.UserEventData.Data, data[x]); retc = oh_el_append(el, &event, NULL, NULL); if (retc != SA_OK) { err("ERROR: oh_el_append failed."); return 1; } } /* close el */ retc = oh_el_close(el); if (retc != SA_OK) { err("ERROR: oh_el_close on el failed."); return 1; } return 0; } openhpi-2.14.1/utils/t/ann/0000755000076400007640000000000011405006365012350 5ustar openhpi-2.14.1/utils/t/ann/Makefile.am0000644000076400007640000000311411302567130014401 0ustar # (C) Copyright IBM Corp 2005 # All rights reserved. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This # file and program are licensed under a BSD style license. See # the Copying file included with the OpenHPI distribution for # full licensing terms. MAINTAINERCLEANFILES = Makefile.in REMOTE_SOURCES = announcement_utils.c MOSTLYCLEANFILES = $(shell ls *data) $(REMOTE_SOURCES) @TEST_CLEAN@ INCLUDES = @OPENHPI_INCLUDES@ $(REMOTE_SOURCES): if test ! -f $@ -a ! -L $@; then \ $(LN_S) $(top_srcdir)/utils/$@; \ fi TESTS = ann_test_001 \ ann_test_002 \ ann_test_003 \ ann_test_004 \ ann_test_005 \ ann_test_006 \ ann_test_007 \ ann_test_008 check_PROGRAMS = $(TESTS) ann_test_001_SOURCES = ann_test_001.c nodist_ann_test_001_SOURCES = $(REMOTE_SOURCES) ann_test_002_SOURCES = ann_test_002.c nodist_ann_test_002_SOURCES = $(REMOTE_SOURCES) ann_test_003_SOURCES = ann_test_003.c nodist_ann_test_003_SOURCES = $(REMOTE_SOURCES) ann_test_004_SOURCES = ann_test_004.c nodist_ann_test_004_SOURCES = $(REMOTE_SOURCES) ann_test_005_SOURCES = ann_test_005.c nodist_ann_test_005_SOURCES = $(REMOTE_SOURCES) ann_test_006_SOURCES = ann_test_006.c nodist_ann_test_006_SOURCES = $(REMOTE_SOURCES) ann_test_007_SOURCES = ann_test_007.c nodist_ann_test_007_SOURCES = $(REMOTE_SOURCES) ann_test_008_SOURCES = ann_test_008.c nodist_ann_test_008_SOURCES = $(REMOTE_SOURCES) openhpi-2.14.1/utils/t/ann/ann_test_007.c0000644000076400007640000000502211302567130014712 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * W. David Ashley */ #include #include #include #include #include #include #include #include #include /** * main: Announcement test * * This test adds one announcement to the list * * Return value: 0 on success, 1 on failure **/ int main(int argc, char **argv) { oh_announcement *ann; SaHpiAnnouncementT announ; SaErrorT rc; announ.EntryId = 0; // modified by oh_announcement_append announ.Timestamp = 0; // modified by oh_announcement_append announ.AddedByUser = FALSE; // modified by oh_announcement_append announ.Severity = SAHPI_CRITICAL; announ.Acknowledged = FALSE; announ.StatusCond.Type= SAHPI_STATUS_COND_TYPE_SENSOR; announ.StatusCond.Entity.Entry[0].EntityType = SAHPI_ENT_SYSTEM_BOARD; announ.StatusCond.Entity.Entry[0].EntityLocation = 1; announ.StatusCond.Entity.Entry[1].EntityType = SAHPI_ENT_ROOT; announ.StatusCond.Entity.Entry[1].EntityLocation = 0; announ.StatusCond.DomainId = 1; announ.StatusCond.ResourceId = 1; announ.StatusCond.SensorNum = 1; announ.StatusCond.EventState = SAHPI_ES_UNSPECIFIED; announ.StatusCond.Name.Length = 5; memcpy(&announ.StatusCond.Name.Value,"announ", 5); announ.StatusCond.Mid = 123; /* we will not worry about the Data field for this test */ ann = oh_announcement_create(); rc = oh_announcement_append(ann, &announ); announ.Severity = SAHPI_MAJOR; rc = oh_announcement_append(ann, &announ); announ.Severity = SAHPI_MINOR; rc = oh_announcement_append(ann, &announ); rc = oh_announcement_del(ann, 2, SAHPI_MAJOR); if(rc != SA_OK) { err("ERROR: on_announcement_del returned %d.", rc); return 1; } if(g_list_length(ann->annentries) != 2) { err("ERROR: invalid number of announcements in list."); return 1; } return 0; } openhpi-2.14.1/utils/t/ann/ann_test_006.c0000644000076400007640000000526311302567130014720 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * W. David Ashley */ #include #include #include #include #include #include #include #include #include /** * main: Announcement test * * This test adds one announcement to the list * * Return value: 0 on success, 1 on failure **/ int main(int argc, char **argv) { oh_announcement *ann; SaHpiAnnouncementT announ; SaErrorT rc; announ.EntryId = 0; // modified by oh_announcement_append announ.Timestamp = 0; // modified by oh_announcement_append announ.AddedByUser = FALSE; // modified by oh_announcement_append announ.Severity = SAHPI_CRITICAL; announ.Acknowledged = FALSE; announ.StatusCond.Type= SAHPI_STATUS_COND_TYPE_SENSOR; announ.StatusCond.Entity.Entry[0].EntityType = SAHPI_ENT_SYSTEM_BOARD; announ.StatusCond.Entity.Entry[0].EntityLocation = 1; announ.StatusCond.Entity.Entry[1].EntityType = SAHPI_ENT_ROOT; announ.StatusCond.Entity.Entry[1].EntityLocation = 0; announ.StatusCond.DomainId = 1; announ.StatusCond.ResourceId = 1; announ.StatusCond.SensorNum = 1; announ.StatusCond.EventState = SAHPI_ES_UNSPECIFIED; announ.StatusCond.Name.Length = 5; memcpy(&announ.StatusCond.Name.Value,"announ", 5); announ.StatusCond.Mid = 123; /* we will not worry about the Data field for this test */ ann = oh_announcement_create(); rc = oh_announcement_append(ann, &announ); announ.Severity = SAHPI_MAJOR; rc = oh_announcement_append(ann, &announ); announ.Severity = SAHPI_MINOR; rc = oh_announcement_append(ann, &announ); rc = oh_announcement_ack(ann, 2, SAHPI_MAJOR); if(rc != SA_OK) { err("ERROR: on_announcement_ack returned %d.", rc); return 1; } rc = oh_announcement_get(ann, 2, &announ); if(rc != SA_OK) { err("ERROR: on_announcement_get returned %d.", rc); return 1; } if(announ.Acknowledged != TRUE) { err("ERROR: announ.Acknowledged invalid"); return 1; } return 0; } openhpi-2.14.1/utils/t/ann/ann_test_001.c0000644000076400007640000000244111302567130014706 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * W. David Ashley */ #include #include #include #include #include #include #include #include #include /** * main: Announcement test * * This test tests the creation of an announcement list. * * Return value: 0 on success, 1 on failure **/ int main(int argc, char **argv) { oh_announcement *ann; ann = oh_announcement_create(); if(ann == NULL) { err("ERROR: ann pointer == NULL."); return 1; } if(ann->nextId != SAHPI_OLDEST_ENTRY + 1) { err("ERROR: ann->nextId invalid."); return 1; } if(ann->annentries != NULL) { err("ERROR: ann->annentries invalid."); return 1; } return 0; } openhpi-2.14.1/utils/t/ann/ann_test_003.c0000644000076400007640000000471211302567130014713 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * W. David Ashley */ #include #include #include #include #include #include #include #include #include /** * main: Announcement test * * This test adds one announcement to the list * * Return value: 0 on success, 1 on failure **/ int main(int argc, char **argv) { oh_announcement *ann; SaHpiAnnouncementT announ; SaErrorT rc; announ.EntryId = 0; // modified by oh_announcement_append announ.Timestamp = 0; // modified by oh_announcement_append announ.AddedByUser = FALSE; // modified by oh_announcement_append announ.Severity = SAHPI_CRITICAL; announ.Acknowledged = FALSE; announ.StatusCond.Type= SAHPI_STATUS_COND_TYPE_SENSOR; announ.StatusCond.Entity.Entry[0].EntityType = SAHPI_ENT_SYSTEM_BOARD; announ.StatusCond.Entity.Entry[0].EntityLocation = 1; announ.StatusCond.Entity.Entry[1].EntityType = SAHPI_ENT_ROOT; announ.StatusCond.Entity.Entry[1].EntityLocation = 0; announ.StatusCond.DomainId = 1; announ.StatusCond.ResourceId = 1; announ.StatusCond.SensorNum = 1; announ.StatusCond.EventState = SAHPI_ES_UNSPECIFIED; announ.StatusCond.Name.Length = 5; memcpy(&announ.StatusCond.Name.Value,"announ", 5); announ.StatusCond.Mid = 123; /* we will not worry about the Data field for this test */ ann = oh_announcement_create(); rc = oh_announcement_append(ann, &announ); announ.Severity = SAHPI_MAJOR; rc = oh_announcement_append(ann, &announ); announ.Severity = SAHPI_MINOR; rc = oh_announcement_append(ann, &announ); if(ann->nextId != SAHPI_OLDEST_ENTRY + 4) { err("ERROR: ann->nextId invalid."); return 1; } if(ann->annentries == NULL) { err("ERROR: ann->annentries invalid."); return 1; } return 0; } openhpi-2.14.1/utils/t/ann/ann_test_008.c0000644000076400007640000000455011302567130014720 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * W. David Ashley */ #include #include #include #include #include #include #include #include #include /** * main: Announcement test * * This test adds one announcement to the list * * Return value: 0 on success, 1 on failure **/ int main(int argc, char **argv) { oh_announcement *ann; SaHpiAnnouncementT announ; SaErrorT rc; announ.EntryId = 0; // modified by oh_announcement_append announ.Timestamp = 0; // modified by oh_announcement_append announ.AddedByUser = FALSE; // modified by oh_announcement_append announ.Severity = SAHPI_CRITICAL; announ.Acknowledged = FALSE; announ.StatusCond.Type= SAHPI_STATUS_COND_TYPE_SENSOR; announ.StatusCond.Entity.Entry[0].EntityType = SAHPI_ENT_SYSTEM_BOARD; announ.StatusCond.Entity.Entry[0].EntityLocation = 1; announ.StatusCond.Entity.Entry[1].EntityType = SAHPI_ENT_ROOT; announ.StatusCond.Entity.Entry[1].EntityLocation = 0; announ.StatusCond.DomainId = 1; announ.StatusCond.ResourceId = 1; announ.StatusCond.SensorNum = 1; announ.StatusCond.EventState = SAHPI_ES_UNSPECIFIED; announ.StatusCond.Name.Length = 5; memcpy(&announ.StatusCond.Name.Value,"announ", 5); announ.StatusCond.Mid = 123; /* we will not worry about the Data field for this test */ ann = oh_announcement_create(); rc = oh_announcement_append(ann, &announ); announ.Severity = SAHPI_MAJOR; rc = oh_announcement_append(ann, &announ); announ.Severity = SAHPI_MINOR; rc = oh_announcement_append(ann, &announ); rc = oh_announcement_close(ann); if(rc != SA_OK) { err("ERROR: on_announcement_close returned %d.", rc); return 1; } return 0; } openhpi-2.14.1/utils/t/ann/ann_test_002.c0000644000076400007640000000442411302567130014712 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * W. David Ashley */ #include #include #include #include #include #include #include #include #include /** * main: Announcement test * * This test adds one announcement to the list * * Return value: 0 on success, 1 on failure **/ int main(int argc, char **argv) { oh_announcement *ann; SaHpiAnnouncementT announ; SaErrorT rc; announ.EntryId = 0; // modified by oh_announcement_append announ.Timestamp = 0; // modified by oh_announcement_append announ.AddedByUser = FALSE; // modified by oh_announcement_append announ.Severity = SAHPI_CRITICAL; announ.Acknowledged = FALSE; announ.StatusCond.Type= SAHPI_STATUS_COND_TYPE_SENSOR; announ.StatusCond.Entity.Entry[0].EntityType = SAHPI_ENT_SYSTEM_BOARD; announ.StatusCond.Entity.Entry[0].EntityLocation = 1; announ.StatusCond.Entity.Entry[1].EntityType = SAHPI_ENT_ROOT; announ.StatusCond.Entity.Entry[1].EntityLocation = 0; announ.StatusCond.DomainId = 1; announ.StatusCond.ResourceId = 1; announ.StatusCond.SensorNum = 1; announ.StatusCond.EventState = SAHPI_ES_UNSPECIFIED; announ.StatusCond.Name.Length = 5; memcpy(&announ.StatusCond.Name.Value,"announ", 5); announ.StatusCond.Mid = 123; /* we will not worry about the Data field for this test */ ann = oh_announcement_create(); rc = oh_announcement_append(ann, &announ); if(ann->nextId != SAHPI_OLDEST_ENTRY + 2) { err("ERROR: ann->nextId invalid."); return 1; } if(ann->annentries == NULL) { err("ERROR: ann->annentries invalid."); return 1; } return 0; } openhpi-2.14.1/utils/t/ann/ann_test_004.c0000644000076400007640000000476611302567130014725 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * W. David Ashley */ #include #include #include #include #include #include #include #include #include /** * main: Announcement test * * This test adds one announcement to the list * * Return value: 0 on success, 1 on failure **/ int main(int argc, char **argv) { oh_announcement *ann; SaHpiAnnouncementT announ; SaErrorT rc; announ.EntryId = 0; // modified by oh_announcement_append announ.Timestamp = 0; // modified by oh_announcement_append announ.AddedByUser = FALSE; // modified by oh_announcement_append announ.Severity = SAHPI_CRITICAL; announ.Acknowledged = FALSE; announ.StatusCond.Type= SAHPI_STATUS_COND_TYPE_SENSOR; announ.StatusCond.Entity.Entry[0].EntityType = SAHPI_ENT_SYSTEM_BOARD; announ.StatusCond.Entity.Entry[0].EntityLocation = 1; announ.StatusCond.Entity.Entry[1].EntityType = SAHPI_ENT_ROOT; announ.StatusCond.Entity.Entry[1].EntityLocation = 0; announ.StatusCond.DomainId = 1; announ.StatusCond.ResourceId = 1; announ.StatusCond.SensorNum = 1; announ.StatusCond.EventState = SAHPI_ES_UNSPECIFIED; announ.StatusCond.Name.Length = 5; memcpy(&announ.StatusCond.Name.Value,"announ", 5); announ.StatusCond.Mid = 123; /* we will not worry about the Data field for this test */ ann = oh_announcement_create(); rc = oh_announcement_append(ann, &announ); announ.Severity = SAHPI_MAJOR; rc = oh_announcement_append(ann, &announ); announ.Severity = SAHPI_MINOR; rc = oh_announcement_append(ann, &announ); rc = oh_announcement_get(ann, 2, &announ); if(announ.EntryId != 2) { err("ERROR: announ.EntryId invalid."); return 1; } if(announ.Severity != SAHPI_MAJOR) { err("ERROR: announ.Severity invalid."); return 1; } return 0; } openhpi-2.14.1/utils/t/ann/ann_test_005.c0000644000076400007640000000754511302567130014724 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2005-2006 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * W. David Ashley * Renier Morales */ #include #include #include #include #include #include #include #include #include /** * main: Announcement test * * This test adds one announcement to the list * * Return value: 0 on success, 1 on failure **/ int main(int argc, char **argv) { oh_announcement *ann; SaHpiAnnouncementT announ; SaErrorT rc; announ.EntryId = 0; // modified by oh_announcement_append announ.Timestamp = 0; // modified by oh_announcement_append announ.AddedByUser = FALSE; // modified by oh_announcement_append announ.Severity = SAHPI_CRITICAL; announ.Acknowledged = FALSE; announ.StatusCond.Type= SAHPI_STATUS_COND_TYPE_SENSOR; announ.StatusCond.Entity.Entry[0].EntityType = SAHPI_ENT_SYSTEM_BOARD; announ.StatusCond.Entity.Entry[0].EntityLocation = 1; announ.StatusCond.Entity.Entry[1].EntityType = SAHPI_ENT_ROOT; announ.StatusCond.Entity.Entry[1].EntityLocation = 0; announ.StatusCond.DomainId = 1; announ.StatusCond.ResourceId = 1; announ.StatusCond.SensorNum = 1; announ.StatusCond.EventState = SAHPI_ES_UNSPECIFIED; announ.StatusCond.Name.Length = 5; memcpy(&announ.StatusCond.Name.Value,"announ", 5); announ.StatusCond.Mid = 123; /* we will not worry about the Data field for this test */ ann = oh_announcement_create(); rc = oh_announcement_append(ann, &announ); if (rc != SA_OK) { err("ERROR: 1 oh_announcement_append failed."); return 1; } announ.Severity = SAHPI_MAJOR; rc = oh_announcement_append(ann, &announ); if (rc != SA_OK) { err("ERROR: 2 oh_announcement_append failed."); return 1; } announ.Severity = SAHPI_MINOR; rc = oh_announcement_append(ann, &announ); if (rc != SA_OK) { err("ERROR: 3 oh_announcement_append failed."); return 1; } announ.Severity = SAHPI_CRITICAL; rc = oh_announcement_append(ann, &announ); if (rc != SA_OK) { err("ERROR: 4 oh_announcement_append failed."); return 1; } announ.EntryId = SAHPI_FIRST_ENTRY; announ.Timestamp = 0; rc = oh_announcement_get_next(ann, SAHPI_ALL_SEVERITIES, FALSE, &announ); if(rc != SA_OK) { err("ERROR: on_announcement_get_next returned %d.", rc); return 1; } err("EntryId %d returned with Severity %d.", announ.EntryId, announ.Severity); rc = oh_announcement_get_next(ann, SAHPI_ALL_SEVERITIES, FALSE, &announ); if(rc != SA_OK) { err("ERROR: on_announcement_get_next returned %d.", rc); return 1; } err("EntryId %d returned with Severity %d.", announ.EntryId, announ.Severity); rc = oh_announcement_get(ann, 1, &announ); if (rc != SA_OK) { err("ERROR: oh_announcement_get did not find anything."); return 1; } rc = oh_announcement_get_next(ann, SAHPI_CRITICAL, FALSE, &announ); if(rc != SA_OK || announ.Severity != SAHPI_CRITICAL) { err("ERROR: on_announcement_get_next returned %d." " Severity returned is %d. EntryId %d.", rc, announ.Severity, announ.EntryId); return 1; } err("EntryId %d returned.", announ.EntryId); return 0; } openhpi-2.14.1/utils/t/sahpi/0000755000076400007640000000000011405006365012700 5ustar openhpi-2.14.1/utils/t/sahpi/Makefile.am0000644000076400007640000000573511302567130014744 0ustar # (C) Copyright IBM Corp 2004 # All rights reserved. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This # file and program are licensed under a BSD style license. See # the Copying file included with the OpenHPI distribution for # full licensing terms. MAINTAINERCLEANFILES = Makefile.in REMOTE_SOURCES = epath_utils.c \ sahpi_enum_utils.c \ sahpiatca_enum_utils.c \ sahpi_event_encode.c \ sahpi_event_utils.c \ sahpi_struct_utils.c \ sahpi_time_utils.c \ uid_utils.c MOSTLYCLEANFILES = $(REMOTE_SOURCES) @TEST_CLEAN@ INCLUDES = @OPENHPI_INCLUDES@ AM_CFLAGS = -std=c99 # the -std=c99 comment above is required to have unicode in the tests LIBS += -luuid $(REMOTE_SOURCES): if test ! -f $@ -a ! -L $@; then \ if test -f $(top_srcdir)/utils/$@; then \ $(LN_S) $(top_srcdir)/utils/$@; \ else \ $(LN_S) $(top_builddir)/utils/$@; \ fi; \ fi # FIXME:: Remove epath_enum_utils_test and sahpi_event_encode_test files # when we can auto-generate file for SMP systems. # Create rule using SaHpi2code.pl using -tdir option TESTS = sahpi_enum_utils_test \ sahpiatca_enum_utils_test \ sahpi_event_encode_test \ sahpi_event_utils_test \ sahpi_time_utils_test \ sahpi_struct_idrinfo_test \ sahpi_struct_idrarea_test \ sahpi_struct_idrfield_test \ sahpi_struct_rptentry_test \ sahpi_struct_rdr_test \ sahpi_struct_utils_test \ sahpi_text_utils_test check_PROGRAMS = $(TESTS) sahpi_enum_utils_test_SOURCES = sahpi_enum_utils_test.c nodist_sahpi_enum_utils_test_SOURCES = $(REMOTE_SOURCES) sahpiatca_enum_utils_test_SOURCES = sahpiatca_enum_utils_test.c nodist_sahpiatca_enum_utils_test_SOURCES = $(REMOTE_SOURCES) sahpi_event_encode_test_SOURCES = sahpi_event_encode_test.c nodist_sahpi_event_encode_test_SOURCES = $(REMOTE_SOURCES) sahpi_event_utils_test_SOURCES = sahpi_event_utils_test.c nodist_sahpi_event_utils_test_SOURCES = $(REMOTE_SOURCES) sahpi_struct_utils_test_SOURCES = sahpi_struct_utils_test.c nodist_sahpi_struct_utils_test_SOURCES = $(REMOTE_SOURCES) sahpi_text_utils_test_SOURCES = sahpi_text_utils_test.c nodist_sahpi_text_utils_test_SOURCES = $(REMOTE_SOURCES) sahpi_time_utils_test_SOURCES = sahpi_time_utils_test.c nodist_sahpi_time_utils_test_SOURCES = $(REMOTE_SOURCES) sahpi_struct_idrinfo_test_SOURCES = sahpi_struct_idrinfo_test.c nodist_sahpi_struct_idrinfo_test_SOURCES = $(REMOTE_SOURCES) sahpi_struct_idrarea_test_SOURCES = sahpi_struct_idrarea_test.c nodist_sahpi_struct_idrarea_test_SOURCES = $(REMOTE_SOURCES) sahpi_struct_idrfield_test_SOURCES = sahpi_struct_idrfield_test.c nodist_sahpi_struct_idrfield_test_SOURCES = $(REMOTE_SOURCES) sahpi_struct_rptentry_test_SOURCES = sahpi_struct_rptentry_test.c nodist_sahpi_struct_rptentry_test_SOURCES = $(REMOTE_SOURCES) sahpi_struct_rdr_test_SOURCES = sahpi_struct_rdr_test.c nodist_sahpi_struct_rdr_test_SOURCES = $(REMOTE_SOURCES) openhpi-2.14.1/utils/t/sahpi/sahpi_event_encode_test.c0000644000076400007640000036074111302567130017736 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * Steve Sherman */ /******************************************************************* * WARNING! This file is auto-magically generated by: * ./SaHpi2code.pl. * Do not change this file manually. Update script instead *******************************************************************/ #include #include #include #include int main(int argc, char **argv) { char *expected_str; SaErrorT err; SaHpiEventStateT event_state, expected_state; SaHpiEventCategoryT event_cat, expected_cat; SaHpiTextBufferT buffer; #define BAD_EVENT 0xFFFF /* SAHPI_EC_UNSPECIFIED - SAHPI_ES_UNSPECIFIED testcase */ { expected_cat = SAHPI_EC_UNSPECIFIED; expected_state = SAHPI_ES_UNSPECIFIED; expected_str = "UNSPECIFIED"; err = oh_decode_eventstate(SAHPI_ES_UNSPECIFIED, SAHPI_EC_UNSPECIFIED, &buffer); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (strcmp(expected_str, (char *)buffer.Data)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", buffer.Data); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_encode_eventstate(&buffer, &event_state, &event_cat); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if ((expected_state != event_state) || !(expected_cat == event_cat)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received state=%x; Received cat=%x\n", event_state, event_cat); return -1; } } /* SAHPI_EC_UNSPECIFIED - Bad event testcase */ { if (oh_valid_eventstate(BAD_EVENT, SAHPI_EC_UNSPECIFIED, SAHPI_FALSE)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); return -1; } } /* SAHPI_EC_LIMIT - SAHPI_ES_LIMIT_NOT_EXCEEDED testcase */ { expected_cat = SAHPI_EC_LIMIT; expected_state = SAHPI_ES_LIMIT_NOT_EXCEEDED; expected_str = "LIMIT_NOT_EXCEEDED"; err = oh_decode_eventstate(SAHPI_ES_LIMIT_NOT_EXCEEDED, SAHPI_EC_LIMIT, &buffer); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (strcmp(expected_str, (char *)buffer.Data)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", buffer.Data); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_encode_eventstate(&buffer, &event_state, &event_cat); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if ((expected_state != event_state) || !(expected_cat == event_cat)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received state=%x; Received cat=%x\n", event_state, event_cat); return -1; } } /* SAHPI_EC_LIMIT - SAHPI_ES_LIMIT_EXCEEDED testcase */ { expected_cat = SAHPI_EC_LIMIT; expected_state = SAHPI_ES_LIMIT_EXCEEDED; expected_str = "LIMIT_EXCEEDED"; err = oh_decode_eventstate(SAHPI_ES_LIMIT_EXCEEDED, SAHPI_EC_LIMIT, &buffer); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (strcmp(expected_str, (char *)buffer.Data)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", buffer.Data); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_encode_eventstate(&buffer, &event_state, &event_cat); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if ((expected_state != event_state) || !(expected_cat == event_cat)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received state=%x; Received cat=%x\n", event_state, event_cat); return -1; } } /* SAHPI_EC_LIMIT - Bad event testcase */ { if (oh_valid_eventstate(BAD_EVENT, SAHPI_EC_LIMIT, SAHPI_FALSE)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); return -1; } } /* SAHPI_EC_SENSOR_SPECIFIC - SAHPI_ES_STATE_00 testcase */ { expected_cat = SAHPI_EC_SENSOR_SPECIFIC; expected_state = SAHPI_ES_STATE_00; expected_str = "STATE_00"; err = oh_decode_eventstate(SAHPI_ES_STATE_00, SAHPI_EC_SENSOR_SPECIFIC, &buffer); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (strcmp(expected_str, (char *)buffer.Data)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", buffer.Data); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_encode_eventstate(&buffer, &event_state, &event_cat); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if ((expected_state != event_state) || !((SAHPI_EC_GENERIC == event_cat) || (SAHPI_EC_SENSOR_SPECIFIC == event_cat))) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received state=%x; Received cat=%x\n", event_state, event_cat); return -1; } } /* SAHPI_EC_SENSOR_SPECIFIC - SAHPI_ES_STATE_01 testcase */ { expected_cat = SAHPI_EC_SENSOR_SPECIFIC; expected_state = SAHPI_ES_STATE_01; expected_str = "STATE_01"; err = oh_decode_eventstate(SAHPI_ES_STATE_01, SAHPI_EC_SENSOR_SPECIFIC, &buffer); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (strcmp(expected_str, (char *)buffer.Data)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", buffer.Data); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_encode_eventstate(&buffer, &event_state, &event_cat); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if ((expected_state != event_state) || !((SAHPI_EC_GENERIC == event_cat) || (SAHPI_EC_SENSOR_SPECIFIC == event_cat))) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received state=%x; Received cat=%x\n", event_state, event_cat); return -1; } } /* SAHPI_EC_SENSOR_SPECIFIC - SAHPI_ES_STATE_02 testcase */ { expected_cat = SAHPI_EC_SENSOR_SPECIFIC; expected_state = SAHPI_ES_STATE_02; expected_str = "STATE_02"; err = oh_decode_eventstate(SAHPI_ES_STATE_02, SAHPI_EC_SENSOR_SPECIFIC, &buffer); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (strcmp(expected_str, (char *)buffer.Data)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", buffer.Data); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_encode_eventstate(&buffer, &event_state, &event_cat); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if ((expected_state != event_state) || !((SAHPI_EC_GENERIC == event_cat) || (SAHPI_EC_SENSOR_SPECIFIC == event_cat))) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received state=%x; Received cat=%x\n", event_state, event_cat); return -1; } } /* SAHPI_EC_SENSOR_SPECIFIC - SAHPI_ES_STATE_03 testcase */ { expected_cat = SAHPI_EC_SENSOR_SPECIFIC; expected_state = SAHPI_ES_STATE_03; expected_str = "STATE_03"; err = oh_decode_eventstate(SAHPI_ES_STATE_03, SAHPI_EC_SENSOR_SPECIFIC, &buffer); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (strcmp(expected_str, (char *)buffer.Data)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", buffer.Data); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_encode_eventstate(&buffer, &event_state, &event_cat); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if ((expected_state != event_state) || !((SAHPI_EC_GENERIC == event_cat) || (SAHPI_EC_SENSOR_SPECIFIC == event_cat))) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received state=%x; Received cat=%x\n", event_state, event_cat); return -1; } } /* SAHPI_EC_SENSOR_SPECIFIC - SAHPI_ES_STATE_04 testcase */ { expected_cat = SAHPI_EC_SENSOR_SPECIFIC; expected_state = SAHPI_ES_STATE_04; expected_str = "STATE_04"; err = oh_decode_eventstate(SAHPI_ES_STATE_04, SAHPI_EC_SENSOR_SPECIFIC, &buffer); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (strcmp(expected_str, (char *)buffer.Data)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", buffer.Data); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_encode_eventstate(&buffer, &event_state, &event_cat); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if ((expected_state != event_state) || !((SAHPI_EC_GENERIC == event_cat) || (SAHPI_EC_SENSOR_SPECIFIC == event_cat))) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received state=%x; Received cat=%x\n", event_state, event_cat); return -1; } } /* SAHPI_EC_SENSOR_SPECIFIC - SAHPI_ES_STATE_05 testcase */ { expected_cat = SAHPI_EC_SENSOR_SPECIFIC; expected_state = SAHPI_ES_STATE_05; expected_str = "STATE_05"; err = oh_decode_eventstate(SAHPI_ES_STATE_05, SAHPI_EC_SENSOR_SPECIFIC, &buffer); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (strcmp(expected_str, (char *)buffer.Data)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", buffer.Data); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_encode_eventstate(&buffer, &event_state, &event_cat); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if ((expected_state != event_state) || !((SAHPI_EC_GENERIC == event_cat) || (SAHPI_EC_SENSOR_SPECIFIC == event_cat))) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received state=%x; Received cat=%x\n", event_state, event_cat); return -1; } } /* SAHPI_EC_SENSOR_SPECIFIC - SAHPI_ES_STATE_06 testcase */ { expected_cat = SAHPI_EC_SENSOR_SPECIFIC; expected_state = SAHPI_ES_STATE_06; expected_str = "STATE_06"; err = oh_decode_eventstate(SAHPI_ES_STATE_06, SAHPI_EC_SENSOR_SPECIFIC, &buffer); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (strcmp(expected_str, (char *)buffer.Data)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", buffer.Data); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_encode_eventstate(&buffer, &event_state, &event_cat); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if ((expected_state != event_state) || !((SAHPI_EC_GENERIC == event_cat) || (SAHPI_EC_SENSOR_SPECIFIC == event_cat))) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received state=%x; Received cat=%x\n", event_state, event_cat); return -1; } } /* SAHPI_EC_SENSOR_SPECIFIC - SAHPI_ES_STATE_07 testcase */ { expected_cat = SAHPI_EC_SENSOR_SPECIFIC; expected_state = SAHPI_ES_STATE_07; expected_str = "STATE_07"; err = oh_decode_eventstate(SAHPI_ES_STATE_07, SAHPI_EC_SENSOR_SPECIFIC, &buffer); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (strcmp(expected_str, (char *)buffer.Data)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", buffer.Data); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_encode_eventstate(&buffer, &event_state, &event_cat); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if ((expected_state != event_state) || !((SAHPI_EC_GENERIC == event_cat) || (SAHPI_EC_SENSOR_SPECIFIC == event_cat))) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received state=%x; Received cat=%x\n", event_state, event_cat); return -1; } } /* SAHPI_EC_SENSOR_SPECIFIC - SAHPI_ES_STATE_08 testcase */ { expected_cat = SAHPI_EC_SENSOR_SPECIFIC; expected_state = SAHPI_ES_STATE_08; expected_str = "STATE_08"; err = oh_decode_eventstate(SAHPI_ES_STATE_08, SAHPI_EC_SENSOR_SPECIFIC, &buffer); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (strcmp(expected_str, (char *)buffer.Data)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", buffer.Data); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_encode_eventstate(&buffer, &event_state, &event_cat); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if ((expected_state != event_state) || !((SAHPI_EC_GENERIC == event_cat) || (SAHPI_EC_SENSOR_SPECIFIC == event_cat))) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received state=%x; Received cat=%x\n", event_state, event_cat); return -1; } } /* SAHPI_EC_SENSOR_SPECIFIC - SAHPI_ES_STATE_09 testcase */ { expected_cat = SAHPI_EC_SENSOR_SPECIFIC; expected_state = SAHPI_ES_STATE_09; expected_str = "STATE_09"; err = oh_decode_eventstate(SAHPI_ES_STATE_09, SAHPI_EC_SENSOR_SPECIFIC, &buffer); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (strcmp(expected_str, (char *)buffer.Data)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", buffer.Data); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_encode_eventstate(&buffer, &event_state, &event_cat); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if ((expected_state != event_state) || !((SAHPI_EC_GENERIC == event_cat) || (SAHPI_EC_SENSOR_SPECIFIC == event_cat))) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received state=%x; Received cat=%x\n", event_state, event_cat); return -1; } } /* SAHPI_EC_SENSOR_SPECIFIC - SAHPI_ES_STATE_10 testcase */ { expected_cat = SAHPI_EC_SENSOR_SPECIFIC; expected_state = SAHPI_ES_STATE_10; expected_str = "STATE_10"; err = oh_decode_eventstate(SAHPI_ES_STATE_10, SAHPI_EC_SENSOR_SPECIFIC, &buffer); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (strcmp(expected_str, (char *)buffer.Data)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", buffer.Data); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_encode_eventstate(&buffer, &event_state, &event_cat); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if ((expected_state != event_state) || !((SAHPI_EC_GENERIC == event_cat) || (SAHPI_EC_SENSOR_SPECIFIC == event_cat))) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received state=%x; Received cat=%x\n", event_state, event_cat); return -1; } } /* SAHPI_EC_SENSOR_SPECIFIC - SAHPI_ES_STATE_11 testcase */ { expected_cat = SAHPI_EC_SENSOR_SPECIFIC; expected_state = SAHPI_ES_STATE_11; expected_str = "STATE_11"; err = oh_decode_eventstate(SAHPI_ES_STATE_11, SAHPI_EC_SENSOR_SPECIFIC, &buffer); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (strcmp(expected_str, (char *)buffer.Data)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", buffer.Data); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_encode_eventstate(&buffer, &event_state, &event_cat); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if ((expected_state != event_state) || !((SAHPI_EC_GENERIC == event_cat) || (SAHPI_EC_SENSOR_SPECIFIC == event_cat))) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received state=%x; Received cat=%x\n", event_state, event_cat); return -1; } } /* SAHPI_EC_SENSOR_SPECIFIC - SAHPI_ES_STATE_12 testcase */ { expected_cat = SAHPI_EC_SENSOR_SPECIFIC; expected_state = SAHPI_ES_STATE_12; expected_str = "STATE_12"; err = oh_decode_eventstate(SAHPI_ES_STATE_12, SAHPI_EC_SENSOR_SPECIFIC, &buffer); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (strcmp(expected_str, (char *)buffer.Data)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", buffer.Data); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_encode_eventstate(&buffer, &event_state, &event_cat); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if ((expected_state != event_state) || !((SAHPI_EC_GENERIC == event_cat) || (SAHPI_EC_SENSOR_SPECIFIC == event_cat))) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received state=%x; Received cat=%x\n", event_state, event_cat); return -1; } } /* SAHPI_EC_SENSOR_SPECIFIC - SAHPI_ES_STATE_13 testcase */ { expected_cat = SAHPI_EC_SENSOR_SPECIFIC; expected_state = SAHPI_ES_STATE_13; expected_str = "STATE_13"; err = oh_decode_eventstate(SAHPI_ES_STATE_13, SAHPI_EC_SENSOR_SPECIFIC, &buffer); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (strcmp(expected_str, (char *)buffer.Data)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", buffer.Data); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_encode_eventstate(&buffer, &event_state, &event_cat); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if ((expected_state != event_state) || !((SAHPI_EC_GENERIC == event_cat) || (SAHPI_EC_SENSOR_SPECIFIC == event_cat))) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received state=%x; Received cat=%x\n", event_state, event_cat); return -1; } } /* SAHPI_EC_SENSOR_SPECIFIC - SAHPI_ES_STATE_14 testcase */ { expected_cat = SAHPI_EC_SENSOR_SPECIFIC; expected_state = SAHPI_ES_STATE_14; expected_str = "STATE_14"; err = oh_decode_eventstate(SAHPI_ES_STATE_14, SAHPI_EC_SENSOR_SPECIFIC, &buffer); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (strcmp(expected_str, (char *)buffer.Data)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", buffer.Data); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_encode_eventstate(&buffer, &event_state, &event_cat); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if ((expected_state != event_state) || !((SAHPI_EC_GENERIC == event_cat) || (SAHPI_EC_SENSOR_SPECIFIC == event_cat))) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received state=%x; Received cat=%x\n", event_state, event_cat); return -1; } } /* SAHPI_EC_SENSOR_SPECIFIC - Bad event testcase */ { if (oh_valid_eventstate(BAD_EVENT, SAHPI_EC_SENSOR_SPECIFIC, SAHPI_FALSE)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); return -1; } } /* SAHPI_EC_USAGE - SAHPI_ES_IDLE testcase */ { expected_cat = SAHPI_EC_USAGE; expected_state = SAHPI_ES_IDLE; expected_str = "IDLE"; err = oh_decode_eventstate(SAHPI_ES_IDLE, SAHPI_EC_USAGE, &buffer); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (strcmp(expected_str, (char *)buffer.Data)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", buffer.Data); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_encode_eventstate(&buffer, &event_state, &event_cat); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if ((expected_state != event_state) || !(expected_cat == event_cat)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received state=%x; Received cat=%x\n", event_state, event_cat); return -1; } } /* SAHPI_EC_USAGE - SAHPI_ES_ACTIVE testcase */ { expected_cat = SAHPI_EC_USAGE; expected_state = SAHPI_ES_ACTIVE; expected_str = "ACTIVE"; err = oh_decode_eventstate(SAHPI_ES_ACTIVE, SAHPI_EC_USAGE, &buffer); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (strcmp(expected_str, (char *)buffer.Data)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", buffer.Data); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_encode_eventstate(&buffer, &event_state, &event_cat); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if ((expected_state != event_state) || !(expected_cat == event_cat)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received state=%x; Received cat=%x\n", event_state, event_cat); return -1; } } /* SAHPI_EC_USAGE - SAHPI_ES_BUSY testcase */ { expected_cat = SAHPI_EC_USAGE; expected_state = SAHPI_ES_BUSY; expected_str = "BUSY"; err = oh_decode_eventstate(SAHPI_ES_BUSY, SAHPI_EC_USAGE, &buffer); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (strcmp(expected_str, (char *)buffer.Data)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", buffer.Data); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_encode_eventstate(&buffer, &event_state, &event_cat); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if ((expected_state != event_state) || !(expected_cat == event_cat)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received state=%x; Received cat=%x\n", event_state, event_cat); return -1; } } /* SAHPI_EC_USAGE - Bad event testcase */ { if (oh_valid_eventstate(BAD_EVENT, SAHPI_EC_USAGE, SAHPI_FALSE)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); return -1; } } /* SAHPI_EC_PRED_FAIL - SAHPI_ES_PRED_FAILURE_DEASSERT testcase */ { expected_cat = SAHPI_EC_PRED_FAIL; expected_state = SAHPI_ES_PRED_FAILURE_DEASSERT; expected_str = "PRED_FAILURE_DEASSERT"; err = oh_decode_eventstate(SAHPI_ES_PRED_FAILURE_DEASSERT, SAHPI_EC_PRED_FAIL, &buffer); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (strcmp(expected_str, (char *)buffer.Data)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", buffer.Data); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_encode_eventstate(&buffer, &event_state, &event_cat); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if ((expected_state != event_state) || !(expected_cat == event_cat)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received state=%x; Received cat=%x\n", event_state, event_cat); return -1; } } /* SAHPI_EC_PRED_FAIL - SAHPI_ES_PRED_FAILURE_ASSERT testcase */ { expected_cat = SAHPI_EC_PRED_FAIL; expected_state = SAHPI_ES_PRED_FAILURE_ASSERT; expected_str = "PRED_FAILURE_ASSERT"; err = oh_decode_eventstate(SAHPI_ES_PRED_FAILURE_ASSERT, SAHPI_EC_PRED_FAIL, &buffer); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (strcmp(expected_str, (char *)buffer.Data)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", buffer.Data); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_encode_eventstate(&buffer, &event_state, &event_cat); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if ((expected_state != event_state) || !(expected_cat == event_cat)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received state=%x; Received cat=%x\n", event_state, event_cat); return -1; } } /* SAHPI_EC_PRED_FAIL - Bad event testcase */ { if (oh_valid_eventstate(BAD_EVENT, SAHPI_EC_PRED_FAIL, SAHPI_FALSE)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); return -1; } } /* SAHPI_EC_THRESHOLD - SAHPI_ES_LOWER_MINOR testcase */ { expected_cat = SAHPI_EC_THRESHOLD; expected_state = SAHPI_ES_LOWER_MINOR; expected_str = "LOWER_MINOR"; err = oh_decode_eventstate(SAHPI_ES_LOWER_MINOR, SAHPI_EC_THRESHOLD, &buffer); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (strcmp(expected_str, (char *)buffer.Data)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", buffer.Data); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_encode_eventstate(&buffer, &event_state, &event_cat); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if ((expected_state != event_state) || !(expected_cat == event_cat)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received state=%x; Received cat=%x\n", event_state, event_cat); return -1; } } /* SAHPI_EC_THRESHOLD - SAHPI_ES_LOWER_MINOR | SAHPI_ES_LOWER_MAJOR testcase */ { expected_cat = SAHPI_EC_THRESHOLD; expected_state = SAHPI_ES_LOWER_MINOR | SAHPI_ES_LOWER_MAJOR; expected_str = "LOWER_MINOR | LOWER_MAJOR"; err = oh_decode_eventstate(SAHPI_ES_LOWER_MINOR | SAHPI_ES_LOWER_MAJOR, SAHPI_EC_THRESHOLD, &buffer); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (strcmp(expected_str, (char *)buffer.Data)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", buffer.Data); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_encode_eventstate(&buffer, &event_state, &event_cat); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if ((expected_state != event_state) || !(expected_cat == event_cat)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received state=%x; Received cat=%x\n", event_state, event_cat); return -1; } } /* SAHPI_EC_THRESHOLD - SAHPI_ES_LOWER_MINOR | SAHPI_ES_LOWER_MAJOR | SAHPI_ES_LOWER_CRIT testcase */ { expected_cat = SAHPI_EC_THRESHOLD; expected_state = SAHPI_ES_LOWER_MINOR | SAHPI_ES_LOWER_MAJOR | SAHPI_ES_LOWER_CRIT; expected_str = "LOWER_MINOR | LOWER_MAJOR | LOWER_CRIT"; err = oh_decode_eventstate(SAHPI_ES_LOWER_MINOR | SAHPI_ES_LOWER_MAJOR | SAHPI_ES_LOWER_CRIT, SAHPI_EC_THRESHOLD, &buffer); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (strcmp(expected_str, (char *)buffer.Data)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", buffer.Data); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_encode_eventstate(&buffer, &event_state, &event_cat); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if ((expected_state != event_state) || !(expected_cat == event_cat)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received state=%x; Received cat=%x\n", event_state, event_cat); return -1; } } /* SAHPI_EC_THRESHOLD - SAHPI_ES_UPPER_MINOR testcase */ { expected_cat = SAHPI_EC_THRESHOLD; expected_state = SAHPI_ES_UPPER_MINOR; expected_str = "UPPER_MINOR"; err = oh_decode_eventstate(SAHPI_ES_UPPER_MINOR, SAHPI_EC_THRESHOLD, &buffer); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (strcmp(expected_str, (char *)buffer.Data)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", buffer.Data); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_encode_eventstate(&buffer, &event_state, &event_cat); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if ((expected_state != event_state) || !(expected_cat == event_cat)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received state=%x; Received cat=%x\n", event_state, event_cat); return -1; } } /* SAHPI_EC_THRESHOLD - SAHPI_ES_UPPER_MINOR | SAHPI_ES_UPPER_MAJOR testcase */ { expected_cat = SAHPI_EC_THRESHOLD; expected_state = SAHPI_ES_UPPER_MINOR | SAHPI_ES_UPPER_MAJOR; expected_str = "UPPER_MINOR | UPPER_MAJOR"; err = oh_decode_eventstate(SAHPI_ES_UPPER_MINOR | SAHPI_ES_UPPER_MAJOR, SAHPI_EC_THRESHOLD, &buffer); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (strcmp(expected_str, (char *)buffer.Data)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", buffer.Data); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_encode_eventstate(&buffer, &event_state, &event_cat); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if ((expected_state != event_state) || !(expected_cat == event_cat)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received state=%x; Received cat=%x\n", event_state, event_cat); return -1; } } /* SAHPI_EC_THRESHOLD - SAHPI_ES_UPPER_MINOR | SAHPI_ES_UPPER_MAJOR | SAHPI_ES_UPPER_CRIT testcase */ { expected_cat = SAHPI_EC_THRESHOLD; expected_state = SAHPI_ES_UPPER_MINOR | SAHPI_ES_UPPER_MAJOR | SAHPI_ES_UPPER_CRIT; expected_str = "UPPER_MINOR | UPPER_MAJOR | UPPER_CRIT"; err = oh_decode_eventstate(SAHPI_ES_UPPER_MINOR | SAHPI_ES_UPPER_MAJOR | SAHPI_ES_UPPER_CRIT, SAHPI_EC_THRESHOLD, &buffer); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (strcmp(expected_str, (char *)buffer.Data)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", buffer.Data); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_encode_eventstate(&buffer, &event_state, &event_cat); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if ((expected_state != event_state) || !(expected_cat == event_cat)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received state=%x; Received cat=%x\n", event_state, event_cat); return -1; } } /* SAHPI_EC_THRESHOLD - Bad event testcase */ { if (oh_valid_eventstate(BAD_EVENT, SAHPI_EC_THRESHOLD, SAHPI_FALSE)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); return -1; } } /* SAHPI_EC_ENABLE - SAHPI_ES_DISABLED testcase */ { expected_cat = SAHPI_EC_ENABLE; expected_state = SAHPI_ES_DISABLED; expected_str = "DISABLED"; err = oh_decode_eventstate(SAHPI_ES_DISABLED, SAHPI_EC_ENABLE, &buffer); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (strcmp(expected_str, (char *)buffer.Data)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", buffer.Data); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_encode_eventstate(&buffer, &event_state, &event_cat); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if ((expected_state != event_state) || !(expected_cat == event_cat)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received state=%x; Received cat=%x\n", event_state, event_cat); return -1; } } /* SAHPI_EC_ENABLE - SAHPI_ES_ENABLED testcase */ { expected_cat = SAHPI_EC_ENABLE; expected_state = SAHPI_ES_ENABLED; expected_str = "ENABLED"; err = oh_decode_eventstate(SAHPI_ES_ENABLED, SAHPI_EC_ENABLE, &buffer); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (strcmp(expected_str, (char *)buffer.Data)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", buffer.Data); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_encode_eventstate(&buffer, &event_state, &event_cat); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if ((expected_state != event_state) || !(expected_cat == event_cat)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received state=%x; Received cat=%x\n", event_state, event_cat); return -1; } } /* SAHPI_EC_ENABLE - Bad event testcase */ { if (oh_valid_eventstate(BAD_EVENT, SAHPI_EC_ENABLE, SAHPI_FALSE)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); return -1; } } /* SAHPI_EC_PRESENCE - SAHPI_ES_ABSENT testcase */ { expected_cat = SAHPI_EC_PRESENCE; expected_state = SAHPI_ES_ABSENT; expected_str = "ABSENT"; err = oh_decode_eventstate(SAHPI_ES_ABSENT, SAHPI_EC_PRESENCE, &buffer); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (strcmp(expected_str, (char *)buffer.Data)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", buffer.Data); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_encode_eventstate(&buffer, &event_state, &event_cat); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if ((expected_state != event_state) || !(expected_cat == event_cat)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received state=%x; Received cat=%x\n", event_state, event_cat); return -1; } } /* SAHPI_EC_PRESENCE - SAHPI_ES_PRESENT testcase */ { expected_cat = SAHPI_EC_PRESENCE; expected_state = SAHPI_ES_PRESENT; expected_str = "PRESENT"; err = oh_decode_eventstate(SAHPI_ES_PRESENT, SAHPI_EC_PRESENCE, &buffer); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (strcmp(expected_str, (char *)buffer.Data)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", buffer.Data); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_encode_eventstate(&buffer, &event_state, &event_cat); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if ((expected_state != event_state) || !(expected_cat == event_cat)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received state=%x; Received cat=%x\n", event_state, event_cat); return -1; } } /* SAHPI_EC_PRESENCE - Bad event testcase */ { if (oh_valid_eventstate(BAD_EVENT, SAHPI_EC_PRESENCE, SAHPI_FALSE)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); return -1; } } /* SAHPI_EC_SEVERITY - SAHPI_ES_OK testcase */ { expected_cat = SAHPI_EC_SEVERITY; expected_state = SAHPI_ES_OK; expected_str = "OK"; err = oh_decode_eventstate(SAHPI_ES_OK, SAHPI_EC_SEVERITY, &buffer); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (strcmp(expected_str, (char *)buffer.Data)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", buffer.Data); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_encode_eventstate(&buffer, &event_state, &event_cat); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if ((expected_state != event_state) || !(expected_cat == event_cat)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received state=%x; Received cat=%x\n", event_state, event_cat); return -1; } } /* SAHPI_EC_SEVERITY - SAHPI_ES_MINOR_FROM_OK testcase */ { expected_cat = SAHPI_EC_SEVERITY; expected_state = SAHPI_ES_MINOR_FROM_OK; expected_str = "MINOR_FROM_OK"; err = oh_decode_eventstate(SAHPI_ES_MINOR_FROM_OK, SAHPI_EC_SEVERITY, &buffer); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (strcmp(expected_str, (char *)buffer.Data)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", buffer.Data); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_encode_eventstate(&buffer, &event_state, &event_cat); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if ((expected_state != event_state) || !(expected_cat == event_cat)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received state=%x; Received cat=%x\n", event_state, event_cat); return -1; } } /* SAHPI_EC_SEVERITY - SAHPI_ES_MAJOR_FROM_LESS testcase */ { expected_cat = SAHPI_EC_SEVERITY; expected_state = SAHPI_ES_MAJOR_FROM_LESS; expected_str = "MAJOR_FROM_LESS"; err = oh_decode_eventstate(SAHPI_ES_MAJOR_FROM_LESS, SAHPI_EC_SEVERITY, &buffer); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (strcmp(expected_str, (char *)buffer.Data)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", buffer.Data); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_encode_eventstate(&buffer, &event_state, &event_cat); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if ((expected_state != event_state) || !(expected_cat == event_cat)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received state=%x; Received cat=%x\n", event_state, event_cat); return -1; } } /* SAHPI_EC_SEVERITY - SAHPI_ES_CRITICAL_FROM_LESS testcase */ { expected_cat = SAHPI_EC_SEVERITY; expected_state = SAHPI_ES_CRITICAL_FROM_LESS; expected_str = "CRITICAL_FROM_LESS"; err = oh_decode_eventstate(SAHPI_ES_CRITICAL_FROM_LESS, SAHPI_EC_SEVERITY, &buffer); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (strcmp(expected_str, (char *)buffer.Data)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", buffer.Data); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_encode_eventstate(&buffer, &event_state, &event_cat); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if ((expected_state != event_state) || !(expected_cat == event_cat)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received state=%x; Received cat=%x\n", event_state, event_cat); return -1; } } /* SAHPI_EC_SEVERITY - SAHPI_ES_MINOR_FROM_MORE testcase */ { expected_cat = SAHPI_EC_SEVERITY; expected_state = SAHPI_ES_MINOR_FROM_MORE; expected_str = "MINOR_FROM_MORE"; err = oh_decode_eventstate(SAHPI_ES_MINOR_FROM_MORE, SAHPI_EC_SEVERITY, &buffer); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (strcmp(expected_str, (char *)buffer.Data)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", buffer.Data); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_encode_eventstate(&buffer, &event_state, &event_cat); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if ((expected_state != event_state) || !(expected_cat == event_cat)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received state=%x; Received cat=%x\n", event_state, event_cat); return -1; } } /* SAHPI_EC_SEVERITY - SAHPI_ES_MAJOR_FROM_CRITICAL testcase */ { expected_cat = SAHPI_EC_SEVERITY; expected_state = SAHPI_ES_MAJOR_FROM_CRITICAL; expected_str = "MAJOR_FROM_CRITICAL"; err = oh_decode_eventstate(SAHPI_ES_MAJOR_FROM_CRITICAL, SAHPI_EC_SEVERITY, &buffer); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (strcmp(expected_str, (char *)buffer.Data)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", buffer.Data); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_encode_eventstate(&buffer, &event_state, &event_cat); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if ((expected_state != event_state) || !(expected_cat == event_cat)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received state=%x; Received cat=%x\n", event_state, event_cat); return -1; } } /* SAHPI_EC_SEVERITY - SAHPI_ES_CRITICAL testcase */ { expected_cat = SAHPI_EC_SEVERITY; expected_state = SAHPI_ES_CRITICAL; expected_str = "CRITICAL"; err = oh_decode_eventstate(SAHPI_ES_CRITICAL, SAHPI_EC_SEVERITY, &buffer); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (strcmp(expected_str, (char *)buffer.Data)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", buffer.Data); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_encode_eventstate(&buffer, &event_state, &event_cat); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if ((expected_state != event_state) || !(expected_cat == event_cat)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received state=%x; Received cat=%x\n", event_state, event_cat); return -1; } } /* SAHPI_EC_SEVERITY - SAHPI_ES_MONITOR testcase */ { expected_cat = SAHPI_EC_SEVERITY; expected_state = SAHPI_ES_MONITOR; expected_str = "MONITOR"; err = oh_decode_eventstate(SAHPI_ES_MONITOR, SAHPI_EC_SEVERITY, &buffer); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (strcmp(expected_str, (char *)buffer.Data)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", buffer.Data); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_encode_eventstate(&buffer, &event_state, &event_cat); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if ((expected_state != event_state) || !(expected_cat == event_cat)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received state=%x; Received cat=%x\n", event_state, event_cat); return -1; } } /* SAHPI_EC_SEVERITY - SAHPI_ES_INFORMATIONAL testcase */ { expected_cat = SAHPI_EC_SEVERITY; expected_state = SAHPI_ES_INFORMATIONAL; expected_str = "INFORMATIONAL"; err = oh_decode_eventstate(SAHPI_ES_INFORMATIONAL, SAHPI_EC_SEVERITY, &buffer); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (strcmp(expected_str, (char *)buffer.Data)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", buffer.Data); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_encode_eventstate(&buffer, &event_state, &event_cat); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if ((expected_state != event_state) || !(expected_cat == event_cat)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received state=%x; Received cat=%x\n", event_state, event_cat); return -1; } } /* SAHPI_EC_SEVERITY - Bad event testcase */ { if (oh_valid_eventstate(BAD_EVENT, SAHPI_EC_SEVERITY, SAHPI_FALSE)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); return -1; } } /* SAHPI_EC_PERFORMANCE - SAHPI_ES_PERFORMANCE_MET testcase */ { expected_cat = SAHPI_EC_PERFORMANCE; expected_state = SAHPI_ES_PERFORMANCE_MET; expected_str = "PERFORMANCE_MET"; err = oh_decode_eventstate(SAHPI_ES_PERFORMANCE_MET, SAHPI_EC_PERFORMANCE, &buffer); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (strcmp(expected_str, (char *)buffer.Data)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", buffer.Data); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_encode_eventstate(&buffer, &event_state, &event_cat); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if ((expected_state != event_state) || !(expected_cat == event_cat)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received state=%x; Received cat=%x\n", event_state, event_cat); return -1; } } /* SAHPI_EC_PERFORMANCE - SAHPI_ES_PERFORMANCE_LAGS testcase */ { expected_cat = SAHPI_EC_PERFORMANCE; expected_state = SAHPI_ES_PERFORMANCE_LAGS; expected_str = "PERFORMANCE_LAGS"; err = oh_decode_eventstate(SAHPI_ES_PERFORMANCE_LAGS, SAHPI_EC_PERFORMANCE, &buffer); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (strcmp(expected_str, (char *)buffer.Data)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", buffer.Data); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_encode_eventstate(&buffer, &event_state, &event_cat); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if ((expected_state != event_state) || !(expected_cat == event_cat)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received state=%x; Received cat=%x\n", event_state, event_cat); return -1; } } /* SAHPI_EC_PERFORMANCE - Bad event testcase */ { if (oh_valid_eventstate(BAD_EVENT, SAHPI_EC_PERFORMANCE, SAHPI_FALSE)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); return -1; } } /* SAHPI_EC_STATE - SAHPI_ES_STATE_DEASSERTED testcase */ { expected_cat = SAHPI_EC_STATE; expected_state = SAHPI_ES_STATE_DEASSERTED; expected_str = "STATE_DEASSERTED"; err = oh_decode_eventstate(SAHPI_ES_STATE_DEASSERTED, SAHPI_EC_STATE, &buffer); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (strcmp(expected_str, (char *)buffer.Data)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", buffer.Data); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_encode_eventstate(&buffer, &event_state, &event_cat); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if ((expected_state != event_state) || !(expected_cat == event_cat)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received state=%x; Received cat=%x\n", event_state, event_cat); return -1; } } /* SAHPI_EC_STATE - SAHPI_ES_STATE_ASSERTED testcase */ { expected_cat = SAHPI_EC_STATE; expected_state = SAHPI_ES_STATE_ASSERTED; expected_str = "STATE_ASSERTED"; err = oh_decode_eventstate(SAHPI_ES_STATE_ASSERTED, SAHPI_EC_STATE, &buffer); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (strcmp(expected_str, (char *)buffer.Data)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", buffer.Data); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_encode_eventstate(&buffer, &event_state, &event_cat); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if ((expected_state != event_state) || !(expected_cat == event_cat)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received state=%x; Received cat=%x\n", event_state, event_cat); return -1; } } /* SAHPI_EC_STATE - Bad event testcase */ { if (oh_valid_eventstate(BAD_EVENT, SAHPI_EC_STATE, SAHPI_FALSE)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); return -1; } } /* SAHPI_EC_AVAILABILITY - SAHPI_ES_RUNNING testcase */ { expected_cat = SAHPI_EC_AVAILABILITY; expected_state = SAHPI_ES_RUNNING; expected_str = "RUNNING"; err = oh_decode_eventstate(SAHPI_ES_RUNNING, SAHPI_EC_AVAILABILITY, &buffer); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (strcmp(expected_str, (char *)buffer.Data)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", buffer.Data); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_encode_eventstate(&buffer, &event_state, &event_cat); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if ((expected_state != event_state) || !(expected_cat == event_cat)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received state=%x; Received cat=%x\n", event_state, event_cat); return -1; } } /* SAHPI_EC_AVAILABILITY - SAHPI_ES_TEST testcase */ { expected_cat = SAHPI_EC_AVAILABILITY; expected_state = SAHPI_ES_TEST; expected_str = "TEST"; err = oh_decode_eventstate(SAHPI_ES_TEST, SAHPI_EC_AVAILABILITY, &buffer); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (strcmp(expected_str, (char *)buffer.Data)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", buffer.Data); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_encode_eventstate(&buffer, &event_state, &event_cat); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if ((expected_state != event_state) || !(expected_cat == event_cat)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received state=%x; Received cat=%x\n", event_state, event_cat); return -1; } } /* SAHPI_EC_AVAILABILITY - SAHPI_ES_POWER_OFF testcase */ { expected_cat = SAHPI_EC_AVAILABILITY; expected_state = SAHPI_ES_POWER_OFF; expected_str = "POWER_OFF"; err = oh_decode_eventstate(SAHPI_ES_POWER_OFF, SAHPI_EC_AVAILABILITY, &buffer); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (strcmp(expected_str, (char *)buffer.Data)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", buffer.Data); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_encode_eventstate(&buffer, &event_state, &event_cat); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if ((expected_state != event_state) || !(expected_cat == event_cat)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received state=%x; Received cat=%x\n", event_state, event_cat); return -1; } } /* SAHPI_EC_AVAILABILITY - SAHPI_ES_ON_LINE testcase */ { expected_cat = SAHPI_EC_AVAILABILITY; expected_state = SAHPI_ES_ON_LINE; expected_str = "ON_LINE"; err = oh_decode_eventstate(SAHPI_ES_ON_LINE, SAHPI_EC_AVAILABILITY, &buffer); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (strcmp(expected_str, (char *)buffer.Data)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", buffer.Data); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_encode_eventstate(&buffer, &event_state, &event_cat); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if ((expected_state != event_state) || !(expected_cat == event_cat)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received state=%x; Received cat=%x\n", event_state, event_cat); return -1; } } /* SAHPI_EC_AVAILABILITY - SAHPI_ES_OFF_LINE testcase */ { expected_cat = SAHPI_EC_AVAILABILITY; expected_state = SAHPI_ES_OFF_LINE; expected_str = "OFF_LINE"; err = oh_decode_eventstate(SAHPI_ES_OFF_LINE, SAHPI_EC_AVAILABILITY, &buffer); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (strcmp(expected_str, (char *)buffer.Data)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", buffer.Data); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_encode_eventstate(&buffer, &event_state, &event_cat); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if ((expected_state != event_state) || !(expected_cat == event_cat)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received state=%x; Received cat=%x\n", event_state, event_cat); return -1; } } /* SAHPI_EC_AVAILABILITY - SAHPI_ES_OFF_DUTY testcase */ { expected_cat = SAHPI_EC_AVAILABILITY; expected_state = SAHPI_ES_OFF_DUTY; expected_str = "OFF_DUTY"; err = oh_decode_eventstate(SAHPI_ES_OFF_DUTY, SAHPI_EC_AVAILABILITY, &buffer); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (strcmp(expected_str, (char *)buffer.Data)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", buffer.Data); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_encode_eventstate(&buffer, &event_state, &event_cat); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if ((expected_state != event_state) || !(expected_cat == event_cat)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received state=%x; Received cat=%x\n", event_state, event_cat); return -1; } } /* SAHPI_EC_AVAILABILITY - SAHPI_ES_DEGRADED testcase */ { expected_cat = SAHPI_EC_AVAILABILITY; expected_state = SAHPI_ES_DEGRADED; expected_str = "DEGRADED"; err = oh_decode_eventstate(SAHPI_ES_DEGRADED, SAHPI_EC_AVAILABILITY, &buffer); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (strcmp(expected_str, (char *)buffer.Data)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", buffer.Data); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_encode_eventstate(&buffer, &event_state, &event_cat); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if ((expected_state != event_state) || !(expected_cat == event_cat)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received state=%x; Received cat=%x\n", event_state, event_cat); return -1; } } /* SAHPI_EC_AVAILABILITY - SAHPI_ES_POWER_SAVE testcase */ { expected_cat = SAHPI_EC_AVAILABILITY; expected_state = SAHPI_ES_POWER_SAVE; expected_str = "POWER_SAVE"; err = oh_decode_eventstate(SAHPI_ES_POWER_SAVE, SAHPI_EC_AVAILABILITY, &buffer); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (strcmp(expected_str, (char *)buffer.Data)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", buffer.Data); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_encode_eventstate(&buffer, &event_state, &event_cat); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if ((expected_state != event_state) || !(expected_cat == event_cat)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received state=%x; Received cat=%x\n", event_state, event_cat); return -1; } } /* SAHPI_EC_AVAILABILITY - SAHPI_ES_INSTALL_ERROR testcase */ { expected_cat = SAHPI_EC_AVAILABILITY; expected_state = SAHPI_ES_INSTALL_ERROR; expected_str = "INSTALL_ERROR"; err = oh_decode_eventstate(SAHPI_ES_INSTALL_ERROR, SAHPI_EC_AVAILABILITY, &buffer); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (strcmp(expected_str, (char *)buffer.Data)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", buffer.Data); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_encode_eventstate(&buffer, &event_state, &event_cat); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if ((expected_state != event_state) || !(expected_cat == event_cat)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received state=%x; Received cat=%x\n", event_state, event_cat); return -1; } } /* SAHPI_EC_AVAILABILITY - Bad event testcase */ { if (oh_valid_eventstate(BAD_EVENT, SAHPI_EC_AVAILABILITY, SAHPI_FALSE)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); return -1; } } /* SAHPI_EC_REDUNDANCY - SAHPI_ES_FULLY_REDUNDANT testcase */ { expected_cat = SAHPI_EC_REDUNDANCY; expected_state = SAHPI_ES_FULLY_REDUNDANT; expected_str = "FULLY_REDUNDANT"; err = oh_decode_eventstate(SAHPI_ES_FULLY_REDUNDANT, SAHPI_EC_REDUNDANCY, &buffer); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (strcmp(expected_str, (char *)buffer.Data)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", buffer.Data); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_encode_eventstate(&buffer, &event_state, &event_cat); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if ((expected_state != event_state) || !(expected_cat == event_cat)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received state=%x; Received cat=%x\n", event_state, event_cat); return -1; } } /* SAHPI_EC_REDUNDANCY - SAHPI_ES_REDUNDANCY_LOST testcase */ { expected_cat = SAHPI_EC_REDUNDANCY; expected_state = SAHPI_ES_REDUNDANCY_LOST; expected_str = "REDUNDANCY_LOST"; err = oh_decode_eventstate(SAHPI_ES_REDUNDANCY_LOST, SAHPI_EC_REDUNDANCY, &buffer); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (strcmp(expected_str, (char *)buffer.Data)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", buffer.Data); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_encode_eventstate(&buffer, &event_state, &event_cat); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if ((expected_state != event_state) || !(expected_cat == event_cat)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received state=%x; Received cat=%x\n", event_state, event_cat); return -1; } } /* SAHPI_EC_REDUNDANCY - SAHPI_ES_REDUNDANCY_DEGRADED testcase */ { expected_cat = SAHPI_EC_REDUNDANCY; expected_state = SAHPI_ES_REDUNDANCY_DEGRADED; expected_str = "REDUNDANCY_DEGRADED"; err = oh_decode_eventstate(SAHPI_ES_REDUNDANCY_DEGRADED, SAHPI_EC_REDUNDANCY, &buffer); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (strcmp(expected_str, (char *)buffer.Data)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", buffer.Data); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_encode_eventstate(&buffer, &event_state, &event_cat); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if ((expected_state != event_state) || !(expected_cat == event_cat)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received state=%x; Received cat=%x\n", event_state, event_cat); return -1; } } /* SAHPI_EC_REDUNDANCY - SAHPI_ES_REDUNDANCY_LOST_SUFFICIENT_RESOURCES testcase */ { expected_cat = SAHPI_EC_REDUNDANCY; expected_state = SAHPI_ES_REDUNDANCY_LOST_SUFFICIENT_RESOURCES; expected_str = "REDUNDANCY_LOST_SUFFICIENT_RESOURCES"; err = oh_decode_eventstate(SAHPI_ES_REDUNDANCY_LOST_SUFFICIENT_RESOURCES, SAHPI_EC_REDUNDANCY, &buffer); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (strcmp(expected_str, (char *)buffer.Data)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", buffer.Data); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_encode_eventstate(&buffer, &event_state, &event_cat); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if ((expected_state != event_state) || !(expected_cat == event_cat)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received state=%x; Received cat=%x\n", event_state, event_cat); return -1; } } /* SAHPI_EC_REDUNDANCY - SAHPI_ES_NON_REDUNDANT_SUFFICIENT_RESOURCES testcase */ { expected_cat = SAHPI_EC_REDUNDANCY; expected_state = SAHPI_ES_NON_REDUNDANT_SUFFICIENT_RESOURCES; expected_str = "NON_REDUNDANT_SUFFICIENT_RESOURCES"; err = oh_decode_eventstate(SAHPI_ES_NON_REDUNDANT_SUFFICIENT_RESOURCES, SAHPI_EC_REDUNDANCY, &buffer); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (strcmp(expected_str, (char *)buffer.Data)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", buffer.Data); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_encode_eventstate(&buffer, &event_state, &event_cat); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if ((expected_state != event_state) || !(expected_cat == event_cat)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received state=%x; Received cat=%x\n", event_state, event_cat); return -1; } } /* SAHPI_EC_REDUNDANCY - SAHPI_ES_NON_REDUNDANT_INSUFFICIENT_RESOURCES testcase */ { expected_cat = SAHPI_EC_REDUNDANCY; expected_state = SAHPI_ES_NON_REDUNDANT_INSUFFICIENT_RESOURCES; expected_str = "NON_REDUNDANT_INSUFFICIENT_RESOURCES"; err = oh_decode_eventstate(SAHPI_ES_NON_REDUNDANT_INSUFFICIENT_RESOURCES, SAHPI_EC_REDUNDANCY, &buffer); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (strcmp(expected_str, (char *)buffer.Data)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", buffer.Data); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_encode_eventstate(&buffer, &event_state, &event_cat); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if ((expected_state != event_state) || !(expected_cat == event_cat)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received state=%x; Received cat=%x\n", event_state, event_cat); return -1; } } /* SAHPI_EC_REDUNDANCY - SAHPI_ES_REDUNDANCY_DEGRADED_FROM_FULL testcase */ { expected_cat = SAHPI_EC_REDUNDANCY; expected_state = SAHPI_ES_REDUNDANCY_DEGRADED_FROM_FULL; expected_str = "REDUNDANCY_DEGRADED_FROM_FULL"; err = oh_decode_eventstate(SAHPI_ES_REDUNDANCY_DEGRADED_FROM_FULL, SAHPI_EC_REDUNDANCY, &buffer); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (strcmp(expected_str, (char *)buffer.Data)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", buffer.Data); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_encode_eventstate(&buffer, &event_state, &event_cat); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if ((expected_state != event_state) || !(expected_cat == event_cat)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received state=%x; Received cat=%x\n", event_state, event_cat); return -1; } } /* SAHPI_EC_REDUNDANCY - SAHPI_ES_REDUNDANCY_DEGRADED_FROM_NON testcase */ { expected_cat = SAHPI_EC_REDUNDANCY; expected_state = SAHPI_ES_REDUNDANCY_DEGRADED_FROM_NON; expected_str = "REDUNDANCY_DEGRADED_FROM_NON"; err = oh_decode_eventstate(SAHPI_ES_REDUNDANCY_DEGRADED_FROM_NON, SAHPI_EC_REDUNDANCY, &buffer); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (strcmp(expected_str, (char *)buffer.Data)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", buffer.Data); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_encode_eventstate(&buffer, &event_state, &event_cat); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if ((expected_state != event_state) || !(expected_cat == event_cat)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received state=%x; Received cat=%x\n", event_state, event_cat); return -1; } } /* SAHPI_EC_REDUNDANCY - Bad event testcase */ { if (oh_valid_eventstate(BAD_EVENT, SAHPI_EC_REDUNDANCY, SAHPI_FALSE)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); return -1; } } /* SAHPI_EC_GENERIC - SAHPI_ES_STATE_00 testcase */ { expected_cat = SAHPI_EC_GENERIC; expected_state = SAHPI_ES_STATE_00; expected_str = "STATE_00"; err = oh_decode_eventstate(SAHPI_ES_STATE_00, SAHPI_EC_GENERIC, &buffer); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (strcmp(expected_str, (char *)buffer.Data)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", buffer.Data); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_encode_eventstate(&buffer, &event_state, &event_cat); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if ((expected_state != event_state) || !((SAHPI_EC_GENERIC == event_cat) || (SAHPI_EC_SENSOR_SPECIFIC == event_cat))) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received state=%x; Received cat=%x\n", event_state, event_cat); return -1; } } /* SAHPI_EC_GENERIC - SAHPI_ES_STATE_01 testcase */ { expected_cat = SAHPI_EC_GENERIC; expected_state = SAHPI_ES_STATE_01; expected_str = "STATE_01"; err = oh_decode_eventstate(SAHPI_ES_STATE_01, SAHPI_EC_GENERIC, &buffer); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (strcmp(expected_str, (char *)buffer.Data)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", buffer.Data); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_encode_eventstate(&buffer, &event_state, &event_cat); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if ((expected_state != event_state) || !((SAHPI_EC_GENERIC == event_cat) || (SAHPI_EC_SENSOR_SPECIFIC == event_cat))) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received state=%x; Received cat=%x\n", event_state, event_cat); return -1; } } /* SAHPI_EC_GENERIC - SAHPI_ES_STATE_02 testcase */ { expected_cat = SAHPI_EC_GENERIC; expected_state = SAHPI_ES_STATE_02; expected_str = "STATE_02"; err = oh_decode_eventstate(SAHPI_ES_STATE_02, SAHPI_EC_GENERIC, &buffer); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (strcmp(expected_str, (char *)buffer.Data)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", buffer.Data); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_encode_eventstate(&buffer, &event_state, &event_cat); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if ((expected_state != event_state) || !((SAHPI_EC_GENERIC == event_cat) || (SAHPI_EC_SENSOR_SPECIFIC == event_cat))) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received state=%x; Received cat=%x\n", event_state, event_cat); return -1; } } /* SAHPI_EC_GENERIC - SAHPI_ES_STATE_03 testcase */ { expected_cat = SAHPI_EC_GENERIC; expected_state = SAHPI_ES_STATE_03; expected_str = "STATE_03"; err = oh_decode_eventstate(SAHPI_ES_STATE_03, SAHPI_EC_GENERIC, &buffer); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (strcmp(expected_str, (char *)buffer.Data)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", buffer.Data); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_encode_eventstate(&buffer, &event_state, &event_cat); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if ((expected_state != event_state) || !((SAHPI_EC_GENERIC == event_cat) || (SAHPI_EC_SENSOR_SPECIFIC == event_cat))) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received state=%x; Received cat=%x\n", event_state, event_cat); return -1; } } /* SAHPI_EC_GENERIC - SAHPI_ES_STATE_04 testcase */ { expected_cat = SAHPI_EC_GENERIC; expected_state = SAHPI_ES_STATE_04; expected_str = "STATE_04"; err = oh_decode_eventstate(SAHPI_ES_STATE_04, SAHPI_EC_GENERIC, &buffer); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (strcmp(expected_str, (char *)buffer.Data)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", buffer.Data); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_encode_eventstate(&buffer, &event_state, &event_cat); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if ((expected_state != event_state) || !((SAHPI_EC_GENERIC == event_cat) || (SAHPI_EC_SENSOR_SPECIFIC == event_cat))) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received state=%x; Received cat=%x\n", event_state, event_cat); return -1; } } /* SAHPI_EC_GENERIC - SAHPI_ES_STATE_05 testcase */ { expected_cat = SAHPI_EC_GENERIC; expected_state = SAHPI_ES_STATE_05; expected_str = "STATE_05"; err = oh_decode_eventstate(SAHPI_ES_STATE_05, SAHPI_EC_GENERIC, &buffer); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (strcmp(expected_str, (char *)buffer.Data)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", buffer.Data); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_encode_eventstate(&buffer, &event_state, &event_cat); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if ((expected_state != event_state) || !((SAHPI_EC_GENERIC == event_cat) || (SAHPI_EC_SENSOR_SPECIFIC == event_cat))) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received state=%x; Received cat=%x\n", event_state, event_cat); return -1; } } /* SAHPI_EC_GENERIC - SAHPI_ES_STATE_06 testcase */ { expected_cat = SAHPI_EC_GENERIC; expected_state = SAHPI_ES_STATE_06; expected_str = "STATE_06"; err = oh_decode_eventstate(SAHPI_ES_STATE_06, SAHPI_EC_GENERIC, &buffer); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (strcmp(expected_str, (char *)buffer.Data)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", buffer.Data); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_encode_eventstate(&buffer, &event_state, &event_cat); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if ((expected_state != event_state) || !((SAHPI_EC_GENERIC == event_cat) || (SAHPI_EC_SENSOR_SPECIFIC == event_cat))) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received state=%x; Received cat=%x\n", event_state, event_cat); return -1; } } /* SAHPI_EC_GENERIC - SAHPI_ES_STATE_07 testcase */ { expected_cat = SAHPI_EC_GENERIC; expected_state = SAHPI_ES_STATE_07; expected_str = "STATE_07"; err = oh_decode_eventstate(SAHPI_ES_STATE_07, SAHPI_EC_GENERIC, &buffer); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (strcmp(expected_str, (char *)buffer.Data)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", buffer.Data); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_encode_eventstate(&buffer, &event_state, &event_cat); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if ((expected_state != event_state) || !((SAHPI_EC_GENERIC == event_cat) || (SAHPI_EC_SENSOR_SPECIFIC == event_cat))) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received state=%x; Received cat=%x\n", event_state, event_cat); return -1; } } /* SAHPI_EC_GENERIC - SAHPI_ES_STATE_08 testcase */ { expected_cat = SAHPI_EC_GENERIC; expected_state = SAHPI_ES_STATE_08; expected_str = "STATE_08"; err = oh_decode_eventstate(SAHPI_ES_STATE_08, SAHPI_EC_GENERIC, &buffer); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (strcmp(expected_str, (char *)buffer.Data)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", buffer.Data); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_encode_eventstate(&buffer, &event_state, &event_cat); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if ((expected_state != event_state) || !((SAHPI_EC_GENERIC == event_cat) || (SAHPI_EC_SENSOR_SPECIFIC == event_cat))) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received state=%x; Received cat=%x\n", event_state, event_cat); return -1; } } /* SAHPI_EC_GENERIC - SAHPI_ES_STATE_09 testcase */ { expected_cat = SAHPI_EC_GENERIC; expected_state = SAHPI_ES_STATE_09; expected_str = "STATE_09"; err = oh_decode_eventstate(SAHPI_ES_STATE_09, SAHPI_EC_GENERIC, &buffer); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (strcmp(expected_str, (char *)buffer.Data)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", buffer.Data); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_encode_eventstate(&buffer, &event_state, &event_cat); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if ((expected_state != event_state) || !((SAHPI_EC_GENERIC == event_cat) || (SAHPI_EC_SENSOR_SPECIFIC == event_cat))) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received state=%x; Received cat=%x\n", event_state, event_cat); return -1; } } /* SAHPI_EC_GENERIC - SAHPI_ES_STATE_10 testcase */ { expected_cat = SAHPI_EC_GENERIC; expected_state = SAHPI_ES_STATE_10; expected_str = "STATE_10"; err = oh_decode_eventstate(SAHPI_ES_STATE_10, SAHPI_EC_GENERIC, &buffer); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (strcmp(expected_str, (char *)buffer.Data)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", buffer.Data); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_encode_eventstate(&buffer, &event_state, &event_cat); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if ((expected_state != event_state) || !((SAHPI_EC_GENERIC == event_cat) || (SAHPI_EC_SENSOR_SPECIFIC == event_cat))) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received state=%x; Received cat=%x\n", event_state, event_cat); return -1; } } /* SAHPI_EC_GENERIC - SAHPI_ES_STATE_11 testcase */ { expected_cat = SAHPI_EC_GENERIC; expected_state = SAHPI_ES_STATE_11; expected_str = "STATE_11"; err = oh_decode_eventstate(SAHPI_ES_STATE_11, SAHPI_EC_GENERIC, &buffer); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (strcmp(expected_str, (char *)buffer.Data)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", buffer.Data); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_encode_eventstate(&buffer, &event_state, &event_cat); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if ((expected_state != event_state) || !((SAHPI_EC_GENERIC == event_cat) || (SAHPI_EC_SENSOR_SPECIFIC == event_cat))) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received state=%x; Received cat=%x\n", event_state, event_cat); return -1; } } /* SAHPI_EC_GENERIC - SAHPI_ES_STATE_12 testcase */ { expected_cat = SAHPI_EC_GENERIC; expected_state = SAHPI_ES_STATE_12; expected_str = "STATE_12"; err = oh_decode_eventstate(SAHPI_ES_STATE_12, SAHPI_EC_GENERIC, &buffer); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (strcmp(expected_str, (char *)buffer.Data)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", buffer.Data); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_encode_eventstate(&buffer, &event_state, &event_cat); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if ((expected_state != event_state) || !((SAHPI_EC_GENERIC == event_cat) || (SAHPI_EC_SENSOR_SPECIFIC == event_cat))) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received state=%x; Received cat=%x\n", event_state, event_cat); return -1; } } /* SAHPI_EC_GENERIC - SAHPI_ES_STATE_13 testcase */ { expected_cat = SAHPI_EC_GENERIC; expected_state = SAHPI_ES_STATE_13; expected_str = "STATE_13"; err = oh_decode_eventstate(SAHPI_ES_STATE_13, SAHPI_EC_GENERIC, &buffer); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (strcmp(expected_str, (char *)buffer.Data)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", buffer.Data); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_encode_eventstate(&buffer, &event_state, &event_cat); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if ((expected_state != event_state) || !((SAHPI_EC_GENERIC == event_cat) || (SAHPI_EC_SENSOR_SPECIFIC == event_cat))) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received state=%x; Received cat=%x\n", event_state, event_cat); return -1; } } /* SAHPI_EC_GENERIC - SAHPI_ES_STATE_14 testcase */ { expected_cat = SAHPI_EC_GENERIC; expected_state = SAHPI_ES_STATE_14; expected_str = "STATE_14"; err = oh_decode_eventstate(SAHPI_ES_STATE_14, SAHPI_EC_GENERIC, &buffer); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (strcmp(expected_str, (char *)buffer.Data)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", buffer.Data); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_encode_eventstate(&buffer, &event_state, &event_cat); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if ((expected_state != event_state) || !((SAHPI_EC_GENERIC == event_cat) || (SAHPI_EC_SENSOR_SPECIFIC == event_cat))) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received state=%x; Received cat=%x\n", event_state, event_cat); return -1; } } /* SAHPI_EC_GENERIC - Bad event testcase */ { if (oh_valid_eventstate(BAD_EVENT, SAHPI_EC_GENERIC, SAHPI_FALSE)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); return -1; } } return 0; } openhpi-2.14.1/utils/t/sahpi/sahpiatca_enum_utils_test.c0000644000076400007640000012111411302567130020302 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * Steve Sherman */ /******************************************************************* * WARNING! This file is auto-magically generated by: * ./SaHpi2code.pl. * Do not change this file manually. Update script instead *******************************************************************/ #include #include #include #include #define BAD_ENUM_VALUE -1 int main(int argc, char **argv) { char *expected_str; char *str; /* AtcaHpiLedColorT - ATCAHPI_LED_COLOR_RESERVED testcase */ { AtcaHpiLedColorT value = ATCAHPI_LED_COLOR_RESERVED; AtcaHpiLedColorT enum_type; expected_str = "COLOR_RESERVED"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_atcahpiledcolor(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_atcahpiledcolor(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (ATCAHPI_LED_COLOR_RESERVED != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* AtcaHpiLedColorT - ATCAHPI_LED_COLOR_BLUE testcase */ { AtcaHpiLedColorT value = ATCAHPI_LED_COLOR_BLUE; AtcaHpiLedColorT enum_type; expected_str = "COLOR_BLUE"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_atcahpiledcolor(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_atcahpiledcolor(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (ATCAHPI_LED_COLOR_BLUE != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* AtcaHpiLedColorT - ATCAHPI_LED_COLOR_RED testcase */ { AtcaHpiLedColorT value = ATCAHPI_LED_COLOR_RED; AtcaHpiLedColorT enum_type; expected_str = "COLOR_RED"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_atcahpiledcolor(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_atcahpiledcolor(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (ATCAHPI_LED_COLOR_RED != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* AtcaHpiLedColorT - ATCAHPI_LED_COLOR_GREEN testcase */ { AtcaHpiLedColorT value = ATCAHPI_LED_COLOR_GREEN; AtcaHpiLedColorT enum_type; expected_str = "COLOR_GREEN"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_atcahpiledcolor(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_atcahpiledcolor(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (ATCAHPI_LED_COLOR_GREEN != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* AtcaHpiLedColorT - ATCAHPI_LED_COLOR_AMBER testcase */ { AtcaHpiLedColorT value = ATCAHPI_LED_COLOR_AMBER; AtcaHpiLedColorT enum_type; expected_str = "COLOR_AMBER"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_atcahpiledcolor(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_atcahpiledcolor(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (ATCAHPI_LED_COLOR_AMBER != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* AtcaHpiLedColorT - ATCAHPI_LED_COLOR_ORANGE testcase */ { AtcaHpiLedColorT value = ATCAHPI_LED_COLOR_ORANGE; AtcaHpiLedColorT enum_type; expected_str = "COLOR_ORANGE"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_atcahpiledcolor(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_atcahpiledcolor(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (ATCAHPI_LED_COLOR_ORANGE != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* AtcaHpiLedColorT - ATCAHPI_LED_COLOR_WHITE testcase */ { AtcaHpiLedColorT value = ATCAHPI_LED_COLOR_WHITE; AtcaHpiLedColorT enum_type; expected_str = "COLOR_WHITE"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_atcahpiledcolor(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_atcahpiledcolor(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (ATCAHPI_LED_COLOR_WHITE != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* AtcaHpiLedColorT - ATCAHPI_LED_COLOR_NO_CHANGE testcase */ { AtcaHpiLedColorT value = ATCAHPI_LED_COLOR_NO_CHANGE; AtcaHpiLedColorT enum_type; expected_str = "COLOR_NO_CHANGE"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_atcahpiledcolor(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_atcahpiledcolor(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (ATCAHPI_LED_COLOR_NO_CHANGE != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* AtcaHpiLedColorT - ATCAHPI_LED_COLOR_USE_DEFAULT testcase */ { AtcaHpiLedColorT value = ATCAHPI_LED_COLOR_USE_DEFAULT; AtcaHpiLedColorT enum_type; expected_str = "COLOR_USE_DEFAULT"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_atcahpiledcolor(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_atcahpiledcolor(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (ATCAHPI_LED_COLOR_USE_DEFAULT != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* AtcaHpiLedColorT - Default testcase */ { AtcaHpiLedColorT value = BAD_ENUM_VALUE; expected_str = NULL; str = oh_lookup_atcahpiledcolor(value); if (str != expected_str) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s; Expected string=%s\n", str, expected_str); return -1; } } { /* AtcaHpiLedColorT - NULL buffer testcase */ SaErrorT err, expected_err; SaHpiTextBufferT buffer; AtcaHpiLedColorT enum_type; expected_err = SA_ERR_HPI_INVALID_PARAMS; err = oh_encode_atcahpiledcolor(0, &enum_type); if (err != expected_err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d; Expected error=%d\n", err, expected_err); return -1; } /* AtcaHpiLedColorT - Invalid type testcase */ err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, "INVALID_TYPE"); expected_err = SA_ERR_HPI_INVALID_DATA; err = oh_encode_atcahpiledcolor(&buffer, &enum_type); if (err != expected_err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d; Expected error=%d\n", err, expected_err); return -1; } } /* AtcaHpiResourceLedModeT - ATCAHPI_LED_AUTO testcase */ { AtcaHpiResourceLedModeT value = ATCAHPI_LED_AUTO; AtcaHpiResourceLedModeT enum_type; expected_str = "AUTO"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_atcahpiresourceledmode(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_atcahpiresourceledmode(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (ATCAHPI_LED_AUTO != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* AtcaHpiResourceLedModeT - ATCAHPI_LED_MANUAL testcase */ { AtcaHpiResourceLedModeT value = ATCAHPI_LED_MANUAL; AtcaHpiResourceLedModeT enum_type; expected_str = "MANUAL"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_atcahpiresourceledmode(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_atcahpiresourceledmode(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (ATCAHPI_LED_MANUAL != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* AtcaHpiResourceLedModeT - ATCAHPI_LED_LAMP_TEST testcase */ { AtcaHpiResourceLedModeT value = ATCAHPI_LED_LAMP_TEST; AtcaHpiResourceLedModeT enum_type; expected_str = "LAMP_TEST"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_atcahpiresourceledmode(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_atcahpiresourceledmode(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (ATCAHPI_LED_LAMP_TEST != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* AtcaHpiResourceLedModeT - Default testcase */ { AtcaHpiResourceLedModeT value = BAD_ENUM_VALUE; expected_str = NULL; str = oh_lookup_atcahpiresourceledmode(value); if (str != expected_str) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s; Expected string=%s\n", str, expected_str); return -1; } } { /* AtcaHpiResourceLedModeT - NULL buffer testcase */ SaErrorT err, expected_err; SaHpiTextBufferT buffer; AtcaHpiResourceLedModeT enum_type; expected_err = SA_ERR_HPI_INVALID_PARAMS; err = oh_encode_atcahpiresourceledmode(0, &enum_type); if (err != expected_err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d; Expected error=%d\n", err, expected_err); return -1; } /* AtcaHpiResourceLedModeT - Invalid type testcase */ err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, "INVALID_TYPE"); expected_err = SA_ERR_HPI_INVALID_DATA; err = oh_encode_atcahpiresourceledmode(&buffer, &enum_type); if (err != expected_err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d; Expected error=%d\n", err, expected_err); return -1; } } /* AtcaHpiLedBrSupportT - ATCAHPI_LED_BR_SUPPORTED testcase */ { AtcaHpiLedBrSupportT value = ATCAHPI_LED_BR_SUPPORTED; AtcaHpiLedBrSupportT enum_type; expected_str = "BR_SUPPORTED"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_atcahpiledbrsupport(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_atcahpiledbrsupport(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (ATCAHPI_LED_BR_SUPPORTED != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* AtcaHpiLedBrSupportT - ATCAHPI_LED_BR_NOT_SUPPORTED testcase */ { AtcaHpiLedBrSupportT value = ATCAHPI_LED_BR_NOT_SUPPORTED; AtcaHpiLedBrSupportT enum_type; expected_str = "BR_NOT_SUPPORTED"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_atcahpiledbrsupport(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_atcahpiledbrsupport(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (ATCAHPI_LED_BR_NOT_SUPPORTED != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* AtcaHpiLedBrSupportT - ATCAHPI_LED_BR_UNKNOWN testcase */ { AtcaHpiLedBrSupportT value = ATCAHPI_LED_BR_UNKNOWN; AtcaHpiLedBrSupportT enum_type; expected_str = "BR_UNKNOWN"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_atcahpiledbrsupport(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_atcahpiledbrsupport(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (ATCAHPI_LED_BR_UNKNOWN != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* AtcaHpiLedBrSupportT - Default testcase */ { AtcaHpiLedBrSupportT value = BAD_ENUM_VALUE; expected_str = NULL; str = oh_lookup_atcahpiledbrsupport(value); if (str != expected_str) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s; Expected string=%s\n", str, expected_str); return -1; } } { /* AtcaHpiLedBrSupportT - NULL buffer testcase */ SaErrorT err, expected_err; SaHpiTextBufferT buffer; AtcaHpiLedBrSupportT enum_type; expected_err = SA_ERR_HPI_INVALID_PARAMS; err = oh_encode_atcahpiledbrsupport(0, &enum_type); if (err != expected_err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d; Expected error=%d\n", err, expected_err); return -1; } /* AtcaHpiLedBrSupportT - Invalid type testcase */ err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, "INVALID_TYPE"); expected_err = SA_ERR_HPI_INVALID_DATA; err = oh_encode_atcahpiledbrsupport(&buffer, &enum_type); if (err != expected_err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d; Expected error=%d\n", err, expected_err); return -1; } } /* AtcaHpiEntityTypeT - ATCAHPI_ENT_POWER_ENTRY_MODULE_SLOT testcase */ { AtcaHpiEntityTypeT value = ATCAHPI_ENT_POWER_ENTRY_MODULE_SLOT; AtcaHpiEntityTypeT enum_type; expected_str = "POWER_ENTRY_MODULE_SLOT"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_atcahpientitytype(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_atcahpientitytype(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (ATCAHPI_ENT_POWER_ENTRY_MODULE_SLOT != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* AtcaHpiEntityTypeT - ATCAHPI_ENT_SHELF_FRU_DEVICE_SLOT testcase */ { AtcaHpiEntityTypeT value = ATCAHPI_ENT_SHELF_FRU_DEVICE_SLOT; AtcaHpiEntityTypeT enum_type; expected_str = "SHELF_FRU_DEVICE_SLOT"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_atcahpientitytype(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_atcahpientitytype(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (ATCAHPI_ENT_SHELF_FRU_DEVICE_SLOT != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* AtcaHpiEntityTypeT - ATCAHPI_ENT_SHELF_MANAGER_SLOT testcase */ { AtcaHpiEntityTypeT value = ATCAHPI_ENT_SHELF_MANAGER_SLOT; AtcaHpiEntityTypeT enum_type; expected_str = "SHELF_MANAGER_SLOT"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_atcahpientitytype(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_atcahpientitytype(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (ATCAHPI_ENT_SHELF_MANAGER_SLOT != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* AtcaHpiEntityTypeT - ATCAHPI_ENT_FAN_TRAY_SLOT testcase */ { AtcaHpiEntityTypeT value = ATCAHPI_ENT_FAN_TRAY_SLOT; AtcaHpiEntityTypeT enum_type; expected_str = "FAN_TRAY_SLOT"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_atcahpientitytype(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_atcahpientitytype(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (ATCAHPI_ENT_FAN_TRAY_SLOT != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* AtcaHpiEntityTypeT - ATCAHPI_ENT_FAN_FILTER_TRAY_SLOT testcase */ { AtcaHpiEntityTypeT value = ATCAHPI_ENT_FAN_FILTER_TRAY_SLOT; AtcaHpiEntityTypeT enum_type; expected_str = "FAN_FILTER_TRAY_SLOT"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_atcahpientitytype(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_atcahpientitytype(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (ATCAHPI_ENT_FAN_FILTER_TRAY_SLOT != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* AtcaHpiEntityTypeT - ATCAHPI_ENT_ALARM_SLOT testcase */ { AtcaHpiEntityTypeT value = ATCAHPI_ENT_ALARM_SLOT; AtcaHpiEntityTypeT enum_type; expected_str = "ALARM_SLOT"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_atcahpientitytype(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_atcahpientitytype(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (ATCAHPI_ENT_ALARM_SLOT != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* AtcaHpiEntityTypeT - ATCAHPI_ENT_AMC_SLOT testcase */ { AtcaHpiEntityTypeT value = ATCAHPI_ENT_AMC_SLOT; AtcaHpiEntityTypeT enum_type; expected_str = "AMC_SLOT"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_atcahpientitytype(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_atcahpientitytype(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (ATCAHPI_ENT_AMC_SLOT != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* AtcaHpiEntityTypeT - ATCAHPI_ENT_PMC_SLOT testcase */ { AtcaHpiEntityTypeT value = ATCAHPI_ENT_PMC_SLOT; AtcaHpiEntityTypeT enum_type; expected_str = "PMC_SLOT"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_atcahpientitytype(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_atcahpientitytype(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (ATCAHPI_ENT_PMC_SLOT != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* AtcaHpiEntityTypeT - ATCAHPI_ENT_RTM_SLOT testcase */ { AtcaHpiEntityTypeT value = ATCAHPI_ENT_RTM_SLOT; AtcaHpiEntityTypeT enum_type; expected_str = "RTM_SLOT"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_atcahpientitytype(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_atcahpientitytype(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (ATCAHPI_ENT_RTM_SLOT != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* AtcaHpiEntityTypeT - ATCAHPI_ENT_PICMG_FRONT_BLADE testcase */ { AtcaHpiEntityTypeT value = ATCAHPI_ENT_PICMG_FRONT_BLADE; AtcaHpiEntityTypeT enum_type; expected_str = "PICMG_FRONT_BLADE"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_atcahpientitytype(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_atcahpientitytype(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (ATCAHPI_ENT_PICMG_FRONT_BLADE != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* AtcaHpiEntityTypeT - ATCAHPI_ENT_SHELF_FRU_DEVICE testcase */ { AtcaHpiEntityTypeT value = ATCAHPI_ENT_SHELF_FRU_DEVICE; AtcaHpiEntityTypeT enum_type; expected_str = "SHELF_FRU_DEVICE"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_atcahpientitytype(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_atcahpientitytype(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (ATCAHPI_ENT_SHELF_FRU_DEVICE != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* AtcaHpiEntityTypeT - ATCAHPI_ENT_FILTRATION_UNIT testcase */ { AtcaHpiEntityTypeT value = ATCAHPI_ENT_FILTRATION_UNIT; AtcaHpiEntityTypeT enum_type; expected_str = "FILTRATION_UNIT"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_atcahpientitytype(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_atcahpientitytype(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (ATCAHPI_ENT_FILTRATION_UNIT != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* AtcaHpiEntityTypeT - ATCAHPI_ENT_AMC testcase */ { AtcaHpiEntityTypeT value = ATCAHPI_ENT_AMC; AtcaHpiEntityTypeT enum_type; expected_str = "AMC"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_atcahpientitytype(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_atcahpientitytype(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (ATCAHPI_ENT_AMC != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* AtcaHpiEntityTypeT - Default testcase */ { AtcaHpiEntityTypeT value = BAD_ENUM_VALUE; expected_str = NULL; str = oh_lookup_atcahpientitytype(value); if (str != expected_str) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s; Expected string=%s\n", str, expected_str); return -1; } } { /* AtcaHpiEntityTypeT - NULL buffer testcase */ SaErrorT err, expected_err; SaHpiTextBufferT buffer; AtcaHpiEntityTypeT enum_type; expected_err = SA_ERR_HPI_INVALID_PARAMS; err = oh_encode_atcahpientitytype(0, &enum_type); if (err != expected_err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d; Expected error=%d\n", err, expected_err); return -1; } /* AtcaHpiEntityTypeT - Invalid type testcase */ err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, "INVALID_TYPE"); expected_err = SA_ERR_HPI_INVALID_DATA; err = oh_encode_atcahpientitytype(&buffer, &enum_type); if (err != expected_err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d; Expected error=%d\n", err, expected_err); return -1; } } return 0; } openhpi-2.14.1/utils/t/sahpi/sahpi_struct_utils_test.c0000644000076400007640000022267311302567130020045 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004, 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * Steve Sherman */ #include #include #include #include #include #define UNDEFINED_MANUFACTURER -1 #define BAD_TYPE -1 int main(int argc, char **argv) { const char *expected_str; const char *str; SaErrorT expected_err, err; SaHpiTextBufferT buffer, bad_buffer; /************************************ * oh_decode_manufacturerid testcases ************************************/ { /* oh_decode_manufacturerid: SAHPI_MANUFACTURER_ID_UNSPECIFIED testcase */ SaHpiManufacturerIdT mid; expected_str = "Unspecified"; mid = SAHPI_MANUFACTURER_ID_UNSPECIFIED; err = oh_decode_manufacturerid(mid, &buffer); if (strcmp(expected_str, (char *)buffer.Data) || err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s; Expected string=%s; Error=%d\n", buffer.Data, expected_str, err); return -1; } /* oh_decode_manufacturerid: IBM testcase */ expected_str = "IBM"; mid = 20944; err = oh_decode_manufacturerid(mid, &buffer); if (strcmp(expected_str, (char *)buffer.Data) || err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s; Expected string=%s; Error=%d\n", buffer.Data, expected_str, err); return -1; } /* oh_decode_manufacturerid: Undefined manufacturer testcase */ expected_str = "Unknown"; mid = UNDEFINED_MANUFACTURER; err = oh_decode_manufacturerid(mid, &buffer); if (strcmp(expected_str, (char *)buffer.Data) || err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s; Expected string=%s; Error=%d\n", buffer.Data, expected_str, err); return -1; } /* oh_decode_manufacturerid: NULL buffer testcase */ expected_err = SA_ERR_HPI_INVALID_PARAMS; mid = UNDEFINED_MANUFACTURER; err = oh_decode_manufacturerid(mid, 0); if (err != expected_err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d; Expected error=%d\n", err, expected_err); return -1; } } /*********************************************************** * oh_decode_sensorreading/oh_encode_sensorreading testcases ***********************************************************/ { SaHpiSensorDataFormatT format_default, format_test; SaHpiSensorReadingT reading_default, reading_test, encode_reading; memset(&format_default, 0, sizeof(SaHpiSensorDataFormatT)); memset(&reading_default, 0, sizeof(SaHpiSensorReadingT)); reading_default.IsSupported = SAHPI_TRUE; reading_default.Type = SAHPI_SENSOR_READING_TYPE_INT64; reading_default.Value.SensorInt64 = 20; format_default.IsSupported = SAHPI_TRUE; format_default.ReadingType = SAHPI_SENSOR_READING_TYPE_INT64; format_default.BaseUnits = SAHPI_SU_VOLTS; format_default.ModifierUnits = SAHPI_SU_UNSPECIFIED; format_default.ModifierUse = SAHPI_SMUU_NONE; format_default.Percentage = SAHPI_FALSE; /* oh_decode_sensorreading: NULL buffer testcase */ expected_err = SA_ERR_HPI_INVALID_PARAMS; err = oh_decode_sensorreading(reading_default, format_default, 0); if (err != expected_err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d; Expected error=%d\n", err, expected_err); return -1; } /* oh_decode_sensorreading: IsSupported == FALSE testcase */ expected_err = SA_ERR_HPI_INVALID_CMD; reading_test = reading_default; format_test = format_default; format_test.IsSupported = SAHPI_FALSE; err = oh_decode_sensorreading(reading_test, format_test, &buffer); if (err != expected_err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d; Expected error=%d\n", err, expected_err); return -1; } /* oh_decode_sensorreading: Bad SaHpiSensorModifierUseT testcase */ expected_err = SA_ERR_HPI_INVALID_PARAMS; reading_test = reading_default; format_test = format_default; format_test.ModifierUnits = SAHPI_SU_WEEK; format_test.ModifierUse = BAD_TYPE; err = oh_decode_sensorreading(reading_test, format_test, &buffer); if (err != expected_err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d; Expected error=%d\n", err, expected_err); return -1; } /* oh_decode_sensorreading: Bad SaHpiSensorReadingT testcase */ expected_err = SA_ERR_HPI_INVALID_PARAMS; reading_test = reading_default; reading_test.Type = BAD_TYPE; format_test = format_default; format_test.ReadingType = BAD_TYPE; err = oh_decode_sensorreading(reading_test, format_test, &buffer); if (err != expected_err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d; Expected error=%d\n", err, expected_err); return -1; } /* oh_decode_sensorreading: Reading Types not equal testcase */ expected_err = SA_ERR_HPI_INVALID_DATA; reading_test = reading_default; format_test = format_default; format_test.ReadingType = format_default.ReadingType + 1; err = oh_decode_sensorreading(reading_test, format_test, &buffer); if (err != expected_err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d; Expected error=%d\n", err, expected_err); return -1; } /* oh_decode_sensorreading: SAHPI_SENSOR_READING_TYPE_INT64 testcase */ expected_str = "20 Volts"; reading_test = reading_default; format_test = format_default; err = oh_decode_sensorreading(reading_test, format_test, &buffer); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (strcmp(expected_str, (char *)buffer.Data)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s; Expected string=%s\n", buffer.Data, expected_str); return -1; } memset(&encode_reading, 0, sizeof(SaHpiSensorReadingT)); err = oh_encode_sensorreading(&buffer, format_test.ReadingType, &encode_reading); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (memcmp((void *)&encode_reading, (void *)&reading_test, sizeof(SaHpiSensorReadingT))) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } /* oh_decode_sensorreading: SAHPI_SMUU_BASIC_OVER_MODIFIER testcase */ expected_str = "20 Volts / Week"; reading_test = reading_default; format_test = format_default; format_test.ModifierUnits = SAHPI_SU_WEEK; format_test.ModifierUse = SAHPI_SMUU_BASIC_OVER_MODIFIER; err = oh_decode_sensorreading(reading_test, format_test, &buffer); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (strcmp(expected_str, (char *)buffer.Data)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s; Expected string=%s\n", buffer.Data, expected_str); return -1; } err = oh_encode_sensorreading(&buffer, format_test.ReadingType, &encode_reading); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (memcmp((void *)&encode_reading, (void *)&reading_test, sizeof(SaHpiSensorReadingTypeT))) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } /* oh_decode_sensorreading: SAHPI_SMUU_BASIC_TIMES_MODIFIER testcase */ expected_str = "20 Volts * Week"; reading_test = reading_default; format_test = format_default; format_test.ModifierUnits = SAHPI_SU_WEEK; format_test.ModifierUse = SAHPI_SMUU_BASIC_TIMES_MODIFIER; err = oh_decode_sensorreading(reading_test, format_test, &buffer); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (strcmp(expected_str, (char *)buffer.Data)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s; Expected string=%s\n", buffer.Data, expected_str); return -1; } err = oh_encode_sensorreading(&buffer, format_test.ReadingType, &encode_reading); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (memcmp((void *)&encode_reading, (void *)&reading_test, sizeof(SaHpiSensorReadingTypeT))) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } /* oh_decode_sensorreading: Percentage testcase */ expected_str = "20%"; reading_test = reading_default; format_test = format_default; format_test.Percentage = SAHPI_TRUE; format_test.ModifierUnits = SAHPI_SU_WEEK; format_test.ModifierUse = SAHPI_SMUU_BASIC_TIMES_MODIFIER; err = oh_decode_sensorreading(reading_test, format_test, &buffer); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (strcmp(expected_str, (char *)buffer.Data)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s; Expected string=%s\n", buffer.Data, expected_str); return -1; } /* oh_decode_sensorreading: SAHPI_SENSOR_READING_TYPE_UINT64 testcase */ expected_str = "20 Volts"; reading_test = reading_default; reading_test.Type = SAHPI_SENSOR_READING_TYPE_UINT64; reading_test.Value.SensorUint64 = 20; format_test = format_default; format_test.ReadingType = SAHPI_SENSOR_READING_TYPE_UINT64; err = oh_decode_sensorreading(reading_test, format_test, &buffer); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (strcmp(expected_str, (char *)buffer.Data)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s; Expected string=%s\n", buffer.Data, expected_str); return -1; } err = oh_encode_sensorreading(&buffer, format_test.ReadingType, &encode_reading); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (memcmp((void *)&encode_reading, (void *)&reading_test, sizeof(SaHpiSensorReadingTypeT))) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } /* oh_decode_sensorreading: SAHPI_SENSOR_READING_TYPE_FLOAT64 testcase */ expected_str = "20.200 Volts"; reading_test = reading_default; reading_test.Type = SAHPI_SENSOR_READING_TYPE_FLOAT64; reading_test.Value.SensorFloat64 = 20.2; format_test = format_default; format_test.ReadingType = SAHPI_SENSOR_READING_TYPE_FLOAT64; err = oh_decode_sensorreading(reading_test, format_test, &buffer); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (strcmp(expected_str, (char *)buffer.Data)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s; Expected string=%s\n", buffer.Data, expected_str); return -1; } /* oh_decode_sensorreading: SAHPI_SENSOR_READING_TYPE_BUFFER testcase */ expected_str = "22222222222222222222222222222222 Volts"; reading_test = reading_default; reading_test.Type = SAHPI_SENSOR_READING_TYPE_BUFFER; memset(reading_test.Value.SensorBuffer, 0x32, SAHPI_SENSOR_BUFFER_LENGTH); format_test = format_default; format_test.ReadingType = SAHPI_SENSOR_READING_TYPE_BUFFER; err = oh_decode_sensorreading(reading_test, format_test, &buffer); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (strcmp(expected_str, (char *)buffer.Data)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s; Expected string=%s\n", buffer.Data, expected_str); return -1; } err = oh_encode_sensorreading(&buffer, format_test.ReadingType, &encode_reading); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (memcmp((void *)&encode_reading, (void *)&reading_test, sizeof(SaHpiSensorReadingTypeT))) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } } /*********************************** * oh_encode_sensorreading testcases ***********************************/ { const char *str; SaHpiTextBufferT buffer; SaHpiSensorReadingT reading; SaHpiInt64T expected_int64; /* SaHpiUint64T expected_uint64; */ SaHpiFloat64T expected_float64; /* oh_encode_sensorreading: Bad type testcase */ expected_err = SA_ERR_HPI_INVALID_PARAMS; err = oh_encode_sensorreading(&buffer, BAD_TYPE, &reading); if (err != expected_err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d; Expected error=%d\n", err, expected_err); return -1; } /* oh_encode_sensorreading: Skip characters before '=' sign testcase */ str = "+5Volt Sense 333=4"; expected_int64 = 4; oh_init_textbuffer(&buffer); oh_append_textbuffer(&buffer, str); err = oh_encode_sensorreading(&buffer, SAHPI_SENSOR_READING_TYPE_INT64, &reading); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (reading.Value.SensorInt64 != expected_int64) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received value=%lld; Expected value=%lld\n", reading.Value.SensorInt64, expected_int64); return -1; } /* oh_encode_sensorreading: Extra spaces testcase */ str = " + 20 Volts"; expected_int64 = 20; oh_init_textbuffer(&buffer); oh_append_textbuffer(&buffer, str); err = oh_encode_sensorreading(&buffer, SAHPI_SENSOR_READING_TYPE_INT64, &reading); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (reading.Value.SensorInt64 != expected_int64) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received value=%lld; Expected value=%lld\n", reading.Value.SensorInt64, expected_int64); return -1; } /* oh_encode_sensorreading: Extra non-digits/commas testcase */ str = "The, happy, %% result is ... +2,000Volts ,,... "; expected_int64 = 2000; oh_init_textbuffer(&buffer); oh_append_textbuffer(&buffer, str); err = oh_encode_sensorreading(&buffer, SAHPI_SENSOR_READING_TYPE_INT64, &reading); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (reading.Value.SensorInt64 != expected_int64) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received value=%lld; Expected value=%lld\n", reading.Value.SensorInt64, expected_int64); return -1; } /* oh_encode_sensorreading: No digits testcase */ str = "There are no numbers in this string"; oh_init_textbuffer(&buffer); oh_append_textbuffer(&buffer, str); err = oh_encode_sensorreading(&buffer, SAHPI_SENSOR_READING_TYPE_INT64, &reading); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (reading.Value.SensorInt64 != 0) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Expected Zero value; Received=%lld\n", reading.Value.SensorInt64); return -1; } /* oh_encode_sensorreading: Decimal point testcase */ str = "-2.5volts"; expected_float64 = -2.5; oh_init_textbuffer(&buffer); oh_append_textbuffer(&buffer, str); err = oh_encode_sensorreading(&buffer, SAHPI_SENSOR_READING_TYPE_FLOAT64, &reading); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (reading.Value.SensorFloat64 != expected_float64) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received value=%le; Expected value=%le\n", reading.Value.SensorFloat64, expected_float64); return -1; } /* oh_encode_sensorreading: Too many decimal points testcase */ str = "1.000.000 volts"; expected_err = SA_ERR_HPI_INVALID_DATA; oh_init_textbuffer(&buffer); oh_append_textbuffer(&buffer, str); err = oh_encode_sensorreading(&buffer, SAHPI_SENSOR_READING_TYPE_FLOAT64, &reading); if (err != expected_err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d; Expected error=%d\n", err, expected_err); return -1; } /* oh_encode_sensorreading: Too many signs */ str = "+-33e02"; expected_err = SA_ERR_HPI_INVALID_DATA; oh_init_textbuffer(&buffer); oh_append_textbuffer(&buffer, str); err = oh_encode_sensorreading(&buffer, SAHPI_SENSOR_READING_TYPE_INT64, &reading); if (err != expected_err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d; Expected error=%d\n", err, expected_err); return -1; } /* oh_encode_sensorreading: Percentage testcase */ str = "33% RPM"; expected_float64 = 33; oh_init_textbuffer(&buffer); oh_append_textbuffer(&buffer, str); err = oh_encode_sensorreading(&buffer, SAHPI_SENSOR_READING_TYPE_FLOAT64, &reading); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (reading.Value.SensorFloat64 != expected_float64) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received value=%le; Expected value=%le\n", reading.Value.SensorFloat64, expected_float64); return -1; } /* oh_encode_sensorreading: Too big int64 testcase */ str = "99999999999999999999999999999999"; expected_err = SA_ERR_HPI_INVALID_DATA; oh_init_textbuffer(&buffer); oh_append_textbuffer(&buffer, str); err = oh_encode_sensorreading(&buffer, SAHPI_SENSOR_READING_TYPE_INT64, &reading); if (err != expected_err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d; Expected error=%d\n", err, expected_err); return -1; } /* oh_encode_sensorreading: Too big uint64 testcase */ str = "99999999999999999999999999999999"; expected_err = SA_ERR_HPI_INVALID_DATA; oh_init_textbuffer(&buffer); oh_append_textbuffer(&buffer, str); err = oh_encode_sensorreading(&buffer, SAHPI_SENSOR_READING_TYPE_UINT64, &reading); if (err != expected_err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d; Expected error=%d\n", err, expected_err); return -1; } #if 0 /* oh_encode_sensorreading: Too big float64 testcase */ str = "99999999999999999999999999999999"; expected_err = SA_ERR_HPI_INVALID_DATA; oh_init_textbuffer(&buffer); oh_append_textbuffer(&buffer, str); err = oh_encode_sensorreading(&buffer, SAHPI_SENSOR_READING_TYPE_FLOAT64, &reading); if (err != expected_err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d; Expected error=%d\n", err, expected_err); return -1; } #endif } /***************************** * oh_xxx_textbuffer testcases *****************************/ { char str[4] = "1234"; /* oh_init_textbuffer: NULL buffer testcase */ expected_err = SA_ERR_HPI_INVALID_PARAMS; err = oh_init_textbuffer(0); if (err != expected_err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d; Expected error=%d\n", err, expected_err); return -1; } /* oh_append_textbuffer: NULL buffer testcase */ expected_err = SA_ERR_HPI_INVALID_PARAMS; err = oh_append_textbuffer(0, str); if (err != expected_err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d; Expected error=%d\n", err, expected_err); return -1; } /* oh_append_textbuffer: NULL str testcase */ expected_err = SA_ERR_HPI_INVALID_PARAMS; err = oh_append_textbuffer(&buffer, 0); if (err != expected_err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d; Expected error=%d\n", err, expected_err); return -1; } /* oh_append_textbuffer: Out of space testcase */ { char bigstr[SAHPI_MAX_TEXT_BUFFER_LENGTH +1]; expected_err = SA_ERR_HPI_OUT_OF_SPACE; memset(bigstr, 0x32, SAHPI_MAX_TEXT_BUFFER_LENGTH +1); err = oh_append_textbuffer(&buffer, bigstr); if (err != expected_err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d; Expected error=%d\n", err, expected_err); return -1; } } /* oh_copy_textbuffer: NULL buffer testcase */ expected_err = SA_ERR_HPI_INVALID_PARAMS; err = oh_copy_textbuffer(0, 0); if (err != expected_err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d; Expected error=%d\n", err, expected_err); return -1; } } /******************************************** * oh_fprint_text/oh_fprint_bigtext testcases ********************************************/ { str = "OK - Printing Line 1\nOK - Printing Line 2"; oh_big_textbuffer big_buffer, big_bad_buffer; /* Don't need this if expose the oh_xxx_bigtext routines */ big_buffer.DataType = SAHPI_TL_TYPE_TEXT; big_buffer.Language = SAHPI_LANG_ENGLISH; memset(big_buffer.Data, 0x32, SAHPI_MAX_TEXT_BUFFER_LENGTH + 2); big_buffer.Data[SAHPI_MAX_TEXT_BUFFER_LENGTH + 2] = 0x00; big_buffer.Data[SAHPI_MAX_TEXT_BUFFER_LENGTH + 1] = 0x33; big_bad_buffer = big_buffer; err = oh_init_textbuffer(&buffer); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } err = oh_append_textbuffer(&buffer, str); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } /* oh_fprint_text: oh_print_text MACRO testcase */ err = oh_print_text(&buffer); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } err = oh_print_bigtext(&big_buffer); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } /* Bad data type testcase */ expected_err = SA_ERR_HPI_INVALID_DATA; err = oh_copy_textbuffer(&bad_buffer, &buffer); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } bad_buffer.DataType = BAD_TYPE; err = oh_print_text(&bad_buffer); if (err != expected_err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d; Expected error=%d\n", err, expected_err); return -1; } big_bad_buffer.DataType = BAD_TYPE; err = oh_print_bigtext(&big_bad_buffer); if (err != expected_err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d; Expected error=%d\n", err, expected_err); return -1; } #if 0 /* FIXME :: ??? Is there a way to force a bad FILE ID, without blowing up??? */ /* Bad file handler testcase */ expected_err = SA_ERR_HPI_INVALID_PARAMS; err = oh_fprint_text(0, &buffer); if (err != expected_err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d; Expected error=%d\n", err, expected_err); return -1; } err = oh_fprint_bigtext(0, &big_buffer); if (err != expected_err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d; Expected error=%d\n", err, expected_err); return -1; } #endif /* Normal write to file testcase */ { FILE *fp, *big_fp; const char *name = "tmp"; const char *big_name = "tmpbig"; const char *mode = "a"; fp = fopen(name, mode); if (fp == NULL) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); return -1; } err = oh_fprint_text(fp, &buffer); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } big_fp = fopen(big_name, mode); if (big_fp == NULL) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); return -1; } err = oh_fprint_bigtext(big_fp, &big_buffer); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } fclose(fp); fclose(big_fp); unlink(name); unlink(big_name); } } /****************************** * oh_print_sensorrec testcases ******************************/ { SaHpiSensorRecT sensor, default_sensor; memset(&sensor, 0, sizeof(SaHpiSensorRecT)); memset(&default_sensor, 0, sizeof(SaHpiSensorRecT)); sensor.Num = 1; sensor.Type = SAHPI_VOLTAGE; sensor.Category = SAHPI_EC_THRESHOLD; sensor.Events = SAHPI_ES_LOWER_MAJOR | SAHPI_ES_LOWER_MINOR; sensor.EventCtrl = SAHPI_SEC_READ_ONLY; sensor.DataFormat.IsSupported = SAHPI_TRUE; sensor.DataFormat.ReadingType = SAHPI_SENSOR_READING_TYPE_INT64; sensor.DataFormat.BaseUnits = SAHPI_SU_VOLTS; sensor.DataFormat.ModifierUnits = SAHPI_SU_SECOND; sensor.DataFormat.ModifierUse = SAHPI_SMUU_BASIC_TIMES_MODIFIER; sensor.DataFormat.Percentage = SAHPI_FALSE; sensor.DataFormat.Range.Flags = SAHPI_SRF_MIN | SAHPI_SRF_MAX | SAHPI_SRF_NOMINAL | SAHPI_SRF_NORMAL_MIN | SAHPI_SRF_NORMAL_MAX; sensor.DataFormat.Range.Min.IsSupported = SAHPI_TRUE; sensor.DataFormat.Range.Min.Type = SAHPI_SENSOR_READING_TYPE_INT64; sensor.DataFormat.Range.Min.Value.SensorInt64 = 0; sensor.DataFormat.Range.Max.IsSupported = SAHPI_TRUE; sensor.DataFormat.Range.Max.Type = SAHPI_SENSOR_READING_TYPE_INT64; sensor.DataFormat.Range.Max.Value.SensorInt64 = 100; sensor.DataFormat.Range.Nominal.IsSupported = SAHPI_TRUE; sensor.DataFormat.Range.Nominal.Type = SAHPI_SENSOR_READING_TYPE_INT64; sensor.DataFormat.Range.Nominal.Value.SensorInt64 = 50; sensor.DataFormat.Range.NormalMax.IsSupported = SAHPI_TRUE; sensor.DataFormat.Range.NormalMax.Type = SAHPI_SENSOR_READING_TYPE_INT64; sensor.DataFormat.Range.NormalMax.Value.SensorInt64 = 75; sensor.DataFormat.Range.NormalMin.IsSupported = SAHPI_TRUE; sensor.DataFormat.Range.NormalMin.Type = SAHPI_SENSOR_READING_TYPE_INT64; sensor.DataFormat.Range.NormalMin.Value.SensorInt64 = 25; sensor.DataFormat.AccuracyFactor = 0.05; sensor.Oem = 0xFF; sensor.ThresholdDefn.IsAccessible = SAHPI_TRUE; sensor.ThresholdDefn.ReadThold = SAHPI_STM_LOW_MINOR | SAHPI_STM_LOW_MAJOR | SAHPI_STM_LOW_CRIT | SAHPI_STM_LOW_HYSTERESIS; sensor.ThresholdDefn.WriteThold = SAHPI_STM_UP_MINOR | SAHPI_STM_UP_MAJOR | SAHPI_STM_UP_CRIT | SAHPI_STM_UP_HYSTERESIS; sensor.ThresholdDefn.Nonlinear = SAHPI_TRUE; /* oh_print_sensorrec: Bad parameter testcase */ expected_err = SA_ERR_HPI_INVALID_PARAMS; err = oh_print_sensorrec(0, 0); if (err != expected_err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d; Expected error=%d\n", err, expected_err); return -1; } /* oh_print_sensorrec: Default sensor testcase */ memset(&default_sensor, 0, sizeof(SaHpiSensorRecT)); err = oh_print_sensorrec(&default_sensor, 0); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } /* oh_print_sensorrec: Normal sensor testcase */ err = oh_print_sensorrec(&sensor, 0); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } } /******************************* * oh_print_textbuffer testcases *******************************/ { SaHpiTextBufferT textbuffer, default_textbuffer; textbuffer.DataType = SAHPI_TL_TYPE_TEXT; textbuffer.Language = SAHPI_LANG_ZULU; strcpy((char *)textbuffer.Data, "Test Data"); textbuffer.DataLength = strlen((char *)textbuffer.Data); /* oh_print_textbuffer: Bad parameter testcase */ expected_err = SA_ERR_HPI_INVALID_PARAMS; err = oh_print_textbuffer(0, 0); if (err != expected_err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d; Expected error=%d\n", err, expected_err); return -1; } /* oh_print_textbuffer: Default textbuffer testcase */ printf("Default TextBuffer\n"); err = oh_print_textbuffer(&default_textbuffer, 1); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } /* oh_print_textbuffer: Normal textbuffer testcase */ printf("Normal TextBuffer\n"); err = oh_print_textbuffer(&textbuffer, 1); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } } /************************** * oh_print_event testcases **************************/ { SaHpiEventT sensor_event, default_event; memset(&sensor_event, 0, sizeof(SaHpiEventT)); memset(&default_event, 0, sizeof(SaHpiEventT)); sensor_event.Source = 1; sensor_event.EventType = SAHPI_ET_SENSOR; sensor_event.Severity = SAHPI_CRITICAL; sensor_event.EventDataUnion.SensorEvent.SensorNum = 2; sensor_event.EventDataUnion.SensorEvent.SensorType = SAHPI_VOLTAGE; sensor_event.EventDataUnion.SensorEvent.EventCategory = SAHPI_EC_THRESHOLD; sensor_event.EventDataUnion.SensorEvent.Assertion = SAHPI_TRUE; sensor_event.EventDataUnion.SensorEvent.EventState = SAHPI_ES_LOWER_MINOR; sensor_event.EventDataUnion.SensorEvent.OptionalDataPresent = sensor_event.EventDataUnion.SensorEvent.OptionalDataPresent | SAHPI_SOD_TRIGGER_READING | SAHPI_SOD_TRIGGER_THRESHOLD | SAHPI_SOD_PREVIOUS_STATE | SAHPI_SOD_CURRENT_STATE | SAHPI_SOD_OEM | SAHPI_SOD_SENSOR_SPECIFIC; sensor_event.EventDataUnion.SensorEvent.TriggerReading.IsSupported = SAHPI_TRUE; sensor_event.EventDataUnion.SensorEvent.TriggerReading.Type = SAHPI_SENSOR_READING_TYPE_INT64; sensor_event.EventDataUnion.SensorEvent.TriggerReading.Value.SensorInt64 = 100; sensor_event.EventDataUnion.SensorEvent.TriggerThreshold.IsSupported = SAHPI_TRUE; sensor_event.EventDataUnion.SensorEvent.TriggerThreshold.Type = SAHPI_SENSOR_READING_TYPE_INT64; sensor_event.EventDataUnion.SensorEvent.TriggerThreshold.Value.SensorInt64 = 101; sensor_event.EventDataUnion.SensorEvent.PreviousState = SAHPI_ES_LOWER_MINOR | SAHPI_ES_LOWER_MAJOR; sensor_event.EventDataUnion.SensorEvent.CurrentState = SAHPI_ES_LOWER_MINOR; sensor_event.EventDataUnion.SensorEvent.Oem = 32; sensor_event.EventDataUnion.SensorEvent.SensorSpecific = 33; /* oh_print_event: Bad parameter testcase */ expected_err = SA_ERR_HPI_INVALID_PARAMS; err = oh_print_event(0, NULL, 0); if (err != expected_err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d; Expected error=%d\n", err, expected_err); return -1; } /* oh_print_event: Default event testcase */ printf("Default Event\n"); err = oh_print_event(&default_event, NULL, 1); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } /* oh_print_event: Normal sensor event testcase */ printf("Normal Sensor Event\n"); err = oh_print_event(&sensor_event, NULL, 1); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } /* oh_print_event: Normal sensor event - no optional sensor data testcase */ printf("Normal Sensor Event - no optional sensor data\n"); sensor_event.EventDataUnion.SensorEvent.OptionalDataPresent = 0; err = oh_print_event(&sensor_event, NULL, 1); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } /***************** * Resource events *****************/ { SaHpiEventT default_resource_event; memset(&default_resource_event, 0, sizeof(SaHpiEventT)); default_resource_event.Source = 1; default_resource_event.EventType = SAHPI_ET_RESOURCE; default_resource_event.Severity = SAHPI_CRITICAL; /* oh_print_event: Zero resource event testcase */ printf("Default Resource Event - no data\n"); err = oh_print_event(&default_resource_event, NULL, 1); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } /* oh_print_event: Normal resource event testcase */ default_resource_event.EventDataUnion.ResourceEvent.ResourceEventType = SAHPI_RESE_RESOURCE_RESTORED; printf("Normal Resource Event\n"); err = oh_print_event(&default_resource_event, NULL, 1); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } } /*************** * Domain events ***************/ { SaHpiEventT default_domain_event; memset(&default_domain_event, 0, sizeof(SaHpiEventT)); default_domain_event.Source = 1; default_domain_event.EventType = SAHPI_ET_DOMAIN; default_domain_event.Severity = SAHPI_CRITICAL; /* oh_print_event: Zero domain event testcase */ printf("Default Domain Event - no data\n"); err = oh_print_event(&default_domain_event, NULL, 1); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } /* oh_print_event: Normal domain event testcase */ default_domain_event.EventDataUnion.DomainEvent.Type = SAHPI_DOMAIN_REF_ADDED; default_domain_event.EventDataUnion.DomainEvent.DomainId = 1; printf("Normal Domain Event\n"); err = oh_print_event(&default_domain_event, NULL, 1); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } } /***************************** * Sensor Enable Change events *****************************/ { SaHpiEventT default_sensor_enable_event; memset(&default_sensor_enable_event, 0, sizeof(SaHpiEventT)); default_sensor_enable_event.Source = 1; default_sensor_enable_event.EventType = SAHPI_ET_SENSOR_ENABLE_CHANGE; default_sensor_enable_event.Severity = SAHPI_CRITICAL; /* oh_print_event: Zero sensor enable event testcase */ printf("Default Sensor Enable Event - no data\n"); err = oh_print_event(&default_sensor_enable_event, NULL, 1); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } /* oh_print_event: Normal sensor enable event testcase */ default_sensor_enable_event.EventDataUnion.SensorEnableChangeEvent.SensorNum = 1; default_sensor_enable_event.EventDataUnion.SensorEnableChangeEvent.SensorType = SAHPI_FAN; default_sensor_enable_event.EventDataUnion.SensorEnableChangeEvent.EventCategory = SAHPI_EC_THRESHOLD; default_sensor_enable_event.EventDataUnion.SensorEnableChangeEvent.SensorEnable = SAHPI_TRUE; default_sensor_enable_event.EventDataUnion.SensorEnableChangeEvent.SensorEventEnable = SAHPI_TRUE; default_sensor_enable_event.EventDataUnion.SensorEnableChangeEvent.AssertEventMask = SAHPI_ES_UPPER_CRIT | SAHPI_ES_UPPER_MAJOR | SAHPI_ES_UPPER_MINOR; default_sensor_enable_event.EventDataUnion.SensorEnableChangeEvent.DeassertEventMask = SAHPI_ES_UPPER_CRIT | SAHPI_ES_UPPER_MAJOR | SAHPI_ES_UPPER_MINOR; default_sensor_enable_event.EventDataUnion.SensorEnableChangeEvent.OptionalDataPresent = SAHPI_SEOD_CURRENT_STATE; default_sensor_enable_event.EventDataUnion.SensorEnableChangeEvent.CurrentState = SAHPI_ES_LOWER_MINOR; printf("Normal sensor enable Event\n"); err = oh_print_event(&default_sensor_enable_event, NULL, 1); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } } /**************** * Hotswap events ****************/ { SaHpiEventT default_hotswap_event; memset(&default_hotswap_event, 0, sizeof(SaHpiEventT)); default_hotswap_event.Source = 1; default_hotswap_event.EventType = SAHPI_ET_HOTSWAP; default_hotswap_event.Severity = SAHPI_CRITICAL; /* oh_print_event: Zero hotswap event testcase */ printf("Default Hotswap Event - no data\n"); err = oh_print_event(&default_hotswap_event, NULL, 1); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } /* oh_print_event: Normal hotswap event testcase */ default_hotswap_event.EventDataUnion.HotSwapEvent.HotSwapState = SAHPI_HS_STATE_ACTIVE; default_hotswap_event.EventDataUnion.HotSwapEvent.PreviousHotSwapState = SAHPI_HS_STATE_INSERTION_PENDING; printf("Normal Hotswap Event\n"); err = oh_print_event(&default_hotswap_event, NULL, 1); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } } /***************** * Watchdog events *****************/ { SaHpiEventT default_watchdog_event; memset(&default_watchdog_event, 0, sizeof(SaHpiEventT)); default_watchdog_event.Source = 1; default_watchdog_event.EventType = SAHPI_ET_WATCHDOG; default_watchdog_event.Severity = SAHPI_CRITICAL; /* oh_print_event: Zero watchdog event testcase */ printf("Default Watchdog Event - no data\n"); err = oh_print_event(&default_watchdog_event, NULL, 1); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } /* oh_print_event: Normal watchdog event testcase */ default_watchdog_event.EventDataUnion.WatchdogEvent.WatchdogNum = 1; default_watchdog_event.EventDataUnion.WatchdogEvent.WatchdogAction = SAHPI_WAE_POWER_DOWN; default_watchdog_event.EventDataUnion.WatchdogEvent.WatchdogPreTimerAction = SAHPI_WPI_NMI; default_watchdog_event.EventDataUnion.WatchdogEvent.WatchdogUse = SAHPI_WTU_OEM; printf("Normal Watchdog Event\n"); err = oh_print_event(&default_watchdog_event, NULL, 1); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } } /*************** * HPI SW events ***************/ { SaHpiEventT default_hpisw_event; memset(&default_hpisw_event, 0, sizeof(SaHpiEventT)); default_hpisw_event.Source = 1; default_hpisw_event.EventType = SAHPI_ET_HPI_SW; default_hpisw_event.Severity = SAHPI_CRITICAL; /* oh_print_event: Zero HPI software event testcase */ printf("Default HPI Software Event - no data\n"); err = oh_print_event(&default_hpisw_event, NULL, 1); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } /* oh_print_event: Normal HPI software event testcase */ default_hpisw_event.EventDataUnion.HpiSwEvent.MId = 1; default_hpisw_event.EventDataUnion.HpiSwEvent.Type = SAHPI_HPIE_AUDIT; default_hpisw_event.EventDataUnion.HpiSwEvent.EventData.DataType = SAHPI_TL_TYPE_TEXT; default_hpisw_event.EventDataUnion.HpiSwEvent.EventData.Language = SAHPI_LANG_URDU; default_hpisw_event.EventDataUnion.HpiSwEvent.EventData.DataLength = sizeof("HPI software event"); strncpy((char *)(default_hpisw_event.EventDataUnion.HpiSwEvent.EventData.Data), "HPI software event", strlen("HPI software event")); printf("Normal HPI Sotware Event\n"); err = oh_print_event(&default_hpisw_event, NULL, 1); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } } /**************** * HPI OEM events ****************/ { SaHpiEventT default_oem_event; memset(&default_oem_event, 0, sizeof(SaHpiEventT)); default_oem_event.Source = 1; default_oem_event.EventType = SAHPI_ET_OEM; default_oem_event.Severity = SAHPI_CRITICAL; /* oh_print_event: Zero OEM event testcase */ printf("Default OEM Event - no data\n"); err = oh_print_event(&default_oem_event, NULL, 1); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } /* oh_print_event: Normal OEM event testcase */ default_oem_event.EventDataUnion.OemEvent.MId = 1; default_oem_event.EventDataUnion.OemEvent.OemEventData.DataType = SAHPI_TL_TYPE_TEXT; default_oem_event.EventDataUnion.OemEvent.OemEventData.Language = SAHPI_LANG_URDU; default_oem_event.EventDataUnion.OemEvent.OemEventData.DataLength = sizeof("OEM Event"); strncpy((char *)(default_oem_event.EventDataUnion.OemEvent.OemEventData.Data), "OEM Event", strlen("OEM Event")); printf("Normal OEM Event\n"); err = oh_print_event(&default_oem_event, NULL, 1); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } } /***************** * HPI User events *****************/ { SaHpiEventT default_user_event; memset(&default_user_event, 0, sizeof(SaHpiEventT)); default_user_event.Source = 1; default_user_event.EventType = SAHPI_ET_USER; default_user_event.Severity = SAHPI_CRITICAL; /* oh_print_event: Zero User event testcase */ printf("Default User Event - no data\n"); err = oh_print_event(&default_user_event, NULL, 1); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } /* oh_print_event: Normal User event testcase */ default_user_event.EventDataUnion.UserEvent.UserEventData.DataType = SAHPI_TL_TYPE_TEXT; default_user_event.EventDataUnion.UserEvent.UserEventData.Language = SAHPI_LANG_URDU; default_user_event.EventDataUnion.UserEvent.UserEventData.DataLength = sizeof("User Event"); strncpy((char *)(default_user_event.EventDataUnion.UserEvent.UserEventData.Data), "User Event", strlen("User Event")); printf("Normal User Event\n"); err = oh_print_event(&default_user_event, NULL, 1); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } } } /**************************** * oh_print_ctrlrec testcases ****************************/ SaHpiCtrlRecT control; memset(&control, 0, sizeof(SaHpiCtrlRecT)); /* oh_print_ctrlrec: Default testcase */ printf("Print control - default case\n"); err = oh_print_ctrlrec(&control, 1); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } control.Num = 1; control.OutputType = SAHPI_CTRL_LED; control.DefaultMode.Mode = SAHPI_CTRL_MODE_AUTO; control.DefaultMode.ReadOnly = SAHPI_TRUE; control.WriteOnly = SAHPI_TRUE; control.Oem = 0; /* oh_print_ctrlrec: Normal digital testcase */ control.Type = SAHPI_CTRL_TYPE_DIGITAL; control.TypeUnion.Digital.Default = SAHPI_CTRL_STATE_PULSE_ON; printf("Print control - normal digital case\n"); err = oh_print_ctrlrec(&control, 1); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } /* oh_print_ctrlrec: Normal discrete testcase */ control.Type = SAHPI_CTRL_TYPE_DISCRETE; control.TypeUnion.Discrete.Default = 2; printf("Print control - normal discrete case\n"); err = oh_print_ctrlrec(&control, 1); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } /* oh_print_ctrlrec: Normal analog testcase */ control.Type = SAHPI_CTRL_TYPE_ANALOG; control.TypeUnion.Analog.Min = 1; control.TypeUnion.Analog.Max = 10; control.TypeUnion.Analog.Default = 5; printf("Print control - normal analog case\n"); err = oh_print_ctrlrec(&control, 1); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } /* oh_print_ctrlrec: Normal stream testcase */ control.Type = SAHPI_CTRL_TYPE_STREAM; control.TypeUnion.Stream.Default.Repeat = SAHPI_TRUE; control.TypeUnion.Stream.Default.StreamLength = MIN(SAHPI_CTRL_MAX_STREAM_LENGTH, strlen("Stream Data")); strncpy((char *)control.TypeUnion.Stream.Default.Stream, "Stream Data", SAHPI_CTRL_MAX_STREAM_LENGTH); printf("Print control - normal stream case\n"); err = oh_print_ctrlrec(&control, 1); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } /* oh_print_ctrlrec: Normal text testcase */ control.Type = SAHPI_CTRL_TYPE_TEXT; control.TypeUnion.Text.MaxChars = 10; control.TypeUnion.Text.MaxLines = 100; control.TypeUnion.Text.Language = SAHPI_LANG_ENGLISH; control.TypeUnion.Text.DataType = SAHPI_TL_TYPE_TEXT; control.TypeUnion.Text.Default.Line = 1; control.TypeUnion.Text.Default.Text.DataType = SAHPI_TL_TYPE_TEXT; control.TypeUnion.Text.Default.Text.Language = SAHPI_LANG_ENGLISH; control.TypeUnion.Text.Default.Text.DataLength = MIN(SAHPI_MAX_TEXT_BUFFER_LENGTH, strlen("Text Data")); strncpy((char *)(control.TypeUnion.Text.Default.Text.Data), "Text Data", SAHPI_MAX_TEXT_BUFFER_LENGTH); printf("Print control - normal text case\n"); err = oh_print_ctrlrec(&control, 1); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } /* oh_print_ctrlrec: Normal oem testcase */ control.Type = SAHPI_CTRL_TYPE_OEM; control.TypeUnion.Oem.MId = 1; strncpy((char *)control.TypeUnion.Oem.ConfigData, "Config Data", SAHPI_CTRL_OEM_CONFIG_LENGTH); control.TypeUnion.Oem.Default.MId = 1; control.TypeUnion.Oem.Default.BodyLength = MIN(SAHPI_CTRL_MAX_OEM_BODY_LENGTH, strlen("Config Default")); strncpy((char *)control.TypeUnion.Oem.Default.Body, "Config Default", SAHPI_CTRL_MAX_OEM_BODY_LENGTH); printf("Print control - normal OEM case\n"); err = oh_print_ctrlrec(&control, 1); if (err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } /******************************* * oh_valid_textbuffer testcases *******************************/ { SaHpiTextBufferT buffer; SaHpiBoolT result, expected_result; /* oh_valid_textbuffer: NULL buffer testcase */ expected_result = SAHPI_FALSE; result = oh_valid_textbuffer(0); if (result != expected_result) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); return -1; } /* oh_valid_textbuffer: Bad text type testcase */ expected_result = SAHPI_FALSE; oh_init_textbuffer(&buffer); buffer.DataType = BAD_TYPE; result = oh_valid_textbuffer(&buffer); if (result != expected_result) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); return -1; } /* oh_valid_textbuffer: Bad language type testcase */ expected_result = SAHPI_FALSE; oh_init_textbuffer(&buffer); buffer.Language = BAD_TYPE; result = oh_valid_textbuffer(&buffer); if (result != expected_result) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); return -1; } /* oh_valid_textbuffer: Bad Unicode length testcase */ expected_result = SAHPI_FALSE; oh_init_textbuffer(&buffer); buffer.DataType = SAHPI_TL_TYPE_UNICODE; strcpy((char *)buffer.Data, "123"); buffer.DataLength = strlen("123"); result = oh_valid_textbuffer(&buffer); if (result != expected_result) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); return -1; } /* oh_valid_textbuffer: Bad Data text cases */ expected_result = SAHPI_FALSE; oh_init_textbuffer(&buffer); buffer.DataType = SAHPI_TL_TYPE_BCDPLUS; strcpy((char *)buffer.Data, "123"); buffer.Data[1] = ';'; buffer.DataLength = strlen("123"); result = oh_valid_textbuffer(&buffer); if (result != expected_result) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); return -1; } buffer.DataType = SAHPI_TL_TYPE_ASCII6; buffer.Data[1] = 0xff; result = oh_valid_textbuffer(&buffer); if (result != expected_result) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); return -1; } /* oh_valid_textbuffer: Good buffer testcase */ expected_result = SAHPI_TRUE; oh_init_textbuffer(&buffer); result = oh_valid_textbuffer(&buffer); if (result != expected_result) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); return -1; } } /******************************* * oh_valid_thresholds testcases *******************************/ { SaHpiRdrT default_rdr, test_rdr; SaHpiSensorThresholdsT default_thresholds_int64, test_thresholds_int64; SaHpiSensorThresholdsT default_thresholds_float64, test_thresholds_float64; SaHpiSensorThresholdsT default_thresholds_uint64, test_thresholds_uint64; SaHpiSensorDataFormatT default_format_int64; SaHpiSensorDataFormatT default_format_float64; SaHpiSensorDataFormatT default_format_uint64; default_rdr.RecordId = 1; default_rdr.RdrType = SAHPI_SENSOR_RDR; default_rdr.Entity.Entry[0].EntityType = SAHPI_ENT_ROOT; default_rdr.Entity.Entry[0].EntityLocation = 0; default_rdr.IsFru = SAHPI_TRUE; default_rdr.RdrTypeUnion.SensorRec.Num = 1; default_rdr.RdrTypeUnion.SensorRec.Type = SAHPI_TEMPERATURE; default_rdr.RdrTypeUnion.SensorRec.Category = SAHPI_EC_THRESHOLD; default_rdr.RdrTypeUnion.SensorRec.EnableCtrl = SAHPI_FALSE; default_rdr.RdrTypeUnion.SensorRec.EventCtrl= SAHPI_SEC_READ_ONLY; default_rdr.RdrTypeUnion.SensorRec.Events = SAHPI_ES_UPPER_MINOR | SAHPI_ES_UPPER_MAJOR | SAHPI_ES_UPPER_CRIT; default_rdr.RdrTypeUnion.SensorRec.DataFormat.IsSupported = SAHPI_TRUE; default_rdr.RdrTypeUnion.SensorRec.DataFormat.ReadingType = SAHPI_SENSOR_READING_TYPE_FLOAT64; default_rdr.RdrTypeUnion.SensorRec.DataFormat.BaseUnits = SAHPI_SU_DEGREES_C; default_rdr.RdrTypeUnion.SensorRec.DataFormat.ModifierUnits = SAHPI_SU_UNSPECIFIED; default_rdr.RdrTypeUnion.SensorRec.DataFormat.ModifierUse = SAHPI_SMUU_NONE; default_rdr.RdrTypeUnion.SensorRec.DataFormat.Percentage = SAHPI_FALSE; default_rdr.RdrTypeUnion.SensorRec.DataFormat.Range.Flags = SAHPI_SRF_MAX | SAHPI_SRF_MIN; default_rdr.RdrTypeUnion.SensorRec.DataFormat.Range.Max.IsSupported = SAHPI_TRUE; default_rdr.RdrTypeUnion.SensorRec.DataFormat.Range.Max.Type = SAHPI_SENSOR_READING_TYPE_FLOAT64; default_rdr.RdrTypeUnion.SensorRec.DataFormat.Range.Max.Value.SensorFloat64 = 125; default_rdr.RdrTypeUnion.SensorRec.DataFormat.Range.Min.IsSupported = SAHPI_TRUE; default_rdr.RdrTypeUnion.SensorRec.DataFormat.Range.Min.Type = SAHPI_SENSOR_READING_TYPE_FLOAT64; default_rdr.RdrTypeUnion.SensorRec.DataFormat.Range.Min.Value.SensorFloat64 = 0; default_rdr.RdrTypeUnion.SensorRec.ThresholdDefn.IsAccessible = SAHPI_TRUE; default_rdr.RdrTypeUnion.SensorRec.ThresholdDefn.ReadThold = 0; default_rdr.RdrTypeUnion.SensorRec.ThresholdDefn.WriteThold = SAHPI_STM_LOW_MINOR | SAHPI_STM_LOW_MAJOR | SAHPI_STM_LOW_CRIT | SAHPI_STM_UP_MINOR | SAHPI_STM_UP_MAJOR | SAHPI_STM_UP_CRIT | SAHPI_STM_UP_HYSTERESIS | SAHPI_STM_LOW_HYSTERESIS; default_thresholds_int64.UpCritical.IsSupported = SAHPI_TRUE; default_thresholds_int64.UpCritical.Type = SAHPI_SENSOR_READING_TYPE_INT64; default_thresholds_int64.UpCritical.Value.SensorInt64 = 50; default_thresholds_int64.UpMajor.IsSupported = SAHPI_TRUE; default_thresholds_int64.UpMajor.Type = SAHPI_SENSOR_READING_TYPE_INT64; default_thresholds_int64.UpMajor.Value.SensorInt64 = 40; default_thresholds_int64.UpMinor.IsSupported = SAHPI_TRUE; default_thresholds_int64.UpMinor.Type = SAHPI_SENSOR_READING_TYPE_INT64; default_thresholds_int64.UpMinor.Value.SensorInt64 = 30; default_thresholds_int64.LowMinor.IsSupported = SAHPI_TRUE; default_thresholds_int64.LowMinor.Type = SAHPI_SENSOR_READING_TYPE_INT64; default_thresholds_int64.LowMinor.Value.SensorInt64 = 20; default_thresholds_int64.LowMajor.IsSupported = SAHPI_TRUE; default_thresholds_int64.LowMajor.Type = SAHPI_SENSOR_READING_TYPE_INT64; default_thresholds_int64.LowMajor.Value.SensorInt64 = 10; default_thresholds_int64.LowCritical.IsSupported = SAHPI_TRUE; default_thresholds_int64.LowCritical.Type = SAHPI_SENSOR_READING_TYPE_INT64; default_thresholds_int64.LowCritical.Value.SensorInt64 = 0; default_thresholds_int64.PosThdHysteresis.IsSupported = SAHPI_TRUE; default_thresholds_int64.PosThdHysteresis.Type = SAHPI_SENSOR_READING_TYPE_INT64; default_thresholds_int64.PosThdHysteresis.Value.SensorInt64 = 2; default_thresholds_int64.NegThdHysteresis.IsSupported = SAHPI_TRUE; default_thresholds_int64.NegThdHysteresis.Type = SAHPI_SENSOR_READING_TYPE_INT64; default_thresholds_int64.NegThdHysteresis.Value.SensorInt64 = 2; default_format_int64.IsSupported = SAHPI_TRUE; default_format_int64.ReadingType = SAHPI_SENSOR_READING_TYPE_INT64; default_format_int64.Range.Flags = SAHPI_SRF_MAX | SAHPI_SRF_MIN; default_format_int64.Range.Max.Value.SensorInt64 = 60; default_format_int64.Range.Min.Value.SensorInt64 = 0; /* oh_valid_thresholds: Bad parameters testcase */ expected_err = SA_ERR_HPI_INVALID_PARAMS; err = oh_valid_thresholds(0, &default_rdr); if (err != expected_err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } /* oh_valid_thresholds: Bad RDR testcase */ test_rdr = default_rdr; test_thresholds_int64 = default_thresholds_int64; test_rdr.RdrType = SAHPI_WATCHDOG_RDR; expected_err = SA_ERR_HPI_INVALID_PARAMS; err = oh_valid_thresholds(&test_thresholds_int64, &test_rdr); if (err != expected_err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } /* oh_valid_thresholds: Bad threshold type testcase */ test_rdr = default_rdr; test_rdr.RdrTypeUnion.SensorRec.DataFormat = default_format_int64; test_thresholds_int64 = default_thresholds_int64; expected_err = SA_ERR_HPI_INVALID_DATA; test_thresholds_int64.LowCritical.Type = SAHPI_SENSOR_READING_TYPE_FLOAT64; err = oh_valid_thresholds(&test_thresholds_int64, &test_rdr); if (err != expected_err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } /* oh_valid_thresholds: Bad text buffer type threshold testcase */ test_rdr = default_rdr; test_rdr.RdrTypeUnion.SensorRec.DataFormat = default_format_int64; test_thresholds_int64 = default_thresholds_int64; expected_err = SA_ERR_HPI_INVALID_DATA; test_thresholds_int64.LowCritical.Type = SAHPI_SENSOR_READING_TYPE_BUFFER; err = oh_valid_thresholds(&test_thresholds_int64, &test_rdr); if (err != expected_err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } /* oh_valid_thresholds: Bad threshold hysteresis testcase */ test_rdr = default_rdr; test_rdr.RdrTypeUnion.SensorRec.DataFormat = default_format_int64; test_thresholds_int64 = default_thresholds_int64; expected_err = SA_ERR_HPI_INVALID_DATA; test_thresholds_int64.PosThdHysteresis.Value.SensorInt64 = -1; test_rdr.RdrTypeUnion.SensorRec.DataFormat.Range.Flags = test_rdr.RdrTypeUnion.SensorRec.DataFormat.Range.Flags & ~SAHPI_SRF_MAX; test_rdr.RdrTypeUnion.SensorRec.DataFormat.Range.Flags = test_rdr.RdrTypeUnion.SensorRec.DataFormat.Range.Flags & ~SAHPI_SRF_MIN; err = oh_valid_thresholds(&test_thresholds_int64, &test_rdr); if (err != expected_err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } /* oh_valid_thresholds: Bad range threshold testcase */ test_rdr = default_rdr; test_rdr.RdrTypeUnion.SensorRec.DataFormat = default_format_int64; test_thresholds_int64 = default_thresholds_int64; expected_err = SA_ERR_HPI_INVALID_CMD; test_rdr.RdrTypeUnion.SensorRec.DataFormat.Range.Max.Value.SensorInt64 = 0; err = oh_valid_thresholds(&test_thresholds_int64, &test_rdr); if (err != expected_err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } /* oh_valid_thresholds: Bad order threshold testcase */ test_rdr = default_rdr; test_rdr.RdrTypeUnion.SensorRec.DataFormat = default_format_int64; test_thresholds_int64 = default_thresholds_int64; expected_err = SA_ERR_HPI_INVALID_DATA; test_thresholds_int64.LowCritical.Value.SensorInt64 = 20; err = oh_valid_thresholds(&test_thresholds_int64, &test_rdr); if (err != expected_err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } /* oh_valid_thresholds: Bad writable threshold testcase */ test_rdr = default_rdr; test_rdr.RdrTypeUnion.SensorRec.DataFormat = default_format_int64; test_thresholds_int64 = default_thresholds_int64; expected_err = SA_ERR_HPI_INVALID_CMD; test_rdr.RdrTypeUnion.SensorRec.ThresholdDefn.WriteThold = SAHPI_STM_LOW_MINOR | SAHPI_STM_LOW_MAJOR | SAHPI_STM_LOW_CRIT; err = oh_valid_thresholds(&test_thresholds_int64, &test_rdr); if (err != expected_err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } /* oh_valid_thresholds: Normal threshold testcase - int64 */ test_rdr = default_rdr; test_rdr.RdrTypeUnion.SensorRec.DataFormat = default_format_int64; test_thresholds_int64 = default_thresholds_int64; expected_err = SA_OK; err = oh_valid_thresholds(&test_thresholds_int64, &test_rdr); if (err != expected_err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } /* oh_valid_thresholds: Normal subset testcase */ test_rdr = default_rdr; test_rdr.RdrTypeUnion.SensorRec.DataFormat = default_format_int64; test_thresholds_int64 = default_thresholds_int64; expected_err = SA_OK; test_thresholds_int64.UpCritical.IsSupported = SAHPI_FALSE; test_thresholds_int64.UpCritical.Type = BAD_TYPE; /* This should be ignored */ test_thresholds_int64.LowCritical.IsSupported = SAHPI_FALSE; test_thresholds_int64.LowCritical.Type = BAD_TYPE; /* This should be ignored */ err = oh_valid_thresholds(&test_thresholds_int64, &test_rdr); if (err != expected_err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } default_thresholds_float64.UpCritical.IsSupported = SAHPI_TRUE; default_thresholds_float64.UpCritical.Type = SAHPI_SENSOR_READING_TYPE_FLOAT64; default_thresholds_float64.UpCritical.Value.SensorFloat64 = 50.3; default_thresholds_float64.UpMajor.IsSupported = SAHPI_TRUE; default_thresholds_float64.UpMajor.Type = SAHPI_SENSOR_READING_TYPE_FLOAT64; default_thresholds_float64.UpMajor.Value.SensorFloat64 = 40.2; default_thresholds_float64.UpMinor.IsSupported = SAHPI_TRUE; default_thresholds_float64.UpMinor.Type = SAHPI_SENSOR_READING_TYPE_FLOAT64; default_thresholds_float64.UpMinor.Value.SensorFloat64 = 30.1; default_thresholds_float64.LowMinor.IsSupported = SAHPI_TRUE; default_thresholds_float64.LowMinor.Type = SAHPI_SENSOR_READING_TYPE_FLOAT64; default_thresholds_float64.LowMinor.Value.SensorFloat64 = 20.3; default_thresholds_float64.LowMajor.IsSupported = SAHPI_TRUE; default_thresholds_float64.LowMajor.Type = SAHPI_SENSOR_READING_TYPE_FLOAT64; default_thresholds_float64.LowMajor.Value.SensorFloat64 = 10.2; default_thresholds_float64.LowCritical.IsSupported = SAHPI_TRUE; default_thresholds_float64.LowCritical.Type = SAHPI_SENSOR_READING_TYPE_FLOAT64; default_thresholds_float64.LowCritical.Value.SensorFloat64 = 0.5; default_thresholds_float64.PosThdHysteresis.IsSupported = SAHPI_TRUE; default_thresholds_float64.PosThdHysteresis.Type = SAHPI_SENSOR_READING_TYPE_FLOAT64; default_thresholds_float64.PosThdHysteresis.Value.SensorFloat64 = 2; default_thresholds_float64.NegThdHysteresis.IsSupported = SAHPI_TRUE; default_thresholds_float64.NegThdHysteresis.Type = SAHPI_SENSOR_READING_TYPE_FLOAT64; default_thresholds_float64.NegThdHysteresis.Value.SensorFloat64 = 2; default_format_float64.IsSupported = SAHPI_TRUE; default_format_float64.ReadingType = SAHPI_SENSOR_READING_TYPE_FLOAT64; default_format_float64.Range.Flags = SAHPI_SRF_MAX | SAHPI_SRF_MIN; default_format_float64.Range.Max.Value.SensorFloat64 = 60; default_format_float64.Range.Min.Value.SensorFloat64 = 0; /* oh_valid_thresholds: Normal threshold testcase - float64 */ test_rdr = default_rdr; test_rdr.RdrTypeUnion.SensorRec.DataFormat = default_format_float64; test_thresholds_float64 = default_thresholds_float64; expected_err = SA_OK; err = oh_valid_thresholds(&test_thresholds_float64, &test_rdr); if (err != expected_err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } default_thresholds_uint64.UpCritical.IsSupported = SAHPI_TRUE; default_thresholds_uint64.UpCritical.Type = SAHPI_SENSOR_READING_TYPE_UINT64; default_thresholds_uint64.UpCritical.Value.SensorUint64 = 50.3; default_thresholds_uint64.UpMajor.IsSupported = SAHPI_TRUE; default_thresholds_uint64.UpMajor.Type = SAHPI_SENSOR_READING_TYPE_UINT64; default_thresholds_uint64.UpMajor.Value.SensorUint64 = 40.2; default_thresholds_uint64.UpMinor.IsSupported = SAHPI_TRUE; default_thresholds_uint64.UpMinor.Type = SAHPI_SENSOR_READING_TYPE_UINT64; default_thresholds_uint64.UpMinor.Value.SensorUint64 = 30.1; default_thresholds_uint64.LowMinor.IsSupported = SAHPI_TRUE; default_thresholds_uint64.LowMinor.Type = SAHPI_SENSOR_READING_TYPE_UINT64; default_thresholds_uint64.LowMinor.Value.SensorUint64 = 20.3; default_thresholds_uint64.LowMajor.IsSupported = SAHPI_TRUE; default_thresholds_uint64.LowMajor.Type = SAHPI_SENSOR_READING_TYPE_UINT64; default_thresholds_uint64.LowMajor.Value.SensorUint64 = 10.2; default_thresholds_uint64.LowCritical.IsSupported = SAHPI_TRUE; default_thresholds_uint64.LowCritical.Type = SAHPI_SENSOR_READING_TYPE_UINT64; default_thresholds_uint64.LowCritical.Value.SensorUint64 = 0.5; default_thresholds_uint64.PosThdHysteresis.IsSupported = SAHPI_TRUE; default_thresholds_uint64.PosThdHysteresis.Type = SAHPI_SENSOR_READING_TYPE_UINT64; default_thresholds_uint64.PosThdHysteresis.Value.SensorUint64 = 2; default_thresholds_uint64.NegThdHysteresis.IsSupported = SAHPI_TRUE; default_thresholds_uint64.NegThdHysteresis.Type = SAHPI_SENSOR_READING_TYPE_UINT64; default_thresholds_uint64.NegThdHysteresis.Value.SensorUint64 = 2; default_format_uint64.IsSupported = SAHPI_TRUE; default_format_uint64.ReadingType = SAHPI_SENSOR_READING_TYPE_UINT64; default_format_uint64.Range.Flags = SAHPI_SRF_MAX | SAHPI_SRF_MIN; default_format_uint64.Range.Max.Value.SensorUint64 = 60; default_format_uint64.Range.Min.Value.SensorUint64 = 0; /* oh_valid_thresholds: Normal threshold testcase - uint64 */ test_rdr = default_rdr; test_rdr.RdrTypeUnion.SensorRec.DataFormat = default_format_uint64; test_thresholds_uint64 = default_thresholds_uint64; expected_err = SA_OK; err = oh_valid_thresholds(&test_thresholds_uint64, &test_rdr); if (err != expected_err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } } /************************************ * oh_compare_sensorreading testcases ************************************/ { SaHpiSensorReadingT reading1, reading2; int rtn, expected_rtn; reading1.IsSupported = reading2.IsSupported = SAHPI_TRUE; reading1.Type = reading2.Type = SAHPI_SENSOR_READING_TYPE_FLOAT64; /* oh_compare_sensorreading - reading1 < reading2 float64 */ reading1.Value.SensorFloat64 = 5; reading2.Value.SensorFloat64 = 10; expected_rtn = -1; rtn = oh_compare_sensorreading(reading1.Type, &reading1, &reading2); if (rtn != expected_rtn) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received return code=%d\n", rtn); return -1; } /* oh_compare_sensorreading - reading1 = reading2 float64 */ reading1.Value.SensorFloat64 = 5; reading2.Value.SensorFloat64 = 5; expected_rtn = 0; rtn = oh_compare_sensorreading(reading1.Type, &reading1, &reading2); if (rtn != expected_rtn) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received return code=%d\n", rtn); return -1; } /* oh_compare_sensorreading - reading1 = reading2 float64 */ reading1.Value.SensorFloat64 = 10; reading2.Value.SensorFloat64 = 5; expected_rtn = 1; rtn = oh_compare_sensorreading(reading1.Type, &reading1, &reading2); if (rtn != expected_rtn) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received return code=%d\n", rtn); return -1; } reading1.Type = reading2.Type = SAHPI_SENSOR_READING_TYPE_INT64; /* oh_compare_sensorreading - reading1 < reading2 int64 */ reading1.Value.SensorInt64 = 5; reading2.Value.SensorInt64 = 10; expected_rtn = -1; rtn = oh_compare_sensorreading(reading1.Type, &reading1, &reading2); if (rtn != expected_rtn) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received return code=%d\n", rtn); return -1; } /* oh_compare_sensorreading - reading1 = reading2 int64 */ reading1.Value.SensorInt64 = 5; reading2.Value.SensorInt64 = 5; expected_rtn = 0; rtn = oh_compare_sensorreading(reading1.Type, &reading1, &reading2); if (rtn != expected_rtn) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received return code=%d\n", rtn); return -1; } /* oh_compare_sensorreading - reading1 = reading2 int64 */ reading1.Value.SensorInt64 = 10; reading2.Value.SensorInt64 = 5; expected_rtn = 1; rtn = oh_compare_sensorreading(reading1.Type, &reading1, &reading2); if (rtn != expected_rtn) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received return code=%d\n", rtn); return -1; } reading1.Type = reading2.Type = SAHPI_SENSOR_READING_TYPE_UINT64; /* oh_compare_sensorreading - reading1 < reading2 uint64 */ reading1.Value.SensorUint64 = 5; reading2.Value.SensorUint64 = 10; expected_rtn = -1; rtn = oh_compare_sensorreading(reading1.Type, &reading1, &reading2); if (rtn != expected_rtn) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received return code=%d\n", rtn); return -1; } /* oh_compare_sensorreading - reading1 = reading2 uint64 */ reading1.Value.SensorUint64 = 5; reading2.Value.SensorUint64 = 5; expected_rtn = 0; rtn = oh_compare_sensorreading(reading1.Type, &reading1, &reading2); if (rtn != expected_rtn) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received return code=%d\n", rtn); return -1; } /* oh_compare_sensorreading - reading1 = reading2 uint64 */ reading1.Value.SensorUint64 = 10; reading2.Value.SensorUint64 = 5; expected_rtn = 1; rtn = oh_compare_sensorreading(reading1.Type, &reading1, &reading2); if (rtn != expected_rtn) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received return code=%d\n", rtn); return -1; } reading1.Type = reading2.Type = SAHPI_SENSOR_READING_TYPE_BUFFER; /* oh_compare_sensorreading - reading1 < reading2 uint64 */ strncpy((char *)reading1.Value.SensorBuffer, "AAA", SAHPI_SENSOR_BUFFER_LENGTH); strncpy((char *)reading2.Value.SensorBuffer, "BBB", SAHPI_SENSOR_BUFFER_LENGTH); expected_rtn = -1; rtn = oh_compare_sensorreading(reading1.Type, &reading1, &reading2); if (rtn != expected_rtn) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received return code=%d\n", rtn); return -1; } } /************************************ * oh_valid_ctrl_state_mode testcases ************************************/ { SaHpiCtrlModeT default_mode, mode; SaHpiCtrlStateT default_state, state; SaHpiCtrlRecT default_rdr, rdr; memset(&default_mode, 0, sizeof(SaHpiCtrlModeT)); memset(&default_state, 0, sizeof(SaHpiCtrlStateT)); memset(&default_rdr, 0, sizeof(SaHpiCtrlRecT)); default_mode = SAHPI_CTRL_MODE_AUTO; default_state.Type = SAHPI_CTRL_TYPE_DIGITAL; default_state.StateUnion.Digital = SAHPI_CTRL_STATE_OFF; default_rdr.Num = 1; default_rdr.OutputType = SAHPI_CTRL_LED; default_rdr.Type = SAHPI_CTRL_TYPE_DIGITAL; default_rdr.TypeUnion.Digital.Default = SAHPI_CTRL_STATE_OFF; default_rdr.DefaultMode.Mode = SAHPI_CTRL_MODE_AUTO; default_rdr.DefaultMode.ReadOnly = SAHPI_TRUE; default_rdr.WriteOnly = SAHPI_TRUE; default_rdr.Oem = 0; /* oh_valid_ctrl_state_mode: Normal testcase */ mode = default_mode; state = default_state; rdr = default_rdr; expected_err = SA_OK; err = oh_valid_ctrl_state_mode(&rdr, mode, &state); if (err != expected_err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } /* oh_valid_ctrl_state_mode: Bad mode testcase */ mode = BAD_TYPE; state = default_state; rdr = default_rdr; expected_err = SA_ERR_HPI_INVALID_PARAMS; err = oh_valid_ctrl_state_mode(&rdr, mode, &state); if (err != expected_err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } /* oh_valid_ctrl_state_mode: Write read-only control testcase */ mode = SAHPI_CTRL_MODE_MANUAL; state = default_state; rdr = default_rdr; expected_err = SA_ERR_HPI_READ_ONLY; err = oh_valid_ctrl_state_mode(&rdr, mode, &state); if (err != expected_err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } /* oh_valid_ctrl_state_mode: Bad analog testcase */ mode = SAHPI_CTRL_MODE_MANUAL; state = default_state; rdr = default_rdr; state.Type = SAHPI_CTRL_TYPE_ANALOG; state.StateUnion.Analog = 50; rdr.DefaultMode.ReadOnly = SAHPI_FALSE; rdr.Type = SAHPI_CTRL_TYPE_ANALOG; rdr.TypeUnion.Analog.Max = 49; expected_err = SA_ERR_HPI_INVALID_DATA; err = oh_valid_ctrl_state_mode(&rdr, mode, &state); if (err != expected_err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } /* oh_valid_ctrl_state_mode: Bad stream testcase */ mode = SAHPI_CTRL_MODE_MANUAL; state = default_state; rdr = default_rdr; state.Type = SAHPI_CTRL_TYPE_STREAM; state.StateUnion.Stream.StreamLength = SAHPI_CTRL_MAX_STREAM_LENGTH + 1; rdr.DefaultMode.ReadOnly = SAHPI_FALSE; rdr.Type = SAHPI_CTRL_TYPE_STREAM; expected_err = SA_ERR_HPI_INVALID_PARAMS; err = oh_valid_ctrl_state_mode(&rdr, mode, &state); if (err != expected_err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } /* oh_valid_ctrl_state_mode: Bad overflow testcase */ mode = SAHPI_CTRL_MODE_MANUAL; state = default_state; rdr = default_rdr; state.Type = SAHPI_CTRL_TYPE_TEXT; state.StateUnion.Text.Line = 10; state.StateUnion.Text.Text.DataType = SAHPI_TL_TYPE_TEXT; state.StateUnion.Text.Text.Language = SAHPI_LANG_ENGLISH; state.StateUnion.Text.Text.DataLength = 11; rdr.DefaultMode.ReadOnly = SAHPI_FALSE; rdr.Type = SAHPI_CTRL_TYPE_TEXT; rdr.TypeUnion.Text.MaxChars = 10; rdr.TypeUnion.Text.MaxLines = 10; rdr.TypeUnion.Text.Language = SAHPI_LANG_ENGLISH; rdr.TypeUnion.Text.DataType = SAHPI_TL_TYPE_TEXT; expected_err = SA_ERR_HPI_INVALID_DATA; err = oh_valid_ctrl_state_mode(&rdr, mode, &state); if (err != expected_err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } /* oh_valid_ctrl_state_mode: Bad overflow all lines testcase */ mode = SAHPI_CTRL_MODE_MANUAL; state = default_state; rdr = default_rdr; state.Type = SAHPI_CTRL_TYPE_TEXT; state.StateUnion.Text.Line = SAHPI_TLN_ALL_LINES; state.StateUnion.Text.Text.DataType = SAHPI_TL_TYPE_TEXT; state.StateUnion.Text.Text.Language = SAHPI_LANG_ENGLISH; state.StateUnion.Text.Text.DataLength = 101; rdr.DefaultMode.ReadOnly = SAHPI_FALSE; rdr.Type = SAHPI_CTRL_TYPE_TEXT; rdr.TypeUnion.Text.MaxChars = 10; rdr.TypeUnion.Text.MaxLines = 10; rdr.TypeUnion.Text.Language = SAHPI_LANG_ENGLISH; rdr.TypeUnion.Text.DataType = SAHPI_TL_TYPE_TEXT; expected_err = SA_ERR_HPI_INVALID_DATA; err = oh_valid_ctrl_state_mode(&rdr, mode, &state); if (err != expected_err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } } return(0); } openhpi-2.14.1/utils/t/sahpi/sahpi_struct_rptentry_test.c0000644000076400007640000001036111302567130020561 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * pdphan */ #include #include #include #include #include int main(int argc, char **argv) { SaErrorT err; SaHpiBoolT test1Fail = SAHPI_FALSE, test2Fail = SAHPI_FALSE, test3Fail = SAHPI_FALSE, test4Fail = SAHPI_FALSE, test5Fail = SAHPI_FALSE; SaHpiRptEntryT thisrptentry = { .EntryId = 82, .ResourceId = 101, .ResourceInfo = { .ResourceRev = 2, .SpecificVer = 22, .DeviceSupport = 222, .ManufacturerId = 5, .ProductId = 2222, .FirmwareMajorRev = 42, .FirmwareMinorRev = 52, .AuxFirmwareRev = 62, }, .ResourceEntity = { .Entry[0] = { .EntityType = SAHPI_ENT_SUBBOARD_CARRIER_BLADE, .EntityLocation = 14 }, { .EntityType = SAHPI_ENT_SUB_CHASSIS, .EntityLocation = 15 }, { .EntityType = SAHPI_ENT_SYSTEM_CHASSIS, .EntityLocation = 16 }, { .EntityType = SAHPI_ENT_ROOT, .EntityLocation = 17 } }, .ResourceCapabilities = ( SAHPI_CAPABILITY_AGGREGATE_STATUS | SAHPI_CAPABILITY_CONFIGURATION | SAHPI_CAPABILITY_MANAGED_HOTSWAP | SAHPI_CAPABILITY_WATCHDOG | SAHPI_CAPABILITY_CONTROL | SAHPI_CAPABILITY_FRU | SAHPI_CAPABILITY_ANNUNCIATOR | SAHPI_CAPABILITY_POWER | SAHPI_CAPABILITY_RESET), .HotSwapCapabilities = SAHPI_HS_CAPABILITY_INDICATOR_SUPPORTED, .ResourceSeverity = SAHPI_INFORMATIONAL, .ResourceFailed = SAHPI_FALSE, .ResourceTag = { .DataType = SAHPI_TL_TYPE_TEXT, .Language = SAHPI_LANG_ENGLISH, .DataLength = 26, /* Incorrectly set on purpose */ .Data = "This is a test!" } }; FILE *fp; const char *name = "/tmp/rptentrytmp"; const char *mode = "a"; fp = fopen(name, mode); if (fp == NULL) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); return -1; } /* ------------------------------------------------ */ /* NULL Pointer tests */ /* ------------------------------------------------ */ err = oh_fprint_rptentry(NULL , &thisrptentry, 0); if (err != SA_ERR_HPI_INVALID_PARAMS) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); test1Fail = SAHPI_TRUE; } err = oh_fprint_rptentry(fp, NULL, 3); if (err != SA_ERR_HPI_INVALID_PARAMS) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); test2Fail = SAHPI_TRUE; } err = oh_fprint_rptentry(NULL , NULL, 3); if (err != SA_ERR_HPI_INVALID_PARAMS) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); test3Fail = SAHPI_TRUE; } /* ------------------------------------------------ */ /* Normal write to file test */ /* ------------------------------------------------ */ strncpy((char *)thisrptentry.ResourceInfo.Guid, "GUID-123", sizeof("GUID-123")); err = oh_fprint_rptentry(fp, &thisrptentry, 3); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); test4Fail = SAHPI_TRUE; } /* ------------------------------------------------ */ /* Normal write to stdout test */ /* ------------------------------------------------ */ err = oh_print_rptentry(&thisrptentry, 3); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); test5Fail = SAHPI_TRUE; } /* ------------------------------------------------ */ /* Write to invalid file handle test */ /* ------------------------------------------------ */ /* TBD */ fclose(fp); unlink(name); if (!test1Fail && !test2Fail && !test3Fail && !test4Fail && !test5Fail) return(0); else return(-1); } openhpi-2.14.1/utils/t/sahpi/sahpi_struct_idrarea_test.c0000644000076400007640000000570211302567130020304 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * pdphan */ #include #include #include #include #include int main(int argc, char **argv) { SaErrorT err; SaHpiIdrAreaHeaderT thisIdrArea; SaHpiBoolT test1Fail = SAHPI_FALSE, test2Fail = SAHPI_FALSE, test3Fail = SAHPI_FALSE, test4Fail = SAHPI_FALSE, test5Fail = SAHPI_FALSE; FILE *fp; const char *name = "/tmp/idrareatmp"; const char *mode = "a"; fp = fopen(name, mode); if (fp == NULL) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); return -1; } /* ------------------------------------------------ */ /* NULL Pointer tests */ /* ------------------------------------------------ */ err = oh_fprint_idrareaheader(NULL , &thisIdrArea, 3); if (err != SA_ERR_HPI_INVALID_PARAMS) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); test1Fail = SAHPI_TRUE; } err = oh_fprint_idrareaheader(fp, NULL, 3); if (err != SA_ERR_HPI_INVALID_PARAMS) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); test2Fail = SAHPI_TRUE; } err = oh_fprint_idrareaheader(NULL , NULL, 3); if (err != SA_ERR_HPI_INVALID_PARAMS) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); test3Fail = SAHPI_TRUE; } /* ------------------------------------------------ */ /* Normal write to file test */ /* ------------------------------------------------ */ thisIdrArea.AreaId = 3; thisIdrArea.Type = 1; thisIdrArea.ReadOnly = SAHPI_TRUE; thisIdrArea.NumFields = 1; err = oh_fprint_idrareaheader(fp, &thisIdrArea, 3); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); test4Fail = SAHPI_TRUE; } /* ------------------------------------------------ */ /* Normal write to stdout test */ /* ------------------------------------------------ */ err = oh_print_idrareaheader(&thisIdrArea, 3); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); test5Fail = SAHPI_TRUE; } /* ------------------------------------------------ */ /* Write to invalid file handle test */ /* ------------------------------------------------ */ /* TBD */ fclose(fp); unlink(name); if (!test1Fail && !test2Fail && !test3Fail && !test4Fail && !test5Fail) return(0); else return(-1); } openhpi-2.14.1/utils/t/sahpi/sahpi_struct_idrinfo_test.c0000644000076400007640000000564611302567130020336 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * pdphan */ #include #include #include #include #include int main(int argc, char **argv) { SaErrorT err; SaHpiIdrInfoT thisIdrInfo; SaHpiBoolT test1Fail = SAHPI_FALSE, test2Fail = SAHPI_FALSE, test3Fail = SAHPI_FALSE, test4Fail = SAHPI_FALSE, test5Fail = SAHPI_FALSE; FILE *fp; const char *name = "/tmp/idrinfotmp"; const char *mode = "a"; fp = fopen(name, mode); if (fp == NULL) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); return -1; } /* ------------------------------------------------ */ /* NULL Pointer tests */ /* ------------------------------------------------ */ err = oh_fprint_idrinfo(NULL , &thisIdrInfo, 3); if (err != SA_ERR_HPI_INVALID_PARAMS) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); test1Fail = SAHPI_TRUE; } err = oh_fprint_idrinfo(fp, NULL, 3); if (err != SA_ERR_HPI_INVALID_PARAMS) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); test2Fail = SAHPI_TRUE; } err = oh_fprint_idrinfo(NULL , NULL, 3); if (err != SA_ERR_HPI_INVALID_PARAMS) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); test3Fail = SAHPI_TRUE; } /* ------------------------------------------------ */ /* Normal write to file test */ /* ------------------------------------------------ */ thisIdrInfo.IdrId = 1; thisIdrInfo.UpdateCount = 2; thisIdrInfo.ReadOnly = SAHPI_FALSE; thisIdrInfo.NumAreas = 100; err = oh_fprint_idrinfo(fp, &thisIdrInfo, 3); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); test4Fail = SAHPI_TRUE; } /* ------------------------------------------------ */ /* Normal write to stdout test */ /* ------------------------------------------------ */ err = oh_print_idrinfo(&thisIdrInfo, 3); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); test5Fail = SAHPI_TRUE; } /* ------------------------------------------------ */ /* Write to invalid file handle test */ /* ------------------------------------------------ */ /* TBD */ fclose(fp); unlink(name); if (!test1Fail && !test2Fail && !test3Fail && !test4Fail && !test5Fail) return(0); else return(-1); } openhpi-2.14.1/utils/t/sahpi/sahpi_time_utils_test.c0000644000076400007640000000664111302567130017452 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * Steve Sherman */ #include #include #include #include int main(int argc, char **argv) { /* const char *expected_str; */ SaErrorT expected_err, err; SaHpiTextBufferT buffer; /************************** * oh_decode_time testcases **************************/ { /* oh_decode_time: test initial time testcase */ /* FIXME:: Can't look for a specific expected string, since it depends on locale Need to set and reset locale dynamically from this testcase */ err = oh_decode_time(0, &buffer); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } /* printf("Time=%s\n", buffer.Data); */ /* oh_decode_time: Null buffer testcase */ expected_err = SA_ERR_HPI_INVALID_PARAMS; err = oh_decode_time(0, 0); if (expected_err != err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d, Expected error=%d\n", err, expected_err); return -1; } } { SaHpiTimeT time; /* oh_gettimeofday normal time textcase */ err = oh_gettimeofday(&time); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } err = oh_decode_time(time, &buffer); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } /* printf("TOD Time=%s\n", buffer.Data); */ /* oh_gettimeofday NULL time textcase */ expected_err = SA_ERR_HPI_INVALID_PARAMS; err = oh_gettimeofday(0); if (err != expected_err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d, Expected error=%d\n", err, expected_err); return -1; } } { SaHpiTimeT time = SAHPI_TIME_UNSPECIFIED; err = oh_decode_time(time, &buffer); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (strncmp((char *)buffer.Data, "SAHPI_TIME_UNSPECIFIED", (sizeof("SAHPI_TIME_UNSPECIFIED")-1)) != 0) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Not receiving expected string SAHPI_TIME_UNSPECIFIED\n"); return -1; } if (buffer.DataLength < strlen("SAHPI_TIME_UNSPECIFIED")) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" DataLength was not set to correct number"); return -1; } } { SaHpiTimeT time = SAHPI_TIME_MAX_RELATIVE - 1; err = oh_decode_time(time, &buffer); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } } return(0); } openhpi-2.14.1/utils/t/sahpi/sahpi_event_utils_test.c0000644000076400007640000003235611302567130017637 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * Steve Sherman */ #include #include #include #include #define BAD_CAT -1 #define BAD_TYPE -1 int main(int argc, char **argv) { const char *expected_str; SaErrorT err, expected_err; SaHpiEventStateT event_state, expected_state; SaHpiEventCategoryT event_cat, expected_cat; SaHpiTextBufferT buffer; /******************************** * oh_decode_eventstate testcases ********************************/ /* oh_decode_eventstate: Bad event category testcase */ { expected_err = SA_ERR_HPI_INVALID_PARAMS; err = oh_decode_eventstate(SAHPI_ES_UNSPECIFIED, BAD_CAT, &buffer); if (expected_err != err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d, Expected error=%d\n", err, expected_err); return -1; } } /* oh_decode_eventstate: NULL buffer testcase */ { expected_err = SA_ERR_HPI_INVALID_PARAMS; err = oh_decode_eventstate(SAHPI_ES_UNSPECIFIED, SAHPI_EC_UNSPECIFIED, 0); if (expected_err != err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d, Expected error=%d\n", err, expected_err); return -1; } } /* oh_decode_eventstate: print UNSPECIFIED testcase */ { event_state = SAHPI_ES_UNSPECIFIED; event_cat = SAHPI_EC_GENERIC; expected_str = "UNSPECIFIED"; err = oh_decode_eventstate(event_state, event_cat, &buffer); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (strcmp(expected_str, (char *)buffer.Data)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s; Expected string=%s\n", buffer.Data, expected_str); return -1; } } /* oh_decode_eventstate: strip extra UNSPECIFIED testcase */ { event_state = SAHPI_ES_STATE_01 | SAHPI_ES_STATE_03 | SAHPI_ES_UNSPECIFIED; expected_str = "STATE_01 | STATE_03"; err = oh_decode_eventstate(event_state, event_cat, &buffer); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (strcmp(expected_str, (char *)buffer.Data)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s; Expected string=%s\n", buffer.Data, expected_str); return -1; } } /******************************** * oh_encode_eventstate testcases ********************************/ /* oh_encode_eventstate testcases - NULL parameters testcase */ { expected_err = SA_ERR_HPI_INVALID_PARAMS; err = oh_encode_eventstate(0, 0, 0); if (expected_err != err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d, Expected error=%d\n", err, expected_err); return -1; } } /* oh_encode_eventstate testcases - No Data testcase */ { expected_err = SA_ERR_HPI_INVALID_PARAMS; buffer.Data[0] = 0x00; err = oh_encode_eventstate(&buffer, &event_state, &event_cat); if (expected_err != err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d, Expected error=%d\n", err, expected_err); return -1; } } /* oh_encode_eventstate testcases - handle blanks testcase */ { strcpy((char *)buffer.Data, " LOWER_MINOR | LOWER_MAJOR|LOWER_CRIT "); buffer.DataLength = strlen(" LOWER_MINOR | LOWER_MAJOR|LOWER_CRIT "); expected_cat = SAHPI_EC_THRESHOLD; expected_state = SAHPI_ES_LOWER_MINOR | SAHPI_ES_LOWER_MAJOR | SAHPI_ES_LOWER_CRIT; err = oh_encode_eventstate(&buffer, &event_state, &event_cat); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if ((expected_state != event_state) || (expected_cat != event_cat)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Receive state:d state=%x; Received cat=%x\n", event_state, event_cat); return -1; } } /* oh_encode_eventstate testcases - valid states but different categories testcase */ { strcpy((char *)buffer.Data, "LOWER_MINOR | STATE_13 | IDLE"); buffer.DataLength = strlen("LOWER_MINOR | STATE_13 | IDLE"); expected_err = SA_ERR_HPI_INVALID_PARAMS; err = oh_encode_eventstate(&buffer, &event_state, &event_cat); if (expected_err != err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d, Expected error=%d\n", err, expected_err); return -1; } } /* oh_encode_eventstate testcases - garbage state testcase */ { strcpy((char *)buffer.Data, "GARBAGE_STATE"); buffer.DataLength = strlen("GARBAGE_STATE"); expected_err = SA_ERR_HPI_INVALID_PARAMS; err = oh_encode_eventstate(&buffer, &event_state, &event_cat); if (expected_err != err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d, Expected error=%d\n", err, expected_err); return -1; } } /******************************* * oh_valid_eventstate testcases *******************************/ #if 0 /* oh_valid_eventstate: SAHPI_EC_THRESHOLD Completeness (lower crit; no lower major) testcase */ { event_state = SAHPI_ES_LOWER_MINOR | SAHPI_ES_LOWER_CRIT; if (oh_valid_eventstate(event_state, SAHPI_EC_THRESHOLD, SAHPI_TRUE)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); return -1; } } /* oh_valid_eventstate: SAHPI_EC_THRESHOLD Completeness (lower major; no lower minor) testcase */ { event_state = SAHPI_ES_LOWER_MAJOR; if (oh_valid_eventstate(event_state, SAHPI_EC_THRESHOLD, SAHPI_TRUE)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); return -1; } } /* oh_valid_eventstate: SAHPI_EC_THRESHOLD Completeness (upper crit; no upper major) testcase */ { event_state = SAHPI_ES_UPPER_MINOR | SAHPI_ES_UPPER_CRIT; if (oh_valid_eventstate(event_state, SAHPI_EC_THRESHOLD, SAHPI_TRUE)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); return -1; } } /* oh_valid_eventstate: SAHPI_EC_THRESHOLD Completeness (upper major; no upper minor) testcase */ { event_state = SAHPI_ES_UPPER_MAJOR; if (oh_valid_eventstate(event_state, SAHPI_EC_THRESHOLD, SAHPI_TRUE)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); return -1; } } #endif /* oh_valid_eventstate: SAHPI_EC_STATE exclusion testcase */ { event_state = SAHPI_ES_STATE_DEASSERTED | SAHPI_ES_STATE_ASSERTED; if (oh_valid_eventstate(event_state, SAHPI_EC_STATE, SAHPI_TRUE)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); return -1; } } /* oh_valid_eventstate: SAHPI_EC_PRED_FAIL exclusion testcase */ { event_state = SAHPI_ES_PRED_FAILURE_DEASSERT | SAHPI_ES_PRED_FAILURE_ASSERT; if (oh_valid_eventstate(event_state, SAHPI_EC_PRED_FAIL, SAHPI_TRUE)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); return -1; } } /* oh_valid_eventstate: SAHPI_EC_LIMIT exclusion testcase */ { event_state = SAHPI_ES_LIMIT_NOT_EXCEEDED | SAHPI_ES_LIMIT_EXCEEDED; if (oh_valid_eventstate(event_state, SAHPI_EC_LIMIT, SAHPI_TRUE)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); return -1; } } /* oh_valid_eventstate: SAHPI_EC_PERFORMANCE exclusion testcase */ { event_state = SAHPI_ES_PERFORMANCE_MET | SAHPI_ES_PERFORMANCE_LAGS; if (oh_valid_eventstate(event_state, SAHPI_EC_PERFORMANCE, SAHPI_TRUE)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); return -1; } } /* oh_valid_eventstate: SAHPI_EC_PRESENCE exclusion testcase */ { event_state = SAHPI_ES_ABSENT | SAHPI_ES_PRESENT; if (oh_valid_eventstate(event_state, SAHPI_EC_PRESENCE, SAHPI_TRUE)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); return -1; } } /* oh_valid_eventstate: SAHPI_EC_ENABLE exclusion testcase */ { event_state = SAHPI_ES_DISABLED | SAHPI_ES_ENABLED; if (oh_valid_eventstate(event_state, SAHPI_EC_ENABLE, SAHPI_TRUE)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); return -1; } } /* oh_valid_eventstate: SAHPI_EC_REDUNDANCY - SAHPI_ES_FULLY_REDUNDANT exclusion testcase */ { event_state = SAHPI_ES_FULLY_REDUNDANT | SAHPI_ES_REDUNDANCY_LOST; if (oh_valid_eventstate(event_state, SAHPI_EC_REDUNDANCY, SAHPI_TRUE)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); return -1; } } /* oh_valid_eventstate: SAHPI_EC_REDUNDANCY - SAHPI_ES_REDUNDANCY_DEGRADED exclusion testcase */ { event_state = SAHPI_ES_REDUNDANCY_DEGRADED | SAHPI_ES_REDUNDANCY_LOST_SUFFICIENT_RESOURCES; if (oh_valid_eventstate(event_state, SAHPI_EC_REDUNDANCY, SAHPI_TRUE)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); return -1; } } /* oh_valid_eventstate: SAHPI_EC_REDUNDANCY - SAHPI_ES_REDUNDANCY_LOST exclusion testcase */ { event_state = SAHPI_ES_REDUNDANCY_LOST | SAHPI_ES_REDUNDANCY_DEGRADED_FROM_FULL; if (oh_valid_eventstate(event_state, SAHPI_EC_REDUNDANCY, SAHPI_TRUE)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); return -1; } } /* oh_valid_eventstate: SAHPI_EC_REDUNDANCY - SAHPI_ES_REDUNDANCY_DEGRADED_FROM_FULL exclusion testcase */ { event_state = SAHPI_ES_REDUNDANCY_DEGRADED | SAHPI_ES_REDUNDANCY_DEGRADED_FROM_FULL | SAHPI_ES_REDUNDANCY_DEGRADED_FROM_NON; if (oh_valid_eventstate(event_state, SAHPI_EC_REDUNDANCY, SAHPI_TRUE)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); return -1; } } /* oh_valid_eventstate: SAHPI_EC_REDUNDANCY - SAHPI_ES_REDUNDANCY_LOST_SUFFICIENT_RESOURCES exclusion testcase */ { event_state = SAHPI_ES_REDUNDANCY_LOST | SAHPI_ES_REDUNDANCY_LOST_SUFFICIENT_RESOURCES | SAHPI_ES_NON_REDUNDANT_SUFFICIENT_RESOURCES; if (oh_valid_eventstate(event_state, SAHPI_EC_REDUNDANCY, SAHPI_TRUE)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); return -1; } } /****************************** * oh_valid_add_event testcases ******************************/ { SaHpiEventT default_event, event; memset(&default_event, 0, sizeof(SaHpiEventT)); default_event.Source = SAHPI_UNSPECIFIED_RESOURCE_ID; default_event.EventType = SAHPI_ET_USER; default_event.Severity = SAHPI_CRITICAL; default_event.EventDataUnion.UserEvent.UserEventData.DataType = SAHPI_TL_TYPE_TEXT; default_event.EventDataUnion.UserEvent.UserEventData.Language = SAHPI_LANG_ENGLISH; default_event.EventDataUnion.UserEvent.UserEventData.DataLength = strlen("Test"); strncpy((char *)(default_event.EventDataUnion.UserEvent.UserEventData.Data), "Test", strlen("Test")); /* oh_valid_add_event: Normal testcase */ event = default_event; expected_err = SA_OK; err = oh_valid_addevent(&event); if (err != expected_err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } /* oh_valid_add_event: Bad Source testcase */ event = default_event; event.Source = 1; expected_err = SA_ERR_HPI_INVALID_PARAMS; err = oh_valid_addevent(&event); if (err != expected_err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } /* oh_valid_add_event: Bad Type testcase */ event = default_event; event.EventType = BAD_TYPE; expected_err = SA_ERR_HPI_INVALID_PARAMS; err = oh_valid_addevent(&event); if (err != expected_err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } /* oh_valid_add_event: Bad Text testcase */ event = default_event; event.EventDataUnion.UserEvent.UserEventData.DataType = SAHPI_TL_TYPE_TEXT; event.EventDataUnion.UserEvent.UserEventData.Language = BAD_TYPE; expected_err = SA_ERR_HPI_INVALID_PARAMS; err = oh_valid_addevent(&event); if (err != expected_err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%s\n", oh_lookup_error(err)); return -1; } } return 0; } openhpi-2.14.1/utils/t/sahpi/sahpi_struct_idrfield_test.c0000644000076400007640000000625311302567130020461 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * pdphan */ #include #include #include #include #include int main(int argc, char **argv) { SaErrorT err; SaHpiIdrFieldT thisIdrField; SaHpiBoolT test1Fail = SAHPI_FALSE, test2Fail = SAHPI_FALSE, test3Fail = SAHPI_FALSE, test4Fail = SAHPI_FALSE, test5Fail = SAHPI_FALSE; FILE *fp; const char *name = "/tmp/idrfieldtmp"; const char *mode = "a"; fp = fopen(name, mode); if (fp == NULL) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); return -1; } /* ------------------------------------------------ */ /* NULL Pointer tests */ /* ------------------------------------------------ */ err = oh_fprint_idrfield(NULL, &thisIdrField, 3); if (err != SA_ERR_HPI_INVALID_PARAMS) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); test1Fail = SAHPI_TRUE; } err = oh_fprint_idrfield(fp, NULL, 3); if (err != SA_ERR_HPI_INVALID_PARAMS) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); test2Fail = SAHPI_TRUE; } err = oh_fprint_idrfield(NULL , NULL, 3); if (err != SA_ERR_HPI_INVALID_PARAMS) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); test3Fail = SAHPI_TRUE; } /* ------------------------------------------------ */ /* Normal write to file test */ /* ------------------------------------------------ */ thisIdrField.AreaId = 1; thisIdrField.FieldId = 1; thisIdrField.Type = 22; thisIdrField.ReadOnly = SAHPI_FALSE; thisIdrField.Field.DataType = SAHPI_TL_TYPE_TEXT; thisIdrField.Field.Language = SAHPI_LANG_IRISH; thisIdrField.Field.DataLength = sizeof("This is a test!"); snprintf((char *)thisIdrField.Field.Data, thisIdrField.Field.DataLength, "This is a test!"); err = oh_fprint_idrfield(fp, &thisIdrField, 3); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); test4Fail = SAHPI_TRUE; } /* ------------------------------------------------ */ /* Normal write to stdout test */ /* ------------------------------------------------ */ err = oh_print_idrfield(&thisIdrField, 3); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); test5Fail = SAHPI_TRUE; } /* ------------------------------------------------ */ /* Write to invalid file handle test */ /* ------------------------------------------------ */ /* TBD */ fclose(fp); unlink(name); if (!test1Fail && !test2Fail && !test3Fail && !test4Fail && !test5Fail) return(0); else return(-1); } openhpi-2.14.1/utils/t/sahpi/sahpi_struct_rdr_test.c0000644000076400007640000001776711302567130017502 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * pdphan */ #include #include #include #include #include int main(int argc, char **argv) { SaErrorT err; SaHpiBoolT testFail = SAHPI_FALSE; SaHpiRdrT thisRdr = { .RecordId = 88, .RdrType = SAHPI_NO_RECORD, .Entity = { .Entry[0] = { .EntityType = SAHPI_ENT_SUBBOARD_CARRIER_BLADE, .EntityLocation = 14 }, { .EntityType = SAHPI_ENT_SUB_CHASSIS, .EntityLocation = 15 }, { .EntityType = SAHPI_ENT_SYSTEM_CHASSIS, .EntityLocation = 16 }, { .EntityType = SAHPI_ENT_ROOT, .EntityLocation = 17 } }, .IsFru = SAHPI_TRUE, /* .RdrTypeUnion == init later for individual rdr type */ .IdString = { .DataType = SAHPI_TL_TYPE_TEXT, .Language = SAHPI_LANG_ENGLISH, .DataLength = 32, /* Incorrectly set on purpose */ .Data = "This is a oh_fprint_rdr test!" } }; memset(&thisRdr.RdrTypeUnion, 0, sizeof(SaHpiRdrTypeUnionT)); FILE *fp; const char *name = "/tmp/idrareatmp"; const char *mode = "a"; fp = fopen(name, mode); if (fp == NULL) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); return -1; } /* ------------------------------------------------ */ /* NULL Pointer tests */ /* ------------------------------------------------ */ err = oh_fprint_rdr(NULL , &thisRdr, 0); if (err != SA_ERR_HPI_INVALID_PARAMS) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); testFail = SAHPI_TRUE; } err = oh_fprint_rdr(fp, NULL, 1); if (err != SA_ERR_HPI_INVALID_PARAMS) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); testFail = SAHPI_TRUE; } err = oh_fprint_rdr(NULL , NULL, 2); if (err != SA_ERR_HPI_INVALID_PARAMS) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); testFail = SAHPI_TRUE; } /* ------------------------------------------------ */ /* Normal write to file test */ /* ------------------------------------------------ */ err = oh_fprint_rdr(fp, &thisRdr, 3); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); testFail = SAHPI_TRUE; } /* ------------------------------------------------ */ /* Normal write to stdout test */ /* ------------------------------------------------ */ err = oh_print_rdr(&thisRdr, 3); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); testFail = SAHPI_TRUE; } /* ------------------------------------------------ */ /* Normal write SAHPI_CTRL_RDR stdout test */ /* ------------------------------------------------ */ thisRdr.RdrType = SAHPI_CTRL_RDR; SaHpiCtrlRecT thisctrlrec = { .Num = 102, .OutputType = SAHPI_CTRL_POWER_INTERLOCK, .Type = SAHPI_CTRL_TYPE_DIGITAL, .TypeUnion.Digital.Default = SAHPI_CTRL_STATE_ON, .DefaultMode = { .Mode= SAHPI_CTRL_MODE_AUTO, .ReadOnly = SAHPI_TRUE }, .WriteOnly = SAHPI_FALSE, .Oem = 0 }; memcpy(&thisRdr.RdrTypeUnion.CtrlRec, &thisctrlrec, sizeof(SaHpiCtrlRecT)); err = oh_print_rdr(&thisRdr, 3); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); testFail = SAHPI_TRUE; } /* ------------------------------------------------ */ /* Normal write SAHPI_SENSOR_RDR stdout test */ /* ------------------------------------------------ */ thisRdr.RdrType = SAHPI_SENSOR_RDR; SaHpiSensorRecT thissensorrec = { .Num = 1, .Type = SAHPI_VOLTAGE, .Category = SAHPI_EC_THRESHOLD, .Events = SAHPI_ES_LOWER_MAJOR | SAHPI_ES_LOWER_MINOR, .EventCtrl = SAHPI_SEC_READ_ONLY, .DataFormat = { .IsSupported = SAHPI_TRUE, .ReadingType = SAHPI_SENSOR_READING_TYPE_INT64, .BaseUnits = SAHPI_SU_VOLTS, .ModifierUnits = SAHPI_SU_SECOND, .ModifierUse = SAHPI_SMUU_BASIC_TIMES_MODIFIER, .Percentage = SAHPI_FALSE, .Range = { .Flags = SAHPI_SRF_MIN | SAHPI_SRF_MAX | SAHPI_SRF_NOMINAL | SAHPI_SRF_NORMAL_MIN | SAHPI_SRF_NORMAL_MAX, .Min = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_INT64, .Value.SensorInt64 = 0 }, .Max = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_INT64, .Value.SensorInt64 = 100 }, .Nominal = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_INT64, .Value.SensorInt64 = 50 }, .NormalMax = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_INT64, .Value.SensorInt64 = 75 }, .NormalMin = { .IsSupported = SAHPI_TRUE, .Type = SAHPI_SENSOR_READING_TYPE_INT64, .Value.SensorInt64 = 25 } }, .AccuracyFactor = 0.05 }, .Oem = 0xFF, .ThresholdDefn = { .IsAccessible = SAHPI_TRUE, .ReadThold = SAHPI_STM_LOW_MINOR | SAHPI_STM_LOW_MAJOR | SAHPI_STM_LOW_CRIT | SAHPI_STM_LOW_HYSTERESIS, .WriteThold = SAHPI_STM_UP_MINOR | SAHPI_STM_UP_MAJOR | SAHPI_STM_UP_CRIT | SAHPI_STM_UP_HYSTERESIS, .Nonlinear = SAHPI_TRUE } }; memcpy(&thisRdr.RdrTypeUnion.SensorRec, &thissensorrec, sizeof(SaHpiSensorRecT)); err = oh_print_rdr(&thisRdr, 3); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); testFail = SAHPI_TRUE; } /* ------------------------------------------------ */ /* Normal write SAHPI_INVENTORY_RDR stdout test */ /* ------------------------------------------------ */ thisRdr.RdrType = SAHPI_INVENTORY_RDR; SaHpiInventoryRecT thisinvrec = { .IdrId = 22, .Persistent = SAHPI_FALSE, .Oem = 32 }; memcpy(&thisRdr.RdrTypeUnion.InventoryRec, &thisinvrec, sizeof(SaHpiInventoryRecT)); err = oh_print_rdr(&thisRdr, 3); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); testFail = SAHPI_TRUE; } /* ------------------------------------------------ */ /* Normal write SAHPI_WATCHDOG_RDR stdout test */ /* ------------------------------------------------ */ thisRdr.RdrType = SAHPI_WATCHDOG_RDR; SaHpiWatchdogRecT thiswdogrec = { .WatchdogNum = 42, .Oem = 52 }; memcpy(&thisRdr.RdrTypeUnion.WatchdogRec, &thiswdogrec, sizeof(SaHpiWatchdogRecT)); err = oh_print_rdr(&thisRdr, 3); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); testFail = SAHPI_TRUE; } /* ------------------------------------------------ */ /* Normal write SAHPI_ANNUNCIATOR_RDR stdout test */ /* ------------------------------------------------ */ thisRdr.RdrType = SAHPI_ANNUNCIATOR_RDR; SaHpiAnnunciatorRecT thisannrec = { .AnnunciatorNum = 62, .AnnunciatorType = SAHPI_ANNUNCIATOR_TYPE_LED, .ModeReadOnly = SAHPI_TRUE, .MaxConditions= 1, .Oem = 72 }; memcpy(&thisRdr.RdrTypeUnion.AnnunciatorRec, &thisannrec, sizeof(SaHpiAnnunciatorRecT)); err = oh_print_rdr(&thisRdr, 3); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); testFail = SAHPI_TRUE; } /* ------------------------------------------------ */ /* Write to invalid file handle test */ /* ------------------------------------------------ */ /* TBD */ fclose(fp); unlink(name); if (testFail) return(-1); else return(0); } openhpi-2.14.1/utils/t/sahpi/sahpi_enum_utils_test.c0000644000076400007640000244060211302567130017461 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * Steve Sherman */ /******************************************************************* * WARNING! This file is auto-magically generated by: * ./SaHpi2code.pl. * Do not change this file manually. Update script instead *******************************************************************/ #include #include #include #include #define BAD_ENUM_VALUE -1 int main(int argc, char **argv) { char *expected_str; char *str; /* SaHpiLanguageT - SAHPI_LANG_UNDEF testcase */ { SaHpiLanguageT value = SAHPI_LANG_UNDEF; SaHpiLanguageT enum_type; expected_str = "UNDEF"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_language(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_language(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_LANG_UNDEF != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiLanguageT - SAHPI_LANG_AFAR testcase */ { SaHpiLanguageT value = SAHPI_LANG_AFAR; SaHpiLanguageT enum_type; expected_str = "AFAR"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_language(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_language(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_LANG_AFAR != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiLanguageT - SAHPI_LANG_ABKHAZIAN testcase */ { SaHpiLanguageT value = SAHPI_LANG_ABKHAZIAN; SaHpiLanguageT enum_type; expected_str = "ABKHAZIAN"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_language(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_language(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_LANG_ABKHAZIAN != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiLanguageT - SAHPI_LANG_AFRIKAANS testcase */ { SaHpiLanguageT value = SAHPI_LANG_AFRIKAANS; SaHpiLanguageT enum_type; expected_str = "AFRIKAANS"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_language(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_language(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_LANG_AFRIKAANS != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiLanguageT - SAHPI_LANG_AMHARIC testcase */ { SaHpiLanguageT value = SAHPI_LANG_AMHARIC; SaHpiLanguageT enum_type; expected_str = "AMHARIC"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_language(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_language(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_LANG_AMHARIC != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiLanguageT - SAHPI_LANG_ARABIC testcase */ { SaHpiLanguageT value = SAHPI_LANG_ARABIC; SaHpiLanguageT enum_type; expected_str = "ARABIC"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_language(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_language(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_LANG_ARABIC != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiLanguageT - SAHPI_LANG_ASSAMESE testcase */ { SaHpiLanguageT value = SAHPI_LANG_ASSAMESE; SaHpiLanguageT enum_type; expected_str = "ASSAMESE"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_language(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_language(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_LANG_ASSAMESE != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiLanguageT - SAHPI_LANG_AYMARA testcase */ { SaHpiLanguageT value = SAHPI_LANG_AYMARA; SaHpiLanguageT enum_type; expected_str = "AYMARA"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_language(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_language(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_LANG_AYMARA != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiLanguageT - SAHPI_LANG_AZERBAIJANI testcase */ { SaHpiLanguageT value = SAHPI_LANG_AZERBAIJANI; SaHpiLanguageT enum_type; expected_str = "AZERBAIJANI"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_language(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_language(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_LANG_AZERBAIJANI != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiLanguageT - SAHPI_LANG_BASHKIR testcase */ { SaHpiLanguageT value = SAHPI_LANG_BASHKIR; SaHpiLanguageT enum_type; expected_str = "BASHKIR"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_language(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_language(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_LANG_BASHKIR != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiLanguageT - SAHPI_LANG_BYELORUSSIAN testcase */ { SaHpiLanguageT value = SAHPI_LANG_BYELORUSSIAN; SaHpiLanguageT enum_type; expected_str = "BYELORUSSIAN"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_language(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_language(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_LANG_BYELORUSSIAN != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiLanguageT - SAHPI_LANG_BULGARIAN testcase */ { SaHpiLanguageT value = SAHPI_LANG_BULGARIAN; SaHpiLanguageT enum_type; expected_str = "BULGARIAN"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_language(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_language(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_LANG_BULGARIAN != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiLanguageT - SAHPI_LANG_BIHARI testcase */ { SaHpiLanguageT value = SAHPI_LANG_BIHARI; SaHpiLanguageT enum_type; expected_str = "BIHARI"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_language(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_language(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_LANG_BIHARI != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiLanguageT - SAHPI_LANG_BISLAMA testcase */ { SaHpiLanguageT value = SAHPI_LANG_BISLAMA; SaHpiLanguageT enum_type; expected_str = "BISLAMA"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_language(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_language(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_LANG_BISLAMA != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiLanguageT - SAHPI_LANG_BENGALI testcase */ { SaHpiLanguageT value = SAHPI_LANG_BENGALI; SaHpiLanguageT enum_type; expected_str = "BENGALI"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_language(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_language(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_LANG_BENGALI != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiLanguageT - SAHPI_LANG_TIBETAN testcase */ { SaHpiLanguageT value = SAHPI_LANG_TIBETAN; SaHpiLanguageT enum_type; expected_str = "TIBETAN"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_language(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_language(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_LANG_TIBETAN != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiLanguageT - SAHPI_LANG_BRETON testcase */ { SaHpiLanguageT value = SAHPI_LANG_BRETON; SaHpiLanguageT enum_type; expected_str = "BRETON"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_language(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_language(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_LANG_BRETON != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiLanguageT - SAHPI_LANG_CATALAN testcase */ { SaHpiLanguageT value = SAHPI_LANG_CATALAN; SaHpiLanguageT enum_type; expected_str = "CATALAN"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_language(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_language(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_LANG_CATALAN != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiLanguageT - SAHPI_LANG_CORSICAN testcase */ { SaHpiLanguageT value = SAHPI_LANG_CORSICAN; SaHpiLanguageT enum_type; expected_str = "CORSICAN"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_language(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_language(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_LANG_CORSICAN != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiLanguageT - SAHPI_LANG_CZECH testcase */ { SaHpiLanguageT value = SAHPI_LANG_CZECH; SaHpiLanguageT enum_type; expected_str = "CZECH"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_language(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_language(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_LANG_CZECH != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiLanguageT - SAHPI_LANG_WELSH testcase */ { SaHpiLanguageT value = SAHPI_LANG_WELSH; SaHpiLanguageT enum_type; expected_str = "WELSH"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_language(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_language(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_LANG_WELSH != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiLanguageT - SAHPI_LANG_DANISH testcase */ { SaHpiLanguageT value = SAHPI_LANG_DANISH; SaHpiLanguageT enum_type; expected_str = "DANISH"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_language(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_language(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_LANG_DANISH != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiLanguageT - SAHPI_LANG_GERMAN testcase */ { SaHpiLanguageT value = SAHPI_LANG_GERMAN; SaHpiLanguageT enum_type; expected_str = "GERMAN"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_language(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_language(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_LANG_GERMAN != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiLanguageT - SAHPI_LANG_BHUTANI testcase */ { SaHpiLanguageT value = SAHPI_LANG_BHUTANI; SaHpiLanguageT enum_type; expected_str = "BHUTANI"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_language(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_language(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_LANG_BHUTANI != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiLanguageT - SAHPI_LANG_GREEK testcase */ { SaHpiLanguageT value = SAHPI_LANG_GREEK; SaHpiLanguageT enum_type; expected_str = "GREEK"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_language(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_language(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_LANG_GREEK != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiLanguageT - SAHPI_LANG_ENGLISH testcase */ { SaHpiLanguageT value = SAHPI_LANG_ENGLISH; SaHpiLanguageT enum_type; expected_str = "ENGLISH"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_language(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_language(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_LANG_ENGLISH != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiLanguageT - SAHPI_LANG_ESPERANTO testcase */ { SaHpiLanguageT value = SAHPI_LANG_ESPERANTO; SaHpiLanguageT enum_type; expected_str = "ESPERANTO"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_language(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_language(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_LANG_ESPERANTO != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiLanguageT - SAHPI_LANG_SPANISH testcase */ { SaHpiLanguageT value = SAHPI_LANG_SPANISH; SaHpiLanguageT enum_type; expected_str = "SPANISH"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_language(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_language(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_LANG_SPANISH != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiLanguageT - SAHPI_LANG_ESTONIAN testcase */ { SaHpiLanguageT value = SAHPI_LANG_ESTONIAN; SaHpiLanguageT enum_type; expected_str = "ESTONIAN"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_language(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_language(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_LANG_ESTONIAN != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiLanguageT - SAHPI_LANG_BASQUE testcase */ { SaHpiLanguageT value = SAHPI_LANG_BASQUE; SaHpiLanguageT enum_type; expected_str = "BASQUE"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_language(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_language(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_LANG_BASQUE != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiLanguageT - SAHPI_LANG_PERSIAN testcase */ { SaHpiLanguageT value = SAHPI_LANG_PERSIAN; SaHpiLanguageT enum_type; expected_str = "PERSIAN"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_language(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_language(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_LANG_PERSIAN != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiLanguageT - SAHPI_LANG_FINNISH testcase */ { SaHpiLanguageT value = SAHPI_LANG_FINNISH; SaHpiLanguageT enum_type; expected_str = "FINNISH"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_language(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_language(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_LANG_FINNISH != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiLanguageT - SAHPI_LANG_FIJI testcase */ { SaHpiLanguageT value = SAHPI_LANG_FIJI; SaHpiLanguageT enum_type; expected_str = "FIJI"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_language(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_language(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_LANG_FIJI != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiLanguageT - SAHPI_LANG_FAEROESE testcase */ { SaHpiLanguageT value = SAHPI_LANG_FAEROESE; SaHpiLanguageT enum_type; expected_str = "FAEROESE"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_language(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_language(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_LANG_FAEROESE != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiLanguageT - SAHPI_LANG_FRENCH testcase */ { SaHpiLanguageT value = SAHPI_LANG_FRENCH; SaHpiLanguageT enum_type; expected_str = "FRENCH"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_language(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_language(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_LANG_FRENCH != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiLanguageT - SAHPI_LANG_FRISIAN testcase */ { SaHpiLanguageT value = SAHPI_LANG_FRISIAN; SaHpiLanguageT enum_type; expected_str = "FRISIAN"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_language(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_language(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_LANG_FRISIAN != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiLanguageT - SAHPI_LANG_IRISH testcase */ { SaHpiLanguageT value = SAHPI_LANG_IRISH; SaHpiLanguageT enum_type; expected_str = "IRISH"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_language(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_language(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_LANG_IRISH != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiLanguageT - SAHPI_LANG_SCOTSGAELIC testcase */ { SaHpiLanguageT value = SAHPI_LANG_SCOTSGAELIC; SaHpiLanguageT enum_type; expected_str = "SCOTSGAELIC"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_language(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_language(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_LANG_SCOTSGAELIC != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiLanguageT - SAHPI_LANG_GALICIAN testcase */ { SaHpiLanguageT value = SAHPI_LANG_GALICIAN; SaHpiLanguageT enum_type; expected_str = "GALICIAN"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_language(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_language(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_LANG_GALICIAN != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiLanguageT - SAHPI_LANG_GUARANI testcase */ { SaHpiLanguageT value = SAHPI_LANG_GUARANI; SaHpiLanguageT enum_type; expected_str = "GUARANI"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_language(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_language(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_LANG_GUARANI != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiLanguageT - SAHPI_LANG_GUJARATI testcase */ { SaHpiLanguageT value = SAHPI_LANG_GUJARATI; SaHpiLanguageT enum_type; expected_str = "GUJARATI"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_language(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_language(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_LANG_GUJARATI != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiLanguageT - SAHPI_LANG_HAUSA testcase */ { SaHpiLanguageT value = SAHPI_LANG_HAUSA; SaHpiLanguageT enum_type; expected_str = "HAUSA"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_language(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_language(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_LANG_HAUSA != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiLanguageT - SAHPI_LANG_HINDI testcase */ { SaHpiLanguageT value = SAHPI_LANG_HINDI; SaHpiLanguageT enum_type; expected_str = "HINDI"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_language(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_language(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_LANG_HINDI != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiLanguageT - SAHPI_LANG_CROATIAN testcase */ { SaHpiLanguageT value = SAHPI_LANG_CROATIAN; SaHpiLanguageT enum_type; expected_str = "CROATIAN"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_language(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_language(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_LANG_CROATIAN != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiLanguageT - SAHPI_LANG_HUNGARIAN testcase */ { SaHpiLanguageT value = SAHPI_LANG_HUNGARIAN; SaHpiLanguageT enum_type; expected_str = "HUNGARIAN"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_language(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_language(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_LANG_HUNGARIAN != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiLanguageT - SAHPI_LANG_ARMENIAN testcase */ { SaHpiLanguageT value = SAHPI_LANG_ARMENIAN; SaHpiLanguageT enum_type; expected_str = "ARMENIAN"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_language(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_language(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_LANG_ARMENIAN != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiLanguageT - SAHPI_LANG_INTERLINGUA testcase */ { SaHpiLanguageT value = SAHPI_LANG_INTERLINGUA; SaHpiLanguageT enum_type; expected_str = "INTERLINGUA"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_language(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_language(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_LANG_INTERLINGUA != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiLanguageT - SAHPI_LANG_INTERLINGUE testcase */ { SaHpiLanguageT value = SAHPI_LANG_INTERLINGUE; SaHpiLanguageT enum_type; expected_str = "INTERLINGUE"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_language(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_language(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_LANG_INTERLINGUE != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiLanguageT - SAHPI_LANG_INUPIAK testcase */ { SaHpiLanguageT value = SAHPI_LANG_INUPIAK; SaHpiLanguageT enum_type; expected_str = "INUPIAK"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_language(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_language(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_LANG_INUPIAK != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiLanguageT - SAHPI_LANG_INDONESIAN testcase */ { SaHpiLanguageT value = SAHPI_LANG_INDONESIAN; SaHpiLanguageT enum_type; expected_str = "INDONESIAN"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_language(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_language(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_LANG_INDONESIAN != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiLanguageT - SAHPI_LANG_ICELANDIC testcase */ { SaHpiLanguageT value = SAHPI_LANG_ICELANDIC; SaHpiLanguageT enum_type; expected_str = "ICELANDIC"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_language(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_language(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_LANG_ICELANDIC != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiLanguageT - SAHPI_LANG_ITALIAN testcase */ { SaHpiLanguageT value = SAHPI_LANG_ITALIAN; SaHpiLanguageT enum_type; expected_str = "ITALIAN"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_language(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_language(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_LANG_ITALIAN != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiLanguageT - SAHPI_LANG_HEBREW testcase */ { SaHpiLanguageT value = SAHPI_LANG_HEBREW; SaHpiLanguageT enum_type; expected_str = "HEBREW"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_language(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_language(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_LANG_HEBREW != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiLanguageT - SAHPI_LANG_JAPANESE testcase */ { SaHpiLanguageT value = SAHPI_LANG_JAPANESE; SaHpiLanguageT enum_type; expected_str = "JAPANESE"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_language(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_language(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_LANG_JAPANESE != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiLanguageT - SAHPI_LANG_YIDDISH testcase */ { SaHpiLanguageT value = SAHPI_LANG_YIDDISH; SaHpiLanguageT enum_type; expected_str = "YIDDISH"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_language(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_language(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_LANG_YIDDISH != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiLanguageT - SAHPI_LANG_JAVANESE testcase */ { SaHpiLanguageT value = SAHPI_LANG_JAVANESE; SaHpiLanguageT enum_type; expected_str = "JAVANESE"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_language(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_language(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_LANG_JAVANESE != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiLanguageT - SAHPI_LANG_GEORGIAN testcase */ { SaHpiLanguageT value = SAHPI_LANG_GEORGIAN; SaHpiLanguageT enum_type; expected_str = "GEORGIAN"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_language(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_language(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_LANG_GEORGIAN != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiLanguageT - SAHPI_LANG_KAZAKH testcase */ { SaHpiLanguageT value = SAHPI_LANG_KAZAKH; SaHpiLanguageT enum_type; expected_str = "KAZAKH"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_language(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_language(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_LANG_KAZAKH != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiLanguageT - SAHPI_LANG_GREENLANDIC testcase */ { SaHpiLanguageT value = SAHPI_LANG_GREENLANDIC; SaHpiLanguageT enum_type; expected_str = "GREENLANDIC"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_language(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_language(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_LANG_GREENLANDIC != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiLanguageT - SAHPI_LANG_CAMBODIAN testcase */ { SaHpiLanguageT value = SAHPI_LANG_CAMBODIAN; SaHpiLanguageT enum_type; expected_str = "CAMBODIAN"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_language(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_language(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_LANG_CAMBODIAN != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiLanguageT - SAHPI_LANG_KANNADA testcase */ { SaHpiLanguageT value = SAHPI_LANG_KANNADA; SaHpiLanguageT enum_type; expected_str = "KANNADA"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_language(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_language(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_LANG_KANNADA != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiLanguageT - SAHPI_LANG_KOREAN testcase */ { SaHpiLanguageT value = SAHPI_LANG_KOREAN; SaHpiLanguageT enum_type; expected_str = "KOREAN"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_language(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_language(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_LANG_KOREAN != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiLanguageT - SAHPI_LANG_KASHMIRI testcase */ { SaHpiLanguageT value = SAHPI_LANG_KASHMIRI; SaHpiLanguageT enum_type; expected_str = "KASHMIRI"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_language(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_language(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_LANG_KASHMIRI != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiLanguageT - SAHPI_LANG_KURDISH testcase */ { SaHpiLanguageT value = SAHPI_LANG_KURDISH; SaHpiLanguageT enum_type; expected_str = "KURDISH"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_language(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_language(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_LANG_KURDISH != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiLanguageT - SAHPI_LANG_KIRGHIZ testcase */ { SaHpiLanguageT value = SAHPI_LANG_KIRGHIZ; SaHpiLanguageT enum_type; expected_str = "KIRGHIZ"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_language(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_language(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_LANG_KIRGHIZ != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiLanguageT - SAHPI_LANG_LATIN testcase */ { SaHpiLanguageT value = SAHPI_LANG_LATIN; SaHpiLanguageT enum_type; expected_str = "LATIN"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_language(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_language(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_LANG_LATIN != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiLanguageT - SAHPI_LANG_LINGALA testcase */ { SaHpiLanguageT value = SAHPI_LANG_LINGALA; SaHpiLanguageT enum_type; expected_str = "LINGALA"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_language(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_language(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_LANG_LINGALA != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiLanguageT - SAHPI_LANG_LAOTHIAN testcase */ { SaHpiLanguageT value = SAHPI_LANG_LAOTHIAN; SaHpiLanguageT enum_type; expected_str = "LAOTHIAN"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_language(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_language(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_LANG_LAOTHIAN != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiLanguageT - SAHPI_LANG_LITHUANIAN testcase */ { SaHpiLanguageT value = SAHPI_LANG_LITHUANIAN; SaHpiLanguageT enum_type; expected_str = "LITHUANIAN"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_language(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_language(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_LANG_LITHUANIAN != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiLanguageT - SAHPI_LANG_LATVIANLETTISH testcase */ { SaHpiLanguageT value = SAHPI_LANG_LATVIANLETTISH; SaHpiLanguageT enum_type; expected_str = "LATVIANLETTISH"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_language(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_language(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_LANG_LATVIANLETTISH != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiLanguageT - SAHPI_LANG_MALAGASY testcase */ { SaHpiLanguageT value = SAHPI_LANG_MALAGASY; SaHpiLanguageT enum_type; expected_str = "MALAGASY"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_language(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_language(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_LANG_MALAGASY != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiLanguageT - SAHPI_LANG_MAORI testcase */ { SaHpiLanguageT value = SAHPI_LANG_MAORI; SaHpiLanguageT enum_type; expected_str = "MAORI"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_language(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_language(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_LANG_MAORI != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiLanguageT - SAHPI_LANG_MACEDONIAN testcase */ { SaHpiLanguageT value = SAHPI_LANG_MACEDONIAN; SaHpiLanguageT enum_type; expected_str = "MACEDONIAN"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_language(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_language(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_LANG_MACEDONIAN != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiLanguageT - SAHPI_LANG_MALAYALAM testcase */ { SaHpiLanguageT value = SAHPI_LANG_MALAYALAM; SaHpiLanguageT enum_type; expected_str = "MALAYALAM"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_language(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_language(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_LANG_MALAYALAM != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiLanguageT - SAHPI_LANG_MONGOLIAN testcase */ { SaHpiLanguageT value = SAHPI_LANG_MONGOLIAN; SaHpiLanguageT enum_type; expected_str = "MONGOLIAN"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_language(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_language(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_LANG_MONGOLIAN != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiLanguageT - SAHPI_LANG_MOLDAVIAN testcase */ { SaHpiLanguageT value = SAHPI_LANG_MOLDAVIAN; SaHpiLanguageT enum_type; expected_str = "MOLDAVIAN"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_language(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_language(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_LANG_MOLDAVIAN != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiLanguageT - SAHPI_LANG_MARATHI testcase */ { SaHpiLanguageT value = SAHPI_LANG_MARATHI; SaHpiLanguageT enum_type; expected_str = "MARATHI"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_language(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_language(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_LANG_MARATHI != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiLanguageT - SAHPI_LANG_MALAY testcase */ { SaHpiLanguageT value = SAHPI_LANG_MALAY; SaHpiLanguageT enum_type; expected_str = "MALAY"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_language(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_language(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_LANG_MALAY != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiLanguageT - SAHPI_LANG_MALTESE testcase */ { SaHpiLanguageT value = SAHPI_LANG_MALTESE; SaHpiLanguageT enum_type; expected_str = "MALTESE"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_language(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_language(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_LANG_MALTESE != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiLanguageT - SAHPI_LANG_BURMESE testcase */ { SaHpiLanguageT value = SAHPI_LANG_BURMESE; SaHpiLanguageT enum_type; expected_str = "BURMESE"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_language(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_language(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_LANG_BURMESE != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiLanguageT - SAHPI_LANG_NAURU testcase */ { SaHpiLanguageT value = SAHPI_LANG_NAURU; SaHpiLanguageT enum_type; expected_str = "NAURU"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_language(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_language(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_LANG_NAURU != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiLanguageT - SAHPI_LANG_NEPALI testcase */ { SaHpiLanguageT value = SAHPI_LANG_NEPALI; SaHpiLanguageT enum_type; expected_str = "NEPALI"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_language(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_language(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_LANG_NEPALI != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiLanguageT - SAHPI_LANG_DUTCH testcase */ { SaHpiLanguageT value = SAHPI_LANG_DUTCH; SaHpiLanguageT enum_type; expected_str = "DUTCH"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_language(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_language(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_LANG_DUTCH != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiLanguageT - SAHPI_LANG_NORWEGIAN testcase */ { SaHpiLanguageT value = SAHPI_LANG_NORWEGIAN; SaHpiLanguageT enum_type; expected_str = "NORWEGIAN"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_language(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_language(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_LANG_NORWEGIAN != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiLanguageT - SAHPI_LANG_OCCITAN testcase */ { SaHpiLanguageT value = SAHPI_LANG_OCCITAN; SaHpiLanguageT enum_type; expected_str = "OCCITAN"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_language(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_language(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_LANG_OCCITAN != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiLanguageT - SAHPI_LANG_AFANOROMO testcase */ { SaHpiLanguageT value = SAHPI_LANG_AFANOROMO; SaHpiLanguageT enum_type; expected_str = "AFANOROMO"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_language(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_language(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_LANG_AFANOROMO != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiLanguageT - SAHPI_LANG_ORIYA testcase */ { SaHpiLanguageT value = SAHPI_LANG_ORIYA; SaHpiLanguageT enum_type; expected_str = "ORIYA"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_language(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_language(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_LANG_ORIYA != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiLanguageT - SAHPI_LANG_PUNJABI testcase */ { SaHpiLanguageT value = SAHPI_LANG_PUNJABI; SaHpiLanguageT enum_type; expected_str = "PUNJABI"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_language(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_language(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_LANG_PUNJABI != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiLanguageT - SAHPI_LANG_POLISH testcase */ { SaHpiLanguageT value = SAHPI_LANG_POLISH; SaHpiLanguageT enum_type; expected_str = "POLISH"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_language(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_language(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_LANG_POLISH != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiLanguageT - SAHPI_LANG_PASHTOPUSHTO testcase */ { SaHpiLanguageT value = SAHPI_LANG_PASHTOPUSHTO; SaHpiLanguageT enum_type; expected_str = "PASHTOPUSHTO"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_language(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_language(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_LANG_PASHTOPUSHTO != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiLanguageT - SAHPI_LANG_PORTUGUESE testcase */ { SaHpiLanguageT value = SAHPI_LANG_PORTUGUESE; SaHpiLanguageT enum_type; expected_str = "PORTUGUESE"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_language(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_language(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_LANG_PORTUGUESE != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiLanguageT - SAHPI_LANG_QUECHUA testcase */ { SaHpiLanguageT value = SAHPI_LANG_QUECHUA; SaHpiLanguageT enum_type; expected_str = "QUECHUA"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_language(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_language(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_LANG_QUECHUA != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiLanguageT - SAHPI_LANG_RHAETOROMANCE testcase */ { SaHpiLanguageT value = SAHPI_LANG_RHAETOROMANCE; SaHpiLanguageT enum_type; expected_str = "RHAETOROMANCE"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_language(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_language(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_LANG_RHAETOROMANCE != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiLanguageT - SAHPI_LANG_KIRUNDI testcase */ { SaHpiLanguageT value = SAHPI_LANG_KIRUNDI; SaHpiLanguageT enum_type; expected_str = "KIRUNDI"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_language(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_language(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_LANG_KIRUNDI != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiLanguageT - SAHPI_LANG_ROMANIAN testcase */ { SaHpiLanguageT value = SAHPI_LANG_ROMANIAN; SaHpiLanguageT enum_type; expected_str = "ROMANIAN"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_language(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_language(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_LANG_ROMANIAN != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiLanguageT - SAHPI_LANG_RUSSIAN testcase */ { SaHpiLanguageT value = SAHPI_LANG_RUSSIAN; SaHpiLanguageT enum_type; expected_str = "RUSSIAN"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_language(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_language(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_LANG_RUSSIAN != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiLanguageT - SAHPI_LANG_KINYARWANDA testcase */ { SaHpiLanguageT value = SAHPI_LANG_KINYARWANDA; SaHpiLanguageT enum_type; expected_str = "KINYARWANDA"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_language(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_language(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_LANG_KINYARWANDA != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiLanguageT - SAHPI_LANG_SANSKRIT testcase */ { SaHpiLanguageT value = SAHPI_LANG_SANSKRIT; SaHpiLanguageT enum_type; expected_str = "SANSKRIT"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_language(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_language(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_LANG_SANSKRIT != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiLanguageT - SAHPI_LANG_SINDHI testcase */ { SaHpiLanguageT value = SAHPI_LANG_SINDHI; SaHpiLanguageT enum_type; expected_str = "SINDHI"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_language(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_language(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_LANG_SINDHI != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiLanguageT - SAHPI_LANG_SANGRO testcase */ { SaHpiLanguageT value = SAHPI_LANG_SANGRO; SaHpiLanguageT enum_type; expected_str = "SANGRO"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_language(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_language(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_LANG_SANGRO != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiLanguageT - SAHPI_LANG_SERBOCROATIAN testcase */ { SaHpiLanguageT value = SAHPI_LANG_SERBOCROATIAN; SaHpiLanguageT enum_type; expected_str = "SERBOCROATIAN"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_language(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_language(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_LANG_SERBOCROATIAN != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiLanguageT - SAHPI_LANG_SINGHALESE testcase */ { SaHpiLanguageT value = SAHPI_LANG_SINGHALESE; SaHpiLanguageT enum_type; expected_str = "SINGHALESE"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_language(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_language(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_LANG_SINGHALESE != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiLanguageT - SAHPI_LANG_SLOVAK testcase */ { SaHpiLanguageT value = SAHPI_LANG_SLOVAK; SaHpiLanguageT enum_type; expected_str = "SLOVAK"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_language(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_language(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_LANG_SLOVAK != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiLanguageT - SAHPI_LANG_SLOVENIAN testcase */ { SaHpiLanguageT value = SAHPI_LANG_SLOVENIAN; SaHpiLanguageT enum_type; expected_str = "SLOVENIAN"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_language(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_language(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_LANG_SLOVENIAN != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiLanguageT - SAHPI_LANG_SAMOAN testcase */ { SaHpiLanguageT value = SAHPI_LANG_SAMOAN; SaHpiLanguageT enum_type; expected_str = "SAMOAN"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_language(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_language(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_LANG_SAMOAN != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiLanguageT - SAHPI_LANG_SHONA testcase */ { SaHpiLanguageT value = SAHPI_LANG_SHONA; SaHpiLanguageT enum_type; expected_str = "SHONA"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_language(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_language(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_LANG_SHONA != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiLanguageT - SAHPI_LANG_SOMALI testcase */ { SaHpiLanguageT value = SAHPI_LANG_SOMALI; SaHpiLanguageT enum_type; expected_str = "SOMALI"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_language(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_language(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_LANG_SOMALI != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiLanguageT - SAHPI_LANG_ALBANIAN testcase */ { SaHpiLanguageT value = SAHPI_LANG_ALBANIAN; SaHpiLanguageT enum_type; expected_str = "ALBANIAN"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_language(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_language(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_LANG_ALBANIAN != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiLanguageT - SAHPI_LANG_SERBIAN testcase */ { SaHpiLanguageT value = SAHPI_LANG_SERBIAN; SaHpiLanguageT enum_type; expected_str = "SERBIAN"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_language(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_language(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_LANG_SERBIAN != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiLanguageT - SAHPI_LANG_SISWATI testcase */ { SaHpiLanguageT value = SAHPI_LANG_SISWATI; SaHpiLanguageT enum_type; expected_str = "SISWATI"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_language(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_language(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_LANG_SISWATI != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiLanguageT - SAHPI_LANG_SESOTHO testcase */ { SaHpiLanguageT value = SAHPI_LANG_SESOTHO; SaHpiLanguageT enum_type; expected_str = "SESOTHO"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_language(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_language(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_LANG_SESOTHO != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiLanguageT - SAHPI_LANG_SUDANESE testcase */ { SaHpiLanguageT value = SAHPI_LANG_SUDANESE; SaHpiLanguageT enum_type; expected_str = "SUDANESE"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_language(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_language(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_LANG_SUDANESE != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiLanguageT - SAHPI_LANG_SWEDISH testcase */ { SaHpiLanguageT value = SAHPI_LANG_SWEDISH; SaHpiLanguageT enum_type; expected_str = "SWEDISH"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_language(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_language(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_LANG_SWEDISH != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiLanguageT - SAHPI_LANG_SWAHILI testcase */ { SaHpiLanguageT value = SAHPI_LANG_SWAHILI; SaHpiLanguageT enum_type; expected_str = "SWAHILI"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_language(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_language(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_LANG_SWAHILI != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiLanguageT - SAHPI_LANG_TAMIL testcase */ { SaHpiLanguageT value = SAHPI_LANG_TAMIL; SaHpiLanguageT enum_type; expected_str = "TAMIL"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_language(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_language(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_LANG_TAMIL != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiLanguageT - SAHPI_LANG_TELUGU testcase */ { SaHpiLanguageT value = SAHPI_LANG_TELUGU; SaHpiLanguageT enum_type; expected_str = "TELUGU"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_language(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_language(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_LANG_TELUGU != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiLanguageT - SAHPI_LANG_TAJIK testcase */ { SaHpiLanguageT value = SAHPI_LANG_TAJIK; SaHpiLanguageT enum_type; expected_str = "TAJIK"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_language(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_language(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_LANG_TAJIK != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiLanguageT - SAHPI_LANG_THAI testcase */ { SaHpiLanguageT value = SAHPI_LANG_THAI; SaHpiLanguageT enum_type; expected_str = "THAI"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_language(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_language(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_LANG_THAI != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiLanguageT - SAHPI_LANG_TIGRINYA testcase */ { SaHpiLanguageT value = SAHPI_LANG_TIGRINYA; SaHpiLanguageT enum_type; expected_str = "TIGRINYA"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_language(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_language(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_LANG_TIGRINYA != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiLanguageT - SAHPI_LANG_TURKMEN testcase */ { SaHpiLanguageT value = SAHPI_LANG_TURKMEN; SaHpiLanguageT enum_type; expected_str = "TURKMEN"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_language(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_language(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_LANG_TURKMEN != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiLanguageT - SAHPI_LANG_TAGALOG testcase */ { SaHpiLanguageT value = SAHPI_LANG_TAGALOG; SaHpiLanguageT enum_type; expected_str = "TAGALOG"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_language(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_language(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_LANG_TAGALOG != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiLanguageT - SAHPI_LANG_SETSWANA testcase */ { SaHpiLanguageT value = SAHPI_LANG_SETSWANA; SaHpiLanguageT enum_type; expected_str = "SETSWANA"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_language(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_language(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_LANG_SETSWANA != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiLanguageT - SAHPI_LANG_TONGA testcase */ { SaHpiLanguageT value = SAHPI_LANG_TONGA; SaHpiLanguageT enum_type; expected_str = "TONGA"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_language(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_language(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_LANG_TONGA != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiLanguageT - SAHPI_LANG_TURKISH testcase */ { SaHpiLanguageT value = SAHPI_LANG_TURKISH; SaHpiLanguageT enum_type; expected_str = "TURKISH"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_language(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_language(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_LANG_TURKISH != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiLanguageT - SAHPI_LANG_TSONGA testcase */ { SaHpiLanguageT value = SAHPI_LANG_TSONGA; SaHpiLanguageT enum_type; expected_str = "TSONGA"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_language(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_language(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_LANG_TSONGA != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiLanguageT - SAHPI_LANG_TATAR testcase */ { SaHpiLanguageT value = SAHPI_LANG_TATAR; SaHpiLanguageT enum_type; expected_str = "TATAR"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_language(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_language(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_LANG_TATAR != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiLanguageT - SAHPI_LANG_TWI testcase */ { SaHpiLanguageT value = SAHPI_LANG_TWI; SaHpiLanguageT enum_type; expected_str = "TWI"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_language(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_language(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_LANG_TWI != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiLanguageT - SAHPI_LANG_UKRAINIAN testcase */ { SaHpiLanguageT value = SAHPI_LANG_UKRAINIAN; SaHpiLanguageT enum_type; expected_str = "UKRAINIAN"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_language(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_language(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_LANG_UKRAINIAN != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiLanguageT - SAHPI_LANG_URDU testcase */ { SaHpiLanguageT value = SAHPI_LANG_URDU; SaHpiLanguageT enum_type; expected_str = "URDU"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_language(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_language(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_LANG_URDU != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiLanguageT - SAHPI_LANG_UZBEK testcase */ { SaHpiLanguageT value = SAHPI_LANG_UZBEK; SaHpiLanguageT enum_type; expected_str = "UZBEK"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_language(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_language(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_LANG_UZBEK != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiLanguageT - SAHPI_LANG_VIETNAMESE testcase */ { SaHpiLanguageT value = SAHPI_LANG_VIETNAMESE; SaHpiLanguageT enum_type; expected_str = "VIETNAMESE"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_language(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_language(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_LANG_VIETNAMESE != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiLanguageT - SAHPI_LANG_VOLAPUK testcase */ { SaHpiLanguageT value = SAHPI_LANG_VOLAPUK; SaHpiLanguageT enum_type; expected_str = "VOLAPUK"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_language(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_language(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_LANG_VOLAPUK != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiLanguageT - SAHPI_LANG_WOLOF testcase */ { SaHpiLanguageT value = SAHPI_LANG_WOLOF; SaHpiLanguageT enum_type; expected_str = "WOLOF"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_language(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_language(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_LANG_WOLOF != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiLanguageT - SAHPI_LANG_XHOSA testcase */ { SaHpiLanguageT value = SAHPI_LANG_XHOSA; SaHpiLanguageT enum_type; expected_str = "XHOSA"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_language(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_language(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_LANG_XHOSA != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiLanguageT - SAHPI_LANG_YORUBA testcase */ { SaHpiLanguageT value = SAHPI_LANG_YORUBA; SaHpiLanguageT enum_type; expected_str = "YORUBA"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_language(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_language(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_LANG_YORUBA != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiLanguageT - SAHPI_LANG_CHINESE testcase */ { SaHpiLanguageT value = SAHPI_LANG_CHINESE; SaHpiLanguageT enum_type; expected_str = "CHINESE"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_language(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_language(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_LANG_CHINESE != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiLanguageT - SAHPI_LANG_ZULU testcase */ { SaHpiLanguageT value = SAHPI_LANG_ZULU; SaHpiLanguageT enum_type; expected_str = "ZULU"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_language(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_language(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_LANG_ZULU != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiLanguageT - Default testcase */ { SaHpiLanguageT value = BAD_ENUM_VALUE; expected_str = NULL; str = oh_lookup_language(value); if (str != expected_str) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s; Expected string=%s\n", str, expected_str); return -1; } } { /* SaHpiLanguageT - NULL buffer testcase */ SaErrorT err, expected_err; SaHpiTextBufferT buffer; SaHpiLanguageT enum_type; expected_err = SA_ERR_HPI_INVALID_PARAMS; err = oh_encode_language(0, &enum_type); if (err != expected_err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d; Expected error=%d\n", err, expected_err); return -1; } /* SaHpiLanguageT - Invalid type testcase */ err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, "INVALID_TYPE"); expected_err = SA_ERR_HPI_INVALID_DATA; err = oh_encode_language(&buffer, &enum_type); if (err != expected_err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d; Expected error=%d\n", err, expected_err); return -1; } } /* SaHpiTextTypeT - SAHPI_TL_TYPE_UNICODE testcase */ { SaHpiTextTypeT value = SAHPI_TL_TYPE_UNICODE; SaHpiTextTypeT enum_type; expected_str = "UNICODE"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_texttype(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_texttype(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_TL_TYPE_UNICODE != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiTextTypeT - SAHPI_TL_TYPE_BCDPLUS testcase */ { SaHpiTextTypeT value = SAHPI_TL_TYPE_BCDPLUS; SaHpiTextTypeT enum_type; expected_str = "BCDPLUS"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_texttype(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_texttype(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_TL_TYPE_BCDPLUS != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiTextTypeT - SAHPI_TL_TYPE_ASCII6 testcase */ { SaHpiTextTypeT value = SAHPI_TL_TYPE_ASCII6; SaHpiTextTypeT enum_type; expected_str = "ASCII6"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_texttype(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_texttype(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_TL_TYPE_ASCII6 != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiTextTypeT - SAHPI_TL_TYPE_TEXT testcase */ { SaHpiTextTypeT value = SAHPI_TL_TYPE_TEXT; SaHpiTextTypeT enum_type; expected_str = "TEXT"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_texttype(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_texttype(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_TL_TYPE_TEXT != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiTextTypeT - SAHPI_TL_TYPE_BINARY testcase */ { SaHpiTextTypeT value = SAHPI_TL_TYPE_BINARY; SaHpiTextTypeT enum_type; expected_str = "BINARY"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_texttype(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_texttype(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_TL_TYPE_BINARY != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiTextTypeT - Default testcase */ { SaHpiTextTypeT value = BAD_ENUM_VALUE; expected_str = NULL; str = oh_lookup_texttype(value); if (str != expected_str) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s; Expected string=%s\n", str, expected_str); return -1; } } { /* SaHpiTextTypeT - NULL buffer testcase */ SaErrorT err, expected_err; SaHpiTextBufferT buffer; SaHpiTextTypeT enum_type; expected_err = SA_ERR_HPI_INVALID_PARAMS; err = oh_encode_texttype(0, &enum_type); if (err != expected_err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d; Expected error=%d\n", err, expected_err); return -1; } /* SaHpiTextTypeT - Invalid type testcase */ err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, "INVALID_TYPE"); expected_err = SA_ERR_HPI_INVALID_DATA; err = oh_encode_texttype(&buffer, &enum_type); if (err != expected_err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d; Expected error=%d\n", err, expected_err); return -1; } } /* SaHpiEntityTypeT - SAHPI_ENT_UNSPECIFIED testcase */ { SaHpiEntityTypeT value = SAHPI_ENT_UNSPECIFIED; SaHpiEntityTypeT enum_type; expected_str = "UNSPECIFIED"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_entitytype(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_entitytype(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_ENT_UNSPECIFIED != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiEntityTypeT - SAHPI_ENT_OTHER testcase */ { SaHpiEntityTypeT value = SAHPI_ENT_OTHER; SaHpiEntityTypeT enum_type; expected_str = "OTHER"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_entitytype(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_entitytype(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_ENT_OTHER != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiEntityTypeT - SAHPI_ENT_UNKNOWN testcase */ { SaHpiEntityTypeT value = SAHPI_ENT_UNKNOWN; SaHpiEntityTypeT enum_type; expected_str = "UNKNOWN"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_entitytype(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_entitytype(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_ENT_UNKNOWN != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiEntityTypeT - SAHPI_ENT_PROCESSOR testcase */ { SaHpiEntityTypeT value = SAHPI_ENT_PROCESSOR; SaHpiEntityTypeT enum_type; expected_str = "PROCESSOR"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_entitytype(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_entitytype(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_ENT_PROCESSOR != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiEntityTypeT - SAHPI_ENT_DISK_BAY testcase */ { SaHpiEntityTypeT value = SAHPI_ENT_DISK_BAY; SaHpiEntityTypeT enum_type; expected_str = "DISK_BAY"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_entitytype(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_entitytype(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_ENT_DISK_BAY != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiEntityTypeT - SAHPI_ENT_PERIPHERAL_BAY testcase */ { SaHpiEntityTypeT value = SAHPI_ENT_PERIPHERAL_BAY; SaHpiEntityTypeT enum_type; expected_str = "PERIPHERAL_BAY"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_entitytype(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_entitytype(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_ENT_PERIPHERAL_BAY != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiEntityTypeT - SAHPI_ENT_SYS_MGMNT_MODULE testcase */ { SaHpiEntityTypeT value = SAHPI_ENT_SYS_MGMNT_MODULE; SaHpiEntityTypeT enum_type; expected_str = "SYS_MGMNT_MODULE"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_entitytype(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_entitytype(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_ENT_SYS_MGMNT_MODULE != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiEntityTypeT - SAHPI_ENT_SYSTEM_BOARD testcase */ { SaHpiEntityTypeT value = SAHPI_ENT_SYSTEM_BOARD; SaHpiEntityTypeT enum_type; expected_str = "SYSTEM_BOARD"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_entitytype(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_entitytype(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_ENT_SYSTEM_BOARD != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiEntityTypeT - SAHPI_ENT_MEMORY_MODULE testcase */ { SaHpiEntityTypeT value = SAHPI_ENT_MEMORY_MODULE; SaHpiEntityTypeT enum_type; expected_str = "MEMORY_MODULE"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_entitytype(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_entitytype(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_ENT_MEMORY_MODULE != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiEntityTypeT - SAHPI_ENT_PROCESSOR_MODULE testcase */ { SaHpiEntityTypeT value = SAHPI_ENT_PROCESSOR_MODULE; SaHpiEntityTypeT enum_type; expected_str = "PROCESSOR_MODULE"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_entitytype(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_entitytype(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_ENT_PROCESSOR_MODULE != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiEntityTypeT - SAHPI_ENT_POWER_SUPPLY testcase */ { SaHpiEntityTypeT value = SAHPI_ENT_POWER_SUPPLY; SaHpiEntityTypeT enum_type; expected_str = "POWER_SUPPLY"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_entitytype(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_entitytype(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_ENT_POWER_SUPPLY != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiEntityTypeT - SAHPI_ENT_ADD_IN_CARD testcase */ { SaHpiEntityTypeT value = SAHPI_ENT_ADD_IN_CARD; SaHpiEntityTypeT enum_type; expected_str = "ADD_IN_CARD"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_entitytype(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_entitytype(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_ENT_ADD_IN_CARD != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiEntityTypeT - SAHPI_ENT_FRONT_PANEL_BOARD testcase */ { SaHpiEntityTypeT value = SAHPI_ENT_FRONT_PANEL_BOARD; SaHpiEntityTypeT enum_type; expected_str = "FRONT_PANEL_BOARD"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_entitytype(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_entitytype(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_ENT_FRONT_PANEL_BOARD != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiEntityTypeT - SAHPI_ENT_BACK_PANEL_BOARD testcase */ { SaHpiEntityTypeT value = SAHPI_ENT_BACK_PANEL_BOARD; SaHpiEntityTypeT enum_type; expected_str = "BACK_PANEL_BOARD"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_entitytype(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_entitytype(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_ENT_BACK_PANEL_BOARD != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiEntityTypeT - SAHPI_ENT_POWER_SYSTEM_BOARD testcase */ { SaHpiEntityTypeT value = SAHPI_ENT_POWER_SYSTEM_BOARD; SaHpiEntityTypeT enum_type; expected_str = "POWER_SYSTEM_BOARD"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_entitytype(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_entitytype(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_ENT_POWER_SYSTEM_BOARD != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiEntityTypeT - SAHPI_ENT_DRIVE_BACKPLANE testcase */ { SaHpiEntityTypeT value = SAHPI_ENT_DRIVE_BACKPLANE; SaHpiEntityTypeT enum_type; expected_str = "DRIVE_BACKPLANE"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_entitytype(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_entitytype(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_ENT_DRIVE_BACKPLANE != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiEntityTypeT - SAHPI_ENT_SYS_EXPANSION_BOARD testcase */ { SaHpiEntityTypeT value = SAHPI_ENT_SYS_EXPANSION_BOARD; SaHpiEntityTypeT enum_type; expected_str = "SYS_EXPANSION_BOARD"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_entitytype(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_entitytype(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_ENT_SYS_EXPANSION_BOARD != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiEntityTypeT - SAHPI_ENT_OTHER_SYSTEM_BOARD testcase */ { SaHpiEntityTypeT value = SAHPI_ENT_OTHER_SYSTEM_BOARD; SaHpiEntityTypeT enum_type; expected_str = "OTHER_SYSTEM_BOARD"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_entitytype(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_entitytype(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_ENT_OTHER_SYSTEM_BOARD != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiEntityTypeT - SAHPI_ENT_PROCESSOR_BOARD testcase */ { SaHpiEntityTypeT value = SAHPI_ENT_PROCESSOR_BOARD; SaHpiEntityTypeT enum_type; expected_str = "PROCESSOR_BOARD"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_entitytype(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_entitytype(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_ENT_PROCESSOR_BOARD != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiEntityTypeT - SAHPI_ENT_POWER_UNIT testcase */ { SaHpiEntityTypeT value = SAHPI_ENT_POWER_UNIT; SaHpiEntityTypeT enum_type; expected_str = "POWER_UNIT"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_entitytype(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_entitytype(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_ENT_POWER_UNIT != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiEntityTypeT - SAHPI_ENT_POWER_MODULE testcase */ { SaHpiEntityTypeT value = SAHPI_ENT_POWER_MODULE; SaHpiEntityTypeT enum_type; expected_str = "POWER_MODULE"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_entitytype(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_entitytype(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_ENT_POWER_MODULE != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiEntityTypeT - SAHPI_ENT_POWER_MGMNT testcase */ { SaHpiEntityTypeT value = SAHPI_ENT_POWER_MGMNT; SaHpiEntityTypeT enum_type; expected_str = "POWER_MGMNT"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_entitytype(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_entitytype(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_ENT_POWER_MGMNT != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiEntityTypeT - SAHPI_ENT_CHASSIS_BACK_PANEL_BOARD testcase */ { SaHpiEntityTypeT value = SAHPI_ENT_CHASSIS_BACK_PANEL_BOARD; SaHpiEntityTypeT enum_type; expected_str = "CHASSIS_BACK_PANEL_BOARD"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_entitytype(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_entitytype(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_ENT_CHASSIS_BACK_PANEL_BOARD != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiEntityTypeT - SAHPI_ENT_SYSTEM_CHASSIS testcase */ { SaHpiEntityTypeT value = SAHPI_ENT_SYSTEM_CHASSIS; SaHpiEntityTypeT enum_type; expected_str = "SYSTEM_CHASSIS"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_entitytype(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_entitytype(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_ENT_SYSTEM_CHASSIS != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiEntityTypeT - SAHPI_ENT_SUB_CHASSIS testcase */ { SaHpiEntityTypeT value = SAHPI_ENT_SUB_CHASSIS; SaHpiEntityTypeT enum_type; expected_str = "SUB_CHASSIS"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_entitytype(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_entitytype(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_ENT_SUB_CHASSIS != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiEntityTypeT - SAHPI_ENT_OTHER_CHASSIS_BOARD testcase */ { SaHpiEntityTypeT value = SAHPI_ENT_OTHER_CHASSIS_BOARD; SaHpiEntityTypeT enum_type; expected_str = "OTHER_CHASSIS_BOARD"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_entitytype(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_entitytype(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_ENT_OTHER_CHASSIS_BOARD != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiEntityTypeT - SAHPI_ENT_DISK_DRIVE_BAY testcase */ { SaHpiEntityTypeT value = SAHPI_ENT_DISK_DRIVE_BAY; SaHpiEntityTypeT enum_type; expected_str = "DISK_DRIVE_BAY"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_entitytype(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_entitytype(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_ENT_DISK_DRIVE_BAY != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiEntityTypeT - SAHPI_ENT_PERIPHERAL_BAY_2 testcase */ { SaHpiEntityTypeT value = SAHPI_ENT_PERIPHERAL_BAY_2; SaHpiEntityTypeT enum_type; expected_str = "PERIPHERAL_BAY_2"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_entitytype(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_entitytype(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_ENT_PERIPHERAL_BAY_2 != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiEntityTypeT - SAHPI_ENT_DEVICE_BAY testcase */ { SaHpiEntityTypeT value = SAHPI_ENT_DEVICE_BAY; SaHpiEntityTypeT enum_type; expected_str = "DEVICE_BAY"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_entitytype(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_entitytype(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_ENT_DEVICE_BAY != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiEntityTypeT - SAHPI_ENT_COOLING_DEVICE testcase */ { SaHpiEntityTypeT value = SAHPI_ENT_COOLING_DEVICE; SaHpiEntityTypeT enum_type; expected_str = "COOLING_DEVICE"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_entitytype(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_entitytype(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_ENT_COOLING_DEVICE != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiEntityTypeT - SAHPI_ENT_COOLING_UNIT testcase */ { SaHpiEntityTypeT value = SAHPI_ENT_COOLING_UNIT; SaHpiEntityTypeT enum_type; expected_str = "COOLING_UNIT"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_entitytype(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_entitytype(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_ENT_COOLING_UNIT != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiEntityTypeT - SAHPI_ENT_INTERCONNECT testcase */ { SaHpiEntityTypeT value = SAHPI_ENT_INTERCONNECT; SaHpiEntityTypeT enum_type; expected_str = "INTERCONNECT"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_entitytype(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_entitytype(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_ENT_INTERCONNECT != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiEntityTypeT - SAHPI_ENT_MEMORY_DEVICE testcase */ { SaHpiEntityTypeT value = SAHPI_ENT_MEMORY_DEVICE; SaHpiEntityTypeT enum_type; expected_str = "MEMORY_DEVICE"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_entitytype(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_entitytype(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_ENT_MEMORY_DEVICE != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiEntityTypeT - SAHPI_ENT_SYS_MGMNT_SOFTWARE testcase */ { SaHpiEntityTypeT value = SAHPI_ENT_SYS_MGMNT_SOFTWARE; SaHpiEntityTypeT enum_type; expected_str = "SYS_MGMNT_SOFTWARE"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_entitytype(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_entitytype(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_ENT_SYS_MGMNT_SOFTWARE != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiEntityTypeT - SAHPI_ENT_BIOS testcase */ { SaHpiEntityTypeT value = SAHPI_ENT_BIOS; SaHpiEntityTypeT enum_type; expected_str = "BIOS"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_entitytype(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_entitytype(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_ENT_BIOS != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiEntityTypeT - SAHPI_ENT_OPERATING_SYSTEM testcase */ { SaHpiEntityTypeT value = SAHPI_ENT_OPERATING_SYSTEM; SaHpiEntityTypeT enum_type; expected_str = "OPERATING_SYSTEM"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_entitytype(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_entitytype(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_ENT_OPERATING_SYSTEM != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiEntityTypeT - SAHPI_ENT_SYSTEM_BUS testcase */ { SaHpiEntityTypeT value = SAHPI_ENT_SYSTEM_BUS; SaHpiEntityTypeT enum_type; expected_str = "SYSTEM_BUS"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_entitytype(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_entitytype(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_ENT_SYSTEM_BUS != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiEntityTypeT - SAHPI_ENT_GROUP testcase */ { SaHpiEntityTypeT value = SAHPI_ENT_GROUP; SaHpiEntityTypeT enum_type; expected_str = "GROUP"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_entitytype(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_entitytype(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_ENT_GROUP != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiEntityTypeT - SAHPI_ENT_REMOTE testcase */ { SaHpiEntityTypeT value = SAHPI_ENT_REMOTE; SaHpiEntityTypeT enum_type; expected_str = "REMOTE"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_entitytype(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_entitytype(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_ENT_REMOTE != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiEntityTypeT - SAHPI_ENT_EXTERNAL_ENVIRONMENT testcase */ { SaHpiEntityTypeT value = SAHPI_ENT_EXTERNAL_ENVIRONMENT; SaHpiEntityTypeT enum_type; expected_str = "EXTERNAL_ENVIRONMENT"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_entitytype(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_entitytype(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_ENT_EXTERNAL_ENVIRONMENT != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiEntityTypeT - SAHPI_ENT_BATTERY testcase */ { SaHpiEntityTypeT value = SAHPI_ENT_BATTERY; SaHpiEntityTypeT enum_type; expected_str = "BATTERY"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_entitytype(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_entitytype(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_ENT_BATTERY != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiEntityTypeT - SAHPI_ENT_CHASSIS_SPECIFIC testcase */ { SaHpiEntityTypeT value = SAHPI_ENT_CHASSIS_SPECIFIC; SaHpiEntityTypeT enum_type; expected_str = "CHASSIS_SPECIFIC"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_entitytype(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_entitytype(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_ENT_CHASSIS_SPECIFIC != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiEntityTypeT - SAHPI_ENT_BOARD_SET_SPECIFIC testcase */ { SaHpiEntityTypeT value = SAHPI_ENT_BOARD_SET_SPECIFIC; SaHpiEntityTypeT enum_type; expected_str = "BOARD_SET_SPECIFIC"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_entitytype(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_entitytype(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_ENT_BOARD_SET_SPECIFIC != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiEntityTypeT - SAHPI_ENT_OEM_SYSINT_SPECIFIC testcase */ { SaHpiEntityTypeT value = SAHPI_ENT_OEM_SYSINT_SPECIFIC; SaHpiEntityTypeT enum_type; expected_str = "OEM_SYSINT_SPECIFIC"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_entitytype(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_entitytype(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_ENT_OEM_SYSINT_SPECIFIC != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiEntityTypeT - SAHPI_ENT_ROOT testcase */ { SaHpiEntityTypeT value = SAHPI_ENT_ROOT; SaHpiEntityTypeT enum_type; expected_str = "ROOT"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_entitytype(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_entitytype(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_ENT_ROOT != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiEntityTypeT - SAHPI_ENT_RACK testcase */ { SaHpiEntityTypeT value = SAHPI_ENT_RACK; SaHpiEntityTypeT enum_type; expected_str = "RACK"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_entitytype(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_entitytype(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_ENT_RACK != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiEntityTypeT - SAHPI_ENT_SUBRACK testcase */ { SaHpiEntityTypeT value = SAHPI_ENT_SUBRACK; SaHpiEntityTypeT enum_type; expected_str = "SUBRACK"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_entitytype(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_entitytype(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_ENT_SUBRACK != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiEntityTypeT - SAHPI_ENT_COMPACTPCI_CHASSIS testcase */ { SaHpiEntityTypeT value = SAHPI_ENT_COMPACTPCI_CHASSIS; SaHpiEntityTypeT enum_type; expected_str = "COMPACTPCI_CHASSIS"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_entitytype(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_entitytype(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_ENT_COMPACTPCI_CHASSIS != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiEntityTypeT - SAHPI_ENT_ADVANCEDTCA_CHASSIS testcase */ { SaHpiEntityTypeT value = SAHPI_ENT_ADVANCEDTCA_CHASSIS; SaHpiEntityTypeT enum_type; expected_str = "ADVANCEDTCA_CHASSIS"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_entitytype(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_entitytype(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_ENT_ADVANCEDTCA_CHASSIS != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiEntityTypeT - SAHPI_ENT_RACK_MOUNTED_SERVER testcase */ { SaHpiEntityTypeT value = SAHPI_ENT_RACK_MOUNTED_SERVER; SaHpiEntityTypeT enum_type; expected_str = "RACK_MOUNTED_SERVER"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_entitytype(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_entitytype(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_ENT_RACK_MOUNTED_SERVER != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiEntityTypeT - SAHPI_ENT_SYSTEM_BLADE testcase */ { SaHpiEntityTypeT value = SAHPI_ENT_SYSTEM_BLADE; SaHpiEntityTypeT enum_type; expected_str = "SYSTEM_BLADE"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_entitytype(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_entitytype(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_ENT_SYSTEM_BLADE != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiEntityTypeT - SAHPI_ENT_SWITCH testcase */ { SaHpiEntityTypeT value = SAHPI_ENT_SWITCH; SaHpiEntityTypeT enum_type; expected_str = "SWITCH"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_entitytype(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_entitytype(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_ENT_SWITCH != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiEntityTypeT - SAHPI_ENT_SWITCH_BLADE testcase */ { SaHpiEntityTypeT value = SAHPI_ENT_SWITCH_BLADE; SaHpiEntityTypeT enum_type; expected_str = "SWITCH_BLADE"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_entitytype(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_entitytype(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_ENT_SWITCH_BLADE != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiEntityTypeT - SAHPI_ENT_SBC_BLADE testcase */ { SaHpiEntityTypeT value = SAHPI_ENT_SBC_BLADE; SaHpiEntityTypeT enum_type; expected_str = "SBC_BLADE"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_entitytype(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_entitytype(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_ENT_SBC_BLADE != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiEntityTypeT - SAHPI_ENT_IO_BLADE testcase */ { SaHpiEntityTypeT value = SAHPI_ENT_IO_BLADE; SaHpiEntityTypeT enum_type; expected_str = "IO_BLADE"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_entitytype(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_entitytype(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_ENT_IO_BLADE != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiEntityTypeT - SAHPI_ENT_DISK_BLADE testcase */ { SaHpiEntityTypeT value = SAHPI_ENT_DISK_BLADE; SaHpiEntityTypeT enum_type; expected_str = "DISK_BLADE"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_entitytype(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_entitytype(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_ENT_DISK_BLADE != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiEntityTypeT - SAHPI_ENT_DISK_DRIVE testcase */ { SaHpiEntityTypeT value = SAHPI_ENT_DISK_DRIVE; SaHpiEntityTypeT enum_type; expected_str = "DISK_DRIVE"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_entitytype(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_entitytype(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_ENT_DISK_DRIVE != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiEntityTypeT - SAHPI_ENT_FAN testcase */ { SaHpiEntityTypeT value = SAHPI_ENT_FAN; SaHpiEntityTypeT enum_type; expected_str = "FAN"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_entitytype(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_entitytype(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_ENT_FAN != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiEntityTypeT - SAHPI_ENT_POWER_DISTRIBUTION_UNIT testcase */ { SaHpiEntityTypeT value = SAHPI_ENT_POWER_DISTRIBUTION_UNIT; SaHpiEntityTypeT enum_type; expected_str = "POWER_DISTRIBUTION_UNIT"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_entitytype(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_entitytype(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_ENT_POWER_DISTRIBUTION_UNIT != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiEntityTypeT - SAHPI_ENT_SPEC_PROC_BLADE testcase */ { SaHpiEntityTypeT value = SAHPI_ENT_SPEC_PROC_BLADE; SaHpiEntityTypeT enum_type; expected_str = "SPEC_PROC_BLADE"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_entitytype(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_entitytype(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_ENT_SPEC_PROC_BLADE != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiEntityTypeT - SAHPI_ENT_IO_SUBBOARD testcase */ { SaHpiEntityTypeT value = SAHPI_ENT_IO_SUBBOARD; SaHpiEntityTypeT enum_type; expected_str = "IO_SUBBOARD"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_entitytype(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_entitytype(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_ENT_IO_SUBBOARD != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiEntityTypeT - SAHPI_ENT_SBC_SUBBOARD testcase */ { SaHpiEntityTypeT value = SAHPI_ENT_SBC_SUBBOARD; SaHpiEntityTypeT enum_type; expected_str = "SBC_SUBBOARD"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_entitytype(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_entitytype(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_ENT_SBC_SUBBOARD != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiEntityTypeT - SAHPI_ENT_ALARM_MANAGER testcase */ { SaHpiEntityTypeT value = SAHPI_ENT_ALARM_MANAGER; SaHpiEntityTypeT enum_type; expected_str = "ALARM_MANAGER"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_entitytype(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_entitytype(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_ENT_ALARM_MANAGER != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiEntityTypeT - SAHPI_ENT_SHELF_MANAGER testcase */ { SaHpiEntityTypeT value = SAHPI_ENT_SHELF_MANAGER; SaHpiEntityTypeT enum_type; expected_str = "SHELF_MANAGER"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_entitytype(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_entitytype(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_ENT_SHELF_MANAGER != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiEntityTypeT - SAHPI_ENT_DISPLAY_PANEL testcase */ { SaHpiEntityTypeT value = SAHPI_ENT_DISPLAY_PANEL; SaHpiEntityTypeT enum_type; expected_str = "DISPLAY_PANEL"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_entitytype(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_entitytype(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_ENT_DISPLAY_PANEL != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiEntityTypeT - SAHPI_ENT_SUBBOARD_CARRIER_BLADE testcase */ { SaHpiEntityTypeT value = SAHPI_ENT_SUBBOARD_CARRIER_BLADE; SaHpiEntityTypeT enum_type; expected_str = "SUBBOARD_CARRIER_BLADE"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_entitytype(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_entitytype(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_ENT_SUBBOARD_CARRIER_BLADE != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiEntityTypeT - SAHPI_ENT_PHYSICAL_SLOT testcase */ { SaHpiEntityTypeT value = SAHPI_ENT_PHYSICAL_SLOT; SaHpiEntityTypeT enum_type; expected_str = "PHYSICAL_SLOT"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_entitytype(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_entitytype(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_ENT_PHYSICAL_SLOT != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiEntityTypeT - Default testcase */ { SaHpiEntityTypeT value = BAD_ENUM_VALUE; expected_str = NULL; str = oh_lookup_entitytype(value); if (str != expected_str) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s; Expected string=%s\n", str, expected_str); return -1; } } { /* SaHpiEntityTypeT - NULL buffer testcase */ SaErrorT err, expected_err; SaHpiTextBufferT buffer; SaHpiEntityTypeT enum_type; expected_err = SA_ERR_HPI_INVALID_PARAMS; err = oh_encode_entitytype(0, &enum_type); if (err != expected_err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d; Expected error=%d\n", err, expected_err); return -1; } /* SaHpiEntityTypeT - Invalid type testcase */ err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, "INVALID_TYPE"); expected_err = SA_ERR_HPI_INVALID_DATA; err = oh_encode_entitytype(&buffer, &enum_type); if (err != expected_err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d; Expected error=%d\n", err, expected_err); return -1; } } /* SaHpiSensorTypeT - SAHPI_TEMPERATURE testcase */ { SaHpiSensorTypeT value = SAHPI_TEMPERATURE; SaHpiSensorTypeT enum_type; expected_str = "TEMPERATURE"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_sensortype(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_sensortype(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_TEMPERATURE != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiSensorTypeT - SAHPI_VOLTAGE testcase */ { SaHpiSensorTypeT value = SAHPI_VOLTAGE; SaHpiSensorTypeT enum_type; expected_str = "VOLTAGE"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_sensortype(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_sensortype(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_VOLTAGE != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiSensorTypeT - SAHPI_CURRENT testcase */ { SaHpiSensorTypeT value = SAHPI_CURRENT; SaHpiSensorTypeT enum_type; expected_str = "CURRENT"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_sensortype(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_sensortype(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_CURRENT != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiSensorTypeT - SAHPI_FAN testcase */ { SaHpiSensorTypeT value = SAHPI_FAN; SaHpiSensorTypeT enum_type; expected_str = "FAN"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_sensortype(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_sensortype(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_FAN != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiSensorTypeT - SAHPI_PHYSICAL_SECURITY testcase */ { SaHpiSensorTypeT value = SAHPI_PHYSICAL_SECURITY; SaHpiSensorTypeT enum_type; expected_str = "PHYSICAL_SECURITY"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_sensortype(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_sensortype(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_PHYSICAL_SECURITY != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiSensorTypeT - SAHPI_PLATFORM_VIOLATION testcase */ { SaHpiSensorTypeT value = SAHPI_PLATFORM_VIOLATION; SaHpiSensorTypeT enum_type; expected_str = "PLATFORM_VIOLATION"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_sensortype(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_sensortype(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_PLATFORM_VIOLATION != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiSensorTypeT - SAHPI_PROCESSOR testcase */ { SaHpiSensorTypeT value = SAHPI_PROCESSOR; SaHpiSensorTypeT enum_type; expected_str = "PROCESSOR"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_sensortype(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_sensortype(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_PROCESSOR != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiSensorTypeT - SAHPI_POWER_SUPPLY testcase */ { SaHpiSensorTypeT value = SAHPI_POWER_SUPPLY; SaHpiSensorTypeT enum_type; expected_str = "POWER_SUPPLY"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_sensortype(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_sensortype(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_POWER_SUPPLY != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiSensorTypeT - SAHPI_POWER_UNIT testcase */ { SaHpiSensorTypeT value = SAHPI_POWER_UNIT; SaHpiSensorTypeT enum_type; expected_str = "POWER_UNIT"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_sensortype(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_sensortype(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_POWER_UNIT != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiSensorTypeT - SAHPI_COOLING_DEVICE testcase */ { SaHpiSensorTypeT value = SAHPI_COOLING_DEVICE; SaHpiSensorTypeT enum_type; expected_str = "COOLING_DEVICE"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_sensortype(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_sensortype(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_COOLING_DEVICE != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiSensorTypeT - SAHPI_OTHER_UNITS_BASED_SENSOR testcase */ { SaHpiSensorTypeT value = SAHPI_OTHER_UNITS_BASED_SENSOR; SaHpiSensorTypeT enum_type; expected_str = "OTHER_UNITS_BASED_SENSOR"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_sensortype(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_sensortype(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_OTHER_UNITS_BASED_SENSOR != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiSensorTypeT - SAHPI_MEMORY testcase */ { SaHpiSensorTypeT value = SAHPI_MEMORY; SaHpiSensorTypeT enum_type; expected_str = "MEMORY"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_sensortype(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_sensortype(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_MEMORY != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiSensorTypeT - SAHPI_DRIVE_SLOT testcase */ { SaHpiSensorTypeT value = SAHPI_DRIVE_SLOT; SaHpiSensorTypeT enum_type; expected_str = "DRIVE_SLOT"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_sensortype(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_sensortype(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_DRIVE_SLOT != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiSensorTypeT - SAHPI_POST_MEMORY_RESIZE testcase */ { SaHpiSensorTypeT value = SAHPI_POST_MEMORY_RESIZE; SaHpiSensorTypeT enum_type; expected_str = "POST_MEMORY_RESIZE"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_sensortype(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_sensortype(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_POST_MEMORY_RESIZE != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiSensorTypeT - SAHPI_SYSTEM_FW_PROGRESS testcase */ { SaHpiSensorTypeT value = SAHPI_SYSTEM_FW_PROGRESS; SaHpiSensorTypeT enum_type; expected_str = "SYSTEM_FW_PROGRESS"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_sensortype(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_sensortype(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_SYSTEM_FW_PROGRESS != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiSensorTypeT - SAHPI_EVENT_LOGGING_DISABLED testcase */ { SaHpiSensorTypeT value = SAHPI_EVENT_LOGGING_DISABLED; SaHpiSensorTypeT enum_type; expected_str = "EVENT_LOGGING_DISABLED"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_sensortype(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_sensortype(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_EVENT_LOGGING_DISABLED != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiSensorTypeT - SAHPI_RESERVED1 testcase */ { SaHpiSensorTypeT value = SAHPI_RESERVED1; SaHpiSensorTypeT enum_type; expected_str = "RESERVED1"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_sensortype(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_sensortype(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_RESERVED1 != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiSensorTypeT - SAHPI_SYSTEM_EVENT testcase */ { SaHpiSensorTypeT value = SAHPI_SYSTEM_EVENT; SaHpiSensorTypeT enum_type; expected_str = "SYSTEM_EVENT"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_sensortype(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_sensortype(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_SYSTEM_EVENT != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiSensorTypeT - SAHPI_CRITICAL_INTERRUPT testcase */ { SaHpiSensorTypeT value = SAHPI_CRITICAL_INTERRUPT; SaHpiSensorTypeT enum_type; expected_str = "CRITICAL_INTERRUPT"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_sensortype(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_sensortype(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_CRITICAL_INTERRUPT != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiSensorTypeT - SAHPI_BUTTON testcase */ { SaHpiSensorTypeT value = SAHPI_BUTTON; SaHpiSensorTypeT enum_type; expected_str = "BUTTON"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_sensortype(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_sensortype(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_BUTTON != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiSensorTypeT - SAHPI_MODULE_BOARD testcase */ { SaHpiSensorTypeT value = SAHPI_MODULE_BOARD; SaHpiSensorTypeT enum_type; expected_str = "MODULE_BOARD"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_sensortype(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_sensortype(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_MODULE_BOARD != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiSensorTypeT - SAHPI_MICROCONTROLLER_COPROCESSOR testcase */ { SaHpiSensorTypeT value = SAHPI_MICROCONTROLLER_COPROCESSOR; SaHpiSensorTypeT enum_type; expected_str = "MICROCONTROLLER_COPROCESSOR"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_sensortype(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_sensortype(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_MICROCONTROLLER_COPROCESSOR != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiSensorTypeT - SAHPI_ADDIN_CARD testcase */ { SaHpiSensorTypeT value = SAHPI_ADDIN_CARD; SaHpiSensorTypeT enum_type; expected_str = "ADDIN_CARD"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_sensortype(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_sensortype(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_ADDIN_CARD != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiSensorTypeT - SAHPI_CHASSIS testcase */ { SaHpiSensorTypeT value = SAHPI_CHASSIS; SaHpiSensorTypeT enum_type; expected_str = "CHASSIS"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_sensortype(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_sensortype(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_CHASSIS != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiSensorTypeT - SAHPI_CHIP_SET testcase */ { SaHpiSensorTypeT value = SAHPI_CHIP_SET; SaHpiSensorTypeT enum_type; expected_str = "CHIP_SET"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_sensortype(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_sensortype(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_CHIP_SET != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiSensorTypeT - SAHPI_OTHER_FRU testcase */ { SaHpiSensorTypeT value = SAHPI_OTHER_FRU; SaHpiSensorTypeT enum_type; expected_str = "OTHER_FRU"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_sensortype(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_sensortype(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_OTHER_FRU != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiSensorTypeT - SAHPI_CABLE_INTERCONNECT testcase */ { SaHpiSensorTypeT value = SAHPI_CABLE_INTERCONNECT; SaHpiSensorTypeT enum_type; expected_str = "CABLE_INTERCONNECT"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_sensortype(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_sensortype(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_CABLE_INTERCONNECT != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiSensorTypeT - SAHPI_TERMINATOR testcase */ { SaHpiSensorTypeT value = SAHPI_TERMINATOR; SaHpiSensorTypeT enum_type; expected_str = "TERMINATOR"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_sensortype(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_sensortype(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_TERMINATOR != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiSensorTypeT - SAHPI_SYSTEM_BOOT_INITIATED testcase */ { SaHpiSensorTypeT value = SAHPI_SYSTEM_BOOT_INITIATED; SaHpiSensorTypeT enum_type; expected_str = "SYSTEM_BOOT_INITIATED"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_sensortype(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_sensortype(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_SYSTEM_BOOT_INITIATED != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiSensorTypeT - SAHPI_BOOT_ERROR testcase */ { SaHpiSensorTypeT value = SAHPI_BOOT_ERROR; SaHpiSensorTypeT enum_type; expected_str = "BOOT_ERROR"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_sensortype(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_sensortype(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_BOOT_ERROR != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiSensorTypeT - SAHPI_OS_BOOT testcase */ { SaHpiSensorTypeT value = SAHPI_OS_BOOT; SaHpiSensorTypeT enum_type; expected_str = "OS_BOOT"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_sensortype(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_sensortype(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_OS_BOOT != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiSensorTypeT - SAHPI_OS_CRITICAL_STOP testcase */ { SaHpiSensorTypeT value = SAHPI_OS_CRITICAL_STOP; SaHpiSensorTypeT enum_type; expected_str = "OS_CRITICAL_STOP"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_sensortype(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_sensortype(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_OS_CRITICAL_STOP != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiSensorTypeT - SAHPI_SLOT_CONNECTOR testcase */ { SaHpiSensorTypeT value = SAHPI_SLOT_CONNECTOR; SaHpiSensorTypeT enum_type; expected_str = "SLOT_CONNECTOR"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_sensortype(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_sensortype(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_SLOT_CONNECTOR != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiSensorTypeT - SAHPI_SYSTEM_ACPI_POWER_STATE testcase */ { SaHpiSensorTypeT value = SAHPI_SYSTEM_ACPI_POWER_STATE; SaHpiSensorTypeT enum_type; expected_str = "SYSTEM_ACPI_POWER_STATE"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_sensortype(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_sensortype(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_SYSTEM_ACPI_POWER_STATE != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiSensorTypeT - SAHPI_RESERVED2 testcase */ { SaHpiSensorTypeT value = SAHPI_RESERVED2; SaHpiSensorTypeT enum_type; expected_str = "RESERVED2"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_sensortype(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_sensortype(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_RESERVED2 != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiSensorTypeT - SAHPI_PLATFORM_ALERT testcase */ { SaHpiSensorTypeT value = SAHPI_PLATFORM_ALERT; SaHpiSensorTypeT enum_type; expected_str = "PLATFORM_ALERT"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_sensortype(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_sensortype(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_PLATFORM_ALERT != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiSensorTypeT - SAHPI_ENTITY_PRESENCE testcase */ { SaHpiSensorTypeT value = SAHPI_ENTITY_PRESENCE; SaHpiSensorTypeT enum_type; expected_str = "ENTITY_PRESENCE"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_sensortype(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_sensortype(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_ENTITY_PRESENCE != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiSensorTypeT - SAHPI_MONITOR_ASIC_IC testcase */ { SaHpiSensorTypeT value = SAHPI_MONITOR_ASIC_IC; SaHpiSensorTypeT enum_type; expected_str = "MONITOR_ASIC_IC"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_sensortype(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_sensortype(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_MONITOR_ASIC_IC != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiSensorTypeT - SAHPI_LAN testcase */ { SaHpiSensorTypeT value = SAHPI_LAN; SaHpiSensorTypeT enum_type; expected_str = "LAN"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_sensortype(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_sensortype(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_LAN != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiSensorTypeT - SAHPI_MANAGEMENT_SUBSYSTEM_HEALTH testcase */ { SaHpiSensorTypeT value = SAHPI_MANAGEMENT_SUBSYSTEM_HEALTH; SaHpiSensorTypeT enum_type; expected_str = "MANAGEMENT_SUBSYSTEM_HEALTH"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_sensortype(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_sensortype(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_MANAGEMENT_SUBSYSTEM_HEALTH != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiSensorTypeT - SAHPI_BATTERY testcase */ { SaHpiSensorTypeT value = SAHPI_BATTERY; SaHpiSensorTypeT enum_type; expected_str = "BATTERY"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_sensortype(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_sensortype(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_BATTERY != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiSensorTypeT - SAHPI_OPERATIONAL testcase */ { SaHpiSensorTypeT value = SAHPI_OPERATIONAL; SaHpiSensorTypeT enum_type; expected_str = "OPERATIONAL"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_sensortype(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_sensortype(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_OPERATIONAL != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiSensorTypeT - SAHPI_OEM_SENSOR testcase */ { SaHpiSensorTypeT value = SAHPI_OEM_SENSOR; SaHpiSensorTypeT enum_type; expected_str = "OEM_SENSOR"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_sensortype(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_sensortype(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_OEM_SENSOR != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiSensorTypeT - Default testcase */ { SaHpiSensorTypeT value = BAD_ENUM_VALUE; expected_str = NULL; str = oh_lookup_sensortype(value); if (str != expected_str) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s; Expected string=%s\n", str, expected_str); return -1; } } { /* SaHpiSensorTypeT - NULL buffer testcase */ SaErrorT err, expected_err; SaHpiTextBufferT buffer; SaHpiSensorTypeT enum_type; expected_err = SA_ERR_HPI_INVALID_PARAMS; err = oh_encode_sensortype(0, &enum_type); if (err != expected_err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d; Expected error=%d\n", err, expected_err); return -1; } /* SaHpiSensorTypeT - Invalid type testcase */ err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, "INVALID_TYPE"); expected_err = SA_ERR_HPI_INVALID_DATA; err = oh_encode_sensortype(&buffer, &enum_type); if (err != expected_err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d; Expected error=%d\n", err, expected_err); return -1; } } /* SaHpiSensorReadingTypeT - SAHPI_SENSOR_READING_TYPE_INT64 testcase */ { SaHpiSensorReadingTypeT value = SAHPI_SENSOR_READING_TYPE_INT64; SaHpiSensorReadingTypeT enum_type; expected_str = "INT64"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_sensorreadingtype(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_sensorreadingtype(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_SENSOR_READING_TYPE_INT64 != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiSensorReadingTypeT - SAHPI_SENSOR_READING_TYPE_UINT64 testcase */ { SaHpiSensorReadingTypeT value = SAHPI_SENSOR_READING_TYPE_UINT64; SaHpiSensorReadingTypeT enum_type; expected_str = "UINT64"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_sensorreadingtype(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_sensorreadingtype(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_SENSOR_READING_TYPE_UINT64 != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiSensorReadingTypeT - SAHPI_SENSOR_READING_TYPE_FLOAT64 testcase */ { SaHpiSensorReadingTypeT value = SAHPI_SENSOR_READING_TYPE_FLOAT64; SaHpiSensorReadingTypeT enum_type; expected_str = "FLOAT64"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_sensorreadingtype(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_sensorreadingtype(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_SENSOR_READING_TYPE_FLOAT64 != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiSensorReadingTypeT - SAHPI_SENSOR_READING_TYPE_BUFFER testcase */ { SaHpiSensorReadingTypeT value = SAHPI_SENSOR_READING_TYPE_BUFFER; SaHpiSensorReadingTypeT enum_type; expected_str = "BUFFER"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_sensorreadingtype(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_sensorreadingtype(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_SENSOR_READING_TYPE_BUFFER != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiSensorReadingTypeT - Default testcase */ { SaHpiSensorReadingTypeT value = BAD_ENUM_VALUE; expected_str = NULL; str = oh_lookup_sensorreadingtype(value); if (str != expected_str) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s; Expected string=%s\n", str, expected_str); return -1; } } { /* SaHpiSensorReadingTypeT - NULL buffer testcase */ SaErrorT err, expected_err; SaHpiTextBufferT buffer; SaHpiSensorReadingTypeT enum_type; expected_err = SA_ERR_HPI_INVALID_PARAMS; err = oh_encode_sensorreadingtype(0, &enum_type); if (err != expected_err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d; Expected error=%d\n", err, expected_err); return -1; } /* SaHpiSensorReadingTypeT - Invalid type testcase */ err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, "INVALID_TYPE"); expected_err = SA_ERR_HPI_INVALID_DATA; err = oh_encode_sensorreadingtype(&buffer, &enum_type); if (err != expected_err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d; Expected error=%d\n", err, expected_err); return -1; } } /* SaHpiSensorEventMaskActionT - SAHPI_SENS_ADD_EVENTS_TO_MASKS testcase */ { SaHpiSensorEventMaskActionT value = SAHPI_SENS_ADD_EVENTS_TO_MASKS; SaHpiSensorEventMaskActionT enum_type; expected_str = "ADD_EVENTS_TO_MASKS"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_sensoreventmaskaction(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_sensoreventmaskaction(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_SENS_ADD_EVENTS_TO_MASKS != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiSensorEventMaskActionT - SAHPI_SENS_REMOVE_EVENTS_FROM_MASKS testcase */ { SaHpiSensorEventMaskActionT value = SAHPI_SENS_REMOVE_EVENTS_FROM_MASKS; SaHpiSensorEventMaskActionT enum_type; expected_str = "REMOVE_EVENTS_FROM_MASKS"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_sensoreventmaskaction(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_sensoreventmaskaction(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_SENS_REMOVE_EVENTS_FROM_MASKS != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiSensorEventMaskActionT - Default testcase */ { SaHpiSensorEventMaskActionT value = BAD_ENUM_VALUE; expected_str = NULL; str = oh_lookup_sensoreventmaskaction(value); if (str != expected_str) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s; Expected string=%s\n", str, expected_str); return -1; } } { /* SaHpiSensorEventMaskActionT - NULL buffer testcase */ SaErrorT err, expected_err; SaHpiTextBufferT buffer; SaHpiSensorEventMaskActionT enum_type; expected_err = SA_ERR_HPI_INVALID_PARAMS; err = oh_encode_sensoreventmaskaction(0, &enum_type); if (err != expected_err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d; Expected error=%d\n", err, expected_err); return -1; } /* SaHpiSensorEventMaskActionT - Invalid type testcase */ err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, "INVALID_TYPE"); expected_err = SA_ERR_HPI_INVALID_DATA; err = oh_encode_sensoreventmaskaction(&buffer, &enum_type); if (err != expected_err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d; Expected error=%d\n", err, expected_err); return -1; } } /* SaHpiSensorUnitsT - SAHPI_SU_UNSPECIFIED testcase */ { SaHpiSensorUnitsT value = SAHPI_SU_UNSPECIFIED; SaHpiSensorUnitsT enum_type; expected_str = "Unspecified"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_sensorunits(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_sensorunits(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_SU_UNSPECIFIED != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiSensorUnitsT - SAHPI_SU_DEGREES_C testcase */ { SaHpiSensorUnitsT value = SAHPI_SU_DEGREES_C; SaHpiSensorUnitsT enum_type; expected_str = "Degrees C"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_sensorunits(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_sensorunits(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_SU_DEGREES_C != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiSensorUnitsT - SAHPI_SU_DEGREES_F testcase */ { SaHpiSensorUnitsT value = SAHPI_SU_DEGREES_F; SaHpiSensorUnitsT enum_type; expected_str = "Degrees F"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_sensorunits(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_sensorunits(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_SU_DEGREES_F != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiSensorUnitsT - SAHPI_SU_DEGREES_K testcase */ { SaHpiSensorUnitsT value = SAHPI_SU_DEGREES_K; SaHpiSensorUnitsT enum_type; expected_str = "Degrees K"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_sensorunits(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_sensorunits(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_SU_DEGREES_K != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiSensorUnitsT - SAHPI_SU_VOLTS testcase */ { SaHpiSensorUnitsT value = SAHPI_SU_VOLTS; SaHpiSensorUnitsT enum_type; expected_str = "Volts"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_sensorunits(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_sensorunits(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_SU_VOLTS != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiSensorUnitsT - SAHPI_SU_AMPS testcase */ { SaHpiSensorUnitsT value = SAHPI_SU_AMPS; SaHpiSensorUnitsT enum_type; expected_str = "Amps"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_sensorunits(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_sensorunits(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_SU_AMPS != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiSensorUnitsT - SAHPI_SU_WATTS testcase */ { SaHpiSensorUnitsT value = SAHPI_SU_WATTS; SaHpiSensorUnitsT enum_type; expected_str = "Watts"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_sensorunits(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_sensorunits(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_SU_WATTS != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiSensorUnitsT - SAHPI_SU_JOULES testcase */ { SaHpiSensorUnitsT value = SAHPI_SU_JOULES; SaHpiSensorUnitsT enum_type; expected_str = "Joules"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_sensorunits(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_sensorunits(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_SU_JOULES != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiSensorUnitsT - SAHPI_SU_COULOMBS testcase */ { SaHpiSensorUnitsT value = SAHPI_SU_COULOMBS; SaHpiSensorUnitsT enum_type; expected_str = "Coulombs"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_sensorunits(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_sensorunits(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_SU_COULOMBS != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiSensorUnitsT - SAHPI_SU_VA testcase */ { SaHpiSensorUnitsT value = SAHPI_SU_VA; SaHpiSensorUnitsT enum_type; expected_str = "Va"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_sensorunits(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_sensorunits(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_SU_VA != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiSensorUnitsT - SAHPI_SU_NITS testcase */ { SaHpiSensorUnitsT value = SAHPI_SU_NITS; SaHpiSensorUnitsT enum_type; expected_str = "Nits"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_sensorunits(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_sensorunits(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_SU_NITS != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiSensorUnitsT - SAHPI_SU_LUMEN testcase */ { SaHpiSensorUnitsT value = SAHPI_SU_LUMEN; SaHpiSensorUnitsT enum_type; expected_str = "Lumen"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_sensorunits(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_sensorunits(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_SU_LUMEN != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiSensorUnitsT - SAHPI_SU_LUX testcase */ { SaHpiSensorUnitsT value = SAHPI_SU_LUX; SaHpiSensorUnitsT enum_type; expected_str = "Lux"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_sensorunits(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_sensorunits(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_SU_LUX != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiSensorUnitsT - SAHPI_SU_CANDELA testcase */ { SaHpiSensorUnitsT value = SAHPI_SU_CANDELA; SaHpiSensorUnitsT enum_type; expected_str = "Candela"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_sensorunits(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_sensorunits(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_SU_CANDELA != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiSensorUnitsT - SAHPI_SU_KPA testcase */ { SaHpiSensorUnitsT value = SAHPI_SU_KPA; SaHpiSensorUnitsT enum_type; expected_str = "Kpa"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_sensorunits(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_sensorunits(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_SU_KPA != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiSensorUnitsT - SAHPI_SU_PSI testcase */ { SaHpiSensorUnitsT value = SAHPI_SU_PSI; SaHpiSensorUnitsT enum_type; expected_str = "Psi"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_sensorunits(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_sensorunits(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_SU_PSI != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiSensorUnitsT - SAHPI_SU_NEWTON testcase */ { SaHpiSensorUnitsT value = SAHPI_SU_NEWTON; SaHpiSensorUnitsT enum_type; expected_str = "Newton"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_sensorunits(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_sensorunits(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_SU_NEWTON != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiSensorUnitsT - SAHPI_SU_CFM testcase */ { SaHpiSensorUnitsT value = SAHPI_SU_CFM; SaHpiSensorUnitsT enum_type; expected_str = "Cfm"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_sensorunits(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_sensorunits(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_SU_CFM != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiSensorUnitsT - SAHPI_SU_RPM testcase */ { SaHpiSensorUnitsT value = SAHPI_SU_RPM; SaHpiSensorUnitsT enum_type; expected_str = "Rpm"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_sensorunits(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_sensorunits(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_SU_RPM != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiSensorUnitsT - SAHPI_SU_HZ testcase */ { SaHpiSensorUnitsT value = SAHPI_SU_HZ; SaHpiSensorUnitsT enum_type; expected_str = "Hz"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_sensorunits(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_sensorunits(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_SU_HZ != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiSensorUnitsT - SAHPI_SU_MICROSECOND testcase */ { SaHpiSensorUnitsT value = SAHPI_SU_MICROSECOND; SaHpiSensorUnitsT enum_type; expected_str = "Microsecond"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_sensorunits(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_sensorunits(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_SU_MICROSECOND != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiSensorUnitsT - SAHPI_SU_MILLISECOND testcase */ { SaHpiSensorUnitsT value = SAHPI_SU_MILLISECOND; SaHpiSensorUnitsT enum_type; expected_str = "Millisecond"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_sensorunits(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_sensorunits(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_SU_MILLISECOND != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiSensorUnitsT - SAHPI_SU_SECOND testcase */ { SaHpiSensorUnitsT value = SAHPI_SU_SECOND; SaHpiSensorUnitsT enum_type; expected_str = "Second"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_sensorunits(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_sensorunits(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_SU_SECOND != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiSensorUnitsT - SAHPI_SU_MINUTE testcase */ { SaHpiSensorUnitsT value = SAHPI_SU_MINUTE; SaHpiSensorUnitsT enum_type; expected_str = "Minute"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_sensorunits(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_sensorunits(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_SU_MINUTE != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiSensorUnitsT - SAHPI_SU_HOUR testcase */ { SaHpiSensorUnitsT value = SAHPI_SU_HOUR; SaHpiSensorUnitsT enum_type; expected_str = "Hour"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_sensorunits(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_sensorunits(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_SU_HOUR != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiSensorUnitsT - SAHPI_SU_DAY testcase */ { SaHpiSensorUnitsT value = SAHPI_SU_DAY; SaHpiSensorUnitsT enum_type; expected_str = "Day"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_sensorunits(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_sensorunits(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_SU_DAY != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiSensorUnitsT - SAHPI_SU_WEEK testcase */ { SaHpiSensorUnitsT value = SAHPI_SU_WEEK; SaHpiSensorUnitsT enum_type; expected_str = "Week"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_sensorunits(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_sensorunits(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_SU_WEEK != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiSensorUnitsT - SAHPI_SU_MIL testcase */ { SaHpiSensorUnitsT value = SAHPI_SU_MIL; SaHpiSensorUnitsT enum_type; expected_str = "Mil"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_sensorunits(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_sensorunits(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_SU_MIL != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiSensorUnitsT - SAHPI_SU_INCHES testcase */ { SaHpiSensorUnitsT value = SAHPI_SU_INCHES; SaHpiSensorUnitsT enum_type; expected_str = "Inches"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_sensorunits(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_sensorunits(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_SU_INCHES != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiSensorUnitsT - SAHPI_SU_FEET testcase */ { SaHpiSensorUnitsT value = SAHPI_SU_FEET; SaHpiSensorUnitsT enum_type; expected_str = "Feet"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_sensorunits(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_sensorunits(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_SU_FEET != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiSensorUnitsT - SAHPI_SU_CU_IN testcase */ { SaHpiSensorUnitsT value = SAHPI_SU_CU_IN; SaHpiSensorUnitsT enum_type; expected_str = "Cu In"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_sensorunits(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_sensorunits(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_SU_CU_IN != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiSensorUnitsT - SAHPI_SU_CU_FEET testcase */ { SaHpiSensorUnitsT value = SAHPI_SU_CU_FEET; SaHpiSensorUnitsT enum_type; expected_str = "Cu Feet"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_sensorunits(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_sensorunits(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_SU_CU_FEET != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiSensorUnitsT - SAHPI_SU_MM testcase */ { SaHpiSensorUnitsT value = SAHPI_SU_MM; SaHpiSensorUnitsT enum_type; expected_str = "Mm"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_sensorunits(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_sensorunits(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_SU_MM != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiSensorUnitsT - SAHPI_SU_CM testcase */ { SaHpiSensorUnitsT value = SAHPI_SU_CM; SaHpiSensorUnitsT enum_type; expected_str = "Cm"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_sensorunits(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_sensorunits(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_SU_CM != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiSensorUnitsT - SAHPI_SU_M testcase */ { SaHpiSensorUnitsT value = SAHPI_SU_M; SaHpiSensorUnitsT enum_type; expected_str = "M"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_sensorunits(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_sensorunits(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_SU_M != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiSensorUnitsT - SAHPI_SU_CU_CM testcase */ { SaHpiSensorUnitsT value = SAHPI_SU_CU_CM; SaHpiSensorUnitsT enum_type; expected_str = "Cu Cm"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_sensorunits(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_sensorunits(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_SU_CU_CM != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiSensorUnitsT - SAHPI_SU_CU_M testcase */ { SaHpiSensorUnitsT value = SAHPI_SU_CU_M; SaHpiSensorUnitsT enum_type; expected_str = "Cu M"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_sensorunits(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_sensorunits(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_SU_CU_M != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiSensorUnitsT - SAHPI_SU_LITERS testcase */ { SaHpiSensorUnitsT value = SAHPI_SU_LITERS; SaHpiSensorUnitsT enum_type; expected_str = "Liters"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_sensorunits(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_sensorunits(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_SU_LITERS != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiSensorUnitsT - SAHPI_SU_FLUID_OUNCE testcase */ { SaHpiSensorUnitsT value = SAHPI_SU_FLUID_OUNCE; SaHpiSensorUnitsT enum_type; expected_str = "Fluid Ounce"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_sensorunits(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_sensorunits(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_SU_FLUID_OUNCE != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiSensorUnitsT - SAHPI_SU_RADIANS testcase */ { SaHpiSensorUnitsT value = SAHPI_SU_RADIANS; SaHpiSensorUnitsT enum_type; expected_str = "Radians"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_sensorunits(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_sensorunits(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_SU_RADIANS != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiSensorUnitsT - SAHPI_SU_STERADIANS testcase */ { SaHpiSensorUnitsT value = SAHPI_SU_STERADIANS; SaHpiSensorUnitsT enum_type; expected_str = "Steradians"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_sensorunits(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_sensorunits(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_SU_STERADIANS != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiSensorUnitsT - SAHPI_SU_REVOLUTIONS testcase */ { SaHpiSensorUnitsT value = SAHPI_SU_REVOLUTIONS; SaHpiSensorUnitsT enum_type; expected_str = "Revolutions"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_sensorunits(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_sensorunits(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_SU_REVOLUTIONS != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiSensorUnitsT - SAHPI_SU_CYCLES testcase */ { SaHpiSensorUnitsT value = SAHPI_SU_CYCLES; SaHpiSensorUnitsT enum_type; expected_str = "Cycles"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_sensorunits(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_sensorunits(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_SU_CYCLES != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiSensorUnitsT - SAHPI_SU_GRAVITIES testcase */ { SaHpiSensorUnitsT value = SAHPI_SU_GRAVITIES; SaHpiSensorUnitsT enum_type; expected_str = "Gravities"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_sensorunits(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_sensorunits(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_SU_GRAVITIES != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiSensorUnitsT - SAHPI_SU_OUNCE testcase */ { SaHpiSensorUnitsT value = SAHPI_SU_OUNCE; SaHpiSensorUnitsT enum_type; expected_str = "Ounce"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_sensorunits(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_sensorunits(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_SU_OUNCE != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiSensorUnitsT - SAHPI_SU_POUND testcase */ { SaHpiSensorUnitsT value = SAHPI_SU_POUND; SaHpiSensorUnitsT enum_type; expected_str = "Pound"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_sensorunits(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_sensorunits(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_SU_POUND != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiSensorUnitsT - SAHPI_SU_FT_LB testcase */ { SaHpiSensorUnitsT value = SAHPI_SU_FT_LB; SaHpiSensorUnitsT enum_type; expected_str = "Ft Lb"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_sensorunits(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_sensorunits(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_SU_FT_LB != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiSensorUnitsT - SAHPI_SU_OZ_IN testcase */ { SaHpiSensorUnitsT value = SAHPI_SU_OZ_IN; SaHpiSensorUnitsT enum_type; expected_str = "Oz In"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_sensorunits(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_sensorunits(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_SU_OZ_IN != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiSensorUnitsT - SAHPI_SU_GAUSS testcase */ { SaHpiSensorUnitsT value = SAHPI_SU_GAUSS; SaHpiSensorUnitsT enum_type; expected_str = "Gauss"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_sensorunits(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_sensorunits(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_SU_GAUSS != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiSensorUnitsT - SAHPI_SU_GILBERTS testcase */ { SaHpiSensorUnitsT value = SAHPI_SU_GILBERTS; SaHpiSensorUnitsT enum_type; expected_str = "Gilberts"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_sensorunits(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_sensorunits(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_SU_GILBERTS != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiSensorUnitsT - SAHPI_SU_HENRY testcase */ { SaHpiSensorUnitsT value = SAHPI_SU_HENRY; SaHpiSensorUnitsT enum_type; expected_str = "Henry"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_sensorunits(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_sensorunits(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_SU_HENRY != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiSensorUnitsT - SAHPI_SU_MILLIHENRY testcase */ { SaHpiSensorUnitsT value = SAHPI_SU_MILLIHENRY; SaHpiSensorUnitsT enum_type; expected_str = "Millihenry"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_sensorunits(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_sensorunits(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_SU_MILLIHENRY != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiSensorUnitsT - SAHPI_SU_FARAD testcase */ { SaHpiSensorUnitsT value = SAHPI_SU_FARAD; SaHpiSensorUnitsT enum_type; expected_str = "Farad"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_sensorunits(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_sensorunits(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_SU_FARAD != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiSensorUnitsT - SAHPI_SU_MICROFARAD testcase */ { SaHpiSensorUnitsT value = SAHPI_SU_MICROFARAD; SaHpiSensorUnitsT enum_type; expected_str = "Microfarad"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_sensorunits(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_sensorunits(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_SU_MICROFARAD != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiSensorUnitsT - SAHPI_SU_OHMS testcase */ { SaHpiSensorUnitsT value = SAHPI_SU_OHMS; SaHpiSensorUnitsT enum_type; expected_str = "Ohms"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_sensorunits(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_sensorunits(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_SU_OHMS != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiSensorUnitsT - SAHPI_SU_SIEMENS testcase */ { SaHpiSensorUnitsT value = SAHPI_SU_SIEMENS; SaHpiSensorUnitsT enum_type; expected_str = "Siemens"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_sensorunits(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_sensorunits(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_SU_SIEMENS != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiSensorUnitsT - SAHPI_SU_MOLE testcase */ { SaHpiSensorUnitsT value = SAHPI_SU_MOLE; SaHpiSensorUnitsT enum_type; expected_str = "Mole"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_sensorunits(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_sensorunits(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_SU_MOLE != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiSensorUnitsT - SAHPI_SU_BECQUEREL testcase */ { SaHpiSensorUnitsT value = SAHPI_SU_BECQUEREL; SaHpiSensorUnitsT enum_type; expected_str = "Becquerel"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_sensorunits(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_sensorunits(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_SU_BECQUEREL != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiSensorUnitsT - SAHPI_SU_PPM testcase */ { SaHpiSensorUnitsT value = SAHPI_SU_PPM; SaHpiSensorUnitsT enum_type; expected_str = "Ppm"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_sensorunits(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_sensorunits(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_SU_PPM != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiSensorUnitsT - SAHPI_SU_RESERVED testcase */ { SaHpiSensorUnitsT value = SAHPI_SU_RESERVED; SaHpiSensorUnitsT enum_type; expected_str = "Reserved"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_sensorunits(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_sensorunits(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_SU_RESERVED != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiSensorUnitsT - SAHPI_SU_DECIBELS testcase */ { SaHpiSensorUnitsT value = SAHPI_SU_DECIBELS; SaHpiSensorUnitsT enum_type; expected_str = "Decibels"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_sensorunits(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_sensorunits(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_SU_DECIBELS != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiSensorUnitsT - SAHPI_SU_DBA testcase */ { SaHpiSensorUnitsT value = SAHPI_SU_DBA; SaHpiSensorUnitsT enum_type; expected_str = "Dba"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_sensorunits(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_sensorunits(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_SU_DBA != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiSensorUnitsT - SAHPI_SU_DBC testcase */ { SaHpiSensorUnitsT value = SAHPI_SU_DBC; SaHpiSensorUnitsT enum_type; expected_str = "Dbc"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_sensorunits(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_sensorunits(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_SU_DBC != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiSensorUnitsT - SAHPI_SU_GRAY testcase */ { SaHpiSensorUnitsT value = SAHPI_SU_GRAY; SaHpiSensorUnitsT enum_type; expected_str = "Gray"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_sensorunits(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_sensorunits(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_SU_GRAY != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiSensorUnitsT - SAHPI_SU_SIEVERT testcase */ { SaHpiSensorUnitsT value = SAHPI_SU_SIEVERT; SaHpiSensorUnitsT enum_type; expected_str = "Sievert"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_sensorunits(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_sensorunits(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_SU_SIEVERT != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiSensorUnitsT - SAHPI_SU_COLOR_TEMP_DEG_K testcase */ { SaHpiSensorUnitsT value = SAHPI_SU_COLOR_TEMP_DEG_K; SaHpiSensorUnitsT enum_type; expected_str = "Color Temp Deg K"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_sensorunits(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_sensorunits(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_SU_COLOR_TEMP_DEG_K != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiSensorUnitsT - SAHPI_SU_BIT testcase */ { SaHpiSensorUnitsT value = SAHPI_SU_BIT; SaHpiSensorUnitsT enum_type; expected_str = "Bit"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_sensorunits(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_sensorunits(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_SU_BIT != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiSensorUnitsT - SAHPI_SU_KILOBIT testcase */ { SaHpiSensorUnitsT value = SAHPI_SU_KILOBIT; SaHpiSensorUnitsT enum_type; expected_str = "Kilobit"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_sensorunits(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_sensorunits(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_SU_KILOBIT != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiSensorUnitsT - SAHPI_SU_MEGABIT testcase */ { SaHpiSensorUnitsT value = SAHPI_SU_MEGABIT; SaHpiSensorUnitsT enum_type; expected_str = "Megabit"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_sensorunits(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_sensorunits(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_SU_MEGABIT != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiSensorUnitsT - SAHPI_SU_GIGABIT testcase */ { SaHpiSensorUnitsT value = SAHPI_SU_GIGABIT; SaHpiSensorUnitsT enum_type; expected_str = "Gigabit"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_sensorunits(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_sensorunits(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_SU_GIGABIT != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiSensorUnitsT - SAHPI_SU_BYTE testcase */ { SaHpiSensorUnitsT value = SAHPI_SU_BYTE; SaHpiSensorUnitsT enum_type; expected_str = "Byte"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_sensorunits(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_sensorunits(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_SU_BYTE != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiSensorUnitsT - SAHPI_SU_KILOBYTE testcase */ { SaHpiSensorUnitsT value = SAHPI_SU_KILOBYTE; SaHpiSensorUnitsT enum_type; expected_str = "Kilobyte"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_sensorunits(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_sensorunits(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_SU_KILOBYTE != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiSensorUnitsT - SAHPI_SU_MEGABYTE testcase */ { SaHpiSensorUnitsT value = SAHPI_SU_MEGABYTE; SaHpiSensorUnitsT enum_type; expected_str = "Megabyte"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_sensorunits(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_sensorunits(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_SU_MEGABYTE != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiSensorUnitsT - SAHPI_SU_GIGABYTE testcase */ { SaHpiSensorUnitsT value = SAHPI_SU_GIGABYTE; SaHpiSensorUnitsT enum_type; expected_str = "Gigabyte"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_sensorunits(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_sensorunits(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_SU_GIGABYTE != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiSensorUnitsT - SAHPI_SU_WORD testcase */ { SaHpiSensorUnitsT value = SAHPI_SU_WORD; SaHpiSensorUnitsT enum_type; expected_str = "Word"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_sensorunits(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_sensorunits(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_SU_WORD != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiSensorUnitsT - SAHPI_SU_DWORD testcase */ { SaHpiSensorUnitsT value = SAHPI_SU_DWORD; SaHpiSensorUnitsT enum_type; expected_str = "Dword"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_sensorunits(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_sensorunits(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_SU_DWORD != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiSensorUnitsT - SAHPI_SU_QWORD testcase */ { SaHpiSensorUnitsT value = SAHPI_SU_QWORD; SaHpiSensorUnitsT enum_type; expected_str = "Qword"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_sensorunits(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_sensorunits(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_SU_QWORD != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiSensorUnitsT - SAHPI_SU_LINE testcase */ { SaHpiSensorUnitsT value = SAHPI_SU_LINE; SaHpiSensorUnitsT enum_type; expected_str = "Line"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_sensorunits(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_sensorunits(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_SU_LINE != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiSensorUnitsT - SAHPI_SU_HIT testcase */ { SaHpiSensorUnitsT value = SAHPI_SU_HIT; SaHpiSensorUnitsT enum_type; expected_str = "Hit"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_sensorunits(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_sensorunits(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_SU_HIT != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiSensorUnitsT - SAHPI_SU_MISS testcase */ { SaHpiSensorUnitsT value = SAHPI_SU_MISS; SaHpiSensorUnitsT enum_type; expected_str = "Miss"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_sensorunits(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_sensorunits(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_SU_MISS != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiSensorUnitsT - SAHPI_SU_RETRY testcase */ { SaHpiSensorUnitsT value = SAHPI_SU_RETRY; SaHpiSensorUnitsT enum_type; expected_str = "Retry"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_sensorunits(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_sensorunits(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_SU_RETRY != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiSensorUnitsT - SAHPI_SU_RESET testcase */ { SaHpiSensorUnitsT value = SAHPI_SU_RESET; SaHpiSensorUnitsT enum_type; expected_str = "Reset"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_sensorunits(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_sensorunits(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_SU_RESET != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiSensorUnitsT - SAHPI_SU_OVERRUN testcase */ { SaHpiSensorUnitsT value = SAHPI_SU_OVERRUN; SaHpiSensorUnitsT enum_type; expected_str = "Overrun"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_sensorunits(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_sensorunits(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_SU_OVERRUN != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiSensorUnitsT - SAHPI_SU_UNDERRUN testcase */ { SaHpiSensorUnitsT value = SAHPI_SU_UNDERRUN; SaHpiSensorUnitsT enum_type; expected_str = "Underrun"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_sensorunits(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_sensorunits(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_SU_UNDERRUN != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiSensorUnitsT - SAHPI_SU_COLLISION testcase */ { SaHpiSensorUnitsT value = SAHPI_SU_COLLISION; SaHpiSensorUnitsT enum_type; expected_str = "Collision"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_sensorunits(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_sensorunits(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_SU_COLLISION != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiSensorUnitsT - SAHPI_SU_PACKETS testcase */ { SaHpiSensorUnitsT value = SAHPI_SU_PACKETS; SaHpiSensorUnitsT enum_type; expected_str = "Packets"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_sensorunits(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_sensorunits(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_SU_PACKETS != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiSensorUnitsT - SAHPI_SU_MESSAGES testcase */ { SaHpiSensorUnitsT value = SAHPI_SU_MESSAGES; SaHpiSensorUnitsT enum_type; expected_str = "Messages"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_sensorunits(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_sensorunits(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_SU_MESSAGES != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiSensorUnitsT - SAHPI_SU_CHARACTERS testcase */ { SaHpiSensorUnitsT value = SAHPI_SU_CHARACTERS; SaHpiSensorUnitsT enum_type; expected_str = "Characters"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_sensorunits(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_sensorunits(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_SU_CHARACTERS != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiSensorUnitsT - SAHPI_SU_ERRORS testcase */ { SaHpiSensorUnitsT value = SAHPI_SU_ERRORS; SaHpiSensorUnitsT enum_type; expected_str = "Errors"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_sensorunits(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_sensorunits(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_SU_ERRORS != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiSensorUnitsT - SAHPI_SU_CORRECTABLE_ERRORS testcase */ { SaHpiSensorUnitsT value = SAHPI_SU_CORRECTABLE_ERRORS; SaHpiSensorUnitsT enum_type; expected_str = "Correctable Errors"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_sensorunits(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_sensorunits(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_SU_CORRECTABLE_ERRORS != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiSensorUnitsT - SAHPI_SU_UNCORRECTABLE_ERRORS testcase */ { SaHpiSensorUnitsT value = SAHPI_SU_UNCORRECTABLE_ERRORS; SaHpiSensorUnitsT enum_type; expected_str = "Uncorrectable Errors"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_sensorunits(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_sensorunits(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_SU_UNCORRECTABLE_ERRORS != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiSensorUnitsT - Default testcase */ { SaHpiSensorUnitsT value = BAD_ENUM_VALUE; expected_str = NULL; str = oh_lookup_sensorunits(value); if (str != expected_str) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s; Expected string=%s\n", str, expected_str); return -1; } } { /* SaHpiSensorUnitsT - NULL buffer testcase */ SaErrorT err, expected_err; SaHpiTextBufferT buffer; SaHpiSensorUnitsT enum_type; expected_err = SA_ERR_HPI_INVALID_PARAMS; err = oh_encode_sensorunits(0, &enum_type); if (err != expected_err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d; Expected error=%d\n", err, expected_err); return -1; } /* SaHpiSensorUnitsT - Invalid type testcase */ err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, "INVALID_TYPE"); expected_err = SA_ERR_HPI_INVALID_DATA; err = oh_encode_sensorunits(&buffer, &enum_type); if (err != expected_err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d; Expected error=%d\n", err, expected_err); return -1; } } /* SaHpiSensorModUnitUseT - SAHPI_SMUU_NONE testcase */ { SaHpiSensorModUnitUseT value = SAHPI_SMUU_NONE; SaHpiSensorModUnitUseT enum_type; expected_str = "NONE"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_sensormodunituse(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_sensormodunituse(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_SMUU_NONE != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiSensorModUnitUseT - SAHPI_SMUU_BASIC_OVER_MODIFIER testcase */ { SaHpiSensorModUnitUseT value = SAHPI_SMUU_BASIC_OVER_MODIFIER; SaHpiSensorModUnitUseT enum_type; expected_str = "BASIC_OVER_MODIFIER"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_sensormodunituse(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_sensormodunituse(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_SMUU_BASIC_OVER_MODIFIER != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiSensorModUnitUseT - SAHPI_SMUU_BASIC_TIMES_MODIFIER testcase */ { SaHpiSensorModUnitUseT value = SAHPI_SMUU_BASIC_TIMES_MODIFIER; SaHpiSensorModUnitUseT enum_type; expected_str = "BASIC_TIMES_MODIFIER"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_sensormodunituse(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_sensormodunituse(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_SMUU_BASIC_TIMES_MODIFIER != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiSensorModUnitUseT - Default testcase */ { SaHpiSensorModUnitUseT value = BAD_ENUM_VALUE; expected_str = NULL; str = oh_lookup_sensormodunituse(value); if (str != expected_str) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s; Expected string=%s\n", str, expected_str); return -1; } } { /* SaHpiSensorModUnitUseT - NULL buffer testcase */ SaErrorT err, expected_err; SaHpiTextBufferT buffer; SaHpiSensorModUnitUseT enum_type; expected_err = SA_ERR_HPI_INVALID_PARAMS; err = oh_encode_sensormodunituse(0, &enum_type); if (err != expected_err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d; Expected error=%d\n", err, expected_err); return -1; } /* SaHpiSensorModUnitUseT - Invalid type testcase */ err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, "INVALID_TYPE"); expected_err = SA_ERR_HPI_INVALID_DATA; err = oh_encode_sensormodunituse(&buffer, &enum_type); if (err != expected_err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d; Expected error=%d\n", err, expected_err); return -1; } } /* SaHpiSensorEventCtrlT - SAHPI_SEC_PER_EVENT testcase */ { SaHpiSensorEventCtrlT value = SAHPI_SEC_PER_EVENT; SaHpiSensorEventCtrlT enum_type; expected_str = "PER_EVENT"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_sensoreventctrl(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_sensoreventctrl(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_SEC_PER_EVENT != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiSensorEventCtrlT - SAHPI_SEC_READ_ONLY_MASKS testcase */ { SaHpiSensorEventCtrlT value = SAHPI_SEC_READ_ONLY_MASKS; SaHpiSensorEventCtrlT enum_type; expected_str = "READ_ONLY_MASKS"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_sensoreventctrl(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_sensoreventctrl(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_SEC_READ_ONLY_MASKS != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiSensorEventCtrlT - SAHPI_SEC_READ_ONLY testcase */ { SaHpiSensorEventCtrlT value = SAHPI_SEC_READ_ONLY; SaHpiSensorEventCtrlT enum_type; expected_str = "READ_ONLY"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_sensoreventctrl(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_sensoreventctrl(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_SEC_READ_ONLY != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiSensorEventCtrlT - Default testcase */ { SaHpiSensorEventCtrlT value = BAD_ENUM_VALUE; expected_str = NULL; str = oh_lookup_sensoreventctrl(value); if (str != expected_str) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s; Expected string=%s\n", str, expected_str); return -1; } } { /* SaHpiSensorEventCtrlT - NULL buffer testcase */ SaErrorT err, expected_err; SaHpiTextBufferT buffer; SaHpiSensorEventCtrlT enum_type; expected_err = SA_ERR_HPI_INVALID_PARAMS; err = oh_encode_sensoreventctrl(0, &enum_type); if (err != expected_err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d; Expected error=%d\n", err, expected_err); return -1; } /* SaHpiSensorEventCtrlT - Invalid type testcase */ err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, "INVALID_TYPE"); expected_err = SA_ERR_HPI_INVALID_DATA; err = oh_encode_sensoreventctrl(&buffer, &enum_type); if (err != expected_err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d; Expected error=%d\n", err, expected_err); return -1; } } /* SaHpiCtrlTypeT - SAHPI_CTRL_TYPE_DIGITAL testcase */ { SaHpiCtrlTypeT value = SAHPI_CTRL_TYPE_DIGITAL; SaHpiCtrlTypeT enum_type; expected_str = "DIGITAL"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_ctrltype(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_ctrltype(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_CTRL_TYPE_DIGITAL != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiCtrlTypeT - SAHPI_CTRL_TYPE_DISCRETE testcase */ { SaHpiCtrlTypeT value = SAHPI_CTRL_TYPE_DISCRETE; SaHpiCtrlTypeT enum_type; expected_str = "DISCRETE"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_ctrltype(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_ctrltype(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_CTRL_TYPE_DISCRETE != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiCtrlTypeT - SAHPI_CTRL_TYPE_ANALOG testcase */ { SaHpiCtrlTypeT value = SAHPI_CTRL_TYPE_ANALOG; SaHpiCtrlTypeT enum_type; expected_str = "ANALOG"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_ctrltype(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_ctrltype(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_CTRL_TYPE_ANALOG != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiCtrlTypeT - SAHPI_CTRL_TYPE_STREAM testcase */ { SaHpiCtrlTypeT value = SAHPI_CTRL_TYPE_STREAM; SaHpiCtrlTypeT enum_type; expected_str = "STREAM"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_ctrltype(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_ctrltype(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_CTRL_TYPE_STREAM != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiCtrlTypeT - SAHPI_CTRL_TYPE_TEXT testcase */ { SaHpiCtrlTypeT value = SAHPI_CTRL_TYPE_TEXT; SaHpiCtrlTypeT enum_type; expected_str = "TEXT"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_ctrltype(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_ctrltype(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_CTRL_TYPE_TEXT != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiCtrlTypeT - SAHPI_CTRL_TYPE_OEM testcase */ { SaHpiCtrlTypeT value = SAHPI_CTRL_TYPE_OEM; SaHpiCtrlTypeT enum_type; expected_str = "OEM"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_ctrltype(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_ctrltype(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_CTRL_TYPE_OEM != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiCtrlTypeT - Default testcase */ { SaHpiCtrlTypeT value = BAD_ENUM_VALUE; expected_str = NULL; str = oh_lookup_ctrltype(value); if (str != expected_str) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s; Expected string=%s\n", str, expected_str); return -1; } } { /* SaHpiCtrlTypeT - NULL buffer testcase */ SaErrorT err, expected_err; SaHpiTextBufferT buffer; SaHpiCtrlTypeT enum_type; expected_err = SA_ERR_HPI_INVALID_PARAMS; err = oh_encode_ctrltype(0, &enum_type); if (err != expected_err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d; Expected error=%d\n", err, expected_err); return -1; } /* SaHpiCtrlTypeT - Invalid type testcase */ err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, "INVALID_TYPE"); expected_err = SA_ERR_HPI_INVALID_DATA; err = oh_encode_ctrltype(&buffer, &enum_type); if (err != expected_err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d; Expected error=%d\n", err, expected_err); return -1; } } /* SaHpiCtrlStateDigitalT - SAHPI_CTRL_STATE_OFF testcase */ { SaHpiCtrlStateDigitalT value = SAHPI_CTRL_STATE_OFF; SaHpiCtrlStateDigitalT enum_type; expected_str = "OFF"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_ctrlstatedigital(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_ctrlstatedigital(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_CTRL_STATE_OFF != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiCtrlStateDigitalT - SAHPI_CTRL_STATE_ON testcase */ { SaHpiCtrlStateDigitalT value = SAHPI_CTRL_STATE_ON; SaHpiCtrlStateDigitalT enum_type; expected_str = "ON"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_ctrlstatedigital(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_ctrlstatedigital(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_CTRL_STATE_ON != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiCtrlStateDigitalT - SAHPI_CTRL_STATE_PULSE_OFF testcase */ { SaHpiCtrlStateDigitalT value = SAHPI_CTRL_STATE_PULSE_OFF; SaHpiCtrlStateDigitalT enum_type; expected_str = "PULSE_OFF"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_ctrlstatedigital(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_ctrlstatedigital(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_CTRL_STATE_PULSE_OFF != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiCtrlStateDigitalT - SAHPI_CTRL_STATE_PULSE_ON testcase */ { SaHpiCtrlStateDigitalT value = SAHPI_CTRL_STATE_PULSE_ON; SaHpiCtrlStateDigitalT enum_type; expected_str = "PULSE_ON"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_ctrlstatedigital(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_ctrlstatedigital(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_CTRL_STATE_PULSE_ON != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiCtrlStateDigitalT - Default testcase */ { SaHpiCtrlStateDigitalT value = BAD_ENUM_VALUE; expected_str = NULL; str = oh_lookup_ctrlstatedigital(value); if (str != expected_str) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s; Expected string=%s\n", str, expected_str); return -1; } } { /* SaHpiCtrlStateDigitalT - NULL buffer testcase */ SaErrorT err, expected_err; SaHpiTextBufferT buffer; SaHpiCtrlStateDigitalT enum_type; expected_err = SA_ERR_HPI_INVALID_PARAMS; err = oh_encode_ctrlstatedigital(0, &enum_type); if (err != expected_err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d; Expected error=%d\n", err, expected_err); return -1; } /* SaHpiCtrlStateDigitalT - Invalid type testcase */ err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, "INVALID_TYPE"); expected_err = SA_ERR_HPI_INVALID_DATA; err = oh_encode_ctrlstatedigital(&buffer, &enum_type); if (err != expected_err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d; Expected error=%d\n", err, expected_err); return -1; } } /* SaHpiCtrlModeT - SAHPI_CTRL_MODE_AUTO testcase */ { SaHpiCtrlModeT value = SAHPI_CTRL_MODE_AUTO; SaHpiCtrlModeT enum_type; expected_str = "AUTO"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_ctrlmode(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_ctrlmode(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_CTRL_MODE_AUTO != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiCtrlModeT - SAHPI_CTRL_MODE_MANUAL testcase */ { SaHpiCtrlModeT value = SAHPI_CTRL_MODE_MANUAL; SaHpiCtrlModeT enum_type; expected_str = "MANUAL"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_ctrlmode(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_ctrlmode(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_CTRL_MODE_MANUAL != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiCtrlModeT - Default testcase */ { SaHpiCtrlModeT value = BAD_ENUM_VALUE; expected_str = NULL; str = oh_lookup_ctrlmode(value); if (str != expected_str) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s; Expected string=%s\n", str, expected_str); return -1; } } { /* SaHpiCtrlModeT - NULL buffer testcase */ SaErrorT err, expected_err; SaHpiTextBufferT buffer; SaHpiCtrlModeT enum_type; expected_err = SA_ERR_HPI_INVALID_PARAMS; err = oh_encode_ctrlmode(0, &enum_type); if (err != expected_err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d; Expected error=%d\n", err, expected_err); return -1; } /* SaHpiCtrlModeT - Invalid type testcase */ err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, "INVALID_TYPE"); expected_err = SA_ERR_HPI_INVALID_DATA; err = oh_encode_ctrlmode(&buffer, &enum_type); if (err != expected_err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d; Expected error=%d\n", err, expected_err); return -1; } } /* SaHpiCtrlOutputTypeT - SAHPI_CTRL_GENERIC testcase */ { SaHpiCtrlOutputTypeT value = SAHPI_CTRL_GENERIC; SaHpiCtrlOutputTypeT enum_type; expected_str = "GENERIC"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_ctrloutputtype(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_ctrloutputtype(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_CTRL_GENERIC != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiCtrlOutputTypeT - SAHPI_CTRL_LED testcase */ { SaHpiCtrlOutputTypeT value = SAHPI_CTRL_LED; SaHpiCtrlOutputTypeT enum_type; expected_str = "LED"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_ctrloutputtype(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_ctrloutputtype(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_CTRL_LED != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiCtrlOutputTypeT - SAHPI_CTRL_FAN_SPEED testcase */ { SaHpiCtrlOutputTypeT value = SAHPI_CTRL_FAN_SPEED; SaHpiCtrlOutputTypeT enum_type; expected_str = "FAN_SPEED"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_ctrloutputtype(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_ctrloutputtype(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_CTRL_FAN_SPEED != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiCtrlOutputTypeT - SAHPI_CTRL_DRY_CONTACT_CLOSURE testcase */ { SaHpiCtrlOutputTypeT value = SAHPI_CTRL_DRY_CONTACT_CLOSURE; SaHpiCtrlOutputTypeT enum_type; expected_str = "DRY_CONTACT_CLOSURE"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_ctrloutputtype(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_ctrloutputtype(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_CTRL_DRY_CONTACT_CLOSURE != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiCtrlOutputTypeT - SAHPI_CTRL_POWER_SUPPLY_INHIBIT testcase */ { SaHpiCtrlOutputTypeT value = SAHPI_CTRL_POWER_SUPPLY_INHIBIT; SaHpiCtrlOutputTypeT enum_type; expected_str = "POWER_SUPPLY_INHIBIT"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_ctrloutputtype(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_ctrloutputtype(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_CTRL_POWER_SUPPLY_INHIBIT != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiCtrlOutputTypeT - SAHPI_CTRL_AUDIBLE testcase */ { SaHpiCtrlOutputTypeT value = SAHPI_CTRL_AUDIBLE; SaHpiCtrlOutputTypeT enum_type; expected_str = "AUDIBLE"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_ctrloutputtype(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_ctrloutputtype(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_CTRL_AUDIBLE != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiCtrlOutputTypeT - SAHPI_CTRL_FRONT_PANEL_LOCKOUT testcase */ { SaHpiCtrlOutputTypeT value = SAHPI_CTRL_FRONT_PANEL_LOCKOUT; SaHpiCtrlOutputTypeT enum_type; expected_str = "FRONT_PANEL_LOCKOUT"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_ctrloutputtype(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_ctrloutputtype(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_CTRL_FRONT_PANEL_LOCKOUT != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiCtrlOutputTypeT - SAHPI_CTRL_POWER_INTERLOCK testcase */ { SaHpiCtrlOutputTypeT value = SAHPI_CTRL_POWER_INTERLOCK; SaHpiCtrlOutputTypeT enum_type; expected_str = "POWER_INTERLOCK"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_ctrloutputtype(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_ctrloutputtype(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_CTRL_POWER_INTERLOCK != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiCtrlOutputTypeT - SAHPI_CTRL_POWER_STATE testcase */ { SaHpiCtrlOutputTypeT value = SAHPI_CTRL_POWER_STATE; SaHpiCtrlOutputTypeT enum_type; expected_str = "POWER_STATE"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_ctrloutputtype(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_ctrloutputtype(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_CTRL_POWER_STATE != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiCtrlOutputTypeT - SAHPI_CTRL_LCD_DISPLAY testcase */ { SaHpiCtrlOutputTypeT value = SAHPI_CTRL_LCD_DISPLAY; SaHpiCtrlOutputTypeT enum_type; expected_str = "LCD_DISPLAY"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_ctrloutputtype(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_ctrloutputtype(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_CTRL_LCD_DISPLAY != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiCtrlOutputTypeT - SAHPI_CTRL_OEM testcase */ { SaHpiCtrlOutputTypeT value = SAHPI_CTRL_OEM; SaHpiCtrlOutputTypeT enum_type; expected_str = "OEM"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_ctrloutputtype(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_ctrloutputtype(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_CTRL_OEM != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiCtrlOutputTypeT - Default testcase */ { SaHpiCtrlOutputTypeT value = BAD_ENUM_VALUE; expected_str = NULL; str = oh_lookup_ctrloutputtype(value); if (str != expected_str) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s; Expected string=%s\n", str, expected_str); return -1; } } { /* SaHpiCtrlOutputTypeT - NULL buffer testcase */ SaErrorT err, expected_err; SaHpiTextBufferT buffer; SaHpiCtrlOutputTypeT enum_type; expected_err = SA_ERR_HPI_INVALID_PARAMS; err = oh_encode_ctrloutputtype(0, &enum_type); if (err != expected_err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d; Expected error=%d\n", err, expected_err); return -1; } /* SaHpiCtrlOutputTypeT - Invalid type testcase */ err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, "INVALID_TYPE"); expected_err = SA_ERR_HPI_INVALID_DATA; err = oh_encode_ctrloutputtype(&buffer, &enum_type); if (err != expected_err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d; Expected error=%d\n", err, expected_err); return -1; } } /* SaHpiIdrAreaTypeT - SAHPI_IDR_AREATYPE_INTERNAL_USE testcase */ { SaHpiIdrAreaTypeT value = SAHPI_IDR_AREATYPE_INTERNAL_USE; SaHpiIdrAreaTypeT enum_type; expected_str = "INTERNAL_USE"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_idrareatype(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_idrareatype(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_IDR_AREATYPE_INTERNAL_USE != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiIdrAreaTypeT - SAHPI_IDR_AREATYPE_CHASSIS_INFO testcase */ { SaHpiIdrAreaTypeT value = SAHPI_IDR_AREATYPE_CHASSIS_INFO; SaHpiIdrAreaTypeT enum_type; expected_str = "CHASSIS_INFO"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_idrareatype(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_idrareatype(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_IDR_AREATYPE_CHASSIS_INFO != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiIdrAreaTypeT - SAHPI_IDR_AREATYPE_BOARD_INFO testcase */ { SaHpiIdrAreaTypeT value = SAHPI_IDR_AREATYPE_BOARD_INFO; SaHpiIdrAreaTypeT enum_type; expected_str = "BOARD_INFO"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_idrareatype(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_idrareatype(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_IDR_AREATYPE_BOARD_INFO != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiIdrAreaTypeT - SAHPI_IDR_AREATYPE_PRODUCT_INFO testcase */ { SaHpiIdrAreaTypeT value = SAHPI_IDR_AREATYPE_PRODUCT_INFO; SaHpiIdrAreaTypeT enum_type; expected_str = "PRODUCT_INFO"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_idrareatype(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_idrareatype(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_IDR_AREATYPE_PRODUCT_INFO != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiIdrAreaTypeT - SAHPI_IDR_AREATYPE_OEM testcase */ { SaHpiIdrAreaTypeT value = SAHPI_IDR_AREATYPE_OEM; SaHpiIdrAreaTypeT enum_type; expected_str = "OEM"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_idrareatype(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_idrareatype(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_IDR_AREATYPE_OEM != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiIdrAreaTypeT - SAHPI_IDR_AREATYPE_UNSPECIFIED testcase */ { SaHpiIdrAreaTypeT value = SAHPI_IDR_AREATYPE_UNSPECIFIED; SaHpiIdrAreaTypeT enum_type; expected_str = "UNSPECIFIED"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_idrareatype(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_idrareatype(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_IDR_AREATYPE_UNSPECIFIED != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiIdrAreaTypeT - Default testcase */ { SaHpiIdrAreaTypeT value = BAD_ENUM_VALUE; expected_str = NULL; str = oh_lookup_idrareatype(value); if (str != expected_str) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s; Expected string=%s\n", str, expected_str); return -1; } } { /* SaHpiIdrAreaTypeT - NULL buffer testcase */ SaErrorT err, expected_err; SaHpiTextBufferT buffer; SaHpiIdrAreaTypeT enum_type; expected_err = SA_ERR_HPI_INVALID_PARAMS; err = oh_encode_idrareatype(0, &enum_type); if (err != expected_err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d; Expected error=%d\n", err, expected_err); return -1; } /* SaHpiIdrAreaTypeT - Invalid type testcase */ err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, "INVALID_TYPE"); expected_err = SA_ERR_HPI_INVALID_DATA; err = oh_encode_idrareatype(&buffer, &enum_type); if (err != expected_err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d; Expected error=%d\n", err, expected_err); return -1; } } /* SaHpiIdrFieldTypeT - SAHPI_IDR_FIELDTYPE_CHASSIS_TYPE testcase */ { SaHpiIdrFieldTypeT value = SAHPI_IDR_FIELDTYPE_CHASSIS_TYPE; SaHpiIdrFieldTypeT enum_type; expected_str = "CHASSIS_TYPE"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_idrfieldtype(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_idrfieldtype(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_IDR_FIELDTYPE_CHASSIS_TYPE != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiIdrFieldTypeT - SAHPI_IDR_FIELDTYPE_MFG_DATETIME testcase */ { SaHpiIdrFieldTypeT value = SAHPI_IDR_FIELDTYPE_MFG_DATETIME; SaHpiIdrFieldTypeT enum_type; expected_str = "MFG_DATETIME"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_idrfieldtype(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_idrfieldtype(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_IDR_FIELDTYPE_MFG_DATETIME != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiIdrFieldTypeT - SAHPI_IDR_FIELDTYPE_MANUFACTURER testcase */ { SaHpiIdrFieldTypeT value = SAHPI_IDR_FIELDTYPE_MANUFACTURER; SaHpiIdrFieldTypeT enum_type; expected_str = "MANUFACTURER"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_idrfieldtype(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_idrfieldtype(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_IDR_FIELDTYPE_MANUFACTURER != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiIdrFieldTypeT - SAHPI_IDR_FIELDTYPE_PRODUCT_NAME testcase */ { SaHpiIdrFieldTypeT value = SAHPI_IDR_FIELDTYPE_PRODUCT_NAME; SaHpiIdrFieldTypeT enum_type; expected_str = "PRODUCT_NAME"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_idrfieldtype(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_idrfieldtype(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_IDR_FIELDTYPE_PRODUCT_NAME != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiIdrFieldTypeT - SAHPI_IDR_FIELDTYPE_PRODUCT_VERSION testcase */ { SaHpiIdrFieldTypeT value = SAHPI_IDR_FIELDTYPE_PRODUCT_VERSION; SaHpiIdrFieldTypeT enum_type; expected_str = "PRODUCT_VERSION"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_idrfieldtype(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_idrfieldtype(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_IDR_FIELDTYPE_PRODUCT_VERSION != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiIdrFieldTypeT - SAHPI_IDR_FIELDTYPE_SERIAL_NUMBER testcase */ { SaHpiIdrFieldTypeT value = SAHPI_IDR_FIELDTYPE_SERIAL_NUMBER; SaHpiIdrFieldTypeT enum_type; expected_str = "SERIAL_NUMBER"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_idrfieldtype(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_idrfieldtype(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_IDR_FIELDTYPE_SERIAL_NUMBER != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiIdrFieldTypeT - SAHPI_IDR_FIELDTYPE_PART_NUMBER testcase */ { SaHpiIdrFieldTypeT value = SAHPI_IDR_FIELDTYPE_PART_NUMBER; SaHpiIdrFieldTypeT enum_type; expected_str = "PART_NUMBER"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_idrfieldtype(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_idrfieldtype(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_IDR_FIELDTYPE_PART_NUMBER != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiIdrFieldTypeT - SAHPI_IDR_FIELDTYPE_FILE_ID testcase */ { SaHpiIdrFieldTypeT value = SAHPI_IDR_FIELDTYPE_FILE_ID; SaHpiIdrFieldTypeT enum_type; expected_str = "FILE_ID"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_idrfieldtype(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_idrfieldtype(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_IDR_FIELDTYPE_FILE_ID != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiIdrFieldTypeT - SAHPI_IDR_FIELDTYPE_ASSET_TAG testcase */ { SaHpiIdrFieldTypeT value = SAHPI_IDR_FIELDTYPE_ASSET_TAG; SaHpiIdrFieldTypeT enum_type; expected_str = "ASSET_TAG"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_idrfieldtype(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_idrfieldtype(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_IDR_FIELDTYPE_ASSET_TAG != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiIdrFieldTypeT - SAHPI_IDR_FIELDTYPE_CUSTOM testcase */ { SaHpiIdrFieldTypeT value = SAHPI_IDR_FIELDTYPE_CUSTOM; SaHpiIdrFieldTypeT enum_type; expected_str = "CUSTOM"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_idrfieldtype(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_idrfieldtype(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_IDR_FIELDTYPE_CUSTOM != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiIdrFieldTypeT - SAHPI_IDR_FIELDTYPE_UNSPECIFIED testcase */ { SaHpiIdrFieldTypeT value = SAHPI_IDR_FIELDTYPE_UNSPECIFIED; SaHpiIdrFieldTypeT enum_type; expected_str = "UNSPECIFIED"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_idrfieldtype(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_idrfieldtype(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_IDR_FIELDTYPE_UNSPECIFIED != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiIdrFieldTypeT - Default testcase */ { SaHpiIdrFieldTypeT value = BAD_ENUM_VALUE; expected_str = NULL; str = oh_lookup_idrfieldtype(value); if (str != expected_str) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s; Expected string=%s\n", str, expected_str); return -1; } } { /* SaHpiIdrFieldTypeT - NULL buffer testcase */ SaErrorT err, expected_err; SaHpiTextBufferT buffer; SaHpiIdrFieldTypeT enum_type; expected_err = SA_ERR_HPI_INVALID_PARAMS; err = oh_encode_idrfieldtype(0, &enum_type); if (err != expected_err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d; Expected error=%d\n", err, expected_err); return -1; } /* SaHpiIdrFieldTypeT - Invalid type testcase */ err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, "INVALID_TYPE"); expected_err = SA_ERR_HPI_INVALID_DATA; err = oh_encode_idrfieldtype(&buffer, &enum_type); if (err != expected_err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d; Expected error=%d\n", err, expected_err); return -1; } } /* SaHpiWatchdogActionT - SAHPI_WA_NO_ACTION testcase */ { SaHpiWatchdogActionT value = SAHPI_WA_NO_ACTION; SaHpiWatchdogActionT enum_type; expected_str = "NO_ACTION"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_watchdogaction(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_watchdogaction(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_WA_NO_ACTION != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiWatchdogActionT - SAHPI_WA_RESET testcase */ { SaHpiWatchdogActionT value = SAHPI_WA_RESET; SaHpiWatchdogActionT enum_type; expected_str = "RESET"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_watchdogaction(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_watchdogaction(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_WA_RESET != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiWatchdogActionT - SAHPI_WA_POWER_DOWN testcase */ { SaHpiWatchdogActionT value = SAHPI_WA_POWER_DOWN; SaHpiWatchdogActionT enum_type; expected_str = "POWER_DOWN"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_watchdogaction(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_watchdogaction(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_WA_POWER_DOWN != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiWatchdogActionT - SAHPI_WA_POWER_CYCLE testcase */ { SaHpiWatchdogActionT value = SAHPI_WA_POWER_CYCLE; SaHpiWatchdogActionT enum_type; expected_str = "POWER_CYCLE"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_watchdogaction(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_watchdogaction(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_WA_POWER_CYCLE != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiWatchdogActionT - Default testcase */ { SaHpiWatchdogActionT value = BAD_ENUM_VALUE; expected_str = NULL; str = oh_lookup_watchdogaction(value); if (str != expected_str) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s; Expected string=%s\n", str, expected_str); return -1; } } { /* SaHpiWatchdogActionT - NULL buffer testcase */ SaErrorT err, expected_err; SaHpiTextBufferT buffer; SaHpiWatchdogActionT enum_type; expected_err = SA_ERR_HPI_INVALID_PARAMS; err = oh_encode_watchdogaction(0, &enum_type); if (err != expected_err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d; Expected error=%d\n", err, expected_err); return -1; } /* SaHpiWatchdogActionT - Invalid type testcase */ err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, "INVALID_TYPE"); expected_err = SA_ERR_HPI_INVALID_DATA; err = oh_encode_watchdogaction(&buffer, &enum_type); if (err != expected_err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d; Expected error=%d\n", err, expected_err); return -1; } } /* SaHpiWatchdogActionEventT - SAHPI_WAE_NO_ACTION testcase */ { SaHpiWatchdogActionEventT value = SAHPI_WAE_NO_ACTION; SaHpiWatchdogActionEventT enum_type; expected_str = "NO_ACTION"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_watchdogactionevent(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_watchdogactionevent(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_WAE_NO_ACTION != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiWatchdogActionEventT - SAHPI_WAE_RESET testcase */ { SaHpiWatchdogActionEventT value = SAHPI_WAE_RESET; SaHpiWatchdogActionEventT enum_type; expected_str = "RESET"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_watchdogactionevent(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_watchdogactionevent(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_WAE_RESET != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiWatchdogActionEventT - SAHPI_WAE_POWER_DOWN testcase */ { SaHpiWatchdogActionEventT value = SAHPI_WAE_POWER_DOWN; SaHpiWatchdogActionEventT enum_type; expected_str = "POWER_DOWN"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_watchdogactionevent(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_watchdogactionevent(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_WAE_POWER_DOWN != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiWatchdogActionEventT - SAHPI_WAE_POWER_CYCLE testcase */ { SaHpiWatchdogActionEventT value = SAHPI_WAE_POWER_CYCLE; SaHpiWatchdogActionEventT enum_type; expected_str = "POWER_CYCLE"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_watchdogactionevent(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_watchdogactionevent(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_WAE_POWER_CYCLE != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiWatchdogActionEventT - SAHPI_WAE_TIMER_INT testcase */ { SaHpiWatchdogActionEventT value = SAHPI_WAE_TIMER_INT; SaHpiWatchdogActionEventT enum_type; expected_str = "TIMER_INT"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_watchdogactionevent(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_watchdogactionevent(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_WAE_TIMER_INT != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiWatchdogActionEventT - Default testcase */ { SaHpiWatchdogActionEventT value = BAD_ENUM_VALUE; expected_str = NULL; str = oh_lookup_watchdogactionevent(value); if (str != expected_str) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s; Expected string=%s\n", str, expected_str); return -1; } } { /* SaHpiWatchdogActionEventT - NULL buffer testcase */ SaErrorT err, expected_err; SaHpiTextBufferT buffer; SaHpiWatchdogActionEventT enum_type; expected_err = SA_ERR_HPI_INVALID_PARAMS; err = oh_encode_watchdogactionevent(0, &enum_type); if (err != expected_err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d; Expected error=%d\n", err, expected_err); return -1; } /* SaHpiWatchdogActionEventT - Invalid type testcase */ err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, "INVALID_TYPE"); expected_err = SA_ERR_HPI_INVALID_DATA; err = oh_encode_watchdogactionevent(&buffer, &enum_type); if (err != expected_err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d; Expected error=%d\n", err, expected_err); return -1; } } /* SaHpiWatchdogPretimerInterruptT - SAHPI_WPI_NONE testcase */ { SaHpiWatchdogPretimerInterruptT value = SAHPI_WPI_NONE; SaHpiWatchdogPretimerInterruptT enum_type; expected_str = "NONE"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_watchdogpretimerinterrupt(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_watchdogpretimerinterrupt(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_WPI_NONE != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiWatchdogPretimerInterruptT - SAHPI_WPI_SMI testcase */ { SaHpiWatchdogPretimerInterruptT value = SAHPI_WPI_SMI; SaHpiWatchdogPretimerInterruptT enum_type; expected_str = "SMI"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_watchdogpretimerinterrupt(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_watchdogpretimerinterrupt(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_WPI_SMI != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiWatchdogPretimerInterruptT - SAHPI_WPI_NMI testcase */ { SaHpiWatchdogPretimerInterruptT value = SAHPI_WPI_NMI; SaHpiWatchdogPretimerInterruptT enum_type; expected_str = "NMI"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_watchdogpretimerinterrupt(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_watchdogpretimerinterrupt(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_WPI_NMI != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiWatchdogPretimerInterruptT - SAHPI_WPI_MESSAGE_INTERRUPT testcase */ { SaHpiWatchdogPretimerInterruptT value = SAHPI_WPI_MESSAGE_INTERRUPT; SaHpiWatchdogPretimerInterruptT enum_type; expected_str = "MESSAGE_INTERRUPT"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_watchdogpretimerinterrupt(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_watchdogpretimerinterrupt(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_WPI_MESSAGE_INTERRUPT != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiWatchdogPretimerInterruptT - SAHPI_WPI_OEM testcase */ { SaHpiWatchdogPretimerInterruptT value = SAHPI_WPI_OEM; SaHpiWatchdogPretimerInterruptT enum_type; expected_str = "OEM"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_watchdogpretimerinterrupt(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_watchdogpretimerinterrupt(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_WPI_OEM != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiWatchdogPretimerInterruptT - Default testcase */ { SaHpiWatchdogPretimerInterruptT value = BAD_ENUM_VALUE; expected_str = NULL; str = oh_lookup_watchdogpretimerinterrupt(value); if (str != expected_str) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s; Expected string=%s\n", str, expected_str); return -1; } } { /* SaHpiWatchdogPretimerInterruptT - NULL buffer testcase */ SaErrorT err, expected_err; SaHpiTextBufferT buffer; SaHpiWatchdogPretimerInterruptT enum_type; expected_err = SA_ERR_HPI_INVALID_PARAMS; err = oh_encode_watchdogpretimerinterrupt(0, &enum_type); if (err != expected_err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d; Expected error=%d\n", err, expected_err); return -1; } /* SaHpiWatchdogPretimerInterruptT - Invalid type testcase */ err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, "INVALID_TYPE"); expected_err = SA_ERR_HPI_INVALID_DATA; err = oh_encode_watchdogpretimerinterrupt(&buffer, &enum_type); if (err != expected_err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d; Expected error=%d\n", err, expected_err); return -1; } } /* SaHpiWatchdogTimerUseT - SAHPI_WTU_NONE testcase */ { SaHpiWatchdogTimerUseT value = SAHPI_WTU_NONE; SaHpiWatchdogTimerUseT enum_type; expected_str = "NONE"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_watchdogtimeruse(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_watchdogtimeruse(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_WTU_NONE != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiWatchdogTimerUseT - SAHPI_WTU_BIOS_FRB2 testcase */ { SaHpiWatchdogTimerUseT value = SAHPI_WTU_BIOS_FRB2; SaHpiWatchdogTimerUseT enum_type; expected_str = "BIOS_FRB2"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_watchdogtimeruse(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_watchdogtimeruse(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_WTU_BIOS_FRB2 != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiWatchdogTimerUseT - SAHPI_WTU_BIOS_POST testcase */ { SaHpiWatchdogTimerUseT value = SAHPI_WTU_BIOS_POST; SaHpiWatchdogTimerUseT enum_type; expected_str = "BIOS_POST"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_watchdogtimeruse(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_watchdogtimeruse(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_WTU_BIOS_POST != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiWatchdogTimerUseT - SAHPI_WTU_OS_LOAD testcase */ { SaHpiWatchdogTimerUseT value = SAHPI_WTU_OS_LOAD; SaHpiWatchdogTimerUseT enum_type; expected_str = "OS_LOAD"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_watchdogtimeruse(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_watchdogtimeruse(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_WTU_OS_LOAD != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiWatchdogTimerUseT - SAHPI_WTU_SMS_OS testcase */ { SaHpiWatchdogTimerUseT value = SAHPI_WTU_SMS_OS; SaHpiWatchdogTimerUseT enum_type; expected_str = "SMS_OS"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_watchdogtimeruse(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_watchdogtimeruse(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_WTU_SMS_OS != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiWatchdogTimerUseT - SAHPI_WTU_OEM testcase */ { SaHpiWatchdogTimerUseT value = SAHPI_WTU_OEM; SaHpiWatchdogTimerUseT enum_type; expected_str = "OEM"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_watchdogtimeruse(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_watchdogtimeruse(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_WTU_OEM != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiWatchdogTimerUseT - SAHPI_WTU_UNSPECIFIED testcase */ { SaHpiWatchdogTimerUseT value = SAHPI_WTU_UNSPECIFIED; SaHpiWatchdogTimerUseT enum_type; expected_str = "UNSPECIFIED"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_watchdogtimeruse(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_watchdogtimeruse(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_WTU_UNSPECIFIED != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiWatchdogTimerUseT - Default testcase */ { SaHpiWatchdogTimerUseT value = BAD_ENUM_VALUE; expected_str = NULL; str = oh_lookup_watchdogtimeruse(value); if (str != expected_str) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s; Expected string=%s\n", str, expected_str); return -1; } } { /* SaHpiWatchdogTimerUseT - NULL buffer testcase */ SaErrorT err, expected_err; SaHpiTextBufferT buffer; SaHpiWatchdogTimerUseT enum_type; expected_err = SA_ERR_HPI_INVALID_PARAMS; err = oh_encode_watchdogtimeruse(0, &enum_type); if (err != expected_err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d; Expected error=%d\n", err, expected_err); return -1; } /* SaHpiWatchdogTimerUseT - Invalid type testcase */ err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, "INVALID_TYPE"); expected_err = SA_ERR_HPI_INVALID_DATA; err = oh_encode_watchdogtimeruse(&buffer, &enum_type); if (err != expected_err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d; Expected error=%d\n", err, expected_err); return -1; } } /* SaHpiHsIndicatorStateT - SAHPI_HS_INDICATOR_OFF testcase */ { SaHpiHsIndicatorStateT value = SAHPI_HS_INDICATOR_OFF; SaHpiHsIndicatorStateT enum_type; expected_str = "OFF"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_hsindicatorstate(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_hsindicatorstate(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_HS_INDICATOR_OFF != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiHsIndicatorStateT - SAHPI_HS_INDICATOR_ON testcase */ { SaHpiHsIndicatorStateT value = SAHPI_HS_INDICATOR_ON; SaHpiHsIndicatorStateT enum_type; expected_str = "ON"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_hsindicatorstate(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_hsindicatorstate(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_HS_INDICATOR_ON != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiHsIndicatorStateT - Default testcase */ { SaHpiHsIndicatorStateT value = BAD_ENUM_VALUE; expected_str = NULL; str = oh_lookup_hsindicatorstate(value); if (str != expected_str) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s; Expected string=%s\n", str, expected_str); return -1; } } { /* SaHpiHsIndicatorStateT - NULL buffer testcase */ SaErrorT err, expected_err; SaHpiTextBufferT buffer; SaHpiHsIndicatorStateT enum_type; expected_err = SA_ERR_HPI_INVALID_PARAMS; err = oh_encode_hsindicatorstate(0, &enum_type); if (err != expected_err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d; Expected error=%d\n", err, expected_err); return -1; } /* SaHpiHsIndicatorStateT - Invalid type testcase */ err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, "INVALID_TYPE"); expected_err = SA_ERR_HPI_INVALID_DATA; err = oh_encode_hsindicatorstate(&buffer, &enum_type); if (err != expected_err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d; Expected error=%d\n", err, expected_err); return -1; } } /* SaHpiHsActionT - SAHPI_HS_ACTION_INSERTION testcase */ { SaHpiHsActionT value = SAHPI_HS_ACTION_INSERTION; SaHpiHsActionT enum_type; expected_str = "INSERTION"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_hsaction(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_hsaction(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_HS_ACTION_INSERTION != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiHsActionT - SAHPI_HS_ACTION_EXTRACTION testcase */ { SaHpiHsActionT value = SAHPI_HS_ACTION_EXTRACTION; SaHpiHsActionT enum_type; expected_str = "EXTRACTION"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_hsaction(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_hsaction(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_HS_ACTION_EXTRACTION != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiHsActionT - Default testcase */ { SaHpiHsActionT value = BAD_ENUM_VALUE; expected_str = NULL; str = oh_lookup_hsaction(value); if (str != expected_str) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s; Expected string=%s\n", str, expected_str); return -1; } } { /* SaHpiHsActionT - NULL buffer testcase */ SaErrorT err, expected_err; SaHpiTextBufferT buffer; SaHpiHsActionT enum_type; expected_err = SA_ERR_HPI_INVALID_PARAMS; err = oh_encode_hsaction(0, &enum_type); if (err != expected_err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d; Expected error=%d\n", err, expected_err); return -1; } /* SaHpiHsActionT - Invalid type testcase */ err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, "INVALID_TYPE"); expected_err = SA_ERR_HPI_INVALID_DATA; err = oh_encode_hsaction(&buffer, &enum_type); if (err != expected_err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d; Expected error=%d\n", err, expected_err); return -1; } } /* SaHpiHsStateT - SAHPI_HS_STATE_INACTIVE testcase */ { SaHpiHsStateT value = SAHPI_HS_STATE_INACTIVE; SaHpiHsStateT enum_type; expected_str = "INACTIVE"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_hsstate(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_hsstate(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_HS_STATE_INACTIVE != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiHsStateT - SAHPI_HS_STATE_INSERTION_PENDING testcase */ { SaHpiHsStateT value = SAHPI_HS_STATE_INSERTION_PENDING; SaHpiHsStateT enum_type; expected_str = "INSERTION_PENDING"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_hsstate(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_hsstate(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_HS_STATE_INSERTION_PENDING != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiHsStateT - SAHPI_HS_STATE_ACTIVE testcase */ { SaHpiHsStateT value = SAHPI_HS_STATE_ACTIVE; SaHpiHsStateT enum_type; expected_str = "ACTIVE"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_hsstate(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_hsstate(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_HS_STATE_ACTIVE != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiHsStateT - SAHPI_HS_STATE_EXTRACTION_PENDING testcase */ { SaHpiHsStateT value = SAHPI_HS_STATE_EXTRACTION_PENDING; SaHpiHsStateT enum_type; expected_str = "EXTRACTION_PENDING"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_hsstate(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_hsstate(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_HS_STATE_EXTRACTION_PENDING != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiHsStateT - SAHPI_HS_STATE_NOT_PRESENT testcase */ { SaHpiHsStateT value = SAHPI_HS_STATE_NOT_PRESENT; SaHpiHsStateT enum_type; expected_str = "NOT_PRESENT"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_hsstate(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_hsstate(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_HS_STATE_NOT_PRESENT != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiHsStateT - Default testcase */ { SaHpiHsStateT value = BAD_ENUM_VALUE; expected_str = NULL; str = oh_lookup_hsstate(value); if (str != expected_str) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s; Expected string=%s\n", str, expected_str); return -1; } } { /* SaHpiHsStateT - NULL buffer testcase */ SaErrorT err, expected_err; SaHpiTextBufferT buffer; SaHpiHsStateT enum_type; expected_err = SA_ERR_HPI_INVALID_PARAMS; err = oh_encode_hsstate(0, &enum_type); if (err != expected_err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d; Expected error=%d\n", err, expected_err); return -1; } /* SaHpiHsStateT - Invalid type testcase */ err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, "INVALID_TYPE"); expected_err = SA_ERR_HPI_INVALID_DATA; err = oh_encode_hsstate(&buffer, &enum_type); if (err != expected_err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d; Expected error=%d\n", err, expected_err); return -1; } } /* SaHpiSeverityT - SAHPI_CRITICAL testcase */ { SaHpiSeverityT value = SAHPI_CRITICAL; SaHpiSeverityT enum_type; expected_str = "CRITICAL"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_severity(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_severity(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_CRITICAL != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiSeverityT - SAHPI_MAJOR testcase */ { SaHpiSeverityT value = SAHPI_MAJOR; SaHpiSeverityT enum_type; expected_str = "MAJOR"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_severity(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_severity(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_MAJOR != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiSeverityT - SAHPI_MINOR testcase */ { SaHpiSeverityT value = SAHPI_MINOR; SaHpiSeverityT enum_type; expected_str = "MINOR"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_severity(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_severity(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_MINOR != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiSeverityT - SAHPI_INFORMATIONAL testcase */ { SaHpiSeverityT value = SAHPI_INFORMATIONAL; SaHpiSeverityT enum_type; expected_str = "INFORMATIONAL"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_severity(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_severity(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_INFORMATIONAL != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiSeverityT - SAHPI_OK testcase */ { SaHpiSeverityT value = SAHPI_OK; SaHpiSeverityT enum_type; expected_str = "OK"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_severity(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_severity(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_OK != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiSeverityT - SAHPI_DEBUG testcase */ { SaHpiSeverityT value = SAHPI_DEBUG; SaHpiSeverityT enum_type; expected_str = "DEBUG"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_severity(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_severity(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_DEBUG != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiSeverityT - SAHPI_ALL_SEVERITIES testcase */ { SaHpiSeverityT value = SAHPI_ALL_SEVERITIES; SaHpiSeverityT enum_type; expected_str = "ALL_SEVERITIES"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_severity(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_severity(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_ALL_SEVERITIES != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiSeverityT - Default testcase */ { SaHpiSeverityT value = BAD_ENUM_VALUE; expected_str = NULL; str = oh_lookup_severity(value); if (str != expected_str) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s; Expected string=%s\n", str, expected_str); return -1; } } { /* SaHpiSeverityT - NULL buffer testcase */ SaErrorT err, expected_err; SaHpiTextBufferT buffer; SaHpiSeverityT enum_type; expected_err = SA_ERR_HPI_INVALID_PARAMS; err = oh_encode_severity(0, &enum_type); if (err != expected_err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d; Expected error=%d\n", err, expected_err); return -1; } /* SaHpiSeverityT - Invalid type testcase */ err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, "INVALID_TYPE"); expected_err = SA_ERR_HPI_INVALID_DATA; err = oh_encode_severity(&buffer, &enum_type); if (err != expected_err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d; Expected error=%d\n", err, expected_err); return -1; } } /* SaHpiResourceEventTypeT - SAHPI_RESE_RESOURCE_FAILURE testcase */ { SaHpiResourceEventTypeT value = SAHPI_RESE_RESOURCE_FAILURE; SaHpiResourceEventTypeT enum_type; expected_str = "FAILURE"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_resourceeventtype(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_resourceeventtype(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_RESE_RESOURCE_FAILURE != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiResourceEventTypeT - SAHPI_RESE_RESOURCE_RESTORED testcase */ { SaHpiResourceEventTypeT value = SAHPI_RESE_RESOURCE_RESTORED; SaHpiResourceEventTypeT enum_type; expected_str = "RESTORED"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_resourceeventtype(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_resourceeventtype(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_RESE_RESOURCE_RESTORED != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiResourceEventTypeT - SAHPI_RESE_RESOURCE_ADDED testcase */ { SaHpiResourceEventTypeT value = SAHPI_RESE_RESOURCE_ADDED; SaHpiResourceEventTypeT enum_type; expected_str = "ADDED"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_resourceeventtype(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_resourceeventtype(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_RESE_RESOURCE_ADDED != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiResourceEventTypeT - Default testcase */ { SaHpiResourceEventTypeT value = BAD_ENUM_VALUE; expected_str = NULL; str = oh_lookup_resourceeventtype(value); if (str != expected_str) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s; Expected string=%s\n", str, expected_str); return -1; } } { /* SaHpiResourceEventTypeT - NULL buffer testcase */ SaErrorT err, expected_err; SaHpiTextBufferT buffer; SaHpiResourceEventTypeT enum_type; expected_err = SA_ERR_HPI_INVALID_PARAMS; err = oh_encode_resourceeventtype(0, &enum_type); if (err != expected_err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d; Expected error=%d\n", err, expected_err); return -1; } /* SaHpiResourceEventTypeT - Invalid type testcase */ err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, "INVALID_TYPE"); expected_err = SA_ERR_HPI_INVALID_DATA; err = oh_encode_resourceeventtype(&buffer, &enum_type); if (err != expected_err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d; Expected error=%d\n", err, expected_err); return -1; } } /* SaHpiDomainEventTypeT - SAHPI_DOMAIN_REF_ADDED testcase */ { SaHpiDomainEventTypeT value = SAHPI_DOMAIN_REF_ADDED; SaHpiDomainEventTypeT enum_type; expected_str = "ADDED"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_domaineventtype(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_domaineventtype(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_DOMAIN_REF_ADDED != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiDomainEventTypeT - SAHPI_DOMAIN_REF_REMOVED testcase */ { SaHpiDomainEventTypeT value = SAHPI_DOMAIN_REF_REMOVED; SaHpiDomainEventTypeT enum_type; expected_str = "REMOVED"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_domaineventtype(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_domaineventtype(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_DOMAIN_REF_REMOVED != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiDomainEventTypeT - Default testcase */ { SaHpiDomainEventTypeT value = BAD_ENUM_VALUE; expected_str = NULL; str = oh_lookup_domaineventtype(value); if (str != expected_str) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s; Expected string=%s\n", str, expected_str); return -1; } } { /* SaHpiDomainEventTypeT - NULL buffer testcase */ SaErrorT err, expected_err; SaHpiTextBufferT buffer; SaHpiDomainEventTypeT enum_type; expected_err = SA_ERR_HPI_INVALID_PARAMS; err = oh_encode_domaineventtype(0, &enum_type); if (err != expected_err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d; Expected error=%d\n", err, expected_err); return -1; } /* SaHpiDomainEventTypeT - Invalid type testcase */ err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, "INVALID_TYPE"); expected_err = SA_ERR_HPI_INVALID_DATA; err = oh_encode_domaineventtype(&buffer, &enum_type); if (err != expected_err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d; Expected error=%d\n", err, expected_err); return -1; } } /* SaHpiSwEventTypeT - SAHPI_HPIE_AUDIT testcase */ { SaHpiSwEventTypeT value = SAHPI_HPIE_AUDIT; SaHpiSwEventTypeT enum_type; expected_str = "AUDIT"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_sweventtype(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_sweventtype(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_HPIE_AUDIT != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiSwEventTypeT - SAHPI_HPIE_STARTUP testcase */ { SaHpiSwEventTypeT value = SAHPI_HPIE_STARTUP; SaHpiSwEventTypeT enum_type; expected_str = "STARTUP"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_sweventtype(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_sweventtype(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_HPIE_STARTUP != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiSwEventTypeT - SAHPI_HPIE_OTHER testcase */ { SaHpiSwEventTypeT value = SAHPI_HPIE_OTHER; SaHpiSwEventTypeT enum_type; expected_str = "OTHER"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_sweventtype(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_sweventtype(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_HPIE_OTHER != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiSwEventTypeT - Default testcase */ { SaHpiSwEventTypeT value = BAD_ENUM_VALUE; expected_str = NULL; str = oh_lookup_sweventtype(value); if (str != expected_str) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s; Expected string=%s\n", str, expected_str); return -1; } } { /* SaHpiSwEventTypeT - NULL buffer testcase */ SaErrorT err, expected_err; SaHpiTextBufferT buffer; SaHpiSwEventTypeT enum_type; expected_err = SA_ERR_HPI_INVALID_PARAMS; err = oh_encode_sweventtype(0, &enum_type); if (err != expected_err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d; Expected error=%d\n", err, expected_err); return -1; } /* SaHpiSwEventTypeT - Invalid type testcase */ err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, "INVALID_TYPE"); expected_err = SA_ERR_HPI_INVALID_DATA; err = oh_encode_sweventtype(&buffer, &enum_type); if (err != expected_err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d; Expected error=%d\n", err, expected_err); return -1; } } /* SaHpiEventTypeT - SAHPI_ET_RESOURCE testcase */ { SaHpiEventTypeT value = SAHPI_ET_RESOURCE; SaHpiEventTypeT enum_type; expected_str = "RESOURCE"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_eventtype(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_eventtype(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_ET_RESOURCE != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiEventTypeT - SAHPI_ET_DOMAIN testcase */ { SaHpiEventTypeT value = SAHPI_ET_DOMAIN; SaHpiEventTypeT enum_type; expected_str = "DOMAIN"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_eventtype(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_eventtype(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_ET_DOMAIN != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiEventTypeT - SAHPI_ET_SENSOR testcase */ { SaHpiEventTypeT value = SAHPI_ET_SENSOR; SaHpiEventTypeT enum_type; expected_str = "SENSOR"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_eventtype(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_eventtype(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_ET_SENSOR != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiEventTypeT - SAHPI_ET_SENSOR_ENABLE_CHANGE testcase */ { SaHpiEventTypeT value = SAHPI_ET_SENSOR_ENABLE_CHANGE; SaHpiEventTypeT enum_type; expected_str = "SENSOR_ENABLE_CHANGE"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_eventtype(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_eventtype(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_ET_SENSOR_ENABLE_CHANGE != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiEventTypeT - SAHPI_ET_HOTSWAP testcase */ { SaHpiEventTypeT value = SAHPI_ET_HOTSWAP; SaHpiEventTypeT enum_type; expected_str = "HOTSWAP"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_eventtype(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_eventtype(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_ET_HOTSWAP != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiEventTypeT - SAHPI_ET_WATCHDOG testcase */ { SaHpiEventTypeT value = SAHPI_ET_WATCHDOG; SaHpiEventTypeT enum_type; expected_str = "WATCHDOG"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_eventtype(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_eventtype(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_ET_WATCHDOG != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiEventTypeT - SAHPI_ET_HPI_SW testcase */ { SaHpiEventTypeT value = SAHPI_ET_HPI_SW; SaHpiEventTypeT enum_type; expected_str = "HPI_SW"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_eventtype(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_eventtype(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_ET_HPI_SW != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiEventTypeT - SAHPI_ET_OEM testcase */ { SaHpiEventTypeT value = SAHPI_ET_OEM; SaHpiEventTypeT enum_type; expected_str = "OEM"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_eventtype(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_eventtype(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_ET_OEM != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiEventTypeT - SAHPI_ET_USER testcase */ { SaHpiEventTypeT value = SAHPI_ET_USER; SaHpiEventTypeT enum_type; expected_str = "USER"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_eventtype(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_eventtype(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_ET_USER != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiEventTypeT - Default testcase */ { SaHpiEventTypeT value = BAD_ENUM_VALUE; expected_str = NULL; str = oh_lookup_eventtype(value); if (str != expected_str) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s; Expected string=%s\n", str, expected_str); return -1; } } { /* SaHpiEventTypeT - NULL buffer testcase */ SaErrorT err, expected_err; SaHpiTextBufferT buffer; SaHpiEventTypeT enum_type; expected_err = SA_ERR_HPI_INVALID_PARAMS; err = oh_encode_eventtype(0, &enum_type); if (err != expected_err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d; Expected error=%d\n", err, expected_err); return -1; } /* SaHpiEventTypeT - Invalid type testcase */ err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, "INVALID_TYPE"); expected_err = SA_ERR_HPI_INVALID_DATA; err = oh_encode_eventtype(&buffer, &enum_type); if (err != expected_err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d; Expected error=%d\n", err, expected_err); return -1; } } /* SaHpiStatusCondTypeT - SAHPI_STATUS_COND_TYPE_SENSOR testcase */ { SaHpiStatusCondTypeT value = SAHPI_STATUS_COND_TYPE_SENSOR; SaHpiStatusCondTypeT enum_type; expected_str = "SENSOR"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_statuscondtype(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_statuscondtype(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_STATUS_COND_TYPE_SENSOR != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiStatusCondTypeT - SAHPI_STATUS_COND_TYPE_RESOURCE testcase */ { SaHpiStatusCondTypeT value = SAHPI_STATUS_COND_TYPE_RESOURCE; SaHpiStatusCondTypeT enum_type; expected_str = "RESOURCE"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_statuscondtype(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_statuscondtype(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_STATUS_COND_TYPE_RESOURCE != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiStatusCondTypeT - SAHPI_STATUS_COND_TYPE_OEM testcase */ { SaHpiStatusCondTypeT value = SAHPI_STATUS_COND_TYPE_OEM; SaHpiStatusCondTypeT enum_type; expected_str = "OEM"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_statuscondtype(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_statuscondtype(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_STATUS_COND_TYPE_OEM != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiStatusCondTypeT - SAHPI_STATUS_COND_TYPE_USER testcase */ { SaHpiStatusCondTypeT value = SAHPI_STATUS_COND_TYPE_USER; SaHpiStatusCondTypeT enum_type; expected_str = "USER"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_statuscondtype(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_statuscondtype(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_STATUS_COND_TYPE_USER != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiStatusCondTypeT - Default testcase */ { SaHpiStatusCondTypeT value = BAD_ENUM_VALUE; expected_str = NULL; str = oh_lookup_statuscondtype(value); if (str != expected_str) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s; Expected string=%s\n", str, expected_str); return -1; } } { /* SaHpiStatusCondTypeT - NULL buffer testcase */ SaErrorT err, expected_err; SaHpiTextBufferT buffer; SaHpiStatusCondTypeT enum_type; expected_err = SA_ERR_HPI_INVALID_PARAMS; err = oh_encode_statuscondtype(0, &enum_type); if (err != expected_err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d; Expected error=%d\n", err, expected_err); return -1; } /* SaHpiStatusCondTypeT - Invalid type testcase */ err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, "INVALID_TYPE"); expected_err = SA_ERR_HPI_INVALID_DATA; err = oh_encode_statuscondtype(&buffer, &enum_type); if (err != expected_err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d; Expected error=%d\n", err, expected_err); return -1; } } /* SaHpiAnnunciatorModeT - SAHPI_ANNUNCIATOR_MODE_AUTO testcase */ { SaHpiAnnunciatorModeT value = SAHPI_ANNUNCIATOR_MODE_AUTO; SaHpiAnnunciatorModeT enum_type; expected_str = "AUTO"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_annunciatormode(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_annunciatormode(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_ANNUNCIATOR_MODE_AUTO != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiAnnunciatorModeT - SAHPI_ANNUNCIATOR_MODE_USER testcase */ { SaHpiAnnunciatorModeT value = SAHPI_ANNUNCIATOR_MODE_USER; SaHpiAnnunciatorModeT enum_type; expected_str = "USER"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_annunciatormode(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_annunciatormode(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_ANNUNCIATOR_MODE_USER != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiAnnunciatorModeT - SAHPI_ANNUNCIATOR_MODE_SHARED testcase */ { SaHpiAnnunciatorModeT value = SAHPI_ANNUNCIATOR_MODE_SHARED; SaHpiAnnunciatorModeT enum_type; expected_str = "SHARED"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_annunciatormode(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_annunciatormode(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_ANNUNCIATOR_MODE_SHARED != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiAnnunciatorModeT - Default testcase */ { SaHpiAnnunciatorModeT value = BAD_ENUM_VALUE; expected_str = NULL; str = oh_lookup_annunciatormode(value); if (str != expected_str) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s; Expected string=%s\n", str, expected_str); return -1; } } { /* SaHpiAnnunciatorModeT - NULL buffer testcase */ SaErrorT err, expected_err; SaHpiTextBufferT buffer; SaHpiAnnunciatorModeT enum_type; expected_err = SA_ERR_HPI_INVALID_PARAMS; err = oh_encode_annunciatormode(0, &enum_type); if (err != expected_err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d; Expected error=%d\n", err, expected_err); return -1; } /* SaHpiAnnunciatorModeT - Invalid type testcase */ err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, "INVALID_TYPE"); expected_err = SA_ERR_HPI_INVALID_DATA; err = oh_encode_annunciatormode(&buffer, &enum_type); if (err != expected_err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d; Expected error=%d\n", err, expected_err); return -1; } } /* SaHpiAnnunciatorTypeT - SAHPI_ANNUNCIATOR_TYPE_LED testcase */ { SaHpiAnnunciatorTypeT value = SAHPI_ANNUNCIATOR_TYPE_LED; SaHpiAnnunciatorTypeT enum_type; expected_str = "LED"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_annunciatortype(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_annunciatortype(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_ANNUNCIATOR_TYPE_LED != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiAnnunciatorTypeT - SAHPI_ANNUNCIATOR_TYPE_DRY_CONTACT_CLOSURE testcase */ { SaHpiAnnunciatorTypeT value = SAHPI_ANNUNCIATOR_TYPE_DRY_CONTACT_CLOSURE; SaHpiAnnunciatorTypeT enum_type; expected_str = "DRY_CONTACT_CLOSURE"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_annunciatortype(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_annunciatortype(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_ANNUNCIATOR_TYPE_DRY_CONTACT_CLOSURE != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiAnnunciatorTypeT - SAHPI_ANNUNCIATOR_TYPE_AUDIBLE testcase */ { SaHpiAnnunciatorTypeT value = SAHPI_ANNUNCIATOR_TYPE_AUDIBLE; SaHpiAnnunciatorTypeT enum_type; expected_str = "AUDIBLE"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_annunciatortype(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_annunciatortype(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_ANNUNCIATOR_TYPE_AUDIBLE != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiAnnunciatorTypeT - SAHPI_ANNUNCIATOR_TYPE_LCD_DISPLAY testcase */ { SaHpiAnnunciatorTypeT value = SAHPI_ANNUNCIATOR_TYPE_LCD_DISPLAY; SaHpiAnnunciatorTypeT enum_type; expected_str = "LCD_DISPLAY"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_annunciatortype(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_annunciatortype(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_ANNUNCIATOR_TYPE_LCD_DISPLAY != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiAnnunciatorTypeT - SAHPI_ANNUNCIATOR_TYPE_MESSAGE testcase */ { SaHpiAnnunciatorTypeT value = SAHPI_ANNUNCIATOR_TYPE_MESSAGE; SaHpiAnnunciatorTypeT enum_type; expected_str = "MESSAGE"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_annunciatortype(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_annunciatortype(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_ANNUNCIATOR_TYPE_MESSAGE != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiAnnunciatorTypeT - SAHPI_ANNUNCIATOR_TYPE_COMPOSITE testcase */ { SaHpiAnnunciatorTypeT value = SAHPI_ANNUNCIATOR_TYPE_COMPOSITE; SaHpiAnnunciatorTypeT enum_type; expected_str = "COMPOSITE"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_annunciatortype(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_annunciatortype(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_ANNUNCIATOR_TYPE_COMPOSITE != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiAnnunciatorTypeT - SAHPI_ANNUNCIATOR_TYPE_OEM testcase */ { SaHpiAnnunciatorTypeT value = SAHPI_ANNUNCIATOR_TYPE_OEM; SaHpiAnnunciatorTypeT enum_type; expected_str = "OEM"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_annunciatortype(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_annunciatortype(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_ANNUNCIATOR_TYPE_OEM != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiAnnunciatorTypeT - Default testcase */ { SaHpiAnnunciatorTypeT value = BAD_ENUM_VALUE; expected_str = NULL; str = oh_lookup_annunciatortype(value); if (str != expected_str) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s; Expected string=%s\n", str, expected_str); return -1; } } { /* SaHpiAnnunciatorTypeT - NULL buffer testcase */ SaErrorT err, expected_err; SaHpiTextBufferT buffer; SaHpiAnnunciatorTypeT enum_type; expected_err = SA_ERR_HPI_INVALID_PARAMS; err = oh_encode_annunciatortype(0, &enum_type); if (err != expected_err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d; Expected error=%d\n", err, expected_err); return -1; } /* SaHpiAnnunciatorTypeT - Invalid type testcase */ err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, "INVALID_TYPE"); expected_err = SA_ERR_HPI_INVALID_DATA; err = oh_encode_annunciatortype(&buffer, &enum_type); if (err != expected_err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d; Expected error=%d\n", err, expected_err); return -1; } } /* SaHpiRdrTypeT - SAHPI_NO_RECORD testcase */ { SaHpiRdrTypeT value = SAHPI_NO_RECORD; SaHpiRdrTypeT enum_type; expected_str = "NO_RECORD"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_rdrtype(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_rdrtype(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_NO_RECORD != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiRdrTypeT - SAHPI_CTRL_RDR testcase */ { SaHpiRdrTypeT value = SAHPI_CTRL_RDR; SaHpiRdrTypeT enum_type; expected_str = "CTRL_RDR"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_rdrtype(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_rdrtype(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_CTRL_RDR != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiRdrTypeT - SAHPI_SENSOR_RDR testcase */ { SaHpiRdrTypeT value = SAHPI_SENSOR_RDR; SaHpiRdrTypeT enum_type; expected_str = "SENSOR_RDR"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_rdrtype(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_rdrtype(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_SENSOR_RDR != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiRdrTypeT - SAHPI_INVENTORY_RDR testcase */ { SaHpiRdrTypeT value = SAHPI_INVENTORY_RDR; SaHpiRdrTypeT enum_type; expected_str = "INVENTORY_RDR"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_rdrtype(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_rdrtype(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_INVENTORY_RDR != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiRdrTypeT - SAHPI_WATCHDOG_RDR testcase */ { SaHpiRdrTypeT value = SAHPI_WATCHDOG_RDR; SaHpiRdrTypeT enum_type; expected_str = "WATCHDOG_RDR"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_rdrtype(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_rdrtype(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_WATCHDOG_RDR != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiRdrTypeT - SAHPI_ANNUNCIATOR_RDR testcase */ { SaHpiRdrTypeT value = SAHPI_ANNUNCIATOR_RDR; SaHpiRdrTypeT enum_type; expected_str = "ANNUNCIATOR_RDR"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_rdrtype(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_rdrtype(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_ANNUNCIATOR_RDR != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiRdrTypeT - Default testcase */ { SaHpiRdrTypeT value = BAD_ENUM_VALUE; expected_str = NULL; str = oh_lookup_rdrtype(value); if (str != expected_str) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s; Expected string=%s\n", str, expected_str); return -1; } } { /* SaHpiRdrTypeT - NULL buffer testcase */ SaErrorT err, expected_err; SaHpiTextBufferT buffer; SaHpiRdrTypeT enum_type; expected_err = SA_ERR_HPI_INVALID_PARAMS; err = oh_encode_rdrtype(0, &enum_type); if (err != expected_err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d; Expected error=%d\n", err, expected_err); return -1; } /* SaHpiRdrTypeT - Invalid type testcase */ err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, "INVALID_TYPE"); expected_err = SA_ERR_HPI_INVALID_DATA; err = oh_encode_rdrtype(&buffer, &enum_type); if (err != expected_err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d; Expected error=%d\n", err, expected_err); return -1; } } /* SaHpiParmActionT - SAHPI_DEFAULT_PARM testcase */ { SaHpiParmActionT value = SAHPI_DEFAULT_PARM; SaHpiParmActionT enum_type; expected_str = "DEFAULT_PARM"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_parmaction(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_parmaction(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_DEFAULT_PARM != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiParmActionT - SAHPI_SAVE_PARM testcase */ { SaHpiParmActionT value = SAHPI_SAVE_PARM; SaHpiParmActionT enum_type; expected_str = "SAVE_PARM"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_parmaction(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_parmaction(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_SAVE_PARM != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiParmActionT - SAHPI_RESTORE_PARM testcase */ { SaHpiParmActionT value = SAHPI_RESTORE_PARM; SaHpiParmActionT enum_type; expected_str = "RESTORE_PARM"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_parmaction(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_parmaction(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_RESTORE_PARM != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiParmActionT - Default testcase */ { SaHpiParmActionT value = BAD_ENUM_VALUE; expected_str = NULL; str = oh_lookup_parmaction(value); if (str != expected_str) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s; Expected string=%s\n", str, expected_str); return -1; } } { /* SaHpiParmActionT - NULL buffer testcase */ SaErrorT err, expected_err; SaHpiTextBufferT buffer; SaHpiParmActionT enum_type; expected_err = SA_ERR_HPI_INVALID_PARAMS; err = oh_encode_parmaction(0, &enum_type); if (err != expected_err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d; Expected error=%d\n", err, expected_err); return -1; } /* SaHpiParmActionT - Invalid type testcase */ err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, "INVALID_TYPE"); expected_err = SA_ERR_HPI_INVALID_DATA; err = oh_encode_parmaction(&buffer, &enum_type); if (err != expected_err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d; Expected error=%d\n", err, expected_err); return -1; } } /* SaHpiResetActionT - SAHPI_COLD_RESET testcase */ { SaHpiResetActionT value = SAHPI_COLD_RESET; SaHpiResetActionT enum_type; expected_str = "COLD_RESET"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_resetaction(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_resetaction(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_COLD_RESET != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiResetActionT - SAHPI_WARM_RESET testcase */ { SaHpiResetActionT value = SAHPI_WARM_RESET; SaHpiResetActionT enum_type; expected_str = "WARM_RESET"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_resetaction(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_resetaction(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_WARM_RESET != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiResetActionT - SAHPI_RESET_ASSERT testcase */ { SaHpiResetActionT value = SAHPI_RESET_ASSERT; SaHpiResetActionT enum_type; expected_str = "RESET_ASSERT"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_resetaction(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_resetaction(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_RESET_ASSERT != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiResetActionT - SAHPI_RESET_DEASSERT testcase */ { SaHpiResetActionT value = SAHPI_RESET_DEASSERT; SaHpiResetActionT enum_type; expected_str = "RESET_DEASSERT"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_resetaction(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_resetaction(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_RESET_DEASSERT != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiResetActionT - Default testcase */ { SaHpiResetActionT value = BAD_ENUM_VALUE; expected_str = NULL; str = oh_lookup_resetaction(value); if (str != expected_str) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s; Expected string=%s\n", str, expected_str); return -1; } } { /* SaHpiResetActionT - NULL buffer testcase */ SaErrorT err, expected_err; SaHpiTextBufferT buffer; SaHpiResetActionT enum_type; expected_err = SA_ERR_HPI_INVALID_PARAMS; err = oh_encode_resetaction(0, &enum_type); if (err != expected_err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d; Expected error=%d\n", err, expected_err); return -1; } /* SaHpiResetActionT - Invalid type testcase */ err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, "INVALID_TYPE"); expected_err = SA_ERR_HPI_INVALID_DATA; err = oh_encode_resetaction(&buffer, &enum_type); if (err != expected_err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d; Expected error=%d\n", err, expected_err); return -1; } } /* SaHpiPowerStateT - SAHPI_POWER_OFF testcase */ { SaHpiPowerStateT value = SAHPI_POWER_OFF; SaHpiPowerStateT enum_type; expected_str = "OFF"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_powerstate(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_powerstate(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_POWER_OFF != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiPowerStateT - SAHPI_POWER_ON testcase */ { SaHpiPowerStateT value = SAHPI_POWER_ON; SaHpiPowerStateT enum_type; expected_str = "ON"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_powerstate(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_powerstate(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_POWER_ON != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiPowerStateT - SAHPI_POWER_CYCLE testcase */ { SaHpiPowerStateT value = SAHPI_POWER_CYCLE; SaHpiPowerStateT enum_type; expected_str = "CYCLE"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_powerstate(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_powerstate(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_POWER_CYCLE != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiPowerStateT - Default testcase */ { SaHpiPowerStateT value = BAD_ENUM_VALUE; expected_str = NULL; str = oh_lookup_powerstate(value); if (str != expected_str) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s; Expected string=%s\n", str, expected_str); return -1; } } { /* SaHpiPowerStateT - NULL buffer testcase */ SaErrorT err, expected_err; SaHpiTextBufferT buffer; SaHpiPowerStateT enum_type; expected_err = SA_ERR_HPI_INVALID_PARAMS; err = oh_encode_powerstate(0, &enum_type); if (err != expected_err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d; Expected error=%d\n", err, expected_err); return -1; } /* SaHpiPowerStateT - Invalid type testcase */ err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, "INVALID_TYPE"); expected_err = SA_ERR_HPI_INVALID_DATA; err = oh_encode_powerstate(&buffer, &enum_type); if (err != expected_err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d; Expected error=%d\n", err, expected_err); return -1; } } /* SaHpiEventLogOverflowActionT - SAHPI_EL_OVERFLOW_DROP testcase */ { SaHpiEventLogOverflowActionT value = SAHPI_EL_OVERFLOW_DROP; SaHpiEventLogOverflowActionT enum_type; expected_str = "OVERFLOW_DROP"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_eventlogoverflowaction(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_eventlogoverflowaction(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_EL_OVERFLOW_DROP != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiEventLogOverflowActionT - SAHPI_EL_OVERFLOW_OVERWRITE testcase */ { SaHpiEventLogOverflowActionT value = SAHPI_EL_OVERFLOW_OVERWRITE; SaHpiEventLogOverflowActionT enum_type; expected_str = "OVERFLOW_OVERWRITE"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_eventlogoverflowaction(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_eventlogoverflowaction(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_EL_OVERFLOW_OVERWRITE != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiEventLogOverflowActionT - Default testcase */ { SaHpiEventLogOverflowActionT value = BAD_ENUM_VALUE; expected_str = NULL; str = oh_lookup_eventlogoverflowaction(value); if (str != expected_str) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s; Expected string=%s\n", str, expected_str); return -1; } } { /* SaHpiEventLogOverflowActionT - NULL buffer testcase */ SaErrorT err, expected_err; SaHpiTextBufferT buffer; SaHpiEventLogOverflowActionT enum_type; expected_err = SA_ERR_HPI_INVALID_PARAMS; err = oh_encode_eventlogoverflowaction(0, &enum_type); if (err != expected_err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d; Expected error=%d\n", err, expected_err); return -1; } /* SaHpiEventLogOverflowActionT - Invalid type testcase */ err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, "INVALID_TYPE"); expected_err = SA_ERR_HPI_INVALID_DATA; err = oh_encode_eventlogoverflowaction(&buffer, &enum_type); if (err != expected_err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d; Expected error=%d\n", err, expected_err); return -1; } } /* SaErrorT - SA_OK testcase */ { SaErrorT value = SA_OK; SaErrorT enum_type; expected_str = "SA_OK"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_error(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_error(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SA_OK != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaErrorT - SA_ERR_HPI_ERROR testcase */ { SaErrorT value = SA_ERR_HPI_ERROR; SaErrorT enum_type; expected_str = "ERROR"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_error(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_error(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SA_ERR_HPI_ERROR != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaErrorT - SA_ERR_HPI_UNSUPPORTED_API testcase */ { SaErrorT value = SA_ERR_HPI_UNSUPPORTED_API; SaErrorT enum_type; expected_str = "UNSUPPORTED_API"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_error(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_error(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SA_ERR_HPI_UNSUPPORTED_API != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaErrorT - SA_ERR_HPI_BUSY testcase */ { SaErrorT value = SA_ERR_HPI_BUSY; SaErrorT enum_type; expected_str = "BUSY"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_error(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_error(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SA_ERR_HPI_BUSY != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaErrorT - SA_ERR_HPI_INTERNAL_ERROR testcase */ { SaErrorT value = SA_ERR_HPI_INTERNAL_ERROR; SaErrorT enum_type; expected_str = "INTERNAL_ERROR"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_error(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_error(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SA_ERR_HPI_INTERNAL_ERROR != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaErrorT - SA_ERR_HPI_INVALID_CMD testcase */ { SaErrorT value = SA_ERR_HPI_INVALID_CMD; SaErrorT enum_type; expected_str = "INVALID_CMD"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_error(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_error(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SA_ERR_HPI_INVALID_CMD != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaErrorT - SA_ERR_HPI_TIMEOUT testcase */ { SaErrorT value = SA_ERR_HPI_TIMEOUT; SaErrorT enum_type; expected_str = "TIMEOUT"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_error(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_error(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SA_ERR_HPI_TIMEOUT != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaErrorT - SA_ERR_HPI_OUT_OF_SPACE testcase */ { SaErrorT value = SA_ERR_HPI_OUT_OF_SPACE; SaErrorT enum_type; expected_str = "OUT_OF_SPACE"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_error(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_error(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SA_ERR_HPI_OUT_OF_SPACE != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaErrorT - SA_ERR_HPI_OUT_OF_MEMORY testcase */ { SaErrorT value = SA_ERR_HPI_OUT_OF_MEMORY; SaErrorT enum_type; expected_str = "OUT_OF_MEMORY"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_error(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_error(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SA_ERR_HPI_OUT_OF_MEMORY != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaErrorT - SA_ERR_HPI_INVALID_PARAMS testcase */ { SaErrorT value = SA_ERR_HPI_INVALID_PARAMS; SaErrorT enum_type; expected_str = "INVALID_PARAMS"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_error(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_error(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SA_ERR_HPI_INVALID_PARAMS != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaErrorT - SA_ERR_HPI_INVALID_DATA testcase */ { SaErrorT value = SA_ERR_HPI_INVALID_DATA; SaErrorT enum_type; expected_str = "INVALID_DATA"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_error(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_error(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SA_ERR_HPI_INVALID_DATA != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaErrorT - SA_ERR_HPI_NOT_PRESENT testcase */ { SaErrorT value = SA_ERR_HPI_NOT_PRESENT; SaErrorT enum_type; expected_str = "NOT_PRESENT"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_error(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_error(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SA_ERR_HPI_NOT_PRESENT != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaErrorT - SA_ERR_HPI_NO_RESPONSE testcase */ { SaErrorT value = SA_ERR_HPI_NO_RESPONSE; SaErrorT enum_type; expected_str = "NO_RESPONSE"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_error(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_error(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SA_ERR_HPI_NO_RESPONSE != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaErrorT - SA_ERR_HPI_DUPLICATE testcase */ { SaErrorT value = SA_ERR_HPI_DUPLICATE; SaErrorT enum_type; expected_str = "DUPLICATE"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_error(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_error(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SA_ERR_HPI_DUPLICATE != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaErrorT - SA_ERR_HPI_INVALID_SESSION testcase */ { SaErrorT value = SA_ERR_HPI_INVALID_SESSION; SaErrorT enum_type; expected_str = "INVALID_SESSION"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_error(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_error(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SA_ERR_HPI_INVALID_SESSION != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaErrorT - SA_ERR_HPI_INVALID_DOMAIN testcase */ { SaErrorT value = SA_ERR_HPI_INVALID_DOMAIN; SaErrorT enum_type; expected_str = "INVALID_DOMAIN"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_error(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_error(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SA_ERR_HPI_INVALID_DOMAIN != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaErrorT - SA_ERR_HPI_INVALID_RESOURCE testcase */ { SaErrorT value = SA_ERR_HPI_INVALID_RESOURCE; SaErrorT enum_type; expected_str = "INVALID_RESOURCE"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_error(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_error(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SA_ERR_HPI_INVALID_RESOURCE != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaErrorT - SA_ERR_HPI_INVALID_REQUEST testcase */ { SaErrorT value = SA_ERR_HPI_INVALID_REQUEST; SaErrorT enum_type; expected_str = "INVALID_REQUEST"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_error(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_error(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SA_ERR_HPI_INVALID_REQUEST != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaErrorT - SA_ERR_HPI_ENTITY_NOT_PRESENT testcase */ { SaErrorT value = SA_ERR_HPI_ENTITY_NOT_PRESENT; SaErrorT enum_type; expected_str = "ENTITY_NOT_PRESENT"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_error(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_error(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SA_ERR_HPI_ENTITY_NOT_PRESENT != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaErrorT - SA_ERR_HPI_READ_ONLY testcase */ { SaErrorT value = SA_ERR_HPI_READ_ONLY; SaErrorT enum_type; expected_str = "READ_ONLY"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_error(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_error(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SA_ERR_HPI_READ_ONLY != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaErrorT - SA_ERR_HPI_CAPABILITY testcase */ { SaErrorT value = SA_ERR_HPI_CAPABILITY; SaErrorT enum_type; expected_str = "CAPABILITY"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_error(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_error(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SA_ERR_HPI_CAPABILITY != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaErrorT - SA_ERR_HPI_UNKNOWN testcase */ { SaErrorT value = SA_ERR_HPI_UNKNOWN; SaErrorT enum_type; expected_str = "UNKNOWN"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_error(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_error(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SA_ERR_HPI_UNKNOWN != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaErrorT - Default testcase */ { SaErrorT value = BAD_ENUM_VALUE; expected_str = NULL; str = oh_lookup_error(value); if (str != expected_str) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s; Expected string=%s\n", str, expected_str); return -1; } } { /* SaErrorT - NULL buffer testcase */ SaErrorT err, expected_err; SaHpiTextBufferT buffer; SaErrorT enum_type; expected_err = SA_ERR_HPI_INVALID_PARAMS; err = oh_encode_error(0, &enum_type); if (err != expected_err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d; Expected error=%d\n", err, expected_err); return -1; } /* SaErrorT - Invalid type testcase */ err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, "INVALID_TYPE"); expected_err = SA_ERR_HPI_INVALID_DATA; err = oh_encode_error(&buffer, &enum_type); if (err != expected_err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d; Expected error=%d\n", err, expected_err); return -1; } } /* SaHpiEventCategoryT - SAHPI_EC_UNSPECIFIED testcase */ { SaHpiEventCategoryT value = SAHPI_EC_UNSPECIFIED; SaHpiEventCategoryT enum_type; expected_str = "UNSPECIFIED"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_eventcategory(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_eventcategory(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_EC_UNSPECIFIED != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiEventCategoryT - SAHPI_EC_THRESHOLD testcase */ { SaHpiEventCategoryT value = SAHPI_EC_THRESHOLD; SaHpiEventCategoryT enum_type; expected_str = "THRESHOLD"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_eventcategory(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_eventcategory(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_EC_THRESHOLD != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiEventCategoryT - SAHPI_EC_USAGE testcase */ { SaHpiEventCategoryT value = SAHPI_EC_USAGE; SaHpiEventCategoryT enum_type; expected_str = "USAGE"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_eventcategory(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_eventcategory(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_EC_USAGE != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiEventCategoryT - SAHPI_EC_STATE testcase */ { SaHpiEventCategoryT value = SAHPI_EC_STATE; SaHpiEventCategoryT enum_type; expected_str = "STATE"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_eventcategory(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_eventcategory(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_EC_STATE != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiEventCategoryT - SAHPI_EC_PRED_FAIL testcase */ { SaHpiEventCategoryT value = SAHPI_EC_PRED_FAIL; SaHpiEventCategoryT enum_type; expected_str = "PRED_FAIL"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_eventcategory(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_eventcategory(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_EC_PRED_FAIL != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiEventCategoryT - SAHPI_EC_LIMIT testcase */ { SaHpiEventCategoryT value = SAHPI_EC_LIMIT; SaHpiEventCategoryT enum_type; expected_str = "LIMIT"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_eventcategory(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_eventcategory(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_EC_LIMIT != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiEventCategoryT - SAHPI_EC_PERFORMANCE testcase */ { SaHpiEventCategoryT value = SAHPI_EC_PERFORMANCE; SaHpiEventCategoryT enum_type; expected_str = "PERFORMANCE"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_eventcategory(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_eventcategory(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_EC_PERFORMANCE != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiEventCategoryT - SAHPI_EC_SEVERITY testcase */ { SaHpiEventCategoryT value = SAHPI_EC_SEVERITY; SaHpiEventCategoryT enum_type; expected_str = "SEVERITY"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_eventcategory(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_eventcategory(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_EC_SEVERITY != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiEventCategoryT - SAHPI_EC_PRESENCE testcase */ { SaHpiEventCategoryT value = SAHPI_EC_PRESENCE; SaHpiEventCategoryT enum_type; expected_str = "PRESENCE"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_eventcategory(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_eventcategory(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_EC_PRESENCE != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiEventCategoryT - SAHPI_EC_ENABLE testcase */ { SaHpiEventCategoryT value = SAHPI_EC_ENABLE; SaHpiEventCategoryT enum_type; expected_str = "ENABLE"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_eventcategory(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_eventcategory(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_EC_ENABLE != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiEventCategoryT - SAHPI_EC_AVAILABILITY testcase */ { SaHpiEventCategoryT value = SAHPI_EC_AVAILABILITY; SaHpiEventCategoryT enum_type; expected_str = "AVAILABILITY"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_eventcategory(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_eventcategory(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_EC_AVAILABILITY != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiEventCategoryT - SAHPI_EC_REDUNDANCY testcase */ { SaHpiEventCategoryT value = SAHPI_EC_REDUNDANCY; SaHpiEventCategoryT enum_type; expected_str = "REDUNDANCY"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_eventcategory(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_eventcategory(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_EC_REDUNDANCY != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiEventCategoryT - SAHPI_EC_SENSOR_SPECIFIC testcase */ { SaHpiEventCategoryT value = SAHPI_EC_SENSOR_SPECIFIC; SaHpiEventCategoryT enum_type; expected_str = "SENSOR_SPECIFIC"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_eventcategory(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_eventcategory(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_EC_SENSOR_SPECIFIC != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiEventCategoryT - SAHPI_EC_GENERIC testcase */ { SaHpiEventCategoryT value = SAHPI_EC_GENERIC; SaHpiEventCategoryT enum_type; expected_str = "GENERIC"; SaErrorT err; SaHpiTextBufferT buffer; str = oh_lookup_eventcategory(value); if (strcmp(expected_str, str)) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s\n", str); printf(" Expected string=%s\n", expected_str); return -1; } err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, str); err = oh_encode_eventcategory(&buffer, &enum_type); if (err != SA_OK) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d\n", err); return -1; } if (SAHPI_EC_GENERIC != enum_type) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received enum type=%x\n", enum_type); return -1; } } /* SaHpiEventCategoryT - Default testcase */ { SaHpiEventCategoryT value = BAD_ENUM_VALUE; expected_str = NULL; str = oh_lookup_eventcategory(value); if (str != expected_str) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received string=%s; Expected string=%s\n", str, expected_str); return -1; } } { /* SaHpiEventCategoryT - NULL buffer testcase */ SaErrorT err, expected_err; SaHpiTextBufferT buffer; SaHpiEventCategoryT enum_type; expected_err = SA_ERR_HPI_INVALID_PARAMS; err = oh_encode_eventcategory(0, &enum_type); if (err != expected_err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d; Expected error=%d\n", err, expected_err); return -1; } /* SaHpiEventCategoryT - Invalid type testcase */ err = oh_init_textbuffer(&buffer); err = oh_append_textbuffer(&buffer, "INVALID_TYPE"); expected_err = SA_ERR_HPI_INVALID_DATA; err = oh_encode_eventcategory(&buffer, &enum_type); if (err != expected_err) { printf(" Error! Testcase failed. Line=%d\n", __LINE__); printf(" Received error=%d; Expected error=%d\n", err, expected_err); return -1; } } return 0; } openhpi-2.14.1/utils/t/sahpi/sahpi_text_utils_test.c0000644000076400007640000001430311302567130017472 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004, 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * Sean Dague */ #include #include #include #include #include #define fill_text_buffer(b, chartype, string) \ do { \ b.DataType = chartype; \ b.Language = SAHPI_LANG_ENGLISH; \ b.DataLength = sizeof(string) - 1; \ strncpy((char *)b.Data,string,sizeof(string) - 1); \ } while(0) #define TEXTT SAHPI_TL_TYPE_TEXT #define UNICODET SAHPI_TL_TYPE_UNICODE #define BCDPLUST SAHPI_TL_TYPE_BCDPLUS #define ASCII6T SAHPI_TL_TYPE_ASCII6 #define BINARYT SAHPI_TL_TYPE_BINARY #define failed(num) \ do { \ failcount++; \ err("Failed Test %d", num); \ } while(0) int main(int argc, char **argv) { /* const char *expected_str; */ // SaErrorT expected_err, err; SaHpiTextBufferT buffer, buffer2; oh_big_textbuffer oh_buff, oh_buff2; int failcount = 0; setenv("OPENHPI_ERROR","YES",1); // Test1 - valid text string fill_text_buffer(buffer, TEXTT, "a brown fox! "); if(!oh_valid_textbuffer(&buffer)) { failed(1); } // Test2 - valid ascii6 fill_text_buffer(buffer, ASCII6T, "XYZ 0123!"); if(!oh_valid_textbuffer(&buffer)) { failed(2); } // Test3 - valid utf16 - this is Om 42, incase anyone cares fill_text_buffer(buffer, UNICODET, "à¼à¼¤à¼¢"); if(!oh_valid_textbuffer(&buffer)) { failed(3); } // Test 4 - valid BCDPLUS fill_text_buffer(buffer, BCDPLUST, "1234-98.56:11"); if(!oh_valid_textbuffer(&buffer)) { failed(4); } // Test 5 - invalid utf16 - fill_text_buffer(buffer, UNICODET, "à¼à¼¤à¼"); if(oh_valid_textbuffer(&buffer)) { failed(5); } // Test 6 - invalid BCDPLUS fill_text_buffer(buffer, BCDPLUST, "a quick brown fox"); if(oh_valid_textbuffer(&buffer)) { failed(6); } // Test7 - invalid ascii6 fill_text_buffer(buffer, ASCII6T, "abc"); if(oh_valid_textbuffer(&buffer)) { failed(7); } // Test 8 - invalid ascii6 (has a null) memset(buffer.Data, 0, sizeof(*buffer.Data)); fill_text_buffer(buffer, ASCII6T, "abc"); buffer.DataLength++; if(oh_valid_textbuffer(&buffer)) { failed(8); } // Test 9 - invalid bcdplus (has a null) memset(buffer.Data, 0, sizeof(*buffer.Data)); fill_text_buffer(buffer, BCDPLUST, "1234"); buffer.DataLength++; if(oh_valid_textbuffer(&buffer)) { failed(9); } // Test 10 - invalid type fill_text_buffer(buffer, BINARYT + 70, "1234"); if(oh_valid_textbuffer(&buffer)) { failed(10); } // Test 11 - invalid lang fill_text_buffer(buffer, TEXTT, "1234"); buffer.Language = SAHPI_LANG_ENGLISH + 250; if(oh_valid_textbuffer(&buffer)) { failed(11); } /* * TODO: add append tests for regular text buff */ memset(&buffer2, 0, sizeof(buffer2)); buffer2.DataType = SAHPI_TL_TYPE_TEXT; buffer2.Language = SAHPI_LANG_ENGLISH; oh_init_textbuffer(&buffer); if(memcmp(&buffer, &buffer2, sizeof(buffer)) != 0) { printf("Value %d\n",memcmp(&buffer, &buffer2, sizeof(buffer))); oh_print_text(&buffer2); oh_print_text(&buffer); failed(12); goto end; } /* we know init works now */ oh_append_textbuffer(&buffer, "Some Text"); if(strncmp((char *)&buffer.Data, "Some Text", buffer.DataLength) != 0) { failed(13); } if(buffer.DataLength != 9) { failed(14); } // oh_append_textbuffer(&buffer, ", Some More Text"); if(strncmp((char *)&buffer.Data, "Some Text, Some More Text", buffer.DataLength) != 0) { failed(15); } if(buffer.DataLength != 25) { failed(16); } /*********************** * * oh_big_textbuffer tests * **********************/ memset(&oh_buff2, 0, sizeof(oh_buff2)); oh_buff2.DataType = SAHPI_TL_TYPE_TEXT; oh_buff2.Language = SAHPI_LANG_ENGLISH; oh_init_bigtext(&oh_buff); if(memcmp(&oh_buff, &oh_buff2, sizeof(oh_buff)) != 0) { printf("Value %d\n",memcmp(&oh_buff, &oh_buff2, sizeof(oh_buff))); oh_print_bigtext(&oh_buff2); oh_print_bigtext(&oh_buff); failed(32); goto end; } /* we know init works now */ oh_append_bigtext(&oh_buff, "Some Text"); if(strncmp((char *)&oh_buff.Data, "Some Text", oh_buff.DataLength) != 0) { failed(33); } if(oh_buff.DataLength != 9) { failed(34); } // oh_append_bigtext(&oh_buff, ", Some More Text"); if(strncmp((char *)&oh_buff.Data, "Some Text, Some More Text", oh_buff.DataLength) != 0) { failed(35); } if(oh_buff.DataLength != 25) { failed(36); } end: if(failcount) { return -1; } return(0); } openhpi-2.14.1/utils/sahpi_enum_utils.c0000644000076400007640000040154211302567131015052 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * Steve Sherman */ /******************************************************************* * WARNING! This file is auto-magically generated by: * ./SaHpi2code.pl. * Do not change this file manually. Update script instead *******************************************************************/ #include #include #include /** * oh_lookup_language: * @value: enum value of type SaHpiLanguageT. * * Converts @value into a string based on @value's HPI enum definition. * * Returns: * string - normal operation. * NULL - if @value not a valid SaHpiLanguageT. **/ char * oh_lookup_language(SaHpiLanguageT value) { switch (value) { case SAHPI_LANG_UNDEF: return "UNDEF"; case SAHPI_LANG_AFAR: return "AFAR"; case SAHPI_LANG_ABKHAZIAN: return "ABKHAZIAN"; case SAHPI_LANG_AFRIKAANS: return "AFRIKAANS"; case SAHPI_LANG_AMHARIC: return "AMHARIC"; case SAHPI_LANG_ARABIC: return "ARABIC"; case SAHPI_LANG_ASSAMESE: return "ASSAMESE"; case SAHPI_LANG_AYMARA: return "AYMARA"; case SAHPI_LANG_AZERBAIJANI: return "AZERBAIJANI"; case SAHPI_LANG_BASHKIR: return "BASHKIR"; case SAHPI_LANG_BYELORUSSIAN: return "BYELORUSSIAN"; case SAHPI_LANG_BULGARIAN: return "BULGARIAN"; case SAHPI_LANG_BIHARI: return "BIHARI"; case SAHPI_LANG_BISLAMA: return "BISLAMA"; case SAHPI_LANG_BENGALI: return "BENGALI"; case SAHPI_LANG_TIBETAN: return "TIBETAN"; case SAHPI_LANG_BRETON: return "BRETON"; case SAHPI_LANG_CATALAN: return "CATALAN"; case SAHPI_LANG_CORSICAN: return "CORSICAN"; case SAHPI_LANG_CZECH: return "CZECH"; case SAHPI_LANG_WELSH: return "WELSH"; case SAHPI_LANG_DANISH: return "DANISH"; case SAHPI_LANG_GERMAN: return "GERMAN"; case SAHPI_LANG_BHUTANI: return "BHUTANI"; case SAHPI_LANG_GREEK: return "GREEK"; case SAHPI_LANG_ENGLISH: return "ENGLISH"; case SAHPI_LANG_ESPERANTO: return "ESPERANTO"; case SAHPI_LANG_SPANISH: return "SPANISH"; case SAHPI_LANG_ESTONIAN: return "ESTONIAN"; case SAHPI_LANG_BASQUE: return "BASQUE"; case SAHPI_LANG_PERSIAN: return "PERSIAN"; case SAHPI_LANG_FINNISH: return "FINNISH"; case SAHPI_LANG_FIJI: return "FIJI"; case SAHPI_LANG_FAEROESE: return "FAEROESE"; case SAHPI_LANG_FRENCH: return "FRENCH"; case SAHPI_LANG_FRISIAN: return "FRISIAN"; case SAHPI_LANG_IRISH: return "IRISH"; case SAHPI_LANG_SCOTSGAELIC: return "SCOTSGAELIC"; case SAHPI_LANG_GALICIAN: return "GALICIAN"; case SAHPI_LANG_GUARANI: return "GUARANI"; case SAHPI_LANG_GUJARATI: return "GUJARATI"; case SAHPI_LANG_HAUSA: return "HAUSA"; case SAHPI_LANG_HINDI: return "HINDI"; case SAHPI_LANG_CROATIAN: return "CROATIAN"; case SAHPI_LANG_HUNGARIAN: return "HUNGARIAN"; case SAHPI_LANG_ARMENIAN: return "ARMENIAN"; case SAHPI_LANG_INTERLINGUA: return "INTERLINGUA"; case SAHPI_LANG_INTERLINGUE: return "INTERLINGUE"; case SAHPI_LANG_INUPIAK: return "INUPIAK"; case SAHPI_LANG_INDONESIAN: return "INDONESIAN"; case SAHPI_LANG_ICELANDIC: return "ICELANDIC"; case SAHPI_LANG_ITALIAN: return "ITALIAN"; case SAHPI_LANG_HEBREW: return "HEBREW"; case SAHPI_LANG_JAPANESE: return "JAPANESE"; case SAHPI_LANG_YIDDISH: return "YIDDISH"; case SAHPI_LANG_JAVANESE: return "JAVANESE"; case SAHPI_LANG_GEORGIAN: return "GEORGIAN"; case SAHPI_LANG_KAZAKH: return "KAZAKH"; case SAHPI_LANG_GREENLANDIC: return "GREENLANDIC"; case SAHPI_LANG_CAMBODIAN: return "CAMBODIAN"; case SAHPI_LANG_KANNADA: return "KANNADA"; case SAHPI_LANG_KOREAN: return "KOREAN"; case SAHPI_LANG_KASHMIRI: return "KASHMIRI"; case SAHPI_LANG_KURDISH: return "KURDISH"; case SAHPI_LANG_KIRGHIZ: return "KIRGHIZ"; case SAHPI_LANG_LATIN: return "LATIN"; case SAHPI_LANG_LINGALA: return "LINGALA"; case SAHPI_LANG_LAOTHIAN: return "LAOTHIAN"; case SAHPI_LANG_LITHUANIAN: return "LITHUANIAN"; case SAHPI_LANG_LATVIANLETTISH: return "LATVIANLETTISH"; case SAHPI_LANG_MALAGASY: return "MALAGASY"; case SAHPI_LANG_MAORI: return "MAORI"; case SAHPI_LANG_MACEDONIAN: return "MACEDONIAN"; case SAHPI_LANG_MALAYALAM: return "MALAYALAM"; case SAHPI_LANG_MONGOLIAN: return "MONGOLIAN"; case SAHPI_LANG_MOLDAVIAN: return "MOLDAVIAN"; case SAHPI_LANG_MARATHI: return "MARATHI"; case SAHPI_LANG_MALAY: return "MALAY"; case SAHPI_LANG_MALTESE: return "MALTESE"; case SAHPI_LANG_BURMESE: return "BURMESE"; case SAHPI_LANG_NAURU: return "NAURU"; case SAHPI_LANG_NEPALI: return "NEPALI"; case SAHPI_LANG_DUTCH: return "DUTCH"; case SAHPI_LANG_NORWEGIAN: return "NORWEGIAN"; case SAHPI_LANG_OCCITAN: return "OCCITAN"; case SAHPI_LANG_AFANOROMO: return "AFANOROMO"; case SAHPI_LANG_ORIYA: return "ORIYA"; case SAHPI_LANG_PUNJABI: return "PUNJABI"; case SAHPI_LANG_POLISH: return "POLISH"; case SAHPI_LANG_PASHTOPUSHTO: return "PASHTOPUSHTO"; case SAHPI_LANG_PORTUGUESE: return "PORTUGUESE"; case SAHPI_LANG_QUECHUA: return "QUECHUA"; case SAHPI_LANG_RHAETOROMANCE: return "RHAETOROMANCE"; case SAHPI_LANG_KIRUNDI: return "KIRUNDI"; case SAHPI_LANG_ROMANIAN: return "ROMANIAN"; case SAHPI_LANG_RUSSIAN: return "RUSSIAN"; case SAHPI_LANG_KINYARWANDA: return "KINYARWANDA"; case SAHPI_LANG_SANSKRIT: return "SANSKRIT"; case SAHPI_LANG_SINDHI: return "SINDHI"; case SAHPI_LANG_SANGRO: return "SANGRO"; case SAHPI_LANG_SERBOCROATIAN: return "SERBOCROATIAN"; case SAHPI_LANG_SINGHALESE: return "SINGHALESE"; case SAHPI_LANG_SLOVAK: return "SLOVAK"; case SAHPI_LANG_SLOVENIAN: return "SLOVENIAN"; case SAHPI_LANG_SAMOAN: return "SAMOAN"; case SAHPI_LANG_SHONA: return "SHONA"; case SAHPI_LANG_SOMALI: return "SOMALI"; case SAHPI_LANG_ALBANIAN: return "ALBANIAN"; case SAHPI_LANG_SERBIAN: return "SERBIAN"; case SAHPI_LANG_SISWATI: return "SISWATI"; case SAHPI_LANG_SESOTHO: return "SESOTHO"; case SAHPI_LANG_SUDANESE: return "SUDANESE"; case SAHPI_LANG_SWEDISH: return "SWEDISH"; case SAHPI_LANG_SWAHILI: return "SWAHILI"; case SAHPI_LANG_TAMIL: return "TAMIL"; case SAHPI_LANG_TELUGU: return "TELUGU"; case SAHPI_LANG_TAJIK: return "TAJIK"; case SAHPI_LANG_THAI: return "THAI"; case SAHPI_LANG_TIGRINYA: return "TIGRINYA"; case SAHPI_LANG_TURKMEN: return "TURKMEN"; case SAHPI_LANG_TAGALOG: return "TAGALOG"; case SAHPI_LANG_SETSWANA: return "SETSWANA"; case SAHPI_LANG_TONGA: return "TONGA"; case SAHPI_LANG_TURKISH: return "TURKISH"; case SAHPI_LANG_TSONGA: return "TSONGA"; case SAHPI_LANG_TATAR: return "TATAR"; case SAHPI_LANG_TWI: return "TWI"; case SAHPI_LANG_UKRAINIAN: return "UKRAINIAN"; case SAHPI_LANG_URDU: return "URDU"; case SAHPI_LANG_UZBEK: return "UZBEK"; case SAHPI_LANG_VIETNAMESE: return "VIETNAMESE"; case SAHPI_LANG_VOLAPUK: return "VOLAPUK"; case SAHPI_LANG_WOLOF: return "WOLOF"; case SAHPI_LANG_XHOSA: return "XHOSA"; case SAHPI_LANG_YORUBA: return "YORUBA"; case SAHPI_LANG_CHINESE: return "CHINESE"; case SAHPI_LANG_ZULU: return "ZULU"; default: return NULL; } } struct oh_language_map language_strings[] = { {SAHPI_LANG_UNDEF, "UNDEF"}, {SAHPI_LANG_AFAR, "AFAR"}, {SAHPI_LANG_ABKHAZIAN, "ABKHAZIAN"}, {SAHPI_LANG_AFRIKAANS, "AFRIKAANS"}, {SAHPI_LANG_AMHARIC, "AMHARIC"}, {SAHPI_LANG_ARABIC, "ARABIC"}, {SAHPI_LANG_ASSAMESE, "ASSAMESE"}, {SAHPI_LANG_AYMARA, "AYMARA"}, {SAHPI_LANG_AZERBAIJANI, "AZERBAIJANI"}, {SAHPI_LANG_BASHKIR, "BASHKIR"}, {SAHPI_LANG_BYELORUSSIAN, "BYELORUSSIAN"}, {SAHPI_LANG_BULGARIAN, "BULGARIAN"}, {SAHPI_LANG_BIHARI, "BIHARI"}, {SAHPI_LANG_BISLAMA, "BISLAMA"}, {SAHPI_LANG_BENGALI, "BENGALI"}, {SAHPI_LANG_TIBETAN, "TIBETAN"}, {SAHPI_LANG_BRETON, "BRETON"}, {SAHPI_LANG_CATALAN, "CATALAN"}, {SAHPI_LANG_CORSICAN, "CORSICAN"}, {SAHPI_LANG_CZECH, "CZECH"}, {SAHPI_LANG_WELSH, "WELSH"}, {SAHPI_LANG_DANISH, "DANISH"}, {SAHPI_LANG_GERMAN, "GERMAN"}, {SAHPI_LANG_BHUTANI, "BHUTANI"}, {SAHPI_LANG_GREEK, "GREEK"}, {SAHPI_LANG_ENGLISH, "ENGLISH"}, {SAHPI_LANG_ESPERANTO, "ESPERANTO"}, {SAHPI_LANG_SPANISH, "SPANISH"}, {SAHPI_LANG_ESTONIAN, "ESTONIAN"}, {SAHPI_LANG_BASQUE, "BASQUE"}, {SAHPI_LANG_PERSIAN, "PERSIAN"}, {SAHPI_LANG_FINNISH, "FINNISH"}, {SAHPI_LANG_FIJI, "FIJI"}, {SAHPI_LANG_FAEROESE, "FAEROESE"}, {SAHPI_LANG_FRENCH, "FRENCH"}, {SAHPI_LANG_FRISIAN, "FRISIAN"}, {SAHPI_LANG_IRISH, "IRISH"}, {SAHPI_LANG_SCOTSGAELIC, "SCOTSGAELIC"}, {SAHPI_LANG_GALICIAN, "GALICIAN"}, {SAHPI_LANG_GUARANI, "GUARANI"}, {SAHPI_LANG_GUJARATI, "GUJARATI"}, {SAHPI_LANG_HAUSA, "HAUSA"}, {SAHPI_LANG_HINDI, "HINDI"}, {SAHPI_LANG_CROATIAN, "CROATIAN"}, {SAHPI_LANG_HUNGARIAN, "HUNGARIAN"}, {SAHPI_LANG_ARMENIAN, "ARMENIAN"}, {SAHPI_LANG_INTERLINGUA, "INTERLINGUA"}, {SAHPI_LANG_INTERLINGUE, "INTERLINGUE"}, {SAHPI_LANG_INUPIAK, "INUPIAK"}, {SAHPI_LANG_INDONESIAN, "INDONESIAN"}, {SAHPI_LANG_ICELANDIC, "ICELANDIC"}, {SAHPI_LANG_ITALIAN, "ITALIAN"}, {SAHPI_LANG_HEBREW, "HEBREW"}, {SAHPI_LANG_JAPANESE, "JAPANESE"}, {SAHPI_LANG_YIDDISH, "YIDDISH"}, {SAHPI_LANG_JAVANESE, "JAVANESE"}, {SAHPI_LANG_GEORGIAN, "GEORGIAN"}, {SAHPI_LANG_KAZAKH, "KAZAKH"}, {SAHPI_LANG_GREENLANDIC, "GREENLANDIC"}, {SAHPI_LANG_CAMBODIAN, "CAMBODIAN"}, {SAHPI_LANG_KANNADA, "KANNADA"}, {SAHPI_LANG_KOREAN, "KOREAN"}, {SAHPI_LANG_KASHMIRI, "KASHMIRI"}, {SAHPI_LANG_KURDISH, "KURDISH"}, {SAHPI_LANG_KIRGHIZ, "KIRGHIZ"}, {SAHPI_LANG_LATIN, "LATIN"}, {SAHPI_LANG_LINGALA, "LINGALA"}, {SAHPI_LANG_LAOTHIAN, "LAOTHIAN"}, {SAHPI_LANG_LITHUANIAN, "LITHUANIAN"}, {SAHPI_LANG_LATVIANLETTISH, "LATVIANLETTISH"}, {SAHPI_LANG_MALAGASY, "MALAGASY"}, {SAHPI_LANG_MAORI, "MAORI"}, {SAHPI_LANG_MACEDONIAN, "MACEDONIAN"}, {SAHPI_LANG_MALAYALAM, "MALAYALAM"}, {SAHPI_LANG_MONGOLIAN, "MONGOLIAN"}, {SAHPI_LANG_MOLDAVIAN, "MOLDAVIAN"}, {SAHPI_LANG_MARATHI, "MARATHI"}, {SAHPI_LANG_MALAY, "MALAY"}, {SAHPI_LANG_MALTESE, "MALTESE"}, {SAHPI_LANG_BURMESE, "BURMESE"}, {SAHPI_LANG_NAURU, "NAURU"}, {SAHPI_LANG_NEPALI, "NEPALI"}, {SAHPI_LANG_DUTCH, "DUTCH"}, {SAHPI_LANG_NORWEGIAN, "NORWEGIAN"}, {SAHPI_LANG_OCCITAN, "OCCITAN"}, {SAHPI_LANG_AFANOROMO, "AFANOROMO"}, {SAHPI_LANG_ORIYA, "ORIYA"}, {SAHPI_LANG_PUNJABI, "PUNJABI"}, {SAHPI_LANG_POLISH, "POLISH"}, {SAHPI_LANG_PASHTOPUSHTO, "PASHTOPUSHTO"}, {SAHPI_LANG_PORTUGUESE, "PORTUGUESE"}, {SAHPI_LANG_QUECHUA, "QUECHUA"}, {SAHPI_LANG_RHAETOROMANCE, "RHAETOROMANCE"}, {SAHPI_LANG_KIRUNDI, "KIRUNDI"}, {SAHPI_LANG_ROMANIAN, "ROMANIAN"}, {SAHPI_LANG_RUSSIAN, "RUSSIAN"}, {SAHPI_LANG_KINYARWANDA, "KINYARWANDA"}, {SAHPI_LANG_SANSKRIT, "SANSKRIT"}, {SAHPI_LANG_SINDHI, "SINDHI"}, {SAHPI_LANG_SANGRO, "SANGRO"}, {SAHPI_LANG_SERBOCROATIAN, "SERBOCROATIAN"}, {SAHPI_LANG_SINGHALESE, "SINGHALESE"}, {SAHPI_LANG_SLOVAK, "SLOVAK"}, {SAHPI_LANG_SLOVENIAN, "SLOVENIAN"}, {SAHPI_LANG_SAMOAN, "SAMOAN"}, {SAHPI_LANG_SHONA, "SHONA"}, {SAHPI_LANG_SOMALI, "SOMALI"}, {SAHPI_LANG_ALBANIAN, "ALBANIAN"}, {SAHPI_LANG_SERBIAN, "SERBIAN"}, {SAHPI_LANG_SISWATI, "SISWATI"}, {SAHPI_LANG_SESOTHO, "SESOTHO"}, {SAHPI_LANG_SUDANESE, "SUDANESE"}, {SAHPI_LANG_SWEDISH, "SWEDISH"}, {SAHPI_LANG_SWAHILI, "SWAHILI"}, {SAHPI_LANG_TAMIL, "TAMIL"}, {SAHPI_LANG_TELUGU, "TELUGU"}, {SAHPI_LANG_TAJIK, "TAJIK"}, {SAHPI_LANG_THAI, "THAI"}, {SAHPI_LANG_TIGRINYA, "TIGRINYA"}, {SAHPI_LANG_TURKMEN, "TURKMEN"}, {SAHPI_LANG_TAGALOG, "TAGALOG"}, {SAHPI_LANG_SETSWANA, "SETSWANA"}, {SAHPI_LANG_TONGA, "TONGA"}, {SAHPI_LANG_TURKISH, "TURKISH"}, {SAHPI_LANG_TSONGA, "TSONGA"}, {SAHPI_LANG_TATAR, "TATAR"}, {SAHPI_LANG_TWI, "TWI"}, {SAHPI_LANG_UKRAINIAN, "UKRAINIAN"}, {SAHPI_LANG_URDU, "URDU"}, {SAHPI_LANG_UZBEK, "UZBEK"}, {SAHPI_LANG_VIETNAMESE, "VIETNAMESE"}, {SAHPI_LANG_VOLAPUK, "VOLAPUK"}, {SAHPI_LANG_WOLOF, "WOLOF"}, {SAHPI_LANG_XHOSA, "XHOSA"}, {SAHPI_LANG_YORUBA, "YORUBA"}, {SAHPI_LANG_CHINESE, "CHINESE"}, {SAHPI_LANG_ZULU, "ZULU"}, }; /** * oh_encode_language: * @buffer: Pointer to SaHpiTextBufferT that contains enum's string representation. * @type: Location (of SaHpiLanguageT) to place encoded result. * * Converts a @buffer->Data string, generated by oh_lookup_language(), back * into an SaHpiLanguageT type. * * Returns: * SaHpiLanguageT value - normal operation. * SA_ERR_HPI_INVALID_PARAMS - if @buffer or @type is NULL or @buffer->Data empty. * SA_ERR_HPI_INVALID_DATA - if @buffer->Data is invalid. **/ SaErrorT oh_encode_language(SaHpiTextBufferT *buffer, SaHpiLanguageT *type) { int i, found; if (!buffer || !type || buffer->Data == NULL || buffer->Data[0] == '\0') { return(SA_ERR_HPI_INVALID_PARAMS); } found = 0; for (i=0; iData, language_strings[i].str) == 0) { found++; break; } } if (found) { *type = language_strings[i].entity_type; } else { return(SA_ERR_HPI_INVALID_DATA); } return(SA_OK); } /** * oh_lookup_texttype: * @value: enum value of type SaHpiTextTypeT. * * Converts @value into a string based on @value's HPI enum definition. * * Returns: * string - normal operation. * NULL - if @value not a valid SaHpiTextTypeT. **/ char * oh_lookup_texttype(SaHpiTextTypeT value) { switch (value) { case SAHPI_TL_TYPE_UNICODE: return "UNICODE"; case SAHPI_TL_TYPE_BCDPLUS: return "BCDPLUS"; case SAHPI_TL_TYPE_ASCII6: return "ASCII6"; case SAHPI_TL_TYPE_TEXT: return "TEXT"; case SAHPI_TL_TYPE_BINARY: return "BINARY"; default: return NULL; } } struct oh_texttype_map texttype_strings[] = { {SAHPI_TL_TYPE_UNICODE, "UNICODE"}, {SAHPI_TL_TYPE_BCDPLUS, "BCDPLUS"}, {SAHPI_TL_TYPE_ASCII6, "ASCII6"}, {SAHPI_TL_TYPE_TEXT, "TEXT"}, {SAHPI_TL_TYPE_BINARY, "BINARY"}, }; /** * oh_encode_texttype: * @buffer: Pointer to SaHpiTextBufferT that contains enum's string representation. * @type: Location (of SaHpiTextTypeT) to place encoded result. * * Converts a @buffer->Data string, generated by oh_lookup_texttype(), back * into an SaHpiTextTypeT type. * * Returns: * SaHpiTextTypeT value - normal operation. * SA_ERR_HPI_INVALID_PARAMS - if @buffer or @type is NULL or @buffer->Data empty. * SA_ERR_HPI_INVALID_DATA - if @buffer->Data is invalid. **/ SaErrorT oh_encode_texttype(SaHpiTextBufferT *buffer, SaHpiTextTypeT *type) { int i, found; if (!buffer || !type || buffer->Data == NULL || buffer->Data[0] == '\0') { return(SA_ERR_HPI_INVALID_PARAMS); } found = 0; for (i=0; iData, texttype_strings[i].str) == 0) { found++; break; } } if (found) { *type = texttype_strings[i].entity_type; } else { return(SA_ERR_HPI_INVALID_DATA); } return(SA_OK); } /** * oh_lookup_entitytype: * @value: enum value of type SaHpiEntityTypeT. * * Converts @value into a string based on @value's HPI enum definition. * * Returns: * string - normal operation. * NULL - if @value not a valid SaHpiEntityTypeT. **/ char * oh_lookup_entitytype(SaHpiEntityTypeT value) { switch (value) { case SAHPI_ENT_UNSPECIFIED: return "UNSPECIFIED"; case SAHPI_ENT_OTHER: return "OTHER"; case SAHPI_ENT_UNKNOWN: return "UNKNOWN"; case SAHPI_ENT_PROCESSOR: return "PROCESSOR"; case SAHPI_ENT_DISK_BAY: return "DISK_BAY"; case SAHPI_ENT_PERIPHERAL_BAY: return "PERIPHERAL_BAY"; case SAHPI_ENT_SYS_MGMNT_MODULE: return "SYS_MGMNT_MODULE"; case SAHPI_ENT_SYSTEM_BOARD: return "SYSTEM_BOARD"; case SAHPI_ENT_MEMORY_MODULE: return "MEMORY_MODULE"; case SAHPI_ENT_PROCESSOR_MODULE: return "PROCESSOR_MODULE"; case SAHPI_ENT_POWER_SUPPLY: return "POWER_SUPPLY"; case SAHPI_ENT_ADD_IN_CARD: return "ADD_IN_CARD"; case SAHPI_ENT_FRONT_PANEL_BOARD: return "FRONT_PANEL_BOARD"; case SAHPI_ENT_BACK_PANEL_BOARD: return "BACK_PANEL_BOARD"; case SAHPI_ENT_POWER_SYSTEM_BOARD: return "POWER_SYSTEM_BOARD"; case SAHPI_ENT_DRIVE_BACKPLANE: return "DRIVE_BACKPLANE"; case SAHPI_ENT_SYS_EXPANSION_BOARD: return "SYS_EXPANSION_BOARD"; case SAHPI_ENT_OTHER_SYSTEM_BOARD: return "OTHER_SYSTEM_BOARD"; case SAHPI_ENT_PROCESSOR_BOARD: return "PROCESSOR_BOARD"; case SAHPI_ENT_POWER_UNIT: return "POWER_UNIT"; case SAHPI_ENT_POWER_MODULE: return "POWER_MODULE"; case SAHPI_ENT_POWER_MGMNT: return "POWER_MGMNT"; case SAHPI_ENT_CHASSIS_BACK_PANEL_BOARD: return "CHASSIS_BACK_PANEL_BOARD"; case SAHPI_ENT_SYSTEM_CHASSIS: return "SYSTEM_CHASSIS"; case SAHPI_ENT_SUB_CHASSIS: return "SUB_CHASSIS"; case SAHPI_ENT_OTHER_CHASSIS_BOARD: return "OTHER_CHASSIS_BOARD"; case SAHPI_ENT_DISK_DRIVE_BAY: return "DISK_DRIVE_BAY"; case SAHPI_ENT_PERIPHERAL_BAY_2: return "PERIPHERAL_BAY_2"; case SAHPI_ENT_DEVICE_BAY: return "DEVICE_BAY"; case SAHPI_ENT_COOLING_DEVICE: return "COOLING_DEVICE"; case SAHPI_ENT_COOLING_UNIT: return "COOLING_UNIT"; case SAHPI_ENT_INTERCONNECT: return "INTERCONNECT"; case SAHPI_ENT_MEMORY_DEVICE: return "MEMORY_DEVICE"; case SAHPI_ENT_SYS_MGMNT_SOFTWARE: return "SYS_MGMNT_SOFTWARE"; case SAHPI_ENT_BIOS: return "BIOS"; case SAHPI_ENT_OPERATING_SYSTEM: return "OPERATING_SYSTEM"; case SAHPI_ENT_SYSTEM_BUS: return "SYSTEM_BUS"; case SAHPI_ENT_GROUP: return "GROUP"; case SAHPI_ENT_REMOTE: return "REMOTE"; case SAHPI_ENT_EXTERNAL_ENVIRONMENT: return "EXTERNAL_ENVIRONMENT"; case SAHPI_ENT_BATTERY: return "BATTERY"; case SAHPI_ENT_CHASSIS_SPECIFIC: return "CHASSIS_SPECIFIC"; case SAHPI_ENT_BOARD_SET_SPECIFIC: return "BOARD_SET_SPECIFIC"; case SAHPI_ENT_OEM_SYSINT_SPECIFIC: return "OEM_SYSINT_SPECIFIC"; case SAHPI_ENT_ROOT: return "ROOT"; case SAHPI_ENT_RACK: return "RACK"; case SAHPI_ENT_SUBRACK: return "SUBRACK"; case SAHPI_ENT_COMPACTPCI_CHASSIS: return "COMPACTPCI_CHASSIS"; case SAHPI_ENT_ADVANCEDTCA_CHASSIS: return "ADVANCEDTCA_CHASSIS"; case SAHPI_ENT_RACK_MOUNTED_SERVER: return "RACK_MOUNTED_SERVER"; case SAHPI_ENT_SYSTEM_BLADE: return "SYSTEM_BLADE"; case SAHPI_ENT_SWITCH: return "SWITCH"; case SAHPI_ENT_SWITCH_BLADE: return "SWITCH_BLADE"; case SAHPI_ENT_SBC_BLADE: return "SBC_BLADE"; case SAHPI_ENT_IO_BLADE: return "IO_BLADE"; case SAHPI_ENT_DISK_BLADE: return "DISK_BLADE"; case SAHPI_ENT_DISK_DRIVE: return "DISK_DRIVE"; case SAHPI_ENT_FAN: return "FAN"; case SAHPI_ENT_POWER_DISTRIBUTION_UNIT: return "POWER_DISTRIBUTION_UNIT"; case SAHPI_ENT_SPEC_PROC_BLADE: return "SPEC_PROC_BLADE"; case SAHPI_ENT_IO_SUBBOARD: return "IO_SUBBOARD"; case SAHPI_ENT_SBC_SUBBOARD: return "SBC_SUBBOARD"; case SAHPI_ENT_ALARM_MANAGER: return "ALARM_MANAGER"; case SAHPI_ENT_SHELF_MANAGER: return "SHELF_MANAGER"; case SAHPI_ENT_DISPLAY_PANEL: return "DISPLAY_PANEL"; case SAHPI_ENT_SUBBOARD_CARRIER_BLADE: return "SUBBOARD_CARRIER_BLADE"; case SAHPI_ENT_PHYSICAL_SLOT: return "PHYSICAL_SLOT"; default: return oh_lookup_atcahpientitytype(value); } } struct oh_entitytype_map entitytype_strings[] = { {SAHPI_ENT_UNSPECIFIED, "UNSPECIFIED"}, {SAHPI_ENT_OTHER, "OTHER"}, {SAHPI_ENT_UNKNOWN, "UNKNOWN"}, {SAHPI_ENT_PROCESSOR, "PROCESSOR"}, {SAHPI_ENT_DISK_BAY, "DISK_BAY"}, {SAHPI_ENT_PERIPHERAL_BAY, "PERIPHERAL_BAY"}, {SAHPI_ENT_SYS_MGMNT_MODULE, "SYS_MGMNT_MODULE"}, {SAHPI_ENT_SYSTEM_BOARD, "SYSTEM_BOARD"}, {SAHPI_ENT_MEMORY_MODULE, "MEMORY_MODULE"}, {SAHPI_ENT_PROCESSOR_MODULE, "PROCESSOR_MODULE"}, {SAHPI_ENT_POWER_SUPPLY, "POWER_SUPPLY"}, {SAHPI_ENT_ADD_IN_CARD, "ADD_IN_CARD"}, {SAHPI_ENT_FRONT_PANEL_BOARD, "FRONT_PANEL_BOARD"}, {SAHPI_ENT_BACK_PANEL_BOARD, "BACK_PANEL_BOARD"}, {SAHPI_ENT_POWER_SYSTEM_BOARD, "POWER_SYSTEM_BOARD"}, {SAHPI_ENT_DRIVE_BACKPLANE, "DRIVE_BACKPLANE"}, {SAHPI_ENT_SYS_EXPANSION_BOARD, "SYS_EXPANSION_BOARD"}, {SAHPI_ENT_OTHER_SYSTEM_BOARD, "OTHER_SYSTEM_BOARD"}, {SAHPI_ENT_PROCESSOR_BOARD, "PROCESSOR_BOARD"}, {SAHPI_ENT_POWER_UNIT, "POWER_UNIT"}, {SAHPI_ENT_POWER_MODULE, "POWER_MODULE"}, {SAHPI_ENT_POWER_MGMNT, "POWER_MGMNT"}, {SAHPI_ENT_CHASSIS_BACK_PANEL_BOARD, "CHASSIS_BACK_PANEL_BOARD"}, {SAHPI_ENT_SYSTEM_CHASSIS, "SYSTEM_CHASSIS"}, {SAHPI_ENT_SUB_CHASSIS, "SUB_CHASSIS"}, {SAHPI_ENT_OTHER_CHASSIS_BOARD, "OTHER_CHASSIS_BOARD"}, {SAHPI_ENT_DISK_DRIVE_BAY, "DISK_DRIVE_BAY"}, {SAHPI_ENT_PERIPHERAL_BAY_2, "PERIPHERAL_BAY_2"}, {SAHPI_ENT_DEVICE_BAY, "DEVICE_BAY"}, {SAHPI_ENT_COOLING_DEVICE, "COOLING_DEVICE"}, {SAHPI_ENT_COOLING_UNIT, "COOLING_UNIT"}, {SAHPI_ENT_INTERCONNECT, "INTERCONNECT"}, {SAHPI_ENT_MEMORY_DEVICE, "MEMORY_DEVICE"}, {SAHPI_ENT_SYS_MGMNT_SOFTWARE, "SYS_MGMNT_SOFTWARE"}, {SAHPI_ENT_BIOS, "BIOS"}, {SAHPI_ENT_OPERATING_SYSTEM, "OPERATING_SYSTEM"}, {SAHPI_ENT_SYSTEM_BUS, "SYSTEM_BUS"}, {SAHPI_ENT_GROUP, "GROUP"}, {SAHPI_ENT_REMOTE, "REMOTE"}, {SAHPI_ENT_EXTERNAL_ENVIRONMENT, "EXTERNAL_ENVIRONMENT"}, {SAHPI_ENT_BATTERY, "BATTERY"}, {SAHPI_ENT_CHASSIS_SPECIFIC, "CHASSIS_SPECIFIC"}, {SAHPI_ENT_BOARD_SET_SPECIFIC, "BOARD_SET_SPECIFIC"}, {SAHPI_ENT_OEM_SYSINT_SPECIFIC, "OEM_SYSINT_SPECIFIC"}, {SAHPI_ENT_ROOT, "ROOT"}, {SAHPI_ENT_RACK, "RACK"}, {SAHPI_ENT_SUBRACK, "SUBRACK"}, {SAHPI_ENT_COMPACTPCI_CHASSIS, "COMPACTPCI_CHASSIS"}, {SAHPI_ENT_ADVANCEDTCA_CHASSIS, "ADVANCEDTCA_CHASSIS"}, {SAHPI_ENT_RACK_MOUNTED_SERVER, "RACK_MOUNTED_SERVER"}, {SAHPI_ENT_SYSTEM_BLADE, "SYSTEM_BLADE"}, {SAHPI_ENT_SWITCH, "SWITCH"}, {SAHPI_ENT_SWITCH_BLADE, "SWITCH_BLADE"}, {SAHPI_ENT_SBC_BLADE, "SBC_BLADE"}, {SAHPI_ENT_IO_BLADE, "IO_BLADE"}, {SAHPI_ENT_DISK_BLADE, "DISK_BLADE"}, {SAHPI_ENT_DISK_DRIVE, "DISK_DRIVE"}, {SAHPI_ENT_FAN, "FAN"}, {SAHPI_ENT_POWER_DISTRIBUTION_UNIT, "POWER_DISTRIBUTION_UNIT"}, {SAHPI_ENT_SPEC_PROC_BLADE, "SPEC_PROC_BLADE"}, {SAHPI_ENT_IO_SUBBOARD, "IO_SUBBOARD"}, {SAHPI_ENT_SBC_SUBBOARD, "SBC_SUBBOARD"}, {SAHPI_ENT_ALARM_MANAGER, "ALARM_MANAGER"}, {SAHPI_ENT_SHELF_MANAGER, "SHELF_MANAGER"}, {SAHPI_ENT_DISPLAY_PANEL, "DISPLAY_PANEL"}, {SAHPI_ENT_SUBBOARD_CARRIER_BLADE, "SUBBOARD_CARRIER_BLADE"}, {SAHPI_ENT_PHYSICAL_SLOT, "PHYSICAL_SLOT"}, }; /** * oh_encode_entitytype: * @buffer: Pointer to SaHpiTextBufferT that contains enum's string representation. * @type: Location (of SaHpiEntityTypeT) to place encoded result. * * Converts a @buffer->Data string, generated by oh_lookup_entitytype(), back * into an SaHpiEntityTypeT type. * * Returns: * SaHpiEntityTypeT value - normal operation. * SA_ERR_HPI_INVALID_PARAMS - if @buffer or @type is NULL or @buffer->Data empty. * SA_ERR_HPI_INVALID_DATA - if @buffer->Data is invalid. **/ SaErrorT oh_encode_entitytype(SaHpiTextBufferT *buffer, SaHpiEntityTypeT *type) { int i, found; if (!buffer || !type || buffer->Data == NULL || buffer->Data[0] == '\0') { return(SA_ERR_HPI_INVALID_PARAMS); } found = 0; for (i=0; iData, entitytype_strings[i].str) == 0) { found++; break; } } if (found) { *type = entitytype_strings[i].entity_type; } else { return(oh_encode_atcahpientitytype(buffer, type)); } return(SA_OK); } /** * oh_lookup_sensortype: * @value: enum value of type SaHpiSensorTypeT. * * Converts @value into a string based on @value's HPI enum definition. * * Returns: * string - normal operation. * NULL - if @value not a valid SaHpiSensorTypeT. **/ char * oh_lookup_sensortype(SaHpiSensorTypeT value) { switch (value) { case SAHPI_TEMPERATURE: return "TEMPERATURE"; case SAHPI_VOLTAGE: return "VOLTAGE"; case SAHPI_CURRENT: return "CURRENT"; case SAHPI_FAN: return "FAN"; case SAHPI_PHYSICAL_SECURITY: return "PHYSICAL_SECURITY"; case SAHPI_PLATFORM_VIOLATION: return "PLATFORM_VIOLATION"; case SAHPI_PROCESSOR: return "PROCESSOR"; case SAHPI_POWER_SUPPLY: return "POWER_SUPPLY"; case SAHPI_POWER_UNIT: return "POWER_UNIT"; case SAHPI_COOLING_DEVICE: return "COOLING_DEVICE"; case SAHPI_OTHER_UNITS_BASED_SENSOR: return "OTHER_UNITS_BASED_SENSOR"; case SAHPI_MEMORY: return "MEMORY"; case SAHPI_DRIVE_SLOT: return "DRIVE_SLOT"; case SAHPI_POST_MEMORY_RESIZE: return "POST_MEMORY_RESIZE"; case SAHPI_SYSTEM_FW_PROGRESS: return "SYSTEM_FW_PROGRESS"; case SAHPI_EVENT_LOGGING_DISABLED: return "EVENT_LOGGING_DISABLED"; case SAHPI_RESERVED1: return "RESERVED1"; case SAHPI_SYSTEM_EVENT: return "SYSTEM_EVENT"; case SAHPI_CRITICAL_INTERRUPT: return "CRITICAL_INTERRUPT"; case SAHPI_BUTTON: return "BUTTON"; case SAHPI_MODULE_BOARD: return "MODULE_BOARD"; case SAHPI_MICROCONTROLLER_COPROCESSOR: return "MICROCONTROLLER_COPROCESSOR"; case SAHPI_ADDIN_CARD: return "ADDIN_CARD"; case SAHPI_CHASSIS: return "CHASSIS"; case SAHPI_CHIP_SET: return "CHIP_SET"; case SAHPI_OTHER_FRU: return "OTHER_FRU"; case SAHPI_CABLE_INTERCONNECT: return "CABLE_INTERCONNECT"; case SAHPI_TERMINATOR: return "TERMINATOR"; case SAHPI_SYSTEM_BOOT_INITIATED: return "SYSTEM_BOOT_INITIATED"; case SAHPI_BOOT_ERROR: return "BOOT_ERROR"; case SAHPI_OS_BOOT: return "OS_BOOT"; case SAHPI_OS_CRITICAL_STOP: return "OS_CRITICAL_STOP"; case SAHPI_SLOT_CONNECTOR: return "SLOT_CONNECTOR"; case SAHPI_SYSTEM_ACPI_POWER_STATE: return "SYSTEM_ACPI_POWER_STATE"; case SAHPI_RESERVED2: return "RESERVED2"; case SAHPI_PLATFORM_ALERT: return "PLATFORM_ALERT"; case SAHPI_ENTITY_PRESENCE: return "ENTITY_PRESENCE"; case SAHPI_MONITOR_ASIC_IC: return "MONITOR_ASIC_IC"; case SAHPI_LAN: return "LAN"; case SAHPI_MANAGEMENT_SUBSYSTEM_HEALTH: return "MANAGEMENT_SUBSYSTEM_HEALTH"; case SAHPI_BATTERY: return "BATTERY"; case SAHPI_SESSION_AUDIT: return "SESSION_AUDIT"; case SAHPI_VERSION_CHANGE: return "VERSION_CHANGE"; case SAHPI_OPERATIONAL: return "OPERATIONAL"; case SAHPI_OEM_SENSOR: return "OEM_SENSOR"; case SAHPI_COMM_CHANNEL_LINK_STATE: return "COMM_CHANNEL_LINK_STATE"; case SAHPI_MANAGEMENT_BUS_STATE: return "MANAGEMENT_BUS_STATE"; default: return NULL; } } struct oh_sensortype_map sensortype_strings[] = { {SAHPI_TEMPERATURE, "TEMPERATURE"}, {SAHPI_VOLTAGE, "VOLTAGE"}, {SAHPI_CURRENT, "CURRENT"}, {SAHPI_FAN, "FAN"}, {SAHPI_PHYSICAL_SECURITY, "PHYSICAL_SECURITY"}, {SAHPI_PLATFORM_VIOLATION, "PLATFORM_VIOLATION"}, {SAHPI_PROCESSOR, "PROCESSOR"}, {SAHPI_POWER_SUPPLY, "POWER_SUPPLY"}, {SAHPI_POWER_UNIT, "POWER_UNIT"}, {SAHPI_COOLING_DEVICE, "COOLING_DEVICE"}, {SAHPI_OTHER_UNITS_BASED_SENSOR, "OTHER_UNITS_BASED_SENSOR"}, {SAHPI_MEMORY, "MEMORY"}, {SAHPI_DRIVE_SLOT, "DRIVE_SLOT"}, {SAHPI_POST_MEMORY_RESIZE, "POST_MEMORY_RESIZE"}, {SAHPI_SYSTEM_FW_PROGRESS, "SYSTEM_FW_PROGRESS"}, {SAHPI_EVENT_LOGGING_DISABLED, "EVENT_LOGGING_DISABLED"}, {SAHPI_RESERVED1, "RESERVED1"}, {SAHPI_SYSTEM_EVENT, "SYSTEM_EVENT"}, {SAHPI_CRITICAL_INTERRUPT, "CRITICAL_INTERRUPT"}, {SAHPI_BUTTON, "BUTTON"}, {SAHPI_MODULE_BOARD, "MODULE_BOARD"}, {SAHPI_MICROCONTROLLER_COPROCESSOR, "MICROCONTROLLER_COPROCESSOR"}, {SAHPI_ADDIN_CARD, "ADDIN_CARD"}, {SAHPI_CHASSIS, "CHASSIS"}, {SAHPI_CHIP_SET, "CHIP_SET"}, {SAHPI_OTHER_FRU, "OTHER_FRU"}, {SAHPI_CABLE_INTERCONNECT, "CABLE_INTERCONNECT"}, {SAHPI_TERMINATOR, "TERMINATOR"}, {SAHPI_SYSTEM_BOOT_INITIATED, "SYSTEM_BOOT_INITIATED"}, {SAHPI_BOOT_ERROR, "BOOT_ERROR"}, {SAHPI_OS_BOOT, "OS_BOOT"}, {SAHPI_OS_CRITICAL_STOP, "OS_CRITICAL_STOP"}, {SAHPI_SLOT_CONNECTOR, "SLOT_CONNECTOR"}, {SAHPI_SYSTEM_ACPI_POWER_STATE, "SYSTEM_ACPI_POWER_STATE"}, {SAHPI_RESERVED2, "RESERVED2"}, {SAHPI_PLATFORM_ALERT, "PLATFORM_ALERT"}, {SAHPI_ENTITY_PRESENCE, "ENTITY_PRESENCE"}, {SAHPI_MONITOR_ASIC_IC, "MONITOR_ASIC_IC"}, {SAHPI_LAN, "LAN"}, {SAHPI_MANAGEMENT_SUBSYSTEM_HEALTH, "MANAGEMENT_SUBSYSTEM_HEALTH"}, {SAHPI_BATTERY, "BATTERY"}, {SAHPI_SESSION_AUDIT, "SESSION_AUDIT"}, {SAHPI_VERSION_CHANGE, "VERSION_CHANGE"}, {SAHPI_OPERATIONAL, "OPERATIONAL"}, {SAHPI_OEM_SENSOR, "OEM_SENSOR"}, {SAHPI_COMM_CHANNEL_LINK_STATE, "COMM_CHANNEL_LINK_STATE"}, {SAHPI_MANAGEMENT_BUS_STATE, "MANAGEMENT_BUS_STATE"}, }; /** * oh_encode_sensortype: * @buffer: Pointer to SaHpiTextBufferT that contains enum's string representation. * @type: Location (of SaHpiSensorTypeT) to place encoded result. * * Converts a @buffer->Data string, generated by oh_lookup_sensortype(), back * into an SaHpiSensorTypeT type. * * Returns: * SaHpiSensorTypeT value - normal operation. * SA_ERR_HPI_INVALID_PARAMS - if @buffer or @type is NULL or @buffer->Data empty. * SA_ERR_HPI_INVALID_DATA - if @buffer->Data is invalid. **/ SaErrorT oh_encode_sensortype(SaHpiTextBufferT *buffer, SaHpiSensorTypeT *type) { int i, found; if (!buffer || !type || buffer->Data == NULL || buffer->Data[0] == '\0') { return(SA_ERR_HPI_INVALID_PARAMS); } found = 0; for (i=0; iData, sensortype_strings[i].str) == 0) { found++; break; } } if (found) { *type = sensortype_strings[i].entity_type; } else { return(SA_ERR_HPI_INVALID_DATA); } return(SA_OK); } /** * oh_lookup_sensorreadingtype: * @value: enum value of type SaHpiSensorReadingTypeT. * * Converts @value into a string based on @value's HPI enum definition. * * Returns: * string - normal operation. * NULL - if @value not a valid SaHpiSensorReadingTypeT. **/ char * oh_lookup_sensorreadingtype(SaHpiSensorReadingTypeT value) { switch (value) { case SAHPI_SENSOR_READING_TYPE_INT64: return "INT64"; case SAHPI_SENSOR_READING_TYPE_UINT64: return "UINT64"; case SAHPI_SENSOR_READING_TYPE_FLOAT64: return "FLOAT64"; case SAHPI_SENSOR_READING_TYPE_BUFFER: return "BUFFER"; default: return NULL; } } struct oh_sensorreadingtype_map sensorreadingtype_strings[] = { {SAHPI_SENSOR_READING_TYPE_INT64, "INT64"}, {SAHPI_SENSOR_READING_TYPE_UINT64, "UINT64"}, {SAHPI_SENSOR_READING_TYPE_FLOAT64, "FLOAT64"}, {SAHPI_SENSOR_READING_TYPE_BUFFER, "BUFFER"}, }; /** * oh_encode_sensorreadingtype: * @buffer: Pointer to SaHpiTextBufferT that contains enum's string representation. * @type: Location (of SaHpiSensorReadingTypeT) to place encoded result. * * Converts a @buffer->Data string, generated by oh_lookup_sensorreadingtype(), back * into an SaHpiSensorReadingTypeT type. * * Returns: * SaHpiSensorReadingTypeT value - normal operation. * SA_ERR_HPI_INVALID_PARAMS - if @buffer or @type is NULL or @buffer->Data empty. * SA_ERR_HPI_INVALID_DATA - if @buffer->Data is invalid. **/ SaErrorT oh_encode_sensorreadingtype(SaHpiTextBufferT *buffer, SaHpiSensorReadingTypeT *type) { int i, found; if (!buffer || !type || buffer->Data == NULL || buffer->Data[0] == '\0') { return(SA_ERR_HPI_INVALID_PARAMS); } found = 0; for (i=0; iData, sensorreadingtype_strings[i].str) == 0) { found++; break; } } if (found) { *type = sensorreadingtype_strings[i].entity_type; } else { return(SA_ERR_HPI_INVALID_DATA); } return(SA_OK); } /** * oh_lookup_sensoreventmaskaction: * @value: enum value of type SaHpiSensorEventMaskActionT. * * Converts @value into a string based on @value's HPI enum definition. * * Returns: * string - normal operation. * NULL - if @value not a valid SaHpiSensorEventMaskActionT. **/ char * oh_lookup_sensoreventmaskaction(SaHpiSensorEventMaskActionT value) { switch (value) { case SAHPI_SENS_ADD_EVENTS_TO_MASKS: return "ADD_EVENTS_TO_MASKS"; case SAHPI_SENS_REMOVE_EVENTS_FROM_MASKS: return "REMOVE_EVENTS_FROM_MASKS"; default: return NULL; } } struct oh_sensoreventmaskaction_map sensoreventmaskaction_strings[] = { {SAHPI_SENS_ADD_EVENTS_TO_MASKS, "ADD_EVENTS_TO_MASKS"}, {SAHPI_SENS_REMOVE_EVENTS_FROM_MASKS, "REMOVE_EVENTS_FROM_MASKS"}, }; /** * oh_encode_sensoreventmaskaction: * @buffer: Pointer to SaHpiTextBufferT that contains enum's string representation. * @type: Location (of SaHpiSensorEventMaskActionT) to place encoded result. * * Converts a @buffer->Data string, generated by oh_lookup_sensoreventmaskaction(), back * into an SaHpiSensorEventMaskActionT type. * * Returns: * SaHpiSensorEventMaskActionT value - normal operation. * SA_ERR_HPI_INVALID_PARAMS - if @buffer or @type is NULL or @buffer->Data empty. * SA_ERR_HPI_INVALID_DATA - if @buffer->Data is invalid. **/ SaErrorT oh_encode_sensoreventmaskaction(SaHpiTextBufferT *buffer, SaHpiSensorEventMaskActionT *type) { int i, found; if (!buffer || !type || buffer->Data == NULL || buffer->Data[0] == '\0') { return(SA_ERR_HPI_INVALID_PARAMS); } found = 0; for (i=0; iData, sensoreventmaskaction_strings[i].str) == 0) { found++; break; } } if (found) { *type = sensoreventmaskaction_strings[i].entity_type; } else { return(SA_ERR_HPI_INVALID_DATA); } return(SA_OK); } /** * oh_lookup_sensorunits: * @value: enum value of type SaHpiSensorUnitsT. * * Converts @value into a string based on @value's HPI enum definition. * * Returns: * string - normal operation. * NULL - if @value not a valid SaHpiSensorUnitsT. **/ char * oh_lookup_sensorunits(SaHpiSensorUnitsT value) { switch (value) { case SAHPI_SU_UNSPECIFIED: return "Unspecified"; case SAHPI_SU_DEGREES_C: return "Degrees C"; case SAHPI_SU_DEGREES_F: return "Degrees F"; case SAHPI_SU_DEGREES_K: return "Degrees K"; case SAHPI_SU_VOLTS: return "Volts"; case SAHPI_SU_AMPS: return "Amps"; case SAHPI_SU_WATTS: return "Watts"; case SAHPI_SU_JOULES: return "Joules"; case SAHPI_SU_COULOMBS: return "Coulombs"; case SAHPI_SU_VA: return "Va"; case SAHPI_SU_NITS: return "Nits"; case SAHPI_SU_LUMEN: return "Lumen"; case SAHPI_SU_LUX: return "Lux"; case SAHPI_SU_CANDELA: return "Candela"; case SAHPI_SU_KPA: return "Kpa"; case SAHPI_SU_PSI: return "Psi"; case SAHPI_SU_NEWTON: return "Newton"; case SAHPI_SU_CFM: return "Cfm"; case SAHPI_SU_RPM: return "Rpm"; case SAHPI_SU_HZ: return "Hz"; case SAHPI_SU_MICROSECOND: return "Microsecond"; case SAHPI_SU_MILLISECOND: return "Millisecond"; case SAHPI_SU_SECOND: return "Second"; case SAHPI_SU_MINUTE: return "Minute"; case SAHPI_SU_HOUR: return "Hour"; case SAHPI_SU_DAY: return "Day"; case SAHPI_SU_WEEK: return "Week"; case SAHPI_SU_MIL: return "Mil"; case SAHPI_SU_INCHES: return "Inches"; case SAHPI_SU_FEET: return "Feet"; case SAHPI_SU_CU_IN: return "Cu In"; case SAHPI_SU_CU_FEET: return "Cu Feet"; case SAHPI_SU_MM: return "Mm"; case SAHPI_SU_CM: return "Cm"; case SAHPI_SU_M: return "M"; case SAHPI_SU_CU_CM: return "Cu Cm"; case SAHPI_SU_CU_M: return "Cu M"; case SAHPI_SU_LITERS: return "Liters"; case SAHPI_SU_FLUID_OUNCE: return "Fluid Ounce"; case SAHPI_SU_RADIANS: return "Radians"; case SAHPI_SU_STERADIANS: return "Steradians"; case SAHPI_SU_REVOLUTIONS: return "Revolutions"; case SAHPI_SU_CYCLES: return "Cycles"; case SAHPI_SU_GRAVITIES: return "Gravities"; case SAHPI_SU_OUNCE: return "Ounce"; case SAHPI_SU_POUND: return "Pound"; case SAHPI_SU_FT_LB: return "Ft Lb"; case SAHPI_SU_OZ_IN: return "Oz In"; case SAHPI_SU_GAUSS: return "Gauss"; case SAHPI_SU_GILBERTS: return "Gilberts"; case SAHPI_SU_HENRY: return "Henry"; case SAHPI_SU_MILLIHENRY: return "Millihenry"; case SAHPI_SU_FARAD: return "Farad"; case SAHPI_SU_MICROFARAD: return "Microfarad"; case SAHPI_SU_OHMS: return "Ohms"; case SAHPI_SU_SIEMENS: return "Siemens"; case SAHPI_SU_MOLE: return "Mole"; case SAHPI_SU_BECQUEREL: return "Becquerel"; case SAHPI_SU_PPM: return "Ppm"; case SAHPI_SU_RESERVED: return "Reserved"; case SAHPI_SU_DECIBELS: return "Decibels"; case SAHPI_SU_DBA: return "Dba"; case SAHPI_SU_DBC: return "Dbc"; case SAHPI_SU_GRAY: return "Gray"; case SAHPI_SU_SIEVERT: return "Sievert"; case SAHPI_SU_COLOR_TEMP_DEG_K: return "Color Temp Deg K"; case SAHPI_SU_BIT: return "Bit"; case SAHPI_SU_KILOBIT: return "Kilobit"; case SAHPI_SU_MEGABIT: return "Megabit"; case SAHPI_SU_GIGABIT: return "Gigabit"; case SAHPI_SU_BYTE: return "Byte"; case SAHPI_SU_KILOBYTE: return "Kilobyte"; case SAHPI_SU_MEGABYTE: return "Megabyte"; case SAHPI_SU_GIGABYTE: return "Gigabyte"; case SAHPI_SU_WORD: return "Word"; case SAHPI_SU_DWORD: return "Dword"; case SAHPI_SU_QWORD: return "Qword"; case SAHPI_SU_LINE: return "Line"; case SAHPI_SU_HIT: return "Hit"; case SAHPI_SU_MISS: return "Miss"; case SAHPI_SU_RETRY: return "Retry"; case SAHPI_SU_RESET: return "Reset"; case SAHPI_SU_OVERRUN: return "Overrun"; case SAHPI_SU_UNDERRUN: return "Underrun"; case SAHPI_SU_COLLISION: return "Collision"; case SAHPI_SU_PACKETS: return "Packets"; case SAHPI_SU_MESSAGES: return "Messages"; case SAHPI_SU_CHARACTERS: return "Characters"; case SAHPI_SU_ERRORS: return "Errors"; case SAHPI_SU_CORRECTABLE_ERRORS: return "Correctable Errors"; case SAHPI_SU_UNCORRECTABLE_ERRORS: return "Uncorrectable Errors"; default: return NULL; } } struct oh_sensorunits_map sensorunits_strings[] = { {SAHPI_SU_UNSPECIFIED, "Unspecified"}, {SAHPI_SU_DEGREES_C, "Degrees C"}, {SAHPI_SU_DEGREES_F, "Degrees F"}, {SAHPI_SU_DEGREES_K, "Degrees K"}, {SAHPI_SU_VOLTS, "Volts"}, {SAHPI_SU_AMPS, "Amps"}, {SAHPI_SU_WATTS, "Watts"}, {SAHPI_SU_JOULES, "Joules"}, {SAHPI_SU_COULOMBS, "Coulombs"}, {SAHPI_SU_VA, "Va"}, {SAHPI_SU_NITS, "Nits"}, {SAHPI_SU_LUMEN, "Lumen"}, {SAHPI_SU_LUX, "Lux"}, {SAHPI_SU_CANDELA, "Candela"}, {SAHPI_SU_KPA, "Kpa"}, {SAHPI_SU_PSI, "Psi"}, {SAHPI_SU_NEWTON, "Newton"}, {SAHPI_SU_CFM, "Cfm"}, {SAHPI_SU_RPM, "Rpm"}, {SAHPI_SU_HZ, "Hz"}, {SAHPI_SU_MICROSECOND, "Microsecond"}, {SAHPI_SU_MILLISECOND, "Millisecond"}, {SAHPI_SU_SECOND, "Second"}, {SAHPI_SU_MINUTE, "Minute"}, {SAHPI_SU_HOUR, "Hour"}, {SAHPI_SU_DAY, "Day"}, {SAHPI_SU_WEEK, "Week"}, {SAHPI_SU_MIL, "Mil"}, {SAHPI_SU_INCHES, "Inches"}, {SAHPI_SU_FEET, "Feet"}, {SAHPI_SU_CU_IN, "Cu In"}, {SAHPI_SU_CU_FEET, "Cu Feet"}, {SAHPI_SU_MM, "Mm"}, {SAHPI_SU_CM, "Cm"}, {SAHPI_SU_M, "M"}, {SAHPI_SU_CU_CM, "Cu Cm"}, {SAHPI_SU_CU_M, "Cu M"}, {SAHPI_SU_LITERS, "Liters"}, {SAHPI_SU_FLUID_OUNCE, "Fluid Ounce"}, {SAHPI_SU_RADIANS, "Radians"}, {SAHPI_SU_STERADIANS, "Steradians"}, {SAHPI_SU_REVOLUTIONS, "Revolutions"}, {SAHPI_SU_CYCLES, "Cycles"}, {SAHPI_SU_GRAVITIES, "Gravities"}, {SAHPI_SU_OUNCE, "Ounce"}, {SAHPI_SU_POUND, "Pound"}, {SAHPI_SU_FT_LB, "Ft Lb"}, {SAHPI_SU_OZ_IN, "Oz In"}, {SAHPI_SU_GAUSS, "Gauss"}, {SAHPI_SU_GILBERTS, "Gilberts"}, {SAHPI_SU_HENRY, "Henry"}, {SAHPI_SU_MILLIHENRY, "Millihenry"}, {SAHPI_SU_FARAD, "Farad"}, {SAHPI_SU_MICROFARAD, "Microfarad"}, {SAHPI_SU_OHMS, "Ohms"}, {SAHPI_SU_SIEMENS, "Siemens"}, {SAHPI_SU_MOLE, "Mole"}, {SAHPI_SU_BECQUEREL, "Becquerel"}, {SAHPI_SU_PPM, "Ppm"}, {SAHPI_SU_RESERVED, "Reserved"}, {SAHPI_SU_DECIBELS, "Decibels"}, {SAHPI_SU_DBA, "Dba"}, {SAHPI_SU_DBC, "Dbc"}, {SAHPI_SU_GRAY, "Gray"}, {SAHPI_SU_SIEVERT, "Sievert"}, {SAHPI_SU_COLOR_TEMP_DEG_K, "Color Temp Deg K"}, {SAHPI_SU_BIT, "Bit"}, {SAHPI_SU_KILOBIT, "Kilobit"}, {SAHPI_SU_MEGABIT, "Megabit"}, {SAHPI_SU_GIGABIT, "Gigabit"}, {SAHPI_SU_BYTE, "Byte"}, {SAHPI_SU_KILOBYTE, "Kilobyte"}, {SAHPI_SU_MEGABYTE, "Megabyte"}, {SAHPI_SU_GIGABYTE, "Gigabyte"}, {SAHPI_SU_WORD, "Word"}, {SAHPI_SU_DWORD, "Dword"}, {SAHPI_SU_QWORD, "Qword"}, {SAHPI_SU_LINE, "Line"}, {SAHPI_SU_HIT, "Hit"}, {SAHPI_SU_MISS, "Miss"}, {SAHPI_SU_RETRY, "Retry"}, {SAHPI_SU_RESET, "Reset"}, {SAHPI_SU_OVERRUN, "Overrun"}, {SAHPI_SU_UNDERRUN, "Underrun"}, {SAHPI_SU_COLLISION, "Collision"}, {SAHPI_SU_PACKETS, "Packets"}, {SAHPI_SU_MESSAGES, "Messages"}, {SAHPI_SU_CHARACTERS, "Characters"}, {SAHPI_SU_ERRORS, "Errors"}, {SAHPI_SU_CORRECTABLE_ERRORS, "Correctable Errors"}, {SAHPI_SU_UNCORRECTABLE_ERRORS, "Uncorrectable Errors"}, }; /** * oh_encode_sensorunits: * @buffer: Pointer to SaHpiTextBufferT that contains enum's string representation. * @type: Location (of SaHpiSensorUnitsT) to place encoded result. * * Converts a @buffer->Data string, generated by oh_lookup_sensorunits(), back * into an SaHpiSensorUnitsT type. * * Returns: * SaHpiSensorUnitsT value - normal operation. * SA_ERR_HPI_INVALID_PARAMS - if @buffer or @type is NULL or @buffer->Data empty. * SA_ERR_HPI_INVALID_DATA - if @buffer->Data is invalid. **/ SaErrorT oh_encode_sensorunits(SaHpiTextBufferT *buffer, SaHpiSensorUnitsT *type) { int i, found; if (!buffer || !type || buffer->Data == NULL || buffer->Data[0] == '\0') { return(SA_ERR_HPI_INVALID_PARAMS); } found = 0; for (i=0; iData, sensorunits_strings[i].str) == 0) { found++; break; } } if (found) { *type = sensorunits_strings[i].entity_type; } else { return(SA_ERR_HPI_INVALID_DATA); } return(SA_OK); } /** * oh_lookup_sensormodunituse: * @value: enum value of type SaHpiSensorModUnitUseT. * * Converts @value into a string based on @value's HPI enum definition. * * Returns: * string - normal operation. * NULL - if @value not a valid SaHpiSensorModUnitUseT. **/ char * oh_lookup_sensormodunituse(SaHpiSensorModUnitUseT value) { switch (value) { case SAHPI_SMUU_NONE: return "NONE"; case SAHPI_SMUU_BASIC_OVER_MODIFIER: return "BASIC_OVER_MODIFIER"; case SAHPI_SMUU_BASIC_TIMES_MODIFIER: return "BASIC_TIMES_MODIFIER"; default: return NULL; } } struct oh_sensormodunituse_map sensormodunituse_strings[] = { {SAHPI_SMUU_NONE, "NONE"}, {SAHPI_SMUU_BASIC_OVER_MODIFIER, "BASIC_OVER_MODIFIER"}, {SAHPI_SMUU_BASIC_TIMES_MODIFIER, "BASIC_TIMES_MODIFIER"}, }; /** * oh_encode_sensormodunituse: * @buffer: Pointer to SaHpiTextBufferT that contains enum's string representation. * @type: Location (of SaHpiSensorModUnitUseT) to place encoded result. * * Converts a @buffer->Data string, generated by oh_lookup_sensormodunituse(), back * into an SaHpiSensorModUnitUseT type. * * Returns: * SaHpiSensorModUnitUseT value - normal operation. * SA_ERR_HPI_INVALID_PARAMS - if @buffer or @type is NULL or @buffer->Data empty. * SA_ERR_HPI_INVALID_DATA - if @buffer->Data is invalid. **/ SaErrorT oh_encode_sensormodunituse(SaHpiTextBufferT *buffer, SaHpiSensorModUnitUseT *type) { int i, found; if (!buffer || !type || buffer->Data == NULL || buffer->Data[0] == '\0') { return(SA_ERR_HPI_INVALID_PARAMS); } found = 0; for (i=0; iData, sensormodunituse_strings[i].str) == 0) { found++; break; } } if (found) { *type = sensormodunituse_strings[i].entity_type; } else { return(SA_ERR_HPI_INVALID_DATA); } return(SA_OK); } /** * oh_lookup_sensoreventctrl: * @value: enum value of type SaHpiSensorEventCtrlT. * * Converts @value into a string based on @value's HPI enum definition. * * Returns: * string - normal operation. * NULL - if @value not a valid SaHpiSensorEventCtrlT. **/ char * oh_lookup_sensoreventctrl(SaHpiSensorEventCtrlT value) { switch (value) { case SAHPI_SEC_PER_EVENT: return "PER_EVENT"; case SAHPI_SEC_READ_ONLY_MASKS: return "READ_ONLY_MASKS"; case SAHPI_SEC_READ_ONLY: return "READ_ONLY"; default: return NULL; } } struct oh_sensoreventctrl_map sensoreventctrl_strings[] = { {SAHPI_SEC_PER_EVENT, "PER_EVENT"}, {SAHPI_SEC_READ_ONLY_MASKS, "READ_ONLY_MASKS"}, {SAHPI_SEC_READ_ONLY, "READ_ONLY"}, }; /** * oh_encode_sensoreventctrl: * @buffer: Pointer to SaHpiTextBufferT that contains enum's string representation. * @type: Location (of SaHpiSensorEventCtrlT) to place encoded result. * * Converts a @buffer->Data string, generated by oh_lookup_sensoreventctrl(), back * into an SaHpiSensorEventCtrlT type. * * Returns: * SaHpiSensorEventCtrlT value - normal operation. * SA_ERR_HPI_INVALID_PARAMS - if @buffer or @type is NULL or @buffer->Data empty. * SA_ERR_HPI_INVALID_DATA - if @buffer->Data is invalid. **/ SaErrorT oh_encode_sensoreventctrl(SaHpiTextBufferT *buffer, SaHpiSensorEventCtrlT *type) { int i, found; if (!buffer || !type || buffer->Data == NULL || buffer->Data[0] == '\0') { return(SA_ERR_HPI_INVALID_PARAMS); } found = 0; for (i=0; iData, sensoreventctrl_strings[i].str) == 0) { found++; break; } } if (found) { *type = sensoreventctrl_strings[i].entity_type; } else { return(SA_ERR_HPI_INVALID_DATA); } return(SA_OK); } /** * oh_lookup_ctrltype: * @value: enum value of type SaHpiCtrlTypeT. * * Converts @value into a string based on @value's HPI enum definition. * * Returns: * string - normal operation. * NULL - if @value not a valid SaHpiCtrlTypeT. **/ char * oh_lookup_ctrltype(SaHpiCtrlTypeT value) { switch (value) { case SAHPI_CTRL_TYPE_DIGITAL: return "DIGITAL"; case SAHPI_CTRL_TYPE_DISCRETE: return "DISCRETE"; case SAHPI_CTRL_TYPE_ANALOG: return "ANALOG"; case SAHPI_CTRL_TYPE_STREAM: return "STREAM"; case SAHPI_CTRL_TYPE_TEXT: return "TEXT"; case SAHPI_CTRL_TYPE_OEM: return "OEM"; default: return NULL; } } struct oh_ctrltype_map ctrltype_strings[] = { {SAHPI_CTRL_TYPE_DIGITAL, "DIGITAL"}, {SAHPI_CTRL_TYPE_DISCRETE, "DISCRETE"}, {SAHPI_CTRL_TYPE_ANALOG, "ANALOG"}, {SAHPI_CTRL_TYPE_STREAM, "STREAM"}, {SAHPI_CTRL_TYPE_TEXT, "TEXT"}, {SAHPI_CTRL_TYPE_OEM, "OEM"}, }; /** * oh_encode_ctrltype: * @buffer: Pointer to SaHpiTextBufferT that contains enum's string representation. * @type: Location (of SaHpiCtrlTypeT) to place encoded result. * * Converts a @buffer->Data string, generated by oh_lookup_ctrltype(), back * into an SaHpiCtrlTypeT type. * * Returns: * SaHpiCtrlTypeT value - normal operation. * SA_ERR_HPI_INVALID_PARAMS - if @buffer or @type is NULL or @buffer->Data empty. * SA_ERR_HPI_INVALID_DATA - if @buffer->Data is invalid. **/ SaErrorT oh_encode_ctrltype(SaHpiTextBufferT *buffer, SaHpiCtrlTypeT *type) { int i, found; if (!buffer || !type || buffer->Data == NULL || buffer->Data[0] == '\0') { return(SA_ERR_HPI_INVALID_PARAMS); } found = 0; for (i=0; iData, ctrltype_strings[i].str) == 0) { found++; break; } } if (found) { *type = ctrltype_strings[i].entity_type; } else { return(SA_ERR_HPI_INVALID_DATA); } return(SA_OK); } /** * oh_lookup_ctrlstatedigital: * @value: enum value of type SaHpiCtrlStateDigitalT. * * Converts @value into a string based on @value's HPI enum definition. * * Returns: * string - normal operation. * NULL - if @value not a valid SaHpiCtrlStateDigitalT. **/ char * oh_lookup_ctrlstatedigital(SaHpiCtrlStateDigitalT value) { switch (value) { case SAHPI_CTRL_STATE_OFF: return "OFF"; case SAHPI_CTRL_STATE_ON: return "ON"; case SAHPI_CTRL_STATE_PULSE_OFF: return "PULSE_OFF"; case SAHPI_CTRL_STATE_PULSE_ON: return "PULSE_ON"; default: return NULL; } } struct oh_ctrlstatedigital_map ctrlstatedigital_strings[] = { {SAHPI_CTRL_STATE_OFF, "OFF"}, {SAHPI_CTRL_STATE_ON, "ON"}, {SAHPI_CTRL_STATE_PULSE_OFF, "PULSE_OFF"}, {SAHPI_CTRL_STATE_PULSE_ON, "PULSE_ON"}, }; /** * oh_encode_ctrlstatedigital: * @buffer: Pointer to SaHpiTextBufferT that contains enum's string representation. * @type: Location (of SaHpiCtrlStateDigitalT) to place encoded result. * * Converts a @buffer->Data string, generated by oh_lookup_ctrlstatedigital(), back * into an SaHpiCtrlStateDigitalT type. * * Returns: * SaHpiCtrlStateDigitalT value - normal operation. * SA_ERR_HPI_INVALID_PARAMS - if @buffer or @type is NULL or @buffer->Data empty. * SA_ERR_HPI_INVALID_DATA - if @buffer->Data is invalid. **/ SaErrorT oh_encode_ctrlstatedigital(SaHpiTextBufferT *buffer, SaHpiCtrlStateDigitalT *type) { int i, found; if (!buffer || !type || buffer->Data == NULL || buffer->Data[0] == '\0') { return(SA_ERR_HPI_INVALID_PARAMS); } found = 0; for (i=0; iData, ctrlstatedigital_strings[i].str) == 0) { found++; break; } } if (found) { *type = ctrlstatedigital_strings[i].entity_type; } else { return(SA_ERR_HPI_INVALID_DATA); } return(SA_OK); } /** * oh_lookup_ctrlmode: * @value: enum value of type SaHpiCtrlModeT. * * Converts @value into a string based on @value's HPI enum definition. * * Returns: * string - normal operation. * NULL - if @value not a valid SaHpiCtrlModeT. **/ char * oh_lookup_ctrlmode(SaHpiCtrlModeT value) { switch (value) { case SAHPI_CTRL_MODE_AUTO: return "AUTO"; case SAHPI_CTRL_MODE_MANUAL: return "MANUAL"; default: return NULL; } } struct oh_ctrlmode_map ctrlmode_strings[] = { {SAHPI_CTRL_MODE_AUTO, "AUTO"}, {SAHPI_CTRL_MODE_MANUAL, "MANUAL"}, }; /** * oh_encode_ctrlmode: * @buffer: Pointer to SaHpiTextBufferT that contains enum's string representation. * @type: Location (of SaHpiCtrlModeT) to place encoded result. * * Converts a @buffer->Data string, generated by oh_lookup_ctrlmode(), back * into an SaHpiCtrlModeT type. * * Returns: * SaHpiCtrlModeT value - normal operation. * SA_ERR_HPI_INVALID_PARAMS - if @buffer or @type is NULL or @buffer->Data empty. * SA_ERR_HPI_INVALID_DATA - if @buffer->Data is invalid. **/ SaErrorT oh_encode_ctrlmode(SaHpiTextBufferT *buffer, SaHpiCtrlModeT *type) { int i, found; if (!buffer || !type || buffer->Data == NULL || buffer->Data[0] == '\0') { return(SA_ERR_HPI_INVALID_PARAMS); } found = 0; for (i=0; iData, ctrlmode_strings[i].str) == 0) { found++; break; } } if (found) { *type = ctrlmode_strings[i].entity_type; } else { return(SA_ERR_HPI_INVALID_DATA); } return(SA_OK); } /** * oh_lookup_ctrloutputtype: * @value: enum value of type SaHpiCtrlOutputTypeT. * * Converts @value into a string based on @value's HPI enum definition. * * Returns: * string - normal operation. * NULL - if @value not a valid SaHpiCtrlOutputTypeT. **/ char * oh_lookup_ctrloutputtype(SaHpiCtrlOutputTypeT value) { switch (value) { case SAHPI_CTRL_GENERIC: return "GENERIC"; case SAHPI_CTRL_LED: return "LED"; case SAHPI_CTRL_FAN_SPEED: return "FAN_SPEED"; case SAHPI_CTRL_DRY_CONTACT_CLOSURE: return "DRY_CONTACT_CLOSURE"; case SAHPI_CTRL_POWER_SUPPLY_INHIBIT: return "POWER_SUPPLY_INHIBIT"; case SAHPI_CTRL_AUDIBLE: return "AUDIBLE"; case SAHPI_CTRL_FRONT_PANEL_LOCKOUT: return "FRONT_PANEL_LOCKOUT"; case SAHPI_CTRL_POWER_INTERLOCK: return "POWER_INTERLOCK"; case SAHPI_CTRL_POWER_STATE: return "POWER_STATE"; case SAHPI_CTRL_LCD_DISPLAY: return "LCD_DISPLAY"; case SAHPI_CTRL_OEM: return "OEM"; default: return NULL; } } struct oh_ctrloutputtype_map ctrloutputtype_strings[] = { {SAHPI_CTRL_GENERIC, "GENERIC"}, {SAHPI_CTRL_LED, "LED"}, {SAHPI_CTRL_FAN_SPEED, "FAN_SPEED"}, {SAHPI_CTRL_DRY_CONTACT_CLOSURE, "DRY_CONTACT_CLOSURE"}, {SAHPI_CTRL_POWER_SUPPLY_INHIBIT, "POWER_SUPPLY_INHIBIT"}, {SAHPI_CTRL_AUDIBLE, "AUDIBLE"}, {SAHPI_CTRL_FRONT_PANEL_LOCKOUT, "FRONT_PANEL_LOCKOUT"}, {SAHPI_CTRL_POWER_INTERLOCK, "POWER_INTERLOCK"}, {SAHPI_CTRL_POWER_STATE, "POWER_STATE"}, {SAHPI_CTRL_LCD_DISPLAY, "LCD_DISPLAY"}, {SAHPI_CTRL_OEM, "OEM"}, }; /** * oh_encode_ctrloutputtype: * @buffer: Pointer to SaHpiTextBufferT that contains enum's string representation. * @type: Location (of SaHpiCtrlOutputTypeT) to place encoded result. * * Converts a @buffer->Data string, generated by oh_lookup_ctrloutputtype(), back * into an SaHpiCtrlOutputTypeT type. * * Returns: * SaHpiCtrlOutputTypeT value - normal operation. * SA_ERR_HPI_INVALID_PARAMS - if @buffer or @type is NULL or @buffer->Data empty. * SA_ERR_HPI_INVALID_DATA - if @buffer->Data is invalid. **/ SaErrorT oh_encode_ctrloutputtype(SaHpiTextBufferT *buffer, SaHpiCtrlOutputTypeT *type) { int i, found; if (!buffer || !type || buffer->Data == NULL || buffer->Data[0] == '\0') { return(SA_ERR_HPI_INVALID_PARAMS); } found = 0; for (i=0; iData, ctrloutputtype_strings[i].str) == 0) { found++; break; } } if (found) { *type = ctrloutputtype_strings[i].entity_type; } else { return(SA_ERR_HPI_INVALID_DATA); } return(SA_OK); } /** * oh_lookup_idrareatype: * @value: enum value of type SaHpiIdrAreaTypeT. * * Converts @value into a string based on @value's HPI enum definition. * * Returns: * string - normal operation. * NULL - if @value not a valid SaHpiIdrAreaTypeT. **/ char * oh_lookup_idrareatype(SaHpiIdrAreaTypeT value) { switch (value) { case SAHPI_IDR_AREATYPE_INTERNAL_USE: return "INTERNAL_USE"; case SAHPI_IDR_AREATYPE_CHASSIS_INFO: return "CHASSIS_INFO"; case SAHPI_IDR_AREATYPE_BOARD_INFO: return "BOARD_INFO"; case SAHPI_IDR_AREATYPE_PRODUCT_INFO: return "PRODUCT_INFO"; case SAHPI_IDR_AREATYPE_OEM: return "OEM"; case SAHPI_IDR_AREATYPE_UNSPECIFIED: return "UNSPECIFIED"; default: return NULL; } } struct oh_idrareatype_map idrareatype_strings[] = { {SAHPI_IDR_AREATYPE_INTERNAL_USE, "INTERNAL_USE"}, {SAHPI_IDR_AREATYPE_CHASSIS_INFO, "CHASSIS_INFO"}, {SAHPI_IDR_AREATYPE_BOARD_INFO, "BOARD_INFO"}, {SAHPI_IDR_AREATYPE_PRODUCT_INFO, "PRODUCT_INFO"}, {SAHPI_IDR_AREATYPE_OEM, "OEM"}, {SAHPI_IDR_AREATYPE_UNSPECIFIED, "UNSPECIFIED"}, }; /** * oh_encode_idrareatype: * @buffer: Pointer to SaHpiTextBufferT that contains enum's string representation. * @type: Location (of SaHpiIdrAreaTypeT) to place encoded result. * * Converts a @buffer->Data string, generated by oh_lookup_idrareatype(), back * into an SaHpiIdrAreaTypeT type. * * Returns: * SaHpiIdrAreaTypeT value - normal operation. * SA_ERR_HPI_INVALID_PARAMS - if @buffer or @type is NULL or @buffer->Data empty. * SA_ERR_HPI_INVALID_DATA - if @buffer->Data is invalid. **/ SaErrorT oh_encode_idrareatype(SaHpiTextBufferT *buffer, SaHpiIdrAreaTypeT *type) { int i, found; if (!buffer || !type || buffer->Data == NULL || buffer->Data[0] == '\0') { return(SA_ERR_HPI_INVALID_PARAMS); } found = 0; for (i=0; iData, idrareatype_strings[i].str) == 0) { found++; break; } } if (found) { *type = idrareatype_strings[i].entity_type; } else { return(SA_ERR_HPI_INVALID_DATA); } return(SA_OK); } /** * oh_lookup_idrfieldtype: * @value: enum value of type SaHpiIdrFieldTypeT. * * Converts @value into a string based on @value's HPI enum definition. * * Returns: * string - normal operation. * NULL - if @value not a valid SaHpiIdrFieldTypeT. **/ char * oh_lookup_idrfieldtype(SaHpiIdrFieldTypeT value) { switch (value) { case SAHPI_IDR_FIELDTYPE_CHASSIS_TYPE: return "CHASSIS_TYPE"; case SAHPI_IDR_FIELDTYPE_MFG_DATETIME: return "MFG_DATETIME"; case SAHPI_IDR_FIELDTYPE_MANUFACTURER: return "MANUFACTURER"; case SAHPI_IDR_FIELDTYPE_PRODUCT_NAME: return "PRODUCT_NAME"; case SAHPI_IDR_FIELDTYPE_PRODUCT_VERSION: return "PRODUCT_VERSION"; case SAHPI_IDR_FIELDTYPE_SERIAL_NUMBER: return "SERIAL_NUMBER"; case SAHPI_IDR_FIELDTYPE_PART_NUMBER: return "PART_NUMBER"; case SAHPI_IDR_FIELDTYPE_FILE_ID: return "FILE_ID"; case SAHPI_IDR_FIELDTYPE_ASSET_TAG: return "ASSET_TAG"; case SAHPI_IDR_FIELDTYPE_CUSTOM: return "CUSTOM"; case SAHPI_IDR_FIELDTYPE_UNSPECIFIED: return "UNSPECIFIED"; default: return NULL; } } struct oh_idrfieldtype_map idrfieldtype_strings[] = { {SAHPI_IDR_FIELDTYPE_CHASSIS_TYPE, "CHASSIS_TYPE"}, {SAHPI_IDR_FIELDTYPE_MFG_DATETIME, "MFG_DATETIME"}, {SAHPI_IDR_FIELDTYPE_MANUFACTURER, "MANUFACTURER"}, {SAHPI_IDR_FIELDTYPE_PRODUCT_NAME, "PRODUCT_NAME"}, {SAHPI_IDR_FIELDTYPE_PRODUCT_VERSION, "PRODUCT_VERSION"}, {SAHPI_IDR_FIELDTYPE_SERIAL_NUMBER, "SERIAL_NUMBER"}, {SAHPI_IDR_FIELDTYPE_PART_NUMBER, "PART_NUMBER"}, {SAHPI_IDR_FIELDTYPE_FILE_ID, "FILE_ID"}, {SAHPI_IDR_FIELDTYPE_ASSET_TAG, "ASSET_TAG"}, {SAHPI_IDR_FIELDTYPE_CUSTOM, "CUSTOM"}, {SAHPI_IDR_FIELDTYPE_UNSPECIFIED, "UNSPECIFIED"}, }; /** * oh_encode_idrfieldtype: * @buffer: Pointer to SaHpiTextBufferT that contains enum's string representation. * @type: Location (of SaHpiIdrFieldTypeT) to place encoded result. * * Converts a @buffer->Data string, generated by oh_lookup_idrfieldtype(), back * into an SaHpiIdrFieldTypeT type. * * Returns: * SaHpiIdrFieldTypeT value - normal operation. * SA_ERR_HPI_INVALID_PARAMS - if @buffer or @type is NULL or @buffer->Data empty. * SA_ERR_HPI_INVALID_DATA - if @buffer->Data is invalid. **/ SaErrorT oh_encode_idrfieldtype(SaHpiTextBufferT *buffer, SaHpiIdrFieldTypeT *type) { int i, found; if (!buffer || !type || buffer->Data == NULL || buffer->Data[0] == '\0') { return(SA_ERR_HPI_INVALID_PARAMS); } found = 0; for (i=0; iData, idrfieldtype_strings[i].str) == 0) { found++; break; } } if (found) { *type = idrfieldtype_strings[i].entity_type; } else { return(SA_ERR_HPI_INVALID_DATA); } return(SA_OK); } /** * oh_lookup_watchdogaction: * @value: enum value of type SaHpiWatchdogActionT. * * Converts @value into a string based on @value's HPI enum definition. * * Returns: * string - normal operation. * NULL - if @value not a valid SaHpiWatchdogActionT. **/ char * oh_lookup_watchdogaction(SaHpiWatchdogActionT value) { switch (value) { case SAHPI_WA_NO_ACTION: return "NO_ACTION"; case SAHPI_WA_RESET: return "RESET"; case SAHPI_WA_POWER_DOWN: return "POWER_DOWN"; case SAHPI_WA_POWER_CYCLE: return "POWER_CYCLE"; default: return NULL; } } struct oh_watchdogaction_map watchdogaction_strings[] = { {SAHPI_WA_NO_ACTION, "NO_ACTION"}, {SAHPI_WA_RESET, "RESET"}, {SAHPI_WA_POWER_DOWN, "POWER_DOWN"}, {SAHPI_WA_POWER_CYCLE, "POWER_CYCLE"}, }; /** * oh_encode_watchdogaction: * @buffer: Pointer to SaHpiTextBufferT that contains enum's string representation. * @type: Location (of SaHpiWatchdogActionT) to place encoded result. * * Converts a @buffer->Data string, generated by oh_lookup_watchdogaction(), back * into an SaHpiWatchdogActionT type. * * Returns: * SaHpiWatchdogActionT value - normal operation. * SA_ERR_HPI_INVALID_PARAMS - if @buffer or @type is NULL or @buffer->Data empty. * SA_ERR_HPI_INVALID_DATA - if @buffer->Data is invalid. **/ SaErrorT oh_encode_watchdogaction(SaHpiTextBufferT *buffer, SaHpiWatchdogActionT *type) { int i, found; if (!buffer || !type || buffer->Data == NULL || buffer->Data[0] == '\0') { return(SA_ERR_HPI_INVALID_PARAMS); } found = 0; for (i=0; iData, watchdogaction_strings[i].str) == 0) { found++; break; } } if (found) { *type = watchdogaction_strings[i].entity_type; } else { return(SA_ERR_HPI_INVALID_DATA); } return(SA_OK); } /** * oh_lookup_watchdogactionevent: * @value: enum value of type SaHpiWatchdogActionEventT. * * Converts @value into a string based on @value's HPI enum definition. * * Returns: * string - normal operation. * NULL - if @value not a valid SaHpiWatchdogActionEventT. **/ char * oh_lookup_watchdogactionevent(SaHpiWatchdogActionEventT value) { switch (value) { case SAHPI_WAE_NO_ACTION: return "NO_ACTION"; case SAHPI_WAE_RESET: return "RESET"; case SAHPI_WAE_POWER_DOWN: return "POWER_DOWN"; case SAHPI_WAE_POWER_CYCLE: return "POWER_CYCLE"; case SAHPI_WAE_TIMER_INT: return "TIMER_INT"; default: return NULL; } } struct oh_watchdogactionevent_map watchdogactionevent_strings[] = { {SAHPI_WAE_NO_ACTION, "NO_ACTION"}, {SAHPI_WAE_RESET, "RESET"}, {SAHPI_WAE_POWER_DOWN, "POWER_DOWN"}, {SAHPI_WAE_POWER_CYCLE, "POWER_CYCLE"}, {SAHPI_WAE_TIMER_INT, "TIMER_INT"}, }; /** * oh_encode_watchdogactionevent: * @buffer: Pointer to SaHpiTextBufferT that contains enum's string representation. * @type: Location (of SaHpiWatchdogActionEventT) to place encoded result. * * Converts a @buffer->Data string, generated by oh_lookup_watchdogactionevent(), back * into an SaHpiWatchdogActionEventT type. * * Returns: * SaHpiWatchdogActionEventT value - normal operation. * SA_ERR_HPI_INVALID_PARAMS - if @buffer or @type is NULL or @buffer->Data empty. * SA_ERR_HPI_INVALID_DATA - if @buffer->Data is invalid. **/ SaErrorT oh_encode_watchdogactionevent(SaHpiTextBufferT *buffer, SaHpiWatchdogActionEventT *type) { int i, found; if (!buffer || !type || buffer->Data == NULL || buffer->Data[0] == '\0') { return(SA_ERR_HPI_INVALID_PARAMS); } found = 0; for (i=0; iData, watchdogactionevent_strings[i].str) == 0) { found++; break; } } if (found) { *type = watchdogactionevent_strings[i].entity_type; } else { return(SA_ERR_HPI_INVALID_DATA); } return(SA_OK); } /** * oh_lookup_watchdogpretimerinterrupt: * @value: enum value of type SaHpiWatchdogPretimerInterruptT. * * Converts @value into a string based on @value's HPI enum definition. * * Returns: * string - normal operation. * NULL - if @value not a valid SaHpiWatchdogPretimerInterruptT. **/ char * oh_lookup_watchdogpretimerinterrupt(SaHpiWatchdogPretimerInterruptT value) { switch (value) { case SAHPI_WPI_NONE: return "NONE"; case SAHPI_WPI_SMI: return "SMI"; case SAHPI_WPI_NMI: return "NMI"; case SAHPI_WPI_MESSAGE_INTERRUPT: return "MESSAGE_INTERRUPT"; case SAHPI_WPI_OEM: return "OEM"; default: return NULL; } } struct oh_watchdogpretimerinterrupt_map watchdogpretimerinterrupt_strings[] = { {SAHPI_WPI_NONE, "NONE"}, {SAHPI_WPI_SMI, "SMI"}, {SAHPI_WPI_NMI, "NMI"}, {SAHPI_WPI_MESSAGE_INTERRUPT, "MESSAGE_INTERRUPT"}, {SAHPI_WPI_OEM, "OEM"}, }; /** * oh_encode_watchdogpretimerinterrupt: * @buffer: Pointer to SaHpiTextBufferT that contains enum's string representation. * @type: Location (of SaHpiWatchdogPretimerInterruptT) to place encoded result. * * Converts a @buffer->Data string, generated by oh_lookup_watchdogpretimerinterrupt(), back * into an SaHpiWatchdogPretimerInterruptT type. * * Returns: * SaHpiWatchdogPretimerInterruptT value - normal operation. * SA_ERR_HPI_INVALID_PARAMS - if @buffer or @type is NULL or @buffer->Data empty. * SA_ERR_HPI_INVALID_DATA - if @buffer->Data is invalid. **/ SaErrorT oh_encode_watchdogpretimerinterrupt(SaHpiTextBufferT *buffer, SaHpiWatchdogPretimerInterruptT *type) { int i, found; if (!buffer || !type || buffer->Data == NULL || buffer->Data[0] == '\0') { return(SA_ERR_HPI_INVALID_PARAMS); } found = 0; for (i=0; iData, watchdogpretimerinterrupt_strings[i].str) == 0) { found++; break; } } if (found) { *type = watchdogpretimerinterrupt_strings[i].entity_type; } else { return(SA_ERR_HPI_INVALID_DATA); } return(SA_OK); } /** * oh_lookup_watchdogtimeruse: * @value: enum value of type SaHpiWatchdogTimerUseT. * * Converts @value into a string based on @value's HPI enum definition. * * Returns: * string - normal operation. * NULL - if @value not a valid SaHpiWatchdogTimerUseT. **/ char * oh_lookup_watchdogtimeruse(SaHpiWatchdogTimerUseT value) { switch (value) { case SAHPI_WTU_NONE: return "NONE"; case SAHPI_WTU_BIOS_FRB2: return "BIOS_FRB2"; case SAHPI_WTU_BIOS_POST: return "BIOS_POST"; case SAHPI_WTU_OS_LOAD: return "OS_LOAD"; case SAHPI_WTU_SMS_OS: return "SMS_OS"; case SAHPI_WTU_OEM: return "OEM"; case SAHPI_WTU_UNSPECIFIED: return "UNSPECIFIED"; default: return NULL; } } struct oh_watchdogtimeruse_map watchdogtimeruse_strings[] = { {SAHPI_WTU_NONE, "NONE"}, {SAHPI_WTU_BIOS_FRB2, "BIOS_FRB2"}, {SAHPI_WTU_BIOS_POST, "BIOS_POST"}, {SAHPI_WTU_OS_LOAD, "OS_LOAD"}, {SAHPI_WTU_SMS_OS, "SMS_OS"}, {SAHPI_WTU_OEM, "OEM"}, {SAHPI_WTU_UNSPECIFIED, "UNSPECIFIED"}, }; /** * oh_encode_watchdogtimeruse: * @buffer: Pointer to SaHpiTextBufferT that contains enum's string representation. * @type: Location (of SaHpiWatchdogTimerUseT) to place encoded result. * * Converts a @buffer->Data string, generated by oh_lookup_watchdogtimeruse(), back * into an SaHpiWatchdogTimerUseT type. * * Returns: * SaHpiWatchdogTimerUseT value - normal operation. * SA_ERR_HPI_INVALID_PARAMS - if @buffer or @type is NULL or @buffer->Data empty. * SA_ERR_HPI_INVALID_DATA - if @buffer->Data is invalid. **/ SaErrorT oh_encode_watchdogtimeruse(SaHpiTextBufferT *buffer, SaHpiWatchdogTimerUseT *type) { int i, found; if (!buffer || !type || buffer->Data == NULL || buffer->Data[0] == '\0') { return(SA_ERR_HPI_INVALID_PARAMS); } found = 0; for (i=0; iData, watchdogtimeruse_strings[i].str) == 0) { found++; break; } } if (found) { *type = watchdogtimeruse_strings[i].entity_type; } else { return(SA_ERR_HPI_INVALID_DATA); } return(SA_OK); } /** * oh_lookup_hsindicatorstate: * @value: enum value of type SaHpiHsIndicatorStateT. * * Converts @value into a string based on @value's HPI enum definition. * * Returns: * string - normal operation. * NULL - if @value not a valid SaHpiHsIndicatorStateT. **/ char * oh_lookup_hsindicatorstate(SaHpiHsIndicatorStateT value) { switch (value) { case SAHPI_HS_INDICATOR_OFF: return "OFF"; case SAHPI_HS_INDICATOR_ON: return "ON"; default: return NULL; } } struct oh_hsindicatorstate_map hsindicatorstate_strings[] = { {SAHPI_HS_INDICATOR_OFF, "OFF"}, {SAHPI_HS_INDICATOR_ON, "ON"}, }; /** * oh_encode_hsindicatorstate: * @buffer: Pointer to SaHpiTextBufferT that contains enum's string representation. * @type: Location (of SaHpiHsIndicatorStateT) to place encoded result. * * Converts a @buffer->Data string, generated by oh_lookup_hsindicatorstate(), back * into an SaHpiHsIndicatorStateT type. * * Returns: * SaHpiHsIndicatorStateT value - normal operation. * SA_ERR_HPI_INVALID_PARAMS - if @buffer or @type is NULL or @buffer->Data empty. * SA_ERR_HPI_INVALID_DATA - if @buffer->Data is invalid. **/ SaErrorT oh_encode_hsindicatorstate(SaHpiTextBufferT *buffer, SaHpiHsIndicatorStateT *type) { int i, found; if (!buffer || !type || buffer->Data == NULL || buffer->Data[0] == '\0') { return(SA_ERR_HPI_INVALID_PARAMS); } found = 0; for (i=0; iData, hsindicatorstate_strings[i].str) == 0) { found++; break; } } if (found) { *type = hsindicatorstate_strings[i].entity_type; } else { return(SA_ERR_HPI_INVALID_DATA); } return(SA_OK); } /** * oh_lookup_hsaction: * @value: enum value of type SaHpiHsActionT. * * Converts @value into a string based on @value's HPI enum definition. * * Returns: * string - normal operation. * NULL - if @value not a valid SaHpiHsActionT. **/ char * oh_lookup_hsaction(SaHpiHsActionT value) { switch (value) { case SAHPI_HS_ACTION_INSERTION: return "INSERTION"; case SAHPI_HS_ACTION_EXTRACTION: return "EXTRACTION"; default: return NULL; } } struct oh_hsaction_map hsaction_strings[] = { {SAHPI_HS_ACTION_INSERTION, "INSERTION"}, {SAHPI_HS_ACTION_EXTRACTION, "EXTRACTION"}, }; /** * oh_encode_hsaction: * @buffer: Pointer to SaHpiTextBufferT that contains enum's string representation. * @type: Location (of SaHpiHsActionT) to place encoded result. * * Converts a @buffer->Data string, generated by oh_lookup_hsaction(), back * into an SaHpiHsActionT type. * * Returns: * SaHpiHsActionT value - normal operation. * SA_ERR_HPI_INVALID_PARAMS - if @buffer or @type is NULL or @buffer->Data empty. * SA_ERR_HPI_INVALID_DATA - if @buffer->Data is invalid. **/ SaErrorT oh_encode_hsaction(SaHpiTextBufferT *buffer, SaHpiHsActionT *type) { int i, found; if (!buffer || !type || buffer->Data == NULL || buffer->Data[0] == '\0') { return(SA_ERR_HPI_INVALID_PARAMS); } found = 0; for (i=0; iData, hsaction_strings[i].str) == 0) { found++; break; } } if (found) { *type = hsaction_strings[i].entity_type; } else { return(SA_ERR_HPI_INVALID_DATA); } return(SA_OK); } /** * oh_lookup_hsstate: * @value: enum value of type SaHpiHsStateT. * * Converts @value into a string based on @value's HPI enum definition. * * Returns: * string - normal operation. * NULL - if @value not a valid SaHpiHsStateT. **/ char * oh_lookup_hsstate(SaHpiHsStateT value) { switch (value) { case SAHPI_HS_STATE_INACTIVE: return "INACTIVE"; case SAHPI_HS_STATE_INSERTION_PENDING: return "INSERTION_PENDING"; case SAHPI_HS_STATE_ACTIVE: return "ACTIVE"; case SAHPI_HS_STATE_EXTRACTION_PENDING: return "EXTRACTION_PENDING"; case SAHPI_HS_STATE_NOT_PRESENT: return "NOT_PRESENT"; default: return NULL; } } struct oh_hsstate_map hsstate_strings[] = { {SAHPI_HS_STATE_INACTIVE, "INACTIVE"}, {SAHPI_HS_STATE_INSERTION_PENDING, "INSERTION_PENDING"}, {SAHPI_HS_STATE_ACTIVE, "ACTIVE"}, {SAHPI_HS_STATE_EXTRACTION_PENDING, "EXTRACTION_PENDING"}, {SAHPI_HS_STATE_NOT_PRESENT, "NOT_PRESENT"}, }; /** * oh_encode_hsstate: * @buffer: Pointer to SaHpiTextBufferT that contains enum's string representation. * @type: Location (of SaHpiHsStateT) to place encoded result. * * Converts a @buffer->Data string, generated by oh_lookup_hsstate(), back * into an SaHpiHsStateT type. * * Returns: * SaHpiHsStateT value - normal operation. * SA_ERR_HPI_INVALID_PARAMS - if @buffer or @type is NULL or @buffer->Data empty. * SA_ERR_HPI_INVALID_DATA - if @buffer->Data is invalid. **/ SaErrorT oh_encode_hsstate(SaHpiTextBufferT *buffer, SaHpiHsStateT *type) { int i, found; if (!buffer || !type || buffer->Data == NULL || buffer->Data[0] == '\0') { return(SA_ERR_HPI_INVALID_PARAMS); } found = 0; for (i=0; iData, hsstate_strings[i].str) == 0) { found++; break; } } if (found) { *type = hsstate_strings[i].entity_type; } else { return(SA_ERR_HPI_INVALID_DATA); } return(SA_OK); } /** * oh_lookup_severity: * @value: enum value of type SaHpiSeverityT. * * Converts @value into a string based on @value's HPI enum definition. * * Returns: * string - normal operation. * NULL - if @value not a valid SaHpiSeverityT. **/ char * oh_lookup_severity(SaHpiSeverityT value) { switch (value) { case SAHPI_CRITICAL: return "CRITICAL"; case SAHPI_MAJOR: return "MAJOR"; case SAHPI_MINOR: return "MINOR"; case SAHPI_INFORMATIONAL: return "INFORMATIONAL"; case SAHPI_OK: return "OK"; case SAHPI_DEBUG: return "DEBUG"; case SAHPI_ALL_SEVERITIES: return "ALL_SEVERITIES"; default: return NULL; } } struct oh_severity_map severity_strings[] = { {SAHPI_CRITICAL, "CRITICAL"}, {SAHPI_MAJOR, "MAJOR"}, {SAHPI_MINOR, "MINOR"}, {SAHPI_INFORMATIONAL, "INFORMATIONAL"}, {SAHPI_OK, "OK"}, {SAHPI_DEBUG, "DEBUG"}, {SAHPI_ALL_SEVERITIES, "ALL_SEVERITIES"}, }; /** * oh_encode_severity: * @buffer: Pointer to SaHpiTextBufferT that contains enum's string representation. * @type: Location (of SaHpiSeverityT) to place encoded result. * * Converts a @buffer->Data string, generated by oh_lookup_severity(), back * into an SaHpiSeverityT type. * * Returns: * SaHpiSeverityT value - normal operation. * SA_ERR_HPI_INVALID_PARAMS - if @buffer or @type is NULL or @buffer->Data empty. * SA_ERR_HPI_INVALID_DATA - if @buffer->Data is invalid. **/ SaErrorT oh_encode_severity(SaHpiTextBufferT *buffer, SaHpiSeverityT *type) { int i, found; if (!buffer || !type || buffer->Data == NULL || buffer->Data[0] == '\0') { return(SA_ERR_HPI_INVALID_PARAMS); } found = 0; for (i=0; iData, severity_strings[i].str) == 0) { found++; break; } } if (found) { *type = severity_strings[i].entity_type; } else { return(SA_ERR_HPI_INVALID_DATA); } return(SA_OK); } /** * oh_lookup_resourceeventtype: * @value: enum value of type SaHpiResourceEventTypeT. * * Converts @value into a string based on @value's HPI enum definition. * * Returns: * string - normal operation. * NULL - if @value not a valid SaHpiResourceEventTypeT. **/ char * oh_lookup_resourceeventtype(SaHpiResourceEventTypeT value) { switch (value) { case SAHPI_RESE_RESOURCE_FAILURE: return "FAILURE"; case SAHPI_RESE_RESOURCE_RESTORED: return "RESTORED"; case SAHPI_RESE_RESOURCE_ADDED: return "ADDED"; case SAHPI_RESE_RESOURCE_REMOVED: return "REMOVED"; case SAHPI_RESE_RESOURCE_INACCESSIBLE: return "INACCESSIBLE"; case SAHPI_RESE_RESOURCE_UPDATED: return "UPDATED"; default: return NULL; } } struct oh_resourceeventtype_map resourceeventtype_strings[] = { {SAHPI_RESE_RESOURCE_FAILURE, "FAILURE"}, {SAHPI_RESE_RESOURCE_RESTORED, "RESTORED"}, {SAHPI_RESE_RESOURCE_ADDED, "ADDED"}, {SAHPI_RESE_RESOURCE_REMOVED, "REMOVED"}, {SAHPI_RESE_RESOURCE_INACCESSIBLE, "INACCESSIBLE"}, {SAHPI_RESE_RESOURCE_UPDATED, "UPDATED"}, }; /** * oh_encode_resourceeventtype: * @buffer: Pointer to SaHpiTextBufferT that contains enum's string representation. * @type: Location (of SaHpiResourceEventTypeT) to place encoded result. * * Converts a @buffer->Data string, generated by oh_lookup_resourceeventtype(), back * into an SaHpiResourceEventTypeT type. * * Returns: * SaHpiResourceEventTypeT value - normal operation. * SA_ERR_HPI_INVALID_PARAMS - if @buffer or @type is NULL or @buffer->Data empty. * SA_ERR_HPI_INVALID_DATA - if @buffer->Data is invalid. **/ SaErrorT oh_encode_resourceeventtype(SaHpiTextBufferT *buffer, SaHpiResourceEventTypeT *type) { int i, found; if (!buffer || !type || buffer->Data == NULL || buffer->Data[0] == '\0') { return(SA_ERR_HPI_INVALID_PARAMS); } found = 0; for (i=0; iData, resourceeventtype_strings[i].str) == 0) { found++; break; } } if (found) { *type = resourceeventtype_strings[i].entity_type; } else { return(SA_ERR_HPI_INVALID_DATA); } return(SA_OK); } /** * oh_lookup_domaineventtype: * @value: enum value of type SaHpiDomainEventTypeT. * * Converts @value into a string based on @value's HPI enum definition. * * Returns: * string - normal operation. * NULL - if @value not a valid SaHpiDomainEventTypeT. **/ char * oh_lookup_domaineventtype(SaHpiDomainEventTypeT value) { switch (value) { case SAHPI_DOMAIN_REF_ADDED: return "ADDED"; case SAHPI_DOMAIN_REF_REMOVED: return "REMOVED"; default: return NULL; } } struct oh_domaineventtype_map domaineventtype_strings[] = { {SAHPI_DOMAIN_REF_ADDED, "ADDED"}, {SAHPI_DOMAIN_REF_REMOVED, "REMOVED"}, }; /** * oh_encode_domaineventtype: * @buffer: Pointer to SaHpiTextBufferT that contains enum's string representation. * @type: Location (of SaHpiDomainEventTypeT) to place encoded result. * * Converts a @buffer->Data string, generated by oh_lookup_domaineventtype(), back * into an SaHpiDomainEventTypeT type. * * Returns: * SaHpiDomainEventTypeT value - normal operation. * SA_ERR_HPI_INVALID_PARAMS - if @buffer or @type is NULL or @buffer->Data empty. * SA_ERR_HPI_INVALID_DATA - if @buffer->Data is invalid. **/ SaErrorT oh_encode_domaineventtype(SaHpiTextBufferT *buffer, SaHpiDomainEventTypeT *type) { int i, found; if (!buffer || !type || buffer->Data == NULL || buffer->Data[0] == '\0') { return(SA_ERR_HPI_INVALID_PARAMS); } found = 0; for (i=0; iData, domaineventtype_strings[i].str) == 0) { found++; break; } } if (found) { *type = domaineventtype_strings[i].entity_type; } else { return(SA_ERR_HPI_INVALID_DATA); } return(SA_OK); } /** * oh_lookup_sweventtype: * @value: enum value of type SaHpiSwEventTypeT. * * Converts @value into a string based on @value's HPI enum definition. * * Returns: * string - normal operation. * NULL - if @value not a valid SaHpiSwEventTypeT. **/ char * oh_lookup_sweventtype(SaHpiSwEventTypeT value) { switch (value) { case SAHPI_HPIE_AUDIT: return "AUDIT"; case SAHPI_HPIE_STARTUP: return "STARTUP"; case SAHPI_HPIE_OTHER: return "OTHER"; default: return NULL; } } struct oh_sweventtype_map sweventtype_strings[] = { {SAHPI_HPIE_AUDIT, "AUDIT"}, {SAHPI_HPIE_STARTUP, "STARTUP"}, {SAHPI_HPIE_OTHER, "OTHER"}, }; /** * oh_encode_sweventtype: * @buffer: Pointer to SaHpiTextBufferT that contains enum's string representation. * @type: Location (of SaHpiSwEventTypeT) to place encoded result. * * Converts a @buffer->Data string, generated by oh_lookup_sweventtype(), back * into an SaHpiSwEventTypeT type. * * Returns: * SaHpiSwEventTypeT value - normal operation. * SA_ERR_HPI_INVALID_PARAMS - if @buffer or @type is NULL or @buffer->Data empty. * SA_ERR_HPI_INVALID_DATA - if @buffer->Data is invalid. **/ SaErrorT oh_encode_sweventtype(SaHpiTextBufferT *buffer, SaHpiSwEventTypeT *type) { int i, found; if (!buffer || !type || buffer->Data == NULL || buffer->Data[0] == '\0') { return(SA_ERR_HPI_INVALID_PARAMS); } found = 0; for (i=0; iData, sweventtype_strings[i].str) == 0) { found++; break; } } if (found) { *type = sweventtype_strings[i].entity_type; } else { return(SA_ERR_HPI_INVALID_DATA); } return(SA_OK); } /** * oh_lookup_eventtype: * @value: enum value of type SaHpiEventTypeT. * * Converts @value into a string based on @value's HPI enum definition. * * Returns: * string - normal operation. * NULL - if @value not a valid SaHpiEventTypeT. **/ char * oh_lookup_eventtype(SaHpiEventTypeT value) { switch (value) { case SAHPI_ET_RESOURCE: return "RESOURCE"; case SAHPI_ET_DOMAIN: return "DOMAIN"; case SAHPI_ET_SENSOR: return "SENSOR"; case SAHPI_ET_SENSOR_ENABLE_CHANGE: return "SENSOR_ENABLE_CHANGE"; case SAHPI_ET_HOTSWAP: return "HOTSWAP"; case SAHPI_ET_WATCHDOG: return "WATCHDOG"; case SAHPI_ET_HPI_SW: return "HPI_SW"; case SAHPI_ET_OEM: return "OEM"; case SAHPI_ET_USER: return "USER"; case SAHPI_ET_DIMI: return "DIMI"; case SAHPI_ET_DIMI_UPDATE: return "DIMI_UPDATE"; case SAHPI_ET_FUMI: return "FUMI"; default: return NULL; } } struct oh_eventtype_map eventtype_strings[] = { {SAHPI_ET_RESOURCE, "RESOURCE"}, {SAHPI_ET_DOMAIN, "DOMAIN"}, {SAHPI_ET_SENSOR, "SENSOR"}, {SAHPI_ET_SENSOR_ENABLE_CHANGE, "SENSOR_ENABLE_CHANGE"}, {SAHPI_ET_HOTSWAP, "HOTSWAP"}, {SAHPI_ET_WATCHDOG, "WATCHDOG"}, {SAHPI_ET_HPI_SW, "HPI_SW"}, {SAHPI_ET_OEM, "OEM"}, {SAHPI_ET_USER, "USER"}, {SAHPI_ET_DIMI, "DIMI" }, {SAHPI_ET_DIMI_UPDATE, "DIMI_UPDATE" }, {SAHPI_ET_FUMI, "FUMI" }, }; /** * oh_encode_eventtype: * @buffer: Pointer to SaHpiTextBufferT that contains enum's string representation. * @type: Location (of SaHpiEventTypeT) to place encoded result. * * Converts a @buffer->Data string, generated by oh_lookup_eventtype(), back * into an SaHpiEventTypeT type. * * Returns: * SaHpiEventTypeT value - normal operation. * SA_ERR_HPI_INVALID_PARAMS - if @buffer or @type is NULL or @buffer->Data empty. * SA_ERR_HPI_INVALID_DATA - if @buffer->Data is invalid. **/ SaErrorT oh_encode_eventtype(SaHpiTextBufferT *buffer, SaHpiEventTypeT *type) { int i, found; if (!buffer || !type || buffer->Data == NULL || buffer->Data[0] == '\0') { return(SA_ERR_HPI_INVALID_PARAMS); } found = 0; for (i=0; iData, eventtype_strings[i].str) == 0) { found++; break; } } if (found) { *type = eventtype_strings[i].entity_type; } else { return(SA_ERR_HPI_INVALID_DATA); } return(SA_OK); } /** * oh_lookup_statuscondtype: * @value: enum value of type SaHpiStatusCondTypeT. * * Converts @value into a string based on @value's HPI enum definition. * * Returns: * string - normal operation. * NULL - if @value not a valid SaHpiStatusCondTypeT. **/ char * oh_lookup_statuscondtype(SaHpiStatusCondTypeT value) { switch (value) { case SAHPI_STATUS_COND_TYPE_SENSOR: return "SENSOR"; case SAHPI_STATUS_COND_TYPE_RESOURCE: return "RESOURCE"; case SAHPI_STATUS_COND_TYPE_OEM: return "OEM"; case SAHPI_STATUS_COND_TYPE_USER: return "USER"; default: return NULL; } } struct oh_statuscondtype_map statuscondtype_strings[] = { {SAHPI_STATUS_COND_TYPE_SENSOR, "SENSOR"}, {SAHPI_STATUS_COND_TYPE_RESOURCE, "RESOURCE"}, {SAHPI_STATUS_COND_TYPE_OEM, "OEM"}, {SAHPI_STATUS_COND_TYPE_USER, "USER"}, }; /** * oh_encode_statuscondtype: * @buffer: Pointer to SaHpiTextBufferT that contains enum's string representation. * @type: Location (of SaHpiStatusCondTypeT) to place encoded result. * * Converts a @buffer->Data string, generated by oh_lookup_statuscondtype(), back * into an SaHpiStatusCondTypeT type. * * Returns: * SaHpiStatusCondTypeT value - normal operation. * SA_ERR_HPI_INVALID_PARAMS - if @buffer or @type is NULL or @buffer->Data empty. * SA_ERR_HPI_INVALID_DATA - if @buffer->Data is invalid. **/ SaErrorT oh_encode_statuscondtype(SaHpiTextBufferT *buffer, SaHpiStatusCondTypeT *type) { int i, found; if (!buffer || !type || buffer->Data == NULL || buffer->Data[0] == '\0') { return(SA_ERR_HPI_INVALID_PARAMS); } found = 0; for (i=0; iData, statuscondtype_strings[i].str) == 0) { found++; break; } } if (found) { *type = statuscondtype_strings[i].entity_type; } else { return(SA_ERR_HPI_INVALID_DATA); } return(SA_OK); } /** * oh_lookup_annunciatormode: * @value: enum value of type SaHpiAnnunciatorModeT. * * Converts @value into a string based on @value's HPI enum definition. * * Returns: * string - normal operation. * NULL - if @value not a valid SaHpiAnnunciatorModeT. **/ char * oh_lookup_annunciatormode(SaHpiAnnunciatorModeT value) { switch (value) { case SAHPI_ANNUNCIATOR_MODE_AUTO: return "AUTO"; case SAHPI_ANNUNCIATOR_MODE_USER: return "USER"; case SAHPI_ANNUNCIATOR_MODE_SHARED: return "SHARED"; default: return NULL; } } struct oh_annunciatormode_map annunciatormode_strings[] = { {SAHPI_ANNUNCIATOR_MODE_AUTO, "AUTO"}, {SAHPI_ANNUNCIATOR_MODE_USER, "USER"}, {SAHPI_ANNUNCIATOR_MODE_SHARED, "SHARED"}, }; /** * oh_encode_annunciatormode: * @buffer: Pointer to SaHpiTextBufferT that contains enum's string representation. * @type: Location (of SaHpiAnnunciatorModeT) to place encoded result. * * Converts a @buffer->Data string, generated by oh_lookup_annunciatormode(), back * into an SaHpiAnnunciatorModeT type. * * Returns: * SaHpiAnnunciatorModeT value - normal operation. * SA_ERR_HPI_INVALID_PARAMS - if @buffer or @type is NULL or @buffer->Data empty. * SA_ERR_HPI_INVALID_DATA - if @buffer->Data is invalid. **/ SaErrorT oh_encode_annunciatormode(SaHpiTextBufferT *buffer, SaHpiAnnunciatorModeT *type) { int i, found; if (!buffer || !type || buffer->Data == NULL || buffer->Data[0] == '\0') { return(SA_ERR_HPI_INVALID_PARAMS); } found = 0; for (i=0; iData, annunciatormode_strings[i].str) == 0) { found++; break; } } if (found) { *type = annunciatormode_strings[i].entity_type; } else { return(SA_ERR_HPI_INVALID_DATA); } return(SA_OK); } /** * oh_lookup_annunciatortype: * @value: enum value of type SaHpiAnnunciatorTypeT. * * Converts @value into a string based on @value's HPI enum definition. * * Returns: * string - normal operation. * NULL - if @value not a valid SaHpiAnnunciatorTypeT. **/ char * oh_lookup_annunciatortype(SaHpiAnnunciatorTypeT value) { switch (value) { case SAHPI_ANNUNCIATOR_TYPE_LED: return "LED"; case SAHPI_ANNUNCIATOR_TYPE_DRY_CONTACT_CLOSURE: return "DRY_CONTACT_CLOSURE"; case SAHPI_ANNUNCIATOR_TYPE_AUDIBLE: return "AUDIBLE"; case SAHPI_ANNUNCIATOR_TYPE_LCD_DISPLAY: return "LCD_DISPLAY"; case SAHPI_ANNUNCIATOR_TYPE_MESSAGE: return "MESSAGE"; case SAHPI_ANNUNCIATOR_TYPE_COMPOSITE: return "COMPOSITE"; case SAHPI_ANNUNCIATOR_TYPE_OEM: return "OEM"; default: return NULL; } } struct oh_annunciatortype_map annunciatortype_strings[] = { {SAHPI_ANNUNCIATOR_TYPE_LED, "LED"}, {SAHPI_ANNUNCIATOR_TYPE_DRY_CONTACT_CLOSURE, "DRY_CONTACT_CLOSURE"}, {SAHPI_ANNUNCIATOR_TYPE_AUDIBLE, "AUDIBLE"}, {SAHPI_ANNUNCIATOR_TYPE_LCD_DISPLAY, "LCD_DISPLAY"}, {SAHPI_ANNUNCIATOR_TYPE_MESSAGE, "MESSAGE"}, {SAHPI_ANNUNCIATOR_TYPE_COMPOSITE, "COMPOSITE"}, {SAHPI_ANNUNCIATOR_TYPE_OEM, "OEM"}, }; /** * oh_encode_annunciatortype: * @buffer: Pointer to SaHpiTextBufferT that contains enum's string representation. * @type: Location (of SaHpiAnnunciatorTypeT) to place encoded result. * * Converts a @buffer->Data string, generated by oh_lookup_annunciatortype(), back * into an SaHpiAnnunciatorTypeT type. * * Returns: * SaHpiAnnunciatorTypeT value - normal operation. * SA_ERR_HPI_INVALID_PARAMS - if @buffer or @type is NULL or @buffer->Data empty. * SA_ERR_HPI_INVALID_DATA - if @buffer->Data is invalid. **/ SaErrorT oh_encode_annunciatortype(SaHpiTextBufferT *buffer, SaHpiAnnunciatorTypeT *type) { int i, found; if (!buffer || !type || buffer->Data == NULL || buffer->Data[0] == '\0') { return(SA_ERR_HPI_INVALID_PARAMS); } found = 0; for (i=0; iData, annunciatortype_strings[i].str) == 0) { found++; break; } } if (found) { *type = annunciatortype_strings[i].entity_type; } else { return(SA_ERR_HPI_INVALID_DATA); } return(SA_OK); } /** * oh_lookup_dimitestserviceimpact: * @value: enum value of type SaHpiDimiTestServiceImpactT. * * Converts @value into a string based on @value's HPI enum definition. * * Returns: * string - normal operation. * NULL - if @value not a valid SaHpiDimiTestServiceImpactT. **/ char* oh_lookup_dimitestserviceimpact(SaHpiDimiTestServiceImpactT value) { switch (value) { case SAHPI_DIMITEST_NONDEGRADING: return "NONDEGRADING"; case SAHPI_DIMITEST_DEGRADING: return "DEGRADING"; case SAHPI_DIMITEST_VENDOR_DEFINED_LEVEL: return "VENDOR_DEFINED_LEVEL"; default: return NULL; } } struct oh_dimitestserviceimpact_map dimitestserviceimpact_strings[] = { {SAHPI_DIMITEST_NONDEGRADING, "NONDEGRADING"}, {SAHPI_DIMITEST_DEGRADING, "DEGRADING"}, {SAHPI_DIMITEST_VENDOR_DEFINED_LEVEL, "VENDOR_DEFINED_LEVEL"}, }; /** * oh_encode_dimitestserviceimpact: * @buffer: Pointer to SaHpiTextBufferT that contains enum's string representation. * @type: Location (of SaHpiDimiTestServiceImpactT) to place encoded result. * * Converts a @buffer->Data string, generated by oh_lookup_dimitestserviceimpact(), back * into an SaHpiDimiTestServiceImpactT type. * * Returns: * SaHpiDimiTestServiceImpactT value - normal operation. * SA_ERR_HPI_INVALID_PARAMS - if @buffer or @type is NULL or @buffer->Data empty. * SA_ERR_HPI_INVALID_DATA - if @buffer->Data is invalid. **/ SaErrorT oh_encode_dimitestserviceimpact(SaHpiTextBufferT *buffer, SaHpiDimiTestServiceImpactT *type) { int i, found; if (!buffer || !type || buffer->Data == NULL || buffer->Data[0] == '\0') { return(SA_ERR_HPI_INVALID_PARAMS); } found = 0; for (i=0; iData, dimitestserviceimpact_strings[i].str) == 0) { found++; break; } } if (found) { *type = dimitestserviceimpact_strings[i].entity_type; } else { return(SA_ERR_HPI_INVALID_DATA); } return(SA_OK); } /** * oh_lookup_dimitestrunstatus: * @value: enum value of type SaHpiDimiTestRunStatusT. * * Converts @value into a string based on @value's HPI enum definition. * * Returns: * string - normal operation. * NULL - if @value not a valid SaHpiDimiTestRunStatusT. **/ char * oh_lookup_dimitestrunstatus(SaHpiDimiTestRunStatusT value) { switch (value) { case SAHPI_DIMITEST_STATUS_NOT_RUN: return "NOT_RUN"; case SAHPI_DIMITEST_STATUS_FINISHED_NO_ERRORS: return "FINISHED_NO_ERRORS"; case SAHPI_DIMITEST_STATUS_FINISHED_ERRORS: return "FINISHED_ERRORS"; case SAHPI_DIMITEST_STATUS_CANCELED: return "CANCELED"; case SAHPI_DIMITEST_STATUS_RUNNING: return "RUNNING"; default: return NULL; } } struct oh_dimitestrunstatus_map dimitestrunstatus_strings[] = { {SAHPI_DIMITEST_STATUS_NOT_RUN, "NOT_RUN"}, {SAHPI_DIMITEST_STATUS_FINISHED_NO_ERRORS, "FINISHED_NO_ERRORS"}, {SAHPI_DIMITEST_STATUS_FINISHED_ERRORS, "FINISHED_ERRORS"}, {SAHPI_DIMITEST_STATUS_CANCELED, "CANCELED"}, {SAHPI_DIMITEST_STATUS_RUNNING, "RUNNING"}, }; /** * oh_encode_dimitestrunstatus: * @buffer: Pointer to SaHpiTextBufferT that contains enum's string representation. * @type: Location (of SaHpiDimiTestRunStatusT) to place encoded result. * * Converts a @buffer->Data string, generated by oh_lookup_dimitestrunstatus(), back * into an SaHpiDimiTestRunStatusT type. * * Returns: * SaHpiDimiTestRunStatusT value - normal operation. * SA_ERR_HPI_INVALID_PARAMS - if @buffer or @type is NULL or @buffer->Data empty. * SA_ERR_HPI_INVALID_DATA - if @buffer->Data is invalid. **/ SaErrorT oh_encode_dimitestrunstatus(SaHpiTextBufferT *buffer, SaHpiDimiTestRunStatusT *type) { int i, found; if (!buffer || !type || buffer->Data == NULL || buffer->Data[0] == '\0') { return(SA_ERR_HPI_INVALID_PARAMS); } found = 0; for (i=0; iData, dimitestrunstatus_strings[i].str) == 0) { found++; break; } } if (found) { *type = dimitestrunstatus_strings[i].entity_type; } else { return(SA_ERR_HPI_INVALID_DATA); } return(SA_OK); } /** * oh_lookup_fumisourcestatus: * @value: enum value of type SaHpiFumiSourceStatusT. * * Converts @value into a string based on @value's HPI enum definition. * * Returns: * string - normal operation. * NULL - if @value not a valid SaHpiFumiSourceStatusT. **/ char * oh_lookup_fumisourcestatus(SaHpiFumiSourceStatusT value) { switch (value) { case SAHPI_FUMI_SRC_VALID: return "VALID"; case SAHPI_FUMI_SRC_PROTOCOL_NOT_SUPPORTED: return "PROTOCOL_NOT_SUPPORTED"; case SAHPI_FUMI_SRC_UNREACHABLE: return "UNREACHABLE"; case SAHPI_FUMI_SRC_VALIDATION_NOT_STARTED: return "VALIDATION_NOT_STARTED"; case SAHPI_FUMI_SRC_VALIDATION_INITIATED: return "VALIDATION_INITIATED"; case SAHPI_FUMI_SRC_VALIDATION_FAIL: return "VALIDATION_FAIL"; case SAHPI_FUMI_SRC_TYPE_MISMATCH: return "SRC_TYPE_MISMATCH"; case SAHPI_FUMI_SRC_INVALID: return "INVALID"; case SAHPI_FUMI_SRC_VALIDITY_UNKNOWN: return "VALIDITY_UNKNOWN"; default: return NULL; } } struct oh_fumisourcestatus_map fumisourcestatus_strings[] = { {SAHPI_FUMI_SRC_VALID, "VALID"}, {SAHPI_FUMI_SRC_PROTOCOL_NOT_SUPPORTED, "SUPPORTED"}, {SAHPI_FUMI_SRC_UNREACHABLE, "UNREACHABLE"}, {SAHPI_FUMI_SRC_VALIDATION_NOT_STARTED, "VALIDATION_NOT_STARTED"}, {SAHPI_FUMI_SRC_VALIDATION_INITIATED, "VALIDATION_INITIATED"}, {SAHPI_FUMI_SRC_VALIDATION_FAIL, "VALIDATION_FAIL"}, {SAHPI_FUMI_SRC_TYPE_MISMATCH, "TYPE_MISMATCH"}, {SAHPI_FUMI_SRC_INVALID, "INVALID"}, {SAHPI_FUMI_SRC_VALIDITY_UNKNOWN, "VALIDITY_UNKNOWN"}, }; /** * oh_encode_fumisourcestatus: * @buffer: Pointer to SaHpiTextBufferT that contains enum's string representation. * @type: Location (of SaHpiFumiSourceStatusT) to place encoded result. * * Converts a @buffer->Data string, generated by oh_lookup_fumisourcestatus(), back * into an SaHpiFumiSourceStatusT type. * * Returns: * SaHpiFumiSourceStatusT value - normal operation. * SA_ERR_HPI_INVALID_PARAMS - if @buffer or @type is NULL or @buffer->Data empty. * SA_ERR_HPI_INVALID_DATA - if @buffer->Data is invalid. **/ SaErrorT oh_encode_fumisourcestatus(SaHpiTextBufferT *buffer, SaHpiFumiSourceStatusT *type) { int i, found; if (!buffer || !type || buffer->Data == NULL || buffer->Data[0] == '\0') { return(SA_ERR_HPI_INVALID_PARAMS); } found = 0; for (i=0; iData, fumisourcestatus_strings[i].str) == 0) { found++; break; } } if (found) { *type = fumisourcestatus_strings[i].entity_type; } else { return(SA_ERR_HPI_INVALID_DATA); } return(SA_OK); } /** * oh_lookup_fumibankstate: * @value: enum value of type SaHpiFumiBankStateT. * * Converts @value into a string based on @value's HPI enum definition. * * Returns: * string - normal operation. * NULL - if @value not a valid SaHpiFumiBankStateT. **/ char * oh_lookup_fumibankstate(SaHpiFumiBankStateT value) { switch (value) { case SAHPI_FUMI_BANK_VALID: return "VALID"; case SAHPI_FUMI_BANK_UPGRADE_IN_PROGRESS: return "UPGRADE_IN_PROGRESS"; case SAHPI_FUMI_BANK_CORRUPTED: return "CORRUPTED"; case SAHPI_FUMI_BANK_ACTIVE: return "ACTIVE"; case SAHPI_FUMI_BANK_BUSY: return "BUSY"; case SAHPI_FUMI_BANK_UNKNOWN: return "UNKNOWN"; default: return NULL; } } struct oh_fumibankstate_map fumibankstate_strings[] = { {SAHPI_FUMI_BANK_VALID, "VALID"}, {SAHPI_FUMI_BANK_UPGRADE_IN_PROGRESS, "UPGRADE_IN_PROGRESS"}, {SAHPI_FUMI_BANK_CORRUPTED, "CORRUPTED"}, {SAHPI_FUMI_BANK_ACTIVE, "ACTIVE"}, {SAHPI_FUMI_BANK_BUSY, "BUSY"}, {SAHPI_FUMI_BANK_UNKNOWN, "UNKNOWN"}, }; /** * oh_encode_fumibankstate: * @buffer: Pointer to SaHpiTextBufferT that contains enum's string representation. * @type: Location (of SaHpiFumiBankStateT) to place encoded result. * * Converts a @buffer->Data string, generated by oh_lookup_fumibankstate(), back * into an SaHpiFumiBankStateT type. * * Returns: * SaHpiFumiBankStateT value - normal operation. * SA_ERR_HPI_INVALID_PARAMS - if @buffer or @type is NULL or @buffer->Data empty. * SA_ERR_HPI_INVALID_DATA - if @buffer->Data is invalid. **/ SaErrorT oh_encode_fumibankstate(SaHpiTextBufferT *buffer, SaHpiFumiBankStateT *type) { int i, found; if (!buffer || !type || buffer->Data == NULL || buffer->Data[0] == '\0') { return(SA_ERR_HPI_INVALID_PARAMS); } found = 0; for (i=0; iData, fumibankstate_strings[i].str) == 0) { found++; break; } } if (found) { *type = fumibankstate_strings[i].entity_type; } else { return(SA_ERR_HPI_INVALID_DATA); } return(SA_OK); } /** * oh_lookup_fumiupgradestatus: * @value: enum value of type SaHpiFumiUpgradeStatusT. * * Converts @value into a string based on @value's HPI enum definition. * * Returns: * string - normal operation. * NULL - if @value not a valid SaHpiFumiUpgradeStatusT. **/ char * oh_lookup_fumiupgradestatus(SaHpiFumiUpgradeStatusT value) { switch (value) { case SAHPI_FUMI_OPERATION_NOTSTARTED: return "OPERATION_NOTSTARTED"; case SAHPI_FUMI_SOURCE_VALIDATION_INITIATED: return "SOURCE_VALIDATION_INITIATED"; case SAHPI_FUMI_SOURCE_VALIDATION_FAILED: return "SOURCE_VALIDATION_FAILED"; case SAHPI_FUMI_SOURCE_VALIDATION_DONE: return "SOURCE_VALIDATION_DONE"; case SAHPI_FUMI_SOURCE_VALIDATION_CANCELLED: return "SOURCE_VALIDATION_CANCELLED"; case SAHPI_FUMI_INSTALL_INITIATED: return "INSTALL_INITIATED"; case SAHPI_FUMI_INSTALL_FAILED_ROLLBACK_NEEDED: return "INSTALL_FAILED_ROLLBACK_NEEDED"; case SAHPI_FUMI_INSTALL_FAILED_ROLLBACK_INITIATED: return "INSTALL_FAILED_ROLLBACK_INITIATED"; case SAHPI_FUMI_INSTALL_FAILED_ROLLBACK_NOT_POSSIBLE: return "INSTALL_FAILED_ROLLBACK_NOT_POSSIBLE"; case SAHPI_FUMI_INSTALL_DONE: return "INSTALL_DONE"; case SAHPI_FUMI_INSTALL_CANCELLED: return "INSTALL_CANCELLED"; case SAHPI_FUMI_ROLLBACK_INITIATED: return "ROLLBACK_INITIATED"; case SAHPI_FUMI_ROLLBACK_FAILED: return "ROLLBACK_FAILED"; case SAHPI_FUMI_ROLLBACK_DONE: return "ROLLBACK_DONE"; case SAHPI_FUMI_ROLLBACK_CANCELLED: return "ROLLBACK_CANCELLED"; case SAHPI_FUMI_BACKUP_INITIATED: return "BACKUP_INITIATED"; case SAHPI_FUMI_BACKUP_FAILED: return "BACKUP_FAILED"; case SAHPI_FUMI_BACKUP_DONE: return "BACKUP_DONE"; case SAHPI_FUMI_BACKUP_CANCELLED: return "BACKUP_CANCELLED"; case SAHPI_FUMI_BANK_COPY_INITIATED: return "BANK_COPY_INITIATED"; case SAHPI_FUMI_BANK_COPY_FAILED: return "BANK_COPY_FAILED"; case SAHPI_FUMI_BANK_COPY_DONE: return "BANK_COPY_DONE"; case SAHPI_FUMI_BANK_COPY_CANCELLED: return "BANK_COPY_CANCELLED"; case SAHPI_FUMI_TARGET_VERIFY_INITIATED: return "TARGET_VERIFY_INITIATED"; case SAHPI_FUMI_TARGET_VERIFY_FAILED: return "TARGET_VERIFY_FAILED"; case SAHPI_FUMI_TARGET_VERIFY_DONE: return "TARGET_VERIFY_DONE"; case SAHPI_FUMI_TARGET_VERIFY_CANCELLED: return "TARGET_VERIFY_CANCELLED"; default: return NULL; } } struct oh_fumiupgradestatus_map fumiupgradestatus_strings[] = { {SAHPI_FUMI_OPERATION_NOTSTARTED, "OPERATION_NOTSTARTED"}, {SAHPI_FUMI_SOURCE_VALIDATION_INITIATED, "SOURCE_VALIDATION_INITIATED"}, {SAHPI_FUMI_SOURCE_VALIDATION_FAILED, "SOURCE_VALIDATION_FAILED"}, {SAHPI_FUMI_SOURCE_VALIDATION_DONE, "SOURCE_VALIDATION_DONE"}, {SAHPI_FUMI_SOURCE_VALIDATION_CANCELLED, "SOURCE_VALIDATION_CANCELLED"}, {SAHPI_FUMI_INSTALL_INITIATED, "INSTALL_INITIATED"}, {SAHPI_FUMI_INSTALL_FAILED_ROLLBACK_NEEDED, "INSTALL_FAILED_ROLLBACK_NEEDED"}, {SAHPI_FUMI_INSTALL_FAILED_ROLLBACK_INITIATED, "INSTALL_FAILED_ROLLBACK_INITIATED"}, {SAHPI_FUMI_INSTALL_FAILED_ROLLBACK_NOT_POSSIBLE, "INSTALL_FAILED_ROLLBACK_NOT_POSSIBLE"}, {SAHPI_FUMI_INSTALL_DONE, "INSTALL_DONE"}, {SAHPI_FUMI_INSTALL_CANCELLED, "INSTALL_CANCELLED"}, {SAHPI_FUMI_ROLLBACK_INITIATED, "ROLLBACK_INITIATED"}, {SAHPI_FUMI_ROLLBACK_FAILED, "ROLLBACK_FAILED"}, {SAHPI_FUMI_ROLLBACK_DONE, "ROLLBACK_DONE"}, {SAHPI_FUMI_ROLLBACK_CANCELLED, "ROLLBACK_CANCELLED"}, {SAHPI_FUMI_BACKUP_INITIATED, "BACKUP_INITIATED"}, {SAHPI_FUMI_BACKUP_FAILED, "BACKUP_FAILED"}, {SAHPI_FUMI_BACKUP_DONE, "BACKUP_DONE"}, {SAHPI_FUMI_BACKUP_CANCELLED, "BACKUP_CANCELLED"}, {SAHPI_FUMI_BANK_COPY_INITIATED, "BANK_COPY_INITIATED"}, {SAHPI_FUMI_BANK_COPY_FAILED, "BANK_COPY_FAILED"}, {SAHPI_FUMI_BANK_COPY_DONE, "BANK_COPY_DONE"}, {SAHPI_FUMI_BANK_COPY_CANCELLED, "BANK_COPY_CANCELLED"}, {SAHPI_FUMI_TARGET_VERIFY_INITIATED, "TARGET_VERIFY_INITIATED"}, {SAHPI_FUMI_TARGET_VERIFY_FAILED, "TARGET_VERIFY_FAILED"}, {SAHPI_FUMI_TARGET_VERIFY_DONE, "TARGET_VERIFY_DONE"}, {SAHPI_FUMI_TARGET_VERIFY_CANCELLED, "TARGET_VERIFY_CANCELLED"}, }; /** * oh_encode_fumiupgradestatus: * @buffer: Pointer to SaHpiTextBufferT that contains enum's string representation. * @type: Location (of SaHpiFumiUpgradeStatusT) to place encoded result. * * Converts a @buffer->Data string, generated by oh_lookup_fumiupgradestatus(), back * into an SaHpiFumiUpgradeStatusT type. * * Returns: * SaHpiFumiUpgradeStatusT value - normal operation. * SA_ERR_HPI_INVALID_PARAMS - if @buffer or @type is NULL or @buffer->Data empty. * SA_ERR_HPI_INVALID_DATA - if @buffer->Data is invalid. **/ SaErrorT oh_encode_fumiupgradestatus(SaHpiTextBufferT *buffer, SaHpiFumiUpgradeStatusT *type) { int i, found; if (!buffer || !type || buffer->Data == NULL || buffer->Data[0] == '\0') { return(SA_ERR_HPI_INVALID_PARAMS); } found = 0; for (i=0; iData, fumiupgradestatus_strings[i].str) == 0) { found++; break; } } if (found) { *type = fumiupgradestatus_strings[i].entity_type; } else { return(SA_ERR_HPI_INVALID_DATA); } return(SA_OK); } /** * oh_lookup_rdrtype: * @value: enum value of type SaHpiRdrTypeT. * * Converts @value into a string based on @value's HPI enum definition. * * Returns: * string - normal operation. * NULL - if @value not a valid SaHpiRdrTypeT. **/ char * oh_lookup_rdrtype(SaHpiRdrTypeT value) { switch (value) { case SAHPI_NO_RECORD: return "NO_RECORD"; case SAHPI_CTRL_RDR: return "CTRL_RDR"; case SAHPI_SENSOR_RDR: return "SENSOR_RDR"; case SAHPI_INVENTORY_RDR: return "INVENTORY_RDR"; case SAHPI_WATCHDOG_RDR: return "WATCHDOG_RDR"; case SAHPI_ANNUNCIATOR_RDR: return "ANNUNCIATOR_RDR"; case SAHPI_DIMI_RDR: return "DIMI_RDR"; case SAHPI_FUMI_RDR: return "FUMI_RDR"; default: return NULL; } } struct oh_rdrtype_map rdrtype_strings[] = { {SAHPI_NO_RECORD, "NO_RECORD"}, {SAHPI_CTRL_RDR, "CTRL_RDR"}, {SAHPI_SENSOR_RDR, "SENSOR_RDR"}, {SAHPI_INVENTORY_RDR, "INVENTORY_RDR"}, {SAHPI_WATCHDOG_RDR, "WATCHDOG_RDR"}, {SAHPI_ANNUNCIATOR_RDR, "ANNUNCIATOR_RDR"}, {SAHPI_DIMI_RDR, "DIMI_RDR"}, {SAHPI_FUMI_RDR, "FUMI_RDR"}, }; /** * oh_encode_rdrtype: * @buffer: Pointer to SaHpiTextBufferT that contains enum's string representation. * @type: Location (of SaHpiRdrTypeT) to place encoded result. * * Converts a @buffer->Data string, generated by oh_lookup_rdrtype(), back * into an SaHpiRdrTypeT type. * * Returns: * SaHpiRdrTypeT value - normal operation. * SA_ERR_HPI_INVALID_PARAMS - if @buffer or @type is NULL or @buffer->Data empty. * SA_ERR_HPI_INVALID_DATA - if @buffer->Data is invalid. **/ SaErrorT oh_encode_rdrtype(SaHpiTextBufferT *buffer, SaHpiRdrTypeT *type) { int i, found; if (!buffer || !type || buffer->Data == NULL || buffer->Data[0] == '\0') { return(SA_ERR_HPI_INVALID_PARAMS); } found = 0; for (i=0; iData, rdrtype_strings[i].str) == 0) { found++; break; } } if (found) { *type = rdrtype_strings[i].entity_type; } else { return(SA_ERR_HPI_INVALID_DATA); } return(SA_OK); } /** * oh_lookup_parmaction: * @value: enum value of type SaHpiParmActionT. * * Converts @value into a string based on @value's HPI enum definition. * * Returns: * string - normal operation. * NULL - if @value not a valid SaHpiParmActionT. **/ char * oh_lookup_parmaction(SaHpiParmActionT value) { switch (value) { case SAHPI_DEFAULT_PARM: return "DEFAULT_PARM"; case SAHPI_SAVE_PARM: return "SAVE_PARM"; case SAHPI_RESTORE_PARM: return "RESTORE_PARM"; default: return NULL; } } struct oh_parmaction_map parmaction_strings[] = { {SAHPI_DEFAULT_PARM, "DEFAULT_PARM"}, {SAHPI_SAVE_PARM, "SAVE_PARM"}, {SAHPI_RESTORE_PARM, "RESTORE_PARM"}, }; /** * oh_encode_parmaction: * @buffer: Pointer to SaHpiTextBufferT that contains enum's string representation. * @type: Location (of SaHpiParmActionT) to place encoded result. * * Converts a @buffer->Data string, generated by oh_lookup_parmaction(), back * into an SaHpiParmActionT type. * * Returns: * SaHpiParmActionT value - normal operation. * SA_ERR_HPI_INVALID_PARAMS - if @buffer or @type is NULL or @buffer->Data empty. * SA_ERR_HPI_INVALID_DATA - if @buffer->Data is invalid. **/ SaErrorT oh_encode_parmaction(SaHpiTextBufferT *buffer, SaHpiParmActionT *type) { int i, found; if (!buffer || !type || buffer->Data == NULL || buffer->Data[0] == '\0') { return(SA_ERR_HPI_INVALID_PARAMS); } found = 0; for (i=0; iData, parmaction_strings[i].str) == 0) { found++; break; } } if (found) { *type = parmaction_strings[i].entity_type; } else { return(SA_ERR_HPI_INVALID_DATA); } return(SA_OK); } /** * oh_lookup_resetaction: * @value: enum value of type SaHpiResetActionT. * * Converts @value into a string based on @value's HPI enum definition. * * Returns: * string - normal operation. * NULL - if @value not a valid SaHpiResetActionT. **/ char * oh_lookup_resetaction(SaHpiResetActionT value) { switch (value) { case SAHPI_COLD_RESET: return "COLD_RESET"; case SAHPI_WARM_RESET: return "WARM_RESET"; case SAHPI_RESET_ASSERT: return "RESET_ASSERT"; case SAHPI_RESET_DEASSERT: return "RESET_DEASSERT"; default: return NULL; } } struct oh_resetaction_map resetaction_strings[] = { {SAHPI_COLD_RESET, "COLD_RESET"}, {SAHPI_WARM_RESET, "WARM_RESET"}, {SAHPI_RESET_ASSERT, "RESET_ASSERT"}, {SAHPI_RESET_DEASSERT, "RESET_DEASSERT"}, }; /** * oh_encode_resetaction: * @buffer: Pointer to SaHpiTextBufferT that contains enum's string representation. * @type: Location (of SaHpiResetActionT) to place encoded result. * * Converts a @buffer->Data string, generated by oh_lookup_resetaction(), back * into an SaHpiResetActionT type. * * Returns: * SaHpiResetActionT value - normal operation. * SA_ERR_HPI_INVALID_PARAMS - if @buffer or @type is NULL or @buffer->Data empty. * SA_ERR_HPI_INVALID_DATA - if @buffer->Data is invalid. **/ SaErrorT oh_encode_resetaction(SaHpiTextBufferT *buffer, SaHpiResetActionT *type) { int i, found; if (!buffer || !type || buffer->Data == NULL || buffer->Data[0] == '\0') { return(SA_ERR_HPI_INVALID_PARAMS); } found = 0; for (i=0; iData, resetaction_strings[i].str) == 0) { found++; break; } } if (found) { *type = resetaction_strings[i].entity_type; } else { return(SA_ERR_HPI_INVALID_DATA); } return(SA_OK); } /** * oh_lookup_powerstate: * @value: enum value of type SaHpiPowerStateT. * * Converts @value into a string based on @value's HPI enum definition. * * Returns: * string - normal operation. * NULL - if @value not a valid SaHpiPowerStateT. **/ char * oh_lookup_powerstate(SaHpiPowerStateT value) { switch (value) { case SAHPI_POWER_OFF: return "OFF"; case SAHPI_POWER_ON: return "ON"; case SAHPI_POWER_CYCLE: return "CYCLE"; default: return NULL; } } struct oh_powerstate_map powerstate_strings[] = { {SAHPI_POWER_OFF, "OFF"}, {SAHPI_POWER_ON, "ON"}, {SAHPI_POWER_CYCLE, "CYCLE"}, }; /** * oh_encode_powerstate: * @buffer: Pointer to SaHpiTextBufferT that contains enum's string representation. * @type: Location (of SaHpiPowerStateT) to place encoded result. * * Converts a @buffer->Data string, generated by oh_lookup_powerstate(), back * into an SaHpiPowerStateT type. * * Returns: * SaHpiPowerStateT value - normal operation. * SA_ERR_HPI_INVALID_PARAMS - if @buffer or @type is NULL or @buffer->Data empty. * SA_ERR_HPI_INVALID_DATA - if @buffer->Data is invalid. **/ SaErrorT oh_encode_powerstate(SaHpiTextBufferT *buffer, SaHpiPowerStateT *type) { int i, found; if (!buffer || !type || buffer->Data == NULL || buffer->Data[0] == '\0') { return(SA_ERR_HPI_INVALID_PARAMS); } found = 0; for (i=0; iData, powerstate_strings[i].str) == 0) { found++; break; } } if (found) { *type = powerstate_strings[i].entity_type; } else { return(SA_ERR_HPI_INVALID_DATA); } return(SA_OK); } /** * oh_lookup_eventlogoverflowaction: * @value: enum value of type SaHpiEventLogOverflowActionT. * * Converts @value into a string based on @value's HPI enum definition. * * Returns: * string - normal operation. * NULL - if @value not a valid SaHpiEventLogOverflowActionT. **/ char * oh_lookup_eventlogoverflowaction(SaHpiEventLogOverflowActionT value) { switch (value) { case SAHPI_EL_OVERFLOW_DROP: return "OVERFLOW_DROP"; case SAHPI_EL_OVERFLOW_OVERWRITE: return "OVERFLOW_OVERWRITE"; default: return NULL; } } struct oh_eventlogoverflowaction_map eventlogoverflowaction_strings[] = { {SAHPI_EL_OVERFLOW_DROP, "OVERFLOW_DROP"}, {SAHPI_EL_OVERFLOW_OVERWRITE, "OVERFLOW_OVERWRITE"}, }; /** * oh_encode_eventlogoverflowaction: * @buffer: Pointer to SaHpiTextBufferT that contains enum's string representation. * @type: Location (of SaHpiEventLogOverflowActionT) to place encoded result. * * Converts a @buffer->Data string, generated by oh_lookup_eventlogoverflowaction(), back * into an SaHpiEventLogOverflowActionT type. * * Returns: * SaHpiEventLogOverflowActionT value - normal operation. * SA_ERR_HPI_INVALID_PARAMS - if @buffer or @type is NULL or @buffer->Data empty. * SA_ERR_HPI_INVALID_DATA - if @buffer->Data is invalid. **/ SaErrorT oh_encode_eventlogoverflowaction(SaHpiTextBufferT *buffer, SaHpiEventLogOverflowActionT *type) { int i, found; if (!buffer || !type || buffer->Data == NULL || buffer->Data[0] == '\0') { return(SA_ERR_HPI_INVALID_PARAMS); } found = 0; for (i=0; iData, eventlogoverflowaction_strings[i].str) == 0) { found++; break; } } if (found) { *type = eventlogoverflowaction_strings[i].entity_type; } else { return(SA_ERR_HPI_INVALID_DATA); } return(SA_OK); } /** * oh_lookup_error: * @value: enum value of type SaErrorT. * * Converts @value into a string based on @value's HPI enum definition. * * Returns: * string - normal operation. * NULL - if @value not a valid SaErrorT. **/ char * oh_lookup_error(SaErrorT value) { switch (value) { case SA_OK: return "SA_OK"; case SA_ERR_HPI_ERROR: return "ERROR"; case SA_ERR_HPI_UNSUPPORTED_API: return "UNSUPPORTED_API"; case SA_ERR_HPI_BUSY: return "BUSY"; case SA_ERR_HPI_INTERNAL_ERROR: return "INTERNAL_ERROR"; case SA_ERR_HPI_INVALID_CMD: return "INVALID_CMD"; case SA_ERR_HPI_TIMEOUT: return "TIMEOUT"; case SA_ERR_HPI_OUT_OF_SPACE: return "OUT_OF_SPACE"; case SA_ERR_HPI_OUT_OF_MEMORY: return "OUT_OF_MEMORY"; case SA_ERR_HPI_INVALID_PARAMS: return "INVALID_PARAMS"; case SA_ERR_HPI_INVALID_DATA: return "INVALID_DATA"; case SA_ERR_HPI_NOT_PRESENT: return "NOT_PRESENT"; case SA_ERR_HPI_NO_RESPONSE: return "NO_RESPONSE"; case SA_ERR_HPI_DUPLICATE: return "DUPLICATE"; case SA_ERR_HPI_INVALID_SESSION: return "INVALID_SESSION"; case SA_ERR_HPI_INVALID_DOMAIN: return "INVALID_DOMAIN"; case SA_ERR_HPI_INVALID_RESOURCE: return "INVALID_RESOURCE"; case SA_ERR_HPI_INVALID_REQUEST: return "INVALID_REQUEST"; case SA_ERR_HPI_ENTITY_NOT_PRESENT: return "ENTITY_NOT_PRESENT"; case SA_ERR_HPI_READ_ONLY: return "READ_ONLY"; case SA_ERR_HPI_CAPABILITY: return "CAPABILITY"; case SA_ERR_HPI_UNKNOWN: return "UNKNOWN"; default: return NULL; } } struct oh_error_map error_strings[] = { {SA_OK, "SA_OK"}, {SA_ERR_HPI_ERROR, "ERROR"}, {SA_ERR_HPI_UNSUPPORTED_API, "UNSUPPORTED_API"}, {SA_ERR_HPI_BUSY, "BUSY"}, {SA_ERR_HPI_INTERNAL_ERROR, "INTERNAL_ERROR"}, {SA_ERR_HPI_INVALID_CMD, "INVALID_CMD"}, {SA_ERR_HPI_TIMEOUT, "TIMEOUT"}, {SA_ERR_HPI_OUT_OF_SPACE, "OUT_OF_SPACE"}, {SA_ERR_HPI_OUT_OF_MEMORY, "OUT_OF_MEMORY"}, {SA_ERR_HPI_INVALID_PARAMS, "INVALID_PARAMS"}, {SA_ERR_HPI_INVALID_DATA, "INVALID_DATA"}, {SA_ERR_HPI_NOT_PRESENT, "NOT_PRESENT"}, {SA_ERR_HPI_NO_RESPONSE, "NO_RESPONSE"}, {SA_ERR_HPI_DUPLICATE, "DUPLICATE"}, {SA_ERR_HPI_INVALID_SESSION, "INVALID_SESSION"}, {SA_ERR_HPI_INVALID_DOMAIN, "INVALID_DOMAIN"}, {SA_ERR_HPI_INVALID_RESOURCE, "INVALID_RESOURCE"}, {SA_ERR_HPI_INVALID_REQUEST, "INVALID_REQUEST"}, {SA_ERR_HPI_ENTITY_NOT_PRESENT, "ENTITY_NOT_PRESENT"}, {SA_ERR_HPI_READ_ONLY, "READ_ONLY"}, {SA_ERR_HPI_CAPABILITY, "CAPABILITY"}, {SA_ERR_HPI_UNKNOWN, "UNKNOWN"}, }; /** * oh_encode_error: * @buffer: Pointer to SaHpiTextBufferT that contains enum's string representation. * @type: Location (of SaErrorT) to place encoded result. * * Converts a @buffer->Data string, generated by oh_lookup_error(), back * into an SaErrorT type. * * Returns: * SaErrorT value - normal operation. * SA_ERR_HPI_INVALID_PARAMS - if @buffer or @type is NULL or @buffer->Data empty. * SA_ERR_HPI_INVALID_DATA - if @buffer->Data is invalid. **/ SaErrorT oh_encode_error(SaHpiTextBufferT *buffer, SaErrorT *type) { int i, found; if (!buffer || !type || buffer->Data == NULL || buffer->Data[0] == '\0') { return(SA_ERR_HPI_INVALID_PARAMS); } found = 0; for (i=0; iData, error_strings[i].str) == 0) { found++; break; } } if (found) { *type = error_strings[i].entity_type; } else { return(SA_ERR_HPI_INVALID_DATA); } return(SA_OK); } /** * oh_lookup_eventcategory: * @value: enum value of type SaHpiEventCategoryT. * * Converts @value into a string based on @value's HPI enum definition. * * Returns: * string - normal operation. * NULL - if @value not a valid SaHpiEventCategoryT. **/ char * oh_lookup_eventcategory(SaHpiEventCategoryT value) { switch (value) { case SAHPI_EC_UNSPECIFIED: return "UNSPECIFIED"; case SAHPI_EC_THRESHOLD: return "THRESHOLD"; case SAHPI_EC_USAGE: return "USAGE"; case SAHPI_EC_STATE: return "STATE"; case SAHPI_EC_PRED_FAIL: return "PRED_FAIL"; case SAHPI_EC_LIMIT: return "LIMIT"; case SAHPI_EC_PERFORMANCE: return "PERFORMANCE"; case SAHPI_EC_SEVERITY: return "SEVERITY"; case SAHPI_EC_PRESENCE: return "PRESENCE"; case SAHPI_EC_ENABLE: return "ENABLE"; case SAHPI_EC_AVAILABILITY: return "AVAILABILITY"; case SAHPI_EC_REDUNDANCY: return "REDUNDANCY"; case SAHPI_EC_SENSOR_SPECIFIC: return "SENSOR_SPECIFIC"; case SAHPI_EC_GENERIC: return "GENERIC"; default: return NULL; } } struct oh_eventcategory_map eventcategory_strings[] = { {SAHPI_EC_UNSPECIFIED, "UNSPECIFIED"}, {SAHPI_EC_THRESHOLD, "THRESHOLD"}, {SAHPI_EC_USAGE, "USAGE"}, {SAHPI_EC_STATE, "STATE"}, {SAHPI_EC_PRED_FAIL, "PRED_FAIL"}, {SAHPI_EC_LIMIT, "LIMIT"}, {SAHPI_EC_PERFORMANCE, "PERFORMANCE"}, {SAHPI_EC_SEVERITY, "SEVERITY"}, {SAHPI_EC_PRESENCE, "PRESENCE"}, {SAHPI_EC_ENABLE, "ENABLE"}, {SAHPI_EC_AVAILABILITY, "AVAILABILITY"}, {SAHPI_EC_REDUNDANCY, "REDUNDANCY"}, {SAHPI_EC_SENSOR_SPECIFIC, "SENSOR_SPECIFIC"}, {SAHPI_EC_GENERIC, "GENERIC"}, }; /** * oh_encode_eventcategory: * @buffer: Pointer to SaHpiTextBufferT that contains enum's string representation. * @type: Location (of SaHpiEventCategoryT) to place encoded result. * * Converts a @buffer->Data string, generated by oh_lookup_eventcategory(), back * into an SaHpiEventCategoryT type. * * Returns: * SaHpiEventCategoryT value - normal operation. * SA_ERR_HPI_INVALID_PARAMS - if @buffer or @type is NULL or @buffer->Data empty. * SA_ERR_HPI_INVALID_DATA - if @buffer->Data is invalid. **/ SaErrorT oh_encode_eventcategory(SaHpiTextBufferT *buffer, SaHpiEventCategoryT *type) { int i, found; if (!buffer || !type || buffer->Data == NULL || buffer->Data[0] == '\0') { return(SA_ERR_HPI_INVALID_PARAMS); } found = 0; for (i=0; iData, eventcategory_strings[i].str) == 0) { found++; break; } } if (found) { *type = eventcategory_strings[i].entity_type; } else { return(SA_ERR_HPI_INVALID_DATA); } return(SA_OK); } openhpi-2.14.1/utils/openhpiutils.pc.in0000644000076400007640000000045211302567131015005 0ustar prefix=@prefix@ exec_prefix=@prefix@ libdir=@libdir@ includedir=@includedir@ Name: OpenHPI Utilities Description: Utilities for the Implementation of SA Forum's Hardware Platform Interface Version: @VERSION@ Requires: glib-2.0 Libs: -L${libdir} -l@HPI_UTIL_PKG@ Cflags: -I${includedir}/@HPI_PKG@ openhpi-2.14.1/utils/el_utils.c0000644000076400007640000002675611302567131013334 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2003, 2004, 2006 * Copyright (c) 2003 by Intel Corp. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * David Ashley * Renier Morales */ #include #include #include #include #include #include #include #include #include /* allocate and initialize an EL */ oh_el *oh_el_create(SaHpiUint32T size) { oh_el *el; el = (oh_el *) g_malloc0(sizeof(oh_el)); if (el != NULL) { el->basetime = 0; el->sysbasetime = 0; el->nextid = SAHPI_OLDEST_ENTRY + 1; el->gentimestamp = SAHPI_TRUE; el->info.Entries = 0; el->info.Size = size; el->info.UserEventMaxSize = SAHPI_MAX_TEXT_BUFFER_LENGTH; el->info.UpdateTimestamp = SAHPI_TIME_UNSPECIFIED; el->info.CurrentTime = SAHPI_TIME_UNSPECIFIED; el->info.Enabled = SAHPI_TRUE; el->info.OverflowFlag = SAHPI_FALSE; el->info.OverflowResetable = SAHPI_TRUE; el->info.OverflowAction = SAHPI_EL_OVERFLOW_OVERWRITE; el->list = NULL; } return el; } /* close and free all memory associated with an EL */ SaErrorT oh_el_close(oh_el *el) { if (el == NULL) return SA_ERR_HPI_INVALID_PARAMS; oh_el_clear(el); g_free(el); return SA_OK; } /* append a new entry to the EL */ SaErrorT oh_el_append(oh_el *el, const SaHpiEventT *event, const SaHpiRdrT *rdr, const SaHpiRptEntryT *res) { oh_el_entry *entry; struct timeval tv; SaHpiTimeT cursystime; /* check for valid el params and state */ if (el == NULL || event == NULL) { return SA_ERR_HPI_INVALID_PARAMS; } else if (el->info.Enabled == FALSE && event->EventType != SAHPI_ET_USER) { return SA_ERR_HPI_INVALID_REQUEST; } /* alloc the new entry */ entry = (oh_el_entry *) g_malloc0(sizeof(oh_el_entry)); if (entry == NULL) { el->info.OverflowFlag = TRUE; return SA_ERR_HPI_OUT_OF_SPACE; } if (rdr) entry->rdr = *rdr; if (res) entry->res = *res; /* if necessary, wrap the el entries */ if (el->info.Size != OH_EL_MAX_SIZE && g_list_length(el->list) == el->info.Size) { g_free(el->list->data); el->list = g_list_delete_link(el->list, el->list); el->info.OverflowFlag = SAHPI_TRUE; } /* Set the event log entry id and timestamp */ entry->event.EntryId = el->nextid++; if (el->gentimestamp) { gettimeofday(&tv, NULL); cursystime = (SaHpiTimeT) tv.tv_sec * 1000000000 + tv.tv_usec * 1000; el->info.UpdateTimestamp = el->basetime + (cursystime - el->sysbasetime); } else { el->info.UpdateTimestamp = event->Timestamp; /* Setting time based on the event to have some sense of what * the current time is going to be when providing the el info. */ oh_el_timeset(el, event->Timestamp); } entry->event.Timestamp = el->info.UpdateTimestamp; /* append the new entry */ entry->event.Event = *event; el->list = g_list_append(el->list, entry); return SA_OK; } /* prepend a new entry to the EL */ SaErrorT oh_el_prepend(oh_el *el, const SaHpiEventT *event, const SaHpiRdrT *rdr, const SaHpiRptEntryT *res) { GList *node = NULL; oh_el_entry *entry; struct timeval tv; SaHpiTimeT cursystime; /* check for valid el params and state */ if (el == NULL || event == NULL) { return SA_ERR_HPI_INVALID_PARAMS; } else if (el->info.Enabled == FALSE && event->EventType != SAHPI_ET_USER) { return SA_ERR_HPI_INVALID_REQUEST; } /* see if el is full */ if (el->info.Size != OH_EL_MAX_SIZE && g_list_length(el->list) == el->info.Size) { return SA_ERR_HPI_OUT_OF_SPACE; } /* alloc the new entry */ entry = (oh_el_entry *) g_malloc0(sizeof(oh_el_entry)); if (entry == NULL) { el->info.OverflowFlag = TRUE; return SA_ERR_HPI_OUT_OF_SPACE; } if (rdr) entry->rdr = *rdr; if (res) entry->res = *res; /* since we are adding entries in reverse order we have to renumber * existing entries */ for (node = el->list; node; node = node->next) { oh_el_entry *tmpentry = (oh_el_entry *)node->data; tmpentry->event.EntryId++; } el->nextid++; /* prepare & prepend the new entry */ entry->event.EntryId = SAHPI_OLDEST_ENTRY + 1; if (el->gentimestamp) { gettimeofday(&tv, NULL); cursystime = (SaHpiTimeT) tv.tv_sec * 1000000000 + tv.tv_usec * 1000; el->info.UpdateTimestamp = el->basetime + (cursystime - el->sysbasetime); } else { el->info.UpdateTimestamp = event->Timestamp; /* Setting time based on the event to have some sense of what * the current time is going to be when providing the el info. */ oh_el_timeset(el, event->Timestamp); } entry->event.Timestamp = el->info.UpdateTimestamp; /* prepend the new entry to the list */ entry->event.Event = *event; el->list = g_list_prepend(el->list, entry); return SA_OK; } /* clear all EL entries */ SaErrorT oh_el_clear(oh_el *el) { GList *node; if (el == NULL) return SA_ERR_HPI_INVALID_PARAMS; /* free the data for every element in the list */ for (node = el->list; node; node = node->next) { g_free(node->data); } /* free the list nodes */ g_list_free(el->list); /* reset the control structure */ el->info.OverflowFlag = SAHPI_FALSE; el->info.UpdateTimestamp = SAHPI_TIME_UNSPECIFIED; el->info.Entries = 0; el->nextid = SAHPI_OLDEST_ENTRY + 1; // always start at 1 el->list = NULL; return SA_OK; } /* get an EL entry */ SaErrorT oh_el_get(oh_el *el, SaHpiEventLogEntryIdT entryid, SaHpiEventLogEntryIdT *prev, SaHpiEventLogEntryIdT *next, oh_el_entry **entry) { SaHpiEventLogEntryIdT eid; GList *node = NULL; oh_el_entry *elentry = NULL; if (!el || !prev || !next || !entry || entryid == SAHPI_NO_MORE_ENTRIES) { return SA_ERR_HPI_INVALID_PARAMS; } if (g_list_length(el->list) == 0) { return SA_ERR_HPI_NOT_PRESENT; } /* FIXME: There is a bug here because this does not take into account * the case when oh_el_prepend would have been used. In such case the * OLDEST entry would technically not be the first one in the list. * To be continued... * -- Renier Morales (08/30/06) */ if (entryid == SAHPI_OLDEST_ENTRY) { node = g_list_first(el->list); } else if (entryid == SAHPI_NEWEST_ENTRY) { node = g_list_last(el->list); } if (node) { elentry = (oh_el_entry *)node->data; eid = elentry->event.EntryId; } else { eid = entryid; } for (node = el->list; node; node = node->next) { elentry = (oh_el_entry *)node->data; if (eid == elentry->event.EntryId) { *entry = elentry; if (node->prev) { elentry = (oh_el_entry *)node->prev->data; *prev = elentry->event.EntryId; } else { *prev = SAHPI_NO_MORE_ENTRIES; } if (node->next) { elentry = (oh_el_entry *)node->next->data; *next = elentry->event.EntryId; } else { *next = SAHPI_NO_MORE_ENTRIES; } return SA_OK; } } return SA_ERR_HPI_NOT_PRESENT; } /* get EL info */ SaErrorT oh_el_info(oh_el *el, SaHpiEventLogInfoT *info) { struct timeval tv; SaHpiTimeT cursystime; if (el == NULL || info == NULL) { return SA_ERR_HPI_INVALID_PARAMS; } *info = el->info; info->Entries = g_list_length(el->list); gettimeofday(&tv, NULL); cursystime = (SaHpiTimeT) tv.tv_sec * 1000000000 + tv.tv_usec * 1000; info->CurrentTime = el->basetime + (cursystime - el->sysbasetime); return SA_OK; } /* reset EL overflowflag */ SaErrorT oh_el_overflowreset(oh_el *el) { if (el == NULL) return SA_ERR_HPI_INVALID_PARAMS; if (el->info.OverflowResetable) { el->info.OverflowFlag = SAHPI_FALSE; return SA_OK; } else { return SA_ERR_HPI_INVALID_CMD; } } SaErrorT oh_el_overflowset(oh_el *el, SaHpiBoolT flag) { if (!el) return SA_ERR_HPI_INVALID_PARAMS; el->info.OverflowFlag = flag; return SA_OK; } /* write a EL entry list to a file */ SaErrorT oh_el_map_to_file(oh_el *el, char *filename) { int file; GList *node = NULL; if (el == NULL || filename == NULL) { return SA_ERR_HPI_INVALID_PARAMS; } file = open(filename, O_WRONLY|O_CREAT|O_TRUNC, S_IRUSR|S_IWUSR|S_IRGRP); if (file < 0) { err("EL file '%s' could not be opened", filename); return SA_ERR_HPI_ERROR; } for (node = el->list; node; node = node->next) { if (write(file, (void *)node->data, sizeof(oh_el_entry)) != sizeof(oh_el_entry)) { err("Couldn't write to file '%s'.", filename); close(file); return SA_ERR_HPI_ERROR; } } if (close(file) != 0) { err("Couldn't close file '%s'.", filename); return SA_ERR_HPI_ERROR; } return SA_OK; } /* read a EL entry list from a file */ SaErrorT oh_el_map_from_file(oh_el *el, char *filename) { int file; oh_el_entry entry; /* check el params and state */ if (el == NULL || filename == NULL) { return SA_ERR_HPI_INVALID_PARAMS; } else if (el->info.Enabled == FALSE) { return SA_ERR_HPI_INVALID_REQUEST; } file = open(filename, O_RDONLY); if (file < 0) { err("EL file '%s' could not be opened", filename); return SA_ERR_HPI_ERROR; } oh_el_clear(el); // ensure list is empty while (read(file, &entry, sizeof(oh_el_entry)) == sizeof(oh_el_entry)) { oh_el_entry *elentry = (oh_el_entry *)g_malloc0(sizeof(oh_el_entry)); el->nextid = entry.event.EntryId; el->nextid++; *elentry = entry; el->list = g_list_append(el->list, elentry); } if (close(file) != 0) { err("Couldn't close file '%s'.", filename); return SA_ERR_HPI_ERROR; } return SA_OK; } /* set the EL timestamp offset */ SaErrorT oh_el_timeset(oh_el *el, SaHpiTimeT timestamp) { struct timeval tv; if (el == NULL || timestamp == SAHPI_TIME_UNSPECIFIED) { return SA_ERR_HPI_INVALID_PARAMS; } gettimeofday(&tv, NULL); el->sysbasetime = (SaHpiTimeT) tv.tv_sec * 1000000000 + tv.tv_usec * 1000; el->basetime = timestamp; return SA_OK; } /* set the timestamp generate flag */ SaErrorT oh_el_setgentimestampflag(oh_el *el, SaHpiBoolT flag) { if (el == NULL) { return SA_ERR_HPI_INVALID_PARAMS; } el->gentimestamp = flag; return SA_OK; } SaErrorT oh_el_enableset(oh_el *el, SaHpiBoolT flag) { if (!el) return SA_ERR_HPI_INVALID_PARAMS; el->info.Enabled = flag; return SA_OK; } openhpi-2.14.1/utils/uid_utils.h0000644000076400007640000000224311302567131013503 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2003, 2004 * Copyright (c) 2003 by Intel Corp. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * David Judkovics * Renier Morales */ #ifndef __UID_UTILS_H #define __UID_UTILS_H #ifndef __OH_UTILS_H #warning *** Include oh_utils.h instead of individual utility header files *** #endif #include #ifdef __cplusplus extern "C" { #endif /* Unique Resource ID utility functions */ SaErrorT oh_uid_initialize(void); SaHpiBoolT oh_uid_is_initialized(void); SaHpiUint32T oh_uid_from_entity_path(SaHpiEntityPathT *ep); SaErrorT oh_uid_remove(SaHpiUint32T uid); SaHpiUint32T oh_uid_lookup(SaHpiEntityPathT *ep); SaErrorT oh_entity_path_lookup(SaHpiUint32T id, SaHpiEntityPathT *ep); SaErrorT oh_uid_map_to_file(void); #ifdef __cplusplus } #endif #endif openhpi-2.14.1/utils/sahpi_event_encode.h0000644000076400007640000000266611302567131015335 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * Steve Sherman */ /******************************************************************* * WARNING! This file is auto-magically generated by: * ./SaHpi2code.pl. * Do not change this file manually. Update script instead *******************************************************************/ #ifndef __SAHPI_EVENT_ENCODE_H #define __SAHPI_EVENT_ENCODE_H #ifndef __OH_UTILS_H #warning *** Include oh_utils.h instead of individual utility header files *** #endif #ifdef __cplusplus extern "C" { #endif #define OH_ENCODE_DELIMITER " | " #define OH_ENCODE_DELIMITER_CHAR "|" #define OH_ENCODE_DELIMITER_LENGTH 3 typedef struct { SaHpiEventCategoryT category; SaHpiEventStateT state; char *str; } oh_categorystate_map; #define OH_MAX_STATE_GLOBAL_STRINGS 1 extern oh_categorystate_map state_global_strings[OH_MAX_STATE_GLOBAL_STRINGS]; #define OH_MAX_STATE_STRINGS 77 extern oh_categorystate_map state_strings[OH_MAX_STATE_STRINGS]; #ifdef __cplusplus } #endif #endif openhpi-2.14.1/utils/epath_utils.h0000644000076400007640000000521011302567131014020 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2003, 2006 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * Steve Sherman * Renier Morales */ #ifndef __EPATH_UTILS_H #define __EPATH_UTILS_H #ifndef __OH_UTILS_H #warning *** Include oh_utils.h instead of individual utility header files *** #endif #include #include /* Character for blanking out normalized strings based on entity path */ #define OH_DERIVE_BLANK_CHAR 'x' #define OH_DERIVE_BLANK_STR "x" /* Max number of digits an enitity instance has */ #define OH_MAX_LOCATION_DIGITS 6 /* Definitions for describing entity path patterns */ #define OH_MAX_EP_TUPLES SAHPI_MAX_ENTITY_PATH+1 typedef struct { SaHpiBoolT is_dot; SaHpiEntityTypeT type; } oh_entity_type_pattern; typedef struct { SaHpiBoolT is_dot; SaHpiEntityLocationT location; } oh_entity_location_pattern; typedef struct { SaHpiBoolT is_splat; oh_entity_type_pattern etp; oh_entity_location_pattern elp; } oh_entity_pattern; typedef struct { oh_entity_pattern epattern[OH_MAX_EP_TUPLES]; } oh_entitypath_pattern; #ifdef __cplusplus extern "C" { #endif SaHpiBoolT oh_cmp_ep(const SaHpiEntityPathT *ep1, const SaHpiEntityPathT *ep2); SaErrorT oh_concat_ep(SaHpiEntityPathT *dest, const SaHpiEntityPathT *append); SaErrorT oh_decode_entitypath(const SaHpiEntityPathT *ep, oh_big_textbuffer *bigbuf); SaErrorT oh_encode_entitypath(const gchar *epstr, SaHpiEntityPathT *ep); SaErrorT oh_init_ep(SaHpiEntityPathT *ep); #define oh_print_ep(ep_ptr, offsets) oh_fprint_ep(stdout, ep_ptr, offsets) SaErrorT oh_fprint_ep(FILE *stream, const SaHpiEntityPathT *ep, int offsets); SaErrorT oh_set_ep_location(SaHpiEntityPathT *ep, SaHpiEntityTypeT et, SaHpiEntityLocationT ei); SaHpiBoolT oh_valid_ep(const SaHpiEntityPathT *ep); gchar * oh_derive_string(SaHpiEntityPathT *ep, SaHpiEntityLocationT offset, int base, const gchar *str); SaErrorT oh_compile_entitypath_pattern(const char *epp_str, oh_entitypath_pattern *epp); SaHpiBoolT oh_match_entitypath_pattern(oh_entitypath_pattern *epp, SaHpiEntityPathT *ep); #ifdef __cplusplus } #endif #endif openhpi-2.14.1/utils/sahpi_time_utils.h0000644000076400007640000000150511302567131015044 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * Steve Sherman */ #ifndef __SAHPI_TIME_UTILS_H #define __SAHPI_TIME_UTILS_H #ifndef __OH_UTILS_H #warning *** Include oh_utils.h instead of individual utility header files *** #endif #ifdef __cplusplus extern "C" { #endif SaErrorT oh_decode_time(SaHpiTimeT time, SaHpiTextBufferT *buffer); SaErrorT oh_gettimeofday(SaHpiTimeT *time); #ifdef __cplusplus } #endif #endif openhpi-2.14.1/utils/sahpi_event_encode.c0000644000076400007640000001276611302567131015332 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * Steve Sherman */ /******************************************************************* * WARNING! This file is auto-magically generated by: * ./SaHpi2code.pl. * Do not change this file manually. Update script instead *******************************************************************/ #include #include oh_categorystate_map state_global_strings[] = { {SAHPI_EC_UNSPECIFIED, SAHPI_ES_UNSPECIFIED, "UNSPECIFIED"}, }; oh_categorystate_map state_strings[] = { {SAHPI_EC_LIMIT, SAHPI_ES_LIMIT_NOT_EXCEEDED, "LIMIT_NOT_EXCEEDED"}, {SAHPI_EC_LIMIT, SAHPI_ES_LIMIT_EXCEEDED, "LIMIT_EXCEEDED"}, {SAHPI_EC_SENSOR_SPECIFIC, SAHPI_ES_STATE_00, "STATE_00"}, {SAHPI_EC_SENSOR_SPECIFIC, SAHPI_ES_STATE_01, "STATE_01"}, {SAHPI_EC_SENSOR_SPECIFIC, SAHPI_ES_STATE_02, "STATE_02"}, {SAHPI_EC_SENSOR_SPECIFIC, SAHPI_ES_STATE_03, "STATE_03"}, {SAHPI_EC_SENSOR_SPECIFIC, SAHPI_ES_STATE_04, "STATE_04"}, {SAHPI_EC_SENSOR_SPECIFIC, SAHPI_ES_STATE_05, "STATE_05"}, {SAHPI_EC_SENSOR_SPECIFIC, SAHPI_ES_STATE_06, "STATE_06"}, {SAHPI_EC_SENSOR_SPECIFIC, SAHPI_ES_STATE_07, "STATE_07"}, {SAHPI_EC_SENSOR_SPECIFIC, SAHPI_ES_STATE_08, "STATE_08"}, {SAHPI_EC_SENSOR_SPECIFIC, SAHPI_ES_STATE_09, "STATE_09"}, {SAHPI_EC_SENSOR_SPECIFIC, SAHPI_ES_STATE_10, "STATE_10"}, {SAHPI_EC_SENSOR_SPECIFIC, SAHPI_ES_STATE_11, "STATE_11"}, {SAHPI_EC_SENSOR_SPECIFIC, SAHPI_ES_STATE_12, "STATE_12"}, {SAHPI_EC_SENSOR_SPECIFIC, SAHPI_ES_STATE_13, "STATE_13"}, {SAHPI_EC_SENSOR_SPECIFIC, SAHPI_ES_STATE_14, "STATE_14"}, {SAHPI_EC_USAGE, SAHPI_ES_IDLE, "IDLE"}, {SAHPI_EC_USAGE, SAHPI_ES_ACTIVE, "ACTIVE"}, {SAHPI_EC_USAGE, SAHPI_ES_BUSY, "BUSY"}, {SAHPI_EC_PRED_FAIL, SAHPI_ES_PRED_FAILURE_DEASSERT, "PRED_FAILURE_DEASSERT"}, {SAHPI_EC_PRED_FAIL, SAHPI_ES_PRED_FAILURE_ASSERT, "PRED_FAILURE_ASSERT"}, {SAHPI_EC_THRESHOLD, SAHPI_ES_LOWER_MINOR, "LOWER_MINOR"}, {SAHPI_EC_THRESHOLD, SAHPI_ES_LOWER_MAJOR, "LOWER_MAJOR"}, {SAHPI_EC_THRESHOLD, SAHPI_ES_LOWER_CRIT, "LOWER_CRIT"}, {SAHPI_EC_THRESHOLD, SAHPI_ES_UPPER_MINOR, "UPPER_MINOR"}, {SAHPI_EC_THRESHOLD, SAHPI_ES_UPPER_MAJOR, "UPPER_MAJOR"}, {SAHPI_EC_THRESHOLD, SAHPI_ES_UPPER_CRIT, "UPPER_CRIT"}, {SAHPI_EC_ENABLE, SAHPI_ES_DISABLED, "DISABLED"}, {SAHPI_EC_ENABLE, SAHPI_ES_ENABLED, "ENABLED"}, {SAHPI_EC_PRESENCE, SAHPI_ES_ABSENT, "ABSENT"}, {SAHPI_EC_PRESENCE, SAHPI_ES_PRESENT, "PRESENT"}, {SAHPI_EC_SEVERITY, SAHPI_ES_OK, "OK"}, {SAHPI_EC_SEVERITY, SAHPI_ES_MINOR_FROM_OK, "MINOR_FROM_OK"}, {SAHPI_EC_SEVERITY, SAHPI_ES_MAJOR_FROM_LESS, "MAJOR_FROM_LESS"}, {SAHPI_EC_SEVERITY, SAHPI_ES_CRITICAL_FROM_LESS, "CRITICAL_FROM_LESS"}, {SAHPI_EC_SEVERITY, SAHPI_ES_MINOR_FROM_MORE, "MINOR_FROM_MORE"}, {SAHPI_EC_SEVERITY, SAHPI_ES_MAJOR_FROM_CRITICAL, "MAJOR_FROM_CRITICAL"}, {SAHPI_EC_SEVERITY, SAHPI_ES_CRITICAL, "CRITICAL"}, {SAHPI_EC_SEVERITY, SAHPI_ES_MONITOR, "MONITOR"}, {SAHPI_EC_SEVERITY, SAHPI_ES_INFORMATIONAL, "INFORMATIONAL"}, {SAHPI_EC_PERFORMANCE, SAHPI_ES_PERFORMANCE_MET, "PERFORMANCE_MET"}, {SAHPI_EC_PERFORMANCE, SAHPI_ES_PERFORMANCE_LAGS, "PERFORMANCE_LAGS"}, {SAHPI_EC_STATE, SAHPI_ES_STATE_DEASSERTED, "STATE_DEASSERTED"}, {SAHPI_EC_STATE, SAHPI_ES_STATE_ASSERTED, "STATE_ASSERTED"}, {SAHPI_EC_AVAILABILITY, SAHPI_ES_RUNNING, "RUNNING"}, {SAHPI_EC_AVAILABILITY, SAHPI_ES_TEST, "TEST"}, {SAHPI_EC_AVAILABILITY, SAHPI_ES_POWER_OFF, "POWER_OFF"}, {SAHPI_EC_AVAILABILITY, SAHPI_ES_ON_LINE, "ON_LINE"}, {SAHPI_EC_AVAILABILITY, SAHPI_ES_OFF_LINE, "OFF_LINE"}, {SAHPI_EC_AVAILABILITY, SAHPI_ES_OFF_DUTY, "OFF_DUTY"}, {SAHPI_EC_AVAILABILITY, SAHPI_ES_DEGRADED, "DEGRADED"}, {SAHPI_EC_AVAILABILITY, SAHPI_ES_POWER_SAVE, "POWER_SAVE"}, {SAHPI_EC_AVAILABILITY, SAHPI_ES_INSTALL_ERROR, "INSTALL_ERROR"}, {SAHPI_EC_REDUNDANCY, SAHPI_ES_FULLY_REDUNDANT, "FULLY_REDUNDANT"}, {SAHPI_EC_REDUNDANCY, SAHPI_ES_REDUNDANCY_LOST, "REDUNDANCY_LOST"}, {SAHPI_EC_REDUNDANCY, SAHPI_ES_REDUNDANCY_DEGRADED, "REDUNDANCY_DEGRADED"}, {SAHPI_EC_REDUNDANCY, SAHPI_ES_REDUNDANCY_LOST_SUFFICIENT_RESOURCES, "REDUNDANCY_LOST_SUFFICIENT_RESOURCES"}, {SAHPI_EC_REDUNDANCY, SAHPI_ES_NON_REDUNDANT_SUFFICIENT_RESOURCES, "NON_REDUNDANT_SUFFICIENT_RESOURCES"}, {SAHPI_EC_REDUNDANCY, SAHPI_ES_NON_REDUNDANT_INSUFFICIENT_RESOURCES, "NON_REDUNDANT_INSUFFICIENT_RESOURCES"}, {SAHPI_EC_REDUNDANCY, SAHPI_ES_REDUNDANCY_DEGRADED_FROM_FULL, "REDUNDANCY_DEGRADED_FROM_FULL"}, {SAHPI_EC_REDUNDANCY, SAHPI_ES_REDUNDANCY_DEGRADED_FROM_NON, "REDUNDANCY_DEGRADED_FROM_NON"}, {SAHPI_EC_GENERIC, SAHPI_ES_STATE_00, "STATE_00"}, {SAHPI_EC_GENERIC, SAHPI_ES_STATE_01, "STATE_01"}, {SAHPI_EC_GENERIC, SAHPI_ES_STATE_02, "STATE_02"}, {SAHPI_EC_GENERIC, SAHPI_ES_STATE_03, "STATE_03"}, {SAHPI_EC_GENERIC, SAHPI_ES_STATE_04, "STATE_04"}, {SAHPI_EC_GENERIC, SAHPI_ES_STATE_05, "STATE_05"}, {SAHPI_EC_GENERIC, SAHPI_ES_STATE_06, "STATE_06"}, {SAHPI_EC_GENERIC, SAHPI_ES_STATE_07, "STATE_07"}, {SAHPI_EC_GENERIC, SAHPI_ES_STATE_08, "STATE_08"}, {SAHPI_EC_GENERIC, SAHPI_ES_STATE_09, "STATE_09"}, {SAHPI_EC_GENERIC, SAHPI_ES_STATE_10, "STATE_10"}, {SAHPI_EC_GENERIC, SAHPI_ES_STATE_11, "STATE_11"}, {SAHPI_EC_GENERIC, SAHPI_ES_STATE_12, "STATE_12"}, {SAHPI_EC_GENERIC, SAHPI_ES_STATE_13, "STATE_13"}, {SAHPI_EC_GENERIC, SAHPI_ES_STATE_14, "STATE_14"}, }; openhpi-2.14.1/utils/el_utils.h0000644000076400007640000000530211302567131013321 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004,2006 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * David Ashley * Renier Morales */ #ifndef __EL_UTILS_H #define __EL_UTILS_H #ifndef __OH_UTILS_H #warning *** Include oh_utils.h instead of individual utility header files *** #endif #include #include #ifdef __cplusplus extern "C" { #endif #define OH_EL_MAX_SIZE 0 /* this struct encapsulates all the data for a system event log */ /* the log records themselves are stored in the el GList */ typedef struct { SaHpiTimeT basetime; // Time clock reference for this event log SaHpiTimeT sysbasetime; // The system time when the basetime was set SaHpiEventLogEntryIdT nextid; // id for next log entry SaHpiBoolT gentimestamp; // generate timestamp for entries. SaHpiEventLogInfoT info; /* Contains enabled state, overflow flag, timestamp of last update, and the max size for this log. */ GList *list; // list of event log entries for prev and next lookups } oh_el; /* this structure encapsulates the actual log entry and its context */ typedef struct { SaHpiEventLogEntryT event; SaHpiRdrT rdr; // All 0's means no associated rdr SaHpiRptEntryT res; // All 0's means no associated rpt } oh_el_entry; /* General EL utility calls */ oh_el *oh_el_create(SaHpiUint32T size); SaErrorT oh_el_close(oh_el *el); SaErrorT oh_el_append(oh_el *el, const SaHpiEventT *event, const SaHpiRdrT *rdr, const SaHpiRptEntryT *res); SaErrorT oh_el_prepend(oh_el *el, const SaHpiEventT *event, const SaHpiRdrT *rdr, const SaHpiRptEntryT *res); SaErrorT oh_el_clear(oh_el *el); SaErrorT oh_el_get(oh_el *el, SaHpiEventLogEntryIdT entryid, SaHpiEventLogEntryIdT *prev, SaHpiEventLogEntryIdT *next, oh_el_entry **entry); SaErrorT oh_el_info(oh_el *el, SaHpiEventLogInfoT *info); SaErrorT oh_el_overflowreset(oh_el *el); SaErrorT oh_el_overflowset(oh_el *el, SaHpiBoolT flag); SaErrorT oh_el_map_to_file(oh_el *el, char *filename); SaErrorT oh_el_map_from_file(oh_el *el, char *filename); SaErrorT oh_el_timeset(oh_el *el, SaHpiTimeT timestamp); SaErrorT oh_el_setgentimestampflag(oh_el *el, SaHpiBoolT flag); SaErrorT oh_el_enableset(oh_el *el, SaHpiBoolT flag); #ifdef __cplusplus } #endif #endif openhpi-2.14.1/utils/announcement_utils.h0000644000076400007640000000416411302567131015420 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * David Ashley * Renier Morales */ #ifndef __ANNOUNCEMENT_UTILS_H #define __ANNOUNCEMENT_UTILS_H #ifndef __OH_UTILS_H #warning *** Include oh_utils.h instead of individual utility header files *** #endif #include #include #ifdef __cplusplus extern "C" { #endif #define OH_ANNOUNCEMENT_MAX_SIZE 0 /* this struct encapsulates all the data for annunciator announcements */ /* the log records themselves are stored in the el GList */ typedef struct { SaHpiEventLogEntryIdT nextId; // next generated Id i.e. number of entries GList *annentries; // list of oh_ann_entry structs } oh_announcement; /* this structure encapsulates the actual log entry and its context */ typedef struct { SaHpiAnnouncementT annentry; SaHpiAnnunciatorNumT num; // associated annunciator } oh_ann_entry; /* General EL utility calls */ oh_announcement *oh_announcement_create(void); SaErrorT oh_announcement_close(oh_announcement *ann); SaErrorT oh_announcement_append(oh_announcement *ann, SaHpiAnnouncementT *myann); SaErrorT oh_announcement_clear(oh_announcement *ann); SaErrorT oh_announcement_get(oh_announcement *ann, SaHpiEntryIdT srchid, SaHpiAnnouncementT *myann); SaErrorT oh_announcement_get_next(oh_announcement *ann, SaHpiSeverityT sev, SaHpiBoolT ack, SaHpiAnnouncementT *entry); SaErrorT oh_announcement_ack(oh_announcement *ann, SaHpiEntryIdT entry, SaHpiSeverityT sev); SaErrorT oh_announcement_del(oh_announcement *ann, SaHpiEntryIdT entry, SaHpiSeverityT sev); #ifdef __cplusplus } #endif #endif openhpi-2.14.1/utils/sahpi_time_utils.c0000644000076400007640000000606511302567131015045 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * Steve Sherman */ #include #include #include #include #include #include #include #include /** * oh_decode_time: * @time: SaHpiTimeT time to be converted. * @buffer: Location to store the converted string. * * Converts an SaHpiTimeT time value to the preferred date/time string * representation defined for the current locale. * String is stored in an SaHpiTextBufferT data structure. * * Returns: * SA_OK - normal operation. * SA_ERR_HPI_INVALID_PARAMS - @buffer is NULL. * SA_ERR_HPI_INTERNAL_ERROR - @buffer not big enough to accomodate * date/time representation string. **/ SaErrorT oh_decode_time(SaHpiTimeT time, SaHpiTextBufferT *buffer) { int count; struct tm t; time_t tt; SaErrorT err; SaHpiTextBufferT working; if (!buffer) { return(SA_ERR_HPI_INVALID_PARAMS); } err = oh_init_textbuffer(&working); if (err != SA_OK) { return(err); } if (time > SAHPI_TIME_MAX_RELATIVE) { /*absolute time*/ tt = time / 1000000000; count = strftime((char *)working.Data, SAHPI_MAX_TEXT_BUFFER_LENGTH, "%F %T", localtime(&tt)); } else if (time == SAHPI_TIME_UNSPECIFIED) { strcpy((char *)working.Data,"SAHPI_TIME_UNSPECIFIED "); count = sizeof("SAHPI_TIME_UNSPECIFIED "); } else if (time > SAHPI_TIME_UNSPECIFIED) { /*invalid time*/ strcpy((char *)working.Data,"Invalid time "); count = sizeof("Invalid time "); } else { /*relative time*/ tt = time / 1000000000; localtime_r(&tt, &t); /* count = strftime(str, size, "%b %d, %Y - %H:%M:%S", &t); */ count = strftime((char *)working.Data, SAHPI_MAX_TEXT_BUFFER_LENGTH, "%c", &t); } if (count == 0) { return(SA_ERR_HPI_INTERNAL_ERROR); } else working.DataLength = count; err = oh_copy_textbuffer(buffer, &working); if (err != SA_OK) { return(err); } return(SA_OK); } /** * oh_gettimeofday: * @time: Location to store Time of Day value * * Find the time of day and converts it into an HPI time. * * Returns: * SA_OK - normal operation. * SA_ERR_HPI_INVALID_PARAMS - @time is NULL. **/ SaErrorT oh_gettimeofday(SaHpiTimeT *time) { int err; struct timeval now; if (!time) { return(SA_ERR_HPI_INVALID_PARAMS); } err = gettimeofday(&now, NULL); if (err) { err("gettimeofday failed"); return(SA_ERR_HPI_INTERNAL_ERROR); } *time = (SaHpiTimeT)now.tv_sec * 1000000000 + now.tv_usec * 1000; return(SA_OK); } openhpi-2.14.1/utils/sahpiatca_enum_utils.h0000644000076400007640000000454411302567131015711 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * Steve Sherman */ /******************************************************************* * WARNING! This file is auto-magically generated by: * ./SaHpi2code.pl. * Do not change this file manually. Update script instead *******************************************************************/ #ifndef __SAHPIATCA_ENUM_UTILS_H #define __SAHPIATCA_ENUM_UTILS_H #ifndef __OH_UTILS_H #warning *** Include oh_utils.h instead of individual utility header files *** #endif #ifdef __cplusplus extern "C" { #endif #define OH_MAX_ATCAHPILEDCOLOR 9 extern struct oh_atcahpiledcolor_map { AtcaHpiLedColorT entity_type; char *str; } atcahpiledcolor_strings[OH_MAX_ATCAHPILEDCOLOR]; char * oh_lookup_atcahpiledcolor(AtcaHpiLedColorT value); SaErrorT oh_encode_atcahpiledcolor(SaHpiTextBufferT *buffer, AtcaHpiLedColorT *type); #define OH_MAX_ATCAHPIRESOURCELEDMODE 3 extern struct oh_atcahpiresourceledmode_map { AtcaHpiResourceLedModeT entity_type; char *str; } atcahpiresourceledmode_strings[OH_MAX_ATCAHPIRESOURCELEDMODE]; char * oh_lookup_atcahpiresourceledmode(AtcaHpiResourceLedModeT value); SaErrorT oh_encode_atcahpiresourceledmode(SaHpiTextBufferT *buffer, AtcaHpiResourceLedModeT *type); #define OH_MAX_ATCAHPILEDBRSUPPORT 3 extern struct oh_atcahpiledbrsupport_map { AtcaHpiLedBrSupportT entity_type; char *str; } atcahpiledbrsupport_strings[OH_MAX_ATCAHPILEDBRSUPPORT]; char * oh_lookup_atcahpiledbrsupport(AtcaHpiLedBrSupportT value); SaErrorT oh_encode_atcahpiledbrsupport(SaHpiTextBufferT *buffer, AtcaHpiLedBrSupportT *type); #define OH_MAX_ATCAHPIENTITYTYPE 13 extern struct oh_atcahpientitytype_map { AtcaHpiEntityTypeT entity_type; char *str; } atcahpientitytype_strings[OH_MAX_ATCAHPIENTITYTYPE]; char * oh_lookup_atcahpientitytype(AtcaHpiEntityTypeT value); SaErrorT oh_encode_atcahpientitytype(SaHpiTextBufferT *buffer, AtcaHpiEntityTypeT *type); #ifdef __cplusplus } #endif #endif openhpi-2.14.1/utils/sahpi_struct_utils.h0000644000076400007640000001675311302567131015445 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004,2006 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * Steve Sherman * Renier Morales */ #ifndef __SAHPI_STRUCT_UTILS_H #define __SAHPI_STRUCT_UTILS_H #ifndef __OH_UTILS_H #warning *** Include oh_utils.h instead of individual utility header files *** #endif #include #ifdef __cplusplus extern "C" { #endif /*********************** * Text buffer utilities ***********************/ SaErrorT oh_init_textbuffer(SaHpiTextBufferT *buffer); SaErrorT oh_append_textbuffer(SaHpiTextBufferT *buffer, const char *from); SaErrorT oh_copy_textbuffer(SaHpiTextBufferT *dest, const SaHpiTextBufferT *from); /* Print just the Data portions of the text structures */ #define oh_print_text(buf_ptr) oh_fprint_text(stdout, buf_ptr) SaErrorT oh_fprint_text(FILE *stream, const SaHpiTextBufferT *buffer); /* Same as SaHpiTextBufferT, only more Data */ #define OH_MAX_TEXT_BUFFER_LENGTH 2048 typedef struct { SaHpiTextTypeT DataType; SaHpiLanguageT Language; SaHpiUint16T DataLength; SaHpiUint8T Data[OH_MAX_TEXT_BUFFER_LENGTH]; } oh_big_textbuffer; SaErrorT oh_init_bigtext(oh_big_textbuffer *big_buffer); SaErrorT oh_append_bigtext(oh_big_textbuffer *big_buffer, const char *from); SaErrorT oh_copy_bigtext(oh_big_textbuffer *dest, const oh_big_textbuffer *from); /* Print just the Data portions of the text structures */ #define oh_print_bigtext(bigbuf_ptr) oh_fprint_bigtext(stdout, bigbuf_ptr) SaErrorT oh_fprint_bigtext(FILE *stream, const oh_big_textbuffer *big_buffer); /************************************ * HPI structure to string conversion ************************************/ SaErrorT oh_decode_manufacturerid(SaHpiManufacturerIdT value, SaHpiTextBufferT *buffer); SaErrorT oh_decode_sensorreading(SaHpiSensorReadingT reading, SaHpiSensorDataFormatT format, SaHpiTextBufferT *buffer); SaErrorT oh_encode_sensorreading(SaHpiTextBufferT *buffer, SaHpiSensorReadingTypeT type, SaHpiSensorReadingT *reading); SaErrorT oh_decode_capabilities(SaHpiCapabilitiesT ResourceCapabilities, SaHpiTextBufferT *buffer); SaErrorT oh_decode_hscapabilities(SaHpiHsCapabilitiesT HsCapabilities, SaHpiTextBufferT *buffer); SaErrorT oh_decode_sensoroptionaldata(SaHpiSensorOptionalDataT sensor_opt_data, SaHpiTextBufferT *buffer); SaErrorT oh_decode_sensorenableoptdata(SaHpiSensorEnableOptDataT sensor_enable_opt_data, SaHpiTextBufferT *buffer); SaErrorT oh_decode_dimitestcapabilities(SaHpiDimiTestCapabilityT capabilities, SaHpiTextBufferT *buffer); SaErrorT oh_decode_fumiprotocols(SaHpiFumiProtocolT protocols, SaHpiTextBufferT *buffer); SaErrorT oh_decode_fumicapabilities(SaHpiFumiCapabilityT capabilities, SaHpiTextBufferT *buffer); /************************* * Validate HPI structures *************************/ SaHpiBoolT oh_valid_textbuffer(SaHpiTextBufferT *buffer); SaErrorT oh_valid_thresholds(SaHpiSensorThresholdsT *thds, SaHpiRdrT *rdr); SaErrorT oh_valid_ctrl_state_mode(SaHpiCtrlRecT *ctrl_rdr, SaHpiCtrlModeT mode, SaHpiCtrlStateT *state); /************************ * Compare HPI structures ************************/ int oh_compare_sensorreading(SaHpiSensorReadingTypeT type, SaHpiSensorReadingT *reading1, SaHpiSensorReadingT *reading2); /*************************** * Print HPI data structures ***************************/ #define OH_PRINT_OFFSET " " /* Offset string */ SaErrorT oh_append_offset(oh_big_textbuffer *buffer, int offsets); #define oh_print_event(event_ptr, ep, offsets) oh_fprint_event(stdout, event_ptr, ep, offsets) SaErrorT oh_fprint_event(FILE *stream, const SaHpiEventT *event, const SaHpiEntityPathT *entitypath, int offsets); #define oh_print_idrfield(thisfield, offsets) oh_fprint_idrfield(stdout, thisfield, offsets) SaErrorT oh_fprint_idrfield(FILE *stream, const SaHpiIdrFieldT *thisfield, int offsets); #define oh_print_idrinfo(idrInfo, offsets) oh_fprint_idrinfo(stdout, idrInfo, offsets) SaErrorT oh_fprint_idrinfo(FILE *stream, const SaHpiIdrInfoT *idrInfo, int offsets); #define oh_print_idrareaheader(areaHeader, offsets) oh_fprint_idrareaheader(stdout, areaHeader, offsets) SaErrorT oh_fprint_idrareaheader(FILE *stream, const SaHpiIdrAreaHeaderT *areaHeader, int offsets); #define oh_print_rptentry(rptEntry, offsets) oh_fprint_rptentry(stdout, rptEntry, offsets) SaErrorT oh_fprint_rptentry(FILE *stream, const SaHpiRptEntryT *rptEntry, int offsets); #define oh_print_sensorrec(sensor_ptr, offsets) oh_fprint_sensorrec(stdout, sensor_ptr, offsets) SaErrorT oh_fprint_sensorrec(FILE *stream, const SaHpiSensorRecT *sensor, int offsets); #define oh_print_rdr(rdr, offsets) oh_fprint_rdr(stdout, rdr, offsets) SaErrorT oh_fprint_rdr(FILE *stream, const SaHpiRdrT *rdrEntry, int offsets); #define oh_print_textbuffer(buf_ptr, offsets) oh_fprint_textbuffer(stdout, buf_ptr, offsets) SaErrorT oh_fprint_textbuffer(FILE *stream, const SaHpiTextBufferT *textbuffer, int offsets); #define oh_print_ctrlrec(ctrl_ptr, offsets) oh_fprint_ctrlrec(stdout, ctrl_ptr, offsets) SaErrorT oh_fprint_ctrlrec(FILE *stream, const SaHpiCtrlRecT *control, int offsets); #define oh_print_watchdogrec(watchdog_ptr, offsets) oh_fprint_watchdogrec(stdout, watchdog_ptr, offsets) SaErrorT oh_fprint_watchdogrec(FILE *stream, const SaHpiWatchdogRecT *watchdog, int offsets); #define oh_print_eventloginfo(elinfo_ptr, offsets) oh_fprint_eventloginfo(stdout, elinfo_ptr, offsets) SaErrorT oh_fprint_eventloginfo(FILE *stream, const SaHpiEventLogInfoT *thiselinfo, int offsets); #define oh_print_eventlogentry(eventlog_ptr, ep, offsets) oh_fprint_eventlogentry(stdout, eventlog_ptr, ep, offsets) SaErrorT oh_fprint_eventlogentry(FILE *stream, const SaHpiEventLogEntryT *thiseventlog, const SaHpiEntityPathT *entitypath, int offsets); #define oh_print_ctrlstate(ctrlstate_ptr, offsets) oh_fprint_ctrlstate(stdout, ctrlstate_ptr, offsets) SaErrorT oh_fprint_ctrlstate(FILE *stream, const SaHpiCtrlStateT *thisctrlstate, int offsets); #define oh_print_thresholds(thresholds, format, offsets) oh_fprint_thresholds(stdout, thresholds, format, offsets) SaErrorT oh_fprint_thresholds(FILE *stream, const SaHpiSensorThresholdsT *thresholds, const SaHpiSensorDataFormatT *format, int offsets); SaErrorT oh_build_event(oh_big_textbuffer *buffer, const SaHpiEventT *event, const SaHpiEntityPathT *entitypath, int offsets); SaErrorT oh_build_threshold_mask(oh_big_textbuffer *buffer, const SaHpiSensorThdMaskT tmask, int offsets); #ifdef __cplusplus } #endif #endif openhpi-2.14.1/utils/sahpi_event_utils.h0000644000076400007640000000224411302567131015230 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * Steve Sherman */ #ifndef SAHPI_EVENT_UTILS_H #define SAHPI_EVENT_UTILS_H #ifndef __OH_UTILS_H #warning *** Include oh_utils.h instead of individual utility header files *** #endif #ifdef __cplusplus extern "C" { #endif SaErrorT oh_decode_eventstate(SaHpiEventStateT event_state, SaHpiEventCategoryT event_cat, SaHpiTextBufferT *buffer); SaErrorT oh_encode_eventstate(SaHpiTextBufferT *buffer, SaHpiEventStateT *event_state, SaHpiEventCategoryT *event_cat); SaHpiBoolT oh_valid_eventstate(SaHpiEventStateT event_state, SaHpiEventCategoryT event_cat, SaHpiBoolT check_mutal_exclusion); SaErrorT oh_valid_addevent(SaHpiEventT *event); #ifdef __cplusplus } #endif #endif openhpi-2.14.1/utils/announcement_utils.c0000644000076400007640000002332111302567131015407 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2003-2006 * Copyright (c) 2003 by Intel Corp. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * David Ashley * Renier Morales */ #include #include #include #include #include #include #include #include #include #include /* allocate and initialize an announcement list */ oh_announcement *oh_announcement_create(void) { oh_announcement *ann; ann = (oh_announcement *)g_malloc0(sizeof(oh_announcement)); if (ann != NULL) { ann->nextId = SAHPI_OLDEST_ENTRY + 1; // always start at 1 ann->annentries = NULL; } return ann; } /* close and free all memory associated with an announcement list */ SaErrorT oh_announcement_close(oh_announcement *ann) { if (ann == NULL) { return SA_ERR_HPI_INVALID_PARAMS; } oh_announcement_clear(ann); g_free(ann); return SA_OK; } /* append a new entry to the announcement list */ SaErrorT oh_announcement_append(oh_announcement *ann, SaHpiAnnouncementT *myann) { oh_ann_entry *entry; time_t tt1; /* check for valid el params and state */ if (ann == NULL || myann == NULL) { return SA_ERR_HPI_INVALID_PARAMS; } /* alloc and copy the new entry */ entry = (oh_ann_entry *) g_malloc0(sizeof(oh_ann_entry)); if (entry == NULL) { return SA_ERR_HPI_OUT_OF_SPACE; } memcpy(&entry->annentry, myann, sizeof(SaHpiAnnouncementT)); /* initialize the struct and append the new entry */ entry->annentry.EntryId = ann->nextId++; time(&tt1); entry->annentry.Timestamp = ((SaHpiTimeT) tt1) * 1000000000; entry->annentry.AddedByUser = TRUE; ann->annentries = g_list_append(ann->annentries, entry); /* copy the new generated info back to the user's announcement */ memcpy(myann, &entry->annentry, sizeof(SaHpiAnnouncementT)); return SA_OK; } /* clear all announcement entries */ SaErrorT oh_announcement_clear(oh_announcement *ann) { GList *temp; if (ann == NULL) { return SA_ERR_HPI_INVALID_PARAMS; } /* free the list data elements */ temp = g_list_first(ann->annentries); while (temp != NULL) { g_free(temp->data); temp = g_list_next(temp); } /* free the list nodes */ g_list_free(ann->annentries); /* reset the control structure */ ann->nextId = SAHPI_OLDEST_ENTRY + 1; // always start at 1 ann->annentries = NULL; return SA_OK; } /* get an announcement entry */ SaErrorT oh_announcement_get(oh_announcement *ann, SaHpiEntryIdT srchid, SaHpiAnnouncementT *entry) { oh_ann_entry *myentry; GList *annlist; if (ann == NULL || entry == NULL) { return SA_ERR_HPI_INVALID_PARAMS; } annlist = g_list_first(ann->annentries); if (annlist == NULL) return SA_ERR_HPI_NOT_PRESENT; if (srchid == SAHPI_FIRST_ENTRY && annlist != NULL) { myentry = (oh_ann_entry *) annlist->data; memcpy(entry, &myentry->annentry, sizeof(SaHpiAnnouncementT)); return SA_OK; } if (srchid == SAHPI_LAST_ENTRY && annlist != NULL) { annlist = g_list_last(ann->annentries); myentry = (oh_ann_entry *) annlist->data; memcpy(entry, &myentry->annentry, sizeof(SaHpiAnnouncementT)); return SA_OK; } while (annlist != NULL) { myentry = (oh_ann_entry *) annlist->data; if (srchid == myentry->annentry.EntryId) { memcpy(entry, &myentry->annentry, sizeof(SaHpiAnnouncementT)); return SA_OK; } annlist = g_list_next(annlist); } return SA_ERR_HPI_NOT_PRESENT; } /* get next announcement entry */ SaErrorT oh_announcement_get_next(oh_announcement *ann, SaHpiSeverityT sev, SaHpiBoolT ack, SaHpiAnnouncementT *entry) { GList *annlist = NULL; if (ann == NULL || entry == NULL) { return SA_ERR_HPI_INVALID_PARAMS; } if (entry->EntryId == SAHPI_FIRST_ENTRY) { annlist = ann->annentries; /* start search at beginning */ } else { /* find the previous matching entry */ for (annlist = ann->annentries; annlist; annlist = annlist->next) { oh_ann_entry *annentry = annlist->data; if (entry->EntryId == annentry->annentry.EntryId) { if (entry->Timestamp == annentry->annentry.Timestamp) { break; } else { return SA_ERR_HPI_INVALID_DATA; } } } /* Set list node for searching for next matching entry */ if (annlist) annlist = g_list_next(annlist); else { dbg("Did not find previous entry." " Searching from first one."); annlist = g_list_first(ann->annentries); } } /* Find the matching entry based on severity and ack */ for (; annlist; annlist = annlist->next) { oh_ann_entry *annentry = annlist->data; if (annentry && (sev == SAHPI_ALL_SEVERITIES || sev == annentry->annentry.Severity) && (ack ? !annentry->annentry.Acknowledged : 1)) { dbg("Severity searched for is %d." " Severity found is %d", sev, annentry->annentry.Severity); *entry = annentry->annentry; return SA_OK; } } return SA_ERR_HPI_NOT_PRESENT; } SaErrorT oh_announcement_ack(oh_announcement *ann, SaHpiEntryIdT srchid, SaHpiSeverityT sev) { oh_ann_entry *myentry; GList *annlist; if (ann == NULL) { return SA_ERR_HPI_INVALID_PARAMS; } /* Search for one announcement if entryid is specified */ if (srchid != SAHPI_ENTRY_UNSPECIFIED) { annlist = g_list_first(ann->annentries); while (annlist != NULL) { myentry = (oh_ann_entry *) annlist->data; if (srchid == myentry->annentry.EntryId) { myentry->annentry.Acknowledged = TRUE; return SA_OK; } annlist = g_list_next(annlist); } return SA_ERR_HPI_NOT_PRESENT; } /* EntryId not specified, so ack announcements which have the specified severity */ annlist = g_list_first(ann->annentries); if (annlist == NULL) return SA_OK; while (annlist != NULL) { myentry = (oh_ann_entry *) annlist->data; if (sev == SAHPI_ALL_SEVERITIES || sev == myentry->annentry.Severity) { myentry->annentry.Acknowledged = TRUE; } annlist = g_list_next(annlist); } return SA_OK; } SaErrorT oh_announcement_del(oh_announcement *ann, SaHpiEntryIdT srchid, SaHpiSeverityT sev) { oh_ann_entry *myentry; GList *annlist; if (ann == NULL) { return SA_ERR_HPI_INVALID_PARAMS; } /* Search for one announcement if entryid is specified */ if (srchid != SAHPI_ENTRY_UNSPECIFIED) { annlist = g_list_first(ann->annentries); while (annlist != NULL) { myentry = (oh_ann_entry *) annlist->data; if (srchid == myentry->annentry.EntryId) { free(annlist->data); ann->annentries = g_list_remove(ann->annentries, myentry); return SA_OK; } annlist = g_list_next(annlist); } return SA_ERR_HPI_NOT_PRESENT; } /* remove all announcements with a specified severity */ annlist = g_list_first(ann->annentries); if (annlist == NULL) return SA_OK; while (annlist != NULL) { myentry = (oh_ann_entry *) annlist->data; if (sev == SAHPI_ALL_SEVERITIES || sev == myentry->annentry.Severity) { free(annlist->data); ann->annentries = g_list_remove(ann->annentries, myentry); annlist = g_list_first(ann->annentries); } else { annlist = g_list_next(annlist); } } return SA_OK; } openhpi-2.14.1/utils/sahpi_event_utils.c0000644000076400007640000004236311302567131015231 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * Steve Sherman */ #include #include #include #include #include #include #include /** * oh_decode_eventstate: * @event_state: Event state bit map to be converted to a string. * @event_cat: Event category of @event_state. * @buffer: Pointer to buffer to store generated string. * * Converts @event_state into a string based on @event_state's HPI definition. * For example, @event_state = SAHPI_ES_UPPER_MAJOR | SAHPI_ES_UPPER_MINOR * is returned as the string "UPPER_MINOR | UPPER_MAJOR". * String is stored in an SaHpiTextBufferT data structure. * * Function validates that the @event_state bit map is valid for @event_cat. * * SAHPI_ES_UNSPECIFIED definitions are stripped from @event_state, if there are * other valid non-global states defined. For example, @event_state = * SAHPI_ES_IDLE | SAHPI_ES_UNSPECIFIED, returns the string "IDLE". * * Returns: * SA_OK - normal operation. * SA_ERR_HPI_INVALID_PARAMS - @buffer is NULL; Invalid @event_state or @event_cat. * SA_ERR_HPI_OUT_OF_SPACE - @buffer too small. **/ SaErrorT oh_decode_eventstate(SaHpiEventStateT event_state, SaHpiEventCategoryT event_cat, SaHpiTextBufferT *buffer) { int i, found; SaErrorT err; SaHpiTextBufferT working; /* Don't check for mutual exclusive events, since we want to see them all */ if (!buffer || !oh_valid_eventstate(event_state, event_cat, SAHPI_FALSE)) { err("Invalid parameter."); return(SA_ERR_HPI_INVALID_PARAMS); } err = oh_init_textbuffer(&working); if (err != SA_OK) { return(err); } found = 0; /* Look for category's event states */ for (i=0; iData == NULL || buffer->Data[0] == '\0') { err("Invalid Data buffer parameter."); return(SA_ERR_HPI_INVALID_PARAMS); } if (buffer->DataLength < SAHPI_MAX_TEXT_BUFFER_LENGTH) { buffer->Data[buffer->DataLength] = '\0'; } /* Split out event definitions */ if (buffer->DataLength < SAHPI_MAX_TEXT_BUFFER_LENGTH) { buffer->Data[buffer->DataLength] = '\0'; } gstr = g_strstrip(g_strndup((gchar *)buffer->Data, SAHPI_MAX_TEXT_BUFFER_LENGTH)); if (gstr == NULL || gstr[0] == '\0') { err("g_strstrip failed"); rtncode = SA_ERR_HPI_INTERNAL_ERROR; goto CLEANUP; } eventdefs = g_strsplit(gstr, OH_ENCODE_DELIMITER_CHAR, -1); if (eventdefs == NULL) { err("No event definitions"); rtncode = SA_ERR_HPI_INVALID_PARAMS; goto CLEANUP; } for (i=0; eventdefs[i] != NULL && eventdefs[i][0] != '\0'; i++) { eventdefs[i] = g_strstrip(eventdefs[i]); found_event = found_global_event = 0; /* Look for category event states */ for (j=0; jSource != SAHPI_UNSPECIFIED_RESOURCE_ID || event->EventType != SAHPI_ET_USER || NULL == oh_lookup_severity(event->Severity) || event->Severity == SAHPI_ALL_SEVERITIES || !oh_valid_textbuffer(&(event->EventDataUnion.UserEvent.UserEventData))) { err("Invalid parameter."); return(SA_ERR_HPI_INVALID_PARAMS); } /* No check for implementation-specific restriction on to how much data may be provided in the SAHPI_ET_USER event */ return(SA_OK); } openhpi-2.14.1/utils/epath_utils.c0000644000076400007640000007602511302567131014027 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2003, 2006 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * Steve Sherman * Renier Morales * Thomas Kanngieser */ #include #include #include #include #include #include /* Defines to create canonical entity path strings */ #define ELEMENTS_IN_SaHpiEntityT 2 #define EPATHSTRING_START_DELIMITER "{" #define EPATHSTRING_START_DELIMITER_CHAR '{' #define EPATHSTRING_END_DELIMITER "}" #define EPATHSTRING_END_DELIMITER_CHAR '}' #define EPATHSTRING_VALUE_DELIMITER "," #define EPATHSTRING_VALUE_DELIMITER_CHAR ',' #define EPATHPATTERN_SPLAT '*' #define EPATHPATTERN_DOT '.' /** * oh_encode_entitypath: * @epstr: Pointer to canonical entity path string. * @ep: Location to store HPI's entity path structure. * * Converts an entity path canonical string (generally generated * by oh_decode_entitypath()) into an SaHpiEntityPathT structure. * * Returns: * SA_OK - normal operation. * SA_ERR_HPI_INVALID_PARAMS - Input pointer(s) NULL. * SA_ERR_HPI_INVALID_DATA - Invalid canonical entity path string. * SA_ERR_HPI_OUT_OF_SPACE - No memory for internal storage. **/ SaErrorT oh_encode_entitypath(const gchar *epstr, SaHpiEntityPathT *ep) { gchar **epathdefs = NULL, **epathvalues = NULL; gchar *gstr = NULL, *endptr = NULL; GSList *epath_list = NULL, *lst = NULL; int i, location, num_entities = 0; SaErrorT err = SA_OK; SaHpiEntityT *entityptr = NULL; SaHpiTextBufferT tmpbuffer; SaHpiEntityTypeT eptype; if (!epstr || epstr[0] == '\0' || !ep) { err("Invalid parameter."); return(SA_ERR_HPI_INVALID_PARAMS); } /* Check for runaway string */ if (strlen(epstr) > OH_MAX_TEXT_BUFFER_LENGTH) { err("Invalid parameter."); return(SA_ERR_HPI_INVALID_DATA); } /* Split out {xxx,yyy} definition pairs */ gstr = g_strstrip(g_strdup(epstr)); if (gstr == NULL || gstr[0] == '\0') { err("Stripped entity path string is NULL"); err = SA_ERR_HPI_INVALID_DATA; goto CLEANUP; } epathdefs = g_strsplit(gstr, EPATHSTRING_END_DELIMITER, -1); if (epathdefs == NULL) { err("Cannot split entity path string."); err = SA_ERR_HPI_INTERNAL_ERROR; goto CLEANUP; } /* Split out HPI entity type and location strings */ for (i=0; epathdefs[i] != NULL && epathdefs[i][0] != '\0'; i++) { epathdefs[i] = g_strstrip(epathdefs[i]); /* Check format - for starting delimiter and a comma */ if ((epathdefs[i][0] != EPATHSTRING_START_DELIMITER_CHAR) || (strpbrk(epathdefs[i], EPATHSTRING_VALUE_DELIMITER) == NULL)) { err("Invalid entity path format."); err = SA_ERR_HPI_INVALID_DATA; goto CLEANUP; } epathvalues = g_strsplit(epathdefs[i], EPATHSTRING_VALUE_DELIMITER, ELEMENTS_IN_SaHpiEntityT); epathvalues[0] = g_strdelimit(epathvalues[0], EPATHSTRING_START_DELIMITER, ' '); /* Find entity type */ oh_init_textbuffer(&tmpbuffer); oh_append_textbuffer(&tmpbuffer, g_strstrip(epathvalues[0])); err = oh_encode_entitytype(&tmpbuffer, &eptype); /* If not an HPI type - support a numeric type. Needed by IPMI Direct plugin */ if (err) { err = SA_OK; int num = strtol(g_strstrip(epathvalues[0]), &endptr, 0); if (num <= 0 || endptr[0] != '\0') { err("Invalid entity type string"); err = SA_ERR_HPI_INVALID_DATA; goto CLEANUP; } eptype = num; } /* Find entity location */ location = strtol(g_strstrip(epathvalues[1]), &endptr, 10); if (endptr[0] != '\0') { err("Invalid location character"); err = SA_ERR_HPI_INVALID_DATA; goto CLEANUP; } /* Save entity path definitions; reverse order */ if (num_entities < SAHPI_MAX_ENTITY_PATH) { entityptr = (SaHpiEntityT *)g_malloc0(sizeof(*entityptr)); if (entityptr == NULL) { err("No memory."); err = SA_ERR_HPI_OUT_OF_SPACE; goto CLEANUP; } entityptr->EntityType = eptype; entityptr->EntityLocation = location; epath_list = g_slist_prepend(epath_list, (gpointer)entityptr); } num_entities++; g_strfreev(epathvalues); epathvalues = NULL; } /* Initialize and write HPI entity path structure */ oh_init_ep(ep); for (i = 0; epath_list != NULL; i++) { lst = epath_list; if (i < SAHPI_MAX_ENTITY_PATH) { ep->Entry[i].EntityType = ((SaHpiEntityT *)(lst->data))->EntityType; ep->Entry[i].EntityLocation = ((SaHpiEntityT *)(lst->data))->EntityLocation; } epath_list = g_slist_remove_link(epath_list,lst); g_free(lst->data); g_slist_free(lst); } if (num_entities > SAHPI_MAX_ENTITY_PATH) { err("Too many entity defs"); err = SA_ERR_HPI_INVALID_DATA; } CLEANUP: g_free(gstr); g_strfreev(epathdefs); if (epathvalues) g_strfreev(epathvalues); lst = epath_list; while (lst != NULL) { free(lst->data); lst = g_slist_next(lst); } g_slist_free(epath_list); return(err); } /** * oh_decode_entitypath: * @ep: Pointer to HPI's entity path structure. * @bigbuf: Location to store canonical entity path string. * * Converts an entity path structure into its canonical string version. * The canonical string is formed by removing the "SAHPI_ENT_" prefix * from the HPI types, and creating tuples for the entity types. * Order of significance is inverted to make entity paths look more * like Unix directory structure. It is also assumed that {ROOT,0} * exists implicitly before all of these entries. For example: * * {SYSTEM_CHASSIS,2}{PROCESSOR_BOARD,0} * * SAHPI_ENT_ROOT is used to identify end element of an entity path. * Fully populated entity path may not have an SAHPI_ENT_ROOT. * Duplicate names in SaHPIEntityTypeT enumeration aren't handled * and won't be preserved across conversion calls. * * Returns: * SA_OK - normal case. * SA_ERR_HPI_INVALID_PARAMS - Input pointer(s) NULL. * SA_ERR_HPI_INVALID_DATA - Location value too big for OpenHpi. * SA_ERR_HPI_OUT_OF_SPACE - No memory for internal storage. **/ SaErrorT oh_decode_entitypath(const SaHpiEntityPathT *ep, oh_big_textbuffer *bigbuf) { char *typestr; gchar *locstr, *catstr; gchar typestr_buffer[20]; int i; oh_big_textbuffer tmpbuf; SaErrorT err = SA_OK; if (!bigbuf || !ep) { err("Invalid parameter"); return(SA_ERR_HPI_INVALID_PARAMS); } err = oh_init_bigtext(&tmpbuf); if (err) return(err); locstr = (gchar *)g_malloc0(OH_MAX_LOCATION_DIGITS + 1); if (locstr == NULL) { err("No memory."); err = SA_ERR_HPI_OUT_OF_SPACE; goto CLEANUP; } /* Find last element of structure. Disregard ROOT element * and count as last in entity path. */ for (i=0; iEntry[i].EntityType == SAHPI_ENT_ROOT) { break; } } /* Parse entity path into a string */ for (i--; i >= 0; i--) { guint num_digits, work_location_num; /* Validate and convert data */ work_location_num = ep->Entry[i].EntityLocation; for (num_digits=1; (work_location_num = work_location_num/10) > 0; num_digits++); if (num_digits > OH_MAX_LOCATION_DIGITS) { err("Location value too big"); err = SA_ERR_HPI_INVALID_DATA; goto CLEANUP; } memset(locstr, 0, OH_MAX_LOCATION_DIGITS + 1); snprintf(locstr, OH_MAX_LOCATION_DIGITS + 1, "%d", ep->Entry[i].EntityLocation); /* Find string for current entity type */ typestr = oh_lookup_entitytype(ep->Entry[i].EntityType); /* Support numeric entity types - need by IPMI Direct plugin */ if (typestr == NULL) { snprintf(typestr_buffer, 20, "%d", ep->Entry[i].EntityType); typestr = typestr_buffer; } catstr = g_strconcat(EPATHSTRING_START_DELIMITER, typestr, EPATHSTRING_VALUE_DELIMITER, locstr, EPATHSTRING_END_DELIMITER, NULL); oh_append_bigtext(&tmpbuf, catstr); g_free(catstr); } /* Write string */ oh_init_bigtext(bigbuf); oh_append_bigtext(bigbuf, (char *)tmpbuf.Data); CLEANUP: g_free(locstr); return(err); } /** * oh_init_ep: * @ep: Pointer to SaHpiEntityPathT structure to initialize. * * Initializes an entity path to all {ROOT,0} elements. * * Returns: * SA_OK - normal operations. * SA_ERR_HPI_INVALID_PARAMS - @ep is NULL. **/ SaErrorT oh_init_ep(SaHpiEntityPathT *ep) { int i; if (!ep) { err("Invalid parameter."); return(SA_ERR_HPI_INVALID_PARAMS); } for (i=0; iEntry[i].EntityType = SAHPI_ENT_ROOT; ep->Entry[i].EntityLocation = 0; } return(SA_OK); } /** * oh_concat_ep: * @dest: Pointer to entity path. Gets appended with @append. * @append: Pointer to entity path to append. * * Concatenate two entity path structures (SaHpiEntityPathT). * @append is appeded to @dest. If @dest doesn't have enough room, @append * will be truncated into @dest. * * Returns: * SA_OK - normal operations. * SA_ERR_HPI_INVALID_PARAMS - @dest is NULL. **/ SaErrorT oh_concat_ep(SaHpiEntityPathT *dest, const SaHpiEntityPathT *append) { int i, j; if (!dest) { err("Invalid parameter."); return(SA_ERR_HPI_INVALID_PARAMS); } if (!append) return(SA_OK); for (i=0; iEntry[i].EntityType == SAHPI_ENT_ROOT) break; } for (j=0; iEntry[i].EntityLocation = append->Entry[j].EntityLocation; dest->Entry[i].EntityType = append->Entry[j].EntityType; if (append->Entry[j].EntityType == SAHPI_ENT_ROOT) break; j++; } return(SA_OK); } /** * oh_valid_ep: * @ep: Pointer to an SaHpiEntityPathT structure. * * Check an entity path to make sure it does not contain * any invalid entity types. The entity path is checked up to * the first root element or to the end of the array, if there * are no root elements in the structure. * * Returns: * SAHPI_TRUE - Valid entity path. * SAHPI_FALSE - Invalid entity path. **/ SaHpiBoolT oh_valid_ep(const SaHpiEntityPathT *ep) { int i; for (i=0; iEntry[i].EntityType == SAHPI_ENT_ROOT) break; /* FIXME:: Add explicit check for types with HPI resolves its conflicts with IPMI types */ /* Right now we're allowing users to specify any numeric type */ #if 0 char *typestr; typestr = oh_lookup_entitytype(ep->Entry[i].EntityType); if (typestr == NULL) return(SAHPI_FALSE); #endif } return(SAHPI_TRUE); } /** * oh_set_ep_location: * @ep: Pointer to entity path to work on * @et: entity type to look for * @ei: entity location to set when entity type is found * * Set an location number in the entity path given at the first * position (from least significant to most) the specified entity type is found. * * Returns: * SA_OK - normal operations. * SA_ERR_HPI_INVALID_PARAMS - @ep is NULL. * SA_ERR_HPI_INVALID_DATA - @ep invalid entity path. **/ SaErrorT oh_set_ep_location(SaHpiEntityPathT *ep, SaHpiEntityTypeT et, SaHpiEntityLocationT ei) { int i; if (!ep) { err("Invalid parameter."); return(SA_ERR_HPI_INVALID_PARAMS); } if (!oh_valid_ep(ep)) { err("Invalid entity path"); return(SA_ERR_HPI_INVALID_DATA); } for (i=0; iEntry[i].EntityType == et) { ep->Entry[i].EntityLocation = ei; break; } else { if (ep->Entry[i].EntityType == SAHPI_ENT_ROOT) break; } } return(SA_OK); } /** * oh_cmp_ep: * @ep1: Pointer to entity path structure. * @ep2: Pointer to entity path structure. * * Compares two entity paths up to their root element. * To be equal, they must have the same number of elements and each element * (type and location pair) must be equal to the corresponding element * in the other entity path. * * Returns: * SAHPI_TRUE - if equal. * SAHPI_FALSE - if not equal. **/ SaHpiBoolT oh_cmp_ep(const SaHpiEntityPathT *ep1, const SaHpiEntityPathT *ep2) { unsigned int i, j; if (!ep1 || !ep2) { err("Invalid parameter."); return(SAHPI_FALSE); } for (i=0; i Entry[i].EntityType == SAHPI_ENT_ROOT) { i++; break; } } for (j=0; jEntry[j].EntityType == SAHPI_ENT_ROOT) { j++; break; } } if (i != j) return(SAHPI_FALSE); for (i=0; iEntry[i].EntityType != ep2->Entry[i].EntityType || ep1->Entry[i].EntityLocation != ep2->Entry[i].EntityLocation) { /* dbg("Entity element %d: EP1 {%d,%d} != EP2 {%d,%d}", i, ep1->Entry[i].EntityType, ep1->Entry[i].EntityLocation, ep2->Entry[i].EntityType, ep2->Entry[i].EntityLocation); */ return(SAHPI_FALSE); } } return(SAHPI_TRUE); } /** * oh_fprint_ep: * @ep: Pointer to entity path stucture. * * Prints the string form of an entity path structure. * The MACRO oh_print_ep(), uses this function to print to STDOUT. * * Returns: * SA_OK - normal operations. * SA_ERR_HPI_INVALID_PARAMS - @ep is NULL. **/ SaErrorT oh_fprint_ep(FILE *stream, const SaHpiEntityPathT *ep, int offsets) { oh_big_textbuffer bigbuf1, bigbuf2; SaErrorT err; if (!ep) { err("Invalid parameter."); return(SA_ERR_HPI_INVALID_PARAMS); } err = oh_init_bigtext(&bigbuf1); if (err) return(err); err = oh_init_bigtext(&bigbuf2); if (err) return(err); err = oh_append_offset(&bigbuf1, offsets); if (err) return(err); err = oh_append_bigtext(&bigbuf1, "Entity Path: "); if (err) return(err); err = oh_decode_entitypath(ep, &bigbuf2); if (err) return(err); err = oh_append_bigtext(&bigbuf1, (char *)bigbuf2.Data); if (err) return(err); err = oh_append_bigtext(&bigbuf1, "\n"); if (err) return(err); fprintf(stream, "%s", bigbuf1.Data); return(SA_OK); } /********************************************************************** * oh_derive_string: * @ep - Pointer to entity's HPI SaHpiEntityPathT. * @offset - Offset to add to Entity Path location. * @base - Base for numeric conversion and display. * @str - Un-normalized character string. * * This function "normalizes" a string (such as an SNMP OID) * based on entity path. Starting from the end of @str, this routine * replaces the letter 'x', with the last location number of entity path, * the process is repeated until all 'x' are replaced by an location number. * For example, * * @str = ".1.3.6.1.4.1.2.3.x.2.22.1.5.1.1.5.x" * @ep = {SAHPI_ENT_CHASSIS, 51}{SAHPI_ENT_SBC_BLADE, 3} * * Returns a normalized string of ".1.3.6.1.4.1.2.3.51.2.22.1.5.1.1.5.3". * * An @offset is supported and is added to all substituted numbers. * For example, * * @offset = 3 * @str = ".1.3.6.1.4.1.2.3.x.2.22.1.5.1.1.5.x" * @ep = {SAHPI_ENT_CHASSIS, 51}{SAHPI_ENT_SBC_BLADE, 3} * * Returns a normalized string of ".1.3.6.1.4.1.2.3.54.2.22.1.5.1.1.5.6". * * A @base parameter is also supported to allow hex and decimal connversions. * For example, * @base = 10 * @str = "123x" * @ep = {SAHPI_ENT_CHASSIS, 51}{SAHPI_ENT_SBC_BLADE, 11} * * Returns a normalized string of "12311". * * @base = 16 * @str = "123x" * @ep = {SAHPI_ENT_CHASSIS, 51}{SAHPI_ENT_SBC_BLADE, 11} * * Returns a normalized string of "123B". * * If @str does not contain any 'x' characters, this routine still * allocates memory and returns a "normalized" string. In this case, * the normalized string is identical to @str. * * Note! * Caller of this routine MUST g_free() the returned normalized string * when finished with it. * * Returns: * Pointer to normalize string - Normal case. * NULL - Error. **********************************************************************/ gchar * oh_derive_string(SaHpiEntityPathT *ep, SaHpiEntityLocationT offset, int base, const gchar *str) { gchar *new_str = NULL, *str_walker = NULL; gchar **fragments = NULL, **str_nodes = NULL; guint num_epe, num_blanks, str_strlen = 0; guint total_num_digits, i, work_location_num, num_digits; if (!ep || !str) { err("NULL parameter."); return(NULL); } if (offset < 0) { err("Invalid location offset."); return(NULL); } if (!(base == 10 || base == 16)) { err("Invalid base."); return(NULL); } for (num_epe = 0; ep->Entry[num_epe].EntityType != SAHPI_ENT_ROOT && num_epe < SAHPI_MAX_ENTITY_PATH; num_epe++); /* dbg("Number of elements in entity path: %d", num_epe); */ if (num_epe == 0) { err("Entity Path is null."); return(NULL); } if ((str_strlen = strlen(str)) == 0) return(NULL); /* Str is zero length */ if (!strrchr(str, OH_DERIVE_BLANK_CHAR)) return(g_strdup(str)); /* Nothing to replace */ for (num_blanks=0, i=0; i num_epe) { err("Number of replacements=%d > entity path elements=%d", num_blanks, num_epe); return(NULL); } fragments = g_strsplit(str, OH_DERIVE_BLANK_STR, - 1); if (!fragments) { err("Cannot split string"); goto CLEANUP; } str_nodes = g_malloc0((num_blanks + 1) * sizeof(gchar **)); if (!str_nodes) { err("Out of memory."); goto CLEANUP; } total_num_digits = 0; for (i=0; iEntry[num_blanks-1-i].EntityLocation; if (offset) { work_location_num = work_location_num + offset; } for (num_digits = 1; (work_location_num = work_location_num/base) > 0; num_digits++); str_nodes[i] = g_malloc0((num_digits+1) * sizeof(gchar)); if (!str_nodes[i]) {err("Out of memory."); goto CLEANUP;} if (base == 10) { snprintf(str_nodes[i], (num_digits + 1) * sizeof(gchar), "%d", ep->Entry[num_blanks - 1 - i].EntityLocation + offset); } else { /* Base 16 */ snprintf(str_nodes[i], (num_digits + 1) * sizeof(gchar), "%X", ep->Entry[num_blanks - 1 - i].EntityLocation + offset); } /* dbg("Location number: %s", str_nodes[i]); */ total_num_digits = total_num_digits + num_digits; } new_str = g_malloc0((str_strlen-num_blanks + total_num_digits + 1) * sizeof(gchar)); if (!new_str) { err("Out of memory."); goto CLEANUP; } str_walker = new_str; for (i=0; fragments[i]; i++) { str_walker = strcpy(str_walker, fragments[i]); str_walker = str_walker + strlen(fragments[i]); if (str_nodes[i]) { str_walker = strcpy(str_walker, str_nodes[i]); /* dbg("Location number: %s", str_nodes[i]); */ str_walker = str_walker + strlen(str_nodes[i]); } /* dbg("New str: %s", new_str); */ } CLEANUP: g_strfreev(fragments); g_strfreev(str_nodes); return(new_str); } /** * oh_compile_entitypath_pattern * @epp_str: entity path pattern string * @epp: place where to put the compiled entity path pattern * * This will create an entitypath pattern structure out of an entity path * pattern string. * * Entity paths are in this format: * {type0,number0}{type1,number1}{type2,number2}...{typen,numbern} * Each {typex,numberx} is refered to as a tuple in the entity path. The number * part of the tuple is also refered to as the location. The type part is an * entity type based on the SaHpiEntityTypeT types defined in SaHpi.h, with the * SAHPI_ENT prefix cut out. * * An entity path pattern is defined as: * <*|{,}> * A splat (*) can take the place of a tuple. It means 0 or more tuples of any * type and any number. * A dot (.) can take the place of a type and also the place of a number within * the tuple. It means any type or any number depending of where it is used. * * Returns: SA_OK on success. **/ SaErrorT oh_compile_entitypath_pattern(const char *epp_str, oh_entitypath_pattern *epp) { int i, j, len, in_tuple = 0, in_entity = 0, start = -1; oh_entitypath_pattern pattern; if (!epp_str || !epp) { err("Got null parameters."); return SA_ERR_HPI_INVALID_PARAMS; } memset(&pattern, 0, sizeof(oh_entitypath_pattern)); len = strlen(epp_str); for (i = 0, j = 0; i < len; i++) { if (j >= OH_MAX_EP_TUPLES) return SA_ERR_HPI_ERROR; if (in_tuple) { /* We are scanning inside a tuple */ if (in_entity) { /* Scanning inside the entity type */ if (epp_str[i] == EPATHSTRING_VALUE_DELIMITER_CHAR) { if (start == -1 || i-start > SAHPI_MAX_ENTITY_PATH) { return SA_ERR_HPI_ERROR; } else { SaHpiTextBufferT buf; SaHpiEntityTypeT etype; oh_init_textbuffer(&buf); strncpy((char *)buf.Data, epp_str + start, i-start); buf.DataLength = strlen((char *)buf.Data); if (oh_encode_entitytype(&buf, &etype)) return SA_ERR_HPI_ERROR; pattern.epattern[j].etp.type = etype; in_entity = 0; start = -1; } } else if (epp_str[i] == EPATHSTRING_END_DELIMITER_CHAR || epp_str[i] == EPATHSTRING_START_DELIMITER_CHAR) { return SA_ERR_HPI_ERROR; } else if (epp_str[i] == EPATHPATTERN_DOT) { pattern.epattern[j].is_splat = SAHPI_FALSE; pattern.epattern[j].etp.is_dot = SAHPI_TRUE; in_entity = 0; if (epp_str[i+1] != EPATHSTRING_VALUE_DELIMITER_CHAR) { return SA_ERR_HPI_ERROR; } i++; } else { if (start == -1) start = i; } } else { /* Scanning inside the location number */ if (epp_str[i] == EPATHSTRING_VALUE_DELIMITER_CHAR) { return SA_ERR_HPI_ERROR; } else if (epp_str[i] == EPATHSTRING_START_DELIMITER_CHAR) { return SA_ERR_HPI_ERROR; } else if (epp_str[i] == EPATHSTRING_END_DELIMITER_CHAR) { if (start == -1 || i-start > OH_MAX_LOCATION_DIGITS) { return SA_ERR_HPI_ERROR; } else { char buf[OH_MAX_LOCATION_DIGITS+1], *endptr = NULL; SaHpiEntityLocationT loc; memset(buf, 0, OH_MAX_LOCATION_DIGITS+1); strncpy(buf, epp_str + start, i-start); loc = (SaHpiEntityLocationT)strtoul(buf, &endptr, 10); if (endptr && endptr[0] != '\0') return SA_ERR_HPI_ERROR; pattern.epattern[j].elp.location = loc; in_tuple = 0; start = -1; j++; } } else if (epp_str[i] == EPATHPATTERN_DOT) { pattern.epattern[j].elp.is_dot = SAHPI_TRUE; j++; in_tuple = 0; if (epp_str[i+1] != EPATHSTRING_END_DELIMITER_CHAR) { return SA_ERR_HPI_ERROR; } i++; } else { if (start == -1) start = i; } } } else { /* We are not yet inside a tuple. Could find a splat here. */ if (epp_str[i] == EPATHSTRING_START_DELIMITER_CHAR) { in_tuple = 1; in_entity = 1; } else if (epp_str[i] == EPATHPATTERN_SPLAT) { if (epp_str[i+1] == EPATHPATTERN_SPLAT) return SA_ERR_HPI_ERROR; pattern.epattern[j].is_splat = SAHPI_TRUE; j++; } else { return SA_ERR_HPI_ERROR; } } } memset(epp, 0, sizeof(oh_entitypath_pattern)); for (i = 0, j--; j > -1; j--, i++) { memcpy(epp->epattern + i, pattern.epattern + j, sizeof(oh_entity_pattern)); } epp->epattern[i].etp.type = SAHPI_ENT_ROOT; return SA_OK; } static int ep_ended(SaHpiEntityPathT *ep, int i) { if (!ep || i < 0) return 1; if (i >= SAHPI_MAX_ENTITY_PATH) return 1; if (ep->Entry[i].EntityType == SAHPI_ENT_ROOT) return 1; else return 0; } static int epp_ended(oh_entitypath_pattern *epp, int j) { if (!epp || j < 0) return 1; if (j >= OH_MAX_EP_TUPLES) return 1; if (!epp->epattern[j].is_splat && epp->epattern[j].etp.type == SAHPI_ENT_ROOT) return 1; else return 0; } static int matches(oh_entity_pattern *ep, SaHpiEntityT *e) { if (!ep || !e) return 0; if (ep->is_splat) return 1; if (!ep->etp.is_dot && ep->etp.type != e->EntityType) return 0; else if (!ep->elp.is_dot && ep->elp.location != e->EntityLocation) return 0; else return 1; } /** * oh_match_entitipath_pattern * @epp: entity path pattern * @ep: entity path * * This will match an entity path pattern to an entity path. * * Returns: SAHPI_TRUE if its a match, SAHPI_FALSE if its not. **/ SaHpiBoolT oh_match_entitypath_pattern(oh_entitypath_pattern *epp, SaHpiEntityPathT *ep) { int i = 0, j = 0, splatmode = 0; if (!epp || !ep) return SAHPI_FALSE; if (ep->Entry[0].EntityType == SAHPI_ENT_ROOT) { return SAHPI_FALSE; } else if (!epp->epattern[0].is_splat && epp->epattern[0].etp.type == SAHPI_ENT_ROOT) { return SAHPI_FALSE; } while (i < SAHPI_MAX_ENTITY_PATH) { if (epp->epattern[j].is_splat) { splatmode = 1; j++; /* next item in pattern */ if (epp_ended(epp, j)) break; } else { /* If we saw a splat then non-matches are ok. * Otherwise, they are not ok. */ if (matches(&epp->epattern[j], &ep->Entry[i])) { if (epp_ended(epp, j+1) && ep_ended(ep, i+1)) { break; } else if (epp_ended(epp, j+1) && !ep_ended(ep, i+1)) { if (epp->epattern[j].etp.is_dot && epp->epattern[j].elp.is_dot && splatmode) { i++; continue; } else { return SAHPI_FALSE; } } else if (ep_ended(ep, i+1) && !epp_ended(epp, j+1)) { if (epp->epattern[j+1].is_splat && epp_ended(epp, j+2)) break; else return SAHPI_FALSE; } if (splatmode && !(epp->epattern[j].etp.is_dot && epp->epattern[j].elp.is_dot)) splatmode = 0; i++; /* next tuple in entitypath */ j++; /* next item in pattern */ } else { if (splatmode) i++; /* next tuple in entitypath */ if (!splatmode || ep_ended(ep, i)) return SAHPI_FALSE; } } } return SAHPI_TRUE; } openhpi-2.14.1/utils/sahpi_struct_utils.c0000644000076400007640000052262411302567131015437 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004-2006 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * Sean Dague * Steve Sherman * Racing Guo * Renier Morales */ #include #include #include #include #include #include #include #include #include #include #define U_IS_SURROGATE(c) (((c)&0xfffff800)==0xd800) #define U_IS_LEAD(c) (((c)&0xfffffc00)==0xd800) #define U_IS_TRAIL(c) (((c)&0xfffffc00)==0xdc00) static inline SaErrorT oh_append_data(oh_big_textbuffer *big_buffer, const SaHpiUint8T *from, SaHpiUint8T len); static SaErrorT oh_build_resourceinfo(oh_big_textbuffer *buffer, const SaHpiResourceInfoT *ResourceInfo, int offsets); static SaErrorT oh_build_sensorrec(oh_big_textbuffer *buffer, const SaHpiSensorRecT *sensor, int offsets); static SaErrorT oh_build_sensordataformat(oh_big_textbuffer *buffer, const SaHpiSensorDataFormatT *format, int offsets); static SaErrorT oh_build_sensorthddefn(oh_big_textbuffer *buffer, const SaHpiSensorThdDefnT *tdef, int offsets); static SaErrorT oh_build_textbuffer(oh_big_textbuffer *buffer, const SaHpiTextBufferT *textbuffer, int offsets); static SaErrorT oh_build_ctrlrec(oh_big_textbuffer *textbuf, const SaHpiCtrlRecT *ctrlrec, int offsets); static SaErrorT oh_build_invrec(oh_big_textbuffer *textbuff, const SaHpiInventoryRecT *invrec, int offsets); static SaErrorT oh_build_wdogrec(oh_big_textbuffer *textbuff, const SaHpiWatchdogRecT *wdogrec, int offsets); static SaErrorT oh_build_annrec(oh_big_textbuffer *textbuff, const SaHpiAnnunciatorRecT *annrec, int offsets); static SaErrorT oh_build_dimirec(oh_big_textbuffer *textbuff, const SaHpiDimiRecT *dimirec, int offsets); static SaErrorT oh_build_fumirec(oh_big_textbuffer *textbuff, const SaHpiFumiRecT *fumirec, int offsets); static SaErrorT oh_build_event_resource(oh_big_textbuffer *buffer, const SaHpiEventT *event, int offsets); static SaErrorT oh_build_event_domain(oh_big_textbuffer *buffer, const SaHpiEventT *event, int offsets); static SaErrorT oh_build_event_sensor(oh_big_textbuffer *buffer, const SaHpiEventT *event, int offsets); static SaErrorT oh_build_event_sensor_enable_change(oh_big_textbuffer *buffer, const SaHpiEventT *event, int offsets); static SaErrorT oh_build_event_hotswap(oh_big_textbuffer *buffer, const SaHpiEventT *event, int offsets); static SaErrorT oh_build_event_watchdog(oh_big_textbuffer *buffer, const SaHpiEventT *event, int offsets); static SaErrorT oh_build_event_hpi_sw(oh_big_textbuffer *buffer, const SaHpiEventT *event, int offsets); static SaErrorT oh_build_event_oem(oh_big_textbuffer *buffer, const SaHpiEventT *event, int offsets); static SaErrorT oh_build_event_user(oh_big_textbuffer *buffer, const SaHpiEventT *event, int offsets); static SaErrorT oh_build_event_dimi(oh_big_textbuffer *buffer, const SaHpiEventT *event, int offsets); static SaErrorT oh_build_event_dimi_update(oh_big_textbuffer *buffer, const SaHpiEventT *event, int offsets); static SaErrorT oh_build_event_fumi(oh_big_textbuffer *buffer, const SaHpiEventT *event, int offsets); /************************************************************************ * NOTES! * * - Several error checks can be removed if valid_xxx routines are defined * for input structures. If this happens, several of the default switch * statements should also return SA_ERR_HPI_INTERNAL_ERROR instead * of SA_ERR_HPI_INVALID_PARMS. ************************************************************************/ /** * oh_lookup_manufacturerid: * @value: enum value of type SaHpiManufacturerIdT. * @buffer: Location to store the string. * * Converts @value into a string based on @value's enum definition * in http://www.iana.org/assignments/enterprise-numbers. * String is stored in an SaHpiTextBufferT data structure. * * Only a few of the manufacturers in that list have been defined. * For all others, this routine returns "Unknown Manufacturer". * Feel free to add your own favorite manufacturer to this routine. * * Returns: * SA_OK - Normal operation. * SA_ERR_HPI_INVALID_PARAMS - @buffer is NULL. **/ SaErrorT oh_decode_manufacturerid(SaHpiManufacturerIdT value, SaHpiTextBufferT *buffer) { SaErrorT err; SaHpiTextBufferT working; if (!buffer) { err("Invalid parameters."); return(SA_ERR_HPI_INVALID_PARAMS); } err = oh_init_textbuffer(&working); if (err) { return(err); } switch(value) { case SAHPI_MANUFACTURER_ID_UNSPECIFIED: err = oh_append_textbuffer(&working, "Unspecified"); if (err) { return(err); } break; case 2: /* 2 is IANA number */ case 20944: /* 20944 is IANA code for Modular Blade Server */ err = oh_append_textbuffer(&working,"IBM"); if (err) { return(err); } break; case ATCAHPI_PICMG_MID: /* ATCAHPI_PICMG_MID is IANA code for PICMG manufacturer identifier */ err = oh_append_textbuffer(&working,"PICMG"); if (err) { return(err); } break; case 11: err = oh_append_textbuffer(&working, "Hewlett-Packard"); if (err) { return(err); } break; case 42: err = oh_append_textbuffer(&working, "Sun Microsystems"); if (err) { return(err); } break; case 161: err = oh_append_textbuffer(&working, "Motorola"); if (err) { return(err); } break; case 185: err = oh_append_textbuffer(&working, "Interphase"); if (err) { return(err); } break; case 343: err = oh_append_textbuffer(&working, "Intel Corporation"); if (err) { return(err); } break; case 398: err = oh_append_textbuffer(&working, "Tyco Electronics"); if (err) { return(err); } break; case 688: err = oh_append_textbuffer(&working, "Znyx Advanced Systems Division, Inc."); if (err) { return(err); } break; case 912: err = oh_append_textbuffer(&working, "Adax Inc."); if (err) { return(err); } break; case 1458: err = oh_append_textbuffer(&working, "AMCC"); if (err) { return(err); } break; case 1556: err = oh_append_textbuffer(&working, "Performance Technologies, Inc."); if (err) { return(err); } break; case 2012: err = oh_append_textbuffer(&working, "Schroff GmbH"); if (err) { return(err); } break; case 2537: err = oh_append_textbuffer(&working, "Diversified Technology, Inc."); if (err) { return(err); } break; case 2606: err = oh_append_textbuffer(&working, "Rittal-Werk Rudolf Loh GmbH & Co.KG"); if (err) { return(err); } break; case 2628: err = oh_append_textbuffer(&working, "Natural MicroSystems"); if (err) { return(err); } break; case 3028: err = oh_append_textbuffer(&working, "Dialogic Corporation"); if (err) { return(err); } break; case 3442: err = oh_append_textbuffer(&working, "Advantech Inc."); if (err) { return(err); } break; case 4127: err = oh_append_textbuffer(&working, "Mercury Computer Systems"); if (err) { return(err); } break; case 4337: err = oh_append_textbuffer(&working, "RadiSys Corporation"); if (err) { return(err); } break; case 5380: err = oh_append_textbuffer(&working, "CDOT"); if (err) { return(err); } break; case 6629: err = oh_append_textbuffer(&working, "Ulticom"); if (err) { return(err); } break; case 7994: err = oh_append_textbuffer(&working, "Continuous Computing Corp."); if (err) { return(err); } break; case 8337: err = oh_append_textbuffer(&working, "Hybricon Corp"); if (err) { return(err); } break; case 10297: err = oh_append_textbuffer(&working, "Advantech Co., Ltd."); if (err) { return(err); } break; case 10520: err = oh_append_textbuffer(&working, "Tyco Electronics Power Systems"); if (err) { return(err); } break; case 10728: err = oh_append_textbuffer(&working, "Redline Communications Inc."); if (err) { return(err); } break; case 13400: err = oh_append_textbuffer(&working, "Emerson Network Power"); if (err) { return(err); } break; case 13427: err = oh_append_textbuffer(&working, "Artesyn Technologies"); if (err) { return(err); } break; case 15000: err = oh_append_textbuffer(&working, "Kontron Canada Inc"); if (err) { return(err); } break; case 15563: err = oh_append_textbuffer(&working, "Adtron"); if (err) { return(err); } break; case 16394: err = oh_append_textbuffer(&working, "Pigeon Point Systems"); if (err) { return(err); } break; case 16446: err = oh_append_textbuffer(&working, "Adlink"); if (err) { return(err); } break; case 18765: err = oh_append_textbuffer(&working, "Comtel Electronics GmbH"); if (err) { return(err); } break; case 19911: err = oh_append_textbuffer(&working, "Global Velocity Inc."); if (err) { return(err); } break; case 20974: err = oh_append_textbuffer(&working, "American Megatrends, Inc"); if (err) { return(err); } break; case 22341: err = oh_append_textbuffer(&working, "ESO Technologies"); if (err) { return(err); } break; case 23858: err = oh_append_textbuffer(&working, "VadaTech Inc."); if (err) { return(err); } break; case 24632: err = oh_append_textbuffer(&working, "CorEdge Networks"); if (err) { return(err); } break; case 25635: err = oh_append_textbuffer(&working, "Carlo Gavazzi Computing Solutions"); if (err) { return(err); } break; case 26609: err = oh_append_textbuffer(&working, "Pentair Electronic Packaging"); if (err) { return(err); } break; case 24893: err = oh_append_textbuffer(&working, "GE Fanuc Embedded Systems"); if (err) { return(err); } break; case 26061: err = oh_append_textbuffer(&working, "Artesyn Communication Products Ltd"); if (err) { return(err); } break; case 26655: err = oh_append_textbuffer(&working, "Advantech Co., Ltd"); if (err) { return(err); } break; case 27317: err = oh_append_textbuffer(&working, "Extreme Engineering Solutions, Inc"); if (err) { return(err); } break; case 27768: err = oh_append_textbuffer(&working, "Gesellschaft für Netzwerk- und Automatisierungs-Technologie GmbH"); if (err) { return(err); } break; case 29333: err = oh_append_textbuffer(&working, "JBlade LLC"); if (err) { return(err); } break; case 186: err = oh_append_textbuffer(&working, "Toshiba"); if (err) { return(err); } break; case 116: err = oh_append_textbuffer(&working, "Hitachi"); if (err) { return(err); } break; case 399: err = oh_append_textbuffer(&working, "Hitachi"); if (err) { return(err); } break; case 119: err = oh_append_textbuffer(&working, "NEC"); if (err) { return(err); } break; case 373: err = oh_append_textbuffer(&working, "Tatung"); if (err) { return(err); } break; case 802: err = oh_append_textbuffer(&working, "National Semiconductor"); if (err) { return(err); } break; case 674: err = oh_append_textbuffer(&working, "Dell"); if (err) { return(err); } break; case 2168: err = oh_append_textbuffer(&working, "LMC"); if (err) { return(err); } break; case 6653: err = oh_append_textbuffer(&working, "Tyan"); if (err) { return(err); } break; case 10368: err = oh_append_textbuffer(&working, "Fujitsu-Siemens"); if (err) { return(err); } break; case 10876: err = oh_append_textbuffer(&working, "SuperMicro"); if (err) { return(err); } break; case 13742: err = oh_append_textbuffer(&working, "Raritan"); if (err) { return(err); } break; case 10437: err = oh_append_textbuffer(&working, "Peppercon"); if (err) { return(err); } break; case 10418: err = oh_append_textbuffer(&working, "Avocent"); if (err) { return(err); } break; case 11102: err = oh_append_textbuffer(&working, "OSA"); if (err) { return(err); } break; default: err = oh_append_textbuffer(&working, "Unknown"); if (err) { return(err); } } oh_copy_textbuffer(buffer, &working); return(SA_OK); } /** * oh_decode_sensorreading: * @reading: SaHpiSensorReadingT to convert. * @format: SaHpiDataFormatT for the sensor reading. * @buffer: Location to store the converted string. * * Converts an HPI sensor reading and format into a string. * String is stored in an SaHpiTextBufferT data structure. * * Returns: * SA_OK - Normal operation. * SA_ERR_HPI_INVALID_CMD - @format or @reading have IsSupported == FALSE. * SA_ERR_HPI_INVALID_DATA - @format and @reading types don't match. * SA_ERR_HPI_INVALID_PARAMS - Pointer parameter(s) are NULL; @reading type != @format type. * SA_ERR_HPI_OUT_OF_SPACE - @buffer not big enough to accomodate appended string **/ SaErrorT oh_decode_sensorreading(SaHpiSensorReadingT reading, SaHpiSensorDataFormatT format, SaHpiTextBufferT *buffer) { char text[SAHPI_MAX_TEXT_BUFFER_LENGTH]; SaErrorT err; SaHpiTextBufferT working; char str[SAHPI_SENSOR_BUFFER_LENGTH + 1]; if (!buffer) { err("Invalid parameter."); return(SA_ERR_HPI_INVALID_PARAMS); } if (!reading.IsSupported || !format.IsSupported) { err("Invalid Command."); return(SA_ERR_HPI_INVALID_CMD); } if (reading.Type != format.ReadingType) { err("Invalid Data."); return(SA_ERR_HPI_INVALID_DATA); } oh_init_textbuffer(&working); memset(text, 0, SAHPI_MAX_TEXT_BUFFER_LENGTH); switch(reading.Type) { case SAHPI_SENSOR_READING_TYPE_INT64: snprintf(text, SAHPI_MAX_TEXT_BUFFER_LENGTH, "%lld", reading.Value.SensorInt64); err = oh_append_textbuffer(&working, text); if (err) { return(err); } break; case SAHPI_SENSOR_READING_TYPE_UINT64: snprintf(text, SAHPI_MAX_TEXT_BUFFER_LENGTH, "%llu", reading.Value.SensorUint64); err = oh_append_textbuffer(&working, text); if (err) { return(err); } break; case SAHPI_SENSOR_READING_TYPE_FLOAT64: snprintf(text, SAHPI_MAX_TEXT_BUFFER_LENGTH, "%5.3lf", reading.Value.SensorFloat64); err = oh_append_textbuffer(&working, text); if (err) { return(err); } break; case SAHPI_SENSOR_READING_TYPE_BUFFER: /* In case Sensor Buffer contains no end of string deliminter */ memset(str, 0, SAHPI_SENSOR_BUFFER_LENGTH + 1); strncpy(str, (char *)reading.Value.SensorBuffer, SAHPI_SENSOR_BUFFER_LENGTH); err = oh_append_textbuffer(&working, str); if (err) { return(err); } break; default: return(SA_ERR_HPI_INVALID_PARAMS); } if (format.Percentage) { err = oh_append_textbuffer(&working, "%"); if (err) { return(err); } } else { /* Add units */ if (format.BaseUnits != SAHPI_SU_UNSPECIFIED) { char *str; err = oh_append_textbuffer(&working, " "); if (err) { return(err); } str = oh_lookup_sensorunits(format.BaseUnits); if (str == NULL) { return(SA_ERR_HPI_INVALID_PARAMS); } err = oh_append_textbuffer(&working, str); if (err) { return(err); } } /* Add modifier units, if appropriate */ if (format.BaseUnits != SAHPI_SU_UNSPECIFIED && format.ModifierUse != SAHPI_SMUU_NONE) { char *str; switch(format.ModifierUse) { case SAHPI_SMUU_BASIC_OVER_MODIFIER: err = oh_append_textbuffer(&working, " / "); if (err) { return(err); } break; case SAHPI_SMUU_BASIC_TIMES_MODIFIER: err = oh_append_textbuffer(&working, " * "); if (err) { return(err); } break; default: return(SA_ERR_HPI_INVALID_PARAMS); } str = oh_lookup_sensorunits(format.ModifierUnits); if (str == NULL) { return(SA_ERR_HPI_INVALID_PARAMS); } err = oh_append_textbuffer(&working, str); if (err) { return(err); } } } oh_copy_textbuffer(buffer, &working); return(SA_OK); } /** * oh_encode_sensorreading: * @buffer: Location of SaHpiTextBufferT containing the string to * convert into a SaHpiSensorReadingT. * @type: SaHpiSensorReadingTypeT of converted reading. * @reading: SaHpiSensorReadingT location to store converted string. * * Converts @buffer->Data string to an HPI SaHpiSensorReadingT structure. * Generally @buffer->Data is created by oh_decode_sensorreading() or has * been built by a plugin, which gets string values for sensor readings (e.g. * through SNMP OID commands). Any non-numeric portion of the string is * discarded. For example, the string "-1.43 Volts" is converted to -1.43 * of type @type. * * If type = SAHPI_SENSOR_READING_TYPE_BUFFER, and @buffer->Data > * SAHPI_SENSOR_BUFFER_LENGTH, data is truncated to fit into the reading * buffer. * * Notes! * - Numerical strings can contain commas but it is assummed that strings follow. * US format (e.g. "1,000,000" = 1 million; not "1.000.000"). * - Decimal points are always preceded by at least one number (e.g. "0.9"). * - Numerical percentage strings like "89%" are stripped of their percent sign. * - Hex notation is not supported (e.g. "0x23"). * - Scientific notation is not supported (e.g. "e+02"). * * Returns: * SA_OK - Normal operation. * SA_ERR_HPI_INVALID_PARAMS - Pointer parameter(s) are NULL; Invalid @type. * SA_ERR_HPI_INVALID_DATA - Converted @buffer->Data too large for @type; cannot * convert string into valid number; @type incorrect * for resulting number. **/ SaErrorT oh_encode_sensorreading(SaHpiTextBufferT *buffer, SaHpiSensorReadingTypeT type, SaHpiSensorReadingT *reading) { char *endptr; char numstr[SAHPI_MAX_TEXT_BUFFER_LENGTH]; int i, j, skip; int found_sign, found_number, found_float, in_number; int is_percent = 0; SaHpiFloat64T num_float64 = 0.0; SaHpiInt64T num_int64 = 0; SaHpiUint64T num_uint64 = 0; SaHpiSensorReadingT working; if (!buffer || !reading || buffer->Data == NULL || buffer->Data[0] == '\0' || !oh_lookup_sensorreadingtype(type)) { err("Invalid parameter"); return(SA_ERR_HPI_INVALID_PARAMS); } if (type == SAHPI_SENSOR_READING_TYPE_BUFFER) { reading->IsSupported = SAHPI_TRUE; reading->Type = type; strncpy((char *)reading->Value.SensorBuffer, (char *)buffer->Data, SAHPI_SENSOR_BUFFER_LENGTH); return(SA_OK); } memset(numstr, 0, SAHPI_MAX_TEXT_BUFFER_LENGTH); memset(&working, 0, sizeof(SaHpiSensorReadingT)); working.IsSupported = SAHPI_TRUE; working.Type = type; /* Search string and pull out first numeric string. The strtol type * functions below are pretty good at handling non-numeric junk in * string, but they don't handle spaces after a sign or commas within * a number. So we normalize the string a bit first. */ /* Skip any characters before an '=' sign */ char *skipstr = strchr((char *)buffer->Data, '='); if (skipstr) skip = (long int)skipstr - (long int)(buffer->Data) + 1; else skip = 0; j = found_sign = in_number = found_number = found_float = 0; for (i=skip; iDataLength && !found_number; i++) { if (buffer->Data[i] == '+' || buffer->Data[i] == '-') { if (found_sign) { err("Cannot parse multiple sign values"); return(SA_ERR_HPI_INVALID_DATA); } found_sign = 1; numstr[j] = buffer->Data[i]; j++; } if (isdigit(buffer->Data[i])) { if (!found_number) { in_number = 1; numstr[j] = buffer->Data[i]; j++; } } else { /* Strip non-numerics */ if (buffer->Data[i] == '.') { /* Unless its a decimal point */ if (in_number) { if (found_float) { err("Cannot parse multiple decimal points"); return(SA_ERR_HPI_INVALID_DATA); } found_float = 1; numstr[j] = buffer->Data[i]; j++; } } else { /* Delete commas but don't end search for more numbers */ if (in_number && buffer->Data[i] != ',') { found_number = 1; } } } } if (found_number || in_number) { /* in_number means string ended in a digit character */ for (j=i-1; jDataLength; j++) { if (buffer->Data[j] == '%') { is_percent = 1; break; } } found_number = 1; } if (found_float && type != SAHPI_SENSOR_READING_TYPE_FLOAT64) { err("Number and type incompatible"); return(SA_ERR_HPI_INVALID_DATA); } /* Convert string to number */ switch (type) { case SAHPI_SENSOR_READING_TYPE_INT64: if (found_number) { errno = 0; num_int64 = strtoll(numstr, &endptr, 10); if (errno) { err("strtoll failed, errno=%d", errno); return(SA_ERR_HPI_INVALID_DATA); } if (*endptr != '\0') { err("strtoll failed: End Pointer=%s", endptr); return(SA_ERR_HPI_INVALID_DATA); } } else { /* No number in string */ num_int64 = 0; } working.Value.SensorInt64 = num_int64; break; case SAHPI_SENSOR_READING_TYPE_UINT64: if (found_number) { errno = 0; num_uint64 = strtoull(numstr, &endptr, 10); if (errno) { err("strtoull failed, errno=%d", errno); return(SA_ERR_HPI_INVALID_DATA); } if (*endptr != '\0') { err("strtoull failed: End Pointer=%s", endptr); return(SA_ERR_HPI_INVALID_DATA); } } else { /* No number in string */ num_uint64 = 0; } working.Value.SensorUint64 = num_uint64; break; case SAHPI_SENSOR_READING_TYPE_FLOAT64: if (found_number) { errno = 0; num_float64 = strtold(numstr, &endptr); if (errno) { err("strtold failed, errno=%d", errno); return(SA_ERR_HPI_INVALID_DATA); } if (*endptr != '\0') { err("strtold failed: End Pointer=%s", endptr); return(SA_ERR_HPI_INVALID_DATA); } working.Value.SensorFloat64 = num_float64; } else { /* No number in string */ num_float64 = 0; } break; default: /* Should never get here */ err("Invalid type=%d", type); return(SA_ERR_HPI_INTERNAL_ERROR); } *reading = working; return(SA_OK); } /** * oh_fprint_text: * @stream: File handle. * @buffer: Pointer to SaHpiTextBufferT to be printed. * * Prints the text data contained in SaHpiTextBufferT to a file. Data must * be of type SAHPI_TL_TYPE_TEXT. @buffer->DataLength is ignored. * The MACRO oh_print_text(), uses this function to print to STDOUT. * * Returns: * SA_OK - Normal operation. * SA_ERR_HPI_INVALID_DATA - @buffer->DataType not SAHPI_TL_TYPE_TEXT. **/ SaErrorT oh_fprint_text(FILE *stream, const SaHpiTextBufferT *buffer) { SaErrorT err; if (buffer->DataType == SAHPI_TL_TYPE_TEXT) { err = fwrite( buffer->Data, buffer->DataLength, 1, stream); if (err < 0) { err("Invalid parameter."); return(SA_ERR_HPI_INVALID_PARAMS); } } else { err("Invalid Data."); return(SA_ERR_HPI_INVALID_DATA); } return(SA_OK); } /** * oh_fprint_bigtext: * @stream: File handle. * @big_buffer: Pointer to oh_big_textbuffer to be printed. * * Prints the text data contained in oh_big_textbuffer to a file. Data must * be of type SAHPI_TL_TYPE_TEXT. @big_buffer->DataLength is ignored. * The MACRO oh_print_bigtext(), uses this function to print to STDOUT. * * Returns: * SA_OK - Normal operation. * SA_ERR_HPI_INVALID_DATA - @big_buffer->DataType not SAHPI_TL_TYPE_TEXT. **/ SaErrorT oh_fprint_bigtext(FILE *stream, const oh_big_textbuffer *big_buffer) { SaErrorT err; if (big_buffer->DataType == SAHPI_TL_TYPE_TEXT) { err = fprintf(stream, "%s\n", big_buffer->Data); if (err < 0) { err("Invalid parameter."); return(SA_ERR_HPI_INVALID_PARAMS); } } else { err("Invalid Data."); return(SA_ERR_HPI_INVALID_DATA); } return(SA_OK); } /** * oh_init_textbuffer: * @buffer: Pointer to an SaHpiTextBufferT. * * Initializes an SaHpiTextBufferT. Assumes an English language set. * * Returns: * SA_OK - Normal operation. * SA_ERR_HPI_INVALID_PARAMS - @buffer is NULL. **/ SaErrorT oh_init_textbuffer(SaHpiTextBufferT *buffer) { if (!buffer) { err("Invalid parameter."); return(SA_ERR_HPI_INVALID_PARAMS); } memset(buffer, 0, sizeof(*buffer)); buffer->DataType = SAHPI_TL_TYPE_TEXT; buffer->Language = SAHPI_LANG_ENGLISH; buffer->DataLength = 0; return(SA_OK); } SaErrorT oh_init_bigtext(oh_big_textbuffer *big_buffer) { if (!big_buffer) { err("Invalid parameter."); return(SA_ERR_HPI_INVALID_PARAMS); } memset(big_buffer, 0, sizeof(*big_buffer)); big_buffer->DataType = SAHPI_TL_TYPE_TEXT; big_buffer->Language = SAHPI_LANG_ENGLISH; big_buffer->DataLength = 0; return(SA_OK); } /** * oh_copy_textbuffer: * @dest: SaHpiTextBufferT to copy into. * @from:SaHpiTextBufferT to copy from. * * Copies one SaHpiTextBufferT structure to another. * * Returns: * SA_OK - Normal operation. * SA_ERR_HPI_INVALID_PARAMS - Pointer parameter(s) are NULL. **/ SaErrorT oh_copy_textbuffer(SaHpiTextBufferT *dest, const SaHpiTextBufferT *from) { if (!dest || !from) { err("Invalid parameter."); return(SA_ERR_HPI_INVALID_PARAMS); } dest->DataType = from->DataType; dest->Language = from->Language; dest->DataLength = from->DataLength; memcpy(dest->Data, from->Data, SAHPI_MAX_TEXT_BUFFER_LENGTH); return(SA_OK); } SaErrorT oh_copy_bigtext(oh_big_textbuffer *dest, const oh_big_textbuffer *from) { if (!dest || !from) { err("Invalid parameter."); return(SA_ERR_HPI_INVALID_PARAMS); } dest->DataType = from->DataType; dest->Language = from->Language; dest->DataLength = from->DataLength; memcpy(dest->Data, from->Data, OH_MAX_TEXT_BUFFER_LENGTH); return(SA_OK); } /** * oh_append_textbuffer: * @buffer: SaHpiTextBufferT to append to. * @from: String to be appended. * * Appends a string to @buffer->Data. * * Returns: * SA_OK - Normal operation. * SA_ERR_HPI_INVALID_PARAMS - Pointer parameter(s) are NULL. * SA_ERR_HPI_OUT_OF_SPACE - @buffer not big enough to accomodate appended string. **/ SaErrorT oh_append_textbuffer(SaHpiTextBufferT *buffer, const char *from) { char *p; uint size; if (!buffer || !from) { err("Invalid parameter."); return(SA_ERR_HPI_INVALID_PARAMS); } size = strlen(from); if ((size + buffer->DataLength) >= SAHPI_MAX_TEXT_BUFFER_LENGTH) { err("Cannot append to text buffer. Bufsize=%d, size=%u", buffer->DataLength, size); return(SA_ERR_HPI_OUT_OF_SPACE); } /* Can't trust NULLs to be right, so use a targeted strncpy instead */ p = (char *)buffer->Data; p += buffer->DataLength; strncpy(p, from, size); buffer->DataLength += size; return(SA_OK); } SaErrorT oh_append_bigtext(oh_big_textbuffer *big_buffer, const char *from) { char *p; uint size; if (!big_buffer || !from) { err("Invalid parameters"); return(SA_ERR_HPI_INVALID_PARAMS); } size = strlen(from); if ((size + big_buffer->DataLength) >= OH_MAX_TEXT_BUFFER_LENGTH) { err("Cannot append to buffer. Bufsize=%d, size=%u", big_buffer->DataLength, size); return(SA_ERR_HPI_INTERNAL_ERROR); } /* Can't trust NULLs to be right, so use a targeted strncpy instead */ p = (char *)big_buffer->Data; p += big_buffer->DataLength; strncpy(p, from, size); big_buffer->DataLength += size; return(SA_OK); } static inline SaErrorT oh_append_data(oh_big_textbuffer *big_buffer, const SaHpiUint8T *from, SaHpiUint8T len) { SaHpiUint8T i; if (!big_buffer || !from || len == 0) { err("Invalid parameters"); return(SA_ERR_HPI_INVALID_PARAMS); } for (i=0; iDataLength) >= OH_MAX_TEXT_BUFFER_LENGTH) { err("Cannot append to buffer. Bufsize=%d, len=%d", big_buffer->DataLength, len); return(SA_ERR_HPI_INTERNAL_ERROR); } p = (char *)big_buffer->Data; p += big_buffer->DataLength; strncpy(p, buff, slen); big_buffer->DataLength += slen; } return(SA_OK); } /* Append an arbitrary number of fixed offset strings to a big text buffer */ SaErrorT oh_append_offset(oh_big_textbuffer *buffer, int offsets) { int i; for (i=0; i < offsets; i++) { oh_append_bigtext(buffer, OH_PRINT_OFFSET); } return(SA_OK); } /** * oh_fprint_ctrlrec: * @stream: File handle. * @control: Pointer to SaHpiCtrlRecT to be printed. * @offsets: Number of offsets to start printing structure. * * Prints a control's SaHpiCtrlRecT data to a file. * The MACRO oh_print_ctrlrec(), uses this function to print to STDOUT. * * Returns: * SA_OK - Normal operation. * SA_ERR_HPI_INVALID_PARAMS - Pointer parameter(s) are NULL. **/ SaErrorT oh_fprint_ctrlrec(FILE *stream, const SaHpiCtrlRecT *control, int offsets) { SaErrorT err; oh_big_textbuffer buffer; if (!stream || !control) { err("Invalid parameter."); return(SA_ERR_HPI_INVALID_PARAMS); } oh_init_bigtext(&buffer); err = oh_build_ctrlrec(&buffer, control, offsets); if (err) { return(err); } err = oh_fprint_bigtext(stream, &buffer); if (err) { return(err); } return(SA_OK); } /** * oh_fprint_watchdogrec: * @stream: File handle. * @watchdog: Pointer to SaHpiWatchdogRecT to be printed. * @offsets: Number of offsets to start printing structure. * * Prints a watchdog's SaHpiWatchdogRecT data to a file. * The MACRO oh_print_watchdogrec(), uses this function to print to STDOUT. * * Returns: * SA_OK - Normal operation. * SA_ERR_HPI_INVALID_PARAMS - Pointer parameter(s) are NULL. **/ SaErrorT oh_fprint_watchdogrec(FILE *stream, const SaHpiWatchdogRecT *watchdog, int offsets) { SaErrorT err; oh_big_textbuffer buffer; if (!stream || !watchdog) { err("Invalid parameter."); return(SA_ERR_HPI_INVALID_PARAMS); } oh_init_bigtext(&buffer); err = oh_build_wdogrec(&buffer, watchdog, offsets); if (err) { return(err); } err = oh_fprint_bigtext(stream, &buffer); if (err) { return(err); } return(SA_OK); } /** * oh_fprint_sensorrec: * @stream: File handle. * @sensor: Pointer to SaHpiSensorRecT to be printed. * @offsets: Number of offsets to start printing structure. * * Prints a sensor's SaHpiSensorRecT data to a file. * The MACRO oh_print_sensorrec(), uses this function to print to STDOUT. * * Returns: * SA_OK - Normal operation. * SA_ERR_HPI_INVALID_PARAMS - Pointer parameter(s) are NULL. **/ SaErrorT oh_fprint_sensorrec(FILE *stream, const SaHpiSensorRecT *sensor, int offsets) { SaErrorT err; oh_big_textbuffer buffer; if (!stream || !sensor) { err("Invalid parameter."); return(SA_ERR_HPI_INVALID_PARAMS); } oh_init_bigtext(&buffer); err = oh_build_sensorrec(&buffer, sensor, offsets); if (err) { return(err); } err = oh_fprint_bigtext(stream, &buffer); if (err) { return(err); } return(SA_OK); } static SaErrorT oh_build_resourceinfo(oh_big_textbuffer *buffer, const SaHpiResourceInfoT *ResourceInfo, int offsets) { char str[SAHPI_MAX_TEXT_BUFFER_LENGTH]; char tempstr[SAHPI_MAX_TEXT_BUFFER_LENGTH]; int found; oh_big_textbuffer working; SaHpiTextBufferT tmpbuffer; SaErrorT err; if (!buffer || !ResourceInfo) { err("Invalid parameter."); return(SA_ERR_HPI_INVALID_PARAMS); } oh_append_offset(buffer, offsets); oh_append_bigtext(buffer, "Resource Information: "); /* Initial temp buffer - assumming we find something to print */ err = oh_init_bigtext(&working); if (err) { return(err); } err = oh_append_bigtext(&working, "\n"); if (err) { return(err); } offsets++; found = 0; if (ResourceInfo->ResourceRev) { oh_append_offset(&working, offsets); snprintf(str, SAHPI_MAX_TEXT_BUFFER_LENGTH, "Resource Revision: %d\n", ResourceInfo->ResourceRev); oh_append_bigtext(&working, str); found++; } if (ResourceInfo->SpecificVer) { oh_append_offset(&working, offsets); snprintf(str, SAHPI_MAX_TEXT_BUFFER_LENGTH, "Specific Version: %d\n", ResourceInfo->SpecificVer); oh_append_bigtext(&working, str); found++; } if (ResourceInfo->DeviceSupport) { oh_append_offset(&working, offsets); snprintf(str, SAHPI_MAX_TEXT_BUFFER_LENGTH, "Device Support: %x\n", ResourceInfo->DeviceSupport); oh_append_bigtext(&working, str); found++; } if (ResourceInfo->ManufacturerId) { oh_append_offset(&working, offsets); snprintf(str, SAHPI_MAX_TEXT_BUFFER_LENGTH, "Manufacturer ID: "); oh_append_bigtext(&working, str); oh_decode_manufacturerid(ResourceInfo->ManufacturerId, &tmpbuffer); oh_append_bigtext(&working, (char *)tmpbuffer.Data); oh_append_bigtext(&working, "\n"); found++; } if (ResourceInfo->ProductId) { oh_append_offset(&working, offsets); snprintf(str, SAHPI_MAX_TEXT_BUFFER_LENGTH, "Product ID: %d\n", ResourceInfo->ProductId); oh_append_bigtext(&working, str); found++; } if (ResourceInfo->FirmwareMajorRev) { oh_append_offset(&working, offsets); snprintf(str, SAHPI_MAX_TEXT_BUFFER_LENGTH, "Firmware Major Revision: %d\n", ResourceInfo->FirmwareMajorRev); oh_append_bigtext(&working, str); found++; } if (ResourceInfo->FirmwareMinorRev) { oh_append_offset(&working, offsets); snprintf(str, SAHPI_MAX_TEXT_BUFFER_LENGTH, "Firmware Minor Revision: %d\n", ResourceInfo->FirmwareMinorRev); oh_append_bigtext(&working, str); found++; } if (ResourceInfo->AuxFirmwareRev) { oh_append_offset(&working, offsets); snprintf(str, SAHPI_MAX_TEXT_BUFFER_LENGTH, "Aux Firmware Revision: %d\n", ResourceInfo->AuxFirmwareRev); oh_append_bigtext(&working, str); found++; } { SaHpiGuidT empty_guid; memset(empty_guid, 0, sizeof(SaHpiGuidT)); if (memcmp(empty_guid, ResourceInfo->Guid, sizeof(SaHpiGuidT))) { #if defined(__sun) && defined(__SVR4) uuid_unparse((unsigned char *)ResourceInfo->Guid, tempstr); #else uuid_unparse(ResourceInfo->Guid, tempstr); #endif oh_append_offset(&working, offsets); snprintf(str, SAHPI_MAX_TEXT_BUFFER_LENGTH, "GUID: %s\n", tempstr); oh_append_bigtext(&working, str); found++; } } if (!found) { oh_init_bigtext(&working); oh_append_bigtext(&working, "None\n"); } oh_append_bigtext(buffer, (char *)working.Data); return(SA_OK); } static SaErrorT oh_build_sensorrec(oh_big_textbuffer *buffer, const SaHpiSensorRecT *sensor, int offsets) { char str[SAHPI_MAX_TEXT_BUFFER_LENGTH]; SaErrorT err; SaHpiTextBufferT tmpbuffer; /* Sensor Num */ oh_append_offset(buffer, offsets); snprintf(str, SAHPI_MAX_TEXT_BUFFER_LENGTH, "Sensor Num: %d (%x hex)\n", sensor->Num, sensor->Num); oh_append_bigtext(buffer, str); offsets++; /* Sensor Type */ oh_append_offset(buffer, offsets); snprintf(str, SAHPI_MAX_TEXT_BUFFER_LENGTH, "Type: %s\n", oh_lookup_sensortype(sensor->Type)); oh_append_bigtext(buffer, str); /* Sensor Category */ oh_append_offset(buffer, offsets); snprintf(str, SAHPI_MAX_TEXT_BUFFER_LENGTH, "Category: %s\n", oh_lookup_eventcategory(sensor->Category)); oh_append_bigtext(buffer, str); /* Sensor Enable Control */ oh_append_offset(buffer, offsets); snprintf(str, SAHPI_MAX_TEXT_BUFFER_LENGTH, "EnableCtrl: %s\n", (sensor->EnableCtrl == SAHPI_TRUE) ? "TRUE" : "FALSE"); oh_append_bigtext(buffer, str); /* Sensor Event Control */ oh_append_offset(buffer, offsets); snprintf(str, SAHPI_MAX_TEXT_BUFFER_LENGTH, "EventCtrl: %s\n", oh_lookup_sensoreventctrl(sensor->EventCtrl)); oh_append_bigtext(buffer, str); /* Sensor Supported Events */ oh_append_offset(buffer, offsets); oh_append_bigtext(buffer, "Events: "); err = oh_decode_eventstate(sensor->Events, sensor->Category, &tmpbuffer); if (err) {oh_append_bigtext(buffer, "\n"); return(err); } oh_append_bigtext(buffer, (char *)tmpbuffer.Data); oh_append_bigtext(buffer, "\n"); /* Sensor Data Format */ err = oh_build_sensordataformat(buffer, &(sensor->DataFormat), offsets); if (err) { return(err); } /* Sensor Threshold Definition */ err = oh_build_sensorthddefn(buffer, &(sensor->ThresholdDefn), offsets); if (err) { return(err); } /* Sensor OEM Data */ oh_append_offset(buffer, offsets); snprintf(str, SAHPI_MAX_TEXT_BUFFER_LENGTH, "OEM: %x\n", sensor->Oem); oh_append_bigtext(buffer, str); /* printf("SENSOR LENGTH = %d\n", strlen(buffer->Data)); */ return(SA_OK); } static SaErrorT oh_build_sensordataformat(oh_big_textbuffer *buffer, const SaHpiSensorDataFormatT *format, int offsets) { char str[SAHPI_MAX_TEXT_BUFFER_LENGTH]; SaErrorT err; SaHpiTextBufferT reading_buffer; /* Sensor Data Format Title */ oh_append_offset(buffer, offsets); oh_append_bigtext(buffer, "Data Format:\n"); offsets++; /* Sensor Data Format IsSupported */ oh_append_offset(buffer, offsets); snprintf(str, SAHPI_MAX_TEXT_BUFFER_LENGTH, "IsSupported: %s\n", (format->IsSupported == SAHPI_TRUE) ? "TRUE" : "FALSE"); oh_append_bigtext(buffer, str); if (format->IsSupported) { /* Sensor Data Format Reading Type */ oh_append_offset(buffer, offsets); snprintf(str, SAHPI_MAX_TEXT_BUFFER_LENGTH, "Reading Type: %s\n", oh_lookup_sensorreadingtype(format->ReadingType)); oh_append_bigtext(buffer, str); if (format->ReadingType != SAHPI_SENSOR_READING_TYPE_BUFFER) { /* Sensor Data Format Base Units */ oh_append_offset(buffer, offsets); snprintf(str, SAHPI_MAX_TEXT_BUFFER_LENGTH, "Base Unit: %s\n", oh_lookup_sensorunits(format->BaseUnits)); oh_append_bigtext(buffer, str); /* Sensor Data Format Modifier Units */ if (format->ModifierUnits) { oh_append_offset(buffer, offsets); snprintf(str, SAHPI_MAX_TEXT_BUFFER_LENGTH, "Modifier Unit: %s\n", oh_lookup_sensorunits(format->ModifierUnits)); oh_append_bigtext(buffer, str); /* Sensor Data Format Modifier Use */ oh_append_offset(buffer, offsets); snprintf(str, SAHPI_MAX_TEXT_BUFFER_LENGTH, "Modifier Use: %s\n", oh_lookup_sensormodunituse(format->ModifierUse)); oh_append_bigtext(buffer, str); } /* Sensor Data Format Percentage */ oh_append_offset(buffer, offsets); snprintf(str, SAHPI_MAX_TEXT_BUFFER_LENGTH, "Percentage: %s\n", (format->Percentage == SAHPI_TRUE) ? "TRUE" : "FALSE"); oh_append_bigtext(buffer, str); /* Sensor Data Format Max Range */ if (format->Range.Flags & SAHPI_SRF_MAX && format->Range.Max.IsSupported) { oh_append_offset(buffer, offsets); oh_append_bigtext(buffer, "Range Max: "); err = oh_decode_sensorreading(format->Range.Max, *format, &reading_buffer); if (err) { return(err); } oh_append_bigtext(buffer, (char *)reading_buffer.Data); oh_append_bigtext(buffer, "\n"); } /* Sensor Data Format Min Range */ if (format->Range.Flags & SAHPI_SRF_MIN && format->Range.Min.IsSupported) { oh_append_offset(buffer, offsets); oh_append_bigtext(buffer, "Range Min: "); err = oh_decode_sensorreading(format->Range.Min, *format, &reading_buffer); if (err) { return(err); } oh_append_bigtext(buffer, (char *)reading_buffer.Data); oh_append_bigtext(buffer, "\n"); } /* Sensor Data Format Nominal Range */ if (format->Range.Flags & SAHPI_SRF_NOMINAL && format->Range.Nominal.IsSupported) { oh_append_offset(buffer, offsets); oh_append_bigtext(buffer, "Range Nominal: "); err = oh_decode_sensorreading(format->Range.Nominal, *format, &reading_buffer); if (err) { return(err); } oh_append_bigtext(buffer, (char *)reading_buffer.Data); oh_append_bigtext(buffer, "\n"); } /* Sensor Data Format Normal Max Range */ if (format->Range.Flags & SAHPI_SRF_NORMAL_MAX && format->Range.NormalMax.IsSupported) { oh_append_offset(buffer, offsets); oh_append_bigtext(buffer, "Range Normal Max: "); err = oh_decode_sensorreading(format->Range.NormalMax, *format, &reading_buffer); if (err) { return(err); } oh_append_bigtext(buffer, (char *)reading_buffer.Data); oh_append_bigtext(buffer, "\n"); } /* Sensor Data Format Normal Min Range */ if (format->Range.Flags & SAHPI_SRF_NORMAL_MIN && format->Range.NormalMin.IsSupported) { oh_append_offset(buffer, offsets); oh_append_bigtext(buffer, "Range Normal Min: "); err = oh_decode_sensorreading(format->Range.NormalMin, *format, &reading_buffer); if (err) { return(err); } oh_append_bigtext(buffer, (char *)reading_buffer.Data); oh_append_bigtext(buffer, "\n"); } /* Sensor Data Format Accuracy Factor */ oh_append_offset(buffer, offsets); snprintf(str, SAHPI_MAX_TEXT_BUFFER_LENGTH, "Accuracy: %lf\n", format->AccuracyFactor); oh_append_bigtext(buffer, str); } } return(SA_OK); } static SaErrorT oh_build_sensorthddefn(oh_big_textbuffer *buffer, const SaHpiSensorThdDefnT *tdef, int offsets) { char str[SAHPI_MAX_TEXT_BUFFER_LENGTH]; SaErrorT err; /* Sensor Threshold Definition Title */ oh_append_offset(buffer, offsets); oh_append_bigtext(buffer, "Threshold Definitions:\n"); offsets++; /* Sensor Threshold Definition IsAccessible */ oh_append_offset(buffer, offsets); snprintf(str, SAHPI_MAX_TEXT_BUFFER_LENGTH, "IsAccessible: %s\n", (tdef->IsAccessible == SAHPI_TRUE) ? "TRUE" : "FALSE"); oh_append_bigtext(buffer, str); if (tdef->IsAccessible) { /* Sensor Threshold Read Threshold */ if (tdef->ReadThold) { oh_append_offset(buffer, offsets); oh_append_bigtext(buffer, "Readable Thresholds:\n"); err = oh_build_threshold_mask(buffer, tdef->ReadThold, offsets + 1); if (err) { return(err); } } /* Sensor Threshold Write Threshold */ if (tdef->WriteThold) { oh_append_offset(buffer, offsets); oh_append_bigtext(buffer, "Writeable Thresholds:\n"); err = oh_build_threshold_mask(buffer, tdef->WriteThold, offsets + 1); if (err) { return(err); } } /* Sensor Threshold Nonlinear */ oh_append_offset(buffer, offsets); snprintf(str, SAHPI_MAX_TEXT_BUFFER_LENGTH, "Nonlinear: %s\n", (tdef->Nonlinear == SAHPI_TRUE) ? "TRUE" : "FALSE"); oh_append_bigtext(buffer, str); } return(SA_OK); } SaErrorT oh_build_threshold_mask(oh_big_textbuffer *buffer, const SaHpiSensorThdMaskT tmask, int offsets) { oh_append_offset(buffer, offsets); if (tmask == 0) { oh_append_bigtext(buffer, "None"); oh_append_bigtext(buffer, "\n"); return SA_OK; } if (tmask & SAHPI_STM_LOW_MINOR) { oh_append_bigtext(buffer, "LOW_MINOR"); oh_append_bigtext(buffer, OH_ENCODE_DELIMITER); } if (tmask & SAHPI_STM_LOW_MAJOR) { oh_append_bigtext(buffer, "LOW_MAJOR"); oh_append_bigtext(buffer, OH_ENCODE_DELIMITER); } if (tmask & SAHPI_STM_LOW_CRIT) { oh_append_bigtext(buffer, "LOW_CRIT"); oh_append_bigtext(buffer, OH_ENCODE_DELIMITER); } if (tmask & SAHPI_STM_LOW_HYSTERESIS) { oh_append_bigtext(buffer, "LOW_HYSTERESIS"); oh_append_bigtext(buffer, OH_ENCODE_DELIMITER); } if (tmask & SAHPI_STM_UP_MINOR) { oh_append_bigtext(buffer, "UP_MINOR"); oh_append_bigtext(buffer, OH_ENCODE_DELIMITER); } if (tmask & SAHPI_STM_UP_MAJOR) { oh_append_bigtext(buffer, "UP_MAJOR"); oh_append_bigtext(buffer, OH_ENCODE_DELIMITER); } if (tmask & SAHPI_STM_UP_CRIT) { oh_append_bigtext(buffer, "UP_CRIT"); oh_append_bigtext(buffer, OH_ENCODE_DELIMITER); } if (tmask & SAHPI_STM_UP_HYSTERESIS) { oh_append_bigtext(buffer, "UP_HYSTERESIS"); oh_append_bigtext(buffer, OH_ENCODE_DELIMITER); } /* Remove last delimiter; add NL */ buffer->Data[buffer->DataLength-OH_ENCODE_DELIMITER_LENGTH] = '\0'; buffer->DataLength = buffer->DataLength - OH_ENCODE_DELIMITER_LENGTH; oh_append_bigtext(buffer, "\n"); return(SA_OK); } /** * oh_fprint_idrfield: * @stream: File handle. * @thisfield: Pointer to SaHpiIdrFieldT to be printed. * @offsets: Number of offsets to start printing structure. * * Prints the member data contained in SaHpiIdrFieldT struct to a file. * The MACRO oh_print_idrfield(), uses this function to print to STDOUT. * * Returns: * SA_OK - Normal operation. **/ SaErrorT oh_fprint_idrfield(FILE *stream, const SaHpiIdrFieldT *thisfield, int offsets) { char str[SAHPI_MAX_TEXT_BUFFER_LENGTH+1]; oh_big_textbuffer mybuf; SaErrorT err; if (!stream || !thisfield) return(SA_ERR_HPI_INVALID_PARAMS); oh_init_bigtext(&mybuf); oh_append_offset(&mybuf, offsets); snprintf(str, SAHPI_MAX_TEXT_BUFFER_LENGTH, "Field Id: %d\n", thisfield->FieldId); oh_append_bigtext(&mybuf, str); oh_append_offset(&mybuf, offsets); snprintf(str, SAHPI_MAX_TEXT_BUFFER_LENGTH, "Field Type: %s\n", oh_lookup_idrfieldtype(thisfield->Type)); oh_append_bigtext(&mybuf, str); oh_append_offset(&mybuf, offsets); snprintf(str, SAHPI_MAX_TEXT_BUFFER_LENGTH, "ReadOnly: %s\n", (thisfield->ReadOnly == SAHPI_TRUE) ? "TRUE" : "FALSE"); oh_append_bigtext(&mybuf, str); oh_append_offset(&mybuf, offsets); snprintf(str, SAHPI_MAX_TEXT_BUFFER_LENGTH, "Data Type: %s\n", oh_lookup_texttype(thisfield->Field.DataType)); oh_append_bigtext(&mybuf, str); oh_append_offset(&mybuf, offsets); snprintf(str, SAHPI_MAX_TEXT_BUFFER_LENGTH, "Language: %s\n", oh_lookup_language(thisfield->Field.Language)); oh_append_bigtext(&mybuf, str); oh_append_offset(&mybuf, offsets); oh_append_bigtext(&mybuf, "Content: "); if (thisfield->Field.DataLength == 0) oh_append_bigtext(&mybuf, "NULL\n"); else { if (thisfield->Field.DataType == SAHPI_TL_TYPE_BINARY) oh_append_data(&mybuf, thisfield->Field.Data, thisfield->Field.DataLength); else { memcpy( str, thisfield->Field.Data, thisfield->Field.DataLength ); str[thisfield->Field.DataLength] = '\0'; oh_append_bigtext(&mybuf, str); } } err = oh_fprint_bigtext(stream, &mybuf); return(err); } /** * oh_fprint_idrareaheader: * @stream: File handle. * @areaheader: Pointer to SaHpiIdrAreaHeaderT to be printed. * @offsets: Number of offsets to start printing structure. * * Prints the member data contained in SaHpiIdrAreaHeaderT struct to a file. * The MACRO oh_print_idrareaheader(), uses this function to print to STDOUT. * * Returns: * SA_OK - Normal operation. **/ SaErrorT oh_fprint_idrareaheader(FILE *stream, const SaHpiIdrAreaHeaderT *areaheader, int offsets) { char str[SAHPI_MAX_TEXT_BUFFER_LENGTH]; oh_big_textbuffer mybuf; SaErrorT err; if (!stream || !areaheader) return(SA_ERR_HPI_INVALID_PARAMS); oh_init_bigtext(&mybuf); oh_append_offset(&mybuf, offsets); snprintf(str, SAHPI_MAX_TEXT_BUFFER_LENGTH, "AreaId: %d\n", areaheader->AreaId); oh_append_bigtext(&mybuf, str); oh_append_offset(&mybuf, offsets); snprintf(str, SAHPI_MAX_TEXT_BUFFER_LENGTH, "AreaType: %s\n", oh_lookup_idrareatype(areaheader->Type)); oh_append_bigtext(&mybuf, str); oh_append_offset(&mybuf, offsets); snprintf(str, SAHPI_MAX_TEXT_BUFFER_LENGTH, "ReadOnly: %s\n", (areaheader->ReadOnly == SAHPI_TRUE) ? "TRUE" : "FALSE" ); oh_append_bigtext(&mybuf, str); oh_append_offset(&mybuf, offsets); snprintf(str, SAHPI_MAX_TEXT_BUFFER_LENGTH, "NumFields: %d\n", areaheader->NumFields); oh_append_bigtext(&mybuf, str); err = oh_fprint_bigtext(stream, &mybuf); return(err); } /** * oh_fprint_idrinfo: * @stream: File handle. * @idrinfo: Pointer to SaHpiIdrInfoT to be printed. * @offsets: Number of offsets to start printing structure. * * Prints the member data contained in SaHpiIdrInfoT struct to a file. * The MACRO oh_print_idrinfo(), uses this function to print to STDOUT. * * Returns: * SA_OK - Normal operation. * SA_ERR_HPI_INVALID_PARAMS - Pointer parameter(s) are NULL. **/ SaErrorT oh_fprint_idrinfo(FILE *stream, const SaHpiIdrInfoT *idrinfo, int offsets) { SaErrorT err; char str[SAHPI_MAX_TEXT_BUFFER_LENGTH]; oh_big_textbuffer mybuf; if (!stream || !idrinfo) { err("Invalid parameter."); return(SA_ERR_HPI_INVALID_PARAMS); } oh_init_bigtext(&mybuf); oh_append_offset(&mybuf, offsets); snprintf(str, SAHPI_MAX_TEXT_BUFFER_LENGTH, "IdrId: %d\n", idrinfo->IdrId); oh_append_bigtext(&mybuf, str); oh_append_offset(&mybuf, offsets); snprintf(str, SAHPI_MAX_TEXT_BUFFER_LENGTH, "UpdateCount: %d\n", idrinfo->UpdateCount); oh_append_bigtext(&mybuf, str); oh_append_offset(&mybuf, offsets); snprintf(str, SAHPI_MAX_TEXT_BUFFER_LENGTH, "ReadOnly: %s\n", (idrinfo->ReadOnly == SAHPI_TRUE) ? "TRUE" : "FALSE" ); oh_append_bigtext(&mybuf, str); oh_append_offset(&mybuf, offsets); snprintf(str, SAHPI_MAX_TEXT_BUFFER_LENGTH, "NumAreas: %d\n", idrinfo->NumAreas); oh_append_bigtext(&mybuf, str); err = oh_fprint_bigtext(stream, &mybuf); return(err); } SaErrorT oh_fprint_textbuffer(FILE *stream, const SaHpiTextBufferT *textbuffer, int offsets) { SaErrorT err; oh_big_textbuffer buffer; if (!stream || !textbuffer) { err("Invalid parameter."); return(SA_ERR_HPI_INVALID_PARAMS); } oh_init_bigtext(&buffer); err = oh_build_textbuffer(&buffer, textbuffer, offsets); if (err) { return(err); } err = oh_fprint_bigtext(stream, &buffer); return(err); } static SaErrorT oh_build_textbuffer(oh_big_textbuffer *buffer, const SaHpiTextBufferT *textbuffer, int offsets) { char str[SAHPI_MAX_TEXT_BUFFER_LENGTH]; SaHpiTextBufferT working_textbuffer; memset(&working_textbuffer, 0, sizeof(working_textbuffer)); oh_copy_textbuffer(&working_textbuffer, textbuffer); /* Text Buffer Data Type */ oh_append_offset(buffer, offsets); snprintf(str, SAHPI_MAX_TEXT_BUFFER_LENGTH, "Data Type: %s\n", oh_lookup_texttype(textbuffer->DataType)); oh_append_bigtext(buffer, str); /* Text Buffer Language */ oh_append_offset(buffer, offsets); snprintf(str, SAHPI_MAX_TEXT_BUFFER_LENGTH, "Language: %s\n", oh_lookup_language(textbuffer->Language)); oh_append_bigtext(buffer, str); /* Text Buffer Data Length */ oh_append_offset(buffer, offsets); snprintf(str, SAHPI_MAX_TEXT_BUFFER_LENGTH, "Data Length: %d\n", textbuffer->DataLength); oh_append_bigtext(buffer, str); /* Text Buffer Data */ if (textbuffer->DataLength) { oh_append_offset(buffer, offsets); memset(str, 0, SAHPI_MAX_TEXT_BUFFER_LENGTH); oh_append_bigtext(buffer, "Data: "); if (textbuffer->DataType == SAHPI_TL_TYPE_BINARY) oh_append_data(buffer, textbuffer->Data, textbuffer->DataLength); else { working_textbuffer.Data[working_textbuffer.DataLength] = '\0'; oh_append_bigtext(buffer, (const char *)&working_textbuffer.Data); } oh_append_bigtext(buffer, "\n"); } return(SA_OK); } /** * oh_decode_capabilities: * @ResourceCapabilities: enum value of type SaHpiCapabilitiesT. * @buffer: Location to store the string. * * Converts @ResourceCapabilities type into a string based on * @ResourceCapabilities HPI definition. For example: * @ResourceCapabilities = SAHPI_CAPABILITY_RESOURCE | SAHPI_CAPABILITY_EVENT_LOG * returns a string "RESOURCE | EVENT_LOG". * * Returns: * SA_OK - Normal operation. * SA_ERR_HPI_INVALID_PARAMS - @buffer is NULL **/ SaErrorT oh_decode_capabilities(SaHpiCapabilitiesT ResourceCapabilities, SaHpiTextBufferT *buffer) { int found; SaErrorT err; SaHpiTextBufferT working; if (!buffer) { err("Invalid parameter."); return(SA_ERR_HPI_INVALID_PARAMS); } err = oh_init_textbuffer(&working); if (err) { return(err); } found = 0; if (ResourceCapabilities & SAHPI_CAPABILITY_AGGREGATE_STATUS) { found++; err = oh_append_textbuffer(&working, "AGGREGATE_STATUS | "); if (err) { return(err); } } if (ResourceCapabilities & SAHPI_CAPABILITY_ANNUNCIATOR) { found++; err = oh_append_textbuffer(&working, "ANNUNCIATOR | "); if (err) { return(err); } } if (ResourceCapabilities & SAHPI_CAPABILITY_CONFIGURATION) { found++; err = oh_append_textbuffer(&working, "CONFIGURATION | "); if (err) { return(err); } } if (ResourceCapabilities & SAHPI_CAPABILITY_CONTROL) { found++; err = oh_append_textbuffer(&working, "CONTROL | "); if (err) { return(err); } } if (ResourceCapabilities & SAHPI_CAPABILITY_DIMI) { found++; err = oh_append_textbuffer(&working, "DIMI | "); if (err) { return(err); } } if (ResourceCapabilities & SAHPI_CAPABILITY_EVENT_LOG) { found++; err = oh_append_textbuffer(&working, "EVENT_LOG | "); if (err) { return(err); } } if (ResourceCapabilities & SAHPI_CAPABILITY_EVT_DEASSERTS) { found++; err = oh_append_textbuffer(&working, "EVT_DEASSERTS | "); if (err) { return(err); } } if (ResourceCapabilities & SAHPI_CAPABILITY_FRU) { found++; err = oh_append_textbuffer(&working, "FRU | "); if (err) { return(err); } } if (ResourceCapabilities & SAHPI_CAPABILITY_FUMI) { found++; err = oh_append_textbuffer(&working, "FUMI | "); if (err) { return(err); } } if (ResourceCapabilities & SAHPI_CAPABILITY_INVENTORY_DATA) { found++; err = oh_append_textbuffer(&working, "INVENTORY_DATA | "); if (err) { return(err); } } if (ResourceCapabilities & SAHPI_CAPABILITY_MANAGED_HOTSWAP) { found++; err = oh_append_textbuffer(&working, "MANAGED_HOTSWAP | "); if (err) { return(err); } } if (ResourceCapabilities & SAHPI_CAPABILITY_POWER) { found++; err = oh_append_textbuffer(&working, "POWER | "); if (err) { return(err); } } if (ResourceCapabilities & SAHPI_CAPABILITY_RDR) { found++; err = oh_append_textbuffer(&working, "RDR | "); if (err) { return(err); } } if (ResourceCapabilities & SAHPI_CAPABILITY_RESET) { found++; err = oh_append_textbuffer(&working, "RESET | "); if (err) { return(err); } } if (ResourceCapabilities & SAHPI_CAPABILITY_RESOURCE) { found++; err = oh_append_textbuffer(&working, "RESOURCE | "); if (err) { return(err); } } if (ResourceCapabilities & SAHPI_CAPABILITY_SENSOR) { found++; err = oh_append_textbuffer(&working, "SENSOR | "); if (err) { return(err); } } if (ResourceCapabilities & SAHPI_CAPABILITY_WATCHDOG) { found++; err = oh_append_textbuffer(&working, "WATCHDOG | "); if (err) { return(err); } } if (found) { working.DataLength -= OH_ENCODE_DELIMITER_LENGTH; working.Data[working.DataLength] = 0; } oh_copy_textbuffer(buffer, &working); return(SA_OK); } /** * oh_decode_hscapabilities: * @HsCapabilities: enum value of type SaHpiHsCapabilitiesT. * @buffer: Location to store the string. * * Converts @HsCapabilities type into a string based on HPI definition. For example: * @HsCapabilities = SAHPI_HS_CAPABILITY_AUTOEXTRACT_READ_ONLY | SAHPI_HS_CAPABILITY_INDICATOR_SUPPORTED * returns a string "AUTOEXTRACT_READ_ONLY | INDICATOR_SUPPORTED". * * Returns: * SA_OK - Normal operation. * SA_ERR_HPI_INVALID_PARAMS - @buffer is NULL **/ SaErrorT oh_decode_hscapabilities(SaHpiHsCapabilitiesT HsCapabilities, SaHpiTextBufferT *buffer) { int found; SaErrorT err; SaHpiTextBufferT working; if (!buffer) { err("Invalid parameter."); return(SA_ERR_HPI_INVALID_PARAMS); } err = oh_init_textbuffer(&working); if (err) { return(err); } found = 0; if (HsCapabilities & SAHPI_HS_CAPABILITY_AUTOEXTRACT_READ_ONLY) { found++; err = oh_append_textbuffer(&working, "AUTOEXTRACT_READ_ONLY | "); if (err) { return(err); } } if (HsCapabilities & SAHPI_HS_CAPABILITY_INDICATOR_SUPPORTED) { found++; err = oh_append_textbuffer(&working, "INDICATOR_SUPPORTED | "); if (err) { return(err); } } if (found) { working.DataLength -= OH_ENCODE_DELIMITER_LENGTH; working.Data[working.DataLength] = 0; } else { oh_append_textbuffer(&working, "None"); } oh_copy_textbuffer(buffer, &working); return(SA_OK); } /** * oh_fprint_rptentry: * @stream: File handle. * @rptentry: Pointer to SaHpiRptEntryT to be printed. * @offsets: Number of offsets to start printing structure. * * Prints the member data contained in SaHpiRptEntryT struct to a file. * The MACRO oh_print_rptentry(), uses this function to print to STDOUT. * * Returns: * SA_OK - Normal operation. **/ SaErrorT oh_fprint_rptentry(FILE *stream, const SaHpiRptEntryT *rptentry, int offsets) { SaErrorT err = SA_OK; oh_big_textbuffer mybuf; SaHpiTextBufferT tmpbuffer; char* str = (char *)tmpbuffer.Data; if (!stream || !rptentry) { err("Invalid parameter."); return(SA_ERR_HPI_INVALID_PARAMS); } oh_init_bigtext(&mybuf); offsets++; oh_append_offset(&mybuf, offsets); snprintf(str, SAHPI_MAX_TEXT_BUFFER_LENGTH, "EntryId: %d\n", rptentry->EntryId); oh_append_bigtext(&mybuf, str); oh_append_offset(&mybuf, offsets); snprintf(str, SAHPI_MAX_TEXT_BUFFER_LENGTH, "ResourceId: %d\n", rptentry->ResourceId); oh_append_bigtext(&mybuf, str); err = oh_build_resourceinfo(&mybuf, &(rptentry->ResourceInfo), offsets); if (err) { return(err); } oh_append_offset(&mybuf, offsets); snprintf(str, SAHPI_MAX_TEXT_BUFFER_LENGTH, "Entity Path: "); oh_append_bigtext(&mybuf, str); { oh_big_textbuffer tmpbuf; oh_init_bigtext(&tmpbuf); oh_decode_entitypath(&rptentry->ResourceEntity, &tmpbuf); oh_append_bigtext(&mybuf, (char *)tmpbuf.Data); } oh_append_bigtext(&mybuf, "\n"); oh_append_offset(&mybuf, offsets); snprintf(str, SAHPI_MAX_TEXT_BUFFER_LENGTH, "Capabilities: \n"); oh_append_bigtext(&mybuf, str); oh_append_offset(&mybuf, offsets + 1); oh_decode_capabilities(rptentry->ResourceCapabilities, &tmpbuffer); oh_append_bigtext(&mybuf, (char *)tmpbuffer.Data); oh_append_bigtext(&mybuf, "\n"); oh_append_offset(&mybuf, offsets); snprintf(str, SAHPI_MAX_TEXT_BUFFER_LENGTH, "HotSwap Capabilities: "); oh_append_bigtext(&mybuf, str); oh_decode_hscapabilities(rptentry->HotSwapCapabilities, &tmpbuffer); oh_append_bigtext(&mybuf, (char *)tmpbuffer.Data); oh_append_bigtext(&mybuf, "\n"); oh_append_offset(&mybuf, offsets); snprintf(str, SAHPI_MAX_TEXT_BUFFER_LENGTH, "Resource Severity: %s\n", oh_lookup_severity(rptentry->ResourceSeverity)); oh_append_bigtext(&mybuf, str); oh_append_offset(&mybuf, offsets); snprintf(str, SAHPI_MAX_TEXT_BUFFER_LENGTH, "ResourceFailed: %s\n", (rptentry->ResourceFailed == SAHPI_TRUE) ? "TRUE" : "FALSE" ); oh_append_bigtext(&mybuf, str); oh_append_offset(&mybuf, offsets); snprintf(str, SAHPI_MAX_TEXT_BUFFER_LENGTH, "ResourceTag:\n"); oh_append_bigtext(&mybuf, str); oh_build_textbuffer(&mybuf, &(rptentry->ResourceTag), offsets + 1); err = oh_fprint_bigtext(stream, &mybuf); return(err); } /** * oh_fprint_rdr: * @stream: File handle. * @thisrdr: Pointer to SaHpiRdrT to be printed. * @offsets: Number of offsets to start printing structure. * * Prints the member data contained in SaHpiRdrT struct to a file. * The MACRO oh_print_rdr(), uses this function to print to STDOUT. * * Returns: * SA_OK - Normal operation. * SA_ERR_HPI_INVALID_PARAMS - Pointer parameter(s) are NULL. **/ SaErrorT oh_fprint_rdr(FILE *stream, const SaHpiRdrT *thisrdr, int offsets) { SaErrorT err; char str[SAHPI_MAX_TEXT_BUFFER_LENGTH]; oh_big_textbuffer mybuf, mybuf1; if (!stream || !thisrdr) { err("Invalid parameter."); return(SA_ERR_HPI_INVALID_PARAMS); } oh_init_bigtext(&mybuf); oh_append_offset(&mybuf, offsets); snprintf(str, SAHPI_MAX_TEXT_BUFFER_LENGTH, "RecordId: %d\n", thisrdr->RecordId); oh_append_bigtext(&mybuf, str); oh_append_offset(&mybuf, offsets); snprintf(str, SAHPI_MAX_TEXT_BUFFER_LENGTH, "RdrType: %s\n", oh_lookup_rdrtype(thisrdr->RdrType)); oh_append_bigtext(&mybuf, str); oh_append_offset(&mybuf, offsets); snprintf(str, SAHPI_MAX_TEXT_BUFFER_LENGTH, "Entity Path: "); oh_append_bigtext(&mybuf, str); { oh_big_textbuffer tmpbuf; oh_init_bigtext(&tmpbuf); oh_decode_entitypath(&thisrdr->Entity, &tmpbuf); oh_append_bigtext(&mybuf, (char *)tmpbuf.Data); } oh_append_bigtext(&mybuf, "\n"); oh_append_offset(&mybuf, offsets); snprintf(str, SAHPI_MAX_TEXT_BUFFER_LENGTH, "IsFru: %s\n", (thisrdr->IsFru == SAHPI_TRUE) ? "TRUE" : "FALSE" ); oh_append_bigtext(&mybuf, str); oh_init_bigtext(&mybuf1); switch(thisrdr->RdrType) { case SAHPI_CTRL_RDR: err = oh_build_ctrlrec(&mybuf1, (const SaHpiCtrlRecT*) &thisrdr->RdrTypeUnion.CtrlRec, offsets); break; case SAHPI_SENSOR_RDR: err = oh_build_sensorrec(&mybuf1, (const SaHpiSensorRecT*) &thisrdr->RdrTypeUnion.SensorRec, offsets); break; case SAHPI_INVENTORY_RDR: err = oh_build_invrec(&mybuf1, (const SaHpiInventoryRecT*) &thisrdr->RdrTypeUnion.InventoryRec, offsets); break; case SAHPI_WATCHDOG_RDR: err = oh_build_wdogrec(&mybuf1, (const SaHpiWatchdogRecT*) &thisrdr->RdrTypeUnion.WatchdogRec, offsets); break; case SAHPI_ANNUNCIATOR_RDR: err = oh_build_annrec(&mybuf1, (const SaHpiAnnunciatorRecT*) &thisrdr->RdrTypeUnion.AnnunciatorRec, offsets); break; case SAHPI_DIMI_RDR: err = oh_build_dimirec(&mybuf1, (const SaHpiDimiRecT*) &thisrdr->RdrTypeUnion.DimiRec, offsets); break; case SAHPI_FUMI_RDR: err = oh_build_fumirec(&mybuf1, (const SaHpiFumiRecT*) &thisrdr->RdrTypeUnion.FumiRec, offsets); break; case SAHPI_NO_RECORD: oh_append_offset(&mybuf1, offsets); oh_append_bigtext(&mybuf1, oh_lookup_rdrtype(thisrdr->RdrType)); break; default: oh_append_bigtext(&mybuf1, "Invalid/Unknown RDR Type\n"); } oh_append_bigtext(&mybuf, (char *)mybuf1.Data); oh_append_offset(&mybuf, offsets); snprintf(str, SAHPI_MAX_TEXT_BUFFER_LENGTH, "IdString:\n"); oh_append_bigtext(&mybuf, str); oh_build_textbuffer(&mybuf, &(thisrdr->IdString), offsets + 1); err = oh_fprint_bigtext(stream, &mybuf); return(err); } /** * oh_build_ctrlrec: * @textbuff: Buffer into which to store flattened ctrl rec structure. * @thisrdrunion: Pointer to SaHpiRdrTypeUnionT to be flattened. * @offsets: Number of offsets to start printing structure. * * Flatten member data contained in SaHpiCtrlRecT struct to a text buffer. * * Returns: * SA_OK - Normal operation. * SA_ERR_HPI_INVALID_PARAMS - Pointer parameter(s) are NULL. **/ static SaErrorT oh_build_ctrlrec(oh_big_textbuffer *textbuf, const SaHpiCtrlRecT *ctrlrec, int offsets) { SaErrorT err; char str[SAHPI_MAX_TEXT_BUFFER_LENGTH]; oh_big_textbuffer mybuf; SaHpiTextBufferT smallbuf; if (!textbuf || !ctrlrec) { err("Invalid parameter."); return(SA_ERR_HPI_INVALID_PARAMS); } oh_init_bigtext(&mybuf); oh_append_offset(&mybuf, offsets); snprintf(str, SAHPI_MAX_TEXT_BUFFER_LENGTH, "Control Num: %d (%x hex)\n", ctrlrec->Num, ctrlrec->Num); oh_append_bigtext(&mybuf, str); oh_append_offset(&mybuf, offsets); snprintf(str, SAHPI_MAX_TEXT_BUFFER_LENGTH, "Control Output Type: %s\n", oh_lookup_ctrloutputtype(ctrlrec->OutputType)); oh_append_bigtext(&mybuf, str); oh_append_offset(&mybuf, offsets); snprintf(str, SAHPI_MAX_TEXT_BUFFER_LENGTH, "Control Type: %s\n", oh_lookup_ctrltype(ctrlrec->Type)); oh_append_bigtext(&mybuf, str); oh_append_offset(&mybuf, offsets); switch(ctrlrec->Type) { case SAHPI_CTRL_TYPE_DIGITAL: snprintf(str, SAHPI_MAX_TEXT_BUFFER_LENGTH, "Digital Default: %s\n", oh_lookup_ctrlstatedigital(ctrlrec->TypeUnion.Digital.Default)); oh_append_bigtext(&mybuf, str); break; case SAHPI_CTRL_TYPE_DISCRETE: snprintf(str, SAHPI_MAX_TEXT_BUFFER_LENGTH, "Discrete Default: %d\n", ctrlrec->TypeUnion.Discrete.Default); oh_append_bigtext(&mybuf, str); break; case SAHPI_CTRL_TYPE_ANALOG: snprintf(str, SAHPI_MAX_TEXT_BUFFER_LENGTH, "Analog Min: %d\n", ctrlrec->TypeUnion.Analog.Min); oh_append_bigtext(&mybuf, str); oh_append_offset(&mybuf, offsets); snprintf(str, SAHPI_MAX_TEXT_BUFFER_LENGTH, "Analog Max: %d\n", ctrlrec->TypeUnion.Analog.Max); oh_append_bigtext(&mybuf, str); oh_append_offset(&mybuf, offsets); snprintf(str, SAHPI_MAX_TEXT_BUFFER_LENGTH, "Analog Default: %d\n", ctrlrec->TypeUnion.Analog.Default); oh_append_bigtext(&mybuf, str); break; case SAHPI_CTRL_TYPE_STREAM: snprintf(str, SAHPI_MAX_TEXT_BUFFER_LENGTH, "Stream Default:\n"); oh_append_bigtext(&mybuf, str); oh_append_offset(&mybuf, offsets + 1); snprintf(str, SAHPI_MAX_TEXT_BUFFER_LENGTH, "Repeat: %s\n", (ctrlrec->TypeUnion.Stream.Default.Repeat == SAHPI_TRUE) ? "TRUE" : "FALSE"); oh_append_bigtext(&mybuf, str); oh_append_offset(&mybuf, offsets + 1); snprintf(str, SAHPI_MAX_TEXT_BUFFER_LENGTH, "StreamLength: %d\n", ctrlrec->TypeUnion.Stream.Default.StreamLength); oh_append_bigtext(&mybuf, str); oh_append_offset(&mybuf, offsets + 1); snprintf(str, SAHPI_MAX_TEXT_BUFFER_LENGTH, "Stream Default: %s\n", ctrlrec->TypeUnion.Stream.Default.Stream); oh_append_bigtext(&mybuf, str); break; case SAHPI_CTRL_TYPE_TEXT: snprintf(str, SAHPI_MAX_TEXT_BUFFER_LENGTH, "Max Chars: %d\n", ctrlrec->TypeUnion.Text.MaxChars); oh_append_bigtext(&mybuf, str); oh_append_offset(&mybuf, offsets); snprintf(str, SAHPI_MAX_TEXT_BUFFER_LENGTH, "Max Lines: %d\n", ctrlrec->TypeUnion.Text.MaxLines); oh_append_bigtext(&mybuf, str); oh_append_offset(&mybuf, offsets); snprintf(str, SAHPI_MAX_TEXT_BUFFER_LENGTH, "Language: %s\n", oh_lookup_language(ctrlrec->TypeUnion.Text.Language)); oh_append_bigtext(&mybuf, str); oh_append_offset(&mybuf, offsets); snprintf(str, SAHPI_MAX_TEXT_BUFFER_LENGTH, "Data Type: %s\n", oh_lookup_texttype(ctrlrec->TypeUnion.Text.DataType)); oh_append_bigtext(&mybuf, str); oh_append_offset(&mybuf, offsets); snprintf(str, SAHPI_MAX_TEXT_BUFFER_LENGTH, "Default:\n"); oh_append_bigtext(&mybuf, str); oh_append_offset(&mybuf, offsets + 1); snprintf(str, SAHPI_MAX_TEXT_BUFFER_LENGTH, "Line: %d\n", ctrlrec->TypeUnion.Text.Default.Line); oh_append_bigtext(&mybuf, str); oh_build_textbuffer(&mybuf, &(ctrlrec->TypeUnion.Text.Default.Text), offsets + 1); break; case SAHPI_CTRL_TYPE_OEM: err = oh_decode_manufacturerid(ctrlrec->TypeUnion.Oem.MId, &smallbuf); snprintf(str, SAHPI_MAX_TEXT_BUFFER_LENGTH, "ManufacturerId: %s\n", smallbuf.Data); oh_append_bigtext(&mybuf, str); oh_append_offset(&mybuf, offsets); snprintf(str, SAHPI_MAX_TEXT_BUFFER_LENGTH, "ConfigData: %s\n", ctrlrec->TypeUnion.Oem.ConfigData); oh_append_bigtext(&mybuf, str); oh_append_offset(&mybuf, offsets); snprintf(str, SAHPI_MAX_TEXT_BUFFER_LENGTH, "Default:\n"); oh_append_bigtext(&mybuf, str); oh_append_offset(&mybuf, offsets + 1); err = oh_decode_manufacturerid(ctrlrec->TypeUnion.Oem.Default.MId, &smallbuf); snprintf(str, SAHPI_MAX_TEXT_BUFFER_LENGTH, "ManufacturerId: %s\n", smallbuf.Data); oh_append_bigtext(&mybuf, str); oh_append_offset(&mybuf, offsets + 1); snprintf(str, SAHPI_MAX_TEXT_BUFFER_LENGTH, "BodyLength: %d\n", ctrlrec->TypeUnion.Oem.Default.BodyLength); oh_append_bigtext(&mybuf, str); oh_append_offset(&mybuf, offsets + 1); snprintf(str, SAHPI_MAX_TEXT_BUFFER_LENGTH, "Body: %s\n", ctrlrec->TypeUnion.Oem.Default.Body); oh_append_bigtext(&mybuf, str); break; default: snprintf(str, SAHPI_MAX_TEXT_BUFFER_LENGTH, "Invalid ControlType Detected\n"); oh_append_bigtext(&mybuf, str); } oh_append_offset(&mybuf, offsets); snprintf(str, SAHPI_MAX_TEXT_BUFFER_LENGTH, "DefaultMode:\n"); oh_append_bigtext(&mybuf, str); oh_append_offset(&mybuf, offsets + 1); snprintf(str, SAHPI_MAX_TEXT_BUFFER_LENGTH, "Mode: %s\n", oh_lookup_ctrlmode(ctrlrec->DefaultMode.Mode)); oh_append_bigtext(&mybuf, str); oh_append_offset(&mybuf, offsets + 1); snprintf(str, SAHPI_MAX_TEXT_BUFFER_LENGTH, "ReadOnly: %s\n", (ctrlrec->DefaultMode.ReadOnly == SAHPI_TRUE) ? "TRUE" : "FALSE"); oh_append_bigtext(&mybuf, str); oh_append_offset(&mybuf, offsets); snprintf(str, SAHPI_MAX_TEXT_BUFFER_LENGTH, "WriteOnly: %s\n", (ctrlrec->WriteOnly == SAHPI_TRUE) ? "TRUE" : "FALSE"); oh_append_bigtext(&mybuf, str); oh_append_offset(&mybuf, offsets); snprintf(str, SAHPI_MAX_TEXT_BUFFER_LENGTH, "OEM: %d\n", ctrlrec->Oem); oh_append_bigtext(&mybuf, str); err = oh_copy_bigtext(textbuf, &mybuf); return(err); } /** * oh_build_invrec: * @textbuff: Buffer into which to store flattened ctrl rdr structure. * @invrec: Pointer to SaHpiInventoryRecT to be flattened. * @offsets: Number of offsets to start printing structure. * * Flatten member data contained in SaHpiInventoryRecT struct to a text buffer. * * Returns: * SA_OK - Normal operation. * SA_ERR_HPI_INVALID_PARAMS - Pointer parameter(s) are NULL. **/ static SaErrorT oh_build_invrec(oh_big_textbuffer *textbuff,const SaHpiInventoryRecT *invrec, int offsets) { SaErrorT err; char str[SAHPI_MAX_TEXT_BUFFER_LENGTH]; oh_big_textbuffer mybuf; if (!textbuff || !invrec) { err("Invalid parameter."); return(SA_ERR_HPI_INVALID_PARAMS); } oh_init_bigtext(&mybuf); oh_append_offset(&mybuf, offsets); snprintf(str, SAHPI_MAX_TEXT_BUFFER_LENGTH, "IdrId: %d\n",invrec->IdrId); oh_append_bigtext(&mybuf, str); oh_append_offset(&mybuf, offsets); snprintf(str, SAHPI_MAX_TEXT_BUFFER_LENGTH, "Persistent: %s\n", (invrec->Persistent == SAHPI_TRUE) ? "TRUE" : "FALSE" ); oh_append_bigtext(&mybuf, str); oh_append_offset(&mybuf, offsets); snprintf(str, SAHPI_MAX_TEXT_BUFFER_LENGTH, "Oem: %d\n",invrec->Oem); oh_append_bigtext(&mybuf, str); err = oh_copy_bigtext(textbuff, &mybuf); return(err); } /** * oh_build_wdogrec: * @textbuff: Buffer into which to store flattened watchdog rec structure. * @wdogrec: Pointer to SaHpiWatchdogRecT to be flattened. * @offsets: Number of offsets to start printing structure. * * Flatten member data contained in SaHpiWatchdogRecT struct to a text buffer. * * Returns: * SA_OK - Normal operation. * SA_ERR_HPI_INVALID_PARAMS - Pointer parameter(s) are NULL. **/ static SaErrorT oh_build_wdogrec(oh_big_textbuffer *textbuff,const SaHpiWatchdogRecT *wdogrec, int offsets) { SaErrorT err; char str[SAHPI_MAX_TEXT_BUFFER_LENGTH]; oh_big_textbuffer mybuf; if (!textbuff || !wdogrec) { err("Invalid parameter."); return(SA_ERR_HPI_INVALID_PARAMS); } oh_init_bigtext(&mybuf); oh_append_offset(&mybuf, offsets); snprintf(str, SAHPI_MAX_TEXT_BUFFER_LENGTH, "Watchdog Num: %d (%x hex)\n", wdogrec->WatchdogNum, wdogrec->WatchdogNum); oh_append_bigtext(&mybuf, str); oh_append_offset(&mybuf, offsets); snprintf(str, SAHPI_MAX_TEXT_BUFFER_LENGTH, "Oem: %d\n",wdogrec->Oem); oh_append_bigtext(&mybuf, str); err = oh_copy_bigtext(textbuff, &mybuf); return(err); } /** * oh_build_annrec: * @textbuff: Buffer into which to store flattened structure. * @annrec: Pointer to SaHpiAnnunciatorRecT to be flattened. * @offsets: Number of offsets to start printing structure. * * Flatten member data contained in SaHpiAnnunciatorRecT struct to a text buffer. * * Returns: * SA_OK - Normal operation. * SA_ERR_HPI_INVALID_PARAMS - Pointer parameter(s) are NULL. **/ static SaErrorT oh_build_annrec(oh_big_textbuffer *textbuff,const SaHpiAnnunciatorRecT *annrec, int offsets) { SaErrorT err; char str[SAHPI_MAX_TEXT_BUFFER_LENGTH]; oh_big_textbuffer mybuf; if (!textbuff || !annrec) { err("Invalid parameter."); return(SA_ERR_HPI_INVALID_PARAMS); } oh_init_bigtext(&mybuf); oh_append_offset(&mybuf, offsets); snprintf(str, SAHPI_MAX_TEXT_BUFFER_LENGTH, "Annunciator Num: %d (%x hex)\n", annrec->AnnunciatorNum, annrec->AnnunciatorNum); oh_append_bigtext(&mybuf, str); oh_append_offset(&mybuf, offsets); snprintf(str, SAHPI_MAX_TEXT_BUFFER_LENGTH, "Annunciator Type: %s\n", oh_lookup_annunciatortype(annrec->AnnunciatorType)); oh_append_bigtext(&mybuf, str); oh_append_offset(&mybuf, offsets); snprintf(str, SAHPI_MAX_TEXT_BUFFER_LENGTH, "ModeReadOnly: %s\n", (annrec->ModeReadOnly == SAHPI_TRUE) ? "TRUE" : "FALSE" ); oh_append_bigtext(&mybuf, str); oh_append_offset(&mybuf, offsets); snprintf(str, SAHPI_MAX_TEXT_BUFFER_LENGTH, "MaxCondition: %d\n", annrec->MaxConditions); oh_append_bigtext(&mybuf, str); oh_append_offset(&mybuf, offsets); snprintf(str, SAHPI_MAX_TEXT_BUFFER_LENGTH, "Oem: %d\n", annrec->Oem); oh_append_bigtext(&mybuf, str); err = oh_copy_bigtext(textbuff, &mybuf); return(err); } /** * oh_build_dimirec: * @textbuff: Buffer into which to store flattened structure. * @annrec: Pointer to SaHpiDimiRecT to be flattened. * @offsets: Number of offsets to start printing structure. * * Flatten member data contained in SaHpiDimiRecT struct to a text buffer. * * Returns: * SA_OK - Normal operation. * SA_ERR_HPI_INVALID_PARAMS - Pointer parameter(s) are NULL. **/ static SaErrorT oh_build_dimirec(oh_big_textbuffer *textbuff, const SaHpiDimiRecT *dimirec, int offsets) { SaErrorT err; char str[SAHPI_MAX_TEXT_BUFFER_LENGTH]; oh_big_textbuffer mybuf; if (!textbuff || !dimirec) { dbg("Invalid parameter."); return(SA_ERR_HPI_INVALID_PARAMS); } oh_init_bigtext(&mybuf); oh_append_offset(&mybuf, offsets); snprintf(str, SAHPI_MAX_TEXT_BUFFER_LENGTH, "DIMI Num: %d (%x hex)\n", dimirec->DimiNum, dimirec->DimiNum); oh_append_bigtext(&mybuf, str); oh_append_offset(&mybuf, offsets); snprintf(str, SAHPI_MAX_TEXT_BUFFER_LENGTH, "Oem: %d\n", dimirec->Oem); oh_append_bigtext(&mybuf, str); err = oh_copy_bigtext(textbuff, &mybuf); return(err); } /** * oh_decode_dimitestcapabilities: * @DimiTestCapabilities: enum value of type SaHpiDimiTestCapabilityT. * @buffer: Location to store the string. * * Converts @DimiTestCapabilities type into a string based on HPI definition. * * Returns: * SA_OK - Normal operation. * SA_ERR_HPI_INVALID_PARAMS - @buffer is NULL **/ SaErrorT oh_decode_dimitestcapabilities(SaHpiDimiTestCapabilityT capabilities, SaHpiTextBufferT *buffer) { int found; SaErrorT err; SaHpiTextBufferT working; if (!buffer) { dbg("Invalid parameter."); return(SA_ERR_HPI_INVALID_PARAMS); } err = oh_init_textbuffer(&working); if (err) { return(err); } found = 0; if (capabilities & SAHPI_DIMITEST_CAPABILITY_RESULTSOUTPUT) { found++; err = oh_append_textbuffer(&working, "RESULTS_OUTPUT | "); if (err) { return(err); } } if (capabilities & SAHPI_DIMITEST_CAPABILITY_SERVICEMODE) { found++; err = oh_append_textbuffer(&working, "SERVICE_MODE | "); if (err) { return(err); } } if (capabilities & SAHPI_DIMITEST_CAPABILITY_LOOPCOUNT) { found++; err = oh_append_textbuffer(&working, "LOOP_COUNT | "); if (err) { return(err); } } if (capabilities & SAHPI_DIMITEST_CAPABILITY_LOOPTIME) { found++; err = oh_append_textbuffer(&working, "LOOP_TIME | "); if (err) { return(err); } } if (capabilities & SAHPI_DIMITEST_CAPABILITY_LOGGING) { found++; err = oh_append_textbuffer(&working, "LOGGING | "); if (err) { return(err); } } if (capabilities & SAHPI_DIMITEST_CAPABILITY_TESTCANCEL) { found++; err = oh_append_textbuffer(&working, "TEST_CANCEL | "); if (err) { return(err); } } if (found) { working.DataLength -= OH_ENCODE_DELIMITER_LENGTH; working.Data[working.DataLength] = 0; } else { oh_append_textbuffer(&working, "None"); } oh_copy_textbuffer(buffer, &working); return(SA_OK); } /** * oh_decode_fumiprotocols: * @FumiProtocol: enum value of type SaHpiFumiProtocolT. * @buffer: Location to store the string. * * Converts @FumiProtocol type into a string based on HPI definition. * * Returns: * SA_OK - Normal operation. * SA_ERR_HPI_INVALID_PARAMS - @buffer is NULL **/ SaErrorT oh_decode_fumiprotocols(SaHpiFumiProtocolT protocols, SaHpiTextBufferT *buffer) { int found; SaErrorT err; SaHpiTextBufferT working; if (!buffer) { dbg("Invalid parameter."); return(SA_ERR_HPI_INVALID_PARAMS); } err = oh_init_textbuffer(&working); if (err) { return(err); } found = 0; if (protocols & SAHPI_FUMI_PROT_TFTP) { found++; err = oh_append_textbuffer(&working, "TFTP | "); if (err) { return(err); } } if (protocols & SAHPI_FUMI_PROT_FTP) { found++; err = oh_append_textbuffer(&working, "FTP | "); if (err) { return(err); } } if (protocols & SAHPI_FUMI_PROT_HTTP) { found++; err = oh_append_textbuffer(&working, "HTTP | "); if (err) { return(err); } } if (protocols & SAHPI_FUMI_PROT_LDAP) { found++; err = oh_append_textbuffer(&working, "LDAP | "); if (err) { return(err); } } if (protocols & SAHPI_FUMI_PROT_LOCAL) { found++; err = oh_append_textbuffer(&working, "LOCAL | "); if (err) { return(err); } } if (protocols & SAHPI_FUMI_PROT_NFS) { found++; err = oh_append_textbuffer(&working, "NFS | "); if (err) { return(err); } } if (protocols & SAHPI_FUMI_PROT_DBACCESS) { found++; err = oh_append_textbuffer(&working, "DBACCESS | "); if (err) { return(err); } } if (found) { working.DataLength -= OH_ENCODE_DELIMITER_LENGTH; working.Data[working.DataLength] = 0; } else { oh_append_textbuffer(&working, "None"); } oh_copy_textbuffer(buffer, &working); return(SA_OK); } /** * oh_decode_fumicapabilities: * @HsCapabilities: enum value of type SaHpiFumiCapabilityT. * @buffer: Location to store the string. * * Converts @FumiCapability type into a string based on HPI definition. * * Returns: * SA_OK - Normal operation. * SA_ERR_HPI_INVALID_PARAMS - @buffer is NULL **/ SaErrorT oh_decode_fumicapabilities(SaHpiFumiCapabilityT capabilities, SaHpiTextBufferT *buffer) { int found; SaErrorT err; SaHpiTextBufferT working; if (!buffer) { dbg("Invalid parameter."); return(SA_ERR_HPI_INVALID_PARAMS); } err = oh_init_textbuffer(&working); if (err) { return(err); } found = 0; if (capabilities & SAHPI_FUMI_CAP_ROLLBACK) { found++; err = oh_append_textbuffer(&working, "ROLLBACK | "); if (err) { return(err); } } if (capabilities & SAHPI_FUMI_CAP_BANKCOPY) { found++; err = oh_append_textbuffer(&working, "BANKCOPY | "); if (err) { return(err); } } if (capabilities & SAHPI_FUMI_CAP_BANKREORDER) { found++; err = oh_append_textbuffer(&working, "BANKREORDER | "); if (err) { return(err); } } if (capabilities & SAHPI_FUMI_CAP_BACKUP) { found++; err = oh_append_textbuffer(&working, "BACKUP | "); if (err) { return(err); } } if (capabilities & SAHPI_FUMI_CAP_TARGET_VERIFY) { found++; err = oh_append_textbuffer(&working, "TARGET_VERIFY | "); if (err) { return(err); } } if (found) { working.DataLength -= OH_ENCODE_DELIMITER_LENGTH; working.Data[working.DataLength] = 0; } else { oh_append_textbuffer(&working, "None"); } oh_copy_textbuffer(buffer, &working); return(SA_OK); } //========================== /** * oh_build_fumirec: * @textbuff: Buffer into which to store flattened structure. * @annrec: Pointer to SaHpiFumiRecT to be flattened. * @offsets: Number of offsets to start printing structure. * * Flatten member data contained in SaHpiFumiRecT struct to a text buffer. * * Returns: * SA_OK - Normal operation. * SA_ERR_HPI_INVALID_PARAMS - Pointer parameter(s) are NULL. **/ static SaErrorT oh_build_fumirec(oh_big_textbuffer *textbuff, const SaHpiFumiRecT *fumirec, int offsets) { SaErrorT err; char str[SAHPI_MAX_TEXT_BUFFER_LENGTH]; oh_big_textbuffer mybuf; SaHpiTextBufferT tmpbuffer; if (!textbuff || !fumirec) { dbg("Invalid parameter."); return(SA_ERR_HPI_INVALID_PARAMS); } oh_init_bigtext(&mybuf); oh_append_offset(&mybuf, offsets); snprintf(str, SAHPI_MAX_TEXT_BUFFER_LENGTH, "FUMI Num: %d (%x hex)\n", fumirec->Num, fumirec->Num); oh_append_bigtext(&mybuf, str); oh_append_offset(&mybuf, offsets); snprintf(str, SAHPI_MAX_TEXT_BUFFER_LENGTH, "Supported protocols: "); oh_append_bigtext(&mybuf, str); oh_decode_fumiprotocols(fumirec->AccessProt, &tmpbuffer); oh_append_bigtext(&mybuf, (char *)tmpbuffer.Data); oh_append_bigtext(&mybuf, "\n"); oh_append_offset(&mybuf, offsets); snprintf(str, SAHPI_MAX_TEXT_BUFFER_LENGTH, "Optional capabilities: "); oh_append_bigtext(&mybuf, str); oh_decode_fumicapabilities(fumirec->Capability, &tmpbuffer); oh_append_bigtext(&mybuf, (char *)tmpbuffer.Data); oh_append_bigtext(&mybuf, "\n"); oh_append_offset(&mybuf, offsets); snprintf(str, SAHPI_MAX_TEXT_BUFFER_LENGTH, "Number of banks: %d\n", fumirec->NumBanks); oh_append_bigtext(&mybuf, str); oh_append_offset(&mybuf, offsets); snprintf(str, SAHPI_MAX_TEXT_BUFFER_LENGTH, "Oem: %d\n", fumirec->Oem); oh_append_bigtext(&mybuf, str); err = oh_copy_bigtext(textbuff, &mybuf); return(err); } /** * oh_fprint_eventloginfo: * @stream: File handle. * @thiselinfo: Pointer to SaHpiEventLogInfoT to be printed. * @offsets: Number of offsets to start printing structure. * * Prints the member data contained in SaHpiEventLogInfoT struct to a file. * The MACRO oh_print_evenloginfo(), uses this function to print to STDOUT. * * Returns: * SA_OK - Normal operation. * SA_ERR_HPI_INVALID_PARAMS - Pointer parameter(s) are NULL. **/ SaErrorT oh_fprint_eventloginfo(FILE *stream, const SaHpiEventLogInfoT *thiselinfo, int offsets) { SaErrorT err; oh_big_textbuffer mybuf; char str[SAHPI_MAX_TEXT_BUFFER_LENGTH]; SaHpiTextBufferT minibuf; if (!stream || !thiselinfo) { err("Invalid parameter."); return(SA_ERR_HPI_INVALID_PARAMS); } oh_init_bigtext(&mybuf); oh_append_offset(&mybuf, offsets); snprintf(str, SAHPI_MAX_TEXT_BUFFER_LENGTH, "Entries: %d\n", thiselinfo->Entries); oh_append_bigtext(&mybuf, str); oh_append_offset(&mybuf, offsets); snprintf(str, SAHPI_MAX_TEXT_BUFFER_LENGTH, "Size: %d\n", thiselinfo->Size); oh_append_bigtext(&mybuf, str); oh_append_offset(&mybuf, offsets); snprintf(str, SAHPI_MAX_TEXT_BUFFER_LENGTH, "UserEventMaxSize: %d\n", thiselinfo->UserEventMaxSize); oh_append_bigtext(&mybuf, str); oh_append_offset(&mybuf, offsets); err = oh_decode_time(thiselinfo->UpdateTimestamp, &minibuf); if (err) memcpy(minibuf.Data, "SAHPI_TIME_UNSPECIFIED", sizeof("SAHPI_TIME_UNSPECIFIED")); snprintf(str, SAHPI_MAX_TEXT_BUFFER_LENGTH, "UpdateTimestamp: %s\n", minibuf.Data); oh_append_bigtext(&mybuf, str); oh_append_offset(&mybuf, offsets); err = oh_decode_time(thiselinfo->CurrentTime, &minibuf); if (err) memcpy(minibuf.Data, "SAHPI_TIME_UNSPECIFIED", sizeof("SAHPI_TIME_UNSPECIFIED")); snprintf(str, SAHPI_MAX_TEXT_BUFFER_LENGTH, "CurrentTime: %s\n", minibuf.Data); oh_append_bigtext(&mybuf, str); oh_append_offset(&mybuf, offsets); snprintf(str, SAHPI_MAX_TEXT_BUFFER_LENGTH, "Enabled: %s\n", (thiselinfo->Enabled == SAHPI_TRUE) ? "TRUE" : "FALSE" ); oh_append_bigtext(&mybuf, str); oh_append_offset(&mybuf, offsets); snprintf(str, SAHPI_MAX_TEXT_BUFFER_LENGTH, "OverflowFlag: %s\n", (thiselinfo->OverflowFlag == SAHPI_TRUE) ? "TRUE" : "FALSE" ); oh_append_bigtext(&mybuf, str); oh_append_offset(&mybuf, offsets); snprintf(str, SAHPI_MAX_TEXT_BUFFER_LENGTH, "OverflowResetable: %s\n", (thiselinfo->OverflowResetable == SAHPI_TRUE) ? "TRUE" : "FALSE" ); oh_append_bigtext(&mybuf, str); oh_append_offset(&mybuf, offsets); snprintf(str, SAHPI_MAX_TEXT_BUFFER_LENGTH, "OverflowAction: %s\n", oh_lookup_eventlogoverflowaction(thiselinfo->OverflowAction)); oh_append_bigtext(&mybuf, str); err = oh_fprint_bigtext(stream, &mybuf); return(err); } /** * oh_fprint_eventlogentry: * @stream: File handle. * @thiseventlog: Pointer to SaHpiEventLogEntryT to be printed. * @entitypath: Pointer to entity path. * @offsets: Number of offsets to start printing structure. * * Prints the member data contained in SaHpiEventLogEntryT struct to a file. * The MACRO oh_print_evenlogentry(), uses this function to print to STDOUT. * * Returns: * SA_OK - Normal operation. * SA_ERR_HPI_INVALID_PARAMS - Pointer parameter(s) are NULL. **/ SaErrorT oh_fprint_eventlogentry(FILE *stream, const SaHpiEventLogEntryT *thiseventlog, const SaHpiEntityPathT *entitypath, int offsets) { SaErrorT err; oh_big_textbuffer mybuf, mybufX; char str[SAHPI_MAX_TEXT_BUFFER_LENGTH]; SaHpiTextBufferT minibuf; if (!stream || !thiseventlog) { err("Invalid parameter."); return(SA_ERR_HPI_INVALID_PARAMS); } oh_init_bigtext(&mybuf); oh_append_offset(&mybuf, offsets); snprintf(str, SAHPI_MAX_TEXT_BUFFER_LENGTH, "EntryId: %d\n", thiseventlog->EntryId); oh_append_bigtext(&mybuf, str); oh_append_offset(&mybuf, offsets); err = oh_decode_time(thiseventlog->Timestamp, &minibuf); if (err) memcpy(minibuf.Data, "SAHPI_TIME_UNSPECIFIED", sizeof("SAHPI_TIME_UNSPECIFIED")); snprintf(str, SAHPI_MAX_TEXT_BUFFER_LENGTH, "Timestamp: %s\n", minibuf.Data); oh_append_bigtext(&mybuf, str); oh_init_bigtext(&mybufX); err = oh_build_event(&mybufX, &thiseventlog->Event, entitypath, offsets); oh_append_bigtext(&mybuf, (char *)mybufX.Data); err = oh_fprint_bigtext(stream, &mybuf); return(err); } /** * oh_fprint_event: * @stream: File handle. * @event: Pointer to SaHpiEventT to be printed. * @entitypath: Pointer to entitypath. * @offsets: Number of offsets to start printing structure. * * Prints the member data contained in SaHpiEventT struct to a file. * The MACRO oh_print_event(), uses this function to print to STDOUT. * * Returns: * SA_OK - Normal operation. * SA_ERR_HPI_INVALID_PARAMS - Pointer parameter(s) are NULL. **/ SaErrorT oh_fprint_event(FILE *stream, const SaHpiEventT *event, const SaHpiEntityPathT *entitypath, int offsets) { SaErrorT err; oh_big_textbuffer buffer; if (!stream || !event) { err("Invalid parameter."); return(SA_ERR_HPI_INVALID_PARAMS); } oh_init_bigtext(&buffer); err = oh_build_event(&buffer, event, entitypath, offsets); if (err) { return(err); } err = oh_fprint_bigtext(stream, &buffer); if (err) { return(err); } return(SA_OK); } /** * oh_build_event: * @buffer: Pointer to space to decipher SaHpiEventT struct * @event: Pointer to the event to be deciphered * @offset: Number of offsets to start printing structure. * * Builds SaHpiEventT data into a string buffer. * * Returns: * SA_OK - Normal operation. * SA_ERR_HPI_INVALID_PARAMS - Pointer parameter(s) are NULL. **/ SaErrorT oh_build_event(oh_big_textbuffer *buffer, const SaHpiEventT *event, const SaHpiEntityPathT *entitypath, int offsets) { char str[SAHPI_MAX_TEXT_BUFFER_LENGTH]; guint id; SaErrorT err = SA_OK; SaHpiEntityPathT ep; SaHpiTextBufferT tmpbuffer; oh_big_textbuffer bigbuf; memset( buffer->Data, 0, OH_MAX_TEXT_BUFFER_LENGTH ); memset( tmpbuffer.Data, 0, sizeof( tmpbuffer.Data ) ); id = event->Source; if (entitypath) { ep = *entitypath; err = oh_decode_entitypath(&ep, &bigbuf); } else { err = oh_entity_path_lookup(id, &ep); if (err) { err("Could not determine entity path."); } else { /* Only if we were able to get the entity path */ err = oh_decode_entitypath(&ep, &bigbuf); } } /* Event Type */ oh_append_offset(buffer, offsets); snprintf(str, SAHPI_MAX_TEXT_BUFFER_LENGTH, "Event Type: %s\n", oh_lookup_eventtype(event->EventType)); oh_append_bigtext(buffer, str); /* Entity Path */ if (err == SA_OK) { /* Skip this if we failed to get/decode entity path earlier */ oh_append_offset(buffer, offsets); snprintf(str, SAHPI_MAX_TEXT_BUFFER_LENGTH, "From Resource: %s\n", bigbuf.Data); oh_append_bigtext(buffer, str); } offsets++; /* Event Source */ oh_append_offset(buffer, offsets); snprintf(str, SAHPI_MAX_TEXT_BUFFER_LENGTH, "Event Resource ID: %d\n", event->Source); oh_append_bigtext(buffer, str); /* Event Time */ oh_append_offset(buffer, offsets); oh_decode_time(event->Timestamp, &tmpbuffer); snprintf(str, SAHPI_MAX_TEXT_BUFFER_LENGTH, "Event Timestamp: %s\n", tmpbuffer.Data); oh_append_bigtext(buffer, str); /* Event Severity */ oh_append_offset(buffer, offsets); snprintf(str, SAHPI_MAX_TEXT_BUFFER_LENGTH, "Event Severity: %s\n", oh_lookup_severity(event->Severity)); oh_append_bigtext(buffer, str); switch (event->EventType) { case SAHPI_ET_RESOURCE: err = oh_build_event_resource(buffer, event, offsets); break; case SAHPI_ET_DOMAIN: err = oh_build_event_domain(buffer, event, offsets); break; case SAHPI_ET_SENSOR: err = oh_build_event_sensor(buffer, event, offsets); break; case SAHPI_ET_SENSOR_ENABLE_CHANGE: err = oh_build_event_sensor_enable_change(buffer, event, offsets); break; case SAHPI_ET_HOTSWAP: err = oh_build_event_hotswap(buffer, event, offsets); break; case SAHPI_ET_WATCHDOG: err = oh_build_event_watchdog(buffer, event, offsets); break; case SAHPI_ET_HPI_SW: err = oh_build_event_hpi_sw(buffer, event, offsets); break; case SAHPI_ET_OEM: err = oh_build_event_oem(buffer, event, offsets); break; case SAHPI_ET_USER: err = oh_build_event_user(buffer, event, offsets); break; case SAHPI_ET_DIMI: err = oh_build_event_dimi(buffer, event, offsets); break; case SAHPI_ET_DIMI_UPDATE: err = oh_build_event_dimi_update(buffer, event, offsets); break; case SAHPI_ET_FUMI: err = oh_build_event_fumi(buffer, event, offsets); break; default: err("Unrecognized Event Type=%d.", event->EventType); return(SA_ERR_HPI_INVALID_PARAMS); } if (err) { return(err); } return(SA_OK); } /** * oh_build_event_resource: * @buffer: Pointer to space to decipher SaHpiEventT struct * @event: Pointer to the event to be deciphered * @offset: Number of offsets to start printing structure. * * Builds ResourceEventTypeT data into string buffer. * * Returns: * SA_OK - Normal operation. * SA_ERR_HPI_INVALID_PARAMS - Pointer parameter(s) are NULL. **/ static SaErrorT oh_build_event_resource(oh_big_textbuffer *buffer, const SaHpiEventT *event, int offsets) { char str[SAHPI_MAX_TEXT_BUFFER_LENGTH]; if (!buffer || !event) { err("Invalid parameter."); return(SA_ERR_HPI_INVALID_PARAMS); } oh_append_offset(buffer, offsets); snprintf(str, SAHPI_MAX_TEXT_BUFFER_LENGTH, "ResourceEventType: %s\n", oh_lookup_resourceeventtype(event->EventDataUnion.ResourceEvent.ResourceEventType)); oh_append_bigtext(buffer, str); return(SA_OK); } /** * oh_build_event_domain: * @buffer: Pointer to space to decipher SaHpiEventT struct * @event: Pointer to the event to be deciphered * @offset: Number of offsets to start printing structure. * * Build event domain value structure values into string buffer. * * Returns: * SA_OK - Normal operation. * SA_ERR_HPI_INVALID_PARAMS - Pointer parameter(s) are NULL. **/ static SaErrorT oh_build_event_domain(oh_big_textbuffer *buffer, const SaHpiEventT *event, int offsets) { char str[SAHPI_MAX_TEXT_BUFFER_LENGTH]; if (!buffer || !event) { err("Invalid parameter."); return(SA_ERR_HPI_INVALID_PARAMS); } oh_append_offset(buffer, offsets); snprintf(str, SAHPI_MAX_TEXT_BUFFER_LENGTH, "DomainEvent:\n"); oh_append_bigtext(buffer, str); oh_append_offset(buffer, offsets + 1); snprintf(str, SAHPI_MAX_TEXT_BUFFER_LENGTH, "Type: %s\n", oh_lookup_domaineventtype(event->EventDataUnion.DomainEvent.Type)); oh_append_bigtext(buffer, str); oh_append_offset(buffer, offsets + 1); snprintf(str, SAHPI_MAX_TEXT_BUFFER_LENGTH, "DomainId: %d\n", event->EventDataUnion.DomainEvent.DomainId); oh_append_bigtext(buffer, str); return(SA_OK); } #define OH_MAX_SENSOROPTIONALDATA 6 typedef struct { SaHpiSensorOptionalDataT datadef; char *str; } oh_sensor_opt_data_map; oh_sensor_opt_data_map sensor_event_optdata_strings[] = { {SAHPI_SOD_TRIGGER_READING, "TRIGGER_READING"}, {SAHPI_SOD_TRIGGER_THRESHOLD, "TRIGGER_THRESHOLD"}, {SAHPI_SOD_OEM, "OEM"}, {SAHPI_SOD_PREVIOUS_STATE, "PREVIOUS_STATE"}, {SAHPI_SOD_CURRENT_STATE, "CURRENT_STATE"}, {SAHPI_SOD_SENSOR_SPECIFIC, "SENSOR_SPECIFIC"}, }; /** * oh_encode_sensoroptionaldata: * @buffer: Pointer to space to decipher SaHpiSensorOptionalDataT struct * @sensor_opt_data: Sensor's optional data bit mask. * * Converts a sensor's optional data bit mask field into a string. For example, * if the optional data bit mask is SAHPI_SOD_TRIGGER_READING | SAHPI_SOD_CURRENT_STATE, * this routine returns the string "TRIGGER_READING | CURRENT_STATE" in a * SaHpiTextBufferT structure. * * Returns: * SA_OK - Normal operation. * SA_ERR_HPI_INVALID_PARAMS - Pointer parameter(s) are NULL. **/ SaErrorT oh_decode_sensoroptionaldata(SaHpiSensorOptionalDataT sensor_opt_data, SaHpiTextBufferT *buffer) { int i, found; SaErrorT err; SaHpiTextBufferT working; if (!buffer) { err("Invalid parameter."); return(SA_ERR_HPI_INVALID_PARAMS); } err = oh_init_textbuffer(&working); if (err) { return(err); } found = 0; /* Look for sensor optional data definitions */ for (i=0; iEventDataUnion.SensorEvent.SensorNum, event->EventDataUnion.SensorEvent.SensorNum); oh_append_bigtext(buffer, str); /* Event Sensor Type */ oh_append_offset(buffer, offsets); snprintf(str, SAHPI_MAX_TEXT_BUFFER_LENGTH, "Event Sensor Type: %s\n", oh_lookup_sensortype(event->EventDataUnion.SensorEvent.SensorType)); oh_append_bigtext(buffer, str); /* Event Sensor Category */ oh_append_offset(buffer, offsets); snprintf(str, SAHPI_MAX_TEXT_BUFFER_LENGTH, "Event Sensor Category: %s\n", oh_lookup_eventcategory(event->EventDataUnion.SensorEvent.EventCategory)); oh_append_bigtext(buffer, str); /* Event Sensor Assertion */ oh_append_offset(buffer, offsets); snprintf(str, SAHPI_MAX_TEXT_BUFFER_LENGTH, "Event Sensor Assertion: %s\n", (event->EventDataUnion.SensorEvent.Assertion == SAHPI_TRUE) ? "TRUE" : "FALSE"); oh_append_bigtext(buffer, str); /* Event Sensor State */ oh_append_offset(buffer, offsets); oh_append_bigtext(buffer, "Event Sensor State: "); err = oh_decode_eventstate(event->EventDataUnion.SensorEvent.EventState, event->EventDataUnion.SensorEvent.EventCategory, &tmpbuffer); if (err) { return(err); } oh_append_bigtext(buffer, (char *)tmpbuffer.Data); oh_append_bigtext(buffer, "\n"); /* Sensor Event - Sensor Optional Data */ oh_append_offset(buffer, offsets); oh_append_bigtext(buffer, "Optional Data: "); err = oh_decode_sensoroptionaldata(event->EventDataUnion.SensorEvent.OptionalDataPresent, &tmpbuffer); if (err) { return(err); } oh_append_bigtext(buffer, (char *)tmpbuffer.Data); oh_append_bigtext(buffer, "\n"); /* Sensor Event - Sensor Optional Trigger Reading Data */ if (event->EventDataUnion.SensorEvent.OptionalDataPresent & SAHPI_SOD_TRIGGER_READING) { SaHpiSensorDataFormatT format; memset(&format, 0, sizeof(SaHpiSensorDataFormatT)); oh_append_offset(buffer, offsets + 1); oh_append_bigtext(buffer, "Trigger Reading: "); format.IsSupported = SAHPI_TRUE; format.ReadingType = event->EventDataUnion.SensorEvent.TriggerReading.Type; format.BaseUnits = SAHPI_SU_UNSPECIFIED; err = oh_decode_sensorreading(event->EventDataUnion.SensorEvent.TriggerReading, format, &tmpbuffer); if (err) { return(err); } oh_append_bigtext(buffer, (char *)tmpbuffer.Data); oh_append_bigtext(buffer, "\n"); } /* Sensor Event - Sensor Optional Trigger Threshold Data */ if (event->EventDataUnion.SensorEvent.OptionalDataPresent & SAHPI_SOD_TRIGGER_THRESHOLD) { SaHpiSensorDataFormatT format; memset(&format, 0, sizeof(SaHpiSensorDataFormatT)); oh_append_offset(buffer, offsets + 1); oh_append_bigtext(buffer, "Trigger Threshold: "); format.IsSupported = SAHPI_TRUE; format.ReadingType = event->EventDataUnion.SensorEvent.TriggerThreshold.Type; format.BaseUnits = SAHPI_SU_UNSPECIFIED; err = oh_decode_sensorreading(event->EventDataUnion.SensorEvent.TriggerThreshold, format, &tmpbuffer); if (err) { return(err); } oh_append_bigtext(buffer, (char *)tmpbuffer.Data); oh_append_bigtext(buffer, "\n"); } /* Sensor Event - Sensor Optional Previous State Data */ if (event->EventDataUnion.SensorEvent.OptionalDataPresent & SAHPI_SOD_PREVIOUS_STATE) { oh_append_offset(buffer, offsets + 1); oh_append_bigtext(buffer, "Previous Sensor State: "); err = oh_decode_eventstate(event->EventDataUnion.SensorEvent.PreviousState, event->EventDataUnion.SensorEvent.EventCategory, &tmpbuffer); if (err) { return(err); } oh_append_bigtext(buffer, (char *)tmpbuffer.Data); oh_append_bigtext(buffer, "\n"); } /* Sensor Event - Sensor Optional Current State Data */ if (event->EventDataUnion.SensorEvent.OptionalDataPresent & SAHPI_SOD_CURRENT_STATE) { oh_append_offset(buffer, offsets + 1); oh_append_bigtext(buffer, "Current Sensor State: "); err = oh_decode_eventstate(event->EventDataUnion.SensorEvent.CurrentState, event->EventDataUnion.SensorEvent.EventCategory, &tmpbuffer); if (err) { return(err); } oh_append_bigtext(buffer, (char *)tmpbuffer.Data); oh_append_bigtext(buffer, "\n"); } /* Sensor Event - Sensor Optional OEM Data */ if (event->EventDataUnion.SensorEvent.OptionalDataPresent & SAHPI_SOD_OEM) { oh_append_offset(buffer, offsets + 1); snprintf(str, SAHPI_MAX_TEXT_BUFFER_LENGTH, "OEM: %x\n", event->EventDataUnion.SensorEvent.Oem); oh_append_bigtext(buffer, str); } /* Sensor Event - Sensor Optional Sensor Specific Data */ if (event->EventDataUnion.SensorEvent.OptionalDataPresent & SAHPI_SOD_SENSOR_SPECIFIC) { oh_append_offset(buffer, offsets + 1); snprintf(str, SAHPI_MAX_TEXT_BUFFER_LENGTH, "Sensor Specific: %x\n", event->EventDataUnion.SensorEvent.SensorSpecific ); oh_append_bigtext(buffer, str); } return(SA_OK); } /** * oh_build_event_sensor_enable_change: * @buffer: Pointer to space to decipher SaHpiEventT struct * @event: Pointer to the event to be deciphered * @offset: Number of offsets to start printing structure. * * Build SaHpiSensorEnableChangeEventT data into a string buffer. * * Returns: * SA_OK - Normal operation. * SA_ERR_HPI_INVALID_PARAMS - Pointer parameter(s) are NULL. **/ static SaErrorT oh_build_event_sensor_enable_change(oh_big_textbuffer *buffer, const SaHpiEventT *event, int offsets) { char str[SAHPI_MAX_TEXT_BUFFER_LENGTH]; SaErrorT err; SaHpiTextBufferT tmpbuffer; if ( !buffer || !event) { err("Invalid parameter."); return(SA_ERR_HPI_INVALID_PARAMS); } oh_append_offset(buffer, offsets); snprintf(str, SAHPI_MAX_TEXT_BUFFER_LENGTH, "SensorEnableChangeEvent: \n"); oh_append_bigtext(buffer, str); /* Sensor Enable Change Event - Sensor Number */ oh_append_offset(buffer, offsets + 1); snprintf(str, SAHPI_MAX_TEXT_BUFFER_LENGTH, "Sensor Num: %d (%x hex)\n", event->EventDataUnion.SensorEnableChangeEvent.SensorNum, event->EventDataUnion.SensorEnableChangeEvent.SensorNum); oh_append_bigtext(buffer, str); /* Sensor Enable Change Event - Sensor Type */ oh_append_offset(buffer, offsets + 1); snprintf(str, SAHPI_MAX_TEXT_BUFFER_LENGTH, "Sensor Type: %s\n", oh_lookup_sensortype(event->EventDataUnion.SensorEnableChangeEvent.SensorType)); oh_append_bigtext(buffer, str); /* Sensor Enable Change Event - Sensor Category */ oh_append_offset(buffer, offsets + 1); snprintf(str, SAHPI_MAX_TEXT_BUFFER_LENGTH, "EventCategory: %s\n", oh_lookup_eventcategory(event->EventDataUnion.SensorEnableChangeEvent.EventCategory)); oh_append_bigtext(buffer, str); /* Sensor Enable Change Event - Sensor Enabled */ oh_append_offset(buffer, offsets + 1); snprintf(str, SAHPI_MAX_TEXT_BUFFER_LENGTH, "SensorEnable: %s\n", (event->EventDataUnion.SensorEnableChangeEvent.SensorEnable == SAHPI_TRUE) ? "TRUE" : "FALSE"); oh_append_bigtext(buffer, str); /* Sensor Enable Change Event - Sensor Events Enabled */ oh_append_offset(buffer, offsets + 1); snprintf(str, SAHPI_MAX_TEXT_BUFFER_LENGTH, "SensorEventEnable: %s\n", (event->EventDataUnion.SensorEnableChangeEvent.SensorEventEnable == SAHPI_TRUE) ? "TRUE" : "FALSE"); oh_append_bigtext(buffer, str); /* Sensor Enable Change Event - Event Assert Mask */ oh_append_offset(buffer, offsets + 1); oh_append_bigtext(buffer, "AssertEventMask: "); err = oh_decode_eventstate(event->EventDataUnion.SensorEnableChangeEvent.AssertEventMask, event->EventDataUnion.SensorEnableChangeEvent.EventCategory, &tmpbuffer); if (err) { return(err); } oh_append_bigtext(buffer, (char *)tmpbuffer.Data); oh_append_bigtext(buffer, "\n"); /* Sensor Enable Change Event - Event Deassert Mask */ oh_append_offset(buffer, offsets + 1); oh_append_bigtext(buffer, "DeassertEventMask: "); err = oh_decode_eventstate(event->EventDataUnion.SensorEnableChangeEvent.DeassertEventMask, event->EventDataUnion.SensorEnableChangeEvent.EventCategory, &tmpbuffer); if (err) { return(err); } oh_append_bigtext(buffer, (char *)tmpbuffer.Data); oh_append_bigtext(buffer, "\n"); /* Sensor Enable Change Event - Optional Data */ oh_append_offset(buffer, offsets + 1); oh_append_bigtext(buffer, "Optional Data: "); err = oh_decode_sensorenableoptdata(event->EventDataUnion.SensorEnableChangeEvent.OptionalDataPresent, &tmpbuffer); if (err) { return(err); } oh_append_bigtext(buffer, (char *)tmpbuffer.Data); oh_append_bigtext(buffer, "\n"); /* Sensor Enable Change Event - Optional Data - Current State */ if (event->EventDataUnion.SensorEnableChangeEvent.OptionalDataPresent & SAHPI_SEOD_CURRENT_STATE) { oh_append_offset(buffer, offsets + 2); oh_append_bigtext(buffer, "Current State: "); err = oh_decode_eventstate(event->EventDataUnion.SensorEnableChangeEvent.CurrentState, event->EventDataUnion.SensorEnableChangeEvent.EventCategory, &tmpbuffer); if (err) { return(err); } oh_append_bigtext(buffer, (char *)tmpbuffer.Data); oh_append_bigtext(buffer, "\n"); } return(SA_OK); } /** * oh_build_event_hotswap: * @buffer: Pointer to space to decipher SaHpiEventT struct * @event: Pointer to the event to be deciphered * @offset: Number of offsets to start printing structure. * * Builds SaHpiHotSwapEventT data into a string buffer. * * Returns: * SA_OK - Normal operation. * SA_ERR_HPI_INVALID_PARAMS - Pointer parameter(s) are NULL. **/ static SaErrorT oh_build_event_hotswap(oh_big_textbuffer *buffer, const SaHpiEventT *event, int offsets) { char str[SAHPI_MAX_TEXT_BUFFER_LENGTH]; if ( !buffer || !event) { err("Invalid parameter."); return(SA_ERR_HPI_INVALID_PARAMS); } oh_append_offset(buffer, offsets); snprintf(str, SAHPI_MAX_TEXT_BUFFER_LENGTH, "HotswapEvent: \n"); oh_append_bigtext(buffer, str); oh_append_offset(buffer, offsets + 1); snprintf(str, SAHPI_MAX_TEXT_BUFFER_LENGTH, "HotSwapState: %s\n", oh_lookup_hsstate(event->EventDataUnion.HotSwapEvent.HotSwapState)); oh_append_bigtext(buffer, str); oh_append_offset(buffer, offsets + 1); snprintf(str, SAHPI_MAX_TEXT_BUFFER_LENGTH, "PreviousHotSwapState: %s\n", oh_lookup_hsstate(event->EventDataUnion.HotSwapEvent.PreviousHotSwapState)); oh_append_bigtext(buffer, str); return(SA_OK); } /** * oh_build_event_watchdog: * @buffer: Pointer to space to decipher SaHpiEventT struct * @event: Pointer to the event to be deciphered * @offset: Number of offsets to start printing structure. * * Builds SaHpiWatchdogEventT data into a string buffer. * * Returns: * SA_OK - Normal operation. * SA_ERR_HPI_INVALID_PARAMS - Pointer parameter(s) are NULL. **/ static SaErrorT oh_build_event_watchdog(oh_big_textbuffer *buffer, const SaHpiEventT *event, int offsets) { char str[SAHPI_MAX_TEXT_BUFFER_LENGTH]; int i; SaHpiBoolT matchFound = SAHPI_FALSE; if ( !buffer || !event) { err("Invalid parameter."); return(SA_ERR_HPI_INVALID_PARAMS); } oh_append_offset(buffer, offsets); snprintf(str, SAHPI_MAX_TEXT_BUFFER_LENGTH, "Watchdog Event: \n"); oh_append_bigtext(buffer, str); oh_append_offset(buffer, offsets + 1); snprintf(str, SAHPI_MAX_TEXT_BUFFER_LENGTH, "Watchdog Num: %d (%x hex)\n", event->EventDataUnion.WatchdogEvent.WatchdogNum, event->EventDataUnion.WatchdogEvent.WatchdogNum); oh_append_bigtext(buffer, str); oh_append_offset(buffer, offsets + 1); snprintf(str, SAHPI_MAX_TEXT_BUFFER_LENGTH, "WatchdogActionEvent: %s\n", oh_lookup_watchdogactionevent(event->EventDataUnion.WatchdogEvent.WatchdogAction)); oh_append_bigtext(buffer, str); oh_append_offset(buffer, offsets + 1); snprintf(str, SAHPI_MAX_TEXT_BUFFER_LENGTH, "WatchdogPreTimerAction: %s\n", oh_lookup_watchdogpretimerinterrupt(event->EventDataUnion.WatchdogEvent.WatchdogPreTimerAction)); oh_append_bigtext(buffer, str); oh_append_offset(buffer, offsets + 1); for (i = 0; i < OH_MAX_WATCHDOGTIMERUSE; i++) { if (event->EventDataUnion.WatchdogEvent.WatchdogUse == watchdogtimeruse_strings[i].entity_type) { matchFound = SAHPI_TRUE; snprintf(str, SAHPI_MAX_TEXT_BUFFER_LENGTH, "WatchdogUse: %s\n", watchdogtimeruse_strings[i].str); break; } } if (!matchFound) snprintf(str, SAHPI_MAX_TEXT_BUFFER_LENGTH, "WatchdogUse: %s\n", "Invalid data"); oh_append_bigtext(buffer, str); return(SA_OK); } /** * oh_build_event_hpi_sw: * @buffer: Pointer to space to decipher SaHpiEventT struct * @event: Pointer to the event to be deciphered * @offset: Number of offsets to start printing structure. * * Builds SaHpiHpiSwEventT data into a string buffer. * * Returns: * SA_OK - Normal operation. * SA_ERR_HPI_INVALID_PARAMS - Pointer parameter(s) are NULL. **/ static SaErrorT oh_build_event_hpi_sw(oh_big_textbuffer *buffer, const SaHpiEventT *event, int offsets) { char str[SAHPI_MAX_TEXT_BUFFER_LENGTH]; SaHpiTextBufferT tmpbuffer; SaErrorT err; if ( !buffer || !event) { err("Invalid parameter."); return(SA_ERR_HPI_INVALID_PARAMS); } oh_append_offset(buffer, offsets); snprintf(str, SAHPI_MAX_TEXT_BUFFER_LENGTH, "HpiSwEvent: \n"); oh_append_bigtext(buffer, str); offsets++; oh_append_offset(buffer, offsets); err = oh_decode_manufacturerid(event->EventDataUnion.HpiSwEvent.MId, &tmpbuffer); snprintf(str, SAHPI_MAX_TEXT_BUFFER_LENGTH, "ManufacturerId: %s\n", tmpbuffer.Data); oh_append_bigtext(buffer, str); oh_append_offset(buffer, offsets); snprintf(str, SAHPI_MAX_TEXT_BUFFER_LENGTH, "EventData: \n"); oh_append_bigtext(buffer, str); offsets++; oh_build_textbuffer(buffer, &event->EventDataUnion.HpiSwEvent.EventData, offsets); return(SA_OK); } /** * oh_build_event_oem: * @buffer: Pointer to space to decipher SaHpiEventT struct * @event: Pointer to the event to be deciphered * @offset: Number of offsets to start printing structure. * * Builds SaHpiOemEventT data into a string buffer. * * Returns: * SA_OK - Normal operation. * SA_ERR_HPI_INVALID_PARAMS - Pointer parameter(s) are NULL. **/ static SaErrorT oh_build_event_oem(oh_big_textbuffer *buffer, const SaHpiEventT *event, int offsets) { char str[SAHPI_MAX_TEXT_BUFFER_LENGTH]; SaErrorT err; SaHpiTextBufferT tmpbuffer; if ( !buffer || !event) { err("Invalid parameter."); return(SA_ERR_HPI_INVALID_PARAMS); } oh_append_offset(buffer, offsets); snprintf(str, SAHPI_MAX_TEXT_BUFFER_LENGTH, "OemEvent:\n"); oh_append_bigtext(buffer, str); offsets++; oh_append_offset(buffer, offsets); err = oh_decode_manufacturerid(event->EventDataUnion.OemEvent.MId, &tmpbuffer); snprintf(str, SAHPI_MAX_TEXT_BUFFER_LENGTH, "ManufacturerId: %s\n", tmpbuffer.Data); oh_append_bigtext(buffer, str); oh_append_offset(buffer, offsets); snprintf(str, SAHPI_MAX_TEXT_BUFFER_LENGTH, "OemEventData:\n"); oh_append_bigtext(buffer, str); offsets++; oh_build_textbuffer(buffer, &event->EventDataUnion.OemEvent.OemEventData, offsets); return(SA_OK); } /** * oh_build_event_user: * @buffer: Pointer to space to decipher SaHpiEventT struct * @event: Pointer to the event to be deciphered * @offset: Number of offsets to start printing structure. * * * Returns: * SA_OK - Normal operation. * SA_ERR_HPI_INVALID_PARAMS - Pointer parameter(s) are NULL. **/ static SaErrorT oh_build_event_user(oh_big_textbuffer *buffer, const SaHpiEventT *event, int offsets) { char str[SAHPI_MAX_TEXT_BUFFER_LENGTH]; if ( !buffer || !event) { err("Invalid parameter."); return(SA_ERR_HPI_INVALID_PARAMS); } /* * oh_append_offset(buffer, offsets); * snprintf(str, SAHPI_MAX_TEXT_BUFFER_LENGTH, "UserEvent:\n"); * oh_append_bigtext(buffer, str); * offsets++ */ oh_append_offset(buffer, offsets); snprintf(str, SAHPI_MAX_TEXT_BUFFER_LENGTH, "UserEventData:\n"); oh_append_bigtext(buffer, str); offsets++; oh_build_textbuffer(buffer, &event->EventDataUnion.UserEvent.UserEventData, offsets); return(SA_OK); } /** * oh_build_event_dimi: * @buffer: Pointer to space to decipher SaHpiEventT struct * @event: Pointer to the event to be deciphered * @offset: Number of offsets to start printing structure. * * * Returns: * SA_OK - Normal operation. * SA_ERR_HPI_INVALID_PARAMS - Pointer parameter(s) are NULL. **/ static SaErrorT oh_build_event_dimi(oh_big_textbuffer *buffer, const SaHpiEventT *event, int offsets) { char str[SAHPI_MAX_TEXT_BUFFER_LENGTH]; const SaHpiDimiEventT* de = &(event->EventDataUnion.DimiEvent); if ( !buffer || !event) { dbg("Invalid parameter."); return(SA_ERR_HPI_INVALID_PARAMS); } oh_append_offset(buffer, offsets); snprintf(str, SAHPI_MAX_TEXT_BUFFER_LENGTH, "DimiEventData:\n"); oh_append_bigtext(buffer, str); offsets++; oh_append_offset(buffer, offsets); snprintf(str, SAHPI_MAX_TEXT_BUFFER_LENGTH, "DimiNum: %d\n", de->DimiNum); oh_append_bigtext(buffer, str); oh_append_offset(buffer, offsets); snprintf(str, SAHPI_MAX_TEXT_BUFFER_LENGTH, "TestNum: %d\n", de->TestNum); oh_append_bigtext(buffer, str); oh_append_offset(buffer, offsets); snprintf(str, SAHPI_MAX_TEXT_BUFFER_LENGTH, "TestRunStatus: %s\n", oh_lookup_dimitestrunstatus(de->DimiTestRunStatus)); oh_append_bigtext(buffer, str); if ( de->DimiTestPercentCompleted != 0xff ) { oh_append_offset(buffer, offsets); snprintf(str, SAHPI_MAX_TEXT_BUFFER_LENGTH, "Percent completed: %d\n", de->DimiTestPercentCompleted); oh_append_bigtext(buffer, str); } return(SA_OK); } /** * oh_build_event_dimi_update: * @buffer: Pointer to space to decipher SaHpiEventT struct * @event: Pointer to the event to be deciphered * @offset: Number of offsets to start printing structure. * * * Returns: * SA_OK - Normal operation. * SA_ERR_HPI_INVALID_PARAMS - Pointer parameter(s) are NULL. **/ static SaErrorT oh_build_event_dimi_update(oh_big_textbuffer *buffer, const SaHpiEventT *event, int offsets) { char str[SAHPI_MAX_TEXT_BUFFER_LENGTH]; const SaHpiDimiUpdateEventT* de = &(event->EventDataUnion.DimiUpdateEvent); if ( !buffer || !event) { dbg("Invalid parameter."); return(SA_ERR_HPI_INVALID_PARAMS); } oh_append_offset(buffer, offsets); snprintf(str, SAHPI_MAX_TEXT_BUFFER_LENGTH, "DimiUpdateEventData:\n"); oh_append_bigtext(buffer, str); offsets++; oh_append_offset(buffer, offsets); snprintf(str, SAHPI_MAX_TEXT_BUFFER_LENGTH, "DimiNum: %d\n", de->DimiNum); oh_append_bigtext(buffer, str); return(SA_OK); } /** * oh_build_event_fumi: * @buffer: Pointer to space to decipher SaHpiEventT struct * @event: Pointer to the event to be deciphered * @offset: Number of offsets to start printing structure. * * * Returns: * SA_OK - Normal operation. * SA_ERR_HPI_INVALID_PARAMS - Pointer parameter(s) are NULL. **/ static SaErrorT oh_build_event_fumi(oh_big_textbuffer *buffer, const SaHpiEventT *event, int offsets) { char str[SAHPI_MAX_TEXT_BUFFER_LENGTH]; const SaHpiFumiEventT* fe = &(event->EventDataUnion.FumiEvent); if ( !buffer || !event) { dbg("Invalid parameter."); return(SA_ERR_HPI_INVALID_PARAMS); } oh_append_offset(buffer, offsets); snprintf(str, SAHPI_MAX_TEXT_BUFFER_LENGTH, "FumiEventData:\n"); oh_append_bigtext(buffer, str); offsets++; oh_append_offset(buffer, offsets); snprintf(str, SAHPI_MAX_TEXT_BUFFER_LENGTH, "FumiNum: %d\n", fe->FumiNum); oh_append_bigtext(buffer, str); oh_append_offset(buffer, offsets); snprintf(str, SAHPI_MAX_TEXT_BUFFER_LENGTH, "BankNum: %d\n", fe->BankNum); oh_append_bigtext(buffer, str); oh_append_offset(buffer, offsets); snprintf(str, SAHPI_MAX_TEXT_BUFFER_LENGTH, "UpgradeStatus: %s\n", oh_lookup_fumiupgradestatus(fe->UpgradeStatus)); oh_append_bigtext(buffer, str); return(SA_OK); } /** * oh_fprint_ctrlstate: * @stream: File handle. * @event: Pointer to SaHpitrlStateT to be printed. * @offsets: Number of offsets to start printing structure. * * Prints the member data contained in SaHpiCtrlStateT struct to a file. * The MACRO oh_print_ctrlstate(), uses this function to print to STDOUT. * * Returns: * SA_OK - Normal operation. * SA_ERR_HPI_INVALID_PARAMS - Pointer parameter(s) are NULL. **/ SaErrorT oh_fprint_ctrlstate(FILE *stream, const SaHpiCtrlStateT *thisctrlstate, int offsets) { SaErrorT rv = SA_OK; oh_big_textbuffer buffer; SaHpiTextBufferT smallbuf; char str[SAHPI_MAX_TEXT_BUFFER_LENGTH]; if (!stream || !thisctrlstate) { err("Invalid parameter."); return(SA_ERR_HPI_INVALID_PARAMS); } oh_init_bigtext(&buffer); oh_append_offset(&buffer, offsets); snprintf(str, SAHPI_MAX_TEXT_BUFFER_LENGTH, "Type: %s\n", oh_lookup_ctrltype(thisctrlstate->Type)); oh_append_bigtext(&buffer, str); oh_append_offset(&buffer, offsets); switch(thisctrlstate->Type) { case SAHPI_CTRL_TYPE_DIGITAL: snprintf(str, SAHPI_MAX_TEXT_BUFFER_LENGTH, "State: %s\n", oh_lookup_ctrlstatedigital(thisctrlstate->StateUnion.Digital)); break; case SAHPI_CTRL_TYPE_DISCRETE: snprintf(str, SAHPI_MAX_TEXT_BUFFER_LENGTH, "State: %d\n", thisctrlstate->StateUnion.Discrete); break; case SAHPI_CTRL_TYPE_ANALOG: snprintf(str, SAHPI_MAX_TEXT_BUFFER_LENGTH, "Analog: %d\n", thisctrlstate->StateUnion.Analog); break; case SAHPI_CTRL_TYPE_STREAM: snprintf(str, SAHPI_MAX_TEXT_BUFFER_LENGTH, "Stream:\n"); oh_append_bigtext(&buffer, str); oh_append_offset(&buffer, offsets + 1); snprintf(str, SAHPI_MAX_TEXT_BUFFER_LENGTH, "Repeat: %s\n", (thisctrlstate->StateUnion.Stream.Repeat == SAHPI_TRUE) ? "TRUE" : "FALSE"); oh_append_bigtext(&buffer, str); oh_append_offset(&buffer, offsets + 1); snprintf(str, thisctrlstate->StateUnion.Stream.StreamLength, "%s\n", thisctrlstate->StateUnion.Stream.Stream); break; case SAHPI_CTRL_TYPE_TEXT: snprintf(str, SAHPI_MAX_TEXT_BUFFER_LENGTH, "Line: %d\n", thisctrlstate->StateUnion.Text.Line); oh_append_bigtext(&buffer, str); oh_append_offset(&buffer, offsets); snprintf(str, SAHPI_MAX_TEXT_BUFFER_LENGTH, "%s\n", thisctrlstate->StateUnion.Text.Text.Data); break; case SAHPI_CTRL_TYPE_OEM: snprintf(str, SAHPI_MAX_TEXT_BUFFER_LENGTH, "Oem:\n"); oh_append_bigtext(&buffer, str); oh_append_offset(&buffer, offsets + 1); rv = oh_decode_manufacturerid(thisctrlstate->StateUnion.Oem.MId, &smallbuf); snprintf(str, SAHPI_MAX_TEXT_BUFFER_LENGTH, "ManufacturerId: %s\n", smallbuf.Data); oh_append_bigtext(&buffer, str); oh_append_offset(&buffer, offsets + 1); snprintf(str, thisctrlstate->StateUnion.Oem.BodyLength, "%s\n", thisctrlstate->StateUnion.Oem.Body); break; default: snprintf(str, SAHPI_MAX_TEXT_BUFFER_LENGTH, "Invalid Control Type\n"); rv = SA_ERR_HPI_INVALID_DATA; break; } oh_append_bigtext(&buffer, str); rv = oh_fprint_bigtext(stream, &buffer); return(rv); } /** * oh_valid_textbuffer: * @buffer: Pointer to a SaHpiTextBufferT structure. * * Verifies @buffer is a valid SaHpiTextBufferT structure. * Used in routines where the user can set SaHpiTextBufferT values. * * Returns: * SAHPI_TRUE - if @buffer is valid. * SAHPI_FALSE - if @buffer not valid. **/ SaHpiBoolT oh_valid_textbuffer(SaHpiTextBufferT *buffer) { int i; SaHpiUint16T c1, c2; if (!buffer) return SAHPI_FALSE; if (oh_lookup_texttype(buffer->DataType) == NULL) return SAHPI_FALSE; /* Compiler checks DataLength <= SAHPI_MAX_TEXT_BUFFER_LENGTH */ switch (buffer->DataType) { case SAHPI_TL_TYPE_UNICODE: /* Validate language and length */ if (oh_lookup_language(buffer->Language) == NULL) return SAHPI_FALSE; if (buffer->DataLength % 2 != 0) return SAHPI_FALSE; /* Validate utf-16 buffers in the case of surrogates */ for (i = 0; i < buffer->DataLength; i = i + 2) { /* here I am assuming that the least * significant byte is first */ c1 = buffer->Data[i]; c1 |= buffer->Data[i+1] << 8; if (U_IS_SURROGATE(c1)) { if (buffer->DataLength > i+3) { c2 = buffer->Data[i+2]; c2 |= buffer->Data[i+3] << 8; if (U_IS_LEAD(c1) && U_IS_TRAIL(c2)) { /* already checked for trail .. * so increment i by 2 */ i = i + 2; } else { /* found a unpaired surrogate */ return SAHPI_FALSE; } } else { /* found a unpaired surrogate */ return SAHPI_FALSE; } } } break; case SAHPI_TL_TYPE_BCDPLUS: /* 8-bit ASCII, '0'-'9', space, dash, period, colon, comma, or underscore. Always encoded in HPI as 8-bit values */ for (i = 0; i < buffer->DataLength && i < SAHPI_MAX_TEXT_BUFFER_LENGTH; i++) { if ((buffer->Data[i] < 0x30 || buffer->Data[i] > 0x39) && buffer->Data[i] != 0x20 && buffer->Data[i] != 0x2d && buffer->Data[i] != 0x2e && buffer->Data[i] != 0x3a && buffer->Data[i] != 0x2c && buffer->Data[i] != 0x5f) return SAHPI_FALSE; } break; case SAHPI_TL_TYPE_ASCII6: /* reduced set, 0x20-0x5f only. Always encoded in HPI as 8-bit values */ for (i = 0; i < buffer->DataLength && i < SAHPI_MAX_TEXT_BUFFER_LENGTH; i++) { if (buffer->Data[i] < 0x20 || buffer->Data[i] > 0x5f) return SAHPI_FALSE; } break; case SAHPI_TL_TYPE_TEXT: if (oh_lookup_language(buffer->Language) == NULL) { return(SAHPI_FALSE); } /* all character values are good 0x00 - 0xff */ break; case SAHPI_TL_TYPE_BINARY: /* No check possible */ break; default: err("Invalid data type"); return(SAHPI_FALSE); } return(SAHPI_TRUE); } #define validate_threshold(thdname, thdmask) \ do { \ if (thds->thdname.IsSupported) { \ if (!(writable_thds & thdmask)) return(SA_ERR_HPI_INVALID_CMD); \ if (format.ReadingType != thds->thdname.Type) return(SA_ERR_HPI_INVALID_DATA); \ switch (format.ReadingType) { \ case SAHPI_SENSOR_READING_TYPE_INT64: \ if (thdmask == SAHPI_STM_UP_HYSTERESIS || thdmask == SAHPI_STM_LOW_HYSTERESIS) { \ if (thds->thdname.Value.SensorInt64 < 0) return(SA_ERR_HPI_INVALID_DATA); \ } else { \ if (format.Range.Flags & SAHPI_SRF_MAX) { \ if (thds->thdname.Value.SensorInt64 > format.Range.Max.Value.SensorInt64) \ return(SA_ERR_HPI_INVALID_CMD); \ } \ if (format.Range.Flags & SAHPI_SRF_MIN) { \ if (thds->thdname.Value.SensorInt64 < format.Range.Min.Value.SensorInt64) \ return(SA_ERR_HPI_INVALID_CMD); \ } \ } \ break; \ case SAHPI_SENSOR_READING_TYPE_FLOAT64: \ if (thdmask == SAHPI_STM_UP_HYSTERESIS || thdmask == SAHPI_STM_LOW_HYSTERESIS) { \ if (thds->thdname.Value.SensorFloat64 < 0) return(SA_ERR_HPI_INVALID_DATA); \ } else { \ if (format.Range.Flags & SAHPI_SRF_MAX) { \ if (thds->thdname.Value.SensorFloat64 > format.Range.Max.Value.SensorFloat64) \ return(SA_ERR_HPI_INVALID_CMD); \ } \ if (format.Range.Flags & SAHPI_SRF_MIN) { \ if (thds->thdname.Value.SensorFloat64 < format.Range.Min.Value.SensorFloat64) \ return(SA_ERR_HPI_INVALID_CMD); \ } \ } \ break; \ case SAHPI_SENSOR_READING_TYPE_UINT64: \ if (thdmask == SAHPI_STM_UP_HYSTERESIS || thdmask == SAHPI_STM_LOW_HYSTERESIS) { \ } else { \ if (format.Range.Flags & SAHPI_SRF_MAX) { \ if (thds->thdname.Value.SensorUint64 > format.Range.Max.Value.SensorUint64) \ return(SA_ERR_HPI_INVALID_CMD); \ } \ if (format.Range.Flags & SAHPI_SRF_MIN) { \ if (thds->thdname.Value.SensorUint64 < format.Range.Min.Value.SensorUint64) \ return(SA_ERR_HPI_INVALID_CMD); \ } \ } \ break; \ case SAHPI_SENSOR_READING_TYPE_BUFFER: \ break; \ default: \ err("Invalid threshold reading type."); \ return(SA_ERR_HPI_INVALID_CMD); \ } \ } \ } while(0) #define validate_threshold_order(thdtype) \ do { \ if (thds->UpCritical.IsSupported == SAHPI_TRUE) { \ if (thds->UpMajor.IsSupported == SAHPI_TRUE) { \ if (thds->UpCritical.Value.thdtype < thds->UpMajor.Value.thdtype) \ return(SA_ERR_HPI_INVALID_DATA); \ } \ if (thds->UpMinor.IsSupported == SAHPI_TRUE) { \ if (thds->UpCritical.Value.thdtype < thds->UpMinor.Value.thdtype) \ return(SA_ERR_HPI_INVALID_DATA); \ } \ if (thds->LowMinor.IsSupported == SAHPI_TRUE) { \ if (thds->UpCritical.Value.thdtype < thds->LowMinor.Value.thdtype) \ return(SA_ERR_HPI_INVALID_DATA); \ } \ if (thds->LowMajor.IsSupported == SAHPI_TRUE) { \ if (thds->UpCritical.Value.thdtype < thds->LowMajor.Value.thdtype) \ return(SA_ERR_HPI_INVALID_DATA); \ } \ if (thds->LowCritical.IsSupported == SAHPI_TRUE) { \ if (thds->UpCritical.Value.thdtype < thds->LowCritical.Value.thdtype) \ return(SA_ERR_HPI_INVALID_DATA); \ } \ } \ if (thds->UpMajor.IsSupported == SAHPI_TRUE) { \ if (thds->UpMinor.IsSupported == SAHPI_TRUE) { \ if (thds->UpMajor.Value.thdtype < thds->UpMinor.Value.thdtype) \ return(SA_ERR_HPI_INVALID_DATA); \ } \ if (thds->LowMinor.IsSupported == SAHPI_TRUE) { \ if (thds->UpMajor.Value.thdtype < thds->LowMinor.Value.thdtype) \ return(SA_ERR_HPI_INVALID_DATA); \ } \ if (thds->LowMajor.IsSupported == SAHPI_TRUE) { \ if (thds->UpMajor.Value.thdtype < thds->LowMajor.Value.thdtype) \ return(SA_ERR_HPI_INVALID_DATA); \ } \ if (thds->LowCritical.IsSupported == SAHPI_TRUE) { \ if (thds->UpMajor.Value.thdtype < thds->LowCritical.Value.thdtype) \ return(SA_ERR_HPI_INVALID_DATA); \ } \ } \ if (thds->UpMinor.IsSupported == SAHPI_TRUE) { \ if (thds->LowMinor.IsSupported == SAHPI_TRUE) { \ if (thds->UpMinor.Value.thdtype < thds->LowMinor.Value.thdtype) \ return(SA_ERR_HPI_INVALID_DATA); \ } \ if (thds->LowMajor.IsSupported == SAHPI_TRUE) { \ if (thds->UpMinor.Value.thdtype < thds->LowMajor.Value.thdtype) \ return(SA_ERR_HPI_INVALID_DATA); \ } \ if (thds->LowCritical.IsSupported == SAHPI_TRUE) { \ if (thds->UpMinor.Value.thdtype < thds->LowCritical.Value.thdtype) \ return(SA_ERR_HPI_INVALID_DATA); \ } \ } \ if (thds->LowMinor.IsSupported == SAHPI_TRUE) { \ if (thds->LowMajor.IsSupported == SAHPI_TRUE) { \ if (thds->LowMinor.Value.thdtype < thds->LowMajor.Value.thdtype) \ return(SA_ERR_HPI_INVALID_DATA); \ } \ if (thds->LowCritical.IsSupported == SAHPI_TRUE) { \ if (thds->LowMinor.Value.thdtype < thds->LowCritical.Value.thdtype) \ return(SA_ERR_HPI_INVALID_DATA); \ } \ } \ if (thds->LowMajor.IsSupported == SAHPI_TRUE) { \ if (thds->LowCritical.IsSupported == SAHPI_TRUE) { \ if (thds->LowMajor.Value.thdtype < thds->LowCritical.Value.thdtype) \ return(SA_ERR_HPI_INVALID_DATA); \ } \ } \ } while(0) /** * oh_valid_thresholds: * @thds: Location of threshold definitions to verify. * @rdr: Location of sensor's RDR. * * Validates that the threshold values defined in @thds are valid for a sensor * described by @rdr. The caller may need to read the sensor's existing * sensors first, since @thds may only contain a subset of the possible * writable thresholds. * * Return values: * SA_OK - normal case. * SA_ERR_HPI_INVALID_CMD - Non-writable thresholds, invalid thresholds values, or invalid data type. * SA_ERR_HPI_INVALID_DATA - Threshold values out of order; negative hysteresis value. * SA_ERR_HPI_INVALID_PARAMS - Pointer parameter(s) are NULL. **/ SaErrorT oh_valid_thresholds(SaHpiSensorThresholdsT *thds, SaHpiRdrT *rdr) { SaHpiSensorDataFormatT format; SaHpiSensorThdMaskT writable_thds; if (!thds || !rdr) { err("Invalid parameter."); return(SA_ERR_HPI_INVALID_PARAMS); } if (rdr->RdrType != SAHPI_SENSOR_RDR) { err("Invalid parameter"); return(SA_ERR_HPI_INVALID_PARAMS); } format = rdr->RdrTypeUnion.SensorRec.DataFormat; writable_thds = rdr->RdrTypeUnion.SensorRec.ThresholdDefn.WriteThold; if (rdr->RdrTypeUnion.SensorRec.Category != SAHPI_EC_THRESHOLD || rdr->RdrTypeUnion.SensorRec.ThresholdDefn.IsAccessible == SAHPI_FALSE || rdr->RdrTypeUnion.SensorRec.ThresholdDefn.WriteThold == 0) return(SA_ERR_HPI_INVALID_CMD); validate_threshold(LowCritical, SAHPI_STM_LOW_CRIT); validate_threshold(LowMajor, SAHPI_STM_LOW_MAJOR); validate_threshold(LowMinor, SAHPI_STM_LOW_MINOR); validate_threshold(UpCritical, SAHPI_STM_UP_CRIT); validate_threshold(UpMajor, SAHPI_STM_UP_MAJOR); validate_threshold(UpMinor, SAHPI_STM_UP_MINOR); validate_threshold(PosThdHysteresis, SAHPI_STM_UP_HYSTERESIS); validate_threshold(NegThdHysteresis, SAHPI_STM_LOW_HYSTERESIS); /* Validate defined thresholds are in order: * upper critical >= upper major >= upper minor >= * lower minor >= lower major >= lower critical */ switch (format.ReadingType) { case SAHPI_SENSOR_READING_TYPE_INT64: validate_threshold_order(SensorInt64); break; case SAHPI_SENSOR_READING_TYPE_FLOAT64: validate_threshold_order(SensorFloat64); break; case SAHPI_SENSOR_READING_TYPE_UINT64: validate_threshold_order(SensorUint64); break; case SAHPI_SENSOR_READING_TYPE_BUFFER: break; default: err("Invalid threshold reading type."); return(SA_ERR_HPI_INVALID_CMD); } return(SA_OK); } /** * oh_fprint_thresholds * @stream: file handle * @thresholds: sensor thresholds to be printed * @format: data format for corresponding sensor * @offsets: indentation for printing structure * * * Returns: * SA_ERR_HPI_INVALID_PARAMS - one or more of the parameters is NULL. * SA_ERR_HPI_INVALID_DATA - a value is not one of the enumerated values for the type. * SA_OK - Normal operation. **/ SaErrorT oh_fprint_thresholds(FILE *stream, const SaHpiSensorThresholdsT *thresholds, const SaHpiSensorDataFormatT *format, int offsets) { oh_big_textbuffer bigbuf; if (!stream || !thresholds || !format) { err("Invalid parameter."); return SA_ERR_HPI_INVALID_PARAMS; } oh_init_bigtext(&bigbuf); oh_append_offset(&bigbuf, offsets); if (thresholds->LowCritical.IsSupported) { SaHpiTextBufferT smallbuf; memset(&smallbuf, 0, sizeof(SaHpiTextBufferT)); oh_append_bigtext(&bigbuf, "Low Critical: "); oh_decode_sensorreading(thresholds->LowCritical, *format, &smallbuf); oh_append_bigtext(&bigbuf, (char *)smallbuf.Data); oh_append_bigtext(&bigbuf, "\n"); oh_append_offset(&bigbuf, offsets); } if (thresholds->LowMajor.IsSupported) { SaHpiTextBufferT smallbuf; memset(&smallbuf, 0, sizeof(SaHpiTextBufferT)); oh_append_bigtext(&bigbuf, "Low Major: "); oh_decode_sensorreading(thresholds->LowMajor, *format, &smallbuf); oh_append_bigtext(&bigbuf, (char *)smallbuf.Data); oh_append_bigtext(&bigbuf, "\n"); oh_append_offset(&bigbuf, offsets); } if (thresholds->LowMinor.IsSupported) { SaHpiTextBufferT smallbuf; memset(&smallbuf, 0, sizeof(SaHpiTextBufferT)); oh_append_bigtext(&bigbuf, "Low Minor: "); oh_decode_sensorreading(thresholds->LowMinor, *format, &smallbuf); oh_append_bigtext(&bigbuf, (char *)smallbuf.Data); oh_append_bigtext(&bigbuf, "\n"); oh_append_offset(&bigbuf, offsets); } if (thresholds->UpCritical.IsSupported) { SaHpiTextBufferT smallbuf; memset(&smallbuf, 0, sizeof(SaHpiTextBufferT)); oh_append_bigtext(&bigbuf, "Up Critical: "); oh_decode_sensorreading(thresholds->UpCritical, *format, &smallbuf); oh_append_bigtext(&bigbuf, (char *)smallbuf.Data); oh_append_bigtext(&bigbuf, "\n"); oh_append_offset(&bigbuf, offsets); } if (thresholds->UpMajor.IsSupported) { SaHpiTextBufferT smallbuf; memset(&smallbuf, 0, sizeof(SaHpiTextBufferT)); oh_append_bigtext(&bigbuf, "Up Major: "); oh_decode_sensorreading(thresholds->UpMajor, *format, &smallbuf); oh_append_bigtext(&bigbuf, (char *)smallbuf.Data); oh_append_bigtext(&bigbuf, "\n"); oh_append_offset(&bigbuf, offsets); } if (thresholds->UpMinor.IsSupported) { SaHpiTextBufferT smallbuf; memset(&smallbuf, 0, sizeof(SaHpiTextBufferT)); oh_append_bigtext(&bigbuf, "Up Minor: "); oh_decode_sensorreading(thresholds->UpMinor, *format, &smallbuf); oh_append_bigtext(&bigbuf, (char *)smallbuf.Data); oh_append_bigtext(&bigbuf, "\n"); oh_append_offset(&bigbuf, offsets); } if (thresholds->PosThdHysteresis.IsSupported) { SaHpiTextBufferT smallbuf; memset(&smallbuf, 0, sizeof(SaHpiTextBufferT)); oh_append_bigtext(&bigbuf, "Positive Hysteresis: "); oh_decode_sensorreading(thresholds->PosThdHysteresis, *format, &smallbuf); oh_append_bigtext(&bigbuf, (char *)smallbuf.Data); oh_append_bigtext(&bigbuf, "\n"); oh_append_offset(&bigbuf, offsets); } if (thresholds->NegThdHysteresis.IsSupported) { SaHpiTextBufferT smallbuf; memset(&smallbuf, 0, sizeof(SaHpiTextBufferT)); oh_append_bigtext(&bigbuf, "Negative Hysteresis: "); oh_decode_sensorreading(thresholds->NegThdHysteresis, *format, &smallbuf); oh_append_bigtext(&bigbuf, (char *)smallbuf.Data); oh_append_bigtext(&bigbuf, "\n"); oh_append_offset(&bigbuf, offsets); } return oh_fprint_bigtext(stream, &bigbuf); } /** * oh_compare_sensorreading: * @type: Type of both sensor readings. * @reading1: Pointer to sensor reading. * @reading1: Pointer to sensor reading. * * Compares the Value field of two sensor readings. Sensor readings must be of the * same Type. * * Return values: * -1 - @reading1 < @reading2 * 0 - @reading1 = @reading2 * +1 - @reading1 > @reading2 **/ int oh_compare_sensorreading(SaHpiSensorReadingTypeT type, SaHpiSensorReadingT *reading1, SaHpiSensorReadingT *reading2) { int res; switch(type) { case SAHPI_SENSOR_READING_TYPE_INT64: if (reading1->Value.SensorInt64 < reading2->Value.SensorInt64) { return -1; } else { if (reading1->Value.SensorInt64 == reading2->Value.SensorInt64) { return 0; } else { return 1; } } break; case SAHPI_SENSOR_READING_TYPE_UINT64: if (reading1->Value.SensorUint64 < reading2->Value.SensorUint64) { return -1; } else { if (reading1->Value.SensorUint64 == reading2->Value.SensorUint64) { return 0; } else { return 1; } } break; case SAHPI_SENSOR_READING_TYPE_FLOAT64: if (reading1->Value.SensorFloat64 < reading2->Value.SensorFloat64) { return -1; } else { if (reading1->Value.SensorFloat64 == reading2->Value.SensorFloat64) { return 0; } else { return 1; } } break; case SAHPI_SENSOR_READING_TYPE_BUFFER: res = memcmp(reading1->Value.SensorBuffer, reading2->Value.SensorBuffer, SAHPI_SENSOR_BUFFER_LENGTH); if (res < 0) { return -1; } else if (res > 0) { return 1; } else { return 0; } break; default: err("Invalid sensor reading type."); return 0; } } /** * oh_valid_ctrl_state_mode: * @ctrl_rdr: Pointer to control's RDR information. * @mode: Control's mode. * @state: Pointer to contol's state. * * Verifies that the @mode and @state data are compatible with a control's RDR information. * This routine performs all the static checks defined in the HPI spec but the caller must * perform the following checks: * - Verify control's resource has SAHPI_CAPABILITY_CONTROL set. * - Check to see if control is on, if SAHPI_STATE_PULSE_ON is supported and set; * Check to see if control is off, if SAHPI_STATE_PULSE_OFF is supported and set. * Caller needs to return SA_ERR_HPI_INVALID_REQUEST in either of these cases. * * As specified in the HPI spec, if @mode = SAHPI_CTRL_MODE_AUTO, this routine * ignores @state. * * Return values: * SA_OK - Normal operation. * SA_ERR_HPI_INVALID_PARAMS - See HPI spec. * SA_ERR_HPI_INVALID_DATA - See HPI spec. * SA_ERR_HPI_READ_ONLY - See HPI spec. **/ SaErrorT oh_valid_ctrl_state_mode(SaHpiCtrlRecT *ctrl_rdr, SaHpiCtrlModeT mode, SaHpiCtrlStateT *state) { /* Check for valid mode operations */ if (NULL == oh_lookup_ctrlmode(mode)) return(SA_ERR_HPI_INVALID_PARAMS); if (ctrl_rdr->DefaultMode.ReadOnly == SAHPI_TRUE) { if (mode != ctrl_rdr->DefaultMode.Mode) return(SA_ERR_HPI_READ_ONLY); } if (mode != SAHPI_CTRL_MODE_AUTO && !state) return(SA_ERR_HPI_INVALID_PARAMS); /* Check for valid state operations */ if (mode != SAHPI_CTRL_MODE_AUTO) { if (ctrl_rdr->Type != state->Type) return(SA_ERR_HPI_INVALID_DATA); if (NULL == oh_lookup_ctrltype(state->Type)) return(SA_ERR_HPI_INVALID_DATA); switch(state->Type) { case SAHPI_CTRL_TYPE_DIGITAL: if (NULL == oh_lookup_ctrlstatedigital(state->StateUnion.Digital)) return(SA_ERR_HPI_INVALID_PARAMS); break; case SAHPI_CTRL_TYPE_DISCRETE: /* No HPI spec error check - leave to caller, if needed */ break; case SAHPI_CTRL_TYPE_ANALOG: if (state->StateUnion.Analog < ctrl_rdr->TypeUnion.Analog.Min) return(SA_ERR_HPI_INVALID_DATA); if (state->StateUnion.Analog > ctrl_rdr->TypeUnion.Analog.Max) return(SA_ERR_HPI_INVALID_DATA); break; case SAHPI_CTRL_TYPE_STREAM: if (state->StateUnion.Stream.StreamLength > SAHPI_CTRL_MAX_STREAM_LENGTH) return(SA_ERR_HPI_INVALID_PARAMS); break; case SAHPI_CTRL_TYPE_TEXT: if (state->StateUnion.Text.Text.DataType != ctrl_rdr->TypeUnion.Text.DataType) return(SA_ERR_HPI_INVALID_DATA); if (state->StateUnion.Text.Text.DataType == SAHPI_TL_TYPE_UNICODE || state->StateUnion.Text.Text.DataType == SAHPI_TL_TYPE_TEXT) { if (state->StateUnion.Text.Text.Language != ctrl_rdr->TypeUnion.Text.Language) return(SA_ERR_HPI_INVALID_DATA); } if (!oh_valid_textbuffer(&(state->StateUnion.Text.Text))) return (SA_ERR_HPI_INVALID_PARAMS); { /* Check for text buffer overflow */ int char_num; if (state->StateUnion.Text.Line > ctrl_rdr->TypeUnion.Text.MaxLines) return(SA_ERR_HPI_INVALID_DATA); if (state->StateUnion.Text.Text.DataType == SAHPI_TL_TYPE_UNICODE) { char_num = state->StateUnion.Text.Text.DataLength/2; } else { char_num = state->StateUnion.Text.Text.DataLength; } if (char_num) { int max_chars; if (state->StateUnion.Text.Line == SAHPI_TLN_ALL_LINES) { max_chars = ctrl_rdr->TypeUnion.Text.MaxLines * ctrl_rdr->TypeUnion.Text.MaxChars; } else { max_chars = (ctrl_rdr->TypeUnion.Text.MaxLines * ctrl_rdr->TypeUnion.Text.MaxChars) - ((state->StateUnion.Text.Line - 1) * ctrl_rdr->TypeUnion.Text.MaxChars); } if (char_num > max_chars) return(SA_ERR_HPI_INVALID_DATA); } } break; case SAHPI_CTRL_TYPE_OEM: /* No HPI spec error check - leave to caller, if needed */ break; default: err("Invalid control state"); return(SA_ERR_HPI_INTERNAL_ERROR); } } return(SA_OK); } openhpi-2.14.1/utils/rpt_utils.c0000644000076400007640000010302211302567131013517 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2003, 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * Renier Morales */ #include #include #include #include typedef struct { SaHpiRptEntryT rpt_entry; int owndata; void *data; /* private data for the owner of the RPTable */ GSList *rdrlist; /* Contains RDRecords for sequence lookups */ GHashTable *rdrtable; /* Contains RDRecords for fast RecordId lookups */ } RPTEntry; typedef struct { SaHpiRdrT rdr; int owndata; void *data; /* private data for the owner of the rpt entry. */ } RDRecord; static RPTEntry *get_rptentry_by_rid(RPTable *table, SaHpiResourceIdT rid) { GSList *rptnode = NULL; RPTEntry *rptentry = NULL; if (!table) { err("ERROR: Cannot work on a null table pointer."); return NULL; } if (!(table->rptlist)) { /*dbg("Info: RPT is empty.");*/ return NULL; } if (rid == SAHPI_FIRST_ENTRY) { rptentry = (RPTEntry *) (table->rptlist->data); } else { rptnode = (GSList *)g_hash_table_lookup(table->rptable, &rid); rptentry = rptnode ? (RPTEntry *)rptnode->data : NULL; } return rptentry; } static GSList *get_rptnode_by_rid(RPTable *table, SaHpiResourceIdT rid) { GSList *rptnode = NULL; if (!table) { err("ERROR: Cannot work on a null table pointer."); return NULL; } if (!(table->rptlist)) { /*dbg("Info: RPT is empty.");*/ return NULL; } if (rid == SAHPI_FIRST_ENTRY) { rptnode = (GSList *) (table->rptlist); } else { rptnode = (GSList *)g_hash_table_lookup(table->rptable, &rid); } return rptnode; } static RDRecord *get_rdrecord_by_id(RPTEntry *rptentry, SaHpiEntryIdT id) { GSList *rdrnode = NULL; RDRecord *rdrecord = NULL; if (!rptentry) { err("ERROR: Cannot lookup rdr inside null resource."); return NULL; } if (!rptentry->rdrlist) { /*dbg("Info: RDR repository is empty.");*/ return NULL; } if (id == SAHPI_FIRST_ENTRY) { rdrecord = (RDRecord *) (rptentry->rdrlist->data); } else { rdrnode = (GSList *)g_hash_table_lookup(rptentry->rdrtable, &id); rdrecord = rdrnode ? (RDRecord *)rdrnode->data : NULL; } return rdrecord; } static GSList *get_rdrnode_by_id(RPTEntry *rptentry, SaHpiEntryIdT id) { GSList *rdrnode = NULL; if (!rptentry) { err("ERROR: Cannot lookup rdr inside null resource."); return NULL; } if (!rptentry->rdrlist) { /*dbg("Info: RPT is empty.");*/ return NULL; } if (id == SAHPI_FIRST_ENTRY) { rdrnode = (GSList *) (rptentry->rdrlist); } else { rdrnode = (GSList *)g_hash_table_lookup(rptentry->rdrtable, &id); } return rdrnode; } static int check_instrument_id(SaHpiRptEntryT *rptentry, SaHpiRdrT *rdr) { int result = 0; static const SaHpiInstrumentIdT SENSOR_AGGREGATE_MAX = 0x0000010F; switch (rdr->RdrType) { case SAHPI_SENSOR_RDR: if (rdr->RdrTypeUnion.SensorRec.Num >= SAHPI_STANDARD_SENSOR_MIN && rdr->RdrTypeUnion.SensorRec.Num <= SAHPI_STANDARD_SENSOR_MAX) { if (rdr->RdrTypeUnion.SensorRec.Num > SENSOR_AGGREGATE_MAX) { result = -1; } else if (rptentry->ResourceCapabilities & SAHPI_CAPABILITY_AGGREGATE_STATUS) { result = 0; } else { result = -1; } } else { result = 0; } break; default: result = 0; } return result; } static SaHpiInstrumentIdT get_rdr_type_num(SaHpiRdrT *rdr) { SaHpiInstrumentIdT num = 0; switch (rdr->RdrType) { case SAHPI_CTRL_RDR: num = rdr->RdrTypeUnion.CtrlRec.Num; break; case SAHPI_SENSOR_RDR: num = rdr->RdrTypeUnion.SensorRec.Num; break; case SAHPI_INVENTORY_RDR: num = rdr->RdrTypeUnion.InventoryRec.IdrId; break; case SAHPI_WATCHDOG_RDR: num = rdr->RdrTypeUnion.WatchdogRec.WatchdogNum; break; case SAHPI_ANNUNCIATOR_RDR: num = rdr->RdrTypeUnion.AnnunciatorRec.AnnunciatorNum; break; case SAHPI_DIMI_RDR: num = rdr->RdrTypeUnion.DimiRec.DimiNum; break; case SAHPI_FUMI_RDR: num = rdr->RdrTypeUnion.FumiRec.Num; break; default: num = 0; } return num; } static void update_rptable(RPTable *table) { struct timeval tv; SaHpiTimeT time; if (!table) { err("ERROR: Cannot work on a null table pointer."); return; } gettimeofday(&tv, NULL); time = (SaHpiTimeT) tv.tv_sec * 1000000000 + tv.tv_usec * 1000; table->update_timestamp = time; table->update_count++; } /** * oh_get_rdr_uid * @type: type of rdr * @num: id number of the RDR unique withing the RDR type for that resource * * Helper function to derive the Record id of an rdr from its @type and @num * * Returns: a derived Record Id used to identify RDRs within Resources */ SaHpiEntryIdT oh_get_rdr_uid(SaHpiRdrTypeT type, SaHpiInstrumentIdT num) { SaHpiEntryIdT uid; uid = ((SaHpiEntryIdT)type) << 16; uid = uid + (SaHpiEntryIdT)num; return uid; } SaHpiInstrumentIdT oh_get_rdr_num(SaHpiEntryIdT rdrid) { return rdrid & 0x0000ffff; } /** * General RPT calls **/ /** * oh_init_rpt * @table: Pointer to RPTable structure to be initialized. * * * Returns: SA_OK on success Or minus SA_OK on error. **/ SaErrorT oh_init_rpt(RPTable *table) { if (!table) { err("ERROR: Cannot work on a null table pointer."); return SA_ERR_HPI_INVALID_PARAMS; } table->update_timestamp = SAHPI_TIME_UNSPECIFIED; table->update_count = 0; table->rptlist = NULL; table->rptable = NULL; return SA_OK; } /** * oh_flush_rpt * @table: Pointer to the RPT to flush. * * Cleans RPT from all entries and RDRs and frees the memory * associated with them. * * Returns: SA_OK on success Or minus SA_OK on error. **/ SaErrorT oh_flush_rpt(RPTable *table) { SaHpiRptEntryT *tmp_entry; while ((tmp_entry = oh_get_resource_by_id(table, SAHPI_FIRST_ENTRY)) != NULL) { oh_remove_resource(table, SAHPI_FIRST_ENTRY); } return SA_OK; } /** * rpt_diff * @cur_rpt: IN. Pointer to RPTable that represents the current state of resources * and rdrs. * @new_rpt: IN. Pointer to RPTable that contains rpt entries and rdrs just recently * discovered. * @res_new: OUT. List of new or changed rpt entries * @rdr_new: OUT. List of new or changed rdrs * @res_gone: OUT. List of old and not present resources. * @rdr_gone: OUT. List of old and not present rdrs. * * Extracts from current the resources and rdrs that are not found * in new and puts them in res_gone and rdr_gone. Also, puts in res_new and rdr_new * the resources and rdrs that are not already in current Or that are not identical * to the ones in current. * * Returns: SA_ERR_HPI_INVALID_PARAMS if any argument is NULL, otherwise SA_OK. **/ SaErrorT rpt_diff(RPTable *cur_rpt, RPTable *new_rpt, GSList **res_new, GSList **rdr_new, GSList **res_gone, GSList **rdr_gone) { SaHpiRptEntryT *res = NULL; if (!cur_rpt || !new_rpt || !res_new || !rdr_new || !res_gone || !rdr_gone) return SA_ERR_HPI_INVALID_PARAMS; /* Look for absent resources and rdrs */ for (res = oh_get_resource_by_id(cur_rpt, SAHPI_FIRST_ENTRY); res != NULL; res = oh_get_resource_next(cur_rpt, res->ResourceId)) { SaHpiRptEntryT *tmp_res = oh_get_resource_by_id(new_rpt, res->ResourceId); if (tmp_res == NULL) *res_gone = g_slist_append(*res_gone, (gpointer)res); else { SaHpiRdrT *rdr = NULL; for (rdr = oh_get_rdr_by_id(cur_rpt, res->ResourceId, SAHPI_FIRST_ENTRY); rdr != NULL; rdr = oh_get_rdr_next(cur_rpt, res->ResourceId, rdr->RecordId)) { SaHpiRdrT *tmp_rdr = oh_get_rdr_by_id(new_rpt, res->ResourceId, rdr->RecordId); if (tmp_rdr == NULL) *rdr_gone = g_slist_append(*rdr_gone, (gpointer)rdr); } } } /* Look for new resources and rdrs*/ for (res = oh_get_resource_by_id(new_rpt, SAHPI_FIRST_ENTRY); res != NULL; res = oh_get_resource_next(new_rpt, res->ResourceId)) { SaHpiRptEntryT *tmp_res = oh_get_resource_by_id(cur_rpt, res->ResourceId); SaHpiRdrT *rdr = NULL; if (tmp_res == NULL || memcmp(res, tmp_res, sizeof(SaHpiRptEntryT))) { *res_new = g_slist_append(*res_new, (gpointer)res); } for (rdr = oh_get_rdr_by_id(new_rpt, res->ResourceId, SAHPI_FIRST_ENTRY); rdr != NULL; rdr = oh_get_rdr_next(new_rpt, res->ResourceId, rdr->RecordId)) { SaHpiRdrT *tmp_rdr = NULL; if (tmp_res != NULL) tmp_rdr = oh_get_rdr_by_id(cur_rpt, res->ResourceId, rdr->RecordId); if (tmp_rdr == NULL || memcmp(rdr, tmp_rdr, sizeof(SaHpiRdrT))) *rdr_new = g_slist_append(*rdr_new, (gpointer)rdr); } } return SA_OK; } /** * oh_get_rpt_info * @table: pointer to RPT * @update_count: pointer of where to place the rpt's update count * @update_timestamp: pointer of where to place the rpt's update timestamp * * Returns: SA_OK on success Or minus SA_OK on error. **/ SaErrorT oh_get_rpt_info(RPTable *table, SaHpiUint32T *update_count, SaHpiTimeT *update_timestamp) { if (!table || !update_count || !update_timestamp) { err("ERROR: Invalid parameters."); return SA_ERR_HPI_INVALID_PARAMS; } *update_count = table->update_count; *update_timestamp = table->update_timestamp; return SA_OK; } /** * Resource interface functions */ /** * oh_add_resource * @table: Pointer to the RPT to which the RPT entry will be added. * @entry: The RPT entry (resource) to be added to the RPT. * @data: Pointer to private data for storing along with the RPT entry. * @owndata: boolean flag. true (%KEEP_RPT_DATA) to tell the interface *not* * to free the data when the resource is removed. false (%FREE_RPT_DATA) to tell * the interface to free the data when the resource is removed. * * Add a RPT entry to the RPT along with some private data. * If an RPT entry with the same resource id exists int the RPT, it will be * overlayed with the new RPT entry. Also, this function will assign the * resource id as its entry id since it is expected to be unique for the table. * The update count and timestamp will not be updated if the entry being added * already existed in the table and was the same. * * Returns: SA_OK on success Or minus SA_OK on error. SA_ERR_HPI_INVALID_PARAMS will * be returned if @table is NULL, @entry is NULL, ResourceId in @entry equals * SAHPI_FIRST_ENTRY, ResourceId in @entry equals SAHPI_UNSPECIFIED_RESOURCE_ID, * or ResourceEntity in @entry has a malformed entity path (look at the * entity path utils documentation). **/ SaErrorT oh_add_resource(RPTable *table, SaHpiRptEntryT *entry, void *data, int owndata) { RPTEntry *rptentry; int update_info = 0; if (!table) { err("ERROR: Cannot work on a null table pointer."); return SA_ERR_HPI_INVALID_PARAMS; } else if (!entry) { err("Failed to add. RPT entry is NULL."); return SA_ERR_HPI_INVALID_PARAMS; } else if (entry->ResourceId == SAHPI_FIRST_ENTRY) { err("Failed to add. RPT entry needs a resource id before being added"); return SA_ERR_HPI_INVALID_PARAMS; } else if (entry->ResourceId == SAHPI_UNSPECIFIED_RESOURCE_ID) { err("Failed to add. RPT entry has an invalid/reserved id assigned. (SAHPI_UNSPECIFIED_RESOURCE_ID)"); return SA_ERR_HPI_INVALID_PARAMS; } else if (!oh_valid_ep(&(entry->ResourceEntity))) { err("Failed to add RPT entry. Entity path does not contain root element."); return SA_ERR_HPI_INVALID_PARAMS; } entry->EntryId = entry->ResourceId; /* Check to see if the entry is in the RPTable already */ rptentry = get_rptentry_by_rid(table, entry->ResourceId); /* If not, create new RPTEntry */ if (!rptentry) { rptentry = (RPTEntry *)g_malloc0(sizeof(RPTEntry)); if (!rptentry) { err("Not enough memory to add RPT entry."); return SA_ERR_HPI_OUT_OF_MEMORY; } update_info = 1; /* Have a new changed entry */ /* Put new RPTEntry in RPTable */ table->rptlist = g_slist_append(table->rptlist, (gpointer)rptentry); /* Add to rpt hash table */ if (!table->rptable) /* Create hash table if it doesn't exist */ table->rptable = g_hash_table_new(g_int_hash, g_int_equal); rptentry->rpt_entry.EntryId = entry->ResourceId; g_hash_table_insert(table->rptable, &(rptentry->rpt_entry.EntryId), g_slist_last(table->rptlist)); } /* Else, modify existing RPTEntry */ if (rptentry->data && rptentry->data != data && !rptentry->owndata) g_free(rptentry->data); rptentry->data = data; rptentry->owndata = owndata; /* Check if we really have a new/changed entry */ if (update_info || memcmp(entry, &(rptentry->rpt_entry), sizeof(SaHpiRptEntryT))) { update_info = 1; rptentry->rpt_entry = *entry; } if (update_info) update_rptable(table); return SA_OK; } /** * oh_remove_resource * @table: Pointer to the RPT from which an RPT entry will be removed. * @rid: Resource id of the RPT entry to be removed. * * Remove a resource from the RPT. If the @rid is * %SAHPI_FIRST_ENTRY, the first RPT entry in the table will be removed. * The void data will be freed if @owndata was false (%FREE_RPT_DATA) when adding * the resource, otherwise if @owndata was true (%KEEP_RPT_DATA) it will not be freed. * * Returns: SA_OK on success Or minus SA_OK on error. **/ SaErrorT oh_remove_resource(RPTable *table, SaHpiResourceIdT rid) { RPTEntry *rptentry; rptentry = get_rptentry_by_rid(table, rid); if (!rptentry) { err("Failed to remove RPT entry. No Resource found by that id"); return SA_ERR_HPI_NOT_PRESENT; } else { SaHpiRdrT *tmp_rdr; /* Remove all RDRs for the resource first */ while ((tmp_rdr = oh_get_rdr_by_id(table, rid, SAHPI_FIRST_ENTRY)) != NULL) { oh_remove_rdr(table, rid, SAHPI_FIRST_ENTRY); } /* then remove the resource itself. */ table->rptlist = g_slist_remove(table->rptlist, (gpointer)rptentry); if (!rptentry->owndata) g_free(rptentry->data); g_hash_table_remove(table->rptable, &(rptentry->rpt_entry.EntryId)); g_free((gpointer)rptentry); if (!table->rptlist) { g_hash_table_destroy(table->rptable); table->rptable = NULL; } } update_rptable(table); return SA_OK; } /** * oh_get_resource_data * @table: Pointer to the RPT for looking up the RPT entry's private data. * @rid: Resource id of the RPT entry that holds the private data. * * Get the private data for a RPT entry. If the @rid is * %SAHPI_FIRST_ENTRY, the first RPT entry's data in the table will be returned. * * Returns: A void pointer to the private data for the RPT entry requested, or NULL * if the RPT entry was not found or the table was a NULL pointer. **/ void *oh_get_resource_data(RPTable *table, SaHpiResourceIdT rid) { RPTEntry *rptentry; rptentry = get_rptentry_by_rid(table, rid); if (!rptentry) { /*dbg("Warning: RPT entry not found. Returning NULL.");*/ return NULL; } return rptentry->data; } /** * oh_get_resource_by_id * @table: Pointer to the RPT for looking up the RPT entry. * @rid: Resource id of the RPT entry to be looked up. * * Get a RPT entry from the RPT by using the resource id. * If @rid is %SAHPI_FIRST_ENTRY, the first RPT entry in the table will be returned. * * Returns: * Pointer to the RPT entry found or NULL if an RPT entry by that * id was not found or the table was a NULL pointer. **/ SaHpiRptEntryT *oh_get_resource_by_id(RPTable *table, SaHpiResourceIdT rid) { RPTEntry *rptentry; rptentry = get_rptentry_by_rid(table, rid); if (!rptentry) { /*dbg("Warning: RPT entry not found. Returning NULL.");*/ return NULL; } return &(rptentry->rpt_entry); } /** * oh_get_resource_by_ep * @table: Pointer to the RPT for looking up the RPT entry. * @ep: Entity path of the RPT entry to be looked up. * * Get a RPT entry from the RPT by using the entity path. * * Returns: * Pointer to the RPT entry found or NULL if an RPT entry by that * entity path was not found or the table was a NULL pointer. **/ SaHpiRptEntryT *oh_get_resource_by_ep(RPTable *table, SaHpiEntityPathT *ep) { RPTEntry *rptentry = NULL; GSList *node = NULL; SaHpiResourceIdT rid = 0; if (!table) { err("ERROR: Cannot work on a null table pointer."); return NULL; } /* Check the uid database first */ rid = oh_uid_is_initialized() ? oh_uid_lookup(ep) : 0; if (rid > 0) { /* Found it in uid database */ return oh_get_resource_by_id(table, rid); } else { dbg("Didn't find the EP in the Uid table so " "looking manually in the RPTable"); } for (node = table->rptlist; node != NULL; node = node->next) { rptentry = (RPTEntry *) node->data; if (oh_cmp_ep(&(rptentry->rpt_entry.ResourceEntity), ep)) break; else rptentry = NULL; } if (!rptentry) { /*dbg("Warning: RPT entry not found. Returning NULL.");*/ return NULL; } return &(rptentry->rpt_entry); } /** * oh_get_resource_next * @table: Pointer to the RPT for looking up the RPT entry. * @rid_prev: Resource id of the RPT entry previous to the one being looked up. * * Get the RPT entry next to the specified RPT entry * from the RPT. If @rid_prev is %SAHPI_FIRST_ENTRY, the first RPT entry * in the table will be returned. * * Returns: * Pointer to the RPT entry found or NULL if the previous RPT entry by that * id was not found or the table was a NULL pointer. **/ SaHpiRptEntryT *oh_get_resource_next(RPTable *table, SaHpiResourceIdT rid_prev) { RPTEntry *rptentry = NULL; GSList *rptnode = NULL; if (rid_prev == SAHPI_FIRST_ENTRY) { rptentry = get_rptentry_by_rid(table, rid_prev); } else { rptnode = get_rptnode_by_rid(table, rid_prev); if (rptnode && rptnode->next) { rptentry = (RPTEntry *)rptnode->next->data; } } return rptentry ? &(rptentry->rpt_entry) : NULL; } /** * RDR interface functions */ /** * oh_add_rdr * @table: Pointer to RPT table containig the RPT entry to which the RDR will belong. * @rid: Id of the RPT entry that will own the RDR to be added. * @rdr: RDR to be added to an RPT entry's RDR repository. * @data: Pointer to private data belonging to the RDR that is being added. * @owndata: boolean flag. true (%KEEP_RPT_DATA) to tell the interface *not* * to free the data when the rdr is removed. false (%FREE_RPT_DATA) to tell * the interface to free the data when the rdr is removed. * * Add an RDR to a RPT entry's RDR repository. * If an RDR is found with the same record id as the one being added, the RDR being * added will overlay the existing one. Also, a unique record id will be assigned * to it based on the RDR type and its type's numeric id. * All rdr interface funtions, except oh_add_rdr() will act in the context of * the first RPT entry in the table, if @rid is %SAHPI_FIRST_ENTRY. * * Returns: SA_OK on success Or minus SA_OK on error. Will return * SA_ERR_HPI_INVALID_PARAMS if instrument id is invalid. An invalid * intrument id for a sensor is in the range of 0x100-0x1FF. An aggregate type * of sensor can have its instrument id in the range of 0x100-0x10F, but * the resource must have the aggregate sensor capabilitiy bit set. **/ SaErrorT oh_add_rdr(RPTable *table, SaHpiResourceIdT rid, SaHpiRdrT *rdr, void *data, int owndata) { RPTEntry *rptentry; RDRecord *rdrecord; SaHpiInstrumentIdT type_num; if (!rdr) { err("Failed to add. RDR is NULL."); return SA_ERR_HPI_INVALID_PARAMS; } rptentry = get_rptentry_by_rid(table, rid); if (!rptentry){ err("Failed to add RDR. Parent RPT entry was not found in table."); return SA_ERR_HPI_NOT_PRESENT; } if (check_instrument_id(&(rptentry->rpt_entry), rdr)) { err("Invalid instrument id found in RDR."); return SA_ERR_HPI_INVALID_PARAMS; } type_num = get_rdr_type_num(rdr); /* Form correct RecordId. */ rdr->RecordId = oh_get_rdr_uid(rdr->RdrType, type_num); /* Check if record exists */ rdrecord = get_rdrecord_by_id(rptentry, rdr->RecordId); /* If not, create new rdr */ if (!rdrecord) { rdrecord = (RDRecord *)g_malloc0(sizeof(RDRecord)); if (!rdrecord) { err("Not enough memory to add RDR."); return SA_ERR_HPI_OUT_OF_MEMORY; } /* Put new rdrecord in rdr repository */ rptentry->rdrlist = g_slist_append(rptentry->rdrlist, (gpointer)rdrecord); /* Create rdr hash table if first rdr here */ if (!rptentry->rdrtable) rptentry->rdrtable = g_hash_table_new(g_int_hash, g_int_equal); rdrecord->rdr.RecordId = rdr->RecordId; g_hash_table_insert(rptentry->rdrtable, &(rdrecord->rdr.RecordId), g_slist_last(rptentry->rdrlist)); } /* Else, modify existing rdrecord */ if (rdrecord->data && rdrecord->data != data && !rdrecord->owndata) g_free(rdrecord->data); rdrecord->data = data; rdrecord->owndata = owndata; rdrecord->rdr = *rdr; return SA_OK; } /** * oh_remove_rdr * @table: Pointer to RPT table containig the RPT entry from which the RDR will * be removed. * @rid: Id of the RPT entry from which the RDR will be removed. * @rdrid: Record id of the RDR to remove. * * * Remove an RDR from a RPT entry's RDR repository. * If @rdrid is %SAHPI_FIRST_ENTRY, the first RDR in the repository will be removed. * If @owndata was set to false (%FREE_RPT_DATA) on the rdr when it was added, * the data will be freed, otherwise if it was set to true (%KEEP_RPT_DATA), * it will not be freed. * All rdr interface funtions, except oh_add_rdr() will act in the context of * the first RPT entry in the table, if @rid is %SAHPI_FIRST_ENTRY. * * Returns: SA_OK on success Or minus SA_OK on error. **/ SaErrorT oh_remove_rdr(RPTable *table, SaHpiResourceIdT rid, SaHpiEntryIdT rdrid) { RPTEntry *rptentry; RDRecord *rdrecord; rptentry = get_rptentry_by_rid(table, rid); if (!rptentry) { err("Failed to remove RDR. Parent RPT entry was not found."); return SA_ERR_HPI_NOT_PRESENT; } rdrecord = get_rdrecord_by_id(rptentry, rdrid); if (!rdrecord) { err("Failed to remove RDR. Could not be found."); return SA_ERR_HPI_NOT_PRESENT; } else { rptentry->rdrlist = g_slist_remove(rptentry->rdrlist, (gpointer)rdrecord); if (!rdrecord->owndata) g_free(rdrecord->data); g_hash_table_remove(rptentry->rdrtable, &(rdrecord->rdr.RecordId)); g_free((gpointer)rdrecord); if (!rptentry->rdrlist) { g_hash_table_destroy(rptentry->rdrtable); rptentry->rdrtable = NULL; } } return SA_OK; } /** * oh_get_rdr_data * @table: Pointer to RPT table containig the RPT entry from which the RDR's data * will be read. * @rid: Id of the RPT entry from which the RDR's data will be read. * @rdrid: Record id of the RDR to read data from. * * * Get the private data associated to an RDR. * If @rdrid is %SAHPI_FIRST_ENTRY, the first RDR's data in the repository will be returned. * All rdr interface funtions, except oh_add_rdr() will act in the context of * the first RPT entry in the table, if @rid is %SAHPI_FIRST_ENTRY. * * Returns: A void pointer to the RDR data, or NULL if no data for that RDR was found or * the table pointer is NULL. **/ void *oh_get_rdr_data(RPTable *table, SaHpiResourceIdT rid, SaHpiEntryIdT rdrid) { RPTEntry *rptentry; RDRecord *rdrecord; rptentry = get_rptentry_by_rid(table, rid); if (!rptentry) { err("Warning: RPT entry not found. Cannot find RDR."); return NULL; /* No resource found by that id */ } rdrecord = get_rdrecord_by_id(rptentry, rdrid); if (!rdrecord) { /*dbg("Warning: RDR not found. Returning NULL.");*/ return NULL; } return rdrecord->data; } /** * oh_get_rdr_by_id * @table: Pointer to RPT table containig the RPT entry tha has the RDR * being looked up. * @rid: Id of the RPT entry containing the RDR being looked up. * @rdrid: Record id of the RDR being looked up. * * Get a reference to an RDR by its record id. * If @rdrid is %SAHPI_FIRST_ENTRY, the first RDR in the repository will be returned. * All rdr interface funtions, except oh_add_rdr() will act in the context of * the first RPT entry in the table, if @rid is %SAHPI_FIRST_ENTRY. * * Returns: * Reference to the RDR looked up or NULL if no RDR was found. **/ SaHpiRdrT *oh_get_rdr_by_id(RPTable *table, SaHpiResourceIdT rid, SaHpiEntryIdT rdrid) { RPTEntry *rptentry; RDRecord *rdrecord; rptentry = get_rptentry_by_rid(table, rid); if (!rptentry) { err("Warning: RPT entry not found. Cannot find RDR."); return NULL; /* No resource found by that id */ } rdrecord = get_rdrecord_by_id(rptentry, rdrid); if (!rdrecord) { /*dbg("Warning: RDR not found. Returning NULL.");*/ return NULL; } return &(rdrecord->rdr); } /** * oh_get_rdr_by_type * @table: Pointer to RPT table containig the RPT entry tha has the RDR * being looked up. * @rid: Id of the RPT entry containing the RDR being looked up. * @type: RDR Type of the RDR being looked up. * @num: RDR id within the RDR type for the specified RPT entry. * * Get a reference to an RDR by its type and number. * All rdr interface funtions, except oh_add_rdr() will act in the context of * the first RPT entry in the table, if @rid is %SAHPI_FIRST_ENTRY. * * Returns: * Reference to the RDR looked up or NULL if no RDR was found. **/ SaHpiRdrT *oh_get_rdr_by_type(RPTable *table, SaHpiResourceIdT rid, SaHpiRdrTypeT type, SaHpiInstrumentIdT num) { RPTEntry *rptentry = NULL; RDRecord *rdrecord = NULL; SaHpiEntryIdT rdr_uid; rptentry = get_rptentry_by_rid(table, rid); if (!rptentry) { err("Warning: RPT entry not found. Cannot find RDR."); return NULL; /* No resource found by that id */ } /* Get rdr_uid from type/num combination */ rdr_uid = oh_get_rdr_uid(type, num); rdrecord = get_rdrecord_by_id(rptentry, rdr_uid); if (!rdrecord) { /*dbg("Warning: RDR not found. Returning NULL.");*/ return NULL; } return &(rdrecord->rdr); } /** * oh_get_rdr_next * @table: Pointer to the RPT containing the RPT entry to look up the RDR in. * @rid: Id of the RPT entry containing the RDR being looked up. * @rdrid_prev: Record id of the RDR previous to the one being looked up, relative * to the specified RPT entry. * * Get the RDR next to the specified RDR in the specified * RPT entry's repository. If @rdrid_prev is %SAHPI_FIRST_ENTRY, the first RDR * in the repository will be returned. * All rdr interface funtions, except oh_add_rdr() will act in the context of * the first RPT entry in the table, if @rid is %SAHPI_FIRST_ENTRY. * * Returns: * Pointer to the RDR found or NULL if the previous RDR by that * id was not found. If the @rdrid_prev was %SAHPI_FIRST_ENTRY, the first RDR in the list * will be returned. **/ SaHpiRdrT *oh_get_rdr_next(RPTable *table, SaHpiResourceIdT rid, SaHpiEntryIdT rdrid_prev) { RPTEntry *rptentry = NULL; RDRecord *rdrecord = NULL; GSList *rdrnode = NULL; rptentry = get_rptentry_by_rid(table, rid); if (!rptentry) { err("Warning: RPT entry not found. Cannot find RDR."); return NULL; /* No resource found by that id */ } if (rdrid_prev == SAHPI_FIRST_ENTRY) { rdrecord = get_rdrecord_by_id(rptentry, rdrid_prev); } else { rdrnode = get_rdrnode_by_id(rptentry, rdrid_prev); if (rdrnode && rdrnode->next) { rdrecord = (RDRecord *)rdrnode->next->data; } } return rdrecord ? &(rdrecord->rdr) : NULL; } SaHpiRdrT *oh_get_rdr_by_type_first(RPTable *table, SaHpiResourceIdT rid, SaHpiRdrTypeT type) { RPTEntry *rptentry = NULL; RDRecord *rdrecord = NULL; GSList *node = NULL; rptentry = get_rptentry_by_rid(table, rid); if (!rptentry) { err("Warning: RPT entry not found. Cannot find RDR."); return NULL; /* No resource found by that id */ } /* Get first RDR matching the type */ for (node = rptentry->rdrlist; node; node = node->next) { RDRecord *temp = (RDRecord *)node->data; if (temp->rdr.RdrType == type) { rdrecord = temp; break; } } if (!rdrecord) return NULL; return &(rdrecord->rdr); } SaHpiRdrT *oh_get_rdr_by_type_next(RPTable *table, SaHpiResourceIdT rid, SaHpiRdrTypeT type, SaHpiInstrumentIdT num) { RPTEntry *rptentry = NULL; RDRecord *rdrecord = NULL; GSList *node = NULL; rptentry = get_rptentry_by_rid(table, rid); if (!rptentry) { err("Warning: RPT entry not found. Cannot find RDR."); return NULL; /* No resource found by that id */ } /* Get rdr_uid from type/num combination */ node = get_rdrnode_by_id(rptentry, oh_get_rdr_uid(type, num)); if (!node) return NULL; for (node = node->next; node; node = node->next) { RDRecord *temp = (RDRecord *)node->data; if (temp->rdr.RdrType == type) { rdrecord = temp; break; } } if (!rdrecord) return NULL; return &(rdrecord->rdr); } openhpi-2.14.1/utils/uid_utils.c0000644000076400007640000003717511302567131013512 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2003, 2004, 2006 * Copyright (c) 2003 by Intel Corp. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * David Judkovics * Renier Morales */ #include #include #include #include #include #include #include #include #include #include #include #ifdef OH_DBG_MSGS #define dbg_uid_lock(format, ...) \ do { \ if (getenv("OPENHPI_DBG_UID_LOCK") && !strcmp("YES",getenv("OPENHPI_DBG_UID_LOCK"))){ \ fprintf(stderr, " UID_LOCK: %s:%d:%s: ", __FILE__, __LINE__, __func__); \ fprintf(stderr, format "\n", ## __VA_ARGS__); \ } \ } while(0) #else #define dbg_uid_lock(format, ...) #endif #define uid_lock(uidmutex) \ do { \ dbg_uid_lock("Locking UID mutex..."); \ g_static_mutex_lock(uidmutex); \ dbg_uid_lock("OK. UID mutex locked."); \ } while (0) #define uid_unlock(uidmutex) \ do { \ dbg_uid_lock("Unlocking UID mutex..."); \ g_static_mutex_unlock(uidmutex); \ dbg_uid_lock("OK. UID mutex unlocked."); \ } while (0) /* uid to entity path cross reference (xref) data structure */ typedef struct { SaHpiResourceIdT resource_id; SaHpiEntityPathT entity_path; } EP_XREF; static GStaticMutex oh_uid_lock = G_STATIC_MUTEX_INIT; static GHashTable *oh_ep_table; static GHashTable *oh_resource_id_table; static guint resource_id; static int initialized = FALSE; /* use to build memory resident map table from file */ static int uid_map_from_file(void); static int build_uid_map_data(int file); /* used by oh_uid_remove() */ static void write_ep_xref(gpointer key, gpointer value, gpointer file); /* for hash table usage */ guint oh_entity_path_hash(gconstpointer key); gboolean oh_entity_path_equal(gconstpointer a, gconstpointer b); /* * oh_entity_path_hash: used by g_hash_table_new() * in oh_uid_initialize(). See glib library for * further details. */ guint oh_entity_path_hash(gconstpointer key) { const char *p = key; guint h = *p; int i; int entity_path_len; entity_path_len = sizeof(SaHpiEntityPathT); p += 1; for( i=0; iresource_id; } /* allocate storage for EP cross reference data structure*/ ep_xref = (EP_XREF *)g_malloc0(sizeof(EP_XREF)); if(!ep_xref) { err("malloc failed"); uid_unlock(&oh_uid_lock); return 0; } memset(ep_xref, 0, sizeof(EP_XREF)); memcpy(&ep_xref->entity_path, &entitypath, sizeof(SaHpiEntityPathT)); ep_xref->resource_id = resource_id; resource_id++; ruid = ep_xref->resource_id; value = (gpointer)ep_xref; /* entity path based key */ key = (gpointer)&ep_xref->entity_path; g_hash_table_insert(oh_ep_table, key, value); /* resource id based key */ key = (gpointer)&ep_xref->resource_id; g_hash_table_insert(oh_resource_id_table, key, value); /* save newly created ep xref (iud/resource_id) to map file */ uid_map_file = (char *)getenv("OPENHPI_UID_MAP"); if (uid_map_file == NULL) { uid_map_file = OH_DEFAULT_UID_MAP; } file = open(uid_map_file, O_WRONLY); if (file >= 0) { lseek(file, 0, SEEK_END); if (write(file,ep_xref, sizeof(EP_XREF)) != sizeof(EP_XREF)) { err("write ep_xref failed"); close(file); return 0; } lseek(file, 0, SEEK_SET); if (write(file, &resource_id, sizeof(resource_id)) != sizeof(resource_id)) { err("write resource_id failed"); close(file); return 0; } } close(file); uid_unlock(&oh_uid_lock); return ruid; } /** * oh_uid_remove * @uid: value to be removed * * This functions removes the uid/entity path * pair from use and removes the use of the uid forever. * A new uid may be requested for this entity path * in the future. oh_uid_from_entity_path() writes * the entire uid/entity path pairings to file before * returning. oh_uid_remove() deletes the pairing from file. * * Returns: success 0, failure -1. **/ SaErrorT oh_uid_remove(SaHpiUint32T uid) { EP_XREF *ep_xref; gpointer key; if (!oh_uid_is_initialized()) return SA_ERR_HPI_ERROR; /* check entry exist in oh_resource_id_table */ key = (gpointer)&uid; uid_lock(&oh_uid_lock); ep_xref = (EP_XREF *)g_hash_table_lookup (oh_resource_id_table, key); if(!ep_xref) { err("error freeing oh_resource_id_table"); uid_unlock(&oh_uid_lock); return SA_ERR_HPI_ERROR; } /* check netry exist in oh_resource_id_table */ key = (gpointer)&ep_xref->entity_path; ep_xref = (EP_XREF *)g_hash_table_lookup (oh_ep_table, key); if(!ep_xref) { err("error freeing oh_resource_id_table"); uid_unlock(&oh_uid_lock); return SA_ERR_HPI_ERROR; } g_hash_table_remove(oh_resource_id_table, &ep_xref->resource_id); g_hash_table_remove(oh_ep_table, &ep_xref->entity_path); free(ep_xref); uid_unlock(&oh_uid_lock); return oh_uid_map_to_file(); } /** * oh_uid_lookup * @ep: pointer to entity path used to identify resourceID/uid * * Fetches resourceID/uid based on entity path in @ep. * * Returns: success returns resourceID/uid, failure is 0. **/ SaHpiUint32T oh_uid_lookup(SaHpiEntityPathT *ep) { EP_XREF *ep_xref; SaHpiEntityPathT entitypath; SaHpiResourceIdT ruid; gpointer key; if (!ep) return 0; if (!oh_uid_is_initialized()) return 0; oh_init_ep(&entitypath); oh_concat_ep(&entitypath, ep); key = &entitypath; /* check hash table for entry in oh_ep_table */ uid_lock(&oh_uid_lock); ep_xref = (EP_XREF *)g_hash_table_lookup (oh_ep_table, key); if(!ep_xref) { err("error looking up EP to get uid"); uid_unlock(&oh_uid_lock); return 0; } ruid = ep_xref->resource_id; uid_unlock(&oh_uid_lock); return ruid; } /** * oh_entity_path_lookup * @id: resource_id/uid identifying entity path * @ep: pointer to memory to fill in with entity path * * Fetches entity path based upon resource id, @id. * * Returns: success 0, failed -1. **/ SaErrorT oh_entity_path_lookup(SaHpiUint32T id, SaHpiEntityPathT *ep) { EP_XREF *ep_xref; gpointer key = &id; if (!id || !ep) return SA_ERR_HPI_ERROR; if (!oh_uid_is_initialized()) return SA_ERR_HPI_ERROR; /* check hash table for entry in oh_ep_table */ uid_lock(&oh_uid_lock); ep_xref = (EP_XREF *)g_hash_table_lookup (oh_resource_id_table, key); if(!ep_xref) { err("error looking up EP to get uid"); uid_unlock(&oh_uid_lock); return SA_ERR_HPI_ERROR ; } memcpy(ep, &ep_xref->entity_path, sizeof(SaHpiEntityPathT)); uid_unlock(&oh_uid_lock); return SA_OK; } /** * oh_uid_map_to_file: saves current uid and entity path mappings * to file, first element in file is 4 bytes for resource id, * then repeat EP_XREF structures holding uid and entity path pairings * * Return value: success 0, failed -1. **/ SaErrorT oh_uid_map_to_file(void) { char *uid_map_file; int file; uid_map_file = (char *)getenv("OPENHPI_UID_MAP"); if (uid_map_file == NULL) { uid_map_file = OH_DEFAULT_UID_MAP; } uid_lock(&oh_uid_lock); file = open(uid_map_file, O_WRONLY|O_CREAT|O_TRUNC, S_IRUSR|S_IWUSR|S_IRGRP); if(file < 0) { err("Configuration file '%s' could not be opened", uid_map_file); uid_unlock(&oh_uid_lock); return SA_ERR_HPI_ERROR; } /* write resource id */ if (write(file, (void *)&resource_id, sizeof(resource_id)) != sizeof(resource_id)) { err("write resource_id failed"); close(file); return SA_ERR_HPI_ERROR; } /* write all EP_XREF data records */ g_hash_table_foreach(oh_resource_id_table, write_ep_xref, &file); if(close(file) != 0) { err("Couldn't close file '%s'.", uid_map_file); uid_unlock(&oh_uid_lock); return SA_ERR_HPI_ERROR; } uid_unlock(&oh_uid_lock); return SA_OK; } /* * write_ep_xref: called by g_hash_table_foreach(), for each * hash table entry see glib manual for further details * * Return value: None (void). */ static void write_ep_xref(gpointer key, gpointer value, gpointer file) { if (write(*(int *)file, value, sizeof(EP_XREF)) != sizeof(EP_XREF)) { err("write EP_XREF failed"); } } /* * uid_map_from_file: called from oh_uid_initialize() during intialization * This function, if a uid map file exists, reads the current value for * uid and intializes the memory resident uid map file from file. * * Return value: success 0, error -1. */ static gint uid_map_from_file() { char *uid_map_file; int file; int rval; /* initialize uid map file */ uid_map_file = (char *)getenv("OPENHPI_UID_MAP"); if (uid_map_file == NULL) { uid_map_file = OH_DEFAULT_UID_MAP; } file = open(uid_map_file, O_RDONLY); if(file < 0) { /* create map file with resource id initial value */ err("Configuration file '%s' does not exist, initializing", uid_map_file); file = open(uid_map_file, O_RDWR | O_CREAT | O_TRUNC, S_IRUSR | S_IWUSR | S_IRGRP); if(file < 0) { err("Could not initialize uid map file, %s", uid_map_file ); return -1; } /* write initial uid value */ if( write(file,(void *)&resource_id, sizeof(resource_id)) < 0 ) { err("failed to write uid, on uid map file initialization"); close(file); return -1; } if(close(file) != 0) { err("Couldn't close file '%s'.during uid map file initialization", uid_map_file); return -1; } /* return from successful initialization, from newly created uid map file */ return 0; } /* read uid/resouce_id highest count from uid map file */ if (read(file,&resource_id, sizeof(resource_id)) != sizeof(resource_id)) { err("error setting uid from existing uid map file"); return -1; } rval = build_uid_map_data(file); close(file); if (rval < 0) return -1; /* return from successful initialization from existing uid map file */ return 0; } /* * build_uid_map_data: used by uid_map_from_file(), recursively * reads map file and builds two hash tables and EP_XREF data * structures * * @file: key into a GHashTable * * Return value: success 0, error -1. */ static gint build_uid_map_data(int file) { int rval; EP_XREF *ep_xref; EP_XREF ep_xref1; gpointer value; gpointer key; rval = read(file, &ep_xref1, sizeof(EP_XREF)); while ( (rval != EOF) && (rval == sizeof(EP_XREF)) ) { /* copy read record from ep_xref1 to malloc'd ep_xref */ ep_xref = (EP_XREF *)g_malloc0(sizeof(EP_XREF)); if (!ep_xref) return -1; memcpy(ep_xref, &ep_xref1, sizeof(EP_XREF)); value = (gpointer)ep_xref; /* entity path based key */ key = (gpointer)&ep_xref->entity_path; g_hash_table_insert(oh_ep_table, key, value); /* resource id based key */ key = (gpointer)&ep_xref->resource_id; g_hash_table_insert(oh_resource_id_table, key, value); rval = read(file, &ep_xref1, sizeof(EP_XREF)); } /* TODO thought EOF would return -1, its not so check other way */ /* if (rval != EOF), rval of 0 seems to be EOF */ if ( (rval > 0) && (rval < sizeof(EP_XREF)) ) { err("error building ep xref from map file"); return -1; } return 0; } openhpi-2.14.1/docs/0000755000076400007640000000000011405006476011124 5ustar openhpi-2.14.1/docs/Makefile.am0000644000076400007640000000313011405006476013155 0ustar # # Copyright (c) 2003, Intel Corporation # All rights reserved. # # 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. # # Neither the name of Intel Corporation nor the names # of its contributors may be used to endorse or promote products # derived from this software without specific prior written permission. # # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS # "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT # LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS # FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT # OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, # SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED # TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, # OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY # OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING # NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS # SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. # MAINTAINERCLEANFILES = Makefile.in SUBDIRS = @MAN@ DIST_SUBDIRS = man openhpi-2.14.1/docs/man/0000755000076400007640000000000011405006365011674 5ustar openhpi-2.14.1/docs/man/Makefile.am0000644000076400007640000000571511302567077013750 0ustar # # Copyright IBM 2005 # # 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. # # Neither the name of Intel Corporation nor the names # of its contributors may be used to endorse or promote products # derived from this software without specific prior written permission. # # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS # "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT # LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS # FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT # OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, # SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED # TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, # OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY # OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING # NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS # SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. MAINTAINERCLEANFILES = Makefile.in EXTRA_DIST = openhpi.pod.7 openhpid.pod.8 \ hpialarms.pod.1 hpifan.pod.1 \ hpipower.pod.1 hpisettime.pod.1 \ hpitree.pod.1 hpiel.pod.1 \ hpiinv.pod.1 hpireset.pod.1 \ hpithres.pod.1 hpiwdt.pod.1 \ hpievents.pod.1 hpionIBMblade.pod.1 \ hpisensor.pod.1 hpitop.pod.1 %.1: %.pod.1 pod2man --release=$(VERSION) --name=`echo $@ | sed 's/.1//'` \ -s 1 -c "OpenHPI" $< $@ %.3: %.pod.3 pod2man --release=$(VERSION) --name=`echo $@ | sed 's/.3//'` \ -s 3 -c "OpenHPI" $< $@ %.5: %.pod.5 pod2man --release=$(VERSION) --name=`echo $@ | sed 's/.5//'` \ -s 5 -c "OpenHPI" $< $@ %.7: %.pod.7 pod2man --release=$(VERSION) --name=`echo $@ | sed 's/.7//'` \ -s 7 -c "OpenHPI" $< $@ %.8: %.pod.8 pod2man --release=$(VERSION) --name=`echo $@ | sed 's/.8//'` \ -s 8 -c "OpenHPI" $< $@ #mandir = $(datadir)/man man_MANS = openhpi.7 openhpid.8 \ hpialarms.1 hpifan.1 \ hpipower.1 hpisettime.1 \ hpitree.1 hpiel.1 \ hpiinv.1 hpireset.1 \ hpithres.1 hpiwdt.1 \ hpievents.1 hpionIBMblade.1 \ hpisensor.1 hpitop.1 clean-local: am_config_clean-local am_config_clean-local: rm -f *~ find . -name \*\.[13578] | grep -v pod | xargs rm -f .PHONY: FORCE openhpi-2.14.1/docs/man/openhpid.pod.80000644000076400007640000001025711302567077014371 0ustar =head1 NAME openhpid - HPI instance to which multiple clients can connect. =head1 SYNOPSIS openhpid -c config_file [OPTION] =head1 DESCRIPTION The OpenHPI daemon runs as a background process and accepts connections from remote clients that invoke HPI function calls. The daemon wraps the OpenHPI library with a sockets-based API that is archicture neutral for all types of clients. When you run the daemon, the standard method for locating the OpenHPI configuration file is used. However, the daemon will accept a configuration file as a command line option (-c) to override the default file. A command option (-p) or environment variable determines the port number the daemon will listen on for client connections. The default port is 4743. The daemon creates a PID file in the /var/run subdirectory. This directory is only writable by the root user. Thus the daemon will fail when run as a normal user if the PID file location is not overridden. To override the PID file location you can use the -f command line option. The client and the daemon do not have to be on the same hardware architecture. The daemon could be running on a P-series processor and the client running on an x86-series processor. The client library and daemon use a marshaling technique to resolve architecture and structure padding conflicts. The user does not need to concern themselves with architectureal differences between the client and daemon. The one exception to this rule is 64-bit architectures. The client and daemon currently cannot resolve differences between 32-bit and 64-bit architectures. =head1 OPTIONS =over 4 =item -f pidfile This overrides the default location of the pidfile. =item -n This forces the daemon to run in the foreground. =item -p port This is used to override the port to listen on by the daemon. =item -s seconds Read timeout used by the daemon sockets. Default is unlimited. =item -t threads Sets the maximum number of connection threads. Default is unlimited. =item -v Display verbose messages =back =head1 ENVIRONMENTAL VARIABLES All of these environment variables can instead be set in the openhpi.conf configuration file, except for OPENHPI_DAEMON_PORT and OPENHPI_CONF. =over 4 =item B=PORT_NUMBER The port number the host will listen on for clent connections. Default port is 4743. =item B Valus can be one of: CRITICAL,MAJOR,MINOR,INFORMATIONAL,OK,DEBUG. Events of this severity or higher will be logged to the domain event log. The default is MINOR. =item B=ENTITY_PATH Entity path returned (e.g. {SYSTEM_CHASSIS,1}) when saHpiResourceIdGet() is called. =item B=NUMBER Maximum number of events allowed in a subscribed session's queue. Default is 10000. =item B=NUMBER Maximum number of events allowed in the domain event log. Default is 10000 =item B Set to YES to persist the domain event logs to disk. They will be loaded in case the daemon restarts. Default is NO. =item B=NUMBER Maximum number of alarms allowed in the domain alarm table. Default is unlimited. =item B=NUMBER Maximum number of user alarms allowed in the domain alarm table. Default is unlimited. =item B Set to YES to persist the domain alarm tables to disk. They will be loaded in case the daemon restarts. Default is NO. =item B="/path/to/plugins:/another/path/to/plugins" This is a colon delimited list of directories used when searching for an OpenHPI plugin to load. The default is $prefix/lib/openhpi. =item B="/path/to/dir" This sets the directory used to store openhpi internal data. The domain event logs and alarm tables are saved there (if configured to) along with resource ID to entity path mappings. Default is $prefix/var/lib/openhpi. =item B="/path/to/configurationg/file" This is another way of telling the daemon where to find the configuration file. =back =head1 SEE ALSO The following man pages may also be of interest =over 4 =item B General information about OpenHPI =back =head1 AUTHORS Authors of this man page: Renier Morales (renier@openhpi.org) openhpi-2.14.1/docs/man/hpiel.pod.10000644000076400007640000000355511302567077013660 0ustar =head1 NAME hpiel - An openhpi sample application that displays HPI event log entries. =head1 SYNOPSIS hpiel [ -d -e -c -p -r -x -v -h ] =head1 DESCRIPTION hpiel searches the RPT (Resource Present Table) for resources with SAHPI_CAPABILITY_EVENT_LOG and displays event log entries for resources found. =head1 OPTIONS =over 2 --del, -d display domain event log entries --entitypath="", -e "" display resource event log entries (e.g. -e "{SYSTEM_CHASSIS,2}{SBC_BLADE,5}") --clear, -c clear log before reading event log entries --resource, -p pull resource info along with log entry --rdr, -r pull RDR info along with log entry --xml, -x print output in xml format (not implemented) --verbose, -v print debug messages --help, -h print this usage message If neither -d or -e "" are specified, event log entries will be shown for all supporting resources by default. =back =head1 HPI APIs uniquely used in this application =over 2 SaErrorT SAHPI_API saHpiEventLogInfoGet ( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId, SAHPI_OUT SaHpiEventLogInfoT *Info ); SaErrorT SAHPI_API saHpiEventLogEntryGet ( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId, SAHPI_IN SaHpiEventLogEntryIdT EntryId, SAHPI_OUT SaHpiEventLogEntryIdT *PrevEntryId, SAHPI_OUT SaHpiEventLogEntryIdT *NextEntryId, SAHPI_OUT SaHpiEventLogEntryT *EventLogEntry, SAHPI_INOUT SaHpiRdrT *Rdr, SAHPI_INOUT SaHpiRptEntryT *RptEntry ); SaErrorT SAHPI_API saHpiEventLogClear ( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiResourceIdT ResourceId ); =back =head1 SEE ALSO =head1 AUTHORS Authors of this man page: Peter D Phan (pdphan@users.sourceforge.net) openhpi-2.14.1/docs/man/hpitop.pod.10000644000076400007640000000135211302567077014053 0ustar =head1 NAME hpitop - A openhpi sample application that displays highlevel topology for a managed openHPI complex. =head1 SYNOPSIS hpitop [-r -s -c -w -i -a -x] =head1 DESCRIPTION hpitop walks the Resource Present Table (RPT) of the managed openHPI complex and displays all the resources and resources' management instruments. =head1 OPTIONS =over 2 (No Option) Display system topology: rpt & rdr headers -r Display only rpts -s Display only sensors -c Display only controls -w Display only watchdogs -i Display only inventories -a Display only annunciators -x Display debug messages =back =head1 SEE ALSO =head1 AUTHORS Authors of this man page: Peter D Phan (pdphan@users.sourceforge.net) openhpi-2.14.1/docs/man/openhpi.pod.70000644000076400007640000000442711302567077014226 0ustar =head1 NAME openhpi - an implementation of the SA Forum's Hardware Platform Interface =head1 DESCRIPTION OpenHPI is an implementation of the SA Forum's Hardware Platform Interface, which provides a standard C library interface to manage, monitor, and control hardware (both local and remote). OpenHPI 2.x implements the HPI B.01.01 specification. The OpenHPI client library (libopenhpi) provides all the connection functionality needed by the client application to connect to the OpenHPI daemon running on the local or remote server. =head1 ENVIRONMENTAL VARIABLES Some of OpenHPI's functioning can be changed by setting environment variables. This documents all client environmental settings. =over 2 =item B=URL URL for the host running the daemon. This can be "localhost" (default) if the daemon is running on the local host or an ip address. =item B=PORT_NUMBER The port number the host is listening on for clent connections. Default port is 4743. =back =head1 HARDWARE SUPPORT OpenHPI provides a number of plugins that talk to different hardware types. The following is a list of tested plugins in OpenHPI 2.x. =over 4 =item B An IPMI plugin that can talk locally (via smi interface and OpenIPMI device driver) or remotely (via IPMI over LAN). It supports IPMI 1.5 for standard rackmount servers, and some of IPMI 2.0 for support of ATCA chassis. IPMI plugin depends on libOpenIPMI version 1.4.x. =item B An IPMI plugin designed specifically for ATCA chassis. It implements IPMI commands directly in the plugin. =item B An SNMP based plugin that can communicate with IBM BladeCenter, as well as IBM xSeries servers with RSA 1 adapters. SNMP_BC plugin depends on net-snmp > 5.0.7. =item B Current status?? =item B Current status?? =back =head1 OTHER DOCUMENTATION The definitive guide to HPI is the SA Forum specification at http://saforum.org. More info on OpenHPI can be found at our webpage (http://openhpi.org). =head1 SEE ALSO The following man pages may also be of interest =over 1 =item B The openhpi daemon, providing OpenHPI data as a system service. =back =head1 AUTHORS Authors of this man page: Sean Dague (http://dague.net/sean) Renier Morales (renier@openhpi.org) openhpi-2.14.1/docs/man/hpipower.pod.10000644000076400007640000000114111302567077014401 0ustar =head1 NAME hpipower - This sample openhpi application excercises HPI Power Management APIs. =head1 SYNOPSIS hpipower [ -d -p -r -u -b -x ] =head1 DESCRIPTION hpipower searches the Resource Presence Table (RPT) for resources with Power Capability. It sends the requested power action to the selected target. =head1 OPTIONS =over 2 -d power down target object -p power on target object -r reset target object -u unattended -b Specify blade (1...n) -x debug messages =back =head1 SEE ALSO =head1 AUTHORS Authors of this man page: Peter D Phan (pdphan@users.sourceforge.net) openhpi-2.14.1/docs/man/hpialarms.pod.10000644000076400007640000000272311302567077014533 0ustar =head1 NAME hpialarms - A openhpi sample application that shows "Alarm Control" management instruments =head1 SYNOPSIS hpialarms [-a -b -c -i -m -n -p -o -x] =head1 DESCRIPTION hpialarms walks the RPT (Resource Present Table) for resouces that have "Alarm Control" management instruments (SAHPI_CTRL_LED). =head1 OPTIONS =over 2 -c1 sets Critical Alarm on -c0 sets Critical Alarm off -m1 sets Major Alarm on -m0 sets Major Alarm off -n1 sets Minor Alarm on -n0 sets Minor Alarm off -p1 sets Power Alarm on -p0 sets Power Alarm off -i5 sets Chassis ID on for 5 sec -i0 sets Chassis ID off -a1 sets Disk A fault on -a0 sets Disk A fault off -b1 sets Disk B fault on -b0 sets Disk B fault off -d[byte] sets raw Alarm byte -o sets all Alarms off -x show eXtra debug messages =back =head1 SAMPLE OUTPUT =over 2 hpialarmpanel ver 0.6 RptInfo: UpdateCount = 5, UpdateTime = 8a2dc6c0 rptentry[0] resourceid=1 tag: Mullins RDR[45]: ctltype=2:1 oem=0 Chassis Identify Control RDR[48]: ctltype=0:1 oem=10 Front Panel Power Alarm LED state = off RDR[51]: ctltype=0:1 oem=13 Front Panel Minor Alarm LED state = ON RDR[46]: ctltype=0:0 oem=0 Cold Reset Control RDR[49]: ctltype=0:1 oem=11 Front Panel Critical Alarm LED state = off RDR[50]: ctltype=0:1 oem=12 Front Panel Major Alarm LED state = off =back =head1 SEE ALSO =head1 AUTHORS Authors of this man page: Peter D Phan (pdphan@users.sourceforge.net) openhpi-2.14.1/docs/man/hpifan.pod.10000644000076400007640000000077111302567077014021 0ustar =head1 NAME hpifan - An openhpi sample application that shows "Fan Control" management instruments =head1 SYNOPSIS hpifan [-h] [-s fan_speed_level] =head1 DESCRIPTION hpifan walks the RPT (Resource Present Table) for resouces that have "Fan Control" management instruments (SAHPI_CTRL_FAN_SPEED). =head1 OPTIONS =over 2 -h help -s set fan speed for ALL fans =back =head1 SEE ALSO =head1 AUTHORS Authors of this man page: Peter D Phan (pdphan@users.sourceforge.net) openhpi-2.14.1/docs/man/hpievents.pod.10000644000076400007640000000237511302567077014563 0ustar =head1 NAME hpievents - An openhpi sample application that polls for events. =head1 SYNOPSIS hpievents [ -t -d -x ] =head1 DESCRIPTION hpievents polls for events in an opened HPI session. User can specify wait time for the event. User can also select the order between hpi resource (resource event) discovery and hpi event subscription. =head1 OPTIONS =over 2 where: -t - wait seconds for event; -t SAHPI_TIMEOUT_BLOCK or BLOCK - infinite wait -d - call saHpiDiscover() after saHpiSubscribe() -x - displays eXtra debug messages =back =head1 HPI APIs uniquely used in this application =over 2 SaErrorT SAHPI_API saHpiSubscribe ( SAHPI_IN SaHpiSessionIdT SessionId ); SaErrorT SAHPI_API saHpiUnsubscribe ( SAHPI_IN SaHpiSessionIdT SessionId ); SaErrorT SAHPI_API saHpiEventGet ( SAHPI_IN SaHpiSessionIdT SessionId, SAHPI_IN SaHpiTimeoutT Timeout, SAHPI_OUT SaHpiEventT *Event, SAHPI_INOUT SaHpiRdrT *Rdr, SAHPI_INOUT SaHpiRptEntryT *RptEntry, SAHPI_INOUT SaHpiEvtQueueStatusT *EventQueueStatus ); =back =head1 SEE ALSO =head1 AUTHORS Authors of this man page: Peter D Phan (pdphan@users.sourceforge.net) openhpi-2.14.1/docs/man/hpitree.pod.10000644000076400007640000000200011302567077014177 0ustar =head1 NAME hpitree - A openhpi sample application that shows in details the resources (rpt's) and resources' manamegement instruments (rdr's) data structures of the managed openHPI complex. =head1 SYNOPSIS hpitree [ -a -c -d -i -o -r -s -w -n -x ] =head1 DESCRIPTION hpitree walks the Resource Presence Table (RPT) of the managed openHPI complex, and displays in details the resources (rpt's) and resources' management instruments (rdr's) data structures. =head1 OPTIONS =over 2 (No Option) Display all rpts and rdrs -a Display all rpts and rdrs -c Display only controls -d Display rdr records -i Display only inventories -o Display system overview: rpt & rdr headers -r Display only rpts -s Display only sensors -w Display only watchdog -n Select particular resource id to display (Used with [-cdirs] options) -x Display debug messages =back =head1 SEE ALSO =head1 AUTHORS Authors of this man page: Peter D Phan (pdphan@users.sourceforge.net) openhpi-2.14.1/docs/man/hpionIBMblade.pod.10000644000076400007640000000257411302567077015214 0ustar =head1 NAME hpionIBMblade - An openhpi sample application that shows how two (2) openhpi plugins can be used to display and manage resources of an IBM Blade with Basedboard Management Controller (BMC). =head1 SYNOPSIS hpionIBMblade [ -x ] =head1 DESCRIPTION hpionIBMblade shows how two (2) openhpi plugins can be used to display and manage resources of an IBM Blade with Basedboard Management Controller (BMC). Both the ipmi and snmp_bc plugin have the same IBM Blade target. Resources from both plugins are combined to show a complete view of the IBM Blade. @@ WARNING @@ RESTRICTIONS @@ WARNING @@ RESTRICTIONS @@ WARNING @@ RESTRICTIONS @@ This client application is designed to run **only** inband on an IBM Blade with Basedboard Management Controller (BMC) =head1 OPTIONS =over 2 -x Display debug messages. =back =head1 SAMPLE CONFIGURATION FILE handler libipmi { entity_root = "{SYSTEM_CHASSIS,2}" name = "smi" addr = 0 } handler libsnmp_bc { host = "bc.mm.ip.address" version = "3" community = "bc_community" entity_root = "{SYSTEM_CHASSIS,1}" security_name = "myid" passphrase = "mypassword" security_level = "authNoPriv" auth_type = "MD5" } =head1 SEE ALSO =head1 AUTHORS Authors of this man page: Peter D Phan (pdphan@users.sourceforge.net) openhpi-2.14.1/docs/man/hpithres.pod.10000644000076400007640000000073211302567077014377 0ustar =head1 NAME hpithres - This sample openhpi application interactively displays sensors and sensor info. =head1 SYNOPSIS hpithres [-x] =head1 DESCRIPTION hpithres interactively displays sensor info for resources with Sensor Capability. Resources, sensors,and sensor info can be individually selected. =head1 OPTIONS =over 2 -x Display debug messages =back =head1 SEE ALSO =head1 AUTHORS Authors of this man page: Peter D Phan (pdphan@users.sourceforge.net) openhpi-2.14.1/docs/man/hpiinv.pod.10000644000076400007640000000144311302567077014046 0ustar =head1 NAME hpiinv - An openhpi sample application that shows resources' inventory records. =head1 SYNOPSIS hpiinv [-x] [-a asset_tag] =head1 DESCRIPTION hpiinv walks the RPT (Resource Present Table) looking for resources that have Inventory Capability. It displays all inventory records found. =head1 OPTIONS =over 2 -a Sets the asset tag -x Display debug messages -z Display extra debug messages =back =head1 ENVIRONMENT VARIABLES For generic OpenHPI, there is *no* additional environment variable required. For some devices; sahalee, mBMC; BMCONLY flag needs to be set for additional device characterization based on rdr.IdString.Data. =over 2 BMCONLY LENGTH_BAD =back =head1 SEE ALSO =head1 AUTHORS Authors of this man page: Peter D Phan (pdphan@users.sourceforge.net) openhpi-2.14.1/docs/man/hpisensor.pod.10000644000076400007640000000105511302567077014562 0ustar =head1 NAME hpisensor - This sample openhpi application displays sensor info for all resources with Sensor Capability =head1 SYNOPSIS hpisensor [-t -r -x -e] =head1 DESCRIPTION hpisensor displays sensor info for all resources with Sensor Capability . =head1 OPTIONS =over 2 -t = show Thresholds also -r = show Range values also -s = show EventState also -e entity path = limit to a single entity -x = show eXtra debug messages =back =head1 SEE ALSO =head1 AUTHORS Authors of this man page: Peter D Phan (pdphan@users.sourceforge.net) openhpi-2.14.1/docs/man/hpisettime.pod.10000644000076400007640000000072511302567077014726 0ustar =head1 NAME hpisettime - This sample openhpi application excercises Event Log clock APIs. =head1 SYNOPSIS hpisettime -d mm/dd/yyyy -t HH:MM:SS [-x] =head1 DESCRIPTION hpisettime sets new date and time for the Event Log clock. =head1 OPTIONS =over 2 -d date in mm/dd/yyyy format -t time of day in 24-hr format -x displays eXtra debug messages =back =head1 SEE ALSO =head1 AUTHORS Authors of this man page: Peter D Phan (pdphan@users.sourceforge.net) openhpi-2.14.1/docs/man/hpireset.pod.10000644000076400007640000000123311302567077014371 0ustar =head1 NAME hpireset - This sample openhpi application excercises HPI Reset Management APIs. =head1 SYNOPSIS hpireset [-r -d -x] =head1 DESCRIPTION hpireset searches the Resource Presence Table (RPT) for resources with Reset Capability. It sends the requested reset action to all resources with SAHPI_CAPABILITY_RESET. =head1 OPTIONS =over 2 -r hard Resets the system -d powers Down the system -c power Cycles the system -n sends NMI to the system -o soft-shutdown OS -s reboots to Service Partition -x show eXtra debug messages =back =head1 SEE ALSO =head1 AUTHORS Authors of this man page: Peter D Phan (pdphan@users.sourceforge.net) openhpi-2.14.1/docs/man/hpiwdt.pod.10000644000076400007640000000100311302567077014040 0ustar =head1 NAME hpiwdt - This sample openhpi application reads and enables the watchdog timer. =head1 SYNOPSIS hpiwdt [-derx -t sec] =head1 DESCRIPTION hpiwdt reads and enables the watchdog timer. =head1 OPTIONS =over 2 -e enables the watchdog timer -d disables the watchdog timer -r resets the watchdog timer -t N sets timeout to N seconds -x show eXtra debug messages =back =head1 SEE ALSO =head1 AUTHORS Authors of this man page: Peter D Phan (pdphan@users.sourceforge.net) openhpi-2.14.1/openhpi.conf.example0000644000076400007640000002124211302567132014135 0ustar ### OpenHPI configuration example file ### ####### ## FIRST section: declaration of global parameters like the following. #OPENHPI_LOG_ON_SEV = "MINOR" #OPENHPI_ON_EP = "{SYSTEM_CHASSIS,1}" #OPENHPI_EVT_QUEUE_LIMIT = 10000 #OPENHPI_DEL_SIZE_LIMIT = 10000 #OPENHPI_DEL_SAVE = "NO" #OPENHPI_DAT_SIZE_LIMIT = 0 #OPENHPI_DAT_USER_LIMIT = 0 #OPENHPI_DAT_SAVE = "NO" #OPENHPI_PATH = "/usr/local/lib/openhpi:/usr/lib/openhpi" #OPENHPI_VARPATH = "/usr/local/var/lib/openhpi" ## The default values for each have been selected in the example above (except ## for OPENHPI_PATH and OPENHPI_CONF. See below). ## No need to specify any one of them because the defaults is used ## automatically. The library also looks for these as environment variables. ## Environment variables found that match a global parameter override the ## corresponding parameter set in this configuration file. ## ## OPENHPI_LOG_SEV sets the lowest severity level an event must meet to be ## logged in the domain event log. Possible values are (highest to lowest): ## "CRITICAL", "MAJOR", "MINOR", "INFORMATIONAL", "OK", and "DEBUG". ## OPENHPI_ON_EP sets the entity path on which the application is running. This ## entity path is returned when SaHpiResourceIdGet() is called. ## OPENHPI_EVT_QUEUE_LIMIT sets the maximum number of events that are allowed ## in the session's event queue. Default is 10000 events. Setting it to 0 means ## unlimited. ## OPENHPI_DEL_SIZE_LIMIT sets the maximum size (in number of event log entries) ## for the domain event log. Default is 10000 log entries. Setting it to 0 ## means unlimited. ## OPENHPI_DEL_SAVE sets whether the domain event log is persisted to disk or ## not. The event log is written to OPENHPI_VARPATH value. ## OPENHPI_DAT_SIZE_LIMIT sets the maximum size (in number of alarm entries) for ## the alarm table. The default 0 means unlimited. ## OPENHPI_DAT_USER_LIMIT sets the maximum number of user type alarm entries ## allowed in the alarm table. The default 0 means unlimited. ## OPENHPI_DAT_SAVE sets whether the domain alarm table is persisted to disk or ## not. The alarm table is written to the directory where OPENHPI_VARPATH ## points to. ## OPENHPI_PATH is a colon (:) delimited list of directories specifying ## the location of openhpi plugin libraries. The default is defined when the ## library is configured. ## OPENHPI_VARPATH is a directory to which certain openhpi data is saved to. ## The DEL (Domain Event Log), DAT (Domain Alarm Table), and UID (Unique IDs ## used for resources) mappings are saved to this directory. The default is set ## at compile time through the ./configure options. ####### ####### ## SECOND section: handler (instance) declaration with arguments understood by the plugin. ############################################################################# ##**CAUTION** System administrators have to make sure that entity paths are ## unique in a domain. To avoid entity paths conflicting among handlers, make ## sure the "entity_root" is unique for each handler definition, unless the ## plugin documentation says otherwise. ############################################################################# ## Strings are enclosed by "", numbers are not. ## Section for the simulator plugin ## You can load multiple copies of the simulator plugin but each ## copy must have a unique name. handler libsimulator { entity_root = "{SYSTEM_CHASSIS,1}" name = "simulator" } ## Section for ipmi plugin using SMI -- local interface #handler libipmi { # entity_root = "{SYSTEM_CHASSIS,2}" # name = "smi" # addr = 0 #} ## Section for ipmi plugin based on OpenIPMI: #handler libipmi { # entity_root = "{SYSTEM_CHASSIS,3}" # name = "lan" # addr = "x.x.x.x" #ipaddress # port = "999" # auth_type = "straight" # auth_level= "user" # username = "joe" # password = "blow" #} ## Section for BladeCenter snmp_bc plugin: #handler libsnmp_bc { # entity_root = "{SYSTEM_CHASSIS,4}" # Required. BladeCenter chassis Entity Path. # host = "192.168.70.125" # Required. BladeCenter Management Module (MM) IP address. # host_alternate = "192.168.70.127" # Optional. BladeCenter Management Module 2nd IP address. # Some BladeCenter MM Firmware allows the 2 MMs, # active and standby, to have 2 different IP address. # If the targetted BladeCenter 2 MMs are configured # with 2 IPs, use this key for the 2nd IP. # version = "1" # Required. SNMP protocol version (1|3). # community = "public" # SNMP V1: Required. SNMP V1 community name. # security_name = "snmpv3_user" # SNMP V3: Required. SNMP V3 user Login ID. # context_name = "" # SNMP V3: Optional. Must match MM's "Context name" field, if defined. # security_level = "noAuthNoPriv" # SNMP V3: Required. Security level (noAuthNoPriv|authNoPriv|authPriv). # passphrase = "" # SNMP V3: Authentication password. Required if security_level # # is authNoPriv or authPriv. # auth_type = "" # SNMP V3: Authentication password encoding (MD5|SHA). Required if # # security_level is authNoPriv or authPriv. # privacy_passwd = "" # SNMP V3: Privacy password. Required if security_level is authPriv. # privacy_protocol = "" # SNMP V3: Privacy password encoding (DES). # # Required if security_level is authPriv. # # If security_level is authPriv, DES encoding is assumed since there # # currently is no other privacy password encoding choice. # count_per_getbulk = "32" # SNMP V3: Optional. SNMP_MSG_GETBULK commands can be used to increase # # performance. This variable sets the maximum OIDs allowable per # # MSG_GETBULK command. # # Positive values less than 16 default to "16", since values less than # # 16 don't necessarily increase performance. Too high of a value (> 40) # # can cause SNMP commands to BladeCenter to timeout. The default is "32". # # A value of "0" disables the use of the SNMP_MSG_GETBULK SNMP command. #} ## Section for static simulator plugin: ## If openhpi configured with ## configure --enable-simulator=static ## the dummy plugin is compiled in. ## It is possible to use simulator and libsimulator ## at the same time. #handler simulator { # entity_root = "{SYSTEMk_CHASSIS,5}" # name = "test" #} ## Section for ipmidirect plugin using SMI -- local interface #handler libipmidirect { # entity_root = "{SYSTEM_CHASSIS,6}" # name = "smi" # addr = 0 #} ## Section for ipmidirect plugin using RMCP: #handler libipmidirect { # entity_root = "{SYSTEM_CHASSIS,7}" # name = "lan" # RMCP # addr = "localhost" # Host name or IP address # port = "623" # RMCP port # auth_type = "none" # none, md2, md5 or straight # auth_level = "admin" # operator or admin # username = "arthur" # password = "pieman" # logflags = "" # logging off # # logflags = "file stdout" # # infos goes to logfile and stdout # # the logfile are log00.log, log01.log ... # logfile = "log" # # if #logfile_max reached replace the oldest one # logfile_max = "10" #} ## Section for ilo2_ribcl plugin for ProLiant Rack Mount servers #handler libilo2_ribcl { # entity_root = "{RACK_MOUNTED_SERVER,8}" # ilo2_ribcl_hostname = "IP address" # iLO2 IP address # ilo2_ribcl_portstr = "443" # iLO2 RIBCL SSL server port number # ilo2_ribcl_username = "username" # iLO2 username # ilo2_ribcl_password = "password" # iLO2 password #} ## Section for oa_soap plugin for HP BladeSystem c-Class, ## using SOAP XML over https #handler liboa_soap { # entity_root = "{SYSTEM_CHASSIS,8}" # OA_User_Name = "user" # OA user name with admin privileges (required) # OA_Password = "passwd" # OA password for above user (required) # ACTIVE_OA = "hostname" # Active OA hostname or IP address (required) # STANDBY_OA = "hostname" # Standby OA hostname or IP address (optional) #} openhpi-2.14.1/install-sh0000755000076400007640000003246411302567646012220 0ustar #!/bin/sh # install - install a program, script, or datafile scriptversion=2006-12-25.00 # This originates from X11R5 (mit/util/scripts/install.sh), which was # later released in X11R6 (xc/config/util/install.sh) with the # following copyright and license. # # Copyright (C) 1994 X Consortium # # Permission is hereby granted, free of charge, to any person obtaining a copy # of this software and associated documentation files (the "Software"), to # deal in the Software without restriction, including without limitation the # rights to use, copy, modify, merge, publish, distribute, sublicense, and/or # sell copies of the Software, and to permit persons to whom the Software is # furnished to do so, subject to the following conditions: # # The above copyright notice and this permission notice shall be included in # all copies or substantial portions of the Software. # # 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 # X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN # AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNEC- # TION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. # # Except as contained in this notice, the name of the X Consortium shall not # be used in advertising or otherwise to promote the sale, use or other deal- # ings in this Software without prior written authorization from the X Consor- # tium. # # # FSF changes to this file are in the public domain. # # Calling this script install-sh is preferred over install.sh, to prevent # `make' implicit rules from creating a file called install from it # when there is no Makefile. # # This script is compatible with the BSD install script, but was written # from scratch. nl=' ' IFS=" "" $nl" # set DOITPROG to echo to test this script # Don't use :- since 4.3BSD and earlier shells don't like it. doit=${DOITPROG-} if test -z "$doit"; then doit_exec=exec else doit_exec=$doit fi # Put in absolute file names if you don't have them in your path; # or use environment vars. chgrpprog=${CHGRPPROG-chgrp} chmodprog=${CHMODPROG-chmod} chownprog=${CHOWNPROG-chown} cmpprog=${CMPPROG-cmp} cpprog=${CPPROG-cp} mkdirprog=${MKDIRPROG-mkdir} mvprog=${MVPROG-mv} rmprog=${RMPROG-rm} stripprog=${STRIPPROG-strip} posix_glob='?' initialize_posix_glob=' test "$posix_glob" != "?" || { if (set -f) 2>/dev/null; then posix_glob= else posix_glob=: fi } ' posix_mkdir= # Desired mode of installed file. mode=0755 chgrpcmd= chmodcmd=$chmodprog chowncmd= mvcmd=$mvprog rmcmd="$rmprog -f" stripcmd= src= dst= dir_arg= dst_arg= copy_on_change=false no_target_directory= usage="\ Usage: $0 [OPTION]... [-T] SRCFILE DSTFILE or: $0 [OPTION]... SRCFILES... DIRECTORY or: $0 [OPTION]... -t DIRECTORY SRCFILES... or: $0 [OPTION]... -d DIRECTORIES... In the 1st form, copy SRCFILE to DSTFILE. In the 2nd and 3rd, copy all SRCFILES to DIRECTORY. In the 4th, create DIRECTORIES. Options: --help display this help and exit. --version display version info and exit. -c (ignored) -C install only if different (preserve the last data modification time) -d create directories instead of installing files. -g GROUP $chgrpprog installed files to GROUP. -m MODE $chmodprog installed files to MODE. -o USER $chownprog installed files to USER. -s $stripprog installed files. -t DIRECTORY install into DIRECTORY. -T report an error if DSTFILE is a directory. Environment variables override the default commands: CHGRPPROG CHMODPROG CHOWNPROG CMPPROG CPPROG MKDIRPROG MVPROG RMPROG STRIPPROG " while test $# -ne 0; do case $1 in -c) ;; -C) copy_on_change=true;; -d) dir_arg=true;; -g) chgrpcmd="$chgrpprog $2" shift;; --help) echo "$usage"; exit $?;; -m) mode=$2 case $mode in *' '* | *' '* | *' '* | *'*'* | *'?'* | *'['*) echo "$0: invalid mode: $mode" >&2 exit 1;; esac shift;; -o) chowncmd="$chownprog $2" shift;; -s) stripcmd=$stripprog;; -t) dst_arg=$2 shift;; -T) no_target_directory=true;; --version) echo "$0 $scriptversion"; exit $?;; --) shift break;; -*) echo "$0: invalid option: $1" >&2 exit 1;; *) break;; esac shift done if test $# -ne 0 && test -z "$dir_arg$dst_arg"; then # When -d is used, all remaining arguments are directories to create. # When -t is used, the destination is already specified. # Otherwise, the last argument is the destination. Remove it from $@. for arg do if test -n "$dst_arg"; then # $@ is not empty: it contains at least $arg. set fnord "$@" "$dst_arg" shift # fnord fi shift # arg dst_arg=$arg done fi if test $# -eq 0; then if test -z "$dir_arg"; then echo "$0: no input file specified." >&2 exit 1 fi # It's OK to call `install-sh -d' without argument. # This can happen when creating conditional directories. exit 0 fi if test -z "$dir_arg"; then trap '(exit $?); exit' 1 2 13 15 # Set umask so as not to create temps with too-generous modes. # However, 'strip' requires both read and write access to temps. case $mode in # Optimize common cases. *644) cp_umask=133;; *755) cp_umask=22;; *[0-7]) if test -z "$stripcmd"; then u_plus_rw= else u_plus_rw='% 200' fi cp_umask=`expr '(' 777 - $mode % 1000 ')' $u_plus_rw`;; *) if test -z "$stripcmd"; then u_plus_rw= else u_plus_rw=,u+rw fi cp_umask=$mode$u_plus_rw;; esac fi for src do # Protect names starting with `-'. case $src in -*) src=./$src;; esac if test -n "$dir_arg"; then dst=$src dstdir=$dst test -d "$dstdir" dstdir_status=$? else # Waiting for this to be detected by the "$cpprog $src $dsttmp" command # might cause directories to be created, which would be especially bad # if $src (and thus $dsttmp) contains '*'. if test ! -f "$src" && test ! -d "$src"; then echo "$0: $src does not exist." >&2 exit 1 fi if test -z "$dst_arg"; then echo "$0: no destination specified." >&2 exit 1 fi dst=$dst_arg # Protect names starting with `-'. case $dst in -*) dst=./$dst;; esac # If destination is a directory, append the input filename; won't work # if double slashes aren't ignored. if test -d "$dst"; then if test -n "$no_target_directory"; then echo "$0: $dst_arg: Is a directory" >&2 exit 1 fi dstdir=$dst dst=$dstdir/`basename "$src"` dstdir_status=0 else # Prefer dirname, but fall back on a substitute if dirname fails. dstdir=` (dirname "$dst") 2>/dev/null || expr X"$dst" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$dst" : 'X\(//\)[^/]' \| \ X"$dst" : 'X\(//\)$' \| \ X"$dst" : 'X\(/\)' \| . 2>/dev/null || echo X"$dst" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q' ` test -d "$dstdir" dstdir_status=$? fi fi obsolete_mkdir_used=false if test $dstdir_status != 0; then case $posix_mkdir in '') # Create intermediate dirs using mode 755 as modified by the umask. # This is like FreeBSD 'install' as of 1997-10-28. umask=`umask` case $stripcmd.$umask in # Optimize common cases. *[2367][2367]) mkdir_umask=$umask;; .*0[02][02] | .[02][02] | .[02]) mkdir_umask=22;; *[0-7]) mkdir_umask=`expr $umask + 22 \ - $umask % 100 % 40 + $umask % 20 \ - $umask % 10 % 4 + $umask % 2 `;; *) mkdir_umask=$umask,go-w;; esac # With -d, create the new directory with the user-specified mode. # Otherwise, rely on $mkdir_umask. if test -n "$dir_arg"; then mkdir_mode=-m$mode else mkdir_mode= fi posix_mkdir=false case $umask in *[123567][0-7][0-7]) # POSIX mkdir -p sets u+wx bits regardless of umask, which # is incompatible with FreeBSD 'install' when (umask & 300) != 0. ;; *) tmpdir=${TMPDIR-/tmp}/ins$RANDOM-$$ trap 'ret=$?; rmdir "$tmpdir/d" "$tmpdir" 2>/dev/null; exit $ret' 0 if (umask $mkdir_umask && exec $mkdirprog $mkdir_mode -p -- "$tmpdir/d") >/dev/null 2>&1 then if test -z "$dir_arg" || { # Check for POSIX incompatibilities with -m. # HP-UX 11.23 and IRIX 6.5 mkdir -m -p sets group- or # other-writeable bit of parent directory when it shouldn't. # FreeBSD 6.1 mkdir -m -p sets mode of existing directory. ls_ld_tmpdir=`ls -ld "$tmpdir"` case $ls_ld_tmpdir in d????-?r-*) different_mode=700;; d????-?--*) different_mode=755;; *) false;; esac && $mkdirprog -m$different_mode -p -- "$tmpdir" && { ls_ld_tmpdir_1=`ls -ld "$tmpdir"` test "$ls_ld_tmpdir" = "$ls_ld_tmpdir_1" } } then posix_mkdir=: fi rmdir "$tmpdir/d" "$tmpdir" else # Remove any dirs left behind by ancient mkdir implementations. rmdir ./$mkdir_mode ./-p ./-- 2>/dev/null fi trap '' 0;; esac;; esac if $posix_mkdir && ( umask $mkdir_umask && $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir" ) then : else # The umask is ridiculous, or mkdir does not conform to POSIX, # or it failed possibly due to a race condition. Create the # directory the slow way, step by step, checking for races as we go. case $dstdir in /*) prefix='/';; -*) prefix='./';; *) prefix='';; esac eval "$initialize_posix_glob" oIFS=$IFS IFS=/ $posix_glob set -f set fnord $dstdir shift $posix_glob set +f IFS=$oIFS prefixes= for d do test -z "$d" && continue prefix=$prefix$d if test -d "$prefix"; then prefixes= else if $posix_mkdir; then (umask=$mkdir_umask && $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir") && break # Don't fail if two instances are running concurrently. test -d "$prefix" || exit 1 else case $prefix in *\'*) qprefix=`echo "$prefix" | sed "s/'/'\\\\\\\\''/g"`;; *) qprefix=$prefix;; esac prefixes="$prefixes '$qprefix'" fi fi prefix=$prefix/ done if test -n "$prefixes"; then # Don't fail if two instances are running concurrently. (umask $mkdir_umask && eval "\$doit_exec \$mkdirprog $prefixes") || test -d "$dstdir" || exit 1 obsolete_mkdir_used=true fi fi fi if test -n "$dir_arg"; then { test -z "$chowncmd" || $doit $chowncmd "$dst"; } && { test -z "$chgrpcmd" || $doit $chgrpcmd "$dst"; } && { test "$obsolete_mkdir_used$chowncmd$chgrpcmd" = false || test -z "$chmodcmd" || $doit $chmodcmd $mode "$dst"; } || exit 1 else # Make a couple of temp file names in the proper directory. dsttmp=$dstdir/_inst.$$_ rmtmp=$dstdir/_rm.$$_ # Trap to clean up those temp files at exit. trap 'ret=$?; rm -f "$dsttmp" "$rmtmp" && exit $ret' 0 # Copy the file name to the temp name. (umask $cp_umask && $doit_exec $cpprog "$src" "$dsttmp") && # and set any options; do chmod last to preserve setuid bits. # # If any of these fail, we abort the whole thing. If we want to # ignore errors from any of these, just make sure not to ignore # errors from the above "$doit $cpprog $src $dsttmp" command. # { test -z "$chowncmd" || $doit $chowncmd "$dsttmp"; } && { test -z "$chgrpcmd" || $doit $chgrpcmd "$dsttmp"; } && { test -z "$stripcmd" || $doit $stripcmd "$dsttmp"; } && { test -z "$chmodcmd" || $doit $chmodcmd $mode "$dsttmp"; } && # If -C, don't bother to copy if it wouldn't change the file. if $copy_on_change && old=`LC_ALL=C ls -dlL "$dst" 2>/dev/null` && new=`LC_ALL=C ls -dlL "$dsttmp" 2>/dev/null` && eval "$initialize_posix_glob" && $posix_glob set -f && set X $old && old=:$2:$4:$5:$6 && set X $new && new=:$2:$4:$5:$6 && $posix_glob set +f && test "$old" = "$new" && $cmpprog "$dst" "$dsttmp" >/dev/null 2>&1 then rm -f "$dsttmp" else # Rename the file to the real destination. $doit $mvcmd -f "$dsttmp" "$dst" 2>/dev/null || # The rename failed, perhaps because mv can't rename something else # to itself, or perhaps because mv is so ancient that it does not # support -f. { # Now remove or move aside any old file at destination location. # We try this two ways since rm can't unlink itself on some # systems and the destination file might be busy for other # reasons. In this case, the final cleanup might fail but the new # file should still install successfully. { test ! -f "$dst" || $doit $rmcmd -f "$dst" 2>/dev/null || { $doit $mvcmd -f "$dst" "$rmtmp" 2>/dev/null && { $doit $rmcmd -f "$rmtmp" 2>/dev/null; :; } } || { echo "$0: cannot unlink or rename $dst" >&2 (exit 1); exit 1 } } && # Now rename the file to the real destination. $doit $mvcmd "$dsttmp" "$dst" } fi || exit 1 trap '' 0 fi done # Local variables: # eval: (add-hook 'write-file-hooks 'time-stamp) # time-stamp-start: "scriptversion=" # time-stamp-format: "%:y-%02m-%02d.%02H" # time-stamp-end: "$" # End: openhpi-2.14.1/clients/0000755000076400007640000000000011405006365011632 5ustar openhpi-2.14.1/clients/hpiinv.c0000644000076400007640000004724611302567131013307 0ustar /* -*- linux-c -*- * * hpiinv.c * * Copyright (c) 2003-2005 by Intel Corp. * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Andy Cress * Peter D. Phan * Renier Morales * Tariq Shureih * Racing Guo * * Log: * 6/29/04 Copied from hpifru.c and modified for general use * 11/30/04 ver 0.2 for openhpi-2.0.0 * 2/09/05 ARCress re-merged with hpifru.c, adding IdrFieldSet, * generalized for other HPI libraris also. */ #define OPENHPI_USED 1 #include #include #include #include #include #include #include #ifdef OPENHPI_USED #include #endif #define OH_SVN_REV "$Revision: 7025 $" #define NCT 25 #define MAX_STRSIZE 64 char *chasstypes[NCT] = { "Not Defined", "Other", "Unknown", "Desktop", "Low Profile Desktop", "Pizza Box", "Mini Tower", "Tower", "Portable", "Laptop", "Notebook", "Handheld", "Docking Station", "All in One", "Subnotebook", "Space Saving", "Lunch Box", "Main Server", "Expansion", "SubChassis", "Buss Expansion Chassis", "Peripheral Chassis", "RAID Chassis", "Rack-Mount Chassis", "New" }; int fasset = 0; int fverbose = 0; int foundasset = 0; int fdebug = 0; int fzdebug = 0; int i,j,k = 0; SaHpiUint32T buffersize; SaHpiUint32T actualsize; char inbuff[2048]; char outbuff[1024]; SaHpiIdrAreaHeaderT *inv; SaHpiIdrFieldTypeT chasstype; SaHpiTextBufferT *strptr; struct { SaHpiResourceIdT rid; SaHpiEntryIdT idrid; SaHpiEntryIdT areaid; SaHpiEntryIdT fieldid; char *tag; int tlen; } atag; #define NRW_ENTS 12 SaHpiEntityTypeT rw_entities[NRW_ENTS] = { /*read-writable entities*/ SAHPI_ENT_SYS_MGMNT_MODULE, SAHPI_ENT_SYSTEM_BOARD, SAHPI_ENT_FRONT_PANEL_BOARD, SAHPI_ENT_SYSTEM_CHASSIS, SAHPI_ENT_SYS_MGMNT_SOFTWARE, SAHPI_ENT_COMPACTPCI_CHASSIS, SAHPI_ENT_ADVANCEDTCA_CHASSIS, SAHPI_ENT_RACK_MOUNTED_SERVER, SAHPI_ENT_SYSTEM_BLADE, SAHPI_ENT_SWITCH_BLADE, SAHPI_ENT_SPEC_PROC_BLADE, SAHPI_ENT_ALARM_MANAGER }; #ifdef BMCONLY char bmctag[] = "Basbrd Mgmt Ctlr"; /* see IsTagBmc() */ char bmctag2[] = "Management Controller"; /* see IsTagBmc() */ /* * findmatch * returns offset of the match if found, or -1 if not found. */ static int findmatch(char *buffer, int sbuf, char *pattern, int spattern, char figncase) { int c, j, imatch; j = 0; imatch = 0; for (j = 0; j < sbuf; j++) { if (sbuf - j < spattern && imatch == 0) return (-1); c = buffer[j]; if (c == pattern[imatch]) { imatch++; if (imatch == spattern) return (++j - imatch); } else if (pattern[imatch] == '?') { /*wildcard char*/ imatch++; if (imatch == spattern) return (++j - imatch); } else if (figncase == 1) { if ((c & 0x5f) == (pattern[imatch] & 0x5f)) { imatch++; if (imatch == spattern) return (++j - imatch); } else imatch = 0; } else imatch = 0; } return (-1); } /*end findmatch */ static int IsTagBmc(char *dstr, int dlen) { int ret = 0; if (strncmp(dstr, bmctag, sizeof(bmctag)) == 0) /* Sahalee */ ret = 1; else if (findmatch(dstr,dlen,"BMC",3,1) >= 0) /* mBMC or other */ ret = 1; else if (findmatch(dstr,dlen,bmctag2,sizeof(bmctag2),1) >= 0) ret = 1; /* BMC tag for OpenHPI with ipmi plugin */ return(ret); } #else static int IsTagBmc(char *dstr, int dlen) { /* if OpenHPI, always return TRUE for any Inventory RDR */ return(1); } #endif static int ent_writable(SaHpiEntityPathT *ep, SaHpiIdrInfoT *idrinfo) { int i, rv; /* The IdrInfo ReadOnly field might be ok, but we don't even want to attempt to write to DIMMs or Power Supplies, even if the plugin reports it otherwise, so only check for known writable entity types. */ for (i = 0; i < NRW_ENTS; i++) if (rw_entities[i] == ep->Entry[0].EntityType) break; if (i >= NRW_ENTS) rv = 0; else rv = 1; return(rv); } static void fixstr(SaHpiTextBufferT *strptr, char *outstr) { size_t datalen; if (outstr == NULL) return; outstr[0] = 0; if (strptr == NULL) return; datalen = strptr->DataLength; if (datalen > MAX_STRSIZE) datalen = MAX_STRSIZE-1; if (datalen != 0) { strncpy ((char *)outstr, (char *)strptr->Data, datalen); outstr[datalen] = 0; if (fdebug) { printf("TextBuffer len=%d, dtype=%x lang=%d: %s\n", strptr->DataLength,strptr->DataType,strptr->Language, strptr->Data ); } } #ifdef LENGTH_BAD else /* may be bogus length, try anyway */ strcpy ((char *)outstr, (char *)strptr->Data); #endif } #define NAREATYP 6 static struct { SaHpiUint8T type; char *str; } map_areatype[NAREATYP] = { { SAHPI_IDR_AREATYPE_INTERNAL_USE, "Internal Area" }, { SAHPI_IDR_AREATYPE_CHASSIS_INFO, "Chassis Area" }, { SAHPI_IDR_AREATYPE_BOARD_INFO, "Board Area" }, { SAHPI_IDR_AREATYPE_PRODUCT_INFO, "Product Area" }, { SAHPI_IDR_AREATYPE_OEM, "OEM Area" }, { SAHPI_IDR_AREATYPE_UNSPECIFIED, "Unspecified Area" } }; #define NFIELDTYP 11 static struct { SaHpiUint8T type; char *str; } map_fieldtype[NFIELDTYP] = { { SAHPI_IDR_FIELDTYPE_CHASSIS_TYPE, "Chassis Type "}, { SAHPI_IDR_FIELDTYPE_MFG_DATETIME, "Mfg DateTime "}, { SAHPI_IDR_FIELDTYPE_MANUFACTURER, "Manufacturer "}, { SAHPI_IDR_FIELDTYPE_PRODUCT_NAME, "Product Name "}, { SAHPI_IDR_FIELDTYPE_PRODUCT_VERSION, "Product Versn"}, { SAHPI_IDR_FIELDTYPE_SERIAL_NUMBER, "Serial Number"}, { SAHPI_IDR_FIELDTYPE_PART_NUMBER, "Part Number "}, { SAHPI_IDR_FIELDTYPE_FILE_ID, "File ID "}, { SAHPI_IDR_FIELDTYPE_ASSET_TAG, "Asset Tag "}, { SAHPI_IDR_FIELDTYPE_CUSTOM, "Custom Field "}, { SAHPI_IDR_FIELDTYPE_UNSPECIFIED, "Unspecified "} }; #define NEPTYPES 67 struct { SaHpiEntityTypeT type; char *str; } map_epstr[NEPTYPES] = { { SAHPI_ENT_ADD_IN_CARD, "ADD_IN_CARD" }, { SAHPI_ENT_ADVANCEDTCA_CHASSIS, "ADVANCEDTCA_CHASSIS" }, { SAHPI_ENT_ALARM_MANAGER, "ALARM_MANAGER" }, { SAHPI_ENT_BACK_PANEL_BOARD, "BACK_PANEL_BOARD" }, { SAHPI_ENT_BATTERY, "BATTERY" }, { SAHPI_ENT_BIOS, "BIOS" }, { SAHPI_ENT_BOARD_SET_SPECIFIC, "BOARD_SET_SPECIFIC" }, { SAHPI_ENT_CHASSIS_BACK_PANEL_BOARD, "CHASSIS_BACK_PANEL_BOARD" }, { SAHPI_ENT_CHASSIS_SPECIFIC, "CHASSIS_SPECIFIC" }, { SAHPI_ENT_COMPACTPCI_CHASSIS, "COMPACTPCI_CHASSIS" }, { SAHPI_ENT_COOLING_DEVICE, "COOLING_DEVICE" }, { SAHPI_ENT_COOLING_UNIT, "COOLING_UNIT" }, { SAHPI_ENT_DEVICE_BAY, "DEVICE_BAY" }, { SAHPI_ENT_DISK_BAY, "DISK_BAY" }, { SAHPI_ENT_DISK_BLADE, "DISK_BLADE" }, { SAHPI_ENT_DISK_DRIVE, "DISK_DRIVE" }, { SAHPI_ENT_DISK_DRIVE_BAY, "DISK_DRIVE_BAY" }, { SAHPI_ENT_DISPLAY_PANEL, "DISPLAY_PANEL" }, { SAHPI_ENT_DRIVE_BACKPLANE, "DRIVE_BACKPLANE" }, { SAHPI_ENT_EXTERNAL_ENVIRONMENT, "EXTERNAL_ENVIRONMENT" }, { SAHPI_ENT_FAN, "FAN" }, { SAHPI_ENT_FRONT_PANEL_BOARD, "FRONT_PANEL_BOARD" }, { SAHPI_ENT_GROUP, "GROUP" }, { SAHPI_ENT_INTERCONNECT, "INTERCONNECT" }, { SAHPI_ENT_IO_BLADE, "IO_BLADE" }, { SAHPI_ENT_IO_SUBBOARD, "IO_SUBBOARD" }, { SAHPI_ENT_MEMORY_DEVICE, "MEMORY_DEVICE" }, { SAHPI_ENT_MEMORY_MODULE, "MEMORY_MODULE" }, { SAHPI_ENT_OEM_SYSINT_SPECIFIC, "OEM_SYSINT_SPECIFIC" }, { SAHPI_ENT_OPERATING_SYSTEM, "OPERATING_SYSTEM" }, { SAHPI_ENT_OTHER, "OTHER" }, { SAHPI_ENT_OTHER_CHASSIS_BOARD, "OTHER_CHASSIS_BOARD" }, { SAHPI_ENT_OTHER_SYSTEM_BOARD, "OTHER_SYSTEM_BOARD" }, { SAHPI_ENT_PERIPHERAL_BAY, "PERIPHERAL_BAY" }, { SAHPI_ENT_PERIPHERAL_BAY_2, "PERIPHERAL_BAY_2" }, { SAHPI_ENT_PHYSICAL_SLOT, "PHYSICAL_SLOT" }, { SAHPI_ENT_POWER_DISTRIBUTION_UNIT, "POWER_DISTRIBUTION_UNIT" }, { SAHPI_ENT_POWER_MGMNT, "POWER_MGMNT" }, { SAHPI_ENT_POWER_MODULE, "POWER_MODULE" }, { SAHPI_ENT_POWER_SUPPLY, "POWER_SUPPLY" }, { SAHPI_ENT_POWER_SYSTEM_BOARD, "POWER_SYSTEM_BOARD" }, { SAHPI_ENT_POWER_UNIT, "POWER_UNIT" }, { SAHPI_ENT_PROCESSOR, "PROCESSOR" }, { SAHPI_ENT_PROCESSOR_BOARD, "PROCESSOR_BOARD" }, { SAHPI_ENT_PROCESSOR_MODULE, "PROCESSOR_MODULE" }, { SAHPI_ENT_RACK, "RACK" }, { SAHPI_ENT_RACK_MOUNTED_SERVER, "RACK_MOUNTED_SERVER" }, { SAHPI_ENT_REMOTE, "REMOTE" }, { SAHPI_ENT_ROOT, "ROOT" }, { SAHPI_ENT_SBC_BLADE, "SBC_BLADE" }, { SAHPI_ENT_SBC_SUBBOARD, "SBC_SUBBOARD" }, { SAHPI_ENT_SHELF_MANAGER, "SHELF_MANAGER" }, { SAHPI_ENT_SPEC_PROC_BLADE, "SPEC_PROC_BLADE" }, { SAHPI_ENT_SUBBOARD_CARRIER_BLADE, "SUBBOARD_CARRIER_BLADE" }, { SAHPI_ENT_SUB_CHASSIS, "SUB_CHASSIS" }, { SAHPI_ENT_SUBRACK, "SUBRACK" }, { SAHPI_ENT_SWITCH, "SWITCH" }, { SAHPI_ENT_SWITCH_BLADE, "SWITCH_BLADE" }, { SAHPI_ENT_SYS_EXPANSION_BOARD, "SYS_EXPANSION_BOARD" }, { SAHPI_ENT_SYS_MGMNT_MODULE, "SYS_MGMNT_MODULE" }, { SAHPI_ENT_SYS_MGMNT_SOFTWARE, "SYS_MGMNT_SOFTWARE" }, { SAHPI_ENT_SYSTEM_BLADE, "SYSTEM_BLADE" }, { SAHPI_ENT_SYSTEM_BOARD, "SYSTEM_BOARD" }, { SAHPI_ENT_SYSTEM_BUS, "SYSTEM_BUS" }, { SAHPI_ENT_SYSTEM_CHASSIS, "SYSTEM_CHASSIS" }, { SAHPI_ENT_UNKNOWN, "UNKNOWN" }, { SAHPI_ENT_UNSPECIFIED, "UNSPECIFIED" }, }; static void print_epath(SaHpiEntityPathT *epath, int len); static void print_epath(SaHpiEntityPathT *epath, int len) { int i,j; SaHpiEntityTypeT t; char *pstr; #ifdef OPENHPI_USED if (fverbose) { oh_print_ep(epath, len); } else #endif { for (i = 0; i < SAHPI_MAX_ENTITY_PATH; i++) { t = epath->Entry[i].EntityType; pstr = ""; for (j = 0; j < NEPTYPES; j++) { if (t == map_epstr[j].type) { pstr = map_epstr[j].str; break; } } if (j == NEPTYPES) j--; printf("{%s:%d} ",pstr, epath->Entry[i].EntityLocation); if (t == SAHPI_ENT_ROOT) break; } printf("\n"); } return; } static void print_idrinfo(SaHpiIdrInfoT *idrInfo,int len); static void print_idrinfo(SaHpiIdrInfoT *idrInfo,int len) { #ifdef OPENHPI_USED if (fverbose) { oh_print_idrinfo(idrInfo, len); } else #endif { /* don't need to show this if not fverbose */ } } static void print_idrareaheader(SaHpiIdrAreaHeaderT *areaHeader, int len); static void print_idrareaheader(SaHpiIdrAreaHeaderT *areaHeader, int len) { int i; #ifdef OPENHPI_USED if (fverbose) { oh_print_idrareaheader(areaHeader, len); } else #endif { for (i = 0; i < NAREATYP; i++) { if (map_areatype[i].type == areaHeader->Type) break; } if (i == NAREATYP) i--; printf("AreaId[%d] %s\n",areaHeader->AreaId,map_areatype[i].str); } } static void print_idrfield(SaHpiIdrFieldT *field, int len); static void print_idrfield(SaHpiIdrFieldT *field, int len) { SaHpiTextBufferT *strptr; char fieldstr[MAX_STRSIZE]; int i; #ifdef OPENHPI_USED if (fverbose) { oh_print_idrfield(field, len); } else #endif { for (i = 0; i < NFIELDTYP; i++) { if (map_fieldtype[i].type == field->Type) break; } if (i == NFIELDTYP) i--; strptr = &(field->Field); fixstr(strptr,fieldstr); /*stringify if needed*/ printf(" FieldId[%d] %s : %s\n", field->FieldId,map_fieldtype[i].str ,fieldstr); } } int walkInventory(SaHpiSessionIdT sessionid, SaHpiResourceIdT resourceid, SaHpiIdrInfoT *idrInfo); int walkInventory(SaHpiSessionIdT sessionid, SaHpiResourceIdT resourceid, SaHpiIdrInfoT *idrInfo) { SaErrorT rv = SA_OK, rvField = SA_OK; SaHpiUint32T numAreas; SaHpiUint32T countAreas = 0; SaHpiUint32T countFields = 0; SaHpiEntryIdT areaId; SaHpiEntryIdT nextareaId; SaHpiIdrAreaTypeT areaType; SaHpiIdrAreaHeaderT areaHeader; SaHpiEntryIdT fieldId; SaHpiEntryIdT nextFieldId; SaHpiIdrFieldTypeT fieldType; SaHpiIdrFieldT thisField; numAreas = idrInfo->NumAreas; areaType = SAHPI_IDR_AREATYPE_UNSPECIFIED; areaId = SAHPI_FIRST_ENTRY; foundasset = 0; while ((rv == SA_OK) && (areaId != SAHPI_LAST_ENTRY)) { rv = saHpiIdrAreaHeaderGet(sessionid, resourceid, idrInfo->IdrId, areaType, areaId, &nextareaId, &areaHeader); if (rv == SA_OK) { countAreas++; print_idrareaheader(&areaHeader, 8); fieldType = SAHPI_IDR_FIELDTYPE_UNSPECIFIED; fieldId = SAHPI_FIRST_ENTRY; countFields = 0; while ((rvField == SA_OK) && (fieldId != SAHPI_LAST_ENTRY)) { rvField = saHpiIdrFieldGet( sessionid, resourceid, idrInfo->IdrId, areaHeader.AreaId, fieldType, fieldId, &nextFieldId, &thisField); if (fdebug) printf("saHpiIdrFieldGet[%x] rv = %d type=%d\n", idrInfo->IdrId,rvField, thisField.Type); if (rvField == SA_OK) { countFields++; print_idrfield(&thisField, 12); if (thisField.Type == SAHPI_IDR_FIELDTYPE_ASSET_TAG) { atag.rid = resourceid; atag.idrid = idrInfo->IdrId; atag.areaid = areaHeader.AreaId; atag.fieldid = fieldId; foundasset = 1; } } fieldId = nextFieldId; } /*while fields*/ if ( countFields != areaHeader.NumFields) printf("Area Header error: areaHeader.NumFields %d, countFields %d\n", areaHeader.NumFields, countFields); } else { printf("saHpiIdrAreaHeaderGet error %d\n",rv); } areaId = nextareaId; } /*while areas*/ if ((rv == SA_OK) && (countAreas != numAreas)) printf("idrInfo error! idrInfo.NumAreas = %d; countAreas = %d\n", numAreas, countAreas); if (countFields > 0) rv = 0; return(rv); } /*end walkInventory*/ int main(int argc, char **argv) { int c; SaErrorT rv,rv_rdr; SaHpiSessionIdT sessionid; SaHpiDomainInfoT rptinfo; SaHpiRptEntryT rptentry; SaHpiEntryIdT rptentryid; SaHpiEntryIdT nextrptentryid; SaHpiEntryIdT entryid; SaHpiEntryIdT nextentryid; SaHpiResourceIdT resourceid; SaHpiRdrT rdr; SaHpiIdrInfoT idrInfo; SaHpiIdrIdT idrid; int invfound = 0; int nloops = 0; oh_prog_version(argv[0], OH_SVN_REV); atag.tlen = 0; while ( (c = getopt( argc, argv,"a:vxz?")) != EOF ) switch(c) { case 'z': fzdebug = 1; /* fall thru to include next setting */ case 'x': fdebug = 1; break; case 'v': fverbose = 1; break; case 'a': fasset = 1; if (optarg) { atag.tag = (char *)strdup(optarg); atag.tlen = strlen(optarg); } break; default: printf("Usage: %s [-x] [-a asset_tag]\n", argv[0]); printf(" -a Sets the asset tag\n"); printf(" -x Display debug messages\n"); printf(" -z Display extra debug messages\n"); exit(1); } /* compile error */ // inv = (SaHpiIdrAreaHeaderT *)&inbuff[0]; inv = (SaHpiIdrAreaHeaderT *)(void *)&inbuff[0]; rv = saHpiSessionOpen(SAHPI_UNSPECIFIED_DOMAIN_ID,&sessionid,NULL); if (fdebug) printf("saHpiSessionOpen rv = %d sessionid = %x\n",rv,sessionid); if (rv != SA_OK) { printf("saHpiSessionOpen error %d\n",rv); exit(-1); } rv = saHpiDomainInfoGet(sessionid,&rptinfo); if (fdebug) printf("saHpiDomainInfoGet rv = %d\n",rv); // if (fdebug) printf("RptInfo: UpdateCount = %x, UpdateTime = %lx\n", // rptinfo.UpdateCount, (unsigned long)rptinfo.UpdateTimestamp); while (!invfound && (nloops < 7)) { /* * The OpenHPI ipmi plugin has a bug whereby the FRU RDR is added * much later, and always requires a rediscovery. (bug #1095256) * This should not apply to other well-behaved plugins. */ nloops++; if (fdebug) printf("Starting Discovery, pass %d ...\n",nloops); rv = saHpiDiscover(sessionid); if (fdebug) printf("saHpiDiscover rv = %d\n",rv); if (rv != SA_OK) { printf("saHpiDiscover error %d\n",rv); break; } /* walk the RPT list */ rptentryid = SAHPI_FIRST_ENTRY; while ((rv == SA_OK) && (rptentryid != SAHPI_LAST_ENTRY)) { rv = saHpiRptEntryGet(sessionid,rptentryid,&nextrptentryid,&rptentry); if (rv != SA_OK) printf("RptEntryGet: rid=%d rv = %d\n",rptentryid,rv); if (rv == SA_OK) { /* walk the RDR list for this RPT entry */ entryid = SAHPI_FIRST_ENTRY; /* OpenHPI plugin sometimes has bad RPT Tag DataLength here. */ // rptentry.ResourceTag.Data[rptentry.ResourceTag.DataLength] = 0; resourceid = rptentry.ResourceId; if (fdebug) printf("rptentry[%d] resourceid=%d\n", rptentryid,resourceid); if (rptentry.ResourceCapabilities & SAHPI_CAPABILITY_INVENTORY_DATA) { printf("Resource[%d] Tag: %s \thas inventory capability\n", rptentryid,rptentry.ResourceTag.Data); rv_rdr = SA_OK; while ((rv_rdr == SA_OK) && (entryid != SAHPI_LAST_ENTRY)) { rv_rdr = saHpiRdrGet(sessionid,resourceid, entryid,&nextentryid, &rdr); if (fdebug) printf("saHpiRdrGet[%x] rv = %d\n",entryid,rv_rdr); if (rv_rdr == SA_OK) { if (fdebug) printf("Rdr[%x] type = %d tag = %s\n",entryid, rdr.RdrType,rdr.IdString.Data); if (rdr.RdrType == SAHPI_INVENTORY_RDR) { invfound = 1; /*type 3 includes inventory records*/ rdr.IdString.Data[rdr.IdString.DataLength] = 0; idrid = rdr.RdrTypeUnion.InventoryRec.IdrId; buffersize = sizeof(inbuff); if (fdebug) { printf("Rdr[%x] is inventory, IdrId=%x\n",rdr.RecordId,idrid); printf("Inv BufferSize=%d\n", buffersize); } if ( IsTagBmc((char *)rdr.IdString.Data, rdr.IdString.DataLength) ) { /* Get all of the inventory data areas and fields */ memset(inv,0,buffersize); rv_rdr = saHpiIdrInfoGet(sessionid, resourceid, idrid, &idrInfo); if (rv_rdr != SA_OK) { printf("IDR Info error: rv_rdr = %d\n",rv_rdr); } else { /* idrInfo is ok */ if (fdebug) printf("IDR Info: ok \n"); print_epath(&rptentry.ResourceEntity, 1); printf("RDR[%x]: Inventory, IdrId=%x %s\n",rdr.RecordId, idrid,rdr.IdString.Data); print_idrinfo(&idrInfo,4); rv_rdr = walkInventory(sessionid, resourceid, &idrInfo); if (fdebug) printf("walkInventory rv_rdr = %d\n",rv_rdr); } if (!ent_writable(&rptentry.ResourceEntity,&idrInfo)) foundasset = 0; if ((fasset == 1) && (foundasset == 1)) { SaHpiIdrFieldT atagField; atagField.Type = SAHPI_IDR_FIELDTYPE_ASSET_TAG; atagField.ReadOnly = SAHPI_FALSE; atagField.AreaId = atag.areaid; atagField.FieldId = atag.fieldid; strptr=&(atagField.Field); strptr->DataType = SAHPI_TL_TYPE_TEXT; strptr->Language = SAHPI_LANG_ENGLISH; strptr->DataLength = (SaHpiUint8T)atag.tlen; strncpy((char *)strptr->Data, atag.tag, atag.tlen); strptr->Data[atag.tlen] = 0; printf( "Writing new asset tag: %s\n",strptr->Data); rv_rdr = saHpiIdrFieldSet(sessionid, resourceid, atag.idrid, &atagField); printf("Return Write Status = %d\n", rv_rdr); if (rv_rdr == SA_OK) { printf ("Good write - re-reading!\n"); rv_rdr = walkInventory(sessionid, resourceid, &idrInfo); if (fdebug) printf("walkInventory rv_rdr = %d\n",rv_rdr); } /* Good write - re-read */ } /*endif fasset*/ } /*endif RDR tag ok*/ } /* Inventory Data Records - Type 3 */ else if (fdebug) printf("rdr type = %d\n", rdr.RdrType); } /*endif RdrGet ok*/ entryid = nextentryid; } /*end while rdr*/ } /*endif rpt invent capab*/ else if (fdebug) printf("Resource[%d] Tag: %s\n", rptentryid, rptentry.ResourceTag.Data); } /*endif rpt ok*/ rptentryid = nextrptentryid; } /*end rpt loop */ if (fdebug) printf("loop %d inventory found = %d\n",nloops,invfound); } /*end while no inv */ rv = saHpiSessionClose(sessionid); exit(0); } /* end hpifru.c */ openhpi-2.14.1/clients/Makefile.am0000644000076400007640000000346511302567131013675 0ustar MAINTAINERCLEANFILES = Makefile.in MOSTLYCLEANFILES = @TEST_CLEAN@ INCLUDES = @OPENHPI_INCLUDES@ EXTRA_DIST = oh_clients.h COMMONLIBS = @STATIC_PLUGIN_LIBS@ @STATIC_PLUGIN_EXTRA_LIBS@ COMMONLIBS += $(top_builddir)/openhpid/libopenhpi.la CLIENTS_SRC = clients.c bin_PROGRAMS = \ hpievents \ hpifan \ hpiinv \ hpiel \ hpisensor \ hpipower \ hpitree \ hpialarms \ hpireset \ hpiwdt \ hpithres \ hpitop \ hpisettime \ hpionIBMblade include_HEADERS = hpialarms_SOURCES = hpialarms.c $(CLIENTS_SRC) hpialarms_LDADD = $(COMMONLIBS) hpithres_SOURCES = hpithres.c $(CLIENTS_SRC) hpithres_LDADD = $(COMMONLIBS) hpifan_SOURCES = hpifan.c $(CLIENTS_SRC) hpifan_LDADD = $(COMMONLIBS) hpitop_SOURCES = hpitop.c $(CLIENTS_SRC) hpitop_LDADD = $(COMMONLIBS) hpireset_SOURCES = hpireset.c $(CLIENTS_SRC) hpireset_LDADD = $(COMMONLIBS) hpiel_SOURCES = hpiel.c $(CLIENTS_SRC) hpiel_LDADD = $(COMMONLIBS) hpisensor_SOURCES = hpisensor.c $(CLIENTS_SRC) hpisensor_LDADD = $(COMMONLIBS) hpiwdt_SOURCES = hpiwdt.c $(CLIENTS_SRC) hpiwdt_LDADD = $(COMMONLIBS) hpiinv_SOURCES = hpiinv.c $(CLIENTS_SRC) hpiinv_LDADD = $(COMMONLIBS) hpisettime_SOURCES = hpisettime.c $(CLIENTS_SRC) hpisettime_LDADD = $(COMMONLIBS) hpievents_SOURCES = hpievents.c $(CLIENTS_SRC) hpievents_LDADD = $(COMMONLIBS) hpipower_SOURCES = hpipower.c $(CLIENTS_SRC) hpipower_LDADD = $(COMMONLIBS) hpitree_SOURCES = hpitree.c $(CLIENTS_SRC) hpitree_LDADD = $(COMMONLIBS) hpionIBMblade_SOURCES = hpionIBMblade.c $(CLIENTS_SRC) hpionIBMblade_LDADD = $(COMMONLIBS) clean-local: rm -f *~ *.o openhpi-2.14.1/clients/hpitop.c0000644000076400007640000003475111302567131013312 0ustar /* -*- linux-c -*- * * Copyright (c) 2003 by Intel Corp. * (C) Copyright IBM Corp. 2004, 2005 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Peter D. Phan * * Log: * Start from hpitree.c * This routine display highlevel topology for a managed openHPI complex * * Changes: * * */ #include #include #include #include #include #include #include #include #define OH_SVN_REV "$Revision: 7025 $" /* * Function prototypes */ static SaErrorT list_resources(SaHpiSessionIdT sessionid, SaHpiResourceIdT res_id); static SaErrorT list_rpt(SaHpiRptEntryT *rptptr); static SaErrorT list_rdr(SaHpiSessionIdT sessionid, SaHpiRptEntryT *rptptr, SaHpiRdrT *rdrptr, SaHpiResourceIdT l_resourceid); static SaErrorT show_rpt(SaHpiRptEntryT *rptptr,SaHpiResourceIdT resourceid); static SaErrorT show_rdr(oh_big_textbuffer *buffer); static SaErrorT show_inv(SaHpiSessionIdT sessionid, SaHpiRptEntryT *rptptr, SaHpiRdrT *rdrptr, SaHpiResourceIdT l_resourceid); static SaErrorT show_sens(SaHpiSessionIdT sessionid, SaHpiRptEntryT *rptptr, SaHpiRdrT *rdrptr, SaHpiResourceIdT l_resourceid); static SaErrorT show_ann(SaHpiSessionIdT sessionid, SaHpiRptEntryT *rptptr, SaHpiRdrT *rdrptr, SaHpiResourceIdT l_resourceid); static SaErrorT show_ctrl(SaHpiSessionIdT sessionid, SaHpiRptEntryT *rptptr, SaHpiRdrT *rdrptr, SaHpiResourceIdT l_resourceid); static SaErrorT show_wdog(SaHpiSessionIdT sessionid, SaHpiRptEntryT *rptptr, SaHpiRdrT *rdrptr, SaHpiResourceIdT l_resourceid); void same_system(oh_big_textbuffer *bigbuf); void show_trailer(char *system); #define all_resources 255 #define EPATHSTRING_END_DELIMITER "}" #define rpt_startblock " |\n +--- " #define rdr_startblock " | |__ " /* * Globals for this driver */ int fdebug = 0; int f_rpt = 0; int f_inv = 0; int f_sensor = 0; int f_wdog = 0; int f_ann = 0; int f_ctrl = 0; int f_overview = 0; char previous_system[SAHPI_MAX_TEXT_BUFFER_LENGTH] = ""; /* * Main */ int main(int argc, char **argv) { SaErrorT rv = SA_OK; SaHpiSessionIdT sessionid; SaHpiResourceIdT resourceid = all_resources; int c; oh_prog_version(argv[0], OH_SVN_REV); while ( (c = getopt( argc, argv,"rsicawn:x?")) != EOF ) { switch(c) { case 'r': f_rpt = 1; break; case 's': f_sensor = 1; break; case 'i': f_inv = 1; break; case 'c': f_ctrl = 1; break; case 'w': f_wdog = 1; break; case 'a': f_ann = 1; break; case 'n': if (optarg) resourceid = atoi(optarg); else resourceid = all_resources; break; case 'x': fdebug = 1; break; default: printf("\n\tUsage: %s [-option]\n\n", argv[0]); printf("\t (No Option) Display system topology: rpt & rdr headers\n"); printf("\t -r Display only rpts\n"); printf("\t -s Display only sensors\n"); printf("\t -c Display only controls\n"); printf("\t -w Display only watchdogs\n"); printf("\t -i Display only inventories\n"); printf("\t -a Display only annunciators\n"); printf("\t -x Display debug messages\n"); printf("\n\n\n\n"); exit(1); } } if (argc == 1) f_overview = 1; memset (previous_system, 0, SAHPI_MAX_TEXT_BUFFER_LENGTH); if (fdebug) printf("saHpiSessionOpen\n"); rv = saHpiSessionOpen(SAHPI_UNSPECIFIED_DOMAIN_ID,&sessionid,NULL); if (rv != SA_OK) { printf("saHpiSessionOpen returns %s\n",oh_lookup_error(rv)); exit(-1); } if (fdebug) printf("saHpiSessionOpen returns with SessionId %d\n", sessionid); /* * Resource discovery */ if (fdebug) printf("saHpiDiscover\n"); rv = saHpiDiscover(sessionid); if (rv != SA_OK) { printf("saHpiDiscover returns %s\n",oh_lookup_error(rv)); exit(-1); } if (fdebug) printf("Discovery done\n"); list_resources(sessionid, resourceid); rv = saHpiSessionClose(sessionid); exit(0); } /* * */ static SaErrorT list_resources(SaHpiSessionIdT sessionid,SaHpiResourceIdT resourceid) { SaErrorT rv = SA_OK, rvRdrGet = SA_OK, rvRptGet = SA_OK; SaHpiRptEntryT rptentry; SaHpiEntryIdT rptentryid; SaHpiEntryIdT nextrptentryid; SaHpiEntryIdT entryid; SaHpiEntryIdT nextentryid; SaHpiRdrT rdr; SaHpiResourceIdT l_resourceid; SaHpiTextBufferT working; oh_init_textbuffer(&working); /* walk the RPT list */ rptentryid = SAHPI_FIRST_ENTRY; do { if (fdebug) printf("saHpiRptEntryGet\n"); rvRptGet = saHpiRptEntryGet(sessionid,rptentryid,&nextrptentryid,&rptentry); if ((rvRptGet != SA_OK) || fdebug) printf("RptEntryGet returns %s\n",oh_lookup_error(rvRptGet)); rv = show_rpt(&rptentry, resourceid); if (rvRptGet == SA_OK && (rptentry.ResourceCapabilities & SAHPI_CAPABILITY_RDR) && ((resourceid == 0xFF) || (resourceid == rptentry.ResourceId))) { l_resourceid = rptentry.ResourceId; if (resourceid != 0xFF) nextrptentryid = SAHPI_LAST_ENTRY; /* walk the RDR list for this RPT entry */ entryid = SAHPI_FIRST_ENTRY; if (fdebug) printf("rptentry[%d] resourceid=%d\n", entryid,resourceid); do { rvRdrGet = saHpiRdrGet(sessionid,l_resourceid, entryid,&nextentryid, &rdr); if (fdebug) printf("saHpiRdrGet[%d] rv = %s\n",entryid,oh_lookup_error(rvRdrGet)); if (rvRdrGet == SA_OK) { // Add zero terminator to RDR Id String SaHpiUint32T last = rdr.IdString.DataLength; if ( last >= SAHPI_MAX_TEXT_BUFFER_LENGTH ) { last = SAHPI_MAX_TEXT_BUFFER_LENGTH - 1; } rdr.IdString.Data[last] = '\0'; if (f_overview) list_rdr(sessionid, &rptentry, &rdr, l_resourceid); if (f_inv) show_inv(sessionid, &rptentry, &rdr, l_resourceid); if (f_sensor) show_sens(sessionid, &rptentry, &rdr, l_resourceid); if (f_ctrl) show_ctrl(sessionid, &rptentry, &rdr, l_resourceid); if (f_wdog) show_wdog(sessionid, &rptentry, &rdr, l_resourceid); if (f_ann) show_ann(sessionid, &rptentry, &rdr, l_resourceid); } entryid = nextentryid; } while ((rvRdrGet == SA_OK) && (entryid != SAHPI_LAST_ENTRY)) ; } rptentryid = nextrptentryid; } while ((rvRptGet == SA_OK) && (rptentryid != SAHPI_LAST_ENTRY)); show_trailer(previous_system); return(rv); } /* * */ void same_system(oh_big_textbuffer *bigbuf) { int size = strcspn((char *)bigbuf->Data, EPATHSTRING_END_DELIMITER); int old_size = strcspn(previous_system, EPATHSTRING_END_DELIMITER); if ( (old_size != size) || (strncmp((char *)bigbuf->Data, previous_system, size+1) != 0)) { if (previous_system[0] == '{') show_trailer(previous_system); memset (previous_system, 0, SAHPI_MAX_TEXT_BUFFER_LENGTH); strncpy (previous_system, (char *)(bigbuf->Data), size+1); previous_system[size+2] = '\0'; printf("\n\n%s\n", previous_system); } } /* * */ void show_trailer(char *system) { printf(" |\nEnd of %s\n\n", system); } /* * */ static SaErrorT show_rpt(SaHpiRptEntryT *rptptr,SaHpiResourceIdT resourceid) { SaErrorT rv = SA_OK, err = SA_OK; oh_big_textbuffer bigbuf1, bigbuf2; SaHpiTextBufferT textbuffer; err = oh_init_textbuffer(&textbuffer); if (err) return(err); err = oh_init_bigtext(&bigbuf1); if (err) return(err); err = oh_init_bigtext(&bigbuf2); if (err) return(err); if ((resourceid == all_resources) || (resourceid == rptptr->ResourceId)) { rv = oh_decode_entitypath(&rptptr->ResourceEntity, &bigbuf2); same_system(&bigbuf2); /* printf("ResourceId: %d", rptptr->ResourceId); */ err = oh_append_bigtext(&bigbuf1, rpt_startblock); err = oh_append_bigtext(&bigbuf1, (char *)bigbuf2.Data); if (err) return(err); err = oh_append_bigtext(&bigbuf1, "\n"); if (err) return(err); printf("%s", bigbuf1.Data); if (f_rpt) list_rpt(rptptr); } return(rv); } /* * */ static SaErrorT list_rpt(SaHpiRptEntryT *rptptr) { SaErrorT rv = SA_OK, err = SA_OK; oh_big_textbuffer bigbuf1, bigbuf2; char str[SAHPI_MAX_TEXT_BUFFER_LENGTH]; SaHpiTextBufferT textbuffer; err = oh_init_textbuffer(&textbuffer); if (err) return(err); err = oh_init_bigtext(&bigbuf1); if (err) return(err); err = oh_init_bigtext(&bigbuf2); if (err) return(err); snprintf(str, SAHPI_MAX_TEXT_BUFFER_LENGTH, " | ResourceId: %d\n", rptptr->ResourceId); oh_append_bigtext(&bigbuf1, str); oh_decode_capabilities(rptptr->ResourceCapabilities, &textbuffer); snprintf(str, SAHPI_MAX_TEXT_BUFFER_LENGTH, " | Capability: %s\n",(char *)textbuffer.Data); oh_append_bigtext(&bigbuf1, str); snprintf(str, SAHPI_MAX_TEXT_BUFFER_LENGTH, " | Tag: %s\n",rptptr->ResourceTag.Data); oh_append_bigtext(&bigbuf1, str); printf("%s", bigbuf1.Data); return(rv); } /* * */ static SaErrorT show_inv(SaHpiSessionIdT sessionid, SaHpiRptEntryT *rptptr, SaHpiRdrT *rdrptr, SaHpiResourceIdT l_resourceid) { SaErrorT rvInvent = SA_OK; SaHpiIdrInfoT idrInfo; SaHpiIdrIdT idrid; char str[SAHPI_MAX_TEXT_BUFFER_LENGTH]; oh_big_textbuffer buffer; rvInvent = oh_init_bigtext(&buffer); if (rdrptr->RdrType == SAHPI_INVENTORY_RDR) { idrid = rdrptr->RdrTypeUnion.InventoryRec.IdrId; rvInvent = saHpiIdrInfoGet( sessionid, l_resourceid, idrid, &idrInfo); if (rvInvent !=SA_OK) { snprintf(str, SAHPI_MAX_TEXT_BUFFER_LENGTH, "Inventory: ResourceId %d IdrId %d, error %s\n", l_resourceid, idrid, oh_lookup_error(rvInvent)); oh_append_bigtext(&buffer, str); show_rdr(&buffer); } else { snprintf(str, SAHPI_MAX_TEXT_BUFFER_LENGTH, "Inventory Idr Num: %d, ", rdrptr->RdrTypeUnion.InventoryRec.IdrId); oh_append_bigtext(&buffer, str); snprintf(str, SAHPI_MAX_TEXT_BUFFER_LENGTH, "Num Areas: %d, ", idrInfo.NumAreas); oh_append_bigtext(&buffer, str); snprintf(str, SAHPI_MAX_TEXT_BUFFER_LENGTH, "Tag: %s\n", rdrptr->IdString.Data); oh_append_bigtext(&buffer, str); show_rdr(&buffer); } } return(rvInvent); } /* * */ static SaErrorT show_sens(SaHpiSessionIdT sessionid, SaHpiRptEntryT *rptptr, SaHpiRdrT *rdrptr, SaHpiResourceIdT l_resourceid) { SaErrorT rv = SA_OK; char str[SAHPI_MAX_TEXT_BUFFER_LENGTH]; oh_big_textbuffer buffer; rv = oh_init_bigtext(&buffer); if (rdrptr->RdrType == SAHPI_SENSOR_RDR) { /* Sensor Num */ snprintf(str, SAHPI_MAX_TEXT_BUFFER_LENGTH, "Sensor Num: %d, ", rdrptr->RdrTypeUnion.SensorRec.Num); oh_append_bigtext(&buffer, str); snprintf(str, SAHPI_MAX_TEXT_BUFFER_LENGTH, "Type: %s, ", oh_lookup_sensortype(rdrptr->RdrTypeUnion.SensorRec.Type)); oh_append_bigtext(&buffer, str); snprintf(str, SAHPI_MAX_TEXT_BUFFER_LENGTH, "Category: %s, ", oh_lookup_eventcategory(rdrptr->RdrTypeUnion.SensorRec.Category)); oh_append_bigtext(&buffer, str); snprintf(str, SAHPI_MAX_TEXT_BUFFER_LENGTH, "Tag: %s\n", rdrptr->IdString.Data); oh_append_bigtext(&buffer, str); show_rdr(&buffer); } return(rv); } /* * */ static SaErrorT show_rdr(oh_big_textbuffer *buffer) { SaErrorT rv = SA_OK; oh_big_textbuffer buffer1; rv = oh_init_bigtext(&buffer1); oh_append_bigtext(&buffer1, rdr_startblock); oh_append_bigtext(&buffer1, (char *) buffer->Data); printf("%s", buffer1.Data); return(rv); } /* * */ static SaErrorT list_rdr(SaHpiSessionIdT sessionid, SaHpiRptEntryT *rptptr, SaHpiRdrT *rdrptr, SaHpiResourceIdT l_resourceid) { SaErrorT rv = SA_OK; show_inv(sessionid, rptptr, rdrptr, l_resourceid); show_sens(sessionid, rptptr, rdrptr, l_resourceid); show_ctrl(sessionid, rptptr, rdrptr, l_resourceid); show_wdog(sessionid, rptptr, rdrptr, l_resourceid); show_ann(sessionid, rptptr, rdrptr, l_resourceid); return(rv); } /* * */ static SaErrorT show_ctrl(SaHpiSessionIdT sessionid, SaHpiRptEntryT *rptptr, SaHpiRdrT *rdrptr, SaHpiResourceIdT l_resourceid) { SaErrorT rv = SA_OK; char str[SAHPI_MAX_TEXT_BUFFER_LENGTH]; oh_big_textbuffer buffer; rv = oh_init_bigtext(&buffer); if (rdrptr->RdrType == SAHPI_CTRL_RDR){ snprintf(str, SAHPI_MAX_TEXT_BUFFER_LENGTH, "Control Num: %d, ", rdrptr->RdrTypeUnion.CtrlRec.Num); oh_append_bigtext(&buffer, str); snprintf(str, SAHPI_MAX_TEXT_BUFFER_LENGTH, "Type: %s, ", oh_lookup_ctrltype(rdrptr->RdrTypeUnion.CtrlRec.Type)); oh_append_bigtext(&buffer, str); snprintf(str, SAHPI_MAX_TEXT_BUFFER_LENGTH, "Output Type: %s, ", oh_lookup_ctrloutputtype(rdrptr->RdrTypeUnion.CtrlRec.OutputType)); oh_append_bigtext(&buffer, str); snprintf(str, SAHPI_MAX_TEXT_BUFFER_LENGTH, "Tag: %s\n", rdrptr->IdString.Data); oh_append_bigtext(&buffer, str); show_rdr(&buffer); } return(rv); } /* * */ static SaErrorT show_wdog(SaHpiSessionIdT sessionid, SaHpiRptEntryT *rptptr, SaHpiRdrT *rdrptr, SaHpiResourceIdT l_resourceid) { SaErrorT rv = SA_OK; char str[SAHPI_MAX_TEXT_BUFFER_LENGTH]; oh_big_textbuffer buffer; rv = oh_init_bigtext(&buffer); if (rdrptr->RdrType == SAHPI_WATCHDOG_RDR) { snprintf(str, SAHPI_MAX_TEXT_BUFFER_LENGTH, "Watchdog Num: %d, ", rdrptr->RdrTypeUnion.WatchdogRec.WatchdogNum); oh_append_bigtext(&buffer, str); snprintf(str, SAHPI_MAX_TEXT_BUFFER_LENGTH, "Tag: %s\n", rdrptr->IdString.Data); oh_append_bigtext(&buffer, str); show_rdr(&buffer); } return(rv); } /* * */ static SaErrorT show_ann (SaHpiSessionIdT sessionid, SaHpiRptEntryT *rptptr, SaHpiRdrT *rdrptr, SaHpiResourceIdT l_resourceid) { SaErrorT rv = SA_OK; char str[SAHPI_MAX_TEXT_BUFFER_LENGTH]; oh_big_textbuffer buffer; rv = oh_init_bigtext(&buffer); if (rdrptr->RdrType == SAHPI_ANNUNCIATOR_RDR) { snprintf(str, SAHPI_MAX_TEXT_BUFFER_LENGTH, "Annunciator Num: %d, ", rdrptr->RdrTypeUnion.AnnunciatorRec.AnnunciatorNum); oh_append_bigtext(&buffer, str); snprintf(str, SAHPI_MAX_TEXT_BUFFER_LENGTH, "Type: %s, ", oh_lookup_annunciatortype(rdrptr->RdrTypeUnion.AnnunciatorRec.AnnunciatorType)); oh_append_bigtext(&buffer, str); snprintf(str, SAHPI_MAX_TEXT_BUFFER_LENGTH, "Tag: %s\n", rdrptr->IdString.Data); oh_append_bigtext(&buffer, str); show_rdr(&buffer); } return(rv); } /* end hpitop.c */ openhpi-2.14.1/clients/hpireset.c0000644000076400007640000001012611302567131013620 0ustar /* -*- linux-c -*- * * Copyright (c) 2003 by Intel Corp. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Andy Cress * Changes: * 10/13/2004 kouzmich porting to HPI B */ #include #include #include #include #include #define OH_SVN_REV "$Revision: 6571 $" #define uchar unsigned char char fdebug = 0; static void Usage(char *pname) { printf("Usage: %s [-r -d -x]\n", pname); printf(" where -r hard Resets the system\n"); printf(" -d powers Down the system\n"); printf(" -c power Cycles the system\n"); printf(" -n sends NMI to the system\n"); printf(" -o soft-shutdown OS\n"); printf(" -s reboots to Service Partition\n"); printf(" -x show eXtra debug messages\n"); } int main(int argc, char **argv) { int c; int is_reset = 0; SaErrorT rv; SaHpiSessionIdT sessionid; SaHpiDomainInfoT domainInfo; SaHpiRptEntryT rptentry; SaHpiEntryIdT rptentryid; SaHpiEntryIdT nextrptentryid; SaHpiEntryIdT entryid; SaHpiResourceIdT resourceid; SaHpiResetActionT action = -1; uchar breset; uchar bopt; uchar fshutdown = 0; oh_prog_version(argv[0], OH_SVN_REV); breset = 3; /* hard reset as default */ bopt = 0; /* Boot Options default */ while ( (c = getopt( argc, argv,"rdwconsx?")) != EOF ) switch(c) { case 'd': breset = 0; break; /* power down */ case 'r': breset = 3; action = SAHPI_COLD_RESET; break; /* hard reset */ case 'w': action = SAHPI_WARM_RESET; break; case 'x': fdebug = 1; break; /* debug messages */ case 'c': breset = 2; break; /* power cycle */ case 'o': fshutdown = 1; break; /* shutdown OS */ case 'n': breset = 4; break; /* interrupt (NMI) */ case 's': bopt = 1; break; /* hard reset to svc part */ default: Usage(argv[0]); exit(1); } if (fshutdown) breset = 5; /* soft shutdown option */ rv = saHpiSessionOpen(SAHPI_UNSPECIFIED_DOMAIN_ID, &sessionid, NULL); if (rv != SA_OK) { if (rv == SA_ERR_HPI_ERROR) printf("saHpiSessionOpen: error %d, SpiLibd not running\n",rv); else printf("saHpiSessionOpen error %d\n",rv); exit(-1); } rv = saHpiDiscover(sessionid); if (fdebug) printf("saHpiDiscover rv = %d\n",rv); rv = saHpiDomainInfoGet(sessionid, &domainInfo); if (fdebug) printf("saHpiDomainInfoGet rv = %d\n",rv); printf("RptInfo: UpdateCount = %x, UpdateTime = %lx\n", domainInfo.RptUpdateCount, (unsigned long)domainInfo.RptUpdateTimestamp); /* walk the RPT list */ rptentryid = SAHPI_FIRST_ENTRY; while ((rv == SA_OK) && (rptentryid != SAHPI_LAST_ENTRY)) { SaErrorT rv1; rv = saHpiRptEntryGet(sessionid,rptentryid,&nextrptentryid,&rptentry); if (rv != SA_OK) printf("saHpiRptEntryGet: rv = %d\n",rv); if (rv == SA_OK) { /* walk the RDR list for this RPT entry */ entryid = SAHPI_FIRST_ENTRY; resourceid = rptentry.ResourceId; rptentry.ResourceTag.Data[rptentry.ResourceTag.DataLength] = 0; printf("rptentry[%d] resourceid=%d tag: %s\n", entryid,resourceid, rptentry.ResourceTag.Data); if (rptentry.ResourceCapabilities & SAHPI_CAPABILITY_RESET) { is_reset = 1; rv1 = saHpiResourceResetStateSet(sessionid, resourceid, action); //resourceid, SAHPI_POWER_OFF); printf("ResetStateSet status = %d...requested %d\n",rv1, action); } } rptentryid = nextrptentryid; } rv = saHpiSessionClose(sessionid); if (is_reset == 0) printf("No resources with Reset capability found\n"); return(0); } /* end hpireset.c */ openhpi-2.14.1/clients/hpievents.c0000644000076400007640000001513411302567131014006 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2003, 2004, 2007 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * Peter D Phan * Steve Sherman * Renier Morales * * 10/13/2004 kouzmich changed -t option for infinite wait * added -d option for call saHpiDiscover after saHpiSubscribe * 11/17/2004 kouzmich linux style and checking timeout error */ #include #include #include #include #include #include #include #define OH_SVN_REV "$Revision: 6620 $" #include #define HPI_NSEC_PER_SEC 1000000000LL int fdebug = 0; static void Usage(char **argv) { printf("Usage %s [-t | SAHPI_TIMEOUT_BLOCK | BLOCK] [-d] [-x]\n",argv[0]); printf(" where: -t - wait seconds for event;\n"); printf(" -t SAHPI_TIMEOUT_BLOCK or BLOCK - infinite wait\n"); printf(" -d - call saHpiDiscover() after saHpiSubscribe()\n"); printf(" -x - displays eXtra debug messages\n"); } int main(int argc, char **argv) { int c, test_fail = 0, wait = 0; char *timeout_str= (char *)NULL; int do_discover_after_subscribe = 0; SaErrorT rv; SaHpiSessionIdT sessionid; SaHpiDomainInfoT domainInfo; SaHpiRptEntryT rptentry; SaHpiEntryIdT rptentryid; SaHpiEntryIdT nextrptentryid; SaHpiResourceIdT resourceid; SaHpiEventLogInfoT info; SaHpiRdrT rdr; SaHpiTimeoutT timeout; SaHpiEventT event; memset(&rptentry, 0, sizeof(rptentry)); oh_prog_version(argv[0], OH_SVN_REV); while ( (c = getopt( argc, argv,"t:xd?")) != EOF ) { switch(c) { case 't': timeout_str = optarg; break; case 'd': do_discover_after_subscribe = 1; break; case 'x': fdebug = 1; break; default: Usage(argv); exit(1); } } if (timeout_str != (char *)NULL) { if ((strcmp(timeout_str, "SAHPI_TIMEOUT_BLOCK") == 0) || (strcmp(timeout_str, "BLOCK") == 0)) { timeout = SAHPI_TIMEOUT_BLOCK; } else { wait = atoi(timeout_str); timeout = (SaHpiTimeoutT)(wait * HPI_NSEC_PER_SEC); } } else timeout = (SaHpiTimeoutT) SAHPI_TIMEOUT_IMMEDIATE; printf("************** timeout:[%lld] ****************\n", timeout); rv = saHpiSessionOpen(SAHPI_UNSPECIFIED_DOMAIN_ID, &sessionid, NULL); if (rv != SA_OK) { if (rv == SA_ERR_HPI_ERROR) printf("saHpiSessionOpen: error %d, SpiLibd not running\n", rv); else printf("saHpiSessionOpen: %s\n", oh_lookup_error(rv)); exit(-1); } if (!do_discover_after_subscribe) { if (fdebug) printf("saHpiDiscover\n"); rv = saHpiDiscover(sessionid); if (rv != SA_OK) { printf("saHpiDiscover: %s\n", oh_lookup_error(rv)); exit(-1); } } if (fdebug) printf( "Subscribe to events\n"); rv = saHpiSubscribe( sessionid ); if (rv != SA_OK) { printf("saHpiSubscribe: %s\n", oh_lookup_error(rv)); exit(-1); } if (do_discover_after_subscribe) { if (fdebug) printf("saHpiDiscover after saHpiSubscribe\n"); rv = saHpiDiscover(sessionid); if (rv != SA_OK) { printf("saHpiDiscover after saHpiSubscribe: %s\n", oh_lookup_error(rv)); exit(-1); } } rv = saHpiDomainInfoGet(sessionid, &domainInfo); if (fdebug) printf("saHpiDomainInfoGet %s\n", oh_lookup_error(rv)); printf("DomainInfo: UpdateCount = %d, UpdateTime = %lx\n", domainInfo.RptUpdateCount, (unsigned long)domainInfo.RptUpdateTimestamp); /* walk the RPT list */ rptentryid = SAHPI_FIRST_ENTRY; while ((rv == SA_OK) && (rptentryid != SAHPI_LAST_ENTRY)) { printf("**********************************************\n"); rv = saHpiRptEntryGet(sessionid, rptentryid, &nextrptentryid, &rptentry); if (fdebug) printf("saHpiRptEntryGet %s\n", oh_lookup_error(rv)); if (rv == SA_OK) { resourceid = rptentry.ResourceId; if (fdebug) printf("RPT %x capabilities = %x\n", resourceid, rptentry.ResourceCapabilities); if ( (rptentry.ResourceCapabilities & SAHPI_CAPABILITY_EVENT_LOG)) { /* Using EventLogInfo to build up event queue - for now */ rv = saHpiEventLogInfoGet(sessionid, resourceid, &info); if (fdebug) printf("saHpiEventLogInfoGet %s\n", oh_lookup_error(rv)); if (rv == SA_OK) oh_print_eventloginfo(&info, 4); } else { if (fdebug) printf("RPT doesn't have SEL\n"); } rptentry.ResourceTag.Data[rptentry.ResourceTag.DataLength] = 0; printf("rptentry[%d] tag: %s\n", resourceid, rptentry.ResourceTag.Data); rptentryid = nextrptentryid; } printf("**********************************************\n"); } printf( "Go and get the event\n"); while (1) { rdr.RdrType = SAHPI_NO_RECORD; rptentry.ResourceId = 0; rv = saHpiEventGet( sessionid, timeout, &event, &rdr, &rptentry, NULL); if (rv != SA_OK) { if (rv != SA_ERR_HPI_TIMEOUT) { printf("ERROR during EventGet : %s\n", oh_lookup_error(rv)); test_fail = 1; } else { if (timeout == SAHPI_TIMEOUT_BLOCK) { printf("ERROR: Timeout while infinite wait\n"); test_fail = 1; } else if (timeout != SAHPI_TIMEOUT_IMMEDIATE) { printf("ERROR: Time, %d seconds, expired waiting" " for event\n", wait); test_fail = 1; } } break; } else { if (rdr.RdrType != SAHPI_NO_RECORD) oh_print_event(&event, &rdr.Entity, 4); else if (rptentry.ResourceId != 0) oh_print_event(&event, &rptentry.ResourceEntity, 4); else { rptentryid = event.Source; rv = saHpiRptEntryGet(sessionid, rptentryid, &nextrptentryid, &rptentry); if(rv == SA_OK) oh_print_event(&event, &rptentry.ResourceEntity, 4); else { printf("Wrong resource Id <%d> detected", event.Source); oh_print_event(&event, NULL, 4); } } } } if (test_fail == 0) printf(" Test PASS.\n"); else printf(" Test FAILED.\n"); /* Unsubscribe to future events */ if (fdebug) printf( "Unsubscribe\n"); rv = saHpiUnsubscribe( sessionid ); rv = saHpiSessionClose(sessionid); return(0); } /* end hpigetevents.c */ openhpi-2.14.1/clients/hpipower.c0000755000076400007640000003527611302567131013652 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp. 2004-2006 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * Carl McAdams */ #include #include #include #include #include #include #include #define OH_SVN_REV "$Revision: 6605 $" #define MAX_MANAGED_SYSTEMS 80 #define HPI_POWER_DEBUG_PRINT(a) if(DebugPrints==TRUE)printf(a) typedef struct COMPUTER_DATA_ { SaHpiResourceIdT ResID; SaHpiInt32T number; //Enumeration of which computer or blade SaHpiEntityLocationT Instance; SaHpiRdrT ResDataRec; char NameStr[80];//Text Name for the computer or plade } COMPUTER_DATA; /* Prototypes */ void UsageMessage(char *ProgramName); /**************************************** * main * * Hpi Power Utility Entry point routine * * Parameters: * int - argc, * char pointer pointer - argv * Program Command line Arguments: * 'd' power down * 'p' power up * 'r' hard reset * 'u' unattended * 'b:n' Blade number * '?' useage - help * 'x' debug messages * Reserved Platform Specific for future use: * 'c' 'o' 'n' 's' ************************************************/ int main(int argc, char **argv) { SaHpiInt32T ComputerNumber; //0..n-1 SaHpiInt32T SelectedSystem; //0..n-1 SaHpiPowerStateT Action; COMPUTER_DATA *ComputerPtr; SaHpiBoolT BladeSelected; SaHpiBoolT MultipleBlades; SaHpiBoolT ActionSelected; SaHpiBoolT PrintUsage; SaHpiBoolT DebugPrints; GSList* Computer; GSList* ComputerListHead; int option; SaHpiSessionIdT SessionId; SaErrorT Status, Clean_Up_Status; SaHpiEntryIdT RptEntry, RptNextEntry; SaHpiRptEntryT Report; SaHpiInt32T Index, EntityElement; SaHpiPowerStateT PowerState; char PowerStateString[3][7]={"off\0","on\0","cycled\0"}; /* // Print out the Program name and Version */ oh_prog_version(argv[0], OH_SVN_REV); /* Set Program Defaults */ ComputerNumber = 0; SelectedSystem = 0; Action = 255; //set it out of range to stand for status BladeSelected = FALSE; MultipleBlades = FALSE; ActionSelected = FALSE; PrintUsage = FALSE; DebugPrints = FALSE; RptEntry = SAHPI_FIRST_ENTRY; /* Parse out option instructions */ while (1) { option = getopt(argc, argv, "dpruxb:"); if ((option == EOF) || (PrintUsage == TRUE)) { break; //break out of the while loop } switch (option) { case 'd': Action = SAHPI_POWER_OFF; ActionSelected = TRUE; break; case 'p': Action = SAHPI_POWER_ON; ActionSelected = TRUE; break; case 'r': Action = SAHPI_POWER_CYCLE; ActionSelected = TRUE; break; case 'u': BladeSelected = TRUE; ActionSelected = TRUE; break; case 'x': DebugPrints = TRUE; break; case 'b': if (*optarg == 0) { PrintUsage = TRUE; break; //no argument } SelectedSystem = atoi(optarg) - 1; //Normalizing to 0...n-1 if ((SelectedSystem > MAX_MANAGED_SYSTEMS) || (SelectedSystem < 0)) { //Argument is out of Range PrintUsage = TRUE; } BladeSelected = TRUE; break; default: PrintUsage = TRUE; break; } //end of switch statement } //end of argument parsing while loop if (PrintUsage == TRUE) { UsageMessage(argv[0]); exit(1); //When we exit here, there is nothing to clean up } /* Initialize the first of a list of computers */ HPI_POWER_DEBUG_PRINT("1.0 Initializing the List Structure for the computers\n"); Computer = g_slist_alloc(); ComputerListHead = Computer; HPI_POWER_DEBUG_PRINT("1.1 Allocating space for the information on each computer\n"); ComputerPtr = (COMPUTER_DATA*)malloc(sizeof(COMPUTER_DATA)); Computer->data = (gpointer)ComputerPtr; /* Initialize HPI domain and session */ HPI_POWER_DEBUG_PRINT("2.1 Initalizing HPI Session\n"); Status = saHpiSessionOpen(SAHPI_UNSPECIFIED_DOMAIN_ID, &SessionId, NULL); if (Status == SA_OK) { /* Find all of the individual systems */ // regenerate the Resource Presence Table(RPT) HPI_POWER_DEBUG_PRINT("2.2 Hpi Discovery\n"); Status = saHpiDiscover(SessionId); } else { printf("2.1 Initalizing HPI Session FAILED, code %s\n", oh_lookup_error(Status)); return -1; } HPI_POWER_DEBUG_PRINT("3.0 Walking through all of the Report Tables\n"); while ((Status == SA_OK) && (RptEntry != SAHPI_LAST_ENTRY)) { HPI_POWER_DEBUG_PRINT("@"); Status = saHpiRptEntryGet(SessionId, RptEntry, &RptNextEntry, &Report); RptEntry = RptNextEntry; // Blades will have the first Element of the Entity Path set to SBC_BLADE EntityElement = 0; HPI_POWER_DEBUG_PRINT("."); if (Report.ResourceCapabilities & SAHPI_CAPABILITY_POWER) { HPI_POWER_DEBUG_PRINT("#"); // We have found a Blade ComputerPtr->ResID = Report.ResourceId; /* enumerate this list as created */ ComputerPtr->number = ComputerNumber; ComputerNumber++; ComputerPtr->Instance = Report.ResourceEntity.Entry[EntityElement].EntityLocation; // find a Name string for this blade snprintf(ComputerPtr->NameStr, sizeof(ComputerPtr->NameStr), "%s %d", (char*)Report.ResourceTag.Data, (int) ComputerPtr->Instance); // Create a new allocation for another system ComputerPtr = (COMPUTER_DATA*)malloc(sizeof(COMPUTER_DATA)); // Add another member to the list Computer = g_slist_append(Computer,(gpointer)ComputerPtr); // set a flag that we are working with blades MultipleBlades = TRUE; } } HPI_POWER_DEBUG_PRINT("\n4.0 Generating Listing of options to choose from:\n"); /* If parsed option does not select blade and more than one is found */ if ((MultipleBlades == TRUE) && (BladeSelected == FALSE) && (Status == SA_OK)) { HPI_POWER_DEBUG_PRINT("4.1 Printing out a listing of all the blades\n"); for (Index = 0; Index < ComputerNumber; Index++) { HPI_POWER_DEBUG_PRINT("$"); // obtain the information for this computer ComputerPtr = g_slist_nth_data(ComputerListHead, Index); if (ComputerPtr == NULL) { printf("Call returned a NULL\n"); break; } // retrieve the power status for this computer HPI_POWER_DEBUG_PRINT("%%"); PowerState = 0; Status = saHpiResourcePowerStateGet(SessionId, ComputerPtr->ResID, &PowerState); if (Status != SA_OK) { printf("%s does not support PowerStateGet", ComputerPtr->NameStr); } /* Print out all of the systems */ printf("%2d) %20s - %s \n\r", (Index + 1), ComputerPtr->NameStr, PowerStateString[PowerState]); } /* Prompt user to select one */ while ((Index >= ComputerNumber) || (Index < 0)) { printf("\nEnter the number for the desired blade: "); if (scanf("%d",&Index) == 0) { printf("Incorrect number\n"); } Index--; //normalize to 0..n-1 printf("\n"); } BladeSelected = TRUE; SelectedSystem = Index; } HPI_POWER_DEBUG_PRINT("4.2 Generating Listing of Actions to choose from\n"); /* If action is not selected */ if ((ActionSelected == FALSE) && (Status == SA_OK)) { /* prompt user to select an action */ printf("\nSelect Action: 0 - Off; 1 - On; 2 - Reset; 3 - Status \n\r"); printf("Enter a number 0 to 3: "); if (scanf("%d", &Index) == 0) { Index = -1; } switch (Index) { case 0: Action = SAHPI_POWER_OFF; break; case 1: Action = SAHPI_POWER_ON; break; case 2: Action = SAHPI_POWER_CYCLE; break; default: Action = 255; //Out of Range for "Status" break; } } /* execute the command */ if (Status == SA_OK) { HPI_POWER_DEBUG_PRINT("5.0 Executing the command\n\r"); // obtain the information for this computer ComputerPtr = g_slist_nth_data(ComputerListHead, SelectedSystem); if (ComputerPtr == NULL) { printf("Error: Selected system %d was not found.\n", SelectedSystem); return -1; } if (Action <= SAHPI_POWER_CYCLE) { HPI_POWER_DEBUG_PRINT("5.1 Setting a New Power State\n\r"); // Set the new power status for this computer Status = saHpiResourcePowerStateSet(SessionId, ComputerPtr->ResID, Action); /* return status */ if (Status == SA_OK) { printf("\n%s -- %20s has been successfully powered %s\n", argv[0], ComputerPtr->NameStr, PowerStateString[Action]); } } else // Report Power status for the system { HPI_POWER_DEBUG_PRINT("5.2 Getting the Power Status\n\r"); // retrieve the power status for this computer PowerState = 0; Status = saHpiResourcePowerStateGet(SessionId, ComputerPtr->ResID, &PowerState); if (Status != SA_OK) { printf("%s does not support PowerStateGet", ComputerPtr->NameStr); } /* Print out Status for this system */ printf("%2d) %20s - %s \n\r", (ComputerPtr->number + 1), ComputerPtr->NameStr, PowerStateString[PowerState]); } } HPI_POWER_DEBUG_PRINT("6.0 Clean up"); /* clean up */ Clean_Up_Status = saHpiSessionClose(SessionId); //Free all of the Allocations for the Computer data Computer = ComputerListHead; while (Computer != NULL) { free(Computer->data); Computer = g_slist_next(Computer); } //Free the whole List g_slist_free(ComputerListHead); /* return status code and exit */ if (Status != SA_OK) { HPI_POWER_DEBUG_PRINT("7.0 Reporting Bad Status"); printf("Program %s returns with Error = %s\n", argv[0], oh_lookup_error(Status)); } return(Status); } void UsageMessage(char *ProgramName) { printf("%s usage: \n\r",ProgramName); printf("\n %s [dprubx]\n\r",ProgramName); printf(" -d power down target object \n\r"); printf(" -p power on target object \n\r"); printf(" -r reset target object \n\r"); printf(" -u unattended \n\r"); printf(" -b Specify blade (1...n) \n\r"); printf(" -x debug messages \n\r"); printf("\n"); return; } /* end hpipower.c */ openhpi-2.14.1/clients/hpifan.c0000644000076400007640000002126611302567131013251 0ustar /* -*- linux-c -*- * hpifan.cpp * * Copyright (c) 2003,2004 by FORCE Computers * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Thomas Kanngieser * * 10/13/2004 kouzmich porting to HPI B */ #include #include #include #include #include #include #include #include #define OH_SVN_REV "$Revision: 6571 $" static int fan_speed = -1; static int usage( char *progname ) { fprintf( stderr, "usage: %s [-h] [-s fan_speed_level]\n", progname ); fprintf( stderr, "\t\t -h help\n" ); fprintf( stderr, "\t\t -s speed set fan speed for ALL fans\n" ); return 1; } static void display_textbuffer( SaHpiTextBufferT string ) { int i; switch( string.DataType ) { case SAHPI_TL_TYPE_BINARY: for( i = 0; i < string.DataLength; i++ ) printf( "%x", string.Data[i] ); break; case SAHPI_TL_TYPE_BCDPLUS: for( i = 0; i < string.DataLength; i++ ) printf( "%c", string.Data[i] ); break; case SAHPI_TL_TYPE_ASCII6: for( i = 0; i < string.DataLength; i++ ) printf( "%c", string.Data[i] ); break; case SAHPI_TL_TYPE_UNICODE: for( i = 0; i < string.DataLength; i++ ) printf( "%c", string.Data[i] ); break; case SAHPI_TL_TYPE_TEXT: for( i = 0; i < string.DataLength; i++ ) printf( "%c", string.Data[i] ); break; default: printf("Invalid string data type=%d", string.DataType ); } } static SaErrorT get_fan_speed( SaHpiSessionIdT session_id, SaHpiResourceIdT resource_id, SaHpiCtrlNumT ctrl_num, SaHpiCtrlStateAnalogT *speed, SaHpiCtrlModeT *mode ) { SaHpiCtrlStateT state; SaErrorT rv = saHpiControlGet( session_id, resource_id, ctrl_num, mode, &state ); if ( rv != SA_OK ) { fprintf( stderr, "cannot get fan state: %s!\n", oh_lookup_error( rv ) ); return rv; } if ( state.Type != SAHPI_CTRL_TYPE_ANALOG ) { fprintf( stderr, "cannot handle non analog fan state !\n" ); return SA_ERR_HPI_ERROR; } *speed = state.StateUnion.Analog; return SA_OK; } static SaErrorT set_fan_speed( SaHpiSessionIdT session_id, SaHpiResourceIdT resource_id, SaHpiCtrlNumT ctrl_num, SaHpiCtrlStateAnalogT speed, SaHpiCtrlModeT mode ) { SaErrorT rv; SaHpiCtrlStateT state; state.Type = SAHPI_CTRL_TYPE_ANALOG; state.StateUnion.Analog = speed; rv = saHpiControlSet( session_id, resource_id, ctrl_num, mode, &state ); if ( rv != SA_OK ) { fprintf( stderr, "cannot set fan state: %s!\n", oh_lookup_error( rv ) ); return rv; } return SA_OK; } static int do_fan( SaHpiSessionIdT session_id, SaHpiResourceIdT resource_id, SaHpiRdrT *rdr ) { SaErrorT rv; SaHpiCtrlRecT *ctrl_rec = &rdr->RdrTypeUnion.CtrlRec; SaHpiCtrlModeT ctrl_mode; printf( "\tfan: num %d, id ", ctrl_rec->Num ); display_textbuffer( rdr->IdString ); printf( "\n" ); if ( ctrl_rec->Type != SAHPI_CTRL_TYPE_ANALOG ) { fprintf( stderr, "cannot handle non analog fan controls !\n" ); return 0; } printf( "\t\tmin %d\n", ctrl_rec->TypeUnion.Analog.Min ); printf( "\t\tmax %d\n", ctrl_rec->TypeUnion.Analog.Max ); printf( "\t\tdefault %d\n", ctrl_rec->TypeUnion.Analog.Default ); SaHpiCtrlStateAnalogT speed; rv = get_fan_speed( session_id, resource_id, ctrl_rec->Num, &speed, &ctrl_mode); if ( rv != SA_OK ) return 0; printf( "\t\tcurrent %d\n", speed ); if ( fan_speed == -1 ) return 0; if ( fan_speed < ctrl_rec->TypeUnion.Analog.Min || fan_speed > ctrl_rec->TypeUnion.Analog.Max ) { fprintf( stderr, "fan speed %d out of range [%d,%d] !\n", fan_speed, ctrl_rec->TypeUnion.Analog.Min, ctrl_rec->TypeUnion.Analog.Max ); return 0; } speed = fan_speed; rv = set_fan_speed( session_id, resource_id, ctrl_rec->Num, speed, ctrl_mode); if ( rv != SA_OK ) return 0; rv = get_fan_speed( session_id, resource_id, ctrl_rec->Num, &speed, &ctrl_mode); if ( rv != SA_OK ) return 0; printf( "\t\tnew speed %d\n", speed ); return 0; } static int discover_domain( SaHpiSessionIdT session_id ) { /* walk the RPT list */ SaErrorT rv; SaHpiEntryIdT next = SAHPI_FIRST_ENTRY; int found = 0; do { SaHpiRptEntryT entry; SaHpiEntryIdT current = next; rv = saHpiRptEntryGet( session_id, current, &next, &entry ); if ( rv != SA_OK ) { printf( "saHpiRptEntryGet: %s\n", oh_lookup_error( rv ) ); return 1; } // check for control rdr if ( !(entry.ResourceCapabilities & SAHPI_CAPABILITY_RDR) || !(entry.ResourceCapabilities & SAHPI_CAPABILITY_CONTROL) ) continue; /* walk the RDR list for this RPT entry */ SaHpiEntryIdT next_rdr = SAHPI_FIRST_ENTRY; SaHpiResourceIdT resource_id = entry.ResourceId; int epath_out = 1; do { SaHpiEntryIdT current_rdr = next_rdr; SaHpiRdrT rdr; rv = saHpiRdrGet( session_id, resource_id, current_rdr, &next_rdr, &rdr ); if ( rv != SA_OK ) { printf( "saHpiRdrGet: %s\n", oh_lookup_error( rv ) ); return 1; } // check for control if ( rdr.RdrType != SAHPI_CTRL_RDR ) continue; // check for fan if ( rdr.RdrTypeUnion.CtrlRec.OutputType != SAHPI_CTRL_FAN_SPEED ) continue; if ( epath_out ) { oh_print_ep(&entry.ResourceEntity, 0); epath_out = 0; } do_fan( session_id, resource_id, &rdr ); found++; } while( next_rdr != SAHPI_LAST_ENTRY ); } while( next != SAHPI_LAST_ENTRY ); if ( found == 0 ) printf( "no fans found.\n" ); return 0; } int main( int argc, char *argv[] ) { int c; int help = 0; SaErrorT rv; oh_prog_version(argv[0], OH_SVN_REV); while( (c = getopt( argc, argv,"hs:") ) != -1 ) switch( c ) { case 'h': help = 1; break; case 's': fan_speed = atoi( optarg ); break; default: fprintf( stderr, "unknown option %s !\n", argv[optind] ); help = 1; } if ( help ) return usage(argv[0]); SaHpiSessionIdT sessionid; rv = saHpiSessionOpen( SAHPI_UNSPECIFIED_DOMAIN_ID, &sessionid, 0 ); if ( rv != SA_OK ) { printf( "saHpiSessionOpen: %s\n", oh_lookup_error( rv ) ); return 1; } rv = saHpiDiscover( sessionid ); if ( rv != SA_OK ) { printf( "saHpiDiscover: %s\n", oh_lookup_error( rv ) ); return 1; } int rc = discover_domain( sessionid ); rv = saHpiSessionClose( sessionid ); if ( rv != SA_OK ) printf( "saHpiSessionClose: %s\n", oh_lookup_error( rv ) ); return rc; } openhpi-2.14.1/clients/hpiel.c0000644000076400007640000003063611302567131013106 0ustar /* -*- linux-c -*- * * (C) Copyright IBM Corp 2006 * * Author(s): * Renier Morales * * hpiel - Displays HPI event log entries. * */ #include #include #include #include #include #include #include #define OH_SVN_REV "$Revision: 6571 $" #define err(format, ...) \ do { \ if (opts.dbg) { \ fprintf(stderr, format "\n", ## __VA_ARGS__); \ } \ } while(0) #define show_error_quit(msg) \ do { \ if (error) { \ opts.dbg = 1; \ err(msg, oh_lookup_error(error)); \ exit(-1); \ } \ } while(0) /* Globals */ static struct hpiel_opts { int del; /* Domain Event Log option. */ char *ep; /* Resource Event Log option. */ int clear; /* Clear the event log before traversing it. */ int resource; /* Get resource along with event log entry. */ int rdr; /* Get RDR along with event log entry. */ int dbg; /* Display debug messages. */ } opts = { 0, NULL, 0, 0, 0, 0 }; /* Prototypes */ SaErrorT parse_options(int argc, char ***argv, struct hpiel_opts *opts); SaErrorT harvest_sels(SaHpiSessionIdT sid, SaHpiDomainInfoT *dinfo, char *ep); SaErrorT display_el(SaHpiSessionIdT sid, SaHpiResourceIdT rid, SaHpiTextBufferT *tag); int main(int argc, char **argv) { SaErrorT error = SA_OK; SaHpiSessionIdT sid; SaHpiDomainInfoT dinfo; /* Print version strings */ oh_prog_version(argv[0], OH_SVN_REV); /* Parsing options */ if (parse_options(argc, &argv, &opts)) { fprintf(stderr, "There was an error parsing the options. Exiting.\n"); exit(-1); } /* Program really begins here - all options parsed at this point */ error = saHpiSessionOpen(SAHPI_UNSPECIFIED_DOMAIN_ID, &sid, NULL); show_error_quit("saHpiSessionOpen() returned %s. Exiting.\n"); error = saHpiDiscover(sid); show_error_quit("saHpiDiscover() returned %s. Exiting.\n"); error = saHpiDomainInfoGet(sid, &dinfo); show_error_quit("saHpiDomainInfoGet() returned %s. Exiting.\n"); printf("Domain Info: UpdateCount = %d, UpdateTime = %lx\n", dinfo.RptUpdateCount, (unsigned long)dinfo.RptUpdateTimestamp); if (opts.ep) { /* Entity path specified */ error = harvest_sels(sid, &dinfo, opts.ep); } else if (opts.del) { /* Domain event log specified */ error = display_el(sid, SAHPI_UNSPECIFIED_RESOURCE_ID, &dinfo.DomainTag); } else { /* Else, show SELs of all supporting resources */ error = harvest_sels(sid, &dinfo, NULL); } if (error) err("An error happened. Gathering event log entries returned %s", oh_lookup_error(error)); error = saHpiSessionClose(sid); if (error) err("saHpiSessionClose() returned %s.", oh_lookup_error(error)); return error; } #define print_usage_quit() \ do { \ printf("\nUsage:\n" \ " hpiel - Displays HPI event log entries.\n\n" \ " --del, -d display domain event log entries\n" \ " --entitypath=\"\", -e \"\" display resource event log entries\n" \ " (e.g. -e \"{SYSTEM_CHASSIS,2}{SBC_BLADE,5}\")\n" \ " --clear, -c clear log before reading event log entries\n" \ " --resource, -p pull resource info along with log entry\n" \ " --rdr, -r pull RDR info along with log entry\n" \ " --xml, -x print output in xml format (not implemented)\n" \ " --verbose, -v print debug messages\n" \ " --help, -h print this usage message\n" \ "\n If neither -d or -e \"\" are specified, event log entries will be shown\n" \ " for all supporting resources by default.\n\n"); \ exit(0); \ } while(0) SaErrorT parse_options(int argc, char ***argv, struct hpiel_opts *opts) { static struct option long_options[] = { {"del", no_argument, 0, 'd'}, {"entitypath", required_argument, 0, 'e'}, {"clear", no_argument, 0, 'c'}, {"resource", no_argument, 0, 'p'}, {"rdr", no_argument, 0, 'r'}, {"verbose", no_argument, 0, 'v'}, {"help", no_argument, 0, 'h'}, {0, 0, 0, 0} }; int c, option_index = 0; while ((c = getopt_long(argc, *argv, "de:cprvh", long_options, &option_index)) != -1) { switch(c) { case 'd': opts->del = 1; break; case 'e': opts->ep = strdup(optarg); break; case 'c': opts->clear = 1; break; case 'p': opts->resource = 1; break; case 'r': opts->rdr = 1; break; case 'v': opts->dbg = 1; break; case 'h': print_usage_quit(); break; case '?': printf("extraneous option found, %d\n", optopt); break; default: printf("Found bad option %d.\n", c); return -1; } } return 0; } SaErrorT harvest_sels(SaHpiSessionIdT sid, SaHpiDomainInfoT *dinfo, char *ep) { SaErrorT error = SA_OK; SaHpiRptEntryT rptentry; SaHpiEntryIdT entryid, nextentryid; SaHpiResourceIdT rid; oh_big_textbuffer bigbuf; SaHpiEntityPathT entitypath; SaHpiBoolT found_entry = SAHPI_FALSE; if (!sid || !dinfo) { err("Invalid parameters in havest_sels()\n"); return SA_ERR_HPI_INVALID_PARAMS; } if (opts.ep && ep) { error = oh_encode_entitypath(ep, &entitypath); if (error) { err("oh_encode_entitypath() returned %s from %s\n", oh_lookup_error(error), ep); return error; } } entryid = SAHPI_FIRST_ENTRY; while (error == SA_OK && entryid != SAHPI_LAST_ENTRY) { error = saHpiRptEntryGet(sid, entryid, &nextentryid, &rptentry); err("saHpiRptEntryGet() returned %s\n", oh_lookup_error(error)); if (error == SA_OK) { if (opts.ep && ep) { if (!oh_cmp_ep(&entitypath, &rptentry.ResourceEntity)) { entryid = nextentryid; continue; } } if (!(rptentry.ResourceCapabilities & SAHPI_CAPABILITY_EVENT_LOG)) { err("RPT doesn't have SEL\n"); entryid = nextentryid; continue; /* no SEL here, try next RPT */ } found_entry = SAHPI_TRUE; rid = rptentry.ResourceId; err("RPT %d capabilities = %x\n", rid, rptentry.ResourceCapabilities); rptentry.ResourceTag.Data[rptentry.ResourceTag.DataLength] = 0; oh_init_bigtext(&bigbuf); error = oh_decode_entitypath(&rptentry.ResourceEntity, &bigbuf); printf("%s\n", bigbuf.Data); printf("rptentry[%d] tag: %s\n", rid, rptentry.ResourceTag.Data); error = display_el(sid, rid, &rptentry.ResourceTag); if (opts.ep && ep) return SA_OK; } entryid = nextentryid; } if (!found_entry) { if (opts.ep && ep) { err("Could not find resource matching %s\n", ep); } else { err("No resources supporting event logs were found.\n"); } } return error; } SaErrorT display_el(SaHpiSessionIdT sid, SaHpiResourceIdT rid, SaHpiTextBufferT *tag) { SaErrorT error = SA_OK; SaHpiEventLogEntryIdT entryid, nextentryid, preventryid; SaHpiEventLogInfoT elinfo; SaHpiEventLogEntryT elentry; SaHpiRdrT rdr; SaHpiRptEntryT res; if (!sid || !rid) { err("Invalid parameters in display_el()\n"); return SA_ERR_HPI_INVALID_PARAMS; } error = saHpiEventLogInfoGet(sid, rid, &elinfo); if (error) { err("saHpiEventLogInfoGet() returned %s. Exiting\n", oh_lookup_error(error)); return error; } printf("EventLogInfo for %s, ResourceId %d\n", tag->Data, rid); oh_print_eventloginfo(&elinfo, 4); if (elinfo.Entries == 0) { printf("%s Resource %d has an empty event log.\n", tag->Data, rid); return SA_OK; } if (opts.clear) { error = saHpiEventLogClear(sid, rid); if (error == SA_OK) printf("EventLog successfully cleared\n"); else { printf("saHpiEventLogClear() returned %s\n", oh_lookup_error(error)); return error; } } entryid = SAHPI_OLDEST_ENTRY; while (entryid != SAHPI_NO_MORE_ENTRIES) { error = saHpiEventLogEntryGet(sid, rid, entryid, &preventryid, &nextentryid, &elentry, &rdr, &res); err("saHpiEventLogEntryGet() returned %s\n", oh_lookup_error(error)); if (error == SA_OK) { SaHpiEntityPathT *ep = NULL; /* Get a reference to the entity path for this log entry */ if (res.ResourceCapabilities) { ep = &res.ResourceEntity; } else if (rdr.RdrType != SAHPI_NO_RECORD) { ep = &rdr.Entity; } /* Print the event log entry */ oh_print_eventlogentry(&elentry, ep, 6); if (opts.rdr) { if (rdr.RdrType == SAHPI_NO_RECORD) printf(" No RDR associated with EventType = %s\n\n", oh_lookup_eventtype(elentry.Event.EventType)); else oh_print_rdr(&rdr, 12); } if (opts.resource) { if (res.ResourceCapabilities == 0) printf(" No RPT associated with EventType = %s\n\n", oh_lookup_eventtype(elentry.Event.EventType)); else oh_print_rptentry(&res, 10); } preventryid = entryid; entryid = nextentryid; } else { return error; } } return SA_OK; } openhpi-2.14.1/clients/hpithres.c0000644000076400007640000003661711302567131013640 0ustar /* -*- linux-c -*- * * Copyright (c) 2003 by Intel Corp. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Bill Barkely * Andy Cress * Changes: * 02/26/04 ARCress - added general search for any Fan sensor. * 03/17/04 ARCress - changed to Temp sensor (always has Lower Major) * 11/03/2004 kouzmich porting to HPI B * 11/25/2004 kouzmich changed as new threshold client (first release) */ #include #include #include #include #include #include #include #include #define OH_SVN_REV "$Revision: 6847 $" #define READ_BUF_SIZE 1024 typedef enum { UNKNOWN_TYPE = 0, LOWER_CRIT, LOWER_MAJOR, LOWER_MINOR, UPPER_CRIT, UPPER_MAJOR, UPPER_MINOR, POS_HYST, NEG_HYST } ThresTypes_t; typedef struct { int rpt_ind; int is_value; int modify; SaHpiRdrT Rdr; SaHpiSensorReadingT reading; SaHpiSensorThresholdsT thresholds; } Rdr_t; typedef struct { SaHpiRptEntryT Rpt; int nrdrs; Rdr_t *rdrs; } Rpt_t; typedef enum { COM_UNDEF = 0, COM_EXIT, COM_HELP, COM_RPT, COM_RDR, COM_SENS, COM_MOD, COM_UNDO } Com_enum_t; typedef struct { char *command_name; Com_enum_t type; } Commands_def_t; Commands_def_t Coms[] = { { "quit", COM_EXIT }, { "q", COM_EXIT }, { "exit", COM_EXIT }, { "help", COM_HELP }, { "h", COM_HELP }, { "rpt", COM_RPT }, { "rdr", COM_RDR }, { "sen", COM_SENS }, { "mod", COM_MOD }, { "undo", COM_UNDO }, { NULL, COM_UNDEF } }; Rpt_t *Rpts; int nrpts = 0; int fdebug = 0; SaHpiSessionIdT sessionid; static void *resize_array(void *Ar, int item_size, int *last_num, int add_num) /* Resize array Ar: * item_size - item size (bytes) * last_num - current array size * add_num - new array size = last_num + add_num * Return: new pointer */ { void *R; int new_num = *last_num + add_num; if (new_num <= 0) return((void *)NULL); R = malloc(item_size * new_num); memset(R, 0, item_size * new_num); if (*last_num > 0) { memcpy(R, Ar, *last_num * item_size); free(Ar); } *last_num = new_num; return(R); } static void print_value(SaHpiSensorReadingT *item, char *mes) { char *val; if (item->IsSupported != SAHPI_TRUE) return; switch (item->Type) { case SAHPI_SENSOR_READING_TYPE_INT64: printf("%lld %s\n", item->Value.SensorInt64, mes); return; case SAHPI_SENSOR_READING_TYPE_UINT64: printf("%llu %s\n", item->Value.SensorUint64, mes); return; case SAHPI_SENSOR_READING_TYPE_FLOAT64: printf("%10.3f %s\n", item->Value.SensorFloat64, mes); return; case SAHPI_SENSOR_READING_TYPE_BUFFER: val = (char *)(item->Value.SensorBuffer); if (val != NULL) printf("%s %s\n", val, mes); return; } } static void ShowThres(SaHpiSensorThresholdsT *sensbuff) { printf(" Supported Thresholds:\n"); print_value(&(sensbuff->LowCritical), " Lower Critical Threshold(lc):"); print_value(&(sensbuff->LowMajor), " Lower Major Threshold(la):"); print_value(&(sensbuff->LowMinor), " Lower Minor Threshold(li):"); print_value(&(sensbuff->UpCritical), " Upper Critical Threshold(uc):"); print_value(&(sensbuff->UpMajor), " Upper Major Threshold(ua):"); print_value(&(sensbuff->UpMinor), " Upper Minor Threshold(ui):"); print_value(&(sensbuff->PosThdHysteresis), " Positive Threshold Hysteresis(ph):"); print_value(&(sensbuff->NegThdHysteresis), " Negative Threshold Hysteresis(nh):"); printf("\n"); } static void show_rpt(Rpt_t *Rpt, int ind) { printf("%3d RPT: id = %3d ResourceId = %3d Tag = %s\n", ind, Rpt->Rpt.EntryId, Rpt->Rpt.ResourceId, Rpt->Rpt.ResourceTag.Data); } static int find_rpt_by_id(SaHpiEntryIdT id) { int i; for (i = 0; i < nrpts; i++) if (Rpts[i].Rpt.EntryId == id) return(i); return(-1); } static void show_rpts(char *S) { int i, rpt; i = sscanf(S, "%d", &rpt); if (i == 1) { i = find_rpt_by_id(rpt); if (i >= 0) oh_print_rptentry(&(Rpts[i].Rpt), 1); else printf("No RPT for id: %d\n", rpt); return; } for (i = 0; i < nrpts; i++) show_rpt(Rpts + i, i); } static int find_rdr_by_id(Rpt_t *R, SaHpiEntryIdT id) { int i; for (i = 0; i < R->nrdrs; i++) if (R->rdrs[i].Rdr.RecordId == id) return(i); return(-1); } static void show_rdr(Rdr_t *Rdr, int ind) { printf(" %3d RDR: id = %3d Data = %s\n", ind, Rdr->Rdr.RecordId, Rdr->Rdr.IdString.Data); } static void show_sen(Rdr_t *Rdr, int rptid) { if (Rdr->Rdr.RdrType != SAHPI_SENSOR_RDR) return; printf(" RPT id = %3d RDR id = %3d sensornum = %3d Data = %s\n", rptid, Rdr->Rdr.RecordId, Rdr->Rdr.RdrTypeUnion.SensorRec.Num, Rdr->Rdr.IdString.Data); } static void show_sens_for_rpt(Rpt_t *R) { int j; for (j = 0; j < R->nrdrs; j++) { show_sen(R->rdrs + j, R->Rpt.EntryId); } } static void show_rdrs_for_rpt(Rpt_t *R) { int j; for (j = 0; j < R->nrdrs; j++) { show_rdr(R->rdrs + j, j); } } static void show_rdrs(char *S) { int i, j, rpt, rdr; Rpt_t *R; i = sscanf(S, "%d %d", &rpt, &rdr); if (i == 1) { i = find_rpt_by_id(rpt); if (i >= 0) { show_rpt(Rpts + i, i); show_rdrs_for_rpt(Rpts + i); } else printf("No RPT for id: %d\n", rpt); return; } if (i == 2) { i = find_rpt_by_id(rpt); if (i >= 0) { j = find_rdr_by_id(Rpts + i, rdr); if (j >= 0) oh_print_rdr(&(Rpts[i].rdrs[j].Rdr), 2); else printf("No RDR %d for rpt %d\n", rdr, rpt); } else printf("No RPT for id: %d\n", rpt); return; } for (i = 0, R = Rpts; i < nrpts; i++, R++) { show_rpt(R, i); show_rdrs_for_rpt(R); } } static void show_reading_value(Rpt_t *Rpt, Rdr_t *R) { SaHpiSensorUnitsT k; SaErrorT rv; char unit[128]; rv = saHpiSensorReadingGet(sessionid, Rpt->Rpt.ResourceId, R->Rdr.RdrTypeUnion.SensorRec.Num, &(R->reading), NULL); if (rv != SA_OK) { printf("ERROR: %s\n", oh_lookup_error(rv)); return; }; k = R->Rdr.RdrTypeUnion.SensorRec.DataFormat.BaseUnits; printf("Reading value: "); snprintf(unit, 128, "%s", oh_lookup_sensorunits(k)); print_value(&(R->reading), unit); } static void show_thresholds(Rpt_t *Rpt, Rdr_t *R) { SaHpiSensorThresholdsT buf; SaErrorT rv; rv = saHpiSensorThresholdsGet(sessionid, Rpt->Rpt.ResourceId, R->Rdr.RdrTypeUnion.SensorRec.Num, &buf); if (rv != SA_OK) { printf("ERROR: %s\n", oh_lookup_error(rv)); return; }; printf(" Thresholds:\n"); ShowThres(&buf); if (R->is_value == 0) { R->thresholds = buf; R->is_value = 1; } } static int find_sensor_by_num(Rpt_t *R, int num) { int i; for (i = 0; i < R->nrdrs; i++) { if (R->rdrs[i].Rdr.RdrType == SAHPI_SENSOR_RDR) { if (R->rdrs[i].Rdr.RdrTypeUnion.SensorRec.Num == num) return(i); } }; return(-1); } static void show_sens(char *S) { int i, j, rpt, num; Rpt_t *Rpt; Rdr_t *Rdr; i = sscanf(S, "%d %d", &rpt, &num); if (i == 1) { i = find_rpt_by_id(rpt); if (i >= 0) show_sens_for_rpt(Rpts + i); return; } if (i == 2) { i = find_rpt_by_id(rpt); if (i < 0) { printf("No RPT for id: %d\n", rpt); return; }; j = find_sensor_by_num(Rpts + i, num); if (j < 0) { printf("No sensor %d for rpt %d\n", num, rpt); return; }; oh_print_rdr(&(Rpts[i].rdrs[j].Rdr), 2); show_reading_value(Rpts + i, Rpts[i].rdrs + j); show_thresholds(Rpts + i, Rpts[i].rdrs + j); return; } for (i = 0, Rpt = Rpts; i < nrpts; i++, Rpt++) { for (j = 0, Rdr = Rpt->rdrs; j < Rpt->nrdrs; Rdr++, j++) show_sen(Rdr, Rpt->Rpt.EntryId); } } static int get_number(char *mes, int *res) { char buf[READ_BUF_SIZE]; char *ret; printf("%s", mes); ret = fgets(buf, READ_BUF_SIZE, stdin); return (sscanf(buf, "%d", res)); } static void set_thres_value(SaHpiSensorReadingT *R, double val) { if (R->IsSupported == 0) { printf("ERROR: this threshold isn't supported\n"); return; }; R->Value.SensorFloat64 = val; } static void mod_sen(void) { int i, rpt, rdr, num; char buf[READ_BUF_SIZE], *S; Rpt_t *Rpt; Rdr_t *Rdr; SaHpiSensorThresholdsT thres; SaErrorT rv; ThresTypes_t type = UNKNOWN_TYPE; float f; SaHpiEventT event; i = get_number("RPT number: ", &rpt); if (i != 1) { printf("ERROR: no RPT number\n"); return; }; i = find_rpt_by_id(rpt); if (i < 0) { printf("ERROR: invalid RPT number\n"); return; }; rpt = i; Rpt = Rpts + rpt; show_sens_for_rpt(Rpt); i = get_number("Sensor number: ", &num); if (i != 1) { printf("ERROR: no Sensor number\n"); return; }; rdr = find_sensor_by_num(Rpt, num); if (rdr < 0) { printf("ERROR: invalid sensor number\n"); return; }; Rdr = Rpt->rdrs + rdr; oh_print_rdr(&(Rdr->Rdr), 2); show_reading_value(Rpt, Rdr); rv = saHpiSensorThresholdsGet(sessionid, Rpt->Rpt.ResourceId, Rdr->Rdr.RdrTypeUnion.SensorRec.Num, &thres); if (rv != SA_OK) { printf("ERROR: %s\n", oh_lookup_error(rv)); return; }; printf(" Thresholds:\n"); ShowThres(&thres); if (Rdr->is_value == 0) { Rdr->thresholds = thres; Rdr->is_value = 1; }; printf("threshold type (lc, la, li, uc, ua, ui, ph, nh): "); S = fgets(buf, READ_BUF_SIZE, stdin); while (*S == ' ') S++; if (strlen(S) < 2) { printf("ERROR: invalid threshold type: %s\n", S); return; }; if (strncmp(S, "lc", 2) == 0) type = LOWER_CRIT; if (strncmp(S, "la", 2) == 0) type = LOWER_MAJOR; if (strncmp(S, "li", 2) == 0) type = LOWER_MINOR; if (strncmp(S, "uc", 2) == 0) type = UPPER_CRIT; if (strncmp(S, "ua", 2) == 0) type = UPPER_MAJOR; if (strncmp(S, "ui", 2) == 0) type = UPPER_MINOR; if (strncmp(S, "ph", 2) == 0) type = POS_HYST; if (strncmp(S, "nh", 2) == 0) type = NEG_HYST; if (type == UNKNOWN_TYPE) { printf("ERROR: unknown threshold type: %s\n", S); return; }; printf("new value: "); S = fgets(buf, READ_BUF_SIZE, stdin); i = sscanf(buf, "%f", &f); if (i == 0) { printf("ERROR: no value\n"); return; }; switch (type) { case LOWER_CRIT: set_thres_value(&(thres.LowCritical), (double)f); break; case LOWER_MAJOR: set_thres_value(&(thres.LowMajor), (double)f); break; case LOWER_MINOR: set_thres_value(&(thres.LowMinor), (double)f); break; case UPPER_CRIT: set_thres_value(&(thres.UpCritical), (double)f); break; case UPPER_MAJOR: set_thres_value(&(thres.UpMajor), (double)f); break; case UPPER_MINOR: set_thres_value(&(thres.UpMinor), (double)f); break; case POS_HYST: set_thres_value(&(thres.PosThdHysteresis), (double)f); break; case NEG_HYST: set_thres_value(&(thres.NegThdHysteresis), (double)f); break; default: printf("ERROR: unknown threshold\n"); }; printf("\n Nem threshold:\n"); ShowThres(&thres); printf("Is it correct (yes, no)?:"); S = fgets(buf, READ_BUF_SIZE, stdin); while (*S == ' ') S++; if (strncmp(S, "yes", 3) != 0) return; rv = saHpiSensorThresholdsSet(sessionid, Rpt->Rpt.ResourceId, Rdr->Rdr.RdrTypeUnion.SensorRec.Num, &thres); if (rv != SA_OK) { printf("ERROR: saHpiSensorThresholdsSet: %s\n", oh_lookup_error(rv)); return; }; Rdr->modify = 1; for (i = 0; i < 10; i++) { rv = saHpiEventGet(sessionid, SAHPI_TIMEOUT_IMMEDIATE, &event, NULL, NULL, NULL); if (rv == SA_OK) break; if (fdebug) printf("sleep before saHpiEventGet\n"); sleep(1); }; saHpiSensorThresholdsGet(sessionid, Rpt->Rpt.ResourceId, Rdr->Rdr.RdrTypeUnion.SensorRec.Num, &thres); printf("Current thresholds:\n"); ShowThres(&thres); } static void undo(void) { int i, j; Rpt_t *Rpt; Rdr_t *Rdr; for (i = 0, Rpt = Rpts; i < nrpts; i++, Rpt++) { for (j = 0, Rdr = Rpt->rdrs; j < Rpt->nrdrs; j++, Rdr++) { if (Rdr->modify == 0) continue; saHpiSensorThresholdsSet(sessionid, Rpt->Rpt.ResourceId, Rdr->Rdr.RdrTypeUnion.SensorRec.Num, &(Rdr->thresholds)); Rdr->modify = 0; } } } static void get_rpts(void) { SaHpiEntryIdT rptentryid, nextrptentryid; SaErrorT rv; SaHpiRptEntryT rptentry; int n; rptentryid = SAHPI_FIRST_ENTRY; while (rptentryid != SAHPI_LAST_ENTRY) { rv = saHpiRptEntryGet(sessionid, rptentryid, &nextrptentryid, &rptentry); if (rv != SA_OK) break; n = nrpts; Rpts = (Rpt_t *)resize_array(Rpts, sizeof(Rpt_t), &nrpts, 1); rptentry.ResourceTag.Data[rptentry.ResourceTag.DataLength] = 0; Rpts[n].Rpt = rptentry; rptentryid = nextrptentryid; } } static void get_rdrs(Rpt_t *Rpt) { SaHpiRdrT rdr; SaErrorT rv; int n; SaHpiEntryIdT entryid; SaHpiEntryIdT nextentryid; SaHpiResourceIdT resourceid; entryid = SAHPI_FIRST_ENTRY; while (entryid !=SAHPI_LAST_ENTRY) { resourceid = Rpt->Rpt.ResourceId; rv = saHpiRdrGet(sessionid, resourceid, entryid, &nextentryid, &rdr); if (rv != SA_OK) break; n = Rpt->nrdrs; Rpt->rdrs = (Rdr_t *)resize_array(Rpt->rdrs, sizeof(Rdr_t), &(Rpt->nrdrs), 1); rdr.IdString.Data[rdr.IdString.DataLength] = 0; Rpt->rdrs[n].Rdr = rdr; entryid = nextentryid; } } static void help(void) { printf("Available commands:\n"); printf(" exit, quit, q - exit\n"); printf(" help, h - this instruction\n"); printf(" rpt - show all RPT entries\n"); printf(" rpt - show #id RPT entry\n"); printf(" rdr - show all RDR entries\n"); printf(" rdr - show RDRs entries for #rptid\n"); printf(" rdr - show #rdrid RDR entry for #rptid\n"); printf(" sen - show all sensors\n"); printf(" sen - show sensors for #rptid\n"); printf(" sen - show #num sensor for #rptid\n"); printf(" mod - modify thresholds\n"); printf(" undo - delete all changes\n"); } static Com_enum_t find_command(char *S) { int i; for (i = 0;; i++) { if (Coms[i].command_name == (char *)NULL) return(COM_UNDEF); if (strcmp(Coms[i].command_name, S) == 0) return(Coms[i].type); } } static int parse_command(char *Str) { int len; char *S, *S1; Com_enum_t com; S = Str; while (*S != 0) { if ((*S == '\t') || (*S == '\n')) *S = ' '; S++; }; S = Str; while (*S == ' ') S++; len = strlen(S); if (len == 0) return(0); S1 = S; while ((*S1 != 0) && (*S1 != ' ')) S1++; if (*S1 != 0) *S1++ = 0; com = find_command(S); switch (com) { case COM_UNDEF: printf("Invalid command: %s\n", S); help(); break; case COM_EXIT: return(-1); case COM_RPT: show_rpts(S1); break; case COM_RDR: show_rdrs(S1); break; case COM_SENS: show_sens(S1); break; case COM_MOD: mod_sen(); break; case COM_UNDO: undo(); break; case COM_HELP: help(); break; }; return(0); } int main(int argc, char **argv) { int c, i; SaErrorT rv; char buf[READ_BUF_SIZE]; char *S; oh_prog_version(argv[0], OH_SVN_REV); while ( (c = getopt( argc, argv,"x?")) != EOF ) switch(c) { case 'x': fdebug = 1; break; default: printf("Usage: %s [-x]\n", argv[0]); printf(" -x Display debug messages\n"); return(1); } rv = saHpiSessionOpen(SAHPI_UNSPECIFIED_DOMAIN_ID, &sessionid, NULL); if (rv != SA_OK) { printf("saHpiSessionOpen: %s\n", oh_lookup_error(rv)); return(-1); } rv = saHpiDiscover(sessionid); if (fdebug) printf("saHpiDiscover: %s\n", oh_lookup_error(rv)); rv = saHpiSubscribe(sessionid); if (rv != SA_OK) { printf( "saHpiSubscribe error %d\n",rv); return(-1); } /* make the RPT list */ get_rpts(); /* get rdrs for the RPT list */ for (i = 0; i < nrpts; i++) get_rdrs(Rpts + i); help(); for (;;) { printf("==> "); S = fgets(buf, READ_BUF_SIZE, stdin); if (parse_command(S) < 0) break; }; rv = saHpiSessionClose(sessionid); return(0); } /* end hpthres.c */ openhpi-2.14.1/clients/hpisensor.c0000644000076400007640000003437011302567131014016 0ustar /* -*- linux-c -*- * * Copyright (c) 2003 by Intel Corp. * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * Andy Cress * Renier Morales * * ChangeLog: * 09/08/04 pdphan@users.sf.net Add sensor number to the display. * 01/06/05 arcress reduce number of display lines per sensor */ #include #include #include #include #include #include #include #define OH_SVN_REV "$Revision: 6571 $" int fdebug = 0; int fshowthr = 0; int fshowrange = 0; int fshowstate = 0; static void ShowSensor(SaHpiSessionIdT sessionid, SaHpiResourceIdT resourceid, SaHpiSensorRecT *sensorrec ) { SaHpiSensorNumT sensornum; SaHpiSensorReadingT reading; SaHpiSensorThresholdsT thresh; SaHpiEventStateT events; SaHpiTextBufferT text; SaErrorT rv; sensornum = sensorrec->Num; rv = saHpiSensorReadingGet(sessionid,resourceid, sensornum, &reading, &events); if (rv != SA_OK) { printf("ReadingGet ret=%s\n", oh_lookup_error(rv)); return; } if (reading.IsSupported ) { if((rv = oh_decode_sensorreading(reading, sensorrec->DataFormat, &text)) == SA_OK) { printf("= %s\n", text.Data); } else { printf("= FAILED, %s\n", oh_lookup_error(rv)); } } else { printf("\n Sensor reading is not supported\n"); } if (fshowstate) { if ((rv = oh_decode_eventstate(events, sensorrec->Category, &text)) == SA_OK) { printf(" Current Sensor State = %s\n", text.Data); } else { printf(" Can not decode Sensor EventState value %d\n", (int) events); } } if (fshowrange) { // show ranges printf("\t Ranges::\n"); if ( sensorrec->DataFormat.Range.Flags & SAHPI_SRF_NOMINAL ) { if((rv = oh_decode_sensorreading(sensorrec->DataFormat.Range.Nominal, sensorrec->DataFormat, &text)) == SA_OK) { printf( "\t\tNominal of Range: %s\n", text.Data); } else { printf( "\t\tNominal of Range: FAILED %s\n", oh_lookup_error(rv)); } } if ( sensorrec->DataFormat.Range.Flags & SAHPI_SRF_MAX ) { if((rv = oh_decode_sensorreading(sensorrec->DataFormat.Range.Max, sensorrec->DataFormat, &text)) == SA_OK) { printf( "\t\tMax of Range: %s\n", text.Data); } else { printf( "\t\tMax of Range: FAILED %s\n", oh_lookup_error(rv)); } } if ( sensorrec->DataFormat.Range.Flags & SAHPI_SRF_MIN ) { if((rv = oh_decode_sensorreading(sensorrec->DataFormat.Range.Min, sensorrec->DataFormat, &text)) == SA_OK) { printf( "\t\tMin of Range: %s\n", text.Data); } else { printf( "\t\tMin of Range: FAILED %s\n", oh_lookup_error(rv)); } } if ( sensorrec->DataFormat.Range.Flags & SAHPI_SRF_NORMAL_MAX ) { if((rv = oh_decode_sensorreading(sensorrec->DataFormat.Range.NormalMax, sensorrec->DataFormat, &text)) == SA_OK) { printf( "\t\tNormal Max of Range: %s\n", text.Data); } else { printf( "\t\tNormal Max of Range: FAILED %s\n", oh_lookup_error(rv)); } } if ( sensorrec->DataFormat.Range.Flags & SAHPI_SRF_NORMAL_MIN ) { if((rv = oh_decode_sensorreading(sensorrec->DataFormat.Range.NormalMin, sensorrec->DataFormat, &text)) == SA_OK) { printf( "\t\tNormal Min of Range: %s\n", text.Data); } else { printf( "\t\tNormal Min of Range: FAILED %s\n", oh_lookup_error(rv)); } } } if(fshowthr) { // show thresholds rv = saHpiSensorThresholdsGet(sessionid,resourceid, sensornum, &thresh); if (rv != SA_OK) { printf("\t ThresholdsGet ret=%s\n", oh_lookup_error(rv)); return; } printf( "\t Thresholds::\n" ); if (thresh.LowCritical.IsSupported) { if((rv = oh_decode_sensorreading(thresh.LowCritical, sensorrec->DataFormat, &text)) == SA_OK) { printf( "\t\tLow Critical Threshold: %s\n", text.Data); } else { printf( "\t\tLow Critical Threshold: FAILED %s\n", oh_lookup_error(rv)); } } if (thresh.LowMajor.IsSupported) { if((rv = oh_decode_sensorreading(thresh.LowMajor, sensorrec->DataFormat, &text)) == SA_OK) { printf( "\t\tLow Major Threshold: %s\n", text.Data); } else { printf( "\t\tLow Major Threshold: FAILED %s\n", oh_lookup_error(rv)); } } if (thresh.LowMinor.IsSupported) { if((rv = oh_decode_sensorreading(thresh.LowMinor, sensorrec->DataFormat, &text)) == SA_OK) { printf( "\t\tLow Minor Threshold: %s\n", text.Data); } else { printf( "\t\tLow Minor Threshold: FAILED %s\n", oh_lookup_error(rv)); } } if (thresh.UpCritical.IsSupported) { if((rv = oh_decode_sensorreading(thresh.UpCritical, sensorrec->DataFormat, &text)) == SA_OK) { printf( "\t\tUp Critical Threshold: %s\n", text.Data); } else { printf( "\t\tUp Critical Threshold: FAILED %s\n", oh_lookup_error(rv)); } } if (thresh.UpMajor.IsSupported) { if((rv = oh_decode_sensorreading(thresh.UpMajor, sensorrec->DataFormat, &text)) == SA_OK) { printf( "\t\tUp Major Threshold: %s\n", text.Data); } else { printf( "\t\tUp Major Threshold: FAILED %s\n", oh_lookup_error(rv)); } } if (thresh.UpMinor.IsSupported) { if((rv = oh_decode_sensorreading(thresh.UpMinor, sensorrec->DataFormat, &text)) == SA_OK) { printf( "\t\tUp Minor Threshold: %s\n", text.Data); } else { printf( "\t\tUp Minor Threshold: FAILED %s\n", oh_lookup_error(rv)); } } if (thresh.PosThdHysteresis.IsSupported) { if((rv = oh_decode_sensorreading(thresh.PosThdHysteresis, sensorrec->DataFormat, &text)) == SA_OK) { printf( "\t\tPos Threshold Hysteresis: %s\n", text.Data); } else { printf( "\t\tPos Threshold Hysteresis: FAILED %s\n", oh_lookup_error(rv)); } } if (thresh.NegThdHysteresis.IsSupported) { if((rv = oh_decode_sensorreading(thresh.NegThdHysteresis, sensorrec->DataFormat, &text)) == SA_OK) { printf( "\t\tNeg Threshold Hysteresis: %s\n", text.Data); } else { printf( "\t\tNeg Threshold Hysteresis: FAILED %s\n", oh_lookup_error(rv)); } } } /* if extra lines, double-space output */ if (fshowthr || fshowrange) printf("\n"); return; } int main(int argc, char **argv) { int c; char *ep_string = NULL; SaErrorT rv; SaHpiDomainInfoT dinfo; SaHpiSessionIdT sessionid; SaHpiRptEntryT rptentry; SaHpiEntryIdT rptentryid; SaHpiEntryIdT nextrptentryid; SaHpiEntryIdT entryid; SaHpiEntryIdT nextentryid; SaHpiResourceIdT resourceid; SaHpiRdrT rdr; SaHpiEntityPathT ep_target; oh_prog_version(argv[0], OH_SVN_REV); while ( (c = getopt( argc, argv,"rtse:x?")) != EOF ) switch(c) { case 't': fshowthr = 1; break; case 'r': fshowrange = 1; break; case 's': fshowstate = 1; break; case 'x': fdebug = 1; break; case 'e': if (optarg) { ep_string = (char *)strdup(optarg); } oh_encode_entitypath(ep_string, &ep_target); break; default: printf("Usage %s [-t -r -x -e]\n", argv[0]); printf("where -t = show Thresholds also\n"); printf(" -r = show Range values also\n"); printf(" -s = show EventState also\n"); printf(" -e entity path = limit to a single entity\n"); printf(" -x = show eXtra debug messages\n"); exit(1); } rv = saHpiSessionOpen(SAHPI_UNSPECIFIED_DOMAIN_ID,&sessionid,NULL); if (rv != SA_OK) { printf("saHpiSessionOpen: %s", oh_lookup_error(rv)); exit(-1); } if (fdebug) printf("Starting Discovery ...\n"); rv = saHpiDiscover(sessionid); if (fdebug) printf("saHpiResourcesDiscover %s\n", oh_lookup_error(rv)); rv = saHpiDomainInfoGet(sessionid,&dinfo); if (fdebug) printf("saHpiDomainInfoGet %s\n", oh_lookup_error(rv)); printf("RptInfo: UpdateCount = %d, UpdateTime = %lx\n", dinfo.RptUpdateCount, (unsigned long)dinfo.RptUpdateTimestamp); /* walk the RPT list */ rptentryid = SAHPI_FIRST_ENTRY; while ((rv == SA_OK) && (rptentryid != SAHPI_LAST_ENTRY)) { rv = saHpiRptEntryGet(sessionid,rptentryid,&nextrptentryid,&rptentry); if (fdebug) printf("saHpiRptEntryGet %s\n", oh_lookup_error(rv)); if (rv == SA_OK) { /* Walk the RDR list for this RPT entry */ /* Filter by entity path if specified */ if (ep_string && !oh_cmp_ep(&ep_target,&(rptentry.ResourceEntity))) { rptentryid = nextrptentryid; continue; } entryid = SAHPI_FIRST_ENTRY; resourceid = rptentry.ResourceId; rptentry.ResourceTag.Data[rptentry.ResourceTag.DataLength] = 0; printf("\nRPTEntry[%d] tag: %s\n", resourceid,rptentry.ResourceTag.Data); oh_print_ep(&rptentry.ResourceEntity, 0); while ((rv == SA_OK) && (entryid != SAHPI_LAST_ENTRY)) { rv = saHpiRdrGet(sessionid,resourceid, entryid,&nextentryid, &rdr); if (fdebug) printf("saHpiRdrGet[%d] rv = %d\n",entryid,rv); if (rv == SA_OK) { rdr.IdString.Data[rdr.IdString.DataLength] = 0; if (rdr.RdrType == SAHPI_SENSOR_RDR) { printf(" RDR[%6d]: Sensor[%3d] %s \t", rdr.RecordId, rdr.RdrTypeUnion.SensorRec.Num, rdr.IdString.Data); ShowSensor(sessionid,resourceid, &rdr.RdrTypeUnion.SensorRec); } else { printf(" RDR[%6d]: %s %s\n", rdr.RecordId, oh_lookup_rdrtype(rdr.RdrType), rdr.IdString.Data); } entryid = nextentryid; } else { rv = SA_OK; entryid = SAHPI_LAST_ENTRY; } } rptentryid = nextrptentryid; } } rv = saHpiSessionClose(sessionid); exit(0); return(0); } /* end hpisensor.c */ openhpi-2.14.1/clients/hpionIBMblade.c0000644000076400007640000005706311302567131014445 0ustar /* -*- linux-c -*- * * Copyright (c) 2003 by Intel Corp. * 2006 by IBM Corp. * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Description: * This client application shows how two (2) openhpi plugins can be used to display * and manage resources of an IBM Blade with Basedboard Management Controller (BMC). * * Both the ipmi and snmp_bc plugin have the same IBM Blade target. Resources from * both plugins are combined to show a complete view of the IBM Blade. * * @@ WARNING @@ RESTRICTIONS @@ WARNING @@ RESTRICTIONS @@ WARNING @@ RESTRICTIONS @@ * * - This client application is designed to run **only** on an IBM Blade with Basedboard * Management Controller (BMC) * * - This Openhpi and application run on (inband) an IBM Blade. * * - Version 0.1 of the application only functions correctly in non-daemon Openhpi env * Openhpi configure parms: ./configure --disabled-daemon --enable-ipmi --enable-snmp_bc * * - openhpi.conf file for this application should look similar to the following * plugin libipmi * * handler libipmi { * entity_root = "{SYSTEM_CHASSIS,2}" * name = "smi" * addr = 0 * } * * plugin libsnmp_bc * * handler libsnmp_bc { * host = "bc.mm.ip.address" * version = "3" * community = "bc_community" * entity_root = "{SYSTEM_CHASSIS,1}" * security_name = "myid" * passphrase = "mypassword" * security_level = "authNoPriv" * auth_type = "MD5" * } * * * @@ WARNING @@ RESTRICTIONS @@ WARNING @@ RESTRICTIONS @@ WARNING @@ RESTRICTIONS @@ * * Authors: * 11/25/2004 kouzmich Changed as new threshold client (first release) * Changes: * 10/13/2006 pdphan Copy from kouzmich's hpithres.c to hpionIBMblade.c * Add functions specifically for * an IBM blade with Baseboard Management Controller (BMC) */ #include #include #include #include #include #include #include #include #include #include #define OH_SVN_REV "$Revision: 6412 $" #define READ_BUF_SIZE 1024 #define MAX_BYTE_COUNT 128 typedef enum { UNKNOWN_TYPE = 0, LOWER_CRIT, LOWER_MAJOR, LOWER_MINOR, UPPER_CRIT, UPPER_MAJOR, UPPER_MINOR, POS_HYST, NEG_HYST } ThresTypes_t; typedef struct { int rpt_ind; int is_value; int modify; SaHpiRdrT Rdr; SaHpiSensorReadingT reading; SaHpiSensorThresholdsT thresholds; } Rdr_t; typedef struct { SaHpiRptEntryT Rpt; int nrdrs; Rdr_t *rdrs; } Rpt_t; typedef enum { COM_UNDEF = 0, COM_EXIT, COM_HELP, COM_RPT, COM_RDR, COM_SENS, COM_MOD, COM_UNDO } Com_enum_t; typedef struct { char *command_name; Com_enum_t type; } Commands_def_t; Commands_def_t Coms[] = { { "quit", COM_EXIT }, { "q", COM_EXIT }, { "exit", COM_EXIT }, { "help", COM_HELP }, { "h", COM_HELP }, { "rpt", COM_RPT }, { "rdr", COM_RDR }, { "sen", COM_SENS }, { "mod", COM_MOD }, { "undo", COM_UNDO }, { NULL, COM_UNDEF } }; Rpt_t *Rpts; int nrpts = 0; long int blade_slot = 0; int fdebug = 0; SaHpiSessionIdT sessionid; static void *resize_array(void *Ar, int item_size, int *last_num, int add_num) /* Resize array Ar: * item_size - item size (bytes) * last_num - current array size * add_num - new array size = last_num + add_num * Return: new pointer */ { void *R; int new_num = *last_num + add_num; if (new_num <= 0) return((void *)NULL); R = malloc(item_size * new_num); memset(R, 0, item_size * new_num); if (*last_num > 0) { memcpy(R, Ar, *last_num * item_size); free(Ar); } *last_num = new_num; return(R); } static void print_value(SaHpiSensorReadingT *item, char *mes) { char *val; if (item->IsSupported != SAHPI_TRUE) return; switch (item->Type) { case SAHPI_SENSOR_READING_TYPE_INT64: printf("%lld %s\n", item->Value.SensorInt64, mes); return; case SAHPI_SENSOR_READING_TYPE_UINT64: printf("%llu %s\n", item->Value.SensorUint64, mes); return; case SAHPI_SENSOR_READING_TYPE_FLOAT64: printf("%10.3f %s\n", item->Value.SensorFloat64, mes); return; case SAHPI_SENSOR_READING_TYPE_BUFFER: val = (char *)(item->Value.SensorBuffer); if (val != NULL) printf("%s %s\n", val, mes); return; } } static void ShowThres(SaHpiSensorThresholdsT *sensbuff) { printf(" Supported Thresholds:\n"); print_value(&(sensbuff->LowCritical), " Lower Critical Threshold(lc):"); print_value(&(sensbuff->LowMajor), " Lower Major Threshold(la):"); print_value(&(sensbuff->LowMinor), " Lower Minor Threshold(li):"); print_value(&(sensbuff->UpCritical), " Upper Critical Threshold(uc):"); print_value(&(sensbuff->UpMajor), " Upper Major Threshold(ua):"); print_value(&(sensbuff->UpMinor), " Upper Minor Threshold(ui):"); print_value(&(sensbuff->PosThdHysteresis), " Positive Threshold Hysteresis(ph):"); print_value(&(sensbuff->NegThdHysteresis), " Negative Threshold Hysteresis(nh):"); printf("\n"); } static void show_rpt(Rpt_t *Rpt, int ind) { printf("%3d RPT: id = %3d ResourceId = %3d Tag = %s\n", ind, Rpt->Rpt.EntryId, Rpt->Rpt.ResourceId, Rpt->Rpt.ResourceTag.Data); } static int find_rpt_by_id(SaHpiEntryIdT id) { int i; for (i = 0; i < nrpts; i++) if (Rpts[i].Rpt.EntryId == id) return(i); return(-1); } static int select_ep(Rpt_t *Rpt) { SaErrorT rv; unsigned int i; oHpiHandlerIdT this_handler_id; oHpiHandlerInfoT handler_info; rv = oHpiHandlerFind(sessionid, Rpt->Rpt.ResourceId, &this_handler_id); if (rv) { if (fdebug) printf("oHpiHandlerFind returns %s\n", oh_lookup_error(rv)); return(0); } rv = oHpiHandlerInfo(this_handler_id, &handler_info); if (rv) { if (fdebug) printf("oHpiHandlerInfo returns %s\n", oh_lookup_error(rv)); return(0); } /* If this resource belongs to the ipmi handler, then display it*/ if (strcmp(handler_info.plugin_name, "libipmi") == 0) { return(1); } else if(strcmp(handler_info.plugin_name, "libsnmp_bc") == 0) { for (i=0; iRpt.ResourceEntity.Entry[i].EntityType == SAHPI_ENT_PHYSICAL_SLOT) && (Rpt->Rpt.ResourceEntity.Entry[i].EntityLocation == blade_slot)) return(1); } } return 0; } static void show_rpts(char *S) { int i, rpt; i = sscanf(S, "%d", &rpt); if (i == 1) { i = find_rpt_by_id(rpt); if (i >= 0) oh_print_rptentry(&(Rpts[i].Rpt), 1); else printf("No RPT for id: %d\n", rpt); return; } for (i = 0; i < nrpts; i++) { if (select_ep(Rpts+i) == 1) show_rpt(Rpts + i, i); } } static int find_rdr_by_id(Rpt_t *R, SaHpiEntryIdT id) { int i; for (i = 0; i < R->nrdrs; i++) if (R->rdrs[i].Rdr.RecordId == id) return(i); return(-1); } static void show_rdr(Rdr_t *Rdr, int ind) { printf(" %3d RDR: id = %3d Data = %s\n", ind, Rdr->Rdr.RecordId, Rdr->Rdr.IdString.Data); } static void show_sen(Rdr_t *Rdr, int rptid) { if (Rdr->Rdr.RdrType != SAHPI_SENSOR_RDR) return; printf(" RPT id = %3d RDR id = %3d sensornum = %3d Data = %s\n", rptid, Rdr->Rdr.RecordId, Rdr->Rdr.RdrTypeUnion.SensorRec.Num, Rdr->Rdr.IdString.Data); } static void show_sens_for_rpt(Rpt_t *R) { int j; for (j = 0; j < R->nrdrs; j++) { show_sen(R->rdrs + j, R->Rpt.EntryId); } } static void show_rdrs_for_rpt(Rpt_t *R) { int j; for (j = 0; j < R->nrdrs; j++) { show_rdr(R->rdrs + j, j); } } static void show_rdrs(char *S) { int i, j, rpt, rdr; Rpt_t *R; i = sscanf(S, "%d %d", &rpt, &rdr); if (i == 1) { i = find_rpt_by_id(rpt); if (i >= 0) { show_rpt(Rpts + i, i); show_rdrs_for_rpt(Rpts + i); } else printf("No RPT for id: %d\n", rpt); return; } if (i == 2) { i = find_rpt_by_id(rpt); if (i >= 0) { j = find_rdr_by_id(Rpts + i, rdr); if (j >= 0) oh_print_rdr(&(Rpts[i].rdrs[j].Rdr), 2); else printf("No RDR %d for rpt %d\n", rdr, rpt); } else printf("No RPT for id: %d\n", rpt); return; } for (i = 0, R = Rpts; i < nrpts; i++, R++) { if (select_ep(R) == 1) show_rpt(R, i); if (select_ep(R) == 1) show_rdrs_for_rpt(R); } } static void show_reading_value(Rpt_t *Rpt, Rdr_t *R) { SaHpiSensorUnitsT k; SaErrorT rv; char unit[128]; rv = saHpiSensorReadingGet(sessionid, Rpt->Rpt.ResourceId, R->Rdr.RdrTypeUnion.SensorRec.Num, &(R->reading), NULL); if (rv != SA_OK) { printf("ERROR: %s\n", oh_lookup_error(rv)); return; }; k = R->Rdr.RdrTypeUnion.SensorRec.DataFormat.BaseUnits; printf("Reading value: "); snprintf(unit, 128, "%s", oh_lookup_sensorunits(k)); print_value(&(R->reading), unit); } static void show_thresholds(Rpt_t *Rpt, Rdr_t *R) { SaHpiSensorThresholdsT buf; SaErrorT rv; rv = saHpiSensorThresholdsGet(sessionid, Rpt->Rpt.ResourceId, R->Rdr.RdrTypeUnion.SensorRec.Num, &buf); if (rv != SA_OK) { printf("ERROR: %s\n", oh_lookup_error(rv)); return; }; printf(" Thresholds:\n"); ShowThres(&buf); if (R->is_value == 0) { R->thresholds = buf; R->is_value = 1; } } static int find_sensor_by_num(Rpt_t *R, int num) { int i; for (i = 0; i < R->nrdrs; i++) { if (R->rdrs[i].Rdr.RdrType == SAHPI_SENSOR_RDR) { if (R->rdrs[i].Rdr.RdrTypeUnion.SensorRec.Num == num) return(i); } }; return(-1); } static void show_sens(char *S) { int i, j, rpt, num; Rpt_t *Rpt; Rdr_t *Rdr; i = sscanf(S, "%d %d", &rpt, &num); if (i == 1) { i = find_rpt_by_id(rpt); if (i >= 0) show_sens_for_rpt(Rpts + i); return; } if (i == 2) { i = find_rpt_by_id(rpt); if (i < 0) { printf("No RPT for id: %d\n", rpt); return; }; j = find_sensor_by_num(Rpts + i, num); if (j < 0) { printf("No sensor %d for rpt %d\n", num, rpt); return; }; oh_print_rdr(&(Rpts[i].rdrs[j].Rdr), 2); show_reading_value(Rpts + i, Rpts[i].rdrs + j); show_thresholds(Rpts + i, Rpts[i].rdrs + j); return; } for (i = 0, Rpt = Rpts; i < nrpts; i++, Rpt++) { if (select_ep(Rpt) == 1) { for (j = 0, Rdr = Rpt->rdrs; j < Rpt->nrdrs; Rdr++, j++) show_sen(Rdr, Rpt->Rpt.EntryId); } } } static int get_number(char *mes, int *res) { char buf[READ_BUF_SIZE]; char *ret; printf("%s", mes); ret = fgets(buf, READ_BUF_SIZE, stdin); return (sscanf(buf, "%d", res)); } static void set_thres_value(SaHpiSensorReadingT *R, double val) { if (R->IsSupported == 0) { printf("ERROR: this threshold isn't supported\n"); return; }; R->Value.SensorFloat64 = val; } static void mod_sen(void) { int i, rpt, rdr, num; char buf[READ_BUF_SIZE], *S; Rpt_t *Rpt; Rdr_t *Rdr; SaHpiSensorThresholdsT thres; SaErrorT rv; ThresTypes_t type = UNKNOWN_TYPE; float f; SaHpiEventT event; i = get_number("RPT number: ", &rpt); if (i != 1) { printf("ERROR: no RPT number\n"); return; }; i = find_rpt_by_id(rpt); if (i < 0) { printf("ERROR: invalid RPT number\n"); return; }; rpt = i; Rpt = Rpts + rpt; show_sens_for_rpt(Rpt); i = get_number("Sensor number: ", &num); if (i != 1) { printf("ERROR: no Sensor number\n"); return; }; rdr = find_sensor_by_num(Rpt, num); if (rdr < 0) { printf("ERROR: invalid sensor number\n"); return; }; Rdr = Rpt->rdrs + rdr; oh_print_rdr(&(Rdr->Rdr), 2); show_reading_value(Rpt, Rdr); rv = saHpiSensorThresholdsGet(sessionid, Rpt->Rpt.ResourceId, Rdr->Rdr.RdrTypeUnion.SensorRec.Num, &thres); if (rv != SA_OK) { printf("ERROR: %s\n", oh_lookup_error(rv)); return; }; printf(" Thresholds:\n"); ShowThres(&thres); if (Rdr->is_value == 0) { Rdr->thresholds = thres; Rdr->is_value = 1; }; printf("threshold type (lc, la, li, uc, ua, ui, ph, nh): "); S = fgets(buf, READ_BUF_SIZE, stdin); while (*S == ' ') S++; if (strlen(S) < 2) { printf("ERROR: invalid threshold type: %s\n", S); return; }; if (strncmp(S, "lc", 2) == 0) type = LOWER_CRIT; if (strncmp(S, "la", 2) == 0) type = LOWER_MAJOR; if (strncmp(S, "li", 2) == 0) type = LOWER_MINOR; if (strncmp(S, "uc", 2) == 0) type = UPPER_CRIT; if (strncmp(S, "ua", 2) == 0) type = UPPER_MAJOR; if (strncmp(S, "ui", 2) == 0) type = UPPER_MINOR; if (strncmp(S, "ph", 2) == 0) type = POS_HYST; if (strncmp(S, "nh", 2) == 0) type = NEG_HYST; if (type == UNKNOWN_TYPE) { printf("ERROR: unknown threshold type: %s\n", S); return; }; printf("new value: "); S = fgets(buf, READ_BUF_SIZE, stdin); i = sscanf(buf, "%f", &f); if (i == 0) { printf("ERROR: no value\n"); return; }; switch (type) { case LOWER_CRIT: set_thres_value(&(thres.LowCritical), (double)f); break; case LOWER_MAJOR: set_thres_value(&(thres.LowMajor), (double)f); break; case LOWER_MINOR: set_thres_value(&(thres.LowMinor), (double)f); break; case UPPER_CRIT: set_thres_value(&(thres.UpCritical), (double)f); break; case UPPER_MAJOR: set_thres_value(&(thres.UpMajor), (double)f); break; case UPPER_MINOR: set_thres_value(&(thres.UpMinor), (double)f); break; case POS_HYST: set_thres_value(&(thres.PosThdHysteresis), (double)f); break; case NEG_HYST: set_thres_value(&(thres.NegThdHysteresis), (double)f); break; default: printf("ERROR: unknown threshold\n"); }; printf("\n Nem threshold:\n"); ShowThres(&thres); printf("Is it correct (yes, no)?:"); S = fgets(buf, READ_BUF_SIZE, stdin); while (*S == ' ') S++; if (strncmp(S, "yes", 3) != 0) return; rv = saHpiSensorThresholdsSet(sessionid, Rpt->Rpt.ResourceId, Rdr->Rdr.RdrTypeUnion.SensorRec.Num, &thres); if (rv != SA_OK) { printf("ERROR: saHpiSensorThresholdsSet: %s\n", oh_lookup_error(rv)); return; }; Rdr->modify = 1; for (i = 0; i < 10; i++) { rv = saHpiEventGet(sessionid, SAHPI_TIMEOUT_IMMEDIATE, &event, NULL, NULL, NULL); if (rv == SA_OK) break; if (fdebug) printf("sleep before saHpiEventGet\n"); sleep(1); }; saHpiSensorThresholdsGet(sessionid, Rpt->Rpt.ResourceId, Rdr->Rdr.RdrTypeUnion.SensorRec.Num, &thres); printf("Current thresholds:\n"); ShowThres(&thres); } static void undo(void) { int i, j; Rpt_t *Rpt; Rdr_t *Rdr; for (i = 0, Rpt = Rpts; i < nrpts; i++, Rpt++) { for (j = 0, Rdr = Rpt->rdrs; j < Rpt->nrdrs; j++, Rdr++) { if (Rdr->modify == 0) continue; saHpiSensorThresholdsSet(sessionid, Rpt->Rpt.ResourceId, Rdr->Rdr.RdrTypeUnion.SensorRec.Num, &(Rdr->thresholds)); Rdr->modify = 0; } } } static void get_rpts(void) { SaHpiEntryIdT rptentryid, nextrptentryid; SaErrorT rv; SaHpiRptEntryT rptentry; int n; rptentryid = SAHPI_FIRST_ENTRY; while (rptentryid != SAHPI_LAST_ENTRY) { rv = saHpiRptEntryGet(sessionid, rptentryid, &nextrptentryid, &rptentry); if (rv != SA_OK) break; n = nrpts; Rpts = (Rpt_t *)resize_array(Rpts, sizeof(Rpt_t), &nrpts, 1); rptentry.ResourceTag.Data[rptentry.ResourceTag.DataLength] = 0; Rpts[n].Rpt = rptentry; rptentryid = nextrptentryid; } } static void get_rdrs(Rpt_t *Rpt) { SaHpiRdrT rdr; SaErrorT rv; int n; SaHpiEntryIdT entryid; SaHpiEntryIdT nextentryid; SaHpiResourceIdT resourceid; entryid = SAHPI_FIRST_ENTRY; while (entryid !=SAHPI_LAST_ENTRY) { resourceid = Rpt->Rpt.ResourceId; rv = saHpiRdrGet(sessionid, resourceid, entryid, &nextentryid, &rdr); if (rv != SA_OK) break; n = Rpt->nrdrs; Rpt->rdrs = (Rdr_t *)resize_array(Rpt->rdrs, sizeof(Rdr_t), &(Rpt->nrdrs), 1); rdr.IdString.Data[rdr.IdString.DataLength] = 0; Rpt->rdrs[n].Rdr = rdr; entryid = nextentryid; } } static void help(void) { printf("Available commands:\n"); printf(" exit, quit, q - exit\n"); printf(" help, h - this instruction\n"); printf(" rpt - show all RPT entries\n"); printf(" rpt - show #id RPT entry\n"); printf(" rdr - show all RDR entries\n"); printf(" rdr - show RDRs entries for #rptid\n"); printf(" rdr - show #rdrid RDR entry for #rptid\n"); printf(" sen - show all sensors\n"); printf(" sen - show sensors for #rptid\n"); printf(" sen - show #num sensor for #rptid\n"); printf(" mod - modify thresholds\n"); printf(" undo - delete all changes\n"); } static Com_enum_t find_command(char *S) { int i; for (i = 0;; i++) { if (Coms[i].command_name == (char *)NULL) return(COM_UNDEF); if (strcmp(Coms[i].command_name, S) == 0) return(Coms[i].type); } } static int parse_command(char *Str) { int len; char *S, *S1; Com_enum_t com; S = Str; while (*S != 0) { if ((*S == '\t') || (*S == '\n')) *S = ' '; S++; }; S = Str; while (*S == ' ') S++; len = strlen(S); if (len == 0) return(0); S1 = S; while ((*S1 != 0) && (*S1 != ' ')) S1++; if (*S1 != 0) *S1++ = 0; com = find_command(S); switch (com) { case COM_UNDEF: printf("Invalid command: %s\n", S); help(); break; case COM_EXIT: return(-1); case COM_RPT: show_rpts(S1); break; case COM_RDR: show_rdrs(S1); break; case COM_SENS: show_sens(S1); break; case COM_MOD: mod_sen(); break; case COM_UNDO: undo(); break; case COM_HELP: help(); break; }; return(0); } static SaErrorT hpiIBMspecial_find_blade_slot(void) { #define NETFN "0x2e" // IPMI OEM command #define CMD_READ_VPD "0x0a" // Read Legacy Format VPD command #define CMD_WRITE_VPD "0x09" // Write Legacy Format VPD command #define IANA "0xd0 0x51 0x00" // x-Series IANA #define IANA_OLD "0x02 0x00 0x00" // IBM IANA used by some older blades (e.g. 8843) #define DEV_ID "0x10" // #define OFFSET_BLOCK2 "0xca 0x00" // VPD block 2 offset in VPD block 0 // (contains the number of the most recent log entry) char shell_command[MAX_BYTE_COUNT]; char VPD_DATA[MAX_BYTE_COUNT]; char str2[3]; char str[5]; int sys_rv = 0; FILE *Fp = NULL; unsigned long int CH_SLOT = 0, BLOCK2_BASE = 0, ENTRY_NUM = 0, ENTRY_NUM_BASE = 0, LOG_BASE = 0, ENTRY_BASE = 0, ENTRY_BASE_LSB = 0, ENTRY_BASE_MSB = 0, ENTRY_NUM_BASE_LSB = 0, ENTRY_NUM_BASE_MSB = 0; int byte_count; char BYTE_READ; char *USE_IANA; memset(str2, '\0', 3); memset(str, '\0',5); /* printf("Find offset to VPD Block 2.\n"); */ USE_IANA = IANA; snprintf(shell_command, MAX_BYTE_COUNT, "ipmitool raw %s %s %s %s %s 0x02 > /tmp/hpiS01\n", NETFN, CMD_READ_VPD, USE_IANA, OFFSET_BLOCK2, DEV_ID); sys_rv = system(shell_command); if (sys_rv != 0) { USE_IANA = IANA_OLD; snprintf(shell_command, MAX_BYTE_COUNT, "ipmitool raw %s %s %s %s %s 0x02 > /tmp/hpiS01\n", NETFN, CMD_READ_VPD, USE_IANA, OFFSET_BLOCK2, DEV_ID); sys_rv = system(shell_command); if (sys_rv != 0) { printf("\"Finding offset to VPD Block 2\" has FAILED.\n"); return(-1); } } Fp = fopen("/tmp/hpiS01", "r"); byte_count = 0; while(fscanf(Fp, "%c", &BYTE_READ) != -1){ if (BYTE_READ != 0x20) VPD_DATA[byte_count++]=BYTE_READ; } fclose(Fp); if (byte_count >= 3) { memcpy(&str, &VPD_DATA[6], 4); BLOCK2_BASE = strtol(str,NULL, 16); } else { printf("Can not find BLOCK2_BASE.\n"); return(-1); } /* Find offsets to History Log and History Log Entry Pointer in Block 2 #define OFFSET_LOG "108" // History Log offset in VPD block 2 #define OFFSET_LOG_ENTRY_NUM "107" // History Log Entry Pointer offset in VPD block 2 */ LOG_BASE = BLOCK2_BASE + 0x108; ENTRY_NUM_BASE = BLOCK2_BASE + 0x107; /* # Find most recent entry in History Log # Convert log entry offset to LSB and MSB for Little Endian */ ENTRY_NUM_BASE_LSB = (ENTRY_NUM_BASE & 0x00FF); ENTRY_NUM_BASE_MSB = (ENTRY_NUM_BASE & 0xFF00); ENTRY_NUM_BASE_MSB = (ENTRY_NUM_BASE_MSB >> 8); /* X=`ipmitool raw $NETFN $CMD_READ_VPD $IANA $ENTRY_NUM_BASE_LSB $ENTRY_NUM_BASE_MSB $DEV_ID 0x 01` */ snprintf(shell_command, MAX_BYTE_COUNT, "ipmitool raw %s %s %s 0x%x 0x%x %s 0x01 > /tmp/hpiS02\n", NETFN, CMD_READ_VPD, USE_IANA, (unsigned int)ENTRY_NUM_BASE_LSB, (unsigned int)ENTRY_NUM_BASE_MSB, DEV_ID); sys_rv = system(shell_command); if (sys_rv != 0) { printf("\"Find most recent entry\" has FAILED.\n"); return(-1); } Fp = fopen("/tmp/hpiS02", "r"); byte_count = 0; while(fscanf(Fp, "%c", &BYTE_READ) != -1){ if (BYTE_READ != 0x20) VPD_DATA[byte_count++]=BYTE_READ; } fclose(Fp); if (byte_count >= 3) { memcpy(&str2, &VPD_DATA[6], 2); ENTRY_NUM= strtol(str2,NULL,16); } /* # Find Entry Offset - Each entry is 26 bytes */ ENTRY_BASE = LOG_BASE + (ENTRY_NUM * 0x1A); /* # Read Most recent log entry and parse out information */ ENTRY_BASE_LSB = (ENTRY_BASE & 0x00FF); ENTRY_BASE_MSB = (ENTRY_BASE & 0xFF00); ENTRY_BASE_MSB = (ENTRY_BASE_MSB >> 8); /* X=`ipmitool raw $NETFN $CMD_READ_VPD $IANA $ENTRY_BASE_LSB $ENTRY_BASE_MSB $DEV_ID 0x1a` */ snprintf(shell_command, MAX_BYTE_COUNT, "ipmitool raw %s %s %s 0x%x 0x%x %s 0x1a > /tmp/hpiS02\n", NETFN, CMD_READ_VPD, USE_IANA, (unsigned int)ENTRY_BASE_LSB, (unsigned int)ENTRY_BASE_MSB, DEV_ID); sys_rv = system(shell_command); if (sys_rv != 0) { printf("\"Read Most recent log entry\" has FAILED.\n"); return(-1); } Fp = fopen("/tmp/hpiS02", "r"); byte_count = 0; while(fscanf(Fp, "%c", &BYTE_READ) != -1){ if (BYTE_READ != 0x20) VPD_DATA[byte_count++]=BYTE_READ; } fclose(Fp); /* CH_SLOT=`echo $X | gawk '{i=20; x=x $i; print x}'` */ if (byte_count >= 3) { memcpy(&str2, &VPD_DATA[39], 2); CH_SLOT= strtol(str2,NULL, 16); } else { CH_SLOT= 0; printf("\"Read Most recent log entry\" has FAILED.\n"); return(-1); } printf("Blade is installed in slot number %d.\n", (int)CH_SLOT); blade_slot = CH_SLOT; return(SA_OK); } int main(int argc, char **argv) { int c, i; SaErrorT rv; char buf[READ_BUF_SIZE]; char *S; oh_prog_version(argv[0], OH_SVN_REV); while ( (c = getopt( argc, argv,"x?")) != EOF ) switch(c) { case 'x': fdebug = 1; break; default: printf("Usage: %s [-x]\n", argv[0]); printf(" -x Display debug messages\n"); return(1); } rv = hpiIBMspecial_find_blade_slot(); if (rv != SA_OK) { printf("ipmitool can not find slot number in which this blade resides.\n"); return(-1); } rv = saHpiSessionOpen(SAHPI_UNSPECIFIED_DOMAIN_ID, &sessionid, NULL); if (rv != SA_OK) { printf("saHpiSessionOpen: %s\n", oh_lookup_error(rv)); return(-1); } rv = saHpiDiscover(sessionid); if (fdebug) printf("saHpiDiscover: %s\n", oh_lookup_error(rv)); rv = saHpiSubscribe(sessionid); if (rv != SA_OK) { printf( "saHpiSubscribe error %d\n",rv); return(-1); } /* make the RPT list */ get_rpts(); /* get rdrs for the RPT list */ for (i = 0; i < nrpts; i++) get_rdrs(Rpts + i); help(); for (;;) { printf("==> "); S = fgets(buf, READ_BUF_SIZE, stdin); if (parse_command(S) < 0) break; }; rv = saHpiSessionClose(sessionid); return(0); } /* end hpthres.c */ openhpi-2.14.1/clients/hpiwdt.c0000644000076400007640000001702411302567131013300 0ustar /* -*- linux-c -*- * * Copyright (c) 2004 by Intel Corp. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Filename: hpiwdt.c * Authors: Andy Cress * * Changes: * 03/15/04 Andy Cress - v1.0 added strings for use & actions in show_wdt * 10/13/04 kouzmich - porting to HPI B * 12/02/04 Andy Cress - v1.1 fixed domain/RPT loop, added some decoding */ /* * This tool reads and enables the watchdog timer via HPI. * Note that there are other methods for doing this, and the * standard interface is for the driver to expose a /dev/watchdog * device interface. * WARNING: If you enable the watchdog, make sure you have something * set up to keep resetting the timer at regular intervals, or it * will reset your system. */ #include #include #include #include #include #include #define uchar unsigned char #define OH_SVN_REV "$Revision: 6571 $" #define NUSE 6 char *usedesc[NUSE] = {"reserved", "BIOS FRB2", "BIOS/POST", "OS Load", "SMS/OS", "OEM" }; #define NACT 5 char *actions[NACT] = {"No action", "Hard Reset", "Power down", "Power cycle", "Reserved" }; char fdebug = 0; static void show_wdt(SaHpiWatchdogNumT wdnum, SaHpiWatchdogT *wdt) { int icount, pcount; char ustr[12]; char astr[16]; char estr[30]; char *pstr; icount = wdt->InitialCount /1000; /*1000 msec = 1 sec*/ pcount = wdt->PresentCount /1000; if (wdt->TimerUse > NUSE) sprintf(ustr,"%d", wdt->TimerUse ); else strcpy(ustr, usedesc[wdt->TimerUse]); if (wdt->TimerAction > NACT) sprintf(astr,"%d", wdt->TimerAction ); else strcpy(astr, actions[wdt->TimerAction]); printf("Watchdog: Num=%d, Log=%d, Running=%d, TimerUse=%s, TimerAction=%s\n", wdnum,wdt->Log,wdt->Running,ustr, astr); if (wdt->TimerUseExpFlags == 0) strcpy(estr,"none"); else { estr[0] = 0; if (wdt->TimerUseExpFlags & 0x01) strcat(estr,"FRB2 "); if (wdt->TimerUseExpFlags & 0x02) strcat(estr,"POST "); if (wdt->TimerUseExpFlags & 0x04) strcat(estr,"OS_Load "); if (wdt->TimerUseExpFlags & 0x08) strcat(estr,"SMS_OS "); if (wdt->TimerUseExpFlags & 0x10) strcat(estr,"OEM "); } printf(" ExpiredUse=%s, Timeout=%d sec, Counter=%d sec\n", estr, icount,pcount); switch(wdt->PretimerInterrupt) { case 1: pstr = "SMI"; break; case 2: pstr = "NMI"; break; case 3: pstr = "MsgInt"; break; default: pstr = "none"; break; } printf(" PreTimerInterrupt=%s, PreTimeoutInterval=%d msec\n", pstr,wdt->PreTimeoutInterval); return; } int main(int argc, char **argv) { int c; SaErrorT rv; SaHpiSessionIdT sessionid; SaHpiDomainInfoT domainInfo; SaHpiRptEntryT rptentry; SaHpiEntryIdT rptentryid; SaHpiEntryIdT nextrptentryid; SaHpiResourceIdT resourceid; SaHpiWatchdogNumT wdnum; SaHpiWatchdogT wdt; int t = 0; char freset = 0; char fenable = 0; char fdisable = 0; oh_prog_version(argv[0], OH_SVN_REV); while ( (c = getopt( argc, argv,"dert:x?")) != EOF ) switch(c) { case 'r': /* reset wdt */ freset = 1; break; case 'e': /* disable wdt */ fenable = 1; break; case 'd': /* disable wdt */ fdisable = 1; break; case 't': /* timeout (enable implied) */ t = atoi(optarg); fenable = 1; break; case 'x': fdebug = 1; break; /* debug messages */ default: printf("Usage: %s [-derx -t sec]\n", argv[0]); printf(" where -e enables the watchdog timer\n"); printf(" -d disables the watchdog timer\n"); printf(" -r resets the watchdog timer\n"); printf(" -t N sets timeout to N seconds\n"); printf(" -x show eXtra debug messages\n"); exit(1); } if (t == 0) t = 120; rv = saHpiSessionOpen(SAHPI_UNSPECIFIED_DOMAIN_ID, &sessionid, NULL); if (rv != SA_OK) { printf("saHpiSessionOpen error %d\n",rv); exit(-1); } rv = saHpiDiscover(sessionid); if (fdebug) printf("saHpiDiscover rv = %d\n",rv); rv = saHpiDomainInfoGet(sessionid, &domainInfo); if (fdebug) printf("saHpiDomainInfoGet rv = %d\n",rv); printf("DomainInfo: UpdateCount = %x, UpdateTime = %lx\n", domainInfo.RptUpdateCount, (unsigned long)domainInfo.RptUpdateTimestamp); /* walk the RPT list */ rptentryid = SAHPI_FIRST_ENTRY; while ((rv == SA_OK) && (rptentryid != SAHPI_LAST_ENTRY)) { rv = saHpiRptEntryGet(sessionid,rptentryid,&nextrptentryid,&rptentry); if (rv != SA_OK) printf("RptEntryGet: rv = %d\n",rv); if (rv == SA_OK) { /* handle WDT for this RPT entry */ resourceid = rptentry.ResourceId; // rptentry.ResourceTag.Data[rptentry.ResourceTag.DataLength] = 0; if (fdebug) printf("rptentry[%d] resourceid=%d capab=%x tag: %s\n", rptentryid, resourceid, rptentry.ResourceCapabilities, rptentry.ResourceTag.Data); if (rptentry.ResourceCapabilities & SAHPI_CAPABILITY_WATCHDOG) { printf("%s has watchdog capability\n",rptentry.ResourceTag.Data); wdnum = SAHPI_DEFAULT_WATCHDOG_NUM; rv = saHpiWatchdogTimerGet(sessionid,resourceid,wdnum,&wdt); if (fdebug) printf("saHpiWatchdogTimerGet rv = %d\n",rv); if (rv != 0) { printf("saHpiWatchdogTimerGet error = %d\n",rv); rv = 0; rptentryid = nextrptentryid; continue; } show_wdt(wdnum,&wdt); if (fdisable) { printf("Disabling watchdog timer ...\n"); /* clear FRB2, timeout back to 120 sec */ /* TODO: add setting wdt values here */ wdt.TimerUse = SAHPI_WTU_NONE; /* 1=FRB2 2=POST 3=OSLoad 4=SMS_OS 5=OEM */ wdt.TimerAction = SAHPI_WAE_NO_ACTION; /* 0=none 1=reset 2=powerdown 3=powercycle */ wdt.PretimerInterrupt = SAHPI_WPI_NONE; /* 0=none 1=SMI 2=NMI 3=message */ wdt.PreTimeoutInterval = 60000; /*msec*/ wdt.InitialCount = 120000; /*msec*/ wdt.PresentCount = 120000; /*msec*/ rv = saHpiWatchdogTimerSet(sessionid,resourceid,wdnum,&wdt); if (fdebug) printf("saHpiWatchdogTimerSet rv = %d\n",rv); if (rv == 0) show_wdt(wdnum,&wdt); } else if (fenable) { printf("Enabling watchdog timer ...\n"); /* hard reset action, no pretimeout, clear SMS/OS when done */ /* use t for timeout */ wdt.TimerUse = SAHPI_WTU_SMS_OS; /* 1=FRB2 2=POST 3=OSLoad 4=SMS_OS 5=OEM */ wdt.TimerAction = SAHPI_WAE_RESET; /* 0=none 1=reset 2=powerdown 3=powercycle */ wdt.PretimerInterrupt = SAHPI_WPI_NMI; /* 0=none 1=SMI 2=NMI 3=message */ wdt.PreTimeoutInterval = (t / 2) * 1000; /*msec*/ wdt.InitialCount = t * 1000; /*msec*/ wdt.PresentCount = t * 1000; /*msec*/ rv = saHpiWatchdogTimerSet(sessionid,resourceid,wdnum,&wdt); if (fdebug) printf("saHpiWatchdogTimerSet rv = %d\n",rv); if (rv == 0) show_wdt(wdnum,&wdt); } if (freset && !fdisable) { printf("Resetting watchdog timer ...\n"); rv = saHpiWatchdogTimerReset(sessionid,resourceid,wdnum); if (fdebug) printf("saHpiWatchdogTimerReset rv = %d\n",rv); } } /*watchdog capability*/ rptentryid = nextrptentryid; /* get next RPT (usu only one anyway) */ } /*endif RPT ok*/ } /*end while loop*/ rv = saHpiSessionClose(sessionid); exit(0); } /* end hpiwdt.c */ openhpi-2.14.1/clients/oh_clients.h0000644000076400007640000000122011302567131014124 0ustar /* -*- linux-c -*- * * Copyright (C) 2007-2008, Hewlett-Packard Development Company, LLP * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * Shuah Khan */ #ifndef __OH_CLIENTS_H #define __OH_CLIENTS_H void oh_prog_version(const char *prog_name, const char *svn_rev_str); #endif /* __OH_CLIENTS_H */ openhpi-2.14.1/clients/hpisettime.c0000644000076400007640000001655611302567131014165 0ustar /* -*- linux-c -*- * * * (C) Copyright IBM Corp 2003,2004 * Authors: * Peter D.Phan pdphan@users.sourceforge.net * * 01/13/2004 pdphan module created * Change clock for event log on IBM Blade Center E. * 03/10/2004 pdphan Remove reference to IBM Blade Center. * 10/12/2004 kouzmich porting to HPI B. * check month, day, year, hours, minutes and seconds * for correctness */ /* Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: a.. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. b.. 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. c.. Neither the name of Intel Corporation nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include #include #include #include #include #include #include #include #define OH_SVN_REV "$Revision: 6571 $" int fdebug = 0; int findate = 0; int fintime = 0; static void usage(char **argv) { printf("Usage\n\t%s -d mm/dd/yyyy -t HH:MM:SS [-x]\n",argv[0]); printf("\twhere -d date in mm/dd/yyyy format\n"); printf("\t -t time of day in 24-hr format\n"); printf("\t -x displays eXtra debug messages\n"); return; } int main(int argc, char **argv) { int c, month, day, year; char i_newdate[20]; char i_newtime[20]; int day_array[] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 }; struct tm new_tm_time; SaErrorT rv; SaHpiSessionIdT sessionid; SaHpiDomainInfoT domainInfo; SaHpiRptEntryT rptentry; SaHpiEntryIdT rptentryid; SaHpiEntryIdT nextrptentryid; SaHpiResourceIdT resourceid; SaHpiEventLogEntryIdT entryid; SaHpiTimeT oldtime; SaHpiTimeT newtime; SaHpiTimeT readbacktime; SaHpiTextBufferT buffer; oh_prog_version(argv[0], OH_SVN_REV); while ( (c = getopt( argc, argv,"d:t:x")) != EOF ) { switch(c) { case 'd': findate = 1; strcpy(i_newdate, optarg); break; case 't': fintime = 1; strcpy(i_newtime, optarg); break; case 'x': fdebug = 1; break; default: usage(argv); exit(1); } } if ( !findate || !fintime) { usage(argv); exit(1); } if (findate) { if (fdebug) printf("New date to be set: %s\n",i_newdate); if (sscanf(i_newdate,"%2d/%2d/%4d", &month, &day, &year) < 8) { printf("%s: Invalid date\n", argv[0]); } /* check month, day and year for correctness */ if ((month < 1) || (month > 12)) { printf("%s: Month out of range: (%d)\n", argv[0], month); usage(argv); exit(1); }; if (year < 1900) { printf("%s: Year out of range: (%d)\n", argv[0], year); usage(argv); exit(1); }; month--; if (month == 1) { /* if the given year is a leap year */ if ((((year % 4) == 0) && ((year % 100) != 0)) || ((year % 400) == 0)) day_array[1] = 29; }; if ((day < 1) || (day > day_array[month])) { printf("%s: Day out of range: (%d)\n", argv[0], day); usage(argv); exit(1); }; new_tm_time.tm_mon = month; new_tm_time.tm_mday = day; new_tm_time.tm_year = year - 1900; } if (fintime) { if (fdebug) printf("New time to be set: %s\n",i_newtime); if (sscanf(i_newtime,"%2d:%2d:%2d", &new_tm_time.tm_hour, &new_tm_time.tm_min, &new_tm_time.tm_sec) < 6) { printf("%s: Invalid time\n", argv[0]); } /* check hours, minutes and seconds for correctness */ if ((new_tm_time.tm_hour < 0) || (new_tm_time.tm_hour > 24)) { printf("%s: Hours out of range: (%d)\n", argv[0], new_tm_time.tm_hour); usage(argv); exit(1); }; if ((new_tm_time.tm_min < 0) || (new_tm_time.tm_min > 60)) { printf("%s: Minutes out of range: (%d)\n", argv[0], new_tm_time.tm_min); usage(argv); exit(1); }; if ((new_tm_time.tm_sec < 0) || (new_tm_time.tm_sec > 60)) { printf("%s: Seconds out of range: (%d)\n", argv[0], new_tm_time.tm_sec); usage(argv); exit(1); } } if (fdebug) printf("Values passed to mktime():\n\tmon %d\n\tday %d\n\tyear %d\n\tHH %d\n\tMM %d\n\tSS %d\n", new_tm_time.tm_mon, new_tm_time.tm_mday, new_tm_time.tm_year, new_tm_time.tm_hour, new_tm_time.tm_min, new_tm_time.tm_sec); newtime = (SaHpiTimeT) mktime(&new_tm_time) * 1000000000; if (fdebug) printf("New date and time in SaHpiTimeT %lli\n", (long long int)newtime); rv = saHpiSessionOpen(SAHPI_UNSPECIFIED_DOMAIN_ID, &sessionid,NULL); if (rv != SA_OK) { if (rv == SA_ERR_HPI_ERROR) printf("saHpiSessionOpen: error %d, SpiLibd not running\n",rv); else printf("saHpiSessionOpen: %s\n", oh_lookup_error(rv)); exit(-1); } rv = saHpiDiscover(sessionid); if (fdebug) printf("saHpiDiscover %s\n", oh_lookup_error(rv)); rv = saHpiDomainInfoGet(sessionid, &domainInfo); if (fdebug) printf("saHpiDomainInfoGet %s\n", oh_lookup_error(rv)); printf("DomainInfo: RptUpdateCount = %d, RptUpdateTimestamp = %lx\n", domainInfo.RptUpdateCount, (unsigned long)domainInfo.RptUpdateTimestamp); /* walk the RPT list */ rptentryid = SAHPI_FIRST_ENTRY; while ((rv == SA_OK) && (rptentryid != SAHPI_LAST_ENTRY)) { rv = saHpiRptEntryGet(sessionid,rptentryid,&nextrptentryid,&rptentry); if (fdebug) printf("saHpiRptEntryGet %s\n", oh_lookup_error(rv)); if ((rv == SA_OK) && (rptentry.ResourceCapabilities & SAHPI_CAPABILITY_EVENT_LOG)) { resourceid = rptentry.ResourceId; if (fdebug) printf("RPT %x capabilities = %x\n", resourceid, rptentry.ResourceCapabilities); rv = saHpiEventLogTimeGet(sessionid, resourceid, &oldtime); oh_decode_time(oldtime, &buffer); printf ("\nCurrent event log time on HPI target: %s\n", buffer.Data); printf ("Setting new event log time on HPI target ...\n"); rv = saHpiEventLogTimeSet(sessionid, resourceid, newtime); if (rv != SA_OK) { printf("saHpiEventLogTimeSet %s\n", oh_lookup_error(rv)); } rv = saHpiEventLogTimeGet(sessionid, resourceid, &readbacktime); oh_decode_time(readbacktime, &buffer); printf ("Read-Back-Check event log time: %s\n", buffer.Data); } entryid = SAHPI_OLDEST_ENTRY; rptentryid = nextrptentryid; } rv = saHpiSessionClose(sessionid); return(0); } /* end hpisettime.c */ openhpi-2.14.1/clients/hpitree.c0000644000076400007640000004221211302567131013436 0ustar /* -*- linux-c -*- * * Copyright (c) 2003 by Intel Corp. * (C) Copyright IBM Corp. 2004 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Authors: * Peter D. Phan * Tariq Shureih * * Log: * Copied from hpifru.c and modified for general use * * Changes: * 11/03/2004 kouzmich Fixed Bug #1057934 * */ #include #include #include #include #include #include #include #include #define OH_SVN_REV "$Revision: 6571 $" /* * Function prototypes */ static SaErrorT list_resources(SaHpiSessionIdT sessionid, SaHpiResourceIdT res_id); static SaErrorT list_rpt(SaHpiRptEntryT *rptptr,SaHpiResourceIdT resourceid); static SaErrorT list_rdr(SaHpiSessionIdT sessionid, SaHpiRptEntryT *rptptr, SaHpiRdrT *rdrptr, SaHpiResourceIdT l_resourceid); static SaErrorT list_inv(SaHpiSessionIdT sessionid, SaHpiRptEntryT *rptptr, SaHpiRdrT *rdrptr, SaHpiResourceIdT l_resourceid); static SaErrorT list_sens(SaHpiSessionIdT sessionid, SaHpiRptEntryT *rptptr, SaHpiRdrT *rdrptr, SaHpiResourceIdT l_resourceid); static SaErrorT list_ctrl(SaHpiSessionIdT sessionid, SaHpiRptEntryT *rptptr, SaHpiRdrT *rdrptr, SaHpiResourceIdT l_resourceid); static SaErrorT list_wdog(SaHpiSessionIdT sessionid, SaHpiRptEntryT *rptptr, SaHpiRdrT *rdrptr, SaHpiResourceIdT l_resourceid); static SaErrorT list_ann (SaHpiSessionIdT sessionid, SaHpiRptEntryT *rptptr, SaHpiRdrT *rdrptr, SaHpiResourceIdT l_resourceid); static SaErrorT walkInventory(SaHpiSessionIdT sessionid, SaHpiResourceIdT resourceid, SaHpiIdrInfoT *idrInfo); static SaErrorT getcontrolstate(SaHpiSessionIdT sessionid, SaHpiResourceIdT l_resourceid, SaHpiCtrlNumT num); static void sensor_readingthreshold(SaHpiSessionIdT sessionid, SaHpiResourceIdT resourceid, SaHpiRdrT *rdrptr); #define all_resources 255 /* * Globals for this driver */ int fdebug = 0; int f_listall = 0; int f_rpt = 0; int f_sensor = 0; int f_inv = 0; int f_ctrl = 0; int f_rdr = 0; int f_wdog = 0; int f_ann = 0; int f_overview = 0; /* * Main */ int main(int argc, char **argv) { SaErrorT rv = SA_OK; SaHpiSessionIdT sessionid; SaHpiResourceIdT resourceid = all_resources; int c; oh_prog_version(argv[0], OH_SVN_REV); while ( (c = getopt( argc, argv,"adrsoiwcn:x?")) != EOF ) { switch(c) { case 'a': f_listall = 1; break; case 'c': f_ctrl = 1; break; case 'd': f_rdr = 1; break; case 'i': f_inv = 1; break; case 'r': f_rpt = 1; break; case 's': f_sensor = 1; break; case 'w': f_wdog = 1; break; case 'o': f_overview = 1; break; case 'n': if (optarg) resourceid = atoi(optarg); else resourceid = all_resources; break; case 'x': fdebug = 1; break; default: printf("\n\tUsage: %s [-option]\n\n", argv[0]); printf("\t (No Option) Display all rpts and rdrs\n"); printf("\t -a Display all rpts and rdrs\n"); printf("\t -c Display only controls\n"); printf("\t -d Display rdr records\n"); printf("\t -i Display only inventories\n"); printf("\t -o Display system overview: rpt & rdr headers\n"); printf("\t -r Display only rpts\n"); printf("\t -s Display only sensors\n"); printf("\t -w Display only watchdog\n"); printf("\t -n Select particular resource id to display\n"); printf("\t (Used with [-cdirs] options)\n"); printf("\t -x Display debug messages\n"); printf("\n\n\n\n"); exit(1); } } if (argc == 1) f_listall = 1; if (fdebug) printf("saHpiSessionOpen\n"); rv = saHpiSessionOpen(SAHPI_UNSPECIFIED_DOMAIN_ID,&sessionid,NULL); if (rv != SA_OK) { printf("saHpiSessionOpen returns %s\n",oh_lookup_error(rv)); exit(-1); } if (fdebug) printf("saHpiSessionOpen returns with SessionId %d\n", sessionid); /* * Resource discovery */ if (fdebug) printf("saHpiDiscover\n"); rv = saHpiDiscover(sessionid); if (rv != SA_OK) { printf("saHpiDiscover returns %s\n",oh_lookup_error(rv)); exit(-1); } printf("Discovery done\n"); list_resources(sessionid, resourceid); rv = saHpiSessionClose(sessionid); exit(0); } /* * */ static SaErrorT list_resources(SaHpiSessionIdT sessionid,SaHpiResourceIdT resourceid) { SaErrorT rv = SA_OK, rvRdrGet = SA_OK, rvRptGet = SA_OK; SaHpiRptEntryT rptentry; SaHpiEntryIdT rptentryid; SaHpiEntryIdT nextrptentryid; SaHpiEntryIdT entryid; SaHpiEntryIdT nextentryid; SaHpiRdrT rdr; SaHpiResourceIdT l_resourceid; SaHpiTextBufferT working; oh_init_textbuffer(&working); /* walk the RPT list */ rptentryid = SAHPI_FIRST_ENTRY; do { if (fdebug) printf("saHpiRptEntryGet\n"); rvRptGet = saHpiRptEntryGet(sessionid,rptentryid,&nextrptentryid,&rptentry); if ((rvRptGet != SA_OK) || fdebug) printf("RptEntryGet returns %s\n",oh_lookup_error(rvRptGet)); rv = list_rpt(&rptentry, resourceid); if (rvRptGet == SA_OK && (rptentry.ResourceCapabilities & SAHPI_CAPABILITY_RDR) && ((resourceid == 0xFF) || (resourceid == rptentry.ResourceId))) { l_resourceid = rptentry.ResourceId; if (resourceid != 0xFF) nextrptentryid = SAHPI_LAST_ENTRY; /* walk the RDR list for this RPT entry */ entryid = SAHPI_FIRST_ENTRY; if (fdebug) printf("rptentry[%d] resourceid=%d\n", entryid,resourceid); do { rvRdrGet = saHpiRdrGet(sessionid,l_resourceid, entryid,&nextentryid, &rdr); if (fdebug) printf("saHpiRdrGet[%d] rv = %s\n",entryid,oh_lookup_error(rvRdrGet)); if (rvRdrGet == SA_OK) { if (f_listall || f_rdr || f_overview) list_rdr(sessionid, &rptentry, &rdr, l_resourceid); if (f_listall || f_inv) list_inv(sessionid, &rptentry, &rdr, l_resourceid); if (f_listall || f_sensor) list_sens(sessionid, &rptentry, &rdr, l_resourceid); if (f_listall || f_ctrl) list_ctrl(sessionid, &rptentry, &rdr, l_resourceid); if (f_listall || f_wdog) list_wdog(sessionid, &rptentry, &rdr, l_resourceid); if (f_listall || f_ann) list_ann(sessionid, &rptentry, &rdr, l_resourceid); } entryid = nextentryid; } while ((rvRdrGet == SA_OK) && (entryid != SAHPI_LAST_ENTRY)) ; } rptentryid = nextrptentryid; } while ((rvRptGet == SA_OK) && (rptentryid != SAHPI_LAST_ENTRY)); return(rv); } /* * */ static SaErrorT list_rpt(SaHpiRptEntryT *rptptr,SaHpiResourceIdT resourceid) { SaErrorT rv = SA_OK; if ((resourceid == all_resources) || (resourceid == rptptr->ResourceId)) { /* Always print resource header */ if (!f_listall && !f_rpt) printf("\nRPT Tag: %s, ResourceId %d\n",rptptr->ResourceTag.Data, rptptr->ResourceId); oh_print_ep(&rptptr->ResourceEntity, 0); printf("\n"); /* Print details when asked */ if (f_listall || f_rpt) oh_print_rptentry(rptptr, 2); } return(rv); } /* * */ static SaErrorT list_inv(SaHpiSessionIdT sessionid, SaHpiRptEntryT *rptptr, SaHpiRdrT *rdrptr, SaHpiResourceIdT l_resourceid) { SaErrorT rvInvent = SA_OK; SaHpiIdrInfoT idrInfo; SaHpiIdrIdT idrid; SaHpiTextBufferT working; oh_init_textbuffer(&working); if (rdrptr->RdrType == SAHPI_INVENTORY_RDR) { idrid = rdrptr->RdrTypeUnion.InventoryRec.IdrId; rvInvent = saHpiIdrInfoGet( sessionid, l_resourceid, idrid, &idrInfo); if (rvInvent !=SA_OK) { printf("saHpiIdrInfoGet: ResourceId %d IdrId %d, error %s\n", l_resourceid, idrid, oh_lookup_error(rvInvent)); } else { oh_print_idrinfo(&idrInfo, 4); walkInventory(sessionid, l_resourceid, &idrInfo); } } return(rvInvent); } /* * This routine walks the complete inventory idr for this resource. * It does not look for a particular IdrAreaType or IdrFieldType. * Particular type tests are coverred in respecting routines. * **/ static SaErrorT walkInventory( SaHpiSessionIdT sessionid, SaHpiResourceIdT resourceid, SaHpiIdrInfoT *idrInfo) { SaErrorT rv = SA_OK, rvField = SA_OK; SaHpiUint32T numAreas; SaHpiUint32T countAreas = 0; SaHpiUint32T countFields = 0; SaHpiEntryIdT areaId; SaHpiEntryIdT nextareaId; SaHpiIdrAreaTypeT areaType; SaHpiIdrAreaHeaderT areaHeader; SaHpiEntryIdT fieldId; SaHpiEntryIdT nextFieldId; SaHpiIdrFieldTypeT fieldType; SaHpiIdrFieldT thisField; numAreas = idrInfo->NumAreas; areaType = SAHPI_IDR_AREATYPE_UNSPECIFIED; areaId = SAHPI_FIRST_ENTRY; do { rv = saHpiIdrAreaHeaderGet(sessionid, resourceid, idrInfo->IdrId, areaType, areaId, &nextareaId, &areaHeader); if (rv == SA_OK) { countFields = 0; /* Bug #1057934 */ countAreas++; oh_print_idrareaheader(&areaHeader, 8); fieldType = SAHPI_IDR_FIELDTYPE_UNSPECIFIED; fieldId = SAHPI_FIRST_ENTRY; do { rvField = saHpiIdrFieldGet( sessionid, resourceid, idrInfo->IdrId, areaHeader.AreaId, fieldType, fieldId, &nextFieldId, &thisField); if (rvField == SA_OK) { countFields++; oh_print_idrfield(&thisField, 12); } if (fdebug) printf("saHpiIdrFieldGet error %s\n",oh_lookup_error(rvField)); fieldId = nextFieldId; } while ((rvField == SA_OK) && (fieldId != SAHPI_LAST_ENTRY)); if ( countFields != areaHeader.NumFields) printf("Area Header error! areaHeader.NumFields %d, countFields %d\n", areaHeader.NumFields, countFields); } else { printf("saHpiIdrAreaHeaderGet error %s\n",oh_lookup_error(rv)); } areaId = nextareaId; } while ((rv == SA_OK) && (areaId != SAHPI_LAST_ENTRY)); if ((rv == SA_OK) && (countAreas != numAreas)) printf("idrInfo error! idrInfo.NumAreas = %d; countAreas = %d\n", numAreas, countAreas); return(rv); } /* * */ static SaErrorT list_sens(SaHpiSessionIdT sessionid, SaHpiRptEntryT *rptptr, SaHpiRdrT *rdrptr, SaHpiResourceIdT l_resourceid) { SaErrorT rv = SA_OK; SaHpiTextBufferT working; oh_init_textbuffer(&working); if (rdrptr->RdrType == SAHPI_SENSOR_RDR) { if (&rdrptr->RdrTypeUnion.SensorRec == 0) printf("ERROR! Sensor pointer NULL\n"); printf(" Sensor Name: "); rv = oh_print_text(&(rdrptr->IdString)); if (rv) printf("oh_print_text Error=%s\n", oh_lookup_error(rv)); rv = oh_print_ep(&(rdrptr->Entity), 4); if (rv) printf("oh_print_ep Error=%s\n", oh_lookup_error(rv)); rv = oh_print_sensorrec(&rdrptr->RdrTypeUnion.SensorRec, 4); if (rv) printf("oh_print_sensorrec Error=%s\n", oh_lookup_error(rv)); sensor_readingthreshold(sessionid, l_resourceid, rdrptr); } return(rv); } /* * This routine get sensor reading and threshold, and display them. * **/ static void sensor_readingthreshold(SaHpiSessionIdT sessionid, SaHpiResourceIdT resourceid, SaHpiRdrT *rdrptr) { SaHpiSensorRecT *sensorrec; SaHpiSensorNumT sensornum; SaHpiSensorReadingT reading; SaHpiSensorThresholdsT thresh; SaHpiEventStateT events; SaHpiTextBufferT text; SaErrorT rv; sensorrec = &rdrptr->RdrTypeUnion.SensorRec; sensornum = sensorrec->Num; rv = saHpiSensorReadingGet(sessionid,resourceid, sensornum, &reading, &events); if (rv != SA_OK) { printf("\nReadingGet ret=%s\n", oh_lookup_error(rv)); return; } if((rv = oh_decode_eventstate(events, sensorrec->Category, &text)) == SA_OK) { printf("\t Sensor %d state = %s\n", sensornum, text.Data); } else { printf("\n\t Sensor %d state FAILED, %s\n", sensornum, oh_lookup_error(rv)); } if (!reading.IsSupported ) { printf("\t Reading not supported for sensor %d!\n\n", sensornum); return; } if((rv = oh_decode_sensorreading(reading, sensorrec->DataFormat, &text)) == SA_OK) { printf("\t Sensor %d reading = %s\n", sensornum, text.Data); } else { printf("\n\t Sensor %d reading FAILED, %s\n", sensornum, oh_lookup_error(rv)); } rv = saHpiSensorThresholdsGet(sessionid,resourceid, sensornum, &thresh); if (rv != SA_OK) { if (rv == SA_ERR_HPI_INVALID_CMD) { printf("\t Readable thresholds not supported\n\n"); return; } else { printf("\t ThresholdsGet ret=%s\n\n", oh_lookup_error(rv)); return; } } printf( "\t Thresholds:\n" ); if (thresh.LowCritical.IsSupported) { if((rv = oh_decode_sensorreading(thresh.LowCritical, sensorrec->DataFormat, &text)) == SA_OK) { printf( "\t\tLow Critical Threshold: %s\n", text.Data); } else { printf( "\t\tLow Critical Threshold: FAILED %s\n", oh_lookup_error(rv)); } } if (thresh.LowMajor.IsSupported) { if((rv = oh_decode_sensorreading(thresh.LowMajor, sensorrec->DataFormat, &text)) == SA_OK) { printf( "\t\tLow Major Threshold: %s\n", text.Data); } else { printf( "\t\tLow Major Threshold: FAILED %s\n", oh_lookup_error(rv)); } } if (thresh.LowMinor.IsSupported) { if((rv = oh_decode_sensorreading(thresh.LowMinor, sensorrec->DataFormat, &text)) == SA_OK) { printf( "\t\tLow Minor Threshold: %s\n", text.Data); } else { printf( "\t\tLow Minor Threshold: FAILED %s\n", oh_lookup_error(rv)); } } if (thresh.UpCritical.IsSupported) { if((rv = oh_decode_sensorreading(thresh.UpCritical, sensorrec->DataFormat, &text)) == SA_OK) { printf( "\t\tUp Critical Threshold: %s\n", text.Data); } else { printf( "\t\tUp Critical Threshold: FAILED %s\n", oh_lookup_error(rv)); } } if (thresh.UpMajor.IsSupported) { if((rv = oh_decode_sensorreading(thresh.UpMajor, sensorrec->DataFormat, &text)) == SA_OK) { printf( "\t\tUp Major Threshold: %s\n", text.Data); } else { printf( "\t\tUp Major Threshold: FAILED %s\n", oh_lookup_error(rv)); } } if (thresh.UpMinor.IsSupported) { if((rv = oh_decode_sensorreading(thresh.UpMinor, sensorrec->DataFormat, &text)) == SA_OK) { printf( "\t\tUp Minor Threshold: %s\n", text.Data); } else { printf( "\t\tUp Minor Threshold: FAILED %s\n", oh_lookup_error(rv)); } } if (thresh.PosThdHysteresis.IsSupported) { if((rv = oh_decode_sensorreading(thresh.PosThdHysteresis, sensorrec->DataFormat, &text)) == SA_OK) { printf( "\t\tPos Threshold Hysteresis: %s\n", text.Data); } else { printf( "\t\tPos Threshold Hysteresis: FAILED %s\n", oh_lookup_error(rv)); } } if (thresh.NegThdHysteresis.IsSupported) { if((rv = oh_decode_sensorreading(thresh.NegThdHysteresis, sensorrec->DataFormat, &text)) == SA_OK) { printf( "\t\tNeg Threshold Hysteresis: %s\n", text.Data); } else { printf( "\t\tNeg Threshold Hysteresis: FAILED %s\n", oh_lookup_error(rv)); } } printf("\n\n\n"); } /* * */ static SaErrorT list_rdr(SaHpiSessionIdT sessionid, SaHpiRptEntryT *rptptr, SaHpiRdrT *rdrptr, SaHpiResourceIdT l_resourceid) { SaErrorT rv = SA_OK; SaHpiTextBufferT working; oh_init_textbuffer(&working); if (!f_overview) { rv = oh_print_rdr(rdrptr, 4); } else { snprintf((char *)working.Data, SAHPI_MAX_TEXT_BUFFER_LENGTH, " Found %s, RecordId %d", oh_lookup_rdrtype(rdrptr->RdrType), rdrptr->RecordId); rv = oh_print_text(&working); } return(rv); } /* * */ static SaErrorT list_ctrl(SaHpiSessionIdT sessionid, SaHpiRptEntryT *rptptr, SaHpiRdrT *rdrptr, SaHpiResourceIdT l_resourceid) { SaErrorT rv = SA_OK; SaHpiTextBufferT working; oh_init_textbuffer(&working); if (rdrptr->RdrType == SAHPI_CTRL_RDR){ rv = oh_print_ctrlrec(&rdrptr->RdrTypeUnion.CtrlRec, 4); rv = getcontrolstate(sessionid, l_resourceid, rdrptr->RdrTypeUnion.CtrlRec.Num); } return(rv); } /* * */ static SaErrorT getcontrolstate(SaHpiSessionIdT sessionid, SaHpiResourceIdT l_resourceid, SaHpiCtrlNumT num) { SaErrorT rv = SA_OK; SaHpiCtrlModeT mode; SaHpiCtrlStateT state; rv = saHpiControlGet(sessionid, l_resourceid, num, &mode, &state); if (rv == SA_OK) oh_print_ctrlstate(&state, 4); return(rv); } /* * */ static SaErrorT list_wdog(SaHpiSessionIdT sessionid, SaHpiRptEntryT *rptptr, SaHpiRdrT *rdrptr, SaHpiResourceIdT l_resourceid) { SaErrorT rv = SA_OK; SaHpiTextBufferT working; oh_init_textbuffer(&working); if (rdrptr->RdrType == SAHPI_WATCHDOG_RDR) { rv = oh_print_watchdogrec(&rdrptr->RdrTypeUnion.WatchdogRec, 4); } return(rv); } /* * */ static SaErrorT list_ann (SaHpiSessionIdT sessionid, SaHpiRptEntryT *rptptr, SaHpiRdrT *rdrptr, SaHpiResourceIdT l_resourceid) { /* Wave */ return(SA_OK); } /* end hpitree.c */ openhpi-2.14.1/clients/hpialarms.c0000644000076400007640000002526611302567131013770 0ustar /* * Copyright (c) 2003 Intel Corporation. * (C) Copyright IBM Corp 2007 * * 04/15/03 Andy Cress - created * 04/17/03 Andy Cress - mods for resourceid, first good run * 04/23/03 Andy Cress - first run with good ControlStateGet * 04/24/03 Andy Cress - v0.5 with good ControlStateSet * 04/29/03 Andy Cress - v0.6 changed control.oem values * 06/06/03 Andy Cress - v1.0 check for Analog States * 02/23/04 Andy Cress - v1.1 add checking/setting disk LEDs * 10/13/04 Andy Cress - v1.2 add ifdefs for HPI_A & HPI_B, added -d/raw * < ...for more changes look at svn logs... > * * Author(s): * Andy Cress * Renier Morales */ /*M* Copyright (c) 2003, Intel Corporation All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: a.. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. b.. 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. c.. Neither the name of Intel Corporation nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. *M*/ #include #include #include #include #include #define OH_SVN_REV "$Revision: 6571 $" #define uchar unsigned char #define SAHPI_OEM_ALARM_LED 0x10 #define SAHPI_OEM_DISK_LED 0x20 char fdebug = 0; char *states[3] = {"off", "ON ", "unknown" }; uchar fsetid = 0; uchar fid = 0; #define NLEDS 6 struct { uchar fset; uchar val; } leds[NLEDS] = { /* rdr.RdrTypeUnion.CtrlRec.Oem is an index for this */ {/*pwr*/ 0, 0}, {/*crt*/ 0, 0}, {/*maj*/ 0, 0}, {/*min*/ 0, 0}, {/*diska*/ 0, 0}, {/*diskb*/ 0, 0} }; int main(int argc, char **argv) { int c; SaErrorT rv; SaHpiSessionIdT sessionid; SaHpiRptEntryT rptentry; SaHpiEntryIdT rptentryid; SaHpiEntryIdT nextrptentryid; SaHpiEntryIdT entryid; SaHpiEntryIdT nextentryid; SaHpiResourceIdT resourceid; SaHpiRdrT rdr; SaHpiCtrlTypeT ctltype; SaHpiCtrlNumT ctlnum; SaHpiCtrlStateT ctlstate; int raw_val = 0; int j; uchar b = 0; oh_prog_version(argv[0], OH_SVN_REV); while ( (c = getopt( argc, argv,"rxa:b:c:m:n:p:i:d:o?")) != EOF ) switch(c) { case 'c': b = atoi(optarg); /* set crit alarm value */ leds[1].fset = 1; leds[1].val = b; break; case 'm': b = atoi(optarg); /* set major alarm value */ leds[2].fset = 1; leds[2].val = b; break; case 'n': b = atoi(optarg); /* set minor alarm value */ leds[3].fset = 1; leds[3].val = b; break; case 'a': b = atoi(optarg); /* set disk a fault led */ leds[4].fset = 1; leds[4].val = b; break; case 'b': b = atoi(optarg); /* set disk b fault led */ leds[5].fset = 1; leds[5].val = b; break; case 'p': b = atoi(optarg); /* set power alarm value */ leds[0].fset = 1; leds[0].val = b; break; case 'i': fid = atoi(optarg); /* set chassis id on/off */ fsetid = 1; break; case 'd': raw_val = atoi(optarg); /* set raw alarm byte */ break; case 'o': fsetid=1; fid=0; /* set all alarms off */ for (j = 0; j < NLEDS; j++) { leds[j].fset = 1; leds[j].val = 0; } break; case 'x': fdebug = 1; break; /* debug messages */ default: printf("Usage: %s [-a -b -c -i -m -n -p -o -x]\n", argv[0]); printf(" where -c1 sets Critical Alarm on\n"); printf(" -c0 sets Critical Alarm off\n"); printf(" -m1 sets Major Alarm on\n"); printf(" -m0 sets Major Alarm off\n"); printf(" -n1 sets Minor Alarm on\n"); printf(" -n0 sets Minor Alarm off\n"); printf(" -p1 sets Power Alarm on\n"); printf(" -p0 sets Power Alarm off\n"); printf(" -i5 sets Chassis ID on for 5 sec\n"); printf(" -i0 sets Chassis ID off\n"); printf(" -a1 sets Disk A fault on\n"); printf(" -a0 sets Disk A fault off\n"); printf(" -b1 sets Disk B fault on\n"); printf(" -b0 sets Disk B fault off\n"); printf(" -d[byte] sets raw Alarm byte\n"); printf(" -o sets all Alarms off\n"); printf(" -x show eXtra debug messages\n"); exit(1); } rv = saHpiSessionOpen(SAHPI_UNSPECIFIED_DOMAIN_ID,&sessionid,NULL); if (rv != SA_OK) { printf("saHpiSessionOpen error %d\n",rv); exit(-1); } rv = saHpiDiscover(sessionid); if (fdebug) printf("saHpiDiscover complete, rv = %d\n",rv); /* walk the RPT list */ rptentryid = SAHPI_FIRST_ENTRY; while ((rv == SA_OK) && (rptentryid != SAHPI_LAST_ENTRY)) { rv = saHpiRptEntryGet(sessionid,rptentryid,&nextrptentryid,&rptentry); if (rv != SA_OK) printf("RptEntryGet: rv = %d\n",rv); if (rv == SA_OK) { /* Walk the RDR list for this RPT entry */ entryid = SAHPI_FIRST_ENTRY; resourceid = rptentry.ResourceId; /* * Don't stringify here, since OpenHPI returns a valid string, but * a DataLength of zero here (for processor, bios). * rptentry.ResourceTag.Data[rptentry.ResourceTag.DataLength] = 0; */ //if (fdebug) printf("rptentry[%d] resourceid=%d tlen=%d tag: %s\n", entryid, resourceid, rptentry.ResourceTag.DataLength, rptentry.ResourceTag.Data); while ((rv == SA_OK) && (entryid != SAHPI_LAST_ENTRY)) { rv = saHpiRdrGet(sessionid,resourceid, entryid,&nextentryid, &rdr); if (fdebug) printf("saHpiRdrGet[%d] rv = %d\n",entryid,rv); if (rv == SA_OK) { if (rdr.RdrType == SAHPI_CTRL_RDR) { /*type 1 includes alarm LEDs*/ ctlnum = rdr.RdrTypeUnion.CtrlRec.Num; rdr.IdString.Data[rdr.IdString.DataLength] = 0; if (fdebug) printf("Ctl[%d]: %d %d %s\n", ctlnum, rdr.RdrTypeUnion.CtrlRec.Type, rdr.RdrTypeUnion.CtrlRec.OutputType, rdr.IdString.Data); rv = saHpiControlTypeGet(sessionid,resourceid, ctlnum,&ctltype); if (fdebug) printf("saHpiControlTypeGet[%d] rv = %d, type = %d\n",ctlnum,rv,ctltype); rv = saHpiControlGet(sessionid, resourceid, ctlnum, NULL, &ctlstate); if (fdebug) printf("saHpiControlStateGet[%d] rv = %d v = %x\n", ctlnum,rv,ctlstate.StateUnion.Digital); printf("RDR[%d]: ctltype=%d:%d oem=%02x %s \t", rdr.RecordId, rdr.RdrTypeUnion.CtrlRec.Type, rdr.RdrTypeUnion.CtrlRec.OutputType, rdr.RdrTypeUnion.CtrlRec.Oem, rdr.IdString.Data); if (rv == SA_OK) { if (ctlstate.Type == SAHPI_CTRL_TYPE_ANALOG) b = 2; /*Identify*/ else { b = ctlstate.StateUnion.Digital; if (b > 2) b = 2; } printf("state = %s\n",states[b]); } else { printf("\n"); } if (rdr.RdrTypeUnion.CtrlRec.Type == SAHPI_CTRL_TYPE_ANALOG && rdr.RdrTypeUnion.CtrlRec.OutputType == SAHPI_CTRL_LED) { /* This is a Chassis Identify */ if (fsetid) { printf("Setting ID led to %d sec\n", fid); ctlstate.Type = SAHPI_CTRL_TYPE_ANALOG; ctlstate.StateUnion.Analog = fid; rv = saHpiControlSet(sessionid, resourceid, ctlnum, SAHPI_CTRL_MODE_MANUAL, &ctlstate); printf("saHpiControlStateSet[%d] rv = %d\n",ctlnum,rv); } } else if (rdr.RdrTypeUnion.CtrlRec.Type == SAHPI_CTRL_TYPE_DIGITAL && (rdr.RdrTypeUnion.CtrlRec.Oem & 0xf0) == SAHPI_OEM_ALARM_LED && rdr.RdrTypeUnion.CtrlRec.OutputType == SAHPI_CTRL_LED) { /* this is an alarm LED */ b = (uchar)rdr.RdrTypeUnion.CtrlRec.Oem & 0x0f; if ((b < NLEDS) && leds[b].fset) { printf("Setting alarm led %d to %d\n",b,leds[b].val); if (leds[b].val == 0) ctlstate.StateUnion.Digital = SAHPI_CTRL_STATE_OFF; else ctlstate.StateUnion.Digital = SAHPI_CTRL_STATE_ON; rv = saHpiControlSet(sessionid, resourceid, ctlnum, SAHPI_CTRL_MODE_MANUAL, &ctlstate); /* if (fdebug) */ printf("saHpiControlStateSet[%d] rv = %d\n",ctlnum,rv); } } else if (rdr.RdrTypeUnion.CtrlRec.Type == SAHPI_CTRL_TYPE_DIGITAL && (rdr.RdrTypeUnion.CtrlRec.Oem & 0xf0) == SAHPI_OEM_DISK_LED && rdr.RdrTypeUnion.CtrlRec.OutputType == SAHPI_CTRL_LED) { /* this is a disk LED */ b = (uchar)rdr.RdrTypeUnion.CtrlRec.Oem & 0x0f; if ((b < NLEDS) && leds[b].fset) { printf("Setting disk led %d to %d\n",b,leds[b].val); if (leds[b].val == 0) ctlstate.StateUnion.Digital = SAHPI_CTRL_STATE_OFF; else ctlstate.StateUnion.Digital = SAHPI_CTRL_STATE_ON; rv = saHpiControlSet(sessionid, resourceid, ctlnum, SAHPI_CTRL_MODE_MANUAL, &ctlstate); printf("saHpiControlStateSet[%d] rv = %d\n",ctlnum,rv); } } rv = SA_OK; /* ignore errors & continue */ } j++; entryid = nextentryid; } } rptentryid = nextrptentryid; } } rv = saHpiSessionClose(sessionid); exit(0); return(0); } /*-----------Sample output----------------------------------- hpialarmpanel ver 0.6 RptInfo: UpdateCount = 5, UpdateTime = 8a2dc6c0 rptentry[0] resourceid=1 tag: Mullins RDR[45]: ctltype=2:1 oem=0 Chassis Identify Control RDR[48]: ctltype=0:1 oem=10 Front Panel Power Alarm LED state = off RDR[51]: ctltype=0:1 oem=13 Front Panel Minor Alarm LED state = ON RDR[46]: ctltype=0:0 oem=0 Cold Reset Control RDR[49]: ctltype=0:1 oem=11 Front Panel Critical Alarm LED state = off RDR[50]: ctltype=0:1 oem=12 Front Panel Major Alarm LED state = off *-----------------------------------------------------------*/ /* end hpialarmpanel.c */ openhpi-2.14.1/clients/clients.c0000644000076400007640000000267711302567131013452 0ustar /* -*- linux-c -*- * * Copyright (C) 2007-2008, Hewlett-Packard Development Company, LLP * (C) Copyright IBM Corp. 2007 * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This * file and program are licensed under a BSD style license. See * the Copying file included with the OpenHPI distribution for * full licensing terms. * * Author(s): * Shuah Khan * Renier Morales */ #include #include #include #include void oh_prog_version(const char *prog_name, const char *svn_rev_str) { SaHpiUint32T ohpi_major = oHpiVersionGet() >> 48; SaHpiUint32T ohpi_minor = (oHpiVersionGet() << 16) >> 48; SaHpiUint32T ohpi_patch = (oHpiVersionGet() << 32) >> 48; SaHpiVersionT hpiver; char svn_rev[SAHPI_MAX_TEXT_BUFFER_LENGTH]; strncpy(svn_rev, svn_rev_str, SAHPI_MAX_TEXT_BUFFER_LENGTH); svn_rev[strlen(svn_rev_str)-2] = '\0'; printf("%s (rev %s) - This program came with OpenHPI %u.%u.%u\n", prog_name, svn_rev+11, ohpi_major, ohpi_minor, ohpi_patch); hpiver = saHpiVersionGet(); printf("SAF HPI Version %c.0%d.0%d\n\n", (hpiver >> 16) + ('A' - 1), (hpiver & 0x0000FF00) >> 8, hpiver & 0x000000FF); } openhpi-2.14.1/openhpiclient.conf.example0000644000076400007640000000232011302567132015330 0ustar ### OpenHPI client library configuration example file ### ####### ## Section: Domains ## Since each openhpi daemon instance manages a hpi domain, # each domain declaration specifies domain number, hpi daemon host and hpi daemon port. # ## Example domain declarations: # #domain default { # Has to be string "default", no quote. # # Number 0 is not allowed. # host = "my_default_domain_host" # String value. Double quotes required. # port = my_defaultdomain_port # Interger value #} # # If no "default" stanza is declared, # # host = "localhost" and port = 4743 # # are used. # # #domain 1 { # host = "my_domain1_host" # String value. Double quotes required. # port = my_domain1_port # Interger value #} #domain 2 { # host = "my_domain2_host" # String value. Double quotes required. # port = my_domain2_port # Interger value #} #domain 3 { # host = "my_domain3_host" # String value. Double quotes required. # port = my_domain3_port # Interger value #} openhpi-2.14.1/config.guess0000755000076400007640000012753411302567646012537 0ustar #! /bin/sh # Attempt to guess a canonical system name. # Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, # 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008 # Free Software Foundation, Inc. timestamp='2008-01-23' # This file is free software; you can redistribute it and/or modify it # under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU # General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA # 02110-1301, USA. # # As a special exception to the GNU General Public License, if you # distribute this file as part of a program that contains a # configuration script generated by Autoconf, you may include it under # the same distribution terms that you use for the rest of that program. # Originally written by Per Bothner . # Please send patches to . Submit a context # diff and a properly formatted ChangeLog entry. # # This script attempts to guess a canonical system name similar to # config.sub. If it succeeds, it prints the system name on stdout, and # exits with 0. Otherwise, it exits with 1. # # The plan is that this can be called by configure scripts if you # don't specify an explicit build system type. me=`echo "$0" | sed -e 's,.*/,,'` usage="\ Usage: $0 [OPTION] Output the configuration name of the system \`$me' is run on. Operation modes: -h, --help print this help, then exit -t, --time-stamp print date of last modification, then exit -v, --version print version number, then exit Report bugs and patches to ." version="\ GNU config.guess ($timestamp) Originally written by Per Bothner. Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008 Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE." help=" Try \`$me --help' for more information." # Parse command line while test $# -gt 0 ; do case $1 in --time-stamp | --time* | -t ) echo "$timestamp" ; exit ;; --version | -v ) echo "$version" ; exit ;; --help | --h* | -h ) echo "$usage"; exit ;; -- ) # Stop option processing shift; break ;; - ) # Use stdin as input. break ;; -* ) echo "$me: invalid option $1$help" >&2 exit 1 ;; * ) break ;; esac done if test $# != 0; then echo "$me: too many arguments$help" >&2 exit 1 fi trap 'exit 1' 1 2 15 # CC_FOR_BUILD -- compiler used by this script. Note that the use of a # compiler to aid in system detection is discouraged as it requires # temporary files to be created and, as you can see below, it is a # headache to deal with in a portable fashion. # Historically, `CC_FOR_BUILD' used to be named `HOST_CC'. We still # use `HOST_CC' if defined, but it is deprecated. # Portable tmp directory creation inspired by the Autoconf team. set_cc_for_build=' trap "exitcode=\$?; (rm -f \$tmpfiles 2>/dev/null; rmdir \$tmp 2>/dev/null) && exit \$exitcode" 0 ; trap "rm -f \$tmpfiles 2>/dev/null; rmdir \$tmp 2>/dev/null; exit 1" 1 2 13 15 ; : ${TMPDIR=/tmp} ; { tmp=`(umask 077 && mktemp -d "$TMPDIR/cgXXXXXX") 2>/dev/null` && test -n "$tmp" && test -d "$tmp" ; } || { test -n "$RANDOM" && tmp=$TMPDIR/cg$$-$RANDOM && (umask 077 && mkdir $tmp) ; } || { tmp=$TMPDIR/cg-$$ && (umask 077 && mkdir $tmp) && echo "Warning: creating insecure temp directory" >&2 ; } || { echo "$me: cannot create a temporary directory in $TMPDIR" >&2 ; exit 1 ; } ; dummy=$tmp/dummy ; tmpfiles="$dummy.c $dummy.o $dummy.rel $dummy" ; case $CC_FOR_BUILD,$HOST_CC,$CC in ,,) echo "int x;" > $dummy.c ; for c in cc gcc c89 c99 ; do if ($c -c -o $dummy.o $dummy.c) >/dev/null 2>&1 ; then CC_FOR_BUILD="$c"; break ; fi ; done ; if test x"$CC_FOR_BUILD" = x ; then CC_FOR_BUILD=no_compiler_found ; fi ;; ,,*) CC_FOR_BUILD=$CC ;; ,*,*) CC_FOR_BUILD=$HOST_CC ;; esac ; set_cc_for_build= ;' # This is needed to find uname on a Pyramid OSx when run in the BSD universe. # (ghazi@noc.rutgers.edu 1994-08-24) if (test -f /.attbin/uname) >/dev/null 2>&1 ; then PATH=$PATH:/.attbin ; export PATH fi UNAME_MACHINE=`(uname -m) 2>/dev/null` || UNAME_MACHINE=unknown UNAME_RELEASE=`(uname -r) 2>/dev/null` || UNAME_RELEASE=unknown UNAME_SYSTEM=`(uname -s) 2>/dev/null` || UNAME_SYSTEM=unknown UNAME_VERSION=`(uname -v) 2>/dev/null` || UNAME_VERSION=unknown # Note: order is significant - the case branches are not exclusive. case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in *:NetBSD:*:*) # NetBSD (nbsd) targets should (where applicable) match one or # more of the tupples: *-*-netbsdelf*, *-*-netbsdaout*, # *-*-netbsdecoff* and *-*-netbsd*. For targets that recently # switched to ELF, *-*-netbsd* would select the old # object file format. This provides both forward # compatibility and a consistent mechanism for selecting the # object file format. # # Note: NetBSD doesn't particularly care about the vendor # portion of the name. We always set it to "unknown". sysctl="sysctl -n hw.machine_arch" UNAME_MACHINE_ARCH=`(/sbin/$sysctl 2>/dev/null || \ /usr/sbin/$sysctl 2>/dev/null || echo unknown)` case "${UNAME_MACHINE_ARCH}" in armeb) machine=armeb-unknown ;; arm*) machine=arm-unknown ;; sh3el) machine=shl-unknown ;; sh3eb) machine=sh-unknown ;; sh5el) machine=sh5le-unknown ;; *) machine=${UNAME_MACHINE_ARCH}-unknown ;; esac # The Operating System including object format, if it has switched # to ELF recently, or will in the future. case "${UNAME_MACHINE_ARCH}" in arm*|i386|m68k|ns32k|sh3*|sparc|vax) eval $set_cc_for_build if echo __ELF__ | $CC_FOR_BUILD -E - 2>/dev/null \ | grep __ELF__ >/dev/null then # Once all utilities can be ECOFF (netbsdecoff) or a.out (netbsdaout). # Return netbsd for either. FIX? os=netbsd else os=netbsdelf fi ;; *) os=netbsd ;; esac # The OS release # Debian GNU/NetBSD machines have a different userland, and # thus, need a distinct triplet. However, they do not need # kernel version information, so it can be replaced with a # suitable tag, in the style of linux-gnu. case "${UNAME_VERSION}" in Debian*) release='-gnu' ;; *) release=`echo ${UNAME_RELEASE}|sed -e 's/[-_].*/\./'` ;; esac # Since CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM: # contains redundant information, the shorter form: # CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM is used. echo "${machine}-${os}${release}" exit ;; *:OpenBSD:*:*) UNAME_MACHINE_ARCH=`arch | sed 's/OpenBSD.//'` echo ${UNAME_MACHINE_ARCH}-unknown-openbsd${UNAME_RELEASE} exit ;; *:ekkoBSD:*:*) echo ${UNAME_MACHINE}-unknown-ekkobsd${UNAME_RELEASE} exit ;; *:SolidBSD:*:*) echo ${UNAME_MACHINE}-unknown-solidbsd${UNAME_RELEASE} exit ;; macppc:MirBSD:*:*) echo powerpc-unknown-mirbsd${UNAME_RELEASE} exit ;; *:MirBSD:*:*) echo ${UNAME_MACHINE}-unknown-mirbsd${UNAME_RELEASE} exit ;; alpha:OSF1:*:*) case $UNAME_RELEASE in *4.0) UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $3}'` ;; *5.*) UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $4}'` ;; esac # According to Compaq, /usr/sbin/psrinfo has been available on # OSF/1 and Tru64 systems produced since 1995. I hope that # covers most systems running today. This code pipes the CPU # types through head -n 1, so we only detect the type of CPU 0. ALPHA_CPU_TYPE=`/usr/sbin/psrinfo -v | sed -n -e 's/^ The alpha \(.*\) processor.*$/\1/p' | head -n 1` case "$ALPHA_CPU_TYPE" in "EV4 (21064)") UNAME_MACHINE="alpha" ;; "EV4.5 (21064)") UNAME_MACHINE="alpha" ;; "LCA4 (21066/21068)") UNAME_MACHINE="alpha" ;; "EV5 (21164)") UNAME_MACHINE="alphaev5" ;; "EV5.6 (21164A)") UNAME_MACHINE="alphaev56" ;; "EV5.6 (21164PC)") UNAME_MACHINE="alphapca56" ;; "EV5.7 (21164PC)") UNAME_MACHINE="alphapca57" ;; "EV6 (21264)") UNAME_MACHINE="alphaev6" ;; "EV6.7 (21264A)") UNAME_MACHINE="alphaev67" ;; "EV6.8CB (21264C)") UNAME_MACHINE="alphaev68" ;; "EV6.8AL (21264B)") UNAME_MACHINE="alphaev68" ;; "EV6.8CX (21264D)") UNAME_MACHINE="alphaev68" ;; "EV6.9A (21264/EV69A)") UNAME_MACHINE="alphaev69" ;; "EV7 (21364)") UNAME_MACHINE="alphaev7" ;; "EV7.9 (21364A)") UNAME_MACHINE="alphaev79" ;; esac # A Pn.n version is a patched version. # A Vn.n version is a released version. # A Tn.n version is a released field test version. # A Xn.n version is an unreleased experimental baselevel. # 1.2 uses "1.2" for uname -r. echo ${UNAME_MACHINE}-dec-osf`echo ${UNAME_RELEASE} | sed -e 's/^[PVTX]//' | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'` exit ;; Alpha\ *:Windows_NT*:*) # How do we know it's Interix rather than the generic POSIX subsystem? # Should we change UNAME_MACHINE based on the output of uname instead # of the specific Alpha model? echo alpha-pc-interix exit ;; 21064:Windows_NT:50:3) echo alpha-dec-winnt3.5 exit ;; Amiga*:UNIX_System_V:4.0:*) echo m68k-unknown-sysv4 exit ;; *:[Aa]miga[Oo][Ss]:*:*) echo ${UNAME_MACHINE}-unknown-amigaos exit ;; *:[Mm]orph[Oo][Ss]:*:*) echo ${UNAME_MACHINE}-unknown-morphos exit ;; *:OS/390:*:*) echo i370-ibm-openedition exit ;; *:z/VM:*:*) echo s390-ibm-zvmoe exit ;; *:OS400:*:*) echo powerpc-ibm-os400 exit ;; arm:RISC*:1.[012]*:*|arm:riscix:1.[012]*:*) echo arm-acorn-riscix${UNAME_RELEASE} exit ;; arm:riscos:*:*|arm:RISCOS:*:*) echo arm-unknown-riscos exit ;; SR2?01:HI-UX/MPP:*:* | SR8000:HI-UX/MPP:*:*) echo hppa1.1-hitachi-hiuxmpp exit ;; Pyramid*:OSx*:*:* | MIS*:OSx*:*:* | MIS*:SMP_DC-OSx*:*:*) # akee@wpdis03.wpafb.af.mil (Earle F. Ake) contributed MIS and NILE. if test "`(/bin/universe) 2>/dev/null`" = att ; then echo pyramid-pyramid-sysv3 else echo pyramid-pyramid-bsd fi exit ;; NILE*:*:*:dcosx) echo pyramid-pyramid-svr4 exit ;; DRS?6000:unix:4.0:6*) echo sparc-icl-nx6 exit ;; DRS?6000:UNIX_SV:4.2*:7* | DRS?6000:isis:4.2*:7*) case `/usr/bin/uname -p` in sparc) echo sparc-icl-nx7; exit ;; esac ;; sun4H:SunOS:5.*:*) echo sparc-hal-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` exit ;; sun4*:SunOS:5.*:* | tadpole*:SunOS:5.*:*) echo sparc-sun-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` exit ;; i86pc:SunOS:5.*:* | i86xen:SunOS:5.*:*) echo i386-pc-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` exit ;; sun4*:SunOS:6*:*) # According to config.sub, this is the proper way to canonicalize # SunOS6. Hard to guess exactly what SunOS6 will be like, but # it's likely to be more like Solaris than SunOS4. echo sparc-sun-solaris3`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` exit ;; sun4*:SunOS:*:*) case "`/usr/bin/arch -k`" in Series*|S4*) UNAME_RELEASE=`uname -v` ;; esac # Japanese Language versions have a version number like `4.1.3-JL'. echo sparc-sun-sunos`echo ${UNAME_RELEASE}|sed -e 's/-/_/'` exit ;; sun3*:SunOS:*:*) echo m68k-sun-sunos${UNAME_RELEASE} exit ;; sun*:*:4.2BSD:*) UNAME_RELEASE=`(sed 1q /etc/motd | awk '{print substr($5,1,3)}') 2>/dev/null` test "x${UNAME_RELEASE}" = "x" && UNAME_RELEASE=3 case "`/bin/arch`" in sun3) echo m68k-sun-sunos${UNAME_RELEASE} ;; sun4) echo sparc-sun-sunos${UNAME_RELEASE} ;; esac exit ;; aushp:SunOS:*:*) echo sparc-auspex-sunos${UNAME_RELEASE} exit ;; # The situation for MiNT is a little confusing. The machine name # can be virtually everything (everything which is not # "atarist" or "atariste" at least should have a processor # > m68000). The system name ranges from "MiNT" over "FreeMiNT" # to the lowercase version "mint" (or "freemint"). Finally # the system name "TOS" denotes a system which is actually not # MiNT. But MiNT is downward compatible to TOS, so this should # be no problem. atarist[e]:*MiNT:*:* | atarist[e]:*mint:*:* | atarist[e]:*TOS:*:*) echo m68k-atari-mint${UNAME_RELEASE} exit ;; atari*:*MiNT:*:* | atari*:*mint:*:* | atarist[e]:*TOS:*:*) echo m68k-atari-mint${UNAME_RELEASE} exit ;; *falcon*:*MiNT:*:* | *falcon*:*mint:*:* | *falcon*:*TOS:*:*) echo m68k-atari-mint${UNAME_RELEASE} exit ;; milan*:*MiNT:*:* | milan*:*mint:*:* | *milan*:*TOS:*:*) echo m68k-milan-mint${UNAME_RELEASE} exit ;; hades*:*MiNT:*:* | hades*:*mint:*:* | *hades*:*TOS:*:*) echo m68k-hades-mint${UNAME_RELEASE} exit ;; *:*MiNT:*:* | *:*mint:*:* | *:*TOS:*:*) echo m68k-unknown-mint${UNAME_RELEASE} exit ;; m68k:machten:*:*) echo m68k-apple-machten${UNAME_RELEASE} exit ;; powerpc:machten:*:*) echo powerpc-apple-machten${UNAME_RELEASE} exit ;; RISC*:Mach:*:*) echo mips-dec-mach_bsd4.3 exit ;; RISC*:ULTRIX:*:*) echo mips-dec-ultrix${UNAME_RELEASE} exit ;; VAX*:ULTRIX*:*:*) echo vax-dec-ultrix${UNAME_RELEASE} exit ;; 2020:CLIX:*:* | 2430:CLIX:*:*) echo clipper-intergraph-clix${UNAME_RELEASE} exit ;; mips:*:*:UMIPS | mips:*:*:RISCos) eval $set_cc_for_build sed 's/^ //' << EOF >$dummy.c #ifdef __cplusplus #include /* for printf() prototype */ int main (int argc, char *argv[]) { #else int main (argc, argv) int argc; char *argv[]; { #endif #if defined (host_mips) && defined (MIPSEB) #if defined (SYSTYPE_SYSV) printf ("mips-mips-riscos%ssysv\n", argv[1]); exit (0); #endif #if defined (SYSTYPE_SVR4) printf ("mips-mips-riscos%ssvr4\n", argv[1]); exit (0); #endif #if defined (SYSTYPE_BSD43) || defined(SYSTYPE_BSD) printf ("mips-mips-riscos%sbsd\n", argv[1]); exit (0); #endif #endif exit (-1); } EOF $CC_FOR_BUILD -o $dummy $dummy.c && dummyarg=`echo "${UNAME_RELEASE}" | sed -n 's/\([0-9]*\).*/\1/p'` && SYSTEM_NAME=`$dummy $dummyarg` && { echo "$SYSTEM_NAME"; exit; } echo mips-mips-riscos${UNAME_RELEASE} exit ;; Motorola:PowerMAX_OS:*:*) echo powerpc-motorola-powermax exit ;; Motorola:*:4.3:PL8-*) echo powerpc-harris-powermax exit ;; Night_Hawk:*:*:PowerMAX_OS | Synergy:PowerMAX_OS:*:*) echo powerpc-harris-powermax exit ;; Night_Hawk:Power_UNIX:*:*) echo powerpc-harris-powerunix exit ;; m88k:CX/UX:7*:*) echo m88k-harris-cxux7 exit ;; m88k:*:4*:R4*) echo m88k-motorola-sysv4 exit ;; m88k:*:3*:R3*) echo m88k-motorola-sysv3 exit ;; AViiON:dgux:*:*) # DG/UX returns AViiON for all architectures UNAME_PROCESSOR=`/usr/bin/uname -p` if [ $UNAME_PROCESSOR = mc88100 ] || [ $UNAME_PROCESSOR = mc88110 ] then if [ ${TARGET_BINARY_INTERFACE}x = m88kdguxelfx ] || \ [ ${TARGET_BINARY_INTERFACE}x = x ] then echo m88k-dg-dgux${UNAME_RELEASE} else echo m88k-dg-dguxbcs${UNAME_RELEASE} fi else echo i586-dg-dgux${UNAME_RELEASE} fi exit ;; M88*:DolphinOS:*:*) # DolphinOS (SVR3) echo m88k-dolphin-sysv3 exit ;; M88*:*:R3*:*) # Delta 88k system running SVR3 echo m88k-motorola-sysv3 exit ;; XD88*:*:*:*) # Tektronix XD88 system running UTekV (SVR3) echo m88k-tektronix-sysv3 exit ;; Tek43[0-9][0-9]:UTek:*:*) # Tektronix 4300 system running UTek (BSD) echo m68k-tektronix-bsd exit ;; *:IRIX*:*:*) echo mips-sgi-irix`echo ${UNAME_RELEASE}|sed -e 's/-/_/g'` exit ;; ????????:AIX?:[12].1:2) # AIX 2.2.1 or AIX 2.1.1 is RT/PC AIX. echo romp-ibm-aix # uname -m gives an 8 hex-code CPU id exit ;; # Note that: echo "'`uname -s`'" gives 'AIX ' i*86:AIX:*:*) echo i386-ibm-aix exit ;; ia64:AIX:*:*) if [ -x /usr/bin/oslevel ] ; then IBM_REV=`/usr/bin/oslevel` else IBM_REV=${UNAME_VERSION}.${UNAME_RELEASE} fi echo ${UNAME_MACHINE}-ibm-aix${IBM_REV} exit ;; *:AIX:2:3) if grep bos325 /usr/include/stdio.h >/dev/null 2>&1; then eval $set_cc_for_build sed 's/^ //' << EOF >$dummy.c #include main() { if (!__power_pc()) exit(1); puts("powerpc-ibm-aix3.2.5"); exit(0); } EOF if $CC_FOR_BUILD -o $dummy $dummy.c && SYSTEM_NAME=`$dummy` then echo "$SYSTEM_NAME" else echo rs6000-ibm-aix3.2.5 fi elif grep bos324 /usr/include/stdio.h >/dev/null 2>&1; then echo rs6000-ibm-aix3.2.4 else echo rs6000-ibm-aix3.2 fi exit ;; *:AIX:*:[456]) IBM_CPU_ID=`/usr/sbin/lsdev -C -c processor -S available | sed 1q | awk '{ print $1 }'` if /usr/sbin/lsattr -El ${IBM_CPU_ID} | grep ' POWER' >/dev/null 2>&1; then IBM_ARCH=rs6000 else IBM_ARCH=powerpc fi if [ -x /usr/bin/oslevel ] ; then IBM_REV=`/usr/bin/oslevel` else IBM_REV=${UNAME_VERSION}.${UNAME_RELEASE} fi echo ${IBM_ARCH}-ibm-aix${IBM_REV} exit ;; *:AIX:*:*) echo rs6000-ibm-aix exit ;; ibmrt:4.4BSD:*|romp-ibm:BSD:*) echo romp-ibm-bsd4.4 exit ;; ibmrt:*BSD:*|romp-ibm:BSD:*) # covers RT/PC BSD and echo romp-ibm-bsd${UNAME_RELEASE} # 4.3 with uname added to exit ;; # report: romp-ibm BSD 4.3 *:BOSX:*:*) echo rs6000-bull-bosx exit ;; DPX/2?00:B.O.S.:*:*) echo m68k-bull-sysv3 exit ;; 9000/[34]??:4.3bsd:1.*:*) echo m68k-hp-bsd exit ;; hp300:4.4BSD:*:* | 9000/[34]??:4.3bsd:2.*:*) echo m68k-hp-bsd4.4 exit ;; 9000/[34678]??:HP-UX:*:*) HPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'` case "${UNAME_MACHINE}" in 9000/31? ) HP_ARCH=m68000 ;; 9000/[34]?? ) HP_ARCH=m68k ;; 9000/[678][0-9][0-9]) if [ -x /usr/bin/getconf ]; then sc_cpu_version=`/usr/bin/getconf SC_CPU_VERSION 2>/dev/null` sc_kernel_bits=`/usr/bin/getconf SC_KERNEL_BITS 2>/dev/null` case "${sc_cpu_version}" in 523) HP_ARCH="hppa1.0" ;; # CPU_PA_RISC1_0 528) HP_ARCH="hppa1.1" ;; # CPU_PA_RISC1_1 532) # CPU_PA_RISC2_0 case "${sc_kernel_bits}" in 32) HP_ARCH="hppa2.0n" ;; 64) HP_ARCH="hppa2.0w" ;; '') HP_ARCH="hppa2.0" ;; # HP-UX 10.20 esac ;; esac fi if [ "${HP_ARCH}" = "" ]; then eval $set_cc_for_build sed 's/^ //' << EOF >$dummy.c #define _HPUX_SOURCE #include #include int main () { #if defined(_SC_KERNEL_BITS) long bits = sysconf(_SC_KERNEL_BITS); #endif long cpu = sysconf (_SC_CPU_VERSION); switch (cpu) { case CPU_PA_RISC1_0: puts ("hppa1.0"); break; case CPU_PA_RISC1_1: puts ("hppa1.1"); break; case CPU_PA_RISC2_0: #if defined(_SC_KERNEL_BITS) switch (bits) { case 64: puts ("hppa2.0w"); break; case 32: puts ("hppa2.0n"); break; default: puts ("hppa2.0"); break; } break; #else /* !defined(_SC_KERNEL_BITS) */ puts ("hppa2.0"); break; #endif default: puts ("hppa1.0"); break; } exit (0); } EOF (CCOPTS= $CC_FOR_BUILD -o $dummy $dummy.c 2>/dev/null) && HP_ARCH=`$dummy` test -z "$HP_ARCH" && HP_ARCH=hppa fi ;; esac if [ ${HP_ARCH} = "hppa2.0w" ] then eval $set_cc_for_build # hppa2.0w-hp-hpux* has a 64-bit kernel and a compiler generating # 32-bit code. hppa64-hp-hpux* has the same kernel and a compiler # generating 64-bit code. GNU and HP use different nomenclature: # # $ CC_FOR_BUILD=cc ./config.guess # => hppa2.0w-hp-hpux11.23 # $ CC_FOR_BUILD="cc +DA2.0w" ./config.guess # => hppa64-hp-hpux11.23 if echo __LP64__ | (CCOPTS= $CC_FOR_BUILD -E - 2>/dev/null) | grep __LP64__ >/dev/null then HP_ARCH="hppa2.0w" else HP_ARCH="hppa64" fi fi echo ${HP_ARCH}-hp-hpux${HPUX_REV} exit ;; ia64:HP-UX:*:*) HPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'` echo ia64-hp-hpux${HPUX_REV} exit ;; 3050*:HI-UX:*:*) eval $set_cc_for_build sed 's/^ //' << EOF >$dummy.c #include int main () { long cpu = sysconf (_SC_CPU_VERSION); /* The order matters, because CPU_IS_HP_MC68K erroneously returns true for CPU_PA_RISC1_0. CPU_IS_PA_RISC returns correct results, however. */ if (CPU_IS_PA_RISC (cpu)) { switch (cpu) { case CPU_PA_RISC1_0: puts ("hppa1.0-hitachi-hiuxwe2"); break; case CPU_PA_RISC1_1: puts ("hppa1.1-hitachi-hiuxwe2"); break; case CPU_PA_RISC2_0: puts ("hppa2.0-hitachi-hiuxwe2"); break; default: puts ("hppa-hitachi-hiuxwe2"); break; } } else if (CPU_IS_HP_MC68K (cpu)) puts ("m68k-hitachi-hiuxwe2"); else puts ("unknown-hitachi-hiuxwe2"); exit (0); } EOF $CC_FOR_BUILD -o $dummy $dummy.c && SYSTEM_NAME=`$dummy` && { echo "$SYSTEM_NAME"; exit; } echo unknown-hitachi-hiuxwe2 exit ;; 9000/7??:4.3bsd:*:* | 9000/8?[79]:4.3bsd:*:* ) echo hppa1.1-hp-bsd exit ;; 9000/8??:4.3bsd:*:*) echo hppa1.0-hp-bsd exit ;; *9??*:MPE/iX:*:* | *3000*:MPE/iX:*:*) echo hppa1.0-hp-mpeix exit ;; hp7??:OSF1:*:* | hp8?[79]:OSF1:*:* ) echo hppa1.1-hp-osf exit ;; hp8??:OSF1:*:*) echo hppa1.0-hp-osf exit ;; i*86:OSF1:*:*) if [ -x /usr/sbin/sysversion ] ; then echo ${UNAME_MACHINE}-unknown-osf1mk else echo ${UNAME_MACHINE}-unknown-osf1 fi exit ;; parisc*:Lites*:*:*) echo hppa1.1-hp-lites exit ;; C1*:ConvexOS:*:* | convex:ConvexOS:C1*:*) echo c1-convex-bsd exit ;; C2*:ConvexOS:*:* | convex:ConvexOS:C2*:*) if getsysinfo -f scalar_acc then echo c32-convex-bsd else echo c2-convex-bsd fi exit ;; C34*:ConvexOS:*:* | convex:ConvexOS:C34*:*) echo c34-convex-bsd exit ;; C38*:ConvexOS:*:* | convex:ConvexOS:C38*:*) echo c38-convex-bsd exit ;; C4*:ConvexOS:*:* | convex:ConvexOS:C4*:*) echo c4-convex-bsd exit ;; CRAY*Y-MP:*:*:*) echo ymp-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' exit ;; CRAY*[A-Z]90:*:*:*) echo ${UNAME_MACHINE}-cray-unicos${UNAME_RELEASE} \ | sed -e 's/CRAY.*\([A-Z]90\)/\1/' \ -e y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/ \ -e 's/\.[^.]*$/.X/' exit ;; CRAY*TS:*:*:*) echo t90-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' exit ;; CRAY*T3E:*:*:*) echo alphaev5-cray-unicosmk${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' exit ;; CRAY*SV1:*:*:*) echo sv1-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' exit ;; *:UNICOS/mp:*:*) echo craynv-cray-unicosmp${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' exit ;; F30[01]:UNIX_System_V:*:* | F700:UNIX_System_V:*:*) FUJITSU_PROC=`uname -m | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'` FUJITSU_SYS=`uname -p | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/\///'` FUJITSU_REL=`echo ${UNAME_RELEASE} | sed -e 's/ /_/'` echo "${FUJITSU_PROC}-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}" exit ;; 5000:UNIX_System_V:4.*:*) FUJITSU_SYS=`uname -p | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/\///'` FUJITSU_REL=`echo ${UNAME_RELEASE} | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/ /_/'` echo "sparc-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}" exit ;; i*86:BSD/386:*:* | i*86:BSD/OS:*:* | *:Ascend\ Embedded/OS:*:*) echo ${UNAME_MACHINE}-pc-bsdi${UNAME_RELEASE} exit ;; sparc*:BSD/OS:*:*) echo sparc-unknown-bsdi${UNAME_RELEASE} exit ;; *:BSD/OS:*:*) echo ${UNAME_MACHINE}-unknown-bsdi${UNAME_RELEASE} exit ;; *:FreeBSD:*:*) case ${UNAME_MACHINE} in pc98) echo i386-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;; amd64) echo x86_64-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;; *) echo ${UNAME_MACHINE}-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;; esac exit ;; i*:CYGWIN*:*) echo ${UNAME_MACHINE}-pc-cygwin exit ;; *:MINGW*:*) echo ${UNAME_MACHINE}-pc-mingw32 exit ;; i*:windows32*:*) # uname -m includes "-pc" on this system. echo ${UNAME_MACHINE}-mingw32 exit ;; i*:PW*:*) echo ${UNAME_MACHINE}-pc-pw32 exit ;; *:Interix*:[3456]*) case ${UNAME_MACHINE} in x86) echo i586-pc-interix${UNAME_RELEASE} exit ;; EM64T | authenticamd) echo x86_64-unknown-interix${UNAME_RELEASE} exit ;; IA64) echo ia64-unknown-interix${UNAME_RELEASE} exit ;; esac ;; [345]86:Windows_95:* | [345]86:Windows_98:* | [345]86:Windows_NT:*) echo i${UNAME_MACHINE}-pc-mks exit ;; i*:Windows_NT*:* | Pentium*:Windows_NT*:*) # How do we know it's Interix rather than the generic POSIX subsystem? # It also conflicts with pre-2.0 versions of AT&T UWIN. Should we # UNAME_MACHINE based on the output of uname instead of i386? echo i586-pc-interix exit ;; i*:UWIN*:*) echo ${UNAME_MACHINE}-pc-uwin exit ;; amd64:CYGWIN*:*:* | x86_64:CYGWIN*:*:*) echo x86_64-unknown-cygwin exit ;; p*:CYGWIN*:*) echo powerpcle-unknown-cygwin exit ;; prep*:SunOS:5.*:*) echo powerpcle-unknown-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` exit ;; *:GNU:*:*) # the GNU system echo `echo ${UNAME_MACHINE}|sed -e 's,[-/].*$,,'`-unknown-gnu`echo ${UNAME_RELEASE}|sed -e 's,/.*$,,'` exit ;; *:GNU/*:*:*) # other systems with GNU libc and userland echo ${UNAME_MACHINE}-unknown-`echo ${UNAME_SYSTEM} | sed 's,^[^/]*/,,' | tr '[A-Z]' '[a-z]'``echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'`-gnu exit ;; i*86:Minix:*:*) echo ${UNAME_MACHINE}-pc-minix exit ;; arm*:Linux:*:*) eval $set_cc_for_build if echo __ARM_EABI__ | $CC_FOR_BUILD -E - 2>/dev/null \ | grep -q __ARM_EABI__ then echo ${UNAME_MACHINE}-unknown-linux-gnu else echo ${UNAME_MACHINE}-unknown-linux-gnueabi fi exit ;; avr32*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-gnu exit ;; cris:Linux:*:*) echo cris-axis-linux-gnu exit ;; crisv32:Linux:*:*) echo crisv32-axis-linux-gnu exit ;; frv:Linux:*:*) echo frv-unknown-linux-gnu exit ;; ia64:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-gnu exit ;; m32r*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-gnu exit ;; m68*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-gnu exit ;; mips:Linux:*:*) eval $set_cc_for_build sed 's/^ //' << EOF >$dummy.c #undef CPU #undef mips #undef mipsel #if defined(__MIPSEL__) || defined(__MIPSEL) || defined(_MIPSEL) || defined(MIPSEL) CPU=mipsel #else #if defined(__MIPSEB__) || defined(__MIPSEB) || defined(_MIPSEB) || defined(MIPSEB) CPU=mips #else CPU= #endif #endif EOF eval "`$CC_FOR_BUILD -E $dummy.c 2>/dev/null | sed -n ' /^CPU/{ s: ::g p }'`" test x"${CPU}" != x && { echo "${CPU}-unknown-linux-gnu"; exit; } ;; mips64:Linux:*:*) eval $set_cc_for_build sed 's/^ //' << EOF >$dummy.c #undef CPU #undef mips64 #undef mips64el #if defined(__MIPSEL__) || defined(__MIPSEL) || defined(_MIPSEL) || defined(MIPSEL) CPU=mips64el #else #if defined(__MIPSEB__) || defined(__MIPSEB) || defined(_MIPSEB) || defined(MIPSEB) CPU=mips64 #else CPU= #endif #endif EOF eval "`$CC_FOR_BUILD -E $dummy.c 2>/dev/null | sed -n ' /^CPU/{ s: ::g p }'`" test x"${CPU}" != x && { echo "${CPU}-unknown-linux-gnu"; exit; } ;; or32:Linux:*:*) echo or32-unknown-linux-gnu exit ;; ppc:Linux:*:*) echo powerpc-unknown-linux-gnu exit ;; ppc64:Linux:*:*) echo powerpc64-unknown-linux-gnu exit ;; alpha:Linux:*:*) case `sed -n '/^cpu model/s/^.*: \(.*\)/\1/p' < /proc/cpuinfo` in EV5) UNAME_MACHINE=alphaev5 ;; EV56) UNAME_MACHINE=alphaev56 ;; PCA56) UNAME_MACHINE=alphapca56 ;; PCA57) UNAME_MACHINE=alphapca56 ;; EV6) UNAME_MACHINE=alphaev6 ;; EV67) UNAME_MACHINE=alphaev67 ;; EV68*) UNAME_MACHINE=alphaev68 ;; esac objdump --private-headers /bin/sh | grep ld.so.1 >/dev/null if test "$?" = 0 ; then LIBC="libc1" ; else LIBC="" ; fi echo ${UNAME_MACHINE}-unknown-linux-gnu${LIBC} exit ;; parisc:Linux:*:* | hppa:Linux:*:*) # Look for CPU level case `grep '^cpu[^a-z]*:' /proc/cpuinfo 2>/dev/null | cut -d' ' -f2` in PA7*) echo hppa1.1-unknown-linux-gnu ;; PA8*) echo hppa2.0-unknown-linux-gnu ;; *) echo hppa-unknown-linux-gnu ;; esac exit ;; parisc64:Linux:*:* | hppa64:Linux:*:*) echo hppa64-unknown-linux-gnu exit ;; s390:Linux:*:* | s390x:Linux:*:*) echo ${UNAME_MACHINE}-ibm-linux exit ;; sh64*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-gnu exit ;; sh*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-gnu exit ;; sparc:Linux:*:* | sparc64:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-gnu exit ;; vax:Linux:*:*) echo ${UNAME_MACHINE}-dec-linux-gnu exit ;; x86_64:Linux:*:*) echo x86_64-unknown-linux-gnu exit ;; xtensa*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-gnu exit ;; i*86:Linux:*:*) # The BFD linker knows what the default object file format is, so # first see if it will tell us. cd to the root directory to prevent # problems with other programs or directories called `ld' in the path. # Set LC_ALL=C to ensure ld outputs messages in English. ld_supported_targets=`cd /; LC_ALL=C ld --help 2>&1 \ | sed -ne '/supported targets:/!d s/[ ][ ]*/ /g s/.*supported targets: *// s/ .*// p'` case "$ld_supported_targets" in elf32-i386) TENTATIVE="${UNAME_MACHINE}-pc-linux-gnu" ;; a.out-i386-linux) echo "${UNAME_MACHINE}-pc-linux-gnuaout" exit ;; coff-i386) echo "${UNAME_MACHINE}-pc-linux-gnucoff" exit ;; "") # Either a pre-BFD a.out linker (linux-gnuoldld) or # one that does not give us useful --help. echo "${UNAME_MACHINE}-pc-linux-gnuoldld" exit ;; esac # Determine whether the default compiler is a.out or elf eval $set_cc_for_build sed 's/^ //' << EOF >$dummy.c #include #ifdef __ELF__ # ifdef __GLIBC__ # if __GLIBC__ >= 2 LIBC=gnu # else LIBC=gnulibc1 # endif # else LIBC=gnulibc1 # endif #else #if defined(__INTEL_COMPILER) || defined(__PGI) || defined(__SUNPRO_C) || defined(__SUNPRO_CC) LIBC=gnu #else LIBC=gnuaout #endif #endif #ifdef __dietlibc__ LIBC=dietlibc #endif EOF eval "`$CC_FOR_BUILD -E $dummy.c 2>/dev/null | sed -n ' /^LIBC/{ s: ::g p }'`" test x"${LIBC}" != x && { echo "${UNAME_MACHINE}-pc-linux-${LIBC}" exit } test x"${TENTATIVE}" != x && { echo "${TENTATIVE}"; exit; } ;; i*86:DYNIX/ptx:4*:*) # ptx 4.0 does uname -s correctly, with DYNIX/ptx in there. # earlier versions are messed up and put the nodename in both # sysname and nodename. echo i386-sequent-sysv4 exit ;; i*86:UNIX_SV:4.2MP:2.*) # Unixware is an offshoot of SVR4, but it has its own version # number series starting with 2... # I am not positive that other SVR4 systems won't match this, # I just have to hope. -- rms. # Use sysv4.2uw... so that sysv4* matches it. echo ${UNAME_MACHINE}-pc-sysv4.2uw${UNAME_VERSION} exit ;; i*86:OS/2:*:*) # If we were able to find `uname', then EMX Unix compatibility # is probably installed. echo ${UNAME_MACHINE}-pc-os2-emx exit ;; i*86:XTS-300:*:STOP) echo ${UNAME_MACHINE}-unknown-stop exit ;; i*86:atheos:*:*) echo ${UNAME_MACHINE}-unknown-atheos exit ;; i*86:syllable:*:*) echo ${UNAME_MACHINE}-pc-syllable exit ;; i*86:LynxOS:2.*:* | i*86:LynxOS:3.[01]*:* | i*86:LynxOS:4.0*:*) echo i386-unknown-lynxos${UNAME_RELEASE} exit ;; i*86:*DOS:*:*) echo ${UNAME_MACHINE}-pc-msdosdjgpp exit ;; i*86:*:4.*:* | i*86:SYSTEM_V:4.*:*) UNAME_REL=`echo ${UNAME_RELEASE} | sed 's/\/MP$//'` if grep Novell /usr/include/link.h >/dev/null 2>/dev/null; then echo ${UNAME_MACHINE}-univel-sysv${UNAME_REL} else echo ${UNAME_MACHINE}-pc-sysv${UNAME_REL} fi exit ;; i*86:*:5:[678]*) # UnixWare 7.x, OpenUNIX and OpenServer 6. case `/bin/uname -X | grep "^Machine"` in *486*) UNAME_MACHINE=i486 ;; *Pentium) UNAME_MACHINE=i586 ;; *Pent*|*Celeron) UNAME_MACHINE=i686 ;; esac echo ${UNAME_MACHINE}-unknown-sysv${UNAME_RELEASE}${UNAME_SYSTEM}${UNAME_VERSION} exit ;; i*86:*:3.2:*) if test -f /usr/options/cb.name; then UNAME_REL=`sed -n 's/.*Version //p' /dev/null >/dev/null ; then UNAME_REL=`(/bin/uname -X|grep Release|sed -e 's/.*= //')` (/bin/uname -X|grep i80486 >/dev/null) && UNAME_MACHINE=i486 (/bin/uname -X|grep '^Machine.*Pentium' >/dev/null) \ && UNAME_MACHINE=i586 (/bin/uname -X|grep '^Machine.*Pent *II' >/dev/null) \ && UNAME_MACHINE=i686 (/bin/uname -X|grep '^Machine.*Pentium Pro' >/dev/null) \ && UNAME_MACHINE=i686 echo ${UNAME_MACHINE}-pc-sco$UNAME_REL else echo ${UNAME_MACHINE}-pc-sysv32 fi exit ;; pc:*:*:*) # Left here for compatibility: # uname -m prints for DJGPP always 'pc', but it prints nothing about # the processor, so we play safe by assuming i386. echo i386-pc-msdosdjgpp exit ;; Intel:Mach:3*:*) echo i386-pc-mach3 exit ;; paragon:*:*:*) echo i860-intel-osf1 exit ;; i860:*:4.*:*) # i860-SVR4 if grep Stardent /usr/include/sys/uadmin.h >/dev/null 2>&1 ; then echo i860-stardent-sysv${UNAME_RELEASE} # Stardent Vistra i860-SVR4 else # Add other i860-SVR4 vendors below as they are discovered. echo i860-unknown-sysv${UNAME_RELEASE} # Unknown i860-SVR4 fi exit ;; mini*:CTIX:SYS*5:*) # "miniframe" echo m68010-convergent-sysv exit ;; mc68k:UNIX:SYSTEM5:3.51m) echo m68k-convergent-sysv exit ;; M680?0:D-NIX:5.3:*) echo m68k-diab-dnix exit ;; M68*:*:R3V[5678]*:*) test -r /sysV68 && { echo 'm68k-motorola-sysv'; exit; } ;; 3[345]??:*:4.0:3.0 | 3[34]??A:*:4.0:3.0 | 3[34]??,*:*:4.0:3.0 | 3[34]??/*:*:4.0:3.0 | 4400:*:4.0:3.0 | 4850:*:4.0:3.0 | SKA40:*:4.0:3.0 | SDS2:*:4.0:3.0 | SHG2:*:4.0:3.0 | S7501*:*:4.0:3.0) OS_REL='' test -r /etc/.relid \ && OS_REL=.`sed -n 's/[^ ]* [^ ]* \([0-9][0-9]\).*/\1/p' < /etc/.relid` /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ && { echo i486-ncr-sysv4.3${OS_REL}; exit; } /bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \ && { echo i586-ncr-sysv4.3${OS_REL}; exit; } ;; 3[34]??:*:4.0:* | 3[34]??,*:*:4.0:*) /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ && { echo i486-ncr-sysv4; exit; } ;; m68*:LynxOS:2.*:* | m68*:LynxOS:3.0*:*) echo m68k-unknown-lynxos${UNAME_RELEASE} exit ;; mc68030:UNIX_System_V:4.*:*) echo m68k-atari-sysv4 exit ;; TSUNAMI:LynxOS:2.*:*) echo sparc-unknown-lynxos${UNAME_RELEASE} exit ;; rs6000:LynxOS:2.*:*) echo rs6000-unknown-lynxos${UNAME_RELEASE} exit ;; PowerPC:LynxOS:2.*:* | PowerPC:LynxOS:3.[01]*:* | PowerPC:LynxOS:4.0*:*) echo powerpc-unknown-lynxos${UNAME_RELEASE} exit ;; SM[BE]S:UNIX_SV:*:*) echo mips-dde-sysv${UNAME_RELEASE} exit ;; RM*:ReliantUNIX-*:*:*) echo mips-sni-sysv4 exit ;; RM*:SINIX-*:*:*) echo mips-sni-sysv4 exit ;; *:SINIX-*:*:*) if uname -p 2>/dev/null >/dev/null ; then UNAME_MACHINE=`(uname -p) 2>/dev/null` echo ${UNAME_MACHINE}-sni-sysv4 else echo ns32k-sni-sysv fi exit ;; PENTIUM:*:4.0*:*) # Unisys `ClearPath HMP IX 4000' SVR4/MP effort # says echo i586-unisys-sysv4 exit ;; *:UNIX_System_V:4*:FTX*) # From Gerald Hewes . # How about differentiating between stratus architectures? -djm echo hppa1.1-stratus-sysv4 exit ;; *:*:*:FTX*) # From seanf@swdc.stratus.com. echo i860-stratus-sysv4 exit ;; i*86:VOS:*:*) # From Paul.Green@stratus.com. echo ${UNAME_MACHINE}-stratus-vos exit ;; *:VOS:*:*) # From Paul.Green@stratus.com. echo hppa1.1-stratus-vos exit ;; mc68*:A/UX:*:*) echo m68k-apple-aux${UNAME_RELEASE} exit ;; news*:NEWS-OS:6*:*) echo mips-sony-newsos6 exit ;; R[34]000:*System_V*:*:* | R4000:UNIX_SYSV:*:* | R*000:UNIX_SV:*:*) if [ -d /usr/nec ]; then echo mips-nec-sysv${UNAME_RELEASE} else echo mips-unknown-sysv${UNAME_RELEASE} fi exit ;; BeBox:BeOS:*:*) # BeOS running on hardware made by Be, PPC only. echo powerpc-be-beos exit ;; BeMac:BeOS:*:*) # BeOS running on Mac or Mac clone, PPC only. echo powerpc-apple-beos exit ;; BePC:BeOS:*:*) # BeOS running on Intel PC compatible. echo i586-pc-beos exit ;; SX-4:SUPER-UX:*:*) echo sx4-nec-superux${UNAME_RELEASE} exit ;; SX-5:SUPER-UX:*:*) echo sx5-nec-superux${UNAME_RELEASE} exit ;; SX-6:SUPER-UX:*:*) echo sx6-nec-superux${UNAME_RELEASE} exit ;; SX-7:SUPER-UX:*:*) echo sx7-nec-superux${UNAME_RELEASE} exit ;; SX-8:SUPER-UX:*:*) echo sx8-nec-superux${UNAME_RELEASE} exit ;; SX-8R:SUPER-UX:*:*) echo sx8r-nec-superux${UNAME_RELEASE} exit ;; Power*:Rhapsody:*:*) echo powerpc-apple-rhapsody${UNAME_RELEASE} exit ;; *:Rhapsody:*:*) echo ${UNAME_MACHINE}-apple-rhapsody${UNAME_RELEASE} exit ;; *:Darwin:*:*) UNAME_PROCESSOR=`uname -p` || UNAME_PROCESSOR=unknown case $UNAME_PROCESSOR in unknown) UNAME_PROCESSOR=powerpc ;; esac echo ${UNAME_PROCESSOR}-apple-darwin${UNAME_RELEASE} exit ;; *:procnto*:*:* | *:QNX:[0123456789]*:*) UNAME_PROCESSOR=`uname -p` if test "$UNAME_PROCESSOR" = "x86"; then UNAME_PROCESSOR=i386 UNAME_MACHINE=pc fi echo ${UNAME_PROCESSOR}-${UNAME_MACHINE}-nto-qnx${UNAME_RELEASE} exit ;; *:QNX:*:4*) echo i386-pc-qnx exit ;; NSE-?:NONSTOP_KERNEL:*:*) echo nse-tandem-nsk${UNAME_RELEASE} exit ;; NSR-?:NONSTOP_KERNEL:*:*) echo nsr-tandem-nsk${UNAME_RELEASE} exit ;; *:NonStop-UX:*:*) echo mips-compaq-nonstopux exit ;; BS2000:POSIX*:*:*) echo bs2000-siemens-sysv exit ;; DS/*:UNIX_System_V:*:*) echo ${UNAME_MACHINE}-${UNAME_SYSTEM}-${UNAME_RELEASE} exit ;; *:Plan9:*:*) # "uname -m" is not consistent, so use $cputype instead. 386 # is converted to i386 for consistency with other x86 # operating systems. if test "$cputype" = "386"; then UNAME_MACHINE=i386 else UNAME_MACHINE="$cputype" fi echo ${UNAME_MACHINE}-unknown-plan9 exit ;; *:TOPS-10:*:*) echo pdp10-unknown-tops10 exit ;; *:TENEX:*:*) echo pdp10-unknown-tenex exit ;; KS10:TOPS-20:*:* | KL10:TOPS-20:*:* | TYPE4:TOPS-20:*:*) echo pdp10-dec-tops20 exit ;; XKL-1:TOPS-20:*:* | TYPE5:TOPS-20:*:*) echo pdp10-xkl-tops20 exit ;; *:TOPS-20:*:*) echo pdp10-unknown-tops20 exit ;; *:ITS:*:*) echo pdp10-unknown-its exit ;; SEI:*:*:SEIUX) echo mips-sei-seiux${UNAME_RELEASE} exit ;; *:DragonFly:*:*) echo ${UNAME_MACHINE}-unknown-dragonfly`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` exit ;; *:*VMS:*:*) UNAME_MACHINE=`(uname -p) 2>/dev/null` case "${UNAME_MACHINE}" in A*) echo alpha-dec-vms ; exit ;; I*) echo ia64-dec-vms ; exit ;; V*) echo vax-dec-vms ; exit ;; esac ;; *:XENIX:*:SysV) echo i386-pc-xenix exit ;; i*86:skyos:*:*) echo ${UNAME_MACHINE}-pc-skyos`echo ${UNAME_RELEASE}` | sed -e 's/ .*$//' exit ;; i*86:rdos:*:*) echo ${UNAME_MACHINE}-pc-rdos exit ;; esac #echo '(No uname command or uname output not recognized.)' 1>&2 #echo "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" 1>&2 eval $set_cc_for_build cat >$dummy.c < # include #endif main () { #if defined (sony) #if defined (MIPSEB) /* BFD wants "bsd" instead of "newsos". Perhaps BFD should be changed, I don't know.... */ printf ("mips-sony-bsd\n"); exit (0); #else #include printf ("m68k-sony-newsos%s\n", #ifdef NEWSOS4 "4" #else "" #endif ); exit (0); #endif #endif #if defined (__arm) && defined (__acorn) && defined (__unix) printf ("arm-acorn-riscix\n"); exit (0); #endif #if defined (hp300) && !defined (hpux) printf ("m68k-hp-bsd\n"); exit (0); #endif #if defined (NeXT) #if !defined (__ARCHITECTURE__) #define __ARCHITECTURE__ "m68k" #endif int version; version=`(hostinfo | sed -n 's/.*NeXT Mach \([0-9]*\).*/\1/p') 2>/dev/null`; if (version < 4) printf ("%s-next-nextstep%d\n", __ARCHITECTURE__, version); else printf ("%s-next-openstep%d\n", __ARCHITECTURE__, version); exit (0); #endif #if defined (MULTIMAX) || defined (n16) #if defined (UMAXV) printf ("ns32k-encore-sysv\n"); exit (0); #else #if defined (CMU) printf ("ns32k-encore-mach\n"); exit (0); #else printf ("ns32k-encore-bsd\n"); exit (0); #endif #endif #endif #if defined (__386BSD__) printf ("i386-pc-bsd\n"); exit (0); #endif #if defined (sequent) #if defined (i386) printf ("i386-sequent-dynix\n"); exit (0); #endif #if defined (ns32000) printf ("ns32k-sequent-dynix\n"); exit (0); #endif #endif #if defined (_SEQUENT_) struct utsname un; uname(&un); if (strncmp(un.version, "V2", 2) == 0) { printf ("i386-sequent-ptx2\n"); exit (0); } if (strncmp(un.version, "V1", 2) == 0) { /* XXX is V1 correct? */ printf ("i386-sequent-ptx1\n"); exit (0); } printf ("i386-sequent-ptx\n"); exit (0); #endif #if defined (vax) # if !defined (ultrix) # include # if defined (BSD) # if BSD == 43 printf ("vax-dec-bsd4.3\n"); exit (0); # else # if BSD == 199006 printf ("vax-dec-bsd4.3reno\n"); exit (0); # else printf ("vax-dec-bsd\n"); exit (0); # endif # endif # else printf ("vax-dec-bsd\n"); exit (0); # endif # else printf ("vax-dec-ultrix\n"); exit (0); # endif #endif #if defined (alliant) && defined (i860) printf ("i860-alliant-bsd\n"); exit (0); #endif exit (1); } EOF $CC_FOR_BUILD -o $dummy $dummy.c 2>/dev/null && SYSTEM_NAME=`$dummy` && { echo "$SYSTEM_NAME"; exit; } # Apollos put the system type in the environment. test -d /usr/apollo && { echo ${ISP}-apollo-${SYSTYPE}; exit; } # Convex versions that predate uname can use getsysinfo(1) if [ -x /usr/convex/getsysinfo ] then case `getsysinfo -f cpu_type` in c1*) echo c1-convex-bsd exit ;; c2*) if getsysinfo -f scalar_acc then echo c32-convex-bsd else echo c2-convex-bsd fi exit ;; c34*) echo c34-convex-bsd exit ;; c38*) echo c38-convex-bsd exit ;; c4*) echo c4-convex-bsd exit ;; esac fi cat >&2 < in order to provide the needed information to handle your system. config.guess timestamp = $timestamp uname -m = `(uname -m) 2>/dev/null || echo unknown` uname -r = `(uname -r) 2>/dev/null || echo unknown` uname -s = `(uname -s) 2>/dev/null || echo unknown` uname -v = `(uname -v) 2>/dev/null || echo unknown` /usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null` /bin/uname -X = `(/bin/uname -X) 2>/dev/null` hostinfo = `(hostinfo) 2>/dev/null` /bin/universe = `(/bin/universe) 2>/dev/null` /usr/bin/arch -k = `(/usr/bin/arch -k) 2>/dev/null` /bin/arch = `(/bin/arch) 2>/dev/null` /usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null` /usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null` UNAME_MACHINE = ${UNAME_MACHINE} UNAME_RELEASE = ${UNAME_RELEASE} UNAME_SYSTEM = ${UNAME_SYSTEM} UNAME_VERSION = ${UNAME_VERSION} EOF exit 1 # Local variables: # eval: (add-hook 'write-file-hooks 'time-stamp) # time-stamp-start: "timestamp='" # time-stamp-format: "%:y-%02m-%02d" # time-stamp-end: "'" # End: